<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
<!DOCTYPE bugzilla SYSTEM "https://bugs.webkit.org/page.cgi?id=bugzilla.dtd">

<bugzilla version="5.0.4.1"
          urlbase="https://bugs.webkit.org/"
          
          maintainer="admin@webkit.org"
>

    <bug>
          <bug_id>150280</bug_id>
          
          <creation_ts>2015-10-17 11:22:42 -0700</creation_ts>
          <short_desc>Create a super rough prototype of B3</short_desc>
          <delta_ts>2015-10-28 17:19:44 -0700</delta_ts>
          <reporter_accessible>1</reporter_accessible>
          <cclist_accessible>1</cclist_accessible>
          <classification_id>1</classification_id>
          <classification>Unclassified</classification>
          <product>WebKit</product>
          <component>JavaScriptCore</component>
          <version>WebKit Nightly Build</version>
          <rep_platform>All</rep_platform>
          <op_sys>All</op_sys>
          <bug_status>RESOLVED</bug_status>
          <resolution>FIXED</resolution>
          
          
          <bug_file_loc></bug_file_loc>
          <status_whiteboard></status_whiteboard>
          <keywords></keywords>
          <priority>P2</priority>
          <bug_severity>Normal</bug_severity>
          <target_milestone>---</target_milestone>
          <dependson>150411</dependson>
          <blocked>150279</blocked>
          <everconfirmed>1</everconfirmed>
          <reporter name="Filip Pizlo">fpizlo</reporter>
          <assigned_to name="Filip Pizlo">fpizlo</assigned_to>
          <cc>barraclough</cc>
    
    <cc>benjamin</cc>
    
    <cc>cmarcelo</cc>
    
    <cc>commit-queue</cc>
    
    <cc>ggaren</cc>
    
    <cc>keith_miller</cc>
    
    <cc>lforschler</cc>
    
    <cc>mark.lam</cc>
    
    <cc>msaboff</cc>
    
    <cc>oliver</cc>
    
    <cc>ossy</cc>
    
    <cc>saam</cc>
    
    <cc>sam</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>1134204</commentid>
    <comment_count>0</comment_count>
    <who name="Filip Pizlo">fpizlo</who>
    <bug_when>2015-10-17 11:22:42 -0700</bug_when>
    <thetext>Yay.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1134205</commentid>
    <comment_count>1</comment_count>
      <attachid>263377</attachid>
    <who name="Filip Pizlo">fpizlo</who>
    <bug_when>2015-10-17 11:23:07 -0700</bug_when>
    <thetext>Created attachment 263377
it&apos;s a start</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1134206</commentid>
    <comment_count>2</comment_count>
    <who name="Filip Pizlo">fpizlo</who>
    <bug_when>2015-10-17 11:23:37 -0700</bug_when>
    <thetext>This can land once it has enough things to do an end-to-end compile of the empty procedure.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1134279</commentid>
    <comment_count>3</comment_count>
    <who name="Filip Pizlo">fpizlo</who>
    <bug_when>2015-10-17 17:55:51 -0700</bug_when>
    <thetext>I just got an idea about how to handle constants, and wanted to write it down.

Here are our options for how to handle constants, assuming that B3IR places constant values inside control flow and then LICMs and GVNs them.

1) Let the register allocator treat Tmps that happened to come into existence because of constants as just normal Tmps.  They may get spilled.  After register allocation, run constant propagation through stores and loads to stack slots.  This will effectively cause rematerialization.

2) Have LowerB3ToAir choose registers for the tag constants, and sink all other constants to their blocks.

3) Have a late B3IR phase that sinks constants.  I&apos;d prefer an approach that special-cases a hard limit on hoistable constants and then marks those Values that contain hoisted constants as &quot;must allocate&quot; for the register allocator.  All other constants are sunk to the blocks that use them.

4) Have floating constants in Air and require the register allocator in figure it out.  This would make sense if the register allocator did live range splitting.  I&apos;m not sure I like this approach.

5) Here&apos;s a possible approach that I just thought of, and I don&apos;t know yet if it makes sense.  Do maximal constant sinking.  Then, have an Air constant propagator that eliminates instructions that materialize a constant if that constant is already available in some register.

6) Similar to above, but a different way of thinking about it. Let constants float in Air.  Register allocator treats this like a use of a register at the point of use of the constant.  Like if we have:

store $hugeConst, (%temp)

Then the register allocator sees it as if it was:

mov $hugeConst, %constTemp
store %constTemp, (%temp)

It assigns registers to the %constTemp&apos;s - i.e. to the &quot;edges&quot; between operations and the constants they use. Then, after doing register allocation, we can construct the constant materializations via forward flow. At each use of a %constTemp, we create the most efficient instruction possible by looking at what kinds of registers we have in constants. Any constant materialization - either one that we created or one that happened to be in the code already - causes us to know that henceforth, that register has that constant. We can abstractly interpret the Air code and clobber registers appropriately. So, we can optimize the %constTemp use to an add instruction if there is a nearby constant. Or, because the %constTemp&apos;s register use is only valid at the instant in time at the start of execution of the instruction that uses it, we can ignore the register allocator&apos;s choice of register and replace it with the use of a register that already has that constant.  For example, we may have:

1: store $hugeConst, (%temp)
2: store $hugeConst, (%temp2)

This implicitly has %constTemp1 and %constTemp2.  The register allocator may assign some registers to these.  Lets say that it does %constTemp1=%rax and %constTemp2=%rsi.  Then, the forward algorithm does this:

For instruction #1: It observes that no register currently contains any constant, so it prepends a “mov $hugeConst, %rax” instruction.  That’s because the register allocator told us that %rax is an appropriate place to put the constant. Then, it’ll transform instruction #1 to use %rax instead of $hugeConst. It will record that %rax contains $hugeConst.

For instruction #2: It observes that %rax already contains $hugeConst. Since the %constTemp2=%rsi register assignment was just a suggestion in case no register contained the constant yet, we just transform instruction #2 to use %rax instead of $hugeConst.

Note that since register allocators are usually deterministic, both %constTemp1 and %constTemp2 would probably get the same register.

The only missing piece here is hoisting constants out of loops. We could have LICM for these constant materializations. If a loop does not contain any other assignment to the register used for a constant materialization and does not clobber the register, then we can move the constant materialization out of the loop.

I think that probably the best solution will be a hybrid of (2) and (6). At least one of the tag values is super critical and we should just pin a callee-save register to it. We could even have a configuration parameter called &quot;number of critical constants&quot;. It will pick that number of hottest constants in the program and materialize them in the prologue.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1134284</commentid>
    <comment_count>4</comment_count>
      <attachid>263397</attachid>
    <who name="Filip Pizlo">fpizlo</who>
    <bug_when>2015-10-17 18:20:59 -0700</bug_when>
    <thetext>Created attachment 263397
more</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1134296</commentid>
    <comment_count>5</comment_count>
      <attachid>263403</attachid>
    <who name="Filip Pizlo">fpizlo</who>
    <bug_when>2015-10-17 19:54:00 -0700</bug_when>
    <thetext>Created attachment 263403
it&apos;s growing</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1134297</commentid>
    <comment_count>6</comment_count>
      <attachid>263404</attachid>
    <who name="Filip Pizlo">fpizlo</who>
    <bug_when>2015-10-17 20:31:43 -0700</bug_when>
    <thetext>Created attachment 263404
just a bit more</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1134311</commentid>
    <comment_count>7</comment_count>
      <attachid>263410</attachid>
    <who name="Filip Pizlo">fpizlo</who>
    <bug_when>2015-10-17 23:06:45 -0700</bug_when>
    <thetext>Created attachment 263410
no big deal, fleshing out the IR</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1134351</commentid>
    <comment_count>8</comment_count>
      <attachid>263425</attachid>
    <who name="Filip Pizlo">fpizlo</who>
    <bug_when>2015-10-18 12:28:46 -0700</bug_when>
    <thetext>Created attachment 263425
it has stackmaps and patchpoints, sort of</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1134353</commentid>
    <comment_count>9</comment_count>
    <who name="Mark Lam">mark.lam</who>
    <bug_when>2015-10-18 12:37:02 -0700</bug_when>
    <thetext>Pardon my ignorance, but what does B3 stand for?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1134355</commentid>
    <comment_count>10</comment_count>
      <attachid>263427</attachid>
    <who name="Filip Pizlo">fpizlo</who>
    <bug_when>2015-10-18 13:40:23 -0700</bug_when>
    <thetext>Created attachment 263427
B3 instructions are fleshed out</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1134396</commentid>
    <comment_count>11</comment_count>
      <attachid>263432</attachid>
    <who name="Filip Pizlo">fpizlo</who>
    <bug_when>2015-10-18 16:36:36 -0700</bug_when>
    <thetext>Created attachment 263432
started playing with instruction selection</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1134418</commentid>
    <comment_count>12</comment_count>
    <who name="Filip Pizlo">fpizlo</who>
    <bug_when>2015-10-18 16:54:28 -0700</bug_when>
    <thetext>Been thinking about pattern matching some more.  We want some way of ensuring that if we hoist a BaseIndex expression out of a loop, then inside the loop we don&apos;t match it - we use the generated variable.

We could make this work by having the pattern matcher refuse to match a pattern around something that already has a low-level variable.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1134430</commentid>
    <comment_count>13</comment_count>
      <attachid>263434</attachid>
    <who name="Filip Pizlo">fpizlo</who>
    <bug_when>2015-10-18 18:25:21 -0700</bug_when>
    <thetext>Created attachment 263434
writing a pattern matcher</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1134438</commentid>
    <comment_count>14</comment_count>
    <who name="Filip Pizlo">fpizlo</who>
    <bug_when>2015-10-18 20:13:57 -0700</bug_when>
    <thetext>Woohoo!  I have a recursive pattern match generator.  It takes this:

matcher ComparisonMatcher

TestLoadNotZero1 = And(Load(address), right)
TestLoadNotZero2 = And(left, Load(address))
TestNotZero = And(left, right)

TestLoadZero1 = Equal(And(Load(address), right), $0)
TestLoadZero2 = Equal(And(left, Load(address)), $0)
TestZero = Equal(And(left, right), $0)

LoadEqual1 = Equal(Load(address), right)
LoadEqual2 = Equal(left, Load(address))
Not = Equal(value, $0)
Equal = Equal(left, right)

And turns it into this:

// Generated by generate_pattern_matcher.rb from Source/JavaScriptCore/b3/B3ComparisonMatcher.patterns -- do not edit!
#ifndef B3ComparisonMatcher_h
#define B3ComparisonMatcher_h
#include &quot;B3Value.h&quot;
namespace JSC { namespace B3 {
template&lt;typename Adaptor&gt;
void runComparisonMatcher(Value* value, Adaptor&amp; adaptor)
{
    switch (value-&gt;opcode()) {
    case And:
        if (value-&gt;children.size() &gt;= 2) {
            {
                Value* _tmp14 = value-&gt;child(0);
                switch (_tmp14-&gt;opcode()) {
                case Load:
                    if (_tmp14-&gt;children.size() &gt;= 1) {
                        {
                            Value* _tmp15 = _tmp14-&gt;child(0);
                            {
                                Value* _tmp16 = value-&gt;child(1);
                                {
                                    Value* TestLoadNotZero1 = value;
                                    Value* _tmp1 = TestLoadNotZero1-&gt;child(0);
                                    Value* address = _tmp1-&gt;child(0);
                                    Value* right = TestLoadNotZero1-&gt;child(1);
                                    if (adaptor.acceptRoot(value)
                                        &amp;&amp; adaptor.acceptInternals(_tmp1)
                                        &amp;&amp; adaptor.acceptOperands(address, right)
                                        &amp;&amp; adaptor.tryTestLoadNotZero1(address, right))
                                        return;
                                }
                            }
                        }
                    }
                    break;
                default:
                    break;
                }
                {
                    Value* _tmp17 = value-&gt;child(1);
                    switch (_tmp17-&gt;opcode()) {
                    case Load:
                        if (_tmp17-&gt;children.size() &gt;= 1) {
                            {
                                Value* _tmp18 = _tmp17-&gt;child(0);
                                {
                                    Value* TestLoadNotZero2 = value;
                                    Value* left = TestLoadNotZero2-&gt;child(0);
                                    Value* _tmp2 = TestLoadNotZero2-&gt;child(1);
                                    Value* address = _tmp2-&gt;child(0);
                                    if (adaptor.acceptRoot(value)
                                        &amp;&amp; adaptor.acceptInternals(_tmp2)
                                        &amp;&amp; adaptor.acceptOperands(left, address)
                                        &amp;&amp; adaptor.tryTestLoadNotZero2(left, address))
                                        return;
                                }
                            }
                        }
                        break;
                    default:
                        break;
                    }
                    {
                        Value* TestNotZero = value;
                        Value* left = TestNotZero-&gt;child(0);
                        Value* right = TestNotZero-&gt;child(1);
                        if (adaptor.acceptRoot(value)
                            &amp;&amp; adaptor.acceptInternals()
                            &amp;&amp; adaptor.acceptOperands(left, right)
                            &amp;&amp; adaptor.tryTestNotZero(left, right))
                            return;
                    }
                }
            }
        }
        break;
    case Equal:
        if (value-&gt;children.size() &gt;= 2) {
            {
                Value* _tmp19 = value-&gt;child(0);
                switch (_tmp19-&gt;opcode()) {
                case And:
                    if (_tmp19-&gt;children.size() &gt;= 2) {
                        {
                            Value* _tmp20 = _tmp19-&gt;child(0);
                            switch (_tmp20-&gt;opcode()) {
                            case Load:
                                if (_tmp20-&gt;children.size() &gt;= 1) {
                                    {
                                        Value* _tmp21 = _tmp20-&gt;child(0);
                                        {
                                            Value* _tmp22 = _tmp19-&gt;child(1);
                                            {
                                                Value* _tmp23 = value-&gt;child(1);
                                                {
                                                    Value* TestLoadZero1 = value;
                                                    Value* _tmp4 = TestLoadZero1-&gt;child(0);
                                                    Value* _tmp3 = _tmp4-&gt;child(0);
                                                    Value* address = _tmp3-&gt;child(0);
                                                    Value* right = _tmp4-&gt;child(1);
                                                    Value* _tmp5 = TestLoadZero1-&gt;child(1);
                                                    if (_tmp5-&gt;isInt(0)) {
                                                        if (adaptor.acceptRoot(value)
                                                            &amp;&amp; adaptor.acceptInternals(_tmp4, _tmp3)
                                                            &amp;&amp; adaptor.acceptOperands(address, right, _tmp5)
                                                            &amp;&amp; adaptor.tryTestLoadZero1(address, right))
                                                            return;
                                                    }
                                                }
                                            }
                                        }
                                    }
                                }
                                break;
                            default:
                                break;
                            }
                            {
                                Value* _tmp24 = _tmp19-&gt;child(1);
                                switch (_tmp24-&gt;opcode()) {
                                case Load:
                                    if (_tmp24-&gt;children.size() &gt;= 1) {
                                        {
                                            Value* _tmp25 = _tmp24-&gt;child(0);
                                            {
                                                Value* _tmp26 = value-&gt;child(1);
                                                {
                                                    Value* TestLoadZero2 = value;
                                                    Value* _tmp7 = TestLoadZero2-&gt;child(0);
                                                    Value* left = _tmp7-&gt;child(0);
                                                    Value* _tmp6 = _tmp7-&gt;child(1);
                                                    Value* address = _tmp6-&gt;child(0);
                                                    Value* _tmp8 = TestLoadZero2-&gt;child(1);
                                                    if (_tmp8-&gt;isInt(0)) {
                                                        if (adaptor.acceptRoot(value)
                                                            &amp;&amp; adaptor.acceptInternals(_tmp7, _tmp6)
                                                            &amp;&amp; adaptor.acceptOperands(left, address, _tmp8)
                                                            &amp;&amp; adaptor.tryTestLoadZero2(left, address))
                                                            return;
                                                    }
                                                }
                                            }
                                        }
                                    }
                                    break;
                                default:
                                    break;
                                }
                                {
                                    Value* _tmp27 = value-&gt;child(1);
                                    {
                                        Value* TestZero = value;
                                        Value* _tmp9 = TestZero-&gt;child(0);
                                        Value* left = _tmp9-&gt;child(0);
                                        Value* right = _tmp9-&gt;child(1);
                                        Value* _tmp10 = TestZero-&gt;child(1);
                                        if (_tmp10-&gt;isInt(0)) {
                                            if (adaptor.acceptRoot(value)
                                                &amp;&amp; adaptor.acceptInternals(_tmp9)
                                                &amp;&amp; adaptor.acceptOperands(left, right, _tmp10)
                                                &amp;&amp; adaptor.tryTestZero(left, right))
                                                return;
                                        }
                                    }
                                }
                            }
                        }
                    }
                    break;
                case Load:
                    if (_tmp19-&gt;children.size() &gt;= 1) {
                        {
                            Value* _tmp28 = _tmp19-&gt;child(0);
                            {
                                Value* _tmp29 = value-&gt;child(1);
                                {
                                    Value* LoadEqual1 = value;
                                    Value* _tmp11 = LoadEqual1-&gt;child(0);
                                    Value* address = _tmp11-&gt;child(0);
                                    Value* right = LoadEqual1-&gt;child(1);
                                    if (adaptor.acceptRoot(value)
                                        &amp;&amp; adaptor.acceptInternals(_tmp11)
                                        &amp;&amp; adaptor.acceptOperands(address, right)
                                        &amp;&amp; adaptor.tryLoadEqual1(address, right))
                                        return;
                                }
                            }
                        }
                    }
                    break;
                default:
                    break;
                }
                {
                    Value* _tmp30 = value-&gt;child(1);
                    switch (_tmp30-&gt;opcode()) {
                    case Load:
                        if (_tmp30-&gt;children.size() &gt;= 1) {
                            {
                                Value* _tmp31 = _tmp30-&gt;child(0);
                                {
                                    Value* LoadEqual2 = value;
                                    Value* left = LoadEqual2-&gt;child(0);
                                    Value* _tmp12 = LoadEqual2-&gt;child(1);
                                    Value* address = _tmp12-&gt;child(0);
                                    if (adaptor.acceptRoot(value)
                                        &amp;&amp; adaptor.acceptInternals(_tmp12)
                                        &amp;&amp; adaptor.acceptOperands(left, address)
                                        &amp;&amp; adaptor.tryLoadEqual2(left, address))
                                        return;
                                }
                            }
                        }
                        break;
                    default:
                        break;
                    }
                    {
                        Value* Not = value;
                        Value* value = Not-&gt;child(0);
                        Value* _tmp13 = Not-&gt;child(1);
                        if (_tmp13-&gt;isInt(0)) {
                            if (adaptor.acceptRoot(value)
                                &amp;&amp; adaptor.acceptInternals()
                                &amp;&amp; adaptor.acceptOperands(value, _tmp13)
                                &amp;&amp; adaptor.tryNot(value))
                                return;
                        }
                    }
                    {
                        Value* Equal = value;
                        Value* left = Equal-&gt;child(0);
                        Value* right = Equal-&gt;child(1);
                        if (adaptor.acceptRoot(value)
                            &amp;&amp; adaptor.acceptInternals()
                            &amp;&amp; adaptor.acceptOperands(left, right)
                            &amp;&amp; adaptor.tryEqual(left, right))
                            return;
                    }
                }
            }
        }
        break;
    default:
        break;
    }
    RELEASE_ASSERT_NOT_REACHED();
}
} } // namespace JSC::B3
#endif // B3ComparisonMatcher_h</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1134439</commentid>
    <comment_count>15</comment_count>
      <attachid>263436</attachid>
    <who name="Filip Pizlo">fpizlo</who>
    <bug_when>2015-10-18 20:16:48 -0700</bug_when>
    <thetext>Created attachment 263436
and now, with a complete pattern match generator

Now we can go nuts with patterns.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1134749</commentid>
    <comment_count>16</comment_count>
      <attachid>263528</attachid>
    <who name="Filip Pizlo">fpizlo</who>
    <bug_when>2015-10-19 17:01:06 -0700</bug_when>
    <thetext>Created attachment 263528
started working on Air

This is pretty awesome - lots of Air functionality is just auto-generated from the AirOpcodes.opcodes spec.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1134752</commentid>
    <comment_count>17</comment_count>
      <attachid>263529</attachid>
    <who name="Filip Pizlo">fpizlo</who>
    <bug_when>2015-10-19 17:02:34 -0700</bug_when>
    <thetext>Created attachment 263529
removed some stuff

Removed my previous attempt at reflective code generation.  Before I started working on Air, I had added this DynamicAddress thing to the assembler.  I won&apos;t be using it, so this version of the patch removes it.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1134793</commentid>
    <comment_count>18</comment_count>
      <attachid>263546</attachid>
    <who name="Filip Pizlo">fpizlo</who>
    <bug_when>2015-10-19 20:00:58 -0700</bug_when>
    <thetext>Created attachment 263546
a little more

Added more things to Air.  I think that the IR scaffolding is complete.  Now we&apos;ll have to add all of the instructions.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1134804</commentid>
    <comment_count>19</comment_count>
      <attachid>263549</attachid>
    <who name="Filip Pizlo">fpizlo</who>
    <bug_when>2015-10-19 21:59:56 -0700</bug_when>
    <thetext>Created attachment 263549
a bit more</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1135008</commentid>
    <comment_count>20</comment_count>
      <attachid>263615</attachid>
    <who name="Filip Pizlo">fpizlo</who>
    <bug_when>2015-10-20 14:16:18 -0700</bug_when>
    <thetext>Created attachment 263615
cool story for specials</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1135029</commentid>
    <comment_count>21</comment_count>
      <attachid>263623</attachid>
    <who name="Filip Pizlo">fpizlo</who>
    <bug_when>2015-10-20 15:32:25 -0700</bug_when>
    <thetext>Created attachment 263623
just a few little things

Starting to glue Air&apos;s notion of Special to B3&apos;s notion of stackmap.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1135050</commentid>
    <comment_count>22</comment_count>
    <who name="Filip Pizlo">fpizlo</who>
    <bug_when>2015-10-20 16:39:33 -0700</bug_when>
    <thetext>I&apos;m currently thinking that patterns like &quot;Add(Load(address), value)&quot; should not be listed in the patterns file but instead should arise out of C++ code.  I&apos;ve been playing with pseudocode for how to say this.  Here&apos;s something I was just thinking about for a universal helper for emitting math ops.

Note that we need the opcode_generator to emit isValidForm() methods for this to be efficient.  I&apos;m thinking that we could even templatize them like isValidForm&lt;opcode&gt;(...), and then have the appendOp also be templatized like appendOp&lt;opcode, Commutative&gt;(left, right).  That would be sooooper fast.

void appendInst(const Inst&amp; inst)
{
    ASSERT(inst.isValidForm());
    m_block-&gt;appendInst(inst);
}

template&lt;typename... Arguments&gt;
void append(Opcode opcode, Arguments... arguments)
{
    appendInst(Inst(opcode, m_value, arguments...));
}

Arg addr(Value* value)
{
    // Makes sure that value can be made into an internal value for this pattern, and then can get
    // locked.
}

void appendOp(Air::Opcode opcode, Value* left, Value* right, Commutativity commutativity = NotCommutative)
{
    Tmp result = resultTmp();
    // Three-operand forms like:
    //     Op a, b, c
    // mean something like:
    //     c = a Op b
    if (isValidForm(opcode, Arg::Imm, Arg::Tmp, Arg::Tmp)) {
        if (commutativity == Commutative) {
            if (isImm(right)) {
                append(opcode, imm(right), tmp(left), result);
                return;
            }
        } else {
            // A non-commutative operation could have an immediate in left.
            if (isImm(left)) {
                append(opcode, imm(left), tmp(right), result);
                return;
            }
        }
    }
    if (isImm(right) &amp;&amp; isValidForm(opcode, Arg::Tmp, Arg::Imm, Arg::Tmp)) {
        append(opcode, tmp(left), imm(right), result);
        return;
    }
    if (commutativity == Commutative &amp;&amp; left-&gt;opcode() == Load) {
        Arg leftAddr = addr(left);
        if (isValidForm(opcode, leftAddr.kind(), Arg::Tmp)) {
            append(Move, tmp(right), result);
            append(opcode, leftAddr, result);
            return;
        }
    }
    append(Move, tmp(left), result);
    if (right-&gt;opcode() == Load) {
        Arg rightAddr = addr(right);
        if (isValidForm(opcode, rightAddr.kind(), Arg::Tmp)) {
            append(opcode, rightAddr, result);
            return;
        }
    }
    // Two-operand forms only work when right is an immediate, since we clobber left in place.
    if (isImm(right) &amp;&amp; isValidForm(opcode, Arg::Imm, Arg::Tmp)) {
        append(imm(right), result);
        return;
    }

    append(tmp(right), result);
}</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1135051</commentid>
    <comment_count>23</comment_count>
      <attachid>263633</attachid>
    <who name="Filip Pizlo">fpizlo</who>
    <bug_when>2015-10-20 16:40:31 -0700</bug_when>
    <thetext>Created attachment 263633
latest

I&apos;m thinking about stackmaps so hard right now.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1135134</commentid>
    <comment_count>24</comment_count>
      <attachid>263661</attachid>
    <who name="Filip Pizlo">fpizlo</who>
    <bug_when>2015-10-20 22:58:46 -0700</bug_when>
    <thetext>Created attachment 263661
some more</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1135395</commentid>
    <comment_count>25</comment_count>
      <attachid>263739</attachid>
    <who name="Filip Pizlo">fpizlo</who>
    <bug_when>2015-10-21 14:29:38 -0700</bug_when>
    <thetext>Created attachment 263739
even more

so much code</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1135422</commentid>
    <comment_count>26</comment_count>
      <attachid>263746</attachid>
    <who name="Filip Pizlo">fpizlo</who>
    <bug_when>2015-10-21 15:17:45 -0700</bug_when>
    <thetext>Created attachment 263746
and now, with a maximal spiller</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1135514</commentid>
    <comment_count>27</comment_count>
      <attachid>263778</attachid>
    <who name="Filip Pizlo">fpizlo</who>
    <bug_when>2015-10-21 18:26:05 -0700</bug_when>
    <thetext>Created attachment 263778
and now, with a stack allocator</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1135777</commentid>
    <comment_count>28</comment_count>
      <attachid>263845</attachid>
    <who name="Filip Pizlo">fpizlo</who>
    <bug_when>2015-10-22 12:41:02 -0700</bug_when>
    <thetext>Created attachment 263845
air is done, maybe?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1135863</commentid>
    <comment_count>29</comment_count>
      <attachid>263871</attachid>
    <who name="Filip Pizlo">fpizlo</who>
    <bug_when>2015-10-22 15:10:16 -0700</bug_when>
    <thetext>Created attachment 263871
adding code layout support</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1135897</commentid>
    <comment_count>30</comment_count>
      <attachid>263878</attachid>
    <who name="Filip Pizlo">fpizlo</who>
    <bug_when>2015-10-22 16:47:45 -0700</bug_when>
    <thetext>Created attachment 263878
started working on B3LowerToAir

I&apos;m getting so close!</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1135900</commentid>
    <comment_count>31</comment_count>
      <attachid>263845</attachid>
    <who name="Benjamin Poulain">benjamin</who>
    <bug_when>2015-10-22 16:56:23 -0700</bug_when>
    <thetext>Comment on attachment 263845
air is done, maybe?

View in context: https://bugs.webkit.org/attachment.cgi?id=263845&amp;action=review

Quick comments:

&gt; Source/JavaScriptCore/b3/B3BasicBlockUtils.h:36
&gt; +bool addPredecessor(BasicBlock* block, BasicBlock* predecessor)

The arguments should be references here, to follow WebKit&apos;s new love for reference

&gt; Source/JavaScriptCore/b3/B3BasicBlockUtils.h:48
&gt; +bool removePredecessor(BasicBlock* block, BasicBlock *predecessor)

The &quot;*&quot; is on the wrong side on &quot;BasicBlock *predecessor&quot;

&gt; Source/JavaScriptCore/b3/B3BasicBlockUtils.h:58
&gt; +            result = true;
&gt; +            // Out of caution, we keep going even though the predecessor list cannot have
&gt; +            // duplicates.

This could help hiding programming mistakes.

What about?
    ASSERT_WITH_MESSAGE(!predecessors.contains(predecessor), &quot;Any predecessor must only appear once per basic block adjacency list&quot;);
    return true;

&gt; Source/JavaScriptCore/b3/air/AirBasicBlock.h:98
&gt; +    BasicBlock(unsigned index)
&gt; +    {

Don&apos;t forget 
    : m_index(index)

&gt; Source/JavaScriptCore/b3/air/AirInst.h:85
&gt; +        for (Arg arg : args)

&quot;Arg&quot; does not hold in a single register. Arg-&gt;Arg&amp; here?

&gt; Source/JavaScriptCore/b3/air/AirInstInlines.h:66
&gt; +    return args[0].special()-&gt;extraClobberedRegs(*this);

Precondition:
    ASSERT_WITH_MESSAGE(hasSpecial(), &quot;This operation only make sense for Specials.&quot;);

&gt; Source/JavaScriptCore/b3/air/AirInstInlines.h:71
&gt; +    args[0].special()-&gt;reportUsedRegisters(*this, usedRegisters);

ditto

&gt; Source/JavaScriptCore/b3/air/AirLiveness.h:57
&gt; +                if (!firstTime &amp;&amp; localCalc.live() == m_liveAtHead[block])
&gt; +                    continue;

This does not look right. You do not update the liveAtTail of the predecessors.

You should check how I modified the DFG Liveness analysis. I reduced the cost of predecessor update by making it depends on &quot;localCalc.live() == m_liveAtHead[block]&quot;.

&gt; Source/JavaScriptCore/b3/air/AirTmp.h:37
&gt; +class Tmp {

I can live with the name, but I am not a fan of it.

&gt; Source/JavaScriptCore/b3/air/AirTmp.h:71
&gt; +    static Tmp forRawValue(unsigned index)

unsigned-&gt;int?

If possible, drop forRawValue(), that looks like a footgun.

&gt; Source/JavaScriptCore/b3/air/AirTmp.h:80
&gt; +    bool rawValue() const { return m_value; }

bool?

Can we drop this?

&gt; Source/JavaScriptCore/b3/air/AirTmp.h:134
&gt; +    unsigned gpTmpIndex() const
&gt; +    {
&gt; +        return decodeGPTmp(m_value);
&gt; +    }
&gt; +
&gt; +    unsigned fpTmpIndex() const
&gt; +    {
&gt; +        return decodeFPTmp(m_value);
&gt; +    }
&gt; +
&gt; +    unsigned tmpIndex() const

&quot;tmp&quot; here means unnamed/uncolored/unassigned.

Since the name of the class is already Tmp, this is a bit confusing.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1135918</commentid>
    <comment_count>32</comment_count>
    <who name="Filip Pizlo">fpizlo</who>
    <bug_when>2015-10-22 19:03:40 -0700</bug_when>
    <thetext>(In reply to comment #31)
&gt; Comment on attachment 263845 [details]
&gt; air is done, maybe?
&gt; 
&gt; View in context:
&gt; https://bugs.webkit.org/attachment.cgi?id=263845&amp;action=review
&gt; 
&gt; Quick comments:
&gt; 
&gt; &gt; Source/JavaScriptCore/b3/B3BasicBlockUtils.h:36
&gt; &gt; +bool addPredecessor(BasicBlock* block, BasicBlock* predecessor)
&gt; 
&gt; The arguments should be references here, to follow WebKit&apos;s new love for
&gt; reference

I really don&apos;t want to do that.  I understand that WebKit has a love for references, but that love hasn&apos;t happened in JSC.  It&apos;s not how we&apos;ve done things in the DFG for example.  In DFG, a Node and BasicBlock are referenced with * always, and that is a convention we have held to quite strictly.  It makes sense to me to designate certain classes as &quot;always *&quot;.

The classes where it makes most sense to always use * are those where identity has semantics and it&apos;s common to say things like &quot;a == b&quot; when given &quot;T*a, *b&quot;.  This is definitely the case with Node/BasicBlock in DFG, Value/BasicBlock in B3, and BasicBlock/Special/StackSlot in Air.

&gt; 
&gt; &gt; Source/JavaScriptCore/b3/B3BasicBlockUtils.h:48
&gt; &gt; +bool removePredecessor(BasicBlock* block, BasicBlock *predecessor)
&gt; 
&gt; The &quot;*&quot; is on the wrong side on &quot;BasicBlock *predecessor&quot;

Oops, fixed.

&gt; 
&gt; &gt; Source/JavaScriptCore/b3/B3BasicBlockUtils.h:58
&gt; &gt; +            result = true;
&gt; &gt; +            // Out of caution, we keep going even though the predecessor list cannot have
&gt; &gt; +            // duplicates.
&gt; 
&gt; This could help hiding programming mistakes.
&gt; 
&gt; What about?
&gt;     ASSERT_WITH_MESSAGE(!predecessors.contains(predecessor), &quot;Any
&gt; predecessor must only appear once per basic block adjacency list&quot;);
&gt;     return true;

Good idea, I changed it.

&gt; 
&gt; &gt; Source/JavaScriptCore/b3/air/AirBasicBlock.h:98
&gt; &gt; +    BasicBlock(unsigned index)
&gt; &gt; +    {
&gt; 
&gt; Don&apos;t forget 
&gt;     : m_index(index)

Done.

&gt; 
&gt; &gt; Source/JavaScriptCore/b3/air/AirInst.h:85
&gt; &gt; +        for (Arg arg : args)
&gt; 
&gt; &quot;Arg&quot; does not hold in a single register. Arg-&gt;Arg&amp; here?

OMG that was a huge error, since it&apos;s legal for the Functor to take Tmp&amp; and modify the Tmp&apos;s. The lack of &amp; would have meant that it wouldn&apos;t have actually modified the Inst&apos;s Tmp&apos;s!

Fixed.

&gt; 
&gt; &gt; Source/JavaScriptCore/b3/air/AirInstInlines.h:66
&gt; &gt; +    return args[0].special()-&gt;extraClobberedRegs(*this);
&gt; 
&gt; Precondition:
&gt;     ASSERT_WITH_MESSAGE(hasSpecial(), &quot;This operation only make sense for
&gt; Specials.&quot;);

I added an ASSERT, though we already would have gotten the assert implicitly inside Arg::special() (if size &gt;= 1) or Vector::size() (if size == 0).  I&apos;ve been restraining myself a little bit when it comes to redundant asserts, since we now have some places where the number of asserts is so large that it&apos;s hard to find the real code!

&gt; 
&gt; &gt; Source/JavaScriptCore/b3/air/AirInstInlines.h:71
&gt; &gt; +    args[0].special()-&gt;reportUsedRegisters(*this, usedRegisters);
&gt; 
&gt; ditto

Ditto, I added the assert.

&gt; 
&gt; &gt; Source/JavaScriptCore/b3/air/AirLiveness.h:57
&gt; &gt; +                if (!firstTime &amp;&amp; localCalc.live() == m_liveAtHead[block])
&gt; &gt; +                    continue;
&gt; 
&gt; This does not look right. You do not update the liveAtTail of the
&gt; predecessors.
&gt; 
&gt; You should check how I modified the DFG Liveness analysis. I reduced the
&gt; cost of predecessor update by making it depends on &quot;localCalc.live() ==
&gt; m_liveAtHead[block]&quot;.

As you were writing your feedback, I had noticed this as well and fixed it. The loop body now does:

                BasicBlock* block = code.at(blockIndex);
                LocalCalc localCalc(*this, block);
                for (size_t instIndex = block-&gt;size(); instIndex--;)
                    localCalc.execute(block-&gt;at(instIndex));
                bool firstTime = seen.add(block);
                if (!firstTime &amp;&amp; localCalc.live() == m_liveAtHead[block])
                    continue;
                changed = true;
                for (BasicBlock* predecessor : block-&gt;predecessors()) {
                    m_liveAtTail[predecessor].add(
                        localCalc.live().begin(), localCalc.live().end());
                }
                m_liveAtHead[block] = localCalc.takeLive();

I believe this sort of matches what you did in the DFG.

&gt; 
&gt; &gt; Source/JavaScriptCore/b3/air/AirTmp.h:37
&gt; &gt; +class Tmp {
&gt; 
&gt; I can live with the name, but I am not a fan of it.

Neither am I, other than I&apos;m expecting to have to write a lot of expressions that say &quot;Tmp&quot;.  Also, a big goal with naming Arg::Kind&apos;s was to keep the AirOpcode.opcodes file terse. Hence &quot;Tmp&quot;, &quot;Imm&quot;, &quot;Addr&quot;, and &quot;Index&quot; rather than their more verbose names.

&gt; 
&gt; &gt; Source/JavaScriptCore/b3/air/AirTmp.h:71
&gt; &gt; +    static Tmp forRawValue(unsigned index)
&gt; 
&gt; unsigned-&gt;int?
&gt; 
&gt; If possible, drop forRawValue(), that looks like a footgun.

I removed it.  I thought I would make Arg be a proper union, in which case I&apos;d need to extract a union-compatible thing from Tmp.  But, I ended up not doing it.

&gt; 
&gt; &gt; Source/JavaScriptCore/b3/air/AirTmp.h:80
&gt; &gt; +    bool rawValue() const { return m_value; }
&gt; 
&gt; bool?
&gt; 
&gt; Can we drop this?

Removed.

&gt; 
&gt; &gt; Source/JavaScriptCore/b3/air/AirTmp.h:134
&gt; &gt; +    unsigned gpTmpIndex() const
&gt; &gt; +    {
&gt; &gt; +        return decodeGPTmp(m_value);
&gt; &gt; +    }
&gt; &gt; +
&gt; &gt; +    unsigned fpTmpIndex() const
&gt; &gt; +    {
&gt; &gt; +        return decodeFPTmp(m_value);
&gt; &gt; +    }
&gt; &gt; +
&gt; &gt; +    unsigned tmpIndex() const
&gt; 
&gt; &quot;tmp&quot; here means unnamed/uncolored/unassigned.
&gt; 
&gt; Since the name of the class is already Tmp, this is a bit confusing.

Yeah.  I don&apos;t know what else to call it.  On the one hand, a Reg is a Tmp.  But on the other hand, there is a set of Tmps that are not Regs.

I found that this is easier to justify when I just say that &quot;some Tmps have indices, and some don&apos;t&quot;.  I documented this by adding this method:

    bool hasTmpIndex() const
    {
        return !isReg();
    }</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1135930</commentid>
    <comment_count>33</comment_count>
      <attachid>263889</attachid>
    <who name="Filip Pizlo">fpizlo</who>
    <bug_when>2015-10-22 20:43:50 -0700</bug_when>
    <thetext>Created attachment 263889
lots of progress on B3-&gt;Air lowering</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1135958</commentid>
    <comment_count>34</comment_count>
      <attachid>263900</attachid>
    <who name="Filip Pizlo">fpizlo</who>
    <bug_when>2015-10-22 22:16:58 -0700</bug_when>
    <thetext>Created attachment 263900
I think that the B3-&gt;Air lowering is &quot;done&quot;

Done in the sense that it&apos;s good to commit.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1135987</commentid>
    <comment_count>35</comment_count>
      <attachid>263900</attachid>
    <who name="Saam Barati">saam</who>
    <bug_when>2015-10-23 00:26:20 -0700</bug_when>
    <thetext>Comment on attachment 263900
I think that the B3-&gt;Air lowering is &quot;done&quot;

View in context: https://bugs.webkit.org/attachment.cgi?id=263900&amp;action=review

This is super interesting. I have a lot of questions but I&apos;ll make a second pass when I&apos;m not on my phone. 
I have some fly by comments.

&gt; Source/JavaScriptCore/b3/B3BasicBlockUtils.h:55
&gt; +            // Out of caution, we keep going even though the predecessor list cannot have

This comment looks out of date now that you&apos;ve added the assert.

&gt; Source/JavaScriptCore/b3/B3ControlValue.h:48
&gt; +            // swtichValue-&gt;as&lt;ControlValue&gt;() to return non-null.

Typo

&gt; Source/JavaScriptCore/b3/B3ControlValue.h:94
&gt; +    // Use this for Jump.

Maybe these could be static functions that call the proper constructors so that the call site is more descriptive?

&gt; Source/JavaScriptCore/b3/B3IndexMap.h:35
&gt; +template&lt;typename Key, typename Value&gt;

Does this need to be templatized over Key?
Or maybe you were going to add a method for &quot;Value&amp; get(Key);&quot;?

&gt; Source/JavaScriptCore/b3/B3IndexMap.h:59
&gt; +    Vector&lt;Value&gt; m_vector;

Maybe it&apos;s worth giving this some inline storage?

&gt; Source/JavaScriptCore/b3/B3IndexSet.h:54
&gt; +            return nullptr;

I would make this &quot;return false&quot;

&gt; Source/JavaScriptCore/b3/B3Opcode.h:71
&gt; +    ChillDiv, // doesn&apos;t trap ever, behaves like JS (x/y)|0.

Nice

&gt; Source/JavaScriptCore/b3/B3Opcode.h:136
&gt; +    // It&apos;s legal to request that a stackmap argument is in some register and it&apos;s legal to request

Would it be possible to request it to be part of a certain set of constraints?
Like: must be a callee save or on the stack?

&gt; Source/JavaScriptCore/b3/B3Opcode.h:166
&gt; +    // full branch fusion in the instruction selector. A true value jumps to the generator&apos;s slow

What is branch fusion?

&gt; Source/JavaScriptCore/b3/B3StackSlotKind.h:32
&gt; +    // A locked stack slot needs to be keep disjoint from all others because we intend to escape

&quot;be keep&quot; =&gt; &quot;be&quot;

&gt; Source/JavaScriptCore/b3/B3Stackmap.h:116
&gt; +    void* m_opaque { nullptr };

Maybe a better name for this is &quot;m_identifier&quot; or &quot;m_uniqueIdentifier&quot;?

&gt; Source/JavaScriptCore/b3/B3Type.h:52
&gt; +    if (sizeof(void*) == 4)

Are we going to support 32-bit?

&gt; Source/JavaScriptCore/b3/B3ValueInlines.h:46
&gt; +template&gt;typename T&gt;

&quot;&gt;&quot; =&gt; &quot;&lt;&quot;</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1135993</commentid>
    <comment_count>36</comment_count>
      <attachid>263900</attachid>
    <who name="Benjamin Poulain">benjamin</who>
    <bug_when>2015-10-23 00:52:05 -0700</bug_when>
    <thetext>Comment on attachment 263900
I think that the B3-&gt;Air lowering is &quot;done&quot;

View in context: https://bugs.webkit.org/attachment.cgi?id=263900&amp;action=review

Some more comments:

&gt; Source/JavaScriptCore/b3/air/AirValidate.cpp:39
&gt; +        , m_when(when)

Where is this one defined?

&gt; Source/JavaScriptCore/jit/Reg.h:210
&gt; +    static AllRegsIterable all() const { return AllRegsIterable(); }

The whole AllRegsIterable code seems unused, I don&apos;t see any call to all().

&gt; Source/JavaScriptCore/jit/RegisterAtOffsetList.h:70
&gt; +    template&lt;typename Functor&gt;
&gt; +    void forEach(const Functor&amp; functor) const

It looks like every use of this would be made cleaner with an iterator. Same for the next one.

Can you add a begin() + end() instead?

&gt; Source/WTF/wtf/BitVector.h:323
&gt; -    
&gt; +

Let&apos;s revert this.

&gt; Source/WTF/wtf/ScopedLambda.h:45
&gt; +template&lt;typename FunctionType&gt; class ScopedLambda;
&gt; +template&lt;typename ResultType, typename... ArgumentTypes&gt;
&gt; +class ScopedLambda&lt;ResultType (ArgumentTypes...)&gt; {

I have never seen this syntax.

Is the initial declaration
    template&lt;typename FunctionType&gt; class ScopedLambda;
necessary?

&gt; Source/WTF/wtf/ScopedLambda.h:55
&gt; +    ~ScopedLambda()
&gt; +    {
&gt; +    }

You can remove the explicit destructor.

&gt; Source/WTF/wtf/ScopedLambda.h:63
&gt; +    ResultType (*impl)(void* arg, ArgumentTypes&amp;&amp;...) m_impl;

I am not sure you need the name &quot;impl&quot; for a type declaration.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1136070</commentid>
    <comment_count>37</comment_count>
    <who name="Filip Pizlo">fpizlo</who>
    <bug_when>2015-10-23 10:52:59 -0700</bug_when>
    <thetext>(In reply to comment #36)
&gt; Comment on attachment 263900 [details]
&gt; I think that the B3-&gt;Air lowering is &quot;done&quot;
&gt; 
&gt; View in context:
&gt; https://bugs.webkit.org/attachment.cgi?id=263900&amp;action=review
&gt; 
&gt; Some more comments:
&gt; 
&gt; &gt; Source/JavaScriptCore/b3/air/AirValidate.cpp:39
&gt; &gt; +        , m_when(when)
&gt; 
&gt; Where is this one defined?

Fixed!

&gt; 
&gt; &gt; Source/JavaScriptCore/jit/Reg.h:210
&gt; &gt; +    static AllRegsIterable all() const { return AllRegsIterable(); }
&gt; 
&gt; The whole AllRegsIterable code seems unused, I don&apos;t see any call to all().

True. :-/  I added this because I saw too many loops like:

    for (Reg reg = Reg::first(); reg &lt;= Reg::last(); reg = reg.next()) {

And I was *about* to write one in AirRegisterPriority.cpp. That&apos;s why I added this iterable.

What do you think of this patch fixing RegisterAtOffsetList to use this?

&gt; 
&gt; &gt; Source/JavaScriptCore/jit/RegisterAtOffsetList.h:70
&gt; &gt; +    template&lt;typename Functor&gt;
&gt; &gt; +    void forEach(const Functor&amp; functor) const
&gt; 
&gt; It looks like every use of this would be made cleaner with an iterator. Same
&gt; for the next one.
&gt; 
&gt; Can you add a begin() + end() instead?

Sure, I changed this to use iterators.

&gt; 
&gt; &gt; Source/WTF/wtf/BitVector.h:323
&gt; &gt; -    
&gt; &gt; +
&gt; 
&gt; Let&apos;s revert this.

Done.

&gt; 
&gt; &gt; Source/WTF/wtf/ScopedLambda.h:45
&gt; &gt; +template&lt;typename FunctionType&gt; class ScopedLambda;
&gt; &gt; +template&lt;typename ResultType, typename... ArgumentTypes&gt;
&gt; &gt; +class ScopedLambda&lt;ResultType (ArgumentTypes...)&gt; {
&gt; 
&gt; I have never seen this syntax.
&gt; 
&gt; Is the initial declaration
&gt;     template&lt;typename FunctionType&gt; class ScopedLambda;
&gt; necessary?

Yeah, it is.  Something that helps understand this is that it *could* be rewritten as:

template&lt;typename&gt; class ScopedLambda;

Here&apos;s what this tells the C++ compiler:
- The valid syntax for instantiating the ScopedLambda template involves exactly one type argument.
- Any future declarations of a ScopedLambda template are specializations of ScopedLambda&lt;T&gt;. The compiler will try to pick the specialization where T matches that specialization&apos;s pattern.

A classic use of this syntax is something like:

template&lt;typename&gt; class PtrExtractor;
template&lt;typename T&gt;
class PtrExtractor&lt;T*&gt; { typedef T Type; }

Then if you say &quot;PtrExtractor&lt;char*&gt;&quot; then the compiler will notice the initial declaration, and then look for specializations. Because &quot;char*&quot; matches the &quot;T*&quot; pattern, we get PtrExtractor&lt;char*&gt;::Type == char.

This same kind of pattern matching works when the specialization has more type parameters than the original declaration. This could work for example:

template&lt;typename&gt; class PairExtractor;
template&lt;typename T, typename U&gt;
class PairExtractor&lt;std::pair&lt;T, U&gt;&gt; { typedef T FirstType; typedef U SecondType; };

Then you&apos;d have PairExtractor&lt;std::pair&lt;char, int&gt;&gt;::FirstType == char, for example.

This ScopedLambda thing does the same thing, except to extract return value and argument types.  It took me a while to figure this out, but I already know that this pattern works - see wtf/SharedTask.h.  It&apos;s also what std::function does.

&gt; 
&gt; &gt; Source/WTF/wtf/ScopedLambda.h:55
&gt; &gt; +    ~ScopedLambda()
&gt; &gt; +    {
&gt; &gt; +    }
&gt; 
&gt; You can remove the explicit destructor.

Lol, of course.

&gt; 
&gt; &gt; Source/WTF/wtf/ScopedLambda.h:63
&gt; &gt; +    ResultType (*impl)(void* arg, ArgumentTypes&amp;&amp;...) m_impl;
&gt; 
&gt; I am not sure you need the name &quot;impl&quot; for a type declaration.

OMG, this should be:

ResultType (*m_impl)(void* arg, ArgumentTypes&amp;&amp;...)</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1136077</commentid>
    <comment_count>38</comment_count>
    <who name="Filip Pizlo">fpizlo</who>
    <bug_when>2015-10-23 11:10:49 -0700</bug_when>
    <thetext>(In reply to comment #35)
&gt; Comment on attachment 263900 [details]
&gt; I think that the B3-&gt;Air lowering is &quot;done&quot;
&gt; 
&gt; View in context:
&gt; https://bugs.webkit.org/attachment.cgi?id=263900&amp;action=review
&gt; 
&gt; This is super interesting. I have a lot of questions but I&apos;ll make a second
&gt; pass when I&apos;m not on my phone. 
&gt; I have some fly by comments.
&gt; 
&gt; &gt; Source/JavaScriptCore/b3/B3BasicBlockUtils.h:55
&gt; &gt; +            // Out of caution, we keep going even though the predecessor list cannot have
&gt; 
&gt; This comment looks out of date now that you&apos;ve added the assert.

Removed!

&gt; 
&gt; &gt; Source/JavaScriptCore/b3/B3ControlValue.h:48
&gt; &gt; +            // swtichValue-&gt;as&lt;ControlValue&gt;() to return non-null.
&gt; 
&gt; Typo

Fixed!

&gt; 
&gt; &gt; Source/JavaScriptCore/b3/B3ControlValue.h:94
&gt; &gt; +    // Use this for Jump.
&gt; 
&gt; Maybe these could be static functions that call the proper constructors so
&gt; that the call site is more descriptive?

No, because B3::Procedure has to instantiate values. B3::Procedure is the thing that supplies the &quot;index&quot; parameter. All B3 values will be instantiated using:

procedure.add&lt;ControlValue&gt;(Jump, Origin(...), target);

Though often times, you&apos;ll do something like:

insertionSet.insert&lt;ControlValue&gt;(indexInBlock, Jump, Origin(...), target);

or:

block-&gt;append&lt;ControlValue&gt;(procedure, Jump, Origin(...), target);

&gt; 
&gt; &gt; Source/JavaScriptCore/b3/B3IndexMap.h:35
&gt; &gt; +template&lt;typename Key, typename Value&gt;
&gt; 
&gt; Does this need to be templatized over Key?

Yes.

&gt; Or maybe you were going to add a method for &quot;Value&amp; get(Key);&quot;?

Lol, yeah.  Actually I meant to add this:

    Value&amp; operator[](Key* key)
    {
        return m_vector[key-&gt;index()];
    }

&gt; 
&gt; &gt; Source/JavaScriptCore/b3/B3IndexMap.h:59
&gt; &gt; +    Vector&lt;Value&gt; m_vector;
&gt; 
&gt; Maybe it&apos;s worth giving this some inline storage?

Probably not.  IndexMap is usually used for BasicBlocks or Values.  Usually the total number of BasicBlocks is large, as is the total number of Values.  Inline storage is most useful when the total number of things is likely small.

&gt; 
&gt; &gt; Source/JavaScriptCore/b3/B3IndexSet.h:54
&gt; &gt; +            return nullptr;
&gt; 
&gt; I would make this &quot;return false&quot;

Oops, fixed.

&gt; 
&gt; &gt; Source/JavaScriptCore/b3/B3Opcode.h:71
&gt; &gt; +    ChillDiv, // doesn&apos;t trap ever, behaves like JS (x/y)|0.
&gt; 
&gt; Nice
&gt; 
&gt; &gt; Source/JavaScriptCore/b3/B3Opcode.h:136
&gt; &gt; +    // It&apos;s legal to request that a stackmap argument is in some register and it&apos;s legal to request
&gt; 
&gt; Would it be possible to request it to be part of a certain set of
&gt; constraints?

The code already does this, see B3Stackmap.h.

&gt; Like: must be a callee save or on the stack?

You can absolutely request things to go to the stack. ValueRep::stackArgument() does this. Though, it only allows you to put things into the outgoing-argument area of the stack. I believe that&apos;s sensible because that&apos;s the only way we would use such a constraint, any any other kind of constraint would be damn hard to implement.

It doesn&apos;t make sense to add the callee save request, but it is possible to say that all non-callee-saves are clobbered. But, B3&apos;s stackmap has no early clobber. So, you might still get your arguments in volatile registers even if you claim to clobber non-callee-saves. Keeping things simple like this will allow for the register allocator to be lighter-weight, I think.

&gt; 
&gt; &gt; Source/JavaScriptCore/b3/B3Opcode.h:166
&gt; &gt; +    // full branch fusion in the instruction selector. A true value jumps to the generator&apos;s slow
&gt; 
&gt; What is branch fusion?

If you say:

a = Equal(x, y)
Branch(a, target)

Then the naive codegen would be:

; Lowering of Equal:
cmp %x, %y
seteq %a
; Lowering of Branch:
test %a, %a
jnz target

Branch fusion is when you emit this instead:

cmp %x, %y
jeq target

In general &quot;fusion&quot; is another way of saying that the compiler matched a pattern that included more than one B3::Value and emitted just one instruction for all of those values - i.e. it fused them.

&gt; 
&gt; &gt; Source/JavaScriptCore/b3/B3StackSlotKind.h:32
&gt; &gt; +    // A locked stack slot needs to be keep disjoint from all others because we intend to escape
&gt; 
&gt; &quot;be keep&quot; =&gt; &quot;be&quot;

Oops, I meant to write &quot;be kept&quot;.

&gt; 
&gt; &gt; Source/JavaScriptCore/b3/B3Stackmap.h:116
&gt; &gt; +    void* m_opaque { nullptr };
&gt; 
&gt; Maybe a better name for this is &quot;m_identifier&quot; or &quot;m_uniqueIdentifier&quot;?

Possibly, but I have another thing in mind that will be an identifier, for when we want to teach B3 how to do CSE on patchpoints. That would allow us to implement for example exotic math instructions (like sqrt) using Patchpoint. The &quot;identifier&quot; would be an int that &quot;names&quot; the operation that the Patchpoint performs. So, the rule will be that two Patchpoints are redundant if they are both pure, they have the same identifier, and they take the same operands.

That&apos;s why I used the name &quot;opaque&quot; for now. It&apos;s literally just a cookie that B3 passes through but doesn&apos;t interpret. We&apos;d use it in the FTL to point to the IC or OSR data structure, or in the short term, to store what the FTL calls stackmapID.

&gt; 
&gt; &gt; Source/JavaScriptCore/b3/B3Type.h:52
&gt; &gt; +    if (sizeof(void*) == 4)
&gt; 
&gt; Are we going to support 32-bit?

We don&apos;t have to support it. But in a super low-level compiler like this, it doesn&apos;t take a whole lot to get the support for free, so I&apos;m just doing that.

&gt; 
&gt; &gt; Source/JavaScriptCore/b3/B3ValueInlines.h:46
&gt; &gt; +template&gt;typename T&gt;
&gt; 
&gt; &quot;&gt;&quot; =&gt; &quot;&lt;&quot;

Oops.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1136100</commentid>
    <comment_count>39</comment_count>
      <attachid>263934</attachid>
    <who name="Filip Pizlo">fpizlo</who>
    <bug_when>2015-10-23 12:06:59 -0700</bug_when>
    <thetext>Created attachment 263934
it is written

Now I need to try to compile it...</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1136112</commentid>
    <comment_count>40</comment_count>
    <who name="Lucas Forschler">lforschler</who>
    <bug_when>2015-10-23 12:41:53 -0700</bug_when>
    <thetext>This thread deserves a blog entry.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1136120</commentid>
    <comment_count>41</comment_count>
      <attachid>263937</attachid>
    <who name="Filip Pizlo">fpizlo</who>
    <bug_when>2015-10-23 13:11:00 -0700</bug_when>
    <thetext>Created attachment 263937
added a feature flag, ENABLE(B3_JIT)</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1136121</commentid>
    <comment_count>42</comment_count>
      <attachid>263938</attachid>
    <who name="Filip Pizlo">fpizlo</who>
    <bug_when>2015-10-23 13:20:55 -0700</bug_when>
    <thetext>Created attachment 263938
ready to be compiled

Lol there will be so many failures.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1136128</commentid>
    <comment_count>43</comment_count>
      <attachid>263941</attachid>
    <who name="Filip Pizlo">fpizlo</who>
    <bug_when>2015-10-23 13:43:52 -0700</bug_when>
    <thetext>Created attachment 263941
rebased

Starting to make it compile</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1136137</commentid>
    <comment_count>44</comment_count>
    <who name="Benjamin Poulain">benjamin</who>
    <bug_when>2015-10-23 14:15:54 -0700</bug_when>
    <thetext>(In reply to comment #37)
&gt; &gt; &gt; Source/JavaScriptCore/jit/Reg.h:210
&gt; &gt; &gt; +    static AllRegsIterable all() const { return AllRegsIterable(); }
&gt; &gt; 
&gt; &gt; The whole AllRegsIterable code seems unused, I don&apos;t see any call to all().
&gt; 
&gt; True. :-/  I added this because I saw too many loops like:
&gt; 
&gt;     for (Reg reg = Reg::first(); reg &lt;= Reg::last(); reg = reg.next()) {
&gt; 
&gt; And I was *about* to write one in AirRegisterPriority.cpp. That&apos;s why I
&gt; added this iterable.
&gt; 
&gt; What do you think of this patch fixing RegisterAtOffsetList to use this?

Sure. A few more lines won&apos;t stop you now :)</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1136147</commentid>
    <comment_count>45</comment_count>
      <attachid>263947</attachid>
    <who name="Filip Pizlo">fpizlo</who>
    <bug_when>2015-10-23 15:05:19 -0700</bug_when>
    <thetext>Created attachment 263947
closer to compiling</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1136168</commentid>
    <comment_count>46</comment_count>
    <who name="Benjamin Poulain">benjamin</who>
    <bug_when>2015-10-23 16:29:08 -0700</bug_when>
    <thetext>View in context: https://bugs.webkit.org/attachment.cgi?id=263941&amp;action=review

&gt; Source/JavaScriptCore/b3/B3AddressMatcher.patterns:35
&gt; +AddShift1 = Add(Shl(index, $logScale), base)
&gt; +AddShift2 = Add(base, Shl(index, $logScale))

I would prefer &quot;#&quot; instead of &quot;$&quot; for literals. It seems more common.

That would be adding complexity to the parser though...since # is also the start of comments.

&gt; Source/JavaScriptCore/b3/generate_pattern_matcher.rb:131
&gt; +        when /\A([ \t\r]+)/

&quot;\A\s+&quot;?

&gt; Source/JavaScriptCore/b3/generate_pattern_matcher.rb:144
&gt; +    # We can extend this as we add more keywords. Like, we might want &quot;include&quot; eventually.

Better already exclude &quot;include&quot; if you suspect you may use it in the future.

&gt; Source/JavaScriptCore/b3/generate_pattern_matcher.rb:214
&gt; +                parseError(&quot;Duplicate production&quot;)

It looks like this error would be associated with the wrong token. It would go with the first token of the next production, which would be misleading.

It may be better to just &quot;raise&quot; here directly with the faulty production name in the string.

&gt; Source/JavaScriptCore/b3/generate_pattern_matcher.rb:295
&gt; +    outp.puts &quot;void run#{matcher.name}(Value* _value, Adaptor&amp; adaptor)&quot;

_value -&gt; value?

&gt; Source/JavaScriptCore/b3/generate_pattern_matcher.rb:300
&gt; +    # Note that this does not emit properly indented code, because it&apos;s a recursive emitter. If you
&gt; +    # want to see the code nicely formatted, open it in a good text editor and ask it to format it
&gt; +    # for you.

Could be 
    # FIXME: indent the generated C++ code as expected.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1136187</commentid>
    <comment_count>47</comment_count>
      <attachid>263962</attachid>
    <who name="Filip Pizlo">fpizlo</who>
    <bug_when>2015-10-23 17:08:08 -0700</bug_when>
    <thetext>Created attachment 263962
it compiles!

It also sort of links, except that only works because nobody references anything in B3/Air yet.  Once I do that, it&apos;ll shake out the link errors.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1136189</commentid>
    <comment_count>48</comment_count>
    <who name="Filip Pizlo">fpizlo</who>
    <bug_when>2015-10-23 17:13:20 -0700</bug_when>
    <thetext>(In reply to comment #46)
&gt; View in context:
&gt; https://bugs.webkit.org/attachment.cgi?id=263941&amp;action=review
&gt; 
&gt; &gt; Source/JavaScriptCore/b3/B3AddressMatcher.patterns:35
&gt; &gt; +AddShift1 = Add(Shl(index, $logScale), base)
&gt; &gt; +AddShift2 = Add(base, Shl(index, $logScale))
&gt; 
&gt; I would prefer &quot;#&quot; instead of &quot;$&quot; for literals. It seems more common.
&gt; 
&gt; That would be adding complexity to the parser though...since # is also the
&gt; start of comments.

Hmm, really?  We already use $ for constants in bytecode, and $ is also used for constants in disassembly.

&gt; 
&gt; &gt; Source/JavaScriptCore/b3/generate_pattern_matcher.rb:131
&gt; &gt; +        when /\A([ \t\r]+)/
&gt; 
&gt; &quot;\A\s+&quot;?

That would also catch newline, and would break line counting in the parser.

&gt; 
&gt; &gt; Source/JavaScriptCore/b3/generate_pattern_matcher.rb:144
&gt; &gt; +    # We can extend this as we add more keywords. Like, we might want &quot;include&quot; eventually.
&gt; 
&gt; Better already exclude &quot;include&quot; if you suspect you may use it in the future.

Good call, added.

&gt; 
&gt; &gt; Source/JavaScriptCore/b3/generate_pattern_matcher.rb:214
&gt; &gt; +                parseError(&quot;Duplicate production&quot;)
&gt; 
&gt; It looks like this error would be associated with the wrong token. It would
&gt; go with the first token of the next production, which would be misleading.

Really?  This is just:

Foo = things...
Foo = more things...   &lt;=== this is an error

&gt; 
&gt; It may be better to just &quot;raise&quot; here directly with the faulty production
&gt; name in the string.
&gt; 
&gt; &gt; Source/JavaScriptCore/b3/generate_pattern_matcher.rb:295
&gt; &gt; +    outp.puts &quot;void run#{matcher.name}(Value* _value, Adaptor&amp; adaptor)&quot;
&gt; 
&gt; _value -&gt; value?

Then I&apos;d have to reserve the word &quot;value&quot;.  The parser prohibits identifiers from starting with &quot;_&quot;, so that we can prefix our own internal varaibles with &quot;_&quot;.

&gt; 
&gt; &gt; Source/JavaScriptCore/b3/generate_pattern_matcher.rb:300
&gt; &gt; +    # Note that this does not emit properly indented code, because it&apos;s a recursive emitter. If you
&gt; &gt; +    # want to see the code nicely formatted, open it in a good text editor and ask it to format it
&gt; &gt; +    # for you.
&gt; 
&gt; Could be 
&gt;     # FIXME: indent the generated C++ code as expected.

I don&apos;t think we ever want to fix this, as that would make the code generator significantly less hackable without really gaining us anything.  It&apos;s so easy to autoindent the resulting text if you really want to read it!</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1136224</commentid>
    <comment_count>49</comment_count>
    <who name="Benjamin Poulain">benjamin</who>
    <bug_when>2015-10-23 18:22:43 -0700</bug_when>
    <thetext>(In reply to comment #48)
&gt; (In reply to comment #46)
&gt; &gt; View in context:
&gt; &gt; https://bugs.webkit.org/attachment.cgi?id=263941&amp;action=review
&gt; &gt; 
&gt; &gt; &gt; Source/JavaScriptCore/b3/B3AddressMatcher.patterns:35
&gt; &gt; &gt; +AddShift1 = Add(Shl(index, $logScale), base)
&gt; &gt; &gt; +AddShift2 = Add(base, Shl(index, $logScale))
&gt; &gt; 
&gt; &gt; I would prefer &quot;#&quot; instead of &quot;$&quot; for literals. It seems more common.
&gt; &gt; 
&gt; &gt; That would be adding complexity to the parser though...since # is also the
&gt; &gt; start of comments.
&gt; 
&gt; Hmm, really?  We already use $ for constants in bytecode, and $ is also used
&gt; for constants in disassembly.

You probably look at x86 ASM more often, and I look at ARM ASM :)

&gt; &gt; &gt; Source/JavaScriptCore/b3/generate_pattern_matcher.rb:214
&gt; &gt; &gt; +                parseError(&quot;Duplicate production&quot;)
&gt; &gt; 
&gt; &gt; It looks like this error would be associated with the wrong token. It would
&gt; &gt; go with the first token of the next production, which would be misleading.
&gt; 
&gt; Really?  This is just:
&gt; 
&gt; Foo = things...
&gt; Foo = more things...   &lt;=== this is an error

Ok. I thought &quot;token&quot; would be the token *after* the production.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1136230</commentid>
    <comment_count>50</comment_count>
    <who name="Filip Pizlo">fpizlo</who>
    <bug_when>2015-10-23 19:28:05 -0700</bug_when>
    <thetext>(In reply to comment #49)
&gt; (In reply to comment #48)
&gt; &gt; (In reply to comment #46)
&gt; &gt; &gt; View in context:
&gt; &gt; &gt; https://bugs.webkit.org/attachment.cgi?id=263941&amp;action=review
&gt; &gt; &gt; 
&gt; &gt; &gt; &gt; Source/JavaScriptCore/b3/B3AddressMatcher.patterns:35
&gt; &gt; &gt; &gt; +AddShift1 = Add(Shl(index, $logScale), base)
&gt; &gt; &gt; &gt; +AddShift2 = Add(base, Shl(index, $logScale))
&gt; &gt; &gt; 
&gt; &gt; &gt; I would prefer &quot;#&quot; instead of &quot;$&quot; for literals. It seems more common.
&gt; &gt; &gt; 
&gt; &gt; &gt; That would be adding complexity to the parser though...since # is also the
&gt; &gt; &gt; start of comments.
&gt; &gt; 
&gt; &gt; Hmm, really?  We already use $ for constants in bytecode, and $ is also used
&gt; &gt; for constants in disassembly.
&gt; 
&gt; You probably look at x86 ASM more often, and I look at ARM ASM :)

Lol, that&apos;s a good point.

The more I think about it, I might remove the $ notation.  If we want to match a constant (like, Equal(x, 0) will be a thing, since it means &quot;not&quot;), then maybe we can write the constant without any prefix.  The purpose of $ is that you can match *any* constant.  But in those cases, it&apos;s so easy to just say &quot;if (thingy-&gt;hasInt32())&quot; or whatever inside the C++ code.

I&apos;ll keep this for now, since I&apos;m so close to this being landable.  But I&apos;ve filed a bug about the possible uselessness of $: https://bugs.webkit.org/show_bug.cgi?id=150527

&gt; 
&gt; &gt; &gt; &gt; Source/JavaScriptCore/b3/generate_pattern_matcher.rb:214
&gt; &gt; &gt; &gt; +                parseError(&quot;Duplicate production&quot;)
&gt; &gt; &gt; 
&gt; &gt; &gt; It looks like this error would be associated with the wrong token. It would
&gt; &gt; &gt; go with the first token of the next production, which would be misleading.
&gt; &gt; 
&gt; &gt; Really?  This is just:
&gt; &gt; 
&gt; &gt; Foo = things...
&gt; &gt; Foo = more things...   &lt;=== this is an error
&gt; 
&gt; Ok. I thought &quot;token&quot; would be the token *after* the production.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1136231</commentid>
    <comment_count>51</comment_count>
      <attachid>263974</attachid>
    <who name="Filip Pizlo">fpizlo</who>
    <bug_when>2015-10-23 19:28:58 -0700</bug_when>
    <thetext>Created attachment 263974
it links!</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1136236</commentid>
    <comment_count>52</comment_count>
      <attachid>263974</attachid>
    <who name="Benjamin Poulain">benjamin</who>
    <bug_when>2015-10-23 21:13:09 -0700</bug_when>
    <thetext>Comment on attachment 263974
it links!

View in context: https://bugs.webkit.org/attachment.cgi?id=263974&amp;action=review

Some more small comments.

&gt; Source/JavaScriptCore/assembler/MacroAssembler.h:1610
&gt; +namespace JSC {

Oops :)

&gt; Source/JavaScriptCore/b3/B3ArgumentRegValue.h:53
&gt; +    {

ASSERT(reg.isSet());

&gt; Source/JavaScriptCore/b3/B3LowerToAir.cpp:302
&gt; +                // This production isn&apos;t strictly necessary since we expect
&gt; +                // Load(Add(@x, @const1), offset = const2) to have already been strength-reduced
&gt; +                // to Load(@x, offset = const1 + const2).
&gt; +                selectedAddress = Arg::addr(lower.tmp(left), right-&gt;asInt32());

If strength reduction already takes care of that, IMHO you should just leave this out.

&gt; Source/JavaScriptCore/b3/B3Opcode.h:54
&gt; +    // The magical argument register. This is viewed as executing at the top of the program
&gt; +    // regardless of where in control flow you put it, and the compiler takes care to ensure that we

&quot;This is viewed as executing at the top of the program regardless of where in control flow you put it&quot;.

Wouldn&apos;t it be easier to be super strict about those: they must appear as the first statements inside the first BasicBlock? That way you can use regular analysis on them.

&gt; Source/JavaScriptCore/b3/B3Type.h:53
&gt; +inline Type pointer()

pointer() -&gt; pointerType()?

The code using &quot;pointer()&quot; looks a bit weird.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1136246</commentid>
    <comment_count>53</comment_count>
    <who name="Filip Pizlo">fpizlo</who>
    <bug_when>2015-10-24 00:31:17 -0700</bug_when>
    <thetext>It just did its first compile!

The test:

void test42()
{
    Procedure proc;
    BasicBlock* root = proc.addBlock();
    Value* const42 = root-&gt;appendNew&lt;Const32Value&gt;(proc, Origin(), 42);
    root-&gt;appendNew&lt;ControlValue&gt;(proc, Return, Origin(), const42);

    CHECK(compileAndRun&lt;int&gt;(proc) == 42);
}

The output with full dumping enabled:

[pizlo@shakezilla OpenSource] JSC_dumpGraphAtEachPhase=true JSC_dumpDisassembly=true JSC_validateGraphAtEachPhase=true DYLD_FRAMEWORK_PATH=WebKitBuild/Release/ WebKitBuild/Release/testb3 
test42():
Initial B3:
BB#0: ; frequency = nan
    Int32 @0 = Const32(42)
    Void @1 = Return(@0)
B3 before generation:
BB#0: ; frequency = nan
    Int32 @0 = Const32(42)
    Void @1 = Return(@0)
B3 before lowerToAir:
BB#0: ; frequency = nan
    Int32 @0 = Const32(42)
    Void @1 = Return(@0)
Initial air:
BB#0: ; frequency = nan
    Move $42, %tmp0, @0
    Move $42, %rax, @1
    Ret @1
Frame size: 0
Call arg area size: 0
Callee saves: 
Air before spillEverything:
BB#0: ; frequency = nan
    Move $42, %tmp0, @0
    Move $42, %rax, @1
    Ret @1
Frame size: 0
Call arg area size: 0
Callee saves: 
Air before handleCalleeSaves:
BB#0: ; frequency = nan
    Move $42, %rax, @0
    Move %rax, (stack0), @0
    Move $42, %rax, @1
    Ret @1
Stack slots:
    byteSize = 8, offsetFromFP = 0, kind = Anonymous
Frame size: 0
Call arg area size: 0
Callee saves: 
Air before allocateStack:
BB#0: ; frequency = nan
    Move $42, %rax, @0
    Move %rax, (stack0), @0
    Move $42, %rax, @1
    Ret @1
Stack slots:
    byteSize = 8, offsetFromFP = 0, kind = Anonymous
    byteSize = 0, offsetFromFP = 0, kind = Locked
Frame size: 0
Call arg area size: 0
Callee saves: 
Air before generation:
BB#0: ; frequency = nan
    Move $42, %rax, @0
    Move %rax, -8(%rbp), @0
    Move $42, %rax, @1
    Ret @1
Stack slots:
    byteSize = 8, offsetFromFP = -8, kind = Anonymous
    byteSize = 0, offsetFromFP = 0, kind = Locked
Frame size: 16
Call arg area size: 0
Callee saves: 
Generated JIT code for testb3:
    Code at [0x4aba39a01000, 0x4aba39a01020):
      0x4aba39a01000: push %rbp
      0x4aba39a01001: mov %rsp, %rbp
      0x4aba39a01004: add $0xfffffffffffffff0, %rsp
      0x4aba39a01008: mov $0x2a, %eax
      0x4aba39a0100d: mov %rax, -0x8(%rbp)
      0x4aba39a01011: mov $0x2a, %eax
      0x4aba39a01016: mov %rbp, %rsp
      0x4aba39a01019: pop %rbp
      0x4aba39a0101a: ret 
    OK!</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1136247</commentid>
    <comment_count>54</comment_count>
    <who name="Filip Pizlo">fpizlo</who>
    <bug_when>2015-10-24 00:35:16 -0700</bug_when>
    <thetext>(In reply to comment #52)
&gt; Comment on attachment 263974 [details]
&gt; it links!
&gt; 
&gt; View in context:
&gt; https://bugs.webkit.org/attachment.cgi?id=263974&amp;action=review
&gt; 
&gt; Some more small comments.
&gt; 
&gt; &gt; Source/JavaScriptCore/assembler/MacroAssembler.h:1610
&gt; &gt; +namespace JSC {
&gt; 
&gt; Oops :)
&gt; 
&gt; &gt; Source/JavaScriptCore/b3/B3ArgumentRegValue.h:53
&gt; &gt; +    {
&gt; 
&gt; ASSERT(reg.isSet());

Fixed!

&gt; 
&gt; &gt; Source/JavaScriptCore/b3/B3LowerToAir.cpp:302
&gt; &gt; +                // This production isn&apos;t strictly necessary since we expect
&gt; &gt; +                // Load(Add(@x, @const1), offset = const2) to have already been strength-reduced
&gt; &gt; +                // to Load(@x, offset = const1 + const2).
&gt; &gt; +                selectedAddress = Arg::addr(lower.tmp(left), right-&gt;asInt32());
&gt; 
&gt; If strength reduction already takes care of that, IMHO you should just leave
&gt; this out.

We don&apos;t have strength reduction yet. :-)  I&apos;m still torn about whether I want this to be a rule.  If it really was the case that strength reduction was the *very last* phase before LowerToAir, then we could argue that we should never put any strength reductions into LowerToAir.  But I&apos;m not sure we should mandate that strength reduction is the last phase, because we will probably end up adding &quot;late&quot; fixup phases (DFG has a lot of these as does LLVM).

&gt; 
&gt; &gt; Source/JavaScriptCore/b3/B3Opcode.h:54
&gt; &gt; +    // The magical argument register. This is viewed as executing at the top of the program
&gt; &gt; +    // regardless of where in control flow you put it, and the compiler takes care to ensure that we
&gt; 
&gt; &quot;This is viewed as executing at the top of the program regardless of where
&gt; in control flow you put it&quot;.
&gt; 
&gt; Wouldn&apos;t it be easier to be super strict about those: they must appear as
&gt; the first statements inside the first BasicBlock? That way you can use
&gt; regular analysis on them.

Actually, you can already do regular analysis on these. :-)  They behave like pure values.

&gt; 
&gt; &gt; Source/JavaScriptCore/b3/B3Type.h:53
&gt; &gt; +inline Type pointer()
&gt; 
&gt; pointer() -&gt; pointerType()?
&gt; 
&gt; The code using &quot;pointer()&quot; looks a bit weird.

Sure, I&apos;ll change it.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1136248</commentid>
    <comment_count>55</comment_count>
      <attachid>263976</attachid>
    <who name="Filip Pizlo">fpizlo</who>
    <bug_when>2015-10-24 00:43:02 -0700</bug_when>
    <thetext>Created attachment 263976
the patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1136249</commentid>
    <comment_count>56</comment_count>
    <who name="WebKit Commit Bot">commit-queue</who>
    <bug_when>2015-10-24 00:45:42 -0700</bug_when>
    <thetext>Attachment 263976 did not pass style-queue:


ERROR: Source/JavaScriptCore/b3/air/AirInst.h:66:  Missing space before {  [whitespace/braces] [5]
ERROR: Source/JavaScriptCore/b3/air/AirInst.h:104:  The parameter name &quot;functor&quot; adds no information, so it should be removed.  [readability/parameter_name] [5]
ERROR: Source/JavaScriptCore/b3/air/AirInst.h:111:  Place brace on its own line for function definitions.  [whitespace/braces] [4]
ERROR: Source/JavaScriptCore/b3/air/AirInst.h:118:  The parameter name &quot;functor&quot; adds no information, so it should be removed.  [readability/parameter_name] [5]
ERROR: Source/JavaScriptCore/b3/air/AirGenerate.cpp:95:  Place brace on its own line for function definitions.  [whitespace/braces] [4]
ERROR: Source/JavaScriptCore/b3/B3GenericFrequentedBlock.h:44:  Wrong number of spaces before statement. (expected: 12)  [whitespace/indent] [4]
ERROR: Source/JavaScriptCore/b3/B3GenericFrequentedBlock.h:45:  Wrong number of spaces before statement. (expected: 12)  [whitespace/indent] [4]
ERROR: Source/JavaScriptCore/b3/B3SwitchCase.h:32:  Alphabetical sorting problem.  [build/include_order] [4]
ERROR: Source/JavaScriptCore/b3/B3StackSlotValue.h:31:  Alphabetical sorting problem.  [build/include_order] [4]
ERROR: Source/JavaScriptCore/b3/B3Procedure.cpp:94:  Should have a space between // and comment  [whitespace/comments] [4]
ERROR: Source/JavaScriptCore/b3/B3CheckValue.h:31:  Alphabetical sorting problem.  [build/include_order] [4]
ERROR: Source/JavaScriptCore/b3/air/AirCCallSpecial.cpp:87:  Extra space between return and false  [whitespace/declaration] [3]
ERROR: Source/JavaScriptCore/b3/B3PatchpointValue.h:31:  Alphabetical sorting problem.  [build/include_order] [4]
ERROR: Source/JavaScriptCore/b3/air/AirRegisterPriority.cpp:48:  Place brace on its own line for function definitions.  [whitespace/braces] [4]
ERROR: Source/JavaScriptCore/b3/air/AirRegisterPriority.cpp:53:  Place brace on its own line for function definitions.  [whitespace/braces] [4]
ERROR: Source/JavaScriptCore/b3/air/AirRegisterPriority.cpp:72:  Place brace on its own line for function definitions.  [whitespace/braces] [4]
ERROR: Source/JavaScriptCore/b3/air/AirRegisterPriority.cpp:77:  Place brace on its own line for function definitions.  [whitespace/braces] [4]
ERROR: Source/JavaScriptCore/b3/B3MemoryValue.h:71:  Wrong number of spaces before statement. (expected: 12)  [whitespace/indent] [4]
ERROR: Source/JavaScriptCore/b3/B3MemoryValue.h:72:  Wrong number of spaces before statement. (expected: 12)  [whitespace/indent] [4]
ERROR: Source/JavaScriptCore/b3/B3MemoryValue.h:123:  Wrong number of spaces before statement. (expected: 12)  [whitespace/indent] [4]
ERROR: Source/JavaScriptCore/b3/B3MemoryValue.h:124:  Wrong number of spaces before statement. (expected: 12)  [whitespace/indent] [4]
ERROR: Source/JavaScriptCore/b3/B3StackmapSpecial.cpp:118:  Boolean expressions that span multiple lines should have their operators on the left side of the line instead of the right side.  [whitespace/operators] [4]
ERROR: Source/JavaScriptCore/b3/B3StackmapSpecial.cpp:118:  Multi line control clauses should use braces.  [whitespace/braces] [4]
ERROR: Source/JavaScriptCore/b3/B3Value.h:124:  Missing space before {  [whitespace/braces] [5]
ERROR: Source/JavaScriptCore/b3/B3Value.h:142:  Missing space before {  [whitespace/braces] [5]
ERROR: Source/JavaScriptCore/b3/air/AirBasicBlock.h:34:  Alphabetical sorting problem.  [build/include_order] [4]
ERROR: Source/JavaScriptCore/b3/B3SwitchValue.h:113:  The parameter name &quot;switchCase&quot; adds no information, so it should be removed.  [readability/parameter_name] [5]
ERROR: Source/JavaScriptCore/b3/B3SwitchValue.h:121:  The parameter name &quot;origin&quot; adds no information, so it should be removed.  [readability/parameter_name] [5]
ERROR: Source/JavaScriptCore/b3/air/AirStackSlot.h:32:  Alphabetical sorting problem.  [build/include_order] [4]
ERROR: Source/JavaScriptCore/b3/testb3.cpp:67:  Consider using CHECK_EQ instead of CHECK(a == b)  [readability/check] [2]
ERROR: Source/JavaScriptCore/b3/air/AirLiveness.h:96:  Place brace on its own line for function definitions.  [whitespace/braces] [4]
ERROR: Source/JavaScriptCore/b3/air/AirLiveness.h:106:  Place brace on its own line for function definitions.  [whitespace/braces] [4]
ERROR: Source/JavaScriptCore/b3/air/AirLiveness.h:110:  When wrapping a line, only indent 4 spaces.  [whitespace/indent] [3]
ERROR: Source/JavaScriptCore/b3/air/AirLiveness.h:113:  Place brace on its own line for function definitions.  [whitespace/braces] [4]
ERROR: Source/JavaScriptCore/b3/B3CheckSpecial.h:49:  The parameter name &quot;opcode&quot; adds no information, so it should be removed.  [readability/parameter_name] [5]
ERROR: Source/JavaScriptCore/b3/air/AirSpillEverything.cpp:52:  Place brace on its own line for function definitions.  [whitespace/braces] [4]
ERROR: Source/JavaScriptCore/b3/air/AirSpillEverything.cpp:85:  Place brace on its own line for function definitions.  [whitespace/braces] [4]
ERROR: Source/JavaScriptCore/b3/air/AirAllocateStack.cpp:123:  Place brace on its own line for function definitions.  [whitespace/braces] [4]
ERROR: Source/JavaScriptCore/b3/B3Opcode.h:38:  Weird number of spaces at line-start.  Are you using a 4-space indent?  [whitespace/indent] [3]
ERROR: Source/JavaScriptCore/b3/air/AirHandleCalleeSaves.cpp:46:  Place brace on its own line for function definitions.  [whitespace/braces] [4]
ERROR: Source/WTF/wtf/ScopedLambda.h:45:  Extra space before ( in function call  [whitespace/parens] [4]
ERROR: Source/WTF/wtf/ScopedLambda.h:65:  Extra space before ( in function call  [whitespace/parens] [4]
ERROR: Source/WTF/wtf/ScopedLambda.h:69:  Extra space before ( in function call  [whitespace/parens] [4]
ERROR: Source/JavaScriptCore/b3/B3BasicBlock.h:26:  #ifndef header guard has wrong style, please use: B3BasicBlock_h  [build/header_guard] [5]
ERROR: Source/JavaScriptCore/b3/B3CheckSpecial.cpp:122:  Place brace on its own line for function definitions.  [whitespace/braces] [4]
ERROR: Source/JavaScriptCore/b3/B3ControlValue.h:109:  Wrong number of spaces before statement. (expected: 12)  [whitespace/indent] [4]
Total errors found: 46 in 133 files


If any of these errors are false positives, please file a bug against check-webkit-style.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1136273</commentid>
    <comment_count>57</comment_count>
      <attachid>263982</attachid>
    <who name="Filip Pizlo">fpizlo</who>
    <bug_when>2015-10-24 12:45:10 -0700</bug_when>
    <thetext>Created attachment 263982
the patch

Maybe it&apos;ll even build this time.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1136274</commentid>
    <comment_count>58</comment_count>
    <who name="WebKit Commit Bot">commit-queue</who>
    <bug_when>2015-10-24 12:49:33 -0700</bug_when>
    <thetext>Attachment 263982 did not pass style-queue:


ERROR: Source/JavaScriptCore/b3/air/AirInst.h:66:  Missing space before {  [whitespace/braces] [5]
ERROR: Source/JavaScriptCore/b3/air/AirInst.h:104:  The parameter name &quot;functor&quot; adds no information, so it should be removed.  [readability/parameter_name] [5]
ERROR: Source/JavaScriptCore/b3/air/AirInst.h:111:  Place brace on its own line for function definitions.  [whitespace/braces] [4]
ERROR: Source/JavaScriptCore/b3/air/AirInst.h:118:  The parameter name &quot;functor&quot; adds no information, so it should be removed.  [readability/parameter_name] [5]
ERROR: Source/JavaScriptCore/b3/air/AirGenerate.cpp:95:  Place brace on its own line for function definitions.  [whitespace/braces] [4]
ERROR: Source/JavaScriptCore/b3/B3GenericFrequentedBlock.h:44:  Wrong number of spaces before statement. (expected: 12)  [whitespace/indent] [4]
ERROR: Source/JavaScriptCore/b3/B3GenericFrequentedBlock.h:45:  Wrong number of spaces before statement. (expected: 12)  [whitespace/indent] [4]
ERROR: Source/JavaScriptCore/b3/B3SwitchCase.h:32:  Alphabetical sorting problem.  [build/include_order] [4]
ERROR: Source/JavaScriptCore/b3/B3StackSlotValue.h:31:  Alphabetical sorting problem.  [build/include_order] [4]
ERROR: Source/JavaScriptCore/b3/B3Procedure.cpp:94:  Should have a space between // and comment  [whitespace/comments] [4]
ERROR: Source/JavaScriptCore/b3/B3CheckValue.h:31:  Alphabetical sorting problem.  [build/include_order] [4]
ERROR: Source/JavaScriptCore/b3/air/AirCCallSpecial.cpp:87:  Extra space between return and false  [whitespace/declaration] [3]
ERROR: Source/JavaScriptCore/b3/B3PatchpointValue.h:31:  Alphabetical sorting problem.  [build/include_order] [4]
ERROR: Source/JavaScriptCore/b3/air/AirRegisterPriority.cpp:48:  Place brace on its own line for function definitions.  [whitespace/braces] [4]
ERROR: Source/JavaScriptCore/b3/air/AirRegisterPriority.cpp:53:  Place brace on its own line for function definitions.  [whitespace/braces] [4]
ERROR: Source/JavaScriptCore/b3/air/AirRegisterPriority.cpp:72:  Place brace on its own line for function definitions.  [whitespace/braces] [4]
ERROR: Source/JavaScriptCore/b3/air/AirRegisterPriority.cpp:77:  Place brace on its own line for function definitions.  [whitespace/braces] [4]
ERROR: Source/JavaScriptCore/b3/B3MemoryValue.h:75:  Wrong number of spaces before statement. (expected: 12)  [whitespace/indent] [4]
ERROR: Source/JavaScriptCore/b3/B3MemoryValue.h:76:  Wrong number of spaces before statement. (expected: 12)  [whitespace/indent] [4]
ERROR: Source/JavaScriptCore/b3/B3MemoryValue.h:127:  Wrong number of spaces before statement. (expected: 12)  [whitespace/indent] [4]
ERROR: Source/JavaScriptCore/b3/B3MemoryValue.h:128:  Wrong number of spaces before statement. (expected: 12)  [whitespace/indent] [4]
ERROR: Source/JavaScriptCore/b3/B3StackmapSpecial.cpp:118:  Boolean expressions that span multiple lines should have their operators on the left side of the line instead of the right side.  [whitespace/operators] [4]
ERROR: Source/JavaScriptCore/b3/B3StackmapSpecial.cpp:118:  Multi line control clauses should use braces.  [whitespace/braces] [4]
ERROR: Source/JavaScriptCore/b3/B3Value.h:124:  Missing space before {  [whitespace/braces] [5]
ERROR: Source/JavaScriptCore/b3/B3Value.h:142:  Missing space before {  [whitespace/braces] [5]
ERROR: Source/JavaScriptCore/b3/air/AirBasicBlock.h:34:  Alphabetical sorting problem.  [build/include_order] [4]
ERROR: Source/JavaScriptCore/b3/B3SwitchValue.h:113:  The parameter name &quot;switchCase&quot; adds no information, so it should be removed.  [readability/parameter_name] [5]
ERROR: Source/JavaScriptCore/b3/B3SwitchValue.h:121:  The parameter name &quot;origin&quot; adds no information, so it should be removed.  [readability/parameter_name] [5]
ERROR: Source/JavaScriptCore/b3/air/AirStackSlot.h:32:  Alphabetical sorting problem.  [build/include_order] [4]
ERROR: Source/JavaScriptCore/b3/testb3.cpp:67:  Consider using CHECK_EQ instead of CHECK(a == b)  [readability/check] [2]
ERROR: Source/JavaScriptCore/b3/air/AirLiveness.h:96:  Place brace on its own line for function definitions.  [whitespace/braces] [4]
ERROR: Source/JavaScriptCore/b3/air/AirLiveness.h:106:  Place brace on its own line for function definitions.  [whitespace/braces] [4]
ERROR: Source/JavaScriptCore/b3/air/AirLiveness.h:110:  When wrapping a line, only indent 4 spaces.  [whitespace/indent] [3]
ERROR: Source/JavaScriptCore/b3/air/AirLiveness.h:113:  Place brace on its own line for function definitions.  [whitespace/braces] [4]
ERROR: Source/JavaScriptCore/b3/B3CheckSpecial.h:49:  The parameter name &quot;opcode&quot; adds no information, so it should be removed.  [readability/parameter_name] [5]
ERROR: Source/JavaScriptCore/b3/air/AirSpillEverything.cpp:52:  Place brace on its own line for function definitions.  [whitespace/braces] [4]
ERROR: Source/JavaScriptCore/b3/air/AirSpillEverything.cpp:85:  Place brace on its own line for function definitions.  [whitespace/braces] [4]
ERROR: Source/JavaScriptCore/b3/air/AirAllocateStack.cpp:129:  Place brace on its own line for function definitions.  [whitespace/braces] [4]
ERROR: Source/JavaScriptCore/b3/B3Opcode.h:38:  Weird number of spaces at line-start.  Are you using a 4-space indent?  [whitespace/indent] [3]
ERROR: Source/JavaScriptCore/b3/air/AirHandleCalleeSaves.cpp:46:  Place brace on its own line for function definitions.  [whitespace/braces] [4]
ERROR: Source/WTF/wtf/ScopedLambda.h:45:  Extra space before ( in function call  [whitespace/parens] [4]
ERROR: Source/WTF/wtf/ScopedLambda.h:65:  Extra space before ( in function call  [whitespace/parens] [4]
ERROR: Source/WTF/wtf/ScopedLambda.h:69:  Extra space before ( in function call  [whitespace/parens] [4]
ERROR: Source/JavaScriptCore/b3/B3BasicBlock.h:26:  #ifndef header guard has wrong style, please use: B3BasicBlock_h  [build/header_guard] [5]
ERROR: Source/JavaScriptCore/b3/B3CheckSpecial.cpp:122:  Place brace on its own line for function definitions.  [whitespace/braces] [4]
ERROR: Source/JavaScriptCore/b3/B3ControlValue.h:109:  Wrong number of spaces before statement. (expected: 12)  [whitespace/indent] [4]
Total errors found: 46 in 134 files


If any of these errors are false positives, please file a bug against check-webkit-style.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1136304</commentid>
    <comment_count>59</comment_count>
      <attachid>263976</attachid>
    <who name="Benjamin Poulain">benjamin</who>
    <bug_when>2015-10-24 16:33:45 -0700</bug_when>
    <thetext>Comment on attachment 263976
the patch

View in context: https://bugs.webkit.org/attachment.cgi?id=263976&amp;action=review

Be patient, it&apos;s a big patch :)

&gt; Source/JavaScriptCore/b3/B3BasicBlock.h:46
&gt; +    typedef Vector&lt;FrequentedBlock, 2&gt; SuccessorList; // This matches ControlValue::SuccessorList

Instead of a comment, you could declare a BasicBlockSuccessorList type in B3Type and typedef from it in BasicBlock and ControlValue.

&gt; Source/JavaScriptCore/b3/B3BasicBlock.h:75
&gt; +    FrequentedBlock successor(unsigned index) const;

Return
    const FrequentedBlock&amp;
instead?

&gt; Source/JavaScriptCore/b3/B3BasicBlock.h:93
&gt; +    bool addPredecessor(BasicBlock*);
&gt; +    bool removePredecessor(BasicBlock*);
&gt; +    bool replacePredecessor(BasicBlock* from, BasicBlock* to);

It would be nice if those function could ASSERT that the new relation make sense. It could check that the new predecessor&apos;s last Value* has this block as a possible target.

removePredecessor could check that we are no longer a target.

&gt; Source/JavaScriptCore/b3/B3BasicBlockUtils.h:56
&gt; +            predecessors[i--] = predecessors.last();
&gt; +            predecessors.removeLast();

This could be 
    predecessors[i--] = predecessors.takeLast();

&gt; Source/JavaScriptCore/b3/B3FrequentedBlock.h:37
&gt; +typedef GenericFrequentedBlock&lt;BasicBlock&gt; FrequentedBlock;

Frequented sounds weird to me for &quot;something-with-a-frequency&quot;. English is not my forte though :)

Maybe QuantifiedBlock or WeightedBlock?

&gt; Source/JavaScriptCore/b3/B3GenericFrequentedBlock.h:49
&gt; +    bool operator==(const GenericFrequentedBlock&amp; other) const

Do you need to declare this and the operator!=?
Aren&apos;t they doing the same as the generated ones?

&gt; Source/JavaScriptCore/b3/B3SuccessorCollection.h:35
&gt; +template&lt;typename BasicBlock, typename SuccessorList&gt;

Do you need the type BasicBlock?

You may be able to just use &quot;auto&quot; to get the right type out of SuccessorList.

&gt; Source/JavaScriptCore/b3/B3SuccessorCollection.h:36
&gt; +class SuccessorCollection {

Since the &quot;frequented&quot; successor list is named SuccessorList, 
    SuccessorCollection-&gt;SuccessorBlockList?

&gt; Source/JavaScriptCore/b3/B3SuccessorCollection.h:58
&gt; +            : m_collection(const_cast&lt;SuccessorCollection*&gt;(&amp;collection)) // const is stupid anyway.

Why do you take the collection as const anyway?

Your begin() and end() are not const.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1136317</commentid>
    <comment_count>60</comment_count>
    <who name="Filip Pizlo">fpizlo</who>
    <bug_when>2015-10-24 17:28:07 -0700</bug_when>
    <thetext>(In reply to comment #59)
&gt; Comment on attachment 263976 [details]
&gt; the patch
&gt; 
&gt; View in context:
&gt; https://bugs.webkit.org/attachment.cgi?id=263976&amp;action=review
&gt; 
&gt; Be patient, it&apos;s a big patch :)

Oh it&apos;ll take a while before I even get it to build everywhere!

&gt; 
&gt; &gt; Source/JavaScriptCore/b3/B3BasicBlock.h:46
&gt; &gt; +    typedef Vector&lt;FrequentedBlock, 2&gt; SuccessorList; // This matches ControlValue::SuccessorList
&gt; 
&gt; Instead of a comment, you could declare a BasicBlockSuccessorList type in
&gt; B3Type and typedef from it in BasicBlock and ControlValue.

That would require having BasicBlock.h include ControlValue.h, or vice versa.  I did this matching declaration of SuccessorList instead, so that we don&apos;t have an include dependency.  I figure that as the code grows, we&apos;ll discover some good reason for one of these headers to include the other, and it&apos;s better to leave it flexible for now.

&gt; 
&gt; &gt; Source/JavaScriptCore/b3/B3BasicBlock.h:75
&gt; &gt; +    FrequentedBlock successor(unsigned index) const;
&gt; 
&gt; Return
&gt;     const FrequentedBlock&amp;
&gt; instead?

I changed it.  Though, it probably doesn&apos;t make a huge difference since the code gets inlined anyway.  If we use FrequentedBlock instead of const FrequentedBlock&amp;, then after all of the inlining, you&apos;ll first have something like:

FrequentedBlock x = block-&gt;last()-&gt;as&lt;ControlValue&gt;()-&gt;m_successors[index];

But then after SROA, you get:

const FrequentedBlock&amp; xRef = block-&gt;last()-&gt;as&lt;ControlValue&gt;()-&gt;m_successors[index];
BasicBlock* xBlock = xRef.m_block;
FrequencyClass xFreq = xRef.m_frequency;

If you only use the block but not the frequency (or vice versa) then you&apos;ll only do that load.

In other words, it really shouldn&apos;t matter if the code is inlineable.

&gt; 
&gt; &gt; Source/JavaScriptCore/b3/B3BasicBlock.h:93
&gt; &gt; +    bool addPredecessor(BasicBlock*);
&gt; &gt; +    bool removePredecessor(BasicBlock*);
&gt; &gt; +    bool replacePredecessor(BasicBlock* from, BasicBlock* to);
&gt; 
&gt; It would be nice if those function could ASSERT that the new relation make
&gt; sense. It could check that the new predecessor&apos;s last Value* has this block
&gt; as a possible target.
&gt; 
&gt; removePredecessor could check that we are no longer a target.

If we did that, then you&apos;d have to always edit the successors before you edit the predecessors.  That seems arbitrary.  Why not the other way around? ;-)

This could easily get very annoying - you might have a transformation for which it&apos;s most convenient to edit the successors/predecessors in a particular order, and in that case we wouldn&apos;t want assertions to prevent us from using the most natural approach.

We can easily add a validation rule for predecessors.  If you make a mistake, you&apos;ll know exactly which phase caused it.  So, I think that BasicBlock should give you maximum flexibility to temporarily put the IR in an invalid state.  This is how the IR works in all other regards.

&gt; 
&gt; &gt; Source/JavaScriptCore/b3/B3BasicBlockUtils.h:56
&gt; &gt; +            predecessors[i--] = predecessors.last();
&gt; &gt; +            predecessors.removeLast();
&gt; 
&gt; This could be 
&gt;     predecessors[i--] = predecessors.takeLast();

No, it can&apos;t.  That would crash if predecessors had one element left and we were removing it.  takeLast() would make predecessors have zero elements, and then &quot;predecessors[i--] = ...&quot; would crash because i would be zero, the size would be zero, and if we&apos;re sufficiently unlucky we would have already deleted the backing store.  Even if we didn&apos;t delete the backing store, you&apos;d get one of those asserts with security implications. ;-)

&gt; 
&gt; &gt; Source/JavaScriptCore/b3/B3FrequentedBlock.h:37
&gt; &gt; +typedef GenericFrequentedBlock&lt;BasicBlock&gt; FrequentedBlock;
&gt; 
&gt; Frequented sounds weird to me for &quot;something-with-a-frequency&quot;. English is
&gt; not my forte though :)
&gt; 
&gt; Maybe QuantifiedBlock or WeightedBlock?

I was going for a slightly weird name.  I wanted to call it BlockEdgeWithFrequency.  In the DFG, I called it BranchTarget, which ended up being a suboptimal name because I can never remember what exactly it means.

My hope was that FrequentedBlock sounds weird but is memorable enough that you&apos;ll instinctively know what it means.

QuantifiedBlock doesn&apos;t quite tell me that we&apos;re talking about the frequency.

WeightedBlock kind of tells me what this is about, but to me it sounds more like the block itself has a weight.  That&apos;s not true.  It&apos;s the edge to the block that has a &quot;weight&quot; (or frequency, in the current jargon).

&quot;FrequentedBlock&quot; also has the benefit that by virtue of being a goofy phrase, it alerts you to the fact that it&apos;s not the block that has the frequency.  The frequency tells us how often this predecessor jumps to that block.

&gt; 
&gt; &gt; Source/JavaScriptCore/b3/B3GenericFrequentedBlock.h:49
&gt; &gt; +    bool operator==(const GenericFrequentedBlock&amp; other) const
&gt; 
&gt; Do you need to declare this and the operator!=?
&gt; Aren&apos;t they doing the same as the generated ones?

I didn&apos;t know that the compiler synthesizes these!

&gt; 
&gt; &gt; Source/JavaScriptCore/b3/B3SuccessorCollection.h:35
&gt; &gt; +template&lt;typename BasicBlock, typename SuccessorList&gt;
&gt; 
&gt; Do you need the type BasicBlock?
&gt; 
&gt; You may be able to just use &quot;auto&quot; to get the right type out of
&gt; SuccessorList.

Well, I need to have a type declaration for the return values of at() and operator[]().  I don&apos;t think I can put auto as the return value.

&gt; 
&gt; &gt; Source/JavaScriptCore/b3/B3SuccessorCollection.h:36
&gt; &gt; +class SuccessorCollection {
&gt; 
&gt; Since the &quot;frequented&quot; successor list is named SuccessorList, 
&gt;     SuccessorCollection-&gt;SuccessorBlockList?

Well, so far when we say &quot;BlahList&quot;, it means that it&apos;s a Vector, oddly enough.  At the very list, it means that it&apos;s a list type that actually supports all of the list operations you&apos;d expect to see.  SuccessorCollection doesn&apos;t do that.  It allows for forward iteration and random access, but no appending or removing.  That&apos;s why I went for &quot;Collection&quot; instead of &quot;List&quot; - it doesn&apos;t really do all of the things you&apos;d expect a List to do.

&gt; 
&gt; &gt; Source/JavaScriptCore/b3/B3SuccessorCollection.h:58
&gt; &gt; +            : m_collection(const_cast&lt;SuccessorCollection*&gt;(&amp;collection)) // const is stupid anyway.
&gt; 
&gt; Why do you take the collection as const anyway?
&gt; 
&gt; Your begin() and end() are not const.

I don&apos;t remember.  I&apos;ll fiddle with this again.  So far, so good - removing the const and the cast appears to work.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1136323</commentid>
    <comment_count>61</comment_count>
      <attachid>263993</attachid>
    <who name="Filip Pizlo">fpizlo</who>
    <bug_when>2015-10-24 18:07:08 -0700</bug_when>
    <thetext>Created attachment 263993
the patch

Lots of fixes.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1136325</commentid>
    <comment_count>62</comment_count>
      <attachid>263994</attachid>
    <who name="Filip Pizlo">fpizlo</who>
    <bug_when>2015-10-24 18:16:12 -0700</bug_when>
    <thetext>Created attachment 263994
the patch

Rebased</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1136327</commentid>
    <comment_count>63</comment_count>
    <who name="WebKit Commit Bot">commit-queue</who>
    <bug_when>2015-10-24 18:20:39 -0700</bug_when>
    <thetext>Attachment 263994 did not pass style-queue:


ERROR: Source/JavaScriptCore/b3/air/AirInst.h:66:  Missing space before {  [whitespace/braces] [5]
ERROR: Source/JavaScriptCore/b3/air/AirInst.h:104:  The parameter name &quot;functor&quot; adds no information, so it should be removed.  [readability/parameter_name] [5]
ERROR: Source/JavaScriptCore/b3/air/AirInst.h:111:  Place brace on its own line for function definitions.  [whitespace/braces] [4]
ERROR: Source/JavaScriptCore/b3/air/AirInst.h:118:  The parameter name &quot;functor&quot; adds no information, so it should be removed.  [readability/parameter_name] [5]
ERROR: Source/JavaScriptCore/b3/air/AirGenerate.cpp:95:  Place brace on its own line for function definitions.  [whitespace/braces] [4]
ERROR: Source/JavaScriptCore/b3/B3GenericFrequentedBlock.h:44:  Wrong number of spaces before statement. (expected: 12)  [whitespace/indent] [4]
ERROR: Source/JavaScriptCore/b3/B3GenericFrequentedBlock.h:45:  Wrong number of spaces before statement. (expected: 12)  [whitespace/indent] [4]
ERROR: Source/JavaScriptCore/b3/B3SwitchCase.h:32:  Alphabetical sorting problem.  [build/include_order] [4]
ERROR: Source/JavaScriptCore/b3/B3StackSlotValue.h:31:  Alphabetical sorting problem.  [build/include_order] [4]
ERROR: Source/JavaScriptCore/b3/B3Procedure.cpp:94:  Should have a space between // and comment  [whitespace/comments] [4]
ERROR: Source/JavaScriptCore/b3/B3CheckValue.h:31:  Alphabetical sorting problem.  [build/include_order] [4]
ERROR: Source/JavaScriptCore/b3/air/AirCCallSpecial.cpp:87:  Extra space between return and false  [whitespace/declaration] [3]
ERROR: Source/JavaScriptCore/b3/B3PatchpointValue.h:31:  Alphabetical sorting problem.  [build/include_order] [4]
ERROR: Source/JavaScriptCore/b3/air/AirRegisterPriority.cpp:48:  Place brace on its own line for function definitions.  [whitespace/braces] [4]
ERROR: Source/JavaScriptCore/b3/air/AirRegisterPriority.cpp:53:  Place brace on its own line for function definitions.  [whitespace/braces] [4]
ERROR: Source/JavaScriptCore/b3/air/AirRegisterPriority.cpp:72:  Place brace on its own line for function definitions.  [whitespace/braces] [4]
ERROR: Source/JavaScriptCore/b3/air/AirRegisterPriority.cpp:77:  Place brace on its own line for function definitions.  [whitespace/braces] [4]
ERROR: Source/JavaScriptCore/b3/B3MemoryValue.h:75:  Wrong number of spaces before statement. (expected: 12)  [whitespace/indent] [4]
ERROR: Source/JavaScriptCore/b3/B3MemoryValue.h:76:  Wrong number of spaces before statement. (expected: 12)  [whitespace/indent] [4]
ERROR: Source/JavaScriptCore/b3/B3MemoryValue.h:127:  Wrong number of spaces before statement. (expected: 12)  [whitespace/indent] [4]
ERROR: Source/JavaScriptCore/b3/B3MemoryValue.h:128:  Wrong number of spaces before statement. (expected: 12)  [whitespace/indent] [4]
ERROR: Source/JavaScriptCore/b3/B3StackmapSpecial.cpp:118:  Boolean expressions that span multiple lines should have their operators on the left side of the line instead of the right side.  [whitespace/operators] [4]
ERROR: Source/JavaScriptCore/b3/B3StackmapSpecial.cpp:118:  Multi line control clauses should use braces.  [whitespace/braces] [4]
ERROR: Source/JavaScriptCore/b3/B3Value.h:124:  Missing space before {  [whitespace/braces] [5]
ERROR: Source/JavaScriptCore/b3/B3Value.h:142:  Missing space before {  [whitespace/braces] [5]
ERROR: Source/JavaScriptCore/b3/air/AirBasicBlock.h:34:  Alphabetical sorting problem.  [build/include_order] [4]
ERROR: Source/JavaScriptCore/b3/B3SwitchValue.h:113:  The parameter name &quot;switchCase&quot; adds no information, so it should be removed.  [readability/parameter_name] [5]
ERROR: Source/JavaScriptCore/b3/B3SwitchValue.h:121:  The parameter name &quot;origin&quot; adds no information, so it should be removed.  [readability/parameter_name] [5]
ERROR: Source/JavaScriptCore/b3/air/AirStackSlot.h:32:  Alphabetical sorting problem.  [build/include_order] [4]
ERROR: Source/JavaScriptCore/b3/testb3.cpp:68:  Consider using CHECK_EQ instead of CHECK(a == b)  [readability/check] [2]
ERROR: Source/JavaScriptCore/b3/air/AirLiveness.h:96:  Place brace on its own line for function definitions.  [whitespace/braces] [4]
ERROR: Source/JavaScriptCore/b3/air/AirLiveness.h:106:  Place brace on its own line for function definitions.  [whitespace/braces] [4]
ERROR: Source/JavaScriptCore/b3/air/AirLiveness.h:110:  When wrapping a line, only indent 4 spaces.  [whitespace/indent] [3]
ERROR: Source/JavaScriptCore/b3/air/AirLiveness.h:113:  Place brace on its own line for function definitions.  [whitespace/braces] [4]
ERROR: Source/JavaScriptCore/b3/B3CheckSpecial.h:49:  The parameter name &quot;opcode&quot; adds no information, so it should be removed.  [readability/parameter_name] [5]
ERROR: Source/JavaScriptCore/b3/air/AirSpillEverything.cpp:52:  Place brace on its own line for function definitions.  [whitespace/braces] [4]
ERROR: Source/JavaScriptCore/b3/air/AirSpillEverything.cpp:85:  Place brace on its own line for function definitions.  [whitespace/braces] [4]
ERROR: Source/JavaScriptCore/b3/air/AirAllocateStack.cpp:129:  Place brace on its own line for function definitions.  [whitespace/braces] [4]
ERROR: Source/JavaScriptCore/b3/B3Opcode.h:38:  Weird number of spaces at line-start.  Are you using a 4-space indent?  [whitespace/indent] [3]
ERROR: Source/JavaScriptCore/b3/air/AirHandleCalleeSaves.cpp:46:  Place brace on its own line for function definitions.  [whitespace/braces] [4]
ERROR: Source/WTF/wtf/ScopedLambda.h:45:  Extra space before ( in function call  [whitespace/parens] [4]
ERROR: Source/WTF/wtf/ScopedLambda.h:65:  Extra space before ( in function call  [whitespace/parens] [4]
ERROR: Source/WTF/wtf/ScopedLambda.h:69:  Extra space before ( in function call  [whitespace/parens] [4]
ERROR: Source/JavaScriptCore/b3/B3BasicBlock.h:26:  #ifndef header guard has wrong style, please use: B3BasicBlock_h  [build/header_guard] [5]
ERROR: Source/JavaScriptCore/b3/B3CheckSpecial.cpp:123:  Place brace on its own line for function definitions.  [whitespace/braces] [4]
ERROR: Source/JavaScriptCore/b3/B3ControlValue.h:109:  Wrong number of spaces before statement. (expected: 12)  [whitespace/indent] [4]
Total errors found: 46 in 135 files


If any of these errors are false positives, please file a bug against check-webkit-style.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1136333</commentid>
    <comment_count>64</comment_count>
      <attachid>263996</attachid>
    <who name="Filip Pizlo">fpizlo</who>
    <bug_when>2015-10-24 18:45:56 -0700</bug_when>
    <thetext>Created attachment 263996
the patch

More fixes.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1136335</commentid>
    <comment_count>65</comment_count>
    <who name="WebKit Commit Bot">commit-queue</who>
    <bug_when>2015-10-24 18:48:32 -0700</bug_when>
    <thetext>Attachment 263996 did not pass style-queue:


ERROR: Source/JavaScriptCore/b3/air/AirInst.h:66:  Missing space before {  [whitespace/braces] [5]
ERROR: Source/JavaScriptCore/b3/air/AirInst.h:104:  The parameter name &quot;functor&quot; adds no information, so it should be removed.  [readability/parameter_name] [5]
ERROR: Source/JavaScriptCore/b3/air/AirInst.h:111:  Place brace on its own line for function definitions.  [whitespace/braces] [4]
ERROR: Source/JavaScriptCore/b3/air/AirInst.h:118:  The parameter name &quot;functor&quot; adds no information, so it should be removed.  [readability/parameter_name] [5]
ERROR: Source/JavaScriptCore/b3/air/AirGenerate.cpp:95:  Place brace on its own line for function definitions.  [whitespace/braces] [4]
ERROR: Source/JavaScriptCore/b3/B3GenericFrequentedBlock.h:44:  Wrong number of spaces before statement. (expected: 12)  [whitespace/indent] [4]
ERROR: Source/JavaScriptCore/b3/B3GenericFrequentedBlock.h:45:  Wrong number of spaces before statement. (expected: 12)  [whitespace/indent] [4]
ERROR: Source/JavaScriptCore/b3/B3SwitchCase.h:32:  Alphabetical sorting problem.  [build/include_order] [4]
ERROR: Source/JavaScriptCore/b3/B3StackSlotValue.h:31:  Alphabetical sorting problem.  [build/include_order] [4]
ERROR: Source/JavaScriptCore/b3/B3Procedure.cpp:94:  Should have a space between // and comment  [whitespace/comments] [4]
ERROR: Source/JavaScriptCore/b3/B3CheckValue.h:31:  Alphabetical sorting problem.  [build/include_order] [4]
ERROR: Source/JavaScriptCore/b3/air/AirCCallSpecial.cpp:87:  Extra space between return and false  [whitespace/declaration] [3]
ERROR: Source/JavaScriptCore/b3/B3PatchpointValue.h:31:  Alphabetical sorting problem.  [build/include_order] [4]
ERROR: Source/JavaScriptCore/b3/air/AirRegisterPriority.cpp:48:  Place brace on its own line for function definitions.  [whitespace/braces] [4]
ERROR: Source/JavaScriptCore/b3/air/AirRegisterPriority.cpp:53:  Place brace on its own line for function definitions.  [whitespace/braces] [4]
ERROR: Source/JavaScriptCore/b3/air/AirRegisterPriority.cpp:72:  Place brace on its own line for function definitions.  [whitespace/braces] [4]
ERROR: Source/JavaScriptCore/b3/air/AirRegisterPriority.cpp:77:  Place brace on its own line for function definitions.  [whitespace/braces] [4]
ERROR: Source/JavaScriptCore/b3/B3MemoryValue.h:75:  Wrong number of spaces before statement. (expected: 12)  [whitespace/indent] [4]
ERROR: Source/JavaScriptCore/b3/B3MemoryValue.h:76:  Wrong number of spaces before statement. (expected: 12)  [whitespace/indent] [4]
ERROR: Source/JavaScriptCore/b3/B3MemoryValue.h:127:  Wrong number of spaces before statement. (expected: 12)  [whitespace/indent] [4]
ERROR: Source/JavaScriptCore/b3/B3MemoryValue.h:128:  Wrong number of spaces before statement. (expected: 12)  [whitespace/indent] [4]
ERROR: Source/JavaScriptCore/b3/B3StackmapSpecial.cpp:118:  Boolean expressions that span multiple lines should have their operators on the left side of the line instead of the right side.  [whitespace/operators] [4]
ERROR: Source/JavaScriptCore/b3/B3StackmapSpecial.cpp:118:  Multi line control clauses should use braces.  [whitespace/braces] [4]
ERROR: Source/JavaScriptCore/b3/B3Value.h:124:  Missing space before {  [whitespace/braces] [5]
ERROR: Source/JavaScriptCore/b3/B3Value.h:142:  Missing space before {  [whitespace/braces] [5]
ERROR: Source/JavaScriptCore/b3/air/AirBasicBlock.h:34:  Alphabetical sorting problem.  [build/include_order] [4]
ERROR: Source/JavaScriptCore/b3/B3SwitchValue.h:113:  The parameter name &quot;switchCase&quot; adds no information, so it should be removed.  [readability/parameter_name] [5]
ERROR: Source/JavaScriptCore/b3/B3SwitchValue.h:121:  The parameter name &quot;origin&quot; adds no information, so it should be removed.  [readability/parameter_name] [5]
ERROR: Source/JavaScriptCore/b3/air/AirStackSlot.h:32:  Alphabetical sorting problem.  [build/include_order] [4]
ERROR: Source/JavaScriptCore/b3/testb3.cpp:68:  Consider using CHECK_EQ instead of CHECK(a == b)  [readability/check] [2]
ERROR: Source/JavaScriptCore/b3/air/AirLiveness.h:96:  Place brace on its own line for function definitions.  [whitespace/braces] [4]
ERROR: Source/JavaScriptCore/b3/air/AirLiveness.h:106:  Place brace on its own line for function definitions.  [whitespace/braces] [4]
ERROR: Source/JavaScriptCore/b3/air/AirLiveness.h:110:  When wrapping a line, only indent 4 spaces.  [whitespace/indent] [3]
ERROR: Source/JavaScriptCore/b3/air/AirLiveness.h:113:  Place brace on its own line for function definitions.  [whitespace/braces] [4]
ERROR: Source/JavaScriptCore/b3/B3CheckSpecial.h:49:  The parameter name &quot;opcode&quot; adds no information, so it should be removed.  [readability/parameter_name] [5]
ERROR: Source/JavaScriptCore/b3/air/AirSpillEverything.cpp:52:  Place brace on its own line for function definitions.  [whitespace/braces] [4]
ERROR: Source/JavaScriptCore/b3/air/AirSpillEverything.cpp:85:  Place brace on its own line for function definitions.  [whitespace/braces] [4]
ERROR: Source/JavaScriptCore/b3/air/AirAllocateStack.cpp:129:  Place brace on its own line for function definitions.  [whitespace/braces] [4]
ERROR: Source/JavaScriptCore/b3/B3Opcode.h:38:  Weird number of spaces at line-start.  Are you using a 4-space indent?  [whitespace/indent] [3]
ERROR: Source/JavaScriptCore/b3/air/AirHandleCalleeSaves.cpp:46:  Place brace on its own line for function definitions.  [whitespace/braces] [4]
ERROR: Source/WTF/wtf/ScopedLambda.h:45:  Extra space before ( in function call  [whitespace/parens] [4]
ERROR: Source/WTF/wtf/ScopedLambda.h:65:  Extra space before ( in function call  [whitespace/parens] [4]
ERROR: Source/WTF/wtf/ScopedLambda.h:69:  Extra space before ( in function call  [whitespace/parens] [4]
ERROR: Source/JavaScriptCore/b3/B3BasicBlock.h:26:  #ifndef header guard has wrong style, please use: B3BasicBlock_h  [build/header_guard] [5]
ERROR: Source/JavaScriptCore/b3/B3CheckSpecial.cpp:123:  Place brace on its own line for function definitions.  [whitespace/braces] [4]
ERROR: Source/JavaScriptCore/b3/B3ControlValue.h:109:  Wrong number of spaces before statement. (expected: 12)  [whitespace/indent] [4]
Total errors found: 46 in 135 files


If any of these errors are false positives, please file a bug against check-webkit-style.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1136336</commentid>
    <comment_count>66</comment_count>
      <attachid>263997</attachid>
    <who name="Filip Pizlo">fpizlo</who>
    <bug_when>2015-10-24 19:05:46 -0700</bug_when>
    <thetext>Created attachment 263997
the patch

More fixes for !ENABLE(B3_JIT).</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1136337</commentid>
    <comment_count>67</comment_count>
    <who name="WebKit Commit Bot">commit-queue</who>
    <bug_when>2015-10-24 19:09:17 -0700</bug_when>
    <thetext>Attachment 263997 did not pass style-queue:


ERROR: Source/JavaScriptCore/b3/air/AirInst.h:66:  Missing space before {  [whitespace/braces] [5]
ERROR: Source/JavaScriptCore/b3/air/AirInst.h:104:  The parameter name &quot;functor&quot; adds no information, so it should be removed.  [readability/parameter_name] [5]
ERROR: Source/JavaScriptCore/b3/air/AirInst.h:111:  Place brace on its own line for function definitions.  [whitespace/braces] [4]
ERROR: Source/JavaScriptCore/b3/air/AirInst.h:118:  The parameter name &quot;functor&quot; adds no information, so it should be removed.  [readability/parameter_name] [5]
ERROR: Source/JavaScriptCore/b3/air/AirGenerate.cpp:95:  Place brace on its own line for function definitions.  [whitespace/braces] [4]
ERROR: Source/JavaScriptCore/b3/B3GenericFrequentedBlock.h:44:  Wrong number of spaces before statement. (expected: 12)  [whitespace/indent] [4]
ERROR: Source/JavaScriptCore/b3/B3GenericFrequentedBlock.h:45:  Wrong number of spaces before statement. (expected: 12)  [whitespace/indent] [4]
ERROR: Source/JavaScriptCore/b3/B3SwitchCase.h:32:  Alphabetical sorting problem.  [build/include_order] [4]
ERROR: Source/JavaScriptCore/b3/B3StackSlotValue.h:31:  Alphabetical sorting problem.  [build/include_order] [4]
ERROR: Source/JavaScriptCore/b3/B3Procedure.cpp:94:  Should have a space between // and comment  [whitespace/comments] [4]
ERROR: Source/JavaScriptCore/b3/B3CheckValue.h:31:  Alphabetical sorting problem.  [build/include_order] [4]
ERROR: Source/JavaScriptCore/b3/air/AirCCallSpecial.cpp:87:  Extra space between return and false  [whitespace/declaration] [3]
ERROR: Source/JavaScriptCore/b3/B3PatchpointValue.h:31:  Alphabetical sorting problem.  [build/include_order] [4]
ERROR: Source/JavaScriptCore/b3/air/AirRegisterPriority.cpp:48:  Place brace on its own line for function definitions.  [whitespace/braces] [4]
ERROR: Source/JavaScriptCore/b3/air/AirRegisterPriority.cpp:53:  Place brace on its own line for function definitions.  [whitespace/braces] [4]
ERROR: Source/JavaScriptCore/b3/air/AirRegisterPriority.cpp:72:  Place brace on its own line for function definitions.  [whitespace/braces] [4]
ERROR: Source/JavaScriptCore/b3/air/AirRegisterPriority.cpp:77:  Place brace on its own line for function definitions.  [whitespace/braces] [4]
ERROR: Source/JavaScriptCore/b3/B3MemoryValue.h:75:  Wrong number of spaces before statement. (expected: 12)  [whitespace/indent] [4]
ERROR: Source/JavaScriptCore/b3/B3MemoryValue.h:76:  Wrong number of spaces before statement. (expected: 12)  [whitespace/indent] [4]
ERROR: Source/JavaScriptCore/b3/B3MemoryValue.h:127:  Wrong number of spaces before statement. (expected: 12)  [whitespace/indent] [4]
ERROR: Source/JavaScriptCore/b3/B3MemoryValue.h:128:  Wrong number of spaces before statement. (expected: 12)  [whitespace/indent] [4]
ERROR: Source/JavaScriptCore/b3/B3StackmapSpecial.cpp:118:  Boolean expressions that span multiple lines should have their operators on the left side of the line instead of the right side.  [whitespace/operators] [4]
ERROR: Source/JavaScriptCore/b3/B3StackmapSpecial.cpp:118:  Multi line control clauses should use braces.  [whitespace/braces] [4]
ERROR: Source/JavaScriptCore/b3/B3Value.h:124:  Missing space before {  [whitespace/braces] [5]
ERROR: Source/JavaScriptCore/b3/B3Value.h:142:  Missing space before {  [whitespace/braces] [5]
ERROR: Source/JavaScriptCore/b3/air/AirBasicBlock.h:34:  Alphabetical sorting problem.  [build/include_order] [4]
ERROR: Source/JavaScriptCore/b3/B3SwitchValue.h:113:  The parameter name &quot;switchCase&quot; adds no information, so it should be removed.  [readability/parameter_name] [5]
ERROR: Source/JavaScriptCore/b3/B3SwitchValue.h:121:  The parameter name &quot;origin&quot; adds no information, so it should be removed.  [readability/parameter_name] [5]
ERROR: Source/JavaScriptCore/b3/air/AirStackSlot.h:32:  Alphabetical sorting problem.  [build/include_order] [4]
ERROR: Source/JavaScriptCore/b3/testb3.cpp:70:  Consider using CHECK_EQ instead of CHECK(a == b)  [readability/check] [2]
ERROR: Source/JavaScriptCore/b3/air/AirLiveness.h:96:  Place brace on its own line for function definitions.  [whitespace/braces] [4]
ERROR: Source/JavaScriptCore/b3/air/AirLiveness.h:106:  Place brace on its own line for function definitions.  [whitespace/braces] [4]
ERROR: Source/JavaScriptCore/b3/air/AirLiveness.h:110:  When wrapping a line, only indent 4 spaces.  [whitespace/indent] [3]
ERROR: Source/JavaScriptCore/b3/air/AirLiveness.h:113:  Place brace on its own line for function definitions.  [whitespace/braces] [4]
ERROR: Source/JavaScriptCore/b3/B3CheckSpecial.h:49:  The parameter name &quot;opcode&quot; adds no information, so it should be removed.  [readability/parameter_name] [5]
ERROR: Source/JavaScriptCore/b3/air/AirSpillEverything.cpp:52:  Place brace on its own line for function definitions.  [whitespace/braces] [4]
ERROR: Source/JavaScriptCore/b3/air/AirSpillEverything.cpp:85:  Place brace on its own line for function definitions.  [whitespace/braces] [4]
ERROR: Source/JavaScriptCore/b3/air/AirAllocateStack.cpp:129:  Place brace on its own line for function definitions.  [whitespace/braces] [4]
ERROR: Source/JavaScriptCore/b3/B3Opcode.h:38:  Weird number of spaces at line-start.  Are you using a 4-space indent?  [whitespace/indent] [3]
ERROR: Source/JavaScriptCore/b3/air/AirHandleCalleeSaves.cpp:46:  Place brace on its own line for function definitions.  [whitespace/braces] [4]
ERROR: Source/WTF/wtf/ScopedLambda.h:45:  Extra space before ( in function call  [whitespace/parens] [4]
ERROR: Source/WTF/wtf/ScopedLambda.h:65:  Extra space before ( in function call  [whitespace/parens] [4]
ERROR: Source/WTF/wtf/ScopedLambda.h:69:  Extra space before ( in function call  [whitespace/parens] [4]
ERROR: Source/JavaScriptCore/b3/B3BasicBlock.h:26:  #ifndef header guard has wrong style, please use: B3BasicBlock_h  [build/header_guard] [5]
ERROR: Source/JavaScriptCore/b3/B3CheckSpecial.cpp:123:  Place brace on its own line for function definitions.  [whitespace/braces] [4]
ERROR: Source/JavaScriptCore/b3/B3ControlValue.h:109:  Wrong number of spaces before statement. (expected: 12)  [whitespace/indent] [4]
Total errors found: 46 in 135 files


If any of these errors are false positives, please file a bug against check-webkit-style.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1136342</commentid>
    <comment_count>68</comment_count>
      <attachid>264000</attachid>
    <who name="Filip Pizlo">fpizlo</who>
    <bug_when>2015-10-24 19:41:01 -0700</bug_when>
    <thetext>Created attachment 264000
the patch

Fixed a bunch of style issues.

But &gt;2/3 of the style issues that were reported are invalid.  The style checker doesn&apos;t know our C++11 style yet.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1136343</commentid>
    <comment_count>69</comment_count>
    <who name="WebKit Commit Bot">commit-queue</who>
    <bug_when>2015-10-24 19:44:37 -0700</bug_when>
    <thetext>Attachment 264000 did not pass style-queue:


ERROR: Source/JavaScriptCore/b3/air/AirInst.h:66:  Missing space before {  [whitespace/braces] [5]
ERROR: Source/JavaScriptCore/b3/air/AirInst.h:111:  Place brace on its own line for function definitions.  [whitespace/braces] [4]
ERROR: Source/JavaScriptCore/b3/air/AirGenerate.cpp:95:  Place brace on its own line for function definitions.  [whitespace/braces] [4]
ERROR: Source/JavaScriptCore/b3/B3GenericFrequentedBlock.h:44:  Wrong number of spaces before statement. (expected: 12)  [whitespace/indent] [4]
ERROR: Source/JavaScriptCore/b3/B3GenericFrequentedBlock.h:45:  Wrong number of spaces before statement. (expected: 12)  [whitespace/indent] [4]
ERROR: Source/JavaScriptCore/b3/B3SwitchCase.h:32:  Alphabetical sorting problem.  [build/include_order] [4]
ERROR: Source/JavaScriptCore/b3/air/AirRegisterPriority.cpp:48:  Place brace on its own line for function definitions.  [whitespace/braces] [4]
ERROR: Source/JavaScriptCore/b3/air/AirRegisterPriority.cpp:53:  Place brace on its own line for function definitions.  [whitespace/braces] [4]
ERROR: Source/JavaScriptCore/b3/air/AirRegisterPriority.cpp:72:  Place brace on its own line for function definitions.  [whitespace/braces] [4]
ERROR: Source/JavaScriptCore/b3/air/AirRegisterPriority.cpp:77:  Place brace on its own line for function definitions.  [whitespace/braces] [4]
ERROR: Source/JavaScriptCore/b3/B3MemoryValue.h:75:  Wrong number of spaces before statement. (expected: 12)  [whitespace/indent] [4]
ERROR: Source/JavaScriptCore/b3/B3MemoryValue.h:76:  Wrong number of spaces before statement. (expected: 12)  [whitespace/indent] [4]
ERROR: Source/JavaScriptCore/b3/B3MemoryValue.h:127:  Wrong number of spaces before statement. (expected: 12)  [whitespace/indent] [4]
ERROR: Source/JavaScriptCore/b3/B3MemoryValue.h:128:  Wrong number of spaces before statement. (expected: 12)  [whitespace/indent] [4]
ERROR: Source/JavaScriptCore/b3/B3Value.h:124:  Missing space before {  [whitespace/braces] [5]
ERROR: Source/JavaScriptCore/b3/B3Value.h:142:  Missing space before {  [whitespace/braces] [5]
ERROR: Source/JavaScriptCore/b3/testb3.cpp:70:  Consider using CHECK_EQ instead of CHECK(a == b)  [readability/check] [2]
ERROR: Source/JavaScriptCore/b3/air/AirLiveness.h:96:  Place brace on its own line for function definitions.  [whitespace/braces] [4]
ERROR: Source/JavaScriptCore/b3/air/AirLiveness.h:106:  Place brace on its own line for function definitions.  [whitespace/braces] [4]
ERROR: Source/JavaScriptCore/b3/air/AirLiveness.h:113:  Place brace on its own line for function definitions.  [whitespace/braces] [4]
ERROR: Source/JavaScriptCore/b3/air/AirSpillEverything.cpp:52:  Place brace on its own line for function definitions.  [whitespace/braces] [4]
ERROR: Source/JavaScriptCore/b3/air/AirSpillEverything.cpp:85:  Place brace on its own line for function definitions.  [whitespace/braces] [4]
ERROR: Source/JavaScriptCore/b3/air/AirAllocateStack.cpp:129:  Place brace on its own line for function definitions.  [whitespace/braces] [4]
ERROR: Source/JavaScriptCore/b3/air/AirHandleCalleeSaves.cpp:46:  Place brace on its own line for function definitions.  [whitespace/braces] [4]
ERROR: Source/WTF/wtf/ScopedLambda.h:45:  Extra space before ( in function call  [whitespace/parens] [4]
ERROR: Source/WTF/wtf/ScopedLambda.h:65:  Extra space before ( in function call  [whitespace/parens] [4]
ERROR: Source/WTF/wtf/ScopedLambda.h:69:  Extra space before ( in function call  [whitespace/parens] [4]
ERROR: Source/JavaScriptCore/b3/B3CheckSpecial.cpp:123:  Place brace on its own line for function definitions.  [whitespace/braces] [4]
ERROR: Source/JavaScriptCore/b3/B3ControlValue.h:109:  Wrong number of spaces before statement. (expected: 12)  [whitespace/indent] [4]
Total errors found: 29 in 135 files


If any of these errors are false positives, please file a bug against check-webkit-style.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1136534</commentid>
    <comment_count>70</comment_count>
      <attachid>264047</attachid>
    <who name="Filip Pizlo">fpizlo</who>
    <bug_when>2015-10-26 09:54:23 -0700</bug_when>
    <thetext>Created attachment 264047
the patch

Did some minor simplifications, filed more bugs, linked the bugs with FIXMEs and comments, and rebased.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1136538</commentid>
    <comment_count>71</comment_count>
    <who name="WebKit Commit Bot">commit-queue</who>
    <bug_when>2015-10-26 09:58:05 -0700</bug_when>
    <thetext>Attachment 264047 did not pass style-queue:


ERROR: Source/JavaScriptCore/b3/air/AirInst.h:66:  Missing space before {  [whitespace/braces] [5]
ERROR: Source/JavaScriptCore/b3/air/AirInst.h:111:  Place brace on its own line for function definitions.  [whitespace/braces] [4]
ERROR: Source/JavaScriptCore/b3/air/AirGenerate.cpp:95:  Place brace on its own line for function definitions.  [whitespace/braces] [4]
ERROR: Source/JavaScriptCore/b3/B3GenericFrequentedBlock.h:44:  Wrong number of spaces before statement. (expected: 12)  [whitespace/indent] [4]
ERROR: Source/JavaScriptCore/b3/B3GenericFrequentedBlock.h:45:  Wrong number of spaces before statement. (expected: 12)  [whitespace/indent] [4]
ERROR: Source/JavaScriptCore/b3/B3SwitchCase.h:32:  Alphabetical sorting problem.  [build/include_order] [4]
ERROR: Source/JavaScriptCore/b3/air/AirRegisterPriority.cpp:48:  Place brace on its own line for function definitions.  [whitespace/braces] [4]
ERROR: Source/JavaScriptCore/b3/air/AirRegisterPriority.cpp:53:  Place brace on its own line for function definitions.  [whitespace/braces] [4]
ERROR: Source/JavaScriptCore/b3/air/AirRegisterPriority.cpp:72:  Place brace on its own line for function definitions.  [whitespace/braces] [4]
ERROR: Source/JavaScriptCore/b3/air/AirRegisterPriority.cpp:77:  Place brace on its own line for function definitions.  [whitespace/braces] [4]
ERROR: Source/JavaScriptCore/b3/B3MemoryValue.h:75:  Wrong number of spaces before statement. (expected: 12)  [whitespace/indent] [4]
ERROR: Source/JavaScriptCore/b3/B3MemoryValue.h:76:  Wrong number of spaces before statement. (expected: 12)  [whitespace/indent] [4]
ERROR: Source/JavaScriptCore/b3/B3MemoryValue.h:127:  Wrong number of spaces before statement. (expected: 12)  [whitespace/indent] [4]
ERROR: Source/JavaScriptCore/b3/B3MemoryValue.h:128:  Wrong number of spaces before statement. (expected: 12)  [whitespace/indent] [4]
ERROR: Source/JavaScriptCore/b3/B3Value.h:124:  Missing space before {  [whitespace/braces] [5]
ERROR: Source/JavaScriptCore/b3/B3Value.h:142:  Missing space before {  [whitespace/braces] [5]
ERROR: Source/JavaScriptCore/b3/testb3.cpp:70:  Consider using CHECK_EQ instead of CHECK(a == b)  [readability/check] [2]
ERROR: Source/JavaScriptCore/b3/air/AirLiveness.h:96:  Place brace on its own line for function definitions.  [whitespace/braces] [4]
ERROR: Source/JavaScriptCore/b3/air/AirLiveness.h:106:  Place brace on its own line for function definitions.  [whitespace/braces] [4]
ERROR: Source/JavaScriptCore/b3/air/AirLiveness.h:113:  Place brace on its own line for function definitions.  [whitespace/braces] [4]
ERROR: Source/JavaScriptCore/b3/air/AirSpillEverything.cpp:52:  Place brace on its own line for function definitions.  [whitespace/braces] [4]
ERROR: Source/JavaScriptCore/b3/air/AirSpillEverything.cpp:85:  Place brace on its own line for function definitions.  [whitespace/braces] [4]
ERROR: Source/JavaScriptCore/b3/air/AirAllocateStack.cpp:129:  Place brace on its own line for function definitions.  [whitespace/braces] [4]
ERROR: Source/JavaScriptCore/b3/air/AirHandleCalleeSaves.cpp:46:  Place brace on its own line for function definitions.  [whitespace/braces] [4]
ERROR: Source/WTF/wtf/ScopedLambda.h:45:  Extra space before ( in function call  [whitespace/parens] [4]
ERROR: Source/WTF/wtf/ScopedLambda.h:65:  Extra space before ( in function call  [whitespace/parens] [4]
ERROR: Source/WTF/wtf/ScopedLambda.h:69:  Extra space before ( in function call  [whitespace/parens] [4]
ERROR: Source/JavaScriptCore/b3/B3CheckSpecial.cpp:123:  Place brace on its own line for function definitions.  [whitespace/braces] [4]
ERROR: Source/JavaScriptCore/b3/B3ControlValue.h:109:  Wrong number of spaces before statement. (expected: 12)  [whitespace/indent] [4]
Total errors found: 29 in 135 files


If any of these errors are false positives, please file a bug against check-webkit-style.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1136558</commentid>
    <comment_count>72</comment_count>
      <attachid>264051</attachid>
    <who name="Filip Pizlo">fpizlo</who>
    <bug_when>2015-10-26 10:55:22 -0700</bug_when>
    <thetext>Created attachment 264051
the patch

Made the dumps easier to read.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1136561</commentid>
    <comment_count>73</comment_count>
    <who name="WebKit Commit Bot">commit-queue</who>
    <bug_when>2015-10-26 10:59:32 -0700</bug_when>
    <thetext>Attachment 264051 did not pass style-queue:


ERROR: Source/JavaScriptCore/b3/air/AirInst.h:66:  Missing space before {  [whitespace/braces] [5]
ERROR: Source/JavaScriptCore/b3/air/AirInst.h:111:  Place brace on its own line for function definitions.  [whitespace/braces] [4]
ERROR: Source/JavaScriptCore/b3/air/AirGenerate.cpp:98:  Place brace on its own line for function definitions.  [whitespace/braces] [4]
ERROR: Source/JavaScriptCore/b3/B3GenericFrequentedBlock.h:44:  Wrong number of spaces before statement. (expected: 12)  [whitespace/indent] [4]
ERROR: Source/JavaScriptCore/b3/B3GenericFrequentedBlock.h:45:  Wrong number of spaces before statement. (expected: 12)  [whitespace/indent] [4]
ERROR: Source/JavaScriptCore/b3/B3SwitchCase.h:32:  Alphabetical sorting problem.  [build/include_order] [4]
ERROR: Source/JavaScriptCore/b3/air/AirRegisterPriority.cpp:48:  Place brace on its own line for function definitions.  [whitespace/braces] [4]
ERROR: Source/JavaScriptCore/b3/air/AirRegisterPriority.cpp:53:  Place brace on its own line for function definitions.  [whitespace/braces] [4]
ERROR: Source/JavaScriptCore/b3/air/AirRegisterPriority.cpp:72:  Place brace on its own line for function definitions.  [whitespace/braces] [4]
ERROR: Source/JavaScriptCore/b3/air/AirRegisterPriority.cpp:77:  Place brace on its own line for function definitions.  [whitespace/braces] [4]
ERROR: Source/JavaScriptCore/b3/B3MemoryValue.h:75:  Wrong number of spaces before statement. (expected: 12)  [whitespace/indent] [4]
ERROR: Source/JavaScriptCore/b3/B3MemoryValue.h:76:  Wrong number of spaces before statement. (expected: 12)  [whitespace/indent] [4]
ERROR: Source/JavaScriptCore/b3/B3MemoryValue.h:127:  Wrong number of spaces before statement. (expected: 12)  [whitespace/indent] [4]
ERROR: Source/JavaScriptCore/b3/B3MemoryValue.h:128:  Wrong number of spaces before statement. (expected: 12)  [whitespace/indent] [4]
ERROR: Source/JavaScriptCore/b3/B3Value.h:124:  Missing space before {  [whitespace/braces] [5]
ERROR: Source/JavaScriptCore/b3/B3Value.h:142:  Missing space before {  [whitespace/braces] [5]
ERROR: Source/JavaScriptCore/b3/testb3.cpp:70:  Consider using CHECK_EQ instead of CHECK(a == b)  [readability/check] [2]
ERROR: Source/JavaScriptCore/b3/air/AirLiveness.h:96:  Place brace on its own line for function definitions.  [whitespace/braces] [4]
ERROR: Source/JavaScriptCore/b3/air/AirLiveness.h:106:  Place brace on its own line for function definitions.  [whitespace/braces] [4]
ERROR: Source/JavaScriptCore/b3/air/AirLiveness.h:113:  Place brace on its own line for function definitions.  [whitespace/braces] [4]
ERROR: Source/JavaScriptCore/b3/air/AirSpillEverything.cpp:52:  Place brace on its own line for function definitions.  [whitespace/braces] [4]
ERROR: Source/JavaScriptCore/b3/air/AirSpillEverything.cpp:85:  Place brace on its own line for function definitions.  [whitespace/braces] [4]
ERROR: Source/JavaScriptCore/b3/air/AirAllocateStack.cpp:129:  Place brace on its own line for function definitions.  [whitespace/braces] [4]
ERROR: Source/JavaScriptCore/b3/air/AirHandleCalleeSaves.cpp:46:  Place brace on its own line for function definitions.  [whitespace/braces] [4]
ERROR: Source/WTF/wtf/ScopedLambda.h:45:  Extra space before ( in function call  [whitespace/parens] [4]
ERROR: Source/WTF/wtf/ScopedLambda.h:65:  Extra space before ( in function call  [whitespace/parens] [4]
ERROR: Source/WTF/wtf/ScopedLambda.h:69:  Extra space before ( in function call  [whitespace/parens] [4]
ERROR: Source/JavaScriptCore/b3/B3CheckSpecial.cpp:123:  Place brace on its own line for function definitions.  [whitespace/braces] [4]
ERROR: Source/JavaScriptCore/b3/B3ControlValue.h:109:  Wrong number of spaces before statement. (expected: 12)  [whitespace/indent] [4]
Total errors found: 29 in 135 files


If any of these errors are false positives, please file a bug against check-webkit-style.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1136699</commentid>
    <comment_count>74</comment_count>
      <attachid>264097</attachid>
    <who name="Filip Pizlo">fpizlo</who>
    <bug_when>2015-10-26 16:51:56 -0700</bug_when>
    <thetext>Created attachment 264097
the patch

Lots more test coverage.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1136705</commentid>
    <comment_count>75</comment_count>
    <who name="WebKit Commit Bot">commit-queue</who>
    <bug_when>2015-10-26 16:55:18 -0700</bug_when>
    <thetext>Attachment 264097 did not pass style-queue:


ERROR: Source/JavaScriptCore/b3/air/AirInst.h:66:  Missing space before {  [whitespace/braces] [5]
ERROR: Source/JavaScriptCore/b3/air/AirInst.h:111:  Place brace on its own line for function definitions.  [whitespace/braces] [4]
ERROR: Source/JavaScriptCore/b3/air/AirGenerate.cpp:98:  Place brace on its own line for function definitions.  [whitespace/braces] [4]
ERROR: Source/JavaScriptCore/b3/B3GenericFrequentedBlock.h:44:  Wrong number of spaces before statement. (expected: 12)  [whitespace/indent] [4]
ERROR: Source/JavaScriptCore/b3/B3GenericFrequentedBlock.h:45:  Wrong number of spaces before statement. (expected: 12)  [whitespace/indent] [4]
ERROR: Source/JavaScriptCore/b3/B3SwitchCase.h:32:  Alphabetical sorting problem.  [build/include_order] [4]
ERROR: Source/JavaScriptCore/b3/air/AirRegisterPriority.cpp:48:  Place brace on its own line for function definitions.  [whitespace/braces] [4]
ERROR: Source/JavaScriptCore/b3/air/AirRegisterPriority.cpp:53:  Place brace on its own line for function definitions.  [whitespace/braces] [4]
ERROR: Source/JavaScriptCore/b3/air/AirRegisterPriority.cpp:72:  Place brace on its own line for function definitions.  [whitespace/braces] [4]
ERROR: Source/JavaScriptCore/b3/air/AirRegisterPriority.cpp:77:  Place brace on its own line for function definitions.  [whitespace/braces] [4]
ERROR: Source/JavaScriptCore/b3/B3MemoryValue.h:75:  Wrong number of spaces before statement. (expected: 12)  [whitespace/indent] [4]
ERROR: Source/JavaScriptCore/b3/B3MemoryValue.h:76:  Wrong number of spaces before statement. (expected: 12)  [whitespace/indent] [4]
ERROR: Source/JavaScriptCore/b3/B3MemoryValue.h:127:  Wrong number of spaces before statement. (expected: 12)  [whitespace/indent] [4]
ERROR: Source/JavaScriptCore/b3/B3MemoryValue.h:128:  Wrong number of spaces before statement. (expected: 12)  [whitespace/indent] [4]
ERROR: Source/JavaScriptCore/b3/B3Value.h:124:  Missing space before {  [whitespace/braces] [5]
ERROR: Source/JavaScriptCore/b3/B3Value.h:142:  Missing space before {  [whitespace/braces] [5]
ERROR: Source/JavaScriptCore/b3/testb3.cpp:73:  Consider using CHECK_EQ instead of CHECK(a == b)  [readability/check] [2]
ERROR: Source/JavaScriptCore/b3/testb3.cpp:87:  Consider using CHECK_EQ instead of CHECK(a == b)  [readability/check] [2]
ERROR: Source/JavaScriptCore/b3/air/AirLiveness.h:96:  Place brace on its own line for function definitions.  [whitespace/braces] [4]
ERROR: Source/JavaScriptCore/b3/air/AirLiveness.h:106:  Place brace on its own line for function definitions.  [whitespace/braces] [4]
ERROR: Source/JavaScriptCore/b3/air/AirLiveness.h:113:  Place brace on its own line for function definitions.  [whitespace/braces] [4]
ERROR: Source/JavaScriptCore/b3/air/AirSpillEverything.cpp:52:  Place brace on its own line for function definitions.  [whitespace/braces] [4]
ERROR: Source/JavaScriptCore/b3/air/AirSpillEverything.cpp:85:  Place brace on its own line for function definitions.  [whitespace/braces] [4]
ERROR: Source/JavaScriptCore/b3/air/AirAllocateStack.cpp:140:  Place brace on its own line for function definitions.  [whitespace/braces] [4]
ERROR: Source/JavaScriptCore/b3/air/AirHandleCalleeSaves.cpp:46:  Place brace on its own line for function definitions.  [whitespace/braces] [4]
ERROR: Source/WTF/wtf/ScopedLambda.h:45:  Extra space before ( in function call  [whitespace/parens] [4]
ERROR: Source/WTF/wtf/ScopedLambda.h:65:  Extra space before ( in function call  [whitespace/parens] [4]
ERROR: Source/WTF/wtf/ScopedLambda.h:69:  Extra space before ( in function call  [whitespace/parens] [4]
ERROR: Source/JavaScriptCore/b3/B3CheckSpecial.cpp:123:  Place brace on its own line for function definitions.  [whitespace/braces] [4]
ERROR: Source/JavaScriptCore/b3/B3ControlValue.h:109:  Wrong number of spaces before statement. (expected: 12)  [whitespace/indent] [4]
Total errors found: 30 in 137 files


If any of these errors are false positives, please file a bug against check-webkit-style.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1136715</commentid>
    <comment_count>76</comment_count>
    <who name="Filip Pizlo">fpizlo</who>
    <bug_when>2015-10-26 17:19:37 -0700</bug_when>
    <thetext>This is so cool.  Notice the epic ArgumentReg opcode in action.


testStore(44):
B3 after initial, before lowerToAir:
BB#0: ; frequency = nan
    Int64 @0 = ArgumentReg(%rdi)
    Int32 @1 = Trunc(@0)
    Int64 @2 = Const64(140734534183196)
    Void @3 = Store(@1, @2)
    Int32 @4 = Const32(0)
    Void @5 = Return(@4)
Air after initial, before spillEverything:
BB#0: ; frequency = nan
    Move %rdi, %tmp3, @0
    Move %tmp3, %tmp1, @1
    Move $0x7fff4feae91c, %tmp2, @2
    Move32 %tmp1, (%tmp2), @3
    Move $0, %tmp0, @4
    Move $0, %rax, @5
    Ret @5
Air after spillEverything, before handleCalleeSaves:
BB#0: ; frequency = nan
    Move %rdi, %rax, @0
    Move %rax, (stack0), @0
    Move (stack0), %rcx, @1
    Move %rcx, %rax, @1
    Move %rax, (stack2), @1
    Move $0x7fff4feae91c, %rax, @2
    Move %rax, (stack1), @2
    Move (stack2), %rcx, @3
    Move (stack1), %rdx, @3
    Move32 %rcx, (%rdx), @3
    Move $0, %rax, @4
    Move %rax, (stack3), @4
    Move $0, %rax, @5
    Ret @5
Stack slots:
    stack0: byteSize = 8, offsetFromFP = 0, kind = Anonymous
    stack1: byteSize = 8, offsetFromFP = 0, kind = Anonymous
    stack2: byteSize = 8, offsetFromFP = 0, kind = Anonymous
    stack3: byteSize = 8, offsetFromFP = 0, kind = Anonymous
Air after handleCalleeSaves, before allocateStack:
BB#0: ; frequency = nan
    Move %rdi, %rax, @0
    Move %rax, (stack0), @0
    Move (stack0), %rcx, @1
    Move %rcx, %rax, @1
    Move %rax, (stack2), @1
    Move $0x7fff4feae91c, %rax, @2
    Move %rax, (stack1), @2
    Move (stack2), %rcx, @3
    Move (stack1), %rdx, @3
    Move32 %rcx, (%rdx), @3
    Move $0, %rax, @4
    Move %rax, (stack3), @4
    Move $0, %rax, @5
    Ret @5
Stack slots:
    stack0: byteSize = 8, offsetFromFP = 0, kind = Anonymous
    stack1: byteSize = 8, offsetFromFP = 0, kind = Anonymous
    stack2: byteSize = 8, offsetFromFP = 0, kind = Anonymous
    stack3: byteSize = 8, offsetFromFP = 0, kind = Anonymous
Air after allocateStack, before generation:
BB#0: ; frequency = nan
    Move %rdi, %rax, @0
    Move %rax, -8(%rbp), @0
    Move -8(%rbp), %rcx, @1
    Move %rcx, %rax, @1
    Move %rax, -16(%rbp), @1
    Move $0x7fff4feae91c, %rax, @2
    Move %rax, -8(%rbp), @2
    Move -16(%rbp), %rcx, @3
    Move -8(%rbp), %rdx, @3
    Move32 %rcx, (%rdx), @3
    Move $0, %rax, @4
    Move %rax, -8(%rbp), @4
    Move $0, %rax, @5
    Ret @5
Stack slots:
    stack0: byteSize = 8, offsetFromFP = -8, kind = Anonymous
    stack1: byteSize = 8, offsetFromFP = -8, kind = Anonymous
    stack2: byteSize = 8, offsetFromFP = -16, kind = Anonymous
    stack3: byteSize = 8, offsetFromFP = -8, kind = Anonymous
Frame size: 16
Generated JIT code for testb3:
    Code at [0x564c6d401000, 0x564c6d401040):
      0x564c6d401000: push %rbp
      0x564c6d401001: mov %rsp, %rbp
      0x564c6d401004: add $0xfffffffffffffff0, %rsp
      0x564c6d401008: mov %rdi, %rax
      0x564c6d40100b: mov %rax, -0x8(%rbp)
      0x564c6d40100f: mov -0x8(%rbp), %rcx
      0x564c6d401013: mov %rcx, %rax
      0x564c6d401016: mov %rax, -0x10(%rbp)
      0x564c6d40101a: mov $0x7fff4feae91c, %rax
      0x564c6d401024: mov %rax, -0x8(%rbp)
      0x564c6d401028: mov -0x10(%rbp), %rcx
      0x564c6d40102c: mov -0x8(%rbp), %rdx
      0x564c6d401030: mov %ecx, (%rdx)
      0x564c6d401032: xor %eax, %eax
      0x564c6d401034: mov %rax, -0x8(%rbp)
      0x564c6d401038: xor %eax, %eax
      0x564c6d40103a: mov %rbp, %rsp
      0x564c6d40103d: pop %rbp
      0x564c6d40103e: ret 
    OK!</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1136747</commentid>
    <comment_count>77</comment_count>
    <who name="Benjamin Poulain">benjamin</who>
    <bug_when>2015-10-26 19:08:42 -0700</bug_when>
    <thetext>View in context: https://bugs.webkit.org/attachment.cgi?id=264051&amp;action=review

Some more feedback. Some comments are probably useless, I don&apos;t have the context for everything yet.

&gt; Source/JavaScriptCore/b3/B3ArgumentRegValue.h:36
&gt; +class ArgumentRegValue : public Value {

Missing JS_EXPORT_PRIVATE?

&gt; Source/JavaScriptCore/b3/B3CheckSpecial.cpp:63
&gt; +{

ASSERT opcode is one of the 4 valid ones?

&gt; Source/JavaScriptCore/b3/B3CheckSpecial.cpp:75
&gt; +    hiddenBranch.args.resize(m_numCheckArgs);
&gt; +    for (unsigned i = m_numCheckArgs; i--;)
&gt; +        hiddenBranch.args[i] = inst.args[i + 1];

Maybe
    hiddenBranch.args.reserveInitialCapacity(m_numCheckArgs);
    for (unsigned i = 0; i &lt; m_numCheckArgs; ++i)
        hiddenBranch.args.appendUnchecked(inst.args[i + 1]);
To avoid calling the Arg() constructor for every cell of hiddenBranch.args.resize().

&gt; Source/JavaScriptCore/b3/B3CheckSpecial.h:34
&gt; +namespace JSC { namespace B3 {

Should this be in the Air namespace?

&gt; Source/JavaScriptCore/b3/B3CheckSpecial.h:43
&gt; +// Note that for CheckAdd, CheckSub, and CheckMul we expect that the B3 arguments are the reverse
&gt; +// of the Air arguments (Add(a, b) =&gt; Add32 b, a). Except:

This is a weird convention.
Aren&apos;t you talking specifically about x86 Integer lowering?

&gt; Source/JavaScriptCore/b3/B3CheckSpecial.h:53
&gt; +    Air::Inst hiddenBranch(const Air::Inst&amp;) const;

Looks like it could be private.

&gt; Source/JavaScriptCore/b3/B3CheckValue.h:36
&gt; +class CheckValue : public Value {

Aren&apos;t you missing the JS_EXPORT_PRIVATE?

&gt; Source/JavaScriptCore/b3/B3ComparisonMatcher.patterns:24
&gt; +matcher ComparisonMatcher

I don&apos;t see this Matcher being used anywhere. Not sure what&apos;s your plan for it.

&gt; Source/JavaScriptCore/b3/B3Const64Value.h:35
&gt; +class Const64Value : public Value {

JS_EXPORT_PRIVATE?

&gt; Source/JavaScriptCore/b3/B3Stackmap.h:43
&gt; +class Stackmap {
&gt; +public:

If I am not mistaken, this is never copied at the moment. That&apos;s good since it contains a Vector.

It may be worth adding WTF_MAKE_NONCOPYABLE() to safe-proof future uses.

&gt; Source/JavaScriptCore/b3/B3Stackmap.h:61
&gt; +    Stackmap()

Could be out of line.

&gt; Source/JavaScriptCore/b3/B3Stackmap.h:64
&gt; +

Missing an out of line destructor on this one.

&gt; Source/JavaScriptCore/b3/B3Stackmap.h:81
&gt; +    // Set some opaque data to identify this stackmap. This is useful because a Stackmap-using Value
&gt; +    // can be duplicated, and each duplicate may end up having different register allocation. This
&gt; +    // allows all of those duplicates to be able to refer back to whatever high-level data structures
&gt; +    // we were using to create the value.
&gt; +    void setOpaque(void* parameter)
&gt; +    {
&gt; +        m_opaque = parameter;
&gt; +    }
&gt; +    void* opaque() const { return m_opaque; }
&gt; +
&gt; +    // Convenience helpers when using indices instead of pointers.
&gt; +    void setOpaqueIndex(size_t index)
&gt; +    {
&gt; +        setOpaque(bitwise_cast&lt;void*&gt;(index));
&gt; +    }
&gt; +    size_t opaqueIndex() const { return bitwise_cast&lt;size_t&gt;(opaque()); }
&gt; +

The opaque data looks unused.
Let&apos;s remove it. It&apos;s easy to add back when it will be needed.

&gt; Source/JavaScriptCore/b3/B3Stackmap.h:90
&gt; +        if (index + 1 &lt; m_reps.size())

Wrong sign?
    index + 1 &gt; m_reps.size()
or
    index &gt;= m_reps.size()

&gt; Source/JavaScriptCore/b3/B3Stackmap.h:122
&gt; +    RefPtr&lt;Generator&gt; m_generator;

I assume that&apos;s the Special&apos;s generator?
I find it a bit weird that it is on the StackMap. It may make more sense as I read more of the context.

&gt; Source/JavaScriptCore/b3/B3ValueRep.h:154
&gt; +    int64_t m_value;

I think this would look cleaner as an Union of Reg and intptr_t.
union {
    Reg register,
    intptr_t offsetFromFP,
    intptr_t offsetFromSP,
} m_value;

&gt; Source/JavaScriptCore/b3/air/AirSpecial.h:96
&gt; +    unsigned m_index;

I don&apos;t see this being used anywhere.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1136762</commentid>
    <comment_count>78</comment_count>
    <who name="Filip Pizlo">fpizlo</who>
    <bug_when>2015-10-26 21:58:38 -0700</bug_when>
    <thetext>(In reply to comment #77)
&gt; View in context:
&gt; https://bugs.webkit.org/attachment.cgi?id=264051&amp;action=review
&gt; 
&gt; Some more feedback. Some comments are probably useless, I don&apos;t have the
&gt; context for everything yet.
&gt; 
&gt; &gt; Source/JavaScriptCore/b3/B3ArgumentRegValue.h:36
&gt; &gt; +class ArgumentRegValue : public Value {
&gt; 
&gt; Missing JS_EXPORT_PRIVATE?

Yeah, I&apos;ll make sure I add it. I may have added it in the last version. 

&gt; 
&gt; &gt; Source/JavaScriptCore/b3/B3CheckSpecial.cpp:63
&gt; &gt; +{
&gt; 
&gt; ASSERT opcode is one of the 4 valid ones?

Sure!

&gt; 
&gt; &gt; Source/JavaScriptCore/b3/B3CheckSpecial.cpp:75
&gt; &gt; +    hiddenBranch.args.resize(m_numCheckArgs);
&gt; &gt; +    for (unsigned i = m_numCheckArgs; i--;)
&gt; &gt; +        hiddenBranch.args[i] = inst.args[i + 1];
&gt; 
&gt; Maybe
&gt;     hiddenBranch.args.reserveInitialCapacity(m_numCheckArgs);
&gt;     for (unsigned i = 0; i &lt; m_numCheckArgs; ++i)
&gt;         hiddenBranch.args.appendUnchecked(inst.args[i + 1]);
&gt; To avoid calling the Arg() constructor for every cell of
&gt; hiddenBranch.args.resize().

That&apos;s interesting. I can do that. 

&gt; 
&gt; &gt; Source/JavaScriptCore/b3/B3CheckSpecial.h:34
&gt; &gt; +namespace JSC { namespace B3 {
&gt; 
&gt; Should this be in the Air namespace?

Ugh this code is dead for now so it&apos;s hard to see the context. It was important for me to write it because I needed to see that it made sense, and in fact I changed how Air worked as a result of this exercise. I think it&apos;s better to land this dead code though, so that our expectations from the compiler for the purpose of patchpoints are documented in a compiler-enforced manner. 

That said, the way this will work is that this is sort of private to B3LowerToAir.cpp. I&apos;m usually erring on the side of using the B3 namespace for code that knows about both Air and B3. 

&gt; 
&gt; &gt; Source/JavaScriptCore/b3/B3CheckSpecial.h:43
&gt; &gt; +// Note that for CheckAdd, CheckSub, and CheckMul we expect that the B3 arguments are the reverse
&gt; &gt; +// of the Air arguments (Add(a, b) =&gt; Add32 b, a). Except:
&gt; 
&gt; This is a weird convention.
&gt; Aren&apos;t you talking specifically about x86 Integer lowering?

This is the convention that our MacroAssembler uses, and Air just follows that. 

&gt; 
&gt; &gt; Source/JavaScriptCore/b3/B3CheckSpecial.h:53
&gt; &gt; +    Air::Inst hiddenBranch(const Air::Inst&amp;) const;
&gt; 
&gt; Looks like it could be private.

Sure!

&gt; 
&gt; &gt; Source/JavaScriptCore/b3/B3CheckValue.h:36
&gt; &gt; +class CheckValue : public Value {
&gt; 
&gt; Aren&apos;t you missing the JS_EXPORT_PRIVATE?

Yes. 

&gt; 
&gt; &gt; Source/JavaScriptCore/b3/B3ComparisonMatcher.patterns:24
&gt; &gt; +matcher ComparisonMatcher
&gt; 
&gt; I don&apos;t see this Matcher being used anywhere. Not sure what&apos;s your plan for
&gt; it.

I will remove it. 

&gt; 
&gt; &gt; Source/JavaScriptCore/b3/B3Const64Value.h:35
&gt; &gt; +class Const64Value : public Value {
&gt; 
&gt; JS_EXPORT_PRIVATE?

Yes. 

&gt; 
&gt; &gt; Source/JavaScriptCore/b3/B3Stackmap.h:43
&gt; &gt; +class Stackmap {
&gt; &gt; +public:
&gt; 
&gt; If I am not mistaken, this is never copied at the moment. That&apos;s good since
&gt; it contains a Vector.
&gt; 
&gt; It may be worth adding WTF_MAKE_NONCOPYABLE() to safe-proof future uses.

It&apos;s meant to be copied. :-)

One of the principles that a good compiler IR should follow is that it should make it possible to easily duplicate code. This is necessary for things like loop peeling, loop unrolling, tail duplication, jump threading, and path specialization. All of those also happen to be classic optimizations for high level languages. 

All B3::Value classes are already designed to make copying easy. The code for cloning a Value isn&apos;t there yet, and we may never need those optimizations. But the duplication capability is something you sort of need to bake into the IR from the start, for example by making sure that any data setructure owned by a Value is copyable. 

&gt; 
&gt; &gt; Source/JavaScriptCore/b3/B3Stackmap.h:61
&gt; &gt; +    Stackmap()
&gt; 
&gt; Could be out of line.

Sure!

&gt; 
&gt; &gt; Source/JavaScriptCore/b3/B3Stackmap.h:64
&gt; &gt; +
&gt; 
&gt; Missing an out of line destructor on this one.

Sure. 

&gt; 
&gt; &gt; Source/JavaScriptCore/b3/B3Stackmap.h:81
&gt; &gt; +    // Set some opaque data to identify this stackmap. This is useful because a Stackmap-using Value
&gt; &gt; +    // can be duplicated, and each duplicate may end up having different register allocation. This
&gt; &gt; +    // allows all of those duplicates to be able to refer back to whatever high-level data structures
&gt; &gt; +    // we were using to create the value.
&gt; &gt; +    void setOpaque(void* parameter)
&gt; &gt; +    {
&gt; &gt; +        m_opaque = parameter;
&gt; &gt; +    }
&gt; &gt; +    void* opaque() const { return m_opaque; }
&gt; &gt; +
&gt; &gt; +    // Convenience helpers when using indices instead of pointers.
&gt; &gt; +    void setOpaqueIndex(size_t index)
&gt; &gt; +    {
&gt; &gt; +        setOpaque(bitwise_cast&lt;void*&gt;(index));
&gt; &gt; +    }
&gt; &gt; +    size_t opaqueIndex() const { return bitwise_cast&lt;size_t&gt;(opaque()); }
&gt; &gt; +
&gt; 
&gt; The opaque data looks unused.
&gt; Let&apos;s remove it. It&apos;s easy to add back when it will be needed.

Actually it&apos;s completely redundant since the client could encapsulate it using the m_generator b

&gt; 
&gt; &gt; Source/JavaScriptCore/b3/B3Stackmap.h:90
&gt; &gt; +        if (index + 1 &lt; m_reps.size())
&gt; 
&gt; Wrong sign?
&gt;     index + 1 &gt; m_reps.size()
&gt; or
&gt;     index &gt;= m_reps.size()

Oops. 

&gt; 
&gt; &gt; Source/JavaScriptCore/b3/B3Stackmap.h:122
&gt; &gt; +    RefPtr&lt;Generator&gt; m_generator;
&gt; 
&gt; I assume that&apos;s the Special&apos;s generator?
&gt; I find it a bit weird that it is on the StackMap. It may make more sense as
&gt; I read more of the context.

Where else would it be?  The idea is that the client that creates a patchpoint or CheckValue needs to supply a generator. 

&gt; 
&gt; &gt; Source/JavaScriptCore/b3/B3ValueRep.h:154
&gt; &gt; +    int64_t m_value;
&gt; 
&gt; I think this would look cleaner as an Union of Reg and intptr_t.
&gt; union {
&gt;     Reg register,
&gt;     intptr_t offsetFromFP,
&gt;     intptr_t offsetFromSP,
&gt; } m_value;

But I can&apos;t have Reg in the union!

&gt; 
&gt; &gt; Source/JavaScriptCore/b3/air/AirSpecial.h:96
&gt; &gt; +    unsigned m_index;
&gt; 
&gt; I don&apos;t see this being used anywhere.

Dumping.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1136763</commentid>
    <comment_count>79</comment_count>
    <who name="Filip Pizlo">fpizlo</who>
    <bug_when>2015-10-26 22:01:51 -0700</bug_when>
    <thetext>
&gt; &gt; 
&gt; &gt; &gt; Source/JavaScriptCore/b3/B3CheckSpecial.cpp:63
&gt; &gt; &gt; +{
&gt; &gt; 
&gt; &gt; ASSERT opcode is one of the 4 valid ones?
&gt; 
&gt; Sure!

Actually, no.  This could be any branching opcode.  The B3::Opcode is one of the 4 valid ones, but the Air::Opcode could be any branch.  I guess I can add an ASSERT that it&apos;s a branch.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1136774</commentid>
    <comment_count>80</comment_count>
      <attachid>264121</attachid>
    <who name="Filip Pizlo">fpizlo</who>
    <bug_when>2015-10-26 23:45:51 -0700</bug_when>
    <thetext>Created attachment 264121
the patch

More tests, more little fixes.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1136776</commentid>
    <comment_count>81</comment_count>
    <who name="WebKit Commit Bot">commit-queue</who>
    <bug_when>2015-10-26 23:48:19 -0700</bug_when>
    <thetext>Attachment 264121 did not pass style-queue:


ERROR: Source/JavaScriptCore/b3/air/AirInst.h:66:  Missing space before {  [whitespace/braces] [5]
ERROR: Source/JavaScriptCore/b3/air/AirInst.h:111:  Place brace on its own line for function definitions.  [whitespace/braces] [4]
ERROR: Source/JavaScriptCore/b3/air/AirGenerate.cpp:98:  Place brace on its own line for function definitions.  [whitespace/braces] [4]
ERROR: Source/JavaScriptCore/b3/B3GenericFrequentedBlock.h:44:  Wrong number of spaces before statement. (expected: 12)  [whitespace/indent] [4]
ERROR: Source/JavaScriptCore/b3/B3GenericFrequentedBlock.h:45:  Wrong number of spaces before statement. (expected: 12)  [whitespace/indent] [4]
ERROR: Source/JavaScriptCore/b3/B3SwitchCase.h:32:  Alphabetical sorting problem.  [build/include_order] [4]
ERROR: Source/JavaScriptCore/b3/air/AirRegisterPriority.cpp:48:  Place brace on its own line for function definitions.  [whitespace/braces] [4]
ERROR: Source/JavaScriptCore/b3/air/AirRegisterPriority.cpp:53:  Place brace on its own line for function definitions.  [whitespace/braces] [4]
ERROR: Source/JavaScriptCore/b3/air/AirRegisterPriority.cpp:72:  Place brace on its own line for function definitions.  [whitespace/braces] [4]
ERROR: Source/JavaScriptCore/b3/air/AirRegisterPriority.cpp:77:  Place brace on its own line for function definitions.  [whitespace/braces] [4]
ERROR: Source/JavaScriptCore/b3/B3MemoryValue.h:75:  Wrong number of spaces before statement. (expected: 12)  [whitespace/indent] [4]
ERROR: Source/JavaScriptCore/b3/B3MemoryValue.h:76:  Wrong number of spaces before statement. (expected: 12)  [whitespace/indent] [4]
ERROR: Source/JavaScriptCore/b3/B3MemoryValue.h:127:  Wrong number of spaces before statement. (expected: 12)  [whitespace/indent] [4]
ERROR: Source/JavaScriptCore/b3/B3MemoryValue.h:128:  Wrong number of spaces before statement. (expected: 12)  [whitespace/indent] [4]
ERROR: Source/JavaScriptCore/b3/B3Value.h:124:  Missing space before {  [whitespace/braces] [5]
ERROR: Source/JavaScriptCore/b3/B3Value.h:142:  Missing space before {  [whitespace/braces] [5]
ERROR: Source/JavaScriptCore/b3/testb3.cpp:73:  Consider using CHECK_EQ instead of CHECK(a == b)  [readability/check] [2]
ERROR: Source/JavaScriptCore/b3/testb3.cpp:87:  Consider using CHECK_EQ instead of CHECK(a == b)  [readability/check] [2]
ERROR: Source/JavaScriptCore/b3/air/AirLiveness.h:96:  Place brace on its own line for function definitions.  [whitespace/braces] [4]
ERROR: Source/JavaScriptCore/b3/air/AirLiveness.h:106:  Place brace on its own line for function definitions.  [whitespace/braces] [4]
ERROR: Source/JavaScriptCore/b3/air/AirLiveness.h:113:  Place brace on its own line for function definitions.  [whitespace/braces] [4]
ERROR: Source/JavaScriptCore/b3/air/AirSpillEverything.cpp:52:  Place brace on its own line for function definitions.  [whitespace/braces] [4]
ERROR: Source/JavaScriptCore/b3/air/AirSpillEverything.cpp:62:  Place brace on its own line for function definitions.  [whitespace/braces] [4]
ERROR: Source/JavaScriptCore/b3/air/AirSpillEverything.cpp:95:  Place brace on its own line for function definitions.  [whitespace/braces] [4]
ERROR: Source/JavaScriptCore/b3/air/AirAllocateStack.cpp:143:  Place brace on its own line for function definitions.  [whitespace/braces] [4]
ERROR: Source/JavaScriptCore/b3/air/AirAllocateStack.cpp:158:  Place brace on its own line for function definitions.  [whitespace/braces] [4]
ERROR: Source/JavaScriptCore/b3/air/AirHandleCalleeSaves.cpp:46:  Place brace on its own line for function definitions.  [whitespace/braces] [4]
ERROR: Source/WTF/wtf/ScopedLambda.h:45:  Extra space before ( in function call  [whitespace/parens] [4]
ERROR: Source/WTF/wtf/ScopedLambda.h:65:  Extra space before ( in function call  [whitespace/parens] [4]
ERROR: Source/WTF/wtf/ScopedLambda.h:69:  Extra space before ( in function call  [whitespace/parens] [4]
ERROR: Source/JavaScriptCore/b3/B3CheckSpecial.cpp:124:  Place brace on its own line for function definitions.  [whitespace/braces] [4]
ERROR: Source/JavaScriptCore/b3/B3ControlValue.h:109:  Wrong number of spaces before statement. (expected: 12)  [whitespace/indent] [4]
Total errors found: 32 in 136 files


If any of these errors are false positives, please file a bug against check-webkit-style.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1136778</commentid>
    <comment_count>82</comment_count>
      <attachid>264122</attachid>
    <who name="Filip Pizlo">fpizlo</who>
    <bug_when>2015-10-27 00:01:12 -0700</bug_when>
    <thetext>Created attachment 264122
the patch

With build fixes.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1136781</commentid>
    <comment_count>83</comment_count>
    <who name="WebKit Commit Bot">commit-queue</who>
    <bug_when>2015-10-27 00:05:07 -0700</bug_when>
    <thetext>Attachment 264122 did not pass style-queue:


ERROR: Source/JavaScriptCore/b3/air/AirInst.h:66:  Missing space before {  [whitespace/braces] [5]
ERROR: Source/JavaScriptCore/b3/air/AirInst.h:111:  Place brace on its own line for function definitions.  [whitespace/braces] [4]
ERROR: Source/JavaScriptCore/b3/air/AirGenerate.cpp:98:  Place brace on its own line for function definitions.  [whitespace/braces] [4]
ERROR: Source/JavaScriptCore/b3/B3GenericFrequentedBlock.h:44:  Wrong number of spaces before statement. (expected: 12)  [whitespace/indent] [4]
ERROR: Source/JavaScriptCore/b3/B3GenericFrequentedBlock.h:45:  Wrong number of spaces before statement. (expected: 12)  [whitespace/indent] [4]
ERROR: Source/JavaScriptCore/b3/B3SwitchCase.h:32:  Alphabetical sorting problem.  [build/include_order] [4]
ERROR: Source/JavaScriptCore/b3/air/AirRegisterPriority.cpp:48:  Place brace on its own line for function definitions.  [whitespace/braces] [4]
ERROR: Source/JavaScriptCore/b3/air/AirRegisterPriority.cpp:53:  Place brace on its own line for function definitions.  [whitespace/braces] [4]
ERROR: Source/JavaScriptCore/b3/air/AirRegisterPriority.cpp:72:  Place brace on its own line for function definitions.  [whitespace/braces] [4]
ERROR: Source/JavaScriptCore/b3/air/AirRegisterPriority.cpp:77:  Place brace on its own line for function definitions.  [whitespace/braces] [4]
ERROR: Source/JavaScriptCore/b3/B3MemoryValue.h:75:  Wrong number of spaces before statement. (expected: 12)  [whitespace/indent] [4]
ERROR: Source/JavaScriptCore/b3/B3MemoryValue.h:76:  Wrong number of spaces before statement. (expected: 12)  [whitespace/indent] [4]
ERROR: Source/JavaScriptCore/b3/B3MemoryValue.h:127:  Wrong number of spaces before statement. (expected: 12)  [whitespace/indent] [4]
ERROR: Source/JavaScriptCore/b3/B3MemoryValue.h:128:  Wrong number of spaces before statement. (expected: 12)  [whitespace/indent] [4]
ERROR: Source/JavaScriptCore/b3/B3Value.h:124:  Missing space before {  [whitespace/braces] [5]
ERROR: Source/JavaScriptCore/b3/B3Value.h:142:  Missing space before {  [whitespace/braces] [5]
ERROR: Source/JavaScriptCore/b3/testb3.cpp:73:  Consider using CHECK_EQ instead of CHECK(a == b)  [readability/check] [2]
ERROR: Source/JavaScriptCore/b3/testb3.cpp:87:  Consider using CHECK_EQ instead of CHECK(a == b)  [readability/check] [2]
ERROR: Source/JavaScriptCore/b3/air/AirLiveness.h:96:  Place brace on its own line for function definitions.  [whitespace/braces] [4]
ERROR: Source/JavaScriptCore/b3/air/AirLiveness.h:106:  Place brace on its own line for function definitions.  [whitespace/braces] [4]
ERROR: Source/JavaScriptCore/b3/air/AirLiveness.h:113:  Place brace on its own line for function definitions.  [whitespace/braces] [4]
ERROR: Source/JavaScriptCore/b3/air/AirSpillEverything.cpp:52:  Place brace on its own line for function definitions.  [whitespace/braces] [4]
ERROR: Source/JavaScriptCore/b3/air/AirSpillEverything.cpp:62:  Place brace on its own line for function definitions.  [whitespace/braces] [4]
ERROR: Source/JavaScriptCore/b3/air/AirSpillEverything.cpp:95:  Place brace on its own line for function definitions.  [whitespace/braces] [4]
ERROR: Source/JavaScriptCore/b3/air/AirAllocateStack.cpp:143:  Place brace on its own line for function definitions.  [whitespace/braces] [4]
ERROR: Source/JavaScriptCore/b3/air/AirAllocateStack.cpp:158:  Place brace on its own line for function definitions.  [whitespace/braces] [4]
ERROR: Source/JavaScriptCore/b3/air/AirHandleCalleeSaves.cpp:46:  Place brace on its own line for function definitions.  [whitespace/braces] [4]
ERROR: Source/WTF/wtf/ScopedLambda.h:45:  Extra space before ( in function call  [whitespace/parens] [4]
ERROR: Source/WTF/wtf/ScopedLambda.h:65:  Extra space before ( in function call  [whitespace/parens] [4]
ERROR: Source/WTF/wtf/ScopedLambda.h:69:  Extra space before ( in function call  [whitespace/parens] [4]
ERROR: Source/JavaScriptCore/b3/B3CheckSpecial.cpp:124:  Place brace on its own line for function definitions.  [whitespace/braces] [4]
ERROR: Source/JavaScriptCore/b3/B3ControlValue.h:109:  Wrong number of spaces before statement. (expected: 12)  [whitespace/indent] [4]
Total errors found: 32 in 136 files


If any of these errors are false positives, please file a bug against check-webkit-style.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1136854</commentid>
    <comment_count>84</comment_count>
    <who name="Benjamin Poulain">benjamin</who>
    <bug_when>2015-10-27 10:56:55 -0700</bug_when>
    <thetext>(In reply to comment #78)
&gt; &gt; &gt; Source/JavaScriptCore/b3/B3Stackmap.h:122
&gt; &gt; &gt; +    RefPtr&lt;Generator&gt; m_generator;
&gt; &gt; 
&gt; &gt; I assume that&apos;s the Special&apos;s generator?
&gt; &gt; I find it a bit weird that it is on the StackMap. It may make more sense as
&gt; &gt; I read more of the context.
&gt; 
&gt; Where else would it be?  The idea is that the client that creates a
&gt; patchpoint or CheckValue needs to supply a generator. 

I was expecting it on the value.
I&apos;ll need some more reading to have a informed opinion. My understanding of the Specials is still very high level.

&gt; &gt; &gt; Source/JavaScriptCore/b3/B3ValueRep.h:154
&gt; &gt; &gt; +    int64_t m_value;
&gt; &gt; 
&gt; &gt; I think this would look cleaner as an Union of Reg and intptr_t.
&gt; &gt; union {
&gt; &gt;     Reg register,
&gt; &gt;     intptr_t offsetFromFP,
&gt; &gt;     intptr_t offsetFromSP,
&gt; &gt; } m_value;
&gt; 
&gt; But I can&apos;t have Reg in the union!

You can with C++11. It is used a bit in WebCore. You just need to be explicit about construction/destruction.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1136861</commentid>
    <comment_count>85</comment_count>
    <who name="Filip Pizlo">fpizlo</who>
    <bug_when>2015-10-27 11:13:16 -0700</bug_when>
    <thetext>(In reply to comment #84)
&gt; (In reply to comment #78)
&gt; &gt; &gt; &gt; Source/JavaScriptCore/b3/B3Stackmap.h:122
&gt; &gt; &gt; &gt; +    RefPtr&lt;Generator&gt; m_generator;
&gt; &gt; &gt; 
&gt; &gt; &gt; I assume that&apos;s the Special&apos;s generator?
&gt; &gt; &gt; I find it a bit weird that it is on the StackMap. It may make more sense as
&gt; &gt; &gt; I read more of the context.
&gt; &gt; 
&gt; &gt; Where else would it be?  The idea is that the client that creates a
&gt; &gt; patchpoint or CheckValue needs to supply a generator. 
&gt; 
&gt; I was expecting it on the value.
&gt; I&apos;ll need some more reading to have a informed opinion. My understanding of
&gt; the Specials is still very high level.

In B3, we have either CheckValue or PatchpointValue. Instead of subclassing from StackmapValue, I have both of them have a Stackmap field inside them. You can think of Stackmap as &quot;those things that are common between CheckValue and PatchpointValue&quot;. It&apos;s not clear that CheckValue and PatchpointValue should be separate classes, maybe we could fold Stackmap, CheckValue, and PatchpointValue into just StackmapValue. At some point I had things in PatchpointValue that I didn&apos;t have in StackmapValue, and after I removed those extra things, I still kept the separation because I was more interested in just completing the patch.

In Air, the patchpoints and checks get lowered to a Patch opcode with an Air::Special as its first operand. Air doesn&apos;t know anything about patchpoints, stackmaps, or checks. It only knows that a Patch instruction&apos;s behavior is determined by the virtual methods in Air::Special. When B3 lowers patchpoints, checks, etc to Air, it uses its own subclasses of Air::Special.

&gt; 
&gt; &gt; &gt; &gt; Source/JavaScriptCore/b3/B3ValueRep.h:154
&gt; &gt; &gt; &gt; +    int64_t m_value;
&gt; &gt; &gt; 
&gt; &gt; &gt; I think this would look cleaner as an Union of Reg and intptr_t.
&gt; &gt; &gt; union {
&gt; &gt; &gt;     Reg register,
&gt; &gt; &gt;     intptr_t offsetFromFP,
&gt; &gt; &gt;     intptr_t offsetFromSP,
&gt; &gt; &gt; } m_value;
&gt; &gt; 
&gt; &gt; But I can&apos;t have Reg in the union!
&gt; 
&gt; You can with C++11. It is used a bit in WebCore. You just need to be
&gt; explicit about construction/destruction.

Interesting, I&apos;ll try it!</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1136871</commentid>
    <comment_count>86</comment_count>
      <attachid>264146</attachid>
    <who name="Filip Pizlo">fpizlo</who>
    <bug_when>2015-10-27 11:41:26 -0700</bug_when>
    <thetext>Created attachment 264146
the patch

Added another immediate form handler in appendBinOp.  Switched B3::ValueRep to use a union.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1136872</commentid>
    <comment_count>87</comment_count>
    <who name="WebKit Commit Bot">commit-queue</who>
    <bug_when>2015-10-27 11:44:14 -0700</bug_when>
    <thetext>Attachment 264146 did not pass style-queue:


ERROR: Source/JavaScriptCore/b3/air/AirInst.h:66:  Missing space before {  [whitespace/braces] [5]
ERROR: Source/JavaScriptCore/b3/air/AirInst.h:111:  Place brace on its own line for function definitions.  [whitespace/braces] [4]
ERROR: Source/JavaScriptCore/b3/air/AirGenerate.cpp:98:  Place brace on its own line for function definitions.  [whitespace/braces] [4]
ERROR: Source/JavaScriptCore/b3/B3GenericFrequentedBlock.h:44:  Wrong number of spaces before statement. (expected: 12)  [whitespace/indent] [4]
ERROR: Source/JavaScriptCore/b3/B3GenericFrequentedBlock.h:45:  Wrong number of spaces before statement. (expected: 12)  [whitespace/indent] [4]
ERROR: Source/JavaScriptCore/b3/B3SwitchCase.h:32:  Alphabetical sorting problem.  [build/include_order] [4]
ERROR: Source/JavaScriptCore/b3/air/AirRegisterPriority.cpp:48:  Place brace on its own line for function definitions.  [whitespace/braces] [4]
ERROR: Source/JavaScriptCore/b3/air/AirRegisterPriority.cpp:53:  Place brace on its own line for function definitions.  [whitespace/braces] [4]
ERROR: Source/JavaScriptCore/b3/air/AirRegisterPriority.cpp:72:  Place brace on its own line for function definitions.  [whitespace/braces] [4]
ERROR: Source/JavaScriptCore/b3/air/AirRegisterPriority.cpp:77:  Place brace on its own line for function definitions.  [whitespace/braces] [4]
ERROR: Source/JavaScriptCore/b3/B3MemoryValue.h:75:  Wrong number of spaces before statement. (expected: 12)  [whitespace/indent] [4]
ERROR: Source/JavaScriptCore/b3/B3MemoryValue.h:76:  Wrong number of spaces before statement. (expected: 12)  [whitespace/indent] [4]
ERROR: Source/JavaScriptCore/b3/B3MemoryValue.h:127:  Wrong number of spaces before statement. (expected: 12)  [whitespace/indent] [4]
ERROR: Source/JavaScriptCore/b3/B3MemoryValue.h:128:  Wrong number of spaces before statement. (expected: 12)  [whitespace/indent] [4]
ERROR: Source/JavaScriptCore/b3/B3Value.h:124:  Missing space before {  [whitespace/braces] [5]
ERROR: Source/JavaScriptCore/b3/B3Value.h:142:  Missing space before {  [whitespace/braces] [5]
ERROR: Source/JavaScriptCore/b3/testb3.cpp:73:  Consider using CHECK_EQ instead of CHECK(a == b)  [readability/check] [2]
ERROR: Source/JavaScriptCore/b3/testb3.cpp:87:  Consider using CHECK_EQ instead of CHECK(a == b)  [readability/check] [2]
ERROR: Source/JavaScriptCore/b3/air/AirLiveness.h:96:  Place brace on its own line for function definitions.  [whitespace/braces] [4]
ERROR: Source/JavaScriptCore/b3/air/AirLiveness.h:106:  Place brace on its own line for function definitions.  [whitespace/braces] [4]
ERROR: Source/JavaScriptCore/b3/air/AirLiveness.h:113:  Place brace on its own line for function definitions.  [whitespace/braces] [4]
ERROR: Source/JavaScriptCore/b3/air/AirSpillEverything.cpp:52:  Place brace on its own line for function definitions.  [whitespace/braces] [4]
ERROR: Source/JavaScriptCore/b3/air/AirSpillEverything.cpp:62:  Place brace on its own line for function definitions.  [whitespace/braces] [4]
ERROR: Source/JavaScriptCore/b3/air/AirSpillEverything.cpp:95:  Place brace on its own line for function definitions.  [whitespace/braces] [4]
ERROR: Source/JavaScriptCore/b3/air/AirAllocateStack.cpp:143:  Place brace on its own line for function definitions.  [whitespace/braces] [4]
ERROR: Source/JavaScriptCore/b3/air/AirAllocateStack.cpp:158:  Place brace on its own line for function definitions.  [whitespace/braces] [4]
ERROR: Source/JavaScriptCore/b3/air/AirHandleCalleeSaves.cpp:46:  Place brace on its own line for function definitions.  [whitespace/braces] [4]
ERROR: Source/WTF/wtf/ScopedLambda.h:45:  Extra space before ( in function call  [whitespace/parens] [4]
ERROR: Source/WTF/wtf/ScopedLambda.h:65:  Extra space before ( in function call  [whitespace/parens] [4]
ERROR: Source/WTF/wtf/ScopedLambda.h:69:  Extra space before ( in function call  [whitespace/parens] [4]
ERROR: Source/JavaScriptCore/b3/B3CheckSpecial.cpp:124:  Place brace on its own line for function definitions.  [whitespace/braces] [4]
ERROR: Source/JavaScriptCore/b3/B3ControlValue.h:109:  Wrong number of spaces before statement. (expected: 12)  [whitespace/indent] [4]
Total errors found: 32 in 136 files


If any of these errors are false positives, please file a bug against check-webkit-style.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1136946</commentid>
    <comment_count>88</comment_count>
    <who name="Filip Pizlo">fpizlo</who>
    <bug_when>2015-10-27 14:59:57 -0700</bug_when>
    <thetext>(In reply to comment #85)
&gt; (In reply to comment #84)
&gt; &gt; (In reply to comment #78)
&gt; &gt; &gt; &gt; &gt; Source/JavaScriptCore/b3/B3Stackmap.h:122
&gt; &gt; &gt; &gt; &gt; +    RefPtr&lt;Generator&gt; m_generator;
&gt; &gt; &gt; &gt; 
&gt; &gt; &gt; &gt; I assume that&apos;s the Special&apos;s generator?
&gt; &gt; &gt; &gt; I find it a bit weird that it is on the StackMap. It may make more sense as
&gt; &gt; &gt; &gt; I read more of the context.
&gt; &gt; &gt; 
&gt; &gt; &gt; Where else would it be?  The idea is that the client that creates a
&gt; &gt; &gt; patchpoint or CheckValue needs to supply a generator. 
&gt; &gt; 
&gt; &gt; I was expecting it on the value.
&gt; &gt; I&apos;ll need some more reading to have a informed opinion. My understanding of
&gt; &gt; the Specials is still very high level.
&gt; 
&gt; In B3, we have either CheckValue or PatchpointValue. Instead of subclassing
&gt; from StackmapValue, I have both of them have a Stackmap field inside them.
&gt; You can think of Stackmap as &quot;those things that are common between
&gt; CheckValue and PatchpointValue&quot;. It&apos;s not clear that CheckValue and
&gt; PatchpointValue should be separate classes, maybe we could fold Stackmap,
&gt; CheckValue, and PatchpointValue into just StackmapValue. At some point I had
&gt; things in PatchpointValue that I didn&apos;t have in StackmapValue, and after I
&gt; removed those extra things, I still kept the separation because I was more
&gt; interested in just completing the patch.

Oh, I remember why I wanted PatchpointValue to be separate: patchpoints will require effectfulness annotations, while Check/CheckAdd/CheckMul/CheckSub are always effect-free.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1137016</commentid>
    <comment_count>89</comment_count>
      <attachid>264146</attachid>
    <who name="Benjamin Poulain">benjamin</who>
    <bug_when>2015-10-27 17:53:14 -0700</bug_when>
    <thetext>Comment on attachment 264146
the patch

View in context: https://bugs.webkit.org/attachment.cgi?id=264146&amp;action=review

&gt; Source/JavaScriptCore/b3/B3GenericFrequentedBlock.h:43
&gt; +    explicit GenericFrequentedBlock(
&gt; +        BasicBlock* block = nullptr, FrequencyClass frequency = FrequencyClass::Normal)

Could be on one line.

&gt; Source/JavaScriptCore/b3/B3GenericFrequentedBlock.h:58
&gt; +    bool operator==(const GenericFrequentedBlock&amp; other) const
&gt; +    {
&gt; +        return m_block == other.m_block
&gt; +            &amp;&amp; m_frequency == other.m_frequency;
&gt; +    }
&gt; +
&gt; +    bool operator!=(const GenericFrequentedBlock&amp; other) const
&gt; +    {
&gt; +        return !(*this == other);
&gt; +    }

I don&apos;t think you need that. Clang does it for you.

&gt; Source/JavaScriptCore/b3/B3LowerToAir.cpp:68
&gt; +        for (B3::BasicBlock* block : procedure)

The next loop goes over the block in pre-order.

Maybe it would be better to get the block list in pre-order, then allocate the Air block in that order. That way blocks used together are more likely to be allocated together.

&gt; Source/JavaScriptCore/b3/B3LowerToAir.cpp:73
&gt; +        for (B3::BasicBlock* block : procedure.blocksInPreOrder()) {

It&apos;s beautiful how simple this stage is. I hope it will stay like this when complexity adds up.

&gt; Source/JavaScriptCore/b3/B3LowerToAir.cpp:109
&gt; +

Everything after this could be private.

&gt; Source/JavaScriptCore/b3/B3LowerToAir.cpp:153
&gt; +        if (value-&gt;hasInt32())
&gt; +            return Arg::imm(value-&gt;asInt32());

else if (value-&gt;hasInt64())
    return Arg::imm64(value-&gt;asInt64());

&gt; Source/JavaScriptCore/b3/B3LowerToAir.cpp:211
&gt; +                // FIXME: Use the right Move opcode. If we&apos;re dealing with 32-bit types, we should
&gt; +                // use Move32. If we&apos;re dealing with Doubles, we should use MoveDouble.
&gt; +                // https://bugs.webkit.org/show_bug.cgi?id=150533

Use moveForType() and remove the FIXME?

&gt; Source/JavaScriptCore/b3/B3LowerToAir.cpp:220
&gt; +            append(Move, tmp(left), result);

Use moveForType()?

&gt; Source/JavaScriptCore/b3/B3LowerToAir.cpp:354
&gt; +            selectedAddress = Arg::index(
&gt; +                lower.tmp(base), lower.tmp(index), 1 &lt;&lt; logScale-&gt;asInt());

Could be on a single line.

&gt; Source/JavaScriptCore/b3/B3LowerToAir.cpp:440
&gt; +        switch (currentValue-&gt;type()) {

You could replace the switch with:
    append(moveForType(currentValue-&gt;type()), effectiveAddr(address), tmp(currentValue));

&gt; Source/JavaScriptCore/b3/B3LowerToAir.cpp:442
&gt; +            append(Move32, effectiveAddr(address), tmp(currentValue));

In my opinion, it is easier to follow IR that use explicit Load/Store instead of move to/from addresses.

I&apos;d split the MoveXX into Move-Load-Store.

&gt; Source/JavaScriptCore/b3/B3MemoryValue.h:104
&gt; +    MemoryValue(unsigned index, Opcode opcode, Origin origin, Value* pointer, int32_t offset = 0)

Isn&apos;t this always better than the previous form?
The explicit type argument looks error prone.

You could invoke the generic constructor from here instead to have some more precondition assertions for free.

&gt; Source/JavaScriptCore/b3/B3MemoryValue.h:127
&gt; +        : Value(index, opcode, Void, origin, value, pointer)

Ditto, you can invoke the main constructor instead.

&gt; Source/JavaScriptCore/b3/B3Opcode.h:87
&gt; +    SExt8,
&gt; +    SExt16,
&gt; +    // Takes Int32 and returns Int64:
&gt; +    SExt32,

Tempted to write it as SexT8/16/32 for the lolz

&gt; Source/JavaScriptCore/b3/B3Opcode.h:120
&gt; +    LoadFloat,

LoadDouble?

&gt; Source/JavaScriptCore/b3/B3Opcode.h:121
&gt; +    // This return whatever the return type is:

is: ?

&gt; Source/JavaScriptCore/b3/B3Opcode.h:129
&gt; +    StoreFloat,

StoreDouble?

&gt; Source/JavaScriptCore/b3/B3Procedure.cpp:48
&gt; +    std::unique_ptr&lt;BasicBlock&gt; block(new BasicBlock(m_blocks.size(), frequency));

IIRC, Darin prefers:
    auto block = make_unique&lt;&gt;(...);

&gt; Source/JavaScriptCore/b3/B3Procedure.h:88
&gt; +        {

ASSERT(m_procedure == other.m_procedure);
?

&gt; Source/JavaScriptCore/b3/B3Procedure.h:148
&gt; +            {

ASSERT(m_procedure == other.m_procedure); ?

&gt; Source/JavaScriptCore/b3/B3ProcedureInlines.h:39
&gt; +    std::unique_ptr&lt;ValueType&gt; value(new ValueType(m_values.size(), arguments...));

auto, make_unique thingy

&gt; Source/JavaScriptCore/b3/B3SuccessorCollection.h:58
&gt; +            : m_collection(&amp;collection) // const is stupid anyway.

You can remove the comment now.

&gt; Source/JavaScriptCore/b3/B3SuccessorCollection.h:75
&gt; +        {

ASSERT(m_collection == other.m_collection);

&gt; Source/JavaScriptCore/b3/B3SwitchValue.h:89
&gt; +        {

ASSERT(m_switch == other.m_switch);

&gt; Source/JavaScriptCore/b3/B3UseCounts.cpp:40
&gt; +            m_counts[child]++;

You may want to give Upsilons a useCount of 1 for consistency.

Not important with the current use of UseCounts.

&gt; Source/JavaScriptCore/b3/B3Validate.cpp:84
&gt; +                VALIDATE(
&gt; +                    blocks.contains(successor), (&quot;At &quot;, *block, &quot;-&gt;&quot;, pointerDump(successor)));

Could be on a single line.

&gt; Source/JavaScriptCore/b3/B3Value.h:57
&gt; +    // Note that the opcode is immutable, except for replacing values with identity.

identity or noop!

&gt; Source/JavaScriptCore/b3/air/AirCode.cpp:47
&gt; +    std::unique_ptr&lt;BasicBlock&gt; block(new BasicBlock(m_blocks.size(), frequency));

IIRC, Darin prefers:
    auto block = make_unique&lt;&gt;(...);</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1137018</commentid>
    <comment_count>90</comment_count>
    <who name="Filip Pizlo">fpizlo</who>
    <bug_when>2015-10-27 17:53:35 -0700</bug_when>
    <thetext>*** Bug 150480 has been marked as a duplicate of this bug. ***</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1137019</commentid>
    <comment_count>91</comment_count>
      <attachid>264185</attachid>
    <who name="Filip Pizlo">fpizlo</who>
    <bug_when>2015-10-27 17:54:15 -0700</bug_when>
    <thetext>Created attachment 264185
the patch

I added a B3 validater.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1137022</commentid>
    <comment_count>92</comment_count>
    <who name="WebKit Commit Bot">commit-queue</who>
    <bug_when>2015-10-27 17:58:39 -0700</bug_when>
    <thetext>Attachment 264185 did not pass style-queue:


ERROR: Source/JavaScriptCore/b3/air/AirInst.h:66:  Missing space before {  [whitespace/braces] [5]
ERROR: Source/JavaScriptCore/b3/air/AirInst.h:111:  Place brace on its own line for function definitions.  [whitespace/braces] [4]
ERROR: Source/JavaScriptCore/b3/air/AirGenerate.cpp:101:  Place brace on its own line for function definitions.  [whitespace/braces] [4]
ERROR: Source/JavaScriptCore/b3/B3GenericFrequentedBlock.h:44:  Wrong number of spaces before statement. (expected: 12)  [whitespace/indent] [4]
ERROR: Source/JavaScriptCore/b3/B3GenericFrequentedBlock.h:45:  Wrong number of spaces before statement. (expected: 12)  [whitespace/indent] [4]
ERROR: Source/JavaScriptCore/b3/B3SwitchCase.h:32:  Alphabetical sorting problem.  [build/include_order] [4]
ERROR: Source/JavaScriptCore/b3/air/AirRegisterPriority.cpp:48:  Place brace on its own line for function definitions.  [whitespace/braces] [4]
ERROR: Source/JavaScriptCore/b3/air/AirRegisterPriority.cpp:53:  Place brace on its own line for function definitions.  [whitespace/braces] [4]
ERROR: Source/JavaScriptCore/b3/air/AirRegisterPriority.cpp:72:  Place brace on its own line for function definitions.  [whitespace/braces] [4]
ERROR: Source/JavaScriptCore/b3/air/AirRegisterPriority.cpp:77:  Place brace on its own line for function definitions.  [whitespace/braces] [4]
ERROR: Source/JavaScriptCore/b3/B3MemoryValue.h:75:  Wrong number of spaces before statement. (expected: 12)  [whitespace/indent] [4]
ERROR: Source/JavaScriptCore/b3/B3MemoryValue.h:76:  Wrong number of spaces before statement. (expected: 12)  [whitespace/indent] [4]
ERROR: Source/JavaScriptCore/b3/B3MemoryValue.h:127:  Wrong number of spaces before statement. (expected: 12)  [whitespace/indent] [4]
ERROR: Source/JavaScriptCore/b3/B3MemoryValue.h:128:  Wrong number of spaces before statement. (expected: 12)  [whitespace/indent] [4]
ERROR: Source/JavaScriptCore/b3/B3Value.h:126:  Missing space before {  [whitespace/braces] [5]
ERROR: Source/JavaScriptCore/b3/B3Value.h:144:  Missing space before {  [whitespace/braces] [5]
ERROR: Source/JavaScriptCore/b3/testb3.cpp:73:  Consider using CHECK_EQ instead of CHECK(a == b)  [readability/check] [2]
ERROR: Source/JavaScriptCore/b3/testb3.cpp:87:  Consider using CHECK_EQ instead of CHECK(a == b)  [readability/check] [2]
ERROR: Source/JavaScriptCore/b3/air/AirLiveness.h:96:  Place brace on its own line for function definitions.  [whitespace/braces] [4]
ERROR: Source/JavaScriptCore/b3/air/AirLiveness.h:106:  Place brace on its own line for function definitions.  [whitespace/braces] [4]
ERROR: Source/JavaScriptCore/b3/air/AirLiveness.h:113:  Place brace on its own line for function definitions.  [whitespace/braces] [4]
ERROR: Source/JavaScriptCore/b3/air/AirSpillEverything.cpp:52:  Place brace on its own line for function definitions.  [whitespace/braces] [4]
ERROR: Source/JavaScriptCore/b3/air/AirSpillEverything.cpp:62:  Place brace on its own line for function definitions.  [whitespace/braces] [4]
ERROR: Source/JavaScriptCore/b3/air/AirSpillEverything.cpp:95:  Place brace on its own line for function definitions.  [whitespace/braces] [4]
ERROR: Source/JavaScriptCore/b3/air/AirAllocateStack.cpp:143:  Place brace on its own line for function definitions.  [whitespace/braces] [4]
ERROR: Source/JavaScriptCore/b3/air/AirAllocateStack.cpp:158:  Place brace on its own line for function definitions.  [whitespace/braces] [4]
ERROR: Source/JavaScriptCore/b3/air/AirHandleCalleeSaves.cpp:46:  Place brace on its own line for function definitions.  [whitespace/braces] [4]
ERROR: Source/WTF/wtf/ScopedLambda.h:45:  Extra space before ( in function call  [whitespace/parens] [4]
ERROR: Source/WTF/wtf/ScopedLambda.h:65:  Extra space before ( in function call  [whitespace/parens] [4]
ERROR: Source/WTF/wtf/ScopedLambda.h:69:  Extra space before ( in function call  [whitespace/parens] [4]
ERROR: Source/JavaScriptCore/b3/B3CheckSpecial.cpp:124:  Place brace on its own line for function definitions.  [whitespace/braces] [4]
ERROR: Source/JavaScriptCore/b3/B3ControlValue.h:109:  Wrong number of spaces before statement. (expected: 12)  [whitespace/indent] [4]
Total errors found: 32 in 137 files


If any of these errors are false positives, please file a bug against check-webkit-style.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1137024</commentid>
    <comment_count>93</comment_count>
    <who name="Filip Pizlo">fpizlo</who>
    <bug_when>2015-10-27 18:08:43 -0700</bug_when>
    <thetext>(In reply to comment #89)
&gt; Comment on attachment 264146 [details]
&gt; the patch
&gt; 
&gt; View in context:
&gt; https://bugs.webkit.org/attachment.cgi?id=264146&amp;action=review
&gt; 
&gt; &gt; Source/JavaScriptCore/b3/B3GenericFrequentedBlock.h:43
&gt; &gt; +    explicit GenericFrequentedBlock(
&gt; &gt; +        BasicBlock* block = nullptr, FrequencyClass frequency = FrequencyClass::Normal)
&gt; 
&gt; Could be on one line.
&gt; 
&gt; &gt; Source/JavaScriptCore/b3/B3GenericFrequentedBlock.h:58
&gt; &gt; +    bool operator==(const GenericFrequentedBlock&amp; other) const
&gt; &gt; +    {
&gt; &gt; +        return m_block == other.m_block
&gt; &gt; +            &amp;&amp; m_frequency == other.m_frequency;
&gt; &gt; +    }
&gt; &gt; +
&gt; &gt; +    bool operator!=(const GenericFrequentedBlock&amp; other) const
&gt; &gt; +    {
&gt; &gt; +        return !(*this == other);
&gt; &gt; +    }
&gt; 
&gt; I don&apos;t think you need that. Clang does it for you.
&gt; 
&gt; &gt; Source/JavaScriptCore/b3/B3LowerToAir.cpp:68
&gt; &gt; +        for (B3::BasicBlock* block : procedure)
&gt; 
&gt; The next loop goes over the block in pre-order.
&gt; 
&gt; Maybe it would be better to get the block list in pre-order, then allocate
&gt; the Air block in that order. That way blocks used together are more likely
&gt; to be allocated together.

Pre-order walks are useful for when you want defs before uses. But the point of this lowering is for the Air CFG to be ordered the same way as the B3 CFG. That&apos;s why block creation is in-order.

&gt; 
&gt; &gt; Source/JavaScriptCore/b3/B3LowerToAir.cpp:73
&gt; &gt; +        for (B3::BasicBlock* block : procedure.blocksInPreOrder()) {
&gt; 
&gt; It&apos;s beautiful how simple this stage is. I hope it will stay like this when
&gt; complexity adds up.
&gt; 
&gt; &gt; Source/JavaScriptCore/b3/B3LowerToAir.cpp:109
&gt; &gt; +
&gt; 
&gt; Everything after this could be private.

Almost did that, and then I realized that this is in an anonymous namespace and that if we added any other classes to the anonymous namespace, then they would all be friends of this one. ;-)

But I&apos;ll change it.

&gt; 
&gt; &gt; Source/JavaScriptCore/b3/B3LowerToAir.cpp:153
&gt; &gt; +        if (value-&gt;hasInt32())
&gt; &gt; +            return Arg::imm(value-&gt;asInt32());
&gt; 
&gt; else if (value-&gt;hasInt64())
&gt;     return Arg::imm64(value-&gt;asInt64());

No.  The imm() method is for cases where the immediate can be an operand to an Air instruction.  If imm() returns the empty Arg(), it means that it&apos;s not possible to represent this Value* as an Arg::imm(). It would be wrong to return an Arg::imm64() here. Doing so would cause invalid lowering for things like this (taken from appendBinOp):

        if (imm(right) &amp;&amp; isValidForm(opcode, Arg::Tmp, Arg::Imm, Arg::Tmp)) {
            append(opcode, tmp(left), imm(right), result);
            return;
        }

Notice how we&apos;re using imm(Value*) as a predicate, and if it returns non-empty, and the instruction supports a form that takes Arg::imm() for the second operand, then we emit such an instruction. This code would become incorrect if imm() could return an Arg::imm64().

&gt; 
&gt; &gt; Source/JavaScriptCore/b3/B3LowerToAir.cpp:211
&gt; &gt; +                // FIXME: Use the right Move opcode. If we&apos;re dealing with 32-bit types, we should
&gt; &gt; +                // use Move32. If we&apos;re dealing with Doubles, we should use MoveDouble.
&gt; &gt; +                // https://bugs.webkit.org/show_bug.cgi?id=150533
&gt; 
&gt; Use moveForType() and remove the FIXME?

Can&apos;t use moveForType().  We need something like coalescableMoveForType(), which uses Move instead of Move32 even for Int32.

If we used Move32 then the coalesce code would consider it off-limits since Move32 also does a zero-extend - so it&apos;s not a bit-for-bit move.

&gt; 
&gt; &gt; Source/JavaScriptCore/b3/B3LowerToAir.cpp:220
&gt; &gt; +            append(Move, tmp(left), result);
&gt; 
&gt; Use moveForType()?

Ditto.

&gt; 
&gt; &gt; Source/JavaScriptCore/b3/B3LowerToAir.cpp:354
&gt; &gt; +            selectedAddress = Arg::index(
&gt; &gt; +                lower.tmp(base), lower.tmp(index), 1 &lt;&lt; logScale-&gt;asInt());
&gt; 
&gt; Could be on a single line.
&gt; 
&gt; &gt; Source/JavaScriptCore/b3/B3LowerToAir.cpp:440
&gt; &gt; +        switch (currentValue-&gt;type()) {
&gt; 
&gt; You could replace the switch with:
&gt;     append(moveForType(currentValue-&gt;type()), effectiveAddr(address),
&gt; tmp(currentValue));

Good call!

&gt; 
&gt; &gt; Source/JavaScriptCore/b3/B3LowerToAir.cpp:442
&gt; &gt; +            append(Move32, effectiveAddr(address), tmp(currentValue));
&gt; 
&gt; In my opinion, it is easier to follow IR that use explicit Load/Store
&gt; instead of move to/from addresses.
&gt; 
&gt; I&apos;d split the MoveXX into Move-Load-Store.

That would break spilling. We want &quot;Move %tmp1, %tmp2&quot; to turn into &quot;Move (%stack1), %tmp2&quot; if we spill %tmp1.

Also, so long as math/compare/etc ops support addresses for operands, we&apos;re essentially acknowledging that Air is an orthogonal ISA (https://en.wikipedia.org/wiki/Orthogonal_instruction_set), then the accepted terminology for &quot;Load/Store&quot; is &quot;Move&quot;.

&gt; 
&gt; &gt; Source/JavaScriptCore/b3/B3MemoryValue.h:104
&gt; &gt; +    MemoryValue(unsigned index, Opcode opcode, Origin origin, Value* pointer, int32_t offset = 0)
&gt; 
&gt; Isn&apos;t this always better than the previous form?
&gt; The explicit type argument looks error prone.

You need to supply it for Load.

&gt; 
&gt; You could invoke the generic constructor from here instead to have some more
&gt; precondition assertions for free.

Good call.

&gt; 
&gt; &gt; Source/JavaScriptCore/b3/B3MemoryValue.h:127
&gt; &gt; +        : Value(index, opcode, Void, origin, value, pointer)
&gt; 
&gt; Ditto, you can invoke the main constructor instead.

Done.

&gt; 
&gt; &gt; Source/JavaScriptCore/b3/B3Opcode.h:87
&gt; &gt; +    SExt8,
&gt; &gt; +    SExt16,
&gt; &gt; +    // Takes Int32 and returns Int64:
&gt; &gt; +    SExt32,
&gt; 
&gt; Tempted to write it as SexT8/16/32 for the lolz

Haha!

&gt; 
&gt; &gt; Source/JavaScriptCore/b3/B3Opcode.h:120
&gt; &gt; +    LoadFloat,
&gt; 
&gt; LoadDouble?

Load with a type() of Double.

&gt; 
&gt; &gt; Source/JavaScriptCore/b3/B3Opcode.h:121
&gt; &gt; +    // This return whatever the return type is:
&gt; 
&gt; is: ?

Value::type().

&gt; 
&gt; &gt; Source/JavaScriptCore/b3/B3Opcode.h:129
&gt; &gt; +    StoreFloat,
&gt; 
&gt; StoreDouble?

Store with child(0)-&gt;type() == Double.

&gt; 
&gt; &gt; Source/JavaScriptCore/b3/B3Procedure.cpp:48
&gt; &gt; +    std::unique_ptr&lt;BasicBlock&gt; block(new BasicBlock(m_blocks.size(), frequency));
&gt; 
&gt; IIRC, Darin prefers:
&gt;     auto block = make_unique&lt;&gt;(...);

I prefer it, too. But this causes Visual Studio build breakage because make_unique&lt;&gt; isn&apos;t granted permission to invoke BasicBlock&apos;s private constructor.  This is a convenient way of side-stepping the issue, and it&apos;s better than using friend or public.

&gt; 
&gt; &gt; Source/JavaScriptCore/b3/B3Procedure.h:88
&gt; &gt; +        {
&gt; 
&gt; ASSERT(m_procedure == other.m_procedure);
&gt; ?

Added.

&gt; 
&gt; &gt; Source/JavaScriptCore/b3/B3Procedure.h:148
&gt; &gt; +            {
&gt; 
&gt; ASSERT(m_procedure == other.m_procedure); ?

Added.

&gt; 
&gt; &gt; Source/JavaScriptCore/b3/B3ProcedureInlines.h:39
&gt; &gt; +    std::unique_ptr&lt;ValueType&gt; value(new ValueType(m_values.size(), arguments...));
&gt; 
&gt; auto, make_unique thingy

Ditto, ValueType has a private constructor and Visual Studio.

&gt; 
&gt; &gt; Source/JavaScriptCore/b3/B3SuccessorCollection.h:58
&gt; &gt; +            : m_collection(&amp;collection) // const is stupid anyway.
&gt; 
&gt; You can remove the comment now.

Yup, removed!

&gt; 
&gt; &gt; Source/JavaScriptCore/b3/B3SuccessorCollection.h:75
&gt; &gt; +        {
&gt; 
&gt; ASSERT(m_collection == other.m_collection);

Added.

&gt; 
&gt; &gt; Source/JavaScriptCore/b3/B3SwitchValue.h:89
&gt; &gt; +        {
&gt; 
&gt; ASSERT(m_switch == other.m_switch);

Added.

&gt; 
&gt; &gt; Source/JavaScriptCore/b3/B3UseCounts.cpp:40
&gt; &gt; +            m_counts[child]++;
&gt; 
&gt; You may want to give Upsilons a useCount of 1 for consistency.
&gt; 
&gt; Not important with the current use of UseCounts.

Interesting.

&gt; 
&gt; &gt; Source/JavaScriptCore/b3/B3Validate.cpp:84
&gt; &gt; +                VALIDATE(
&gt; &gt; +                    blocks.contains(successor), (&quot;At &quot;, *block, &quot;-&gt;&quot;, pointerDump(successor)));
&gt; 
&gt; Could be on a single line.
&gt; 
&gt; &gt; Source/JavaScriptCore/b3/B3Value.h:57
&gt; &gt; +    // Note that the opcode is immutable, except for replacing values with identity.
&gt; 
&gt; identity or noop!

Fixed.

&gt; 
&gt; &gt; Source/JavaScriptCore/b3/air/AirCode.cpp:47
&gt; &gt; +    std::unique_ptr&lt;BasicBlock&gt; block(new BasicBlock(m_blocks.size(), frequency));
&gt; 
&gt; IIRC, Darin prefers:
&gt;     auto block = make_unique&lt;&gt;(...);

BasicBlock has a private constructor and Visual Studio.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1137026</commentid>
    <comment_count>94</comment_count>
    <who name="Filip Pizlo">fpizlo</who>
    <bug_when>2015-10-27 18:11:22 -0700</bug_when>
    <thetext>FWIW, operator!= was not synthesized.  I will re-add all of the operator!=&apos;s that I removed per previous feedback.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1137029</commentid>
    <comment_count>95</comment_count>
    <who name="Filip Pizlo">fpizlo</who>
    <bug_when>2015-10-27 18:16:48 -0700</bug_when>
    <thetext>
&gt; &gt; &gt; Source/JavaScriptCore/b3/B3LowerToAir.cpp:109
&gt; &gt; &gt; +
&gt; &gt; 
&gt; &gt; Everything after this could be private.
&gt; 
&gt; Almost did that, and then I realized that this is in an anonymous namespace
&gt; and that if we added any other classes to the anonymous namespace, then they
&gt; would all be friends of this one. ;-)
&gt; 
&gt; But I&apos;ll change it.

Nope, can&apos;t change it. The accept/try methods must be public.

I think that because private would have to be used very carefully in order to work, it&apos;s not worth it.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1137048</commentid>
    <comment_count>96</comment_count>
      <attachid>264185</attachid>
    <who name="Benjamin Poulain">benjamin</who>
    <bug_when>2015-10-27 21:19:05 -0700</bug_when>
    <thetext>Comment on attachment 264185
the patch

View in context: https://bugs.webkit.org/attachment.cgi?id=264185&amp;action=review

&gt; Source/JavaScriptCore/b3/air/AirAllocateStack.cpp:134
&gt; +    auto isRelevant = [] (const Arg&amp; arg) -&gt; bool {
&gt; +        return arg.isStack() &amp;&amp; arg.stackSlot()-&gt;kind() == StackSlotKind::Anonymous;
&gt; +    };

This could be moved as a static function outside. The code is already pretty long.

isRelevant -&gt; argumentIsOnStack?

&gt; Source/JavaScriptCore/b3/air/AirAllocateStack.cpp:140
&gt; +    Liveness&lt;Arg&gt; liveness(code);
&gt; +    IndexMap&lt;StackSlot, HashSet&lt;StackSlot*&gt;&gt; interference(code.stackSlots().size());
&gt; +    Vector&lt;StackSlot*&gt; slots;
&gt; +
&gt; +    for (BasicBlock* block : code) {

I think you can this code out as &quot;computeStackInterference()&quot; that just produces the IndexMap.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1137071</commentid>
    <comment_count>97</comment_count>
      <attachid>264185</attachid>
    <who name="Benjamin Poulain">benjamin</who>
    <bug_when>2015-10-28 00:27:03 -0700</bug_when>
    <thetext>Comment on attachment 264185
the patch

View in context: https://bugs.webkit.org/attachment.cgi?id=264185&amp;action=review

&gt; Source/JavaScriptCore/b3/air/AirAllocateStack.cpp:196
&gt; +    Vector&lt;StackSlot*&gt; otherSlots;
&gt; +    for (StackSlot* slot : code.stackSlots()) {

You could extract this loop as 
    assignStackOffsetToSlots()

&gt; Source/JavaScriptCore/b3/air/AirAllocateStack.cpp:205
&gt; +        for (unsigned i = 0; i &lt; assignedLockedStackSlots.size(); ++i)
&gt; +            otherSlots[i] = assignedLockedStackSlots[i];

You could pre-assign those out of the loop.

&gt; Source/JavaScriptCore/b3/air/AirAllocateStack.cpp:215
&gt; +    unsigned frameSizeForStackSlots = 0;
&gt; +    for (StackSlot* slot : code.stackSlots()) {

extract in frameSizeForStackSlots()?

&gt; Source/JavaScriptCore/b3/air/AirAllocateStack.cpp:251
&gt; +                        arg.offset() + arg.stackSlot()-&gt;offsetFromFP());

What&apos;s that arg.offset()?

&gt; Source/JavaScriptCore/b3/air/AirHandleCalleeSaves.cpp:68
&gt; +    StackSlot* savesArea = code.addStackSlot(byteSize, StackSlotKind::Locked);
&gt; +    // This is a bit weird since we could have already pinned a different stack slot to this
&gt; +    // area. Also, our runtime does not require us to pin the saves area. Maybe we shouldn&apos;t pin it?
&gt; +    savesArea-&gt;setOffsetFromFP(-byteSize);

I am a bit confused by this. 

Why allocate a big stackSlot at FP instead of allocating one StackSlot per register and letting the stack layout phase find them some space?

&gt; Source/JavaScriptCore/b3/air/AirSpillEverything.cpp:53
&gt; +            RegisterSet&amp; set = usedRegisters[block][index];

set -&gt; registerSet

&gt; Source/JavaScriptCore/b3/air/AirSpillEverything.cpp:68
&gt; +        for (unsigned instIndex = block-&gt;size(); instIndex--;) {

I think I would prefer to iterate over the Liveness&lt;Tmp&gt;::LocalCalc. The iterator would have
    iterator-&gt;inst
    iterator-&gt;live()

That way someone could use liveness analysis without knowing how it works.

Actually, you could make LocalCalc into the iterator and have something like:
    for (Liveness&lt;Tmp&gt;::LocalCalc localCalc : liveness.atBlock() {
        ...

&gt; Source/JavaScriptCore/b3/air/AirSpillEverything.cpp:92
&gt; +            RegisterSet&amp; setAfter = usedRegisters[block][instIndex + 1];

I am pretty confused by this.

If a register is not in setBefore, it is not live at the current instIndex. Why do you prevent the current instruction from using the register?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1137144</commentid>
    <comment_count>98</comment_count>
    <who name="Filip Pizlo">fpizlo</who>
    <bug_when>2015-10-28 09:42:46 -0700</bug_when>
    <thetext>(In reply to comment #96)
&gt; Comment on attachment 264185 [details]
&gt; the patch
&gt; 
&gt; View in context:
&gt; https://bugs.webkit.org/attachment.cgi?id=264185&amp;action=review
&gt; 
&gt; &gt; Source/JavaScriptCore/b3/air/AirAllocateStack.cpp:134
&gt; &gt; +    auto isRelevant = [] (const Arg&amp; arg) -&gt; bool {
&gt; &gt; +        return arg.isStack() &amp;&amp; arg.stackSlot()-&gt;kind() == StackSlotKind::Anonymous;
&gt; &gt; +    };
&gt; 
&gt; This could be moved as a static function outside. The code is already pretty
&gt; long.

OK.

&gt; 
&gt; isRelevant -&gt; argumentIsOnStack?

OK.

&gt; 
&gt; &gt; Source/JavaScriptCore/b3/air/AirAllocateStack.cpp:140
&gt; &gt; +    Liveness&lt;Arg&gt; liveness(code);
&gt; &gt; +    IndexMap&lt;StackSlot, HashSet&lt;StackSlot*&gt;&gt; interference(code.stackSlots().size());
&gt; &gt; +    Vector&lt;StackSlot*&gt; slots;
&gt; &gt; +
&gt; &gt; +    for (BasicBlock* block : code) {
&gt; 
&gt; I think you can this code out as &quot;computeStackInterference()&quot; that just
&gt; produces the IndexMap.

I kept it as is.  I think it&apos;s easier not to factor out things into functions if those functions are only called in one place.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1137153</commentid>
    <comment_count>99</comment_count>
    <who name="Filip Pizlo">fpizlo</who>
    <bug_when>2015-10-28 09:58:47 -0700</bug_when>
    <thetext>(In reply to comment #97)
&gt; Comment on attachment 264185 [details]
&gt; the patch
&gt; 
&gt; View in context:
&gt; https://bugs.webkit.org/attachment.cgi?id=264185&amp;action=review
&gt; 
&gt; &gt; Source/JavaScriptCore/b3/air/AirAllocateStack.cpp:196
&gt; &gt; +    Vector&lt;StackSlot*&gt; otherSlots;
&gt; &gt; +    for (StackSlot* slot : code.stackSlots()) {
&gt; 
&gt; You could extract this loop as 
&gt;     assignStackOffsetToSlots()

I&apos;ll keep it here, since it&apos;s only used here.

&gt; 
&gt; &gt; Source/JavaScriptCore/b3/air/AirAllocateStack.cpp:205
&gt; &gt; +        for (unsigned i = 0; i &lt; assignedLockedStackSlots.size(); ++i)
&gt; &gt; +            otherSlots[i] = assignedLockedStackSlots[i];
&gt; 
&gt; You could pre-assign those out of the loop.

OK.

&gt; 
&gt; &gt; Source/JavaScriptCore/b3/air/AirAllocateStack.cpp:215
&gt; &gt; +    unsigned frameSizeForStackSlots = 0;
&gt; &gt; +    for (StackSlot* slot : code.stackSlots()) {
&gt; 
&gt; extract in frameSizeForStackSlots()?

I&apos;ll keep it here.

&gt; 
&gt; &gt; Source/JavaScriptCore/b3/air/AirAllocateStack.cpp:251
&gt; &gt; +                        arg.offset() + arg.stackSlot()-&gt;offsetFromFP());
&gt; 
&gt; What&apos;s that arg.offset()?

Any use of a memory location has an offset.  That includes stack slots.  For example you can have a 64 byte stack slot named stack42 and access something like 16(stack42) - i.e. 16 bytes from the start of stack42.

&gt; 
&gt; &gt; Source/JavaScriptCore/b3/air/AirHandleCalleeSaves.cpp:68
&gt; &gt; +    StackSlot* savesArea = code.addStackSlot(byteSize, StackSlotKind::Locked);
&gt; &gt; +    // This is a bit weird since we could have already pinned a different stack slot to this
&gt; &gt; +    // area. Also, our runtime does not require us to pin the saves area. Maybe we shouldn&apos;t pin it?
&gt; &gt; +    savesArea-&gt;setOffsetFromFP(-byteSize);
&gt; 
&gt; I am a bit confused by this. 
&gt; 
&gt; Why allocate a big stackSlot at FP instead of allocating one StackSlot per
&gt; register and letting the stack layout phase find them some space?

You could do it that way, but it would only make things more complicated and slower.

Since the callee-saves stack slot is live for the entire function, it&apos;s not any more efficient to allocate them individually.  It&apos;s less efficient if anything, since the compiler has more StackSlots to worry about in that case.

Also, no matter what we do, we need to be able to report to the client of B3 what the unwind data is - that is, where we have saved callee saves. The way I&apos;m doing it right now means that we&apos;re reusing the baseline JIT&apos;s and DFG&apos;s callee save register layout code, and we&apos;re even reusing their data structure - the RegisterAtOffsetList.  Air::Code::calleeSaveRegisters() just returns that list. If the compiler could allocate callee-saves at any location after this phase runs, then we&apos;d have to reconstruct the calleeSaveRegisters() list at the bitter end by someone tracking which StackSlot* corresponds to which callee save.  Sure, it&apos;s possible, but it strikes me as very roundabout.

&gt; 
&gt; &gt; Source/JavaScriptCore/b3/air/AirSpillEverything.cpp:53
&gt; &gt; +            RegisterSet&amp; set = usedRegisters[block][index];
&gt; 
&gt; set -&gt; registerSet

OK.

&gt; 
&gt; &gt; Source/JavaScriptCore/b3/air/AirSpillEverything.cpp:68
&gt; &gt; +        for (unsigned instIndex = block-&gt;size(); instIndex--;) {
&gt; 
&gt; I think I would prefer to iterate over the Liveness&lt;Tmp&gt;::LocalCalc. The
&gt; iterator would have
&gt;     iterator-&gt;inst
&gt;     iterator-&gt;live()
&gt; 
&gt; That way someone could use liveness analysis without knowing how it works.

I don&apos;t think that&apos;s a good idea, and I don&apos;t see how to use this pattern correctly in this loop.  I think it&apos;s important for users of LocalCalc to *know* that they are iterating in reverse and that this is what the LocalCalc requires.  Notice that this use of LocalCalc has calls to setUsedRegisters() that uses Inst indices, and it actually uses the index of an instruction that is *different* from the one that liveness is going to operate on in addition to using the current one:

            Inst&amp; inst = block-&gt;at(instIndex);
            setUsedRegisters(instIndex + 1, inst);
            localCalc.execute(inst);

It would be super weird to have such an index if we were using foreach iteration over the LocalCalc.

&gt; 
&gt; Actually, you could make LocalCalc into the iterator and have something like:
&gt;     for (Liveness&lt;Tmp&gt;::LocalCalc localCalc : liveness.atBlock() {
&gt;         ...

Maybe this would make sense here, but it&apos;s not a very general pattern.  Usually, you will use the liveness calc while performing some transformation that requires deliberately choosing some block iteration order.

&gt; 
&gt; &gt; Source/JavaScriptCore/b3/air/AirSpillEverything.cpp:92
&gt; &gt; +            RegisterSet&amp; setAfter = usedRegisters[block][instIndex + 1];
&gt; 
&gt; I am pretty confused by this.
&gt; 
&gt; If a register is not in setBefore, it is not live at the current instIndex.
&gt; Why do you prevent the current instruction from using the register?

Definitions. You could have an instruction like:

Move %tmp0, %tmp1

The problem is choosing a register to use for %tmp1. Lets say that %rax is dead before the Move. Does that mean we can use %rax for %tmp1? No, it doesn&apos;t. %rax could be live after. This would probably require a fairly exotic instruction - one that assigns to %rax directly even before register allocation. But that&apos;s totally something that we&apos;ll encounter. For example, the Intel div instruction will have to be modeled this way.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1137237</commentid>
    <comment_count>100</comment_count>
    <who name="Filip Pizlo">fpizlo</who>
    <bug_when>2015-10-28 13:12:26 -0700</bug_when>
    <thetext>*** Bug 150533 has been marked as a duplicate of this bug. ***</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1137241</commentid>
    <comment_count>101</comment_count>
      <attachid>264236</attachid>
    <who name="Filip Pizlo">fpizlo</who>
    <bug_when>2015-10-28 13:18:32 -0700</bug_when>
    <thetext>Created attachment 264236
the patch

This patch includes the start of a strength reducer for B3.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1137243</commentid>
    <comment_count>102</comment_count>
    <who name="WebKit Commit Bot">commit-queue</who>
    <bug_when>2015-10-28 13:22:40 -0700</bug_when>
    <thetext>Attachment 264236 did not pass style-queue:


ERROR: Source/JavaScriptCore/b3/air/AirInst.h:66:  Missing space before {  [whitespace/braces] [5]
ERROR: Source/JavaScriptCore/b3/air/AirInst.h:111:  Place brace on its own line for function definitions.  [whitespace/braces] [4]
ERROR: Source/JavaScriptCore/b3/air/AirGenerate.cpp:101:  Place brace on its own line for function definitions.  [whitespace/braces] [4]
ERROR: Source/JavaScriptCore/b3/B3GenericFrequentedBlock.h:44:  Wrong number of spaces before statement. (expected: 12)  [whitespace/indent] [4]
ERROR: Source/JavaScriptCore/b3/B3GenericFrequentedBlock.h:45:  Wrong number of spaces before statement. (expected: 12)  [whitespace/indent] [4]
ERROR: Source/JavaScriptCore/b3/B3SwitchCase.h:32:  Alphabetical sorting problem.  [build/include_order] [4]
ERROR: Source/JavaScriptCore/b3/air/AirRegisterPriority.cpp:48:  Place brace on its own line for function definitions.  [whitespace/braces] [4]
ERROR: Source/JavaScriptCore/b3/air/AirRegisterPriority.cpp:53:  Place brace on its own line for function definitions.  [whitespace/braces] [4]
ERROR: Source/JavaScriptCore/b3/air/AirRegisterPriority.cpp:72:  Place brace on its own line for function definitions.  [whitespace/braces] [4]
ERROR: Source/JavaScriptCore/b3/air/AirRegisterPriority.cpp:77:  Place brace on its own line for function definitions.  [whitespace/braces] [4]
ERROR: Source/JavaScriptCore/b3/B3ConstDoubleValue.h:43:  The parameter name &quot;proc&quot; adds no information, so it should be removed.  [readability/parameter_name] [5]
ERROR: Source/JavaScriptCore/b3/B3ConstDoubleValue.h:44:  The parameter name &quot;proc&quot; adds no information, so it should be removed.  [readability/parameter_name] [5]
ERROR: Source/JavaScriptCore/b3/B3ConstDoubleValue.h:45:  The parameter name &quot;proc&quot; adds no information, so it should be removed.  [readability/parameter_name] [5]
ERROR: Source/JavaScriptCore/b3/B3ConstDoubleValue.h:46:  The parameter name &quot;proc&quot; adds no information, so it should be removed.  [readability/parameter_name] [5]
ERROR: Source/JavaScriptCore/b3/B3MemoryValue.h:76:  Wrong number of spaces before statement. (expected: 12)  [whitespace/indent] [4]
ERROR: Source/JavaScriptCore/b3/B3MemoryValue.h:77:  Wrong number of spaces before statement. (expected: 12)  [whitespace/indent] [4]
ERROR: Source/JavaScriptCore/b3/B3MemoryValue.h:114:  Wrong number of spaces before statement. (expected: 12)  [whitespace/indent] [4]
ERROR: Source/JavaScriptCore/b3/B3MemoryValue.h:115:  Wrong number of spaces before statement. (expected: 12)  [whitespace/indent] [4]
ERROR: Source/JavaScriptCore/b3/B3Value.h:142:  Missing space before {  [whitespace/braces] [5]
ERROR: Source/JavaScriptCore/b3/B3Value.h:160:  Missing space before {  [whitespace/braces] [5]
ERROR: Source/JavaScriptCore/b3/testb3.cpp:73:  Consider using CHECK_EQ instead of CHECK(a == b)  [readability/check] [2]
ERROR: Source/JavaScriptCore/b3/testb3.cpp:87:  Consider using CHECK_EQ instead of CHECK(a == b)  [readability/check] [2]
ERROR: Source/JavaScriptCore/b3/air/AirLiveness.h:96:  Place brace on its own line for function definitions.  [whitespace/braces] [4]
ERROR: Source/JavaScriptCore/b3/air/AirLiveness.h:106:  Place brace on its own line for function definitions.  [whitespace/braces] [4]
ERROR: Source/JavaScriptCore/b3/air/AirLiveness.h:113:  Place brace on its own line for function definitions.  [whitespace/braces] [4]
ERROR: Source/JavaScriptCore/b3/air/AirSpillEverything.cpp:52:  Place brace on its own line for function definitions.  [whitespace/braces] [4]
ERROR: Source/JavaScriptCore/b3/air/AirSpillEverything.cpp:62:  Place brace on its own line for function definitions.  [whitespace/braces] [4]
ERROR: Source/JavaScriptCore/b3/air/AirSpillEverything.cpp:95:  Place brace on its own line for function definitions.  [whitespace/braces] [4]
ERROR: Source/JavaScriptCore/b3/air/AirAllocateStack.cpp:144:  Place brace on its own line for function definitions.  [whitespace/braces] [4]
ERROR: Source/JavaScriptCore/b3/air/AirAllocateStack.cpp:159:  Place brace on its own line for function definitions.  [whitespace/braces] [4]
ERROR: Source/JavaScriptCore/b3/air/AirHandleCalleeSaves.cpp:46:  Place brace on its own line for function definitions.  [whitespace/braces] [4]
ERROR: Source/JavaScriptCore/b3/B3InsertionSet.h:63:  The parameter name &quot;arguments&quot; adds no information, so it should be removed.  [readability/parameter_name] [5]
ERROR: Source/WTF/wtf/ScopedLambda.h:45:  Extra space before ( in function call  [whitespace/parens] [4]
ERROR: Source/WTF/wtf/ScopedLambda.h:65:  Extra space before ( in function call  [whitespace/parens] [4]
ERROR: Source/WTF/wtf/ScopedLambda.h:69:  Extra space before ( in function call  [whitespace/parens] [4]
ERROR: Source/JavaScriptCore/b3/B3CheckSpecial.cpp:124:  Place brace on its own line for function definitions.  [whitespace/braces] [4]
ERROR: Source/JavaScriptCore/b3/B3ControlValue.h:109:  Wrong number of spaces before statement. (expected: 12)  [whitespace/indent] [4]
Total errors found: 37 in 142 files


If any of these errors are false positives, please file a bug against check-webkit-style.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1137276</commentid>
    <comment_count>103</comment_count>
      <attachid>264243</attachid>
    <who name="Filip Pizlo">fpizlo</who>
    <bug_when>2015-10-28 14:12:31 -0700</bug_when>
    <thetext>Created attachment 264243
the patch

More</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1137278</commentid>
    <comment_count>104</comment_count>
    <who name="WebKit Commit Bot">commit-queue</who>
    <bug_when>2015-10-28 14:16:29 -0700</bug_when>
    <thetext>Attachment 264243 did not pass style-queue:


ERROR: Source/JavaScriptCore/b3/air/AirInst.h:66:  Missing space before {  [whitespace/braces] [5]
ERROR: Source/JavaScriptCore/b3/air/AirInst.h:111:  Place brace on its own line for function definitions.  [whitespace/braces] [4]
ERROR: Source/JavaScriptCore/b3/air/AirGenerate.cpp:101:  Place brace on its own line for function definitions.  [whitespace/braces] [4]
ERROR: Source/JavaScriptCore/b3/B3GenericFrequentedBlock.h:44:  Wrong number of spaces before statement. (expected: 12)  [whitespace/indent] [4]
ERROR: Source/JavaScriptCore/b3/B3GenericFrequentedBlock.h:45:  Wrong number of spaces before statement. (expected: 12)  [whitespace/indent] [4]
ERROR: Source/JavaScriptCore/b3/B3SwitchCase.h:32:  Alphabetical sorting problem.  [build/include_order] [4]
ERROR: Source/JavaScriptCore/b3/air/AirRegisterPriority.cpp:48:  Place brace on its own line for function definitions.  [whitespace/braces] [4]
ERROR: Source/JavaScriptCore/b3/air/AirRegisterPriority.cpp:53:  Place brace on its own line for function definitions.  [whitespace/braces] [4]
ERROR: Source/JavaScriptCore/b3/air/AirRegisterPriority.cpp:72:  Place brace on its own line for function definitions.  [whitespace/braces] [4]
ERROR: Source/JavaScriptCore/b3/air/AirRegisterPriority.cpp:77:  Place brace on its own line for function definitions.  [whitespace/braces] [4]
ERROR: Source/JavaScriptCore/b3/B3ConstDoubleValue.h:43:  The parameter name &quot;proc&quot; adds no information, so it should be removed.  [readability/parameter_name] [5]
ERROR: Source/JavaScriptCore/b3/B3ConstDoubleValue.h:44:  The parameter name &quot;proc&quot; adds no information, so it should be removed.  [readability/parameter_name] [5]
ERROR: Source/JavaScriptCore/b3/B3ConstDoubleValue.h:45:  The parameter name &quot;proc&quot; adds no information, so it should be removed.  [readability/parameter_name] [5]
ERROR: Source/JavaScriptCore/b3/B3ConstDoubleValue.h:46:  The parameter name &quot;proc&quot; adds no information, so it should be removed.  [readability/parameter_name] [5]
ERROR: Source/JavaScriptCore/b3/B3MemoryValue.h:76:  Wrong number of spaces before statement. (expected: 12)  [whitespace/indent] [4]
ERROR: Source/JavaScriptCore/b3/B3MemoryValue.h:77:  Wrong number of spaces before statement. (expected: 12)  [whitespace/indent] [4]
ERROR: Source/JavaScriptCore/b3/B3MemoryValue.h:114:  Wrong number of spaces before statement. (expected: 12)  [whitespace/indent] [4]
ERROR: Source/JavaScriptCore/b3/B3MemoryValue.h:115:  Wrong number of spaces before statement. (expected: 12)  [whitespace/indent] [4]
ERROR: Source/JavaScriptCore/b3/B3Value.h:145:  Missing space before {  [whitespace/braces] [5]
ERROR: Source/JavaScriptCore/b3/B3Value.h:163:  Missing space before {  [whitespace/braces] [5]
ERROR: Source/JavaScriptCore/b3/testb3.cpp:73:  Consider using CHECK_EQ instead of CHECK(a == b)  [readability/check] [2]
ERROR: Source/JavaScriptCore/b3/testb3.cpp:87:  Consider using CHECK_EQ instead of CHECK(a == b)  [readability/check] [2]
ERROR: Source/JavaScriptCore/b3/air/AirLiveness.h:96:  Place brace on its own line for function definitions.  [whitespace/braces] [4]
ERROR: Source/JavaScriptCore/b3/air/AirLiveness.h:106:  Place brace on its own line for function definitions.  [whitespace/braces] [4]
ERROR: Source/JavaScriptCore/b3/air/AirLiveness.h:113:  Place brace on its own line for function definitions.  [whitespace/braces] [4]
ERROR: Source/JavaScriptCore/b3/air/AirSpillEverything.cpp:52:  Place brace on its own line for function definitions.  [whitespace/braces] [4]
ERROR: Source/JavaScriptCore/b3/air/AirSpillEverything.cpp:62:  Place brace on its own line for function definitions.  [whitespace/braces] [4]
ERROR: Source/JavaScriptCore/b3/air/AirSpillEverything.cpp:95:  Place brace on its own line for function definitions.  [whitespace/braces] [4]
ERROR: Source/JavaScriptCore/CMakeLists.txt:87:  Alphabetical sorting problem. &quot;b3/B3ArgumentRegValue.cpp&quot; should be before &quot;b3/air/AirValidate.cpp&quot;.  [list/order] [5]
ERROR: Source/JavaScriptCore/CMakeLists.txt:113:  Alphabetical sorting problem. &quot;b3/B3StackSlotKind.cpp&quot; should be before &quot;b3/B3StackmapSpecial.cpp&quot;.  [list/order] [5]
ERROR: Source/JavaScriptCore/b3/air/AirAllocateStack.cpp:144:  Place brace on its own line for function definitions.  [whitespace/braces] [4]
ERROR: Source/JavaScriptCore/b3/air/AirAllocateStack.cpp:159:  Place brace on its own line for function definitions.  [whitespace/braces] [4]
ERROR: Source/JavaScriptCore/b3/air/AirHandleCalleeSaves.cpp:46:  Place brace on its own line for function definitions.  [whitespace/braces] [4]
ERROR: Source/JavaScriptCore/b3/B3InsertionSet.h:63:  The parameter name &quot;arguments&quot; adds no information, so it should be removed.  [readability/parameter_name] [5]
ERROR: Source/WTF/wtf/ScopedLambda.h:45:  Extra space before ( in function call  [whitespace/parens] [4]
ERROR: Source/WTF/wtf/ScopedLambda.h:65:  Extra space before ( in function call  [whitespace/parens] [4]
ERROR: Source/WTF/wtf/ScopedLambda.h:69:  Extra space before ( in function call  [whitespace/parens] [4]
ERROR: Source/JavaScriptCore/b3/B3CheckSpecial.cpp:124:  Place brace on its own line for function definitions.  [whitespace/braces] [4]
ERROR: Source/JavaScriptCore/b3/B3ControlValue.h:109:  Wrong number of spaces before statement. (expected: 12)  [whitespace/indent] [4]
Total errors found: 39 in 148 files


If any of these errors are false positives, please file a bug against check-webkit-style.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1137289</commentid>
    <comment_count>105</comment_count>
      <attachid>264245</attachid>
    <who name="Filip Pizlo">fpizlo</who>
    <bug_when>2015-10-28 14:29:07 -0700</bug_when>
    <thetext>Created attachment 264245
the patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1137291</commentid>
    <comment_count>106</comment_count>
    <who name="WebKit Commit Bot">commit-queue</who>
    <bug_when>2015-10-28 14:31:45 -0700</bug_when>
    <thetext>Attachment 264245 did not pass style-queue:


ERROR: Source/JavaScriptCore/b3/air/AirInst.h:66:  Missing space before {  [whitespace/braces] [5]
ERROR: Source/JavaScriptCore/b3/air/AirInst.h:111:  Place brace on its own line for function definitions.  [whitespace/braces] [4]
ERROR: Source/JavaScriptCore/b3/air/AirGenerate.cpp:101:  Place brace on its own line for function definitions.  [whitespace/braces] [4]
ERROR: Source/JavaScriptCore/b3/B3GenericFrequentedBlock.h:44:  Wrong number of spaces before statement. (expected: 12)  [whitespace/indent] [4]
ERROR: Source/JavaScriptCore/b3/B3GenericFrequentedBlock.h:45:  Wrong number of spaces before statement. (expected: 12)  [whitespace/indent] [4]
ERROR: Source/JavaScriptCore/b3/B3SwitchCase.h:32:  Alphabetical sorting problem.  [build/include_order] [4]
ERROR: Source/JavaScriptCore/b3/air/AirRegisterPriority.cpp:48:  Place brace on its own line for function definitions.  [whitespace/braces] [4]
ERROR: Source/JavaScriptCore/b3/air/AirRegisterPriority.cpp:53:  Place brace on its own line for function definitions.  [whitespace/braces] [4]
ERROR: Source/JavaScriptCore/b3/air/AirRegisterPriority.cpp:72:  Place brace on its own line for function definitions.  [whitespace/braces] [4]
ERROR: Source/JavaScriptCore/b3/air/AirRegisterPriority.cpp:77:  Place brace on its own line for function definitions.  [whitespace/braces] [4]
ERROR: Source/JavaScriptCore/b3/B3ConstDoubleValue.h:43:  The parameter name &quot;proc&quot; adds no information, so it should be removed.  [readability/parameter_name] [5]
ERROR: Source/JavaScriptCore/b3/B3ConstDoubleValue.h:44:  The parameter name &quot;proc&quot; adds no information, so it should be removed.  [readability/parameter_name] [5]
ERROR: Source/JavaScriptCore/b3/B3ConstDoubleValue.h:45:  The parameter name &quot;proc&quot; adds no information, so it should be removed.  [readability/parameter_name] [5]
ERROR: Source/JavaScriptCore/b3/B3ConstDoubleValue.h:46:  The parameter name &quot;proc&quot; adds no information, so it should be removed.  [readability/parameter_name] [5]
ERROR: Source/JavaScriptCore/b3/B3MemoryValue.h:76:  Wrong number of spaces before statement. (expected: 12)  [whitespace/indent] [4]
ERROR: Source/JavaScriptCore/b3/B3MemoryValue.h:77:  Wrong number of spaces before statement. (expected: 12)  [whitespace/indent] [4]
ERROR: Source/JavaScriptCore/b3/B3MemoryValue.h:114:  Wrong number of spaces before statement. (expected: 12)  [whitespace/indent] [4]
ERROR: Source/JavaScriptCore/b3/B3MemoryValue.h:115:  Wrong number of spaces before statement. (expected: 12)  [whitespace/indent] [4]
ERROR: Source/JavaScriptCore/b3/B3Value.h:145:  Missing space before {  [whitespace/braces] [5]
ERROR: Source/JavaScriptCore/b3/B3Value.h:163:  Missing space before {  [whitespace/braces] [5]
ERROR: Source/JavaScriptCore/b3/testb3.cpp:73:  Consider using CHECK_EQ instead of CHECK(a == b)  [readability/check] [2]
ERROR: Source/JavaScriptCore/b3/testb3.cpp:87:  Consider using CHECK_EQ instead of CHECK(a == b)  [readability/check] [2]
ERROR: Source/JavaScriptCore/b3/air/AirLiveness.h:96:  Place brace on its own line for function definitions.  [whitespace/braces] [4]
ERROR: Source/JavaScriptCore/b3/air/AirLiveness.h:106:  Place brace on its own line for function definitions.  [whitespace/braces] [4]
ERROR: Source/JavaScriptCore/b3/air/AirLiveness.h:113:  Place brace on its own line for function definitions.  [whitespace/braces] [4]
ERROR: Source/JavaScriptCore/b3/air/AirSpillEverything.cpp:52:  Place brace on its own line for function definitions.  [whitespace/braces] [4]
ERROR: Source/JavaScriptCore/b3/air/AirSpillEverything.cpp:62:  Place brace on its own line for function definitions.  [whitespace/braces] [4]
ERROR: Source/JavaScriptCore/b3/air/AirSpillEverything.cpp:95:  Place brace on its own line for function definitions.  [whitespace/braces] [4]
ERROR: Source/JavaScriptCore/CMakeLists.txt:87:  Alphabetical sorting problem. &quot;b3/B3ArgumentRegValue.cpp&quot; should be before &quot;b3/air/AirValidate.cpp&quot;.  [list/order] [5]
ERROR: Source/JavaScriptCore/CMakeLists.txt:113:  Alphabetical sorting problem. &quot;b3/B3StackSlotKind.cpp&quot; should be before &quot;b3/B3StackmapSpecial.cpp&quot;.  [list/order] [5]
ERROR: Source/JavaScriptCore/b3/air/AirAllocateStack.cpp:144:  Place brace on its own line for function definitions.  [whitespace/braces] [4]
ERROR: Source/JavaScriptCore/b3/air/AirAllocateStack.cpp:159:  Place brace on its own line for function definitions.  [whitespace/braces] [4]
ERROR: Source/JavaScriptCore/b3/air/AirHandleCalleeSaves.cpp:46:  Place brace on its own line for function definitions.  [whitespace/braces] [4]
ERROR: Source/JavaScriptCore/b3/B3InsertionSet.h:63:  The parameter name &quot;arguments&quot; adds no information, so it should be removed.  [readability/parameter_name] [5]
ERROR: Source/WTF/wtf/ScopedLambda.h:45:  Extra space before ( in function call  [whitespace/parens] [4]
ERROR: Source/WTF/wtf/ScopedLambda.h:65:  Extra space before ( in function call  [whitespace/parens] [4]
ERROR: Source/WTF/wtf/ScopedLambda.h:69:  Extra space before ( in function call  [whitespace/parens] [4]
ERROR: Source/JavaScriptCore/b3/B3CheckSpecial.cpp:124:  Place brace on its own line for function definitions.  [whitespace/braces] [4]
ERROR: Source/JavaScriptCore/b3/B3ControlValue.h:109:  Wrong number of spaces before statement. (expected: 12)  [whitespace/indent] [4]
Total errors found: 39 in 148 files


If any of these errors are false positives, please file a bug against check-webkit-style.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1137302</commentid>
    <comment_count>107</comment_count>
      <attachid>264251</attachid>
    <who name="Filip Pizlo">fpizlo</who>
    <bug_when>2015-10-28 14:53:22 -0700</bug_when>
    <thetext>Created attachment 264251
the patch

It&apos;s going to take some effort to make EWS happy - I added all of the B3+Air files to CMakeLists since we could do a CMake build on Darwin/x86_64 and then B3 would be enabled.  But as can be seen from the unhappy EWS bots, I&apos;ve done a poor job of this.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1137306</commentid>
    <comment_count>108</comment_count>
    <who name="WebKit Commit Bot">commit-queue</who>
    <bug_when>2015-10-28 14:56:37 -0700</bug_when>
    <thetext>Attachment 264251 did not pass style-queue:


ERROR: Source/JavaScriptCore/b3/air/AirInst.h:66:  Missing space before {  [whitespace/braces] [5]
ERROR: Source/JavaScriptCore/b3/air/AirInst.h:111:  Place brace on its own line for function definitions.  [whitespace/braces] [4]
ERROR: Source/JavaScriptCore/b3/air/AirGenerate.cpp:101:  Place brace on its own line for function definitions.  [whitespace/braces] [4]
ERROR: Source/JavaScriptCore/b3/B3GenericFrequentedBlock.h:44:  Wrong number of spaces before statement. (expected: 12)  [whitespace/indent] [4]
ERROR: Source/JavaScriptCore/b3/B3GenericFrequentedBlock.h:45:  Wrong number of spaces before statement. (expected: 12)  [whitespace/indent] [4]
ERROR: Source/JavaScriptCore/b3/B3SwitchCase.h:32:  Alphabetical sorting problem.  [build/include_order] [4]
ERROR: Source/JavaScriptCore/b3/air/AirRegisterPriority.cpp:48:  Place brace on its own line for function definitions.  [whitespace/braces] [4]
ERROR: Source/JavaScriptCore/b3/air/AirRegisterPriority.cpp:53:  Place brace on its own line for function definitions.  [whitespace/braces] [4]
ERROR: Source/JavaScriptCore/b3/air/AirRegisterPriority.cpp:72:  Place brace on its own line for function definitions.  [whitespace/braces] [4]
ERROR: Source/JavaScriptCore/b3/air/AirRegisterPriority.cpp:77:  Place brace on its own line for function definitions.  [whitespace/braces] [4]
ERROR: Source/JavaScriptCore/b3/B3ConstDoubleValue.h:43:  The parameter name &quot;proc&quot; adds no information, so it should be removed.  [readability/parameter_name] [5]
ERROR: Source/JavaScriptCore/b3/B3ConstDoubleValue.h:44:  The parameter name &quot;proc&quot; adds no information, so it should be removed.  [readability/parameter_name] [5]
ERROR: Source/JavaScriptCore/b3/B3ConstDoubleValue.h:45:  The parameter name &quot;proc&quot; adds no information, so it should be removed.  [readability/parameter_name] [5]
ERROR: Source/JavaScriptCore/b3/B3ConstDoubleValue.h:46:  The parameter name &quot;proc&quot; adds no information, so it should be removed.  [readability/parameter_name] [5]
ERROR: Source/JavaScriptCore/b3/B3MemoryValue.h:76:  Wrong number of spaces before statement. (expected: 12)  [whitespace/indent] [4]
ERROR: Source/JavaScriptCore/b3/B3MemoryValue.h:77:  Wrong number of spaces before statement. (expected: 12)  [whitespace/indent] [4]
ERROR: Source/JavaScriptCore/b3/B3MemoryValue.h:114:  Wrong number of spaces before statement. (expected: 12)  [whitespace/indent] [4]
ERROR: Source/JavaScriptCore/b3/B3MemoryValue.h:115:  Wrong number of spaces before statement. (expected: 12)  [whitespace/indent] [4]
ERROR: Source/JavaScriptCore/b3/B3Value.h:145:  Missing space before {  [whitespace/braces] [5]
ERROR: Source/JavaScriptCore/b3/B3Value.h:163:  Missing space before {  [whitespace/braces] [5]
ERROR: Source/JavaScriptCore/b3/testb3.cpp:73:  Consider using CHECK_EQ instead of CHECK(a == b)  [readability/check] [2]
ERROR: Source/JavaScriptCore/b3/testb3.cpp:87:  Consider using CHECK_EQ instead of CHECK(a == b)  [readability/check] [2]
ERROR: Source/JavaScriptCore/b3/air/AirLiveness.h:96:  Place brace on its own line for function definitions.  [whitespace/braces] [4]
ERROR: Source/JavaScriptCore/b3/air/AirLiveness.h:106:  Place brace on its own line for function definitions.  [whitespace/braces] [4]
ERROR: Source/JavaScriptCore/b3/air/AirLiveness.h:113:  Place brace on its own line for function definitions.  [whitespace/braces] [4]
ERROR: Source/JavaScriptCore/b3/air/AirSpillEverything.cpp:52:  Place brace on its own line for function definitions.  [whitespace/braces] [4]
ERROR: Source/JavaScriptCore/b3/air/AirSpillEverything.cpp:62:  Place brace on its own line for function definitions.  [whitespace/braces] [4]
ERROR: Source/JavaScriptCore/b3/air/AirSpillEverything.cpp:95:  Place brace on its own line for function definitions.  [whitespace/braces] [4]
ERROR: Source/JavaScriptCore/CMakeLists.txt:87:  Alphabetical sorting problem. &quot;b3/B3ArgumentRegValue.cpp&quot; should be before &quot;b3/air/AirValidate.cpp&quot;.  [list/order] [5]
ERROR: Source/JavaScriptCore/CMakeLists.txt:113:  Alphabetical sorting problem. &quot;b3/B3StackSlotKind.cpp&quot; should be before &quot;b3/B3StackmapSpecial.cpp&quot;.  [list/order] [5]
ERROR: Source/JavaScriptCore/b3/air/AirAllocateStack.cpp:144:  Place brace on its own line for function definitions.  [whitespace/braces] [4]
ERROR: Source/JavaScriptCore/b3/air/AirAllocateStack.cpp:159:  Place brace on its own line for function definitions.  [whitespace/braces] [4]
ERROR: Source/JavaScriptCore/b3/air/AirHandleCalleeSaves.cpp:46:  Place brace on its own line for function definitions.  [whitespace/braces] [4]
ERROR: Source/JavaScriptCore/b3/B3InsertionSet.h:63:  The parameter name &quot;arguments&quot; adds no information, so it should be removed.  [readability/parameter_name] [5]
ERROR: Source/WTF/wtf/ScopedLambda.h:45:  Extra space before ( in function call  [whitespace/parens] [4]
ERROR: Source/WTF/wtf/ScopedLambda.h:65:  Extra space before ( in function call  [whitespace/parens] [4]
ERROR: Source/WTF/wtf/ScopedLambda.h:69:  Extra space before ( in function call  [whitespace/parens] [4]
ERROR: Source/JavaScriptCore/b3/B3CheckSpecial.cpp:124:  Place brace on its own line for function definitions.  [whitespace/braces] [4]
ERROR: Source/JavaScriptCore/b3/B3ControlValue.h:109:  Wrong number of spaces before statement. (expected: 12)  [whitespace/indent] [4]
Total errors found: 39 in 148 files


If any of these errors are false positives, please file a bug against check-webkit-style.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1137337</commentid>
    <comment_count>109</comment_count>
    <who name="Benjamin Poulain">benjamin</who>
    <bug_when>2015-10-28 16:00:01 -0700</bug_when>
    <thetext>View in context: https://bugs.webkit.org/attachment.cgi?id=264236&amp;action=review

Let&apos;s land and iterate.

&gt; Source/JavaScriptCore/b3/B3ReduceStrength.cpp:81
&gt; +            if (m_value-&gt;child(0)-&gt;opcode() == Add &amp;&amp; isInt(m_value-&gt;type())) {

Comments would be good over each case of replaceWithNewValue. Finding the optimization by reading the conditions is non-trivial.

Alternatively, the pattern matcher could be useful here. You could have name for every optimization.

&gt; Source/JavaScriptCore/b3/B3ReduceStrength.cpp:127
&gt; +                        address = memory-&gt;children().last() = address-&gt;child(0);

Should be two statements.

&gt; Source/JavaScriptCore/b3/B3ReduceStrength.cpp:141
&gt; +                    address = memory-&gt;children().last() = newAddress;

ditto

&gt; Source/WTF/ChangeLog:16
&gt; +

The changelog is not up to date...Not that I give a shit about file lists in ChangeLog :)

&gt; Source/WTF/wtf/ListDump.h:58
&gt; +    PointerListDump(const T&amp; list, const char* comma)

comma -&gt; separator in the whole class?

&gt; Source/WTF/wtf/ListDump.h:66
&gt; +        for (typename T::const_iterator iter = m_list.begin(); iter != m_list.end(); ++iter)

&quot;auto&quot; should be fine instead of &quot;T::const_iterator&quot;. It would make the template more flexible.

&gt; Source/WTF/wtf/ListDump.h:67
&gt; +            out.print(m_comma, pointerDump(*iter));

Is it expected to put the comma/separator in front of the first value?

&gt; Source/WTF/wtf/MathExtras.h:428
&gt; +{

ASSERT(leftMin &lt;= leftMax);
ASSERT(rightMin &lt;= rightMax);</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1137338</commentid>
    <comment_count>110</comment_count>
      <attachid>264251</attachid>
    <who name="Benjamin Poulain">benjamin</who>
    <bug_when>2015-10-28 16:00:31 -0700</bug_when>
    <thetext>Comment on attachment 264251
the patch

Okay, let&apos;s land and iterate.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1137351</commentid>
    <comment_count>111</comment_count>
    <who name="Filip Pizlo">fpizlo</who>
    <bug_when>2015-10-28 16:35:15 -0700</bug_when>
    <thetext>(In reply to comment #109)
&gt; View in context:
&gt; https://bugs.webkit.org/attachment.cgi?id=264236&amp;action=review
&gt; 
&gt; Let&apos;s land and iterate.
&gt; 
&gt; &gt; Source/JavaScriptCore/b3/B3ReduceStrength.cpp:81
&gt; &gt; +            if (m_value-&gt;child(0)-&gt;opcode() == Add &amp;&amp; isInt(m_value-&gt;type())) {
&gt; 
&gt; Comments would be good over each case of replaceWithNewValue. Finding the
&gt; optimization by reading the conditions is non-trivial.

Done.

&gt; 
&gt; Alternatively, the pattern matcher could be useful here. You could have name
&gt; for every optimization.
&gt; 
&gt; &gt; Source/JavaScriptCore/b3/B3ReduceStrength.cpp:127
&gt; &gt; +                        address = memory-&gt;children().last() = address-&gt;child(0);
&gt; 
&gt; Should be two statements.

Done.

&gt; 
&gt; &gt; Source/JavaScriptCore/b3/B3ReduceStrength.cpp:141
&gt; &gt; +                    address = memory-&gt;children().last() = newAddress;
&gt; 
&gt; ditto

Done.

&gt; 
&gt; &gt; Source/WTF/ChangeLog:16
&gt; &gt; +
&gt; 
&gt; The changelog is not up to date...Not that I give a shit about file lists in
&gt; ChangeLog :)

I&apos;ll update.

&gt; 
&gt; &gt; Source/WTF/wtf/ListDump.h:58
&gt; &gt; +    PointerListDump(const T&amp; list, const char* comma)
&gt; 
&gt; comma -&gt; separator in the whole class?

We have this jargon in the ListDump and CommaPrinter that &quot;comma&quot; means &quot;separator&quot;.  I&apos;ll keep it consistent for now.

&gt; 
&gt; &gt; Source/WTF/wtf/ListDump.h:66
&gt; &gt; +        for (typename T::const_iterator iter = m_list.begin(); iter != m_list.end(); ++iter)
&gt; 
&gt; &quot;auto&quot; should be fine instead of &quot;T::const_iterator&quot;. It would make the
&gt; template more flexible.

Fixed.

&gt; 
&gt; &gt; Source/WTF/wtf/ListDump.h:67
&gt; &gt; +            out.print(m_comma, pointerDump(*iter));
&gt; 
&gt; Is it expected to put the comma/separator in front of the first value?

CommaPrinter magically omits the first comma.

&gt; 
&gt; &gt; Source/WTF/wtf/MathExtras.h:428
&gt; &gt; +{
&gt; 
&gt; ASSERT(leftMin &lt;= leftMax);
&gt; ASSERT(rightMin &lt;= rightMax);

Done.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1137369</commentid>
    <comment_count>112</comment_count>
    <who name="Filip Pizlo">fpizlo</who>
    <bug_when>2015-10-28 17:19:44 -0700</bug_when>
    <thetext>Landed in http://trac.webkit.org/changeset/191705</thetext>
  </long_desc>
      
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>263377</attachid>
            <date>2015-10-17 11:23:07 -0700</date>
            <delta_ts>2015-10-17 18:20:59 -0700</delta_ts>
            <desc>it&apos;s a start</desc>
            <filename>blah.patch</filename>
            <type>text/plain</type>
            <size>13073</size>
            <attacher name="Filip Pizlo">fpizlo</attacher>
            
              <data encoding="base64">SW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM09wY29kZS5jcHAKPT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQot
LS0gU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzT3Bjb2RlLmNwcAkocmV2aXNpb24gMCkKKysr
IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM09wY29kZS5jcHAJKHdvcmtpbmcgY29weSkKQEAg
LTAsMCArMSw0NyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNSBBcHBsZSBJbmMuIEFsbCBy
aWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2Ug
YW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBw
ZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBt
ZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhl
IGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBh
bmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJp
bmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGlj
ZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBp
biB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRl
ZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURF
RCBCWSBBUFBMRSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQg
V0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElF
RCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNV
TEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUg
SU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJF
Q1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwg
REFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBP
RiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAq
IFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9O
IEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNU
IExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lT
RSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJF
LCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLiAKKyAq
LworCisjaW5jbHVkZSAiY29uZmlnLmgiCisjaW5jbHVkZSAiQjNPcGNvZGUuaCIKKworI2luY2x1
ZGUgPHd0Zi9QcmludFN0cmVhbS5oPgorCituYW1lc3BhY2UgV1RGIHsKKwordXNpbmcgbmFtZXNw
YWNlIEpTQzo6QjM7CisKK3ZvaWQgcHJpbnRJbnRlcm5hbChQcmludFN0cmVhbSYgb3V0LCBPcGNv
ZGUgb3Bjb2RlKQoreworICAgIHN3aXRjaCAob3Bjb2RlKSB7CisgICAgY2FzZSBJZGVudGl0eToK
KyAgICAgICAgb3V0LnByaW50KCJJZGVudGl0eSIpOworICAgICAgICByZXR1cm47CisgICAgICAg
IC8vIEZJWE1FCisgICAgfQorICAgIFJFTEVBU0VfQVNTRVJUX05PVF9SRUFDSEVEKCk7Cit9CisK
K30gLy8gbmFtZXNwYWNlIFdURgorCkluZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNP
cGNvZGUuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNPcGNvZGUu
aAkocmV2aXNpb24gMCkKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM09wY29kZS5oCSh3
b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsMTQ2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE1
IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBh
bmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1v
ZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29u
ZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29k
ZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlz
dCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRp
c3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHly
aWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxv
d2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIg
bWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNP
RlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVY
UFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBU
TywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRO
RVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBF
VkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBB
TlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwg
T1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywK
KyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0Yg
VVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dF
VkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElO
IENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJ
R0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAq
IE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0Yg
U1VDSCBEQU1BR0UuIAorICovCisKKyNpZm5kZWYgQjNPcGNvZGVfaAorI2RlZmluZSBCM09wY29k
ZV9oCisKK25hbWVzcGFjZSBKU0MgeyBuYW1lc3BhY2UgQjMgeworCitlbnVtIE9wY29kZSB7Cisg
ICAgLy8gUG9seW1vcnBoaWMgaWRlbnRpdHksIHVzYWJsZSB3aXRoIGFueSB2YWx1ZSB0eXBlLgor
ICAgIElkZW50aXR5LAorCisgICAgLy8gQ29uc3RhbnRzLiBVc2UgdGhlIENvbnN0YW50IGNsYXNz
LgorICAgIC8vIEZJWE1FOiBTaG91bGQgd2UgaG9pc3QgY29uc3RhbnRzIGludG8gYSBjb25zdGFu
dCBwb29sLCBvciBwbGFjZSB0aGVtIGluIHRoZSBwcm9ncmFtPworICAgIENvbnN0MzIsCisgICAg
Q29uc3Q2NCwKKyAgICBDb25zdERvdWJsZSwKKworICAgIC8vIFBvbHltb3JwaGljIG1hdGgsIHVz
YWJsZSB3aXRoIGFueSB2YWx1ZSB0eXBlLgorICAgIEFkZCwKKyAgICBTdWIsCisgICAgTXVsLAor
ICAgIERpdiwKKworICAgIC8vIEludGVnZXIgbWF0aC4KKyAgICBDaGlsbERpdiwgLy8gZG9lc24n
dCB0cmFwIGV2ZXIsIGJlaGF2ZXMgbGlrZSBKUyAoeC95KXwwLgorICAgIE1vZCwKKyAgICBCaXRB
bmQsCisgICAgQml0T3IsCisgICAgQml0WG9yLAorICAgIFNobCwKKyAgICBBU2hyLAorICAgIExT
aHIsCisKKyAgICAvLyBDYXN0cyBhbmQgc3VjaC4KKyAgICAvLyBUYWtlcyBhbmQgcmV0dXJucyBJ
bnQzMjoKKyAgICBTRXh0OCwKKyAgICBTRXh0MTYsCisgICAgLy8gVGFrZXMgSW50MzIgYW5kIHJl
dHVybnMgSW50NjQ6CisgICAgU0V4dDMyLAorICAgIFpFeHQzMiwKKyAgICAvLyBUYWtlcyBhbmQg
cmV0dXJucyBEb3VibGU6CisgICAgRlJvdW5kLAorICAgIC8vIFRha2VzIGludHMgYW5kIHJldHVy
bnMgRG91YmxlOgorICAgIElUb0QsCisgICAgLy8gVGFrZXMgRG91YmxlIGFuZCByZXR1cm5zIElu
dDMyOgorICAgIERUb0kzMiwKKworICAgIC8vIFBvbHltb3JwaGljIGNvbXBhcmlzb25zLCB1c2Fi
bGUgd2l0aCBhbnkgdmFsdWUgdHlwZS4gUmV0dXJucyBpbnQzMiAwIG9yIDEuIE5vdGUgdGhhdCAi
Tm90IgorICAgIC8vIGlzIGp1c3QgRXF1YWwoeCwgMCkuCisgICAgRXF1YWwsCisgICAgTm90RXF1
YWwsCisgICAgTGVzc1RoYW4sCisgICAgR3JlYXRlclRoYW4sCisgICAgTGVzc0VxdWFsLAorICAg
IEdyZWF0ZXJFcXVhbCwKKworICAgIC8vIEludGVnZXIgY29tcGFyaXNvbnMuIFJldHVybnMgaW50
MzIgMCBvciAxLgorICAgIEFib3ZlLAorICAgIEJlbG93LAorICAgIEFib3ZlRXF1YWwKKyAgICBC
ZWxvd0VxdWFsLAorCisgICAgLy8gTWVtb3J5IGxvYWRzLiBPcGNvZGUgaW5kaWNhdGVzIGhvdyB3
ZSBsb2FkIGFuZCB0aGUgbG9hZGVkIHR5cGUuCisgICAgLy8gVGhlc2UgcmV0dXJuIEludDMyOgor
ICAgIExvYWQ4WiwKKyAgICBMb2FkOFMsCisgICAgTG9hZDE2WiwKKyAgICBMb2FkMTZTLAorICAg
IExvYWQzMiwKKyAgICAvLyBUaGlzIHJldHVybnMgSW50NjQ6CisgICAgTG9hZDY0LAorICAgIC8v
IFRoZXNlIHJldHVybiBEb3VibGU6CisgICAgTG9hZEZsb2F0LAorICAgIExvYWREb3VibGUsCisK
KyAgICAvLyBNZW1vcnkgc3RvcmVzLiBPcGNvZGUgaW5kaWNhdGVzIGhvdyB0aGUgdmFsdWUgaXMg
c3RvcmVkLgorICAgIC8vIFRoZXNlIHRha2UgYW4gSW50MzIgdmFsdWU6CisgICAgU3RvcmU4LAor
ICAgIFN0b3JlMTYsCisgICAgU3RvcmUzMiwKKyAgICAvLyBUaGlzIHRha2VzIGEgSW50NjQgdmFs
dWU6CisgICAgU3RvcmU2NCwKKyAgICAvLyBUaGVzZSB0YWtlIGEgRG91YmxlIHZhbHVlOgorICAg
IFN0b3JlRmxvYXQsCisgICAgU3RvcmVEb3VibGUsCisKKyAgICAvLyBUaGlzIGlzIGEgcmVndWxh
ciBvcmRpbmFyeSBDIGZ1bmN0aW9uIGNhbGwsIHVzaW5nIHRoZSBzeXN0ZW0gQyBjYWxsaW5nIGNv
bnZlbnRpb24uIE1ha2Ugc3VyZQorICAgIC8vIHRoYXQgdGhlIGFyZ3VtZW50cyBhcmUgcGFzc2Vk
IHVzaW5nIHRoZSByaWdodCB0eXBlcy4KKyAgICBDQ2FsbCwKKworICAgIC8vIFRoaXMgaXMgYSBw
YXRjaHBvaW50LiBVc2UgdGhlIFBhdGNocG9pbnQgY2xhc3MuCisgICAgUGF0Y2hwb2ludCwKKwor
ICAgIC8vIEp1bXAuIFVzZXMgdGhlIEp1bXAgY2xhc3MuCisgICAgSnVtcCwKKyAgICAKKyAgICAv
LyBQb2x5bW9ycGhpYyBicmFuY2gsIHVzYWJsZSB3aXRoIGFueSB2YWx1ZSB0eXBlLiBCcmFuY2hl
cyBpZiBub3QgZXF1YWwgdG8gemVyby4gVXNlcyB0aGUKKyAgICAvLyBCcmFuY2ggY2xhc3MuCisg
ICAgQnJhbmNoLAorCisgICAgLy8gU3dpdGNoLiBTd2l0Y2hlcyBvdmVyIGVpdGhlciBJbnQzMiBv
ciBJbnQ2NC4gVXNlcyB0aGUgU3dpdGNoIGNsYXNzLgorICAgIFN3aXRjaCwKKworICAgIC8vIFJl
dHVybi4gTm90ZSB0aGF0IEIzIHByb2NlZHVyZXMgZG9uJ3Qga25vdyB0aGVpciByZXR1cm4gdHlw
ZSwgc28gdGhpcyBjYW4ganVzdCByZXR1cm4gYW55CisgICAgLy8gdHlwZS4KKyAgICBSZXR1cm4s
CisKKyAgICAvLyBUaGlzIGlzIGEgdGVybWluYWwgdGhhdCBpbmRpY2F0ZXMgdGhhdCB3ZSB3aWxs
IG5ldmVyIGdldCBoZXJlLgorICAgIE9vcHMKK307CisKK30gfSAvLyBuYW1lc3BhY2UgSlNDOjpC
MworCituYW1lc3BhY2UgV1RGIHsKKworY2xhc3MgUHJpbnRTdHJlYW07CisKK3ZvaWQgcHJpbnRJ
bnRlcm5hbChQcmludFN0cmVhbSYsIEpTQzo6QjM6Ok9wY29kZSk7CisKK30gLy8gbmFtZXNwYWNl
IFdURgorCisjZW5kaWYgLy8gQjNPcGNvZGVfaAorCkluZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENv
cmUvYjMvQjNUeXBlLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMv
QjNUeXBlLmNwcAkocmV2aXNpb24gMCkKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM1R5
cGUuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsNTQgQEAKKy8qCisgKiBDb3B5cmlnaHQg
KEMpIDIwMTUgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJp
YnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91
dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxv
d2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNv
dXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwg
dGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAq
IDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJv
dmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0
aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9v
ciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAq
IFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFTIElTJycgQU5EIEFO
WQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBM
SU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkg
QU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4g
IElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFC
TEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhF
TVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1J
VEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsg
TE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJ
T04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdI
RVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJ
TkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhF
IFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJ
TElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKworI2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1
ZGUgIkIzVHlwZS5oIgorCisjaW5jbHVkZSA8d3RmL1ByaW50U3RyZWFtLmg+CisKK25hbWVzcGFj
ZSBXVEYgeworCit1c2luZyBuYW1lc3BhY2UgSlNDOjpCMzsKKwordm9pZCBwcmludEludGVybmFs
KFByaW50U3RyZWFtJiBvdXQsIFR5cGUgdHlwZSkKK3sKKyAgICBzd2l0Y2ggKHR5cGUpIHsKKyAg
ICBjYXNlIFZvaWQ6CisgICAgICAgIG91dC5wcmludCgiVm9pZCIpOworICAgICAgICByZXR1cm47
CisgICAgY2FzZSBJbnQzMjoKKyAgICAgICAgb3V0LnByaW50KCJJbnQzMiIpOworICAgICAgICBy
ZXR1cm47CisgICAgY2FzZSBJbnQ2NDoKKyAgICAgICAgb3V0LnByaW50KCJJbnQ2NCIpOworICAg
ICAgICByZXR1cm47CisgICAgY2FzZSBEb3VibGU6CisgICAgICAgIG91dC5wcmludCgiRG91Ymxl
Iik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgUkVMRUFTRV9BU1NFUlRfTk9UX1JFQUNI
RUQoKTsKK30KKworfSAvLyBuYW1lc3BhY2UgV1RGCkluZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENv
cmUvYjMvQjNUeXBlLmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0Iz
VHlwZS5oCShyZXZpc2lvbiAwKQorKysgU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzVHlwZS5o
CSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsNTYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIw
MTUgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9u
IGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICog
bW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBj
b25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBj
b2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBs
aXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJl
ZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29w
eXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9s
bG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhl
ciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMg
U09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICog
RVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVE
IFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJ
VE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5P
IEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9S
IEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZ
LCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRP
LAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBP
RiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhP
V0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIg
SU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVH
TElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQor
ICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBP
RiBTVUNIIERBTUFHRS4gCisgKi8KKworI2lmbmRlZiBCM1R5cGVfaAorI2RlZmluZSBCM1R5cGVf
aAorCituYW1lc3BhY2UgSlNDIHsgbmFtZXNwYWNlIEIzIHsKKworZW51bSBUeXBlIHsKKyAgICBW
b2lkLAorICAgIEludDMyLAorICAgIEludDY0LAorICAgIERvdWJsZQorfTsKKworVHlwZSBwb2lu
dGVyKCkgY29uc3QKK3sKKyAgICBpZiAoc2l6ZW9mKHZvaWQqKSA9PSA0KQorICAgICAgICByZXR1
cm4gSW50MzI7CisgICAgcmV0dXJuIEludDY0OworfQorCit9IH0gLy8gbmFtZXNwYWNlIEpTQzo6
QjMKKworbmFtZXNwYWNlIFdURiB7CisKK2NsYXNzIFByaW50U3RyZWFtOworCit2b2lkIHByaW50
SW50ZXJuYWwoUHJpbnRTdHJlYW0mLCBKU0M6OkIzOjpUeXBlKTsKKworfSAvLyBuYW1lc3BhY2Ug
V1RGCisKKyNlbmRpZiAvLyBCM1R5cGVfaAorCkluZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUv
YjMvQjNWYWx1ZS5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM1Zh
bHVlLmgJKHJldmlzaW9uIDApCisrKyBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNWYWx1ZS5o
CSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsNzEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIw
MTUgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9u
IGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICog
bW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBj
b25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBj
b2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBs
aXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJl
ZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29w
eXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9s
bG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhl
ciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMg
U09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICog
RVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVE
IFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJ
VE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5P
IEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9S
IEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZ
LCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRP
LAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBP
RiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhP
V0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIg
SU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVH
TElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQor
ICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBP
RiBTVUNIIERBTUFHRS4gCisgKi8KKworI2lmbmRlZiBCM1ZhbHVlX2gKKyNkZWZpbmUgQjNWYWx1
ZV9oCisKKyNpbmNsdWRlIDx3dGYvRmFzdE1hbGxvYy5oPgorI2luY2x1ZGUgPHd0Zi9Ob25jb3B5
YWJsZS5oPgorCituYW1lc3BhY2UgSlNDIHsgbmFtZXNwYWNlIEIzIHsKKworY2xhc3MgVmFsdWUg
eworICAgIFdURl9NQUtFX05PTkNPUFlBQkxFKFZhbHVlKTsKKyAgICBXVEZfTUFLRV9GQVNUX0FM
TE9DQVRFRDsKK3B1YmxpYzoKKyAgICB0eXBlZGVmIFZlY3RvcjxWYWx1ZSwgMz4gQWRqYWNlbmN5
TGlzdDsKKworICAgIHZpcnR1YWwgflZhbHVlKCk7CisgICAgCisgICAgLy8gTm90ZSB0aGF0IHRo
ZSBvcGNvZGUgaXMgaW1tdXRhYmxlLCBleGNlcHQgZm9yIHJlcGxhY2luZyB2YWx1ZXMgd2l0aCBp
ZGVudGl0eS4KKyAgICBPcGNvZGUgb3Bjb2RlKCkgY29uc3QgeyByZXR1cm4gbV9vcGNvZGU7IH0K
KyAgICAKKyAgICBWYWx1ZSomIGNoaWxkKHVuc2lnbmVkIGluZGV4KSB7IHJldHVybiBtX2NoaWxk
cmVuW2luZGV4XTsgfQorICAgIFZhbHVlKiBjaGlsZCh1bnNpZ25lZCBpbmRleCkgY29uc3QgeyBy
ZXR1cm4gbV9jaGlsZHJlbltpbmRleF07IH0KKworICAgIC8vIFRoaXMgY29tcHV0ZXMgdGhlIHR5
cGUgdXNpbmcgdGhlIG9wY29kZS4KKyAgICBUeXBlIHR5cGUoKSBjb25zdDsKKworICAgIEFkamFj
ZW5jeUxpc3QmIGNoaWxkcmVuKCkgeyByZXR1cm4gbV9jaGlsZHJlbjsgfSAKKyAgICBjb25zdCBB
ZGphY2VuY3lMaXN0JiBjaGlsZHJlbigpIGNvbnN0IHsgcmV0dXJuIG1fY2hpbGRyZW47IH0KKwor
ICAgIHZvaWQgcmVwbGFjZVdpdGhJZGVudGl0eShWYWx1ZSopOworICAgIAorcHJpdmF0ZToKKyAg
ICAvLyBJbnN0YW50aWF0ZSB2YWx1ZXMgdmlhIFByb2NlZHVyZS4KKyAgICB0ZW1wbGF0ZTx0eXBl
bmFtZS4uLiBBcmd1bWVudHM+CisgICAgZXhwbGljaXQgVmFsdWUoT3Bjb2RlIG9wY29kZSwgQXJn
dW1lbnRzLi4uIGFyZ3VtZW50cykKKyAgICAgICAgOiBtX29wY29kZShvcGNvZGUpCisgICAgICAg
ICwgbV9jaGlsZHJlbnsgYXJndW1lbnRzLi4uIH0KKyAgICB7CisgICAgfQorCisgICAgQWRqYWNl
bmN5TGlzdCBtX2NoaWxkcmVuOworfTsKKworfSB9IC8vIG5hbWVzcGFjZSBKU0M6OkIzCisKKyNl
bmRpZiAvLyBCM1ZhbHVlX2gKKwo=
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>263397</attachid>
            <date>2015-10-17 18:20:59 -0700</date>
            <delta_ts>2015-10-17 19:54:00 -0700</delta_ts>
            <desc>more</desc>
            <filename>blah.patch</filename>
            <type>text/plain</type>
            <size>19389</size>
            <attacher name="Filip Pizlo">fpizlo</attacher>
            
              <data encoding="base64">SW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM09wY29kZS5jcHAKPT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQot
LS0gU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzT3Bjb2RlLmNwcAkocmV2aXNpb24gMCkKKysr
IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM09wY29kZS5jcHAJKHdvcmtpbmcgY29weSkKQEAg
LTAsMCArMSw0NyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNSBBcHBsZSBJbmMuIEFsbCBy
aWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2Ug
YW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBw
ZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBt
ZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhl
IGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBh
bmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJp
bmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGlj
ZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBp
biB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRl
ZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURF
RCBCWSBBUFBMRSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQg
V0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElF
RCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNV
TEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUg
SU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJF
Q1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwg
REFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBP
RiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAq
IFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9O
IEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNU
IExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lT
RSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJF
LCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLiAKKyAq
LworCisjaW5jbHVkZSAiY29uZmlnLmgiCisjaW5jbHVkZSAiQjNPcGNvZGUuaCIKKworI2luY2x1
ZGUgPHd0Zi9QcmludFN0cmVhbS5oPgorCituYW1lc3BhY2UgV1RGIHsKKwordXNpbmcgbmFtZXNw
YWNlIEpTQzo6QjM7CisKK3ZvaWQgcHJpbnRJbnRlcm5hbChQcmludFN0cmVhbSYgb3V0LCBPcGNv
ZGUgb3Bjb2RlKQoreworICAgIHN3aXRjaCAob3Bjb2RlKSB7CisgICAgY2FzZSBJZGVudGl0eToK
KyAgICAgICAgb3V0LnByaW50KCJJZGVudGl0eSIpOworICAgICAgICByZXR1cm47CisgICAgICAg
IC8vIEZJWE1FCisgICAgfQorICAgIFJFTEVBU0VfQVNTRVJUX05PVF9SRUFDSEVEKCk7Cit9CisK
K30gLy8gbmFtZXNwYWNlIFdURgorCkluZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNP
cGNvZGUuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNPcGNvZGUu
aAkocmV2aXNpb24gMCkKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM09wY29kZS5oCSh3
b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsMTgwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE1
IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBh
bmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1v
ZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29u
ZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29k
ZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlz
dCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRp
c3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHly
aWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxv
d2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIg
bWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNP
RlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVY
UFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBU
TywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRO
RVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBF
VkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBB
TlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwg
T1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywK
KyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0Yg
VVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dF
VkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElO
IENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJ
R0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAq
IE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0Yg
U1VDSCBEQU1BR0UuIAorICovCisKKyNpZm5kZWYgQjNPcGNvZGVfaAorI2RlZmluZSBCM09wY29k
ZV9oCisKK25hbWVzcGFjZSBKU0MgeyBuYW1lc3BhY2UgQjMgeworCitlbnVtIE9wY29kZSB7Cisg
ICAgLy8gUG9seW1vcnBoaWMgaWRlbnRpdHksIHVzYWJsZSB3aXRoIGFueSB2YWx1ZSB0eXBlLgor
ICAgIElkZW50aXR5LAorCisgICAgLy8gQ29uc3RhbnRzLiBVc2UgdGhlIENvbnN0YW50VmFsdWUg
Y2xhc3MuIENvbnN0YW50cyBleGlzdCBpbiB0aGUgY29udHJvbCBmbG93LCBzbyB0aGF0IHdlIGNh
bgorICAgIC8vIHJlYXNvbiBhYm91dCB3aGVyZSB3ZSB3b3VsZCBjb25zdHJ1Y3QgdGhlbS4gTGFy
Z2UgY29uc3RhbnRzIGFyZSBleHBlbnNpdmUgdG8gY3JlYXRlLgorICAgIENvbnN0MzIsCisgICAg
Q29uc3Q2NCwKKyAgICBDb25zdERvdWJsZSwKKworICAgIC8vIFRoZSBtYWdpY2FsIHN0YWNrIHNs
b3QuIFRoaXMgaXMgdmlld2VkIGFzIGV4ZWN1dGluZyBhdCB0aGUgdG9wIG9mIHRoZSBwcm9ncmFt
IHJlZ2FyZGxlc3Mgb2YKKyAgICAvLyB3aGVyZSBpbiBjb250cm9sIGZsb3cgeW91IHB1dCBpdC4g
RWFjaCBpbnN0YW5jZSBvZiBhIFN0YWNrU2xvdCBWYWx1ZSBnZXRzIGEgZGlzam9pbnQgcmFuZ2Ug
b2YKKyAgICAvLyBzdGFjayBtZW1vcnkuIFVzZSB0aGUgU3RhY2tTbG90VmFsdWUgY2xhc3MuCisg
ICAgU3RhY2tTbG90LAorCisgICAgLy8gVGhlIG1hZ2ljYWwgYXJndW1lbnQgcmVnaXN0ZXIuIFRo
aXMgaXMgdmlld2VkIGFzIGV4ZWN1dGluZyBhdCB0aGUgdG9wIG9mIHRoZSBwcm9ncmFtCisgICAg
Ly8gcmVnYXJkbGVzcyBvZiB3aGVyZSBpbiBjb250cm9sIGZsb3cgeW91IHB1dCBpdCwgYW5kIHRo
ZSBjb21waWxlciB0YWtlcyBjYXJlIHRvIGVuc3VyZSB0aGF0IHdlCisgICAgLy8gZG9uJ3QgY2xv
YmJlciB0aGUgdmFsdWUgYnkgcmVnaXN0ZXIgYWxsb2NhdGlvbiBvciBjYWxscyAoZWl0aGVyIGJ5
IHNhdmluZyB0aGUgYXJndW1lbnQgdG8gdGhlCisgICAgLy8gc3RhY2sgb3IgcHJlc2VydmluZyBp
dCBpbiBhIGNhbGxlZS1zYXZlIHJlZ2lzdGVyKS4gVXNlIHRoZSBBcmd1bWVudFJlZ1ZhbHVlIGNs
YXNzLgorICAgIEFyZ3VtZW50UmVnLAorCisgICAgLy8gVGhlIGZyYW1lIHBvaW50ZXIuIFlvdSBj
YW4gcHV0IHRoaXMgYW55d2hlcmUgaW4gY29udHJvbCBmbG93IGJ1dCBpdCB3aWxsIGFsd2F5cyB5
aWVsZCB0aGUKKyAgICAvLyBmcmFtZSBwb2ludGVyLCB3aXRoIGEgY2F2ZWF0OiBpZiBvdXIgY29t
cGlsZXIgY2hhbmdlcyB0aGUgZnJhbWUgcG9pbnRlciB0ZW1wb3JhcmlseSBmb3Igc29tZQorICAg
IC8vIHNpbGx5IHJlYXNvbiwgdGhlIEZyYW1lUG9pbnRlciBpbnRyaW5zaWMgd2lsbCByZXR1cm4g
d2hlcmUgdGhlIGZyYW1lIHBvaW50ZXIgKnNob3VsZCogYmUgbm90CisgICAgLy8gd2hlcmUgaXQg
aGFwcGVucyB0byBiZSByaWdodCBub3cuCisgICAgRnJhbWVQb2ludGVyLAorCisgICAgLy8gUG9s
eW1vcnBoaWMgbWF0aCwgdXNhYmxlIHdpdGggYW55IHZhbHVlIHR5cGUuCisgICAgQWRkLAorICAg
IFN1YiwKKyAgICBNdWwsCisgICAgRGl2LAorCisgICAgLy8gSW50ZWdlciBtYXRoLgorICAgIENo
aWxsRGl2LCAvLyBkb2Vzbid0IHRyYXAgZXZlciwgYmVoYXZlcyBsaWtlIEpTICh4L3kpfDAuCisg
ICAgTW9kLAorICAgIEJpdEFuZCwKKyAgICBCaXRPciwKKyAgICBCaXRYb3IsCisgICAgU2hsLAor
ICAgIEFTaHIsCisgICAgTFNociwKKworICAgIC8vIENhc3RzIGFuZCBzdWNoLgorICAgIC8vIFRh
a2VzIGFuZCByZXR1cm5zIEludDMyOgorICAgIFNFeHQ4LAorICAgIFNFeHQxNiwKKyAgICAvLyBU
YWtlcyBJbnQzMiBhbmQgcmV0dXJucyBJbnQ2NDoKKyAgICBTRXh0MzIsCisgICAgWkV4dDMyLAor
ICAgIC8vIFRha2VzIGFuZCByZXR1cm5zIERvdWJsZToKKyAgICBGUm91bmQsCisgICAgLy8gVGFr
ZXMgaW50cyBhbmQgcmV0dXJucyBEb3VibGU6CisgICAgSVRvRCwKKyAgICAvLyBUYWtlcyBEb3Vi
bGUgYW5kIHJldHVybnMgSW50MzI6CisgICAgRFRvSTMyLAorCisgICAgLy8gUG9seW1vcnBoaWMg
Y29tcGFyaXNvbnMsIHVzYWJsZSB3aXRoIGFueSB2YWx1ZSB0eXBlLiBSZXR1cm5zIGludDMyIDAg
b3IgMS4gTm90ZSB0aGF0ICJOb3QiCisgICAgLy8gaXMganVzdCBFcXVhbCh4LCAwKS4KKyAgICBF
cXVhbCwKKyAgICBOb3RFcXVhbCwKKyAgICBMZXNzVGhhbiwKKyAgICBHcmVhdGVyVGhhbiwKKyAg
ICBMZXNzRXF1YWwsCisgICAgR3JlYXRlckVxdWFsLAorCisgICAgLy8gSW50ZWdlciBjb21wYXJp
c29ucy4gUmV0dXJucyBpbnQzMiAwIG9yIDEuCisgICAgQWJvdmUsCisgICAgQmVsb3csCisgICAg
QWJvdmVFcXVhbAorICAgIEJlbG93RXF1YWwsCisKKyAgICAvLyBNZW1vcnkgbG9hZHMuIE9wY29k
ZSBpbmRpY2F0ZXMgaG93IHdlIGxvYWQgYW5kIHRoZSBsb2FkZWQgdHlwZS4KKyAgICAvLyBUaGVz
ZSByZXR1cm4gSW50MzI6CisgICAgTG9hZDhaLAorICAgIExvYWQ4UywKKyAgICBMb2FkMTZaLAor
ICAgIExvYWQxNlMsCisgICAgTG9hZDMyLAorICAgIC8vIFRoaXMgcmV0dXJucyBJbnQ2NDoKKyAg
ICBMb2FkNjQsCisgICAgLy8gVGhlc2UgcmV0dXJuIERvdWJsZToKKyAgICBMb2FkRmxvYXQsCisg
ICAgTG9hZERvdWJsZSwKKworICAgIC8vIE1lbW9yeSBzdG9yZXMuIE9wY29kZSBpbmRpY2F0ZXMg
aG93IHRoZSB2YWx1ZSBpcyBzdG9yZWQuCisgICAgLy8gVGhlc2UgdGFrZSBhbiBJbnQzMiB2YWx1
ZToKKyAgICBTdG9yZTgsCisgICAgU3RvcmUxNiwKKyAgICBTdG9yZTMyLAorICAgIC8vIFRoaXMg
dGFrZXMgYSBJbnQ2NCB2YWx1ZToKKyAgICBTdG9yZTY0LAorICAgIC8vIFRoZXNlIHRha2UgYSBE
b3VibGUgdmFsdWU6CisgICAgU3RvcmVGbG9hdCwKKyAgICBTdG9yZURvdWJsZSwKKworICAgIC8v
IFRoaXMgaXMgYSByZWd1bGFyIG9yZGluYXJ5IEMgZnVuY3Rpb24gY2FsbCwgdXNpbmcgdGhlIHN5
c3RlbSBDIGNhbGxpbmcgY29udmVudGlvbi4gTWFrZSBzdXJlCisgICAgLy8gdGhhdCB0aGUgYXJn
dW1lbnRzIGFyZSBwYXNzZWQgdXNpbmcgdGhlIHJpZ2h0IHR5cGVzLgorICAgIENDYWxsLAorCisg
ICAgLy8gVGhpcyBpcyBhIHBhdGNocG9pbnQuIFVzZSB0aGUgUGF0Y2hwb2ludFZhbHVlIGNsYXNz
LiBUaGlzIGlzIHZpZXdlZCBhcyBiZWhhdmluZyBsaWtlIGEgY2FsbCwKKyAgICAvLyBidXQgb25s
eSBlbWl0cyBjb2RlIHZpYSBhIGNvZGUgZ2VuZXJhdGlvbiBjYWxsYmFjay4gVGhhdCBjYWxsYmFj
ayBnZXRzIHRvIGVtaXQgY29kZSBpbmxpbmUuCisgICAgLy8gWW91IGNhbiBwYXNzIGEgc3RhY2tt
YXAgYWxvbmcgd2l0aCBjb25zdHJhaW50cyBvbiBob3cgZWFjaCBzdGFja21hcCBhcmd1bWVudCBt
dXN0IGJlIHBhc3NlZC4KKyAgICAvLyBJdCdzIGxlZ2FsIHRvIHJlcXVlc3QgdGhhdCBhIHN0YWNr
bWFwIGFyZ3VtZW50IGlzIGluIHNvbWUgcmVnaXN0ZXIgYW5kIGl0J3MgbGVnYWwgdG8gcmVxdWVz
dAorICAgIC8vIHRoYXQgYSBzdGFja21hcCBhcmd1bWVudCBpcyBhdCBzb21lIG9mZnNldCBmcm9t
IHRoZSB0b3Agb2YgdGhlIGFyZ3VtZW50IHBhc3NpbmcgYXJlYSBvbiB0aGUKKyAgICAvLyBzdGFj
ay4KKyAgICBQYXRjaHBvaW50LAorCisgICAgLy8gQ2hlY2tlZCBtYXRoLiBVc2UgdGhlIENoZWNr
ZWRNYXRoVmFsdWUgY2xhc3MuIExpa2UgYSBQYXRjaHBvaW50LCB0aGlzIHRha2VzIGEgY29kZSBn
ZW5lcmF0aW9uCisgICAgLy8gY2FsbGJhY2suIFRoYXQgY2FsbGJhY2sgZ2V0cyB0byBlbWl0IHNv
bWUgY29kZSBhZnRlciB0aGUgZXBpbG9ndWUsIGFuZCBnZXRzIHRvIGxpbmsgdGhlIGp1bXAKKyAg
ICAvLyBmcm9tIHRoZSBjaGVjaywgdGhlIGxhYmVsIGFmdGVyIHRoZSBtYXRoIGluc3RydWN0aW9u
LCBhbmQgdGhlIGNob2ljZSBvZiByZWdpc3RlcnMuIFlvdSBhbHNvCisgICAgLy8gZ2V0IHRvIHN1
cHBseSBhIHN0YWNrbWFwLgorICAgIENoZWNrQWRkLAorICAgIENoZWNrU3ViLAorICAgIENoZWNr
TXVsLAorCisgICAgLy8gU1NBIHN1cHBvcnQsIGluIHRoZSBzdHlsZSBvZiBERkcgU1NBLgorICAg
IFVwc2lsb24sCisgICAgUGhpLAorCisgICAgLy8gSnVtcC4gVXNlcyB0aGUgSnVtcFZhbHVlIGNs
YXNzLgorICAgIEp1bXAsCisgICAgCisgICAgLy8gUG9seW1vcnBoaWMgYnJhbmNoLCB1c2FibGUg
d2l0aCBhbnkgdmFsdWUgdHlwZS4gQnJhbmNoZXMgaWYgbm90IGVxdWFsIHRvIHplcm8uIFVzZXMg
dGhlCisgICAgLy8gQnJhbmNoVmFsdWUgY2xhc3MuCisgICAgQnJhbmNoLAorCisgICAgLy8gU3dp
dGNoLiBTd2l0Y2hlcyBvdmVyIGVpdGhlciBJbnQzMiBvciBJbnQ2NC4gVXNlcyB0aGUgU3dpdGNo
VmFsdWUgY2xhc3MuCisgICAgU3dpdGNoLAorCisgICAgLy8gUmV0dXJuLiBOb3RlIHRoYXQgQjMg
cHJvY2VkdXJlcyBkb24ndCBrbm93IHRoZWlyIHJldHVybiB0eXBlLCBzbyB0aGlzIGNhbiBqdXN0
IHJldHVybiBhbnkKKyAgICAvLyB0eXBlLgorICAgIFJldHVybiwKKworICAgIC8vIFRoaXMgaXMg
YSB0ZXJtaW5hbCB0aGF0IGluZGljYXRlcyB0aGF0IHdlIHdpbGwgbmV2ZXIgZ2V0IGhlcmUuCisg
ICAgT29wcworfTsKKworfSB9IC8vIG5hbWVzcGFjZSBKU0M6OkIzCisKK25hbWVzcGFjZSBXVEYg
eworCitjbGFzcyBQcmludFN0cmVhbTsKKwordm9pZCBwcmludEludGVybmFsKFByaW50U3RyZWFt
JiwgSlNDOjpCMzo6T3Bjb2RlKTsKKworfSAvLyBuYW1lc3BhY2UgV1RGCisKKyNlbmRpZiAvLyBC
M09wY29kZV9oCisKSW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM09yaWdpbi5jcHAK
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzT3JpZ2luLmNwcAkocmV2
aXNpb24gMCkKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM09yaWdpbi5jcHAJKHdvcmtp
bmcgY29weSkKQEAgLTAsMCArMSwzNyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNSBBcHBs
ZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVz
ZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmlj
YXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlv
bnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVz
dCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2Yg
Y29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmli
dXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQK
KyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcg
ZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVy
aWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FS
RSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNT
IE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRI
RQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBG
T1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQg
U0hBTEwgQVBQTEUgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJ
UkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENP
TlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQ
Uk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwg
REFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBD
QVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05U
UkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNF
IE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBU
SElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0gg
REFNQUdFLiAKKyAqLworCisjaW5jbHVkZSAiY29uZmlnLmgiCisjaW5jbHVkZSAiQjNPcmlnaW4u
aCIKKworbmFtZXNwYWNlIEpTQyB7IG5hbWVzcGFjZSBCMyB7CisKK3ZvaWQgT3JpZ2luOjpkdW1w
KFByaW50U3RyZWFtJiBvdXQpIGNvbnN0Cit7CisgICAgb3V0LnByaW50KCJPcmlnaW4oIiwgUmF3
UG9pbnRlcihtX2RhdGEpLCAiKSIpOworfQorCit9IH0gLy8gbmFtZXNwYWNlIEpTQzo6QjMKKwpJ
bmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzT3JpZ2luLmgKPT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0g
U291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzT3JpZ2luLmgJKHJldmlzaW9uIDApCisrKyBTb3Vy
Y2UvSmF2YVNjcmlwdENvcmUvYjMvQjNPcmlnaW4uaAkod29ya2luZyBjb3B5KQpAQCAtMCwwICsx
LDU1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE1IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyBy
ZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmlu
YXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRl
ZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAq
IDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUg
Y29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUg
Zm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZv
cm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlz
IGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQor
ICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGgg
dGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQ
UExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5U
SUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJB
TlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAq
IFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9S
CisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5D
SURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VT
IChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNU
SVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklU
UzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRI
RU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklM
SVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklT
SU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4g
SUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisKKyNp
Zm5kZWYgQjNPcmlnaW5faAorI2RlZmluZSBCM09yaWdpbl9oCisKKyNpbmNsdWRlIDx3dGYvUHJp
bnRTdHJlYW0uaD4KKworbmFtZXNwYWNlIEpTQyB7IG5hbWVzcGFjZSBCMyB7CisKKy8vIFdob2V2
ZXIgZ2VuZXJhdGVzIEIzSVIgY2FuIGNob29zZSB0byBwdXQgb3JpZ2lucyBvbiB2YWx1ZXMuIFdo
ZW4geW91IGRvIHRoaXMsIEIzIHdpbGwgYmUgYWJsZSB0bworLy8gYWNjb3VudCwgZG93biB0byB0
aGUgbWFjaGluZSBjb2RlLCB3aGljaCBpbnN0cnVjdGlvbiBjb3JyZXNwb25kcyB0byB3aGljaCBv
cmlnaW4uIEIzCisvLyB0cmFuc2Zvcm1hdGlvbnMgbXVzdCBwcmVzZXJ2ZSBPcmlnaW5zIGNhcmVm
dWxseS4gSXQncyBhbiBlcnJvciB0byB3cml0ZSBhIHRyYW5zZm9ybWF0aW9uIHRoYXQKKy8vIGVp
dGhlciBkcm9wcyBPcmlnaW5zIG9yIGxpZXMgYWJvdXQgdGhlbS4KK2NsYXNzIE9yaWdpbiB7Citw
dWJsaWM6CisgICAgZXhwbGljaXQgT3JpZ2luKGNvbnN0IHZvaWQqIGRhdGEgPSBudWxscHRyKQor
ICAgICAgICA6IG1fZGF0YShkYXRhKQorICAgIHsKKyAgICB9CisKKyAgICBjb25zdCB2b2lkKiBk
YXRhKCkgY29uc3QgeyByZXR1cm4gbV9kYXRhOyB9CisKKyAgICB2b2lkIGR1bXAoUHJpbnRTdHJl
YW0mKSBjb25zdDsKKyAgICAKK3ByaXZhdGU6CisgICAgY29uc3Qgdm9pZCogbV9kYXRhOworfTsK
KworfSB9IC8vIG5hbWVzcGFjZSBKU0M6OkIzCisKKyNlbmRpZiAvLyBCM09yaWdpbl9oCisKSW5k
ZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM1R5cGUuY3BwCj09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNv
dXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM1R5cGUuY3BwCShyZXZpc2lvbiAwKQorKysgU291cmNl
L0phdmFTY3JpcHRDb3JlL2IzL0IzVHlwZS5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSw1
NCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNSBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVz
ZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFy
eSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQg
cHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAx
LiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNv
cHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZv
bGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3Jt
IG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBs
aXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAq
ICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRo
ZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBM
RSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElF
UywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5U
SUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQ
VVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUgor
ICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lE
RU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAo
SU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElU
VVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7
IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVP
UlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElU
WSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lO
RyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElG
IEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLiAKKyAqLworCisjaW5j
bHVkZSAiY29uZmlnLmgiCisjaW5jbHVkZSAiQjNUeXBlLmgiCisKKyNpbmNsdWRlIDx3dGYvUHJp
bnRTdHJlYW0uaD4KKworbmFtZXNwYWNlIFdURiB7CisKK3VzaW5nIG5hbWVzcGFjZSBKU0M6OkIz
OworCit2b2lkIHByaW50SW50ZXJuYWwoUHJpbnRTdHJlYW0mIG91dCwgVHlwZSB0eXBlKQorewor
ICAgIHN3aXRjaCAodHlwZSkgeworICAgIGNhc2UgVm9pZDoKKyAgICAgICAgb3V0LnByaW50KCJW
b2lkIik7CisgICAgICAgIHJldHVybjsKKyAgICBjYXNlIEludDMyOgorICAgICAgICBvdXQucHJp
bnQoIkludDMyIik7CisgICAgICAgIHJldHVybjsKKyAgICBjYXNlIEludDY0OgorICAgICAgICBv
dXQucHJpbnQoIkludDY0Iik7CisgICAgICAgIHJldHVybjsKKyAgICBjYXNlIERvdWJsZToKKyAg
ICAgICAgb3V0LnByaW50KCJEb3VibGUiKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBS
RUxFQVNFX0FTU0VSVF9OT1RfUkVBQ0hFRCgpOworfQorCit9IC8vIG5hbWVzcGFjZSBXVEYKSW5k
ZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM1R5cGUuaAo9PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3Vy
Y2UvSmF2YVNjcmlwdENvcmUvYjMvQjNUeXBlLmgJKHJldmlzaW9uIDApCisrKyBTb3VyY2UvSmF2
YVNjcmlwdENvcmUvYjMvQjNUeXBlLmgJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSw1NiBAQAor
LyoKKyAqIENvcHlyaWdodCAoQykgMjAxNSBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQu
CisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jt
cywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlk
ZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRp
c3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdo
dAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2lu
ZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3Qg
cmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9m
IGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRv
Y3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0
cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMu
IGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5D
TFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9G
IE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NF
IEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUgorICogQ09O
VFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUws
IFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVE
SU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdP
T0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJV
U0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAq
IE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1Ig
VE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBB
TlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklT
RUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLiAKKyAqLworCisjaWZuZGVmIEIz
VHlwZV9oCisjZGVmaW5lIEIzVHlwZV9oCisKK25hbWVzcGFjZSBKU0MgeyBuYW1lc3BhY2UgQjMg
eworCitlbnVtIFR5cGUgeworICAgIFZvaWQsCisgICAgSW50MzIsCisgICAgSW50NjQsCisgICAg
RG91YmxlCit9OworCitUeXBlIHBvaW50ZXIoKSBjb25zdAoreworICAgIGlmIChzaXplb2Yodm9p
ZCopID09IDQpCisgICAgICAgIHJldHVybiBJbnQzMjsKKyAgICByZXR1cm4gSW50NjQ7Cit9CisK
K30gfSAvLyBuYW1lc3BhY2UgSlNDOjpCMworCituYW1lc3BhY2UgV1RGIHsKKworY2xhc3MgUHJp
bnRTdHJlYW07CisKK3ZvaWQgcHJpbnRJbnRlcm5hbChQcmludFN0cmVhbSYsIEpTQzo6QjM6OlR5
cGUpOworCit9IC8vIG5hbWVzcGFjZSBXVEYKKworI2VuZGlmIC8vIEIzVHlwZV9oCisKSW5kZXg6
IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM1ZhbHVlLmgKPT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNl
L0phdmFTY3JpcHRDb3JlL2IzL0IzVmFsdWUuaAkocmV2aXNpb24gMCkKKysrIFNvdXJjZS9KYXZh
U2NyaXB0Q29yZS9iMy9CM1ZhbHVlLmgJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSw3NiBAQAor
LyoKKyAqIENvcHlyaWdodCAoQykgMjAxNSBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQu
CisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jt
cywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlk
ZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRp
c3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdo
dAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2lu
ZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3Qg
cmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9m
IGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRv
Y3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0
cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMu
IGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5D
TFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9G
IE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NF
IEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUgorICogQ09O
VFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUws
IFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVE
SU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdP
T0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJV
U0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAq
IE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1Ig
VE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBB
TlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklT
RUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLiAKKyAqLworCisjaWZuZGVmIEIz
VmFsdWVfaAorI2RlZmluZSBCM1ZhbHVlX2gKKworI2luY2x1ZGUgPHd0Zi9GYXN0TWFsbG9jLmg+
CisjaW5jbHVkZSA8d3RmL05vbmNvcHlhYmxlLmg+CisKK25hbWVzcGFjZSBKU0MgeyBuYW1lc3Bh
Y2UgQjMgeworCitjbGFzcyBWYWx1ZSB7CisgICAgV1RGX01BS0VfTk9OQ09QWUFCTEUoVmFsdWUp
OworICAgIFdURl9NQUtFX0ZBU1RfQUxMT0NBVEVEOworcHVibGljOgorICAgIHR5cGVkZWYgVmVj
dG9yPFZhbHVlLCAzPiBBZGphY2VuY3lMaXN0OworCisgICAgdmlydHVhbCB+VmFsdWUoKTsKKyAg
ICAKKyAgICAvLyBOb3RlIHRoYXQgdGhlIG9wY29kZSBpcyBpbW11dGFibGUsIGV4Y2VwdCBmb3Ig
cmVwbGFjaW5nIHZhbHVlcyB3aXRoIGlkZW50aXR5LgorICAgIE9wY29kZSBvcGNvZGUoKSBjb25z
dCB7IHJldHVybiBtX29wY29kZTsgfQorCisgICAgT3JpZ2luIG9yaWdpbigpIGNvbnN0IHsgcmV0
dXJuIG1fb3JpZ2luOyB9CisgICAgCisgICAgVmFsdWUqJiBjaGlsZCh1bnNpZ25lZCBpbmRleCkg
eyByZXR1cm4gbV9jaGlsZHJlbltpbmRleF07IH0KKyAgICBWYWx1ZSogY2hpbGQodW5zaWduZWQg
aW5kZXgpIGNvbnN0IHsgcmV0dXJuIG1fY2hpbGRyZW5baW5kZXhdOyB9CisKKyAgICAvLyBUaGlz
IGNvbXB1dGVzIHRoZSB0eXBlIHVzaW5nIHRoZSBvcGNvZGUuCisgICAgVHlwZSB0eXBlKCkgY29u
c3Q7CisKKyAgICBBZGphY2VuY3lMaXN0JiBjaGlsZHJlbigpIHsgcmV0dXJuIG1fY2hpbGRyZW47
IH0gCisgICAgY29uc3QgQWRqYWNlbmN5TGlzdCYgY2hpbGRyZW4oKSBjb25zdCB7IHJldHVybiBt
X2NoaWxkcmVuOyB9CisKKyAgICB2b2lkIHJlcGxhY2VXaXRoSWRlbnRpdHkoVmFsdWUqKTsKKyAg
ICAKK3ByaXZhdGU6CisgICAgLy8gSW5zdGFudGlhdGUgdmFsdWVzIHZpYSBQcm9jZWR1cmUuCisg
ICAgdGVtcGxhdGU8dHlwZW5hbWUuLi4gQXJndW1lbnRzPgorICAgIGV4cGxpY2l0IFZhbHVlKE9w
Y29kZSBvcGNvZGUsIE9yaWdpbiBvcmlnaW4sIEFyZ3VtZW50cy4uLiBhcmd1bWVudHMpCisgICAg
ICAgIDogbV9vcGNvZGUob3Bjb2RlKQorICAgICAgICAsIG1fb3JpZ2luKG9yaWdpbikKKyAgICAg
ICAgLCBtX2NoaWxkcmVueyBhcmd1bWVudHMuLi4gfQorICAgIHsKKyAgICB9CisKKyAgICBPcGNv
ZGUgbV9vcGNvZGU7CisgICAgT3JpZ2luIG1fb3JpZ2luOworICAgIEFkamFjZW5jeUxpc3QgbV9j
aGlsZHJlbjsKK307CisKK30gfSAvLyBuYW1lc3BhY2UgSlNDOjpCMworCisjZW5kaWYgLy8gQjNW
YWx1ZV9oCisK
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>263403</attachid>
            <date>2015-10-17 19:54:00 -0700</date>
            <delta_ts>2015-10-17 20:31:43 -0700</delta_ts>
            <desc>it&apos;s growing</desc>
            <filename>blah.patch</filename>
            <type>text/plain</type>
            <size>35548</size>
            <attacher name="Filip Pizlo">fpizlo</attacher>
            
              <data encoding="base64">SW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM0Jhc2ljQmxvY2suY3BwCj09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM0Jhc2ljQmxvY2suY3BwCShyZXZpc2lv
biAwKQorKysgU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzQmFzaWNCbG9jay5jcHAJKHdvcmtp
bmcgY29weSkKQEAgLTAsMCArMSw1OCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNSBBcHBs
ZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVz
ZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmlj
YXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlv
bnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVz
dCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2Yg
Y29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmli
dXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQK
KyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcg
ZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVy
aWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FS
RSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNT
IE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRI
RQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBG
T1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQg
U0hBTEwgQVBQTEUgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJ
UkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENP
TlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQ
Uk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwg
REFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBD
QVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05U
UkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNF
IE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBU
SElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0gg
REFNQUdFLiAKKyAqLworCisjaW5jbHVkZSAiY29uZmlnLmgiCisjaW5jbHVkZSAiQjNCYXNpY0Js
b2NrLmgiCisKK25hbWVzcGFjZSBKU0MgeyBuYW1lc3BhY2UgQjMgeworCitCYXNpY0Jsb2NrOjpC
YXNpY0Jsb2NrKHVuc2lnbmVkIGluZGV4KQorICAgIDogbV9pbmRleChpbmRleCkKK3sKK30KKwor
QmFzaWNCbG9jazo6fkJhc2ljQmxvY2soKQoreworfQorCit2b2lkIEJhc2ljQmxvY2s6OmFwcGVu
ZChWYWx1ZSogdmFsdWUpCit7CisgICAgbV92YWx1ZXMuYXBwZW5kKHZhbHVlKTsKK30KKwordm9p
ZCBCYXNpY0Jsb2NrOjpkdW1wKFByaW50U3RyZWFtJiBvdXQpIGNvbnN0Cit7CisgICAgb3V0LnBy
aW50KCIjIiwgbV9pbmRleCk7Cit9CisKK3ZvaWQgQmFzaWNCbG9jazo6ZGVlcER1bXAoUHJpbnRT
dHJlYW0mIG91dCkgY29uc3QKK3sKKyAgICBvdXQucHJpbnQoIkJCIiwgKnRoaXMsICI6XG4iKTsK
KyAgICBmb3IgKFZhbHVlKiB2YWx1ZSA6ICp0aGlzKQorICAgICAgICBvdXQucHJpbnQoIiAgICAi
LCBkZWVwRHVtcCh2YWx1ZSksICJcbiIpOworfQorCit9IH0gLy8gbmFtZXNwYWNlIEpTQzo6QjMK
KwpJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzQmFzaWNCbG9jay5oCj09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM0Jhc2ljQmxvY2suaAkocmV2aXNpb24g
MCkKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM0Jhc2ljQmxvY2suaAkod29ya2luZyBj
b3B5KQpAQCAtMCwwICsxLDEwNCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNSBBcHBsZSBJ
bmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBp
biBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRp
b24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMK
KyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCBy
ZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29u
ZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRp
b25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAq
ICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlz
Y2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFs
cyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJ
UyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9S
IElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQor
ICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1Ig
QSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hB
TEwgQVBQTEUgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVD
VCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNF
UVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9D
VVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFU
QSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVT
RUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFD
VCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9S
IE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElT
IFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFN
QUdFLiAKKyAqLworCisjaWZuZGVmIEIzQmFzaWNCbG9jaworI2RlZmluZSBCM0Jhc2ljQmxvY2sK
KworbmFtZXNwYWNlIEpTQyB7IG5hbWVzcGFjZSBCMyB7CisKK2NsYXNzIFByb2NlZHVyZTsKK2Ns
YXNzIFZhbHVlOworCitjbGFzcyBCYXNpY0Jsb2NrIHsKKyAgICBXVEZfTUFLRV9OT05DT1BZQUJM
RShCYXNpY0Jsb2NrKTsKKyAgICBXVEZfTUFLRV9GQVNUX0FMTE9DQVRFRDsKK3B1YmxpYzoKKyAg
ICB0eXBlZGVmIFZlY3RvcjxWYWx1ZSo+IFZhbHVlTGlzdDsKKworICAgIH5CYXNpY0Jsb2NrKCk7
CisKKyAgICB1bnNpZ25lZCBpbmRleCgpIGNvbnN0IHsgcmV0dXJuIG1faW5kZXg7IH0KKworICAg
IEFkamFjZW5jeUxpc3Q6Oml0ZXJhdG9yIGJlZ2luKCkgeyByZXR1cm4gbV92YWx1ZXMuYmVnaW4o
KTsgfQorICAgIEFkamFjZW5jeUxpc3Q6Oml0ZXJhdG9yIGVuZCgpIHsgcmV0dXJuIG1fdmFsdWVz
LmVuZCgpOyB9CisgICAgQWRqYWNlbmN5TGlzdDo6Y29uc3RfaXRlcmF0b3IgYmVnaW4oKSBjb25z
dCB7IHJldHVybiBtX3ZhbHVlcy5iZWdpbigpOyB9CisgICAgQWRqYWNlbmN5TGlzdDo6Y29uc3Rf
aXRlcmF0b3IgZW5kKCkgY29uc3QgeyByZXR1cm4gbV92YWx1ZXMuZW5kKCk7IH0KKworICAgIHNp
emVfdCBzaXplKCkgY29uc3QgeyByZXR1cm4gbV92YWx1ZXMuc2l6ZSgpOyB9CisgICAgVmFsdWUq
IGF0KHNpemVfdCBpbmRleCkgY29uc3QgeyByZXR1cm4gbV92YWx1ZXNbaW5kZXhdOyB9CisgICAg
VmFsdWUqJiBhdChzaXplX3QgaW5kZXgpIHsgcmV0dXJuIG1fdmFsdWVzW2luZGV4XTsgfQorCisg
ICAgVmFsdWUqIGxhc3QoKSBjb25zdCB7IHJldHVybiBtX3ZhbHVlcy5sYXN0KCk7IH0KKyAgICBW
YWx1ZSomIGxhc3QoKSB7IHJldHVybiBtX3ZhbHVlcy5sYXN0KCk7IH0KKworICAgIGNvbnN0IFZh
bHVlTGlzdCYgdmFsdWVzKCkgY29uc3QgeyByZXR1cm4gbV92YWx1ZXM7IH0KKyAgICBWYWx1ZUxp
c3QmIHZhbHVlcygpIHsgcmV0dXJuIG1fdmFsdWVzOyB9CisKKyAgICB2b2lkIGFwcGVuZChWYWx1
ZSopOworCisgICAgdGVtcGxhdGU8dHlwZW5hbWUuLi4gQXJndW1lbnRzPgorICAgIFZhbHVlKiBh
cHBlbmROZXdWYWx1ZShQcm9jZWR1cmUmLCBBcmd1bWVudHMuLi4pOworCisgICAgdm9pZCBkdW1w
KFByaW50U3RyZWFtJikgY29uc3Q7CisgICAgdm9pZCBkZWVwRHVtcChQcmludFN0cmVhbSYpIGNv
bnN0OworCitwcml2YXRlOgorICAgIGZyaWVuZCBjbGFzcyBQcm9jZWR1cmU7CisgICAgCisgICAg
Ly8gSW5zdGFudGlhdGUgdmlhIFByb2NlZHVyZS4KKyAgICBCYXNpY0Jsb2NrKHVuc2lnbmVkIGlu
ZGV4KTsKKworICAgIHVuc2lnbmVkIG1faW5kZXg7CisgICAgVmFsdWVMaXN0IG1fdmFsdWVzOwor
fTsKKworY2xhc3MgRGVlcEJhc2ljQmxvY2tEdW1wIHsKK3B1YmxpYzoKKyAgICBEZWVwQmFzaWNC
bG9ja0R1bXAoQmFzaWNCbG9jayogYmxvY2spCisgICAgICAgIDogbV9ibG9jayhibG9jaykKKyAg
ICB7CisgICAgfQorCisgICAgdm9pZCBkdW1wKFByaW50U3RyZWFtJiBvdXQpIGNvbnN0CisgICAg
eworICAgICAgICBpZiAobV9ibG9jaykKKyAgICAgICAgICAgIG1fYmxvY2stPmRlZXBEdW1wKG91
dCk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIG91dC5wcmludCgiPG51bGw+Iik7CisgICAg
fQorCitwcml2YXRlOgorICAgIEJhc2ljQmxvY2sqIG1fYmxvY2s7Cit9OworCitEZWVwQmFzaWNC
bG9ja0R1bXAgZGVlcER1bXAoQmFzaWNCbG9jayogYmxvY2spCit7CisgICAgcmV0dXJuIERlZXBC
YXNpY0Jsb2NrRHVtcChibG9jayk7Cit9CisKK30gfSAvLyBuYW1lc3BhY2UgSlNDOjpCMworCisj
ZW5kaWYgLy8gQjNCYXNpY0Jsb2NrCisKSW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9C
M0Jhc2ljQmxvY2tJbmxpbmVzLmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRDb3Jl
L2IzL0IzQmFzaWNCbG9ja0lubGluZXMuaAkocmV2aXNpb24gMCkKKysrIFNvdXJjZS9KYXZhU2Ny
aXB0Q29yZS9iMy9CM0Jhc2ljQmxvY2tJbmxpbmVzLmgJKHdvcmtpbmcgY29weSkKQEAgLTAsMCAr
MSw0NSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNSBBcHBsZSBJbmMuIEFsbCByaWdodHMg
cmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJp
bmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0
ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6Cisg
KiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3Zl
IGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhl
IGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBm
b3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhp
cyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUK
KyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRo
IHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBB
UFBMRSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFO
VElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJS
QU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisg
KiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBP
UgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElO
Q0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdF
UyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJT
VElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJ
VFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBU
SEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJ
TElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJ
U0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVO
IElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLiAKKyAqLworCisj
aWZuZGVmIEIzQmFzaWNCbG9ja0lubGluZXNfaAorI2RlZmluZSBCM0Jhc2ljQmxvY2tJbmxpbmVz
X2gKKworI2luY2x1ZGUgIkIzQmFzaWNCbG9jay5oIgorI2luY2x1ZGUgIkIzUHJvY2VkdXJlSW5s
aW5lcy5oIgorCituYW1lc3BhY2UgSlNDIHsgbmFtZXNwYWNlIEIzIHsKKwordGVtcGxhdGU8dHlw
ZW5hbWUuLi4gQXJndW1lbnRzPgorVmFsdWUqIEJhc2ljQmxvY2s6OmFwcGVuZE5ld1ZhbHVlKFBy
b2NlZHVyZSYgcHJvY2VkdXJlLCBBcmd1bWVudHMuLi4gYXJndW1lbnRzKQoreworICAgIFZhbHVl
KiByZXN1bHQgPSBwcm9jZWR1cmUubmV3VmFsdWUoYXJndW1lbnRzLi4uKTsKKyAgICBhcHBlbmQo
cmVzdWx0KTsKKyAgICByZXR1cm4gcmVzdWx0OworfQorCit9IH0gLy8gbmFtZXNwYWNlIEpTQzo6
QjMKKworI2VuZGlmIC8vIEIzQmFzaWNCbG9ja0lubGluZXNfaAorCkluZGV4OiBTb3VyY2UvSmF2
YVNjcmlwdENvcmUvYjMvQjNPcGNvZGUuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2Ny
aXB0Q29yZS9iMy9CM09wY29kZS5jcHAJKHJldmlzaW9uIDApCisrKyBTb3VyY2UvSmF2YVNjcmlw
dENvcmUvYjMvQjNPcGNvZGUuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsNDcgQEAKKy8q
CisgKiBDb3B5cmlnaHQgKEMpIDIwMTUgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgor
ICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMs
IHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVk
IHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0
cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQK
KyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcg
ZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJl
cHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBj
b25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1
bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJp
YnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBg
YEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xV
RElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBN
RVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBB
UkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IKKyAqIENPTlRS
SUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBT
UEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElO
RywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09E
UyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJ
TkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBP
RiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRP
UlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5Z
IFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VE
IE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKworI2luY2x1ZGUgImNv
bmZpZy5oIgorI2luY2x1ZGUgIkIzT3Bjb2RlLmgiCisKKyNpbmNsdWRlIDx3dGYvUHJpbnRTdHJl
YW0uaD4KKworbmFtZXNwYWNlIFdURiB7CisKK3VzaW5nIG5hbWVzcGFjZSBKU0M6OkIzOworCit2
b2lkIHByaW50SW50ZXJuYWwoUHJpbnRTdHJlYW0mIG91dCwgT3Bjb2RlIG9wY29kZSkKK3sKKyAg
ICBzd2l0Y2ggKG9wY29kZSkgeworICAgIGNhc2UgSWRlbnRpdHk6CisgICAgICAgIG91dC5wcmlu
dCgiSWRlbnRpdHkiKTsKKyAgICAgICAgcmV0dXJuOworICAgICAgICAvLyBGSVhNRQorICAgIH0K
KyAgICBSRUxFQVNFX0FTU0VSVF9OT1RfUkVBQ0hFRCgpOworfQorCit9IC8vIG5hbWVzcGFjZSBX
VEYKKwpJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzT3Bjb2RlLmgKPT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PQotLS0gU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzT3Bjb2RlLmgJKHJldmlzaW9uIDApCisr
KyBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNPcGNvZGUuaAkod29ya2luZyBjb3B5KQpAQCAt
MCwwICsxLDE4MCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNSBBcHBsZSBJbmMuIEFsbCBy
aWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2Ug
YW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBw
ZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBt
ZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhl
IGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBh
bmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJp
bmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGlj
ZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBp
biB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRl
ZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURF
RCBCWSBBUFBMRSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQg
V0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElF
RCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNV
TEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUg
SU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJF
Q1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwg
REFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBP
RiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAq
IFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9O
IEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNU
IExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lT
RSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJF
LCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLiAKKyAq
LworCisjaWZuZGVmIEIzT3Bjb2RlX2gKKyNkZWZpbmUgQjNPcGNvZGVfaAorCituYW1lc3BhY2Ug
SlNDIHsgbmFtZXNwYWNlIEIzIHsKKworZW51bSBPcGNvZGUgeworICAgIC8vIFBvbHltb3JwaGlj
IGlkZW50aXR5LCB1c2FibGUgd2l0aCBhbnkgdmFsdWUgdHlwZS4KKyAgICBJZGVudGl0eSwKKwor
ICAgIC8vIENvbnN0YW50cy4gVXNlIHRoZSBDb25zdGFudFZhbHVlIGNsYXNzLiBDb25zdGFudHMg
ZXhpc3QgaW4gdGhlIGNvbnRyb2wgZmxvdywgc28gdGhhdCB3ZSBjYW4KKyAgICAvLyByZWFzb24g
YWJvdXQgd2hlcmUgd2Ugd291bGQgY29uc3RydWN0IHRoZW0uIExhcmdlIGNvbnN0YW50cyBhcmUg
ZXhwZW5zaXZlIHRvIGNyZWF0ZS4KKyAgICBDb25zdDMyLAorICAgIENvbnN0NjQsCisgICAgQ29u
c3REb3VibGUsCisKKyAgICAvLyBUaGUgbWFnaWNhbCBzdGFjayBzbG90LiBUaGlzIGlzIHZpZXdl
ZCBhcyBleGVjdXRpbmcgYXQgdGhlIHRvcCBvZiB0aGUgcHJvZ3JhbSByZWdhcmRsZXNzIG9mCisg
ICAgLy8gd2hlcmUgaW4gY29udHJvbCBmbG93IHlvdSBwdXQgaXQuIEVhY2ggaW5zdGFuY2Ugb2Yg
YSBTdGFja1Nsb3QgVmFsdWUgZ2V0cyBhIGRpc2pvaW50IHJhbmdlIG9mCisgICAgLy8gc3RhY2sg
bWVtb3J5LiBVc2UgdGhlIFN0YWNrU2xvdFZhbHVlIGNsYXNzLgorICAgIFN0YWNrU2xvdCwKKwor
ICAgIC8vIFRoZSBtYWdpY2FsIGFyZ3VtZW50IHJlZ2lzdGVyLiBUaGlzIGlzIHZpZXdlZCBhcyBl
eGVjdXRpbmcgYXQgdGhlIHRvcCBvZiB0aGUgcHJvZ3JhbQorICAgIC8vIHJlZ2FyZGxlc3Mgb2Yg
d2hlcmUgaW4gY29udHJvbCBmbG93IHlvdSBwdXQgaXQsIGFuZCB0aGUgY29tcGlsZXIgdGFrZXMg
Y2FyZSB0byBlbnN1cmUgdGhhdCB3ZQorICAgIC8vIGRvbid0IGNsb2JiZXIgdGhlIHZhbHVlIGJ5
IHJlZ2lzdGVyIGFsbG9jYXRpb24gb3IgY2FsbHMgKGVpdGhlciBieSBzYXZpbmcgdGhlIGFyZ3Vt
ZW50IHRvIHRoZQorICAgIC8vIHN0YWNrIG9yIHByZXNlcnZpbmcgaXQgaW4gYSBjYWxsZWUtc2F2
ZSByZWdpc3RlcikuIFVzZSB0aGUgQXJndW1lbnRSZWdWYWx1ZSBjbGFzcy4KKyAgICBBcmd1bWVu
dFJlZywKKworICAgIC8vIFRoZSBmcmFtZSBwb2ludGVyLiBZb3UgY2FuIHB1dCB0aGlzIGFueXdo
ZXJlIGluIGNvbnRyb2wgZmxvdyBidXQgaXQgd2lsbCBhbHdheXMgeWllbGQgdGhlCisgICAgLy8g
ZnJhbWUgcG9pbnRlciwgd2l0aCBhIGNhdmVhdDogaWYgb3VyIGNvbXBpbGVyIGNoYW5nZXMgdGhl
IGZyYW1lIHBvaW50ZXIgdGVtcG9yYXJpbHkgZm9yIHNvbWUKKyAgICAvLyBzaWxseSByZWFzb24s
IHRoZSBGcmFtZVBvaW50ZXIgaW50cmluc2ljIHdpbGwgcmV0dXJuIHdoZXJlIHRoZSBmcmFtZSBw
b2ludGVyICpzaG91bGQqIGJlIG5vdAorICAgIC8vIHdoZXJlIGl0IGhhcHBlbnMgdG8gYmUgcmln
aHQgbm93LgorICAgIEZyYW1lUG9pbnRlciwKKworICAgIC8vIFBvbHltb3JwaGljIG1hdGgsIHVz
YWJsZSB3aXRoIGFueSB2YWx1ZSB0eXBlLgorICAgIEFkZCwKKyAgICBTdWIsCisgICAgTXVsLAor
ICAgIERpdiwKKworICAgIC8vIEludGVnZXIgbWF0aC4KKyAgICBDaGlsbERpdiwgLy8gZG9lc24n
dCB0cmFwIGV2ZXIsIGJlaGF2ZXMgbGlrZSBKUyAoeC95KXwwLgorICAgIE1vZCwKKyAgICBCaXRB
bmQsCisgICAgQml0T3IsCisgICAgQml0WG9yLAorICAgIFNobCwKKyAgICBBU2hyLAorICAgIExT
aHIsCisKKyAgICAvLyBDYXN0cyBhbmQgc3VjaC4KKyAgICAvLyBUYWtlcyBhbmQgcmV0dXJucyBJ
bnQzMjoKKyAgICBTRXh0OCwKKyAgICBTRXh0MTYsCisgICAgLy8gVGFrZXMgSW50MzIgYW5kIHJl
dHVybnMgSW50NjQ6CisgICAgU0V4dDMyLAorICAgIFpFeHQzMiwKKyAgICAvLyBUYWtlcyBhbmQg
cmV0dXJucyBEb3VibGU6CisgICAgRlJvdW5kLAorICAgIC8vIFRha2VzIGludHMgYW5kIHJldHVy
bnMgRG91YmxlOgorICAgIElUb0QsCisgICAgLy8gVGFrZXMgRG91YmxlIGFuZCByZXR1cm5zIElu
dDMyOgorICAgIERUb0kzMiwKKworICAgIC8vIFBvbHltb3JwaGljIGNvbXBhcmlzb25zLCB1c2Fi
bGUgd2l0aCBhbnkgdmFsdWUgdHlwZS4gUmV0dXJucyBpbnQzMiAwIG9yIDEuIE5vdGUgdGhhdCAi
Tm90IgorICAgIC8vIGlzIGp1c3QgRXF1YWwoeCwgMCkuCisgICAgRXF1YWwsCisgICAgTm90RXF1
YWwsCisgICAgTGVzc1RoYW4sCisgICAgR3JlYXRlclRoYW4sCisgICAgTGVzc0VxdWFsLAorICAg
IEdyZWF0ZXJFcXVhbCwKKworICAgIC8vIEludGVnZXIgY29tcGFyaXNvbnMuIFJldHVybnMgaW50
MzIgMCBvciAxLgorICAgIEFib3ZlLAorICAgIEJlbG93LAorICAgIEFib3ZlRXF1YWwKKyAgICBC
ZWxvd0VxdWFsLAorCisgICAgLy8gTWVtb3J5IGxvYWRzLiBPcGNvZGUgaW5kaWNhdGVzIGhvdyB3
ZSBsb2FkIGFuZCB0aGUgbG9hZGVkIHR5cGUuCisgICAgLy8gVGhlc2UgcmV0dXJuIEludDMyOgor
ICAgIExvYWQ4WiwKKyAgICBMb2FkOFMsCisgICAgTG9hZDE2WiwKKyAgICBMb2FkMTZTLAorICAg
IExvYWQzMiwKKyAgICAvLyBUaGlzIHJldHVybnMgSW50NjQ6CisgICAgTG9hZDY0LAorICAgIC8v
IFRoZXNlIHJldHVybiBEb3VibGU6CisgICAgTG9hZEZsb2F0LAorICAgIExvYWREb3VibGUsCisK
KyAgICAvLyBNZW1vcnkgc3RvcmVzLiBPcGNvZGUgaW5kaWNhdGVzIGhvdyB0aGUgdmFsdWUgaXMg
c3RvcmVkLgorICAgIC8vIFRoZXNlIHRha2UgYW4gSW50MzIgdmFsdWU6CisgICAgU3RvcmU4LAor
ICAgIFN0b3JlMTYsCisgICAgU3RvcmUzMiwKKyAgICAvLyBUaGlzIHRha2VzIGEgSW50NjQgdmFs
dWU6CisgICAgU3RvcmU2NCwKKyAgICAvLyBUaGVzZSB0YWtlIGEgRG91YmxlIHZhbHVlOgorICAg
IFN0b3JlRmxvYXQsCisgICAgU3RvcmVEb3VibGUsCisKKyAgICAvLyBUaGlzIGlzIGEgcmVndWxh
ciBvcmRpbmFyeSBDIGZ1bmN0aW9uIGNhbGwsIHVzaW5nIHRoZSBzeXN0ZW0gQyBjYWxsaW5nIGNv
bnZlbnRpb24uIE1ha2Ugc3VyZQorICAgIC8vIHRoYXQgdGhlIGFyZ3VtZW50cyBhcmUgcGFzc2Vk
IHVzaW5nIHRoZSByaWdodCB0eXBlcy4KKyAgICBDQ2FsbCwKKworICAgIC8vIFRoaXMgaXMgYSBw
YXRjaHBvaW50LiBVc2UgdGhlIFBhdGNocG9pbnRWYWx1ZSBjbGFzcy4gVGhpcyBpcyB2aWV3ZWQg
YXMgYmVoYXZpbmcgbGlrZSBhIGNhbGwsCisgICAgLy8gYnV0IG9ubHkgZW1pdHMgY29kZSB2aWEg
YSBjb2RlIGdlbmVyYXRpb24gY2FsbGJhY2suIFRoYXQgY2FsbGJhY2sgZ2V0cyB0byBlbWl0IGNv
ZGUgaW5saW5lLgorICAgIC8vIFlvdSBjYW4gcGFzcyBhIHN0YWNrbWFwIGFsb25nIHdpdGggY29u
c3RyYWludHMgb24gaG93IGVhY2ggc3RhY2ttYXAgYXJndW1lbnQgbXVzdCBiZSBwYXNzZWQuCisg
ICAgLy8gSXQncyBsZWdhbCB0byByZXF1ZXN0IHRoYXQgYSBzdGFja21hcCBhcmd1bWVudCBpcyBp
biBzb21lIHJlZ2lzdGVyIGFuZCBpdCdzIGxlZ2FsIHRvIHJlcXVlc3QKKyAgICAvLyB0aGF0IGEg
c3RhY2ttYXAgYXJndW1lbnQgaXMgYXQgc29tZSBvZmZzZXQgZnJvbSB0aGUgdG9wIG9mIHRoZSBh
cmd1bWVudCBwYXNzaW5nIGFyZWEgb24gdGhlCisgICAgLy8gc3RhY2suCisgICAgUGF0Y2hwb2lu
dCwKKworICAgIC8vIENoZWNrZWQgbWF0aC4gVXNlIHRoZSBDaGVja2VkTWF0aFZhbHVlIGNsYXNz
LiBMaWtlIGEgUGF0Y2hwb2ludCwgdGhpcyB0YWtlcyBhIGNvZGUgZ2VuZXJhdGlvbgorICAgIC8v
IGNhbGxiYWNrLiBUaGF0IGNhbGxiYWNrIGdldHMgdG8gZW1pdCBzb21lIGNvZGUgYWZ0ZXIgdGhl
IGVwaWxvZ3VlLCBhbmQgZ2V0cyB0byBsaW5rIHRoZSBqdW1wCisgICAgLy8gZnJvbSB0aGUgY2hl
Y2ssIHRoZSBsYWJlbCBhZnRlciB0aGUgbWF0aCBpbnN0cnVjdGlvbiwgYW5kIHRoZSBjaG9pY2Ug
b2YgcmVnaXN0ZXJzLiBZb3UgYWxzbworICAgIC8vIGdldCB0byBzdXBwbHkgYSBzdGFja21hcC4K
KyAgICBDaGVja0FkZCwKKyAgICBDaGVja1N1YiwKKyAgICBDaGVja011bCwKKworICAgIC8vIFNT
QSBzdXBwb3J0LCBpbiB0aGUgc3R5bGUgb2YgREZHIFNTQS4KKyAgICBVcHNpbG9uLAorICAgIFBo
aSwKKworICAgIC8vIEp1bXAuIFVzZXMgdGhlIEp1bXBWYWx1ZSBjbGFzcy4KKyAgICBKdW1wLAor
ICAgIAorICAgIC8vIFBvbHltb3JwaGljIGJyYW5jaCwgdXNhYmxlIHdpdGggYW55IHZhbHVlIHR5
cGUuIEJyYW5jaGVzIGlmIG5vdCBlcXVhbCB0byB6ZXJvLiBVc2VzIHRoZQorICAgIC8vIEJyYW5j
aFZhbHVlIGNsYXNzLgorICAgIEJyYW5jaCwKKworICAgIC8vIFN3aXRjaC4gU3dpdGNoZXMgb3Zl
ciBlaXRoZXIgSW50MzIgb3IgSW50NjQuIFVzZXMgdGhlIFN3aXRjaFZhbHVlIGNsYXNzLgorICAg
IFN3aXRjaCwKKworICAgIC8vIFJldHVybi4gTm90ZSB0aGF0IEIzIHByb2NlZHVyZXMgZG9uJ3Qg
a25vdyB0aGVpciByZXR1cm4gdHlwZSwgc28gdGhpcyBjYW4ganVzdCByZXR1cm4gYW55CisgICAg
Ly8gdHlwZS4KKyAgICBSZXR1cm4sCisKKyAgICAvLyBUaGlzIGlzIGEgdGVybWluYWwgdGhhdCBp
bmRpY2F0ZXMgdGhhdCB3ZSB3aWxsIG5ldmVyIGdldCBoZXJlLgorICAgIE9vcHMKK307CisKK30g
fSAvLyBuYW1lc3BhY2UgSlNDOjpCMworCituYW1lc3BhY2UgV1RGIHsKKworY2xhc3MgUHJpbnRT
dHJlYW07CisKK3ZvaWQgcHJpbnRJbnRlcm5hbChQcmludFN0cmVhbSYsIEpTQzo6QjM6Ok9wY29k
ZSk7CisKK30gLy8gbmFtZXNwYWNlIFdURgorCisjZW5kaWYgLy8gQjNPcGNvZGVfaAorCkluZGV4
OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNPcmlnaW4uY3BwCj09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNv
dXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM09yaWdpbi5jcHAJKHJldmlzaW9uIDApCisrKyBTb3Vy
Y2UvSmF2YVNjcmlwdENvcmUvYjMvQjNPcmlnaW4uY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAg
KzEsMzcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTUgQXBwbGUgSW5jLiBBbGwgcmlnaHRz
IHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBi
aW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0
dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0Ogor
ICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92
ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRo
ZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkg
Zm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRo
aXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhl
CisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0
aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkg
QVBQTEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJB
TlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FS
UkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgor
ICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4g
T1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJ
TkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFH
RVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VC
U1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9G
SVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkg
VEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFC
SUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFS
SVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZF
TiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKwor
I2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgIkIzT3JpZ2luLmgiCisKK25hbWVzcGFjZSBK
U0MgeyBuYW1lc3BhY2UgQjMgeworCit2b2lkIE9yaWdpbjo6ZHVtcChQcmludFN0cmVhbSYgb3V0
KSBjb25zdAoreworICAgIG91dC5wcmludCgiT3JpZ2luKCIsIFJhd1BvaW50ZXIobV9kYXRhKSwg
IikiKTsKK30KKworfSB9IC8vIG5hbWVzcGFjZSBKU0M6OkIzCisKSW5kZXg6IFNvdXJjZS9KYXZh
U2NyaXB0Q29yZS9iMy9CM09yaWdpbi5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0
Q29yZS9iMy9CM09yaWdpbi5oCShyZXZpc2lvbiAwKQorKysgU291cmNlL0phdmFTY3JpcHRDb3Jl
L2IzL0IzT3JpZ2luLmgJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSw1NSBAQAorLyoKKyAqIENv
cHlyaWdodCAoQykgMjAxNSBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICog
UmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBv
ciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0
aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlv
bnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAg
bm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFp
bWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNl
IHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlv
bnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRp
b24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24u
CisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIGBgQVMgSVMn
JyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBC
VVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5U
QUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVND
TEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUgorICogQ09OVFJJQlVUT1JT
IEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUws
CisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQg
Tk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNF
UlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElO
VEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJ
TElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICog
KElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9V
VCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhF
IFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLiAKKyAqLworCisjaWZuZGVmIEIzT3JpZ2luX2gK
KyNkZWZpbmUgQjNPcmlnaW5faAorCisjaW5jbHVkZSA8d3RmL1ByaW50U3RyZWFtLmg+CisKK25h
bWVzcGFjZSBKU0MgeyBuYW1lc3BhY2UgQjMgeworCisvLyBXaG9ldmVyIGdlbmVyYXRlcyBCM0lS
IGNhbiBjaG9vc2UgdG8gcHV0IG9yaWdpbnMgb24gdmFsdWVzLiBXaGVuIHlvdSBkbyB0aGlzLCBC
MyB3aWxsIGJlIGFibGUgdG8KKy8vIGFjY291bnQsIGRvd24gdG8gdGhlIG1hY2hpbmUgY29kZSwg
d2hpY2ggaW5zdHJ1Y3Rpb24gY29ycmVzcG9uZHMgdG8gd2hpY2ggb3JpZ2luLiBCMworLy8gdHJh
bnNmb3JtYXRpb25zIG11c3QgcHJlc2VydmUgT3JpZ2lucyBjYXJlZnVsbHkuIEl0J3MgYW4gZXJy
b3IgdG8gd3JpdGUgYSB0cmFuc2Zvcm1hdGlvbiB0aGF0CisvLyBlaXRoZXIgZHJvcHMgT3JpZ2lu
cyBvciBsaWVzIGFib3V0IHRoZW0uCitjbGFzcyBPcmlnaW4geworcHVibGljOgorICAgIGV4cGxp
Y2l0IE9yaWdpbihjb25zdCB2b2lkKiBkYXRhID0gbnVsbHB0cikKKyAgICAgICAgOiBtX2RhdGEo
ZGF0YSkKKyAgICB7CisgICAgfQorCisgICAgY29uc3Qgdm9pZCogZGF0YSgpIGNvbnN0IHsgcmV0
dXJuIG1fZGF0YTsgfQorCisgICAgdm9pZCBkdW1wKFByaW50U3RyZWFtJikgY29uc3Q7CisgICAg
Citwcml2YXRlOgorICAgIGNvbnN0IHZvaWQqIG1fZGF0YTsKK307CisKK30gfSAvLyBuYW1lc3Bh
Y2UgSlNDOjpCMworCisjZW5kaWYgLy8gQjNPcmlnaW5faAorCkluZGV4OiBTb3VyY2UvSmF2YVNj
cmlwdENvcmUvYjMvQjNQcm9jZWR1cmUuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2Ny
aXB0Q29yZS9iMy9CM1Byb2NlZHVyZS5jcHAJKHJldmlzaW9uIDApCisrKyBTb3VyY2UvSmF2YVNj
cmlwdENvcmUvYjMvQjNQcm9jZWR1cmUuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsNTYg
QEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTUgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2Vy
dmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkg
Zm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHBy
b3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4g
UmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5
cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xs
b3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBt
dXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlz
dCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAg
ICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUg
ZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUg
SU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMs
IElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElF
UyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVS
UE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IKKyAq
IENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVO
VEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElO
Q0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVU
RSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBP
UiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZ
CisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFks
IE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcg
SU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBB
RFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKworI2luY2x1
ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgIkIzUHJvY2VkdXJlLmgiCisKKyNpbmNsdWRlICJCM0Jh
c2ljQmxvY2tJbmxpbmVzLmgiCisjaW5jbHVkZSAiQjNWYWx1ZS5oIgorCituYW1lc3BhY2UgSlND
IHsgbmFtZXNwYWNlIEIzIHsKKworUHJvY2VkdXJlOjpQcm9jZWR1cmUoKQoreworfQorCitQcm9j
ZWR1cmU6On5Qcm9jZWR1cmUoKQoreworfQorCitCYXNpY0Jsb2NrKiBQcm9jZWR1cmU6OmFwcGVu
ZEJsb2NrKCkKK3sKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8QmFzaWNCbG9jaz4gYmxvY2sgPSBzdGQ6
Om1ha2VfdW5pcXVlPEJhc2ljQmxvY2s+KG1fYmxvY2tzLnNpemUoKSk7CisgICAgQmFzaWNCbG9j
ayogcmVzdWx0ID0gYmxvY2suZ2V0KCk7CisgICAgbV9ibG9ja3MuYXBwZW5kKFdURjo6bW92ZShi
bG9jaykpOworICAgIHJldHVybiByZXN1bHQ7Cit9CisKK3ZvaWQgUHJvY2VkdXJlOjpkdW1wKFBy
aW50U3RyZWFtJiBvdXQpIGNvbnN0Cit7CisgICAgZm9yIChCYXNpY0Jsb2NrKiBibG9jayA6ICp0
aGlzKQorICAgICAgICBvdXQucHJpbnQoKmJsb2NrKTsKK30KKworfSB9IC8vIG5hbWVzcGFjZSBK
U0M6OkIzCkluZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNQcm9jZWR1cmUuaAo9PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNQcm9jZWR1cmUuaAkocmV2aXNp
b24gMCkKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM1Byb2NlZHVyZS5oCSh3b3JraW5n
IGNvcHkpCkBAIC0wLDAgKzEsMTE1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE1IEFwcGxl
IEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNl
IGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNh
dGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9u
cworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0
IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBj
b25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1
dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAor
ICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBk
aXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJp
YWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJF
IElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1Mg
T1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhF
CisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZP
UiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBT
SEFMTCBBUFBMRSBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElS
RUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09O
U0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBS
T0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBE
QVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENB
VVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRS
QUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0Ug
T1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRI
SVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBE
QU1BR0UuIAorICovCisKKyNpZm5kZWYgQjNQcm9jZWR1cmVfaAorI2RlZmluZSBCM1Byb2NlZHVy
ZV9oCisKKyNpbmNsdWRlIDx3dGYvQmFnLmg+CisjaW5jbHVkZSA8d3RmL0Zhc3RNYWxsb2MuaD4K
KyNpbmNsdWRlIDx3dGYvTm9uY29weWFibGUuaD4KKyNpbmNsdWRlIDx3dGYvVmVjdG9yLmg+CisK
K25hbWVzcGFjZSBKU0MgeyBuYW1lc3BhY2UgQjMgeworCitjbGFzcyBCYXNpY0Jsb2NrOworY2xh
c3MgVmFsdWU7CisKK2NsYXNzIFByb2NlZHVyZSB7CisgICAgV1RGX01BS0VfTk9OQ09QWUFCTEUo
UHJvY2VkdXJlKTsKKyAgICBXVEZfTUFLRV9GQVNUX0FMTE9DQVRFRDsKK3B1YmxpYzoKKworICAg
IFByb2NlZHVyZSgpOworICAgIH5Qcm9jZWR1cmUoKTsKKworICAgIEJhc2ljQmxvY2sqIGFwcGVu
ZEJsb2NrKCk7CisgICAgCisgICAgdGVtcGxhdGU8dHlwZW5hbWUuLi4gQXJndW1lbnRzPgorICAg
IFZhbHVlKiBuZXdWYWx1ZShBcmd1bWVudHMuLi4pOworCisgICAgdm9pZCBkdW1wKFByaW50U3Ry
ZWFtJikgY29uc3Q7CisKKyAgICB1bnNpZ25lZCBudW1CbG9ja3MoKSBjb25zdCB7IHJldHVybiBt
X2Jsb2Nrcy5zaXplKCk7IH0KKyAgICBCYXNpY0Jsb2NrKiBibG9jayh1bnNpZ25lZCBpbmRleCkg
Y29uc3QgeyByZXR1cm4gbV9ibG9ja3NbaW5kZXhdOyB9CisKKyAgICBjbGFzcyBpdGVyYXRvciB7
CisgICAgcHVibGljOgorICAgICAgICBpdGVyYXRvcigpOgorICAgICAgICAgICAgOiBtX3Byb2Nl
ZHVyZShudWxscHRyKQorICAgICAgICAgICAgLCBtX2luZGV4KDApCisgICAgICAgIHsKKyAgICAg
ICAgfQorCisgICAgICAgIGl0ZXJhdG9yKFByb2NlZHVyZSYgcHJvY2VkdXJlLCB1bnNpZ25lZCBp
bmRleCkKKyAgICAgICAgICAgIDogbV9wcm9jZWR1cmUoJnByb2NlZHVyZSkKKyAgICAgICAgICAg
ICwgbV9pbmRleChpbmRleCkKKyAgICAgICAgeworICAgICAgICB9CisKKyAgICAgICAgQmFzaWNC
bG9jayogb3BlcmF0b3IqKCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIG1fcHJvY2Vk
dXJlLT5ibG9jayhtX2luZGV4KTsKKyAgICAgICAgfQorCisgICAgICAgIGl0ZXJhdG9yJiBvcGVy
YXRvcisrKCkKKyAgICAgICAgeworICAgICAgICAgICAgbV9pbmRleCA9IGZpbmROZXh0KG1faW5k
ZXggKyAxKTsKKyAgICAgICAgICAgIHJldHVybiAqdGhpczsKKyAgICAgICAgfQorCisgICAgICAg
IGJvb2wgb3BlcmF0b3I9PShjb25zdCBpdGVyYXRvciYgb3RoZXIpIGNvbnN0CisgICAgICAgIHsK
KyAgICAgICAgICAgIHJldHVybiBtX2luZGV4ID09IG90aGVyLm1faW5kZXg7CisgICAgICAgIH0K
KworICAgICAgICBib29sIG9wZXJhdG9yIT0oY29uc3QgaXRlcmF0b3ImIG90aGVyKSBjb25zdAor
ICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gISgqdGhpcyA9PSBvdGhlcik7CisgICAgICAg
IH0KKworICAgIHByaXZhdGU6CisgICAgICAgIHVuc2lnbmVkIGZpbmROZXh0KHVuc2lnbmVkIGlu
ZGV4KQorICAgICAgICB7CisgICAgICAgICAgICB3aGlsZSAoaW5kZXggPCBtX3Byb2NlZHVyZS0+
bnVtQmxvY2tzKCkgJiYgIW1fcHJvY2VkdXJlLT5ibG9jayhpbmRleCkpCisgICAgICAgICAgICAg
ICAgaW5kZXgrKzsKKyAgICAgICAgICAgIHJldHVybiBpbmV4OworICAgICAgICB9CisKKyAgICAg
ICAgUHJvY2VkdXJlKiBtX3Byb2NlZHVyZTsKKyAgICAgICAgdW5zaWduZWQgbV9pbmRleDsKKyAg
ICB9OworCisgICAgaXRlcmF0b3IgYmVnaW4oKSBjb25zdCB7IHJldHVybiBpdGVyYXRvcigqdGhp
cywgMCk7IH0KKyAgICBpdGVyYXRvciBlbmQoKSBjb25zdCB7IHJldHVybiBpdGVyYXRvcigqdGhp
cywgbnVtQmxvY2tzKCkpOyB9CisKK3ByaXZhdGU6CisgICAgVmVjdG9yPHN0ZDo6dW5pcXVlX3B0
cjxCYXNpY0Jsb2NrPj4gbV9ibG9ja3M7CisgICAgQmFnPFZhbHVlPiBtX3ZhbHVlczsKK307CisK
K30gfSAvLyBuYW1lc3BhY2UgSlNDOjpCMworCisjZW5kaWYgLy8gQjNQcm9jZWR1cmVfaAorCklu
ZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNQcm9jZWR1cmVJbmxpbmVzLmgKPT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzUHJvY2VkdXJlSW5saW5lcy5oCShy
ZXZpc2lvbiAwKQorKysgU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzUHJvY2VkdXJlSW5saW5l
cy5oCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsNDMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMp
IDIwMTUgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0
aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAor
ICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2lu
ZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJj
ZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhp
cyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIu
IFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUg
Y29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUg
Zm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBv
dGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRI
SVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQor
ICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1J
VEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5E
IEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElO
IE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUg
Rk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBM
QVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVE
IFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9T
UyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04p
IEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRI
RVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcg
TkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVT
RQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElU
WSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKworI2lmbmRlZiBCM1Byb2NlZHVyZUlubGluZXNfaAor
I2RlZmluZSBCM1Byb2NlZHVyZUlubGluZXNfaAorCisjaW5jbHVkZSAiQjNCYXNpY0Jsb2NrLmgi
CisjaW5jbHVkZSAiQjNQcm9jZWR1cmUuaCIKKworbmFtZXNwYWNlIEpTQyB7IG5hbWVzcGFjZSBC
MyB7CisKK3RlbXBsYXRlPHR5cGVuYW1lLi4uIEFyZ3VtZW50cz4KK1ZhbHVlKiBQcm9jZWR1cmU6
Om5ld1ZhbHVlKEFyZ3VlbnRzLi4uIGFyZ3VtZW50cykKK3sKKyAgICByZXR1cm4gbV92YWx1ZXMu
YWRkKG1fdmFsdWVzLnNpemUoKSwgYXJndW1lbnRzLi4uKTsKK30KKworfSB9IC8vIG5hbWVzcGFj
ZSBKU0M6OkIzCisKKyNlbmRpZiAvLyBCM1Byb2NlZHVyZUlubGluZXNfaAorCkluZGV4OiBTb3Vy
Y2UvSmF2YVNjcmlwdENvcmUvYjMvQjNUeXBlLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2
YVNjcmlwdENvcmUvYjMvQjNUeXBlLmNwcAkocmV2aXNpb24gMCkKKysrIFNvdXJjZS9KYXZhU2Ny
aXB0Q29yZS9iMy9CM1R5cGUuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsNTQgQEAKKy8q
CisgKiBDb3B5cmlnaHQgKEMpIDIwMTUgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgor
ICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMs
IHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVk
IHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0
cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQK
KyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcg
ZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJl
cHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBj
b25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1
bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJp
YnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBg
YEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xV
RElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBN
RVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBB
UkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IKKyAqIENPTlRS
SUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBT
UEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElO
RywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09E
UyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJ
TkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBP
RiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRP
UlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5Z
IFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VE
IE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKworI2luY2x1ZGUgImNv
bmZpZy5oIgorI2luY2x1ZGUgIkIzVHlwZS5oIgorCisjaW5jbHVkZSA8d3RmL1ByaW50U3RyZWFt
Lmg+CisKK25hbWVzcGFjZSBXVEYgeworCit1c2luZyBuYW1lc3BhY2UgSlNDOjpCMzsKKwordm9p
ZCBwcmludEludGVybmFsKFByaW50U3RyZWFtJiBvdXQsIFR5cGUgdHlwZSkKK3sKKyAgICBzd2l0
Y2ggKHR5cGUpIHsKKyAgICBjYXNlIFZvaWQ6CisgICAgICAgIG91dC5wcmludCgiVm9pZCIpOwor
ICAgICAgICByZXR1cm47CisgICAgY2FzZSBJbnQzMjoKKyAgICAgICAgb3V0LnByaW50KCJJbnQz
MiIpOworICAgICAgICByZXR1cm47CisgICAgY2FzZSBJbnQ2NDoKKyAgICAgICAgb3V0LnByaW50
KCJJbnQ2NCIpOworICAgICAgICByZXR1cm47CisgICAgY2FzZSBEb3VibGU6CisgICAgICAgIG91
dC5wcmludCgiRG91YmxlIik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgUkVMRUFTRV9B
U1NFUlRfTk9UX1JFQUNIRUQoKTsKK30KKworfSAvLyBuYW1lc3BhY2UgV1RGCkluZGV4OiBTb3Vy
Y2UvSmF2YVNjcmlwdENvcmUvYjMvQjNUeXBlLmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL0phdmFT
Y3JpcHRDb3JlL2IzL0IzVHlwZS5oCShyZXZpc2lvbiAwKQorKysgU291cmNlL0phdmFTY3JpcHRD
b3JlL2IzL0IzVHlwZS5oCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsNTYgQEAKKy8qCisgKiBD
b3B5cmlnaHQgKEMpIDIwMTUgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAq
IFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGgg
b3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQg
dGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRp
b25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAg
IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xh
aW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVj
ZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRp
b25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0
aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9u
LgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFTIElT
JycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywg
QlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFO
VEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElT
Q0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IKKyAqIENPTlRSSUJVVE9S
UyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFM
LAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVU
IE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBT
RVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJ
TlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFC
SUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAq
IChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBP
VVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRI
RSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKworI2lmbmRlZiBCM1R5cGVfaAor
I2RlZmluZSBCM1R5cGVfaAorCituYW1lc3BhY2UgSlNDIHsgbmFtZXNwYWNlIEIzIHsKKworZW51
bSBUeXBlIHsKKyAgICBWb2lkLAorICAgIEludDMyLAorICAgIEludDY0LAorICAgIERvdWJsZQor
fTsKKworVHlwZSBwb2ludGVyKCkgY29uc3QKK3sKKyAgICBpZiAoc2l6ZW9mKHZvaWQqKSA9PSA0
KQorICAgICAgICByZXR1cm4gSW50MzI7CisgICAgcmV0dXJuIEludDY0OworfQorCit9IH0gLy8g
bmFtZXNwYWNlIEpTQzo6QjMKKworbmFtZXNwYWNlIFdURiB7CisKK2NsYXNzIFByaW50U3RyZWFt
OworCit2b2lkIHByaW50SW50ZXJuYWwoUHJpbnRTdHJlYW0mLCBKU0M6OkIzOjpUeXBlKTsKKwor
fSAvLyBuYW1lc3BhY2UgV1RGCisKKyNlbmRpZiAvLyBCM1R5cGVfaAorCkluZGV4OiBTb3VyY2Uv
SmF2YVNjcmlwdENvcmUvYjMvQjNWYWx1ZS5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2Ny
aXB0Q29yZS9iMy9CM1ZhbHVlLmgJKHJldmlzaW9uIDApCisrKyBTb3VyY2UvSmF2YVNjcmlwdENv
cmUvYjMvQjNWYWx1ZS5oCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsMTEyIEBACisvKgorICog
Q29weXJpZ2h0IChDKSAyMDE1IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisg
KiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRo
IG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0
IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0
aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAg
ICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2Ns
YWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1
Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0
aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRh
dGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlv
bi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gYGBBUyBJ
UycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcs
IEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hB
TlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJ
U0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SCisgKiBDT05UUklCVVRP
UlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lB
TCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJV
VCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1Ig
U0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1Mg
SU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElB
QklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisg
KiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkg
T1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBU
SEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisKKyNpZm5kZWYgQjNWYWx1ZV9o
CisjZGVmaW5lIEIzVmFsdWVfaAorCisjaW5jbHVkZSA8d3RmL0Zhc3RNYWxsb2MuaD4KKyNpbmNs
dWRlIDx3dGYvTm9uY29weWFibGUuaD4KKworbmFtZXNwYWNlIEpTQyB7IG5hbWVzcGFjZSBCMyB7
CisKK2NsYXNzIFZhbHVlIHsKKyAgICBXVEZfTUFLRV9OT05DT1BZQUJMRShWYWx1ZSk7CisgICAg
V1RGX01BS0VfRkFTVF9BTExPQ0FURUQ7CitwdWJsaWM6CisgICAgdHlwZWRlZiBWZWN0b3I8VmFs
dWUqLCAzPiBBZGphY2VuY3lMaXN0OworCisgICAgdmlydHVhbCB+VmFsdWUoKTsKKworICAgIHVu
c2lnbmVkIGluZGV4KCkgY29uc3QgeyByZXR1cm4gbV9pbmRleDsgfQorICAgIAorICAgIC8vIE5v
dGUgdGhhdCB0aGUgb3Bjb2RlIGlzIGltbXV0YWJsZSwgZXhjZXB0IGZvciByZXBsYWNpbmcgdmFs
dWVzIHdpdGggaWRlbnRpdHkuCisgICAgT3Bjb2RlIG9wY29kZSgpIGNvbnN0IHsgcmV0dXJuIG1f
b3Bjb2RlOyB9CisKKyAgICBPcmlnaW4gb3JpZ2luKCkgY29uc3QgeyByZXR1cm4gbV9vcmlnaW47
IH0KKyAgICAKKyAgICBWYWx1ZSomIGNoaWxkKHVuc2lnbmVkIGluZGV4KSB7IHJldHVybiBtX2No
aWxkcmVuW2luZGV4XTsgfQorICAgIFZhbHVlKiBjaGlsZCh1bnNpZ25lZCBpbmRleCkgY29uc3Qg
eyByZXR1cm4gbV9jaGlsZHJlbltpbmRleF07IH0KKworICAgIC8vIFRoaXMgY29tcHV0ZXMgdGhl
IHR5cGUgdXNpbmcgdGhlIG9wY29kZS4KKyAgICBUeXBlIHR5cGUoKSBjb25zdDsKKworICAgIEFk
amFjZW5jeUxpc3QmIGNoaWxkcmVuKCkgeyByZXR1cm4gbV9jaGlsZHJlbjsgfSAKKyAgICBjb25z
dCBBZGphY2VuY3lMaXN0JiBjaGlsZHJlbigpIGNvbnN0IHsgcmV0dXJuIG1fY2hpbGRyZW47IH0K
KworICAgIHZvaWQgcmVwbGFjZVdpdGhJZGVudGl0eShWYWx1ZSopOworCisgICAgdm9pZCBkdW1w
KFByaW50U3RyZWFtJikgY29uc3Q7CisgICAgdm9pZCBkZWVwRHVtcChQcmludFN0cmVhbSYpIGNv
bnN0OworICAgIAorcHJpdmF0ZToKKyAgICAvLyBJbnN0YW50aWF0ZSB2YWx1ZXMgdmlhIFByb2Nl
ZHVyZS4KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZS4uLiBBcmd1bWVudHM+CisgICAgZXhwbGljaXQg
VmFsdWUodW5zaWduZWQgaW5kZXgsIE9wY29kZSBvcGNvZGUsIE9yaWdpbiBvcmlnaW4sIEFyZ3Vt
ZW50cy4uLiBhcmd1bWVudHMpCisgICAgICAgIDogbV9pbmRleChpbmRleCkKKyAgICAgICAgLCBt
X29wY29kZShvcGNvZGUpCisgICAgICAgICwgbV9vcmlnaW4ob3JpZ2luKQorICAgICAgICAsIG1f
Y2hpbGRyZW57IGFyZ3VtZW50cy4uLiB9CisgICAgeworICAgIH0KKworICAgIHVuc2lnbmVkIG1f
aW5kZXg7CisgICAgT3Bjb2RlIG1fb3Bjb2RlOworICAgIE9yaWdpbiBtX29yaWdpbjsKKyAgICBB
ZGphY2VuY3lMaXN0IG1fY2hpbGRyZW47CisKK3B1YmxpYzoKKyAgICBCYXNpY0Jsb2NrKiBvd25l
cjsgLy8gY29tcHV0ZWQgbGF6aWx5LgorICAgIFZhbHVlKiByZXBsYWNlbWVudDsgLy8gdXNlZCBm
b3IgYW5hbHlzZXMgYW5kIHRyYW5zZm9ybWF0aW9ucy4KKyAgICB2b2lkKiBtaXNjOworfTsKKwor
Y2xhc3MgRGVlcFZhbHVlRHVtcCB7CitwdWJsaWM6CisgICAgRGVlcFZhbHVlRHVtcChWYWx1ZSog
dmFsdWUpCisgICAgICAgIDogbV92YWx1ZSh2YWx1ZSkKKyAgICB7CisgICAgfQorCisgICAgdm9p
ZCBkdW1wKFByaW50U3RyZWFtJiBvdXQpIGNvbnN0CisgICAgeworICAgICAgICBpZiAobV92YWx1
ZSkKKyAgICAgICAgICAgIG1fdmFsdWUtPmRlZXBEdW1wKG91dCk7CisgICAgICAgIGVsc2UKKyAg
ICAgICAgICAgIG91dC5wcmludCgiPG51bGw+Iik7CisgICAgfQorCitwcml2YXRlOgorICAgIFZh
bHVlKiBtX3ZhbHVlOworfTsKKworRGVlcFZhbHVlRHVtcCBkZWVwRHVtcChWYWx1ZSogdmFsdWUp
Cit7CisgICAgcmV0dXJuIERlZXBWYWx1ZUR1bXAodmFsdWUpOworfQorCit9IH0gLy8gbmFtZXNw
YWNlIEpTQzo6QjMKKworI2VuZGlmIC8vIEIzVmFsdWVfaAorCg==
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>263404</attachid>
            <date>2015-10-17 20:31:43 -0700</date>
            <delta_ts>2015-10-17 23:06:45 -0700</delta_ts>
            <desc>just a bit more</desc>
            <filename>blah.patch</filename>
            <type>text/plain</type>
            <size>41913</size>
            <attacher name="Filip Pizlo">fpizlo</attacher>
            
              <data encoding="base64">SW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM0Jhc2ljQmxvY2suY3BwCj09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM0Jhc2ljQmxvY2suY3BwCShyZXZpc2lv
biAwKQorKysgU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzQmFzaWNCbG9jay5jcHAJKHdvcmtp
bmcgY29weSkKQEAgLTAsMCArMSw1OCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNSBBcHBs
ZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVz
ZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmlj
YXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlv
bnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVz
dCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2Yg
Y29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmli
dXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQK
KyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcg
ZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVy
aWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FS
RSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNT
IE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRI
RQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBG
T1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQg
U0hBTEwgQVBQTEUgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJ
UkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENP
TlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQ
Uk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwg
REFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBD
QVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05U
UkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNF
IE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBU
SElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0gg
REFNQUdFLiAKKyAqLworCisjaW5jbHVkZSAiY29uZmlnLmgiCisjaW5jbHVkZSAiQjNCYXNpY0Js
b2NrLmgiCisKK25hbWVzcGFjZSBKU0MgeyBuYW1lc3BhY2UgQjMgeworCitCYXNpY0Jsb2NrOjpC
YXNpY0Jsb2NrKHVuc2lnbmVkIGluZGV4KQorICAgIDogbV9pbmRleChpbmRleCkKK3sKK30KKwor
QmFzaWNCbG9jazo6fkJhc2ljQmxvY2soKQoreworfQorCit2b2lkIEJhc2ljQmxvY2s6OmFwcGVu
ZChWYWx1ZSogdmFsdWUpCit7CisgICAgbV92YWx1ZXMuYXBwZW5kKHZhbHVlKTsKK30KKwordm9p
ZCBCYXNpY0Jsb2NrOjpkdW1wKFByaW50U3RyZWFtJiBvdXQpIGNvbnN0Cit7CisgICAgb3V0LnBy
aW50KGR1bXBQcmVmaXgsIG1faW5kZXgpOworfQorCit2b2lkIEJhc2ljQmxvY2s6OmRlZXBEdW1w
KFByaW50U3RyZWFtJiBvdXQpIGNvbnN0Cit7CisgICAgb3V0LnByaW50KCJCQiIsICp0aGlzLCAi
OlxuIik7CisgICAgZm9yIChWYWx1ZSogdmFsdWUgOiAqdGhpcykKKyAgICAgICAgb3V0LnByaW50
KCIgICAgIiwgZGVlcER1bXAodmFsdWUpLCAiXG4iKTsKK30KKworfSB9IC8vIG5hbWVzcGFjZSBK
U0M6OkIzCisKSW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM0Jhc2ljQmxvY2suaAo9
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNCYXNpY0Jsb2NrLmgJKHJl
dmlzaW9uIDApCisrKyBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNCYXNpY0Jsb2NrLmgJKHdv
cmtpbmcgY29weSkKQEAgLTAsMCArMSwxMDYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTUg
QXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFu
ZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9k
aWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25k
aXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2Rl
IG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0
IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlz
dHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJp
Z2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93
aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBt
YXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09G
VFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQ
UkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRP
LCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5F
U1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVW
RU5UIFNIQUxMIEFQUExFIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFO
WSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBP
UiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAor
ICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBV
U0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VW
RVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4g
Q09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElH
RU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICog
T0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBT
VUNIIERBTUFHRS4gCisgKi8KKworI2lmbmRlZiBCM0Jhc2ljQmxvY2sKKyNkZWZpbmUgQjNCYXNp
Y0Jsb2NrCisKK25hbWVzcGFjZSBKU0MgeyBuYW1lc3BhY2UgQjMgeworCitjbGFzcyBQcm9jZWR1
cmU7CitjbGFzcyBWYWx1ZTsKKworY2xhc3MgQmFzaWNCbG9jayB7CisgICAgV1RGX01BS0VfTk9O
Q09QWUFCTEUoQmFzaWNCbG9jayk7CisgICAgV1RGX01BS0VfRkFTVF9BTExPQ0FURUQ7CitwdWJs
aWM6CisgICAgdHlwZWRlZiBWZWN0b3I8VmFsdWUqPiBWYWx1ZUxpc3Q7CisKKyAgICBzdGF0aWMg
Y29uc3QgY2hhciogZHVtcFByZWZpeCA9ICIjIjsKKworICAgIH5CYXNpY0Jsb2NrKCk7CisKKyAg
ICB1bnNpZ25lZCBpbmRleCgpIGNvbnN0IHsgcmV0dXJuIG1faW5kZXg7IH0KKworICAgIEFkamFj
ZW5jeUxpc3Q6Oml0ZXJhdG9yIGJlZ2luKCkgeyByZXR1cm4gbV92YWx1ZXMuYmVnaW4oKTsgfQor
ICAgIEFkamFjZW5jeUxpc3Q6Oml0ZXJhdG9yIGVuZCgpIHsgcmV0dXJuIG1fdmFsdWVzLmVuZCgp
OyB9CisgICAgQWRqYWNlbmN5TGlzdDo6Y29uc3RfaXRlcmF0b3IgYmVnaW4oKSBjb25zdCB7IHJl
dHVybiBtX3ZhbHVlcy5iZWdpbigpOyB9CisgICAgQWRqYWNlbmN5TGlzdDo6Y29uc3RfaXRlcmF0
b3IgZW5kKCkgY29uc3QgeyByZXR1cm4gbV92YWx1ZXMuZW5kKCk7IH0KKworICAgIHNpemVfdCBz
aXplKCkgY29uc3QgeyByZXR1cm4gbV92YWx1ZXMuc2l6ZSgpOyB9CisgICAgVmFsdWUqIGF0KHNp
emVfdCBpbmRleCkgY29uc3QgeyByZXR1cm4gbV92YWx1ZXNbaW5kZXhdOyB9CisgICAgVmFsdWUq
JiBhdChzaXplX3QgaW5kZXgpIHsgcmV0dXJuIG1fdmFsdWVzW2luZGV4XTsgfQorCisgICAgVmFs
dWUqIGxhc3QoKSBjb25zdCB7IHJldHVybiBtX3ZhbHVlcy5sYXN0KCk7IH0KKyAgICBWYWx1ZSom
IGxhc3QoKSB7IHJldHVybiBtX3ZhbHVlcy5sYXN0KCk7IH0KKworICAgIGNvbnN0IFZhbHVlTGlz
dCYgdmFsdWVzKCkgY29uc3QgeyByZXR1cm4gbV92YWx1ZXM7IH0KKyAgICBWYWx1ZUxpc3QmIHZh
bHVlcygpIHsgcmV0dXJuIG1fdmFsdWVzOyB9CisKKyAgICB2b2lkIGFwcGVuZChWYWx1ZSopOwor
CisgICAgdGVtcGxhdGU8dHlwZW5hbWUuLi4gQXJndW1lbnRzPgorICAgIFZhbHVlKiBhcHBlbmRO
ZXdWYWx1ZShQcm9jZWR1cmUmLCBBcmd1bWVudHMuLi4pOworCisgICAgdm9pZCBkdW1wKFByaW50
U3RyZWFtJikgY29uc3Q7CisgICAgdm9pZCBkZWVwRHVtcChQcmludFN0cmVhbSYpIGNvbnN0Owor
Citwcml2YXRlOgorICAgIGZyaWVuZCBjbGFzcyBQcm9jZWR1cmU7CisgICAgCisgICAgLy8gSW5z
dGFudGlhdGUgdmlhIFByb2NlZHVyZS4KKyAgICBCYXNpY0Jsb2NrKHVuc2lnbmVkIGluZGV4KTsK
KworICAgIHVuc2lnbmVkIG1faW5kZXg7CisgICAgVmFsdWVMaXN0IG1fdmFsdWVzOworfTsKKwor
Y2xhc3MgRGVlcEJhc2ljQmxvY2tEdW1wIHsKK3B1YmxpYzoKKyAgICBEZWVwQmFzaWNCbG9ja0R1
bXAoQmFzaWNCbG9jayogYmxvY2spCisgICAgICAgIDogbV9ibG9jayhibG9jaykKKyAgICB7Cisg
ICAgfQorCisgICAgdm9pZCBkdW1wKFByaW50U3RyZWFtJiBvdXQpIGNvbnN0CisgICAgeworICAg
ICAgICBpZiAobV9ibG9jaykKKyAgICAgICAgICAgIG1fYmxvY2stPmRlZXBEdW1wKG91dCk7Cisg
ICAgICAgIGVsc2UKKyAgICAgICAgICAgIG91dC5wcmludCgiPG51bGw+Iik7CisgICAgfQorCitw
cml2YXRlOgorICAgIEJhc2ljQmxvY2sqIG1fYmxvY2s7Cit9OworCitEZWVwQmFzaWNCbG9ja0R1
bXAgZGVlcER1bXAoQmFzaWNCbG9jayogYmxvY2spCit7CisgICAgcmV0dXJuIERlZXBCYXNpY0Js
b2NrRHVtcChibG9jayk7Cit9CisKK30gfSAvLyBuYW1lc3BhY2UgSlNDOjpCMworCisjZW5kaWYg
Ly8gQjNCYXNpY0Jsb2NrCisKSW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM0Jhc2lj
QmxvY2tJbmxpbmVzLmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0Iz
QmFzaWNCbG9ja0lubGluZXMuaAkocmV2aXNpb24gMCkKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29y
ZS9iMy9CM0Jhc2ljQmxvY2tJbmxpbmVzLmgJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSw0NSBA
QAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNSBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2
ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBm
b3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJv
dmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBS
ZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHly
aWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxv
d2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11
c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0
IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAg
IGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBk
aXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJ
TkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywg
SU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVT
IE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQ
T1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUgorICog
Q09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5U
QUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5D
TFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRF
IEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9S
IEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkK
KyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwg
T1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJ
TiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFE
VklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLiAKKyAqLworCisjaWZuZGVm
IEIzQmFzaWNCbG9ja0lubGluZXNfaAorI2RlZmluZSBCM0Jhc2ljQmxvY2tJbmxpbmVzX2gKKwor
I2luY2x1ZGUgIkIzQmFzaWNCbG9jay5oIgorI2luY2x1ZGUgIkIzUHJvY2VkdXJlSW5saW5lcy5o
IgorCituYW1lc3BhY2UgSlNDIHsgbmFtZXNwYWNlIEIzIHsKKwordGVtcGxhdGU8dHlwZW5hbWUu
Li4gQXJndW1lbnRzPgorVmFsdWUqIEJhc2ljQmxvY2s6OmFwcGVuZE5ld1ZhbHVlKFByb2NlZHVy
ZSYgcHJvY2VkdXJlLCBBcmd1bWVudHMuLi4gYXJndW1lbnRzKQoreworICAgIFZhbHVlKiByZXN1
bHQgPSBwcm9jZWR1cmUubmV3VmFsdWUoYXJndW1lbnRzLi4uKTsKKyAgICBhcHBlbmQocmVzdWx0
KTsKKyAgICByZXR1cm4gcmVzdWx0OworfQorCit9IH0gLy8gbmFtZXNwYWNlIEpTQzo6QjMKKwor
I2VuZGlmIC8vIEIzQmFzaWNCbG9ja0lubGluZXNfaAorCkluZGV4OiBTb3VyY2UvSmF2YVNjcmlw
dENvcmUvYjMvQjNJbmRleFNldC5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29y
ZS9iMy9CM0luZGV4U2V0LmgJKHJldmlzaW9uIDApCisrKyBTb3VyY2UvSmF2YVNjcmlwdENvcmUv
YjMvQjNJbmRleFNldC5oCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsMTQxIEBACisvKgorICog
Q29weXJpZ2h0IChDKSAyMDE1IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisg
KiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRo
IG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0
IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0
aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAg
ICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2Ns
YWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1
Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0
aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRh
dGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlv
bi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gYGBBUyBJ
UycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcs
IEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hB
TlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJ
U0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SCisgKiBDT05UUklCVVRP
UlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lB
TCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJV
VCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1Ig
U0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1Mg
SU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElB
QklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisg
KiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkg
T1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBU
SEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisKKyNpZm5kZWYgQjNJbmRleFNl
dF9oCisjZGVmaW5lIEIzSW5kZXhTZXRfaAorCisjaW5jbHVkZSA8d3RmL0JpdFZlY3Rvci5oPgor
I2luY2x1ZGUgPHd0Zi9Db21tYVByaW50ZXIuaD4KKworbmFtZXNwYWNlIEpTQyB7IG5hbWVzcGFj
ZSBCMyB7CisKKy8vIFRoaXMgaXMgYSBzZXQgZm9yIHRoaW5ncyB0aGF0IGhhdmUgYW4gaW5kZXgo
KS4gSXQncyBzdXBlciBlZmZpY2llbnQgZm9yIEJhc2ljQmxvY2tzLiBJdCdzIG9ubHkKKy8vIGVm
ZmljaWVudCBmb3IgVmFsdWVzIGlmIHlvdSBkb24ndCBjcmVhdGUgdG9vIG1hbnkgb2YgdGhlc2Ug
c2V0cywgc2luY2UgVmFsdWVzIGNhbiBoYXZlIHZlcnkgc3BhcnNlCisvLyBpbmRpY2VzIGFuZCB0
aGVyZSBhcmUgYSBsb3Qgb2YgVmFsdWVzLgorCisvLyBJZiB5b3Ugd2FudCBhIHNldCBvZiBCYXNp
Y0Jsb2NrcywgeW91IGRvIEluZGV4U2V0PEJhc2ljQmxvY2s+LiBTbywgVCA9IEJhc2ljQmxvY2su
Cit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorY2xhc3MgSW5kZXhTZXQgeworcHVibGljOgorICAgIElu
ZGV4U2V0KCkKKyAgICB7CisgICAgfQorCisgICAgYm9vbCBhZGQoVCogdmFsdWUpCisgICAgewor
ICAgICAgICByZXR1cm4gIW1fc2V0LnNldCh2YWx1ZS0+aW5kZXgoKSk7CisgICAgfQorCisgICAg
Ym9vbCBjb250YWlucyhUKiB2YWx1ZSkgY29uc3QKKyAgICB7CisgICAgICAgIGlmICghdmFsdWUp
CisgICAgICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICAgICAgcmV0dXJuIG1fc2V0LmdldCh2
YWx1ZS0+aW5kZXgoKSk7CisgICAgfQorCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgQ29sbGVjdGlv
blR5cGU+CisgICAgY2xhc3MgSXRlcmFibGUgeworICAgIHB1YmxpYzoKKyAgICAgICAgSXRlcmFi
bGUoY29uc3QgQ29sbGVjdGlvblR5cGUmIGNvbGxlY3Rpb24sIGNvbnN0IEluZGV4U2V0JiBzZXQp
CisgICAgICAgICAgICA6IG1fY29sbGVjdGlvbihjb2xsZWN0aW9uKQorICAgICAgICAgICAgLCBt
X3NldChzZXQpCisgICAgICAgIHsKKyAgICAgICAgfQorCisgICAgICAgIGNsYXNzIGl0ZXJhdG9y
IHsKKyAgICAgICAgcHVibGljOgorICAgICAgICAgICAgaXRlcmF0b3IoKQorICAgICAgICAgICAg
ICAgIDogbV9jb2xsZWN0aW9uKG51bGxwdHIpCisgICAgICAgICAgICB7CisgICAgICAgICAgICB9
CisKKyAgICAgICAgICAgIGl0ZXJhdG9yKGNvbnN0IENvbGxlY3Rpb25UeXBlJiBjb2xsZWN0aW9u
LCBCaXRWZWN0b3I6OlNldEJpdHNJdGVyYWJsZTo6aXRlcmF0b3IgaXRlcikKKyAgICAgICAgICAg
ICAgICA6IG1fY29sbGVjdGlvbigmY29sbGVjdGlvbikKKyAgICAgICAgICAgICAgICAsIG1faXRl
cihpdGVyKQorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBUKiBv
cGVyYXRvciooKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBtX2NvbGxl
Y3Rpb24tPmF0KCptX2l0ZXIpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpdGVyYXRv
ciYgb3BlcmF0b3IrKygpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbV9pdGVyKys7
CisgICAgICAgICAgICAgICAgcmV0dXJuICp0aGlzOworICAgICAgICAgICAgfQorCisgICAgICAg
ICAgICBib29sIG9wZXJhdG9yPT0oY29uc3QgaXRlcmF0b3ImIG90aGVyKSBjb25zdAorICAgICAg
ICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBtX2l0ZXIgPT0gb3RoZXIubV9pdGVyOwor
ICAgICAgICAgICAgfQorCisgICAgICAgICAgICBib29sIG9wZXJhdG9yIT0oY29uc3QgaXRlcmF0
b3ImIG90aGVyKSBjb25zdAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiAh
KCp0aGlzID09IG90aGVyKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICBwcml2YXRlOgorICAg
ICAgICAgICAgY29uc3QgQ29sbGVjdGlvblR5cGUqIG1fY29sbGVjdGlvbjsKKyAgICAgICAgICAg
IEJpdFZlY3Rvcjo6U2V0Qml0c0l0ZXJhYmxlOjppdGVyYXRvciBtX2l0ZXI7CisgICAgICAgIH07
CisKKyAgICAgICAgaXRlcmF0b3IgYmVnaW4oKSBjb25zdCB7IHJldHVybiBpdGVyYXRvcihtX2Nv
bGxlY3Rpb24sIG1fc2V0LmJlZ2luKCkpOyB9CisgICAgICAgIGl0ZXJhdG9yIGVuZCgpIGNvbnN0
IHsgcmV0dXJuIGl0ZXJhdG9yKG1fY29sbGVjdGlvbiwgbV9zZXQuZW5kKCkpOyB9CisKKyAgICBw
cml2YXRlOgorICAgICAgICBjb25zdCBDb2xsZWN0aW9uVHlwZSYgbV9jb2xsZWN0aW9uOworICAg
ICAgICBjb25zdCBJbmRleFNldCYgbV9zZXQ7CisgICAgfTsKKworICAgIC8vIEZvciBiYXNpYyBi
bG9ja3MsIHlvdSBkbzoKKyAgICAvLyBpbmRleFNldC52YWx1ZXMocHJvY2VkdXJlKTsKKyAgICAv
LworICAgIC8vIEZvciB2YWx1ZXMsIHlvdSBkbzoKKyAgICAvLyBpbmRleFNldC52YWx1ZXMocHJv
Y2VkdXJlLnZhbHVlcygpKTsKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBDb2xsZWN0aW9uVHlwZT4K
KyAgICBJdGVyYWJsZTxDb2xsZWN0aW9uVHlwZT4gdmFsdWVzKGNvbnN0IENvbGxlY3Rpb25UeXBl
JiBjb2xsZWN0aW9uKSBjb25zdAorICAgIHsKKyAgICAgICAgcmV0dXJuIEl0ZXJhYmxlPENvbGxl
Y3Rpb25UeXBlPihjb2xsZWN0aW9uKTsKKyAgICB9CisKKyAgICBjb25zdCBCaXRWZWN0b3ImIGlu
ZGljZXMoKSBjb25zdCB7IHJldHVybiBtX3NldDsgfQorCisgICAgdm9pZCBkdW1wKFByaW50U3Ry
ZWFtJiBvdXQpIGNvbnN0CisgICAgeworICAgICAgICBDb21tYVByaW50ZXIgY29tbWE7CisgICAg
ICAgIGZvciAoc2l6ZV90IGluZGV4IDogaW5kaWNlcygpLnNldEJpdHMoKSkKKyAgICAgICAgICAg
IG91dC5wcmludChjb21tYSwgVDo6ZHVtcFByZWZpeCwgaW5kZXgpOworICAgIH0KKworcHJpdmF0
ZToKKyAgICBCaXRWZWN0b3IgbV9zZXQ7Cit9OworCit9IH0gLy8gbmFtZXNwYWNlIEpTQzo6QjMK
KworI2VuZGlmIC8vIEIzSW5kZXhTZXRfaAorCkluZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUv
YjMvQjNPcGNvZGUuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9C
M09wY29kZS5jcHAJKHJldmlzaW9uIDApCisrKyBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNP
cGNvZGUuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsNDcgQEAKKy8qCisgKiBDb3B5cmln
aHQgKEMpIDIwMTUgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlz
dHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0
aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZv
bGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9m
IHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGlj
ZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4K
KyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUg
YWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFu
ZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFu
ZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoK
KyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFTIElTJycgQU5E
IEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5P
VCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJ
VFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1F
RC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBM
SUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICog
RVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBM
SU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNF
UzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJV
UFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFks
IFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNM
VURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0Yg
VEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NT
SUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKworI2luY2x1ZGUgImNvbmZpZy5oIgorI2lu
Y2x1ZGUgIkIzT3Bjb2RlLmgiCisKKyNpbmNsdWRlIDx3dGYvUHJpbnRTdHJlYW0uaD4KKworbmFt
ZXNwYWNlIFdURiB7CisKK3VzaW5nIG5hbWVzcGFjZSBKU0M6OkIzOworCit2b2lkIHByaW50SW50
ZXJuYWwoUHJpbnRTdHJlYW0mIG91dCwgT3Bjb2RlIG9wY29kZSkKK3sKKyAgICBzd2l0Y2ggKG9w
Y29kZSkgeworICAgIGNhc2UgSWRlbnRpdHk6CisgICAgICAgIG91dC5wcmludCgiSWRlbnRpdHki
KTsKKyAgICAgICAgcmV0dXJuOworICAgICAgICAvLyBGSVhNRQorICAgIH0KKyAgICBSRUxFQVNF
X0FTU0VSVF9OT1RfUkVBQ0hFRCgpOworfQorCit9IC8vIG5hbWVzcGFjZSBXVEYKKwpJbmRleDog
U291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzT3Bjb2RlLmgKPT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNl
L0phdmFTY3JpcHRDb3JlL2IzL0IzT3Bjb2RlLmgJKHJldmlzaW9uIDApCisrKyBTb3VyY2UvSmF2
YVNjcmlwdENvcmUvYjMvQjNPcGNvZGUuaAkod29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDE4MCBA
QAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNSBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2
ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBm
b3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJv
dmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBS
ZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHly
aWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxv
d2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11
c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0
IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAg
IGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBk
aXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJ
TkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywg
SU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVT
IE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQ
T1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUgorICog
Q09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5U
QUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5D
TFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRF
IEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9S
IEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkK
KyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwg
T1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJ
TiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFE
VklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLiAKKyAqLworCisjaWZuZGVm
IEIzT3Bjb2RlX2gKKyNkZWZpbmUgQjNPcGNvZGVfaAorCituYW1lc3BhY2UgSlNDIHsgbmFtZXNw
YWNlIEIzIHsKKworZW51bSBPcGNvZGUgeworICAgIC8vIFBvbHltb3JwaGljIGlkZW50aXR5LCB1
c2FibGUgd2l0aCBhbnkgdmFsdWUgdHlwZS4KKyAgICBJZGVudGl0eSwKKworICAgIC8vIENvbnN0
YW50cy4gVXNlIHRoZSBDb25zdGFudFZhbHVlIGNsYXNzLiBDb25zdGFudHMgZXhpc3QgaW4gdGhl
IGNvbnRyb2wgZmxvdywgc28gdGhhdCB3ZSBjYW4KKyAgICAvLyByZWFzb24gYWJvdXQgd2hlcmUg
d2Ugd291bGQgY29uc3RydWN0IHRoZW0uIExhcmdlIGNvbnN0YW50cyBhcmUgZXhwZW5zaXZlIHRv
IGNyZWF0ZS4KKyAgICBDb25zdDMyLAorICAgIENvbnN0NjQsCisgICAgQ29uc3REb3VibGUsCisK
KyAgICAvLyBUaGUgbWFnaWNhbCBzdGFjayBzbG90LiBUaGlzIGlzIHZpZXdlZCBhcyBleGVjdXRp
bmcgYXQgdGhlIHRvcCBvZiB0aGUgcHJvZ3JhbSByZWdhcmRsZXNzIG9mCisgICAgLy8gd2hlcmUg
aW4gY29udHJvbCBmbG93IHlvdSBwdXQgaXQuIEVhY2ggaW5zdGFuY2Ugb2YgYSBTdGFja1Nsb3Qg
VmFsdWUgZ2V0cyBhIGRpc2pvaW50IHJhbmdlIG9mCisgICAgLy8gc3RhY2sgbWVtb3J5LiBVc2Ug
dGhlIFN0YWNrU2xvdFZhbHVlIGNsYXNzLgorICAgIFN0YWNrU2xvdCwKKworICAgIC8vIFRoZSBt
YWdpY2FsIGFyZ3VtZW50IHJlZ2lzdGVyLiBUaGlzIGlzIHZpZXdlZCBhcyBleGVjdXRpbmcgYXQg
dGhlIHRvcCBvZiB0aGUgcHJvZ3JhbQorICAgIC8vIHJlZ2FyZGxlc3Mgb2Ygd2hlcmUgaW4gY29u
dHJvbCBmbG93IHlvdSBwdXQgaXQsIGFuZCB0aGUgY29tcGlsZXIgdGFrZXMgY2FyZSB0byBlbnN1
cmUgdGhhdCB3ZQorICAgIC8vIGRvbid0IGNsb2JiZXIgdGhlIHZhbHVlIGJ5IHJlZ2lzdGVyIGFs
bG9jYXRpb24gb3IgY2FsbHMgKGVpdGhlciBieSBzYXZpbmcgdGhlIGFyZ3VtZW50IHRvIHRoZQor
ICAgIC8vIHN0YWNrIG9yIHByZXNlcnZpbmcgaXQgaW4gYSBjYWxsZWUtc2F2ZSByZWdpc3Rlciku
IFVzZSB0aGUgQXJndW1lbnRSZWdWYWx1ZSBjbGFzcy4KKyAgICBBcmd1bWVudFJlZywKKworICAg
IC8vIFRoZSBmcmFtZSBwb2ludGVyLiBZb3UgY2FuIHB1dCB0aGlzIGFueXdoZXJlIGluIGNvbnRy
b2wgZmxvdyBidXQgaXQgd2lsbCBhbHdheXMgeWllbGQgdGhlCisgICAgLy8gZnJhbWUgcG9pbnRl
ciwgd2l0aCBhIGNhdmVhdDogaWYgb3VyIGNvbXBpbGVyIGNoYW5nZXMgdGhlIGZyYW1lIHBvaW50
ZXIgdGVtcG9yYXJpbHkgZm9yIHNvbWUKKyAgICAvLyBzaWxseSByZWFzb24sIHRoZSBGcmFtZVBv
aW50ZXIgaW50cmluc2ljIHdpbGwgcmV0dXJuIHdoZXJlIHRoZSBmcmFtZSBwb2ludGVyICpzaG91
bGQqIGJlIG5vdAorICAgIC8vIHdoZXJlIGl0IGhhcHBlbnMgdG8gYmUgcmlnaHQgbm93LgorICAg
IEZyYW1lUG9pbnRlciwKKworICAgIC8vIFBvbHltb3JwaGljIG1hdGgsIHVzYWJsZSB3aXRoIGFu
eSB2YWx1ZSB0eXBlLgorICAgIEFkZCwKKyAgICBTdWIsCisgICAgTXVsLAorICAgIERpdiwKKwor
ICAgIC8vIEludGVnZXIgbWF0aC4KKyAgICBDaGlsbERpdiwgLy8gZG9lc24ndCB0cmFwIGV2ZXIs
IGJlaGF2ZXMgbGlrZSBKUyAoeC95KXwwLgorICAgIE1vZCwKKyAgICBCaXRBbmQsCisgICAgQml0
T3IsCisgICAgQml0WG9yLAorICAgIFNobCwKKyAgICBBU2hyLAorICAgIExTaHIsCisKKyAgICAv
LyBDYXN0cyBhbmQgc3VjaC4KKyAgICAvLyBUYWtlcyBhbmQgcmV0dXJucyBJbnQzMjoKKyAgICBT
RXh0OCwKKyAgICBTRXh0MTYsCisgICAgLy8gVGFrZXMgSW50MzIgYW5kIHJldHVybnMgSW50NjQ6
CisgICAgU0V4dDMyLAorICAgIFpFeHQzMiwKKyAgICAvLyBUYWtlcyBhbmQgcmV0dXJucyBEb3Vi
bGU6CisgICAgRlJvdW5kLAorICAgIC8vIFRha2VzIGludHMgYW5kIHJldHVybnMgRG91YmxlOgor
ICAgIElUb0QsCisgICAgLy8gVGFrZXMgRG91YmxlIGFuZCByZXR1cm5zIEludDMyOgorICAgIERU
b0kzMiwKKworICAgIC8vIFBvbHltb3JwaGljIGNvbXBhcmlzb25zLCB1c2FibGUgd2l0aCBhbnkg
dmFsdWUgdHlwZS4gUmV0dXJucyBpbnQzMiAwIG9yIDEuIE5vdGUgdGhhdCAiTm90IgorICAgIC8v
IGlzIGp1c3QgRXF1YWwoeCwgMCkuCisgICAgRXF1YWwsCisgICAgTm90RXF1YWwsCisgICAgTGVz
c1RoYW4sCisgICAgR3JlYXRlclRoYW4sCisgICAgTGVzc0VxdWFsLAorICAgIEdyZWF0ZXJFcXVh
bCwKKworICAgIC8vIEludGVnZXIgY29tcGFyaXNvbnMuIFJldHVybnMgaW50MzIgMCBvciAxLgor
ICAgIEFib3ZlLAorICAgIEJlbG93LAorICAgIEFib3ZlRXF1YWwKKyAgICBCZWxvd0VxdWFsLAor
CisgICAgLy8gTWVtb3J5IGxvYWRzLiBPcGNvZGUgaW5kaWNhdGVzIGhvdyB3ZSBsb2FkIGFuZCB0
aGUgbG9hZGVkIHR5cGUuCisgICAgLy8gVGhlc2UgcmV0dXJuIEludDMyOgorICAgIExvYWQ4WiwK
KyAgICBMb2FkOFMsCisgICAgTG9hZDE2WiwKKyAgICBMb2FkMTZTLAorICAgIExvYWQzMiwKKyAg
ICAvLyBUaGlzIHJldHVybnMgSW50NjQ6CisgICAgTG9hZDY0LAorICAgIC8vIFRoZXNlIHJldHVy
biBEb3VibGU6CisgICAgTG9hZEZsb2F0LAorICAgIExvYWREb3VibGUsCisKKyAgICAvLyBNZW1v
cnkgc3RvcmVzLiBPcGNvZGUgaW5kaWNhdGVzIGhvdyB0aGUgdmFsdWUgaXMgc3RvcmVkLgorICAg
IC8vIFRoZXNlIHRha2UgYW4gSW50MzIgdmFsdWU6CisgICAgU3RvcmU4LAorICAgIFN0b3JlMTYs
CisgICAgU3RvcmUzMiwKKyAgICAvLyBUaGlzIHRha2VzIGEgSW50NjQgdmFsdWU6CisgICAgU3Rv
cmU2NCwKKyAgICAvLyBUaGVzZSB0YWtlIGEgRG91YmxlIHZhbHVlOgorICAgIFN0b3JlRmxvYXQs
CisgICAgU3RvcmVEb3VibGUsCisKKyAgICAvLyBUaGlzIGlzIGEgcmVndWxhciBvcmRpbmFyeSBD
IGZ1bmN0aW9uIGNhbGwsIHVzaW5nIHRoZSBzeXN0ZW0gQyBjYWxsaW5nIGNvbnZlbnRpb24uIE1h
a2Ugc3VyZQorICAgIC8vIHRoYXQgdGhlIGFyZ3VtZW50cyBhcmUgcGFzc2VkIHVzaW5nIHRoZSBy
aWdodCB0eXBlcy4KKyAgICBDQ2FsbCwKKworICAgIC8vIFRoaXMgaXMgYSBwYXRjaHBvaW50LiBV
c2UgdGhlIFBhdGNocG9pbnRWYWx1ZSBjbGFzcy4gVGhpcyBpcyB2aWV3ZWQgYXMgYmVoYXZpbmcg
bGlrZSBhIGNhbGwsCisgICAgLy8gYnV0IG9ubHkgZW1pdHMgY29kZSB2aWEgYSBjb2RlIGdlbmVy
YXRpb24gY2FsbGJhY2suIFRoYXQgY2FsbGJhY2sgZ2V0cyB0byBlbWl0IGNvZGUgaW5saW5lLgor
ICAgIC8vIFlvdSBjYW4gcGFzcyBhIHN0YWNrbWFwIGFsb25nIHdpdGggY29uc3RyYWludHMgb24g
aG93IGVhY2ggc3RhY2ttYXAgYXJndW1lbnQgbXVzdCBiZSBwYXNzZWQuCisgICAgLy8gSXQncyBs
ZWdhbCB0byByZXF1ZXN0IHRoYXQgYSBzdGFja21hcCBhcmd1bWVudCBpcyBpbiBzb21lIHJlZ2lz
dGVyIGFuZCBpdCdzIGxlZ2FsIHRvIHJlcXVlc3QKKyAgICAvLyB0aGF0IGEgc3RhY2ttYXAgYXJn
dW1lbnQgaXMgYXQgc29tZSBvZmZzZXQgZnJvbSB0aGUgdG9wIG9mIHRoZSBhcmd1bWVudCBwYXNz
aW5nIGFyZWEgb24gdGhlCisgICAgLy8gc3RhY2suCisgICAgUGF0Y2hwb2ludCwKKworICAgIC8v
IENoZWNrZWQgbWF0aC4gVXNlIHRoZSBDaGVja2VkTWF0aFZhbHVlIGNsYXNzLiBMaWtlIGEgUGF0
Y2hwb2ludCwgdGhpcyB0YWtlcyBhIGNvZGUgZ2VuZXJhdGlvbgorICAgIC8vIGNhbGxiYWNrLiBU
aGF0IGNhbGxiYWNrIGdldHMgdG8gZW1pdCBzb21lIGNvZGUgYWZ0ZXIgdGhlIGVwaWxvZ3VlLCBh
bmQgZ2V0cyB0byBsaW5rIHRoZSBqdW1wCisgICAgLy8gZnJvbSB0aGUgY2hlY2ssIHRoZSBsYWJl
bCBhZnRlciB0aGUgbWF0aCBpbnN0cnVjdGlvbiwgYW5kIHRoZSBjaG9pY2Ugb2YgcmVnaXN0ZXJz
LiBZb3UgYWxzbworICAgIC8vIGdldCB0byBzdXBwbHkgYSBzdGFja21hcC4KKyAgICBDaGVja0Fk
ZCwKKyAgICBDaGVja1N1YiwKKyAgICBDaGVja011bCwKKworICAgIC8vIFNTQSBzdXBwb3J0LCBp
biB0aGUgc3R5bGUgb2YgREZHIFNTQS4KKyAgICBVcHNpbG9uLAorICAgIFBoaSwKKworICAgIC8v
IEp1bXAuIFVzZXMgdGhlIEp1bXBWYWx1ZSBjbGFzcy4KKyAgICBKdW1wLAorICAgIAorICAgIC8v
IFBvbHltb3JwaGljIGJyYW5jaCwgdXNhYmxlIHdpdGggYW55IHZhbHVlIHR5cGUuIEJyYW5jaGVz
IGlmIG5vdCBlcXVhbCB0byB6ZXJvLiBVc2VzIHRoZQorICAgIC8vIEJyYW5jaFZhbHVlIGNsYXNz
LgorICAgIEJyYW5jaCwKKworICAgIC8vIFN3aXRjaC4gU3dpdGNoZXMgb3ZlciBlaXRoZXIgSW50
MzIgb3IgSW50NjQuIFVzZXMgdGhlIFN3aXRjaFZhbHVlIGNsYXNzLgorICAgIFN3aXRjaCwKKwor
ICAgIC8vIFJldHVybi4gTm90ZSB0aGF0IEIzIHByb2NlZHVyZXMgZG9uJ3Qga25vdyB0aGVpciBy
ZXR1cm4gdHlwZSwgc28gdGhpcyBjYW4ganVzdCByZXR1cm4gYW55CisgICAgLy8gdHlwZS4KKyAg
ICBSZXR1cm4sCisKKyAgICAvLyBUaGlzIGlzIGEgdGVybWluYWwgdGhhdCBpbmRpY2F0ZXMgdGhh
dCB3ZSB3aWxsIG5ldmVyIGdldCBoZXJlLgorICAgIE9vcHMKK307CisKK30gfSAvLyBuYW1lc3Bh
Y2UgSlNDOjpCMworCituYW1lc3BhY2UgV1RGIHsKKworY2xhc3MgUHJpbnRTdHJlYW07CisKK3Zv
aWQgcHJpbnRJbnRlcm5hbChQcmludFN0cmVhbSYsIEpTQzo6QjM6Ok9wY29kZSk7CisKK30gLy8g
bmFtZXNwYWNlIFdURgorCisjZW5kaWYgLy8gQjNPcGNvZGVfaAorCkluZGV4OiBTb3VyY2UvSmF2
YVNjcmlwdENvcmUvYjMvQjNPcmlnaW4uY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2Ny
aXB0Q29yZS9iMy9CM09yaWdpbi5jcHAJKHJldmlzaW9uIDApCisrKyBTb3VyY2UvSmF2YVNjcmlw
dENvcmUvYjMvQjNPcmlnaW4uY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsMzcgQEAKKy8q
CisgKiBDb3B5cmlnaHQgKEMpIDIwMTUgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgor
ICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMs
IHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVk
IHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0
cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQK
KyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcg
ZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJl
cHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBj
b25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1
bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJp
YnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBg
YEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xV
RElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBN
RVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBB
UkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IKKyAqIENPTlRS
SUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBT
UEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElO
RywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09E
UyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJ
TkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBP
RiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRP
UlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5Z
IFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VE
IE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKworI2luY2x1ZGUgImNv
bmZpZy5oIgorI2luY2x1ZGUgIkIzT3JpZ2luLmgiCisKK25hbWVzcGFjZSBKU0MgeyBuYW1lc3Bh
Y2UgQjMgeworCit2b2lkIE9yaWdpbjo6ZHVtcChQcmludFN0cmVhbSYgb3V0KSBjb25zdAorewor
ICAgIG91dC5wcmludCgiT3JpZ2luKCIsIFJhd1BvaW50ZXIobV9kYXRhKSwgIikiKTsKK30KKwor
fSB9IC8vIG5hbWVzcGFjZSBKU0M6OkIzCisKSW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9i
My9CM09yaWdpbi5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM09y
aWdpbi5oCShyZXZpc2lvbiAwKQorKysgU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzT3JpZ2lu
LmgJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSw1NSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykg
MjAxNSBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRp
b24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Cisg
KiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5n
IGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNl
IGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlz
IGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4g
UmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBj
b3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBm
b2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90
aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJ
UyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisg
KiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlU
RUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQg
RklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4g
Tk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBG
T1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExB
UlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQg
VE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NT
IE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikg
SE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhF
UiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBO
RUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNF
CisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZ
IE9GIFNVQ0ggREFNQUdFLiAKKyAqLworCisjaWZuZGVmIEIzT3JpZ2luX2gKKyNkZWZpbmUgQjNP
cmlnaW5faAorCisjaW5jbHVkZSA8d3RmL1ByaW50U3RyZWFtLmg+CisKK25hbWVzcGFjZSBKU0Mg
eyBuYW1lc3BhY2UgQjMgeworCisvLyBXaG9ldmVyIGdlbmVyYXRlcyBCM0lSIGNhbiBjaG9vc2Ug
dG8gcHV0IG9yaWdpbnMgb24gdmFsdWVzLiBXaGVuIHlvdSBkbyB0aGlzLCBCMyB3aWxsIGJlIGFi
bGUgdG8KKy8vIGFjY291bnQsIGRvd24gdG8gdGhlIG1hY2hpbmUgY29kZSwgd2hpY2ggaW5zdHJ1
Y3Rpb24gY29ycmVzcG9uZHMgdG8gd2hpY2ggb3JpZ2luLiBCMworLy8gdHJhbnNmb3JtYXRpb25z
IG11c3QgcHJlc2VydmUgT3JpZ2lucyBjYXJlZnVsbHkuIEl0J3MgYW4gZXJyb3IgdG8gd3JpdGUg
YSB0cmFuc2Zvcm1hdGlvbiB0aGF0CisvLyBlaXRoZXIgZHJvcHMgT3JpZ2lucyBvciBsaWVzIGFi
b3V0IHRoZW0uCitjbGFzcyBPcmlnaW4geworcHVibGljOgorICAgIGV4cGxpY2l0IE9yaWdpbihj
b25zdCB2b2lkKiBkYXRhID0gbnVsbHB0cikKKyAgICAgICAgOiBtX2RhdGEoZGF0YSkKKyAgICB7
CisgICAgfQorCisgICAgY29uc3Qgdm9pZCogZGF0YSgpIGNvbnN0IHsgcmV0dXJuIG1fZGF0YTsg
fQorCisgICAgdm9pZCBkdW1wKFByaW50U3RyZWFtJikgY29uc3Q7CisgICAgCitwcml2YXRlOgor
ICAgIGNvbnN0IHZvaWQqIG1fZGF0YTsKK307CisKK30gfSAvLyBuYW1lc3BhY2UgSlNDOjpCMwor
CisjZW5kaWYgLy8gQjNPcmlnaW5faAorCkluZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMv
QjNQcm9jZWR1cmUuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9C
M1Byb2NlZHVyZS5jcHAJKHJldmlzaW9uIDApCisrKyBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMv
QjNQcm9jZWR1cmUuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsNTYgQEAKKy8qCisgKiBD
b3B5cmlnaHQgKEMpIDIwMTUgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAq
IFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGgg
b3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQg
dGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRp
b25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAg
IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xh
aW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVj
ZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRp
b25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0
aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9u
LgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFTIElT
JycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywg
QlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFO
VEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElT
Q0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IKKyAqIENPTlRSSUJVVE9S
UyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFM
LAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVU
IE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBT
RVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJ
TlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFC
SUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAq
IChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBP
VVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRI
RSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKworI2luY2x1ZGUgImNvbmZpZy5o
IgorI2luY2x1ZGUgIkIzUHJvY2VkdXJlLmgiCisKKyNpbmNsdWRlICJCM0Jhc2ljQmxvY2tJbmxp
bmVzLmgiCisjaW5jbHVkZSAiQjNWYWx1ZS5oIgorCituYW1lc3BhY2UgSlNDIHsgbmFtZXNwYWNl
IEIzIHsKKworUHJvY2VkdXJlOjpQcm9jZWR1cmUoKQoreworfQorCitQcm9jZWR1cmU6On5Qcm9j
ZWR1cmUoKQoreworfQorCitCYXNpY0Jsb2NrKiBQcm9jZWR1cmU6OmFwcGVuZEJsb2NrKCkKK3sK
KyAgICBzdGQ6OnVuaXF1ZV9wdHI8QmFzaWNCbG9jaz4gYmxvY2sgPSBzdGQ6Om1ha2VfdW5pcXVl
PEJhc2ljQmxvY2s+KG1fYmxvY2tzLnNpemUoKSk7CisgICAgQmFzaWNCbG9jayogcmVzdWx0ID0g
YmxvY2suZ2V0KCk7CisgICAgbV9ibG9ja3MuYXBwZW5kKFdURjo6bW92ZShibG9jaykpOworICAg
IHJldHVybiByZXN1bHQ7Cit9CisKK3ZvaWQgUHJvY2VkdXJlOjpkdW1wKFByaW50U3RyZWFtJiBv
dXQpIGNvbnN0Cit7CisgICAgZm9yIChCYXNpY0Jsb2NrKiBibG9jayA6ICp0aGlzKQorICAgICAg
ICBvdXQucHJpbnQoZGVlcER1bXAoYmxvY2spKTsKK30KKworfSB9IC8vIG5hbWVzcGFjZSBKU0M6
OkIzCkluZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNQcm9jZWR1cmUuaAo9PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNQcm9jZWR1cmUuaAkocmV2aXNpb24g
MCkKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM1Byb2NlZHVyZS5oCSh3b3JraW5nIGNv
cHkpCkBAIC0wLDAgKzEsMTc3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE1IEFwcGxlIElu
Yy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGlu
IHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlv
biwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwor
ICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJl
dGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25k
aXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlv
bnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICog
ICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNj
bGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxz
IHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElT
IFBST1ZJREVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1Ig
SU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisg
KiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBB
IFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFM
TCBBUFBMRSBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNU
LCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VR
VUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NV
UkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRB
LCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNF
RCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNU
LCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1Ig
T1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMg
U09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1B
R0UuIAorICovCisKKyNpZm5kZWYgQjNQcm9jZWR1cmVfaAorI2RlZmluZSBCM1Byb2NlZHVyZV9o
CisKKyNpbmNsdWRlIDx3dGYvQmFnLmg+CisjaW5jbHVkZSA8d3RmL0Zhc3RNYWxsb2MuaD4KKyNp
bmNsdWRlIDx3dGYvTm9uY29weWFibGUuaD4KKyNpbmNsdWRlIDx3dGYvVmVjdG9yLmg+CisKK25h
bWVzcGFjZSBKU0MgeyBuYW1lc3BhY2UgQjMgeworCitjbGFzcyBCYXNpY0Jsb2NrOworY2xhc3Mg
VmFsdWU7CisKK2NsYXNzIFByb2NlZHVyZSB7CisgICAgV1RGX01BS0VfTk9OQ09QWUFCTEUoUHJv
Y2VkdXJlKTsKKyAgICBXVEZfTUFLRV9GQVNUX0FMTE9DQVRFRDsKK3B1YmxpYzoKKworICAgIFBy
b2NlZHVyZSgpOworICAgIH5Qcm9jZWR1cmUoKTsKKworICAgIEJhc2ljQmxvY2sqIGFwcGVuZEJs
b2NrKCk7CisgICAgCisgICAgdGVtcGxhdGU8dHlwZW5hbWUuLi4gQXJndW1lbnRzPgorICAgIFZh
bHVlKiBuZXdWYWx1ZShBcmd1bWVudHMuLi4pOworCisgICAgdm9pZCBkdW1wKFByaW50U3RyZWFt
JikgY29uc3Q7CisKKyAgICB1bnNpZ25lZCBzaXplKCkgY29uc3QgeyByZXR1cm4gbV9ibG9ja3Mu
c2l6ZSgpOyB9CisgICAgQmFzaWNCbG9jayogYXQodW5zaWduZWQgaW5kZXgpIGNvbnN0IHsgcmV0
dXJuIG1fYmxvY2tzW2luZGV4XTsgfQorICAgIEJhc2ljQmxvY2sqIG9wZXJhdG9yW10odW5zaWdu
ZWQgaW5kZXgpIGNvbnN0IHsgcmV0dXJuIGF0KGluZGV4KTsgfQorCisgICAgY2xhc3MgaXRlcmF0
b3IgeworICAgIHB1YmxpYzoKKyAgICAgICAgaXRlcmF0b3IoKToKKyAgICAgICAgICAgIDogbV9w
cm9jZWR1cmUobnVsbHB0cikKKyAgICAgICAgICAgICwgbV9pbmRleCgwKQorICAgICAgICB7Cisg
ICAgICAgIH0KKworICAgICAgICBpdGVyYXRvcihQcm9jZWR1cmUmIHByb2NlZHVyZSwgdW5zaWdu
ZWQgaW5kZXgpCisgICAgICAgICAgICA6IG1fcHJvY2VkdXJlKCZwcm9jZWR1cmUpCisgICAgICAg
ICAgICAsIG1faW5kZXgoaW5kZXgpCisgICAgICAgIHsKKyAgICAgICAgfQorCisgICAgICAgIEJh
c2ljQmxvY2sqIG9wZXJhdG9yKigpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBtX3By
b2NlZHVyZS0+YXQobV9pbmRleCk7CisgICAgICAgIH0KKworICAgICAgICBpdGVyYXRvciYgb3Bl
cmF0b3IrKygpCisgICAgICAgIHsKKyAgICAgICAgICAgIG1faW5kZXggPSBmaW5kTmV4dChtX2lu
ZGV4ICsgMSk7CisgICAgICAgICAgICByZXR1cm4gKnRoaXM7CisgICAgICAgIH0KKworICAgICAg
ICBib29sIG9wZXJhdG9yPT0oY29uc3QgaXRlcmF0b3ImIG90aGVyKSBjb25zdAorICAgICAgICB7
CisgICAgICAgICAgICByZXR1cm4gbV9pbmRleCA9PSBvdGhlci5tX2luZGV4OworICAgICAgICB9
CisKKyAgICAgICAgYm9vbCBvcGVyYXRvciE9KGNvbnN0IGl0ZXJhdG9yJiBvdGhlcikgY29uc3QK
KyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuICEoKnRoaXMgPT0gb3RoZXIpOworICAgICAg
ICB9CisKKyAgICBwcml2YXRlOgorICAgICAgICB1bnNpZ25lZCBmaW5kTmV4dCh1bnNpZ25lZCBp
bmRleCkKKyAgICAgICAgeworICAgICAgICAgICAgd2hpbGUgKGluZGV4IDwgbV9wcm9jZWR1cmUt
PnNpemUoKSAmJiAhbV9wcm9jZWR1cmUtPmF0KGluZGV4KSkKKyAgICAgICAgICAgICAgICBpbmRl
eCsrOworICAgICAgICAgICAgcmV0dXJuIGluZXg7CisgICAgICAgIH0KKworICAgICAgICBQcm9j
ZWR1cmUqIG1fcHJvY2VkdXJlOworICAgICAgICB1bnNpZ25lZCBtX2luZGV4OworICAgIH07CisK
KyAgICBpdGVyYXRvciBiZWdpbigpIGNvbnN0IHsgcmV0dXJuIGl0ZXJhdG9yKCp0aGlzLCAwKTsg
fQorICAgIGl0ZXJhdG9yIGVuZCgpIGNvbnN0IHsgcmV0dXJuIGl0ZXJhdG9yKCp0aGlzLCBudW1C
bG9ja3MoKSk7IH0KKworICAgIGNsYXNzIFZhbHVlc0NvbGxlY3Rpb24geworICAgIHB1YmxpYzoK
KyAgICAgICAgVmFsdWVzQ29sbGVjdGlvbihQcm9jZWR1cmUmIHByb2NlZHVyZSkKKyAgICAgICAg
ICAgIDogbV9wcm9jZWR1cmUocHJvY2VkdXJlKQorICAgICAgICB7CisgICAgICAgIH0KKworICAg
ICAgICBjbGFzcyBpdGVyYXRvciB7CisgICAgICAgIHB1YmxpYzoKKyAgICAgICAgICAgIGl0ZXJh
dG9yKCk6CisgICAgICAgICAgICAgICAgOiBtX3Byb2NlZHVyZShudWxscHRyKQorICAgICAgICAg
ICAgICAgICwgbV9pbmRleCgwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorCisgICAg
ICAgICAgICBpdGVyYXRvcihQcm9jZWR1cmUmIHByb2NlZHVyZSwgdW5zaWduZWQgaW5kZXgpCisg
ICAgICAgICAgICAgICAgOiBtX3Byb2NlZHVyZSgmcHJvY2VkdXJlKQorICAgICAgICAgICAgICAg
ICwgbV9pbmRleChpbmRleCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKworICAgICAg
ICAgICAgVmFsdWUqIG9wZXJhdG9yKigpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAg
cmV0dXJuIG1fcHJvY2VkdXJlLT5ibG9jayhtX2luZGV4KTsKKyAgICAgICAgICAgIH0KKworICAg
ICAgICAgICAgaXRlcmF0b3ImIG9wZXJhdG9yKysoKQorICAgICAgICAgICAgeworICAgICAgICAg
ICAgICAgIG1faW5kZXgrKzsKKyAgICAgICAgICAgICAgICByZXR1cm4gKnRoaXM7CisgICAgICAg
ICAgICB9CisKKyAgICAgICAgICAgIGJvb2wgb3BlcmF0b3I9PShjb25zdCBpdGVyYXRvciYgb3Ro
ZXIpIGNvbnN0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG1faW5kZXgg
PT0gb3RoZXIubV9pbmRleDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgYm9vbCBvcGVy
YXRvciE9KGNvbnN0IGl0ZXJhdG9yJiBvdGhlcikgY29uc3QKKyAgICAgICAgICAgIHsKKyAgICAg
ICAgICAgICAgICByZXR1cm4gISgqdGhpcyA9PSBvdGhlcik7CisgICAgICAgICAgICB9CisKKyAg
ICAgICAgcHJpdmF0ZToKKworICAgICAgICAgICAgUHJvY2VkdXJlKiBtX3Byb2NlZHVyZTsKKyAg
ICAgICAgICAgIHVuc2lnbmVkIG1faW5kZXg7CisgICAgICAgIH07CisKKyAgICAgICAgaXRlcmF0
b3IgYmVnaW4oKSBjb25zdCB7IHJldHVybiBpdGVyYXRvcihtX3Byb2NlZHVyZSwgMCk7IH0KKyAg
ICAgICAgaXRlcmF0b3IgZW5kKCkgY29uc3QgeyByZXR1cm4gaXRlcmF0b3IobV9wcm9jZWR1cmUs
IG1fcHJvY2VkdXJlLm1fdmFsdWVzLnNpemUoKSk7IH0KKworICAgICAgICB1bnNpZ25lZCBzaXpl
KCkgY29uc3QgeyByZXR1cm4gbV9wcm9jZWR1cmUubV92YWx1ZXMuc2l6ZSgpOyB9CisgICAgICAg
IFZhbHVlKiBhdCh1bnNpZ25lZCBpbmRleCkgY29uc3QgeyByZXR1cm4gbV9wcm9jZWR1cmUubV92
YWx1ZXNbaW5kZXhdOyB9CisgICAgICAgIFZhbHVlKiBvcGVyYXRvcltdKHVuc2lnbmVkIGluZGV4
KSBjb25zdCB7IHJldHVybiBhdChpbmRleCk7IH0KKyAgICAgICAgCisgICAgcHJpdmF0ZToKKyAg
ICAgICAgUHJvY2VkdXJlJiBtX3Byb2NlZHVyZTsKKyAgICB9OworCisgICAgVmFsdWVzQ29sbGVj
dGlvbiB2YWx1ZXMoKSB7IHJldHVybiBWYWx1ZXNDb2xsZWN0aW9uKCp0aGlzKTsgfQorCitwcml2
YXRlOgorICAgIFZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QmFzaWNCbG9jaz4+IG1fYmxvY2tzOwor
ICAgIFZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8VmFsdWU+PiBtX3ZhbHVlczsKK307CisKK30gfSAv
LyBuYW1lc3BhY2UgSlNDOjpCMworCisjZW5kaWYgLy8gQjNQcm9jZWR1cmVfaAorCkluZGV4OiBT
b3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNQcm9jZWR1cmVJbmxpbmVzLmgKPT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQot
LS0gU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzUHJvY2VkdXJlSW5saW5lcy5oCShyZXZpc2lv
biAwKQorKysgU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzUHJvY2VkdXJlSW5saW5lcy5oCSh3
b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsNDMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTUg
QXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFu
ZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9k
aWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25k
aXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2Rl
IG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0
IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlz
dHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJp
Z2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93
aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBt
YXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09G
VFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQ
UkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRP
LCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5F
U1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVW
RU5UIFNIQUxMIEFQUExFIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFO
WSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBP
UiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAor
ICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBV
U0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VW
RVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4g
Q09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElH
RU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICog
T0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBT
VUNIIERBTUFHRS4gCisgKi8KKworI2lmbmRlZiBCM1Byb2NlZHVyZUlubGluZXNfaAorI2RlZmlu
ZSBCM1Byb2NlZHVyZUlubGluZXNfaAorCisjaW5jbHVkZSAiQjNCYXNpY0Jsb2NrLmgiCisjaW5j
bHVkZSAiQjNQcm9jZWR1cmUuaCIKKworbmFtZXNwYWNlIEpTQyB7IG5hbWVzcGFjZSBCMyB7CisK
K3RlbXBsYXRlPHR5cGVuYW1lLi4uIEFyZ3VtZW50cz4KK1ZhbHVlKiBQcm9jZWR1cmU6Om5ld1Zh
bHVlKEFyZ3VlbnRzLi4uIGFyZ3VtZW50cykKK3sKKyAgICByZXR1cm4gbV92YWx1ZXMuYWRkKG1f
dmFsdWVzLnNpemUoKSwgYXJndW1lbnRzLi4uKTsKK30KKworfSB9IC8vIG5hbWVzcGFjZSBKU0M6
OkIzCisKKyNlbmRpZiAvLyBCM1Byb2NlZHVyZUlubGluZXNfaAorCkluZGV4OiBTb3VyY2UvSmF2
YVNjcmlwdENvcmUvYjMvQjNUeXBlLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlw
dENvcmUvYjMvQjNUeXBlLmNwcAkocmV2aXNpb24gMCkKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29y
ZS9iMy9CM1R5cGUuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsNTQgQEAKKy8qCisgKiBD
b3B5cmlnaHQgKEMpIDIwMTUgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAq
IFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGgg
b3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQg
dGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRp
b25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAg
IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xh
aW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVj
ZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRp
b25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0
aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9u
LgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFTIElT
JycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywg
QlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFO
VEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElT
Q0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IKKyAqIENPTlRSSUJVVE9S
UyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFM
LAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVU
IE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBT
RVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJ
TlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFC
SUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAq
IChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBP
VVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRI
RSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKworI2luY2x1ZGUgImNvbmZpZy5o
IgorI2luY2x1ZGUgIkIzVHlwZS5oIgorCisjaW5jbHVkZSA8d3RmL1ByaW50U3RyZWFtLmg+CisK
K25hbWVzcGFjZSBXVEYgeworCit1c2luZyBuYW1lc3BhY2UgSlNDOjpCMzsKKwordm9pZCBwcmlu
dEludGVybmFsKFByaW50U3RyZWFtJiBvdXQsIFR5cGUgdHlwZSkKK3sKKyAgICBzd2l0Y2ggKHR5
cGUpIHsKKyAgICBjYXNlIFZvaWQ6CisgICAgICAgIG91dC5wcmludCgiVm9pZCIpOworICAgICAg
ICByZXR1cm47CisgICAgY2FzZSBJbnQzMjoKKyAgICAgICAgb3V0LnByaW50KCJJbnQzMiIpOwor
ICAgICAgICByZXR1cm47CisgICAgY2FzZSBJbnQ2NDoKKyAgICAgICAgb3V0LnByaW50KCJJbnQ2
NCIpOworICAgICAgICByZXR1cm47CisgICAgY2FzZSBEb3VibGU6CisgICAgICAgIG91dC5wcmlu
dCgiRG91YmxlIik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgUkVMRUFTRV9BU1NFUlRf
Tk9UX1JFQUNIRUQoKTsKK30KKworfSAvLyBuYW1lc3BhY2UgV1RGCkluZGV4OiBTb3VyY2UvSmF2
YVNjcmlwdENvcmUvYjMvQjNUeXBlLmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRD
b3JlL2IzL0IzVHlwZS5oCShyZXZpc2lvbiAwKQorKysgU291cmNlL0phdmFTY3JpcHRDb3JlL2Iz
L0IzVHlwZS5oCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsNTYgQEAKKy8qCisgKiBDb3B5cmln
aHQgKEMpIDIwMTUgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlz
dHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0
aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZv
bGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9m
IHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGlj
ZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4K
KyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUg
YWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFu
ZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFu
ZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoK
KyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFTIElTJycgQU5E
IEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5P
VCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJ
VFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1F
RC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBM
SUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICog
RVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBM
SU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNF
UzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJV
UFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFks
IFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNM
VURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0Yg
VEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NT
SUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKworI2lmbmRlZiBCM1R5cGVfaAorI2RlZmlu
ZSBCM1R5cGVfaAorCituYW1lc3BhY2UgSlNDIHsgbmFtZXNwYWNlIEIzIHsKKworZW51bSBUeXBl
IHsKKyAgICBWb2lkLAorICAgIEludDMyLAorICAgIEludDY0LAorICAgIERvdWJsZQorfTsKKwor
VHlwZSBwb2ludGVyKCkgY29uc3QKK3sKKyAgICBpZiAoc2l6ZW9mKHZvaWQqKSA9PSA0KQorICAg
ICAgICByZXR1cm4gSW50MzI7CisgICAgcmV0dXJuIEludDY0OworfQorCit9IH0gLy8gbmFtZXNw
YWNlIEpTQzo6QjMKKworbmFtZXNwYWNlIFdURiB7CisKK2NsYXNzIFByaW50U3RyZWFtOworCit2
b2lkIHByaW50SW50ZXJuYWwoUHJpbnRTdHJlYW0mLCBKU0M6OkIzOjpUeXBlKTsKKworfSAvLyBu
YW1lc3BhY2UgV1RGCisKKyNlbmRpZiAvLyBCM1R5cGVfaAorCkluZGV4OiBTb3VyY2UvSmF2YVNj
cmlwdENvcmUvYjMvQjNWYWx1ZS5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29y
ZS9iMy9CM1ZhbHVlLmgJKHJldmlzaW9uIDApCisrKyBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMv
QjNWYWx1ZS5oCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsMTE0IEBACisvKgorICogQ29weXJp
Z2h0IChDKSAyMDE1IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRp
c3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdp
dGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBm
b2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBv
ZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3Rp
Y2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIu
CisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhl
IGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBh
bmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBh
bmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAq
CisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFO
RCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBO
T1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklM
SVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlN
RUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUg
TElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAq
IEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1Qg
TElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklD
RVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJS
VVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZ
LCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5D
TFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9G
IFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9T
U0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisKKyNpZm5kZWYgQjNWYWx1ZV9oCisjZGVm
aW5lIEIzVmFsdWVfaAorCisjaW5jbHVkZSA8d3RmL0Zhc3RNYWxsb2MuaD4KKyNpbmNsdWRlIDx3
dGYvTm9uY29weWFibGUuaD4KKworbmFtZXNwYWNlIEpTQyB7IG5hbWVzcGFjZSBCMyB7CisKK2Ns
YXNzIFZhbHVlIHsKKyAgICBXVEZfTUFLRV9OT05DT1BZQUJMRShWYWx1ZSk7CisgICAgV1RGX01B
S0VfRkFTVF9BTExPQ0FURUQ7CitwdWJsaWM6CisgICAgdHlwZWRlZiBWZWN0b3I8VmFsdWUqLCAz
PiBBZGphY2VuY3lMaXN0OworCisgICAgc3RhdGljIGNvbnN0IGNoYXIqIGR1bXBQcmVmaXggPSAi
QCI7CisKKyAgICB2aXJ0dWFsIH5WYWx1ZSgpOworCisgICAgdW5zaWduZWQgaW5kZXgoKSBjb25z
dCB7IHJldHVybiBtX2luZGV4OyB9CisgICAgCisgICAgLy8gTm90ZSB0aGF0IHRoZSBvcGNvZGUg
aXMgaW1tdXRhYmxlLCBleGNlcHQgZm9yIHJlcGxhY2luZyB2YWx1ZXMgd2l0aCBpZGVudGl0eS4K
KyAgICBPcGNvZGUgb3Bjb2RlKCkgY29uc3QgeyByZXR1cm4gbV9vcGNvZGU7IH0KKworICAgIE9y
aWdpbiBvcmlnaW4oKSBjb25zdCB7IHJldHVybiBtX29yaWdpbjsgfQorICAgIAorICAgIFZhbHVl
KiYgY2hpbGQodW5zaWduZWQgaW5kZXgpIHsgcmV0dXJuIG1fY2hpbGRyZW5baW5kZXhdOyB9Cisg
ICAgVmFsdWUqIGNoaWxkKHVuc2lnbmVkIGluZGV4KSBjb25zdCB7IHJldHVybiBtX2NoaWxkcmVu
W2luZGV4XTsgfQorCisgICAgLy8gVGhpcyBjb21wdXRlcyB0aGUgdHlwZSB1c2luZyB0aGUgb3Bj
b2RlLgorICAgIFR5cGUgdHlwZSgpIGNvbnN0OworCisgICAgQWRqYWNlbmN5TGlzdCYgY2hpbGRy
ZW4oKSB7IHJldHVybiBtX2NoaWxkcmVuOyB9IAorICAgIGNvbnN0IEFkamFjZW5jeUxpc3QmIGNo
aWxkcmVuKCkgY29uc3QgeyByZXR1cm4gbV9jaGlsZHJlbjsgfQorCisgICAgdm9pZCByZXBsYWNl
V2l0aElkZW50aXR5KFZhbHVlKik7CisKKyAgICB2b2lkIGR1bXAoUHJpbnRTdHJlYW0mKSBjb25z
dDsKKyAgICB2b2lkIGRlZXBEdW1wKFByaW50U3RyZWFtJikgY29uc3Q7CisgICAgCitwcml2YXRl
OgorICAgIC8vIEluc3RhbnRpYXRlIHZhbHVlcyB2aWEgUHJvY2VkdXJlLgorICAgIHRlbXBsYXRl
PHR5cGVuYW1lLi4uIEFyZ3VtZW50cz4KKyAgICBleHBsaWNpdCBWYWx1ZSh1bnNpZ25lZCBpbmRl
eCwgT3Bjb2RlIG9wY29kZSwgT3JpZ2luIG9yaWdpbiwgQXJndW1lbnRzLi4uIGFyZ3VtZW50cykK
KyAgICAgICAgOiBtX2luZGV4KGluZGV4KQorICAgICAgICAsIG1fb3Bjb2RlKG9wY29kZSkKKyAg
ICAgICAgLCBtX29yaWdpbihvcmlnaW4pCisgICAgICAgICwgbV9jaGlsZHJlbnsgYXJndW1lbnRz
Li4uIH0KKyAgICB7CisgICAgfQorCisgICAgdW5zaWduZWQgbV9pbmRleDsKKyAgICBPcGNvZGUg
bV9vcGNvZGU7CisgICAgT3JpZ2luIG1fb3JpZ2luOworICAgIEFkamFjZW5jeUxpc3QgbV9jaGls
ZHJlbjsKKworcHVibGljOgorICAgIEJhc2ljQmxvY2sqIG93bmVyOyAvLyBjb21wdXRlZCBsYXpp
bHkuCisgICAgVmFsdWUqIHJlcGxhY2VtZW50OyAvLyB1c2VkIGZvciBhbmFseXNlcyBhbmQgdHJh
bnNmb3JtYXRpb25zLgorICAgIHZvaWQqIG1pc2M7Cit9OworCitjbGFzcyBEZWVwVmFsdWVEdW1w
IHsKK3B1YmxpYzoKKyAgICBEZWVwVmFsdWVEdW1wKFZhbHVlKiB2YWx1ZSkKKyAgICAgICAgOiBt
X3ZhbHVlKHZhbHVlKQorICAgIHsKKyAgICB9CisKKyAgICB2b2lkIGR1bXAoUHJpbnRTdHJlYW0m
IG91dCkgY29uc3QKKyAgICB7CisgICAgICAgIGlmIChtX3ZhbHVlKQorICAgICAgICAgICAgbV92
YWx1ZS0+ZGVlcER1bXAob3V0KTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgb3V0LnByaW50
KCI8bnVsbD4iKTsKKyAgICB9CisKK3ByaXZhdGU6CisgICAgVmFsdWUqIG1fdmFsdWU7Cit9Owor
CitEZWVwVmFsdWVEdW1wIGRlZXBEdW1wKFZhbHVlKiB2YWx1ZSkKK3sKKyAgICByZXR1cm4gRGVl
cFZhbHVlRHVtcCh2YWx1ZSk7Cit9CisKK30gfSAvLyBuYW1lc3BhY2UgSlNDOjpCMworCisjZW5k
aWYgLy8gQjNWYWx1ZV9oCisK
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>263410</attachid>
            <date>2015-10-17 23:06:45 -0700</date>
            <delta_ts>2015-10-18 12:28:46 -0700</delta_ts>
            <desc>no big deal, fleshing out the IR</desc>
            <filename>blah.patch</filename>
            <type>text/plain</type>
            <size>67221</size>
            <attacher name="Filip Pizlo">fpizlo</attacher>
            
              <data encoding="base64">SW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM0FyZ3VtZW50UmVnVmFsdWUuY3BwCj09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM0FyZ3VtZW50UmVnVmFsdWUu
Y3BwCShyZXZpc2lvbiAwKQorKysgU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzQXJndW1lbnRS
ZWdWYWx1ZS5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSw0MSBAQAorLyoKKyAqIENvcHly
aWdodCAoQykgMjAxNSBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVk
aXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3
aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUg
Zm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMg
b2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90
aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVy
LgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRo
ZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMg
YW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24g
YW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisg
KgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIGBgQVMgSVMnJyBB
TkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQg
Tk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJ
TElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJ
TUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJF
IExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisg
KiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9U
IExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJ
Q0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVS
UlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElU
WSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElO
Q0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBP
RiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBP
U1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLiAKKyAqLworCisjaW5jbHVkZSAiY29uZmlnLmgiCisj
aW5jbHVkZSAiQjNBcmd1bWVudFJlZ1ZhbHVlLmgiCisKK25hbWVzcGFjZSBKU0MgeyBuYW1lc3Bh
Y2UgQjMgeworCitBcmd1bWVudFJlZ1ZhbHVlOjp+QXJndW1lbnRSZWdWYWx1ZSgpCit7Cit9CisK
K3ZvaWQgQXJndW1lbnRSZWdWYWx1ZTo6ZHVtcE1ldGEoUHJpbnRTdHJlYW0mIG91dCkgY29uc3QK
K3sKKyAgICBvdXQucHJpbnQobV9yZWcpOworfQorCit9IH0gLy8gbmFtZXNwYWNlIEpTQzo6QjMK
KwpJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzQXJndW1lbnRSZWdWYWx1ZS5oCj09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM0FyZ3VtZW50UmVnVmFsdWUu
aAkocmV2aXNpb24gMCkKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM0FyZ3VtZW50UmVn
VmFsdWUuaAkod29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDU4IEBACisvKgorICogQ29weXJpZ2h0
IChDKSAyMDE1IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3Ry
aWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhv
dXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xs
b3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBz
b3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2Us
IHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisg
KiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFi
b3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQg
dGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQv
b3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisg
KiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBB
TlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1Qg
TElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZ
IEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQu
ICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElB
QkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVY
RU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElN
SVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7
IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBU
SU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBX
SEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVE
SU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRI
RSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lC
SUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisKKyNpZm5kZWYgQjNBcmd1bWVudFJlZ1ZhbHVl
X2gKKyNkZWZpbmUgQjNBcmd1bWVudFJlZ1ZhbHVlX2gKKworI2luY2x1ZGUgIkIzVmFsdWUuaCIK
KyNpbmNsdWRlICJSZWcuaCIKKworbmFtZXNwYWNlIEpTQyB7IG5hbWVzcGFjZSBCMyB7CisKK2Ns
YXNzIEFyZ3VtZW50UmVnVmFsdWUgOiBwdWJsaWMgVmFsdWUgeworcHVibGljOgorICAgIH5Bcmd1
bWVudFJlZ1ZhbHVlKCk7CisKKyAgICBSZWcgYXJndW1lbnRSZWcoKSBjb25zdCB7IHJldHVybiBt
X3JlZzsgfQorCitwcm90ZWN0ZWQ6CisgICAgdm9pZCBkdW1wTWV0YShQcmludFN0cmVhbSYpIGNv
bnN0IG92ZXJyaWRlOworCitwcml2YXRlOgorICAgIGZyaWVuZCBjbGFzcyBQcm9jZWR1cmU7CisK
KyAgICBBcmd1bWVudFJlZ1ZhbHVlKHVuc2lnbmVkIGluZGV4LCBPcmlnaW4gb3JpZ2luLCBSZWcg
cmVnKQorICAgICAgICA6IFZhbHVlKGluZGV4LCBBcmd1bWVudFJlZywgcmVnLmlzR1BSKCkgPyBw
b2ludGVyKCkgOiBEb3VibGUsIG9yaWdpbikKKyAgICAgICAgLCBtX3JlZyhyZWcpCisgICAgewor
ICAgIH0KKworICAgIFJlZyBtX3JlZzsKK307CisKK30gfSAvLyBuYW1lc3BhY2UgSlNDOjpCMwor
CisjZW5kaWYgLy8gQjNBcmd1bWVudFJlZ1ZhbHVlX2gKKwpJbmRleDogU291cmNlL0phdmFTY3Jp
cHRDb3JlL2IzL0IzQmFzaWNCbG9jay5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL0phdmFTY3Jp
cHRDb3JlL2IzL0IzQmFzaWNCbG9jay5jcHAJKHJldmlzaW9uIDApCisrKyBTb3VyY2UvSmF2YVNj
cmlwdENvcmUvYjMvQjNCYXNpY0Jsb2NrLmNwcAkod29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDU4
IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE1IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNl
cnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5
IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBw
cm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEu
IFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29w
eXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9s
bG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0g
bXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxp
c3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICog
ICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhl
IGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExF
IElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVT
LCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJ
RVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBV
UlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SCisg
KiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURF
TlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJ
TkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRV
VEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsg
T1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9S
WQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZ
LCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5H
IElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYg
QURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisKKyNpbmNs
dWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJCM0Jhc2ljQmxvY2suaCIKKworbmFtZXNwYWNlIEpT
QyB7IG5hbWVzcGFjZSBCMyB7CisKK0Jhc2ljQmxvY2s6OkJhc2ljQmxvY2sodW5zaWduZWQgaW5k
ZXgpCisgICAgOiBtX2luZGV4KGluZGV4KQoreworfQorCitCYXNpY0Jsb2NrOjp+QmFzaWNCbG9j
aygpCit7Cit9CisKK3ZvaWQgQmFzaWNCbG9jazo6YXBwZW5kKFZhbHVlKiB2YWx1ZSkKK3sKKyAg
ICBtX3ZhbHVlcy5hcHBlbmQodmFsdWUpOworfQorCit2b2lkIEJhc2ljQmxvY2s6OmR1bXAoUHJp
bnRTdHJlYW0mIG91dCkgY29uc3QKK3sKKyAgICBvdXQucHJpbnQoZHVtcFByZWZpeCwgbV9pbmRl
eCk7Cit9CisKK3ZvaWQgQmFzaWNCbG9jazo6ZGVlcER1bXAoUHJpbnRTdHJlYW0mIG91dCkgY29u
c3QKK3sKKyAgICBvdXQucHJpbnQoIkJCIiwgKnRoaXMsICI6XG4iKTsKKyAgICBmb3IgKFZhbHVl
KiB2YWx1ZSA6ICp0aGlzKQorICAgICAgICBvdXQucHJpbnQoIiAgICAiLCBkZWVwRHVtcCh2YWx1
ZSksICJcbiIpOworfQorCit9IH0gLy8gbmFtZXNwYWNlIEpTQzo6QjMKKwpJbmRleDogU291cmNl
L0phdmFTY3JpcHRDb3JlL2IzL0IzQmFzaWNCbG9jay5oCj09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9K
YXZhU2NyaXB0Q29yZS9iMy9CM0Jhc2ljQmxvY2suaAkocmV2aXNpb24gMCkKKysrIFNvdXJjZS9K
YXZhU2NyaXB0Q29yZS9iMy9CM0Jhc2ljQmxvY2suaAkod29ya2luZyBjb3B5KQpAQCAtMCwwICsx
LDEwMyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNSBBcHBsZSBJbmMuIEFsbCByaWdodHMg
cmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJp
bmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0
ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6Cisg
KiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3Zl
IGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhl
IGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBm
b3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhp
cyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUK
KyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRo
IHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBB
UFBMRSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFO
VElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJS
QU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisg
KiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBP
UgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElO
Q0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdF
UyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJT
VElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJ
VFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBU
SEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJ
TElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJ
U0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVO
IElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLiAKKyAqLworCisj
aWZuZGVmIEIzQmFzaWNCbG9jaworI2RlZmluZSBCM0Jhc2ljQmxvY2sKKworbmFtZXNwYWNlIEpT
QyB7IG5hbWVzcGFjZSBCMyB7CisKK2NsYXNzIFByb2NlZHVyZTsKK2NsYXNzIFZhbHVlOworCitj
bGFzcyBCYXNpY0Jsb2NrIHsKKyAgICBXVEZfTUFLRV9OT05DT1BZQUJMRShCYXNpY0Jsb2NrKTsK
KyAgICBXVEZfTUFLRV9GQVNUX0FMTE9DQVRFRDsKK3B1YmxpYzoKKyAgICB0eXBlZGVmIFZlY3Rv
cjxWYWx1ZSo+IFZhbHVlTGlzdDsKKworICAgIHN0YXRpYyBjb25zdCBjaGFyKiBkdW1wUHJlZml4
ID0gIiMiOworCisgICAgfkJhc2ljQmxvY2soKTsKKworICAgIHVuc2lnbmVkIGluZGV4KCkgY29u
c3QgeyByZXR1cm4gbV9pbmRleDsgfQorCisgICAgQWRqYWNlbmN5TGlzdDo6aXRlcmF0b3IgYmVn
aW4oKSB7IHJldHVybiBtX3ZhbHVlcy5iZWdpbigpOyB9CisgICAgQWRqYWNlbmN5TGlzdDo6aXRl
cmF0b3IgZW5kKCkgeyByZXR1cm4gbV92YWx1ZXMuZW5kKCk7IH0KKyAgICBBZGphY2VuY3lMaXN0
Ojpjb25zdF9pdGVyYXRvciBiZWdpbigpIGNvbnN0IHsgcmV0dXJuIG1fdmFsdWVzLmJlZ2luKCk7
IH0KKyAgICBBZGphY2VuY3lMaXN0Ojpjb25zdF9pdGVyYXRvciBlbmQoKSBjb25zdCB7IHJldHVy
biBtX3ZhbHVlcy5lbmQoKTsgfQorCisgICAgc2l6ZV90IHNpemUoKSBjb25zdCB7IHJldHVybiBt
X3ZhbHVlcy5zaXplKCk7IH0KKyAgICBWYWx1ZSogYXQoc2l6ZV90IGluZGV4KSBjb25zdCB7IHJl
dHVybiBtX3ZhbHVlc1tpbmRleF07IH0KKyAgICBWYWx1ZSomIGF0KHNpemVfdCBpbmRleCkgeyBy
ZXR1cm4gbV92YWx1ZXNbaW5kZXhdOyB9CisKKyAgICBWYWx1ZSogbGFzdCgpIGNvbnN0IHsgcmV0
dXJuIG1fdmFsdWVzLmxhc3QoKTsgfQorICAgIFZhbHVlKiYgbGFzdCgpIHsgcmV0dXJuIG1fdmFs
dWVzLmxhc3QoKTsgfQorCisgICAgY29uc3QgVmFsdWVMaXN0JiB2YWx1ZXMoKSBjb25zdCB7IHJl
dHVybiBtX3ZhbHVlczsgfQorICAgIFZhbHVlTGlzdCYgdmFsdWVzKCkgeyByZXR1cm4gbV92YWx1
ZXM7IH0KKworICAgIHZvaWQgYXBwZW5kKFZhbHVlKik7CisKKyAgICB2b2lkIGR1bXAoUHJpbnRT
dHJlYW0mKSBjb25zdDsKKyAgICB2b2lkIGRlZXBEdW1wKFByaW50U3RyZWFtJikgY29uc3Q7CisK
K3ByaXZhdGU6CisgICAgZnJpZW5kIGNsYXNzIFByb2NlZHVyZTsKKyAgICAKKyAgICAvLyBJbnN0
YW50aWF0ZSB2aWEgUHJvY2VkdXJlLgorICAgIEJhc2ljQmxvY2sodW5zaWduZWQgaW5kZXgpOwor
CisgICAgdW5zaWduZWQgbV9pbmRleDsKKyAgICBWYWx1ZUxpc3QgbV92YWx1ZXM7Cit9OworCitj
bGFzcyBEZWVwQmFzaWNCbG9ja0R1bXAgeworcHVibGljOgorICAgIERlZXBCYXNpY0Jsb2NrRHVt
cChCYXNpY0Jsb2NrKiBibG9jaykKKyAgICAgICAgOiBtX2Jsb2NrKGJsb2NrKQorICAgIHsKKyAg
ICB9CisKKyAgICB2b2lkIGR1bXAoUHJpbnRTdHJlYW0mIG91dCkgY29uc3QKKyAgICB7CisgICAg
ICAgIGlmIChtX2Jsb2NrKQorICAgICAgICAgICAgbV9ibG9jay0+ZGVlcER1bXAob3V0KTsKKyAg
ICAgICAgZWxzZQorICAgICAgICAgICAgb3V0LnByaW50KCI8bnVsbD4iKTsKKyAgICB9CisKK3By
aXZhdGU6CisgICAgQmFzaWNCbG9jayogbV9ibG9jazsKK307CisKK0RlZXBCYXNpY0Jsb2NrRHVt
cCBkZWVwRHVtcChCYXNpY0Jsb2NrKiBibG9jaykKK3sKKyAgICByZXR1cm4gRGVlcEJhc2ljQmxv
Y2tEdW1wKGJsb2NrKTsKK30KKworfSB9IC8vIG5hbWVzcGFjZSBKU0M6OkIzCisKKyNlbmRpZiAv
LyBCM0Jhc2ljQmxvY2sKKwpJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzQ29uc3Qz
MlZhbHVlLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNDb25z
dDMyVmFsdWUuY3BwCShyZXZpc2lvbiAwKQorKysgU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0Iz
Q29uc3QzMlZhbHVlLmNwcAkod29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDUxIEBACisvKgorICog
Q29weXJpZ2h0IChDKSAyMDE1IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisg
KiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRo
IG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0
IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0
aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAg
ICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2Ns
YWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1
Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0
aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRh
dGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlv
bi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gYGBBUyBJ
UycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcs
IEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hB
TlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJ
U0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SCisgKiBDT05UUklCVVRP
UlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lB
TCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJV
VCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1Ig
U0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1Mg
SU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElB
QklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisg
KiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkg
T1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBU
SEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisKKyNpbmNsdWRlICJjb25maWcu
aCIKKyNpbmNsdWRlICJCM0NvbnN0MzJWYWx1ZS5oIgorCituYW1lc3BhY2UgSlNDIHsgbmFtZXNw
YWNlIEIzIHsKKworQ29uc3QzMlZhbHVlOjp+Q29uc3QzMlZhbHVlKCkKK3sKK30KKworYm9vbCBD
b25zdDMyVmFsdWU6Omhhc0ludDMyKCkgY29uc3QKK3sKKyAgICByZXR1cm4gdHJ1ZTsKK30KKwor
aW50MzJfdCBDb25zdDMyVmFsdWU6OmFzSW50MzIoKSBjb25zdAoreworICAgIHJldHVybiBtX3Zh
bHVlOworfQorCit2b2lkIENvbnN0MzJWYWx1ZTo6ZHVtcE1ldGEoUHJpbnRTdHJlYW0mIG91dCkg
Y29uc3QKK3sKKyAgICBvdXQucHJpbnQobV92YWx1ZSk7Cit9CisKK30gfSAvLyBuYW1lc3BhY2Ug
SlNDOjpCMworCkluZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNDb25zdDMyVmFsdWUu
aAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNDb25zdDMyVmFsdWUu
aAkocmV2aXNpb24gMCkKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM0NvbnN0MzJWYWx1
ZS5oCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsNjAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMp
IDIwMTUgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0
aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAor
ICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2lu
ZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJj
ZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhp
cyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIu
IFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUg
Y29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUg
Zm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBv
dGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRI
SVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQor
ICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1J
VEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5E
IEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElO
IE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUg
Rk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBM
QVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVE
IFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9T
UyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04p
IEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRI
RVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcg
TkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVT
RQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElU
WSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKworI2lmbmRlZiBCM0NvbnN0MzJWYWx1ZV9oCisjZGVm
aW5lIEIzQ29uc3QzMlZhbHVlX2gKKworI2luY2x1ZGUgIkIzVmFsdWUuaCIKKworbmFtZXNwYWNl
IEpTQyB7IG5hbWVzcGFjZSBCMyB7CisKK2NsYXNzIENvbnN0MzJWYWx1ZSA6IHB1YmxpYyBWYWx1
ZSB7CitwdWJsaWM6CisgICAgfkNvbnN0MzJWYWx1ZSgpOworICAgIAorICAgIGludDMyX3QgdmFs
dWUoKSBjb25zdCB7IHJldHVybiBtX3ZhbHVlOyB9CisKK3Byb3RlY3RlZDoKKyAgICBib29sIGhh
c0ludDMyKCkgY29uc3Qgb3ZlcnJpZGU7CisgICAgaW50MzJfdCBhc0ludDMyKCkgY29uc3Qgb3Zl
cnJpZGU7CisKKyAgICB2b2lkIGR1bXBNZXRhKFByaW50U3RyZWFtJikgY29uc3Qgb3ZlcnJpZGU7
CisKK3ByaXZhdGU6CisgICAgZnJpZW5kIGNsYXNzIFByb2NlZHVyZTsKKworICAgIENvbnN0MzJW
YWx1ZSh1bnNpZ25lZCBpbmRleCwgT3JpZ2luIG9yaWdpbiwgaW50MzJfdCB2YWx1ZSkKKyAgICAg
ICAgOiBWYWx1ZShpbmRleCwgQ29uc3QzMiwgSW50MzIsIG9yaWdpbikKKyAgICAgICAgLCBtX3Zh
bHVlKHZhbHVlKQorICAgIHsKKyAgICB9CisgICAgCisgICAgaW50MzJfdCBtX3ZhbHVlOworfTsK
KworfSB9IC8vIG5hbWVzcGFjZSBKU0M6OkIzCisKKyNlbmRpZiAvLyBCM0NvbnN0MzJWYWx1ZV9o
CisKSW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM0NvbnN0NjRWYWx1ZS5jcHAKPT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzQ29uc3Q2NFZhbHVlLmNwcAko
cmV2aXNpb24gMCkKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM0NvbnN0NjRWYWx1ZS5j
cHAJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSw1MSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykg
MjAxNSBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRp
b24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Cisg
KiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5n
IGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNl
IGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlz
IGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4g
UmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBj
b3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBm
b2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90
aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJ
UyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisg
KiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlU
RUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQg
RklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4g
Tk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBG
T1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExB
UlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQg
VE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NT
IE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikg
SE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhF
UiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBO
RUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNF
CisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZ
IE9GIFNVQ0ggREFNQUdFLiAKKyAqLworCisjaW5jbHVkZSAiY29uZmlnLmgiCisjaW5jbHVkZSAi
QjNDb25zdDY0VmFsdWUuaCIKKworbmFtZXNwYWNlIEpTQyB7IG5hbWVzcGFjZSBCMyB7CisKK0Nv
bnN0NjRWYWx1ZTo6fkNvbnN0NjRWYWx1ZSgpCit7Cit9CisKK2Jvb2wgQ29uc3Q2NFZhbHVlOjpo
YXNJbnQ2NCgpIGNvbnN0Cit7CisgICAgcmV0dXJuIHRydWU7Cit9CisKK2ludDY0X3QgQ29uc3Q2
NFZhbHVlOjphc0ludDY0KCkgY29uc3QKK3sKKyAgICByZXR1cm4gbV92YWx1ZTsKK30KKwordm9p
ZCBDb25zdDY0VmFsdWU6OmR1bXBNZXRhKFByaW50U3RyZWFtJiBvdXQpIGNvbnN0Cit7CisgICAg
b3V0LnByaW50KG1fdmFsdWUpOworfQorCit9IH0gLy8gbmFtZXNwYWNlIEpTQzo6QjMKKwpJbmRl
eDogU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzQ29uc3Q2NFZhbHVlLmgKPT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQot
LS0gU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzQ29uc3Q2NFZhbHVlLmgJKHJldmlzaW9uIDAp
CisrKyBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNDb25zdDY0VmFsdWUuaAkod29ya2luZyBj
b3B5KQpAQCAtMCwwICsxLDYwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE1IEFwcGxlIElu
Yy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGlu
IHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlv
biwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwor
ICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJl
dGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25k
aXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlv
bnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICog
ICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNj
bGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxz
IHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElT
IFBST1ZJREVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1Ig
SU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisg
KiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBB
IFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFM
TCBBUFBMRSBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNU
LCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VR
VUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NV
UkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRB
LCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNF
RCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNU
LCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1Ig
T1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMg
U09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1B
R0UuIAorICovCisKKyNpZm5kZWYgQjNDb25zdDY0VmFsdWVfaAorI2RlZmluZSBCM0NvbnN0NjRW
YWx1ZV9oCisKKyNpbmNsdWRlICJCM1ZhbHVlLmgiCisKK25hbWVzcGFjZSBKU0MgeyBuYW1lc3Bh
Y2UgQjMgeworCitjbGFzcyBDb25zdDY0VmFsdWUgOiBwdWJsaWMgVmFsdWUgeworcHVibGljOgor
ICAgIH5Db25zdDY0VmFsdWUoKTsKKyAgICAKKyAgICBpbnQ2NF90IHZhbHVlKCkgY29uc3QgeyBy
ZXR1cm4gbV92YWx1ZTsgfQorCitwcm90ZWN0ZWQ6CisgICAgYm9vbCBoYXNJbnQ2NCgpIGNvbnN0
IG92ZXJyaWRlOworICAgIGludDY0X3QgYXNJbnQ2NCgpIGNvbnN0IG92ZXJyaWRlOworCisgICAg
dm9pZCBkdW1wTWV0YShQcmludFN0cmVhbSYpIGNvbnN0IG92ZXJyaWRlOworCitwcml2YXRlOgor
ICAgIGZyaWVuZCBjbGFzcyBQcm9jZWR1cmU7CisKKyAgICBDb25zdDY0VmFsdWUodW5zaWduZWQg
aW5kZXgsIE9yaWdpbiBvcmlnaW4sIGludDY0X3QgdmFsdWUpCisgICAgICAgIDogVmFsdWUoaW5k
ZXgsIENvbnN0NjQsIEludDY0LCBvcmlnaW4pCisgICAgICAgICwgbV92YWx1ZSh2YWx1ZSkKKyAg
ICB7CisgICAgfQorICAgIAorICAgIGludDY0X3QgbV92YWx1ZTsKK307CisKK30gfSAvLyBuYW1l
c3BhY2UgSlNDOjpCMworCisjZW5kaWYgLy8gQjNDb25zdDY0VmFsdWVfaAorCkluZGV4OiBTb3Vy
Y2UvSmF2YVNjcmlwdENvcmUvYjMvQjNDb25zdERvdWJsZVZhbHVlLmNwcAo9PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0t
LSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNDb25zdERvdWJsZVZhbHVlLmNwcAkocmV2aXNp
b24gMCkKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM0NvbnN0RG91YmxlVmFsdWUuY3Bw
CSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsNTEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIw
MTUgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9u
IGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICog
bW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBj
b25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBj
b2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBs
aXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJl
ZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29w
eXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9s
bG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhl
ciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMg
U09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICog
RVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVE
IFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJ
VE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5P
IEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9S
IEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZ
LCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRP
LAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBP
RiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhP
V0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIg
SU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVH
TElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQor
ICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBP
RiBTVUNIIERBTUFHRS4gCisgKi8KKworI2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgIkIz
Q29uc3REb3VibGVWYWx1ZS5oIgorCituYW1lc3BhY2UgSlNDIHsgbmFtZXNwYWNlIEIzIHsKKwor
Q29uc3REb3VibGVWYWx1ZTo6fkNvbnN0RG91YmxlVmFsdWUoKQoreworfQorCitib29sIENvbnN0
RG91YmxlVmFsdWU6Omhhc0RvdWJsZSgpIGNvbnN0Cit7CisgICAgcmV0dXJuIHRydWU7Cit9CisK
K2RvdWJsZSBDb25zdERvdWJsZVZhbHVlOjphc0RvdWJsZSgpIGNvbnN0Cit7CisgICAgcmV0dXJu
IG1fdmFsdWU7Cit9CisKK3ZvaWQgQ29uc3REb3VibGVWYWx1ZTo6ZHVtcE1ldGEoUHJpbnRTdHJl
YW0mIG91dCkgY29uc3QKK3sKKyAgICBvdXQucHJpbnRmKCIlbGUiLCBtX3ZhbHVlKTsKK30KKwor
fSB9IC8vIG5hbWVzcGFjZSBKU0M6OkIzCisKSW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9i
My9CM0NvbnN0RG91YmxlVmFsdWUuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENv
cmUvYjMvQjNDb25zdERvdWJsZVZhbHVlLmgJKHJldmlzaW9uIDApCisrKyBTb3VyY2UvSmF2YVNj
cmlwdENvcmUvYjMvQjNDb25zdERvdWJsZVZhbHVlLmgJKHdvcmtpbmcgY29weSkKQEAgLTAsMCAr
MSw2MCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNSBBcHBsZSBJbmMuIEFsbCByaWdodHMg
cmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJp
bmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0
ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6Cisg
KiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3Zl
IGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhl
IGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBm
b3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhp
cyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUK
KyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRo
IHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBB
UFBMRSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFO
VElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJS
QU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisg
KiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBP
UgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElO
Q0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdF
UyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJT
VElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJ
VFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBU
SEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJ
TElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJ
U0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVO
IElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLiAKKyAqLworCisj
aWZuZGVmIEIzQ29uc3REb3VibGVWYWx1ZV9oCisjZGVmaW5lIEIzQ29uc3REb3VibGVWYWx1ZV9o
CisKKyNpbmNsdWRlICJCM1ZhbHVlLmgiCisKK25hbWVzcGFjZSBKU0MgeyBuYW1lc3BhY2UgQjMg
eworCitjbGFzcyBDb25zdERvdWJsZVZhbHVlIDogcHVibGljIFZhbHVlIHsKK3B1YmxpYzoKKyAg
ICB+Q29uc3REb3VibGVWYWx1ZSgpOworICAgIAorICAgIGRvdWJsZSB2YWx1ZSgpIGNvbnN0IHsg
cmV0dXJuIG1fdmFsdWU7IH0KKworcHJvdGVjdGVkOgorICAgIGJvb2wgaGFzRG91YmxlKCkgY29u
c3Qgb3ZlcnJpZGU7CisgICAgZG91YmxlIGFzRG91YmxlKCkgY29uc3Qgb3ZlcnJpZGU7CisKKyAg
ICB2b2lkIGR1bXBNZXRhKFByaW50U3RyZWFtJikgY29uc3Qgb3ZlcnJpZGU7CisKK3ByaXZhdGU6
CisgICAgZnJpZW5kIGNsYXNzIFByb2NlZHVyZTsKKworICAgIENvbnN0RG91YmxlVmFsdWUodW5z
aWduZWQgaW5kZXgsIE9yaWdpbiBvcmlnaW4sIGRvdWJsZSB2YWx1ZSkKKyAgICAgICAgOiBWYWx1
ZShpbmRleCwgQ29uc3REb3VibGUsIERvdWJsZSwgb3JpZ2luKQorICAgICAgICAsIG1fdmFsdWUo
dmFsdWUpCisgICAgeworICAgIH0KKyAgICAKKyAgICBkb3VibGUgbV92YWx1ZTsKK307CisKK30g
fSAvLyBuYW1lc3BhY2UgSlNDOjpCMworCisjZW5kaWYgLy8gQjNDb25zdERvdWJsZVZhbHVlX2gK
KwpJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzSW5kZXhTZXQuaAo9PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNJbmRleFNldC5oCShyZXZpc2lvbiAwKQor
KysgU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzSW5kZXhTZXQuaAkod29ya2luZyBjb3B5KQpA
QCAtMCwwICsxLDE0MSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNSBBcHBsZSBJbmMuIEFs
bCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3Vy
Y2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFy
ZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFy
ZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4g
dGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9u
cyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGlu
IGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5v
dGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1l
ciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92
aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9W
SURFRCBCWSBBUFBMRSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJ
RUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1Q
TElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJU
SUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQ
TEUgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5E
SVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJ
QUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVO
VCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IK
KyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5E
IE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RS
SUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVS
V0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRX
QVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLiAK
KyAqLworCisjaWZuZGVmIEIzSW5kZXhTZXRfaAorI2RlZmluZSBCM0luZGV4U2V0X2gKKworI2lu
Y2x1ZGUgPHd0Zi9CaXRWZWN0b3IuaD4KKyNpbmNsdWRlIDx3dGYvQ29tbWFQcmludGVyLmg+CisK
K25hbWVzcGFjZSBKU0MgeyBuYW1lc3BhY2UgQjMgeworCisvLyBUaGlzIGlzIGEgc2V0IGZvciB0
aGluZ3MgdGhhdCBoYXZlIGFuIGluZGV4KCkuIEl0J3Mgc3VwZXIgZWZmaWNpZW50IGZvciBCYXNp
Y0Jsb2Nrcy4gSXQncyBvbmx5CisvLyBlZmZpY2llbnQgZm9yIFZhbHVlcyBpZiB5b3UgZG9uJ3Qg
Y3JlYXRlIHRvbyBtYW55IG9mIHRoZXNlIHNldHMsIHNpbmNlIFZhbHVlcyBjYW4gaGF2ZSB2ZXJ5
IHNwYXJzZQorLy8gaW5kaWNlcyBhbmQgdGhlcmUgYXJlIGEgbG90IG9mIFZhbHVlcy4KKworLy8g
SWYgeW91IHdhbnQgYSBzZXQgb2YgQmFzaWNCbG9ja3MsIHlvdSBkbyBJbmRleFNldDxCYXNpY0Js
b2NrPi4gU28sIFQgPSBCYXNpY0Jsb2NrLgordGVtcGxhdGU8dHlwZW5hbWUgVD4KK2NsYXNzIElu
ZGV4U2V0IHsKK3B1YmxpYzoKKyAgICBJbmRleFNldCgpCisgICAgeworICAgIH0KKworICAgIGJv
b2wgYWRkKFQqIHZhbHVlKQorICAgIHsKKyAgICAgICAgcmV0dXJuICFtX3NldC5zZXQodmFsdWUt
PmluZGV4KCkpOworICAgIH0KKworICAgIGJvb2wgY29udGFpbnMoVCogdmFsdWUpIGNvbnN0Cisg
ICAgeworICAgICAgICBpZiAoIXZhbHVlKQorICAgICAgICAgICAgcmV0dXJuIG51bGxwdHI7Cisg
ICAgICAgIHJldHVybiBtX3NldC5nZXQodmFsdWUtPmluZGV4KCkpOworICAgIH0KKworICAgIHRl
bXBsYXRlPHR5cGVuYW1lIENvbGxlY3Rpb25UeXBlPgorICAgIGNsYXNzIEl0ZXJhYmxlIHsKKyAg
ICBwdWJsaWM6CisgICAgICAgIEl0ZXJhYmxlKGNvbnN0IENvbGxlY3Rpb25UeXBlJiBjb2xsZWN0
aW9uLCBjb25zdCBJbmRleFNldCYgc2V0KQorICAgICAgICAgICAgOiBtX2NvbGxlY3Rpb24oY29s
bGVjdGlvbikKKyAgICAgICAgICAgICwgbV9zZXQoc2V0KQorICAgICAgICB7CisgICAgICAgIH0K
KworICAgICAgICBjbGFzcyBpdGVyYXRvciB7CisgICAgICAgIHB1YmxpYzoKKyAgICAgICAgICAg
IGl0ZXJhdG9yKCkKKyAgICAgICAgICAgICAgICA6IG1fY29sbGVjdGlvbihudWxscHRyKQorICAg
ICAgICAgICAgeworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpdGVyYXRvcihjb25zdCBD
b2xsZWN0aW9uVHlwZSYgY29sbGVjdGlvbiwgQml0VmVjdG9yOjpTZXRCaXRzSXRlcmFibGU6Oml0
ZXJhdG9yIGl0ZXIpCisgICAgICAgICAgICAgICAgOiBtX2NvbGxlY3Rpb24oJmNvbGxlY3Rpb24p
CisgICAgICAgICAgICAgICAgLCBtX2l0ZXIoaXRlcikKKyAgICAgICAgICAgIHsKKyAgICAgICAg
ICAgIH0KKworICAgICAgICAgICAgVCogb3BlcmF0b3IqKCkKKyAgICAgICAgICAgIHsKKyAgICAg
ICAgICAgICAgICByZXR1cm4gbV9jb2xsZWN0aW9uLT5hdCgqbV9pdGVyKTsKKyAgICAgICAgICAg
IH0KKworICAgICAgICAgICAgaXRlcmF0b3ImIG9wZXJhdG9yKysoKQorICAgICAgICAgICAgewor
ICAgICAgICAgICAgICAgIG1faXRlcisrOworICAgICAgICAgICAgICAgIHJldHVybiAqdGhpczsK
KyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgYm9vbCBvcGVyYXRvcj09KGNvbnN0IGl0ZXJh
dG9yJiBvdGhlcikgY29uc3QKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4g
bV9pdGVyID09IG90aGVyLm1faXRlcjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgYm9v
bCBvcGVyYXRvciE9KGNvbnN0IGl0ZXJhdG9yJiBvdGhlcikgY29uc3QKKyAgICAgICAgICAgIHsK
KyAgICAgICAgICAgICAgICByZXR1cm4gISgqdGhpcyA9PSBvdGhlcik7CisgICAgICAgICAgICB9
CisKKyAgICAgICAgcHJpdmF0ZToKKyAgICAgICAgICAgIGNvbnN0IENvbGxlY3Rpb25UeXBlKiBt
X2NvbGxlY3Rpb247CisgICAgICAgICAgICBCaXRWZWN0b3I6OlNldEJpdHNJdGVyYWJsZTo6aXRl
cmF0b3IgbV9pdGVyOworICAgICAgICB9OworCisgICAgICAgIGl0ZXJhdG9yIGJlZ2luKCkgY29u
c3QgeyByZXR1cm4gaXRlcmF0b3IobV9jb2xsZWN0aW9uLCBtX3NldC5iZWdpbigpKTsgfQorICAg
ICAgICBpdGVyYXRvciBlbmQoKSBjb25zdCB7IHJldHVybiBpdGVyYXRvcihtX2NvbGxlY3Rpb24s
IG1fc2V0LmVuZCgpKTsgfQorCisgICAgcHJpdmF0ZToKKyAgICAgICAgY29uc3QgQ29sbGVjdGlv
blR5cGUmIG1fY29sbGVjdGlvbjsKKyAgICAgICAgY29uc3QgSW5kZXhTZXQmIG1fc2V0OworICAg
IH07CisKKyAgICAvLyBGb3IgYmFzaWMgYmxvY2tzLCB5b3UgZG86CisgICAgLy8gaW5kZXhTZXQu
dmFsdWVzKHByb2NlZHVyZSk7CisgICAgLy8KKyAgICAvLyBGb3IgdmFsdWVzLCB5b3UgZG86Cisg
ICAgLy8gaW5kZXhTZXQudmFsdWVzKHByb2NlZHVyZS52YWx1ZXMoKSk7CisgICAgdGVtcGxhdGU8
dHlwZW5hbWUgQ29sbGVjdGlvblR5cGU+CisgICAgSXRlcmFibGU8Q29sbGVjdGlvblR5cGU+IHZh
bHVlcyhjb25zdCBDb2xsZWN0aW9uVHlwZSYgY29sbGVjdGlvbikgY29uc3QKKyAgICB7CisgICAg
ICAgIHJldHVybiBJdGVyYWJsZTxDb2xsZWN0aW9uVHlwZT4oY29sbGVjdGlvbik7CisgICAgfQor
CisgICAgY29uc3QgQml0VmVjdG9yJiBpbmRpY2VzKCkgY29uc3QgeyByZXR1cm4gbV9zZXQ7IH0K
KworICAgIHZvaWQgZHVtcChQcmludFN0cmVhbSYgb3V0KSBjb25zdAorICAgIHsKKyAgICAgICAg
Q29tbWFQcmludGVyIGNvbW1hOworICAgICAgICBmb3IgKHNpemVfdCBpbmRleCA6IGluZGljZXMo
KS5zZXRCaXRzKCkpCisgICAgICAgICAgICBvdXQucHJpbnQoY29tbWEsIFQ6OmR1bXBQcmVmaXgs
IGluZGV4KTsKKyAgICB9CisKK3ByaXZhdGU6CisgICAgQml0VmVjdG9yIG1fc2V0OworfTsKKwor
fSB9IC8vIG5hbWVzcGFjZSBKU0M6OkIzCisKKyNlbmRpZiAvLyBCM0luZGV4U2V0X2gKKwpJbmRl
eDogU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzT3Bjb2RlLmNwcAo9PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBT
b3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNPcGNvZGUuY3BwCShyZXZpc2lvbiAwKQorKysgU291
cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzT3Bjb2RlLmNwcAkod29ya2luZyBjb3B5KQpAQCAtMCww
ICsxLDQ3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE1IEFwcGxlIEluYy4gQWxsIHJpZ2h0
cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQg
YmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1p
dHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoK
KyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJv
dmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0
aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5
IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0
aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRo
ZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdp
dGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZ
IEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJS
QU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdB
UlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIK
KyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMu
IE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwg
SU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1B
R0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNV
QlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJP
RklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5Z
IFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElB
QklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBB
UklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVW
RU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisK
KyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJCM09wY29kZS5oIgorCisjaW5jbHVkZSA8
d3RmL1ByaW50U3RyZWFtLmg+CisKK25hbWVzcGFjZSBXVEYgeworCit1c2luZyBuYW1lc3BhY2Ug
SlNDOjpCMzsKKwordm9pZCBwcmludEludGVybmFsKFByaW50U3RyZWFtJiBvdXQsIE9wY29kZSBv
cGNvZGUpCit7CisgICAgc3dpdGNoIChvcGNvZGUpIHsKKyAgICBjYXNlIElkZW50aXR5OgorICAg
ICAgICBvdXQucHJpbnQoIklkZW50aXR5Iik7CisgICAgICAgIHJldHVybjsKKyAgICAgICAgLy8g
RklYTUUKKyAgICB9CisgICAgUkVMRUFTRV9BU1NFUlRfTk9UX1JFQUNIRUQoKTsKK30KKworfSAv
LyBuYW1lc3BhY2UgV1RGCisKSW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM09wY29k
ZS5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM09wY29kZS5oCShy
ZXZpc2lvbiAwKQorKysgU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzT3Bjb2RlLmgJKHdvcmtp
bmcgY29weSkKQEAgLTAsMCArMSwxNzkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTUgQXBw
bGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1
c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZp
Y2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRp
b25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11
c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9m
IGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJp
YnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0
CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5n
IGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRl
cmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdB
UkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVT
UyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBU
SEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1Mg
Rk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5U
IFNIQUxMIEFQUExFIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBE
SVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBD
T05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICog
UFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0Us
IERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIg
Q0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09O
VFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5D
RSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0Yg
VEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNI
IERBTUFHRS4gCisgKi8KKworI2lmbmRlZiBCM09wY29kZV9oCisjZGVmaW5lIEIzT3Bjb2RlX2gK
KworI2luY2x1ZGUgPHd0Zi9TdGRMaWJFeHRyYXMuaD4KKworbmFtZXNwYWNlIEpTQyB7IG5hbWVz
cGFjZSBCMyB7CisKK2VudW0gT3Bjb2RlIDogaW50MTZfdCB7CisgICAgLy8gUG9seW1vcnBoaWMg
aWRlbnRpdHksIHVzYWJsZSB3aXRoIGFueSB2YWx1ZSB0eXBlLgorICAgIElkZW50aXR5LAorCisg
ICAgLy8gQ29uc3RhbnRzLiBVc2UgdGhlIENvbnN0VmFsdWUqIGNsYXNzZXMuIENvbnN0YW50cyBl
eGlzdCBpbiB0aGUgY29udHJvbCBmbG93LCBzbyB0aGF0IHdlIGNhbgorICAgIC8vIHJlYXNvbiBh
Ym91dCB3aGVyZSB3ZSB3b3VsZCBjb25zdHJ1Y3QgdGhlbS4gTGFyZ2UgY29uc3RhbnRzIGFyZSBl
eHBlbnNpdmUgdG8gY3JlYXRlLgorICAgIENvbnN0MzIsCisgICAgQ29uc3Q2NCwKKyAgICBDb25z
dERvdWJsZSwKKworICAgIC8vIFRoZSBtYWdpY2FsIHN0YWNrIHNsb3QuIFRoaXMgaXMgdmlld2Vk
IGFzIGV4ZWN1dGluZyBhdCB0aGUgdG9wIG9mIHRoZSBwcm9ncmFtIHJlZ2FyZGxlc3Mgb2YKKyAg
ICAvLyB3aGVyZSBpbiBjb250cm9sIGZsb3cgeW91IHB1dCBpdC4gRWFjaCBpbnN0YW5jZSBvZiBh
IFN0YWNrU2xvdCBWYWx1ZSBnZXRzIGEgZGlzam9pbnQgcmFuZ2Ugb2YKKyAgICAvLyBzdGFjayBt
ZW1vcnkuIFVzZSB0aGUgU3RhY2tTbG90VmFsdWUgY2xhc3MuCisgICAgU3RhY2tTbG90LAorCisg
ICAgLy8gVGhlIG1hZ2ljYWwgYXJndW1lbnQgcmVnaXN0ZXIuIFRoaXMgaXMgdmlld2VkIGFzIGV4
ZWN1dGluZyBhdCB0aGUgdG9wIG9mIHRoZSBwcm9ncmFtCisgICAgLy8gcmVnYXJkbGVzcyBvZiB3
aGVyZSBpbiBjb250cm9sIGZsb3cgeW91IHB1dCBpdCwgYW5kIHRoZSBjb21waWxlciB0YWtlcyBj
YXJlIHRvIGVuc3VyZSB0aGF0IHdlCisgICAgLy8gZG9uJ3QgY2xvYmJlciB0aGUgdmFsdWUgYnkg
cmVnaXN0ZXIgYWxsb2NhdGlvbiBvciBjYWxscyAoZWl0aGVyIGJ5IHNhdmluZyB0aGUgYXJndW1l
bnQgdG8gdGhlCisgICAgLy8gc3RhY2sgb3IgcHJlc2VydmluZyBpdCBpbiBhIGNhbGxlZS1zYXZl
IHJlZ2lzdGVyKS4gVXNlIHRoZSBBcmd1bWVudFJlZ1ZhbHVlIGNsYXNzLiBUaGUgcmV0dXJuCisg
ICAgLy8gdHlwZSBpcyBlaXRoZXIgcG9pbnRlcigpIChmb3IgR1BScykgb3IgRG91YmxlIChmb3Ig
RlBScykuCisgICAgQXJndW1lbnRSZWcsCisKKyAgICAvLyBUaGUgZnJhbWUgcG9pbnRlci4gWW91
IGNhbiBwdXQgdGhpcyBhbnl3aGVyZSBpbiBjb250cm9sIGZsb3cgYnV0IGl0IHdpbGwgYWx3YXlz
IHlpZWxkIHRoZQorICAgIC8vIGZyYW1lIHBvaW50ZXIsIHdpdGggYSBjYXZlYXQ6IGlmIG91ciBj
b21waWxlciBjaGFuZ2VzIHRoZSBmcmFtZSBwb2ludGVyIHRlbXBvcmFyaWx5IGZvciBzb21lCisg
ICAgLy8gc2lsbHkgcmVhc29uLCB0aGUgRnJhbWVQb2ludGVyIGludHJpbnNpYyB3aWxsIHJldHVy
biB3aGVyZSB0aGUgZnJhbWUgcG9pbnRlciAqc2hvdWxkKiBiZSBub3QKKyAgICAvLyB3aGVyZSBp
dCBoYXBwZW5zIHRvIGJlIHJpZ2h0IG5vdy4KKyAgICBGcmFtZVBvaW50ZXIsCisKKyAgICAvLyBQ
b2x5bW9ycGhpYyBtYXRoLCB1c2FibGUgd2l0aCBhbnkgdmFsdWUgdHlwZS4KKyAgICBBZGQsCisg
ICAgU3ViLAorICAgIE11bCwKKyAgICBEaXYsCisKKyAgICAvLyBJbnRlZ2VyIG1hdGguCisgICAg
Q2hpbGxEaXYsIC8vIGRvZXNuJ3QgdHJhcCBldmVyLCBiZWhhdmVzIGxpa2UgSlMgKHgveSl8MC4K
KyAgICBNb2QsCisgICAgQml0QW5kLAorICAgIEJpdE9yLAorICAgIEJpdFhvciwKKyAgICBTaGws
CisgICAgU1NociwKKyAgICBaU2hyLAorCisgICAgLy8gQ2FzdHMgYW5kIHN1Y2guCisgICAgLy8g
VGFrZXMgYW5kIHJldHVybnMgSW50MzI6CisgICAgU0V4dDgsCisgICAgU0V4dDE2LAorICAgIC8v
IFRha2VzIEludDMyIGFuZCByZXR1cm5zIEludDY0OgorICAgIFNFeHQzMiwKKyAgICBaRXh0MzIs
CisgICAgLy8gVGFrZXMgYW5kIHJldHVybnMgRG91YmxlOgorICAgIEZSb3VuZCwKKyAgICAvLyBU
YWtlcyBpbnRzIGFuZCByZXR1cm5zIERvdWJsZToKKyAgICBJVG9ELAorICAgIC8vIFRha2VzIERv
dWJsZSBhbmQgcmV0dXJucyBJbnQzMjoKKyAgICBEVG9JMzIsCisKKyAgICAvLyBQb2x5bW9ycGhp
YyBjb21wYXJpc29ucywgdXNhYmxlIHdpdGggYW55IHZhbHVlIHR5cGUuIFJldHVybnMgaW50MzIg
MCBvciAxLiBOb3RlIHRoYXQgIk5vdCIKKyAgICAvLyBpcyBqdXN0IEVxdWFsKHgsIDApLgorICAg
IEVxdWFsLAorICAgIE5vdEVxdWFsLAorICAgIExlc3NUaGFuLAorICAgIEdyZWF0ZXJUaGFuLAor
ICAgIExlc3NFcXVhbCwKKyAgICBHcmVhdGVyRXF1YWwsCisKKyAgICAvLyBJbnRlZ2VyIGNvbXBh
cmlzb25zLiBSZXR1cm5zIGludDMyIDAgb3IgMS4KKyAgICBBYm92ZSwKKyAgICBCZWxvdywKKyAg
ICBBYm92ZUVxdWFsCisgICAgQmVsb3dFcXVhbCwKKworICAgIC8vIE1lbW9yeSBsb2Fkcy4gT3Bj
b2RlIGluZGljYXRlcyBob3cgd2UgbG9hZCBhbmQgdGhlIGxvYWRlZCB0eXBlLgorICAgIC8vIFRo
ZXNlIHJldHVybiBJbnQzMjoKKyAgICBMb2FkOFosCisgICAgTG9hZDhTLAorICAgIExvYWQxNlos
CisgICAgTG9hZDE2UywKKyAgICAvLyBUaGlzIHJldHVybnMgRG91YmxlOgorICAgIExvYWRGbG9h
dCwKKyAgICAvLyBUaGlzIHJldHVybiB3aGF0ZXZlciB0aGUgcmV0dXJuIHR5cGUgaXM6CisgICAg
TG9hZCwKKworICAgIC8vIE1lbW9yeSBzdG9yZXMuIE9wY29kZSBpbmRpY2F0ZXMgaG93IHRoZSB2
YWx1ZSBpcyBzdG9yZWQuCisgICAgLy8gVGhlc2UgdGFrZSBhbiBJbnQzMiB2YWx1ZToKKyAgICBT
dG9yZTgsCisgICAgU3RvcmUxNiwKKyAgICAvLyBUaGlzIHRha2VzIGEgRG91YmxlIHZhbHVlOgor
ICAgIFN0b3JlRmxvYXQsCisgICAgLy8gVGhpcyBpcyBhIHBvbHltb3JwaGljIHN0b3JlIGZvciBJ
bnQzMiwgSW50NjQsIGFuZCBEb3VibGU6CisgICAgU3RvcmUsCisKKyAgICAvLyBUaGlzIGlzIGEg
cmVndWxhciBvcmRpbmFyeSBDIGZ1bmN0aW9uIGNhbGwsIHVzaW5nIHRoZSBzeXN0ZW0gQyBjYWxs
aW5nIGNvbnZlbnRpb24uIE1ha2Ugc3VyZQorICAgIC8vIHRoYXQgdGhlIGFyZ3VtZW50cyBhcmUg
cGFzc2VkIHVzaW5nIHRoZSByaWdodCB0eXBlcy4KKyAgICBDQ2FsbCwKKworICAgIC8vIFRoaXMg
aXMgYSBwYXRjaHBvaW50LiBVc2UgdGhlIFBhdGNocG9pbnRWYWx1ZSBjbGFzcy4gVGhpcyBpcyB2
aWV3ZWQgYXMgYmVoYXZpbmcgbGlrZSBhIGNhbGwsCisgICAgLy8gYnV0IG9ubHkgZW1pdHMgY29k
ZSB2aWEgYSBjb2RlIGdlbmVyYXRpb24gY2FsbGJhY2suIFRoYXQgY2FsbGJhY2sgZ2V0cyB0byBl
bWl0IGNvZGUgaW5saW5lLgorICAgIC8vIFlvdSBjYW4gcGFzcyBhIHN0YWNrbWFwIGFsb25nIHdp
dGggY29uc3RyYWludHMgb24gaG93IGVhY2ggc3RhY2ttYXAgYXJndW1lbnQgbXVzdCBiZSBwYXNz
ZWQuCisgICAgLy8gSXQncyBsZWdhbCB0byByZXF1ZXN0IHRoYXQgYSBzdGFja21hcCBhcmd1bWVu
dCBpcyBpbiBzb21lIHJlZ2lzdGVyIGFuZCBpdCdzIGxlZ2FsIHRvIHJlcXVlc3QKKyAgICAvLyB0
aGF0IGEgc3RhY2ttYXAgYXJndW1lbnQgaXMgYXQgc29tZSBvZmZzZXQgZnJvbSB0aGUgdG9wIG9m
IHRoZSBhcmd1bWVudCBwYXNzaW5nIGFyZWEgb24gdGhlCisgICAgLy8gc3RhY2suCisgICAgUGF0
Y2hwb2ludCwKKworICAgIC8vIENoZWNrZWQgbWF0aC4gVXNlIHRoZSBDaGVja2VkTWF0aFZhbHVl
IGNsYXNzLiBMaWtlIGEgUGF0Y2hwb2ludCwgdGhpcyB0YWtlcyBhIGNvZGUgZ2VuZXJhdGlvbgor
ICAgIC8vIGNhbGxiYWNrLiBUaGF0IGNhbGxiYWNrIGdldHMgdG8gZW1pdCBzb21lIGNvZGUgYWZ0
ZXIgdGhlIGVwaWxvZ3VlLCBhbmQgZ2V0cyB0byBsaW5rIHRoZSBqdW1wCisgICAgLy8gZnJvbSB0
aGUgY2hlY2ssIHRoZSBsYWJlbCBhZnRlciB0aGUgbWF0aCBpbnN0cnVjdGlvbiwgYW5kIHRoZSBj
aG9pY2Ugb2YgcmVnaXN0ZXJzLiBZb3UgYWxzbworICAgIC8vIGdldCB0byBzdXBwbHkgYSBzdGFj
a21hcC4KKyAgICBDaGVja0FkZCwKKyAgICBDaGVja1N1YiwKKyAgICBDaGVja011bCwKKworICAg
IC8vIFNTQSBzdXBwb3J0LCBpbiB0aGUgc3R5bGUgb2YgREZHIFNTQS4KKyAgICBVcHNpbG9uLAor
ICAgIFBoaSwKKworICAgIC8vIEp1bXAuIFVzZXMgdGhlIEp1bXBWYWx1ZSBjbGFzcy4KKyAgICBK
dW1wLAorICAgIAorICAgIC8vIFBvbHltb3JwaGljIGJyYW5jaCwgdXNhYmxlIHdpdGggYW55IHZh
bHVlIHR5cGUuIEJyYW5jaGVzIGlmIG5vdCBlcXVhbCB0byB6ZXJvLiBVc2VzIHRoZQorICAgIC8v
IEJyYW5jaFZhbHVlIGNsYXNzLgorICAgIEJyYW5jaCwKKworICAgIC8vIFN3aXRjaC4gU3dpdGNo
ZXMgb3ZlciBlaXRoZXIgSW50MzIgb3IgSW50NjQuIFVzZXMgdGhlIFN3aXRjaFZhbHVlIGNsYXNz
LgorICAgIFN3aXRjaCwKKworICAgIC8vIFJldHVybi4gTm90ZSB0aGF0IEIzIHByb2NlZHVyZXMg
ZG9uJ3Qga25vdyB0aGVpciByZXR1cm4gdHlwZSwgc28gdGhpcyBjYW4ganVzdCByZXR1cm4gYW55
CisgICAgLy8gdHlwZS4KKyAgICBSZXR1cm4sCisKKyAgICAvLyBUaGlzIGlzIGEgdGVybWluYWwg
dGhhdCBpbmRpY2F0ZXMgdGhhdCB3ZSB3aWxsIG5ldmVyIGdldCBoZXJlLgorICAgIE9vcHMKK307
CisKK30gfSAvLyBuYW1lc3BhY2UgSlNDOjpCMworCituYW1lc3BhY2UgV1RGIHsKKworY2xhc3Mg
UHJpbnRTdHJlYW07CisKK3ZvaWQgcHJpbnRJbnRlcm5hbChQcmludFN0cmVhbSYsIEpTQzo6QjM6
Ok9wY29kZSk7CisKK30gLy8gbmFtZXNwYWNlIFdURgorCisjZW5kaWYgLy8gQjNPcGNvZGVfaAor
CkluZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNPcmlnaW4uY3BwCj09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0K
LS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM09yaWdpbi5jcHAJKHJldmlzaW9uIDApCisr
KyBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNPcmlnaW4uY3BwCSh3b3JraW5nIGNvcHkpCkBA
IC0wLDAgKzEsMzcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTUgQXBwbGUgSW5jLiBBbGwg
cmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNl
IGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUg
cGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUg
bWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRo
ZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMg
YW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBi
aW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3Rp
Y2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIg
aW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlk
ZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklE
RUQgQlkgQVBQTEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVE
IFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJ
RUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElD
VUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExF
IElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElS
RUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFM
IERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQg
T0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisg
KiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBP
TiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklD
VCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJ
U0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FS
RSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisg
Ki8KKworI2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgIkIzT3JpZ2luLmgiCisKK25hbWVz
cGFjZSBKU0MgeyBuYW1lc3BhY2UgQjMgeworCit2b2lkIE9yaWdpbjo6ZHVtcChQcmludFN0cmVh
bSYgb3V0KSBjb25zdAoreworICAgIG91dC5wcmludCgiT3JpZ2luKCIsIFJhd1BvaW50ZXIobV9k
YXRhKSwgIikiKTsKK30KKworfSB9IC8vIG5hbWVzcGFjZSBKU0M6OkIzCisKSW5kZXg6IFNvdXJj
ZS9KYXZhU2NyaXB0Q29yZS9iMy9CM09yaWdpbi5oCj09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZh
U2NyaXB0Q29yZS9iMy9CM09yaWdpbi5oCShyZXZpc2lvbiAwKQorKysgU291cmNlL0phdmFTY3Jp
cHRDb3JlL2IzL0IzT3JpZ2luLmgJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSw1NSBAQAorLyoK
KyAqIENvcHlyaWdodCAoQykgMjAxNSBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisg
KgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywg
d2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQg
dGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3Ry
aWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAor
ICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBk
aXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVw
cm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNv
bmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3Vt
ZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmli
dXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIGBg
QVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVE
SU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1F
UkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFS
RSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUgorICogQ09OVFJJ
QlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQ
RUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5H
LCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RT
IE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lO
RVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9G
IExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9S
VAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkg
V0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQg
T0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLiAKKyAqLworCisjaWZuZGVmIEIzT3Jp
Z2luX2gKKyNkZWZpbmUgQjNPcmlnaW5faAorCisjaW5jbHVkZSA8d3RmL1ByaW50U3RyZWFtLmg+
CisKK25hbWVzcGFjZSBKU0MgeyBuYW1lc3BhY2UgQjMgeworCisvLyBXaG9ldmVyIGdlbmVyYXRl
cyBCM0lSIGNhbiBjaG9vc2UgdG8gcHV0IG9yaWdpbnMgb24gdmFsdWVzLiBXaGVuIHlvdSBkbyB0
aGlzLCBCMyB3aWxsIGJlIGFibGUgdG8KKy8vIGFjY291bnQsIGRvd24gdG8gdGhlIG1hY2hpbmUg
Y29kZSwgd2hpY2ggaW5zdHJ1Y3Rpb24gY29ycmVzcG9uZHMgdG8gd2hpY2ggb3JpZ2luLiBCMwor
Ly8gdHJhbnNmb3JtYXRpb25zIG11c3QgcHJlc2VydmUgT3JpZ2lucyBjYXJlZnVsbHkuIEl0J3Mg
YW4gZXJyb3IgdG8gd3JpdGUgYSB0cmFuc2Zvcm1hdGlvbiB0aGF0CisvLyBlaXRoZXIgZHJvcHMg
T3JpZ2lucyBvciBsaWVzIGFib3V0IHRoZW0uCitjbGFzcyBPcmlnaW4geworcHVibGljOgorICAg
IGV4cGxpY2l0IE9yaWdpbihjb25zdCB2b2lkKiBkYXRhID0gbnVsbHB0cikKKyAgICAgICAgOiBt
X2RhdGEoZGF0YSkKKyAgICB7CisgICAgfQorCisgICAgY29uc3Qgdm9pZCogZGF0YSgpIGNvbnN0
IHsgcmV0dXJuIG1fZGF0YTsgfQorCisgICAgdm9pZCBkdW1wKFByaW50U3RyZWFtJikgY29uc3Q7
CisgICAgCitwcml2YXRlOgorICAgIGNvbnN0IHZvaWQqIG1fZGF0YTsKK307CisKK30gfSAvLyBu
YW1lc3BhY2UgSlNDOjpCMworCisjZW5kaWYgLy8gQjNPcmlnaW5faAorCkluZGV4OiBTb3VyY2Uv
SmF2YVNjcmlwdENvcmUvYjMvQjNQcm9jZWR1cmUuY3BwCj09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9K
YXZhU2NyaXB0Q29yZS9iMy9CM1Byb2NlZHVyZS5jcHAJKHJldmlzaW9uIDApCisrKyBTb3VyY2Uv
SmF2YVNjcmlwdENvcmUvYjMvQjNQcm9jZWR1cmUuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAg
KzEsNTYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTUgQXBwbGUgSW5jLiBBbGwgcmlnaHRz
IHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBi
aW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0
dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0Ogor
ICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92
ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRo
ZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkg
Zm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRo
aXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhl
CisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0
aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkg
QVBQTEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJB
TlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FS
UkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgor
ICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4g
T1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJ
TkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFH
RVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VC
U1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9G
SVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkg
VEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFC
SUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFS
SVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZF
TiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKwor
I2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgIkIzUHJvY2VkdXJlLmgiCisKKyNpbmNsdWRl
ICJCM0Jhc2ljQmxvY2suaCIKKyNpbmNsdWRlICJCM1ZhbHVlLmgiCisKK25hbWVzcGFjZSBKU0Mg
eyBuYW1lc3BhY2UgQjMgeworCitQcm9jZWR1cmU6OlByb2NlZHVyZSgpCit7Cit9CisKK1Byb2Nl
ZHVyZTo6flByb2NlZHVyZSgpCit7Cit9CisKK0Jhc2ljQmxvY2sqIFByb2NlZHVyZTo6YWRkQmxv
Y2soKQoreworICAgIHN0ZDo6dW5pcXVlX3B0cjxCYXNpY0Jsb2NrPiBibG9jayA9IHN0ZDo6bWFr
ZV91bmlxdWU8QmFzaWNCbG9jaz4obV9ibG9ja3Muc2l6ZSgpKTsKKyAgICBCYXNpY0Jsb2NrKiBy
ZXN1bHQgPSBibG9jay5nZXQoKTsKKyAgICBtX2Jsb2Nrcy5hcHBlbmQoV1RGOjptb3ZlKGJsb2Nr
KSk7CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKwordm9pZCBQcm9jZWR1cmU6OmR1bXAoUHJpbnRT
dHJlYW0mIG91dCkgY29uc3QKK3sKKyAgICBmb3IgKEJhc2ljQmxvY2sqIGJsb2NrIDogKnRoaXMp
CisgICAgICAgIG91dC5wcmludChkZWVwRHVtcChibG9jaykpOworfQorCit9IH0gLy8gbmFtZXNw
YWNlIEpTQzo6QjMKSW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM1Byb2NlZHVyZS5o
Cj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM1Byb2NlZHVyZS5oCShy
ZXZpc2lvbiAwKQorKysgU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzUHJvY2VkdXJlLmgJKHdv
cmtpbmcgY29weSkKQEAgLTAsMCArMSwxNzcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTUg
QXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFu
ZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9k
aWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25k
aXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2Rl
IG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0
IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlz
dHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJp
Z2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93
aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBt
YXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09G
VFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQ
UkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRP
LCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5F
U1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVW
RU5UIFNIQUxMIEFQUExFIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFO
WSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBP
UiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAor
ICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBV
U0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VW
RVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4g
Q09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElH
RU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICog
T0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBT
VUNIIERBTUFHRS4gCisgKi8KKworI2lmbmRlZiBCM1Byb2NlZHVyZV9oCisjZGVmaW5lIEIzUHJv
Y2VkdXJlX2gKKworI2luY2x1ZGUgPHd0Zi9CYWcuaD4KKyNpbmNsdWRlIDx3dGYvRmFzdE1hbGxv
Yy5oPgorI2luY2x1ZGUgPHd0Zi9Ob25jb3B5YWJsZS5oPgorI2luY2x1ZGUgPHd0Zi9WZWN0b3Iu
aD4KKworbmFtZXNwYWNlIEpTQyB7IG5hbWVzcGFjZSBCMyB7CisKK2NsYXNzIEJhc2ljQmxvY2s7
CitjbGFzcyBWYWx1ZTsKKworY2xhc3MgUHJvY2VkdXJlIHsKKyAgICBXVEZfTUFLRV9OT05DT1BZ
QUJMRShQcm9jZWR1cmUpOworICAgIFdURl9NQUtFX0ZBU1RfQUxMT0NBVEVEOworcHVibGljOgor
CisgICAgUHJvY2VkdXJlKCk7CisgICAgflByb2NlZHVyZSgpOworCisgICAgQmFzaWNCbG9jayog
YWRkQmxvY2soKTsKKyAgICAKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBWYWx1ZVR5cGUsIHR5cGVu
YW1lLi4uIEFyZ3VtZW50cz4KKyAgICBWYWx1ZVR5cGUqIGFkZChBcmd1bWVudHMuLi4pOworCisg
ICAgdm9pZCBkdW1wKFByaW50U3RyZWFtJikgY29uc3Q7CisKKyAgICB1bnNpZ25lZCBzaXplKCkg
Y29uc3QgeyByZXR1cm4gbV9ibG9ja3Muc2l6ZSgpOyB9CisgICAgQmFzaWNCbG9jayogYXQodW5z
aWduZWQgaW5kZXgpIGNvbnN0IHsgcmV0dXJuIG1fYmxvY2tzW2luZGV4XTsgfQorICAgIEJhc2lj
QmxvY2sqIG9wZXJhdG9yW10odW5zaWduZWQgaW5kZXgpIGNvbnN0IHsgcmV0dXJuIGF0KGluZGV4
KTsgfQorCisgICAgY2xhc3MgaXRlcmF0b3IgeworICAgIHB1YmxpYzoKKyAgICAgICAgaXRlcmF0
b3IoKToKKyAgICAgICAgICAgIDogbV9wcm9jZWR1cmUobnVsbHB0cikKKyAgICAgICAgICAgICwg
bV9pbmRleCgwKQorICAgICAgICB7CisgICAgICAgIH0KKworICAgICAgICBpdGVyYXRvcihQcm9j
ZWR1cmUmIHByb2NlZHVyZSwgdW5zaWduZWQgaW5kZXgpCisgICAgICAgICAgICA6IG1fcHJvY2Vk
dXJlKCZwcm9jZWR1cmUpCisgICAgICAgICAgICAsIG1faW5kZXgoaW5kZXgpCisgICAgICAgIHsK
KyAgICAgICAgfQorCisgICAgICAgIEJhc2ljQmxvY2sqIG9wZXJhdG9yKigpCisgICAgICAgIHsK
KyAgICAgICAgICAgIHJldHVybiBtX3Byb2NlZHVyZS0+YXQobV9pbmRleCk7CisgICAgICAgIH0K
KworICAgICAgICBpdGVyYXRvciYgb3BlcmF0b3IrKygpCisgICAgICAgIHsKKyAgICAgICAgICAg
IG1faW5kZXggPSBmaW5kTmV4dChtX2luZGV4ICsgMSk7CisgICAgICAgICAgICByZXR1cm4gKnRo
aXM7CisgICAgICAgIH0KKworICAgICAgICBib29sIG9wZXJhdG9yPT0oY29uc3QgaXRlcmF0b3Im
IG90aGVyKSBjb25zdAorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gbV9pbmRleCA9PSBv
dGhlci5tX2luZGV4OworICAgICAgICB9CisKKyAgICAgICAgYm9vbCBvcGVyYXRvciE9KGNvbnN0
IGl0ZXJhdG9yJiBvdGhlcikgY29uc3QKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuICEo
KnRoaXMgPT0gb3RoZXIpOworICAgICAgICB9CisKKyAgICBwcml2YXRlOgorICAgICAgICB1bnNp
Z25lZCBmaW5kTmV4dCh1bnNpZ25lZCBpbmRleCkKKyAgICAgICAgeworICAgICAgICAgICAgd2hp
bGUgKGluZGV4IDwgbV9wcm9jZWR1cmUtPnNpemUoKSAmJiAhbV9wcm9jZWR1cmUtPmF0KGluZGV4
KSkKKyAgICAgICAgICAgICAgICBpbmRleCsrOworICAgICAgICAgICAgcmV0dXJuIGluZXg7Cisg
ICAgICAgIH0KKworICAgICAgICBQcm9jZWR1cmUqIG1fcHJvY2VkdXJlOworICAgICAgICB1bnNp
Z25lZCBtX2luZGV4OworICAgIH07CisKKyAgICBpdGVyYXRvciBiZWdpbigpIGNvbnN0IHsgcmV0
dXJuIGl0ZXJhdG9yKCp0aGlzLCAwKTsgfQorICAgIGl0ZXJhdG9yIGVuZCgpIGNvbnN0IHsgcmV0
dXJuIGl0ZXJhdG9yKCp0aGlzLCBudW1CbG9ja3MoKSk7IH0KKworICAgIGNsYXNzIFZhbHVlc0Nv
bGxlY3Rpb24geworICAgIHB1YmxpYzoKKyAgICAgICAgVmFsdWVzQ29sbGVjdGlvbihQcm9jZWR1
cmUmIHByb2NlZHVyZSkKKyAgICAgICAgICAgIDogbV9wcm9jZWR1cmUocHJvY2VkdXJlKQorICAg
ICAgICB7CisgICAgICAgIH0KKworICAgICAgICBjbGFzcyBpdGVyYXRvciB7CisgICAgICAgIHB1
YmxpYzoKKyAgICAgICAgICAgIGl0ZXJhdG9yKCk6CisgICAgICAgICAgICAgICAgOiBtX3Byb2Nl
ZHVyZShudWxscHRyKQorICAgICAgICAgICAgICAgICwgbV9pbmRleCgwKQorICAgICAgICAgICAg
eworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpdGVyYXRvcihQcm9jZWR1cmUmIHByb2Nl
ZHVyZSwgdW5zaWduZWQgaW5kZXgpCisgICAgICAgICAgICAgICAgOiBtX3Byb2NlZHVyZSgmcHJv
Y2VkdXJlKQorICAgICAgICAgICAgICAgICwgbV9pbmRleChpbmRleCkKKyAgICAgICAgICAgIHsK
KyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgVmFsdWUqIG9wZXJhdG9yKigpCisgICAgICAg
ICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG1fcHJvY2VkdXJlLT5ibG9jayhtX2luZGV4
KTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaXRlcmF0b3ImIG9wZXJhdG9yKysoKQor
ICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1faW5kZXgrKzsKKyAgICAgICAgICAgICAg
ICByZXR1cm4gKnRoaXM7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGJvb2wgb3BlcmF0
b3I9PShjb25zdCBpdGVyYXRvciYgb3RoZXIpIGNvbnN0CisgICAgICAgICAgICB7CisgICAgICAg
ICAgICAgICAgcmV0dXJuIG1faW5kZXggPT0gb3RoZXIubV9pbmRleDsKKyAgICAgICAgICAgIH0K
KworICAgICAgICAgICAgYm9vbCBvcGVyYXRvciE9KGNvbnN0IGl0ZXJhdG9yJiBvdGhlcikgY29u
c3QKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gISgqdGhpcyA9PSBvdGhl
cik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZToKKworICAgICAgICAgICAgUHJv
Y2VkdXJlKiBtX3Byb2NlZHVyZTsKKyAgICAgICAgICAgIHVuc2lnbmVkIG1faW5kZXg7CisgICAg
ICAgIH07CisKKyAgICAgICAgaXRlcmF0b3IgYmVnaW4oKSBjb25zdCB7IHJldHVybiBpdGVyYXRv
cihtX3Byb2NlZHVyZSwgMCk7IH0KKyAgICAgICAgaXRlcmF0b3IgZW5kKCkgY29uc3QgeyByZXR1
cm4gaXRlcmF0b3IobV9wcm9jZWR1cmUsIG1fcHJvY2VkdXJlLm1fdmFsdWVzLnNpemUoKSk7IH0K
KworICAgICAgICB1bnNpZ25lZCBzaXplKCkgY29uc3QgeyByZXR1cm4gbV9wcm9jZWR1cmUubV92
YWx1ZXMuc2l6ZSgpOyB9CisgICAgICAgIFZhbHVlKiBhdCh1bnNpZ25lZCBpbmRleCkgY29uc3Qg
eyByZXR1cm4gbV9wcm9jZWR1cmUubV92YWx1ZXNbaW5kZXhdOyB9CisgICAgICAgIFZhbHVlKiBv
cGVyYXRvcltdKHVuc2lnbmVkIGluZGV4KSBjb25zdCB7IHJldHVybiBhdChpbmRleCk7IH0KKyAg
ICAgICAgCisgICAgcHJpdmF0ZToKKyAgICAgICAgUHJvY2VkdXJlJiBtX3Byb2NlZHVyZTsKKyAg
ICB9OworCisgICAgVmFsdWVzQ29sbGVjdGlvbiB2YWx1ZXMoKSB7IHJldHVybiBWYWx1ZXNDb2xs
ZWN0aW9uKCp0aGlzKTsgfQorCitwcml2YXRlOgorICAgIFZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8
QmFzaWNCbG9jaz4+IG1fYmxvY2tzOworICAgIFZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8VmFsdWU+
PiBtX3ZhbHVlczsKK307CisKK30gfSAvLyBuYW1lc3BhY2UgSlNDOjpCMworCisjZW5kaWYgLy8g
QjNQcm9jZWR1cmVfaAorCkluZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNQcm9jZWR1
cmVJbmxpbmVzLmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzUHJv
Y2VkdXJlSW5saW5lcy5oCShyZXZpc2lvbiAwKQorKysgU291cmNlL0phdmFTY3JpcHRDb3JlL2Iz
L0IzUHJvY2VkdXJlSW5saW5lcy5oCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsNDcgQEAKKy8q
CisgKiBDb3B5cmlnaHQgKEMpIDIwMTUgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgor
ICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMs
IHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVk
IHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0
cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQK
KyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcg
ZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJl
cHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBj
b25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1
bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJp
YnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBg
YEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xV
RElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBN
RVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBB
UkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IKKyAqIENPTlRS
SUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBT
UEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElO
RywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09E
UyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJ
TkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBP
RiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRP
UlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5Z
IFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VE
IE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKworI2lmbmRlZiBCM1By
b2NlZHVyZUlubGluZXNfaAorI2RlZmluZSBCM1Byb2NlZHVyZUlubGluZXNfaAorCisjaW5jbHVk
ZSAiQjNCYXNpY0Jsb2NrLmgiCisjaW5jbHVkZSAiQjNQcm9jZWR1cmUuaCIKKworbmFtZXNwYWNl
IEpTQyB7IG5hbWVzcGFjZSBCMyB7CisKK3RlbXBsYXRlPHR5cGVuYW1lIFZhbHVlVHlwZSwgdHlw
ZW5hbWUuLi4gQXJndW1lbnRzPgorVmFsdWVUeXBlKiBQcm9jZWR1cmU6OmFkZChBcmd1ZW50cy4u
LiBhcmd1bWVudHMpCit7CisgICAgc3RkOjp1bmlxdWVfcHRyPFZhbHVlVHlwZT4gdmFsdWUgPQor
ICAgICAgICBzdGQ6Om1ha2VfdW5pcXVlPFZhbHVlVHlwZT4obV92YWx1ZXMuc2l6ZSgpLCBhcmd1
bWVudHMuLi4pOworICAgIFZhbHVlVHlwZSogcmVzdWx0ID0gdmFsdWUuZ2V0KCk7CisgICAgbV92
YWx1ZXMuYXBwZW5kKFdURjo6bW92ZSh2YWx1ZSkpOworICAgIHJldHVybiByZXN1bHQ7Cit9CisK
K30gfSAvLyBuYW1lc3BhY2UgSlNDOjpCMworCisjZW5kaWYgLy8gQjNQcm9jZWR1cmVJbmxpbmVz
X2gKKwpJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzU3RhY2tTbG90VmFsdWUuY3Bw
Cj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM1N0YWNrU2xvdFZhbHVl
LmNwcAkocmV2aXNpb24gMCkKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM1N0YWNrU2xv
dFZhbHVlLmNwcAkod29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDQxIEBACisvKgorICogQ29weXJp
Z2h0IChDKSAyMDE1IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRp
c3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdp
dGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBm
b2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBv
ZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3Rp
Y2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIu
CisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhl
IGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBh
bmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBh
bmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAq
CisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFO
RCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBO
T1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklM
SVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlN
RUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUg
TElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAq
IEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1Qg
TElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklD
RVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJS
VVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZ
LCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5D
TFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9G
IFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9T
U0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisKKyNpbmNsdWRlICJjb25maWcuaCIKKyNp
bmNsdWRlICJCM1N0YWNrU2xvdFZhbHVlLmgiCisKK25hbWVzcGFjZSBKU0MgeyBuYW1lc3BhY2Ug
QjMgeworCitTdGFja1Nsb3RWYWx1ZTo6flN0YWNrU2xvdFZhbHVlKCkKK3sKK30KKwordm9pZCBT
dGFja1Nsb3RWYWx1ZTo6ZHVtcE1ldGEoUHJpbnRTdHJlYW0mIG91dCkgY29uc3QKK3sKKyAgICBv
dXQucHJpbnQoImJ5dGVTaXplID0gIiwgbV9ieXRlU2l6ZSk7Cit9CisKK30gfSAvLyBuYW1lc3Bh
Y2UgSlNDOjpCMworCkluZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNTdGFja1Nsb3RW
YWx1ZS5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM1N0YWNrU2xv
dFZhbHVlLmgJKHJldmlzaW9uIDApCisrKyBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNTdGFj
a1Nsb3RWYWx1ZS5oCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsNTcgQEAKKy8qCisgKiBDb3B5
cmlnaHQgKEMpIDIwMTUgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJl
ZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Ig
d2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhl
IGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25z
IG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5v
dGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1l
ci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0
aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25z
IGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9u
IGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgor
ICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFTIElTJycg
QU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVU
IE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFC
SUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xB
SU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBC
RSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAor
ICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5P
VCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJW
SUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRF
UlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJ
VFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJ
TkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQg
T0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQ
T1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKworI2lmbmRlZiBCM1N0YWNrU2xvdFZh
bHVlX2gKKyNkZWZpbmUgQjNTdGFja1Nsb3RWYWx1ZV9oCisKKyNpbmNsdWRlICJCM1ZhbHVlLmgi
CisKK25hbWVzcGFjZSBKU0MgeyBuYW1lc3BhY2UgQjMgeworCitjbGFzcyBTdGFja1Nsb3RWYWx1
ZSA6IHB1YmxpYyBWYWx1ZSB7CitwdWJsaWM6CisgICAgflN0YWNrU2xvdFZhbHVlKCk7CisKKyAg
ICB1bnNpZ25lZCBieXRlU2l6ZSgpIGNvbnN0IHsgcmV0dXJuIG1fYnl0ZVNpemU7IH0KKworcHJv
dGVjdGVkOgorICAgIHZvaWQgZHVtcE1ldGEoUHJpbnRTdHJlYW0mKSBjb25zdCBvdmVycmlkZTsK
KworcHJpdmF0ZToKKyAgICBmcmllbmQgY2xhc3MgUHJvY2VkdXJlOworCisgICAgU3RhY2tTbG90
VmFsdWUodW5zaWduZWQgaW5kZXgsIE9yaWdpbiBvcmlnaW4sIHVuc2lnbmVkIGJ5dGVTaXplKQor
ICAgICAgICA6IFZhbHVlKGluZGV4LCBTdGFja1Nsb3QsIHBvaW50ZXIoKSwgb3JpZ2luKQorICAg
ICAgICAsIG1fYnl0ZVNpemUoYnl0ZVNpemUpCisgICAgeworICAgIH0KKworICAgIHVuc2lnbmVk
IG1fYnl0ZVNpemU7Cit9OworCit9IH0gLy8gbmFtZXNwYWNlIEpTQzo6QjMKKworI2VuZGlmIC8v
IEIzU3RhY2tTbG90VmFsdWVfaAorCkluZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNU
eXBlLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNUeXBlLmNw
cAkocmV2aXNpb24gMCkKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM1R5cGUuY3BwCSh3
b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsNTQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTUg
QXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFu
ZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9k
aWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25k
aXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2Rl
IG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0
IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlz
dHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJp
Z2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93
aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBt
YXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09G
VFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQ
UkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRP
LCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5F
U1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVW
RU5UIFNIQUxMIEFQUExFIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFO
WSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBP
UiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAor
ICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBV
U0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VW
RVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4g
Q09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElH
RU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICog
T0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBT
VUNIIERBTUFHRS4gCisgKi8KKworI2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgIkIzVHlw
ZS5oIgorCisjaW5jbHVkZSA8d3RmL1ByaW50U3RyZWFtLmg+CisKK25hbWVzcGFjZSBXVEYgewor
Cit1c2luZyBuYW1lc3BhY2UgSlNDOjpCMzsKKwordm9pZCBwcmludEludGVybmFsKFByaW50U3Ry
ZWFtJiBvdXQsIFR5cGUgdHlwZSkKK3sKKyAgICBzd2l0Y2ggKHR5cGUpIHsKKyAgICBjYXNlIFZv
aWQ6CisgICAgICAgIG91dC5wcmludCgiVm9pZCIpOworICAgICAgICByZXR1cm47CisgICAgY2Fz
ZSBJbnQzMjoKKyAgICAgICAgb3V0LnByaW50KCJJbnQzMiIpOworICAgICAgICByZXR1cm47Cisg
ICAgY2FzZSBJbnQ2NDoKKyAgICAgICAgb3V0LnByaW50KCJJbnQ2NCIpOworICAgICAgICByZXR1
cm47CisgICAgY2FzZSBEb3VibGU6CisgICAgICAgIG91dC5wcmludCgiRG91YmxlIik7CisgICAg
ICAgIHJldHVybjsKKyAgICB9CisgICAgUkVMRUFTRV9BU1NFUlRfTk9UX1JFQUNIRUQoKTsKK30K
KworfSAvLyBuYW1lc3BhY2UgV1RGCkluZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNU
eXBlLmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzVHlwZS5oCShy
ZXZpc2lvbiAwKQorKysgU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzVHlwZS5oCSh3b3JraW5n
IGNvcHkpCkBAIC0wLDAgKzEsNTggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTUgQXBwbGUg
SW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2Ug
aW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0
aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25z
CisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3Qg
cmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNv
bmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0
aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Cisg
KiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRp
c2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlh
bHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUg
SVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBP
UiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUK
KyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9S
IEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNI
QUxMIEFQUExFIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJF
Q1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05T
RVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJP
Q1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERB
VEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FV
U0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJB
Q1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBP
UiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJ
UyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERB
TUFHRS4gCisgKi8KKworI2lmbmRlZiBCM1R5cGVfaAorI2RlZmluZSBCM1R5cGVfaAorCisjaW5j
bHVkZSA8d3RmL1N0ZExpYkV4dHJhcy5oPgorCituYW1lc3BhY2UgSlNDIHsgbmFtZXNwYWNlIEIz
IHsKKworZW51bSBUeXBlIHsKKyAgICBWb2lkLAorICAgIEludDMyLAorICAgIEludDY0LAorICAg
IERvdWJsZQorfTsKKworVHlwZSBwb2ludGVyKCkgY29uc3QKK3sKKyAgICBpZiAoc2l6ZW9mKHZv
aWQqKSA9PSA0KQorICAgICAgICByZXR1cm4gSW50MzI7CisgICAgcmV0dXJuIEludDY0OworfQor
Cit9IH0gLy8gbmFtZXNwYWNlIEpTQzo6QjMKKworbmFtZXNwYWNlIFdURiB7CisKK2NsYXNzIFBy
aW50U3RyZWFtOworCit2b2lkIHByaW50SW50ZXJuYWwoUHJpbnRTdHJlYW0mLCBKU0M6OkIzOjpU
eXBlKTsKKworfSAvLyBuYW1lc3BhY2UgV1RGCisKKyNlbmRpZiAvLyBCM1R5cGVfaAorCkluZGV4
OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNWYWx1ZS5jcHAKPT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291
cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzVmFsdWUuY3BwCShyZXZpc2lvbiAwKQorKysgU291cmNl
L0phdmFTY3JpcHRDb3JlL2IzL0IzVmFsdWUuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEs
MTc5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE1IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyBy
ZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmlu
YXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRl
ZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAq
IDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUg
Y29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUg
Zm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZv
cm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlz
IGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQor
ICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGgg
dGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQ
UExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5U
SUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJB
TlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAq
IFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9S
CisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5D
SURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VT
IChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNU
SVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklU
UzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRI
RU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklM
SVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklT
SU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4g
SUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisKKyNp
bmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJCM1ZhbHVlLmgiCisKK25hbWVzcGFjZSBKU0Mg
eyBuYW1lc3BhY2UgQjMgeworCitWYWx1ZTo6flZhbHVlKCkKK3sKK30KKwordm9pZCBWYWx1ZTo6
cmVwbGFjZVdpdGhJZGVudGl0eShWYWx1ZSogdmFsdWUpCit7CisgICAgLy8gVGhpcyBpcyBhIGJp
dCBjcmF6eS4gSXQgZG9lcyBhbiBpbi1wbGFjZSByZXBsYWNlbWVudCBvZiB3aGF0ZXZlciBWYWx1
ZSBzdWJjbGFzcyB0aGlzIGlzIHdpdGgKKyAgICAvLyBhIHBsYWluIElkZW50aXR5IFZhbHVlLiBX
ZSBmaXJzdCBjb2xsZWN0IGFsbCBvZiB0aGUgaW5mb3JtYXRpb24gd2UgbmVlZCwgdGhlbiB3ZSBk
ZXN0cnVjdCB0aGUKKyAgICAvLyBwcmV2aW91cyB2YWx1ZSBpbiBwbGFjZSwgYW5kIHRoZW4gd2Ug
Y29uc3RydWN0IHRoZSBJZGVudGl0eSBWYWx1ZSBpbiBwbGFjZS4KKworICAgIHVuc2lnbmVkIGlu
ZGV4ID0gbV9pbmRleDsKKyAgICBUeXBlIHR5cGUgPSBtX3R5cGU7CisgICAgT3JpZ2luIG9yaWdp
biA9IG1fb3JpZ2luOworICAgIEJhc2ljQmxvY2sqIG93bmVyID0gdGhpcy0+b3duZXI7CisgICAg
VmFsdWUqIHJlcGxhY2VtZW50ID0gdGhpcy0+cmVwbGFjZW1lbnQ7CisgICAgdm9pZCogbWlzYyA9
IHRoaXMtPm1pc2M7CisKKyAgICBSRUxFQVNFX0FTU0VSVCh0eXBlID09IHZhbHVlLT50eXBlKCkp
OworCisgICAgdGhpcy0+VmFsdWU6On5WYWx1ZSgpOworCisgICAgbmV3ICh0aGlzKSAoaW5kZXgs
IElkZW50aWZ5LCB0eXBlLCBvcmlnaW4sIHZhbHVlKTsKKworICAgIHRoaXMtPm93bmVyID0gb3du
ZXI7CisgICAgdGhpcy0+cmVwbGFjZW1lbnQgPSByZXBsYWNlbWVudDsKKyAgICB0aGlzLT5taXNj
ID0gbWlzYzsKK30KKwordm9pZCBWYWx1ZTo6ZHVtcChQcmludFN0cmVhbSYgb3V0KSBjb25zdAor
eworICAgIG91dC5wcmludChkdW1wUHJlZml4LCBtX2luZGV4KTsKK30KKwordm9pZCBWYWx1ZTo6
ZGVlcER1bXAoUHJpbnRTdHJlYW0mIG91dCkgY29uc3QKK3sKKyAgICBvdXQucHJpbnQobV90eXBl
LCAiICIsICp0aGlzLCAiID0gIiwgbV9vcGNvZGUpOworCisgICAgU3RyaW5nUHJpbnRTdHJlYW0g
c3RyaW5nT3V0OworICAgIGR1bXBNZXRhKHN0cmluZ091dCk7CisgICAgQ1N0cmluZyBzdHJpbmcg
PSBzdHJpbmdPdXQudG9DU3RyaW5nKCk7CisgICAgaWYgKHN0cmluZy5sZW5ndGgoKSkKKyAgICAg
ICAgb3V0LnByaW50KCI8Iiwgc3RyaW5nLCAiPiIpOworCisgICAgb3V0LnByaW50KCIoIik7Cisg
ICAgQ29tbWFQcmludGVyIGNvbW1hOworICAgIGZvciAoVmFsdWUqIGNoaWxkIDogY2hpbGRyZW4o
KSkKKyAgICAgICAgb3V0LnByaW50KGNvbW1hLCBwb2ludGVyRHVtcChjaGlsZCkpOworICAgIG91
dC5wcmludCgiKSIpOworfQorCitib29sIFZhbHVlOjpoYXNJbnQzMigpIGNvbnN0Cit7CisgICAg
cmV0dXJuIGZhbHNlOworfQorCitpbnQzMl90IFZhbHVlOjphc0ludDMyKCkgY29uc3QKK3sKKyAg
ICBSRUxFQVNFX0FTU0VSVF9OT1RfUkVBQ0hFRCgpOworICAgIHJldHVybiAwOworfQorCitib29s
IFZhbHVlOjpoYXNJbnQ2NCgpIGNvbnN0Cit7CisgICAgcmV0dXJuIGZhbHNlOworfQorCitpbnQ2
NF90IFZhbHVlOjphc0ludDY0KCkgY29uc3QKK3sKKyAgICBSRUxFQVNFX0FTU0VSVF9OT1RfUkVB
Q0hFRCgpOworICAgIHJldHVybiAwOworfQorCitib29sIFZhbHVlOjpoYXNEb3VibGUoKSBjb25z
dAoreworICAgIHJldHVybiBmYWxzZTsKK30KKworZG91YmxlIFZhbHVlOjphc0RvdWJsZSgpIGNv
bnN0Cit7CisgICAgUkVMRUFTRV9BU1NFUlRfTk9UX1JFQUNIRUQoKTsKKyAgICByZXR1cm4gMDsK
K30KKwordm9pZCBWYWx1ZTo6ZHVtcE1ldGEoUHJpbnRTdHJlYW0mKSBjb25zdAoreworfQorCitU
eXBlIFZhbHVlOjp0eXBlRm9yKE9wY29kZSBvcGNvZGUsIFZhbHVlKiBmaXJzdENoaWxkKQorewor
ICAgIHN3aXRjaCAob3Bjb2RlKSB7CisgICAgY2FzZSBJZGVudGl0eToKKyAgICBjYXNlIEFkZDoK
KyAgICBjYXNlIFN1YjoKKyAgICBjYXNlIE11bDoKKyAgICBjYXNlIERpdjoKKyAgICBjYXNlIENo
aWxsRGl2OgorICAgIGNhc2UgTW9kOgorICAgIGNhc2UgQml0QW5kOgorICAgIGNhc2UgQml0T3I6
CisgICAgY2FzZSBCaXRYb3I6CisgICAgY2FzZSBTaGw6CisgICAgY2FzZSBTU2hyOgorICAgIGNh
c2UgWlNocjoKKyAgICBjYXNlIENoZWNrQWRkOgorICAgIGNhc2UgQ2hlY2tTdWI6CisgICAgY2Fz
ZSBDaGVja011bDoKKyAgICAgICAgcmV0dXJuIGZpcnN0Q2hpbGQtPnR5cGUoKTsKKyAgICBjYXNl
IEZyYW1lUG9pbnRlcjoKKyAgICAgICAgcmV0dXJuIHBvaW50ZXIoKTsKKyAgICBjYXNlIFNFeHQ4
OgorICAgIGNhc2UgU0V4dDE2OgorICAgIGNhc2UgRFRvSTMyOgorICAgIGNhc2UgRXF1YWw6Cisg
ICAgY2FzZSBOb3RFcXVhbDoKKyAgICBjYXNlIExlc3NUaGFuOgorICAgIGNhc2UgR3JlYXRlclRo
YW46CisgICAgY2FzZSBMZXNzRXF1YWw6CisgICAgY2FzZSBHcmVhdGVyRXF1YWw6CisgICAgY2Fz
ZSBBYm92ZToKKyAgICBjYXNlIEJlbG93OgorICAgIGNhc2UgQWJvdmVFcXVhbDoKKyAgICBjYXNl
IEJlbG93RXF1YWw6CisgICAgY2FzZSBMb2FkOFo6CisgICAgY2FzZSBMb2FkOFM6CisgICAgY2Fz
ZSBMb2FkMTZaOgorICAgIGNhc2UgTG9hZDE2UzoKKyAgICAgICAgcmV0dXJuIEludDMyOworICAg
IGNhc2UgU0V4dDMyOgorICAgIGNhc2UgWkV4dDMyOgorICAgICAgICByZXR1cm4gSW50NjQ7Cisg
ICAgY2FzZSBGUm91bmQ6CisgICAgY2FzZSBJVG9EOgorICAgIGNhc2UgTG9hZEZsb2F0OgorICAg
ICAgICByZXR1cm4gRG91YmxlOworICAgIGNhc2UgU3RvcmU4OgorICAgIGNhc2UgU3RvcmUxNjoK
KyAgICBjYXNlIFN0b3JlRmxvYXQ6CisgICAgY2FzZSBTdG9yZToKKyAgICBjYXNlIFVwc2lsb246
CisgICAgY2FzZSBSZXR1cm46CisgICAgY2FzZSBPb3BzOgorICAgICAgICByZXR1cm4gVm9pZDsK
KyAgICBkZWZhdWx0OgorICAgICAgICBSRUxFQVNFX0FTU0VSVF9OT1RfUkVBQ0hFRCgpOworICAg
IH0KK30KKworfSB9IC8vIG5hbWVzcGFjZSBKU0M6OkIzCisKSW5kZXg6IFNvdXJjZS9KYXZhU2Ny
aXB0Q29yZS9iMy9CM1ZhbHVlLmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRDb3Jl
L2IzL0IzVmFsdWUuaAkocmV2aXNpb24gMCkKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9C
M1ZhbHVlLmgJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSwxNTQgQEAKKy8qCisgKiBDb3B5cmln
aHQgKEMpIDIwMTUgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlz
dHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0
aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZv
bGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9m
IHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGlj
ZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4K
KyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUg
YWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFu
ZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFu
ZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoK
KyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFTIElTJycgQU5E
IEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5P
VCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJ
VFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1F
RC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBM
SUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICog
RVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBM
SU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNF
UzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJV
UFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFks
IFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNM
VURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0Yg
VEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NT
SUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKworI2lmbmRlZiBCM1ZhbHVlX2gKKyNkZWZp
bmUgQjNWYWx1ZV9oCisKKyNpbmNsdWRlICJCM09yaWdpbi5oIgorI2luY2x1ZGUgIkIzVHlwZS5o
IgorI2luY2x1ZGUgPHd0Zi9GYXN0TWFsbG9jLmg+CisjaW5jbHVkZSA8d3RmL05vbmNvcHlhYmxl
Lmg+CisKK25hbWVzcGFjZSBKU0MgeyBuYW1lc3BhY2UgQjMgeworCitjbGFzcyBWYWx1ZSB7Cisg
ICAgV1RGX01BS0VfTk9OQ09QWUFCTEUoVmFsdWUpOworICAgIFdURl9NQUtFX0ZBU1RfQUxMT0NB
VEVEOworcHVibGljOgorICAgIHR5cGVkZWYgVmVjdG9yPFZhbHVlKiwgMz4gQWRqYWNlbmN5TGlz
dDsKKworICAgIHN0YXRpYyBjb25zdCBjaGFyKiBkdW1wUHJlZml4ID0gIkAiOworCisgICAgdmly
dHVhbCB+VmFsdWUoKTsKKworICAgIHVuc2lnbmVkIGluZGV4KCkgY29uc3QgeyByZXR1cm4gbV9p
bmRleDsgfQorICAgIAorICAgIC8vIE5vdGUgdGhhdCB0aGUgb3Bjb2RlIGlzIGltbXV0YWJsZSwg
ZXhjZXB0IGZvciByZXBsYWNpbmcgdmFsdWVzIHdpdGggaWRlbnRpdHkuCisgICAgT3Bjb2RlIG9w
Y29kZSgpIGNvbnN0IHsgcmV0dXJuIG1fb3Bjb2RlOyB9CisKKyAgICBPcmlnaW4gb3JpZ2luKCkg
Y29uc3QgeyByZXR1cm4gbV9vcmlnaW47IH0KKyAgICAKKyAgICBWYWx1ZSomIGNoaWxkKHVuc2ln
bmVkIGluZGV4KSB7IHJldHVybiBtX2NoaWxkcmVuW2luZGV4XTsgfQorICAgIFZhbHVlKiBjaGls
ZCh1bnNpZ25lZCBpbmRleCkgY29uc3QgeyByZXR1cm4gbV9jaGlsZHJlbltpbmRleF07IH0KKwor
ICAgIC8vIFRoaXMgY29tcHV0ZXMgdGhlIHR5cGUgdXNpbmcgdGhlIG9wY29kZS4KKyAgICBUeXBl
IHR5cGUoKSBjb25zdCB7IHJldHVybiBtX3R5cGU7IH0KKworICAgIEFkamFjZW5jeUxpc3QmIGNo
aWxkcmVuKCkgeyByZXR1cm4gbV9jaGlsZHJlbjsgfSAKKyAgICBjb25zdCBBZGphY2VuY3lMaXN0
JiBjaGlsZHJlbigpIGNvbnN0IHsgcmV0dXJuIG1fY2hpbGRyZW47IH0KKworICAgIHZvaWQgcmVw
bGFjZVdpdGhJZGVudGl0eShWYWx1ZSopOworCisgICAgdm9pZCBkdW1wKFByaW50U3RyZWFtJikg
Y29uc3Q7CisgICAgdm9pZCBkZWVwRHVtcChQcmludFN0cmVhbSYpIGNvbnN0OworCisgICAgdmly
dHVhbCBib29sIGhhc0ludDMyKCkgY29uc3Q7CisgICAgdmlydHVhbCBpbnQzMl90IGFzSW50MzIo
KSBjb25zdDsKKyAgICAKKyAgICB2aXJ0dWFsIGJvb2wgaGFzSW50NjQoKSBjb25zdDsKKyAgICB2
aXJ0dWFsIGludDY0X3QgYXNJbnQ2NCgpIGNvbnN0OworCisgICAgdmlydHVhbCBib29sIGhhc0Rv
dWJsZSgpIGNvbnN0OworICAgIHZpcnR1YWwgZG91YmxlIGFzRG91YmxlKCkgY29uc3Q7CisKK3By
b3RlY3RlZDoKKyAgICB2aXJ0dWFsIHZvaWQgZHVtcE1ldGEoUHJpbnRTdHJlYW0mKSBjb25zdDsK
KyAgICAKK3ByaXZhdGU6CisgICAgZnJpZW5kIGNsYXNzIFByb2NlZHVyZTsKKyAgICAKKyAgICAv
LyBJbnN0YW50aWF0ZSB2YWx1ZXMgdmlhIFByb2NlZHVyZS4KKyAgICAvLyBUaGlzIGZvcm0gcmVx
dWlyZXMgc3BlY2lmeWluZyB0aGUgdHlwZSBleHBsaWNpdGx5OgorICAgIHRlbXBsYXRlPHR5cGVu
YW1lLi4uIEFyZ3VtZW50cz4KKyAgICBleHBsaWNpdCBWYWx1ZSh1bnNpZ25lZCBpbmRleCwgT3Bj
b2RlIG9wY29kZSwgVHlwZSB0eXBlLCBPcmlnaW4gb3JpZ2luLCBBcmd1bWVudHMuLi4gYXJndW1l
bnRzKQorICAgICAgICA6IG1faW5kZXgoaW5kZXgpCisgICAgICAgICwgbV9vcGNvZGUob3Bjb2Rl
KQorICAgICAgICAsIG1fdHlwZSh0eXBlKQorICAgICAgICAsIG1fb3JpZ2luKG9yaWdpbikKKyAg
ICAgICAgLCBtX2NoaWxkcmVueyBhcmd1bWVudHMuLi4gfQorICAgIHsKKyAgICB9CisgICAgLy8g
VGhpcyBmb3JtIGlzIGZvciB0aG9zZSBvcGNvZGVzIHRoYXQgY2FuIGluZmVyIHRoZWlyIHR5cGUg
ZnJvbSB0aGUgb3Bjb2RlIGFuZCBmaXJzdCBjaGlsZDoKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZS4u
LiBBcmd1bWVudHM+CisgICAgZXhwbGljaXQgVmFsdWUodW5zaWduZWQgaW5kZXgsIE9wY29kZSBv
cGNvZGUsIE9yaWdpbiBvcmlnaW4sIFZhbHVlKiBmaXJzdENoaWxkLCBBcmd1bWVudHMuLi4gYXJn
dW1lbnRzKQorICAgICAgICA6IG1faW5kZXgoaW5kZXgpCisgICAgICAgICwgbV9vcGNvZGUob3Bj
b2RlKQorICAgICAgICAsIG1fdHlwZSh0eXBlRm9yKG9wY29kZSwgZmlyc3RDaGlsZCkpCisgICAg
ICAgICwgbV9vcmlnaW4ob3JpZ2luKQorICAgICAgICAsIG1fY2hpbGRyZW57IGZpcnN0Q2hpbGQs
IGFyZ3VtZW50cy4uLiB9CisgICAgeworICAgIH0KKyAgICAvLyBUaGlzIGZvcm0gaXMgZm9yIHRo
b3NlIG9wY29kZXMgdGhhdCBjYW4gaW5mZXIgdGhlaXIgdHlwZSBmcm9tIHRoZSBvcGNvZGUgYWxv
bmUsIGFuZCB0aGF0IGRvbid0CisgICAgLy8gdGFrZSBhbnkgYXJndW1lbnRzOgorICAgIGV4cGxp
Y2l0IFZhbHVlKHVuc2lnbmVkIGluZGV4LCBPcGNvZGUgb3Bjb2RlLCBPcmlnaW4gb3JpZ2luKQor
ICAgICAgICA6IG1faW5kZXgoaW5kZXgpCisgICAgICAgICwgbV9vcGNvZGUob3Bjb2RlKQorICAg
ICAgICAsIG1fdHlwZSh0eXBlRm9yKG9wY29kZSwgbnVsbHB0cikpCisgICAgICAgICwgbV9vcmln
aW4ob3JpZ2luKQorICAgIHsKKyAgICB9CisKKyAgICBzdGF0aWMgVHlwZSB0eXBlRm9yKE9wY29k
ZSwgVmFsdWUqIGZpcnN0Q2hpbGQpOworCisgICAgdW5zaWduZWQgbV9pbmRleDsKKyAgICBPcGNv
ZGUgbV9vcGNvZGU7CisgICAgVHlwZSBtX3R5cGU7CisgICAgT3JpZ2luIG1fb3JpZ2luOworICAg
IEFkamFjZW5jeUxpc3QgbV9jaGlsZHJlbjsKKworcHVibGljOgorICAgIEJhc2ljQmxvY2sqIG93
bmVyIHsgbnVsbHB0ciB9OyAvLyBjb21wdXRlZCBsYXppbHkuCisgICAgVmFsdWUqIHJlcGxhY2Vt
ZW50IHsgbnVsbHB0ciB9OyAvLyB1c2VkIGZvciBhbmFseXNlcyBhbmQgdHJhbnNmb3JtYXRpb25z
LgorICAgIHZvaWQqIG1pc2MgeyBudWxscHRyIH07Cit9OworCitjbGFzcyBEZWVwVmFsdWVEdW1w
IHsKK3B1YmxpYzoKKyAgICBEZWVwVmFsdWVEdW1wKFZhbHVlKiB2YWx1ZSkKKyAgICAgICAgOiBt
X3ZhbHVlKHZhbHVlKQorICAgIHsKKyAgICB9CisKKyAgICB2b2lkIGR1bXAoUHJpbnRTdHJlYW0m
IG91dCkgY29uc3QKKyAgICB7CisgICAgICAgIGlmIChtX3ZhbHVlKQorICAgICAgICAgICAgbV92
YWx1ZS0+ZGVlcER1bXAob3V0KTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgb3V0LnByaW50
KCI8bnVsbD4iKTsKKyAgICB9CisKK3ByaXZhdGU6CisgICAgVmFsdWUqIG1fdmFsdWU7Cit9Owor
CitEZWVwVmFsdWVEdW1wIGRlZXBEdW1wKFZhbHVlKiB2YWx1ZSkKK3sKKyAgICByZXR1cm4gRGVl
cFZhbHVlRHVtcCh2YWx1ZSk7Cit9CisKK30gfSAvLyBuYW1lc3BhY2UgSlNDOjpCMworCisjZW5k
aWYgLy8gQjNWYWx1ZV9oCisK
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>263425</attachid>
            <date>2015-10-18 12:28:46 -0700</date>
            <delta_ts>2015-10-18 13:40:23 -0700</delta_ts>
            <desc>it has stackmaps and patchpoints, sort of</desc>
            <filename>blah.patch</filename>
            <type>text/plain</type>
            <size>96561</size>
            <attacher name="Filip Pizlo">fpizlo</attacher>
            
              <data encoding="base64">SW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM0FyZ3VtZW50UmVnVmFsdWUuY3BwCj09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM0FyZ3VtZW50UmVnVmFsdWUu
Y3BwCShyZXZpc2lvbiAwKQorKysgU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzQXJndW1lbnRS
ZWdWYWx1ZS5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSw0MSBAQAorLyoKKyAqIENvcHly
aWdodCAoQykgMjAxNSBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVk
aXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3
aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUg
Zm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMg
b2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90
aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVy
LgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRo
ZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMg
YW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24g
YW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisg
KgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIGBgQVMgSVMnJyBB
TkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQg
Tk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJ
TElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJ
TUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJF
IExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisg
KiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9U
IExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJ
Q0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVS
UlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElU
WSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElO
Q0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBP
RiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBP
U1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLiAKKyAqLworCisjaW5jbHVkZSAiY29uZmlnLmgiCisj
aW5jbHVkZSAiQjNBcmd1bWVudFJlZ1ZhbHVlLmgiCisKK25hbWVzcGFjZSBKU0MgeyBuYW1lc3Bh
Y2UgQjMgeworCitBcmd1bWVudFJlZ1ZhbHVlOjp+QXJndW1lbnRSZWdWYWx1ZSgpCit7Cit9CisK
K3ZvaWQgQXJndW1lbnRSZWdWYWx1ZTo6ZHVtcE1ldGEoUHJpbnRTdHJlYW0mIG91dCkgY29uc3QK
K3sKKyAgICBvdXQucHJpbnQobV9yZWcpOworfQorCit9IH0gLy8gbmFtZXNwYWNlIEpTQzo6QjMK
KwpJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzQXJndW1lbnRSZWdWYWx1ZS5oCj09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM0FyZ3VtZW50UmVnVmFsdWUu
aAkocmV2aXNpb24gMCkKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM0FyZ3VtZW50UmVn
VmFsdWUuaAkod29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDYwIEBACisvKgorICogQ29weXJpZ2h0
IChDKSAyMDE1IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3Ry
aWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhv
dXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xs
b3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBz
b3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2Us
IHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisg
KiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFi
b3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQg
dGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQv
b3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisg
KiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBB
TlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1Qg
TElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZ
IEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQu
ICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElB
QkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVY
RU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElN
SVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7
IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBU
SU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBX
SEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVE
SU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRI
RSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lC
SUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisKKyNpZm5kZWYgQjNBcmd1bWVudFJlZ1ZhbHVl
X2gKKyNkZWZpbmUgQjNBcmd1bWVudFJlZ1ZhbHVlX2gKKworI2luY2x1ZGUgIkIzVmFsdWUuaCIK
KyNpbmNsdWRlICJSZWcuaCIKKworbmFtZXNwYWNlIEpTQyB7IG5hbWVzcGFjZSBCMyB7CisKK2Ns
YXNzIEFyZ3VtZW50UmVnVmFsdWUgOiBwdWJsaWMgVmFsdWUgeworcHVibGljOgorICAgIHN0YXRp
YyBib29sIGFjY2VwdHMoT3Bjb2RlIG9wY29kZSkgeyByZXR1cm4gb3Bjb2RlID09IEFyZ3VtZW50
UmVnOyB9CisgICAgCisgICAgfkFyZ3VtZW50UmVnVmFsdWUoKTsKKworICAgIFJlZyBhcmd1bWVu
dFJlZygpIGNvbnN0IHsgcmV0dXJuIG1fcmVnOyB9CisKK3Byb3RlY3RlZDoKKyAgICB2b2lkIGR1
bXBNZXRhKFByaW50U3RyZWFtJikgY29uc3Qgb3ZlcnJpZGU7CisKK3ByaXZhdGU6CisgICAgZnJp
ZW5kIGNsYXNzIFByb2NlZHVyZTsKKworICAgIEFyZ3VtZW50UmVnVmFsdWUodW5zaWduZWQgaW5k
ZXgsIE9yaWdpbiBvcmlnaW4sIFJlZyByZWcpCisgICAgICAgIDogVmFsdWUoaW5kZXgsIEFyZ3Vt
ZW50UmVnLCByZWcuaXNHUFIoKSA/IHBvaW50ZXIoKSA6IERvdWJsZSwgb3JpZ2luKQorICAgICAg
ICAsIG1fcmVnKHJlZykKKyAgICB7CisgICAgfQorCisgICAgUmVnIG1fcmVnOworfTsKKworfSB9
IC8vIG5hbWVzcGFjZSBKU0M6OkIzCisKKyNlbmRpZiAvLyBCM0FyZ3VtZW50UmVnVmFsdWVfaAor
CkluZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNCYXNpY0Jsb2NrLmNwcAo9PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNCYXNpY0Jsb2NrLmNwcAkocmV2aXNp
b24gMCkKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM0Jhc2ljQmxvY2suY3BwCSh3b3Jr
aW5nIGNvcHkpCkBAIC0wLDAgKzEsNTggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTUgQXBw
bGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1
c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZp
Y2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRp
b25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11
c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9m
IGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJp
YnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0
CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5n
IGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRl
cmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdB
UkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVT
UyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBU
SEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1Mg
Rk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5U
IFNIQUxMIEFQUExFIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBE
SVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBD
T05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICog
UFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0Us
IERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIg
Q0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09O
VFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5D
RSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0Yg
VEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNI
IERBTUFHRS4gCisgKi8KKworI2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgIkIzQmFzaWNC
bG9jay5oIgorCituYW1lc3BhY2UgSlNDIHsgbmFtZXNwYWNlIEIzIHsKKworQmFzaWNCbG9jazo6
QmFzaWNCbG9jayh1bnNpZ25lZCBpbmRleCkKKyAgICA6IG1faW5kZXgoaW5kZXgpCit7Cit9CisK
K0Jhc2ljQmxvY2s6On5CYXNpY0Jsb2NrKCkKK3sKK30KKwordm9pZCBCYXNpY0Jsb2NrOjphcHBl
bmQoVmFsdWUqIHZhbHVlKQoreworICAgIG1fdmFsdWVzLmFwcGVuZCh2YWx1ZSk7Cit9CisKK3Zv
aWQgQmFzaWNCbG9jazo6ZHVtcChQcmludFN0cmVhbSYgb3V0KSBjb25zdAoreworICAgIG91dC5w
cmludChkdW1wUHJlZml4LCBtX2luZGV4KTsKK30KKwordm9pZCBCYXNpY0Jsb2NrOjpkZWVwRHVt
cChQcmludFN0cmVhbSYgb3V0KSBjb25zdAoreworICAgIG91dC5wcmludCgiQkIiLCAqdGhpcywg
IjpcbiIpOworICAgIGZvciAoVmFsdWUqIHZhbHVlIDogKnRoaXMpCisgICAgICAgIG91dC5wcmlu
dCgiICAgICIsIGRlZXBEdW1wKHZhbHVlKSwgIlxuIik7Cit9CisKK30gfSAvLyBuYW1lc3BhY2Ug
SlNDOjpCMworCkluZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNCYXNpY0Jsb2NrLmgK
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzQmFzaWNCbG9jay5oCShy
ZXZpc2lvbiAwKQorKysgU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzQmFzaWNCbG9jay5oCSh3
b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsMTA2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE1
IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBh
bmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1v
ZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29u
ZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29k
ZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlz
dCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRp
c3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHly
aWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxv
d2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIg
bWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNP
RlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVY
UFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBU
TywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRO
RVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBF
VkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBB
TlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwg
T1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywK
KyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0Yg
VVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dF
VkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElO
IENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJ
R0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAq
IE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0Yg
U1VDSCBEQU1BR0UuIAorICovCisKKyNpZm5kZWYgQjNCYXNpY0Jsb2NrCisjZGVmaW5lIEIzQmFz
aWNCbG9jaworCituYW1lc3BhY2UgSlNDIHsgbmFtZXNwYWNlIEIzIHsKKworY2xhc3MgUHJvY2Vk
dXJlOworY2xhc3MgVmFsdWU7CisKK2NsYXNzIEJhc2ljQmxvY2sgeworICAgIFdURl9NQUtFX05P
TkNPUFlBQkxFKEJhc2ljQmxvY2spOworICAgIFdURl9NQUtFX0ZBU1RfQUxMT0NBVEVEOworcHVi
bGljOgorICAgIHR5cGVkZWYgVmVjdG9yPFZhbHVlKj4gVmFsdWVMaXN0OworCisgICAgc3RhdGlj
IGNvbnN0IGNoYXIqIGR1bXBQcmVmaXggPSAiIyI7CisKKyAgICB+QmFzaWNCbG9jaygpOworCisg
ICAgdW5zaWduZWQgaW5kZXgoKSBjb25zdCB7IHJldHVybiBtX2luZGV4OyB9CisKKyAgICBBZGph
Y2VuY3lMaXN0OjppdGVyYXRvciBiZWdpbigpIHsgcmV0dXJuIG1fdmFsdWVzLmJlZ2luKCk7IH0K
KyAgICBBZGphY2VuY3lMaXN0OjppdGVyYXRvciBlbmQoKSB7IHJldHVybiBtX3ZhbHVlcy5lbmQo
KTsgfQorICAgIEFkamFjZW5jeUxpc3Q6OmNvbnN0X2l0ZXJhdG9yIGJlZ2luKCkgY29uc3QgeyBy
ZXR1cm4gbV92YWx1ZXMuYmVnaW4oKTsgfQorICAgIEFkamFjZW5jeUxpc3Q6OmNvbnN0X2l0ZXJh
dG9yIGVuZCgpIGNvbnN0IHsgcmV0dXJuIG1fdmFsdWVzLmVuZCgpOyB9CisKKyAgICBzaXplX3Qg
c2l6ZSgpIGNvbnN0IHsgcmV0dXJuIG1fdmFsdWVzLnNpemUoKTsgfQorICAgIFZhbHVlKiBhdChz
aXplX3QgaW5kZXgpIGNvbnN0IHsgcmV0dXJuIG1fdmFsdWVzW2luZGV4XTsgfQorICAgIFZhbHVl
KiYgYXQoc2l6ZV90IGluZGV4KSB7IHJldHVybiBtX3ZhbHVlc1tpbmRleF07IH0KKworICAgIFZh
bHVlKiBsYXN0KCkgY29uc3QgeyByZXR1cm4gbV92YWx1ZXMubGFzdCgpOyB9CisgICAgVmFsdWUq
JiBsYXN0KCkgeyByZXR1cm4gbV92YWx1ZXMubGFzdCgpOyB9CisKKyAgICBjb25zdCBWYWx1ZUxp
c3QmIHZhbHVlcygpIGNvbnN0IHsgcmV0dXJuIG1fdmFsdWVzOyB9CisgICAgVmFsdWVMaXN0JiB2
YWx1ZXMoKSB7IHJldHVybiBtX3ZhbHVlczsgfQorCisgICAgdm9pZCBhcHBlbmQoVmFsdWUqKTsK
KworICAgIHRlbXBsYXRlPHR5cGVuYW1lIFZhbHVlVHlwZSwgdHlwZW5hbWUuLi4gQXJndW1lbnRz
PgorICAgIFZhbHVlVHlwZSogYXBwZW5kTmV3KFByb2NlZHVyZSYsIEFyZ3VtZW50cy4uLik7CisK
KyAgICB2b2lkIGR1bXAoUHJpbnRTdHJlYW0mKSBjb25zdDsKKyAgICB2b2lkIGRlZXBEdW1wKFBy
aW50U3RyZWFtJikgY29uc3Q7CisKK3ByaXZhdGU6CisgICAgZnJpZW5kIGNsYXNzIFByb2NlZHVy
ZTsKKyAgICAKKyAgICAvLyBJbnN0YW50aWF0ZSB2aWEgUHJvY2VkdXJlLgorICAgIEJhc2ljQmxv
Y2sodW5zaWduZWQgaW5kZXgpOworCisgICAgdW5zaWduZWQgbV9pbmRleDsKKyAgICBWYWx1ZUxp
c3QgbV92YWx1ZXM7Cit9OworCitjbGFzcyBEZWVwQmFzaWNCbG9ja0R1bXAgeworcHVibGljOgor
ICAgIERlZXBCYXNpY0Jsb2NrRHVtcChCYXNpY0Jsb2NrKiBibG9jaykKKyAgICAgICAgOiBtX2Js
b2NrKGJsb2NrKQorICAgIHsKKyAgICB9CisKKyAgICB2b2lkIGR1bXAoUHJpbnRTdHJlYW0mIG91
dCkgY29uc3QKKyAgICB7CisgICAgICAgIGlmIChtX2Jsb2NrKQorICAgICAgICAgICAgbV9ibG9j
ay0+ZGVlcER1bXAob3V0KTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgb3V0LnByaW50KCI8
bnVsbD4iKTsKKyAgICB9CisKK3ByaXZhdGU6CisgICAgQmFzaWNCbG9jayogbV9ibG9jazsKK307
CisKK0RlZXBCYXNpY0Jsb2NrRHVtcCBkZWVwRHVtcChCYXNpY0Jsb2NrKiBibG9jaykKK3sKKyAg
ICByZXR1cm4gRGVlcEJhc2ljQmxvY2tEdW1wKGJsb2NrKTsKK30KKworfSB9IC8vIG5hbWVzcGFj
ZSBKU0M6OkIzCisKKyNlbmRpZiAvLyBCM0Jhc2ljQmxvY2sKKwpJbmRleDogU291cmNlL0phdmFT
Y3JpcHRDb3JlL2IzL0IzQmFzaWNCbG9ja0lubGluZXMuaAo9PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2Uv
SmF2YVNjcmlwdENvcmUvYjMvQjNCYXNpY0Jsb2NrSW5saW5lcy5oCShyZXZpc2lvbiAwKQorKysg
U291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzQmFzaWNCbG9ja0lubGluZXMuaAkod29ya2luZyBj
b3B5KQpAQCAtMCwwICsxLDQ1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE1IEFwcGxlIElu
Yy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGlu
IHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlv
biwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwor
ICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJl
dGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25k
aXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlv
bnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICog
ICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNj
bGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxz
IHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElT
IFBST1ZJREVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1Ig
SU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisg
KiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBB
IFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFM
TCBBUFBMRSBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNU
LCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VR
VUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NV
UkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRB
LCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNF
RCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNU
LCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1Ig
T1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMg
U09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1B
R0UuIAorICovCisKKyNpZm5kZWYgQjNCYXNpY0Jsb2NrSW5saW5lc19oCisjZGVmaW5lIEIzQmFz
aWNCbG9ja0lubGluZXNfaAorCisjaW5jbHVkZSAiQjNCYXNpY0Jsb2NrLmgiCisjaW5jbHVkZSAi
QjNQcm9jZWR1cmVJbmxpbmVzLmgiCisKK25hbWVzcGFjZSBKU0MgeyBuYW1lc3BhY2UgQjMgewor
Cit0ZW1wbGF0ZTx0eXBlbmFtZSBWYWx1ZVR5cGUgdHlwZW5hbWUuLi4gQXJndW1lbnRzPgorVmFs
dWVUeXBlKiBCYXNpY0Jsb2NrOjphcHBlbmROZXcoUHJvY2VkdXJlJiBwcm9jZWR1cmUsIEFyZ3Vt
ZW50cy4uLiBhcmd1bWVudHMpCit7CisgICAgVmFsdWVUeXBlKiByZXN1bHQgPSBwcm9jZWR1cmUu
YWRkPFZhbHVlVHlwZT4oYXJndW1lbnRzLi4uKTsKKyAgICBhcHBlbmQocmVzdWx0KTsKKyAgICBy
ZXR1cm4gcmVzdWx0OworfQorCit9IH0gLy8gbmFtZXNwYWNlIEpTQzo6QjMKKworI2VuZGlmIC8v
IEIzQmFzaWNCbG9ja0lubGluZXNfaAorCkluZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMv
QjNDb25zdDMyVmFsdWUuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9i
My9CM0NvbnN0MzJWYWx1ZS5jcHAJKHJldmlzaW9uIDApCisrKyBTb3VyY2UvSmF2YVNjcmlwdENv
cmUvYjMvQjNDb25zdDMyVmFsdWUuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsNDEgQEAK
Ky8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTUgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVk
LgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9y
bXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3Zp
ZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVk
aXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmln
aHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dp
bmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0
IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBv
ZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBk
b2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlz
dHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5D
LiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElO
Q0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBP
RiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9T
RSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IKKyAqIENP
TlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFM
LCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xV
RElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBH
T09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBC
VVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisg
KiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9S
IFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4g
QU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJ
U0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKworI2luY2x1ZGUg
ImNvbmZpZy5oIgorI2luY2x1ZGUgIkIzQ29uc3QzMlZhbHVlLmgiCisKK25hbWVzcGFjZSBKU0Mg
eyBuYW1lc3BhY2UgQjMgeworCitDb25zdDMyVmFsdWU6On5Db25zdDMyVmFsdWUoKQoreworfQor
Cit2b2lkIENvbnN0MzJWYWx1ZTo6ZHVtcE1ldGEoUHJpbnRTdHJlYW0mIG91dCkgY29uc3QKK3sK
KyAgICBvdXQucHJpbnQobV92YWx1ZSk7Cit9CisKK30gfSAvLyBuYW1lc3BhY2UgSlNDOjpCMwor
CkluZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNDb25zdDMyVmFsdWUuaAo9PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNDb25zdDMyVmFsdWUuaAkocmV2aXNp
b24gMCkKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM0NvbnN0MzJWYWx1ZS5oCSh3b3Jr
aW5nIGNvcHkpCkBAIC0wLDAgKzEsNTkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTUgQXBw
bGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1
c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZp
Y2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRp
b25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11
c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9m
IGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJp
YnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0
CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5n
IGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRl
cmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdB
UkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVT
UyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBU
SEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1Mg
Rk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5U
IFNIQUxMIEFQUExFIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBE
SVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBD
T05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICog
UFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0Us
IERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIg
Q0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09O
VFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5D
RSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0Yg
VEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNI
IERBTUFHRS4gCisgKi8KKworI2lmbmRlZiBCM0NvbnN0MzJWYWx1ZV9oCisjZGVmaW5lIEIzQ29u
c3QzMlZhbHVlX2gKKworI2luY2x1ZGUgIkIzVmFsdWUuaCIKKworbmFtZXNwYWNlIEpTQyB7IG5h
bWVzcGFjZSBCMyB7CisKK2NsYXNzIENvbnN0MzJWYWx1ZSA6IHB1YmxpYyBWYWx1ZSB7CitwdWJs
aWM6CisgICAgc3RhdGljIGJvb2wgYWNjZXB0cyhPcGNvZGUgb3Bjb2RlKSB7IHJldHVybiBvcGNv
ZGUgPT0gQ29uc3QzMjsgfQorICAgIAorICAgIH5Db25zdDMyVmFsdWUoKTsKKyAgICAKKyAgICBp
bnQzMl90IHZhbHVlKCkgY29uc3QgeyByZXR1cm4gbV92YWx1ZTsgfQorCitwcm90ZWN0ZWQ6Cisg
ICAgdm9pZCBkdW1wTWV0YShQcmludFN0cmVhbSYpIGNvbnN0IG92ZXJyaWRlOworCitwcml2YXRl
OgorICAgIGZyaWVuZCBjbGFzcyBQcm9jZWR1cmU7CisKKyAgICBDb25zdDMyVmFsdWUodW5zaWdu
ZWQgaW5kZXgsIE9yaWdpbiBvcmlnaW4sIGludDMyX3QgdmFsdWUpCisgICAgICAgIDogVmFsdWUo
aW5kZXgsIENvbnN0MzIsIEludDMyLCBvcmlnaW4pCisgICAgICAgICwgbV92YWx1ZSh2YWx1ZSkK
KyAgICB7CisgICAgfQorICAgIAorICAgIGludDMyX3QgbV92YWx1ZTsKK307CisKK30gfSAvLyBu
YW1lc3BhY2UgSlNDOjpCMworCisjZW5kaWYgLy8gQjNDb25zdDMyVmFsdWVfaAorCkluZGV4OiBT
b3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNDb25zdDY0VmFsdWUuY3BwCj09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0t
IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM0NvbnN0NjRWYWx1ZS5jcHAJKHJldmlzaW9uIDAp
CisrKyBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNDb25zdDY0VmFsdWUuY3BwCSh3b3JraW5n
IGNvcHkpCkBAIC0wLDAgKzEsNDEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTUgQXBwbGUg
SW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2Ug
aW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0
aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25z
CisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3Qg
cmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNv
bmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0
aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Cisg
KiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRp
c2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlh
bHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUg
SVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBP
UiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUK
KyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9S
IEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNI
QUxMIEFQUExFIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJF
Q1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05T
RVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJP
Q1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERB
VEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FV
U0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJB
Q1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBP
UiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJ
UyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERB
TUFHRS4gCisgKi8KKworI2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgIkIzQ29uc3Q2NFZh
bHVlLmgiCisKK25hbWVzcGFjZSBKU0MgeyBuYW1lc3BhY2UgQjMgeworCitDb25zdDY0VmFsdWU6
On5Db25zdDY0VmFsdWUoKQoreworfQorCit2b2lkIENvbnN0NjRWYWx1ZTo6ZHVtcE1ldGEoUHJp
bnRTdHJlYW0mIG91dCkgY29uc3QKK3sKKyAgICBvdXQucHJpbnQobV92YWx1ZSk7Cit9CisKK30g
fSAvLyBuYW1lc3BhY2UgSlNDOjpCMworCkluZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMv
QjNDb25zdDY0VmFsdWUuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMv
QjNDb25zdDY0VmFsdWUuaAkocmV2aXNpb24gMCkKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9i
My9CM0NvbnN0NjRWYWx1ZS5oCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsNTkgQEAKKy8qCisg
KiBDb3B5cmlnaHQgKEMpIDIwMTUgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoK
KyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdp
dGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRo
YXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmli
dXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAq
ICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlz
Y2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJv
ZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25k
aXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVu
dGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0
aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFT
IElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElO
RywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJD
SEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUg
RElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IKKyAqIENPTlRSSUJV
VE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVD
SUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywg
QlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBP
UiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVT
UyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBM
SUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQK
KyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdB
WSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9G
IFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKworI2lmbmRlZiBCM0NvbnN0
NjRWYWx1ZV9oCisjZGVmaW5lIEIzQ29uc3Q2NFZhbHVlX2gKKworI2luY2x1ZGUgIkIzVmFsdWUu
aCIKKworbmFtZXNwYWNlIEpTQyB7IG5hbWVzcGFjZSBCMyB7CisKK2NsYXNzIENvbnN0NjRWYWx1
ZSA6IHB1YmxpYyBWYWx1ZSB7CitwdWJsaWM6CisgICAgc3RhdGljIGJvb2wgYWNjZXB0cyhPcGNv
ZGUgb3Bjb2RlKSB7IHJldHVybiBvcGNvZGUgPT0gQ29uc3Q2NDsgfQorICAgIAorICAgIH5Db25z
dDY0VmFsdWUoKTsKKyAgICAKKyAgICBpbnQ2NF90IHZhbHVlKCkgY29uc3QgeyByZXR1cm4gbV92
YWx1ZTsgfQorCitwcm90ZWN0ZWQ6CisgICAgdm9pZCBkdW1wTWV0YShQcmludFN0cmVhbSYpIGNv
bnN0IG92ZXJyaWRlOworCitwcml2YXRlOgorICAgIGZyaWVuZCBjbGFzcyBQcm9jZWR1cmU7CisK
KyAgICBDb25zdDY0VmFsdWUodW5zaWduZWQgaW5kZXgsIE9yaWdpbiBvcmlnaW4sIGludDY0X3Qg
dmFsdWUpCisgICAgICAgIDogVmFsdWUoaW5kZXgsIENvbnN0NjQsIEludDY0LCBvcmlnaW4pCisg
ICAgICAgICwgbV92YWx1ZSh2YWx1ZSkKKyAgICB7CisgICAgfQorICAgIAorICAgIGludDY0X3Qg
bV92YWx1ZTsKK307CisKK30gfSAvLyBuYW1lc3BhY2UgSlNDOjpCMworCisjZW5kaWYgLy8gQjND
b25zdDY0VmFsdWVfaAorCkluZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNDb25zdERv
dWJsZVZhbHVlLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjND
b25zdERvdWJsZVZhbHVlLmNwcAkocmV2aXNpb24gMCkKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29y
ZS9iMy9CM0NvbnN0RG91YmxlVmFsdWUuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsNDEg
QEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTUgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2Vy
dmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkg
Zm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHBy
b3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4g
UmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5
cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xs
b3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBt
dXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlz
dCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAg
ICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUg
ZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUg
SU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMs
IElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElF
UyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVS
UE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IKKyAq
IENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVO
VEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElO
Q0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVU
RSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBP
UiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZ
CisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFks
IE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcg
SU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBB
RFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKworI2luY2x1
ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgIkIzQ29uc3REb3VibGVWYWx1ZS5oIgorCituYW1lc3Bh
Y2UgSlNDIHsgbmFtZXNwYWNlIEIzIHsKKworQ29uc3REb3VibGVWYWx1ZTo6fkNvbnN0RG91Ymxl
VmFsdWUoKQoreworfQorCit2b2lkIENvbnN0RG91YmxlVmFsdWU6OmR1bXBNZXRhKFByaW50U3Ry
ZWFtJiBvdXQpIGNvbnN0Cit7CisgICAgb3V0LnByaW50ZigiJWxlIiwgbV92YWx1ZSk7Cit9CisK
K30gfSAvLyBuYW1lc3BhY2UgSlNDOjpCMworCkluZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUv
YjMvQjNDb25zdERvdWJsZVZhbHVlLmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRD
b3JlL2IzL0IzQ29uc3REb3VibGVWYWx1ZS5oCShyZXZpc2lvbiAwKQorKysgU291cmNlL0phdmFT
Y3JpcHRDb3JlL2IzL0IzQ29uc3REb3VibGVWYWx1ZS5oCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAg
KzEsNTkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTUgQXBwbGUgSW5jLiBBbGwgcmlnaHRz
IHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBi
aW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0
dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0Ogor
ICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92
ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRo
ZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkg
Zm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRo
aXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhl
CisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0
aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkg
QVBQTEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJB
TlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FS
UkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgor
ICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4g
T1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJ
TkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFH
RVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VC
U1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9G
SVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkg
VEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFC
SUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFS
SVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZF
TiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKwor
I2lmbmRlZiBCM0NvbnN0RG91YmxlVmFsdWVfaAorI2RlZmluZSBCM0NvbnN0RG91YmxlVmFsdWVf
aAorCisjaW5jbHVkZSAiQjNWYWx1ZS5oIgorCituYW1lc3BhY2UgSlNDIHsgbmFtZXNwYWNlIEIz
IHsKKworY2xhc3MgQ29uc3REb3VibGVWYWx1ZSA6IHB1YmxpYyBWYWx1ZSB7CitwdWJsaWM6Cisg
ICAgc3RhdGljIGJvb2wgYWNjZXB0cyhPcGNvZGUgb3Bjb2RlKSB7IHJldHVybiBvcGNvZGUgPT0g
Q29uc3REb3VibGU7IH0KKyAgICAKKyAgICB+Q29uc3REb3VibGVWYWx1ZSgpOworICAgIAorICAg
IGRvdWJsZSB2YWx1ZSgpIGNvbnN0IHsgcmV0dXJuIG1fdmFsdWU7IH0KKworcHJvdGVjdGVkOgor
ICAgIHZvaWQgZHVtcE1ldGEoUHJpbnRTdHJlYW0mKSBjb25zdCBvdmVycmlkZTsKKworcHJpdmF0
ZToKKyAgICBmcmllbmQgY2xhc3MgUHJvY2VkdXJlOworCisgICAgQ29uc3REb3VibGVWYWx1ZSh1
bnNpZ25lZCBpbmRleCwgT3JpZ2luIG9yaWdpbiwgZG91YmxlIHZhbHVlKQorICAgICAgICA6IFZh
bHVlKGluZGV4LCBDb25zdERvdWJsZSwgRG91YmxlLCBvcmlnaW4pCisgICAgICAgICwgbV92YWx1
ZSh2YWx1ZSkKKyAgICB7CisgICAgfQorICAgIAorICAgIGRvdWJsZSBtX3ZhbHVlOworfTsKKwor
fSB9IC8vIG5hbWVzcGFjZSBKU0M6OkIzCisKKyNlbmRpZiAvLyBCM0NvbnN0RG91YmxlVmFsdWVf
aAorCkluZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNJbmRleFNldC5oCj09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM0luZGV4U2V0LmgJKHJldmlzaW9uIDAp
CisrKyBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNJbmRleFNldC5oCSh3b3JraW5nIGNvcHkp
CkBAIC0wLDAgKzEsMTQxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE1IEFwcGxlIEluYy4g
QWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNv
dXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwg
YXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICog
YXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFp
biB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRp
b25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMg
aW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAg
bm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFp
bWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHBy
b3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBS
T1ZJREVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1Q
TElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJ
TVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBB
UlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBB
UFBMRSBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJ
TkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVO
VElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVN
RU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBP
UgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBB
TkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBT
VFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RI
RVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09G
VFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0Uu
IAorICovCisKKyNpZm5kZWYgQjNJbmRleFNldF9oCisjZGVmaW5lIEIzSW5kZXhTZXRfaAorCisj
aW5jbHVkZSA8d3RmL0JpdFZlY3Rvci5oPgorI2luY2x1ZGUgPHd0Zi9Db21tYVByaW50ZXIuaD4K
KworbmFtZXNwYWNlIEpTQyB7IG5hbWVzcGFjZSBCMyB7CisKKy8vIFRoaXMgaXMgYSBzZXQgZm9y
IHRoaW5ncyB0aGF0IGhhdmUgYW4gaW5kZXgoKS4gSXQncyBzdXBlciBlZmZpY2llbnQgZm9yIEJh
c2ljQmxvY2tzLiBJdCdzIG9ubHkKKy8vIGVmZmljaWVudCBmb3IgVmFsdWVzIGlmIHlvdSBkb24n
dCBjcmVhdGUgdG9vIG1hbnkgb2YgdGhlc2Ugc2V0cywgc2luY2UgVmFsdWVzIGNhbiBoYXZlIHZl
cnkgc3BhcnNlCisvLyBpbmRpY2VzIGFuZCB0aGVyZSBhcmUgYSBsb3Qgb2YgVmFsdWVzLgorCisv
LyBJZiB5b3Ugd2FudCBhIHNldCBvZiBCYXNpY0Jsb2NrcywgeW91IGRvIEluZGV4U2V0PEJhc2lj
QmxvY2s+LiBTbywgVCA9IEJhc2ljQmxvY2suCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorY2xhc3Mg
SW5kZXhTZXQgeworcHVibGljOgorICAgIEluZGV4U2V0KCkKKyAgICB7CisgICAgfQorCisgICAg
Ym9vbCBhZGQoVCogdmFsdWUpCisgICAgeworICAgICAgICByZXR1cm4gIW1fc2V0LnNldCh2YWx1
ZS0+aW5kZXgoKSk7CisgICAgfQorCisgICAgYm9vbCBjb250YWlucyhUKiB2YWx1ZSkgY29uc3QK
KyAgICB7CisgICAgICAgIGlmICghdmFsdWUpCisgICAgICAgICAgICByZXR1cm4gbnVsbHB0cjsK
KyAgICAgICAgcmV0dXJuIG1fc2V0LmdldCh2YWx1ZS0+aW5kZXgoKSk7CisgICAgfQorCisgICAg
dGVtcGxhdGU8dHlwZW5hbWUgQ29sbGVjdGlvblR5cGU+CisgICAgY2xhc3MgSXRlcmFibGUgewor
ICAgIHB1YmxpYzoKKyAgICAgICAgSXRlcmFibGUoY29uc3QgQ29sbGVjdGlvblR5cGUmIGNvbGxl
Y3Rpb24sIGNvbnN0IEluZGV4U2V0JiBzZXQpCisgICAgICAgICAgICA6IG1fY29sbGVjdGlvbihj
b2xsZWN0aW9uKQorICAgICAgICAgICAgLCBtX3NldChzZXQpCisgICAgICAgIHsKKyAgICAgICAg
fQorCisgICAgICAgIGNsYXNzIGl0ZXJhdG9yIHsKKyAgICAgICAgcHVibGljOgorICAgICAgICAg
ICAgaXRlcmF0b3IoKQorICAgICAgICAgICAgICAgIDogbV9jb2xsZWN0aW9uKG51bGxwdHIpCisg
ICAgICAgICAgICB7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGl0ZXJhdG9yKGNvbnN0
IENvbGxlY3Rpb25UeXBlJiBjb2xsZWN0aW9uLCBCaXRWZWN0b3I6OlNldEJpdHNJdGVyYWJsZTo6
aXRlcmF0b3IgaXRlcikKKyAgICAgICAgICAgICAgICA6IG1fY29sbGVjdGlvbigmY29sbGVjdGlv
bikKKyAgICAgICAgICAgICAgICAsIG1faXRlcihpdGVyKQorICAgICAgICAgICAgeworICAgICAg
ICAgICAgfQorCisgICAgICAgICAgICBUKiBvcGVyYXRvciooKQorICAgICAgICAgICAgeworICAg
ICAgICAgICAgICAgIHJldHVybiBtX2NvbGxlY3Rpb24tPmF0KCptX2l0ZXIpOworICAgICAgICAg
ICAgfQorCisgICAgICAgICAgICBpdGVyYXRvciYgb3BlcmF0b3IrKygpCisgICAgICAgICAgICB7
CisgICAgICAgICAgICAgICAgbV9pdGVyKys7CisgICAgICAgICAgICAgICAgcmV0dXJuICp0aGlz
OworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBib29sIG9wZXJhdG9yPT0oY29uc3QgaXRl
cmF0b3ImIG90aGVyKSBjb25zdAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVy
biBtX2l0ZXIgPT0gb3RoZXIubV9pdGVyOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBi
b29sIG9wZXJhdG9yIT0oY29uc3QgaXRlcmF0b3ImIG90aGVyKSBjb25zdAorICAgICAgICAgICAg
eworICAgICAgICAgICAgICAgIHJldHVybiAhKCp0aGlzID09IG90aGVyKTsKKyAgICAgICAgICAg
IH0KKworICAgICAgICBwcml2YXRlOgorICAgICAgICAgICAgY29uc3QgQ29sbGVjdGlvblR5cGUq
IG1fY29sbGVjdGlvbjsKKyAgICAgICAgICAgIEJpdFZlY3Rvcjo6U2V0Qml0c0l0ZXJhYmxlOjpp
dGVyYXRvciBtX2l0ZXI7CisgICAgICAgIH07CisKKyAgICAgICAgaXRlcmF0b3IgYmVnaW4oKSBj
b25zdCB7IHJldHVybiBpdGVyYXRvcihtX2NvbGxlY3Rpb24sIG1fc2V0LmJlZ2luKCkpOyB9Cisg
ICAgICAgIGl0ZXJhdG9yIGVuZCgpIGNvbnN0IHsgcmV0dXJuIGl0ZXJhdG9yKG1fY29sbGVjdGlv
biwgbV9zZXQuZW5kKCkpOyB9CisKKyAgICBwcml2YXRlOgorICAgICAgICBjb25zdCBDb2xsZWN0
aW9uVHlwZSYgbV9jb2xsZWN0aW9uOworICAgICAgICBjb25zdCBJbmRleFNldCYgbV9zZXQ7Cisg
ICAgfTsKKworICAgIC8vIEZvciBiYXNpYyBibG9ja3MsIHlvdSBkbzoKKyAgICAvLyBpbmRleFNl
dC52YWx1ZXMocHJvY2VkdXJlKTsKKyAgICAvLworICAgIC8vIEZvciB2YWx1ZXMsIHlvdSBkbzoK
KyAgICAvLyBpbmRleFNldC52YWx1ZXMocHJvY2VkdXJlLnZhbHVlcygpKTsKKyAgICB0ZW1wbGF0
ZTx0eXBlbmFtZSBDb2xsZWN0aW9uVHlwZT4KKyAgICBJdGVyYWJsZTxDb2xsZWN0aW9uVHlwZT4g
dmFsdWVzKGNvbnN0IENvbGxlY3Rpb25UeXBlJiBjb2xsZWN0aW9uKSBjb25zdAorICAgIHsKKyAg
ICAgICAgcmV0dXJuIEl0ZXJhYmxlPENvbGxlY3Rpb25UeXBlPihjb2xsZWN0aW9uKTsKKyAgICB9
CisKKyAgICBjb25zdCBCaXRWZWN0b3ImIGluZGljZXMoKSBjb25zdCB7IHJldHVybiBtX3NldDsg
fQorCisgICAgdm9pZCBkdW1wKFByaW50U3RyZWFtJiBvdXQpIGNvbnN0CisgICAgeworICAgICAg
ICBDb21tYVByaW50ZXIgY29tbWE7CisgICAgICAgIGZvciAoc2l6ZV90IGluZGV4IDogaW5kaWNl
cygpLnNldEJpdHMoKSkKKyAgICAgICAgICAgIG91dC5wcmludChjb21tYSwgVDo6ZHVtcFByZWZp
eCwgaW5kZXgpOworICAgIH0KKworcHJpdmF0ZToKKyAgICBCaXRWZWN0b3IgbV9zZXQ7Cit9Owor
Cit9IH0gLy8gbmFtZXNwYWNlIEpTQzo6QjMKKworI2VuZGlmIC8vIEIzSW5kZXhTZXRfaAorCklu
ZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNNZW1vcnlWYWx1ZS5jcHAKPT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PQotLS0gU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzTWVtb3J5VmFsdWUuY3BwCShyZXZpc2lv
biAwKQorKysgU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzTWVtb3J5VmFsdWUuY3BwCSh3b3Jr
aW5nIGNvcHkpCkBAIC0wLDAgKzEsNDIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTUgQXBw
bGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1
c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZp
Y2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRp
b25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11
c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9m
IGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJp
YnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0
CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5n
IGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRl
cmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdB
UkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVT
UyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBU
SEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1Mg
Rk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5U
IFNIQUxMIEFQUExFIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBE
SVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBD
T05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICog
UFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0Us
IERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIg
Q0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09O
VFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5D
RSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0Yg
VEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNI
IERBTUFHRS4gCisgKi8KKworI2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgIkIzTWVtb3J5
VmFsdWUuaCIKKworbmFtZXNwYWNlIEpTQyB7IG5hbWVzcGFjZSBCMyB7CisKK01lbW9yeVZhbHVl
Ojp+TWVtb3J5VmFsdWUoKQoreworfQorCit2b2lkIE1lbW9yeVZhbHVlOjpkdW1wTWV0YShQcmlu
dFN0cmVhbSYgb3V0KSBjb25zdAoreworICAgIGlmIChtX29mZnNldCkKKyAgICAgICAgb3V0LnBy
aW50KCJvZmZzZXQgPSAiLCBtX29mZnNldCk7Cit9CisKK30gfSAvLyBuYW1lc3BhY2UgSlNDOjpC
MworCkluZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNNZW1vcnlWYWx1ZS5oCj09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM01lbW9yeVZhbHVlLmgJKHJldmlz
aW9uIDApCisrKyBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNNZW1vcnlWYWx1ZS5oCSh3b3Jr
aW5nIGNvcHkpCkBAIC0wLDAgKzEsMTQyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE1IEFw
cGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQg
dXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlm
aWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0
aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBt
dXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBv
ZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3Ry
aWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdo
dAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2lu
ZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0
ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRX
QVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJF
U1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywg
VEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNT
IEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVO
VCBTSEFMTCBBUFBMRSBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkg
RElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1Ig
Q09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAq
IFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNF
LCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVS
IENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENP
TlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VO
Q0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9G
IFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VD
SCBEQU1BR0UuIAorICovCisKKyNpZm5kZWYgQjNNZW1vcnlWYWx1ZV9oCisjZGVmaW5lIEIzTWVt
b3J5VmFsdWVfaAorCisjaW5jbHVkZSAiQjNWYWx1ZS5oIgorCituYW1lc3BhY2UgSlNDIHsgbmFt
ZXNwYWNlIEIzIHsKKworY2xhc3MgTWVtb3J5VmFsdWUgOiBwdWJsaWMgVmFsdWUgeworcHVibGlj
OgorICAgIHN0YXRpYyBib29sIGFjY2VwdHMoT3Bjb2RlIG9wY29kZSkKKyAgICB7CisgICAgICAg
IHN3aXRjaCAob3Bjb2RlKSB7CisgICAgICAgIGNhc2UgTG9hZDhaOgorICAgICAgICBjYXNlIExv
YWQ4UzoKKyAgICAgICAgY2FzZSBMb2FkMTZaOgorICAgICAgICBjYXNlIExvYWQxNlM6CisgICAg
ICAgIGNhc2UgTG9hZEZsb2F0OgorICAgICAgICBjYXNlIExvYWQ6CisgICAgICAgIGNhc2UgU3Rv
cmU4OgorICAgICAgICBjYXNlIFN0b3JlMTY6CisgICAgICAgIGNhc2UgU3RvcmVGbG9hdDoKKyAg
ICAgICAgY2FzZSBTdG9yZToKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICBkZWZh
dWx0OgorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgfQorCisgICAg
fk1lbW9yeVZhbHVlKCk7CisKKyAgICBpbnRwdHJfdCBvZmZzZXQoKSBjb25zdCB7IHJldHVybiBt
X29mZnNldDsgfQorCitwcm90ZWN0ZWQ6CisgICAgdm9pZCBkdW1wTWV0YShQcmludFN0cmVhbSYp
IGNvbnN0IG92ZXJyaWRlOworCitwcml2YXRlOgorICAgIGZyaWVuZCBjbGFzcyBQcm9jZWR1cmU7
CisKKyAgICAvLyBVc2UgdGhpcyBmb3JtIGZvciBMb2FkIChidXQgbm90IExvYWQ4WiwgTG9hZDhT
LCBvciBhbnkgb2YgdGhlIExvYWRzIHRoYXQgaGF2ZSBhIHN1ZmZpeCB0aGF0CisgICAgLy8gZGVz
Y3JpYmVzIHRoZSByZXR1cm5lZCB0eXBlKS4KKyAgICBNZW1vcnlWYWx1ZSgKKyAgICAgICAgdW5z
aWduZWQgaW5kZXgsIE9wY29kZSBvcGNvZGUsIFR5cGUgdHlwZSwgT3JpZ2luIG9yaWdpbiwgVmFs
dWUqIHBvaW50ZXIsCisgICAgICAgIGludHB0cl90IG9mZnNldCA9IDApCisgICAgICAgIDogVmFs
dWUoaW5kZXgsIG9wY29kZSwgdHlwZSwgb3JpZ2luLCBwb2ludGVyKQorICAgICAgICAsIG1fb2Zm
c2V0KG9mZnNldCkKKyAgICB7CisgICAgICAgIGlmICghQVNTRVJUX0RJU0FCTEVEKSB7CisgICAg
ICAgICAgICBzd2l0Y2ggKG9wY29kZSkgeworICAgICAgICAgICAgY2FzZSBMb2FkOgorICAgICAg
ICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBMb2FkOFo6CisgICAgICAgICAgICBj
YXNlIExvYWQ4UzoKKyAgICAgICAgICAgIGNhc2UgTG9hZDE2WjoKKyAgICAgICAgICAgIGNhc2Ug
TG9hZDE2UzoKKyAgICAgICAgICAgICAgICBBU1NFUlQodHlwZSA9PSBJbnQzMik7CisgICAgICAg
ICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIExvYWRGbG9hdDoKKyAgICAgICAgICAg
ICAgICBBU1NFUlQodHlwZSA9PSBEb3VibGUpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAg
ICAgICAgICAgY2FzZSBTdG9yZTg6CisgICAgICAgICAgICBjYXNlIFN0b3JlMTY6CisgICAgICAg
ICAgICBjYXNlIFN0b3JlRmxvYXQ6CisgICAgICAgICAgICBjYXNlIFN0b3JlOgorICAgICAgICAg
ICAgICAgIEFTU0VSVCh0eXBlID09IFZvaWQpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAg
ICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBBU1NFUlRfTk9UX1JFQUNIRUQoKTsK
KyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIFVzZSB0aGlzIGZvcm0g
Zm9yIGxvYWRzIHdoZXJlIHRoZSByZXR1cm4gdHlwZSBpcyBpbXBsaWVkLgorICAgIE1lbW9yeVZh
bHVlKHVuc2lnbmVkIGluZGV4LCBPcGNvZGUgb3Bjb2RlLCBPcmlnaW4gb3JpZ2luLCBWYWx1ZSog
cG9pbnRlciwgaW50cHRyX3Qgb2Zmc2V0ID0gMCkKKyAgICAgICAgOiBWYWx1ZShpbmRleCwgb3Bj
b2RlLCBvcGNvZGUgPT0gTG9hZEZsb2F0ID8gRG91YmxlIDogSW50MzIsIG9yaWdpbiwgcG9pbnRl
cikKKyAgICAgICAgLCBtX29mZnNldChvZmZzZXQpCisgICAgeworICAgICAgICBpZiAoIUFTU0VS
VF9ESVNBQkxFRCkgeworICAgICAgICAgICAgc3dpdGNoIChvcGNvZGUpIHsKKyAgICAgICAgICAg
IGNhc2UgTG9hZDhaOgorICAgICAgICAgICAgY2FzZSBMb2FkOFM6CisgICAgICAgICAgICBjYXNl
IExvYWQxNlo6CisgICAgICAgICAgICBjYXNlIExvYWQxNlM6CisgICAgICAgICAgICBjYXNlIExv
YWRGbG9hdDoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6Cisg
ICAgICAgICAgICAgICAgQVNTRVJUX05PVF9SRUFDSEVEKCk7CisgICAgICAgICAgICAgICAgYnJl
YWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBVc2UgdGhpcyBm
b3JtIGZvciBzdG9yZXMuCisgICAgTWVtb3J5VmFsdWUoCisgICAgICAgIHVuc2lnbmVkIGluZGV4
LCBPcGNvZGUgb3Bjb2RlLCBPcmlnaW4gb3JpZ2luLCBWYWx1ZSogdmFsdWUsIFZhbHVlKiBwb2lu
dGVyLAorICAgICAgICBpbnRwdHJfdCBvZmZzZXQgPSAwKQorICAgICAgICA6IFZhbHVlKGluZGV4
LCBvcGNvZGUsIFZvaWQsIG9yaWdpbiwgdmFsdWUsIHBvaW50ZXIpCisgICAgICAgICwgbV9vZmZz
ZXQob2Zmc2V0KQorICAgIHsKKyAgICAgICAgaWYgKCFBU1NFUlRfRElTQUJMRUQpIHsKKyAgICAg
ICAgICAgIHN3aXRjaCAob3Bjb2RlKSB7CisgICAgICAgICAgICBjYXNlIFN0b3JlODoKKyAgICAg
ICAgICAgIGNhc2UgU3RvcmUxNjoKKyAgICAgICAgICAgIGNhc2UgU3RvcmVGbG9hdDoKKyAgICAg
ICAgICAgIGNhc2UgU3RvcmU6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBk
ZWZhdWx0OgorICAgICAgICAgICAgICAgIEFTU0VSVF9OT1RfUkVBQ0hFRCgpOworICAgICAgICAg
ICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfTsKKworfSB9
IC8vIG5hbWVzcGFjZSBKU0M6OkIzCisKKyNlbmRpZiAvLyBCM01lbW9yeVZhbHVlX2gKKwpJbmRl
eDogU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzT3Bjb2RlLmNwcAo9PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBT
b3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNPcGNvZGUuY3BwCShyZXZpc2lvbiAwKQorKysgU291
cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzT3Bjb2RlLmNwcAkod29ya2luZyBjb3B5KQpAQCAtMCww
ICsxLDQ3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE1IEFwcGxlIEluYy4gQWxsIHJpZ2h0
cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQg
YmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1p
dHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoK
KyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJv
dmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0
aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5
IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0
aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRo
ZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdp
dGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZ
IEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJS
QU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdB
UlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIK
KyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMu
IE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwg
SU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1B
R0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNV
QlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJP
RklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5Z
IFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElB
QklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBB
UklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVW
RU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisK
KyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJCM09wY29kZS5oIgorCisjaW5jbHVkZSA8
d3RmL1ByaW50U3RyZWFtLmg+CisKK25hbWVzcGFjZSBXVEYgeworCit1c2luZyBuYW1lc3BhY2Ug
SlNDOjpCMzsKKwordm9pZCBwcmludEludGVybmFsKFByaW50U3RyZWFtJiBvdXQsIE9wY29kZSBv
cGNvZGUpCit7CisgICAgc3dpdGNoIChvcGNvZGUpIHsKKyAgICBjYXNlIElkZW50aXR5OgorICAg
ICAgICBvdXQucHJpbnQoIklkZW50aXR5Iik7CisgICAgICAgIHJldHVybjsKKyAgICAgICAgLy8g
RklYTUUKKyAgICB9CisgICAgUkVMRUFTRV9BU1NFUlRfTk9UX1JFQUNIRUQoKTsKK30KKworfSAv
LyBuYW1lc3BhY2UgV1RGCisKSW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM09wY29k
ZS5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM09wY29kZS5oCShy
ZXZpc2lvbiAwKQorKysgU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzT3Bjb2RlLmgJKHdvcmtp
bmcgY29weSkKQEAgLTAsMCArMSwxOTQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTUgQXBw
bGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1
c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZp
Y2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRp
b25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11
c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9m
IGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJp
YnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0
CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5n
IGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRl
cmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdB
UkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVT
UyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBU
SEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1Mg
Rk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5U
IFNIQUxMIEFQUExFIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBE
SVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBD
T05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICog
UFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0Us
IERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIg
Q0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09O
VFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5D
RSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0Yg
VEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNI
IERBTUFHRS4gCisgKi8KKworI2lmbmRlZiBCM09wY29kZV9oCisjZGVmaW5lIEIzT3Bjb2RlX2gK
KworI2luY2x1ZGUgPHd0Zi9TdGRMaWJFeHRyYXMuaD4KKworbmFtZXNwYWNlIEpTQyB7IG5hbWVz
cGFjZSBCMyB7CisKK2VudW0gT3Bjb2RlIDogaW50MTZfdCB7CisgICAgLy8gUG9seW1vcnBoaWMg
aWRlbnRpdHksIHVzYWJsZSB3aXRoIGFueSB2YWx1ZSB0eXBlLgorICAgIElkZW50aXR5LAorCisg
ICAgLy8gQ29uc3RhbnRzLiBVc2UgdGhlIENvbnN0VmFsdWUqIGNsYXNzZXMuIENvbnN0YW50cyBl
eGlzdCBpbiB0aGUgY29udHJvbCBmbG93LCBzbyB0aGF0IHdlIGNhbgorICAgIC8vIHJlYXNvbiBh
Ym91dCB3aGVyZSB3ZSB3b3VsZCBjb25zdHJ1Y3QgdGhlbS4gTGFyZ2UgY29uc3RhbnRzIGFyZSBl
eHBlbnNpdmUgdG8gY3JlYXRlLgorICAgIENvbnN0MzIsCisgICAgQ29uc3Q2NCwKKyAgICBDb25z
dERvdWJsZSwKKworICAgIC8vIFRoZSBtYWdpY2FsIHN0YWNrIHNsb3QuIFRoaXMgaXMgdmlld2Vk
IGFzIGV4ZWN1dGluZyBhdCB0aGUgdG9wIG9mIHRoZSBwcm9ncmFtIHJlZ2FyZGxlc3Mgb2YKKyAg
ICAvLyB3aGVyZSBpbiBjb250cm9sIGZsb3cgeW91IHB1dCBpdC4gRWFjaCBpbnN0YW5jZSBvZiBh
IFN0YWNrU2xvdCBWYWx1ZSBnZXRzIGEgZGlzam9pbnQgcmFuZ2Ugb2YKKyAgICAvLyBzdGFjayBt
ZW1vcnkuIFVzZSB0aGUgU3RhY2tTbG90VmFsdWUgY2xhc3MuCisgICAgU3RhY2tTbG90LAorCisg
ICAgLy8gVGhlIG1hZ2ljYWwgYXJndW1lbnQgcmVnaXN0ZXIuIFRoaXMgaXMgdmlld2VkIGFzIGV4
ZWN1dGluZyBhdCB0aGUgdG9wIG9mIHRoZSBwcm9ncmFtCisgICAgLy8gcmVnYXJkbGVzcyBvZiB3
aGVyZSBpbiBjb250cm9sIGZsb3cgeW91IHB1dCBpdCwgYW5kIHRoZSBjb21waWxlciB0YWtlcyBj
YXJlIHRvIGVuc3VyZSB0aGF0IHdlCisgICAgLy8gZG9uJ3QgY2xvYmJlciB0aGUgdmFsdWUgYnkg
cmVnaXN0ZXIgYWxsb2NhdGlvbiBvciBjYWxscyAoZWl0aGVyIGJ5IHNhdmluZyB0aGUgYXJndW1l
bnQgdG8gdGhlCisgICAgLy8gc3RhY2sgb3IgcHJlc2VydmluZyBpdCBpbiBhIGNhbGxlZS1zYXZl
IHJlZ2lzdGVyKS4gVXNlIHRoZSBBcmd1bWVudFJlZ1ZhbHVlIGNsYXNzLiBUaGUgcmV0dXJuCisg
ICAgLy8gdHlwZSBpcyBlaXRoZXIgcG9pbnRlcigpIChmb3IgR1BScykgb3IgRG91YmxlIChmb3Ig
RlBScykuCisgICAgQXJndW1lbnRSZWcsCisKKyAgICAvLyBUaGUgZnJhbWUgcG9pbnRlci4gWW91
IGNhbiBwdXQgdGhpcyBhbnl3aGVyZSBpbiBjb250cm9sIGZsb3cgYnV0IGl0IHdpbGwgYWx3YXlz
IHlpZWxkIHRoZQorICAgIC8vIGZyYW1lIHBvaW50ZXIsIHdpdGggYSBjYXZlYXQ6IGlmIG91ciBj
b21waWxlciBjaGFuZ2VzIHRoZSBmcmFtZSBwb2ludGVyIHRlbXBvcmFyaWx5IGZvciBzb21lCisg
ICAgLy8gc2lsbHkgcmVhc29uLCB0aGUgRnJhbWVQb2ludGVyIGludHJpbnNpYyB3aWxsIHJldHVy
biB3aGVyZSB0aGUgZnJhbWUgcG9pbnRlciAqc2hvdWxkKiBiZSBub3QKKyAgICAvLyB3aGVyZSBp
dCBoYXBwZW5zIHRvIGJlIHJpZ2h0IG5vdy4KKyAgICBGcmFtZVBvaW50ZXIsCisKKyAgICAvLyBQ
b2x5bW9ycGhpYyBtYXRoLCB1c2FibGUgd2l0aCBhbnkgdmFsdWUgdHlwZS4KKyAgICBBZGQsCisg
ICAgU3ViLAorICAgIE11bCwKKyAgICBEaXYsCisKKyAgICAvLyBJbnRlZ2VyIG1hdGguCisgICAg
Q2hpbGxEaXYsIC8vIGRvZXNuJ3QgdHJhcCBldmVyLCBiZWhhdmVzIGxpa2UgSlMgKHgveSl8MC4K
KyAgICBNb2QsCisgICAgQml0QW5kLAorICAgIEJpdE9yLAorICAgIEJpdFhvciwKKyAgICBTaGws
CisgICAgU1NociwKKyAgICBaU2hyLAorCisgICAgLy8gQ2FzdHMgYW5kIHN1Y2guCisgICAgLy8g
VGFrZXMgYW5kIHJldHVybnMgSW50MzI6CisgICAgU0V4dDgsCisgICAgU0V4dDE2LAorICAgIC8v
IFRha2VzIEludDMyIGFuZCByZXR1cm5zIEludDY0OgorICAgIFNFeHQzMiwKKyAgICBaRXh0MzIs
CisgICAgLy8gVGFrZXMgYW5kIHJldHVybnMgRG91YmxlOgorICAgIEZSb3VuZCwKKyAgICAvLyBU
YWtlcyBpbnRzIGFuZCByZXR1cm5zIERvdWJsZToKKyAgICBJVG9ELAorICAgIC8vIFRha2VzIERv
dWJsZSBhbmQgcmV0dXJucyBJbnQzMjoKKyAgICBEVG9JMzIsCisKKyAgICAvLyBQb2x5bW9ycGhp
YyBjb21wYXJpc29ucywgdXNhYmxlIHdpdGggYW55IHZhbHVlIHR5cGUuIFJldHVybnMgaW50MzIg
MCBvciAxLiBOb3RlIHRoYXQgIk5vdCIKKyAgICAvLyBpcyBqdXN0IEVxdWFsKHgsIDApLgorICAg
IEVxdWFsLAorICAgIE5vdEVxdWFsLAorICAgIExlc3NUaGFuLAorICAgIEdyZWF0ZXJUaGFuLAor
ICAgIExlc3NFcXVhbCwKKyAgICBHcmVhdGVyRXF1YWwsCisKKyAgICAvLyBJbnRlZ2VyIGNvbXBh
cmlzb25zLiBSZXR1cm5zIGludDMyIDAgb3IgMS4KKyAgICBBYm92ZSwKKyAgICBCZWxvdywKKyAg
ICBBYm92ZUVxdWFsCisgICAgQmVsb3dFcXVhbCwKKworICAgIC8vIE1lbW9yeSBsb2Fkcy4gT3Bj
b2RlIGluZGljYXRlcyBob3cgd2UgbG9hZCBhbmQgdGhlIGxvYWRlZCB0eXBlLiBUaGVzZSB1c2Ug
TWVtb3J5VmFsdWUuCisgICAgLy8gVGhlc2UgcmV0dXJuIEludDMyOgorICAgIExvYWQ4WiwKKyAg
ICBMb2FkOFMsCisgICAgTG9hZDE2WiwKKyAgICBMb2FkMTZTLAorICAgIC8vIFRoaXMgcmV0dXJu
cyBEb3VibGU6CisgICAgTG9hZEZsb2F0LAorICAgIC8vIFRoaXMgcmV0dXJuIHdoYXRldmVyIHRo
ZSByZXR1cm4gdHlwZSBpczoKKyAgICBMb2FkLAorCisgICAgLy8gTWVtb3J5IHN0b3Jlcy4gT3Bj
b2RlIGluZGljYXRlcyBob3cgdGhlIHZhbHVlIGlzIHN0b3JlZC4gVGhlc2UgdXNlIE1lbW9yeVZh
bHVlLgorICAgIC8vIFRoZXNlIHRha2UgYW4gSW50MzIgdmFsdWU6CisgICAgU3RvcmU4LAorICAg
IFN0b3JlMTYsCisgICAgLy8gVGhpcyB0YWtlcyBhIERvdWJsZSB2YWx1ZToKKyAgICBTdG9yZUZs
b2F0LAorICAgIC8vIFRoaXMgaXMgYSBwb2x5bW9ycGhpYyBzdG9yZSBmb3IgSW50MzIsIEludDY0
LCBhbmQgRG91YmxlOgorICAgIFN0b3JlLAorCisgICAgLy8gVGhpcyBpcyBhIHJlZ3VsYXIgb3Jk
aW5hcnkgQyBmdW5jdGlvbiBjYWxsLCB1c2luZyB0aGUgc3lzdGVtIEMgY2FsbGluZyBjb252ZW50
aW9uLiBNYWtlIHN1cmUKKyAgICAvLyB0aGF0IHRoZSBhcmd1bWVudHMgYXJlIHBhc3NlZCB1c2lu
ZyB0aGUgcmlnaHQgdHlwZXMuCisgICAgQ0NhbGwsCisKKyAgICAvLyBUaGlzIGlzIGEgcGF0Y2hw
b2ludC4gVXNlIHRoZSBQYXRjaHBvaW50VmFsdWUgY2xhc3MuIFRoaXMgaXMgdmlld2VkIGFzIGJl
aGF2aW5nIGxpa2UgYSBjYWxsLAorICAgIC8vIGJ1dCBvbmx5IGVtaXRzIGNvZGUgdmlhIGEgY29k
ZSBnZW5lcmF0aW9uIGNhbGxiYWNrLiBUaGF0IGNhbGxiYWNrIGdldHMgdG8gZW1pdCBjb2RlIGlu
bGluZS4KKyAgICAvLyBZb3UgY2FuIHBhc3MgYSBzdGFja21hcCBhbG9uZyB3aXRoIGNvbnN0cmFp
bnRzIG9uIGhvdyBlYWNoIHN0YWNrbWFwIGFyZ3VtZW50IG11c3QgYmUgcGFzc2VkLgorICAgIC8v
IEl0J3MgbGVnYWwgdG8gcmVxdWVzdCB0aGF0IGEgc3RhY2ttYXAgYXJndW1lbnQgaXMgaW4gc29t
ZSByZWdpc3RlciBhbmQgaXQncyBsZWdhbCB0byByZXF1ZXN0CisgICAgLy8gdGhhdCBhIHN0YWNr
bWFwIGFyZ3VtZW50IGlzIGF0IHNvbWUgb2Zmc2V0IGZyb20gdGhlIHRvcCBvZiB0aGUgYXJndW1l
bnQgcGFzc2luZyBhcmVhIG9uIHRoZQorICAgIC8vIHN0YWNrLgorICAgIFBhdGNocG9pbnQsCisK
KyAgICAvLyBDaGVja2VkIG1hdGguIFVzZSB0aGUgQ2hlY2tlZE1hdGhWYWx1ZSBjbGFzcy4gTGlr
ZSBhIFBhdGNocG9pbnQsIHRoaXMgdGFrZXMgYSBjb2RlIGdlbmVyYXRpb24KKyAgICAvLyBjYWxs
YmFjay4gVGhhdCBjYWxsYmFjayBnZXRzIHRvIGVtaXQgc29tZSBjb2RlIGFmdGVyIHRoZSBlcGls
b2d1ZSwgYW5kIGdldHMgdG8gbGluayB0aGUganVtcAorICAgIC8vIGZyb20gdGhlIGNoZWNrLCBh
bmQgdGhlIGNob2ljZSBvZiByZWdpc3RlcnMuIFlvdSBhbHNvIGdldCB0byBzdXBwbHkgYSBzdGFj
a21hcC4gTm90ZSB0aGF0IHlvdQorICAgIC8vIGFyZSBub3QgYWxsb3dlZCB0byBqdW1wIGJhY2sg
aW50byB0aGUgbWFpbmxpbmUgY29kZSBmcm9tIHlvdXIgc2xvdyBwYXRoLCBzaW5jZSB0aGUgY29t
cGlsZXIKKyAgICAvLyB3aWxsIGFzc3VtZSB0aGF0IHRoZSBleGVjdXRpb24gb2YgdGhlc2UgaW5z
dHJ1Y3Rpb25zIHByb3ZlcyB0aGF0IG92ZXJmbG93IGRpZG4ndCBoYXBwZW4uIEZvcgorICAgIC8v
IGV4YW1wbGUsIGlmIHlvdSBoYXZlIHR3byBDaGVja0FkZCdzOgorICAgIC8vCisgICAgLy8gYSA9
IENoZWNrQWRkKHgsIHkpCisgICAgLy8gYiA9IENoZWNrQWRkKHgsIHkpCisgICAgLy8KKyAgICAv
LyBUaGVuIGl0J3MgdmFsaWQgdG8gY2hhbmdlIHRoaXMgdG86CisgICAgLy8KKyAgICAvLyBhID0g
Q2hlY2tBZGQoeCwgeSkKKyAgICAvLyBiID0gSWRlbnRpdHkoYSkKKyAgICAvLworICAgIC8vIFRo
aXMgaXMgdmFsaWQgcmVnYXJkbGVzcyBvZiB0aGUgY2FsbGJhY2tzIHVzZWQgYnkgdGhlIHR3byBD
aGVja0FkZHMuIFRoZXkgbWF5IGhhdmUgZGlmZmVyZW50CisgICAgLy8gY2FsbGJhY2tzLiBZZXQs
IHRoaXMgdHJhbnNmb3JtYXRpb24gaXMgdmFsaWQgZXZlbiBpZiB0aGV5IGFyZSBkaWZmZXJlbnQg
YmVjYXVzZSB3ZSBrbm93IHRoYXQKKyAgICAvLyBhZnRlciB0aGUgZmlyc3QgQ2hlY2tBZGQgZXhl
Y3V0ZXMsIHRoZSBzZWNvbmQgQ2hlY2tBZGQgY291bGQgbm90IGhhdmUgcG9zc2libHkgdGFrZW4g
c2xvdworICAgIC8vIHBhdGguIFRoZXJlZm9yZSwgdGhlIHNlY29uZCBDaGVja0FkZCdzIGNhbGxi
YWNrIGlzIGlycmVsZXZhbnQuCisgICAgQ2hlY2tBZGQsCisgICAgQ2hlY2tTdWIsCisgICAgQ2hl
Y2tNdWwsCisKKyAgICAvLyBTU0Egc3VwcG9ydCwgaW4gdGhlIHN0eWxlIG9mIERGRyBTU0EuCisg
ICAgVXBzaWxvbiwgLy8gVGhpcyB1c2VzIHRoZSBVcHNpbG9uVmFsdWUgY2xhc3MuCisgICAgUGhp
LAorCisgICAgLy8gSnVtcC4gVXNlcyB0aGUgSnVtcFZhbHVlIGNsYXNzLgorICAgIEp1bXAsCisg
ICAgCisgICAgLy8gUG9seW1vcnBoaWMgYnJhbmNoLCB1c2FibGUgd2l0aCBhbnkgdmFsdWUgdHlw
ZS4gQnJhbmNoZXMgaWYgbm90IGVxdWFsIHRvIHplcm8uIFVzZXMgdGhlCisgICAgLy8gQnJhbmNo
VmFsdWUgY2xhc3MuCisgICAgQnJhbmNoLAorCisgICAgLy8gU3dpdGNoLiBTd2l0Y2hlcyBvdmVy
IGVpdGhlciBJbnQzMiBvciBJbnQ2NC4gVXNlcyB0aGUgU3dpdGNoVmFsdWUgY2xhc3MuCisgICAg
U3dpdGNoLAorCisgICAgLy8gUmV0dXJuLiBOb3RlIHRoYXQgQjMgcHJvY2VkdXJlcyBkb24ndCBr
bm93IHRoZWlyIHJldHVybiB0eXBlLCBzbyB0aGlzIGNhbiBqdXN0IHJldHVybiBhbnkKKyAgICAv
LyB0eXBlLgorICAgIFJldHVybiwKKworICAgIC8vIFRoaXMgaXMgYSB0ZXJtaW5hbCB0aGF0IGlu
ZGljYXRlcyB0aGF0IHdlIHdpbGwgbmV2ZXIgZ2V0IGhlcmUuCisgICAgT29wcworfTsKKworfSB9
IC8vIG5hbWVzcGFjZSBKU0M6OkIzCisKK25hbWVzcGFjZSBXVEYgeworCitjbGFzcyBQcmludFN0
cmVhbTsKKwordm9pZCBwcmludEludGVybmFsKFByaW50U3RyZWFtJiwgSlNDOjpCMzo6T3Bjb2Rl
KTsKKworfSAvLyBuYW1lc3BhY2UgV1RGCisKKyNlbmRpZiAvLyBCM09wY29kZV9oCisKSW5kZXg6
IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM09yaWdpbi5jcHAKPT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291
cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzT3JpZ2luLmNwcAkocmV2aXNpb24gMCkKKysrIFNvdXJj
ZS9KYXZhU2NyaXB0Q29yZS9iMy9CM09yaWdpbi5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTAsMCAr
MSwzNyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNSBBcHBsZSBJbmMuIEFsbCByaWdodHMg
cmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJp
bmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0
ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6Cisg
KiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3Zl
IGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhl
IGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBm
b3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhp
cyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUK
KyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRo
IHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBB
UFBMRSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFO
VElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJS
QU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisg
KiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBP
UgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElO
Q0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdF
UyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJT
VElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJ
VFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBU
SEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJ
TElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJ
U0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVO
IElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLiAKKyAqLworCisj
aW5jbHVkZSAiY29uZmlnLmgiCisjaW5jbHVkZSAiQjNPcmlnaW4uaCIKKworbmFtZXNwYWNlIEpT
QyB7IG5hbWVzcGFjZSBCMyB7CisKK3ZvaWQgT3JpZ2luOjpkdW1wKFByaW50U3RyZWFtJiBvdXQp
IGNvbnN0Cit7CisgICAgb3V0LnByaW50KCJPcmlnaW4oIiwgUmF3UG9pbnRlcihtX2RhdGEpLCAi
KSIpOworfQorCit9IH0gLy8gbmFtZXNwYWNlIEpTQzo6QjMKKwpJbmRleDogU291cmNlL0phdmFT
Y3JpcHRDb3JlL2IzL0IzT3JpZ2luLmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRD
b3JlL2IzL0IzT3JpZ2luLmgJKHJldmlzaW9uIDApCisrKyBTb3VyY2UvSmF2YVNjcmlwdENvcmUv
YjMvQjNPcmlnaW4uaAkod29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDU1IEBACisvKgorICogQ29w
eXJpZ2h0IChDKSAyMDE1IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBS
ZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9y
IHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRo
ZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9u
cyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBu
b3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWlt
ZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2Ug
dGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9u
cyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlv
biBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4K
KyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycn
IEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJV
VCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRB
QklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NM
QUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMg
QkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwK
KyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBO
T1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VS
VklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5U
RVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklM
SVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAo
SU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VU
IE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUg
UE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisKKyNpZm5kZWYgQjNPcmlnaW5faAor
I2RlZmluZSBCM09yaWdpbl9oCisKKyNpbmNsdWRlIDx3dGYvUHJpbnRTdHJlYW0uaD4KKworbmFt
ZXNwYWNlIEpTQyB7IG5hbWVzcGFjZSBCMyB7CisKKy8vIFdob2V2ZXIgZ2VuZXJhdGVzIEIzSVIg
Y2FuIGNob29zZSB0byBwdXQgb3JpZ2lucyBvbiB2YWx1ZXMuIFdoZW4geW91IGRvIHRoaXMsIEIz
IHdpbGwgYmUgYWJsZSB0bworLy8gYWNjb3VudCwgZG93biB0byB0aGUgbWFjaGluZSBjb2RlLCB3
aGljaCBpbnN0cnVjdGlvbiBjb3JyZXNwb25kcyB0byB3aGljaCBvcmlnaW4uIEIzCisvLyB0cmFu
c2Zvcm1hdGlvbnMgbXVzdCBwcmVzZXJ2ZSBPcmlnaW5zIGNhcmVmdWxseS4gSXQncyBhbiBlcnJv
ciB0byB3cml0ZSBhIHRyYW5zZm9ybWF0aW9uIHRoYXQKKy8vIGVpdGhlciBkcm9wcyBPcmlnaW5z
IG9yIGxpZXMgYWJvdXQgdGhlbS4KK2NsYXNzIE9yaWdpbiB7CitwdWJsaWM6CisgICAgZXhwbGlj
aXQgT3JpZ2luKGNvbnN0IHZvaWQqIGRhdGEgPSBudWxscHRyKQorICAgICAgICA6IG1fZGF0YShk
YXRhKQorICAgIHsKKyAgICB9CisKKyAgICBjb25zdCB2b2lkKiBkYXRhKCkgY29uc3QgeyByZXR1
cm4gbV9kYXRhOyB9CisKKyAgICB2b2lkIGR1bXAoUHJpbnRTdHJlYW0mKSBjb25zdDsKKyAgICAK
K3ByaXZhdGU6CisgICAgY29uc3Qgdm9pZCogbV9kYXRhOworfTsKKworfSB9IC8vIG5hbWVzcGFj
ZSBKU0M6OkIzCisKKyNlbmRpZiAvLyBCM09yaWdpbl9oCisKSW5kZXg6IFNvdXJjZS9KYXZhU2Ny
aXB0Q29yZS9iMy9CM1BhdGNocG9pbnRWYWx1ZS5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL0ph
dmFTY3JpcHRDb3JlL2IzL0IzUGF0Y2hwb2ludFZhbHVlLmNwcAkocmV2aXNpb24gMCkKKysrIFNv
dXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM1BhdGNocG9pbnRWYWx1ZS5jcHAJKHdvcmtpbmcgY29w
eSkKQEAgLTAsMCArMSw0MSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNSBBcHBsZSBJbmMu
IEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBz
b3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24s
IGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAq
IGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRh
aW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0
aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25z
IGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAg
IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xh
aW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBw
cm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQ
Uk9WSURFRCBCWSBBUFBMRSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElN
UExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICog
SU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQ
QVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwg
QVBQTEUgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwg
SU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVF
TlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJF
TUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwg
T1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQg
QU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwg
U1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9U
SEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNP
RlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdF
LiAKKyAqLworCisjaW5jbHVkZSAiY29uZmlnLmgiCisjaW5jbHVkZSAiQjNQYXRjaHBvaW50VmFs
dWUuaCIKKworbmFtZXNwYWNlIEpTQyB7IG5hbWVzcGFjZSBCMyB7CisKK1BhdGNocG9pbnRWYWx1
ZTo6flBhdGNocG9pbnRWYWx1ZSgpCit7Cit9CisKK3ZvaWQgUGF0Y2hwb2ludFZhbHVlOjpkdW1w
TWV0YShQcmludFN0cmVhbSYgb3V0KSBjb25zdAoreworICAgIG91dC5wcmludChzdGFja21hcCk7
Cit9CisKK30gfSAvLyBuYW1lc3BhY2UgSlNDOjpCMworCkluZGV4OiBTb3VyY2UvSmF2YVNjcmlw
dENvcmUvYjMvQjNQYXRjaHBvaW50VmFsdWUuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNj
cmlwdENvcmUvYjMvQjNQYXRjaHBvaW50VmFsdWUuaAkocmV2aXNpb24gMCkKKysrIFNvdXJjZS9K
YXZhU2NyaXB0Q29yZS9iMy9CM1BhdGNocG9pbnRWYWx1ZS5oCSh3b3JraW5nIGNvcHkpCkBAIC0w
LDAgKzEsNTcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTUgQXBwbGUgSW5jLiBBbGwgcmln
aHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFu
ZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVy
bWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0
OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBh
Ym92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5k
IHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5h
cnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2Us
IHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4g
dGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQg
d2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQg
QlkgQVBQTEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdB
UlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQg
V0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxB
UgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElO
Qy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNU
LCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERB
TUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0Yg
U1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQ
Uk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBB
TlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBM
SUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0Up
IEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwg
RVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8K
KworI2lmbmRlZiBCM1BhdGNocG9pbnRWYWx1ZV9oCisjZGVmaW5lIEIzUGF0Y2hwb2ludFZhbHVl
X2gKKworI2luY2x1ZGUgIkIzVmFsdWUuaCIKKyNpbmNsdWRlICJCM1N0YWNrbWFwLmgiCisKK25h
bWVzcGFjZSBKU0MgeyBuYW1lc3BhY2UgQjMgeworCitjbGFzcyBQYXRjaHBvaW50VmFsdWUgOiBw
dWJsaWMgVmFsdWUgeworcHVibGljOgorICAgIHN0YXRpYyBib29sIGFjY2VwdHMoT3Bjb2RlIG9w
Y29kZSkgeyByZXR1cm4gb3Bjb2RlID09IFBhdGNocG9pbnQ7IH0KKworICAgIH5QYXRjaHBvaW50
VmFsdWUoKTsKKworICAgIFN0YWNrbWFwIHN0YWNrbWFwOworCitwcm90ZWN0ZWQ6CisgICAgdm9p
ZCBkdW1wTWV0YShQcmludFN0cmVhbSYpIGNvbnN0IG92ZXJyaWRlOworCitwcml2YXRlOgorICAg
IGZyaWVuZCBjbGFzcyBQcm9jZWR1cmU7CisKKyAgICBQYXRjaHBvaW50VmFsdWUodW5zaWduZWQg
aW5kZXgsIFR5cGUgdHlwZSwgT3JpZ2luIG9yaWdpbikKKyAgICAgICAgOiBWYWx1ZShpbmRleCwg
UGF0Y2hwb2ludCwgdHlwZSwgb3JpZ2luKQorICAgIHsKKyAgICB9Cit9OworCit9IH0gLy8gbmFt
ZXNwYWNlIEpTQzo6QjMKKworI2VuZGlmIC8vIEIzUGF0Y2hwb2ludFZhbHVlX2gKKwpJbmRleDog
U291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzUHJvY2VkdXJlLmNwcAo9PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBT
b3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNQcm9jZWR1cmUuY3BwCShyZXZpc2lvbiAwKQorKysg
U291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzUHJvY2VkdXJlLmNwcAkod29ya2luZyBjb3B5KQpA
QCAtMCwwICsxLDU2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE1IEFwcGxlIEluYy4gQWxs
IHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJj
ZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJl
IHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJl
IG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0
aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25z
IGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4g
YmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90
aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVy
IGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3Zp
ZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJ
REVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElF
RCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBM
SUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJ
Q1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBM
RSBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJ
UkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElB
TCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5U
IE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgor
ICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQg
T04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJ
Q1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJX
SVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdB
UkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAor
ICovCisKKyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJCM1Byb2NlZHVyZS5oIgorCisj
aW5jbHVkZSAiQjNCYXNpY0Jsb2NrLmgiCisjaW5jbHVkZSAiQjNWYWx1ZS5oIgorCituYW1lc3Bh
Y2UgSlNDIHsgbmFtZXNwYWNlIEIzIHsKKworUHJvY2VkdXJlOjpQcm9jZWR1cmUoKQoreworfQor
CitQcm9jZWR1cmU6On5Qcm9jZWR1cmUoKQoreworfQorCitCYXNpY0Jsb2NrKiBQcm9jZWR1cmU6
OmFkZEJsb2NrKCkKK3sKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8QmFzaWNCbG9jaz4gYmxvY2sgPSBz
dGQ6Om1ha2VfdW5pcXVlPEJhc2ljQmxvY2s+KG1fYmxvY2tzLnNpemUoKSk7CisgICAgQmFzaWNC
bG9jayogcmVzdWx0ID0gYmxvY2suZ2V0KCk7CisgICAgbV9ibG9ja3MuYXBwZW5kKFdURjo6bW92
ZShibG9jaykpOworICAgIHJldHVybiByZXN1bHQ7Cit9CisKK3ZvaWQgUHJvY2VkdXJlOjpkdW1w
KFByaW50U3RyZWFtJiBvdXQpIGNvbnN0Cit7CisgICAgZm9yIChCYXNpY0Jsb2NrKiBibG9jayA6
ICp0aGlzKQorICAgICAgICBvdXQucHJpbnQoZGVlcER1bXAoYmxvY2spKTsKK30KKworfSB9IC8v
IG5hbWVzcGFjZSBKU0M6OkIzCkluZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNQcm9j
ZWR1cmUuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNQcm9jZWR1
cmUuaAkocmV2aXNpb24gMCkKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM1Byb2NlZHVy
ZS5oCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsMTc3IEBACisvKgorICogQ29weXJpZ2h0IChD
KSAyMDE1IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1
dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQK
KyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dp
bmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3Vy
Y2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRo
aXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAy
LiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3Zl
IGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhl
IGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Ig
b3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBU
SElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkK
KyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElN
SVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFO
RCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJ
TiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxF
IEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1Q
TEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRF
RCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExP
U1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9O
KSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVU
SEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5H
IE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBV
U0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJ
VFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisKKyNpZm5kZWYgQjNQcm9jZWR1cmVfaAorI2RlZmlu
ZSBCM1Byb2NlZHVyZV9oCisKKyNpbmNsdWRlIDx3dGYvQmFnLmg+CisjaW5jbHVkZSA8d3RmL0Zh
c3RNYWxsb2MuaD4KKyNpbmNsdWRlIDx3dGYvTm9uY29weWFibGUuaD4KKyNpbmNsdWRlIDx3dGYv
VmVjdG9yLmg+CisKK25hbWVzcGFjZSBKU0MgeyBuYW1lc3BhY2UgQjMgeworCitjbGFzcyBCYXNp
Y0Jsb2NrOworY2xhc3MgVmFsdWU7CisKK2NsYXNzIFByb2NlZHVyZSB7CisgICAgV1RGX01BS0Vf
Tk9OQ09QWUFCTEUoUHJvY2VkdXJlKTsKKyAgICBXVEZfTUFLRV9GQVNUX0FMTE9DQVRFRDsKK3B1
YmxpYzoKKworICAgIFByb2NlZHVyZSgpOworICAgIH5Qcm9jZWR1cmUoKTsKKworICAgIEJhc2lj
QmxvY2sqIGFkZEJsb2NrKCk7CisgICAgCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVmFsdWVUeXBl
LCB0eXBlbmFtZS4uLiBBcmd1bWVudHM+CisgICAgVmFsdWVUeXBlKiBhZGQoQXJndW1lbnRzLi4u
KTsKKworICAgIHZvaWQgZHVtcChQcmludFN0cmVhbSYpIGNvbnN0OworCisgICAgdW5zaWduZWQg
c2l6ZSgpIGNvbnN0IHsgcmV0dXJuIG1fYmxvY2tzLnNpemUoKTsgfQorICAgIEJhc2ljQmxvY2sq
IGF0KHVuc2lnbmVkIGluZGV4KSBjb25zdCB7IHJldHVybiBtX2Jsb2Nrc1tpbmRleF07IH0KKyAg
ICBCYXNpY0Jsb2NrKiBvcGVyYXRvcltdKHVuc2lnbmVkIGluZGV4KSBjb25zdCB7IHJldHVybiBh
dChpbmRleCk7IH0KKworICAgIGNsYXNzIGl0ZXJhdG9yIHsKKyAgICBwdWJsaWM6CisgICAgICAg
IGl0ZXJhdG9yKCk6CisgICAgICAgICAgICA6IG1fcHJvY2VkdXJlKG51bGxwdHIpCisgICAgICAg
ICAgICAsIG1faW5kZXgoMCkKKyAgICAgICAgeworICAgICAgICB9CisKKyAgICAgICAgaXRlcmF0
b3IoUHJvY2VkdXJlJiBwcm9jZWR1cmUsIHVuc2lnbmVkIGluZGV4KQorICAgICAgICAgICAgOiBt
X3Byb2NlZHVyZSgmcHJvY2VkdXJlKQorICAgICAgICAgICAgLCBtX2luZGV4KGluZGV4KQorICAg
ICAgICB7CisgICAgICAgIH0KKworICAgICAgICBCYXNpY0Jsb2NrKiBvcGVyYXRvciooKQorICAg
ICAgICB7CisgICAgICAgICAgICByZXR1cm4gbV9wcm9jZWR1cmUtPmF0KG1faW5kZXgpOworICAg
ICAgICB9CisKKyAgICAgICAgaXRlcmF0b3ImIG9wZXJhdG9yKysoKQorICAgICAgICB7CisgICAg
ICAgICAgICBtX2luZGV4ID0gZmluZE5leHQobV9pbmRleCArIDEpOworICAgICAgICAgICAgcmV0
dXJuICp0aGlzOworICAgICAgICB9CisKKyAgICAgICAgYm9vbCBvcGVyYXRvcj09KGNvbnN0IGl0
ZXJhdG9yJiBvdGhlcikgY29uc3QKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIG1faW5k
ZXggPT0gb3RoZXIubV9pbmRleDsKKyAgICAgICAgfQorCisgICAgICAgIGJvb2wgb3BlcmF0b3Ih
PShjb25zdCBpdGVyYXRvciYgb3RoZXIpIGNvbnN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHJl
dHVybiAhKCp0aGlzID09IG90aGVyKTsKKyAgICAgICAgfQorCisgICAgcHJpdmF0ZToKKyAgICAg
ICAgdW5zaWduZWQgZmluZE5leHQodW5zaWduZWQgaW5kZXgpCisgICAgICAgIHsKKyAgICAgICAg
ICAgIHdoaWxlIChpbmRleCA8IG1fcHJvY2VkdXJlLT5zaXplKCkgJiYgIW1fcHJvY2VkdXJlLT5h
dChpbmRleCkpCisgICAgICAgICAgICAgICAgaW5kZXgrKzsKKyAgICAgICAgICAgIHJldHVybiBp
bmV4OworICAgICAgICB9CisKKyAgICAgICAgUHJvY2VkdXJlKiBtX3Byb2NlZHVyZTsKKyAgICAg
ICAgdW5zaWduZWQgbV9pbmRleDsKKyAgICB9OworCisgICAgaXRlcmF0b3IgYmVnaW4oKSBjb25z
dCB7IHJldHVybiBpdGVyYXRvcigqdGhpcywgMCk7IH0KKyAgICBpdGVyYXRvciBlbmQoKSBjb25z
dCB7IHJldHVybiBpdGVyYXRvcigqdGhpcywgbnVtQmxvY2tzKCkpOyB9CisKKyAgICBjbGFzcyBW
YWx1ZXNDb2xsZWN0aW9uIHsKKyAgICBwdWJsaWM6CisgICAgICAgIFZhbHVlc0NvbGxlY3Rpb24o
UHJvY2VkdXJlJiBwcm9jZWR1cmUpCisgICAgICAgICAgICA6IG1fcHJvY2VkdXJlKHByb2NlZHVy
ZSkKKyAgICAgICAgeworICAgICAgICB9CisKKyAgICAgICAgY2xhc3MgaXRlcmF0b3IgeworICAg
ICAgICBwdWJsaWM6CisgICAgICAgICAgICBpdGVyYXRvcigpOgorICAgICAgICAgICAgICAgIDog
bV9wcm9jZWR1cmUobnVsbHB0cikKKyAgICAgICAgICAgICAgICAsIG1faW5kZXgoMCkKKyAgICAg
ICAgICAgIHsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaXRlcmF0b3IoUHJvY2VkdXJl
JiBwcm9jZWR1cmUsIHVuc2lnbmVkIGluZGV4KQorICAgICAgICAgICAgICAgIDogbV9wcm9jZWR1
cmUoJnByb2NlZHVyZSkKKyAgICAgICAgICAgICAgICAsIG1faW5kZXgoaW5kZXgpCisgICAgICAg
ICAgICB7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIFZhbHVlKiBvcGVyYXRvciooKQor
ICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBtX3Byb2NlZHVyZS0+YmxvY2so
bV9pbmRleCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGl0ZXJhdG9yJiBvcGVyYXRv
cisrKCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtX2luZGV4Kys7CisgICAgICAg
ICAgICAgICAgcmV0dXJuICp0aGlzOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBib29s
IG9wZXJhdG9yPT0oY29uc3QgaXRlcmF0b3ImIG90aGVyKSBjb25zdAorICAgICAgICAgICAgewor
ICAgICAgICAgICAgICAgIHJldHVybiBtX2luZGV4ID09IG90aGVyLm1faW5kZXg7CisgICAgICAg
ICAgICB9CisKKyAgICAgICAgICAgIGJvb2wgb3BlcmF0b3IhPShjb25zdCBpdGVyYXRvciYgb3Ro
ZXIpIGNvbnN0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuICEoKnRoaXMg
PT0gb3RoZXIpOworICAgICAgICAgICAgfQorCisgICAgICAgIHByaXZhdGU6CisKKyAgICAgICAg
ICAgIFByb2NlZHVyZSogbV9wcm9jZWR1cmU7CisgICAgICAgICAgICB1bnNpZ25lZCBtX2luZGV4
OworICAgICAgICB9OworCisgICAgICAgIGl0ZXJhdG9yIGJlZ2luKCkgY29uc3QgeyByZXR1cm4g
aXRlcmF0b3IobV9wcm9jZWR1cmUsIDApOyB9CisgICAgICAgIGl0ZXJhdG9yIGVuZCgpIGNvbnN0
IHsgcmV0dXJuIGl0ZXJhdG9yKG1fcHJvY2VkdXJlLCBtX3Byb2NlZHVyZS5tX3ZhbHVlcy5zaXpl
KCkpOyB9CisKKyAgICAgICAgdW5zaWduZWQgc2l6ZSgpIGNvbnN0IHsgcmV0dXJuIG1fcHJvY2Vk
dXJlLm1fdmFsdWVzLnNpemUoKTsgfQorICAgICAgICBWYWx1ZSogYXQodW5zaWduZWQgaW5kZXgp
IGNvbnN0IHsgcmV0dXJuIG1fcHJvY2VkdXJlLm1fdmFsdWVzW2luZGV4XTsgfQorICAgICAgICBW
YWx1ZSogb3BlcmF0b3JbXSh1bnNpZ25lZCBpbmRleCkgY29uc3QgeyByZXR1cm4gYXQoaW5kZXgp
OyB9CisgICAgICAgIAorICAgIHByaXZhdGU6CisgICAgICAgIFByb2NlZHVyZSYgbV9wcm9jZWR1
cmU7CisgICAgfTsKKworICAgIFZhbHVlc0NvbGxlY3Rpb24gdmFsdWVzKCkgeyByZXR1cm4gVmFs
dWVzQ29sbGVjdGlvbigqdGhpcyk7IH0KKworcHJpdmF0ZToKKyAgICBWZWN0b3I8c3RkOjp1bmlx
dWVfcHRyPEJhc2ljQmxvY2s+PiBtX2Jsb2NrczsKKyAgICBWZWN0b3I8c3RkOjp1bmlxdWVfcHRy
PFZhbHVlPj4gbV92YWx1ZXM7Cit9OworCit9IH0gLy8gbmFtZXNwYWNlIEpTQzo6QjMKKworI2Vu
ZGlmIC8vIEIzUHJvY2VkdXJlX2gKKwpJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0Iz
UHJvY2VkdXJlSW5saW5lcy5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9i
My9CM1Byb2NlZHVyZUlubGluZXMuaAkocmV2aXNpb24gMCkKKysrIFNvdXJjZS9KYXZhU2NyaXB0
Q29yZS9iMy9CM1Byb2NlZHVyZUlubGluZXMuaAkod29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDQ2
IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE1IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNl
cnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5
IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBw
cm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEu
IFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29w
eXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9s
bG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0g
bXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxp
c3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICog
ICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhl
IGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExF
IElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVT
LCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJ
RVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBV
UlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SCisg
KiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURF
TlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJ
TkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRV
VEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsg
T1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9S
WQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZ
LCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5H
IElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYg
QURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisKKyNpZm5k
ZWYgQjNQcm9jZWR1cmVJbmxpbmVzX2gKKyNkZWZpbmUgQjNQcm9jZWR1cmVJbmxpbmVzX2gKKwor
I2luY2x1ZGUgIkIzQmFzaWNCbG9jay5oIgorI2luY2x1ZGUgIkIzUHJvY2VkdXJlLmgiCisKK25h
bWVzcGFjZSBKU0MgeyBuYW1lc3BhY2UgQjMgeworCit0ZW1wbGF0ZTx0eXBlbmFtZSBWYWx1ZVR5
cGUsIHR5cGVuYW1lLi4uIEFyZ3VtZW50cz4KK1ZhbHVlVHlwZSogUHJvY2VkdXJlOjphZGQoQXJn
dWVudHMuLi4gYXJndW1lbnRzKQoreworICAgIHN0ZDo6dW5pcXVlX3B0cjxWYWx1ZVR5cGU+IHZh
bHVlKG5ldyBWYWx1ZVR5cGUobV92YWx1ZXMuc2l6ZSgpLCBhcmd1bWVudHMuLi4pKTsKKyAgICBW
YWx1ZVR5cGUqIHJlc3VsdCA9IHZhbHVlLmdldCgpOworICAgIG1fdmFsdWVzLmFwcGVuZChXVEY6
Om1vdmUodmFsdWUpKTsKKyAgICByZXR1cm4gcmVzdWx0OworfQorCit9IH0gLy8gbmFtZXNwYWNl
IEpTQzo6QjMKKworI2VuZGlmIC8vIEIzUHJvY2VkdXJlSW5saW5lc19oCisKSW5kZXg6IFNvdXJj
ZS9KYXZhU2NyaXB0Q29yZS9iMy9CM1N0YWNrU2xvdFZhbHVlLmNwcAo9PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBT
b3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNTdGFja1Nsb3RWYWx1ZS5jcHAJKHJldmlzaW9uIDAp
CisrKyBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNTdGFja1Nsb3RWYWx1ZS5jcHAJKHdvcmtp
bmcgY29weSkKQEAgLTAsMCArMSw0MSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNSBBcHBs
ZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVz
ZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmlj
YXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlv
bnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVz
dCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2Yg
Y29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmli
dXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQK
KyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcg
ZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVy
aWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FS
RSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNT
IE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRI
RQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBG
T1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQg
U0hBTEwgQVBQTEUgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJ
UkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENP
TlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQ
Uk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwg
REFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBD
QVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05U
UkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNF
IE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBU
SElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0gg
REFNQUdFLiAKKyAqLworCisjaW5jbHVkZSAiY29uZmlnLmgiCisjaW5jbHVkZSAiQjNTdGFja1Ns
b3RWYWx1ZS5oIgorCituYW1lc3BhY2UgSlNDIHsgbmFtZXNwYWNlIEIzIHsKKworU3RhY2tTbG90
VmFsdWU6On5TdGFja1Nsb3RWYWx1ZSgpCit7Cit9CisKK3ZvaWQgU3RhY2tTbG90VmFsdWU6OmR1
bXBNZXRhKFByaW50U3RyZWFtJiBvdXQpIGNvbnN0Cit7CisgICAgb3V0LnByaW50KCJieXRlU2l6
ZSA9ICIsIG1fYnl0ZVNpemUpOworfQorCit9IH0gLy8gbmFtZXNwYWNlIEpTQzo6QjMKKwpJbmRl
eDogU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzU3RhY2tTbG90VmFsdWUuaAo9PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNTdGFja1Nsb3RWYWx1ZS5oCShyZXZpc2lv
biAwKQorKysgU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzU3RhY2tTbG90VmFsdWUuaAkod29y
a2luZyBjb3B5KQpAQCAtMCwwICsxLDY1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE1IEFw
cGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQg
dXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlm
aWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0
aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBt
dXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBv
ZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3Ry
aWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdo
dAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2lu
ZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0
ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRX
QVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJF
U1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywg
VEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNT
IEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVO
VCBTSEFMTCBBUFBMRSBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkg
RElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1Ig
Q09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAq
IFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNF
LCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVS
IENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENP
TlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VO
Q0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9G
IFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VD
SCBEQU1BR0UuIAorICovCisKKyNpZm5kZWYgQjNTdGFja1Nsb3RWYWx1ZV9oCisjZGVmaW5lIEIz
U3RhY2tTbG90VmFsdWVfaAorCisjaW5jbHVkZSAiQjNWYWx1ZS5oIgorCituYW1lc3BhY2UgSlND
IHsgbmFtZXNwYWNlIEIzIHsKKworY2xhc3MgU3RhY2tTbG90VmFsdWUgOiBwdWJsaWMgVmFsdWUg
eworcHVibGljOgorICAgIHN0YXRpYyBib29sIGFjY2VwdHMoT3Bjb2RlIG9wY29kZSkgeyByZXR1
cm4gb3Bjb2RlID09IFN0YWNrU2xvdDsgfQorCisgICAgflN0YWNrU2xvdFZhbHVlKCk7CisKKyAg
ICB1bnNpZ25lZCBieXRlU2l6ZSgpIGNvbnN0IHsgcmV0dXJuIG1fYnl0ZVNpemU7IH0KKworICAg
IC8vIFRoaXMgZ2V0cyBhc3NpZ25lZCBhdCB0aGUgZW5kIG9mIGNvbXBpbGF0aW9uLiBZb3UgY2Fu
bm90IHJlbHkgb24gaXQgaGF2aW5nIGEgbWVhbmluZ2Z1bAorICAgIC8vIHZhbHVlIHdoaWxlIHRo
ZSBjb21waWxlciBpcyBydW5uaW5nLgorICAgIGludHB0cl90IG9mZnNldEZyb21GUCgpIGNvbnN0
IHsgcmV0dXJuIG1fb2Zmc2V0RnJvbUZQOyB9CisKK3Byb3RlY3RlZDoKKyAgICB2b2lkIGR1bXBN
ZXRhKFByaW50U3RyZWFtJikgY29uc3Qgb3ZlcnJpZGU7CisKK3ByaXZhdGU6CisgICAgZnJpZW5k
IGNsYXNzIFByb2NlZHVyZTsKKworICAgIFN0YWNrU2xvdFZhbHVlKHVuc2lnbmVkIGluZGV4LCBP
cmlnaW4gb3JpZ2luLCB1bnNpZ25lZCBieXRlU2l6ZSkKKyAgICAgICAgOiBWYWx1ZShpbmRleCwg
U3RhY2tTbG90LCBwb2ludGVyKCksIG9yaWdpbikKKyAgICAgICAgLCBtX2J5dGVTaXplKGJ5dGVT
aXplKQorICAgICAgICAsIG1fb2Zmc2V0RnJvbUZQKDApCisgICAgeworICAgIH0KKworICAgIHVu
c2lnbmVkIG1fYnl0ZVNpemU7CisgICAgaW50cHRyX3QgbV9vZmZzZXRGcm9tRlA7Cit9OworCit9
IH0gLy8gbmFtZXNwYWNlIEpTQzo6QjMKKworI2VuZGlmIC8vIEIzU3RhY2tTbG90VmFsdWVfaAor
CkluZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNTdGFja21hcC5jcHAKPT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PQotLS0gU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzU3RhY2ttYXAuY3BwCShyZXZpc2lvbiAw
KQorKysgU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzU3RhY2ttYXAuY3BwCSh3b3JraW5nIGNv
cHkpCkBAIC0wLDAgKzEsMzkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTUgQXBwbGUgSW5j
LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4g
c291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9u
LCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisg
KiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0
YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRp
dGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9u
cyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAg
ICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2Ns
YWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMg
cHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMg
UFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJ
TVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAq
IElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEg
UEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxM
IEFQUExFIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1Qs
IElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFV
RU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VS
RU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEs
IE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VE
IEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1Qs
IFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBP
VEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBT
T0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFH
RS4gCisgKi8KKworI2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgIkIzU3RhY2ttYXAuaCIK
KworbmFtZXNwYWNlIEpTQyB7IG5hbWVzcGFjZSBCMyB7CisKK3ZvaWQgU3RhY2ttYXA6OmR1bXAo
UHJpbnRTdHJlYW0mIG91dCkgY29uc3QKK3sKKyAgICBvdXQucHJpbnQoCisgICAgICAgICJyZXBz
ID0gIiwgbGlzdER1bXAobV9yZXBzKSwgIiwgZ2VuZXJhdG9yID0gIiwgUmF3UG9pbnRlcihtX2dl
bmVyYXRvci5nZXQoKSksCisgICAgICAgICIsIGNsb2JiZXJlZCA9ICIsIG1fY2xvYmJlcmVkLCAi
LCB1c2VkUmVnaXN0ZXJzID0gIiwgbV91c2VkUmVnaXN0ZXJzKTsKK30KKworfSB9IC8vIG5hbWVz
cGFjZSBKU0M6OkIzCisKSW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM1N0YWNrbWFw
LmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzU3RhY2ttYXAuaAko
cmV2aXNpb24gMCkKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM1N0YWNrbWFwLmgJKHdv
cmtpbmcgY29weSkKQEAgLTAsMCArMSw4MCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNSBB
cHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5k
IHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2Rp
ZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRp
dGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUg
bXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qg
b2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0
cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmln
aHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dp
bmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1h
dGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZU
V0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBS
RVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8s
IFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVT
UyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZF
TlQgU0hBTEwgQVBQTEUgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5Z
IERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9S
IENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisg
KiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVT
RSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZF
UiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBD
T05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdF
TkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBP
RiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNV
Q0ggREFNQUdFLiAKKyAqLworCisjaWZuZGVmIEIzU3RhY2ttYXBfaAorI2RlZmluZSBCM1N0YWNr
bWFwX2gKKworI2luY2x1ZGUgIkIzVmFsdWVSZXAuaCIKKyNpbmNsdWRlICJSZWdpc3RlclNldC5o
IgorI2luY2x1ZGUgPHd0Zi9TaGFyZWRUYXNrLmg+CisKK25hbWVzcGFjZSBKU0MgeyBuYW1lc3Bh
Y2UgQjMgeworCitjbGFzcyBTdGFja21hcCB7CitwdWJsaWM6CisgICAgU3RhY2ttYXAoKQorICAg
IHsKKyAgICB9CisKKyAgICB2b2lkIGNvbnN0cmFpbih1bnNpZ25lZCBpbmRleCwgY29uc3QgVmFs
dWVSZXAmIHJlcCkKKyAgICB7CisgICAgICAgIGlmIChpbmRleCArIDEgPCBtX3JlcHMuc2l6ZSgp
KQorICAgICAgICAgICAgbV9yZXBzLmdyb3coaW5kZXggKyAxKTsKKyAgICAgICAgbV9yZXBzW2lu
ZGV4XSA9IHJlcDsKKyAgICB9CisKKyAgICB2b2lkIGNsb2JiZXIoY29uc3QgUmVnaXN0ZXJTZXQm
IHNldCkKKyAgICB7CisgICAgICAgIG1fY2xvYmJlcmVkLm1lcmdlKHNldCk7CisgICAgfQorCisg
ICAgdm9pZCBzZXRHZW5lcmF0b3IoUmVmUHRyPFNoYXJlZFRhc2s8dm9pZCAoQ0NhbGxIZWxwZXJz
Jik+PiBnZW5lcmF0b3IpCisgICAgeworICAgICAgICBtX2dlbmVyYXRvciA9IGdlbmVyYXRvcjsK
KyAgICB9CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBGdW5jdG9yPgorICAgIHZvaWQgc2V0R2Vu
ZXJhdG9yKGNvbnN0IEZ1bmN0b3ImIGZ1bmN0b3IpCisgICAgeworICAgICAgICBtX2dlbmVyYXRv
ciA9IGNyZWF0ZVNoYXJlZFRhc2s8dm9pZCAoQ0NhbGxIZWxlcHJzJik+KGZ1bmN0b3IpOworICAg
IH0KKworICAgIC8vIFRoZXNlIHdpbGwgcmV0dXJuIGludGVyZXN0aW5nIHRoaW5ncyBpbnNpZGUg
dGhlIGdlbmVyYXRvciBjYWxsYmFjaywgb3IgYWZ0ZXIgY29tcGlsYXRpb24uCisgICAgY29uc3Qg
VmVjdG9yPFZhbHVlUmVwPiYgcmVwcygpIGNvbnN0IHsgcmV0dXJuIG1fcmVwczsgfQorICAgIGNv
bnN0IFJlZ2lzdGVyU2V0JiB1c2VkUmVnaXN0ZXJzKCkgY29uc3QgeyByZXR1cm4gbV91c2VkUmVn
aXN0ZXJzOyB9CisKKyAgICB2b2lkIGR1bXAoUHJpbnRTdHJlYW0mKSBjb25zdDsKKyAgICAKK3By
aXZhdGU6CisgICAgVmVjdG9yPFZhbHVlUmVwPiBtX3JlcHM7CisgICAgUmVmUHRyPFNoYXJlZFRh
c2s8dm9pZCAoQ0NhbGxIZWxwZXJzJik+PiBtX2dlbmVyYXRvcjsKKyAgICBSZWdpc3RlclNldCBt
X2Nsb2JiZXJlZDsKKyAgICBSZWdpc3RlclNldCBtX3VzZWRSZWdpc3RlcnM7Cit9OworCit9IH0g
Ly8gbmFtZXNwYWNlIEpTQzo6QjMKKworI2VuZGlmIC8vIEIzU3RhY2ttYXBfaAorCkluZGV4OiBT
b3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNUeXBlLmNwcAo9PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2Uv
SmF2YVNjcmlwdENvcmUvYjMvQjNUeXBlLmNwcAkocmV2aXNpb24gMCkKKysrIFNvdXJjZS9KYXZh
U2NyaXB0Q29yZS9iMy9CM1R5cGUuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsNTQgQEAK
Ky8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTUgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVk
LgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9y
bXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3Zp
ZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVk
aXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmln
aHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dp
bmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0
IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBv
ZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBk
b2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlz
dHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5D
LiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElO
Q0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBP
RiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9T
RSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IKKyAqIENP
TlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFM
LCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xV
RElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBH
T09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBC
VVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisg
KiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9S
IFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4g
QU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJ
U0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKworI2luY2x1ZGUg
ImNvbmZpZy5oIgorI2luY2x1ZGUgIkIzVHlwZS5oIgorCisjaW5jbHVkZSA8d3RmL1ByaW50U3Ry
ZWFtLmg+CisKK25hbWVzcGFjZSBXVEYgeworCit1c2luZyBuYW1lc3BhY2UgSlNDOjpCMzsKKwor
dm9pZCBwcmludEludGVybmFsKFByaW50U3RyZWFtJiBvdXQsIFR5cGUgdHlwZSkKK3sKKyAgICBz
d2l0Y2ggKHR5cGUpIHsKKyAgICBjYXNlIFZvaWQ6CisgICAgICAgIG91dC5wcmludCgiVm9pZCIp
OworICAgICAgICByZXR1cm47CisgICAgY2FzZSBJbnQzMjoKKyAgICAgICAgb3V0LnByaW50KCJJ
bnQzMiIpOworICAgICAgICByZXR1cm47CisgICAgY2FzZSBJbnQ2NDoKKyAgICAgICAgb3V0LnBy
aW50KCJJbnQ2NCIpOworICAgICAgICByZXR1cm47CisgICAgY2FzZSBEb3VibGU6CisgICAgICAg
IG91dC5wcmludCgiRG91YmxlIik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgUkVMRUFT
RV9BU1NFUlRfTk9UX1JFQUNIRUQoKTsKK30KKworfSAvLyBuYW1lc3BhY2UgV1RGCkluZGV4OiBT
b3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNUeXBlLmgKPT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL0ph
dmFTY3JpcHRDb3JlL2IzL0IzVHlwZS5oCShyZXZpc2lvbiAwKQorKysgU291cmNlL0phdmFTY3Jp
cHRDb3JlL2IzL0IzVHlwZS5oCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsNTggQEAKKy8qCisg
KiBDb3B5cmlnaHQgKEMpIDIwMTUgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoK
KyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdp
dGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRo
YXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmli
dXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAq
ICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlz
Y2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJv
ZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25k
aXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVu
dGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0
aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFT
IElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElO
RywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJD
SEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUg
RElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IKKyAqIENPTlRSSUJV
VE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVD
SUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywg
QlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBP
UiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVT
UyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBM
SUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQK
KyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdB
WSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9G
IFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKworI2lmbmRlZiBCM1R5cGVf
aAorI2RlZmluZSBCM1R5cGVfaAorCisjaW5jbHVkZSA8d3RmL1N0ZExpYkV4dHJhcy5oPgorCitu
YW1lc3BhY2UgSlNDIHsgbmFtZXNwYWNlIEIzIHsKKworZW51bSBUeXBlIHsKKyAgICBWb2lkLAor
ICAgIEludDMyLAorICAgIEludDY0LAorICAgIERvdWJsZQorfTsKKworVHlwZSBwb2ludGVyKCkg
Y29uc3QKK3sKKyAgICBpZiAoc2l6ZW9mKHZvaWQqKSA9PSA0KQorICAgICAgICByZXR1cm4gSW50
MzI7CisgICAgcmV0dXJuIEludDY0OworfQorCit9IH0gLy8gbmFtZXNwYWNlIEpTQzo6QjMKKwor
bmFtZXNwYWNlIFdURiB7CisKK2NsYXNzIFByaW50U3RyZWFtOworCit2b2lkIHByaW50SW50ZXJu
YWwoUHJpbnRTdHJlYW0mLCBKU0M6OkIzOjpUeXBlKTsKKworfSAvLyBuYW1lc3BhY2UgV1RGCisK
KyNlbmRpZiAvLyBCM1R5cGVfaAorCkluZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNW
YWx1ZS5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzVmFsdWUu
Y3BwCShyZXZpc2lvbiAwKQorKysgU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzVmFsdWUuY3Bw
CSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsMTgwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAy
MDE1IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlv
biBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAq
IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcg
Y29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2Ug
Y29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMg
bGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBS
ZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNv
cHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZv
bGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3Ro
ZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElT
IFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAq
IEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRF
RCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBG
SVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBO
TyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZP
UiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFS
WSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBU
TywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1Mg
T0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBI
T1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVS
IElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5F
R0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UK
KyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkg
T0YgU1VDSCBEQU1BR0UuIAorICovCisKKyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJC
M1ZhbHVlLmgiCisKK25hbWVzcGFjZSBKU0MgeyBuYW1lc3BhY2UgQjMgeworCitWYWx1ZTo6flZh
bHVlKCkKK3sKK30KKwordm9pZCBWYWx1ZTo6cmVwbGFjZVdpdGhJZGVudGl0eShWYWx1ZSogdmFs
dWUpCit7CisgICAgLy8gVGhpcyBpcyBhIGJpdCBjcmF6eS4gSXQgZG9lcyBhbiBpbi1wbGFjZSBy
ZXBsYWNlbWVudCBvZiB3aGF0ZXZlciBWYWx1ZSBzdWJjbGFzcyB0aGlzIGlzIHdpdGgKKyAgICAv
LyBhIHBsYWluIElkZW50aXR5IFZhbHVlLiBXZSBmaXJzdCBjb2xsZWN0IGFsbCBvZiB0aGUgaW5m
b3JtYXRpb24gd2UgbmVlZCwgdGhlbiB3ZSBkZXN0cnVjdCB0aGUKKyAgICAvLyBwcmV2aW91cyB2
YWx1ZSBpbiBwbGFjZSwgYW5kIHRoZW4gd2UgY29uc3RydWN0IHRoZSBJZGVudGl0eSBWYWx1ZSBp
biBwbGFjZS4KKworICAgIHVuc2lnbmVkIGluZGV4ID0gbV9pbmRleDsKKyAgICBUeXBlIHR5cGUg
PSBtX3R5cGU7CisgICAgT3JpZ2luIG9yaWdpbiA9IG1fb3JpZ2luOworICAgIEJhc2ljQmxvY2sq
IG93bmVyID0gdGhpcy0+b3duZXI7CisgICAgVmFsdWUqIHJlcGxhY2VtZW50ID0gdGhpcy0+cmVw
bGFjZW1lbnQ7CisgICAgdm9pZCogbWlzYyA9IHRoaXMtPm1pc2M7CisKKyAgICBSRUxFQVNFX0FT
U0VSVCh0eXBlID09IHZhbHVlLT50eXBlKCkpOworCisgICAgdGhpcy0+VmFsdWU6On5WYWx1ZSgp
OworCisgICAgbmV3ICh0aGlzKSAoaW5kZXgsIElkZW50aWZ5LCB0eXBlLCBvcmlnaW4sIHZhbHVl
KTsKKworICAgIHRoaXMtPm93bmVyID0gb3duZXI7CisgICAgdGhpcy0+cmVwbGFjZW1lbnQgPSBy
ZXBsYWNlbWVudDsKKyAgICB0aGlzLT5taXNjID0gbWlzYzsKK30KKwordm9pZCBWYWx1ZTo6ZHVt
cChQcmludFN0cmVhbSYgb3V0KSBjb25zdAoreworICAgIG91dC5wcmludChkdW1wUHJlZml4LCBt
X2luZGV4KTsKK30KKwordm9pZCBWYWx1ZTo6ZGVlcER1bXAoUHJpbnRTdHJlYW0mIG91dCkgY29u
c3QKK3sKKyAgICBvdXQucHJpbnQobV90eXBlLCAiICIsICp0aGlzLCAiID0gIiwgbV9vcGNvZGUp
OworCisgICAgb3V0LnByaW50KCIoIik7CisgICAgQ29tbWFQcmludGVyIGNvbW1hOworICAgIGZv
ciAoVmFsdWUqIGNoaWxkIDogY2hpbGRyZW4oKSkKKyAgICAgICAgb3V0LnByaW50KGNvbW1hLCBw
b2ludGVyRHVtcChjaGlsZCkpOworCisgICAgU3RyaW5nUHJpbnRTdHJlYW0gc3RyaW5nT3V0Owor
ICAgIGR1bXBNZXRhKHN0cmluZ091dCk7CisgICAgQ1N0cmluZyBzdHJpbmcgPSBzdHJpbmdPdXQu
dG9DU3RyaW5nKCk7CisgICAgaWYgKHN0cmluZy5sZW5ndGgoKSkKKyAgICAgICAgb3V0LnByaW50
KGNvbW1hLCBzdHJpbmcpOworCisgICAgb3V0LnByaW50KCIpIik7Cit9CisKK2Jvb2wgVmFsdWU6
Omhhc0ludDMyKCkgY29uc3QKK3sKKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK2ludDMyX3QgVmFs
dWU6OmFzSW50MzIoKSBjb25zdAoreworICAgIFJFTEVBU0VfQVNTRVJUX05PVF9SRUFDSEVEKCk7
CisgICAgcmV0dXJuIDA7Cit9CisKK2Jvb2wgVmFsdWU6Omhhc0ludDY0KCkgY29uc3QKK3sKKyAg
ICByZXR1cm4gZmFsc2U7Cit9CisKK2ludDY0X3QgVmFsdWU6OmFzSW50NjQoKSBjb25zdAorewor
ICAgIFJFTEVBU0VfQVNTRVJUX05PVF9SRUFDSEVEKCk7CisgICAgcmV0dXJuIDA7Cit9CisKK2Jv
b2wgVmFsdWU6Omhhc0RvdWJsZSgpIGNvbnN0Cit7CisgICAgcmV0dXJuIGZhbHNlOworfQorCitk
b3VibGUgVmFsdWU6OmFzRG91YmxlKCkgY29uc3QKK3sKKyAgICBSRUxFQVNFX0FTU0VSVF9OT1Rf
UkVBQ0hFRCgpOworICAgIHJldHVybiAwOworfQorCit2b2lkIFZhbHVlOjpkdW1wTWV0YShQcmlu
dFN0cmVhbSYpIGNvbnN0Cit7Cit9CisKK1R5cGUgVmFsdWU6OnR5cGVGb3IoT3Bjb2RlIG9wY29k
ZSwgVmFsdWUqIGZpcnN0Q2hpbGQpCit7CisgICAgc3dpdGNoIChvcGNvZGUpIHsKKyAgICBjYXNl
IElkZW50aXR5OgorICAgIGNhc2UgQWRkOgorICAgIGNhc2UgU3ViOgorICAgIGNhc2UgTXVsOgor
ICAgIGNhc2UgRGl2OgorICAgIGNhc2UgQ2hpbGxEaXY6CisgICAgY2FzZSBNb2Q6CisgICAgY2Fz
ZSBCaXRBbmQ6CisgICAgY2FzZSBCaXRPcjoKKyAgICBjYXNlIEJpdFhvcjoKKyAgICBjYXNlIFNo
bDoKKyAgICBjYXNlIFNTaHI6CisgICAgY2FzZSBaU2hyOgorICAgIGNhc2UgQ2hlY2tBZGQ6Cisg
ICAgY2FzZSBDaGVja1N1YjoKKyAgICBjYXNlIENoZWNrTXVsOgorICAgICAgICByZXR1cm4gZmly
c3RDaGlsZC0+dHlwZSgpOworICAgIGNhc2UgRnJhbWVQb2ludGVyOgorICAgICAgICByZXR1cm4g
cG9pbnRlcigpOworICAgIGNhc2UgU0V4dDg6CisgICAgY2FzZSBTRXh0MTY6CisgICAgY2FzZSBE
VG9JMzI6CisgICAgY2FzZSBFcXVhbDoKKyAgICBjYXNlIE5vdEVxdWFsOgorICAgIGNhc2UgTGVz
c1RoYW46CisgICAgY2FzZSBHcmVhdGVyVGhhbjoKKyAgICBjYXNlIExlc3NFcXVhbDoKKyAgICBj
YXNlIEdyZWF0ZXJFcXVhbDoKKyAgICBjYXNlIEFib3ZlOgorICAgIGNhc2UgQmVsb3c6CisgICAg
Y2FzZSBBYm92ZUVxdWFsOgorICAgIGNhc2UgQmVsb3dFcXVhbDoKKyAgICBjYXNlIExvYWQ4WjoK
KyAgICBjYXNlIExvYWQ4UzoKKyAgICBjYXNlIExvYWQxNlo6CisgICAgY2FzZSBMb2FkMTZTOgor
ICAgICAgICByZXR1cm4gSW50MzI7CisgICAgY2FzZSBTRXh0MzI6CisgICAgY2FzZSBaRXh0MzI6
CisgICAgICAgIHJldHVybiBJbnQ2NDsKKyAgICBjYXNlIEZSb3VuZDoKKyAgICBjYXNlIElUb0Q6
CisgICAgY2FzZSBMb2FkRmxvYXQ6CisgICAgICAgIHJldHVybiBEb3VibGU7CisgICAgY2FzZSBT
dG9yZTg6CisgICAgY2FzZSBTdG9yZTE2OgorICAgIGNhc2UgU3RvcmVGbG9hdDoKKyAgICBjYXNl
IFN0b3JlOgorICAgIGNhc2UgVXBzaWxvbjoKKyAgICBjYXNlIFJldHVybjoKKyAgICBjYXNlIE9v
cHM6CisgICAgICAgIHJldHVybiBWb2lkOworICAgIGRlZmF1bHQ6CisgICAgICAgIFJFTEVBU0Vf
QVNTRVJUX05PVF9SRUFDSEVEKCk7CisgICAgfQorfQorCit9IH0gLy8gbmFtZXNwYWNlIEpTQzo6
QjMKKwpJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzVmFsdWUuaAo9PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNWYWx1ZS5oCShyZXZpc2lvbiAwKQorKysg
U291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzVmFsdWUuaAkod29ya2luZyBjb3B5KQpAQCAtMCww
ICsxLDE3MiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNSBBcHBsZSBJbmMuIEFsbCByaWdo
dHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5k
IGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJt
aXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6
CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFi
b3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQg
dGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFy
eSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwg
dGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0
aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3
aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBC
WSBBUFBMRSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FS
UkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBX
QVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFS
CisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5D
LiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1Qs
IElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFN
QUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBT
VUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBS
T0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFO
WSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJ
QUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkg
QVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBF
VkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLiAKKyAqLwor
CisjaWZuZGVmIEIzVmFsdWVfaAorI2RlZmluZSBCM1ZhbHVlX2gKKworI2luY2x1ZGUgIkIzT3Jp
Z2luLmgiCisjaW5jbHVkZSAiQjNUeXBlLmgiCisjaW5jbHVkZSA8d3RmL0Zhc3RNYWxsb2MuaD4K
KyNpbmNsdWRlIDx3dGYvTm9uY29weWFibGUuaD4KKworbmFtZXNwYWNlIEpTQyB7IG5hbWVzcGFj
ZSBCMyB7CisKK2NsYXNzIFZhbHVlIHsKKyAgICBXVEZfTUFLRV9OT05DT1BZQUJMRShWYWx1ZSk7
CisgICAgV1RGX01BS0VfRkFTVF9BTExPQ0FURUQ7CitwdWJsaWM6CisgICAgdHlwZWRlZiBWZWN0
b3I8VmFsdWUqLCAzPiBBZGphY2VuY3lMaXN0OworCisgICAgc3RhdGljIGNvbnN0IGNoYXIqIGR1
bXBQcmVmaXggPSAiQCI7CisKKyAgICBzdGF0aWMgYm9vbCBhY2NlcHRzKE9wY29kZSkgeyByZXR1
cm4gdHJ1ZTsgfQorCisgICAgdmlydHVhbCB+VmFsdWUoKTsKKworICAgIHVuc2lnbmVkIGluZGV4
KCkgY29uc3QgeyByZXR1cm4gbV9pbmRleDsgfQorICAgIAorICAgIC8vIE5vdGUgdGhhdCB0aGUg
b3Bjb2RlIGlzIGltbXV0YWJsZSwgZXhjZXB0IGZvciByZXBsYWNpbmcgdmFsdWVzIHdpdGggaWRl
bnRpdHkuCisgICAgT3Bjb2RlIG9wY29kZSgpIGNvbnN0IHsgcmV0dXJuIG1fb3Bjb2RlOyB9CisK
KyAgICBPcmlnaW4gb3JpZ2luKCkgY29uc3QgeyByZXR1cm4gbV9vcmlnaW47IH0KKyAgICAKKyAg
ICBWYWx1ZSomIGNoaWxkKHVuc2lnbmVkIGluZGV4KSB7IHJldHVybiBtX2NoaWxkcmVuW2luZGV4
XTsgfQorICAgIFZhbHVlKiBjaGlsZCh1bnNpZ25lZCBpbmRleCkgY29uc3QgeyByZXR1cm4gbV9j
aGlsZHJlbltpbmRleF07IH0KKworICAgIC8vIFRoaXMgY29tcHV0ZXMgdGhlIHR5cGUgdXNpbmcg
dGhlIG9wY29kZS4KKyAgICBUeXBlIHR5cGUoKSBjb25zdCB7IHJldHVybiBtX3R5cGU7IH0KKwor
ICAgIEFkamFjZW5jeUxpc3QmIGNoaWxkcmVuKCkgeyByZXR1cm4gbV9jaGlsZHJlbjsgfSAKKyAg
ICBjb25zdCBBZGphY2VuY3lMaXN0JiBjaGlsZHJlbigpIGNvbnN0IHsgcmV0dXJuIG1fY2hpbGRy
ZW47IH0KKworICAgIHZvaWQgcmVwbGFjZVdpdGhJZGVudGl0eShWYWx1ZSopOworCisgICAgdm9p
ZCBkdW1wKFByaW50U3RyZWFtJikgY29uc3Q7CisgICAgdm9pZCBkZWVwRHVtcChQcmludFN0cmVh
bSYpIGNvbnN0OworCisgICAgLy8gVGhpcyBpcyBob3cgeW91IGNhc3QgVmFsdWVzLiBGb3IgZXhh
bXBsZSwgaWYgeW91IHdhbnQgdG8gZG8gc29tZXRoaW5nIHByb3ZpZGVkIHRoYXQgd2UgaGF2ZSBh
CisgICAgLy8gQXJndW1lbnRSZWdWYWx1ZSwgeW91IGNhbiBkbzoKKyAgICAvLworICAgIC8vIGlm
IChBcmd1bWVudFJlZ1ZhbHVlKiBhcmd1bWVudFJlZyA9IHZhbHVlLT5hczxBcmd1bWVudFJlZ1Zh
bHVlPigpKSB7CisgICAgLy8gICAgIHRoaW5ncworICAgIC8vIH0KKyAgICAvLworICAgIC8vIFRo
aXMgd2lsbCByZXR1cm4gbnVsbCBpZiB0aGlzIG9wY29kZSgpICE9IEFyZ3VtZW50UmVnLiBUaGlz
IHdvcmtzIGJlY2F1c2UgdGhpcyByZXR1cm5zIG51bGxwdHIKKyAgICAvLyBpZiBUOjphY2NlcHRz
KG9wY29kZSgpKSByZXR1cm5zIGZhbHNlLgorICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+CisgICAg
VCogYXMoKTsKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorICAgIGNvbnN0IFQqIGFzKCkgY29u
c3Q7CisgICAgCisgICAgYm9vbCBoYXNJbnQzMigpIGNvbnN0OworICAgIGludDMyX3QgYXNJbnQz
MigpIGNvbnN0OworICAgIAorICAgIGJvb2wgaGFzSW50NjQoKSBjb25zdDsKKyAgICBpbnQ2NF90
IGFzSW50NjQoKSBjb25zdDsKKworICAgIGJvb2wgaGFzRG91YmxlKCkgY29uc3Q7CisgICAgZG91
YmxlIGFzRG91YmxlKCkgY29uc3Q7CisKK3Byb3RlY3RlZDoKKyAgICB2aXJ0dWFsIHZvaWQgZHVt
cE1ldGEoUHJpbnRTdHJlYW0mKSBjb25zdDsKKyAgICAKK3ByaXZhdGU6CisgICAgZnJpZW5kIGNs
YXNzIFByb2NlZHVyZTsKKyAgICAKKyAgICAvLyBJbnN0YW50aWF0ZSB2YWx1ZXMgdmlhIFByb2Nl
ZHVyZS4KKyAgICAvLyBUaGlzIGZvcm0gcmVxdWlyZXMgc3BlY2lmeWluZyB0aGUgdHlwZSBleHBs
aWNpdGx5OgorICAgIHRlbXBsYXRlPHR5cGVuYW1lLi4uIEFyZ3VtZW50cz4KKyAgICBleHBsaWNp
dCBWYWx1ZSh1bnNpZ25lZCBpbmRleCwgT3Bjb2RlIG9wY29kZSwgVHlwZSB0eXBlLCBPcmlnaW4g
b3JpZ2luLCBBcmd1bWVudHMuLi4gYXJndW1lbnRzKQorICAgICAgICA6IG1faW5kZXgoaW5kZXgp
CisgICAgICAgICwgbV9vcGNvZGUob3Bjb2RlKQorICAgICAgICAsIG1fdHlwZSh0eXBlKQorICAg
ICAgICAsIG1fb3JpZ2luKG9yaWdpbikKKyAgICAgICAgLCBtX2NoaWxkcmVueyBhcmd1bWVudHMu
Li4gfQorICAgIHsKKyAgICB9CisgICAgLy8gVGhpcyBmb3JtIGlzIGZvciB0aG9zZSBvcGNvZGVz
IHRoYXQgY2FuIGluZmVyIHRoZWlyIHR5cGUgZnJvbSB0aGUgb3Bjb2RlIGFuZCBmaXJzdCBjaGls
ZDoKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZS4uLiBBcmd1bWVudHM+CisgICAgZXhwbGljaXQgVmFs
dWUodW5zaWduZWQgaW5kZXgsIE9wY29kZSBvcGNvZGUsIE9yaWdpbiBvcmlnaW4sIFZhbHVlKiBm
aXJzdENoaWxkLCBBcmd1bWVudHMuLi4gYXJndW1lbnRzKQorICAgICAgICA6IG1faW5kZXgoaW5k
ZXgpCisgICAgICAgICwgbV9vcGNvZGUob3Bjb2RlKQorICAgICAgICAsIG1fdHlwZSh0eXBlRm9y
KG9wY29kZSwgZmlyc3RDaGlsZCkpCisgICAgICAgICwgbV9vcmlnaW4ob3JpZ2luKQorICAgICAg
ICAsIG1fY2hpbGRyZW57IGZpcnN0Q2hpbGQsIGFyZ3VtZW50cy4uLiB9CisgICAgeworICAgIH0K
KyAgICAvLyBUaGlzIGZvcm0gaXMgZm9yIHRob3NlIG9wY29kZXMgdGhhdCBjYW4gaW5mZXIgdGhl
aXIgdHlwZSBmcm9tIHRoZSBvcGNvZGUgYWxvbmUsIGFuZCB0aGF0IGRvbid0CisgICAgLy8gdGFr
ZSBhbnkgYXJndW1lbnRzOgorICAgIGV4cGxpY2l0IFZhbHVlKHVuc2lnbmVkIGluZGV4LCBPcGNv
ZGUgb3Bjb2RlLCBPcmlnaW4gb3JpZ2luKQorICAgICAgICA6IG1faW5kZXgoaW5kZXgpCisgICAg
ICAgICwgbV9vcGNvZGUob3Bjb2RlKQorICAgICAgICAsIG1fdHlwZSh0eXBlRm9yKG9wY29kZSwg
bnVsbHB0cikpCisgICAgICAgICwgbV9vcmlnaW4ob3JpZ2luKQorICAgIHsKKyAgICB9CisKKyAg
ICBzdGF0aWMgVHlwZSB0eXBlRm9yKE9wY29kZSwgVmFsdWUqIGZpcnN0Q2hpbGQpOworCisgICAg
Ly8gVGhpcyBncm91cCBvZiBmaWVsZHMgaXMgYXJyYW5nZWQgdG8gZml0IGluIDY0IGJpdHMuCisg
ICAgdW5zaWduZWQgbV9pbmRleDsKKyAgICBPcGNvZGUgbV9vcGNvZGU7CisgICAgVHlwZSBtX3R5
cGU7CisgICAgCisgICAgT3JpZ2luIG1fb3JpZ2luOworICAgIEFkamFjZW5jeUxpc3QgbV9jaGls
ZHJlbjsKKworcHVibGljOgorICAgIEJhc2ljQmxvY2sqIG93bmVyIHsgbnVsbHB0ciB9OyAvLyBj
b21wdXRlZCBsYXppbHkuCisgICAgVmFsdWUqIHJlcGxhY2VtZW50IHsgbnVsbHB0ciB9OyAvLyB1
c2VkIGZvciBhbmFseXNlcyBhbmQgdHJhbnNmb3JtYXRpb25zLgorICAgIHZvaWQqIG1pc2MgeyBu
dWxscHRyIH07Cit9OworCitjbGFzcyBEZWVwVmFsdWVEdW1wIHsKK3B1YmxpYzoKKyAgICBEZWVw
VmFsdWVEdW1wKFZhbHVlKiB2YWx1ZSkKKyAgICAgICAgOiBtX3ZhbHVlKHZhbHVlKQorICAgIHsK
KyAgICB9CisKKyAgICB2b2lkIGR1bXAoUHJpbnRTdHJlYW0mIG91dCkgY29uc3QKKyAgICB7Cisg
ICAgICAgIGlmIChtX3ZhbHVlKQorICAgICAgICAgICAgbV92YWx1ZS0+ZGVlcER1bXAob3V0KTsK
KyAgICAgICAgZWxzZQorICAgICAgICAgICAgb3V0LnByaW50KCI8bnVsbD4iKTsKKyAgICB9CisK
K3ByaXZhdGU6CisgICAgVmFsdWUqIG1fdmFsdWU7Cit9OworCitEZWVwVmFsdWVEdW1wIGRlZXBE
dW1wKFZhbHVlKiB2YWx1ZSkKK3sKKyAgICByZXR1cm4gRGVlcFZhbHVlRHVtcCh2YWx1ZSk7Cit9
CisKK30gfSAvLyBuYW1lc3BhY2UgSlNDOjpCMworCisjZW5kaWYgLy8gQjNWYWx1ZV9oCisKSW5k
ZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM1ZhbHVlSW5saW5lcy5oCj09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0K
LS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM1ZhbHVlSW5saW5lcy5oCShyZXZpc2lvbiAw
KQorKysgU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzVmFsdWVJbmxpbmVzLmgJKHdvcmtpbmcg
Y29weSkKQEAgLTAsMCArMSw4MyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNSBBcHBsZSBJ
bmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBp
biBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRp
b24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMK
KyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCBy
ZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29u
ZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRp
b25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAq
ICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlz
Y2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFs
cyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJ
UyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9S
IElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQor
ICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1Ig
QSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hB
TEwgQVBQTEUgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVD
VCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNF
UVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9D
VVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFU
QSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVT
RUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFD
VCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9S
IE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElT
IFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFN
QUdFLiAKKyAqLworCisjaWZuZGVmIEIzVmFsdWVJbmxpbmVzX2gKKyNkZWZpbmUgQjNWYWx1ZUlu
bGluZXNfaAorCisjaW5jbHVkZSAiQjNDb25zdDMyVmFsdWUuaCIKKyNpbmNsdWRlICJCM0NvbnN0
NjRWYWx1ZS5oIgorI2luY2x1ZGUgIkIzQ29uc3REb3VibGVWYWx1ZS5oIgorI2luY2x1ZGUgIkIz
VmFsdWUuaCIKKworbmFtZXNwYWNlIEpTQyB7IG5hbWVzcGFjZSBCMyB7CisKK3RlbXBsYXRlPHR5
cGVuYW1lIFQ+CitUKiBWYWx1ZTo6YXMoKQoreworICAgIGlmIChUOjphY2NlcHRzKG9wY29kZSgp
KSkKKyAgICAgICAgcmV0dXJuIHN0YXRpY19jYXN0PFQqPih0aGlzKTsKKyAgICByZXR1cm4gbnVs
bHB0cjsKK30KKwordGVtcGxhdGU+dHlwZW5hbWUgVD4KK2NvbnN0IFQqIFZhbHVlOjphcygpIGNv
bnN0Cit7CisgICAgcmV0dXJuIGNvbnN0X2Nhc3Q8VmFsdWUqPih0aGlzKS0+YXM8VD4oKTsKK30K
KworYm9vbCBWYWx1ZTo6aGFzSW50MzIoKSBjb25zdAoreworICAgIHJldHVybiAhIWFzPENvbnN0
MzJWYWx1ZT4oKTsKK30KKworaW50MzJfdCBWYWx1ZTo6YXNJbnQzMigpIGNvbnN0Cit7CisgICAg
cmV0dXJuIGFzPENvbnN0MzJWYWx1ZT4oKS0+dmFsdWUoKTsKK30KKworYm9vbCBWYWx1ZTo6aGFz
SW50NjQoKSBjb25zdAoreworICAgIHJldHVybiAhIWFzPENvbnN0NjRWYWx1ZT4oKTsKK30KKwor
aW50NjRfdCBWYWx1ZTo6YXNJbnQ2NCgpIGNvbnN0Cit7CisgICAgcmV0dXJuIGFzPENvbnN0NjRW
YWx1ZT4oKS0+dmFsdWUoKTsKK30KKworYm9vbCBWYWx1ZTo6aGFzRG91YmxlKCkgY29uc3QKK3sK
KyAgICByZXR1cm4gISFhczxDb25zdERvdWJsZVZhbHVlPigpOworfQorCitkb3VibGUgVmFsdWU6
OmFzRG91YmxlKCkgY29uc3QKK3sKKyAgICByZXR1cm4gYXM8Q29uc3REb3VibGVWYWx1ZT4oKS0+
dmFsdWUoKTsKK30KKworfSB9IC8vIG5hbWVzcGFjZSBKU0M6OkIzCisKKyNlbmRpZiAvLyBCM1Zh
bHVlSW5saW5lc19oCisKSW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM1ZhbHVlUmVw
LmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNWYWx1ZVJlcC5j
cHAJKHJldmlzaW9uIDApCisrKyBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNWYWx1ZVJlcC5j
cHAJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSw4NiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykg
MjAxNSBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRp
b24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Cisg
KiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5n
IGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNl
IGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlz
IGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4g
UmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBj
b3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBm
b2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90
aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJ
UyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisg
KiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlU
RUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQg
RklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4g
Tk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBG
T1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExB
UlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQg
VE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NT
IE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikg
SE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhF
UiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBO
RUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNF
CisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZ
IE9GIFNVQ0ggREFNQUdFLiAKKyAqLworCisjaW5jbHVkZSAiY29uZmlnLmgiCisjaW5jbHVkZSAi
QjNWYWx1ZVJlcC5oIgorCituYW1lc3BhY2UgSlNDIHsgbmFtZXNwYWNlIEIzIHsKKwordm9pZCBW
YWx1ZVJlcDo6ZHVtcChQcmludFN0cmVhbSYgb3V0KSBjb25zdAoreworICAgIG91dC5wcmludCht
X2tpbmQpOworICAgIHN3aXRjaCAobV9raW5kKSB7CisgICAgY2FzZSBOb25lOgorICAgIGNhc2Ug
U29tZVJlZ2lzdGVyOgorICAgICAgICByZXR1cm47CisgICAgY2FzZSBSZWdpc3RlcjoKKyAgICAg
ICAgb3V0LnByaW50KCIoIiwgcmVnKCksICIpIik7CisgICAgICAgIHJldHVybjsKKyAgICBjYXNl
IFN0YWNrOgorICAgICAgICBvdXQucHJpbnQoIigiLCBvZmZzZXRGcm9tRlAoKSwgIikiKTsKKyAg
ICAgICAgcmV0dXJuOworICAgIGNhc2UgU3RhY2tBcmd1bWVudDoKKyAgICAgICAgb3V0LnByaW50
KCIoIiwgb2Zmc2V0RnJvbVNQKCksICIpIik7CisgICAgICAgIHJldHVybjsKKyAgICBjYXNlIENv
bnN0YW50OgorICAgICAgICBvdXQucHJpbnQoIigiLCB2YWx1ZSgpLCAiKSIpOworICAgICAgICBy
ZXR1cm47CisgICAgfQorICAgIFJFTEVBU0VfQVNTRVJUX05PVF9SRUFDSEVEKCk7Cit9CisKK30g
fSAvLyBuYW1lc3BhY2UgSlNDOjpCMworCituYW1lc3BhY2UgV1RGIHsKKwordXNpbmcgbmFtZXNw
YWNlIEpTQzo6QjM7CisKK3ZvaWQgcHJpbnRJbnRlcm5hbChQcmludFN0cmVhbSYgb3V0LCBWYWx1
ZVJlcDo6S2luZCBraW5kKQoreworICAgIHN3aXRjaCAoa2luZCkgeworICAgIGNhc2UgVmFsdWVS
ZXA6OkFueToKKyAgICAgICAgb3V0LnByaW50KCJBbnkiKTsKKyAgICAgICAgcmV0dXJuOworICAg
IGNhc2UgVmFsdWVSZXA6OlNvbWVSZWdpc3RlcjoKKyAgICAgICAgb3V0LnByaW50KCJTb21lUmVn
aXN0ZXIiKTsKKyAgICAgICAgcmV0dXJuOworICAgIGNhc2UgVmFsdWVSZXA6OlJlZ2lzdGVyOgor
ICAgICAgICBvdXQucHJpbnQoIlJlZ2lzdGVyIik7CisgICAgICAgIHJldHVybjsKKyAgICBjYXNl
IFZhbHVlUmVwOjpTdGFjazoKKyAgICAgICAgb3V0LnByaW50KCJTdGFjayIpOworICAgICAgICBy
ZXR1cm47CisgICAgY2FzZSBWYWx1ZVJlcDo6U3RhY2tBcmd1bWVudDoKKyAgICAgICAgb3V0LnBy
aW50KCJTdGFja0FyZ3VtZW50Iik7CisgICAgICAgIHJldHVybjsKKyAgICBjYXNlIFZhbHVlUmVw
OjpDb25zdGFudDoKKyAgICAgICAgb3V0LnByaW50KCJDb25zdGFudCIpOworICAgICAgICByZXR1
cm47CisgICAgfQorICAgIFJFTEVBU0VfQVNTRVJUX05PVF9SRUFDSEVEKCk7Cit9CisKK30gLy8g
bmFtZXNwYWNlIFdURgorCkluZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNWYWx1ZVJl
cC5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM1ZhbHVlUmVwLmgJ
KHJldmlzaW9uIDApCisrKyBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNWYWx1ZVJlcC5oCSh3
b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsMTU2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE1
IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBh
bmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1v
ZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29u
ZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29k
ZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlz
dCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRp
c3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHly
aWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxv
d2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIg
bWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNP
RlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVY
UFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBU
TywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRO
RVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBF
VkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBB
TlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwg
T1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywK
KyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0Yg
VVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dF
VkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElO
IENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJ
R0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAq
IE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0Yg
U1VDSCBEQU1BR0UuIAorICovCisKKyNpZm5kZWYgQjNWYWx1ZVJlcF9oCisjZGVmaW5lIEIzVmFs
dWVSZXBfaAorCisjaW5jbHVkZSAiUmVnLmgiCisjaW5jbHVkZSA8d3RmL1ByaW50U3RyZWFtLmg+
CisKK25hbWVzcGFjZSBKU0MgeyBuYW1lc3BhY2UgQjMgeworCisvLyBXZSB1c2UgdGhpcyBjbGFz
cyB0byBkZXNjcmliZSB2YWx1ZSByZXByZXNlbnRhdGlvbnMgYXQgc3RhY2ttYXBzLiBJdCdzIHVz
ZWQgYm90aCB0byBmb3JjZSBhCisvLyByZXByZXNlbnRhdGlvbiBhbmQgdG8gZ2V0IHRoZSByZXBy
ZXNlbnRhdGlvbi4gV2hlbiB0aGUgQjMgY2xpZW50IGZvcmNlcyBhIHJlcHJlc2VudGF0aW9uLCB3
ZSBzYXkKKy8vIHRoYXQgaXQncyBhbiBpbnB1dC4gV2hlbiBCMyB0ZWxscyB0aGUgY2xpZW50IHdo
YXQgcmVwcmVzZW50YXRpb24gaXQgcGlja2VkLCB3ZSBzYXkgdGhhdCBpdCdzIGFuCisvLyBvdXRw
dXQuCisKK2NsYXNzIFZhbHVlUmVwIHsKK3B1YmxpYzoKKyAgICBlbnVtIEtpbmQgeworICAgICAg
ICAvLyBBcyBhbiBpbnB1dCByZXByZXNlbnRhdGlvbiwgdGhpcyBtZWFucyB0aGF0IEIzIGNhbiBw
aWNrIGFueSByZXByZXNlbnRhdGlvbi4KKyAgICAgICAgQW55LAorCisgICAgICAgIC8vIEFzIGFu
IGlucHV0IHJlcHJlc2VudGF0aW9uLCB0aGlzIG1lYW5zIHRoYXQgQjMgc2hvdWxkIHBpY2sgc29t
ZSByZWdpc3RlciwgcHJvdmlkZWQgdGhhdAorICAgICAgICAvLyBpdCdzIG5vdCBhbHNvIGEgcmVn
aXN0ZXIgdGhhdCB3YXMgY2xvYmJlcmVkLgorICAgICAgICBTb21lUmVnaXN0ZXIsCisKKyAgICAg
ICAgLy8gQXMgYW4gaW5wdXQgcmVwcmVzZW50YXRpb24sIHRoaXMgZm9yY2VzIGEgcGFydGljdWxh
ciByZWdpc3Rlci4gQXMgYW4gb3V0cHV0CisgICAgICAgIC8vIHJlcHJlc2VudGF0aW9uLCB0aGlz
IHRlbGxzIHVzIHdoYXQgcmVnaXN0ZXIgQjMgcGlja2VkLgorICAgICAgICBSZWdpc3RlciwKKwor
ICAgICAgICAvLyBBcyBhbiBvdXRwdXQgcmVwcmVzZW50YXRpb24sIHRoaXMgdGVsbHMgdXMgd2hh
dCBzdGFjayBzbG90IEIzIHBpY2tlZC4gSXQncyBub3QgYSB2YWxpZAorICAgICAgICAvLyBpbnB1
dCByZXByZXNlbnRhdGlvbi4KKyAgICAgICAgU3RhY2ssCisKKyAgICAgICAgLy8gQXMgYW4gaW5w
dXQgcmVwcmVzZW50YXRpb24sIHRoaXMgZm9yY2VzIHRoZSB2YWx1ZSB0byBlbmQgdXAgaW4gdGhl
IGFyZ3VtZW50IGFyZWEgYXQgc29tZQorICAgICAgICAvLyBvZmZzZXQuCisgICAgICAgIFN0YWNr
QXJndW1lbnQsCisKKyAgICAgICAgLy8gQXMgYW4gb3V0cHV0IHJlcHJlc2VudGF0aW9uLCB0aGlz
IHRlbGxzIHVzIHRoYXQgQjMgY29uc3RhbnQtZm9sZGVkIHRoZSB2YWx1ZS4KKyAgICAgICAgQ29u
c3RhbnQKKyAgICB9OworICAgIAorICAgIFZhbHVlUmVwKCkKKyAgICAgICAgOiBtX2tpbmQoQW55
KQorICAgIHsKKyAgICB9CisKKyAgICBleHBsaWNpdCBWYWx1ZVJlcChSZWcgcmVnKQorICAgICAg
ICA6IG1fa2luZChSZWdpc3RlcikKKyAgICAgICAgLCBtX3ZhbHVlKHJlZy5pbmRleCgpKQorICAg
IHsKKyAgICB9CisKKyAgICBzdGF0aWMgVmFsdWVSZXAgcmVnKFJlZyByZWcpCisgICAgeworICAg
ICAgICByZXR1cm4gVmFsdWVSZXAocmVnKTsKKyAgICB9CisKKyAgICBzdGF0aWMgVmFsdWVSZXAg
c3RhY2soaW50cHRyX3Qgb2Zmc2V0RnJvbUZQKQorICAgIHsKKyAgICAgICAgVmFsdWVSZXAgcmVz
dWx0OworICAgICAgICByZXN1bHQubV9raW5kID0gU3RhY2s7CisgICAgICAgIHJlc3VsdC5tX3Zh
bHVlID0gb2Zmc2V0RnJvbUZQOworICAgIH0KKworICAgIHN0YXRpYyBWYWx1ZVJlcCBzdGFja0Fy
Z3VtZW50KGludHB0cl90IG9mZnNldEZyb21TUCkKKyAgICB7CisgICAgICAgIFZhbHVlUmVwIHJl
c3VsdDsKKyAgICAgICAgcmVzdWx0Lm1fa2luZCA9IFN0YWNrQXJndW1lbnQ7CisgICAgICAgIHJl
c3VsdC5tX3ZhbHVlID0gb2Zmc2V0RnJvbVNQOworICAgIH0KKworICAgIHN0YXRpYyBWYWx1ZVJl
cCBjb25zdGFudChpbnQ2NF90IHZhbHVlKQorICAgIHsKKyAgICAgICAgVmFsdWVSZXAgcmVzdWx0
OworICAgICAgICByZXN1bHQubV9raW5kID0gQ29uc3RhbnQ7CisgICAgICAgIHJlc3VsdC5tX3Zh
bHVlID0gdmFsdWU7CisgICAgfQorCisgICAgc3RhdGljIFZhbHVlUmVwIGNvbnN0YW50KGRvdWJs
ZSB2YWx1ZSkKKyAgICB7CisgICAgICAgIHJldHVybiBWYWx1ZVJlcChiaXR3aXNlX2Nhc3Q8aW50
NjRfdD4odmFsdWUpKTsKKyAgICB9CisKKyAgICBLaW5kIGtpbmQoKSBjb25zdCB7IHJldHVybiBt
X2tpbmQ7IH0KKworICAgIGV4cGxpY2l0IG9wZXJhdG9yIGJvb2woKSBjb25zdCB7IHJldHVybiBr
aW5kKCkgIT0gQW55OyB9CisKKyAgICBSZWcgcmVnKCkgY29uc3QKKyAgICB7CisgICAgICAgIEFT
U0VSVChraW5kKCkgPT0gUmVnaXN0ZXIpOworICAgICAgICByZXR1cm4gUmVnOjpmcm9tSW5kZXgo
bV92YWx1ZSk7CisgICAgfQorCisgICAgaW50cHRyX3Qgb2Zmc2V0RnJvbUZQKCkgY29uc3QKKyAg
ICB7CisgICAgICAgIEFTU0VSVChraW5kKCkgPT0gU3RhY2spOworICAgICAgICByZXR1cm4gc3Rh
dGljX2Nhc3Q8aW50cHRyX3Q+KG1fdmFsdWUpOworICAgIH0KKworICAgIGludHB0cl90IG9mZnNl
dEZyb21TUCgpIGNvbnN0CisgICAgeworICAgICAgICBBU1NFUlQoa2luZCgpID09IFN0YWNrQXJn
dW1lbnQpOworICAgICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8aW50cHRyX3Q+KG1fdmFsdWUpOwor
ICAgIH0KKworICAgIGludDY0X3QgdmFsdWUoKSBjb25zdAorICAgIHsKKyAgICAgICAgQVNTRVJU
KGtpbmQoKSA9PSBDb25zdGFudCk7CisgICAgICAgIHJldHVybiBtX3ZhbHVlOworICAgIH0KKwor
ICAgIGRvdWJsZSBkb3VibGVWYWx1ZSgpIGNvbnN0CisgICAgeworICAgICAgICByZXR1cm4gYml0
d2lzZV9jYXN0PGRvdWJsZT4odmFsdWUoKSk7CisgICAgfQorCisgICAgdm9pZCBkdW1wKFByaW50
U3RyZWFtJikgY29uc3Q7CisKK3ByaXZhdGU6CisgICAgS2luZCBtX2tpbmQ7CisgICAgaW50NjRf
dCBtX3ZhbHVlOworfTsKKworfSB9IC8vIG5hbWVzcGFjZSBKU0M6OkIzCisKK25hbWVzcGFjZSBX
VEYgeworCit2b2lkIHByaW50SW50ZXJuYWwoUHJpbnRTdHJlYW0mLCBKU0M6OkIzOjpWYWx1ZVJl
cDo6S2luZCk7CisKK30gLy8gbmFtZXNwYWNlIFdURgorCisjZW5kaWYgLy8gQjNWYWx1ZVJlcF9o
CisK
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>263427</attachid>
            <date>2015-10-18 13:40:23 -0700</date>
            <delta_ts>2015-10-18 16:36:36 -0700</delta_ts>
            <desc>B3 instructions are fleshed out</desc>
            <filename>blah.patch</filename>
            <type>text/plain</type>
            <size>125378</size>
            <attacher name="Filip Pizlo">fpizlo</attacher>
            
              <data encoding="base64">SW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM0FyZ3VtZW50UmVnVmFsdWUuY3BwCj09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM0FyZ3VtZW50UmVnVmFsdWUu
Y3BwCShyZXZpc2lvbiAwKQorKysgU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzQXJndW1lbnRS
ZWdWYWx1ZS5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSw0MSBAQAorLyoKKyAqIENvcHly
aWdodCAoQykgMjAxNSBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVk
aXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3
aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUg
Zm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMg
b2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90
aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVy
LgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRo
ZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMg
YW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24g
YW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisg
KgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIGBgQVMgSVMnJyBB
TkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQg
Tk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJ
TElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJ
TUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJF
IExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisg
KiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9U
IExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJ
Q0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVS
UlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElU
WSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElO
Q0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBP
RiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBP
U1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLiAKKyAqLworCisjaW5jbHVkZSAiY29uZmlnLmgiCisj
aW5jbHVkZSAiQjNBcmd1bWVudFJlZ1ZhbHVlLmgiCisKK25hbWVzcGFjZSBKU0MgeyBuYW1lc3Bh
Y2UgQjMgeworCitBcmd1bWVudFJlZ1ZhbHVlOjp+QXJndW1lbnRSZWdWYWx1ZSgpCit7Cit9CisK
K3ZvaWQgQXJndW1lbnRSZWdWYWx1ZTo6ZHVtcE1ldGEoUHJpbnRTdHJlYW0mIG91dCkgY29uc3QK
K3sKKyAgICBvdXQucHJpbnQobV9yZWcpOworfQorCit9IH0gLy8gbmFtZXNwYWNlIEpTQzo6QjMK
KwpJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzQXJndW1lbnRSZWdWYWx1ZS5oCj09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM0FyZ3VtZW50UmVnVmFsdWUu
aAkocmV2aXNpb24gMCkKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM0FyZ3VtZW50UmVn
VmFsdWUuaAkod29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDYwIEBACisvKgorICogQ29weXJpZ2h0
IChDKSAyMDE1IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3Ry
aWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhv
dXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xs
b3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBz
b3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2Us
IHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisg
KiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFi
b3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQg
dGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQv
b3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisg
KiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBB
TlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1Qg
TElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZ
IEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQu
ICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElB
QkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVY
RU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElN
SVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7
IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBU
SU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBX
SEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVE
SU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRI
RSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lC
SUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisKKyNpZm5kZWYgQjNBcmd1bWVudFJlZ1ZhbHVl
X2gKKyNkZWZpbmUgQjNBcmd1bWVudFJlZ1ZhbHVlX2gKKworI2luY2x1ZGUgIkIzVmFsdWUuaCIK
KyNpbmNsdWRlICJSZWcuaCIKKworbmFtZXNwYWNlIEpTQyB7IG5hbWVzcGFjZSBCMyB7CisKK2Ns
YXNzIEFyZ3VtZW50UmVnVmFsdWUgOiBwdWJsaWMgVmFsdWUgeworcHVibGljOgorICAgIHN0YXRp
YyBib29sIGFjY2VwdHMoT3Bjb2RlIG9wY29kZSkgeyByZXR1cm4gb3Bjb2RlID09IEFyZ3VtZW50
UmVnOyB9CisgICAgCisgICAgfkFyZ3VtZW50UmVnVmFsdWUoKTsKKworICAgIFJlZyBhcmd1bWVu
dFJlZygpIGNvbnN0IHsgcmV0dXJuIG1fcmVnOyB9CisKK3Byb3RlY3RlZDoKKyAgICB2b2lkIGR1
bXBNZXRhKFByaW50U3RyZWFtJikgY29uc3Qgb3ZlcnJpZGU7CisKK3ByaXZhdGU6CisgICAgZnJp
ZW5kIGNsYXNzIFByb2NlZHVyZTsKKworICAgIEFyZ3VtZW50UmVnVmFsdWUodW5zaWduZWQgaW5k
ZXgsIE9yaWdpbiBvcmlnaW4sIFJlZyByZWcpCisgICAgICAgIDogVmFsdWUoaW5kZXgsIEFyZ3Vt
ZW50UmVnLCByZWcuaXNHUFIoKSA/IHBvaW50ZXIoKSA6IERvdWJsZSwgb3JpZ2luKQorICAgICAg
ICAsIG1fcmVnKHJlZykKKyAgICB7CisgICAgfQorCisgICAgUmVnIG1fcmVnOworfTsKKworfSB9
IC8vIG5hbWVzcGFjZSBKU0M6OkIzCisKKyNlbmRpZiAvLyBCM0FyZ3VtZW50UmVnVmFsdWVfaAor
CkluZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNCYXNpY0Jsb2NrLmNwcAo9PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNCYXNpY0Jsb2NrLmNwcAkocmV2aXNp
b24gMCkKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM0Jhc2ljQmxvY2suY3BwCSh3b3Jr
aW5nIGNvcHkpCkBAIC0wLDAgKzEsNTggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTUgQXBw
bGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1
c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZp
Y2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRp
b25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11
c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9m
IGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJp
YnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0
CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5n
IGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRl
cmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdB
UkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVT
UyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBU
SEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1Mg
Rk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5U
IFNIQUxMIEFQUExFIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBE
SVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBD
T05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICog
UFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0Us
IERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIg
Q0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09O
VFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5D
RSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0Yg
VEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNI
IERBTUFHRS4gCisgKi8KKworI2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgIkIzQmFzaWNC
bG9jay5oIgorCituYW1lc3BhY2UgSlNDIHsgbmFtZXNwYWNlIEIzIHsKKworQmFzaWNCbG9jazo6
QmFzaWNCbG9jayh1bnNpZ25lZCBpbmRleCkKKyAgICA6IG1faW5kZXgoaW5kZXgpCit7Cit9CisK
K0Jhc2ljQmxvY2s6On5CYXNpY0Jsb2NrKCkKK3sKK30KKwordm9pZCBCYXNpY0Jsb2NrOjphcHBl
bmQoVmFsdWUqIHZhbHVlKQoreworICAgIG1fdmFsdWVzLmFwcGVuZCh2YWx1ZSk7Cit9CisKK3Zv
aWQgQmFzaWNCbG9jazo6ZHVtcChQcmludFN0cmVhbSYgb3V0KSBjb25zdAoreworICAgIG91dC5w
cmludChkdW1wUHJlZml4LCBtX2luZGV4KTsKK30KKwordm9pZCBCYXNpY0Jsb2NrOjpkZWVwRHVt
cChQcmludFN0cmVhbSYgb3V0KSBjb25zdAoreworICAgIG91dC5wcmludCgiQkIiLCAqdGhpcywg
IjpcbiIpOworICAgIGZvciAoVmFsdWUqIHZhbHVlIDogKnRoaXMpCisgICAgICAgIG91dC5wcmlu
dCgiICAgICIsIGRlZXBEdW1wKHZhbHVlKSwgIlxuIik7Cit9CisKK30gfSAvLyBuYW1lc3BhY2Ug
SlNDOjpCMworCkluZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNCYXNpY0Jsb2NrLmgK
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzQmFzaWNCbG9jay5oCShy
ZXZpc2lvbiAwKQorKysgU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzQmFzaWNCbG9jay5oCSh3
b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsMTEyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE1
IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBh
bmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1v
ZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29u
ZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29k
ZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlz
dCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRp
c3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHly
aWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxv
d2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIg
bWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNP
RlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVY
UFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBU
TywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRO
RVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBF
VkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBB
TlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwg
T1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywK
KyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0Yg
VVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dF
VkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElO
IENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJ
R0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAq
IE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0Yg
U1VDSCBEQU1BR0UuIAorICovCisKKyNpZm5kZWYgQjNCYXNpY0Jsb2NrCisjZGVmaW5lIEIzQmFz
aWNCbG9jaworCituYW1lc3BhY2UgSlNDIHsgbmFtZXNwYWNlIEIzIHsKKworY2xhc3MgUHJvY2Vk
dXJlOworY2xhc3MgVmFsdWU7CisKK2NsYXNzIEJhc2ljQmxvY2sgeworICAgIFdURl9NQUtFX05P
TkNPUFlBQkxFKEJhc2ljQmxvY2spOworICAgIFdURl9NQUtFX0ZBU1RfQUxMT0NBVEVEOworcHVi
bGljOgorICAgIHR5cGVkZWYgVmVjdG9yPFZhbHVlKj4gVmFsdWVMaXN0OworICAgIHR5cGVkZWYg
VmVjdG9yPEJhc2ljQmxvY2sqLCAyPiBTdWNjZXNzb3JMaXN0OyAvLyBUaGlzIG1hdGNoZXMgQ29u
dHJvbFZhbHVlJ3MgdHlwZWRlZi4KKworICAgIHN0YXRpYyBjb25zdCBjaGFyKiBkdW1wUHJlZml4
ID0gIiMiOworCisgICAgfkJhc2ljQmxvY2soKTsKKworICAgIHVuc2lnbmVkIGluZGV4KCkgY29u
c3QgeyByZXR1cm4gbV9pbmRleDsgfQorCisgICAgQWRqYWNlbmN5TGlzdDo6aXRlcmF0b3IgYmVn
aW4oKSB7IHJldHVybiBtX3ZhbHVlcy5iZWdpbigpOyB9CisgICAgQWRqYWNlbmN5TGlzdDo6aXRl
cmF0b3IgZW5kKCkgeyByZXR1cm4gbV92YWx1ZXMuZW5kKCk7IH0KKyAgICBBZGphY2VuY3lMaXN0
Ojpjb25zdF9pdGVyYXRvciBiZWdpbigpIGNvbnN0IHsgcmV0dXJuIG1fdmFsdWVzLmJlZ2luKCk7
IH0KKyAgICBBZGphY2VuY3lMaXN0Ojpjb25zdF9pdGVyYXRvciBlbmQoKSBjb25zdCB7IHJldHVy
biBtX3ZhbHVlcy5lbmQoKTsgfQorCisgICAgc2l6ZV90IHNpemUoKSBjb25zdCB7IHJldHVybiBt
X3ZhbHVlcy5zaXplKCk7IH0KKyAgICBWYWx1ZSogYXQoc2l6ZV90IGluZGV4KSBjb25zdCB7IHJl
dHVybiBtX3ZhbHVlc1tpbmRleF07IH0KKyAgICBWYWx1ZSomIGF0KHNpemVfdCBpbmRleCkgeyBy
ZXR1cm4gbV92YWx1ZXNbaW5kZXhdOyB9CisKKyAgICBWYWx1ZSogbGFzdCgpIGNvbnN0IHsgcmV0
dXJuIG1fdmFsdWVzLmxhc3QoKTsgfQorICAgIFZhbHVlKiYgbGFzdCgpIHsgcmV0dXJuIG1fdmFs
dWVzLmxhc3QoKTsgfQorCisgICAgY29uc3QgVmFsdWVMaXN0JiB2YWx1ZXMoKSBjb25zdCB7IHJl
dHVybiBtX3ZhbHVlczsgfQorICAgIFZhbHVlTGlzdCYgdmFsdWVzKCkgeyByZXR1cm4gbV92YWx1
ZXM7IH0KKworICAgIHZvaWQgYXBwZW5kKFZhbHVlKik7CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFt
ZSBWYWx1ZVR5cGUsIHR5cGVuYW1lLi4uIEFyZ3VtZW50cz4KKyAgICBWYWx1ZVR5cGUqIGFwcGVu
ZE5ldyhQcm9jZWR1cmUmLCBBcmd1bWVudHMuLi4pOworCisgICAgdW5zaWduZWQgbnVtU3VjY2Vz
c29ycygpIGNvbnN0OworICAgIEJhc2ljQmxvY2sqIHN1Y2Nlc3Nvcih1bnNpZ25lZCBpbmRleCkg
Y29uc3Q7CisgICAgQmFzaWNCbG9jayomIHN1Y2Nlc3Nvcih1bnNpZ25lZCBpbmRleCk7CisgICAg
Y29uc3QgU3VjY2Vzc29yTGlzdCYgc3VjY2Vzc29ycygpIGNvbnN0OworCisgICAgdm9pZCBkdW1w
KFByaW50U3RyZWFtJikgY29uc3Q7CisgICAgdm9pZCBkZWVwRHVtcChQcmludFN0cmVhbSYpIGNv
bnN0OworCitwcml2YXRlOgorICAgIGZyaWVuZCBjbGFzcyBQcm9jZWR1cmU7CisgICAgCisgICAg
Ly8gSW5zdGFudGlhdGUgdmlhIFByb2NlZHVyZS4KKyAgICBCYXNpY0Jsb2NrKHVuc2lnbmVkIGlu
ZGV4KTsKKworICAgIHVuc2lnbmVkIG1faW5kZXg7CisgICAgVmFsdWVMaXN0IG1fdmFsdWVzOwor
fTsKKworY2xhc3MgRGVlcEJhc2ljQmxvY2tEdW1wIHsKK3B1YmxpYzoKKyAgICBEZWVwQmFzaWNC
bG9ja0R1bXAoQmFzaWNCbG9jayogYmxvY2spCisgICAgICAgIDogbV9ibG9jayhibG9jaykKKyAg
ICB7CisgICAgfQorCisgICAgdm9pZCBkdW1wKFByaW50U3RyZWFtJiBvdXQpIGNvbnN0CisgICAg
eworICAgICAgICBpZiAobV9ibG9jaykKKyAgICAgICAgICAgIG1fYmxvY2stPmRlZXBEdW1wKG91
dCk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIG91dC5wcmludCgiPG51bGw+Iik7CisgICAg
fQorCitwcml2YXRlOgorICAgIEJhc2ljQmxvY2sqIG1fYmxvY2s7Cit9OworCitEZWVwQmFzaWNC
bG9ja0R1bXAgZGVlcER1bXAoQmFzaWNCbG9jayogYmxvY2spCit7CisgICAgcmV0dXJuIERlZXBC
YXNpY0Jsb2NrRHVtcChibG9jayk7Cit9CisKK30gfSAvLyBuYW1lc3BhY2UgSlNDOjpCMworCisj
ZW5kaWYgLy8gQjNCYXNpY0Jsb2NrCisKSW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9C
M0Jhc2ljQmxvY2tJbmxpbmVzLmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRDb3Jl
L2IzL0IzQmFzaWNCbG9ja0lubGluZXMuaAkocmV2aXNpb24gMCkKKysrIFNvdXJjZS9KYXZhU2Ny
aXB0Q29yZS9iMy9CM0Jhc2ljQmxvY2tJbmxpbmVzLmgJKHdvcmtpbmcgY29weSkKQEAgLTAsMCAr
MSw2NiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNSBBcHBsZSBJbmMuIEFsbCByaWdodHMg
cmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJp
bmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0
ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6Cisg
KiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3Zl
IGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhl
IGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBm
b3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhp
cyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUK
KyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRo
IHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBB
UFBMRSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFO
VElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJS
QU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisg
KiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBP
UgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElO
Q0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdF
UyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJT
VElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJ
VFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBU
SEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJ
TElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJ
U0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVO
IElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLiAKKyAqLworCisj
aWZuZGVmIEIzQmFzaWNCbG9ja0lubGluZXNfaAorI2RlZmluZSBCM0Jhc2ljQmxvY2tJbmxpbmVz
X2gKKworI2luY2x1ZGUgIkIzQmFzaWNCbG9jay5oIgorI2luY2x1ZGUgIkIzQ29udHJvbFZhbHVl
LmgiCisjaW5jbHVkZSAiQjNQcm9jZWR1cmVJbmxpbmVzLmgiCisKK25hbWVzcGFjZSBKU0MgeyBu
YW1lc3BhY2UgQjMgeworCit0ZW1wbGF0ZTx0eXBlbmFtZSBWYWx1ZVR5cGUgdHlwZW5hbWUuLi4g
QXJndW1lbnRzPgorVmFsdWVUeXBlKiBCYXNpY0Jsb2NrOjphcHBlbmROZXcoUHJvY2VkdXJlJiBw
cm9jZWR1cmUsIEFyZ3VtZW50cy4uLiBhcmd1bWVudHMpCit7CisgICAgVmFsdWVUeXBlKiByZXN1
bHQgPSBwcm9jZWR1cmUuYWRkPFZhbHVlVHlwZT4oYXJndW1lbnRzLi4uKTsKKyAgICBhcHBlbmQo
cmVzdWx0KTsKKyAgICByZXR1cm4gcmVzdWx0OworfQorCit1bnNpZ25lZCBCYXNpY0Jsb2NrOjpu
dW1TdWNjZXNzb3JzKCkgY29uc3QKK3sKKyAgICByZXR1cm4gbGFzdCgpLT5hczxDb250cm9sVmFs
dWU+KCktPm51bVN1Y2Nlc3NvcnMoKTsKK30KKworQmFzaWNCbG9jayogQmFzaWNCbG9jazo6c3Vj
Y2Vzc29yKHVuc2lnbmVkIGluZGV4KSBjb25zdAoreworICAgIHJldHVybiBsYXN0KCktPmFzPENv
bnRyb2xWYWx1ZT4oKS0+c3VjY2Vzc29yKGluZGV4KTsKK30KKworQmFzaWNCbG9jayomIEJhc2lj
QmxvY2s6OnN1Y2Nlc3Nvcih1bnNpZ25lZCBpbmRleCkKK3sKKyAgICByZXR1cm4gbGFzdCgpLT5h
czxDb250cm9sVmFsdWU+KCktPnN1Y2Nlc3NvcihpbmRleCk7Cit9CisKK2NvbnN0IEJhc2ljQmxv
Y2s6OlN1Y2Nlc3Nvckxpc3QmIEJhc2ljQmxvY2s6OnN1Y2Nlc3NvcnMoKSBjb25zdAoreworICAg
IHJldHVybiBsYXN0KCktPmFzPENvbnRyb2xWYWx1ZT4oKS0+c3VjY2Vzc29ycygpOworfQorCit9
IH0gLy8gbmFtZXNwYWNlIEpTQzo6QjMKKworI2VuZGlmIC8vIEIzQmFzaWNCbG9ja0lubGluZXNf
aAorCkluZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNDaGVja1ZhbHVlLmNwcAo9PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNDaGVja1ZhbHVlLmNwcAkocmV2
aXNpb24gMCkKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM0NoZWNrVmFsdWUuY3BwCSh3
b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsNDEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTUg
QXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFu
ZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9k
aWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25k
aXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2Rl
IG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0
IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlz
dHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJp
Z2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93
aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBt
YXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09G
VFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQ
UkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRP
LCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5F
U1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVW
RU5UIFNIQUxMIEFQUExFIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFO
WSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBP
UiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAor
ICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBV
U0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VW
RVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4g
Q09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElH
RU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICog
T0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBT
VUNIIERBTUFHRS4gCisgKi8KKworI2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgIkIzQ2hl
Y2tWYWx1ZS5oIgorCituYW1lc3BhY2UgSlNDIHsgbmFtZXNwYWNlIEIzIHsKKworQ2hlY2tWYWx1
ZTo6fkNoZWNrVmFsdWUoKQoreworfQorCit2b2lkIENoZWNrVmFsdWU6OmR1bXBNZXRhKFByaW50
U3RyZWFtJiBvdXQpIGNvbnN0Cit7CisgICAgb3V0LnByaW50KCJzdGFja21hcCA9ICIsIHN0YWNr
bWFwKTsKK30KKworfSB9IC8vIG5hbWVzcGFjZSBKU0M6OkIzCisKSW5kZXg6IFNvdXJjZS9KYXZh
U2NyaXB0Q29yZS9iMy9CM0NoZWNrVmFsdWUuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNj
cmlwdENvcmUvYjMvQjNDaGVja1ZhbHVlLmgJKHJldmlzaW9uIDApCisrKyBTb3VyY2UvSmF2YVNj
cmlwdENvcmUvYjMvQjNDaGVja1ZhbHVlLmgJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSw4MCBA
QAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNSBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2
ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBm
b3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJv
dmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBS
ZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHly
aWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxv
d2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11
c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0
IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAg
IGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBk
aXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJ
TkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywg
SU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVT
IE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQ
T1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUgorICog
Q09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5U
QUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5D
TFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRF
IEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9S
IEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkK
KyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwg
T1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJ
TiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFE
VklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLiAKKyAqLworCisjaWZuZGVm
IEIzQ2hlY2tWYWx1ZV9oCisjZGVmaW5lIEIzQ2hlY2tWYWx1ZV9oCisKKyNpbmNsdWRlICJCM1Zh
bHVlLmgiCisjaW5jbHVkZSAiQjNTdGFja21hcC5oIgorCituYW1lc3BhY2UgSlNDIHsgbmFtZXNw
YWNlIEIzIHsKKworY2xhc3MgQ2hlY2tWYWx1ZSA6IHB1YmxpYyBDaGVjayB7CitwdWJsaWM6Cisg
ICAgc3RhdGljIGJvb2wgYWNjZXB0cyhPcGNvZGUgb3Bjb2RlKQorICAgIHsKKyAgICAgICAgc3dp
dGNoIChvcGNvZGUpIHsKKyAgICAgICAgY2FzZSBDaGVja0FkZDoKKyAgICAgICAgY2FzZSBDaGVj
a1N1YjoKKyAgICAgICAgY2FzZSBDaGVja011bDoKKyAgICAgICAgY2FzZSBDaGVjazoKKyAgICAg
ICAgICAgIHJldHVybiB0cnVlOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJu
IGZhbHNlOworICAgICAgICB9CisgICAgfQorCisgICAgfkNoZWNrVmFsdWUoKTsKKworICAgIFN0
YWNrbWFwIHN0YWNrbWFwOworCitwcm90ZWN0ZWQ6CisgICAgdm9pZCBkdW1wTWV0YShQcmludFN0
cmVhbSYpIGNvbnN0IG92ZXJyaWRlOworCitwcml2YXRlOgorICAgIGZyaWVuZCBjbGFzcyBQcm9j
ZWR1cmU7CisKKyAgICAvLyBVc2UgdGhpcyBmb3JtIGZvciBDaGVja0FkZCwgQ2hlY2tTdWIsIGFu
ZCBDaGVja011bC4KKyAgICBDaGVja1ZhbHVlKHVuc2lnbmVkIGluZGV4LCBPcGNvZGUgb3Bjb2Rl
LCBPcmlnaW4gb3JpZ2luLCBWYWx1ZSogbGVmdCwgVmFsdWUqIHJpZ2h0KQorICAgICAgICA6IFZh
bHVlKGluZGV4LCBvcGNvZGUsIGxlZnQtPnR5cGUoKSwgb3JpZ2luLCBsZWZ0LCByaWdodCkKKyAg
ICB7CisgICAgICAgIEFTU0VSVChpc0ludCh0eXBlKCkpKTsKKyAgICAgICAgQVNTRVJUKGxlZnQt
PnR5cGUoKSA9PSByaWdodC0+dHlwZSgpKTsKKyAgICAgICAgQVNTRVJUKG9wY29kZSA9PSBDaGVj
a0FkZCB8fCBvcGNvZGUgPT0gQ2hlY2tTdWIgfHwgb3Bjb2RlID09IENoZWNrTXVsKTsKKyAgICB9
CisKKyAgICAvLyBVc2UgdGhpcyBmb3JtIGZvciBDaGVjay4KKyAgICBDaGVja1ZhbHVlKHVuc2ln
bmVkIGluZGV4LCBPcGNvZGUgb3Bjb2RlLCBPcmlnaW4gb3JpZ2luLCBWYWx1ZSogcHJlZGljYXRl
KQorICAgICAgICA6IFZhbHVlKGluZGV4LCBvcGNvZGUsIFZvaWQsIG9yaWdpbiwgcHJlZGljYXRl
KQorICAgIHsKKyAgICAgICAgQVNTRVJUKG9wY2RlID09IENoZWNrKTsKKyAgICB9Cit9OworCit9
IH0gLy8gbmFtZXNwYWNlIEpTQzo6QjMKKworI2VuZGlmIC8vIEIzQ2hlY2tWYWx1ZV9oCisKKwpJ
bmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzQ29uc3QzMlZhbHVlLmNwcAo9PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNDb25zdDMyVmFsdWUuY3BwCShyZXZp
c2lvbiAwKQorKysgU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzQ29uc3QzMlZhbHVlLmNwcAko
d29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDQxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE1
IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBh
bmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1v
ZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29u
ZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29k
ZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlz
dCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRp
c3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHly
aWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxv
d2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIg
bWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNP
RlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVY
UFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBU
TywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRO
RVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBF
VkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBB
TlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwg
T1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywK
KyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0Yg
VVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dF
VkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElO
IENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJ
R0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAq
IE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0Yg
U1VDSCBEQU1BR0UuIAorICovCisKKyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJCM0Nv
bnN0MzJWYWx1ZS5oIgorCituYW1lc3BhY2UgSlNDIHsgbmFtZXNwYWNlIEIzIHsKKworQ29uc3Qz
MlZhbHVlOjp+Q29uc3QzMlZhbHVlKCkKK3sKK30KKwordm9pZCBDb25zdDMyVmFsdWU6OmR1bXBN
ZXRhKFByaW50U3RyZWFtJiBvdXQpIGNvbnN0Cit7CisgICAgb3V0LnByaW50KG1fdmFsdWUpOwor
fQorCit9IH0gLy8gbmFtZXNwYWNlIEpTQzo6QjMKKwpJbmRleDogU291cmNlL0phdmFTY3JpcHRD
b3JlL2IzL0IzQ29uc3QzMlZhbHVlLmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRD
b3JlL2IzL0IzQ29uc3QzMlZhbHVlLmgJKHJldmlzaW9uIDApCisrKyBTb3VyY2UvSmF2YVNjcmlw
dENvcmUvYjMvQjNDb25zdDMyVmFsdWUuaAkod29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDU5IEBA
CisvKgorICogQ29weXJpZ2h0IChDKSAyMDE1IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZl
ZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZv
cm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92
aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJl
ZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJp
Z2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93
aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVz
dCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qg
b2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAg
ZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRp
c3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElO
Qy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJ
TkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMg
T0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBP
U0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SCisgKiBD
T05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRB
TCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNM
VURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUg
R09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1Ig
QlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQor
ICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBP
UiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElO
IEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURW
SVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisKKyNpZm5kZWYg
QjNDb25zdDMyVmFsdWVfaAorI2RlZmluZSBCM0NvbnN0MzJWYWx1ZV9oCisKKyNpbmNsdWRlICJC
M1ZhbHVlLmgiCisKK25hbWVzcGFjZSBKU0MgeyBuYW1lc3BhY2UgQjMgeworCitjbGFzcyBDb25z
dDMyVmFsdWUgOiBwdWJsaWMgVmFsdWUgeworcHVibGljOgorICAgIHN0YXRpYyBib29sIGFjY2Vw
dHMoT3Bjb2RlIG9wY29kZSkgeyByZXR1cm4gb3Bjb2RlID09IENvbnN0MzI7IH0KKyAgICAKKyAg
ICB+Q29uc3QzMlZhbHVlKCk7CisgICAgCisgICAgaW50MzJfdCB2YWx1ZSgpIGNvbnN0IHsgcmV0
dXJuIG1fdmFsdWU7IH0KKworcHJvdGVjdGVkOgorICAgIHZvaWQgZHVtcE1ldGEoUHJpbnRTdHJl
YW0mKSBjb25zdCBvdmVycmlkZTsKKworcHJpdmF0ZToKKyAgICBmcmllbmQgY2xhc3MgUHJvY2Vk
dXJlOworCisgICAgQ29uc3QzMlZhbHVlKHVuc2lnbmVkIGluZGV4LCBPcmlnaW4gb3JpZ2luLCBp
bnQzMl90IHZhbHVlKQorICAgICAgICA6IFZhbHVlKGluZGV4LCBDb25zdDMyLCBJbnQzMiwgb3Jp
Z2luKQorICAgICAgICAsIG1fdmFsdWUodmFsdWUpCisgICAgeworICAgIH0KKyAgICAKKyAgICBp
bnQzMl90IG1fdmFsdWU7Cit9OworCit9IH0gLy8gbmFtZXNwYWNlIEpTQzo6QjMKKworI2VuZGlm
IC8vIEIzQ29uc3QzMlZhbHVlX2gKKwpJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0Iz
Q29uc3Q2NFZhbHVlLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMv
QjNDb25zdDY0VmFsdWUuY3BwCShyZXZpc2lvbiAwKQorKysgU291cmNlL0phdmFTY3JpcHRDb3Jl
L2IzL0IzQ29uc3Q2NFZhbHVlLmNwcAkod29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDQxIEBACisv
KgorICogQ29weXJpZ2h0IChDKSAyMDE1IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4K
KyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1z
LCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRl
ZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlz
dHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0
CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5n
IGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCBy
ZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2Yg
Y29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9j
dW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3Ry
aWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4g
YGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNM
VURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0Yg
TUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0Ug
QVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SCisgKiBDT05U
UklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwg
U1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJ
TkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09P
RFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVT
SU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICog
T0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBU
T1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFO
WSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNF
RCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisKKyNpbmNsdWRlICJj
b25maWcuaCIKKyNpbmNsdWRlICJCM0NvbnN0NjRWYWx1ZS5oIgorCituYW1lc3BhY2UgSlNDIHsg
bmFtZXNwYWNlIEIzIHsKKworQ29uc3Q2NFZhbHVlOjp+Q29uc3Q2NFZhbHVlKCkKK3sKK30KKwor
dm9pZCBDb25zdDY0VmFsdWU6OmR1bXBNZXRhKFByaW50U3RyZWFtJiBvdXQpIGNvbnN0Cit7Cisg
ICAgb3V0LnByaW50KG1fdmFsdWUpOworfQorCit9IH0gLy8gbmFtZXNwYWNlIEpTQzo6QjMKKwpJ
bmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzQ29uc3Q2NFZhbHVlLmgKPT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PQotLS0gU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzQ29uc3Q2NFZhbHVlLmgJKHJldmlzaW9u
IDApCisrKyBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNDb25zdDY0VmFsdWUuaAkod29ya2lu
ZyBjb3B5KQpAQCAtMCwwICsxLDU5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE1IEFwcGxl
IEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNl
IGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNh
dGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9u
cworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0
IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBj
b25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1
dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAor
ICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBk
aXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJp
YWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJF
IElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1Mg
T1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhF
CisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZP
UiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBT
SEFMTCBBUFBMRSBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElS
RUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09O
U0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBS
T0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBE
QVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENB
VVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRS
QUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0Ug
T1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRI
SVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBE
QU1BR0UuIAorICovCisKKyNpZm5kZWYgQjNDb25zdDY0VmFsdWVfaAorI2RlZmluZSBCM0NvbnN0
NjRWYWx1ZV9oCisKKyNpbmNsdWRlICJCM1ZhbHVlLmgiCisKK25hbWVzcGFjZSBKU0MgeyBuYW1l
c3BhY2UgQjMgeworCitjbGFzcyBDb25zdDY0VmFsdWUgOiBwdWJsaWMgVmFsdWUgeworcHVibGlj
OgorICAgIHN0YXRpYyBib29sIGFjY2VwdHMoT3Bjb2RlIG9wY29kZSkgeyByZXR1cm4gb3Bjb2Rl
ID09IENvbnN0NjQ7IH0KKyAgICAKKyAgICB+Q29uc3Q2NFZhbHVlKCk7CisgICAgCisgICAgaW50
NjRfdCB2YWx1ZSgpIGNvbnN0IHsgcmV0dXJuIG1fdmFsdWU7IH0KKworcHJvdGVjdGVkOgorICAg
IHZvaWQgZHVtcE1ldGEoUHJpbnRTdHJlYW0mKSBjb25zdCBvdmVycmlkZTsKKworcHJpdmF0ZToK
KyAgICBmcmllbmQgY2xhc3MgUHJvY2VkdXJlOworCisgICAgQ29uc3Q2NFZhbHVlKHVuc2lnbmVk
IGluZGV4LCBPcmlnaW4gb3JpZ2luLCBpbnQ2NF90IHZhbHVlKQorICAgICAgICA6IFZhbHVlKGlu
ZGV4LCBDb25zdDY0LCBJbnQ2NCwgb3JpZ2luKQorICAgICAgICAsIG1fdmFsdWUodmFsdWUpCisg
ICAgeworICAgIH0KKyAgICAKKyAgICBpbnQ2NF90IG1fdmFsdWU7Cit9OworCit9IH0gLy8gbmFt
ZXNwYWNlIEpTQzo6QjMKKworI2VuZGlmIC8vIEIzQ29uc3Q2NFZhbHVlX2gKKwpJbmRleDogU291
cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzQ29uc3REb3VibGVWYWx1ZS5jcHAKPT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQot
LS0gU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzQ29uc3REb3VibGVWYWx1ZS5jcHAJKHJldmlz
aW9uIDApCisrKyBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNDb25zdERvdWJsZVZhbHVlLmNw
cAkod29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDQxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAy
MDE1IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlv
biBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAq
IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcg
Y29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2Ug
Y29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMg
bGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBS
ZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNv
cHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZv
bGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3Ro
ZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElT
IFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAq
IEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRF
RCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBG
SVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBO
TyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZP
UiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFS
WSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBU
TywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1Mg
T0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBI
T1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVS
IElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5F
R0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UK
KyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkg
T0YgU1VDSCBEQU1BR0UuIAorICovCisKKyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJC
M0NvbnN0RG91YmxlVmFsdWUuaCIKKworbmFtZXNwYWNlIEpTQyB7IG5hbWVzcGFjZSBCMyB7CisK
K0NvbnN0RG91YmxlVmFsdWU6On5Db25zdERvdWJsZVZhbHVlKCkKK3sKK30KKwordm9pZCBDb25z
dERvdWJsZVZhbHVlOjpkdW1wTWV0YShQcmludFN0cmVhbSYgb3V0KSBjb25zdAoreworICAgIG91
dC5wcmludGYoIiVsZSIsIG1fdmFsdWUpOworfQorCit9IH0gLy8gbmFtZXNwYWNlIEpTQzo6QjMK
KwpJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzQ29uc3REb3VibGVWYWx1ZS5oCj09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM0NvbnN0RG91YmxlVmFsdWUu
aAkocmV2aXNpb24gMCkKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM0NvbnN0RG91Ymxl
VmFsdWUuaAkod29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDU5IEBACisvKgorICogQ29weXJpZ2h0
IChDKSAyMDE1IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3Ry
aWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhv
dXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xs
b3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBz
b3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2Us
IHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisg
KiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFi
b3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQg
dGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQv
b3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisg
KiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBB
TlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1Qg
TElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZ
IEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQu
ICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElB
QkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVY
RU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElN
SVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7
IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBU
SU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBX
SEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVE
SU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRI
RSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lC
SUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisKKyNpZm5kZWYgQjNDb25zdERvdWJsZVZhbHVl
X2gKKyNkZWZpbmUgQjNDb25zdERvdWJsZVZhbHVlX2gKKworI2luY2x1ZGUgIkIzVmFsdWUuaCIK
KworbmFtZXNwYWNlIEpTQyB7IG5hbWVzcGFjZSBCMyB7CisKK2NsYXNzIENvbnN0RG91YmxlVmFs
dWUgOiBwdWJsaWMgVmFsdWUgeworcHVibGljOgorICAgIHN0YXRpYyBib29sIGFjY2VwdHMoT3Bj
b2RlIG9wY29kZSkgeyByZXR1cm4gb3Bjb2RlID09IENvbnN0RG91YmxlOyB9CisgICAgCisgICAg
fkNvbnN0RG91YmxlVmFsdWUoKTsKKyAgICAKKyAgICBkb3VibGUgdmFsdWUoKSBjb25zdCB7IHJl
dHVybiBtX3ZhbHVlOyB9CisKK3Byb3RlY3RlZDoKKyAgICB2b2lkIGR1bXBNZXRhKFByaW50U3Ry
ZWFtJikgY29uc3Qgb3ZlcnJpZGU7CisKK3ByaXZhdGU6CisgICAgZnJpZW5kIGNsYXNzIFByb2Nl
ZHVyZTsKKworICAgIENvbnN0RG91YmxlVmFsdWUodW5zaWduZWQgaW5kZXgsIE9yaWdpbiBvcmln
aW4sIGRvdWJsZSB2YWx1ZSkKKyAgICAgICAgOiBWYWx1ZShpbmRleCwgQ29uc3REb3VibGUsIERv
dWJsZSwgb3JpZ2luKQorICAgICAgICAsIG1fdmFsdWUodmFsdWUpCisgICAgeworICAgIH0KKyAg
ICAKKyAgICBkb3VibGUgbV92YWx1ZTsKK307CisKK30gfSAvLyBuYW1lc3BhY2UgSlNDOjpCMwor
CisjZW5kaWYgLy8gQjNDb25zdERvdWJsZVZhbHVlX2gKKwpJbmRleDogU291cmNlL0phdmFTY3Jp
cHRDb3JlL2IzL0IzQ29udHJvbFZhbHVlLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNj
cmlwdENvcmUvYjMvQjNDb250cm9sVmFsdWUuY3BwCShyZXZpc2lvbiAwKQorKysgU291cmNlL0ph
dmFTY3JpcHRDb3JlL2IzL0IzQ29udHJvbFZhbHVlLmNwcAkod29ya2luZyBjb3B5KQpAQCAtMCww
ICsxLDQzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE1IEFwcGxlIEluYy4gQWxsIHJpZ2h0
cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQg
YmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1p
dHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoK
KyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJv
dmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0
aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5
IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0
aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRo
ZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdp
dGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZ
IEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJS
QU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdB
UlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIK
KyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMu
IE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwg
SU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1B
R0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNV
QlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJP
RklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5Z
IFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElB
QklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBB
UklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVW
RU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisK
KyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJCM0NvbnRyb2xWYWx1ZS5oIgorCituYW1l
c3BhY2UgSlNDIHsgbmFtZXNwYWNlIEIzIHsKKworQ29udHJvbFZhbHVlOjp+Q29udHJvbFZhbHVl
KCkKK3sKK30KKwordm9pZCBDb250cm9sVmFsdWU6OmR1bXBNZXRhKFByaW50U3RyZWFtJiBvdXQp
IGNvbnN0Cit7CisgICAgQ29tbWFQcmludGVyIGNvbW1hOworICAgIGZvciAoQmFzaWNCbG9jayog
YmxvY2sgOiBtX3N1Y2Nlc3NvcnMpCisgICAgICAgIG91dC5wcmludChjb21tYSwgcG9pbnRlckR1
bXAoYmxvY2spKTsKK30KKworfSB9IC8vIG5hbWVzcGFjZSBKU0M6OkIzCisKSW5kZXg6IFNvdXJj
ZS9KYXZhU2NyaXB0Q29yZS9iMy9CM0NvbnRyb2xWYWx1ZS5oCj09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJj
ZS9KYXZhU2NyaXB0Q29yZS9iMy9CM0NvbnRyb2xWYWx1ZS5oCShyZXZpc2lvbiAwKQorKysgU291
cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzQ29udHJvbFZhbHVlLmgJKHdvcmtpbmcgY29weSkKQEAg
LTAsMCArMSwxMTAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTUgQXBwbGUgSW5jLiBBbGwg
cmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNl
IGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUg
cGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUg
bWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRo
ZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMg
YW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBi
aW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3Rp
Y2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIg
aW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlk
ZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklE
RUQgQlkgQVBQTEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVE
IFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJ
RUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElD
VUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExF
IElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElS
RUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFM
IERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQg
T0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisg
KiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBP
TiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklD
VCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJ
U0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FS
RSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisg
Ki8KKworI2lmbmRlZiBCM0NvbnRyb2xWYWx1ZV9oCisjZGVmaW5lIEIzQ29udHJvbFZhbHVlX2gK
KworI2luY2x1ZGUgIkIzVmFsdWUuaCIKKworbmFtZXNwYWNlIEpTQyB7IG5hbWVzcGFjZSBCMyB7
CisKK2NsYXNzIEJhc2ljQmxvY2s7CisKK2NsYXNzIENvbnRyb2xWYWx1ZSA6IHB1YmxpYyBWYWx1
ZSB7CitwdWJsaWM6CisgICAgc3RhdGljIGJvb2wgYWNjZXB0cyhPcGNvZGUgb3Bjb2RlKQorICAg
IHsKKyAgICAgICAgc3dpdGNoIChvcGNvZGUpIHsKKyAgICAgICAgY2FzZSBKdW1wOgorICAgICAg
ICBjYXNlIEJyYW5jaDoKKyAgICAgICAgY2FzZSBSZXR1cm46CisgICAgICAgIGNhc2UgT29wczoK
KyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICBjYXNlIFN3aXRjaDogCisgICAgICAg
ICAgICAvLyBUaGlzIGlzIGhlcmUgYmVjYXVzZSBTd2l0Y2hWYWx1ZSBpcyBhIHN1YmNsYXNzIG9m
IENvbnRyb2xWYWx1ZSwgc28gd2Ugd2FudAorICAgICAgICAgICAgLy8gc3d0aWNoVmFsdWUtPmFz
PENvbnRyb2xWYWx1ZT4oKSB0byByZXR1cm4gbm9uLW51bGwuCisgICAgICAgICAgICByZXR1cm4g
dHJ1ZTsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAg
ICAgfQorICAgIH0KKworICAgIHR5cGVkZWYgVmVjdG9yPEJhc2ljQmxvY2sqLCAyPiBTdWNjZXNz
b3JMaXN0OworCisgICAgfkNvbnRyb2xWYWx1ZSgpOworCisgICAgdW5zaWduZWQgbnVtU3VjY2Vz
c29ycygpIGNvbnN0IHsgcmV0dXJuIG1fc3VjY2Vzc29ycy5zaXplKCk7IH0KKyAgICBCYXNpY0Js
b2NrKiBzdWNjZXNzb3IodW5zaWduZWQgaW5kZXgpIGNvbnN0IHsgcmV0dXJuIG1fc3VjY2Vzc29y
c1tpXTsgfQorICAgIEJhc2ljQmxvY2sqJiBzdWNjZXNzb3IodW5zaWduZWQgaW5kZXgpIHsgcmV0
dXJuIG1fc3VjY2Vzc29yc1tpXTsgfQorCisgICAgY29uc3QgU3VjY2Vzc29yTGlzdCYgc3VjY2Vz
c29ycygpIGNvbnN0IHsgcmV0dXJuIG1fc3VjY2Vzc29yczsgfQorCitwcm90ZWN0ZWQ6CisgICAg
dm9pZCBkdW1wTWV0YShQcmludFN0cmVhbSYpIGNvbnN0IG92ZXJyaWRlOworCisgICAgLy8gVXNl
IHRoaXMgZm9yIHN1YmNsYXNzZXMuCisgICAgdGVtcGxhdGU8dHlwZW5hbWUuLi4gQXJndW1lbnRz
PgorICAgIENvbnRyb2xWYWx1ZSh1bnNpZ25lZCBpbmRleCwgT3Bjb2RlIG9wY29kZSwgVHlwZSB0
eXBlLCBPcmlnaW4gb3JpZ2luLCBBcmd1bWVudHMuLi4gYXJndW1lbnRzKQorICAgICAgICA6IFZh
bHVlKGluZGV4LCBvcGNvZGUsIHR5cGUsIG9yaWdpbiwgYXJndW1lbnRzLi4uKQorICAgIHsKKyAg
ICB9CisKKyAgICAvLyBTdWJjbGFzc2VzIHdpbGwgcG9wdWxhdGUgdGhpcy4KKyAgICBTdWNjZXNz
b3JMaXN0IG1fc3VjY2Vzc29yczsKKworcHJpdmF0ZToKKyAgICBmcmllbmQgY2xhc3MgUHJvY2Vk
dXJlOworCisgICAgLy8gVXNlIHRoaXMgZm9yIFJldHVybiBhbmQgT29wcy4KKyAgICBDb250cm9s
VmFsdWUodW5zaWduZWQgaW5kZXgsIE9wY29kZSBvcGNvZGUsIE9yaWdpbiBvcmlnaW4pCisgICAg
ICAgIDogVmFsdWUoaW5kZXgsIG9wY29kZSwgVm9pZCwgb3JpZ2luKQorICAgIHsKKyAgICAgICAg
QVNTRVJUKG9wY29kZSA9PSBSZXR1cm4gfHwgb3Bjb2RlID09IE9vcHMpOworICAgIH0KKworICAg
IC8vIFVzZSB0aGlzIGZvciBKdW1wLgorICAgIENvbnRyb2xWYWx1ZSh1bnNpZ25lZCBpbmRleCwg
T3Bjb2RlIG9wY29kZSwgT3JpZ2luIG9yaWdpbiwgQmFzaWNCbG9jayogdGFyZ2V0KQorICAgICAg
ICA6IFZhbHVlKGluZGV4LCBvcGNvZGUsIFZvaWQsIG9yaWdpbikKKyAgICB7CisgICAgICAgIEFT
U0VSVChvcGNvZGUgPT0gSnVtcCk7CisgICAgICAgIG1fc3VjY2Vzc29ycy5hcHBlbmQodGFyZ2V0
KTsKKyAgICB9CisKKyAgICAvLyBVc2UgdGhpcyBmb3IgQnJhbmNoLgorICAgIENvbnRyb2xWYWx1
ZSgKKyAgICAgICAgdW5zaWduZWQgaW5kZXgsIE9wY29kZSBvcGNvZGUsIE9yaWdpbiBvcmlnaW4s
IFZhbHVlKiBwcmVkaWNhdGUsCisgICAgICAgIEJhc2ljQmxvY2sqIHllcywgQmFzaWNCbG9jayog
bm8pCisgICAgICAgIDogVmFsdWUoaW5kZXgsIG9wY29kZSwgVm9pZCwgb3JpZ2luLCBwcmVkaWNh
dGUpCisgICAgeworICAgICAgICBBU1NFUlQob3Bjb2RlID09IEJyYW5jaCk7CisgICAgICAgIG1f
c3VjY2Vzc29ycy5hcHBlbmQoeWVzKTsKKyAgICAgICAgbV9zdWNjZXNzb3JzLmFwcGVuZChubyk7
CisgICAgfQorfTsKKworfSB9IC8vIG5hbWVzcGFjZSBKU0M6OkIzCisKKyNlbmRpZiAvLyBCM0Nv
bnRyb2xWYWx1ZV9oCisKSW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM0luZGV4U2V0
LmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzSW5kZXhTZXQuaAko
cmV2aXNpb24gMCkKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM0luZGV4U2V0LmgJKHdv
cmtpbmcgY29weSkKQEAgLTAsMCArMSwxNDEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTUg
QXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFu
ZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9k
aWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25k
aXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2Rl
IG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0
IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlz
dHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJp
Z2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93
aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBt
YXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09G
VFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQ
UkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRP
LCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5F
U1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVW
RU5UIFNIQUxMIEFQUExFIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFO
WSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBP
UiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAor
ICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBV
U0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VW
RVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4g
Q09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElH
RU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICog
T0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBT
VUNIIERBTUFHRS4gCisgKi8KKworI2lmbmRlZiBCM0luZGV4U2V0X2gKKyNkZWZpbmUgQjNJbmRl
eFNldF9oCisKKyNpbmNsdWRlIDx3dGYvQml0VmVjdG9yLmg+CisjaW5jbHVkZSA8d3RmL0NvbW1h
UHJpbnRlci5oPgorCituYW1lc3BhY2UgSlNDIHsgbmFtZXNwYWNlIEIzIHsKKworLy8gVGhpcyBp
cyBhIHNldCBmb3IgdGhpbmdzIHRoYXQgaGF2ZSBhbiBpbmRleCgpLiBJdCdzIHN1cGVyIGVmZmlj
aWVudCBmb3IgQmFzaWNCbG9ja3MuIEl0J3Mgb25seQorLy8gZWZmaWNpZW50IGZvciBWYWx1ZXMg
aWYgeW91IGRvbid0IGNyZWF0ZSB0b28gbWFueSBvZiB0aGVzZSBzZXRzLCBzaW5jZSBWYWx1ZXMg
Y2FuIGhhdmUgdmVyeSBzcGFyc2UKKy8vIGluZGljZXMgYW5kIHRoZXJlIGFyZSBhIGxvdCBvZiBW
YWx1ZXMuCisKKy8vIElmIHlvdSB3YW50IGEgc2V0IG9mIEJhc2ljQmxvY2tzLCB5b3UgZG8gSW5k
ZXhTZXQ8QmFzaWNCbG9jaz4uIFNvLCBUID0gQmFzaWNCbG9jay4KK3RlbXBsYXRlPHR5cGVuYW1l
IFQ+CitjbGFzcyBJbmRleFNldCB7CitwdWJsaWM6CisgICAgSW5kZXhTZXQoKQorICAgIHsKKyAg
ICB9CisKKyAgICBib29sIGFkZChUKiB2YWx1ZSkKKyAgICB7CisgICAgICAgIHJldHVybiAhbV9z
ZXQuc2V0KHZhbHVlLT5pbmRleCgpKTsKKyAgICB9CisKKyAgICBib29sIGNvbnRhaW5zKFQqIHZh
bHVlKSBjb25zdAorICAgIHsKKyAgICAgICAgaWYgKCF2YWx1ZSkKKyAgICAgICAgICAgIHJldHVy
biBudWxscHRyOworICAgICAgICByZXR1cm4gbV9zZXQuZ2V0KHZhbHVlLT5pbmRleCgpKTsKKyAg
ICB9CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBDb2xsZWN0aW9uVHlwZT4KKyAgICBjbGFzcyBJ
dGVyYWJsZSB7CisgICAgcHVibGljOgorICAgICAgICBJdGVyYWJsZShjb25zdCBDb2xsZWN0aW9u
VHlwZSYgY29sbGVjdGlvbiwgY29uc3QgSW5kZXhTZXQmIHNldCkKKyAgICAgICAgICAgIDogbV9j
b2xsZWN0aW9uKGNvbGxlY3Rpb24pCisgICAgICAgICAgICAsIG1fc2V0KHNldCkKKyAgICAgICAg
eworICAgICAgICB9CisKKyAgICAgICAgY2xhc3MgaXRlcmF0b3IgeworICAgICAgICBwdWJsaWM6
CisgICAgICAgICAgICBpdGVyYXRvcigpCisgICAgICAgICAgICAgICAgOiBtX2NvbGxlY3Rpb24o
bnVsbHB0cikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaXRl
cmF0b3IoY29uc3QgQ29sbGVjdGlvblR5cGUmIGNvbGxlY3Rpb24sIEJpdFZlY3Rvcjo6U2V0Qml0
c0l0ZXJhYmxlOjppdGVyYXRvciBpdGVyKQorICAgICAgICAgICAgICAgIDogbV9jb2xsZWN0aW9u
KCZjb2xsZWN0aW9uKQorICAgICAgICAgICAgICAgICwgbV9pdGVyKGl0ZXIpCisgICAgICAgICAg
ICB7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIFQqIG9wZXJhdG9yKigpCisgICAgICAg
ICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG1fY29sbGVjdGlvbi0+YXQoKm1faXRlcik7
CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGl0ZXJhdG9yJiBvcGVyYXRvcisrKCkKKyAg
ICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtX2l0ZXIrKzsKKyAgICAgICAgICAgICAgICBy
ZXR1cm4gKnRoaXM7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGJvb2wgb3BlcmF0b3I9
PShjb25zdCBpdGVyYXRvciYgb3RoZXIpIGNvbnN0CisgICAgICAgICAgICB7CisgICAgICAgICAg
ICAgICAgcmV0dXJuIG1faXRlciA9PSBvdGhlci5tX2l0ZXI7CisgICAgICAgICAgICB9CisKKyAg
ICAgICAgICAgIGJvb2wgb3BlcmF0b3IhPShjb25zdCBpdGVyYXRvciYgb3RoZXIpIGNvbnN0Cisg
ICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuICEoKnRoaXMgPT0gb3RoZXIpOwor
ICAgICAgICAgICAgfQorCisgICAgICAgIHByaXZhdGU6CisgICAgICAgICAgICBjb25zdCBDb2xs
ZWN0aW9uVHlwZSogbV9jb2xsZWN0aW9uOworICAgICAgICAgICAgQml0VmVjdG9yOjpTZXRCaXRz
SXRlcmFibGU6Oml0ZXJhdG9yIG1faXRlcjsKKyAgICAgICAgfTsKKworICAgICAgICBpdGVyYXRv
ciBiZWdpbigpIGNvbnN0IHsgcmV0dXJuIGl0ZXJhdG9yKG1fY29sbGVjdGlvbiwgbV9zZXQuYmVn
aW4oKSk7IH0KKyAgICAgICAgaXRlcmF0b3IgZW5kKCkgY29uc3QgeyByZXR1cm4gaXRlcmF0b3Io
bV9jb2xsZWN0aW9uLCBtX3NldC5lbmQoKSk7IH0KKworICAgIHByaXZhdGU6CisgICAgICAgIGNv
bnN0IENvbGxlY3Rpb25UeXBlJiBtX2NvbGxlY3Rpb247CisgICAgICAgIGNvbnN0IEluZGV4U2V0
JiBtX3NldDsKKyAgICB9OworCisgICAgLy8gRm9yIGJhc2ljIGJsb2NrcywgeW91IGRvOgorICAg
IC8vIGluZGV4U2V0LnZhbHVlcyhwcm9jZWR1cmUpOworICAgIC8vCisgICAgLy8gRm9yIHZhbHVl
cywgeW91IGRvOgorICAgIC8vIGluZGV4U2V0LnZhbHVlcyhwcm9jZWR1cmUudmFsdWVzKCkpOwor
ICAgIHRlbXBsYXRlPHR5cGVuYW1lIENvbGxlY3Rpb25UeXBlPgorICAgIEl0ZXJhYmxlPENvbGxl
Y3Rpb25UeXBlPiB2YWx1ZXMoY29uc3QgQ29sbGVjdGlvblR5cGUmIGNvbGxlY3Rpb24pIGNvbnN0
CisgICAgeworICAgICAgICByZXR1cm4gSXRlcmFibGU8Q29sbGVjdGlvblR5cGU+KGNvbGxlY3Rp
b24pOworICAgIH0KKworICAgIGNvbnN0IEJpdFZlY3RvciYgaW5kaWNlcygpIGNvbnN0IHsgcmV0
dXJuIG1fc2V0OyB9CisKKyAgICB2b2lkIGR1bXAoUHJpbnRTdHJlYW0mIG91dCkgY29uc3QKKyAg
ICB7CisgICAgICAgIENvbW1hUHJpbnRlciBjb21tYTsKKyAgICAgICAgZm9yIChzaXplX3QgaW5k
ZXggOiBpbmRpY2VzKCkuc2V0Qml0cygpKQorICAgICAgICAgICAgb3V0LnByaW50KGNvbW1hLCBU
OjpkdW1wUHJlZml4LCBpbmRleCk7CisgICAgfQorCitwcml2YXRlOgorICAgIEJpdFZlY3RvciBt
X3NldDsKK307CisKK30gfSAvLyBuYW1lc3BhY2UgSlNDOjpCMworCisjZW5kaWYgLy8gQjNJbmRl
eFNldF9oCisKSW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM01lbW9yeVZhbHVlLmNw
cAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNNZW1vcnlWYWx1ZS5j
cHAJKHJldmlzaW9uIDApCisrKyBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNNZW1vcnlWYWx1
ZS5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSw0MiBAQAorLyoKKyAqIENvcHlyaWdodCAo
QykgMjAxNSBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmli
dXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0
CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93
aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291
cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0
aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICog
Mi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92
ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRo
ZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29y
IG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICog
VEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5Z
CisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJ
TUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBB
TkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAg
SU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJM
RSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVN
UExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlU
RUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBM
T1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElP
TikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hF
VEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElO
RyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUg
VVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklM
SVRZIE9GIFNVQ0ggREFNQUdFLiAKKyAqLworCisjaW5jbHVkZSAiY29uZmlnLmgiCisjaW5jbHVk
ZSAiQjNNZW1vcnlWYWx1ZS5oIgorCituYW1lc3BhY2UgSlNDIHsgbmFtZXNwYWNlIEIzIHsKKwor
TWVtb3J5VmFsdWU6On5NZW1vcnlWYWx1ZSgpCit7Cit9CisKK3ZvaWQgTWVtb3J5VmFsdWU6OmR1
bXBNZXRhKFByaW50U3RyZWFtJiBvdXQpIGNvbnN0Cit7CisgICAgaWYgKG1fb2Zmc2V0KQorICAg
ICAgICBvdXQucHJpbnQoIm9mZnNldCA9ICIsIG1fb2Zmc2V0KTsKK30KKworfSB9IC8vIG5hbWVz
cGFjZSBKU0M6OkIzCisKSW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM01lbW9yeVZh
bHVlLmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzTWVtb3J5VmFs
dWUuaAkocmV2aXNpb24gMCkKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM01lbW9yeVZh
bHVlLmgJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSwxNDIgQEAKKy8qCisgKiBDb3B5cmlnaHQg
KEMpIDIwMTUgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJp
YnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91
dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxv
d2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNv
dXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwg
dGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAq
IDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJv
dmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0
aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9v
ciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAq
IFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFTIElTJycgQU5EIEFO
WQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBM
SU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkg
QU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4g
IElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFC
TEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhF
TVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1J
VEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsg
TE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJ
T04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdI
RVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJ
TkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhF
IFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJ
TElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKworI2lmbmRlZiBCM01lbW9yeVZhbHVlX2gKKyNk
ZWZpbmUgQjNNZW1vcnlWYWx1ZV9oCisKKyNpbmNsdWRlICJCM1ZhbHVlLmgiCisKK25hbWVzcGFj
ZSBKU0MgeyBuYW1lc3BhY2UgQjMgeworCitjbGFzcyBNZW1vcnlWYWx1ZSA6IHB1YmxpYyBWYWx1
ZSB7CitwdWJsaWM6CisgICAgc3RhdGljIGJvb2wgYWNjZXB0cyhPcGNvZGUgb3Bjb2RlKQorICAg
IHsKKyAgICAgICAgc3dpdGNoIChvcGNvZGUpIHsKKyAgICAgICAgY2FzZSBMb2FkOFo6CisgICAg
ICAgIGNhc2UgTG9hZDhTOgorICAgICAgICBjYXNlIExvYWQxNlo6CisgICAgICAgIGNhc2UgTG9h
ZDE2UzoKKyAgICAgICAgY2FzZSBMb2FkRmxvYXQ6CisgICAgICAgIGNhc2UgTG9hZDoKKyAgICAg
ICAgY2FzZSBTdG9yZTg6CisgICAgICAgIGNhc2UgU3RvcmUxNjoKKyAgICAgICAgY2FzZSBTdG9y
ZUZsb2F0OgorICAgICAgICBjYXNlIFN0b3JlOgorICAgICAgICAgICAgcmV0dXJuIHRydWU7Cisg
ICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAg
ICB9CisKKyAgICB+TWVtb3J5VmFsdWUoKTsKKworICAgIGludHB0cl90IG9mZnNldCgpIGNvbnN0
IHsgcmV0dXJuIG1fb2Zmc2V0OyB9CisKK3Byb3RlY3RlZDoKKyAgICB2b2lkIGR1bXBNZXRhKFBy
aW50U3RyZWFtJikgY29uc3Qgb3ZlcnJpZGU7CisKK3ByaXZhdGU6CisgICAgZnJpZW5kIGNsYXNz
IFByb2NlZHVyZTsKKworICAgIC8vIFVzZSB0aGlzIGZvcm0gZm9yIExvYWQgKGJ1dCBub3QgTG9h
ZDhaLCBMb2FkOFMsIG9yIGFueSBvZiB0aGUgTG9hZHMgdGhhdCBoYXZlIGEgc3VmZml4IHRoYXQK
KyAgICAvLyBkZXNjcmliZXMgdGhlIHJldHVybmVkIHR5cGUpLgorICAgIE1lbW9yeVZhbHVlKAor
ICAgICAgICB1bnNpZ25lZCBpbmRleCwgT3Bjb2RlIG9wY29kZSwgVHlwZSB0eXBlLCBPcmlnaW4g
b3JpZ2luLCBWYWx1ZSogcG9pbnRlciwKKyAgICAgICAgaW50cHRyX3Qgb2Zmc2V0ID0gMCkKKyAg
ICAgICAgOiBWYWx1ZShpbmRleCwgb3Bjb2RlLCB0eXBlLCBvcmlnaW4sIHBvaW50ZXIpCisgICAg
ICAgICwgbV9vZmZzZXQob2Zmc2V0KQorICAgIHsKKyAgICAgICAgaWYgKCFBU1NFUlRfRElTQUJM
RUQpIHsKKyAgICAgICAgICAgIHN3aXRjaCAob3Bjb2RlKSB7CisgICAgICAgICAgICBjYXNlIExv
YWQ6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIExvYWQ4WjoKKyAg
ICAgICAgICAgIGNhc2UgTG9hZDhTOgorICAgICAgICAgICAgY2FzZSBMb2FkMTZaOgorICAgICAg
ICAgICAgY2FzZSBMb2FkMTZTOgorICAgICAgICAgICAgICAgIEFTU0VSVCh0eXBlID09IEludDMy
KTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgTG9hZEZsb2F0Ogor
ICAgICAgICAgICAgICAgIEFTU0VSVCh0eXBlID09IERvdWJsZSk7CisgICAgICAgICAgICAgICAg
YnJlYWs7CisgICAgICAgICAgICBjYXNlIFN0b3JlODoKKyAgICAgICAgICAgIGNhc2UgU3RvcmUx
NjoKKyAgICAgICAgICAgIGNhc2UgU3RvcmVGbG9hdDoKKyAgICAgICAgICAgIGNhc2UgU3RvcmU6
CisgICAgICAgICAgICAgICAgQVNTRVJUKHR5cGUgPT0gVm9pZCk7CisgICAgICAgICAgICAgICAg
YnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIEFTU0VSVF9OT1Rf
UkVBQ0hFRCgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLy8gVXNl
IHRoaXMgZm9ybSBmb3IgbG9hZHMgd2hlcmUgdGhlIHJldHVybiB0eXBlIGlzIGltcGxpZWQuCisg
ICAgTWVtb3J5VmFsdWUodW5zaWduZWQgaW5kZXgsIE9wY29kZSBvcGNvZGUsIE9yaWdpbiBvcmln
aW4sIFZhbHVlKiBwb2ludGVyLCBpbnRwdHJfdCBvZmZzZXQgPSAwKQorICAgICAgICA6IFZhbHVl
KGluZGV4LCBvcGNvZGUsIG9wY29kZSA9PSBMb2FkRmxvYXQgPyBEb3VibGUgOiBJbnQzMiwgb3Jp
Z2luLCBwb2ludGVyKQorICAgICAgICAsIG1fb2Zmc2V0KG9mZnNldCkKKyAgICB7CisgICAgICAg
IGlmICghQVNTRVJUX0RJU0FCTEVEKSB7CisgICAgICAgICAgICBzd2l0Y2ggKG9wY29kZSkgewor
ICAgICAgICAgICAgY2FzZSBMb2FkOFo6CisgICAgICAgICAgICBjYXNlIExvYWQ4UzoKKyAgICAg
ICAgICAgIGNhc2UgTG9hZDE2WjoKKyAgICAgICAgICAgIGNhc2UgTG9hZDE2UzoKKyAgICAgICAg
ICAgIGNhc2UgTG9hZEZsb2F0OgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAg
ZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBBU1NFUlRfTk9UX1JFQUNIRUQoKTsKKyAgICAgICAg
ICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8v
IFVzZSB0aGlzIGZvcm0gZm9yIHN0b3Jlcy4KKyAgICBNZW1vcnlWYWx1ZSgKKyAgICAgICAgdW5z
aWduZWQgaW5kZXgsIE9wY29kZSBvcGNvZGUsIE9yaWdpbiBvcmlnaW4sIFZhbHVlKiB2YWx1ZSwg
VmFsdWUqIHBvaW50ZXIsCisgICAgICAgIGludHB0cl90IG9mZnNldCA9IDApCisgICAgICAgIDog
VmFsdWUoaW5kZXgsIG9wY29kZSwgVm9pZCwgb3JpZ2luLCB2YWx1ZSwgcG9pbnRlcikKKyAgICAg
ICAgLCBtX29mZnNldChvZmZzZXQpCisgICAgeworICAgICAgICBpZiAoIUFTU0VSVF9ESVNBQkxF
RCkgeworICAgICAgICAgICAgc3dpdGNoIChvcGNvZGUpIHsKKyAgICAgICAgICAgIGNhc2UgU3Rv
cmU4OgorICAgICAgICAgICAgY2FzZSBTdG9yZTE2OgorICAgICAgICAgICAgY2FzZSBTdG9yZUZs
b2F0OgorICAgICAgICAgICAgY2FzZSBTdG9yZToKKyAgICAgICAgICAgICAgICBicmVhazsKKyAg
ICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgQVNTRVJUX05PVF9SRUFDSEVEKCk7
CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9
Cit9OworCit9IH0gLy8gbmFtZXNwYWNlIEpTQzo6QjMKKworI2VuZGlmIC8vIEIzTWVtb3J5VmFs
dWVfaAorCkluZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNPcGNvZGUuY3BwCj09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM09wY29kZS5jcHAJKHJldmlzaW9u
IDApCisrKyBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNPcGNvZGUuY3BwCSh3b3JraW5nIGNv
cHkpCkBAIC0wLDAgKzEsNDcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTUgQXBwbGUgSW5j
LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4g
c291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9u
LCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisg
KiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0
YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRp
dGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9u
cyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAg
ICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2Ns
YWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMg
cHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMg
UFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJ
TVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAq
IElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEg
UEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxM
IEFQUExFIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1Qs
IElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFV
RU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VS
RU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEs
IE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VE
IEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1Qs
IFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBP
VEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBT
T0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFH
RS4gCisgKi8KKworI2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgIkIzT3Bjb2RlLmgiCisK
KyNpbmNsdWRlIDx3dGYvUHJpbnRTdHJlYW0uaD4KKworbmFtZXNwYWNlIFdURiB7CisKK3VzaW5n
IG5hbWVzcGFjZSBKU0M6OkIzOworCit2b2lkIHByaW50SW50ZXJuYWwoUHJpbnRTdHJlYW0mIG91
dCwgT3Bjb2RlIG9wY29kZSkKK3sKKyAgICBzd2l0Y2ggKG9wY29kZSkgeworICAgIGNhc2UgSWRl
bnRpdHk6CisgICAgICAgIG91dC5wcmludCgiSWRlbnRpdHkiKTsKKyAgICAgICAgcmV0dXJuOwor
ICAgICAgICAvLyBGSVhNRQorICAgIH0KKyAgICBSRUxFQVNFX0FTU0VSVF9OT1RfUkVBQ0hFRCgp
OworfQorCit9IC8vIG5hbWVzcGFjZSBXVEYKKwpJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3Jl
L2IzL0IzT3Bjb2RlLmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0Iz
T3Bjb2RlLmgJKHJldmlzaW9uIDApCisrKyBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNPcGNv
ZGUuaAkod29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDIwMyBAQAorLyoKKyAqIENvcHlyaWdodCAo
QykgMjAxNSBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmli
dXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0
CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93
aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291
cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0
aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICog
Mi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92
ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRo
ZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29y
IG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICog
VEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5Z
CisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJ
TUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBB
TkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAg
SU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJM
RSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVN
UExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlU
RUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBM
T1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElP
TikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hF
VEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElO
RyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUg
VVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklM
SVRZIE9GIFNVQ0ggREFNQUdFLiAKKyAqLworCisjaWZuZGVmIEIzT3Bjb2RlX2gKKyNkZWZpbmUg
QjNPcGNvZGVfaAorCisjaW5jbHVkZSA8d3RmL1N0ZExpYkV4dHJhcy5oPgorCituYW1lc3BhY2Ug
SlNDIHsgbmFtZXNwYWNlIEIzIHsKKworZW51bSBPcGNvZGUgOiBpbnQxNl90IHsKKyAgICAvLyBB
IG5vLW9wIHRoYXQgcmV0dXJucyBWb2lkLCB1c2VmdWwgZm9yIHdoZW4geW91IHdhbnQgdG8gcmVt
b3ZlIGEgdmFsdWUuCisgICAgTm9wLAorICAgICAKKyAgICAvLyBQb2x5bW9ycGhpYyBpZGVudGl0
eSwgdXNhYmxlIHdpdGggYW55IHZhbHVlIHR5cGUuCisgICAgSWRlbnRpdHksCisKKyAgICAvLyBD
b25zdGFudHMuIFVzZSB0aGUgQ29uc3RWYWx1ZSogY2xhc3Nlcy4gQ29uc3RhbnRzIGV4aXN0IGlu
IHRoZSBjb250cm9sIGZsb3csIHNvIHRoYXQgd2UgY2FuCisgICAgLy8gcmVhc29uIGFib3V0IHdo
ZXJlIHdlIHdvdWxkIGNvbnN0cnVjdCB0aGVtLiBMYXJnZSBjb25zdGFudHMgYXJlIGV4cGVuc2l2
ZSB0byBjcmVhdGUuCisgICAgQ29uc3QzMiwKKyAgICBDb25zdDY0LAorICAgIENvbnN0RG91Ymxl
LAorCisgICAgLy8gVGhlIG1hZ2ljYWwgc3RhY2sgc2xvdC4gVGhpcyBpcyB2aWV3ZWQgYXMgZXhl
Y3V0aW5nIGF0IHRoZSB0b3Agb2YgdGhlIHByb2dyYW0gcmVnYXJkbGVzcyBvZgorICAgIC8vIHdo
ZXJlIGluIGNvbnRyb2wgZmxvdyB5b3UgcHV0IGl0LiBFYWNoIGluc3RhbmNlIG9mIGEgU3RhY2tT
bG90IFZhbHVlIGdldHMgYSBkaXNqb2ludCByYW5nZSBvZgorICAgIC8vIHN0YWNrIG1lbW9yeS4g
VXNlIHRoZSBTdGFja1Nsb3RWYWx1ZSBjbGFzcy4KKyAgICBTdGFja1Nsb3QsCisKKyAgICAvLyBU
aGUgbWFnaWNhbCBhcmd1bWVudCByZWdpc3Rlci4gVGhpcyBpcyB2aWV3ZWQgYXMgZXhlY3V0aW5n
IGF0IHRoZSB0b3Agb2YgdGhlIHByb2dyYW0KKyAgICAvLyByZWdhcmRsZXNzIG9mIHdoZXJlIGlu
IGNvbnRyb2wgZmxvdyB5b3UgcHV0IGl0LCBhbmQgdGhlIGNvbXBpbGVyIHRha2VzIGNhcmUgdG8g
ZW5zdXJlIHRoYXQgd2UKKyAgICAvLyBkb24ndCBjbG9iYmVyIHRoZSB2YWx1ZSBieSByZWdpc3Rl
ciBhbGxvY2F0aW9uIG9yIGNhbGxzIChlaXRoZXIgYnkgc2F2aW5nIHRoZSBhcmd1bWVudCB0byB0
aGUKKyAgICAvLyBzdGFjayBvciBwcmVzZXJ2aW5nIGl0IGluIGEgY2FsbGVlLXNhdmUgcmVnaXN0
ZXIpLiBVc2UgdGhlIEFyZ3VtZW50UmVnVmFsdWUgY2xhc3MuIFRoZSByZXR1cm4KKyAgICAvLyB0
eXBlIGlzIGVpdGhlciBwb2ludGVyKCkgKGZvciBHUFJzKSBvciBEb3VibGUgKGZvciBGUFJzKS4K
KyAgICBBcmd1bWVudFJlZywKKworICAgIC8vIFRoZSBmcmFtZSBwb2ludGVyLiBZb3UgY2FuIHB1
dCB0aGlzIGFueXdoZXJlIGluIGNvbnRyb2wgZmxvdyBidXQgaXQgd2lsbCBhbHdheXMgeWllbGQg
dGhlCisgICAgLy8gZnJhbWUgcG9pbnRlciwgd2l0aCBhIGNhdmVhdDogaWYgb3VyIGNvbXBpbGVy
IGNoYW5nZXMgdGhlIGZyYW1lIHBvaW50ZXIgdGVtcG9yYXJpbHkgZm9yIHNvbWUKKyAgICAvLyBz
aWxseSByZWFzb24sIHRoZSBGcmFtZVBvaW50ZXIgaW50cmluc2ljIHdpbGwgcmV0dXJuIHdoZXJl
IHRoZSBmcmFtZSBwb2ludGVyICpzaG91bGQqIGJlIG5vdAorICAgIC8vIHdoZXJlIGl0IGhhcHBl
bnMgdG8gYmUgcmlnaHQgbm93LgorICAgIEZyYW1lUG9pbnRlciwKKworICAgIC8vIFBvbHltb3Jw
aGljIG1hdGgsIHVzYWJsZSB3aXRoIGFueSB2YWx1ZSB0eXBlLgorICAgIEFkZCwKKyAgICBTdWIs
CisgICAgTXVsLAorICAgIERpdiwKKworICAgIC8vIEludGVnZXIgbWF0aC4KKyAgICBDaGlsbERp
diwgLy8gZG9lc24ndCB0cmFwIGV2ZXIsIGJlaGF2ZXMgbGlrZSBKUyAoeC95KXwwLgorICAgIE1v
ZCwKKyAgICBCaXRBbmQsCisgICAgQml0T3IsCisgICAgQml0WG9yLAorICAgIFNobCwKKyAgICBT
U2hyLAorICAgIFpTaHIsCisKKyAgICAvLyBDYXN0cyBhbmQgc3VjaC4KKyAgICAvLyBUYWtlcyBh
bmQgcmV0dXJucyBJbnQzMjoKKyAgICBTRXh0OCwKKyAgICBTRXh0MTYsCisgICAgLy8gVGFrZXMg
SW50MzIgYW5kIHJldHVybnMgSW50NjQ6CisgICAgU0V4dDMyLAorICAgIFpFeHQzMiwKKyAgICAv
LyBUYWtlcyBhbmQgcmV0dXJucyBEb3VibGU6CisgICAgRlJvdW5kLAorICAgIC8vIFRha2VzIGlu
dHMgYW5kIHJldHVybnMgRG91YmxlOgorICAgIElUb0QsCisgICAgLy8gVGFrZXMgRG91YmxlIGFu
ZCByZXR1cm5zIEludDMyOgorICAgIERUb0kzMiwKKworICAgIC8vIFBvbHltb3JwaGljIGNvbXBh
cmlzb25zLCB1c2FibGUgd2l0aCBhbnkgdmFsdWUgdHlwZS4gUmV0dXJucyBpbnQzMiAwIG9yIDEu
IE5vdGUgdGhhdCAiTm90IgorICAgIC8vIGlzIGp1c3QgRXF1YWwoeCwgMCkuCisgICAgRXF1YWws
CisgICAgTm90RXF1YWwsCisgICAgTGVzc1RoYW4sCisgICAgR3JlYXRlclRoYW4sCisgICAgTGVz
c0VxdWFsLAorICAgIEdyZWF0ZXJFcXVhbCwKKworICAgIC8vIEludGVnZXIgY29tcGFyaXNvbnMu
IFJldHVybnMgaW50MzIgMCBvciAxLgorICAgIEFib3ZlLAorICAgIEJlbG93LAorICAgIEFib3Zl
RXF1YWwKKyAgICBCZWxvd0VxdWFsLAorCisgICAgLy8gTWVtb3J5IGxvYWRzLiBPcGNvZGUgaW5k
aWNhdGVzIGhvdyB3ZSBsb2FkIGFuZCB0aGUgbG9hZGVkIHR5cGUuIFRoZXNlIHVzZSBNZW1vcnlW
YWx1ZS4KKyAgICAvLyBUaGVzZSByZXR1cm4gSW50MzI6CisgICAgTG9hZDhaLAorICAgIExvYWQ4
UywKKyAgICBMb2FkMTZaLAorICAgIExvYWQxNlMsCisgICAgLy8gVGhpcyByZXR1cm5zIERvdWJs
ZToKKyAgICBMb2FkRmxvYXQsCisgICAgLy8gVGhpcyByZXR1cm4gd2hhdGV2ZXIgdGhlIHJldHVy
biB0eXBlIGlzOgorICAgIExvYWQsCisKKyAgICAvLyBNZW1vcnkgc3RvcmVzLiBPcGNvZGUgaW5k
aWNhdGVzIGhvdyB0aGUgdmFsdWUgaXMgc3RvcmVkLiBUaGVzZSB1c2UgTWVtb3J5VmFsdWUuCisg
ICAgLy8gVGhlc2UgdGFrZSBhbiBJbnQzMiB2YWx1ZToKKyAgICBTdG9yZTgsCisgICAgU3RvcmUx
NiwKKyAgICAvLyBUaGlzIHRha2VzIGEgRG91YmxlIHZhbHVlOgorICAgIFN0b3JlRmxvYXQsCisg
ICAgLy8gVGhpcyBpcyBhIHBvbHltb3JwaGljIHN0b3JlIGZvciBJbnQzMiwgSW50NjQsIGFuZCBE
b3VibGU6CisgICAgU3RvcmUsCisKKyAgICAvLyBUaGlzIGlzIGEgcmVndWxhciBvcmRpbmFyeSBD
IGZ1bmN0aW9uIGNhbGwsIHVzaW5nIHRoZSBzeXN0ZW0gQyBjYWxsaW5nIGNvbnZlbnRpb24uIE1h
a2Ugc3VyZQorICAgIC8vIHRoYXQgdGhlIGFyZ3VtZW50cyBhcmUgcGFzc2VkIHVzaW5nIHRoZSBy
aWdodCB0eXBlcy4KKyAgICBDQ2FsbCwKKworICAgIC8vIFRoaXMgaXMgYSBwYXRjaHBvaW50LiBV
c2UgdGhlIFBhdGNocG9pbnRWYWx1ZSBjbGFzcy4gVGhpcyBpcyB2aWV3ZWQgYXMgYmVoYXZpbmcg
bGlrZSBhIGNhbGwsCisgICAgLy8gYnV0IG9ubHkgZW1pdHMgY29kZSB2aWEgYSBjb2RlIGdlbmVy
YXRpb24gY2FsbGJhY2suIFRoYXQgY2FsbGJhY2sgZ2V0cyB0byBlbWl0IGNvZGUgaW5saW5lLgor
ICAgIC8vIFlvdSBjYW4gcGFzcyBhIHN0YWNrbWFwIGFsb25nIHdpdGggY29uc3RyYWludHMgb24g
aG93IGVhY2ggc3RhY2ttYXAgYXJndW1lbnQgbXVzdCBiZSBwYXNzZWQuCisgICAgLy8gSXQncyBs
ZWdhbCB0byByZXF1ZXN0IHRoYXQgYSBzdGFja21hcCBhcmd1bWVudCBpcyBpbiBzb21lIHJlZ2lz
dGVyIGFuZCBpdCdzIGxlZ2FsIHRvIHJlcXVlc3QKKyAgICAvLyB0aGF0IGEgc3RhY2ttYXAgYXJn
dW1lbnQgaXMgYXQgc29tZSBvZmZzZXQgZnJvbSB0aGUgdG9wIG9mIHRoZSBhcmd1bWVudCBwYXNz
aW5nIGFyZWEgb24gdGhlCisgICAgLy8gc3RhY2suCisgICAgUGF0Y2hwb2ludCwKKworICAgIC8v
IENoZWNrZWQgbWF0aC4gVXNlIHRoZSBDaGVja1ZhbHVlIGNsYXNzLiBMaWtlIGEgUGF0Y2hwb2lu
dCwgdGhpcyB0YWtlcyBhIGNvZGUgZ2VuZXJhdGlvbgorICAgIC8vIGNhbGxiYWNrLiBUaGF0IGNh
bGxiYWNrIGdldHMgdG8gZW1pdCBzb21lIGNvZGUgYWZ0ZXIgdGhlIGVwaWxvZ3VlLCBhbmQgZ2V0
cyB0byBsaW5rIHRoZSBqdW1wCisgICAgLy8gZnJvbSB0aGUgY2hlY2ssIGFuZCB0aGUgY2hvaWNl
IG9mIHJlZ2lzdGVycy4gWW91IGFsc28gZ2V0IHRvIHN1cHBseSBhIHN0YWNrbWFwLiBOb3RlIHRo
YXQgeW91CisgICAgLy8gYXJlIG5vdCBhbGxvd2VkIHRvIGp1bXAgYmFjayBpbnRvIHRoZSBtYWlu
bGluZSBjb2RlIGZyb20geW91ciBzbG93IHBhdGgsIHNpbmNlIHRoZSBjb21waWxlcgorICAgIC8v
IHdpbGwgYXNzdW1lIHRoYXQgdGhlIGV4ZWN1dGlvbiBvZiB0aGVzZSBpbnN0cnVjdGlvbnMgcHJv
dmVzIHRoYXQgb3ZlcmZsb3cgZGlkbid0IGhhcHBlbi4gRm9yCisgICAgLy8gZXhhbXBsZSwgaWYg
eW91IGhhdmUgdHdvIENoZWNrQWRkJ3M6CisgICAgLy8KKyAgICAvLyBhID0gQ2hlY2tBZGQoeCwg
eSkKKyAgICAvLyBiID0gQ2hlY2tBZGQoeCwgeSkKKyAgICAvLworICAgIC8vIFRoZW4gaXQncyB2
YWxpZCB0byBjaGFuZ2UgdGhpcyB0bzoKKyAgICAvLworICAgIC8vIGEgPSBDaGVja0FkZCh4LCB5
KQorICAgIC8vIGIgPSBJZGVudGl0eShhKQorICAgIC8vCisgICAgLy8gVGhpcyBpcyB2YWxpZCBy
ZWdhcmRsZXNzIG9mIHRoZSBjYWxsYmFja3MgdXNlZCBieSB0aGUgdHdvIENoZWNrQWRkcy4gVGhl
eSBtYXkgaGF2ZSBkaWZmZXJlbnQKKyAgICAvLyBjYWxsYmFja3MuIFlldCwgdGhpcyB0cmFuc2Zv
cm1hdGlvbiBpcyB2YWxpZCBldmVuIGlmIHRoZXkgYXJlIGRpZmZlcmVudCBiZWNhdXNlIHdlIGtu
b3cgdGhhdAorICAgIC8vIGFmdGVyIHRoZSBmaXJzdCBDaGVja0FkZCBleGVjdXRlcywgdGhlIHNl
Y29uZCBDaGVja0FkZCBjb3VsZCBub3QgaGF2ZSBwb3NzaWJseSB0YWtlbiBzbG93CisgICAgLy8g
cGF0aC4gVGhlcmVmb3JlLCB0aGUgc2Vjb25kIENoZWNrQWRkJ3MgY2FsbGJhY2sgaXMgaXJyZWxl
dmFudC4KKyAgICBDaGVja0FkZCwKKyAgICBDaGVja1N1YiwKKyAgICBDaGVja011bCwKKworICAg
IC8vIENoZWNrIHRoYXQgc2lkZS1leGl0cy4gVXNlIHRoZSBDaGVja1ZhbHVlIGNsYXNzLiBMaWtl
IENoZWNrQWRkIGFuZCBmcmllbmRzLCB0aGlzIGhhcyBhCisgICAgLy8gc3RhY2ttYXAgd2l0aCBh
IGdlbmVyYXRpb24gY2FsbGJhY2suIFRoaXMgdGFrZXMgYW4gSW50MzIgYXJndW1lbnQgdGhhdCB0
aGlzIGJyYW5jaGVzIG9uLCB3aXRoCisgICAgLy8gZnVsbCBicmFuY2ggZnVzaW9uIGluIHRoZSBp
bnN0cnVjdGlvbiBzZWxlY3Rvci4gQSB0cnVlIHZhbHVlIGp1bXBzIHRvIHRoZSBnZW5lcmF0b3In
cyBzbG93CisgICAgLy8gcGF0aC4KKyAgICBDaGVjaywKKworICAgIC8vIFNTQSBzdXBwb3J0LCBp
biB0aGUgc3R5bGUgb2YgREZHIFNTQS4KKyAgICBVcHNpbG9uLCAvLyBUaGlzIHVzZXMgdGhlIFVw
c2lsb25WYWx1ZSBjbGFzcy4KKyAgICBQaGksCisKKyAgICAvLyBKdW1wLiBVc2VzIHRoZSBDb250
cm9sVmFsdWUgY2xhc3MuCisgICAgSnVtcCwKKyAgICAKKyAgICAvLyBQb2x5bW9ycGhpYyBicmFu
Y2gsIHVzYWJsZSB3aXRoIGFueSB2YWx1ZSB0eXBlLiBCcmFuY2hlcyBpZiBub3QgZXF1YWwgdG8g
emVyby4gVXNlcyB0aGUKKyAgICAvLyBDb250cm9sVmFsdWUgY2xhc3MsIHdpdGggdGhlIDAtaW5k
ZXggc3VjY2Vzc29yIGJlaW5nIHRoZSB0cnVlIHN1Y2Nlc3Nvci4KKyAgICBCcmFuY2gsCisKKyAg
ICAvLyBTd2l0Y2guIFN3aXRjaGVzIG92ZXIgZWl0aGVyIEludDMyIG9yIEludDY0LiBVc2VzIHRo
ZSBTd2l0Y2hWYWx1ZSBjbGFzcy4KKyAgICBTd2l0Y2gsCisKKyAgICAvLyBSZXR1cm4uIE5vdGUg
dGhhdCBCMyBwcm9jZWR1cmVzIGRvbid0IGtub3cgdGhlaXIgcmV0dXJuIHR5cGUsIHNvIHRoaXMg
Y2FuIGp1c3QgcmV0dXJuIGFueQorICAgIC8vIHR5cGUuIFVzZXMgdGhlIENvbnRyb2xWYWx1ZSBj
bGFzcy4KKyAgICBSZXR1cm4sCisKKyAgICAvLyBUaGlzIGlzIGEgdGVybWluYWwgdGhhdCBpbmRp
Y2F0ZXMgdGhhdCB3ZSB3aWxsIG5ldmVyIGdldCBoZXJlLiBVc2VzIHRoZSBDb250cm9sVmFsdWUg
Y2xhc3MuCisgICAgT29wcworfTsKKworfSB9IC8vIG5hbWVzcGFjZSBKU0M6OkIzCisKK25hbWVz
cGFjZSBXVEYgeworCitjbGFzcyBQcmludFN0cmVhbTsKKwordm9pZCBwcmludEludGVybmFsKFBy
aW50U3RyZWFtJiwgSlNDOjpCMzo6T3Bjb2RlKTsKKworfSAvLyBuYW1lc3BhY2UgV1RGCisKKyNl
bmRpZiAvLyBCM09wY29kZV9oCisKSW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM09y
aWdpbi5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzT3JpZ2lu
LmNwcAkocmV2aXNpb24gMCkKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM09yaWdpbi5j
cHAJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSwzNyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykg
MjAxNSBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRp
b24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Cisg
KiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5n
IGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNl
IGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlz
IGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4g
UmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBj
b3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBm
b2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90
aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJ
UyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisg
KiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlU
RUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQg
RklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4g
Tk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBG
T1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExB
UlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQg
VE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NT
IE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikg
SE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhF
UiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBO
RUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNF
CisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZ
IE9GIFNVQ0ggREFNQUdFLiAKKyAqLworCisjaW5jbHVkZSAiY29uZmlnLmgiCisjaW5jbHVkZSAi
QjNPcmlnaW4uaCIKKworbmFtZXNwYWNlIEpTQyB7IG5hbWVzcGFjZSBCMyB7CisKK3ZvaWQgT3Jp
Z2luOjpkdW1wKFByaW50U3RyZWFtJiBvdXQpIGNvbnN0Cit7CisgICAgb3V0LnByaW50KCJPcmln
aW4oIiwgUmF3UG9pbnRlcihtX2RhdGEpLCAiKSIpOworfQorCit9IH0gLy8gbmFtZXNwYWNlIEpT
Qzo6QjMKKwpJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzT3JpZ2luLmgKPT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzT3JpZ2luLmgJKHJldmlzaW9uIDAp
CisrKyBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNPcmlnaW4uaAkod29ya2luZyBjb3B5KQpA
QCAtMCwwICsxLDU1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE1IEFwcGxlIEluYy4gQWxs
IHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJj
ZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJl
IHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJl
IG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0
aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25z
IGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4g
YmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90
aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVy
IGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3Zp
ZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJ
REVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElF
RCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBM
SUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJ
Q1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBM
RSBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJ
UkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElB
TCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5U
IE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgor
ICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQg
T04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJ
Q1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJX
SVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdB
UkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAor
ICovCisKKyNpZm5kZWYgQjNPcmlnaW5faAorI2RlZmluZSBCM09yaWdpbl9oCisKKyNpbmNsdWRl
IDx3dGYvUHJpbnRTdHJlYW0uaD4KKworbmFtZXNwYWNlIEpTQyB7IG5hbWVzcGFjZSBCMyB7CisK
Ky8vIFdob2V2ZXIgZ2VuZXJhdGVzIEIzSVIgY2FuIGNob29zZSB0byBwdXQgb3JpZ2lucyBvbiB2
YWx1ZXMuIFdoZW4geW91IGRvIHRoaXMsIEIzIHdpbGwgYmUgYWJsZSB0bworLy8gYWNjb3VudCwg
ZG93biB0byB0aGUgbWFjaGluZSBjb2RlLCB3aGljaCBpbnN0cnVjdGlvbiBjb3JyZXNwb25kcyB0
byB3aGljaCBvcmlnaW4uIEIzCisvLyB0cmFuc2Zvcm1hdGlvbnMgbXVzdCBwcmVzZXJ2ZSBPcmln
aW5zIGNhcmVmdWxseS4gSXQncyBhbiBlcnJvciB0byB3cml0ZSBhIHRyYW5zZm9ybWF0aW9uIHRo
YXQKKy8vIGVpdGhlciBkcm9wcyBPcmlnaW5zIG9yIGxpZXMgYWJvdXQgdGhlbS4KK2NsYXNzIE9y
aWdpbiB7CitwdWJsaWM6CisgICAgZXhwbGljaXQgT3JpZ2luKGNvbnN0IHZvaWQqIGRhdGEgPSBu
dWxscHRyKQorICAgICAgICA6IG1fZGF0YShkYXRhKQorICAgIHsKKyAgICB9CisKKyAgICBjb25z
dCB2b2lkKiBkYXRhKCkgY29uc3QgeyByZXR1cm4gbV9kYXRhOyB9CisKKyAgICB2b2lkIGR1bXAo
UHJpbnRTdHJlYW0mKSBjb25zdDsKKyAgICAKK3ByaXZhdGU6CisgICAgY29uc3Qgdm9pZCogbV9k
YXRhOworfTsKKworfSB9IC8vIG5hbWVzcGFjZSBKU0M6OkIzCisKKyNlbmRpZiAvLyBCM09yaWdp
bl9oCisKSW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM1BhdGNocG9pbnRWYWx1ZS5j
cHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzUGF0Y2hwb2ludFZh
bHVlLmNwcAkocmV2aXNpb24gMCkKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM1BhdGNo
cG9pbnRWYWx1ZS5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSw0NiBAQAorLyoKKyAqIENv
cHlyaWdodCAoQykgMjAxNSBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICog
UmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBv
ciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0
aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlv
bnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAg
bm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFp
bWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNl
IHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlv
bnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRp
b24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24u
CisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIGBgQVMgSVMn
JyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBC
VVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5U
QUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVND
TEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUgorICogQ09OVFJJQlVUT1JT
IEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUws
CisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQg
Tk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNF
UlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElO
VEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJ
TElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICog
KElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9V
VCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhF
IFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLiAKKyAqLworCisjaW5jbHVkZSAiY29uZmlnLmgi
CisjaW5jbHVkZSAiQjNQYXRjaHBvaW50VmFsdWUuaCIKKworI2luY2x1ZGUgPHd0Zi9Db21tYVBy
aW50ZXIuaD4KKworbmFtZXNwYWNlIEpTQyB7IG5hbWVzcGFjZSBCMyB7CisKK1BhdGNocG9pbnRW
YWx1ZTo6flBhdGNocG9pbnRWYWx1ZSgpCit7Cit9CisKK3ZvaWQgUGF0Y2hwb2ludFZhbHVlOjpk
dW1wTWV0YShQcmludFN0cmVhbSYgb3V0KSBjb25zdAoreworICAgIENvbW1hUHJpbnRlciBjb21t
YTsKKyAgICBvdXQucHJpbnQoY29tbWEsICJzdGFja21hcCA9ICIsIHN0YWNrbWFwKTsKKyAgICBp
ZiAoc2hhZG93KQorICAgICAgICBvdXQucHJpbnQoY29tbWEsICJzaGFkb3cgPSAiLCBzaGFkb3cp
OworfQorCit9IH0gLy8gbmFtZXNwYWNlIEpTQzo6QjMKKwpJbmRleDogU291cmNlL0phdmFTY3Jp
cHRDb3JlL2IzL0IzUGF0Y2hwb2ludFZhbHVlLmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL0phdmFT
Y3JpcHRDb3JlL2IzL0IzUGF0Y2hwb2ludFZhbHVlLmgJKHJldmlzaW9uIDApCisrKyBTb3VyY2Uv
SmF2YVNjcmlwdENvcmUvYjMvQjNQYXRjaHBvaW50VmFsdWUuaAkod29ya2luZyBjb3B5KQpAQCAt
MCwwICsxLDU4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE1IEFwcGxlIEluYy4gQWxsIHJp
Z2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBh
bmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBl
cm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1l
dDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUg
YWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFu
ZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmlu
YXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNl
LCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGlu
IHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVk
IHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVE
IEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBX
QVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVE
IFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VM
QVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJ
TkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVD
VCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBE
QU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9G
IFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICog
UFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04g
QU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1Qg
TElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNF
KSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUs
IEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICov
CisKKyNpZm5kZWYgQjNQYXRjaHBvaW50VmFsdWVfaAorI2RlZmluZSBCM1BhdGNocG9pbnRWYWx1
ZV9oCisKKyNpbmNsdWRlICJCM1ZhbHVlLmgiCisjaW5jbHVkZSAiQjNTdGFja21hcC5oIgorCitu
YW1lc3BhY2UgSlNDIHsgbmFtZXNwYWNlIEIzIHsKKworY2xhc3MgUGF0Y2hwb2ludFZhbHVlIDog
cHVibGljIFZhbHVlIHsKK3B1YmxpYzoKKyAgICBzdGF0aWMgYm9vbCBhY2NlcHRzKE9wY29kZSBv
cGNvZGUpIHsgcmV0dXJuIG9wY29kZSA9PSBQYXRjaHBvaW50OyB9CisKKyAgICB+UGF0Y2hwb2lu
dFZhbHVlKCk7CisKKyAgICBTdGFja21hcCBzdGFja21hcDsKKyAgICB1bnNpZ25lZCBzaGFkb3cg
eyAwIH07CisKK3Byb3RlY3RlZDoKKyAgICB2b2lkIGR1bXBNZXRhKFByaW50U3RyZWFtJikgY29u
c3Qgb3ZlcnJpZGU7CisKK3ByaXZhdGU6CisgICAgZnJpZW5kIGNsYXNzIFByb2NlZHVyZTsKKwor
ICAgIFBhdGNocG9pbnRWYWx1ZSh1bnNpZ25lZCBpbmRleCwgVHlwZSB0eXBlLCBPcmlnaW4gb3Jp
Z2luKQorICAgICAgICA6IFZhbHVlKGluZGV4LCBQYXRjaHBvaW50LCB0eXBlLCBvcmlnaW4pCisg
ICAgeworICAgIH0KK307CisKK30gfSAvLyBuYW1lc3BhY2UgSlNDOjpCMworCisjZW5kaWYgLy8g
QjNQYXRjaHBvaW50VmFsdWVfaAorCkluZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNQ
cm9jZWR1cmUuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM1By
b2NlZHVyZS5jcHAJKHJldmlzaW9uIDApCisrKyBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNQ
cm9jZWR1cmUuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsNTYgQEAKKy8qCisgKiBDb3B5
cmlnaHQgKEMpIDIwMTUgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJl
ZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Ig
d2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhl
IGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25z
IG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5v
dGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1l
ci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0
aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25z
IGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9u
IGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgor
ICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFTIElTJycg
QU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVU
IE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFC
SUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xB
SU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBC
RSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAor
ICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5P
VCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJW
SUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRF
UlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJ
VFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJ
TkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQg
T0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQ
T1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKworI2luY2x1ZGUgImNvbmZpZy5oIgor
I2luY2x1ZGUgIkIzUHJvY2VkdXJlLmgiCisKKyNpbmNsdWRlICJCM0Jhc2ljQmxvY2suaCIKKyNp
bmNsdWRlICJCM1ZhbHVlLmgiCisKK25hbWVzcGFjZSBKU0MgeyBuYW1lc3BhY2UgQjMgeworCitQ
cm9jZWR1cmU6OlByb2NlZHVyZSgpCit7Cit9CisKK1Byb2NlZHVyZTo6flByb2NlZHVyZSgpCit7
Cit9CisKK0Jhc2ljQmxvY2sqIFByb2NlZHVyZTo6YWRkQmxvY2soKQoreworICAgIHN0ZDo6dW5p
cXVlX3B0cjxCYXNpY0Jsb2NrPiBibG9jayA9IHN0ZDo6bWFrZV91bmlxdWU8QmFzaWNCbG9jaz4o
bV9ibG9ja3Muc2l6ZSgpKTsKKyAgICBCYXNpY0Jsb2NrKiByZXN1bHQgPSBibG9jay5nZXQoKTsK
KyAgICBtX2Jsb2Nrcy5hcHBlbmQoV1RGOjptb3ZlKGJsb2NrKSk7CisgICAgcmV0dXJuIHJlc3Vs
dDsKK30KKwordm9pZCBQcm9jZWR1cmU6OmR1bXAoUHJpbnRTdHJlYW0mIG91dCkgY29uc3QKK3sK
KyAgICBmb3IgKEJhc2ljQmxvY2sqIGJsb2NrIDogKnRoaXMpCisgICAgICAgIG91dC5wcmludChk
ZWVwRHVtcChibG9jaykpOworfQorCit9IH0gLy8gbmFtZXNwYWNlIEpTQzo6QjMKSW5kZXg6IFNv
dXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM1Byb2NlZHVyZS5oCj09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJj
ZS9KYXZhU2NyaXB0Q29yZS9iMy9CM1Byb2NlZHVyZS5oCShyZXZpc2lvbiAwKQorKysgU291cmNl
L0phdmFTY3JpcHRDb3JlL2IzL0IzUHJvY2VkdXJlLmgJKHdvcmtpbmcgY29weSkKQEAgLTAsMCAr
MSwxNzcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTUgQXBwbGUgSW5jLiBBbGwgcmlnaHRz
IHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBi
aW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0
dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0Ogor
ICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92
ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRo
ZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkg
Zm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRo
aXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhl
CisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0
aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkg
QVBQTEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJB
TlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FS
UkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgor
ICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4g
T1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJ
TkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFH
RVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VC
U1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9G
SVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkg
VEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFC
SUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFS
SVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZF
TiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKwor
I2lmbmRlZiBCM1Byb2NlZHVyZV9oCisjZGVmaW5lIEIzUHJvY2VkdXJlX2gKKworI2luY2x1ZGUg
PHd0Zi9CYWcuaD4KKyNpbmNsdWRlIDx3dGYvRmFzdE1hbGxvYy5oPgorI2luY2x1ZGUgPHd0Zi9O
b25jb3B5YWJsZS5oPgorI2luY2x1ZGUgPHd0Zi9WZWN0b3IuaD4KKworbmFtZXNwYWNlIEpTQyB7
IG5hbWVzcGFjZSBCMyB7CisKK2NsYXNzIEJhc2ljQmxvY2s7CitjbGFzcyBWYWx1ZTsKKworY2xh
c3MgUHJvY2VkdXJlIHsKKyAgICBXVEZfTUFLRV9OT05DT1BZQUJMRShQcm9jZWR1cmUpOworICAg
IFdURl9NQUtFX0ZBU1RfQUxMT0NBVEVEOworcHVibGljOgorCisgICAgUHJvY2VkdXJlKCk7Cisg
ICAgflByb2NlZHVyZSgpOworCisgICAgQmFzaWNCbG9jayogYWRkQmxvY2soKTsKKyAgICAKKyAg
ICB0ZW1wbGF0ZTx0eXBlbmFtZSBWYWx1ZVR5cGUsIHR5cGVuYW1lLi4uIEFyZ3VtZW50cz4KKyAg
ICBWYWx1ZVR5cGUqIGFkZChBcmd1bWVudHMuLi4pOworCisgICAgdm9pZCBkdW1wKFByaW50U3Ry
ZWFtJikgY29uc3Q7CisKKyAgICB1bnNpZ25lZCBzaXplKCkgY29uc3QgeyByZXR1cm4gbV9ibG9j
a3Muc2l6ZSgpOyB9CisgICAgQmFzaWNCbG9jayogYXQodW5zaWduZWQgaW5kZXgpIGNvbnN0IHsg
cmV0dXJuIG1fYmxvY2tzW2luZGV4XTsgfQorICAgIEJhc2ljQmxvY2sqIG9wZXJhdG9yW10odW5z
aWduZWQgaW5kZXgpIGNvbnN0IHsgcmV0dXJuIGF0KGluZGV4KTsgfQorCisgICAgY2xhc3MgaXRl
cmF0b3IgeworICAgIHB1YmxpYzoKKyAgICAgICAgaXRlcmF0b3IoKToKKyAgICAgICAgICAgIDog
bV9wcm9jZWR1cmUobnVsbHB0cikKKyAgICAgICAgICAgICwgbV9pbmRleCgwKQorICAgICAgICB7
CisgICAgICAgIH0KKworICAgICAgICBpdGVyYXRvcihQcm9jZWR1cmUmIHByb2NlZHVyZSwgdW5z
aWduZWQgaW5kZXgpCisgICAgICAgICAgICA6IG1fcHJvY2VkdXJlKCZwcm9jZWR1cmUpCisgICAg
ICAgICAgICAsIG1faW5kZXgoaW5kZXgpCisgICAgICAgIHsKKyAgICAgICAgfQorCisgICAgICAg
IEJhc2ljQmxvY2sqIG9wZXJhdG9yKigpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBt
X3Byb2NlZHVyZS0+YXQobV9pbmRleCk7CisgICAgICAgIH0KKworICAgICAgICBpdGVyYXRvciYg
b3BlcmF0b3IrKygpCisgICAgICAgIHsKKyAgICAgICAgICAgIG1faW5kZXggPSBmaW5kTmV4dCht
X2luZGV4ICsgMSk7CisgICAgICAgICAgICByZXR1cm4gKnRoaXM7CisgICAgICAgIH0KKworICAg
ICAgICBib29sIG9wZXJhdG9yPT0oY29uc3QgaXRlcmF0b3ImIG90aGVyKSBjb25zdAorICAgICAg
ICB7CisgICAgICAgICAgICByZXR1cm4gbV9pbmRleCA9PSBvdGhlci5tX2luZGV4OworICAgICAg
ICB9CisKKyAgICAgICAgYm9vbCBvcGVyYXRvciE9KGNvbnN0IGl0ZXJhdG9yJiBvdGhlcikgY29u
c3QKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuICEoKnRoaXMgPT0gb3RoZXIpOworICAg
ICAgICB9CisKKyAgICBwcml2YXRlOgorICAgICAgICB1bnNpZ25lZCBmaW5kTmV4dCh1bnNpZ25l
ZCBpbmRleCkKKyAgICAgICAgeworICAgICAgICAgICAgd2hpbGUgKGluZGV4IDwgbV9wcm9jZWR1
cmUtPnNpemUoKSAmJiAhbV9wcm9jZWR1cmUtPmF0KGluZGV4KSkKKyAgICAgICAgICAgICAgICBp
bmRleCsrOworICAgICAgICAgICAgcmV0dXJuIGluZXg7CisgICAgICAgIH0KKworICAgICAgICBQ
cm9jZWR1cmUqIG1fcHJvY2VkdXJlOworICAgICAgICB1bnNpZ25lZCBtX2luZGV4OworICAgIH07
CisKKyAgICBpdGVyYXRvciBiZWdpbigpIGNvbnN0IHsgcmV0dXJuIGl0ZXJhdG9yKCp0aGlzLCAw
KTsgfQorICAgIGl0ZXJhdG9yIGVuZCgpIGNvbnN0IHsgcmV0dXJuIGl0ZXJhdG9yKCp0aGlzLCBu
dW1CbG9ja3MoKSk7IH0KKworICAgIGNsYXNzIFZhbHVlc0NvbGxlY3Rpb24geworICAgIHB1Ymxp
YzoKKyAgICAgICAgVmFsdWVzQ29sbGVjdGlvbihQcm9jZWR1cmUmIHByb2NlZHVyZSkKKyAgICAg
ICAgICAgIDogbV9wcm9jZWR1cmUocHJvY2VkdXJlKQorICAgICAgICB7CisgICAgICAgIH0KKwor
ICAgICAgICBjbGFzcyBpdGVyYXRvciB7CisgICAgICAgIHB1YmxpYzoKKyAgICAgICAgICAgIGl0
ZXJhdG9yKCk6CisgICAgICAgICAgICAgICAgOiBtX3Byb2NlZHVyZShudWxscHRyKQorICAgICAg
ICAgICAgICAgICwgbV9pbmRleCgwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorCisg
ICAgICAgICAgICBpdGVyYXRvcihQcm9jZWR1cmUmIHByb2NlZHVyZSwgdW5zaWduZWQgaW5kZXgp
CisgICAgICAgICAgICAgICAgOiBtX3Byb2NlZHVyZSgmcHJvY2VkdXJlKQorICAgICAgICAgICAg
ICAgICwgbV9pbmRleChpbmRleCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKworICAg
ICAgICAgICAgVmFsdWUqIG9wZXJhdG9yKigpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAg
ICAgcmV0dXJuIG1fcHJvY2VkdXJlLT5ibG9jayhtX2luZGV4KTsKKyAgICAgICAgICAgIH0KKwor
ICAgICAgICAgICAgaXRlcmF0b3ImIG9wZXJhdG9yKysoKQorICAgICAgICAgICAgeworICAgICAg
ICAgICAgICAgIG1faW5kZXgrKzsKKyAgICAgICAgICAgICAgICByZXR1cm4gKnRoaXM7CisgICAg
ICAgICAgICB9CisKKyAgICAgICAgICAgIGJvb2wgb3BlcmF0b3I9PShjb25zdCBpdGVyYXRvciYg
b3RoZXIpIGNvbnN0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG1faW5k
ZXggPT0gb3RoZXIubV9pbmRleDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgYm9vbCBv
cGVyYXRvciE9KGNvbnN0IGl0ZXJhdG9yJiBvdGhlcikgY29uc3QKKyAgICAgICAgICAgIHsKKyAg
ICAgICAgICAgICAgICByZXR1cm4gISgqdGhpcyA9PSBvdGhlcik7CisgICAgICAgICAgICB9CisK
KyAgICAgICAgcHJpdmF0ZToKKworICAgICAgICAgICAgUHJvY2VkdXJlKiBtX3Byb2NlZHVyZTsK
KyAgICAgICAgICAgIHVuc2lnbmVkIG1faW5kZXg7CisgICAgICAgIH07CisKKyAgICAgICAgaXRl
cmF0b3IgYmVnaW4oKSBjb25zdCB7IHJldHVybiBpdGVyYXRvcihtX3Byb2NlZHVyZSwgMCk7IH0K
KyAgICAgICAgaXRlcmF0b3IgZW5kKCkgY29uc3QgeyByZXR1cm4gaXRlcmF0b3IobV9wcm9jZWR1
cmUsIG1fcHJvY2VkdXJlLm1fdmFsdWVzLnNpemUoKSk7IH0KKworICAgICAgICB1bnNpZ25lZCBz
aXplKCkgY29uc3QgeyByZXR1cm4gbV9wcm9jZWR1cmUubV92YWx1ZXMuc2l6ZSgpOyB9CisgICAg
ICAgIFZhbHVlKiBhdCh1bnNpZ25lZCBpbmRleCkgY29uc3QgeyByZXR1cm4gbV9wcm9jZWR1cmUu
bV92YWx1ZXNbaW5kZXhdOyB9CisgICAgICAgIFZhbHVlKiBvcGVyYXRvcltdKHVuc2lnbmVkIGlu
ZGV4KSBjb25zdCB7IHJldHVybiBhdChpbmRleCk7IH0KKyAgICAgICAgCisgICAgcHJpdmF0ZToK
KyAgICAgICAgUHJvY2VkdXJlJiBtX3Byb2NlZHVyZTsKKyAgICB9OworCisgICAgVmFsdWVzQ29s
bGVjdGlvbiB2YWx1ZXMoKSB7IHJldHVybiBWYWx1ZXNDb2xsZWN0aW9uKCp0aGlzKTsgfQorCitw
cml2YXRlOgorICAgIFZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QmFzaWNCbG9jaz4+IG1fYmxvY2tz
OworICAgIFZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8VmFsdWU+PiBtX3ZhbHVlczsKK307CisKK30g
fSAvLyBuYW1lc3BhY2UgSlNDOjpCMworCisjZW5kaWYgLy8gQjNQcm9jZWR1cmVfaAorCkluZGV4
OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNQcm9jZWR1cmVJbmxpbmVzLmgKPT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PQotLS0gU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzUHJvY2VkdXJlSW5saW5lcy5oCShyZXZp
c2lvbiAwKQorKysgU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzUHJvY2VkdXJlSW5saW5lcy5o
CSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsNDYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIw
MTUgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9u
IGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICog
bW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBj
b25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBj
b2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBs
aXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJl
ZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29w
eXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9s
bG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhl
ciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMg
U09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICog
RVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVE
IFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJ
VE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5P
IEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9S
IEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZ
LCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRP
LAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBP
RiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhP
V0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIg
SU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVH
TElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQor
ICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBP
RiBTVUNIIERBTUFHRS4gCisgKi8KKworI2lmbmRlZiBCM1Byb2NlZHVyZUlubGluZXNfaAorI2Rl
ZmluZSBCM1Byb2NlZHVyZUlubGluZXNfaAorCisjaW5jbHVkZSAiQjNCYXNpY0Jsb2NrLmgiCisj
aW5jbHVkZSAiQjNQcm9jZWR1cmUuaCIKKworbmFtZXNwYWNlIEpTQyB7IG5hbWVzcGFjZSBCMyB7
CisKK3RlbXBsYXRlPHR5cGVuYW1lIFZhbHVlVHlwZSwgdHlwZW5hbWUuLi4gQXJndW1lbnRzPgor
VmFsdWVUeXBlKiBQcm9jZWR1cmU6OmFkZChBcmd1ZW50cy4uLiBhcmd1bWVudHMpCit7CisgICAg
c3RkOjp1bmlxdWVfcHRyPFZhbHVlVHlwZT4gdmFsdWUobmV3IFZhbHVlVHlwZShtX3ZhbHVlcy5z
aXplKCksIGFyZ3VtZW50cy4uLikpOworICAgIFZhbHVlVHlwZSogcmVzdWx0ID0gdmFsdWUuZ2V0
KCk7CisgICAgbV92YWx1ZXMuYXBwZW5kKFdURjo6bW92ZSh2YWx1ZSkpOworICAgIHJldHVybiBy
ZXN1bHQ7Cit9CisKK30gfSAvLyBuYW1lc3BhY2UgSlNDOjpCMworCisjZW5kaWYgLy8gQjNQcm9j
ZWR1cmVJbmxpbmVzX2gKKwpJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzU3RhY2tT
bG90VmFsdWUuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM1N0
YWNrU2xvdFZhbHVlLmNwcAkocmV2aXNpb24gMCkKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9i
My9CM1N0YWNrU2xvdFZhbHVlLmNwcAkod29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDQxIEBACisv
KgorICogQ29weXJpZ2h0IChDKSAyMDE1IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4K
KyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1z
LCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRl
ZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlz
dHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0
CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5n
IGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCBy
ZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2Yg
Y29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9j
dW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3Ry
aWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4g
YGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNM
VURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0Yg
TUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0Ug
QVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SCisgKiBDT05U
UklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwg
U1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJ
TkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09P
RFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVT
SU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICog
T0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBU
T1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFO
WSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNF
RCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisKKyNpbmNsdWRlICJj
b25maWcuaCIKKyNpbmNsdWRlICJCM1N0YWNrU2xvdFZhbHVlLmgiCisKK25hbWVzcGFjZSBKU0Mg
eyBuYW1lc3BhY2UgQjMgeworCitTdGFja1Nsb3RWYWx1ZTo6flN0YWNrU2xvdFZhbHVlKCkKK3sK
K30KKwordm9pZCBTdGFja1Nsb3RWYWx1ZTo6ZHVtcE1ldGEoUHJpbnRTdHJlYW0mIG91dCkgY29u
c3QKK3sKKyAgICBvdXQucHJpbnQoImJ5dGVTaXplID0gIiwgbV9ieXRlU2l6ZSk7Cit9CisKK30g
fSAvLyBuYW1lc3BhY2UgSlNDOjpCMworCkluZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMv
QjNTdGFja1Nsb3RWYWx1ZS5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9i
My9CM1N0YWNrU2xvdFZhbHVlLmgJKHJldmlzaW9uIDApCisrKyBTb3VyY2UvSmF2YVNjcmlwdENv
cmUvYjMvQjNTdGFja1Nsb3RWYWx1ZS5oCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsNjUgQEAK
Ky8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTUgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVk
LgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9y
bXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3Zp
ZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVk
aXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmln
aHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dp
bmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0
IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBv
ZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBk
b2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlz
dHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5D
LiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElO
Q0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBP
RiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9T
RSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IKKyAqIENP
TlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFM
LCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xV
RElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBH
T09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBC
VVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisg
KiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9S
IFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4g
QU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJ
U0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKworI2lmbmRlZiBC
M1N0YWNrU2xvdFZhbHVlX2gKKyNkZWZpbmUgQjNTdGFja1Nsb3RWYWx1ZV9oCisKKyNpbmNsdWRl
ICJCM1ZhbHVlLmgiCisKK25hbWVzcGFjZSBKU0MgeyBuYW1lc3BhY2UgQjMgeworCitjbGFzcyBT
dGFja1Nsb3RWYWx1ZSA6IHB1YmxpYyBWYWx1ZSB7CitwdWJsaWM6CisgICAgc3RhdGljIGJvb2wg
YWNjZXB0cyhPcGNvZGUgb3Bjb2RlKSB7IHJldHVybiBvcGNvZGUgPT0gU3RhY2tTbG90OyB9CisK
KyAgICB+U3RhY2tTbG90VmFsdWUoKTsKKworICAgIHVuc2lnbmVkIGJ5dGVTaXplKCkgY29uc3Qg
eyByZXR1cm4gbV9ieXRlU2l6ZTsgfQorCisgICAgLy8gVGhpcyBnZXRzIGFzc2lnbmVkIGF0IHRo
ZSBlbmQgb2YgY29tcGlsYXRpb24uIFlvdSBjYW5ub3QgcmVseSBvbiBpdCBoYXZpbmcgYSBtZWFu
aW5nZnVsCisgICAgLy8gdmFsdWUgd2hpbGUgdGhlIGNvbXBpbGVyIGlzIHJ1bm5pbmcuCisgICAg
aW50cHRyX3Qgb2Zmc2V0RnJvbUZQKCkgY29uc3QgeyByZXR1cm4gbV9vZmZzZXRGcm9tRlA7IH0K
KworcHJvdGVjdGVkOgorICAgIHZvaWQgZHVtcE1ldGEoUHJpbnRTdHJlYW0mKSBjb25zdCBvdmVy
cmlkZTsKKworcHJpdmF0ZToKKyAgICBmcmllbmQgY2xhc3MgUHJvY2VkdXJlOworCisgICAgU3Rh
Y2tTbG90VmFsdWUodW5zaWduZWQgaW5kZXgsIE9yaWdpbiBvcmlnaW4sIHVuc2lnbmVkIGJ5dGVT
aXplKQorICAgICAgICA6IFZhbHVlKGluZGV4LCBTdGFja1Nsb3QsIHBvaW50ZXIoKSwgb3JpZ2lu
KQorICAgICAgICAsIG1fYnl0ZVNpemUoYnl0ZVNpemUpCisgICAgICAgICwgbV9vZmZzZXRGcm9t
RlAoMCkKKyAgICB7CisgICAgfQorCisgICAgdW5zaWduZWQgbV9ieXRlU2l6ZTsKKyAgICBpbnRw
dHJfdCBtX29mZnNldEZyb21GUDsKK307CisKK30gfSAvLyBuYW1lc3BhY2UgSlNDOjpCMworCisj
ZW5kaWYgLy8gQjNTdGFja1Nsb3RWYWx1ZV9oCisKSW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29y
ZS9iMy9CM1N0YWNrbWFwLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUv
YjMvQjNTdGFja21hcC5jcHAJKHJldmlzaW9uIDApCisrKyBTb3VyY2UvSmF2YVNjcmlwdENvcmUv
YjMvQjNTdGFja21hcC5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSw0MCBAQAorLyoKKyAq
IENvcHlyaWdodCAoQykgMjAxNSBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgor
ICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0
aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhh
dCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1
dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICog
ICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNj
bGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9k
dWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRp
dGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50
YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRp
b24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIGBgQVMg
SVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5H
LCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNI
QU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBE
SVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUgorICogQ09OVFJJQlVU
T1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJ
QUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBC
VVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9S
IFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNT
IElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJ
QUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAor
ICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZ
IE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0Yg
VEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLiAKKyAqLworCisjaW5jbHVkZSAiY29uZmln
LmgiCisjaW5jbHVkZSAiQjNTdGFja21hcC5oIgorCituYW1lc3BhY2UgSlNDIHsgbmFtZXNwYWNl
IEIzIHsKKwordm9pZCBTdGFja21hcDo6ZHVtcChQcmludFN0cmVhbSYgb3V0KSBjb25zdAorewor
ICAgIG91dC5wcmludCgKKyAgICAgICAgIntvcGFxdWUgPSAiLCBSYXdQb2ludGVyKG1fb3BhcXVl
KSwgIiwgcmVwcyA9ICIsIGxpc3REdW1wKG1fcmVwcyksCisgICAgICAgICIsIGdlbmVyYXRvciA9
ICIsIFJhd1BvaW50ZXIobV9nZW5lcmF0b3IuZ2V0KCkpLCAiLCBjbG9iYmVyZWQgPSAiLCBtX2Ns
b2JiZXJlZCwKKyAgICAgICAgIiwgdXNlZFJlZ2lzdGVycyA9ICIsIG1fdXNlZFJlZ2lzdGVycywg
In0iKTsKK30KKworfSB9IC8vIG5hbWVzcGFjZSBKU0M6OkIzCisKSW5kZXg6IFNvdXJjZS9KYXZh
U2NyaXB0Q29yZS9iMy9CM1N0YWNrbWFwLmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL0phdmFTY3Jp
cHRDb3JlL2IzL0IzU3RhY2ttYXAuaAkocmV2aXNpb24gMCkKKysrIFNvdXJjZS9KYXZhU2NyaXB0
Q29yZS9iMy9CM1N0YWNrbWFwLmgJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSwxMjAgQEAKKy8q
CisgKiBDb3B5cmlnaHQgKEMpIDIwMTUgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgor
ICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMs
IHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVk
IHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0
cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQK
KyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcg
ZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJl
cHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBj
b25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1
bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJp
YnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBg
YEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xV
RElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBN
RVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBB
UkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IKKyAqIENPTlRS
SUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBT
UEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElO
RywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09E
UyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJ
TkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBP
RiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRP
UlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5Z
IFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VE
IE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKworI2lmbmRlZiBCM1N0
YWNrbWFwX2gKKyNkZWZpbmUgQjNTdGFja21hcF9oCisKKyNpbmNsdWRlICJCM1ZhbHVlUmVwLmgi
CisjaW5jbHVkZSAiQ0NhbGxIZWxwZXJzLmgiCisjaW5jbHVkZSAiUmVnaXN0ZXJTZXQuaCIKKyNp
bmNsdWRlIDx3dGYvU2hhcmVkVGFzay5oPgorCituYW1lc3BhY2UgSlNDIHsgbmFtZXNwYWNlIEIz
IHsKKworY2xhc3MgQjNWYWx1ZTsKKworY2xhc3MgU3RhY2ttYXAgeworcHVibGljOgorICAgIHN0
cnVjdCBHZW5lcmF0aW9uUGFyYW1zIHsKKyAgICAgICAgLy8gVGhpcyBpcyB0aGUgVmFsdWUgY29u
dGFpbmluZyB0aGUgc3RhY2ttYXAuCisgICAgICAgIFZhbHVlKiB2YWx1ZTsKKworICAgICAgICAv
LyBUaGlzIGlzIHRoZSBzdGFja21hcC4KKyAgICAgICAgU3RhY2ttYXAqIHN0YWNrbWFwOworCisg
ICAgICAgIC8vIFRoaXMgaXMgdGhlIGp1bXAgdG8gdGhlIHNsb3cgcGF0aCwgaWYgdGhpcyBpcyBh
IHN0YWNrbWFwIGZvciBhIENoZWNrIHZhbHVlLgorICAgICAgICBDQ2FsbEhlbHBlcnM6Okp1bXAg
anVtcDsKKyAgICB9OworICAgIAorICAgIHR5cGVkZWYgdm9pZCBHZW5lcmF0b3JGdW5jdGlvbihD
Q2FsbEhlbHBlcnMmLCBjb25zdCBHZW5lcmF0aW9uUGFyYW1zJik7CisgICAgdHlwZWRlZiBTaGFy
ZWRUYXNrPEdlbmVyYXRvckZ1bmN0aW9uPiBHZW5lcmF0b3I7CisgICAgCisgICAgU3RhY2ttYXAo
KQorICAgIHsKKyAgICB9CisKKyAgICAvLyBTZXQgc29tZSBvcGFxdWUgZGF0YSB0byBpZGVudGlm
eSB0aGlzIHN0YWNrbWFwLiBUaGlzIGlzIHVzZWZ1bCBiZWNhdXNlIGEgU3RhY2ttYXAtdXNpbmcg
VmFsdWUKKyAgICAvLyBjYW4gYmUgZHVwbGljYXRlZCwgYW5kIGVhY2ggZHVwbGljYXRlIG1heSBl
bmQgdXAgaGF2aW5nIGRpZmZlcmVudCByZWdpc3RlciBhbGxvY2F0aW9uLiBUaGlzCisgICAgLy8g
YWxsb3dzIGFsbCBvZiB0aG9zZSBkdXBsaWNhdGVzIHRvIGJlIGFibGUgdG8gcmVmZXIgYmFjayB0
byB3aGF0ZXZlciBoaWdoLWxldmVsIGRhdGEgc3RydWN0dXJlcworICAgIC8vIHdlIHdlcmUgdXNp
bmcgdG8gY3JlYXRlIHRoZSB2YWx1ZS4KKyAgICB2b2lkIHNldE9wYXF1ZSh2b2lkKiBwYXJhbWV0
ZXIpCisgICAgeworICAgICAgICBtX29wYXF1ZSA9IHBhcmFtZXRlcjsKKyAgICB9CisgICAgdm9p
ZCogb3BhcXVlKCkgY29uc3QgeyByZXR1cm4gbV9vcGFxdWU7IH0KKworICAgIC8vIENvbnZlbmll
bmNlIGhlbHBlcnMgd2hlbiB1c2luZyBpbmRpY2VzIGluc3RlYWQgb2YgcG9pbnRlcnMuCisgICAg
dm9pZCBzZXRPcGFxdWVJbmRleChzaXplX3QgaW5kZXgpCisgICAgeworICAgICAgICBzZXRPcGFx
dWUoYml0d2lzZV9jYXN0PHZvaWQqPihpbmRleCkpOworICAgIH0KKyAgICBzaXplX3Qgb3BhcXVl
SW5kZXgoKSBjb25zdCB7IHJldHVybiBiaXR3aXNlX2Nhc3Q8c2l6ZV90PihvcGFxdWUoKSk7IH0K
KworICAgIC8vIENvbnN0cmFpbiBhbiBhcmd1bWVudCB0byB0aGUgVmFsdWUgdGhhdCB1c2VzIHRo
aXMgU3RhY2ttYXAuIE5vdGUgdGhhdCBpbmRleCB6ZXJvIHJlZmVycyB0byB0aGUKKyAgICAvLyBm
aXJzdCBhcmd1bWVudCB0byB0aGF0IFZhbHVlLCBldmVuIGlmIHRoYXQgYXJndW1lbnQgaXMgbm90
IGNvbnN0cmFpbmFibGUuIEZvciBleGFtcGxlLCBpbiBhCisgICAgLy8gQ2hlY2tBZGQgdmFsdWUs
IGl0IHdvdWxkIGJlIGFuIGVycm9yIHRvIGNvbnN0cmFpbiBpbmRpY2VzIDAgYW5kIDEuIEluIGEg
Q2hlY2sgdmFsdWUsIGl0IHdvdWxkCisgICAgLy8gYmUgYW4gZXJyb3IgdG8gY29uc3RyYWluIGlu
ZGV4IDAuIEJ1dCwgd2hlbiB0aGUgZ2VuZXJhdGlvbiBjYWxsYmFjayBpcyBjYWxsZWQsIHlvdSBj
YW4gZGVwZW5kCisgICAgLy8gb24gdGhlIHJlcHMgZm9yIHRob3NlIGluZGljZXMgYmVpbmcgZmls
bGVkIGluLgorICAgIHZvaWQgY29uc3RyYWluKHVuc2lnbmVkIGluZGV4LCBjb25zdCBWYWx1ZVJl
cCYgcmVwKQorICAgIHsKKyAgICAgICAgaWYgKGluZGV4ICsgMSA8IG1fcmVwcy5zaXplKCkpCisg
ICAgICAgICAgICBtX3JlcHMuZ3JvdyhpbmRleCArIDEpOworICAgICAgICBtX3JlcHNbaW5kZXhd
ID0gcmVwOworICAgIH0KKworICAgIHZvaWQgY2xvYmJlcihjb25zdCBSZWdpc3RlclNldCYgc2V0
KQorICAgIHsKKyAgICAgICAgbV9jbG9iYmVyZWQubWVyZ2Uoc2V0KTsKKyAgICB9CisKKyAgICB2
b2lkIHNldEdlbmVyYXRvcihSZWZQdHI8R2VuZXJhdG9yPiBnZW5lcmF0b3IpCisgICAgeworICAg
ICAgICBtX2dlbmVyYXRvciA9IGdlbmVyYXRvcjsKKyAgICB9CisKKyAgICB0ZW1wbGF0ZTx0eXBl
bmFtZSBGdW5jdG9yPgorICAgIHZvaWQgc2V0R2VuZXJhdG9yKGNvbnN0IEZ1bmN0b3ImIGZ1bmN0
b3IpCisgICAgeworICAgICAgICBtX2dlbmVyYXRvciA9IGNyZWF0ZVNoYXJlZFRhc2s8R2VuZXJh
dG9yRnVuY3Rpb24+KGZ1bmN0b3IpOworICAgIH0KKworICAgIC8vIFRoZXNlIHdpbGwgcmV0dXJu
IGludGVyZXN0aW5nIHRoaW5ncyBpbnNpZGUgdGhlIGdlbmVyYXRvciBjYWxsYmFjaywgb3IgYWZ0
ZXIgY29tcGlsYXRpb24uCisgICAgY29uc3QgVmVjdG9yPFZhbHVlUmVwPiYgcmVwcygpIGNvbnN0
IHsgcmV0dXJuIG1fcmVwczsgfQorICAgIGNvbnN0IFJlZ2lzdGVyU2V0JiB1c2VkUmVnaXN0ZXJz
KCkgY29uc3QgeyByZXR1cm4gbV91c2VkUmVnaXN0ZXJzOyB9CisKKyAgICB2b2lkIGR1bXAoUHJp
bnRTdHJlYW0mKSBjb25zdDsKKyAgICAKK3ByaXZhdGU6CisgICAgdm9pZCogbV9vcGFxdWUgeyBu
dWxscHRyIH07CisgICAgVmVjdG9yPFZhbHVlUmVwPiBtX3JlcHM7CisgICAgUmVmUHRyPEdlbmVy
YXRvcj4gbV9nZW5lcmF0b3I7CisgICAgUmVnaXN0ZXJTZXQgbV9jbG9iYmVyZWQ7CisgICAgUmVn
aXN0ZXJTZXQgbV91c2VkUmVnaXN0ZXJzOworfTsKKworfSB9IC8vIG5hbWVzcGFjZSBKU0M6OkIz
CisKKyNlbmRpZiAvLyBCM1N0YWNrbWFwX2gKKwpJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3Jl
L2IzL0IzU3dpdGNoQ2FzZS5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRDb3Jl
L2IzL0IzU3dpdGNoQ2FzZS5jcHAJKHJldmlzaW9uIDApCisrKyBTb3VyY2UvSmF2YVNjcmlwdENv
cmUvYjMvQjNTd2l0Y2hDYXNlLmNwcAkod29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDM5IEBACisv
KgorICogQ29weXJpZ2h0IChDKSAyMDE1IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4K
KyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1z
LCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRl
ZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlz
dHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0
CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5n
IGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCBy
ZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2Yg
Y29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9j
dW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3Ry
aWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4g
YGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNM
VURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0Yg
TUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0Ug
QVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SCisgKiBDT05U
UklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwg
U1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJ
TkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09P
RFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVT
SU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICog
T0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBU
T1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFO
WSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNF
RCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisKKyNpbmNsdWRlICJj
b25maWcuaCIKKyNpbmNsdWRlICJCM1N3aXRjaENhc2UuaCIKKworI2luY2x1ZGUgIkIzQmFzaWNC
bG9jay5oIgorCituYW1lc3BhY2UgSlNDIHsgbmFtZXNwYWNlIEIzIHsKKwordm9pZCBTd2l0Y2hD
YXNlOjpkdW1wKFByaW50U3RyZWFtJiBvdXQpIGNvbnN0Cit7CisgICAgb3V0LnByaW50KG1fY2Fz
ZVZhbHVlLCAiLT4iLCBwb2ludGVyRHVtcChtX3RhcmdldCkpOworfQorCit9IH0gLy8gbmFtZXNw
YWNlIEpTQzo6QjMKKwpJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzU3dpdGNoQ2Fz
ZS5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM1N3aXRjaENhc2Uu
aAkocmV2aXNpb24gMCkKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM1N3aXRjaENhc2Uu
aAkod29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDYzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAy
MDE1IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlv
biBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAq
IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcg
Y29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2Ug
Y29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMg
bGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBS
ZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNv
cHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZv
bGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3Ro
ZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElT
IFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAq
IEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRF
RCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBG
SVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBO
TyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZP
UiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFS
WSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBU
TywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1Mg
T0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBI
T1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVS
IElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5F
R0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UK
KyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkg
T0YgU1VDSCBEQU1BR0UuIAorICovCisKKyNpZm5kZWYgQjNTd2l0Y2hDYXNlX2gKKyNkZWZpbmUg
QjNTd2l0Y2hDYXNlX2gKKworI2luY2x1ZGUgPHd0Zi9TdGRMaWJFeHRyYXMuaD4KKyNpbmNsdWRl
IDx3dGYvUHJpbnRTdHJlYW0uaD4KKworbmFtZXNwYWNlIEpTQyB7IG5hbWVzcGFjZSBCMyB7CisK
K2NsYXNzIEJhc2ljQmxvY2s7CisKK2NsYXNzIFN3aXRjaENhc2UgeworcHVibGljOgorICAgIFN3
aXRjaENhc2UoKQorICAgIHsKKyAgICB9CisKKyAgICBTd2l0Y2hDYXNlKGludDY0X3QgY2FzZVZh
bHVlLCBCYXNpY0Jsb2NrKiB0YXJnZXQpCisgICAgICAgIDogbV9jYXNlVmFsdWUoY2FzZVZhbHVl
KQorICAgICAgICAsIG1fdGFyZ2V0KHRhcmdldCkKKyAgICB7CisgICAgfQorCisgICAgZXhwbGlj
aXQgb3BlcmF0b3IgYm9vbCgpIGNvbnN0IHsgcmV0dXJuICEhbV90YXJnZXQ7IH0KKworICAgIGlu
dDY0X3QgY2FzZVZhbHVlKCkgY29uc3QgeyByZXR1cm4gbV9jYXNlVmFsdWU7IH0KKyAgICBCYXNp
Y0Jsb2NrKiB0YXJnZXQoKSBjb25zdCB7IHJldHVybiBtX3RhcmdldDsgfQorCisgICAgdm9pZCBk
dW1wKFByaW50U3RyZWFtJiBvdXQpIGNvbnN0OworCitwcml2YXRlOgorICAgIGludDY0X3QgY2Fz
ZVZhbHVlOworICAgIEJhc2ljQmxvY2sqIHRhcmdldDsKK307CisKK30gfSAvLyBuYW1lc3BhY2Ug
SlNDOjpCMworCisjZW5kaWYgLy8gQjNTd2l0Y2hDYXNlX2gKKwpJbmRleDogU291cmNlL0phdmFT
Y3JpcHRDb3JlL2IzL0IzU3dpdGNoVmFsdWUuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZh
U2NyaXB0Q29yZS9iMy9CM1N3aXRjaFZhbHVlLmNwcAkocmV2aXNpb24gMCkKKysrIFNvdXJjZS9K
YXZhU2NyaXB0Q29yZS9iMy9CM1N3aXRjaFZhbHVlLmNwcAkod29ya2luZyBjb3B5KQpAQCAtMCww
ICsxLDYzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE1IEFwcGxlIEluYy4gQWxsIHJpZ2h0
cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQg
YmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1p
dHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoK
KyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJv
dmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0
aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5
IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0
aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRo
ZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdp
dGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZ
IEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJS
QU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdB
UlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIK
KyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMu
IE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwg
SU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1B
R0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNV
QlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJP
RklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5Z
IFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElB
QklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBB
UklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVW
RU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisK
KyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNsZHVlICJCM1N3aXRjaFZhbHVlLmgiCisKK25hbWVz
cGFjZSBKU0MgeyBuYW1lc3BhY2UgQjMgeworCitTd2l0Y2hWYWx1ZTo6flN3aXRjaFZhbHVlKCkK
K3sKK30KKworU3dpdGNoQ2FzZSBTd2l0Y2hWYWx1ZTo6cmVtb3ZlQ2FzZSh1bnNpZ25lZCBpbmRl
eCkKK3sKKyAgICBTd2l0Y2hDYXNlIHJlc3VsdCA9IG1fc3VjY2Vzc29yc1tpbmRleF07CisgICAg
bV9zdWNjZXNzb3JzW2luZGV4XSA9IG1fc3VjY2Vzc29ycy5sYXN0KCk7CisgICAgbV9zdWNjZXNz
b3JzLnJlbW92ZUxhc3QoKTsKKyAgICByZXR1cm4gcmVzdWx0OworfQorCit2b2lkIFN3aXRjaFZh
bHVlOjphcHBlbmRDYXNlKGNvbnN0IFN3aXRjaENhc2UmIHN3aXRjaENhc2UpCit7CisgICAgbV9z
dWNjZXNzb3JzLmFwcGVuZChtX3N1Y2Nlc3NvcnMubGFzdCgpKTsKKyAgICBtX3N1Y2Nlc3NvcnNb
bV9zdWNjZXNzb3JzLnNpemUoKSAtIDJdID0gc3dpdGNoQ2FzZS50YXJnZXQoKTsKKyAgICBtX3Zh
bHVlcy5hcHBlbmQoc3dpdGNoQ2FzZS5jYXNlVmFsdWUoKSk7Cit9CisKK3ZvaWQgU3dpdGNoVmFs
dWU6OmR1bXBNZXRhKFByaW50U3RyZWFtJiBvdXQpIGNvbnN0Cit7CisgICAgLy8gVGhpcyBkZXN0
cnVjdGl2ZWx5IG92ZXJyaWRlcyBDb250cm9sVmFsdWUncyBkdW1wTWV0YSgpLgorICAgIG91dC5w
cmludChsaXN0RHVtcCgqdGhpcykpOworfQorCitTd2l0Y2hWYWx1ZTo6U3dpdGNoVmFsdWUodW5z
aWduZWQgaW5kZXgsIE9yaWdpbiBvcmlnaW4sIEJhc2ljQmxvY2sqIGZhbGxUaHJvdWdoKQorICAg
IDogQ29udHJvbFZhbHVlKGluZGV4LCBTd2l0Y2gsIG9yaWdpbikKK3sKKyAgICBtX3N1Y2Nlc3Nv
cnMuYXBwZW5kKGZhbGxUaHJvdWdoKTsKK30KKworfSB9IC8vIG5hbWVzcGFjZSBKU0M6OkIzCisK
SW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM1N3aXRjaFZhbHVlLmgKPT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PQotLS0gU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzU3dpdGNoVmFsdWUuaAkocmV2aXNpb24g
MCkKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM1N3aXRjaFZhbHVlLmgJKHdvcmtpbmcg
Y29weSkKQEAgLTAsMCArMSwxMjMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTUgQXBwbGUg
SW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2Ug
aW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0
aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25z
CisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3Qg
cmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNv
bmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0
aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Cisg
KiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRp
c2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlh
bHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUg
SVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBP
UiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUK
KyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9S
IEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNI
QUxMIEFQUExFIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJF
Q1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05T
RVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJP
Q1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERB
VEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FV
U0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJB
Q1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBP
UiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJ
UyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERB
TUFHRS4gCisgKi8KKworI2lmbmRlZiBCM1N3aXRjaFZhbHVlX2gKKyNkZWZpbmUgQjNTd2l0Y2hW
YWx1ZV9oCisKKyNpbmNsdWRlICJCM0NvbnRyb2xWYWx1ZS5oIgorI2luY2x1ZGUgIkIzU3dpdGNo
Q2FzZS5oIgorCituYW1lc3BhY2UgSlNDIHsgbmFtZXNwYWNlIEIzIHsKKworY2xhc3MgU3dpdGNo
VmFsdWUgOiBwdWJsaWMgQ29udHJvbFZhbHVlIHsKK3B1YmxpYzoKKyAgICBzdGF0aWMgYm9vbCBh
Y2NlcHRzKE9wY29kZSBvcGNvZGUpIHsgcmV0dXJuIG9wY29kZSA9PSBTd2l0Y2g7IH0KKworICAg
IH5Td2l0Y2hWYWx1ZSgpOworCisgICAgLy8gbnVtQ2FzZVZhbHVlcygpICsgMSA9PSBudW1TdWNj
ZXNzb3JzKCkuCisgICAgdW5zaWduZWQgbnVtQ2FzZVZhbHVlcygpIGNvbnN0IHsgcmV0dXJuIG1f
dmFsdWVzLnNpemUoKTsgfQorCisgICAgLy8gVGhlIHN1Y2Nlc3NvciBmb3IgdGhpcyBjYXNlIHZh
bHVlIGlzIGF0IHRoZSBzYW1lIGluZGV4LgorICAgIGludDY0X3QgY2FzZVZhbHVlKHVuc2lnbmVk
IGluZGV4KSBjb25zdCB7IHJldHVybiBtX3ZhbHVlc1tpXTsgfQorICAgIAorICAgIGNvbnN0IFZl
Y3RvcjxpbnQ2NF90PiYgY2FzZVZhbHVlcygpIGNvbnN0IHsgcmV0dXJuIG1fdmFsdWVzOyB9CisK
KyAgICBCYXNpY0Jsb2NrKiBmYWxsVGhyb3VnaCgpIGNvbnN0IHsgcmV0dXJuIHN1Y2Nlc3NvcnMo
KS5sYXN0KCk7IH0KKyAgICBCYXNpY0Jsb2NrKiYgZmFsbFRocm91Z2goKSB7IHJldHVybiBzdWNj
ZXNzb3JzKCkubGFzdCgpOyB9CisKKyAgICB1bnNpZ25lZCBzaXplKCkgY29uc3QgeyByZXR1cm4g
bnVtQ2FzZVZhbHVlcygpOyB9CisgICAgU3dpdGNoQ2FzZSBhdCh1bnNpZ25lZCBpbmRleCkgY29u
c3QKKyAgICB7CisgICAgICAgIHJldHVybiBTd2l0Y2hDYXNlKGNhc2VWYWx1ZShpbmRleCksIHN1
Y2Nlc3NvcihpbmRleCkpOworICAgIH0KKyAgICBTd2l0Y2hDYXNlIG9wZXJhdG9yW10odW5zaWdu
ZWQgaW5kZXgpIGNvbnN0CisgICAgeworICAgICAgICByZXR1cm4gYXQoaW5kZXgpOworICAgIH0K
KworICAgIGNsYXNzIGl0ZXJhdG9yIHsKKyAgICBwdWJsaWM6CisgICAgICAgIGl0ZXJhdG9yKCkK
KyAgICAgICAgICAgIDogbV9zd2l0Y2gobnVsbHB0cikKKyAgICAgICAgICAgICwgbV9pbmRleCgw
KQorICAgICAgICB7CisgICAgICAgIH0KKworICAgICAgICBpdGVyYXRvcihTd2l0Y2hWYWx1ZSYg
c3dpdGNoVmFsdWUsIHVuc2lnbmVkIGluZGV4KQorICAgICAgICAgICAgOiBtX3N3aXRjaCgmc3dp
dGNoVmFsdWUpCisgICAgICAgICAgICAsIG1faW5kZXgoaW5kZXgpCisgICAgICAgIHsKKyAgICAg
ICAgfQorCisgICAgICAgIFN3aXRjaENhc2Ugb3BlcmF0b3IqKCkKKyAgICAgICAgeworICAgICAg
ICAgICAgcmV0dXJuIG1fc3dpdGNoLT5hdChtX2luZGV4KTsKKyAgICAgICAgfQorCisgICAgICAg
IGl0ZXJhdG9yJiBvcGVyYXRvcisrKCkKKyAgICAgICAgeworICAgICAgICAgICAgbV9pbmRleCsr
OworICAgICAgICAgICAgcmV0dXJuICp0aGlzOworICAgICAgICB9CisKKyAgICAgICAgYm9vbCBv
cGVyYXRvcj09KGNvbnN0IGl0ZXJhdG9yJiBvdGhlcikgY29uc3QKKyAgICAgICAgeworICAgICAg
ICAgICAgcmV0dXJuIG1faW5kZXggPT0gb3RoZXIubV9pbmRleDsKKyAgICAgICAgfQorCisgICAg
ICAgIGJvb2wgb3BlcmF0b3IhPShjb25zdCBpdGVyYXRvciYgb3RoZXIpIGNvbnN0CisgICAgICAg
IHsKKyAgICAgICAgICAgIHJldHVybiAhKCp0aGlzID09IG90aGVyKTsKKyAgICAgICAgfQorCisg
ICAgcHJpdmF0ZToKKyAgICAgICAgU3dpdGNoVmFsdWUqIG1fc3dpdGNoOworICAgICAgICB1bnNp
Z25lZCBtX2luZGV4OworICAgIH07CisKKyAgICBpdGVyYXRvciBiZWdpbigpIGNvbnN0IHsgcmV0
dXJuIGl0ZXJhdG9yKCp0aGlzLCAwKTsgfQorICAgIGl0ZXJhdG9yIGVuZCgpIGNvbnN0IHsgcmV0
dXJuIGl0ZXJhdG9yKCp0aGlzLCBzaXplKCkpOyB9CisKKyAgICAvLyBUaGlzIHJlbW92ZXMgdGhl
IGNhc2UgYW5kIHJlb3JkZXJzIHRoaW5ncyBhIGJpdC4gSWYgeW91J3JlIGl0ZXJhdGluZyB0aGUg
Y2FzZXMgZnJvbSAwIHRvIE4sCisgICAgLy8gdGhlbiB5b3UgY2FuIGtlZXAgaXRlcmF0aW5nIGFm
dGVyIHRoaXMgc28gbG9uZyBhcyB5b3UgcmV2aXNpdCB0aGlzIHNhbWUgaW5kZXggKHdoaWNoIHdp
bGwgbm93CisgICAgLy8gY29udGFpbiBzb21lIG90aGVyIGNhc2UgdmFsdWUpLiBUaGlzIHJlbW92
ZXMgdGhlIGNhc2UgdGhhdCB3YXMgcmVtb3ZlZC4KKyAgICBTd2l0Y2hDYXNlIHJlbW92ZUNhc2Uo
dW5zaWduZWQgaW5kZXgpOworCisgICAgdm9pZCBhcHBlbmRDYXNlKGNvbnN0IFN3aXRjaENhc2Um
IHN3aXRjaENhc2UpOworCitwcm90ZWN0ZWQ6CisgICAgdm9pZCBkdW1wTWV0YShQcmludFN0cmVh
bSYpIGNvbnN0IG92ZXJyaWRlOworCitwcml2YXRlOgorICAgIGZyaWVuZCBjbGFzcyBQcm9jZWR1
cmU7CisKKyAgICBTd2l0Y2hWYWx1ZSh1bnNpZ25lZCBpbmRleCwgT3JpZ2luIG9yaWdpbiwgQmFz
aWNCbG9jayogZmFsbFRocm91Z2gpOworfTsKKworfSB9IC8vIG5hbWVzcGFjZSBKU0M6OkIzCisK
KyNlbmRpZiAvLyBCM1N3aXRjaFZhbHVlX2gKKwpJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3Jl
L2IzL0IzVHlwZS5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0Iz
VHlwZS5jcHAJKHJldmlzaW9uIDApCisrKyBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNUeXBl
LmNwcAkod29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDU0IEBACisvKgorICogQ29weXJpZ2h0IChD
KSAyMDE1IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1
dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQK
KyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dp
bmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3Vy
Y2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRo
aXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAy
LiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3Zl
IGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhl
IGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Ig
b3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBU
SElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkK
KyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElN
SVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFO
RCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJ
TiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxF
IEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1Q
TEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRF
RCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExP
U1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9O
KSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVU
SEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5H
IE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBV
U0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJ
VFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisKKyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRl
ICJCM1R5cGUuaCIKKworI2luY2x1ZGUgPHd0Zi9QcmludFN0cmVhbS5oPgorCituYW1lc3BhY2Ug
V1RGIHsKKwordXNpbmcgbmFtZXNwYWNlIEpTQzo6QjM7CisKK3ZvaWQgcHJpbnRJbnRlcm5hbChQ
cmludFN0cmVhbSYgb3V0LCBUeXBlIHR5cGUpCit7CisgICAgc3dpdGNoICh0eXBlKSB7CisgICAg
Y2FzZSBWb2lkOgorICAgICAgICBvdXQucHJpbnQoIlZvaWQiKTsKKyAgICAgICAgcmV0dXJuOwor
ICAgIGNhc2UgSW50MzI6CisgICAgICAgIG91dC5wcmludCgiSW50MzIiKTsKKyAgICAgICAgcmV0
dXJuOworICAgIGNhc2UgSW50NjQ6CisgICAgICAgIG91dC5wcmludCgiSW50NjQiKTsKKyAgICAg
ICAgcmV0dXJuOworICAgIGNhc2UgRG91YmxlOgorICAgICAgICBvdXQucHJpbnQoIkRvdWJsZSIp
OworICAgICAgICByZXR1cm47CisgICAgfQorICAgIFJFTEVBU0VfQVNTRVJUX05PVF9SRUFDSEVE
KCk7Cit9CisKK30gLy8gbmFtZXNwYWNlIFdURgpJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3Jl
L2IzL0IzVHlwZS5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM1R5
cGUuaAkocmV2aXNpb24gMCkKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM1R5cGUuaAko
d29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDY4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE1
IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBh
bmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1v
ZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29u
ZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29k
ZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlz
dCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRp
c3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHly
aWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxv
d2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIg
bWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNP
RlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVY
UFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBU
TywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRO
RVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBF
VkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBB
TlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwg
T1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywK
KyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0Yg
VVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dF
VkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElO
IENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJ
R0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAq
IE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0Yg
U1VDSCBEQU1BR0UuIAorICovCisKKyNpZm5kZWYgQjNUeXBlX2gKKyNkZWZpbmUgQjNUeXBlX2gK
KworI2luY2x1ZGUgPHd0Zi9TdGRMaWJFeHRyYXMuaD4KKworbmFtZXNwYWNlIEpTQyB7IG5hbWVz
cGFjZSBCMyB7CisKK2VudW0gVHlwZSB7CisgICAgVm9pZCwKKyAgICBJbnQzMiwKKyAgICBJbnQ2
NCwKKyAgICBEb3VibGUKK307CisKK2lubGluZSBib29sIGlzSW50KFR5cGUgdHlwZSkKK3sKKyAg
ICByZXR1cm4gdHlwZSA9PSBJbnQzMiB8fCB0eXBlID09IEludDY0OworfQorCitpbmxpbmUgYm9v
bCBpc0Zsb2F0KFR5cGUgdHlwZSkKK3sKKyAgICByZXR1cm4gdHlwZSA9PSBEb3VibGU7Cit9CisK
K2lubGluZSBUeXBlIHBvaW50ZXIoKSBjb25zdAoreworICAgIGlmIChzaXplb2Yodm9pZCopID09
IDQpCisgICAgICAgIHJldHVybiBJbnQzMjsKKyAgICByZXR1cm4gSW50NjQ7Cit9CisKK30gfSAv
LyBuYW1lc3BhY2UgSlNDOjpCMworCituYW1lc3BhY2UgV1RGIHsKKworY2xhc3MgUHJpbnRTdHJl
YW07CisKK3ZvaWQgcHJpbnRJbnRlcm5hbChQcmludFN0cmVhbSYsIEpTQzo6QjM6OlR5cGUpOwor
Cit9IC8vIG5hbWVzcGFjZSBXVEYKKworI2VuZGlmIC8vIEIzVHlwZV9oCisKSW5kZXg6IFNvdXJj
ZS9KYXZhU2NyaXB0Q29yZS9iMy9CM1Vwc2lsb25WYWx1ZS5jcHAKPT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291
cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzVXBzaWxvblZhbHVlLmNwcAkocmV2aXNpb24gMCkKKysr
IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM1Vwc2lsb25WYWx1ZS5jcHAJKHdvcmtpbmcgY29w
eSkKQEAgLTAsMCArMSw0MSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNSBBcHBsZSBJbmMu
IEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBz
b3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24s
IGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAq
IGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRh
aW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0
aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25z
IGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAg
IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xh
aW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBw
cm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQ
Uk9WSURFRCBCWSBBUFBMRSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElN
UExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICog
SU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQ
QVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwg
QVBQTEUgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwg
SU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVF
TlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJF
TUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwg
T1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQg
QU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwg
U1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9U
SEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNP
RlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdF
LiAKKyAqLworCisjaW5jbHVkZSAiY29uZmlnLmgiCisjaW5jbHVkZSAiQjNVcHNpbG9uVmFsdWUu
aCIKKworbmFtZXNwYWNlIEpTQyB7IG5hbWVzcGFjZSBCMyB7CisKK1Vwc2lsb25WYWx1ZTo6flVw
c2lsb25WYWx1ZSgpCit7Cit9CisKK3ZvaWQgVXBzaWxvblZhbHVlOjpkdW1wTWV0YShQcmludFN0
cmVhbSYgb3V0KSBjb25zdAoreworICAgIG91dC5wcmludCgiXiIsIG1fcGhpLT5pbmRleCgpKTsK
K30KKworfSB9IC8vIG5hbWVzcGFjZSBKU0M6OkIzCisKSW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0
Q29yZS9iMy9CM1Vwc2lsb25WYWx1ZS5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0
Q29yZS9iMy9CM1Vwc2lsb25WYWx1ZS5oCShyZXZpc2lvbiAwKQorKysgU291cmNlL0phdmFTY3Jp
cHRDb3JlL2IzL0IzVXBzaWxvblZhbHVlLmgJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSw2MCBA
QAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNSBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2
ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBm
b3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJv
dmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBS
ZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHly
aWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxv
d2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11
c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0
IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAg
IGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBk
aXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJ
TkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywg
SU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVT
IE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQ
T1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUgorICog
Q09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5U
QUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5D
TFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRF
IEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9S
IEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkK
KyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwg
T1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJ
TiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFE
VklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLiAKKyAqLworCisjaWZuZGVm
IEIzVXBzaWxvblZhbHVlX2gKKyNkZWZpbmUgQjNVcHNpbG9uVmFsdWVfaAorCisjaW5jbHVkZSAi
QjNWYWx1ZS5oIgorCituYW1lc3BhY2UgSlNDIHsgbmFtZXNwYWNlIEIzIHsKKworY2xhc3MgVXBz
aWxvblZhbHVlIDogcHVibGljIFZhbHVlIHsKK3B1YmxpYzoKKyAgICBzdGF0aWMgYm9vbCBhY2Nl
cHRzKE9wY29kZSBvcGNvZGUpIHsgcmV0dXJuIG9wY29kZSA9PSBVcHNpbG9uOyB9CisKKyAgICB+
VXBzaWxvblZhbHVlKCk7CisKKyAgICBWYWx1ZSogcGhpKCkgY29uc3QgeyByZXR1cm4gbV9waGk7
IH0KKworcHJvdGVjdGVkOgorICAgIHZvaWQgZHVtcE1ldGEoUHJpbnRTdHJlYW0mKSBjb25zdCBv
dmVycmlkZTsKKworcHJpdmF0ZToKKyAgICBmcmllbmQgY2xhc3MgUHJvY2VkdXJlOworICAgIAor
ICAgIFVwc2lsb25WYWx1ZSh1bnNpZ25lZCBpbmRleCwgT3JpZ2luIG9yaWdpbiwgVmFsdWUqIHZh
bHVlLCBWYWx1ZSogcGhpKQorICAgICAgICA6IFZhbHVlKGluZGV4LCBQaGksIFZvaWQsIG9yaWdp
biwgdmFsdWUpCisgICAgICAgICwgbV9waGkocGhpKQorICAgIHsKKyAgICAgICAgQVNTRVJUKHZh
bHVlLT50eXBlKCkgPT0gcGhpLT50eXBlKCkpOworICAgIH0KKworICAgIFZhbHVlKiBtX3BoaTsK
K307CisKK30gfSAvLyBuYW1lc3BhY2UgSlNDOjpCMworCisjZW5kaWYgLy8gQjNVcHNpbG9uVmFs
dWVfaAorCkluZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNWYWx1ZS5jcHAKPT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzVmFsdWUuY3BwCShyZXZpc2lvbiAw
KQorKysgU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzVmFsdWUuY3BwCSh3b3JraW5nIGNvcHkp
CkBAIC0wLDAgKzEsMTY5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE1IEFwcGxlIEluYy4g
QWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNv
dXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwg
YXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICog
YXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFp
biB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRp
b25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMg
aW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAg
bm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFp
bWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHBy
b3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBS
T1ZJREVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1Q
TElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJ
TVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBB
UlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBB
UFBMRSBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJ
TkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVO
VElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVN
RU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBP
UgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBB
TkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBT
VFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RI
RVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09G
VFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0Uu
IAorICovCisKKyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJCM1ZhbHVlLmgiCisKK25h
bWVzcGFjZSBKU0MgeyBuYW1lc3BhY2UgQjMgeworCitWYWx1ZTo6flZhbHVlKCkKK3sKK30KKwor
dm9pZCBWYWx1ZTo6cmVwbGFjZVdpdGhJZGVudGl0eShWYWx1ZSogdmFsdWUpCit7CisgICAgLy8g
VGhpcyBpcyBhIGJpdCBjcmF6eS4gSXQgZG9lcyBhbiBpbi1wbGFjZSByZXBsYWNlbWVudCBvZiB3
aGF0ZXZlciBWYWx1ZSBzdWJjbGFzcyB0aGlzIGlzIHdpdGgKKyAgICAvLyBhIHBsYWluIElkZW50
aXR5IFZhbHVlLiBXZSBmaXJzdCBjb2xsZWN0IGFsbCBvZiB0aGUgaW5mb3JtYXRpb24gd2UgbmVl
ZCwgdGhlbiB3ZSBkZXN0cnVjdCB0aGUKKyAgICAvLyBwcmV2aW91cyB2YWx1ZSBpbiBwbGFjZSwg
YW5kIHRoZW4gd2UgY29uc3RydWN0IHRoZSBJZGVudGl0eSBWYWx1ZSBpbiBwbGFjZS4KKworICAg
IHVuc2lnbmVkIGluZGV4ID0gbV9pbmRleDsKKyAgICBUeXBlIHR5cGUgPSBtX3R5cGU7CisgICAg
T3JpZ2luIG9yaWdpbiA9IG1fb3JpZ2luOworICAgIEJhc2ljQmxvY2sqIG93bmVyID0gdGhpcy0+
b3duZXI7CisgICAgVmFsdWUqIHJlcGxhY2VtZW50ID0gdGhpcy0+cmVwbGFjZW1lbnQ7CisgICAg
dm9pZCogbWlzYyA9IHRoaXMtPm1pc2M7CisKKyAgICBSRUxFQVNFX0FTU0VSVCh0eXBlID09IHZh
bHVlLT50eXBlKCkpOworCisgICAgdGhpcy0+VmFsdWU6On5WYWx1ZSgpOworCisgICAgbmV3ICh0
aGlzKSAoaW5kZXgsIElkZW50aWZ5LCB0eXBlLCBvcmlnaW4sIHZhbHVlKTsKKworICAgIHRoaXMt
Pm93bmVyID0gb3duZXI7CisgICAgdGhpcy0+cmVwbGFjZW1lbnQgPSByZXBsYWNlbWVudDsKKyAg
ICB0aGlzLT5taXNjID0gbWlzYzsKK30KKwordm9pZCBWYWx1ZTo6ZHVtcChQcmludFN0cmVhbSYg
b3V0KSBjb25zdAoreworICAgIG91dC5wcmludChkdW1wUHJlZml4LCBtX2luZGV4KTsKK30KKwor
dm9pZCBWYWx1ZTo6ZGVlcER1bXAoUHJpbnRTdHJlYW0mIG91dCkgY29uc3QKK3sKKyAgICBvdXQu
cHJpbnQobV90eXBlLCAiICIsICp0aGlzLCAiID0gIiwgbV9vcGNvZGUpOworCisgICAgb3V0LnBy
aW50KCIoIik7CisgICAgQ29tbWFQcmludGVyIGNvbW1hOworICAgIGZvciAoVmFsdWUqIGNoaWxk
IDogY2hpbGRyZW4oKSkKKyAgICAgICAgb3V0LnByaW50KGNvbW1hLCBwb2ludGVyRHVtcChjaGls
ZCkpOworCisgICAgU3RyaW5nUHJpbnRTdHJlYW0gc3RyaW5nT3V0OworICAgIGR1bXBNZXRhKHN0
cmluZ091dCk7CisgICAgQ1N0cmluZyBzdHJpbmcgPSBzdHJpbmdPdXQudG9DU3RyaW5nKCk7Cisg
ICAgaWYgKHN0cmluZy5sZW5ndGgoKSkKKyAgICAgICAgb3V0LnByaW50KGNvbW1hLCBzdHJpbmcp
OworCisgICAgb3V0LnByaW50KCIpIik7Cit9CisKK2Jvb2wgVmFsdWU6Omhhc0ludDMyKCkgY29u
c3QKK3sKKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK2ludDMyX3QgVmFsdWU6OmFzSW50MzIoKSBj
b25zdAoreworICAgIFJFTEVBU0VfQVNTRVJUX05PVF9SRUFDSEVEKCk7CisgICAgcmV0dXJuIDA7
Cit9CisKK2Jvb2wgVmFsdWU6Omhhc0ludDY0KCkgY29uc3QKK3sKKyAgICByZXR1cm4gZmFsc2U7
Cit9CisKK2ludDY0X3QgVmFsdWU6OmFzSW50NjQoKSBjb25zdAoreworICAgIFJFTEVBU0VfQVNT
RVJUX05PVF9SRUFDSEVEKCk7CisgICAgcmV0dXJuIDA7Cit9CisKK2Jvb2wgVmFsdWU6Omhhc0Rv
dWJsZSgpIGNvbnN0Cit7CisgICAgcmV0dXJuIGZhbHNlOworfQorCitkb3VibGUgVmFsdWU6OmFz
RG91YmxlKCkgY29uc3QKK3sKKyAgICBSRUxFQVNFX0FTU0VSVF9OT1RfUkVBQ0hFRCgpOworICAg
IHJldHVybiAwOworfQorCit2b2lkIFZhbHVlOjpkdW1wTWV0YShQcmludFN0cmVhbSYpIGNvbnN0
Cit7Cit9CisKK1R5cGUgVmFsdWU6OnR5cGVGb3IoT3Bjb2RlIG9wY29kZSwgVmFsdWUqIGZpcnN0
Q2hpbGQpCit7CisgICAgc3dpdGNoIChvcGNvZGUpIHsKKyAgICBjYXNlIElkZW50aXR5OgorICAg
IGNhc2UgQWRkOgorICAgIGNhc2UgU3ViOgorICAgIGNhc2UgTXVsOgorICAgIGNhc2UgRGl2Ogor
ICAgIGNhc2UgQ2hpbGxEaXY6CisgICAgY2FzZSBNb2Q6CisgICAgY2FzZSBCaXRBbmQ6CisgICAg
Y2FzZSBCaXRPcjoKKyAgICBjYXNlIEJpdFhvcjoKKyAgICBjYXNlIFNobDoKKyAgICBjYXNlIFNT
aHI6CisgICAgY2FzZSBaU2hyOgorICAgIGNhc2UgQ2hlY2tBZGQ6CisgICAgY2FzZSBDaGVja1N1
YjoKKyAgICBjYXNlIENoZWNrTXVsOgorICAgICAgICByZXR1cm4gZmlyc3RDaGlsZC0+dHlwZSgp
OworICAgIGNhc2UgRnJhbWVQb2ludGVyOgorICAgICAgICByZXR1cm4gcG9pbnRlcigpOworICAg
IGNhc2UgU0V4dDg6CisgICAgY2FzZSBTRXh0MTY6CisgICAgY2FzZSBEVG9JMzI6CisgICAgY2Fz
ZSBFcXVhbDoKKyAgICBjYXNlIE5vdEVxdWFsOgorICAgIGNhc2UgTGVzc1RoYW46CisgICAgY2Fz
ZSBHcmVhdGVyVGhhbjoKKyAgICBjYXNlIExlc3NFcXVhbDoKKyAgICBjYXNlIEdyZWF0ZXJFcXVh
bDoKKyAgICBjYXNlIEFib3ZlOgorICAgIGNhc2UgQmVsb3c6CisgICAgY2FzZSBBYm92ZUVxdWFs
OgorICAgIGNhc2UgQmVsb3dFcXVhbDoKKyAgICAgICAgcmV0dXJuIEludDMyOworICAgIGNhc2Ug
U0V4dDMyOgorICAgIGNhc2UgWkV4dDMyOgorICAgICAgICByZXR1cm4gSW50NjQ7CisgICAgY2Fz
ZSBGUm91bmQ6CisgICAgY2FzZSBJVG9EOgorICAgICAgICByZXR1cm4gRG91YmxlOworICAgIGNh
c2UgTm9wOgorICAgICAgICByZXR1cm4gVm9pZDsKKyAgICBkZWZhdWx0OgorICAgICAgICBSRUxF
QVNFX0FTU0VSVF9OT1RfUkVBQ0hFRCgpOworICAgIH0KK30KKworfSB9IC8vIG5hbWVzcGFjZSBK
U0M6OkIzCisKSW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM1ZhbHVlLmgKPT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzVmFsdWUuaAkocmV2aXNpb24gMCkK
KysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM1ZhbHVlLmgJKHdvcmtpbmcgY29weSkKQEAg
LTAsMCArMSwxNzMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTUgQXBwbGUgSW5jLiBBbGwg
cmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNl
IGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUg
cGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUg
bWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRo
ZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMg
YW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBi
aW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3Rp
Y2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIg
aW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlk
ZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklE
RUQgQlkgQVBQTEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVE
IFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJ
RUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElD
VUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExF
IElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElS
RUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFM
IERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQg
T0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisg
KiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBP
TiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklD
VCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJ
U0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FS
RSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisg
Ki8KKworI2lmbmRlZiBCM1ZhbHVlX2gKKyNkZWZpbmUgQjNWYWx1ZV9oCisKKyNpbmNsdWRlICJC
M09yaWdpbi5oIgorI2luY2x1ZGUgIkIzVHlwZS5oIgorI2luY2x1ZGUgPHd0Zi9GYXN0TWFsbG9j
Lmg+CisjaW5jbHVkZSA8d3RmL05vbmNvcHlhYmxlLmg+CisKK25hbWVzcGFjZSBKU0MgeyBuYW1l
c3BhY2UgQjMgeworCitjbGFzcyBWYWx1ZSB7CisgICAgV1RGX01BS0VfTk9OQ09QWUFCTEUoVmFs
dWUpOworICAgIFdURl9NQUtFX0ZBU1RfQUxMT0NBVEVEOworcHVibGljOgorICAgIHR5cGVkZWYg
VmVjdG9yPFZhbHVlKiwgMz4gQWRqYWNlbmN5TGlzdDsKKworICAgIHN0YXRpYyBjb25zdCBjaGFy
KiBkdW1wUHJlZml4ID0gIkAiOworCisgICAgc3RhdGljIGJvb2wgYWNjZXB0cyhPcGNvZGUpIHsg
cmV0dXJuIHRydWU7IH0KKworICAgIHZpcnR1YWwgflZhbHVlKCk7CisKKyAgICB1bnNpZ25lZCBp
bmRleCgpIGNvbnN0IHsgcmV0dXJuIG1faW5kZXg7IH0KKyAgICAKKyAgICAvLyBOb3RlIHRoYXQg
dGhlIG9wY29kZSBpcyBpbW11dGFibGUsIGV4Y2VwdCBmb3IgcmVwbGFjaW5nIHZhbHVlcyB3aXRo
IGlkZW50aXR5LgorICAgIE9wY29kZSBvcGNvZGUoKSBjb25zdCB7IHJldHVybiBtX29wY29kZTsg
fQorCisgICAgT3JpZ2luIG9yaWdpbigpIGNvbnN0IHsgcmV0dXJuIG1fb3JpZ2luOyB9CisgICAg
CisgICAgVmFsdWUqJiBjaGlsZCh1bnNpZ25lZCBpbmRleCkgeyByZXR1cm4gbV9jaGlsZHJlbltp
bmRleF07IH0KKyAgICBWYWx1ZSogY2hpbGQodW5zaWduZWQgaW5kZXgpIGNvbnN0IHsgcmV0dXJu
IG1fY2hpbGRyZW5baW5kZXhdOyB9CisKKyAgICAvLyBUaGlzIGNvbXB1dGVzIHRoZSB0eXBlIHVz
aW5nIHRoZSBvcGNvZGUuCisgICAgVHlwZSB0eXBlKCkgY29uc3QgeyByZXR1cm4gbV90eXBlOyB9
CisKKyAgICBBZGphY2VuY3lMaXN0JiBjaGlsZHJlbigpIHsgcmV0dXJuIG1fY2hpbGRyZW47IH0g
CisgICAgY29uc3QgQWRqYWNlbmN5TGlzdCYgY2hpbGRyZW4oKSBjb25zdCB7IHJldHVybiBtX2No
aWxkcmVuOyB9CisKKyAgICB2b2lkIHJlcGxhY2VXaXRoSWRlbnRpdHkoVmFsdWUqKTsKKyAgICB2
b2lkIHJlcGxhY2VXaXRoTm9wKCk7CisKKyAgICB2b2lkIGR1bXAoUHJpbnRTdHJlYW0mKSBjb25z
dDsKKyAgICB2b2lkIGRlZXBEdW1wKFByaW50U3RyZWFtJikgY29uc3Q7CisKKyAgICAvLyBUaGlz
IGlzIGhvdyB5b3UgY2FzdCBWYWx1ZXMuIEZvciBleGFtcGxlLCBpZiB5b3Ugd2FudCB0byBkbyBz
b21ldGhpbmcgcHJvdmlkZWQgdGhhdCB3ZSBoYXZlIGEKKyAgICAvLyBBcmd1bWVudFJlZ1ZhbHVl
LCB5b3UgY2FuIGRvOgorICAgIC8vCisgICAgLy8gaWYgKEFyZ3VtZW50UmVnVmFsdWUqIGFyZ3Vt
ZW50UmVnID0gdmFsdWUtPmFzPEFyZ3VtZW50UmVnVmFsdWU+KCkpIHsKKyAgICAvLyAgICAgdGhp
bmdzCisgICAgLy8gfQorICAgIC8vCisgICAgLy8gVGhpcyB3aWxsIHJldHVybiBudWxsIGlmIHRo
aXMgb3Bjb2RlKCkgIT0gQXJndW1lbnRSZWcuIFRoaXMgd29ya3MgYmVjYXVzZSB0aGlzIHJldHVy
bnMgbnVsbHB0cgorICAgIC8vIGlmIFQ6OmFjY2VwdHMob3Bjb2RlKCkpIHJldHVybnMgZmFsc2Uu
CisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4KKyAgICBUKiBhcygpOworICAgIHRlbXBsYXRlPHR5
cGVuYW1lIFQ+CisgICAgY29uc3QgVCogYXMoKSBjb25zdDsKKyAgICAKKyAgICBib29sIGhhc0lu
dDMyKCkgY29uc3Q7CisgICAgaW50MzJfdCBhc0ludDMyKCkgY29uc3Q7CisgICAgCisgICAgYm9v
bCBoYXNJbnQ2NCgpIGNvbnN0OworICAgIGludDY0X3QgYXNJbnQ2NCgpIGNvbnN0OworCisgICAg
Ym9vbCBoYXNEb3VibGUoKSBjb25zdDsKKyAgICBkb3VibGUgYXNEb3VibGUoKSBjb25zdDsKKwor
cHJvdGVjdGVkOgorICAgIHZpcnR1YWwgdm9pZCBkdW1wTWV0YShQcmludFN0cmVhbSYpIGNvbnN0
OworICAgIAorcHJpdmF0ZToKKyAgICBmcmllbmQgY2xhc3MgUHJvY2VkdXJlOworICAgIAorICAg
IC8vIEluc3RhbnRpYXRlIHZhbHVlcyB2aWEgUHJvY2VkdXJlLgorICAgIC8vIFRoaXMgZm9ybSBy
ZXF1aXJlcyBzcGVjaWZ5aW5nIHRoZSB0eXBlIGV4cGxpY2l0bHk6CisgICAgdGVtcGxhdGU8dHlw
ZW5hbWUuLi4gQXJndW1lbnRzPgorICAgIGV4cGxpY2l0IFZhbHVlKHVuc2lnbmVkIGluZGV4LCBP
cGNvZGUgb3Bjb2RlLCBUeXBlIHR5cGUsIE9yaWdpbiBvcmlnaW4sIEFyZ3VtZW50cy4uLiBhcmd1
bWVudHMpCisgICAgICAgIDogbV9pbmRleChpbmRleCkKKyAgICAgICAgLCBtX29wY29kZShvcGNv
ZGUpCisgICAgICAgICwgbV90eXBlKHR5cGUpCisgICAgICAgICwgbV9vcmlnaW4ob3JpZ2luKQor
ICAgICAgICAsIG1fY2hpbGRyZW57IGFyZ3VtZW50cy4uLiB9CisgICAgeworICAgIH0KKyAgICAv
LyBUaGlzIGZvcm0gaXMgZm9yIHRob3NlIG9wY29kZXMgdGhhdCBjYW4gaW5mZXIgdGhlaXIgdHlw
ZSBmcm9tIHRoZSBvcGNvZGUgYW5kIGZpcnN0IGNoaWxkOgorICAgIHRlbXBsYXRlPHR5cGVuYW1l
Li4uIEFyZ3VtZW50cz4KKyAgICBleHBsaWNpdCBWYWx1ZSh1bnNpZ25lZCBpbmRleCwgT3Bjb2Rl
IG9wY29kZSwgT3JpZ2luIG9yaWdpbiwgVmFsdWUqIGZpcnN0Q2hpbGQsIEFyZ3VtZW50cy4uLiBh
cmd1bWVudHMpCisgICAgICAgIDogbV9pbmRleChpbmRleCkKKyAgICAgICAgLCBtX29wY29kZShv
cGNvZGUpCisgICAgICAgICwgbV90eXBlKHR5cGVGb3Iob3Bjb2RlLCBmaXJzdENoaWxkKSkKKyAg
ICAgICAgLCBtX29yaWdpbihvcmlnaW4pCisgICAgICAgICwgbV9jaGlsZHJlbnsgZmlyc3RDaGls
ZCwgYXJndW1lbnRzLi4uIH0KKyAgICB7CisgICAgfQorICAgIC8vIFRoaXMgZm9ybSBpcyBmb3Ig
dGhvc2Ugb3Bjb2RlcyB0aGF0IGNhbiBpbmZlciB0aGVpciB0eXBlIGZyb20gdGhlIG9wY29kZSBh
bG9uZSwgYW5kIHRoYXQgZG9uJ3QKKyAgICAvLyB0YWtlIGFueSBhcmd1bWVudHM6CisgICAgZXhw
bGljaXQgVmFsdWUodW5zaWduZWQgaW5kZXgsIE9wY29kZSBvcGNvZGUsIE9yaWdpbiBvcmlnaW4p
CisgICAgICAgIDogbV9pbmRleChpbmRleCkKKyAgICAgICAgLCBtX29wY29kZShvcGNvZGUpCisg
ICAgICAgICwgbV90eXBlKHR5cGVGb3Iob3Bjb2RlLCBudWxscHRyKSkKKyAgICAgICAgLCBtX29y
aWdpbihvcmlnaW4pCisgICAgeworICAgIH0KKworICAgIHN0YXRpYyBUeXBlIHR5cGVGb3IoT3Bj
b2RlLCBWYWx1ZSogZmlyc3RDaGlsZCk7CisKKyAgICAvLyBUaGlzIGdyb3VwIG9mIGZpZWxkcyBp
cyBhcnJhbmdlZCB0byBmaXQgaW4gNjQgYml0cy4KKyAgICB1bnNpZ25lZCBtX2luZGV4OworICAg
IE9wY29kZSBtX29wY29kZTsKKyAgICBUeXBlIG1fdHlwZTsKKyAgICAKKyAgICBPcmlnaW4gbV9v
cmlnaW47CisgICAgQWRqYWNlbmN5TGlzdCBtX2NoaWxkcmVuOworCitwdWJsaWM6CisgICAgQmFz
aWNCbG9jayogb3duZXIgeyBudWxscHRyIH07IC8vIGNvbXB1dGVkIGxhemlseS4KKyAgICBWYWx1
ZSogcmVwbGFjZW1lbnQgeyBudWxscHRyIH07IC8vIHVzZWQgZm9yIGFuYWx5c2VzIGFuZCB0cmFu
c2Zvcm1hdGlvbnMuCisgICAgdm9pZCogbWlzYyB7IG51bGxwdHIgfTsKK307CisKK2NsYXNzIERl
ZXBWYWx1ZUR1bXAgeworcHVibGljOgorICAgIERlZXBWYWx1ZUR1bXAoVmFsdWUqIHZhbHVlKQor
ICAgICAgICA6IG1fdmFsdWUodmFsdWUpCisgICAgeworICAgIH0KKworICAgIHZvaWQgZHVtcChQ
cmludFN0cmVhbSYgb3V0KSBjb25zdAorICAgIHsKKyAgICAgICAgaWYgKG1fdmFsdWUpCisgICAg
ICAgICAgICBtX3ZhbHVlLT5kZWVwRHVtcChvdXQpOworICAgICAgICBlbHNlCisgICAgICAgICAg
ICBvdXQucHJpbnQoIjxudWxsPiIpOworICAgIH0KKworcHJpdmF0ZToKKyAgICBWYWx1ZSogbV92
YWx1ZTsKK307CisKK0RlZXBWYWx1ZUR1bXAgZGVlcER1bXAoVmFsdWUqIHZhbHVlKQoreworICAg
IHJldHVybiBEZWVwVmFsdWVEdW1wKHZhbHVlKTsKK30KKworfSB9IC8vIG5hbWVzcGFjZSBKU0M6
OkIzCisKKyNlbmRpZiAvLyBCM1ZhbHVlX2gKKwpJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3Jl
L2IzL0IzVmFsdWVJbmxpbmVzLmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRDb3Jl
L2IzL0IzVmFsdWVJbmxpbmVzLmgJKHJldmlzaW9uIDApCisrKyBTb3VyY2UvSmF2YVNjcmlwdENv
cmUvYjMvQjNWYWx1ZUlubGluZXMuaAkod29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDgzIEBACisv
KgorICogQ29weXJpZ2h0IChDKSAyMDE1IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4K
KyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1z
LCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRl
ZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlz
dHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0
CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5n
IGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCBy
ZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2Yg
Y29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9j
dW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3Ry
aWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4g
YGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNM
VURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0Yg
TUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0Ug
QVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SCisgKiBDT05U
UklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwg
U1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJ
TkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09P
RFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVT
SU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICog
T0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBU
T1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFO
WSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNF
RCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisKKyNpZm5kZWYgQjNW
YWx1ZUlubGluZXNfaAorI2RlZmluZSBCM1ZhbHVlSW5saW5lc19oCisKKyNpbmNsdWRlICJCM0Nv
bnN0MzJWYWx1ZS5oIgorI2luY2x1ZGUgIkIzQ29uc3Q2NFZhbHVlLmgiCisjaW5jbHVkZSAiQjND
b25zdERvdWJsZVZhbHVlLmgiCisjaW5jbHVkZSAiQjNWYWx1ZS5oIgorCituYW1lc3BhY2UgSlND
IHsgbmFtZXNwYWNlIEIzIHsKKwordGVtcGxhdGU8dHlwZW5hbWUgVD4KK1QqIFZhbHVlOjphcygp
Cit7CisgICAgaWYgKFQ6OmFjY2VwdHMob3Bjb2RlKCkpKQorICAgICAgICByZXR1cm4gc3RhdGlj
X2Nhc3Q8VCo+KHRoaXMpOworICAgIHJldHVybiBudWxscHRyOworfQorCit0ZW1wbGF0ZT50eXBl
bmFtZSBUPgorY29uc3QgVCogVmFsdWU6OmFzKCkgY29uc3QKK3sKKyAgICByZXR1cm4gY29uc3Rf
Y2FzdDxWYWx1ZSo+KHRoaXMpLT5hczxUPigpOworfQorCitib29sIFZhbHVlOjpoYXNJbnQzMigp
IGNvbnN0Cit7CisgICAgcmV0dXJuICEhYXM8Q29uc3QzMlZhbHVlPigpOworfQorCitpbnQzMl90
IFZhbHVlOjphc0ludDMyKCkgY29uc3QKK3sKKyAgICByZXR1cm4gYXM8Q29uc3QzMlZhbHVlPigp
LT52YWx1ZSgpOworfQorCitib29sIFZhbHVlOjpoYXNJbnQ2NCgpIGNvbnN0Cit7CisgICAgcmV0
dXJuICEhYXM8Q29uc3Q2NFZhbHVlPigpOworfQorCitpbnQ2NF90IFZhbHVlOjphc0ludDY0KCkg
Y29uc3QKK3sKKyAgICByZXR1cm4gYXM8Q29uc3Q2NFZhbHVlPigpLT52YWx1ZSgpOworfQorCiti
b29sIFZhbHVlOjpoYXNEb3VibGUoKSBjb25zdAoreworICAgIHJldHVybiAhIWFzPENvbnN0RG91
YmxlVmFsdWU+KCk7Cit9CisKK2RvdWJsZSBWYWx1ZTo6YXNEb3VibGUoKSBjb25zdAoreworICAg
IHJldHVybiBhczxDb25zdERvdWJsZVZhbHVlPigpLT52YWx1ZSgpOworfQorCit9IH0gLy8gbmFt
ZXNwYWNlIEpTQzo6QjMKKworI2VuZGlmIC8vIEIzVmFsdWVJbmxpbmVzX2gKKwpJbmRleDogU291
cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzVmFsdWVSZXAuY3BwCj09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJj
ZS9KYXZhU2NyaXB0Q29yZS9iMy9CM1ZhbHVlUmVwLmNwcAkocmV2aXNpb24gMCkKKysrIFNvdXJj
ZS9KYXZhU2NyaXB0Q29yZS9iMy9CM1ZhbHVlUmVwLmNwcAkod29ya2luZyBjb3B5KQpAQCAtMCww
ICsxLDg2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE1IEFwcGxlIEluYy4gQWxsIHJpZ2h0
cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQg
YmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1p
dHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoK
KyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJv
dmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0
aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5
IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0
aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRo
ZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdp
dGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZ
IEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJS
QU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdB
UlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIK
KyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMu
IE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwg
SU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1B
R0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNV
QlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJP
RklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5Z
IFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElB
QklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBB
UklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVW
RU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisK
KyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJCM1ZhbHVlUmVwLmgiCisKK25hbWVzcGFj
ZSBKU0MgeyBuYW1lc3BhY2UgQjMgeworCit2b2lkIFZhbHVlUmVwOjpkdW1wKFByaW50U3RyZWFt
JiBvdXQpIGNvbnN0Cit7CisgICAgb3V0LnByaW50KG1fa2luZCk7CisgICAgc3dpdGNoIChtX2tp
bmQpIHsKKyAgICBjYXNlIE5vbmU6CisgICAgY2FzZSBTb21lUmVnaXN0ZXI6CisgICAgICAgIHJl
dHVybjsKKyAgICBjYXNlIFJlZ2lzdGVyOgorICAgICAgICBvdXQucHJpbnQoIigiLCByZWcoKSwg
IikiKTsKKyAgICAgICAgcmV0dXJuOworICAgIGNhc2UgU3RhY2s6CisgICAgICAgIG91dC5wcmlu
dCgiKCIsIG9mZnNldEZyb21GUCgpLCAiKSIpOworICAgICAgICByZXR1cm47CisgICAgY2FzZSBT
dGFja0FyZ3VtZW50OgorICAgICAgICBvdXQucHJpbnQoIigiLCBvZmZzZXRGcm9tU1AoKSwgIiki
KTsKKyAgICAgICAgcmV0dXJuOworICAgIGNhc2UgQ29uc3RhbnQ6CisgICAgICAgIG91dC5wcmlu
dCgiKCIsIHZhbHVlKCksICIpIik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgUkVMRUFT
RV9BU1NFUlRfTk9UX1JFQUNIRUQoKTsKK30KKworfSB9IC8vIG5hbWVzcGFjZSBKU0M6OkIzCisK
K25hbWVzcGFjZSBXVEYgeworCit1c2luZyBuYW1lc3BhY2UgSlNDOjpCMzsKKwordm9pZCBwcmlu
dEludGVybmFsKFByaW50U3RyZWFtJiBvdXQsIFZhbHVlUmVwOjpLaW5kIGtpbmQpCit7CisgICAg
c3dpdGNoIChraW5kKSB7CisgICAgY2FzZSBWYWx1ZVJlcDo6QW55OgorICAgICAgICBvdXQucHJp
bnQoIkFueSIpOworICAgICAgICByZXR1cm47CisgICAgY2FzZSBWYWx1ZVJlcDo6U29tZVJlZ2lz
dGVyOgorICAgICAgICBvdXQucHJpbnQoIlNvbWVSZWdpc3RlciIpOworICAgICAgICByZXR1cm47
CisgICAgY2FzZSBWYWx1ZVJlcDo6UmVnaXN0ZXI6CisgICAgICAgIG91dC5wcmludCgiUmVnaXN0
ZXIiKTsKKyAgICAgICAgcmV0dXJuOworICAgIGNhc2UgVmFsdWVSZXA6OlN0YWNrOgorICAgICAg
ICBvdXQucHJpbnQoIlN0YWNrIik7CisgICAgICAgIHJldHVybjsKKyAgICBjYXNlIFZhbHVlUmVw
OjpTdGFja0FyZ3VtZW50OgorICAgICAgICBvdXQucHJpbnQoIlN0YWNrQXJndW1lbnQiKTsKKyAg
ICAgICAgcmV0dXJuOworICAgIGNhc2UgVmFsdWVSZXA6OkNvbnN0YW50OgorICAgICAgICBvdXQu
cHJpbnQoIkNvbnN0YW50Iik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgUkVMRUFTRV9B
U1NFUlRfTk9UX1JFQUNIRUQoKTsKK30KKworfSAvLyBuYW1lc3BhY2UgV1RGCisKSW5kZXg6IFNv
dXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM1ZhbHVlUmVwLmgKPT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNl
L0phdmFTY3JpcHRDb3JlL2IzL0IzVmFsdWVSZXAuaAkocmV2aXNpb24gMCkKKysrIFNvdXJjZS9K
YXZhU2NyaXB0Q29yZS9iMy9CM1ZhbHVlUmVwLmgJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSwx
NTYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTUgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJl
c2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5h
cnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVk
IHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICog
MS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBj
b3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBm
b2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9y
bSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMg
bGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisg
KiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0
aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQ
TEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJ
RVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFO
VElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICog
UFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IK
KyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJ
REVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMg
KElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJ
VFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRT
OyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhF
T1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJ
VFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJ
TkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJ
RiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKworI2lm
bmRlZiBCM1ZhbHVlUmVwX2gKKyNkZWZpbmUgQjNWYWx1ZVJlcF9oCisKKyNpbmNsdWRlICJSZWcu
aCIKKyNpbmNsdWRlIDx3dGYvUHJpbnRTdHJlYW0uaD4KKworbmFtZXNwYWNlIEpTQyB7IG5hbWVz
cGFjZSBCMyB7CisKKy8vIFdlIHVzZSB0aGlzIGNsYXNzIHRvIGRlc2NyaWJlIHZhbHVlIHJlcHJl
c2VudGF0aW9ucyBhdCBzdGFja21hcHMuIEl0J3MgdXNlZCBib3RoIHRvIGZvcmNlIGEKKy8vIHJl
cHJlc2VudGF0aW9uIGFuZCB0byBnZXQgdGhlIHJlcHJlc2VudGF0aW9uLiBXaGVuIHRoZSBCMyBj
bGllbnQgZm9yY2VzIGEgcmVwcmVzZW50YXRpb24sIHdlIHNheQorLy8gdGhhdCBpdCdzIGFuIGlu
cHV0LiBXaGVuIEIzIHRlbGxzIHRoZSBjbGllbnQgd2hhdCByZXByZXNlbnRhdGlvbiBpdCBwaWNr
ZWQsIHdlIHNheSB0aGF0IGl0J3MgYW4KKy8vIG91dHB1dC4KKworY2xhc3MgVmFsdWVSZXAgewor
cHVibGljOgorICAgIGVudW0gS2luZCB7CisgICAgICAgIC8vIEFzIGFuIGlucHV0IHJlcHJlc2Vu
dGF0aW9uLCB0aGlzIG1lYW5zIHRoYXQgQjMgY2FuIHBpY2sgYW55IHJlcHJlc2VudGF0aW9uLgor
ICAgICAgICBBbnksCisKKyAgICAgICAgLy8gQXMgYW4gaW5wdXQgcmVwcmVzZW50YXRpb24sIHRo
aXMgbWVhbnMgdGhhdCBCMyBzaG91bGQgcGljayBzb21lIHJlZ2lzdGVyLCBwcm92aWRlZCB0aGF0
CisgICAgICAgIC8vIGl0J3Mgbm90IGFsc28gYSByZWdpc3RlciB0aGF0IHdhcyBjbG9iYmVyZWQu
CisgICAgICAgIFNvbWVSZWdpc3RlciwKKworICAgICAgICAvLyBBcyBhbiBpbnB1dCByZXByZXNl
bnRhdGlvbiwgdGhpcyBmb3JjZXMgYSBwYXJ0aWN1bGFyIHJlZ2lzdGVyLiBBcyBhbiBvdXRwdXQK
KyAgICAgICAgLy8gcmVwcmVzZW50YXRpb24sIHRoaXMgdGVsbHMgdXMgd2hhdCByZWdpc3RlciBC
MyBwaWNrZWQuCisgICAgICAgIFJlZ2lzdGVyLAorCisgICAgICAgIC8vIEFzIGFuIG91dHB1dCBy
ZXByZXNlbnRhdGlvbiwgdGhpcyB0ZWxscyB1cyB3aGF0IHN0YWNrIHNsb3QgQjMgcGlja2VkLiBJ
dCdzIG5vdCBhIHZhbGlkCisgICAgICAgIC8vIGlucHV0IHJlcHJlc2VudGF0aW9uLgorICAgICAg
ICBTdGFjaywKKworICAgICAgICAvLyBBcyBhbiBpbnB1dCByZXByZXNlbnRhdGlvbiwgdGhpcyBm
b3JjZXMgdGhlIHZhbHVlIHRvIGVuZCB1cCBpbiB0aGUgYXJndW1lbnQgYXJlYSBhdCBzb21lCisg
ICAgICAgIC8vIG9mZnNldC4KKyAgICAgICAgU3RhY2tBcmd1bWVudCwKKworICAgICAgICAvLyBB
cyBhbiBvdXRwdXQgcmVwcmVzZW50YXRpb24sIHRoaXMgdGVsbHMgdXMgdGhhdCBCMyBjb25zdGFu
dC1mb2xkZWQgdGhlIHZhbHVlLgorICAgICAgICBDb25zdGFudAorICAgIH07CisgICAgCisgICAg
VmFsdWVSZXAoKQorICAgICAgICA6IG1fa2luZChBbnkpCisgICAgeworICAgIH0KKworICAgIGV4
cGxpY2l0IFZhbHVlUmVwKFJlZyByZWcpCisgICAgICAgIDogbV9raW5kKFJlZ2lzdGVyKQorICAg
ICAgICAsIG1fdmFsdWUocmVnLmluZGV4KCkpCisgICAgeworICAgIH0KKworICAgIHN0YXRpYyBW
YWx1ZVJlcCByZWcoUmVnIHJlZykKKyAgICB7CisgICAgICAgIHJldHVybiBWYWx1ZVJlcChyZWcp
OworICAgIH0KKworICAgIHN0YXRpYyBWYWx1ZVJlcCBzdGFjayhpbnRwdHJfdCBvZmZzZXRGcm9t
RlApCisgICAgeworICAgICAgICBWYWx1ZVJlcCByZXN1bHQ7CisgICAgICAgIHJlc3VsdC5tX2tp
bmQgPSBTdGFjazsKKyAgICAgICAgcmVzdWx0Lm1fdmFsdWUgPSBvZmZzZXRGcm9tRlA7CisgICAg
fQorCisgICAgc3RhdGljIFZhbHVlUmVwIHN0YWNrQXJndW1lbnQoaW50cHRyX3Qgb2Zmc2V0RnJv
bVNQKQorICAgIHsKKyAgICAgICAgVmFsdWVSZXAgcmVzdWx0OworICAgICAgICByZXN1bHQubV9r
aW5kID0gU3RhY2tBcmd1bWVudDsKKyAgICAgICAgcmVzdWx0Lm1fdmFsdWUgPSBvZmZzZXRGcm9t
U1A7CisgICAgfQorCisgICAgc3RhdGljIFZhbHVlUmVwIGNvbnN0YW50KGludDY0X3QgdmFsdWUp
CisgICAgeworICAgICAgICBWYWx1ZVJlcCByZXN1bHQ7CisgICAgICAgIHJlc3VsdC5tX2tpbmQg
PSBDb25zdGFudDsKKyAgICAgICAgcmVzdWx0Lm1fdmFsdWUgPSB2YWx1ZTsKKyAgICB9CisKKyAg
ICBzdGF0aWMgVmFsdWVSZXAgY29uc3RhbnQoZG91YmxlIHZhbHVlKQorICAgIHsKKyAgICAgICAg
cmV0dXJuIFZhbHVlUmVwKGJpdHdpc2VfY2FzdDxpbnQ2NF90Pih2YWx1ZSkpOworICAgIH0KKwor
ICAgIEtpbmQga2luZCgpIGNvbnN0IHsgcmV0dXJuIG1fa2luZDsgfQorCisgICAgZXhwbGljaXQg
b3BlcmF0b3IgYm9vbCgpIGNvbnN0IHsgcmV0dXJuIGtpbmQoKSAhPSBBbnk7IH0KKworICAgIFJl
ZyByZWcoKSBjb25zdAorICAgIHsKKyAgICAgICAgQVNTRVJUKGtpbmQoKSA9PSBSZWdpc3Rlcik7
CisgICAgICAgIHJldHVybiBSZWc6OmZyb21JbmRleChtX3ZhbHVlKTsKKyAgICB9CisKKyAgICBp
bnRwdHJfdCBvZmZzZXRGcm9tRlAoKSBjb25zdAorICAgIHsKKyAgICAgICAgQVNTRVJUKGtpbmQo
KSA9PSBTdGFjayk7CisgICAgICAgIHJldHVybiBzdGF0aWNfY2FzdDxpbnRwdHJfdD4obV92YWx1
ZSk7CisgICAgfQorCisgICAgaW50cHRyX3Qgb2Zmc2V0RnJvbVNQKCkgY29uc3QKKyAgICB7Cisg
ICAgICAgIEFTU0VSVChraW5kKCkgPT0gU3RhY2tBcmd1bWVudCk7CisgICAgICAgIHJldHVybiBz
dGF0aWNfY2FzdDxpbnRwdHJfdD4obV92YWx1ZSk7CisgICAgfQorCisgICAgaW50NjRfdCB2YWx1
ZSgpIGNvbnN0CisgICAgeworICAgICAgICBBU1NFUlQoa2luZCgpID09IENvbnN0YW50KTsKKyAg
ICAgICAgcmV0dXJuIG1fdmFsdWU7CisgICAgfQorCisgICAgZG91YmxlIGRvdWJsZVZhbHVlKCkg
Y29uc3QKKyAgICB7CisgICAgICAgIHJldHVybiBiaXR3aXNlX2Nhc3Q8ZG91YmxlPih2YWx1ZSgp
KTsKKyAgICB9CisKKyAgICB2b2lkIGR1bXAoUHJpbnRTdHJlYW0mKSBjb25zdDsKKworcHJpdmF0
ZToKKyAgICBLaW5kIG1fa2luZDsKKyAgICBpbnQ2NF90IG1fdmFsdWU7Cit9OworCit9IH0gLy8g
bmFtZXNwYWNlIEpTQzo6QjMKKworbmFtZXNwYWNlIFdURiB7CisKK3ZvaWQgcHJpbnRJbnRlcm5h
bChQcmludFN0cmVhbSYsIEpTQzo6QjM6OlZhbHVlUmVwOjpLaW5kKTsKKworfSAvLyBuYW1lc3Bh
Y2UgV1RGCisKKyNlbmRpZiAvLyBCM1ZhbHVlUmVwX2gKKwo=
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>263432</attachid>
            <date>2015-10-18 16:36:36 -0700</date>
            <delta_ts>2015-10-18 18:25:21 -0700</delta_ts>
            <desc>started playing with instruction selection</desc>
            <filename>blah.patch</filename>
            <type>text/plain</type>
            <size>156558</size>
            <attacher name="Filip Pizlo">fpizlo</attacher>
            
              <data encoding="base64">SW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9hc3NlbWJsZXIvRHluYW1pY0FkZHJlc3MuY3Bw
Cj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9hc3NlbWJsZXIvRHluYW1pY0Fk
ZHJlc3MuY3BwCShyZXZpc2lvbiAwKQorKysgU291cmNlL0phdmFTY3JpcHRDb3JlL2Fzc2VtYmxl
ci9EeW5hbWljQWRkcmVzcy5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSw1NiBAQAorLyoK
KyAqIENvcHlyaWdodCAoQykgMjAxNSBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisg
KgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywg
d2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQg
dGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3Ry
aWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAor
ICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBk
aXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVw
cm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNv
bmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3Vt
ZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmli
dXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIGBg
QVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVE
SU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1F
UkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFS
RSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUgorICogQ09OVFJJ
QlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQ
RUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5H
LCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RT
IE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lO
RVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9G
IExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9S
VAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkg
V0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQg
T0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLiAKKyAqLworCisjaW5jbHVkZSAiY29u
ZmlnLmgiCisjaW5jbHVkZSAiRHluYW1pY0FkZHJlc3MuaCIKKworI2luY2x1ZGUgIkdQUkluZm8u
aCIKKworbmFtZXNwYWNlIEpTQyB7CisKK3ZvaWQgRHluYW1pY0FkZHJlc3M6OmR1bXAoUHJpbnRT
dHJlYW0mIG91dCkgY29uc3QKK3sKKyNpZiBFTkFCTEUoQVNTRU1CTEVSKQorICAgIHN3aXRjaCAo
bV9raW5kKSB7CisgICAgY2FzZSBBZGRyZXNzOgorICAgIGNhc2UgRXh0ZW5kZWRBZGRyZXNzOgor
ICAgICAgICBvdXQucHJpbnQobV9vZmZzZXQsICIoIiwgbV9iYXNlLCAiKSIpOworICAgICAgICBy
ZXR1cm47CisgICAgY2FzZSBCYXNlSW5kZXg6CisgICAgICAgIG91dC5wcmludChtX29mZnNldCwg
IigiLCBtX2Jhc2UsICIsICIsIG1faW5kZXgsICIsICIsIDEgPDwgbV9zY2FsZSwgIikiKTsKKyAg
ICAgICAgcmV0dXJuOworICAgIGNhc2UgQWJzb2x1dGVBZGRyZXNzOgorICAgICAgICBvdXQucHJp
bnQobV9vZmZzZXQpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgUkVMRUFTRV9BU1NF
UlRfTk9UX1JFQUNIRUQoKTsKKyNlbHNlIC8vIEVOQUJMRShBU1NFTUJMRVIpCisgICAgb3V0LnBy
aW50KCIwIik7CisjZW5kaWYgLy8gRU5BQkxFKEFTU0VNQkxFUikKK30KKworfSAvLyBuYW1lc3Bh
Y2UgSlNDCisKSW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9hc3NlbWJsZXIvRHluYW1pY0Fk
ZHJlc3MuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYXNzZW1ibGVyL0R5
bmFtaWNBZGRyZXNzLmgJKHJldmlzaW9uIDApCisrKyBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYXNz
ZW1ibGVyL0R5bmFtaWNBZGRyZXNzLmgJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSwxNzggQEAK
Ky8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTUgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVk
LgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9y
bXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3Zp
ZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVk
aXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmln
aHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dp
bmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0
IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBv
ZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBk
b2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlz
dHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5D
LiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElO
Q0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBP
RiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9T
RSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IKKyAqIENP
TlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFM
LCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xV
RElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBH
T09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBC
VVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisg
KiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9S
IFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4g
QU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJ
U0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKworI2lmbmRlZiBE
eW5hbWljQWRkcmVzc19oCisjZGVmaW5lIER5bmFtaWNBZGRyZXNzX2gKKworI2luY2x1ZGUgIkFi
c3RyYWN0TWFjcm9Bc3NlbWJsZXIuaCIKKyNpbmNsdWRlIDx3dGYvUHJpbnRTdHJlYW0uaD4KKwor
bmFtZXNwYWNlIEpTQyB7CisKK2NsYXNzIER5bmFtaWNBZGRyZXNzIHsKK3B1YmxpYzoKKyAgICBl
bnVtIEtpbmQgeworICAgICAgICBBZGRyZXNzLAorICAgICAgICBFeHRlbmRlZEFkZHJlc3MsCisg
ICAgICAgIEJhc2VJbmRleCwKKyAgICAgICAgQWJzb2x1dGVBZGRyZXNzCisgICAgfTsKKworI2lm
IEVOQUJMRShBU1NFTUJMRVIpCisKKyAgICBEeW5hbWljQWRkcmVzcygpCisgICAgICAgIDogbV9r
aW5kKEFic29sdXRlQWRkcmVzcykKKyAgICAgICAgLCBtX29mZnNldCgwKQorICAgICAgICAsIG1f
YmFzZShBYnN0cmFjdE1hY3JvQXNzZW1ibGVyOjpmaXJzdFJlZ2lzdGVyKCkpCisgICAgICAgICwg
bV9pbmRleChBYnN0cmFjdE1hY3JvQXNzZW1ibGVyOjpmaXJzdFJlZ2lzdGVyKCkpCisgICAgICAg
ICwgbV9zY2FsZShBYnN0cmFjdE1hY3JvQXNzZW1ibGVyOjpUaW1lc09uZSkKKyAgICB7CisgICAg
fQorCisgICAgZXhwbGljaXQgRHluYW1pY0FkZHJlc3MoQWJzdHJhY3RNYWNyb0Fzc2VtYmxlcjo6
QWRkcmVzcyBhZGRyZXNzKQorICAgICAgICA6IG1fa2luZChBZGRyZXNzKQorICAgICAgICAsIG1f
b2Zmc2V0KGFkZHJlc3Mub2Zmc2V0KQorICAgICAgICAsIG1fYmFzZShhZGRyZXNzLmJhc2UpCisg
ICAgICAgICwgbV9pbmRleChBYnN0cmFjdE1hY3JvQXNzZW1ibGVyOjpmaXJzdFJlZ2lzdGVyKCkp
CisgICAgICAgICwgbV9zY2FsZShBYnN0cmFjdE1hY3JvQXNzZW1ibGVyOjpUaW1lc09uZSkKKyAg
ICB7CisgICAgfQorCisgICAgZXhwbGljaXQgRHluYW1pY0FkZHJlc3MoQWJzdHJhY3RNYWNyb0Fz
c2VtYmxlcjo6RXh0ZW5kZWRBZGRyZXNzIGFkZHJlc3MpCisgICAgICAgIDogbV9raW5kKEV4dGVu
ZGVkQWRkcmVzcykKKyAgICAgICAgLCBtX29mZnNldChhZGRyZXNzLm9mZnNldCkKKyAgICAgICAg
LCBtX2Jhc2UoYWRkcmVzcy5iYXNlKQorICAgICAgICAsIG1faW5kZXgoQWJzdHJhY3RNYWNyb0Fz
c2VtYmxlcjo6Zmlyc3RSZWdpc3RlcigpKQorICAgICAgICAsIG1fc2NhbGUoQWJzdHJhY3RNYWNy
b0Fzc2VtYmxlcjo6VGltZXNPbmUpCisgICAgeworICAgIH0KKworICAgIGV4cGxpY2l0IER5bmFt
aWNBZGRyZXNzKEFic3RyYWN0TWFjcm9Bc3NlbWJsZXI6OkJhc2VJbmRleCBhZGRyZXNzKQorICAg
ICAgICA6IG1fa2luZChCYXNlSW5kZXgpCisgICAgICAgICwgbV9vZmZzZXQoYWRkcmVzcy5vZmZz
ZXQpCisgICAgICAgICwgbV9iYXNlKGFkZHJlc3MuYmFzZSkKKyAgICAgICAgLCBtX2luZGV4KGFk
ZHJlc3MuaW5kZXgpCisgICAgICAgICwgbV9zY2FsZShhZGRyZXNzLnNjYWxlKQorICAgIHsKKyAg
ICB9CisKKyAgICBleHBsaWNpdCBEeW5hbWljQWRkcmVzcyhBYnN0cmFjdE1hY3JvQXNzZW1ibGVy
OjpBYnNvbHV0ZUFkZHJlc3MgYWRkcmVzcykKKyAgICAgICAgOiBtX2tpbmQoQWJzb2x1dGVBZGRy
ZXNzKQorICAgICAgICAsIG1fb2Zmc2V0KGJpdHdpc2VfY2FzdDxpbnRwdHJfdD4oYWRkcmVzcy5t
X3B0cikpCisgICAgICAgICwgbV9iYXNlKEFic3RyYWN0TWFjcm9Bc3NlbWJsZXI6OmZpcnN0UmVn
aXN0ZXIoKSkKKyAgICAgICAgLCBtX2luZGV4KEFic3RyYWN0TWFjcm9Bc3NlbWJsZXI6OmZpcnN0
UmVnaXN0ZXIoKSkKKyAgICAgICAgLCBtX3NjYWxlKEFic3RyYWN0TWFjcm9Bc3NlbWJsZXI6OlRp
bWVzT25lKQorICAgIHsKKyAgICB9CisKKyAgICBib29sIG9wZXJhdG9yPT0oY29uc3QgRHluYW1p
Y0FkZHJlc3MmIG90aGVyKSBjb25zdAorICAgIHsKKyAgICAgICAgcmV0dXJuIG1fa2luZCA9PSBv
dGhlci5tX2tpbmQKKyAgICAgICAgICAgICYmIG1fb2Zmc2V0ID09IG90aGVyLm1fb2Zmc2V0Cisg
ICAgICAgICAgICAmJiBtX2Jhc2UgPT0gb3RoZXIubV9iYXNlCisgICAgICAgICAgICAmJiBtX2lu
ZGV4ID09IG90aGVyLm1faW5kZXgKKyAgICAgICAgICAgICYmIG1fc2NhbGUgPT0gb3RoZXIubV9z
Y2FsZTsKKyAgICB9CisKKyAgICBib29sIG9wZXJhdG9yIT0oY29uc3QgRHluYW1pY0FkZHJlc3Mm
IG90aGVyKSBjb25zdAorICAgIHsKKyAgICAgICAgcmV0dXJuICEoKnRoaXMgPT0gb3RoZXIpOwor
ICAgIH0KKworICAgIGV4cGxpY2l0IG9wZXJhdG9yIGJvb2woKSBjb25zdAorICAgIHsKKyAgICAg
ICAgcmV0dXJuICp0aGlzICE9IER5bmFtaWNBZGRyZXNzKCk7CisgICAgfQorCisgICAgS2luZCBr
aW5kKCkgY29uc3QgeyByZXR1cm4gbV9raW5kOyB9CisKKyAgICBBYnN0cmFjdE1hY3JvQXNzZW1i
bGVyOjpBZGRyZXNzIGFzQWRkcmVzcygpIGNvbnN0CisgICAgeworICAgICAgICBBU1NFUlQobV9r
aW5kID09IEFkZHJlc3MpOworICAgICAgICByZXR1cm4gQWJzdHJhY3RNYWNyb0Fzc2VtYmxlcjo6
QWRkcmVzcyhtX2Jhc2UsIHN0YXRpY19jYXN0PGludDMyX3Q+KG1fb2Zmc2V0KSk7CisgICAgfQor
CisgICAgQWJzdHJhY3RNYWNyb0Fzc2VtYmxlcjo6RXh0ZW5kZWRBZGRyZXNzIGFzRXh0ZW5kZWRB
ZGRyZXNzKCkgY29uc3QKKyAgICB7CisgICAgICAgIEFTU0VSVChtX2tpbmQgPT0gRXh0ZW5kZWRB
ZGRyZXNzKTsKKyAgICAgICAgcmV0dXJuIEFic3RyYWN0TWFjcm9Bc3NlbWJsZXI6OkV4dGVuZGVk
QWRkcmVzcyhtX2Jhc2UsIG1fb2Zmc2V0KTsKKyAgICB9CisKKyAgICBBYnN0cmFjdE1hY3JvQXNz
ZW1ibGVyOjpCYXNlSW5kZXggYXNCYXNlSW5kZXgoKSBjb25zdAorICAgIHsKKyAgICAgICAgQVNT
RVJUKG1fa2luZCA9PSBCYXNlSW5kZXgpOworICAgICAgICByZXR1cm4gQWJzdHJhY3RNYWNyb0Fz
c2VtYmxlcjo6QmFzZUluZGV4KG1fYmFzZSwgbV9pbmRleCwgbV9zY2FsZSwgbV9vZmZzZXQpOwor
ICAgIH0KKworICAgIEFic3RyYWN0TWFjcm9Bc3NlbWJsZXI6OkFic29sdXRlQWRkcmVzcyBhc0Fi
c29sdXRlQWRkcmVzcygpIGNvbnN0CisgICAgeworICAgICAgICBBU1NFUlQobV9raW5kID09IEFi
c29sdXRlQWRkcmVzcyk7CisgICAgICAgIHJldHVybiBBYnN0cmFjdE1hY3JvQXNzZW1ibGVyOjpB
YnNvbHV0ZUFkZHJlc3MoYml0d2lzZV9jYXN0PGNvbnN0IHZvaWQqPihtX29mZnNldCkpOworICAg
IH0KKworICAgIHZvaWQgZHVtcChQcmludFN0cmVhbSYpIGNvbnN0OworCitwcml2YXRlOgorICAg
IEtpbmQgbV9raW5kOworICAgIGludHB0cl90IG1fb2Zmc2V0OworICAgIEFic3RyYWN0TWFjcm9B
c3NlbWJsZXI6OlJlZ2lzdGVySUQgbV9iYXNlOworICAgIEFic3RyYWN0TWFjcm9Bc3NlbWJsZXI6
OlJlZ2lzdGVySUQgbV9pbmRleDsKKyAgICBBYnN0cmFjdE1hY3JvQXNzZW1ibGVyOjpTY2FsZSBt
X3NjYWxlOworCisjZWxzZSAvLyBFTkFCTEUoQVNTRU1CTEVSKQorCitwdWJsaWM6CisKKyAgICBE
eW5hbWljQWRkcmVzcygpIHsgfQorCisgICAgZXhwbGljaXQgb3BlcmF0b3IgYm9vbCgpIGNvbnN0
IHsgcmV0dXJuIGZhbHNlOyB9CisgICAgS2luZCBraW5kKCkgY29uc3QgeyByZXR1cm4gQWJzb2x1
dGVBZGRyZXNzOyB9CisKKyAgICB2b2lkIGR1bXAoUHJpbnRTdHJlYW0mKSBjb25zdDsKKyAgICAK
KyNlbmRpZiAvLyBFTkFCTEUoQVNTRU1CTEVSKQorCitwdWJsaWM6CisKKyAgICBib29sIGlzT25l
T2YoKSBjb25zdAorICAgIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHRl
bXBsYXRlPHR5cGVuYW1lLi4uIEFyZ3VtZW50cz4KKyAgICBib29sIGlzT25lT2YoS2luZCBraW5k
LCBBcmd1bWVudHMuLi4gYXJndW1lbnRzKSBjb25zdAorICAgIHsKKyAgICAgICAgaWYgKGtpbmQo
KSA9PSBraW5kKQorICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIHJldHVybiBpc09u
ZU9mKGFyZ3VtZW50cy4uLik7CisgICAgfQorfTsKKworfSAvLyBuYW1lc3BhY2UgSlNDCisKKyNl
bmRpZiAvLyBFTkFCTEUoQVNTRU1CTEVSKQorCisjZW5kaWYgLy8gRHluYW1pY0FkZHJlc3NfaAor
CkluZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYXNzZW1ibGVyL01hY3JvQXNzZW1ibGVyLmgK
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRDb3JlL2Fzc2VtYmxlci9NYWNyb0Fzc2Vt
Ymxlci5oCShyZXZpc2lvbiAxOTEyMzkpCisrKyBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYXNzZW1i
bGVyL01hY3JvQXNzZW1ibGVyLmgJKHdvcmtpbmcgY29weSkKQEAgLTEyMSwxMCArMTIxLDIzIEBA
IHB1YmxpYzoKICAgICB1c2luZyBNYWNyb0Fzc2VtYmxlckJhc2U6OmJyYW5jaFB0cjsKICNlbmRp
ZgogICAgIHVzaW5nIE1hY3JvQXNzZW1ibGVyQmFzZTo6YnJhbmNoU3ViMzI7CisgICAgdXNpbmcg
TWFjcm9Bc3NlbWJsZXJCYXNlOjpicmFuY2g4OworICAgIHVzaW5nIE1hY3JvQXNzZW1ibGVyQmFz
ZTo6bG9hZDMyOworICAgIHVzaW5nIE1hY3JvQXNzZW1ibGVyQmFzZTo6bG9hZDg7CisgICAgdXNp
bmcgTWFjcm9Bc3NlbWJsZXJCYXNlOjpsb2FkOFNpZ25FeHRlbmRUbzMyOworICAgIHVzaW5nIE1h
Y3JvQXNzZW1ibGVyQmFzZTo6bG9hZDE2OworICAgIHVzaW5nIE1hY3JvQXNzZW1ibGVyQmFzZTo6
bG9hZDE2U2lnbkV4dGVuZFRvMzI7CisgICAgdXNpbmcgTWFjcm9Bc3NlbWJsZXJCYXNlOjpsb2Fk
RG91YmxlOworICAgIHVzaW5nIE1hY3JvQXNzZW1ibGVyQmFzZTo6bG9hZEZsb2F0OwogICAgIHVz
aW5nIE1hY3JvQXNzZW1ibGVyQmFzZTo6bHNoaWZ0MzI7CisgICAgdXNpbmcgTWFjcm9Bc3NlbWJs
ZXJCYXNlOjptdWwzMjsKICAgICB1c2luZyBNYWNyb0Fzc2VtYmxlckJhc2U6Om9yMzI7CiAgICAg
dXNpbmcgTWFjcm9Bc3NlbWJsZXJCYXNlOjpyc2hpZnQzMjsKICAgICB1c2luZyBNYWNyb0Fzc2Vt
YmxlckJhc2U6OnN0b3JlMzI7CisgICAgdXNpbmcgTWFjcm9Bc3NlbWJsZXJCYXNlOjpzdG9yZTg7
CisgICAgdXNpbmcgTWFjcm9Bc3NlbWJsZXJCYXNlOjpzdG9yZTE2OworICAgIHVzaW5nIE1hY3Jv
QXNzZW1ibGVyQmFzZTo6c3RvcmVEb3VibGU7CisgICAgdXNpbmcgTWFjcm9Bc3NlbWJsZXJCYXNl
OjpzdG9yZUZsb2F0OwogICAgIHVzaW5nIE1hY3JvQXNzZW1ibGVyQmFzZTo6c3ViMzI7CiAgICAg
dXNpbmcgTWFjcm9Bc3NlbWJsZXJCYXNlOjp1cnNoaWZ0MzI7CiAgICAgdXNpbmcgTWFjcm9Bc3Nl
bWJsZXJCYXNlOjp4b3IzMjsKQEAgLTE1ODQsNiArMTU5Nyw1MTMgQEAgcHVibGljOgogICAgICAg
ICB1cnNoaWZ0MzIoc3JjLCB0cnVzdGVkSW1tMzJGb3JTaGlmdChhbW91bnQpLCBkZXN0KTsKICAg
ICB9CiAKKyAgICBib29sIHRyeUFkZDMyKFJlZ2lzdGVySUQgc3JjLCBEeW5hbWljQWRkcmVzcyBh
ZGRyZXNzKQorICAgIHsKKyAgICAgICAgc3dpdGNoIChhZGRyZXNzLmtpbmQoKSkgeworICAgICAg
ICBjYXNlIER5bmFtaWNBZGRyZXNzOjpBZGRyZXNzOgorICAgICAgICAgICAgYWRkMzIoc3JjLCBh
ZGRyZXNzLmFzQWRkcmVzcygpKTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICBk
ZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgfQorICAg
IHZvaWQgYWRkMzIoUmVnaXN0ZXJJRCBzcmMsIER5bmFtaWNBZGRyZXNzIGFkZHJlc3MpCisgICAg
eworICAgICAgICBSRUxFQVNFX0FTU0VSVCh0cnlBZGQzMihzcmMsIGFkZHJlc3MpKTsKKyAgICB9
CisKKyAgICAvLyBJdCdzIG5vdCBjbGVhciBpZiB0aGUgc2VtYW50aWNzIGhlcmUgc2hvdWxkIGJl
IHRvIHJldHVybiB0cnVlIGZvciBhbnkgYWRkcmVzcyBleHByZXNzaW9uCisgICAgLy8gZm9yIHdo
aWNoIHdlIGtub3cgaG93IHRvIGVtaXQgY29kZSwgb3IgdG8gb25seSBlbWl0IHRydWUgd2hlbiB3
ZSBrbm93IGhvdyB0byBlbWl0IGl0CisgICAgLy8gZWZmaWNpZW50bHkuIEknbSBjdXJyZW50bHkg
Z29pbmcgd2l0aCBzdXBwb3J0aW5nIGFsbCBvZiB0aGUgZXhwcmVzc2lvbnMgZm9yIHdoaWNoIHdl
IGtub3cKKyAgICAvLyBob3cgdG8gZW1pdCBjb2RlIGF0IGFsbCwgYW5kIEknbSBsZWF2aW5nIGl0
IHRvIGNsaWVudHMgdG8gZGVhbCB3aXRoIHRoZSBlZmZpY2llbmN5IHBhcnQuCisgICAgCisgICAg
Ym9vbCB0cnlBZGQzMihUcnVzdGVkSW1tMzIgaW1tLCBEeW5hbWljQWRkcmVzcyBhZGRyZXNzKQor
ICAgIHsKKyAgICAgICAgc3dpdGNoIChhZGRyZXNzLmtpbmQoKSkgeworICAgICAgICBjYXNlIER5
bmFtaWNBZGRyZXNzOjpBZGRyZXNzOgorICAgICAgICAgICAgYWRkMzIoaW1tLCBhZGRyZXNzLmFz
QWRkcmVzcygpKTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICBjYXNlIER5bmFt
aWNBZGRyZXNzOjpBYnNvbHV0ZUFkZHJlc3M6CisgICAgICAgICAgICBhZGQzMihpbW0sIGFkZHJl
c3MuYXNBYnNvbHV0ZUFkZHJlc3MoKSk7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAg
ICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgIH0K
KyAgICB2b2lkIGFkZDMyKFRydXN0ZWRJbW0zMiBpbW0sIER5bmFtaWNBZGRyZXNzIGFkZHJlc3Mp
CisgICAgeworICAgICAgICBSRUxFQVNFX0FTU0VSVCh0cnlBZGQzMihpbW0sIGFkZHJlc3MpKTsK
KyAgICB9CisKKyAgICBib29sIHRyeUFkZDMyKER5bmFtaWNBZGRyZXNzIGFkZHJlc3MsIFJlZ2lz
dGVySUQgZGVzdCkKKyAgICB7CisgICAgICAgIHN3aXRjaCAoYWRkcmVzcy5raW5kKCkpIHsKKyAg
ICAgICAgY2FzZSBEeW5hbWljQWRkcmVzczo6QWRkcmVzczoKKyAgICAgICAgICAgIGFkZDMyKGFk
ZHJlc3MuYXNBZGRyZXNzKCksIGRlc3QpOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAg
ICAgIGNhc2UgRHluYW1pY0FkZHJlc3M6OkFic29sdXRlQWRkcmVzczoKKyAgICAgICAgICAgIGFk
ZDMyKGFkZHJlc3MuYXNBYnNvbHV0ZUFkZHJlc3MoKSwgZGVzdCk7CisgICAgICAgICAgICByZXR1
cm4gdHJ1ZTsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHJ1biBmYWxzZTsKKyAg
ICAgICAgfQorICAgIH0KKyAgICB2b2lkIGFkZDMyKER5bmFtaWNBZGRyZXNzIGFkZHJlc3MsIFJl
Z2lzdGVySUQgZGVzdCkKKyAgICB7CisgICAgICAgIFJFTEVBU0VfQVNTRVJUKHRyeUFkZDMyKGFk
ZHJlc3MsIGRlc3QpKTsKKyAgICB9CisKKyAgICBib29sIHRyeUFuZDMyKFJlZ2lzdGVySUQgc3Jj
LCBEeW5hbWljQWRkcmVzcyBhZGRyZXNzKQorICAgIHsKKyAgICAgICAgc3dpdGNoIChhZGRyZXNz
LmtpbmQoKSkgeworICAgICAgICBjYXNlIER5bmFtaWNBZGRyZXNzOjpBZGRyZXNzOgorICAgICAg
ICAgICAgYW5kMzIoc3JjLCBhZGRyZXNzLmFzQWRkcmVzcygpKTsKKyAgICAgICAgICAgIHJldHVy
biB0cnVlOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAg
ICAgICB9CisgICAgfQorICAgIHZvaWQgYW5kMzIoUmVnaXN0ZXJJRCBzcmMsIER5bmFtaWNBZGRy
ZXNzIGFkZHJlc3MpCisgICAgeworICAgICAgICBSRUxFQVNFX0FTU0VSVCh0cnlBbmQzMihzcmMs
IGFkZHJlc3MpKTsKKyAgICB9CisKKyAgICBib29sIHRyeUFuZDMyKFRydXN0ZWRJbW0zMiBpbW0s
IER5bmFtaWNBZGRyZXNzIGFkZHJlc3MpCisgICAgeworICAgICAgICBzd2l0Y2ggKGFkZHJlc3Mu
a2luZCgpKSB7CisgICAgICAgIGNhc2UgRHluYW1pY0FkZHJlc3M6OkFkZHJlc3M6CisgICAgICAg
ICAgICBhbmQzMihpbW0sIGFkZHJlc3MuYXNBZGRyZXNzKCkpOworICAgICAgICAgICAgcmV0dXJu
IHRydWU7CisgICAgICAgIGNhc2UgRHluYW1pY0FkZHJlc3M6OkFic29sdXRlQWRkcmVzczoKKyAg
ICAgICAgICAgIGFuZDMyKGltbSwgYWRkcmVzcy5hc0Fic29sdXRlQWRkcmVzcygpKTsKKyAgICAg
ICAgICAgIHJldHVybiB0cnVlOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJu
IGZhbHNlOworICAgICAgICB9CisgICAgfQorICAgIHZvaWQgYW5kMzIoVHJ1c3RlZEltbTMyIGlt
bSwgRHluYW1pY0FkZHJlc3MgYWRkcmVzcykKKyAgICB7CisgICAgICAgIFJFTEVBU0VfQVNTRVJU
KHRyeUFuZDMyKGltbSwgYWRkcmVzcykpOworICAgIH0KKworICAgIGJvb2wgdHJ5QW5kMzIoRHlu
YW1pY0FkZHJlc3MgYWRkcmVzcywgUmVnaXN0ZXJJRCBkZXN0KQorICAgIHsKKyAgICAgICAgc3dp
dGNoIChhZGRyZXNzLmtpbmQoKSkgeworICAgICAgICBjYXNlIER5bmFtaWNBZGRyZXNzOjpBZGRy
ZXNzOgorICAgICAgICAgICAgYW5kMzIoYWRkcmVzcy5hc0FkZHJlc3MoKSwgZGVzdCk7CisgICAg
ICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVy
biBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KKyAgICB2b2lkIGFuZDMyKER5bmFtaWNBZGRyZXNz
IGFkZHJlc3MsIFJlZ2lzdGVySUQgZGVzdCkKKyAgICB7CisgICAgICAgIFJFTEVBU0VfQVNTRVJU
KHRyeUFkZDMyKGFkZHJlc3MsIGRlc3QpKTsKKyAgICB9CisKKyAgICBib29sIHRyeU11bDMyKER5
bmFtaWNBZGRyZXNzIGFkZHJlc3MsIFJlZ2lzdGVySUQgZGVzdCkKKyAgICB7CisgICAgICAgIHN3
aXRjaCAoYWRkcmVzcy5raW5kKCkpIHsKKyAgICAgICAgY2FzZSBEeW5hbWljQWRkcmVzczo6QWRk
cmVzczoKKyAgICAgICAgICAgIG11bDMyKGFkZHJlc3MuYXNBZGRyZXNzKCksIGRlc3QpOworICAg
ICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1
cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisgICAgdm9pZCBtdWwzMihEeW5hbWljQWRkcmVz
cyBhZGRyZXNzLCBSZWdpc3RlcklEIGRlc3QpCisgICAgeworICAgICAgICBSRUxFQVNFX0FTU0VS
VCh0cnlNdWwzMihhZGRyZXNzLCBkZXN0KSk7CisgICAgfQorCisgICAgYm9vbCB0cnlOZWczMihE
eW5hbWljQWRkcmVzcyBhZGRyZXNzKQorICAgIHsKKyAgICAgICAgc3dpdGNoIChhZGRyZXNzLmtp
bmQoKSkgeworICAgICAgICBjYXNlIER5bmFtaWNBZGRyZXNzOjpBZGRyZXNzOgorICAgICAgICAg
ICAgbmVnMzIoYWRkcmVzcy5hc0FkZHJlc3MoKSk7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsK
KyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQor
ICAgIH0KKyAgICB2b2lkIG5lZzMyKER5bmFtaWNBZGRyZXNzIGFkZHJlc3MpCisgICAgeworICAg
ICAgICBSRUxFQVNFX0FTU0VSVCh0cnlOZWczMihhZGRyZXNzKSk7CisgICAgfQorCisgICAgLy8g
RklYTUU6IExvdHMgb2YgbWlzc2luZyBjYXNlcyBoZXJlIQorCisgICAgYm9vbCB0cnlMb2FkMzIo
RHluYW1pY0FkZHJlc3MgYWRkcmVzcywgUmVnaXN0ZXJJRCBkZXN0KQorICAgIHsKKyAgICAgICAg
c3dpdGNoIChhZGRyZXNzLmtpbmQoKSkgeworICAgICAgICBjYXNlIER5bmFtaWNBZGRyZXNzOjpB
ZGRyZXNzOgorICAgICAgICAgICAgbG9hZDMyKGFkZHJlc3MuYXNBZGRyZXNzKCksIGRlc3QpOwor
ICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIGNhc2UgRHluYW1pY0FkZHJlc3M6OkJh
c2VJbmRleDoKKyAgICAgICAgICAgIGxvYWQzMihhZGRyZXNzLmFzQmFzZUluZGV4KCksIGRlc3Qp
OworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIGNhc2UgRHluYW1pY0FkZHJlc3M6
OkFic29sdXRlQWRkcmVzczoKKyAgICAgICAgICAgIGxvYWQzMihhZGRyZXNzLmFzQWJzb2x1dGVB
ZGRyZXNzKCkubV9wdHIsIGRlc3QpOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAg
IGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICB9Cisg
ICAgdm9pZCBsb2FkMzIoRHluYW1pY0FkZHJlc3MgYWRkcmVzcywgUmVnaXN0ZXJJRCBkZXN0KQor
ICAgIHsKKyAgICAgICAgUkVMRUFTRV9BU1NFUlQodHJ5TG9hZDMyKGFkZHJlc3MsIGRlc3QpKTsK
KyAgICB9CisKKyAgICBib29sIHRyeUxvYWQ4KER5bmFtaWNBZGRyZXNzIGFkZHJlc3MsIFJlZ2lz
dGVySUQgZGVzdCkKKyAgICB7CisgICAgICAgIHN3aXRjaCAoYWRkcmVzcy5raW5kKCkpIHsKKyAg
ICAgICAgY2FzZSBEeW5hbWljQWRkcmVzczo6QWRkcmVzczoKKyAgICAgICAgICAgIGxvYWQ4KGFk
ZHJlc3MuYXNBZGRyZXNzKCksIGRlc3QpOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAg
ICAgIGNhc2UgRHluYW1pY0FkZHJlc3M6OkJhc2VJbmRleDoKKyAgICAgICAgICAgIGxvYWQ4KGFk
ZHJlc3MuYXNCYXNlSW5kZXgoKSwgZGVzdCk7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAg
ICAgICAgY2FzZSBEeW5hbWljQWRkcmVzczo6QWJzb2x1dGVBZGRyZXNzOgorICAgICAgICAgICAg
bG9hZDgoYWRkcmVzcy5hc0Fic29sdXRlQWRkcmVzcygpLm1fcHRyLCBkZXN0KTsKKyAgICAgICAg
ICAgIHJldHVybiB0cnVlOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuIGZh
bHNlOworICAgICAgICB9CisgICAgfQorICAgIHZvaWQgbG9hZDgoRHluYW1pY0FkZHJlc3MgYWRk
cmVzcywgUmVnaXN0ZXJJRCBkZXN0KQorICAgIHsKKyAgICAgICAgUkVMRUFTRV9BU1NFUlQodHJ5
TG9hZDgoYWRkcmVzcywgZGVzdCkpOworICAgIH0KKworICAgIGJvb2wgdHJ5TG9hZDhTaWduRXh0
ZW5kVG8zMihEeW5hbWljQWRkcmVzcyBhZGRyZXNzLCBSZWdpc3RlcklEIGRlc3QpCisgICAgewor
ICAgICAgICBzd2l0Y2ggKGFkZHJlc3Mua2luZCgpKSB7CisgICAgICAgIGNhc2UgRHluYW1pY0Fk
ZHJlc3M6OkFkZHJlc3M6CisgICAgICAgICAgICBsb2FkOFNpZ25FeHRlbmRUbzMyKGFkZHJlc3Mu
YXNBZGRyZXNzKCksIGRlc3QpOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIGNh
c2UgRHluYW1pY0FkZHJlc3M6OkJhc2VJbmRleDoKKyAgICAgICAgICAgIGxvYWQ4U2lnbkV4dGVu
ZFRvMzIoYWRkcmVzcy5hc0Jhc2VJbmRleCgpLCBkZXN0KTsKKyAgICAgICAgICAgIHJldHVybiB0
cnVlOworICAgICAgICBjYXNlIER5bmFtaWNBZGRyZXNzOjpBYnNvbHV0ZUFkZHJlc3M6CisgICAg
ICAgICAgICBsb2FkOFNpZ25FeHRlbmRUbzMyKGFkZHJlc3MuYXNBYnNvbHV0ZUFkZHJlc3MoKS5t
X3B0ciwgZGVzdCk7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgZGVmYXVsdDoK
KyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KKyAgICB2b2lkIGxv
YWQ4U2lnbkV4dGVuZFRvMzIoRHluYW1pY0FkZHJlc3MgYWRkcmVzcywgUmVnaXN0ZXJJRCBkZXN0
KQorICAgIHsKKyAgICAgICAgUkVMRUFTRV9BU1NFUlQodHJ5TG9hZDhTaWduRXh0ZW5kVG8zMihh
ZGRyZXNzLCBkZXN0KSk7CisgICAgfQorCisgICAgYm9vbCB0cnlMb2FkMTYoRHluYW1pY0FkZHJl
c3MgYWRkcmVzcywgUmVnaXN0ZXJJRCBkZXN0KQorICAgIHsKKyAgICAgICAgc3dpdGNoIChhZGRy
ZXNzLmtpbmQoKSkgeworICAgICAgICBjYXNlIER5bmFtaWNBZGRyZXNzOjpBZGRyZXNzOgorICAg
ICAgICAgICAgbG9hZDE2KGFkZHJlc3MuYXNBZGRyZXNzKCksIGRlc3QpOworICAgICAgICAgICAg
cmV0dXJuIHRydWU7CisgICAgICAgIGNhc2UgRHluYW1pY0FkZHJlc3M6OkJhc2VJbmRleDoKKyAg
ICAgICAgICAgIGxvYWQxNihhZGRyZXNzLmFzQmFzZUluZGV4KCksIGRlc3QpOworICAgICAgICAg
ICAgcmV0dXJuIHRydWU7CisgICAgICAgIGNhc2UgRHluYW1pY0FkZHJlc3M6OkFic29sdXRlQWRk
cmVzczoKKyAgICAgICAgICAgIGxvYWQxNihhZGRyZXNzLmFzQWJzb2x1dGVBZGRyZXNzKCkubV9w
dHIsIGRlc3QpOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIGRlZmF1bHQ6Cisg
ICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisgICAgdm9pZCBsb2Fk
MTYoRHluYW1pY0FkZHJlc3MgYWRkcmVzcywgUmVnaXN0ZXJJRCBkZXN0KQorICAgIHsKKyAgICAg
ICAgUkVMRUFTRV9BU1NFUlQodHJ5TG9hZDE2KGFkZHJlc3MsIGRlc3QpKTsKKyAgICB9CisKKyAg
ICBib29sIHRyeUxvYWQxNlNpZ25FeHRlbmRUbzMyKER5bmFtaWNBZGRyZXNzIGFkZHJlc3MsIFJl
Z2lzdGVySUQgZGVzdCkKKyAgICB7CisgICAgICAgIHN3aXRjaCAoYWRkcmVzcy5raW5kKCkpIHsK
KyAgICAgICAgY2FzZSBEeW5hbWljQWRkcmVzczo6QWRkcmVzczoKKyAgICAgICAgICAgIGxvYWQx
NlNpZ25FeHRlbmRUbzMyKGFkZHJlc3MuYXNBZGRyZXNzKCksIGRlc3QpOworICAgICAgICAgICAg
cmV0dXJuIHRydWU7CisgICAgICAgIGNhc2UgRHluYW1pY0FkZHJlc3M6OkJhc2VJbmRleDoKKyAg
ICAgICAgICAgIGxvYWQxNlNpZ25FeHRlbmRUbzMyKGFkZHJlc3MuYXNCYXNlSW5kZXgoKSwgZGVz
dCk7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgY2FzZSBEeW5hbWljQWRkcmVz
czo6QWJzb2x1dGVBZGRyZXNzOgorICAgICAgICAgICAgbG9hZDE2U2lnbkV4dGVuZFRvMzIoYWRk
cmVzcy5hc0Fic29sdXRlQWRkcmVzcygpLm1fcHRyLCBkZXN0KTsKKyAgICAgICAgICAgIHJldHVy
biB0cnVlOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAg
ICAgICB9CisgICAgfQorICAgIHZvaWQgbG9hZDE2U2lnbkV4dGVuZFRvMzIoRHluYW1pY0FkZHJl
c3MgYWRkcmVzcywgUmVnaXN0ZXJJRCBkZXN0KQorICAgIHsKKyAgICAgICAgUkVMRUFTRV9BU1NF
UlQodHJ5TG9hZDE2U2lnbkV4dGVuZFRvMzIoYWRkcmVzcywgZGVzdCkpOworICAgIH0KKworICAg
IGJvb2wgdHJ5U3RvcmUzMihSZWdpc3RlcklEIHNyYywgRHluYW1pY0FkZHJlc3MgYWRkcmVzcykK
KyAgICB7CisgICAgICAgIHN3aXRjaCAoYWRkcmVzcy5raW5kKCkpIHsKKyAgICAgICAgY2FzZSBE
eW5hbWljQWRkcmVzczo6QWRkcmVzczoKKyAgICAgICAgICAgIHN0b3JlMzIoc3JjLCBhZGRyZXNz
LmFzQWRkcmVzcygpKTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICBjYXNlIER5
bmFtaWNBZGRyZXNzOjpCYXNlSW5kZXg6CisgICAgICAgICAgICBzdG9yZTMyKHNyYywgYWRkcmVz
cy5hc0Jhc2VJbmRleCgpKTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICBjYXNl
IER5bmFtaWNBZGRyZXNzOjpBYnNvbHV0ZUFkZHJlc3M6CisgICAgICAgICAgICBzdG9yZTMyKHNy
YywgYWRkcmVzcy5hc0Fic29sdXRlQWRkcmVzcygpLm1fcHRyKTsKKyAgICAgICAgICAgIHJldHVy
biB0cnVlOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAg
ICAgICB9CisgICAgfQorICAgIHZvaWQgc3RvcmUzMihSZWdpc3RlcklEIHNyYywgRHluYW1pY0Fk
ZHJlc3MgYWRkcmVzcykKKyAgICB7CisgICAgICAgIFJFTEVBU0VfQVNTRVJUKHRyeVN0b3JlMzIo
c3JjLCBhZGRyZXNzKSk7CisgICAgfQorCisgICAgYm9vbCB0cnlTdG9yZTMyKFRydXN0ZWRJbW0z
MiBzcmMsIER5bmFtaWNBZGRyZXNzIGFkZHJlc3MpCisgICAgeworICAgICAgICBzd2l0Y2ggKGFk
ZHJlc3Mua2luZCgpKSB7CisgICAgICAgIGNhc2UgRHluYW1pY0FkZHJlc3M6OkFkZHJlc3M6Cisg
ICAgICAgICAgICBzdG9yZTMyKHNyYywgYWRkcmVzcy5hc0FkZHJlc3MoKSk7CisgICAgICAgICAg
ICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgY2FzZSBEeW5hbWljQWRkcmVzczo6QmFzZUluZGV4Ogor
ICAgICAgICAgICAgc3RvcmUzMihzcmMsIGFkZHJlc3MuYXNCYXNlSW5kZXgoKSk7CisgICAgICAg
ICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgY2FzZSBEeW5hbWljQWRkcmVzczo6QWJzb2x1dGVB
ZGRyZXNzOgorICAgICAgICAgICAgc3RvcmUzMihzcmMsIGFkZHJlc3MuYXNBYnNvbHV0ZUFkZHJl
c3MoKS5tX3B0cik7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgZGVmYXVsdDoK
KyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KKyAgICB2b2lkIHN0
b3JlMzIoVHJ1c3RlZEltbTMyIHNyYywgRHluYW1pY0FkZHJlc3MgYWRkcmVzcykKKyAgICB7Cisg
ICAgICAgIFJFTEVBU0VfQVNTRVJUKHRyeVN0b3JlMzIoc3JjLCBhZGRyZXNzKSk7CisgICAgfQor
CisgICAgYm9vbCB0cnlTdG9yZTgoUmVnaXN0ZXJJRCBzcmMsIER5bmFtaWNBZGRyZXNzIGFkZHJl
c3MpCisgICAgeworICAgICAgICBzd2l0Y2ggKGFkZHJlc3Mua2luZCgpKSB7CisgICAgICAgIGNh
c2UgRHluYW1pY0FkZHJlc3M6OkFkZHJlc3M6CisgICAgICAgICAgICBzdG9yZTgoc3JjLCBhZGRy
ZXNzLmFzQWRkcmVzcygpKTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICBjYXNl
IER5bmFtaWNBZGRyZXNzOjpCYXNlSW5kZXg6CisgICAgICAgICAgICBzdG9yZTgoc3JjLCBhZGRy
ZXNzLmFzQmFzZUluZGV4KCkpOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIGNh
c2UgRHluYW1pY0FkZHJlc3M6OkFic29sdXRlQWRkcmVzczoKKyAgICAgICAgICAgIHN0b3JlOChz
cmMsIGFkZHJlc3MuYXNBYnNvbHV0ZUFkZHJlc3MoKS5tX3B0cik7CisgICAgICAgICAgICByZXR1
cm4gdHJ1ZTsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAg
ICAgICAgfQorICAgIH0KKyAgICB2b2lkIHN0b3JlOChSZWdpc3RlcklEIHNyYywgRHluYW1pY0Fk
ZHJlc3MgYWRkcmVzcykKKyAgICB7CisgICAgICAgIFJFTEVBU0VfQVNTRVJUKHRyeVN0b3JlOChz
cmMsIGFkZHJlc3MpKTsKKyAgICB9CisKKyAgICBib29sIHRyeVN0b3JlOChUcnVzdGVkSW1tMzIg
c3JjLCBEeW5hbWljQWRkcmVzcyBhZGRyZXNzKQorICAgIHsKKyAgICAgICAgc3dpdGNoIChhZGRy
ZXNzLmtpbmQoKSkgeworICAgICAgICBjYXNlIER5bmFtaWNBZGRyZXNzOjpBZGRyZXNzOgorICAg
ICAgICAgICAgc3RvcmU4KHNyYywgYWRkcmVzcy5hc0FkZHJlc3MoKSk7CisgICAgICAgICAgICBy
ZXR1cm4gdHJ1ZTsKKyAgICAgICAgY2FzZSBEeW5hbWljQWRkcmVzczo6QmFzZUluZGV4OgorICAg
ICAgICAgICAgc3RvcmU4KHNyYywgYWRkcmVzcy5hc0Jhc2VJbmRleCgpKTsKKyAgICAgICAgICAg
IHJldHVybiB0cnVlOworICAgICAgICBjYXNlIER5bmFtaWNBZGRyZXNzOjpBYnNvbHV0ZUFkZHJl
c3M6CisgICAgICAgICAgICBzdG9yZTgoc3JjLCBhZGRyZXNzLmFzQWJzb2x1dGVBZGRyZXNzKCku
bV9wdHIpOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIGRlZmF1bHQ6CisgICAg
ICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisgICAgdm9pZCBzdG9yZTgo
VHJ1c3RlZEltbTMyIHNyYywgRHluYW1pY0FkZHJlc3MgYWRkcmVzcykKKyAgICB7CisgICAgICAg
IFJFTEVBU0VfQVNTRVJUKHRyeVN0b3JlOChzcmMsIGFkZHJlc3MpKTsKKyAgICB9CisKKyAgICBi
b29sIHRyeVN0b3JlMTYoUmVnaXN0ZXJJRCBzcmMsIER5bmFtaWNBZGRyZXNzIGFkZHJlc3MpCisg
ICAgeworICAgICAgICBzd2l0Y2ggKGFkZHJlc3Mua2luZCgpKSB7CisgICAgICAgIGNhc2UgRHlu
YW1pY0FkZHJlc3M6OkFkZHJlc3M6CisgICAgICAgICAgICBzdG9yZTE2KHNyYywgYWRkcmVzcy5h
c0FkZHJlc3MoKSk7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgY2FzZSBEeW5h
bWljQWRkcmVzczo6QmFzZUluZGV4OgorICAgICAgICAgICAgc3RvcmUxNihzcmMsIGFkZHJlc3Mu
YXNCYXNlSW5kZXgoKSk7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgY2FzZSBE
eW5hbWljQWRkcmVzczo6QWJzb2x1dGVBZGRyZXNzOgorICAgICAgICAgICAgc3RvcmUxNihzcmMs
IGFkZHJlc3MuYXNBYnNvbHV0ZUFkZHJlc3MoKS5tX3B0cik7CisgICAgICAgICAgICByZXR1cm4g
dHJ1ZTsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAg
ICAgfQorICAgIH0KKyAgICB2b2lkIHN0b3JlMTYoUmVnaXN0ZXJJRCBzcmMsIER5bmFtaWNBZGRy
ZXNzIGFkZHJlc3MpCisgICAgeworICAgICAgICBSRUxFQVNFX0FTU0VSVCh0cnlTdG9yZTE2KHNy
YywgYWRkcmVzcykpOworICAgIH0KKworICAgIGJvb2wgdHJ5U3RvcmUxNihUcnVzdGVkSW1tMzIg
c3JjLCBEeW5hbWljQWRkcmVzcyBhZGRyZXNzKQorICAgIHsKKyAgICAgICAgc3dpdGNoIChhZGRy
ZXNzLmtpbmQoKSkgeworICAgICAgICBjYXNlIER5bmFtaWNBZGRyZXNzOjpBZGRyZXNzOgorICAg
ICAgICAgICAgc3RvcmUxNihzcmMsIGFkZHJlc3MuYXNBZGRyZXNzKCkpOworICAgICAgICAgICAg
cmV0dXJuIHRydWU7CisgICAgICAgIGNhc2UgRHluYW1pY0FkZHJlc3M6OkJhc2VJbmRleDoKKyAg
ICAgICAgICAgIHN0b3JlMTYoc3JjLCBhZGRyZXNzLmFzQmFzZUluZGV4KCkpOworICAgICAgICAg
ICAgcmV0dXJuIHRydWU7CisgICAgICAgIGNhc2UgRHluYW1pY0FkZHJlc3M6OkFic29sdXRlQWRk
cmVzczoKKyAgICAgICAgICAgIHN0b3JlMTYoc3JjLCBhZGRyZXNzLmFzQWJzb2x1dGVBZGRyZXNz
KCkubV9wdHIpOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIGRlZmF1bHQ6Cisg
ICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisgICAgdm9pZCBzdG9y
ZTE2KFRydXN0ZWRJbW0zMiBzcmMsIER5bmFtaWNBZGRyZXNzIGFkZHJlc3MpCisgICAgeworICAg
ICAgICBSRUxFQVNFX0FTU0VSVCh0cnlTdG9yZTE2KHNyYywgYWRkcmVzcykpOworICAgIH0KKwor
ICAgIGJvb2wgdHJ5TG9hZERvdWJsZShEeW5hbWljQWRkcmVzcyBhZGRyZXNzLCBGUFJlZ2lzdGVy
SUQgZGVzdCkKKyAgICB7CisgICAgICAgIHN3aXRjaCAoYWRkcmVzcy5raW5kKCkpIHsKKyAgICAg
ICAgY2FzZSBEeW5hbWljQWRkcmVzczo6QWRkcmVzczoKKyAgICAgICAgICAgIGxvYWREb3VibGUo
YWRkcmVzcy5hc0FkZHJlc3MoKSwgZGVzdCk7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAg
ICAgICAgY2FzZSBEeW5hbWljQWRkcmVzczo6QmFzZUluZGV4OgorICAgICAgICAgICAgbG9hZERv
dWJsZShhZGRyZXNzLmFzQmFzZUluZGV4KCksIGRlc3QpOworICAgICAgICAgICAgcmV0dXJuIHRy
dWU7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAg
IH0KKyAgICB9CisgICAgdm9pZCBsb2FkRG91YmxlKER5bmFtaWNBZGRyZXNzIGFkZHJlc3MsIEZQ
UmVnaXN0ZXJJRCBkZXN0KQorICAgIHsKKyAgICAgICAgUkVMRUFTRV9BU1NFUlQodHJ5TG9hZERv
dWJsZShhZGRyZXNzLCBkZXN0KSk7CisgICAgfQorCisgICAgYm9vbCB0cnlMb2FkRmxvYXQoRHlu
YW1pY0FkZHJlc3MgYWRkcmVzcywgRlBSZWdpc3RlcklEIGRlc3QpCisgICAgeworICAgICAgICBz
d2l0Y2ggKGFkZHJlc3Mua2luZCgpKSB7CisgICAgICAgIGNhc2UgRHluYW1pY0FkZHJlc3M6OkFk
ZHJlc3M6CisgICAgICAgICAgICBsb2FkRmxvYXQoYWRkcmVzcy5hc0FkZHJlc3MoKSwgZGVzdCk7
CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgY2FzZSBEeW5hbWljQWRkcmVzczo6
QmFzZUluZGV4OgorICAgICAgICAgICAgbG9hZEZsb2F0KGFkZHJlc3MuYXNCYXNlSW5kZXgoKSwg
ZGVzdCk7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAg
ICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KKyAgICB2b2lkIGxvYWRGbG9h
dChEeW5hbWljQWRkcmVzcyBhZGRyZXNzLCBGUFJlZ2lzdGVySUQgZGVzdCkKKyAgICB7CisgICAg
ICAgIFJFTEVBU0VfQVNTRVJUKHRyeUxvYWRGbG9hdChhZGRyZXNzLCBkZXN0KSk7CisgICAgfQor
CisgICAgYm9vbCB0cnlTdG9yZURvdWJsZShGUFJlZ2lzdGVySUQgc3JjLCBEeW5hbWljQWRkcmVz
cyBhZGRyZXNzKQorICAgIHsKKyAgICAgICAgc3dpdGNoIChhZGRyZXNzLmtpbmQoKSkgeworICAg
ICAgICBjYXNlIER5bmFtaWNBZGRyZXNzOjpBZGRyZXNzOgorICAgICAgICAgICAgc3RvcmVEb3Vi
bGUoc3JjLCBhZGRyZXNzLmFzQWRkcmVzcygpKTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOwor
ICAgICAgICBjYXNlIER5bmFtaWNBZGRyZXNzOjpCYXNlSW5kZXg6CisgICAgICAgICAgICBzdG9y
ZURvdWJsZShzcmMsIGFkZHJlc3MuYXNCYXNlSW5kZXgoKSk7CisgICAgICAgICAgICByZXR1cm4g
dHJ1ZTsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAg
ICAgfQorICAgIH0KKyAgICB2b2lkIHN0b3JlRG91YmxlKEZQUmVnaXN0ZXJJRCBzcmMsIER5bmFt
aWNBZGRyZXNzIGFkZHJlc3MpCisgICAgeworICAgICAgICBSRUxFQVNFX0FTU0VSVCh0cnlTdG9y
ZURvdWJsZShzcmMsIGFkZHJlc3MpKTsKKyAgICB9CisKKyAgICBib29sIHRyeVN0b3JlRmxvYXQo
RlBSZWdpc3RlcklEIHNyYywgRHluYW1pY0FkZHJlc3MgYWRkcmVzcykKKyAgICB7CisgICAgICAg
IHN3aXRjaCAoYWRkcmVzcy5raW5kKCkpIHsKKyAgICAgICAgY2FzZSBEeW5hbWljQWRkcmVzczo6
QWRkcmVzczoKKyAgICAgICAgICAgIHN0b3JlRmxvYXQoc3JjLCBhZGRyZXNzLmFzQWRkcmVzcygp
KTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICBjYXNlIER5bmFtaWNBZGRyZXNz
OjpCYXNlSW5kZXg6CisgICAgICAgICAgICBzdG9yZUZsb2F0KHNyYywgYWRkcmVzcy5hc0Jhc2VJ
bmRleCgpKTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICBkZWZhdWx0OgorICAg
ICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgfQorICAgIHZvaWQgc3RvcmVG
bG9hdChGUFJlZ2lzdGVySUQgc3JjLCBEeW5hbWljQWRkcmVzcyBhZGRyZXNzKQorICAgIHsKKyAg
ICAgICAgUkVMRUFTRV9BU1NFUlQodHJ5U3RvcmVGbG9hdChzcmMsIGFkZHJlc3MpKTsKKyAgICB9
CisKKyAgICBKdW1wIHRyeUJyYW5jaDgoUmVsYXRpb25hbENvbmRpdGlvbiBjb25kLCBEeW5hbWlj
QWRkcmVzcyBsZWZ0LCBUcnVzdGVkSW1tMzIgcmlnaHQpCisgICAgeworICAgICAgICBzd2l0Y2gg
KGxlZnQua2luZCgpKSB7CisgICAgICAgIGNhc2UgRHluYW1pY0FkZHJlc3M6OkFkZHJlc3M6Cisg
ICAgICAgICAgICByZXR1cm4gYnJhbmNoOChjb25kLCBsZWZ0LmFzQWRkcmVzcygpLCByaWdodCk7
CisgICAgICAgIGNhc2UgRHluYW1pY0FkZHJlc3M6OkJhc2VJbmRleDoKKyAgICAgICAgICAgIHJl
dHVybiBicmFuY2g4KGNvbmQsIGxlZnQuYXNCYXNlSW5kZXgoKSwgcmlnaHQpOworICAgICAgICBk
ZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuIEp1bXAoKTsKKyAgICAgICAgfQorICAgIH0KKyAg
ICB2b2lkIGJyYW5jaDgoUmVsYXRpb25hbENvbmRpdGlvbiBjb25kLCBEeW5hbWljQWRkcmVzcyBs
ZWZ0LCBUcnVzdGVkSW1tMzIgcmlnaHQpCisgICAgeworICAgICAgICBKdW1wIHJlc3VsdCA9IHRy
eUJyYW5jaDgoY29uZCwgbGVmdCwgcmlnaHQpOworICAgICAgICBSRUxFQVNFX0FTU0VSVChyZXN1
bHQuaXNTZXQoKSk7CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorCisgICAgSnVtcCB0
cnlCcmFuY2gzMihSZWxhdGlvbmFsQ29uZGl0aW9uIGNvbmQsIFJlZ2lzdGVySUQgbGVmdCwgRHlu
YW1pY0FkZHJlc3MgcmlnaHQpCisgICAgeworICAgICAgICBzd2l0Y2ggKHJpZ2h0LmtpbmQoKSkg
eworICAgICAgICBjYXNlIER5bmFtaWNBZGRyZXNzOjpBZGRyZXNzOgorICAgICAgICAgICAgcmV0
dXJuIGJyYW5jaDMyKGNvbmQsIGxlZnQsIHJpZ2h0LmFzQWRkcmVzcygpKTsKKyAgICAgICAgZGVm
YXVsdDoKKyAgICAgICAgICAgIHJldHVybiBKdW1wKCk7CisgICAgICAgIH0KKyAgICB9CisgICAg
dm9pZCBicmFuY2gzMihSZWxhdGlvbmFsQ29uZGl0aW9uIGNvbmQsIFRydXN0ZWRJbW0zMiBsZWZ0
LCBEeW5hbWljQWRkcmVzcyByaWdodCkKKyAgICB7CisgICAgICAgIEp1bXAgcmVzdWx0ID0gdHJ5
QnJhbmNoMzIoY29uZCwgbGVmdCwgcmlnaHQpOworICAgICAgICBSRUxFQVNFX0FTU0VSVChyZXN1
bHQuaXNTZXQoKSk7CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorCisgICAgSnVtcCB0
cnlCcmFuY2gzMihSZWxhdGlvbmFsQ29uZGl0aW9uIGNvbmQsIER5bmFtaWNBZGRyZXNzIGxlZnQs
IFRydXN0ZWRJbW0zMiByaWdodCkKKyAgICB7CisgICAgICAgIHN3aXRjaCAobGVmdC5raW5kKCkp
IHsKKyAgICAgICAgY2FzZSBEeW5hbWljQWRkcmVzczo6QWRkcmVzczoKKyAgICAgICAgICAgIHJl
dHVybiBicmFuY2gzMihjb25kLCBsZWZ0LmFzQWRkcmVzcygpLCByaWdodCk7CisgICAgICAgIGNh
c2UgRHluYW1pY0FkZHJlc3M6OkJhc2VJbmRleDoKKyAgICAgICAgICAgIHJldHVybiBicmFuY2gz
Mihjb25kLCBsZWZ0LmFzQmFzZUluZGV4KCksIHJpZ2h0KTsKKyAgICAgICAgZGVmYXVsdDoKKyAg
ICAgICAgICAgIHJldHVybiBKdW1wKCk7CisgICAgICAgIH0KKyAgICB9CisgICAgdm9pZCBicmFu
Y2gzMihSZWxhdGlvbmFsQ29uZGl0aW9uIGNvbmQsIER5bmFtaWNBZGRyZXNzIGxlZnQsIFRydXN0
ZWRJbW0zMiByaWdodCkKKyAgICB7CisgICAgICAgIEp1bXAgcmVzdWx0ID0gdHJ5QnJhbmNoMzIo
Y29uZCwgbGVmdCwgcmlnaHQpOworICAgICAgICBSRUxFQVNFX0FTU0VSVChyZXN1bHQuaXNTZXQo
KSk7CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorICAgIAorICAgIEp1bXAgdHJ5QnJh
bmNoMzIoUmVsYXRpb25hbENvbmRpdGlvbiBjb25kLCBEeW5hbWljQWRkcmVzcyBsZWZ0LCBSZWdp
c3RlcklEIHJpZ2h0KQorICAgIHsKKyAgICAgICAgc3dpdGNoIChsZWZ0LmtpbmQoKSkgeworICAg
ICAgICBjYXNlIER5bmFtaWNBZGRyZXNzOjpBZGRyZXNzOgorICAgICAgICAgICAgcmV0dXJuIGJy
YW5jaDMyKGNvbmQsIGxlZnQuYXNBZGRyZXNzKCksIHJpZ2h0KTsKKyAgICAgICAgZGVmYXVsdDoK
KyAgICAgICAgICAgIHJldHVybiBKdW1wKCk7CisgICAgICAgIH0KKyAgICB9CisgICAgdm9pZCBi
cmFuY2gzMihSZWxhdGlvbmFsQ29uZGl0aW9uIGNvbmQsIER5bmFtaWNBZGRyZXNzIGxlZnQsIFJl
Z2lzdGVySUQgcmlnaHQpCisgICAgeworICAgICAgICBKdW1wIHJlc3VsdCA9IHRyeUJyYW5jaDMy
KGNvbmQsIGxlZnQsIHJpZ2h0KTsKKyAgICAgICAgUkVMRUFTRV9BU1NFUlQocmVzdWx0LmlzU2V0
KCkpOworICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKwogI2lmIEVOQUJMRShNQVNNX1BS
T0JFKQogICAgIC8vIExldCdzIHlvdSBwcmludCBmcm9tIHlvdXIgSklUIGdlbmVyYXRlZCBjb2Rl
LgogICAgIC8vIFNlZSBjb21tZW50cyBpbiBNYWNyb0Fzc2VtYmxlclByaW50ZXIuaCBmb3IgZXhh
bXBsZXMgb2YgaG93IHRvIHVzZSB0aGlzLgpJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL2Iz
L0IzQWRkcmVzc01hdGNoZXIucGF0dGVybnMKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL0phdmFTY3Jp
cHRDb3JlL2IzL0IzQWRkcmVzc01hdGNoZXIucGF0dGVybnMJKHJldmlzaW9uIDApCisrKyBTb3Vy
Y2UvSmF2YVNjcmlwdENvcmUvYjMvQjNBZGRyZXNzTWF0Y2hlci5wYXR0ZXJucwkod29ya2luZyBj
b3B5KQpAQCAtMCwwICsxLDMzIEBACisjIENvcHlyaWdodCAoQykgMjAxNSBBcHBsZSBJbmMuIEFs
bCByaWdodHMgcmVzZXJ2ZWQuCisjCisjIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNl
IGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorIyBtb2RpZmljYXRpb24sIGFyZSBw
ZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyMgYXJlIG1l
dDoKKyMgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBh
Ym92ZSBjb3B5cmlnaHQKKyMgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQg
dGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorIyAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5
IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorIyAgICBub3RpY2UsIHRo
aXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhl
CisjICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRo
IHRoZSBkaXN0cmlidXRpb24uCisjCisjIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQ
TEUgSU5DLiBBTkQgSVRTIENPTlRSSUJVVE9SUyBgYEFTIElTJycKKyMgQU5EIEFOWSBFWFBSRVNT
IE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisj
IFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZP
UiBBIFBBUlRJQ1VMQVIKKyMgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hB
TEwgQVBQTEUgSU5DLiBPUiBJVFMgQ09OVFJJQlVUT1JTCisjIEJFIExJQUJMRSBGT1IgQU5ZIERJ
UkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKKyMgQ09O
U0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VS
RU1FTlQgT0YKKyMgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERB
VEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTCisjIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVT
RUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOCisjIENPTlRSQUNU
LCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhF
UldJU0UpCisjIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRX
QVJFLCBFVkVOIElGIEFEVklTRUQgT0YKKyMgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdF
LgorCittYXRjaGVyIEFkZHJlc3NNYXRjaGVyCisKK2luY2x1ZGUgQjNFZmZlY3RpdmVBZGRyZXNz
LnBhdHRlcm5zCisKKyMgVGhpcyBtYXRjaGVzIHRoZSB0aGluZ3MgdGhhdCBjYW4gZ28gaW50byBs
b2FkcyBhbmQgc3RvcmVzLCBpbiBhZGRpdGlvbiB0byBqdXN0CisjIGxvYWQtZWZmZWN0aXZlLWFk
ZHJlc3MgZXhwcmVzc2lvbnMuCisKK0Fic29sdXRlID0gJGFkZHJlc3MKKworRGlyZWN0ID0gJWFk
ZHJlc3MKSW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM0FyZ3VtZW50UmVnVmFsdWUu
Y3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM0FyZ3VtZW50UmVn
VmFsdWUuY3BwCShyZXZpc2lvbiAwKQorKysgU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzQXJn
dW1lbnRSZWdWYWx1ZS5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSw0MSBAQAorLyoKKyAq
IENvcHlyaWdodCAoQykgMjAxNSBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgor
ICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0
aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhh
dCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1
dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICog
ICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNj
bGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9k
dWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRp
dGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50
YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRp
b24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIGBgQVMg
SVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5H
LCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNI
QU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBE
SVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUgorICogQ09OVFJJQlVU
T1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJ
QUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBC
VVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9S
IFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNT
IElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJ
QUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAor
ICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZ
IE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0Yg
VEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLiAKKyAqLworCisjaW5jbHVkZSAiY29uZmln
LmgiCisjaW5jbHVkZSAiQjNBcmd1bWVudFJlZ1ZhbHVlLmgiCisKK25hbWVzcGFjZSBKU0MgeyBu
YW1lc3BhY2UgQjMgeworCitBcmd1bWVudFJlZ1ZhbHVlOjp+QXJndW1lbnRSZWdWYWx1ZSgpCit7
Cit9CisKK3ZvaWQgQXJndW1lbnRSZWdWYWx1ZTo6ZHVtcE1ldGEoUHJpbnRTdHJlYW0mIG91dCkg
Y29uc3QKK3sKKyAgICBvdXQucHJpbnQobV9yZWcpOworfQorCit9IH0gLy8gbmFtZXNwYWNlIEpT
Qzo6QjMKKwpJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzQXJndW1lbnRSZWdWYWx1
ZS5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM0FyZ3VtZW50UmVn
VmFsdWUuaAkocmV2aXNpb24gMCkKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM0FyZ3Vt
ZW50UmVnVmFsdWUuaAkod29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDYwIEBACisvKgorICogQ29w
eXJpZ2h0IChDKSAyMDE1IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBS
ZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9y
IHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRo
ZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9u
cyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBu
b3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWlt
ZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2Ug
dGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9u
cyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlv
biBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4K
KyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycn
IEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJV
VCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRB
QklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NM
QUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMg
QkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwK
KyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBO
T1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VS
VklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5U
RVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklM
SVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAo
SU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VU
IE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUg
UE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisKKyNpZm5kZWYgQjNBcmd1bWVudFJl
Z1ZhbHVlX2gKKyNkZWZpbmUgQjNBcmd1bWVudFJlZ1ZhbHVlX2gKKworI2luY2x1ZGUgIkIzVmFs
dWUuaCIKKyNpbmNsdWRlICJSZWcuaCIKKworbmFtZXNwYWNlIEpTQyB7IG5hbWVzcGFjZSBCMyB7
CisKK2NsYXNzIEFyZ3VtZW50UmVnVmFsdWUgOiBwdWJsaWMgVmFsdWUgeworcHVibGljOgorICAg
IHN0YXRpYyBib29sIGFjY2VwdHMoT3Bjb2RlIG9wY29kZSkgeyByZXR1cm4gb3Bjb2RlID09IEFy
Z3VtZW50UmVnOyB9CisgICAgCisgICAgfkFyZ3VtZW50UmVnVmFsdWUoKTsKKworICAgIFJlZyBh
cmd1bWVudFJlZygpIGNvbnN0IHsgcmV0dXJuIG1fcmVnOyB9CisKK3Byb3RlY3RlZDoKKyAgICB2
b2lkIGR1bXBNZXRhKFByaW50U3RyZWFtJikgY29uc3Qgb3ZlcnJpZGU7CisKK3ByaXZhdGU6Cisg
ICAgZnJpZW5kIGNsYXNzIFByb2NlZHVyZTsKKworICAgIEFyZ3VtZW50UmVnVmFsdWUodW5zaWdu
ZWQgaW5kZXgsIE9yaWdpbiBvcmlnaW4sIFJlZyByZWcpCisgICAgICAgIDogVmFsdWUoaW5kZXgs
IEFyZ3VtZW50UmVnLCByZWcuaXNHUFIoKSA/IHBvaW50ZXIoKSA6IERvdWJsZSwgb3JpZ2luKQor
ICAgICAgICAsIG1fcmVnKHJlZykKKyAgICB7CisgICAgfQorCisgICAgUmVnIG1fcmVnOworfTsK
KworfSB9IC8vIG5hbWVzcGFjZSBKU0M6OkIzCisKKyNlbmRpZiAvLyBCM0FyZ3VtZW50UmVnVmFs
dWVfaAorCkluZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNCYXNpY0Jsb2NrLmNwcAo9
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNCYXNpY0Jsb2NrLmNwcAko
cmV2aXNpb24gMCkKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM0Jhc2ljQmxvY2suY3Bw
CSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsNTggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIw
MTUgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9u
IGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICog
bW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBj
b25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBj
b2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBs
aXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJl
ZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29w
eXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9s
bG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhl
ciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMg
U09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICog
RVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVE
IFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJ
VE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5P
IEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9S
IEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZ
LCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRP
LAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBP
RiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhP
V0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIg
SU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVH
TElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQor
ICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBP
RiBTVUNIIERBTUFHRS4gCisgKi8KKworI2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgIkIz
QmFzaWNCbG9jay5oIgorCituYW1lc3BhY2UgSlNDIHsgbmFtZXNwYWNlIEIzIHsKKworQmFzaWNC
bG9jazo6QmFzaWNCbG9jayh1bnNpZ25lZCBpbmRleCkKKyAgICA6IG1faW5kZXgoaW5kZXgpCit7
Cit9CisKK0Jhc2ljQmxvY2s6On5CYXNpY0Jsb2NrKCkKK3sKK30KKwordm9pZCBCYXNpY0Jsb2Nr
OjphcHBlbmQoVmFsdWUqIHZhbHVlKQoreworICAgIG1fdmFsdWVzLmFwcGVuZCh2YWx1ZSk7Cit9
CisKK3ZvaWQgQmFzaWNCbG9jazo6ZHVtcChQcmludFN0cmVhbSYgb3V0KSBjb25zdAoreworICAg
IG91dC5wcmludChkdW1wUHJlZml4LCBtX2luZGV4KTsKK30KKwordm9pZCBCYXNpY0Jsb2NrOjpk
ZWVwRHVtcChQcmludFN0cmVhbSYgb3V0KSBjb25zdAoreworICAgIG91dC5wcmludCgiQkIiLCAq
dGhpcywgIjpcbiIpOworICAgIGZvciAoVmFsdWUqIHZhbHVlIDogKnRoaXMpCisgICAgICAgIG91
dC5wcmludCgiICAgICIsIGRlZXBEdW1wKHZhbHVlKSwgIlxuIik7Cit9CisKK30gfSAvLyBuYW1l
c3BhY2UgSlNDOjpCMworCkluZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNCYXNpY0Js
b2NrLmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzQmFzaWNCbG9j
ay5oCShyZXZpc2lvbiAwKQorKysgU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzQmFzaWNCbG9j
ay5oCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsMTEyIEBACisvKgorICogQ29weXJpZ2h0IChD
KSAyMDE1IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1
dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQK
KyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dp
bmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3Vy
Y2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRo
aXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAy
LiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3Zl
IGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhl
IGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Ig
b3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBU
SElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkK
KyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElN
SVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFO
RCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJ
TiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxF
IEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1Q
TEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRF
RCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExP
U1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9O
KSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVU
SEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5H
IE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBV
U0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJ
VFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisKKyNpZm5kZWYgQjNCYXNpY0Jsb2NrCisjZGVmaW5l
IEIzQmFzaWNCbG9jaworCituYW1lc3BhY2UgSlNDIHsgbmFtZXNwYWNlIEIzIHsKKworY2xhc3Mg
UHJvY2VkdXJlOworY2xhc3MgVmFsdWU7CisKK2NsYXNzIEJhc2ljQmxvY2sgeworICAgIFdURl9N
QUtFX05PTkNPUFlBQkxFKEJhc2ljQmxvY2spOworICAgIFdURl9NQUtFX0ZBU1RfQUxMT0NBVEVE
OworcHVibGljOgorICAgIHR5cGVkZWYgVmVjdG9yPFZhbHVlKj4gVmFsdWVMaXN0OworICAgIHR5
cGVkZWYgVmVjdG9yPEJhc2ljQmxvY2sqLCAyPiBTdWNjZXNzb3JMaXN0OyAvLyBUaGlzIG1hdGNo
ZXMgQ29udHJvbFZhbHVlJ3MgdHlwZWRlZi4KKworICAgIHN0YXRpYyBjb25zdCBjaGFyKiBkdW1w
UHJlZml4ID0gIiMiOworCisgICAgfkJhc2ljQmxvY2soKTsKKworICAgIHVuc2lnbmVkIGluZGV4
KCkgY29uc3QgeyByZXR1cm4gbV9pbmRleDsgfQorCisgICAgQWRqYWNlbmN5TGlzdDo6aXRlcmF0
b3IgYmVnaW4oKSB7IHJldHVybiBtX3ZhbHVlcy5iZWdpbigpOyB9CisgICAgQWRqYWNlbmN5TGlz
dDo6aXRlcmF0b3IgZW5kKCkgeyByZXR1cm4gbV92YWx1ZXMuZW5kKCk7IH0KKyAgICBBZGphY2Vu
Y3lMaXN0Ojpjb25zdF9pdGVyYXRvciBiZWdpbigpIGNvbnN0IHsgcmV0dXJuIG1fdmFsdWVzLmJl
Z2luKCk7IH0KKyAgICBBZGphY2VuY3lMaXN0Ojpjb25zdF9pdGVyYXRvciBlbmQoKSBjb25zdCB7
IHJldHVybiBtX3ZhbHVlcy5lbmQoKTsgfQorCisgICAgc2l6ZV90IHNpemUoKSBjb25zdCB7IHJl
dHVybiBtX3ZhbHVlcy5zaXplKCk7IH0KKyAgICBWYWx1ZSogYXQoc2l6ZV90IGluZGV4KSBjb25z
dCB7IHJldHVybiBtX3ZhbHVlc1tpbmRleF07IH0KKyAgICBWYWx1ZSomIGF0KHNpemVfdCBpbmRl
eCkgeyByZXR1cm4gbV92YWx1ZXNbaW5kZXhdOyB9CisKKyAgICBWYWx1ZSogbGFzdCgpIGNvbnN0
IHsgcmV0dXJuIG1fdmFsdWVzLmxhc3QoKTsgfQorICAgIFZhbHVlKiYgbGFzdCgpIHsgcmV0dXJu
IG1fdmFsdWVzLmxhc3QoKTsgfQorCisgICAgY29uc3QgVmFsdWVMaXN0JiB2YWx1ZXMoKSBjb25z
dCB7IHJldHVybiBtX3ZhbHVlczsgfQorICAgIFZhbHVlTGlzdCYgdmFsdWVzKCkgeyByZXR1cm4g
bV92YWx1ZXM7IH0KKworICAgIHZvaWQgYXBwZW5kKFZhbHVlKik7CisKKyAgICB0ZW1wbGF0ZTx0
eXBlbmFtZSBWYWx1ZVR5cGUsIHR5cGVuYW1lLi4uIEFyZ3VtZW50cz4KKyAgICBWYWx1ZVR5cGUq
IGFwcGVuZE5ldyhQcm9jZWR1cmUmLCBBcmd1bWVudHMuLi4pOworCisgICAgdW5zaWduZWQgbnVt
U3VjY2Vzc29ycygpIGNvbnN0OworICAgIEJhc2ljQmxvY2sqIHN1Y2Nlc3Nvcih1bnNpZ25lZCBp
bmRleCkgY29uc3Q7CisgICAgQmFzaWNCbG9jayomIHN1Y2Nlc3Nvcih1bnNpZ25lZCBpbmRleCk7
CisgICAgY29uc3QgU3VjY2Vzc29yTGlzdCYgc3VjY2Vzc29ycygpIGNvbnN0OworCisgICAgdm9p
ZCBkdW1wKFByaW50U3RyZWFtJikgY29uc3Q7CisgICAgdm9pZCBkZWVwRHVtcChQcmludFN0cmVh
bSYpIGNvbnN0OworCitwcml2YXRlOgorICAgIGZyaWVuZCBjbGFzcyBQcm9jZWR1cmU7CisgICAg
CisgICAgLy8gSW5zdGFudGlhdGUgdmlhIFByb2NlZHVyZS4KKyAgICBCYXNpY0Jsb2NrKHVuc2ln
bmVkIGluZGV4KTsKKworICAgIHVuc2lnbmVkIG1faW5kZXg7CisgICAgVmFsdWVMaXN0IG1fdmFs
dWVzOworfTsKKworY2xhc3MgRGVlcEJhc2ljQmxvY2tEdW1wIHsKK3B1YmxpYzoKKyAgICBEZWVw
QmFzaWNCbG9ja0R1bXAoQmFzaWNCbG9jayogYmxvY2spCisgICAgICAgIDogbV9ibG9jayhibG9j
aykKKyAgICB7CisgICAgfQorCisgICAgdm9pZCBkdW1wKFByaW50U3RyZWFtJiBvdXQpIGNvbnN0
CisgICAgeworICAgICAgICBpZiAobV9ibG9jaykKKyAgICAgICAgICAgIG1fYmxvY2stPmRlZXBE
dW1wKG91dCk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIG91dC5wcmludCgiPG51bGw+Iik7
CisgICAgfQorCitwcml2YXRlOgorICAgIEJhc2ljQmxvY2sqIG1fYmxvY2s7Cit9OworCitEZWVw
QmFzaWNCbG9ja0R1bXAgZGVlcER1bXAoQmFzaWNCbG9jayogYmxvY2spCit7CisgICAgcmV0dXJu
IERlZXBCYXNpY0Jsb2NrRHVtcChibG9jayk7Cit9CisKK30gfSAvLyBuYW1lc3BhY2UgSlNDOjpC
MworCisjZW5kaWYgLy8gQjNCYXNpY0Jsb2NrCisKSW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29y
ZS9iMy9CM0Jhc2ljQmxvY2tJbmxpbmVzLmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL0phdmFTY3Jp
cHRDb3JlL2IzL0IzQmFzaWNCbG9ja0lubGluZXMuaAkocmV2aXNpb24gMCkKKysrIFNvdXJjZS9K
YXZhU2NyaXB0Q29yZS9iMy9CM0Jhc2ljQmxvY2tJbmxpbmVzLmgJKHdvcmtpbmcgY29weSkKQEAg
LTAsMCArMSw2NiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNSBBcHBsZSBJbmMuIEFsbCBy
aWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2Ug
YW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBw
ZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBt
ZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhl
IGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBh
bmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJp
bmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGlj
ZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBp
biB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRl
ZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURF
RCBCWSBBUFBMRSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQg
V0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElF
RCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNV
TEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUg
SU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJF
Q1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwg
REFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBP
RiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAq
IFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9O
IEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNU
IExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lT
RSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJF
LCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLiAKKyAq
LworCisjaWZuZGVmIEIzQmFzaWNCbG9ja0lubGluZXNfaAorI2RlZmluZSBCM0Jhc2ljQmxvY2tJ
bmxpbmVzX2gKKworI2luY2x1ZGUgIkIzQmFzaWNCbG9jay5oIgorI2luY2x1ZGUgIkIzQ29udHJv
bFZhbHVlLmgiCisjaW5jbHVkZSAiQjNQcm9jZWR1cmVJbmxpbmVzLmgiCisKK25hbWVzcGFjZSBK
U0MgeyBuYW1lc3BhY2UgQjMgeworCit0ZW1wbGF0ZTx0eXBlbmFtZSBWYWx1ZVR5cGUgdHlwZW5h
bWUuLi4gQXJndW1lbnRzPgorVmFsdWVUeXBlKiBCYXNpY0Jsb2NrOjphcHBlbmROZXcoUHJvY2Vk
dXJlJiBwcm9jZWR1cmUsIEFyZ3VtZW50cy4uLiBhcmd1bWVudHMpCit7CisgICAgVmFsdWVUeXBl
KiByZXN1bHQgPSBwcm9jZWR1cmUuYWRkPFZhbHVlVHlwZT4oYXJndW1lbnRzLi4uKTsKKyAgICBh
cHBlbmQocmVzdWx0KTsKKyAgICByZXR1cm4gcmVzdWx0OworfQorCit1bnNpZ25lZCBCYXNpY0Js
b2NrOjpudW1TdWNjZXNzb3JzKCkgY29uc3QKK3sKKyAgICByZXR1cm4gbGFzdCgpLT5hczxDb250
cm9sVmFsdWU+KCktPm51bVN1Y2Nlc3NvcnMoKTsKK30KKworQmFzaWNCbG9jayogQmFzaWNCbG9j
azo6c3VjY2Vzc29yKHVuc2lnbmVkIGluZGV4KSBjb25zdAoreworICAgIHJldHVybiBsYXN0KCkt
PmFzPENvbnRyb2xWYWx1ZT4oKS0+c3VjY2Vzc29yKGluZGV4KTsKK30KKworQmFzaWNCbG9jayom
IEJhc2ljQmxvY2s6OnN1Y2Nlc3Nvcih1bnNpZ25lZCBpbmRleCkKK3sKKyAgICByZXR1cm4gbGFz
dCgpLT5hczxDb250cm9sVmFsdWU+KCktPnN1Y2Nlc3NvcihpbmRleCk7Cit9CisKK2NvbnN0IEJh
c2ljQmxvY2s6OlN1Y2Nlc3Nvckxpc3QmIEJhc2ljQmxvY2s6OnN1Y2Nlc3NvcnMoKSBjb25zdAor
eworICAgIHJldHVybiBsYXN0KCktPmFzPENvbnRyb2xWYWx1ZT4oKS0+c3VjY2Vzc29ycygpOwor
fQorCit9IH0gLy8gbmFtZXNwYWNlIEpTQzo6QjMKKworI2VuZGlmIC8vIEIzQmFzaWNCbG9ja0lu
bGluZXNfaAorCkluZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNDaGVja1ZhbHVlLmNw
cAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNDaGVja1ZhbHVlLmNw
cAkocmV2aXNpb24gMCkKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM0NoZWNrVmFsdWUu
Y3BwCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsNDEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMp
IDIwMTUgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0
aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAor
ICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2lu
ZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJj
ZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhp
cyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIu
IFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUg
Y29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUg
Zm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBv
dGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRI
SVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQor
ICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1J
VEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5E
IEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElO
IE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUg
Rk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBM
QVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVE
IFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9T
UyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04p
IEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRI
RVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcg
TkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVT
RQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElU
WSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKworI2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUg
IkIzQ2hlY2tWYWx1ZS5oIgorCituYW1lc3BhY2UgSlNDIHsgbmFtZXNwYWNlIEIzIHsKKworQ2hl
Y2tWYWx1ZTo6fkNoZWNrVmFsdWUoKQoreworfQorCit2b2lkIENoZWNrVmFsdWU6OmR1bXBNZXRh
KFByaW50U3RyZWFtJiBvdXQpIGNvbnN0Cit7CisgICAgb3V0LnByaW50KCJzdGFja21hcCA9ICIs
IHN0YWNrbWFwKTsKK30KKworfSB9IC8vIG5hbWVzcGFjZSBKU0M6OkIzCisKSW5kZXg6IFNvdXJj
ZS9KYXZhU2NyaXB0Q29yZS9iMy9CM0NoZWNrVmFsdWUuaAo9PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2Uv
SmF2YVNjcmlwdENvcmUvYjMvQjNDaGVja1ZhbHVlLmgJKHJldmlzaW9uIDApCisrKyBTb3VyY2Uv
SmF2YVNjcmlwdENvcmUvYjMvQjNDaGVja1ZhbHVlLmgJKHdvcmtpbmcgY29weSkKQEAgLTAsMCAr
MSw4MCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNSBBcHBsZSBJbmMuIEFsbCByaWdodHMg
cmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJp
bmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0
ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6Cisg
KiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3Zl
IGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhl
IGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBm
b3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhp
cyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUK
KyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRo
IHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBB
UFBMRSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFO
VElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJS
QU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisg
KiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBP
UgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElO
Q0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdF
UyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJT
VElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJ
VFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBU
SEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJ
TElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJ
U0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVO
IElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLiAKKyAqLworCisj
aWZuZGVmIEIzQ2hlY2tWYWx1ZV9oCisjZGVmaW5lIEIzQ2hlY2tWYWx1ZV9oCisKKyNpbmNsdWRl
ICJCM1ZhbHVlLmgiCisjaW5jbHVkZSAiQjNTdGFja21hcC5oIgorCituYW1lc3BhY2UgSlNDIHsg
bmFtZXNwYWNlIEIzIHsKKworY2xhc3MgQ2hlY2tWYWx1ZSA6IHB1YmxpYyBDaGVjayB7CitwdWJs
aWM6CisgICAgc3RhdGljIGJvb2wgYWNjZXB0cyhPcGNvZGUgb3Bjb2RlKQorICAgIHsKKyAgICAg
ICAgc3dpdGNoIChvcGNvZGUpIHsKKyAgICAgICAgY2FzZSBDaGVja0FkZDoKKyAgICAgICAgY2Fz
ZSBDaGVja1N1YjoKKyAgICAgICAgY2FzZSBDaGVja011bDoKKyAgICAgICAgY2FzZSBDaGVjazoK
KyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAg
cmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgfQorCisgICAgfkNoZWNrVmFsdWUoKTsKKwor
ICAgIFN0YWNrbWFwIHN0YWNrbWFwOworCitwcm90ZWN0ZWQ6CisgICAgdm9pZCBkdW1wTWV0YShQ
cmludFN0cmVhbSYpIGNvbnN0IG92ZXJyaWRlOworCitwcml2YXRlOgorICAgIGZyaWVuZCBjbGFz
cyBQcm9jZWR1cmU7CisKKyAgICAvLyBVc2UgdGhpcyBmb3JtIGZvciBDaGVja0FkZCwgQ2hlY2tT
dWIsIGFuZCBDaGVja011bC4KKyAgICBDaGVja1ZhbHVlKHVuc2lnbmVkIGluZGV4LCBPcGNvZGUg
b3Bjb2RlLCBPcmlnaW4gb3JpZ2luLCBWYWx1ZSogbGVmdCwgVmFsdWUqIHJpZ2h0KQorICAgICAg
ICA6IFZhbHVlKGluZGV4LCBvcGNvZGUsIGxlZnQtPnR5cGUoKSwgb3JpZ2luLCBsZWZ0LCByaWdo
dCkKKyAgICB7CisgICAgICAgIEFTU0VSVChpc0ludCh0eXBlKCkpKTsKKyAgICAgICAgQVNTRVJU
KGxlZnQtPnR5cGUoKSA9PSByaWdodC0+dHlwZSgpKTsKKyAgICAgICAgQVNTRVJUKG9wY29kZSA9
PSBDaGVja0FkZCB8fCBvcGNvZGUgPT0gQ2hlY2tTdWIgfHwgb3Bjb2RlID09IENoZWNrTXVsKTsK
KyAgICB9CisKKyAgICAvLyBVc2UgdGhpcyBmb3JtIGZvciBDaGVjay4KKyAgICBDaGVja1ZhbHVl
KHVuc2lnbmVkIGluZGV4LCBPcGNvZGUgb3Bjb2RlLCBPcmlnaW4gb3JpZ2luLCBWYWx1ZSogcHJl
ZGljYXRlKQorICAgICAgICA6IFZhbHVlKGluZGV4LCBvcGNvZGUsIFZvaWQsIG9yaWdpbiwgcHJl
ZGljYXRlKQorICAgIHsKKyAgICAgICAgQVNTRVJUKG9wY2RlID09IENoZWNrKTsKKyAgICB9Cit9
OworCit9IH0gLy8gbmFtZXNwYWNlIEpTQzo6QjMKKworI2VuZGlmIC8vIEIzQ2hlY2tWYWx1ZV9o
CisKKwpJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzQ29uc3QzMlZhbHVlLmNwcAo9
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNDb25zdDMyVmFsdWUuY3Bw
CShyZXZpc2lvbiAwKQorKysgU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzQ29uc3QzMlZhbHVl
LmNwcAkod29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDQxIEBACisvKgorICogQ29weXJpZ2h0IChD
KSAyMDE1IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1
dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQK
KyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dp
bmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3Vy
Y2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRo
aXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAy
LiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3Zl
IGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhl
IGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Ig
b3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBU
SElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkK
KyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElN
SVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFO
RCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJ
TiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxF
IEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1Q
TEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRF
RCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExP
U1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9O
KSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVU
SEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5H
IE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBV
U0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJ
VFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisKKyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRl
ICJCM0NvbnN0MzJWYWx1ZS5oIgorCituYW1lc3BhY2UgSlNDIHsgbmFtZXNwYWNlIEIzIHsKKwor
Q29uc3QzMlZhbHVlOjp+Q29uc3QzMlZhbHVlKCkKK3sKK30KKwordm9pZCBDb25zdDMyVmFsdWU6
OmR1bXBNZXRhKFByaW50U3RyZWFtJiBvdXQpIGNvbnN0Cit7CisgICAgb3V0LnByaW50KG1fdmFs
dWUpOworfQorCit9IH0gLy8gbmFtZXNwYWNlIEpTQzo6QjMKKwpJbmRleDogU291cmNlL0phdmFT
Y3JpcHRDb3JlL2IzL0IzQ29uc3QzMlZhbHVlLmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL0phdmFT
Y3JpcHRDb3JlL2IzL0IzQ29uc3QzMlZhbHVlLmgJKHJldmlzaW9uIDApCisrKyBTb3VyY2UvSmF2
YVNjcmlwdENvcmUvYjMvQjNDb25zdDMyVmFsdWUuaAkod29ya2luZyBjb3B5KQpAQCAtMCwwICsx
LDU5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE1IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyBy
ZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmlu
YXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRl
ZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAq
IDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUg
Y29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUg
Zm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZv
cm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlz
IGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQor
ICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGgg
dGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQ
UExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5U
SUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJB
TlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAq
IFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9S
CisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5D
SURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VT
IChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNU
SVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklU
UzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRI
RU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklM
SVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklT
SU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4g
SUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisKKyNp
Zm5kZWYgQjNDb25zdDMyVmFsdWVfaAorI2RlZmluZSBCM0NvbnN0MzJWYWx1ZV9oCisKKyNpbmNs
dWRlICJCM1ZhbHVlLmgiCisKK25hbWVzcGFjZSBKU0MgeyBuYW1lc3BhY2UgQjMgeworCitjbGFz
cyBDb25zdDMyVmFsdWUgOiBwdWJsaWMgVmFsdWUgeworcHVibGljOgorICAgIHN0YXRpYyBib29s
IGFjY2VwdHMoT3Bjb2RlIG9wY29kZSkgeyByZXR1cm4gb3Bjb2RlID09IENvbnN0MzI7IH0KKyAg
ICAKKyAgICB+Q29uc3QzMlZhbHVlKCk7CisgICAgCisgICAgaW50MzJfdCB2YWx1ZSgpIGNvbnN0
IHsgcmV0dXJuIG1fdmFsdWU7IH0KKworcHJvdGVjdGVkOgorICAgIHZvaWQgZHVtcE1ldGEoUHJp
bnRTdHJlYW0mKSBjb25zdCBvdmVycmlkZTsKKworcHJpdmF0ZToKKyAgICBmcmllbmQgY2xhc3Mg
UHJvY2VkdXJlOworCisgICAgQ29uc3QzMlZhbHVlKHVuc2lnbmVkIGluZGV4LCBPcmlnaW4gb3Jp
Z2luLCBpbnQzMl90IHZhbHVlKQorICAgICAgICA6IFZhbHVlKGluZGV4LCBDb25zdDMyLCBJbnQz
Miwgb3JpZ2luKQorICAgICAgICAsIG1fdmFsdWUodmFsdWUpCisgICAgeworICAgIH0KKyAgICAK
KyAgICBpbnQzMl90IG1fdmFsdWU7Cit9OworCit9IH0gLy8gbmFtZXNwYWNlIEpTQzo6QjMKKwor
I2VuZGlmIC8vIEIzQ29uc3QzMlZhbHVlX2gKKwpJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3Jl
L2IzL0IzQ29uc3Q2NFZhbHVlLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENv
cmUvYjMvQjNDb25zdDY0VmFsdWUuY3BwCShyZXZpc2lvbiAwKQorKysgU291cmNlL0phdmFTY3Jp
cHRDb3JlL2IzL0IzQ29uc3Q2NFZhbHVlLmNwcAkod29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDQx
IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE1IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNl
cnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5
IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBw
cm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEu
IFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29w
eXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9s
bG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0g
bXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxp
c3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICog
ICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhl
IGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExF
IElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVT
LCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJ
RVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBV
UlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SCisg
KiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURF
TlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJ
TkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRV
VEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsg
T1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9S
WQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZ
LCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5H
IElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYg
QURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisKKyNpbmNs
dWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJCM0NvbnN0NjRWYWx1ZS5oIgorCituYW1lc3BhY2Ug
SlNDIHsgbmFtZXNwYWNlIEIzIHsKKworQ29uc3Q2NFZhbHVlOjp+Q29uc3Q2NFZhbHVlKCkKK3sK
K30KKwordm9pZCBDb25zdDY0VmFsdWU6OmR1bXBNZXRhKFByaW50U3RyZWFtJiBvdXQpIGNvbnN0
Cit7CisgICAgb3V0LnByaW50KG1fdmFsdWUpOworfQorCit9IH0gLy8gbmFtZXNwYWNlIEpTQzo6
QjMKKwpJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzQ29uc3Q2NFZhbHVlLmgKPT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzQ29uc3Q2NFZhbHVlLmgJKHJl
dmlzaW9uIDApCisrKyBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNDb25zdDY0VmFsdWUuaAko
d29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDU5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE1
IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBh
bmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1v
ZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29u
ZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29k
ZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlz
dCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRp
c3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHly
aWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxv
d2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIg
bWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNP
RlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVY
UFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBU
TywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRO
RVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBF
VkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBB
TlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwg
T1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywK
KyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0Yg
VVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dF
VkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElO
IENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJ
R0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAq
IE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0Yg
U1VDSCBEQU1BR0UuIAorICovCisKKyNpZm5kZWYgQjNDb25zdDY0VmFsdWVfaAorI2RlZmluZSBC
M0NvbnN0NjRWYWx1ZV9oCisKKyNpbmNsdWRlICJCM1ZhbHVlLmgiCisKK25hbWVzcGFjZSBKU0Mg
eyBuYW1lc3BhY2UgQjMgeworCitjbGFzcyBDb25zdDY0VmFsdWUgOiBwdWJsaWMgVmFsdWUgewor
cHVibGljOgorICAgIHN0YXRpYyBib29sIGFjY2VwdHMoT3Bjb2RlIG9wY29kZSkgeyByZXR1cm4g
b3Bjb2RlID09IENvbnN0NjQ7IH0KKyAgICAKKyAgICB+Q29uc3Q2NFZhbHVlKCk7CisgICAgCisg
ICAgaW50NjRfdCB2YWx1ZSgpIGNvbnN0IHsgcmV0dXJuIG1fdmFsdWU7IH0KKworcHJvdGVjdGVk
OgorICAgIHZvaWQgZHVtcE1ldGEoUHJpbnRTdHJlYW0mKSBjb25zdCBvdmVycmlkZTsKKworcHJp
dmF0ZToKKyAgICBmcmllbmQgY2xhc3MgUHJvY2VkdXJlOworCisgICAgQ29uc3Q2NFZhbHVlKHVu
c2lnbmVkIGluZGV4LCBPcmlnaW4gb3JpZ2luLCBpbnQ2NF90IHZhbHVlKQorICAgICAgICA6IFZh
bHVlKGluZGV4LCBDb25zdDY0LCBJbnQ2NCwgb3JpZ2luKQorICAgICAgICAsIG1fdmFsdWUodmFs
dWUpCisgICAgeworICAgIH0KKyAgICAKKyAgICBpbnQ2NF90IG1fdmFsdWU7Cit9OworCit9IH0g
Ly8gbmFtZXNwYWNlIEpTQzo6QjMKKworI2VuZGlmIC8vIEIzQ29uc3Q2NFZhbHVlX2gKKwpJbmRl
eDogU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzQ29uc3REb3VibGVWYWx1ZS5jcHAKPT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzQ29uc3REb3VibGVWYWx1ZS5jcHAJ
KHJldmlzaW9uIDApCisrKyBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNDb25zdERvdWJsZVZh
bHVlLmNwcAkod29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDQxIEBACisvKgorICogQ29weXJpZ2h0
IChDKSAyMDE1IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3Ry
aWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhv
dXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xs
b3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBz
b3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2Us
IHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisg
KiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFi
b3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQg
dGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQv
b3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisg
KiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBB
TlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1Qg
TElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZ
IEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQu
ICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElB
QkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVY
RU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElN
SVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7
IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBU
SU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBX
SEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVE
SU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRI
RSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lC
SUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisKKyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNs
dWRlICJCM0NvbnN0RG91YmxlVmFsdWUuaCIKKworbmFtZXNwYWNlIEpTQyB7IG5hbWVzcGFjZSBC
MyB7CisKK0NvbnN0RG91YmxlVmFsdWU6On5Db25zdERvdWJsZVZhbHVlKCkKK3sKK30KKwordm9p
ZCBDb25zdERvdWJsZVZhbHVlOjpkdW1wTWV0YShQcmludFN0cmVhbSYgb3V0KSBjb25zdAorewor
ICAgIG91dC5wcmludGYoIiVsZSIsIG1fdmFsdWUpOworfQorCit9IH0gLy8gbmFtZXNwYWNlIEpT
Qzo6QjMKKwpJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzQ29uc3REb3VibGVWYWx1
ZS5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM0NvbnN0RG91Ymxl
VmFsdWUuaAkocmV2aXNpb24gMCkKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM0NvbnN0
RG91YmxlVmFsdWUuaAkod29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDU5IEBACisvKgorICogQ29w
eXJpZ2h0IChDKSAyMDE1IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBS
ZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9y
IHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRo
ZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9u
cyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBu
b3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWlt
ZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2Ug
dGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9u
cyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlv
biBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4K
KyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycn
IEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJV
VCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRB
QklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NM
QUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMg
QkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwK
KyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBO
T1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VS
VklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5U
RVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklM
SVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAo
SU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VU
IE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUg
UE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisKKyNpZm5kZWYgQjNDb25zdERvdWJs
ZVZhbHVlX2gKKyNkZWZpbmUgQjNDb25zdERvdWJsZVZhbHVlX2gKKworI2luY2x1ZGUgIkIzVmFs
dWUuaCIKKworbmFtZXNwYWNlIEpTQyB7IG5hbWVzcGFjZSBCMyB7CisKK2NsYXNzIENvbnN0RG91
YmxlVmFsdWUgOiBwdWJsaWMgVmFsdWUgeworcHVibGljOgorICAgIHN0YXRpYyBib29sIGFjY2Vw
dHMoT3Bjb2RlIG9wY29kZSkgeyByZXR1cm4gb3Bjb2RlID09IENvbnN0RG91YmxlOyB9CisgICAg
CisgICAgfkNvbnN0RG91YmxlVmFsdWUoKTsKKyAgICAKKyAgICBkb3VibGUgdmFsdWUoKSBjb25z
dCB7IHJldHVybiBtX3ZhbHVlOyB9CisKK3Byb3RlY3RlZDoKKyAgICB2b2lkIGR1bXBNZXRhKFBy
aW50U3RyZWFtJikgY29uc3Qgb3ZlcnJpZGU7CisKK3ByaXZhdGU6CisgICAgZnJpZW5kIGNsYXNz
IFByb2NlZHVyZTsKKworICAgIENvbnN0RG91YmxlVmFsdWUodW5zaWduZWQgaW5kZXgsIE9yaWdp
biBvcmlnaW4sIGRvdWJsZSB2YWx1ZSkKKyAgICAgICAgOiBWYWx1ZShpbmRleCwgQ29uc3REb3Vi
bGUsIERvdWJsZSwgb3JpZ2luKQorICAgICAgICAsIG1fdmFsdWUodmFsdWUpCisgICAgeworICAg
IH0KKyAgICAKKyAgICBkb3VibGUgbV92YWx1ZTsKK307CisKK30gfSAvLyBuYW1lc3BhY2UgSlND
OjpCMworCisjZW5kaWYgLy8gQjNDb25zdERvdWJsZVZhbHVlX2gKKwpJbmRleDogU291cmNlL0ph
dmFTY3JpcHRDb3JlL2IzL0IzQ29udHJvbFZhbHVlLmNwcAo9PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2Uv
SmF2YVNjcmlwdENvcmUvYjMvQjNDb250cm9sVmFsdWUuY3BwCShyZXZpc2lvbiAwKQorKysgU291
cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzQ29udHJvbFZhbHVlLmNwcAkod29ya2luZyBjb3B5KQpA
QCAtMCwwICsxLDQzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE1IEFwcGxlIEluYy4gQWxs
IHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJj
ZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJl
IHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJl
IG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0
aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25z
IGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4g
YmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90
aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVy
IGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3Zp
ZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJ
REVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElF
RCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBM
SUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJ
Q1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBM
RSBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJ
UkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElB
TCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5U
IE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgor
ICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQg
T04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJ
Q1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJX
SVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdB
UkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAor
ICovCisKKyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJCM0NvbnRyb2xWYWx1ZS5oIgor
CituYW1lc3BhY2UgSlNDIHsgbmFtZXNwYWNlIEIzIHsKKworQ29udHJvbFZhbHVlOjp+Q29udHJv
bFZhbHVlKCkKK3sKK30KKwordm9pZCBDb250cm9sVmFsdWU6OmR1bXBNZXRhKFByaW50U3RyZWFt
JiBvdXQpIGNvbnN0Cit7CisgICAgQ29tbWFQcmludGVyIGNvbW1hOworICAgIGZvciAoQmFzaWNC
bG9jayogYmxvY2sgOiBtX3N1Y2Nlc3NvcnMpCisgICAgICAgIG91dC5wcmludChjb21tYSwgcG9p
bnRlckR1bXAoYmxvY2spKTsKK30KKworfSB9IC8vIG5hbWVzcGFjZSBKU0M6OkIzCisKSW5kZXg6
IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM0NvbnRyb2xWYWx1ZS5oCj09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0t
IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM0NvbnRyb2xWYWx1ZS5oCShyZXZpc2lvbiAwKQor
KysgU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzQ29udHJvbFZhbHVlLmgJKHdvcmtpbmcgY29w
eSkKQEAgLTAsMCArMSwxMTAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTUgQXBwbGUgSW5j
LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4g
c291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9u
LCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisg
KiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0
YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRp
dGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9u
cyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAg
ICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2Ns
YWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMg
cHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMg
UFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJ
TVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAq
IElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEg
UEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxM
IEFQUExFIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1Qs
IElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFV
RU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VS
RU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEs
IE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VE
IEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1Qs
IFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBP
VEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBT
T0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFH
RS4gCisgKi8KKworI2lmbmRlZiBCM0NvbnRyb2xWYWx1ZV9oCisjZGVmaW5lIEIzQ29udHJvbFZh
bHVlX2gKKworI2luY2x1ZGUgIkIzVmFsdWUuaCIKKworbmFtZXNwYWNlIEpTQyB7IG5hbWVzcGFj
ZSBCMyB7CisKK2NsYXNzIEJhc2ljQmxvY2s7CisKK2NsYXNzIENvbnRyb2xWYWx1ZSA6IHB1Ymxp
YyBWYWx1ZSB7CitwdWJsaWM6CisgICAgc3RhdGljIGJvb2wgYWNjZXB0cyhPcGNvZGUgb3Bjb2Rl
KQorICAgIHsKKyAgICAgICAgc3dpdGNoIChvcGNvZGUpIHsKKyAgICAgICAgY2FzZSBKdW1wOgor
ICAgICAgICBjYXNlIEJyYW5jaDoKKyAgICAgICAgY2FzZSBSZXR1cm46CisgICAgICAgIGNhc2Ug
T29wczoKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICBjYXNlIFN3aXRjaDogCisg
ICAgICAgICAgICAvLyBUaGlzIGlzIGhlcmUgYmVjYXVzZSBTd2l0Y2hWYWx1ZSBpcyBhIHN1YmNs
YXNzIG9mIENvbnRyb2xWYWx1ZSwgc28gd2Ugd2FudAorICAgICAgICAgICAgLy8gc3d0aWNoVmFs
dWUtPmFzPENvbnRyb2xWYWx1ZT4oKSB0byByZXR1cm4gbm9uLW51bGwuCisgICAgICAgICAgICBy
ZXR1cm4gdHJ1ZTsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsK
KyAgICAgICAgfQorICAgIH0KKworICAgIHR5cGVkZWYgVmVjdG9yPEJhc2ljQmxvY2sqLCAyPiBT
dWNjZXNzb3JMaXN0OworCisgICAgfkNvbnRyb2xWYWx1ZSgpOworCisgICAgdW5zaWduZWQgbnVt
U3VjY2Vzc29ycygpIGNvbnN0IHsgcmV0dXJuIG1fc3VjY2Vzc29ycy5zaXplKCk7IH0KKyAgICBC
YXNpY0Jsb2NrKiBzdWNjZXNzb3IodW5zaWduZWQgaW5kZXgpIGNvbnN0IHsgcmV0dXJuIG1fc3Vj
Y2Vzc29yc1tpXTsgfQorICAgIEJhc2ljQmxvY2sqJiBzdWNjZXNzb3IodW5zaWduZWQgaW5kZXgp
IHsgcmV0dXJuIG1fc3VjY2Vzc29yc1tpXTsgfQorCisgICAgY29uc3QgU3VjY2Vzc29yTGlzdCYg
c3VjY2Vzc29ycygpIGNvbnN0IHsgcmV0dXJuIG1fc3VjY2Vzc29yczsgfQorCitwcm90ZWN0ZWQ6
CisgICAgdm9pZCBkdW1wTWV0YShQcmludFN0cmVhbSYpIGNvbnN0IG92ZXJyaWRlOworCisgICAg
Ly8gVXNlIHRoaXMgZm9yIHN1YmNsYXNzZXMuCisgICAgdGVtcGxhdGU8dHlwZW5hbWUuLi4gQXJn
dW1lbnRzPgorICAgIENvbnRyb2xWYWx1ZSh1bnNpZ25lZCBpbmRleCwgT3Bjb2RlIG9wY29kZSwg
VHlwZSB0eXBlLCBPcmlnaW4gb3JpZ2luLCBBcmd1bWVudHMuLi4gYXJndW1lbnRzKQorICAgICAg
ICA6IFZhbHVlKGluZGV4LCBvcGNvZGUsIHR5cGUsIG9yaWdpbiwgYXJndW1lbnRzLi4uKQorICAg
IHsKKyAgICB9CisKKyAgICAvLyBTdWJjbGFzc2VzIHdpbGwgcG9wdWxhdGUgdGhpcy4KKyAgICBT
dWNjZXNzb3JMaXN0IG1fc3VjY2Vzc29yczsKKworcHJpdmF0ZToKKyAgICBmcmllbmQgY2xhc3Mg
UHJvY2VkdXJlOworCisgICAgLy8gVXNlIHRoaXMgZm9yIFJldHVybiBhbmQgT29wcy4KKyAgICBD
b250cm9sVmFsdWUodW5zaWduZWQgaW5kZXgsIE9wY29kZSBvcGNvZGUsIE9yaWdpbiBvcmlnaW4p
CisgICAgICAgIDogVmFsdWUoaW5kZXgsIG9wY29kZSwgVm9pZCwgb3JpZ2luKQorICAgIHsKKyAg
ICAgICAgQVNTRVJUKG9wY29kZSA9PSBSZXR1cm4gfHwgb3Bjb2RlID09IE9vcHMpOworICAgIH0K
KworICAgIC8vIFVzZSB0aGlzIGZvciBKdW1wLgorICAgIENvbnRyb2xWYWx1ZSh1bnNpZ25lZCBp
bmRleCwgT3Bjb2RlIG9wY29kZSwgT3JpZ2luIG9yaWdpbiwgQmFzaWNCbG9jayogdGFyZ2V0KQor
ICAgICAgICA6IFZhbHVlKGluZGV4LCBvcGNvZGUsIFZvaWQsIG9yaWdpbikKKyAgICB7CisgICAg
ICAgIEFTU0VSVChvcGNvZGUgPT0gSnVtcCk7CisgICAgICAgIG1fc3VjY2Vzc29ycy5hcHBlbmQo
dGFyZ2V0KTsKKyAgICB9CisKKyAgICAvLyBVc2UgdGhpcyBmb3IgQnJhbmNoLgorICAgIENvbnRy
b2xWYWx1ZSgKKyAgICAgICAgdW5zaWduZWQgaW5kZXgsIE9wY29kZSBvcGNvZGUsIE9yaWdpbiBv
cmlnaW4sIFZhbHVlKiBwcmVkaWNhdGUsCisgICAgICAgIEJhc2ljQmxvY2sqIHllcywgQmFzaWNC
bG9jayogbm8pCisgICAgICAgIDogVmFsdWUoaW5kZXgsIG9wY29kZSwgVm9pZCwgb3JpZ2luLCBw
cmVkaWNhdGUpCisgICAgeworICAgICAgICBBU1NFUlQob3Bjb2RlID09IEJyYW5jaCk7CisgICAg
ICAgIG1fc3VjY2Vzc29ycy5hcHBlbmQoeWVzKTsKKyAgICAgICAgbV9zdWNjZXNzb3JzLmFwcGVu
ZChubyk7CisgICAgfQorfTsKKworfSB9IC8vIG5hbWVzcGFjZSBKU0M6OkIzCisKKyNlbmRpZiAv
LyBCM0NvbnRyb2xWYWx1ZV9oCisKSW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM0Vm
ZmVjdGl2ZUFkZHJlc3MucGF0dGVybnMKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRD
b3JlL2IzL0IzRWZmZWN0aXZlQWRkcmVzcy5wYXR0ZXJucwkocmV2aXNpb24gMCkKKysrIFNvdXJj
ZS9KYXZhU2NyaXB0Q29yZS9iMy9CM0VmZmVjdGl2ZUFkZHJlc3MucGF0dGVybnMJKHdvcmtpbmcg
Y29weSkKQEAgLTAsMCArMSwzOCBAQAorIyBDb3B5cmlnaHQgKEMpIDIwMTUgQXBwbGUgSW5jLiBB
bGwgcmlnaHRzIHJlc2VydmVkLgorIworIyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJj
ZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyMgbW9kaWZpY2F0aW9uLCBhcmUg
cGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisjIGFyZSBt
ZXQ6CisjIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUg
YWJvdmUgY29weXJpZ2h0CisjICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5k
IHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyMgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFy
eSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyMgICAgbm90aWNlLCB0
aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRo
ZQorIyAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0
aCB0aGUgZGlzdHJpYnV0aW9uLgorIworIyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQ
UExFIElOQy4gQU5EIElUUyBDT05UUklCVVRPUlMgYGBBUyBJUycnCisjIEFORCBBTlkgRVhQUkVT
UyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAor
IyBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBG
T1IgQSBQQVJUSUNVTEFSCisjIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNI
QUxMIEFQUExFIElOQy4gT1IgSVRTIENPTlRSSUJVVE9SUworIyBCRSBMSUFCTEUgRk9SIEFOWSBE
SVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCisjIENP
TlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NV
UkVNRU5UIE9GCisjIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBE
QVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUworIyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FV
U0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTgorIyBDT05UUkFD
VCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RI
RVJXSVNFKQorIyBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZU
V0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GCisjIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFH
RS4KKworbWF0Y2hlciBFZmZlY3RpdmVBZGRyZXNzCisKKyMgTm90ZSB0aGF0IHRoaXMgcmVsaWVz
IG9uIEIzIGRvaW5nIGFnZ3Jlc3NpdmUgcmVhc3NvY2lhdGlvbiBhbmQgY2Fub25jYWxpemF0aW9u
IG9mIGludGVnZXIgYWRkcy4KKyMgV2UnbGwgbmV2ZXIgc2VlIEFkZChBZGQoJXgsICRjMSksICRj
MikgYmVjYXVzZSBpdCB3b3VsZCBoYXZlIGFscmVhZHkgYmVlbiByZWFzc29jaWF0ZWQgaW50bwor
IyBBZGQoJXgsICRjMSArICRjMikuIEFsc28sIHdlIHdpbGwgbmV2ZXIgc2VlIEFkZCgkYywgJXgp
LCBiZWNhdXNlIHdlIHdvdWxkIGhhdmUgY2Fub25pY2FsaXplZCBpdCB0bworIyBBZGQoJXgsICRj
KS4gVGhhdCBzYWlkLCBpbiB0aGlzIGNvZGUgd2UgbmV2ZXIgbWFrZSBhc3NlcnRpb25zIGFib3V0
IHRoZXNlIG9wdGltaXphdGlvbnMgaGF2aW5nCisjIGJlZW4gcGVyZm9ybWVkLiBBbHNvLCBzaW5j
ZSB0aGUgTG9hZC9TdG9yZSBpbnN0cnVjdGlvbnMgaW4gQjMgaGF2ZSBhIGJ1aWx0LWluIG9mZnNl
dCwgd2UgZG9uJ3QgbmVlZAorIyB0byBtYXRjaCBBZGQoJXgsICRjKS4gVGhhdCB3b3VsZCBoYXZl
IGJlZW4gZm9sZGVkIGludG8gdGhlIExvYWQvU3RvcmUgaW5zdHJ1Y3Rpb25zIGFscmVhZHkuIFNv
LAorIyB0aGlzIGlzIGxlZnQgdG8ganVzdCBtYXRjaGluZyBCYXNlSW5kZXggZm9ybXMuCisKK0Jh
c2VJbmRleCA9IEFkZCglc2hpZnQgPSBTaGwoJWluZGV4LCAkbG9nU2NhbGUpLCAlYmFzZSkKK0Jh
c2VJbmRleCA9IEFkZCglYmFzZSwgJXNoaWZ0ID0gU2hsKCVpbmRleCwgJGxvZ1NjYWxlKSkKKwor
QmFzZU9mZnNldCA9IEFkZCglbGVmdCwgJXJpZ2h0KQorCkluZGV4OiBTb3VyY2UvSmF2YVNjcmlw
dENvcmUvYjMvQjNJbmRleFNldC5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29y
ZS9iMy9CM0luZGV4U2V0LmgJKHJldmlzaW9uIDApCisrKyBTb3VyY2UvSmF2YVNjcmlwdENvcmUv
YjMvQjNJbmRleFNldC5oCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsMTQxIEBACisvKgorICog
Q29weXJpZ2h0IChDKSAyMDE1IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisg
KiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRo
IG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0
IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0
aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAg
ICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2Ns
YWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1
Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0
aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRh
dGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlv
bi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gYGBBUyBJ
UycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcs
IEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hB
TlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJ
U0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SCisgKiBDT05UUklCVVRP
UlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lB
TCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJV
VCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1Ig
U0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1Mg
SU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElB
QklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisg
KiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkg
T1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBU
SEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisKKyNpZm5kZWYgQjNJbmRleFNl
dF9oCisjZGVmaW5lIEIzSW5kZXhTZXRfaAorCisjaW5jbHVkZSA8d3RmL0JpdFZlY3Rvci5oPgor
I2luY2x1ZGUgPHd0Zi9Db21tYVByaW50ZXIuaD4KKworbmFtZXNwYWNlIEpTQyB7IG5hbWVzcGFj
ZSBCMyB7CisKKy8vIFRoaXMgaXMgYSBzZXQgZm9yIHRoaW5ncyB0aGF0IGhhdmUgYW4gaW5kZXgo
KS4gSXQncyBzdXBlciBlZmZpY2llbnQgZm9yIEJhc2ljQmxvY2tzLiBJdCdzIG9ubHkKKy8vIGVm
ZmljaWVudCBmb3IgVmFsdWVzIGlmIHlvdSBkb24ndCBjcmVhdGUgdG9vIG1hbnkgb2YgdGhlc2Ug
c2V0cywgc2luY2UgVmFsdWVzIGNhbiBoYXZlIHZlcnkgc3BhcnNlCisvLyBpbmRpY2VzIGFuZCB0
aGVyZSBhcmUgYSBsb3Qgb2YgVmFsdWVzLgorCisvLyBJZiB5b3Ugd2FudCBhIHNldCBvZiBCYXNp
Y0Jsb2NrcywgeW91IGRvIEluZGV4U2V0PEJhc2ljQmxvY2s+LiBTbywgVCA9IEJhc2ljQmxvY2su
Cit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorY2xhc3MgSW5kZXhTZXQgeworcHVibGljOgorICAgIElu
ZGV4U2V0KCkKKyAgICB7CisgICAgfQorCisgICAgYm9vbCBhZGQoVCogdmFsdWUpCisgICAgewor
ICAgICAgICByZXR1cm4gIW1fc2V0LnNldCh2YWx1ZS0+aW5kZXgoKSk7CisgICAgfQorCisgICAg
Ym9vbCBjb250YWlucyhUKiB2YWx1ZSkgY29uc3QKKyAgICB7CisgICAgICAgIGlmICghdmFsdWUp
CisgICAgICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICAgICAgcmV0dXJuIG1fc2V0LmdldCh2
YWx1ZS0+aW5kZXgoKSk7CisgICAgfQorCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgQ29sbGVjdGlv
blR5cGU+CisgICAgY2xhc3MgSXRlcmFibGUgeworICAgIHB1YmxpYzoKKyAgICAgICAgSXRlcmFi
bGUoY29uc3QgQ29sbGVjdGlvblR5cGUmIGNvbGxlY3Rpb24sIGNvbnN0IEluZGV4U2V0JiBzZXQp
CisgICAgICAgICAgICA6IG1fY29sbGVjdGlvbihjb2xsZWN0aW9uKQorICAgICAgICAgICAgLCBt
X3NldChzZXQpCisgICAgICAgIHsKKyAgICAgICAgfQorCisgICAgICAgIGNsYXNzIGl0ZXJhdG9y
IHsKKyAgICAgICAgcHVibGljOgorICAgICAgICAgICAgaXRlcmF0b3IoKQorICAgICAgICAgICAg
ICAgIDogbV9jb2xsZWN0aW9uKG51bGxwdHIpCisgICAgICAgICAgICB7CisgICAgICAgICAgICB9
CisKKyAgICAgICAgICAgIGl0ZXJhdG9yKGNvbnN0IENvbGxlY3Rpb25UeXBlJiBjb2xsZWN0aW9u
LCBCaXRWZWN0b3I6OlNldEJpdHNJdGVyYWJsZTo6aXRlcmF0b3IgaXRlcikKKyAgICAgICAgICAg
ICAgICA6IG1fY29sbGVjdGlvbigmY29sbGVjdGlvbikKKyAgICAgICAgICAgICAgICAsIG1faXRl
cihpdGVyKQorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBUKiBv
cGVyYXRvciooKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBtX2NvbGxl
Y3Rpb24tPmF0KCptX2l0ZXIpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpdGVyYXRv
ciYgb3BlcmF0b3IrKygpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbV9pdGVyKys7
CisgICAgICAgICAgICAgICAgcmV0dXJuICp0aGlzOworICAgICAgICAgICAgfQorCisgICAgICAg
ICAgICBib29sIG9wZXJhdG9yPT0oY29uc3QgaXRlcmF0b3ImIG90aGVyKSBjb25zdAorICAgICAg
ICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBtX2l0ZXIgPT0gb3RoZXIubV9pdGVyOwor
ICAgICAgICAgICAgfQorCisgICAgICAgICAgICBib29sIG9wZXJhdG9yIT0oY29uc3QgaXRlcmF0
b3ImIG90aGVyKSBjb25zdAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiAh
KCp0aGlzID09IG90aGVyKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICBwcml2YXRlOgorICAg
ICAgICAgICAgY29uc3QgQ29sbGVjdGlvblR5cGUqIG1fY29sbGVjdGlvbjsKKyAgICAgICAgICAg
IEJpdFZlY3Rvcjo6U2V0Qml0c0l0ZXJhYmxlOjppdGVyYXRvciBtX2l0ZXI7CisgICAgICAgIH07
CisKKyAgICAgICAgaXRlcmF0b3IgYmVnaW4oKSBjb25zdCB7IHJldHVybiBpdGVyYXRvcihtX2Nv
bGxlY3Rpb24sIG1fc2V0LmJlZ2luKCkpOyB9CisgICAgICAgIGl0ZXJhdG9yIGVuZCgpIGNvbnN0
IHsgcmV0dXJuIGl0ZXJhdG9yKG1fY29sbGVjdGlvbiwgbV9zZXQuZW5kKCkpOyB9CisKKyAgICBw
cml2YXRlOgorICAgICAgICBjb25zdCBDb2xsZWN0aW9uVHlwZSYgbV9jb2xsZWN0aW9uOworICAg
ICAgICBjb25zdCBJbmRleFNldCYgbV9zZXQ7CisgICAgfTsKKworICAgIC8vIEZvciBiYXNpYyBi
bG9ja3MsIHlvdSBkbzoKKyAgICAvLyBpbmRleFNldC52YWx1ZXMocHJvY2VkdXJlKTsKKyAgICAv
LworICAgIC8vIEZvciB2YWx1ZXMsIHlvdSBkbzoKKyAgICAvLyBpbmRleFNldC52YWx1ZXMocHJv
Y2VkdXJlLnZhbHVlcygpKTsKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBDb2xsZWN0aW9uVHlwZT4K
KyAgICBJdGVyYWJsZTxDb2xsZWN0aW9uVHlwZT4gdmFsdWVzKGNvbnN0IENvbGxlY3Rpb25UeXBl
JiBjb2xsZWN0aW9uKSBjb25zdAorICAgIHsKKyAgICAgICAgcmV0dXJuIEl0ZXJhYmxlPENvbGxl
Y3Rpb25UeXBlPihjb2xsZWN0aW9uKTsKKyAgICB9CisKKyAgICBjb25zdCBCaXRWZWN0b3ImIGlu
ZGljZXMoKSBjb25zdCB7IHJldHVybiBtX3NldDsgfQorCisgICAgdm9pZCBkdW1wKFByaW50U3Ry
ZWFtJiBvdXQpIGNvbnN0CisgICAgeworICAgICAgICBDb21tYVByaW50ZXIgY29tbWE7CisgICAg
ICAgIGZvciAoc2l6ZV90IGluZGV4IDogaW5kaWNlcygpLnNldEJpdHMoKSkKKyAgICAgICAgICAg
IG91dC5wcmludChjb21tYSwgVDo6ZHVtcFByZWZpeCwgaW5kZXgpOworICAgIH0KKworcHJpdmF0
ZToKKyAgICBCaXRWZWN0b3IgbV9zZXQ7Cit9OworCit9IH0gLy8gbmFtZXNwYWNlIEpTQzo6QjMK
KworI2VuZGlmIC8vIEIzSW5kZXhTZXRfaAorCkluZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUv
YjMvQjNNZW1vcnlWYWx1ZS5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRDb3Jl
L2IzL0IzTWVtb3J5VmFsdWUuY3BwCShyZXZpc2lvbiAwKQorKysgU291cmNlL0phdmFTY3JpcHRD
b3JlL2IzL0IzTWVtb3J5VmFsdWUuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsNDIgQEAK
Ky8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTUgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVk
LgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9y
bXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3Zp
ZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVk
aXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmln
aHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dp
bmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0
IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBv
ZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBk
b2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlz
dHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5D
LiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElO
Q0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBP
RiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9T
RSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IKKyAqIENP
TlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFM
LCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xV
RElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBH
T09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBC
VVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisg
KiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9S
IFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4g
QU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJ
U0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKworI2luY2x1ZGUg
ImNvbmZpZy5oIgorI2luY2x1ZGUgIkIzTWVtb3J5VmFsdWUuaCIKKworbmFtZXNwYWNlIEpTQyB7
IG5hbWVzcGFjZSBCMyB7CisKK01lbW9yeVZhbHVlOjp+TWVtb3J5VmFsdWUoKQoreworfQorCit2
b2lkIE1lbW9yeVZhbHVlOjpkdW1wTWV0YShQcmludFN0cmVhbSYgb3V0KSBjb25zdAoreworICAg
IGlmIChtX29mZnNldCkKKyAgICAgICAgb3V0LnByaW50KCJvZmZzZXQgPSAiLCBtX29mZnNldCk7
Cit9CisKK30gfSAvLyBuYW1lc3BhY2UgSlNDOjpCMworCkluZGV4OiBTb3VyY2UvSmF2YVNjcmlw
dENvcmUvYjMvQjNNZW1vcnlWYWx1ZS5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0
Q29yZS9iMy9CM01lbW9yeVZhbHVlLmgJKHJldmlzaW9uIDApCisrKyBTb3VyY2UvSmF2YVNjcmlw
dENvcmUvYjMvQjNNZW1vcnlWYWx1ZS5oCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsMTQyIEBA
CisvKgorICogQ29weXJpZ2h0IChDKSAyMDE1IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZl
ZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZv
cm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92
aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJl
ZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJp
Z2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93
aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVz
dCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qg
b2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAg
ZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRp
c3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElO
Qy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJ
TkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMg
T0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBP
U0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SCisgKiBD
T05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRB
TCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNM
VURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUg
R09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1Ig
QlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQor
ICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBP
UiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElO
IEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURW
SVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisKKyNpZm5kZWYg
QjNNZW1vcnlWYWx1ZV9oCisjZGVmaW5lIEIzTWVtb3J5VmFsdWVfaAorCisjaW5jbHVkZSAiQjNW
YWx1ZS5oIgorCituYW1lc3BhY2UgSlNDIHsgbmFtZXNwYWNlIEIzIHsKKworY2xhc3MgTWVtb3J5
VmFsdWUgOiBwdWJsaWMgVmFsdWUgeworcHVibGljOgorICAgIHN0YXRpYyBib29sIGFjY2VwdHMo
T3Bjb2RlIG9wY29kZSkKKyAgICB7CisgICAgICAgIHN3aXRjaCAob3Bjb2RlKSB7CisgICAgICAg
IGNhc2UgTG9hZDhaOgorICAgICAgICBjYXNlIExvYWQ4UzoKKyAgICAgICAgY2FzZSBMb2FkMTZa
OgorICAgICAgICBjYXNlIExvYWQxNlM6CisgICAgICAgIGNhc2UgTG9hZEZsb2F0OgorICAgICAg
ICBjYXNlIExvYWQ6CisgICAgICAgIGNhc2UgU3RvcmU4OgorICAgICAgICBjYXNlIFN0b3JlMTY6
CisgICAgICAgIGNhc2UgU3RvcmVGbG9hdDoKKyAgICAgICAgY2FzZSBTdG9yZToKKyAgICAgICAg
ICAgIHJldHVybiB0cnVlOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuIGZh
bHNlOworICAgICAgICB9CisgICAgfQorCisgICAgfk1lbW9yeVZhbHVlKCk7CisKKyAgICBpbnRw
dHJfdCBvZmZzZXQoKSBjb25zdCB7IHJldHVybiBtX29mZnNldDsgfQorCitwcm90ZWN0ZWQ6Cisg
ICAgdm9pZCBkdW1wTWV0YShQcmludFN0cmVhbSYpIGNvbnN0IG92ZXJyaWRlOworCitwcml2YXRl
OgorICAgIGZyaWVuZCBjbGFzcyBQcm9jZWR1cmU7CisKKyAgICAvLyBVc2UgdGhpcyBmb3JtIGZv
ciBMb2FkIChidXQgbm90IExvYWQ4WiwgTG9hZDhTLCBvciBhbnkgb2YgdGhlIExvYWRzIHRoYXQg
aGF2ZSBhIHN1ZmZpeCB0aGF0CisgICAgLy8gZGVzY3JpYmVzIHRoZSByZXR1cm5lZCB0eXBlKS4K
KyAgICBNZW1vcnlWYWx1ZSgKKyAgICAgICAgdW5zaWduZWQgaW5kZXgsIE9wY29kZSBvcGNvZGUs
IFR5cGUgdHlwZSwgT3JpZ2luIG9yaWdpbiwgVmFsdWUqIHBvaW50ZXIsCisgICAgICAgIGludHB0
cl90IG9mZnNldCA9IDApCisgICAgICAgIDogVmFsdWUoaW5kZXgsIG9wY29kZSwgdHlwZSwgb3Jp
Z2luLCBwb2ludGVyKQorICAgICAgICAsIG1fb2Zmc2V0KG9mZnNldCkKKyAgICB7CisgICAgICAg
IGlmICghQVNTRVJUX0RJU0FCTEVEKSB7CisgICAgICAgICAgICBzd2l0Y2ggKG9wY29kZSkgewor
ICAgICAgICAgICAgY2FzZSBMb2FkOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAg
ICAgY2FzZSBMb2FkOFo6CisgICAgICAgICAgICBjYXNlIExvYWQ4UzoKKyAgICAgICAgICAgIGNh
c2UgTG9hZDE2WjoKKyAgICAgICAgICAgIGNhc2UgTG9hZDE2UzoKKyAgICAgICAgICAgICAgICBB
U1NFUlQodHlwZSA9PSBJbnQzMik7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAg
ICBjYXNlIExvYWRGbG9hdDoKKyAgICAgICAgICAgICAgICBBU1NFUlQodHlwZSA9PSBEb3VibGUp
OworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBTdG9yZTg6CisgICAg
ICAgICAgICBjYXNlIFN0b3JlMTY6CisgICAgICAgICAgICBjYXNlIFN0b3JlRmxvYXQ6CisgICAg
ICAgICAgICBjYXNlIFN0b3JlOgorICAgICAgICAgICAgICAgIEFTU0VSVCh0eXBlID09IFZvaWQp
OworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAg
ICAgICAgICBBU1NFUlRfTk9UX1JFQUNIRUQoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQor
ICAgIH0KKworICAgIC8vIFVzZSB0aGlzIGZvcm0gZm9yIGxvYWRzIHdoZXJlIHRoZSByZXR1cm4g
dHlwZSBpcyBpbXBsaWVkLgorICAgIE1lbW9yeVZhbHVlKHVuc2lnbmVkIGluZGV4LCBPcGNvZGUg
b3Bjb2RlLCBPcmlnaW4gb3JpZ2luLCBWYWx1ZSogcG9pbnRlciwgaW50cHRyX3Qgb2Zmc2V0ID0g
MCkKKyAgICAgICAgOiBWYWx1ZShpbmRleCwgb3Bjb2RlLCBvcGNvZGUgPT0gTG9hZEZsb2F0ID8g
RG91YmxlIDogSW50MzIsIG9yaWdpbiwgcG9pbnRlcikKKyAgICAgICAgLCBtX29mZnNldChvZmZz
ZXQpCisgICAgeworICAgICAgICBpZiAoIUFTU0VSVF9ESVNBQkxFRCkgeworICAgICAgICAgICAg
c3dpdGNoIChvcGNvZGUpIHsKKyAgICAgICAgICAgIGNhc2UgTG9hZDhaOgorICAgICAgICAgICAg
Y2FzZSBMb2FkOFM6CisgICAgICAgICAgICBjYXNlIExvYWQxNlo6CisgICAgICAgICAgICBjYXNl
IExvYWQxNlM6CisgICAgICAgICAgICBjYXNlIExvYWRGbG9hdDoKKyAgICAgICAgICAgICAgICBi
cmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgQVNTRVJUX05PVF9S
RUFDSEVEKCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAg
IH0KKyAgICB9CisKKyAgICAvLyBVc2UgdGhpcyBmb3JtIGZvciBzdG9yZXMuCisgICAgTWVtb3J5
VmFsdWUoCisgICAgICAgIHVuc2lnbmVkIGluZGV4LCBPcGNvZGUgb3Bjb2RlLCBPcmlnaW4gb3Jp
Z2luLCBWYWx1ZSogdmFsdWUsIFZhbHVlKiBwb2ludGVyLAorICAgICAgICBpbnRwdHJfdCBvZmZz
ZXQgPSAwKQorICAgICAgICA6IFZhbHVlKGluZGV4LCBvcGNvZGUsIFZvaWQsIG9yaWdpbiwgdmFs
dWUsIHBvaW50ZXIpCisgICAgICAgICwgbV9vZmZzZXQob2Zmc2V0KQorICAgIHsKKyAgICAgICAg
aWYgKCFBU1NFUlRfRElTQUJMRUQpIHsKKyAgICAgICAgICAgIHN3aXRjaCAob3Bjb2RlKSB7Cisg
ICAgICAgICAgICBjYXNlIFN0b3JlODoKKyAgICAgICAgICAgIGNhc2UgU3RvcmUxNjoKKyAgICAg
ICAgICAgIGNhc2UgU3RvcmVGbG9hdDoKKyAgICAgICAgICAgIGNhc2UgU3RvcmU6CisgICAgICAg
ICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIEFT
U0VSVF9OT1RfUkVBQ0hFRCgpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAg
fQorICAgICAgICB9CisgICAgfQorfTsKKworfSB9IC8vIG5hbWVzcGFjZSBKU0M6OkIzCisKKyNl
bmRpZiAvLyBCM01lbW9yeVZhbHVlX2gKKwpJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL2Iz
L0IzT3Bjb2RlLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNP
cGNvZGUuY3BwCShyZXZpc2lvbiAwKQorKysgU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzT3Bj
b2RlLmNwcAkod29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDQ3IEBACisvKgorICogQ29weXJpZ2h0
IChDKSAyMDE1IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3Ry
aWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhv
dXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xs
b3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBz
b3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2Us
IHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisg
KiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFi
b3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQg
dGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQv
b3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisg
KiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBB
TlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1Qg
TElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZ
IEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQu
ICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElB
QkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVY
RU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElN
SVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7
IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBU
SU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBX
SEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVE
SU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRI
RSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lC
SUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisKKyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNs
dWRlICJCM09wY29kZS5oIgorCisjaW5jbHVkZSA8d3RmL1ByaW50U3RyZWFtLmg+CisKK25hbWVz
cGFjZSBXVEYgeworCit1c2luZyBuYW1lc3BhY2UgSlNDOjpCMzsKKwordm9pZCBwcmludEludGVy
bmFsKFByaW50U3RyZWFtJiBvdXQsIE9wY29kZSBvcGNvZGUpCit7CisgICAgc3dpdGNoIChvcGNv
ZGUpIHsKKyAgICBjYXNlIElkZW50aXR5OgorICAgICAgICBvdXQucHJpbnQoIklkZW50aXR5Iik7
CisgICAgICAgIHJldHVybjsKKyAgICAgICAgLy8gRklYTUUKKyAgICB9CisgICAgUkVMRUFTRV9B
U1NFUlRfTk9UX1JFQUNIRUQoKTsKK30KKworfSAvLyBuYW1lc3BhY2UgV1RGCisKSW5kZXg6IFNv
dXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM09wY29kZS5oCj09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9K
YXZhU2NyaXB0Q29yZS9iMy9CM09wY29kZS5oCShyZXZpc2lvbiAwKQorKysgU291cmNlL0phdmFT
Y3JpcHRDb3JlL2IzL0IzT3Bjb2RlLmgJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSwyMDMgQEAK
Ky8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTUgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVk
LgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9y
bXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3Zp
ZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVk
aXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmln
aHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dp
bmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0
IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBv
ZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBk
b2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlz
dHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5D
LiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElO
Q0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBP
RiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9T
RSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IKKyAqIENP
TlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFM
LCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xV
RElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBH
T09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBC
VVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisg
KiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9S
IFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4g
QU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJ
U0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKworI2lmbmRlZiBC
M09wY29kZV9oCisjZGVmaW5lIEIzT3Bjb2RlX2gKKworI2luY2x1ZGUgPHd0Zi9TdGRMaWJFeHRy
YXMuaD4KKworbmFtZXNwYWNlIEpTQyB7IG5hbWVzcGFjZSBCMyB7CisKK2VudW0gT3Bjb2RlIDog
aW50MTZfdCB7CisgICAgLy8gQSBuby1vcCB0aGF0IHJldHVybnMgVm9pZCwgdXNlZnVsIGZvciB3
aGVuIHlvdSB3YW50IHRvIHJlbW92ZSBhIHZhbHVlLgorICAgIE5vcCwKKyAgICAgCisgICAgLy8g
UG9seW1vcnBoaWMgaWRlbnRpdHksIHVzYWJsZSB3aXRoIGFueSB2YWx1ZSB0eXBlLgorICAgIElk
ZW50aXR5LAorCisgICAgLy8gQ29uc3RhbnRzLiBVc2UgdGhlIENvbnN0VmFsdWUqIGNsYXNzZXMu
IENvbnN0YW50cyBleGlzdCBpbiB0aGUgY29udHJvbCBmbG93LCBzbyB0aGF0IHdlIGNhbgorICAg
IC8vIHJlYXNvbiBhYm91dCB3aGVyZSB3ZSB3b3VsZCBjb25zdHJ1Y3QgdGhlbS4gTGFyZ2UgY29u
c3RhbnRzIGFyZSBleHBlbnNpdmUgdG8gY3JlYXRlLgorICAgIENvbnN0MzIsCisgICAgQ29uc3Q2
NCwKKyAgICBDb25zdERvdWJsZSwKKworICAgIC8vIFRoZSBtYWdpY2FsIHN0YWNrIHNsb3QuIFRo
aXMgaXMgdmlld2VkIGFzIGV4ZWN1dGluZyBhdCB0aGUgdG9wIG9mIHRoZSBwcm9ncmFtIHJlZ2Fy
ZGxlc3Mgb2YKKyAgICAvLyB3aGVyZSBpbiBjb250cm9sIGZsb3cgeW91IHB1dCBpdC4gRWFjaCBp
bnN0YW5jZSBvZiBhIFN0YWNrU2xvdCBWYWx1ZSBnZXRzIGEgZGlzam9pbnQgcmFuZ2Ugb2YKKyAg
ICAvLyBzdGFjayBtZW1vcnkuIFVzZSB0aGUgU3RhY2tTbG90VmFsdWUgY2xhc3MuCisgICAgU3Rh
Y2tTbG90LAorCisgICAgLy8gVGhlIG1hZ2ljYWwgYXJndW1lbnQgcmVnaXN0ZXIuIFRoaXMgaXMg
dmlld2VkIGFzIGV4ZWN1dGluZyBhdCB0aGUgdG9wIG9mIHRoZSBwcm9ncmFtCisgICAgLy8gcmVn
YXJkbGVzcyBvZiB3aGVyZSBpbiBjb250cm9sIGZsb3cgeW91IHB1dCBpdCwgYW5kIHRoZSBjb21w
aWxlciB0YWtlcyBjYXJlIHRvIGVuc3VyZSB0aGF0IHdlCisgICAgLy8gZG9uJ3QgY2xvYmJlciB0
aGUgdmFsdWUgYnkgcmVnaXN0ZXIgYWxsb2NhdGlvbiBvciBjYWxscyAoZWl0aGVyIGJ5IHNhdmlu
ZyB0aGUgYXJndW1lbnQgdG8gdGhlCisgICAgLy8gc3RhY2sgb3IgcHJlc2VydmluZyBpdCBpbiBh
IGNhbGxlZS1zYXZlIHJlZ2lzdGVyKS4gVXNlIHRoZSBBcmd1bWVudFJlZ1ZhbHVlIGNsYXNzLiBU
aGUgcmV0dXJuCisgICAgLy8gdHlwZSBpcyBlaXRoZXIgcG9pbnRlcigpIChmb3IgR1BScykgb3Ig
RG91YmxlIChmb3IgRlBScykuCisgICAgQXJndW1lbnRSZWcsCisKKyAgICAvLyBUaGUgZnJhbWUg
cG9pbnRlci4gWW91IGNhbiBwdXQgdGhpcyBhbnl3aGVyZSBpbiBjb250cm9sIGZsb3cgYnV0IGl0
IHdpbGwgYWx3YXlzIHlpZWxkIHRoZQorICAgIC8vIGZyYW1lIHBvaW50ZXIsIHdpdGggYSBjYXZl
YXQ6IGlmIG91ciBjb21waWxlciBjaGFuZ2VzIHRoZSBmcmFtZSBwb2ludGVyIHRlbXBvcmFyaWx5
IGZvciBzb21lCisgICAgLy8gc2lsbHkgcmVhc29uLCB0aGUgRnJhbWVQb2ludGVyIGludHJpbnNp
YyB3aWxsIHJldHVybiB3aGVyZSB0aGUgZnJhbWUgcG9pbnRlciAqc2hvdWxkKiBiZSBub3QKKyAg
ICAvLyB3aGVyZSBpdCBoYXBwZW5zIHRvIGJlIHJpZ2h0IG5vdy4KKyAgICBGcmFtZVBvaW50ZXIs
CisKKyAgICAvLyBQb2x5bW9ycGhpYyBtYXRoLCB1c2FibGUgd2l0aCBhbnkgdmFsdWUgdHlwZS4K
KyAgICBBZGQsCisgICAgU3ViLAorICAgIE11bCwKKyAgICBEaXYsCisKKyAgICAvLyBJbnRlZ2Vy
IG1hdGguCisgICAgQ2hpbGxEaXYsIC8vIGRvZXNuJ3QgdHJhcCBldmVyLCBiZWhhdmVzIGxpa2Ug
SlMgKHgveSl8MC4KKyAgICBNb2QsCisgICAgQml0QW5kLAorICAgIEJpdE9yLAorICAgIEJpdFhv
ciwKKyAgICBTaGwsCisgICAgU1NociwKKyAgICBaU2hyLAorCisgICAgLy8gQ2FzdHMgYW5kIHN1
Y2guCisgICAgLy8gVGFrZXMgYW5kIHJldHVybnMgSW50MzI6CisgICAgU0V4dDgsCisgICAgU0V4
dDE2LAorICAgIC8vIFRha2VzIEludDMyIGFuZCByZXR1cm5zIEludDY0OgorICAgIFNFeHQzMiwK
KyAgICBaRXh0MzIsCisgICAgLy8gVGFrZXMgYW5kIHJldHVybnMgRG91YmxlOgorICAgIEZSb3Vu
ZCwKKyAgICAvLyBUYWtlcyBpbnRzIGFuZCByZXR1cm5zIERvdWJsZToKKyAgICBJVG9ELAorICAg
IC8vIFRha2VzIERvdWJsZSBhbmQgcmV0dXJucyBJbnQzMjoKKyAgICBEVG9JMzIsCisKKyAgICAv
LyBQb2x5bW9ycGhpYyBjb21wYXJpc29ucywgdXNhYmxlIHdpdGggYW55IHZhbHVlIHR5cGUuIFJl
dHVybnMgaW50MzIgMCBvciAxLiBOb3RlIHRoYXQgIk5vdCIKKyAgICAvLyBpcyBqdXN0IEVxdWFs
KHgsIDApLgorICAgIEVxdWFsLAorICAgIE5vdEVxdWFsLAorICAgIExlc3NUaGFuLAorICAgIEdy
ZWF0ZXJUaGFuLAorICAgIExlc3NFcXVhbCwKKyAgICBHcmVhdGVyRXF1YWwsCisKKyAgICAvLyBJ
bnRlZ2VyIGNvbXBhcmlzb25zLiBSZXR1cm5zIGludDMyIDAgb3IgMS4KKyAgICBBYm92ZSwKKyAg
ICBCZWxvdywKKyAgICBBYm92ZUVxdWFsCisgICAgQmVsb3dFcXVhbCwKKworICAgIC8vIE1lbW9y
eSBsb2Fkcy4gT3Bjb2RlIGluZGljYXRlcyBob3cgd2UgbG9hZCBhbmQgdGhlIGxvYWRlZCB0eXBl
LiBUaGVzZSB1c2UgTWVtb3J5VmFsdWUuCisgICAgLy8gVGhlc2UgcmV0dXJuIEludDMyOgorICAg
IExvYWQ4WiwKKyAgICBMb2FkOFMsCisgICAgTG9hZDE2WiwKKyAgICBMb2FkMTZTLAorICAgIC8v
IFRoaXMgcmV0dXJucyBEb3VibGU6CisgICAgTG9hZEZsb2F0LAorICAgIC8vIFRoaXMgcmV0dXJu
IHdoYXRldmVyIHRoZSByZXR1cm4gdHlwZSBpczoKKyAgICBMb2FkLAorCisgICAgLy8gTWVtb3J5
IHN0b3Jlcy4gT3Bjb2RlIGluZGljYXRlcyBob3cgdGhlIHZhbHVlIGlzIHN0b3JlZC4gVGhlc2Ug
dXNlIE1lbW9yeVZhbHVlLgorICAgIC8vIFRoZXNlIHRha2UgYW4gSW50MzIgdmFsdWU6CisgICAg
U3RvcmU4LAorICAgIFN0b3JlMTYsCisgICAgLy8gVGhpcyB0YWtlcyBhIERvdWJsZSB2YWx1ZToK
KyAgICBTdG9yZUZsb2F0LAorICAgIC8vIFRoaXMgaXMgYSBwb2x5bW9ycGhpYyBzdG9yZSBmb3Ig
SW50MzIsIEludDY0LCBhbmQgRG91YmxlOgorICAgIFN0b3JlLAorCisgICAgLy8gVGhpcyBpcyBh
IHJlZ3VsYXIgb3JkaW5hcnkgQyBmdW5jdGlvbiBjYWxsLCB1c2luZyB0aGUgc3lzdGVtIEMgY2Fs
bGluZyBjb252ZW50aW9uLiBNYWtlIHN1cmUKKyAgICAvLyB0aGF0IHRoZSBhcmd1bWVudHMgYXJl
IHBhc3NlZCB1c2luZyB0aGUgcmlnaHQgdHlwZXMuCisgICAgQ0NhbGwsCisKKyAgICAvLyBUaGlz
IGlzIGEgcGF0Y2hwb2ludC4gVXNlIHRoZSBQYXRjaHBvaW50VmFsdWUgY2xhc3MuIFRoaXMgaXMg
dmlld2VkIGFzIGJlaGF2aW5nIGxpa2UgYSBjYWxsLAorICAgIC8vIGJ1dCBvbmx5IGVtaXRzIGNv
ZGUgdmlhIGEgY29kZSBnZW5lcmF0aW9uIGNhbGxiYWNrLiBUaGF0IGNhbGxiYWNrIGdldHMgdG8g
ZW1pdCBjb2RlIGlubGluZS4KKyAgICAvLyBZb3UgY2FuIHBhc3MgYSBzdGFja21hcCBhbG9uZyB3
aXRoIGNvbnN0cmFpbnRzIG9uIGhvdyBlYWNoIHN0YWNrbWFwIGFyZ3VtZW50IG11c3QgYmUgcGFz
c2VkLgorICAgIC8vIEl0J3MgbGVnYWwgdG8gcmVxdWVzdCB0aGF0IGEgc3RhY2ttYXAgYXJndW1l
bnQgaXMgaW4gc29tZSByZWdpc3RlciBhbmQgaXQncyBsZWdhbCB0byByZXF1ZXN0CisgICAgLy8g
dGhhdCBhIHN0YWNrbWFwIGFyZ3VtZW50IGlzIGF0IHNvbWUgb2Zmc2V0IGZyb20gdGhlIHRvcCBv
ZiB0aGUgYXJndW1lbnQgcGFzc2luZyBhcmVhIG9uIHRoZQorICAgIC8vIHN0YWNrLgorICAgIFBh
dGNocG9pbnQsCisKKyAgICAvLyBDaGVja2VkIG1hdGguIFVzZSB0aGUgQ2hlY2tWYWx1ZSBjbGFz
cy4gTGlrZSBhIFBhdGNocG9pbnQsIHRoaXMgdGFrZXMgYSBjb2RlIGdlbmVyYXRpb24KKyAgICAv
LyBjYWxsYmFjay4gVGhhdCBjYWxsYmFjayBnZXRzIHRvIGVtaXQgc29tZSBjb2RlIGFmdGVyIHRo
ZSBlcGlsb2d1ZSwgYW5kIGdldHMgdG8gbGluayB0aGUganVtcAorICAgIC8vIGZyb20gdGhlIGNo
ZWNrLCBhbmQgdGhlIGNob2ljZSBvZiByZWdpc3RlcnMuIFlvdSBhbHNvIGdldCB0byBzdXBwbHkg
YSBzdGFja21hcC4gTm90ZSB0aGF0IHlvdQorICAgIC8vIGFyZSBub3QgYWxsb3dlZCB0byBqdW1w
IGJhY2sgaW50byB0aGUgbWFpbmxpbmUgY29kZSBmcm9tIHlvdXIgc2xvdyBwYXRoLCBzaW5jZSB0
aGUgY29tcGlsZXIKKyAgICAvLyB3aWxsIGFzc3VtZSB0aGF0IHRoZSBleGVjdXRpb24gb2YgdGhl
c2UgaW5zdHJ1Y3Rpb25zIHByb3ZlcyB0aGF0IG92ZXJmbG93IGRpZG4ndCBoYXBwZW4uIEZvcgor
ICAgIC8vIGV4YW1wbGUsIGlmIHlvdSBoYXZlIHR3byBDaGVja0FkZCdzOgorICAgIC8vCisgICAg
Ly8gYSA9IENoZWNrQWRkKHgsIHkpCisgICAgLy8gYiA9IENoZWNrQWRkKHgsIHkpCisgICAgLy8K
KyAgICAvLyBUaGVuIGl0J3MgdmFsaWQgdG8gY2hhbmdlIHRoaXMgdG86CisgICAgLy8KKyAgICAv
LyBhID0gQ2hlY2tBZGQoeCwgeSkKKyAgICAvLyBiID0gSWRlbnRpdHkoYSkKKyAgICAvLworICAg
IC8vIFRoaXMgaXMgdmFsaWQgcmVnYXJkbGVzcyBvZiB0aGUgY2FsbGJhY2tzIHVzZWQgYnkgdGhl
IHR3byBDaGVja0FkZHMuIFRoZXkgbWF5IGhhdmUgZGlmZmVyZW50CisgICAgLy8gY2FsbGJhY2tz
LiBZZXQsIHRoaXMgdHJhbnNmb3JtYXRpb24gaXMgdmFsaWQgZXZlbiBpZiB0aGV5IGFyZSBkaWZm
ZXJlbnQgYmVjYXVzZSB3ZSBrbm93IHRoYXQKKyAgICAvLyBhZnRlciB0aGUgZmlyc3QgQ2hlY2tB
ZGQgZXhlY3V0ZXMsIHRoZSBzZWNvbmQgQ2hlY2tBZGQgY291bGQgbm90IGhhdmUgcG9zc2libHkg
dGFrZW4gc2xvdworICAgIC8vIHBhdGguIFRoZXJlZm9yZSwgdGhlIHNlY29uZCBDaGVja0FkZCdz
IGNhbGxiYWNrIGlzIGlycmVsZXZhbnQuCisgICAgQ2hlY2tBZGQsCisgICAgQ2hlY2tTdWIsCisg
ICAgQ2hlY2tNdWwsCisKKyAgICAvLyBDaGVjayB0aGF0IHNpZGUtZXhpdHMuIFVzZSB0aGUgQ2hl
Y2tWYWx1ZSBjbGFzcy4gTGlrZSBDaGVja0FkZCBhbmQgZnJpZW5kcywgdGhpcyBoYXMgYQorICAg
IC8vIHN0YWNrbWFwIHdpdGggYSBnZW5lcmF0aW9uIGNhbGxiYWNrLiBUaGlzIHRha2VzIGFuIElu
dDMyIGFyZ3VtZW50IHRoYXQgdGhpcyBicmFuY2hlcyBvbiwgd2l0aAorICAgIC8vIGZ1bGwgYnJh
bmNoIGZ1c2lvbiBpbiB0aGUgaW5zdHJ1Y3Rpb24gc2VsZWN0b3IuIEEgdHJ1ZSB2YWx1ZSBqdW1w
cyB0byB0aGUgZ2VuZXJhdG9yJ3Mgc2xvdworICAgIC8vIHBhdGguCisgICAgQ2hlY2ssCisKKyAg
ICAvLyBTU0Egc3VwcG9ydCwgaW4gdGhlIHN0eWxlIG9mIERGRyBTU0EuCisgICAgVXBzaWxvbiwg
Ly8gVGhpcyB1c2VzIHRoZSBVcHNpbG9uVmFsdWUgY2xhc3MuCisgICAgUGhpLAorCisgICAgLy8g
SnVtcC4gVXNlcyB0aGUgQ29udHJvbFZhbHVlIGNsYXNzLgorICAgIEp1bXAsCisgICAgCisgICAg
Ly8gUG9seW1vcnBoaWMgYnJhbmNoLCB1c2FibGUgd2l0aCBhbnkgdmFsdWUgdHlwZS4gQnJhbmNo
ZXMgaWYgbm90IGVxdWFsIHRvIHplcm8uIFVzZXMgdGhlCisgICAgLy8gQ29udHJvbFZhbHVlIGNs
YXNzLCB3aXRoIHRoZSAwLWluZGV4IHN1Y2Nlc3NvciBiZWluZyB0aGUgdHJ1ZSBzdWNjZXNzb3Iu
CisgICAgQnJhbmNoLAorCisgICAgLy8gU3dpdGNoLiBTd2l0Y2hlcyBvdmVyIGVpdGhlciBJbnQz
MiBvciBJbnQ2NC4gVXNlcyB0aGUgU3dpdGNoVmFsdWUgY2xhc3MuCisgICAgU3dpdGNoLAorCisg
ICAgLy8gUmV0dXJuLiBOb3RlIHRoYXQgQjMgcHJvY2VkdXJlcyBkb24ndCBrbm93IHRoZWlyIHJl
dHVybiB0eXBlLCBzbyB0aGlzIGNhbiBqdXN0IHJldHVybiBhbnkKKyAgICAvLyB0eXBlLiBVc2Vz
IHRoZSBDb250cm9sVmFsdWUgY2xhc3MuCisgICAgUmV0dXJuLAorCisgICAgLy8gVGhpcyBpcyBh
IHRlcm1pbmFsIHRoYXQgaW5kaWNhdGVzIHRoYXQgd2Ugd2lsbCBuZXZlciBnZXQgaGVyZS4gVXNl
cyB0aGUgQ29udHJvbFZhbHVlIGNsYXNzLgorICAgIE9vcHMKK307CisKK30gfSAvLyBuYW1lc3Bh
Y2UgSlNDOjpCMworCituYW1lc3BhY2UgV1RGIHsKKworY2xhc3MgUHJpbnRTdHJlYW07CisKK3Zv
aWQgcHJpbnRJbnRlcm5hbChQcmludFN0cmVhbSYsIEpTQzo6QjM6Ok9wY29kZSk7CisKK30gLy8g
bmFtZXNwYWNlIFdURgorCisjZW5kaWYgLy8gQjNPcGNvZGVfaAorCkluZGV4OiBTb3VyY2UvSmF2
YVNjcmlwdENvcmUvYjMvQjNPcmlnaW4uY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2Ny
aXB0Q29yZS9iMy9CM09yaWdpbi5jcHAJKHJldmlzaW9uIDApCisrKyBTb3VyY2UvSmF2YVNjcmlw
dENvcmUvYjMvQjNPcmlnaW4uY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsMzcgQEAKKy8q
CisgKiBDb3B5cmlnaHQgKEMpIDIwMTUgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgor
ICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMs
IHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVk
IHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0
cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQK
KyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcg
ZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJl
cHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBj
b25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1
bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJp
YnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBg
YEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xV
RElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBN
RVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBB
UkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IKKyAqIENPTlRS
SUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBT
UEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElO
RywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09E
UyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJ
TkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBP
RiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRP
UlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5Z
IFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VE
IE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKworI2luY2x1ZGUgImNv
bmZpZy5oIgorI2luY2x1ZGUgIkIzT3JpZ2luLmgiCisKK25hbWVzcGFjZSBKU0MgeyBuYW1lc3Bh
Y2UgQjMgeworCit2b2lkIE9yaWdpbjo6ZHVtcChQcmludFN0cmVhbSYgb3V0KSBjb25zdAorewor
ICAgIG91dC5wcmludCgiT3JpZ2luKCIsIFJhd1BvaW50ZXIobV9kYXRhKSwgIikiKTsKK30KKwor
fSB9IC8vIG5hbWVzcGFjZSBKU0M6OkIzCisKSW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9i
My9CM09yaWdpbi5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM09y
aWdpbi5oCShyZXZpc2lvbiAwKQorKysgU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzT3JpZ2lu
LmgJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSw1NSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykg
MjAxNSBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRp
b24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Cisg
KiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5n
IGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNl
IGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlz
IGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4g
UmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBj
b3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBm
b2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90
aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJ
UyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisg
KiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlU
RUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQg
RklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4g
Tk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBG
T1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExB
UlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQg
VE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NT
IE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikg
SE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhF
UiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBO
RUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNF
CisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZ
IE9GIFNVQ0ggREFNQUdFLiAKKyAqLworCisjaWZuZGVmIEIzT3JpZ2luX2gKKyNkZWZpbmUgQjNP
cmlnaW5faAorCisjaW5jbHVkZSA8d3RmL1ByaW50U3RyZWFtLmg+CisKK25hbWVzcGFjZSBKU0Mg
eyBuYW1lc3BhY2UgQjMgeworCisvLyBXaG9ldmVyIGdlbmVyYXRlcyBCM0lSIGNhbiBjaG9vc2Ug
dG8gcHV0IG9yaWdpbnMgb24gdmFsdWVzLiBXaGVuIHlvdSBkbyB0aGlzLCBCMyB3aWxsIGJlIGFi
bGUgdG8KKy8vIGFjY291bnQsIGRvd24gdG8gdGhlIG1hY2hpbmUgY29kZSwgd2hpY2ggaW5zdHJ1
Y3Rpb24gY29ycmVzcG9uZHMgdG8gd2hpY2ggb3JpZ2luLiBCMworLy8gdHJhbnNmb3JtYXRpb25z
IG11c3QgcHJlc2VydmUgT3JpZ2lucyBjYXJlZnVsbHkuIEl0J3MgYW4gZXJyb3IgdG8gd3JpdGUg
YSB0cmFuc2Zvcm1hdGlvbiB0aGF0CisvLyBlaXRoZXIgZHJvcHMgT3JpZ2lucyBvciBsaWVzIGFi
b3V0IHRoZW0uCitjbGFzcyBPcmlnaW4geworcHVibGljOgorICAgIGV4cGxpY2l0IE9yaWdpbihj
b25zdCB2b2lkKiBkYXRhID0gbnVsbHB0cikKKyAgICAgICAgOiBtX2RhdGEoZGF0YSkKKyAgICB7
CisgICAgfQorCisgICAgY29uc3Qgdm9pZCogZGF0YSgpIGNvbnN0IHsgcmV0dXJuIG1fZGF0YTsg
fQorCisgICAgdm9pZCBkdW1wKFByaW50U3RyZWFtJikgY29uc3Q7CisgICAgCitwcml2YXRlOgor
ICAgIGNvbnN0IHZvaWQqIG1fZGF0YTsKK307CisKK30gfSAvLyBuYW1lc3BhY2UgSlNDOjpCMwor
CisjZW5kaWYgLy8gQjNPcmlnaW5faAorCkluZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMv
QjNQYXRjaHBvaW50VmFsdWUuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29y
ZS9iMy9CM1BhdGNocG9pbnRWYWx1ZS5jcHAJKHJldmlzaW9uIDApCisrKyBTb3VyY2UvSmF2YVNj
cmlwdENvcmUvYjMvQjNQYXRjaHBvaW50VmFsdWUuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAg
KzEsNDYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTUgQXBwbGUgSW5jLiBBbGwgcmlnaHRz
IHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBi
aW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0
dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0Ogor
ICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92
ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRo
ZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkg
Zm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRo
aXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhl
CisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0
aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkg
QVBQTEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJB
TlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FS
UkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgor
ICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4g
T1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJ
TkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFH
RVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VC
U1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9G
SVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkg
VEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFC
SUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFS
SVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZF
TiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKwor
I2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgIkIzUGF0Y2hwb2ludFZhbHVlLmgiCisKKyNp
bmNsdWRlIDx3dGYvQ29tbWFQcmludGVyLmg+CisKK25hbWVzcGFjZSBKU0MgeyBuYW1lc3BhY2Ug
QjMgeworCitQYXRjaHBvaW50VmFsdWU6On5QYXRjaHBvaW50VmFsdWUoKQoreworfQorCit2b2lk
IFBhdGNocG9pbnRWYWx1ZTo6ZHVtcE1ldGEoUHJpbnRTdHJlYW0mIG91dCkgY29uc3QKK3sKKyAg
ICBDb21tYVByaW50ZXIgY29tbWE7CisgICAgb3V0LnByaW50KGNvbW1hLCAic3RhY2ttYXAgPSAi
LCBzdGFja21hcCk7CisgICAgaWYgKHNoYWRvdykKKyAgICAgICAgb3V0LnByaW50KGNvbW1hLCAi
c2hhZG93ID0gIiwgc2hhZG93KTsKK30KKworfSB9IC8vIG5hbWVzcGFjZSBKU0M6OkIzCisKSW5k
ZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM1BhdGNocG9pbnRWYWx1ZS5oCj09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM1BhdGNocG9pbnRWYWx1ZS5oCShyZXZp
c2lvbiAwKQorKysgU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzUGF0Y2hwb2ludFZhbHVlLmgJ
KHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSw1OCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAx
NSBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24g
YW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBt
b2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNv
bmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNv
ZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxp
c3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVk
aXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5
cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xs
b3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVy
IG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBT
T0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBF
WFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQg
VE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklU
TkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8g
RVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1Ig
QU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlks
IE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8s
CisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9G
IFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9X
RVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJ
TiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdM
SUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisg
KiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9G
IFNVQ0ggREFNQUdFLiAKKyAqLworCisjaWZuZGVmIEIzUGF0Y2hwb2ludFZhbHVlX2gKKyNkZWZp
bmUgQjNQYXRjaHBvaW50VmFsdWVfaAorCisjaW5jbHVkZSAiQjNWYWx1ZS5oIgorI2luY2x1ZGUg
IkIzU3RhY2ttYXAuaCIKKworbmFtZXNwYWNlIEpTQyB7IG5hbWVzcGFjZSBCMyB7CisKK2NsYXNz
IFBhdGNocG9pbnRWYWx1ZSA6IHB1YmxpYyBWYWx1ZSB7CitwdWJsaWM6CisgICAgc3RhdGljIGJv
b2wgYWNjZXB0cyhPcGNvZGUgb3Bjb2RlKSB7IHJldHVybiBvcGNvZGUgPT0gUGF0Y2hwb2ludDsg
fQorCisgICAgflBhdGNocG9pbnRWYWx1ZSgpOworCisgICAgU3RhY2ttYXAgc3RhY2ttYXA7Cisg
ICAgdW5zaWduZWQgc2hhZG93IHsgMCB9OworCitwcm90ZWN0ZWQ6CisgICAgdm9pZCBkdW1wTWV0
YShQcmludFN0cmVhbSYpIGNvbnN0IG92ZXJyaWRlOworCitwcml2YXRlOgorICAgIGZyaWVuZCBj
bGFzcyBQcm9jZWR1cmU7CisKKyAgICBQYXRjaHBvaW50VmFsdWUodW5zaWduZWQgaW5kZXgsIFR5
cGUgdHlwZSwgT3JpZ2luIG9yaWdpbikKKyAgICAgICAgOiBWYWx1ZShpbmRleCwgUGF0Y2hwb2lu
dCwgdHlwZSwgb3JpZ2luKQorICAgIHsKKyAgICB9Cit9OworCit9IH0gLy8gbmFtZXNwYWNlIEpT
Qzo6QjMKKworI2VuZGlmIC8vIEIzUGF0Y2hwb2ludFZhbHVlX2gKKwpJbmRleDogU291cmNlL0ph
dmFTY3JpcHRDb3JlL2IzL0IzUHJvY2VkdXJlLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2
YVNjcmlwdENvcmUvYjMvQjNQcm9jZWR1cmUuY3BwCShyZXZpc2lvbiAwKQorKysgU291cmNlL0ph
dmFTY3JpcHRDb3JlL2IzL0IzUHJvY2VkdXJlLmNwcAkod29ya2luZyBjb3B5KQpAQCAtMCwwICsx
LDU2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE1IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyBy
ZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmlu
YXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRl
ZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAq
IDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUg
Y29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUg
Zm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZv
cm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlz
IGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQor
ICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGgg
dGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQ
UExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5U
SUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJB
TlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAq
IFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9S
CisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5D
SURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VT
IChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNU
SVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklU
UzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRI
RU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklM
SVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklT
SU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4g
SUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisKKyNp
bmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJCM1Byb2NlZHVyZS5oIgorCisjaW5jbHVkZSAi
QjNCYXNpY0Jsb2NrLmgiCisjaW5jbHVkZSAiQjNWYWx1ZS5oIgorCituYW1lc3BhY2UgSlNDIHsg
bmFtZXNwYWNlIEIzIHsKKworUHJvY2VkdXJlOjpQcm9jZWR1cmUoKQoreworfQorCitQcm9jZWR1
cmU6On5Qcm9jZWR1cmUoKQoreworfQorCitCYXNpY0Jsb2NrKiBQcm9jZWR1cmU6OmFkZEJsb2Nr
KCkKK3sKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8QmFzaWNCbG9jaz4gYmxvY2sgPSBzdGQ6Om1ha2Vf
dW5pcXVlPEJhc2ljQmxvY2s+KG1fYmxvY2tzLnNpemUoKSk7CisgICAgQmFzaWNCbG9jayogcmVz
dWx0ID0gYmxvY2suZ2V0KCk7CisgICAgbV9ibG9ja3MuYXBwZW5kKFdURjo6bW92ZShibG9jaykp
OworICAgIHJldHVybiByZXN1bHQ7Cit9CisKK3ZvaWQgUHJvY2VkdXJlOjpkdW1wKFByaW50U3Ry
ZWFtJiBvdXQpIGNvbnN0Cit7CisgICAgZm9yIChCYXNpY0Jsb2NrKiBibG9jayA6ICp0aGlzKQor
ICAgICAgICBvdXQucHJpbnQoZGVlcER1bXAoYmxvY2spKTsKK30KKworfSB9IC8vIG5hbWVzcGFj
ZSBKU0M6OkIzCkluZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNQcm9jZWR1cmUuaAo9
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNQcm9jZWR1cmUuaAkocmV2
aXNpb24gMCkKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM1Byb2NlZHVyZS5oCSh3b3Jr
aW5nIGNvcHkpCkBAIC0wLDAgKzEsMTc3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE1IEFw
cGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQg
dXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlm
aWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0
aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBt
dXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBv
ZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3Ry
aWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdo
dAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2lu
ZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0
ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRX
QVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJF
U1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywg
VEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNT
IEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVO
VCBTSEFMTCBBUFBMRSBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkg
RElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1Ig
Q09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAq
IFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNF
LCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVS
IENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENP
TlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VO
Q0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9G
IFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VD
SCBEQU1BR0UuIAorICovCisKKyNpZm5kZWYgQjNQcm9jZWR1cmVfaAorI2RlZmluZSBCM1Byb2Nl
ZHVyZV9oCisKKyNpbmNsdWRlIDx3dGYvQmFnLmg+CisjaW5jbHVkZSA8d3RmL0Zhc3RNYWxsb2Mu
aD4KKyNpbmNsdWRlIDx3dGYvTm9uY29weWFibGUuaD4KKyNpbmNsdWRlIDx3dGYvVmVjdG9yLmg+
CisKK25hbWVzcGFjZSBKU0MgeyBuYW1lc3BhY2UgQjMgeworCitjbGFzcyBCYXNpY0Jsb2NrOwor
Y2xhc3MgVmFsdWU7CisKK2NsYXNzIFByb2NlZHVyZSB7CisgICAgV1RGX01BS0VfTk9OQ09QWUFC
TEUoUHJvY2VkdXJlKTsKKyAgICBXVEZfTUFLRV9GQVNUX0FMTE9DQVRFRDsKK3B1YmxpYzoKKwor
ICAgIFByb2NlZHVyZSgpOworICAgIH5Qcm9jZWR1cmUoKTsKKworICAgIEJhc2ljQmxvY2sqIGFk
ZEJsb2NrKCk7CisgICAgCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVmFsdWVUeXBlLCB0eXBlbmFt
ZS4uLiBBcmd1bWVudHM+CisgICAgVmFsdWVUeXBlKiBhZGQoQXJndW1lbnRzLi4uKTsKKworICAg
IHZvaWQgZHVtcChQcmludFN0cmVhbSYpIGNvbnN0OworCisgICAgdW5zaWduZWQgc2l6ZSgpIGNv
bnN0IHsgcmV0dXJuIG1fYmxvY2tzLnNpemUoKTsgfQorICAgIEJhc2ljQmxvY2sqIGF0KHVuc2ln
bmVkIGluZGV4KSBjb25zdCB7IHJldHVybiBtX2Jsb2Nrc1tpbmRleF07IH0KKyAgICBCYXNpY0Js
b2NrKiBvcGVyYXRvcltdKHVuc2lnbmVkIGluZGV4KSBjb25zdCB7IHJldHVybiBhdChpbmRleCk7
IH0KKworICAgIGNsYXNzIGl0ZXJhdG9yIHsKKyAgICBwdWJsaWM6CisgICAgICAgIGl0ZXJhdG9y
KCk6CisgICAgICAgICAgICA6IG1fcHJvY2VkdXJlKG51bGxwdHIpCisgICAgICAgICAgICAsIG1f
aW5kZXgoMCkKKyAgICAgICAgeworICAgICAgICB9CisKKyAgICAgICAgaXRlcmF0b3IoUHJvY2Vk
dXJlJiBwcm9jZWR1cmUsIHVuc2lnbmVkIGluZGV4KQorICAgICAgICAgICAgOiBtX3Byb2NlZHVy
ZSgmcHJvY2VkdXJlKQorICAgICAgICAgICAgLCBtX2luZGV4KGluZGV4KQorICAgICAgICB7Cisg
ICAgICAgIH0KKworICAgICAgICBCYXNpY0Jsb2NrKiBvcGVyYXRvciooKQorICAgICAgICB7Cisg
ICAgICAgICAgICByZXR1cm4gbV9wcm9jZWR1cmUtPmF0KG1faW5kZXgpOworICAgICAgICB9CisK
KyAgICAgICAgaXRlcmF0b3ImIG9wZXJhdG9yKysoKQorICAgICAgICB7CisgICAgICAgICAgICBt
X2luZGV4ID0gZmluZE5leHQobV9pbmRleCArIDEpOworICAgICAgICAgICAgcmV0dXJuICp0aGlz
OworICAgICAgICB9CisKKyAgICAgICAgYm9vbCBvcGVyYXRvcj09KGNvbnN0IGl0ZXJhdG9yJiBv
dGhlcikgY29uc3QKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIG1faW5kZXggPT0gb3Ro
ZXIubV9pbmRleDsKKyAgICAgICAgfQorCisgICAgICAgIGJvb2wgb3BlcmF0b3IhPShjb25zdCBp
dGVyYXRvciYgb3RoZXIpIGNvbnN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiAhKCp0
aGlzID09IG90aGVyKTsKKyAgICAgICAgfQorCisgICAgcHJpdmF0ZToKKyAgICAgICAgdW5zaWdu
ZWQgZmluZE5leHQodW5zaWduZWQgaW5kZXgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHdoaWxl
IChpbmRleCA8IG1fcHJvY2VkdXJlLT5zaXplKCkgJiYgIW1fcHJvY2VkdXJlLT5hdChpbmRleCkp
CisgICAgICAgICAgICAgICAgaW5kZXgrKzsKKyAgICAgICAgICAgIHJldHVybiBpbmV4OworICAg
ICAgICB9CisKKyAgICAgICAgUHJvY2VkdXJlKiBtX3Byb2NlZHVyZTsKKyAgICAgICAgdW5zaWdu
ZWQgbV9pbmRleDsKKyAgICB9OworCisgICAgaXRlcmF0b3IgYmVnaW4oKSBjb25zdCB7IHJldHVy
biBpdGVyYXRvcigqdGhpcywgMCk7IH0KKyAgICBpdGVyYXRvciBlbmQoKSBjb25zdCB7IHJldHVy
biBpdGVyYXRvcigqdGhpcywgbnVtQmxvY2tzKCkpOyB9CisKKyAgICBjbGFzcyBWYWx1ZXNDb2xs
ZWN0aW9uIHsKKyAgICBwdWJsaWM6CisgICAgICAgIFZhbHVlc0NvbGxlY3Rpb24oUHJvY2VkdXJl
JiBwcm9jZWR1cmUpCisgICAgICAgICAgICA6IG1fcHJvY2VkdXJlKHByb2NlZHVyZSkKKyAgICAg
ICAgeworICAgICAgICB9CisKKyAgICAgICAgY2xhc3MgaXRlcmF0b3IgeworICAgICAgICBwdWJs
aWM6CisgICAgICAgICAgICBpdGVyYXRvcigpOgorICAgICAgICAgICAgICAgIDogbV9wcm9jZWR1
cmUobnVsbHB0cikKKyAgICAgICAgICAgICAgICAsIG1faW5kZXgoMCkKKyAgICAgICAgICAgIHsK
KyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaXRlcmF0b3IoUHJvY2VkdXJlJiBwcm9jZWR1
cmUsIHVuc2lnbmVkIGluZGV4KQorICAgICAgICAgICAgICAgIDogbV9wcm9jZWR1cmUoJnByb2Nl
ZHVyZSkKKyAgICAgICAgICAgICAgICAsIG1faW5kZXgoaW5kZXgpCisgICAgICAgICAgICB7Cisg
ICAgICAgICAgICB9CisKKyAgICAgICAgICAgIFZhbHVlKiBvcGVyYXRvciooKQorICAgICAgICAg
ICAgeworICAgICAgICAgICAgICAgIHJldHVybiBtX3Byb2NlZHVyZS0+YmxvY2sobV9pbmRleCk7
CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGl0ZXJhdG9yJiBvcGVyYXRvcisrKCkKKyAg
ICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtX2luZGV4Kys7CisgICAgICAgICAgICAgICAg
cmV0dXJuICp0aGlzOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBib29sIG9wZXJhdG9y
PT0oY29uc3QgaXRlcmF0b3ImIG90aGVyKSBjb25zdAorICAgICAgICAgICAgeworICAgICAgICAg
ICAgICAgIHJldHVybiBtX2luZGV4ID09IG90aGVyLm1faW5kZXg7CisgICAgICAgICAgICB9CisK
KyAgICAgICAgICAgIGJvb2wgb3BlcmF0b3IhPShjb25zdCBpdGVyYXRvciYgb3RoZXIpIGNvbnN0
CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuICEoKnRoaXMgPT0gb3RoZXIp
OworICAgICAgICAgICAgfQorCisgICAgICAgIHByaXZhdGU6CisKKyAgICAgICAgICAgIFByb2Nl
ZHVyZSogbV9wcm9jZWR1cmU7CisgICAgICAgICAgICB1bnNpZ25lZCBtX2luZGV4OworICAgICAg
ICB9OworCisgICAgICAgIGl0ZXJhdG9yIGJlZ2luKCkgY29uc3QgeyByZXR1cm4gaXRlcmF0b3Io
bV9wcm9jZWR1cmUsIDApOyB9CisgICAgICAgIGl0ZXJhdG9yIGVuZCgpIGNvbnN0IHsgcmV0dXJu
IGl0ZXJhdG9yKG1fcHJvY2VkdXJlLCBtX3Byb2NlZHVyZS5tX3ZhbHVlcy5zaXplKCkpOyB9CisK
KyAgICAgICAgdW5zaWduZWQgc2l6ZSgpIGNvbnN0IHsgcmV0dXJuIG1fcHJvY2VkdXJlLm1fdmFs
dWVzLnNpemUoKTsgfQorICAgICAgICBWYWx1ZSogYXQodW5zaWduZWQgaW5kZXgpIGNvbnN0IHsg
cmV0dXJuIG1fcHJvY2VkdXJlLm1fdmFsdWVzW2luZGV4XTsgfQorICAgICAgICBWYWx1ZSogb3Bl
cmF0b3JbXSh1bnNpZ25lZCBpbmRleCkgY29uc3QgeyByZXR1cm4gYXQoaW5kZXgpOyB9CisgICAg
ICAgIAorICAgIHByaXZhdGU6CisgICAgICAgIFByb2NlZHVyZSYgbV9wcm9jZWR1cmU7CisgICAg
fTsKKworICAgIFZhbHVlc0NvbGxlY3Rpb24gdmFsdWVzKCkgeyByZXR1cm4gVmFsdWVzQ29sbGVj
dGlvbigqdGhpcyk7IH0KKworcHJpdmF0ZToKKyAgICBWZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEJh
c2ljQmxvY2s+PiBtX2Jsb2NrczsKKyAgICBWZWN0b3I8c3RkOjp1bmlxdWVfcHRyPFZhbHVlPj4g
bV92YWx1ZXM7Cit9OworCit9IH0gLy8gbmFtZXNwYWNlIEpTQzo6QjMKKworI2VuZGlmIC8vIEIz
UHJvY2VkdXJlX2gKKwpJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzUHJvY2VkdXJl
SW5saW5lcy5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM1Byb2Nl
ZHVyZUlubGluZXMuaAkocmV2aXNpb24gMCkKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9C
M1Byb2NlZHVyZUlubGluZXMuaAkod29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDQ2IEBACisvKgor
ICogQ29weXJpZ2h0IChDKSAyMDE1IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAq
CisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3
aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0
aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJp
YnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Cisg
KiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRp
c2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXBy
b2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29u
ZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1l
bnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1
dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gYGBB
UyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJ
TkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVS
Q0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJF
IERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SCisgKiBDT05UUklC
VVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BF
Q0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcs
IEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMg
T1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5F
U1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0Yg
TElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JU
CisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBX
QVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBP
RiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisKKyNpZm5kZWYgQjNQcm9j
ZWR1cmVJbmxpbmVzX2gKKyNkZWZpbmUgQjNQcm9jZWR1cmVJbmxpbmVzX2gKKworI2luY2x1ZGUg
IkIzQmFzaWNCbG9jay5oIgorI2luY2x1ZGUgIkIzUHJvY2VkdXJlLmgiCisKK25hbWVzcGFjZSBK
U0MgeyBuYW1lc3BhY2UgQjMgeworCit0ZW1wbGF0ZTx0eXBlbmFtZSBWYWx1ZVR5cGUsIHR5cGVu
YW1lLi4uIEFyZ3VtZW50cz4KK1ZhbHVlVHlwZSogUHJvY2VkdXJlOjphZGQoQXJndWVudHMuLi4g
YXJndW1lbnRzKQoreworICAgIHN0ZDo6dW5pcXVlX3B0cjxWYWx1ZVR5cGU+IHZhbHVlKG5ldyBW
YWx1ZVR5cGUobV92YWx1ZXMuc2l6ZSgpLCBhcmd1bWVudHMuLi4pKTsKKyAgICBWYWx1ZVR5cGUq
IHJlc3VsdCA9IHZhbHVlLmdldCgpOworICAgIG1fdmFsdWVzLmFwcGVuZChXVEY6Om1vdmUodmFs
dWUpKTsKKyAgICByZXR1cm4gcmVzdWx0OworfQorCit9IH0gLy8gbmFtZXNwYWNlIEpTQzo6QjMK
KworI2VuZGlmIC8vIEIzUHJvY2VkdXJlSW5saW5lc19oCisKSW5kZXg6IFNvdXJjZS9KYXZhU2Ny
aXB0Q29yZS9iMy9CM1N0YWNrU2xvdFZhbHVlLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2
YVNjcmlwdENvcmUvYjMvQjNTdGFja1Nsb3RWYWx1ZS5jcHAJKHJldmlzaW9uIDApCisrKyBTb3Vy
Y2UvSmF2YVNjcmlwdENvcmUvYjMvQjNTdGFja1Nsb3RWYWx1ZS5jcHAJKHdvcmtpbmcgY29weSkK
QEAgLTAsMCArMSw0MSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNSBBcHBsZSBJbmMuIEFs
bCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3Vy
Y2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFy
ZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFy
ZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4g
dGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9u
cyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGlu
IGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5v
dGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1l
ciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92
aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9W
SURFRCBCWSBBUFBMRSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJ
RUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1Q
TElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJU
SUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQ
TEUgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5E
SVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJ
QUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVO
VCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IK
KyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5E
IE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RS
SUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVS
V0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRX
QVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLiAK
KyAqLworCisjaW5jbHVkZSAiY29uZmlnLmgiCisjaW5jbHVkZSAiQjNTdGFja1Nsb3RWYWx1ZS5o
IgorCituYW1lc3BhY2UgSlNDIHsgbmFtZXNwYWNlIEIzIHsKKworU3RhY2tTbG90VmFsdWU6On5T
dGFja1Nsb3RWYWx1ZSgpCit7Cit9CisKK3ZvaWQgU3RhY2tTbG90VmFsdWU6OmR1bXBNZXRhKFBy
aW50U3RyZWFtJiBvdXQpIGNvbnN0Cit7CisgICAgb3V0LnByaW50KCJieXRlU2l6ZSA9ICIsIG1f
Ynl0ZVNpemUpOworfQorCit9IH0gLy8gbmFtZXNwYWNlIEpTQzo6QjMKKwpJbmRleDogU291cmNl
L0phdmFTY3JpcHRDb3JlL2IzL0IzU3RhY2tTbG90VmFsdWUuaAo9PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3Vy
Y2UvSmF2YVNjcmlwdENvcmUvYjMvQjNTdGFja1Nsb3RWYWx1ZS5oCShyZXZpc2lvbiAwKQorKysg
U291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzU3RhY2tTbG90VmFsdWUuaAkod29ya2luZyBjb3B5
KQpAQCAtMCwwICsxLDY1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE1IEFwcGxlIEluYy4g
QWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNv
dXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwg
YXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICog
YXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFp
biB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRp
b25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMg
aW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAg
bm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFp
bWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHBy
b3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBS
T1ZJREVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1Q
TElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJ
TVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBB
UlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBB
UFBMRSBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJ
TkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVO
VElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVN
RU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBP
UgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBB
TkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBT
VFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RI
RVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09G
VFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0Uu
IAorICovCisKKyNpZm5kZWYgQjNTdGFja1Nsb3RWYWx1ZV9oCisjZGVmaW5lIEIzU3RhY2tTbG90
VmFsdWVfaAorCisjaW5jbHVkZSAiQjNWYWx1ZS5oIgorCituYW1lc3BhY2UgSlNDIHsgbmFtZXNw
YWNlIEIzIHsKKworY2xhc3MgU3RhY2tTbG90VmFsdWUgOiBwdWJsaWMgVmFsdWUgeworcHVibGlj
OgorICAgIHN0YXRpYyBib29sIGFjY2VwdHMoT3Bjb2RlIG9wY29kZSkgeyByZXR1cm4gb3Bjb2Rl
ID09IFN0YWNrU2xvdDsgfQorCisgICAgflN0YWNrU2xvdFZhbHVlKCk7CisKKyAgICB1bnNpZ25l
ZCBieXRlU2l6ZSgpIGNvbnN0IHsgcmV0dXJuIG1fYnl0ZVNpemU7IH0KKworICAgIC8vIFRoaXMg
Z2V0cyBhc3NpZ25lZCBhdCB0aGUgZW5kIG9mIGNvbXBpbGF0aW9uLiBZb3UgY2Fubm90IHJlbHkg
b24gaXQgaGF2aW5nIGEgbWVhbmluZ2Z1bAorICAgIC8vIHZhbHVlIHdoaWxlIHRoZSBjb21waWxl
ciBpcyBydW5uaW5nLgorICAgIGludHB0cl90IG9mZnNldEZyb21GUCgpIGNvbnN0IHsgcmV0dXJu
IG1fb2Zmc2V0RnJvbUZQOyB9CisKK3Byb3RlY3RlZDoKKyAgICB2b2lkIGR1bXBNZXRhKFByaW50
U3RyZWFtJikgY29uc3Qgb3ZlcnJpZGU7CisKK3ByaXZhdGU6CisgICAgZnJpZW5kIGNsYXNzIFBy
b2NlZHVyZTsKKworICAgIFN0YWNrU2xvdFZhbHVlKHVuc2lnbmVkIGluZGV4LCBPcmlnaW4gb3Jp
Z2luLCB1bnNpZ25lZCBieXRlU2l6ZSkKKyAgICAgICAgOiBWYWx1ZShpbmRleCwgU3RhY2tTbG90
LCBwb2ludGVyKCksIG9yaWdpbikKKyAgICAgICAgLCBtX2J5dGVTaXplKGJ5dGVTaXplKQorICAg
ICAgICAsIG1fb2Zmc2V0RnJvbUZQKDApCisgICAgeworICAgIH0KKworICAgIHVuc2lnbmVkIG1f
Ynl0ZVNpemU7CisgICAgaW50cHRyX3QgbV9vZmZzZXRGcm9tRlA7Cit9OworCit9IH0gLy8gbmFt
ZXNwYWNlIEpTQzo6QjMKKworI2VuZGlmIC8vIEIzU3RhY2tTbG90VmFsdWVfaAorCkluZGV4OiBT
b3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNTdGFja21hcC5jcHAKPT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291
cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzU3RhY2ttYXAuY3BwCShyZXZpc2lvbiAwKQorKysgU291
cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzU3RhY2ttYXAuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0w
LDAgKzEsNDAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTUgQXBwbGUgSW5jLiBBbGwgcmln
aHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFu
ZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVy
bWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0
OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBh
Ym92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5k
IHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5h
cnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2Us
IHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4g
dGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQg
d2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQg
QlkgQVBQTEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdB
UlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQg
V0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxB
UgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElO
Qy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNU
LCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERB
TUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0Yg
U1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQ
Uk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBB
TlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBM
SUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0Up
IEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwg
RVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8K
KworI2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgIkIzU3RhY2ttYXAuaCIKKworbmFtZXNw
YWNlIEpTQyB7IG5hbWVzcGFjZSBCMyB7CisKK3ZvaWQgU3RhY2ttYXA6OmR1bXAoUHJpbnRTdHJl
YW0mIG91dCkgY29uc3QKK3sKKyAgICBvdXQucHJpbnQoCisgICAgICAgICJ7b3BhcXVlID0gIiwg
UmF3UG9pbnRlcihtX29wYXF1ZSksICIsIHJlcHMgPSAiLCBsaXN0RHVtcChtX3JlcHMpLAorICAg
ICAgICAiLCBnZW5lcmF0b3IgPSAiLCBSYXdQb2ludGVyKG1fZ2VuZXJhdG9yLmdldCgpKSwgIiwg
Y2xvYmJlcmVkID0gIiwgbV9jbG9iYmVyZWQsCisgICAgICAgICIsIHVzZWRSZWdpc3RlcnMgPSAi
LCBtX3VzZWRSZWdpc3RlcnMsICJ9Iik7Cit9CisKK30gfSAvLyBuYW1lc3BhY2UgSlNDOjpCMwor
CkluZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNTdGFja21hcC5oCj09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0K
LS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM1N0YWNrbWFwLmgJKHJldmlzaW9uIDApCisr
KyBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNTdGFja21hcC5oCSh3b3JraW5nIGNvcHkpCkBA
IC0wLDAgKzEsMTIwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE1IEFwcGxlIEluYy4gQWxs
IHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJj
ZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJl
IHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJl
IG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0
aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25z
IGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4g
YmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90
aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVy
IGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3Zp
ZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJ
REVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElF
RCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBM
SUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJ
Q1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBM
RSBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJ
UkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElB
TCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5U
IE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgor
ICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQg
T04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJ
Q1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJX
SVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdB
UkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAor
ICovCisKKyNpZm5kZWYgQjNTdGFja21hcF9oCisjZGVmaW5lIEIzU3RhY2ttYXBfaAorCisjaW5j
bHVkZSAiQjNWYWx1ZVJlcC5oIgorI2luY2x1ZGUgIkNDYWxsSGVscGVycy5oIgorI2luY2x1ZGUg
IlJlZ2lzdGVyU2V0LmgiCisjaW5jbHVkZSA8d3RmL1NoYXJlZFRhc2suaD4KKworbmFtZXNwYWNl
IEpTQyB7IG5hbWVzcGFjZSBCMyB7CisKK2NsYXNzIEIzVmFsdWU7CisKK2NsYXNzIFN0YWNrbWFw
IHsKK3B1YmxpYzoKKyAgICBzdHJ1Y3QgR2VuZXJhdGlvblBhcmFtcyB7CisgICAgICAgIC8vIFRo
aXMgaXMgdGhlIFZhbHVlIGNvbnRhaW5pbmcgdGhlIHN0YWNrbWFwLgorICAgICAgICBWYWx1ZSog
dmFsdWU7CisKKyAgICAgICAgLy8gVGhpcyBpcyB0aGUgc3RhY2ttYXAuCisgICAgICAgIFN0YWNr
bWFwKiBzdGFja21hcDsKKworICAgICAgICAvLyBUaGlzIGlzIHRoZSBqdW1wIHRvIHRoZSBzbG93
IHBhdGgsIGlmIHRoaXMgaXMgYSBzdGFja21hcCBmb3IgYSBDaGVjayB2YWx1ZS4KKyAgICAgICAg
Q0NhbGxIZWxwZXJzOjpKdW1wIGp1bXA7CisgICAgfTsKKyAgICAKKyAgICB0eXBlZGVmIHZvaWQg
R2VuZXJhdG9yRnVuY3Rpb24oQ0NhbGxIZWxwZXJzJiwgY29uc3QgR2VuZXJhdGlvblBhcmFtcyYp
OworICAgIHR5cGVkZWYgU2hhcmVkVGFzazxHZW5lcmF0b3JGdW5jdGlvbj4gR2VuZXJhdG9yOwor
ICAgIAorICAgIFN0YWNrbWFwKCkKKyAgICB7CisgICAgfQorCisgICAgLy8gU2V0IHNvbWUgb3Bh
cXVlIGRhdGEgdG8gaWRlbnRpZnkgdGhpcyBzdGFja21hcC4gVGhpcyBpcyB1c2VmdWwgYmVjYXVz
ZSBhIFN0YWNrbWFwLXVzaW5nIFZhbHVlCisgICAgLy8gY2FuIGJlIGR1cGxpY2F0ZWQsIGFuZCBl
YWNoIGR1cGxpY2F0ZSBtYXkgZW5kIHVwIGhhdmluZyBkaWZmZXJlbnQgcmVnaXN0ZXIgYWxsb2Nh
dGlvbi4gVGhpcworICAgIC8vIGFsbG93cyBhbGwgb2YgdGhvc2UgZHVwbGljYXRlcyB0byBiZSBh
YmxlIHRvIHJlZmVyIGJhY2sgdG8gd2hhdGV2ZXIgaGlnaC1sZXZlbCBkYXRhIHN0cnVjdHVyZXMK
KyAgICAvLyB3ZSB3ZXJlIHVzaW5nIHRvIGNyZWF0ZSB0aGUgdmFsdWUuCisgICAgdm9pZCBzZXRP
cGFxdWUodm9pZCogcGFyYW1ldGVyKQorICAgIHsKKyAgICAgICAgbV9vcGFxdWUgPSBwYXJhbWV0
ZXI7CisgICAgfQorICAgIHZvaWQqIG9wYXF1ZSgpIGNvbnN0IHsgcmV0dXJuIG1fb3BhcXVlOyB9
CisKKyAgICAvLyBDb252ZW5pZW5jZSBoZWxwZXJzIHdoZW4gdXNpbmcgaW5kaWNlcyBpbnN0ZWFk
IG9mIHBvaW50ZXJzLgorICAgIHZvaWQgc2V0T3BhcXVlSW5kZXgoc2l6ZV90IGluZGV4KQorICAg
IHsKKyAgICAgICAgc2V0T3BhcXVlKGJpdHdpc2VfY2FzdDx2b2lkKj4oaW5kZXgpKTsKKyAgICB9
CisgICAgc2l6ZV90IG9wYXF1ZUluZGV4KCkgY29uc3QgeyByZXR1cm4gYml0d2lzZV9jYXN0PHNp
emVfdD4ob3BhcXVlKCkpOyB9CisKKyAgICAvLyBDb25zdHJhaW4gYW4gYXJndW1lbnQgdG8gdGhl
IFZhbHVlIHRoYXQgdXNlcyB0aGlzIFN0YWNrbWFwLiBOb3RlIHRoYXQgaW5kZXggemVybyByZWZl
cnMgdG8gdGhlCisgICAgLy8gZmlyc3QgYXJndW1lbnQgdG8gdGhhdCBWYWx1ZSwgZXZlbiBpZiB0
aGF0IGFyZ3VtZW50IGlzIG5vdCBjb25zdHJhaW5hYmxlLiBGb3IgZXhhbXBsZSwgaW4gYQorICAg
IC8vIENoZWNrQWRkIHZhbHVlLCBpdCB3b3VsZCBiZSBhbiBlcnJvciB0byBjb25zdHJhaW4gaW5k
aWNlcyAwIGFuZCAxLiBJbiBhIENoZWNrIHZhbHVlLCBpdCB3b3VsZAorICAgIC8vIGJlIGFuIGVy
cm9yIHRvIGNvbnN0cmFpbiBpbmRleCAwLiBCdXQsIHdoZW4gdGhlIGdlbmVyYXRpb24gY2FsbGJh
Y2sgaXMgY2FsbGVkLCB5b3UgY2FuIGRlcGVuZAorICAgIC8vIG9uIHRoZSByZXBzIGZvciB0aG9z
ZSBpbmRpY2VzIGJlaW5nIGZpbGxlZCBpbi4KKyAgICB2b2lkIGNvbnN0cmFpbih1bnNpZ25lZCBp
bmRleCwgY29uc3QgVmFsdWVSZXAmIHJlcCkKKyAgICB7CisgICAgICAgIGlmIChpbmRleCArIDEg
PCBtX3JlcHMuc2l6ZSgpKQorICAgICAgICAgICAgbV9yZXBzLmdyb3coaW5kZXggKyAxKTsKKyAg
ICAgICAgbV9yZXBzW2luZGV4XSA9IHJlcDsKKyAgICB9CisKKyAgICB2b2lkIGNsb2JiZXIoY29u
c3QgUmVnaXN0ZXJTZXQmIHNldCkKKyAgICB7CisgICAgICAgIG1fY2xvYmJlcmVkLm1lcmdlKHNl
dCk7CisgICAgfQorCisgICAgdm9pZCBzZXRHZW5lcmF0b3IoUmVmUHRyPEdlbmVyYXRvcj4gZ2Vu
ZXJhdG9yKQorICAgIHsKKyAgICAgICAgbV9nZW5lcmF0b3IgPSBnZW5lcmF0b3I7CisgICAgfQor
CisgICAgdGVtcGxhdGU8dHlwZW5hbWUgRnVuY3Rvcj4KKyAgICB2b2lkIHNldEdlbmVyYXRvcihj
b25zdCBGdW5jdG9yJiBmdW5jdG9yKQorICAgIHsKKyAgICAgICAgbV9nZW5lcmF0b3IgPSBjcmVh
dGVTaGFyZWRUYXNrPEdlbmVyYXRvckZ1bmN0aW9uPihmdW5jdG9yKTsKKyAgICB9CisKKyAgICAv
LyBUaGVzZSB3aWxsIHJldHVybiBpbnRlcmVzdGluZyB0aGluZ3MgaW5zaWRlIHRoZSBnZW5lcmF0
b3IgY2FsbGJhY2ssIG9yIGFmdGVyIGNvbXBpbGF0aW9uLgorICAgIGNvbnN0IFZlY3RvcjxWYWx1
ZVJlcD4mIHJlcHMoKSBjb25zdCB7IHJldHVybiBtX3JlcHM7IH0KKyAgICBjb25zdCBSZWdpc3Rl
clNldCYgdXNlZFJlZ2lzdGVycygpIGNvbnN0IHsgcmV0dXJuIG1fdXNlZFJlZ2lzdGVyczsgfQor
CisgICAgdm9pZCBkdW1wKFByaW50U3RyZWFtJikgY29uc3Q7CisgICAgCitwcml2YXRlOgorICAg
IHZvaWQqIG1fb3BhcXVlIHsgbnVsbHB0ciB9OworICAgIFZlY3RvcjxWYWx1ZVJlcD4gbV9yZXBz
OworICAgIFJlZlB0cjxHZW5lcmF0b3I+IG1fZ2VuZXJhdG9yOworICAgIFJlZ2lzdGVyU2V0IG1f
Y2xvYmJlcmVkOworICAgIFJlZ2lzdGVyU2V0IG1fdXNlZFJlZ2lzdGVyczsKK307CisKK30gfSAv
LyBuYW1lc3BhY2UgSlNDOjpCMworCisjZW5kaWYgLy8gQjNTdGFja21hcF9oCisKSW5kZXg6IFNv
dXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM1N3aXRjaENhc2UuY3BwCj09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNv
dXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM1N3aXRjaENhc2UuY3BwCShyZXZpc2lvbiAwKQorKysg
U291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzU3dpdGNoQ2FzZS5jcHAJKHdvcmtpbmcgY29weSkK
QEAgLTAsMCArMSwzOSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNSBBcHBsZSBJbmMuIEFs
bCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3Vy
Y2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFy
ZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFy
ZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4g
dGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9u
cyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGlu
IGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5v
dGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1l
ciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92
aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9W
SURFRCBCWSBBUFBMRSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJ
RUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1Q
TElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJU
SUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQ
TEUgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5E
SVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJ
QUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVO
VCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IK
KyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5E
IE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RS
SUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVS
V0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRX
QVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLiAK
KyAqLworCisjaW5jbHVkZSAiY29uZmlnLmgiCisjaW5jbHVkZSAiQjNTd2l0Y2hDYXNlLmgiCisK
KyNpbmNsdWRlICJCM0Jhc2ljQmxvY2suaCIKKworbmFtZXNwYWNlIEpTQyB7IG5hbWVzcGFjZSBC
MyB7CisKK3ZvaWQgU3dpdGNoQ2FzZTo6ZHVtcChQcmludFN0cmVhbSYgb3V0KSBjb25zdAorewor
ICAgIG91dC5wcmludChtX2Nhc2VWYWx1ZSwgIi0+IiwgcG9pbnRlckR1bXAobV90YXJnZXQpKTsK
K30KKworfSB9IC8vIG5hbWVzcGFjZSBKU0M6OkIzCisKSW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0
Q29yZS9iMy9CM1N3aXRjaENhc2UuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENv
cmUvYjMvQjNTd2l0Y2hDYXNlLmgJKHJldmlzaW9uIDApCisrKyBTb3VyY2UvSmF2YVNjcmlwdENv
cmUvYjMvQjNTd2l0Y2hDYXNlLmgJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSw2MyBAQAorLyoK
KyAqIENvcHlyaWdodCAoQykgMjAxNSBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisg
KgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywg
d2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQg
dGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3Ry
aWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAor
ICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBk
aXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVw
cm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNv
bmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3Vt
ZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmli
dXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIGBg
QVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVE
SU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1F
UkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFS
RSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUgorICogQ09OVFJJ
QlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQ
RUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5H
LCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RT
IE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lO
RVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9G
IExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9S
VAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkg
V0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQg
T0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLiAKKyAqLworCisjaWZuZGVmIEIzU3dp
dGNoQ2FzZV9oCisjZGVmaW5lIEIzU3dpdGNoQ2FzZV9oCisKKyNpbmNsdWRlIDx3dGYvU3RkTGli
RXh0cmFzLmg+CisjaW5jbHVkZSA8d3RmL1ByaW50U3RyZWFtLmg+CisKK25hbWVzcGFjZSBKU0Mg
eyBuYW1lc3BhY2UgQjMgeworCitjbGFzcyBCYXNpY0Jsb2NrOworCitjbGFzcyBTd2l0Y2hDYXNl
IHsKK3B1YmxpYzoKKyAgICBTd2l0Y2hDYXNlKCkKKyAgICB7CisgICAgfQorCisgICAgU3dpdGNo
Q2FzZShpbnQ2NF90IGNhc2VWYWx1ZSwgQmFzaWNCbG9jayogdGFyZ2V0KQorICAgICAgICA6IG1f
Y2FzZVZhbHVlKGNhc2VWYWx1ZSkKKyAgICAgICAgLCBtX3RhcmdldCh0YXJnZXQpCisgICAgewor
ICAgIH0KKworICAgIGV4cGxpY2l0IG9wZXJhdG9yIGJvb2woKSBjb25zdCB7IHJldHVybiAhIW1f
dGFyZ2V0OyB9CisKKyAgICBpbnQ2NF90IGNhc2VWYWx1ZSgpIGNvbnN0IHsgcmV0dXJuIG1fY2Fz
ZVZhbHVlOyB9CisgICAgQmFzaWNCbG9jayogdGFyZ2V0KCkgY29uc3QgeyByZXR1cm4gbV90YXJn
ZXQ7IH0KKworICAgIHZvaWQgZHVtcChQcmludFN0cmVhbSYgb3V0KSBjb25zdDsKKworcHJpdmF0
ZToKKyAgICBpbnQ2NF90IGNhc2VWYWx1ZTsKKyAgICBCYXNpY0Jsb2NrKiB0YXJnZXQ7Cit9Owor
Cit9IH0gLy8gbmFtZXNwYWNlIEpTQzo6QjMKKworI2VuZGlmIC8vIEIzU3dpdGNoQ2FzZV9oCisK
SW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM1N3aXRjaFZhbHVlLmNwcAo9PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNTd2l0Y2hWYWx1ZS5jcHAJKHJldmlz
aW9uIDApCisrKyBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNTd2l0Y2hWYWx1ZS5jcHAJKHdv
cmtpbmcgY29weSkKQEAgLTAsMCArMSw2MyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNSBB
cHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5k
IHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2Rp
ZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRp
dGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUg
bXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qg
b2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0
cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmln
aHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dp
bmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1h
dGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZU
V0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBS
RVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8s
IFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVT
UyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZF
TlQgU0hBTEwgQVBQTEUgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5Z
IERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9S
IENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisg
KiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVT
RSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZF
UiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBD
T05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdF
TkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBP
RiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNV
Q0ggREFNQUdFLiAKKyAqLworCisjaW5jbHVkZSAiY29uZmlnLmgiCisjaW5jbGR1ZSAiQjNTd2l0
Y2hWYWx1ZS5oIgorCituYW1lc3BhY2UgSlNDIHsgbmFtZXNwYWNlIEIzIHsKKworU3dpdGNoVmFs
dWU6On5Td2l0Y2hWYWx1ZSgpCit7Cit9CisKK1N3aXRjaENhc2UgU3dpdGNoVmFsdWU6OnJlbW92
ZUNhc2UodW5zaWduZWQgaW5kZXgpCit7CisgICAgU3dpdGNoQ2FzZSByZXN1bHQgPSBtX3N1Y2Nl
c3NvcnNbaW5kZXhdOworICAgIG1fc3VjY2Vzc29yc1tpbmRleF0gPSBtX3N1Y2Nlc3NvcnMubGFz
dCgpOworICAgIG1fc3VjY2Vzc29ycy5yZW1vdmVMYXN0KCk7CisgICAgcmV0dXJuIHJlc3VsdDsK
K30KKwordm9pZCBTd2l0Y2hWYWx1ZTo6YXBwZW5kQ2FzZShjb25zdCBTd2l0Y2hDYXNlJiBzd2l0
Y2hDYXNlKQoreworICAgIG1fc3VjY2Vzc29ycy5hcHBlbmQobV9zdWNjZXNzb3JzLmxhc3QoKSk7
CisgICAgbV9zdWNjZXNzb3JzW21fc3VjY2Vzc29ycy5zaXplKCkgLSAyXSA9IHN3aXRjaENhc2Uu
dGFyZ2V0KCk7CisgICAgbV92YWx1ZXMuYXBwZW5kKHN3aXRjaENhc2UuY2FzZVZhbHVlKCkpOwor
fQorCit2b2lkIFN3aXRjaFZhbHVlOjpkdW1wTWV0YShQcmludFN0cmVhbSYgb3V0KSBjb25zdAor
eworICAgIC8vIFRoaXMgZGVzdHJ1Y3RpdmVseSBvdmVycmlkZXMgQ29udHJvbFZhbHVlJ3MgZHVt
cE1ldGEoKS4KKyAgICBvdXQucHJpbnQobGlzdER1bXAoKnRoaXMpKTsKK30KKworU3dpdGNoVmFs
dWU6OlN3aXRjaFZhbHVlKHVuc2lnbmVkIGluZGV4LCBPcmlnaW4gb3JpZ2luLCBCYXNpY0Jsb2Nr
KiBmYWxsVGhyb3VnaCkKKyAgICA6IENvbnRyb2xWYWx1ZShpbmRleCwgU3dpdGNoLCBvcmlnaW4p
Cit7CisgICAgbV9zdWNjZXNzb3JzLmFwcGVuZChmYWxsVGhyb3VnaCk7Cit9CisKK30gfSAvLyBu
YW1lc3BhY2UgSlNDOjpCMworCkluZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNTd2l0
Y2hWYWx1ZS5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM1N3aXRj
aFZhbHVlLmgJKHJldmlzaW9uIDApCisrKyBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNTd2l0
Y2hWYWx1ZS5oCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsMTIzIEBACisvKgorICogQ29weXJp
Z2h0IChDKSAyMDE1IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRp
c3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdp
dGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBm
b2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBv
ZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3Rp
Y2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIu
CisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhl
IGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBh
bmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBh
bmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAq
CisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFO
RCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBO
T1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklM
SVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlN
RUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUg
TElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAq
IEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1Qg
TElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklD
RVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJS
VVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZ
LCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5D
TFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9G
IFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9T
U0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisKKyNpZm5kZWYgQjNTd2l0Y2hWYWx1ZV9o
CisjZGVmaW5lIEIzU3dpdGNoVmFsdWVfaAorCisjaW5jbHVkZSAiQjNDb250cm9sVmFsdWUuaCIK
KyNpbmNsdWRlICJCM1N3aXRjaENhc2UuaCIKKworbmFtZXNwYWNlIEpTQyB7IG5hbWVzcGFjZSBC
MyB7CisKK2NsYXNzIFN3aXRjaFZhbHVlIDogcHVibGljIENvbnRyb2xWYWx1ZSB7CitwdWJsaWM6
CisgICAgc3RhdGljIGJvb2wgYWNjZXB0cyhPcGNvZGUgb3Bjb2RlKSB7IHJldHVybiBvcGNvZGUg
PT0gU3dpdGNoOyB9CisKKyAgICB+U3dpdGNoVmFsdWUoKTsKKworICAgIC8vIG51bUNhc2VWYWx1
ZXMoKSArIDEgPT0gbnVtU3VjY2Vzc29ycygpLgorICAgIHVuc2lnbmVkIG51bUNhc2VWYWx1ZXMo
KSBjb25zdCB7IHJldHVybiBtX3ZhbHVlcy5zaXplKCk7IH0KKworICAgIC8vIFRoZSBzdWNjZXNz
b3IgZm9yIHRoaXMgY2FzZSB2YWx1ZSBpcyBhdCB0aGUgc2FtZSBpbmRleC4KKyAgICBpbnQ2NF90
IGNhc2VWYWx1ZSh1bnNpZ25lZCBpbmRleCkgY29uc3QgeyByZXR1cm4gbV92YWx1ZXNbaV07IH0K
KyAgICAKKyAgICBjb25zdCBWZWN0b3I8aW50NjRfdD4mIGNhc2VWYWx1ZXMoKSBjb25zdCB7IHJl
dHVybiBtX3ZhbHVlczsgfQorCisgICAgQmFzaWNCbG9jayogZmFsbFRocm91Z2goKSBjb25zdCB7
IHJldHVybiBzdWNjZXNzb3JzKCkubGFzdCgpOyB9CisgICAgQmFzaWNCbG9jayomIGZhbGxUaHJv
dWdoKCkgeyByZXR1cm4gc3VjY2Vzc29ycygpLmxhc3QoKTsgfQorCisgICAgdW5zaWduZWQgc2l6
ZSgpIGNvbnN0IHsgcmV0dXJuIG51bUNhc2VWYWx1ZXMoKTsgfQorICAgIFN3aXRjaENhc2UgYXQo
dW5zaWduZWQgaW5kZXgpIGNvbnN0CisgICAgeworICAgICAgICByZXR1cm4gU3dpdGNoQ2FzZShj
YXNlVmFsdWUoaW5kZXgpLCBzdWNjZXNzb3IoaW5kZXgpKTsKKyAgICB9CisgICAgU3dpdGNoQ2Fz
ZSBvcGVyYXRvcltdKHVuc2lnbmVkIGluZGV4KSBjb25zdAorICAgIHsKKyAgICAgICAgcmV0dXJu
IGF0KGluZGV4KTsKKyAgICB9CisKKyAgICBjbGFzcyBpdGVyYXRvciB7CisgICAgcHVibGljOgor
ICAgICAgICBpdGVyYXRvcigpCisgICAgICAgICAgICA6IG1fc3dpdGNoKG51bGxwdHIpCisgICAg
ICAgICAgICAsIG1faW5kZXgoMCkKKyAgICAgICAgeworICAgICAgICB9CisKKyAgICAgICAgaXRl
cmF0b3IoU3dpdGNoVmFsdWUmIHN3aXRjaFZhbHVlLCB1bnNpZ25lZCBpbmRleCkKKyAgICAgICAg
ICAgIDogbV9zd2l0Y2goJnN3aXRjaFZhbHVlKQorICAgICAgICAgICAgLCBtX2luZGV4KGluZGV4
KQorICAgICAgICB7CisgICAgICAgIH0KKworICAgICAgICBTd2l0Y2hDYXNlIG9wZXJhdG9yKigp
CisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBtX3N3aXRjaC0+YXQobV9pbmRleCk7Cisg
ICAgICAgIH0KKworICAgICAgICBpdGVyYXRvciYgb3BlcmF0b3IrKygpCisgICAgICAgIHsKKyAg
ICAgICAgICAgIG1faW5kZXgrKzsKKyAgICAgICAgICAgIHJldHVybiAqdGhpczsKKyAgICAgICAg
fQorCisgICAgICAgIGJvb2wgb3BlcmF0b3I9PShjb25zdCBpdGVyYXRvciYgb3RoZXIpIGNvbnN0
CisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBtX2luZGV4ID09IG90aGVyLm1faW5kZXg7
CisgICAgICAgIH0KKworICAgICAgICBib29sIG9wZXJhdG9yIT0oY29uc3QgaXRlcmF0b3ImIG90
aGVyKSBjb25zdAorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gISgqdGhpcyA9PSBvdGhl
cik7CisgICAgICAgIH0KKworICAgIHByaXZhdGU6CisgICAgICAgIFN3aXRjaFZhbHVlKiBtX3N3
aXRjaDsKKyAgICAgICAgdW5zaWduZWQgbV9pbmRleDsKKyAgICB9OworCisgICAgaXRlcmF0b3Ig
YmVnaW4oKSBjb25zdCB7IHJldHVybiBpdGVyYXRvcigqdGhpcywgMCk7IH0KKyAgICBpdGVyYXRv
ciBlbmQoKSBjb25zdCB7IHJldHVybiBpdGVyYXRvcigqdGhpcywgc2l6ZSgpKTsgfQorCisgICAg
Ly8gVGhpcyByZW1vdmVzIHRoZSBjYXNlIGFuZCByZW9yZGVycyB0aGluZ3MgYSBiaXQuIElmIHlv
dSdyZSBpdGVyYXRpbmcgdGhlIGNhc2VzIGZyb20gMCB0byBOLAorICAgIC8vIHRoZW4geW91IGNh
biBrZWVwIGl0ZXJhdGluZyBhZnRlciB0aGlzIHNvIGxvbmcgYXMgeW91IHJldmlzaXQgdGhpcyBz
YW1lIGluZGV4ICh3aGljaCB3aWxsIG5vdworICAgIC8vIGNvbnRhaW4gc29tZSBvdGhlciBjYXNl
IHZhbHVlKS4gVGhpcyByZW1vdmVzIHRoZSBjYXNlIHRoYXQgd2FzIHJlbW92ZWQuCisgICAgU3dp
dGNoQ2FzZSByZW1vdmVDYXNlKHVuc2lnbmVkIGluZGV4KTsKKworICAgIHZvaWQgYXBwZW5kQ2Fz
ZShjb25zdCBTd2l0Y2hDYXNlJiBzd2l0Y2hDYXNlKTsKKworcHJvdGVjdGVkOgorICAgIHZvaWQg
ZHVtcE1ldGEoUHJpbnRTdHJlYW0mKSBjb25zdCBvdmVycmlkZTsKKworcHJpdmF0ZToKKyAgICBm
cmllbmQgY2xhc3MgUHJvY2VkdXJlOworCisgICAgU3dpdGNoVmFsdWUodW5zaWduZWQgaW5kZXgs
IE9yaWdpbiBvcmlnaW4sIEJhc2ljQmxvY2sqIGZhbGxUaHJvdWdoKTsKK307CisKK30gfSAvLyBu
YW1lc3BhY2UgSlNDOjpCMworCisjZW5kaWYgLy8gQjNTd2l0Y2hWYWx1ZV9oCisKSW5kZXg6IFNv
dXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM1R5cGUuY3BwCj09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9K
YXZhU2NyaXB0Q29yZS9iMy9CM1R5cGUuY3BwCShyZXZpc2lvbiAwKQorKysgU291cmNlL0phdmFT
Y3JpcHRDb3JlL2IzL0IzVHlwZS5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSw1NCBAQAor
LyoKKyAqIENvcHlyaWdodCAoQykgMjAxNSBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQu
CisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jt
cywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlk
ZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRp
c3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdo
dAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2lu
ZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3Qg
cmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9m
IGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRv
Y3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0
cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMu
IGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5D
TFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9G
IE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NF
IEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUgorICogQ09O
VFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUws
IFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVE
SU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdP
T0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJV
U0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAq
IE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1Ig
VE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBB
TlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklT
RUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLiAKKyAqLworCisjaW5jbHVkZSAi
Y29uZmlnLmgiCisjaW5jbHVkZSAiQjNUeXBlLmgiCisKKyNpbmNsdWRlIDx3dGYvUHJpbnRTdHJl
YW0uaD4KKworbmFtZXNwYWNlIFdURiB7CisKK3VzaW5nIG5hbWVzcGFjZSBKU0M6OkIzOworCit2
b2lkIHByaW50SW50ZXJuYWwoUHJpbnRTdHJlYW0mIG91dCwgVHlwZSB0eXBlKQoreworICAgIHN3
aXRjaCAodHlwZSkgeworICAgIGNhc2UgVm9pZDoKKyAgICAgICAgb3V0LnByaW50KCJWb2lkIik7
CisgICAgICAgIHJldHVybjsKKyAgICBjYXNlIEludDMyOgorICAgICAgICBvdXQucHJpbnQoIklu
dDMyIik7CisgICAgICAgIHJldHVybjsKKyAgICBjYXNlIEludDY0OgorICAgICAgICBvdXQucHJp
bnQoIkludDY0Iik7CisgICAgICAgIHJldHVybjsKKyAgICBjYXNlIERvdWJsZToKKyAgICAgICAg
b3V0LnByaW50KCJEb3VibGUiKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBSRUxFQVNF
X0FTU0VSVF9OT1RfUkVBQ0hFRCgpOworfQorCit9IC8vIG5hbWVzcGFjZSBXVEYKSW5kZXg6IFNv
dXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM1R5cGUuaAo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2
YVNjcmlwdENvcmUvYjMvQjNUeXBlLmgJKHJldmlzaW9uIDApCisrKyBTb3VyY2UvSmF2YVNjcmlw
dENvcmUvYjMvQjNUeXBlLmgJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSw2OCBAQAorLyoKKyAq
IENvcHlyaWdodCAoQykgMjAxNSBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgor
ICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0
aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhh
dCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1
dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICog
ICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNj
bGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9k
dWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRp
dGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50
YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRp
b24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIGBgQVMg
SVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5H
LCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNI
QU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBE
SVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUgorICogQ09OVFJJQlVU
T1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJ
QUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBC
VVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9S
IFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNT
IElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJ
QUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAor
ICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZ
IE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0Yg
VEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLiAKKyAqLworCisjaWZuZGVmIEIzVHlwZV9o
CisjZGVmaW5lIEIzVHlwZV9oCisKKyNpbmNsdWRlIDx3dGYvU3RkTGliRXh0cmFzLmg+CisKK25h
bWVzcGFjZSBKU0MgeyBuYW1lc3BhY2UgQjMgeworCitlbnVtIFR5cGUgeworICAgIFZvaWQsCisg
ICAgSW50MzIsCisgICAgSW50NjQsCisgICAgRG91YmxlCit9OworCitpbmxpbmUgYm9vbCBpc0lu
dChUeXBlIHR5cGUpCit7CisgICAgcmV0dXJuIHR5cGUgPT0gSW50MzIgfHwgdHlwZSA9PSBJbnQ2
NDsKK30KKworaW5saW5lIGJvb2wgaXNGbG9hdChUeXBlIHR5cGUpCit7CisgICAgcmV0dXJuIHR5
cGUgPT0gRG91YmxlOworfQorCitpbmxpbmUgVHlwZSBwb2ludGVyKCkgY29uc3QKK3sKKyAgICBp
ZiAoc2l6ZW9mKHZvaWQqKSA9PSA0KQorICAgICAgICByZXR1cm4gSW50MzI7CisgICAgcmV0dXJu
IEludDY0OworfQorCit9IH0gLy8gbmFtZXNwYWNlIEpTQzo6QjMKKworbmFtZXNwYWNlIFdURiB7
CisKK2NsYXNzIFByaW50U3RyZWFtOworCit2b2lkIHByaW50SW50ZXJuYWwoUHJpbnRTdHJlYW0m
LCBKU0M6OkIzOjpUeXBlKTsKKworfSAvLyBuYW1lc3BhY2UgV1RGCisKKyNlbmRpZiAvLyBCM1R5
cGVfaAorCkluZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNVcHNpbG9uVmFsdWUuY3Bw
Cj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM1Vwc2lsb25WYWx1ZS5j
cHAJKHJldmlzaW9uIDApCisrKyBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNVcHNpbG9uVmFs
dWUuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsNDEgQEAKKy8qCisgKiBDb3B5cmlnaHQg
KEMpIDIwMTUgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJp
YnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91
dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxv
d2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNv
dXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwg
dGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAq
IDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJv
dmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0
aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9v
ciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAq
IFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFTIElTJycgQU5EIEFO
WQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBM
SU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkg
QU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4g
IElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFC
TEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhF
TVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1J
VEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsg
TE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJ
T04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdI
RVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJ
TkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhF
IFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJ
TElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKworI2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1
ZGUgIkIzVXBzaWxvblZhbHVlLmgiCisKK25hbWVzcGFjZSBKU0MgeyBuYW1lc3BhY2UgQjMgewor
CitVcHNpbG9uVmFsdWU6On5VcHNpbG9uVmFsdWUoKQoreworfQorCit2b2lkIFVwc2lsb25WYWx1
ZTo6ZHVtcE1ldGEoUHJpbnRTdHJlYW0mIG91dCkgY29uc3QKK3sKKyAgICBvdXQucHJpbnQoIl4i
LCBtX3BoaS0+aW5kZXgoKSk7Cit9CisKK30gfSAvLyBuYW1lc3BhY2UgSlNDOjpCMworCkluZGV4
OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNVcHNpbG9uVmFsdWUuaAo9PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0t
LSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNVcHNpbG9uVmFsdWUuaAkocmV2aXNpb24gMCkK
KysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM1Vwc2lsb25WYWx1ZS5oCSh3b3JraW5nIGNv
cHkpCkBAIC0wLDAgKzEsNjAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTUgQXBwbGUgSW5j
LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4g
c291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9u
LCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisg
KiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0
YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRp
dGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9u
cyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAg
ICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2Ns
YWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMg
cHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMg
UFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJ
TVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAq
IElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEg
UEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxM
IEFQUExFIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1Qs
IElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFV
RU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VS
RU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEs
IE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VE
IEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1Qs
IFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBP
VEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBT
T0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFH
RS4gCisgKi8KKworI2lmbmRlZiBCM1Vwc2lsb25WYWx1ZV9oCisjZGVmaW5lIEIzVXBzaWxvblZh
bHVlX2gKKworI2luY2x1ZGUgIkIzVmFsdWUuaCIKKworbmFtZXNwYWNlIEpTQyB7IG5hbWVzcGFj
ZSBCMyB7CisKK2NsYXNzIFVwc2lsb25WYWx1ZSA6IHB1YmxpYyBWYWx1ZSB7CitwdWJsaWM6Cisg
ICAgc3RhdGljIGJvb2wgYWNjZXB0cyhPcGNvZGUgb3Bjb2RlKSB7IHJldHVybiBvcGNvZGUgPT0g
VXBzaWxvbjsgfQorCisgICAgflVwc2lsb25WYWx1ZSgpOworCisgICAgVmFsdWUqIHBoaSgpIGNv
bnN0IHsgcmV0dXJuIG1fcGhpOyB9CisKK3Byb3RlY3RlZDoKKyAgICB2b2lkIGR1bXBNZXRhKFBy
aW50U3RyZWFtJikgY29uc3Qgb3ZlcnJpZGU7CisKK3ByaXZhdGU6CisgICAgZnJpZW5kIGNsYXNz
IFByb2NlZHVyZTsKKyAgICAKKyAgICBVcHNpbG9uVmFsdWUodW5zaWduZWQgaW5kZXgsIE9yaWdp
biBvcmlnaW4sIFZhbHVlKiB2YWx1ZSwgVmFsdWUqIHBoaSkKKyAgICAgICAgOiBWYWx1ZShpbmRl
eCwgUGhpLCBWb2lkLCBvcmlnaW4sIHZhbHVlKQorICAgICAgICAsIG1fcGhpKHBoaSkKKyAgICB7
CisgICAgICAgIEFTU0VSVCh2YWx1ZS0+dHlwZSgpID09IHBoaS0+dHlwZSgpKTsKKyAgICB9CisK
KyAgICBWYWx1ZSogbV9waGk7Cit9OworCit9IH0gLy8gbmFtZXNwYWNlIEpTQzo6QjMKKworI2Vu
ZGlmIC8vIEIzVXBzaWxvblZhbHVlX2gKKwpJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL2Iz
L0IzVmFsdWUuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM1Zh
bHVlLmNwcAkocmV2aXNpb24gMCkKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM1ZhbHVl
LmNwcAkod29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDE2OSBAQAorLyoKKyAqIENvcHlyaWdodCAo
QykgMjAxNSBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmli
dXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0
CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93
aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291
cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0
aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICog
Mi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92
ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRo
ZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29y
IG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICog
VEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5Z
CisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJ
TUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBB
TkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAg
SU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJM
RSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVN
UExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlU
RUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBM
T1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElP
TikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hF
VEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElO
RyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUg
VVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklM
SVRZIE9GIFNVQ0ggREFNQUdFLiAKKyAqLworCisjaW5jbHVkZSAiY29uZmlnLmgiCisjaW5jbHVk
ZSAiQjNWYWx1ZS5oIgorCituYW1lc3BhY2UgSlNDIHsgbmFtZXNwYWNlIEIzIHsKKworVmFsdWU6
On5WYWx1ZSgpCit7Cit9CisKK3ZvaWQgVmFsdWU6OnJlcGxhY2VXaXRoSWRlbnRpdHkoVmFsdWUq
IHZhbHVlKQoreworICAgIC8vIFRoaXMgaXMgYSBiaXQgY3JhenkuIEl0IGRvZXMgYW4gaW4tcGxh
Y2UgcmVwbGFjZW1lbnQgb2Ygd2hhdGV2ZXIgVmFsdWUgc3ViY2xhc3MgdGhpcyBpcyB3aXRoCisg
ICAgLy8gYSBwbGFpbiBJZGVudGl0eSBWYWx1ZS4gV2UgZmlyc3QgY29sbGVjdCBhbGwgb2YgdGhl
IGluZm9ybWF0aW9uIHdlIG5lZWQsIHRoZW4gd2UgZGVzdHJ1Y3QgdGhlCisgICAgLy8gcHJldmlv
dXMgdmFsdWUgaW4gcGxhY2UsIGFuZCB0aGVuIHdlIGNvbnN0cnVjdCB0aGUgSWRlbnRpdHkgVmFs
dWUgaW4gcGxhY2UuCisKKyAgICB1bnNpZ25lZCBpbmRleCA9IG1faW5kZXg7CisgICAgVHlwZSB0
eXBlID0gbV90eXBlOworICAgIE9yaWdpbiBvcmlnaW4gPSBtX29yaWdpbjsKKyAgICBCYXNpY0Js
b2NrKiBvd25lciA9IHRoaXMtPm93bmVyOworICAgIFZhbHVlKiByZXBsYWNlbWVudCA9IHRoaXMt
PnJlcGxhY2VtZW50OworICAgIHZvaWQqIG1pc2MgPSB0aGlzLT5taXNjOworCisgICAgUkVMRUFT
RV9BU1NFUlQodHlwZSA9PSB2YWx1ZS0+dHlwZSgpKTsKKworICAgIHRoaXMtPlZhbHVlOjp+VmFs
dWUoKTsKKworICAgIG5ldyAodGhpcykgKGluZGV4LCBJZGVudGlmeSwgdHlwZSwgb3JpZ2luLCB2
YWx1ZSk7CisKKyAgICB0aGlzLT5vd25lciA9IG93bmVyOworICAgIHRoaXMtPnJlcGxhY2VtZW50
ID0gcmVwbGFjZW1lbnQ7CisgICAgdGhpcy0+bWlzYyA9IG1pc2M7Cit9CisKK3ZvaWQgVmFsdWU6
OmR1bXAoUHJpbnRTdHJlYW0mIG91dCkgY29uc3QKK3sKKyAgICBvdXQucHJpbnQoZHVtcFByZWZp
eCwgbV9pbmRleCk7Cit9CisKK3ZvaWQgVmFsdWU6OmRlZXBEdW1wKFByaW50U3RyZWFtJiBvdXQp
IGNvbnN0Cit7CisgICAgb3V0LnByaW50KG1fdHlwZSwgIiAiLCAqdGhpcywgIiA9ICIsIG1fb3Bj
b2RlKTsKKworICAgIG91dC5wcmludCgiKCIpOworICAgIENvbW1hUHJpbnRlciBjb21tYTsKKyAg
ICBmb3IgKFZhbHVlKiBjaGlsZCA6IGNoaWxkcmVuKCkpCisgICAgICAgIG91dC5wcmludChjb21t
YSwgcG9pbnRlckR1bXAoY2hpbGQpKTsKKworICAgIFN0cmluZ1ByaW50U3RyZWFtIHN0cmluZ091
dDsKKyAgICBkdW1wTWV0YShzdHJpbmdPdXQpOworICAgIENTdHJpbmcgc3RyaW5nID0gc3RyaW5n
T3V0LnRvQ1N0cmluZygpOworICAgIGlmIChzdHJpbmcubGVuZ3RoKCkpCisgICAgICAgIG91dC5w
cmludChjb21tYSwgc3RyaW5nKTsKKworICAgIG91dC5wcmludCgiKSIpOworfQorCitib29sIFZh
bHVlOjpoYXNJbnQzMigpIGNvbnN0Cit7CisgICAgcmV0dXJuIGZhbHNlOworfQorCitpbnQzMl90
IFZhbHVlOjphc0ludDMyKCkgY29uc3QKK3sKKyAgICBSRUxFQVNFX0FTU0VSVF9OT1RfUkVBQ0hF
RCgpOworICAgIHJldHVybiAwOworfQorCitib29sIFZhbHVlOjpoYXNJbnQ2NCgpIGNvbnN0Cit7
CisgICAgcmV0dXJuIGZhbHNlOworfQorCitpbnQ2NF90IFZhbHVlOjphc0ludDY0KCkgY29uc3QK
K3sKKyAgICBSRUxFQVNFX0FTU0VSVF9OT1RfUkVBQ0hFRCgpOworICAgIHJldHVybiAwOworfQor
Citib29sIFZhbHVlOjpoYXNEb3VibGUoKSBjb25zdAoreworICAgIHJldHVybiBmYWxzZTsKK30K
KworZG91YmxlIFZhbHVlOjphc0RvdWJsZSgpIGNvbnN0Cit7CisgICAgUkVMRUFTRV9BU1NFUlRf
Tk9UX1JFQUNIRUQoKTsKKyAgICByZXR1cm4gMDsKK30KKwordm9pZCBWYWx1ZTo6ZHVtcE1ldGEo
UHJpbnRTdHJlYW0mKSBjb25zdAoreworfQorCitUeXBlIFZhbHVlOjp0eXBlRm9yKE9wY29kZSBv
cGNvZGUsIFZhbHVlKiBmaXJzdENoaWxkKQoreworICAgIHN3aXRjaCAob3Bjb2RlKSB7CisgICAg
Y2FzZSBJZGVudGl0eToKKyAgICBjYXNlIEFkZDoKKyAgICBjYXNlIFN1YjoKKyAgICBjYXNlIE11
bDoKKyAgICBjYXNlIERpdjoKKyAgICBjYXNlIENoaWxsRGl2OgorICAgIGNhc2UgTW9kOgorICAg
IGNhc2UgQml0QW5kOgorICAgIGNhc2UgQml0T3I6CisgICAgY2FzZSBCaXRYb3I6CisgICAgY2Fz
ZSBTaGw6CisgICAgY2FzZSBTU2hyOgorICAgIGNhc2UgWlNocjoKKyAgICBjYXNlIENoZWNrQWRk
OgorICAgIGNhc2UgQ2hlY2tTdWI6CisgICAgY2FzZSBDaGVja011bDoKKyAgICAgICAgcmV0dXJu
IGZpcnN0Q2hpbGQtPnR5cGUoKTsKKyAgICBjYXNlIEZyYW1lUG9pbnRlcjoKKyAgICAgICAgcmV0
dXJuIHBvaW50ZXIoKTsKKyAgICBjYXNlIFNFeHQ4OgorICAgIGNhc2UgU0V4dDE2OgorICAgIGNh
c2UgRFRvSTMyOgorICAgIGNhc2UgRXF1YWw6CisgICAgY2FzZSBOb3RFcXVhbDoKKyAgICBjYXNl
IExlc3NUaGFuOgorICAgIGNhc2UgR3JlYXRlclRoYW46CisgICAgY2FzZSBMZXNzRXF1YWw6Cisg
ICAgY2FzZSBHcmVhdGVyRXF1YWw6CisgICAgY2FzZSBBYm92ZToKKyAgICBjYXNlIEJlbG93Ogor
ICAgIGNhc2UgQWJvdmVFcXVhbDoKKyAgICBjYXNlIEJlbG93RXF1YWw6CisgICAgICAgIHJldHVy
biBJbnQzMjsKKyAgICBjYXNlIFNFeHQzMjoKKyAgICBjYXNlIFpFeHQzMjoKKyAgICAgICAgcmV0
dXJuIEludDY0OworICAgIGNhc2UgRlJvdW5kOgorICAgIGNhc2UgSVRvRDoKKyAgICAgICAgcmV0
dXJuIERvdWJsZTsKKyAgICBjYXNlIE5vcDoKKyAgICAgICAgcmV0dXJuIFZvaWQ7CisgICAgZGVm
YXVsdDoKKyAgICAgICAgUkVMRUFTRV9BU1NFUlRfTk9UX1JFQUNIRUQoKTsKKyAgICB9Cit9CisK
K30gfSAvLyBuYW1lc3BhY2UgSlNDOjpCMworCkluZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUv
YjMvQjNWYWx1ZS5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM1Zh
bHVlLmgJKHJldmlzaW9uIDApCisrKyBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNWYWx1ZS5o
CSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsMTczIEBACisvKgorICogQ29weXJpZ2h0IChDKSAy
MDE1IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlv
biBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAq
IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcg
Y29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2Ug
Y29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMg
bGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBS
ZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNv
cHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZv
bGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3Ro
ZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElT
IFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAq
IEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRF
RCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBG
SVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBO
TyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZP
UiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFS
WSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBU
TywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1Mg
T0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBI
T1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVS
IElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5F
R0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UK
KyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkg
T0YgU1VDSCBEQU1BR0UuIAorICovCisKKyNpZm5kZWYgQjNWYWx1ZV9oCisjZGVmaW5lIEIzVmFs
dWVfaAorCisjaW5jbHVkZSAiQjNPcmlnaW4uaCIKKyNpbmNsdWRlICJCM1R5cGUuaCIKKyNpbmNs
dWRlIDx3dGYvRmFzdE1hbGxvYy5oPgorI2luY2x1ZGUgPHd0Zi9Ob25jb3B5YWJsZS5oPgorCitu
YW1lc3BhY2UgSlNDIHsgbmFtZXNwYWNlIEIzIHsKKworY2xhc3MgVmFsdWUgeworICAgIFdURl9N
QUtFX05PTkNPUFlBQkxFKFZhbHVlKTsKKyAgICBXVEZfTUFLRV9GQVNUX0FMTE9DQVRFRDsKK3B1
YmxpYzoKKyAgICB0eXBlZGVmIFZlY3RvcjxWYWx1ZSosIDM+IEFkamFjZW5jeUxpc3Q7CisKKyAg
ICBzdGF0aWMgY29uc3QgY2hhciogZHVtcFByZWZpeCA9ICJAIjsKKworICAgIHN0YXRpYyBib29s
IGFjY2VwdHMoT3Bjb2RlKSB7IHJldHVybiB0cnVlOyB9CisKKyAgICB2aXJ0dWFsIH5WYWx1ZSgp
OworCisgICAgdW5zaWduZWQgaW5kZXgoKSBjb25zdCB7IHJldHVybiBtX2luZGV4OyB9CisgICAg
CisgICAgLy8gTm90ZSB0aGF0IHRoZSBvcGNvZGUgaXMgaW1tdXRhYmxlLCBleGNlcHQgZm9yIHJl
cGxhY2luZyB2YWx1ZXMgd2l0aCBpZGVudGl0eS4KKyAgICBPcGNvZGUgb3Bjb2RlKCkgY29uc3Qg
eyByZXR1cm4gbV9vcGNvZGU7IH0KKworICAgIE9yaWdpbiBvcmlnaW4oKSBjb25zdCB7IHJldHVy
biBtX29yaWdpbjsgfQorICAgIAorICAgIFZhbHVlKiYgY2hpbGQodW5zaWduZWQgaW5kZXgpIHsg
cmV0dXJuIG1fY2hpbGRyZW5baW5kZXhdOyB9CisgICAgVmFsdWUqIGNoaWxkKHVuc2lnbmVkIGlu
ZGV4KSBjb25zdCB7IHJldHVybiBtX2NoaWxkcmVuW2luZGV4XTsgfQorCisgICAgLy8gVGhpcyBj
b21wdXRlcyB0aGUgdHlwZSB1c2luZyB0aGUgb3Bjb2RlLgorICAgIFR5cGUgdHlwZSgpIGNvbnN0
IHsgcmV0dXJuIG1fdHlwZTsgfQorCisgICAgQWRqYWNlbmN5TGlzdCYgY2hpbGRyZW4oKSB7IHJl
dHVybiBtX2NoaWxkcmVuOyB9IAorICAgIGNvbnN0IEFkamFjZW5jeUxpc3QmIGNoaWxkcmVuKCkg
Y29uc3QgeyByZXR1cm4gbV9jaGlsZHJlbjsgfQorCisgICAgdm9pZCByZXBsYWNlV2l0aElkZW50
aXR5KFZhbHVlKik7CisgICAgdm9pZCByZXBsYWNlV2l0aE5vcCgpOworCisgICAgdm9pZCBkdW1w
KFByaW50U3RyZWFtJikgY29uc3Q7CisgICAgdm9pZCBkZWVwRHVtcChQcmludFN0cmVhbSYpIGNv
bnN0OworCisgICAgLy8gVGhpcyBpcyBob3cgeW91IGNhc3QgVmFsdWVzLiBGb3IgZXhhbXBsZSwg
aWYgeW91IHdhbnQgdG8gZG8gc29tZXRoaW5nIHByb3ZpZGVkIHRoYXQgd2UgaGF2ZSBhCisgICAg
Ly8gQXJndW1lbnRSZWdWYWx1ZSwgeW91IGNhbiBkbzoKKyAgICAvLworICAgIC8vIGlmIChBcmd1
bWVudFJlZ1ZhbHVlKiBhcmd1bWVudFJlZyA9IHZhbHVlLT5hczxBcmd1bWVudFJlZ1ZhbHVlPigp
KSB7CisgICAgLy8gICAgIHRoaW5ncworICAgIC8vIH0KKyAgICAvLworICAgIC8vIFRoaXMgd2ls
bCByZXR1cm4gbnVsbCBpZiB0aGlzIG9wY29kZSgpICE9IEFyZ3VtZW50UmVnLiBUaGlzIHdvcmtz
IGJlY2F1c2UgdGhpcyByZXR1cm5zIG51bGxwdHIKKyAgICAvLyBpZiBUOjphY2NlcHRzKG9wY29k
ZSgpKSByZXR1cm5zIGZhbHNlLgorICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+CisgICAgVCogYXMo
KTsKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorICAgIGNvbnN0IFQqIGFzKCkgY29uc3Q7Cisg
ICAgCisgICAgYm9vbCBoYXNJbnQzMigpIGNvbnN0OworICAgIGludDMyX3QgYXNJbnQzMigpIGNv
bnN0OworICAgIAorICAgIGJvb2wgaGFzSW50NjQoKSBjb25zdDsKKyAgICBpbnQ2NF90IGFzSW50
NjQoKSBjb25zdDsKKworICAgIGJvb2wgaGFzRG91YmxlKCkgY29uc3Q7CisgICAgZG91YmxlIGFz
RG91YmxlKCkgY29uc3Q7CisKK3Byb3RlY3RlZDoKKyAgICB2aXJ0dWFsIHZvaWQgZHVtcE1ldGEo
UHJpbnRTdHJlYW0mKSBjb25zdDsKKyAgICAKK3ByaXZhdGU6CisgICAgZnJpZW5kIGNsYXNzIFBy
b2NlZHVyZTsKKyAgICAKKyAgICAvLyBJbnN0YW50aWF0ZSB2YWx1ZXMgdmlhIFByb2NlZHVyZS4K
KyAgICAvLyBUaGlzIGZvcm0gcmVxdWlyZXMgc3BlY2lmeWluZyB0aGUgdHlwZSBleHBsaWNpdGx5
OgorICAgIHRlbXBsYXRlPHR5cGVuYW1lLi4uIEFyZ3VtZW50cz4KKyAgICBleHBsaWNpdCBWYWx1
ZSh1bnNpZ25lZCBpbmRleCwgT3Bjb2RlIG9wY29kZSwgVHlwZSB0eXBlLCBPcmlnaW4gb3JpZ2lu
LCBBcmd1bWVudHMuLi4gYXJndW1lbnRzKQorICAgICAgICA6IG1faW5kZXgoaW5kZXgpCisgICAg
ICAgICwgbV9vcGNvZGUob3Bjb2RlKQorICAgICAgICAsIG1fdHlwZSh0eXBlKQorICAgICAgICAs
IG1fb3JpZ2luKG9yaWdpbikKKyAgICAgICAgLCBtX2NoaWxkcmVueyBhcmd1bWVudHMuLi4gfQor
ICAgIHsKKyAgICB9CisgICAgLy8gVGhpcyBmb3JtIGlzIGZvciB0aG9zZSBvcGNvZGVzIHRoYXQg
Y2FuIGluZmVyIHRoZWlyIHR5cGUgZnJvbSB0aGUgb3Bjb2RlIGFuZCBmaXJzdCBjaGlsZDoKKyAg
ICB0ZW1wbGF0ZTx0eXBlbmFtZS4uLiBBcmd1bWVudHM+CisgICAgZXhwbGljaXQgVmFsdWUodW5z
aWduZWQgaW5kZXgsIE9wY29kZSBvcGNvZGUsIE9yaWdpbiBvcmlnaW4sIFZhbHVlKiBmaXJzdENo
aWxkLCBBcmd1bWVudHMuLi4gYXJndW1lbnRzKQorICAgICAgICA6IG1faW5kZXgoaW5kZXgpCisg
ICAgICAgICwgbV9vcGNvZGUob3Bjb2RlKQorICAgICAgICAsIG1fdHlwZSh0eXBlRm9yKG9wY29k
ZSwgZmlyc3RDaGlsZCkpCisgICAgICAgICwgbV9vcmlnaW4ob3JpZ2luKQorICAgICAgICAsIG1f
Y2hpbGRyZW57IGZpcnN0Q2hpbGQsIGFyZ3VtZW50cy4uLiB9CisgICAgeworICAgIH0KKyAgICAv
LyBUaGlzIGZvcm0gaXMgZm9yIHRob3NlIG9wY29kZXMgdGhhdCBjYW4gaW5mZXIgdGhlaXIgdHlw
ZSBmcm9tIHRoZSBvcGNvZGUgYWxvbmUsIGFuZCB0aGF0IGRvbid0CisgICAgLy8gdGFrZSBhbnkg
YXJndW1lbnRzOgorICAgIGV4cGxpY2l0IFZhbHVlKHVuc2lnbmVkIGluZGV4LCBPcGNvZGUgb3Bj
b2RlLCBPcmlnaW4gb3JpZ2luKQorICAgICAgICA6IG1faW5kZXgoaW5kZXgpCisgICAgICAgICwg
bV9vcGNvZGUob3Bjb2RlKQorICAgICAgICAsIG1fdHlwZSh0eXBlRm9yKG9wY29kZSwgbnVsbHB0
cikpCisgICAgICAgICwgbV9vcmlnaW4ob3JpZ2luKQorICAgIHsKKyAgICB9CisKKyAgICBzdGF0
aWMgVHlwZSB0eXBlRm9yKE9wY29kZSwgVmFsdWUqIGZpcnN0Q2hpbGQpOworCisgICAgLy8gVGhp
cyBncm91cCBvZiBmaWVsZHMgaXMgYXJyYW5nZWQgdG8gZml0IGluIDY0IGJpdHMuCisgICAgdW5z
aWduZWQgbV9pbmRleDsKKyAgICBPcGNvZGUgbV9vcGNvZGU7CisgICAgVHlwZSBtX3R5cGU7Cisg
ICAgCisgICAgT3JpZ2luIG1fb3JpZ2luOworICAgIEFkamFjZW5jeUxpc3QgbV9jaGlsZHJlbjsK
KworcHVibGljOgorICAgIEJhc2ljQmxvY2sqIG93bmVyIHsgbnVsbHB0ciB9OyAvLyBjb21wdXRl
ZCBsYXppbHkuCisgICAgVmFsdWUqIHJlcGxhY2VtZW50IHsgbnVsbHB0ciB9OyAvLyB1c2VkIGZv
ciBhbmFseXNlcyBhbmQgdHJhbnNmb3JtYXRpb25zLgorICAgIHZvaWQqIG1pc2MgeyBudWxscHRy
IH07Cit9OworCitjbGFzcyBEZWVwVmFsdWVEdW1wIHsKK3B1YmxpYzoKKyAgICBEZWVwVmFsdWVE
dW1wKFZhbHVlKiB2YWx1ZSkKKyAgICAgICAgOiBtX3ZhbHVlKHZhbHVlKQorICAgIHsKKyAgICB9
CisKKyAgICB2b2lkIGR1bXAoUHJpbnRTdHJlYW0mIG91dCkgY29uc3QKKyAgICB7CisgICAgICAg
IGlmIChtX3ZhbHVlKQorICAgICAgICAgICAgbV92YWx1ZS0+ZGVlcER1bXAob3V0KTsKKyAgICAg
ICAgZWxzZQorICAgICAgICAgICAgb3V0LnByaW50KCI8bnVsbD4iKTsKKyAgICB9CisKK3ByaXZh
dGU6CisgICAgVmFsdWUqIG1fdmFsdWU7Cit9OworCitEZWVwVmFsdWVEdW1wIGRlZXBEdW1wKFZh
bHVlKiB2YWx1ZSkKK3sKKyAgICByZXR1cm4gRGVlcFZhbHVlRHVtcCh2YWx1ZSk7Cit9CisKK30g
fSAvLyBuYW1lc3BhY2UgSlNDOjpCMworCisjZW5kaWYgLy8gQjNWYWx1ZV9oCisKSW5kZXg6IFNv
dXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM1ZhbHVlSW5saW5lcy5oCj09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNv
dXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM1ZhbHVlSW5saW5lcy5oCShyZXZpc2lvbiAwKQorKysg
U291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzVmFsdWVJbmxpbmVzLmgJKHdvcmtpbmcgY29weSkK
QEAgLTAsMCArMSw4MyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNSBBcHBsZSBJbmMuIEFs
bCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3Vy
Y2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFy
ZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFy
ZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4g
dGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9u
cyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGlu
IGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5v
dGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1l
ciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92
aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9W
SURFRCBCWSBBUFBMRSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJ
RUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1Q
TElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJU
SUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQ
TEUgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5E
SVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJ
QUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVO
VCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IK
KyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5E
IE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RS
SUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVS
V0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRX
QVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLiAK
KyAqLworCisjaWZuZGVmIEIzVmFsdWVJbmxpbmVzX2gKKyNkZWZpbmUgQjNWYWx1ZUlubGluZXNf
aAorCisjaW5jbHVkZSAiQjNDb25zdDMyVmFsdWUuaCIKKyNpbmNsdWRlICJCM0NvbnN0NjRWYWx1
ZS5oIgorI2luY2x1ZGUgIkIzQ29uc3REb3VibGVWYWx1ZS5oIgorI2luY2x1ZGUgIkIzVmFsdWUu
aCIKKworbmFtZXNwYWNlIEpTQyB7IG5hbWVzcGFjZSBCMyB7CisKK3RlbXBsYXRlPHR5cGVuYW1l
IFQ+CitUKiBWYWx1ZTo6YXMoKQoreworICAgIGlmIChUOjphY2NlcHRzKG9wY29kZSgpKSkKKyAg
ICAgICAgcmV0dXJuIHN0YXRpY19jYXN0PFQqPih0aGlzKTsKKyAgICByZXR1cm4gbnVsbHB0cjsK
K30KKwordGVtcGxhdGU+dHlwZW5hbWUgVD4KK2NvbnN0IFQqIFZhbHVlOjphcygpIGNvbnN0Cit7
CisgICAgcmV0dXJuIGNvbnN0X2Nhc3Q8VmFsdWUqPih0aGlzKS0+YXM8VD4oKTsKK30KKworYm9v
bCBWYWx1ZTo6aGFzSW50MzIoKSBjb25zdAoreworICAgIHJldHVybiAhIWFzPENvbnN0MzJWYWx1
ZT4oKTsKK30KKworaW50MzJfdCBWYWx1ZTo6YXNJbnQzMigpIGNvbnN0Cit7CisgICAgcmV0dXJu
IGFzPENvbnN0MzJWYWx1ZT4oKS0+dmFsdWUoKTsKK30KKworYm9vbCBWYWx1ZTo6aGFzSW50NjQo
KSBjb25zdAoreworICAgIHJldHVybiAhIWFzPENvbnN0NjRWYWx1ZT4oKTsKK30KKworaW50NjRf
dCBWYWx1ZTo6YXNJbnQ2NCgpIGNvbnN0Cit7CisgICAgcmV0dXJuIGFzPENvbnN0NjRWYWx1ZT4o
KS0+dmFsdWUoKTsKK30KKworYm9vbCBWYWx1ZTo6aGFzRG91YmxlKCkgY29uc3QKK3sKKyAgICBy
ZXR1cm4gISFhczxDb25zdERvdWJsZVZhbHVlPigpOworfQorCitkb3VibGUgVmFsdWU6OmFzRG91
YmxlKCkgY29uc3QKK3sKKyAgICByZXR1cm4gYXM8Q29uc3REb3VibGVWYWx1ZT4oKS0+dmFsdWUo
KTsKK30KKworfSB9IC8vIG5hbWVzcGFjZSBKU0M6OkIzCisKKyNlbmRpZiAvLyBCM1ZhbHVlSW5s
aW5lc19oCisKSW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM1ZhbHVlUmVwLmNwcAo9
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNWYWx1ZVJlcC5jcHAJKHJl
dmlzaW9uIDApCisrKyBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNWYWx1ZVJlcC5jcHAJKHdv
cmtpbmcgY29weSkKQEAgLTAsMCArMSw4NiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNSBB
cHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5k
IHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2Rp
ZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRp
dGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUg
bXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qg
b2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0
cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmln
aHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dp
bmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1h
dGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZU
V0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBS
RVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8s
IFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVT
UyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZF
TlQgU0hBTEwgQVBQTEUgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5Z
IERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9S
IENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisg
KiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVT
RSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZF
UiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBD
T05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdF
TkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBP
RiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNV
Q0ggREFNQUdFLiAKKyAqLworCisjaW5jbHVkZSAiY29uZmlnLmgiCisjaW5jbHVkZSAiQjNWYWx1
ZVJlcC5oIgorCituYW1lc3BhY2UgSlNDIHsgbmFtZXNwYWNlIEIzIHsKKwordm9pZCBWYWx1ZVJl
cDo6ZHVtcChQcmludFN0cmVhbSYgb3V0KSBjb25zdAoreworICAgIG91dC5wcmludChtX2tpbmQp
OworICAgIHN3aXRjaCAobV9raW5kKSB7CisgICAgY2FzZSBOb25lOgorICAgIGNhc2UgU29tZVJl
Z2lzdGVyOgorICAgICAgICByZXR1cm47CisgICAgY2FzZSBSZWdpc3RlcjoKKyAgICAgICAgb3V0
LnByaW50KCIoIiwgcmVnKCksICIpIik7CisgICAgICAgIHJldHVybjsKKyAgICBjYXNlIFN0YWNr
OgorICAgICAgICBvdXQucHJpbnQoIigiLCBvZmZzZXRGcm9tRlAoKSwgIikiKTsKKyAgICAgICAg
cmV0dXJuOworICAgIGNhc2UgU3RhY2tBcmd1bWVudDoKKyAgICAgICAgb3V0LnByaW50KCIoIiwg
b2Zmc2V0RnJvbVNQKCksICIpIik7CisgICAgICAgIHJldHVybjsKKyAgICBjYXNlIENvbnN0YW50
OgorICAgICAgICBvdXQucHJpbnQoIigiLCB2YWx1ZSgpLCAiKSIpOworICAgICAgICByZXR1cm47
CisgICAgfQorICAgIFJFTEVBU0VfQVNTRVJUX05PVF9SRUFDSEVEKCk7Cit9CisKK30gfSAvLyBu
YW1lc3BhY2UgSlNDOjpCMworCituYW1lc3BhY2UgV1RGIHsKKwordXNpbmcgbmFtZXNwYWNlIEpT
Qzo6QjM7CisKK3ZvaWQgcHJpbnRJbnRlcm5hbChQcmludFN0cmVhbSYgb3V0LCBWYWx1ZVJlcDo6
S2luZCBraW5kKQoreworICAgIHN3aXRjaCAoa2luZCkgeworICAgIGNhc2UgVmFsdWVSZXA6OkFu
eToKKyAgICAgICAgb3V0LnByaW50KCJBbnkiKTsKKyAgICAgICAgcmV0dXJuOworICAgIGNhc2Ug
VmFsdWVSZXA6OlNvbWVSZWdpc3RlcjoKKyAgICAgICAgb3V0LnByaW50KCJTb21lUmVnaXN0ZXIi
KTsKKyAgICAgICAgcmV0dXJuOworICAgIGNhc2UgVmFsdWVSZXA6OlJlZ2lzdGVyOgorICAgICAg
ICBvdXQucHJpbnQoIlJlZ2lzdGVyIik7CisgICAgICAgIHJldHVybjsKKyAgICBjYXNlIFZhbHVl
UmVwOjpTdGFjazoKKyAgICAgICAgb3V0LnByaW50KCJTdGFjayIpOworICAgICAgICByZXR1cm47
CisgICAgY2FzZSBWYWx1ZVJlcDo6U3RhY2tBcmd1bWVudDoKKyAgICAgICAgb3V0LnByaW50KCJT
dGFja0FyZ3VtZW50Iik7CisgICAgICAgIHJldHVybjsKKyAgICBjYXNlIFZhbHVlUmVwOjpDb25z
dGFudDoKKyAgICAgICAgb3V0LnByaW50KCJDb25zdGFudCIpOworICAgICAgICByZXR1cm47Cisg
ICAgfQorICAgIFJFTEVBU0VfQVNTRVJUX05PVF9SRUFDSEVEKCk7Cit9CisKK30gLy8gbmFtZXNw
YWNlIFdURgorCkluZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNWYWx1ZVJlcC5oCj09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM1ZhbHVlUmVwLmgJKHJldmlz
aW9uIDApCisrKyBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNWYWx1ZVJlcC5oCSh3b3JraW5n
IGNvcHkpCkBAIC0wLDAgKzEsMTU2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE1IEFwcGxl
IEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNl
IGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNh
dGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9u
cworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0
IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBj
b25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1
dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAor
ICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBk
aXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJp
YWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJF
IElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1Mg
T1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhF
CisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZP
UiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBT
SEFMTCBBUFBMRSBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElS
RUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09O
U0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBS
T0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBE
QVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENB
VVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRS
QUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0Ug
T1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRI
SVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBE
QU1BR0UuIAorICovCisKKyNpZm5kZWYgQjNWYWx1ZVJlcF9oCisjZGVmaW5lIEIzVmFsdWVSZXBf
aAorCisjaW5jbHVkZSAiUmVnLmgiCisjaW5jbHVkZSA8d3RmL1ByaW50U3RyZWFtLmg+CisKK25h
bWVzcGFjZSBKU0MgeyBuYW1lc3BhY2UgQjMgeworCisvLyBXZSB1c2UgdGhpcyBjbGFzcyB0byBk
ZXNjcmliZSB2YWx1ZSByZXByZXNlbnRhdGlvbnMgYXQgc3RhY2ttYXBzLiBJdCdzIHVzZWQgYm90
aCB0byBmb3JjZSBhCisvLyByZXByZXNlbnRhdGlvbiBhbmQgdG8gZ2V0IHRoZSByZXByZXNlbnRh
dGlvbi4gV2hlbiB0aGUgQjMgY2xpZW50IGZvcmNlcyBhIHJlcHJlc2VudGF0aW9uLCB3ZSBzYXkK
Ky8vIHRoYXQgaXQncyBhbiBpbnB1dC4gV2hlbiBCMyB0ZWxscyB0aGUgY2xpZW50IHdoYXQgcmVw
cmVzZW50YXRpb24gaXQgcGlja2VkLCB3ZSBzYXkgdGhhdCBpdCdzIGFuCisvLyBvdXRwdXQuCisK
K2NsYXNzIFZhbHVlUmVwIHsKK3B1YmxpYzoKKyAgICBlbnVtIEtpbmQgeworICAgICAgICAvLyBB
cyBhbiBpbnB1dCByZXByZXNlbnRhdGlvbiwgdGhpcyBtZWFucyB0aGF0IEIzIGNhbiBwaWNrIGFu
eSByZXByZXNlbnRhdGlvbi4KKyAgICAgICAgQW55LAorCisgICAgICAgIC8vIEFzIGFuIGlucHV0
IHJlcHJlc2VudGF0aW9uLCB0aGlzIG1lYW5zIHRoYXQgQjMgc2hvdWxkIHBpY2sgc29tZSByZWdp
c3RlciwgcHJvdmlkZWQgdGhhdAorICAgICAgICAvLyBpdCdzIG5vdCBhbHNvIGEgcmVnaXN0ZXIg
dGhhdCB3YXMgY2xvYmJlcmVkLgorICAgICAgICBTb21lUmVnaXN0ZXIsCisKKyAgICAgICAgLy8g
QXMgYW4gaW5wdXQgcmVwcmVzZW50YXRpb24sIHRoaXMgZm9yY2VzIGEgcGFydGljdWxhciByZWdp
c3Rlci4gQXMgYW4gb3V0cHV0CisgICAgICAgIC8vIHJlcHJlc2VudGF0aW9uLCB0aGlzIHRlbGxz
IHVzIHdoYXQgcmVnaXN0ZXIgQjMgcGlja2VkLgorICAgICAgICBSZWdpc3RlciwKKworICAgICAg
ICAvLyBBcyBhbiBvdXRwdXQgcmVwcmVzZW50YXRpb24sIHRoaXMgdGVsbHMgdXMgd2hhdCBzdGFj
ayBzbG90IEIzIHBpY2tlZC4gSXQncyBub3QgYSB2YWxpZAorICAgICAgICAvLyBpbnB1dCByZXBy
ZXNlbnRhdGlvbi4KKyAgICAgICAgU3RhY2ssCisKKyAgICAgICAgLy8gQXMgYW4gaW5wdXQgcmVw
cmVzZW50YXRpb24sIHRoaXMgZm9yY2VzIHRoZSB2YWx1ZSB0byBlbmQgdXAgaW4gdGhlIGFyZ3Vt
ZW50IGFyZWEgYXQgc29tZQorICAgICAgICAvLyBvZmZzZXQuCisgICAgICAgIFN0YWNrQXJndW1l
bnQsCisKKyAgICAgICAgLy8gQXMgYW4gb3V0cHV0IHJlcHJlc2VudGF0aW9uLCB0aGlzIHRlbGxz
IHVzIHRoYXQgQjMgY29uc3RhbnQtZm9sZGVkIHRoZSB2YWx1ZS4KKyAgICAgICAgQ29uc3RhbnQK
KyAgICB9OworICAgIAorICAgIFZhbHVlUmVwKCkKKyAgICAgICAgOiBtX2tpbmQoQW55KQorICAg
IHsKKyAgICB9CisKKyAgICBleHBsaWNpdCBWYWx1ZVJlcChSZWcgcmVnKQorICAgICAgICA6IG1f
a2luZChSZWdpc3RlcikKKyAgICAgICAgLCBtX3ZhbHVlKHJlZy5pbmRleCgpKQorICAgIHsKKyAg
ICB9CisKKyAgICBzdGF0aWMgVmFsdWVSZXAgcmVnKFJlZyByZWcpCisgICAgeworICAgICAgICBy
ZXR1cm4gVmFsdWVSZXAocmVnKTsKKyAgICB9CisKKyAgICBzdGF0aWMgVmFsdWVSZXAgc3RhY2so
aW50cHRyX3Qgb2Zmc2V0RnJvbUZQKQorICAgIHsKKyAgICAgICAgVmFsdWVSZXAgcmVzdWx0Owor
ICAgICAgICByZXN1bHQubV9raW5kID0gU3RhY2s7CisgICAgICAgIHJlc3VsdC5tX3ZhbHVlID0g
b2Zmc2V0RnJvbUZQOworICAgIH0KKworICAgIHN0YXRpYyBWYWx1ZVJlcCBzdGFja0FyZ3VtZW50
KGludHB0cl90IG9mZnNldEZyb21TUCkKKyAgICB7CisgICAgICAgIFZhbHVlUmVwIHJlc3VsdDsK
KyAgICAgICAgcmVzdWx0Lm1fa2luZCA9IFN0YWNrQXJndW1lbnQ7CisgICAgICAgIHJlc3VsdC5t
X3ZhbHVlID0gb2Zmc2V0RnJvbVNQOworICAgIH0KKworICAgIHN0YXRpYyBWYWx1ZVJlcCBjb25z
dGFudChpbnQ2NF90IHZhbHVlKQorICAgIHsKKyAgICAgICAgVmFsdWVSZXAgcmVzdWx0OworICAg
ICAgICByZXN1bHQubV9raW5kID0gQ29uc3RhbnQ7CisgICAgICAgIHJlc3VsdC5tX3ZhbHVlID0g
dmFsdWU7CisgICAgfQorCisgICAgc3RhdGljIFZhbHVlUmVwIGNvbnN0YW50KGRvdWJsZSB2YWx1
ZSkKKyAgICB7CisgICAgICAgIHJldHVybiBWYWx1ZVJlcChiaXR3aXNlX2Nhc3Q8aW50NjRfdD4o
dmFsdWUpKTsKKyAgICB9CisKKyAgICBLaW5kIGtpbmQoKSBjb25zdCB7IHJldHVybiBtX2tpbmQ7
IH0KKworICAgIGV4cGxpY2l0IG9wZXJhdG9yIGJvb2woKSBjb25zdCB7IHJldHVybiBraW5kKCkg
IT0gQW55OyB9CisKKyAgICBSZWcgcmVnKCkgY29uc3QKKyAgICB7CisgICAgICAgIEFTU0VSVChr
aW5kKCkgPT0gUmVnaXN0ZXIpOworICAgICAgICByZXR1cm4gUmVnOjpmcm9tSW5kZXgobV92YWx1
ZSk7CisgICAgfQorCisgICAgaW50cHRyX3Qgb2Zmc2V0RnJvbUZQKCkgY29uc3QKKyAgICB7Cisg
ICAgICAgIEFTU0VSVChraW5kKCkgPT0gU3RhY2spOworICAgICAgICByZXR1cm4gc3RhdGljX2Nh
c3Q8aW50cHRyX3Q+KG1fdmFsdWUpOworICAgIH0KKworICAgIGludHB0cl90IG9mZnNldEZyb21T
UCgpIGNvbnN0CisgICAgeworICAgICAgICBBU1NFUlQoa2luZCgpID09IFN0YWNrQXJndW1lbnQp
OworICAgICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8aW50cHRyX3Q+KG1fdmFsdWUpOworICAgIH0K
KworICAgIGludDY0X3QgdmFsdWUoKSBjb25zdAorICAgIHsKKyAgICAgICAgQVNTRVJUKGtpbmQo
KSA9PSBDb25zdGFudCk7CisgICAgICAgIHJldHVybiBtX3ZhbHVlOworICAgIH0KKworICAgIGRv
dWJsZSBkb3VibGVWYWx1ZSgpIGNvbnN0CisgICAgeworICAgICAgICByZXR1cm4gYml0d2lzZV9j
YXN0PGRvdWJsZT4odmFsdWUoKSk7CisgICAgfQorCisgICAgdm9pZCBkdW1wKFByaW50U3RyZWFt
JikgY29uc3Q7CisKK3ByaXZhdGU6CisgICAgS2luZCBtX2tpbmQ7CisgICAgaW50NjRfdCBtX3Zh
bHVlOworfTsKKworfSB9IC8vIG5hbWVzcGFjZSBKU0M6OkIzCisKK25hbWVzcGFjZSBXVEYgewor
Cit2b2lkIHByaW50SW50ZXJuYWwoUHJpbnRTdHJlYW0mLCBKU0M6OkIzOjpWYWx1ZVJlcDo6S2lu
ZCk7CisKK30gLy8gbmFtZXNwYWNlIFdURgorCisjZW5kaWYgLy8gQjNWYWx1ZVJlcF9oCisKSW5k
ZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9nZW5lcmF0ZV9wYXR0ZXJuX21hdGNoZXIucmIK
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL2dlbmVyYXRlX3BhdHRlcm5f
bWF0Y2hlci5yYgkocmV2aXNpb24gMCkKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9nZW5l
cmF0ZV9wYXR0ZXJuX21hdGNoZXIucmIJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSwyNyBAQAor
IyEvdXNyL2Jpbi9lbnYgcnVieQorCisjIENvcHlyaWdodCAoQykgMjAxNSBBcHBsZSBJbmMuIEFs
bCByaWdodHMgcmVzZXJ2ZWQuCisjCisjIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNl
IGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorIyBtb2RpZmljYXRpb24sIGFyZSBw
ZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyMgYXJlIG1l
dDoKKyMgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBh
Ym92ZSBjb3B5cmlnaHQKKyMgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQg
dGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorIyAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5
IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorIyAgICBub3RpY2UsIHRo
aXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhl
CisjICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRo
IHRoZSBkaXN0cmlidXRpb24uCisjCisjIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQ
TEUgSU5DLiBBTkQgSVRTIENPTlRSSUJVVE9SUyBgYEFTIElTJycKKyMgQU5EIEFOWSBFWFBSRVNT
IE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisj
IFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZP
UiBBIFBBUlRJQ1VMQVIKKyMgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hB
TEwgQVBQTEUgSU5DLiBPUiBJVFMgQ09OVFJJQlVUT1JTCisjIEJFIExJQUJMRSBGT1IgQU5ZIERJ
UkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKKyMgQ09O
U0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VS
RU1FTlQgT0YKKyMgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERB
VEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTCisjIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVT
RUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOCisjIENPTlRSQUNU
LCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhF
UldJU0UpCisjIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRX
QVJFLCBFVkVOIElGIEFEVklTRUQgT0YKKyMgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdF
LgorCiskOiA8PCBGaWxlLmRpcm5hbWUoX19GSUxFX18pCisK
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>263434</attachid>
            <date>2015-10-18 18:25:21 -0700</date>
            <delta_ts>2015-10-18 20:16:48 -0700</delta_ts>
            <desc>writing a pattern matcher</desc>
            <filename>blah.patch</filename>
            <type>text/plain</type>
            <size>170280</size>
            <attacher name="Filip Pizlo">fpizlo</attacher>
            
              <data encoding="base64">SW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9hc3NlbWJsZXIvRHluYW1pY0FkZHJlc3MuY3Bw
Cj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9hc3NlbWJsZXIvRHluYW1pY0Fk
ZHJlc3MuY3BwCShyZXZpc2lvbiAwKQorKysgU291cmNlL0phdmFTY3JpcHRDb3JlL2Fzc2VtYmxl
ci9EeW5hbWljQWRkcmVzcy5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSw1NiBAQAorLyoK
KyAqIENvcHlyaWdodCAoQykgMjAxNSBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisg
KgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywg
d2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQg
dGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3Ry
aWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAor
ICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBk
aXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVw
cm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNv
bmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3Vt
ZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmli
dXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIGBg
QVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVE
SU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1F
UkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFS
RSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUgorICogQ09OVFJJ
QlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQ
RUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5H
LCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RT
IE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lO
RVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9G
IExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9S
VAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkg
V0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQg
T0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLiAKKyAqLworCisjaW5jbHVkZSAiY29u
ZmlnLmgiCisjaW5jbHVkZSAiRHluYW1pY0FkZHJlc3MuaCIKKworI2luY2x1ZGUgIkdQUkluZm8u
aCIKKworbmFtZXNwYWNlIEpTQyB7CisKK3ZvaWQgRHluYW1pY0FkZHJlc3M6OmR1bXAoUHJpbnRT
dHJlYW0mIG91dCkgY29uc3QKK3sKKyNpZiBFTkFCTEUoQVNTRU1CTEVSKQorICAgIHN3aXRjaCAo
bV9raW5kKSB7CisgICAgY2FzZSBBZGRyZXNzOgorICAgIGNhc2UgRXh0ZW5kZWRBZGRyZXNzOgor
ICAgICAgICBvdXQucHJpbnQobV9vZmZzZXQsICIoIiwgbV9iYXNlLCAiKSIpOworICAgICAgICBy
ZXR1cm47CisgICAgY2FzZSBCYXNlSW5kZXg6CisgICAgICAgIG91dC5wcmludChtX29mZnNldCwg
IigiLCBtX2Jhc2UsICIsICIsIG1faW5kZXgsICIsICIsIDEgPDwgbV9zY2FsZSwgIikiKTsKKyAg
ICAgICAgcmV0dXJuOworICAgIGNhc2UgQWJzb2x1dGVBZGRyZXNzOgorICAgICAgICBvdXQucHJp
bnQobV9vZmZzZXQpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgUkVMRUFTRV9BU1NF
UlRfTk9UX1JFQUNIRUQoKTsKKyNlbHNlIC8vIEVOQUJMRShBU1NFTUJMRVIpCisgICAgb3V0LnBy
aW50KCIwIik7CisjZW5kaWYgLy8gRU5BQkxFKEFTU0VNQkxFUikKK30KKworfSAvLyBuYW1lc3Bh
Y2UgSlNDCisKSW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9hc3NlbWJsZXIvRHluYW1pY0Fk
ZHJlc3MuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYXNzZW1ibGVyL0R5
bmFtaWNBZGRyZXNzLmgJKHJldmlzaW9uIDApCisrKyBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYXNz
ZW1ibGVyL0R5bmFtaWNBZGRyZXNzLmgJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSwxNzggQEAK
Ky8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTUgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVk
LgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9y
bXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3Zp
ZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVk
aXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmln
aHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dp
bmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0
IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBv
ZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBk
b2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlz
dHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5D
LiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElO
Q0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBP
RiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9T
RSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IKKyAqIENP
TlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFM
LCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xV
RElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBH
T09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBC
VVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisg
KiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9S
IFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4g
QU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJ
U0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKworI2lmbmRlZiBE
eW5hbWljQWRkcmVzc19oCisjZGVmaW5lIER5bmFtaWNBZGRyZXNzX2gKKworI2luY2x1ZGUgIkFi
c3RyYWN0TWFjcm9Bc3NlbWJsZXIuaCIKKyNpbmNsdWRlIDx3dGYvUHJpbnRTdHJlYW0uaD4KKwor
bmFtZXNwYWNlIEpTQyB7CisKK2NsYXNzIER5bmFtaWNBZGRyZXNzIHsKK3B1YmxpYzoKKyAgICBl
bnVtIEtpbmQgeworICAgICAgICBBZGRyZXNzLAorICAgICAgICBFeHRlbmRlZEFkZHJlc3MsCisg
ICAgICAgIEJhc2VJbmRleCwKKyAgICAgICAgQWJzb2x1dGVBZGRyZXNzCisgICAgfTsKKworI2lm
IEVOQUJMRShBU1NFTUJMRVIpCisKKyAgICBEeW5hbWljQWRkcmVzcygpCisgICAgICAgIDogbV9r
aW5kKEFic29sdXRlQWRkcmVzcykKKyAgICAgICAgLCBtX29mZnNldCgwKQorICAgICAgICAsIG1f
YmFzZShBYnN0cmFjdE1hY3JvQXNzZW1ibGVyOjpmaXJzdFJlZ2lzdGVyKCkpCisgICAgICAgICwg
bV9pbmRleChBYnN0cmFjdE1hY3JvQXNzZW1ibGVyOjpmaXJzdFJlZ2lzdGVyKCkpCisgICAgICAg
ICwgbV9zY2FsZShBYnN0cmFjdE1hY3JvQXNzZW1ibGVyOjpUaW1lc09uZSkKKyAgICB7CisgICAg
fQorCisgICAgZXhwbGljaXQgRHluYW1pY0FkZHJlc3MoQWJzdHJhY3RNYWNyb0Fzc2VtYmxlcjo6
QWRkcmVzcyBhZGRyZXNzKQorICAgICAgICA6IG1fa2luZChBZGRyZXNzKQorICAgICAgICAsIG1f
b2Zmc2V0KGFkZHJlc3Mub2Zmc2V0KQorICAgICAgICAsIG1fYmFzZShhZGRyZXNzLmJhc2UpCisg
ICAgICAgICwgbV9pbmRleChBYnN0cmFjdE1hY3JvQXNzZW1ibGVyOjpmaXJzdFJlZ2lzdGVyKCkp
CisgICAgICAgICwgbV9zY2FsZShBYnN0cmFjdE1hY3JvQXNzZW1ibGVyOjpUaW1lc09uZSkKKyAg
ICB7CisgICAgfQorCisgICAgZXhwbGljaXQgRHluYW1pY0FkZHJlc3MoQWJzdHJhY3RNYWNyb0Fz
c2VtYmxlcjo6RXh0ZW5kZWRBZGRyZXNzIGFkZHJlc3MpCisgICAgICAgIDogbV9raW5kKEV4dGVu
ZGVkQWRkcmVzcykKKyAgICAgICAgLCBtX29mZnNldChhZGRyZXNzLm9mZnNldCkKKyAgICAgICAg
LCBtX2Jhc2UoYWRkcmVzcy5iYXNlKQorICAgICAgICAsIG1faW5kZXgoQWJzdHJhY3RNYWNyb0Fz
c2VtYmxlcjo6Zmlyc3RSZWdpc3RlcigpKQorICAgICAgICAsIG1fc2NhbGUoQWJzdHJhY3RNYWNy
b0Fzc2VtYmxlcjo6VGltZXNPbmUpCisgICAgeworICAgIH0KKworICAgIGV4cGxpY2l0IER5bmFt
aWNBZGRyZXNzKEFic3RyYWN0TWFjcm9Bc3NlbWJsZXI6OkJhc2VJbmRleCBhZGRyZXNzKQorICAg
ICAgICA6IG1fa2luZChCYXNlSW5kZXgpCisgICAgICAgICwgbV9vZmZzZXQoYWRkcmVzcy5vZmZz
ZXQpCisgICAgICAgICwgbV9iYXNlKGFkZHJlc3MuYmFzZSkKKyAgICAgICAgLCBtX2luZGV4KGFk
ZHJlc3MuaW5kZXgpCisgICAgICAgICwgbV9zY2FsZShhZGRyZXNzLnNjYWxlKQorICAgIHsKKyAg
ICB9CisKKyAgICBleHBsaWNpdCBEeW5hbWljQWRkcmVzcyhBYnN0cmFjdE1hY3JvQXNzZW1ibGVy
OjpBYnNvbHV0ZUFkZHJlc3MgYWRkcmVzcykKKyAgICAgICAgOiBtX2tpbmQoQWJzb2x1dGVBZGRy
ZXNzKQorICAgICAgICAsIG1fb2Zmc2V0KGJpdHdpc2VfY2FzdDxpbnRwdHJfdD4oYWRkcmVzcy5t
X3B0cikpCisgICAgICAgICwgbV9iYXNlKEFic3RyYWN0TWFjcm9Bc3NlbWJsZXI6OmZpcnN0UmVn
aXN0ZXIoKSkKKyAgICAgICAgLCBtX2luZGV4KEFic3RyYWN0TWFjcm9Bc3NlbWJsZXI6OmZpcnN0
UmVnaXN0ZXIoKSkKKyAgICAgICAgLCBtX3NjYWxlKEFic3RyYWN0TWFjcm9Bc3NlbWJsZXI6OlRp
bWVzT25lKQorICAgIHsKKyAgICB9CisKKyAgICBib29sIG9wZXJhdG9yPT0oY29uc3QgRHluYW1p
Y0FkZHJlc3MmIG90aGVyKSBjb25zdAorICAgIHsKKyAgICAgICAgcmV0dXJuIG1fa2luZCA9PSBv
dGhlci5tX2tpbmQKKyAgICAgICAgICAgICYmIG1fb2Zmc2V0ID09IG90aGVyLm1fb2Zmc2V0Cisg
ICAgICAgICAgICAmJiBtX2Jhc2UgPT0gb3RoZXIubV9iYXNlCisgICAgICAgICAgICAmJiBtX2lu
ZGV4ID09IG90aGVyLm1faW5kZXgKKyAgICAgICAgICAgICYmIG1fc2NhbGUgPT0gb3RoZXIubV9z
Y2FsZTsKKyAgICB9CisKKyAgICBib29sIG9wZXJhdG9yIT0oY29uc3QgRHluYW1pY0FkZHJlc3Mm
IG90aGVyKSBjb25zdAorICAgIHsKKyAgICAgICAgcmV0dXJuICEoKnRoaXMgPT0gb3RoZXIpOwor
ICAgIH0KKworICAgIGV4cGxpY2l0IG9wZXJhdG9yIGJvb2woKSBjb25zdAorICAgIHsKKyAgICAg
ICAgcmV0dXJuICp0aGlzICE9IER5bmFtaWNBZGRyZXNzKCk7CisgICAgfQorCisgICAgS2luZCBr
aW5kKCkgY29uc3QgeyByZXR1cm4gbV9raW5kOyB9CisKKyAgICBBYnN0cmFjdE1hY3JvQXNzZW1i
bGVyOjpBZGRyZXNzIGFzQWRkcmVzcygpIGNvbnN0CisgICAgeworICAgICAgICBBU1NFUlQobV9r
aW5kID09IEFkZHJlc3MpOworICAgICAgICByZXR1cm4gQWJzdHJhY3RNYWNyb0Fzc2VtYmxlcjo6
QWRkcmVzcyhtX2Jhc2UsIHN0YXRpY19jYXN0PGludDMyX3Q+KG1fb2Zmc2V0KSk7CisgICAgfQor
CisgICAgQWJzdHJhY3RNYWNyb0Fzc2VtYmxlcjo6RXh0ZW5kZWRBZGRyZXNzIGFzRXh0ZW5kZWRB
ZGRyZXNzKCkgY29uc3QKKyAgICB7CisgICAgICAgIEFTU0VSVChtX2tpbmQgPT0gRXh0ZW5kZWRB
ZGRyZXNzKTsKKyAgICAgICAgcmV0dXJuIEFic3RyYWN0TWFjcm9Bc3NlbWJsZXI6OkV4dGVuZGVk
QWRkcmVzcyhtX2Jhc2UsIG1fb2Zmc2V0KTsKKyAgICB9CisKKyAgICBBYnN0cmFjdE1hY3JvQXNz
ZW1ibGVyOjpCYXNlSW5kZXggYXNCYXNlSW5kZXgoKSBjb25zdAorICAgIHsKKyAgICAgICAgQVNT
RVJUKG1fa2luZCA9PSBCYXNlSW5kZXgpOworICAgICAgICByZXR1cm4gQWJzdHJhY3RNYWNyb0Fz
c2VtYmxlcjo6QmFzZUluZGV4KG1fYmFzZSwgbV9pbmRleCwgbV9zY2FsZSwgbV9vZmZzZXQpOwor
ICAgIH0KKworICAgIEFic3RyYWN0TWFjcm9Bc3NlbWJsZXI6OkFic29sdXRlQWRkcmVzcyBhc0Fi
c29sdXRlQWRkcmVzcygpIGNvbnN0CisgICAgeworICAgICAgICBBU1NFUlQobV9raW5kID09IEFi
c29sdXRlQWRkcmVzcyk7CisgICAgICAgIHJldHVybiBBYnN0cmFjdE1hY3JvQXNzZW1ibGVyOjpB
YnNvbHV0ZUFkZHJlc3MoYml0d2lzZV9jYXN0PGNvbnN0IHZvaWQqPihtX29mZnNldCkpOworICAg
IH0KKworICAgIHZvaWQgZHVtcChQcmludFN0cmVhbSYpIGNvbnN0OworCitwcml2YXRlOgorICAg
IEtpbmQgbV9raW5kOworICAgIGludHB0cl90IG1fb2Zmc2V0OworICAgIEFic3RyYWN0TWFjcm9B
c3NlbWJsZXI6OlJlZ2lzdGVySUQgbV9iYXNlOworICAgIEFic3RyYWN0TWFjcm9Bc3NlbWJsZXI6
OlJlZ2lzdGVySUQgbV9pbmRleDsKKyAgICBBYnN0cmFjdE1hY3JvQXNzZW1ibGVyOjpTY2FsZSBt
X3NjYWxlOworCisjZWxzZSAvLyBFTkFCTEUoQVNTRU1CTEVSKQorCitwdWJsaWM6CisKKyAgICBE
eW5hbWljQWRkcmVzcygpIHsgfQorCisgICAgZXhwbGljaXQgb3BlcmF0b3IgYm9vbCgpIGNvbnN0
IHsgcmV0dXJuIGZhbHNlOyB9CisgICAgS2luZCBraW5kKCkgY29uc3QgeyByZXR1cm4gQWJzb2x1
dGVBZGRyZXNzOyB9CisKKyAgICB2b2lkIGR1bXAoUHJpbnRTdHJlYW0mKSBjb25zdDsKKyAgICAK
KyNlbmRpZiAvLyBFTkFCTEUoQVNTRU1CTEVSKQorCitwdWJsaWM6CisKKyAgICBib29sIGlzT25l
T2YoKSBjb25zdAorICAgIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHRl
bXBsYXRlPHR5cGVuYW1lLi4uIEFyZ3VtZW50cz4KKyAgICBib29sIGlzT25lT2YoS2luZCBraW5k
LCBBcmd1bWVudHMuLi4gYXJndW1lbnRzKSBjb25zdAorICAgIHsKKyAgICAgICAgaWYgKGtpbmQo
KSA9PSBraW5kKQorICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIHJldHVybiBpc09u
ZU9mKGFyZ3VtZW50cy4uLik7CisgICAgfQorfTsKKworfSAvLyBuYW1lc3BhY2UgSlNDCisKKyNl
bmRpZiAvLyBFTkFCTEUoQVNTRU1CTEVSKQorCisjZW5kaWYgLy8gRHluYW1pY0FkZHJlc3NfaAor
CkluZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYXNzZW1ibGVyL01hY3JvQXNzZW1ibGVyLmgK
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRDb3JlL2Fzc2VtYmxlci9NYWNyb0Fzc2Vt
Ymxlci5oCShyZXZpc2lvbiAxOTEyMzkpCisrKyBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYXNzZW1i
bGVyL01hY3JvQXNzZW1ibGVyLmgJKHdvcmtpbmcgY29weSkKQEAgLTEyMSwxMCArMTIxLDIzIEBA
IHB1YmxpYzoKICAgICB1c2luZyBNYWNyb0Fzc2VtYmxlckJhc2U6OmJyYW5jaFB0cjsKICNlbmRp
ZgogICAgIHVzaW5nIE1hY3JvQXNzZW1ibGVyQmFzZTo6YnJhbmNoU3ViMzI7CisgICAgdXNpbmcg
TWFjcm9Bc3NlbWJsZXJCYXNlOjpicmFuY2g4OworICAgIHVzaW5nIE1hY3JvQXNzZW1ibGVyQmFz
ZTo6bG9hZDMyOworICAgIHVzaW5nIE1hY3JvQXNzZW1ibGVyQmFzZTo6bG9hZDg7CisgICAgdXNp
bmcgTWFjcm9Bc3NlbWJsZXJCYXNlOjpsb2FkOFNpZ25FeHRlbmRUbzMyOworICAgIHVzaW5nIE1h
Y3JvQXNzZW1ibGVyQmFzZTo6bG9hZDE2OworICAgIHVzaW5nIE1hY3JvQXNzZW1ibGVyQmFzZTo6
bG9hZDE2U2lnbkV4dGVuZFRvMzI7CisgICAgdXNpbmcgTWFjcm9Bc3NlbWJsZXJCYXNlOjpsb2Fk
RG91YmxlOworICAgIHVzaW5nIE1hY3JvQXNzZW1ibGVyQmFzZTo6bG9hZEZsb2F0OwogICAgIHVz
aW5nIE1hY3JvQXNzZW1ibGVyQmFzZTo6bHNoaWZ0MzI7CisgICAgdXNpbmcgTWFjcm9Bc3NlbWJs
ZXJCYXNlOjptdWwzMjsKICAgICB1c2luZyBNYWNyb0Fzc2VtYmxlckJhc2U6Om9yMzI7CiAgICAg
dXNpbmcgTWFjcm9Bc3NlbWJsZXJCYXNlOjpyc2hpZnQzMjsKICAgICB1c2luZyBNYWNyb0Fzc2Vt
YmxlckJhc2U6OnN0b3JlMzI7CisgICAgdXNpbmcgTWFjcm9Bc3NlbWJsZXJCYXNlOjpzdG9yZTg7
CisgICAgdXNpbmcgTWFjcm9Bc3NlbWJsZXJCYXNlOjpzdG9yZTE2OworICAgIHVzaW5nIE1hY3Jv
QXNzZW1ibGVyQmFzZTo6c3RvcmVEb3VibGU7CisgICAgdXNpbmcgTWFjcm9Bc3NlbWJsZXJCYXNl
OjpzdG9yZUZsb2F0OwogICAgIHVzaW5nIE1hY3JvQXNzZW1ibGVyQmFzZTo6c3ViMzI7CiAgICAg
dXNpbmcgTWFjcm9Bc3NlbWJsZXJCYXNlOjp1cnNoaWZ0MzI7CiAgICAgdXNpbmcgTWFjcm9Bc3Nl
bWJsZXJCYXNlOjp4b3IzMjsKQEAgLTE1ODQsNiArMTU5Nyw3MDAgQEAgcHVibGljOgogICAgICAg
ICB1cnNoaWZ0MzIoc3JjLCB0cnVzdGVkSW1tMzJGb3JTaGlmdChhbW91bnQpLCBkZXN0KTsKICAg
ICB9CiAKKyAgICBib29sIHRyeUFkZDMyKFJlZ2lzdGVySUQgc3JjLCBEeW5hbWljQWRkcmVzcyBh
ZGRyZXNzKQorICAgIHsKKyAgICAgICAgc3dpdGNoIChhZGRyZXNzLmtpbmQoKSkgeworICAgICAg
ICBjYXNlIER5bmFtaWNBZGRyZXNzOjpBZGRyZXNzOgorICAgICAgICAgICAgYWRkMzIoc3JjLCBh
ZGRyZXNzLmFzQWRkcmVzcygpKTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICBk
ZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgfQorICAg
IHZvaWQgYWRkMzIoUmVnaXN0ZXJJRCBzcmMsIER5bmFtaWNBZGRyZXNzIGFkZHJlc3MpCisgICAg
eworICAgICAgICBSRUxFQVNFX0FTU0VSVCh0cnlBZGQzMihzcmMsIGFkZHJlc3MpKTsKKyAgICB9
CisKKyAgICAvLyBJdCdzIG5vdCBjbGVhciBpZiB0aGUgc2VtYW50aWNzIGhlcmUgc2hvdWxkIGJl
IHRvIHJldHVybiB0cnVlIGZvciBhbnkgYWRkcmVzcyBleHByZXNzaW9uCisgICAgLy8gZm9yIHdo
aWNoIHdlIGtub3cgaG93IHRvIGVtaXQgY29kZSwgb3IgdG8gb25seSBlbWl0IHRydWUgd2hlbiB3
ZSBrbm93IGhvdyB0byBlbWl0IGl0CisgICAgLy8gZWZmaWNpZW50bHkuIEknbSBjdXJyZW50bHkg
Z29pbmcgd2l0aCBzdXBwb3J0aW5nIGFsbCBvZiB0aGUgZXhwcmVzc2lvbnMgZm9yIHdoaWNoIHdl
IGtub3cKKyAgICAvLyBob3cgdG8gZW1pdCBjb2RlIGF0IGFsbCwgYW5kIEknbSBsZWF2aW5nIGl0
IHRvIGNsaWVudHMgdG8gZGVhbCB3aXRoIHRoZSBlZmZpY2llbmN5IHBhcnQuCisgICAgCisgICAg
Ym9vbCB0cnlBZGQzMihUcnVzdGVkSW1tMzIgaW1tLCBEeW5hbWljQWRkcmVzcyBhZGRyZXNzKQor
ICAgIHsKKyAgICAgICAgc3dpdGNoIChhZGRyZXNzLmtpbmQoKSkgeworICAgICAgICBjYXNlIER5
bmFtaWNBZGRyZXNzOjpBZGRyZXNzOgorICAgICAgICAgICAgYWRkMzIoaW1tLCBhZGRyZXNzLmFz
QWRkcmVzcygpKTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICBjYXNlIER5bmFt
aWNBZGRyZXNzOjpBYnNvbHV0ZUFkZHJlc3M6CisgICAgICAgICAgICBhZGQzMihpbW0sIGFkZHJl
c3MuYXNBYnNvbHV0ZUFkZHJlc3MoKSk7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAg
ICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgIH0K
KyAgICB2b2lkIGFkZDMyKFRydXN0ZWRJbW0zMiBpbW0sIER5bmFtaWNBZGRyZXNzIGFkZHJlc3Mp
CisgICAgeworICAgICAgICBSRUxFQVNFX0FTU0VSVCh0cnlBZGQzMihpbW0sIGFkZHJlc3MpKTsK
KyAgICB9CisKKyAgICBib29sIHRyeUFkZDMyKER5bmFtaWNBZGRyZXNzIGFkZHJlc3MsIFJlZ2lz
dGVySUQgZGVzdCkKKyAgICB7CisgICAgICAgIHN3aXRjaCAoYWRkcmVzcy5raW5kKCkpIHsKKyAg
ICAgICAgY2FzZSBEeW5hbWljQWRkcmVzczo6QWRkcmVzczoKKyAgICAgICAgICAgIGFkZDMyKGFk
ZHJlc3MuYXNBZGRyZXNzKCksIGRlc3QpOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAg
ICAgIGNhc2UgRHluYW1pY0FkZHJlc3M6OkFic29sdXRlQWRkcmVzczoKKyAgICAgICAgICAgIGFk
ZDMyKGFkZHJlc3MuYXNBYnNvbHV0ZUFkZHJlc3MoKSwgZGVzdCk7CisgICAgICAgICAgICByZXR1
cm4gdHJ1ZTsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHJ1biBmYWxzZTsKKyAg
ICAgICAgfQorICAgIH0KKyAgICB2b2lkIGFkZDMyKER5bmFtaWNBZGRyZXNzIGFkZHJlc3MsIFJl
Z2lzdGVySUQgZGVzdCkKKyAgICB7CisgICAgICAgIFJFTEVBU0VfQVNTRVJUKHRyeUFkZDMyKGFk
ZHJlc3MsIGRlc3QpKTsKKyAgICB9CisKKyAgICBib29sIHRyeUFuZDMyKFJlZ2lzdGVySUQgc3Jj
LCBEeW5hbWljQWRkcmVzcyBhZGRyZXNzKQorICAgIHsKKyAgICAgICAgc3dpdGNoIChhZGRyZXNz
LmtpbmQoKSkgeworICAgICAgICBjYXNlIER5bmFtaWNBZGRyZXNzOjpBZGRyZXNzOgorICAgICAg
ICAgICAgYW5kMzIoc3JjLCBhZGRyZXNzLmFzQWRkcmVzcygpKTsKKyAgICAgICAgICAgIHJldHVy
biB0cnVlOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAg
ICAgICB9CisgICAgfQorICAgIHZvaWQgYW5kMzIoUmVnaXN0ZXJJRCBzcmMsIER5bmFtaWNBZGRy
ZXNzIGFkZHJlc3MpCisgICAgeworICAgICAgICBSRUxFQVNFX0FTU0VSVCh0cnlBbmQzMihzcmMs
IGFkZHJlc3MpKTsKKyAgICB9CisKKyAgICBib29sIHRyeUFuZDMyKFRydXN0ZWRJbW0zMiBpbW0s
IER5bmFtaWNBZGRyZXNzIGFkZHJlc3MpCisgICAgeworICAgICAgICBzd2l0Y2ggKGFkZHJlc3Mu
a2luZCgpKSB7CisgICAgICAgIGNhc2UgRHluYW1pY0FkZHJlc3M6OkFkZHJlc3M6CisgICAgICAg
ICAgICBhbmQzMihpbW0sIGFkZHJlc3MuYXNBZGRyZXNzKCkpOworICAgICAgICAgICAgcmV0dXJu
IHRydWU7CisgICAgICAgIGNhc2UgRHluYW1pY0FkZHJlc3M6OkFic29sdXRlQWRkcmVzczoKKyAg
ICAgICAgICAgIGFuZDMyKGltbSwgYWRkcmVzcy5hc0Fic29sdXRlQWRkcmVzcygpKTsKKyAgICAg
ICAgICAgIHJldHVybiB0cnVlOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJu
IGZhbHNlOworICAgICAgICB9CisgICAgfQorICAgIHZvaWQgYW5kMzIoVHJ1c3RlZEltbTMyIGlt
bSwgRHluYW1pY0FkZHJlc3MgYWRkcmVzcykKKyAgICB7CisgICAgICAgIFJFTEVBU0VfQVNTRVJU
KHRyeUFuZDMyKGltbSwgYWRkcmVzcykpOworICAgIH0KKworICAgIGJvb2wgdHJ5QW5kMzIoRHlu
YW1pY0FkZHJlc3MgYWRkcmVzcywgUmVnaXN0ZXJJRCBkZXN0KQorICAgIHsKKyAgICAgICAgc3dp
dGNoIChhZGRyZXNzLmtpbmQoKSkgeworICAgICAgICBjYXNlIER5bmFtaWNBZGRyZXNzOjpBZGRy
ZXNzOgorICAgICAgICAgICAgYW5kMzIoYWRkcmVzcy5hc0FkZHJlc3MoKSwgZGVzdCk7CisgICAg
ICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVy
biBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KKyAgICB2b2lkIGFuZDMyKER5bmFtaWNBZGRyZXNz
IGFkZHJlc3MsIFJlZ2lzdGVySUQgZGVzdCkKKyAgICB7CisgICAgICAgIFJFTEVBU0VfQVNTRVJU
KHRyeUFkZDMyKGFkZHJlc3MsIGRlc3QpKTsKKyAgICB9CisKKyAgICBib29sIHRyeU11bDMyKER5
bmFtaWNBZGRyZXNzIGFkZHJlc3MsIFJlZ2lzdGVySUQgZGVzdCkKKyAgICB7CisgICAgICAgIHN3
aXRjaCAoYWRkcmVzcy5raW5kKCkpIHsKKyAgICAgICAgY2FzZSBEeW5hbWljQWRkcmVzczo6QWRk
cmVzczoKKyAgICAgICAgICAgIG11bDMyKGFkZHJlc3MuYXNBZGRyZXNzKCksIGRlc3QpOworICAg
ICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1
cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisgICAgdm9pZCBtdWwzMihEeW5hbWljQWRkcmVz
cyBhZGRyZXNzLCBSZWdpc3RlcklEIGRlc3QpCisgICAgeworICAgICAgICBSRUxFQVNFX0FTU0VS
VCh0cnlNdWwzMihhZGRyZXNzLCBkZXN0KSk7CisgICAgfQorCisgICAgYm9vbCB0cnlOZWczMihE
eW5hbWljQWRkcmVzcyBhZGRyZXNzKQorICAgIHsKKyAgICAgICAgc3dpdGNoIChhZGRyZXNzLmtp
bmQoKSkgeworICAgICAgICBjYXNlIER5bmFtaWNBZGRyZXNzOjpBZGRyZXNzOgorICAgICAgICAg
ICAgbmVnMzIoYWRkcmVzcy5hc0FkZHJlc3MoKSk7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsK
KyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQor
ICAgIH0KKyAgICB2b2lkIG5lZzMyKER5bmFtaWNBZGRyZXNzIGFkZHJlc3MpCisgICAgeworICAg
ICAgICBSRUxFQVNFX0FTU0VSVCh0cnlOZWczMihhZGRyZXNzKSk7CisgICAgfQorCisgICAgLy8g
RklYTUU6IExvdHMgb2YgbWlzc2luZyBjYXNlcyBoZXJlIQorCisgICAgYm9vbCB0cnlMb2FkMzIo
RHluYW1pY0FkZHJlc3MgYWRkcmVzcywgUmVnaXN0ZXJJRCBkZXN0KQorICAgIHsKKyAgICAgICAg
c3dpdGNoIChhZGRyZXNzLmtpbmQoKSkgeworICAgICAgICBjYXNlIER5bmFtaWNBZGRyZXNzOjpB
ZGRyZXNzOgorICAgICAgICAgICAgbG9hZDMyKGFkZHJlc3MuYXNBZGRyZXNzKCksIGRlc3QpOwor
ICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIGNhc2UgRHluYW1pY0FkZHJlc3M6OkJh
c2VJbmRleDoKKyAgICAgICAgICAgIGxvYWQzMihhZGRyZXNzLmFzQmFzZUluZGV4KCksIGRlc3Qp
OworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIGNhc2UgRHluYW1pY0FkZHJlc3M6
OkFic29sdXRlQWRkcmVzczoKKyAgICAgICAgICAgIGxvYWQzMihhZGRyZXNzLmFzQWJzb2x1dGVB
ZGRyZXNzKCkubV9wdHIsIGRlc3QpOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAg
IGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICB9Cisg
ICAgdm9pZCBsb2FkMzIoRHluYW1pY0FkZHJlc3MgYWRkcmVzcywgUmVnaXN0ZXJJRCBkZXN0KQor
ICAgIHsKKyAgICAgICAgUkVMRUFTRV9BU1NFUlQodHJ5TG9hZDMyKGFkZHJlc3MsIGRlc3QpKTsK
KyAgICB9CisKKyAgICBib29sIHRyeUxvYWQ4KER5bmFtaWNBZGRyZXNzIGFkZHJlc3MsIFJlZ2lz
dGVySUQgZGVzdCkKKyAgICB7CisgICAgICAgIHN3aXRjaCAoYWRkcmVzcy5raW5kKCkpIHsKKyAg
ICAgICAgY2FzZSBEeW5hbWljQWRkcmVzczo6QWRkcmVzczoKKyAgICAgICAgICAgIGxvYWQ4KGFk
ZHJlc3MuYXNBZGRyZXNzKCksIGRlc3QpOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAg
ICAgIGNhc2UgRHluYW1pY0FkZHJlc3M6OkJhc2VJbmRleDoKKyAgICAgICAgICAgIGxvYWQ4KGFk
ZHJlc3MuYXNCYXNlSW5kZXgoKSwgZGVzdCk7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAg
ICAgICAgY2FzZSBEeW5hbWljQWRkcmVzczo6QWJzb2x1dGVBZGRyZXNzOgorICAgICAgICAgICAg
bG9hZDgoYWRkcmVzcy5hc0Fic29sdXRlQWRkcmVzcygpLm1fcHRyLCBkZXN0KTsKKyAgICAgICAg
ICAgIHJldHVybiB0cnVlOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuIGZh
bHNlOworICAgICAgICB9CisgICAgfQorICAgIHZvaWQgbG9hZDgoRHluYW1pY0FkZHJlc3MgYWRk
cmVzcywgUmVnaXN0ZXJJRCBkZXN0KQorICAgIHsKKyAgICAgICAgUkVMRUFTRV9BU1NFUlQodHJ5
TG9hZDgoYWRkcmVzcywgZGVzdCkpOworICAgIH0KKworICAgIGJvb2wgdHJ5TG9hZDhTaWduRXh0
ZW5kVG8zMihEeW5hbWljQWRkcmVzcyBhZGRyZXNzLCBSZWdpc3RlcklEIGRlc3QpCisgICAgewor
ICAgICAgICBzd2l0Y2ggKGFkZHJlc3Mua2luZCgpKSB7CisgICAgICAgIGNhc2UgRHluYW1pY0Fk
ZHJlc3M6OkFkZHJlc3M6CisgICAgICAgICAgICBsb2FkOFNpZ25FeHRlbmRUbzMyKGFkZHJlc3Mu
YXNBZGRyZXNzKCksIGRlc3QpOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIGNh
c2UgRHluYW1pY0FkZHJlc3M6OkJhc2VJbmRleDoKKyAgICAgICAgICAgIGxvYWQ4U2lnbkV4dGVu
ZFRvMzIoYWRkcmVzcy5hc0Jhc2VJbmRleCgpLCBkZXN0KTsKKyAgICAgICAgICAgIHJldHVybiB0
cnVlOworICAgICAgICBjYXNlIER5bmFtaWNBZGRyZXNzOjpBYnNvbHV0ZUFkZHJlc3M6CisgICAg
ICAgICAgICBsb2FkOFNpZ25FeHRlbmRUbzMyKGFkZHJlc3MuYXNBYnNvbHV0ZUFkZHJlc3MoKS5t
X3B0ciwgZGVzdCk7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgZGVmYXVsdDoK
KyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KKyAgICB2b2lkIGxv
YWQ4U2lnbkV4dGVuZFRvMzIoRHluYW1pY0FkZHJlc3MgYWRkcmVzcywgUmVnaXN0ZXJJRCBkZXN0
KQorICAgIHsKKyAgICAgICAgUkVMRUFTRV9BU1NFUlQodHJ5TG9hZDhTaWduRXh0ZW5kVG8zMihh
ZGRyZXNzLCBkZXN0KSk7CisgICAgfQorCisgICAgYm9vbCB0cnlMb2FkMTYoRHluYW1pY0FkZHJl
c3MgYWRkcmVzcywgUmVnaXN0ZXJJRCBkZXN0KQorICAgIHsKKyAgICAgICAgc3dpdGNoIChhZGRy
ZXNzLmtpbmQoKSkgeworICAgICAgICBjYXNlIER5bmFtaWNBZGRyZXNzOjpBZGRyZXNzOgorICAg
ICAgICAgICAgbG9hZDE2KGFkZHJlc3MuYXNBZGRyZXNzKCksIGRlc3QpOworICAgICAgICAgICAg
cmV0dXJuIHRydWU7CisgICAgICAgIGNhc2UgRHluYW1pY0FkZHJlc3M6OkJhc2VJbmRleDoKKyAg
ICAgICAgICAgIGxvYWQxNihhZGRyZXNzLmFzQmFzZUluZGV4KCksIGRlc3QpOworICAgICAgICAg
ICAgcmV0dXJuIHRydWU7CisgICAgICAgIGNhc2UgRHluYW1pY0FkZHJlc3M6OkFic29sdXRlQWRk
cmVzczoKKyAgICAgICAgICAgIGxvYWQxNihhZGRyZXNzLmFzQWJzb2x1dGVBZGRyZXNzKCkubV9w
dHIsIGRlc3QpOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIGRlZmF1bHQ6Cisg
ICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisgICAgdm9pZCBsb2Fk
MTYoRHluYW1pY0FkZHJlc3MgYWRkcmVzcywgUmVnaXN0ZXJJRCBkZXN0KQorICAgIHsKKyAgICAg
ICAgUkVMRUFTRV9BU1NFUlQodHJ5TG9hZDE2KGFkZHJlc3MsIGRlc3QpKTsKKyAgICB9CisKKyAg
ICBib29sIHRyeUxvYWQxNlNpZ25FeHRlbmRUbzMyKER5bmFtaWNBZGRyZXNzIGFkZHJlc3MsIFJl
Z2lzdGVySUQgZGVzdCkKKyAgICB7CisgICAgICAgIHN3aXRjaCAoYWRkcmVzcy5raW5kKCkpIHsK
KyAgICAgICAgY2FzZSBEeW5hbWljQWRkcmVzczo6QWRkcmVzczoKKyAgICAgICAgICAgIGxvYWQx
NlNpZ25FeHRlbmRUbzMyKGFkZHJlc3MuYXNBZGRyZXNzKCksIGRlc3QpOworICAgICAgICAgICAg
cmV0dXJuIHRydWU7CisgICAgICAgIGNhc2UgRHluYW1pY0FkZHJlc3M6OkJhc2VJbmRleDoKKyAg
ICAgICAgICAgIGxvYWQxNlNpZ25FeHRlbmRUbzMyKGFkZHJlc3MuYXNCYXNlSW5kZXgoKSwgZGVz
dCk7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgY2FzZSBEeW5hbWljQWRkcmVz
czo6QWJzb2x1dGVBZGRyZXNzOgorICAgICAgICAgICAgbG9hZDE2U2lnbkV4dGVuZFRvMzIoYWRk
cmVzcy5hc0Fic29sdXRlQWRkcmVzcygpLm1fcHRyLCBkZXN0KTsKKyAgICAgICAgICAgIHJldHVy
biB0cnVlOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAg
ICAgICB9CisgICAgfQorICAgIHZvaWQgbG9hZDE2U2lnbkV4dGVuZFRvMzIoRHluYW1pY0FkZHJl
c3MgYWRkcmVzcywgUmVnaXN0ZXJJRCBkZXN0KQorICAgIHsKKyAgICAgICAgUkVMRUFTRV9BU1NF
UlQodHJ5TG9hZDE2U2lnbkV4dGVuZFRvMzIoYWRkcmVzcywgZGVzdCkpOworICAgIH0KKworICAg
IGJvb2wgdHJ5U3RvcmUzMihSZWdpc3RlcklEIHNyYywgRHluYW1pY0FkZHJlc3MgYWRkcmVzcykK
KyAgICB7CisgICAgICAgIHN3aXRjaCAoYWRkcmVzcy5raW5kKCkpIHsKKyAgICAgICAgY2FzZSBE
eW5hbWljQWRkcmVzczo6QWRkcmVzczoKKyAgICAgICAgICAgIHN0b3JlMzIoc3JjLCBhZGRyZXNz
LmFzQWRkcmVzcygpKTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICBjYXNlIER5
bmFtaWNBZGRyZXNzOjpCYXNlSW5kZXg6CisgICAgICAgICAgICBzdG9yZTMyKHNyYywgYWRkcmVz
cy5hc0Jhc2VJbmRleCgpKTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICBjYXNl
IER5bmFtaWNBZGRyZXNzOjpBYnNvbHV0ZUFkZHJlc3M6CisgICAgICAgICAgICBzdG9yZTMyKHNy
YywgYWRkcmVzcy5hc0Fic29sdXRlQWRkcmVzcygpLm1fcHRyKTsKKyAgICAgICAgICAgIHJldHVy
biB0cnVlOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAg
ICAgICB9CisgICAgfQorICAgIHZvaWQgc3RvcmUzMihSZWdpc3RlcklEIHNyYywgRHluYW1pY0Fk
ZHJlc3MgYWRkcmVzcykKKyAgICB7CisgICAgICAgIFJFTEVBU0VfQVNTRVJUKHRyeVN0b3JlMzIo
c3JjLCBhZGRyZXNzKSk7CisgICAgfQorCisgICAgYm9vbCB0cnlTdG9yZTMyKFRydXN0ZWRJbW0z
MiBzcmMsIER5bmFtaWNBZGRyZXNzIGFkZHJlc3MpCisgICAgeworICAgICAgICBzd2l0Y2ggKGFk
ZHJlc3Mua2luZCgpKSB7CisgICAgICAgIGNhc2UgRHluYW1pY0FkZHJlc3M6OkFkZHJlc3M6Cisg
ICAgICAgICAgICBzdG9yZTMyKHNyYywgYWRkcmVzcy5hc0FkZHJlc3MoKSk7CisgICAgICAgICAg
ICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgY2FzZSBEeW5hbWljQWRkcmVzczo6QmFzZUluZGV4Ogor
ICAgICAgICAgICAgc3RvcmUzMihzcmMsIGFkZHJlc3MuYXNCYXNlSW5kZXgoKSk7CisgICAgICAg
ICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgY2FzZSBEeW5hbWljQWRkcmVzczo6QWJzb2x1dGVB
ZGRyZXNzOgorICAgICAgICAgICAgc3RvcmUzMihzcmMsIGFkZHJlc3MuYXNBYnNvbHV0ZUFkZHJl
c3MoKS5tX3B0cik7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgZGVmYXVsdDoK
KyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KKyAgICB2b2lkIHN0
b3JlMzIoVHJ1c3RlZEltbTMyIHNyYywgRHluYW1pY0FkZHJlc3MgYWRkcmVzcykKKyAgICB7Cisg
ICAgICAgIFJFTEVBU0VfQVNTRVJUKHRyeVN0b3JlMzIoc3JjLCBhZGRyZXNzKSk7CisgICAgfQor
CisgICAgYm9vbCB0cnlTdG9yZTgoUmVnaXN0ZXJJRCBzcmMsIER5bmFtaWNBZGRyZXNzIGFkZHJl
c3MpCisgICAgeworICAgICAgICBzd2l0Y2ggKGFkZHJlc3Mua2luZCgpKSB7CisgICAgICAgIGNh
c2UgRHluYW1pY0FkZHJlc3M6OkFkZHJlc3M6CisgICAgICAgICAgICBzdG9yZTgoc3JjLCBhZGRy
ZXNzLmFzQWRkcmVzcygpKTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICBjYXNl
IER5bmFtaWNBZGRyZXNzOjpCYXNlSW5kZXg6CisgICAgICAgICAgICBzdG9yZTgoc3JjLCBhZGRy
ZXNzLmFzQmFzZUluZGV4KCkpOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIGNh
c2UgRHluYW1pY0FkZHJlc3M6OkFic29sdXRlQWRkcmVzczoKKyAgICAgICAgICAgIHN0b3JlOChz
cmMsIGFkZHJlc3MuYXNBYnNvbHV0ZUFkZHJlc3MoKS5tX3B0cik7CisgICAgICAgICAgICByZXR1
cm4gdHJ1ZTsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAg
ICAgICAgfQorICAgIH0KKyAgICB2b2lkIHN0b3JlOChSZWdpc3RlcklEIHNyYywgRHluYW1pY0Fk
ZHJlc3MgYWRkcmVzcykKKyAgICB7CisgICAgICAgIFJFTEVBU0VfQVNTRVJUKHRyeVN0b3JlOChz
cmMsIGFkZHJlc3MpKTsKKyAgICB9CisKKyAgICBib29sIHRyeVN0b3JlOChUcnVzdGVkSW1tMzIg
c3JjLCBEeW5hbWljQWRkcmVzcyBhZGRyZXNzKQorICAgIHsKKyAgICAgICAgc3dpdGNoIChhZGRy
ZXNzLmtpbmQoKSkgeworICAgICAgICBjYXNlIER5bmFtaWNBZGRyZXNzOjpBZGRyZXNzOgorICAg
ICAgICAgICAgc3RvcmU4KHNyYywgYWRkcmVzcy5hc0FkZHJlc3MoKSk7CisgICAgICAgICAgICBy
ZXR1cm4gdHJ1ZTsKKyAgICAgICAgY2FzZSBEeW5hbWljQWRkcmVzczo6QmFzZUluZGV4OgorICAg
ICAgICAgICAgc3RvcmU4KHNyYywgYWRkcmVzcy5hc0Jhc2VJbmRleCgpKTsKKyAgICAgICAgICAg
IHJldHVybiB0cnVlOworICAgICAgICBjYXNlIER5bmFtaWNBZGRyZXNzOjpBYnNvbHV0ZUFkZHJl
c3M6CisgICAgICAgICAgICBzdG9yZTgoc3JjLCBhZGRyZXNzLmFzQWJzb2x1dGVBZGRyZXNzKCku
bV9wdHIpOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIGRlZmF1bHQ6CisgICAg
ICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisgICAgdm9pZCBzdG9yZTgo
VHJ1c3RlZEltbTMyIHNyYywgRHluYW1pY0FkZHJlc3MgYWRkcmVzcykKKyAgICB7CisgICAgICAg
IFJFTEVBU0VfQVNTRVJUKHRyeVN0b3JlOChzcmMsIGFkZHJlc3MpKTsKKyAgICB9CisKKyAgICBi
b29sIHRyeVN0b3JlMTYoUmVnaXN0ZXJJRCBzcmMsIER5bmFtaWNBZGRyZXNzIGFkZHJlc3MpCisg
ICAgeworICAgICAgICBzd2l0Y2ggKGFkZHJlc3Mua2luZCgpKSB7CisgICAgICAgIGNhc2UgRHlu
YW1pY0FkZHJlc3M6OkFkZHJlc3M6CisgICAgICAgICAgICBzdG9yZTE2KHNyYywgYWRkcmVzcy5h
c0FkZHJlc3MoKSk7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgY2FzZSBEeW5h
bWljQWRkcmVzczo6QmFzZUluZGV4OgorICAgICAgICAgICAgc3RvcmUxNihzcmMsIGFkZHJlc3Mu
YXNCYXNlSW5kZXgoKSk7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgY2FzZSBE
eW5hbWljQWRkcmVzczo6QWJzb2x1dGVBZGRyZXNzOgorICAgICAgICAgICAgc3RvcmUxNihzcmMs
IGFkZHJlc3MuYXNBYnNvbHV0ZUFkZHJlc3MoKS5tX3B0cik7CisgICAgICAgICAgICByZXR1cm4g
dHJ1ZTsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAg
ICAgfQorICAgIH0KKyAgICB2b2lkIHN0b3JlMTYoUmVnaXN0ZXJJRCBzcmMsIER5bmFtaWNBZGRy
ZXNzIGFkZHJlc3MpCisgICAgeworICAgICAgICBSRUxFQVNFX0FTU0VSVCh0cnlTdG9yZTE2KHNy
YywgYWRkcmVzcykpOworICAgIH0KKworICAgIGJvb2wgdHJ5U3RvcmUxNihUcnVzdGVkSW1tMzIg
c3JjLCBEeW5hbWljQWRkcmVzcyBhZGRyZXNzKQorICAgIHsKKyAgICAgICAgc3dpdGNoIChhZGRy
ZXNzLmtpbmQoKSkgeworICAgICAgICBjYXNlIER5bmFtaWNBZGRyZXNzOjpBZGRyZXNzOgorICAg
ICAgICAgICAgc3RvcmUxNihzcmMsIGFkZHJlc3MuYXNBZGRyZXNzKCkpOworICAgICAgICAgICAg
cmV0dXJuIHRydWU7CisgICAgICAgIGNhc2UgRHluYW1pY0FkZHJlc3M6OkJhc2VJbmRleDoKKyAg
ICAgICAgICAgIHN0b3JlMTYoc3JjLCBhZGRyZXNzLmFzQmFzZUluZGV4KCkpOworICAgICAgICAg
ICAgcmV0dXJuIHRydWU7CisgICAgICAgIGNhc2UgRHluYW1pY0FkZHJlc3M6OkFic29sdXRlQWRk
cmVzczoKKyAgICAgICAgICAgIHN0b3JlMTYoc3JjLCBhZGRyZXNzLmFzQWJzb2x1dGVBZGRyZXNz
KCkubV9wdHIpOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIGRlZmF1bHQ6Cisg
ICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisgICAgdm9pZCBzdG9y
ZTE2KFRydXN0ZWRJbW0zMiBzcmMsIER5bmFtaWNBZGRyZXNzIGFkZHJlc3MpCisgICAgeworICAg
ICAgICBSRUxFQVNFX0FTU0VSVCh0cnlTdG9yZTE2KHNyYywgYWRkcmVzcykpOworICAgIH0KKwor
ICAgIGJvb2wgdHJ5TG9hZERvdWJsZShEeW5hbWljQWRkcmVzcyBhZGRyZXNzLCBGUFJlZ2lzdGVy
SUQgZGVzdCkKKyAgICB7CisgICAgICAgIHN3aXRjaCAoYWRkcmVzcy5raW5kKCkpIHsKKyAgICAg
ICAgY2FzZSBEeW5hbWljQWRkcmVzczo6QWRkcmVzczoKKyAgICAgICAgICAgIGxvYWREb3VibGUo
YWRkcmVzcy5hc0FkZHJlc3MoKSwgZGVzdCk7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAg
ICAgICAgY2FzZSBEeW5hbWljQWRkcmVzczo6QmFzZUluZGV4OgorICAgICAgICAgICAgbG9hZERv
dWJsZShhZGRyZXNzLmFzQmFzZUluZGV4KCksIGRlc3QpOworICAgICAgICAgICAgcmV0dXJuIHRy
dWU7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAg
IH0KKyAgICB9CisgICAgdm9pZCBsb2FkRG91YmxlKER5bmFtaWNBZGRyZXNzIGFkZHJlc3MsIEZQ
UmVnaXN0ZXJJRCBkZXN0KQorICAgIHsKKyAgICAgICAgUkVMRUFTRV9BU1NFUlQodHJ5TG9hZERv
dWJsZShhZGRyZXNzLCBkZXN0KSk7CisgICAgfQorCisgICAgYm9vbCB0cnlMb2FkRmxvYXQoRHlu
YW1pY0FkZHJlc3MgYWRkcmVzcywgRlBSZWdpc3RlcklEIGRlc3QpCisgICAgeworICAgICAgICBz
d2l0Y2ggKGFkZHJlc3Mua2luZCgpKSB7CisgICAgICAgIGNhc2UgRHluYW1pY0FkZHJlc3M6OkFk
ZHJlc3M6CisgICAgICAgICAgICBsb2FkRmxvYXQoYWRkcmVzcy5hc0FkZHJlc3MoKSwgZGVzdCk7
CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgY2FzZSBEeW5hbWljQWRkcmVzczo6
QmFzZUluZGV4OgorICAgICAgICAgICAgbG9hZEZsb2F0KGFkZHJlc3MuYXNCYXNlSW5kZXgoKSwg
ZGVzdCk7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAg
ICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KKyAgICB2b2lkIGxvYWRGbG9h
dChEeW5hbWljQWRkcmVzcyBhZGRyZXNzLCBGUFJlZ2lzdGVySUQgZGVzdCkKKyAgICB7CisgICAg
ICAgIFJFTEVBU0VfQVNTRVJUKHRyeUxvYWRGbG9hdChhZGRyZXNzLCBkZXN0KSk7CisgICAgfQor
CisgICAgYm9vbCB0cnlTdG9yZURvdWJsZShGUFJlZ2lzdGVySUQgc3JjLCBEeW5hbWljQWRkcmVz
cyBhZGRyZXNzKQorICAgIHsKKyAgICAgICAgc3dpdGNoIChhZGRyZXNzLmtpbmQoKSkgeworICAg
ICAgICBjYXNlIER5bmFtaWNBZGRyZXNzOjpBZGRyZXNzOgorICAgICAgICAgICAgc3RvcmVEb3Vi
bGUoc3JjLCBhZGRyZXNzLmFzQWRkcmVzcygpKTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOwor
ICAgICAgICBjYXNlIER5bmFtaWNBZGRyZXNzOjpCYXNlSW5kZXg6CisgICAgICAgICAgICBzdG9y
ZURvdWJsZShzcmMsIGFkZHJlc3MuYXNCYXNlSW5kZXgoKSk7CisgICAgICAgICAgICByZXR1cm4g
dHJ1ZTsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAg
ICAgfQorICAgIH0KKyAgICB2b2lkIHN0b3JlRG91YmxlKEZQUmVnaXN0ZXJJRCBzcmMsIER5bmFt
aWNBZGRyZXNzIGFkZHJlc3MpCisgICAgeworICAgICAgICBSRUxFQVNFX0FTU0VSVCh0cnlTdG9y
ZURvdWJsZShzcmMsIGFkZHJlc3MpKTsKKyAgICB9CisKKyAgICBib29sIHRyeVN0b3JlRmxvYXQo
RlBSZWdpc3RlcklEIHNyYywgRHluYW1pY0FkZHJlc3MgYWRkcmVzcykKKyAgICB7CisgICAgICAg
IHN3aXRjaCAoYWRkcmVzcy5raW5kKCkpIHsKKyAgICAgICAgY2FzZSBEeW5hbWljQWRkcmVzczo6
QWRkcmVzczoKKyAgICAgICAgICAgIHN0b3JlRmxvYXQoc3JjLCBhZGRyZXNzLmFzQWRkcmVzcygp
KTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICBjYXNlIER5bmFtaWNBZGRyZXNz
OjpCYXNlSW5kZXg6CisgICAgICAgICAgICBzdG9yZUZsb2F0KHNyYywgYWRkcmVzcy5hc0Jhc2VJ
bmRleCgpKTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICBkZWZhdWx0OgorICAg
ICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgfQorICAgIHZvaWQgc3RvcmVG
bG9hdChGUFJlZ2lzdGVySUQgc3JjLCBEeW5hbWljQWRkcmVzcyBhZGRyZXNzKQorICAgIHsKKyAg
ICAgICAgUkVMRUFTRV9BU1NFUlQodHJ5U3RvcmVGbG9hdChzcmMsIGFkZHJlc3MpKTsKKyAgICB9
CisKKyAgICBKdW1wIHRyeUJyYW5jaDgoUmVsYXRpb25hbENvbmRpdGlvbiBjb25kLCBEeW5hbWlj
QWRkcmVzcyBsZWZ0LCBUcnVzdGVkSW1tMzIgcmlnaHQpCisgICAgeworICAgICAgICBzd2l0Y2gg
KGxlZnQua2luZCgpKSB7CisgICAgICAgIGNhc2UgRHluYW1pY0FkZHJlc3M6OkFkZHJlc3M6Cisg
ICAgICAgICAgICByZXR1cm4gYnJhbmNoOChjb25kLCBsZWZ0LmFzQWRkcmVzcygpLCByaWdodCk7
CisgICAgICAgIGNhc2UgRHluYW1pY0FkZHJlc3M6OkJhc2VJbmRleDoKKyAgICAgICAgICAgIHJl
dHVybiBicmFuY2g4KGNvbmQsIGxlZnQuYXNCYXNlSW5kZXgoKSwgcmlnaHQpOworICAgICAgICBk
ZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuIEp1bXAoKTsKKyAgICAgICAgfQorICAgIH0KKyAg
ICB2b2lkIGJyYW5jaDgoUmVsYXRpb25hbENvbmRpdGlvbiBjb25kLCBEeW5hbWljQWRkcmVzcyBs
ZWZ0LCBUcnVzdGVkSW1tMzIgcmlnaHQpCisgICAgeworICAgICAgICBKdW1wIHJlc3VsdCA9IHRy
eUJyYW5jaDgoY29uZCwgbGVmdCwgcmlnaHQpOworICAgICAgICBSRUxFQVNFX0FTU0VSVChyZXN1
bHQuaXNTZXQoKSk7CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorCisgICAgSnVtcCB0
cnlCcmFuY2gzMihSZWxhdGlvbmFsQ29uZGl0aW9uIGNvbmQsIFJlZ2lzdGVySUQgbGVmdCwgRHlu
YW1pY0FkZHJlc3MgcmlnaHQpCisgICAgeworICAgICAgICBzd2l0Y2ggKHJpZ2h0LmtpbmQoKSkg
eworICAgICAgICBjYXNlIER5bmFtaWNBZGRyZXNzOjpBZGRyZXNzOgorICAgICAgICAgICAgcmV0
dXJuIGJyYW5jaDMyKGNvbmQsIGxlZnQsIHJpZ2h0LmFzQWRkcmVzcygpKTsKKyAgICAgICAgZGVm
YXVsdDoKKyAgICAgICAgICAgIHJldHVybiBKdW1wKCk7CisgICAgICAgIH0KKyAgICB9CisgICAg
SnVtcCBicmFuY2gzMihSZWxhdGlvbmFsQ29uZGl0aW9uIGNvbmQsIFRydXN0ZWRJbW0zMiBsZWZ0
LCBEeW5hbWljQWRkcmVzcyByaWdodCkKKyAgICB7CisgICAgICAgIEp1bXAgcmVzdWx0ID0gdHJ5
QnJhbmNoMzIoY29uZCwgbGVmdCwgcmlnaHQpOworICAgICAgICBSRUxFQVNFX0FTU0VSVChyZXN1
bHQuaXNTZXQoKSk7CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorCisgICAgSnVtcCB0
cnlCcmFuY2gzMihSZWxhdGlvbmFsQ29uZGl0aW9uIGNvbmQsIER5bmFtaWNBZGRyZXNzIGxlZnQs
IFRydXN0ZWRJbW0zMiByaWdodCkKKyAgICB7CisgICAgICAgIHN3aXRjaCAobGVmdC5raW5kKCkp
IHsKKyAgICAgICAgY2FzZSBEeW5hbWljQWRkcmVzczo6QWRkcmVzczoKKyAgICAgICAgICAgIHJl
dHVybiBicmFuY2gzMihjb25kLCBsZWZ0LmFzQWRkcmVzcygpLCByaWdodCk7CisgICAgICAgIGNh
c2UgRHluYW1pY0FkZHJlc3M6OkJhc2VJbmRleDoKKyAgICAgICAgICAgIHJldHVybiBicmFuY2gz
Mihjb25kLCBsZWZ0LmFzQmFzZUluZGV4KCksIHJpZ2h0KTsKKyAgICAgICAgZGVmYXVsdDoKKyAg
ICAgICAgICAgIHJldHVybiBKdW1wKCk7CisgICAgICAgIH0KKyAgICB9CisgICAgSnVtcCBicmFu
Y2gzMihSZWxhdGlvbmFsQ29uZGl0aW9uIGNvbmQsIER5bmFtaWNBZGRyZXNzIGxlZnQsIFRydXN0
ZWRJbW0zMiByaWdodCkKKyAgICB7CisgICAgICAgIEp1bXAgcmVzdWx0ID0gdHJ5QnJhbmNoMzIo
Y29uZCwgbGVmdCwgcmlnaHQpOworICAgICAgICBSRUxFQVNFX0FTU0VSVChyZXN1bHQuaXNTZXQo
KSk7CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorICAgIAorICAgIEp1bXAgdHJ5QnJh
bmNoMzIoUmVsYXRpb25hbENvbmRpdGlvbiBjb25kLCBEeW5hbWljQWRkcmVzcyBsZWZ0LCBSZWdp
c3RlcklEIHJpZ2h0KQorICAgIHsKKyAgICAgICAgc3dpdGNoIChsZWZ0LmtpbmQoKSkgeworICAg
ICAgICBjYXNlIER5bmFtaWNBZGRyZXNzOjpBZGRyZXNzOgorICAgICAgICAgICAgcmV0dXJuIGJy
YW5jaDMyKGNvbmQsIGxlZnQuYXNBZGRyZXNzKCksIHJpZ2h0KTsKKyAgICAgICAgZGVmYXVsdDoK
KyAgICAgICAgICAgIHJldHVybiBKdW1wKCk7CisgICAgICAgIH0KKyAgICB9CisgICAgSnVtcCBi
cmFuY2gzMihSZWxhdGlvbmFsQ29uZGl0aW9uIGNvbmQsIER5bmFtaWNBZGRyZXNzIGxlZnQsIFJl
Z2lzdGVySUQgcmlnaHQpCisgICAgeworICAgICAgICBKdW1wIHJlc3VsdCA9IHRyeUJyYW5jaDMy
KGNvbmQsIGxlZnQsIHJpZ2h0KTsKKyAgICAgICAgUkVMRUFTRV9BU1NFUlQocmVzdWx0LmlzU2V0
KCkpOworICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKworICAgIEp1bXAgdHJ5QnJhbmNo
VGVzdDMyKFJlc3VsdENvbmRpdGlvbiBjb25kLCBEeW5hbWljQWRkcmVzcyBsZWZ0LCBUcnVzdGVk
SW1tMzIgcmlnaHQpCisgICAgeworICAgICAgICBzd2l0Y2ggKGxlZnQua2luZCgpKSB7CisgICAg
ICAgIGNhc2UgRHluYW1pY0FkZHJlc3M6OkFkZHJlc3M6CisgICAgICAgICAgICByZXR1cm4gYnJh
bmNoMzIoY29uZCwgbGVmdC5hc0FkZHJlc3MoKSwgcmlnaHQpOworICAgICAgICBjYXNlIER5bmFt
aWNBZGRyZXNzOjpCYXNlSW5kZXg6CisgICAgICAgICAgICByZXR1cm4gYnJhbmNoMzIoY29uZCwg
bGVmdC5hc0Jhc2VJbmRleCgpLCByaWdodCk7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAg
ICByZXR1cm4gSnVtcCgpOworICAgICAgICB9CisgICAgfQorICAgIEp1bXAgYnJhbmNoVGVzdDMy
KFJlc3VsdENvbmRpdGlvbiBjb25kLCBEeW5hbWljQWRkcmVzcyBsZWZ0LCBUcnVzdGVkSW1tMzIg
cmlnaHQpCisgICAgeworICAgICAgICBKdW1wIHJlc3VsdCA9IHRyeUJyYW5jaFRlc3QzMihjb25k
LCBsZWZ0LCByaWdodCk7CisgICAgICAgIFJFTEVBU0VfQVNTRVJUKHJlc3VsdC5pc1NldCgpKTsK
KyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisgICAgCisgICAgSnVtcCB0cnlCcmFuY2hU
ZXN0OChSZXN1bHRDb25kaXRpb24gY29uZCwgRHluYW1pY0FkZHJlc3MgbGVmdCwgVHJ1c3RlZElt
bTMyIHJpZ2h0KQorICAgIHsKKyAgICAgICAgc3dpdGNoIChsZWZ0LmtpbmQoKSkgeworICAgICAg
ICBjYXNlIER5bmFtaWNBZGRyZXNzOjpBZGRyZXNzOgorICAgICAgICAgICAgcmV0dXJuIGJyYW5j
aDgoY29uZCwgbGVmdC5hc0FkZHJlc3MoKSwgcmlnaHQpOworICAgICAgICBjYXNlIER5bmFtaWNB
ZGRyZXNzOjpCYXNlSW5kZXg6CisgICAgICAgICAgICByZXR1cm4gYnJhbmNoOChjb25kLCBsZWZ0
LmFzQmFzZUluZGV4KCksIHJpZ2h0KTsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJl
dHVybiBKdW1wKCk7CisgICAgICAgIH0KKyAgICB9CisgICAgSnVtcCBicmFuY2hUZXN0OChSZXN1
bHRDb25kaXRpb24gY29uZCwgRHluYW1pY0FkZHJlc3MgbGVmdCwgVHJ1c3RlZEltbTMyIHJpZ2h0
KQorICAgIHsKKyAgICAgICAgSnVtcCByZXN1bHQgPSB0cnlCcmFuY2hUZXN0OChjb25kLCBsZWZ0
LCByaWdodCk7CisgICAgICAgIFJFTEVBU0VfQVNTRVJUKHJlc3VsdC5pc1NldCgpKTsKKyAgICAg
ICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisKKyAgICBKdW1wIHRyeUp1bXAoRHluYW1pY0FkZHJl
c3MgYWRkcmVzcykKKyAgICB7CisgICAgICAgIHN3aXRjaCAoYWRkcmVzcy5raW5kKCkpIHsKKyAg
ICAgICAgY2FzZSBEeW5hbWljQWRkcmVzczo6QWRkcmVzczoKKyAgICAgICAgICAgIHJldHVybiBq
dW1wKGFkZHJlc3MuYXNBZGRyZXNzKCkpOworICAgICAgICBjYXNlIER5bmFtaWNBZGRyZXNzOjpB
YnNvbHV0ZUFkZHJlc3M6CisgICAgICAgICAgICByZXR1cm4ganVtcChhZGRyZXNzLmFzQWJzb2x1
dGVBZGRyZXNzKCkpOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuIGZhbHNl
OworICAgICAgICB9CisgICAgfQorICAgIEp1bXAganVtcChEeW5hbWljQWRkcmVzcyBhZGRyZXNz
KQorICAgIHsKKyAgICAgICAgSnVtcCByZXN1bHQgPSB0cnlKdW1wKGFkZHJlc3MpOworICAgICAg
ICBSRUxFQVNFX0FTU0VSVChyZXN1bHQuaXNTZXQoKSk7CisgICAgICAgIHJldHVybiByZXN1bHQ7
CisgICAgfQorCisjaWYgQ1BVKFg4Nl82NCkgfHwgQ1BVKEFSTTY0KQorICAgIGJvb2wgdHJ5TG9h
ZDY0KER5bmFtaWNBZGRyZXNzIGFkZHJlc3MsIFJlZ2lzdGVySUQgZGVzdCkKKyAgICB7CisgICAg
ICAgIHN3aXRjaCAoYWRkcmVzcy5raW5kKCkpIHsKKyAgICAgICAgY2FzZSBEeW5hbWljQWRkcmVz
czo6QWRkcmVzczoKKyAgICAgICAgICAgIGxvYWQ2NChhZGRyZXNzLmFzQWRkcmVzcygpLCBkZXN0
KTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICBjYXNlIER5bmFtaWNBZGRyZXNz
OjpCYXNlSW5kZXg6CisgICAgICAgICAgICBsb2FkNjQoYWRkcmVzcy5hc0Jhc2VJbmRleCgpLCBk
ZXN0KTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICBjYXNlIER5bmFtaWNBZGRy
ZXNzOjpBYnNvbHV0ZUFkZHJlc3M6CisgICAgICAgICAgICBsb2FkNjQoYWRkcmVzcy5hc0Fic29s
dXRlQWRkcmVzcygpLm1fcHRyLCBkZXN0KTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAg
ICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAg
fQorICAgIHZvaWQgbG9hZDY0KER5bmFtaWNBZGRyZXNzIGFkZHJlc3MsIFJlZ2lzdGVySUQgZGVz
dCkKKyAgICB7CisgICAgICAgIFJFTEVBU0VfQVNTRVJUKHRyeUxvYWQ2NChhZGRyZXNzLCBkZXN0
KSk7CisgICAgfQorCisgICAgYm9vbCB0cnlTdG9yZTY0KFJlZ2lzdGVySUQgc3JjLCBEeW5hbWlj
QWRkcmVzcyBhZGRyZXNzKQorICAgIHsKKyAgICAgICAgc3dpdGNoIChhZGRyZXNzLmtpbmQoKSkg
eworICAgICAgICBjYXNlIER5bmFtaWNBZGRyZXNzOjpBZGRyZXNzOgorICAgICAgICAgICAgc3Rv
cmU2NChzcmMsIGFkZHJlc3MuYXNBZGRyZXNzKCkpOworICAgICAgICAgICAgcmV0dXJuIHRydWU7
CisgICAgICAgIGNhc2UgRHluYW1pY0FkZHJlc3M6OkJhc2VJbmRleDoKKyAgICAgICAgICAgIHN0
b3JlNjQoc3JjLCBhZGRyZXNzLmFzQmFzZUluZGV4KCkpOworICAgICAgICAgICAgcmV0dXJuIHRy
dWU7CisgICAgICAgIGNhc2UgRHluYW1pY0FkZHJlc3M6OkFic29sdXRlQWRkcmVzczoKKyAgICAg
ICAgICAgIHN0b3JlNjQoc3JjLCBhZGRyZXNzLmFzQWJzb2x1dGVBZGRyZXNzKCkubV9wdHIpOwor
ICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBy
ZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisgICAgdm9pZCBzdG9yZTY0KFJlZ2lzdGVy
SUQgc3JjLCBEeW5hbWljQWRkcmVzcyBhZGRyZXNzKQorICAgIHsKKyAgICAgICAgUkVMRUFTRV9B
U1NFUlQodHJ5U3RvcmU2NChzcmMsIGFkZHJlc3MpKTsKKyAgICB9CisKKyAgICBib29sIHRyeVN0
b3JlNjQoVHJ1c3RlZEltbTY0IHNyYywgRHluYW1pY0FkZHJlc3MgYWRkcmVzcykKKyAgICB7Cisg
ICAgICAgIHN3aXRjaCAoYWRkcmVzcy5raW5kKCkpIHsKKyAgICAgICAgY2FzZSBEeW5hbWljQWRk
cmVzczo6QWRkcmVzczoKKyAgICAgICAgICAgIHN0b3JlNjQoc3JjLCBhZGRyZXNzLmFzQWRkcmVz
cygpKTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICBjYXNlIER5bmFtaWNBZGRy
ZXNzOjpCYXNlSW5kZXg6CisgICAgICAgICAgICBzdG9yZTY0KHNyYywgYWRkcmVzcy5hc0Jhc2VJ
bmRleCgpKTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICBjYXNlIER5bmFtaWNB
ZGRyZXNzOjpBYnNvbHV0ZUFkZHJlc3M6CisgICAgICAgICAgICBzdG9yZTY0KHNyYywgYWRkcmVz
cy5hc0Fic29sdXRlQWRkcmVzcygpLm1fcHRyKTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOwor
ICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9Cisg
ICAgfQorICAgIHZvaWQgc3RvcmU2NChUcnVzdGVkSW1tNjQgc3JjLCBEeW5hbWljQWRkcmVzcyBh
ZGRyZXNzKQorICAgIHsKKyAgICAgICAgUkVMRUFTRV9BU1NFUlQodHJ5U3RvcmU2NChzcmMsIGFk
ZHJlc3MpKTsKKyAgICB9CisKKyAgICBKdW1wIHRyeUJyYW5jaDY0KFJlbGF0aW9uYWxDb25kaXRp
b24gY29uZCwgUmVnaXN0ZXJJRCBsZWZ0LCBEeW5hbWljQWRkcmVzcyByaWdodCkKKyAgICB7Cisg
ICAgICAgIHN3aXRjaCAocmlnaHQua2luZCgpKSB7CisgICAgICAgIGNhc2UgRHluYW1pY0FkZHJl
c3M6OkFkZHJlc3M6CisgICAgICAgICAgICByZXR1cm4gYnJhbmNoNjQoY29uZCwgbGVmdCwgcmln
aHQuYXNBZGRyZXNzKCkpOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuIEp1
bXAoKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBKdW1wIGJyYW5jaDY0KFJlbGF0aW9uYWxDb25k
aXRpb24gY29uZCwgVHJ1c3RlZEltbTY0IGxlZnQsIER5bmFtaWNBZGRyZXNzIHJpZ2h0KQorICAg
IHsKKyAgICAgICAgSnVtcCByZXN1bHQgPSB0cnlCcmFuY2g2NChjb25kLCBsZWZ0LCByaWdodCk7
CisgICAgICAgIFJFTEVBU0VfQVNTRVJUKHJlc3VsdC5pc1NldCgpKTsKKyAgICAgICAgcmV0dXJu
IHJlc3VsdDsKKyAgICB9CisKKyAgICBKdW1wIHRyeUJyYW5jaDY0KFJlbGF0aW9uYWxDb25kaXRp
b24gY29uZCwgRHluYW1pY0FkZHJlc3MgbGVmdCwgVHJ1c3RlZEltbTY0IHJpZ2h0KQorICAgIHsK
KyAgICAgICAgc3dpdGNoIChsZWZ0LmtpbmQoKSkgeworICAgICAgICBjYXNlIER5bmFtaWNBZGRy
ZXNzOjpBZGRyZXNzOgorICAgICAgICAgICAgcmV0dXJuIGJyYW5jaDY0KGNvbmQsIGxlZnQuYXNB
ZGRyZXNzKCksIHJpZ2h0KTsKKyAgICAgICAgY2FzZSBEeW5hbWljQWRkcmVzczo6QmFzZUluZGV4
OgorICAgICAgICAgICAgcmV0dXJuIGJyYW5jaDY0KGNvbmQsIGxlZnQuYXNCYXNlSW5kZXgoKSwg
cmlnaHQpOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuIEp1bXAoKTsKKyAg
ICAgICAgfQorICAgIH0KKyAgICBKdW1wIGJyYW5jaDY0KFJlbGF0aW9uYWxDb25kaXRpb24gY29u
ZCwgRHluYW1pY0FkZHJlc3MgbGVmdCwgVHJ1c3RlZEltbTY0IHJpZ2h0KQorICAgIHsKKyAgICAg
ICAgSnVtcCByZXN1bHQgPSB0cnlCcmFuY2g2NChjb25kLCBsZWZ0LCByaWdodCk7CisgICAgICAg
IFJFTEVBU0VfQVNTRVJUKHJlc3VsdC5pc1NldCgpKTsKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsK
KyAgICB9CisgICAgCisgICAgSnVtcCB0cnlCcmFuY2g2NChSZWxhdGlvbmFsQ29uZGl0aW9uIGNv
bmQsIER5bmFtaWNBZGRyZXNzIGxlZnQsIFJlZ2lzdGVySUQgcmlnaHQpCisgICAgeworICAgICAg
ICBzd2l0Y2ggKGxlZnQua2luZCgpKSB7CisgICAgICAgIGNhc2UgRHluYW1pY0FkZHJlc3M6OkFk
ZHJlc3M6CisgICAgICAgICAgICByZXR1cm4gYnJhbmNoNjQoY29uZCwgbGVmdC5hc0FkZHJlc3Mo
KSwgcmlnaHQpOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuIEp1bXAoKTsK
KyAgICAgICAgfQorICAgIH0KKyAgICBKdW1wIGJyYW5jaDY0KFJlbGF0aW9uYWxDb25kaXRpb24g
Y29uZCwgRHluYW1pY0FkZHJlc3MgbGVmdCwgUmVnaXN0ZXJJRCByaWdodCkKKyAgICB7CisgICAg
ICAgIEp1bXAgcmVzdWx0ID0gdHJ5QnJhbmNoNjQoY29uZCwgbGVmdCwgcmlnaHQpOworICAgICAg
ICBSRUxFQVNFX0FTU0VSVChyZXN1bHQuaXNTZXQoKSk7CisgICAgICAgIHJldHVybiByZXN1bHQ7
CisgICAgfQorCisgICAgSnVtcCB0cnlCcmFuY2hUZXN0NjQoUmVzdWx0Q29uZGl0aW9uIGNvbmQs
IER5bmFtaWNBZGRyZXNzIGxlZnQsIFRydXN0ZWRJbW02NCByaWdodCkKKyAgICB7CisgICAgICAg
IHN3aXRjaCAobGVmdC5raW5kKCkpIHsKKyAgICAgICAgY2FzZSBEeW5hbWljQWRkcmVzczo6QWRk
cmVzczoKKyAgICAgICAgICAgIHJldHVybiBicmFuY2g2NChjb25kLCBsZWZ0LmFzQWRkcmVzcygp
LCByaWdodCk7CisgICAgICAgIGNhc2UgRHluYW1pY0FkZHJlc3M6OkJhc2VJbmRleDoKKyAgICAg
ICAgICAgIHJldHVybiBicmFuY2g2NChjb25kLCBsZWZ0LmFzQmFzZUluZGV4KCksIHJpZ2h0KTsK
KyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiBKdW1wKCk7CisgICAgICAgIH0K
KyAgICB9CisgICAgSnVtcCBicmFuY2hUZXN0NjQoUmVzdWx0Q29uZGl0aW9uIGNvbmQsIER5bmFt
aWNBZGRyZXNzIGxlZnQsIFRydXN0ZWRJbW02NCByaWdodCkKKyAgICB7CisgICAgICAgIEp1bXAg
cmVzdWx0ID0gdHJ5QnJhbmNoVGVzdDY0KGNvbmQsIGxlZnQsIHJpZ2h0KTsKKyAgICAgICAgUkVM
RUFTRV9BU1NFUlQocmVzdWx0LmlzU2V0KCkpOworICAgICAgICByZXR1cm4gcmVzdWx0OworICAg
IH0KKyNlbmRpZiAvLyBDUFUoWDg2XzY0KSB8fCBDUFUoQVJNNjQpCisKICNpZiBFTkFCTEUoTUFT
TV9QUk9CRSkKICAgICAvLyBMZXQncyB5b3UgcHJpbnQgZnJvbSB5b3VyIEpJVCBnZW5lcmF0ZWQg
Y29kZS4KICAgICAvLyBTZWUgY29tbWVudHMgaW4gTWFjcm9Bc3NlbWJsZXJQcmludGVyLmggZm9y
IGV4YW1wbGVzIG9mIGhvdyB0byB1c2UgdGhpcy4KSW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29y
ZS9iMy9CM0FkZHJlc3NNYXRjaGVyLnBhdHRlcm5zCj09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZh
U2NyaXB0Q29yZS9iMy9CM0FkZHJlc3NNYXRjaGVyLnBhdHRlcm5zCShyZXZpc2lvbiAwKQorKysg
U291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzQWRkcmVzc01hdGNoZXIucGF0dGVybnMJKHdvcmtp
bmcgY29weSkKQEAgLTAsMCArMSw0MSBAQAorIyBDb3B5cmlnaHQgKEMpIDIwMTUgQXBwbGUgSW5j
LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorIworIyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNv
dXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyMgbW9kaWZpY2F0aW9uLCBh
cmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisjIGFy
ZSBtZXQ6CisjIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0
aGUgYWJvdmUgY29weXJpZ2h0CisjICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMg
YW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyMgMi4gUmVkaXN0cmlidXRpb25zIGluIGJp
bmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyMgICAgbm90aWNl
LCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGlu
IHRoZQorIyAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQg
d2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorIworIyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZ
IEFQUExFIElOQy4gQU5EIElUUyBDT05UUklCVVRPUlMgYGBBUyBJUycnCisjIEFORCBBTlkgRVhQ
UkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRP
LAorIyBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVT
UyBGT1IgQSBQQVJUSUNVTEFSCisjIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5U
IFNIQUxMIEFQUExFIElOQy4gT1IgSVRTIENPTlRSSUJVVE9SUworIyBCRSBMSUFCTEUgRk9SIEFO
WSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCisj
IENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBS
T0NVUkVNRU5UIE9GCisjIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNF
LCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUworIyBJTlRFUlJVUFRJT04pIEhPV0VWRVIg
Q0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTgorIyBDT05U
UkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1Ig
T1RIRVJXSVNFKQorIyBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBT
T0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GCisjIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERB
TUFHRS4KKworbWF0Y2hlciBBZGRyZXNzTWF0Y2hlcgorCisjIE5vdGUgdGhhdCB0aGlzIHJlbGll
cyBvbiBCMyBkb2luZyBhZ2dyZXNzaXZlIHJlYXNzb2NpYXRpb24gYW5kIGNhbm9uY2FsaXphdGlv
biBvZiBpbnRlZ2VyIGFkZHMuCisjIFdlJ2xsIG5ldmVyIHNlZSBBZGQoQWRkKHgsIGNvbnN0MSks
IGNvbnN0MikgYmVjYXVzZSBpdCB3b3VsZCBoYXZlIGFscmVhZHkgYmVlbiByZWFzc29jaWF0ZWQg
aW50bworIyBBZGQoeCwgY29uc3QxICsgY29uc3QyKS4gQWxzbywgd2Ugd2lsbCBuZXZlciBzZWUg
QWRkKGNvbnN0LCB4KSwgYmVjYXVzZSB3ZSB3b3VsZCBoYXZlIGNhbm9uaWNhbGl6ZWQKKyMgaXQg
dG8gQWRkKHgsIGNvbnN0KS4gVGhhdCBzYWlkLCBpbiB0aGlzIGNvZGUgd2UgbmV2ZXIgbWFrZSBh
c3NlcnRpb25zIGFib3V0IHRoZXNlIG9wdGltaXphdGlvbnMKKyMgaGF2aW5nIGJlZW4gcGVyZm9y
bWVkLiBBbHNvLCBzaW5jZSB0aGUgTG9hZC9TdG9yZSBpbnN0cnVjdGlvbnMgaW4gQjMgaGF2ZSBh
IGJ1aWx0LWluIG9mZnNldCwgd2UKKyMgZG9uJ3QgbmVlZCB0byBtYXRjaCBBZGQoeCwgY29uc3Qp
LiBUaGF0IHdvdWxkIGhhdmUgYmVlbiBmb2xkZWQgaW50byB0aGUgTG9hZC9TdG9yZSBpbnN0cnVj
dGlvbnMKKyMgYWxyZWFkeS4gU28sIHRoZSBvbmx5IGZhbmN5IG1hdGhpbmcgdGhpcyBjYW4gZG8g
aXMganVzdCBCYXNlSW5kZXggZm9ybXMuCisKK0FkZFNoaWZ0MSA9IEFkZChzaGlmdCA9IFNobChp
bmRleCwgbG9nU2NhbGUpLCBiYXNlKQorQWRkU2hpZnQyID0gQWRkKGJhc2UsIHNoaWZ0ID0gU2hs
KGluZGV4LCBsb2dTY2FsZSkpCisKK0FkZCA9IEFkZChsZWZ0LCByaWdodCkKKworJENvbnN0CisK
K0RpcmVjdApJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzQXJndW1lbnRSZWdWYWx1
ZS5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzQXJndW1lbnRS
ZWdWYWx1ZS5jcHAJKHJldmlzaW9uIDApCisrKyBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNB
cmd1bWVudFJlZ1ZhbHVlLmNwcAkod29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDQxIEBACisvKgor
ICogQ29weXJpZ2h0IChDKSAyMDE1IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAq
CisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3
aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0
aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJp
YnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Cisg
KiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRp
c2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXBy
b2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29u
ZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1l
bnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1
dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gYGBB
UyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJ
TkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVS
Q0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJF
IERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SCisgKiBDT05UUklC
VVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BF
Q0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcs
IEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMg
T1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5F
U1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0Yg
TElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JU
CisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBX
QVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBP
RiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisKKyNpbmNsdWRlICJjb25m
aWcuaCIKKyNpbmNsdWRlICJCM0FyZ3VtZW50UmVnVmFsdWUuaCIKKworbmFtZXNwYWNlIEpTQyB7
IG5hbWVzcGFjZSBCMyB7CisKK0FyZ3VtZW50UmVnVmFsdWU6On5Bcmd1bWVudFJlZ1ZhbHVlKCkK
K3sKK30KKwordm9pZCBBcmd1bWVudFJlZ1ZhbHVlOjpkdW1wTWV0YShQcmludFN0cmVhbSYgb3V0
KSBjb25zdAoreworICAgIG91dC5wcmludChtX3JlZyk7Cit9CisKK30gfSAvLyBuYW1lc3BhY2Ug
SlNDOjpCMworCkluZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNBcmd1bWVudFJlZ1Zh
bHVlLmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzQXJndW1lbnRS
ZWdWYWx1ZS5oCShyZXZpc2lvbiAwKQorKysgU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzQXJn
dW1lbnRSZWdWYWx1ZS5oCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsNjAgQEAKKy8qCisgKiBD
b3B5cmlnaHQgKEMpIDIwMTUgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAq
IFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGgg
b3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQg
dGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRp
b25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAg
IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xh
aW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVj
ZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRp
b25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0
aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9u
LgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFTIElT
JycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywg
QlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFO
VEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElT
Q0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IKKyAqIENPTlRSSUJVVE9S
UyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFM
LAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVU
IE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBT
RVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJ
TlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFC
SUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAq
IChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBP
VVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRI
RSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKworI2lmbmRlZiBCM0FyZ3VtZW50
UmVnVmFsdWVfaAorI2RlZmluZSBCM0FyZ3VtZW50UmVnVmFsdWVfaAorCisjaW5jbHVkZSAiQjNW
YWx1ZS5oIgorI2luY2x1ZGUgIlJlZy5oIgorCituYW1lc3BhY2UgSlNDIHsgbmFtZXNwYWNlIEIz
IHsKKworY2xhc3MgQXJndW1lbnRSZWdWYWx1ZSA6IHB1YmxpYyBWYWx1ZSB7CitwdWJsaWM6Cisg
ICAgc3RhdGljIGJvb2wgYWNjZXB0cyhPcGNvZGUgb3Bjb2RlKSB7IHJldHVybiBvcGNvZGUgPT0g
QXJndW1lbnRSZWc7IH0KKyAgICAKKyAgICB+QXJndW1lbnRSZWdWYWx1ZSgpOworCisgICAgUmVn
IGFyZ3VtZW50UmVnKCkgY29uc3QgeyByZXR1cm4gbV9yZWc7IH0KKworcHJvdGVjdGVkOgorICAg
IHZvaWQgZHVtcE1ldGEoUHJpbnRTdHJlYW0mKSBjb25zdCBvdmVycmlkZTsKKworcHJpdmF0ZToK
KyAgICBmcmllbmQgY2xhc3MgUHJvY2VkdXJlOworCisgICAgQXJndW1lbnRSZWdWYWx1ZSh1bnNp
Z25lZCBpbmRleCwgT3JpZ2luIG9yaWdpbiwgUmVnIHJlZykKKyAgICAgICAgOiBWYWx1ZShpbmRl
eCwgQXJndW1lbnRSZWcsIHJlZy5pc0dQUigpID8gcG9pbnRlcigpIDogRG91YmxlLCBvcmlnaW4p
CisgICAgICAgICwgbV9yZWcocmVnKQorICAgIHsKKyAgICB9CisKKyAgICBSZWcgbV9yZWc7Cit9
OworCit9IH0gLy8gbmFtZXNwYWNlIEpTQzo6QjMKKworI2VuZGlmIC8vIEIzQXJndW1lbnRSZWdW
YWx1ZV9oCisKSW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM0Jhc2ljQmxvY2suY3Bw
Cj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM0Jhc2ljQmxvY2suY3Bw
CShyZXZpc2lvbiAwKQorKysgU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzQmFzaWNCbG9jay5j
cHAJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSw1OCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykg
MjAxNSBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRp
b24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Cisg
KiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5n
IGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNl
IGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlz
IGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4g
UmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBj
b3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBm
b2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90
aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJ
UyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisg
KiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlU
RUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQg
RklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4g
Tk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBG
T1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExB
UlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQg
VE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NT
IE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikg
SE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhF
UiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBO
RUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNF
CisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZ
IE9GIFNVQ0ggREFNQUdFLiAKKyAqLworCisjaW5jbHVkZSAiY29uZmlnLmgiCisjaW5jbHVkZSAi
QjNCYXNpY0Jsb2NrLmgiCisKK25hbWVzcGFjZSBKU0MgeyBuYW1lc3BhY2UgQjMgeworCitCYXNp
Y0Jsb2NrOjpCYXNpY0Jsb2NrKHVuc2lnbmVkIGluZGV4KQorICAgIDogbV9pbmRleChpbmRleCkK
K3sKK30KKworQmFzaWNCbG9jazo6fkJhc2ljQmxvY2soKQoreworfQorCit2b2lkIEJhc2ljQmxv
Y2s6OmFwcGVuZChWYWx1ZSogdmFsdWUpCit7CisgICAgbV92YWx1ZXMuYXBwZW5kKHZhbHVlKTsK
K30KKwordm9pZCBCYXNpY0Jsb2NrOjpkdW1wKFByaW50U3RyZWFtJiBvdXQpIGNvbnN0Cit7Cisg
ICAgb3V0LnByaW50KGR1bXBQcmVmaXgsIG1faW5kZXgpOworfQorCit2b2lkIEJhc2ljQmxvY2s6
OmRlZXBEdW1wKFByaW50U3RyZWFtJiBvdXQpIGNvbnN0Cit7CisgICAgb3V0LnByaW50KCJCQiIs
ICp0aGlzLCAiOlxuIik7CisgICAgZm9yIChWYWx1ZSogdmFsdWUgOiAqdGhpcykKKyAgICAgICAg
b3V0LnByaW50KCIgICAgIiwgZGVlcER1bXAodmFsdWUpLCAiXG4iKTsKK30KKworfSB9IC8vIG5h
bWVzcGFjZSBKU0M6OkIzCisKSW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM0Jhc2lj
QmxvY2suaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNCYXNpY0Js
b2NrLmgJKHJldmlzaW9uIDApCisrKyBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNCYXNpY0Js
b2NrLmgJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSwxMTIgQEAKKy8qCisgKiBDb3B5cmlnaHQg
KEMpIDIwMTUgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJp
YnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91
dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxv
d2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNv
dXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwg
dGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAq
IDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJv
dmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0
aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9v
ciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAq
IFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFTIElTJycgQU5EIEFO
WQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBM
SU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkg
QU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4g
IElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFC
TEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhF
TVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1J
VEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsg
TE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJ
T04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdI
RVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJ
TkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhF
IFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJ
TElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKworI2lmbmRlZiBCM0Jhc2ljQmxvY2sKKyNkZWZp
bmUgQjNCYXNpY0Jsb2NrCisKK25hbWVzcGFjZSBKU0MgeyBuYW1lc3BhY2UgQjMgeworCitjbGFz
cyBQcm9jZWR1cmU7CitjbGFzcyBWYWx1ZTsKKworY2xhc3MgQmFzaWNCbG9jayB7CisgICAgV1RG
X01BS0VfTk9OQ09QWUFCTEUoQmFzaWNCbG9jayk7CisgICAgV1RGX01BS0VfRkFTVF9BTExPQ0FU
RUQ7CitwdWJsaWM6CisgICAgdHlwZWRlZiBWZWN0b3I8VmFsdWUqPiBWYWx1ZUxpc3Q7CisgICAg
dHlwZWRlZiBWZWN0b3I8QmFzaWNCbG9jayosIDI+IFN1Y2Nlc3Nvckxpc3Q7IC8vIFRoaXMgbWF0
Y2hlcyBDb250cm9sVmFsdWUncyB0eXBlZGVmLgorCisgICAgc3RhdGljIGNvbnN0IGNoYXIqIGR1
bXBQcmVmaXggPSAiIyI7CisKKyAgICB+QmFzaWNCbG9jaygpOworCisgICAgdW5zaWduZWQgaW5k
ZXgoKSBjb25zdCB7IHJldHVybiBtX2luZGV4OyB9CisKKyAgICBBZGphY2VuY3lMaXN0OjppdGVy
YXRvciBiZWdpbigpIHsgcmV0dXJuIG1fdmFsdWVzLmJlZ2luKCk7IH0KKyAgICBBZGphY2VuY3lM
aXN0OjppdGVyYXRvciBlbmQoKSB7IHJldHVybiBtX3ZhbHVlcy5lbmQoKTsgfQorICAgIEFkamFj
ZW5jeUxpc3Q6OmNvbnN0X2l0ZXJhdG9yIGJlZ2luKCkgY29uc3QgeyByZXR1cm4gbV92YWx1ZXMu
YmVnaW4oKTsgfQorICAgIEFkamFjZW5jeUxpc3Q6OmNvbnN0X2l0ZXJhdG9yIGVuZCgpIGNvbnN0
IHsgcmV0dXJuIG1fdmFsdWVzLmVuZCgpOyB9CisKKyAgICBzaXplX3Qgc2l6ZSgpIGNvbnN0IHsg
cmV0dXJuIG1fdmFsdWVzLnNpemUoKTsgfQorICAgIFZhbHVlKiBhdChzaXplX3QgaW5kZXgpIGNv
bnN0IHsgcmV0dXJuIG1fdmFsdWVzW2luZGV4XTsgfQorICAgIFZhbHVlKiYgYXQoc2l6ZV90IGlu
ZGV4KSB7IHJldHVybiBtX3ZhbHVlc1tpbmRleF07IH0KKworICAgIFZhbHVlKiBsYXN0KCkgY29u
c3QgeyByZXR1cm4gbV92YWx1ZXMubGFzdCgpOyB9CisgICAgVmFsdWUqJiBsYXN0KCkgeyByZXR1
cm4gbV92YWx1ZXMubGFzdCgpOyB9CisKKyAgICBjb25zdCBWYWx1ZUxpc3QmIHZhbHVlcygpIGNv
bnN0IHsgcmV0dXJuIG1fdmFsdWVzOyB9CisgICAgVmFsdWVMaXN0JiB2YWx1ZXMoKSB7IHJldHVy
biBtX3ZhbHVlczsgfQorCisgICAgdm9pZCBhcHBlbmQoVmFsdWUqKTsKKworICAgIHRlbXBsYXRl
PHR5cGVuYW1lIFZhbHVlVHlwZSwgdHlwZW5hbWUuLi4gQXJndW1lbnRzPgorICAgIFZhbHVlVHlw
ZSogYXBwZW5kTmV3KFByb2NlZHVyZSYsIEFyZ3VtZW50cy4uLik7CisKKyAgICB1bnNpZ25lZCBu
dW1TdWNjZXNzb3JzKCkgY29uc3Q7CisgICAgQmFzaWNCbG9jayogc3VjY2Vzc29yKHVuc2lnbmVk
IGluZGV4KSBjb25zdDsKKyAgICBCYXNpY0Jsb2NrKiYgc3VjY2Vzc29yKHVuc2lnbmVkIGluZGV4
KTsKKyAgICBjb25zdCBTdWNjZXNzb3JMaXN0JiBzdWNjZXNzb3JzKCkgY29uc3Q7CisKKyAgICB2
b2lkIGR1bXAoUHJpbnRTdHJlYW0mKSBjb25zdDsKKyAgICB2b2lkIGRlZXBEdW1wKFByaW50U3Ry
ZWFtJikgY29uc3Q7CisKK3ByaXZhdGU6CisgICAgZnJpZW5kIGNsYXNzIFByb2NlZHVyZTsKKyAg
ICAKKyAgICAvLyBJbnN0YW50aWF0ZSB2aWEgUHJvY2VkdXJlLgorICAgIEJhc2ljQmxvY2sodW5z
aWduZWQgaW5kZXgpOworCisgICAgdW5zaWduZWQgbV9pbmRleDsKKyAgICBWYWx1ZUxpc3QgbV92
YWx1ZXM7Cit9OworCitjbGFzcyBEZWVwQmFzaWNCbG9ja0R1bXAgeworcHVibGljOgorICAgIERl
ZXBCYXNpY0Jsb2NrRHVtcChCYXNpY0Jsb2NrKiBibG9jaykKKyAgICAgICAgOiBtX2Jsb2NrKGJs
b2NrKQorICAgIHsKKyAgICB9CisKKyAgICB2b2lkIGR1bXAoUHJpbnRTdHJlYW0mIG91dCkgY29u
c3QKKyAgICB7CisgICAgICAgIGlmIChtX2Jsb2NrKQorICAgICAgICAgICAgbV9ibG9jay0+ZGVl
cER1bXAob3V0KTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgb3V0LnByaW50KCI8bnVsbD4i
KTsKKyAgICB9CisKK3ByaXZhdGU6CisgICAgQmFzaWNCbG9jayogbV9ibG9jazsKK307CisKK0Rl
ZXBCYXNpY0Jsb2NrRHVtcCBkZWVwRHVtcChCYXNpY0Jsb2NrKiBibG9jaykKK3sKKyAgICByZXR1
cm4gRGVlcEJhc2ljQmxvY2tEdW1wKGJsb2NrKTsKK30KKworfSB9IC8vIG5hbWVzcGFjZSBKU0M6
OkIzCisKKyNlbmRpZiAvLyBCM0Jhc2ljQmxvY2sKKwpJbmRleDogU291cmNlL0phdmFTY3JpcHRD
b3JlL2IzL0IzQmFzaWNCbG9ja0lubGluZXMuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNj
cmlwdENvcmUvYjMvQjNCYXNpY0Jsb2NrSW5saW5lcy5oCShyZXZpc2lvbiAwKQorKysgU291cmNl
L0phdmFTY3JpcHRDb3JlL2IzL0IzQmFzaWNCbG9ja0lubGluZXMuaAkod29ya2luZyBjb3B5KQpA
QCAtMCwwICsxLDY2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE1IEFwcGxlIEluYy4gQWxs
IHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJj
ZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJl
IHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJl
IG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0
aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25z
IGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4g
YmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90
aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVy
IGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3Zp
ZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJ
REVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElF
RCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBM
SUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJ
Q1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBM
RSBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJ
UkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElB
TCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5U
IE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgor
ICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQg
T04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJ
Q1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJX
SVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdB
UkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAor
ICovCisKKyNpZm5kZWYgQjNCYXNpY0Jsb2NrSW5saW5lc19oCisjZGVmaW5lIEIzQmFzaWNCbG9j
a0lubGluZXNfaAorCisjaW5jbHVkZSAiQjNCYXNpY0Jsb2NrLmgiCisjaW5jbHVkZSAiQjNDb250
cm9sVmFsdWUuaCIKKyNpbmNsdWRlICJCM1Byb2NlZHVyZUlubGluZXMuaCIKKworbmFtZXNwYWNl
IEpTQyB7IG5hbWVzcGFjZSBCMyB7CisKK3RlbXBsYXRlPHR5cGVuYW1lIFZhbHVlVHlwZSB0eXBl
bmFtZS4uLiBBcmd1bWVudHM+CitWYWx1ZVR5cGUqIEJhc2ljQmxvY2s6OmFwcGVuZE5ldyhQcm9j
ZWR1cmUmIHByb2NlZHVyZSwgQXJndW1lbnRzLi4uIGFyZ3VtZW50cykKK3sKKyAgICBWYWx1ZVR5
cGUqIHJlc3VsdCA9IHByb2NlZHVyZS5hZGQ8VmFsdWVUeXBlPihhcmd1bWVudHMuLi4pOworICAg
IGFwcGVuZChyZXN1bHQpOworICAgIHJldHVybiByZXN1bHQ7Cit9CisKK3Vuc2lnbmVkIEJhc2lj
QmxvY2s6Om51bVN1Y2Nlc3NvcnMoKSBjb25zdAoreworICAgIHJldHVybiBsYXN0KCktPmFzPENv
bnRyb2xWYWx1ZT4oKS0+bnVtU3VjY2Vzc29ycygpOworfQorCitCYXNpY0Jsb2NrKiBCYXNpY0Js
b2NrOjpzdWNjZXNzb3IodW5zaWduZWQgaW5kZXgpIGNvbnN0Cit7CisgICAgcmV0dXJuIGxhc3Qo
KS0+YXM8Q29udHJvbFZhbHVlPigpLT5zdWNjZXNzb3IoaW5kZXgpOworfQorCitCYXNpY0Jsb2Nr
KiYgQmFzaWNCbG9jazo6c3VjY2Vzc29yKHVuc2lnbmVkIGluZGV4KQoreworICAgIHJldHVybiBs
YXN0KCktPmFzPENvbnRyb2xWYWx1ZT4oKS0+c3VjY2Vzc29yKGluZGV4KTsKK30KKworY29uc3Qg
QmFzaWNCbG9jazo6U3VjY2Vzc29yTGlzdCYgQmFzaWNCbG9jazo6c3VjY2Vzc29ycygpIGNvbnN0
Cit7CisgICAgcmV0dXJuIGxhc3QoKS0+YXM8Q29udHJvbFZhbHVlPigpLT5zdWNjZXNzb3JzKCk7
Cit9CisKK30gfSAvLyBuYW1lc3BhY2UgSlNDOjpCMworCisjZW5kaWYgLy8gQjNCYXNpY0Jsb2Nr
SW5saW5lc19oCisKSW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM0NoZWNrVmFsdWUu
Y3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM0NoZWNrVmFsdWUu
Y3BwCShyZXZpc2lvbiAwKQorKysgU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzQ2hlY2tWYWx1
ZS5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSw0MSBAQAorLyoKKyAqIENvcHlyaWdodCAo
QykgMjAxNSBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmli
dXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0
CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93
aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291
cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0
aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICog
Mi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92
ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRo
ZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29y
IG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICog
VEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5Z
CisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJ
TUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBB
TkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAg
SU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJM
RSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVN
UExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlU
RUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBM
T1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElP
TikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hF
VEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElO
RyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUg
VVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklM
SVRZIE9GIFNVQ0ggREFNQUdFLiAKKyAqLworCisjaW5jbHVkZSAiY29uZmlnLmgiCisjaW5jbHVk
ZSAiQjNDaGVja1ZhbHVlLmgiCisKK25hbWVzcGFjZSBKU0MgeyBuYW1lc3BhY2UgQjMgeworCitD
aGVja1ZhbHVlOjp+Q2hlY2tWYWx1ZSgpCit7Cit9CisKK3ZvaWQgQ2hlY2tWYWx1ZTo6ZHVtcE1l
dGEoUHJpbnRTdHJlYW0mIG91dCkgY29uc3QKK3sKKyAgICBvdXQucHJpbnQoInN0YWNrbWFwID0g
Iiwgc3RhY2ttYXApOworfQorCit9IH0gLy8gbmFtZXNwYWNlIEpTQzo6QjMKKwpJbmRleDogU291
cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzQ2hlY2tWYWx1ZS5oCj09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJj
ZS9KYXZhU2NyaXB0Q29yZS9iMy9CM0NoZWNrVmFsdWUuaAkocmV2aXNpb24gMCkKKysrIFNvdXJj
ZS9KYXZhU2NyaXB0Q29yZS9iMy9CM0NoZWNrVmFsdWUuaAkod29ya2luZyBjb3B5KQpAQCAtMCww
ICsxLDgwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE1IEFwcGxlIEluYy4gQWxsIHJpZ2h0
cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQg
YmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1p
dHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoK
KyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJv
dmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0
aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5
IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0
aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRo
ZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdp
dGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZ
IEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJS
QU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdB
UlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIK
KyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMu
IE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwg
SU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1B
R0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNV
QlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJP
RklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5Z
IFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElB
QklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBB
UklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVW
RU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisK
KyNpZm5kZWYgQjNDaGVja1ZhbHVlX2gKKyNkZWZpbmUgQjNDaGVja1ZhbHVlX2gKKworI2luY2x1
ZGUgIkIzVmFsdWUuaCIKKyNpbmNsdWRlICJCM1N0YWNrbWFwLmgiCisKK25hbWVzcGFjZSBKU0Mg
eyBuYW1lc3BhY2UgQjMgeworCitjbGFzcyBDaGVja1ZhbHVlIDogcHVibGljIENoZWNrIHsKK3B1
YmxpYzoKKyAgICBzdGF0aWMgYm9vbCBhY2NlcHRzKE9wY29kZSBvcGNvZGUpCisgICAgeworICAg
ICAgICBzd2l0Y2ggKG9wY29kZSkgeworICAgICAgICBjYXNlIENoZWNrQWRkOgorICAgICAgICBj
YXNlIENoZWNrU3ViOgorICAgICAgICBjYXNlIENoZWNrTXVsOgorICAgICAgICBjYXNlIENoZWNr
OgorICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAg
ICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICB+Q2hlY2tWYWx1ZSgpOwor
CisgICAgU3RhY2ttYXAgc3RhY2ttYXA7CisKK3Byb3RlY3RlZDoKKyAgICB2b2lkIGR1bXBNZXRh
KFByaW50U3RyZWFtJikgY29uc3Qgb3ZlcnJpZGU7CisKK3ByaXZhdGU6CisgICAgZnJpZW5kIGNs
YXNzIFByb2NlZHVyZTsKKworICAgIC8vIFVzZSB0aGlzIGZvcm0gZm9yIENoZWNrQWRkLCBDaGVj
a1N1YiwgYW5kIENoZWNrTXVsLgorICAgIENoZWNrVmFsdWUodW5zaWduZWQgaW5kZXgsIE9wY29k
ZSBvcGNvZGUsIE9yaWdpbiBvcmlnaW4sIFZhbHVlKiBsZWZ0LCBWYWx1ZSogcmlnaHQpCisgICAg
ICAgIDogVmFsdWUoaW5kZXgsIG9wY29kZSwgbGVmdC0+dHlwZSgpLCBvcmlnaW4sIGxlZnQsIHJp
Z2h0KQorICAgIHsKKyAgICAgICAgQVNTRVJUKGlzSW50KHR5cGUoKSkpOworICAgICAgICBBU1NF
UlQobGVmdC0+dHlwZSgpID09IHJpZ2h0LT50eXBlKCkpOworICAgICAgICBBU1NFUlQob3Bjb2Rl
ID09IENoZWNrQWRkIHx8IG9wY29kZSA9PSBDaGVja1N1YiB8fCBvcGNvZGUgPT0gQ2hlY2tNdWwp
OworICAgIH0KKworICAgIC8vIFVzZSB0aGlzIGZvcm0gZm9yIENoZWNrLgorICAgIENoZWNrVmFs
dWUodW5zaWduZWQgaW5kZXgsIE9wY29kZSBvcGNvZGUsIE9yaWdpbiBvcmlnaW4sIFZhbHVlKiBw
cmVkaWNhdGUpCisgICAgICAgIDogVmFsdWUoaW5kZXgsIG9wY29kZSwgVm9pZCwgb3JpZ2luLCBw
cmVkaWNhdGUpCisgICAgeworICAgICAgICBBU1NFUlQob3BjZGUgPT0gQ2hlY2spOworICAgIH0K
K307CisKK30gfSAvLyBuYW1lc3BhY2UgSlNDOjpCMworCisjZW5kaWYgLy8gQjNDaGVja1ZhbHVl
X2gKKworCkluZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNDb25zdDMyVmFsdWUuY3Bw
Cj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM0NvbnN0MzJWYWx1ZS5j
cHAJKHJldmlzaW9uIDApCisrKyBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNDb25zdDMyVmFs
dWUuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsNDEgQEAKKy8qCisgKiBDb3B5cmlnaHQg
KEMpIDIwMTUgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJp
YnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91
dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxv
d2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNv
dXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwg
dGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAq
IDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJv
dmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0
aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9v
ciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAq
IFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFTIElTJycgQU5EIEFO
WQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBM
SU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkg
QU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4g
IElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFC
TEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhF
TVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1J
VEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsg
TE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJ
T04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdI
RVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJ
TkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhF
IFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJ
TElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKworI2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1
ZGUgIkIzQ29uc3QzMlZhbHVlLmgiCisKK25hbWVzcGFjZSBKU0MgeyBuYW1lc3BhY2UgQjMgewor
CitDb25zdDMyVmFsdWU6On5Db25zdDMyVmFsdWUoKQoreworfQorCit2b2lkIENvbnN0MzJWYWx1
ZTo6ZHVtcE1ldGEoUHJpbnRTdHJlYW0mIG91dCkgY29uc3QKK3sKKyAgICBvdXQucHJpbnQobV92
YWx1ZSk7Cit9CisKK30gfSAvLyBuYW1lc3BhY2UgSlNDOjpCMworCkluZGV4OiBTb3VyY2UvSmF2
YVNjcmlwdENvcmUvYjMvQjNDb25zdDMyVmFsdWUuaAo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2
YVNjcmlwdENvcmUvYjMvQjNDb25zdDMyVmFsdWUuaAkocmV2aXNpb24gMCkKKysrIFNvdXJjZS9K
YXZhU2NyaXB0Q29yZS9iMy9CM0NvbnN0MzJWYWx1ZS5oCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAg
KzEsNTkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTUgQXBwbGUgSW5jLiBBbGwgcmlnaHRz
IHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBi
aW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0
dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0Ogor
ICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92
ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRo
ZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkg
Zm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRo
aXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhl
CisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0
aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkg
QVBQTEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJB
TlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FS
UkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgor
ICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4g
T1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJ
TkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFH
RVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VC
U1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9G
SVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkg
VEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFC
SUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFS
SVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZF
TiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKwor
I2lmbmRlZiBCM0NvbnN0MzJWYWx1ZV9oCisjZGVmaW5lIEIzQ29uc3QzMlZhbHVlX2gKKworI2lu
Y2x1ZGUgIkIzVmFsdWUuaCIKKworbmFtZXNwYWNlIEpTQyB7IG5hbWVzcGFjZSBCMyB7CisKK2Ns
YXNzIENvbnN0MzJWYWx1ZSA6IHB1YmxpYyBWYWx1ZSB7CitwdWJsaWM6CisgICAgc3RhdGljIGJv
b2wgYWNjZXB0cyhPcGNvZGUgb3Bjb2RlKSB7IHJldHVybiBvcGNvZGUgPT0gQ29uc3QzMjsgfQor
ICAgIAorICAgIH5Db25zdDMyVmFsdWUoKTsKKyAgICAKKyAgICBpbnQzMl90IHZhbHVlKCkgY29u
c3QgeyByZXR1cm4gbV92YWx1ZTsgfQorCitwcm90ZWN0ZWQ6CisgICAgdm9pZCBkdW1wTWV0YShQ
cmludFN0cmVhbSYpIGNvbnN0IG92ZXJyaWRlOworCitwcml2YXRlOgorICAgIGZyaWVuZCBjbGFz
cyBQcm9jZWR1cmU7CisKKyAgICBDb25zdDMyVmFsdWUodW5zaWduZWQgaW5kZXgsIE9yaWdpbiBv
cmlnaW4sIGludDMyX3QgdmFsdWUpCisgICAgICAgIDogVmFsdWUoaW5kZXgsIENvbnN0MzIsIElu
dDMyLCBvcmlnaW4pCisgICAgICAgICwgbV92YWx1ZSh2YWx1ZSkKKyAgICB7CisgICAgfQorICAg
IAorICAgIGludDMyX3QgbV92YWx1ZTsKK307CisKK30gfSAvLyBuYW1lc3BhY2UgSlNDOjpCMwor
CisjZW5kaWYgLy8gQjNDb25zdDMyVmFsdWVfaAorCkluZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENv
cmUvYjMvQjNDb25zdDY0VmFsdWUuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0
Q29yZS9iMy9CM0NvbnN0NjRWYWx1ZS5jcHAJKHJldmlzaW9uIDApCisrKyBTb3VyY2UvSmF2YVNj
cmlwdENvcmUvYjMvQjNDb25zdDY0VmFsdWUuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEs
NDEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTUgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJl
c2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5h
cnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVk
IHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICog
MS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBj
b3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBm
b2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9y
bSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMg
bGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisg
KiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0
aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQ
TEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJ
RVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFO
VElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICog
UFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IK
KyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJ
REVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMg
KElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJ
VFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRT
OyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhF
T1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJ
VFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJ
TkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJ
RiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKworI2lu
Y2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgIkIzQ29uc3Q2NFZhbHVlLmgiCisKK25hbWVzcGFj
ZSBKU0MgeyBuYW1lc3BhY2UgQjMgeworCitDb25zdDY0VmFsdWU6On5Db25zdDY0VmFsdWUoKQor
eworfQorCit2b2lkIENvbnN0NjRWYWx1ZTo6ZHVtcE1ldGEoUHJpbnRTdHJlYW0mIG91dCkgY29u
c3QKK3sKKyAgICBvdXQucHJpbnQobV92YWx1ZSk7Cit9CisKK30gfSAvLyBuYW1lc3BhY2UgSlND
OjpCMworCkluZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNDb25zdDY0VmFsdWUuaAo9
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNDb25zdDY0VmFsdWUuaAko
cmV2aXNpb24gMCkKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM0NvbnN0NjRWYWx1ZS5o
CSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsNTkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIw
MTUgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9u
IGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICog
bW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBj
b25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBj
b2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBs
aXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJl
ZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29w
eXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9s
bG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhl
ciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMg
U09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICog
RVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVE
IFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJ
VE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5P
IEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9S
IEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZ
LCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRP
LAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBP
RiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhP
V0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIg
SU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVH
TElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQor
ICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBP
RiBTVUNIIERBTUFHRS4gCisgKi8KKworI2lmbmRlZiBCM0NvbnN0NjRWYWx1ZV9oCisjZGVmaW5l
IEIzQ29uc3Q2NFZhbHVlX2gKKworI2luY2x1ZGUgIkIzVmFsdWUuaCIKKworbmFtZXNwYWNlIEpT
QyB7IG5hbWVzcGFjZSBCMyB7CisKK2NsYXNzIENvbnN0NjRWYWx1ZSA6IHB1YmxpYyBWYWx1ZSB7
CitwdWJsaWM6CisgICAgc3RhdGljIGJvb2wgYWNjZXB0cyhPcGNvZGUgb3Bjb2RlKSB7IHJldHVy
biBvcGNvZGUgPT0gQ29uc3Q2NDsgfQorICAgIAorICAgIH5Db25zdDY0VmFsdWUoKTsKKyAgICAK
KyAgICBpbnQ2NF90IHZhbHVlKCkgY29uc3QgeyByZXR1cm4gbV92YWx1ZTsgfQorCitwcm90ZWN0
ZWQ6CisgICAgdm9pZCBkdW1wTWV0YShQcmludFN0cmVhbSYpIGNvbnN0IG92ZXJyaWRlOworCitw
cml2YXRlOgorICAgIGZyaWVuZCBjbGFzcyBQcm9jZWR1cmU7CisKKyAgICBDb25zdDY0VmFsdWUo
dW5zaWduZWQgaW5kZXgsIE9yaWdpbiBvcmlnaW4sIGludDY0X3QgdmFsdWUpCisgICAgICAgIDog
VmFsdWUoaW5kZXgsIENvbnN0NjQsIEludDY0LCBvcmlnaW4pCisgICAgICAgICwgbV92YWx1ZSh2
YWx1ZSkKKyAgICB7CisgICAgfQorICAgIAorICAgIGludDY0X3QgbV92YWx1ZTsKK307CisKK30g
fSAvLyBuYW1lc3BhY2UgSlNDOjpCMworCisjZW5kaWYgLy8gQjNDb25zdDY0VmFsdWVfaAorCklu
ZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNDb25zdERvdWJsZVZhbHVlLmNwcAo9PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNDb25zdERvdWJsZVZhbHVlLmNw
cAkocmV2aXNpb24gMCkKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM0NvbnN0RG91Ymxl
VmFsdWUuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsNDEgQEAKKy8qCisgKiBDb3B5cmln
aHQgKEMpIDIwMTUgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlz
dHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0
aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZv
bGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9m
IHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGlj
ZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4K
KyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUg
YWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFu
ZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFu
ZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoK
KyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFTIElTJycgQU5E
IEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5P
VCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJ
VFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1F
RC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBM
SUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICog
RVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBM
SU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNF
UzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJV
UFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFks
IFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNM
VURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0Yg
VEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NT
SUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKworI2luY2x1ZGUgImNvbmZpZy5oIgorI2lu
Y2x1ZGUgIkIzQ29uc3REb3VibGVWYWx1ZS5oIgorCituYW1lc3BhY2UgSlNDIHsgbmFtZXNwYWNl
IEIzIHsKKworQ29uc3REb3VibGVWYWx1ZTo6fkNvbnN0RG91YmxlVmFsdWUoKQoreworfQorCit2
b2lkIENvbnN0RG91YmxlVmFsdWU6OmR1bXBNZXRhKFByaW50U3RyZWFtJiBvdXQpIGNvbnN0Cit7
CisgICAgb3V0LnByaW50ZigiJWxlIiwgbV92YWx1ZSk7Cit9CisKK30gfSAvLyBuYW1lc3BhY2Ug
SlNDOjpCMworCkluZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNDb25zdERvdWJsZVZh
bHVlLmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzQ29uc3REb3Vi
bGVWYWx1ZS5oCShyZXZpc2lvbiAwKQorKysgU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzQ29u
c3REb3VibGVWYWx1ZS5oCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsNTkgQEAKKy8qCisgKiBD
b3B5cmlnaHQgKEMpIDIwMTUgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAq
IFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGgg
b3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQg
dGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRp
b25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAg
IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xh
aW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVj
ZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRp
b25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0
aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9u
LgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFTIElT
JycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywg
QlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFO
VEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElT
Q0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IKKyAqIENPTlRSSUJVVE9S
UyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFM
LAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVU
IE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBT
RVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJ
TlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFC
SUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAq
IChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBP
VVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRI
RSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKworI2lmbmRlZiBCM0NvbnN0RG91
YmxlVmFsdWVfaAorI2RlZmluZSBCM0NvbnN0RG91YmxlVmFsdWVfaAorCisjaW5jbHVkZSAiQjNW
YWx1ZS5oIgorCituYW1lc3BhY2UgSlNDIHsgbmFtZXNwYWNlIEIzIHsKKworY2xhc3MgQ29uc3RE
b3VibGVWYWx1ZSA6IHB1YmxpYyBWYWx1ZSB7CitwdWJsaWM6CisgICAgc3RhdGljIGJvb2wgYWNj
ZXB0cyhPcGNvZGUgb3Bjb2RlKSB7IHJldHVybiBvcGNvZGUgPT0gQ29uc3REb3VibGU7IH0KKyAg
ICAKKyAgICB+Q29uc3REb3VibGVWYWx1ZSgpOworICAgIAorICAgIGRvdWJsZSB2YWx1ZSgpIGNv
bnN0IHsgcmV0dXJuIG1fdmFsdWU7IH0KKworcHJvdGVjdGVkOgorICAgIHZvaWQgZHVtcE1ldGEo
UHJpbnRTdHJlYW0mKSBjb25zdCBvdmVycmlkZTsKKworcHJpdmF0ZToKKyAgICBmcmllbmQgY2xh
c3MgUHJvY2VkdXJlOworCisgICAgQ29uc3REb3VibGVWYWx1ZSh1bnNpZ25lZCBpbmRleCwgT3Jp
Z2luIG9yaWdpbiwgZG91YmxlIHZhbHVlKQorICAgICAgICA6IFZhbHVlKGluZGV4LCBDb25zdERv
dWJsZSwgRG91YmxlLCBvcmlnaW4pCisgICAgICAgICwgbV92YWx1ZSh2YWx1ZSkKKyAgICB7Cisg
ICAgfQorICAgIAorICAgIGRvdWJsZSBtX3ZhbHVlOworfTsKKworfSB9IC8vIG5hbWVzcGFjZSBK
U0M6OkIzCisKKyNlbmRpZiAvLyBCM0NvbnN0RG91YmxlVmFsdWVfaAorCkluZGV4OiBTb3VyY2Uv
SmF2YVNjcmlwdENvcmUvYjMvQjNDb250cm9sVmFsdWUuY3BwCj09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJj
ZS9KYXZhU2NyaXB0Q29yZS9iMy9CM0NvbnRyb2xWYWx1ZS5jcHAJKHJldmlzaW9uIDApCisrKyBT
b3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNDb250cm9sVmFsdWUuY3BwCSh3b3JraW5nIGNvcHkp
CkBAIC0wLDAgKzEsNDMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTUgQXBwbGUgSW5jLiBB
bGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291
cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBh
cmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBh
cmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWlu
IHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlv
bnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBp
biBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBu
b3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWlt
ZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJv
dmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJP
VklERUQgQlkgQVBQTEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBM
SUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElN
UExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFS
VElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQ
UExFIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElO
RElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5U
SUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1F
TlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9S
CisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFO
RCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNU
UklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhF
UldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZU
V0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4g
CisgKi8KKworI2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgIkIzQ29udHJvbFZhbHVlLmgi
CisKK25hbWVzcGFjZSBKU0MgeyBuYW1lc3BhY2UgQjMgeworCitDb250cm9sVmFsdWU6On5Db250
cm9sVmFsdWUoKQoreworfQorCit2b2lkIENvbnRyb2xWYWx1ZTo6ZHVtcE1ldGEoUHJpbnRTdHJl
YW0mIG91dCkgY29uc3QKK3sKKyAgICBDb21tYVByaW50ZXIgY29tbWE7CisgICAgZm9yIChCYXNp
Y0Jsb2NrKiBibG9jayA6IG1fc3VjY2Vzc29ycykKKyAgICAgICAgb3V0LnByaW50KGNvbW1hLCBw
b2ludGVyRHVtcChibG9jaykpOworfQorCit9IH0gLy8gbmFtZXNwYWNlIEpTQzo6QjMKKwpJbmRl
eDogU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzQ29udHJvbFZhbHVlLmgKPT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQot
LS0gU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzQ29udHJvbFZhbHVlLmgJKHJldmlzaW9uIDAp
CisrKyBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNDb250cm9sVmFsdWUuaAkod29ya2luZyBj
b3B5KQpAQCAtMCwwICsxLDExNyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNSBBcHBsZSBJ
bmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBp
biBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRp
b24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMK
KyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCBy
ZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29u
ZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRp
b25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAq
ICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlz
Y2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFs
cyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJ
UyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9S
IElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQor
ICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1Ig
QSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hB
TEwgQVBQTEUgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVD
VCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNF
UVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9D
VVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFU
QSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVT
RUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFD
VCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9S
IE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElT
IFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFN
QUdFLiAKKyAqLworCisjaWZuZGVmIEIzQ29udHJvbFZhbHVlX2gKKyNkZWZpbmUgQjNDb250cm9s
VmFsdWVfaAorCisjaW5jbHVkZSAiQjNWYWx1ZS5oIgorCituYW1lc3BhY2UgSlNDIHsgbmFtZXNw
YWNlIEIzIHsKKworY2xhc3MgQmFzaWNCbG9jazsKKworY2xhc3MgQ29udHJvbFZhbHVlIDogcHVi
bGljIFZhbHVlIHsKK3B1YmxpYzoKKyAgICBzdGF0aWMgYm9vbCBhY2NlcHRzKE9wY29kZSBvcGNv
ZGUpCisgICAgeworICAgICAgICBzd2l0Y2ggKG9wY29kZSkgeworICAgICAgICBjYXNlIEp1bXA6
CisgICAgICAgIGNhc2UgQnJhbmNoOgorICAgICAgICBjYXNlIFJldHVybjoKKyAgICAgICAgY2Fz
ZSBPb3BzOgorICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIGNhc2UgU3dpdGNoOiAK
KyAgICAgICAgICAgIC8vIFRoaXMgaXMgaGVyZSBiZWNhdXNlIFN3aXRjaFZhbHVlIGlzIGEgc3Vi
Y2xhc3Mgb2YgQ29udHJvbFZhbHVlLCBzbyB3ZSB3YW50CisgICAgICAgICAgICAvLyBzd3RpY2hW
YWx1ZS0+YXM8Q29udHJvbFZhbHVlPigpIHRvIHJldHVybiBub24tbnVsbC4KKyAgICAgICAgICAg
IHJldHVybiB0cnVlOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuIGZhbHNl
OworICAgICAgICB9CisgICAgfQorCisgICAgdHlwZWRlZiBWZWN0b3I8QmFzaWNCbG9jayosIDI+
IFN1Y2Nlc3Nvckxpc3Q7CisKKyAgICB+Q29udHJvbFZhbHVlKCk7CisKKyAgICB1bnNpZ25lZCBu
dW1TdWNjZXNzb3JzKCkgY29uc3QgeyByZXR1cm4gbV9zdWNjZXNzb3JzLnNpemUoKTsgfQorICAg
IEJhc2ljQmxvY2sqIHN1Y2Nlc3Nvcih1bnNpZ25lZCBpbmRleCkgY29uc3QgeyByZXR1cm4gbV9z
dWNjZXNzb3JzW2ldOyB9CisgICAgQmFzaWNCbG9jayomIHN1Y2Nlc3Nvcih1bnNpZ25lZCBpbmRl
eCkgeyByZXR1cm4gbV9zdWNjZXNzb3JzW2ldOyB9CisKKyAgICBjb25zdCBTdWNjZXNzb3JMaXN0
JiBzdWNjZXNzb3JzKCkgY29uc3QgeyByZXR1cm4gbV9zdWNjZXNzb3JzOyB9CisKK3Byb3RlY3Rl
ZDoKKyAgICB2b2lkIGR1bXBNZXRhKFByaW50U3RyZWFtJikgY29uc3Qgb3ZlcnJpZGU7CisKKyAg
ICAvLyBVc2UgdGhpcyBmb3Igc3ViY2xhc3Nlcy4KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZS4uLiBB
cmd1bWVudHM+CisgICAgQ29udHJvbFZhbHVlKHVuc2lnbmVkIGluZGV4LCBPcGNvZGUgb3Bjb2Rl
LCBUeXBlIHR5cGUsIE9yaWdpbiBvcmlnaW4sIEFyZ3VtZW50cy4uLiBhcmd1bWVudHMpCisgICAg
ICAgIDogVmFsdWUoaW5kZXgsIG9wY29kZSwgdHlwZSwgb3JpZ2luLCBhcmd1bWVudHMuLi4pCisg
ICAgeworICAgIH0KKworICAgIC8vIFN1YmNsYXNzZXMgd2lsbCBwb3B1bGF0ZSB0aGlzLgorICAg
IFN1Y2Nlc3Nvckxpc3QgbV9zdWNjZXNzb3JzOworCitwcml2YXRlOgorICAgIGZyaWVuZCBjbGFz
cyBQcm9jZWR1cmU7CisKKyAgICAvLyBVc2UgdGhpcyBmb3IgT29wcy4KKyAgICBDb250cm9sVmFs
dWUodW5zaWduZWQgaW5kZXgsIE9wY29kZSBvcGNvZGUsIE9yaWdpbiBvcmlnaW4pCisgICAgICAg
IDogVmFsdWUoaW5kZXgsIG9wY29kZSwgVm9pZCwgb3JpZ2luKQorICAgIHsKKyAgICAgICAgQVNT
RVJUKG9wY29kZSA9PSBPb3BzKTsKKyAgICB9CisKKyAgICAvLyBVc2UgdGhpcyBmb3IgUmV0dXJu
LgorICAgIENvbnRyb2xWYWx1ZSh1bnNpZ25lZCBpbmRleCwgT3Bjb2RlIG9wY29kZSwgT3JpZ2lu
IG9yaWdpbiwgVmFsdWUqIHJlc3VsdCkKKyAgICAgICAgOiBWYWx1ZShpbmRleCwgb3Bjb2RlLCBW
b2lkLCBvcmlnaW4sIHJlc3VsdCkKKyAgICB7CisgICAgICAgIEFTU0VSVChvcGNvZGUgPT0gUmV0
dXJuKTsKKyAgICB9CisKKyAgICAvLyBVc2UgdGhpcyBmb3IgSnVtcC4KKyAgICBDb250cm9sVmFs
dWUodW5zaWduZWQgaW5kZXgsIE9wY29kZSBvcGNvZGUsIE9yaWdpbiBvcmlnaW4sIEJhc2ljQmxv
Y2sqIHRhcmdldCkKKyAgICAgICAgOiBWYWx1ZShpbmRleCwgb3Bjb2RlLCBWb2lkLCBvcmlnaW4p
CisgICAgeworICAgICAgICBBU1NFUlQob3Bjb2RlID09IEp1bXApOworICAgICAgICBtX3N1Y2Nl
c3NvcnMuYXBwZW5kKHRhcmdldCk7CisgICAgfQorCisgICAgLy8gVXNlIHRoaXMgZm9yIEJyYW5j
aC4KKyAgICBDb250cm9sVmFsdWUoCisgICAgICAgIHVuc2lnbmVkIGluZGV4LCBPcGNvZGUgb3Bj
b2RlLCBPcmlnaW4gb3JpZ2luLCBWYWx1ZSogcHJlZGljYXRlLAorICAgICAgICBCYXNpY0Jsb2Nr
KiB5ZXMsIEJhc2ljQmxvY2sqIG5vKQorICAgICAgICA6IFZhbHVlKGluZGV4LCBvcGNvZGUsIFZv
aWQsIG9yaWdpbiwgcHJlZGljYXRlKQorICAgIHsKKyAgICAgICAgQVNTRVJUKG9wY29kZSA9PSBC
cmFuY2gpOworICAgICAgICBtX3N1Y2Nlc3NvcnMuYXBwZW5kKHllcyk7CisgICAgICAgIG1fc3Vj
Y2Vzc29ycy5hcHBlbmQobm8pOworICAgIH0KK307CisKK30gfSAvLyBuYW1lc3BhY2UgSlNDOjpC
MworCisjZW5kaWYgLy8gQjNDb250cm9sVmFsdWVfaAorCkluZGV4OiBTb3VyY2UvSmF2YVNjcmlw
dENvcmUvYjMvQjNJbmRleFNldC5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29y
ZS9iMy9CM0luZGV4U2V0LmgJKHJldmlzaW9uIDApCisrKyBTb3VyY2UvSmF2YVNjcmlwdENvcmUv
YjMvQjNJbmRleFNldC5oCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsMTQxIEBACisvKgorICog
Q29weXJpZ2h0IChDKSAyMDE1IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisg
KiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRo
IG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0
IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0
aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAg
ICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2Ns
YWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1
Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0
aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRh
dGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlv
bi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gYGBBUyBJ
UycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcs
IEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hB
TlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJ
U0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SCisgKiBDT05UUklCVVRP
UlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lB
TCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJV
VCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1Ig
U0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1Mg
SU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElB
QklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisg
KiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkg
T1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBU
SEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisKKyNpZm5kZWYgQjNJbmRleFNl
dF9oCisjZGVmaW5lIEIzSW5kZXhTZXRfaAorCisjaW5jbHVkZSA8d3RmL0JpdFZlY3Rvci5oPgor
I2luY2x1ZGUgPHd0Zi9Db21tYVByaW50ZXIuaD4KKworbmFtZXNwYWNlIEpTQyB7IG5hbWVzcGFj
ZSBCMyB7CisKKy8vIFRoaXMgaXMgYSBzZXQgZm9yIHRoaW5ncyB0aGF0IGhhdmUgYW4gaW5kZXgo
KS4gSXQncyBzdXBlciBlZmZpY2llbnQgZm9yIEJhc2ljQmxvY2tzLiBJdCdzIG9ubHkKKy8vIGVm
ZmljaWVudCBmb3IgVmFsdWVzIGlmIHlvdSBkb24ndCBjcmVhdGUgdG9vIG1hbnkgb2YgdGhlc2Ug
c2V0cywgc2luY2UgVmFsdWVzIGNhbiBoYXZlIHZlcnkgc3BhcnNlCisvLyBpbmRpY2VzIGFuZCB0
aGVyZSBhcmUgYSBsb3Qgb2YgVmFsdWVzLgorCisvLyBJZiB5b3Ugd2FudCBhIHNldCBvZiBCYXNp
Y0Jsb2NrcywgeW91IGRvIEluZGV4U2V0PEJhc2ljQmxvY2s+LiBTbywgVCA9IEJhc2ljQmxvY2su
Cit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorY2xhc3MgSW5kZXhTZXQgeworcHVibGljOgorICAgIElu
ZGV4U2V0KCkKKyAgICB7CisgICAgfQorCisgICAgYm9vbCBhZGQoVCogdmFsdWUpCisgICAgewor
ICAgICAgICByZXR1cm4gIW1fc2V0LnNldCh2YWx1ZS0+aW5kZXgoKSk7CisgICAgfQorCisgICAg
Ym9vbCBjb250YWlucyhUKiB2YWx1ZSkgY29uc3QKKyAgICB7CisgICAgICAgIGlmICghdmFsdWUp
CisgICAgICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICAgICAgcmV0dXJuIG1fc2V0LmdldCh2
YWx1ZS0+aW5kZXgoKSk7CisgICAgfQorCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgQ29sbGVjdGlv
blR5cGU+CisgICAgY2xhc3MgSXRlcmFibGUgeworICAgIHB1YmxpYzoKKyAgICAgICAgSXRlcmFi
bGUoY29uc3QgQ29sbGVjdGlvblR5cGUmIGNvbGxlY3Rpb24sIGNvbnN0IEluZGV4U2V0JiBzZXQp
CisgICAgICAgICAgICA6IG1fY29sbGVjdGlvbihjb2xsZWN0aW9uKQorICAgICAgICAgICAgLCBt
X3NldChzZXQpCisgICAgICAgIHsKKyAgICAgICAgfQorCisgICAgICAgIGNsYXNzIGl0ZXJhdG9y
IHsKKyAgICAgICAgcHVibGljOgorICAgICAgICAgICAgaXRlcmF0b3IoKQorICAgICAgICAgICAg
ICAgIDogbV9jb2xsZWN0aW9uKG51bGxwdHIpCisgICAgICAgICAgICB7CisgICAgICAgICAgICB9
CisKKyAgICAgICAgICAgIGl0ZXJhdG9yKGNvbnN0IENvbGxlY3Rpb25UeXBlJiBjb2xsZWN0aW9u
LCBCaXRWZWN0b3I6OlNldEJpdHNJdGVyYWJsZTo6aXRlcmF0b3IgaXRlcikKKyAgICAgICAgICAg
ICAgICA6IG1fY29sbGVjdGlvbigmY29sbGVjdGlvbikKKyAgICAgICAgICAgICAgICAsIG1faXRl
cihpdGVyKQorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBUKiBv
cGVyYXRvciooKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBtX2NvbGxl
Y3Rpb24tPmF0KCptX2l0ZXIpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpdGVyYXRv
ciYgb3BlcmF0b3IrKygpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbV9pdGVyKys7
CisgICAgICAgICAgICAgICAgcmV0dXJuICp0aGlzOworICAgICAgICAgICAgfQorCisgICAgICAg
ICAgICBib29sIG9wZXJhdG9yPT0oY29uc3QgaXRlcmF0b3ImIG90aGVyKSBjb25zdAorICAgICAg
ICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBtX2l0ZXIgPT0gb3RoZXIubV9pdGVyOwor
ICAgICAgICAgICAgfQorCisgICAgICAgICAgICBib29sIG9wZXJhdG9yIT0oY29uc3QgaXRlcmF0
b3ImIG90aGVyKSBjb25zdAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiAh
KCp0aGlzID09IG90aGVyKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICBwcml2YXRlOgorICAg
ICAgICAgICAgY29uc3QgQ29sbGVjdGlvblR5cGUqIG1fY29sbGVjdGlvbjsKKyAgICAgICAgICAg
IEJpdFZlY3Rvcjo6U2V0Qml0c0l0ZXJhYmxlOjppdGVyYXRvciBtX2l0ZXI7CisgICAgICAgIH07
CisKKyAgICAgICAgaXRlcmF0b3IgYmVnaW4oKSBjb25zdCB7IHJldHVybiBpdGVyYXRvcihtX2Nv
bGxlY3Rpb24sIG1fc2V0LmJlZ2luKCkpOyB9CisgICAgICAgIGl0ZXJhdG9yIGVuZCgpIGNvbnN0
IHsgcmV0dXJuIGl0ZXJhdG9yKG1fY29sbGVjdGlvbiwgbV9zZXQuZW5kKCkpOyB9CisKKyAgICBw
cml2YXRlOgorICAgICAgICBjb25zdCBDb2xsZWN0aW9uVHlwZSYgbV9jb2xsZWN0aW9uOworICAg
ICAgICBjb25zdCBJbmRleFNldCYgbV9zZXQ7CisgICAgfTsKKworICAgIC8vIEZvciBiYXNpYyBi
bG9ja3MsIHlvdSBkbzoKKyAgICAvLyBpbmRleFNldC52YWx1ZXMocHJvY2VkdXJlKTsKKyAgICAv
LworICAgIC8vIEZvciB2YWx1ZXMsIHlvdSBkbzoKKyAgICAvLyBpbmRleFNldC52YWx1ZXMocHJv
Y2VkdXJlLnZhbHVlcygpKTsKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBDb2xsZWN0aW9uVHlwZT4K
KyAgICBJdGVyYWJsZTxDb2xsZWN0aW9uVHlwZT4gdmFsdWVzKGNvbnN0IENvbGxlY3Rpb25UeXBl
JiBjb2xsZWN0aW9uKSBjb25zdAorICAgIHsKKyAgICAgICAgcmV0dXJuIEl0ZXJhYmxlPENvbGxl
Y3Rpb25UeXBlPihjb2xsZWN0aW9uKTsKKyAgICB9CisKKyAgICBjb25zdCBCaXRWZWN0b3ImIGlu
ZGljZXMoKSBjb25zdCB7IHJldHVybiBtX3NldDsgfQorCisgICAgdm9pZCBkdW1wKFByaW50U3Ry
ZWFtJiBvdXQpIGNvbnN0CisgICAgeworICAgICAgICBDb21tYVByaW50ZXIgY29tbWE7CisgICAg
ICAgIGZvciAoc2l6ZV90IGluZGV4IDogaW5kaWNlcygpLnNldEJpdHMoKSkKKyAgICAgICAgICAg
IG91dC5wcmludChjb21tYSwgVDo6ZHVtcFByZWZpeCwgaW5kZXgpOworICAgIH0KKworcHJpdmF0
ZToKKyAgICBCaXRWZWN0b3IgbV9zZXQ7Cit9OworCit9IH0gLy8gbmFtZXNwYWNlIEpTQzo6QjMK
KworI2VuZGlmIC8vIEIzSW5kZXhTZXRfaAorCkluZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUv
YjMvQjNMb3dlcmluZ01hdGNoZXIucGF0dGVybnMKPT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL0phdmFT
Y3JpcHRDb3JlL2IzL0IzTG93ZXJpbmdNYXRjaGVyLnBhdHRlcm5zCShyZXZpc2lvbiAwKQorKysg
U291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzTG93ZXJpbmdNYXRjaGVyLnBhdHRlcm5zCSh3b3Jr
aW5nIGNvcHkpCkBAIC0wLDAgKzEsMzcgQEAKKyMgQ29weXJpZ2h0IChDKSAyMDE1IEFwcGxlIElu
Yy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyMKKyMgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBz
b3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisjIG1vZGlmaWNhdGlvbiwg
YXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworIyBh
cmUgbWV0OgorIyAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4g
dGhlIGFib3ZlIGNvcHlyaWdodAorIyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25z
IGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisjIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBi
aW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisjICAgIG5vdGlj
ZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBp
biB0aGUKKyMgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVk
IHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyMKKyMgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBC
WSBBUFBMRSBJTkMuIEFORCBJVFMgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJworIyBBTkQgQU5ZIEVY
UFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBU
TywKKyMgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5F
U1MgRk9SIEEgUEFSVElDVUxBUgorIyBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVO
VCBTSEFMTCBBUFBMRSBJTkMuIE9SIElUUyBDT05UUklCVVRPUlMKKyMgQkUgTElBQkxFIEZPUiBB
TlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgor
IyBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQ
Uk9DVVJFTUVOVCBPRgorIyBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVT
RSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MKKyMgSU5URVJSVVBUSU9OKSBIT1dFVkVS
IENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KKyMgQ09O
VFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9S
IE9USEVSV0lTRSkKKyMgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMg
U09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRgorIyBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBE
QU1BR0UuCisKK21hdGNoZXIgTG93ZXJpbmdNYXRjaGVyCisKKyMgVGhlc2UgcnVsZXMgYXJlIGNv
bnNpZGVyZWQgaW4gYSBjYXNjYWRlLCBzdGFydGluZyBhdCB0aGUgdG9wLiBJdCdzIGltcGxlbmVu
dGVkIHVzaW5nIHN3aXRjaAorIyBzdGF0ZW1lbnRzIHdoZXJldmVyIHBvc3NpYmxlLgorCisjIE5v
dGU6IGFkZGluZyBtb3JlIHJ1bGVzIHRvIHRoaXMgbWF0Y2hlciBpcyBhbiBleGNlbGxlbnQgd2F5
IG9mIGltcHJvdmluZyBwZXJmb3JtYW5jZSEKKworTG9hZCA9IExvYWQoYWRkcmVzcykKKworQWRk
TG9hZCA9IEFkZChMb2FkKGFkZHJlc3MpLCB2YWx1ZSkKK0FkZCA9IEFkZChsZWZ0LCByaWdodCkK
KworUmV0dXJuID0gUmV0dXJuKHZhbHVlKQorCkluZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUv
YjMvQjNNZW1vcnlWYWx1ZS5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRDb3Jl
L2IzL0IzTWVtb3J5VmFsdWUuY3BwCShyZXZpc2lvbiAwKQorKysgU291cmNlL0phdmFTY3JpcHRD
b3JlL2IzL0IzTWVtb3J5VmFsdWUuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsNDIgQEAK
Ky8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTUgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVk
LgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9y
bXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3Zp
ZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVk
aXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmln
aHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dp
bmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0
IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBv
ZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBk
b2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlz
dHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5D
LiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElO
Q0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBP
RiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9T
RSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IKKyAqIENP
TlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFM
LCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xV
RElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBH
T09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBC
VVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisg
KiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9S
IFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4g
QU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJ
U0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKworI2luY2x1ZGUg
ImNvbmZpZy5oIgorI2luY2x1ZGUgIkIzTWVtb3J5VmFsdWUuaCIKKworbmFtZXNwYWNlIEpTQyB7
IG5hbWVzcGFjZSBCMyB7CisKK01lbW9yeVZhbHVlOjp+TWVtb3J5VmFsdWUoKQoreworfQorCit2
b2lkIE1lbW9yeVZhbHVlOjpkdW1wTWV0YShQcmludFN0cmVhbSYgb3V0KSBjb25zdAoreworICAg
IGlmIChtX29mZnNldCkKKyAgICAgICAgb3V0LnByaW50KCJvZmZzZXQgPSAiLCBtX29mZnNldCk7
Cit9CisKK30gfSAvLyBuYW1lc3BhY2UgSlNDOjpCMworCkluZGV4OiBTb3VyY2UvSmF2YVNjcmlw
dENvcmUvYjMvQjNNZW1vcnlWYWx1ZS5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0
Q29yZS9iMy9CM01lbW9yeVZhbHVlLmgJKHJldmlzaW9uIDApCisrKyBTb3VyY2UvSmF2YVNjcmlw
dENvcmUvYjMvQjNNZW1vcnlWYWx1ZS5oCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsMTQyIEBA
CisvKgorICogQ29weXJpZ2h0IChDKSAyMDE1IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZl
ZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZv
cm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92
aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJl
ZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJp
Z2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93
aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVz
dCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qg
b2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAg
ZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRp
c3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElO
Qy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJ
TkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMg
T0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBP
U0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SCisgKiBD
T05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRB
TCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNM
VURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUg
R09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1Ig
QlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQor
ICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBP
UiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElO
IEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURW
SVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisKKyNpZm5kZWYg
QjNNZW1vcnlWYWx1ZV9oCisjZGVmaW5lIEIzTWVtb3J5VmFsdWVfaAorCisjaW5jbHVkZSAiQjNW
YWx1ZS5oIgorCituYW1lc3BhY2UgSlNDIHsgbmFtZXNwYWNlIEIzIHsKKworY2xhc3MgTWVtb3J5
VmFsdWUgOiBwdWJsaWMgVmFsdWUgeworcHVibGljOgorICAgIHN0YXRpYyBib29sIGFjY2VwdHMo
T3Bjb2RlIG9wY29kZSkKKyAgICB7CisgICAgICAgIHN3aXRjaCAob3Bjb2RlKSB7CisgICAgICAg
IGNhc2UgTG9hZDhaOgorICAgICAgICBjYXNlIExvYWQ4UzoKKyAgICAgICAgY2FzZSBMb2FkMTZa
OgorICAgICAgICBjYXNlIExvYWQxNlM6CisgICAgICAgIGNhc2UgTG9hZEZsb2F0OgorICAgICAg
ICBjYXNlIExvYWQ6CisgICAgICAgIGNhc2UgU3RvcmU4OgorICAgICAgICBjYXNlIFN0b3JlMTY6
CisgICAgICAgIGNhc2UgU3RvcmVGbG9hdDoKKyAgICAgICAgY2FzZSBTdG9yZToKKyAgICAgICAg
ICAgIHJldHVybiB0cnVlOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuIGZh
bHNlOworICAgICAgICB9CisgICAgfQorCisgICAgfk1lbW9yeVZhbHVlKCk7CisKKyAgICBpbnRw
dHJfdCBvZmZzZXQoKSBjb25zdCB7IHJldHVybiBtX29mZnNldDsgfQorCitwcm90ZWN0ZWQ6Cisg
ICAgdm9pZCBkdW1wTWV0YShQcmludFN0cmVhbSYpIGNvbnN0IG92ZXJyaWRlOworCitwcml2YXRl
OgorICAgIGZyaWVuZCBjbGFzcyBQcm9jZWR1cmU7CisKKyAgICAvLyBVc2UgdGhpcyBmb3JtIGZv
ciBMb2FkIChidXQgbm90IExvYWQ4WiwgTG9hZDhTLCBvciBhbnkgb2YgdGhlIExvYWRzIHRoYXQg
aGF2ZSBhIHN1ZmZpeCB0aGF0CisgICAgLy8gZGVzY3JpYmVzIHRoZSByZXR1cm5lZCB0eXBlKS4K
KyAgICBNZW1vcnlWYWx1ZSgKKyAgICAgICAgdW5zaWduZWQgaW5kZXgsIE9wY29kZSBvcGNvZGUs
IFR5cGUgdHlwZSwgT3JpZ2luIG9yaWdpbiwgVmFsdWUqIHBvaW50ZXIsCisgICAgICAgIGludHB0
cl90IG9mZnNldCA9IDApCisgICAgICAgIDogVmFsdWUoaW5kZXgsIG9wY29kZSwgdHlwZSwgb3Jp
Z2luLCBwb2ludGVyKQorICAgICAgICAsIG1fb2Zmc2V0KG9mZnNldCkKKyAgICB7CisgICAgICAg
IGlmICghQVNTRVJUX0RJU0FCTEVEKSB7CisgICAgICAgICAgICBzd2l0Y2ggKG9wY29kZSkgewor
ICAgICAgICAgICAgY2FzZSBMb2FkOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAg
ICAgY2FzZSBMb2FkOFo6CisgICAgICAgICAgICBjYXNlIExvYWQ4UzoKKyAgICAgICAgICAgIGNh
c2UgTG9hZDE2WjoKKyAgICAgICAgICAgIGNhc2UgTG9hZDE2UzoKKyAgICAgICAgICAgICAgICBB
U1NFUlQodHlwZSA9PSBJbnQzMik7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAg
ICBjYXNlIExvYWRGbG9hdDoKKyAgICAgICAgICAgICAgICBBU1NFUlQodHlwZSA9PSBEb3VibGUp
OworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBTdG9yZTg6CisgICAg
ICAgICAgICBjYXNlIFN0b3JlMTY6CisgICAgICAgICAgICBjYXNlIFN0b3JlRmxvYXQ6CisgICAg
ICAgICAgICBjYXNlIFN0b3JlOgorICAgICAgICAgICAgICAgIEFTU0VSVCh0eXBlID09IFZvaWQp
OworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAg
ICAgICAgICBBU1NFUlRfTk9UX1JFQUNIRUQoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQor
ICAgIH0KKworICAgIC8vIFVzZSB0aGlzIGZvcm0gZm9yIGxvYWRzIHdoZXJlIHRoZSByZXR1cm4g
dHlwZSBpcyBpbXBsaWVkLgorICAgIE1lbW9yeVZhbHVlKHVuc2lnbmVkIGluZGV4LCBPcGNvZGUg
b3Bjb2RlLCBPcmlnaW4gb3JpZ2luLCBWYWx1ZSogcG9pbnRlciwgaW50cHRyX3Qgb2Zmc2V0ID0g
MCkKKyAgICAgICAgOiBWYWx1ZShpbmRleCwgb3Bjb2RlLCBvcGNvZGUgPT0gTG9hZEZsb2F0ID8g
RG91YmxlIDogSW50MzIsIG9yaWdpbiwgcG9pbnRlcikKKyAgICAgICAgLCBtX29mZnNldChvZmZz
ZXQpCisgICAgeworICAgICAgICBpZiAoIUFTU0VSVF9ESVNBQkxFRCkgeworICAgICAgICAgICAg
c3dpdGNoIChvcGNvZGUpIHsKKyAgICAgICAgICAgIGNhc2UgTG9hZDhaOgorICAgICAgICAgICAg
Y2FzZSBMb2FkOFM6CisgICAgICAgICAgICBjYXNlIExvYWQxNlo6CisgICAgICAgICAgICBjYXNl
IExvYWQxNlM6CisgICAgICAgICAgICBjYXNlIExvYWRGbG9hdDoKKyAgICAgICAgICAgICAgICBi
cmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgQVNTRVJUX05PVF9S
RUFDSEVEKCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAg
IH0KKyAgICB9CisKKyAgICAvLyBVc2UgdGhpcyBmb3JtIGZvciBzdG9yZXMuCisgICAgTWVtb3J5
VmFsdWUoCisgICAgICAgIHVuc2lnbmVkIGluZGV4LCBPcGNvZGUgb3Bjb2RlLCBPcmlnaW4gb3Jp
Z2luLCBWYWx1ZSogdmFsdWUsIFZhbHVlKiBwb2ludGVyLAorICAgICAgICBpbnRwdHJfdCBvZmZz
ZXQgPSAwKQorICAgICAgICA6IFZhbHVlKGluZGV4LCBvcGNvZGUsIFZvaWQsIG9yaWdpbiwgdmFs
dWUsIHBvaW50ZXIpCisgICAgICAgICwgbV9vZmZzZXQob2Zmc2V0KQorICAgIHsKKyAgICAgICAg
aWYgKCFBU1NFUlRfRElTQUJMRUQpIHsKKyAgICAgICAgICAgIHN3aXRjaCAob3Bjb2RlKSB7Cisg
ICAgICAgICAgICBjYXNlIFN0b3JlODoKKyAgICAgICAgICAgIGNhc2UgU3RvcmUxNjoKKyAgICAg
ICAgICAgIGNhc2UgU3RvcmVGbG9hdDoKKyAgICAgICAgICAgIGNhc2UgU3RvcmU6CisgICAgICAg
ICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIEFT
U0VSVF9OT1RfUkVBQ0hFRCgpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAg
fQorICAgICAgICB9CisgICAgfQorfTsKKworfSB9IC8vIG5hbWVzcGFjZSBKU0M6OkIzCisKKyNl
bmRpZiAvLyBCM01lbW9yeVZhbHVlX2gKKwpJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL2Iz
L0IzT3Bjb2RlLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNP
cGNvZGUuY3BwCShyZXZpc2lvbiAwKQorKysgU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzT3Bj
b2RlLmNwcAkod29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDQ3IEBACisvKgorICogQ29weXJpZ2h0
IChDKSAyMDE1IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3Ry
aWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhv
dXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xs
b3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBz
b3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2Us
IHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisg
KiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFi
b3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQg
dGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQv
b3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisg
KiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBB
TlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1Qg
TElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZ
IEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQu
ICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElB
QkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVY
RU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElN
SVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7
IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBU
SU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBX
SEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVE
SU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRI
RSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lC
SUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisKKyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNs
dWRlICJCM09wY29kZS5oIgorCisjaW5jbHVkZSA8d3RmL1ByaW50U3RyZWFtLmg+CisKK25hbWVz
cGFjZSBXVEYgeworCit1c2luZyBuYW1lc3BhY2UgSlNDOjpCMzsKKwordm9pZCBwcmludEludGVy
bmFsKFByaW50U3RyZWFtJiBvdXQsIE9wY29kZSBvcGNvZGUpCit7CisgICAgc3dpdGNoIChvcGNv
ZGUpIHsKKyAgICBjYXNlIElkZW50aXR5OgorICAgICAgICBvdXQucHJpbnQoIklkZW50aXR5Iik7
CisgICAgICAgIHJldHVybjsKKyAgICAgICAgLy8gRklYTUUKKyAgICB9CisgICAgUkVMRUFTRV9B
U1NFUlRfTk9UX1JFQUNIRUQoKTsKK30KKworfSAvLyBuYW1lc3BhY2UgV1RGCisKSW5kZXg6IFNv
dXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM09wY29kZS5oCj09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9K
YXZhU2NyaXB0Q29yZS9iMy9CM09wY29kZS5oCShyZXZpc2lvbiAwKQorKysgU291cmNlL0phdmFT
Y3JpcHRDb3JlL2IzL0IzT3Bjb2RlLmgJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSwyMDMgQEAK
Ky8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTUgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVk
LgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9y
bXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3Zp
ZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVk
aXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmln
aHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dp
bmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0
IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBv
ZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBk
b2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlz
dHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5D
LiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElO
Q0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBP
RiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9T
RSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IKKyAqIENP
TlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFM
LCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xV
RElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBH
T09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBC
VVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisg
KiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9S
IFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4g
QU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJ
U0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKworI2lmbmRlZiBC
M09wY29kZV9oCisjZGVmaW5lIEIzT3Bjb2RlX2gKKworI2luY2x1ZGUgPHd0Zi9TdGRMaWJFeHRy
YXMuaD4KKworbmFtZXNwYWNlIEpTQyB7IG5hbWVzcGFjZSBCMyB7CisKK2VudW0gT3Bjb2RlIDog
aW50MTZfdCB7CisgICAgLy8gQSBuby1vcCB0aGF0IHJldHVybnMgVm9pZCwgdXNlZnVsIGZvciB3
aGVuIHlvdSB3YW50IHRvIHJlbW92ZSBhIHZhbHVlLgorICAgIE5vcCwKKyAgICAgCisgICAgLy8g
UG9seW1vcnBoaWMgaWRlbnRpdHksIHVzYWJsZSB3aXRoIGFueSB2YWx1ZSB0eXBlLgorICAgIElk
ZW50aXR5LAorCisgICAgLy8gQ29uc3RhbnRzLiBVc2UgdGhlIENvbnN0VmFsdWUqIGNsYXNzZXMu
IENvbnN0YW50cyBleGlzdCBpbiB0aGUgY29udHJvbCBmbG93LCBzbyB0aGF0IHdlIGNhbgorICAg
IC8vIHJlYXNvbiBhYm91dCB3aGVyZSB3ZSB3b3VsZCBjb25zdHJ1Y3QgdGhlbS4gTGFyZ2UgY29u
c3RhbnRzIGFyZSBleHBlbnNpdmUgdG8gY3JlYXRlLgorICAgIENvbnN0MzIsCisgICAgQ29uc3Q2
NCwKKyAgICBDb25zdERvdWJsZSwKKworICAgIC8vIFRoZSBtYWdpY2FsIHN0YWNrIHNsb3QuIFRo
aXMgaXMgdmlld2VkIGFzIGV4ZWN1dGluZyBhdCB0aGUgdG9wIG9mIHRoZSBwcm9ncmFtIHJlZ2Fy
ZGxlc3Mgb2YKKyAgICAvLyB3aGVyZSBpbiBjb250cm9sIGZsb3cgeW91IHB1dCBpdC4gRWFjaCBp
bnN0YW5jZSBvZiBhIFN0YWNrU2xvdCBWYWx1ZSBnZXRzIGEgZGlzam9pbnQgcmFuZ2Ugb2YKKyAg
ICAvLyBzdGFjayBtZW1vcnkuIFVzZSB0aGUgU3RhY2tTbG90VmFsdWUgY2xhc3MuCisgICAgU3Rh
Y2tTbG90LAorCisgICAgLy8gVGhlIG1hZ2ljYWwgYXJndW1lbnQgcmVnaXN0ZXIuIFRoaXMgaXMg
dmlld2VkIGFzIGV4ZWN1dGluZyBhdCB0aGUgdG9wIG9mIHRoZSBwcm9ncmFtCisgICAgLy8gcmVn
YXJkbGVzcyBvZiB3aGVyZSBpbiBjb250cm9sIGZsb3cgeW91IHB1dCBpdCwgYW5kIHRoZSBjb21w
aWxlciB0YWtlcyBjYXJlIHRvIGVuc3VyZSB0aGF0IHdlCisgICAgLy8gZG9uJ3QgY2xvYmJlciB0
aGUgdmFsdWUgYnkgcmVnaXN0ZXIgYWxsb2NhdGlvbiBvciBjYWxscyAoZWl0aGVyIGJ5IHNhdmlu
ZyB0aGUgYXJndW1lbnQgdG8gdGhlCisgICAgLy8gc3RhY2sgb3IgcHJlc2VydmluZyBpdCBpbiBh
IGNhbGxlZS1zYXZlIHJlZ2lzdGVyKS4gVXNlIHRoZSBBcmd1bWVudFJlZ1ZhbHVlIGNsYXNzLiBU
aGUgcmV0dXJuCisgICAgLy8gdHlwZSBpcyBlaXRoZXIgcG9pbnRlcigpIChmb3IgR1BScykgb3Ig
RG91YmxlIChmb3IgRlBScykuCisgICAgQXJndW1lbnRSZWcsCisKKyAgICAvLyBUaGUgZnJhbWUg
cG9pbnRlci4gWW91IGNhbiBwdXQgdGhpcyBhbnl3aGVyZSBpbiBjb250cm9sIGZsb3cgYnV0IGl0
IHdpbGwgYWx3YXlzIHlpZWxkIHRoZQorICAgIC8vIGZyYW1lIHBvaW50ZXIsIHdpdGggYSBjYXZl
YXQ6IGlmIG91ciBjb21waWxlciBjaGFuZ2VzIHRoZSBmcmFtZSBwb2ludGVyIHRlbXBvcmFyaWx5
IGZvciBzb21lCisgICAgLy8gc2lsbHkgcmVhc29uLCB0aGUgRnJhbWVQb2ludGVyIGludHJpbnNp
YyB3aWxsIHJldHVybiB3aGVyZSB0aGUgZnJhbWUgcG9pbnRlciAqc2hvdWxkKiBiZSBub3QKKyAg
ICAvLyB3aGVyZSBpdCBoYXBwZW5zIHRvIGJlIHJpZ2h0IG5vdy4KKyAgICBGcmFtZVBvaW50ZXIs
CisKKyAgICAvLyBQb2x5bW9ycGhpYyBtYXRoLCB1c2FibGUgd2l0aCBhbnkgdmFsdWUgdHlwZS4K
KyAgICBBZGQsCisgICAgU3ViLAorICAgIE11bCwKKyAgICBEaXYsCisKKyAgICAvLyBJbnRlZ2Vy
IG1hdGguCisgICAgQ2hpbGxEaXYsIC8vIGRvZXNuJ3QgdHJhcCBldmVyLCBiZWhhdmVzIGxpa2Ug
SlMgKHgveSl8MC4KKyAgICBNb2QsCisgICAgQml0QW5kLAorICAgIEJpdE9yLAorICAgIEJpdFhv
ciwKKyAgICBTaGwsCisgICAgU1NociwKKyAgICBaU2hyLAorCisgICAgLy8gQ2FzdHMgYW5kIHN1
Y2guCisgICAgLy8gVGFrZXMgYW5kIHJldHVybnMgSW50MzI6CisgICAgU0V4dDgsCisgICAgU0V4
dDE2LAorICAgIC8vIFRha2VzIEludDMyIGFuZCByZXR1cm5zIEludDY0OgorICAgIFNFeHQzMiwK
KyAgICBaRXh0MzIsCisgICAgLy8gVGFrZXMgYW5kIHJldHVybnMgRG91YmxlOgorICAgIEZSb3Vu
ZCwKKyAgICAvLyBUYWtlcyBpbnRzIGFuZCByZXR1cm5zIERvdWJsZToKKyAgICBJVG9ELAorICAg
IC8vIFRha2VzIERvdWJsZSBhbmQgcmV0dXJucyBJbnQzMjoKKyAgICBEVG9JMzIsCisKKyAgICAv
LyBQb2x5bW9ycGhpYyBjb21wYXJpc29ucywgdXNhYmxlIHdpdGggYW55IHZhbHVlIHR5cGUuIFJl
dHVybnMgaW50MzIgMCBvciAxLiBOb3RlIHRoYXQgIk5vdCIKKyAgICAvLyBpcyBqdXN0IEVxdWFs
KHgsIDApLgorICAgIEVxdWFsLAorICAgIE5vdEVxdWFsLAorICAgIExlc3NUaGFuLAorICAgIEdy
ZWF0ZXJUaGFuLAorICAgIExlc3NFcXVhbCwKKyAgICBHcmVhdGVyRXF1YWwsCisKKyAgICAvLyBJ
bnRlZ2VyIGNvbXBhcmlzb25zLiBSZXR1cm5zIGludDMyIDAgb3IgMS4KKyAgICBBYm92ZSwKKyAg
ICBCZWxvdywKKyAgICBBYm92ZUVxdWFsCisgICAgQmVsb3dFcXVhbCwKKworICAgIC8vIE1lbW9y
eSBsb2Fkcy4gT3Bjb2RlIGluZGljYXRlcyBob3cgd2UgbG9hZCBhbmQgdGhlIGxvYWRlZCB0eXBl
LiBUaGVzZSB1c2UgTWVtb3J5VmFsdWUuCisgICAgLy8gVGhlc2UgcmV0dXJuIEludDMyOgorICAg
IExvYWQ4WiwKKyAgICBMb2FkOFMsCisgICAgTG9hZDE2WiwKKyAgICBMb2FkMTZTLAorICAgIC8v
IFRoaXMgcmV0dXJucyBEb3VibGU6CisgICAgTG9hZEZsb2F0LAorICAgIC8vIFRoaXMgcmV0dXJu
IHdoYXRldmVyIHRoZSByZXR1cm4gdHlwZSBpczoKKyAgICBMb2FkLAorCisgICAgLy8gTWVtb3J5
IHN0b3Jlcy4gT3Bjb2RlIGluZGljYXRlcyBob3cgdGhlIHZhbHVlIGlzIHN0b3JlZC4gVGhlc2Ug
dXNlIE1lbW9yeVZhbHVlLgorICAgIC8vIFRoZXNlIHRha2UgYW4gSW50MzIgdmFsdWU6CisgICAg
U3RvcmU4LAorICAgIFN0b3JlMTYsCisgICAgLy8gVGhpcyB0YWtlcyBhIERvdWJsZSB2YWx1ZToK
KyAgICBTdG9yZUZsb2F0LAorICAgIC8vIFRoaXMgaXMgYSBwb2x5bW9ycGhpYyBzdG9yZSBmb3Ig
SW50MzIsIEludDY0LCBhbmQgRG91YmxlOgorICAgIFN0b3JlLAorCisgICAgLy8gVGhpcyBpcyBh
IHJlZ3VsYXIgb3JkaW5hcnkgQyBmdW5jdGlvbiBjYWxsLCB1c2luZyB0aGUgc3lzdGVtIEMgY2Fs
bGluZyBjb252ZW50aW9uLiBNYWtlIHN1cmUKKyAgICAvLyB0aGF0IHRoZSBhcmd1bWVudHMgYXJl
IHBhc3NlZCB1c2luZyB0aGUgcmlnaHQgdHlwZXMuCisgICAgQ0NhbGwsCisKKyAgICAvLyBUaGlz
IGlzIGEgcGF0Y2hwb2ludC4gVXNlIHRoZSBQYXRjaHBvaW50VmFsdWUgY2xhc3MuIFRoaXMgaXMg
dmlld2VkIGFzIGJlaGF2aW5nIGxpa2UgYSBjYWxsLAorICAgIC8vIGJ1dCBvbmx5IGVtaXRzIGNv
ZGUgdmlhIGEgY29kZSBnZW5lcmF0aW9uIGNhbGxiYWNrLiBUaGF0IGNhbGxiYWNrIGdldHMgdG8g
ZW1pdCBjb2RlIGlubGluZS4KKyAgICAvLyBZb3UgY2FuIHBhc3MgYSBzdGFja21hcCBhbG9uZyB3
aXRoIGNvbnN0cmFpbnRzIG9uIGhvdyBlYWNoIHN0YWNrbWFwIGFyZ3VtZW50IG11c3QgYmUgcGFz
c2VkLgorICAgIC8vIEl0J3MgbGVnYWwgdG8gcmVxdWVzdCB0aGF0IGEgc3RhY2ttYXAgYXJndW1l
bnQgaXMgaW4gc29tZSByZWdpc3RlciBhbmQgaXQncyBsZWdhbCB0byByZXF1ZXN0CisgICAgLy8g
dGhhdCBhIHN0YWNrbWFwIGFyZ3VtZW50IGlzIGF0IHNvbWUgb2Zmc2V0IGZyb20gdGhlIHRvcCBv
ZiB0aGUgYXJndW1lbnQgcGFzc2luZyBhcmVhIG9uIHRoZQorICAgIC8vIHN0YWNrLgorICAgIFBh
dGNocG9pbnQsCisKKyAgICAvLyBDaGVja2VkIG1hdGguIFVzZSB0aGUgQ2hlY2tWYWx1ZSBjbGFz
cy4gTGlrZSBhIFBhdGNocG9pbnQsIHRoaXMgdGFrZXMgYSBjb2RlIGdlbmVyYXRpb24KKyAgICAv
LyBjYWxsYmFjay4gVGhhdCBjYWxsYmFjayBnZXRzIHRvIGVtaXQgc29tZSBjb2RlIGFmdGVyIHRo
ZSBlcGlsb2d1ZSwgYW5kIGdldHMgdG8gbGluayB0aGUganVtcAorICAgIC8vIGZyb20gdGhlIGNo
ZWNrLCBhbmQgdGhlIGNob2ljZSBvZiByZWdpc3RlcnMuIFlvdSBhbHNvIGdldCB0byBzdXBwbHkg
YSBzdGFja21hcC4gTm90ZSB0aGF0IHlvdQorICAgIC8vIGFyZSBub3QgYWxsb3dlZCB0byBqdW1w
IGJhY2sgaW50byB0aGUgbWFpbmxpbmUgY29kZSBmcm9tIHlvdXIgc2xvdyBwYXRoLCBzaW5jZSB0
aGUgY29tcGlsZXIKKyAgICAvLyB3aWxsIGFzc3VtZSB0aGF0IHRoZSBleGVjdXRpb24gb2YgdGhl
c2UgaW5zdHJ1Y3Rpb25zIHByb3ZlcyB0aGF0IG92ZXJmbG93IGRpZG4ndCBoYXBwZW4uIEZvcgor
ICAgIC8vIGV4YW1wbGUsIGlmIHlvdSBoYXZlIHR3byBDaGVja0FkZCdzOgorICAgIC8vCisgICAg
Ly8gYSA9IENoZWNrQWRkKHgsIHkpCisgICAgLy8gYiA9IENoZWNrQWRkKHgsIHkpCisgICAgLy8K
KyAgICAvLyBUaGVuIGl0J3MgdmFsaWQgdG8gY2hhbmdlIHRoaXMgdG86CisgICAgLy8KKyAgICAv
LyBhID0gQ2hlY2tBZGQoeCwgeSkKKyAgICAvLyBiID0gSWRlbnRpdHkoYSkKKyAgICAvLworICAg
IC8vIFRoaXMgaXMgdmFsaWQgcmVnYXJkbGVzcyBvZiB0aGUgY2FsbGJhY2tzIHVzZWQgYnkgdGhl
IHR3byBDaGVja0FkZHMuIFRoZXkgbWF5IGhhdmUgZGlmZmVyZW50CisgICAgLy8gY2FsbGJhY2tz
LiBZZXQsIHRoaXMgdHJhbnNmb3JtYXRpb24gaXMgdmFsaWQgZXZlbiBpZiB0aGV5IGFyZSBkaWZm
ZXJlbnQgYmVjYXVzZSB3ZSBrbm93IHRoYXQKKyAgICAvLyBhZnRlciB0aGUgZmlyc3QgQ2hlY2tB
ZGQgZXhlY3V0ZXMsIHRoZSBzZWNvbmQgQ2hlY2tBZGQgY291bGQgbm90IGhhdmUgcG9zc2libHkg
dGFrZW4gc2xvdworICAgIC8vIHBhdGguIFRoZXJlZm9yZSwgdGhlIHNlY29uZCBDaGVja0FkZCdz
IGNhbGxiYWNrIGlzIGlycmVsZXZhbnQuCisgICAgQ2hlY2tBZGQsCisgICAgQ2hlY2tTdWIsCisg
ICAgQ2hlY2tNdWwsCisKKyAgICAvLyBDaGVjayB0aGF0IHNpZGUtZXhpdHMuIFVzZSB0aGUgQ2hl
Y2tWYWx1ZSBjbGFzcy4gTGlrZSBDaGVja0FkZCBhbmQgZnJpZW5kcywgdGhpcyBoYXMgYQorICAg
IC8vIHN0YWNrbWFwIHdpdGggYSBnZW5lcmF0aW9uIGNhbGxiYWNrLiBUaGlzIHRha2VzIGFuIElu
dDMyIGFyZ3VtZW50IHRoYXQgdGhpcyBicmFuY2hlcyBvbiwgd2l0aAorICAgIC8vIGZ1bGwgYnJh
bmNoIGZ1c2lvbiBpbiB0aGUgaW5zdHJ1Y3Rpb24gc2VsZWN0b3IuIEEgdHJ1ZSB2YWx1ZSBqdW1w
cyB0byB0aGUgZ2VuZXJhdG9yJ3Mgc2xvdworICAgIC8vIHBhdGguCisgICAgQ2hlY2ssCisKKyAg
ICAvLyBTU0Egc3VwcG9ydCwgaW4gdGhlIHN0eWxlIG9mIERGRyBTU0EuCisgICAgVXBzaWxvbiwg
Ly8gVGhpcyB1c2VzIHRoZSBVcHNpbG9uVmFsdWUgY2xhc3MuCisgICAgUGhpLAorCisgICAgLy8g
SnVtcC4gVXNlcyB0aGUgQ29udHJvbFZhbHVlIGNsYXNzLgorICAgIEp1bXAsCisgICAgCisgICAg
Ly8gUG9seW1vcnBoaWMgYnJhbmNoLCB1c2FibGUgd2l0aCBhbnkgdmFsdWUgdHlwZS4gQnJhbmNo
ZXMgaWYgbm90IGVxdWFsIHRvIHplcm8uIFVzZXMgdGhlCisgICAgLy8gQ29udHJvbFZhbHVlIGNs
YXNzLCB3aXRoIHRoZSAwLWluZGV4IHN1Y2Nlc3NvciBiZWluZyB0aGUgdHJ1ZSBzdWNjZXNzb3Iu
CisgICAgQnJhbmNoLAorCisgICAgLy8gU3dpdGNoLiBTd2l0Y2hlcyBvdmVyIGVpdGhlciBJbnQz
MiBvciBJbnQ2NC4gVXNlcyB0aGUgU3dpdGNoVmFsdWUgY2xhc3MuCisgICAgU3dpdGNoLAorCisg
ICAgLy8gUmV0dXJuLiBOb3RlIHRoYXQgQjMgcHJvY2VkdXJlcyBkb24ndCBrbm93IHRoZWlyIHJl
dHVybiB0eXBlLCBzbyB0aGlzIGNhbiBqdXN0IHJldHVybiBhbnkKKyAgICAvLyB0eXBlLiBVc2Vz
IHRoZSBDb250cm9sVmFsdWUgY2xhc3MuCisgICAgUmV0dXJuLAorCisgICAgLy8gVGhpcyBpcyBh
IHRlcm1pbmFsIHRoYXQgaW5kaWNhdGVzIHRoYXQgd2Ugd2lsbCBuZXZlciBnZXQgaGVyZS4gVXNl
cyB0aGUgQ29udHJvbFZhbHVlIGNsYXNzLgorICAgIE9vcHMKK307CisKK30gfSAvLyBuYW1lc3Bh
Y2UgSlNDOjpCMworCituYW1lc3BhY2UgV1RGIHsKKworY2xhc3MgUHJpbnRTdHJlYW07CisKK3Zv
aWQgcHJpbnRJbnRlcm5hbChQcmludFN0cmVhbSYsIEpTQzo6QjM6Ok9wY29kZSk7CisKK30gLy8g
bmFtZXNwYWNlIFdURgorCisjZW5kaWYgLy8gQjNPcGNvZGVfaAorCkluZGV4OiBTb3VyY2UvSmF2
YVNjcmlwdENvcmUvYjMvQjNPcmlnaW4uY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2Ny
aXB0Q29yZS9iMy9CM09yaWdpbi5jcHAJKHJldmlzaW9uIDApCisrKyBTb3VyY2UvSmF2YVNjcmlw
dENvcmUvYjMvQjNPcmlnaW4uY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsMzcgQEAKKy8q
CisgKiBDb3B5cmlnaHQgKEMpIDIwMTUgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgor
ICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMs
IHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVk
IHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0
cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQK
KyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcg
ZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJl
cHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBj
b25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1
bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJp
YnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBg
YEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xV
RElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBN
RVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBB
UkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IKKyAqIENPTlRS
SUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBT
UEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElO
RywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09E
UyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJ
TkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBP
RiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRP
UlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5Z
IFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VE
IE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKworI2luY2x1ZGUgImNv
bmZpZy5oIgorI2luY2x1ZGUgIkIzT3JpZ2luLmgiCisKK25hbWVzcGFjZSBKU0MgeyBuYW1lc3Bh
Y2UgQjMgeworCit2b2lkIE9yaWdpbjo6ZHVtcChQcmludFN0cmVhbSYgb3V0KSBjb25zdAorewor
ICAgIG91dC5wcmludCgiT3JpZ2luKCIsIFJhd1BvaW50ZXIobV9kYXRhKSwgIikiKTsKK30KKwor
fSB9IC8vIG5hbWVzcGFjZSBKU0M6OkIzCisKSW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9i
My9CM09yaWdpbi5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM09y
aWdpbi5oCShyZXZpc2lvbiAwKQorKysgU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzT3JpZ2lu
LmgJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSw1NSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykg
MjAxNSBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRp
b24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Cisg
KiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5n
IGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNl
IGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlz
IGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4g
UmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBj
b3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBm
b2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90
aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJ
UyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisg
KiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlU
RUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQg
RklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4g
Tk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBG
T1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExB
UlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQg
VE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NT
IE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikg
SE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhF
UiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBO
RUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNF
CisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZ
IE9GIFNVQ0ggREFNQUdFLiAKKyAqLworCisjaWZuZGVmIEIzT3JpZ2luX2gKKyNkZWZpbmUgQjNP
cmlnaW5faAorCisjaW5jbHVkZSA8d3RmL1ByaW50U3RyZWFtLmg+CisKK25hbWVzcGFjZSBKU0Mg
eyBuYW1lc3BhY2UgQjMgeworCisvLyBXaG9ldmVyIGdlbmVyYXRlcyBCM0lSIGNhbiBjaG9vc2Ug
dG8gcHV0IG9yaWdpbnMgb24gdmFsdWVzLiBXaGVuIHlvdSBkbyB0aGlzLCBCMyB3aWxsIGJlIGFi
bGUgdG8KKy8vIGFjY291bnQsIGRvd24gdG8gdGhlIG1hY2hpbmUgY29kZSwgd2hpY2ggaW5zdHJ1
Y3Rpb24gY29ycmVzcG9uZHMgdG8gd2hpY2ggb3JpZ2luLiBCMworLy8gdHJhbnNmb3JtYXRpb25z
IG11c3QgcHJlc2VydmUgT3JpZ2lucyBjYXJlZnVsbHkuIEl0J3MgYW4gZXJyb3IgdG8gd3JpdGUg
YSB0cmFuc2Zvcm1hdGlvbiB0aGF0CisvLyBlaXRoZXIgZHJvcHMgT3JpZ2lucyBvciBsaWVzIGFi
b3V0IHRoZW0uCitjbGFzcyBPcmlnaW4geworcHVibGljOgorICAgIGV4cGxpY2l0IE9yaWdpbihj
b25zdCB2b2lkKiBkYXRhID0gbnVsbHB0cikKKyAgICAgICAgOiBtX2RhdGEoZGF0YSkKKyAgICB7
CisgICAgfQorCisgICAgY29uc3Qgdm9pZCogZGF0YSgpIGNvbnN0IHsgcmV0dXJuIG1fZGF0YTsg
fQorCisgICAgdm9pZCBkdW1wKFByaW50U3RyZWFtJikgY29uc3Q7CisgICAgCitwcml2YXRlOgor
ICAgIGNvbnN0IHZvaWQqIG1fZGF0YTsKK307CisKK30gfSAvLyBuYW1lc3BhY2UgSlNDOjpCMwor
CisjZW5kaWYgLy8gQjNPcmlnaW5faAorCkluZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMv
QjNQYXRjaHBvaW50VmFsdWUuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29y
ZS9iMy9CM1BhdGNocG9pbnRWYWx1ZS5jcHAJKHJldmlzaW9uIDApCisrKyBTb3VyY2UvSmF2YVNj
cmlwdENvcmUvYjMvQjNQYXRjaHBvaW50VmFsdWUuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAg
KzEsNDYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTUgQXBwbGUgSW5jLiBBbGwgcmlnaHRz
IHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBi
aW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0
dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0Ogor
ICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92
ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRo
ZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkg
Zm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRo
aXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhl
CisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0
aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkg
QVBQTEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJB
TlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FS
UkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgor
ICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4g
T1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJ
TkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFH
RVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VC
U1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9G
SVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkg
VEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFC
SUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFS
SVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZF
TiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKwor
I2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgIkIzUGF0Y2hwb2ludFZhbHVlLmgiCisKKyNp
bmNsdWRlIDx3dGYvQ29tbWFQcmludGVyLmg+CisKK25hbWVzcGFjZSBKU0MgeyBuYW1lc3BhY2Ug
QjMgeworCitQYXRjaHBvaW50VmFsdWU6On5QYXRjaHBvaW50VmFsdWUoKQoreworfQorCit2b2lk
IFBhdGNocG9pbnRWYWx1ZTo6ZHVtcE1ldGEoUHJpbnRTdHJlYW0mIG91dCkgY29uc3QKK3sKKyAg
ICBDb21tYVByaW50ZXIgY29tbWE7CisgICAgb3V0LnByaW50KGNvbW1hLCAic3RhY2ttYXAgPSAi
LCBzdGFja21hcCk7CisgICAgaWYgKHNoYWRvdykKKyAgICAgICAgb3V0LnByaW50KGNvbW1hLCAi
c2hhZG93ID0gIiwgc2hhZG93KTsKK30KKworfSB9IC8vIG5hbWVzcGFjZSBKU0M6OkIzCisKSW5k
ZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM1BhdGNocG9pbnRWYWx1ZS5oCj09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM1BhdGNocG9pbnRWYWx1ZS5oCShyZXZp
c2lvbiAwKQorKysgU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzUGF0Y2hwb2ludFZhbHVlLmgJ
KHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSw1OCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAx
NSBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24g
YW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBt
b2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNv
bmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNv
ZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxp
c3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVk
aXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5
cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xs
b3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVy
IG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBT
T0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBF
WFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQg
VE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklU
TkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8g
RVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1Ig
QU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlks
IE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8s
CisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9G
IFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9X
RVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJ
TiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdM
SUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisg
KiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9G
IFNVQ0ggREFNQUdFLiAKKyAqLworCisjaWZuZGVmIEIzUGF0Y2hwb2ludFZhbHVlX2gKKyNkZWZp
bmUgQjNQYXRjaHBvaW50VmFsdWVfaAorCisjaW5jbHVkZSAiQjNWYWx1ZS5oIgorI2luY2x1ZGUg
IkIzU3RhY2ttYXAuaCIKKworbmFtZXNwYWNlIEpTQyB7IG5hbWVzcGFjZSBCMyB7CisKK2NsYXNz
IFBhdGNocG9pbnRWYWx1ZSA6IHB1YmxpYyBWYWx1ZSB7CitwdWJsaWM6CisgICAgc3RhdGljIGJv
b2wgYWNjZXB0cyhPcGNvZGUgb3Bjb2RlKSB7IHJldHVybiBvcGNvZGUgPT0gUGF0Y2hwb2ludDsg
fQorCisgICAgflBhdGNocG9pbnRWYWx1ZSgpOworCisgICAgU3RhY2ttYXAgc3RhY2ttYXA7Cisg
ICAgdW5zaWduZWQgc2hhZG93IHsgMCB9OworCitwcm90ZWN0ZWQ6CisgICAgdm9pZCBkdW1wTWV0
YShQcmludFN0cmVhbSYpIGNvbnN0IG92ZXJyaWRlOworCitwcml2YXRlOgorICAgIGZyaWVuZCBj
bGFzcyBQcm9jZWR1cmU7CisKKyAgICBQYXRjaHBvaW50VmFsdWUodW5zaWduZWQgaW5kZXgsIFR5
cGUgdHlwZSwgT3JpZ2luIG9yaWdpbikKKyAgICAgICAgOiBWYWx1ZShpbmRleCwgUGF0Y2hwb2lu
dCwgdHlwZSwgb3JpZ2luKQorICAgIHsKKyAgICB9Cit9OworCit9IH0gLy8gbmFtZXNwYWNlIEpT
Qzo6QjMKKworI2VuZGlmIC8vIEIzUGF0Y2hwb2ludFZhbHVlX2gKKwpJbmRleDogU291cmNlL0ph
dmFTY3JpcHRDb3JlL2IzL0IzUHJvY2VkdXJlLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2
YVNjcmlwdENvcmUvYjMvQjNQcm9jZWR1cmUuY3BwCShyZXZpc2lvbiAwKQorKysgU291cmNlL0ph
dmFTY3JpcHRDb3JlL2IzL0IzUHJvY2VkdXJlLmNwcAkod29ya2luZyBjb3B5KQpAQCAtMCwwICsx
LDU2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE1IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyBy
ZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmlu
YXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRl
ZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAq
IDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUg
Y29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUg
Zm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZv
cm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlz
IGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQor
ICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGgg
dGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQ
UExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5U
SUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJB
TlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAq
IFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9S
CisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5D
SURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VT
IChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNU
SVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklU
UzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRI
RU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklM
SVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklT
SU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4g
SUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisKKyNp
bmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJCM1Byb2NlZHVyZS5oIgorCisjaW5jbHVkZSAi
QjNCYXNpY0Jsb2NrLmgiCisjaW5jbHVkZSAiQjNWYWx1ZS5oIgorCituYW1lc3BhY2UgSlNDIHsg
bmFtZXNwYWNlIEIzIHsKKworUHJvY2VkdXJlOjpQcm9jZWR1cmUoKQoreworfQorCitQcm9jZWR1
cmU6On5Qcm9jZWR1cmUoKQoreworfQorCitCYXNpY0Jsb2NrKiBQcm9jZWR1cmU6OmFkZEJsb2Nr
KCkKK3sKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8QmFzaWNCbG9jaz4gYmxvY2sgPSBzdGQ6Om1ha2Vf
dW5pcXVlPEJhc2ljQmxvY2s+KG1fYmxvY2tzLnNpemUoKSk7CisgICAgQmFzaWNCbG9jayogcmVz
dWx0ID0gYmxvY2suZ2V0KCk7CisgICAgbV9ibG9ja3MuYXBwZW5kKFdURjo6bW92ZShibG9jaykp
OworICAgIHJldHVybiByZXN1bHQ7Cit9CisKK3ZvaWQgUHJvY2VkdXJlOjpkdW1wKFByaW50U3Ry
ZWFtJiBvdXQpIGNvbnN0Cit7CisgICAgZm9yIChCYXNpY0Jsb2NrKiBibG9jayA6ICp0aGlzKQor
ICAgICAgICBvdXQucHJpbnQoZGVlcER1bXAoYmxvY2spKTsKK30KKworfSB9IC8vIG5hbWVzcGFj
ZSBKU0M6OkIzCkluZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNQcm9jZWR1cmUuaAo9
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNQcm9jZWR1cmUuaAkocmV2
aXNpb24gMCkKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM1Byb2NlZHVyZS5oCSh3b3Jr
aW5nIGNvcHkpCkBAIC0wLDAgKzEsMTc3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE1IEFw
cGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQg
dXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlm
aWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0
aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBt
dXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBv
ZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3Ry
aWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdo
dAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2lu
ZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0
ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRX
QVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJF
U1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywg
VEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNT
IEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVO
VCBTSEFMTCBBUFBMRSBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkg
RElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1Ig
Q09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAq
IFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNF
LCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVS
IENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENP
TlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VO
Q0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9G
IFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VD
SCBEQU1BR0UuIAorICovCisKKyNpZm5kZWYgQjNQcm9jZWR1cmVfaAorI2RlZmluZSBCM1Byb2Nl
ZHVyZV9oCisKKyNpbmNsdWRlIDx3dGYvQmFnLmg+CisjaW5jbHVkZSA8d3RmL0Zhc3RNYWxsb2Mu
aD4KKyNpbmNsdWRlIDx3dGYvTm9uY29weWFibGUuaD4KKyNpbmNsdWRlIDx3dGYvVmVjdG9yLmg+
CisKK25hbWVzcGFjZSBKU0MgeyBuYW1lc3BhY2UgQjMgeworCitjbGFzcyBCYXNpY0Jsb2NrOwor
Y2xhc3MgVmFsdWU7CisKK2NsYXNzIFByb2NlZHVyZSB7CisgICAgV1RGX01BS0VfTk9OQ09QWUFC
TEUoUHJvY2VkdXJlKTsKKyAgICBXVEZfTUFLRV9GQVNUX0FMTE9DQVRFRDsKK3B1YmxpYzoKKwor
ICAgIFByb2NlZHVyZSgpOworICAgIH5Qcm9jZWR1cmUoKTsKKworICAgIEJhc2ljQmxvY2sqIGFk
ZEJsb2NrKCk7CisgICAgCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVmFsdWVUeXBlLCB0eXBlbmFt
ZS4uLiBBcmd1bWVudHM+CisgICAgVmFsdWVUeXBlKiBhZGQoQXJndW1lbnRzLi4uKTsKKworICAg
IHZvaWQgZHVtcChQcmludFN0cmVhbSYpIGNvbnN0OworCisgICAgdW5zaWduZWQgc2l6ZSgpIGNv
bnN0IHsgcmV0dXJuIG1fYmxvY2tzLnNpemUoKTsgfQorICAgIEJhc2ljQmxvY2sqIGF0KHVuc2ln
bmVkIGluZGV4KSBjb25zdCB7IHJldHVybiBtX2Jsb2Nrc1tpbmRleF07IH0KKyAgICBCYXNpY0Js
b2NrKiBvcGVyYXRvcltdKHVuc2lnbmVkIGluZGV4KSBjb25zdCB7IHJldHVybiBhdChpbmRleCk7
IH0KKworICAgIGNsYXNzIGl0ZXJhdG9yIHsKKyAgICBwdWJsaWM6CisgICAgICAgIGl0ZXJhdG9y
KCk6CisgICAgICAgICAgICA6IG1fcHJvY2VkdXJlKG51bGxwdHIpCisgICAgICAgICAgICAsIG1f
aW5kZXgoMCkKKyAgICAgICAgeworICAgICAgICB9CisKKyAgICAgICAgaXRlcmF0b3IoUHJvY2Vk
dXJlJiBwcm9jZWR1cmUsIHVuc2lnbmVkIGluZGV4KQorICAgICAgICAgICAgOiBtX3Byb2NlZHVy
ZSgmcHJvY2VkdXJlKQorICAgICAgICAgICAgLCBtX2luZGV4KGluZGV4KQorICAgICAgICB7Cisg
ICAgICAgIH0KKworICAgICAgICBCYXNpY0Jsb2NrKiBvcGVyYXRvciooKQorICAgICAgICB7Cisg
ICAgICAgICAgICByZXR1cm4gbV9wcm9jZWR1cmUtPmF0KG1faW5kZXgpOworICAgICAgICB9CisK
KyAgICAgICAgaXRlcmF0b3ImIG9wZXJhdG9yKysoKQorICAgICAgICB7CisgICAgICAgICAgICBt
X2luZGV4ID0gZmluZE5leHQobV9pbmRleCArIDEpOworICAgICAgICAgICAgcmV0dXJuICp0aGlz
OworICAgICAgICB9CisKKyAgICAgICAgYm9vbCBvcGVyYXRvcj09KGNvbnN0IGl0ZXJhdG9yJiBv
dGhlcikgY29uc3QKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIG1faW5kZXggPT0gb3Ro
ZXIubV9pbmRleDsKKyAgICAgICAgfQorCisgICAgICAgIGJvb2wgb3BlcmF0b3IhPShjb25zdCBp
dGVyYXRvciYgb3RoZXIpIGNvbnN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiAhKCp0
aGlzID09IG90aGVyKTsKKyAgICAgICAgfQorCisgICAgcHJpdmF0ZToKKyAgICAgICAgdW5zaWdu
ZWQgZmluZE5leHQodW5zaWduZWQgaW5kZXgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHdoaWxl
IChpbmRleCA8IG1fcHJvY2VkdXJlLT5zaXplKCkgJiYgIW1fcHJvY2VkdXJlLT5hdChpbmRleCkp
CisgICAgICAgICAgICAgICAgaW5kZXgrKzsKKyAgICAgICAgICAgIHJldHVybiBpbmV4OworICAg
ICAgICB9CisKKyAgICAgICAgUHJvY2VkdXJlKiBtX3Byb2NlZHVyZTsKKyAgICAgICAgdW5zaWdu
ZWQgbV9pbmRleDsKKyAgICB9OworCisgICAgaXRlcmF0b3IgYmVnaW4oKSBjb25zdCB7IHJldHVy
biBpdGVyYXRvcigqdGhpcywgMCk7IH0KKyAgICBpdGVyYXRvciBlbmQoKSBjb25zdCB7IHJldHVy
biBpdGVyYXRvcigqdGhpcywgbnVtQmxvY2tzKCkpOyB9CisKKyAgICBjbGFzcyBWYWx1ZXNDb2xs
ZWN0aW9uIHsKKyAgICBwdWJsaWM6CisgICAgICAgIFZhbHVlc0NvbGxlY3Rpb24oUHJvY2VkdXJl
JiBwcm9jZWR1cmUpCisgICAgICAgICAgICA6IG1fcHJvY2VkdXJlKHByb2NlZHVyZSkKKyAgICAg
ICAgeworICAgICAgICB9CisKKyAgICAgICAgY2xhc3MgaXRlcmF0b3IgeworICAgICAgICBwdWJs
aWM6CisgICAgICAgICAgICBpdGVyYXRvcigpOgorICAgICAgICAgICAgICAgIDogbV9wcm9jZWR1
cmUobnVsbHB0cikKKyAgICAgICAgICAgICAgICAsIG1faW5kZXgoMCkKKyAgICAgICAgICAgIHsK
KyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaXRlcmF0b3IoUHJvY2VkdXJlJiBwcm9jZWR1
cmUsIHVuc2lnbmVkIGluZGV4KQorICAgICAgICAgICAgICAgIDogbV9wcm9jZWR1cmUoJnByb2Nl
ZHVyZSkKKyAgICAgICAgICAgICAgICAsIG1faW5kZXgoaW5kZXgpCisgICAgICAgICAgICB7Cisg
ICAgICAgICAgICB9CisKKyAgICAgICAgICAgIFZhbHVlKiBvcGVyYXRvciooKQorICAgICAgICAg
ICAgeworICAgICAgICAgICAgICAgIHJldHVybiBtX3Byb2NlZHVyZS0+YmxvY2sobV9pbmRleCk7
CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGl0ZXJhdG9yJiBvcGVyYXRvcisrKCkKKyAg
ICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtX2luZGV4Kys7CisgICAgICAgICAgICAgICAg
cmV0dXJuICp0aGlzOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBib29sIG9wZXJhdG9y
PT0oY29uc3QgaXRlcmF0b3ImIG90aGVyKSBjb25zdAorICAgICAgICAgICAgeworICAgICAgICAg
ICAgICAgIHJldHVybiBtX2luZGV4ID09IG90aGVyLm1faW5kZXg7CisgICAgICAgICAgICB9CisK
KyAgICAgICAgICAgIGJvb2wgb3BlcmF0b3IhPShjb25zdCBpdGVyYXRvciYgb3RoZXIpIGNvbnN0
CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuICEoKnRoaXMgPT0gb3RoZXIp
OworICAgICAgICAgICAgfQorCisgICAgICAgIHByaXZhdGU6CisKKyAgICAgICAgICAgIFByb2Nl
ZHVyZSogbV9wcm9jZWR1cmU7CisgICAgICAgICAgICB1bnNpZ25lZCBtX2luZGV4OworICAgICAg
ICB9OworCisgICAgICAgIGl0ZXJhdG9yIGJlZ2luKCkgY29uc3QgeyByZXR1cm4gaXRlcmF0b3Io
bV9wcm9jZWR1cmUsIDApOyB9CisgICAgICAgIGl0ZXJhdG9yIGVuZCgpIGNvbnN0IHsgcmV0dXJu
IGl0ZXJhdG9yKG1fcHJvY2VkdXJlLCBtX3Byb2NlZHVyZS5tX3ZhbHVlcy5zaXplKCkpOyB9CisK
KyAgICAgICAgdW5zaWduZWQgc2l6ZSgpIGNvbnN0IHsgcmV0dXJuIG1fcHJvY2VkdXJlLm1fdmFs
dWVzLnNpemUoKTsgfQorICAgICAgICBWYWx1ZSogYXQodW5zaWduZWQgaW5kZXgpIGNvbnN0IHsg
cmV0dXJuIG1fcHJvY2VkdXJlLm1fdmFsdWVzW2luZGV4XTsgfQorICAgICAgICBWYWx1ZSogb3Bl
cmF0b3JbXSh1bnNpZ25lZCBpbmRleCkgY29uc3QgeyByZXR1cm4gYXQoaW5kZXgpOyB9CisgICAg
ICAgIAorICAgIHByaXZhdGU6CisgICAgICAgIFByb2NlZHVyZSYgbV9wcm9jZWR1cmU7CisgICAg
fTsKKworICAgIFZhbHVlc0NvbGxlY3Rpb24gdmFsdWVzKCkgeyByZXR1cm4gVmFsdWVzQ29sbGVj
dGlvbigqdGhpcyk7IH0KKworcHJpdmF0ZToKKyAgICBWZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEJh
c2ljQmxvY2s+PiBtX2Jsb2NrczsKKyAgICBWZWN0b3I8c3RkOjp1bmlxdWVfcHRyPFZhbHVlPj4g
bV92YWx1ZXM7Cit9OworCit9IH0gLy8gbmFtZXNwYWNlIEpTQzo6QjMKKworI2VuZGlmIC8vIEIz
UHJvY2VkdXJlX2gKKwpJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzUHJvY2VkdXJl
SW5saW5lcy5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM1Byb2Nl
ZHVyZUlubGluZXMuaAkocmV2aXNpb24gMCkKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9C
M1Byb2NlZHVyZUlubGluZXMuaAkod29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDQ2IEBACisvKgor
ICogQ29weXJpZ2h0IChDKSAyMDE1IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAq
CisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3
aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0
aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJp
YnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Cisg
KiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRp
c2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXBy
b2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29u
ZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1l
bnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1
dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gYGBB
UyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJ
TkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVS
Q0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJF
IERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SCisgKiBDT05UUklC
VVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BF
Q0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcs
IEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMg
T1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5F
U1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0Yg
TElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JU
CisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBX
QVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBP
RiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisKKyNpZm5kZWYgQjNQcm9j
ZWR1cmVJbmxpbmVzX2gKKyNkZWZpbmUgQjNQcm9jZWR1cmVJbmxpbmVzX2gKKworI2luY2x1ZGUg
IkIzQmFzaWNCbG9jay5oIgorI2luY2x1ZGUgIkIzUHJvY2VkdXJlLmgiCisKK25hbWVzcGFjZSBK
U0MgeyBuYW1lc3BhY2UgQjMgeworCit0ZW1wbGF0ZTx0eXBlbmFtZSBWYWx1ZVR5cGUsIHR5cGVu
YW1lLi4uIEFyZ3VtZW50cz4KK1ZhbHVlVHlwZSogUHJvY2VkdXJlOjphZGQoQXJndWVudHMuLi4g
YXJndW1lbnRzKQoreworICAgIHN0ZDo6dW5pcXVlX3B0cjxWYWx1ZVR5cGU+IHZhbHVlKG5ldyBW
YWx1ZVR5cGUobV92YWx1ZXMuc2l6ZSgpLCBhcmd1bWVudHMuLi4pKTsKKyAgICBWYWx1ZVR5cGUq
IHJlc3VsdCA9IHZhbHVlLmdldCgpOworICAgIG1fdmFsdWVzLmFwcGVuZChXVEY6Om1vdmUodmFs
dWUpKTsKKyAgICByZXR1cm4gcmVzdWx0OworfQorCit9IH0gLy8gbmFtZXNwYWNlIEpTQzo6QjMK
KworI2VuZGlmIC8vIEIzUHJvY2VkdXJlSW5saW5lc19oCisKSW5kZXg6IFNvdXJjZS9KYXZhU2Ny
aXB0Q29yZS9iMy9CM1N0YWNrU2xvdFZhbHVlLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2
YVNjcmlwdENvcmUvYjMvQjNTdGFja1Nsb3RWYWx1ZS5jcHAJKHJldmlzaW9uIDApCisrKyBTb3Vy
Y2UvSmF2YVNjcmlwdENvcmUvYjMvQjNTdGFja1Nsb3RWYWx1ZS5jcHAJKHdvcmtpbmcgY29weSkK
QEAgLTAsMCArMSw0MSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNSBBcHBsZSBJbmMuIEFs
bCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3Vy
Y2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFy
ZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFy
ZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4g
dGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9u
cyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGlu
IGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5v
dGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1l
ciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92
aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9W
SURFRCBCWSBBUFBMRSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJ
RUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1Q
TElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJU
SUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQ
TEUgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5E
SVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJ
QUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVO
VCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IK
KyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5E
IE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RS
SUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVS
V0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRX
QVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLiAK
KyAqLworCisjaW5jbHVkZSAiY29uZmlnLmgiCisjaW5jbHVkZSAiQjNTdGFja1Nsb3RWYWx1ZS5o
IgorCituYW1lc3BhY2UgSlNDIHsgbmFtZXNwYWNlIEIzIHsKKworU3RhY2tTbG90VmFsdWU6On5T
dGFja1Nsb3RWYWx1ZSgpCit7Cit9CisKK3ZvaWQgU3RhY2tTbG90VmFsdWU6OmR1bXBNZXRhKFBy
aW50U3RyZWFtJiBvdXQpIGNvbnN0Cit7CisgICAgb3V0LnByaW50KCJieXRlU2l6ZSA9ICIsIG1f
Ynl0ZVNpemUpOworfQorCit9IH0gLy8gbmFtZXNwYWNlIEpTQzo6QjMKKwpJbmRleDogU291cmNl
L0phdmFTY3JpcHRDb3JlL2IzL0IzU3RhY2tTbG90VmFsdWUuaAo9PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3Vy
Y2UvSmF2YVNjcmlwdENvcmUvYjMvQjNTdGFja1Nsb3RWYWx1ZS5oCShyZXZpc2lvbiAwKQorKysg
U291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzU3RhY2tTbG90VmFsdWUuaAkod29ya2luZyBjb3B5
KQpAQCAtMCwwICsxLDY1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE1IEFwcGxlIEluYy4g
QWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNv
dXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwg
YXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICog
YXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFp
biB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRp
b25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMg
aW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAg
bm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFp
bWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHBy
b3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBS
T1ZJREVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1Q
TElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJ
TVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBB
UlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBB
UFBMRSBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJ
TkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVO
VElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVN
RU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBP
UgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBB
TkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBT
VFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RI
RVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09G
VFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0Uu
IAorICovCisKKyNpZm5kZWYgQjNTdGFja1Nsb3RWYWx1ZV9oCisjZGVmaW5lIEIzU3RhY2tTbG90
VmFsdWVfaAorCisjaW5jbHVkZSAiQjNWYWx1ZS5oIgorCituYW1lc3BhY2UgSlNDIHsgbmFtZXNw
YWNlIEIzIHsKKworY2xhc3MgU3RhY2tTbG90VmFsdWUgOiBwdWJsaWMgVmFsdWUgeworcHVibGlj
OgorICAgIHN0YXRpYyBib29sIGFjY2VwdHMoT3Bjb2RlIG9wY29kZSkgeyByZXR1cm4gb3Bjb2Rl
ID09IFN0YWNrU2xvdDsgfQorCisgICAgflN0YWNrU2xvdFZhbHVlKCk7CisKKyAgICB1bnNpZ25l
ZCBieXRlU2l6ZSgpIGNvbnN0IHsgcmV0dXJuIG1fYnl0ZVNpemU7IH0KKworICAgIC8vIFRoaXMg
Z2V0cyBhc3NpZ25lZCBhdCB0aGUgZW5kIG9mIGNvbXBpbGF0aW9uLiBZb3UgY2Fubm90IHJlbHkg
b24gaXQgaGF2aW5nIGEgbWVhbmluZ2Z1bAorICAgIC8vIHZhbHVlIHdoaWxlIHRoZSBjb21waWxl
ciBpcyBydW5uaW5nLgorICAgIGludHB0cl90IG9mZnNldEZyb21GUCgpIGNvbnN0IHsgcmV0dXJu
IG1fb2Zmc2V0RnJvbUZQOyB9CisKK3Byb3RlY3RlZDoKKyAgICB2b2lkIGR1bXBNZXRhKFByaW50
U3RyZWFtJikgY29uc3Qgb3ZlcnJpZGU7CisKK3ByaXZhdGU6CisgICAgZnJpZW5kIGNsYXNzIFBy
b2NlZHVyZTsKKworICAgIFN0YWNrU2xvdFZhbHVlKHVuc2lnbmVkIGluZGV4LCBPcmlnaW4gb3Jp
Z2luLCB1bnNpZ25lZCBieXRlU2l6ZSkKKyAgICAgICAgOiBWYWx1ZShpbmRleCwgU3RhY2tTbG90
LCBwb2ludGVyKCksIG9yaWdpbikKKyAgICAgICAgLCBtX2J5dGVTaXplKGJ5dGVTaXplKQorICAg
ICAgICAsIG1fb2Zmc2V0RnJvbUZQKDApCisgICAgeworICAgIH0KKworICAgIHVuc2lnbmVkIG1f
Ynl0ZVNpemU7CisgICAgaW50cHRyX3QgbV9vZmZzZXRGcm9tRlA7Cit9OworCit9IH0gLy8gbmFt
ZXNwYWNlIEpTQzo6QjMKKworI2VuZGlmIC8vIEIzU3RhY2tTbG90VmFsdWVfaAorCkluZGV4OiBT
b3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNTdGFja21hcC5jcHAKPT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291
cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzU3RhY2ttYXAuY3BwCShyZXZpc2lvbiAwKQorKysgU291
cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzU3RhY2ttYXAuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0w
LDAgKzEsNDAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTUgQXBwbGUgSW5jLiBBbGwgcmln
aHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFu
ZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVy
bWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0
OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBh
Ym92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5k
IHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5h
cnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2Us
IHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4g
dGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQg
d2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQg
QlkgQVBQTEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdB
UlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQg
V0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxB
UgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElO
Qy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNU
LCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERB
TUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0Yg
U1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQ
Uk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBB
TlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBM
SUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0Up
IEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwg
RVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8K
KworI2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgIkIzU3RhY2ttYXAuaCIKKworbmFtZXNw
YWNlIEpTQyB7IG5hbWVzcGFjZSBCMyB7CisKK3ZvaWQgU3RhY2ttYXA6OmR1bXAoUHJpbnRTdHJl
YW0mIG91dCkgY29uc3QKK3sKKyAgICBvdXQucHJpbnQoCisgICAgICAgICJ7b3BhcXVlID0gIiwg
UmF3UG9pbnRlcihtX29wYXF1ZSksICIsIHJlcHMgPSAiLCBsaXN0RHVtcChtX3JlcHMpLAorICAg
ICAgICAiLCBnZW5lcmF0b3IgPSAiLCBSYXdQb2ludGVyKG1fZ2VuZXJhdG9yLmdldCgpKSwgIiwg
Y2xvYmJlcmVkID0gIiwgbV9jbG9iYmVyZWQsCisgICAgICAgICIsIHVzZWRSZWdpc3RlcnMgPSAi
LCBtX3VzZWRSZWdpc3RlcnMsICJ9Iik7Cit9CisKK30gfSAvLyBuYW1lc3BhY2UgSlNDOjpCMwor
CkluZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNTdGFja21hcC5oCj09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0K
LS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM1N0YWNrbWFwLmgJKHJldmlzaW9uIDApCisr
KyBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNTdGFja21hcC5oCSh3b3JraW5nIGNvcHkpCkBA
IC0wLDAgKzEsMTIwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE1IEFwcGxlIEluYy4gQWxs
IHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJj
ZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJl
IHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJl
IG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0
aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25z
IGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4g
YmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90
aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVy
IGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3Zp
ZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJ
REVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElF
RCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBM
SUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJ
Q1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBM
RSBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJ
UkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElB
TCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5U
IE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgor
ICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQg
T04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJ
Q1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJX
SVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdB
UkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAor
ICovCisKKyNpZm5kZWYgQjNTdGFja21hcF9oCisjZGVmaW5lIEIzU3RhY2ttYXBfaAorCisjaW5j
bHVkZSAiQjNWYWx1ZVJlcC5oIgorI2luY2x1ZGUgIkNDYWxsSGVscGVycy5oIgorI2luY2x1ZGUg
IlJlZ2lzdGVyU2V0LmgiCisjaW5jbHVkZSA8d3RmL1NoYXJlZFRhc2suaD4KKworbmFtZXNwYWNl
IEpTQyB7IG5hbWVzcGFjZSBCMyB7CisKK2NsYXNzIEIzVmFsdWU7CisKK2NsYXNzIFN0YWNrbWFw
IHsKK3B1YmxpYzoKKyAgICBzdHJ1Y3QgR2VuZXJhdGlvblBhcmFtcyB7CisgICAgICAgIC8vIFRo
aXMgaXMgdGhlIFZhbHVlIGNvbnRhaW5pbmcgdGhlIHN0YWNrbWFwLgorICAgICAgICBWYWx1ZSog
dmFsdWU7CisKKyAgICAgICAgLy8gVGhpcyBpcyB0aGUgc3RhY2ttYXAuCisgICAgICAgIFN0YWNr
bWFwKiBzdGFja21hcDsKKworICAgICAgICAvLyBUaGlzIGlzIHRoZSBqdW1wIHRvIHRoZSBzbG93
IHBhdGgsIGlmIHRoaXMgaXMgYSBzdGFja21hcCBmb3IgYSBDaGVjayB2YWx1ZS4KKyAgICAgICAg
Q0NhbGxIZWxwZXJzOjpKdW1wIGp1bXA7CisgICAgfTsKKyAgICAKKyAgICB0eXBlZGVmIHZvaWQg
R2VuZXJhdG9yRnVuY3Rpb24oQ0NhbGxIZWxwZXJzJiwgY29uc3QgR2VuZXJhdGlvblBhcmFtcyYp
OworICAgIHR5cGVkZWYgU2hhcmVkVGFzazxHZW5lcmF0b3JGdW5jdGlvbj4gR2VuZXJhdG9yOwor
ICAgIAorICAgIFN0YWNrbWFwKCkKKyAgICB7CisgICAgfQorCisgICAgLy8gU2V0IHNvbWUgb3Bh
cXVlIGRhdGEgdG8gaWRlbnRpZnkgdGhpcyBzdGFja21hcC4gVGhpcyBpcyB1c2VmdWwgYmVjYXVz
ZSBhIFN0YWNrbWFwLXVzaW5nIFZhbHVlCisgICAgLy8gY2FuIGJlIGR1cGxpY2F0ZWQsIGFuZCBl
YWNoIGR1cGxpY2F0ZSBtYXkgZW5kIHVwIGhhdmluZyBkaWZmZXJlbnQgcmVnaXN0ZXIgYWxsb2Nh
dGlvbi4gVGhpcworICAgIC8vIGFsbG93cyBhbGwgb2YgdGhvc2UgZHVwbGljYXRlcyB0byBiZSBh
YmxlIHRvIHJlZmVyIGJhY2sgdG8gd2hhdGV2ZXIgaGlnaC1sZXZlbCBkYXRhIHN0cnVjdHVyZXMK
KyAgICAvLyB3ZSB3ZXJlIHVzaW5nIHRvIGNyZWF0ZSB0aGUgdmFsdWUuCisgICAgdm9pZCBzZXRP
cGFxdWUodm9pZCogcGFyYW1ldGVyKQorICAgIHsKKyAgICAgICAgbV9vcGFxdWUgPSBwYXJhbWV0
ZXI7CisgICAgfQorICAgIHZvaWQqIG9wYXF1ZSgpIGNvbnN0IHsgcmV0dXJuIG1fb3BhcXVlOyB9
CisKKyAgICAvLyBDb252ZW5pZW5jZSBoZWxwZXJzIHdoZW4gdXNpbmcgaW5kaWNlcyBpbnN0ZWFk
IG9mIHBvaW50ZXJzLgorICAgIHZvaWQgc2V0T3BhcXVlSW5kZXgoc2l6ZV90IGluZGV4KQorICAg
IHsKKyAgICAgICAgc2V0T3BhcXVlKGJpdHdpc2VfY2FzdDx2b2lkKj4oaW5kZXgpKTsKKyAgICB9
CisgICAgc2l6ZV90IG9wYXF1ZUluZGV4KCkgY29uc3QgeyByZXR1cm4gYml0d2lzZV9jYXN0PHNp
emVfdD4ob3BhcXVlKCkpOyB9CisKKyAgICAvLyBDb25zdHJhaW4gYW4gYXJndW1lbnQgdG8gdGhl
IFZhbHVlIHRoYXQgdXNlcyB0aGlzIFN0YWNrbWFwLiBOb3RlIHRoYXQgaW5kZXggemVybyByZWZl
cnMgdG8gdGhlCisgICAgLy8gZmlyc3QgYXJndW1lbnQgdG8gdGhhdCBWYWx1ZSwgZXZlbiBpZiB0
aGF0IGFyZ3VtZW50IGlzIG5vdCBjb25zdHJhaW5hYmxlLiBGb3IgZXhhbXBsZSwgaW4gYQorICAg
IC8vIENoZWNrQWRkIHZhbHVlLCBpdCB3b3VsZCBiZSBhbiBlcnJvciB0byBjb25zdHJhaW4gaW5k
aWNlcyAwIGFuZCAxLiBJbiBhIENoZWNrIHZhbHVlLCBpdCB3b3VsZAorICAgIC8vIGJlIGFuIGVy
cm9yIHRvIGNvbnN0cmFpbiBpbmRleCAwLiBCdXQsIHdoZW4gdGhlIGdlbmVyYXRpb24gY2FsbGJh
Y2sgaXMgY2FsbGVkLCB5b3UgY2FuIGRlcGVuZAorICAgIC8vIG9uIHRoZSByZXBzIGZvciB0aG9z
ZSBpbmRpY2VzIGJlaW5nIGZpbGxlZCBpbi4KKyAgICB2b2lkIGNvbnN0cmFpbih1bnNpZ25lZCBp
bmRleCwgY29uc3QgVmFsdWVSZXAmIHJlcCkKKyAgICB7CisgICAgICAgIGlmIChpbmRleCArIDEg
PCBtX3JlcHMuc2l6ZSgpKQorICAgICAgICAgICAgbV9yZXBzLmdyb3coaW5kZXggKyAxKTsKKyAg
ICAgICAgbV9yZXBzW2luZGV4XSA9IHJlcDsKKyAgICB9CisKKyAgICB2b2lkIGNsb2JiZXIoY29u
c3QgUmVnaXN0ZXJTZXQmIHNldCkKKyAgICB7CisgICAgICAgIG1fY2xvYmJlcmVkLm1lcmdlKHNl
dCk7CisgICAgfQorCisgICAgdm9pZCBzZXRHZW5lcmF0b3IoUmVmUHRyPEdlbmVyYXRvcj4gZ2Vu
ZXJhdG9yKQorICAgIHsKKyAgICAgICAgbV9nZW5lcmF0b3IgPSBnZW5lcmF0b3I7CisgICAgfQor
CisgICAgdGVtcGxhdGU8dHlwZW5hbWUgRnVuY3Rvcj4KKyAgICB2b2lkIHNldEdlbmVyYXRvcihj
b25zdCBGdW5jdG9yJiBmdW5jdG9yKQorICAgIHsKKyAgICAgICAgbV9nZW5lcmF0b3IgPSBjcmVh
dGVTaGFyZWRUYXNrPEdlbmVyYXRvckZ1bmN0aW9uPihmdW5jdG9yKTsKKyAgICB9CisKKyAgICAv
LyBUaGVzZSB3aWxsIHJldHVybiBpbnRlcmVzdGluZyB0aGluZ3MgaW5zaWRlIHRoZSBnZW5lcmF0
b3IgY2FsbGJhY2ssIG9yIGFmdGVyIGNvbXBpbGF0aW9uLgorICAgIGNvbnN0IFZlY3RvcjxWYWx1
ZVJlcD4mIHJlcHMoKSBjb25zdCB7IHJldHVybiBtX3JlcHM7IH0KKyAgICBjb25zdCBSZWdpc3Rl
clNldCYgdXNlZFJlZ2lzdGVycygpIGNvbnN0IHsgcmV0dXJuIG1fdXNlZFJlZ2lzdGVyczsgfQor
CisgICAgdm9pZCBkdW1wKFByaW50U3RyZWFtJikgY29uc3Q7CisgICAgCitwcml2YXRlOgorICAg
IHZvaWQqIG1fb3BhcXVlIHsgbnVsbHB0ciB9OworICAgIFZlY3RvcjxWYWx1ZVJlcD4gbV9yZXBz
OworICAgIFJlZlB0cjxHZW5lcmF0b3I+IG1fZ2VuZXJhdG9yOworICAgIFJlZ2lzdGVyU2V0IG1f
Y2xvYmJlcmVkOworICAgIFJlZ2lzdGVyU2V0IG1fdXNlZFJlZ2lzdGVyczsKK307CisKK30gfSAv
LyBuYW1lc3BhY2UgSlNDOjpCMworCisjZW5kaWYgLy8gQjNTdGFja21hcF9oCisKSW5kZXg6IFNv
dXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM1N3aXRjaENhc2UuY3BwCj09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNv
dXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM1N3aXRjaENhc2UuY3BwCShyZXZpc2lvbiAwKQorKysg
U291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzU3dpdGNoQ2FzZS5jcHAJKHdvcmtpbmcgY29weSkK
QEAgLTAsMCArMSwzOSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNSBBcHBsZSBJbmMuIEFs
bCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3Vy
Y2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFy
ZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFy
ZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4g
dGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9u
cyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGlu
IGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5v
dGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1l
ciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92
aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9W
SURFRCBCWSBBUFBMRSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJ
RUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1Q
TElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJU
SUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQ
TEUgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5E
SVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJ
QUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVO
VCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IK
KyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5E
IE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RS
SUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVS
V0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRX
QVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLiAK
KyAqLworCisjaW5jbHVkZSAiY29uZmlnLmgiCisjaW5jbHVkZSAiQjNTd2l0Y2hDYXNlLmgiCisK
KyNpbmNsdWRlICJCM0Jhc2ljQmxvY2suaCIKKworbmFtZXNwYWNlIEpTQyB7IG5hbWVzcGFjZSBC
MyB7CisKK3ZvaWQgU3dpdGNoQ2FzZTo6ZHVtcChQcmludFN0cmVhbSYgb3V0KSBjb25zdAorewor
ICAgIG91dC5wcmludChtX2Nhc2VWYWx1ZSwgIi0+IiwgcG9pbnRlckR1bXAobV90YXJnZXQpKTsK
K30KKworfSB9IC8vIG5hbWVzcGFjZSBKU0M6OkIzCisKSW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0
Q29yZS9iMy9CM1N3aXRjaENhc2UuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENv
cmUvYjMvQjNTd2l0Y2hDYXNlLmgJKHJldmlzaW9uIDApCisrKyBTb3VyY2UvSmF2YVNjcmlwdENv
cmUvYjMvQjNTd2l0Y2hDYXNlLmgJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSw2MyBAQAorLyoK
KyAqIENvcHlyaWdodCAoQykgMjAxNSBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisg
KgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywg
d2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQg
dGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3Ry
aWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAor
ICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBk
aXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVw
cm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNv
bmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3Vt
ZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmli
dXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIGBg
QVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVE
SU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1F
UkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFS
RSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUgorICogQ09OVFJJ
QlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQ
RUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5H
LCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RT
IE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lO
RVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9G
IExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9S
VAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkg
V0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQg
T0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLiAKKyAqLworCisjaWZuZGVmIEIzU3dp
dGNoQ2FzZV9oCisjZGVmaW5lIEIzU3dpdGNoQ2FzZV9oCisKKyNpbmNsdWRlIDx3dGYvU3RkTGli
RXh0cmFzLmg+CisjaW5jbHVkZSA8d3RmL1ByaW50U3RyZWFtLmg+CisKK25hbWVzcGFjZSBKU0Mg
eyBuYW1lc3BhY2UgQjMgeworCitjbGFzcyBCYXNpY0Jsb2NrOworCitjbGFzcyBTd2l0Y2hDYXNl
IHsKK3B1YmxpYzoKKyAgICBTd2l0Y2hDYXNlKCkKKyAgICB7CisgICAgfQorCisgICAgU3dpdGNo
Q2FzZShpbnQ2NF90IGNhc2VWYWx1ZSwgQmFzaWNCbG9jayogdGFyZ2V0KQorICAgICAgICA6IG1f
Y2FzZVZhbHVlKGNhc2VWYWx1ZSkKKyAgICAgICAgLCBtX3RhcmdldCh0YXJnZXQpCisgICAgewor
ICAgIH0KKworICAgIGV4cGxpY2l0IG9wZXJhdG9yIGJvb2woKSBjb25zdCB7IHJldHVybiAhIW1f
dGFyZ2V0OyB9CisKKyAgICBpbnQ2NF90IGNhc2VWYWx1ZSgpIGNvbnN0IHsgcmV0dXJuIG1fY2Fz
ZVZhbHVlOyB9CisgICAgQmFzaWNCbG9jayogdGFyZ2V0KCkgY29uc3QgeyByZXR1cm4gbV90YXJn
ZXQ7IH0KKworICAgIHZvaWQgZHVtcChQcmludFN0cmVhbSYgb3V0KSBjb25zdDsKKworcHJpdmF0
ZToKKyAgICBpbnQ2NF90IGNhc2VWYWx1ZTsKKyAgICBCYXNpY0Jsb2NrKiB0YXJnZXQ7Cit9Owor
Cit9IH0gLy8gbmFtZXNwYWNlIEpTQzo6QjMKKworI2VuZGlmIC8vIEIzU3dpdGNoQ2FzZV9oCisK
SW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM1N3aXRjaFZhbHVlLmNwcAo9PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNTd2l0Y2hWYWx1ZS5jcHAJKHJldmlz
aW9uIDApCisrKyBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNTd2l0Y2hWYWx1ZS5jcHAJKHdv
cmtpbmcgY29weSkKQEAgLTAsMCArMSw2MyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNSBB
cHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5k
IHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2Rp
ZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRp
dGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUg
bXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qg
b2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0
cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmln
aHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dp
bmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1h
dGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZU
V0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBS
RVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8s
IFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVT
UyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZF
TlQgU0hBTEwgQVBQTEUgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5Z
IERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9S
IENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisg
KiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVT
RSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZF
UiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBD
T05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdF
TkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBP
RiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNV
Q0ggREFNQUdFLiAKKyAqLworCisjaW5jbHVkZSAiY29uZmlnLmgiCisjaW5jbGR1ZSAiQjNTd2l0
Y2hWYWx1ZS5oIgorCituYW1lc3BhY2UgSlNDIHsgbmFtZXNwYWNlIEIzIHsKKworU3dpdGNoVmFs
dWU6On5Td2l0Y2hWYWx1ZSgpCit7Cit9CisKK1N3aXRjaENhc2UgU3dpdGNoVmFsdWU6OnJlbW92
ZUNhc2UodW5zaWduZWQgaW5kZXgpCit7CisgICAgU3dpdGNoQ2FzZSByZXN1bHQgPSBtX3N1Y2Nl
c3NvcnNbaW5kZXhdOworICAgIG1fc3VjY2Vzc29yc1tpbmRleF0gPSBtX3N1Y2Nlc3NvcnMubGFz
dCgpOworICAgIG1fc3VjY2Vzc29ycy5yZW1vdmVMYXN0KCk7CisgICAgcmV0dXJuIHJlc3VsdDsK
K30KKwordm9pZCBTd2l0Y2hWYWx1ZTo6YXBwZW5kQ2FzZShjb25zdCBTd2l0Y2hDYXNlJiBzd2l0
Y2hDYXNlKQoreworICAgIG1fc3VjY2Vzc29ycy5hcHBlbmQobV9zdWNjZXNzb3JzLmxhc3QoKSk7
CisgICAgbV9zdWNjZXNzb3JzW21fc3VjY2Vzc29ycy5zaXplKCkgLSAyXSA9IHN3aXRjaENhc2Uu
dGFyZ2V0KCk7CisgICAgbV92YWx1ZXMuYXBwZW5kKHN3aXRjaENhc2UuY2FzZVZhbHVlKCkpOwor
fQorCit2b2lkIFN3aXRjaFZhbHVlOjpkdW1wTWV0YShQcmludFN0cmVhbSYgb3V0KSBjb25zdAor
eworICAgIC8vIFRoaXMgZGVzdHJ1Y3RpdmVseSBvdmVycmlkZXMgQ29udHJvbFZhbHVlJ3MgZHVt
cE1ldGEoKS4KKyAgICBvdXQucHJpbnQobGlzdER1bXAoKnRoaXMpKTsKK30KKworU3dpdGNoVmFs
dWU6OlN3aXRjaFZhbHVlKHVuc2lnbmVkIGluZGV4LCBPcmlnaW4gb3JpZ2luLCBCYXNpY0Jsb2Nr
KiBmYWxsVGhyb3VnaCkKKyAgICA6IENvbnRyb2xWYWx1ZShpbmRleCwgU3dpdGNoLCBvcmlnaW4p
Cit7CisgICAgbV9zdWNjZXNzb3JzLmFwcGVuZChmYWxsVGhyb3VnaCk7Cit9CisKK30gfSAvLyBu
YW1lc3BhY2UgSlNDOjpCMworCkluZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNTd2l0
Y2hWYWx1ZS5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM1N3aXRj
aFZhbHVlLmgJKHJldmlzaW9uIDApCisrKyBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNTd2l0
Y2hWYWx1ZS5oCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsMTIzIEBACisvKgorICogQ29weXJp
Z2h0IChDKSAyMDE1IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRp
c3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdp
dGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBm
b2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBv
ZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3Rp
Y2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIu
CisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhl
IGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBh
bmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBh
bmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAq
CisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFO
RCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBO
T1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklM
SVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlN
RUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUg
TElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAq
IEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1Qg
TElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklD
RVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJS
VVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZ
LCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5D
TFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9G
IFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9T
U0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisKKyNpZm5kZWYgQjNTd2l0Y2hWYWx1ZV9o
CisjZGVmaW5lIEIzU3dpdGNoVmFsdWVfaAorCisjaW5jbHVkZSAiQjNDb250cm9sVmFsdWUuaCIK
KyNpbmNsdWRlICJCM1N3aXRjaENhc2UuaCIKKworbmFtZXNwYWNlIEpTQyB7IG5hbWVzcGFjZSBC
MyB7CisKK2NsYXNzIFN3aXRjaFZhbHVlIDogcHVibGljIENvbnRyb2xWYWx1ZSB7CitwdWJsaWM6
CisgICAgc3RhdGljIGJvb2wgYWNjZXB0cyhPcGNvZGUgb3Bjb2RlKSB7IHJldHVybiBvcGNvZGUg
PT0gU3dpdGNoOyB9CisKKyAgICB+U3dpdGNoVmFsdWUoKTsKKworICAgIC8vIG51bUNhc2VWYWx1
ZXMoKSArIDEgPT0gbnVtU3VjY2Vzc29ycygpLgorICAgIHVuc2lnbmVkIG51bUNhc2VWYWx1ZXMo
KSBjb25zdCB7IHJldHVybiBtX3ZhbHVlcy5zaXplKCk7IH0KKworICAgIC8vIFRoZSBzdWNjZXNz
b3IgZm9yIHRoaXMgY2FzZSB2YWx1ZSBpcyBhdCB0aGUgc2FtZSBpbmRleC4KKyAgICBpbnQ2NF90
IGNhc2VWYWx1ZSh1bnNpZ25lZCBpbmRleCkgY29uc3QgeyByZXR1cm4gbV92YWx1ZXNbaV07IH0K
KyAgICAKKyAgICBjb25zdCBWZWN0b3I8aW50NjRfdD4mIGNhc2VWYWx1ZXMoKSBjb25zdCB7IHJl
dHVybiBtX3ZhbHVlczsgfQorCisgICAgQmFzaWNCbG9jayogZmFsbFRocm91Z2goKSBjb25zdCB7
IHJldHVybiBzdWNjZXNzb3JzKCkubGFzdCgpOyB9CisgICAgQmFzaWNCbG9jayomIGZhbGxUaHJv
dWdoKCkgeyByZXR1cm4gc3VjY2Vzc29ycygpLmxhc3QoKTsgfQorCisgICAgdW5zaWduZWQgc2l6
ZSgpIGNvbnN0IHsgcmV0dXJuIG51bUNhc2VWYWx1ZXMoKTsgfQorICAgIFN3aXRjaENhc2UgYXQo
dW5zaWduZWQgaW5kZXgpIGNvbnN0CisgICAgeworICAgICAgICByZXR1cm4gU3dpdGNoQ2FzZShj
YXNlVmFsdWUoaW5kZXgpLCBzdWNjZXNzb3IoaW5kZXgpKTsKKyAgICB9CisgICAgU3dpdGNoQ2Fz
ZSBvcGVyYXRvcltdKHVuc2lnbmVkIGluZGV4KSBjb25zdAorICAgIHsKKyAgICAgICAgcmV0dXJu
IGF0KGluZGV4KTsKKyAgICB9CisKKyAgICBjbGFzcyBpdGVyYXRvciB7CisgICAgcHVibGljOgor
ICAgICAgICBpdGVyYXRvcigpCisgICAgICAgICAgICA6IG1fc3dpdGNoKG51bGxwdHIpCisgICAg
ICAgICAgICAsIG1faW5kZXgoMCkKKyAgICAgICAgeworICAgICAgICB9CisKKyAgICAgICAgaXRl
cmF0b3IoU3dpdGNoVmFsdWUmIHN3aXRjaFZhbHVlLCB1bnNpZ25lZCBpbmRleCkKKyAgICAgICAg
ICAgIDogbV9zd2l0Y2goJnN3aXRjaFZhbHVlKQorICAgICAgICAgICAgLCBtX2luZGV4KGluZGV4
KQorICAgICAgICB7CisgICAgICAgIH0KKworICAgICAgICBTd2l0Y2hDYXNlIG9wZXJhdG9yKigp
CisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBtX3N3aXRjaC0+YXQobV9pbmRleCk7Cisg
ICAgICAgIH0KKworICAgICAgICBpdGVyYXRvciYgb3BlcmF0b3IrKygpCisgICAgICAgIHsKKyAg
ICAgICAgICAgIG1faW5kZXgrKzsKKyAgICAgICAgICAgIHJldHVybiAqdGhpczsKKyAgICAgICAg
fQorCisgICAgICAgIGJvb2wgb3BlcmF0b3I9PShjb25zdCBpdGVyYXRvciYgb3RoZXIpIGNvbnN0
CisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBtX2luZGV4ID09IG90aGVyLm1faW5kZXg7
CisgICAgICAgIH0KKworICAgICAgICBib29sIG9wZXJhdG9yIT0oY29uc3QgaXRlcmF0b3ImIG90
aGVyKSBjb25zdAorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gISgqdGhpcyA9PSBvdGhl
cik7CisgICAgICAgIH0KKworICAgIHByaXZhdGU6CisgICAgICAgIFN3aXRjaFZhbHVlKiBtX3N3
aXRjaDsKKyAgICAgICAgdW5zaWduZWQgbV9pbmRleDsKKyAgICB9OworCisgICAgaXRlcmF0b3Ig
YmVnaW4oKSBjb25zdCB7IHJldHVybiBpdGVyYXRvcigqdGhpcywgMCk7IH0KKyAgICBpdGVyYXRv
ciBlbmQoKSBjb25zdCB7IHJldHVybiBpdGVyYXRvcigqdGhpcywgc2l6ZSgpKTsgfQorCisgICAg
Ly8gVGhpcyByZW1vdmVzIHRoZSBjYXNlIGFuZCByZW9yZGVycyB0aGluZ3MgYSBiaXQuIElmIHlv
dSdyZSBpdGVyYXRpbmcgdGhlIGNhc2VzIGZyb20gMCB0byBOLAorICAgIC8vIHRoZW4geW91IGNh
biBrZWVwIGl0ZXJhdGluZyBhZnRlciB0aGlzIHNvIGxvbmcgYXMgeW91IHJldmlzaXQgdGhpcyBz
YW1lIGluZGV4ICh3aGljaCB3aWxsIG5vdworICAgIC8vIGNvbnRhaW4gc29tZSBvdGhlciBjYXNl
IHZhbHVlKS4gVGhpcyByZW1vdmVzIHRoZSBjYXNlIHRoYXQgd2FzIHJlbW92ZWQuCisgICAgU3dp
dGNoQ2FzZSByZW1vdmVDYXNlKHVuc2lnbmVkIGluZGV4KTsKKworICAgIHZvaWQgYXBwZW5kQ2Fz
ZShjb25zdCBTd2l0Y2hDYXNlJiBzd2l0Y2hDYXNlKTsKKworcHJvdGVjdGVkOgorICAgIHZvaWQg
ZHVtcE1ldGEoUHJpbnRTdHJlYW0mKSBjb25zdCBvdmVycmlkZTsKKworcHJpdmF0ZToKKyAgICBm
cmllbmQgY2xhc3MgUHJvY2VkdXJlOworCisgICAgU3dpdGNoVmFsdWUodW5zaWduZWQgaW5kZXgs
IE9yaWdpbiBvcmlnaW4sIEJhc2ljQmxvY2sqIGZhbGxUaHJvdWdoKTsKK307CisKK30gfSAvLyBu
YW1lc3BhY2UgSlNDOjpCMworCisjZW5kaWYgLy8gQjNTd2l0Y2hWYWx1ZV9oCisKSW5kZXg6IFNv
dXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM1R5cGUuY3BwCj09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9K
YXZhU2NyaXB0Q29yZS9iMy9CM1R5cGUuY3BwCShyZXZpc2lvbiAwKQorKysgU291cmNlL0phdmFT
Y3JpcHRDb3JlL2IzL0IzVHlwZS5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSw1NCBAQAor
LyoKKyAqIENvcHlyaWdodCAoQykgMjAxNSBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQu
CisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jt
cywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlk
ZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRp
c3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdo
dAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2lu
ZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3Qg
cmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9m
IGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRv
Y3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0
cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMu
IGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5D
TFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9G
IE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NF
IEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUgorICogQ09O
VFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUws
IFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVE
SU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdP
T0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJV
U0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAq
IE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1Ig
VE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBB
TlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklT
RUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLiAKKyAqLworCisjaW5jbHVkZSAi
Y29uZmlnLmgiCisjaW5jbHVkZSAiQjNUeXBlLmgiCisKKyNpbmNsdWRlIDx3dGYvUHJpbnRTdHJl
YW0uaD4KKworbmFtZXNwYWNlIFdURiB7CisKK3VzaW5nIG5hbWVzcGFjZSBKU0M6OkIzOworCit2
b2lkIHByaW50SW50ZXJuYWwoUHJpbnRTdHJlYW0mIG91dCwgVHlwZSB0eXBlKQoreworICAgIHN3
aXRjaCAodHlwZSkgeworICAgIGNhc2UgVm9pZDoKKyAgICAgICAgb3V0LnByaW50KCJWb2lkIik7
CisgICAgICAgIHJldHVybjsKKyAgICBjYXNlIEludDMyOgorICAgICAgICBvdXQucHJpbnQoIklu
dDMyIik7CisgICAgICAgIHJldHVybjsKKyAgICBjYXNlIEludDY0OgorICAgICAgICBvdXQucHJp
bnQoIkludDY0Iik7CisgICAgICAgIHJldHVybjsKKyAgICBjYXNlIERvdWJsZToKKyAgICAgICAg
b3V0LnByaW50KCJEb3VibGUiKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBSRUxFQVNF
X0FTU0VSVF9OT1RfUkVBQ0hFRCgpOworfQorCit9IC8vIG5hbWVzcGFjZSBXVEYKSW5kZXg6IFNv
dXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM1R5cGUuaAo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2
YVNjcmlwdENvcmUvYjMvQjNUeXBlLmgJKHJldmlzaW9uIDApCisrKyBTb3VyY2UvSmF2YVNjcmlw
dENvcmUvYjMvQjNUeXBlLmgJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSw2OCBAQAorLyoKKyAq
IENvcHlyaWdodCAoQykgMjAxNSBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgor
ICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0
aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhh
dCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1
dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICog
ICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNj
bGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9k
dWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRp
dGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50
YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRp
b24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIGBgQVMg
SVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5H
LCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNI
QU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBE
SVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUgorICogQ09OVFJJQlVU
T1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJ
QUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBC
VVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9S
IFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNT
IElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJ
QUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAor
ICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZ
IE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0Yg
VEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLiAKKyAqLworCisjaWZuZGVmIEIzVHlwZV9o
CisjZGVmaW5lIEIzVHlwZV9oCisKKyNpbmNsdWRlIDx3dGYvU3RkTGliRXh0cmFzLmg+CisKK25h
bWVzcGFjZSBKU0MgeyBuYW1lc3BhY2UgQjMgeworCitlbnVtIFR5cGUgeworICAgIFZvaWQsCisg
ICAgSW50MzIsCisgICAgSW50NjQsCisgICAgRG91YmxlCit9OworCitpbmxpbmUgYm9vbCBpc0lu
dChUeXBlIHR5cGUpCit7CisgICAgcmV0dXJuIHR5cGUgPT0gSW50MzIgfHwgdHlwZSA9PSBJbnQ2
NDsKK30KKworaW5saW5lIGJvb2wgaXNGbG9hdChUeXBlIHR5cGUpCit7CisgICAgcmV0dXJuIHR5
cGUgPT0gRG91YmxlOworfQorCitpbmxpbmUgVHlwZSBwb2ludGVyKCkgY29uc3QKK3sKKyAgICBp
ZiAoc2l6ZW9mKHZvaWQqKSA9PSA0KQorICAgICAgICByZXR1cm4gSW50MzI7CisgICAgcmV0dXJu
IEludDY0OworfQorCit9IH0gLy8gbmFtZXNwYWNlIEpTQzo6QjMKKworbmFtZXNwYWNlIFdURiB7
CisKK2NsYXNzIFByaW50U3RyZWFtOworCit2b2lkIHByaW50SW50ZXJuYWwoUHJpbnRTdHJlYW0m
LCBKU0M6OkIzOjpUeXBlKTsKKworfSAvLyBuYW1lc3BhY2UgV1RGCisKKyNlbmRpZiAvLyBCM1R5
cGVfaAorCkluZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNVcHNpbG9uVmFsdWUuY3Bw
Cj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM1Vwc2lsb25WYWx1ZS5j
cHAJKHJldmlzaW9uIDApCisrKyBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNVcHNpbG9uVmFs
dWUuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsNDEgQEAKKy8qCisgKiBDb3B5cmlnaHQg
KEMpIDIwMTUgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJp
YnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91
dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxv
d2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNv
dXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwg
dGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAq
IDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJv
dmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0
aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9v
ciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAq
IFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFTIElTJycgQU5EIEFO
WQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBM
SU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkg
QU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4g
IElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFC
TEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhF
TVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1J
VEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsg
TE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJ
T04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdI
RVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJ
TkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhF
IFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJ
TElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKworI2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1
ZGUgIkIzVXBzaWxvblZhbHVlLmgiCisKK25hbWVzcGFjZSBKU0MgeyBuYW1lc3BhY2UgQjMgewor
CitVcHNpbG9uVmFsdWU6On5VcHNpbG9uVmFsdWUoKQoreworfQorCit2b2lkIFVwc2lsb25WYWx1
ZTo6ZHVtcE1ldGEoUHJpbnRTdHJlYW0mIG91dCkgY29uc3QKK3sKKyAgICBvdXQucHJpbnQoIl4i
LCBtX3BoaS0+aW5kZXgoKSk7Cit9CisKK30gfSAvLyBuYW1lc3BhY2UgSlNDOjpCMworCkluZGV4
OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNVcHNpbG9uVmFsdWUuaAo9PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0t
LSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNVcHNpbG9uVmFsdWUuaAkocmV2aXNpb24gMCkK
KysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM1Vwc2lsb25WYWx1ZS5oCSh3b3JraW5nIGNv
cHkpCkBAIC0wLDAgKzEsNjAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTUgQXBwbGUgSW5j
LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4g
c291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9u
LCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisg
KiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0
YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRp
dGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9u
cyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAg
ICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2Ns
YWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMg
cHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMg
UFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJ
TVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAq
IElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEg
UEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxM
IEFQUExFIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1Qs
IElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFV
RU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VS
RU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEs
IE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VE
IEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1Qs
IFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBP
VEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBT
T0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFH
RS4gCisgKi8KKworI2lmbmRlZiBCM1Vwc2lsb25WYWx1ZV9oCisjZGVmaW5lIEIzVXBzaWxvblZh
bHVlX2gKKworI2luY2x1ZGUgIkIzVmFsdWUuaCIKKworbmFtZXNwYWNlIEpTQyB7IG5hbWVzcGFj
ZSBCMyB7CisKK2NsYXNzIFVwc2lsb25WYWx1ZSA6IHB1YmxpYyBWYWx1ZSB7CitwdWJsaWM6Cisg
ICAgc3RhdGljIGJvb2wgYWNjZXB0cyhPcGNvZGUgb3Bjb2RlKSB7IHJldHVybiBvcGNvZGUgPT0g
VXBzaWxvbjsgfQorCisgICAgflVwc2lsb25WYWx1ZSgpOworCisgICAgVmFsdWUqIHBoaSgpIGNv
bnN0IHsgcmV0dXJuIG1fcGhpOyB9CisKK3Byb3RlY3RlZDoKKyAgICB2b2lkIGR1bXBNZXRhKFBy
aW50U3RyZWFtJikgY29uc3Qgb3ZlcnJpZGU7CisKK3ByaXZhdGU6CisgICAgZnJpZW5kIGNsYXNz
IFByb2NlZHVyZTsKKyAgICAKKyAgICBVcHNpbG9uVmFsdWUodW5zaWduZWQgaW5kZXgsIE9yaWdp
biBvcmlnaW4sIFZhbHVlKiB2YWx1ZSwgVmFsdWUqIHBoaSkKKyAgICAgICAgOiBWYWx1ZShpbmRl
eCwgUGhpLCBWb2lkLCBvcmlnaW4sIHZhbHVlKQorICAgICAgICAsIG1fcGhpKHBoaSkKKyAgICB7
CisgICAgICAgIEFTU0VSVCh2YWx1ZS0+dHlwZSgpID09IHBoaS0+dHlwZSgpKTsKKyAgICB9CisK
KyAgICBWYWx1ZSogbV9waGk7Cit9OworCit9IH0gLy8gbmFtZXNwYWNlIEpTQzo6QjMKKworI2Vu
ZGlmIC8vIEIzVXBzaWxvblZhbHVlX2gKKwpJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL2Iz
L0IzVmFsdWUuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM1Zh
bHVlLmNwcAkocmV2aXNpb24gMCkKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM1ZhbHVl
LmNwcAkod29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDE2OSBAQAorLyoKKyAqIENvcHlyaWdodCAo
QykgMjAxNSBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmli
dXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0
CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93
aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291
cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0
aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICog
Mi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92
ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRo
ZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29y
IG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICog
VEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5Z
CisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJ
TUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBB
TkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAg
SU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJM
RSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVN
UExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlU
RUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBM
T1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElP
TikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hF
VEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElO
RyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUg
VVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklM
SVRZIE9GIFNVQ0ggREFNQUdFLiAKKyAqLworCisjaW5jbHVkZSAiY29uZmlnLmgiCisjaW5jbHVk
ZSAiQjNWYWx1ZS5oIgorCituYW1lc3BhY2UgSlNDIHsgbmFtZXNwYWNlIEIzIHsKKworVmFsdWU6
On5WYWx1ZSgpCit7Cit9CisKK3ZvaWQgVmFsdWU6OnJlcGxhY2VXaXRoSWRlbnRpdHkoVmFsdWUq
IHZhbHVlKQoreworICAgIC8vIFRoaXMgaXMgYSBiaXQgY3JhenkuIEl0IGRvZXMgYW4gaW4tcGxh
Y2UgcmVwbGFjZW1lbnQgb2Ygd2hhdGV2ZXIgVmFsdWUgc3ViY2xhc3MgdGhpcyBpcyB3aXRoCisg
ICAgLy8gYSBwbGFpbiBJZGVudGl0eSBWYWx1ZS4gV2UgZmlyc3QgY29sbGVjdCBhbGwgb2YgdGhl
IGluZm9ybWF0aW9uIHdlIG5lZWQsIHRoZW4gd2UgZGVzdHJ1Y3QgdGhlCisgICAgLy8gcHJldmlv
dXMgdmFsdWUgaW4gcGxhY2UsIGFuZCB0aGVuIHdlIGNvbnN0cnVjdCB0aGUgSWRlbnRpdHkgVmFs
dWUgaW4gcGxhY2UuCisKKyAgICB1bnNpZ25lZCBpbmRleCA9IG1faW5kZXg7CisgICAgVHlwZSB0
eXBlID0gbV90eXBlOworICAgIE9yaWdpbiBvcmlnaW4gPSBtX29yaWdpbjsKKyAgICBCYXNpY0Js
b2NrKiBvd25lciA9IHRoaXMtPm93bmVyOworICAgIFZhbHVlKiByZXBsYWNlbWVudCA9IHRoaXMt
PnJlcGxhY2VtZW50OworICAgIHZvaWQqIG1pc2MgPSB0aGlzLT5taXNjOworCisgICAgUkVMRUFT
RV9BU1NFUlQodHlwZSA9PSB2YWx1ZS0+dHlwZSgpKTsKKworICAgIHRoaXMtPlZhbHVlOjp+VmFs
dWUoKTsKKworICAgIG5ldyAodGhpcykgKGluZGV4LCBJZGVudGlmeSwgdHlwZSwgb3JpZ2luLCB2
YWx1ZSk7CisKKyAgICB0aGlzLT5vd25lciA9IG93bmVyOworICAgIHRoaXMtPnJlcGxhY2VtZW50
ID0gcmVwbGFjZW1lbnQ7CisgICAgdGhpcy0+bWlzYyA9IG1pc2M7Cit9CisKK3ZvaWQgVmFsdWU6
OmR1bXAoUHJpbnRTdHJlYW0mIG91dCkgY29uc3QKK3sKKyAgICBvdXQucHJpbnQoZHVtcFByZWZp
eCwgbV9pbmRleCk7Cit9CisKK3ZvaWQgVmFsdWU6OmRlZXBEdW1wKFByaW50U3RyZWFtJiBvdXQp
IGNvbnN0Cit7CisgICAgb3V0LnByaW50KG1fdHlwZSwgIiAiLCAqdGhpcywgIiA9ICIsIG1fb3Bj
b2RlKTsKKworICAgIG91dC5wcmludCgiKCIpOworICAgIENvbW1hUHJpbnRlciBjb21tYTsKKyAg
ICBmb3IgKFZhbHVlKiBjaGlsZCA6IGNoaWxkcmVuKCkpCisgICAgICAgIG91dC5wcmludChjb21t
YSwgcG9pbnRlckR1bXAoY2hpbGQpKTsKKworICAgIFN0cmluZ1ByaW50U3RyZWFtIHN0cmluZ091
dDsKKyAgICBkdW1wTWV0YShzdHJpbmdPdXQpOworICAgIENTdHJpbmcgc3RyaW5nID0gc3RyaW5n
T3V0LnRvQ1N0cmluZygpOworICAgIGlmIChzdHJpbmcubGVuZ3RoKCkpCisgICAgICAgIG91dC5w
cmludChjb21tYSwgc3RyaW5nKTsKKworICAgIG91dC5wcmludCgiKSIpOworfQorCitib29sIFZh
bHVlOjpoYXNJbnQzMigpIGNvbnN0Cit7CisgICAgcmV0dXJuIGZhbHNlOworfQorCitpbnQzMl90
IFZhbHVlOjphc0ludDMyKCkgY29uc3QKK3sKKyAgICBSRUxFQVNFX0FTU0VSVF9OT1RfUkVBQ0hF
RCgpOworICAgIHJldHVybiAwOworfQorCitib29sIFZhbHVlOjpoYXNJbnQ2NCgpIGNvbnN0Cit7
CisgICAgcmV0dXJuIGZhbHNlOworfQorCitpbnQ2NF90IFZhbHVlOjphc0ludDY0KCkgY29uc3QK
K3sKKyAgICBSRUxFQVNFX0FTU0VSVF9OT1RfUkVBQ0hFRCgpOworICAgIHJldHVybiAwOworfQor
Citib29sIFZhbHVlOjpoYXNEb3VibGUoKSBjb25zdAoreworICAgIHJldHVybiBmYWxzZTsKK30K
KworZG91YmxlIFZhbHVlOjphc0RvdWJsZSgpIGNvbnN0Cit7CisgICAgUkVMRUFTRV9BU1NFUlRf
Tk9UX1JFQUNIRUQoKTsKKyAgICByZXR1cm4gMDsKK30KKwordm9pZCBWYWx1ZTo6ZHVtcE1ldGEo
UHJpbnRTdHJlYW0mKSBjb25zdAoreworfQorCitUeXBlIFZhbHVlOjp0eXBlRm9yKE9wY29kZSBv
cGNvZGUsIFZhbHVlKiBmaXJzdENoaWxkKQoreworICAgIHN3aXRjaCAob3Bjb2RlKSB7CisgICAg
Y2FzZSBJZGVudGl0eToKKyAgICBjYXNlIEFkZDoKKyAgICBjYXNlIFN1YjoKKyAgICBjYXNlIE11
bDoKKyAgICBjYXNlIERpdjoKKyAgICBjYXNlIENoaWxsRGl2OgorICAgIGNhc2UgTW9kOgorICAg
IGNhc2UgQml0QW5kOgorICAgIGNhc2UgQml0T3I6CisgICAgY2FzZSBCaXRYb3I6CisgICAgY2Fz
ZSBTaGw6CisgICAgY2FzZSBTU2hyOgorICAgIGNhc2UgWlNocjoKKyAgICBjYXNlIENoZWNrQWRk
OgorICAgIGNhc2UgQ2hlY2tTdWI6CisgICAgY2FzZSBDaGVja011bDoKKyAgICAgICAgcmV0dXJu
IGZpcnN0Q2hpbGQtPnR5cGUoKTsKKyAgICBjYXNlIEZyYW1lUG9pbnRlcjoKKyAgICAgICAgcmV0
dXJuIHBvaW50ZXIoKTsKKyAgICBjYXNlIFNFeHQ4OgorICAgIGNhc2UgU0V4dDE2OgorICAgIGNh
c2UgRFRvSTMyOgorICAgIGNhc2UgRXF1YWw6CisgICAgY2FzZSBOb3RFcXVhbDoKKyAgICBjYXNl
IExlc3NUaGFuOgorICAgIGNhc2UgR3JlYXRlclRoYW46CisgICAgY2FzZSBMZXNzRXF1YWw6Cisg
ICAgY2FzZSBHcmVhdGVyRXF1YWw6CisgICAgY2FzZSBBYm92ZToKKyAgICBjYXNlIEJlbG93Ogor
ICAgIGNhc2UgQWJvdmVFcXVhbDoKKyAgICBjYXNlIEJlbG93RXF1YWw6CisgICAgICAgIHJldHVy
biBJbnQzMjsKKyAgICBjYXNlIFNFeHQzMjoKKyAgICBjYXNlIFpFeHQzMjoKKyAgICAgICAgcmV0
dXJuIEludDY0OworICAgIGNhc2UgRlJvdW5kOgorICAgIGNhc2UgSVRvRDoKKyAgICAgICAgcmV0
dXJuIERvdWJsZTsKKyAgICBjYXNlIE5vcDoKKyAgICAgICAgcmV0dXJuIFZvaWQ7CisgICAgZGVm
YXVsdDoKKyAgICAgICAgUkVMRUFTRV9BU1NFUlRfTk9UX1JFQUNIRUQoKTsKKyAgICB9Cit9CisK
K30gfSAvLyBuYW1lc3BhY2UgSlNDOjpCMworCkluZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUv
YjMvQjNWYWx1ZS5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM1Zh
bHVlLmgJKHJldmlzaW9uIDApCisrKyBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNWYWx1ZS5o
CSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsMTczIEBACisvKgorICogQ29weXJpZ2h0IChDKSAy
MDE1IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlv
biBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAq
IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcg
Y29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2Ug
Y29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMg
bGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBS
ZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNv
cHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZv
bGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3Ro
ZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElT
IFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAq
IEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRF
RCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBG
SVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBO
TyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZP
UiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFS
WSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBU
TywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1Mg
T0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBI
T1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVS
IElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5F
R0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UK
KyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkg
T0YgU1VDSCBEQU1BR0UuIAorICovCisKKyNpZm5kZWYgQjNWYWx1ZV9oCisjZGVmaW5lIEIzVmFs
dWVfaAorCisjaW5jbHVkZSAiQjNPcmlnaW4uaCIKKyNpbmNsdWRlICJCM1R5cGUuaCIKKyNpbmNs
dWRlIDx3dGYvRmFzdE1hbGxvYy5oPgorI2luY2x1ZGUgPHd0Zi9Ob25jb3B5YWJsZS5oPgorCitu
YW1lc3BhY2UgSlNDIHsgbmFtZXNwYWNlIEIzIHsKKworY2xhc3MgVmFsdWUgeworICAgIFdURl9N
QUtFX05PTkNPUFlBQkxFKFZhbHVlKTsKKyAgICBXVEZfTUFLRV9GQVNUX0FMTE9DQVRFRDsKK3B1
YmxpYzoKKyAgICB0eXBlZGVmIFZlY3RvcjxWYWx1ZSosIDM+IEFkamFjZW5jeUxpc3Q7CisKKyAg
ICBzdGF0aWMgY29uc3QgY2hhciogZHVtcFByZWZpeCA9ICJAIjsKKworICAgIHN0YXRpYyBib29s
IGFjY2VwdHMoT3Bjb2RlKSB7IHJldHVybiB0cnVlOyB9CisKKyAgICB2aXJ0dWFsIH5WYWx1ZSgp
OworCisgICAgdW5zaWduZWQgaW5kZXgoKSBjb25zdCB7IHJldHVybiBtX2luZGV4OyB9CisgICAg
CisgICAgLy8gTm90ZSB0aGF0IHRoZSBvcGNvZGUgaXMgaW1tdXRhYmxlLCBleGNlcHQgZm9yIHJl
cGxhY2luZyB2YWx1ZXMgd2l0aCBpZGVudGl0eS4KKyAgICBPcGNvZGUgb3Bjb2RlKCkgY29uc3Qg
eyByZXR1cm4gbV9vcGNvZGU7IH0KKworICAgIE9yaWdpbiBvcmlnaW4oKSBjb25zdCB7IHJldHVy
biBtX29yaWdpbjsgfQorICAgIAorICAgIFZhbHVlKiYgY2hpbGQodW5zaWduZWQgaW5kZXgpIHsg
cmV0dXJuIG1fY2hpbGRyZW5baW5kZXhdOyB9CisgICAgVmFsdWUqIGNoaWxkKHVuc2lnbmVkIGlu
ZGV4KSBjb25zdCB7IHJldHVybiBtX2NoaWxkcmVuW2luZGV4XTsgfQorCisgICAgLy8gVGhpcyBj
b21wdXRlcyB0aGUgdHlwZSB1c2luZyB0aGUgb3Bjb2RlLgorICAgIFR5cGUgdHlwZSgpIGNvbnN0
IHsgcmV0dXJuIG1fdHlwZTsgfQorCisgICAgQWRqYWNlbmN5TGlzdCYgY2hpbGRyZW4oKSB7IHJl
dHVybiBtX2NoaWxkcmVuOyB9IAorICAgIGNvbnN0IEFkamFjZW5jeUxpc3QmIGNoaWxkcmVuKCkg
Y29uc3QgeyByZXR1cm4gbV9jaGlsZHJlbjsgfQorCisgICAgdm9pZCByZXBsYWNlV2l0aElkZW50
aXR5KFZhbHVlKik7CisgICAgdm9pZCByZXBsYWNlV2l0aE5vcCgpOworCisgICAgdm9pZCBkdW1w
KFByaW50U3RyZWFtJikgY29uc3Q7CisgICAgdm9pZCBkZWVwRHVtcChQcmludFN0cmVhbSYpIGNv
bnN0OworCisgICAgLy8gVGhpcyBpcyBob3cgeW91IGNhc3QgVmFsdWVzLiBGb3IgZXhhbXBsZSwg
aWYgeW91IHdhbnQgdG8gZG8gc29tZXRoaW5nIHByb3ZpZGVkIHRoYXQgd2UgaGF2ZSBhCisgICAg
Ly8gQXJndW1lbnRSZWdWYWx1ZSwgeW91IGNhbiBkbzoKKyAgICAvLworICAgIC8vIGlmIChBcmd1
bWVudFJlZ1ZhbHVlKiBhcmd1bWVudFJlZyA9IHZhbHVlLT5hczxBcmd1bWVudFJlZ1ZhbHVlPigp
KSB7CisgICAgLy8gICAgIHRoaW5ncworICAgIC8vIH0KKyAgICAvLworICAgIC8vIFRoaXMgd2ls
bCByZXR1cm4gbnVsbCBpZiB0aGlzIG9wY29kZSgpICE9IEFyZ3VtZW50UmVnLiBUaGlzIHdvcmtz
IGJlY2F1c2UgdGhpcyByZXR1cm5zIG51bGxwdHIKKyAgICAvLyBpZiBUOjphY2NlcHRzKG9wY29k
ZSgpKSByZXR1cm5zIGZhbHNlLgorICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+CisgICAgVCogYXMo
KTsKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorICAgIGNvbnN0IFQqIGFzKCkgY29uc3Q7Cisg
ICAgCisgICAgYm9vbCBoYXNJbnQzMigpIGNvbnN0OworICAgIGludDMyX3QgYXNJbnQzMigpIGNv
bnN0OworICAgIAorICAgIGJvb2wgaGFzSW50NjQoKSBjb25zdDsKKyAgICBpbnQ2NF90IGFzSW50
NjQoKSBjb25zdDsKKworICAgIGJvb2wgaGFzRG91YmxlKCkgY29uc3Q7CisgICAgZG91YmxlIGFz
RG91YmxlKCkgY29uc3Q7CisKK3Byb3RlY3RlZDoKKyAgICB2aXJ0dWFsIHZvaWQgZHVtcE1ldGEo
UHJpbnRTdHJlYW0mKSBjb25zdDsKKyAgICAKK3ByaXZhdGU6CisgICAgZnJpZW5kIGNsYXNzIFBy
b2NlZHVyZTsKKyAgICAKKyAgICAvLyBJbnN0YW50aWF0ZSB2YWx1ZXMgdmlhIFByb2NlZHVyZS4K
KyAgICAvLyBUaGlzIGZvcm0gcmVxdWlyZXMgc3BlY2lmeWluZyB0aGUgdHlwZSBleHBsaWNpdGx5
OgorICAgIHRlbXBsYXRlPHR5cGVuYW1lLi4uIEFyZ3VtZW50cz4KKyAgICBleHBsaWNpdCBWYWx1
ZSh1bnNpZ25lZCBpbmRleCwgT3Bjb2RlIG9wY29kZSwgVHlwZSB0eXBlLCBPcmlnaW4gb3JpZ2lu
LCBBcmd1bWVudHMuLi4gYXJndW1lbnRzKQorICAgICAgICA6IG1faW5kZXgoaW5kZXgpCisgICAg
ICAgICwgbV9vcGNvZGUob3Bjb2RlKQorICAgICAgICAsIG1fdHlwZSh0eXBlKQorICAgICAgICAs
IG1fb3JpZ2luKG9yaWdpbikKKyAgICAgICAgLCBtX2NoaWxkcmVueyBhcmd1bWVudHMuLi4gfQor
ICAgIHsKKyAgICB9CisgICAgLy8gVGhpcyBmb3JtIGlzIGZvciB0aG9zZSBvcGNvZGVzIHRoYXQg
Y2FuIGluZmVyIHRoZWlyIHR5cGUgZnJvbSB0aGUgb3Bjb2RlIGFuZCBmaXJzdCBjaGlsZDoKKyAg
ICB0ZW1wbGF0ZTx0eXBlbmFtZS4uLiBBcmd1bWVudHM+CisgICAgZXhwbGljaXQgVmFsdWUodW5z
aWduZWQgaW5kZXgsIE9wY29kZSBvcGNvZGUsIE9yaWdpbiBvcmlnaW4sIFZhbHVlKiBmaXJzdENo
aWxkLCBBcmd1bWVudHMuLi4gYXJndW1lbnRzKQorICAgICAgICA6IG1faW5kZXgoaW5kZXgpCisg
ICAgICAgICwgbV9vcGNvZGUob3Bjb2RlKQorICAgICAgICAsIG1fdHlwZSh0eXBlRm9yKG9wY29k
ZSwgZmlyc3RDaGlsZCkpCisgICAgICAgICwgbV9vcmlnaW4ob3JpZ2luKQorICAgICAgICAsIG1f
Y2hpbGRyZW57IGZpcnN0Q2hpbGQsIGFyZ3VtZW50cy4uLiB9CisgICAgeworICAgIH0KKyAgICAv
LyBUaGlzIGZvcm0gaXMgZm9yIHRob3NlIG9wY29kZXMgdGhhdCBjYW4gaW5mZXIgdGhlaXIgdHlw
ZSBmcm9tIHRoZSBvcGNvZGUgYWxvbmUsIGFuZCB0aGF0IGRvbid0CisgICAgLy8gdGFrZSBhbnkg
YXJndW1lbnRzOgorICAgIGV4cGxpY2l0IFZhbHVlKHVuc2lnbmVkIGluZGV4LCBPcGNvZGUgb3Bj
b2RlLCBPcmlnaW4gb3JpZ2luKQorICAgICAgICA6IG1faW5kZXgoaW5kZXgpCisgICAgICAgICwg
bV9vcGNvZGUob3Bjb2RlKQorICAgICAgICAsIG1fdHlwZSh0eXBlRm9yKG9wY29kZSwgbnVsbHB0
cikpCisgICAgICAgICwgbV9vcmlnaW4ob3JpZ2luKQorICAgIHsKKyAgICB9CisKKyAgICBzdGF0
aWMgVHlwZSB0eXBlRm9yKE9wY29kZSwgVmFsdWUqIGZpcnN0Q2hpbGQpOworCisgICAgLy8gVGhp
cyBncm91cCBvZiBmaWVsZHMgaXMgYXJyYW5nZWQgdG8gZml0IGluIDY0IGJpdHMuCisgICAgdW5z
aWduZWQgbV9pbmRleDsKKyAgICBPcGNvZGUgbV9vcGNvZGU7CisgICAgVHlwZSBtX3R5cGU7Cisg
ICAgCisgICAgT3JpZ2luIG1fb3JpZ2luOworICAgIEFkamFjZW5jeUxpc3QgbV9jaGlsZHJlbjsK
KworcHVibGljOgorICAgIEJhc2ljQmxvY2sqIG93bmVyIHsgbnVsbHB0ciB9OyAvLyBjb21wdXRl
ZCBsYXppbHkuCisgICAgVmFsdWUqIHJlcGxhY2VtZW50IHsgbnVsbHB0ciB9OyAvLyB1c2VkIGZv
ciBhbmFseXNlcyBhbmQgdHJhbnNmb3JtYXRpb25zLgorICAgIHZvaWQqIG1pc2MgeyBudWxscHRy
IH07Cit9OworCitjbGFzcyBEZWVwVmFsdWVEdW1wIHsKK3B1YmxpYzoKKyAgICBEZWVwVmFsdWVE
dW1wKFZhbHVlKiB2YWx1ZSkKKyAgICAgICAgOiBtX3ZhbHVlKHZhbHVlKQorICAgIHsKKyAgICB9
CisKKyAgICB2b2lkIGR1bXAoUHJpbnRTdHJlYW0mIG91dCkgY29uc3QKKyAgICB7CisgICAgICAg
IGlmIChtX3ZhbHVlKQorICAgICAgICAgICAgbV92YWx1ZS0+ZGVlcER1bXAob3V0KTsKKyAgICAg
ICAgZWxzZQorICAgICAgICAgICAgb3V0LnByaW50KCI8bnVsbD4iKTsKKyAgICB9CisKK3ByaXZh
dGU6CisgICAgVmFsdWUqIG1fdmFsdWU7Cit9OworCitEZWVwVmFsdWVEdW1wIGRlZXBEdW1wKFZh
bHVlKiB2YWx1ZSkKK3sKKyAgICByZXR1cm4gRGVlcFZhbHVlRHVtcCh2YWx1ZSk7Cit9CisKK30g
fSAvLyBuYW1lc3BhY2UgSlNDOjpCMworCisjZW5kaWYgLy8gQjNWYWx1ZV9oCisKSW5kZXg6IFNv
dXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM1ZhbHVlSW5saW5lcy5oCj09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNv
dXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM1ZhbHVlSW5saW5lcy5oCShyZXZpc2lvbiAwKQorKysg
U291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzVmFsdWVJbmxpbmVzLmgJKHdvcmtpbmcgY29weSkK
QEAgLTAsMCArMSw4MyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNSBBcHBsZSBJbmMuIEFs
bCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3Vy
Y2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFy
ZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFy
ZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4g
dGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9u
cyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGlu
IGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5v
dGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1l
ciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92
aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9W
SURFRCBCWSBBUFBMRSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJ
RUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1Q
TElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJU
SUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQ
TEUgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5E
SVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJ
QUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVO
VCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IK
KyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5E
IE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RS
SUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVS
V0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRX
QVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLiAK
KyAqLworCisjaWZuZGVmIEIzVmFsdWVJbmxpbmVzX2gKKyNkZWZpbmUgQjNWYWx1ZUlubGluZXNf
aAorCisjaW5jbHVkZSAiQjNDb25zdDMyVmFsdWUuaCIKKyNpbmNsdWRlICJCM0NvbnN0NjRWYWx1
ZS5oIgorI2luY2x1ZGUgIkIzQ29uc3REb3VibGVWYWx1ZS5oIgorI2luY2x1ZGUgIkIzVmFsdWUu
aCIKKworbmFtZXNwYWNlIEpTQyB7IG5hbWVzcGFjZSBCMyB7CisKK3RlbXBsYXRlPHR5cGVuYW1l
IFQ+CitUKiBWYWx1ZTo6YXMoKQoreworICAgIGlmIChUOjphY2NlcHRzKG9wY29kZSgpKSkKKyAg
ICAgICAgcmV0dXJuIHN0YXRpY19jYXN0PFQqPih0aGlzKTsKKyAgICByZXR1cm4gbnVsbHB0cjsK
K30KKwordGVtcGxhdGU+dHlwZW5hbWUgVD4KK2NvbnN0IFQqIFZhbHVlOjphcygpIGNvbnN0Cit7
CisgICAgcmV0dXJuIGNvbnN0X2Nhc3Q8VmFsdWUqPih0aGlzKS0+YXM8VD4oKTsKK30KKworYm9v
bCBWYWx1ZTo6aGFzSW50MzIoKSBjb25zdAoreworICAgIHJldHVybiAhIWFzPENvbnN0MzJWYWx1
ZT4oKTsKK30KKworaW50MzJfdCBWYWx1ZTo6YXNJbnQzMigpIGNvbnN0Cit7CisgICAgcmV0dXJu
IGFzPENvbnN0MzJWYWx1ZT4oKS0+dmFsdWUoKTsKK30KKworYm9vbCBWYWx1ZTo6aGFzSW50NjQo
KSBjb25zdAoreworICAgIHJldHVybiAhIWFzPENvbnN0NjRWYWx1ZT4oKTsKK30KKworaW50NjRf
dCBWYWx1ZTo6YXNJbnQ2NCgpIGNvbnN0Cit7CisgICAgcmV0dXJuIGFzPENvbnN0NjRWYWx1ZT4o
KS0+dmFsdWUoKTsKK30KKworYm9vbCBWYWx1ZTo6aGFzRG91YmxlKCkgY29uc3QKK3sKKyAgICBy
ZXR1cm4gISFhczxDb25zdERvdWJsZVZhbHVlPigpOworfQorCitkb3VibGUgVmFsdWU6OmFzRG91
YmxlKCkgY29uc3QKK3sKKyAgICByZXR1cm4gYXM8Q29uc3REb3VibGVWYWx1ZT4oKS0+dmFsdWUo
KTsKK30KKworfSB9IC8vIG5hbWVzcGFjZSBKU0M6OkIzCisKKyNlbmRpZiAvLyBCM1ZhbHVlSW5s
aW5lc19oCisKSW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM1ZhbHVlUmVwLmNwcAo9
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNWYWx1ZVJlcC5jcHAJKHJl
dmlzaW9uIDApCisrKyBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNWYWx1ZVJlcC5jcHAJKHdv
cmtpbmcgY29weSkKQEAgLTAsMCArMSw4NiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNSBB
cHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5k
IHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2Rp
ZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRp
dGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUg
bXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qg
b2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0
cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmln
aHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dp
bmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1h
dGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZU
V0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBS
RVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8s
IFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVT
UyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZF
TlQgU0hBTEwgQVBQTEUgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5Z
IERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9S
IENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisg
KiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVT
RSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZF
UiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBD
T05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdF
TkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBP
RiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNV
Q0ggREFNQUdFLiAKKyAqLworCisjaW5jbHVkZSAiY29uZmlnLmgiCisjaW5jbHVkZSAiQjNWYWx1
ZVJlcC5oIgorCituYW1lc3BhY2UgSlNDIHsgbmFtZXNwYWNlIEIzIHsKKwordm9pZCBWYWx1ZVJl
cDo6ZHVtcChQcmludFN0cmVhbSYgb3V0KSBjb25zdAoreworICAgIG91dC5wcmludChtX2tpbmQp
OworICAgIHN3aXRjaCAobV9raW5kKSB7CisgICAgY2FzZSBOb25lOgorICAgIGNhc2UgU29tZVJl
Z2lzdGVyOgorICAgICAgICByZXR1cm47CisgICAgY2FzZSBSZWdpc3RlcjoKKyAgICAgICAgb3V0
LnByaW50KCIoIiwgcmVnKCksICIpIik7CisgICAgICAgIHJldHVybjsKKyAgICBjYXNlIFN0YWNr
OgorICAgICAgICBvdXQucHJpbnQoIigiLCBvZmZzZXRGcm9tRlAoKSwgIikiKTsKKyAgICAgICAg
cmV0dXJuOworICAgIGNhc2UgU3RhY2tBcmd1bWVudDoKKyAgICAgICAgb3V0LnByaW50KCIoIiwg
b2Zmc2V0RnJvbVNQKCksICIpIik7CisgICAgICAgIHJldHVybjsKKyAgICBjYXNlIENvbnN0YW50
OgorICAgICAgICBvdXQucHJpbnQoIigiLCB2YWx1ZSgpLCAiKSIpOworICAgICAgICByZXR1cm47
CisgICAgfQorICAgIFJFTEVBU0VfQVNTRVJUX05PVF9SRUFDSEVEKCk7Cit9CisKK30gfSAvLyBu
YW1lc3BhY2UgSlNDOjpCMworCituYW1lc3BhY2UgV1RGIHsKKwordXNpbmcgbmFtZXNwYWNlIEpT
Qzo6QjM7CisKK3ZvaWQgcHJpbnRJbnRlcm5hbChQcmludFN0cmVhbSYgb3V0LCBWYWx1ZVJlcDo6
S2luZCBraW5kKQoreworICAgIHN3aXRjaCAoa2luZCkgeworICAgIGNhc2UgVmFsdWVSZXA6OkFu
eToKKyAgICAgICAgb3V0LnByaW50KCJBbnkiKTsKKyAgICAgICAgcmV0dXJuOworICAgIGNhc2Ug
VmFsdWVSZXA6OlNvbWVSZWdpc3RlcjoKKyAgICAgICAgb3V0LnByaW50KCJTb21lUmVnaXN0ZXIi
KTsKKyAgICAgICAgcmV0dXJuOworICAgIGNhc2UgVmFsdWVSZXA6OlJlZ2lzdGVyOgorICAgICAg
ICBvdXQucHJpbnQoIlJlZ2lzdGVyIik7CisgICAgICAgIHJldHVybjsKKyAgICBjYXNlIFZhbHVl
UmVwOjpTdGFjazoKKyAgICAgICAgb3V0LnByaW50KCJTdGFjayIpOworICAgICAgICByZXR1cm47
CisgICAgY2FzZSBWYWx1ZVJlcDo6U3RhY2tBcmd1bWVudDoKKyAgICAgICAgb3V0LnByaW50KCJT
dGFja0FyZ3VtZW50Iik7CisgICAgICAgIHJldHVybjsKKyAgICBjYXNlIFZhbHVlUmVwOjpDb25z
dGFudDoKKyAgICAgICAgb3V0LnByaW50KCJDb25zdGFudCIpOworICAgICAgICByZXR1cm47Cisg
ICAgfQorICAgIFJFTEVBU0VfQVNTRVJUX05PVF9SRUFDSEVEKCk7Cit9CisKK30gLy8gbmFtZXNw
YWNlIFdURgorCkluZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNWYWx1ZVJlcC5oCj09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM1ZhbHVlUmVwLmgJKHJldmlz
aW9uIDApCisrKyBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNWYWx1ZVJlcC5oCSh3b3JraW5n
IGNvcHkpCkBAIC0wLDAgKzEsMTU2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE1IEFwcGxl
IEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNl
IGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNh
dGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9u
cworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0
IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBj
b25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1
dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAor
ICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBk
aXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJp
YWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJF
IElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1Mg
T1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhF
CisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZP
UiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBT
SEFMTCBBUFBMRSBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElS
RUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09O
U0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBS
T0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBE
QVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENB
VVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRS
QUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0Ug
T1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRI
SVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBE
QU1BR0UuIAorICovCisKKyNpZm5kZWYgQjNWYWx1ZVJlcF9oCisjZGVmaW5lIEIzVmFsdWVSZXBf
aAorCisjaW5jbHVkZSAiUmVnLmgiCisjaW5jbHVkZSA8d3RmL1ByaW50U3RyZWFtLmg+CisKK25h
bWVzcGFjZSBKU0MgeyBuYW1lc3BhY2UgQjMgeworCisvLyBXZSB1c2UgdGhpcyBjbGFzcyB0byBk
ZXNjcmliZSB2YWx1ZSByZXByZXNlbnRhdGlvbnMgYXQgc3RhY2ttYXBzLiBJdCdzIHVzZWQgYm90
aCB0byBmb3JjZSBhCisvLyByZXByZXNlbnRhdGlvbiBhbmQgdG8gZ2V0IHRoZSByZXByZXNlbnRh
dGlvbi4gV2hlbiB0aGUgQjMgY2xpZW50IGZvcmNlcyBhIHJlcHJlc2VudGF0aW9uLCB3ZSBzYXkK
Ky8vIHRoYXQgaXQncyBhbiBpbnB1dC4gV2hlbiBCMyB0ZWxscyB0aGUgY2xpZW50IHdoYXQgcmVw
cmVzZW50YXRpb24gaXQgcGlja2VkLCB3ZSBzYXkgdGhhdCBpdCdzIGFuCisvLyBvdXRwdXQuCisK
K2NsYXNzIFZhbHVlUmVwIHsKK3B1YmxpYzoKKyAgICBlbnVtIEtpbmQgeworICAgICAgICAvLyBB
cyBhbiBpbnB1dCByZXByZXNlbnRhdGlvbiwgdGhpcyBtZWFucyB0aGF0IEIzIGNhbiBwaWNrIGFu
eSByZXByZXNlbnRhdGlvbi4KKyAgICAgICAgQW55LAorCisgICAgICAgIC8vIEFzIGFuIGlucHV0
IHJlcHJlc2VudGF0aW9uLCB0aGlzIG1lYW5zIHRoYXQgQjMgc2hvdWxkIHBpY2sgc29tZSByZWdp
c3RlciwgcHJvdmlkZWQgdGhhdAorICAgICAgICAvLyBpdCdzIG5vdCBhbHNvIGEgcmVnaXN0ZXIg
dGhhdCB3YXMgY2xvYmJlcmVkLgorICAgICAgICBTb21lUmVnaXN0ZXIsCisKKyAgICAgICAgLy8g
QXMgYW4gaW5wdXQgcmVwcmVzZW50YXRpb24sIHRoaXMgZm9yY2VzIGEgcGFydGljdWxhciByZWdp
c3Rlci4gQXMgYW4gb3V0cHV0CisgICAgICAgIC8vIHJlcHJlc2VudGF0aW9uLCB0aGlzIHRlbGxz
IHVzIHdoYXQgcmVnaXN0ZXIgQjMgcGlja2VkLgorICAgICAgICBSZWdpc3RlciwKKworICAgICAg
ICAvLyBBcyBhbiBvdXRwdXQgcmVwcmVzZW50YXRpb24sIHRoaXMgdGVsbHMgdXMgd2hhdCBzdGFj
ayBzbG90IEIzIHBpY2tlZC4gSXQncyBub3QgYSB2YWxpZAorICAgICAgICAvLyBpbnB1dCByZXBy
ZXNlbnRhdGlvbi4KKyAgICAgICAgU3RhY2ssCisKKyAgICAgICAgLy8gQXMgYW4gaW5wdXQgcmVw
cmVzZW50YXRpb24sIHRoaXMgZm9yY2VzIHRoZSB2YWx1ZSB0byBlbmQgdXAgaW4gdGhlIGFyZ3Vt
ZW50IGFyZWEgYXQgc29tZQorICAgICAgICAvLyBvZmZzZXQuCisgICAgICAgIFN0YWNrQXJndW1l
bnQsCisKKyAgICAgICAgLy8gQXMgYW4gb3V0cHV0IHJlcHJlc2VudGF0aW9uLCB0aGlzIHRlbGxz
IHVzIHRoYXQgQjMgY29uc3RhbnQtZm9sZGVkIHRoZSB2YWx1ZS4KKyAgICAgICAgQ29uc3RhbnQK
KyAgICB9OworICAgIAorICAgIFZhbHVlUmVwKCkKKyAgICAgICAgOiBtX2tpbmQoQW55KQorICAg
IHsKKyAgICB9CisKKyAgICBleHBsaWNpdCBWYWx1ZVJlcChSZWcgcmVnKQorICAgICAgICA6IG1f
a2luZChSZWdpc3RlcikKKyAgICAgICAgLCBtX3ZhbHVlKHJlZy5pbmRleCgpKQorICAgIHsKKyAg
ICB9CisKKyAgICBzdGF0aWMgVmFsdWVSZXAgcmVnKFJlZyByZWcpCisgICAgeworICAgICAgICBy
ZXR1cm4gVmFsdWVSZXAocmVnKTsKKyAgICB9CisKKyAgICBzdGF0aWMgVmFsdWVSZXAgc3RhY2so
aW50cHRyX3Qgb2Zmc2V0RnJvbUZQKQorICAgIHsKKyAgICAgICAgVmFsdWVSZXAgcmVzdWx0Owor
ICAgICAgICByZXN1bHQubV9raW5kID0gU3RhY2s7CisgICAgICAgIHJlc3VsdC5tX3ZhbHVlID0g
b2Zmc2V0RnJvbUZQOworICAgIH0KKworICAgIHN0YXRpYyBWYWx1ZVJlcCBzdGFja0FyZ3VtZW50
KGludHB0cl90IG9mZnNldEZyb21TUCkKKyAgICB7CisgICAgICAgIFZhbHVlUmVwIHJlc3VsdDsK
KyAgICAgICAgcmVzdWx0Lm1fa2luZCA9IFN0YWNrQXJndW1lbnQ7CisgICAgICAgIHJlc3VsdC5t
X3ZhbHVlID0gb2Zmc2V0RnJvbVNQOworICAgIH0KKworICAgIHN0YXRpYyBWYWx1ZVJlcCBjb25z
dGFudChpbnQ2NF90IHZhbHVlKQorICAgIHsKKyAgICAgICAgVmFsdWVSZXAgcmVzdWx0OworICAg
ICAgICByZXN1bHQubV9raW5kID0gQ29uc3RhbnQ7CisgICAgICAgIHJlc3VsdC5tX3ZhbHVlID0g
dmFsdWU7CisgICAgfQorCisgICAgc3RhdGljIFZhbHVlUmVwIGNvbnN0YW50KGRvdWJsZSB2YWx1
ZSkKKyAgICB7CisgICAgICAgIHJldHVybiBWYWx1ZVJlcChiaXR3aXNlX2Nhc3Q8aW50NjRfdD4o
dmFsdWUpKTsKKyAgICB9CisKKyAgICBLaW5kIGtpbmQoKSBjb25zdCB7IHJldHVybiBtX2tpbmQ7
IH0KKworICAgIGV4cGxpY2l0IG9wZXJhdG9yIGJvb2woKSBjb25zdCB7IHJldHVybiBraW5kKCkg
IT0gQW55OyB9CisKKyAgICBSZWcgcmVnKCkgY29uc3QKKyAgICB7CisgICAgICAgIEFTU0VSVChr
aW5kKCkgPT0gUmVnaXN0ZXIpOworICAgICAgICByZXR1cm4gUmVnOjpmcm9tSW5kZXgobV92YWx1
ZSk7CisgICAgfQorCisgICAgaW50cHRyX3Qgb2Zmc2V0RnJvbUZQKCkgY29uc3QKKyAgICB7Cisg
ICAgICAgIEFTU0VSVChraW5kKCkgPT0gU3RhY2spOworICAgICAgICByZXR1cm4gc3RhdGljX2Nh
c3Q8aW50cHRyX3Q+KG1fdmFsdWUpOworICAgIH0KKworICAgIGludHB0cl90IG9mZnNldEZyb21T
UCgpIGNvbnN0CisgICAgeworICAgICAgICBBU1NFUlQoa2luZCgpID09IFN0YWNrQXJndW1lbnQp
OworICAgICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8aW50cHRyX3Q+KG1fdmFsdWUpOworICAgIH0K
KworICAgIGludDY0X3QgdmFsdWUoKSBjb25zdAorICAgIHsKKyAgICAgICAgQVNTRVJUKGtpbmQo
KSA9PSBDb25zdGFudCk7CisgICAgICAgIHJldHVybiBtX3ZhbHVlOworICAgIH0KKworICAgIGRv
dWJsZSBkb3VibGVWYWx1ZSgpIGNvbnN0CisgICAgeworICAgICAgICByZXR1cm4gYml0d2lzZV9j
YXN0PGRvdWJsZT4odmFsdWUoKSk7CisgICAgfQorCisgICAgdm9pZCBkdW1wKFByaW50U3RyZWFt
JikgY29uc3Q7CisKK3ByaXZhdGU6CisgICAgS2luZCBtX2tpbmQ7CisgICAgaW50NjRfdCBtX3Zh
bHVlOworfTsKKworfSB9IC8vIG5hbWVzcGFjZSBKU0M6OkIzCisKK25hbWVzcGFjZSBXVEYgewor
Cit2b2lkIHByaW50SW50ZXJuYWwoUHJpbnRTdHJlYW0mLCBKU0M6OkIzOjpWYWx1ZVJlcDo6S2lu
ZCk7CisKK30gLy8gbmFtZXNwYWNlIFdURgorCisjZW5kaWYgLy8gQjNWYWx1ZVJlcF9oCisKSW5k
ZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9nZW5lcmF0ZV9wYXR0ZXJuX21hdGNoZXIucmIK
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL2dlbmVyYXRlX3BhdHRlcm5f
bWF0Y2hlci5yYgkocmV2aXNpb24gMCkKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9nZW5l
cmF0ZV9wYXR0ZXJuX21hdGNoZXIucmIJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSwyOTYgQEAK
KyMhL3Vzci9iaW4vZW52IHJ1YnkKKworIyBDb3B5cmlnaHQgKEMpIDIwMTUgQXBwbGUgSW5jLiBB
bGwgcmlnaHRzIHJlc2VydmVkLgorIworIyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJj
ZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyMgbW9kaWZpY2F0aW9uLCBhcmUg
cGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisjIGFyZSBt
ZXQ6CisjIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUg
YWJvdmUgY29weXJpZ2h0CisjICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5k
IHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyMgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFy
eSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyMgICAgbm90aWNlLCB0
aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRo
ZQorIyAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0
aCB0aGUgZGlzdHJpYnV0aW9uLgorIworIyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQ
UExFIElOQy4gQU5EIElUUyBDT05UUklCVVRPUlMgYGBBUyBJUycnCisjIEFORCBBTlkgRVhQUkVT
UyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAor
IyBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBG
T1IgQSBQQVJUSUNVTEFSCisjIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNI
QUxMIEFQUExFIElOQy4gT1IgSVRTIENPTlRSSUJVVE9SUworIyBCRSBMSUFCTEUgRk9SIEFOWSBE
SVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCisjIENP
TlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NV
UkVNRU5UIE9GCisjIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBE
QVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUworIyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FV
U0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTgorIyBDT05UUkFD
VCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RI
RVJXSVNFKQorIyBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZU
V0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GCisjIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFH
RS4KKworY2xhc3MgUHJvZHVjdGlvbgorICAgIGF0dHJfcmVhZGVyIDpvcmlnaW4sIDpuYW1lLCA6
b3Bjb2RlLCA6Y2hpbGRyZW4KKworICAgIGRlZiBpbml0aWFsaXplKG9yaWdpbiwgbmFtZSwgb3Bj
b2RlLCBjaGlsZHJlbikKKyAgICAgICAgQG9yaWdpbiA9IG9yaWdpbgorICAgICAgICBAbmFtZSA9
IG5hbWUKKyAgICAgICAgQG9wY29kZSA9IG9wY29kZQorICAgICAgICBAY2hpbGRyZW4gPSBjaGls
ZHJlbgorICAgIGVuZAorCisgICAgZGVmIGhhc09wY29kZQorICAgICAgICBvcGNvZGUgIT0gbmls
CisgICAgZW5kCitlbmQKKworY2xhc3MgTWF0Y2hlcgorICAgIGF0dHJfcmVhZGVyIDpuYW1lLCA6
cHJvZHVjdGlvbnMKKworICAgIGRlZiBpbml0aWFsaXplKG5hbWUsIHByb2R1Y3Rpb25zKQorICAg
ICAgICBAbmFtZSA9IG5hbWUKKyAgICAgICAgQHByb2R1Y3Rpb25zID0gcHJvZHVjdGlvbnMKKyAg
ICBlbmQKK2VuZAorCitjbGFzcyBUb2tlbgorICAgIGF0dHJfcmVhZGVyIDpvcmlnaW4sIDpzdHJp
bmcKKyAgICAKKyAgICBkZWYgaW5pdGlhbGl6ZShvcmlnaW4sIHN0cmluZykKKyAgICAgICAgQG9y
aWdpbiA9IG9yaWdpbgorICAgICAgICBAc3RyaW5nID0gc3RyaW5nCisgICAgZW5kCisgICAgCisg
ICAgZGVmID09KG90aGVyKQorICAgICAgICBpZiBvdGhlci5pc19hPyBUb2tlbgorICAgICAgICAg
ICAgQHN0cmluZyA9PSBvdGhlci5zdHJpbmcKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgQHN0
cmluZyA9PSBvdGhlcgorICAgICAgICBlbmQKKyAgICBlbmQKKyAgICAKKyAgICBkZWYgPX4ob3Ro
ZXIpCisgICAgICAgIEBzdHJpbmcgPX4gb3RoZXIKKyAgICBlbmQKKyAgICAKKyAgICBkZWYgdG9f
cworICAgICAgICAiI3tAc3RyaW5nLmluc3BlY3R9IGF0ICN7b3JpZ2lufSIKKyAgICBlbmQKKyAg
ICAKKyAgICBkZWYgcGFyc2VFcnJvcigqY29tbWVudCkKKyAgICAgICAgaWYgY29tbWVudC5lbXB0
eT8KKyAgICAgICAgICAgIHJhaXNlICJQYXJzZSBlcnJvcjogI3t0b19zfSIKKyAgICAgICAgZWxz
ZQorICAgICAgICAgICAgcmFpc2UgIlBhcnNlIGVycm9yOiAje3RvX3N9OiAje2NvbW1lbnRbMF19
IgorICAgICAgICBlbmQKKyAgICBlbmQKK2VuZAorCitkZWYgbGV4KHN0ciwgZmlsZU5hbWUpCisg
ICAgZmlsZU5hbWUgPSBQYXRobmFtZS5uZXcoZmlsZU5hbWUpCisgICAgcmVzdWx0ID0gW10KKyAg
ICBsaW5lTnVtYmVyID0gMQorICAgIHdoaWxlIG5vdCBzdHIuZW1wdHk/CisgICAgICAgIGNhc2Ug
c3RyCisgICAgICAgIHdoZW4gL1xBXCMoW15cbl0qKS8KKyAgICAgICAgICAgICMgY29tbWVudCwg
aWdub3JlCisgICAgICAgIHdoZW4gL1xBXG4vCisgICAgICAgICAgICAjIG5ld2xpbmUsIGlnbm9y
ZQorICAgICAgICAgICAgbGluZU51bWJlciArPSAxCisgICAgICAgIHdoZW4gL1xBKFthLXpBLVow
LTlfXSspLworICAgICAgICAgICAgcmVzdWx0IDw8IFRva2VuLm5ldyhDb2RlT3JpZ2luLm5ldyhm
aWxlTmFtZSwgbGluZU51bWJlciksICQmKQorICAgICAgICB3aGVuIC9cQShbIFx0XHJdKykvCisg
ICAgICAgICAgICAjIHdoaXRlc3BhY2UsIGlnbm9yZQorICAgICAgICB3aGVuIC9cQVs9KCksXS8K
KyAgICAgICAgICAgIHJlc3VsdCA8PCBUb2tlbi5uZXcoQ29kZU9yaWdpbi5uZXcoZmlsZU5hbWUs
IGxpbmVOdW1iZXIpLCAkJikKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcmFpc2UgIkxleGVy
IGVycm9yIGF0ICN7Q29kZU9yaWdpbi5uZXcoZmlsZU5hbWUsIGxpbmVOdW1iZXIpLnRvX3N9LCB1
bmV4cGVjdGVkIHNlcXVlbmNlICN7c3RyWzAuLjIwXS5pbnNwZWN0fSIKKyAgICAgICAgZW5kCisg
ICAgICAgIHN0ciA9ICR+LnBvc3RfbWF0Y2gKKyAgICBlbmQKKyAgICByZXN1bHQKK2VuZAorCitk
ZWYgaXNLZXl3b3JkKHRva2VuKQorICAgICMgV2UgY2FuIGV4dGVuZCB0aGlzIGFzIHdlIGFkZCBt
b3JlIGtleXdvcmRzLiBMaWtlLCB3ZSBtaWdodCB3YW50ICJpbmNsdWRlIiBldmVudHVhbGx5Lgor
ICAgIHJldHVybiB0b2tlbiA9fiAvXEEoKG1hdGNoZXIpKVxaLworZW5kCisKK2RlZiBpc0lkZW50
aWZpZXIodG9rZW4pCisgICAgcmV0dXJuIHRva2VuID1+IC9cQVthLXpBLVowLTkkXShbYS16QS1a
MC05Xy5dKilcWi8gYW5kIG5vdCBpc0tleXdvcmQodG9rZW4pCitlbmQKKworY2xhc3MgUGFyc2Vy
CisgICAgZGVmIGluaXRpYWxpemUoZGF0YSwgZmlsZU5hbWUpCisgICAgICAgIEB0b2tlbnMgPSBs
ZXgoZGF0YSwgZmlsZU5hbWUpCisgICAgICAgIEBpZHggPSAwCisgICAgZW5kCisKKyAgICBkZWYg
dG9rZW4KKyAgICAgICAgQHRva2Vuc1tAaWR4XQorICAgIGVuZAorCisgICAgZGVmIGFkdmFuY2UK
KyAgICAgICAgQGlkeCArPSAxCisgICAgZW5kCisKKyAgICBkZWYgcGFyc2VFcnJvcigqY29tbWVu
dCkKKyAgICAgICAgaWYgdG9rZW4KKyAgICAgICAgICAgIHRva2VuLnBhcnNlRXJyb3IoKmNvbW1l
bnQpCisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGlmIGNvbW1lbnQuZW1wdHk/CisgICAgICAg
ICAgICAgICAgcmFpc2UgIlBhcnNlIGVycm9yIGF0IGVuZCBvZiBmaWxlIgorICAgICAgICAgICAg
ZWxzZQorICAgICAgICAgICAgICAgIHJhaXNlICJQYXJzZSBlcnJvciBhdCBlbmQgb2YgZmlsZTog
I3tjb21tZW50WzBdfSIKKyAgICAgICAgICAgIGVuZAorICAgICAgICBlbmQKKyAgICBlbmQKKwor
ICAgIGRlZiBjb25zdW1lKHN0cmluZykKKyAgICAgICAgcGFyc2VFcnJvcigiRXhwZWN0ZWQgI3tz
dHJpbmd9IiB1bmxlc3MgdG9rZW4gPT0gc3RyaW5nCisgICAgICAgIGFkdmFuY2UKKyAgICBlbmQK
KworICAgIGRlZiBjb25zdW1lSWRlbnRpZmllcgorICAgICAgICByZXN1bHQgPSB0b2tlbi5zdHJp
bmcKKyAgICAgICAgcGFyc2VFcnJvcigiRXhwZWN0ZWQgaWRlbnRpZmllciIpIHVubGVzcyBpc0lk
ZW50aWZpZXIocmVzdWx0KQorICAgICAgICBhZHZhbmNlCisgICAgICAgIHJlc3VsdAorICAgIGVu
ZAorCisgICAgZGVmIGFkZFVuaXF1ZShwcm9kdWN0aW9ucywgcHJvZHVjdGlvbikKKyAgICAgICAg
aWYgcHJvZHVjdGlvbnMuZGV0ZWN0IHsgfCBlbnRyeSB8IGVudHJ5Lm5hbWUgPT0gcHJvZHVjdGlv
bi5uYW1lIH0KKyAgICAgICAgICAgIHBhcnNlRXJyb3IoIkR1cGxpY2F0ZSBwcm9kdWN0aW9uIikK
KyAgICAgICAgZW5kCisgICAgICAgIHByb2R1Y3Rpb25zIDw8IHByb2R1Y3Rpb24KKyAgICBlbmQK
KworICAgIGRlZiBwYXJzZQorICAgICAgICBjb25zdW1lKCJtYXRjaGVyIikKKworICAgICAgICBt
YXRjaGVyTmFtZSA9IGNvbnN1bWVJZGVudGlmaWVyCisKKyAgICAgICAgcHJvZHVjdGlvbnMgPSBb
XQorCisgICAgICAgIGxvb3AgeworICAgICAgICAgICAgYnJlYWsgaWYgQGlkeCA+PSBAdG9rZW5z
Lmxlbmd0aAorCisgICAgICAgICAgICAjIFdlIG1pZ2h0IHdhbnQgdG8gc3VwcG9ydCAiaW5jbHVk
ZSIuIElmIHdlIGRpZCB0aGF0LCBpdCB3b3VsZCBnbyBoZXJlLgorICAgICAgICAgICAgYWRkVW5p
cXVlKHByb2R1Y3Rpb25zLCBwYXJzZVByb2R1Y3Rpb24pCisgICAgICAgIH0KKworICAgICAgICBN
YXRjaGVyLm5ldyhtYXRjaGVyTmFtZSwgcHJvZHVjdGlvbnMpCisgICAgZW5kCisKKyAgICBkZWYg
cGFyc2VQcm9kdWN0aW9uCisgICAgICAgIG9yaWdpbiA9IHRva2VuLm9yaWdpbgorICAgICAgICBu
YW1lID0gY29uc3VtZUlkZW50aWZpZXIKKyAgICAgICAgaWYgdG9rZW4gIT0gIj0iCisgICAgICAg
ICAgICByZXR1cm4gUHJvZHVjdGlvbi5uZXcob3JpZ2luLCBuYW1lLCBuaWwsIG5pbCkKKyAgICAg
ICAgZW5kCisgICAgICAgIAorICAgICAgICBjb25zdW1lKCI9IikKKyAgICAgICAgb3Bjb2RlID0g
Y29uc3VtZUlkZW50aWZpZXIKKyAgICAgICAgY29uc3VtZSgiKCIpCisKKyAgICAgICAgcHJvZHVj
dGlvbnMgPSBbXQorICAgICAgICBsb29wIHsKKyAgICAgICAgICAgIGJyZWFrIGlmIHRva2VuID09
ICIpIgorCisgICAgICAgICAgICBhZGRVbmlxdWUocHJvZHVjdGlvbnMsIHBhcnNlUHJvZHVjdGlv
bikKKworICAgICAgICAgICAgY29uc3VtZSgiLCIpCisgICAgICAgIH0KKworICAgICAgICAjIEFk
dmFuY2UgYWZ0ZXIgdGhlICIpIgorICAgICAgICBhZHZhbmNlCisKKyAgICAgICAgUHJvZHVjdGlv
bi5uZXcob3JpZ2luLCBuYW1lLCBvcGNvZGUsIHByb2R1Y3Rpb25zKQorICAgIGVuZAorZW5kCisK
K2ZpbGVOYW1lID0gQVJHVlswXQorCitwYXJzZXIgPSBQYXJzZXIubmV3KElPOjpyZWFkKGZpbGVO
YW1lKSwgZmlsZU5hbWUpCittYXRjaGVyID0gcGFyc2VyLnBhcnNlCisKK0ZpbGUub3BlbigiQjMi
ICsgbWF0Y2hlci5uYW1lICsgIi5oIiwgInciKSB7CisgICAgfCBvdXRwIHwKKworICAgIG91dHAu
cHV0cyAiLy8gR2VuZXJhdGVkIGJ5IGdlbmVyYXRlX3BhdHRlcm5fbWF0Y2hlci5yYiBmcm9tICN7
ZmlsZU5hbWV9IC0tIGRvIG5vdCBlZGl0ISIKKworICAgIG91dHAucHV0cyAiI2lmbmRlZiBCMyN7
bWF0Y2hlci5uYW1lfV9oIgorICAgIG91dHAucHV0cyAiI2RlZmluZSBCMyN7bWF0Y2hlci5uYW1l
fV9oIgorICAgIAorICAgIG91dHAucHV0cyAiI2luY2x1ZGUgXCJCM1ZhbHVlLmhcIiIKKyAgICAK
KyAgICBvdXRwLnB1dHMgIm5hbWVzcGFjZSBKU0MgeyBuYW1lc3BhY2UgQjMgeyIKKworICAgIG91
dHAucHV0cyAidGVtcGxhdGU8dHlwZW5hbWUgQWRhcHRvcj4iCisgICAgb3V0cC5wdXRzICJ2b2lk
IG1hdGNoKFZhbHVlKiB2YWx1ZSwgY29uc3QgQWRhcHRvciYgYWRhcHRvcikiCisgICAgb3V0cC5w
dXRzICJ7IgorCisgICAgIyBOb3RlIHRoYXQgdGhpcyBkb2VzIG5vdCBlbWl0IHByb3Blcmx5IGlu
ZGVudGVkIGNvZGUsIGJlY2F1c2UgaXQncyBhIHJlY3Vyc2l2ZSBlbWl0dGVyLiBJZiB5b3UKKyAg
ICAjIHdhbnQgdG8gc2VlIHRoZSBjb2RlIG5pY2VseSBmb3JtYXR0ZWQsIG9wZW4gaXQgaW4gYSBn
b29kIHRleHQgZWRpdG9yIGFuZCBhc2sgaXQgdG8gZm9ybWF0IGl0CisgICAgIyBmb3IgeW91Lgor
CisgICAgIyBUaGlzIGVmZmljaWVudGx5IHNlbGVjdHMgZnJvbSB0aGUgZ2l2ZW4gc2V0IG9mIHBy
b2R1Y3Rpb25zLiBJdCBhc3N1bWVzIHRoYXQgcHJvZHVjdGlvbnMKKyAgICAjIGFyZSBub3QgZHVw
bGljYXRlZC4gSXQgeWllbGRzIHRoZSBpbmRleCBvZiB0aGUgZm91bmQgcHJvZHVjdGlvbiwgYW5k
IHRoZSBjb3JvdXRpbmUgaXMKKyAgICAjIHJlc3BvbnNpYmxlIGZvciBlbWl0dGluZyBzcGVjaWZp
YyBjb2RlIGZvciB0aGF0IHByb2R1Y3Rpb24uIFRoZSBjb3JvdXRpbmUgaXMgZ2l2ZW4gbGlzdHMg
b2YKKyAgICAjIGluZGljZXMgb2YgcG9zc2libHktbWF0Y2hpbmcgcHJvZHVjdGlvbnMuCisgICAg
ZGVmIG1hdGNoUHJvZHVjdGlvbnMob3V0cCwgdmFsdWVOYW1lLCBwcm9kdWN0aW9ucykKKyAgICAg
ICAgIyBGaXJzdCwgc3BsaXQgdGhlIHByb2R1Y3Rpb25zIGxpc3QgaW50byBydW5zIG9mIHByb2R1
Y3Rpb25zIHdpdGggYW4gb3Bjb2RlIGFuZCBwcm9kdWN0aW9ucworICAgICAgICAjIHdpdGhvdXQg
b25lLgorICAgICAgICBpbmRleExpc3RzID0gW10KKyAgICAgICAgcHJvZHVjdGlvbnMuZWFjaF93
aXRoX2luZGV4IHsKKyAgICAgICAgICAgIHwgcHJvZHVjdGlvbiwgaW5kZXggfAorICAgICAgICAg
ICAgaWYgaW5kZXhMaXN0c1stMV0gYW5kIHByb2R1Y3Rpb25zW2luZGV4TGlzdHNbLTFdWzBdXS5o
YXNPcGNvZGUgPT0gcHJvZHVjdGlvbi5oYXNPcGNvZGUKKyAgICAgICAgICAgICAgICBpbmRleExp
c3RzWy0xXSA8PCBpbmRleAorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIGluZGV4
TGlzdHMgPDwgW2luZGV4XQorICAgICAgICAgICAgZW5kCisgICAgICAgIH0KKyAgICAgICAgCisg
ICAgICAgICMgTm93LCBlbWl0IHBhdHRlcm4gbWF0Y2hpbmcgY29kZS4gV2UgZG8gaXQgZGlmZmVy
ZW50bHkgZm9yIGxpc3RzIHdpdGggYW4gb3Bjb2RlIHRoYW4gZm9yCisgICAgICAgICMgbGlzdHMg
d2l0aG91dCBvbmUuCisgICAgICAgIGluZGV4TGlzdHMuZWFjaCB7CisgICAgICAgICAgICB8IGlu
ZGV4TGlzdCB8CisgICAgICAgICAgICBpZiBwcm9kdWN0aW9uc1tpbmRleExpc3RbMF1dLmhhc09w
Y29kZQorICAgICAgICAgICAgICAgICMgTm93LCB3ZSBzcGxpdCB0aGlzIGluZGV4IGxpc3QgaW50
byBncm91cHMgZm9yIGVhY2ggb3Bjb2RlLgorICAgICAgICAgICAgICAgIGdyb3VwcyA9IHt9Cisg
ICAgICAgICAgICAgICAgaW5kZXhMaXN0LmVhY2ggeworICAgICAgICAgICAgICAgICAgICB8IGlu
ZGV4IHwKKyAgICAgICAgICAgICAgICAgICAgcHJvZHVjdGlvbiA9IHByb2R1Y3Rpb25zW2luZGV4
XQorICAgICAgICAgICAgICAgICAgICBpZiBncm91cHNbcHJvZHVjdGlvbi5vcGNvZGVdCisgICAg
ICAgICAgICAgICAgICAgICAgICBncm91cHNbcHJvZHVjdGlvbi5vcGNvZGVdIDw8IGluZGV4Cisg
ICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgIGdyb3Vwc1tw
cm9kdWN0aW9uLm9wY29kZV0gPSBbaW5kZXhdCisgICAgICAgICAgICAgICAgICAgIGVuZAorICAg
ICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICMgRW1pdCBhIHN3aXRjaCBzdGF0ZW1l
bnQuCisgICAgICAgICAgICAgICAgb3V0cC5wdXRzICJzd2l0Y2ggKCN7dmFsdWVOYW1lfS0+b3Bj
b2RlKCkpIHsiCisgICAgICAgICAgICAgICAgZ3JvdXBzLmVhY2hfcGFpciB7CisgICAgICAgICAg
ICAgICAgICAgIHwgb3Bjb2RlLCBzdWJJbmRleExpc3QgfAorICAgICAgICAgICAgICAgICAgICBv
dXRwLnB1dHMgImNhc2UgI3tvcGNvZGV9OiIKKyAgICAgICAgICAgICAgICAgICAgeWllbGQgc3Vi
SW5kZXhMaXN0CisgICAgICAgICAgICAgICAgICAgIG91dHAucHV0cyAiYnJlYWs7IgorICAgICAg
ICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBvdXRwLnB1dHMgImRlZmF1bHQ6IgorICAgICAg
ICAgICAgICAgIG91dHAucHV0cyAiYnJlYWs7IgorICAgICAgICAgICAgICAgIG91dHAucHV0cyAi
fSIKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB5aWVsZCBpbmRleExpc3QKKyAg
ICAgICAgICAgIGVuZAorICAgICAgICB9CisgICAgZW5kCisKKyAgICBkZWYgY29uc2lkZXJQcm9k
dWN0aW9ucyhvdXRwLCB2YWx1ZU5hbWUsIHByb2R1Y3Rpb25zKQorICAgICAgICAjIFVnaCwgdGhp
cyBpcyBoYXJkLgorICAgIGVuZAorCisgICAgY29uc2lkZXJQcm9kdWN0aW9ucygidmFsdWUiLCBw
cm9kdWN0aW9ucykKKyAgICAKKyAgICBvdXRwLnB1dHMgIiAgICBSRUxFQVNFX0FTU0VSVF9OT1Rf
UkVBQ0hFRCgpOyIKKyAgICBvdXRwLnB1dHMgIn0iCisgICAgCisgICAgb3V0cC5wdXRzICJ9IH0g
Ly8gbmFtZXNwYWNlIEpTQzo6QjMiCisKKyAgICBvdXRwLnB1dHMgIiNlbmRpZiAvLyBCMyN7bWF0
Y2hlci5uYW1lfV9oIgorfQorCisK
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>263436</attachid>
            <date>2015-10-18 20:16:48 -0700</date>
            <delta_ts>2015-10-19 17:01:06 -0700</delta_ts>
            <desc>and now, with a complete pattern match generator</desc>
            <filename>blah.patch</filename>
            <type>text/plain</type>
            <size>178941</size>
            <attacher name="Filip Pizlo">fpizlo</attacher>
            
              <data encoding="base64">SW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9hc3NlbWJsZXIvRHluYW1pY0FkZHJlc3MuY3Bw
Cj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9hc3NlbWJsZXIvRHluYW1pY0Fk
ZHJlc3MuY3BwCShyZXZpc2lvbiAwKQorKysgU291cmNlL0phdmFTY3JpcHRDb3JlL2Fzc2VtYmxl
ci9EeW5hbWljQWRkcmVzcy5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSw1NiBAQAorLyoK
KyAqIENvcHlyaWdodCAoQykgMjAxNSBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisg
KgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywg
d2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQg
dGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3Ry
aWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAor
ICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBk
aXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVw
cm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNv
bmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3Vt
ZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmli
dXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIGBg
QVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVE
SU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1F
UkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFS
RSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUgorICogQ09OVFJJ
QlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQ
RUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5H
LCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RT
IE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lO
RVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9G
IExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9S
VAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkg
V0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQg
T0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLiAKKyAqLworCisjaW5jbHVkZSAiY29u
ZmlnLmgiCisjaW5jbHVkZSAiRHluYW1pY0FkZHJlc3MuaCIKKworI2luY2x1ZGUgIkdQUkluZm8u
aCIKKworbmFtZXNwYWNlIEpTQyB7CisKK3ZvaWQgRHluYW1pY0FkZHJlc3M6OmR1bXAoUHJpbnRT
dHJlYW0mIG91dCkgY29uc3QKK3sKKyNpZiBFTkFCTEUoQVNTRU1CTEVSKQorICAgIHN3aXRjaCAo
bV9raW5kKSB7CisgICAgY2FzZSBBZGRyZXNzOgorICAgIGNhc2UgRXh0ZW5kZWRBZGRyZXNzOgor
ICAgICAgICBvdXQucHJpbnQobV9vZmZzZXQsICIoIiwgbV9iYXNlLCAiKSIpOworICAgICAgICBy
ZXR1cm47CisgICAgY2FzZSBCYXNlSW5kZXg6CisgICAgICAgIG91dC5wcmludChtX29mZnNldCwg
IigiLCBtX2Jhc2UsICIsICIsIG1faW5kZXgsICIsICIsIDEgPDwgbV9zY2FsZSwgIikiKTsKKyAg
ICAgICAgcmV0dXJuOworICAgIGNhc2UgQWJzb2x1dGVBZGRyZXNzOgorICAgICAgICBvdXQucHJp
bnQobV9vZmZzZXQpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgUkVMRUFTRV9BU1NF
UlRfTk9UX1JFQUNIRUQoKTsKKyNlbHNlIC8vIEVOQUJMRShBU1NFTUJMRVIpCisgICAgb3V0LnBy
aW50KCIwIik7CisjZW5kaWYgLy8gRU5BQkxFKEFTU0VNQkxFUikKK30KKworfSAvLyBuYW1lc3Bh
Y2UgSlNDCisKSW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9hc3NlbWJsZXIvRHluYW1pY0Fk
ZHJlc3MuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYXNzZW1ibGVyL0R5
bmFtaWNBZGRyZXNzLmgJKHJldmlzaW9uIDApCisrKyBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYXNz
ZW1ibGVyL0R5bmFtaWNBZGRyZXNzLmgJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSwxNzggQEAK
Ky8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTUgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVk
LgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9y
bXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3Zp
ZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVk
aXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmln
aHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dp
bmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0
IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBv
ZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBk
b2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlz
dHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5D
LiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElO
Q0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBP
RiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9T
RSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IKKyAqIENP
TlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFM
LCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xV
RElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBH
T09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBC
VVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisg
KiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9S
IFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4g
QU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJ
U0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKworI2lmbmRlZiBE
eW5hbWljQWRkcmVzc19oCisjZGVmaW5lIER5bmFtaWNBZGRyZXNzX2gKKworI2luY2x1ZGUgIkFi
c3RyYWN0TWFjcm9Bc3NlbWJsZXIuaCIKKyNpbmNsdWRlIDx3dGYvUHJpbnRTdHJlYW0uaD4KKwor
bmFtZXNwYWNlIEpTQyB7CisKK2NsYXNzIER5bmFtaWNBZGRyZXNzIHsKK3B1YmxpYzoKKyAgICBl
bnVtIEtpbmQgeworICAgICAgICBBZGRyZXNzLAorICAgICAgICBFeHRlbmRlZEFkZHJlc3MsCisg
ICAgICAgIEJhc2VJbmRleCwKKyAgICAgICAgQWJzb2x1dGVBZGRyZXNzCisgICAgfTsKKworI2lm
IEVOQUJMRShBU1NFTUJMRVIpCisKKyAgICBEeW5hbWljQWRkcmVzcygpCisgICAgICAgIDogbV9r
aW5kKEFic29sdXRlQWRkcmVzcykKKyAgICAgICAgLCBtX29mZnNldCgwKQorICAgICAgICAsIG1f
YmFzZShBYnN0cmFjdE1hY3JvQXNzZW1ibGVyOjpmaXJzdFJlZ2lzdGVyKCkpCisgICAgICAgICwg
bV9pbmRleChBYnN0cmFjdE1hY3JvQXNzZW1ibGVyOjpmaXJzdFJlZ2lzdGVyKCkpCisgICAgICAg
ICwgbV9zY2FsZShBYnN0cmFjdE1hY3JvQXNzZW1ibGVyOjpUaW1lc09uZSkKKyAgICB7CisgICAg
fQorCisgICAgZXhwbGljaXQgRHluYW1pY0FkZHJlc3MoQWJzdHJhY3RNYWNyb0Fzc2VtYmxlcjo6
QWRkcmVzcyBhZGRyZXNzKQorICAgICAgICA6IG1fa2luZChBZGRyZXNzKQorICAgICAgICAsIG1f
b2Zmc2V0KGFkZHJlc3Mub2Zmc2V0KQorICAgICAgICAsIG1fYmFzZShhZGRyZXNzLmJhc2UpCisg
ICAgICAgICwgbV9pbmRleChBYnN0cmFjdE1hY3JvQXNzZW1ibGVyOjpmaXJzdFJlZ2lzdGVyKCkp
CisgICAgICAgICwgbV9zY2FsZShBYnN0cmFjdE1hY3JvQXNzZW1ibGVyOjpUaW1lc09uZSkKKyAg
ICB7CisgICAgfQorCisgICAgZXhwbGljaXQgRHluYW1pY0FkZHJlc3MoQWJzdHJhY3RNYWNyb0Fz
c2VtYmxlcjo6RXh0ZW5kZWRBZGRyZXNzIGFkZHJlc3MpCisgICAgICAgIDogbV9raW5kKEV4dGVu
ZGVkQWRkcmVzcykKKyAgICAgICAgLCBtX29mZnNldChhZGRyZXNzLm9mZnNldCkKKyAgICAgICAg
LCBtX2Jhc2UoYWRkcmVzcy5iYXNlKQorICAgICAgICAsIG1faW5kZXgoQWJzdHJhY3RNYWNyb0Fz
c2VtYmxlcjo6Zmlyc3RSZWdpc3RlcigpKQorICAgICAgICAsIG1fc2NhbGUoQWJzdHJhY3RNYWNy
b0Fzc2VtYmxlcjo6VGltZXNPbmUpCisgICAgeworICAgIH0KKworICAgIGV4cGxpY2l0IER5bmFt
aWNBZGRyZXNzKEFic3RyYWN0TWFjcm9Bc3NlbWJsZXI6OkJhc2VJbmRleCBhZGRyZXNzKQorICAg
ICAgICA6IG1fa2luZChCYXNlSW5kZXgpCisgICAgICAgICwgbV9vZmZzZXQoYWRkcmVzcy5vZmZz
ZXQpCisgICAgICAgICwgbV9iYXNlKGFkZHJlc3MuYmFzZSkKKyAgICAgICAgLCBtX2luZGV4KGFk
ZHJlc3MuaW5kZXgpCisgICAgICAgICwgbV9zY2FsZShhZGRyZXNzLnNjYWxlKQorICAgIHsKKyAg
ICB9CisKKyAgICBleHBsaWNpdCBEeW5hbWljQWRkcmVzcyhBYnN0cmFjdE1hY3JvQXNzZW1ibGVy
OjpBYnNvbHV0ZUFkZHJlc3MgYWRkcmVzcykKKyAgICAgICAgOiBtX2tpbmQoQWJzb2x1dGVBZGRy
ZXNzKQorICAgICAgICAsIG1fb2Zmc2V0KGJpdHdpc2VfY2FzdDxpbnRwdHJfdD4oYWRkcmVzcy5t
X3B0cikpCisgICAgICAgICwgbV9iYXNlKEFic3RyYWN0TWFjcm9Bc3NlbWJsZXI6OmZpcnN0UmVn
aXN0ZXIoKSkKKyAgICAgICAgLCBtX2luZGV4KEFic3RyYWN0TWFjcm9Bc3NlbWJsZXI6OmZpcnN0
UmVnaXN0ZXIoKSkKKyAgICAgICAgLCBtX3NjYWxlKEFic3RyYWN0TWFjcm9Bc3NlbWJsZXI6OlRp
bWVzT25lKQorICAgIHsKKyAgICB9CisKKyAgICBib29sIG9wZXJhdG9yPT0oY29uc3QgRHluYW1p
Y0FkZHJlc3MmIG90aGVyKSBjb25zdAorICAgIHsKKyAgICAgICAgcmV0dXJuIG1fa2luZCA9PSBv
dGhlci5tX2tpbmQKKyAgICAgICAgICAgICYmIG1fb2Zmc2V0ID09IG90aGVyLm1fb2Zmc2V0Cisg
ICAgICAgICAgICAmJiBtX2Jhc2UgPT0gb3RoZXIubV9iYXNlCisgICAgICAgICAgICAmJiBtX2lu
ZGV4ID09IG90aGVyLm1faW5kZXgKKyAgICAgICAgICAgICYmIG1fc2NhbGUgPT0gb3RoZXIubV9z
Y2FsZTsKKyAgICB9CisKKyAgICBib29sIG9wZXJhdG9yIT0oY29uc3QgRHluYW1pY0FkZHJlc3Mm
IG90aGVyKSBjb25zdAorICAgIHsKKyAgICAgICAgcmV0dXJuICEoKnRoaXMgPT0gb3RoZXIpOwor
ICAgIH0KKworICAgIGV4cGxpY2l0IG9wZXJhdG9yIGJvb2woKSBjb25zdAorICAgIHsKKyAgICAg
ICAgcmV0dXJuICp0aGlzICE9IER5bmFtaWNBZGRyZXNzKCk7CisgICAgfQorCisgICAgS2luZCBr
aW5kKCkgY29uc3QgeyByZXR1cm4gbV9raW5kOyB9CisKKyAgICBBYnN0cmFjdE1hY3JvQXNzZW1i
bGVyOjpBZGRyZXNzIGFzQWRkcmVzcygpIGNvbnN0CisgICAgeworICAgICAgICBBU1NFUlQobV9r
aW5kID09IEFkZHJlc3MpOworICAgICAgICByZXR1cm4gQWJzdHJhY3RNYWNyb0Fzc2VtYmxlcjo6
QWRkcmVzcyhtX2Jhc2UsIHN0YXRpY19jYXN0PGludDMyX3Q+KG1fb2Zmc2V0KSk7CisgICAgfQor
CisgICAgQWJzdHJhY3RNYWNyb0Fzc2VtYmxlcjo6RXh0ZW5kZWRBZGRyZXNzIGFzRXh0ZW5kZWRB
ZGRyZXNzKCkgY29uc3QKKyAgICB7CisgICAgICAgIEFTU0VSVChtX2tpbmQgPT0gRXh0ZW5kZWRB
ZGRyZXNzKTsKKyAgICAgICAgcmV0dXJuIEFic3RyYWN0TWFjcm9Bc3NlbWJsZXI6OkV4dGVuZGVk
QWRkcmVzcyhtX2Jhc2UsIG1fb2Zmc2V0KTsKKyAgICB9CisKKyAgICBBYnN0cmFjdE1hY3JvQXNz
ZW1ibGVyOjpCYXNlSW5kZXggYXNCYXNlSW5kZXgoKSBjb25zdAorICAgIHsKKyAgICAgICAgQVNT
RVJUKG1fa2luZCA9PSBCYXNlSW5kZXgpOworICAgICAgICByZXR1cm4gQWJzdHJhY3RNYWNyb0Fz
c2VtYmxlcjo6QmFzZUluZGV4KG1fYmFzZSwgbV9pbmRleCwgbV9zY2FsZSwgbV9vZmZzZXQpOwor
ICAgIH0KKworICAgIEFic3RyYWN0TWFjcm9Bc3NlbWJsZXI6OkFic29sdXRlQWRkcmVzcyBhc0Fi
c29sdXRlQWRkcmVzcygpIGNvbnN0CisgICAgeworICAgICAgICBBU1NFUlQobV9raW5kID09IEFi
c29sdXRlQWRkcmVzcyk7CisgICAgICAgIHJldHVybiBBYnN0cmFjdE1hY3JvQXNzZW1ibGVyOjpB
YnNvbHV0ZUFkZHJlc3MoYml0d2lzZV9jYXN0PGNvbnN0IHZvaWQqPihtX29mZnNldCkpOworICAg
IH0KKworICAgIHZvaWQgZHVtcChQcmludFN0cmVhbSYpIGNvbnN0OworCitwcml2YXRlOgorICAg
IEtpbmQgbV9raW5kOworICAgIGludHB0cl90IG1fb2Zmc2V0OworICAgIEFic3RyYWN0TWFjcm9B
c3NlbWJsZXI6OlJlZ2lzdGVySUQgbV9iYXNlOworICAgIEFic3RyYWN0TWFjcm9Bc3NlbWJsZXI6
OlJlZ2lzdGVySUQgbV9pbmRleDsKKyAgICBBYnN0cmFjdE1hY3JvQXNzZW1ibGVyOjpTY2FsZSBt
X3NjYWxlOworCisjZWxzZSAvLyBFTkFCTEUoQVNTRU1CTEVSKQorCitwdWJsaWM6CisKKyAgICBE
eW5hbWljQWRkcmVzcygpIHsgfQorCisgICAgZXhwbGljaXQgb3BlcmF0b3IgYm9vbCgpIGNvbnN0
IHsgcmV0dXJuIGZhbHNlOyB9CisgICAgS2luZCBraW5kKCkgY29uc3QgeyByZXR1cm4gQWJzb2x1
dGVBZGRyZXNzOyB9CisKKyAgICB2b2lkIGR1bXAoUHJpbnRTdHJlYW0mKSBjb25zdDsKKyAgICAK
KyNlbmRpZiAvLyBFTkFCTEUoQVNTRU1CTEVSKQorCitwdWJsaWM6CisKKyAgICBib29sIGlzT25l
T2YoKSBjb25zdAorICAgIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHRl
bXBsYXRlPHR5cGVuYW1lLi4uIEFyZ3VtZW50cz4KKyAgICBib29sIGlzT25lT2YoS2luZCBraW5k
LCBBcmd1bWVudHMuLi4gYXJndW1lbnRzKSBjb25zdAorICAgIHsKKyAgICAgICAgaWYgKGtpbmQo
KSA9PSBraW5kKQorICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIHJldHVybiBpc09u
ZU9mKGFyZ3VtZW50cy4uLik7CisgICAgfQorfTsKKworfSAvLyBuYW1lc3BhY2UgSlNDCisKKyNl
bmRpZiAvLyBFTkFCTEUoQVNTRU1CTEVSKQorCisjZW5kaWYgLy8gRHluYW1pY0FkZHJlc3NfaAor
CkluZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYXNzZW1ibGVyL01hY3JvQXNzZW1ibGVyLmgK
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRDb3JlL2Fzc2VtYmxlci9NYWNyb0Fzc2Vt
Ymxlci5oCShyZXZpc2lvbiAxOTEyMzkpCisrKyBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYXNzZW1i
bGVyL01hY3JvQXNzZW1ibGVyLmgJKHdvcmtpbmcgY29weSkKQEAgLTEyMSwxMCArMTIxLDIzIEBA
IHB1YmxpYzoKICAgICB1c2luZyBNYWNyb0Fzc2VtYmxlckJhc2U6OmJyYW5jaFB0cjsKICNlbmRp
ZgogICAgIHVzaW5nIE1hY3JvQXNzZW1ibGVyQmFzZTo6YnJhbmNoU3ViMzI7CisgICAgdXNpbmcg
TWFjcm9Bc3NlbWJsZXJCYXNlOjpicmFuY2g4OworICAgIHVzaW5nIE1hY3JvQXNzZW1ibGVyQmFz
ZTo6bG9hZDMyOworICAgIHVzaW5nIE1hY3JvQXNzZW1ibGVyQmFzZTo6bG9hZDg7CisgICAgdXNp
bmcgTWFjcm9Bc3NlbWJsZXJCYXNlOjpsb2FkOFNpZ25FeHRlbmRUbzMyOworICAgIHVzaW5nIE1h
Y3JvQXNzZW1ibGVyQmFzZTo6bG9hZDE2OworICAgIHVzaW5nIE1hY3JvQXNzZW1ibGVyQmFzZTo6
bG9hZDE2U2lnbkV4dGVuZFRvMzI7CisgICAgdXNpbmcgTWFjcm9Bc3NlbWJsZXJCYXNlOjpsb2Fk
RG91YmxlOworICAgIHVzaW5nIE1hY3JvQXNzZW1ibGVyQmFzZTo6bG9hZEZsb2F0OwogICAgIHVz
aW5nIE1hY3JvQXNzZW1ibGVyQmFzZTo6bHNoaWZ0MzI7CisgICAgdXNpbmcgTWFjcm9Bc3NlbWJs
ZXJCYXNlOjptdWwzMjsKICAgICB1c2luZyBNYWNyb0Fzc2VtYmxlckJhc2U6Om9yMzI7CiAgICAg
dXNpbmcgTWFjcm9Bc3NlbWJsZXJCYXNlOjpyc2hpZnQzMjsKICAgICB1c2luZyBNYWNyb0Fzc2Vt
YmxlckJhc2U6OnN0b3JlMzI7CisgICAgdXNpbmcgTWFjcm9Bc3NlbWJsZXJCYXNlOjpzdG9yZTg7
CisgICAgdXNpbmcgTWFjcm9Bc3NlbWJsZXJCYXNlOjpzdG9yZTE2OworICAgIHVzaW5nIE1hY3Jv
QXNzZW1ibGVyQmFzZTo6c3RvcmVEb3VibGU7CisgICAgdXNpbmcgTWFjcm9Bc3NlbWJsZXJCYXNl
OjpzdG9yZUZsb2F0OwogICAgIHVzaW5nIE1hY3JvQXNzZW1ibGVyQmFzZTo6c3ViMzI7CiAgICAg
dXNpbmcgTWFjcm9Bc3NlbWJsZXJCYXNlOjp1cnNoaWZ0MzI7CiAgICAgdXNpbmcgTWFjcm9Bc3Nl
bWJsZXJCYXNlOjp4b3IzMjsKQEAgLTE1ODQsNiArMTU5Nyw3MDAgQEAgcHVibGljOgogICAgICAg
ICB1cnNoaWZ0MzIoc3JjLCB0cnVzdGVkSW1tMzJGb3JTaGlmdChhbW91bnQpLCBkZXN0KTsKICAg
ICB9CiAKKyAgICBib29sIHRyeUFkZDMyKFJlZ2lzdGVySUQgc3JjLCBEeW5hbWljQWRkcmVzcyBh
ZGRyZXNzKQorICAgIHsKKyAgICAgICAgc3dpdGNoIChhZGRyZXNzLmtpbmQoKSkgeworICAgICAg
ICBjYXNlIER5bmFtaWNBZGRyZXNzOjpBZGRyZXNzOgorICAgICAgICAgICAgYWRkMzIoc3JjLCBh
ZGRyZXNzLmFzQWRkcmVzcygpKTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICBk
ZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgfQorICAg
IHZvaWQgYWRkMzIoUmVnaXN0ZXJJRCBzcmMsIER5bmFtaWNBZGRyZXNzIGFkZHJlc3MpCisgICAg
eworICAgICAgICBSRUxFQVNFX0FTU0VSVCh0cnlBZGQzMihzcmMsIGFkZHJlc3MpKTsKKyAgICB9
CisKKyAgICAvLyBJdCdzIG5vdCBjbGVhciBpZiB0aGUgc2VtYW50aWNzIGhlcmUgc2hvdWxkIGJl
IHRvIHJldHVybiB0cnVlIGZvciBhbnkgYWRkcmVzcyBleHByZXNzaW9uCisgICAgLy8gZm9yIHdo
aWNoIHdlIGtub3cgaG93IHRvIGVtaXQgY29kZSwgb3IgdG8gb25seSBlbWl0IHRydWUgd2hlbiB3
ZSBrbm93IGhvdyB0byBlbWl0IGl0CisgICAgLy8gZWZmaWNpZW50bHkuIEknbSBjdXJyZW50bHkg
Z29pbmcgd2l0aCBzdXBwb3J0aW5nIGFsbCBvZiB0aGUgZXhwcmVzc2lvbnMgZm9yIHdoaWNoIHdl
IGtub3cKKyAgICAvLyBob3cgdG8gZW1pdCBjb2RlIGF0IGFsbCwgYW5kIEknbSBsZWF2aW5nIGl0
IHRvIGNsaWVudHMgdG8gZGVhbCB3aXRoIHRoZSBlZmZpY2llbmN5IHBhcnQuCisgICAgCisgICAg
Ym9vbCB0cnlBZGQzMihUcnVzdGVkSW1tMzIgaW1tLCBEeW5hbWljQWRkcmVzcyBhZGRyZXNzKQor
ICAgIHsKKyAgICAgICAgc3dpdGNoIChhZGRyZXNzLmtpbmQoKSkgeworICAgICAgICBjYXNlIER5
bmFtaWNBZGRyZXNzOjpBZGRyZXNzOgorICAgICAgICAgICAgYWRkMzIoaW1tLCBhZGRyZXNzLmFz
QWRkcmVzcygpKTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICBjYXNlIER5bmFt
aWNBZGRyZXNzOjpBYnNvbHV0ZUFkZHJlc3M6CisgICAgICAgICAgICBhZGQzMihpbW0sIGFkZHJl
c3MuYXNBYnNvbHV0ZUFkZHJlc3MoKSk7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAg
ICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgIH0K
KyAgICB2b2lkIGFkZDMyKFRydXN0ZWRJbW0zMiBpbW0sIER5bmFtaWNBZGRyZXNzIGFkZHJlc3Mp
CisgICAgeworICAgICAgICBSRUxFQVNFX0FTU0VSVCh0cnlBZGQzMihpbW0sIGFkZHJlc3MpKTsK
KyAgICB9CisKKyAgICBib29sIHRyeUFkZDMyKER5bmFtaWNBZGRyZXNzIGFkZHJlc3MsIFJlZ2lz
dGVySUQgZGVzdCkKKyAgICB7CisgICAgICAgIHN3aXRjaCAoYWRkcmVzcy5raW5kKCkpIHsKKyAg
ICAgICAgY2FzZSBEeW5hbWljQWRkcmVzczo6QWRkcmVzczoKKyAgICAgICAgICAgIGFkZDMyKGFk
ZHJlc3MuYXNBZGRyZXNzKCksIGRlc3QpOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAg
ICAgIGNhc2UgRHluYW1pY0FkZHJlc3M6OkFic29sdXRlQWRkcmVzczoKKyAgICAgICAgICAgIGFk
ZDMyKGFkZHJlc3MuYXNBYnNvbHV0ZUFkZHJlc3MoKSwgZGVzdCk7CisgICAgICAgICAgICByZXR1
cm4gdHJ1ZTsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHJ1biBmYWxzZTsKKyAg
ICAgICAgfQorICAgIH0KKyAgICB2b2lkIGFkZDMyKER5bmFtaWNBZGRyZXNzIGFkZHJlc3MsIFJl
Z2lzdGVySUQgZGVzdCkKKyAgICB7CisgICAgICAgIFJFTEVBU0VfQVNTRVJUKHRyeUFkZDMyKGFk
ZHJlc3MsIGRlc3QpKTsKKyAgICB9CisKKyAgICBib29sIHRyeUFuZDMyKFJlZ2lzdGVySUQgc3Jj
LCBEeW5hbWljQWRkcmVzcyBhZGRyZXNzKQorICAgIHsKKyAgICAgICAgc3dpdGNoIChhZGRyZXNz
LmtpbmQoKSkgeworICAgICAgICBjYXNlIER5bmFtaWNBZGRyZXNzOjpBZGRyZXNzOgorICAgICAg
ICAgICAgYW5kMzIoc3JjLCBhZGRyZXNzLmFzQWRkcmVzcygpKTsKKyAgICAgICAgICAgIHJldHVy
biB0cnVlOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAg
ICAgICB9CisgICAgfQorICAgIHZvaWQgYW5kMzIoUmVnaXN0ZXJJRCBzcmMsIER5bmFtaWNBZGRy
ZXNzIGFkZHJlc3MpCisgICAgeworICAgICAgICBSRUxFQVNFX0FTU0VSVCh0cnlBbmQzMihzcmMs
IGFkZHJlc3MpKTsKKyAgICB9CisKKyAgICBib29sIHRyeUFuZDMyKFRydXN0ZWRJbW0zMiBpbW0s
IER5bmFtaWNBZGRyZXNzIGFkZHJlc3MpCisgICAgeworICAgICAgICBzd2l0Y2ggKGFkZHJlc3Mu
a2luZCgpKSB7CisgICAgICAgIGNhc2UgRHluYW1pY0FkZHJlc3M6OkFkZHJlc3M6CisgICAgICAg
ICAgICBhbmQzMihpbW0sIGFkZHJlc3MuYXNBZGRyZXNzKCkpOworICAgICAgICAgICAgcmV0dXJu
IHRydWU7CisgICAgICAgIGNhc2UgRHluYW1pY0FkZHJlc3M6OkFic29sdXRlQWRkcmVzczoKKyAg
ICAgICAgICAgIGFuZDMyKGltbSwgYWRkcmVzcy5hc0Fic29sdXRlQWRkcmVzcygpKTsKKyAgICAg
ICAgICAgIHJldHVybiB0cnVlOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJu
IGZhbHNlOworICAgICAgICB9CisgICAgfQorICAgIHZvaWQgYW5kMzIoVHJ1c3RlZEltbTMyIGlt
bSwgRHluYW1pY0FkZHJlc3MgYWRkcmVzcykKKyAgICB7CisgICAgICAgIFJFTEVBU0VfQVNTRVJU
KHRyeUFuZDMyKGltbSwgYWRkcmVzcykpOworICAgIH0KKworICAgIGJvb2wgdHJ5QW5kMzIoRHlu
YW1pY0FkZHJlc3MgYWRkcmVzcywgUmVnaXN0ZXJJRCBkZXN0KQorICAgIHsKKyAgICAgICAgc3dp
dGNoIChhZGRyZXNzLmtpbmQoKSkgeworICAgICAgICBjYXNlIER5bmFtaWNBZGRyZXNzOjpBZGRy
ZXNzOgorICAgICAgICAgICAgYW5kMzIoYWRkcmVzcy5hc0FkZHJlc3MoKSwgZGVzdCk7CisgICAg
ICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVy
biBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KKyAgICB2b2lkIGFuZDMyKER5bmFtaWNBZGRyZXNz
IGFkZHJlc3MsIFJlZ2lzdGVySUQgZGVzdCkKKyAgICB7CisgICAgICAgIFJFTEVBU0VfQVNTRVJU
KHRyeUFkZDMyKGFkZHJlc3MsIGRlc3QpKTsKKyAgICB9CisKKyAgICBib29sIHRyeU11bDMyKER5
bmFtaWNBZGRyZXNzIGFkZHJlc3MsIFJlZ2lzdGVySUQgZGVzdCkKKyAgICB7CisgICAgICAgIHN3
aXRjaCAoYWRkcmVzcy5raW5kKCkpIHsKKyAgICAgICAgY2FzZSBEeW5hbWljQWRkcmVzczo6QWRk
cmVzczoKKyAgICAgICAgICAgIG11bDMyKGFkZHJlc3MuYXNBZGRyZXNzKCksIGRlc3QpOworICAg
ICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1
cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisgICAgdm9pZCBtdWwzMihEeW5hbWljQWRkcmVz
cyBhZGRyZXNzLCBSZWdpc3RlcklEIGRlc3QpCisgICAgeworICAgICAgICBSRUxFQVNFX0FTU0VS
VCh0cnlNdWwzMihhZGRyZXNzLCBkZXN0KSk7CisgICAgfQorCisgICAgYm9vbCB0cnlOZWczMihE
eW5hbWljQWRkcmVzcyBhZGRyZXNzKQorICAgIHsKKyAgICAgICAgc3dpdGNoIChhZGRyZXNzLmtp
bmQoKSkgeworICAgICAgICBjYXNlIER5bmFtaWNBZGRyZXNzOjpBZGRyZXNzOgorICAgICAgICAg
ICAgbmVnMzIoYWRkcmVzcy5hc0FkZHJlc3MoKSk7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsK
KyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQor
ICAgIH0KKyAgICB2b2lkIG5lZzMyKER5bmFtaWNBZGRyZXNzIGFkZHJlc3MpCisgICAgeworICAg
ICAgICBSRUxFQVNFX0FTU0VSVCh0cnlOZWczMihhZGRyZXNzKSk7CisgICAgfQorCisgICAgLy8g
RklYTUU6IExvdHMgb2YgbWlzc2luZyBjYXNlcyBoZXJlIQorCisgICAgYm9vbCB0cnlMb2FkMzIo
RHluYW1pY0FkZHJlc3MgYWRkcmVzcywgUmVnaXN0ZXJJRCBkZXN0KQorICAgIHsKKyAgICAgICAg
c3dpdGNoIChhZGRyZXNzLmtpbmQoKSkgeworICAgICAgICBjYXNlIER5bmFtaWNBZGRyZXNzOjpB
ZGRyZXNzOgorICAgICAgICAgICAgbG9hZDMyKGFkZHJlc3MuYXNBZGRyZXNzKCksIGRlc3QpOwor
ICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIGNhc2UgRHluYW1pY0FkZHJlc3M6OkJh
c2VJbmRleDoKKyAgICAgICAgICAgIGxvYWQzMihhZGRyZXNzLmFzQmFzZUluZGV4KCksIGRlc3Qp
OworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIGNhc2UgRHluYW1pY0FkZHJlc3M6
OkFic29sdXRlQWRkcmVzczoKKyAgICAgICAgICAgIGxvYWQzMihhZGRyZXNzLmFzQWJzb2x1dGVB
ZGRyZXNzKCkubV9wdHIsIGRlc3QpOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAg
IGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICB9Cisg
ICAgdm9pZCBsb2FkMzIoRHluYW1pY0FkZHJlc3MgYWRkcmVzcywgUmVnaXN0ZXJJRCBkZXN0KQor
ICAgIHsKKyAgICAgICAgUkVMRUFTRV9BU1NFUlQodHJ5TG9hZDMyKGFkZHJlc3MsIGRlc3QpKTsK
KyAgICB9CisKKyAgICBib29sIHRyeUxvYWQ4KER5bmFtaWNBZGRyZXNzIGFkZHJlc3MsIFJlZ2lz
dGVySUQgZGVzdCkKKyAgICB7CisgICAgICAgIHN3aXRjaCAoYWRkcmVzcy5raW5kKCkpIHsKKyAg
ICAgICAgY2FzZSBEeW5hbWljQWRkcmVzczo6QWRkcmVzczoKKyAgICAgICAgICAgIGxvYWQ4KGFk
ZHJlc3MuYXNBZGRyZXNzKCksIGRlc3QpOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAg
ICAgIGNhc2UgRHluYW1pY0FkZHJlc3M6OkJhc2VJbmRleDoKKyAgICAgICAgICAgIGxvYWQ4KGFk
ZHJlc3MuYXNCYXNlSW5kZXgoKSwgZGVzdCk7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAg
ICAgICAgY2FzZSBEeW5hbWljQWRkcmVzczo6QWJzb2x1dGVBZGRyZXNzOgorICAgICAgICAgICAg
bG9hZDgoYWRkcmVzcy5hc0Fic29sdXRlQWRkcmVzcygpLm1fcHRyLCBkZXN0KTsKKyAgICAgICAg
ICAgIHJldHVybiB0cnVlOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuIGZh
bHNlOworICAgICAgICB9CisgICAgfQorICAgIHZvaWQgbG9hZDgoRHluYW1pY0FkZHJlc3MgYWRk
cmVzcywgUmVnaXN0ZXJJRCBkZXN0KQorICAgIHsKKyAgICAgICAgUkVMRUFTRV9BU1NFUlQodHJ5
TG9hZDgoYWRkcmVzcywgZGVzdCkpOworICAgIH0KKworICAgIGJvb2wgdHJ5TG9hZDhTaWduRXh0
ZW5kVG8zMihEeW5hbWljQWRkcmVzcyBhZGRyZXNzLCBSZWdpc3RlcklEIGRlc3QpCisgICAgewor
ICAgICAgICBzd2l0Y2ggKGFkZHJlc3Mua2luZCgpKSB7CisgICAgICAgIGNhc2UgRHluYW1pY0Fk
ZHJlc3M6OkFkZHJlc3M6CisgICAgICAgICAgICBsb2FkOFNpZ25FeHRlbmRUbzMyKGFkZHJlc3Mu
YXNBZGRyZXNzKCksIGRlc3QpOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIGNh
c2UgRHluYW1pY0FkZHJlc3M6OkJhc2VJbmRleDoKKyAgICAgICAgICAgIGxvYWQ4U2lnbkV4dGVu
ZFRvMzIoYWRkcmVzcy5hc0Jhc2VJbmRleCgpLCBkZXN0KTsKKyAgICAgICAgICAgIHJldHVybiB0
cnVlOworICAgICAgICBjYXNlIER5bmFtaWNBZGRyZXNzOjpBYnNvbHV0ZUFkZHJlc3M6CisgICAg
ICAgICAgICBsb2FkOFNpZ25FeHRlbmRUbzMyKGFkZHJlc3MuYXNBYnNvbHV0ZUFkZHJlc3MoKS5t
X3B0ciwgZGVzdCk7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgZGVmYXVsdDoK
KyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KKyAgICB2b2lkIGxv
YWQ4U2lnbkV4dGVuZFRvMzIoRHluYW1pY0FkZHJlc3MgYWRkcmVzcywgUmVnaXN0ZXJJRCBkZXN0
KQorICAgIHsKKyAgICAgICAgUkVMRUFTRV9BU1NFUlQodHJ5TG9hZDhTaWduRXh0ZW5kVG8zMihh
ZGRyZXNzLCBkZXN0KSk7CisgICAgfQorCisgICAgYm9vbCB0cnlMb2FkMTYoRHluYW1pY0FkZHJl
c3MgYWRkcmVzcywgUmVnaXN0ZXJJRCBkZXN0KQorICAgIHsKKyAgICAgICAgc3dpdGNoIChhZGRy
ZXNzLmtpbmQoKSkgeworICAgICAgICBjYXNlIER5bmFtaWNBZGRyZXNzOjpBZGRyZXNzOgorICAg
ICAgICAgICAgbG9hZDE2KGFkZHJlc3MuYXNBZGRyZXNzKCksIGRlc3QpOworICAgICAgICAgICAg
cmV0dXJuIHRydWU7CisgICAgICAgIGNhc2UgRHluYW1pY0FkZHJlc3M6OkJhc2VJbmRleDoKKyAg
ICAgICAgICAgIGxvYWQxNihhZGRyZXNzLmFzQmFzZUluZGV4KCksIGRlc3QpOworICAgICAgICAg
ICAgcmV0dXJuIHRydWU7CisgICAgICAgIGNhc2UgRHluYW1pY0FkZHJlc3M6OkFic29sdXRlQWRk
cmVzczoKKyAgICAgICAgICAgIGxvYWQxNihhZGRyZXNzLmFzQWJzb2x1dGVBZGRyZXNzKCkubV9w
dHIsIGRlc3QpOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIGRlZmF1bHQ6Cisg
ICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisgICAgdm9pZCBsb2Fk
MTYoRHluYW1pY0FkZHJlc3MgYWRkcmVzcywgUmVnaXN0ZXJJRCBkZXN0KQorICAgIHsKKyAgICAg
ICAgUkVMRUFTRV9BU1NFUlQodHJ5TG9hZDE2KGFkZHJlc3MsIGRlc3QpKTsKKyAgICB9CisKKyAg
ICBib29sIHRyeUxvYWQxNlNpZ25FeHRlbmRUbzMyKER5bmFtaWNBZGRyZXNzIGFkZHJlc3MsIFJl
Z2lzdGVySUQgZGVzdCkKKyAgICB7CisgICAgICAgIHN3aXRjaCAoYWRkcmVzcy5raW5kKCkpIHsK
KyAgICAgICAgY2FzZSBEeW5hbWljQWRkcmVzczo6QWRkcmVzczoKKyAgICAgICAgICAgIGxvYWQx
NlNpZ25FeHRlbmRUbzMyKGFkZHJlc3MuYXNBZGRyZXNzKCksIGRlc3QpOworICAgICAgICAgICAg
cmV0dXJuIHRydWU7CisgICAgICAgIGNhc2UgRHluYW1pY0FkZHJlc3M6OkJhc2VJbmRleDoKKyAg
ICAgICAgICAgIGxvYWQxNlNpZ25FeHRlbmRUbzMyKGFkZHJlc3MuYXNCYXNlSW5kZXgoKSwgZGVz
dCk7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgY2FzZSBEeW5hbWljQWRkcmVz
czo6QWJzb2x1dGVBZGRyZXNzOgorICAgICAgICAgICAgbG9hZDE2U2lnbkV4dGVuZFRvMzIoYWRk
cmVzcy5hc0Fic29sdXRlQWRkcmVzcygpLm1fcHRyLCBkZXN0KTsKKyAgICAgICAgICAgIHJldHVy
biB0cnVlOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAg
ICAgICB9CisgICAgfQorICAgIHZvaWQgbG9hZDE2U2lnbkV4dGVuZFRvMzIoRHluYW1pY0FkZHJl
c3MgYWRkcmVzcywgUmVnaXN0ZXJJRCBkZXN0KQorICAgIHsKKyAgICAgICAgUkVMRUFTRV9BU1NF
UlQodHJ5TG9hZDE2U2lnbkV4dGVuZFRvMzIoYWRkcmVzcywgZGVzdCkpOworICAgIH0KKworICAg
IGJvb2wgdHJ5U3RvcmUzMihSZWdpc3RlcklEIHNyYywgRHluYW1pY0FkZHJlc3MgYWRkcmVzcykK
KyAgICB7CisgICAgICAgIHN3aXRjaCAoYWRkcmVzcy5raW5kKCkpIHsKKyAgICAgICAgY2FzZSBE
eW5hbWljQWRkcmVzczo6QWRkcmVzczoKKyAgICAgICAgICAgIHN0b3JlMzIoc3JjLCBhZGRyZXNz
LmFzQWRkcmVzcygpKTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICBjYXNlIER5
bmFtaWNBZGRyZXNzOjpCYXNlSW5kZXg6CisgICAgICAgICAgICBzdG9yZTMyKHNyYywgYWRkcmVz
cy5hc0Jhc2VJbmRleCgpKTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICBjYXNl
IER5bmFtaWNBZGRyZXNzOjpBYnNvbHV0ZUFkZHJlc3M6CisgICAgICAgICAgICBzdG9yZTMyKHNy
YywgYWRkcmVzcy5hc0Fic29sdXRlQWRkcmVzcygpLm1fcHRyKTsKKyAgICAgICAgICAgIHJldHVy
biB0cnVlOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAg
ICAgICB9CisgICAgfQorICAgIHZvaWQgc3RvcmUzMihSZWdpc3RlcklEIHNyYywgRHluYW1pY0Fk
ZHJlc3MgYWRkcmVzcykKKyAgICB7CisgICAgICAgIFJFTEVBU0VfQVNTRVJUKHRyeVN0b3JlMzIo
c3JjLCBhZGRyZXNzKSk7CisgICAgfQorCisgICAgYm9vbCB0cnlTdG9yZTMyKFRydXN0ZWRJbW0z
MiBzcmMsIER5bmFtaWNBZGRyZXNzIGFkZHJlc3MpCisgICAgeworICAgICAgICBzd2l0Y2ggKGFk
ZHJlc3Mua2luZCgpKSB7CisgICAgICAgIGNhc2UgRHluYW1pY0FkZHJlc3M6OkFkZHJlc3M6Cisg
ICAgICAgICAgICBzdG9yZTMyKHNyYywgYWRkcmVzcy5hc0FkZHJlc3MoKSk7CisgICAgICAgICAg
ICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgY2FzZSBEeW5hbWljQWRkcmVzczo6QmFzZUluZGV4Ogor
ICAgICAgICAgICAgc3RvcmUzMihzcmMsIGFkZHJlc3MuYXNCYXNlSW5kZXgoKSk7CisgICAgICAg
ICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgY2FzZSBEeW5hbWljQWRkcmVzczo6QWJzb2x1dGVB
ZGRyZXNzOgorICAgICAgICAgICAgc3RvcmUzMihzcmMsIGFkZHJlc3MuYXNBYnNvbHV0ZUFkZHJl
c3MoKS5tX3B0cik7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgZGVmYXVsdDoK
KyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KKyAgICB2b2lkIHN0
b3JlMzIoVHJ1c3RlZEltbTMyIHNyYywgRHluYW1pY0FkZHJlc3MgYWRkcmVzcykKKyAgICB7Cisg
ICAgICAgIFJFTEVBU0VfQVNTRVJUKHRyeVN0b3JlMzIoc3JjLCBhZGRyZXNzKSk7CisgICAgfQor
CisgICAgYm9vbCB0cnlTdG9yZTgoUmVnaXN0ZXJJRCBzcmMsIER5bmFtaWNBZGRyZXNzIGFkZHJl
c3MpCisgICAgeworICAgICAgICBzd2l0Y2ggKGFkZHJlc3Mua2luZCgpKSB7CisgICAgICAgIGNh
c2UgRHluYW1pY0FkZHJlc3M6OkFkZHJlc3M6CisgICAgICAgICAgICBzdG9yZTgoc3JjLCBhZGRy
ZXNzLmFzQWRkcmVzcygpKTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICBjYXNl
IER5bmFtaWNBZGRyZXNzOjpCYXNlSW5kZXg6CisgICAgICAgICAgICBzdG9yZTgoc3JjLCBhZGRy
ZXNzLmFzQmFzZUluZGV4KCkpOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIGNh
c2UgRHluYW1pY0FkZHJlc3M6OkFic29sdXRlQWRkcmVzczoKKyAgICAgICAgICAgIHN0b3JlOChz
cmMsIGFkZHJlc3MuYXNBYnNvbHV0ZUFkZHJlc3MoKS5tX3B0cik7CisgICAgICAgICAgICByZXR1
cm4gdHJ1ZTsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAg
ICAgICAgfQorICAgIH0KKyAgICB2b2lkIHN0b3JlOChSZWdpc3RlcklEIHNyYywgRHluYW1pY0Fk
ZHJlc3MgYWRkcmVzcykKKyAgICB7CisgICAgICAgIFJFTEVBU0VfQVNTRVJUKHRyeVN0b3JlOChz
cmMsIGFkZHJlc3MpKTsKKyAgICB9CisKKyAgICBib29sIHRyeVN0b3JlOChUcnVzdGVkSW1tMzIg
c3JjLCBEeW5hbWljQWRkcmVzcyBhZGRyZXNzKQorICAgIHsKKyAgICAgICAgc3dpdGNoIChhZGRy
ZXNzLmtpbmQoKSkgeworICAgICAgICBjYXNlIER5bmFtaWNBZGRyZXNzOjpBZGRyZXNzOgorICAg
ICAgICAgICAgc3RvcmU4KHNyYywgYWRkcmVzcy5hc0FkZHJlc3MoKSk7CisgICAgICAgICAgICBy
ZXR1cm4gdHJ1ZTsKKyAgICAgICAgY2FzZSBEeW5hbWljQWRkcmVzczo6QmFzZUluZGV4OgorICAg
ICAgICAgICAgc3RvcmU4KHNyYywgYWRkcmVzcy5hc0Jhc2VJbmRleCgpKTsKKyAgICAgICAgICAg
IHJldHVybiB0cnVlOworICAgICAgICBjYXNlIER5bmFtaWNBZGRyZXNzOjpBYnNvbHV0ZUFkZHJl
c3M6CisgICAgICAgICAgICBzdG9yZTgoc3JjLCBhZGRyZXNzLmFzQWJzb2x1dGVBZGRyZXNzKCku
bV9wdHIpOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIGRlZmF1bHQ6CisgICAg
ICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisgICAgdm9pZCBzdG9yZTgo
VHJ1c3RlZEltbTMyIHNyYywgRHluYW1pY0FkZHJlc3MgYWRkcmVzcykKKyAgICB7CisgICAgICAg
IFJFTEVBU0VfQVNTRVJUKHRyeVN0b3JlOChzcmMsIGFkZHJlc3MpKTsKKyAgICB9CisKKyAgICBi
b29sIHRyeVN0b3JlMTYoUmVnaXN0ZXJJRCBzcmMsIER5bmFtaWNBZGRyZXNzIGFkZHJlc3MpCisg
ICAgeworICAgICAgICBzd2l0Y2ggKGFkZHJlc3Mua2luZCgpKSB7CisgICAgICAgIGNhc2UgRHlu
YW1pY0FkZHJlc3M6OkFkZHJlc3M6CisgICAgICAgICAgICBzdG9yZTE2KHNyYywgYWRkcmVzcy5h
c0FkZHJlc3MoKSk7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgY2FzZSBEeW5h
bWljQWRkcmVzczo6QmFzZUluZGV4OgorICAgICAgICAgICAgc3RvcmUxNihzcmMsIGFkZHJlc3Mu
YXNCYXNlSW5kZXgoKSk7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgY2FzZSBE
eW5hbWljQWRkcmVzczo6QWJzb2x1dGVBZGRyZXNzOgorICAgICAgICAgICAgc3RvcmUxNihzcmMs
IGFkZHJlc3MuYXNBYnNvbHV0ZUFkZHJlc3MoKS5tX3B0cik7CisgICAgICAgICAgICByZXR1cm4g
dHJ1ZTsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAg
ICAgfQorICAgIH0KKyAgICB2b2lkIHN0b3JlMTYoUmVnaXN0ZXJJRCBzcmMsIER5bmFtaWNBZGRy
ZXNzIGFkZHJlc3MpCisgICAgeworICAgICAgICBSRUxFQVNFX0FTU0VSVCh0cnlTdG9yZTE2KHNy
YywgYWRkcmVzcykpOworICAgIH0KKworICAgIGJvb2wgdHJ5U3RvcmUxNihUcnVzdGVkSW1tMzIg
c3JjLCBEeW5hbWljQWRkcmVzcyBhZGRyZXNzKQorICAgIHsKKyAgICAgICAgc3dpdGNoIChhZGRy
ZXNzLmtpbmQoKSkgeworICAgICAgICBjYXNlIER5bmFtaWNBZGRyZXNzOjpBZGRyZXNzOgorICAg
ICAgICAgICAgc3RvcmUxNihzcmMsIGFkZHJlc3MuYXNBZGRyZXNzKCkpOworICAgICAgICAgICAg
cmV0dXJuIHRydWU7CisgICAgICAgIGNhc2UgRHluYW1pY0FkZHJlc3M6OkJhc2VJbmRleDoKKyAg
ICAgICAgICAgIHN0b3JlMTYoc3JjLCBhZGRyZXNzLmFzQmFzZUluZGV4KCkpOworICAgICAgICAg
ICAgcmV0dXJuIHRydWU7CisgICAgICAgIGNhc2UgRHluYW1pY0FkZHJlc3M6OkFic29sdXRlQWRk
cmVzczoKKyAgICAgICAgICAgIHN0b3JlMTYoc3JjLCBhZGRyZXNzLmFzQWJzb2x1dGVBZGRyZXNz
KCkubV9wdHIpOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIGRlZmF1bHQ6Cisg
ICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisgICAgdm9pZCBzdG9y
ZTE2KFRydXN0ZWRJbW0zMiBzcmMsIER5bmFtaWNBZGRyZXNzIGFkZHJlc3MpCisgICAgeworICAg
ICAgICBSRUxFQVNFX0FTU0VSVCh0cnlTdG9yZTE2KHNyYywgYWRkcmVzcykpOworICAgIH0KKwor
ICAgIGJvb2wgdHJ5TG9hZERvdWJsZShEeW5hbWljQWRkcmVzcyBhZGRyZXNzLCBGUFJlZ2lzdGVy
SUQgZGVzdCkKKyAgICB7CisgICAgICAgIHN3aXRjaCAoYWRkcmVzcy5raW5kKCkpIHsKKyAgICAg
ICAgY2FzZSBEeW5hbWljQWRkcmVzczo6QWRkcmVzczoKKyAgICAgICAgICAgIGxvYWREb3VibGUo
YWRkcmVzcy5hc0FkZHJlc3MoKSwgZGVzdCk7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAg
ICAgICAgY2FzZSBEeW5hbWljQWRkcmVzczo6QmFzZUluZGV4OgorICAgICAgICAgICAgbG9hZERv
dWJsZShhZGRyZXNzLmFzQmFzZUluZGV4KCksIGRlc3QpOworICAgICAgICAgICAgcmV0dXJuIHRy
dWU7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAg
IH0KKyAgICB9CisgICAgdm9pZCBsb2FkRG91YmxlKER5bmFtaWNBZGRyZXNzIGFkZHJlc3MsIEZQ
UmVnaXN0ZXJJRCBkZXN0KQorICAgIHsKKyAgICAgICAgUkVMRUFTRV9BU1NFUlQodHJ5TG9hZERv
dWJsZShhZGRyZXNzLCBkZXN0KSk7CisgICAgfQorCisgICAgYm9vbCB0cnlMb2FkRmxvYXQoRHlu
YW1pY0FkZHJlc3MgYWRkcmVzcywgRlBSZWdpc3RlcklEIGRlc3QpCisgICAgeworICAgICAgICBz
d2l0Y2ggKGFkZHJlc3Mua2luZCgpKSB7CisgICAgICAgIGNhc2UgRHluYW1pY0FkZHJlc3M6OkFk
ZHJlc3M6CisgICAgICAgICAgICBsb2FkRmxvYXQoYWRkcmVzcy5hc0FkZHJlc3MoKSwgZGVzdCk7
CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgY2FzZSBEeW5hbWljQWRkcmVzczo6
QmFzZUluZGV4OgorICAgICAgICAgICAgbG9hZEZsb2F0KGFkZHJlc3MuYXNCYXNlSW5kZXgoKSwg
ZGVzdCk7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAg
ICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KKyAgICB2b2lkIGxvYWRGbG9h
dChEeW5hbWljQWRkcmVzcyBhZGRyZXNzLCBGUFJlZ2lzdGVySUQgZGVzdCkKKyAgICB7CisgICAg
ICAgIFJFTEVBU0VfQVNTRVJUKHRyeUxvYWRGbG9hdChhZGRyZXNzLCBkZXN0KSk7CisgICAgfQor
CisgICAgYm9vbCB0cnlTdG9yZURvdWJsZShGUFJlZ2lzdGVySUQgc3JjLCBEeW5hbWljQWRkcmVz
cyBhZGRyZXNzKQorICAgIHsKKyAgICAgICAgc3dpdGNoIChhZGRyZXNzLmtpbmQoKSkgeworICAg
ICAgICBjYXNlIER5bmFtaWNBZGRyZXNzOjpBZGRyZXNzOgorICAgICAgICAgICAgc3RvcmVEb3Vi
bGUoc3JjLCBhZGRyZXNzLmFzQWRkcmVzcygpKTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOwor
ICAgICAgICBjYXNlIER5bmFtaWNBZGRyZXNzOjpCYXNlSW5kZXg6CisgICAgICAgICAgICBzdG9y
ZURvdWJsZShzcmMsIGFkZHJlc3MuYXNCYXNlSW5kZXgoKSk7CisgICAgICAgICAgICByZXR1cm4g
dHJ1ZTsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAg
ICAgfQorICAgIH0KKyAgICB2b2lkIHN0b3JlRG91YmxlKEZQUmVnaXN0ZXJJRCBzcmMsIER5bmFt
aWNBZGRyZXNzIGFkZHJlc3MpCisgICAgeworICAgICAgICBSRUxFQVNFX0FTU0VSVCh0cnlTdG9y
ZURvdWJsZShzcmMsIGFkZHJlc3MpKTsKKyAgICB9CisKKyAgICBib29sIHRyeVN0b3JlRmxvYXQo
RlBSZWdpc3RlcklEIHNyYywgRHluYW1pY0FkZHJlc3MgYWRkcmVzcykKKyAgICB7CisgICAgICAg
IHN3aXRjaCAoYWRkcmVzcy5raW5kKCkpIHsKKyAgICAgICAgY2FzZSBEeW5hbWljQWRkcmVzczo6
QWRkcmVzczoKKyAgICAgICAgICAgIHN0b3JlRmxvYXQoc3JjLCBhZGRyZXNzLmFzQWRkcmVzcygp
KTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICBjYXNlIER5bmFtaWNBZGRyZXNz
OjpCYXNlSW5kZXg6CisgICAgICAgICAgICBzdG9yZUZsb2F0KHNyYywgYWRkcmVzcy5hc0Jhc2VJ
bmRleCgpKTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICBkZWZhdWx0OgorICAg
ICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgfQorICAgIHZvaWQgc3RvcmVG
bG9hdChGUFJlZ2lzdGVySUQgc3JjLCBEeW5hbWljQWRkcmVzcyBhZGRyZXNzKQorICAgIHsKKyAg
ICAgICAgUkVMRUFTRV9BU1NFUlQodHJ5U3RvcmVGbG9hdChzcmMsIGFkZHJlc3MpKTsKKyAgICB9
CisKKyAgICBKdW1wIHRyeUJyYW5jaDgoUmVsYXRpb25hbENvbmRpdGlvbiBjb25kLCBEeW5hbWlj
QWRkcmVzcyBsZWZ0LCBUcnVzdGVkSW1tMzIgcmlnaHQpCisgICAgeworICAgICAgICBzd2l0Y2gg
KGxlZnQua2luZCgpKSB7CisgICAgICAgIGNhc2UgRHluYW1pY0FkZHJlc3M6OkFkZHJlc3M6Cisg
ICAgICAgICAgICByZXR1cm4gYnJhbmNoOChjb25kLCBsZWZ0LmFzQWRkcmVzcygpLCByaWdodCk7
CisgICAgICAgIGNhc2UgRHluYW1pY0FkZHJlc3M6OkJhc2VJbmRleDoKKyAgICAgICAgICAgIHJl
dHVybiBicmFuY2g4KGNvbmQsIGxlZnQuYXNCYXNlSW5kZXgoKSwgcmlnaHQpOworICAgICAgICBk
ZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuIEp1bXAoKTsKKyAgICAgICAgfQorICAgIH0KKyAg
ICB2b2lkIGJyYW5jaDgoUmVsYXRpb25hbENvbmRpdGlvbiBjb25kLCBEeW5hbWljQWRkcmVzcyBs
ZWZ0LCBUcnVzdGVkSW1tMzIgcmlnaHQpCisgICAgeworICAgICAgICBKdW1wIHJlc3VsdCA9IHRy
eUJyYW5jaDgoY29uZCwgbGVmdCwgcmlnaHQpOworICAgICAgICBSRUxFQVNFX0FTU0VSVChyZXN1
bHQuaXNTZXQoKSk7CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorCisgICAgSnVtcCB0
cnlCcmFuY2gzMihSZWxhdGlvbmFsQ29uZGl0aW9uIGNvbmQsIFJlZ2lzdGVySUQgbGVmdCwgRHlu
YW1pY0FkZHJlc3MgcmlnaHQpCisgICAgeworICAgICAgICBzd2l0Y2ggKHJpZ2h0LmtpbmQoKSkg
eworICAgICAgICBjYXNlIER5bmFtaWNBZGRyZXNzOjpBZGRyZXNzOgorICAgICAgICAgICAgcmV0
dXJuIGJyYW5jaDMyKGNvbmQsIGxlZnQsIHJpZ2h0LmFzQWRkcmVzcygpKTsKKyAgICAgICAgZGVm
YXVsdDoKKyAgICAgICAgICAgIHJldHVybiBKdW1wKCk7CisgICAgICAgIH0KKyAgICB9CisgICAg
SnVtcCBicmFuY2gzMihSZWxhdGlvbmFsQ29uZGl0aW9uIGNvbmQsIFRydXN0ZWRJbW0zMiBsZWZ0
LCBEeW5hbWljQWRkcmVzcyByaWdodCkKKyAgICB7CisgICAgICAgIEp1bXAgcmVzdWx0ID0gdHJ5
QnJhbmNoMzIoY29uZCwgbGVmdCwgcmlnaHQpOworICAgICAgICBSRUxFQVNFX0FTU0VSVChyZXN1
bHQuaXNTZXQoKSk7CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorCisgICAgSnVtcCB0
cnlCcmFuY2gzMihSZWxhdGlvbmFsQ29uZGl0aW9uIGNvbmQsIER5bmFtaWNBZGRyZXNzIGxlZnQs
IFRydXN0ZWRJbW0zMiByaWdodCkKKyAgICB7CisgICAgICAgIHN3aXRjaCAobGVmdC5raW5kKCkp
IHsKKyAgICAgICAgY2FzZSBEeW5hbWljQWRkcmVzczo6QWRkcmVzczoKKyAgICAgICAgICAgIHJl
dHVybiBicmFuY2gzMihjb25kLCBsZWZ0LmFzQWRkcmVzcygpLCByaWdodCk7CisgICAgICAgIGNh
c2UgRHluYW1pY0FkZHJlc3M6OkJhc2VJbmRleDoKKyAgICAgICAgICAgIHJldHVybiBicmFuY2gz
Mihjb25kLCBsZWZ0LmFzQmFzZUluZGV4KCksIHJpZ2h0KTsKKyAgICAgICAgZGVmYXVsdDoKKyAg
ICAgICAgICAgIHJldHVybiBKdW1wKCk7CisgICAgICAgIH0KKyAgICB9CisgICAgSnVtcCBicmFu
Y2gzMihSZWxhdGlvbmFsQ29uZGl0aW9uIGNvbmQsIER5bmFtaWNBZGRyZXNzIGxlZnQsIFRydXN0
ZWRJbW0zMiByaWdodCkKKyAgICB7CisgICAgICAgIEp1bXAgcmVzdWx0ID0gdHJ5QnJhbmNoMzIo
Y29uZCwgbGVmdCwgcmlnaHQpOworICAgICAgICBSRUxFQVNFX0FTU0VSVChyZXN1bHQuaXNTZXQo
KSk7CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorICAgIAorICAgIEp1bXAgdHJ5QnJh
bmNoMzIoUmVsYXRpb25hbENvbmRpdGlvbiBjb25kLCBEeW5hbWljQWRkcmVzcyBsZWZ0LCBSZWdp
c3RlcklEIHJpZ2h0KQorICAgIHsKKyAgICAgICAgc3dpdGNoIChsZWZ0LmtpbmQoKSkgeworICAg
ICAgICBjYXNlIER5bmFtaWNBZGRyZXNzOjpBZGRyZXNzOgorICAgICAgICAgICAgcmV0dXJuIGJy
YW5jaDMyKGNvbmQsIGxlZnQuYXNBZGRyZXNzKCksIHJpZ2h0KTsKKyAgICAgICAgZGVmYXVsdDoK
KyAgICAgICAgICAgIHJldHVybiBKdW1wKCk7CisgICAgICAgIH0KKyAgICB9CisgICAgSnVtcCBi
cmFuY2gzMihSZWxhdGlvbmFsQ29uZGl0aW9uIGNvbmQsIER5bmFtaWNBZGRyZXNzIGxlZnQsIFJl
Z2lzdGVySUQgcmlnaHQpCisgICAgeworICAgICAgICBKdW1wIHJlc3VsdCA9IHRyeUJyYW5jaDMy
KGNvbmQsIGxlZnQsIHJpZ2h0KTsKKyAgICAgICAgUkVMRUFTRV9BU1NFUlQocmVzdWx0LmlzU2V0
KCkpOworICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKworICAgIEp1bXAgdHJ5QnJhbmNo
VGVzdDMyKFJlc3VsdENvbmRpdGlvbiBjb25kLCBEeW5hbWljQWRkcmVzcyBsZWZ0LCBUcnVzdGVk
SW1tMzIgcmlnaHQpCisgICAgeworICAgICAgICBzd2l0Y2ggKGxlZnQua2luZCgpKSB7CisgICAg
ICAgIGNhc2UgRHluYW1pY0FkZHJlc3M6OkFkZHJlc3M6CisgICAgICAgICAgICByZXR1cm4gYnJh
bmNoMzIoY29uZCwgbGVmdC5hc0FkZHJlc3MoKSwgcmlnaHQpOworICAgICAgICBjYXNlIER5bmFt
aWNBZGRyZXNzOjpCYXNlSW5kZXg6CisgICAgICAgICAgICByZXR1cm4gYnJhbmNoMzIoY29uZCwg
bGVmdC5hc0Jhc2VJbmRleCgpLCByaWdodCk7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAg
ICByZXR1cm4gSnVtcCgpOworICAgICAgICB9CisgICAgfQorICAgIEp1bXAgYnJhbmNoVGVzdDMy
KFJlc3VsdENvbmRpdGlvbiBjb25kLCBEeW5hbWljQWRkcmVzcyBsZWZ0LCBUcnVzdGVkSW1tMzIg
cmlnaHQpCisgICAgeworICAgICAgICBKdW1wIHJlc3VsdCA9IHRyeUJyYW5jaFRlc3QzMihjb25k
LCBsZWZ0LCByaWdodCk7CisgICAgICAgIFJFTEVBU0VfQVNTRVJUKHJlc3VsdC5pc1NldCgpKTsK
KyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisgICAgCisgICAgSnVtcCB0cnlCcmFuY2hU
ZXN0OChSZXN1bHRDb25kaXRpb24gY29uZCwgRHluYW1pY0FkZHJlc3MgbGVmdCwgVHJ1c3RlZElt
bTMyIHJpZ2h0KQorICAgIHsKKyAgICAgICAgc3dpdGNoIChsZWZ0LmtpbmQoKSkgeworICAgICAg
ICBjYXNlIER5bmFtaWNBZGRyZXNzOjpBZGRyZXNzOgorICAgICAgICAgICAgcmV0dXJuIGJyYW5j
aDgoY29uZCwgbGVmdC5hc0FkZHJlc3MoKSwgcmlnaHQpOworICAgICAgICBjYXNlIER5bmFtaWNB
ZGRyZXNzOjpCYXNlSW5kZXg6CisgICAgICAgICAgICByZXR1cm4gYnJhbmNoOChjb25kLCBsZWZ0
LmFzQmFzZUluZGV4KCksIHJpZ2h0KTsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJl
dHVybiBKdW1wKCk7CisgICAgICAgIH0KKyAgICB9CisgICAgSnVtcCBicmFuY2hUZXN0OChSZXN1
bHRDb25kaXRpb24gY29uZCwgRHluYW1pY0FkZHJlc3MgbGVmdCwgVHJ1c3RlZEltbTMyIHJpZ2h0
KQorICAgIHsKKyAgICAgICAgSnVtcCByZXN1bHQgPSB0cnlCcmFuY2hUZXN0OChjb25kLCBsZWZ0
LCByaWdodCk7CisgICAgICAgIFJFTEVBU0VfQVNTRVJUKHJlc3VsdC5pc1NldCgpKTsKKyAgICAg
ICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisKKyAgICBKdW1wIHRyeUp1bXAoRHluYW1pY0FkZHJl
c3MgYWRkcmVzcykKKyAgICB7CisgICAgICAgIHN3aXRjaCAoYWRkcmVzcy5raW5kKCkpIHsKKyAg
ICAgICAgY2FzZSBEeW5hbWljQWRkcmVzczo6QWRkcmVzczoKKyAgICAgICAgICAgIHJldHVybiBq
dW1wKGFkZHJlc3MuYXNBZGRyZXNzKCkpOworICAgICAgICBjYXNlIER5bmFtaWNBZGRyZXNzOjpB
YnNvbHV0ZUFkZHJlc3M6CisgICAgICAgICAgICByZXR1cm4ganVtcChhZGRyZXNzLmFzQWJzb2x1
dGVBZGRyZXNzKCkpOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuIGZhbHNl
OworICAgICAgICB9CisgICAgfQorICAgIEp1bXAganVtcChEeW5hbWljQWRkcmVzcyBhZGRyZXNz
KQorICAgIHsKKyAgICAgICAgSnVtcCByZXN1bHQgPSB0cnlKdW1wKGFkZHJlc3MpOworICAgICAg
ICBSRUxFQVNFX0FTU0VSVChyZXN1bHQuaXNTZXQoKSk7CisgICAgICAgIHJldHVybiByZXN1bHQ7
CisgICAgfQorCisjaWYgQ1BVKFg4Nl82NCkgfHwgQ1BVKEFSTTY0KQorICAgIGJvb2wgdHJ5TG9h
ZDY0KER5bmFtaWNBZGRyZXNzIGFkZHJlc3MsIFJlZ2lzdGVySUQgZGVzdCkKKyAgICB7CisgICAg
ICAgIHN3aXRjaCAoYWRkcmVzcy5raW5kKCkpIHsKKyAgICAgICAgY2FzZSBEeW5hbWljQWRkcmVz
czo6QWRkcmVzczoKKyAgICAgICAgICAgIGxvYWQ2NChhZGRyZXNzLmFzQWRkcmVzcygpLCBkZXN0
KTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICBjYXNlIER5bmFtaWNBZGRyZXNz
OjpCYXNlSW5kZXg6CisgICAgICAgICAgICBsb2FkNjQoYWRkcmVzcy5hc0Jhc2VJbmRleCgpLCBk
ZXN0KTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICBjYXNlIER5bmFtaWNBZGRy
ZXNzOjpBYnNvbHV0ZUFkZHJlc3M6CisgICAgICAgICAgICBsb2FkNjQoYWRkcmVzcy5hc0Fic29s
dXRlQWRkcmVzcygpLm1fcHRyLCBkZXN0KTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAg
ICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAg
fQorICAgIHZvaWQgbG9hZDY0KER5bmFtaWNBZGRyZXNzIGFkZHJlc3MsIFJlZ2lzdGVySUQgZGVz
dCkKKyAgICB7CisgICAgICAgIFJFTEVBU0VfQVNTRVJUKHRyeUxvYWQ2NChhZGRyZXNzLCBkZXN0
KSk7CisgICAgfQorCisgICAgYm9vbCB0cnlTdG9yZTY0KFJlZ2lzdGVySUQgc3JjLCBEeW5hbWlj
QWRkcmVzcyBhZGRyZXNzKQorICAgIHsKKyAgICAgICAgc3dpdGNoIChhZGRyZXNzLmtpbmQoKSkg
eworICAgICAgICBjYXNlIER5bmFtaWNBZGRyZXNzOjpBZGRyZXNzOgorICAgICAgICAgICAgc3Rv
cmU2NChzcmMsIGFkZHJlc3MuYXNBZGRyZXNzKCkpOworICAgICAgICAgICAgcmV0dXJuIHRydWU7
CisgICAgICAgIGNhc2UgRHluYW1pY0FkZHJlc3M6OkJhc2VJbmRleDoKKyAgICAgICAgICAgIHN0
b3JlNjQoc3JjLCBhZGRyZXNzLmFzQmFzZUluZGV4KCkpOworICAgICAgICAgICAgcmV0dXJuIHRy
dWU7CisgICAgICAgIGNhc2UgRHluYW1pY0FkZHJlc3M6OkFic29sdXRlQWRkcmVzczoKKyAgICAg
ICAgICAgIHN0b3JlNjQoc3JjLCBhZGRyZXNzLmFzQWJzb2x1dGVBZGRyZXNzKCkubV9wdHIpOwor
ICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBy
ZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisgICAgdm9pZCBzdG9yZTY0KFJlZ2lzdGVy
SUQgc3JjLCBEeW5hbWljQWRkcmVzcyBhZGRyZXNzKQorICAgIHsKKyAgICAgICAgUkVMRUFTRV9B
U1NFUlQodHJ5U3RvcmU2NChzcmMsIGFkZHJlc3MpKTsKKyAgICB9CisKKyAgICBib29sIHRyeVN0
b3JlNjQoVHJ1c3RlZEltbTY0IHNyYywgRHluYW1pY0FkZHJlc3MgYWRkcmVzcykKKyAgICB7Cisg
ICAgICAgIHN3aXRjaCAoYWRkcmVzcy5raW5kKCkpIHsKKyAgICAgICAgY2FzZSBEeW5hbWljQWRk
cmVzczo6QWRkcmVzczoKKyAgICAgICAgICAgIHN0b3JlNjQoc3JjLCBhZGRyZXNzLmFzQWRkcmVz
cygpKTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICBjYXNlIER5bmFtaWNBZGRy
ZXNzOjpCYXNlSW5kZXg6CisgICAgICAgICAgICBzdG9yZTY0KHNyYywgYWRkcmVzcy5hc0Jhc2VJ
bmRleCgpKTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICBjYXNlIER5bmFtaWNB
ZGRyZXNzOjpBYnNvbHV0ZUFkZHJlc3M6CisgICAgICAgICAgICBzdG9yZTY0KHNyYywgYWRkcmVz
cy5hc0Fic29sdXRlQWRkcmVzcygpLm1fcHRyKTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOwor
ICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9Cisg
ICAgfQorICAgIHZvaWQgc3RvcmU2NChUcnVzdGVkSW1tNjQgc3JjLCBEeW5hbWljQWRkcmVzcyBh
ZGRyZXNzKQorICAgIHsKKyAgICAgICAgUkVMRUFTRV9BU1NFUlQodHJ5U3RvcmU2NChzcmMsIGFk
ZHJlc3MpKTsKKyAgICB9CisKKyAgICBKdW1wIHRyeUJyYW5jaDY0KFJlbGF0aW9uYWxDb25kaXRp
b24gY29uZCwgUmVnaXN0ZXJJRCBsZWZ0LCBEeW5hbWljQWRkcmVzcyByaWdodCkKKyAgICB7Cisg
ICAgICAgIHN3aXRjaCAocmlnaHQua2luZCgpKSB7CisgICAgICAgIGNhc2UgRHluYW1pY0FkZHJl
c3M6OkFkZHJlc3M6CisgICAgICAgICAgICByZXR1cm4gYnJhbmNoNjQoY29uZCwgbGVmdCwgcmln
aHQuYXNBZGRyZXNzKCkpOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuIEp1
bXAoKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBKdW1wIGJyYW5jaDY0KFJlbGF0aW9uYWxDb25k
aXRpb24gY29uZCwgVHJ1c3RlZEltbTY0IGxlZnQsIER5bmFtaWNBZGRyZXNzIHJpZ2h0KQorICAg
IHsKKyAgICAgICAgSnVtcCByZXN1bHQgPSB0cnlCcmFuY2g2NChjb25kLCBsZWZ0LCByaWdodCk7
CisgICAgICAgIFJFTEVBU0VfQVNTRVJUKHJlc3VsdC5pc1NldCgpKTsKKyAgICAgICAgcmV0dXJu
IHJlc3VsdDsKKyAgICB9CisKKyAgICBKdW1wIHRyeUJyYW5jaDY0KFJlbGF0aW9uYWxDb25kaXRp
b24gY29uZCwgRHluYW1pY0FkZHJlc3MgbGVmdCwgVHJ1c3RlZEltbTY0IHJpZ2h0KQorICAgIHsK
KyAgICAgICAgc3dpdGNoIChsZWZ0LmtpbmQoKSkgeworICAgICAgICBjYXNlIER5bmFtaWNBZGRy
ZXNzOjpBZGRyZXNzOgorICAgICAgICAgICAgcmV0dXJuIGJyYW5jaDY0KGNvbmQsIGxlZnQuYXNB
ZGRyZXNzKCksIHJpZ2h0KTsKKyAgICAgICAgY2FzZSBEeW5hbWljQWRkcmVzczo6QmFzZUluZGV4
OgorICAgICAgICAgICAgcmV0dXJuIGJyYW5jaDY0KGNvbmQsIGxlZnQuYXNCYXNlSW5kZXgoKSwg
cmlnaHQpOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuIEp1bXAoKTsKKyAg
ICAgICAgfQorICAgIH0KKyAgICBKdW1wIGJyYW5jaDY0KFJlbGF0aW9uYWxDb25kaXRpb24gY29u
ZCwgRHluYW1pY0FkZHJlc3MgbGVmdCwgVHJ1c3RlZEltbTY0IHJpZ2h0KQorICAgIHsKKyAgICAg
ICAgSnVtcCByZXN1bHQgPSB0cnlCcmFuY2g2NChjb25kLCBsZWZ0LCByaWdodCk7CisgICAgICAg
IFJFTEVBU0VfQVNTRVJUKHJlc3VsdC5pc1NldCgpKTsKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsK
KyAgICB9CisgICAgCisgICAgSnVtcCB0cnlCcmFuY2g2NChSZWxhdGlvbmFsQ29uZGl0aW9uIGNv
bmQsIER5bmFtaWNBZGRyZXNzIGxlZnQsIFJlZ2lzdGVySUQgcmlnaHQpCisgICAgeworICAgICAg
ICBzd2l0Y2ggKGxlZnQua2luZCgpKSB7CisgICAgICAgIGNhc2UgRHluYW1pY0FkZHJlc3M6OkFk
ZHJlc3M6CisgICAgICAgICAgICByZXR1cm4gYnJhbmNoNjQoY29uZCwgbGVmdC5hc0FkZHJlc3Mo
KSwgcmlnaHQpOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuIEp1bXAoKTsK
KyAgICAgICAgfQorICAgIH0KKyAgICBKdW1wIGJyYW5jaDY0KFJlbGF0aW9uYWxDb25kaXRpb24g
Y29uZCwgRHluYW1pY0FkZHJlc3MgbGVmdCwgUmVnaXN0ZXJJRCByaWdodCkKKyAgICB7CisgICAg
ICAgIEp1bXAgcmVzdWx0ID0gdHJ5QnJhbmNoNjQoY29uZCwgbGVmdCwgcmlnaHQpOworICAgICAg
ICBSRUxFQVNFX0FTU0VSVChyZXN1bHQuaXNTZXQoKSk7CisgICAgICAgIHJldHVybiByZXN1bHQ7
CisgICAgfQorCisgICAgSnVtcCB0cnlCcmFuY2hUZXN0NjQoUmVzdWx0Q29uZGl0aW9uIGNvbmQs
IER5bmFtaWNBZGRyZXNzIGxlZnQsIFRydXN0ZWRJbW02NCByaWdodCkKKyAgICB7CisgICAgICAg
IHN3aXRjaCAobGVmdC5raW5kKCkpIHsKKyAgICAgICAgY2FzZSBEeW5hbWljQWRkcmVzczo6QWRk
cmVzczoKKyAgICAgICAgICAgIHJldHVybiBicmFuY2g2NChjb25kLCBsZWZ0LmFzQWRkcmVzcygp
LCByaWdodCk7CisgICAgICAgIGNhc2UgRHluYW1pY0FkZHJlc3M6OkJhc2VJbmRleDoKKyAgICAg
ICAgICAgIHJldHVybiBicmFuY2g2NChjb25kLCBsZWZ0LmFzQmFzZUluZGV4KCksIHJpZ2h0KTsK
KyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiBKdW1wKCk7CisgICAgICAgIH0K
KyAgICB9CisgICAgSnVtcCBicmFuY2hUZXN0NjQoUmVzdWx0Q29uZGl0aW9uIGNvbmQsIER5bmFt
aWNBZGRyZXNzIGxlZnQsIFRydXN0ZWRJbW02NCByaWdodCkKKyAgICB7CisgICAgICAgIEp1bXAg
cmVzdWx0ID0gdHJ5QnJhbmNoVGVzdDY0KGNvbmQsIGxlZnQsIHJpZ2h0KTsKKyAgICAgICAgUkVM
RUFTRV9BU1NFUlQocmVzdWx0LmlzU2V0KCkpOworICAgICAgICByZXR1cm4gcmVzdWx0OworICAg
IH0KKyNlbmRpZiAvLyBDUFUoWDg2XzY0KSB8fCBDUFUoQVJNNjQpCisKICNpZiBFTkFCTEUoTUFT
TV9QUk9CRSkKICAgICAvLyBMZXQncyB5b3UgcHJpbnQgZnJvbSB5b3VyIEpJVCBnZW5lcmF0ZWQg
Y29kZS4KICAgICAvLyBTZWUgY29tbWVudHMgaW4gTWFjcm9Bc3NlbWJsZXJQcmludGVyLmggZm9y
IGV4YW1wbGVzIG9mIGhvdyB0byB1c2UgdGhpcy4KSW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29y
ZS9iMy9CM0FkZHJlc3NNYXRjaGVyLnBhdHRlcm5zCj09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZh
U2NyaXB0Q29yZS9iMy9CM0FkZHJlc3NNYXRjaGVyLnBhdHRlcm5zCShyZXZpc2lvbiAwKQorKysg
U291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzQWRkcmVzc01hdGNoZXIucGF0dGVybnMJKHdvcmtp
bmcgY29weSkKQEAgLTAsMCArMSw0MSBAQAorIyBDb3B5cmlnaHQgKEMpIDIwMTUgQXBwbGUgSW5j
LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorIworIyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNv
dXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyMgbW9kaWZpY2F0aW9uLCBh
cmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisjIGFy
ZSBtZXQ6CisjIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0
aGUgYWJvdmUgY29weXJpZ2h0CisjICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMg
YW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyMgMi4gUmVkaXN0cmlidXRpb25zIGluIGJp
bmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyMgICAgbm90aWNl
LCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGlu
IHRoZQorIyAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQg
d2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorIworIyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZ
IEFQUExFIElOQy4gQU5EIElUUyBDT05UUklCVVRPUlMgYGBBUyBJUycnCisjIEFORCBBTlkgRVhQ
UkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRP
LAorIyBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVT
UyBGT1IgQSBQQVJUSUNVTEFSCisjIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5U
IFNIQUxMIEFQUExFIElOQy4gT1IgSVRTIENPTlRSSUJVVE9SUworIyBCRSBMSUFCTEUgRk9SIEFO
WSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCisj
IENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBS
T0NVUkVNRU5UIE9GCisjIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNF
LCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUworIyBJTlRFUlJVUFRJT04pIEhPV0VWRVIg
Q0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTgorIyBDT05U
UkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1Ig
T1RIRVJXSVNFKQorIyBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBT
T0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GCisjIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERB
TUFHRS4KKworbWF0Y2hlciBBZGRyZXNzTWF0Y2hlcgorCisjIE5vdGUgdGhhdCB0aGlzIHJlbGll
cyBvbiBCMyBkb2luZyBhZ2dyZXNzaXZlIHJlYXNzb2NpYXRpb24gYW5kIGNhbm9uY2FsaXphdGlv
biBvZiBpbnRlZ2VyIGFkZHMuCisjIFdlJ2xsIG5ldmVyIHNlZSBBZGQoQWRkKHgsIGNvbnN0MSks
IGNvbnN0MikgYmVjYXVzZSBpdCB3b3VsZCBoYXZlIGFscmVhZHkgYmVlbiByZWFzc29jaWF0ZWQg
aW50bworIyBBZGQoeCwgY29uc3QxICsgY29uc3QyKS4gQWxzbywgd2Ugd2lsbCBuZXZlciBzZWUg
QWRkKGNvbnN0LCB4KSwgYmVjYXVzZSB3ZSB3b3VsZCBoYXZlIGNhbm9uaWNhbGl6ZWQKKyMgaXQg
dG8gQWRkKHgsIGNvbnN0KS4gVGhhdCBzYWlkLCBpbiB0aGlzIGNvZGUgd2UgbmV2ZXIgbWFrZSBh
c3NlcnRpb25zIGFib3V0IHRoZXNlIG9wdGltaXphdGlvbnMKKyMgaGF2aW5nIGJlZW4gcGVyZm9y
bWVkLiBBbHNvLCBzaW5jZSB0aGUgTG9hZC9TdG9yZSBpbnN0cnVjdGlvbnMgaW4gQjMgaGF2ZSBh
IGJ1aWx0LWluIG9mZnNldCwgd2UKKyMgZG9uJ3QgbmVlZCB0byBtYXRjaCBBZGQoeCwgY29uc3Qp
LiBUaGF0IHdvdWxkIGhhdmUgYmVlbiBmb2xkZWQgaW50byB0aGUgTG9hZC9TdG9yZSBpbnN0cnVj
dGlvbnMKKyMgYWxyZWFkeS4gU28sIHRoZSBvbmx5IGZhbmN5IG1hdGhpbmcgdGhpcyBjYW4gZG8g
aXMganVzdCBCYXNlSW5kZXggZm9ybXMuCisKK0FkZFNoaWZ0MSA9IEFkZChTaGwoaW5kZXgsICRs
b2dTY2FsZSksIGJhc2UpCitBZGRTaGlmdDIgPSBBZGQoYmFzZSwgU2hsKGluZGV4LCAkbG9nU2Nh
bGUpKQorCitBZGQgPSBBZGQobGVmdCwgcmlnaHQpCisKKyRDb25zdAorCitEaXJlY3QKSW5kZXg6
IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM0FyZ3VtZW50UmVnVmFsdWUuY3BwCj09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM0FyZ3VtZW50UmVnVmFsdWUuY3BwCShy
ZXZpc2lvbiAwKQorKysgU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzQXJndW1lbnRSZWdWYWx1
ZS5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSw0MSBAQAorLyoKKyAqIENvcHlyaWdodCAo
QykgMjAxNSBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmli
dXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0
CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93
aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291
cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0
aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICog
Mi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92
ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRo
ZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29y
IG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICog
VEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5Z
CisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJ
TUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBB
TkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAg
SU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJM
RSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVN
UExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlU
RUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBM
T1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElP
TikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hF
VEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElO
RyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUg
VVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklM
SVRZIE9GIFNVQ0ggREFNQUdFLiAKKyAqLworCisjaW5jbHVkZSAiY29uZmlnLmgiCisjaW5jbHVk
ZSAiQjNBcmd1bWVudFJlZ1ZhbHVlLmgiCisKK25hbWVzcGFjZSBKU0MgeyBuYW1lc3BhY2UgQjMg
eworCitBcmd1bWVudFJlZ1ZhbHVlOjp+QXJndW1lbnRSZWdWYWx1ZSgpCit7Cit9CisKK3ZvaWQg
QXJndW1lbnRSZWdWYWx1ZTo6ZHVtcE1ldGEoUHJpbnRTdHJlYW0mIG91dCkgY29uc3QKK3sKKyAg
ICBvdXQucHJpbnQobV9yZWcpOworfQorCit9IH0gLy8gbmFtZXNwYWNlIEpTQzo6QjMKKwpJbmRl
eDogU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzQXJndW1lbnRSZWdWYWx1ZS5oCj09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM0FyZ3VtZW50UmVnVmFsdWUuaAkocmV2
aXNpb24gMCkKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM0FyZ3VtZW50UmVnVmFsdWUu
aAkod29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDYwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAy
MDE1IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlv
biBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAq
IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcg
Y29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2Ug
Y29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMg
bGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBS
ZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNv
cHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZv
bGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3Ro
ZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElT
IFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAq
IEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRF
RCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBG
SVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBO
TyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZP
UiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFS
WSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBU
TywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1Mg
T0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBI
T1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVS
IElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5F
R0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UK
KyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkg
T0YgU1VDSCBEQU1BR0UuIAorICovCisKKyNpZm5kZWYgQjNBcmd1bWVudFJlZ1ZhbHVlX2gKKyNk
ZWZpbmUgQjNBcmd1bWVudFJlZ1ZhbHVlX2gKKworI2luY2x1ZGUgIkIzVmFsdWUuaCIKKyNpbmNs
dWRlICJSZWcuaCIKKworbmFtZXNwYWNlIEpTQyB7IG5hbWVzcGFjZSBCMyB7CisKK2NsYXNzIEFy
Z3VtZW50UmVnVmFsdWUgOiBwdWJsaWMgVmFsdWUgeworcHVibGljOgorICAgIHN0YXRpYyBib29s
IGFjY2VwdHMoT3Bjb2RlIG9wY29kZSkgeyByZXR1cm4gb3Bjb2RlID09IEFyZ3VtZW50UmVnOyB9
CisgICAgCisgICAgfkFyZ3VtZW50UmVnVmFsdWUoKTsKKworICAgIFJlZyBhcmd1bWVudFJlZygp
IGNvbnN0IHsgcmV0dXJuIG1fcmVnOyB9CisKK3Byb3RlY3RlZDoKKyAgICB2b2lkIGR1bXBNZXRh
KFByaW50U3RyZWFtJikgY29uc3Qgb3ZlcnJpZGU7CisKK3ByaXZhdGU6CisgICAgZnJpZW5kIGNs
YXNzIFByb2NlZHVyZTsKKworICAgIEFyZ3VtZW50UmVnVmFsdWUodW5zaWduZWQgaW5kZXgsIE9y
aWdpbiBvcmlnaW4sIFJlZyByZWcpCisgICAgICAgIDogVmFsdWUoaW5kZXgsIEFyZ3VtZW50UmVn
LCByZWcuaXNHUFIoKSA/IHBvaW50ZXIoKSA6IERvdWJsZSwgb3JpZ2luKQorICAgICAgICAsIG1f
cmVnKHJlZykKKyAgICB7CisgICAgfQorCisgICAgUmVnIG1fcmVnOworfTsKKworfSB9IC8vIG5h
bWVzcGFjZSBKU0M6OkIzCisKKyNlbmRpZiAvLyBCM0FyZ3VtZW50UmVnVmFsdWVfaAorCkluZGV4
OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNCYXNpY0Jsb2NrLmNwcAo9PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0t
LSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNCYXNpY0Jsb2NrLmNwcAkocmV2aXNpb24gMCkK
KysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM0Jhc2ljQmxvY2suY3BwCSh3b3JraW5nIGNv
cHkpCkBAIC0wLDAgKzEsNTggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTUgQXBwbGUgSW5j
LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4g
c291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9u
LCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisg
KiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0
YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRp
dGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9u
cyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAg
ICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2Ns
YWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMg
cHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMg
UFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJ
TVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAq
IElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEg
UEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxM
IEFQUExFIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1Qs
IElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFV
RU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VS
RU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEs
IE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VE
IEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1Qs
IFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBP
VEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBT
T0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFH
RS4gCisgKi8KKworI2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgIkIzQmFzaWNCbG9jay5o
IgorCituYW1lc3BhY2UgSlNDIHsgbmFtZXNwYWNlIEIzIHsKKworQmFzaWNCbG9jazo6QmFzaWNC
bG9jayh1bnNpZ25lZCBpbmRleCkKKyAgICA6IG1faW5kZXgoaW5kZXgpCit7Cit9CisKK0Jhc2lj
QmxvY2s6On5CYXNpY0Jsb2NrKCkKK3sKK30KKwordm9pZCBCYXNpY0Jsb2NrOjphcHBlbmQoVmFs
dWUqIHZhbHVlKQoreworICAgIG1fdmFsdWVzLmFwcGVuZCh2YWx1ZSk7Cit9CisKK3ZvaWQgQmFz
aWNCbG9jazo6ZHVtcChQcmludFN0cmVhbSYgb3V0KSBjb25zdAoreworICAgIG91dC5wcmludChk
dW1wUHJlZml4LCBtX2luZGV4KTsKK30KKwordm9pZCBCYXNpY0Jsb2NrOjpkZWVwRHVtcChQcmlu
dFN0cmVhbSYgb3V0KSBjb25zdAoreworICAgIG91dC5wcmludCgiQkIiLCAqdGhpcywgIjpcbiIp
OworICAgIGZvciAoVmFsdWUqIHZhbHVlIDogKnRoaXMpCisgICAgICAgIG91dC5wcmludCgiICAg
ICIsIGRlZXBEdW1wKHZhbHVlKSwgIlxuIik7Cit9CisKK30gfSAvLyBuYW1lc3BhY2UgSlNDOjpC
MworCkluZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNCYXNpY0Jsb2NrLmgKPT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzQmFzaWNCbG9jay5oCShyZXZpc2lv
biAwKQorKysgU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzQmFzaWNCbG9jay5oCSh3b3JraW5n
IGNvcHkpCkBAIC0wLDAgKzEsMTEyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE1IEFwcGxl
IEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNl
IGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNh
dGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9u
cworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0
IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBj
b25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1
dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAor
ICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBk
aXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJp
YWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJF
IElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1Mg
T1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhF
CisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZP
UiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBT
SEFMTCBBUFBMRSBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElS
RUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09O
U0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBS
T0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBE
QVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENB
VVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRS
QUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0Ug
T1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRI
SVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBE
QU1BR0UuIAorICovCisKKyNpZm5kZWYgQjNCYXNpY0Jsb2NrCisjZGVmaW5lIEIzQmFzaWNCbG9j
aworCituYW1lc3BhY2UgSlNDIHsgbmFtZXNwYWNlIEIzIHsKKworY2xhc3MgUHJvY2VkdXJlOwor
Y2xhc3MgVmFsdWU7CisKK2NsYXNzIEJhc2ljQmxvY2sgeworICAgIFdURl9NQUtFX05PTkNPUFlB
QkxFKEJhc2ljQmxvY2spOworICAgIFdURl9NQUtFX0ZBU1RfQUxMT0NBVEVEOworcHVibGljOgor
ICAgIHR5cGVkZWYgVmVjdG9yPFZhbHVlKj4gVmFsdWVMaXN0OworICAgIHR5cGVkZWYgVmVjdG9y
PEJhc2ljQmxvY2sqLCAyPiBTdWNjZXNzb3JMaXN0OyAvLyBUaGlzIG1hdGNoZXMgQ29udHJvbFZh
bHVlJ3MgdHlwZWRlZi4KKworICAgIHN0YXRpYyBjb25zdCBjaGFyKiBkdW1wUHJlZml4ID0gIiMi
OworCisgICAgfkJhc2ljQmxvY2soKTsKKworICAgIHVuc2lnbmVkIGluZGV4KCkgY29uc3QgeyBy
ZXR1cm4gbV9pbmRleDsgfQorCisgICAgQWRqYWNlbmN5TGlzdDo6aXRlcmF0b3IgYmVnaW4oKSB7
IHJldHVybiBtX3ZhbHVlcy5iZWdpbigpOyB9CisgICAgQWRqYWNlbmN5TGlzdDo6aXRlcmF0b3Ig
ZW5kKCkgeyByZXR1cm4gbV92YWx1ZXMuZW5kKCk7IH0KKyAgICBBZGphY2VuY3lMaXN0Ojpjb25z
dF9pdGVyYXRvciBiZWdpbigpIGNvbnN0IHsgcmV0dXJuIG1fdmFsdWVzLmJlZ2luKCk7IH0KKyAg
ICBBZGphY2VuY3lMaXN0Ojpjb25zdF9pdGVyYXRvciBlbmQoKSBjb25zdCB7IHJldHVybiBtX3Zh
bHVlcy5lbmQoKTsgfQorCisgICAgc2l6ZV90IHNpemUoKSBjb25zdCB7IHJldHVybiBtX3ZhbHVl
cy5zaXplKCk7IH0KKyAgICBWYWx1ZSogYXQoc2l6ZV90IGluZGV4KSBjb25zdCB7IHJldHVybiBt
X3ZhbHVlc1tpbmRleF07IH0KKyAgICBWYWx1ZSomIGF0KHNpemVfdCBpbmRleCkgeyByZXR1cm4g
bV92YWx1ZXNbaW5kZXhdOyB9CisKKyAgICBWYWx1ZSogbGFzdCgpIGNvbnN0IHsgcmV0dXJuIG1f
dmFsdWVzLmxhc3QoKTsgfQorICAgIFZhbHVlKiYgbGFzdCgpIHsgcmV0dXJuIG1fdmFsdWVzLmxh
c3QoKTsgfQorCisgICAgY29uc3QgVmFsdWVMaXN0JiB2YWx1ZXMoKSBjb25zdCB7IHJldHVybiBt
X3ZhbHVlczsgfQorICAgIFZhbHVlTGlzdCYgdmFsdWVzKCkgeyByZXR1cm4gbV92YWx1ZXM7IH0K
KworICAgIHZvaWQgYXBwZW5kKFZhbHVlKik7CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBWYWx1
ZVR5cGUsIHR5cGVuYW1lLi4uIEFyZ3VtZW50cz4KKyAgICBWYWx1ZVR5cGUqIGFwcGVuZE5ldyhQ
cm9jZWR1cmUmLCBBcmd1bWVudHMuLi4pOworCisgICAgdW5zaWduZWQgbnVtU3VjY2Vzc29ycygp
IGNvbnN0OworICAgIEJhc2ljQmxvY2sqIHN1Y2Nlc3Nvcih1bnNpZ25lZCBpbmRleCkgY29uc3Q7
CisgICAgQmFzaWNCbG9jayomIHN1Y2Nlc3Nvcih1bnNpZ25lZCBpbmRleCk7CisgICAgY29uc3Qg
U3VjY2Vzc29yTGlzdCYgc3VjY2Vzc29ycygpIGNvbnN0OworCisgICAgdm9pZCBkdW1wKFByaW50
U3RyZWFtJikgY29uc3Q7CisgICAgdm9pZCBkZWVwRHVtcChQcmludFN0cmVhbSYpIGNvbnN0Owor
Citwcml2YXRlOgorICAgIGZyaWVuZCBjbGFzcyBQcm9jZWR1cmU7CisgICAgCisgICAgLy8gSW5z
dGFudGlhdGUgdmlhIFByb2NlZHVyZS4KKyAgICBCYXNpY0Jsb2NrKHVuc2lnbmVkIGluZGV4KTsK
KworICAgIHVuc2lnbmVkIG1faW5kZXg7CisgICAgVmFsdWVMaXN0IG1fdmFsdWVzOworfTsKKwor
Y2xhc3MgRGVlcEJhc2ljQmxvY2tEdW1wIHsKK3B1YmxpYzoKKyAgICBEZWVwQmFzaWNCbG9ja0R1
bXAoQmFzaWNCbG9jayogYmxvY2spCisgICAgICAgIDogbV9ibG9jayhibG9jaykKKyAgICB7Cisg
ICAgfQorCisgICAgdm9pZCBkdW1wKFByaW50U3RyZWFtJiBvdXQpIGNvbnN0CisgICAgeworICAg
ICAgICBpZiAobV9ibG9jaykKKyAgICAgICAgICAgIG1fYmxvY2stPmRlZXBEdW1wKG91dCk7Cisg
ICAgICAgIGVsc2UKKyAgICAgICAgICAgIG91dC5wcmludCgiPG51bGw+Iik7CisgICAgfQorCitw
cml2YXRlOgorICAgIEJhc2ljQmxvY2sqIG1fYmxvY2s7Cit9OworCitEZWVwQmFzaWNCbG9ja0R1
bXAgZGVlcER1bXAoQmFzaWNCbG9jayogYmxvY2spCit7CisgICAgcmV0dXJuIERlZXBCYXNpY0Js
b2NrRHVtcChibG9jayk7Cit9CisKK30gfSAvLyBuYW1lc3BhY2UgSlNDOjpCMworCisjZW5kaWYg
Ly8gQjNCYXNpY0Jsb2NrCisKSW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM0Jhc2lj
QmxvY2tJbmxpbmVzLmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0Iz
QmFzaWNCbG9ja0lubGluZXMuaAkocmV2aXNpb24gMCkKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29y
ZS9iMy9CM0Jhc2ljQmxvY2tJbmxpbmVzLmgJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSw2NiBA
QAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNSBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2
ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBm
b3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJv
dmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBS
ZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHly
aWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxv
d2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11
c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0
IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAg
IGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBk
aXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJ
TkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywg
SU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVT
IE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQ
T1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUgorICog
Q09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5U
QUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5D
TFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRF
IEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9S
IEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkK
KyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwg
T1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJ
TiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFE
VklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLiAKKyAqLworCisjaWZuZGVm
IEIzQmFzaWNCbG9ja0lubGluZXNfaAorI2RlZmluZSBCM0Jhc2ljQmxvY2tJbmxpbmVzX2gKKwor
I2luY2x1ZGUgIkIzQmFzaWNCbG9jay5oIgorI2luY2x1ZGUgIkIzQ29udHJvbFZhbHVlLmgiCisj
aW5jbHVkZSAiQjNQcm9jZWR1cmVJbmxpbmVzLmgiCisKK25hbWVzcGFjZSBKU0MgeyBuYW1lc3Bh
Y2UgQjMgeworCit0ZW1wbGF0ZTx0eXBlbmFtZSBWYWx1ZVR5cGUgdHlwZW5hbWUuLi4gQXJndW1l
bnRzPgorVmFsdWVUeXBlKiBCYXNpY0Jsb2NrOjphcHBlbmROZXcoUHJvY2VkdXJlJiBwcm9jZWR1
cmUsIEFyZ3VtZW50cy4uLiBhcmd1bWVudHMpCit7CisgICAgVmFsdWVUeXBlKiByZXN1bHQgPSBw
cm9jZWR1cmUuYWRkPFZhbHVlVHlwZT4oYXJndW1lbnRzLi4uKTsKKyAgICBhcHBlbmQocmVzdWx0
KTsKKyAgICByZXR1cm4gcmVzdWx0OworfQorCit1bnNpZ25lZCBCYXNpY0Jsb2NrOjpudW1TdWNj
ZXNzb3JzKCkgY29uc3QKK3sKKyAgICByZXR1cm4gbGFzdCgpLT5hczxDb250cm9sVmFsdWU+KCkt
Pm51bVN1Y2Nlc3NvcnMoKTsKK30KKworQmFzaWNCbG9jayogQmFzaWNCbG9jazo6c3VjY2Vzc29y
KHVuc2lnbmVkIGluZGV4KSBjb25zdAoreworICAgIHJldHVybiBsYXN0KCktPmFzPENvbnRyb2xW
YWx1ZT4oKS0+c3VjY2Vzc29yKGluZGV4KTsKK30KKworQmFzaWNCbG9jayomIEJhc2ljQmxvY2s6
OnN1Y2Nlc3Nvcih1bnNpZ25lZCBpbmRleCkKK3sKKyAgICByZXR1cm4gbGFzdCgpLT5hczxDb250
cm9sVmFsdWU+KCktPnN1Y2Nlc3NvcihpbmRleCk7Cit9CisKK2NvbnN0IEJhc2ljQmxvY2s6OlN1
Y2Nlc3Nvckxpc3QmIEJhc2ljQmxvY2s6OnN1Y2Nlc3NvcnMoKSBjb25zdAoreworICAgIHJldHVy
biBsYXN0KCktPmFzPENvbnRyb2xWYWx1ZT4oKS0+c3VjY2Vzc29ycygpOworfQorCit9IH0gLy8g
bmFtZXNwYWNlIEpTQzo6QjMKKworI2VuZGlmIC8vIEIzQmFzaWNCbG9ja0lubGluZXNfaAorCklu
ZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNDaGVja1ZhbHVlLmNwcAo9PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNDaGVja1ZhbHVlLmNwcAkocmV2aXNpb24g
MCkKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM0NoZWNrVmFsdWUuY3BwCSh3b3JraW5n
IGNvcHkpCkBAIC0wLDAgKzEsNDEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTUgQXBwbGUg
SW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2Ug
aW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0
aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25z
CisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3Qg
cmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNv
bmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0
aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Cisg
KiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRp
c2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlh
bHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUg
SVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBP
UiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUK
KyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9S
IEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNI
QUxMIEFQUExFIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJF
Q1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05T
RVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJP
Q1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERB
VEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FV
U0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJB
Q1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBP
UiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJ
UyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERB
TUFHRS4gCisgKi8KKworI2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgIkIzQ2hlY2tWYWx1
ZS5oIgorCituYW1lc3BhY2UgSlNDIHsgbmFtZXNwYWNlIEIzIHsKKworQ2hlY2tWYWx1ZTo6fkNo
ZWNrVmFsdWUoKQoreworfQorCit2b2lkIENoZWNrVmFsdWU6OmR1bXBNZXRhKFByaW50U3RyZWFt
JiBvdXQpIGNvbnN0Cit7CisgICAgb3V0LnByaW50KCJzdGFja21hcCA9ICIsIHN0YWNrbWFwKTsK
K30KKworfSB9IC8vIG5hbWVzcGFjZSBKU0M6OkIzCisKSW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0
Q29yZS9iMy9CM0NoZWNrVmFsdWUuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENv
cmUvYjMvQjNDaGVja1ZhbHVlLmgJKHJldmlzaW9uIDApCisrKyBTb3VyY2UvSmF2YVNjcmlwdENv
cmUvYjMvQjNDaGVja1ZhbHVlLmgJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSw4MCBAQAorLyoK
KyAqIENvcHlyaWdodCAoQykgMjAxNSBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisg
KgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywg
d2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQg
dGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3Ry
aWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAor
ICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBk
aXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVw
cm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNv
bmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3Vt
ZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmli
dXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIGBg
QVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVE
SU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1F
UkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFS
RSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUgorICogQ09OVFJJ
QlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQ
RUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5H
LCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RT
IE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lO
RVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9G
IExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9S
VAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkg
V0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQg
T0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLiAKKyAqLworCisjaWZuZGVmIEIzQ2hl
Y2tWYWx1ZV9oCisjZGVmaW5lIEIzQ2hlY2tWYWx1ZV9oCisKKyNpbmNsdWRlICJCM1ZhbHVlLmgi
CisjaW5jbHVkZSAiQjNTdGFja21hcC5oIgorCituYW1lc3BhY2UgSlNDIHsgbmFtZXNwYWNlIEIz
IHsKKworY2xhc3MgQ2hlY2tWYWx1ZSA6IHB1YmxpYyBDaGVjayB7CitwdWJsaWM6CisgICAgc3Rh
dGljIGJvb2wgYWNjZXB0cyhPcGNvZGUgb3Bjb2RlKQorICAgIHsKKyAgICAgICAgc3dpdGNoIChv
cGNvZGUpIHsKKyAgICAgICAgY2FzZSBDaGVja0FkZDoKKyAgICAgICAgY2FzZSBDaGVja1N1YjoK
KyAgICAgICAgY2FzZSBDaGVja011bDoKKyAgICAgICAgY2FzZSBDaGVjazoKKyAgICAgICAgICAg
IHJldHVybiB0cnVlOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuIGZhbHNl
OworICAgICAgICB9CisgICAgfQorCisgICAgfkNoZWNrVmFsdWUoKTsKKworICAgIFN0YWNrbWFw
IHN0YWNrbWFwOworCitwcm90ZWN0ZWQ6CisgICAgdm9pZCBkdW1wTWV0YShQcmludFN0cmVhbSYp
IGNvbnN0IG92ZXJyaWRlOworCitwcml2YXRlOgorICAgIGZyaWVuZCBjbGFzcyBQcm9jZWR1cmU7
CisKKyAgICAvLyBVc2UgdGhpcyBmb3JtIGZvciBDaGVja0FkZCwgQ2hlY2tTdWIsIGFuZCBDaGVj
a011bC4KKyAgICBDaGVja1ZhbHVlKHVuc2lnbmVkIGluZGV4LCBPcGNvZGUgb3Bjb2RlLCBPcmln
aW4gb3JpZ2luLCBWYWx1ZSogbGVmdCwgVmFsdWUqIHJpZ2h0KQorICAgICAgICA6IFZhbHVlKGlu
ZGV4LCBvcGNvZGUsIGxlZnQtPnR5cGUoKSwgb3JpZ2luLCBsZWZ0LCByaWdodCkKKyAgICB7Cisg
ICAgICAgIEFTU0VSVChpc0ludCh0eXBlKCkpKTsKKyAgICAgICAgQVNTRVJUKGxlZnQtPnR5cGUo
KSA9PSByaWdodC0+dHlwZSgpKTsKKyAgICAgICAgQVNTRVJUKG9wY29kZSA9PSBDaGVja0FkZCB8
fCBvcGNvZGUgPT0gQ2hlY2tTdWIgfHwgb3Bjb2RlID09IENoZWNrTXVsKTsKKyAgICB9CisKKyAg
ICAvLyBVc2UgdGhpcyBmb3JtIGZvciBDaGVjay4KKyAgICBDaGVja1ZhbHVlKHVuc2lnbmVkIGlu
ZGV4LCBPcGNvZGUgb3Bjb2RlLCBPcmlnaW4gb3JpZ2luLCBWYWx1ZSogcHJlZGljYXRlKQorICAg
ICAgICA6IFZhbHVlKGluZGV4LCBvcGNvZGUsIFZvaWQsIG9yaWdpbiwgcHJlZGljYXRlKQorICAg
IHsKKyAgICAgICAgQVNTRVJUKG9wY2RlID09IENoZWNrKTsKKyAgICB9Cit9OworCit9IH0gLy8g
bmFtZXNwYWNlIEpTQzo6QjMKKworI2VuZGlmIC8vIEIzQ2hlY2tWYWx1ZV9oCisKKwpJbmRleDog
U291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzQ29tcGFyaXNvbk1hdGNoZXIucGF0dGVybnMKPT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzQ29tcGFyaXNvbk1hdGNoZXIu
cGF0dGVybnMJKHJldmlzaW9uIDApCisrKyBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNDb21w
YXJpc29uTWF0Y2hlci5wYXR0ZXJucwkod29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDM4IEBACisj
IENvcHlyaWdodCAoQykgMjAxNSBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisjCisj
IFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGgg
b3Igd2l0aG91dAorIyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0
aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyMgYXJlIG1ldDoKKyMgMS4gUmVkaXN0cmlidXRpb25z
IG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyMgICAgbm90
aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVy
LgorIyAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhl
IGFib3ZlIGNvcHlyaWdodAorIyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFu
ZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisjICAgIGRvY3VtZW50YXRpb24gYW5k
L29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisjCisj
IFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBBTkQgSVRTIENPTlRSSUJV
VE9SUyBgYEFTIElTJycKKyMgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywg
SU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisjIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMg
T0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyMgUFVSUE9T
RSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUiBJVFMgQ09O
VFJJQlVUT1JTCisjIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5U
QUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKKyMgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNM
VURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKKyMgU1VCU1RJVFVURSBH
T09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lO
RVNTCisjIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0Yg
TElBQklMSVRZLCBXSEVUSEVSIElOCisjIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBU
T1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisjIEFSSVNJTkcgSU4gQU5Z
IFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YK
KyMgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCittYXRjaGVyIENvbXBhcmlzb25N
YXRjaGVyCisKK1Rlc3RMb2FkTm90WmVybzEgPSBBbmQoTG9hZChhZGRyZXNzKSwgcmlnaHQpCitU
ZXN0TG9hZE5vdFplcm8yID0gQW5kKGxlZnQsIExvYWQoYWRkcmVzcykpCitUZXN0Tm90WmVybyA9
IEFuZChsZWZ0LCByaWdodCkKKworVGVzdExvYWRaZXJvMSA9IEVxdWFsKEFuZChMb2FkKGFkZHJl
c3MpLCByaWdodCksICQwKQorVGVzdExvYWRaZXJvMiA9IEVxdWFsKEFuZChsZWZ0LCBMb2FkKGFk
ZHJlc3MpKSwgJDApCitUZXN0WmVybyA9IEVxdWFsKEFuZChsZWZ0LCByaWdodCksICQwKQorCitM
b2FkRXF1YWwxID0gRXF1YWwoTG9hZChhZGRyZXNzKSwgcmlnaHQpCitMb2FkRXF1YWwyID0gRXF1
YWwobGVmdCwgTG9hZChhZGRyZXNzKSkKK05vdCA9IEVxdWFsKHZhbHVlLCAkMCkKK0VxdWFsID0g
RXF1YWwobGVmdCwgcmlnaHQpCisKSW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM0Nv
bnN0MzJWYWx1ZS5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0Iz
Q29uc3QzMlZhbHVlLmNwcAkocmV2aXNpb24gMCkKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9i
My9CM0NvbnN0MzJWYWx1ZS5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSw0MSBAQAorLyoK
KyAqIENvcHlyaWdodCAoQykgMjAxNSBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisg
KgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywg
d2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQg
dGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3Ry
aWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAor
ICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBk
aXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVw
cm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNv
bmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3Vt
ZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmli
dXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIGBg
QVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVE
SU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1F
UkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFS
RSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUgorICogQ09OVFJJ
QlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQ
RUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5H
LCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RT
IE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lO
RVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9G
IExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9S
VAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkg
V0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQg
T0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLiAKKyAqLworCisjaW5jbHVkZSAiY29u
ZmlnLmgiCisjaW5jbHVkZSAiQjNDb25zdDMyVmFsdWUuaCIKKworbmFtZXNwYWNlIEpTQyB7IG5h
bWVzcGFjZSBCMyB7CisKK0NvbnN0MzJWYWx1ZTo6fkNvbnN0MzJWYWx1ZSgpCit7Cit9CisKK3Zv
aWQgQ29uc3QzMlZhbHVlOjpkdW1wTWV0YShQcmludFN0cmVhbSYgb3V0KSBjb25zdAoreworICAg
IG91dC5wcmludChtX3ZhbHVlKTsKK30KKworfSB9IC8vIG5hbWVzcGFjZSBKU0M6OkIzCisKSW5k
ZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM0NvbnN0MzJWYWx1ZS5oCj09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0K
LS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM0NvbnN0MzJWYWx1ZS5oCShyZXZpc2lvbiAw
KQorKysgU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzQ29uc3QzMlZhbHVlLmgJKHdvcmtpbmcg
Y29weSkKQEAgLTAsMCArMSw1OSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNSBBcHBsZSBJ
bmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBp
biBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRp
b24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMK
KyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCBy
ZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29u
ZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRp
b25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAq
ICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlz
Y2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFs
cyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJ
UyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9S
IElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQor
ICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1Ig
QSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hB
TEwgQVBQTEUgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVD
VCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNF
UVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9D
VVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFU
QSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVT
RUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFD
VCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9S
IE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElT
IFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFN
QUdFLiAKKyAqLworCisjaWZuZGVmIEIzQ29uc3QzMlZhbHVlX2gKKyNkZWZpbmUgQjNDb25zdDMy
VmFsdWVfaAorCisjaW5jbHVkZSAiQjNWYWx1ZS5oIgorCituYW1lc3BhY2UgSlNDIHsgbmFtZXNw
YWNlIEIzIHsKKworY2xhc3MgQ29uc3QzMlZhbHVlIDogcHVibGljIFZhbHVlIHsKK3B1YmxpYzoK
KyAgICBzdGF0aWMgYm9vbCBhY2NlcHRzKE9wY29kZSBvcGNvZGUpIHsgcmV0dXJuIG9wY29kZSA9
PSBDb25zdDMyOyB9CisgICAgCisgICAgfkNvbnN0MzJWYWx1ZSgpOworICAgIAorICAgIGludDMy
X3QgdmFsdWUoKSBjb25zdCB7IHJldHVybiBtX3ZhbHVlOyB9CisKK3Byb3RlY3RlZDoKKyAgICB2
b2lkIGR1bXBNZXRhKFByaW50U3RyZWFtJikgY29uc3Qgb3ZlcnJpZGU7CisKK3ByaXZhdGU6Cisg
ICAgZnJpZW5kIGNsYXNzIFByb2NlZHVyZTsKKworICAgIENvbnN0MzJWYWx1ZSh1bnNpZ25lZCBp
bmRleCwgT3JpZ2luIG9yaWdpbiwgaW50MzJfdCB2YWx1ZSkKKyAgICAgICAgOiBWYWx1ZShpbmRl
eCwgQ29uc3QzMiwgSW50MzIsIG9yaWdpbikKKyAgICAgICAgLCBtX3ZhbHVlKHZhbHVlKQorICAg
IHsKKyAgICB9CisgICAgCisgICAgaW50MzJfdCBtX3ZhbHVlOworfTsKKworfSB9IC8vIG5hbWVz
cGFjZSBKU0M6OkIzCisKKyNlbmRpZiAvLyBCM0NvbnN0MzJWYWx1ZV9oCisKSW5kZXg6IFNvdXJj
ZS9KYXZhU2NyaXB0Q29yZS9iMy9CM0NvbnN0NjRWYWx1ZS5jcHAKPT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291
cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzQ29uc3Q2NFZhbHVlLmNwcAkocmV2aXNpb24gMCkKKysr
IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM0NvbnN0NjRWYWx1ZS5jcHAJKHdvcmtpbmcgY29w
eSkKQEAgLTAsMCArMSw0MSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNSBBcHBsZSBJbmMu
IEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBz
b3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24s
IGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAq
IGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRh
aW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0
aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25z
IGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAg
IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xh
aW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBw
cm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQ
Uk9WSURFRCBCWSBBUFBMRSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElN
UExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICog
SU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQ
QVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwg
QVBQTEUgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwg
SU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVF
TlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJF
TUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwg
T1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQg
QU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwg
U1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9U
SEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNP
RlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdF
LiAKKyAqLworCisjaW5jbHVkZSAiY29uZmlnLmgiCisjaW5jbHVkZSAiQjNDb25zdDY0VmFsdWUu
aCIKKworbmFtZXNwYWNlIEpTQyB7IG5hbWVzcGFjZSBCMyB7CisKK0NvbnN0NjRWYWx1ZTo6fkNv
bnN0NjRWYWx1ZSgpCit7Cit9CisKK3ZvaWQgQ29uc3Q2NFZhbHVlOjpkdW1wTWV0YShQcmludFN0
cmVhbSYgb3V0KSBjb25zdAoreworICAgIG91dC5wcmludChtX3ZhbHVlKTsKK30KKworfSB9IC8v
IG5hbWVzcGFjZSBKU0M6OkIzCisKSW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM0Nv
bnN0NjRWYWx1ZS5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM0Nv
bnN0NjRWYWx1ZS5oCShyZXZpc2lvbiAwKQorKysgU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0Iz
Q29uc3Q2NFZhbHVlLmgJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSw1OSBAQAorLyoKKyAqIENv
cHlyaWdodCAoQykgMjAxNSBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICog
UmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBv
ciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0
aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlv
bnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAg
bm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFp
bWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNl
IHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlv
bnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRp
b24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24u
CisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIGBgQVMgSVMn
JyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBC
VVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5U
QUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVND
TEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUgorICogQ09OVFJJQlVUT1JT
IEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUws
CisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQg
Tk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNF
UlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElO
VEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJ
TElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICog
KElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9V
VCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhF
IFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLiAKKyAqLworCisjaWZuZGVmIEIzQ29uc3Q2NFZh
bHVlX2gKKyNkZWZpbmUgQjNDb25zdDY0VmFsdWVfaAorCisjaW5jbHVkZSAiQjNWYWx1ZS5oIgor
CituYW1lc3BhY2UgSlNDIHsgbmFtZXNwYWNlIEIzIHsKKworY2xhc3MgQ29uc3Q2NFZhbHVlIDog
cHVibGljIFZhbHVlIHsKK3B1YmxpYzoKKyAgICBzdGF0aWMgYm9vbCBhY2NlcHRzKE9wY29kZSBv
cGNvZGUpIHsgcmV0dXJuIG9wY29kZSA9PSBDb25zdDY0OyB9CisgICAgCisgICAgfkNvbnN0NjRW
YWx1ZSgpOworICAgIAorICAgIGludDY0X3QgdmFsdWUoKSBjb25zdCB7IHJldHVybiBtX3ZhbHVl
OyB9CisKK3Byb3RlY3RlZDoKKyAgICB2b2lkIGR1bXBNZXRhKFByaW50U3RyZWFtJikgY29uc3Qg
b3ZlcnJpZGU7CisKK3ByaXZhdGU6CisgICAgZnJpZW5kIGNsYXNzIFByb2NlZHVyZTsKKworICAg
IENvbnN0NjRWYWx1ZSh1bnNpZ25lZCBpbmRleCwgT3JpZ2luIG9yaWdpbiwgaW50NjRfdCB2YWx1
ZSkKKyAgICAgICAgOiBWYWx1ZShpbmRleCwgQ29uc3Q2NCwgSW50NjQsIG9yaWdpbikKKyAgICAg
ICAgLCBtX3ZhbHVlKHZhbHVlKQorICAgIHsKKyAgICB9CisgICAgCisgICAgaW50NjRfdCBtX3Zh
bHVlOworfTsKKworfSB9IC8vIG5hbWVzcGFjZSBKU0M6OkIzCisKKyNlbmRpZiAvLyBCM0NvbnN0
NjRWYWx1ZV9oCisKSW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM0NvbnN0RG91Ymxl
VmFsdWUuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM0NvbnN0
RG91YmxlVmFsdWUuY3BwCShyZXZpc2lvbiAwKQorKysgU291cmNlL0phdmFTY3JpcHRDb3JlL2Iz
L0IzQ29uc3REb3VibGVWYWx1ZS5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSw0MSBAQAor
LyoKKyAqIENvcHlyaWdodCAoQykgMjAxNSBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQu
CisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jt
cywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlk
ZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRp
c3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdo
dAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2lu
ZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3Qg
cmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9m
IGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRv
Y3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0
cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMu
IGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5D
TFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9G
IE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NF
IEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUgorICogQ09O
VFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUws
IFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVE
SU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdP
T0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJV
U0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAq
IE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1Ig
VE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBB
TlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklT
RUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLiAKKyAqLworCisjaW5jbHVkZSAi
Y29uZmlnLmgiCisjaW5jbHVkZSAiQjNDb25zdERvdWJsZVZhbHVlLmgiCisKK25hbWVzcGFjZSBK
U0MgeyBuYW1lc3BhY2UgQjMgeworCitDb25zdERvdWJsZVZhbHVlOjp+Q29uc3REb3VibGVWYWx1
ZSgpCit7Cit9CisKK3ZvaWQgQ29uc3REb3VibGVWYWx1ZTo6ZHVtcE1ldGEoUHJpbnRTdHJlYW0m
IG91dCkgY29uc3QKK3sKKyAgICBvdXQucHJpbnRmKCIlbGUiLCBtX3ZhbHVlKTsKK30KKworfSB9
IC8vIG5hbWVzcGFjZSBKU0M6OkIzCisKSW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9C
M0NvbnN0RG91YmxlVmFsdWUuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUv
YjMvQjNDb25zdERvdWJsZVZhbHVlLmgJKHJldmlzaW9uIDApCisrKyBTb3VyY2UvSmF2YVNjcmlw
dENvcmUvYjMvQjNDb25zdERvdWJsZVZhbHVlLmgJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSw1
OSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNSBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVz
ZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFy
eSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQg
cHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAx
LiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNv
cHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZv
bGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3Jt
IG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBs
aXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAq
ICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRo
ZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBM
RSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElF
UywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5U
SUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQ
VVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUgor
ICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lE
RU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAo
SU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElU
VVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7
IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVP
UlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElU
WSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lO
RyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElG
IEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLiAKKyAqLworCisjaWZu
ZGVmIEIzQ29uc3REb3VibGVWYWx1ZV9oCisjZGVmaW5lIEIzQ29uc3REb3VibGVWYWx1ZV9oCisK
KyNpbmNsdWRlICJCM1ZhbHVlLmgiCisKK25hbWVzcGFjZSBKU0MgeyBuYW1lc3BhY2UgQjMgewor
CitjbGFzcyBDb25zdERvdWJsZVZhbHVlIDogcHVibGljIFZhbHVlIHsKK3B1YmxpYzoKKyAgICBz
dGF0aWMgYm9vbCBhY2NlcHRzKE9wY29kZSBvcGNvZGUpIHsgcmV0dXJuIG9wY29kZSA9PSBDb25z
dERvdWJsZTsgfQorICAgIAorICAgIH5Db25zdERvdWJsZVZhbHVlKCk7CisgICAgCisgICAgZG91
YmxlIHZhbHVlKCkgY29uc3QgeyByZXR1cm4gbV92YWx1ZTsgfQorCitwcm90ZWN0ZWQ6CisgICAg
dm9pZCBkdW1wTWV0YShQcmludFN0cmVhbSYpIGNvbnN0IG92ZXJyaWRlOworCitwcml2YXRlOgor
ICAgIGZyaWVuZCBjbGFzcyBQcm9jZWR1cmU7CisKKyAgICBDb25zdERvdWJsZVZhbHVlKHVuc2ln
bmVkIGluZGV4LCBPcmlnaW4gb3JpZ2luLCBkb3VibGUgdmFsdWUpCisgICAgICAgIDogVmFsdWUo
aW5kZXgsIENvbnN0RG91YmxlLCBEb3VibGUsIG9yaWdpbikKKyAgICAgICAgLCBtX3ZhbHVlKHZh
bHVlKQorICAgIHsKKyAgICB9CisgICAgCisgICAgZG91YmxlIG1fdmFsdWU7Cit9OworCit9IH0g
Ly8gbmFtZXNwYWNlIEpTQzo6QjMKKworI2VuZGlmIC8vIEIzQ29uc3REb3VibGVWYWx1ZV9oCisK
SW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM0NvbnRyb2xWYWx1ZS5jcHAKPT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzQ29udHJvbFZhbHVlLmNwcAkocmV2
aXNpb24gMCkKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM0NvbnRyb2xWYWx1ZS5jcHAJ
KHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSw0MyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAx
NSBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24g
YW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBt
b2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNv
bmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNv
ZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxp
c3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVk
aXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5
cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xs
b3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVy
IG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBT
T0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBF
WFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQg
VE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklU
TkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8g
RVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1Ig
QU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlks
IE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8s
CisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9G
IFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9X
RVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJ
TiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdM
SUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisg
KiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9G
IFNVQ0ggREFNQUdFLiAKKyAqLworCisjaW5jbHVkZSAiY29uZmlnLmgiCisjaW5jbHVkZSAiQjND
b250cm9sVmFsdWUuaCIKKworbmFtZXNwYWNlIEpTQyB7IG5hbWVzcGFjZSBCMyB7CisKK0NvbnRy
b2xWYWx1ZTo6fkNvbnRyb2xWYWx1ZSgpCit7Cit9CisKK3ZvaWQgQ29udHJvbFZhbHVlOjpkdW1w
TWV0YShQcmludFN0cmVhbSYgb3V0KSBjb25zdAoreworICAgIENvbW1hUHJpbnRlciBjb21tYTsK
KyAgICBmb3IgKEJhc2ljQmxvY2sqIGJsb2NrIDogbV9zdWNjZXNzb3JzKQorICAgICAgICBvdXQu
cHJpbnQoY29tbWEsIHBvaW50ZXJEdW1wKGJsb2NrKSk7Cit9CisKK30gfSAvLyBuYW1lc3BhY2Ug
SlNDOjpCMworCkluZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNDb250cm9sVmFsdWUu
aAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNDb250cm9sVmFsdWUu
aAkocmV2aXNpb24gMCkKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM0NvbnRyb2xWYWx1
ZS5oCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsMTE3IEBACisvKgorICogQ29weXJpZ2h0IChD
KSAyMDE1IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1
dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQK
KyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dp
bmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3Vy
Y2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRo
aXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAy
LiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3Zl
IGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhl
IGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Ig
b3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBU
SElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkK
KyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElN
SVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFO
RCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJ
TiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxF
IEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1Q
TEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRF
RCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExP
U1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9O
KSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVU
SEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5H
IE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBV
U0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJ
VFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisKKyNpZm5kZWYgQjNDb250cm9sVmFsdWVfaAorI2Rl
ZmluZSBCM0NvbnRyb2xWYWx1ZV9oCisKKyNpbmNsdWRlICJCM1ZhbHVlLmgiCisKK25hbWVzcGFj
ZSBKU0MgeyBuYW1lc3BhY2UgQjMgeworCitjbGFzcyBCYXNpY0Jsb2NrOworCitjbGFzcyBDb250
cm9sVmFsdWUgOiBwdWJsaWMgVmFsdWUgeworcHVibGljOgorICAgIHN0YXRpYyBib29sIGFjY2Vw
dHMoT3Bjb2RlIG9wY29kZSkKKyAgICB7CisgICAgICAgIHN3aXRjaCAob3Bjb2RlKSB7CisgICAg
ICAgIGNhc2UgSnVtcDoKKyAgICAgICAgY2FzZSBCcmFuY2g6CisgICAgICAgIGNhc2UgUmV0dXJu
OgorICAgICAgICBjYXNlIE9vcHM6CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAg
Y2FzZSBTd2l0Y2g6IAorICAgICAgICAgICAgLy8gVGhpcyBpcyBoZXJlIGJlY2F1c2UgU3dpdGNo
VmFsdWUgaXMgYSBzdWJjbGFzcyBvZiBDb250cm9sVmFsdWUsIHNvIHdlIHdhbnQKKyAgICAgICAg
ICAgIC8vIHN3dGljaFZhbHVlLT5hczxDb250cm9sVmFsdWU+KCkgdG8gcmV0dXJuIG5vbi1udWxs
LgorICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAg
ICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICB0eXBlZGVmIFZlY3RvcjxC
YXNpY0Jsb2NrKiwgMj4gU3VjY2Vzc29yTGlzdDsKKworICAgIH5Db250cm9sVmFsdWUoKTsKKwor
ICAgIHVuc2lnbmVkIG51bVN1Y2Nlc3NvcnMoKSBjb25zdCB7IHJldHVybiBtX3N1Y2Nlc3NvcnMu
c2l6ZSgpOyB9CisgICAgQmFzaWNCbG9jayogc3VjY2Vzc29yKHVuc2lnbmVkIGluZGV4KSBjb25z
dCB7IHJldHVybiBtX3N1Y2Nlc3NvcnNbaV07IH0KKyAgICBCYXNpY0Jsb2NrKiYgc3VjY2Vzc29y
KHVuc2lnbmVkIGluZGV4KSB7IHJldHVybiBtX3N1Y2Nlc3NvcnNbaV07IH0KKworICAgIGNvbnN0
IFN1Y2Nlc3Nvckxpc3QmIHN1Y2Nlc3NvcnMoKSBjb25zdCB7IHJldHVybiBtX3N1Y2Nlc3NvcnM7
IH0KKworcHJvdGVjdGVkOgorICAgIHZvaWQgZHVtcE1ldGEoUHJpbnRTdHJlYW0mKSBjb25zdCBv
dmVycmlkZTsKKworICAgIC8vIFVzZSB0aGlzIGZvciBzdWJjbGFzc2VzLgorICAgIHRlbXBsYXRl
PHR5cGVuYW1lLi4uIEFyZ3VtZW50cz4KKyAgICBDb250cm9sVmFsdWUodW5zaWduZWQgaW5kZXgs
IE9wY29kZSBvcGNvZGUsIFR5cGUgdHlwZSwgT3JpZ2luIG9yaWdpbiwgQXJndW1lbnRzLi4uIGFy
Z3VtZW50cykKKyAgICAgICAgOiBWYWx1ZShpbmRleCwgb3Bjb2RlLCB0eXBlLCBvcmlnaW4sIGFy
Z3VtZW50cy4uLikKKyAgICB7CisgICAgfQorCisgICAgLy8gU3ViY2xhc3NlcyB3aWxsIHBvcHVs
YXRlIHRoaXMuCisgICAgU3VjY2Vzc29yTGlzdCBtX3N1Y2Nlc3NvcnM7CisKK3ByaXZhdGU6Cisg
ICAgZnJpZW5kIGNsYXNzIFByb2NlZHVyZTsKKworICAgIC8vIFVzZSB0aGlzIGZvciBPb3BzLgor
ICAgIENvbnRyb2xWYWx1ZSh1bnNpZ25lZCBpbmRleCwgT3Bjb2RlIG9wY29kZSwgT3JpZ2luIG9y
aWdpbikKKyAgICAgICAgOiBWYWx1ZShpbmRleCwgb3Bjb2RlLCBWb2lkLCBvcmlnaW4pCisgICAg
eworICAgICAgICBBU1NFUlQob3Bjb2RlID09IE9vcHMpOworICAgIH0KKworICAgIC8vIFVzZSB0
aGlzIGZvciBSZXR1cm4uCisgICAgQ29udHJvbFZhbHVlKHVuc2lnbmVkIGluZGV4LCBPcGNvZGUg
b3Bjb2RlLCBPcmlnaW4gb3JpZ2luLCBWYWx1ZSogcmVzdWx0KQorICAgICAgICA6IFZhbHVlKGlu
ZGV4LCBvcGNvZGUsIFZvaWQsIG9yaWdpbiwgcmVzdWx0KQorICAgIHsKKyAgICAgICAgQVNTRVJU
KG9wY29kZSA9PSBSZXR1cm4pOworICAgIH0KKworICAgIC8vIFVzZSB0aGlzIGZvciBKdW1wLgor
ICAgIENvbnRyb2xWYWx1ZSh1bnNpZ25lZCBpbmRleCwgT3Bjb2RlIG9wY29kZSwgT3JpZ2luIG9y
aWdpbiwgQmFzaWNCbG9jayogdGFyZ2V0KQorICAgICAgICA6IFZhbHVlKGluZGV4LCBvcGNvZGUs
IFZvaWQsIG9yaWdpbikKKyAgICB7CisgICAgICAgIEFTU0VSVChvcGNvZGUgPT0gSnVtcCk7Cisg
ICAgICAgIG1fc3VjY2Vzc29ycy5hcHBlbmQodGFyZ2V0KTsKKyAgICB9CisKKyAgICAvLyBVc2Ug
dGhpcyBmb3IgQnJhbmNoLgorICAgIENvbnRyb2xWYWx1ZSgKKyAgICAgICAgdW5zaWduZWQgaW5k
ZXgsIE9wY29kZSBvcGNvZGUsIE9yaWdpbiBvcmlnaW4sIFZhbHVlKiBwcmVkaWNhdGUsCisgICAg
ICAgIEJhc2ljQmxvY2sqIHllcywgQmFzaWNCbG9jayogbm8pCisgICAgICAgIDogVmFsdWUoaW5k
ZXgsIG9wY29kZSwgVm9pZCwgb3JpZ2luLCBwcmVkaWNhdGUpCisgICAgeworICAgICAgICBBU1NF
UlQob3Bjb2RlID09IEJyYW5jaCk7CisgICAgICAgIG1fc3VjY2Vzc29ycy5hcHBlbmQoeWVzKTsK
KyAgICAgICAgbV9zdWNjZXNzb3JzLmFwcGVuZChubyk7CisgICAgfQorfTsKKworfSB9IC8vIG5h
bWVzcGFjZSBKU0M6OkIzCisKKyNlbmRpZiAvLyBCM0NvbnRyb2xWYWx1ZV9oCisKSW5kZXg6IFNv
dXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM0luZGV4U2V0LmgKPT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNl
L0phdmFTY3JpcHRDb3JlL2IzL0IzSW5kZXhTZXQuaAkocmV2aXNpb24gMCkKKysrIFNvdXJjZS9K
YXZhU2NyaXB0Q29yZS9iMy9CM0luZGV4U2V0LmgJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSwx
NDEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTUgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJl
c2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5h
cnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVk
IHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICog
MS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBj
b3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBm
b2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9y
bSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMg
bGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisg
KiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0
aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQ
TEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJ
RVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFO
VElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICog
UFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IK
KyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJ
REVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMg
KElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJ
VFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRT
OyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhF
T1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJ
VFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJ
TkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJ
RiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKworI2lm
bmRlZiBCM0luZGV4U2V0X2gKKyNkZWZpbmUgQjNJbmRleFNldF9oCisKKyNpbmNsdWRlIDx3dGYv
Qml0VmVjdG9yLmg+CisjaW5jbHVkZSA8d3RmL0NvbW1hUHJpbnRlci5oPgorCituYW1lc3BhY2Ug
SlNDIHsgbmFtZXNwYWNlIEIzIHsKKworLy8gVGhpcyBpcyBhIHNldCBmb3IgdGhpbmdzIHRoYXQg
aGF2ZSBhbiBpbmRleCgpLiBJdCdzIHN1cGVyIGVmZmljaWVudCBmb3IgQmFzaWNCbG9ja3MuIEl0
J3Mgb25seQorLy8gZWZmaWNpZW50IGZvciBWYWx1ZXMgaWYgeW91IGRvbid0IGNyZWF0ZSB0b28g
bWFueSBvZiB0aGVzZSBzZXRzLCBzaW5jZSBWYWx1ZXMgY2FuIGhhdmUgdmVyeSBzcGFyc2UKKy8v
IGluZGljZXMgYW5kIHRoZXJlIGFyZSBhIGxvdCBvZiBWYWx1ZXMuCisKKy8vIElmIHlvdSB3YW50
IGEgc2V0IG9mIEJhc2ljQmxvY2tzLCB5b3UgZG8gSW5kZXhTZXQ8QmFzaWNCbG9jaz4uIFNvLCBU
ID0gQmFzaWNCbG9jay4KK3RlbXBsYXRlPHR5cGVuYW1lIFQ+CitjbGFzcyBJbmRleFNldCB7Citw
dWJsaWM6CisgICAgSW5kZXhTZXQoKQorICAgIHsKKyAgICB9CisKKyAgICBib29sIGFkZChUKiB2
YWx1ZSkKKyAgICB7CisgICAgICAgIHJldHVybiAhbV9zZXQuc2V0KHZhbHVlLT5pbmRleCgpKTsK
KyAgICB9CisKKyAgICBib29sIGNvbnRhaW5zKFQqIHZhbHVlKSBjb25zdAorICAgIHsKKyAgICAg
ICAgaWYgKCF2YWx1ZSkKKyAgICAgICAgICAgIHJldHVybiBudWxscHRyOworICAgICAgICByZXR1
cm4gbV9zZXQuZ2V0KHZhbHVlLT5pbmRleCgpKTsKKyAgICB9CisKKyAgICB0ZW1wbGF0ZTx0eXBl
bmFtZSBDb2xsZWN0aW9uVHlwZT4KKyAgICBjbGFzcyBJdGVyYWJsZSB7CisgICAgcHVibGljOgor
ICAgICAgICBJdGVyYWJsZShjb25zdCBDb2xsZWN0aW9uVHlwZSYgY29sbGVjdGlvbiwgY29uc3Qg
SW5kZXhTZXQmIHNldCkKKyAgICAgICAgICAgIDogbV9jb2xsZWN0aW9uKGNvbGxlY3Rpb24pCisg
ICAgICAgICAgICAsIG1fc2V0KHNldCkKKyAgICAgICAgeworICAgICAgICB9CisKKyAgICAgICAg
Y2xhc3MgaXRlcmF0b3IgeworICAgICAgICBwdWJsaWM6CisgICAgICAgICAgICBpdGVyYXRvcigp
CisgICAgICAgICAgICAgICAgOiBtX2NvbGxlY3Rpb24obnVsbHB0cikKKyAgICAgICAgICAgIHsK
KyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaXRlcmF0b3IoY29uc3QgQ29sbGVjdGlvblR5
cGUmIGNvbGxlY3Rpb24sIEJpdFZlY3Rvcjo6U2V0Qml0c0l0ZXJhYmxlOjppdGVyYXRvciBpdGVy
KQorICAgICAgICAgICAgICAgIDogbV9jb2xsZWN0aW9uKCZjb2xsZWN0aW9uKQorICAgICAgICAg
ICAgICAgICwgbV9pdGVyKGl0ZXIpCisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisKKyAg
ICAgICAgICAgIFQqIG9wZXJhdG9yKigpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAg
cmV0dXJuIG1fY29sbGVjdGlvbi0+YXQoKm1faXRlcik7CisgICAgICAgICAgICB9CisKKyAgICAg
ICAgICAgIGl0ZXJhdG9yJiBvcGVyYXRvcisrKCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAg
ICAgICBtX2l0ZXIrKzsKKyAgICAgICAgICAgICAgICByZXR1cm4gKnRoaXM7CisgICAgICAgICAg
ICB9CisKKyAgICAgICAgICAgIGJvb2wgb3BlcmF0b3I9PShjb25zdCBpdGVyYXRvciYgb3RoZXIp
IGNvbnN0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG1faXRlciA9PSBv
dGhlci5tX2l0ZXI7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGJvb2wgb3BlcmF0b3Ih
PShjb25zdCBpdGVyYXRvciYgb3RoZXIpIGNvbnN0CisgICAgICAgICAgICB7CisgICAgICAgICAg
ICAgICAgcmV0dXJuICEoKnRoaXMgPT0gb3RoZXIpOworICAgICAgICAgICAgfQorCisgICAgICAg
IHByaXZhdGU6CisgICAgICAgICAgICBjb25zdCBDb2xsZWN0aW9uVHlwZSogbV9jb2xsZWN0aW9u
OworICAgICAgICAgICAgQml0VmVjdG9yOjpTZXRCaXRzSXRlcmFibGU6Oml0ZXJhdG9yIG1faXRl
cjsKKyAgICAgICAgfTsKKworICAgICAgICBpdGVyYXRvciBiZWdpbigpIGNvbnN0IHsgcmV0dXJu
IGl0ZXJhdG9yKG1fY29sbGVjdGlvbiwgbV9zZXQuYmVnaW4oKSk7IH0KKyAgICAgICAgaXRlcmF0
b3IgZW5kKCkgY29uc3QgeyByZXR1cm4gaXRlcmF0b3IobV9jb2xsZWN0aW9uLCBtX3NldC5lbmQo
KSk7IH0KKworICAgIHByaXZhdGU6CisgICAgICAgIGNvbnN0IENvbGxlY3Rpb25UeXBlJiBtX2Nv
bGxlY3Rpb247CisgICAgICAgIGNvbnN0IEluZGV4U2V0JiBtX3NldDsKKyAgICB9OworCisgICAg
Ly8gRm9yIGJhc2ljIGJsb2NrcywgeW91IGRvOgorICAgIC8vIGluZGV4U2V0LnZhbHVlcyhwcm9j
ZWR1cmUpOworICAgIC8vCisgICAgLy8gRm9yIHZhbHVlcywgeW91IGRvOgorICAgIC8vIGluZGV4
U2V0LnZhbHVlcyhwcm9jZWR1cmUudmFsdWVzKCkpOworICAgIHRlbXBsYXRlPHR5cGVuYW1lIENv
bGxlY3Rpb25UeXBlPgorICAgIEl0ZXJhYmxlPENvbGxlY3Rpb25UeXBlPiB2YWx1ZXMoY29uc3Qg
Q29sbGVjdGlvblR5cGUmIGNvbGxlY3Rpb24pIGNvbnN0CisgICAgeworICAgICAgICByZXR1cm4g
SXRlcmFibGU8Q29sbGVjdGlvblR5cGU+KGNvbGxlY3Rpb24pOworICAgIH0KKworICAgIGNvbnN0
IEJpdFZlY3RvciYgaW5kaWNlcygpIGNvbnN0IHsgcmV0dXJuIG1fc2V0OyB9CisKKyAgICB2b2lk
IGR1bXAoUHJpbnRTdHJlYW0mIG91dCkgY29uc3QKKyAgICB7CisgICAgICAgIENvbW1hUHJpbnRl
ciBjb21tYTsKKyAgICAgICAgZm9yIChzaXplX3QgaW5kZXggOiBpbmRpY2VzKCkuc2V0Qml0cygp
KQorICAgICAgICAgICAgb3V0LnByaW50KGNvbW1hLCBUOjpkdW1wUHJlZml4LCBpbmRleCk7Cisg
ICAgfQorCitwcml2YXRlOgorICAgIEJpdFZlY3RvciBtX3NldDsKK307CisKK30gfSAvLyBuYW1l
c3BhY2UgSlNDOjpCMworCisjZW5kaWYgLy8gQjNJbmRleFNldF9oCisKSW5kZXg6IFNvdXJjZS9K
YXZhU2NyaXB0Q29yZS9iMy9CM0xvd2VyaW5nTWF0Y2hlci5wYXR0ZXJucwo9PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0t
LSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNMb3dlcmluZ01hdGNoZXIucGF0dGVybnMJKHJl
dmlzaW9uIDApCisrKyBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNMb3dlcmluZ01hdGNoZXIu
cGF0dGVybnMJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSw0MSBAQAorIyBDb3B5cmlnaHQgKEMp
IDIwMTUgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorIworIyBSZWRpc3RyaWJ1dGlv
biBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyMg
bW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBj
b25kaXRpb25zCisjIGFyZSBtZXQ6CisjIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29k
ZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisjICAgIG5vdGljZSwgdGhpcyBsaXN0
IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyMgMi4gUmVkaXN0
cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmln
aHQKKyMgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2lu
ZyBkaXNjbGFpbWVyIGluIHRoZQorIyAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRl
cmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorIworIyBUSElTIFNPRlRXQVJF
IElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gQU5EIElUUyBDT05UUklCVVRPUlMgYGBBUyBJUycn
CisjIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVU
IE5PVCBMSU1JVEVEIFRPLAorIyBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJ
TElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisjIFBVUlBPU0UgQVJFIERJU0NMQUlN
RUQuIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IgSVRTIENPTlRSSUJVVE9SUworIyBC
RSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBF
WEVNUExBUlksIE9SCisjIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9U
IExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCisjIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklD
RVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUworIyBJTlRFUlJV
UFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hF
VEhFUiBJTgorIyBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5H
IE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorIyBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRI
RSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GCisjIFRIRSBQT1NTSUJJ
TElUWSBPRiBTVUNIIERBTUFHRS4KKworbWF0Y2hlciBMb3dlcmluZ01hdGNoZXIKKworIyBUaGVz
ZSBydWxlcyBhcmUgY29uc2lkZXJlZCBpbiBhIGNhc2NhZGUsIHN0YXJ0aW5nIGF0IHRoZSB0b3Au
IEl0J3MgaW1wbGVuZW50ZWQgdXNpbmcgc3dpdGNoCisjIHN0YXRlbWVudHMgd2hlcmV2ZXIgcG9z
c2libGUuCisKKyMgTm90ZTogYWRkaW5nIG1vcmUgcnVsZXMgdG8gdGhpcyBtYXRjaGVyIGlzIGFu
IGV4Y2VsbGVudCB3YXkgb2YgaW1wcm92aW5nIHBlcmZvcm1hbmNlIQorCitMb2FkID0gTG9hZChh
ZGRyZXNzKQorCitBZGRMb2FkID0gQWRkKExvYWQoYWRkcmVzcyksIHZhbHVlKQorQWRkID0gQWRk
KGxlZnQsIHJpZ2h0KQorCitTdG9yZSA9IFN0b3JlKEFkZChMb2FkKGFkZHJlc3MpLCB2YWx1ZSks
IGFkZHJlc3MpCitTdG9yZSA9IFN0b3JlKEFuZChMb2FkKGFkZHJlc3MpLCB2YWx1ZSksIGFkZHJl
c3MpCitTdG9yZSA9IFN0b3JlKHZhbHVlLCBhZGRyZXNzKQorCitSZXR1cm4gPSBSZXR1cm4odmFs
dWUpCisKSW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM01lbW9yeVZhbHVlLmNwcAo9
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNNZW1vcnlWYWx1ZS5jcHAJ
KHJldmlzaW9uIDApCisrKyBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNNZW1vcnlWYWx1ZS5j
cHAJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSw0MiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykg
MjAxNSBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRp
b24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Cisg
KiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5n
IGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNl
IGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlz
IGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4g
UmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBj
b3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBm
b2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90
aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJ
UyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisg
KiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlU
RUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQg
RklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4g
Tk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBG
T1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExB
UlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQg
VE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NT
IE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikg
SE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhF
UiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBO
RUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNF
CisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZ
IE9GIFNVQ0ggREFNQUdFLiAKKyAqLworCisjaW5jbHVkZSAiY29uZmlnLmgiCisjaW5jbHVkZSAi
QjNNZW1vcnlWYWx1ZS5oIgorCituYW1lc3BhY2UgSlNDIHsgbmFtZXNwYWNlIEIzIHsKKworTWVt
b3J5VmFsdWU6On5NZW1vcnlWYWx1ZSgpCit7Cit9CisKK3ZvaWQgTWVtb3J5VmFsdWU6OmR1bXBN
ZXRhKFByaW50U3RyZWFtJiBvdXQpIGNvbnN0Cit7CisgICAgaWYgKG1fb2Zmc2V0KQorICAgICAg
ICBvdXQucHJpbnQoIm9mZnNldCA9ICIsIG1fb2Zmc2V0KTsKK30KKworfSB9IC8vIG5hbWVzcGFj
ZSBKU0M6OkIzCisKSW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM01lbW9yeVZhbHVl
LmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzTWVtb3J5VmFsdWUu
aAkocmV2aXNpb24gMCkKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM01lbW9yeVZhbHVl
LmgJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSwxNDIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMp
IDIwMTUgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0
aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAor
ICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2lu
ZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJj
ZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhp
cyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIu
IFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUg
Y29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUg
Zm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBv
dGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRI
SVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQor
ICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1J
VEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5E
IEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElO
IE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUg
Rk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBM
QVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVE
IFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9T
UyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04p
IEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRI
RVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcg
TkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVT
RQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElU
WSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKworI2lmbmRlZiBCM01lbW9yeVZhbHVlX2gKKyNkZWZp
bmUgQjNNZW1vcnlWYWx1ZV9oCisKKyNpbmNsdWRlICJCM1ZhbHVlLmgiCisKK25hbWVzcGFjZSBK
U0MgeyBuYW1lc3BhY2UgQjMgeworCitjbGFzcyBNZW1vcnlWYWx1ZSA6IHB1YmxpYyBWYWx1ZSB7
CitwdWJsaWM6CisgICAgc3RhdGljIGJvb2wgYWNjZXB0cyhPcGNvZGUgb3Bjb2RlKQorICAgIHsK
KyAgICAgICAgc3dpdGNoIChvcGNvZGUpIHsKKyAgICAgICAgY2FzZSBMb2FkOFo6CisgICAgICAg
IGNhc2UgTG9hZDhTOgorICAgICAgICBjYXNlIExvYWQxNlo6CisgICAgICAgIGNhc2UgTG9hZDE2
UzoKKyAgICAgICAgY2FzZSBMb2FkRmxvYXQ6CisgICAgICAgIGNhc2UgTG9hZDoKKyAgICAgICAg
Y2FzZSBTdG9yZTg6CisgICAgICAgIGNhc2UgU3RvcmUxNjoKKyAgICAgICAgY2FzZSBTdG9yZUZs
b2F0OgorICAgICAgICBjYXNlIFN0b3JlOgorICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAg
ICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICB9
CisKKyAgICB+TWVtb3J5VmFsdWUoKTsKKworICAgIGludHB0cl90IG9mZnNldCgpIGNvbnN0IHsg
cmV0dXJuIG1fb2Zmc2V0OyB9CisKK3Byb3RlY3RlZDoKKyAgICB2b2lkIGR1bXBNZXRhKFByaW50
U3RyZWFtJikgY29uc3Qgb3ZlcnJpZGU7CisKK3ByaXZhdGU6CisgICAgZnJpZW5kIGNsYXNzIFBy
b2NlZHVyZTsKKworICAgIC8vIFVzZSB0aGlzIGZvcm0gZm9yIExvYWQgKGJ1dCBub3QgTG9hZDha
LCBMb2FkOFMsIG9yIGFueSBvZiB0aGUgTG9hZHMgdGhhdCBoYXZlIGEgc3VmZml4IHRoYXQKKyAg
ICAvLyBkZXNjcmliZXMgdGhlIHJldHVybmVkIHR5cGUpLgorICAgIE1lbW9yeVZhbHVlKAorICAg
ICAgICB1bnNpZ25lZCBpbmRleCwgT3Bjb2RlIG9wY29kZSwgVHlwZSB0eXBlLCBPcmlnaW4gb3Jp
Z2luLCBWYWx1ZSogcG9pbnRlciwKKyAgICAgICAgaW50cHRyX3Qgb2Zmc2V0ID0gMCkKKyAgICAg
ICAgOiBWYWx1ZShpbmRleCwgb3Bjb2RlLCB0eXBlLCBvcmlnaW4sIHBvaW50ZXIpCisgICAgICAg
ICwgbV9vZmZzZXQob2Zmc2V0KQorICAgIHsKKyAgICAgICAgaWYgKCFBU1NFUlRfRElTQUJMRUQp
IHsKKyAgICAgICAgICAgIHN3aXRjaCAob3Bjb2RlKSB7CisgICAgICAgICAgICBjYXNlIExvYWQ6
CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIExvYWQ4WjoKKyAgICAg
ICAgICAgIGNhc2UgTG9hZDhTOgorICAgICAgICAgICAgY2FzZSBMb2FkMTZaOgorICAgICAgICAg
ICAgY2FzZSBMb2FkMTZTOgorICAgICAgICAgICAgICAgIEFTU0VSVCh0eXBlID09IEludDMyKTsK
KyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgTG9hZEZsb2F0OgorICAg
ICAgICAgICAgICAgIEFTU0VSVCh0eXBlID09IERvdWJsZSk7CisgICAgICAgICAgICAgICAgYnJl
YWs7CisgICAgICAgICAgICBjYXNlIFN0b3JlODoKKyAgICAgICAgICAgIGNhc2UgU3RvcmUxNjoK
KyAgICAgICAgICAgIGNhc2UgU3RvcmVGbG9hdDoKKyAgICAgICAgICAgIGNhc2UgU3RvcmU6Cisg
ICAgICAgICAgICAgICAgQVNTRVJUKHR5cGUgPT0gVm9pZCk7CisgICAgICAgICAgICAgICAgYnJl
YWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIEFTU0VSVF9OT1RfUkVB
Q0hFRCgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLy8gVXNlIHRo
aXMgZm9ybSBmb3IgbG9hZHMgd2hlcmUgdGhlIHJldHVybiB0eXBlIGlzIGltcGxpZWQuCisgICAg
TWVtb3J5VmFsdWUodW5zaWduZWQgaW5kZXgsIE9wY29kZSBvcGNvZGUsIE9yaWdpbiBvcmlnaW4s
IFZhbHVlKiBwb2ludGVyLCBpbnRwdHJfdCBvZmZzZXQgPSAwKQorICAgICAgICA6IFZhbHVlKGlu
ZGV4LCBvcGNvZGUsIG9wY29kZSA9PSBMb2FkRmxvYXQgPyBEb3VibGUgOiBJbnQzMiwgb3JpZ2lu
LCBwb2ludGVyKQorICAgICAgICAsIG1fb2Zmc2V0KG9mZnNldCkKKyAgICB7CisgICAgICAgIGlm
ICghQVNTRVJUX0RJU0FCTEVEKSB7CisgICAgICAgICAgICBzd2l0Y2ggKG9wY29kZSkgeworICAg
ICAgICAgICAgY2FzZSBMb2FkOFo6CisgICAgICAgICAgICBjYXNlIExvYWQ4UzoKKyAgICAgICAg
ICAgIGNhc2UgTG9hZDE2WjoKKyAgICAgICAgICAgIGNhc2UgTG9hZDE2UzoKKyAgICAgICAgICAg
IGNhc2UgTG9hZEZsb2F0OgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVm
YXVsdDoKKyAgICAgICAgICAgICAgICBBU1NFUlRfTk9UX1JFQUNIRUQoKTsKKyAgICAgICAgICAg
ICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIFVz
ZSB0aGlzIGZvcm0gZm9yIHN0b3Jlcy4KKyAgICBNZW1vcnlWYWx1ZSgKKyAgICAgICAgdW5zaWdu
ZWQgaW5kZXgsIE9wY29kZSBvcGNvZGUsIE9yaWdpbiBvcmlnaW4sIFZhbHVlKiB2YWx1ZSwgVmFs
dWUqIHBvaW50ZXIsCisgICAgICAgIGludHB0cl90IG9mZnNldCA9IDApCisgICAgICAgIDogVmFs
dWUoaW5kZXgsIG9wY29kZSwgVm9pZCwgb3JpZ2luLCB2YWx1ZSwgcG9pbnRlcikKKyAgICAgICAg
LCBtX29mZnNldChvZmZzZXQpCisgICAgeworICAgICAgICBpZiAoIUFTU0VSVF9ESVNBQkxFRCkg
eworICAgICAgICAgICAgc3dpdGNoIChvcGNvZGUpIHsKKyAgICAgICAgICAgIGNhc2UgU3RvcmU4
OgorICAgICAgICAgICAgY2FzZSBTdG9yZTE2OgorICAgICAgICAgICAgY2FzZSBTdG9yZUZsb2F0
OgorICAgICAgICAgICAgY2FzZSBTdG9yZToKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAg
ICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgQVNTRVJUX05PVF9SRUFDSEVEKCk7Cisg
ICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9
OworCit9IH0gLy8gbmFtZXNwYWNlIEpTQzo6QjMKKworI2VuZGlmIC8vIEIzTWVtb3J5VmFsdWVf
aAorCkluZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNPcGNvZGUuY3BwCj09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM09wY29kZS5jcHAJKHJldmlzaW9uIDAp
CisrKyBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNPcGNvZGUuY3BwCSh3b3JraW5nIGNvcHkp
CkBAIC0wLDAgKzEsNDcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTUgQXBwbGUgSW5jLiBB
bGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291
cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBh
cmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBh
cmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWlu
IHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlv
bnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBp
biBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBu
b3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWlt
ZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJv
dmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJP
VklERUQgQlkgQVBQTEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBM
SUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElN
UExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFS
VElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQ
UExFIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElO
RElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5U
SUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1F
TlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9S
CisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFO
RCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNU
UklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhF
UldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZU
V0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4g
CisgKi8KKworI2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgIkIzT3Bjb2RlLmgiCisKKyNp
bmNsdWRlIDx3dGYvUHJpbnRTdHJlYW0uaD4KKworbmFtZXNwYWNlIFdURiB7CisKK3VzaW5nIG5h
bWVzcGFjZSBKU0M6OkIzOworCit2b2lkIHByaW50SW50ZXJuYWwoUHJpbnRTdHJlYW0mIG91dCwg
T3Bjb2RlIG9wY29kZSkKK3sKKyAgICBzd2l0Y2ggKG9wY29kZSkgeworICAgIGNhc2UgSWRlbnRp
dHk6CisgICAgICAgIG91dC5wcmludCgiSWRlbnRpdHkiKTsKKyAgICAgICAgcmV0dXJuOworICAg
ICAgICAvLyBGSVhNRQorICAgIH0KKyAgICBSRUxFQVNFX0FTU0VSVF9OT1RfUkVBQ0hFRCgpOwor
fQorCit9IC8vIG5hbWVzcGFjZSBXVEYKKwpJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL2Iz
L0IzT3Bjb2RlLmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzT3Bj
b2RlLmgJKHJldmlzaW9uIDApCisrKyBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNPcGNvZGUu
aAkod29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDIwMyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykg
MjAxNSBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRp
b24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Cisg
KiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5n
IGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNl
IGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlz
IGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4g
UmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBj
b3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBm
b2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90
aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJ
UyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisg
KiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlU
RUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQg
RklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4g
Tk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBG
T1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExB
UlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQg
VE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NT
IE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikg
SE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhF
UiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBO
RUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNF
CisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZ
IE9GIFNVQ0ggREFNQUdFLiAKKyAqLworCisjaWZuZGVmIEIzT3Bjb2RlX2gKKyNkZWZpbmUgQjNP
cGNvZGVfaAorCisjaW5jbHVkZSA8d3RmL1N0ZExpYkV4dHJhcy5oPgorCituYW1lc3BhY2UgSlND
IHsgbmFtZXNwYWNlIEIzIHsKKworZW51bSBPcGNvZGUgOiBpbnQxNl90IHsKKyAgICAvLyBBIG5v
LW9wIHRoYXQgcmV0dXJucyBWb2lkLCB1c2VmdWwgZm9yIHdoZW4geW91IHdhbnQgdG8gcmVtb3Zl
IGEgdmFsdWUuCisgICAgTm9wLAorICAgICAKKyAgICAvLyBQb2x5bW9ycGhpYyBpZGVudGl0eSwg
dXNhYmxlIHdpdGggYW55IHZhbHVlIHR5cGUuCisgICAgSWRlbnRpdHksCisKKyAgICAvLyBDb25z
dGFudHMuIFVzZSB0aGUgQ29uc3RWYWx1ZSogY2xhc3Nlcy4gQ29uc3RhbnRzIGV4aXN0IGluIHRo
ZSBjb250cm9sIGZsb3csIHNvIHRoYXQgd2UgY2FuCisgICAgLy8gcmVhc29uIGFib3V0IHdoZXJl
IHdlIHdvdWxkIGNvbnN0cnVjdCB0aGVtLiBMYXJnZSBjb25zdGFudHMgYXJlIGV4cGVuc2l2ZSB0
byBjcmVhdGUuCisgICAgQ29uc3QzMiwKKyAgICBDb25zdDY0LAorICAgIENvbnN0RG91YmxlLAor
CisgICAgLy8gVGhlIG1hZ2ljYWwgc3RhY2sgc2xvdC4gVGhpcyBpcyB2aWV3ZWQgYXMgZXhlY3V0
aW5nIGF0IHRoZSB0b3Agb2YgdGhlIHByb2dyYW0gcmVnYXJkbGVzcyBvZgorICAgIC8vIHdoZXJl
IGluIGNvbnRyb2wgZmxvdyB5b3UgcHV0IGl0LiBFYWNoIGluc3RhbmNlIG9mIGEgU3RhY2tTbG90
IFZhbHVlIGdldHMgYSBkaXNqb2ludCByYW5nZSBvZgorICAgIC8vIHN0YWNrIG1lbW9yeS4gVXNl
IHRoZSBTdGFja1Nsb3RWYWx1ZSBjbGFzcy4KKyAgICBTdGFja1Nsb3QsCisKKyAgICAvLyBUaGUg
bWFnaWNhbCBhcmd1bWVudCByZWdpc3Rlci4gVGhpcyBpcyB2aWV3ZWQgYXMgZXhlY3V0aW5nIGF0
IHRoZSB0b3Agb2YgdGhlIHByb2dyYW0KKyAgICAvLyByZWdhcmRsZXNzIG9mIHdoZXJlIGluIGNv
bnRyb2wgZmxvdyB5b3UgcHV0IGl0LCBhbmQgdGhlIGNvbXBpbGVyIHRha2VzIGNhcmUgdG8gZW5z
dXJlIHRoYXQgd2UKKyAgICAvLyBkb24ndCBjbG9iYmVyIHRoZSB2YWx1ZSBieSByZWdpc3RlciBh
bGxvY2F0aW9uIG9yIGNhbGxzIChlaXRoZXIgYnkgc2F2aW5nIHRoZSBhcmd1bWVudCB0byB0aGUK
KyAgICAvLyBzdGFjayBvciBwcmVzZXJ2aW5nIGl0IGluIGEgY2FsbGVlLXNhdmUgcmVnaXN0ZXIp
LiBVc2UgdGhlIEFyZ3VtZW50UmVnVmFsdWUgY2xhc3MuIFRoZSByZXR1cm4KKyAgICAvLyB0eXBl
IGlzIGVpdGhlciBwb2ludGVyKCkgKGZvciBHUFJzKSBvciBEb3VibGUgKGZvciBGUFJzKS4KKyAg
ICBBcmd1bWVudFJlZywKKworICAgIC8vIFRoZSBmcmFtZSBwb2ludGVyLiBZb3UgY2FuIHB1dCB0
aGlzIGFueXdoZXJlIGluIGNvbnRyb2wgZmxvdyBidXQgaXQgd2lsbCBhbHdheXMgeWllbGQgdGhl
CisgICAgLy8gZnJhbWUgcG9pbnRlciwgd2l0aCBhIGNhdmVhdDogaWYgb3VyIGNvbXBpbGVyIGNo
YW5nZXMgdGhlIGZyYW1lIHBvaW50ZXIgdGVtcG9yYXJpbHkgZm9yIHNvbWUKKyAgICAvLyBzaWxs
eSByZWFzb24sIHRoZSBGcmFtZVBvaW50ZXIgaW50cmluc2ljIHdpbGwgcmV0dXJuIHdoZXJlIHRo
ZSBmcmFtZSBwb2ludGVyICpzaG91bGQqIGJlIG5vdAorICAgIC8vIHdoZXJlIGl0IGhhcHBlbnMg
dG8gYmUgcmlnaHQgbm93LgorICAgIEZyYW1lUG9pbnRlciwKKworICAgIC8vIFBvbHltb3JwaGlj
IG1hdGgsIHVzYWJsZSB3aXRoIGFueSB2YWx1ZSB0eXBlLgorICAgIEFkZCwKKyAgICBTdWIsCisg
ICAgTXVsLAorICAgIERpdiwKKworICAgIC8vIEludGVnZXIgbWF0aC4KKyAgICBDaGlsbERpdiwg
Ly8gZG9lc24ndCB0cmFwIGV2ZXIsIGJlaGF2ZXMgbGlrZSBKUyAoeC95KXwwLgorICAgIE1vZCwK
KyAgICBCaXRBbmQsCisgICAgQml0T3IsCisgICAgQml0WG9yLAorICAgIFNobCwKKyAgICBTU2hy
LAorICAgIFpTaHIsCisKKyAgICAvLyBDYXN0cyBhbmQgc3VjaC4KKyAgICAvLyBUYWtlcyBhbmQg
cmV0dXJucyBJbnQzMjoKKyAgICBTRXh0OCwKKyAgICBTRXh0MTYsCisgICAgLy8gVGFrZXMgSW50
MzIgYW5kIHJldHVybnMgSW50NjQ6CisgICAgU0V4dDMyLAorICAgIFpFeHQzMiwKKyAgICAvLyBU
YWtlcyBhbmQgcmV0dXJucyBEb3VibGU6CisgICAgRlJvdW5kLAorICAgIC8vIFRha2VzIGludHMg
YW5kIHJldHVybnMgRG91YmxlOgorICAgIElUb0QsCisgICAgLy8gVGFrZXMgRG91YmxlIGFuZCBy
ZXR1cm5zIEludDMyOgorICAgIERUb0kzMiwKKworICAgIC8vIFBvbHltb3JwaGljIGNvbXBhcmlz
b25zLCB1c2FibGUgd2l0aCBhbnkgdmFsdWUgdHlwZS4gUmV0dXJucyBpbnQzMiAwIG9yIDEuIE5v
dGUgdGhhdCAiTm90IgorICAgIC8vIGlzIGp1c3QgRXF1YWwoeCwgMCkuCisgICAgRXF1YWwsCisg
ICAgTm90RXF1YWwsCisgICAgTGVzc1RoYW4sCisgICAgR3JlYXRlclRoYW4sCisgICAgTGVzc0Vx
dWFsLAorICAgIEdyZWF0ZXJFcXVhbCwKKworICAgIC8vIEludGVnZXIgY29tcGFyaXNvbnMuIFJl
dHVybnMgaW50MzIgMCBvciAxLgorICAgIEFib3ZlLAorICAgIEJlbG93LAorICAgIEFib3ZlRXF1
YWwKKyAgICBCZWxvd0VxdWFsLAorCisgICAgLy8gTWVtb3J5IGxvYWRzLiBPcGNvZGUgaW5kaWNh
dGVzIGhvdyB3ZSBsb2FkIGFuZCB0aGUgbG9hZGVkIHR5cGUuIFRoZXNlIHVzZSBNZW1vcnlWYWx1
ZS4KKyAgICAvLyBUaGVzZSByZXR1cm4gSW50MzI6CisgICAgTG9hZDhaLAorICAgIExvYWQ4UywK
KyAgICBMb2FkMTZaLAorICAgIExvYWQxNlMsCisgICAgLy8gVGhpcyByZXR1cm5zIERvdWJsZToK
KyAgICBMb2FkRmxvYXQsCisgICAgLy8gVGhpcyByZXR1cm4gd2hhdGV2ZXIgdGhlIHJldHVybiB0
eXBlIGlzOgorICAgIExvYWQsCisKKyAgICAvLyBNZW1vcnkgc3RvcmVzLiBPcGNvZGUgaW5kaWNh
dGVzIGhvdyB0aGUgdmFsdWUgaXMgc3RvcmVkLiBUaGVzZSB1c2UgTWVtb3J5VmFsdWUuCisgICAg
Ly8gVGhlc2UgdGFrZSBhbiBJbnQzMiB2YWx1ZToKKyAgICBTdG9yZTgsCisgICAgU3RvcmUxNiwK
KyAgICAvLyBUaGlzIHRha2VzIGEgRG91YmxlIHZhbHVlOgorICAgIFN0b3JlRmxvYXQsCisgICAg
Ly8gVGhpcyBpcyBhIHBvbHltb3JwaGljIHN0b3JlIGZvciBJbnQzMiwgSW50NjQsIGFuZCBEb3Vi
bGU6CisgICAgU3RvcmUsCisKKyAgICAvLyBUaGlzIGlzIGEgcmVndWxhciBvcmRpbmFyeSBDIGZ1
bmN0aW9uIGNhbGwsIHVzaW5nIHRoZSBzeXN0ZW0gQyBjYWxsaW5nIGNvbnZlbnRpb24uIE1ha2Ug
c3VyZQorICAgIC8vIHRoYXQgdGhlIGFyZ3VtZW50cyBhcmUgcGFzc2VkIHVzaW5nIHRoZSByaWdo
dCB0eXBlcy4KKyAgICBDQ2FsbCwKKworICAgIC8vIFRoaXMgaXMgYSBwYXRjaHBvaW50LiBVc2Ug
dGhlIFBhdGNocG9pbnRWYWx1ZSBjbGFzcy4gVGhpcyBpcyB2aWV3ZWQgYXMgYmVoYXZpbmcgbGlr
ZSBhIGNhbGwsCisgICAgLy8gYnV0IG9ubHkgZW1pdHMgY29kZSB2aWEgYSBjb2RlIGdlbmVyYXRp
b24gY2FsbGJhY2suIFRoYXQgY2FsbGJhY2sgZ2V0cyB0byBlbWl0IGNvZGUgaW5saW5lLgorICAg
IC8vIFlvdSBjYW4gcGFzcyBhIHN0YWNrbWFwIGFsb25nIHdpdGggY29uc3RyYWludHMgb24gaG93
IGVhY2ggc3RhY2ttYXAgYXJndW1lbnQgbXVzdCBiZSBwYXNzZWQuCisgICAgLy8gSXQncyBsZWdh
bCB0byByZXF1ZXN0IHRoYXQgYSBzdGFja21hcCBhcmd1bWVudCBpcyBpbiBzb21lIHJlZ2lzdGVy
IGFuZCBpdCdzIGxlZ2FsIHRvIHJlcXVlc3QKKyAgICAvLyB0aGF0IGEgc3RhY2ttYXAgYXJndW1l
bnQgaXMgYXQgc29tZSBvZmZzZXQgZnJvbSB0aGUgdG9wIG9mIHRoZSBhcmd1bWVudCBwYXNzaW5n
IGFyZWEgb24gdGhlCisgICAgLy8gc3RhY2suCisgICAgUGF0Y2hwb2ludCwKKworICAgIC8vIENo
ZWNrZWQgbWF0aC4gVXNlIHRoZSBDaGVja1ZhbHVlIGNsYXNzLiBMaWtlIGEgUGF0Y2hwb2ludCwg
dGhpcyB0YWtlcyBhIGNvZGUgZ2VuZXJhdGlvbgorICAgIC8vIGNhbGxiYWNrLiBUaGF0IGNhbGxi
YWNrIGdldHMgdG8gZW1pdCBzb21lIGNvZGUgYWZ0ZXIgdGhlIGVwaWxvZ3VlLCBhbmQgZ2V0cyB0
byBsaW5rIHRoZSBqdW1wCisgICAgLy8gZnJvbSB0aGUgY2hlY2ssIGFuZCB0aGUgY2hvaWNlIG9m
IHJlZ2lzdGVycy4gWW91IGFsc28gZ2V0IHRvIHN1cHBseSBhIHN0YWNrbWFwLiBOb3RlIHRoYXQg
eW91CisgICAgLy8gYXJlIG5vdCBhbGxvd2VkIHRvIGp1bXAgYmFjayBpbnRvIHRoZSBtYWlubGlu
ZSBjb2RlIGZyb20geW91ciBzbG93IHBhdGgsIHNpbmNlIHRoZSBjb21waWxlcgorICAgIC8vIHdp
bGwgYXNzdW1lIHRoYXQgdGhlIGV4ZWN1dGlvbiBvZiB0aGVzZSBpbnN0cnVjdGlvbnMgcHJvdmVz
IHRoYXQgb3ZlcmZsb3cgZGlkbid0IGhhcHBlbi4gRm9yCisgICAgLy8gZXhhbXBsZSwgaWYgeW91
IGhhdmUgdHdvIENoZWNrQWRkJ3M6CisgICAgLy8KKyAgICAvLyBhID0gQ2hlY2tBZGQoeCwgeSkK
KyAgICAvLyBiID0gQ2hlY2tBZGQoeCwgeSkKKyAgICAvLworICAgIC8vIFRoZW4gaXQncyB2YWxp
ZCB0byBjaGFuZ2UgdGhpcyB0bzoKKyAgICAvLworICAgIC8vIGEgPSBDaGVja0FkZCh4LCB5KQor
ICAgIC8vIGIgPSBJZGVudGl0eShhKQorICAgIC8vCisgICAgLy8gVGhpcyBpcyB2YWxpZCByZWdh
cmRsZXNzIG9mIHRoZSBjYWxsYmFja3MgdXNlZCBieSB0aGUgdHdvIENoZWNrQWRkcy4gVGhleSBt
YXkgaGF2ZSBkaWZmZXJlbnQKKyAgICAvLyBjYWxsYmFja3MuIFlldCwgdGhpcyB0cmFuc2Zvcm1h
dGlvbiBpcyB2YWxpZCBldmVuIGlmIHRoZXkgYXJlIGRpZmZlcmVudCBiZWNhdXNlIHdlIGtub3cg
dGhhdAorICAgIC8vIGFmdGVyIHRoZSBmaXJzdCBDaGVja0FkZCBleGVjdXRlcywgdGhlIHNlY29u
ZCBDaGVja0FkZCBjb3VsZCBub3QgaGF2ZSBwb3NzaWJseSB0YWtlbiBzbG93CisgICAgLy8gcGF0
aC4gVGhlcmVmb3JlLCB0aGUgc2Vjb25kIENoZWNrQWRkJ3MgY2FsbGJhY2sgaXMgaXJyZWxldmFu
dC4KKyAgICBDaGVja0FkZCwKKyAgICBDaGVja1N1YiwKKyAgICBDaGVja011bCwKKworICAgIC8v
IENoZWNrIHRoYXQgc2lkZS1leGl0cy4gVXNlIHRoZSBDaGVja1ZhbHVlIGNsYXNzLiBMaWtlIENo
ZWNrQWRkIGFuZCBmcmllbmRzLCB0aGlzIGhhcyBhCisgICAgLy8gc3RhY2ttYXAgd2l0aCBhIGdl
bmVyYXRpb24gY2FsbGJhY2suIFRoaXMgdGFrZXMgYW4gSW50MzIgYXJndW1lbnQgdGhhdCB0aGlz
IGJyYW5jaGVzIG9uLCB3aXRoCisgICAgLy8gZnVsbCBicmFuY2ggZnVzaW9uIGluIHRoZSBpbnN0
cnVjdGlvbiBzZWxlY3Rvci4gQSB0cnVlIHZhbHVlIGp1bXBzIHRvIHRoZSBnZW5lcmF0b3IncyBz
bG93CisgICAgLy8gcGF0aC4KKyAgICBDaGVjaywKKworICAgIC8vIFNTQSBzdXBwb3J0LCBpbiB0
aGUgc3R5bGUgb2YgREZHIFNTQS4KKyAgICBVcHNpbG9uLCAvLyBUaGlzIHVzZXMgdGhlIFVwc2ls
b25WYWx1ZSBjbGFzcy4KKyAgICBQaGksCisKKyAgICAvLyBKdW1wLiBVc2VzIHRoZSBDb250cm9s
VmFsdWUgY2xhc3MuCisgICAgSnVtcCwKKyAgICAKKyAgICAvLyBQb2x5bW9ycGhpYyBicmFuY2gs
IHVzYWJsZSB3aXRoIGFueSB2YWx1ZSB0eXBlLiBCcmFuY2hlcyBpZiBub3QgZXF1YWwgdG8gemVy
by4gVXNlcyB0aGUKKyAgICAvLyBDb250cm9sVmFsdWUgY2xhc3MsIHdpdGggdGhlIDAtaW5kZXgg
c3VjY2Vzc29yIGJlaW5nIHRoZSB0cnVlIHN1Y2Nlc3Nvci4KKyAgICBCcmFuY2gsCisKKyAgICAv
LyBTd2l0Y2guIFN3aXRjaGVzIG92ZXIgZWl0aGVyIEludDMyIG9yIEludDY0LiBVc2VzIHRoZSBT
d2l0Y2hWYWx1ZSBjbGFzcy4KKyAgICBTd2l0Y2gsCisKKyAgICAvLyBSZXR1cm4uIE5vdGUgdGhh
dCBCMyBwcm9jZWR1cmVzIGRvbid0IGtub3cgdGhlaXIgcmV0dXJuIHR5cGUsIHNvIHRoaXMgY2Fu
IGp1c3QgcmV0dXJuIGFueQorICAgIC8vIHR5cGUuIFVzZXMgdGhlIENvbnRyb2xWYWx1ZSBjbGFz
cy4KKyAgICBSZXR1cm4sCisKKyAgICAvLyBUaGlzIGlzIGEgdGVybWluYWwgdGhhdCBpbmRpY2F0
ZXMgdGhhdCB3ZSB3aWxsIG5ldmVyIGdldCBoZXJlLiBVc2VzIHRoZSBDb250cm9sVmFsdWUgY2xh
c3MuCisgICAgT29wcworfTsKKworfSB9IC8vIG5hbWVzcGFjZSBKU0M6OkIzCisKK25hbWVzcGFj
ZSBXVEYgeworCitjbGFzcyBQcmludFN0cmVhbTsKKwordm9pZCBwcmludEludGVybmFsKFByaW50
U3RyZWFtJiwgSlNDOjpCMzo6T3Bjb2RlKTsKKworfSAvLyBuYW1lc3BhY2UgV1RGCisKKyNlbmRp
ZiAvLyBCM09wY29kZV9oCisKSW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM09yaWdp
bi5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzT3JpZ2luLmNw
cAkocmV2aXNpb24gMCkKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM09yaWdpbi5jcHAJ
KHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSwzNyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAx
NSBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24g
YW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBt
b2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNv
bmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNv
ZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxp
c3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVk
aXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5
cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xs
b3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVy
IG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBT
T0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBF
WFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQg
VE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklU
TkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8g
RVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1Ig
QU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlks
IE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8s
CisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9G
IFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9X
RVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJ
TiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdM
SUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisg
KiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9G
IFNVQ0ggREFNQUdFLiAKKyAqLworCisjaW5jbHVkZSAiY29uZmlnLmgiCisjaW5jbHVkZSAiQjNP
cmlnaW4uaCIKKworbmFtZXNwYWNlIEpTQyB7IG5hbWVzcGFjZSBCMyB7CisKK3ZvaWQgT3JpZ2lu
OjpkdW1wKFByaW50U3RyZWFtJiBvdXQpIGNvbnN0Cit7CisgICAgb3V0LnByaW50KCJPcmlnaW4o
IiwgUmF3UG9pbnRlcihtX2RhdGEpLCAiKSIpOworfQorCit9IH0gLy8gbmFtZXNwYWNlIEpTQzo6
QjMKKwpJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzT3JpZ2luLmgKPT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PQotLS0gU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzT3JpZ2luLmgJKHJldmlzaW9uIDApCisr
KyBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNPcmlnaW4uaAkod29ya2luZyBjb3B5KQpAQCAt
MCwwICsxLDU1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE1IEFwcGxlIEluYy4gQWxsIHJp
Z2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBh
bmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBl
cm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1l
dDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUg
YWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFu
ZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmlu
YXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNl
LCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGlu
IHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVk
IHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVE
IEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBX
QVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVE
IFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VM
QVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJ
TkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVD
VCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBE
QU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9G
IFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICog
UFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04g
QU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1Qg
TElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNF
KSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUs
IEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICov
CisKKyNpZm5kZWYgQjNPcmlnaW5faAorI2RlZmluZSBCM09yaWdpbl9oCisKKyNpbmNsdWRlIDx3
dGYvUHJpbnRTdHJlYW0uaD4KKworbmFtZXNwYWNlIEpTQyB7IG5hbWVzcGFjZSBCMyB7CisKKy8v
IFdob2V2ZXIgZ2VuZXJhdGVzIEIzSVIgY2FuIGNob29zZSB0byBwdXQgb3JpZ2lucyBvbiB2YWx1
ZXMuIFdoZW4geW91IGRvIHRoaXMsIEIzIHdpbGwgYmUgYWJsZSB0bworLy8gYWNjb3VudCwgZG93
biB0byB0aGUgbWFjaGluZSBjb2RlLCB3aGljaCBpbnN0cnVjdGlvbiBjb3JyZXNwb25kcyB0byB3
aGljaCBvcmlnaW4uIEIzCisvLyB0cmFuc2Zvcm1hdGlvbnMgbXVzdCBwcmVzZXJ2ZSBPcmlnaW5z
IGNhcmVmdWxseS4gSXQncyBhbiBlcnJvciB0byB3cml0ZSBhIHRyYW5zZm9ybWF0aW9uIHRoYXQK
Ky8vIGVpdGhlciBkcm9wcyBPcmlnaW5zIG9yIGxpZXMgYWJvdXQgdGhlbS4KK2NsYXNzIE9yaWdp
biB7CitwdWJsaWM6CisgICAgZXhwbGljaXQgT3JpZ2luKGNvbnN0IHZvaWQqIGRhdGEgPSBudWxs
cHRyKQorICAgICAgICA6IG1fZGF0YShkYXRhKQorICAgIHsKKyAgICB9CisKKyAgICBjb25zdCB2
b2lkKiBkYXRhKCkgY29uc3QgeyByZXR1cm4gbV9kYXRhOyB9CisKKyAgICB2b2lkIGR1bXAoUHJp
bnRTdHJlYW0mKSBjb25zdDsKKyAgICAKK3ByaXZhdGU6CisgICAgY29uc3Qgdm9pZCogbV9kYXRh
OworfTsKKworfSB9IC8vIG5hbWVzcGFjZSBKU0M6OkIzCisKKyNlbmRpZiAvLyBCM09yaWdpbl9o
CisKSW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM1BhdGNocG9pbnRWYWx1ZS5jcHAK
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzUGF0Y2hwb2ludFZhbHVl
LmNwcAkocmV2aXNpb24gMCkKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM1BhdGNocG9p
bnRWYWx1ZS5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSw0NiBAQAorLyoKKyAqIENvcHly
aWdodCAoQykgMjAxNSBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVk
aXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3
aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUg
Zm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMg
b2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90
aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVy
LgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRo
ZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMg
YW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24g
YW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisg
KgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIGBgQVMgSVMnJyBB
TkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQg
Tk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJ
TElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJ
TUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJF
IExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisg
KiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9U
IExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJ
Q0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVS
UlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElU
WSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElO
Q0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBP
RiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBP
U1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLiAKKyAqLworCisjaW5jbHVkZSAiY29uZmlnLmgiCisj
aW5jbHVkZSAiQjNQYXRjaHBvaW50VmFsdWUuaCIKKworI2luY2x1ZGUgPHd0Zi9Db21tYVByaW50
ZXIuaD4KKworbmFtZXNwYWNlIEpTQyB7IG5hbWVzcGFjZSBCMyB7CisKK1BhdGNocG9pbnRWYWx1
ZTo6flBhdGNocG9pbnRWYWx1ZSgpCit7Cit9CisKK3ZvaWQgUGF0Y2hwb2ludFZhbHVlOjpkdW1w
TWV0YShQcmludFN0cmVhbSYgb3V0KSBjb25zdAoreworICAgIENvbW1hUHJpbnRlciBjb21tYTsK
KyAgICBvdXQucHJpbnQoY29tbWEsICJzdGFja21hcCA9ICIsIHN0YWNrbWFwKTsKKyAgICBpZiAo
c2hhZG93KQorICAgICAgICBvdXQucHJpbnQoY29tbWEsICJzaGFkb3cgPSAiLCBzaGFkb3cpOwor
fQorCit9IH0gLy8gbmFtZXNwYWNlIEpTQzo6QjMKKwpJbmRleDogU291cmNlL0phdmFTY3JpcHRD
b3JlL2IzL0IzUGF0Y2hwb2ludFZhbHVlLmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL0phdmFTY3Jp
cHRDb3JlL2IzL0IzUGF0Y2hwb2ludFZhbHVlLmgJKHJldmlzaW9uIDApCisrKyBTb3VyY2UvSmF2
YVNjcmlwdENvcmUvYjMvQjNQYXRjaHBvaW50VmFsdWUuaAkod29ya2luZyBjb3B5KQpAQCAtMCww
ICsxLDU4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE1IEFwcGxlIEluYy4gQWxsIHJpZ2h0
cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQg
YmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1p
dHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoK
KyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJv
dmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0
aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5
IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0
aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRo
ZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdp
dGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZ
IEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJS
QU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdB
UlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIK
KyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMu
IE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwg
SU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1B
R0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNV
QlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJP
RklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5Z
IFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElB
QklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBB
UklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVW
RU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisK
KyNpZm5kZWYgQjNQYXRjaHBvaW50VmFsdWVfaAorI2RlZmluZSBCM1BhdGNocG9pbnRWYWx1ZV9o
CisKKyNpbmNsdWRlICJCM1ZhbHVlLmgiCisjaW5jbHVkZSAiQjNTdGFja21hcC5oIgorCituYW1l
c3BhY2UgSlNDIHsgbmFtZXNwYWNlIEIzIHsKKworY2xhc3MgUGF0Y2hwb2ludFZhbHVlIDogcHVi
bGljIFZhbHVlIHsKK3B1YmxpYzoKKyAgICBzdGF0aWMgYm9vbCBhY2NlcHRzKE9wY29kZSBvcGNv
ZGUpIHsgcmV0dXJuIG9wY29kZSA9PSBQYXRjaHBvaW50OyB9CisKKyAgICB+UGF0Y2hwb2ludFZh
bHVlKCk7CisKKyAgICBTdGFja21hcCBzdGFja21hcDsKKyAgICB1bnNpZ25lZCBzaGFkb3cgeyAw
IH07CisKK3Byb3RlY3RlZDoKKyAgICB2b2lkIGR1bXBNZXRhKFByaW50U3RyZWFtJikgY29uc3Qg
b3ZlcnJpZGU7CisKK3ByaXZhdGU6CisgICAgZnJpZW5kIGNsYXNzIFByb2NlZHVyZTsKKworICAg
IFBhdGNocG9pbnRWYWx1ZSh1bnNpZ25lZCBpbmRleCwgVHlwZSB0eXBlLCBPcmlnaW4gb3JpZ2lu
KQorICAgICAgICA6IFZhbHVlKGluZGV4LCBQYXRjaHBvaW50LCB0eXBlLCBvcmlnaW4pCisgICAg
eworICAgIH0KK307CisKK30gfSAvLyBuYW1lc3BhY2UgSlNDOjpCMworCisjZW5kaWYgLy8gQjNQ
YXRjaHBvaW50VmFsdWVfaAorCkluZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNQcm9j
ZWR1cmUuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM1Byb2Nl
ZHVyZS5jcHAJKHJldmlzaW9uIDApCisrKyBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNQcm9j
ZWR1cmUuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsNTYgQEAKKy8qCisgKiBDb3B5cmln
aHQgKEMpIDIwMTUgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlz
dHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0
aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZv
bGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9m
IHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGlj
ZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4K
KyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUg
YWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFu
ZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFu
ZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoK
KyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFTIElTJycgQU5E
IEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5P
VCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJ
VFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1F
RC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBM
SUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICog
RVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBM
SU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNF
UzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJV
UFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFks
IFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNM
VURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0Yg
VEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NT
SUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKworI2luY2x1ZGUgImNvbmZpZy5oIgorI2lu
Y2x1ZGUgIkIzUHJvY2VkdXJlLmgiCisKKyNpbmNsdWRlICJCM0Jhc2ljQmxvY2suaCIKKyNpbmNs
dWRlICJCM1ZhbHVlLmgiCisKK25hbWVzcGFjZSBKU0MgeyBuYW1lc3BhY2UgQjMgeworCitQcm9j
ZWR1cmU6OlByb2NlZHVyZSgpCit7Cit9CisKK1Byb2NlZHVyZTo6flByb2NlZHVyZSgpCit7Cit9
CisKK0Jhc2ljQmxvY2sqIFByb2NlZHVyZTo6YWRkQmxvY2soKQoreworICAgIHN0ZDo6dW5pcXVl
X3B0cjxCYXNpY0Jsb2NrPiBibG9jayA9IHN0ZDo6bWFrZV91bmlxdWU8QmFzaWNCbG9jaz4obV9i
bG9ja3Muc2l6ZSgpKTsKKyAgICBCYXNpY0Jsb2NrKiByZXN1bHQgPSBibG9jay5nZXQoKTsKKyAg
ICBtX2Jsb2Nrcy5hcHBlbmQoV1RGOjptb3ZlKGJsb2NrKSk7CisgICAgcmV0dXJuIHJlc3VsdDsK
K30KKwordm9pZCBQcm9jZWR1cmU6OmR1bXAoUHJpbnRTdHJlYW0mIG91dCkgY29uc3QKK3sKKyAg
ICBmb3IgKEJhc2ljQmxvY2sqIGJsb2NrIDogKnRoaXMpCisgICAgICAgIG91dC5wcmludChkZWVw
RHVtcChibG9jaykpOworfQorCit9IH0gLy8gbmFtZXNwYWNlIEpTQzo6QjMKSW5kZXg6IFNvdXJj
ZS9KYXZhU2NyaXB0Q29yZS9iMy9CM1Byb2NlZHVyZS5oCj09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9K
YXZhU2NyaXB0Q29yZS9iMy9CM1Byb2NlZHVyZS5oCShyZXZpc2lvbiAwKQorKysgU291cmNlL0ph
dmFTY3JpcHRDb3JlL2IzL0IzUHJvY2VkdXJlLmgJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSwx
NzcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTUgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJl
c2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5h
cnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVk
IHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICog
MS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBj
b3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBm
b2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9y
bSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMg
bGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisg
KiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0
aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQ
TEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJ
RVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFO
VElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICog
UFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IK
KyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJ
REVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMg
KElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJ
VFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRT
OyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhF
T1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJ
VFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJ
TkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJ
RiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKworI2lm
bmRlZiBCM1Byb2NlZHVyZV9oCisjZGVmaW5lIEIzUHJvY2VkdXJlX2gKKworI2luY2x1ZGUgPHd0
Zi9CYWcuaD4KKyNpbmNsdWRlIDx3dGYvRmFzdE1hbGxvYy5oPgorI2luY2x1ZGUgPHd0Zi9Ob25j
b3B5YWJsZS5oPgorI2luY2x1ZGUgPHd0Zi9WZWN0b3IuaD4KKworbmFtZXNwYWNlIEpTQyB7IG5h
bWVzcGFjZSBCMyB7CisKK2NsYXNzIEJhc2ljQmxvY2s7CitjbGFzcyBWYWx1ZTsKKworY2xhc3Mg
UHJvY2VkdXJlIHsKKyAgICBXVEZfTUFLRV9OT05DT1BZQUJMRShQcm9jZWR1cmUpOworICAgIFdU
Rl9NQUtFX0ZBU1RfQUxMT0NBVEVEOworcHVibGljOgorCisgICAgUHJvY2VkdXJlKCk7CisgICAg
flByb2NlZHVyZSgpOworCisgICAgQmFzaWNCbG9jayogYWRkQmxvY2soKTsKKyAgICAKKyAgICB0
ZW1wbGF0ZTx0eXBlbmFtZSBWYWx1ZVR5cGUsIHR5cGVuYW1lLi4uIEFyZ3VtZW50cz4KKyAgICBW
YWx1ZVR5cGUqIGFkZChBcmd1bWVudHMuLi4pOworCisgICAgdm9pZCBkdW1wKFByaW50U3RyZWFt
JikgY29uc3Q7CisKKyAgICB1bnNpZ25lZCBzaXplKCkgY29uc3QgeyByZXR1cm4gbV9ibG9ja3Mu
c2l6ZSgpOyB9CisgICAgQmFzaWNCbG9jayogYXQodW5zaWduZWQgaW5kZXgpIGNvbnN0IHsgcmV0
dXJuIG1fYmxvY2tzW2luZGV4XTsgfQorICAgIEJhc2ljQmxvY2sqIG9wZXJhdG9yW10odW5zaWdu
ZWQgaW5kZXgpIGNvbnN0IHsgcmV0dXJuIGF0KGluZGV4KTsgfQorCisgICAgY2xhc3MgaXRlcmF0
b3IgeworICAgIHB1YmxpYzoKKyAgICAgICAgaXRlcmF0b3IoKToKKyAgICAgICAgICAgIDogbV9w
cm9jZWR1cmUobnVsbHB0cikKKyAgICAgICAgICAgICwgbV9pbmRleCgwKQorICAgICAgICB7Cisg
ICAgICAgIH0KKworICAgICAgICBpdGVyYXRvcihQcm9jZWR1cmUmIHByb2NlZHVyZSwgdW5zaWdu
ZWQgaW5kZXgpCisgICAgICAgICAgICA6IG1fcHJvY2VkdXJlKCZwcm9jZWR1cmUpCisgICAgICAg
ICAgICAsIG1faW5kZXgoaW5kZXgpCisgICAgICAgIHsKKyAgICAgICAgfQorCisgICAgICAgIEJh
c2ljQmxvY2sqIG9wZXJhdG9yKigpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBtX3By
b2NlZHVyZS0+YXQobV9pbmRleCk7CisgICAgICAgIH0KKworICAgICAgICBpdGVyYXRvciYgb3Bl
cmF0b3IrKygpCisgICAgICAgIHsKKyAgICAgICAgICAgIG1faW5kZXggPSBmaW5kTmV4dChtX2lu
ZGV4ICsgMSk7CisgICAgICAgICAgICByZXR1cm4gKnRoaXM7CisgICAgICAgIH0KKworICAgICAg
ICBib29sIG9wZXJhdG9yPT0oY29uc3QgaXRlcmF0b3ImIG90aGVyKSBjb25zdAorICAgICAgICB7
CisgICAgICAgICAgICByZXR1cm4gbV9pbmRleCA9PSBvdGhlci5tX2luZGV4OworICAgICAgICB9
CisKKyAgICAgICAgYm9vbCBvcGVyYXRvciE9KGNvbnN0IGl0ZXJhdG9yJiBvdGhlcikgY29uc3QK
KyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuICEoKnRoaXMgPT0gb3RoZXIpOworICAgICAg
ICB9CisKKyAgICBwcml2YXRlOgorICAgICAgICB1bnNpZ25lZCBmaW5kTmV4dCh1bnNpZ25lZCBp
bmRleCkKKyAgICAgICAgeworICAgICAgICAgICAgd2hpbGUgKGluZGV4IDwgbV9wcm9jZWR1cmUt
PnNpemUoKSAmJiAhbV9wcm9jZWR1cmUtPmF0KGluZGV4KSkKKyAgICAgICAgICAgICAgICBpbmRl
eCsrOworICAgICAgICAgICAgcmV0dXJuIGluZXg7CisgICAgICAgIH0KKworICAgICAgICBQcm9j
ZWR1cmUqIG1fcHJvY2VkdXJlOworICAgICAgICB1bnNpZ25lZCBtX2luZGV4OworICAgIH07CisK
KyAgICBpdGVyYXRvciBiZWdpbigpIGNvbnN0IHsgcmV0dXJuIGl0ZXJhdG9yKCp0aGlzLCAwKTsg
fQorICAgIGl0ZXJhdG9yIGVuZCgpIGNvbnN0IHsgcmV0dXJuIGl0ZXJhdG9yKCp0aGlzLCBudW1C
bG9ja3MoKSk7IH0KKworICAgIGNsYXNzIFZhbHVlc0NvbGxlY3Rpb24geworICAgIHB1YmxpYzoK
KyAgICAgICAgVmFsdWVzQ29sbGVjdGlvbihQcm9jZWR1cmUmIHByb2NlZHVyZSkKKyAgICAgICAg
ICAgIDogbV9wcm9jZWR1cmUocHJvY2VkdXJlKQorICAgICAgICB7CisgICAgICAgIH0KKworICAg
ICAgICBjbGFzcyBpdGVyYXRvciB7CisgICAgICAgIHB1YmxpYzoKKyAgICAgICAgICAgIGl0ZXJh
dG9yKCk6CisgICAgICAgICAgICAgICAgOiBtX3Byb2NlZHVyZShudWxscHRyKQorICAgICAgICAg
ICAgICAgICwgbV9pbmRleCgwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorCisgICAg
ICAgICAgICBpdGVyYXRvcihQcm9jZWR1cmUmIHByb2NlZHVyZSwgdW5zaWduZWQgaW5kZXgpCisg
ICAgICAgICAgICAgICAgOiBtX3Byb2NlZHVyZSgmcHJvY2VkdXJlKQorICAgICAgICAgICAgICAg
ICwgbV9pbmRleChpbmRleCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKworICAgICAg
ICAgICAgVmFsdWUqIG9wZXJhdG9yKigpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAg
cmV0dXJuIG1fcHJvY2VkdXJlLT5ibG9jayhtX2luZGV4KTsKKyAgICAgICAgICAgIH0KKworICAg
ICAgICAgICAgaXRlcmF0b3ImIG9wZXJhdG9yKysoKQorICAgICAgICAgICAgeworICAgICAgICAg
ICAgICAgIG1faW5kZXgrKzsKKyAgICAgICAgICAgICAgICByZXR1cm4gKnRoaXM7CisgICAgICAg
ICAgICB9CisKKyAgICAgICAgICAgIGJvb2wgb3BlcmF0b3I9PShjb25zdCBpdGVyYXRvciYgb3Ro
ZXIpIGNvbnN0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG1faW5kZXgg
PT0gb3RoZXIubV9pbmRleDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgYm9vbCBvcGVy
YXRvciE9KGNvbnN0IGl0ZXJhdG9yJiBvdGhlcikgY29uc3QKKyAgICAgICAgICAgIHsKKyAgICAg
ICAgICAgICAgICByZXR1cm4gISgqdGhpcyA9PSBvdGhlcik7CisgICAgICAgICAgICB9CisKKyAg
ICAgICAgcHJpdmF0ZToKKworICAgICAgICAgICAgUHJvY2VkdXJlKiBtX3Byb2NlZHVyZTsKKyAg
ICAgICAgICAgIHVuc2lnbmVkIG1faW5kZXg7CisgICAgICAgIH07CisKKyAgICAgICAgaXRlcmF0
b3IgYmVnaW4oKSBjb25zdCB7IHJldHVybiBpdGVyYXRvcihtX3Byb2NlZHVyZSwgMCk7IH0KKyAg
ICAgICAgaXRlcmF0b3IgZW5kKCkgY29uc3QgeyByZXR1cm4gaXRlcmF0b3IobV9wcm9jZWR1cmUs
IG1fcHJvY2VkdXJlLm1fdmFsdWVzLnNpemUoKSk7IH0KKworICAgICAgICB1bnNpZ25lZCBzaXpl
KCkgY29uc3QgeyByZXR1cm4gbV9wcm9jZWR1cmUubV92YWx1ZXMuc2l6ZSgpOyB9CisgICAgICAg
IFZhbHVlKiBhdCh1bnNpZ25lZCBpbmRleCkgY29uc3QgeyByZXR1cm4gbV9wcm9jZWR1cmUubV92
YWx1ZXNbaW5kZXhdOyB9CisgICAgICAgIFZhbHVlKiBvcGVyYXRvcltdKHVuc2lnbmVkIGluZGV4
KSBjb25zdCB7IHJldHVybiBhdChpbmRleCk7IH0KKyAgICAgICAgCisgICAgcHJpdmF0ZToKKyAg
ICAgICAgUHJvY2VkdXJlJiBtX3Byb2NlZHVyZTsKKyAgICB9OworCisgICAgVmFsdWVzQ29sbGVj
dGlvbiB2YWx1ZXMoKSB7IHJldHVybiBWYWx1ZXNDb2xsZWN0aW9uKCp0aGlzKTsgfQorCitwcml2
YXRlOgorICAgIFZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QmFzaWNCbG9jaz4+IG1fYmxvY2tzOwor
ICAgIFZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8VmFsdWU+PiBtX3ZhbHVlczsKK307CisKK30gfSAv
LyBuYW1lc3BhY2UgSlNDOjpCMworCisjZW5kaWYgLy8gQjNQcm9jZWR1cmVfaAorCkluZGV4OiBT
b3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNQcm9jZWR1cmVJbmxpbmVzLmgKPT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQot
LS0gU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzUHJvY2VkdXJlSW5saW5lcy5oCShyZXZpc2lv
biAwKQorKysgU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzUHJvY2VkdXJlSW5saW5lcy5oCSh3
b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsNDYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTUg
QXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFu
ZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9k
aWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25k
aXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2Rl
IG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0
IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlz
dHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJp
Z2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93
aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBt
YXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09G
VFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQ
UkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRP
LCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5F
U1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVW
RU5UIFNIQUxMIEFQUExFIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFO
WSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBP
UiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAor
ICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBV
U0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VW
RVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4g
Q09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElH
RU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICog
T0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBT
VUNIIERBTUFHRS4gCisgKi8KKworI2lmbmRlZiBCM1Byb2NlZHVyZUlubGluZXNfaAorI2RlZmlu
ZSBCM1Byb2NlZHVyZUlubGluZXNfaAorCisjaW5jbHVkZSAiQjNCYXNpY0Jsb2NrLmgiCisjaW5j
bHVkZSAiQjNQcm9jZWR1cmUuaCIKKworbmFtZXNwYWNlIEpTQyB7IG5hbWVzcGFjZSBCMyB7CisK
K3RlbXBsYXRlPHR5cGVuYW1lIFZhbHVlVHlwZSwgdHlwZW5hbWUuLi4gQXJndW1lbnRzPgorVmFs
dWVUeXBlKiBQcm9jZWR1cmU6OmFkZChBcmd1ZW50cy4uLiBhcmd1bWVudHMpCit7CisgICAgc3Rk
Ojp1bmlxdWVfcHRyPFZhbHVlVHlwZT4gdmFsdWUobmV3IFZhbHVlVHlwZShtX3ZhbHVlcy5zaXpl
KCksIGFyZ3VtZW50cy4uLikpOworICAgIFZhbHVlVHlwZSogcmVzdWx0ID0gdmFsdWUuZ2V0KCk7
CisgICAgbV92YWx1ZXMuYXBwZW5kKFdURjo6bW92ZSh2YWx1ZSkpOworICAgIHJldHVybiByZXN1
bHQ7Cit9CisKK30gfSAvLyBuYW1lc3BhY2UgSlNDOjpCMworCisjZW5kaWYgLy8gQjNQcm9jZWR1
cmVJbmxpbmVzX2gKKwpJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzU3RhY2tTbG90
VmFsdWUuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM1N0YWNr
U2xvdFZhbHVlLmNwcAkocmV2aXNpb24gMCkKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9C
M1N0YWNrU2xvdFZhbHVlLmNwcAkod29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDQxIEBACisvKgor
ICogQ29weXJpZ2h0IChDKSAyMDE1IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAq
CisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3
aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0
aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJp
YnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Cisg
KiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRp
c2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXBy
b2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29u
ZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1l
bnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1
dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gYGBB
UyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJ
TkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVS
Q0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJF
IERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SCisgKiBDT05UUklC
VVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BF
Q0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcs
IEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMg
T1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5F
U1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0Yg
TElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JU
CisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBX
QVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBP
RiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisKKyNpbmNsdWRlICJjb25m
aWcuaCIKKyNpbmNsdWRlICJCM1N0YWNrU2xvdFZhbHVlLmgiCisKK25hbWVzcGFjZSBKU0MgeyBu
YW1lc3BhY2UgQjMgeworCitTdGFja1Nsb3RWYWx1ZTo6flN0YWNrU2xvdFZhbHVlKCkKK3sKK30K
Kwordm9pZCBTdGFja1Nsb3RWYWx1ZTo6ZHVtcE1ldGEoUHJpbnRTdHJlYW0mIG91dCkgY29uc3QK
K3sKKyAgICBvdXQucHJpbnQoImJ5dGVTaXplID0gIiwgbV9ieXRlU2l6ZSk7Cit9CisKK30gfSAv
LyBuYW1lc3BhY2UgSlNDOjpCMworCkluZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNT
dGFja1Nsb3RWYWx1ZS5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9C
M1N0YWNrU2xvdFZhbHVlLmgJKHJldmlzaW9uIDApCisrKyBTb3VyY2UvSmF2YVNjcmlwdENvcmUv
YjMvQjNTdGFja1Nsb3RWYWx1ZS5oCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsNjUgQEAKKy8q
CisgKiBDb3B5cmlnaHQgKEMpIDIwMTUgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgor
ICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMs
IHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVk
IHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0
cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQK
KyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcg
ZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJl
cHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBj
b25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1
bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJp
YnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBg
YEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xV
RElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBN
RVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBB
UkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IKKyAqIENPTlRS
SUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBT
UEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElO
RywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09E
UyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJ
TkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBP
RiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRP
UlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5Z
IFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VE
IE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKworI2lmbmRlZiBCM1N0
YWNrU2xvdFZhbHVlX2gKKyNkZWZpbmUgQjNTdGFja1Nsb3RWYWx1ZV9oCisKKyNpbmNsdWRlICJC
M1ZhbHVlLmgiCisKK25hbWVzcGFjZSBKU0MgeyBuYW1lc3BhY2UgQjMgeworCitjbGFzcyBTdGFj
a1Nsb3RWYWx1ZSA6IHB1YmxpYyBWYWx1ZSB7CitwdWJsaWM6CisgICAgc3RhdGljIGJvb2wgYWNj
ZXB0cyhPcGNvZGUgb3Bjb2RlKSB7IHJldHVybiBvcGNvZGUgPT0gU3RhY2tTbG90OyB9CisKKyAg
ICB+U3RhY2tTbG90VmFsdWUoKTsKKworICAgIHVuc2lnbmVkIGJ5dGVTaXplKCkgY29uc3QgeyBy
ZXR1cm4gbV9ieXRlU2l6ZTsgfQorCisgICAgLy8gVGhpcyBnZXRzIGFzc2lnbmVkIGF0IHRoZSBl
bmQgb2YgY29tcGlsYXRpb24uIFlvdSBjYW5ub3QgcmVseSBvbiBpdCBoYXZpbmcgYSBtZWFuaW5n
ZnVsCisgICAgLy8gdmFsdWUgd2hpbGUgdGhlIGNvbXBpbGVyIGlzIHJ1bm5pbmcuCisgICAgaW50
cHRyX3Qgb2Zmc2V0RnJvbUZQKCkgY29uc3QgeyByZXR1cm4gbV9vZmZzZXRGcm9tRlA7IH0KKwor
cHJvdGVjdGVkOgorICAgIHZvaWQgZHVtcE1ldGEoUHJpbnRTdHJlYW0mKSBjb25zdCBvdmVycmlk
ZTsKKworcHJpdmF0ZToKKyAgICBmcmllbmQgY2xhc3MgUHJvY2VkdXJlOworCisgICAgU3RhY2tT
bG90VmFsdWUodW5zaWduZWQgaW5kZXgsIE9yaWdpbiBvcmlnaW4sIHVuc2lnbmVkIGJ5dGVTaXpl
KQorICAgICAgICA6IFZhbHVlKGluZGV4LCBTdGFja1Nsb3QsIHBvaW50ZXIoKSwgb3JpZ2luKQor
ICAgICAgICAsIG1fYnl0ZVNpemUoYnl0ZVNpemUpCisgICAgICAgICwgbV9vZmZzZXRGcm9tRlAo
MCkKKyAgICB7CisgICAgfQorCisgICAgdW5zaWduZWQgbV9ieXRlU2l6ZTsKKyAgICBpbnRwdHJf
dCBtX29mZnNldEZyb21GUDsKK307CisKK30gfSAvLyBuYW1lc3BhY2UgSlNDOjpCMworCisjZW5k
aWYgLy8gQjNTdGFja1Nsb3RWYWx1ZV9oCisKSW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9i
My9CM1N0YWNrbWFwLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMv
QjNTdGFja21hcC5jcHAJKHJldmlzaW9uIDApCisrKyBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMv
QjNTdGFja21hcC5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSw0MCBAQAorLyoKKyAqIENv
cHlyaWdodCAoQykgMjAxNSBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICog
UmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBv
ciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0
aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlv
bnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAg
bm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFp
bWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNl
IHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlv
bnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRp
b24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24u
CisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIGBgQVMgSVMn
JyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBC
VVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5U
QUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVND
TEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUgorICogQ09OVFJJQlVUT1JT
IEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUws
CisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQg
Tk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNF
UlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElO
VEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJ
TElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICog
KElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9V
VCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhF
IFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLiAKKyAqLworCisjaW5jbHVkZSAiY29uZmlnLmgi
CisjaW5jbHVkZSAiQjNTdGFja21hcC5oIgorCituYW1lc3BhY2UgSlNDIHsgbmFtZXNwYWNlIEIz
IHsKKwordm9pZCBTdGFja21hcDo6ZHVtcChQcmludFN0cmVhbSYgb3V0KSBjb25zdAoreworICAg
IG91dC5wcmludCgKKyAgICAgICAgIntvcGFxdWUgPSAiLCBSYXdQb2ludGVyKG1fb3BhcXVlKSwg
IiwgcmVwcyA9ICIsIGxpc3REdW1wKG1fcmVwcyksCisgICAgICAgICIsIGdlbmVyYXRvciA9ICIs
IFJhd1BvaW50ZXIobV9nZW5lcmF0b3IuZ2V0KCkpLCAiLCBjbG9iYmVyZWQgPSAiLCBtX2Nsb2Ji
ZXJlZCwKKyAgICAgICAgIiwgdXNlZFJlZ2lzdGVycyA9ICIsIG1fdXNlZFJlZ2lzdGVycywgIn0i
KTsKK30KKworfSB9IC8vIG5hbWVzcGFjZSBKU0M6OkIzCisKSW5kZXg6IFNvdXJjZS9KYXZhU2Ny
aXB0Q29yZS9iMy9CM1N0YWNrbWFwLmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRD
b3JlL2IzL0IzU3RhY2ttYXAuaAkocmV2aXNpb24gMCkKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29y
ZS9iMy9CM1N0YWNrbWFwLmgJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSwxMjAgQEAKKy8qCisg
KiBDb3B5cmlnaHQgKEMpIDIwMTUgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoK
KyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdp
dGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRo
YXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmli
dXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAq
ICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlz
Y2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJv
ZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25k
aXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVu
dGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0
aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFT
IElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElO
RywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJD
SEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUg
RElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IKKyAqIENPTlRSSUJV
VE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVD
SUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywg
QlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBP
UiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVT
UyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBM
SUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQK
KyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdB
WSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9G
IFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKworI2lmbmRlZiBCM1N0YWNr
bWFwX2gKKyNkZWZpbmUgQjNTdGFja21hcF9oCisKKyNpbmNsdWRlICJCM1ZhbHVlUmVwLmgiCisj
aW5jbHVkZSAiQ0NhbGxIZWxwZXJzLmgiCisjaW5jbHVkZSAiUmVnaXN0ZXJTZXQuaCIKKyNpbmNs
dWRlIDx3dGYvU2hhcmVkVGFzay5oPgorCituYW1lc3BhY2UgSlNDIHsgbmFtZXNwYWNlIEIzIHsK
KworY2xhc3MgQjNWYWx1ZTsKKworY2xhc3MgU3RhY2ttYXAgeworcHVibGljOgorICAgIHN0cnVj
dCBHZW5lcmF0aW9uUGFyYW1zIHsKKyAgICAgICAgLy8gVGhpcyBpcyB0aGUgVmFsdWUgY29udGFp
bmluZyB0aGUgc3RhY2ttYXAuCisgICAgICAgIFZhbHVlKiB2YWx1ZTsKKworICAgICAgICAvLyBU
aGlzIGlzIHRoZSBzdGFja21hcC4KKyAgICAgICAgU3RhY2ttYXAqIHN0YWNrbWFwOworCisgICAg
ICAgIC8vIFRoaXMgaXMgdGhlIGp1bXAgdG8gdGhlIHNsb3cgcGF0aCwgaWYgdGhpcyBpcyBhIHN0
YWNrbWFwIGZvciBhIENoZWNrIHZhbHVlLgorICAgICAgICBDQ2FsbEhlbHBlcnM6Okp1bXAganVt
cDsKKyAgICB9OworICAgIAorICAgIHR5cGVkZWYgdm9pZCBHZW5lcmF0b3JGdW5jdGlvbihDQ2Fs
bEhlbHBlcnMmLCBjb25zdCBHZW5lcmF0aW9uUGFyYW1zJik7CisgICAgdHlwZWRlZiBTaGFyZWRU
YXNrPEdlbmVyYXRvckZ1bmN0aW9uPiBHZW5lcmF0b3I7CisgICAgCisgICAgU3RhY2ttYXAoKQor
ICAgIHsKKyAgICB9CisKKyAgICAvLyBTZXQgc29tZSBvcGFxdWUgZGF0YSB0byBpZGVudGlmeSB0
aGlzIHN0YWNrbWFwLiBUaGlzIGlzIHVzZWZ1bCBiZWNhdXNlIGEgU3RhY2ttYXAtdXNpbmcgVmFs
dWUKKyAgICAvLyBjYW4gYmUgZHVwbGljYXRlZCwgYW5kIGVhY2ggZHVwbGljYXRlIG1heSBlbmQg
dXAgaGF2aW5nIGRpZmZlcmVudCByZWdpc3RlciBhbGxvY2F0aW9uLiBUaGlzCisgICAgLy8gYWxs
b3dzIGFsbCBvZiB0aG9zZSBkdXBsaWNhdGVzIHRvIGJlIGFibGUgdG8gcmVmZXIgYmFjayB0byB3
aGF0ZXZlciBoaWdoLWxldmVsIGRhdGEgc3RydWN0dXJlcworICAgIC8vIHdlIHdlcmUgdXNpbmcg
dG8gY3JlYXRlIHRoZSB2YWx1ZS4KKyAgICB2b2lkIHNldE9wYXF1ZSh2b2lkKiBwYXJhbWV0ZXIp
CisgICAgeworICAgICAgICBtX29wYXF1ZSA9IHBhcmFtZXRlcjsKKyAgICB9CisgICAgdm9pZCog
b3BhcXVlKCkgY29uc3QgeyByZXR1cm4gbV9vcGFxdWU7IH0KKworICAgIC8vIENvbnZlbmllbmNl
IGhlbHBlcnMgd2hlbiB1c2luZyBpbmRpY2VzIGluc3RlYWQgb2YgcG9pbnRlcnMuCisgICAgdm9p
ZCBzZXRPcGFxdWVJbmRleChzaXplX3QgaW5kZXgpCisgICAgeworICAgICAgICBzZXRPcGFxdWUo
Yml0d2lzZV9jYXN0PHZvaWQqPihpbmRleCkpOworICAgIH0KKyAgICBzaXplX3Qgb3BhcXVlSW5k
ZXgoKSBjb25zdCB7IHJldHVybiBiaXR3aXNlX2Nhc3Q8c2l6ZV90PihvcGFxdWUoKSk7IH0KKwor
ICAgIC8vIENvbnN0cmFpbiBhbiBhcmd1bWVudCB0byB0aGUgVmFsdWUgdGhhdCB1c2VzIHRoaXMg
U3RhY2ttYXAuIE5vdGUgdGhhdCBpbmRleCB6ZXJvIHJlZmVycyB0byB0aGUKKyAgICAvLyBmaXJz
dCBhcmd1bWVudCB0byB0aGF0IFZhbHVlLCBldmVuIGlmIHRoYXQgYXJndW1lbnQgaXMgbm90IGNv
bnN0cmFpbmFibGUuIEZvciBleGFtcGxlLCBpbiBhCisgICAgLy8gQ2hlY2tBZGQgdmFsdWUsIGl0
IHdvdWxkIGJlIGFuIGVycm9yIHRvIGNvbnN0cmFpbiBpbmRpY2VzIDAgYW5kIDEuIEluIGEgQ2hl
Y2sgdmFsdWUsIGl0IHdvdWxkCisgICAgLy8gYmUgYW4gZXJyb3IgdG8gY29uc3RyYWluIGluZGV4
IDAuIEJ1dCwgd2hlbiB0aGUgZ2VuZXJhdGlvbiBjYWxsYmFjayBpcyBjYWxsZWQsIHlvdSBjYW4g
ZGVwZW5kCisgICAgLy8gb24gdGhlIHJlcHMgZm9yIHRob3NlIGluZGljZXMgYmVpbmcgZmlsbGVk
IGluLgorICAgIHZvaWQgY29uc3RyYWluKHVuc2lnbmVkIGluZGV4LCBjb25zdCBWYWx1ZVJlcCYg
cmVwKQorICAgIHsKKyAgICAgICAgaWYgKGluZGV4ICsgMSA8IG1fcmVwcy5zaXplKCkpCisgICAg
ICAgICAgICBtX3JlcHMuZ3JvdyhpbmRleCArIDEpOworICAgICAgICBtX3JlcHNbaW5kZXhdID0g
cmVwOworICAgIH0KKworICAgIHZvaWQgY2xvYmJlcihjb25zdCBSZWdpc3RlclNldCYgc2V0KQor
ICAgIHsKKyAgICAgICAgbV9jbG9iYmVyZWQubWVyZ2Uoc2V0KTsKKyAgICB9CisKKyAgICB2b2lk
IHNldEdlbmVyYXRvcihSZWZQdHI8R2VuZXJhdG9yPiBnZW5lcmF0b3IpCisgICAgeworICAgICAg
ICBtX2dlbmVyYXRvciA9IGdlbmVyYXRvcjsKKyAgICB9CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFt
ZSBGdW5jdG9yPgorICAgIHZvaWQgc2V0R2VuZXJhdG9yKGNvbnN0IEZ1bmN0b3ImIGZ1bmN0b3Ip
CisgICAgeworICAgICAgICBtX2dlbmVyYXRvciA9IGNyZWF0ZVNoYXJlZFRhc2s8R2VuZXJhdG9y
RnVuY3Rpb24+KGZ1bmN0b3IpOworICAgIH0KKworICAgIC8vIFRoZXNlIHdpbGwgcmV0dXJuIGlu
dGVyZXN0aW5nIHRoaW5ncyBpbnNpZGUgdGhlIGdlbmVyYXRvciBjYWxsYmFjaywgb3IgYWZ0ZXIg
Y29tcGlsYXRpb24uCisgICAgY29uc3QgVmVjdG9yPFZhbHVlUmVwPiYgcmVwcygpIGNvbnN0IHsg
cmV0dXJuIG1fcmVwczsgfQorICAgIGNvbnN0IFJlZ2lzdGVyU2V0JiB1c2VkUmVnaXN0ZXJzKCkg
Y29uc3QgeyByZXR1cm4gbV91c2VkUmVnaXN0ZXJzOyB9CisKKyAgICB2b2lkIGR1bXAoUHJpbnRT
dHJlYW0mKSBjb25zdDsKKyAgICAKK3ByaXZhdGU6CisgICAgdm9pZCogbV9vcGFxdWUgeyBudWxs
cHRyIH07CisgICAgVmVjdG9yPFZhbHVlUmVwPiBtX3JlcHM7CisgICAgUmVmUHRyPEdlbmVyYXRv
cj4gbV9nZW5lcmF0b3I7CisgICAgUmVnaXN0ZXJTZXQgbV9jbG9iYmVyZWQ7CisgICAgUmVnaXN0
ZXJTZXQgbV91c2VkUmVnaXN0ZXJzOworfTsKKworfSB9IC8vIG5hbWVzcGFjZSBKU0M6OkIzCisK
KyNlbmRpZiAvLyBCM1N0YWNrbWFwX2gKKwpJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL2Iz
L0IzU3dpdGNoQ2FzZS5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRDb3JlL2Iz
L0IzU3dpdGNoQ2FzZS5jcHAJKHJldmlzaW9uIDApCisrKyBTb3VyY2UvSmF2YVNjcmlwdENvcmUv
YjMvQjNTd2l0Y2hDYXNlLmNwcAkod29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDM5IEBACisvKgor
ICogQ29weXJpZ2h0IChDKSAyMDE1IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAq
CisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3
aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0
aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJp
YnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Cisg
KiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRp
c2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXBy
b2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29u
ZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1l
bnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1
dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gYGBB
UyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJ
TkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVS
Q0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJF
IERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SCisgKiBDT05UUklC
VVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BF
Q0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcs
IEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMg
T1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5F
U1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0Yg
TElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JU
CisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBX
QVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBP
RiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisKKyNpbmNsdWRlICJjb25m
aWcuaCIKKyNpbmNsdWRlICJCM1N3aXRjaENhc2UuaCIKKworI2luY2x1ZGUgIkIzQmFzaWNCbG9j
ay5oIgorCituYW1lc3BhY2UgSlNDIHsgbmFtZXNwYWNlIEIzIHsKKwordm9pZCBTd2l0Y2hDYXNl
OjpkdW1wKFByaW50U3RyZWFtJiBvdXQpIGNvbnN0Cit7CisgICAgb3V0LnByaW50KG1fY2FzZVZh
bHVlLCAiLT4iLCBwb2ludGVyRHVtcChtX3RhcmdldCkpOworfQorCit9IH0gLy8gbmFtZXNwYWNl
IEpTQzo6QjMKKwpJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzU3dpdGNoQ2FzZS5o
Cj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM1N3aXRjaENhc2UuaAko
cmV2aXNpb24gMCkKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM1N3aXRjaENhc2UuaAko
d29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDYzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE1
IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBh
bmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1v
ZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29u
ZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29k
ZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlz
dCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRp
c3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHly
aWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxv
d2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIg
bWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNP
RlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVY
UFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBU
TywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRO
RVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBF
VkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBB
TlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwg
T1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywK
KyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0Yg
VVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dF
VkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElO
IENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJ
R0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAq
IE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0Yg
U1VDSCBEQU1BR0UuIAorICovCisKKyNpZm5kZWYgQjNTd2l0Y2hDYXNlX2gKKyNkZWZpbmUgQjNT
d2l0Y2hDYXNlX2gKKworI2luY2x1ZGUgPHd0Zi9TdGRMaWJFeHRyYXMuaD4KKyNpbmNsdWRlIDx3
dGYvUHJpbnRTdHJlYW0uaD4KKworbmFtZXNwYWNlIEpTQyB7IG5hbWVzcGFjZSBCMyB7CisKK2Ns
YXNzIEJhc2ljQmxvY2s7CisKK2NsYXNzIFN3aXRjaENhc2UgeworcHVibGljOgorICAgIFN3aXRj
aENhc2UoKQorICAgIHsKKyAgICB9CisKKyAgICBTd2l0Y2hDYXNlKGludDY0X3QgY2FzZVZhbHVl
LCBCYXNpY0Jsb2NrKiB0YXJnZXQpCisgICAgICAgIDogbV9jYXNlVmFsdWUoY2FzZVZhbHVlKQor
ICAgICAgICAsIG1fdGFyZ2V0KHRhcmdldCkKKyAgICB7CisgICAgfQorCisgICAgZXhwbGljaXQg
b3BlcmF0b3IgYm9vbCgpIGNvbnN0IHsgcmV0dXJuICEhbV90YXJnZXQ7IH0KKworICAgIGludDY0
X3QgY2FzZVZhbHVlKCkgY29uc3QgeyByZXR1cm4gbV9jYXNlVmFsdWU7IH0KKyAgICBCYXNpY0Js
b2NrKiB0YXJnZXQoKSBjb25zdCB7IHJldHVybiBtX3RhcmdldDsgfQorCisgICAgdm9pZCBkdW1w
KFByaW50U3RyZWFtJiBvdXQpIGNvbnN0OworCitwcml2YXRlOgorICAgIGludDY0X3QgY2FzZVZh
bHVlOworICAgIEJhc2ljQmxvY2sqIHRhcmdldDsKK307CisKK30gfSAvLyBuYW1lc3BhY2UgSlND
OjpCMworCisjZW5kaWYgLy8gQjNTd2l0Y2hDYXNlX2gKKwpJbmRleDogU291cmNlL0phdmFTY3Jp
cHRDb3JlL2IzL0IzU3dpdGNoVmFsdWUuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2Ny
aXB0Q29yZS9iMy9CM1N3aXRjaFZhbHVlLmNwcAkocmV2aXNpb24gMCkKKysrIFNvdXJjZS9KYXZh
U2NyaXB0Q29yZS9iMy9CM1N3aXRjaFZhbHVlLmNwcAkod29ya2luZyBjb3B5KQpAQCAtMCwwICsx
LDYzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE1IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyBy
ZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmlu
YXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRl
ZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAq
IDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUg
Y29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUg
Zm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZv
cm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlz
IGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQor
ICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGgg
dGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQ
UExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5U
SUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJB
TlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAq
IFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9S
CisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5D
SURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VT
IChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNU
SVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklU
UzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRI
RU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklM
SVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklT
SU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4g
SUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisKKyNp
bmNsdWRlICJjb25maWcuaCIKKyNpbmNsZHVlICJCM1N3aXRjaFZhbHVlLmgiCisKK25hbWVzcGFj
ZSBKU0MgeyBuYW1lc3BhY2UgQjMgeworCitTd2l0Y2hWYWx1ZTo6flN3aXRjaFZhbHVlKCkKK3sK
K30KKworU3dpdGNoQ2FzZSBTd2l0Y2hWYWx1ZTo6cmVtb3ZlQ2FzZSh1bnNpZ25lZCBpbmRleCkK
K3sKKyAgICBTd2l0Y2hDYXNlIHJlc3VsdCA9IG1fc3VjY2Vzc29yc1tpbmRleF07CisgICAgbV9z
dWNjZXNzb3JzW2luZGV4XSA9IG1fc3VjY2Vzc29ycy5sYXN0KCk7CisgICAgbV9zdWNjZXNzb3Jz
LnJlbW92ZUxhc3QoKTsKKyAgICByZXR1cm4gcmVzdWx0OworfQorCit2b2lkIFN3aXRjaFZhbHVl
OjphcHBlbmRDYXNlKGNvbnN0IFN3aXRjaENhc2UmIHN3aXRjaENhc2UpCit7CisgICAgbV9zdWNj
ZXNzb3JzLmFwcGVuZChtX3N1Y2Nlc3NvcnMubGFzdCgpKTsKKyAgICBtX3N1Y2Nlc3NvcnNbbV9z
dWNjZXNzb3JzLnNpemUoKSAtIDJdID0gc3dpdGNoQ2FzZS50YXJnZXQoKTsKKyAgICBtX3ZhbHVl
cy5hcHBlbmQoc3dpdGNoQ2FzZS5jYXNlVmFsdWUoKSk7Cit9CisKK3ZvaWQgU3dpdGNoVmFsdWU6
OmR1bXBNZXRhKFByaW50U3RyZWFtJiBvdXQpIGNvbnN0Cit7CisgICAgLy8gVGhpcyBkZXN0cnVj
dGl2ZWx5IG92ZXJyaWRlcyBDb250cm9sVmFsdWUncyBkdW1wTWV0YSgpLgorICAgIG91dC5wcmlu
dChsaXN0RHVtcCgqdGhpcykpOworfQorCitTd2l0Y2hWYWx1ZTo6U3dpdGNoVmFsdWUodW5zaWdu
ZWQgaW5kZXgsIE9yaWdpbiBvcmlnaW4sIEJhc2ljQmxvY2sqIGZhbGxUaHJvdWdoKQorICAgIDog
Q29udHJvbFZhbHVlKGluZGV4LCBTd2l0Y2gsIG9yaWdpbikKK3sKKyAgICBtX3N1Y2Nlc3NvcnMu
YXBwZW5kKGZhbGxUaHJvdWdoKTsKK30KKworfSB9IC8vIG5hbWVzcGFjZSBKU0M6OkIzCisKSW5k
ZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM1N3aXRjaFZhbHVlLmgKPT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQot
LS0gU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzU3dpdGNoVmFsdWUuaAkocmV2aXNpb24gMCkK
KysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM1N3aXRjaFZhbHVlLmgJKHdvcmtpbmcgY29w
eSkKQEAgLTAsMCArMSwxMjMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTUgQXBwbGUgSW5j
LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4g
c291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9u
LCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisg
KiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0
YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRp
dGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9u
cyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAg
ICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2Ns
YWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMg
cHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMg
UFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJ
TVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAq
IElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEg
UEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxM
IEFQUExFIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1Qs
IElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFV
RU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VS
RU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEs
IE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VE
IEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1Qs
IFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBP
VEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBT
T0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFH
RS4gCisgKi8KKworI2lmbmRlZiBCM1N3aXRjaFZhbHVlX2gKKyNkZWZpbmUgQjNTd2l0Y2hWYWx1
ZV9oCisKKyNpbmNsdWRlICJCM0NvbnRyb2xWYWx1ZS5oIgorI2luY2x1ZGUgIkIzU3dpdGNoQ2Fz
ZS5oIgorCituYW1lc3BhY2UgSlNDIHsgbmFtZXNwYWNlIEIzIHsKKworY2xhc3MgU3dpdGNoVmFs
dWUgOiBwdWJsaWMgQ29udHJvbFZhbHVlIHsKK3B1YmxpYzoKKyAgICBzdGF0aWMgYm9vbCBhY2Nl
cHRzKE9wY29kZSBvcGNvZGUpIHsgcmV0dXJuIG9wY29kZSA9PSBTd2l0Y2g7IH0KKworICAgIH5T
d2l0Y2hWYWx1ZSgpOworCisgICAgLy8gbnVtQ2FzZVZhbHVlcygpICsgMSA9PSBudW1TdWNjZXNz
b3JzKCkuCisgICAgdW5zaWduZWQgbnVtQ2FzZVZhbHVlcygpIGNvbnN0IHsgcmV0dXJuIG1fdmFs
dWVzLnNpemUoKTsgfQorCisgICAgLy8gVGhlIHN1Y2Nlc3NvciBmb3IgdGhpcyBjYXNlIHZhbHVl
IGlzIGF0IHRoZSBzYW1lIGluZGV4LgorICAgIGludDY0X3QgY2FzZVZhbHVlKHVuc2lnbmVkIGlu
ZGV4KSBjb25zdCB7IHJldHVybiBtX3ZhbHVlc1tpXTsgfQorICAgIAorICAgIGNvbnN0IFZlY3Rv
cjxpbnQ2NF90PiYgY2FzZVZhbHVlcygpIGNvbnN0IHsgcmV0dXJuIG1fdmFsdWVzOyB9CisKKyAg
ICBCYXNpY0Jsb2NrKiBmYWxsVGhyb3VnaCgpIGNvbnN0IHsgcmV0dXJuIHN1Y2Nlc3NvcnMoKS5s
YXN0KCk7IH0KKyAgICBCYXNpY0Jsb2NrKiYgZmFsbFRocm91Z2goKSB7IHJldHVybiBzdWNjZXNz
b3JzKCkubGFzdCgpOyB9CisKKyAgICB1bnNpZ25lZCBzaXplKCkgY29uc3QgeyByZXR1cm4gbnVt
Q2FzZVZhbHVlcygpOyB9CisgICAgU3dpdGNoQ2FzZSBhdCh1bnNpZ25lZCBpbmRleCkgY29uc3QK
KyAgICB7CisgICAgICAgIHJldHVybiBTd2l0Y2hDYXNlKGNhc2VWYWx1ZShpbmRleCksIHN1Y2Nl
c3NvcihpbmRleCkpOworICAgIH0KKyAgICBTd2l0Y2hDYXNlIG9wZXJhdG9yW10odW5zaWduZWQg
aW5kZXgpIGNvbnN0CisgICAgeworICAgICAgICByZXR1cm4gYXQoaW5kZXgpOworICAgIH0KKwor
ICAgIGNsYXNzIGl0ZXJhdG9yIHsKKyAgICBwdWJsaWM6CisgICAgICAgIGl0ZXJhdG9yKCkKKyAg
ICAgICAgICAgIDogbV9zd2l0Y2gobnVsbHB0cikKKyAgICAgICAgICAgICwgbV9pbmRleCgwKQor
ICAgICAgICB7CisgICAgICAgIH0KKworICAgICAgICBpdGVyYXRvcihTd2l0Y2hWYWx1ZSYgc3dp
dGNoVmFsdWUsIHVuc2lnbmVkIGluZGV4KQorICAgICAgICAgICAgOiBtX3N3aXRjaCgmc3dpdGNo
VmFsdWUpCisgICAgICAgICAgICAsIG1faW5kZXgoaW5kZXgpCisgICAgICAgIHsKKyAgICAgICAg
fQorCisgICAgICAgIFN3aXRjaENhc2Ugb3BlcmF0b3IqKCkKKyAgICAgICAgeworICAgICAgICAg
ICAgcmV0dXJuIG1fc3dpdGNoLT5hdChtX2luZGV4KTsKKyAgICAgICAgfQorCisgICAgICAgIGl0
ZXJhdG9yJiBvcGVyYXRvcisrKCkKKyAgICAgICAgeworICAgICAgICAgICAgbV9pbmRleCsrOwor
ICAgICAgICAgICAgcmV0dXJuICp0aGlzOworICAgICAgICB9CisKKyAgICAgICAgYm9vbCBvcGVy
YXRvcj09KGNvbnN0IGl0ZXJhdG9yJiBvdGhlcikgY29uc3QKKyAgICAgICAgeworICAgICAgICAg
ICAgcmV0dXJuIG1faW5kZXggPT0gb3RoZXIubV9pbmRleDsKKyAgICAgICAgfQorCisgICAgICAg
IGJvb2wgb3BlcmF0b3IhPShjb25zdCBpdGVyYXRvciYgb3RoZXIpIGNvbnN0CisgICAgICAgIHsK
KyAgICAgICAgICAgIHJldHVybiAhKCp0aGlzID09IG90aGVyKTsKKyAgICAgICAgfQorCisgICAg
cHJpdmF0ZToKKyAgICAgICAgU3dpdGNoVmFsdWUqIG1fc3dpdGNoOworICAgICAgICB1bnNpZ25l
ZCBtX2luZGV4OworICAgIH07CisKKyAgICBpdGVyYXRvciBiZWdpbigpIGNvbnN0IHsgcmV0dXJu
IGl0ZXJhdG9yKCp0aGlzLCAwKTsgfQorICAgIGl0ZXJhdG9yIGVuZCgpIGNvbnN0IHsgcmV0dXJu
IGl0ZXJhdG9yKCp0aGlzLCBzaXplKCkpOyB9CisKKyAgICAvLyBUaGlzIHJlbW92ZXMgdGhlIGNh
c2UgYW5kIHJlb3JkZXJzIHRoaW5ncyBhIGJpdC4gSWYgeW91J3JlIGl0ZXJhdGluZyB0aGUgY2Fz
ZXMgZnJvbSAwIHRvIE4sCisgICAgLy8gdGhlbiB5b3UgY2FuIGtlZXAgaXRlcmF0aW5nIGFmdGVy
IHRoaXMgc28gbG9uZyBhcyB5b3UgcmV2aXNpdCB0aGlzIHNhbWUgaW5kZXggKHdoaWNoIHdpbGwg
bm93CisgICAgLy8gY29udGFpbiBzb21lIG90aGVyIGNhc2UgdmFsdWUpLiBUaGlzIHJlbW92ZXMg
dGhlIGNhc2UgdGhhdCB3YXMgcmVtb3ZlZC4KKyAgICBTd2l0Y2hDYXNlIHJlbW92ZUNhc2UodW5z
aWduZWQgaW5kZXgpOworCisgICAgdm9pZCBhcHBlbmRDYXNlKGNvbnN0IFN3aXRjaENhc2UmIHN3
aXRjaENhc2UpOworCitwcm90ZWN0ZWQ6CisgICAgdm9pZCBkdW1wTWV0YShQcmludFN0cmVhbSYp
IGNvbnN0IG92ZXJyaWRlOworCitwcml2YXRlOgorICAgIGZyaWVuZCBjbGFzcyBQcm9jZWR1cmU7
CisKKyAgICBTd2l0Y2hWYWx1ZSh1bnNpZ25lZCBpbmRleCwgT3JpZ2luIG9yaWdpbiwgQmFzaWNC
bG9jayogZmFsbFRocm91Z2gpOworfTsKKworfSB9IC8vIG5hbWVzcGFjZSBKU0M6OkIzCisKKyNl
bmRpZiAvLyBCM1N3aXRjaFZhbHVlX2gKKwpJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL2Iz
L0IzVHlwZS5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzVHlw
ZS5jcHAJKHJldmlzaW9uIDApCisrKyBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNUeXBlLmNw
cAkod29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDU0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAy
MDE1IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlv
biBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAq
IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcg
Y29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2Ug
Y29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMg
bGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBS
ZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNv
cHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZv
bGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3Ro
ZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElT
IFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAq
IEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRF
RCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBG
SVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBO
TyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZP
UiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFS
WSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBU
TywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1Mg
T0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBI
T1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVS
IElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5F
R0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UK
KyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkg
T0YgU1VDSCBEQU1BR0UuIAorICovCisKKyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJC
M1R5cGUuaCIKKworI2luY2x1ZGUgPHd0Zi9QcmludFN0cmVhbS5oPgorCituYW1lc3BhY2UgV1RG
IHsKKwordXNpbmcgbmFtZXNwYWNlIEpTQzo6QjM7CisKK3ZvaWQgcHJpbnRJbnRlcm5hbChQcmlu
dFN0cmVhbSYgb3V0LCBUeXBlIHR5cGUpCit7CisgICAgc3dpdGNoICh0eXBlKSB7CisgICAgY2Fz
ZSBWb2lkOgorICAgICAgICBvdXQucHJpbnQoIlZvaWQiKTsKKyAgICAgICAgcmV0dXJuOworICAg
IGNhc2UgSW50MzI6CisgICAgICAgIG91dC5wcmludCgiSW50MzIiKTsKKyAgICAgICAgcmV0dXJu
OworICAgIGNhc2UgSW50NjQ6CisgICAgICAgIG91dC5wcmludCgiSW50NjQiKTsKKyAgICAgICAg
cmV0dXJuOworICAgIGNhc2UgRG91YmxlOgorICAgICAgICBvdXQucHJpbnQoIkRvdWJsZSIpOwor
ICAgICAgICByZXR1cm47CisgICAgfQorICAgIFJFTEVBU0VfQVNTRVJUX05PVF9SRUFDSEVEKCk7
Cit9CisKK30gLy8gbmFtZXNwYWNlIFdURgpJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL2Iz
L0IzVHlwZS5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM1R5cGUu
aAkocmV2aXNpb24gMCkKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM1R5cGUuaAkod29y
a2luZyBjb3B5KQpAQCAtMCwwICsxLDY4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE1IEFw
cGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQg
dXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlm
aWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0
aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBt
dXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBv
ZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3Ry
aWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdo
dAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2lu
ZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0
ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRX
QVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJF
U1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywg
VEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNT
IEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVO
VCBTSEFMTCBBUFBMRSBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkg
RElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1Ig
Q09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAq
IFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNF
LCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVS
IENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENP
TlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VO
Q0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9G
IFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VD
SCBEQU1BR0UuIAorICovCisKKyNpZm5kZWYgQjNUeXBlX2gKKyNkZWZpbmUgQjNUeXBlX2gKKwor
I2luY2x1ZGUgPHd0Zi9TdGRMaWJFeHRyYXMuaD4KKworbmFtZXNwYWNlIEpTQyB7IG5hbWVzcGFj
ZSBCMyB7CisKK2VudW0gVHlwZSB7CisgICAgVm9pZCwKKyAgICBJbnQzMiwKKyAgICBJbnQ2NCwK
KyAgICBEb3VibGUKK307CisKK2lubGluZSBib29sIGlzSW50KFR5cGUgdHlwZSkKK3sKKyAgICBy
ZXR1cm4gdHlwZSA9PSBJbnQzMiB8fCB0eXBlID09IEludDY0OworfQorCitpbmxpbmUgYm9vbCBp
c0Zsb2F0KFR5cGUgdHlwZSkKK3sKKyAgICByZXR1cm4gdHlwZSA9PSBEb3VibGU7Cit9CisKK2lu
bGluZSBUeXBlIHBvaW50ZXIoKSBjb25zdAoreworICAgIGlmIChzaXplb2Yodm9pZCopID09IDQp
CisgICAgICAgIHJldHVybiBJbnQzMjsKKyAgICByZXR1cm4gSW50NjQ7Cit9CisKK30gfSAvLyBu
YW1lc3BhY2UgSlNDOjpCMworCituYW1lc3BhY2UgV1RGIHsKKworY2xhc3MgUHJpbnRTdHJlYW07
CisKK3ZvaWQgcHJpbnRJbnRlcm5hbChQcmludFN0cmVhbSYsIEpTQzo6QjM6OlR5cGUpOworCit9
IC8vIG5hbWVzcGFjZSBXVEYKKworI2VuZGlmIC8vIEIzVHlwZV9oCisKSW5kZXg6IFNvdXJjZS9K
YXZhU2NyaXB0Q29yZS9iMy9CM1Vwc2lsb25WYWx1ZS5jcHAKPT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNl
L0phdmFTY3JpcHRDb3JlL2IzL0IzVXBzaWxvblZhbHVlLmNwcAkocmV2aXNpb24gMCkKKysrIFNv
dXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM1Vwc2lsb25WYWx1ZS5jcHAJKHdvcmtpbmcgY29weSkK
QEAgLTAsMCArMSw0MSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNSBBcHBsZSBJbmMuIEFs
bCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3Vy
Y2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFy
ZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFy
ZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4g
dGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9u
cyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGlu
IGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5v
dGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1l
ciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92
aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9W
SURFRCBCWSBBUFBMRSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJ
RUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1Q
TElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJU
SUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQ
TEUgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5E
SVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJ
QUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVO
VCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IK
KyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5E
IE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RS
SUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVS
V0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRX
QVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLiAK
KyAqLworCisjaW5jbHVkZSAiY29uZmlnLmgiCisjaW5jbHVkZSAiQjNVcHNpbG9uVmFsdWUuaCIK
KworbmFtZXNwYWNlIEpTQyB7IG5hbWVzcGFjZSBCMyB7CisKK1Vwc2lsb25WYWx1ZTo6flVwc2ls
b25WYWx1ZSgpCit7Cit9CisKK3ZvaWQgVXBzaWxvblZhbHVlOjpkdW1wTWV0YShQcmludFN0cmVh
bSYgb3V0KSBjb25zdAoreworICAgIG91dC5wcmludCgiXiIsIG1fcGhpLT5pbmRleCgpKTsKK30K
KworfSB9IC8vIG5hbWVzcGFjZSBKU0M6OkIzCisKSW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29y
ZS9iMy9CM1Vwc2lsb25WYWx1ZS5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29y
ZS9iMy9CM1Vwc2lsb25WYWx1ZS5oCShyZXZpc2lvbiAwKQorKysgU291cmNlL0phdmFTY3JpcHRD
b3JlL2IzL0IzVXBzaWxvblZhbHVlLmgJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSw2MCBAQAor
LyoKKyAqIENvcHlyaWdodCAoQykgMjAxNSBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQu
CisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jt
cywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlk
ZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRp
c3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdo
dAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2lu
ZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3Qg
cmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9m
IGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRv
Y3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0
cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMu
IGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5D
TFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9G
IE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NF
IEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUgorICogQ09O
VFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUws
IFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVE
SU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdP
T0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJV
U0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAq
IE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1Ig
VE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBB
TlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklT
RUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLiAKKyAqLworCisjaWZuZGVmIEIz
VXBzaWxvblZhbHVlX2gKKyNkZWZpbmUgQjNVcHNpbG9uVmFsdWVfaAorCisjaW5jbHVkZSAiQjNW
YWx1ZS5oIgorCituYW1lc3BhY2UgSlNDIHsgbmFtZXNwYWNlIEIzIHsKKworY2xhc3MgVXBzaWxv
blZhbHVlIDogcHVibGljIFZhbHVlIHsKK3B1YmxpYzoKKyAgICBzdGF0aWMgYm9vbCBhY2NlcHRz
KE9wY29kZSBvcGNvZGUpIHsgcmV0dXJuIG9wY29kZSA9PSBVcHNpbG9uOyB9CisKKyAgICB+VXBz
aWxvblZhbHVlKCk7CisKKyAgICBWYWx1ZSogcGhpKCkgY29uc3QgeyByZXR1cm4gbV9waGk7IH0K
KworcHJvdGVjdGVkOgorICAgIHZvaWQgZHVtcE1ldGEoUHJpbnRTdHJlYW0mKSBjb25zdCBvdmVy
cmlkZTsKKworcHJpdmF0ZToKKyAgICBmcmllbmQgY2xhc3MgUHJvY2VkdXJlOworICAgIAorICAg
IFVwc2lsb25WYWx1ZSh1bnNpZ25lZCBpbmRleCwgT3JpZ2luIG9yaWdpbiwgVmFsdWUqIHZhbHVl
LCBWYWx1ZSogcGhpKQorICAgICAgICA6IFZhbHVlKGluZGV4LCBQaGksIFZvaWQsIG9yaWdpbiwg
dmFsdWUpCisgICAgICAgICwgbV9waGkocGhpKQorICAgIHsKKyAgICAgICAgQVNTRVJUKHZhbHVl
LT50eXBlKCkgPT0gcGhpLT50eXBlKCkpOworICAgIH0KKworICAgIFZhbHVlKiBtX3BoaTsKK307
CisKK30gfSAvLyBuYW1lc3BhY2UgSlNDOjpCMworCisjZW5kaWYgLy8gQjNVcHNpbG9uVmFsdWVf
aAorCkluZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNWYWx1ZS5jcHAKPT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PQotLS0gU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzVmFsdWUuY3BwCShyZXZpc2lvbiAwKQor
KysgU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzVmFsdWUuY3BwCSh3b3JraW5nIGNvcHkpCkBA
IC0wLDAgKzEsMTY5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE1IEFwcGxlIEluYy4gQWxs
IHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJj
ZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJl
IHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJl
IG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0
aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25z
IGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4g
YmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90
aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVy
IGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3Zp
ZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJ
REVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElF
RCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBM
SUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJ
Q1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBM
RSBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJ
UkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElB
TCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5U
IE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgor
ICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQg
T04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJ
Q1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJX
SVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdB
UkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAor
ICovCisKKyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJCM1ZhbHVlLmgiCisKK25hbWVz
cGFjZSBKU0MgeyBuYW1lc3BhY2UgQjMgeworCitWYWx1ZTo6flZhbHVlKCkKK3sKK30KKwordm9p
ZCBWYWx1ZTo6cmVwbGFjZVdpdGhJZGVudGl0eShWYWx1ZSogdmFsdWUpCit7CisgICAgLy8gVGhp
cyBpcyBhIGJpdCBjcmF6eS4gSXQgZG9lcyBhbiBpbi1wbGFjZSByZXBsYWNlbWVudCBvZiB3aGF0
ZXZlciBWYWx1ZSBzdWJjbGFzcyB0aGlzIGlzIHdpdGgKKyAgICAvLyBhIHBsYWluIElkZW50aXR5
IFZhbHVlLiBXZSBmaXJzdCBjb2xsZWN0IGFsbCBvZiB0aGUgaW5mb3JtYXRpb24gd2UgbmVlZCwg
dGhlbiB3ZSBkZXN0cnVjdCB0aGUKKyAgICAvLyBwcmV2aW91cyB2YWx1ZSBpbiBwbGFjZSwgYW5k
IHRoZW4gd2UgY29uc3RydWN0IHRoZSBJZGVudGl0eSBWYWx1ZSBpbiBwbGFjZS4KKworICAgIHVu
c2lnbmVkIGluZGV4ID0gbV9pbmRleDsKKyAgICBUeXBlIHR5cGUgPSBtX3R5cGU7CisgICAgT3Jp
Z2luIG9yaWdpbiA9IG1fb3JpZ2luOworICAgIEJhc2ljQmxvY2sqIG93bmVyID0gdGhpcy0+b3du
ZXI7CisgICAgVmFsdWUqIHJlcGxhY2VtZW50ID0gdGhpcy0+cmVwbGFjZW1lbnQ7CisgICAgdm9p
ZCogbWlzYyA9IHRoaXMtPm1pc2M7CisKKyAgICBSRUxFQVNFX0FTU0VSVCh0eXBlID09IHZhbHVl
LT50eXBlKCkpOworCisgICAgdGhpcy0+VmFsdWU6On5WYWx1ZSgpOworCisgICAgbmV3ICh0aGlz
KSAoaW5kZXgsIElkZW50aWZ5LCB0eXBlLCBvcmlnaW4sIHZhbHVlKTsKKworICAgIHRoaXMtPm93
bmVyID0gb3duZXI7CisgICAgdGhpcy0+cmVwbGFjZW1lbnQgPSByZXBsYWNlbWVudDsKKyAgICB0
aGlzLT5taXNjID0gbWlzYzsKK30KKwordm9pZCBWYWx1ZTo6ZHVtcChQcmludFN0cmVhbSYgb3V0
KSBjb25zdAoreworICAgIG91dC5wcmludChkdW1wUHJlZml4LCBtX2luZGV4KTsKK30KKwordm9p
ZCBWYWx1ZTo6ZGVlcER1bXAoUHJpbnRTdHJlYW0mIG91dCkgY29uc3QKK3sKKyAgICBvdXQucHJp
bnQobV90eXBlLCAiICIsICp0aGlzLCAiID0gIiwgbV9vcGNvZGUpOworCisgICAgb3V0LnByaW50
KCIoIik7CisgICAgQ29tbWFQcmludGVyIGNvbW1hOworICAgIGZvciAoVmFsdWUqIGNoaWxkIDog
Y2hpbGRyZW4oKSkKKyAgICAgICAgb3V0LnByaW50KGNvbW1hLCBwb2ludGVyRHVtcChjaGlsZCkp
OworCisgICAgU3RyaW5nUHJpbnRTdHJlYW0gc3RyaW5nT3V0OworICAgIGR1bXBNZXRhKHN0cmlu
Z091dCk7CisgICAgQ1N0cmluZyBzdHJpbmcgPSBzdHJpbmdPdXQudG9DU3RyaW5nKCk7CisgICAg
aWYgKHN0cmluZy5sZW5ndGgoKSkKKyAgICAgICAgb3V0LnByaW50KGNvbW1hLCBzdHJpbmcpOwor
CisgICAgb3V0LnByaW50KCIpIik7Cit9CisKK2Jvb2wgVmFsdWU6Omhhc0ludDMyKCkgY29uc3QK
K3sKKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK2ludDMyX3QgVmFsdWU6OmFzSW50MzIoKSBjb25z
dAoreworICAgIFJFTEVBU0VfQVNTRVJUX05PVF9SRUFDSEVEKCk7CisgICAgcmV0dXJuIDA7Cit9
CisKK2Jvb2wgVmFsdWU6Omhhc0ludDY0KCkgY29uc3QKK3sKKyAgICByZXR1cm4gZmFsc2U7Cit9
CisKK2ludDY0X3QgVmFsdWU6OmFzSW50NjQoKSBjb25zdAoreworICAgIFJFTEVBU0VfQVNTRVJU
X05PVF9SRUFDSEVEKCk7CisgICAgcmV0dXJuIDA7Cit9CisKK2Jvb2wgVmFsdWU6Omhhc0RvdWJs
ZSgpIGNvbnN0Cit7CisgICAgcmV0dXJuIGZhbHNlOworfQorCitkb3VibGUgVmFsdWU6OmFzRG91
YmxlKCkgY29uc3QKK3sKKyAgICBSRUxFQVNFX0FTU0VSVF9OT1RfUkVBQ0hFRCgpOworICAgIHJl
dHVybiAwOworfQorCit2b2lkIFZhbHVlOjpkdW1wTWV0YShQcmludFN0cmVhbSYpIGNvbnN0Cit7
Cit9CisKK1R5cGUgVmFsdWU6OnR5cGVGb3IoT3Bjb2RlIG9wY29kZSwgVmFsdWUqIGZpcnN0Q2hp
bGQpCit7CisgICAgc3dpdGNoIChvcGNvZGUpIHsKKyAgICBjYXNlIElkZW50aXR5OgorICAgIGNh
c2UgQWRkOgorICAgIGNhc2UgU3ViOgorICAgIGNhc2UgTXVsOgorICAgIGNhc2UgRGl2OgorICAg
IGNhc2UgQ2hpbGxEaXY6CisgICAgY2FzZSBNb2Q6CisgICAgY2FzZSBCaXRBbmQ6CisgICAgY2Fz
ZSBCaXRPcjoKKyAgICBjYXNlIEJpdFhvcjoKKyAgICBjYXNlIFNobDoKKyAgICBjYXNlIFNTaHI6
CisgICAgY2FzZSBaU2hyOgorICAgIGNhc2UgQ2hlY2tBZGQ6CisgICAgY2FzZSBDaGVja1N1YjoK
KyAgICBjYXNlIENoZWNrTXVsOgorICAgICAgICByZXR1cm4gZmlyc3RDaGlsZC0+dHlwZSgpOwor
ICAgIGNhc2UgRnJhbWVQb2ludGVyOgorICAgICAgICByZXR1cm4gcG9pbnRlcigpOworICAgIGNh
c2UgU0V4dDg6CisgICAgY2FzZSBTRXh0MTY6CisgICAgY2FzZSBEVG9JMzI6CisgICAgY2FzZSBF
cXVhbDoKKyAgICBjYXNlIE5vdEVxdWFsOgorICAgIGNhc2UgTGVzc1RoYW46CisgICAgY2FzZSBH
cmVhdGVyVGhhbjoKKyAgICBjYXNlIExlc3NFcXVhbDoKKyAgICBjYXNlIEdyZWF0ZXJFcXVhbDoK
KyAgICBjYXNlIEFib3ZlOgorICAgIGNhc2UgQmVsb3c6CisgICAgY2FzZSBBYm92ZUVxdWFsOgor
ICAgIGNhc2UgQmVsb3dFcXVhbDoKKyAgICAgICAgcmV0dXJuIEludDMyOworICAgIGNhc2UgU0V4
dDMyOgorICAgIGNhc2UgWkV4dDMyOgorICAgICAgICByZXR1cm4gSW50NjQ7CisgICAgY2FzZSBG
Um91bmQ6CisgICAgY2FzZSBJVG9EOgorICAgICAgICByZXR1cm4gRG91YmxlOworICAgIGNhc2Ug
Tm9wOgorICAgICAgICByZXR1cm4gVm9pZDsKKyAgICBkZWZhdWx0OgorICAgICAgICBSRUxFQVNF
X0FTU0VSVF9OT1RfUkVBQ0hFRCgpOworICAgIH0KK30KKworfSB9IC8vIG5hbWVzcGFjZSBKU0M6
OkIzCisKSW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM1ZhbHVlLmgKPT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PQotLS0gU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzVmFsdWUuaAkocmV2aXNpb24gMCkKKysr
IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM1ZhbHVlLmgJKHdvcmtpbmcgY29weSkKQEAgLTAs
MCArMSwxNzcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTUgQXBwbGUgSW5jLiBBbGwgcmln
aHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFu
ZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVy
bWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0
OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBh
Ym92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5k
IHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5h
cnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2Us
IHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4g
dGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQg
d2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQg
QlkgQVBQTEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdB
UlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQg
V0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxB
UgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElO
Qy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNU
LCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERB
TUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0Yg
U1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQ
Uk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBB
TlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBM
SUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0Up
IEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwg
RVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8K
KworI2lmbmRlZiBCM1ZhbHVlX2gKKyNkZWZpbmUgQjNWYWx1ZV9oCisKKyNpbmNsdWRlICJCM09y
aWdpbi5oIgorI2luY2x1ZGUgIkIzVHlwZS5oIgorI2luY2x1ZGUgPHd0Zi9GYXN0TWFsbG9jLmg+
CisjaW5jbHVkZSA8d3RmL05vbmNvcHlhYmxlLmg+CisKK25hbWVzcGFjZSBKU0MgeyBuYW1lc3Bh
Y2UgQjMgeworCitjbGFzcyBWYWx1ZSB7CisgICAgV1RGX01BS0VfTk9OQ09QWUFCTEUoVmFsdWUp
OworICAgIFdURl9NQUtFX0ZBU1RfQUxMT0NBVEVEOworcHVibGljOgorICAgIHR5cGVkZWYgVmVj
dG9yPFZhbHVlKiwgMz4gQWRqYWNlbmN5TGlzdDsKKworICAgIHN0YXRpYyBjb25zdCBjaGFyKiBk
dW1wUHJlZml4ID0gIkAiOworCisgICAgc3RhdGljIGJvb2wgYWNjZXB0cyhPcGNvZGUpIHsgcmV0
dXJuIHRydWU7IH0KKworICAgIHZpcnR1YWwgflZhbHVlKCk7CisKKyAgICB1bnNpZ25lZCBpbmRl
eCgpIGNvbnN0IHsgcmV0dXJuIG1faW5kZXg7IH0KKyAgICAKKyAgICAvLyBOb3RlIHRoYXQgdGhl
IG9wY29kZSBpcyBpbW11dGFibGUsIGV4Y2VwdCBmb3IgcmVwbGFjaW5nIHZhbHVlcyB3aXRoIGlk
ZW50aXR5LgorICAgIE9wY29kZSBvcGNvZGUoKSBjb25zdCB7IHJldHVybiBtX29wY29kZTsgfQor
CisgICAgT3JpZ2luIG9yaWdpbigpIGNvbnN0IHsgcmV0dXJuIG1fb3JpZ2luOyB9CisgICAgCisg
ICAgVmFsdWUqJiBjaGlsZCh1bnNpZ25lZCBpbmRleCkgeyByZXR1cm4gbV9jaGlsZHJlbltpbmRl
eF07IH0KKyAgICBWYWx1ZSogY2hpbGQodW5zaWduZWQgaW5kZXgpIGNvbnN0IHsgcmV0dXJuIG1f
Y2hpbGRyZW5baW5kZXhdOyB9CisKKyAgICAvLyBUaGlzIGNvbXB1dGVzIHRoZSB0eXBlIHVzaW5n
IHRoZSBvcGNvZGUuCisgICAgVHlwZSB0eXBlKCkgY29uc3QgeyByZXR1cm4gbV90eXBlOyB9CisK
KyAgICBBZGphY2VuY3lMaXN0JiBjaGlsZHJlbigpIHsgcmV0dXJuIG1fY2hpbGRyZW47IH0gCisg
ICAgY29uc3QgQWRqYWNlbmN5TGlzdCYgY2hpbGRyZW4oKSBjb25zdCB7IHJldHVybiBtX2NoaWxk
cmVuOyB9CisKKyAgICB2b2lkIHJlcGxhY2VXaXRoSWRlbnRpdHkoVmFsdWUqKTsKKyAgICB2b2lk
IHJlcGxhY2VXaXRoTm9wKCk7CisKKyAgICB2b2lkIGR1bXAoUHJpbnRTdHJlYW0mKSBjb25zdDsK
KyAgICB2b2lkIGRlZXBEdW1wKFByaW50U3RyZWFtJikgY29uc3Q7CisKKyAgICAvLyBUaGlzIGlz
IGhvdyB5b3UgY2FzdCBWYWx1ZXMuIEZvciBleGFtcGxlLCBpZiB5b3Ugd2FudCB0byBkbyBzb21l
dGhpbmcgcHJvdmlkZWQgdGhhdCB3ZSBoYXZlIGEKKyAgICAvLyBBcmd1bWVudFJlZ1ZhbHVlLCB5
b3UgY2FuIGRvOgorICAgIC8vCisgICAgLy8gaWYgKEFyZ3VtZW50UmVnVmFsdWUqIGFyZ3VtZW50
UmVnID0gdmFsdWUtPmFzPEFyZ3VtZW50UmVnVmFsdWU+KCkpIHsKKyAgICAvLyAgICAgdGhpbmdz
CisgICAgLy8gfQorICAgIC8vCisgICAgLy8gVGhpcyB3aWxsIHJldHVybiBudWxsIGlmIHRoaXMg
b3Bjb2RlKCkgIT0gQXJndW1lbnRSZWcuIFRoaXMgd29ya3MgYmVjYXVzZSB0aGlzIHJldHVybnMg
bnVsbHB0cgorICAgIC8vIGlmIFQ6OmFjY2VwdHMob3Bjb2RlKCkpIHJldHVybnMgZmFsc2UuCisg
ICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4KKyAgICBUKiBhcygpOworICAgIHRlbXBsYXRlPHR5cGVu
YW1lIFQ+CisgICAgY29uc3QgVCogYXMoKSBjb25zdDsKKyAgICAKKyAgICBib29sIGhhc0ludDMy
KCkgY29uc3Q7CisgICAgaW50MzJfdCBhc0ludDMyKCkgY29uc3Q7CisgICAgCisgICAgYm9vbCBo
YXNJbnQ2NCgpIGNvbnN0OworICAgIGludDY0X3QgYXNJbnQ2NCgpIGNvbnN0OworCisgICAgYm9v
bCBoYXNJbnQoKSBjb25zdDsKKyAgICBpbnQ2NF90IGFzSW50KCkgY29uc3Q7CisgICAgYm9vbCBp
c0ludChpbnQ2NF90IHZhbHVlKSBjb25zdDsKKworICAgIGJvb2wgaGFzRG91YmxlKCkgY29uc3Q7
CisgICAgZG91YmxlIGFzRG91YmxlKCkgY29uc3Q7CisKK3Byb3RlY3RlZDoKKyAgICB2aXJ0dWFs
IHZvaWQgZHVtcE1ldGEoUHJpbnRTdHJlYW0mKSBjb25zdDsKKyAgICAKK3ByaXZhdGU6CisgICAg
ZnJpZW5kIGNsYXNzIFByb2NlZHVyZTsKKyAgICAKKyAgICAvLyBJbnN0YW50aWF0ZSB2YWx1ZXMg
dmlhIFByb2NlZHVyZS4KKyAgICAvLyBUaGlzIGZvcm0gcmVxdWlyZXMgc3BlY2lmeWluZyB0aGUg
dHlwZSBleHBsaWNpdGx5OgorICAgIHRlbXBsYXRlPHR5cGVuYW1lLi4uIEFyZ3VtZW50cz4KKyAg
ICBleHBsaWNpdCBWYWx1ZSh1bnNpZ25lZCBpbmRleCwgT3Bjb2RlIG9wY29kZSwgVHlwZSB0eXBl
LCBPcmlnaW4gb3JpZ2luLCBBcmd1bWVudHMuLi4gYXJndW1lbnRzKQorICAgICAgICA6IG1faW5k
ZXgoaW5kZXgpCisgICAgICAgICwgbV9vcGNvZGUob3Bjb2RlKQorICAgICAgICAsIG1fdHlwZSh0
eXBlKQorICAgICAgICAsIG1fb3JpZ2luKG9yaWdpbikKKyAgICAgICAgLCBtX2NoaWxkcmVueyBh
cmd1bWVudHMuLi4gfQorICAgIHsKKyAgICB9CisgICAgLy8gVGhpcyBmb3JtIGlzIGZvciB0aG9z
ZSBvcGNvZGVzIHRoYXQgY2FuIGluZmVyIHRoZWlyIHR5cGUgZnJvbSB0aGUgb3Bjb2RlIGFuZCBm
aXJzdCBjaGlsZDoKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZS4uLiBBcmd1bWVudHM+CisgICAgZXhw
bGljaXQgVmFsdWUodW5zaWduZWQgaW5kZXgsIE9wY29kZSBvcGNvZGUsIE9yaWdpbiBvcmlnaW4s
IFZhbHVlKiBmaXJzdENoaWxkLCBBcmd1bWVudHMuLi4gYXJndW1lbnRzKQorICAgICAgICA6IG1f
aW5kZXgoaW5kZXgpCisgICAgICAgICwgbV9vcGNvZGUob3Bjb2RlKQorICAgICAgICAsIG1fdHlw
ZSh0eXBlRm9yKG9wY29kZSwgZmlyc3RDaGlsZCkpCisgICAgICAgICwgbV9vcmlnaW4ob3JpZ2lu
KQorICAgICAgICAsIG1fY2hpbGRyZW57IGZpcnN0Q2hpbGQsIGFyZ3VtZW50cy4uLiB9CisgICAg
eworICAgIH0KKyAgICAvLyBUaGlzIGZvcm0gaXMgZm9yIHRob3NlIG9wY29kZXMgdGhhdCBjYW4g
aW5mZXIgdGhlaXIgdHlwZSBmcm9tIHRoZSBvcGNvZGUgYWxvbmUsIGFuZCB0aGF0IGRvbid0Cisg
ICAgLy8gdGFrZSBhbnkgYXJndW1lbnRzOgorICAgIGV4cGxpY2l0IFZhbHVlKHVuc2lnbmVkIGlu
ZGV4LCBPcGNvZGUgb3Bjb2RlLCBPcmlnaW4gb3JpZ2luKQorICAgICAgICA6IG1faW5kZXgoaW5k
ZXgpCisgICAgICAgICwgbV9vcGNvZGUob3Bjb2RlKQorICAgICAgICAsIG1fdHlwZSh0eXBlRm9y
KG9wY29kZSwgbnVsbHB0cikpCisgICAgICAgICwgbV9vcmlnaW4ob3JpZ2luKQorICAgIHsKKyAg
ICB9CisKKyAgICBzdGF0aWMgVHlwZSB0eXBlRm9yKE9wY29kZSwgVmFsdWUqIGZpcnN0Q2hpbGQp
OworCisgICAgLy8gVGhpcyBncm91cCBvZiBmaWVsZHMgaXMgYXJyYW5nZWQgdG8gZml0IGluIDY0
IGJpdHMuCisgICAgdW5zaWduZWQgbV9pbmRleDsKKyAgICBPcGNvZGUgbV9vcGNvZGU7CisgICAg
VHlwZSBtX3R5cGU7CisgICAgCisgICAgT3JpZ2luIG1fb3JpZ2luOworICAgIEFkamFjZW5jeUxp
c3QgbV9jaGlsZHJlbjsKKworcHVibGljOgorICAgIEJhc2ljQmxvY2sqIG93bmVyIHsgbnVsbHB0
ciB9OyAvLyBjb21wdXRlZCBsYXppbHkuCisgICAgVmFsdWUqIHJlcGxhY2VtZW50IHsgbnVsbHB0
ciB9OyAvLyB1c2VkIGZvciBhbmFseXNlcyBhbmQgdHJhbnNmb3JtYXRpb25zLgorICAgIHZvaWQq
IG1pc2MgeyBudWxscHRyIH07Cit9OworCitjbGFzcyBEZWVwVmFsdWVEdW1wIHsKK3B1YmxpYzoK
KyAgICBEZWVwVmFsdWVEdW1wKFZhbHVlKiB2YWx1ZSkKKyAgICAgICAgOiBtX3ZhbHVlKHZhbHVl
KQorICAgIHsKKyAgICB9CisKKyAgICB2b2lkIGR1bXAoUHJpbnRTdHJlYW0mIG91dCkgY29uc3QK
KyAgICB7CisgICAgICAgIGlmIChtX3ZhbHVlKQorICAgICAgICAgICAgbV92YWx1ZS0+ZGVlcER1
bXAob3V0KTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgb3V0LnByaW50KCI8bnVsbD4iKTsK
KyAgICB9CisKK3ByaXZhdGU6CisgICAgVmFsdWUqIG1fdmFsdWU7Cit9OworCitEZWVwVmFsdWVE
dW1wIGRlZXBEdW1wKFZhbHVlKiB2YWx1ZSkKK3sKKyAgICByZXR1cm4gRGVlcFZhbHVlRHVtcCh2
YWx1ZSk7Cit9CisKK30gfSAvLyBuYW1lc3BhY2UgSlNDOjpCMworCisjZW5kaWYgLy8gQjNWYWx1
ZV9oCisKSW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM1ZhbHVlSW5saW5lcy5oCj09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM1ZhbHVlSW5saW5lcy5oCShy
ZXZpc2lvbiAwKQorKysgU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzVmFsdWVJbmxpbmVzLmgJ
KHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSw5OCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAx
NSBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24g
YW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBt
b2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNv
bmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNv
ZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxp
c3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVk
aXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5
cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xs
b3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVy
IG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBT
T0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBF
WFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQg
VE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklU
TkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8g
RVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1Ig
QU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlks
IE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8s
CisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9G
IFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9X
RVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJ
TiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdM
SUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisg
KiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9G
IFNVQ0ggREFNQUdFLiAKKyAqLworCisjaWZuZGVmIEIzVmFsdWVJbmxpbmVzX2gKKyNkZWZpbmUg
QjNWYWx1ZUlubGluZXNfaAorCisjaW5jbHVkZSAiQjNDb25zdDMyVmFsdWUuaCIKKyNpbmNsdWRl
ICJCM0NvbnN0NjRWYWx1ZS5oIgorI2luY2x1ZGUgIkIzQ29uc3REb3VibGVWYWx1ZS5oIgorI2lu
Y2x1ZGUgIkIzVmFsdWUuaCIKKworbmFtZXNwYWNlIEpTQyB7IG5hbWVzcGFjZSBCMyB7CisKK3Rl
bXBsYXRlPHR5cGVuYW1lIFQ+CitUKiBWYWx1ZTo6YXMoKQoreworICAgIGlmIChUOjphY2NlcHRz
KG9wY29kZSgpKSkKKyAgICAgICAgcmV0dXJuIHN0YXRpY19jYXN0PFQqPih0aGlzKTsKKyAgICBy
ZXR1cm4gbnVsbHB0cjsKK30KKwordGVtcGxhdGU+dHlwZW5hbWUgVD4KK2NvbnN0IFQqIFZhbHVl
OjphcygpIGNvbnN0Cit7CisgICAgcmV0dXJuIGNvbnN0X2Nhc3Q8VmFsdWUqPih0aGlzKS0+YXM8
VD4oKTsKK30KKworYm9vbCBWYWx1ZTo6aGFzSW50MzIoKSBjb25zdAoreworICAgIHJldHVybiAh
IWFzPENvbnN0MzJWYWx1ZT4oKTsKK30KKworaW50MzJfdCBWYWx1ZTo6YXNJbnQzMigpIGNvbnN0
Cit7CisgICAgcmV0dXJuIGFzPENvbnN0MzJWYWx1ZT4oKS0+dmFsdWUoKTsKK30KKworYm9vbCBW
YWx1ZTo6aGFzSW50NjQoKSBjb25zdAoreworICAgIHJldHVybiAhIWFzPENvbnN0NjRWYWx1ZT4o
KTsKK30KKworaW50NjRfdCBWYWx1ZTo6YXNJbnQ2NCgpIGNvbnN0Cit7CisgICAgcmV0dXJuIGFz
PENvbnN0NjRWYWx1ZT4oKS0+dmFsdWUoKTsKK30KKworYm9vbCBWYWx1ZTo6aGFzSW50KCkgY29u
c3QKK3sKKyAgICByZXR1cm4gaGFzSW50MzIoKSB8fCBoYXNJbnQ2NCgpOworfQorCitpbnQ2NF90
IFZhbHVlOjphc0ludCgpIGNvbnN0Cit7CisgICAgcmV0dXJuIGhhc0ludDMyKCkgPyBhc0ludDMy
KCkgOiBhc0ludDY0KCk7Cit9CisKK2Jvb2wgVmFsdWU6OmlzSW50KGludDY0X3QgdmFsdWUpIGNv
bnN0Cit7CisgICAgcmV0dXJuIGhhc0ludCgpICYmIGFzSW50KCkgPT0gdmFsdWU7Cit9CisKK2Jv
b2wgVmFsdWU6Omhhc0RvdWJsZSgpIGNvbnN0Cit7CisgICAgcmV0dXJuICEhYXM8Q29uc3REb3Vi
bGVWYWx1ZT4oKTsKK30KKworZG91YmxlIFZhbHVlOjphc0RvdWJsZSgpIGNvbnN0Cit7CisgICAg
cmV0dXJuIGFzPENvbnN0RG91YmxlVmFsdWU+KCktPnZhbHVlKCk7Cit9CisKK30gfSAvLyBuYW1l
c3BhY2UgSlNDOjpCMworCisjZW5kaWYgLy8gQjNWYWx1ZUlubGluZXNfaAorCkluZGV4OiBTb3Vy
Y2UvSmF2YVNjcmlwdENvcmUvYjMvQjNWYWx1ZVJlcC5jcHAKPT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNl
L0phdmFTY3JpcHRDb3JlL2IzL0IzVmFsdWVSZXAuY3BwCShyZXZpc2lvbiAwKQorKysgU291cmNl
L0phdmFTY3JpcHRDb3JlL2IzL0IzVmFsdWVSZXAuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAg
KzEsODYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTUgQXBwbGUgSW5jLiBBbGwgcmlnaHRz
IHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBi
aW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0
dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0Ogor
ICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92
ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRo
ZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkg
Zm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRo
aXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhl
CisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0
aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkg
QVBQTEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJB
TlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FS
UkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgor
ICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4g
T1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJ
TkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFH
RVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VC
U1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9G
SVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkg
VEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFC
SUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFS
SVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZF
TiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKwor
I2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgIkIzVmFsdWVSZXAuaCIKKworbmFtZXNwYWNl
IEpTQyB7IG5hbWVzcGFjZSBCMyB7CisKK3ZvaWQgVmFsdWVSZXA6OmR1bXAoUHJpbnRTdHJlYW0m
IG91dCkgY29uc3QKK3sKKyAgICBvdXQucHJpbnQobV9raW5kKTsKKyAgICBzd2l0Y2ggKG1fa2lu
ZCkgeworICAgIGNhc2UgTm9uZToKKyAgICBjYXNlIFNvbWVSZWdpc3RlcjoKKyAgICAgICAgcmV0
dXJuOworICAgIGNhc2UgUmVnaXN0ZXI6CisgICAgICAgIG91dC5wcmludCgiKCIsIHJlZygpLCAi
KSIpOworICAgICAgICByZXR1cm47CisgICAgY2FzZSBTdGFjazoKKyAgICAgICAgb3V0LnByaW50
KCIoIiwgb2Zmc2V0RnJvbUZQKCksICIpIik7CisgICAgICAgIHJldHVybjsKKyAgICBjYXNlIFN0
YWNrQXJndW1lbnQ6CisgICAgICAgIG91dC5wcmludCgiKCIsIG9mZnNldEZyb21TUCgpLCAiKSIp
OworICAgICAgICByZXR1cm47CisgICAgY2FzZSBDb25zdGFudDoKKyAgICAgICAgb3V0LnByaW50
KCIoIiwgdmFsdWUoKSwgIikiKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBSRUxFQVNF
X0FTU0VSVF9OT1RfUkVBQ0hFRCgpOworfQorCit9IH0gLy8gbmFtZXNwYWNlIEpTQzo6QjMKKwor
bmFtZXNwYWNlIFdURiB7CisKK3VzaW5nIG5hbWVzcGFjZSBKU0M6OkIzOworCit2b2lkIHByaW50
SW50ZXJuYWwoUHJpbnRTdHJlYW0mIG91dCwgVmFsdWVSZXA6OktpbmQga2luZCkKK3sKKyAgICBz
d2l0Y2ggKGtpbmQpIHsKKyAgICBjYXNlIFZhbHVlUmVwOjpBbnk6CisgICAgICAgIG91dC5wcmlu
dCgiQW55Iik7CisgICAgICAgIHJldHVybjsKKyAgICBjYXNlIFZhbHVlUmVwOjpTb21lUmVnaXN0
ZXI6CisgICAgICAgIG91dC5wcmludCgiU29tZVJlZ2lzdGVyIik7CisgICAgICAgIHJldHVybjsK
KyAgICBjYXNlIFZhbHVlUmVwOjpSZWdpc3RlcjoKKyAgICAgICAgb3V0LnByaW50KCJSZWdpc3Rl
ciIpOworICAgICAgICByZXR1cm47CisgICAgY2FzZSBWYWx1ZVJlcDo6U3RhY2s6CisgICAgICAg
IG91dC5wcmludCgiU3RhY2siKTsKKyAgICAgICAgcmV0dXJuOworICAgIGNhc2UgVmFsdWVSZXA6
OlN0YWNrQXJndW1lbnQ6CisgICAgICAgIG91dC5wcmludCgiU3RhY2tBcmd1bWVudCIpOworICAg
ICAgICByZXR1cm47CisgICAgY2FzZSBWYWx1ZVJlcDo6Q29uc3RhbnQ6CisgICAgICAgIG91dC5w
cmludCgiQ29uc3RhbnQiKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBSRUxFQVNFX0FT
U0VSVF9OT1RfUkVBQ0hFRCgpOworfQorCit9IC8vIG5hbWVzcGFjZSBXVEYKKwpJbmRleDogU291
cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzVmFsdWVSZXAuaAo9PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2Uv
SmF2YVNjcmlwdENvcmUvYjMvQjNWYWx1ZVJlcC5oCShyZXZpc2lvbiAwKQorKysgU291cmNlL0ph
dmFTY3JpcHRDb3JlL2IzL0IzVmFsdWVSZXAuaAkod29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDE1
NiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNSBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVz
ZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFy
eSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQg
cHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAx
LiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNv
cHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZv
bGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3Jt
IG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBs
aXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAq
ICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRo
ZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBM
RSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElF
UywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5U
SUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQ
VVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUgor
ICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lE
RU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAo
SU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElU
VVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7
IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVP
UlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElU
WSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lO
RyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElG
IEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLiAKKyAqLworCisjaWZu
ZGVmIEIzVmFsdWVSZXBfaAorI2RlZmluZSBCM1ZhbHVlUmVwX2gKKworI2luY2x1ZGUgIlJlZy5o
IgorI2luY2x1ZGUgPHd0Zi9QcmludFN0cmVhbS5oPgorCituYW1lc3BhY2UgSlNDIHsgbmFtZXNw
YWNlIEIzIHsKKworLy8gV2UgdXNlIHRoaXMgY2xhc3MgdG8gZGVzY3JpYmUgdmFsdWUgcmVwcmVz
ZW50YXRpb25zIGF0IHN0YWNrbWFwcy4gSXQncyB1c2VkIGJvdGggdG8gZm9yY2UgYQorLy8gcmVw
cmVzZW50YXRpb24gYW5kIHRvIGdldCB0aGUgcmVwcmVzZW50YXRpb24uIFdoZW4gdGhlIEIzIGNs
aWVudCBmb3JjZXMgYSByZXByZXNlbnRhdGlvbiwgd2Ugc2F5CisvLyB0aGF0IGl0J3MgYW4gaW5w
dXQuIFdoZW4gQjMgdGVsbHMgdGhlIGNsaWVudCB3aGF0IHJlcHJlc2VudGF0aW9uIGl0IHBpY2tl
ZCwgd2Ugc2F5IHRoYXQgaXQncyBhbgorLy8gb3V0cHV0LgorCitjbGFzcyBWYWx1ZVJlcCB7Citw
dWJsaWM6CisgICAgZW51bSBLaW5kIHsKKyAgICAgICAgLy8gQXMgYW4gaW5wdXQgcmVwcmVzZW50
YXRpb24sIHRoaXMgbWVhbnMgdGhhdCBCMyBjYW4gcGljayBhbnkgcmVwcmVzZW50YXRpb24uCisg
ICAgICAgIEFueSwKKworICAgICAgICAvLyBBcyBhbiBpbnB1dCByZXByZXNlbnRhdGlvbiwgdGhp
cyBtZWFucyB0aGF0IEIzIHNob3VsZCBwaWNrIHNvbWUgcmVnaXN0ZXIsIHByb3ZpZGVkIHRoYXQK
KyAgICAgICAgLy8gaXQncyBub3QgYWxzbyBhIHJlZ2lzdGVyIHRoYXQgd2FzIGNsb2JiZXJlZC4K
KyAgICAgICAgU29tZVJlZ2lzdGVyLAorCisgICAgICAgIC8vIEFzIGFuIGlucHV0IHJlcHJlc2Vu
dGF0aW9uLCB0aGlzIGZvcmNlcyBhIHBhcnRpY3VsYXIgcmVnaXN0ZXIuIEFzIGFuIG91dHB1dAor
ICAgICAgICAvLyByZXByZXNlbnRhdGlvbiwgdGhpcyB0ZWxscyB1cyB3aGF0IHJlZ2lzdGVyIEIz
IHBpY2tlZC4KKyAgICAgICAgUmVnaXN0ZXIsCisKKyAgICAgICAgLy8gQXMgYW4gb3V0cHV0IHJl
cHJlc2VudGF0aW9uLCB0aGlzIHRlbGxzIHVzIHdoYXQgc3RhY2sgc2xvdCBCMyBwaWNrZWQuIEl0
J3Mgbm90IGEgdmFsaWQKKyAgICAgICAgLy8gaW5wdXQgcmVwcmVzZW50YXRpb24uCisgICAgICAg
IFN0YWNrLAorCisgICAgICAgIC8vIEFzIGFuIGlucHV0IHJlcHJlc2VudGF0aW9uLCB0aGlzIGZv
cmNlcyB0aGUgdmFsdWUgdG8gZW5kIHVwIGluIHRoZSBhcmd1bWVudCBhcmVhIGF0IHNvbWUKKyAg
ICAgICAgLy8gb2Zmc2V0LgorICAgICAgICBTdGFja0FyZ3VtZW50LAorCisgICAgICAgIC8vIEFz
IGFuIG91dHB1dCByZXByZXNlbnRhdGlvbiwgdGhpcyB0ZWxscyB1cyB0aGF0IEIzIGNvbnN0YW50
LWZvbGRlZCB0aGUgdmFsdWUuCisgICAgICAgIENvbnN0YW50CisgICAgfTsKKyAgICAKKyAgICBW
YWx1ZVJlcCgpCisgICAgICAgIDogbV9raW5kKEFueSkKKyAgICB7CisgICAgfQorCisgICAgZXhw
bGljaXQgVmFsdWVSZXAoUmVnIHJlZykKKyAgICAgICAgOiBtX2tpbmQoUmVnaXN0ZXIpCisgICAg
ICAgICwgbV92YWx1ZShyZWcuaW5kZXgoKSkKKyAgICB7CisgICAgfQorCisgICAgc3RhdGljIFZh
bHVlUmVwIHJlZyhSZWcgcmVnKQorICAgIHsKKyAgICAgICAgcmV0dXJuIFZhbHVlUmVwKHJlZyk7
CisgICAgfQorCisgICAgc3RhdGljIFZhbHVlUmVwIHN0YWNrKGludHB0cl90IG9mZnNldEZyb21G
UCkKKyAgICB7CisgICAgICAgIFZhbHVlUmVwIHJlc3VsdDsKKyAgICAgICAgcmVzdWx0Lm1fa2lu
ZCA9IFN0YWNrOworICAgICAgICByZXN1bHQubV92YWx1ZSA9IG9mZnNldEZyb21GUDsKKyAgICB9
CisKKyAgICBzdGF0aWMgVmFsdWVSZXAgc3RhY2tBcmd1bWVudChpbnRwdHJfdCBvZmZzZXRGcm9t
U1ApCisgICAgeworICAgICAgICBWYWx1ZVJlcCByZXN1bHQ7CisgICAgICAgIHJlc3VsdC5tX2tp
bmQgPSBTdGFja0FyZ3VtZW50OworICAgICAgICByZXN1bHQubV92YWx1ZSA9IG9mZnNldEZyb21T
UDsKKyAgICB9CisKKyAgICBzdGF0aWMgVmFsdWVSZXAgY29uc3RhbnQoaW50NjRfdCB2YWx1ZSkK
KyAgICB7CisgICAgICAgIFZhbHVlUmVwIHJlc3VsdDsKKyAgICAgICAgcmVzdWx0Lm1fa2luZCA9
IENvbnN0YW50OworICAgICAgICByZXN1bHQubV92YWx1ZSA9IHZhbHVlOworICAgIH0KKworICAg
IHN0YXRpYyBWYWx1ZVJlcCBjb25zdGFudChkb3VibGUgdmFsdWUpCisgICAgeworICAgICAgICBy
ZXR1cm4gVmFsdWVSZXAoYml0d2lzZV9jYXN0PGludDY0X3Q+KHZhbHVlKSk7CisgICAgfQorCisg
ICAgS2luZCBraW5kKCkgY29uc3QgeyByZXR1cm4gbV9raW5kOyB9CisKKyAgICBleHBsaWNpdCBv
cGVyYXRvciBib29sKCkgY29uc3QgeyByZXR1cm4ga2luZCgpICE9IEFueTsgfQorCisgICAgUmVn
IHJlZygpIGNvbnN0CisgICAgeworICAgICAgICBBU1NFUlQoa2luZCgpID09IFJlZ2lzdGVyKTsK
KyAgICAgICAgcmV0dXJuIFJlZzo6ZnJvbUluZGV4KG1fdmFsdWUpOworICAgIH0KKworICAgIGlu
dHB0cl90IG9mZnNldEZyb21GUCgpIGNvbnN0CisgICAgeworICAgICAgICBBU1NFUlQoa2luZCgp
ID09IFN0YWNrKTsKKyAgICAgICAgcmV0dXJuIHN0YXRpY19jYXN0PGludHB0cl90PihtX3ZhbHVl
KTsKKyAgICB9CisKKyAgICBpbnRwdHJfdCBvZmZzZXRGcm9tU1AoKSBjb25zdAorICAgIHsKKyAg
ICAgICAgQVNTRVJUKGtpbmQoKSA9PSBTdGFja0FyZ3VtZW50KTsKKyAgICAgICAgcmV0dXJuIHN0
YXRpY19jYXN0PGludHB0cl90PihtX3ZhbHVlKTsKKyAgICB9CisKKyAgICBpbnQ2NF90IHZhbHVl
KCkgY29uc3QKKyAgICB7CisgICAgICAgIEFTU0VSVChraW5kKCkgPT0gQ29uc3RhbnQpOworICAg
ICAgICByZXR1cm4gbV92YWx1ZTsKKyAgICB9CisKKyAgICBkb3VibGUgZG91YmxlVmFsdWUoKSBj
b25zdAorICAgIHsKKyAgICAgICAgcmV0dXJuIGJpdHdpc2VfY2FzdDxkb3VibGU+KHZhbHVlKCkp
OworICAgIH0KKworICAgIHZvaWQgZHVtcChQcmludFN0cmVhbSYpIGNvbnN0OworCitwcml2YXRl
OgorICAgIEtpbmQgbV9raW5kOworICAgIGludDY0X3QgbV92YWx1ZTsKK307CisKK30gfSAvLyBu
YW1lc3BhY2UgSlNDOjpCMworCituYW1lc3BhY2UgV1RGIHsKKwordm9pZCBwcmludEludGVybmFs
KFByaW50U3RyZWFtJiwgSlNDOjpCMzo6VmFsdWVSZXA6OktpbmQpOworCit9IC8vIG5hbWVzcGFj
ZSBXVEYKKworI2VuZGlmIC8vIEIzVmFsdWVSZXBfaAorCkluZGV4OiBTb3VyY2UvSmF2YVNjcmlw
dENvcmUvYjMvZ2VuZXJhdGVfcGF0dGVybl9tYXRjaGVyLnJiCj09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJj
ZS9KYXZhU2NyaXB0Q29yZS9iMy9nZW5lcmF0ZV9wYXR0ZXJuX21hdGNoZXIucmIJKHJldmlzaW9u
IDApCisrKyBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvZ2VuZXJhdGVfcGF0dGVybl9tYXRjaGVy
LnJiCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsNDY5IEBACisjIS91c3IvYmluL2VudiBydWJ5
CisKKyMgQ29weXJpZ2h0IChDKSAyMDE1IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4K
KyMKKyMgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywg
d2l0aCBvciB3aXRob3V0CisjIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0
aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworIyBhcmUgbWV0OgorIyAxLiBSZWRpc3RyaWJ1
dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorIyAg
ICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2Ns
YWltZXIuCisjIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVj
ZSB0aGUgYWJvdmUgY29weXJpZ2h0CisjICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlv
bnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyMgICAgZG9jdW1lbnRhdGlv
biBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4K
KyMKKyMgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIEFORCBJVFMgQ09O
VFJJQlVUT1JTIGBgQVMgSVMnJworIyBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5U
SUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyMgVEhFIElNUExJRUQgV0FSUkFO
VElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorIyBQ
VVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SIElU
UyBDT05UUklCVVRPUlMKKyMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5D
SURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgorIyBDT05TRVFVRU5USUFMIERBTUFHRVMg
KElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgorIyBTVUJTVElU
VVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1Ig
QlVTSU5FU1MKKyMgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9S
WSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KKyMgQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFks
IE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKyMgQVJJU0lORyBJ
TiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNF
RCBPRgorIyBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKK3JlcXVpcmUgInBhdGhu
YW1lIgorCiskdmFySW5kZXggPSAwCitkZWYgbmV3VmFyCisgICAgJHZhckluZGV4ICs9IDEKKyAg
ICAiX3RtcCN7JHZhckluZGV4fSIKK2VuZAorCitjbGFzcyBQcm9kdWN0aW9uCisgICAgYXR0cl9y
ZWFkZXIgOm9yaWdpbiwgOm5hbWUsIDp2YXJOYW1lLCA6YW5vbnltb3VzLCA6b3Bjb2RlLCA6Y2hp
bGRyZW4KKworICAgIGRlZiBpbml0aWFsaXplKG9yaWdpbiwgbmFtZSwgb3Bjb2RlLCBjaGlsZHJl
bikKKyAgICAgICAgQG9yaWdpbiA9IG9yaWdpbgorICAgICAgICBAbmFtZSA9IG5hbWUKKyAgICAg
ICAgQGFub255bW91cyA9IChuYW1lID09IG5pbCBvciBuYW1lID1+IC9cQVwkKFswLTldKylcWi8p
CisgICAgICAgIEB2YXJOYW1lID0gQGFub255bW91cyA/IG5ld1ZhciA6IG5hbWUKKyAgICAgICAg
QG9wY29kZSA9IG9wY29kZQorICAgICAgICBAY2hpbGRyZW4gPSBjaGlsZHJlbiA/IGNoaWxkcmVu
IDogW10KKyAgICBlbmQKKworICAgIGRlZiBoYXNPcGNvZGUKKyAgICAgICAgb3Bjb2RlICE9IG5p
bAorICAgIGVuZAorCisgICAgZGVmIGVhY2hWYXJpYWJsZSgmcHJvYykKKyAgICAgICAgY2hpbGRy
ZW4uZWFjaF93aXRoX2luZGV4IHsKKyAgICAgICAgICAgIHwgY2hpbGQsIGluZGV4IHwKKyAgICAg
ICAgICAgIHlpZWxkIHZhck5hbWUsCisgICAgICAgICAgICAgICAgICBjaGlsZC5uYW1lLAorICAg
ICAgICAgICAgICAgICAgY2hpbGQudmFyTmFtZSwKKyAgICAgICAgICAgICAgICAgIGNoaWxkLmFu
b255bW91cyA/IChjaGlsZC5vcGNvZGUgPyA6YW5vbkludGVybmFsIDogOmFub25PcGVyYW5kKSA6
IChjaGlsZC5vcGNvZGUgPyA6aW50ZXJuYWwgOiA6b3BlcmFuZCksCisgICAgICAgICAgICAgICAg
ICBpbmRleAorICAgICAgICAgICAgY2hpbGQuZWFjaFZhcmlhYmxlKCZwcm9jKQorICAgICAgICB9
CisgICAgZW5kCitlbmQKKworY2xhc3MgTWF0Y2hlcgorICAgIGF0dHJfcmVhZGVyIDpuYW1lLCA6
cHJvZHVjdGlvbnMKKworICAgIGRlZiBpbml0aWFsaXplKG5hbWUsIHByb2R1Y3Rpb25zKQorICAg
ICAgICBAbmFtZSA9IG5hbWUKKyAgICAgICAgQHByb2R1Y3Rpb25zID0gcHJvZHVjdGlvbnMKKyAg
ICBlbmQKK2VuZAorCitjbGFzcyBPcmlnaW4KKyAgICBhdHRyX3JlYWRlciA6ZmlsZU5hbWUsIDps
aW5lTnVtYmVyCisgICAgCisgICAgZGVmIGluaXRpYWxpemUoZmlsZU5hbWUsIGxpbmVOdW1iZXIp
CisgICAgICAgIEBmaWxlTmFtZSA9IGZpbGVOYW1lCisgICAgICAgIEBsaW5lTnVtYmVyID0gbGlu
ZU51bWJlcgorICAgIGVuZAorICAgIAorICAgIGRlZiB0b19zCisgICAgICAgICIje2ZpbGVOYW1l
fToje2xpbmVOdW1iZXJ9IgorICAgIGVuZAorZW5kCisKK2NsYXNzIFRva2VuCisgICAgYXR0cl9y
ZWFkZXIgOm9yaWdpbiwgOnN0cmluZworICAgIAorICAgIGRlZiBpbml0aWFsaXplKG9yaWdpbiwg
c3RyaW5nKQorICAgICAgICBAb3JpZ2luID0gb3JpZ2luCisgICAgICAgIEBzdHJpbmcgPSBzdHJp
bmcKKyAgICBlbmQKKyAgICAKKyAgICBkZWYgPT0ob3RoZXIpCisgICAgICAgIGlmIG90aGVyLmlz
X2E/IFRva2VuCisgICAgICAgICAgICBAc3RyaW5nID09IG90aGVyLnN0cmluZworICAgICAgICBl
bHNlCisgICAgICAgICAgICBAc3RyaW5nID09IG90aGVyCisgICAgICAgIGVuZAorICAgIGVuZAor
ICAgIAorICAgIGRlZiA9fihvdGhlcikKKyAgICAgICAgQHN0cmluZyA9fiBvdGhlcgorICAgIGVu
ZAorICAgIAorICAgIGRlZiB0b19zCisgICAgICAgICIje0BzdHJpbmcuaW5zcGVjdH0gYXQgI3tv
cmlnaW59IgorICAgIGVuZAorICAgIAorICAgIGRlZiBwYXJzZUVycm9yKCpjb21tZW50KQorICAg
ICAgICBpZiBjb21tZW50LmVtcHR5PworICAgICAgICAgICAgcmFpc2UgIlBhcnNlIGVycm9yOiAj
e3RvX3N9IgorICAgICAgICBlbHNlCisgICAgICAgICAgICByYWlzZSAiUGFyc2UgZXJyb3I6ICN7
dG9fc306ICN7Y29tbWVudFswXX0iCisgICAgICAgIGVuZAorICAgIGVuZAorZW5kCisKK2RlZiBs
ZXgoc3RyLCBmaWxlTmFtZSkKKyAgICBmaWxlTmFtZSA9IFBhdGhuYW1lLm5ldyhmaWxlTmFtZSkK
KyAgICByZXN1bHQgPSBbXQorICAgIGxpbmVOdW1iZXIgPSAxCisgICAgd2hpbGUgbm90IHN0ci5l
bXB0eT8KKyAgICAgICAgY2FzZSBzdHIKKyAgICAgICAgd2hlbiAvXEFcIyhbXlxuXSopLworICAg
ICAgICAgICAgIyBjb21tZW50LCBpZ25vcmUKKyAgICAgICAgd2hlbiAvXEFcbi8KKyAgICAgICAg
ICAgICMgbmV3bGluZSwgaWdub3JlCisgICAgICAgICAgICBsaW5lTnVtYmVyICs9IDEKKyAgICAg
ICAgd2hlbiAvXEEoW2EtekEtWjAtOV8kXSspLworICAgICAgICAgICAgcmVzdWx0IDw8IFRva2Vu
Lm5ldyhPcmlnaW4ubmV3KGZpbGVOYW1lLCBsaW5lTnVtYmVyKSwgJCYpCisgICAgICAgIHdoZW4g
L1xBKFsgXHRccl0rKS8KKyAgICAgICAgICAgICMgd2hpdGVzcGFjZSwgaWdub3JlCisgICAgICAg
IHdoZW4gL1xBWz0oKSxdLworICAgICAgICAgICAgcmVzdWx0IDw8IFRva2VuLm5ldyhPcmlnaW4u
bmV3KGZpbGVOYW1lLCBsaW5lTnVtYmVyKSwgJCYpCisgICAgICAgIGVsc2UKKyAgICAgICAgICAg
IHJhaXNlICJMZXhlciBlcnJvciBhdCAje09yaWdpbi5uZXcoZmlsZU5hbWUsIGxpbmVOdW1iZXIp
LnRvX3N9LCB1bmV4cGVjdGVkIHNlcXVlbmNlICN7c3RyWzAuLjIwXS5pbnNwZWN0fSIKKyAgICAg
ICAgZW5kCisgICAgICAgIHN0ciA9ICR+LnBvc3RfbWF0Y2gKKyAgICBlbmQKKyAgICByZXN1bHQK
K2VuZAorCitkZWYgaXNLZXl3b3JkKHRva2VuKQorICAgICMgV2UgY2FuIGV4dGVuZCB0aGlzIGFz
IHdlIGFkZCBtb3JlIGtleXdvcmRzLiBMaWtlLCB3ZSBtaWdodCB3YW50ICJpbmNsdWRlIiBldmVu
dHVhbGx5LgorICAgIHRva2VuID1+IC9cQSgobWF0Y2hlcikpXFovCitlbmQKKworZGVmIGlzSWRl
bnRpZmllcih0b2tlbikKKyAgICB0b2tlbiA9fiAvXEFbYS16QS1aMC05JF0oW2EtekEtWjAtOV8u
XSopXFovIGFuZCBub3QgaXNLZXl3b3JkKHRva2VuKQorZW5kCisKK2NsYXNzIFBhcnNlcgorICAg
IGRlZiBpbml0aWFsaXplKGRhdGEsIGZpbGVOYW1lKQorICAgICAgICBAdG9rZW5zID0gbGV4KGRh
dGEsIGZpbGVOYW1lKQorICAgICAgICBAaWR4ID0gMAorICAgIGVuZAorCisgICAgZGVmIHRva2Vu
CisgICAgICAgIEB0b2tlbnNbQGlkeF0KKyAgICBlbmQKKworICAgIGRlZiBhZHZhbmNlCisgICAg
ICAgIEBpZHggKz0gMQorICAgIGVuZAorCisgICAgZGVmIHBhcnNlRXJyb3IoKmNvbW1lbnQpCisg
ICAgICAgIGlmIHRva2VuCisgICAgICAgICAgICB0b2tlbi5wYXJzZUVycm9yKCpjb21tZW50KQor
ICAgICAgICBlbHNlCisgICAgICAgICAgICBpZiBjb21tZW50LmVtcHR5PworICAgICAgICAgICAg
ICAgIHJhaXNlICJQYXJzZSBlcnJvciBhdCBlbmQgb2YgZmlsZSIKKyAgICAgICAgICAgIGVsc2UK
KyAgICAgICAgICAgICAgICByYWlzZSAiUGFyc2UgZXJyb3IgYXQgZW5kIG9mIGZpbGU6ICN7Y29t
bWVudFswXX0iCisgICAgICAgICAgICBlbmQKKyAgICAgICAgZW5kCisgICAgZW5kCisKKyAgICBk
ZWYgY29uc3VtZShzdHJpbmcpCisgICAgICAgIHBhcnNlRXJyb3IoIkV4cGVjdGVkICN7c3RyaW5n
fSIpIHVubGVzcyB0b2tlbiA9PSBzdHJpbmcKKyAgICAgICAgYWR2YW5jZQorICAgIGVuZAorCisg
ICAgZGVmIGNvbnN1bWVJZGVudGlmaWVyCisgICAgICAgIHJlc3VsdCA9IHRva2VuLnN0cmluZwor
ICAgICAgICBwYXJzZUVycm9yKCJFeHBlY3RlZCBpZGVudGlmaWVyIikgdW5sZXNzIGlzSWRlbnRp
ZmllcihyZXN1bHQpCisgICAgICAgIGFkdmFuY2UKKyAgICAgICAgcmVzdWx0CisgICAgZW5kCisK
KyAgICBkZWYgYWRkVW5pcXVlKG5hbWUsIHByb2R1Y3Rpb25zLCBwcm9kdWN0aW9uKQorICAgICAg
ICBpZiBuYW1lID09IHByb2R1Y3Rpb24udmFyTmFtZQorICAgICAgICAgICAgcGFyc2VFcnJvcigi
Q2hpbGQgcHJvZHVjdGlvbiBoYXMgc2FtZSBuYW1lIGFzIHBhcmVudCBwcm9kdWN0aW9uIikKKyAg
ICAgICAgZW5kCisgICAgICAgIGlmIHByb2R1Y3Rpb25zLmRldGVjdCB7IHwgZW50cnkgfCBlbnRy
eS5uYW1lID09IHByb2R1Y3Rpb24ubmFtZSB9CisgICAgICAgICAgICBwYXJzZUVycm9yKCJEdXBs
aWNhdGUgcHJvZHVjdGlvbiIpCisgICAgICAgIGVuZAorICAgICAgICBwcm9kdWN0aW9ucyA8PCBw
cm9kdWN0aW9uCisgICAgZW5kCisKKyAgICBkZWYgcGFyc2UKKyAgICAgICAgY29uc3VtZSgibWF0
Y2hlciIpCisKKyAgICAgICAgbWF0Y2hlck5hbWUgPSBjb25zdW1lSWRlbnRpZmllcgorCisgICAg
ICAgIHByb2R1Y3Rpb25zID0gW10KKworICAgICAgICBsb29wIHsKKyAgICAgICAgICAgIGJyZWFr
IGlmIEBpZHggPj0gQHRva2Vucy5sZW5ndGgKKworICAgICAgICAgICAgIyBXZSBtaWdodCB3YW50
IHRvIHN1cHBvcnQgImluY2x1ZGUiLiBJZiB3ZSBkaWQgdGhhdCwgaXQgd291bGQgZ28gaGVyZS4K
KyAgICAgICAgICAgIGFkZFVuaXF1ZShtYXRjaGVyTmFtZSwgcHJvZHVjdGlvbnMsIHBhcnNlUHJv
ZHVjdGlvbikKKyAgICAgICAgfQorCisgICAgICAgIE1hdGNoZXIubmV3KG1hdGNoZXJOYW1lLCBw
cm9kdWN0aW9ucykKKyAgICBlbmQKKworICAgIGRlZiBwYXJzZVByb2R1Y3Rpb24KKyAgICAgICAg
b3JpZ2luID0gdG9rZW4ub3JpZ2luCisgICAgICAgIG5hbWUgPSBjb25zdW1lSWRlbnRpZmllcgor
CisgICAgICAgIGlmIHRva2VuID09ICI9IgorICAgICAgICAgICAgY29uc3VtZSgiPSIpCisgICAg
ICAgICAgICBvcGNvZGUgPSBjb25zdW1lSWRlbnRpZmllcgorICAgICAgICAgICAgY29uc3VtZSgi
KCIpCisgICAgICAgIGVsc2lmIHRva2VuID09ICIoIgorICAgICAgICAgICAgY29uc3VtZSgiKCIp
CisgICAgICAgICAgICBvcGNvZGUgPSBuYW1lCisgICAgICAgICAgICBuYW1lID0gbmlsCisgICAg
ICAgIGVsc2UKKyAgICAgICAgICAgIHJldHVybiBQcm9kdWN0aW9uLm5ldyhvcmlnaW4sIG5hbWUs
IG5pbCwgbmlsKQorICAgICAgICBlbmQKKyAgICAgICAgCisgICAgICAgIHByb2R1Y3Rpb25zID0g
W10KKyAgICAgICAgbG9vcCB7CisgICAgICAgICAgICBicmVhayBpZiB0b2tlbiA9PSAiKSIKKwor
ICAgICAgICAgICAgYWRkVW5pcXVlKG5hbWUsIHByb2R1Y3Rpb25zLCBwYXJzZVByb2R1Y3Rpb24p
CisKKyAgICAgICAgICAgIGJyZWFrIGlmIHRva2VuID09ICIpIgorICAgICAgICAgICAgY29uc3Vt
ZSgiLCIpCisgICAgICAgIH0KKworICAgICAgICAjIEFkdmFuY2UgYWZ0ZXIgdGhlICIpIgorICAg
ICAgICBhZHZhbmNlCisKKyAgICAgICAgUHJvZHVjdGlvbi5uZXcob3JpZ2luLCBuYW1lLCBvcGNv
ZGUsIHByb2R1Y3Rpb25zKQorICAgIGVuZAorZW5kCisKK2ZpbGVOYW1lID0gQVJHVlswXQorCitw
YXJzZXIgPSBQYXJzZXIubmV3KElPOjpyZWFkKGZpbGVOYW1lKSwgZmlsZU5hbWUpCittYXRjaGVy
ID0gcGFyc2VyLnBhcnNlCisKK2NsYXNzIFN1Yk1hdGNoCisgICAgYXR0cl9yZWFkZXIgOmluZGV4
TWFwLCA6cHJvZHVjdGlvbnMKKyAgICAKKyAgICBkZWYgaW5pdGlhbGl6ZShpbmRleExpc3QsIHBy
b2R1Y3Rpb25zKQorICAgICAgICBAaW5kZXhNYXAgPSBbXQorICAgICAgICBAcHJvZHVjdGlvbnMg
PSBbXQorICAgICAgICBpbmRleExpc3QuZWFjaCB7CisgICAgICAgICAgICB8IGluZGV4IHwKKyAg
ICAgICAgICAgIEBpbmRleE1hcCA8PCBpbmRleAorICAgICAgICAgICAgQHByb2R1Y3Rpb25zIDw8
IHByb2R1Y3Rpb25zW2luZGV4XQorICAgICAgICB9CisgICAgZW5kCisKKyAgICBkZWYgbWFwSW5k
ZXhMaXN0KGluZGV4TGlzdCkKKyAgICAgICAgaW5kZXhMaXN0Lm1hcCB7CisgICAgICAgICAgICB8
IGluZGV4IHwKKyAgICAgICAgICAgIEBpbmRleE1hcFtpbmRleF0KKyAgICAgICAgfQorICAgIGVu
ZAorZW5kCisKK0ZpbGUub3BlbigiQjMiICsgbWF0Y2hlci5uYW1lICsgIi5oIiwgInciKSB7Cisg
ICAgfCBvdXRwIHwKKworICAgIG91dHAucHV0cyAiLy8gR2VuZXJhdGVkIGJ5IGdlbmVyYXRlX3Bh
dHRlcm5fbWF0Y2hlci5yYiBmcm9tICN7ZmlsZU5hbWV9IC0tIGRvIG5vdCBlZGl0ISIKKworICAg
IG91dHAucHV0cyAiI2lmbmRlZiBCMyN7bWF0Y2hlci5uYW1lfV9oIgorICAgIG91dHAucHV0cyAi
I2RlZmluZSBCMyN7bWF0Y2hlci5uYW1lfV9oIgorICAgIAorICAgIG91dHAucHV0cyAiI2luY2x1
ZGUgXCJCM1ZhbHVlLmhcIiIKKyAgICAKKyAgICBvdXRwLnB1dHMgIm5hbWVzcGFjZSBKU0MgeyBu
YW1lc3BhY2UgQjMgeyIKKworICAgIG91dHAucHV0cyAidGVtcGxhdGU8dHlwZW5hbWUgQWRhcHRv
cj4iCisgICAgb3V0cC5wdXRzICJ2b2lkIHJ1biN7bWF0Y2hlci5uYW1lfShWYWx1ZSogdmFsdWUs
IEFkYXB0b3ImIGFkYXB0b3IpIgorICAgIG91dHAucHV0cyAieyIKKworICAgICMgTm90ZSB0aGF0
IHRoaXMgZG9lcyBub3QgZW1pdCBwcm9wZXJseSBpbmRlbnRlZCBjb2RlLCBiZWNhdXNlIGl0J3Mg
YSByZWN1cnNpdmUgZW1pdHRlci4gSWYgeW91CisgICAgIyB3YW50IHRvIHNlZSB0aGUgY29kZSBu
aWNlbHkgZm9ybWF0dGVkLCBvcGVuIGl0IGluIGEgZ29vZCB0ZXh0IGVkaXRvciBhbmQgYXNrIGl0
IHRvIGZvcm1hdCBpdAorICAgICMgZm9yIHlvdS4KKworICAgICMgVGhpcyBqdXN0IHByb3RlY3Rz
IHRoZSBjYWxsZXIgZnJvbSBoYXZpbmcgdG8gd29ycnkgYWJvdXQgcHJvZHVjdGlvbnMgaGF2aW5n
IGRpZmZlcmVudCBsZW5ndGhzLgorICAgIGRlZiBtYXRjaExlbmd0aChvdXRwLCB2YWx1ZU5hbWUs
IHByb2R1Y3Rpb25zKQorICAgICAgICBpbmRleExpc3RzID0gW10KKyAgICAgICAgcHJvZHVjdGlv
bnMuZWFjaF93aXRoX2luZGV4IHsKKyAgICAgICAgICAgIHwgcHJvZHVjdGlvbiwgaW5kZXggfAor
ICAgICAgICAgICAgaWYgaW5kZXhMaXN0c1stMV0gYW5kIHByb2R1Y3Rpb25zW2luZGV4TGlzdHNb
LTFdWzBdXS5jaGlsZHJlbi5sZW5ndGggPT0gcHJvZHVjdGlvbi5jaGlsZHJlbi5sZW5ndGgKKyAg
ICAgICAgICAgICAgICBpbmRleExpc3RzWy0xXSA8PCBpbmRleAorICAgICAgICAgICAgZWxzZQor
ICAgICAgICAgICAgICAgIGluZGV4TGlzdHMgPDwgW2luZGV4XQorICAgICAgICAgICAgZW5kCisg
ICAgICAgIH0KKworICAgICAgICBpbmRleExpc3RzLmVhY2ggeworICAgICAgICAgICAgfCBpbmRl
eExpc3QgfAorICAgICAgICAgICAgbGVuZ3RoID0gcHJvZHVjdGlvbnNbaW5kZXhMaXN0WzBdXS5j
aGlsZHJlbi5sZW5ndGgKKyAgICAgICAgICAgIGlmIGxlbmd0aCA+IDAKKyAgICAgICAgICAgICAg
ICBvdXRwLnB1dHMgImlmICgje3ZhbHVlTmFtZX0tPmNoaWxkcmVuLnNpemUoKSA+PSAje2xlbmd0
aH0pIHsiCisgICAgICAgICAgICAgICAgeWllbGQgaW5kZXhMaXN0CisgICAgICAgICAgICAgICAg
b3V0cC5wdXRzICJ9IgorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHlpZWxkIGlu
ZGV4TGlzdAorICAgICAgICAgICAgZW5kCisgICAgICAgIH0KKyAgICBlbmQKKworICAgICMgVGhp
cyBlZmZpY2llbnRseSBzZWxlY3RzIGZyb20gdGhlIGdpdmVuIHNldCBvZiBwcm9kdWN0aW9ucy4g
SXQgYXNzdW1lcyB0aGF0IHByb2R1Y3Rpb25zCisgICAgIyBhcmUgbm90IGR1cGxpY2F0ZWQuIEl0
IHlpZWxkcyB0aGUgaW5kZXggb2YgdGhlIGZvdW5kIHByb2R1Y3Rpb24sIGFuZCB0aGUgY29yb3V0
aW5lIGlzCisgICAgIyByZXNwb25zaWJsZSBmb3IgZW1pdHRpbmcgc3BlY2lmaWMgY29kZSBmb3Ig
dGhhdCBwcm9kdWN0aW9uLiBUaGUgY29yb3V0aW5lIGlzIGdpdmVuIGxpc3RzIG9mCisgICAgIyBp
bmRpY2VzIG9mIHBvc3NpYmx5LW1hdGNoaW5nIHByb2R1Y3Rpb25zLgorICAgIGRlZiBtYXRjaFBy
b2R1Y3Rpb25zKG91dHAsIHZhbHVlTmFtZSwgcHJvZHVjdGlvbnMpCisgICAgICAgICMgRmlyc3Qs
IHNwbGl0IHRoZSBwcm9kdWN0aW9ucyBsaXN0IGludG8gcnVucyBvZiBwcm9kdWN0aW9ucyB3aXRo
IGFuIG9wY29kZSBhbmQgcHJvZHVjdGlvbnMKKyAgICAgICAgIyB3aXRob3V0IG9uZS4KKyAgICAg
ICAgaW5kZXhMaXN0cyA9IFtdCisgICAgICAgIHByb2R1Y3Rpb25zLmVhY2hfd2l0aF9pbmRleCB7
CisgICAgICAgICAgICB8IHByb2R1Y3Rpb24sIGluZGV4IHwKKyAgICAgICAgICAgIGlmIGluZGV4
TGlzdHNbLTFdIGFuZCBwcm9kdWN0aW9uc1tpbmRleExpc3RzWy0xXVswXV0uaGFzT3Bjb2RlID09
IHByb2R1Y3Rpb24uaGFzT3Bjb2RlCisgICAgICAgICAgICAgICAgaW5kZXhMaXN0c1stMV0gPDwg
aW5kZXgKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBpbmRleExpc3RzIDw8IFtp
bmRleF0KKyAgICAgICAgICAgIGVuZAorICAgICAgICB9CisgICAgICAgIAorICAgICAgICAjIE5v
dywgZW1pdCBwYXR0ZXJuIG1hdGNoaW5nIGNvZGUuIFdlIGRvIGl0IGRpZmZlcmVudGx5IGZvciBs
aXN0cyB3aXRoIGFuIG9wY29kZSB0aGFuIGZvcgorICAgICAgICAjIGxpc3RzIHdpdGhvdXQgb25l
LgorICAgICAgICBpbmRleExpc3RzLmVhY2ggeworICAgICAgICAgICAgfCBpbmRleExpc3QgfAor
ICAgICAgICAgICAgaWYgcHJvZHVjdGlvbnNbaW5kZXhMaXN0WzBdXS5oYXNPcGNvZGUKKyAgICAg
ICAgICAgICAgICAjIE5vdywgd2Ugc3BsaXQgdGhpcyBpbmRleCBsaXN0IGludG8gZ3JvdXBzIGZv
ciBlYWNoIG9wY29kZS4KKyAgICAgICAgICAgICAgICBncm91cHMgPSB7fQorICAgICAgICAgICAg
ICAgIGluZGV4TGlzdC5lYWNoIHsKKyAgICAgICAgICAgICAgICAgICAgfCBpbmRleCB8CisgICAg
ICAgICAgICAgICAgICAgIHByb2R1Y3Rpb24gPSBwcm9kdWN0aW9uc1tpbmRleF0KKyAgICAgICAg
ICAgICAgICAgICAgaWYgZ3JvdXBzW3Byb2R1Y3Rpb24ub3Bjb2RlXQorICAgICAgICAgICAgICAg
ICAgICAgICAgZ3JvdXBzW3Byb2R1Y3Rpb24ub3Bjb2RlXSA8PCBpbmRleAorICAgICAgICAgICAg
ICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICBncm91cHNbcHJvZHVjdGlvbi5v
cGNvZGVdID0gW2luZGV4XQorICAgICAgICAgICAgICAgICAgICBlbmQKKyAgICAgICAgICAgICAg
ICB9CisKKyAgICAgICAgICAgICAgICAjIEVtaXQgYSBzd2l0Y2ggc3RhdGVtZW50LgorICAgICAg
ICAgICAgICAgIG91dHAucHV0cyAic3dpdGNoICgje3ZhbHVlTmFtZX0tPm9wY29kZSgpKSB7Igor
ICAgICAgICAgICAgICAgIGdyb3Vwcy5lYWNoX3BhaXIgeworICAgICAgICAgICAgICAgICAgICB8
IG9wY29kZSwgc3ViSW5kZXhMaXN0IHwKKyAgICAgICAgICAgICAgICAgICAgb3V0cC5wdXRzICJj
YXNlICN7b3Bjb2RlfToiCisgICAgICAgICAgICAgICAgICAgIHN1Yk1hdGNoID0gU3ViTWF0Y2gu
bmV3KHN1YkluZGV4TGlzdCwgcHJvZHVjdGlvbnMpCisgICAgICAgICAgICAgICAgICAgIG1hdGNo
TGVuZ3RoKG91dHAsIHZhbHVlTmFtZSwgc3ViTWF0Y2gucHJvZHVjdGlvbnMpIHsKKyAgICAgICAg
ICAgICAgICAgICAgICAgIHwgaW5kZXhMaXN0IHwKKyAgICAgICAgICAgICAgICAgICAgICAgIHlp
ZWxkIHN1Yk1hdGNoLm1hcEluZGV4TGlzdChpbmRleExpc3QpCisgICAgICAgICAgICAgICAgICAg
IH0KKyAgICAgICAgICAgICAgICAgICAgb3V0cC5wdXRzICJicmVhazsiCisgICAgICAgICAgICAg
ICAgfQorICAgICAgICAgICAgICAgIG91dHAucHV0cyAiZGVmYXVsdDoiCisgICAgICAgICAgICAg
ICAgb3V0cC5wdXRzICJicmVhazsiCisgICAgICAgICAgICAgICAgb3V0cC5wdXRzICJ9IgorICAg
ICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHN1Yk1hdGNoID0gU3ViTWF0Y2gubmV3KGlu
ZGV4TGlzdCwgcHJvZHVjdGlvbnMpCisgICAgICAgICAgICAgICAgbWF0Y2hMZW5ndGgob3V0cCwg
dmFsdWVOYW1lLCBzdWJNYXRjaC5wcm9kdWN0aW9ucykgeworICAgICAgICAgICAgICAgICAgICB8
IGluZGV4TGlzdCB8CisgICAgICAgICAgICAgICAgICAgIHlpZWxkIHN1Yk1hdGNoLm1hcEluZGV4
TGlzdChpbmRleExpc3QpCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgZW5kCisgICAg
ICAgIH0KKyAgICBlbmQKKworICAgICMgVGFrZXMgcHJvZHVjdGlvbnMgdGhhdCBoYXZlIHRoZSBz
YW1lIG9wY29kZSBhbmQgdGhlIHNhbWUgbGVuZ3RoIGFuZCBzZWxlY3RzIGZyb20gdGhlbSBiYXNl
ZCBvbgorICAgICMgdGhlIHByb2R1Y3Rpb25zIGF0IHRoZSBnaXZlbiBjb2x1bW4uCisgICAgZGVm
IG1hdGNoQ29sdW1uKG91dHAsIHZhbHVlTmFtZSwgcHJvZHVjdGlvbnMsIGNvbHVtbkluZGV4KQor
ICAgICAgICBpZiBjb2x1bW5JbmRleCA+PSBwcm9kdWN0aW9uc1swXS5jaGlsZHJlbi5sZW5ndGgK
KyAgICAgICAgICAgIHlpZWxkICgwLi4uKHByb2R1Y3Rpb25zLnNpemUpKS50b19hCisgICAgICAg
ICAgICByZXR1cm4KKyAgICAgICAgZW5kCisKKyAgICAgICAgc3ViVmFsdWUgPSBuZXdWYXIKKyAg
ICAgICAgCisgICAgICAgIG91dHAucHV0cyAieyIKKyAgICAgICAgb3V0cC5wdXRzICJWYWx1ZSog
I3tzdWJWYWx1ZX0gPSAje3ZhbHVlTmFtZX0tPmNoaWxkKCN7Y29sdW1uSW5kZXh9KTsiCisgICAg
ICAgIAorICAgICAgICBzdWJQcm9kdWN0aW9ucyA9IHByb2R1Y3Rpb25zLm1hcCB7CisgICAgICAg
ICAgICB8IHByb2R1Y3Rpb24gfAorICAgICAgICAgICAgcHJvZHVjdGlvbi5jaGlsZHJlbltjb2x1
bW5JbmRleF0KKyAgICAgICAgfQorCisgICAgICAgIG1hdGNoUmVjdXJzaXZlbHkob3V0cCwgc3Vi
VmFsdWUsIHN1YlByb2R1Y3Rpb25zKSB7CisgICAgICAgICAgICB8IGluZGV4TGlzdCB8CisgICAg
ICAgICAgICBzdWJNYXRjaCA9IFN1Yk1hdGNoLm5ldyhpbmRleExpc3QsIHByb2R1Y3Rpb25zKQor
ICAgICAgICAgICAgbWF0Y2hDb2x1bW4ob3V0cCwgdmFsdWVOYW1lLCBzdWJNYXRjaC5wcm9kdWN0
aW9ucywgY29sdW1uSW5kZXggKyAxKSB7CisgICAgICAgICAgICAgICAgfCBpbmRleExpc3QgfAor
ICAgICAgICAgICAgICAgIHlpZWxkIHN1Yk1hdGNoLm1hcEluZGV4TGlzdChpbmRleExpc3QpCisg
ICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBvdXRwLnB1dHMgIn0iCisgICAgZW5k
CisKKyAgICBkZWYgbWF0Y2hSZWN1cnNpdmVseShvdXRwLCB2YWx1ZU5hbWUsIHByb2R1Y3Rpb25z
KQorICAgICAgICBtYXRjaFByb2R1Y3Rpb25zKG91dHAsIHZhbHVlTmFtZSwgcHJvZHVjdGlvbnMp
IHsKKyAgICAgICAgICAgIHwgaW5kZXhMaXN0IHwKKyAgICAgICAgICAgICMgV2UgYXJlIGd1YXJh
bnRlZWQgdGhhdCB0aGlzIGluZGV4IGxpc3QgY29udGFpbnMgcHJvZHVjdGlvbnMgd2l0aCB0aGUg
c2FtZSBvcGNvZGUgYW5kCisgICAgICAgICAgICAjIHRoZSBzYW1lIGxlbmd0aC4KKyAgICAgICAg
ICAgIHN1Yk1hdGNoID0gU3ViTWF0Y2gubmV3KGluZGV4TGlzdCwgcHJvZHVjdGlvbnMpCisgICAg
ICAgICAgICBtYXRjaENvbHVtbihvdXRwLCB2YWx1ZU5hbWUsIHN1Yk1hdGNoLnByb2R1Y3Rpb25z
LCAwKSB7CisgICAgICAgICAgICAgICAgfCBpbmRleExpc3QgfAorICAgICAgICAgICAgICAgIHlp
ZWxkIHN1Yk1hdGNoLm1hcEluZGV4TGlzdChpbmRleExpc3QpCisgICAgICAgICAgICB9CisgICAg
ICAgIH0KKyAgICBlbmQKKworICAgIG1hdGNoUmVjdXJzaXZlbHkob3V0cCwgInZhbHVlIiwgbWF0
Y2hlci5wcm9kdWN0aW9ucykgeworICAgICAgICB8IGluZGV4TGlzdCB8CisgICAgICAgIGluZGV4
TGlzdC5lYWNoIHsKKyAgICAgICAgICAgIHwgaW5kZXggfAorICAgICAgICAgICAgcHJvZHVjdGlv
biA9IG1hdGNoZXIucHJvZHVjdGlvbnNbaW5kZXhdCisgICAgICAgICAgICBvdXRwLnB1dHMgInsi
CisgICAgICAgICAgICBvdXRwLnB1dHMgIlZhbHVlKiAje3Byb2R1Y3Rpb24udmFyTmFtZX0gPSB2
YWx1ZTsiCisgICAgICAgICAgICBpbnRlcm5hbEFyZ3VtZW50cyA9IFtdCisgICAgICAgICAgICBv
cGVyYW5kQXJndW1lbnRzID0gW10KKyAgICAgICAgICAgIHRyeUFyZ3VtZW50cyA9IFtdCisgICAg
ICAgICAgICBudW1TY29wZXMgPSAwCisgICAgICAgICAgICBwcm9kdWN0aW9uLmVhY2hWYXJpYWJs
ZSB7CisgICAgICAgICAgICAgICAgfCBwYXJlbnRWYXJOYW1lLCBjaGlsZE5hbWUsIGNoaWxkVmFy
TmFtZSwga2luZCwgaW5kZXggfAorICAgICAgICAgICAgICAgIG91dHAucHV0cyAiVmFsdWUqICN7
Y2hpbGRWYXJOYW1lfSA9ICN7cGFyZW50VmFyTmFtZX0tPmNoaWxkKCN7aW5kZXh9KTsiCisKKyAg
ICAgICAgICAgICAgICBpZiBjaGlsZE5hbWUgPX4gL1xBXCQvCisgICAgICAgICAgICAgICAgICAg
IGlmIGNoaWxkTmFtZSA9fiAvXEFcJChbMC05XSspXFovCisgICAgICAgICAgICAgICAgICAgICAg
ICBvdXRwLnB1dHMgImlmICgje2NoaWxkVmFyTmFtZX0tPmlzSW50KCN7JDF9KSkgeyIKKyAgICAg
ICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgb3V0cC5wdXRzICJp
ZiAoI3tjaGlsZFZhck5hbWV9LT5oYXNJbnQoKSkgeyIKKyAgICAgICAgICAgICAgICAgICAgZW5k
CisgICAgICAgICAgICAgICAgICAgIG51bVNjb3BlcyArPSAxCisgICAgICAgICAgICAgICAgZW5k
CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgaW50ZXJuYWxBcmd1bWVudHMgPDwg
Y2hpbGRWYXJOYW1lIGlmIGtpbmQgPT0gOmludGVybmFsIG9yIGtpbmQgPT0gOmFub25JbnRlcm5h
bAorICAgICAgICAgICAgICAgIG9wZXJhbmRBcmd1bWVudHMgPDwgY2hpbGRWYXJOYW1lIGlmIGtp
bmQgPT0gOm9wZXJhbmQgb3Iga2luZCA9PSA6YW5vbk9wZXJhbmQKKyAgICAgICAgICAgICAgICB0
cnlBcmd1bWVudHMgPDwgY2hpbGRWYXJOYW1lIGlmIGtpbmQgPT0gOmludGVybmFsIG9yIGtpbmQg
PT0gOm9wZXJhbmQKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG91dHAucHV0cyAiaWYgKGFk
YXB0b3IuYWNjZXB0Um9vdCh2YWx1ZSkiCisgICAgICAgICAgICBvdXRwLnB1dHMoIiAgICAmJiBh
ZGFwdG9yLmFjY2VwdEludGVybmFscygiICsgaW50ZXJuYWxBcmd1bWVudHMuam9pbigiLCAiKSAr
ICIpIikKKyAgICAgICAgICAgIG91dHAucHV0cygiICAgICYmIGFkYXB0b3IuYWNjZXB0T3BlcmFu
ZHMoIiArIG9wZXJhbmRBcmd1bWVudHMuam9pbigiLCAiKSArICIpIikKKyAgICAgICAgICAgIG91
dHAucHV0cygiICAgICYmIGFkYXB0b3IudHJ5I3twcm9kdWN0aW9uLm5hbWV9KCIgKyB0cnlBcmd1
bWVudHMuam9pbigiLCAiKSArICIpKSIpCisgICAgICAgICAgICBvdXRwLnB1dHMgIiAgICByZXR1
cm47IgorICAgICAgICAgICAgbnVtU2NvcGVzLnRpbWVzIHsKKyAgICAgICAgICAgICAgICBvdXRw
LnB1dHMgIn0iCisgICAgICAgICAgICB9CisgICAgICAgICAgICBvdXRwLnB1dHMgIn0iCisgICAg
ICAgIH0KKyAgICB9CisgICAgCisgICAgb3V0cC5wdXRzICIgICAgUkVMRUFTRV9BU1NFUlRfTk9U
X1JFQUNIRUQoKTsiCisgICAgb3V0cC5wdXRzICJ9IgorICAgIAorICAgIG91dHAucHV0cyAifSB9
IC8vIG5hbWVzcGFjZSBKU0M6OkIzIgorCisgICAgb3V0cC5wdXRzICIjZW5kaWYgLy8gQjMje21h
dGNoZXIubmFtZX1faCIKK30K
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>263528</attachid>
            <date>2015-10-19 17:01:06 -0700</date>
            <delta_ts>2015-10-19 17:02:34 -0700</delta_ts>
            <desc>started working on Air</desc>
            <filename>blah.patch</filename>
            <type>text/plain</type>
            <size>239560</size>
            <attacher name="Filip Pizlo">fpizlo</attacher>
            
              <data encoding="base64">SW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9hc3NlbWJsZXIvQWJzdHJhY3RNYWNyb0Fzc2Vt
Ymxlci5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9hc3NlbWJsZXIvQWJz
dHJhY3RNYWNyb0Fzc2VtYmxlci5oCShyZXZpc2lvbiAxOTEyMzkpCisrKyBTb3VyY2UvSmF2YVNj
cmlwdENvcmUvYXNzZW1ibGVyL0Fic3RyYWN0TWFjcm9Bc3NlbWJsZXIuaAkod29ya2luZyBjb3B5
KQpAQCAtMTE0LDcgKzExNCw3IEBAIHB1YmxpYzoKICAgICAvLyBUaGUgZm9sbG93aW5nIHR5cGVz
IGFyZSB1c2VkIGFzIG9wZXJhbmRzIHRvIE1hY3JvQXNzZW1ibGVyIG9wZXJhdGlvbnMsCiAgICAg
Ly8gZGVzY3JpYmluZyBpbW1lZGlhdGUgIGFuZCBtZW1vcnkgb3BlcmFuZHMgdG8gdGhlIGluc3Ry
dWN0aW9ucyB0byBiZSBwbGFudGVkLgogCi0gICAgZW51bSBTY2FsZSB7CisgICAgZW51bSBTY2Fs
ZSA6IGludDhfdCB7CiAgICAgICAgIFRpbWVzT25lLAogICAgICAgICBUaW1lc1R3bywKICAgICAg
ICAgVGltZXNGb3VyLApJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL2Fzc2VtYmxlci9EeW5h
bWljQWRkcmVzcy5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRDb3JlL2Fzc2Vt
Ymxlci9EeW5hbWljQWRkcmVzcy5jcHAJKHJldmlzaW9uIDApCisrKyBTb3VyY2UvSmF2YVNjcmlw
dENvcmUvYXNzZW1ibGVyL0R5bmFtaWNBZGRyZXNzLmNwcAkod29ya2luZyBjb3B5KQpAQCAtMCww
ICsxLDU2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE1IEFwcGxlIEluYy4gQWxsIHJpZ2h0
cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQg
YmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1p
dHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoK
KyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJv
dmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0
aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5
IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0
aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRo
ZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdp
dGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZ
IEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJS
QU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdB
UlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIK
KyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMu
IE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwg
SU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1B
R0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNV
QlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJP
RklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5Z
IFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElB
QklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBB
UklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVW
RU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisK
KyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJEeW5hbWljQWRkcmVzcy5oIgorCisjaW5j
bHVkZSAiR1BSSW5mby5oIgorCituYW1lc3BhY2UgSlNDIHsKKwordm9pZCBEeW5hbWljQWRkcmVz
czo6ZHVtcChQcmludFN0cmVhbSYgb3V0KSBjb25zdAoreworI2lmIEVOQUJMRShBU1NFTUJMRVIp
CisgICAgc3dpdGNoIChtX2tpbmQpIHsKKyAgICBjYXNlIEFkZHJlc3M6CisgICAgY2FzZSBFeHRl
bmRlZEFkZHJlc3M6CisgICAgICAgIG91dC5wcmludChtX29mZnNldCwgIigiLCBtX2Jhc2UsICIp
Iik7CisgICAgICAgIHJldHVybjsKKyAgICBjYXNlIEJhc2VJbmRleDoKKyAgICAgICAgb3V0LnBy
aW50KG1fb2Zmc2V0LCAiKCIsIG1fYmFzZSwgIiwgIiwgbV9pbmRleCwgIiwgIiwgMSA8PCBtX3Nj
YWxlLCAiKSIpOworICAgICAgICByZXR1cm47CisgICAgY2FzZSBBYnNvbHV0ZUFkZHJlc3M6Cisg
ICAgICAgIG91dC5wcmludChtX29mZnNldCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAg
ICBSRUxFQVNFX0FTU0VSVF9OT1RfUkVBQ0hFRCgpOworI2Vsc2UgLy8gRU5BQkxFKEFTU0VNQkxF
UikKKyAgICBvdXQucHJpbnQoIjAiKTsKKyNlbmRpZiAvLyBFTkFCTEUoQVNTRU1CTEVSKQorfQor
Cit9IC8vIG5hbWVzcGFjZSBKU0MKKwpJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL2Fzc2Vt
Ymxlci9EeW5hbWljQWRkcmVzcy5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29y
ZS9hc3NlbWJsZXIvRHluYW1pY0FkZHJlc3MuaAkocmV2aXNpb24gMCkKKysrIFNvdXJjZS9KYXZh
U2NyaXB0Q29yZS9hc3NlbWJsZXIvRHluYW1pY0FkZHJlc3MuaAkod29ya2luZyBjb3B5KQpAQCAt
MCwwICsxLDE3OCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNSBBcHBsZSBJbmMuIEFsbCBy
aWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2Ug
YW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBw
ZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBt
ZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhl
IGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBh
bmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJp
bmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGlj
ZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBp
biB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRl
ZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURF
RCBCWSBBUFBMRSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQg
V0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElF
RCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNV
TEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUg
SU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJF
Q1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwg
REFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBP
RiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAq
IFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9O
IEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNU
IExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lT
RSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJF
LCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLiAKKyAq
LworCisjaWZuZGVmIER5bmFtaWNBZGRyZXNzX2gKKyNkZWZpbmUgRHluYW1pY0FkZHJlc3NfaAor
CisjaW5jbHVkZSAiQWJzdHJhY3RNYWNyb0Fzc2VtYmxlci5oIgorI2luY2x1ZGUgPHd0Zi9Qcmlu
dFN0cmVhbS5oPgorCituYW1lc3BhY2UgSlNDIHsKKworY2xhc3MgRHluYW1pY0FkZHJlc3Mgewor
cHVibGljOgorICAgIGVudW0gS2luZCB7CisgICAgICAgIEFkZHJlc3MsCisgICAgICAgIEV4dGVu
ZGVkQWRkcmVzcywKKyAgICAgICAgQmFzZUluZGV4LAorICAgICAgICBBYnNvbHV0ZUFkZHJlc3MK
KyAgICB9OworCisjaWYgRU5BQkxFKEFTU0VNQkxFUikKKworICAgIER5bmFtaWNBZGRyZXNzKCkK
KyAgICAgICAgOiBtX2tpbmQoQWJzb2x1dGVBZGRyZXNzKQorICAgICAgICAsIG1fb2Zmc2V0KDAp
CisgICAgICAgICwgbV9iYXNlKEFic3RyYWN0TWFjcm9Bc3NlbWJsZXI6OmZpcnN0UmVnaXN0ZXIo
KSkKKyAgICAgICAgLCBtX2luZGV4KEFic3RyYWN0TWFjcm9Bc3NlbWJsZXI6OmZpcnN0UmVnaXN0
ZXIoKSkKKyAgICAgICAgLCBtX3NjYWxlKEFic3RyYWN0TWFjcm9Bc3NlbWJsZXI6OlRpbWVzT25l
KQorICAgIHsKKyAgICB9CisKKyAgICBleHBsaWNpdCBEeW5hbWljQWRkcmVzcyhBYnN0cmFjdE1h
Y3JvQXNzZW1ibGVyOjpBZGRyZXNzIGFkZHJlc3MpCisgICAgICAgIDogbV9raW5kKEFkZHJlc3Mp
CisgICAgICAgICwgbV9vZmZzZXQoYWRkcmVzcy5vZmZzZXQpCisgICAgICAgICwgbV9iYXNlKGFk
ZHJlc3MuYmFzZSkKKyAgICAgICAgLCBtX2luZGV4KEFic3RyYWN0TWFjcm9Bc3NlbWJsZXI6OmZp
cnN0UmVnaXN0ZXIoKSkKKyAgICAgICAgLCBtX3NjYWxlKEFic3RyYWN0TWFjcm9Bc3NlbWJsZXI6
OlRpbWVzT25lKQorICAgIHsKKyAgICB9CisKKyAgICBleHBsaWNpdCBEeW5hbWljQWRkcmVzcyhB
YnN0cmFjdE1hY3JvQXNzZW1ibGVyOjpFeHRlbmRlZEFkZHJlc3MgYWRkcmVzcykKKyAgICAgICAg
OiBtX2tpbmQoRXh0ZW5kZWRBZGRyZXNzKQorICAgICAgICAsIG1fb2Zmc2V0KGFkZHJlc3Mub2Zm
c2V0KQorICAgICAgICAsIG1fYmFzZShhZGRyZXNzLmJhc2UpCisgICAgICAgICwgbV9pbmRleChB
YnN0cmFjdE1hY3JvQXNzZW1ibGVyOjpmaXJzdFJlZ2lzdGVyKCkpCisgICAgICAgICwgbV9zY2Fs
ZShBYnN0cmFjdE1hY3JvQXNzZW1ibGVyOjpUaW1lc09uZSkKKyAgICB7CisgICAgfQorCisgICAg
ZXhwbGljaXQgRHluYW1pY0FkZHJlc3MoQWJzdHJhY3RNYWNyb0Fzc2VtYmxlcjo6QmFzZUluZGV4
IGFkZHJlc3MpCisgICAgICAgIDogbV9raW5kKEJhc2VJbmRleCkKKyAgICAgICAgLCBtX29mZnNl
dChhZGRyZXNzLm9mZnNldCkKKyAgICAgICAgLCBtX2Jhc2UoYWRkcmVzcy5iYXNlKQorICAgICAg
ICAsIG1faW5kZXgoYWRkcmVzcy5pbmRleCkKKyAgICAgICAgLCBtX3NjYWxlKGFkZHJlc3Muc2Nh
bGUpCisgICAgeworICAgIH0KKworICAgIGV4cGxpY2l0IER5bmFtaWNBZGRyZXNzKEFic3RyYWN0
TWFjcm9Bc3NlbWJsZXI6OkFic29sdXRlQWRkcmVzcyBhZGRyZXNzKQorICAgICAgICA6IG1fa2lu
ZChBYnNvbHV0ZUFkZHJlc3MpCisgICAgICAgICwgbV9vZmZzZXQoYml0d2lzZV9jYXN0PGludHB0
cl90PihhZGRyZXNzLm1fcHRyKSkKKyAgICAgICAgLCBtX2Jhc2UoQWJzdHJhY3RNYWNyb0Fzc2Vt
Ymxlcjo6Zmlyc3RSZWdpc3RlcigpKQorICAgICAgICAsIG1faW5kZXgoQWJzdHJhY3RNYWNyb0Fz
c2VtYmxlcjo6Zmlyc3RSZWdpc3RlcigpKQorICAgICAgICAsIG1fc2NhbGUoQWJzdHJhY3RNYWNy
b0Fzc2VtYmxlcjo6VGltZXNPbmUpCisgICAgeworICAgIH0KKworICAgIGJvb2wgb3BlcmF0b3I9
PShjb25zdCBEeW5hbWljQWRkcmVzcyYgb3RoZXIpIGNvbnN0CisgICAgeworICAgICAgICByZXR1
cm4gbV9raW5kID09IG90aGVyLm1fa2luZAorICAgICAgICAgICAgJiYgbV9vZmZzZXQgPT0gb3Ro
ZXIubV9vZmZzZXQKKyAgICAgICAgICAgICYmIG1fYmFzZSA9PSBvdGhlci5tX2Jhc2UKKyAgICAg
ICAgICAgICYmIG1faW5kZXggPT0gb3RoZXIubV9pbmRleAorICAgICAgICAgICAgJiYgbV9zY2Fs
ZSA9PSBvdGhlci5tX3NjYWxlOworICAgIH0KKworICAgIGJvb2wgb3BlcmF0b3IhPShjb25zdCBE
eW5hbWljQWRkcmVzcyYgb3RoZXIpIGNvbnN0CisgICAgeworICAgICAgICByZXR1cm4gISgqdGhp
cyA9PSBvdGhlcik7CisgICAgfQorCisgICAgZXhwbGljaXQgb3BlcmF0b3IgYm9vbCgpIGNvbnN0
CisgICAgeworICAgICAgICByZXR1cm4gKnRoaXMgIT0gRHluYW1pY0FkZHJlc3MoKTsKKyAgICB9
CisKKyAgICBLaW5kIGtpbmQoKSBjb25zdCB7IHJldHVybiBtX2tpbmQ7IH0KKworICAgIEFic3Ry
YWN0TWFjcm9Bc3NlbWJsZXI6OkFkZHJlc3MgYXNBZGRyZXNzKCkgY29uc3QKKyAgICB7CisgICAg
ICAgIEFTU0VSVChtX2tpbmQgPT0gQWRkcmVzcyk7CisgICAgICAgIHJldHVybiBBYnN0cmFjdE1h
Y3JvQXNzZW1ibGVyOjpBZGRyZXNzKG1fYmFzZSwgc3RhdGljX2Nhc3Q8aW50MzJfdD4obV9vZmZz
ZXQpKTsKKyAgICB9CisKKyAgICBBYnN0cmFjdE1hY3JvQXNzZW1ibGVyOjpFeHRlbmRlZEFkZHJl
c3MgYXNFeHRlbmRlZEFkZHJlc3MoKSBjb25zdAorICAgIHsKKyAgICAgICAgQVNTRVJUKG1fa2lu
ZCA9PSBFeHRlbmRlZEFkZHJlc3MpOworICAgICAgICByZXR1cm4gQWJzdHJhY3RNYWNyb0Fzc2Vt
Ymxlcjo6RXh0ZW5kZWRBZGRyZXNzKG1fYmFzZSwgbV9vZmZzZXQpOworICAgIH0KKworICAgIEFi
c3RyYWN0TWFjcm9Bc3NlbWJsZXI6OkJhc2VJbmRleCBhc0Jhc2VJbmRleCgpIGNvbnN0CisgICAg
eworICAgICAgICBBU1NFUlQobV9raW5kID09IEJhc2VJbmRleCk7CisgICAgICAgIHJldHVybiBB
YnN0cmFjdE1hY3JvQXNzZW1ibGVyOjpCYXNlSW5kZXgobV9iYXNlLCBtX2luZGV4LCBtX3NjYWxl
LCBtX29mZnNldCk7CisgICAgfQorCisgICAgQWJzdHJhY3RNYWNyb0Fzc2VtYmxlcjo6QWJzb2x1
dGVBZGRyZXNzIGFzQWJzb2x1dGVBZGRyZXNzKCkgY29uc3QKKyAgICB7CisgICAgICAgIEFTU0VS
VChtX2tpbmQgPT0gQWJzb2x1dGVBZGRyZXNzKTsKKyAgICAgICAgcmV0dXJuIEFic3RyYWN0TWFj
cm9Bc3NlbWJsZXI6OkFic29sdXRlQWRkcmVzcyhiaXR3aXNlX2Nhc3Q8Y29uc3Qgdm9pZCo+KG1f
b2Zmc2V0KSk7CisgICAgfQorCisgICAgdm9pZCBkdW1wKFByaW50U3RyZWFtJikgY29uc3Q7CisK
K3ByaXZhdGU6CisgICAgS2luZCBtX2tpbmQ7CisgICAgaW50cHRyX3QgbV9vZmZzZXQ7CisgICAg
QWJzdHJhY3RNYWNyb0Fzc2VtYmxlcjo6UmVnaXN0ZXJJRCBtX2Jhc2U7CisgICAgQWJzdHJhY3RN
YWNyb0Fzc2VtYmxlcjo6UmVnaXN0ZXJJRCBtX2luZGV4OworICAgIEFic3RyYWN0TWFjcm9Bc3Nl
bWJsZXI6OlNjYWxlIG1fc2NhbGU7CisKKyNlbHNlIC8vIEVOQUJMRShBU1NFTUJMRVIpCisKK3B1
YmxpYzoKKworICAgIER5bmFtaWNBZGRyZXNzKCkgeyB9CisKKyAgICBleHBsaWNpdCBvcGVyYXRv
ciBib29sKCkgY29uc3QgeyByZXR1cm4gZmFsc2U7IH0KKyAgICBLaW5kIGtpbmQoKSBjb25zdCB7
IHJldHVybiBBYnNvbHV0ZUFkZHJlc3M7IH0KKworICAgIHZvaWQgZHVtcChQcmludFN0cmVhbSYp
IGNvbnN0OworICAgIAorI2VuZGlmIC8vIEVOQUJMRShBU1NFTUJMRVIpCisKK3B1YmxpYzoKKwor
ICAgIGJvb2wgaXNPbmVPZigpIGNvbnN0CisgICAgeworICAgICAgICByZXR1cm4gZmFsc2U7Cisg
ICAgfQorCisgICAgdGVtcGxhdGU8dHlwZW5hbWUuLi4gQXJndW1lbnRzPgorICAgIGJvb2wgaXNP
bmVPZihLaW5kIGtpbmQsIEFyZ3VtZW50cy4uLiBhcmd1bWVudHMpIGNvbnN0CisgICAgeworICAg
ICAgICBpZiAoa2luZCgpID09IGtpbmQpCisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAg
ICAgcmV0dXJuIGlzT25lT2YoYXJndW1lbnRzLi4uKTsKKyAgICB9Cit9OworCit9IC8vIG5hbWVz
cGFjZSBKU0MKKworI2VuZGlmIC8vIEVOQUJMRShBU1NFTUJMRVIpCisKKyNlbmRpZiAvLyBEeW5h
bWljQWRkcmVzc19oCisKSW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9hc3NlbWJsZXIvTWFj
cm9Bc3NlbWJsZXIuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYXNzZW1i
bGVyL01hY3JvQXNzZW1ibGVyLmgJKHJldmlzaW9uIDE5MTIzOSkKKysrIFNvdXJjZS9KYXZhU2Ny
aXB0Q29yZS9hc3NlbWJsZXIvTWFjcm9Bc3NlbWJsZXIuaAkod29ya2luZyBjb3B5KQpAQCAtMTIx
LDEwICsxMjEsMjMgQEAgcHVibGljOgogICAgIHVzaW5nIE1hY3JvQXNzZW1ibGVyQmFzZTo6YnJh
bmNoUHRyOwogI2VuZGlmCiAgICAgdXNpbmcgTWFjcm9Bc3NlbWJsZXJCYXNlOjpicmFuY2hTdWIz
MjsKKyAgICB1c2luZyBNYWNyb0Fzc2VtYmxlckJhc2U6OmJyYW5jaDg7CisgICAgdXNpbmcgTWFj
cm9Bc3NlbWJsZXJCYXNlOjpsb2FkMzI7CisgICAgdXNpbmcgTWFjcm9Bc3NlbWJsZXJCYXNlOjps
b2FkODsKKyAgICB1c2luZyBNYWNyb0Fzc2VtYmxlckJhc2U6OmxvYWQ4U2lnbkV4dGVuZFRvMzI7
CisgICAgdXNpbmcgTWFjcm9Bc3NlbWJsZXJCYXNlOjpsb2FkMTY7CisgICAgdXNpbmcgTWFjcm9B
c3NlbWJsZXJCYXNlOjpsb2FkMTZTaWduRXh0ZW5kVG8zMjsKKyAgICB1c2luZyBNYWNyb0Fzc2Vt
YmxlckJhc2U6OmxvYWREb3VibGU7CisgICAgdXNpbmcgTWFjcm9Bc3NlbWJsZXJCYXNlOjpsb2Fk
RmxvYXQ7CiAgICAgdXNpbmcgTWFjcm9Bc3NlbWJsZXJCYXNlOjpsc2hpZnQzMjsKKyAgICB1c2lu
ZyBNYWNyb0Fzc2VtYmxlckJhc2U6Om11bDMyOwogICAgIHVzaW5nIE1hY3JvQXNzZW1ibGVyQmFz
ZTo6b3IzMjsKICAgICB1c2luZyBNYWNyb0Fzc2VtYmxlckJhc2U6OnJzaGlmdDMyOwogICAgIHVz
aW5nIE1hY3JvQXNzZW1ibGVyQmFzZTo6c3RvcmUzMjsKKyAgICB1c2luZyBNYWNyb0Fzc2VtYmxl
ckJhc2U6OnN0b3JlODsKKyAgICB1c2luZyBNYWNyb0Fzc2VtYmxlckJhc2U6OnN0b3JlMTY7Cisg
ICAgdXNpbmcgTWFjcm9Bc3NlbWJsZXJCYXNlOjpzdG9yZURvdWJsZTsKKyAgICB1c2luZyBNYWNy
b0Fzc2VtYmxlckJhc2U6OnN0b3JlRmxvYXQ7CiAgICAgdXNpbmcgTWFjcm9Bc3NlbWJsZXJCYXNl
OjpzdWIzMjsKICAgICB1c2luZyBNYWNyb0Fzc2VtYmxlckJhc2U6OnVyc2hpZnQzMjsKICAgICB1
c2luZyBNYWNyb0Fzc2VtYmxlckJhc2U6OnhvcjMyOwpAQCAtMTU4NCw2ICsxNTk3LDcwMCBAQCBw
dWJsaWM6CiAgICAgICAgIHVyc2hpZnQzMihzcmMsIHRydXN0ZWRJbW0zMkZvclNoaWZ0KGFtb3Vu
dCksIGRlc3QpOwogICAgIH0KIAorICAgIGJvb2wgdHJ5QWRkMzIoUmVnaXN0ZXJJRCBzcmMsIER5
bmFtaWNBZGRyZXNzIGFkZHJlc3MpCisgICAgeworICAgICAgICBzd2l0Y2ggKGFkZHJlc3Mua2lu
ZCgpKSB7CisgICAgICAgIGNhc2UgRHluYW1pY0FkZHJlc3M6OkFkZHJlc3M6CisgICAgICAgICAg
ICBhZGQzMihzcmMsIGFkZHJlc3MuYXNBZGRyZXNzKCkpOworICAgICAgICAgICAgcmV0dXJuIHRy
dWU7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAg
IH0KKyAgICB9CisgICAgdm9pZCBhZGQzMihSZWdpc3RlcklEIHNyYywgRHluYW1pY0FkZHJlc3Mg
YWRkcmVzcykKKyAgICB7CisgICAgICAgIFJFTEVBU0VfQVNTRVJUKHRyeUFkZDMyKHNyYywgYWRk
cmVzcykpOworICAgIH0KKworICAgIC8vIEl0J3Mgbm90IGNsZWFyIGlmIHRoZSBzZW1hbnRpY3Mg
aGVyZSBzaG91bGQgYmUgdG8gcmV0dXJuIHRydWUgZm9yIGFueSBhZGRyZXNzIGV4cHJlc3Npb24K
KyAgICAvLyBmb3Igd2hpY2ggd2Uga25vdyBob3cgdG8gZW1pdCBjb2RlLCBvciB0byBvbmx5IGVt
aXQgdHJ1ZSB3aGVuIHdlIGtub3cgaG93IHRvIGVtaXQgaXQKKyAgICAvLyBlZmZpY2llbnRseS4g
SSdtIGN1cnJlbnRseSBnb2luZyB3aXRoIHN1cHBvcnRpbmcgYWxsIG9mIHRoZSBleHByZXNzaW9u
cyBmb3Igd2hpY2ggd2Uga25vdworICAgIC8vIGhvdyB0byBlbWl0IGNvZGUgYXQgYWxsLCBhbmQg
SSdtIGxlYXZpbmcgaXQgdG8gY2xpZW50cyB0byBkZWFsIHdpdGggdGhlIGVmZmljaWVuY3kgcGFy
dC4KKyAgICAKKyAgICBib29sIHRyeUFkZDMyKFRydXN0ZWRJbW0zMiBpbW0sIER5bmFtaWNBZGRy
ZXNzIGFkZHJlc3MpCisgICAgeworICAgICAgICBzd2l0Y2ggKGFkZHJlc3Mua2luZCgpKSB7Cisg
ICAgICAgIGNhc2UgRHluYW1pY0FkZHJlc3M6OkFkZHJlc3M6CisgICAgICAgICAgICBhZGQzMihp
bW0sIGFkZHJlc3MuYXNBZGRyZXNzKCkpOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAg
ICAgIGNhc2UgRHluYW1pY0FkZHJlc3M6OkFic29sdXRlQWRkcmVzczoKKyAgICAgICAgICAgIGFk
ZDMyKGltbSwgYWRkcmVzcy5hc0Fic29sdXRlQWRkcmVzcygpKTsKKyAgICAgICAgICAgIHJldHVy
biB0cnVlOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAg
ICAgICB9CisgICAgfQorICAgIHZvaWQgYWRkMzIoVHJ1c3RlZEltbTMyIGltbSwgRHluYW1pY0Fk
ZHJlc3MgYWRkcmVzcykKKyAgICB7CisgICAgICAgIFJFTEVBU0VfQVNTRVJUKHRyeUFkZDMyKGlt
bSwgYWRkcmVzcykpOworICAgIH0KKworICAgIGJvb2wgdHJ5QWRkMzIoRHluYW1pY0FkZHJlc3Mg
YWRkcmVzcywgUmVnaXN0ZXJJRCBkZXN0KQorICAgIHsKKyAgICAgICAgc3dpdGNoIChhZGRyZXNz
LmtpbmQoKSkgeworICAgICAgICBjYXNlIER5bmFtaWNBZGRyZXNzOjpBZGRyZXNzOgorICAgICAg
ICAgICAgYWRkMzIoYWRkcmVzcy5hc0FkZHJlc3MoKSwgZGVzdCk7CisgICAgICAgICAgICByZXR1
cm4gdHJ1ZTsKKyAgICAgICAgY2FzZSBEeW5hbWljQWRkcmVzczo6QWJzb2x1dGVBZGRyZXNzOgor
ICAgICAgICAgICAgYWRkMzIoYWRkcmVzcy5hc0Fic29sdXRlQWRkcmVzcygpLCBkZXN0KTsKKyAg
ICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0
cnVuIGZhbHNlOworICAgICAgICB9CisgICAgfQorICAgIHZvaWQgYWRkMzIoRHluYW1pY0FkZHJl
c3MgYWRkcmVzcywgUmVnaXN0ZXJJRCBkZXN0KQorICAgIHsKKyAgICAgICAgUkVMRUFTRV9BU1NF
UlQodHJ5QWRkMzIoYWRkcmVzcywgZGVzdCkpOworICAgIH0KKworICAgIGJvb2wgdHJ5QW5kMzIo
UmVnaXN0ZXJJRCBzcmMsIER5bmFtaWNBZGRyZXNzIGFkZHJlc3MpCisgICAgeworICAgICAgICBz
d2l0Y2ggKGFkZHJlc3Mua2luZCgpKSB7CisgICAgICAgIGNhc2UgRHluYW1pY0FkZHJlc3M6OkFk
ZHJlc3M6CisgICAgICAgICAgICBhbmQzMihzcmMsIGFkZHJlc3MuYXNBZGRyZXNzKCkpOworICAg
ICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1
cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisgICAgdm9pZCBhbmQzMihSZWdpc3RlcklEIHNy
YywgRHluYW1pY0FkZHJlc3MgYWRkcmVzcykKKyAgICB7CisgICAgICAgIFJFTEVBU0VfQVNTRVJU
KHRyeUFuZDMyKHNyYywgYWRkcmVzcykpOworICAgIH0KKworICAgIGJvb2wgdHJ5QW5kMzIoVHJ1
c3RlZEltbTMyIGltbSwgRHluYW1pY0FkZHJlc3MgYWRkcmVzcykKKyAgICB7CisgICAgICAgIHN3
aXRjaCAoYWRkcmVzcy5raW5kKCkpIHsKKyAgICAgICAgY2FzZSBEeW5hbWljQWRkcmVzczo6QWRk
cmVzczoKKyAgICAgICAgICAgIGFuZDMyKGltbSwgYWRkcmVzcy5hc0FkZHJlc3MoKSk7CisgICAg
ICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgY2FzZSBEeW5hbWljQWRkcmVzczo6QWJzb2x1
dGVBZGRyZXNzOgorICAgICAgICAgICAgYW5kMzIoaW1tLCBhZGRyZXNzLmFzQWJzb2x1dGVBZGRy
ZXNzKCkpOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIGRlZmF1bHQ6CisgICAg
ICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisgICAgdm9pZCBhbmQzMihU
cnVzdGVkSW1tMzIgaW1tLCBEeW5hbWljQWRkcmVzcyBhZGRyZXNzKQorICAgIHsKKyAgICAgICAg
UkVMRUFTRV9BU1NFUlQodHJ5QW5kMzIoaW1tLCBhZGRyZXNzKSk7CisgICAgfQorCisgICAgYm9v
bCB0cnlBbmQzMihEeW5hbWljQWRkcmVzcyBhZGRyZXNzLCBSZWdpc3RlcklEIGRlc3QpCisgICAg
eworICAgICAgICBzd2l0Y2ggKGFkZHJlc3Mua2luZCgpKSB7CisgICAgICAgIGNhc2UgRHluYW1p
Y0FkZHJlc3M6OkFkZHJlc3M6CisgICAgICAgICAgICBhbmQzMihhZGRyZXNzLmFzQWRkcmVzcygp
LCBkZXN0KTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICBkZWZhdWx0OgorICAg
ICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgfQorICAgIHZvaWQgYW5kMzIo
RHluYW1pY0FkZHJlc3MgYWRkcmVzcywgUmVnaXN0ZXJJRCBkZXN0KQorICAgIHsKKyAgICAgICAg
UkVMRUFTRV9BU1NFUlQodHJ5QWRkMzIoYWRkcmVzcywgZGVzdCkpOworICAgIH0KKworICAgIGJv
b2wgdHJ5TXVsMzIoRHluYW1pY0FkZHJlc3MgYWRkcmVzcywgUmVnaXN0ZXJJRCBkZXN0KQorICAg
IHsKKyAgICAgICAgc3dpdGNoIChhZGRyZXNzLmtpbmQoKSkgeworICAgICAgICBjYXNlIER5bmFt
aWNBZGRyZXNzOjpBZGRyZXNzOgorICAgICAgICAgICAgbXVsMzIoYWRkcmVzcy5hc0FkZHJlc3Mo
KSwgZGVzdCk7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgZGVmYXVsdDoKKyAg
ICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KKyAgICB2b2lkIG11bDMy
KER5bmFtaWNBZGRyZXNzIGFkZHJlc3MsIFJlZ2lzdGVySUQgZGVzdCkKKyAgICB7CisgICAgICAg
IFJFTEVBU0VfQVNTRVJUKHRyeU11bDMyKGFkZHJlc3MsIGRlc3QpKTsKKyAgICB9CisKKyAgICBi
b29sIHRyeU5lZzMyKER5bmFtaWNBZGRyZXNzIGFkZHJlc3MpCisgICAgeworICAgICAgICBzd2l0
Y2ggKGFkZHJlc3Mua2luZCgpKSB7CisgICAgICAgIGNhc2UgRHluYW1pY0FkZHJlc3M6OkFkZHJl
c3M6CisgICAgICAgICAgICBuZWczMihhZGRyZXNzLmFzQWRkcmVzcygpKTsKKyAgICAgICAgICAg
IHJldHVybiB0cnVlOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuIGZhbHNl
OworICAgICAgICB9CisgICAgfQorICAgIHZvaWQgbmVnMzIoRHluYW1pY0FkZHJlc3MgYWRkcmVz
cykKKyAgICB7CisgICAgICAgIFJFTEVBU0VfQVNTRVJUKHRyeU5lZzMyKGFkZHJlc3MpKTsKKyAg
ICB9CisKKyAgICAvLyBGSVhNRTogTG90cyBvZiBtaXNzaW5nIGNhc2VzIGhlcmUhCisKKyAgICBi
b29sIHRyeUxvYWQzMihEeW5hbWljQWRkcmVzcyBhZGRyZXNzLCBSZWdpc3RlcklEIGRlc3QpCisg
ICAgeworICAgICAgICBzd2l0Y2ggKGFkZHJlc3Mua2luZCgpKSB7CisgICAgICAgIGNhc2UgRHlu
YW1pY0FkZHJlc3M6OkFkZHJlc3M6CisgICAgICAgICAgICBsb2FkMzIoYWRkcmVzcy5hc0FkZHJl
c3MoKSwgZGVzdCk7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgY2FzZSBEeW5h
bWljQWRkcmVzczo6QmFzZUluZGV4OgorICAgICAgICAgICAgbG9hZDMyKGFkZHJlc3MuYXNCYXNl
SW5kZXgoKSwgZGVzdCk7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgY2FzZSBE
eW5hbWljQWRkcmVzczo6QWJzb2x1dGVBZGRyZXNzOgorICAgICAgICAgICAgbG9hZDMyKGFkZHJl
c3MuYXNBYnNvbHV0ZUFkZHJlc3MoKS5tX3B0ciwgZGVzdCk7CisgICAgICAgICAgICByZXR1cm4g
dHJ1ZTsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAg
ICAgfQorICAgIH0KKyAgICB2b2lkIGxvYWQzMihEeW5hbWljQWRkcmVzcyBhZGRyZXNzLCBSZWdp
c3RlcklEIGRlc3QpCisgICAgeworICAgICAgICBSRUxFQVNFX0FTU0VSVCh0cnlMb2FkMzIoYWRk
cmVzcywgZGVzdCkpOworICAgIH0KKworICAgIGJvb2wgdHJ5TG9hZDgoRHluYW1pY0FkZHJlc3Mg
YWRkcmVzcywgUmVnaXN0ZXJJRCBkZXN0KQorICAgIHsKKyAgICAgICAgc3dpdGNoIChhZGRyZXNz
LmtpbmQoKSkgeworICAgICAgICBjYXNlIER5bmFtaWNBZGRyZXNzOjpBZGRyZXNzOgorICAgICAg
ICAgICAgbG9hZDgoYWRkcmVzcy5hc0FkZHJlc3MoKSwgZGVzdCk7CisgICAgICAgICAgICByZXR1
cm4gdHJ1ZTsKKyAgICAgICAgY2FzZSBEeW5hbWljQWRkcmVzczo6QmFzZUluZGV4OgorICAgICAg
ICAgICAgbG9hZDgoYWRkcmVzcy5hc0Jhc2VJbmRleCgpLCBkZXN0KTsKKyAgICAgICAgICAgIHJl
dHVybiB0cnVlOworICAgICAgICBjYXNlIER5bmFtaWNBZGRyZXNzOjpBYnNvbHV0ZUFkZHJlc3M6
CisgICAgICAgICAgICBsb2FkOChhZGRyZXNzLmFzQWJzb2x1dGVBZGRyZXNzKCkubV9wdHIsIGRl
c3QpOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAg
ICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisgICAgdm9pZCBsb2FkOChEeW5h
bWljQWRkcmVzcyBhZGRyZXNzLCBSZWdpc3RlcklEIGRlc3QpCisgICAgeworICAgICAgICBSRUxF
QVNFX0FTU0VSVCh0cnlMb2FkOChhZGRyZXNzLCBkZXN0KSk7CisgICAgfQorCisgICAgYm9vbCB0
cnlMb2FkOFNpZ25FeHRlbmRUbzMyKER5bmFtaWNBZGRyZXNzIGFkZHJlc3MsIFJlZ2lzdGVySUQg
ZGVzdCkKKyAgICB7CisgICAgICAgIHN3aXRjaCAoYWRkcmVzcy5raW5kKCkpIHsKKyAgICAgICAg
Y2FzZSBEeW5hbWljQWRkcmVzczo6QWRkcmVzczoKKyAgICAgICAgICAgIGxvYWQ4U2lnbkV4dGVu
ZFRvMzIoYWRkcmVzcy5hc0FkZHJlc3MoKSwgZGVzdCk7CisgICAgICAgICAgICByZXR1cm4gdHJ1
ZTsKKyAgICAgICAgY2FzZSBEeW5hbWljQWRkcmVzczo6QmFzZUluZGV4OgorICAgICAgICAgICAg
bG9hZDhTaWduRXh0ZW5kVG8zMihhZGRyZXNzLmFzQmFzZUluZGV4KCksIGRlc3QpOworICAgICAg
ICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIGNhc2UgRHluYW1pY0FkZHJlc3M6OkFic29sdXRl
QWRkcmVzczoKKyAgICAgICAgICAgIGxvYWQ4U2lnbkV4dGVuZFRvMzIoYWRkcmVzcy5hc0Fic29s
dXRlQWRkcmVzcygpLm1fcHRyLCBkZXN0KTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAg
ICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAg
fQorICAgIHZvaWQgbG9hZDhTaWduRXh0ZW5kVG8zMihEeW5hbWljQWRkcmVzcyBhZGRyZXNzLCBS
ZWdpc3RlcklEIGRlc3QpCisgICAgeworICAgICAgICBSRUxFQVNFX0FTU0VSVCh0cnlMb2FkOFNp
Z25FeHRlbmRUbzMyKGFkZHJlc3MsIGRlc3QpKTsKKyAgICB9CisKKyAgICBib29sIHRyeUxvYWQx
NihEeW5hbWljQWRkcmVzcyBhZGRyZXNzLCBSZWdpc3RlcklEIGRlc3QpCisgICAgeworICAgICAg
ICBzd2l0Y2ggKGFkZHJlc3Mua2luZCgpKSB7CisgICAgICAgIGNhc2UgRHluYW1pY0FkZHJlc3M6
OkFkZHJlc3M6CisgICAgICAgICAgICBsb2FkMTYoYWRkcmVzcy5hc0FkZHJlc3MoKSwgZGVzdCk7
CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgY2FzZSBEeW5hbWljQWRkcmVzczo6
QmFzZUluZGV4OgorICAgICAgICAgICAgbG9hZDE2KGFkZHJlc3MuYXNCYXNlSW5kZXgoKSwgZGVz
dCk7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgY2FzZSBEeW5hbWljQWRkcmVz
czo6QWJzb2x1dGVBZGRyZXNzOgorICAgICAgICAgICAgbG9hZDE2KGFkZHJlc3MuYXNBYnNvbHV0
ZUFkZHJlc3MoKS5tX3B0ciwgZGVzdCk7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAg
ICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgIH0K
KyAgICB2b2lkIGxvYWQxNihEeW5hbWljQWRkcmVzcyBhZGRyZXNzLCBSZWdpc3RlcklEIGRlc3Qp
CisgICAgeworICAgICAgICBSRUxFQVNFX0FTU0VSVCh0cnlMb2FkMTYoYWRkcmVzcywgZGVzdCkp
OworICAgIH0KKworICAgIGJvb2wgdHJ5TG9hZDE2U2lnbkV4dGVuZFRvMzIoRHluYW1pY0FkZHJl
c3MgYWRkcmVzcywgUmVnaXN0ZXJJRCBkZXN0KQorICAgIHsKKyAgICAgICAgc3dpdGNoIChhZGRy
ZXNzLmtpbmQoKSkgeworICAgICAgICBjYXNlIER5bmFtaWNBZGRyZXNzOjpBZGRyZXNzOgorICAg
ICAgICAgICAgbG9hZDE2U2lnbkV4dGVuZFRvMzIoYWRkcmVzcy5hc0FkZHJlc3MoKSwgZGVzdCk7
CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgY2FzZSBEeW5hbWljQWRkcmVzczo6
QmFzZUluZGV4OgorICAgICAgICAgICAgbG9hZDE2U2lnbkV4dGVuZFRvMzIoYWRkcmVzcy5hc0Jh
c2VJbmRleCgpLCBkZXN0KTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICBjYXNl
IER5bmFtaWNBZGRyZXNzOjpBYnNvbHV0ZUFkZHJlc3M6CisgICAgICAgICAgICBsb2FkMTZTaWdu
RXh0ZW5kVG8zMihhZGRyZXNzLmFzQWJzb2x1dGVBZGRyZXNzKCkubV9wdHIsIGRlc3QpOworICAg
ICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1
cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisgICAgdm9pZCBsb2FkMTZTaWduRXh0ZW5kVG8z
MihEeW5hbWljQWRkcmVzcyBhZGRyZXNzLCBSZWdpc3RlcklEIGRlc3QpCisgICAgeworICAgICAg
ICBSRUxFQVNFX0FTU0VSVCh0cnlMb2FkMTZTaWduRXh0ZW5kVG8zMihhZGRyZXNzLCBkZXN0KSk7
CisgICAgfQorCisgICAgYm9vbCB0cnlTdG9yZTMyKFJlZ2lzdGVySUQgc3JjLCBEeW5hbWljQWRk
cmVzcyBhZGRyZXNzKQorICAgIHsKKyAgICAgICAgc3dpdGNoIChhZGRyZXNzLmtpbmQoKSkgewor
ICAgICAgICBjYXNlIER5bmFtaWNBZGRyZXNzOjpBZGRyZXNzOgorICAgICAgICAgICAgc3RvcmUz
MihzcmMsIGFkZHJlc3MuYXNBZGRyZXNzKCkpOworICAgICAgICAgICAgcmV0dXJuIHRydWU7Cisg
ICAgICAgIGNhc2UgRHluYW1pY0FkZHJlc3M6OkJhc2VJbmRleDoKKyAgICAgICAgICAgIHN0b3Jl
MzIoc3JjLCBhZGRyZXNzLmFzQmFzZUluZGV4KCkpOworICAgICAgICAgICAgcmV0dXJuIHRydWU7
CisgICAgICAgIGNhc2UgRHluYW1pY0FkZHJlc3M6OkFic29sdXRlQWRkcmVzczoKKyAgICAgICAg
ICAgIHN0b3JlMzIoc3JjLCBhZGRyZXNzLmFzQWJzb2x1dGVBZGRyZXNzKCkubV9wdHIpOworICAg
ICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1
cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisgICAgdm9pZCBzdG9yZTMyKFJlZ2lzdGVySUQg
c3JjLCBEeW5hbWljQWRkcmVzcyBhZGRyZXNzKQorICAgIHsKKyAgICAgICAgUkVMRUFTRV9BU1NF
UlQodHJ5U3RvcmUzMihzcmMsIGFkZHJlc3MpKTsKKyAgICB9CisKKyAgICBib29sIHRyeVN0b3Jl
MzIoVHJ1c3RlZEltbTMyIHNyYywgRHluYW1pY0FkZHJlc3MgYWRkcmVzcykKKyAgICB7CisgICAg
ICAgIHN3aXRjaCAoYWRkcmVzcy5raW5kKCkpIHsKKyAgICAgICAgY2FzZSBEeW5hbWljQWRkcmVz
czo6QWRkcmVzczoKKyAgICAgICAgICAgIHN0b3JlMzIoc3JjLCBhZGRyZXNzLmFzQWRkcmVzcygp
KTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICBjYXNlIER5bmFtaWNBZGRyZXNz
OjpCYXNlSW5kZXg6CisgICAgICAgICAgICBzdG9yZTMyKHNyYywgYWRkcmVzcy5hc0Jhc2VJbmRl
eCgpKTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICBjYXNlIER5bmFtaWNBZGRy
ZXNzOjpBYnNvbHV0ZUFkZHJlc3M6CisgICAgICAgICAgICBzdG9yZTMyKHNyYywgYWRkcmVzcy5h
c0Fic29sdXRlQWRkcmVzcygpLm1fcHRyKTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAg
ICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAg
fQorICAgIHZvaWQgc3RvcmUzMihUcnVzdGVkSW1tMzIgc3JjLCBEeW5hbWljQWRkcmVzcyBhZGRy
ZXNzKQorICAgIHsKKyAgICAgICAgUkVMRUFTRV9BU1NFUlQodHJ5U3RvcmUzMihzcmMsIGFkZHJl
c3MpKTsKKyAgICB9CisKKyAgICBib29sIHRyeVN0b3JlOChSZWdpc3RlcklEIHNyYywgRHluYW1p
Y0FkZHJlc3MgYWRkcmVzcykKKyAgICB7CisgICAgICAgIHN3aXRjaCAoYWRkcmVzcy5raW5kKCkp
IHsKKyAgICAgICAgY2FzZSBEeW5hbWljQWRkcmVzczo6QWRkcmVzczoKKyAgICAgICAgICAgIHN0
b3JlOChzcmMsIGFkZHJlc3MuYXNBZGRyZXNzKCkpOworICAgICAgICAgICAgcmV0dXJuIHRydWU7
CisgICAgICAgIGNhc2UgRHluYW1pY0FkZHJlc3M6OkJhc2VJbmRleDoKKyAgICAgICAgICAgIHN0
b3JlOChzcmMsIGFkZHJlc3MuYXNCYXNlSW5kZXgoKSk7CisgICAgICAgICAgICByZXR1cm4gdHJ1
ZTsKKyAgICAgICAgY2FzZSBEeW5hbWljQWRkcmVzczo6QWJzb2x1dGVBZGRyZXNzOgorICAgICAg
ICAgICAgc3RvcmU4KHNyYywgYWRkcmVzcy5hc0Fic29sdXRlQWRkcmVzcygpLm1fcHRyKTsKKyAg
ICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0
dXJuIGZhbHNlOworICAgICAgICB9CisgICAgfQorICAgIHZvaWQgc3RvcmU4KFJlZ2lzdGVySUQg
c3JjLCBEeW5hbWljQWRkcmVzcyBhZGRyZXNzKQorICAgIHsKKyAgICAgICAgUkVMRUFTRV9BU1NF
UlQodHJ5U3RvcmU4KHNyYywgYWRkcmVzcykpOworICAgIH0KKworICAgIGJvb2wgdHJ5U3RvcmU4
KFRydXN0ZWRJbW0zMiBzcmMsIER5bmFtaWNBZGRyZXNzIGFkZHJlc3MpCisgICAgeworICAgICAg
ICBzd2l0Y2ggKGFkZHJlc3Mua2luZCgpKSB7CisgICAgICAgIGNhc2UgRHluYW1pY0FkZHJlc3M6
OkFkZHJlc3M6CisgICAgICAgICAgICBzdG9yZTgoc3JjLCBhZGRyZXNzLmFzQWRkcmVzcygpKTsK
KyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICBjYXNlIER5bmFtaWNBZGRyZXNzOjpC
YXNlSW5kZXg6CisgICAgICAgICAgICBzdG9yZTgoc3JjLCBhZGRyZXNzLmFzQmFzZUluZGV4KCkp
OworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIGNhc2UgRHluYW1pY0FkZHJlc3M6
OkFic29sdXRlQWRkcmVzczoKKyAgICAgICAgICAgIHN0b3JlOChzcmMsIGFkZHJlc3MuYXNBYnNv
bHV0ZUFkZHJlc3MoKS5tX3B0cik7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAg
ZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KKyAg
ICB2b2lkIHN0b3JlOChUcnVzdGVkSW1tMzIgc3JjLCBEeW5hbWljQWRkcmVzcyBhZGRyZXNzKQor
ICAgIHsKKyAgICAgICAgUkVMRUFTRV9BU1NFUlQodHJ5U3RvcmU4KHNyYywgYWRkcmVzcykpOwor
ICAgIH0KKworICAgIGJvb2wgdHJ5U3RvcmUxNihSZWdpc3RlcklEIHNyYywgRHluYW1pY0FkZHJl
c3MgYWRkcmVzcykKKyAgICB7CisgICAgICAgIHN3aXRjaCAoYWRkcmVzcy5raW5kKCkpIHsKKyAg
ICAgICAgY2FzZSBEeW5hbWljQWRkcmVzczo6QWRkcmVzczoKKyAgICAgICAgICAgIHN0b3JlMTYo
c3JjLCBhZGRyZXNzLmFzQWRkcmVzcygpKTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAg
ICAgICBjYXNlIER5bmFtaWNBZGRyZXNzOjpCYXNlSW5kZXg6CisgICAgICAgICAgICBzdG9yZTE2
KHNyYywgYWRkcmVzcy5hc0Jhc2VJbmRleCgpKTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOwor
ICAgICAgICBjYXNlIER5bmFtaWNBZGRyZXNzOjpBYnNvbHV0ZUFkZHJlc3M6CisgICAgICAgICAg
ICBzdG9yZTE2KHNyYywgYWRkcmVzcy5hc0Fic29sdXRlQWRkcmVzcygpLm1fcHRyKTsKKyAgICAg
ICAgICAgIHJldHVybiB0cnVlOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJu
IGZhbHNlOworICAgICAgICB9CisgICAgfQorICAgIHZvaWQgc3RvcmUxNihSZWdpc3RlcklEIHNy
YywgRHluYW1pY0FkZHJlc3MgYWRkcmVzcykKKyAgICB7CisgICAgICAgIFJFTEVBU0VfQVNTRVJU
KHRyeVN0b3JlMTYoc3JjLCBhZGRyZXNzKSk7CisgICAgfQorCisgICAgYm9vbCB0cnlTdG9yZTE2
KFRydXN0ZWRJbW0zMiBzcmMsIER5bmFtaWNBZGRyZXNzIGFkZHJlc3MpCisgICAgeworICAgICAg
ICBzd2l0Y2ggKGFkZHJlc3Mua2luZCgpKSB7CisgICAgICAgIGNhc2UgRHluYW1pY0FkZHJlc3M6
OkFkZHJlc3M6CisgICAgICAgICAgICBzdG9yZTE2KHNyYywgYWRkcmVzcy5hc0FkZHJlc3MoKSk7
CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgY2FzZSBEeW5hbWljQWRkcmVzczo6
QmFzZUluZGV4OgorICAgICAgICAgICAgc3RvcmUxNihzcmMsIGFkZHJlc3MuYXNCYXNlSW5kZXgo
KSk7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgY2FzZSBEeW5hbWljQWRkcmVz
czo6QWJzb2x1dGVBZGRyZXNzOgorICAgICAgICAgICAgc3RvcmUxNihzcmMsIGFkZHJlc3MuYXNB
YnNvbHV0ZUFkZHJlc3MoKS5tX3B0cik7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAg
ICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgIH0K
KyAgICB2b2lkIHN0b3JlMTYoVHJ1c3RlZEltbTMyIHNyYywgRHluYW1pY0FkZHJlc3MgYWRkcmVz
cykKKyAgICB7CisgICAgICAgIFJFTEVBU0VfQVNTRVJUKHRyeVN0b3JlMTYoc3JjLCBhZGRyZXNz
KSk7CisgICAgfQorCisgICAgYm9vbCB0cnlMb2FkRG91YmxlKER5bmFtaWNBZGRyZXNzIGFkZHJl
c3MsIEZQUmVnaXN0ZXJJRCBkZXN0KQorICAgIHsKKyAgICAgICAgc3dpdGNoIChhZGRyZXNzLmtp
bmQoKSkgeworICAgICAgICBjYXNlIER5bmFtaWNBZGRyZXNzOjpBZGRyZXNzOgorICAgICAgICAg
ICAgbG9hZERvdWJsZShhZGRyZXNzLmFzQWRkcmVzcygpLCBkZXN0KTsKKyAgICAgICAgICAgIHJl
dHVybiB0cnVlOworICAgICAgICBjYXNlIER5bmFtaWNBZGRyZXNzOjpCYXNlSW5kZXg6CisgICAg
ICAgICAgICBsb2FkRG91YmxlKGFkZHJlc3MuYXNCYXNlSW5kZXgoKSwgZGVzdCk7CisgICAgICAg
ICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiBm
YWxzZTsKKyAgICAgICAgfQorICAgIH0KKyAgICB2b2lkIGxvYWREb3VibGUoRHluYW1pY0FkZHJl
c3MgYWRkcmVzcywgRlBSZWdpc3RlcklEIGRlc3QpCisgICAgeworICAgICAgICBSRUxFQVNFX0FT
U0VSVCh0cnlMb2FkRG91YmxlKGFkZHJlc3MsIGRlc3QpKTsKKyAgICB9CisKKyAgICBib29sIHRy
eUxvYWRGbG9hdChEeW5hbWljQWRkcmVzcyBhZGRyZXNzLCBGUFJlZ2lzdGVySUQgZGVzdCkKKyAg
ICB7CisgICAgICAgIHN3aXRjaCAoYWRkcmVzcy5raW5kKCkpIHsKKyAgICAgICAgY2FzZSBEeW5h
bWljQWRkcmVzczo6QWRkcmVzczoKKyAgICAgICAgICAgIGxvYWRGbG9hdChhZGRyZXNzLmFzQWRk
cmVzcygpLCBkZXN0KTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICBjYXNlIER5
bmFtaWNBZGRyZXNzOjpCYXNlSW5kZXg6CisgICAgICAgICAgICBsb2FkRmxvYXQoYWRkcmVzcy5h
c0Jhc2VJbmRleCgpLCBkZXN0KTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICBk
ZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgfQorICAg
IHZvaWQgbG9hZEZsb2F0KER5bmFtaWNBZGRyZXNzIGFkZHJlc3MsIEZQUmVnaXN0ZXJJRCBkZXN0
KQorICAgIHsKKyAgICAgICAgUkVMRUFTRV9BU1NFUlQodHJ5TG9hZEZsb2F0KGFkZHJlc3MsIGRl
c3QpKTsKKyAgICB9CisKKyAgICBib29sIHRyeVN0b3JlRG91YmxlKEZQUmVnaXN0ZXJJRCBzcmMs
IER5bmFtaWNBZGRyZXNzIGFkZHJlc3MpCisgICAgeworICAgICAgICBzd2l0Y2ggKGFkZHJlc3Mu
a2luZCgpKSB7CisgICAgICAgIGNhc2UgRHluYW1pY0FkZHJlc3M6OkFkZHJlc3M6CisgICAgICAg
ICAgICBzdG9yZURvdWJsZShzcmMsIGFkZHJlc3MuYXNBZGRyZXNzKCkpOworICAgICAgICAgICAg
cmV0dXJuIHRydWU7CisgICAgICAgIGNhc2UgRHluYW1pY0FkZHJlc3M6OkJhc2VJbmRleDoKKyAg
ICAgICAgICAgIHN0b3JlRG91YmxlKHNyYywgYWRkcmVzcy5hc0Jhc2VJbmRleCgpKTsKKyAgICAg
ICAgICAgIHJldHVybiB0cnVlOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJu
IGZhbHNlOworICAgICAgICB9CisgICAgfQorICAgIHZvaWQgc3RvcmVEb3VibGUoRlBSZWdpc3Rl
cklEIHNyYywgRHluYW1pY0FkZHJlc3MgYWRkcmVzcykKKyAgICB7CisgICAgICAgIFJFTEVBU0Vf
QVNTRVJUKHRyeVN0b3JlRG91YmxlKHNyYywgYWRkcmVzcykpOworICAgIH0KKworICAgIGJvb2wg
dHJ5U3RvcmVGbG9hdChGUFJlZ2lzdGVySUQgc3JjLCBEeW5hbWljQWRkcmVzcyBhZGRyZXNzKQor
ICAgIHsKKyAgICAgICAgc3dpdGNoIChhZGRyZXNzLmtpbmQoKSkgeworICAgICAgICBjYXNlIER5
bmFtaWNBZGRyZXNzOjpBZGRyZXNzOgorICAgICAgICAgICAgc3RvcmVGbG9hdChzcmMsIGFkZHJl
c3MuYXNBZGRyZXNzKCkpOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIGNhc2Ug
RHluYW1pY0FkZHJlc3M6OkJhc2VJbmRleDoKKyAgICAgICAgICAgIHN0b3JlRmxvYXQoc3JjLCBh
ZGRyZXNzLmFzQmFzZUluZGV4KCkpOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAg
IGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICB9Cisg
ICAgdm9pZCBzdG9yZUZsb2F0KEZQUmVnaXN0ZXJJRCBzcmMsIER5bmFtaWNBZGRyZXNzIGFkZHJl
c3MpCisgICAgeworICAgICAgICBSRUxFQVNFX0FTU0VSVCh0cnlTdG9yZUZsb2F0KHNyYywgYWRk
cmVzcykpOworICAgIH0KKworICAgIEp1bXAgdHJ5QnJhbmNoOChSZWxhdGlvbmFsQ29uZGl0aW9u
IGNvbmQsIER5bmFtaWNBZGRyZXNzIGxlZnQsIFRydXN0ZWRJbW0zMiByaWdodCkKKyAgICB7Cisg
ICAgICAgIHN3aXRjaCAobGVmdC5raW5kKCkpIHsKKyAgICAgICAgY2FzZSBEeW5hbWljQWRkcmVz
czo6QWRkcmVzczoKKyAgICAgICAgICAgIHJldHVybiBicmFuY2g4KGNvbmQsIGxlZnQuYXNBZGRy
ZXNzKCksIHJpZ2h0KTsKKyAgICAgICAgY2FzZSBEeW5hbWljQWRkcmVzczo6QmFzZUluZGV4Ogor
ICAgICAgICAgICAgcmV0dXJuIGJyYW5jaDgoY29uZCwgbGVmdC5hc0Jhc2VJbmRleCgpLCByaWdo
dCk7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gSnVtcCgpOworICAgICAg
ICB9CisgICAgfQorICAgIHZvaWQgYnJhbmNoOChSZWxhdGlvbmFsQ29uZGl0aW9uIGNvbmQsIER5
bmFtaWNBZGRyZXNzIGxlZnQsIFRydXN0ZWRJbW0zMiByaWdodCkKKyAgICB7CisgICAgICAgIEp1
bXAgcmVzdWx0ID0gdHJ5QnJhbmNoOChjb25kLCBsZWZ0LCByaWdodCk7CisgICAgICAgIFJFTEVB
U0VfQVNTRVJUKHJlc3VsdC5pc1NldCgpKTsKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9
CisKKyAgICBKdW1wIHRyeUJyYW5jaDMyKFJlbGF0aW9uYWxDb25kaXRpb24gY29uZCwgUmVnaXN0
ZXJJRCBsZWZ0LCBEeW5hbWljQWRkcmVzcyByaWdodCkKKyAgICB7CisgICAgICAgIHN3aXRjaCAo
cmlnaHQua2luZCgpKSB7CisgICAgICAgIGNhc2UgRHluYW1pY0FkZHJlc3M6OkFkZHJlc3M6Cisg
ICAgICAgICAgICByZXR1cm4gYnJhbmNoMzIoY29uZCwgbGVmdCwgcmlnaHQuYXNBZGRyZXNzKCkp
OworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuIEp1bXAoKTsKKyAgICAgICAg
fQorICAgIH0KKyAgICBKdW1wIGJyYW5jaDMyKFJlbGF0aW9uYWxDb25kaXRpb24gY29uZCwgVHJ1
c3RlZEltbTMyIGxlZnQsIER5bmFtaWNBZGRyZXNzIHJpZ2h0KQorICAgIHsKKyAgICAgICAgSnVt
cCByZXN1bHQgPSB0cnlCcmFuY2gzMihjb25kLCBsZWZ0LCByaWdodCk7CisgICAgICAgIFJFTEVB
U0VfQVNTRVJUKHJlc3VsdC5pc1NldCgpKTsKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9
CisKKyAgICBKdW1wIHRyeUJyYW5jaDMyKFJlbGF0aW9uYWxDb25kaXRpb24gY29uZCwgRHluYW1p
Y0FkZHJlc3MgbGVmdCwgVHJ1c3RlZEltbTMyIHJpZ2h0KQorICAgIHsKKyAgICAgICAgc3dpdGNo
IChsZWZ0LmtpbmQoKSkgeworICAgICAgICBjYXNlIER5bmFtaWNBZGRyZXNzOjpBZGRyZXNzOgor
ICAgICAgICAgICAgcmV0dXJuIGJyYW5jaDMyKGNvbmQsIGxlZnQuYXNBZGRyZXNzKCksIHJpZ2h0
KTsKKyAgICAgICAgY2FzZSBEeW5hbWljQWRkcmVzczo6QmFzZUluZGV4OgorICAgICAgICAgICAg
cmV0dXJuIGJyYW5jaDMyKGNvbmQsIGxlZnQuYXNCYXNlSW5kZXgoKSwgcmlnaHQpOworICAgICAg
ICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuIEp1bXAoKTsKKyAgICAgICAgfQorICAgIH0K
KyAgICBKdW1wIGJyYW5jaDMyKFJlbGF0aW9uYWxDb25kaXRpb24gY29uZCwgRHluYW1pY0FkZHJl
c3MgbGVmdCwgVHJ1c3RlZEltbTMyIHJpZ2h0KQorICAgIHsKKyAgICAgICAgSnVtcCByZXN1bHQg
PSB0cnlCcmFuY2gzMihjb25kLCBsZWZ0LCByaWdodCk7CisgICAgICAgIFJFTEVBU0VfQVNTRVJU
KHJlc3VsdC5pc1NldCgpKTsKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisgICAgCisg
ICAgSnVtcCB0cnlCcmFuY2gzMihSZWxhdGlvbmFsQ29uZGl0aW9uIGNvbmQsIER5bmFtaWNBZGRy
ZXNzIGxlZnQsIFJlZ2lzdGVySUQgcmlnaHQpCisgICAgeworICAgICAgICBzd2l0Y2ggKGxlZnQu
a2luZCgpKSB7CisgICAgICAgIGNhc2UgRHluYW1pY0FkZHJlc3M6OkFkZHJlc3M6CisgICAgICAg
ICAgICByZXR1cm4gYnJhbmNoMzIoY29uZCwgbGVmdC5hc0FkZHJlc3MoKSwgcmlnaHQpOworICAg
ICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuIEp1bXAoKTsKKyAgICAgICAgfQorICAg
IH0KKyAgICBKdW1wIGJyYW5jaDMyKFJlbGF0aW9uYWxDb25kaXRpb24gY29uZCwgRHluYW1pY0Fk
ZHJlc3MgbGVmdCwgUmVnaXN0ZXJJRCByaWdodCkKKyAgICB7CisgICAgICAgIEp1bXAgcmVzdWx0
ID0gdHJ5QnJhbmNoMzIoY29uZCwgbGVmdCwgcmlnaHQpOworICAgICAgICBSRUxFQVNFX0FTU0VS
VChyZXN1bHQuaXNTZXQoKSk7CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorCisgICAg
SnVtcCB0cnlCcmFuY2hUZXN0MzIoUmVzdWx0Q29uZGl0aW9uIGNvbmQsIER5bmFtaWNBZGRyZXNz
IGxlZnQsIFRydXN0ZWRJbW0zMiByaWdodCkKKyAgICB7CisgICAgICAgIHN3aXRjaCAobGVmdC5r
aW5kKCkpIHsKKyAgICAgICAgY2FzZSBEeW5hbWljQWRkcmVzczo6QWRkcmVzczoKKyAgICAgICAg
ICAgIHJldHVybiBicmFuY2gzMihjb25kLCBsZWZ0LmFzQWRkcmVzcygpLCByaWdodCk7CisgICAg
ICAgIGNhc2UgRHluYW1pY0FkZHJlc3M6OkJhc2VJbmRleDoKKyAgICAgICAgICAgIHJldHVybiBi
cmFuY2gzMihjb25kLCBsZWZ0LmFzQmFzZUluZGV4KCksIHJpZ2h0KTsKKyAgICAgICAgZGVmYXVs
dDoKKyAgICAgICAgICAgIHJldHVybiBKdW1wKCk7CisgICAgICAgIH0KKyAgICB9CisgICAgSnVt
cCBicmFuY2hUZXN0MzIoUmVzdWx0Q29uZGl0aW9uIGNvbmQsIER5bmFtaWNBZGRyZXNzIGxlZnQs
IFRydXN0ZWRJbW0zMiByaWdodCkKKyAgICB7CisgICAgICAgIEp1bXAgcmVzdWx0ID0gdHJ5QnJh
bmNoVGVzdDMyKGNvbmQsIGxlZnQsIHJpZ2h0KTsKKyAgICAgICAgUkVMRUFTRV9BU1NFUlQocmVz
dWx0LmlzU2V0KCkpOworICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKyAgICAKKyAgICBK
dW1wIHRyeUJyYW5jaFRlc3Q4KFJlc3VsdENvbmRpdGlvbiBjb25kLCBEeW5hbWljQWRkcmVzcyBs
ZWZ0LCBUcnVzdGVkSW1tMzIgcmlnaHQpCisgICAgeworICAgICAgICBzd2l0Y2ggKGxlZnQua2lu
ZCgpKSB7CisgICAgICAgIGNhc2UgRHluYW1pY0FkZHJlc3M6OkFkZHJlc3M6CisgICAgICAgICAg
ICByZXR1cm4gYnJhbmNoOChjb25kLCBsZWZ0LmFzQWRkcmVzcygpLCByaWdodCk7CisgICAgICAg
IGNhc2UgRHluYW1pY0FkZHJlc3M6OkJhc2VJbmRleDoKKyAgICAgICAgICAgIHJldHVybiBicmFu
Y2g4KGNvbmQsIGxlZnQuYXNCYXNlSW5kZXgoKSwgcmlnaHQpOworICAgICAgICBkZWZhdWx0Ogor
ICAgICAgICAgICAgcmV0dXJuIEp1bXAoKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBKdW1wIGJy
YW5jaFRlc3Q4KFJlc3VsdENvbmRpdGlvbiBjb25kLCBEeW5hbWljQWRkcmVzcyBsZWZ0LCBUcnVz
dGVkSW1tMzIgcmlnaHQpCisgICAgeworICAgICAgICBKdW1wIHJlc3VsdCA9IHRyeUJyYW5jaFRl
c3Q4KGNvbmQsIGxlZnQsIHJpZ2h0KTsKKyAgICAgICAgUkVMRUFTRV9BU1NFUlQocmVzdWx0Lmlz
U2V0KCkpOworICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKworICAgIEp1bXAgdHJ5SnVt
cChEeW5hbWljQWRkcmVzcyBhZGRyZXNzKQorICAgIHsKKyAgICAgICAgc3dpdGNoIChhZGRyZXNz
LmtpbmQoKSkgeworICAgICAgICBjYXNlIER5bmFtaWNBZGRyZXNzOjpBZGRyZXNzOgorICAgICAg
ICAgICAgcmV0dXJuIGp1bXAoYWRkcmVzcy5hc0FkZHJlc3MoKSk7CisgICAgICAgIGNhc2UgRHlu
YW1pY0FkZHJlc3M6OkFic29sdXRlQWRkcmVzczoKKyAgICAgICAgICAgIHJldHVybiBqdW1wKGFk
ZHJlc3MuYXNBYnNvbHV0ZUFkZHJlc3MoKSk7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAg
ICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisgICAgSnVtcCBqdW1wKER5bmFtaWNB
ZGRyZXNzIGFkZHJlc3MpCisgICAgeworICAgICAgICBKdW1wIHJlc3VsdCA9IHRyeUp1bXAoYWRk
cmVzcyk7CisgICAgICAgIFJFTEVBU0VfQVNTRVJUKHJlc3VsdC5pc1NldCgpKTsKKyAgICAgICAg
cmV0dXJuIHJlc3VsdDsKKyAgICB9CisKKyNpZiBDUFUoWDg2XzY0KSB8fCBDUFUoQVJNNjQpCisg
ICAgYm9vbCB0cnlMb2FkNjQoRHluYW1pY0FkZHJlc3MgYWRkcmVzcywgUmVnaXN0ZXJJRCBkZXN0
KQorICAgIHsKKyAgICAgICAgc3dpdGNoIChhZGRyZXNzLmtpbmQoKSkgeworICAgICAgICBjYXNl
IER5bmFtaWNBZGRyZXNzOjpBZGRyZXNzOgorICAgICAgICAgICAgbG9hZDY0KGFkZHJlc3MuYXNB
ZGRyZXNzKCksIGRlc3QpOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIGNhc2Ug
RHluYW1pY0FkZHJlc3M6OkJhc2VJbmRleDoKKyAgICAgICAgICAgIGxvYWQ2NChhZGRyZXNzLmFz
QmFzZUluZGV4KCksIGRlc3QpOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIGNh
c2UgRHluYW1pY0FkZHJlc3M6OkFic29sdXRlQWRkcmVzczoKKyAgICAgICAgICAgIGxvYWQ2NChh
ZGRyZXNzLmFzQWJzb2x1dGVBZGRyZXNzKCkubV9wdHIsIGRlc3QpOworICAgICAgICAgICAgcmV0
dXJuIHRydWU7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7Cisg
ICAgICAgIH0KKyAgICB9CisgICAgdm9pZCBsb2FkNjQoRHluYW1pY0FkZHJlc3MgYWRkcmVzcywg
UmVnaXN0ZXJJRCBkZXN0KQorICAgIHsKKyAgICAgICAgUkVMRUFTRV9BU1NFUlQodHJ5TG9hZDY0
KGFkZHJlc3MsIGRlc3QpKTsKKyAgICB9CisKKyAgICBib29sIHRyeVN0b3JlNjQoUmVnaXN0ZXJJ
RCBzcmMsIER5bmFtaWNBZGRyZXNzIGFkZHJlc3MpCisgICAgeworICAgICAgICBzd2l0Y2ggKGFk
ZHJlc3Mua2luZCgpKSB7CisgICAgICAgIGNhc2UgRHluYW1pY0FkZHJlc3M6OkFkZHJlc3M6Cisg
ICAgICAgICAgICBzdG9yZTY0KHNyYywgYWRkcmVzcy5hc0FkZHJlc3MoKSk7CisgICAgICAgICAg
ICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgY2FzZSBEeW5hbWljQWRkcmVzczo6QmFzZUluZGV4Ogor
ICAgICAgICAgICAgc3RvcmU2NChzcmMsIGFkZHJlc3MuYXNCYXNlSW5kZXgoKSk7CisgICAgICAg
ICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgY2FzZSBEeW5hbWljQWRkcmVzczo6QWJzb2x1dGVB
ZGRyZXNzOgorICAgICAgICAgICAgc3RvcmU2NChzcmMsIGFkZHJlc3MuYXNBYnNvbHV0ZUFkZHJl
c3MoKS5tX3B0cik7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgZGVmYXVsdDoK
KyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KKyAgICB2b2lkIHN0
b3JlNjQoUmVnaXN0ZXJJRCBzcmMsIER5bmFtaWNBZGRyZXNzIGFkZHJlc3MpCisgICAgeworICAg
ICAgICBSRUxFQVNFX0FTU0VSVCh0cnlTdG9yZTY0KHNyYywgYWRkcmVzcykpOworICAgIH0KKwor
ICAgIGJvb2wgdHJ5U3RvcmU2NChUcnVzdGVkSW1tNjQgc3JjLCBEeW5hbWljQWRkcmVzcyBhZGRy
ZXNzKQorICAgIHsKKyAgICAgICAgc3dpdGNoIChhZGRyZXNzLmtpbmQoKSkgeworICAgICAgICBj
YXNlIER5bmFtaWNBZGRyZXNzOjpBZGRyZXNzOgorICAgICAgICAgICAgc3RvcmU2NChzcmMsIGFk
ZHJlc3MuYXNBZGRyZXNzKCkpOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIGNh
c2UgRHluYW1pY0FkZHJlc3M6OkJhc2VJbmRleDoKKyAgICAgICAgICAgIHN0b3JlNjQoc3JjLCBh
ZGRyZXNzLmFzQmFzZUluZGV4KCkpOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAg
IGNhc2UgRHluYW1pY0FkZHJlc3M6OkFic29sdXRlQWRkcmVzczoKKyAgICAgICAgICAgIHN0b3Jl
NjQoc3JjLCBhZGRyZXNzLmFzQWJzb2x1dGVBZGRyZXNzKCkubV9wdHIpOworICAgICAgICAgICAg
cmV0dXJuIHRydWU7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7
CisgICAgICAgIH0KKyAgICB9CisgICAgdm9pZCBzdG9yZTY0KFRydXN0ZWRJbW02NCBzcmMsIER5
bmFtaWNBZGRyZXNzIGFkZHJlc3MpCisgICAgeworICAgICAgICBSRUxFQVNFX0FTU0VSVCh0cnlT
dG9yZTY0KHNyYywgYWRkcmVzcykpOworICAgIH0KKworICAgIEp1bXAgdHJ5QnJhbmNoNjQoUmVs
YXRpb25hbENvbmRpdGlvbiBjb25kLCBSZWdpc3RlcklEIGxlZnQsIER5bmFtaWNBZGRyZXNzIHJp
Z2h0KQorICAgIHsKKyAgICAgICAgc3dpdGNoIChyaWdodC5raW5kKCkpIHsKKyAgICAgICAgY2Fz
ZSBEeW5hbWljQWRkcmVzczo6QWRkcmVzczoKKyAgICAgICAgICAgIHJldHVybiBicmFuY2g2NChj
b25kLCBsZWZ0LCByaWdodC5hc0FkZHJlc3MoKSk7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAg
ICAgICByZXR1cm4gSnVtcCgpOworICAgICAgICB9CisgICAgfQorICAgIEp1bXAgYnJhbmNoNjQo
UmVsYXRpb25hbENvbmRpdGlvbiBjb25kLCBUcnVzdGVkSW1tNjQgbGVmdCwgRHluYW1pY0FkZHJl
c3MgcmlnaHQpCisgICAgeworICAgICAgICBKdW1wIHJlc3VsdCA9IHRyeUJyYW5jaDY0KGNvbmQs
IGxlZnQsIHJpZ2h0KTsKKyAgICAgICAgUkVMRUFTRV9BU1NFUlQocmVzdWx0LmlzU2V0KCkpOwor
ICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKworICAgIEp1bXAgdHJ5QnJhbmNoNjQoUmVs
YXRpb25hbENvbmRpdGlvbiBjb25kLCBEeW5hbWljQWRkcmVzcyBsZWZ0LCBUcnVzdGVkSW1tNjQg
cmlnaHQpCisgICAgeworICAgICAgICBzd2l0Y2ggKGxlZnQua2luZCgpKSB7CisgICAgICAgIGNh
c2UgRHluYW1pY0FkZHJlc3M6OkFkZHJlc3M6CisgICAgICAgICAgICByZXR1cm4gYnJhbmNoNjQo
Y29uZCwgbGVmdC5hc0FkZHJlc3MoKSwgcmlnaHQpOworICAgICAgICBjYXNlIER5bmFtaWNBZGRy
ZXNzOjpCYXNlSW5kZXg6CisgICAgICAgICAgICByZXR1cm4gYnJhbmNoNjQoY29uZCwgbGVmdC5h
c0Jhc2VJbmRleCgpLCByaWdodCk7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1
cm4gSnVtcCgpOworICAgICAgICB9CisgICAgfQorICAgIEp1bXAgYnJhbmNoNjQoUmVsYXRpb25h
bENvbmRpdGlvbiBjb25kLCBEeW5hbWljQWRkcmVzcyBsZWZ0LCBUcnVzdGVkSW1tNjQgcmlnaHQp
CisgICAgeworICAgICAgICBKdW1wIHJlc3VsdCA9IHRyeUJyYW5jaDY0KGNvbmQsIGxlZnQsIHJp
Z2h0KTsKKyAgICAgICAgUkVMRUFTRV9BU1NFUlQocmVzdWx0LmlzU2V0KCkpOworICAgICAgICBy
ZXR1cm4gcmVzdWx0OworICAgIH0KKyAgICAKKyAgICBKdW1wIHRyeUJyYW5jaDY0KFJlbGF0aW9u
YWxDb25kaXRpb24gY29uZCwgRHluYW1pY0FkZHJlc3MgbGVmdCwgUmVnaXN0ZXJJRCByaWdodCkK
KyAgICB7CisgICAgICAgIHN3aXRjaCAobGVmdC5raW5kKCkpIHsKKyAgICAgICAgY2FzZSBEeW5h
bWljQWRkcmVzczo6QWRkcmVzczoKKyAgICAgICAgICAgIHJldHVybiBicmFuY2g2NChjb25kLCBs
ZWZ0LmFzQWRkcmVzcygpLCByaWdodCk7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBy
ZXR1cm4gSnVtcCgpOworICAgICAgICB9CisgICAgfQorICAgIEp1bXAgYnJhbmNoNjQoUmVsYXRp
b25hbENvbmRpdGlvbiBjb25kLCBEeW5hbWljQWRkcmVzcyBsZWZ0LCBSZWdpc3RlcklEIHJpZ2h0
KQorICAgIHsKKyAgICAgICAgSnVtcCByZXN1bHQgPSB0cnlCcmFuY2g2NChjb25kLCBsZWZ0LCBy
aWdodCk7CisgICAgICAgIFJFTEVBU0VfQVNTRVJUKHJlc3VsdC5pc1NldCgpKTsKKyAgICAgICAg
cmV0dXJuIHJlc3VsdDsKKyAgICB9CisKKyAgICBKdW1wIHRyeUJyYW5jaFRlc3Q2NChSZXN1bHRD
b25kaXRpb24gY29uZCwgRHluYW1pY0FkZHJlc3MgbGVmdCwgVHJ1c3RlZEltbTY0IHJpZ2h0KQor
ICAgIHsKKyAgICAgICAgc3dpdGNoIChsZWZ0LmtpbmQoKSkgeworICAgICAgICBjYXNlIER5bmFt
aWNBZGRyZXNzOjpBZGRyZXNzOgorICAgICAgICAgICAgcmV0dXJuIGJyYW5jaDY0KGNvbmQsIGxl
ZnQuYXNBZGRyZXNzKCksIHJpZ2h0KTsKKyAgICAgICAgY2FzZSBEeW5hbWljQWRkcmVzczo6QmFz
ZUluZGV4OgorICAgICAgICAgICAgcmV0dXJuIGJyYW5jaDY0KGNvbmQsIGxlZnQuYXNCYXNlSW5k
ZXgoKSwgcmlnaHQpOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuIEp1bXAo
KTsKKyAgICAgICAgfQorICAgIH0KKyAgICBKdW1wIGJyYW5jaFRlc3Q2NChSZXN1bHRDb25kaXRp
b24gY29uZCwgRHluYW1pY0FkZHJlc3MgbGVmdCwgVHJ1c3RlZEltbTY0IHJpZ2h0KQorICAgIHsK
KyAgICAgICAgSnVtcCByZXN1bHQgPSB0cnlCcmFuY2hUZXN0NjQoY29uZCwgbGVmdCwgcmlnaHQp
OworICAgICAgICBSRUxFQVNFX0FTU0VSVChyZXN1bHQuaXNTZXQoKSk7CisgICAgICAgIHJldHVy
biByZXN1bHQ7CisgICAgfQorI2VuZGlmIC8vIENQVShYODZfNjQpIHx8IENQVShBUk02NCkKKwog
I2lmIEVOQUJMRShNQVNNX1BST0JFKQogICAgIC8vIExldCdzIHlvdSBwcmludCBmcm9tIHlvdXIg
SklUIGdlbmVyYXRlZCBjb2RlLgogICAgIC8vIFNlZSBjb21tZW50cyBpbiBNYWNyb0Fzc2VtYmxl
clByaW50ZXIuaCBmb3IgZXhhbXBsZXMgb2YgaG93IHRvIHVzZSB0aGlzLgpJbmRleDogU291cmNl
L0phdmFTY3JpcHRDb3JlL2IzL0IzQWRkcmVzc01hdGNoZXIucGF0dGVybnMKPT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQot
LS0gU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzQWRkcmVzc01hdGNoZXIucGF0dGVybnMJKHJl
dmlzaW9uIDApCisrKyBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNBZGRyZXNzTWF0Y2hlci5w
YXR0ZXJucwkod29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDQxIEBACisjIENvcHlyaWdodCAoQykg
MjAxNSBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisjCisjIFJlZGlzdHJpYnV0aW9u
IGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorIyBt
b2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNv
bmRpdGlvbnMKKyMgYXJlIG1ldDoKKyMgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2Rl
IG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyMgICAgbm90aWNlLCB0aGlzIGxpc3Qg
b2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorIyAyLiBSZWRpc3Ry
aWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdo
dAorIyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5n
IGRpc2NsYWltZXIgaW4gdGhlCisjICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVy
aWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisjCisjIFRISVMgU09GVFdBUkUg
SVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBBTkQgSVRTIENPTlRSSUJVVE9SUyBgYEFTIElTJycK
KyMgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQg
Tk9UIExJTUlURUQgVE8sCisjIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklM
SVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyMgUFVSUE9TRSBBUkUgRElTQ0xBSU1F
RC4gSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUiBJVFMgQ09OVFJJQlVUT1JTCisjIEJF
IExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVY
RU1QTEFSWSwgT1IKKyMgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1Qg
TElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKKyMgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNF
UzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTCisjIElOVEVSUlVQ
VElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVU
SEVSIElOCisjIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcg
TkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisjIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhF
IFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YKKyMgVEhFIFBPU1NJQklM
SVRZIE9GIFNVQ0ggREFNQUdFLgorCittYXRjaGVyIEFkZHJlc3NNYXRjaGVyCisKKyMgTm90ZSB0
aGF0IHRoaXMgcmVsaWVzIG9uIEIzIGRvaW5nIGFnZ3Jlc3NpdmUgcmVhc3NvY2lhdGlvbiBhbmQg
Y2Fub25jYWxpemF0aW9uIG9mIGludGVnZXIgYWRkcy4KKyMgV2UnbGwgbmV2ZXIgc2VlIEFkZChB
ZGQoeCwgY29uc3QxKSwgY29uc3QyKSBiZWNhdXNlIGl0IHdvdWxkIGhhdmUgYWxyZWFkeSBiZWVu
IHJlYXNzb2NpYXRlZCBpbnRvCisjIEFkZCh4LCBjb25zdDEgKyBjb25zdDIpLiBBbHNvLCB3ZSB3
aWxsIG5ldmVyIHNlZSBBZGQoY29uc3QsIHgpLCBiZWNhdXNlIHdlIHdvdWxkIGhhdmUgY2Fub25p
Y2FsaXplZAorIyBpdCB0byBBZGQoeCwgY29uc3QpLiBUaGF0IHNhaWQsIGluIHRoaXMgY29kZSB3
ZSBuZXZlciBtYWtlIGFzc2VydGlvbnMgYWJvdXQgdGhlc2Ugb3B0aW1pemF0aW9ucworIyBoYXZp
bmcgYmVlbiBwZXJmb3JtZWQuIEFsc28sIHNpbmNlIHRoZSBMb2FkL1N0b3JlIGluc3RydWN0aW9u
cyBpbiBCMyBoYXZlIGEgYnVpbHQtaW4gb2Zmc2V0LCB3ZQorIyBkb24ndCBuZWVkIHRvIG1hdGNo
IEFkZCh4LCBjb25zdCkuIFRoYXQgd291bGQgaGF2ZSBiZWVuIGZvbGRlZCBpbnRvIHRoZSBMb2Fk
L1N0b3JlIGluc3RydWN0aW9ucworIyBhbHJlYWR5LiBTbywgdGhlIG9ubHkgZmFuY3kgbWF0aGlu
ZyB0aGlzIGNhbiBkbyBpcyBqdXN0IEJhc2VJbmRleCBmb3Jtcy4KKworQWRkU2hpZnQxID0gQWRk
KFNobChpbmRleCwgJGxvZ1NjYWxlKSwgYmFzZSkKK0FkZFNoaWZ0MiA9IEFkZChiYXNlLCBTaGwo
aW5kZXgsICRsb2dTY2FsZSkpCisKK0FkZCA9IEFkZChsZWZ0LCByaWdodCkKKworJENvbnN0CisK
K0RpcmVjdApJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzQXJndW1lbnRSZWdWYWx1
ZS5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzQXJndW1lbnRS
ZWdWYWx1ZS5jcHAJKHJldmlzaW9uIDApCisrKyBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNB
cmd1bWVudFJlZ1ZhbHVlLmNwcAkod29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDQxIEBACisvKgor
ICogQ29weXJpZ2h0IChDKSAyMDE1IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAq
CisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3
aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0
aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJp
YnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Cisg
KiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRp
c2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXBy
b2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29u
ZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1l
bnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1
dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gYGBB
UyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJ
TkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVS
Q0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJF
IERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SCisgKiBDT05UUklC
VVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BF
Q0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcs
IEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMg
T1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5F
U1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0Yg
TElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JU
CisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBX
QVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBP
RiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisKKyNpbmNsdWRlICJjb25m
aWcuaCIKKyNpbmNsdWRlICJCM0FyZ3VtZW50UmVnVmFsdWUuaCIKKworbmFtZXNwYWNlIEpTQyB7
IG5hbWVzcGFjZSBCMyB7CisKK0FyZ3VtZW50UmVnVmFsdWU6On5Bcmd1bWVudFJlZ1ZhbHVlKCkK
K3sKK30KKwordm9pZCBBcmd1bWVudFJlZ1ZhbHVlOjpkdW1wTWV0YShQcmludFN0cmVhbSYgb3V0
KSBjb25zdAoreworICAgIG91dC5wcmludChtX3JlZyk7Cit9CisKK30gfSAvLyBuYW1lc3BhY2Ug
SlNDOjpCMworCkluZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNBcmd1bWVudFJlZ1Zh
bHVlLmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzQXJndW1lbnRS
ZWdWYWx1ZS5oCShyZXZpc2lvbiAwKQorKysgU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzQXJn
dW1lbnRSZWdWYWx1ZS5oCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsNjAgQEAKKy8qCisgKiBD
b3B5cmlnaHQgKEMpIDIwMTUgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAq
IFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGgg
b3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQg
dGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRp
b25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAg
IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xh
aW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVj
ZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRp
b25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0
aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9u
LgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFTIElT
JycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywg
QlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFO
VEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElT
Q0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IKKyAqIENPTlRSSUJVVE9S
UyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFM
LAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVU
IE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBT
RVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJ
TlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFC
SUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAq
IChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBP
VVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRI
RSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKworI2lmbmRlZiBCM0FyZ3VtZW50
UmVnVmFsdWVfaAorI2RlZmluZSBCM0FyZ3VtZW50UmVnVmFsdWVfaAorCisjaW5jbHVkZSAiQjNW
YWx1ZS5oIgorI2luY2x1ZGUgIlJlZy5oIgorCituYW1lc3BhY2UgSlNDIHsgbmFtZXNwYWNlIEIz
IHsKKworY2xhc3MgQXJndW1lbnRSZWdWYWx1ZSA6IHB1YmxpYyBWYWx1ZSB7CitwdWJsaWM6Cisg
ICAgc3RhdGljIGJvb2wgYWNjZXB0cyhPcGNvZGUgb3Bjb2RlKSB7IHJldHVybiBvcGNvZGUgPT0g
QXJndW1lbnRSZWc7IH0KKyAgICAKKyAgICB+QXJndW1lbnRSZWdWYWx1ZSgpOworCisgICAgUmVn
IGFyZ3VtZW50UmVnKCkgY29uc3QgeyByZXR1cm4gbV9yZWc7IH0KKworcHJvdGVjdGVkOgorICAg
IHZvaWQgZHVtcE1ldGEoUHJpbnRTdHJlYW0mKSBjb25zdCBvdmVycmlkZTsKKworcHJpdmF0ZToK
KyAgICBmcmllbmQgY2xhc3MgUHJvY2VkdXJlOworCisgICAgQXJndW1lbnRSZWdWYWx1ZSh1bnNp
Z25lZCBpbmRleCwgT3JpZ2luIG9yaWdpbiwgUmVnIHJlZykKKyAgICAgICAgOiBWYWx1ZShpbmRl
eCwgQXJndW1lbnRSZWcsIHJlZy5pc0dQUigpID8gcG9pbnRlcigpIDogRG91YmxlLCBvcmlnaW4p
CisgICAgICAgICwgbV9yZWcocmVnKQorICAgIHsKKyAgICB9CisKKyAgICBSZWcgbV9yZWc7Cit9
OworCit9IH0gLy8gbmFtZXNwYWNlIEpTQzo6QjMKKworI2VuZGlmIC8vIEIzQXJndW1lbnRSZWdW
YWx1ZV9oCisKSW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM0Jhc2ljQmxvY2suY3Bw
Cj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM0Jhc2ljQmxvY2suY3Bw
CShyZXZpc2lvbiAwKQorKysgU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzQmFzaWNCbG9jay5j
cHAJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSw1OCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykg
MjAxNSBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRp
b24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Cisg
KiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5n
IGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNl
IGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlz
IGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4g
UmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBj
b3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBm
b2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90
aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJ
UyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisg
KiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlU
RUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQg
RklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4g
Tk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBG
T1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExB
UlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQg
VE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NT
IE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikg
SE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhF
UiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBO
RUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNF
CisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZ
IE9GIFNVQ0ggREFNQUdFLiAKKyAqLworCisjaW5jbHVkZSAiY29uZmlnLmgiCisjaW5jbHVkZSAi
QjNCYXNpY0Jsb2NrLmgiCisKK25hbWVzcGFjZSBKU0MgeyBuYW1lc3BhY2UgQjMgeworCitCYXNp
Y0Jsb2NrOjpCYXNpY0Jsb2NrKHVuc2lnbmVkIGluZGV4KQorICAgIDogbV9pbmRleChpbmRleCkK
K3sKK30KKworQmFzaWNCbG9jazo6fkJhc2ljQmxvY2soKQoreworfQorCit2b2lkIEJhc2ljQmxv
Y2s6OmFwcGVuZChWYWx1ZSogdmFsdWUpCit7CisgICAgbV92YWx1ZXMuYXBwZW5kKHZhbHVlKTsK
K30KKwordm9pZCBCYXNpY0Jsb2NrOjpkdW1wKFByaW50U3RyZWFtJiBvdXQpIGNvbnN0Cit7Cisg
ICAgb3V0LnByaW50KGR1bXBQcmVmaXgsIG1faW5kZXgpOworfQorCit2b2lkIEJhc2ljQmxvY2s6
OmRlZXBEdW1wKFByaW50U3RyZWFtJiBvdXQpIGNvbnN0Cit7CisgICAgb3V0LnByaW50KCJCQiIs
ICp0aGlzLCAiOlxuIik7CisgICAgZm9yIChWYWx1ZSogdmFsdWUgOiAqdGhpcykKKyAgICAgICAg
b3V0LnByaW50KCIgICAgIiwgZGVlcER1bXAodmFsdWUpLCAiXG4iKTsKK30KKworfSB9IC8vIG5h
bWVzcGFjZSBKU0M6OkIzCisKSW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM0Jhc2lj
QmxvY2suaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNCYXNpY0Js
b2NrLmgJKHJldmlzaW9uIDApCisrKyBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNCYXNpY0Js
b2NrLmgJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSwxMTIgQEAKKy8qCisgKiBDb3B5cmlnaHQg
KEMpIDIwMTUgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJp
YnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91
dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxv
d2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNv
dXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwg
dGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAq
IDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJv
dmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0
aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9v
ciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAq
IFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFTIElTJycgQU5EIEFO
WQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBM
SU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkg
QU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4g
IElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFC
TEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhF
TVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1J
VEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsg
TE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJ
T04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdI
RVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJ
TkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhF
IFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJ
TElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKworI2lmbmRlZiBCM0Jhc2ljQmxvY2sKKyNkZWZp
bmUgQjNCYXNpY0Jsb2NrCisKK25hbWVzcGFjZSBKU0MgeyBuYW1lc3BhY2UgQjMgeworCitjbGFz
cyBQcm9jZWR1cmU7CitjbGFzcyBWYWx1ZTsKKworY2xhc3MgQmFzaWNCbG9jayB7CisgICAgV1RG
X01BS0VfTk9OQ09QWUFCTEUoQmFzaWNCbG9jayk7CisgICAgV1RGX01BS0VfRkFTVF9BTExPQ0FU
RUQ7CitwdWJsaWM6CisgICAgdHlwZWRlZiBWZWN0b3I8VmFsdWUqPiBWYWx1ZUxpc3Q7CisgICAg
dHlwZWRlZiBWZWN0b3I8QmFzaWNCbG9jayosIDI+IFN1Y2Nlc3Nvckxpc3Q7IC8vIFRoaXMgbWF0
Y2hlcyBDb250cm9sVmFsdWUncyB0eXBlZGVmLgorCisgICAgc3RhdGljIGNvbnN0IGNoYXIqIGR1
bXBQcmVmaXggPSAiIyI7CisKKyAgICB+QmFzaWNCbG9jaygpOworCisgICAgdW5zaWduZWQgaW5k
ZXgoKSBjb25zdCB7IHJldHVybiBtX2luZGV4OyB9CisKKyAgICBBZGphY2VuY3lMaXN0OjppdGVy
YXRvciBiZWdpbigpIHsgcmV0dXJuIG1fdmFsdWVzLmJlZ2luKCk7IH0KKyAgICBBZGphY2VuY3lM
aXN0OjppdGVyYXRvciBlbmQoKSB7IHJldHVybiBtX3ZhbHVlcy5lbmQoKTsgfQorICAgIEFkamFj
ZW5jeUxpc3Q6OmNvbnN0X2l0ZXJhdG9yIGJlZ2luKCkgY29uc3QgeyByZXR1cm4gbV92YWx1ZXMu
YmVnaW4oKTsgfQorICAgIEFkamFjZW5jeUxpc3Q6OmNvbnN0X2l0ZXJhdG9yIGVuZCgpIGNvbnN0
IHsgcmV0dXJuIG1fdmFsdWVzLmVuZCgpOyB9CisKKyAgICBzaXplX3Qgc2l6ZSgpIGNvbnN0IHsg
cmV0dXJuIG1fdmFsdWVzLnNpemUoKTsgfQorICAgIFZhbHVlKiBhdChzaXplX3QgaW5kZXgpIGNv
bnN0IHsgcmV0dXJuIG1fdmFsdWVzW2luZGV4XTsgfQorICAgIFZhbHVlKiYgYXQoc2l6ZV90IGlu
ZGV4KSB7IHJldHVybiBtX3ZhbHVlc1tpbmRleF07IH0KKworICAgIFZhbHVlKiBsYXN0KCkgY29u
c3QgeyByZXR1cm4gbV92YWx1ZXMubGFzdCgpOyB9CisgICAgVmFsdWUqJiBsYXN0KCkgeyByZXR1
cm4gbV92YWx1ZXMubGFzdCgpOyB9CisKKyAgICBjb25zdCBWYWx1ZUxpc3QmIHZhbHVlcygpIGNv
bnN0IHsgcmV0dXJuIG1fdmFsdWVzOyB9CisgICAgVmFsdWVMaXN0JiB2YWx1ZXMoKSB7IHJldHVy
biBtX3ZhbHVlczsgfQorCisgICAgdm9pZCBhcHBlbmQoVmFsdWUqKTsKKworICAgIHRlbXBsYXRl
PHR5cGVuYW1lIFZhbHVlVHlwZSwgdHlwZW5hbWUuLi4gQXJndW1lbnRzPgorICAgIFZhbHVlVHlw
ZSogYXBwZW5kTmV3KFByb2NlZHVyZSYsIEFyZ3VtZW50cy4uLik7CisKKyAgICB1bnNpZ25lZCBu
dW1TdWNjZXNzb3JzKCkgY29uc3Q7CisgICAgQmFzaWNCbG9jayogc3VjY2Vzc29yKHVuc2lnbmVk
IGluZGV4KSBjb25zdDsKKyAgICBCYXNpY0Jsb2NrKiYgc3VjY2Vzc29yKHVuc2lnbmVkIGluZGV4
KTsKKyAgICBjb25zdCBTdWNjZXNzb3JMaXN0JiBzdWNjZXNzb3JzKCkgY29uc3Q7CisKKyAgICB2
b2lkIGR1bXAoUHJpbnRTdHJlYW0mKSBjb25zdDsKKyAgICB2b2lkIGRlZXBEdW1wKFByaW50U3Ry
ZWFtJikgY29uc3Q7CisKK3ByaXZhdGU6CisgICAgZnJpZW5kIGNsYXNzIFByb2NlZHVyZTsKKyAg
ICAKKyAgICAvLyBJbnN0YW50aWF0ZSB2aWEgUHJvY2VkdXJlLgorICAgIEJhc2ljQmxvY2sodW5z
aWduZWQgaW5kZXgpOworCisgICAgdW5zaWduZWQgbV9pbmRleDsKKyAgICBWYWx1ZUxpc3QgbV92
YWx1ZXM7Cit9OworCitjbGFzcyBEZWVwQmFzaWNCbG9ja0R1bXAgeworcHVibGljOgorICAgIERl
ZXBCYXNpY0Jsb2NrRHVtcChCYXNpY0Jsb2NrKiBibG9jaykKKyAgICAgICAgOiBtX2Jsb2NrKGJs
b2NrKQorICAgIHsKKyAgICB9CisKKyAgICB2b2lkIGR1bXAoUHJpbnRTdHJlYW0mIG91dCkgY29u
c3QKKyAgICB7CisgICAgICAgIGlmIChtX2Jsb2NrKQorICAgICAgICAgICAgbV9ibG9jay0+ZGVl
cER1bXAob3V0KTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgb3V0LnByaW50KCI8bnVsbD4i
KTsKKyAgICB9CisKK3ByaXZhdGU6CisgICAgQmFzaWNCbG9jayogbV9ibG9jazsKK307CisKK0Rl
ZXBCYXNpY0Jsb2NrRHVtcCBkZWVwRHVtcChCYXNpY0Jsb2NrKiBibG9jaykKK3sKKyAgICByZXR1
cm4gRGVlcEJhc2ljQmxvY2tEdW1wKGJsb2NrKTsKK30KKworfSB9IC8vIG5hbWVzcGFjZSBKU0M6
OkIzCisKKyNlbmRpZiAvLyBCM0Jhc2ljQmxvY2sKKwpJbmRleDogU291cmNlL0phdmFTY3JpcHRD
b3JlL2IzL0IzQmFzaWNCbG9ja0lubGluZXMuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNj
cmlwdENvcmUvYjMvQjNCYXNpY0Jsb2NrSW5saW5lcy5oCShyZXZpc2lvbiAwKQorKysgU291cmNl
L0phdmFTY3JpcHRDb3JlL2IzL0IzQmFzaWNCbG9ja0lubGluZXMuaAkod29ya2luZyBjb3B5KQpA
QCAtMCwwICsxLDY2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE1IEFwcGxlIEluYy4gQWxs
IHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJj
ZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJl
IHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJl
IG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0
aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25z
IGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4g
YmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90
aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVy
IGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3Zp
ZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJ
REVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElF
RCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBM
SUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJ
Q1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBM
RSBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJ
UkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElB
TCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5U
IE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgor
ICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQg
T04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJ
Q1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJX
SVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdB
UkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAor
ICovCisKKyNpZm5kZWYgQjNCYXNpY0Jsb2NrSW5saW5lc19oCisjZGVmaW5lIEIzQmFzaWNCbG9j
a0lubGluZXNfaAorCisjaW5jbHVkZSAiQjNCYXNpY0Jsb2NrLmgiCisjaW5jbHVkZSAiQjNDb250
cm9sVmFsdWUuaCIKKyNpbmNsdWRlICJCM1Byb2NlZHVyZUlubGluZXMuaCIKKworbmFtZXNwYWNl
IEpTQyB7IG5hbWVzcGFjZSBCMyB7CisKK3RlbXBsYXRlPHR5cGVuYW1lIFZhbHVlVHlwZSB0eXBl
bmFtZS4uLiBBcmd1bWVudHM+CitWYWx1ZVR5cGUqIEJhc2ljQmxvY2s6OmFwcGVuZE5ldyhQcm9j
ZWR1cmUmIHByb2NlZHVyZSwgQXJndW1lbnRzLi4uIGFyZ3VtZW50cykKK3sKKyAgICBWYWx1ZVR5
cGUqIHJlc3VsdCA9IHByb2NlZHVyZS5hZGQ8VmFsdWVUeXBlPihhcmd1bWVudHMuLi4pOworICAg
IGFwcGVuZChyZXN1bHQpOworICAgIHJldHVybiByZXN1bHQ7Cit9CisKK3Vuc2lnbmVkIEJhc2lj
QmxvY2s6Om51bVN1Y2Nlc3NvcnMoKSBjb25zdAoreworICAgIHJldHVybiBsYXN0KCktPmFzPENv
bnRyb2xWYWx1ZT4oKS0+bnVtU3VjY2Vzc29ycygpOworfQorCitCYXNpY0Jsb2NrKiBCYXNpY0Js
b2NrOjpzdWNjZXNzb3IodW5zaWduZWQgaW5kZXgpIGNvbnN0Cit7CisgICAgcmV0dXJuIGxhc3Qo
KS0+YXM8Q29udHJvbFZhbHVlPigpLT5zdWNjZXNzb3IoaW5kZXgpOworfQorCitCYXNpY0Jsb2Nr
KiYgQmFzaWNCbG9jazo6c3VjY2Vzc29yKHVuc2lnbmVkIGluZGV4KQoreworICAgIHJldHVybiBs
YXN0KCktPmFzPENvbnRyb2xWYWx1ZT4oKS0+c3VjY2Vzc29yKGluZGV4KTsKK30KKworY29uc3Qg
QmFzaWNCbG9jazo6U3VjY2Vzc29yTGlzdCYgQmFzaWNCbG9jazo6c3VjY2Vzc29ycygpIGNvbnN0
Cit7CisgICAgcmV0dXJuIGxhc3QoKS0+YXM8Q29udHJvbFZhbHVlPigpLT5zdWNjZXNzb3JzKCk7
Cit9CisKK30gfSAvLyBuYW1lc3BhY2UgSlNDOjpCMworCisjZW5kaWYgLy8gQjNCYXNpY0Jsb2Nr
SW5saW5lc19oCisKSW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM0NoZWNrVmFsdWUu
Y3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM0NoZWNrVmFsdWUu
Y3BwCShyZXZpc2lvbiAwKQorKysgU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzQ2hlY2tWYWx1
ZS5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSw0MSBAQAorLyoKKyAqIENvcHlyaWdodCAo
QykgMjAxNSBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmli
dXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0
CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93
aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291
cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0
aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICog
Mi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92
ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRo
ZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29y
IG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICog
VEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5Z
CisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJ
TUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBB
TkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAg
SU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJM
RSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVN
UExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlU
RUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBM
T1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElP
TikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hF
VEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElO
RyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUg
VVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklM
SVRZIE9GIFNVQ0ggREFNQUdFLiAKKyAqLworCisjaW5jbHVkZSAiY29uZmlnLmgiCisjaW5jbHVk
ZSAiQjNDaGVja1ZhbHVlLmgiCisKK25hbWVzcGFjZSBKU0MgeyBuYW1lc3BhY2UgQjMgeworCitD
aGVja1ZhbHVlOjp+Q2hlY2tWYWx1ZSgpCit7Cit9CisKK3ZvaWQgQ2hlY2tWYWx1ZTo6ZHVtcE1l
dGEoUHJpbnRTdHJlYW0mIG91dCkgY29uc3QKK3sKKyAgICBvdXQucHJpbnQoInN0YWNrbWFwID0g
Iiwgc3RhY2ttYXApOworfQorCit9IH0gLy8gbmFtZXNwYWNlIEpTQzo6QjMKKwpJbmRleDogU291
cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzQ2hlY2tWYWx1ZS5oCj09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJj
ZS9KYXZhU2NyaXB0Q29yZS9iMy9CM0NoZWNrVmFsdWUuaAkocmV2aXNpb24gMCkKKysrIFNvdXJj
ZS9KYXZhU2NyaXB0Q29yZS9iMy9CM0NoZWNrVmFsdWUuaAkod29ya2luZyBjb3B5KQpAQCAtMCww
ICsxLDgwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE1IEFwcGxlIEluYy4gQWxsIHJpZ2h0
cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQg
YmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1p
dHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoK
KyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJv
dmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0
aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5
IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0
aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRo
ZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdp
dGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZ
IEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJS
QU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdB
UlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIK
KyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMu
IE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwg
SU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1B
R0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNV
QlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJP
RklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5Z
IFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElB
QklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBB
UklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVW
RU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisK
KyNpZm5kZWYgQjNDaGVja1ZhbHVlX2gKKyNkZWZpbmUgQjNDaGVja1ZhbHVlX2gKKworI2luY2x1
ZGUgIkIzVmFsdWUuaCIKKyNpbmNsdWRlICJCM1N0YWNrbWFwLmgiCisKK25hbWVzcGFjZSBKU0Mg
eyBuYW1lc3BhY2UgQjMgeworCitjbGFzcyBDaGVja1ZhbHVlIDogcHVibGljIENoZWNrIHsKK3B1
YmxpYzoKKyAgICBzdGF0aWMgYm9vbCBhY2NlcHRzKE9wY29kZSBvcGNvZGUpCisgICAgeworICAg
ICAgICBzd2l0Y2ggKG9wY29kZSkgeworICAgICAgICBjYXNlIENoZWNrQWRkOgorICAgICAgICBj
YXNlIENoZWNrU3ViOgorICAgICAgICBjYXNlIENoZWNrTXVsOgorICAgICAgICBjYXNlIENoZWNr
OgorICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAg
ICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICB+Q2hlY2tWYWx1ZSgpOwor
CisgICAgU3RhY2ttYXAgc3RhY2ttYXA7CisKK3Byb3RlY3RlZDoKKyAgICB2b2lkIGR1bXBNZXRh
KFByaW50U3RyZWFtJikgY29uc3Qgb3ZlcnJpZGU7CisKK3ByaXZhdGU6CisgICAgZnJpZW5kIGNs
YXNzIFByb2NlZHVyZTsKKworICAgIC8vIFVzZSB0aGlzIGZvcm0gZm9yIENoZWNrQWRkLCBDaGVj
a1N1YiwgYW5kIENoZWNrTXVsLgorICAgIENoZWNrVmFsdWUodW5zaWduZWQgaW5kZXgsIE9wY29k
ZSBvcGNvZGUsIE9yaWdpbiBvcmlnaW4sIFZhbHVlKiBsZWZ0LCBWYWx1ZSogcmlnaHQpCisgICAg
ICAgIDogVmFsdWUoaW5kZXgsIG9wY29kZSwgbGVmdC0+dHlwZSgpLCBvcmlnaW4sIGxlZnQsIHJp
Z2h0KQorICAgIHsKKyAgICAgICAgQVNTRVJUKGlzSW50KHR5cGUoKSkpOworICAgICAgICBBU1NF
UlQobGVmdC0+dHlwZSgpID09IHJpZ2h0LT50eXBlKCkpOworICAgICAgICBBU1NFUlQob3Bjb2Rl
ID09IENoZWNrQWRkIHx8IG9wY29kZSA9PSBDaGVja1N1YiB8fCBvcGNvZGUgPT0gQ2hlY2tNdWwp
OworICAgIH0KKworICAgIC8vIFVzZSB0aGlzIGZvcm0gZm9yIENoZWNrLgorICAgIENoZWNrVmFs
dWUodW5zaWduZWQgaW5kZXgsIE9wY29kZSBvcGNvZGUsIE9yaWdpbiBvcmlnaW4sIFZhbHVlKiBw
cmVkaWNhdGUpCisgICAgICAgIDogVmFsdWUoaW5kZXgsIG9wY29kZSwgVm9pZCwgb3JpZ2luLCBw
cmVkaWNhdGUpCisgICAgeworICAgICAgICBBU1NFUlQob3BjZGUgPT0gQ2hlY2spOworICAgIH0K
K307CisKK30gfSAvLyBuYW1lc3BhY2UgSlNDOjpCMworCisjZW5kaWYgLy8gQjNDaGVja1ZhbHVl
X2gKKworCkluZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNDb21wYXJpc29uTWF0Y2hl
ci5wYXR0ZXJucwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNDb21w
YXJpc29uTWF0Y2hlci5wYXR0ZXJucwkocmV2aXNpb24gMCkKKysrIFNvdXJjZS9KYXZhU2NyaXB0
Q29yZS9iMy9CM0NvbXBhcmlzb25NYXRjaGVyLnBhdHRlcm5zCSh3b3JraW5nIGNvcHkpCkBAIC0w
LDAgKzEsMzggQEAKKyMgQ29weXJpZ2h0IChDKSAyMDE1IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyBy
ZXNlcnZlZC4KKyMKKyMgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFy
eSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisjIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBw
cm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworIyBhcmUgbWV0OgorIyAxLiBS
ZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHly
aWdodAorIyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93
aW5nIGRpc2NsYWltZXIuCisjIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0
IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisjICAgIG5vdGljZSwgdGhpcyBsaXN0IG9m
IGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyMgICAgZG9j
dW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3Ry
aWJ1dGlvbi4KKyMKKyMgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIEFO
RCBJVFMgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJworIyBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElF
RCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyMgVEhFIElNUExJ
RUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElD
VUxBUgorIyBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJ
TkMuIE9SIElUUyBDT05UUklCVVRPUlMKKyMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJ
UkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgorIyBDT05TRVFVRU5USUFM
IERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgor
IyBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJP
RklUUzsgT1IgQlVTSU5FU1MKKyMgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04g
QU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KKyMgQ09OVFJBQ1QsIFNUUklDVCBM
SUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKyMg
QVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4g
SUYgQURWSVNFRCBPRgorIyBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKK21hdGNo
ZXIgQ29tcGFyaXNvbk1hdGNoZXIKKworVGVzdExvYWROb3RaZXJvMSA9IEFuZChMb2FkKGFkZHJl
c3MpLCByaWdodCkKK1Rlc3RMb2FkTm90WmVybzIgPSBBbmQobGVmdCwgTG9hZChhZGRyZXNzKSkK
K1Rlc3ROb3RaZXJvID0gQW5kKGxlZnQsIHJpZ2h0KQorCitUZXN0TG9hZFplcm8xID0gRXF1YWwo
QW5kKExvYWQoYWRkcmVzcyksIHJpZ2h0KSwgJDApCitUZXN0TG9hZFplcm8yID0gRXF1YWwoQW5k
KGxlZnQsIExvYWQoYWRkcmVzcykpLCAkMCkKK1Rlc3RaZXJvID0gRXF1YWwoQW5kKGxlZnQsIHJp
Z2h0KSwgJDApCisKK0xvYWRFcXVhbDEgPSBFcXVhbChMb2FkKGFkZHJlc3MpLCByaWdodCkKK0xv
YWRFcXVhbDIgPSBFcXVhbChsZWZ0LCBMb2FkKGFkZHJlc3MpKQorTm90ID0gRXF1YWwodmFsdWUs
ICQwKQorRXF1YWwgPSBFcXVhbChsZWZ0LCByaWdodCkKKwpJbmRleDogU291cmNlL0phdmFTY3Jp
cHRDb3JlL2IzL0IzQ29uc3QzMlZhbHVlLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNj
cmlwdENvcmUvYjMvQjNDb25zdDMyVmFsdWUuY3BwCShyZXZpc2lvbiAwKQorKysgU291cmNlL0ph
dmFTY3JpcHRDb3JlL2IzL0IzQ29uc3QzMlZhbHVlLmNwcAkod29ya2luZyBjb3B5KQpAQCAtMCww
ICsxLDQxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE1IEFwcGxlIEluYy4gQWxsIHJpZ2h0
cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQg
YmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1p
dHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoK
KyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJv
dmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0
aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5
IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0
aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRo
ZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdp
dGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZ
IEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJS
QU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdB
UlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIK
KyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMu
IE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwg
SU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1B
R0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNV
QlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJP
RklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5Z
IFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElB
QklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBB
UklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVW
RU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisK
KyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJCM0NvbnN0MzJWYWx1ZS5oIgorCituYW1l
c3BhY2UgSlNDIHsgbmFtZXNwYWNlIEIzIHsKKworQ29uc3QzMlZhbHVlOjp+Q29uc3QzMlZhbHVl
KCkKK3sKK30KKwordm9pZCBDb25zdDMyVmFsdWU6OmR1bXBNZXRhKFByaW50U3RyZWFtJiBvdXQp
IGNvbnN0Cit7CisgICAgb3V0LnByaW50KG1fdmFsdWUpOworfQorCit9IH0gLy8gbmFtZXNwYWNl
IEpTQzo6QjMKKwpJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzQ29uc3QzMlZhbHVl
LmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzQ29uc3QzMlZhbHVl
LmgJKHJldmlzaW9uIDApCisrKyBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNDb25zdDMyVmFs
dWUuaAkod29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDU5IEBACisvKgorICogQ29weXJpZ2h0IChD
KSAyMDE1IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1
dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQK
KyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dp
bmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3Vy
Y2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRo
aXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAy
LiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3Zl
IGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhl
IGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Ig
b3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBU
SElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkK
KyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElN
SVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFO
RCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJ
TiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxF
IEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1Q
TEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRF
RCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExP
U1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9O
KSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVU
SEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5H
IE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBV
U0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJ
VFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisKKyNpZm5kZWYgQjNDb25zdDMyVmFsdWVfaAorI2Rl
ZmluZSBCM0NvbnN0MzJWYWx1ZV9oCisKKyNpbmNsdWRlICJCM1ZhbHVlLmgiCisKK25hbWVzcGFj
ZSBKU0MgeyBuYW1lc3BhY2UgQjMgeworCitjbGFzcyBDb25zdDMyVmFsdWUgOiBwdWJsaWMgVmFs
dWUgeworcHVibGljOgorICAgIHN0YXRpYyBib29sIGFjY2VwdHMoT3Bjb2RlIG9wY29kZSkgeyBy
ZXR1cm4gb3Bjb2RlID09IENvbnN0MzI7IH0KKyAgICAKKyAgICB+Q29uc3QzMlZhbHVlKCk7Cisg
ICAgCisgICAgaW50MzJfdCB2YWx1ZSgpIGNvbnN0IHsgcmV0dXJuIG1fdmFsdWU7IH0KKworcHJv
dGVjdGVkOgorICAgIHZvaWQgZHVtcE1ldGEoUHJpbnRTdHJlYW0mKSBjb25zdCBvdmVycmlkZTsK
KworcHJpdmF0ZToKKyAgICBmcmllbmQgY2xhc3MgUHJvY2VkdXJlOworCisgICAgQ29uc3QzMlZh
bHVlKHVuc2lnbmVkIGluZGV4LCBPcmlnaW4gb3JpZ2luLCBpbnQzMl90IHZhbHVlKQorICAgICAg
ICA6IFZhbHVlKGluZGV4LCBDb25zdDMyLCBJbnQzMiwgb3JpZ2luKQorICAgICAgICAsIG1fdmFs
dWUodmFsdWUpCisgICAgeworICAgIH0KKyAgICAKKyAgICBpbnQzMl90IG1fdmFsdWU7Cit9Owor
Cit9IH0gLy8gbmFtZXNwYWNlIEpTQzo6QjMKKworI2VuZGlmIC8vIEIzQ29uc3QzMlZhbHVlX2gK
KwpJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzQ29uc3Q2NFZhbHVlLmNwcAo9PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNDb25zdDY0VmFsdWUuY3BwCShy
ZXZpc2lvbiAwKQorKysgU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzQ29uc3Q2NFZhbHVlLmNw
cAkod29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDQxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAy
MDE1IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlv
biBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAq
IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcg
Y29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2Ug
Y29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMg
bGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBS
ZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNv
cHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZv
bGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3Ro
ZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElT
IFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAq
IEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRF
RCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBG
SVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBO
TyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZP
UiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFS
WSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBU
TywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1Mg
T0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBI
T1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVS
IElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5F
R0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UK
KyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkg
T0YgU1VDSCBEQU1BR0UuIAorICovCisKKyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJC
M0NvbnN0NjRWYWx1ZS5oIgorCituYW1lc3BhY2UgSlNDIHsgbmFtZXNwYWNlIEIzIHsKKworQ29u
c3Q2NFZhbHVlOjp+Q29uc3Q2NFZhbHVlKCkKK3sKK30KKwordm9pZCBDb25zdDY0VmFsdWU6OmR1
bXBNZXRhKFByaW50U3RyZWFtJiBvdXQpIGNvbnN0Cit7CisgICAgb3V0LnByaW50KG1fdmFsdWUp
OworfQorCit9IH0gLy8gbmFtZXNwYWNlIEpTQzo6QjMKKwpJbmRleDogU291cmNlL0phdmFTY3Jp
cHRDb3JlL2IzL0IzQ29uc3Q2NFZhbHVlLmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL0phdmFTY3Jp
cHRDb3JlL2IzL0IzQ29uc3Q2NFZhbHVlLmgJKHJldmlzaW9uIDApCisrKyBTb3VyY2UvSmF2YVNj
cmlwdENvcmUvYjMvQjNDb25zdDY0VmFsdWUuaAkod29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDU5
IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE1IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNl
cnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5
IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBw
cm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEu
IFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29w
eXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9s
bG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0g
bXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxp
c3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICog
ICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhl
IGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExF
IElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVT
LCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJ
RVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBV
UlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SCisg
KiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURF
TlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJ
TkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRV
VEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsg
T1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9S
WQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZ
LCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5H
IElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYg
QURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisKKyNpZm5k
ZWYgQjNDb25zdDY0VmFsdWVfaAorI2RlZmluZSBCM0NvbnN0NjRWYWx1ZV9oCisKKyNpbmNsdWRl
ICJCM1ZhbHVlLmgiCisKK25hbWVzcGFjZSBKU0MgeyBuYW1lc3BhY2UgQjMgeworCitjbGFzcyBD
b25zdDY0VmFsdWUgOiBwdWJsaWMgVmFsdWUgeworcHVibGljOgorICAgIHN0YXRpYyBib29sIGFj
Y2VwdHMoT3Bjb2RlIG9wY29kZSkgeyByZXR1cm4gb3Bjb2RlID09IENvbnN0NjQ7IH0KKyAgICAK
KyAgICB+Q29uc3Q2NFZhbHVlKCk7CisgICAgCisgICAgaW50NjRfdCB2YWx1ZSgpIGNvbnN0IHsg
cmV0dXJuIG1fdmFsdWU7IH0KKworcHJvdGVjdGVkOgorICAgIHZvaWQgZHVtcE1ldGEoUHJpbnRT
dHJlYW0mKSBjb25zdCBvdmVycmlkZTsKKworcHJpdmF0ZToKKyAgICBmcmllbmQgY2xhc3MgUHJv
Y2VkdXJlOworCisgICAgQ29uc3Q2NFZhbHVlKHVuc2lnbmVkIGluZGV4LCBPcmlnaW4gb3JpZ2lu
LCBpbnQ2NF90IHZhbHVlKQorICAgICAgICA6IFZhbHVlKGluZGV4LCBDb25zdDY0LCBJbnQ2NCwg
b3JpZ2luKQorICAgICAgICAsIG1fdmFsdWUodmFsdWUpCisgICAgeworICAgIH0KKyAgICAKKyAg
ICBpbnQ2NF90IG1fdmFsdWU7Cit9OworCit9IH0gLy8gbmFtZXNwYWNlIEpTQzo6QjMKKworI2Vu
ZGlmIC8vIEIzQ29uc3Q2NFZhbHVlX2gKKwpJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL2Iz
L0IzQ29uc3REb3VibGVWYWx1ZS5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRD
b3JlL2IzL0IzQ29uc3REb3VibGVWYWx1ZS5jcHAJKHJldmlzaW9uIDApCisrKyBTb3VyY2UvSmF2
YVNjcmlwdENvcmUvYjMvQjNDb25zdERvdWJsZVZhbHVlLmNwcAkod29ya2luZyBjb3B5KQpAQCAt
MCwwICsxLDQxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE1IEFwcGxlIEluYy4gQWxsIHJp
Z2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBh
bmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBl
cm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1l
dDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUg
YWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFu
ZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmlu
YXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNl
LCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGlu
IHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVk
IHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVE
IEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBX
QVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVE
IFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VM
QVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJ
TkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVD
VCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBE
QU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9G
IFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICog
UFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04g
QU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1Qg
TElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNF
KSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUs
IEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICov
CisKKyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJCM0NvbnN0RG91YmxlVmFsdWUuaCIK
KworbmFtZXNwYWNlIEpTQyB7IG5hbWVzcGFjZSBCMyB7CisKK0NvbnN0RG91YmxlVmFsdWU6On5D
b25zdERvdWJsZVZhbHVlKCkKK3sKK30KKwordm9pZCBDb25zdERvdWJsZVZhbHVlOjpkdW1wTWV0
YShQcmludFN0cmVhbSYgb3V0KSBjb25zdAoreworICAgIG91dC5wcmludGYoIiVsZSIsIG1fdmFs
dWUpOworfQorCit9IH0gLy8gbmFtZXNwYWNlIEpTQzo6QjMKKwpJbmRleDogU291cmNlL0phdmFT
Y3JpcHRDb3JlL2IzL0IzQ29uc3REb3VibGVWYWx1ZS5oCj09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9K
YXZhU2NyaXB0Q29yZS9iMy9CM0NvbnN0RG91YmxlVmFsdWUuaAkocmV2aXNpb24gMCkKKysrIFNv
dXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM0NvbnN0RG91YmxlVmFsdWUuaAkod29ya2luZyBjb3B5
KQpAQCAtMCwwICsxLDU5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE1IEFwcGxlIEluYy4g
QWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNv
dXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwg
YXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICog
YXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFp
biB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRp
b25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMg
aW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAg
bm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFp
bWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHBy
b3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBS
T1ZJREVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1Q
TElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJ
TVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBB
UlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBB
UFBMRSBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJ
TkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVO
VElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVN
RU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBP
UgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBB
TkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBT
VFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RI
RVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09G
VFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0Uu
IAorICovCisKKyNpZm5kZWYgQjNDb25zdERvdWJsZVZhbHVlX2gKKyNkZWZpbmUgQjNDb25zdERv
dWJsZVZhbHVlX2gKKworI2luY2x1ZGUgIkIzVmFsdWUuaCIKKworbmFtZXNwYWNlIEpTQyB7IG5h
bWVzcGFjZSBCMyB7CisKK2NsYXNzIENvbnN0RG91YmxlVmFsdWUgOiBwdWJsaWMgVmFsdWUgewor
cHVibGljOgorICAgIHN0YXRpYyBib29sIGFjY2VwdHMoT3Bjb2RlIG9wY29kZSkgeyByZXR1cm4g
b3Bjb2RlID09IENvbnN0RG91YmxlOyB9CisgICAgCisgICAgfkNvbnN0RG91YmxlVmFsdWUoKTsK
KyAgICAKKyAgICBkb3VibGUgdmFsdWUoKSBjb25zdCB7IHJldHVybiBtX3ZhbHVlOyB9CisKK3By
b3RlY3RlZDoKKyAgICB2b2lkIGR1bXBNZXRhKFByaW50U3RyZWFtJikgY29uc3Qgb3ZlcnJpZGU7
CisKK3ByaXZhdGU6CisgICAgZnJpZW5kIGNsYXNzIFByb2NlZHVyZTsKKworICAgIENvbnN0RG91
YmxlVmFsdWUodW5zaWduZWQgaW5kZXgsIE9yaWdpbiBvcmlnaW4sIGRvdWJsZSB2YWx1ZSkKKyAg
ICAgICAgOiBWYWx1ZShpbmRleCwgQ29uc3REb3VibGUsIERvdWJsZSwgb3JpZ2luKQorICAgICAg
ICAsIG1fdmFsdWUodmFsdWUpCisgICAgeworICAgIH0KKyAgICAKKyAgICBkb3VibGUgbV92YWx1
ZTsKK307CisKK30gfSAvLyBuYW1lc3BhY2UgSlNDOjpCMworCisjZW5kaWYgLy8gQjNDb25zdERv
dWJsZVZhbHVlX2gKKwpJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzQ29udHJvbFZh
bHVlLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNDb250cm9s
VmFsdWUuY3BwCShyZXZpc2lvbiAwKQorKysgU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzQ29u
dHJvbFZhbHVlLmNwcAkod29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDQzIEBACisvKgorICogQ29w
eXJpZ2h0IChDKSAyMDE1IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBS
ZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9y
IHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRo
ZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9u
cyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBu
b3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWlt
ZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2Ug
dGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9u
cyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlv
biBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4K
KyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycn
IEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJV
VCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRB
QklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NM
QUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMg
QkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwK
KyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBO
T1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VS
VklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5U
RVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklM
SVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAo
SU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VU
IE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUg
UE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisKKyNpbmNsdWRlICJjb25maWcuaCIK
KyNpbmNsdWRlICJCM0NvbnRyb2xWYWx1ZS5oIgorCituYW1lc3BhY2UgSlNDIHsgbmFtZXNwYWNl
IEIzIHsKKworQ29udHJvbFZhbHVlOjp+Q29udHJvbFZhbHVlKCkKK3sKK30KKwordm9pZCBDb250
cm9sVmFsdWU6OmR1bXBNZXRhKFByaW50U3RyZWFtJiBvdXQpIGNvbnN0Cit7CisgICAgQ29tbWFQ
cmludGVyIGNvbW1hOworICAgIGZvciAoQmFzaWNCbG9jayogYmxvY2sgOiBtX3N1Y2Nlc3NvcnMp
CisgICAgICAgIG91dC5wcmludChjb21tYSwgcG9pbnRlckR1bXAoYmxvY2spKTsKK30KKworfSB9
IC8vIG5hbWVzcGFjZSBKU0M6OkIzCisKSW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9C
M0NvbnRyb2xWYWx1ZS5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9C
M0NvbnRyb2xWYWx1ZS5oCShyZXZpc2lvbiAwKQorKysgU291cmNlL0phdmFTY3JpcHRDb3JlL2Iz
L0IzQ29udHJvbFZhbHVlLmgJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSwxMTcgQEAKKy8qCisg
KiBDb3B5cmlnaHQgKEMpIDIwMTUgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoK
KyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdp
dGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRo
YXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmli
dXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAq
ICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlz
Y2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJv
ZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25k
aXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVu
dGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0
aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFT
IElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElO
RywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJD
SEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUg
RElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IKKyAqIENPTlRSSUJV
VE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVD
SUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywg
QlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBP
UiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVT
UyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBM
SUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQK
KyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdB
WSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9G
IFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKworI2lmbmRlZiBCM0NvbnRy
b2xWYWx1ZV9oCisjZGVmaW5lIEIzQ29udHJvbFZhbHVlX2gKKworI2luY2x1ZGUgIkIzVmFsdWUu
aCIKKworbmFtZXNwYWNlIEpTQyB7IG5hbWVzcGFjZSBCMyB7CisKK2NsYXNzIEJhc2ljQmxvY2s7
CisKK2NsYXNzIENvbnRyb2xWYWx1ZSA6IHB1YmxpYyBWYWx1ZSB7CitwdWJsaWM6CisgICAgc3Rh
dGljIGJvb2wgYWNjZXB0cyhPcGNvZGUgb3Bjb2RlKQorICAgIHsKKyAgICAgICAgc3dpdGNoIChv
cGNvZGUpIHsKKyAgICAgICAgY2FzZSBKdW1wOgorICAgICAgICBjYXNlIEJyYW5jaDoKKyAgICAg
ICAgY2FzZSBSZXR1cm46CisgICAgICAgIGNhc2UgT29wczoKKyAgICAgICAgICAgIHJldHVybiB0
cnVlOworICAgICAgICBjYXNlIFN3aXRjaDogCisgICAgICAgICAgICAvLyBUaGlzIGlzIGhlcmUg
YmVjYXVzZSBTd2l0Y2hWYWx1ZSBpcyBhIHN1YmNsYXNzIG9mIENvbnRyb2xWYWx1ZSwgc28gd2Ug
d2FudAorICAgICAgICAgICAgLy8gc3d0aWNoVmFsdWUtPmFzPENvbnRyb2xWYWx1ZT4oKSB0byBy
ZXR1cm4gbm9uLW51bGwuCisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgZGVmYXVs
dDoKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHR5
cGVkZWYgVmVjdG9yPEJhc2ljQmxvY2sqLCAyPiBTdWNjZXNzb3JMaXN0OworCisgICAgfkNvbnRy
b2xWYWx1ZSgpOworCisgICAgdW5zaWduZWQgbnVtU3VjY2Vzc29ycygpIGNvbnN0IHsgcmV0dXJu
IG1fc3VjY2Vzc29ycy5zaXplKCk7IH0KKyAgICBCYXNpY0Jsb2NrKiBzdWNjZXNzb3IodW5zaWdu
ZWQgaW5kZXgpIGNvbnN0IHsgcmV0dXJuIG1fc3VjY2Vzc29yc1tpXTsgfQorICAgIEJhc2ljQmxv
Y2sqJiBzdWNjZXNzb3IodW5zaWduZWQgaW5kZXgpIHsgcmV0dXJuIG1fc3VjY2Vzc29yc1tpXTsg
fQorCisgICAgY29uc3QgU3VjY2Vzc29yTGlzdCYgc3VjY2Vzc29ycygpIGNvbnN0IHsgcmV0dXJu
IG1fc3VjY2Vzc29yczsgfQorCitwcm90ZWN0ZWQ6CisgICAgdm9pZCBkdW1wTWV0YShQcmludFN0
cmVhbSYpIGNvbnN0IG92ZXJyaWRlOworCisgICAgLy8gVXNlIHRoaXMgZm9yIHN1YmNsYXNzZXMu
CisgICAgdGVtcGxhdGU8dHlwZW5hbWUuLi4gQXJndW1lbnRzPgorICAgIENvbnRyb2xWYWx1ZSh1
bnNpZ25lZCBpbmRleCwgT3Bjb2RlIG9wY29kZSwgVHlwZSB0eXBlLCBPcmlnaW4gb3JpZ2luLCBB
cmd1bWVudHMuLi4gYXJndW1lbnRzKQorICAgICAgICA6IFZhbHVlKGluZGV4LCBvcGNvZGUsIHR5
cGUsIG9yaWdpbiwgYXJndW1lbnRzLi4uKQorICAgIHsKKyAgICB9CisKKyAgICAvLyBTdWJjbGFz
c2VzIHdpbGwgcG9wdWxhdGUgdGhpcy4KKyAgICBTdWNjZXNzb3JMaXN0IG1fc3VjY2Vzc29yczsK
KworcHJpdmF0ZToKKyAgICBmcmllbmQgY2xhc3MgUHJvY2VkdXJlOworCisgICAgLy8gVXNlIHRo
aXMgZm9yIE9vcHMuCisgICAgQ29udHJvbFZhbHVlKHVuc2lnbmVkIGluZGV4LCBPcGNvZGUgb3Bj
b2RlLCBPcmlnaW4gb3JpZ2luKQorICAgICAgICA6IFZhbHVlKGluZGV4LCBvcGNvZGUsIFZvaWQs
IG9yaWdpbikKKyAgICB7CisgICAgICAgIEFTU0VSVChvcGNvZGUgPT0gT29wcyk7CisgICAgfQor
CisgICAgLy8gVXNlIHRoaXMgZm9yIFJldHVybi4KKyAgICBDb250cm9sVmFsdWUodW5zaWduZWQg
aW5kZXgsIE9wY29kZSBvcGNvZGUsIE9yaWdpbiBvcmlnaW4sIFZhbHVlKiByZXN1bHQpCisgICAg
ICAgIDogVmFsdWUoaW5kZXgsIG9wY29kZSwgVm9pZCwgb3JpZ2luLCByZXN1bHQpCisgICAgewor
ICAgICAgICBBU1NFUlQob3Bjb2RlID09IFJldHVybik7CisgICAgfQorCisgICAgLy8gVXNlIHRo
aXMgZm9yIEp1bXAuCisgICAgQ29udHJvbFZhbHVlKHVuc2lnbmVkIGluZGV4LCBPcGNvZGUgb3Bj
b2RlLCBPcmlnaW4gb3JpZ2luLCBCYXNpY0Jsb2NrKiB0YXJnZXQpCisgICAgICAgIDogVmFsdWUo
aW5kZXgsIG9wY29kZSwgVm9pZCwgb3JpZ2luKQorICAgIHsKKyAgICAgICAgQVNTRVJUKG9wY29k
ZSA9PSBKdW1wKTsKKyAgICAgICAgbV9zdWNjZXNzb3JzLmFwcGVuZCh0YXJnZXQpOworICAgIH0K
KworICAgIC8vIFVzZSB0aGlzIGZvciBCcmFuY2guCisgICAgQ29udHJvbFZhbHVlKAorICAgICAg
ICB1bnNpZ25lZCBpbmRleCwgT3Bjb2RlIG9wY29kZSwgT3JpZ2luIG9yaWdpbiwgVmFsdWUqIHBy
ZWRpY2F0ZSwKKyAgICAgICAgQmFzaWNCbG9jayogeWVzLCBCYXNpY0Jsb2NrKiBubykKKyAgICAg
ICAgOiBWYWx1ZShpbmRleCwgb3Bjb2RlLCBWb2lkLCBvcmlnaW4sIHByZWRpY2F0ZSkKKyAgICB7
CisgICAgICAgIEFTU0VSVChvcGNvZGUgPT0gQnJhbmNoKTsKKyAgICAgICAgbV9zdWNjZXNzb3Jz
LmFwcGVuZCh5ZXMpOworICAgICAgICBtX3N1Y2Nlc3NvcnMuYXBwZW5kKG5vKTsKKyAgICB9Cit9
OworCit9IH0gLy8gbmFtZXNwYWNlIEpTQzo6QjMKKworI2VuZGlmIC8vIEIzQ29udHJvbFZhbHVl
X2gKKwpJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzSW5kZXhTZXQuaAo9PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNJbmRleFNldC5oCShyZXZpc2lvbiAw
KQorKysgU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzSW5kZXhTZXQuaAkod29ya2luZyBjb3B5
KQpAQCAtMCwwICsxLDE0MSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNSBBcHBsZSBJbmMu
IEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBz
b3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24s
IGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAq
IGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRh
aW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0
aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25z
IGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAg
IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xh
aW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBw
cm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQ
Uk9WSURFRCBCWSBBUFBMRSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElN
UExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICog
SU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQ
QVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwg
QVBQTEUgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwg
SU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVF
TlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJF
TUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwg
T1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQg
QU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwg
U1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9U
SEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNP
RlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdF
LiAKKyAqLworCisjaWZuZGVmIEIzSW5kZXhTZXRfaAorI2RlZmluZSBCM0luZGV4U2V0X2gKKwor
I2luY2x1ZGUgPHd0Zi9CaXRWZWN0b3IuaD4KKyNpbmNsdWRlIDx3dGYvQ29tbWFQcmludGVyLmg+
CisKK25hbWVzcGFjZSBKU0MgeyBuYW1lc3BhY2UgQjMgeworCisvLyBUaGlzIGlzIGEgc2V0IGZv
ciB0aGluZ3MgdGhhdCBoYXZlIGFuIGluZGV4KCkuIEl0J3Mgc3VwZXIgZWZmaWNpZW50IGZvciBC
YXNpY0Jsb2Nrcy4gSXQncyBvbmx5CisvLyBlZmZpY2llbnQgZm9yIFZhbHVlcyBpZiB5b3UgZG9u
J3QgY3JlYXRlIHRvbyBtYW55IG9mIHRoZXNlIHNldHMsIHNpbmNlIFZhbHVlcyBjYW4gaGF2ZSB2
ZXJ5IHNwYXJzZQorLy8gaW5kaWNlcyBhbmQgdGhlcmUgYXJlIGEgbG90IG9mIFZhbHVlcy4KKwor
Ly8gSWYgeW91IHdhbnQgYSBzZXQgb2YgQmFzaWNCbG9ja3MsIHlvdSBkbyBJbmRleFNldDxCYXNp
Y0Jsb2NrPi4gU28sIFQgPSBCYXNpY0Jsb2NrLgordGVtcGxhdGU8dHlwZW5hbWUgVD4KK2NsYXNz
IEluZGV4U2V0IHsKK3B1YmxpYzoKKyAgICBJbmRleFNldCgpCisgICAgeworICAgIH0KKworICAg
IGJvb2wgYWRkKFQqIHZhbHVlKQorICAgIHsKKyAgICAgICAgcmV0dXJuICFtX3NldC5zZXQodmFs
dWUtPmluZGV4KCkpOworICAgIH0KKworICAgIGJvb2wgY29udGFpbnMoVCogdmFsdWUpIGNvbnN0
CisgICAgeworICAgICAgICBpZiAoIXZhbHVlKQorICAgICAgICAgICAgcmV0dXJuIG51bGxwdHI7
CisgICAgICAgIHJldHVybiBtX3NldC5nZXQodmFsdWUtPmluZGV4KCkpOworICAgIH0KKworICAg
IHRlbXBsYXRlPHR5cGVuYW1lIENvbGxlY3Rpb25UeXBlPgorICAgIGNsYXNzIEl0ZXJhYmxlIHsK
KyAgICBwdWJsaWM6CisgICAgICAgIEl0ZXJhYmxlKGNvbnN0IENvbGxlY3Rpb25UeXBlJiBjb2xs
ZWN0aW9uLCBjb25zdCBJbmRleFNldCYgc2V0KQorICAgICAgICAgICAgOiBtX2NvbGxlY3Rpb24o
Y29sbGVjdGlvbikKKyAgICAgICAgICAgICwgbV9zZXQoc2V0KQorICAgICAgICB7CisgICAgICAg
IH0KKworICAgICAgICBjbGFzcyBpdGVyYXRvciB7CisgICAgICAgIHB1YmxpYzoKKyAgICAgICAg
ICAgIGl0ZXJhdG9yKCkKKyAgICAgICAgICAgICAgICA6IG1fY29sbGVjdGlvbihudWxscHRyKQor
ICAgICAgICAgICAgeworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpdGVyYXRvcihjb25z
dCBDb2xsZWN0aW9uVHlwZSYgY29sbGVjdGlvbiwgQml0VmVjdG9yOjpTZXRCaXRzSXRlcmFibGU6
Oml0ZXJhdG9yIGl0ZXIpCisgICAgICAgICAgICAgICAgOiBtX2NvbGxlY3Rpb24oJmNvbGxlY3Rp
b24pCisgICAgICAgICAgICAgICAgLCBtX2l0ZXIoaXRlcikKKyAgICAgICAgICAgIHsKKyAgICAg
ICAgICAgIH0KKworICAgICAgICAgICAgVCogb3BlcmF0b3IqKCkKKyAgICAgICAgICAgIHsKKyAg
ICAgICAgICAgICAgICByZXR1cm4gbV9jb2xsZWN0aW9uLT5hdCgqbV9pdGVyKTsKKyAgICAgICAg
ICAgIH0KKworICAgICAgICAgICAgaXRlcmF0b3ImIG9wZXJhdG9yKysoKQorICAgICAgICAgICAg
eworICAgICAgICAgICAgICAgIG1faXRlcisrOworICAgICAgICAgICAgICAgIHJldHVybiAqdGhp
czsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgYm9vbCBvcGVyYXRvcj09KGNvbnN0IGl0
ZXJhdG9yJiBvdGhlcikgY29uc3QKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1
cm4gbV9pdGVyID09IG90aGVyLm1faXRlcjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAg
Ym9vbCBvcGVyYXRvciE9KGNvbnN0IGl0ZXJhdG9yJiBvdGhlcikgY29uc3QKKyAgICAgICAgICAg
IHsKKyAgICAgICAgICAgICAgICByZXR1cm4gISgqdGhpcyA9PSBvdGhlcik7CisgICAgICAgICAg
ICB9CisKKyAgICAgICAgcHJpdmF0ZToKKyAgICAgICAgICAgIGNvbnN0IENvbGxlY3Rpb25UeXBl
KiBtX2NvbGxlY3Rpb247CisgICAgICAgICAgICBCaXRWZWN0b3I6OlNldEJpdHNJdGVyYWJsZTo6
aXRlcmF0b3IgbV9pdGVyOworICAgICAgICB9OworCisgICAgICAgIGl0ZXJhdG9yIGJlZ2luKCkg
Y29uc3QgeyByZXR1cm4gaXRlcmF0b3IobV9jb2xsZWN0aW9uLCBtX3NldC5iZWdpbigpKTsgfQor
ICAgICAgICBpdGVyYXRvciBlbmQoKSBjb25zdCB7IHJldHVybiBpdGVyYXRvcihtX2NvbGxlY3Rp
b24sIG1fc2V0LmVuZCgpKTsgfQorCisgICAgcHJpdmF0ZToKKyAgICAgICAgY29uc3QgQ29sbGVj
dGlvblR5cGUmIG1fY29sbGVjdGlvbjsKKyAgICAgICAgY29uc3QgSW5kZXhTZXQmIG1fc2V0Owor
ICAgIH07CisKKyAgICAvLyBGb3IgYmFzaWMgYmxvY2tzLCB5b3UgZG86CisgICAgLy8gaW5kZXhT
ZXQudmFsdWVzKHByb2NlZHVyZSk7CisgICAgLy8KKyAgICAvLyBGb3IgdmFsdWVzLCB5b3UgZG86
CisgICAgLy8gaW5kZXhTZXQudmFsdWVzKHByb2NlZHVyZS52YWx1ZXMoKSk7CisgICAgdGVtcGxh
dGU8dHlwZW5hbWUgQ29sbGVjdGlvblR5cGU+CisgICAgSXRlcmFibGU8Q29sbGVjdGlvblR5cGU+
IHZhbHVlcyhjb25zdCBDb2xsZWN0aW9uVHlwZSYgY29sbGVjdGlvbikgY29uc3QKKyAgICB7Cisg
ICAgICAgIHJldHVybiBJdGVyYWJsZTxDb2xsZWN0aW9uVHlwZT4oY29sbGVjdGlvbik7CisgICAg
fQorCisgICAgY29uc3QgQml0VmVjdG9yJiBpbmRpY2VzKCkgY29uc3QgeyByZXR1cm4gbV9zZXQ7
IH0KKworICAgIHZvaWQgZHVtcChQcmludFN0cmVhbSYgb3V0KSBjb25zdAorICAgIHsKKyAgICAg
ICAgQ29tbWFQcmludGVyIGNvbW1hOworICAgICAgICBmb3IgKHNpemVfdCBpbmRleCA6IGluZGlj
ZXMoKS5zZXRCaXRzKCkpCisgICAgICAgICAgICBvdXQucHJpbnQoY29tbWEsIFQ6OmR1bXBQcmVm
aXgsIGluZGV4KTsKKyAgICB9CisKK3ByaXZhdGU6CisgICAgQml0VmVjdG9yIG1fc2V0OworfTsK
KworfSB9IC8vIG5hbWVzcGFjZSBKU0M6OkIzCisKKyNlbmRpZiAvLyBCM0luZGV4U2V0X2gKKwpJ
bmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzTG93ZXJpbmdNYXRjaGVyLnBhdHRlcm5z
Cj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM0xvd2VyaW5nTWF0Y2hl
ci5wYXR0ZXJucwkocmV2aXNpb24gMCkKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM0xv
d2VyaW5nTWF0Y2hlci5wYXR0ZXJucwkod29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDQxIEBACisj
IENvcHlyaWdodCAoQykgMjAxNSBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisjCisj
IFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGgg
b3Igd2l0aG91dAorIyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0
aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyMgYXJlIG1ldDoKKyMgMS4gUmVkaXN0cmlidXRpb25z
IG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyMgICAgbm90
aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVy
LgorIyAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhl
IGFib3ZlIGNvcHlyaWdodAorIyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFu
ZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisjICAgIGRvY3VtZW50YXRpb24gYW5k
L29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisjCisj
IFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBBTkQgSVRTIENPTlRSSUJV
VE9SUyBgYEFTIElTJycKKyMgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywg
SU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisjIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMg
T0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyMgUFVSUE9T
RSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUiBJVFMgQ09O
VFJJQlVUT1JTCisjIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5U
QUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKKyMgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNM
VURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKKyMgU1VCU1RJVFVURSBH
T09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lO
RVNTCisjIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0Yg
TElBQklMSVRZLCBXSEVUSEVSIElOCisjIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBU
T1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisjIEFSSVNJTkcgSU4gQU5Z
IFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YK
KyMgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCittYXRjaGVyIExvd2VyaW5nTWF0
Y2hlcgorCisjIFRoZXNlIHJ1bGVzIGFyZSBjb25zaWRlcmVkIGluIGEgY2FzY2FkZSwgc3RhcnRp
bmcgYXQgdGhlIHRvcC4gSXQncyBpbXBsZW5lbnRlZCB1c2luZyBzd2l0Y2gKKyMgc3RhdGVtZW50
cyB3aGVyZXZlciBwb3NzaWJsZS4KKworIyBOb3RlOiBhZGRpbmcgbW9yZSBydWxlcyB0byB0aGlz
IG1hdGNoZXIgaXMgYW4gZXhjZWxsZW50IHdheSBvZiBpbXByb3ZpbmcgcGVyZm9ybWFuY2UhCisK
K0xvYWQgPSBMb2FkKGFkZHJlc3MpCisKK0FkZExvYWQgPSBBZGQoTG9hZChhZGRyZXNzKSwgdmFs
dWUpCitBZGQgPSBBZGQobGVmdCwgcmlnaHQpCisKK1N0b3JlQWRkTG9hZCA9IFN0b3JlKEFkZChM
b2FkKGFkZHJlc3MpLCB2YWx1ZSksIGFkZHJlc3MpCitTdG9yZUFuZExvYWQgPSBTdG9yZShBbmQo
TG9hZChhZGRyZXNzKSwgdmFsdWUpLCBhZGRyZXNzKQorU3RvcmUgPSBTdG9yZSh2YWx1ZSwgYWRk
cmVzcykKKworUmV0dXJuID0gUmV0dXJuKHZhbHVlKQorCkluZGV4OiBTb3VyY2UvSmF2YVNjcmlw
dENvcmUvYjMvQjNNZW1vcnlWYWx1ZS5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL0phdmFTY3Jp
cHRDb3JlL2IzL0IzTWVtb3J5VmFsdWUuY3BwCShyZXZpc2lvbiAwKQorKysgU291cmNlL0phdmFT
Y3JpcHRDb3JlL2IzL0IzTWVtb3J5VmFsdWUuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEs
NDIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTUgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJl
c2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5h
cnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVk
IHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICog
MS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBj
b3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBm
b2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9y
bSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMg
bGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisg
KiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0
aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQ
TEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJ
RVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFO
VElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICog
UFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IK
KyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJ
REVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMg
KElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJ
VFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRT
OyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhF
T1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJ
VFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJ
TkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJ
RiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKworI2lu
Y2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgIkIzTWVtb3J5VmFsdWUuaCIKKworbmFtZXNwYWNl
IEpTQyB7IG5hbWVzcGFjZSBCMyB7CisKK01lbW9yeVZhbHVlOjp+TWVtb3J5VmFsdWUoKQorewor
fQorCit2b2lkIE1lbW9yeVZhbHVlOjpkdW1wTWV0YShQcmludFN0cmVhbSYgb3V0KSBjb25zdAor
eworICAgIGlmIChtX29mZnNldCkKKyAgICAgICAgb3V0LnByaW50KCJvZmZzZXQgPSAiLCBtX29m
ZnNldCk7Cit9CisKK30gfSAvLyBuYW1lc3BhY2UgSlNDOjpCMworCkluZGV4OiBTb3VyY2UvSmF2
YVNjcmlwdENvcmUvYjMvQjNNZW1vcnlWYWx1ZS5oCj09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZh
U2NyaXB0Q29yZS9iMy9CM01lbW9yeVZhbHVlLmgJKHJldmlzaW9uIDApCisrKyBTb3VyY2UvSmF2
YVNjcmlwdENvcmUvYjMvQjNNZW1vcnlWYWx1ZS5oCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEs
MTQyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE1IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyBy
ZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmlu
YXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRl
ZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAq
IDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUg
Y29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUg
Zm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZv
cm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlz
IGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQor
ICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGgg
dGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQ
UExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5U
SUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJB
TlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAq
IFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9S
CisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5D
SURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VT
IChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNU
SVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklU
UzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRI
RU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklM
SVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklT
SU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4g
SUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisKKyNp
Zm5kZWYgQjNNZW1vcnlWYWx1ZV9oCisjZGVmaW5lIEIzTWVtb3J5VmFsdWVfaAorCisjaW5jbHVk
ZSAiQjNWYWx1ZS5oIgorCituYW1lc3BhY2UgSlNDIHsgbmFtZXNwYWNlIEIzIHsKKworY2xhc3Mg
TWVtb3J5VmFsdWUgOiBwdWJsaWMgVmFsdWUgeworcHVibGljOgorICAgIHN0YXRpYyBib29sIGFj
Y2VwdHMoT3Bjb2RlIG9wY29kZSkKKyAgICB7CisgICAgICAgIHN3aXRjaCAob3Bjb2RlKSB7Cisg
ICAgICAgIGNhc2UgTG9hZDhaOgorICAgICAgICBjYXNlIExvYWQ4UzoKKyAgICAgICAgY2FzZSBM
b2FkMTZaOgorICAgICAgICBjYXNlIExvYWQxNlM6CisgICAgICAgIGNhc2UgTG9hZEZsb2F0Ogor
ICAgICAgICBjYXNlIExvYWQ6CisgICAgICAgIGNhc2UgU3RvcmU4OgorICAgICAgICBjYXNlIFN0
b3JlMTY6CisgICAgICAgIGNhc2UgU3RvcmVGbG9hdDoKKyAgICAgICAgY2FzZSBTdG9yZToKKyAg
ICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0
dXJuIGZhbHNlOworICAgICAgICB9CisgICAgfQorCisgICAgfk1lbW9yeVZhbHVlKCk7CisKKyAg
ICBpbnRwdHJfdCBvZmZzZXQoKSBjb25zdCB7IHJldHVybiBtX29mZnNldDsgfQorCitwcm90ZWN0
ZWQ6CisgICAgdm9pZCBkdW1wTWV0YShQcmludFN0cmVhbSYpIGNvbnN0IG92ZXJyaWRlOworCitw
cml2YXRlOgorICAgIGZyaWVuZCBjbGFzcyBQcm9jZWR1cmU7CisKKyAgICAvLyBVc2UgdGhpcyBm
b3JtIGZvciBMb2FkIChidXQgbm90IExvYWQ4WiwgTG9hZDhTLCBvciBhbnkgb2YgdGhlIExvYWRz
IHRoYXQgaGF2ZSBhIHN1ZmZpeCB0aGF0CisgICAgLy8gZGVzY3JpYmVzIHRoZSByZXR1cm5lZCB0
eXBlKS4KKyAgICBNZW1vcnlWYWx1ZSgKKyAgICAgICAgdW5zaWduZWQgaW5kZXgsIE9wY29kZSBv
cGNvZGUsIFR5cGUgdHlwZSwgT3JpZ2luIG9yaWdpbiwgVmFsdWUqIHBvaW50ZXIsCisgICAgICAg
IGludHB0cl90IG9mZnNldCA9IDApCisgICAgICAgIDogVmFsdWUoaW5kZXgsIG9wY29kZSwgdHlw
ZSwgb3JpZ2luLCBwb2ludGVyKQorICAgICAgICAsIG1fb2Zmc2V0KG9mZnNldCkKKyAgICB7Cisg
ICAgICAgIGlmICghQVNTRVJUX0RJU0FCTEVEKSB7CisgICAgICAgICAgICBzd2l0Y2ggKG9wY29k
ZSkgeworICAgICAgICAgICAgY2FzZSBMb2FkOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAg
ICAgICAgICAgY2FzZSBMb2FkOFo6CisgICAgICAgICAgICBjYXNlIExvYWQ4UzoKKyAgICAgICAg
ICAgIGNhc2UgTG9hZDE2WjoKKyAgICAgICAgICAgIGNhc2UgTG9hZDE2UzoKKyAgICAgICAgICAg
ICAgICBBU1NFUlQodHlwZSA9PSBJbnQzMik7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAg
ICAgICAgICBjYXNlIExvYWRGbG9hdDoKKyAgICAgICAgICAgICAgICBBU1NFUlQodHlwZSA9PSBE
b3VibGUpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBTdG9yZTg6
CisgICAgICAgICAgICBjYXNlIFN0b3JlMTY6CisgICAgICAgICAgICBjYXNlIFN0b3JlRmxvYXQ6
CisgICAgICAgICAgICBjYXNlIFN0b3JlOgorICAgICAgICAgICAgICAgIEFTU0VSVCh0eXBlID09
IFZvaWQpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAg
ICAgICAgICAgICAgICBBU1NFUlRfTk9UX1JFQUNIRUQoKTsKKyAgICAgICAgICAgIH0KKyAgICAg
ICAgfQorICAgIH0KKworICAgIC8vIFVzZSB0aGlzIGZvcm0gZm9yIGxvYWRzIHdoZXJlIHRoZSBy
ZXR1cm4gdHlwZSBpcyBpbXBsaWVkLgorICAgIE1lbW9yeVZhbHVlKHVuc2lnbmVkIGluZGV4LCBP
cGNvZGUgb3Bjb2RlLCBPcmlnaW4gb3JpZ2luLCBWYWx1ZSogcG9pbnRlciwgaW50cHRyX3Qgb2Zm
c2V0ID0gMCkKKyAgICAgICAgOiBWYWx1ZShpbmRleCwgb3Bjb2RlLCBvcGNvZGUgPT0gTG9hZEZs
b2F0ID8gRG91YmxlIDogSW50MzIsIG9yaWdpbiwgcG9pbnRlcikKKyAgICAgICAgLCBtX29mZnNl
dChvZmZzZXQpCisgICAgeworICAgICAgICBpZiAoIUFTU0VSVF9ESVNBQkxFRCkgeworICAgICAg
ICAgICAgc3dpdGNoIChvcGNvZGUpIHsKKyAgICAgICAgICAgIGNhc2UgTG9hZDhaOgorICAgICAg
ICAgICAgY2FzZSBMb2FkOFM6CisgICAgICAgICAgICBjYXNlIExvYWQxNlo6CisgICAgICAgICAg
ICBjYXNlIExvYWQxNlM6CisgICAgICAgICAgICBjYXNlIExvYWRGbG9hdDoKKyAgICAgICAgICAg
ICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgQVNTRVJU
X05PVF9SRUFDSEVEKCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9Cisg
ICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBVc2UgdGhpcyBmb3JtIGZvciBzdG9yZXMuCisgICAg
TWVtb3J5VmFsdWUoCisgICAgICAgIHVuc2lnbmVkIGluZGV4LCBPcGNvZGUgb3Bjb2RlLCBPcmln
aW4gb3JpZ2luLCBWYWx1ZSogdmFsdWUsIFZhbHVlKiBwb2ludGVyLAorICAgICAgICBpbnRwdHJf
dCBvZmZzZXQgPSAwKQorICAgICAgICA6IFZhbHVlKGluZGV4LCBvcGNvZGUsIFZvaWQsIG9yaWdp
biwgdmFsdWUsIHBvaW50ZXIpCisgICAgICAgICwgbV9vZmZzZXQob2Zmc2V0KQorICAgIHsKKyAg
ICAgICAgaWYgKCFBU1NFUlRfRElTQUJMRUQpIHsKKyAgICAgICAgICAgIHN3aXRjaCAob3Bjb2Rl
KSB7CisgICAgICAgICAgICBjYXNlIFN0b3JlODoKKyAgICAgICAgICAgIGNhc2UgU3RvcmUxNjoK
KyAgICAgICAgICAgIGNhc2UgU3RvcmVGbG9hdDoKKyAgICAgICAgICAgIGNhc2UgU3RvcmU6Cisg
ICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAg
ICAgIEFTU0VSVF9OT1RfUkVBQ0hFRCgpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAg
ICAgICAgfQorICAgICAgICB9CisgICAgfQorfTsKKworfSB9IC8vIG5hbWVzcGFjZSBKU0M6OkIz
CisKKyNlbmRpZiAvLyBCM01lbW9yeVZhbHVlX2gKKwpJbmRleDogU291cmNlL0phdmFTY3JpcHRD
b3JlL2IzL0IzT3Bjb2RlLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUv
YjMvQjNPcGNvZGUuY3BwCShyZXZpc2lvbiAwKQorKysgU291cmNlL0phdmFTY3JpcHRDb3JlL2Iz
L0IzT3Bjb2RlLmNwcAkod29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDQ3IEBACisvKgorICogQ29w
eXJpZ2h0IChDKSAyMDE1IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBS
ZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9y
IHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRo
ZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9u
cyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBu
b3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWlt
ZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2Ug
dGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9u
cyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlv
biBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4K
KyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycn
IEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJV
VCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRB
QklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NM
QUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMg
QkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwK
KyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBO
T1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VS
VklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5U
RVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklM
SVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAo
SU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VU
IE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUg
UE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisKKyNpbmNsdWRlICJjb25maWcuaCIK
KyNpbmNsdWRlICJCM09wY29kZS5oIgorCisjaW5jbHVkZSA8d3RmL1ByaW50U3RyZWFtLmg+CisK
K25hbWVzcGFjZSBXVEYgeworCit1c2luZyBuYW1lc3BhY2UgSlNDOjpCMzsKKwordm9pZCBwcmlu
dEludGVybmFsKFByaW50U3RyZWFtJiBvdXQsIE9wY29kZSBvcGNvZGUpCit7CisgICAgc3dpdGNo
IChvcGNvZGUpIHsKKyAgICBjYXNlIElkZW50aXR5OgorICAgICAgICBvdXQucHJpbnQoIklkZW50
aXR5Iik7CisgICAgICAgIHJldHVybjsKKyAgICAgICAgLy8gRklYTUUKKyAgICB9CisgICAgUkVM
RUFTRV9BU1NFUlRfTk9UX1JFQUNIRUQoKTsKK30KKworfSAvLyBuYW1lc3BhY2UgV1RGCisKSW5k
ZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM09wY29kZS5oCj09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNv
dXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM09wY29kZS5oCShyZXZpc2lvbiAwKQorKysgU291cmNl
L0phdmFTY3JpcHRDb3JlL2IzL0IzT3Bjb2RlLmgJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSwy
MDMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTUgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJl
c2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5h
cnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVk
IHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICog
MS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBj
b3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBm
b2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9y
bSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMg
bGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisg
KiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0
aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQ
TEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJ
RVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFO
VElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICog
UFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IK
KyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJ
REVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMg
KElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJ
VFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRT
OyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhF
T1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJ
VFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJ
TkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJ
RiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKworI2lm
bmRlZiBCM09wY29kZV9oCisjZGVmaW5lIEIzT3Bjb2RlX2gKKworI2luY2x1ZGUgPHd0Zi9TdGRM
aWJFeHRyYXMuaD4KKworbmFtZXNwYWNlIEpTQyB7IG5hbWVzcGFjZSBCMyB7CisKK2VudW0gT3Bj
b2RlIDogaW50MTZfdCB7CisgICAgLy8gQSBuby1vcCB0aGF0IHJldHVybnMgVm9pZCwgdXNlZnVs
IGZvciB3aGVuIHlvdSB3YW50IHRvIHJlbW92ZSBhIHZhbHVlLgorICAgIE5vcCwKKyAgICAgCisg
ICAgLy8gUG9seW1vcnBoaWMgaWRlbnRpdHksIHVzYWJsZSB3aXRoIGFueSB2YWx1ZSB0eXBlLgor
ICAgIElkZW50aXR5LAorCisgICAgLy8gQ29uc3RhbnRzLiBVc2UgdGhlIENvbnN0VmFsdWUqIGNs
YXNzZXMuIENvbnN0YW50cyBleGlzdCBpbiB0aGUgY29udHJvbCBmbG93LCBzbyB0aGF0IHdlIGNh
bgorICAgIC8vIHJlYXNvbiBhYm91dCB3aGVyZSB3ZSB3b3VsZCBjb25zdHJ1Y3QgdGhlbS4gTGFy
Z2UgY29uc3RhbnRzIGFyZSBleHBlbnNpdmUgdG8gY3JlYXRlLgorICAgIENvbnN0MzIsCisgICAg
Q29uc3Q2NCwKKyAgICBDb25zdERvdWJsZSwKKworICAgIC8vIFRoZSBtYWdpY2FsIHN0YWNrIHNs
b3QuIFRoaXMgaXMgdmlld2VkIGFzIGV4ZWN1dGluZyBhdCB0aGUgdG9wIG9mIHRoZSBwcm9ncmFt
IHJlZ2FyZGxlc3Mgb2YKKyAgICAvLyB3aGVyZSBpbiBjb250cm9sIGZsb3cgeW91IHB1dCBpdC4g
RWFjaCBpbnN0YW5jZSBvZiBhIFN0YWNrU2xvdCBWYWx1ZSBnZXRzIGEgZGlzam9pbnQgcmFuZ2Ug
b2YKKyAgICAvLyBzdGFjayBtZW1vcnkuIFVzZSB0aGUgU3RhY2tTbG90VmFsdWUgY2xhc3MuCisg
ICAgU3RhY2tTbG90LAorCisgICAgLy8gVGhlIG1hZ2ljYWwgYXJndW1lbnQgcmVnaXN0ZXIuIFRo
aXMgaXMgdmlld2VkIGFzIGV4ZWN1dGluZyBhdCB0aGUgdG9wIG9mIHRoZSBwcm9ncmFtCisgICAg
Ly8gcmVnYXJkbGVzcyBvZiB3aGVyZSBpbiBjb250cm9sIGZsb3cgeW91IHB1dCBpdCwgYW5kIHRo
ZSBjb21waWxlciB0YWtlcyBjYXJlIHRvIGVuc3VyZSB0aGF0IHdlCisgICAgLy8gZG9uJ3QgY2xv
YmJlciB0aGUgdmFsdWUgYnkgcmVnaXN0ZXIgYWxsb2NhdGlvbiBvciBjYWxscyAoZWl0aGVyIGJ5
IHNhdmluZyB0aGUgYXJndW1lbnQgdG8gdGhlCisgICAgLy8gc3RhY2sgb3IgcHJlc2VydmluZyBp
dCBpbiBhIGNhbGxlZS1zYXZlIHJlZ2lzdGVyKS4gVXNlIHRoZSBBcmd1bWVudFJlZ1ZhbHVlIGNs
YXNzLiBUaGUgcmV0dXJuCisgICAgLy8gdHlwZSBpcyBlaXRoZXIgcG9pbnRlcigpIChmb3IgR1BS
cykgb3IgRG91YmxlIChmb3IgRlBScykuCisgICAgQXJndW1lbnRSZWcsCisKKyAgICAvLyBUaGUg
ZnJhbWUgcG9pbnRlci4gWW91IGNhbiBwdXQgdGhpcyBhbnl3aGVyZSBpbiBjb250cm9sIGZsb3cg
YnV0IGl0IHdpbGwgYWx3YXlzIHlpZWxkIHRoZQorICAgIC8vIGZyYW1lIHBvaW50ZXIsIHdpdGgg
YSBjYXZlYXQ6IGlmIG91ciBjb21waWxlciBjaGFuZ2VzIHRoZSBmcmFtZSBwb2ludGVyIHRlbXBv
cmFyaWx5IGZvciBzb21lCisgICAgLy8gc2lsbHkgcmVhc29uLCB0aGUgRnJhbWVQb2ludGVyIGlu
dHJpbnNpYyB3aWxsIHJldHVybiB3aGVyZSB0aGUgZnJhbWUgcG9pbnRlciAqc2hvdWxkKiBiZSBu
b3QKKyAgICAvLyB3aGVyZSBpdCBoYXBwZW5zIHRvIGJlIHJpZ2h0IG5vdy4KKyAgICBGcmFtZVBv
aW50ZXIsCisKKyAgICAvLyBQb2x5bW9ycGhpYyBtYXRoLCB1c2FibGUgd2l0aCBhbnkgdmFsdWUg
dHlwZS4KKyAgICBBZGQsCisgICAgU3ViLAorICAgIE11bCwKKyAgICBEaXYsCisKKyAgICAvLyBJ
bnRlZ2VyIG1hdGguCisgICAgQ2hpbGxEaXYsIC8vIGRvZXNuJ3QgdHJhcCBldmVyLCBiZWhhdmVz
IGxpa2UgSlMgKHgveSl8MC4KKyAgICBNb2QsCisgICAgQml0QW5kLAorICAgIEJpdE9yLAorICAg
IEJpdFhvciwKKyAgICBTaGwsCisgICAgU1NociwKKyAgICBaU2hyLAorCisgICAgLy8gQ2FzdHMg
YW5kIHN1Y2guCisgICAgLy8gVGFrZXMgYW5kIHJldHVybnMgSW50MzI6CisgICAgU0V4dDgsCisg
ICAgU0V4dDE2LAorICAgIC8vIFRha2VzIEludDMyIGFuZCByZXR1cm5zIEludDY0OgorICAgIFNF
eHQzMiwKKyAgICBaRXh0MzIsCisgICAgLy8gVGFrZXMgYW5kIHJldHVybnMgRG91YmxlOgorICAg
IEZSb3VuZCwKKyAgICAvLyBUYWtlcyBpbnRzIGFuZCByZXR1cm5zIERvdWJsZToKKyAgICBJVG9E
LAorICAgIC8vIFRha2VzIERvdWJsZSBhbmQgcmV0dXJucyBJbnQzMjoKKyAgICBEVG9JMzIsCisK
KyAgICAvLyBQb2x5bW9ycGhpYyBjb21wYXJpc29ucywgdXNhYmxlIHdpdGggYW55IHZhbHVlIHR5
cGUuIFJldHVybnMgaW50MzIgMCBvciAxLiBOb3RlIHRoYXQgIk5vdCIKKyAgICAvLyBpcyBqdXN0
IEVxdWFsKHgsIDApLgorICAgIEVxdWFsLAorICAgIE5vdEVxdWFsLAorICAgIExlc3NUaGFuLAor
ICAgIEdyZWF0ZXJUaGFuLAorICAgIExlc3NFcXVhbCwKKyAgICBHcmVhdGVyRXF1YWwsCisKKyAg
ICAvLyBJbnRlZ2VyIGNvbXBhcmlzb25zLiBSZXR1cm5zIGludDMyIDAgb3IgMS4KKyAgICBBYm92
ZSwKKyAgICBCZWxvdywKKyAgICBBYm92ZUVxdWFsCisgICAgQmVsb3dFcXVhbCwKKworICAgIC8v
IE1lbW9yeSBsb2Fkcy4gT3Bjb2RlIGluZGljYXRlcyBob3cgd2UgbG9hZCBhbmQgdGhlIGxvYWRl
ZCB0eXBlLiBUaGVzZSB1c2UgTWVtb3J5VmFsdWUuCisgICAgLy8gVGhlc2UgcmV0dXJuIEludDMy
OgorICAgIExvYWQ4WiwKKyAgICBMb2FkOFMsCisgICAgTG9hZDE2WiwKKyAgICBMb2FkMTZTLAor
ICAgIC8vIFRoaXMgcmV0dXJucyBEb3VibGU6CisgICAgTG9hZEZsb2F0LAorICAgIC8vIFRoaXMg
cmV0dXJuIHdoYXRldmVyIHRoZSByZXR1cm4gdHlwZSBpczoKKyAgICBMb2FkLAorCisgICAgLy8g
TWVtb3J5IHN0b3Jlcy4gT3Bjb2RlIGluZGljYXRlcyBob3cgdGhlIHZhbHVlIGlzIHN0b3JlZC4g
VGhlc2UgdXNlIE1lbW9yeVZhbHVlLgorICAgIC8vIFRoZXNlIHRha2UgYW4gSW50MzIgdmFsdWU6
CisgICAgU3RvcmU4LAorICAgIFN0b3JlMTYsCisgICAgLy8gVGhpcyB0YWtlcyBhIERvdWJsZSB2
YWx1ZToKKyAgICBTdG9yZUZsb2F0LAorICAgIC8vIFRoaXMgaXMgYSBwb2x5bW9ycGhpYyBzdG9y
ZSBmb3IgSW50MzIsIEludDY0LCBhbmQgRG91YmxlOgorICAgIFN0b3JlLAorCisgICAgLy8gVGhp
cyBpcyBhIHJlZ3VsYXIgb3JkaW5hcnkgQyBmdW5jdGlvbiBjYWxsLCB1c2luZyB0aGUgc3lzdGVt
IEMgY2FsbGluZyBjb252ZW50aW9uLiBNYWtlIHN1cmUKKyAgICAvLyB0aGF0IHRoZSBhcmd1bWVu
dHMgYXJlIHBhc3NlZCB1c2luZyB0aGUgcmlnaHQgdHlwZXMuCisgICAgQ0NhbGwsCisKKyAgICAv
LyBUaGlzIGlzIGEgcGF0Y2hwb2ludC4gVXNlIHRoZSBQYXRjaHBvaW50VmFsdWUgY2xhc3MuIFRo
aXMgaXMgdmlld2VkIGFzIGJlaGF2aW5nIGxpa2UgYSBjYWxsLAorICAgIC8vIGJ1dCBvbmx5IGVt
aXRzIGNvZGUgdmlhIGEgY29kZSBnZW5lcmF0aW9uIGNhbGxiYWNrLiBUaGF0IGNhbGxiYWNrIGdl
dHMgdG8gZW1pdCBjb2RlIGlubGluZS4KKyAgICAvLyBZb3UgY2FuIHBhc3MgYSBzdGFja21hcCBh
bG9uZyB3aXRoIGNvbnN0cmFpbnRzIG9uIGhvdyBlYWNoIHN0YWNrbWFwIGFyZ3VtZW50IG11c3Qg
YmUgcGFzc2VkLgorICAgIC8vIEl0J3MgbGVnYWwgdG8gcmVxdWVzdCB0aGF0IGEgc3RhY2ttYXAg
YXJndW1lbnQgaXMgaW4gc29tZSByZWdpc3RlciBhbmQgaXQncyBsZWdhbCB0byByZXF1ZXN0Cisg
ICAgLy8gdGhhdCBhIHN0YWNrbWFwIGFyZ3VtZW50IGlzIGF0IHNvbWUgb2Zmc2V0IGZyb20gdGhl
IHRvcCBvZiB0aGUgYXJndW1lbnQgcGFzc2luZyBhcmVhIG9uIHRoZQorICAgIC8vIHN0YWNrLgor
ICAgIFBhdGNocG9pbnQsCisKKyAgICAvLyBDaGVja2VkIG1hdGguIFVzZSB0aGUgQ2hlY2tWYWx1
ZSBjbGFzcy4gTGlrZSBhIFBhdGNocG9pbnQsIHRoaXMgdGFrZXMgYSBjb2RlIGdlbmVyYXRpb24K
KyAgICAvLyBjYWxsYmFjay4gVGhhdCBjYWxsYmFjayBnZXRzIHRvIGVtaXQgc29tZSBjb2RlIGFm
dGVyIHRoZSBlcGlsb2d1ZSwgYW5kIGdldHMgdG8gbGluayB0aGUganVtcAorICAgIC8vIGZyb20g
dGhlIGNoZWNrLCBhbmQgdGhlIGNob2ljZSBvZiByZWdpc3RlcnMuIFlvdSBhbHNvIGdldCB0byBz
dXBwbHkgYSBzdGFja21hcC4gTm90ZSB0aGF0IHlvdQorICAgIC8vIGFyZSBub3QgYWxsb3dlZCB0
byBqdW1wIGJhY2sgaW50byB0aGUgbWFpbmxpbmUgY29kZSBmcm9tIHlvdXIgc2xvdyBwYXRoLCBz
aW5jZSB0aGUgY29tcGlsZXIKKyAgICAvLyB3aWxsIGFzc3VtZSB0aGF0IHRoZSBleGVjdXRpb24g
b2YgdGhlc2UgaW5zdHJ1Y3Rpb25zIHByb3ZlcyB0aGF0IG92ZXJmbG93IGRpZG4ndCBoYXBwZW4u
IEZvcgorICAgIC8vIGV4YW1wbGUsIGlmIHlvdSBoYXZlIHR3byBDaGVja0FkZCdzOgorICAgIC8v
CisgICAgLy8gYSA9IENoZWNrQWRkKHgsIHkpCisgICAgLy8gYiA9IENoZWNrQWRkKHgsIHkpCisg
ICAgLy8KKyAgICAvLyBUaGVuIGl0J3MgdmFsaWQgdG8gY2hhbmdlIHRoaXMgdG86CisgICAgLy8K
KyAgICAvLyBhID0gQ2hlY2tBZGQoeCwgeSkKKyAgICAvLyBiID0gSWRlbnRpdHkoYSkKKyAgICAv
LworICAgIC8vIFRoaXMgaXMgdmFsaWQgcmVnYXJkbGVzcyBvZiB0aGUgY2FsbGJhY2tzIHVzZWQg
YnkgdGhlIHR3byBDaGVja0FkZHMuIFRoZXkgbWF5IGhhdmUgZGlmZmVyZW50CisgICAgLy8gY2Fs
bGJhY2tzLiBZZXQsIHRoaXMgdHJhbnNmb3JtYXRpb24gaXMgdmFsaWQgZXZlbiBpZiB0aGV5IGFy
ZSBkaWZmZXJlbnQgYmVjYXVzZSB3ZSBrbm93IHRoYXQKKyAgICAvLyBhZnRlciB0aGUgZmlyc3Qg
Q2hlY2tBZGQgZXhlY3V0ZXMsIHRoZSBzZWNvbmQgQ2hlY2tBZGQgY291bGQgbm90IGhhdmUgcG9z
c2libHkgdGFrZW4gc2xvdworICAgIC8vIHBhdGguIFRoZXJlZm9yZSwgdGhlIHNlY29uZCBDaGVj
a0FkZCdzIGNhbGxiYWNrIGlzIGlycmVsZXZhbnQuCisgICAgQ2hlY2tBZGQsCisgICAgQ2hlY2tT
dWIsCisgICAgQ2hlY2tNdWwsCisKKyAgICAvLyBDaGVjayB0aGF0IHNpZGUtZXhpdHMuIFVzZSB0
aGUgQ2hlY2tWYWx1ZSBjbGFzcy4gTGlrZSBDaGVja0FkZCBhbmQgZnJpZW5kcywgdGhpcyBoYXMg
YQorICAgIC8vIHN0YWNrbWFwIHdpdGggYSBnZW5lcmF0aW9uIGNhbGxiYWNrLiBUaGlzIHRha2Vz
IGFuIEludDMyIGFyZ3VtZW50IHRoYXQgdGhpcyBicmFuY2hlcyBvbiwgd2l0aAorICAgIC8vIGZ1
bGwgYnJhbmNoIGZ1c2lvbiBpbiB0aGUgaW5zdHJ1Y3Rpb24gc2VsZWN0b3IuIEEgdHJ1ZSB2YWx1
ZSBqdW1wcyB0byB0aGUgZ2VuZXJhdG9yJ3Mgc2xvdworICAgIC8vIHBhdGguCisgICAgQ2hlY2ss
CisKKyAgICAvLyBTU0Egc3VwcG9ydCwgaW4gdGhlIHN0eWxlIG9mIERGRyBTU0EuCisgICAgVXBz
aWxvbiwgLy8gVGhpcyB1c2VzIHRoZSBVcHNpbG9uVmFsdWUgY2xhc3MuCisgICAgUGhpLAorCisg
ICAgLy8gSnVtcC4gVXNlcyB0aGUgQ29udHJvbFZhbHVlIGNsYXNzLgorICAgIEp1bXAsCisgICAg
CisgICAgLy8gUG9seW1vcnBoaWMgYnJhbmNoLCB1c2FibGUgd2l0aCBhbnkgdmFsdWUgdHlwZS4g
QnJhbmNoZXMgaWYgbm90IGVxdWFsIHRvIHplcm8uIFVzZXMgdGhlCisgICAgLy8gQ29udHJvbFZh
bHVlIGNsYXNzLCB3aXRoIHRoZSAwLWluZGV4IHN1Y2Nlc3NvciBiZWluZyB0aGUgdHJ1ZSBzdWNj
ZXNzb3IuCisgICAgQnJhbmNoLAorCisgICAgLy8gU3dpdGNoLiBTd2l0Y2hlcyBvdmVyIGVpdGhl
ciBJbnQzMiBvciBJbnQ2NC4gVXNlcyB0aGUgU3dpdGNoVmFsdWUgY2xhc3MuCisgICAgU3dpdGNo
LAorCisgICAgLy8gUmV0dXJuLiBOb3RlIHRoYXQgQjMgcHJvY2VkdXJlcyBkb24ndCBrbm93IHRo
ZWlyIHJldHVybiB0eXBlLCBzbyB0aGlzIGNhbiBqdXN0IHJldHVybiBhbnkKKyAgICAvLyB0eXBl
LiBVc2VzIHRoZSBDb250cm9sVmFsdWUgY2xhc3MuCisgICAgUmV0dXJuLAorCisgICAgLy8gVGhp
cyBpcyBhIHRlcm1pbmFsIHRoYXQgaW5kaWNhdGVzIHRoYXQgd2Ugd2lsbCBuZXZlciBnZXQgaGVy
ZS4gVXNlcyB0aGUgQ29udHJvbFZhbHVlIGNsYXNzLgorICAgIE9vcHMKK307CisKK30gfSAvLyBu
YW1lc3BhY2UgSlNDOjpCMworCituYW1lc3BhY2UgV1RGIHsKKworY2xhc3MgUHJpbnRTdHJlYW07
CisKK3ZvaWQgcHJpbnRJbnRlcm5hbChQcmludFN0cmVhbSYsIEpTQzo6QjM6Ok9wY29kZSk7CisK
K30gLy8gbmFtZXNwYWNlIFdURgorCisjZW5kaWYgLy8gQjNPcGNvZGVfaAorCkluZGV4OiBTb3Vy
Y2UvSmF2YVNjcmlwdENvcmUvYjMvQjNPcmlnaW4uY3BwCj09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9K
YXZhU2NyaXB0Q29yZS9iMy9CM09yaWdpbi5jcHAJKHJldmlzaW9uIDApCisrKyBTb3VyY2UvSmF2
YVNjcmlwdENvcmUvYjMvQjNPcmlnaW4uY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsMzcg
QEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTUgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2Vy
dmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkg
Zm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHBy
b3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4g
UmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5
cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xs
b3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBt
dXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlz
dCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAg
ICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUg
ZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUg
SU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMs
IElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElF
UyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVS
UE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IKKyAq
IENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVO
VEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElO
Q0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVU
RSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBP
UiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZ
CisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFks
IE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcg
SU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBB
RFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKworI2luY2x1
ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgIkIzT3JpZ2luLmgiCisKK25hbWVzcGFjZSBKU0MgeyBu
YW1lc3BhY2UgQjMgeworCit2b2lkIE9yaWdpbjo6ZHVtcChQcmludFN0cmVhbSYgb3V0KSBjb25z
dAoreworICAgIG91dC5wcmludCgiT3JpZ2luKCIsIFJhd1BvaW50ZXIobV9kYXRhKSwgIikiKTsK
K30KKworfSB9IC8vIG5hbWVzcGFjZSBKU0M6OkIzCisKSW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0
Q29yZS9iMy9CM09yaWdpbi5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9i
My9CM09yaWdpbi5oCShyZXZpc2lvbiAwKQorKysgU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0Iz
T3JpZ2luLmgJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSw1NSBAQAorLyoKKyAqIENvcHlyaWdo
dCAoQykgMjAxNSBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0
cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRo
b3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9s
bG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Yg
c291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNl
LCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgor
ICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBh
Ym92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5k
IHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5k
L29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgor
ICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIGBgQVMgSVMnJyBBTkQg
QU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9U
IExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElU
WSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVE
LiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJ
QUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBF
WEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJ
TUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VT
OyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQ
VElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwg
V0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xV
RElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBU
SEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJ
QklMSVRZIE9GIFNVQ0ggREFNQUdFLiAKKyAqLworCisjaWZuZGVmIEIzT3JpZ2luX2gKKyNkZWZp
bmUgQjNPcmlnaW5faAorCisjaW5jbHVkZSA8d3RmL1ByaW50U3RyZWFtLmg+CisKK25hbWVzcGFj
ZSBKU0MgeyBuYW1lc3BhY2UgQjMgeworCisvLyBXaG9ldmVyIGdlbmVyYXRlcyBCM0lSIGNhbiBj
aG9vc2UgdG8gcHV0IG9yaWdpbnMgb24gdmFsdWVzLiBXaGVuIHlvdSBkbyB0aGlzLCBCMyB3aWxs
IGJlIGFibGUgdG8KKy8vIGFjY291bnQsIGRvd24gdG8gdGhlIG1hY2hpbmUgY29kZSwgd2hpY2gg
aW5zdHJ1Y3Rpb24gY29ycmVzcG9uZHMgdG8gd2hpY2ggb3JpZ2luLiBCMworLy8gdHJhbnNmb3Jt
YXRpb25zIG11c3QgcHJlc2VydmUgT3JpZ2lucyBjYXJlZnVsbHkuIEl0J3MgYW4gZXJyb3IgdG8g
d3JpdGUgYSB0cmFuc2Zvcm1hdGlvbiB0aGF0CisvLyBlaXRoZXIgZHJvcHMgT3JpZ2lucyBvciBs
aWVzIGFib3V0IHRoZW0uCitjbGFzcyBPcmlnaW4geworcHVibGljOgorICAgIGV4cGxpY2l0IE9y
aWdpbihjb25zdCB2b2lkKiBkYXRhID0gbnVsbHB0cikKKyAgICAgICAgOiBtX2RhdGEoZGF0YSkK
KyAgICB7CisgICAgfQorCisgICAgY29uc3Qgdm9pZCogZGF0YSgpIGNvbnN0IHsgcmV0dXJuIG1f
ZGF0YTsgfQorCisgICAgdm9pZCBkdW1wKFByaW50U3RyZWFtJikgY29uc3Q7CisgICAgCitwcml2
YXRlOgorICAgIGNvbnN0IHZvaWQqIG1fZGF0YTsKK307CisKK30gfSAvLyBuYW1lc3BhY2UgSlND
OjpCMworCisjZW5kaWYgLy8gQjNPcmlnaW5faAorCkluZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENv
cmUvYjMvQjNQYXRjaHBvaW50VmFsdWUuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2Ny
aXB0Q29yZS9iMy9CM1BhdGNocG9pbnRWYWx1ZS5jcHAJKHJldmlzaW9uIDApCisrKyBTb3VyY2Uv
SmF2YVNjcmlwdENvcmUvYjMvQjNQYXRjaHBvaW50VmFsdWUuY3BwCSh3b3JraW5nIGNvcHkpCkBA
IC0wLDAgKzEsNDYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTUgQXBwbGUgSW5jLiBBbGwg
cmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNl
IGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUg
cGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUg
bWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRo
ZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMg
YW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBi
aW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3Rp
Y2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIg
aW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlk
ZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklE
RUQgQlkgQVBQTEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVE
IFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJ
RUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElD
VUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExF
IElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElS
RUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFM
IERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQg
T0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisg
KiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBP
TiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklD
VCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJ
U0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FS
RSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisg
Ki8KKworI2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgIkIzUGF0Y2hwb2ludFZhbHVlLmgi
CisKKyNpbmNsdWRlIDx3dGYvQ29tbWFQcmludGVyLmg+CisKK25hbWVzcGFjZSBKU0MgeyBuYW1l
c3BhY2UgQjMgeworCitQYXRjaHBvaW50VmFsdWU6On5QYXRjaHBvaW50VmFsdWUoKQoreworfQor
Cit2b2lkIFBhdGNocG9pbnRWYWx1ZTo6ZHVtcE1ldGEoUHJpbnRTdHJlYW0mIG91dCkgY29uc3QK
K3sKKyAgICBDb21tYVByaW50ZXIgY29tbWE7CisgICAgb3V0LnByaW50KGNvbW1hLCAic3RhY2tt
YXAgPSAiLCBzdGFja21hcCk7CisgICAgaWYgKHNoYWRvdykKKyAgICAgICAgb3V0LnByaW50KGNv
bW1hLCAic2hhZG93ID0gIiwgc2hhZG93KTsKK30KKworfSB9IC8vIG5hbWVzcGFjZSBKU0M6OkIz
CisKSW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM1BhdGNocG9pbnRWYWx1ZS5oCj09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM1BhdGNocG9pbnRWYWx1ZS5o
CShyZXZpc2lvbiAwKQorKysgU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzUGF0Y2hwb2ludFZh
bHVlLmgJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSw1OCBAQAorLyoKKyAqIENvcHlyaWdodCAo
QykgMjAxNSBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmli
dXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0
CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93
aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291
cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0
aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICog
Mi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92
ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRo
ZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29y
IG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICog
VEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5Z
CisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJ
TUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBB
TkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAg
SU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJM
RSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVN
UExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlU
RUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBM
T1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElP
TikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hF
VEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElO
RyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUg
VVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklM
SVRZIE9GIFNVQ0ggREFNQUdFLiAKKyAqLworCisjaWZuZGVmIEIzUGF0Y2hwb2ludFZhbHVlX2gK
KyNkZWZpbmUgQjNQYXRjaHBvaW50VmFsdWVfaAorCisjaW5jbHVkZSAiQjNWYWx1ZS5oIgorI2lu
Y2x1ZGUgIkIzU3RhY2ttYXAuaCIKKworbmFtZXNwYWNlIEpTQyB7IG5hbWVzcGFjZSBCMyB7CisK
K2NsYXNzIFBhdGNocG9pbnRWYWx1ZSA6IHB1YmxpYyBWYWx1ZSB7CitwdWJsaWM6CisgICAgc3Rh
dGljIGJvb2wgYWNjZXB0cyhPcGNvZGUgb3Bjb2RlKSB7IHJldHVybiBvcGNvZGUgPT0gUGF0Y2hw
b2ludDsgfQorCisgICAgflBhdGNocG9pbnRWYWx1ZSgpOworCisgICAgU3RhY2ttYXAgc3RhY2tt
YXA7CisgICAgdW5zaWduZWQgc2hhZG93IHsgMCB9OworCitwcm90ZWN0ZWQ6CisgICAgdm9pZCBk
dW1wTWV0YShQcmludFN0cmVhbSYpIGNvbnN0IG92ZXJyaWRlOworCitwcml2YXRlOgorICAgIGZy
aWVuZCBjbGFzcyBQcm9jZWR1cmU7CisKKyAgICBQYXRjaHBvaW50VmFsdWUodW5zaWduZWQgaW5k
ZXgsIFR5cGUgdHlwZSwgT3JpZ2luIG9yaWdpbiwgY29uc3QgQWRqYWNlbmN5TGlzdCYgY2hpbGRy
ZW4pCisgICAgICAgIDogVmFsdWUoaW5kZXgsIFBhdGNocG9pbnQsIHR5cGUsIG9yaWdpbiwgY2hp
bGRyZW4pCisgICAgeworICAgIH0KK307CisKK30gfSAvLyBuYW1lc3BhY2UgSlNDOjpCMworCisj
ZW5kaWYgLy8gQjNQYXRjaHBvaW50VmFsdWVfaAorCkluZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENv
cmUvYjMvQjNQcm9jZWR1cmUuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29y
ZS9iMy9CM1Byb2NlZHVyZS5jcHAJKHJldmlzaW9uIDApCisrKyBTb3VyY2UvSmF2YVNjcmlwdENv
cmUvYjMvQjNQcm9jZWR1cmUuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsNTYgQEAKKy8q
CisgKiBDb3B5cmlnaHQgKEMpIDIwMTUgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgor
ICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMs
IHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVk
IHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0
cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQK
KyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcg
ZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJl
cHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBj
b25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1
bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJp
YnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBg
YEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xV
RElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBN
RVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBB
UkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IKKyAqIENPTlRS
SUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBT
UEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElO
RywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09E
UyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJ
TkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBP
RiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRP
UlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5Z
IFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VE
IE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKworI2luY2x1ZGUgImNv
bmZpZy5oIgorI2luY2x1ZGUgIkIzUHJvY2VkdXJlLmgiCisKKyNpbmNsdWRlICJCM0Jhc2ljQmxv
Y2suaCIKKyNpbmNsdWRlICJCM1ZhbHVlLmgiCisKK25hbWVzcGFjZSBKU0MgeyBuYW1lc3BhY2Ug
QjMgeworCitQcm9jZWR1cmU6OlByb2NlZHVyZSgpCit7Cit9CisKK1Byb2NlZHVyZTo6flByb2Nl
ZHVyZSgpCit7Cit9CisKK0Jhc2ljQmxvY2sqIFByb2NlZHVyZTo6YWRkQmxvY2soKQoreworICAg
IHN0ZDo6dW5pcXVlX3B0cjxCYXNpY0Jsb2NrPiBibG9jayA9IHN0ZDo6bWFrZV91bmlxdWU8QmFz
aWNCbG9jaz4obV9ibG9ja3Muc2l6ZSgpKTsKKyAgICBCYXNpY0Jsb2NrKiByZXN1bHQgPSBibG9j
ay5nZXQoKTsKKyAgICBtX2Jsb2Nrcy5hcHBlbmQoV1RGOjptb3ZlKGJsb2NrKSk7CisgICAgcmV0
dXJuIHJlc3VsdDsKK30KKwordm9pZCBQcm9jZWR1cmU6OmR1bXAoUHJpbnRTdHJlYW0mIG91dCkg
Y29uc3QKK3sKKyAgICBmb3IgKEJhc2ljQmxvY2sqIGJsb2NrIDogKnRoaXMpCisgICAgICAgIG91
dC5wcmludChkZWVwRHVtcChibG9jaykpOworfQorCit9IH0gLy8gbmFtZXNwYWNlIEpTQzo6QjMK
SW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM1Byb2NlZHVyZS5oCj09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0K
LS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM1Byb2NlZHVyZS5oCShyZXZpc2lvbiAwKQor
KysgU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzUHJvY2VkdXJlLmgJKHdvcmtpbmcgY29weSkK
QEAgLTAsMCArMSwxNzcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTUgQXBwbGUgSW5jLiBB
bGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291
cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBh
cmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBh
cmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWlu
IHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlv
bnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBp
biBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBu
b3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWlt
ZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJv
dmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJP
VklERUQgQlkgQVBQTEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBM
SUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElN
UExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFS
VElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQ
UExFIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElO
RElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5U
SUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1F
TlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9S
CisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFO
RCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNU
UklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhF
UldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZU
V0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4g
CisgKi8KKworI2lmbmRlZiBCM1Byb2NlZHVyZV9oCisjZGVmaW5lIEIzUHJvY2VkdXJlX2gKKwor
I2luY2x1ZGUgPHd0Zi9CYWcuaD4KKyNpbmNsdWRlIDx3dGYvRmFzdE1hbGxvYy5oPgorI2luY2x1
ZGUgPHd0Zi9Ob25jb3B5YWJsZS5oPgorI2luY2x1ZGUgPHd0Zi9WZWN0b3IuaD4KKworbmFtZXNw
YWNlIEpTQyB7IG5hbWVzcGFjZSBCMyB7CisKK2NsYXNzIEJhc2ljQmxvY2s7CitjbGFzcyBWYWx1
ZTsKKworY2xhc3MgUHJvY2VkdXJlIHsKKyAgICBXVEZfTUFLRV9OT05DT1BZQUJMRShQcm9jZWR1
cmUpOworICAgIFdURl9NQUtFX0ZBU1RfQUxMT0NBVEVEOworcHVibGljOgorCisgICAgUHJvY2Vk
dXJlKCk7CisgICAgflByb2NlZHVyZSgpOworCisgICAgQmFzaWNCbG9jayogYWRkQmxvY2soKTsK
KyAgICAKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBWYWx1ZVR5cGUsIHR5cGVuYW1lLi4uIEFyZ3Vt
ZW50cz4KKyAgICBWYWx1ZVR5cGUqIGFkZChBcmd1bWVudHMuLi4pOworCisgICAgdm9pZCBkdW1w
KFByaW50U3RyZWFtJikgY29uc3Q7CisKKyAgICB1bnNpZ25lZCBzaXplKCkgY29uc3QgeyByZXR1
cm4gbV9ibG9ja3Muc2l6ZSgpOyB9CisgICAgQmFzaWNCbG9jayogYXQodW5zaWduZWQgaW5kZXgp
IGNvbnN0IHsgcmV0dXJuIG1fYmxvY2tzW2luZGV4XTsgfQorICAgIEJhc2ljQmxvY2sqIG9wZXJh
dG9yW10odW5zaWduZWQgaW5kZXgpIGNvbnN0IHsgcmV0dXJuIGF0KGluZGV4KTsgfQorCisgICAg
Y2xhc3MgaXRlcmF0b3IgeworICAgIHB1YmxpYzoKKyAgICAgICAgaXRlcmF0b3IoKToKKyAgICAg
ICAgICAgIDogbV9wcm9jZWR1cmUobnVsbHB0cikKKyAgICAgICAgICAgICwgbV9pbmRleCgwKQor
ICAgICAgICB7CisgICAgICAgIH0KKworICAgICAgICBpdGVyYXRvcihQcm9jZWR1cmUmIHByb2Nl
ZHVyZSwgdW5zaWduZWQgaW5kZXgpCisgICAgICAgICAgICA6IG1fcHJvY2VkdXJlKCZwcm9jZWR1
cmUpCisgICAgICAgICAgICAsIG1faW5kZXgoaW5kZXgpCisgICAgICAgIHsKKyAgICAgICAgfQor
CisgICAgICAgIEJhc2ljQmxvY2sqIG9wZXJhdG9yKigpCisgICAgICAgIHsKKyAgICAgICAgICAg
IHJldHVybiBtX3Byb2NlZHVyZS0+YXQobV9pbmRleCk7CisgICAgICAgIH0KKworICAgICAgICBp
dGVyYXRvciYgb3BlcmF0b3IrKygpCisgICAgICAgIHsKKyAgICAgICAgICAgIG1faW5kZXggPSBm
aW5kTmV4dChtX2luZGV4ICsgMSk7CisgICAgICAgICAgICByZXR1cm4gKnRoaXM7CisgICAgICAg
IH0KKworICAgICAgICBib29sIG9wZXJhdG9yPT0oY29uc3QgaXRlcmF0b3ImIG90aGVyKSBjb25z
dAorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gbV9pbmRleCA9PSBvdGhlci5tX2luZGV4
OworICAgICAgICB9CisKKyAgICAgICAgYm9vbCBvcGVyYXRvciE9KGNvbnN0IGl0ZXJhdG9yJiBv
dGhlcikgY29uc3QKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuICEoKnRoaXMgPT0gb3Ro
ZXIpOworICAgICAgICB9CisKKyAgICBwcml2YXRlOgorICAgICAgICB1bnNpZ25lZCBmaW5kTmV4
dCh1bnNpZ25lZCBpbmRleCkKKyAgICAgICAgeworICAgICAgICAgICAgd2hpbGUgKGluZGV4IDwg
bV9wcm9jZWR1cmUtPnNpemUoKSAmJiAhbV9wcm9jZWR1cmUtPmF0KGluZGV4KSkKKyAgICAgICAg
ICAgICAgICBpbmRleCsrOworICAgICAgICAgICAgcmV0dXJuIGluZXg7CisgICAgICAgIH0KKwor
ICAgICAgICBQcm9jZWR1cmUqIG1fcHJvY2VkdXJlOworICAgICAgICB1bnNpZ25lZCBtX2luZGV4
OworICAgIH07CisKKyAgICBpdGVyYXRvciBiZWdpbigpIGNvbnN0IHsgcmV0dXJuIGl0ZXJhdG9y
KCp0aGlzLCAwKTsgfQorICAgIGl0ZXJhdG9yIGVuZCgpIGNvbnN0IHsgcmV0dXJuIGl0ZXJhdG9y
KCp0aGlzLCBudW1CbG9ja3MoKSk7IH0KKworICAgIGNsYXNzIFZhbHVlc0NvbGxlY3Rpb24gewor
ICAgIHB1YmxpYzoKKyAgICAgICAgVmFsdWVzQ29sbGVjdGlvbihQcm9jZWR1cmUmIHByb2NlZHVy
ZSkKKyAgICAgICAgICAgIDogbV9wcm9jZWR1cmUocHJvY2VkdXJlKQorICAgICAgICB7CisgICAg
ICAgIH0KKworICAgICAgICBjbGFzcyBpdGVyYXRvciB7CisgICAgICAgIHB1YmxpYzoKKyAgICAg
ICAgICAgIGl0ZXJhdG9yKCk6CisgICAgICAgICAgICAgICAgOiBtX3Byb2NlZHVyZShudWxscHRy
KQorICAgICAgICAgICAgICAgICwgbV9pbmRleCgwKQorICAgICAgICAgICAgeworICAgICAgICAg
ICAgfQorCisgICAgICAgICAgICBpdGVyYXRvcihQcm9jZWR1cmUmIHByb2NlZHVyZSwgdW5zaWdu
ZWQgaW5kZXgpCisgICAgICAgICAgICAgICAgOiBtX3Byb2NlZHVyZSgmcHJvY2VkdXJlKQorICAg
ICAgICAgICAgICAgICwgbV9pbmRleChpbmRleCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAg
IH0KKworICAgICAgICAgICAgVmFsdWUqIG9wZXJhdG9yKigpCisgICAgICAgICAgICB7CisgICAg
ICAgICAgICAgICAgcmV0dXJuIG1fcHJvY2VkdXJlLT5ibG9jayhtX2luZGV4KTsKKyAgICAgICAg
ICAgIH0KKworICAgICAgICAgICAgaXRlcmF0b3ImIG9wZXJhdG9yKysoKQorICAgICAgICAgICAg
eworICAgICAgICAgICAgICAgIG1faW5kZXgrKzsKKyAgICAgICAgICAgICAgICByZXR1cm4gKnRo
aXM7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGJvb2wgb3BlcmF0b3I9PShjb25zdCBp
dGVyYXRvciYgb3RoZXIpIGNvbnN0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0
dXJuIG1faW5kZXggPT0gb3RoZXIubV9pbmRleDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAg
ICAgYm9vbCBvcGVyYXRvciE9KGNvbnN0IGl0ZXJhdG9yJiBvdGhlcikgY29uc3QKKyAgICAgICAg
ICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gISgqdGhpcyA9PSBvdGhlcik7CisgICAgICAg
ICAgICB9CisKKyAgICAgICAgcHJpdmF0ZToKKworICAgICAgICAgICAgUHJvY2VkdXJlKiBtX3By
b2NlZHVyZTsKKyAgICAgICAgICAgIHVuc2lnbmVkIG1faW5kZXg7CisgICAgICAgIH07CisKKyAg
ICAgICAgaXRlcmF0b3IgYmVnaW4oKSBjb25zdCB7IHJldHVybiBpdGVyYXRvcihtX3Byb2NlZHVy
ZSwgMCk7IH0KKyAgICAgICAgaXRlcmF0b3IgZW5kKCkgY29uc3QgeyByZXR1cm4gaXRlcmF0b3Io
bV9wcm9jZWR1cmUsIG1fcHJvY2VkdXJlLm1fdmFsdWVzLnNpemUoKSk7IH0KKworICAgICAgICB1
bnNpZ25lZCBzaXplKCkgY29uc3QgeyByZXR1cm4gbV9wcm9jZWR1cmUubV92YWx1ZXMuc2l6ZSgp
OyB9CisgICAgICAgIFZhbHVlKiBhdCh1bnNpZ25lZCBpbmRleCkgY29uc3QgeyByZXR1cm4gbV9w
cm9jZWR1cmUubV92YWx1ZXNbaW5kZXhdOyB9CisgICAgICAgIFZhbHVlKiBvcGVyYXRvcltdKHVu
c2lnbmVkIGluZGV4KSBjb25zdCB7IHJldHVybiBhdChpbmRleCk7IH0KKyAgICAgICAgCisgICAg
cHJpdmF0ZToKKyAgICAgICAgUHJvY2VkdXJlJiBtX3Byb2NlZHVyZTsKKyAgICB9OworCisgICAg
VmFsdWVzQ29sbGVjdGlvbiB2YWx1ZXMoKSB7IHJldHVybiBWYWx1ZXNDb2xsZWN0aW9uKCp0aGlz
KTsgfQorCitwcml2YXRlOgorICAgIFZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QmFzaWNCbG9jaz4+
IG1fYmxvY2tzOworICAgIFZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8VmFsdWU+PiBtX3ZhbHVlczsK
K307CisKK30gfSAvLyBuYW1lc3BhY2UgSlNDOjpCMworCisjZW5kaWYgLy8gQjNQcm9jZWR1cmVf
aAorCkluZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNQcm9jZWR1cmVJbmxpbmVzLmgK
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzUHJvY2VkdXJlSW5saW5l
cy5oCShyZXZpc2lvbiAwKQorKysgU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzUHJvY2VkdXJl
SW5saW5lcy5oCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsNDYgQEAKKy8qCisgKiBDb3B5cmln
aHQgKEMpIDIwMTUgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlz
dHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0
aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZv
bGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9m
IHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGlj
ZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4K
KyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUg
YWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFu
ZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFu
ZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoK
KyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFTIElTJycgQU5E
IEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5P
VCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJ
VFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1F
RC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBM
SUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICog
RVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBM
SU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNF
UzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJV
UFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFks
IFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNM
VURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0Yg
VEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NT
SUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKworI2lmbmRlZiBCM1Byb2NlZHVyZUlubGlu
ZXNfaAorI2RlZmluZSBCM1Byb2NlZHVyZUlubGluZXNfaAorCisjaW5jbHVkZSAiQjNCYXNpY0Js
b2NrLmgiCisjaW5jbHVkZSAiQjNQcm9jZWR1cmUuaCIKKworbmFtZXNwYWNlIEpTQyB7IG5hbWVz
cGFjZSBCMyB7CisKK3RlbXBsYXRlPHR5cGVuYW1lIFZhbHVlVHlwZSwgdHlwZW5hbWUuLi4gQXJn
dW1lbnRzPgorVmFsdWVUeXBlKiBQcm9jZWR1cmU6OmFkZChBcmd1ZW50cy4uLiBhcmd1bWVudHMp
Cit7CisgICAgc3RkOjp1bmlxdWVfcHRyPFZhbHVlVHlwZT4gdmFsdWUobmV3IFZhbHVlVHlwZSht
X3ZhbHVlcy5zaXplKCksIGFyZ3VtZW50cy4uLikpOworICAgIFZhbHVlVHlwZSogcmVzdWx0ID0g
dmFsdWUuZ2V0KCk7CisgICAgbV92YWx1ZXMuYXBwZW5kKFdURjo6bW92ZSh2YWx1ZSkpOworICAg
IHJldHVybiByZXN1bHQ7Cit9CisKK30gfSAvLyBuYW1lc3BhY2UgSlNDOjpCMworCisjZW5kaWYg
Ly8gQjNQcm9jZWR1cmVJbmxpbmVzX2gKKwpJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL2Iz
L0IzU3RhY2tTbG90VmFsdWUuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29y
ZS9iMy9CM1N0YWNrU2xvdFZhbHVlLmNwcAkocmV2aXNpb24gMCkKKysrIFNvdXJjZS9KYXZhU2Ny
aXB0Q29yZS9iMy9CM1N0YWNrU2xvdFZhbHVlLmNwcAkod29ya2luZyBjb3B5KQpAQCAtMCwwICsx
LDQxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE1IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyBy
ZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmlu
YXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRl
ZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAq
IDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUg
Y29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUg
Zm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZv
cm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlz
IGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQor
ICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGgg
dGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQ
UExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5U
SUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJB
TlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAq
IFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9S
CisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5D
SURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VT
IChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNU
SVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklU
UzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRI
RU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklM
SVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklT
SU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4g
SUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisKKyNp
bmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJCM1N0YWNrU2xvdFZhbHVlLmgiCisKK25hbWVz
cGFjZSBKU0MgeyBuYW1lc3BhY2UgQjMgeworCitTdGFja1Nsb3RWYWx1ZTo6flN0YWNrU2xvdFZh
bHVlKCkKK3sKK30KKwordm9pZCBTdGFja1Nsb3RWYWx1ZTo6ZHVtcE1ldGEoUHJpbnRTdHJlYW0m
IG91dCkgY29uc3QKK3sKKyAgICBvdXQucHJpbnQoImJ5dGVTaXplID0gIiwgbV9ieXRlU2l6ZSk7
Cit9CisKK30gfSAvLyBuYW1lc3BhY2UgSlNDOjpCMworCkluZGV4OiBTb3VyY2UvSmF2YVNjcmlw
dENvcmUvYjMvQjNTdGFja1Nsb3RWYWx1ZS5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2Ny
aXB0Q29yZS9iMy9CM1N0YWNrU2xvdFZhbHVlLmgJKHJldmlzaW9uIDApCisrKyBTb3VyY2UvSmF2
YVNjcmlwdENvcmUvYjMvQjNTdGFja1Nsb3RWYWx1ZS5oCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAg
KzEsNjUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTUgQXBwbGUgSW5jLiBBbGwgcmlnaHRz
IHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBi
aW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0
dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0Ogor
ICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92
ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRo
ZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkg
Zm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRo
aXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhl
CisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0
aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkg
QVBQTEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJB
TlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FS
UkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgor
ICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4g
T1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJ
TkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFH
RVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VC
U1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9G
SVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkg
VEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFC
SUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFS
SVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZF
TiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKwor
I2lmbmRlZiBCM1N0YWNrU2xvdFZhbHVlX2gKKyNkZWZpbmUgQjNTdGFja1Nsb3RWYWx1ZV9oCisK
KyNpbmNsdWRlICJCM1ZhbHVlLmgiCisKK25hbWVzcGFjZSBKU0MgeyBuYW1lc3BhY2UgQjMgewor
CitjbGFzcyBTdGFja1Nsb3RWYWx1ZSA6IHB1YmxpYyBWYWx1ZSB7CitwdWJsaWM6CisgICAgc3Rh
dGljIGJvb2wgYWNjZXB0cyhPcGNvZGUgb3Bjb2RlKSB7IHJldHVybiBvcGNvZGUgPT0gU3RhY2tT
bG90OyB9CisKKyAgICB+U3RhY2tTbG90VmFsdWUoKTsKKworICAgIHVuc2lnbmVkIGJ5dGVTaXpl
KCkgY29uc3QgeyByZXR1cm4gbV9ieXRlU2l6ZTsgfQorCisgICAgLy8gVGhpcyBnZXRzIGFzc2ln
bmVkIGF0IHRoZSBlbmQgb2YgY29tcGlsYXRpb24uIFlvdSBjYW5ub3QgcmVseSBvbiBpdCBoYXZp
bmcgYSBtZWFuaW5nZnVsCisgICAgLy8gdmFsdWUgd2hpbGUgdGhlIGNvbXBpbGVyIGlzIHJ1bm5p
bmcuCisgICAgaW50cHRyX3Qgb2Zmc2V0RnJvbUZQKCkgY29uc3QgeyByZXR1cm4gbV9vZmZzZXRG
cm9tRlA7IH0KKworcHJvdGVjdGVkOgorICAgIHZvaWQgZHVtcE1ldGEoUHJpbnRTdHJlYW0mKSBj
b25zdCBvdmVycmlkZTsKKworcHJpdmF0ZToKKyAgICBmcmllbmQgY2xhc3MgUHJvY2VkdXJlOwor
CisgICAgU3RhY2tTbG90VmFsdWUodW5zaWduZWQgaW5kZXgsIE9yaWdpbiBvcmlnaW4sIHVuc2ln
bmVkIGJ5dGVTaXplKQorICAgICAgICA6IFZhbHVlKGluZGV4LCBTdGFja1Nsb3QsIHBvaW50ZXIo
KSwgb3JpZ2luKQorICAgICAgICAsIG1fYnl0ZVNpemUoYnl0ZVNpemUpCisgICAgICAgICwgbV9v
ZmZzZXRGcm9tRlAoMCkKKyAgICB7CisgICAgfQorCisgICAgdW5zaWduZWQgbV9ieXRlU2l6ZTsK
KyAgICBpbnRwdHJfdCBtX29mZnNldEZyb21GUDsKK307CisKK30gfSAvLyBuYW1lc3BhY2UgSlND
OjpCMworCisjZW5kaWYgLy8gQjNTdGFja1Nsb3RWYWx1ZV9oCisKSW5kZXg6IFNvdXJjZS9KYXZh
U2NyaXB0Q29yZS9iMy9CM1N0YWNrbWFwLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNj
cmlwdENvcmUvYjMvQjNTdGFja21hcC5jcHAJKHJldmlzaW9uIDApCisrKyBTb3VyY2UvSmF2YVNj
cmlwdENvcmUvYjMvQjNTdGFja21hcC5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSw0MCBA
QAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNSBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2
ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBm
b3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJv
dmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBS
ZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHly
aWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxv
d2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11
c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0
IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAg
IGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBk
aXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJ
TkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywg
SU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVT
IE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQ
T1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUgorICog
Q09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5U
QUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5D
TFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRF
IEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9S
IEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkK
KyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwg
T1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJ
TiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFE
VklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLiAKKyAqLworCisjaW5jbHVk
ZSAiY29uZmlnLmgiCisjaW5jbHVkZSAiQjNTdGFja21hcC5oIgorCituYW1lc3BhY2UgSlNDIHsg
bmFtZXNwYWNlIEIzIHsKKwordm9pZCBTdGFja21hcDo6ZHVtcChQcmludFN0cmVhbSYgb3V0KSBj
b25zdAoreworICAgIG91dC5wcmludCgKKyAgICAgICAgIntvcGFxdWUgPSAiLCBSYXdQb2ludGVy
KG1fb3BhcXVlKSwgIiwgcmVwcyA9ICIsIGxpc3REdW1wKG1fcmVwcyksCisgICAgICAgICIsIGdl
bmVyYXRvciA9ICIsIFJhd1BvaW50ZXIobV9nZW5lcmF0b3IuZ2V0KCkpLCAiLCBjbG9iYmVyZWQg
PSAiLCBtX2Nsb2JiZXJlZCwKKyAgICAgICAgIiwgdXNlZFJlZ2lzdGVycyA9ICIsIG1fdXNlZFJl
Z2lzdGVycywgIn0iKTsKK30KKworfSB9IC8vIG5hbWVzcGFjZSBKU0M6OkIzCisKSW5kZXg6IFNv
dXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM1N0YWNrbWFwLmgKPT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNl
L0phdmFTY3JpcHRDb3JlL2IzL0IzU3RhY2ttYXAuaAkocmV2aXNpb24gMCkKKysrIFNvdXJjZS9K
YXZhU2NyaXB0Q29yZS9iMy9CM1N0YWNrbWFwLmgJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSwx
MjIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTUgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJl
c2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5h
cnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVk
IHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICog
MS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBj
b3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBm
b2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9y
bSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMg
bGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisg
KiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0
aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQ
TEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJ
RVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFO
VElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICog
UFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IK
KyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJ
REVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMg
KElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJ
VFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRT
OyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhF
T1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJ
VFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJ
TkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJ
RiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKworI2lm
bmRlZiBCM1N0YWNrbWFwX2gKKyNkZWZpbmUgQjNTdGFja21hcF9oCisKKyNpbmNsdWRlICJCM1Zh
bHVlUmVwLmgiCisjaW5jbHVkZSAiQ0NhbGxIZWxwZXJzLmgiCisjaW5jbHVkZSAiUmVnaXN0ZXJT
ZXQuaCIKKyNpbmNsdWRlIDx3dGYvU2hhcmVkVGFzay5oPgorCituYW1lc3BhY2UgSlNDIHsgbmFt
ZXNwYWNlIEIzIHsKKworY2xhc3MgQjNWYWx1ZTsKKworY2xhc3MgU3RhY2ttYXAgeworcHVibGlj
OgorICAgIHN0cnVjdCBHZW5lcmF0aW9uUGFyYW1zIHsKKyAgICAgICAgLy8gVGhpcyBpcyB0aGUg
VmFsdWUgY29udGFpbmluZyB0aGUgc3RhY2ttYXAuCisgICAgICAgIFZhbHVlKiB2YWx1ZTsKKwor
ICAgICAgICAvLyBUaGlzIGlzIHRoZSBzdGFja21hcC4KKyAgICAgICAgU3RhY2ttYXAqIHN0YWNr
bWFwOworCisgICAgICAgIC8vIFRoaXMgaXMgdGhlIGp1bXAgdG8gdGhlIHNsb3cgcGF0aCwgaWYg
dGhpcyBpcyBhIHN0YWNrbWFwIGZvciBhIENoZWNrIHZhbHVlLgorICAgICAgICBDQ2FsbEhlbHBl
cnM6Okp1bXAganVtcDsKKyAgICB9OworICAgIAorICAgIHR5cGVkZWYgdm9pZCBHZW5lcmF0b3JG
dW5jdGlvbihDQ2FsbEhlbHBlcnMmLCBjb25zdCBHZW5lcmF0aW9uUGFyYW1zJik7CisgICAgdHlw
ZWRlZiBTaGFyZWRUYXNrPEdlbmVyYXRvckZ1bmN0aW9uPiBHZW5lcmF0b3I7CisgICAgCisgICAg
U3RhY2ttYXAoKQorICAgIHsKKyAgICB9CisKKyAgICAvLyBTZXQgc29tZSBvcGFxdWUgZGF0YSB0
byBpZGVudGlmeSB0aGlzIHN0YWNrbWFwLiBUaGlzIGlzIHVzZWZ1bCBiZWNhdXNlIGEgU3RhY2tt
YXAtdXNpbmcgVmFsdWUKKyAgICAvLyBjYW4gYmUgZHVwbGljYXRlZCwgYW5kIGVhY2ggZHVwbGlj
YXRlIG1heSBlbmQgdXAgaGF2aW5nIGRpZmZlcmVudCByZWdpc3RlciBhbGxvY2F0aW9uLiBUaGlz
CisgICAgLy8gYWxsb3dzIGFsbCBvZiB0aG9zZSBkdXBsaWNhdGVzIHRvIGJlIGFibGUgdG8gcmVm
ZXIgYmFjayB0byB3aGF0ZXZlciBoaWdoLWxldmVsIGRhdGEgc3RydWN0dXJlcworICAgIC8vIHdl
IHdlcmUgdXNpbmcgdG8gY3JlYXRlIHRoZSB2YWx1ZS4KKyAgICB2b2lkIHNldE9wYXF1ZSh2b2lk
KiBwYXJhbWV0ZXIpCisgICAgeworICAgICAgICBtX29wYXF1ZSA9IHBhcmFtZXRlcjsKKyAgICB9
CisgICAgdm9pZCogb3BhcXVlKCkgY29uc3QgeyByZXR1cm4gbV9vcGFxdWU7IH0KKworICAgIC8v
IENvbnZlbmllbmNlIGhlbHBlcnMgd2hlbiB1c2luZyBpbmRpY2VzIGluc3RlYWQgb2YgcG9pbnRl
cnMuCisgICAgdm9pZCBzZXRPcGFxdWVJbmRleChzaXplX3QgaW5kZXgpCisgICAgeworICAgICAg
ICBzZXRPcGFxdWUoYml0d2lzZV9jYXN0PHZvaWQqPihpbmRleCkpOworICAgIH0KKyAgICBzaXpl
X3Qgb3BhcXVlSW5kZXgoKSBjb25zdCB7IHJldHVybiBiaXR3aXNlX2Nhc3Q8c2l6ZV90PihvcGFx
dWUoKSk7IH0KKworICAgIC8vIENvbnN0cmFpbiBhbiBhcmd1bWVudCB0byB0aGUgVmFsdWUgdGhh
dCB1c2VzIHRoaXMgU3RhY2ttYXAuIE5vdGUgdGhhdCBpbmRleCB6ZXJvIHJlZmVycyB0byB0aGUK
KyAgICAvLyBmaXJzdCBhcmd1bWVudCB0byB0aGF0IFZhbHVlLCBldmVuIGlmIHRoYXQgYXJndW1l
bnQgaXMgbm90IGNvbnN0cmFpbmFibGUuIEZvciBleGFtcGxlLCBpbiBhCisgICAgLy8gQ2hlY2tB
ZGQgdmFsdWUsIGl0IHdvdWxkIGJlIGFuIGVycm9yIHRvIGNvbnN0cmFpbiBpbmRpY2VzIDAgYW5k
IDEuIEluIGEgQ2hlY2sgdmFsdWUsIGl0IHdvdWxkCisgICAgLy8gYmUgYW4gZXJyb3IgdG8gY29u
c3RyYWluIGluZGV4IDAuIEJ1dCwgd2hlbiB0aGUgZ2VuZXJhdGlvbiBjYWxsYmFjayBpcyBjYWxs
ZWQsIHlvdSBjYW4gZGVwZW5kCisgICAgLy8gb24gdGhlIHJlcHMgZm9yIHRob3NlIGluZGljZXMg
YmVpbmcgZmlsbGVkIGluLgorICAgIHZvaWQgY29uc3RyYWluKHVuc2lnbmVkIGluZGV4LCBjb25z
dCBWYWx1ZVJlcCYgcmVwKQorICAgIHsKKyAgICAgICAgaWYgKGluZGV4ICsgMSA8IG1fcmVwcy5z
aXplKCkpCisgICAgICAgICAgICBtX3JlcHMuZ3JvdyhpbmRleCArIDEpOworICAgICAgICBtX3Jl
cHNbaW5kZXhdID0gcmVwOworICAgIH0KKworICAgIHZvaWQgY2xvYmJlcihjb25zdCBSZWdpc3Rl
clNldCYgc2V0KQorICAgIHsKKyAgICAgICAgbV9jbG9iYmVyZWQubWVyZ2Uoc2V0KTsKKyAgICB9
CisKKyAgICBjb25zdCBSZWdpc3RlclNldCYgY2xvYmJlcmVkKCkgY29uc3QgeyByZXR1cm4gbV9j
bG9iYmVyZWQ7IH0KKworICAgIHZvaWQgc2V0R2VuZXJhdG9yKFJlZlB0cjxHZW5lcmF0b3I+IGdl
bmVyYXRvcikKKyAgICB7CisgICAgICAgIG1fZ2VuZXJhdG9yID0gZ2VuZXJhdG9yOworICAgIH0K
KworICAgIHRlbXBsYXRlPHR5cGVuYW1lIEZ1bmN0b3I+CisgICAgdm9pZCBzZXRHZW5lcmF0b3Io
Y29uc3QgRnVuY3RvciYgZnVuY3RvcikKKyAgICB7CisgICAgICAgIG1fZ2VuZXJhdG9yID0gY3Jl
YXRlU2hhcmVkVGFzazxHZW5lcmF0b3JGdW5jdGlvbj4oZnVuY3Rvcik7CisgICAgfQorCisgICAg
Ly8gVGhlc2Ugd2lsbCByZXR1cm4gaW50ZXJlc3RpbmcgdGhpbmdzIGluc2lkZSB0aGUgZ2VuZXJh
dG9yIGNhbGxiYWNrLCBvciBhZnRlciBjb21waWxhdGlvbi4KKyAgICBjb25zdCBWZWN0b3I8VmFs
dWVSZXA+JiByZXBzKCkgY29uc3QgeyByZXR1cm4gbV9yZXBzOyB9CisgICAgY29uc3QgUmVnaXN0
ZXJTZXQmIHVzZWRSZWdpc3RlcnMoKSBjb25zdCB7IHJldHVybiBtX3VzZWRSZWdpc3RlcnM7IH0K
KworICAgIHZvaWQgZHVtcChQcmludFN0cmVhbSYpIGNvbnN0OworICAgIAorcHJpdmF0ZToKKyAg
ICB2b2lkKiBtX29wYXF1ZSB7IG51bGxwdHIgfTsKKyAgICBWZWN0b3I8VmFsdWVSZXA+IG1fcmVw
czsKKyAgICBSZWZQdHI8R2VuZXJhdG9yPiBtX2dlbmVyYXRvcjsKKyAgICBSZWdpc3RlclNldCBt
X2Nsb2JiZXJlZDsKKyAgICBSZWdpc3RlclNldCBtX3VzZWRSZWdpc3RlcnM7Cit9OworCit9IH0g
Ly8gbmFtZXNwYWNlIEpTQzo6QjMKKworI2VuZGlmIC8vIEIzU3RhY2ttYXBfaAorCkluZGV4OiBT
b3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNTd2l0Y2hDYXNlLmNwcAo9PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBT
b3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNTd2l0Y2hDYXNlLmNwcAkocmV2aXNpb24gMCkKKysr
IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM1N3aXRjaENhc2UuY3BwCSh3b3JraW5nIGNvcHkp
CkBAIC0wLDAgKzEsMzkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTUgQXBwbGUgSW5jLiBB
bGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291
cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBh
cmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBh
cmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWlu
IHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlv
bnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBp
biBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBu
b3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWlt
ZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJv
dmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJP
VklERUQgQlkgQVBQTEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBM
SUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElN
UExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFS
VElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQ
UExFIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElO
RElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5U
SUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1F
TlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9S
CisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFO
RCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNU
UklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhF
UldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZU
V0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4g
CisgKi8KKworI2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgIkIzU3dpdGNoQ2FzZS5oIgor
CisjaW5jbHVkZSAiQjNCYXNpY0Jsb2NrLmgiCisKK25hbWVzcGFjZSBKU0MgeyBuYW1lc3BhY2Ug
QjMgeworCit2b2lkIFN3aXRjaENhc2U6OmR1bXAoUHJpbnRTdHJlYW0mIG91dCkgY29uc3QKK3sK
KyAgICBvdXQucHJpbnQobV9jYXNlVmFsdWUsICItPiIsIHBvaW50ZXJEdW1wKG1fdGFyZ2V0KSk7
Cit9CisKK30gfSAvLyBuYW1lc3BhY2UgSlNDOjpCMworCkluZGV4OiBTb3VyY2UvSmF2YVNjcmlw
dENvcmUvYjMvQjNTd2l0Y2hDYXNlLmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRD
b3JlL2IzL0IzU3dpdGNoQ2FzZS5oCShyZXZpc2lvbiAwKQorKysgU291cmNlL0phdmFTY3JpcHRD
b3JlL2IzL0IzU3dpdGNoQ2FzZS5oCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsNjMgQEAKKy8q
CisgKiBDb3B5cmlnaHQgKEMpIDIwMTUgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgor
ICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMs
IHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVk
IHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0
cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQK
KyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcg
ZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJl
cHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBj
b25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1
bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJp
YnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBg
YEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xV
RElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBN
RVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBB
UkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IKKyAqIENPTlRS
SUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBT
UEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElO
RywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09E
UyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJ
TkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBP
RiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRP
UlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5Z
IFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VE
IE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKworI2lmbmRlZiBCM1N3
aXRjaENhc2VfaAorI2RlZmluZSBCM1N3aXRjaENhc2VfaAorCisjaW5jbHVkZSA8d3RmL1N0ZExp
YkV4dHJhcy5oPgorI2luY2x1ZGUgPHd0Zi9QcmludFN0cmVhbS5oPgorCituYW1lc3BhY2UgSlND
IHsgbmFtZXNwYWNlIEIzIHsKKworY2xhc3MgQmFzaWNCbG9jazsKKworY2xhc3MgU3dpdGNoQ2Fz
ZSB7CitwdWJsaWM6CisgICAgU3dpdGNoQ2FzZSgpCisgICAgeworICAgIH0KKworICAgIFN3aXRj
aENhc2UoaW50NjRfdCBjYXNlVmFsdWUsIEJhc2ljQmxvY2sqIHRhcmdldCkKKyAgICAgICAgOiBt
X2Nhc2VWYWx1ZShjYXNlVmFsdWUpCisgICAgICAgICwgbV90YXJnZXQodGFyZ2V0KQorICAgIHsK
KyAgICB9CisKKyAgICBleHBsaWNpdCBvcGVyYXRvciBib29sKCkgY29uc3QgeyByZXR1cm4gISFt
X3RhcmdldDsgfQorCisgICAgaW50NjRfdCBjYXNlVmFsdWUoKSBjb25zdCB7IHJldHVybiBtX2Nh
c2VWYWx1ZTsgfQorICAgIEJhc2ljQmxvY2sqIHRhcmdldCgpIGNvbnN0IHsgcmV0dXJuIG1fdGFy
Z2V0OyB9CisKKyAgICB2b2lkIGR1bXAoUHJpbnRTdHJlYW0mIG91dCkgY29uc3Q7CisKK3ByaXZh
dGU6CisgICAgaW50NjRfdCBjYXNlVmFsdWU7CisgICAgQmFzaWNCbG9jayogdGFyZ2V0OworfTsK
KworfSB9IC8vIG5hbWVzcGFjZSBKU0M6OkIzCisKKyNlbmRpZiAvLyBCM1N3aXRjaENhc2VfaAor
CkluZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNTd2l0Y2hWYWx1ZS5jcHAKPT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzU3dpdGNoVmFsdWUuY3BwCShyZXZp
c2lvbiAwKQorKysgU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzU3dpdGNoVmFsdWUuY3BwCSh3
b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsNjMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTUg
QXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFu
ZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9k
aWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25k
aXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2Rl
IG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0
IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlz
dHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJp
Z2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93
aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBt
YXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09G
VFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQ
UkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRP
LCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5F
U1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVW
RU5UIFNIQUxMIEFQUExFIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFO
WSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBP
UiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAor
ICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBV
U0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VW
RVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4g
Q09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElH
RU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICog
T0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBT
VUNIIERBTUFHRS4gCisgKi8KKworI2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2xkdWUgIkIzU3dp
dGNoVmFsdWUuaCIKKworbmFtZXNwYWNlIEpTQyB7IG5hbWVzcGFjZSBCMyB7CisKK1N3aXRjaFZh
bHVlOjp+U3dpdGNoVmFsdWUoKQoreworfQorCitTd2l0Y2hDYXNlIFN3aXRjaFZhbHVlOjpyZW1v
dmVDYXNlKHVuc2lnbmVkIGluZGV4KQoreworICAgIFN3aXRjaENhc2UgcmVzdWx0ID0gbV9zdWNj
ZXNzb3JzW2luZGV4XTsKKyAgICBtX3N1Y2Nlc3NvcnNbaW5kZXhdID0gbV9zdWNjZXNzb3JzLmxh
c3QoKTsKKyAgICBtX3N1Y2Nlc3NvcnMucmVtb3ZlTGFzdCgpOworICAgIHJldHVybiByZXN1bHQ7
Cit9CisKK3ZvaWQgU3dpdGNoVmFsdWU6OmFwcGVuZENhc2UoY29uc3QgU3dpdGNoQ2FzZSYgc3dp
dGNoQ2FzZSkKK3sKKyAgICBtX3N1Y2Nlc3NvcnMuYXBwZW5kKG1fc3VjY2Vzc29ycy5sYXN0KCkp
OworICAgIG1fc3VjY2Vzc29yc1ttX3N1Y2Nlc3NvcnMuc2l6ZSgpIC0gMl0gPSBzd2l0Y2hDYXNl
LnRhcmdldCgpOworICAgIG1fdmFsdWVzLmFwcGVuZChzd2l0Y2hDYXNlLmNhc2VWYWx1ZSgpKTsK
K30KKwordm9pZCBTd2l0Y2hWYWx1ZTo6ZHVtcE1ldGEoUHJpbnRTdHJlYW0mIG91dCkgY29uc3QK
K3sKKyAgICAvLyBUaGlzIGRlc3RydWN0aXZlbHkgb3ZlcnJpZGVzIENvbnRyb2xWYWx1ZSdzIGR1
bXBNZXRhKCkuCisgICAgb3V0LnByaW50KGxpc3REdW1wKCp0aGlzKSk7Cit9CisKK1N3aXRjaFZh
bHVlOjpTd2l0Y2hWYWx1ZSh1bnNpZ25lZCBpbmRleCwgT3JpZ2luIG9yaWdpbiwgQmFzaWNCbG9j
ayogZmFsbFRocm91Z2gpCisgICAgOiBDb250cm9sVmFsdWUoaW5kZXgsIFN3aXRjaCwgb3JpZ2lu
KQoreworICAgIG1fc3VjY2Vzc29ycy5hcHBlbmQoZmFsbFRocm91Z2gpOworfQorCit9IH0gLy8g
bmFtZXNwYWNlIEpTQzo6QjMKKwpJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzU3dp
dGNoVmFsdWUuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNTd2l0
Y2hWYWx1ZS5oCShyZXZpc2lvbiAwKQorKysgU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzU3dp
dGNoVmFsdWUuaAkod29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDEyMyBAQAorLyoKKyAqIENvcHly
aWdodCAoQykgMjAxNSBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVk
aXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3
aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUg
Zm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMg
b2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90
aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVy
LgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRo
ZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMg
YW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24g
YW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisg
KgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIGBgQVMgSVMnJyBB
TkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQg
Tk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJ
TElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJ
TUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJF
IExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisg
KiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9U
IExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJ
Q0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVS
UlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElU
WSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElO
Q0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBP
RiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBP
U1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLiAKKyAqLworCisjaWZuZGVmIEIzU3dpdGNoVmFsdWVf
aAorI2RlZmluZSBCM1N3aXRjaFZhbHVlX2gKKworI2luY2x1ZGUgIkIzQ29udHJvbFZhbHVlLmgi
CisjaW5jbHVkZSAiQjNTd2l0Y2hDYXNlLmgiCisKK25hbWVzcGFjZSBKU0MgeyBuYW1lc3BhY2Ug
QjMgeworCitjbGFzcyBTd2l0Y2hWYWx1ZSA6IHB1YmxpYyBDb250cm9sVmFsdWUgeworcHVibGlj
OgorICAgIHN0YXRpYyBib29sIGFjY2VwdHMoT3Bjb2RlIG9wY29kZSkgeyByZXR1cm4gb3Bjb2Rl
ID09IFN3aXRjaDsgfQorCisgICAgflN3aXRjaFZhbHVlKCk7CisKKyAgICAvLyBudW1DYXNlVmFs
dWVzKCkgKyAxID09IG51bVN1Y2Nlc3NvcnMoKS4KKyAgICB1bnNpZ25lZCBudW1DYXNlVmFsdWVz
KCkgY29uc3QgeyByZXR1cm4gbV92YWx1ZXMuc2l6ZSgpOyB9CisKKyAgICAvLyBUaGUgc3VjY2Vz
c29yIGZvciB0aGlzIGNhc2UgdmFsdWUgaXMgYXQgdGhlIHNhbWUgaW5kZXguCisgICAgaW50NjRf
dCBjYXNlVmFsdWUodW5zaWduZWQgaW5kZXgpIGNvbnN0IHsgcmV0dXJuIG1fdmFsdWVzW2ldOyB9
CisgICAgCisgICAgY29uc3QgVmVjdG9yPGludDY0X3Q+JiBjYXNlVmFsdWVzKCkgY29uc3QgeyBy
ZXR1cm4gbV92YWx1ZXM7IH0KKworICAgIEJhc2ljQmxvY2sqIGZhbGxUaHJvdWdoKCkgY29uc3Qg
eyByZXR1cm4gc3VjY2Vzc29ycygpLmxhc3QoKTsgfQorICAgIEJhc2ljQmxvY2sqJiBmYWxsVGhy
b3VnaCgpIHsgcmV0dXJuIHN1Y2Nlc3NvcnMoKS5sYXN0KCk7IH0KKworICAgIHVuc2lnbmVkIHNp
emUoKSBjb25zdCB7IHJldHVybiBudW1DYXNlVmFsdWVzKCk7IH0KKyAgICBTd2l0Y2hDYXNlIGF0
KHVuc2lnbmVkIGluZGV4KSBjb25zdAorICAgIHsKKyAgICAgICAgcmV0dXJuIFN3aXRjaENhc2Uo
Y2FzZVZhbHVlKGluZGV4KSwgc3VjY2Vzc29yKGluZGV4KSk7CisgICAgfQorICAgIFN3aXRjaENh
c2Ugb3BlcmF0b3JbXSh1bnNpZ25lZCBpbmRleCkgY29uc3QKKyAgICB7CisgICAgICAgIHJldHVy
biBhdChpbmRleCk7CisgICAgfQorCisgICAgY2xhc3MgaXRlcmF0b3IgeworICAgIHB1YmxpYzoK
KyAgICAgICAgaXRlcmF0b3IoKQorICAgICAgICAgICAgOiBtX3N3aXRjaChudWxscHRyKQorICAg
ICAgICAgICAgLCBtX2luZGV4KDApCisgICAgICAgIHsKKyAgICAgICAgfQorCisgICAgICAgIGl0
ZXJhdG9yKFN3aXRjaFZhbHVlJiBzd2l0Y2hWYWx1ZSwgdW5zaWduZWQgaW5kZXgpCisgICAgICAg
ICAgICA6IG1fc3dpdGNoKCZzd2l0Y2hWYWx1ZSkKKyAgICAgICAgICAgICwgbV9pbmRleChpbmRl
eCkKKyAgICAgICAgeworICAgICAgICB9CisKKyAgICAgICAgU3dpdGNoQ2FzZSBvcGVyYXRvcioo
KQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gbV9zd2l0Y2gtPmF0KG1faW5kZXgpOwor
ICAgICAgICB9CisKKyAgICAgICAgaXRlcmF0b3ImIG9wZXJhdG9yKysoKQorICAgICAgICB7Cisg
ICAgICAgICAgICBtX2luZGV4Kys7CisgICAgICAgICAgICByZXR1cm4gKnRoaXM7CisgICAgICAg
IH0KKworICAgICAgICBib29sIG9wZXJhdG9yPT0oY29uc3QgaXRlcmF0b3ImIG90aGVyKSBjb25z
dAorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gbV9pbmRleCA9PSBvdGhlci5tX2luZGV4
OworICAgICAgICB9CisKKyAgICAgICAgYm9vbCBvcGVyYXRvciE9KGNvbnN0IGl0ZXJhdG9yJiBv
dGhlcikgY29uc3QKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuICEoKnRoaXMgPT0gb3Ro
ZXIpOworICAgICAgICB9CisKKyAgICBwcml2YXRlOgorICAgICAgICBTd2l0Y2hWYWx1ZSogbV9z
d2l0Y2g7CisgICAgICAgIHVuc2lnbmVkIG1faW5kZXg7CisgICAgfTsKKworICAgIGl0ZXJhdG9y
IGJlZ2luKCkgY29uc3QgeyByZXR1cm4gaXRlcmF0b3IoKnRoaXMsIDApOyB9CisgICAgaXRlcmF0
b3IgZW5kKCkgY29uc3QgeyByZXR1cm4gaXRlcmF0b3IoKnRoaXMsIHNpemUoKSk7IH0KKworICAg
IC8vIFRoaXMgcmVtb3ZlcyB0aGUgY2FzZSBhbmQgcmVvcmRlcnMgdGhpbmdzIGEgYml0LiBJZiB5
b3UncmUgaXRlcmF0aW5nIHRoZSBjYXNlcyBmcm9tIDAgdG8gTiwKKyAgICAvLyB0aGVuIHlvdSBj
YW4ga2VlcCBpdGVyYXRpbmcgYWZ0ZXIgdGhpcyBzbyBsb25nIGFzIHlvdSByZXZpc2l0IHRoaXMg
c2FtZSBpbmRleCAod2hpY2ggd2lsbCBub3cKKyAgICAvLyBjb250YWluIHNvbWUgb3RoZXIgY2Fz
ZSB2YWx1ZSkuIFRoaXMgcmVtb3ZlcyB0aGUgY2FzZSB0aGF0IHdhcyByZW1vdmVkLgorICAgIFN3
aXRjaENhc2UgcmVtb3ZlQ2FzZSh1bnNpZ25lZCBpbmRleCk7CisKKyAgICB2b2lkIGFwcGVuZENh
c2UoY29uc3QgU3dpdGNoQ2FzZSYgc3dpdGNoQ2FzZSk7CisKK3Byb3RlY3RlZDoKKyAgICB2b2lk
IGR1bXBNZXRhKFByaW50U3RyZWFtJikgY29uc3Qgb3ZlcnJpZGU7CisKK3ByaXZhdGU6CisgICAg
ZnJpZW5kIGNsYXNzIFByb2NlZHVyZTsKKworICAgIFN3aXRjaFZhbHVlKHVuc2lnbmVkIGluZGV4
LCBPcmlnaW4gb3JpZ2luLCBCYXNpY0Jsb2NrKiBmYWxsVGhyb3VnaCk7Cit9OworCit9IH0gLy8g
bmFtZXNwYWNlIEpTQzo6QjMKKworI2VuZGlmIC8vIEIzU3dpdGNoVmFsdWVfaAorCkluZGV4OiBT
b3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNUeXBlLmNwcAo9PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2Uv
SmF2YVNjcmlwdENvcmUvYjMvQjNUeXBlLmNwcAkocmV2aXNpb24gMCkKKysrIFNvdXJjZS9KYXZh
U2NyaXB0Q29yZS9iMy9CM1R5cGUuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsNTQgQEAK
Ky8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTUgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVk
LgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9y
bXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3Zp
ZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVk
aXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmln
aHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dp
bmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0
IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBv
ZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBk
b2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlz
dHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5D
LiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElO
Q0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBP
RiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9T
RSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IKKyAqIENP
TlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFM
LCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xV
RElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBH
T09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBC
VVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisg
KiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9S
IFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4g
QU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJ
U0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKworI2luY2x1ZGUg
ImNvbmZpZy5oIgorI2luY2x1ZGUgIkIzVHlwZS5oIgorCisjaW5jbHVkZSA8d3RmL1ByaW50U3Ry
ZWFtLmg+CisKK25hbWVzcGFjZSBXVEYgeworCit1c2luZyBuYW1lc3BhY2UgSlNDOjpCMzsKKwor
dm9pZCBwcmludEludGVybmFsKFByaW50U3RyZWFtJiBvdXQsIFR5cGUgdHlwZSkKK3sKKyAgICBz
d2l0Y2ggKHR5cGUpIHsKKyAgICBjYXNlIFZvaWQ6CisgICAgICAgIG91dC5wcmludCgiVm9pZCIp
OworICAgICAgICByZXR1cm47CisgICAgY2FzZSBJbnQzMjoKKyAgICAgICAgb3V0LnByaW50KCJJ
bnQzMiIpOworICAgICAgICByZXR1cm47CisgICAgY2FzZSBJbnQ2NDoKKyAgICAgICAgb3V0LnBy
aW50KCJJbnQ2NCIpOworICAgICAgICByZXR1cm47CisgICAgY2FzZSBEb3VibGU6CisgICAgICAg
IG91dC5wcmludCgiRG91YmxlIik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgUkVMRUFT
RV9BU1NFUlRfTk9UX1JFQUNIRUQoKTsKK30KKworfSAvLyBuYW1lc3BhY2UgV1RGCkluZGV4OiBT
b3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNUeXBlLmgKPT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL0ph
dmFTY3JpcHRDb3JlL2IzL0IzVHlwZS5oCShyZXZpc2lvbiAwKQorKysgU291cmNlL0phdmFTY3Jp
cHRDb3JlL2IzL0IzVHlwZS5oCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsNjggQEAKKy8qCisg
KiBDb3B5cmlnaHQgKEMpIDIwMTUgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoK
KyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdp
dGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRo
YXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmli
dXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAq
ICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlz
Y2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJv
ZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25k
aXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVu
dGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0
aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFT
IElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElO
RywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJD
SEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUg
RElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IKKyAqIENPTlRSSUJV
VE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVD
SUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywg
QlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBP
UiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVT
UyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBM
SUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQK
KyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdB
WSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9G
IFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKworI2lmbmRlZiBCM1R5cGVf
aAorI2RlZmluZSBCM1R5cGVfaAorCisjaW5jbHVkZSA8d3RmL1N0ZExpYkV4dHJhcy5oPgorCitu
YW1lc3BhY2UgSlNDIHsgbmFtZXNwYWNlIEIzIHsKKworZW51bSBUeXBlIHsKKyAgICBWb2lkLAor
ICAgIEludDMyLAorICAgIEludDY0LAorICAgIERvdWJsZQorfTsKKworaW5saW5lIGJvb2wgaXNJ
bnQoVHlwZSB0eXBlKQoreworICAgIHJldHVybiB0eXBlID09IEludDMyIHx8IHR5cGUgPT0gSW50
NjQ7Cit9CisKK2lubGluZSBib29sIGlzRmxvYXQoVHlwZSB0eXBlKQoreworICAgIHJldHVybiB0
eXBlID09IERvdWJsZTsKK30KKworaW5saW5lIFR5cGUgcG9pbnRlcigpIGNvbnN0Cit7CisgICAg
aWYgKHNpemVvZih2b2lkKikgPT0gNCkKKyAgICAgICAgcmV0dXJuIEludDMyOworICAgIHJldHVy
biBJbnQ2NDsKK30KKworfSB9IC8vIG5hbWVzcGFjZSBKU0M6OkIzCisKK25hbWVzcGFjZSBXVEYg
eworCitjbGFzcyBQcmludFN0cmVhbTsKKwordm9pZCBwcmludEludGVybmFsKFByaW50U3RyZWFt
JiwgSlNDOjpCMzo6VHlwZSk7CisKK30gLy8gbmFtZXNwYWNlIFdURgorCisjZW5kaWYgLy8gQjNU
eXBlX2gKKwpJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzVXBzaWxvblZhbHVlLmNw
cAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNVcHNpbG9uVmFsdWUu
Y3BwCShyZXZpc2lvbiAwKQorKysgU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzVXBzaWxvblZh
bHVlLmNwcAkod29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDQxIEBACisvKgorICogQ29weXJpZ2h0
IChDKSAyMDE1IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3Ry
aWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhv
dXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xs
b3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBz
b3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2Us
IHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisg
KiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFi
b3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQg
dGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQv
b3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisg
KiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBB
TlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1Qg
TElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZ
IEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQu
ICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElB
QkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVY
RU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElN
SVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7
IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBU
SU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBX
SEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVE
SU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRI
RSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lC
SUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisKKyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNs
dWRlICJCM1Vwc2lsb25WYWx1ZS5oIgorCituYW1lc3BhY2UgSlNDIHsgbmFtZXNwYWNlIEIzIHsK
KworVXBzaWxvblZhbHVlOjp+VXBzaWxvblZhbHVlKCkKK3sKK30KKwordm9pZCBVcHNpbG9uVmFs
dWU6OmR1bXBNZXRhKFByaW50U3RyZWFtJiBvdXQpIGNvbnN0Cit7CisgICAgb3V0LnByaW50KCJe
IiwgbV9waGktPmluZGV4KCkpOworfQorCit9IH0gLy8gbmFtZXNwYWNlIEpTQzo6QjMKKwpJbmRl
eDogU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzVXBzaWxvblZhbHVlLmgKPT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQot
LS0gU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzVXBzaWxvblZhbHVlLmgJKHJldmlzaW9uIDAp
CisrKyBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNVcHNpbG9uVmFsdWUuaAkod29ya2luZyBj
b3B5KQpAQCAtMCwwICsxLDYwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE1IEFwcGxlIElu
Yy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGlu
IHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlv
biwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwor
ICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJl
dGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25k
aXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlv
bnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICog
ICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNj
bGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxz
IHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElT
IFBST1ZJREVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1Ig
SU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisg
KiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBB
IFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFM
TCBBUFBMRSBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNU
LCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VR
VUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NV
UkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRB
LCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNF
RCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNU
LCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1Ig
T1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMg
U09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1B
R0UuIAorICovCisKKyNpZm5kZWYgQjNVcHNpbG9uVmFsdWVfaAorI2RlZmluZSBCM1Vwc2lsb25W
YWx1ZV9oCisKKyNpbmNsdWRlICJCM1ZhbHVlLmgiCisKK25hbWVzcGFjZSBKU0MgeyBuYW1lc3Bh
Y2UgQjMgeworCitjbGFzcyBVcHNpbG9uVmFsdWUgOiBwdWJsaWMgVmFsdWUgeworcHVibGljOgor
ICAgIHN0YXRpYyBib29sIGFjY2VwdHMoT3Bjb2RlIG9wY29kZSkgeyByZXR1cm4gb3Bjb2RlID09
IFVwc2lsb247IH0KKworICAgIH5VcHNpbG9uVmFsdWUoKTsKKworICAgIFZhbHVlKiBwaGkoKSBj
b25zdCB7IHJldHVybiBtX3BoaTsgfQorCitwcm90ZWN0ZWQ6CisgICAgdm9pZCBkdW1wTWV0YShQ
cmludFN0cmVhbSYpIGNvbnN0IG92ZXJyaWRlOworCitwcml2YXRlOgorICAgIGZyaWVuZCBjbGFz
cyBQcm9jZWR1cmU7CisgICAgCisgICAgVXBzaWxvblZhbHVlKHVuc2lnbmVkIGluZGV4LCBPcmln
aW4gb3JpZ2luLCBWYWx1ZSogdmFsdWUsIFZhbHVlKiBwaGkpCisgICAgICAgIDogVmFsdWUoaW5k
ZXgsIFBoaSwgVm9pZCwgb3JpZ2luLCB2YWx1ZSkKKyAgICAgICAgLCBtX3BoaShwaGkpCisgICAg
eworICAgICAgICBBU1NFUlQodmFsdWUtPnR5cGUoKSA9PSBwaGktPnR5cGUoKSk7CisgICAgfQor
CisgICAgVmFsdWUqIG1fcGhpOworfTsKKworfSB9IC8vIG5hbWVzcGFjZSBKU0M6OkIzCisKKyNl
bmRpZiAvLyBCM1Vwc2lsb25WYWx1ZV9oCisKSW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9i
My9CM1ZhbHVlLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNW
YWx1ZS5jcHAJKHJldmlzaW9uIDApCisrKyBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNWYWx1
ZS5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSwxNjkgQEAKKy8qCisgKiBDb3B5cmlnaHQg
KEMpIDIwMTUgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJp
YnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91
dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxv
d2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNv
dXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwg
dGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAq
IDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJv
dmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0
aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9v
ciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAq
IFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFTIElTJycgQU5EIEFO
WQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBM
SU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkg
QU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4g
IElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFC
TEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhF
TVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1J
VEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsg
TE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJ
T04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdI
RVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJ
TkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhF
IFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJ
TElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKworI2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1
ZGUgIkIzVmFsdWUuaCIKKworbmFtZXNwYWNlIEpTQyB7IG5hbWVzcGFjZSBCMyB7CisKK1ZhbHVl
Ojp+VmFsdWUoKQoreworfQorCit2b2lkIFZhbHVlOjpyZXBsYWNlV2l0aElkZW50aXR5KFZhbHVl
KiB2YWx1ZSkKK3sKKyAgICAvLyBUaGlzIGlzIGEgYml0IGNyYXp5LiBJdCBkb2VzIGFuIGluLXBs
YWNlIHJlcGxhY2VtZW50IG9mIHdoYXRldmVyIFZhbHVlIHN1YmNsYXNzIHRoaXMgaXMgd2l0aAor
ICAgIC8vIGEgcGxhaW4gSWRlbnRpdHkgVmFsdWUuIFdlIGZpcnN0IGNvbGxlY3QgYWxsIG9mIHRo
ZSBpbmZvcm1hdGlvbiB3ZSBuZWVkLCB0aGVuIHdlIGRlc3RydWN0IHRoZQorICAgIC8vIHByZXZp
b3VzIHZhbHVlIGluIHBsYWNlLCBhbmQgdGhlbiB3ZSBjb25zdHJ1Y3QgdGhlIElkZW50aXR5IFZh
bHVlIGluIHBsYWNlLgorCisgICAgdW5zaWduZWQgaW5kZXggPSBtX2luZGV4OworICAgIFR5cGUg
dHlwZSA9IG1fdHlwZTsKKyAgICBPcmlnaW4gb3JpZ2luID0gbV9vcmlnaW47CisgICAgQmFzaWNC
bG9jayogb3duZXIgPSB0aGlzLT5vd25lcjsKKyAgICBWYWx1ZSogcmVwbGFjZW1lbnQgPSB0aGlz
LT5yZXBsYWNlbWVudDsKKyAgICB2b2lkKiBtaXNjID0gdGhpcy0+bWlzYzsKKworICAgIFJFTEVB
U0VfQVNTRVJUKHR5cGUgPT0gdmFsdWUtPnR5cGUoKSk7CisKKyAgICB0aGlzLT5WYWx1ZTo6flZh
bHVlKCk7CisKKyAgICBuZXcgKHRoaXMpIChpbmRleCwgSWRlbnRpZnksIHR5cGUsIG9yaWdpbiwg
dmFsdWUpOworCisgICAgdGhpcy0+b3duZXIgPSBvd25lcjsKKyAgICB0aGlzLT5yZXBsYWNlbWVu
dCA9IHJlcGxhY2VtZW50OworICAgIHRoaXMtPm1pc2MgPSBtaXNjOworfQorCit2b2lkIFZhbHVl
OjpkdW1wKFByaW50U3RyZWFtJiBvdXQpIGNvbnN0Cit7CisgICAgb3V0LnByaW50KGR1bXBQcmVm
aXgsIG1faW5kZXgpOworfQorCit2b2lkIFZhbHVlOjpkZWVwRHVtcChQcmludFN0cmVhbSYgb3V0
KSBjb25zdAoreworICAgIG91dC5wcmludChtX3R5cGUsICIgIiwgKnRoaXMsICIgPSAiLCBtX29w
Y29kZSk7CisKKyAgICBvdXQucHJpbnQoIigiKTsKKyAgICBDb21tYVByaW50ZXIgY29tbWE7Cisg
ICAgZm9yIChWYWx1ZSogY2hpbGQgOiBjaGlsZHJlbigpKQorICAgICAgICBvdXQucHJpbnQoY29t
bWEsIHBvaW50ZXJEdW1wKGNoaWxkKSk7CisKKyAgICBTdHJpbmdQcmludFN0cmVhbSBzdHJpbmdP
dXQ7CisgICAgZHVtcE1ldGEoc3RyaW5nT3V0KTsKKyAgICBDU3RyaW5nIHN0cmluZyA9IHN0cmlu
Z091dC50b0NTdHJpbmcoKTsKKyAgICBpZiAoc3RyaW5nLmxlbmd0aCgpKQorICAgICAgICBvdXQu
cHJpbnQoY29tbWEsIHN0cmluZyk7CisKKyAgICBvdXQucHJpbnQoIikiKTsKK30KKworYm9vbCBW
YWx1ZTo6aGFzSW50MzIoKSBjb25zdAoreworICAgIHJldHVybiBmYWxzZTsKK30KKworaW50MzJf
dCBWYWx1ZTo6YXNJbnQzMigpIGNvbnN0Cit7CisgICAgUkVMRUFTRV9BU1NFUlRfTk9UX1JFQUNI
RUQoKTsKKyAgICByZXR1cm4gMDsKK30KKworYm9vbCBWYWx1ZTo6aGFzSW50NjQoKSBjb25zdAor
eworICAgIHJldHVybiBmYWxzZTsKK30KKworaW50NjRfdCBWYWx1ZTo6YXNJbnQ2NCgpIGNvbnN0
Cit7CisgICAgUkVMRUFTRV9BU1NFUlRfTk9UX1JFQUNIRUQoKTsKKyAgICByZXR1cm4gMDsKK30K
KworYm9vbCBWYWx1ZTo6aGFzRG91YmxlKCkgY29uc3QKK3sKKyAgICByZXR1cm4gZmFsc2U7Cit9
CisKK2RvdWJsZSBWYWx1ZTo6YXNEb3VibGUoKSBjb25zdAoreworICAgIFJFTEVBU0VfQVNTRVJU
X05PVF9SRUFDSEVEKCk7CisgICAgcmV0dXJuIDA7Cit9CisKK3ZvaWQgVmFsdWU6OmR1bXBNZXRh
KFByaW50U3RyZWFtJikgY29uc3QKK3sKK30KKworVHlwZSBWYWx1ZTo6dHlwZUZvcihPcGNvZGUg
b3Bjb2RlLCBWYWx1ZSogZmlyc3RDaGlsZCkKK3sKKyAgICBzd2l0Y2ggKG9wY29kZSkgeworICAg
IGNhc2UgSWRlbnRpdHk6CisgICAgY2FzZSBBZGQ6CisgICAgY2FzZSBTdWI6CisgICAgY2FzZSBN
dWw6CisgICAgY2FzZSBEaXY6CisgICAgY2FzZSBDaGlsbERpdjoKKyAgICBjYXNlIE1vZDoKKyAg
ICBjYXNlIEJpdEFuZDoKKyAgICBjYXNlIEJpdE9yOgorICAgIGNhc2UgQml0WG9yOgorICAgIGNh
c2UgU2hsOgorICAgIGNhc2UgU1NocjoKKyAgICBjYXNlIFpTaHI6CisgICAgY2FzZSBDaGVja0Fk
ZDoKKyAgICBjYXNlIENoZWNrU3ViOgorICAgIGNhc2UgQ2hlY2tNdWw6CisgICAgICAgIHJldHVy
biBmaXJzdENoaWxkLT50eXBlKCk7CisgICAgY2FzZSBGcmFtZVBvaW50ZXI6CisgICAgICAgIHJl
dHVybiBwb2ludGVyKCk7CisgICAgY2FzZSBTRXh0ODoKKyAgICBjYXNlIFNFeHQxNjoKKyAgICBj
YXNlIERUb0kzMjoKKyAgICBjYXNlIEVxdWFsOgorICAgIGNhc2UgTm90RXF1YWw6CisgICAgY2Fz
ZSBMZXNzVGhhbjoKKyAgICBjYXNlIEdyZWF0ZXJUaGFuOgorICAgIGNhc2UgTGVzc0VxdWFsOgor
ICAgIGNhc2UgR3JlYXRlckVxdWFsOgorICAgIGNhc2UgQWJvdmU6CisgICAgY2FzZSBCZWxvdzoK
KyAgICBjYXNlIEFib3ZlRXF1YWw6CisgICAgY2FzZSBCZWxvd0VxdWFsOgorICAgICAgICByZXR1
cm4gSW50MzI7CisgICAgY2FzZSBTRXh0MzI6CisgICAgY2FzZSBaRXh0MzI6CisgICAgICAgIHJl
dHVybiBJbnQ2NDsKKyAgICBjYXNlIEZSb3VuZDoKKyAgICBjYXNlIElUb0Q6CisgICAgICAgIHJl
dHVybiBEb3VibGU7CisgICAgY2FzZSBOb3A6CisgICAgICAgIHJldHVybiBWb2lkOworICAgIGRl
ZmF1bHQ6CisgICAgICAgIFJFTEVBU0VfQVNTRVJUX05PVF9SRUFDSEVEKCk7CisgICAgfQorfQor
Cit9IH0gLy8gbmFtZXNwYWNlIEpTQzo6QjMKKwpJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3Jl
L2IzL0IzVmFsdWUuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNW
YWx1ZS5oCShyZXZpc2lvbiAwKQorKysgU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzVmFsdWUu
aAkod29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDE5NiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykg
MjAxNSBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRp
b24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Cisg
KiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5n
IGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNl
IGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlz
IGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4g
UmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBj
b3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBm
b2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90
aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJ
UyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisg
KiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlU
RUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQg
RklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4g
Tk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBG
T1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExB
UlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQg
VE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NT
IE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikg
SE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhF
UiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBO
RUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNF
CisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZ
IE9GIFNVQ0ggREFNQUdFLiAKKyAqLworCisjaWZuZGVmIEIzVmFsdWVfaAorI2RlZmluZSBCM1Zh
bHVlX2gKKworI2luY2x1ZGUgIkIzT3JpZ2luLmgiCisjaW5jbHVkZSAiQjNUeXBlLmgiCisjaW5j
bHVkZSA8d3RmL0Zhc3RNYWxsb2MuaD4KKyNpbmNsdWRlIDx3dGYvTm9uY29weWFibGUuaD4KKwor
bmFtZXNwYWNlIEpTQyB7IG5hbWVzcGFjZSBCMyB7CisKK2NsYXNzIFZhbHVlIHsKKyAgICBXVEZf
TUFLRV9OT05DT1BZQUJMRShWYWx1ZSk7CisgICAgV1RGX01BS0VfRkFTVF9BTExPQ0FURUQ7Citw
dWJsaWM6CisgICAgdHlwZWRlZiBWZWN0b3I8VmFsdWUqLCAzPiBBZGphY2VuY3lMaXN0OworCisg
ICAgc3RhdGljIGNvbnN0IGNoYXIqIGR1bXBQcmVmaXggPSAiQCI7CisKKyAgICBzdGF0aWMgYm9v
bCBhY2NlcHRzKE9wY29kZSkgeyByZXR1cm4gdHJ1ZTsgfQorCisgICAgdmlydHVhbCB+VmFsdWUo
KTsKKworICAgIHVuc2lnbmVkIGluZGV4KCkgY29uc3QgeyByZXR1cm4gbV9pbmRleDsgfQorICAg
IAorICAgIC8vIE5vdGUgdGhhdCB0aGUgb3Bjb2RlIGlzIGltbXV0YWJsZSwgZXhjZXB0IGZvciBy
ZXBsYWNpbmcgdmFsdWVzIHdpdGggaWRlbnRpdHkuCisgICAgT3Bjb2RlIG9wY29kZSgpIGNvbnN0
IHsgcmV0dXJuIG1fb3Bjb2RlOyB9CisKKyAgICBPcmlnaW4gb3JpZ2luKCkgY29uc3QgeyByZXR1
cm4gbV9vcmlnaW47IH0KKyAgICAKKyAgICBWYWx1ZSomIGNoaWxkKHVuc2lnbmVkIGluZGV4KSB7
IHJldHVybiBtX2NoaWxkcmVuW2luZGV4XTsgfQorICAgIFZhbHVlKiBjaGlsZCh1bnNpZ25lZCBp
bmRleCkgY29uc3QgeyByZXR1cm4gbV9jaGlsZHJlbltpbmRleF07IH0KKworICAgIC8vIFRoaXMg
Y29tcHV0ZXMgdGhlIHR5cGUgdXNpbmcgdGhlIG9wY29kZS4KKyAgICBUeXBlIHR5cGUoKSBjb25z
dCB7IHJldHVybiBtX3R5cGU7IH0KKworICAgIEFkamFjZW5jeUxpc3QmIGNoaWxkcmVuKCkgeyBy
ZXR1cm4gbV9jaGlsZHJlbjsgfSAKKyAgICBjb25zdCBBZGphY2VuY3lMaXN0JiBjaGlsZHJlbigp
IGNvbnN0IHsgcmV0dXJuIG1fY2hpbGRyZW47IH0KKworICAgIHZvaWQgcmVwbGFjZVdpdGhJZGVu
dGl0eShWYWx1ZSopOworICAgIHZvaWQgcmVwbGFjZVdpdGhOb3AoKTsKKworICAgIHZvaWQgZHVt
cChQcmludFN0cmVhbSYpIGNvbnN0OworICAgIHZvaWQgZGVlcER1bXAoUHJpbnRTdHJlYW0mKSBj
b25zdDsKKworICAgIC8vIFRoaXMgaXMgaG93IHlvdSBjYXN0IFZhbHVlcy4gRm9yIGV4YW1wbGUs
IGlmIHlvdSB3YW50IHRvIGRvIHNvbWV0aGluZyBwcm92aWRlZCB0aGF0IHdlIGhhdmUgYQorICAg
IC8vIEFyZ3VtZW50UmVnVmFsdWUsIHlvdSBjYW4gZG86CisgICAgLy8KKyAgICAvLyBpZiAoQXJn
dW1lbnRSZWdWYWx1ZSogYXJndW1lbnRSZWcgPSB2YWx1ZS0+YXM8QXJndW1lbnRSZWdWYWx1ZT4o
KSkgeworICAgIC8vICAgICB0aGluZ3MKKyAgICAvLyB9CisgICAgLy8KKyAgICAvLyBUaGlzIHdp
bGwgcmV0dXJuIG51bGwgaWYgdGhpcyBvcGNvZGUoKSAhPSBBcmd1bWVudFJlZy4gVGhpcyB3b3Jr
cyBiZWNhdXNlIHRoaXMgcmV0dXJucyBudWxscHRyCisgICAgLy8gaWYgVDo6YWNjZXB0cyhvcGNv
ZGUoKSkgcmV0dXJucyBmYWxzZS4KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorICAgIFQqIGFz
KCk7CisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4KKyAgICBjb25zdCBUKiBhcygpIGNvbnN0Owor
ICAgIAorICAgIGJvb2wgaGFzSW50MzIoKSBjb25zdDsKKyAgICBpbnQzMl90IGFzSW50MzIoKSBj
b25zdDsKKyAgICAKKyAgICBib29sIGhhc0ludDY0KCkgY29uc3Q7CisgICAgaW50NjRfdCBhc0lu
dDY0KCkgY29uc3Q7CisKKyAgICBib29sIGhhc0ludCgpIGNvbnN0OworICAgIGludDY0X3QgYXNJ
bnQoKSBjb25zdDsKKyAgICBib29sIGlzSW50KGludDY0X3QgdmFsdWUpIGNvbnN0OworCisgICAg
Ym9vbCBoYXNEb3VibGUoKSBjb25zdDsKKyAgICBkb3VibGUgYXNEb3VibGUoKSBjb25zdDsKKwor
ICAgIFN0YWNrbWFwKiBzdGFja21hcCgpOworCitwcm90ZWN0ZWQ6CisgICAgdmlydHVhbCB2b2lk
IGR1bXBNZXRhKFByaW50U3RyZWFtJikgY29uc3Q7CisgICAgCitwcml2YXRlOgorICAgIGZyaWVu
ZCBjbGFzcyBQcm9jZWR1cmU7CisgICAgCisgICAgLy8gSW5zdGFudGlhdGUgdmFsdWVzIHZpYSBQ
cm9jZWR1cmUuCisgICAgLy8gVGhpcyBmb3JtIHJlcXVpcmVzIHNwZWNpZnlpbmcgdGhlIHR5cGUg
ZXhwbGljaXRseToKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZS4uLiBBcmd1bWVudHM+CisgICAgZXhw
bGljaXQgVmFsdWUodW5zaWduZWQgaW5kZXgsIE9wY29kZSBvcGNvZGUsIFR5cGUgdHlwZSwgT3Jp
Z2luIG9yaWdpbiwgVmFsdWUqIGZpcnN0Q2hpbGQsIEFyZ3VtZW50cy4uLiBhcmd1bWVudHMpCisg
ICAgICAgIDogbV9pbmRleChpbmRleCkKKyAgICAgICAgLCBtX29wY29kZShvcGNvZGUpCisgICAg
ICAgICwgbV90eXBlKHR5cGUpCisgICAgICAgICwgbV9vcmlnaW4ob3JpZ2luKQorICAgICAgICAs
IG1fY2hpbGRyZW57IGZpcnN0Q2hpbGQsIGFyZ3VtZW50cy4uLiB9CisgICAgeworICAgIH0KKyAg
ICAvLyBUaGlzIGZvcm0gaXMgZm9yIHNwZWNpZnlpbmcgdGhlIHR5cGUgZXhwbGljaXRseSB3aGVu
IHRoZSBvcGNvZGUgaGFzIG5vIGNoaWxkcmVuOgorICAgIGV4cGxpY2l0IFZhbHVlKHVuc2lnbmVk
IGluZGV4LCBPcGNvZGUgb3Bjb2RlLCBUeXBlIHR5cGUsIE9yaWdpbiBvcmlnaW4pCisgICAgICAg
IDogbV9pbmRleChpbmRleCkKKyAgICAgICAgLCBtX29wY29kZShvcGNvZGUpCisgICAgICAgICwg
bV90eXBlKHR5cGUpCisgICAgICAgICwgbV9vcmlnaW4ob3JpZ2luKQorICAgIHsKKyAgICB9Cisg
ICAgLy8gVGhpcyBmb3JtIGlzIGZvciB0aG9zZSBvcGNvZGVzIHRoYXQgY2FuIGluZmVyIHRoZWly
IHR5cGUgZnJvbSB0aGUgb3Bjb2RlIGFuZCBmaXJzdCBjaGlsZDoKKyAgICB0ZW1wbGF0ZTx0eXBl
bmFtZS4uLiBBcmd1bWVudHM+CisgICAgZXhwbGljaXQgVmFsdWUodW5zaWduZWQgaW5kZXgsIE9w
Y29kZSBvcGNvZGUsIE9yaWdpbiBvcmlnaW4sIFZhbHVlKiBmaXJzdENoaWxkLCBBcmd1bWVudHMu
Li4gYXJndW1lbnRzKQorICAgICAgICA6IG1faW5kZXgoaW5kZXgpCisgICAgICAgICwgbV9vcGNv
ZGUob3Bjb2RlKQorICAgICAgICAsIG1fdHlwZSh0eXBlRm9yKG9wY29kZSwgZmlyc3RDaGlsZCkp
CisgICAgICAgICwgbV9vcmlnaW4ob3JpZ2luKQorICAgICAgICAsIG1fY2hpbGRyZW57IGZpcnN0
Q2hpbGQsIGFyZ3VtZW50cy4uLiB9CisgICAgeworICAgIH0KKyAgICAvLyBUaGlzIGZvcm0gaXMg
Zm9yIHRob3NlIG9wY29kZXMgdGhhdCBjYW4gaW5mZXIgdGhlaXIgdHlwZSBmcm9tIHRoZSBvcGNv
ZGUgYWxvbmUsIGFuZCB0aGF0IGRvbid0CisgICAgLy8gdGFrZSBhbnkgYXJndW1lbnRzOgorICAg
IGV4cGxpY2l0IFZhbHVlKHVuc2lnbmVkIGluZGV4LCBPcGNvZGUgb3Bjb2RlLCBPcmlnaW4gb3Jp
Z2luKQorICAgICAgICA6IG1faW5kZXgoaW5kZXgpCisgICAgICAgICwgbV9vcGNvZGUob3Bjb2Rl
KQorICAgICAgICAsIG1fdHlwZSh0eXBlRm9yKG9wY29kZSwgbnVsbHB0cikpCisgICAgICAgICwg
bV9vcmlnaW4ob3JpZ2luKQorICAgIHsKKyAgICB9CisgICAgLy8gVXNlIHRoaXMgZm9ybSBmb3Ig
dmFyYXJncy4KKyAgICBleHBpY2l0IFZhbHVlKHVuc2lnbmVkIGluZGV4LCBPcGNvZGUgb3Bjb2Rl
LCBUeXBlIHR5cGUsIE9yaWdpbiBvcmlnaW4sIGNvbnN0IEFkamFjZW5jeUxpc3QmIGNoaWxkcmVu
KQorICAgICAgICA6IG1faW5kZXgoaW5kZXgpCisgICAgICAgICwgbV9vcGNvZGUob3Bjb2RlKQor
ICAgICAgICAsIG1fdHlwZSh0eXBlKQorICAgICAgICAsIG1fb3JpZ2luKG9yaWdpbikKKyAgICAg
ICAgLCBtX2NoaWxkcmVuKGNoaWxkcmVuKQorICAgIHsKKyAgICB9CisKKyAgICBzdGF0aWMgVHlw
ZSB0eXBlRm9yKE9wY29kZSwgVmFsdWUqIGZpcnN0Q2hpbGQpOworCisgICAgLy8gVGhpcyBncm91
cCBvZiBmaWVsZHMgaXMgYXJyYW5nZWQgdG8gZml0IGluIDY0IGJpdHMuCisgICAgdW5zaWduZWQg
bV9pbmRleDsKKyAgICBPcGNvZGUgbV9vcGNvZGU7CisgICAgVHlwZSBtX3R5cGU7CisgICAgCisg
ICAgT3JpZ2luIG1fb3JpZ2luOworICAgIEFkamFjZW5jeUxpc3QgbV9jaGlsZHJlbjsKKworcHVi
bGljOgorICAgIEJhc2ljQmxvY2sqIG93bmVyIHsgbnVsbHB0ciB9OyAvLyBjb21wdXRlZCBsYXpp
bHkuCisgICAgVmFsdWUqIHJlcGxhY2VtZW50IHsgbnVsbHB0ciB9OyAvLyB1c2VkIGZvciBhbmFs
eXNlcyBhbmQgdHJhbnNmb3JtYXRpb25zLgorICAgIHZvaWQqIG1pc2MgeyBudWxscHRyIH07Cit9
OworCitjbGFzcyBEZWVwVmFsdWVEdW1wIHsKK3B1YmxpYzoKKyAgICBEZWVwVmFsdWVEdW1wKFZh
bHVlKiB2YWx1ZSkKKyAgICAgICAgOiBtX3ZhbHVlKHZhbHVlKQorICAgIHsKKyAgICB9CisKKyAg
ICB2b2lkIGR1bXAoUHJpbnRTdHJlYW0mIG91dCkgY29uc3QKKyAgICB7CisgICAgICAgIGlmICht
X3ZhbHVlKQorICAgICAgICAgICAgbV92YWx1ZS0+ZGVlcER1bXAob3V0KTsKKyAgICAgICAgZWxz
ZQorICAgICAgICAgICAgb3V0LnByaW50KCI8bnVsbD4iKTsKKyAgICB9CisKK3ByaXZhdGU6Cisg
ICAgVmFsdWUqIG1fdmFsdWU7Cit9OworCitEZWVwVmFsdWVEdW1wIGRlZXBEdW1wKFZhbHVlKiB2
YWx1ZSkKK3sKKyAgICByZXR1cm4gRGVlcFZhbHVlRHVtcCh2YWx1ZSk7Cit9CisKK30gfSAvLyBu
YW1lc3BhY2UgSlNDOjpCMworCisjZW5kaWYgLy8gQjNWYWx1ZV9oCisKSW5kZXg6IFNvdXJjZS9K
YXZhU2NyaXB0Q29yZS9iMy9CM1ZhbHVlSW5saW5lcy5oCj09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9K
YXZhU2NyaXB0Q29yZS9iMy9CM1ZhbHVlSW5saW5lcy5oCShyZXZpc2lvbiAwKQorKysgU291cmNl
L0phdmFTY3JpcHRDb3JlL2IzL0IzVmFsdWVJbmxpbmVzLmgJKHdvcmtpbmcgY29weSkKQEAgLTAs
MCArMSwxMDkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTUgQXBwbGUgSW5jLiBBbGwgcmln
aHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFu
ZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVy
bWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0
OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBh
Ym92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5k
IHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5h
cnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2Us
IHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4g
dGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQg
d2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQg
QlkgQVBQTEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdB
UlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQg
V0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxB
UgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElO
Qy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNU
LCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERB
TUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0Yg
U1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQ
Uk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBB
TlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBM
SUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0Up
IEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwg
RVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8K
KworI2lmbmRlZiBCM1ZhbHVlSW5saW5lc19oCisjZGVmaW5lIEIzVmFsdWVJbmxpbmVzX2gKKwor
I2luY2x1ZGUgIkIzQ2hlY2tWYWx1ZS5oIgorI2luY2x1ZGUgIkIzQ29uc3QzMlZhbHVlLmgiCisj
aW5jbHVkZSAiQjNDb25zdDY0VmFsdWUuaCIKKyNpbmNsdWRlICJCM0NvbnN0RG91YmxlVmFsdWUu
aCIKKyNpbmNsdWRlICJCM1BhdGNocG9pbnRWYWx1ZS5oIgorI2luY2x1ZGUgIkIzVmFsdWUuaCIK
KworbmFtZXNwYWNlIEpTQyB7IG5hbWVzcGFjZSBCMyB7CisKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+
CitUKiBWYWx1ZTo6YXMoKQoreworICAgIGlmIChUOjphY2NlcHRzKG9wY29kZSgpKSkKKyAgICAg
ICAgcmV0dXJuIHN0YXRpY19jYXN0PFQqPih0aGlzKTsKKyAgICByZXR1cm4gbnVsbHB0cjsKK30K
KwordGVtcGxhdGU+dHlwZW5hbWUgVD4KK2NvbnN0IFQqIFZhbHVlOjphcygpIGNvbnN0Cit7Cisg
ICAgcmV0dXJuIGNvbnN0X2Nhc3Q8VmFsdWUqPih0aGlzKS0+YXM8VD4oKTsKK30KKworYm9vbCBW
YWx1ZTo6aGFzSW50MzIoKSBjb25zdAoreworICAgIHJldHVybiAhIWFzPENvbnN0MzJWYWx1ZT4o
KTsKK30KKworaW50MzJfdCBWYWx1ZTo6YXNJbnQzMigpIGNvbnN0Cit7CisgICAgcmV0dXJuIGFz
PENvbnN0MzJWYWx1ZT4oKS0+dmFsdWUoKTsKK30KKworYm9vbCBWYWx1ZTo6aGFzSW50NjQoKSBj
b25zdAoreworICAgIHJldHVybiAhIWFzPENvbnN0NjRWYWx1ZT4oKTsKK30KKworaW50NjRfdCBW
YWx1ZTo6YXNJbnQ2NCgpIGNvbnN0Cit7CisgICAgcmV0dXJuIGFzPENvbnN0NjRWYWx1ZT4oKS0+
dmFsdWUoKTsKK30KKworYm9vbCBWYWx1ZTo6aGFzSW50KCkgY29uc3QKK3sKKyAgICByZXR1cm4g
aGFzSW50MzIoKSB8fCBoYXNJbnQ2NCgpOworfQorCitpbnQ2NF90IFZhbHVlOjphc0ludCgpIGNv
bnN0Cit7CisgICAgcmV0dXJuIGhhc0ludDMyKCkgPyBhc0ludDMyKCkgOiBhc0ludDY0KCk7Cit9
CisKK2Jvb2wgVmFsdWU6OmlzSW50KGludDY0X3QgdmFsdWUpIGNvbnN0Cit7CisgICAgcmV0dXJu
IGhhc0ludCgpICYmIGFzSW50KCkgPT0gdmFsdWU7Cit9CisKK2Jvb2wgVmFsdWU6Omhhc0RvdWJs
ZSgpIGNvbnN0Cit7CisgICAgcmV0dXJuICEhYXM8Q29uc3REb3VibGVWYWx1ZT4oKTsKK30KKwor
ZG91YmxlIFZhbHVlOjphc0RvdWJsZSgpIGNvbnN0Cit7CisgICAgcmV0dXJuIGFzPENvbnN0RG91
YmxlVmFsdWU+KCktPnZhbHVlKCk7Cit9CisKK1N0YWNrbWFwKiBWYWx1ZTo6c3RhY2ttYXAoKQor
eworICAgIGlmIChDaGVja1ZhbHVlKiBjaGVjayA9IGFzPENoZWNrVmFsdWU+KCkpCisgICAgICAg
IHJldHVybiAmY2hlY2stPnN0YWNrbWFwOworICAgIGlmIChQYXRjaHBvaW50VmFsdWUqIHBhdGNo
cG9pbnQgPSBhczxQYXRjaHBvaW50VmFsdWU+KCkpCisgICAgICAgIHJldHVybiAmcGF0Y2hwb2lu
dC0+c3RhY2ttYXA7CisgICAgcmV0dXJuIG51bGxwdHI7Cit9CisKK30gfSAvLyBuYW1lc3BhY2Ug
SlNDOjpCMworCisjZW5kaWYgLy8gQjNWYWx1ZUlubGluZXNfaAorCkluZGV4OiBTb3VyY2UvSmF2
YVNjcmlwdENvcmUvYjMvQjNWYWx1ZVJlcC5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL0phdmFT
Y3JpcHRDb3JlL2IzL0IzVmFsdWVSZXAuY3BwCShyZXZpc2lvbiAwKQorKysgU291cmNlL0phdmFT
Y3JpcHRDb3JlL2IzL0IzVmFsdWVSZXAuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsODYg
QEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTUgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2Vy
dmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkg
Zm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHBy
b3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4g
UmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5
cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xs
b3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBt
dXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlz
dCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAg
ICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUg
ZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUg
SU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMs
IElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElF
UyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVS
UE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IKKyAq
IENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVO
VEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElO
Q0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVU
RSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBP
UiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZ
CisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFks
IE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcg
SU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBB
RFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKworI2luY2x1
ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgIkIzVmFsdWVSZXAuaCIKKworbmFtZXNwYWNlIEpTQyB7
IG5hbWVzcGFjZSBCMyB7CisKK3ZvaWQgVmFsdWVSZXA6OmR1bXAoUHJpbnRTdHJlYW0mIG91dCkg
Y29uc3QKK3sKKyAgICBvdXQucHJpbnQobV9raW5kKTsKKyAgICBzd2l0Y2ggKG1fa2luZCkgewor
ICAgIGNhc2UgTm9uZToKKyAgICBjYXNlIFNvbWVSZWdpc3RlcjoKKyAgICAgICAgcmV0dXJuOwor
ICAgIGNhc2UgUmVnaXN0ZXI6CisgICAgICAgIG91dC5wcmludCgiKCIsIHJlZygpLCAiKSIpOwor
ICAgICAgICByZXR1cm47CisgICAgY2FzZSBTdGFjazoKKyAgICAgICAgb3V0LnByaW50KCIoIiwg
b2Zmc2V0RnJvbUZQKCksICIpIik7CisgICAgICAgIHJldHVybjsKKyAgICBjYXNlIFN0YWNrQXJn
dW1lbnQ6CisgICAgICAgIG91dC5wcmludCgiKCIsIG9mZnNldEZyb21TUCgpLCAiKSIpOworICAg
ICAgICByZXR1cm47CisgICAgY2FzZSBDb25zdGFudDoKKyAgICAgICAgb3V0LnByaW50KCIoIiwg
dmFsdWUoKSwgIikiKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBSRUxFQVNFX0FTU0VS
VF9OT1RfUkVBQ0hFRCgpOworfQorCit9IH0gLy8gbmFtZXNwYWNlIEpTQzo6QjMKKworbmFtZXNw
YWNlIFdURiB7CisKK3VzaW5nIG5hbWVzcGFjZSBKU0M6OkIzOworCit2b2lkIHByaW50SW50ZXJu
YWwoUHJpbnRTdHJlYW0mIG91dCwgVmFsdWVSZXA6OktpbmQga2luZCkKK3sKKyAgICBzd2l0Y2gg
KGtpbmQpIHsKKyAgICBjYXNlIFZhbHVlUmVwOjpBbnk6CisgICAgICAgIG91dC5wcmludCgiQW55
Iik7CisgICAgICAgIHJldHVybjsKKyAgICBjYXNlIFZhbHVlUmVwOjpTb21lUmVnaXN0ZXI6Cisg
ICAgICAgIG91dC5wcmludCgiU29tZVJlZ2lzdGVyIik7CisgICAgICAgIHJldHVybjsKKyAgICBj
YXNlIFZhbHVlUmVwOjpSZWdpc3RlcjoKKyAgICAgICAgb3V0LnByaW50KCJSZWdpc3RlciIpOwor
ICAgICAgICByZXR1cm47CisgICAgY2FzZSBWYWx1ZVJlcDo6U3RhY2s6CisgICAgICAgIG91dC5w
cmludCgiU3RhY2siKTsKKyAgICAgICAgcmV0dXJuOworICAgIGNhc2UgVmFsdWVSZXA6OlN0YWNr
QXJndW1lbnQ6CisgICAgICAgIG91dC5wcmludCgiU3RhY2tBcmd1bWVudCIpOworICAgICAgICBy
ZXR1cm47CisgICAgY2FzZSBWYWx1ZVJlcDo6Q29uc3RhbnQ6CisgICAgICAgIG91dC5wcmludCgi
Q29uc3RhbnQiKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBSRUxFQVNFX0FTU0VSVF9O
T1RfUkVBQ0hFRCgpOworfQorCit9IC8vIG5hbWVzcGFjZSBXVEYKKwpJbmRleDogU291cmNlL0ph
dmFTY3JpcHRDb3JlL2IzL0IzVmFsdWVSZXAuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNj
cmlwdENvcmUvYjMvQjNWYWx1ZVJlcC5oCShyZXZpc2lvbiAwKQorKysgU291cmNlL0phdmFTY3Jp
cHRDb3JlL2IzL0IzVmFsdWVSZXAuaAkod29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDE1NiBAQAor
LyoKKyAqIENvcHlyaWdodCAoQykgMjAxNSBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQu
CisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jt
cywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlk
ZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRp
c3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdo
dAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2lu
ZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3Qg
cmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9m
IGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRv
Y3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0
cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMu
IGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5D
TFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9G
IE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NF
IEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUgorICogQ09O
VFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUws
IFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVE
SU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdP
T0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJV
U0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAq
IE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1Ig
VE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBB
TlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklT
RUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLiAKKyAqLworCisjaWZuZGVmIEIz
VmFsdWVSZXBfaAorI2RlZmluZSBCM1ZhbHVlUmVwX2gKKworI2luY2x1ZGUgIlJlZy5oIgorI2lu
Y2x1ZGUgPHd0Zi9QcmludFN0cmVhbS5oPgorCituYW1lc3BhY2UgSlNDIHsgbmFtZXNwYWNlIEIz
IHsKKworLy8gV2UgdXNlIHRoaXMgY2xhc3MgdG8gZGVzY3JpYmUgdmFsdWUgcmVwcmVzZW50YXRp
b25zIGF0IHN0YWNrbWFwcy4gSXQncyB1c2VkIGJvdGggdG8gZm9yY2UgYQorLy8gcmVwcmVzZW50
YXRpb24gYW5kIHRvIGdldCB0aGUgcmVwcmVzZW50YXRpb24uIFdoZW4gdGhlIEIzIGNsaWVudCBm
b3JjZXMgYSByZXByZXNlbnRhdGlvbiwgd2Ugc2F5CisvLyB0aGF0IGl0J3MgYW4gaW5wdXQuIFdo
ZW4gQjMgdGVsbHMgdGhlIGNsaWVudCB3aGF0IHJlcHJlc2VudGF0aW9uIGl0IHBpY2tlZCwgd2Ug
c2F5IHRoYXQgaXQncyBhbgorLy8gb3V0cHV0LgorCitjbGFzcyBWYWx1ZVJlcCB7CitwdWJsaWM6
CisgICAgZW51bSBLaW5kIHsKKyAgICAgICAgLy8gQXMgYW4gaW5wdXQgcmVwcmVzZW50YXRpb24s
IHRoaXMgbWVhbnMgdGhhdCBCMyBjYW4gcGljayBhbnkgcmVwcmVzZW50YXRpb24uCisgICAgICAg
IEFueSwKKworICAgICAgICAvLyBBcyBhbiBpbnB1dCByZXByZXNlbnRhdGlvbiwgdGhpcyBtZWFu
cyB0aGF0IEIzIHNob3VsZCBwaWNrIHNvbWUgcmVnaXN0ZXIsIHByb3ZpZGVkIHRoYXQKKyAgICAg
ICAgLy8gaXQncyBub3QgYWxzbyBhIHJlZ2lzdGVyIHRoYXQgd2FzIGNsb2JiZXJlZC4KKyAgICAg
ICAgU29tZVJlZ2lzdGVyLAorCisgICAgICAgIC8vIEFzIGFuIGlucHV0IHJlcHJlc2VudGF0aW9u
LCB0aGlzIGZvcmNlcyBhIHBhcnRpY3VsYXIgcmVnaXN0ZXIuIEFzIGFuIG91dHB1dAorICAgICAg
ICAvLyByZXByZXNlbnRhdGlvbiwgdGhpcyB0ZWxscyB1cyB3aGF0IHJlZ2lzdGVyIEIzIHBpY2tl
ZC4KKyAgICAgICAgUmVnaXN0ZXIsCisKKyAgICAgICAgLy8gQXMgYW4gb3V0cHV0IHJlcHJlc2Vu
dGF0aW9uLCB0aGlzIHRlbGxzIHVzIHdoYXQgc3RhY2sgc2xvdCBCMyBwaWNrZWQuIEl0J3Mgbm90
IGEgdmFsaWQKKyAgICAgICAgLy8gaW5wdXQgcmVwcmVzZW50YXRpb24uCisgICAgICAgIFN0YWNr
LAorCisgICAgICAgIC8vIEFzIGFuIGlucHV0IHJlcHJlc2VudGF0aW9uLCB0aGlzIGZvcmNlcyB0
aGUgdmFsdWUgdG8gZW5kIHVwIGluIHRoZSBhcmd1bWVudCBhcmVhIGF0IHNvbWUKKyAgICAgICAg
Ly8gb2Zmc2V0LgorICAgICAgICBTdGFja0FyZ3VtZW50LAorCisgICAgICAgIC8vIEFzIGFuIG91
dHB1dCByZXByZXNlbnRhdGlvbiwgdGhpcyB0ZWxscyB1cyB0aGF0IEIzIGNvbnN0YW50LWZvbGRl
ZCB0aGUgdmFsdWUuCisgICAgICAgIENvbnN0YW50CisgICAgfTsKKyAgICAKKyAgICBWYWx1ZVJl
cCgpCisgICAgICAgIDogbV9raW5kKEFueSkKKyAgICB7CisgICAgfQorCisgICAgZXhwbGljaXQg
VmFsdWVSZXAoUmVnIHJlZykKKyAgICAgICAgOiBtX2tpbmQoUmVnaXN0ZXIpCisgICAgICAgICwg
bV92YWx1ZShyZWcuaW5kZXgoKSkKKyAgICB7CisgICAgfQorCisgICAgc3RhdGljIFZhbHVlUmVw
IHJlZyhSZWcgcmVnKQorICAgIHsKKyAgICAgICAgcmV0dXJuIFZhbHVlUmVwKHJlZyk7CisgICAg
fQorCisgICAgc3RhdGljIFZhbHVlUmVwIHN0YWNrKGludHB0cl90IG9mZnNldEZyb21GUCkKKyAg
ICB7CisgICAgICAgIFZhbHVlUmVwIHJlc3VsdDsKKyAgICAgICAgcmVzdWx0Lm1fa2luZCA9IFN0
YWNrOworICAgICAgICByZXN1bHQubV92YWx1ZSA9IG9mZnNldEZyb21GUDsKKyAgICB9CisKKyAg
ICBzdGF0aWMgVmFsdWVSZXAgc3RhY2tBcmd1bWVudChpbnRwdHJfdCBvZmZzZXRGcm9tU1ApCisg
ICAgeworICAgICAgICBWYWx1ZVJlcCByZXN1bHQ7CisgICAgICAgIHJlc3VsdC5tX2tpbmQgPSBT
dGFja0FyZ3VtZW50OworICAgICAgICByZXN1bHQubV92YWx1ZSA9IG9mZnNldEZyb21TUDsKKyAg
ICB9CisKKyAgICBzdGF0aWMgVmFsdWVSZXAgY29uc3RhbnQoaW50NjRfdCB2YWx1ZSkKKyAgICB7
CisgICAgICAgIFZhbHVlUmVwIHJlc3VsdDsKKyAgICAgICAgcmVzdWx0Lm1fa2luZCA9IENvbnN0
YW50OworICAgICAgICByZXN1bHQubV92YWx1ZSA9IHZhbHVlOworICAgIH0KKworICAgIHN0YXRp
YyBWYWx1ZVJlcCBjb25zdGFudChkb3VibGUgdmFsdWUpCisgICAgeworICAgICAgICByZXR1cm4g
VmFsdWVSZXAoYml0d2lzZV9jYXN0PGludDY0X3Q+KHZhbHVlKSk7CisgICAgfQorCisgICAgS2lu
ZCBraW5kKCkgY29uc3QgeyByZXR1cm4gbV9raW5kOyB9CisKKyAgICBleHBsaWNpdCBvcGVyYXRv
ciBib29sKCkgY29uc3QgeyByZXR1cm4ga2luZCgpICE9IEFueTsgfQorCisgICAgUmVnIHJlZygp
IGNvbnN0CisgICAgeworICAgICAgICBBU1NFUlQoa2luZCgpID09IFJlZ2lzdGVyKTsKKyAgICAg
ICAgcmV0dXJuIFJlZzo6ZnJvbUluZGV4KG1fdmFsdWUpOworICAgIH0KKworICAgIGludHB0cl90
IG9mZnNldEZyb21GUCgpIGNvbnN0CisgICAgeworICAgICAgICBBU1NFUlQoa2luZCgpID09IFN0
YWNrKTsKKyAgICAgICAgcmV0dXJuIHN0YXRpY19jYXN0PGludHB0cl90PihtX3ZhbHVlKTsKKyAg
ICB9CisKKyAgICBpbnRwdHJfdCBvZmZzZXRGcm9tU1AoKSBjb25zdAorICAgIHsKKyAgICAgICAg
QVNTRVJUKGtpbmQoKSA9PSBTdGFja0FyZ3VtZW50KTsKKyAgICAgICAgcmV0dXJuIHN0YXRpY19j
YXN0PGludHB0cl90PihtX3ZhbHVlKTsKKyAgICB9CisKKyAgICBpbnQ2NF90IHZhbHVlKCkgY29u
c3QKKyAgICB7CisgICAgICAgIEFTU0VSVChraW5kKCkgPT0gQ29uc3RhbnQpOworICAgICAgICBy
ZXR1cm4gbV92YWx1ZTsKKyAgICB9CisKKyAgICBkb3VibGUgZG91YmxlVmFsdWUoKSBjb25zdAor
ICAgIHsKKyAgICAgICAgcmV0dXJuIGJpdHdpc2VfY2FzdDxkb3VibGU+KHZhbHVlKCkpOworICAg
IH0KKworICAgIHZvaWQgZHVtcChQcmludFN0cmVhbSYpIGNvbnN0OworCitwcml2YXRlOgorICAg
IEtpbmQgbV9raW5kOworICAgIGludDY0X3QgbV92YWx1ZTsKK307CisKK30gfSAvLyBuYW1lc3Bh
Y2UgSlNDOjpCMworCituYW1lc3BhY2UgV1RGIHsKKwordm9pZCBwcmludEludGVybmFsKFByaW50
U3RyZWFtJiwgSlNDOjpCMzo6VmFsdWVSZXA6OktpbmQpOworCit9IC8vIG5hbWVzcGFjZSBXVEYK
KworI2VuZGlmIC8vIEIzVmFsdWVSZXBfaAorCkluZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUv
YjMvZ2VuZXJhdGVfcGF0dGVybl9tYXRjaGVyLnJiCj09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZh
U2NyaXB0Q29yZS9iMy9nZW5lcmF0ZV9wYXR0ZXJuX21hdGNoZXIucmIJKHJldmlzaW9uIDApCisr
KyBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvZ2VuZXJhdGVfcGF0dGVybl9tYXRjaGVyLnJiCSh3
b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsNDc1IEBACisjIS91c3IvYmluL2VudiBydWJ5CisKKyMg
Q29weXJpZ2h0IChDKSAyMDE1IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyMKKyMg
UmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBv
ciB3aXRob3V0CisjIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRo
ZSBmb2xsb3dpbmcgY29uZGl0aW9ucworIyBhcmUgbWV0OgorIyAxLiBSZWRpc3RyaWJ1dGlvbnMg
b2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorIyAgICBub3Rp
Y2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIu
CisjIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUg
YWJvdmUgY29weXJpZ2h0CisjICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5k
IHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyMgICAgZG9jdW1lbnRhdGlvbiBhbmQv
b3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyMKKyMg
VEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIEFORCBJVFMgQ09OVFJJQlVU
T1JTIGBgQVMgSVMnJworIyBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJ
TkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyMgVEhFIElNUExJRUQgV0FSUkFOVElFUyBP
RiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorIyBQVVJQT1NF
IEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SIElUUyBDT05U
UklCVVRPUlMKKyMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRB
TCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgorIyBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xV
RElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgorIyBTVUJTVElUVVRFIEdP
T0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5F
U1MKKyMgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBM
SUFCSUxJVFksIFdIRVRIRVIgSU4KKyMgQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRP
UlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKyMgQVJJU0lORyBJTiBBTlkg
V0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRgor
IyBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKK3JlcXVpcmUgInBhdGhuYW1lIgor
CiskdmFySW5kZXggPSAwCitkZWYgbmV3VmFyCisgICAgJHZhckluZGV4ICs9IDEKKyAgICAiX3Rt
cCN7JHZhckluZGV4fSIKK2VuZAorCitjbGFzcyBQcm9kdWN0aW9uCisgICAgYXR0cl9yZWFkZXIg
Om9yaWdpbiwgOm5hbWUsIDp2YXJOYW1lLCA6YW5vbnltb3VzLCA6b3Bjb2RlLCA6Y2hpbGRyZW4K
KworICAgIGRlZiBpbml0aWFsaXplKG9yaWdpbiwgbmFtZSwgb3Bjb2RlLCBjaGlsZHJlbikKKyAg
ICAgICAgQG9yaWdpbiA9IG9yaWdpbgorICAgICAgICBAbmFtZSA9IG5hbWUKKyAgICAgICAgQGFu
b255bW91cyA9IChuYW1lID09IG5pbCBvciBuYW1lID1+IC9cQVwkKFswLTldKylcWi8pCisgICAg
ICAgIEB2YXJOYW1lID0gQGFub255bW91cyA/IG5ld1ZhciA6IG5hbWUKKyAgICAgICAgQG9wY29k
ZSA9IG9wY29kZQorICAgICAgICBAY2hpbGRyZW4gPSBjaGlsZHJlbiA/IGNoaWxkcmVuIDogW10K
KyAgICBlbmQKKworICAgIGRlZiBoYXNPcGNvZGUKKyAgICAgICAgb3Bjb2RlICE9IG5pbAorICAg
IGVuZAorCisgICAgZGVmIGVhY2hWYXJpYWJsZSgmcHJvYykKKyAgICAgICAgY2hpbGRyZW4uZWFj
aF93aXRoX2luZGV4IHsKKyAgICAgICAgICAgIHwgY2hpbGQsIGluZGV4IHwKKyAgICAgICAgICAg
IHlpZWxkIHZhck5hbWUsCisgICAgICAgICAgICAgICAgICBjaGlsZC5uYW1lLAorICAgICAgICAg
ICAgICAgICAgY2hpbGQudmFyTmFtZSwKKyAgICAgICAgICAgICAgICAgIGNoaWxkLmFub255bW91
cyA/IChjaGlsZC5vcGNvZGUgPyA6YW5vbkludGVybmFsIDogOmFub25PcGVyYW5kKSA6IChjaGls
ZC5vcGNvZGUgPyA6aW50ZXJuYWwgOiA6b3BlcmFuZCksCisgICAgICAgICAgICAgICAgICBpbmRl
eAorICAgICAgICAgICAgY2hpbGQuZWFjaFZhcmlhYmxlKCZwcm9jKQorICAgICAgICB9CisgICAg
ZW5kCitlbmQKKworY2xhc3MgTWF0Y2hlcgorICAgIGF0dHJfcmVhZGVyIDpuYW1lLCA6cHJvZHVj
dGlvbnMKKworICAgIGRlZiBpbml0aWFsaXplKG5hbWUsIHByb2R1Y3Rpb25zKQorICAgICAgICBA
bmFtZSA9IG5hbWUKKyAgICAgICAgQHByb2R1Y3Rpb25zID0gcHJvZHVjdGlvbnMKKyAgICBlbmQK
K2VuZAorCitjbGFzcyBPcmlnaW4KKyAgICBhdHRyX3JlYWRlciA6ZmlsZU5hbWUsIDpsaW5lTnVt
YmVyCisgICAgCisgICAgZGVmIGluaXRpYWxpemUoZmlsZU5hbWUsIGxpbmVOdW1iZXIpCisgICAg
ICAgIEBmaWxlTmFtZSA9IGZpbGVOYW1lCisgICAgICAgIEBsaW5lTnVtYmVyID0gbGluZU51bWJl
cgorICAgIGVuZAorICAgIAorICAgIGRlZiB0b19zCisgICAgICAgICIje2ZpbGVOYW1lfToje2xp
bmVOdW1iZXJ9IgorICAgIGVuZAorZW5kCisKK2NsYXNzIFRva2VuCisgICAgYXR0cl9yZWFkZXIg
Om9yaWdpbiwgOnN0cmluZworICAgIAorICAgIGRlZiBpbml0aWFsaXplKG9yaWdpbiwgc3RyaW5n
KQorICAgICAgICBAb3JpZ2luID0gb3JpZ2luCisgICAgICAgIEBzdHJpbmcgPSBzdHJpbmcKKyAg
ICBlbmQKKyAgICAKKyAgICBkZWYgPT0ob3RoZXIpCisgICAgICAgIGlmIG90aGVyLmlzX2E/IFRv
a2VuCisgICAgICAgICAgICBAc3RyaW5nID09IG90aGVyLnN0cmluZworICAgICAgICBlbHNlCisg
ICAgICAgICAgICBAc3RyaW5nID09IG90aGVyCisgICAgICAgIGVuZAorICAgIGVuZAorICAgIAor
ICAgIGRlZiA9fihvdGhlcikKKyAgICAgICAgQHN0cmluZyA9fiBvdGhlcgorICAgIGVuZAorICAg
IAorICAgIGRlZiB0b19zCisgICAgICAgICIje0BzdHJpbmcuaW5zcGVjdH0gYXQgI3tvcmlnaW59
IgorICAgIGVuZAorICAgIAorICAgIGRlZiBwYXJzZUVycm9yKCpjb21tZW50KQorICAgICAgICBp
ZiBjb21tZW50LmVtcHR5PworICAgICAgICAgICAgcmFpc2UgIlBhcnNlIGVycm9yOiAje3RvX3N9
IgorICAgICAgICBlbHNlCisgICAgICAgICAgICByYWlzZSAiUGFyc2UgZXJyb3I6ICN7dG9fc306
ICN7Y29tbWVudFswXX0iCisgICAgICAgIGVuZAorICAgIGVuZAorZW5kCisKK2RlZiBsZXgoc3Ry
LCBmaWxlTmFtZSkKKyAgICBmaWxlTmFtZSA9IFBhdGhuYW1lLm5ldyhmaWxlTmFtZSkKKyAgICBy
ZXN1bHQgPSBbXQorICAgIGxpbmVOdW1iZXIgPSAxCisgICAgd2hpbGUgbm90IHN0ci5lbXB0eT8K
KyAgICAgICAgY2FzZSBzdHIKKyAgICAgICAgd2hlbiAvXEFcIyhbXlxuXSopLworICAgICAgICAg
ICAgIyBjb21tZW50LCBpZ25vcmUKKyAgICAgICAgd2hlbiAvXEFcbi8KKyAgICAgICAgICAgICMg
bmV3bGluZSwgaWdub3JlCisgICAgICAgICAgICBsaW5lTnVtYmVyICs9IDEKKyAgICAgICAgd2hl
biAvXEFbYS16QS1aMC05JF0oW2EtekEtWjAtOV9dKikvCisgICAgICAgICAgICByZXN1bHQgPDwg
VG9rZW4ubmV3KE9yaWdpbi5uZXcoZmlsZU5hbWUsIGxpbmVOdW1iZXIpLCAkJikKKyAgICAgICAg
d2hlbiAvXEEoWyBcdFxyXSspLworICAgICAgICAgICAgIyB3aGl0ZXNwYWNlLCBpZ25vcmUKKyAg
ICAgICAgd2hlbiAvXEFbPSgpLF0vCisgICAgICAgICAgICByZXN1bHQgPDwgVG9rZW4ubmV3KE9y
aWdpbi5uZXcoZmlsZU5hbWUsIGxpbmVOdW1iZXIpLCAkJikKKyAgICAgICAgZWxzZQorICAgICAg
ICAgICAgcmFpc2UgIkxleGVyIGVycm9yIGF0ICN7T3JpZ2luLm5ldyhmaWxlTmFtZSwgbGluZU51
bWJlcikudG9fc30sIHVuZXhwZWN0ZWQgc2VxdWVuY2UgI3tzdHJbMC4uMjBdLmluc3BlY3R9Igor
ICAgICAgICBlbmQKKyAgICAgICAgc3RyID0gJH4ucG9zdF9tYXRjaAorICAgIGVuZAorICAgIHJl
c3VsdAorZW5kCisKK2RlZiBpc0tleXdvcmQodG9rZW4pCisgICAgIyBXZSBjYW4gZXh0ZW5kIHRo
aXMgYXMgd2UgYWRkIG1vcmUga2V5d29yZHMuIExpa2UsIHdlIG1pZ2h0IHdhbnQgImluY2x1ZGUi
IGV2ZW50dWFsbHkuCisgICAgdG9rZW4gPX4gL1xBKChtYXRjaGVyKSlcWi8KK2VuZAorCitkZWYg
aXNJZGVudGlmaWVyKHRva2VuKQorICAgIHRva2VuID1+IC9cQVthLXpBLVowLTkkXShbYS16QS1a
MC05X10qKVxaLyBhbmQgbm90IGlzS2V5d29yZCh0b2tlbikKK2VuZAorCitjbGFzcyBQYXJzZXIK
KyAgICBkZWYgaW5pdGlhbGl6ZShkYXRhLCBmaWxlTmFtZSkKKyAgICAgICAgQHRva2VucyA9IGxl
eChkYXRhLCBmaWxlTmFtZSkKKyAgICAgICAgQGlkeCA9IDAKKyAgICBlbmQKKworICAgIGRlZiB0
b2tlbgorICAgICAgICBAdG9rZW5zW0BpZHhdCisgICAgZW5kCisKKyAgICBkZWYgYWR2YW5jZQor
ICAgICAgICBAaWR4ICs9IDEKKyAgICBlbmQKKworICAgIGRlZiBwYXJzZUVycm9yKCpjb21tZW50
KQorICAgICAgICBpZiB0b2tlbgorICAgICAgICAgICAgdG9rZW4ucGFyc2VFcnJvcigqY29tbWVu
dCkKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgaWYgY29tbWVudC5lbXB0eT8KKyAgICAgICAg
ICAgICAgICByYWlzZSAiUGFyc2UgZXJyb3IgYXQgZW5kIG9mIGZpbGUiCisgICAgICAgICAgICBl
bHNlCisgICAgICAgICAgICAgICAgcmFpc2UgIlBhcnNlIGVycm9yIGF0IGVuZCBvZiBmaWxlOiAj
e2NvbW1lbnRbMF19IgorICAgICAgICAgICAgZW5kCisgICAgICAgIGVuZAorICAgIGVuZAorCisg
ICAgZGVmIGNvbnN1bWUoc3RyaW5nKQorICAgICAgICBwYXJzZUVycm9yKCJFeHBlY3RlZCAje3N0
cmluZ30iKSB1bmxlc3MgdG9rZW4gPT0gc3RyaW5nCisgICAgICAgIGFkdmFuY2UKKyAgICBlbmQK
KworICAgIGRlZiBjb25zdW1lSWRlbnRpZmllcgorICAgICAgICByZXN1bHQgPSB0b2tlbi5zdHJp
bmcKKyAgICAgICAgcGFyc2VFcnJvcigiRXhwZWN0ZWQgaWRlbnRpZmllciIpIHVubGVzcyBpc0lk
ZW50aWZpZXIocmVzdWx0KQorICAgICAgICBhZHZhbmNlCisgICAgICAgIHJlc3VsdAorICAgIGVu
ZAorCisgICAgZGVmIGFkZFVuaXF1ZShuYW1lLCBwcm9kdWN0aW9ucywgcHJvZHVjdGlvbikKKyAg
ICAgICAgaWYgbmFtZSA9PSBwcm9kdWN0aW9uLnZhck5hbWUKKyAgICAgICAgICAgIHBhcnNlRXJy
b3IoIkNoaWxkIHByb2R1Y3Rpb24gaGFzIHNhbWUgbmFtZSBhcyBwYXJlbnQgcHJvZHVjdGlvbiIp
CisgICAgICAgIGVuZAorICAgICAgICBpZiBwcm9kdWN0aW9ucy5kZXRlY3QgeyB8IGVudHJ5IHwg
ZW50cnkubmFtZSA9PSBwcm9kdWN0aW9uLm5hbWUgfQorICAgICAgICAgICAgcGFyc2VFcnJvcigi
RHVwbGljYXRlIHByb2R1Y3Rpb24iKQorICAgICAgICBlbmQKKyAgICAgICAgcHJvZHVjdGlvbnMg
PDwgcHJvZHVjdGlvbgorICAgIGVuZAorCisgICAgZGVmIHBhcnNlCisgICAgICAgIGNvbnN1bWUo
Im1hdGNoZXIiKQorCisgICAgICAgIG1hdGNoZXJOYW1lID0gY29uc3VtZUlkZW50aWZpZXIKKwor
ICAgICAgICBwcm9kdWN0aW9ucyA9IFtdCisKKyAgICAgICAgbG9vcCB7CisgICAgICAgICAgICBi
cmVhayBpZiBAaWR4ID49IEB0b2tlbnMubGVuZ3RoCisKKyAgICAgICAgICAgICMgV2UgbWlnaHQg
d2FudCB0byBzdXBwb3J0ICJpbmNsdWRlIi4gSWYgd2UgZGlkIHRoYXQsIGl0IHdvdWxkIGdvIGhl
cmUuCisgICAgICAgICAgICBhZGRVbmlxdWUobWF0Y2hlck5hbWUsIHByb2R1Y3Rpb25zLCBwYXJz
ZVByb2R1Y3Rpb24pCisgICAgICAgIH0KKworICAgICAgICBNYXRjaGVyLm5ldyhtYXRjaGVyTmFt
ZSwgcHJvZHVjdGlvbnMpCisgICAgZW5kCisKKyAgICBkZWYgcGFyc2VQcm9kdWN0aW9uCisgICAg
ICAgIG9yaWdpbiA9IHRva2VuLm9yaWdpbgorICAgICAgICBuYW1lID0gY29uc3VtZUlkZW50aWZp
ZXIKKworICAgICAgICBpZiB0b2tlbiA9PSAiPSIKKyAgICAgICAgICAgIGNvbnN1bWUoIj0iKQor
ICAgICAgICAgICAgb3Bjb2RlID0gY29uc3VtZUlkZW50aWZpZXIKKyAgICAgICAgICAgIGNvbnN1
bWUoIigiKQorICAgICAgICBlbHNpZiB0b2tlbiA9PSAiKCIKKyAgICAgICAgICAgIGNvbnN1bWUo
IigiKQorICAgICAgICAgICAgb3Bjb2RlID0gbmFtZQorICAgICAgICAgICAgbmFtZSA9IG5pbAor
ICAgICAgICBlbHNlCisgICAgICAgICAgICByZXR1cm4gUHJvZHVjdGlvbi5uZXcob3JpZ2luLCBu
YW1lLCBuaWwsIG5pbCkKKyAgICAgICAgZW5kCisgICAgICAgIAorICAgICAgICBwcm9kdWN0aW9u
cyA9IFtdCisgICAgICAgIGxvb3AgeworICAgICAgICAgICAgYnJlYWsgaWYgdG9rZW4gPT0gIiki
CisKKyAgICAgICAgICAgIGFkZFVuaXF1ZShuYW1lLCBwcm9kdWN0aW9ucywgcGFyc2VQcm9kdWN0
aW9uKQorCisgICAgICAgICAgICBicmVhayBpZiB0b2tlbiA9PSAiKSIKKyAgICAgICAgICAgIGNv
bnN1bWUoIiwiKQorICAgICAgICB9CisKKyAgICAgICAgIyBBZHZhbmNlIGFmdGVyIHRoZSAiKSIK
KyAgICAgICAgYWR2YW5jZQorCisgICAgICAgIFByb2R1Y3Rpb24ubmV3KG9yaWdpbiwgbmFtZSwg
b3Bjb2RlLCBwcm9kdWN0aW9ucykKKyAgICBlbmQKK2VuZAorCitmaWxlTmFtZSA9IEFSR1ZbMF0K
KworcGFyc2VyID0gUGFyc2VyLm5ldyhJTzo6cmVhZChmaWxlTmFtZSksIGZpbGVOYW1lKQorbWF0
Y2hlciA9IHBhcnNlci5wYXJzZQorCitjbGFzcyBTdWJNYXRjaAorICAgIGF0dHJfcmVhZGVyIDpp
bmRleE1hcCwgOnByb2R1Y3Rpb25zCisgICAgCisgICAgZGVmIGluaXRpYWxpemUoaW5kZXhMaXN0
LCBwcm9kdWN0aW9ucykKKyAgICAgICAgQGluZGV4TWFwID0gW10KKyAgICAgICAgQHByb2R1Y3Rp
b25zID0gW10KKyAgICAgICAgaW5kZXhMaXN0LmVhY2ggeworICAgICAgICAgICAgfCBpbmRleCB8
CisgICAgICAgICAgICBAaW5kZXhNYXAgPDwgaW5kZXgKKyAgICAgICAgICAgIEBwcm9kdWN0aW9u
cyA8PCBwcm9kdWN0aW9uc1tpbmRleF0KKyAgICAgICAgfQorICAgIGVuZAorCisgICAgZGVmIG1h
cEluZGV4TGlzdChpbmRleExpc3QpCisgICAgICAgIGluZGV4TGlzdC5tYXAgeworICAgICAgICAg
ICAgfCBpbmRleCB8CisgICAgICAgICAgICBAaW5kZXhNYXBbaW5kZXhdCisgICAgICAgIH0KKyAg
ICBlbmQKK2VuZAorCitGaWxlLm9wZW4oIkIzIiArIG1hdGNoZXIubmFtZSArICIuaCIsICJ3Iikg
eworICAgIHwgb3V0cCB8CisKKyAgICBvdXRwLnB1dHMgIi8vIEdlbmVyYXRlZCBieSBnZW5lcmF0
ZV9wYXR0ZXJuX21hdGNoZXIucmIgZnJvbSAje2ZpbGVOYW1lfSAtLSBkbyBub3QgZWRpdCEiCisK
KyAgICBvdXRwLnB1dHMgIiNpZm5kZWYgQjMje21hdGNoZXIubmFtZX1faCIKKyAgICBvdXRwLnB1
dHMgIiNkZWZpbmUgQjMje21hdGNoZXIubmFtZX1faCIKKyAgICAKKyAgICBvdXRwLnB1dHMgIiNp
bmNsdWRlIFwiQjNWYWx1ZS5oXCIiCisgICAgCisgICAgb3V0cC5wdXRzICJuYW1lc3BhY2UgSlND
IHsgbmFtZXNwYWNlIEIzIHsiCisKKyAgICBvdXRwLnB1dHMgInRlbXBsYXRlPHR5cGVuYW1lIEFk
YXB0b3I+IgorICAgIG91dHAucHV0cyAidm9pZCBydW4je21hdGNoZXIubmFtZX0oVmFsdWUqIF92
YWx1ZSwgQWRhcHRvciYgYWRhcHRvcikiCisgICAgb3V0cC5wdXRzICJ7IgorCisgICAgIyBOb3Rl
IHRoYXQgdGhpcyBkb2VzIG5vdCBlbWl0IHByb3Blcmx5IGluZGVudGVkIGNvZGUsIGJlY2F1c2Ug
aXQncyBhIHJlY3Vyc2l2ZSBlbWl0dGVyLiBJZiB5b3UKKyAgICAjIHdhbnQgdG8gc2VlIHRoZSBj
b2RlIG5pY2VseSBmb3JtYXR0ZWQsIG9wZW4gaXQgaW4gYSBnb29kIHRleHQgZWRpdG9yIGFuZCBh
c2sgaXQgdG8gZm9ybWF0IGl0CisgICAgIyBmb3IgeW91LgorCisgICAgIyBJbiBvZGQgc2l0dWF0
aW9ucywgd2UgbWF5IG5vdCB1c2UgdGhlIGlucHV0IHZhbHVlLiBUZWxsIHRoZSBjb21waWxlciB0
byBjaGlsbCBvdXQgYWJvdXQgaXQuCisgICAgb3V0cC5wdXRzICJVTlVTRURfUEFSQU0oX3ZhbHVl
KTsiCisgICAgICAgIAorICAgICMgVGhpcyBqdXN0IHByb3RlY3RzIHRoZSBjYWxsZXIgZnJvbSBo
YXZpbmcgdG8gd29ycnkgYWJvdXQgcHJvZHVjdGlvbnMgaGF2aW5nIGRpZmZlcmVudCBsZW5ndGhz
LgorICAgIGRlZiBtYXRjaExlbmd0aChvdXRwLCB2YWx1ZU5hbWUsIHByb2R1Y3Rpb25zKQorICAg
ICAgICBpbmRleExpc3RzID0gW10KKyAgICAgICAgcHJvZHVjdGlvbnMuZWFjaF93aXRoX2luZGV4
IHsKKyAgICAgICAgICAgIHwgcHJvZHVjdGlvbiwgaW5kZXggfAorICAgICAgICAgICAgaWYgaW5k
ZXhMaXN0c1stMV0gYW5kIHByb2R1Y3Rpb25zW2luZGV4TGlzdHNbLTFdWzBdXS5jaGlsZHJlbi5s
ZW5ndGggPT0gcHJvZHVjdGlvbi5jaGlsZHJlbi5sZW5ndGgKKyAgICAgICAgICAgICAgICBpbmRl
eExpc3RzWy0xXSA8PCBpbmRleAorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIGlu
ZGV4TGlzdHMgPDwgW2luZGV4XQorICAgICAgICAgICAgZW5kCisgICAgICAgIH0KKworICAgICAg
ICBpbmRleExpc3RzLmVhY2ggeworICAgICAgICAgICAgfCBpbmRleExpc3QgfAorICAgICAgICAg
ICAgbGVuZ3RoID0gcHJvZHVjdGlvbnNbaW5kZXhMaXN0WzBdXS5jaGlsZHJlbi5sZW5ndGgKKyAg
ICAgICAgICAgIGlmIGxlbmd0aCA+IDAKKyAgICAgICAgICAgICAgICBvdXRwLnB1dHMgImlmICgj
e3ZhbHVlTmFtZX0tPmNoaWxkcmVuLnNpemUoKSA+PSAje2xlbmd0aH0pIHsiCisgICAgICAgICAg
ICAgICAgeWllbGQgaW5kZXhMaXN0CisgICAgICAgICAgICAgICAgb3V0cC5wdXRzICJ9IgorICAg
ICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHlpZWxkIGluZGV4TGlzdAorICAgICAgICAg
ICAgZW5kCisgICAgICAgIH0KKyAgICBlbmQKKworICAgICMgVGhpcyBlZmZpY2llbnRseSBzZWxl
Y3RzIGZyb20gdGhlIGdpdmVuIHNldCBvZiBwcm9kdWN0aW9ucy4gSXQgYXNzdW1lcyB0aGF0IHBy
b2R1Y3Rpb25zCisgICAgIyBhcmUgbm90IGR1cGxpY2F0ZWQuIEl0IHlpZWxkcyB0aGUgaW5kZXgg
b2YgdGhlIGZvdW5kIHByb2R1Y3Rpb24sIGFuZCB0aGUgY29yb3V0aW5lIGlzCisgICAgIyByZXNw
b25zaWJsZSBmb3IgZW1pdHRpbmcgc3BlY2lmaWMgY29kZSBmb3IgdGhhdCBwcm9kdWN0aW9uLiBU
aGUgY29yb3V0aW5lIGlzIGdpdmVuIGxpc3RzIG9mCisgICAgIyBpbmRpY2VzIG9mIHBvc3NpYmx5
LW1hdGNoaW5nIHByb2R1Y3Rpb25zLgorICAgIGRlZiBtYXRjaFByb2R1Y3Rpb25zKG91dHAsIHZh
bHVlTmFtZSwgcHJvZHVjdGlvbnMpCisgICAgICAgICMgRmlyc3QsIHNwbGl0IHRoZSBwcm9kdWN0
aW9ucyBsaXN0IGludG8gcnVucyBvZiBwcm9kdWN0aW9ucyB3aXRoIGFuIG9wY29kZSBhbmQgcHJv
ZHVjdGlvbnMKKyAgICAgICAgIyB3aXRob3V0IG9uZS4KKyAgICAgICAgaW5kZXhMaXN0cyA9IFtd
CisgICAgICAgIHByb2R1Y3Rpb25zLmVhY2hfd2l0aF9pbmRleCB7CisgICAgICAgICAgICB8IHBy
b2R1Y3Rpb24sIGluZGV4IHwKKyAgICAgICAgICAgIGlmIGluZGV4TGlzdHNbLTFdIGFuZCBwcm9k
dWN0aW9uc1tpbmRleExpc3RzWy0xXVswXV0uaGFzT3Bjb2RlID09IHByb2R1Y3Rpb24uaGFzT3Bj
b2RlCisgICAgICAgICAgICAgICAgaW5kZXhMaXN0c1stMV0gPDwgaW5kZXgKKyAgICAgICAgICAg
IGVsc2UKKyAgICAgICAgICAgICAgICBpbmRleExpc3RzIDw8IFtpbmRleF0KKyAgICAgICAgICAg
IGVuZAorICAgICAgICB9CisgICAgICAgIAorICAgICAgICAjIE5vdywgZW1pdCBwYXR0ZXJuIG1h
dGNoaW5nIGNvZGUuIFdlIGRvIGl0IGRpZmZlcmVudGx5IGZvciBsaXN0cyB3aXRoIGFuIG9wY29k
ZSB0aGFuIGZvcgorICAgICAgICAjIGxpc3RzIHdpdGhvdXQgb25lLgorICAgICAgICBpbmRleExp
c3RzLmVhY2ggeworICAgICAgICAgICAgfCBpbmRleExpc3QgfAorICAgICAgICAgICAgaWYgcHJv
ZHVjdGlvbnNbaW5kZXhMaXN0WzBdXS5oYXNPcGNvZGUKKyAgICAgICAgICAgICAgICAjIE5vdywg
d2Ugc3BsaXQgdGhpcyBpbmRleCBsaXN0IGludG8gZ3JvdXBzIGZvciBlYWNoIG9wY29kZS4KKyAg
ICAgICAgICAgICAgICBncm91cHMgPSB7fQorICAgICAgICAgICAgICAgIGluZGV4TGlzdC5lYWNo
IHsKKyAgICAgICAgICAgICAgICAgICAgfCBpbmRleCB8CisgICAgICAgICAgICAgICAgICAgIHBy
b2R1Y3Rpb24gPSBwcm9kdWN0aW9uc1tpbmRleF0KKyAgICAgICAgICAgICAgICAgICAgaWYgZ3Jv
dXBzW3Byb2R1Y3Rpb24ub3Bjb2RlXQorICAgICAgICAgICAgICAgICAgICAgICAgZ3JvdXBzW3By
b2R1Y3Rpb24ub3Bjb2RlXSA8PCBpbmRleAorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAg
ICAgICAgICAgICAgICAgICAgICBncm91cHNbcHJvZHVjdGlvbi5vcGNvZGVdID0gW2luZGV4XQor
ICAgICAgICAgICAgICAgICAgICBlbmQKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAg
ICAgICAjIEVtaXQgYSBzd2l0Y2ggc3RhdGVtZW50LgorICAgICAgICAgICAgICAgIG91dHAucHV0
cyAic3dpdGNoICgje3ZhbHVlTmFtZX0tPm9wY29kZSgpKSB7IgorICAgICAgICAgICAgICAgIGdy
b3Vwcy5lYWNoX3BhaXIgeworICAgICAgICAgICAgICAgICAgICB8IG9wY29kZSwgc3ViSW5kZXhM
aXN0IHwKKyAgICAgICAgICAgICAgICAgICAgb3V0cC5wdXRzICJjYXNlICN7b3Bjb2RlfToiCisg
ICAgICAgICAgICAgICAgICAgIHN1Yk1hdGNoID0gU3ViTWF0Y2gubmV3KHN1YkluZGV4TGlzdCwg
cHJvZHVjdGlvbnMpCisgICAgICAgICAgICAgICAgICAgIG1hdGNoTGVuZ3RoKG91dHAsIHZhbHVl
TmFtZSwgc3ViTWF0Y2gucHJvZHVjdGlvbnMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHwg
aW5kZXhMaXN0IHwKKyAgICAgICAgICAgICAgICAgICAgICAgIHlpZWxkIHN1Yk1hdGNoLm1hcElu
ZGV4TGlzdChpbmRleExpc3QpCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAg
ICAgICAgb3V0cC5wdXRzICJicmVhazsiCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAg
ICAgIG91dHAucHV0cyAiZGVmYXVsdDoiCisgICAgICAgICAgICAgICAgb3V0cC5wdXRzICJicmVh
azsiCisgICAgICAgICAgICAgICAgb3V0cC5wdXRzICJ9IgorICAgICAgICAgICAgZWxzZQorICAg
ICAgICAgICAgICAgIHN1Yk1hdGNoID0gU3ViTWF0Y2gubmV3KGluZGV4TGlzdCwgcHJvZHVjdGlv
bnMpCisgICAgICAgICAgICAgICAgbWF0Y2hMZW5ndGgob3V0cCwgdmFsdWVOYW1lLCBzdWJNYXRj
aC5wcm9kdWN0aW9ucykgeworICAgICAgICAgICAgICAgICAgICB8IGluZGV4TGlzdCB8CisgICAg
ICAgICAgICAgICAgICAgIHlpZWxkIHN1Yk1hdGNoLm1hcEluZGV4TGlzdChpbmRleExpc3QpCisg
ICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgZW5kCisgICAgICAgIH0KKyAgICBlbmQKKwor
ICAgICMgVGFrZXMgcHJvZHVjdGlvbnMgdGhhdCBoYXZlIHRoZSBzYW1lIG9wY29kZSBhbmQgdGhl
IHNhbWUgbGVuZ3RoIGFuZCBzZWxlY3RzIGZyb20gdGhlbSBiYXNlZCBvbgorICAgICMgdGhlIHBy
b2R1Y3Rpb25zIGF0IHRoZSBnaXZlbiBjb2x1bW4uCisgICAgZGVmIG1hdGNoQ29sdW1uKG91dHAs
IHZhbHVlTmFtZSwgcHJvZHVjdGlvbnMsIGNvbHVtbkluZGV4KQorICAgICAgICBpZiBjb2x1bW5J
bmRleCA+PSBwcm9kdWN0aW9uc1swXS5jaGlsZHJlbi5sZW5ndGgKKyAgICAgICAgICAgIHlpZWxk
ICgwLi4uKHByb2R1Y3Rpb25zLnNpemUpKS50b19hCisgICAgICAgICAgICByZXR1cm4KKyAgICAg
ICAgZW5kCisKKyAgICAgICAgc3ViVmFsdWUgPSBuZXdWYXIKKyAgICAgICAgCisgICAgICAgIG91
dHAucHV0cyAieyIKKyAgICAgICAgb3V0cC5wdXRzICJWYWx1ZSogI3tzdWJWYWx1ZX0gPSAje3Zh
bHVlTmFtZX0tPmNoaWxkKCN7Y29sdW1uSW5kZXh9KTsiCisKKyAgICAgICAgIyBXZSBtYXkgbm90
IHVzZSB0aGlzIHZhbHVlLiBUZWxsIHRoZSBjb21waWxlciB0byBjaGlsbCBvdXQgYWJvdXQgaXQu
CisgICAgICAgIG91dHAucHV0cyAiVU5VU0VEX1BBUkFNKCN7c3ViVmFsdWV9KTsiCisgICAgICAg
IAorICAgICAgICBzdWJQcm9kdWN0aW9ucyA9IHByb2R1Y3Rpb25zLm1hcCB7CisgICAgICAgICAg
ICB8IHByb2R1Y3Rpb24gfAorICAgICAgICAgICAgcHJvZHVjdGlvbi5jaGlsZHJlbltjb2x1bW5J
bmRleF0KKyAgICAgICAgfQorCisgICAgICAgIG1hdGNoUmVjdXJzaXZlbHkob3V0cCwgc3ViVmFs
dWUsIHN1YlByb2R1Y3Rpb25zKSB7CisgICAgICAgICAgICB8IGluZGV4TGlzdCB8CisgICAgICAg
ICAgICBzdWJNYXRjaCA9IFN1Yk1hdGNoLm5ldyhpbmRleExpc3QsIHByb2R1Y3Rpb25zKQorICAg
ICAgICAgICAgbWF0Y2hDb2x1bW4ob3V0cCwgdmFsdWVOYW1lLCBzdWJNYXRjaC5wcm9kdWN0aW9u
cywgY29sdW1uSW5kZXggKyAxKSB7CisgICAgICAgICAgICAgICAgfCBpbmRleExpc3QgfAorICAg
ICAgICAgICAgICAgIHlpZWxkIHN1Yk1hdGNoLm1hcEluZGV4TGlzdChpbmRleExpc3QpCisgICAg
ICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBvdXRwLnB1dHMgIn0iCisgICAgZW5kCisK
KyAgICBkZWYgbWF0Y2hSZWN1cnNpdmVseShvdXRwLCB2YWx1ZU5hbWUsIHByb2R1Y3Rpb25zKQor
ICAgICAgICBtYXRjaFByb2R1Y3Rpb25zKG91dHAsIHZhbHVlTmFtZSwgcHJvZHVjdGlvbnMpIHsK
KyAgICAgICAgICAgIHwgaW5kZXhMaXN0IHwKKyAgICAgICAgICAgICMgV2UgYXJlIGd1YXJhbnRl
ZWQgdGhhdCB0aGlzIGluZGV4IGxpc3QgY29udGFpbnMgcHJvZHVjdGlvbnMgd2l0aCB0aGUgc2Ft
ZSBvcGNvZGUgYW5kCisgICAgICAgICAgICAjIHRoZSBzYW1lIGxlbmd0aC4KKyAgICAgICAgICAg
IHN1Yk1hdGNoID0gU3ViTWF0Y2gubmV3KGluZGV4TGlzdCwgcHJvZHVjdGlvbnMpCisgICAgICAg
ICAgICBtYXRjaENvbHVtbihvdXRwLCB2YWx1ZU5hbWUsIHN1Yk1hdGNoLnByb2R1Y3Rpb25zLCAw
KSB7CisgICAgICAgICAgICAgICAgfCBpbmRleExpc3QgfAorICAgICAgICAgICAgICAgIHlpZWxk
IHN1Yk1hdGNoLm1hcEluZGV4TGlzdChpbmRleExpc3QpCisgICAgICAgICAgICB9CisgICAgICAg
IH0KKyAgICBlbmQKKworICAgIG1hdGNoUmVjdXJzaXZlbHkob3V0cCwgIl92YWx1ZSIsIG1hdGNo
ZXIucHJvZHVjdGlvbnMpIHsKKyAgICAgICAgfCBpbmRleExpc3QgfAorICAgICAgICBpbmRleExp
c3QuZWFjaCB7CisgICAgICAgICAgICB8IGluZGV4IHwKKyAgICAgICAgICAgIHByb2R1Y3Rpb24g
PSBtYXRjaGVyLnByb2R1Y3Rpb25zW2luZGV4XQorICAgICAgICAgICAgb3V0cC5wdXRzICJ7Igor
ICAgICAgICAgICAgb3V0cC5wdXRzICJWYWx1ZSogI3twcm9kdWN0aW9uLnZhck5hbWV9ID0gX3Zh
bHVlOyIKKyAgICAgICAgICAgIGludGVybmFsQXJndW1lbnRzID0gW10KKyAgICAgICAgICAgIG9w
ZXJhbmRBcmd1bWVudHMgPSBbXQorICAgICAgICAgICAgdHJ5QXJndW1lbnRzID0gW10KKyAgICAg
ICAgICAgIG51bVNjb3BlcyA9IDAKKyAgICAgICAgICAgIHByb2R1Y3Rpb24uZWFjaFZhcmlhYmxl
IHsKKyAgICAgICAgICAgICAgICB8IHBhcmVudFZhck5hbWUsIGNoaWxkTmFtZSwgY2hpbGRWYXJO
YW1lLCBraW5kLCBpbmRleCB8CisgICAgICAgICAgICAgICAgb3V0cC5wdXRzICJWYWx1ZSogI3tj
aGlsZFZhck5hbWV9ID0gI3twYXJlbnRWYXJOYW1lfS0+Y2hpbGQoI3tpbmRleH0pOyIKKworICAg
ICAgICAgICAgICAgIGlmIGNoaWxkTmFtZSA9fiAvXEFcJC8KKyAgICAgICAgICAgICAgICAgICAg
aWYgY2hpbGROYW1lID1+IC9cQVwkKFswLTldKylcWi8KKyAgICAgICAgICAgICAgICAgICAgICAg
IG91dHAucHV0cyAiaWYgKCN7Y2hpbGRWYXJOYW1lfS0+aXNJbnQoI3skMX0pKSB7IgorICAgICAg
ICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICBvdXRwLnB1dHMgImlm
ICgje2NoaWxkVmFyTmFtZX0tPmhhc0ludCgpKSB7IgorICAgICAgICAgICAgICAgICAgICBlbmQK
KyAgICAgICAgICAgICAgICAgICAgbnVtU2NvcGVzICs9IDEKKyAgICAgICAgICAgICAgICBlbmQK
KyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBpbnRlcm5hbEFyZ3VtZW50cyA8PCBj
aGlsZFZhck5hbWUgaWYga2luZCA9PSA6aW50ZXJuYWwgb3Iga2luZCA9PSA6YW5vbkludGVybmFs
CisgICAgICAgICAgICAgICAgb3BlcmFuZEFyZ3VtZW50cyA8PCBjaGlsZFZhck5hbWUgaWYga2lu
ZCA9PSA6b3BlcmFuZCBvciBraW5kID09IDphbm9uT3BlcmFuZAorICAgICAgICAgICAgICAgIHRy
eUFyZ3VtZW50cyA8PCBjaGlsZFZhck5hbWUgaWYga2luZCA9PSA6aW50ZXJuYWwgb3Iga2luZCA9
PSA6b3BlcmFuZAorICAgICAgICAgICAgfQorICAgICAgICAgICAgb3V0cC5wdXRzICJpZiAoYWRh
cHRvci5hY2NlcHRSb290KF92YWx1ZSkiCisgICAgICAgICAgICBvdXRwLnB1dHMoIiAgICAmJiBh
ZGFwdG9yLmFjY2VwdEludGVybmFscygiICsgaW50ZXJuYWxBcmd1bWVudHMuam9pbigiLCAiKSAr
ICIpIikKKyAgICAgICAgICAgIG91dHAucHV0cygiICAgICYmIGFkYXB0b3IuYWNjZXB0T3BlcmFu
ZHMoIiArIG9wZXJhbmRBcmd1bWVudHMuam9pbigiLCAiKSArICIpIikKKyAgICAgICAgICAgIG91
dHAucHV0cygiICAgICYmIGFkYXB0b3IudHJ5I3twcm9kdWN0aW9uLm5hbWV9KCIgKyB0cnlBcmd1
bWVudHMuam9pbigiLCAiKSArICIpKSIpCisgICAgICAgICAgICBvdXRwLnB1dHMgIiAgICByZXR1
cm47IgorICAgICAgICAgICAgbnVtU2NvcGVzLnRpbWVzIHsKKyAgICAgICAgICAgICAgICBvdXRw
LnB1dHMgIn0iCisgICAgICAgICAgICB9CisgICAgICAgICAgICBvdXRwLnB1dHMgIn0iCisgICAg
ICAgIH0KKyAgICB9CisgICAgCisgICAgb3V0cC5wdXRzICIgICAgUkVMRUFTRV9BU1NFUlRfTk9U
X1JFQUNIRUQoKTsiCisgICAgb3V0cC5wdXRzICJ9IgorICAgIAorICAgIG91dHAucHV0cyAifSB9
IC8vIG5hbWVzcGFjZSBKU0M6OkIzIgorCisgICAgb3V0cC5wdXRzICIjZW5kaWYgLy8gQjMje21h
dGNoZXIubmFtZX1faCIKK30KSW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9haXIvQWly
QXJnLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvYWlyL0FpckFy
Zy5jcHAJKHJldmlzaW9uIDApCisrKyBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvYWlyL0FpckFy
Zy5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSw2MiBAQAorLyoKKyAqIENvcHlyaWdodCAo
QykgMjAxNSBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmli
dXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0
CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93
aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291
cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0
aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICog
Mi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92
ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRo
ZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29y
IG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICog
VEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5Z
CisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJ
TUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBB
TkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAg
SU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJM
RSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVN
UExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlU
RUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBM
T1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElP
TikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hF
VEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElO
RyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUg
VVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklM
SVRZIE9GIFNVQ0ggREFNQUdFLiAKKyAqLworCisjaW5jbHVkZSAiY29uZmlnLmgiCisjaW5jbHVk
ZSAiQWlyQXJnLmgiCisKK25hbWVzcGFjZSBKU0MgeyBuYW1lc3BhY2UgQjMgeyBuYW1lc3BhY2Ug
QWlyIHsKKwordm9pZCBBcmc6OmR1bXAoUHJpbnRTdHJlYW0mIG91dCkgY29uc3QKK3sKKyAgICBz
d2l0Y2ggKG1fa2luZCkgeworICAgIGNhc2UgVG1wOgorICAgICAgICBvdXQucHJpbnQodG1wKCkp
OworICAgICAgICByZXR1cm47CisgICAgY2FzZSBJbW06CisgICAgICAgIG91dC5wcmludCgiJCIs
IG1fb2Zmc2V0KTsKKyAgICAgICAgcmV0dXJuOworICAgIGNhc2UgQWRkcjoKKyAgICAgICAgaWYg
KG1fb2Zmc2V0KQorICAgICAgICAgICAgb3V0LnByaW50KG1fb2Zmc2V0KTsKKyAgICAgICAgb3V0
LnByaW50KCIoIiwgYmFzZSgpLCAiKSIpOworICAgICAgICByZXR1cm47CisgICAgY2FzZSBJbmRl
eDoKKyAgICAgICAgaWYgKG1fb2Zmc2V0KQorICAgICAgICAgICAgb3V0LnByaW50KG1fb2Zmc2V0
KTsKKyAgICAgICAgb3V0LnByaW50KCIoIiwgYmFzZSgpLCAiLCIsIGluZGV4KCkpOworICAgICAg
ICBpZiAoc2NhbGUoKSAhPSAxKQorICAgICAgICAgICAgb3V0LnByaW50KCIsIiwgc2NhbGUoKSk7
CisgICAgICAgIG91dC5wcmludCgiKSIpOworICAgICAgICByZXR1cm47CisgICAgY2FzZSBBYnM6
CisgICAgICAgIG91dC5wcmludChtX29mZnNldCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisK
KyAgICBSRUxFQVNFX0FTU0VSVF9OT1RfUkVBQ0hFRCgpOworfQorCit9IH0gfSAvLyBuYW1lc3Bh
Y2UgSlNDOjpCMzo6QWlyCisKSW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9haXIvQWly
QXJnLmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL2Fpci9BaXJBcmcu
aAkocmV2aXNpb24gMCkKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9haXIvQWlyQXJnLmgJ
KHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSw0MTIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIw
MTUgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9u
IGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICog
bW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBj
b25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBj
b2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBs
aXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJl
ZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29w
eXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9s
bG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhl
ciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMg
U09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICog
RVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVE
IFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJ
VE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5P
IEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9S
IEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZ
LCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRP
LAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBP
RiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhP
V0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIg
SU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVH
TElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQor
ICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBP
RiBTVUNIIERBTUFHRS4gCisgKi8KKworI2lmbmRlZiBBaXJBcmdfaAorI2RlZmluZSBBaXJBcmdf
aAorCisjaW5jbHVkZSAiQWlyVG1wLmgiCisKK25hbWVzcGFjZSBKU0MgeyBuYW1lc3BhY2UgQjMg
eyBuYW1lc3BhY2UgQWlyIHsKKworLy8gVGhpcyBjbGFzcyBuYW1lIGlzIGFsc28gaW50ZW50aW9u
YWxseSB0ZXJzZSBiZWNhdXNlIHdlIHdpbGwgc2F5IGl0IGEgbG90LiBZb3UnbGwgc2VlIGNvZGUg
bGlrZQorLy8gSW5zdCguLi4sIEFyZzo6aW1tKDUpLCBBcmc6OmFkZHIodGhpbmcsIGJsYWgpLCAu
Li4pCitjbGFzcyBBcmcgeworcHVibGljOgorICAgIC8vIFRoZXNlIGVudW0gbWVtYmVycyBhcmUg
aW50ZW50aW9uYWxseSB0ZXJzZSBiZWNhdXNlIHdlIGhhdmUgdG8gbWVudGlvbiB0aGVtIGEgbG90
LgorICAgIGVudW0gS2luZCA6IGludDhfdCB7CisgICAgICAgIFRtcCwKKyAgICAgICAgSW1tLAor
ICAgICAgICBJbW1QdHIsCisgICAgICAgIEFkZHIsCisgICAgICAgIEluZGV4LAorICAgIH07CisK
KyAgICBlbnVtIFJvbGUgOiBpbnQ4X3QgeworICAgICAgICBVc2UsCisgICAgICAgIERlZiwKKyAg
ICAgICAgVXNlRGVmCisgICAgfTsKKworICAgIGVudW0gVHlwZSA6IGludDhfdCB7CisgICAgICAg
IEdQLAorICAgICAgICBGUAorICAgIH07CisKKyAgICBzdGF0aWMgYm9vbCBpc1VzZShSb2xlIHJv
bGUpCisgICAgeworICAgICAgICBzd2l0Y2ggKHJvbGUpIHsKKyAgICAgICAgY2FzZSBVc2U6Cisg
ICAgICAgIGNhc2UgVXNlRGVmOgorICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIGNh
c2UgRGVmOgorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgfQorCisg
ICAgc3RhdGljIGJvb2wgaXNEZWYoUm9sZSByb2xlKQorICAgIHsKKyAgICAgICAgc3dpdGNoIChy
b2xlKSB7CisgICAgICAgIGNhc2UgVXNlOgorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAg
ICAgICBjYXNlIERlZjoKKyAgICAgICAgY2FzZSBVc2VEZWY6CisgICAgICAgICAgICByZXR1cm4g
dHJ1ZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEFyZygpCisgICAgeworICAgIH0KKworICAg
IEFyZyhBaXI6OlRtcCB0bXApCisgICAgICAgIDogbV9raW5kKFRtcCkKKyAgICAgICAgLCBtX2Jh
c2UodG1wKQorICAgIHsKKyAgICB9CisKKyAgICBzdGF0aWMgQXJnIGltbShpbnRwdHJfdCB2YWx1
ZSkKKyAgICB7CisgICAgICAgIEFyZyByZXN1bHQ7CisgICAgICAgIHJlc3VsdC5tX2tpbmQgPSBJ
bW07CisgICAgICAgIHJlc3VsdC5tX29mZnNldCA9IHZhbHVlOworICAgICAgICByZXR1cm4gcmVz
dWx0OworICAgIH0KKworICAgIHN0YXRpYyBBcmcgaW1tUHRyKGludHB0cl90IHZhbHVlKQorICAg
IHsKKyAgICAgICAgQXJnIHJlc3VsdDsKKyAgICAgICAgcmVzdWx0Lm1fa2luZCA9IEltbVB0cjsK
KyAgICAgICAgcmVzdWx0Lm1fb2Zmc2V0ID0gdmFsdWU7CisgICAgICAgIHJldHVybiByZXN1bHQ7
CisgICAgfQorCisgICAgc3RhdGljIEFyZyBhZGRyZXNzKEFpcjo6VG1wIGJhc2UsIGludDMyX3Qg
b2Zmc2V0ID0gMCkKKyAgICB7CisgICAgICAgIEFTU0VSVChiYXNlLmlzR1AoKSk7CisgICAgICAg
IEFyZyByZXN1bHQ7CisgICAgICAgIHJlc3VsdC5tX2tpbmQgPSBBZGRyOworICAgICAgICByZXN1
bHQubV9iYXNlID0gYmFzZTsKKyAgICAgICAgcmVzdWx0Lm1fb2Zmc2V0ID0gb2Zmc2V0OworICAg
ICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKworICAgIHN0YXRpYyBib29sIGlzVmFsaWRTY2Fs
ZSh1bnNpZ25lZCBzY2FsZSkKKyAgICB7CisgICAgICAgIHN3aXRjaCAoc2NhbGUpIHsKKyAgICAg
ICAgY2FzZSAxOgorICAgICAgICBjYXNlIDI6CisgICAgICAgIGNhc2UgNDoKKyAgICAgICAgY2Fz
ZSA4OgorICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAg
ICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBzdGF0aWMgdW5zaWdu
ZWQgbG9nU2NhbGUodW5zaWduZWQgc2NhbGUpCisgICAgeworICAgICAgICBzd2l0Y2ggKHNjYWxl
KSB7CisgICAgICAgIGNhc2UgMToKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICBjYXNl
IDI6CisgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgY2FzZSA0OgorICAgICAgICAgICAg
cmV0dXJuIDI7CisgICAgICAgIGNhc2UgODoKKyAgICAgICAgICAgIHJldHVybiAzOworICAgICAg
ICBkZWZhdWx0OgorICAgICAgICAgICAgQVNTRVJUX05PVF9SRUFDSEVEKCk7CisgICAgICAgICAg
ICByZXR1cm4gMDsKKyAgICAgICAgfQorICAgIH0KKworICAgIHN0YXRpYyBBcmcgaW5kZXgoQWly
OjpUbXAgYmFzZSwgQWlyOjpUbXAgaW5kZXgsIHVuc2lnbmVkIHNjYWxlID0gMSwgaW50MzJfdCBv
ZmZzZXQgPSAwKQorICAgIHsKKyAgICAgICAgQVNTRVJUKGJhc2UuaXNHUCgpKTsKKyAgICAgICAg
QVNTRVJUKGluZGV4LmlzR1AoKSk7CisgICAgICAgIEFTU0VSVChpc1ZhbGlkU2NhbGUoc2NhbGUp
KTsKKyAgICAgICAgQXJnIHJlc3VsdDsKKyAgICAgICAgcmVzdWx0Lm1fa2luZCA9IEluZGV4Owor
ICAgICAgICByZXN1bHQubV9iYXNlID0gYmFzZTsKKyAgICAgICAgcmVzdWx0Lm1faW5kZXggPSBp
bmRleDsKKyAgICAgICAgcmVzdWx0Lm1fc2NhbGUgPSBzdGF0aWNfY2FzdDx1aW50OF90PihzY2Fs
ZSk7CisgICAgICAgIHJlc3VsdC5tX29mZnNldCA9IG9mZnNldDsKKyAgICAgICAgcmV0dXJuIHJl
c3VsdDsKKyAgICB9CisKKyAgICBib29sIG9wZXJhdG9yPT0oY29uc3QgQXJnJiBvdGhlcikgY29u
c3QKKyAgICB7CisgICAgICAgIHJldHVybiBtX29mZnNldCA9PSBvdGhlci5tX29mZnNldAorICAg
ICAgICAgICAgJiYgbV9raW5kID09IG90aGVyLm1fa2luZAorICAgICAgICAgICAgJiYgbV9iYXNl
ID09IG90aGVyLm1fYmFzZQorICAgICAgICAgICAgJiYgbV9pbmRleCA9PSBvdGhlci5tX2luZGV4
CisgICAgICAgICAgICAmJiBtX3NjYWxlID09IG90aGVyLm1fc2NhbGU7CisgICAgfQorCisgICAg
Ym9vbCBvcGVyYXRvciE9KGNvbnN0IEFyZyYgb3RoZXIpIGNvbnN0CisgICAgeworICAgICAgICBy
ZXR1cm4gISgqdGhpcyA9PSBvdGhlcik7CisgICAgfQorCisgICAgZXhwbGljaXQgb3BlcmF0b3Ig
Ym9vbCgpIGNvbnN0IHsgcmV0dXJuICp0aGlzICE9IEFyZygpOyB9CisKKyAgICBLaW5kIGtpbmQo
KSBjb25zdAorICAgIHsKKyAgICAgICAgcmV0dXJuIG1fa2luZDsKKyAgICB9CisKKyAgICBib29s
IGlzVG1wKCkgY29uc3QKKyAgICB7CisgICAgICAgIHJldHVybiBraW5kKCkgPT0gVG1wOworICAg
IH0KKworICAgIGJvb2wgaXNJbW0oKSBjb25zdAorICAgIHsKKyAgICAgICAgcmV0dXJuIGtpbmQo
KSA9PSBJbW07CisgICAgfQorCisgICAgYm9vbCBpc0ltbVB0cigpIGNvbnN0CisgICAgeworICAg
ICAgICByZXR1cm4ga2luZCgpID09IEltbVB0cjsKKyAgICB9CisKKyAgICBib29sIGlzQWRkcigp
IGNvbnN0CisgICAgeworICAgICAgICByZXR1cm4ga2luZCgpID09IEFkZHI7CisgICAgfQorCisg
ICAgYm9vbCBpc0luZGV4KCkgY29uc3QKKyAgICB7CisgICAgICAgIHJldHVybiBraW5kKCkgPT0g
SW5kZXg7CisgICAgfQorCisgICAgQWlyOjpUbXAgdG1wKCkgY29uc3QKKyAgICB7CisgICAgICAg
IEFTU0VSVChraW5kKCkgPT0gVG1wKTsKKyAgICAgICAgcmV0dXJuIG1fYmFzZTsKKyAgICB9CisK
KyAgICBpbnRwdHJfdCB2YWx1ZSgpIGNvbnN0CisgICAgeworICAgICAgICBBU1NFUlQoa2luZCgp
ID09IEltbSB8fCBraW5kKCkgPT0gSW1tUHRyKTsKKyAgICAgICAgcmV0dXJuIG1fb2Zmc2V0Owor
ICAgIH0KKworICAgIEFpcjo6VG1wIGJhc2UoKSBjb25zdAorICAgIHsKKyAgICAgICAgQVNTRVJU
KGtpbmQoKSA9PSBBZGRyIHx8IGtpbmQoKSA9PSBJbmRleCk7CisgICAgICAgIHJldHVybiBtX2Jh
c2U7CisgICAgfQorCisgICAgaW50MzJfdCBvZmZzZXQoKSBjb25zdAorICAgIHsKKyAgICAgICAg
QVNTRVJUKGtpbmQoKSA9PSBBZGRyIHx8IGtpbmQoKSA9PSBJbmRleCk7CisgICAgICAgIHJldHVy
biBzdGF0aWNfY2FzdDxpbnQzMl90PihtX29mZnNldCk7CisgICAgfQorCisgICAgQWlyOjpUbXAg
aW5kZXgoKSBjb25zdAorICAgIHsKKyAgICAgICAgQVNTRVJUKGtpbmQoKSA9PSBJbmRleCk7Cisg
ICAgICAgIHJldHVybiBtX2luZGV4OworICAgIH0KKworICAgIHVuc2lnbmVkIHNjYWxlKCkgY29u
c3QKKyAgICB7CisgICAgICAgIEFTU0VSVChraW5kKCkgPT0gSW5kZXgpOworICAgICAgICByZXR1
cm4gbV9zY2FsZTsKKyAgICB9CisKKyAgICB1bnNpZ25lZCBsb2dTY2FsZSgpIGNvbnN0CisgICAg
eworICAgICAgICByZXR1cm4gbG9nU2NhbGUoc2NhbGUoKSk7CisgICAgfQorCisgICAgYm9vbCBp
c0dQVG1wKCkgY29uc3QKKyAgICB7CisgICAgICAgIHJldHVybiBpc1RtcCgpICYmIHRtcCgpLmlz
R1AoKTsKKyAgICB9CisKKyAgICBib29sIGlzRlBUbXAoKSBjb25zdAorICAgIHsKKyAgICAgICAg
cmV0dXJuIGlzVG1wKCkgJiYgdG1wKCkuaXNGUCgpOworICAgIH0KKyAgICAKKyAgICAvLyBUZWxs
cyB1cyBpZiB0aGlzIEFyZyBjYW4gYmUgdXNlZCBpbiBhIHBvc2l0aW9uIHRoYXQgcmVxdWlyZXMg
YSBHUCB2YWx1ZS4KKyAgICBib29sIGlzR1AoKSBjb25zdAorICAgIHsKKyAgICAgICAgc3dpdGNo
IChraW5kKCkpIHsKKyAgICAgICAgY2FzZSBJbW06CisgICAgICAgIGNhc2UgSW1tUHRyOgorICAg
ICAgICBjYXNlIEFkZHI6CisgICAgICAgIGNhc2UgSW5kZXg6CisgICAgICAgICAgICByZXR1cm4g
dHJ1ZTsKKyAgICAgICAgY2FzZSBUbXA6CisgICAgICAgICAgICByZXR1cm4gaXNHUFRtcCgpOwor
ICAgICAgICB9CisgICAgfQorCisgICAgLy8gVGVsbHMgdXMgaWYgdGhpcyBBcmcgY2FuIGJlIHVz
ZWQgaW4gYSBwb3NpdGlvbiB0aGF0IHJlcXVpcmVzIGEgRlAgdmFsdWUuCisgICAgYm9vbCBpc0ZQ
KCkgY29uc3QKKyAgICB7CisgICAgICAgIHN3aXRjaCAoa2luZCgpKSB7CisgICAgICAgIGNhc2Ug
SW1tOgorICAgICAgICBjYXNlIEltbVB0cjoKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAg
ICAgICAgY2FzZSBBZGRyOgorICAgICAgICBjYXNlIEluZGV4OgorICAgICAgICBjYXNlIEJhc2U6
CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgY2FzZSBUbXA6CisgICAgICAgICAg
ICByZXR1cm4gaXNGUFRtcCgpOworICAgICAgICB9CisgICAgfQorCisgICAgYm9vbCBpc0dQUigp
IGNvbnN0CisgICAgeworICAgICAgICByZXR1cm4gaXNUbXAoKSAmJiB0bXAoKS5pc0dQUigpOwor
ICAgIH0KKworICAgIEdQUlJlZyBncHIoKSBjb25zdAorICAgIHsKKyAgICAgICAgcmV0dXJuIHRt
cCgpLmdwcigpOworICAgIH0KKworICAgIGJvb2wgaXNGUFIoKSBjb25zdAorICAgIHsKKyAgICAg
ICAgcmV0dXJuIGlzVG1wKCkgJiYgdG1wKCkuaXNGUFIoKTsKKyAgICB9CisKKyAgICBGUFJSZWcg
ZnByKCkgY29uc3QKKyAgICB7CisgICAgICAgIHJldHVybiB0bXAoKS5mcHIoKTsKKyAgICB9Cisg
ICAgCisgICAgYm9vbCBpc1JlZygpIGNvbnN0CisgICAgeworICAgICAgICByZXR1cm4gaXNUbXAo
KSAmJiB0bXAoKS5pc1JlZygpOworICAgIH0KKworICAgIFJlZyByZWcoKSBjb25zdAorICAgIHsK
KyAgICAgICAgcmV0dXJuIHRtcCgpLnJlZygpOworICAgIH0KKworICAgIHVuc2lnbmVkIGdwVG1w
SW5kZXgoKSBjb25zdAorICAgIHsKKyAgICAgICAgcmV0dXJuIHRtcCgpLmdwVG1wSW5kZXgoKTsK
KyAgICB9CisKKyAgICB1bnNpZ25lZCBmcFRtcEluZGV4KCkgY29uc3QKKyAgICB7CisgICAgICAg
IHJldHVybiB0bXAoKS5mcFRtcEluZGV4KCk7CisgICAgfQorCisgICAgdW5zaWduZWQgdG1wSW5k
ZXgoKSBjb25zdAorICAgIHsKKyAgICAgICAgcmV0dXJuIHRtcCgpLnRtcEluZGV4KCk7CisgICAg
fQorCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgRnVuY3Rvcj4KKyAgICB2b2lkIGZvckVhY2hUbXBG
YXN0KGNvbnN0IEZ1bmN0b3ImIGZ1bmN0b3IpCisgICAgeworICAgICAgICBzd2l0Y2ggKG1fa2lu
ZCkgeworICAgICAgICBjYXNlIFRtcDoKKyAgICAgICAgY2FzZSBBZGRyOgorICAgICAgICAgICAg
ZnVuY3RvcihtX2Jhc2UpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgSW5kZXg6
CisgICAgICAgICAgICBmdW5jdG9yKG1fYmFzZSk7CisgICAgICAgICAgICBmdW5jdG9yKG1faW5k
ZXgpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBi
cmVhazsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIFRoaXMgaXMgc21hcnQgZW5vdWdoIHRv
IGtub3cgdGhhdCBhbiBhZGRyZXNzIGFyZyBpbiBhIERlZiBvciBVc2VEZWYgcnVsZSB3aWxsIHVz
ZSBpdHMKKyAgICAvLyB0bXBzIGFuZCBuZXZlciBkZWYgdGhlbS4gRm9yIGV4YW1wbGUsIHRoaXM6
CisgICAgLy8KKyAgICAvLyBtb3YgJXJheCwgKCVyY3gpCisgICAgLy8KKyAgICAvLyBUaGlzIGRl
ZnMgKCVyY3gpIGJ1dCB1c2VzICVyY3guCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgRnVuY3Rvcj4K
KyAgICB2b2lkIGZvckVhY2hUbXAoUm9sZSBhcmdSb2xlLCBUeXBlIGFyZ1R5cGUsIGNvbnN0IEZ1
bmN0b3ImIGZ1bmN0b3IpCisgICAgeworICAgICAgICBzd2l0Y2ggKG1fa2luZCkgeworICAgICAg
ICBjYXNlIFRtcDoKKyAgICAgICAgICAgIGZ1bmN0b3IobV9iYXNlLCBhcmdSb2xlLCBhcmdUeXBl
KTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEFkZHI6CisgICAgICAgICAgICBm
dW5jdG9yKG1fYmFzZSwgVXNlLCBHUCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2Fz
ZSBJbmRleDoKKyAgICAgICAgICAgIGZ1bmN0b3IobV9iYXNlLCBVc2UsIEdQKTsKKyAgICAgICAg
ICAgIGZ1bmN0b3IobV9pbmRleCwgVXNlLCBHUCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAg
ICAgZGVmYXV0OgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBN
YWNyb0Fzc2VtYmxlcjo6VHJ1c3RlZEltbTMyIGFzVHJ1c3RlZEltbTMyKCkgY29uc3QKKyAgICB7
CisgICAgICAgIEFTU0VSVChpc0ltbSgpKTsKKyAgICAgICAgcmV0dXJuIE1hY3JvQXNzZW1ibGVy
OjpUcnVzdGVkSW1tMzIoc3RhdGljX2Nhc3Q8aW50MzJfdD4obV9vZmZzZXQpKTsKKyAgICB9CisK
KyAgICBNYWNyb0Fzc2VtYmxlcjo6VHJ1c3RlZEltbTMyIGFzVHJ1c3RlZEltbVB0cigpIGNvbnN0
CisgICAgeworICAgICAgICBBU1NFUlQoaXNJbW1QdHIoKSk7CisgICAgICAgIHJldHVybiBNYWNy
b0Fzc2VtYmxlcjo6VHJ1c3RlZEltbVB0cihtX29mZnNldCk7CisgICAgfQorCisgICAgTWFjcm9B
c3NlbWJsZXI6OkFkZHJlc3MgYXNBZGRyZXNzKCkgY29uc3QKKyAgICB7CisgICAgICAgIEFTU0VS
VChpc0FkZHIoKSk7CisgICAgICAgIHJldHVybiBNYWNyb0Fzc2VtYmxlcjo6QWRkcmVzcyhtX2Jh
c2UuZ3ByKCksIHN0YXRpY19jYXN0PGludDMyX3Q+KG1fb2Zmc2V0KSk7CisgICAgfQorCisgICAg
TWFjcm9Bc3NlbWJsZXI6OkJhc2VJbmRleCBhc0Jhc2VJbmRleCgpIGNvbnN0CisgICAgeworICAg
ICAgICBBU1NFUlQoaXNJbmRleCgpKTsKKyAgICAgICAgcmV0dXJuIE1hY3JvQXNzZW1ibGVyOjpC
YXNlSW5kZXgoCisgICAgICAgICAgICBtX2Jhc2UuZ3ByKCksIG1faW5kZXguZ3ByKCksIHN0YXRp
Y19jYXN0PE1hY3JvQXNzZW1ibGVyOjpTY2FsZT4obG9nU2NhbGUoKSksCisgICAgICAgICAgICBz
dGF0aWNfY2FzdDxpbnQzMl90PihtX29mZnNldCkpOworICAgIH0KKworICAgIHZvaWQgZHVtcChQ
cmludFN0cmVhbSYpIGNvbnN0OworCitwcml2YXRlOgorICAgIGludHB0cl90IG1fb2Zmc2V0IHsg
MCB9OworICAgIEtpbmQgbV9raW5kIHsgSW1tIH07CisgICAgdWludDhfdCBtX3NjYWxlIHsgMSB9
OworICAgIEFpcjo6VG1wIG1fYmFzZTsKKyAgICBBaXI6OlRtcCBtX2luZGV4OworfTsKKworfSB9
IH0gLy8gbmFtZXNwYWNlIEpTQzo6QjM6OkFpcgorCisjZW5kaWYgLy8gQWlyQXJnX2gKKwpJbmRl
eDogU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL2Fpci9BaXJJbnN0LmNwcAo9PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0t
LSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvYWlyL0Fpckluc3QuY3BwCShyZXZpc2lvbiAwKQor
KysgU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL2Fpci9BaXJJbnN0LmNwcAkod29ya2luZyBjb3B5
KQpAQCAtMCwwICsxLDM5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE1IEFwcGxlIEluYy4g
QWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNv
dXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwg
YXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICog
YXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFp
biB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRp
b25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMg
aW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAg
bm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFp
bWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHBy
b3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBS
T1ZJREVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1Q
TElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJ
TVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBB
UlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBB
UFBMRSBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJ
TkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVO
VElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVN
RU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBP
UgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBB
TkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBT
VFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RI
RVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09G
VFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0Uu
IAorICovCisKKyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJBaXJJbnN0LmgiCisKKyNp
bmNsdWRlIDx3dGYvTGlzdER1bXAuaD4KKworbmFtZXNwYWNlIEpTQyB7IG5hbWVzcGFjZSBCMyB7
IG5hbWVzcGFjZSBBaXIgeworCit2b2lkIEluc3Q6OmR1bXAoUHJpbnRTdHJlYW0mIG91dCkgY29u
c3QKK3sKKyAgICBvdXQucHJpbnQob3Bjb2RlLCAiICIsIGxpc3REdW1wKGFyZ3MpKTsKK30KKwor
fSB9IH0gLy8gbmFtZXNwYWNlIEpTQzo6QjM6OkFpcgorCkluZGV4OiBTb3VyY2UvSmF2YVNjcmlw
dENvcmUvYjMvYWlyL0Fpckluc3QuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENv
cmUvYjMvYWlyL0Fpckluc3QuaAkocmV2aXNpb24gMCkKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29y
ZS9iMy9haXIvQWlySW5zdC5oCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsMTIyIEBACisvKgor
ICogQ29weXJpZ2h0IChDKSAyMDE1IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAq
CisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3
aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0
aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJp
YnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Cisg
KiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRp
c2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXBy
b2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29u
ZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1l
bnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1
dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gYGBB
UyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJ
TkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVS
Q0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJF
IERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SCisgKiBDT05UUklC
VVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BF
Q0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcs
IEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMg
T1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5F
U1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0Yg
TElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JU
CisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBX
QVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBP
RiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisKKyNpZm5kZWYgQWlySW5z
dF9oCisjZGVmaW5lIEFpckluc3RfaAorCisjaW5jbHVkZSAiQWlyQXJnLmgiCisjaW5jbHVkZSAi
QWlyT3Bjb2RlLmgiCisKK25hbWVzcGFjZSBKU0MgeyBuYW1lc3BhY2UgQjMgeworCitjbGFzcyBW
YWx1ZTsKKworbmFtZXNwYWNlIEFpciB7CisKK3N0cnVjdCBJbnN0IHsKK3B1YmxpYzoKKyAgICB0
eXBlZGVmIFZlY3RvcjxBcmcsIDM+IEFyZ0xpc3Q7CisKKyAgICBJbnN0KE9wY29kZSBvcGNvZGUs
IFZhbHVlKiBvcmlnaW4pCisgICAgICAgIDogb3Bjb2RlKG9wY29kZSkKKyAgICAgICAgLCBvcmln
aW4ob3JpZ2luKQorICAgIHsKKyAgICB9CisgICAgCisgICAgdGVtcGxhdGU8dHlwZW5hbWUuLi4g
QXJndW1lbnRzPgorICAgIEluc3QoT3Bjb2RlIG9wY29kZSwgVmFsdWUqIG9yaWdpbiwgQXJnIGFy
ZywgQXJndW1lbnRzLi4uIGFyZ3VtZW50cykKKyAgICAgICAgOiBvcGNvZGUob3Bjb2RlKQorICAg
ICAgICAsIGFyZ3N7IGFyZywgYXJndW1lbnRzLi4uIH0KKyAgICAgICAgLCBvcmlnaW4ob3JpZ2lu
KQorICAgIHsKKyAgICB9CisKKyAgICBJbnN0KE9wY29kZSBvcGNvZGUsIFZhbHVlKiBvcmlnaW4s
IGNvbnN0IEFyZ0xpc3QmIGFyZ3VtZW50cykKKyAgICAgICAgOiBvcGNvZGUob3Bjb2RlKQorICAg
ICAgICAsIGFyZ3MoYXJncykKKyAgICAgICAgLCBvcmlnaW4ob3JpZ2luKQorICAgIHsKKyAgICB9
CisKKyAgICAvLyBOb3RlIHRoYXQgdGhlc2UgZnVuY3RvcnMgYWxsIGF2b2lkIHVzaW5nICJjb25z
dCIgYmVjYXVzZSB3ZSB3YW50IHRvIHVzZSB0aGVtIGZvciB0aGluZ3MgdGhhdAorICAgIC8vIGVk
aXQgSVIuIElSIGlzIG1lYW50IHRvIGJlIGVkaXRlZDsgaWYgeW91J3JlIGNhcnJ5aW5nIGFyb3Vu
ZCBhICJjb25zdCBJbnN0JiIgdGhlbiB5b3UncmUKKyAgICAvLyBwcm9iYWJseSBkb2luZyBpdCB3
cm9uZy4KKworICAgIC8vIFRoaXMgb25seSB3YWxrcyB0aG9zZSBUbXBzIHRoYXQgYXJlIGV4cGxp
Y2l0bHkgbWVudGlvbmVkLCBhbmQgaXQgZG9lc24ndCB0ZWxsIHlvdSB0aGVpciByb2xlCisgICAg
Ly8gb3IgdHlwZS4KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBGdW5jdG9yPgorICAgIHZvaWQgZm9y
RWFjaFRtcEZhc3QoY29uc3QgRnVuY3RvciYgZnVuY3RvcikKKyAgICB7CisgICAgICAgIGZvciAo
QXJnIGFyZyA6IGFyZ3MpCisgICAgICAgICAgICBhcmcuZm9yRWFjaFRtcEZhc3QoZnVuY3Rvcik7
CisgICAgfQorCisgICAgLy8gQ2FsbHMgdGhlIGZ1bmN0b3Igd2l0aCAoYXJnLCByb2xlLCB0eXBl
KS4gVGhpcyBmdW5jdGlvbiBpcyBhdXRvLWdlbmVyYXRlZCBieQorICAgIC8vIG9wY29kZV9nZW5l
cmF0b3IucmIuCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgRnVuY3Rvcj4KKyAgICB2b2lkIGZvckVh
Y2hBcmcoY29uc3QgRnVuY3RvciYgZnVuY3Rvcik7CisKKyAgICAvLyBDYWxscyB0aGUgZnVuY3Rv
ciB3aXRoICh0bXAsIHJvbGUsIHR5cGUpLgorICAgIHRlbXBsYXRlPHR5cGVuYW1lIEZ1bmN0b3I+
CisgICAgdm9pZCBmb3JFYWNoVG1wKGNvbnN0IEZ1bmN0b3ImIGZ1bmN0b3IpCisgICAgeworICAg
ICAgICBmb3JFYWNoQXJnUm9sZSgKKyAgICAgICAgICAgIFsmXSAoQXJnJiBhcmcsIEFyZzo6Um9s
ZSByb2xlLCBBcmc6OlR5cGUgdHlwZSkgeworICAgICAgICAgICAgICAgIGFyZy5mb3JFYWNoVG1w
KHJvbGUsIHR5cGUsIGZ1bmN0b3IpOworICAgICAgICAgICAgfSk7CisgICAgfQorCisgICAgLy8g
UmVwb3J0cyBhbnkgYWRkaXRpb25hbCByZWdpc3RlcnMgY2xvYmJlcmVkIGJ5IHRoaXMgb3BlcmF0
aW9uLgorICAgIHRlbXBsYXRlPHR5cGVuYW1lIEZ1bmN0b3I+CisgICAgdm9pZCBmb3JFYWNoQ2xv
YmJlcmVkUmVnKGNvbnN0IEZ1bmN0b3ImKTsKKworICAgIC8vIElzIHRoaXMgaW5zdHJ1Y3Rpb24g
aW4gb25lIG9mIHRoZSB2YWxpZCBmb3JtcyByaWdodCBub3c/IFRoaXMgZnVuY3Rpb24gaXMgYXV0
by1nZW5lcmF0ZWQgYnkKKyAgICAvLyBvcGNvZGVfZ2VuZXJhdG9yLnJiLgorICAgIGJvb2wgaXNW
YWxpZEZvcm0oKTsKKworICAgIC8vIEFzc3VtaW5nIHRoaXMgaW5zdHJ1Y3Rpb24gaXMgaW4gYSB2
YWxpZCBmb3JtIHJpZ2h0IG5vdywgd2lsbCBpdCBzdGlsbCBiZSBpbiBvbmUgb2YgdGhlIHZhbGlk
CisgICAgLy8gZm9ybXMgaWYgd2UgcHV0IGFuIEFkZHIgaW4gdGhlIGdpdmVuIGluZGV4PyBTcGls
bGluZyB1c2VzIHRoaXM6IGl0IHdhbGtzIHRoZSBhcmdzIGJ5IGluZGV4IHRvCisgICAgLy8gZmlu
ZCBUbXBzIHRoYXQgbmVlZCBzcGlsbGluZzsgaWYgaXQgZmluZHMgb25lLCBpdCBjYWxscyB0aGlz
IHRvIHNlZSBpZiBpdCBjYW4gcmVwbGFjZSB0aGUKKyAgICAvLyBBcmc6OlRtcCB3aXRoIGFuIEFy
Zzo6QWRkci4gSWYgaXQgZmluZHMgYSBub24tVG1wIEFyZywgdGhlbiBpdCBjYWxscyB0aGF0IEFy
ZydzIGZvckVhY2hUbXAgdG8KKyAgICAvLyBkbyBhIHJlcGxhY2VtZW50IHRoYXQgd2F5LgorICAg
IC8vCisgICAgLy8gVGhpcyBmdW5jdGlvbiBpcyBhdXRvLWdlbmVyYXRlZCBieSBvcGNvZGVfZ2Vu
ZXJhdG9yLnJiLgorICAgIGJvb2wgYWRtaXRzQWRkcih1bnNpZ25lZCBhcmdJbmRleCk7CisKKyAg
ICAvLyBHZW5lcmF0ZSBzb21lIGNvZGUgZm9yIHRoaXMgaW5zdHJ1Y3Rpb24uIFRoaXMgaXMsIGxp
a2UsIGxpdGVyYWxseSBvdXIgYmFja2VuZC4gVGhpcyBmdW5jdGlvbgorICAgIC8vIGlzIGF1dG8t
Z2VuZXJhdGVkIGJ5IG9wY29kZV9nZW5lcmF0b3IucmIuCisgICAgdm9pZCBnZW5lcmF0ZShNYWNy
b0Fzc2VtYmxlciYpOworCisgICAgdm9pZCBkdW1wKFByaW50U3RyZWFtJikgY29uc3Q7CisKKyAg
ICBPcGNvZGUgb3Bjb2RlOworICAgIEFyZ0xpc3QgYXJnczsKKyAgICBWYWx1ZSogb3JpZ2luOyAv
LyBUaGUgQjM6OlZhbHVlIHRoYXQgdGhpcyBvcmlnaW5hdGVkIGZyb20uCit9OworCit9IH0gfSAv
LyBuYW1lc3BhY2UgSlNDOjpCMzo6QWlyCisKKyNlbmRpZiAvLyBBaXJJbnN0X2gKKwpJbmRleDog
U291cmNlL0phdmFTY3JpcHRDb3JlL2IzL2Fpci9BaXJJbnN0SW5saW5lcy5oCj09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0K
LS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9haXIvQWlySW5zdElubGluZXMuaAkocmV2aXNp
b24gMCkKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9haXIvQWlySW5zdElubGluZXMuaAko
d29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDY2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE1
IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBh
bmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1v
ZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29u
ZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29k
ZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlz
dCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRp
c3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHly
aWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxv
d2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIg
bWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNP
RlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVY
UFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBU
TywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRO
RVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBF
VkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBB
TlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwg
T1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywK
KyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0Yg
VVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dF
VkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElO
IENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJ
R0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAq
IE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0Yg
U1VDSCBEQU1BR0UuIAorICovCisKKyNpZm5kZWYgQWlySW5zdElubGluZXNfaAorI2RlZmluZSBB
aXJJbnN0SW5saW5lc19oCisKKyNpbmNsdWRlICJBaXJJbnN0LmgiCisjaW5jbHVkZSAiQWlyT3Bj
b2RlVXRpbHMuaCIKKyNpbmNsdWRlICJBaXJTcGVjaWFscy5oIgorI2luY2x1ZGUgIkIzU3RhY2tt
YXAuaCIKKyNpbmNsdWRlICJCM1ZhbHVlLmgiCisKK25hbWVzcGFjZSBKU0MgeyBuYW1lc3BhY2Ug
QjMgeyBuYW1lc3BhY2UgQWlyIHsKKwordGVtcGxhdGU8dHlwZW5hbWUgRnVuY3Rvcj4KK3ZvaWQg
SW5zdDo6Zm9yRWFjaENsb2JiZXJlZFJlZyhjb25zdCBGdW5jdG9yJiBmdW5jdG9yKQoreworICAg
IHN3aXRjaCAob3Bjb2RlKSB7CisgICAgY2FzZSBDaGVjazoKKyAgICBjYXNlIENoZWNrQWRkOgor
ICAgIGNhc2UgQ2hlY2tTdWI6CisgICAgY2FzZSBDaGVja011bDoKKyAgICBjYXNlIFBhdGNocG9p
bnQ6CisgICAgICAgIG9yaWdpbi0+c3RhY2ttYXAoKS0+Y2xvYmJlcmVkKCkuZm9yRWFjaChmdW5j
dG9yKTsKKyAgICAgICAgYnJlYWs7CisKKyAgICBjYXNlIENhbGw6IHsKKyAgICAgICAgUmVnaXN0
ZXJTZXQgY2FsbGVlU2F2ZVJlZ2lzdGVycyA9IFJlZ2lzdGVyU2V0OjpjYWxsZWVTYXZlUmVnaXN0
ZXJzKCk7CisgICAgICAgIGZvciAoUmVnIHJlZyA6IFJlZzo6YWxsKCkpIHsKKyAgICAgICAgICAg
IGlmICghY2FsbGVlU2F2ZVJlZ2lzdGVycy5nZXQocmVnKSkKKyAgICAgICAgICAgICAgICBmdW5j
dG9yKHJlZyk7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgZGVmYXVs
dDoKKyAgICAgICAgYnJlYWs7CisgICAgfQorfQorCit9IH0gfSAvLyBuYW1lc3BhY2UgSlNDOjpC
Mzo6QWlyCisKKyNlbmRpZiAvLyBBaXJJbnN0SW5saW5lc19oCisKSW5kZXg6IFNvdXJjZS9KYXZh
U2NyaXB0Q29yZS9iMy9haXIvQWlyT3Bjb2Rlcy5vcGNvZGVzCj09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJj
ZS9KYXZhU2NyaXB0Q29yZS9iMy9haXIvQWlyT3Bjb2Rlcy5vcGNvZGVzCShyZXZpc2lvbiAwKQor
KysgU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL2Fpci9BaXJPcGNvZGVzLm9wY29kZXMJKHdvcmtp
bmcgY29weSkKQEAgLTAsMCArMSw5MyBAQAorIyBDb3B5cmlnaHQgKEMpIDIwMTUgQXBwbGUgSW5j
LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorIworIyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNv
dXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyMgbW9kaWZpY2F0aW9uLCBh
cmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisjIGFy
ZSBtZXQ6CisjIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0
aGUgYWJvdmUgY29weXJpZ2h0CisjICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMg
YW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyMgMi4gUmVkaXN0cmlidXRpb25zIGluIGJp
bmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyMgICAgbm90aWNl
LCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGlu
IHRoZQorIyAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQg
d2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorIworIyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZ
IEFQUExFIElOQy4gQU5EIElUUyBDT05UUklCVVRPUlMgYGBBUyBJUycnCisjIEFORCBBTlkgRVhQ
UkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRP
LAorIyBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVT
UyBGT1IgQSBQQVJUSUNVTEFSCisjIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5U
IFNIQUxMIEFQUExFIElOQy4gT1IgSVRTIENPTlRSSUJVVE9SUworIyBCRSBMSUFCTEUgRk9SIEFO
WSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCisj
IENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBS
T0NVUkVNRU5UIE9GCisjIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNF
LCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUworIyBJTlRFUlJVUFRJT04pIEhPV0VWRVIg
Q0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTgorIyBDT05U
UkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1Ig
T1RIRVJXSVNFKQorIyBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBT
T0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GCisjIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERB
TUFHRS4KKworIyBTeWxsYWJ1czoKKyMgVTpHID0+IHVzZSBvZiBhIGdlbmVyYWwtcHVycG9zZSBy
ZWdpc3RlciBvciB2YWx1ZQorIyBEOkcgPT4gZGVmIG9mIGEgZ2VuZXJhbC1wdXJwb3NlIHJlZ2lz
dGVyIG9yIHZhbHVlCisjIFVEOkcgPT4gdXNlIGFuZCBkZWYgb2YgYSBnZW5lcmFsLXB1cnBvc2Ug
cmVnaXN0ZXIgb3IgdmFsdWUKKyMgVTpGID0+IHVzZSBvZiBhIGZsb2F0IHJlZ2lzdGVyIG9yIHZh
bHVlCisjIEQ6RiA9PiBkZWYgb2YgYSBmbG9hdCByZWdpc3RlciBvciB2YWx1ZQorIyBVRDpGID0+
IHVzZSBhbmQgZGVmIG9mIGEgZmxvYXQgcmVnaXN0ZXIgb3IgdmFsdWUKKyMgVG1wID0+IHRlbXBv
cmFyeSBvciByZWdpc3RlcgorIyBBZGRyID0+IGFkZHJlc3MgYXMgdGVtcG9yYXJ5L3JlZ2lzdGVy
K29mZnNldAorIyBJbmRleCA9PiBCYXNlSW5kZXggYWRkcmVzcworIyBBYnMgPT4gQWJzb2x1dGVB
ZGRyZXNzCisKKyMgTm90ZSB0aGF0IHRoZSBvcGNvZGVzIGhlcmUgaGF2ZSBhIGxlYWRpbmcgY2Fw
aXRhbCAoQWRkMzIpIGJ1dCBtdXN0IGNvcnJlc3BvbmQgdG8gTWFjcm9Bc3NlbWJsZXIKKyMgQVBJ
IHRoYXQgaGFzIGEgbGVhZGluZyBsb3dlci1jYXNlIChhZGQzMikuCisKK0FkZDMyIFU6RywgVUQ6
RworICAgIFRtcCwgVG1wCisgICAgSW1tLCBBZGRyCisgICAgSW1tLCBUbXAKKyAgICBBZGRyLCBU
bXAKKyAgICBUbXAsIEFkZHIKKworQWRkMzIgVTpHLCBVOkcsIEQ6RworICAgIEltbSwgVG1wLCBU
bXAKKworQW5kMzIgVTpHLCBVRDpHCisgICAgVG1wLCBUbXAKKyAgICBJbW0sIFRtcAorICAgIFRt
cCwgQWRkcgorICAgIEFkZHIsIFRtcAorICAgIEltbSwgQWRkcgorCitMc2hpZnQzMiBVOkcsIFVE
OkcKKyAgICBUbXAqLCBUbXAKKyAgICBJbW0sIFRtcAorCitNdWwzMiBVOkcsIFVEOkcKKyAgICBU
bXAsIFRtcAorICAgIEFkZHIsIFRtcAorCitNb3ZlIFU6RywgRDpHCisgICAgVG1wLCBUbXAKKyAg
ICBJbW0sIFRtcAorICAgIEltbVB0ciwgVG1wCisgICAgQWRkciwgVG1wIGFzIGxvYWQgIyBUaGlz
IG1lYW5zIHRoYXQgIk1vdmUgQWRkciwgVG1wIiBpcyBjb2RlLWdlbmVyYXRlZCBhcyAibG9hZCIg
bm90ICJtb3ZlIi4KKyAgICBUbXAsIEFkZHIgYXMgc3RvcmUKKworTW92ZURvdWJsZSBVOkYsIEQ6
RgorICAgIFRtcCwgVG1wCisgICAgQWRkciwgVG1wIGFzIGxvYWREb3VibGUKKyAgICBUbXAsIEFk
ZHIgYXMgc3RvcmVEb3VibGUKKworTW92ZTY0VG9Eb3VibGUgVTpHLCBEOkYKKyAgICBUbXAsIFRt
cAorCitNb3ZlRG91YmxlVG82NCBVOkYsIEQ6RworICAgIFRtcCwgVG1wCisKKyMgU29tZSBvcGNv
ZGVzIGJlaGF2ZSBleG90aWNhbGx5LiBGb3IgZXhhbXBsZSwgdGhleSBtYXkgaGF2ZSB2YXJhcmdz
LiBPciwgdGhleSBtYXkgcmVxdWlyZSBhIHNwZWNpYWwKKyMgY2xhc3Mgb2YgcmVnaXN0ZXJzIGZv
ciBzb21lIG9wZXJhbmQuIE9yLCB0aGV5IG1heSB1c2Ugb3IgZGVmIGFkZGl0aW9uYWwgcmVnaXN0
ZXJzLgorCisjIFRoZXNlIGJlaGF2ZSBsaWtlIGhvdyB0aGUgU3RhY2ttYXAgb2JqZWN0IHRlbGxz
IHRoZW0gdG8gYmVoYXZlLgorc3BlY2lhbCBDaGVja0FkZAorc3BlY2lhbCBDaGVja1N1YiAKK3Nw
ZWNpYWwgQ2hlY2tNdWwKK3NwZWNpYWwgQ2hlY2sKK3NwZWNpYWwgUGF0Y2hwb2ludAorCisjIFRh
a2VzIGFyZ3VtZW50IHJlZ2lzdGVycyBhcyBpbnB1dHMuCitzcGVjaWFsIENhbGwKSW5kZXg6IFNv
dXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9haXIvQWlyVG1wLmNwcAo9PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3Vy
Y2UvSmF2YVNjcmlwdENvcmUvYjMvYWlyL0FpclRtcC5jcHAJKHJldmlzaW9uIDApCisrKyBTb3Vy
Y2UvSmF2YVNjcmlwdENvcmUvYjMvYWlyL0FpclRtcC5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTAs
MCArMSw1MiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNSBBcHBsZSBJbmMuIEFsbCByaWdo
dHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5k
IGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJt
aXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6
CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFi
b3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQg
dGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFy
eSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwg
dGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0
aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3
aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBC
WSBBUFBMRSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FS
UkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBX
QVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFS
CisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5D
LiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1Qs
IElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFN
QUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBT
VUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBS
T0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFO
WSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJ
QUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkg
QVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBF
VkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLiAKKyAqLwor
CisjaW5jbHVkZSAiY29uZmlnLmgiCisjaW5jbHVkZSAiQWlyVG1wLmgiCisKK25hbWVzcGFjZSBK
U0MgeyBuYW1lc3BhY2UgQjMgeyBuYW1lc3BhY2UgQWlyIHsKKwordm9pZCBUbXA6OmR1bXAoUHJp
bnRTdHJlYW0mIG91dCkgY29uc3QKK3sKKyAgICBpZiAoISp0aGlzKSB7CisgICAgICAgIG91dC5w
cmludCgiPG5vbmU+Iik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpZiAoaXNSZWco
KSkgeworICAgICAgICBvdXQucHJpbnQocmVnKCkpOworICAgICAgICByZXR1cm47CisgICAgfQor
CisgICAgaWYgKGlzR1BUbXAoKSkgeworICAgICAgICBvdXQucHJpbnQoIiV0bXAiLCBncFRtcElu
ZGV4KCkpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgb3V0LnByaW50KCIlZnRtcCIs
IGZwVG1wSW5kZXgoKSk7Cit9CisKK30gfSB9IC8vIG5hbWVzcGFjZSBKU0M6OkIzOjpBaXIKKwpJ
bmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL2Fpci9BaXJUbXAuaAo9PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0t
LSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvYWlyL0FpclRtcC5oCShyZXZpc2lvbiAwKQorKysg
U291cmNlL0phdmFTY3JpcHRDb3JlL2IzL2Fpci9BaXJUbXAuaAkod29ya2luZyBjb3B5KQpAQCAt
MCwwICsxLDI0OCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNSBBcHBsZSBJbmMuIEFsbCBy
aWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2Ug
YW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBw
ZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBt
ZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhl
IGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBh
bmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJp
bmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGlj
ZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBp
biB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRl
ZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURF
RCBCWSBBUFBMRSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQg
V0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElF
RCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNV
TEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUg
SU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJF
Q1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwg
REFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBP
RiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAq
IFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9O
IEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNU
IExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lT
RSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJF
LCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLiAKKyAq
LworCisjaWZuZGVmIEFpclRtcF9oCisjZGVmaW5lIEFpclRtcF9oCisKKyNpbmNsdWRlICJSZWcu
aCIKKworbmFtZXNwYWNlIEpTQyB7IG5hbWVzcGFjZSBCMyB7IG5hbWVzcGFjZSBBaXIgeworCisv
LyBBIFRtcCBpcyBhIGdlbmVyYWxpemF0aW9uIG9mIGEgcmVnaXN0ZXIuIEl0IGNhbiBiZSB1c2Vk
IHRvIHJlZmVyIHRvIGFueSBHUFIgb3IgRlBSLiBJdCBjYW4gYWxzbworLy8gYmUgdXNlZCB0byBy
ZWZlciB0byBhbiB1bmFsbG9jYXRlZCByZWdpc3RlciAoaS5lLiBhIHRlbXBvcmFyeSkuIExpa2Ug
bWFueSBBaXIgY2xhc3Nlcywgd2UgdXNlCisvLyBkZWxpYmVyYXRlbHkgdGVyc2UgbmFtaW5nIHNp
bmNlIHdlIHdpbGwgaGF2ZSB0byB1c2UgdGhpcyBuYW1lIGEgbG90LgorCitjbGFzcyBUbXAgewor
cHVibGljOgorICAgIFRtcCgpCisgICAgICAgIDogbV92YWx1ZSgwKQorICAgIHsKKyAgICB9CisK
KyAgICBleHBsaWNpdCBUbXAoUmVnIHJlZykKKyAgICB7CisgICAgICAgIGlmIChyZWcpIHsKKyAg
ICAgICAgICAgIGlmIChyZWcuaXNHUFIoKSkKKyAgICAgICAgICAgICAgICBtX3ZhbHVlID0gZW5j
b2RlR1BSKHJlZy5ncHIoKSk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgbV92
YWx1ZSA9IGVuY29kZUZQUihyZWcuZnByKCkpOworICAgICAgICB9IGVsc2UKKyAgICAgICAgICAg
IG1fdmFsdWUgPSAwOworICAgIH0KKworICAgIHN0YXRpYyBUbXAgZ3BUbXBGb3JJbmRleCh1bnNp
Z25lZCBpbmRleCkKKyAgICB7CisgICAgICAgIFRtcCByZXN1bHQ7CisgICAgICAgIHJlc3VsdC5t
X3ZhbHVlID0gZW5jb2RlR1BUbXAoaW5kZXgpOworICAgICAgICByZXR1cm4gcmVzdWx0OworICAg
IH0KKworICAgIHN0YXRpYyBUbXAgZnBUbXBGb3JJbmRleCh1bnNpZ25lZCBpbmRleCkKKyAgICB7
CisgICAgICAgIFRtcCByZXN1bHQ7CisgICAgICAgIHJlc3VsdC5tX3ZhbHVlID0gZW5jb2RlRlBU
bXAoaW5kZXgpOworICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKworICAgIHN0YXRpYyBU
bXAgZm9yUmF3VmFsdWUodW5zaWduZWQgaW5kZXgpCisgICAgeworICAgICAgICBUbXAgcmVzdWx0
OworICAgICAgICByZXN1bHQubV92YWx1ZSA9IGluZGV4OworICAgICAgICByZXR1cm4gcmVzdWx0
OworICAgIH0KKworICAgIGV4cGxpY2l0IG9wZXJhdG9yIGJvb2woKSBjb25zdCB7IHJldHVybiAh
IW1fdmFsdWU7IH0KKworICAgIGJvb2wgcmF3VmFsdWUoKSBjb25zdCB7IHJldHVybiBtX3ZhbHVl
OyB9CisKKyAgICBib29sIGlzR1AoKSBjb25zdAorICAgIHsKKyAgICAgICAgcmV0dXJuIGlzRW5j
b2RlZEdQKG1fdmFsdWUpOworICAgIH0KKworICAgIGJvb2wgaXNGUCgpIGNvbnN0CisgICAgewor
ICAgICAgICByZXR1cm4gaXNFbmNvZGVkRlAobV92YWx1ZSk7CisgICAgfQorCisgICAgYm9vbCBp
c0dQUigpIGNvbnN0CisgICAgeworICAgICAgICByZXR1cm4gaXNFbmNvZGVkR1BSKG1fdmFsdWUp
OworICAgIH0KKworICAgIGJvb2wgaXNGUFIoKSBjb25zdAorICAgIHsKKyAgICAgICAgcmV0dXJu
IGlzRW5jb2RlZEZQUihtX3ZhbHVlKTsKKyAgICB9CisKKyAgICBib29sIGlzUmVnKCkgY29uc3QK
KyAgICB7CisgICAgICAgIHJldHVybiBpc0dQUigpIHx8IGlzRlBSKCk7CisgICAgfQorCisgICAg
R1BSUmVnIGdwcigpIGNvbnN0CisgICAgeworICAgICAgICByZXR1cm4gZGVjb2RlR1BSKG1fdmFs
dWUpOworICAgIH0KKworICAgIEZQUlJlZyBmcHIoKSBjb25zdAorICAgIHsKKyAgICAgICAgcmV0
dXJuIGRlY29kZUZQUihtX3ZhbHVlKTsKKyAgICB9CisKKyAgICBSZWcgcmVnKCkgY29uc3QKKyAg
ICB7CisgICAgICAgIGlmIChpc0dQKCkpCisgICAgICAgICAgICByZXR1cm4gZ3ByKCk7CisgICAg
ICAgIHJldHVybiBmcHIoKTsKKyAgICB9CisKKyAgICB1bnNpZ25lZCBncFRtcEluZGV4KCkgY29u
c3QKKyAgICB7CisgICAgICAgIHJldHVybiBkZWNvZGVHUFRtcChtX3ZhbHVlKTsKKyAgICB9CisK
KyAgICB1bnNpZ25lZCBmcFRtcEluZGV4KCkgY29uc3QKKyAgICB7CisgICAgICAgIHJldHVybiBk
ZWNvZGVGUFRtcChtX3ZhbHVlKTsKKyAgICB9CisKKyAgICB1bnNpZ25lZCB0bXBJbmRleCgpIGNv
bnN0CisgICAgeworICAgICAgICBpZiAoaXNHUCgpKQorICAgICAgICAgICAgcmV0dXJuIGdwVG1w
SW5kZXgoKTsKKyAgICAgICAgcmV0dXJuIGZwVG1wSW5kZXgoKTsKKyAgICB9CisKKyAgICBib29s
IG9wZXJhdG9yPT0oY29uc3QgVG1wJiBvdGhlcikgY29uc3QKKyAgICB7CisgICAgICAgIHJldHVy
biBtX3ZhbHVlID09IG90aGVyLm1fdmFsdWU7CisgICAgfQorCisgICAgYm9vbCBvcGVyYXRvciE9
KGNvbnN0IFRtcCYgb3RoZXIpIGNvbnN0CisgICAgeworICAgICAgICByZXR1cm4gISgqdGhpcyA9
PSBvdGhlcik7CisgICAgfQorCisgICAgdm9pZCBkdW1wKFByaW50U3RyZWFtJiBvdXQpIGNvbnN0
OworICAgIAorcHJpdmF0ZToKKyAgICBzdGF0aWMgaW50IGVuY29kZUdQKHVuc2lnbmVkIGluZGV4
KQorICAgIHsKKyAgICAgICAgcmV0dXJuIDEgKyBpbmRleDsKKyAgICB9CisKKyAgICBzdGF0aWMg
aW50IGVuY29kZUZQKHVuc2lnbmVkIGluZGV4KQorICAgIHsKKyAgICAgICAgcmV0dXJuIC0xIC0g
aW5kZXg7CisgICAgfQorCisgICAgc3RhdGljIGludCBlbmNvZGVHUFIoR1BSUmVnIGdwcikKKyAg
ICB7CisgICAgICAgIHJldHVybiBlbmNvZGVHUChncHIgLSBNYWNyb0Fzc2VtYmxlcjo6Zmlyc3RS
ZWdpc3RlcigpKTsKKyAgICB9CisKKyAgICBzdGF0aWMgaW50IGVuY29kZUZQUihGUFJSZWcgZnBy
KQorICAgIHsKKyAgICAgICAgcmV0dXJuIGVuY29kZUZQKGZwciAtIE1hY3JvQXNzZW1ibGVyOjpm
aXJzdEZQUlJlZ2lzdGVyKCkpOworICAgIH0KKworICAgIHN0YXRpYyBpbnQgZW5jb2RlR1BUbXAo
dW5zaWduZWQgaW5kZXgpCisgICAgeworICAgICAgICByZXR1cm4gZW5jb2RlR1BSKE1hY3JvQXNz
ZW1ibGVyOjpsYXN0UmVnaXN0ZXIoKSkgKyAxICsgaW5kZXg7CisgICAgfQorCisgICAgc3RhdGlj
IGludCBlbmNvZGVGUFRtcCh1bnNpZ25lZCBpbmRleCkKKyAgICB7CisgICAgICAgIHJldHVybiBl
bmNvZGVGUFIoTWFjcm9Bc3NlbWJsZXI6Omxhc3RGUFJlZ2lzdGVyKCkpIC0gMSAtIGluZGV4Owor
ICAgIH0KKworICAgIHN0YXRpYyBib29sIGlzRW5jb2RlZEdQKGludCB2YWx1ZSkKKyAgICB7Cisg
ICAgICAgIHJldHVybiB2YWx1ZSA+IDA7CisgICAgfQorCisgICAgc3RhdGljIGJvb2wgaXNFbmNv
ZGVkRlAoaW50IHZhbHVlKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHZhbHVlIDwgMDsKKyAgICB9
CisKKyAgICBzdGF0aWMgYm9vbCBpc0VuY29kZWRHUFIoaW50IHZhbHVlKQorICAgIHsKKyAgICAg
ICAgcmV0dXJuIGlzRW5jb2RlZEdQKHZhbHVlKSAmJiB2YWx1ZSA8PSBlbmNvZGVHUFIoTWFjcm9B
c3NlbWJsZXI6Omxhc3RSZWdpc3RlcigpKTsKKyAgICB9CisKKyAgICBzdGF0aWMgYm9vbCBpc0Vu
Y29kZWRGUFIoaW50IHZhbHVlKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGlzRW5jb2RlZEZQKHZh
bHVlKSAmJiB2YWx1ZSA+PSBlbmNvZGVkRlBSKE1hY3JvQXNzZW1ibGVyOjpsYXN0RlBSZWdpc3Rl
cigpKTsKKyAgICB9CisKKyAgICBzdGF0aWMgYm9vbCBpc0VuY29kZWRHUFRtcChpbnQgdmFsdWUp
CisgICAgeworICAgICAgICByZXR1cm4gaXNFbmNvZGVkR1AodmFsdWUpICYmICFpc0VuY29kZWRH
UFIodmFsdWUpOworICAgIH0KKworICAgIHN0YXRpYyBib29sIGlzRW5jb2RlZEZQVG1wKGludCB2
YWx1ZSkKKyAgICB7CisgICAgICAgIHJldHVybiBpc0VuY29kZWRGUCh2YWx1ZSkgJiYgIWlzRW5j
b2RlZEZQUih2YWx1ZSk7CisgICAgfQorCisgICAgc3RhdGljIEdQUlJlZyBkZWNvZGVHUFIoaW50
IHZhbHVlKQorICAgIHsKKyAgICAgICAgQVNTRVJUKGlzRW5jb2RlZEdQUih2YWx1ZSkpOworICAg
ICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8R1BSUmVnPigKKyAgICAgICAgICAgICh2YWx1ZSAtIGVu
Y29kZUdQUihNYWNyb0Fzc2VtYmxlcjo6Zmlyc3RSZWdpc3RlcigpKSkgKyBNYWNyb0Fzc2VtYmxl
cjo6Zmlyc3RSZWdpc3RlcigpKTsKKyAgICB9CisKKyAgICBzdGF0aWMgRlBSUmVnIGRlY29kZUZQ
UihpbnQgdmFsdWUpCisgICAgeworICAgICAgICBBU1NFUlQoaXNFbmNvZGVkRlBSKHZhbHVlKSk7
CisgICAgICAgIHJldHVybiBzdGF0aWNfY2FzdDxGUFJSZWc+KAorICAgICAgICAgICAgKGVuY29k
ZUZQUihNYWNyb0Fzc2VtYmxlcjo6Zmlyc3RGUFJlZ2lzdGVyKCkpIC0gdmFsdWUpICsKKyAgICAg
ICAgICAgIE1hY3JvQXNzZW1ibGVyOjpmaXJzdEZQUmVnaXN0ZXIoKSk7CisgICAgfQorCisgICAg
c3RhdGljIHVuc2lnbmVkIGRlY29kZUdQVG1wKGludCB2YWx1ZSkKKyAgICB7CisgICAgICAgIEFT
U0VSVChpc0VuY29kZWRHUFRtcCh2YWx1ZSkpOworICAgICAgICByZXR1cm4gdmFsdWUgLSAoZW5j
b2RlR1BSKE1hY3JvQXNzZW1ibGVyOjpsYXN0UmVnaXN0ZXIoKSkgKyAxKTsKKyAgICB9CisKKyAg
ICBzdGF0aWMgdW5zaWduZWQgZGVjb2RlRlBUbXAoaW50IHZhbHVlKQorICAgIHsKKyAgICAgICAg
QVNTRVJUKGlzRW5jb2RlZEZQVG1wKHZhbHVlKSk7CisgICAgICAgIHJldHVybiAoZW5jb2RlRlBS
KE1hY3JvQXNzZW1ibGVyOjpsYXN0RlBSZWdpc3RlcigpKSAtIDEpIC0gdmFsdWU7CisgICAgfQor
CisgICAgLy8gMDogZW1wdHkgVG1wCisgICAgLy8gcG9zaXRpdmU6IEdQUnMgYW5kIHRoZW4gR1Ag
dGVtcHMuCisgICAgLy8gbmVnYXRpdmU6IEZQUnMgYW5kIHRoZW4gRlAgdGVtcHMuCisgICAgaW50
IG1fdmFsdWU7Cit9OworCit9IH0gfSAvLyBuYW1lc3BhY2UgSlNDOjpCMzo6QWlyCisKKyNlbmRp
ZiAvLyBBaXJUbXBfaAorCkluZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvYWlyL29wY29k
ZV9nZW5lcmF0b3IucmIKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL2Fp
ci9vcGNvZGVfZ2VuZXJhdG9yLnJiCShyZXZpc2lvbiAwKQorKysgU291cmNlL0phdmFTY3JpcHRD
b3JlL2IzL2Fpci9vcGNvZGVfZ2VuZXJhdG9yLnJiCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEs
NzQ4IEBACisjIS91c3IvYmluL2VudiBydWJ5CisKKyMgQ29weXJpZ2h0IChDKSAyMDE1IEFwcGxl
IEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyMKKyMgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBp
biBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisjIG1vZGlmaWNhdGlv
biwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwor
IyBhcmUgbWV0OgorIyAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRh
aW4gdGhlIGFib3ZlIGNvcHlyaWdodAorIyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRp
b25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisjIDIuIFJlZGlzdHJpYnV0aW9ucyBp
biBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisjICAgIG5v
dGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1l
ciBpbiB0aGUKKyMgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3Zp
ZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyMKKyMgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURF
RCBCWSBBUFBMRSBJTkMuIEFORCBJVFMgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJworIyBBTkQgQU5Z
IEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRF
RCBUTywKKyMgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJ
VE5FU1MgRk9SIEEgUEFSVElDVUxBUgorIyBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBF
VkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SIElUUyBDT05UUklCVVRPUlMKKyMgQkUgTElBQkxFIEZP
UiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBP
UgorIyBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRP
LCBQUk9DVVJFTUVOVCBPRgorIyBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9G
IFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MKKyMgSU5URVJSVVBUSU9OKSBIT1dF
VkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KKyMg
Q09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNF
IE9SIE9USEVSV0lTRSkKKyMgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRI
SVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRgorIyBUSEUgUE9TU0lCSUxJVFkgT0YgU1VD
SCBEQU1BR0UuCisKK3JlcXVpcmUgInBhdGhuYW1lIgorCitjbGFzcyBPcGNvZGUKKyAgICBhdHRy
X3JlYWRlciA6bmFtZSwgOnNwZWNpYWwsIDpvdmVybG9hZHMKKworICAgIGRlZiBpbml0aWFsaXpl
KG5hbWUsIHNwZWNpYWwpCisgICAgICAgIEBuYW1lID0gbmFtZQorICAgICAgICBAc3BlY2lhbCA9
IHNwZWNpYWwKKyAgICAgICAgdW5sZXNzIHNwZWNpYWwKKyAgICAgICAgICAgIEBvdmVybG9hZHMg
PSBbXQorICAgICAgICBlbmQKKyAgICBlbmQKKworICAgIGRlZiBtYXNtTmFtZQorICAgICAgICBu
YW1lWzBdLmRvd25jYXNlICsgbmFtZVsxLi4tMV0KKyAgICBlbmQKK2VuZAorCitjbGFzcyBBcmcK
KyAgICBhdHRyX3JlYWRlciA6cm9sZSwgOnR5cGUKKworICAgIGRlZiBpbml0aWFsaXplKHJvbGUs
IHR5cGUpCisgICAgICAgIEByb2xlID0gcm9sZQorICAgICAgICBAdHlwZSA9IHR5cGUKKyAgICBl
bmQKK2VuZAorCitjbGFzcyBPdmVybG9hZAorICAgIGF0dHJfcmVhZGVyIDpzaWduYXR1cmUsIDpm
b3JtcworCisgICAgZGVmIGluaXRpYWxpemUoc2lnbmF0dXJlLCBmb3JtcykKKyAgICAgICAgQHNp
Z25hdHVyZSA9IHNpZ25hdHVyZQorICAgICAgICBAZm9ybXMgPSBmb3JtcworICAgIGVuZAorZW5k
CisKK2NsYXNzIEtpbmQKKyAgICBhdHRyX3JlYWRlciA6bmFtZQorICAgIGF0dHJfYWNjZXNzb3Ig
OnNwZWNpYWwKKworICAgIGRlZiBpbml0aWFsaXplKG5hbWUpCisgICAgICAgIEBuYW1lID0gbmFt
ZQorICAgICAgICBAc3BlY2lhbCA9IGZhbHNlCisgICAgZW5kCisKKyAgICBkZWYgPT0ob3RoZXIp
CisgICAgICAgIGlmIG90aGVyLmlzX2E/IFN0cmluZworICAgICAgICAgICAgQG5hbWUgPT0gb3Ro
ZXIKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgQG5hbWUgPT0gb3RoZXIubmFtZSBhbmQgQHNw
ZWNpYWwgPT0gb3RoZXIuc3BlY2lhbAorICAgICAgICBlbmQKKyAgICBlbmQKK2VuZAorCitjbGFz
cyBGb3JtCisgICAgYXR0cl9yZWFkZXIgOmtpbmRzLCA6YWx0TmFtZQorCisgICAgZGVmIGluaXRp
YWxpemUoa2luZHMsIGFsdE5hbWUpCisgICAgICAgIEBraW5kcyA9IGtpbmRzCisgICAgICAgIEBh
bHROYW1lID0gYWx0TmFtZQorICAgIGVuZAorZW5kCisKK2NsYXNzIE9yaWdpbgorICAgIGF0dHJf
cmVhZGVyIDpmaWxlTmFtZSwgOmxpbmVOdW1iZXIKKyAgICAKKyAgICBkZWYgaW5pdGlhbGl6ZShm
aWxlTmFtZSwgbGluZU51bWJlcikKKyAgICAgICAgQGZpbGVOYW1lID0gZmlsZU5hbWUKKyAgICAg
ICAgQGxpbmVOdW1iZXIgPSBsaW5lTnVtYmVyCisgICAgZW5kCisgICAgCisgICAgZGVmIHRvX3MK
KyAgICAgICAgIiN7ZmlsZU5hbWV9OiN7bGluZU51bWJlcn0iCisgICAgZW5kCitlbmQKKworY2xh
c3MgVG9rZW4KKyAgICBhdHRyX3JlYWRlciA6b3JpZ2luLCA6c3RyaW5nCisgICAgCisgICAgZGVm
IGluaXRpYWxpemUob3JpZ2luLCBzdHJpbmcpCisgICAgICAgIEBvcmlnaW4gPSBvcmlnaW4KKyAg
ICAgICAgQHN0cmluZyA9IHN0cmluZworICAgIGVuZAorICAgIAorICAgIGRlZiA9PShvdGhlcikK
KyAgICAgICAgaWYgb3RoZXIuaXNfYT8gVG9rZW4KKyAgICAgICAgICAgIEBzdHJpbmcgPT0gb3Ro
ZXIuc3RyaW5nCisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIEBzdHJpbmcgPT0gb3RoZXIKKyAg
ICAgICAgZW5kCisgICAgZW5kCisgICAgCisgICAgZGVmID1+KG90aGVyKQorICAgICAgICBAc3Ry
aW5nID1+IG90aGVyCisgICAgZW5kCisgICAgCisgICAgZGVmIHRvX3MKKyAgICAgICAgIiN7QHN0
cmluZy5pbnNwZWN0fSBhdCAje29yaWdpbn0iCisgICAgZW5kCisgICAgCisgICAgZGVmIHBhcnNl
RXJyb3IoKmNvbW1lbnQpCisgICAgICAgIGlmIGNvbW1lbnQuZW1wdHk/CisgICAgICAgICAgICBy
YWlzZSAiUGFyc2UgZXJyb3I6ICN7dG9fc30iCisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHJh
aXNlICJQYXJzZSBlcnJvcjogI3t0b19zfTogI3tjb21tZW50WzBdfSIKKyAgICAgICAgZW5kCisg
ICAgZW5kCitlbmQKKworZGVmIGxleChzdHIsIGZpbGVOYW1lKQorICAgIGZpbGVOYW1lID0gUGF0
aG5hbWUubmV3KGZpbGVOYW1lKQorICAgIHJlc3VsdCA9IFtdCisgICAgbGluZU51bWJlciA9IDEK
KyAgICB3aGlsZSBub3Qgc3RyLmVtcHR5PworICAgICAgICBjYXNlIHN0cgorICAgICAgICB3aGVu
IC9cQVwjKFteXG5dKikvCisgICAgICAgICAgICAjIGNvbW1lbnQsIGlnbm9yZQorICAgICAgICB3
aGVuIC9cQVxuLworICAgICAgICAgICAgIyBuZXdsaW5lLCBpZ25vcmUKKyAgICAgICAgICAgIGxp
bmVOdW1iZXIgKz0gMQorICAgICAgICB3aGVuIC9cQShbYS16QS1aMC05X10rKS8KKyAgICAgICAg
ICAgIHJlc3VsdCA8PCBUb2tlbi5uZXcoT3JpZ2luLm5ldyhmaWxlTmFtZSwgbGluZU51bWJlciks
ICQmKQorICAgICAgICB3aGVuIC9cQShbIFx0XHJdKykvCisgICAgICAgICAgICAjIHdoaXRlc3Bh
Y2UsIGlnbm9yZQorICAgICAgICB3aGVuIC9cQVssOipdLworICAgICAgICAgICAgcmVzdWx0IDw8
IFRva2VuLm5ldyhPcmlnaW4ubmV3KGZpbGVOYW1lLCBsaW5lTnVtYmVyKSwgJCYpCisgICAgICAg
IGVsc2UKKyAgICAgICAgICAgIHJhaXNlICJMZXhlciBlcnJvciBhdCAje09yaWdpbi5uZXcoZmls
ZU5hbWUsIGxpbmVOdW1iZXIpLnRvX3N9LCB1bmV4cGVjdGVkIHNlcXVlbmNlICN7c3RyWzAuLjIw
XS5pbnNwZWN0fSIKKyAgICAgICAgZW5kCisgICAgICAgIHN0ciA9ICR+LnBvc3RfbWF0Y2gKKyAg
ICBlbmQKKyAgICByZXN1bHQKK2VuZAorCitkZWYgaXNVRCh0b2tlbikKKyAgICB0b2tlbiA9fiAv
XEEoKFUpfChEKXwoVUQpKVxaLworZW5kCisKK2RlZiBpc0dGKHRva2VuKQorICAgIHRva2VuID1+
IC9cQSgoRyl8KEYpKVxaLworZW5kCisKK2RlZiBpc0tpbmQodG9rZW4pCisgICAgdG9rZW4gPX4g
L1xBKChUbXApfChJbW0pfChJbW1QdHIpfChBZGRyKXwoSW5kZXgpKVxaLworZW5kCisKK2RlZiBp
c0tleXdvcmQodG9rZW4pCisgICAgaXNVRCh0b2tlbikgb3IgaXNHRih0b2tlbikgb3IgaXNLaW5k
KHRva2VuKSBvcgorICAgICAgICB0b2tlbiA9PSAic3BlY2lhbCIgb3IgdG9rZW4gPT0gImFzIgor
ZW5kCisKK2RlZiBpc0lkZW50aWZpZXIodG9rZW4pCisgICAgdG9rZW4gPX4gL1xBKFthLXpBLVow
LTlfXSspXFovIGFuZCBub3QgaXNLZXl3b3JkKHRva2VuKQorZW5kCisKK2NsYXNzIFBhcnNlcgor
ICAgIGRlZiBpbml0aWFsaXplKGRhdGEsIGZpbGVOYW1lKQorICAgICAgICBAdG9rZW5zID0gbGV4
KGRhdGEsIGZpbGVOYW1lKQorICAgICAgICBAaWR4ID0gMAorICAgIGVuZAorCisgICAgZGVmIHRv
a2VuCisgICAgICAgIEB0b2tlbnNbQGlkeF0KKyAgICBlbmQKKworICAgIGRlZiBhZHZhbmNlCisg
ICAgICAgIEBpZHggKz0gMQorICAgIGVuZAorCisgICAgZGVmIHBhcnNlRXJyb3IoKmNvbW1lbnQp
CisgICAgICAgIGlmIHRva2VuCisgICAgICAgICAgICB0b2tlbi5wYXJzZUVycm9yKCpjb21tZW50
KQorICAgICAgICBlbHNlCisgICAgICAgICAgICBpZiBjb21tZW50LmVtcHR5PworICAgICAgICAg
ICAgICAgIHJhaXNlICJQYXJzZSBlcnJvciBhdCBlbmQgb2YgZmlsZSIKKyAgICAgICAgICAgIGVs
c2UKKyAgICAgICAgICAgICAgICByYWlzZSAiUGFyc2UgZXJyb3IgYXQgZW5kIG9mIGZpbGU6ICN7
Y29tbWVudFswXX0iCisgICAgICAgICAgICBlbmQKKyAgICAgICAgZW5kCisgICAgZW5kCisKKyAg
ICBkZWYgY29uc3VtZShzdHJpbmcpCisgICAgICAgIHBhcnNlRXJyb3IoIkV4cGVjdGVkICN7c3Ry
aW5nfSIpIHVubGVzcyB0b2tlbiA9PSBzdHJpbmcKKyAgICAgICAgYWR2YW5jZQorICAgIGVuZAor
CisgICAgZGVmIGNvbnN1bWVJZGVudGlmaWVyCisgICAgICAgIHJlc3VsdCA9IHRva2VuLnN0cmlu
ZworICAgICAgICBwYXJzZUVycm9yKCJFeHBlY3RlZCBpZGVudGlmaWVyIikgdW5sZXNzIGlzSWRl
bnRpZmllcihyZXN1bHQpCisgICAgICAgIGFkdmFuY2UKKyAgICAgICAgcmVzdWx0CisgICAgZW5k
CisKKyAgICBkZWYgY29uc3VtZVJvbGUKKyAgICAgICAgcmVzdWx0ID0gdG9rZW4uc3RyaW5nCisg
ICAgICAgIHBhcnNlRXJyb3IoIkV4cGVjdGVkIHJvbGUgKFUsIEQsIG9yIFVEKSIpIHVubGVzcyBp
c1VEKHJlc3VsdCkKKyAgICAgICAgYWR2YW5jZQorICAgICAgICByZXN1bHQKKyAgICBlbmQKKwor
ICAgIGRlZiBjb25zdW1lVHlwZQorICAgICAgICByZXN1bHQgPSB0b2tlbi5zdHJpbmcKKyAgICAg
ICAgcGFyc2VFcnJvcigiRXhwZWN0ZWQgdHlwZSAoRyBvciBGKSIpIHVubGVzcyBpc0dGKHJlc3Vs
dCkKKyAgICAgICAgYWR2YW5jZQorICAgICAgICByZXN1bHQKKyAgICBlbmQKKworICAgIGRlZiBj
b25zdW1lS2luZAorICAgICAgICByZXN1bHQgPSB0b2tlbi5zdHJpbmcKKyAgICAgICAgcGFyc2VF
cnJvcigiRXhwZWN0ZWQga2luZCAoSW1tLCBJbW1QdHIsIFRtcCwgQWRkciwgb3IgSW5kZXgpIikg
dW5sZXNzIGlzS2luZChyZXN1bHQpCisgICAgICAgIGFkdmFuY2UKKyAgICAgICAgcmVzdWx0Cisg
ICAgZW5kCisKKyAgICBkZWYgcGFyc2UKKyAgICAgICAgcmVzdWx0ID0ge30KKyAgICAgICAgCisg
ICAgICAgIGxvb3AgeworICAgICAgICAgICAgYnJlYWsgaWYgQGlkeCA+PSBAdG9rZW5zLmxlbmd0
aAorCisgICAgICAgICAgICBpZiB0b2tlbiA9PSAic3BlY2lhbCIKKyAgICAgICAgICAgICAgICBj
b25zdW1lKCJzcGVjaWFsIikKKyAgICAgICAgICAgICAgICBvcGNvZGVOYW1lID0gY29uc3VtZUlk
ZW50aWZpZXIKKworICAgICAgICAgICAgICAgIHBhcnNlRXJyb3IoIkNhbm5vdCBvdmVybG9hZCBh
IHNwZWNpYWwgb3Bjb2RlIikgaWYgcmVzdWx0W29wY29kZU5hbWVdCisKKyAgICAgICAgICAgICAg
ICByZXN1bHRbb3Bjb2RlTmFtZV0gPSBPcGNvZGUubmV3KG9wY29kZU5hbWUsIHRydWUpCisgICAg
ICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgb3Bjb2RlTmFtZSA9IGNvbnN1bWVJZGVudGlm
aWVyCisKKyAgICAgICAgICAgICAgICBpZiByZXN1bHRbb3Bjb2RlTmFtZV0KKyAgICAgICAgICAg
ICAgICAgICAgb3Bjb2RlID0gcmVzdWx0W29wY29kZU5hbWVdCisgICAgICAgICAgICAgICAgICAg
IHBhcnNlRXJyb3IoIkNhbm5vdCBvdmVybG9hZCBhIHNwZWNpYWwgb3Bjb2RlIikgaWYgb3Bjb2Rl
LnNwZWNpYWwKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIG9wY29k
ZSA9IE9wY29kZS5uZXcob3Bjb2RlTmFtZSwgZmFsc2UpCisgICAgICAgICAgICAgICAgICAgIHJl
c3VsdFtvcGNvZGVOYW1lXSA9IG9wY29kZQorICAgICAgICAgICAgICAgIGVuZAorCisgICAgICAg
ICAgICAgICAgc2lnbmF0dXJlID0gW10KKyAgICAgICAgICAgICAgICBpZiBpc1VEKHRva2VuKQor
ICAgICAgICAgICAgICAgICAgICBsb29wIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJvbGUg
PSBjb25zdW1lUm9sZQorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3VtZSgiOiIpCisgICAg
ICAgICAgICAgICAgICAgICAgICB0eXBlID0gY29uc3VtZVR5cGUKKyAgICAgICAgICAgICAgICAg
ICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgc2lnbmF0dXJlIDw8IEFyZy5uZXcocm9s
ZSwgdHlwZSkKKyAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAg
ICAgYnJlYWsgdW5sZXNzIHRva2VuID09ICIsIgorICAgICAgICAgICAgICAgICAgICAgICAgY29u
c3VtZSgiLCIpCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbmQKKwor
ICAgICAgICAgICAgICAgIGZvcm1zID0gW10KKyAgICAgICAgICAgICAgICBsb29wIHsKKyAgICAg
ICAgICAgICAgICAgICAga2luZHMgPSBbXQorICAgICAgICAgICAgICAgICAgICBhbHROYW1lID0g
bmlsCisgICAgICAgICAgICAgICAgICAgIGxvb3AgeworICAgICAgICAgICAgICAgICAgICAgICAg
a2luZHMgPDwgS2luZC5uZXcoY29uc3VtZUtpbmQpCisKKyAgICAgICAgICAgICAgICAgICAgICAg
IGlmIHRva2VuID09ICIqIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnNlRXJyb3Io
IkNhbiBvbmx5IGFwcGx5ICogdG8gVG1wIikgdW5sZXNzIGtpbmRzWy0xXS5uYW1lID09ICJUbXAi
CisgICAgICAgICAgICAgICAgICAgICAgICAgICAga2luZHNbLTFdLnNwZWNpYWwgPSB0cnVlCisg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3VtZSgiKiIpCisgICAgICAgICAgICAgICAg
ICAgICAgICBlbmQKKworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsgdW5sZXNzIHRva2Vu
ID09ICIsIgorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3VtZSgiLCIpCisgICAgICAgICAg
ICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBpZiB0b2tlbiA9PSAiYXMiCisgICAg
ICAgICAgICAgICAgICAgICAgICBjb25zdW1lKCJhcyIpCisgICAgICAgICAgICAgICAgICAgICAg
ICBhbHROYW1lID0gY29uc3VtZUlkZW50aWZpZXIKKyAgICAgICAgICAgICAgICAgICAgZW5kCisK
KyAgICAgICAgICAgICAgICAgICAgcGFyc2VFcnJvcigiRm9ybSBoYXMgd3JvbmcgbnVtYmVyIG9m
IGFyZ3VtZW50cyBmb3Igb3ZlcmxvYWQiKSB1bmxlc3Mga2luZHMubGVuZ3RoID09IHNpZ25hdHVy
ZS5sZW5ndGgKKyAgICAgICAgICAgICAgICAgICAga2luZHMuZWFjaF93aXRoX2luZGV4IHsKKyAg
ICAgICAgICAgICAgICAgICAgICAgIHwga2luZCwgaW5kZXggfAorICAgICAgICAgICAgICAgICAg
ICAgICAgaWYga2luZC5uYW1lID09ICJJbW0iIG9yIGtpbmQubmFtZSA9PSAiSW1tUHRyIgorICAg
ICAgICAgICAgICAgICAgICAgICAgICAgIGlmIHNpZ25hdHVyZVtpbmRleF0ucm9sZSAhPSAiVSIK
KyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyc2VFcnJvcigiRm9ybSBoYXMgYW4g
aW1tZWRpYXRlIGZvciBhIG5vbi11c2UgYXJndW1lbnQiKQorICAgICAgICAgICAgICAgICAgICAg
ICAgICAgIGVuZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIHNpZ25hdHVyZVtpbmRl
eF0udHlwZSAhPSAiRyIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyc2VFcnJv
cigiRm9ybSBoYXMgYW4gaW1tZWRpYXRlIGZvciBhIG5vbi1nZW5lcmFsLXB1cnBvc2UgYXJndW1l
bnQiKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuZAorICAgICAgICAgICAgICAgICAg
ICAgICAgZW5kCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZm9y
bXMgPDwgRm9ybS5uZXcoa2luZHMsIGFsdE5hbWUpCisgICAgICAgICAgICAgICAgICAgIGJyZWFr
IHVubGVzcyBpc0tpbmQodG9rZW4pCisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAg
ICAgb3Bjb2RlLm92ZXJsb2FkcyA8PCBPdmVybG9hZC5uZXcoc2lnbmF0dXJlLCBmb3JtcykKKyAg
ICAgICAgICAgIGVuZAorICAgICAgICB9CisKKyAgICAgICAgcmVzdWx0CisgICAgZW5kCitlbmQK
KworJGZpbGVOYW1lID0gQVJHVlswXQorCitwYXJzZXIgPSBQYXJzZXIubmV3KElPOjpyZWFkKCRm
aWxlTmFtZSksICRmaWxlTmFtZSkKKyRvcGNvZGVzID0gcGFyc2VyLnBhcnNlCisKK2RlZiB3cml0
ZUgoZmlsZW5hbWUpCisgICAgRmlsZS5vcGVuKCJBaXIje2ZpbGVuYW1lfS5oIiwgInciKSB7Cisg
ICAgICAgIHwgb3V0cCB8CisgICAgICAgIAorICAgICAgICBvdXRwLnB1dHMgIi8vIEdlbmVyYXRl
ZCBieSBvcGNvZGVfZ2VuZXJhdG9yLnJiIGZyb20gI3skZmlsZU5hbWV9IC0tIGRvIG5vdCBlZGl0
ISIKKyAgICAgICAgCisgICAgICAgIG91dHAucHV0cyAiI2lmbmRlZiBBaXIje2ZpbGVuYW1lfV9o
IgorICAgICAgICBvdXRwLnB1dHMgIiNkZWZpbmUgQWlyI3tmaWxlbmFtZX1faCIKKworICAgICAg
ICB5aWVsZCBvdXRwCisgICAgICAgIAorICAgICAgICBvdXRwLnB1dHMgIiNlbmRpZiAvLyBBaXIj
e2ZpbGVuYW1lfV9oIgorICAgIH0KK2VuZAorCitkZWYgd3JpdGVDUFAoZmlsZW5hbWUpCisgICAg
RmlsZS5vcGVuKCJBaXIje2ZpbGVuYW1lfS5jcHAiLCAidyIpIHsKKyAgICAgICAgfCBvdXRwIHwK
KyAgICAgICAgCisgICAgICAgIG91dHAucHV0cyAiLy8gR2VuZXJhdGVkIGJ5IG9wY29kZV9nZW5l
cmF0b3IucmIgZnJvbSAjeyRmaWxlTmFtZX0gLS0gZG8gbm90IGVkaXQhIgorICAgICAgICAKKyAg
ICAgICAgb3V0cC5wdXRzICIjaW5jbHVkZSBcImNvbmZpZy5oXCIiCisgICAgICAgIG91dHAucHV0
cyAiI2luY2x1ZGUgXCJBaXIje2ZpbGVuYW1lfS5oXCIiCisKKyAgICAgICAgeWllbGQgb3V0cAor
ICAgIH0KK2VuZAorCit3cml0ZUgoIk9wY29kZXMiKSB7CisgICAgfCBvdXRwIHwKKyAgICBvdXRw
LnB1dHMgIm5hbWVzcGFjZSBKU0MgeyBuYW1lc3BhY2UgQjMgeyBuYW1lc3BhY2UgQWlyIHsiCisg
ICAgb3V0cC5wdXRzICJlbnVtIE9wY29kZSA6IGludDE2X3QgeyIKKyAgICAkb3Bjb2Rlcy5rZXlz
LnNvcnQuZWFjaCB7CisgICAgICAgIHwgb3Bjb2RlIHwKKyAgICAgICAgb3V0cC5wdXRzICIgICAg
I3tvcGNvZGV9LCIKKyAgICB9CisgICAgb3V0cC5wdXRzICJ9IgorCisgICAgb3V0cC5wdXRzICJz
dGF0aWMgY29uc3QgdW5zaWduZWQgbnVtT3Bjb2RlcyA9ICN7JG9wY29kZXMua2V5cy5zaXplfTsi
CisgICAgb3V0cC5wdXRzICJ9IH0gfSAvLyBuYW1lc3BhY2UgSlNDOjpCMzo6QWlyIgorICAgIAor
ICAgIG91dHAucHV0cyAibmFtZXNwYWNlIFdURiB7IgorICAgIG91dHAucHV0cyAiY2xhc3MgUHJp
bnRTdHJlYW07IgorICAgIG91dHAucHV0cyAidm9pZCBwcmludEludGVybmFsKFByaW50U3RyZWFt
JiwgSlNDOjpCMzo6QWlyOjpPcGNvZGUpOyIKKyAgICBvdXRwLnB1dHMgIn0gLy8gbmFtZXNwYWNl
IFdURiIKK30KKword3JpdGVDUFAoIk9wY29kZXMiKSB7CisgICAgfCBvdXRwIHwKKyAgICBvdXRw
LnB1dHMgIiNpbmNsdWRlIFwid3RmL1ByaW50U3RyZWFtLmhcIiIKKyAgICBvdXRwLnB1dHMgIm5h
bWVzcGFjZSBXVEYgeyIKKyAgICBvdXRwLnB1dHMgInVzaW5nIG5hbWVzcGFjZSBKU0M6OkIzOjpB
aXI7IgorICAgIG91dHAucHV0cyAidm9pZCBwcmludEludGVybmFsKFByaW50U3RyZWFtJiBvdXQs
IE9wY29kZSBvcGNvZGUpIgorICAgIG91dHAucHV0cyAieyIKKyAgICBvdXRwLnB1dHMgIiAgICBz
d2l0Y2ggKG9wY29kZSkgeyIKKyAgICAkb3Bjb2Rlcy5rZXlzLmVhY2ggeworICAgICAgICB8IG9w
Y29kZSB8CisgICAgICAgIG91dHAucHV0cyAiICAgIGNhc2UgI3tvcGNvZGV9OiIKKyAgICAgICAg
b3V0cC5wdXRzICIgICAgICAgIG91dC5wcmludChcIiN7b3Bjb2RlfVwiKTsiCisgICAgICAgIG91
dHAucHV0cyAiICAgICAgICByZXR1cm47IgorICAgIH0KKyAgICBvdXRwLnB1dHMgIiAgICB9Igor
ICAgIG91dHAucHV0cyAiICAgIFJFTEVBU0VfQVNTRVJUX05PVF9SRUFDSEVEKCk7IgorICAgIG91
dHAucHV0cyAifSIKKyAgICBvdXRwLnB1dHMgIn0gLy8gbmFtZXNwYWNlIFdURiIKK30KKworIyBG
cm9tIGhlcmUgb24sIHdlIGRvbid0IHRyeSB0byBlbWl0IHByb3Blcmx5IGluZGVudGVkIGNvZGUs
IHNpbmNlIHdlJ3JlIHVzaW5nIGEgcmVjdXJzaXZlIHBhdHRlcm4KKyMgbWF0Y2hlci4KKworZGVm
IG1hdGNoRm9ybXMob3V0cCwgc3BlZWQsIGZvcm1zLCBjb2x1bW5JbmRleCwgY29sdW1uR2V0dGVy
LCBmaWx0ZXIsIGNhbGxiYWNrKQorICAgIHJldHVybiBpZiBmb3Jtcy5sZW5ndGggPT0gMAorCisg
ICAgaWYgZmlsdGVyW2Zvcm1zXQorICAgICAgICByZXR1cm4KKyAgICBlbmQKKworICAgIG91dHAu
cHV0cyAiIC8vIGNvbHVtbkluZGV4ID0gI3tjb2x1bW5JbmRleH0sIGZvcm1zID0gI3tmb3Jtcy5p
bnNwZWN0fSwgbnVtQ29sdW1ucyA9ICN7Zm9ybXNbMF0ua2luZHMubGVuZ3RofSIKKyAgICBpZiBj
b2x1bW5JbmRleCA+PSBmb3Jtc1swXS5raW5kcy5sZW5ndGgKKyAgICAgICAgcmFpc2UgdW5sZXNz
IGZvcm1zLmxlbmd0aCA9PSAxCisgICAgICAgIGNhbGxiYWNrW2Zvcm1zWzBdXQorICAgICAgICBy
ZXR1cm4KKyAgICBlbmQKKyAgICAKKyAgICBncm91cHMgPSB7fQorICAgIGZvcm1zLmVhY2ggewor
ICAgICAgICB8IGZvcm0gfAorICAgICAgICBraW5kID0gZm9ybS5raW5kc1tjb2x1bW5JbmRleF0u
bmFtZQorICAgICAgICBpZiBncm91cHNba2luZF0KKyAgICAgICAgICAgIGdyb3Vwc1traW5kXSA8
PCBmb3JtCisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGdyb3Vwc1traW5kXSA9IFtmb3JtXQor
ICAgICAgICBlbmQKKyAgICB9CisKKyAgICBpZiBzcGVlZCA9PSA6ZmFzdCBhbmQgZ3JvdXBzLmxl
bmd0aCA9PSAxCisgICAgICAgIG1hdGNoRm9ybXMob3V0cCwgc3BlZWQsIGZvcm1zLCBjb2x1bW5J
bmRleCArIDEsIGNvbHVtbkdldHRlciwgZmlsdGVyLCBjYWxsYmFjaykKKyAgICAgICAgcmV0dXJu
CisgICAgZW5kCisKKyAgICBvdXRwLnB1dHMgInN3aXRjaCAoI3tjb2x1bW5HZXR0ZXJbY29sdW1u
SW5kZXhdfSkgeyIKKyAgICBncm91cHMuZWFjaF9wYWlyIHsKKyAgICAgICAgfCBrZXksIHZhbHVl
IHwKKyAgICAgICAgb3V0cC5wdXRzICJjYXNlIEFyZzo6I3trZXl9OiIKKyAgICAgICAgbWF0Y2hG
b3JtcyhvdXRwLCBzcGVlZCwgdmFsdWUsIGNvbHVtbkluZGV4ICsgMSwgY29sdW1uR2V0dGVyLCBm
aWx0ZXIsIGNhbGxiYWNrKQorICAgICAgICBvdXRwLnB1dHMgImJyZWFrOyIKKyAgICB9CisgICAg
b3V0cC5wdXRzICJkZWZhdWx0OiIKKyAgICBvdXRwLnB1dHMgImJyZWFrOyIKKyAgICBvdXRwLnB1
dHMgIn0iCitlbmQKKworZGVmIG1hdGNoSW5zdE92ZXJsb2FkKG91dHAsIHNwZWVkLCBpbnN0KQor
ICAgIG91dHAucHV0cyAic3dpdGNoICgje2luc3R9LT5vcGNvZGUpIHsiCisgICAgJG9wY29kZXMu
dmFsdWVzLmVhY2ggeworICAgICAgICB8IG9wY29kZSB8CisgICAgICAgIG91dHAucHV0cyAiY2Fz
ZSAje29wY29kZS5uYW1lfToiCisgICAgICAgIGlmIG9wY29kZS5zcGVjaWFsCisgICAgICAgICAg
ICB5aWVsZCBvcGNvZGUsIG5pbAorICAgICAgICBlbHNlCisgICAgICAgICAgICBuZWVkT3Zlcmxv
YWRTd2l0Y2ggPSAob3Bjb2RlLm92ZXJsb2Fkcy5zaXplICE9IDEpIG9yIHNwZWVkID09IDpzYWZl
CisgICAgICAgICAgICBvdXRwLnB1dHMgInN3aXRjaCAoI3tpbnN0fS0+YXJncy5zaXplKCkpIHsi
IGlmIG5lZWRPdmVybG9hZFN3aXRjaAorICAgICAgICAgICAgb3Bjb2RlLm92ZXJsb2Fkcy5lYWNo
IHsKKyAgICAgICAgICAgICAgICB8IG92ZXJsb2FkIHwKKyAgICAgICAgICAgICAgICBvdXRwLnB1
dHMgImNhc2UgI3tvdmVybG9hZC5zaWduYXR1cmUubGVuZ3RofToiIGlmIG5lZWRPdmVybG9hZFN3
aXRjaAorICAgICAgICAgICAgICAgIHlpZWxkIG9wY29kZSwgb3ZlcmxvYWQKKyAgICAgICAgICAg
ICAgICBvdXRwLnB1dHMgImJyZWFrOyIgaWYgbmVlZE92ZXJsb2FkU3dpdGNoCisgICAgICAgICAg
ICB9CisgICAgICAgICAgICBpZiBuZWVkT3ZlcmxvYWRTd2l0Y2gKKyAgICAgICAgICAgICAgICBv
dXRwLnB1dHMgImRlZmF1bHQ6IgorICAgICAgICAgICAgICAgIG91dHAucHV0cyAiYnJlYWs7Igor
ICAgICAgICAgICAgICAgIG91dHAucHV0cyAifSIKKyAgICAgICAgICAgIGVuZAorICAgICAgICBl
bmQKKyAgICAgICAgb3V0cC5wdXRzICJicmVhazsiCisgICAgfQorICAgIG91dHAucHV0cyAiZGVm
YXVsdDoiCisgICAgb3V0cC5wdXRzICJicmVhazsiCisgICAgb3V0cC5wdXRzICJ9IgorZW5kCisg
ICAgCitkZWYgbWF0Y2hJbnN0T3ZlcmxvYWRGb3JtKG91dHAsIHNwZWVkLCBpbnN0KQorICAgIG1h
dGNoSW5zdE92ZXJsb2FkKG91dHAsIHNwZWVkLCBpbnN0KSB7CisgICAgICAgIHwgb3Bjb2RlLCBv
dmVybG9hZCB8CisgICAgICAgIGlmIG9wY29kZS5zcGVjaWFsCisgICAgICAgICAgICB5aWVsZCBv
cGNvZGUsIG5pbCwgbmlsCisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGNvbHVtbkdldHRlciA9
IHByb2MgeworICAgICAgICAgICAgICAgIHwgY29sdW1uSW5kZXggfAorICAgICAgICAgICAgICAg
ICIje2luc3R9LT5hcmdzWyN7Y29sdW1uSW5kZXh9XS5raW5kKCkiCisgICAgICAgICAgICB9Cisg
ICAgICAgICAgICBmaWx0ZXIgPSBwcm9jIHsgZmFsc2UgfQorICAgICAgICAgICAgY2FsbGJhY2sg
PSBwcm9jIHsKKyAgICAgICAgICAgICAgICB8IGZvcm0gfAorICAgICAgICAgICAgICAgIHlpZWxk
IG9wY29kZSwgb3ZlcmxvYWQsIGZvcm0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1hdGNo
Rm9ybXMob3V0cCwgc3BlZWQsIG92ZXJsb2FkLmZvcm1zLCAwLCBjb2x1bW5HZXR0ZXIsIGZpbHRl
ciwgY2FsbGJhY2spCisgICAgICAgIGVuZAorICAgIH0KK2VuZAorCit3cml0ZUgoIk9wY29kZVV0
aWxzIikgeworICAgIHwgb3V0cCB8CisgICAgb3V0cC5wdXRzICIjaW5jbHVkZSBcIkFpckluc3Qu
aFwiIgorICAgIG91dHAucHV0cyAiI2luY2x1ZGUgXCJBaXJTcGVjaWFscy5oXCIiCisgICAgb3V0
cC5wdXRzICJuYW1lc3BhY2UgSlNDIHsgbmFtZXNwYWNlIEIzIHsgbmFtZXNwYWNlIEFpciB7Igor
ICAgIG91dHAucHV0cyAidGVtcGxhdGU8dHlwZW5hbWUgRnVuY3Rvcj4iCisgICAgb3V0cC5wdXRz
ICJ2b2lkIEluc3Q6OmZvckVhY2hBcmdSb2xlKGNvbnN0IEZ1bmN0b3ImIGZ1bmN0b3IpIgorICAg
IG91dHAucHV0cyAieyIKKyAgICBtYXRjaEluc3RPdmVybG9hZChvdXRwLCA6ZmFzdCwgInRoaXMi
KSB7CisgICAgICAgIHwgb3Bjb2RlLCBvdmVybG9hZCB8CisgICAgICAgIGlmIG9wY29kZS5zcGVj
aWFsCisgICAgICAgICAgICBvdXRwLnB1dHMgIiN7b3Bjb2RlLm5hbWV9U3BlY2lhbHM6OmZvckVh
Y2hBcmdSb2xlKHRoaXMsIGZ1bmN0b3IpOyIKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgb3Zl
cmxvYWQuc2lnbmF0dXJlLmVhY2hfd2l0aF9pbmRleCB7CisgICAgICAgICAgICAgICAgfCBhcmcs
IGluZGV4IHwKKyAgICAgICAgICAgICAgICByb2xlID0gbmlsCisgICAgICAgICAgICAgICAgY2Fz
ZSBhcmcucm9sZQorICAgICAgICAgICAgICAgIHdoZW4gIlUiCisgICAgICAgICAgICAgICAgICAg
IHJvbGUgPSAiVXNlIgorICAgICAgICAgICAgICAgIHdoZW4gIkQiCisgICAgICAgICAgICAgICAg
ICAgIHJvbGUgPSAiRGVmIgorICAgICAgICAgICAgICAgIHdoZW4gIlVEIgorICAgICAgICAgICAg
ICAgICAgICByb2xlID0gIlVzZURlZiIKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAg
ICAgICAgICAgIHJhaXNlCisgICAgICAgICAgICAgICAgZW5kCisgICAgICAgICAgICAgICAgCisg
ICAgICAgICAgICAgICAgb3V0cC5wdXRzICJmdW5jdG9yKGFyZ3NbI3tpbmRleH1dLCBBcmc6OiN7
cm9sZX0sIEFyZzo6I3thcmcudHlwZX1QKTsiCisgICAgICAgICAgICB9CisgICAgICAgIGVuZAor
ICAgIH0KKyAgICBvdXRwLnB1dHMgIn0iCisgICAgb3V0cC5wdXRzICJ9IH0gfSAvLyBuYW1lc3Bh
Y2UgSlNDOjpCMzo6QWlyIgorfQorCit3cml0ZUNQUCgiT3Bjb2RlVXRpbHMiKSB7CisgICAgfCBv
dXRwIHwKKyAgICBvdXRwLnB1dHMgIiNpbmNsdWRlIFwiQWlySW5zdC5oXCIiCisgICAgb3V0cC5w
dXRzICIjaW5jbHVkZSBcIkFpclNwZWNpYWxzLmhcIiIKKyAgICBvdXRwLnB1dHMgIm5hbWVzcGFj
ZSBKU0MgeyBuYW1lc3BhY2UgQjMgeyBuYW1lc3BhY2UgQWlyIHsiCisgICAgb3V0cC5wdXRzICJp
bmxpbmUgYm9vbCBoaWRkZW5UcnV0aCgpIHsgcmV0dXJuIHRydWU7IH0iCisgICAgb3V0cC5wdXRz
ICIjZGVmaW5lIFJFVFVSTih2YWx1ZSkgZG8ge1xcIgorICAgIG91dHAucHV0cyAiICAgIGlmICho
aWRkZW5UcnV0aCgpKVxcIgorICAgIG91dHAucHV0cyAiICAgICAgICByZXR1cm4gKHZhbHVlKTtc
XCIKKyAgICBvdXRwLnB1dHMgIn0iCisgICAgb3V0cC5wdXRzICJib29sIEluc3Q6OmlzVmFsaWRG
b3JtKCkiCisgICAgb3V0cC5wdXRzICJ7IgorICAgIG1hdGNoSW5zdE92ZXJsb2FkRm9ybShvdXRw
LCA6c2FmZSwgInRoaXMiKSB7CisgICAgICAgIHwgb3Bjb2RlLCBvdmVybG9hZCwgZm9ybSB8Cisg
ICAgICAgIGlmIG9wY29kZS5zcGVjaWFsCisgICAgICAgICAgICBvdXRwLnB1dHMgIlJFVFVSTigj
e29wY29kZS5uYW1lfVNwZWNpYWxzOjppc1ZhbGlkKHRoaXMpKTsiCisgICAgICAgIGVsc2UKKyAg
ICAgICAgICAgIG5lZWRzTW9yZVZhbGlkYXRpb24gPSBmYWxzZQorICAgICAgICAgICAgb3Zlcmxv
YWQuc2lnbmF0dXJlLmxlbmd0aC50aW1lcyB7CisgICAgICAgICAgICAgICAgfCBpbmRleCB8Cisg
ICAgICAgICAgICAgICAgcm9sZSA9IG92ZXJsb2FkLnNpZ25hdHVyZVtpbmRleF0ucm9sZQorICAg
ICAgICAgICAgICAgIHR5cGUgPSBvdmVybG9hZC5zaWduYXR1cmVbaW5kZXhdLnR5cGUKKyAgICAg
ICAgICAgICAgICBraW5kID0gZm9ybS5raW5kc1tpbmRleF0KKyAgICAgICAgICAgICAgICBuZWVk
c01vcmVWYWxpZGF0aW9uIHw9IGtpbmQuc3BlY2lhbAorICAgICAgICAgICAgICAgIAorICAgICAg
ICAgICAgICAgICMgV2UgYWxyZWFkeSBrbm93IHRoYXQgdGhlIGZvcm0gbWF0Y2hlcy4gV2UgZG9u
J3QgaGF2ZSB0byB2YWxpZGF0ZSB0aGUgcm9sZSwgc2luY2UKKyAgICAgICAgICAgICAgICAjIGtp
bmQgaW1wbGllcyByb2xlLiBTbywgdGhlIG9ubHkgdGhpbmcgbGVmdCB0byB2YWxpZGF0ZSBpcyB0
aGUgdHlwZS4gQW5kIHdlIG9ubHkgaGF2ZQorICAgICAgICAgICAgICAgICMgdG8gdmFsaWRhdGUg
dGhlIHR5cGUgaWYgd2UgaGF2ZSBhIFRtcC4KKyAgICAgICAgICAgICAgICBpZiBraW5kLm5hbWUg
PT0gIlRtcCIKKyAgICAgICAgICAgICAgICAgICAgb3V0cC5wdXRzICJpZiAoIWFyZ3NbI3tpbmRl
eH1dLnRtcCgpLmlzI3t0eXBlfVAoKSkiCisgICAgICAgICAgICAgICAgICAgIG91dHAucHV0cyAi
UkVUVVJOKGZhbHNlKTsiCisgICAgICAgICAgICAgICAgZW5kCisgICAgICAgICAgICB9CisgICAg
ICAgICAgICBpZiBuZWVkc01vcmVWYWxpZGF0aW9uCisgICAgICAgICAgICAgICAgb3V0cC5wdXRz
ICJpZiAoISN7b3Bjb2RlLm5hbWV9U3BlY2lhbHM6OmlzVmFsaWQodGhpcykpIgorICAgICAgICAg
ICAgICAgIG91dHAucHV0cyAiUkVUVVJOKGZhbHNlKTsiCisgICAgICAgICAgICBlbmQKKyAgICAg
ICAgICAgIG91dHAucHV0cyAiUkVUVVJOKHRydWUpOyIKKyAgICAgICAgZW5kCisgICAgfQorICAg
IG91dHAucHV0cyAicmV0dXJuIGZhbHNlOyIKKyAgICBvdXRwLnB1dHMgIn0iCisKKyAgICBvdXRw
LnB1dHMgImJvb2wgSW5zdDo6YWRtaXRzQWRkcih1bnNpZ25lZCBhcmdJbmRleCkiCisgICAgb3V0
cC5wdXRzICJ7IgorICAgIG91dHAucHV0cyAic3dpdGNoIChvcGNvZGUpIHsiCisgICAgJG9wY29k
ZXMudmFsdWVzLmVhY2ggeworICAgICAgICB8IG9wY29kZSB8CisgICAgICAgIG91dHAucHV0cyAi
Y2FzZSAje29wY29kZS5uYW1lfToiCisKKyAgICAgICAgaWYgb3Bjb2RlLnNwZWNpYWwKKyAgICAg
ICAgICAgIG91dHAucHV0cyAiUkVUVVJOKCN7b3Bjb2RlLm5hbWV9U3BlY2lhbHM6OmFkbWl0c0Fk
ZHIoYXJnSW5kZXgpKTsiCisgICAgICAgIGVsc2UKKyAgICAgICAgICAgICMgU3dpdGNoIG9uIHRo
ZSBhcmdJbmRleC4KKyAgICAgICAgICAgIG91dHAucHV0cyAic3dpdGNoIChhcmdJbmRleCkgeyIK
KworICAgICAgICAgICAgbnVtQXJncyA9IG9wY29kZS5vdmVybG9hZHMubWFwIHsKKyAgICAgICAg
ICAgICAgICB8IG92ZXJsb2FkIHwKKyAgICAgICAgICAgICAgICBvdmVybG9hZC5zaWduYXR1cmUu
bGVuZ3RoCisgICAgICAgICAgICB9Lm1heAorICAgICAgICAgICAgCisgICAgICAgICAgICBudW1B
cmdzLnRpbWVzIHsKKyAgICAgICAgICAgICAgICB8IGFyZ0luZGV4IHwKKyAgICAgICAgICAgICAg
ICBvdXRwLnB1dHMgImNhc2UgI3thcmdJbmRleH06IgorCisgICAgICAgICAgICAgICAgIyBDaGVj
ayBpZiBhbGwgb2YgdGhlIGZvcm1zIG9mIGFsbCBvZiB0aGUgb3ZlcmxvYWRzIGVpdGhlciBkbywg
b3IgZG9uJ3QsIGFkbWl0IGFuIGFkZHJlc3MKKyAgICAgICAgICAgICAgICAjIGF0IHRoaXMgaW5k
ZXguIFdlIGV4cGVjdCB0aGlzIHRvIGJlIGEgdmVyeSBjb21tb24gY2FzZS4KKyAgICAgICAgICAg
ICAgICBudW1ZZXMgPSAwCisgICAgICAgICAgICAgICAgbnVtTm8gPSAwCisgICAgICAgICAgICAg
ICAgb3Bjb2RlLm92ZXJsb2Fkcy5lYWNoIHsKKyAgICAgICAgICAgICAgICAgICAgfCBvdmVybG9h
ZCB8CisgICAgICAgICAgICAgICAgICAgIG92ZXJsb2FkLmZvcm1zLmVhY2ggeworICAgICAgICAg
ICAgICAgICAgICAgICAgfCBmb3JtIHwKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIGZvcm0u
a2luZHNbYXJnSW5kZXhdID09ICJBZGRyIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51
bVllcyArPSAxCisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgbnVtTm8gKz0gMQorICAgICAgICAgICAgICAgICAgICAgICAgZW5kCisgICAg
ICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAj
IE5vdGUgdGhhdCB3ZSBkZWxpYmVyYXRlbHkgdGVzdCBudW1ZZXMgZmlyc3QgYmVjYXVzZSBpZiB3
ZSBlbmQgdXAgd2l0aCBubyBmb3Jtcywgd2Ugd2FudAorICAgICAgICAgICAgICAgICMgdG8gc2F5
IHRoYXQgQWRkcmVzcyBpcyBpbmFkbWlzc2libGUuCisgICAgICAgICAgICAgICAgaWYgbnVtWWVz
ID09IDAKKyAgICAgICAgICAgICAgICAgICAgb3V0cC5wdXRzICJSRVRVUk4oZmFsc2UpOyIKKyAg
ICAgICAgICAgICAgICBlbHNpZiBudW1ObyA9PSAwCisgICAgICAgICAgICAgICAgICAgIG91dHAu
cHV0cyAiUkVUVVJOKHRydWUpOyIKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAg
ICAgICAgICMgTm93IGRvIHRoZSBmdWxsIHRlc3QuCisKKyAgICAgICAgICAgICAgICAgICAgbmVl
ZE92ZXJsb2FkU3dpdGNoID0gKG9wY29kZS5vdmVybG9hZHMuc2l6ZSAhPSAxKQorCisgICAgICAg
ICAgICAgICAgICAgIG91dHAucHV0cyAic3dpdGNoIChhcmdzLnNpemUoKSkgeyIgaWYgbmVlZE92
ZXJsb2FkU3dpdGNoCisgICAgICAgICAgICAgICAgICAgIG9wY29kZS5vdmVybG9hZHMuZWFjaCB7
CisgICAgICAgICAgICAgICAgICAgICAgICB8IG92ZXJsb2FkIHwKKworICAgICAgICAgICAgICAg
ICAgICAgICAgIyBBZ2FpbiwgY2hlY2sgaWYgYWxsIG9mIHRoZW0gZG8gd2hhdCB3ZSB3YW50Lgor
ICAgICAgICAgICAgICAgICAgICAgICAgbnVtWWVzID0gMAorICAgICAgICAgICAgICAgICAgICAg
ICAgbnVtTm8gPSAwCisgICAgICAgICAgICAgICAgICAgICAgICBvdmVybG9hZC5mb3Jtcy5lYWNo
IHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGZvcm0gfAorICAgICAgICAgICAgICAg
ICAgICAgICAgICAgIGlmIGZvcm0ua2luZHNbYXJnSW5kZXhdID09ICJBZGRyIgorICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICBudW1ZZXMgKz0gMQorICAgICAgICAgICAgICAgICAgICAg
ICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtTm8gKz0gMQor
ICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuZAorICAgICAgICAgICAgICAgICAgICAgICAg
fQorCisgICAgICAgICAgICAgICAgICAgICAgICBpZiBudW1ZZXMgPT0gMAorICAgICAgICAgICAg
ICAgICAgICAgICAgIyBEb24ndCBlbWl0IGFueXRoaW5nLCBqdXN0IGRyb3AgdG8gZGVmYXVsdC4K
KyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2lmIG51bU5vID09IDAKKyAgICAgICAgICAgICAg
ICAgICAgICAgICAgICBvdXRwLnB1dHMgImNhc2UgI3tvdmVybG9hZC5zaWduYXR1cmUubGVuZ3Ro
fToiIGlmIG5lZWRPdmVybG9hZFN3aXRjaAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91
dHAucHV0cyAiUkVUVVJOKHRydWUpOyIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRw
LnB1dHMgImJyZWFrOyIgaWYgbmVlZE92ZXJsb2FkU3dpdGNoCisgICAgICAgICAgICAgICAgICAg
ICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cC5wdXRzICJjYXNlICN7
b3ZlcmxvYWQuc2lnbmF0dXJlLmxlbmd0aH06IiBpZiBuZWVkT3ZlcmxvYWRTd2l0Y2gKKworICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICMgVGhpcyBpcyBob3cgd2UgdGVzdCB0aGUgaHlwb3Ro
ZXNpcyB0aGF0IGNoYW5naW5nIHRoaXMgYXJndW1lbnQgdG8gYW4KKyAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAjIGFkZHJlc3MgeWllbGRzIGEgdmFsaWQgZm9ybS4KKyAgICAgICAgICAgICAg
ICAgICAgICAgICAgICBjb2x1bW5HZXR0ZXIgPSBwcm9jIHsKKyAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgfCBjb2x1bW5JbmRleCB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgIGlmIGNvbHVtbkluZGV4ID09IGFyZ0luZGV4CisgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAiQXJnOjpBZGRyIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBl
bHNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYXJnc1sje2NvbHVtbklu
ZGV4fV0ua2luZCgpIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmQKKyAgICAg
ICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmls
dGVyID0gcHJvYyB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgZm9ybXMgfAor
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwLnB1dHMgIiAvLyBDb25zaWRlcmlu
ZyBmb3JtczogI3tmb3Jtcy5pbnNwZWN0fSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgbnVtWWVzID0gMAorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1zLmVh
Y2ggeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBmb3JtIHwKKyAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIGZvcm0ua2luZHNbYXJnSW5kZXhdID09
ICJBZGRyIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bVllcyAr
PSAxCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmQKKyAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
IGlmIG51bVllcyA9PSAwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIERy
b3AgZG93biwgZW1pdCBubyBjb2RlLCBzaW5jZSB3ZSBjYW5ub3QgbWF0Y2guCisgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICB0cnVlCisgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgS2VlcCBn
b2luZy4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlCisgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgIGVuZAorICAgICAgICAgICAgICAgICAgICAgICAgICAg
IH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayA9IHByb2MgeworICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwLnB1dHMgIlJFVFVSTih0cnVlKTsiCisgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91
dHAucHV0cyAiIC8vIE1hdGNoaW5nIGZvcm1zIG9mIG92ZXJsb2FkOiAje292ZXJsb2FkLmluc3Bl
Y3R9IgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hdGNoRm9ybXMob3V0cCwgOnNhZmUs
IG92ZXJsb2FkLmZvcm1zLCAwLCBjb2x1bW5HZXR0ZXIsIGZpbHRlciwgY2FsbGJhY2spCisKKyAg
ICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwLnB1dHMgImJyZWFrOyIgaWYgbmVlZE92ZXJs
b2FkU3dpdGNoCisgICAgICAgICAgICAgICAgICAgICAgICBlbmQKKyAgICAgICAgICAgICAgICAg
ICAgfQorICAgICAgICAgICAgICAgICAgICBpZiBuZWVkT3ZlcmxvYWRTd2l0Y2gKKyAgICAgICAg
ICAgICAgICAgICAgICAgIG91dHAucHV0cyAiZGVmYXVsdDoiCisgICAgICAgICAgICAgICAgICAg
ICAgICBvdXRwLnB1dHMgImJyZWFrOyIKKyAgICAgICAgICAgICAgICAgICAgICAgIG91dHAucHV0
cyAifSIKKyAgICAgICAgICAgICAgICAgICAgZW5kCisgICAgICAgICAgICAgICAgZW5kCisgICAg
ICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgb3V0cC5wdXRzICJicmVhazsiCisgICAgICAg
ICAgICB9CisgICAgICAgICAgICAKKyAgICAgICAgICAgIG91dHAucHV0cyAiZGVmYXVsdDoiCisg
ICAgICAgICAgICBvdXRwLnB1dHMgImJyZWFrOyIKKyAgICAgICAgICAgIG91dHAucHV0cyAifSIK
KyAgICAgICAgZW5kCisgICAgICAgIAorICAgICAgICBvdXRwLnB1dHMgImJyZWFrOyIKKyAgICB9
CisgICAgb3V0cC5wdXRzICJkZWZhdWx0OiI7CisgICAgb3V0cC5wdXRzICJicmVhazsiCisgICAg
b3V0cC5wdXRzICJ9IgorICAgIG91dHAucHV0cyAicmV0dXJuIGZhbHNlOyIKKyAgICBvdXRwLnB1
dHMgIn0iCisKKyAgICBvdXRwLnB1dHMgInZvaWQgSW5zdDo6Z2VuZXJhdGUoTWFjcm9Bc3NlbWJs
ZXImIGppdCkgY29uc3QiCisgICAgb3V0cC5wdXRzICJ7IgorICAgIG1hdGNoSW5zdE92ZXJsb2Fk
Rm9ybShvdXRwLCA6ZmFzdCwgInRoaXMiKSB7CisgICAgICAgIHwgb3Bjb2RlLCBvdmVybG9hZCwg
Zm9ybSB8CisgICAgICAgIGlmIG9wY29kZS5zcGVjaWFsCisgICAgICAgICAgICBvdXRwLnB1dHMg
IiN7b3Bjb2RlLm5hbWV9U3BlY2lhbHM6OmdlbmVyYXRlKHRoaXMsIGppdCk7IgorICAgICAgICBl
bHNlCisgICAgICAgICAgICBpZiBmb3JtLmFsdE5hbWUKKyAgICAgICAgICAgICAgICBtZXRob2RO
YW1lID0gZm9ybS5hbHROYW1lCisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgbWV0
aG9kTmFtZSA9IG9wY29kZS5tYXNtTmFtZQorICAgICAgICAgICAgZW5kCisgICAgICAgICAgICBv
dXRwLnByaW50ICJqaXQuI3ttZXRob2ROYW1lfSgiCisKKyAgICAgICAgICAgIGZvcm0ua2luZHMu
ZWFjaF93aXRoX2luZGV4IHsKKyAgICAgICAgICAgICAgICB8IGtpbmQsIGluZGV4IHwKKyAgICAg
ICAgICAgICAgICBpZiBpbmRleCAhPSAwCisgICAgICAgICAgICAgICAgICAgIG91dHAucHJpbnQg
IiwgIgorICAgICAgICAgICAgICAgIGVuZAorICAgICAgICAgICAgICAgIGNhc2Uga2luZC5uYW1l
CisgICAgICAgICAgICAgICAgd2hlbiAiVG1wIgorICAgICAgICAgICAgICAgICAgICBpZiBvdmVy
bG9hZC5zaWduYXR1cmVbaW5kZXhdLnR5cGUgPT0gIkciCisgICAgICAgICAgICAgICAgICAgICAg
ICBvdXRwLnByaW50ICJhcmdzWyN7aW5kZXh9XS5ncHIoKSIKKyAgICAgICAgICAgICAgICAgICAg
ZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgb3V0cC5wcmludCAiYXJnc1sje2luZGV4fV0u
ZnByKCkiCisgICAgICAgICAgICAgICAgICAgIGVuZAorICAgICAgICAgICAgICAgIHdoZW4gIklt
bSIKKyAgICAgICAgICAgICAgICAgICAgb3V0cC5wcmludCAiYXJnc1sje2luZGV4fV0uYXNUcnVz
dGVkSW1tMzIoKSIKKyAgICAgICAgICAgICAgICB3aGVuICJJbW1QdHIiCisgICAgICAgICAgICAg
ICAgICAgIG91dHAucHJpbnQgImFyZ3NbI3tpbmRleH1dLmFzVHJ1c3RlZEltbVB0cigpIgorICAg
ICAgICAgICAgICAgIHdoZW4gIkFkZHIiCisgICAgICAgICAgICAgICAgICAgIG91dHAucHJpbnQg
ImFyZ3NbI3tpbmRleH1dLmFzQWRkcmVzcygpIgorICAgICAgICAgICAgICAgIHdoZW4gIkluZGV4
IgorICAgICAgICAgICAgICAgICAgICBvdXRwLnByaW50ICJhcmdzWyN7aW5kZXh9XS5hc0Jhc2VJ
bmRleCgpIgorICAgICAgICAgICAgICAgIGVuZAorICAgICAgICAgICAgfQorCisgICAgICAgICAg
ICBvdXRwLnB1dHMgIik7IgorICAgICAgICBlbmQKKyAgICB9CisgICAgb3V0cC5wdXRzICJ9Igor
ICAgIAorICAgIG91dHAucHV0cyAifSB9IH0gLy8gbmFtZXNwYWNlIEpTQzo6QjM6OkFpciIKK30K
KwpJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL2ppdC9SZWcuaAo9PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBT
b3VyY2UvSmF2YVNjcmlwdENvcmUvaml0L1JlZy5oCShyZXZpc2lvbiAxOTEyMzkpCisrKyBTb3Vy
Y2UvSmF2YVNjcmlwdENvcmUvaml0L1JlZy5oCSh3b3JraW5nIGNvcHkpCkBAIC0xMDUsNyArMTA1
LDYgQEAgcHVibGljOgogICAgIHVuc2lnbmVkIGluZGV4KCkgY29uc3QgeyByZXR1cm4gbV9pbmRl
eDsgfQogICAgIAogICAgIGJvb2wgaXNTZXQoKSBjb25zdCB7IHJldHVybiBtX2luZGV4ICE9IGlu
dmFsaWQoKTsgfQotICAgIGJvb2wgb3BlcmF0b3IhKCkgY29uc3QgeyByZXR1cm4gIWlzU2V0KCk7
IH0KICAgICBleHBsaWNpdCBvcGVyYXRvciBib29sKCkgY29uc3QgeyByZXR1cm4gaXNTZXQoKTsg
fQogCiAgICAgYm9vbCBpc0hhc2hUYWJsZURlbGV0ZWRWYWx1ZSgpIGNvbnN0IHsgcmV0dXJuIG1f
aW5kZXggPT0gZGVsZXRlZCgpOyB9CkBAIC0xNzAsNiArMTY5LDQ2IEBAIHB1YmxpYzoKICAgICAK
ICAgICB2b2lkIGR1bXAoUHJpbnRTdHJlYW0mKSBjb25zdDsKIAorICAgIGNsYXNzIEFsbFJlZ3NJ
dGVyYWJsZSB7CisgICAgcHVibGljOgorCisgICAgICAgIGNsYXNzIGl0ZXJhdG9yIHsKKyAgICAg
ICAgcHVibGljOgorICAgICAgICAgICAgaXRlcmF0b3IoKSB7IH0KKworICAgICAgICAgICAgZXhw
bGljaXQgaXRlcmF0b3IoUmVnIHJlZykKKyAgICAgICAgICAgICAgICA6IG1fcmVnKHJlZykKKyAg
ICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgUmVnIG9wZXJhdG9yKigp
IGNvbnN0IHsgcmV0dXJuIG1fcmVnOyB9CisKKyAgICAgICAgICAgIGl0ZXJhdG9yJiBvcGVyYXRv
cisrKCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtX3JlZyA9IG1fcmVnLm5leHQo
KTsKKyAgICAgICAgICAgICAgICByZXR1cm4gKnRoaXM7CisgICAgICAgICAgICB9CisKKyAgICAg
ICAgICAgIGJvb2wgb3BlcmF0b3I9PShjb25zdCBpdGVyYXRvciYgb3RoZXIpIGNvbnN0CisgICAg
ICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG1fcmVnID09IG90aGVyLm1fcmVnOwor
ICAgICAgICAgICAgfQorCisgICAgICAgICAgICBib29sIG9wZXJhdG9yIT0oY29uc3QgaXRlcmF0
b3ImIG90aGVyKSBjb25zdAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiAh
KCp0aGlzID09IG90aGVyKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICBwcml2YXRlOgorICAg
ICAgICAgICAgUmVnIG1fcmVnOworICAgICAgICB9OworCisgICAgICAgIGl0ZXJhdG9yIGJlZ2lu
KCkgY29uc3QgeyByZXR1cm4gaXRlcmF0b3IoUmVnOjpmaXJzdCgpKTsgfQorICAgICAgICBpdGVy
YXRvciBlbmQoKSBjb25zdCB7IHJldHVybiBpdGVyYXRvcihSZWcoKSk7IH0KKyAgICB9OworCisg
ICAgc3RhdGljIEFsbFJlZ3NJdGVyYWJsZSBhbGwoKSBjb25zdCB7IHJldHVybiBBbGxSZWdzSXRl
cmFibGUoKTsgfQorCiBwcml2YXRlOgogICAgIHN0YXRpYyB1aW50OF90IGludmFsaWQoKSB7IHJl
dHVybiAweGZmOyB9CiAKSW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9qaXQvUmVnaXN0ZXJT
ZXQuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvaml0L1JlZ2lzdGVyU2V0
LmgJKHJldmlzaW9uIDE5MTIzOSkKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9qaXQvUmVnaXN0
ZXJTZXQuaAkod29ya2luZyBjb3B5KQpAQCAtMTE3LDYgKzExNywxMyBAQCBwdWJsaWM6CiAgICAg
CiAgICAgYm9vbCBvcGVyYXRvcj09KGNvbnN0IFJlZ2lzdGVyU2V0JiBvdGhlcikgY29uc3QgeyBy
ZXR1cm4gbV92ZWN0b3IgPT0gb3RoZXIubV92ZWN0b3I7IH0KICAgICB1bnNpZ25lZCBoYXNoKCkg
Y29uc3QgeyByZXR1cm4gbV92ZWN0b3IuaGFzaCgpOyB9CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFt
ZSBGdW5jdG9yPgorICAgIHZvaWQgZm9yRWFjaChjb25zdCBGdW5jdG9yJiBmdW5jdG9yKQorICAg
IHsKKyAgICAgICAgZm9yIChzaXplX3QgaW5kZXggOiBtX3ZlY3Rvci5zZXRCaXRzKCkpCisgICAg
ICAgICAgICBmdW5jdG9yKFJlZzo6ZnJvbUluZGV4KGluZGV4KSk7CisgICAgfQogICAgIAogcHJp
dmF0ZToKICAgICB2b2lkIHNldEFueShSZWcgcmVnKSB7IHNldChyZWcpOyB9Cg==
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>263529</attachid>
            <date>2015-10-19 17:02:34 -0700</date>
            <delta_ts>2015-10-19 20:00:58 -0700</delta_ts>
            <desc>removed some stuff</desc>
            <filename>blah.patch</filename>
            <type>text/plain</type>
            <size>207767</size>
            <attacher name="Filip Pizlo">fpizlo</attacher>
            
              <data encoding="base64">SW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM0FkZHJlc3NNYXRjaGVyLnBhdHRlcm5z
Cj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM0FkZHJlc3NNYXRjaGVy
LnBhdHRlcm5zCShyZXZpc2lvbiAwKQorKysgU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzQWRk
cmVzc01hdGNoZXIucGF0dGVybnMJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSw0MSBAQAorIyBD
b3B5cmlnaHQgKEMpIDIwMTUgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorIworIyBS
ZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9y
IHdpdGhvdXQKKyMgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhl
IGZvbGxvd2luZyBjb25kaXRpb25zCisjIGFyZSBtZXQ6CisjIDEuIFJlZGlzdHJpYnV0aW9ucyBv
ZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisjICAgIG5vdGlj
ZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4K
KyMgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBh
Ym92ZSBjb3B5cmlnaHQKKyMgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQg
dGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorIyAgICBkb2N1bWVudGF0aW9uIGFuZC9v
ciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorIworIyBU
SElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gQU5EIElUUyBDT05UUklCVVRP
UlMgYGBBUyBJUycnCisjIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElO
Q0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorIyBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9G
IE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisjIFBVUlBPU0Ug
QVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IgSVRTIENPTlRS
SUJVVE9SUworIyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFM
LCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCisjIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVE
SU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCisjIFNVQlNUSVRVVEUgR09P
RFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVT
UworIyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJ
QUJJTElUWSwgV0hFVEhFUiBJTgorIyBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9S
VCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorIyBBUklTSU5HIElOIEFOWSBX
QVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GCisj
IFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworbWF0Y2hlciBBZGRyZXNzTWF0Y2hl
cgorCisjIE5vdGUgdGhhdCB0aGlzIHJlbGllcyBvbiBCMyBkb2luZyBhZ2dyZXNzaXZlIHJlYXNz
b2NpYXRpb24gYW5kIGNhbm9uY2FsaXphdGlvbiBvZiBpbnRlZ2VyIGFkZHMuCisjIFdlJ2xsIG5l
dmVyIHNlZSBBZGQoQWRkKHgsIGNvbnN0MSksIGNvbnN0MikgYmVjYXVzZSBpdCB3b3VsZCBoYXZl
IGFscmVhZHkgYmVlbiByZWFzc29jaWF0ZWQgaW50bworIyBBZGQoeCwgY29uc3QxICsgY29uc3Qy
KS4gQWxzbywgd2Ugd2lsbCBuZXZlciBzZWUgQWRkKGNvbnN0LCB4KSwgYmVjYXVzZSB3ZSB3b3Vs
ZCBoYXZlIGNhbm9uaWNhbGl6ZWQKKyMgaXQgdG8gQWRkKHgsIGNvbnN0KS4gVGhhdCBzYWlkLCBp
biB0aGlzIGNvZGUgd2UgbmV2ZXIgbWFrZSBhc3NlcnRpb25zIGFib3V0IHRoZXNlIG9wdGltaXph
dGlvbnMKKyMgaGF2aW5nIGJlZW4gcGVyZm9ybWVkLiBBbHNvLCBzaW5jZSB0aGUgTG9hZC9TdG9y
ZSBpbnN0cnVjdGlvbnMgaW4gQjMgaGF2ZSBhIGJ1aWx0LWluIG9mZnNldCwgd2UKKyMgZG9uJ3Qg
bmVlZCB0byBtYXRjaCBBZGQoeCwgY29uc3QpLiBUaGF0IHdvdWxkIGhhdmUgYmVlbiBmb2xkZWQg
aW50byB0aGUgTG9hZC9TdG9yZSBpbnN0cnVjdGlvbnMKKyMgYWxyZWFkeS4gU28sIHRoZSBvbmx5
IGZhbmN5IG1hdGhpbmcgdGhpcyBjYW4gZG8gaXMganVzdCBCYXNlSW5kZXggZm9ybXMuCisKK0Fk
ZFNoaWZ0MSA9IEFkZChTaGwoaW5kZXgsICRsb2dTY2FsZSksIGJhc2UpCitBZGRTaGlmdDIgPSBB
ZGQoYmFzZSwgU2hsKGluZGV4LCAkbG9nU2NhbGUpKQorCitBZGQgPSBBZGQobGVmdCwgcmlnaHQp
CisKKyRDb25zdAorCitEaXJlY3QKSW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM0Fy
Z3VtZW50UmVnVmFsdWUuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9i
My9CM0FyZ3VtZW50UmVnVmFsdWUuY3BwCShyZXZpc2lvbiAwKQorKysgU291cmNlL0phdmFTY3Jp
cHRDb3JlL2IzL0IzQXJndW1lbnRSZWdWYWx1ZS5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTAsMCAr
MSw0MSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNSBBcHBsZSBJbmMuIEFsbCByaWdodHMg
cmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJp
bmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0
ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6Cisg
KiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3Zl
IGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhl
IGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBm
b3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhp
cyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUK
KyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRo
IHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBB
UFBMRSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFO
VElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJS
QU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisg
KiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBP
UgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElO
Q0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdF
UyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJT
VElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJ
VFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBU
SEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJ
TElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJ
U0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVO
IElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLiAKKyAqLworCisj
aW5jbHVkZSAiY29uZmlnLmgiCisjaW5jbHVkZSAiQjNBcmd1bWVudFJlZ1ZhbHVlLmgiCisKK25h
bWVzcGFjZSBKU0MgeyBuYW1lc3BhY2UgQjMgeworCitBcmd1bWVudFJlZ1ZhbHVlOjp+QXJndW1l
bnRSZWdWYWx1ZSgpCit7Cit9CisKK3ZvaWQgQXJndW1lbnRSZWdWYWx1ZTo6ZHVtcE1ldGEoUHJp
bnRTdHJlYW0mIG91dCkgY29uc3QKK3sKKyAgICBvdXQucHJpbnQobV9yZWcpOworfQorCit9IH0g
Ly8gbmFtZXNwYWNlIEpTQzo6QjMKKwpJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0Iz
QXJndW1lbnRSZWdWYWx1ZS5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9i
My9CM0FyZ3VtZW50UmVnVmFsdWUuaAkocmV2aXNpb24gMCkKKysrIFNvdXJjZS9KYXZhU2NyaXB0
Q29yZS9iMy9CM0FyZ3VtZW50UmVnVmFsdWUuaAkod29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDYw
IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE1IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNl
cnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5
IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBw
cm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEu
IFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29w
eXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9s
bG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0g
bXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxp
c3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICog
ICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhl
IGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExF
IElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVT
LCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJ
RVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBV
UlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SCisg
KiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURF
TlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJ
TkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRV
VEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsg
T1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9S
WQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZ
LCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5H
IElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYg
QURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisKKyNpZm5k
ZWYgQjNBcmd1bWVudFJlZ1ZhbHVlX2gKKyNkZWZpbmUgQjNBcmd1bWVudFJlZ1ZhbHVlX2gKKwor
I2luY2x1ZGUgIkIzVmFsdWUuaCIKKyNpbmNsdWRlICJSZWcuaCIKKworbmFtZXNwYWNlIEpTQyB7
IG5hbWVzcGFjZSBCMyB7CisKK2NsYXNzIEFyZ3VtZW50UmVnVmFsdWUgOiBwdWJsaWMgVmFsdWUg
eworcHVibGljOgorICAgIHN0YXRpYyBib29sIGFjY2VwdHMoT3Bjb2RlIG9wY29kZSkgeyByZXR1
cm4gb3Bjb2RlID09IEFyZ3VtZW50UmVnOyB9CisgICAgCisgICAgfkFyZ3VtZW50UmVnVmFsdWUo
KTsKKworICAgIFJlZyBhcmd1bWVudFJlZygpIGNvbnN0IHsgcmV0dXJuIG1fcmVnOyB9CisKK3By
b3RlY3RlZDoKKyAgICB2b2lkIGR1bXBNZXRhKFByaW50U3RyZWFtJikgY29uc3Qgb3ZlcnJpZGU7
CisKK3ByaXZhdGU6CisgICAgZnJpZW5kIGNsYXNzIFByb2NlZHVyZTsKKworICAgIEFyZ3VtZW50
UmVnVmFsdWUodW5zaWduZWQgaW5kZXgsIE9yaWdpbiBvcmlnaW4sIFJlZyByZWcpCisgICAgICAg
IDogVmFsdWUoaW5kZXgsIEFyZ3VtZW50UmVnLCByZWcuaXNHUFIoKSA/IHBvaW50ZXIoKSA6IERv
dWJsZSwgb3JpZ2luKQorICAgICAgICAsIG1fcmVnKHJlZykKKyAgICB7CisgICAgfQorCisgICAg
UmVnIG1fcmVnOworfTsKKworfSB9IC8vIG5hbWVzcGFjZSBKU0M6OkIzCisKKyNlbmRpZiAvLyBC
M0FyZ3VtZW50UmVnVmFsdWVfaAorCkluZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNC
YXNpY0Jsb2NrLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNC
YXNpY0Jsb2NrLmNwcAkocmV2aXNpb24gMCkKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9C
M0Jhc2ljQmxvY2suY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsNTggQEAKKy8qCisgKiBD
b3B5cmlnaHQgKEMpIDIwMTUgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAq
IFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGgg
b3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQg
dGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRp
b25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAg
IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xh
aW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVj
ZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRp
b25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0
aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9u
LgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFTIElT
JycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywg
QlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFO
VEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElT
Q0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IKKyAqIENPTlRSSUJVVE9S
UyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFM
LAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVU
IE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBT
RVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJ
TlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFC
SUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAq
IChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBP
VVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRI
RSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKworI2luY2x1ZGUgImNvbmZpZy5o
IgorI2luY2x1ZGUgIkIzQmFzaWNCbG9jay5oIgorCituYW1lc3BhY2UgSlNDIHsgbmFtZXNwYWNl
IEIzIHsKKworQmFzaWNCbG9jazo6QmFzaWNCbG9jayh1bnNpZ25lZCBpbmRleCkKKyAgICA6IG1f
aW5kZXgoaW5kZXgpCit7Cit9CisKK0Jhc2ljQmxvY2s6On5CYXNpY0Jsb2NrKCkKK3sKK30KKwor
dm9pZCBCYXNpY0Jsb2NrOjphcHBlbmQoVmFsdWUqIHZhbHVlKQoreworICAgIG1fdmFsdWVzLmFw
cGVuZCh2YWx1ZSk7Cit9CisKK3ZvaWQgQmFzaWNCbG9jazo6ZHVtcChQcmludFN0cmVhbSYgb3V0
KSBjb25zdAoreworICAgIG91dC5wcmludChkdW1wUHJlZml4LCBtX2luZGV4KTsKK30KKwordm9p
ZCBCYXNpY0Jsb2NrOjpkZWVwRHVtcChQcmludFN0cmVhbSYgb3V0KSBjb25zdAoreworICAgIG91
dC5wcmludCgiQkIiLCAqdGhpcywgIjpcbiIpOworICAgIGZvciAoVmFsdWUqIHZhbHVlIDogKnRo
aXMpCisgICAgICAgIG91dC5wcmludCgiICAgICIsIGRlZXBEdW1wKHZhbHVlKSwgIlxuIik7Cit9
CisKK30gfSAvLyBuYW1lc3BhY2UgSlNDOjpCMworCkluZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENv
cmUvYjMvQjNCYXNpY0Jsb2NrLmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRDb3Jl
L2IzL0IzQmFzaWNCbG9jay5oCShyZXZpc2lvbiAwKQorKysgU291cmNlL0phdmFTY3JpcHRDb3Jl
L2IzL0IzQmFzaWNCbG9jay5oCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsMTEyIEBACisvKgor
ICogQ29weXJpZ2h0IChDKSAyMDE1IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAq
CisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3
aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0
aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJp
YnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Cisg
KiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRp
c2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXBy
b2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29u
ZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1l
bnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1
dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gYGBB
UyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJ
TkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVS
Q0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJF
IERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SCisgKiBDT05UUklC
VVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BF
Q0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcs
IEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMg
T1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5F
U1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0Yg
TElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JU
CisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBX
QVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBP
RiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisKKyNpZm5kZWYgQjNCYXNp
Y0Jsb2NrCisjZGVmaW5lIEIzQmFzaWNCbG9jaworCituYW1lc3BhY2UgSlNDIHsgbmFtZXNwYWNl
IEIzIHsKKworY2xhc3MgUHJvY2VkdXJlOworY2xhc3MgVmFsdWU7CisKK2NsYXNzIEJhc2ljQmxv
Y2sgeworICAgIFdURl9NQUtFX05PTkNPUFlBQkxFKEJhc2ljQmxvY2spOworICAgIFdURl9NQUtF
X0ZBU1RfQUxMT0NBVEVEOworcHVibGljOgorICAgIHR5cGVkZWYgVmVjdG9yPFZhbHVlKj4gVmFs
dWVMaXN0OworICAgIHR5cGVkZWYgVmVjdG9yPEJhc2ljQmxvY2sqLCAyPiBTdWNjZXNzb3JMaXN0
OyAvLyBUaGlzIG1hdGNoZXMgQ29udHJvbFZhbHVlJ3MgdHlwZWRlZi4KKworICAgIHN0YXRpYyBj
b25zdCBjaGFyKiBkdW1wUHJlZml4ID0gIiMiOworCisgICAgfkJhc2ljQmxvY2soKTsKKworICAg
IHVuc2lnbmVkIGluZGV4KCkgY29uc3QgeyByZXR1cm4gbV9pbmRleDsgfQorCisgICAgQWRqYWNl
bmN5TGlzdDo6aXRlcmF0b3IgYmVnaW4oKSB7IHJldHVybiBtX3ZhbHVlcy5iZWdpbigpOyB9Cisg
ICAgQWRqYWNlbmN5TGlzdDo6aXRlcmF0b3IgZW5kKCkgeyByZXR1cm4gbV92YWx1ZXMuZW5kKCk7
IH0KKyAgICBBZGphY2VuY3lMaXN0Ojpjb25zdF9pdGVyYXRvciBiZWdpbigpIGNvbnN0IHsgcmV0
dXJuIG1fdmFsdWVzLmJlZ2luKCk7IH0KKyAgICBBZGphY2VuY3lMaXN0Ojpjb25zdF9pdGVyYXRv
ciBlbmQoKSBjb25zdCB7IHJldHVybiBtX3ZhbHVlcy5lbmQoKTsgfQorCisgICAgc2l6ZV90IHNp
emUoKSBjb25zdCB7IHJldHVybiBtX3ZhbHVlcy5zaXplKCk7IH0KKyAgICBWYWx1ZSogYXQoc2l6
ZV90IGluZGV4KSBjb25zdCB7IHJldHVybiBtX3ZhbHVlc1tpbmRleF07IH0KKyAgICBWYWx1ZSom
IGF0KHNpemVfdCBpbmRleCkgeyByZXR1cm4gbV92YWx1ZXNbaW5kZXhdOyB9CisKKyAgICBWYWx1
ZSogbGFzdCgpIGNvbnN0IHsgcmV0dXJuIG1fdmFsdWVzLmxhc3QoKTsgfQorICAgIFZhbHVlKiYg
bGFzdCgpIHsgcmV0dXJuIG1fdmFsdWVzLmxhc3QoKTsgfQorCisgICAgY29uc3QgVmFsdWVMaXN0
JiB2YWx1ZXMoKSBjb25zdCB7IHJldHVybiBtX3ZhbHVlczsgfQorICAgIFZhbHVlTGlzdCYgdmFs
dWVzKCkgeyByZXR1cm4gbV92YWx1ZXM7IH0KKworICAgIHZvaWQgYXBwZW5kKFZhbHVlKik7CisK
KyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBWYWx1ZVR5cGUsIHR5cGVuYW1lLi4uIEFyZ3VtZW50cz4K
KyAgICBWYWx1ZVR5cGUqIGFwcGVuZE5ldyhQcm9jZWR1cmUmLCBBcmd1bWVudHMuLi4pOworCisg
ICAgdW5zaWduZWQgbnVtU3VjY2Vzc29ycygpIGNvbnN0OworICAgIEJhc2ljQmxvY2sqIHN1Y2Nl
c3Nvcih1bnNpZ25lZCBpbmRleCkgY29uc3Q7CisgICAgQmFzaWNCbG9jayomIHN1Y2Nlc3Nvcih1
bnNpZ25lZCBpbmRleCk7CisgICAgY29uc3QgU3VjY2Vzc29yTGlzdCYgc3VjY2Vzc29ycygpIGNv
bnN0OworCisgICAgdm9pZCBkdW1wKFByaW50U3RyZWFtJikgY29uc3Q7CisgICAgdm9pZCBkZWVw
RHVtcChQcmludFN0cmVhbSYpIGNvbnN0OworCitwcml2YXRlOgorICAgIGZyaWVuZCBjbGFzcyBQ
cm9jZWR1cmU7CisgICAgCisgICAgLy8gSW5zdGFudGlhdGUgdmlhIFByb2NlZHVyZS4KKyAgICBC
YXNpY0Jsb2NrKHVuc2lnbmVkIGluZGV4KTsKKworICAgIHVuc2lnbmVkIG1faW5kZXg7CisgICAg
VmFsdWVMaXN0IG1fdmFsdWVzOworfTsKKworY2xhc3MgRGVlcEJhc2ljQmxvY2tEdW1wIHsKK3B1
YmxpYzoKKyAgICBEZWVwQmFzaWNCbG9ja0R1bXAoQmFzaWNCbG9jayogYmxvY2spCisgICAgICAg
IDogbV9ibG9jayhibG9jaykKKyAgICB7CisgICAgfQorCisgICAgdm9pZCBkdW1wKFByaW50U3Ry
ZWFtJiBvdXQpIGNvbnN0CisgICAgeworICAgICAgICBpZiAobV9ibG9jaykKKyAgICAgICAgICAg
IG1fYmxvY2stPmRlZXBEdW1wKG91dCk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIG91dC5w
cmludCgiPG51bGw+Iik7CisgICAgfQorCitwcml2YXRlOgorICAgIEJhc2ljQmxvY2sqIG1fYmxv
Y2s7Cit9OworCitEZWVwQmFzaWNCbG9ja0R1bXAgZGVlcER1bXAoQmFzaWNCbG9jayogYmxvY2sp
Cit7CisgICAgcmV0dXJuIERlZXBCYXNpY0Jsb2NrRHVtcChibG9jayk7Cit9CisKK30gfSAvLyBu
YW1lc3BhY2UgSlNDOjpCMworCisjZW5kaWYgLy8gQjNCYXNpY0Jsb2NrCisKSW5kZXg6IFNvdXJj
ZS9KYXZhU2NyaXB0Q29yZS9iMy9CM0Jhc2ljQmxvY2tJbmxpbmVzLmgKPT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0g
U291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzQmFzaWNCbG9ja0lubGluZXMuaAkocmV2aXNpb24g
MCkKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM0Jhc2ljQmxvY2tJbmxpbmVzLmgJKHdv
cmtpbmcgY29weSkKQEAgLTAsMCArMSw2NiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNSBB
cHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5k
IHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2Rp
ZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRp
dGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUg
bXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qg
b2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0
cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmln
aHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dp
bmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1h
dGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZU
V0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBS
RVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8s
IFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVT
UyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZF
TlQgU0hBTEwgQVBQTEUgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5Z
IERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9S
IENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisg
KiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVT
RSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZF
UiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBD
T05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdF
TkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBP
RiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNV
Q0ggREFNQUdFLiAKKyAqLworCisjaWZuZGVmIEIzQmFzaWNCbG9ja0lubGluZXNfaAorI2RlZmlu
ZSBCM0Jhc2ljQmxvY2tJbmxpbmVzX2gKKworI2luY2x1ZGUgIkIzQmFzaWNCbG9jay5oIgorI2lu
Y2x1ZGUgIkIzQ29udHJvbFZhbHVlLmgiCisjaW5jbHVkZSAiQjNQcm9jZWR1cmVJbmxpbmVzLmgi
CisKK25hbWVzcGFjZSBKU0MgeyBuYW1lc3BhY2UgQjMgeworCit0ZW1wbGF0ZTx0eXBlbmFtZSBW
YWx1ZVR5cGUgdHlwZW5hbWUuLi4gQXJndW1lbnRzPgorVmFsdWVUeXBlKiBCYXNpY0Jsb2NrOjph
cHBlbmROZXcoUHJvY2VkdXJlJiBwcm9jZWR1cmUsIEFyZ3VtZW50cy4uLiBhcmd1bWVudHMpCit7
CisgICAgVmFsdWVUeXBlKiByZXN1bHQgPSBwcm9jZWR1cmUuYWRkPFZhbHVlVHlwZT4oYXJndW1l
bnRzLi4uKTsKKyAgICBhcHBlbmQocmVzdWx0KTsKKyAgICByZXR1cm4gcmVzdWx0OworfQorCit1
bnNpZ25lZCBCYXNpY0Jsb2NrOjpudW1TdWNjZXNzb3JzKCkgY29uc3QKK3sKKyAgICByZXR1cm4g
bGFzdCgpLT5hczxDb250cm9sVmFsdWU+KCktPm51bVN1Y2Nlc3NvcnMoKTsKK30KKworQmFzaWNC
bG9jayogQmFzaWNCbG9jazo6c3VjY2Vzc29yKHVuc2lnbmVkIGluZGV4KSBjb25zdAoreworICAg
IHJldHVybiBsYXN0KCktPmFzPENvbnRyb2xWYWx1ZT4oKS0+c3VjY2Vzc29yKGluZGV4KTsKK30K
KworQmFzaWNCbG9jayomIEJhc2ljQmxvY2s6OnN1Y2Nlc3Nvcih1bnNpZ25lZCBpbmRleCkKK3sK
KyAgICByZXR1cm4gbGFzdCgpLT5hczxDb250cm9sVmFsdWU+KCktPnN1Y2Nlc3NvcihpbmRleCk7
Cit9CisKK2NvbnN0IEJhc2ljQmxvY2s6OlN1Y2Nlc3Nvckxpc3QmIEJhc2ljQmxvY2s6OnN1Y2Nl
c3NvcnMoKSBjb25zdAoreworICAgIHJldHVybiBsYXN0KCktPmFzPENvbnRyb2xWYWx1ZT4oKS0+
c3VjY2Vzc29ycygpOworfQorCit9IH0gLy8gbmFtZXNwYWNlIEpTQzo6QjMKKworI2VuZGlmIC8v
IEIzQmFzaWNCbG9ja0lubGluZXNfaAorCkluZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMv
QjNDaGVja1ZhbHVlLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMv
QjNDaGVja1ZhbHVlLmNwcAkocmV2aXNpb24gMCkKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9i
My9CM0NoZWNrVmFsdWUuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsNDEgQEAKKy8qCisg
KiBDb3B5cmlnaHQgKEMpIDIwMTUgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoK
KyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdp
dGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRo
YXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmli
dXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAq
ICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlz
Y2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJv
ZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25k
aXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVu
dGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0
aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFT
IElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElO
RywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJD
SEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUg
RElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IKKyAqIENPTlRSSUJV
VE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVD
SUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywg
QlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBP
UiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVT
UyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBM
SUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQK
KyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdB
WSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9G
IFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKworI2luY2x1ZGUgImNvbmZp
Zy5oIgorI2luY2x1ZGUgIkIzQ2hlY2tWYWx1ZS5oIgorCituYW1lc3BhY2UgSlNDIHsgbmFtZXNw
YWNlIEIzIHsKKworQ2hlY2tWYWx1ZTo6fkNoZWNrVmFsdWUoKQoreworfQorCit2b2lkIENoZWNr
VmFsdWU6OmR1bXBNZXRhKFByaW50U3RyZWFtJiBvdXQpIGNvbnN0Cit7CisgICAgb3V0LnByaW50
KCJzdGFja21hcCA9ICIsIHN0YWNrbWFwKTsKK30KKworfSB9IC8vIG5hbWVzcGFjZSBKU0M6OkIz
CisKSW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM0NoZWNrVmFsdWUuaAo9PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNDaGVja1ZhbHVlLmgJKHJldmlzaW9u
IDApCisrKyBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNDaGVja1ZhbHVlLmgJKHdvcmtpbmcg
Y29weSkKQEAgLTAsMCArMSw4MCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNSBBcHBsZSBJ
bmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBp
biBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRp
b24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMK
KyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCBy
ZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29u
ZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRp
b25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAq
ICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlz
Y2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFs
cyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJ
UyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9S
IElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQor
ICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1Ig
QSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hB
TEwgQVBQTEUgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVD
VCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNF
UVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9D
VVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFU
QSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVT
RUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFD
VCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9S
IE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElT
IFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFN
QUdFLiAKKyAqLworCisjaWZuZGVmIEIzQ2hlY2tWYWx1ZV9oCisjZGVmaW5lIEIzQ2hlY2tWYWx1
ZV9oCisKKyNpbmNsdWRlICJCM1ZhbHVlLmgiCisjaW5jbHVkZSAiQjNTdGFja21hcC5oIgorCitu
YW1lc3BhY2UgSlNDIHsgbmFtZXNwYWNlIEIzIHsKKworY2xhc3MgQ2hlY2tWYWx1ZSA6IHB1Ymxp
YyBDaGVjayB7CitwdWJsaWM6CisgICAgc3RhdGljIGJvb2wgYWNjZXB0cyhPcGNvZGUgb3Bjb2Rl
KQorICAgIHsKKyAgICAgICAgc3dpdGNoIChvcGNvZGUpIHsKKyAgICAgICAgY2FzZSBDaGVja0Fk
ZDoKKyAgICAgICAgY2FzZSBDaGVja1N1YjoKKyAgICAgICAgY2FzZSBDaGVja011bDoKKyAgICAg
ICAgY2FzZSBDaGVjazoKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICBkZWZhdWx0
OgorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgfQorCisgICAgfkNo
ZWNrVmFsdWUoKTsKKworICAgIFN0YWNrbWFwIHN0YWNrbWFwOworCitwcm90ZWN0ZWQ6CisgICAg
dm9pZCBkdW1wTWV0YShQcmludFN0cmVhbSYpIGNvbnN0IG92ZXJyaWRlOworCitwcml2YXRlOgor
ICAgIGZyaWVuZCBjbGFzcyBQcm9jZWR1cmU7CisKKyAgICAvLyBVc2UgdGhpcyBmb3JtIGZvciBD
aGVja0FkZCwgQ2hlY2tTdWIsIGFuZCBDaGVja011bC4KKyAgICBDaGVja1ZhbHVlKHVuc2lnbmVk
IGluZGV4LCBPcGNvZGUgb3Bjb2RlLCBPcmlnaW4gb3JpZ2luLCBWYWx1ZSogbGVmdCwgVmFsdWUq
IHJpZ2h0KQorICAgICAgICA6IFZhbHVlKGluZGV4LCBvcGNvZGUsIGxlZnQtPnR5cGUoKSwgb3Jp
Z2luLCBsZWZ0LCByaWdodCkKKyAgICB7CisgICAgICAgIEFTU0VSVChpc0ludCh0eXBlKCkpKTsK
KyAgICAgICAgQVNTRVJUKGxlZnQtPnR5cGUoKSA9PSByaWdodC0+dHlwZSgpKTsKKyAgICAgICAg
QVNTRVJUKG9wY29kZSA9PSBDaGVja0FkZCB8fCBvcGNvZGUgPT0gQ2hlY2tTdWIgfHwgb3Bjb2Rl
ID09IENoZWNrTXVsKTsKKyAgICB9CisKKyAgICAvLyBVc2UgdGhpcyBmb3JtIGZvciBDaGVjay4K
KyAgICBDaGVja1ZhbHVlKHVuc2lnbmVkIGluZGV4LCBPcGNvZGUgb3Bjb2RlLCBPcmlnaW4gb3Jp
Z2luLCBWYWx1ZSogcHJlZGljYXRlKQorICAgICAgICA6IFZhbHVlKGluZGV4LCBvcGNvZGUsIFZv
aWQsIG9yaWdpbiwgcHJlZGljYXRlKQorICAgIHsKKyAgICAgICAgQVNTRVJUKG9wY2RlID09IENo
ZWNrKTsKKyAgICB9Cit9OworCit9IH0gLy8gbmFtZXNwYWNlIEpTQzo6QjMKKworI2VuZGlmIC8v
IEIzQ2hlY2tWYWx1ZV9oCisKKwpJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzQ29t
cGFyaXNvbk1hdGNoZXIucGF0dGVybnMKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRD
b3JlL2IzL0IzQ29tcGFyaXNvbk1hdGNoZXIucGF0dGVybnMJKHJldmlzaW9uIDApCisrKyBTb3Vy
Y2UvSmF2YVNjcmlwdENvcmUvYjMvQjNDb21wYXJpc29uTWF0Y2hlci5wYXR0ZXJucwkod29ya2lu
ZyBjb3B5KQpAQCAtMCwwICsxLDM4IEBACisjIENvcHlyaWdodCAoQykgMjAxNSBBcHBsZSBJbmMu
IEFsbCByaWdodHMgcmVzZXJ2ZWQuCisjCisjIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291
cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorIyBtb2RpZmljYXRpb24sIGFy
ZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyMgYXJl
IG1ldDoKKyMgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRo
ZSBhYm92ZSBjb3B5cmlnaHQKKyMgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBh
bmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorIyAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmlu
YXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorIyAgICBub3RpY2Us
IHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4g
dGhlCisjICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3
aXRoIHRoZSBkaXN0cmlidXRpb24uCisjCisjIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkg
QVBQTEUgSU5DLiBBTkQgSVRTIENPTlRSSUJVVE9SUyBgYEFTIElTJycKKyMgQU5EIEFOWSBFWFBS
RVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8s
CisjIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNT
IEZPUiBBIFBBUlRJQ1VMQVIKKyMgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQg
U0hBTEwgQVBQTEUgSU5DLiBPUiBJVFMgQ09OVFJJQlVUT1JTCisjIEJFIExJQUJMRSBGT1IgQU5Z
IERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKKyMg
Q09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJP
Q1VSRU1FTlQgT0YKKyMgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0Us
IERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTCisjIElOVEVSUlVQVElPTikgSE9XRVZFUiBD
QVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOCisjIENPTlRS
QUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBP
VEhFUldJU0UpCisjIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNP
RlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YKKyMgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFN
QUdFLgorCittYXRjaGVyIENvbXBhcmlzb25NYXRjaGVyCisKK1Rlc3RMb2FkTm90WmVybzEgPSBB
bmQoTG9hZChhZGRyZXNzKSwgcmlnaHQpCitUZXN0TG9hZE5vdFplcm8yID0gQW5kKGxlZnQsIExv
YWQoYWRkcmVzcykpCitUZXN0Tm90WmVybyA9IEFuZChsZWZ0LCByaWdodCkKKworVGVzdExvYWRa
ZXJvMSA9IEVxdWFsKEFuZChMb2FkKGFkZHJlc3MpLCByaWdodCksICQwKQorVGVzdExvYWRaZXJv
MiA9IEVxdWFsKEFuZChsZWZ0LCBMb2FkKGFkZHJlc3MpKSwgJDApCitUZXN0WmVybyA9IEVxdWFs
KEFuZChsZWZ0LCByaWdodCksICQwKQorCitMb2FkRXF1YWwxID0gRXF1YWwoTG9hZChhZGRyZXNz
KSwgcmlnaHQpCitMb2FkRXF1YWwyID0gRXF1YWwobGVmdCwgTG9hZChhZGRyZXNzKSkKK05vdCA9
IEVxdWFsKHZhbHVlLCAkMCkKK0VxdWFsID0gRXF1YWwobGVmdCwgcmlnaHQpCisKSW5kZXg6IFNv
dXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM0NvbnN0MzJWYWx1ZS5jcHAKPT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0g
U291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzQ29uc3QzMlZhbHVlLmNwcAkocmV2aXNpb24gMCkK
KysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM0NvbnN0MzJWYWx1ZS5jcHAJKHdvcmtpbmcg
Y29weSkKQEAgLTAsMCArMSw0MSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNSBBcHBsZSBJ
bmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBp
biBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRp
b24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMK
KyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCBy
ZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29u
ZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRp
b25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAq
ICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlz
Y2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFs
cyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJ
UyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9S
IElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQor
ICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1Ig
QSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hB
TEwgQVBQTEUgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVD
VCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNF
UVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9D
VVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFU
QSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVT
RUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFD
VCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9S
IE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElT
IFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFN
QUdFLiAKKyAqLworCisjaW5jbHVkZSAiY29uZmlnLmgiCisjaW5jbHVkZSAiQjNDb25zdDMyVmFs
dWUuaCIKKworbmFtZXNwYWNlIEpTQyB7IG5hbWVzcGFjZSBCMyB7CisKK0NvbnN0MzJWYWx1ZTo6
fkNvbnN0MzJWYWx1ZSgpCit7Cit9CisKK3ZvaWQgQ29uc3QzMlZhbHVlOjpkdW1wTWV0YShQcmlu
dFN0cmVhbSYgb3V0KSBjb25zdAoreworICAgIG91dC5wcmludChtX3ZhbHVlKTsKK30KKworfSB9
IC8vIG5hbWVzcGFjZSBKU0M6OkIzCisKSW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9C
M0NvbnN0MzJWYWx1ZS5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9C
M0NvbnN0MzJWYWx1ZS5oCShyZXZpc2lvbiAwKQorKysgU291cmNlL0phdmFTY3JpcHRDb3JlL2Iz
L0IzQ29uc3QzMlZhbHVlLmgJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSw1OSBAQAorLyoKKyAq
IENvcHlyaWdodCAoQykgMjAxNSBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgor
ICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0
aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhh
dCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1
dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICog
ICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNj
bGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9k
dWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRp
dGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50
YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRp
b24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIGBgQVMg
SVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5H
LCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNI
QU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBE
SVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUgorICogQ09OVFJJQlVU
T1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJ
QUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBC
VVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9S
IFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNT
IElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJ
QUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAor
ICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZ
IE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0Yg
VEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLiAKKyAqLworCisjaWZuZGVmIEIzQ29uc3Qz
MlZhbHVlX2gKKyNkZWZpbmUgQjNDb25zdDMyVmFsdWVfaAorCisjaW5jbHVkZSAiQjNWYWx1ZS5o
IgorCituYW1lc3BhY2UgSlNDIHsgbmFtZXNwYWNlIEIzIHsKKworY2xhc3MgQ29uc3QzMlZhbHVl
IDogcHVibGljIFZhbHVlIHsKK3B1YmxpYzoKKyAgICBzdGF0aWMgYm9vbCBhY2NlcHRzKE9wY29k
ZSBvcGNvZGUpIHsgcmV0dXJuIG9wY29kZSA9PSBDb25zdDMyOyB9CisgICAgCisgICAgfkNvbnN0
MzJWYWx1ZSgpOworICAgIAorICAgIGludDMyX3QgdmFsdWUoKSBjb25zdCB7IHJldHVybiBtX3Zh
bHVlOyB9CisKK3Byb3RlY3RlZDoKKyAgICB2b2lkIGR1bXBNZXRhKFByaW50U3RyZWFtJikgY29u
c3Qgb3ZlcnJpZGU7CisKK3ByaXZhdGU6CisgICAgZnJpZW5kIGNsYXNzIFByb2NlZHVyZTsKKwor
ICAgIENvbnN0MzJWYWx1ZSh1bnNpZ25lZCBpbmRleCwgT3JpZ2luIG9yaWdpbiwgaW50MzJfdCB2
YWx1ZSkKKyAgICAgICAgOiBWYWx1ZShpbmRleCwgQ29uc3QzMiwgSW50MzIsIG9yaWdpbikKKyAg
ICAgICAgLCBtX3ZhbHVlKHZhbHVlKQorICAgIHsKKyAgICB9CisgICAgCisgICAgaW50MzJfdCBt
X3ZhbHVlOworfTsKKworfSB9IC8vIG5hbWVzcGFjZSBKU0M6OkIzCisKKyNlbmRpZiAvLyBCM0Nv
bnN0MzJWYWx1ZV9oCisKSW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM0NvbnN0NjRW
YWx1ZS5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzQ29uc3Q2
NFZhbHVlLmNwcAkocmV2aXNpb24gMCkKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM0Nv
bnN0NjRWYWx1ZS5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSw0MSBAQAorLyoKKyAqIENv
cHlyaWdodCAoQykgMjAxNSBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICog
UmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBv
ciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0
aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlv
bnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAg
bm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFp
bWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNl
IHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlv
bnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRp
b24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24u
CisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIGBgQVMgSVMn
JyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBC
VVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5U
QUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVND
TEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUgorICogQ09OVFJJQlVUT1JT
IEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUws
CisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQg
Tk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNF
UlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElO
VEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJ
TElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICog
KElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9V
VCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhF
IFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLiAKKyAqLworCisjaW5jbHVkZSAiY29uZmlnLmgi
CisjaW5jbHVkZSAiQjNDb25zdDY0VmFsdWUuaCIKKworbmFtZXNwYWNlIEpTQyB7IG5hbWVzcGFj
ZSBCMyB7CisKK0NvbnN0NjRWYWx1ZTo6fkNvbnN0NjRWYWx1ZSgpCit7Cit9CisKK3ZvaWQgQ29u
c3Q2NFZhbHVlOjpkdW1wTWV0YShQcmludFN0cmVhbSYgb3V0KSBjb25zdAoreworICAgIG91dC5w
cmludChtX3ZhbHVlKTsKK30KKworfSB9IC8vIG5hbWVzcGFjZSBKU0M6OkIzCisKSW5kZXg6IFNv
dXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM0NvbnN0NjRWYWx1ZS5oCj09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNv
dXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM0NvbnN0NjRWYWx1ZS5oCShyZXZpc2lvbiAwKQorKysg
U291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzQ29uc3Q2NFZhbHVlLmgJKHdvcmtpbmcgY29weSkK
QEAgLTAsMCArMSw1OSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNSBBcHBsZSBJbmMuIEFs
bCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3Vy
Y2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFy
ZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFy
ZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4g
dGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9u
cyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGlu
IGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5v
dGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1l
ciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92
aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9W
SURFRCBCWSBBUFBMRSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJ
RUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1Q
TElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJU
SUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQ
TEUgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5E
SVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJ
QUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVO
VCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IK
KyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5E
IE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RS
SUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVS
V0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRX
QVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLiAK
KyAqLworCisjaWZuZGVmIEIzQ29uc3Q2NFZhbHVlX2gKKyNkZWZpbmUgQjNDb25zdDY0VmFsdWVf
aAorCisjaW5jbHVkZSAiQjNWYWx1ZS5oIgorCituYW1lc3BhY2UgSlNDIHsgbmFtZXNwYWNlIEIz
IHsKKworY2xhc3MgQ29uc3Q2NFZhbHVlIDogcHVibGljIFZhbHVlIHsKK3B1YmxpYzoKKyAgICBz
dGF0aWMgYm9vbCBhY2NlcHRzKE9wY29kZSBvcGNvZGUpIHsgcmV0dXJuIG9wY29kZSA9PSBDb25z
dDY0OyB9CisgICAgCisgICAgfkNvbnN0NjRWYWx1ZSgpOworICAgIAorICAgIGludDY0X3QgdmFs
dWUoKSBjb25zdCB7IHJldHVybiBtX3ZhbHVlOyB9CisKK3Byb3RlY3RlZDoKKyAgICB2b2lkIGR1
bXBNZXRhKFByaW50U3RyZWFtJikgY29uc3Qgb3ZlcnJpZGU7CisKK3ByaXZhdGU6CisgICAgZnJp
ZW5kIGNsYXNzIFByb2NlZHVyZTsKKworICAgIENvbnN0NjRWYWx1ZSh1bnNpZ25lZCBpbmRleCwg
T3JpZ2luIG9yaWdpbiwgaW50NjRfdCB2YWx1ZSkKKyAgICAgICAgOiBWYWx1ZShpbmRleCwgQ29u
c3Q2NCwgSW50NjQsIG9yaWdpbikKKyAgICAgICAgLCBtX3ZhbHVlKHZhbHVlKQorICAgIHsKKyAg
ICB9CisgICAgCisgICAgaW50NjRfdCBtX3ZhbHVlOworfTsKKworfSB9IC8vIG5hbWVzcGFjZSBK
U0M6OkIzCisKKyNlbmRpZiAvLyBCM0NvbnN0NjRWYWx1ZV9oCisKSW5kZXg6IFNvdXJjZS9KYXZh
U2NyaXB0Q29yZS9iMy9CM0NvbnN0RG91YmxlVmFsdWUuY3BwCj09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJj
ZS9KYXZhU2NyaXB0Q29yZS9iMy9CM0NvbnN0RG91YmxlVmFsdWUuY3BwCShyZXZpc2lvbiAwKQor
KysgU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzQ29uc3REb3VibGVWYWx1ZS5jcHAJKHdvcmtp
bmcgY29weSkKQEAgLTAsMCArMSw0MSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNSBBcHBs
ZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVz
ZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmlj
YXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlv
bnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVz
dCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2Yg
Y29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmli
dXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQK
KyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcg
ZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVy
aWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FS
RSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNT
IE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRI
RQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBG
T1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQg
U0hBTEwgQVBQTEUgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJ
UkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENP
TlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQ
Uk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwg
REFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBD
QVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05U
UkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNF
IE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBU
SElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0gg
REFNQUdFLiAKKyAqLworCisjaW5jbHVkZSAiY29uZmlnLmgiCisjaW5jbHVkZSAiQjNDb25zdERv
dWJsZVZhbHVlLmgiCisKK25hbWVzcGFjZSBKU0MgeyBuYW1lc3BhY2UgQjMgeworCitDb25zdERv
dWJsZVZhbHVlOjp+Q29uc3REb3VibGVWYWx1ZSgpCit7Cit9CisKK3ZvaWQgQ29uc3REb3VibGVW
YWx1ZTo6ZHVtcE1ldGEoUHJpbnRTdHJlYW0mIG91dCkgY29uc3QKK3sKKyAgICBvdXQucHJpbnRm
KCIlbGUiLCBtX3ZhbHVlKTsKK30KKworfSB9IC8vIG5hbWVzcGFjZSBKU0M6OkIzCisKSW5kZXg6
IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM0NvbnN0RG91YmxlVmFsdWUuaAo9PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNDb25zdERvdWJsZVZhbHVlLmgJKHJldmlz
aW9uIDApCisrKyBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNDb25zdERvdWJsZVZhbHVlLmgJ
KHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSw1OSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAx
NSBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24g
YW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBt
b2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNv
bmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNv
ZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxp
c3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVk
aXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5
cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xs
b3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVy
IG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBT
T0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBF
WFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQg
VE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklU
TkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8g
RVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1Ig
QU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlks
IE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8s
CisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9G
IFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9X
RVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJ
TiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdM
SUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisg
KiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9G
IFNVQ0ggREFNQUdFLiAKKyAqLworCisjaWZuZGVmIEIzQ29uc3REb3VibGVWYWx1ZV9oCisjZGVm
aW5lIEIzQ29uc3REb3VibGVWYWx1ZV9oCisKKyNpbmNsdWRlICJCM1ZhbHVlLmgiCisKK25hbWVz
cGFjZSBKU0MgeyBuYW1lc3BhY2UgQjMgeworCitjbGFzcyBDb25zdERvdWJsZVZhbHVlIDogcHVi
bGljIFZhbHVlIHsKK3B1YmxpYzoKKyAgICBzdGF0aWMgYm9vbCBhY2NlcHRzKE9wY29kZSBvcGNv
ZGUpIHsgcmV0dXJuIG9wY29kZSA9PSBDb25zdERvdWJsZTsgfQorICAgIAorICAgIH5Db25zdERv
dWJsZVZhbHVlKCk7CisgICAgCisgICAgZG91YmxlIHZhbHVlKCkgY29uc3QgeyByZXR1cm4gbV92
YWx1ZTsgfQorCitwcm90ZWN0ZWQ6CisgICAgdm9pZCBkdW1wTWV0YShQcmludFN0cmVhbSYpIGNv
bnN0IG92ZXJyaWRlOworCitwcml2YXRlOgorICAgIGZyaWVuZCBjbGFzcyBQcm9jZWR1cmU7CisK
KyAgICBDb25zdERvdWJsZVZhbHVlKHVuc2lnbmVkIGluZGV4LCBPcmlnaW4gb3JpZ2luLCBkb3Vi
bGUgdmFsdWUpCisgICAgICAgIDogVmFsdWUoaW5kZXgsIENvbnN0RG91YmxlLCBEb3VibGUsIG9y
aWdpbikKKyAgICAgICAgLCBtX3ZhbHVlKHZhbHVlKQorICAgIHsKKyAgICB9CisgICAgCisgICAg
ZG91YmxlIG1fdmFsdWU7Cit9OworCit9IH0gLy8gbmFtZXNwYWNlIEpTQzo6QjMKKworI2VuZGlm
IC8vIEIzQ29uc3REb3VibGVWYWx1ZV9oCisKSW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9i
My9CM0NvbnRyb2xWYWx1ZS5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRDb3Jl
L2IzL0IzQ29udHJvbFZhbHVlLmNwcAkocmV2aXNpb24gMCkKKysrIFNvdXJjZS9KYXZhU2NyaXB0
Q29yZS9iMy9CM0NvbnRyb2xWYWx1ZS5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSw0MyBA
QAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNSBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2
ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBm
b3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJv
dmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBS
ZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHly
aWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxv
d2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11
c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0
IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAg
IGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBk
aXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJ
TkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywg
SU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVT
IE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQ
T1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUgorICog
Q09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5U
QUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5D
TFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRF
IEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9S
IEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkK
KyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwg
T1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJ
TiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFE
VklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLiAKKyAqLworCisjaW5jbHVk
ZSAiY29uZmlnLmgiCisjaW5jbHVkZSAiQjNDb250cm9sVmFsdWUuaCIKKworbmFtZXNwYWNlIEpT
QyB7IG5hbWVzcGFjZSBCMyB7CisKK0NvbnRyb2xWYWx1ZTo6fkNvbnRyb2xWYWx1ZSgpCit7Cit9
CisKK3ZvaWQgQ29udHJvbFZhbHVlOjpkdW1wTWV0YShQcmludFN0cmVhbSYgb3V0KSBjb25zdAor
eworICAgIENvbW1hUHJpbnRlciBjb21tYTsKKyAgICBmb3IgKEJhc2ljQmxvY2sqIGJsb2NrIDog
bV9zdWNjZXNzb3JzKQorICAgICAgICBvdXQucHJpbnQoY29tbWEsIHBvaW50ZXJEdW1wKGJsb2Nr
KSk7Cit9CisKK30gfSAvLyBuYW1lc3BhY2UgSlNDOjpCMworCkluZGV4OiBTb3VyY2UvSmF2YVNj
cmlwdENvcmUvYjMvQjNDb250cm9sVmFsdWUuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNj
cmlwdENvcmUvYjMvQjNDb250cm9sVmFsdWUuaAkocmV2aXNpb24gMCkKKysrIFNvdXJjZS9KYXZh
U2NyaXB0Q29yZS9iMy9CM0NvbnRyb2xWYWx1ZS5oCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEs
MTE3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE1IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyBy
ZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmlu
YXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRl
ZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAq
IDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUg
Y29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUg
Zm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZv
cm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlz
IGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQor
ICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGgg
dGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQ
UExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5U
SUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJB
TlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAq
IFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9S
CisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5D
SURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VT
IChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNU
SVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklU
UzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRI
RU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklM
SVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklT
SU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4g
SUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisKKyNp
Zm5kZWYgQjNDb250cm9sVmFsdWVfaAorI2RlZmluZSBCM0NvbnRyb2xWYWx1ZV9oCisKKyNpbmNs
dWRlICJCM1ZhbHVlLmgiCisKK25hbWVzcGFjZSBKU0MgeyBuYW1lc3BhY2UgQjMgeworCitjbGFz
cyBCYXNpY0Jsb2NrOworCitjbGFzcyBDb250cm9sVmFsdWUgOiBwdWJsaWMgVmFsdWUgeworcHVi
bGljOgorICAgIHN0YXRpYyBib29sIGFjY2VwdHMoT3Bjb2RlIG9wY29kZSkKKyAgICB7CisgICAg
ICAgIHN3aXRjaCAob3Bjb2RlKSB7CisgICAgICAgIGNhc2UgSnVtcDoKKyAgICAgICAgY2FzZSBC
cmFuY2g6CisgICAgICAgIGNhc2UgUmV0dXJuOgorICAgICAgICBjYXNlIE9vcHM6CisgICAgICAg
ICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgY2FzZSBTd2l0Y2g6IAorICAgICAgICAgICAgLy8g
VGhpcyBpcyBoZXJlIGJlY2F1c2UgU3dpdGNoVmFsdWUgaXMgYSBzdWJjbGFzcyBvZiBDb250cm9s
VmFsdWUsIHNvIHdlIHdhbnQKKyAgICAgICAgICAgIC8vIHN3dGljaFZhbHVlLT5hczxDb250cm9s
VmFsdWU+KCkgdG8gcmV0dXJuIG5vbi1udWxsLgorICAgICAgICAgICAgcmV0dXJuIHRydWU7Cisg
ICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAg
ICB9CisKKyAgICB0eXBlZGVmIFZlY3RvcjxCYXNpY0Jsb2NrKiwgMj4gU3VjY2Vzc29yTGlzdDsK
KworICAgIH5Db250cm9sVmFsdWUoKTsKKworICAgIHVuc2lnbmVkIG51bVN1Y2Nlc3NvcnMoKSBj
b25zdCB7IHJldHVybiBtX3N1Y2Nlc3NvcnMuc2l6ZSgpOyB9CisgICAgQmFzaWNCbG9jayogc3Vj
Y2Vzc29yKHVuc2lnbmVkIGluZGV4KSBjb25zdCB7IHJldHVybiBtX3N1Y2Nlc3NvcnNbaV07IH0K
KyAgICBCYXNpY0Jsb2NrKiYgc3VjY2Vzc29yKHVuc2lnbmVkIGluZGV4KSB7IHJldHVybiBtX3N1
Y2Nlc3NvcnNbaV07IH0KKworICAgIGNvbnN0IFN1Y2Nlc3Nvckxpc3QmIHN1Y2Nlc3NvcnMoKSBj
b25zdCB7IHJldHVybiBtX3N1Y2Nlc3NvcnM7IH0KKworcHJvdGVjdGVkOgorICAgIHZvaWQgZHVt
cE1ldGEoUHJpbnRTdHJlYW0mKSBjb25zdCBvdmVycmlkZTsKKworICAgIC8vIFVzZSB0aGlzIGZv
ciBzdWJjbGFzc2VzLgorICAgIHRlbXBsYXRlPHR5cGVuYW1lLi4uIEFyZ3VtZW50cz4KKyAgICBD
b250cm9sVmFsdWUodW5zaWduZWQgaW5kZXgsIE9wY29kZSBvcGNvZGUsIFR5cGUgdHlwZSwgT3Jp
Z2luIG9yaWdpbiwgQXJndW1lbnRzLi4uIGFyZ3VtZW50cykKKyAgICAgICAgOiBWYWx1ZShpbmRl
eCwgb3Bjb2RlLCB0eXBlLCBvcmlnaW4sIGFyZ3VtZW50cy4uLikKKyAgICB7CisgICAgfQorCisg
ICAgLy8gU3ViY2xhc3NlcyB3aWxsIHBvcHVsYXRlIHRoaXMuCisgICAgU3VjY2Vzc29yTGlzdCBt
X3N1Y2Nlc3NvcnM7CisKK3ByaXZhdGU6CisgICAgZnJpZW5kIGNsYXNzIFByb2NlZHVyZTsKKwor
ICAgIC8vIFVzZSB0aGlzIGZvciBPb3BzLgorICAgIENvbnRyb2xWYWx1ZSh1bnNpZ25lZCBpbmRl
eCwgT3Bjb2RlIG9wY29kZSwgT3JpZ2luIG9yaWdpbikKKyAgICAgICAgOiBWYWx1ZShpbmRleCwg
b3Bjb2RlLCBWb2lkLCBvcmlnaW4pCisgICAgeworICAgICAgICBBU1NFUlQob3Bjb2RlID09IE9v
cHMpOworICAgIH0KKworICAgIC8vIFVzZSB0aGlzIGZvciBSZXR1cm4uCisgICAgQ29udHJvbFZh
bHVlKHVuc2lnbmVkIGluZGV4LCBPcGNvZGUgb3Bjb2RlLCBPcmlnaW4gb3JpZ2luLCBWYWx1ZSog
cmVzdWx0KQorICAgICAgICA6IFZhbHVlKGluZGV4LCBvcGNvZGUsIFZvaWQsIG9yaWdpbiwgcmVz
dWx0KQorICAgIHsKKyAgICAgICAgQVNTRVJUKG9wY29kZSA9PSBSZXR1cm4pOworICAgIH0KKwor
ICAgIC8vIFVzZSB0aGlzIGZvciBKdW1wLgorICAgIENvbnRyb2xWYWx1ZSh1bnNpZ25lZCBpbmRl
eCwgT3Bjb2RlIG9wY29kZSwgT3JpZ2luIG9yaWdpbiwgQmFzaWNCbG9jayogdGFyZ2V0KQorICAg
ICAgICA6IFZhbHVlKGluZGV4LCBvcGNvZGUsIFZvaWQsIG9yaWdpbikKKyAgICB7CisgICAgICAg
IEFTU0VSVChvcGNvZGUgPT0gSnVtcCk7CisgICAgICAgIG1fc3VjY2Vzc29ycy5hcHBlbmQodGFy
Z2V0KTsKKyAgICB9CisKKyAgICAvLyBVc2UgdGhpcyBmb3IgQnJhbmNoLgorICAgIENvbnRyb2xW
YWx1ZSgKKyAgICAgICAgdW5zaWduZWQgaW5kZXgsIE9wY29kZSBvcGNvZGUsIE9yaWdpbiBvcmln
aW4sIFZhbHVlKiBwcmVkaWNhdGUsCisgICAgICAgIEJhc2ljQmxvY2sqIHllcywgQmFzaWNCbG9j
ayogbm8pCisgICAgICAgIDogVmFsdWUoaW5kZXgsIG9wY29kZSwgVm9pZCwgb3JpZ2luLCBwcmVk
aWNhdGUpCisgICAgeworICAgICAgICBBU1NFUlQob3Bjb2RlID09IEJyYW5jaCk7CisgICAgICAg
IG1fc3VjY2Vzc29ycy5hcHBlbmQoeWVzKTsKKyAgICAgICAgbV9zdWNjZXNzb3JzLmFwcGVuZChu
byk7CisgICAgfQorfTsKKworfSB9IC8vIG5hbWVzcGFjZSBKU0M6OkIzCisKKyNlbmRpZiAvLyBC
M0NvbnRyb2xWYWx1ZV9oCisKSW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM0luZGV4
U2V0LmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzSW5kZXhTZXQu
aAkocmV2aXNpb24gMCkKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM0luZGV4U2V0LmgJ
KHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSwxNDEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIw
MTUgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9u
IGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICog
bW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBj
b25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBj
b2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBs
aXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJl
ZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29w
eXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9s
bG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhl
ciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMg
U09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICog
RVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVE
IFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJ
VE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5P
IEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9S
IEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZ
LCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRP
LAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBP
RiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhP
V0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIg
SU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVH
TElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQor
ICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBP
RiBTVUNIIERBTUFHRS4gCisgKi8KKworI2lmbmRlZiBCM0luZGV4U2V0X2gKKyNkZWZpbmUgQjNJ
bmRleFNldF9oCisKKyNpbmNsdWRlIDx3dGYvQml0VmVjdG9yLmg+CisjaW5jbHVkZSA8d3RmL0Nv
bW1hUHJpbnRlci5oPgorCituYW1lc3BhY2UgSlNDIHsgbmFtZXNwYWNlIEIzIHsKKworLy8gVGhp
cyBpcyBhIHNldCBmb3IgdGhpbmdzIHRoYXQgaGF2ZSBhbiBpbmRleCgpLiBJdCdzIHN1cGVyIGVm
ZmljaWVudCBmb3IgQmFzaWNCbG9ja3MuIEl0J3Mgb25seQorLy8gZWZmaWNpZW50IGZvciBWYWx1
ZXMgaWYgeW91IGRvbid0IGNyZWF0ZSB0b28gbWFueSBvZiB0aGVzZSBzZXRzLCBzaW5jZSBWYWx1
ZXMgY2FuIGhhdmUgdmVyeSBzcGFyc2UKKy8vIGluZGljZXMgYW5kIHRoZXJlIGFyZSBhIGxvdCBv
ZiBWYWx1ZXMuCisKKy8vIElmIHlvdSB3YW50IGEgc2V0IG9mIEJhc2ljQmxvY2tzLCB5b3UgZG8g
SW5kZXhTZXQ8QmFzaWNCbG9jaz4uIFNvLCBUID0gQmFzaWNCbG9jay4KK3RlbXBsYXRlPHR5cGVu
YW1lIFQ+CitjbGFzcyBJbmRleFNldCB7CitwdWJsaWM6CisgICAgSW5kZXhTZXQoKQorICAgIHsK
KyAgICB9CisKKyAgICBib29sIGFkZChUKiB2YWx1ZSkKKyAgICB7CisgICAgICAgIHJldHVybiAh
bV9zZXQuc2V0KHZhbHVlLT5pbmRleCgpKTsKKyAgICB9CisKKyAgICBib29sIGNvbnRhaW5zKFQq
IHZhbHVlKSBjb25zdAorICAgIHsKKyAgICAgICAgaWYgKCF2YWx1ZSkKKyAgICAgICAgICAgIHJl
dHVybiBudWxscHRyOworICAgICAgICByZXR1cm4gbV9zZXQuZ2V0KHZhbHVlLT5pbmRleCgpKTsK
KyAgICB9CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBDb2xsZWN0aW9uVHlwZT4KKyAgICBjbGFz
cyBJdGVyYWJsZSB7CisgICAgcHVibGljOgorICAgICAgICBJdGVyYWJsZShjb25zdCBDb2xsZWN0
aW9uVHlwZSYgY29sbGVjdGlvbiwgY29uc3QgSW5kZXhTZXQmIHNldCkKKyAgICAgICAgICAgIDog
bV9jb2xsZWN0aW9uKGNvbGxlY3Rpb24pCisgICAgICAgICAgICAsIG1fc2V0KHNldCkKKyAgICAg
ICAgeworICAgICAgICB9CisKKyAgICAgICAgY2xhc3MgaXRlcmF0b3IgeworICAgICAgICBwdWJs
aWM6CisgICAgICAgICAgICBpdGVyYXRvcigpCisgICAgICAgICAgICAgICAgOiBtX2NvbGxlY3Rp
b24obnVsbHB0cikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAg
aXRlcmF0b3IoY29uc3QgQ29sbGVjdGlvblR5cGUmIGNvbGxlY3Rpb24sIEJpdFZlY3Rvcjo6U2V0
Qml0c0l0ZXJhYmxlOjppdGVyYXRvciBpdGVyKQorICAgICAgICAgICAgICAgIDogbV9jb2xsZWN0
aW9uKCZjb2xsZWN0aW9uKQorICAgICAgICAgICAgICAgICwgbV9pdGVyKGl0ZXIpCisgICAgICAg
ICAgICB7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIFQqIG9wZXJhdG9yKigpCisgICAg
ICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG1fY29sbGVjdGlvbi0+YXQoKm1faXRl
cik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGl0ZXJhdG9yJiBvcGVyYXRvcisrKCkK
KyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtX2l0ZXIrKzsKKyAgICAgICAgICAgICAg
ICByZXR1cm4gKnRoaXM7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGJvb2wgb3BlcmF0
b3I9PShjb25zdCBpdGVyYXRvciYgb3RoZXIpIGNvbnN0CisgICAgICAgICAgICB7CisgICAgICAg
ICAgICAgICAgcmV0dXJuIG1faXRlciA9PSBvdGhlci5tX2l0ZXI7CisgICAgICAgICAgICB9CisK
KyAgICAgICAgICAgIGJvb2wgb3BlcmF0b3IhPShjb25zdCBpdGVyYXRvciYgb3RoZXIpIGNvbnN0
CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuICEoKnRoaXMgPT0gb3RoZXIp
OworICAgICAgICAgICAgfQorCisgICAgICAgIHByaXZhdGU6CisgICAgICAgICAgICBjb25zdCBD
b2xsZWN0aW9uVHlwZSogbV9jb2xsZWN0aW9uOworICAgICAgICAgICAgQml0VmVjdG9yOjpTZXRC
aXRzSXRlcmFibGU6Oml0ZXJhdG9yIG1faXRlcjsKKyAgICAgICAgfTsKKworICAgICAgICBpdGVy
YXRvciBiZWdpbigpIGNvbnN0IHsgcmV0dXJuIGl0ZXJhdG9yKG1fY29sbGVjdGlvbiwgbV9zZXQu
YmVnaW4oKSk7IH0KKyAgICAgICAgaXRlcmF0b3IgZW5kKCkgY29uc3QgeyByZXR1cm4gaXRlcmF0
b3IobV9jb2xsZWN0aW9uLCBtX3NldC5lbmQoKSk7IH0KKworICAgIHByaXZhdGU6CisgICAgICAg
IGNvbnN0IENvbGxlY3Rpb25UeXBlJiBtX2NvbGxlY3Rpb247CisgICAgICAgIGNvbnN0IEluZGV4
U2V0JiBtX3NldDsKKyAgICB9OworCisgICAgLy8gRm9yIGJhc2ljIGJsb2NrcywgeW91IGRvOgor
ICAgIC8vIGluZGV4U2V0LnZhbHVlcyhwcm9jZWR1cmUpOworICAgIC8vCisgICAgLy8gRm9yIHZh
bHVlcywgeW91IGRvOgorICAgIC8vIGluZGV4U2V0LnZhbHVlcyhwcm9jZWR1cmUudmFsdWVzKCkp
OworICAgIHRlbXBsYXRlPHR5cGVuYW1lIENvbGxlY3Rpb25UeXBlPgorICAgIEl0ZXJhYmxlPENv
bGxlY3Rpb25UeXBlPiB2YWx1ZXMoY29uc3QgQ29sbGVjdGlvblR5cGUmIGNvbGxlY3Rpb24pIGNv
bnN0CisgICAgeworICAgICAgICByZXR1cm4gSXRlcmFibGU8Q29sbGVjdGlvblR5cGU+KGNvbGxl
Y3Rpb24pOworICAgIH0KKworICAgIGNvbnN0IEJpdFZlY3RvciYgaW5kaWNlcygpIGNvbnN0IHsg
cmV0dXJuIG1fc2V0OyB9CisKKyAgICB2b2lkIGR1bXAoUHJpbnRTdHJlYW0mIG91dCkgY29uc3QK
KyAgICB7CisgICAgICAgIENvbW1hUHJpbnRlciBjb21tYTsKKyAgICAgICAgZm9yIChzaXplX3Qg
aW5kZXggOiBpbmRpY2VzKCkuc2V0Qml0cygpKQorICAgICAgICAgICAgb3V0LnByaW50KGNvbW1h
LCBUOjpkdW1wUHJlZml4LCBpbmRleCk7CisgICAgfQorCitwcml2YXRlOgorICAgIEJpdFZlY3Rv
ciBtX3NldDsKK307CisKK30gfSAvLyBuYW1lc3BhY2UgSlNDOjpCMworCisjZW5kaWYgLy8gQjNJ
bmRleFNldF9oCisKSW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM0xvd2VyaW5nTWF0
Y2hlci5wYXR0ZXJucwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNM
b3dlcmluZ01hdGNoZXIucGF0dGVybnMJKHJldmlzaW9uIDApCisrKyBTb3VyY2UvSmF2YVNjcmlw
dENvcmUvYjMvQjNMb3dlcmluZ01hdGNoZXIucGF0dGVybnMJKHdvcmtpbmcgY29weSkKQEAgLTAs
MCArMSw0MSBAQAorIyBDb3B5cmlnaHQgKEMpIDIwMTUgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJl
c2VydmVkLgorIworIyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5
IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyMgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHBy
b3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisjIGFyZSBtZXQ6CisjIDEuIFJl
ZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJp
Z2h0CisjICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dp
bmcgZGlzY2xhaW1lci4KKyMgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3Qg
cmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyMgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2Yg
Y29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorIyAgICBkb2N1
bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJp
YnV0aW9uLgorIworIyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gQU5E
IElUUyBDT05UUklCVVRPUlMgYGBBUyBJUycnCisjIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVE
IFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorIyBUSEUgSU1QTElF
RCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNV
TEFSCisjIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElO
Qy4gT1IgSVRTIENPTlRSSUJVVE9SUworIyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElS
RUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCisjIENPTlNFUVVFTlRJQUwg
REFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCisj
IFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9G
SVRTOyBPUiBCVVNJTkVTUworIyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBB
TlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTgorIyBDT05UUkFDVCwgU1RSSUNUIExJ
QUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorIyBB
UklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJ
RiBBRFZJU0VEIE9GCisjIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworbWF0Y2hl
ciBMb3dlcmluZ01hdGNoZXIKKworIyBUaGVzZSBydWxlcyBhcmUgY29uc2lkZXJlZCBpbiBhIGNh
c2NhZGUsIHN0YXJ0aW5nIGF0IHRoZSB0b3AuIEl0J3MgaW1wbGVuZW50ZWQgdXNpbmcgc3dpdGNo
CisjIHN0YXRlbWVudHMgd2hlcmV2ZXIgcG9zc2libGUuCisKKyMgTm90ZTogYWRkaW5nIG1vcmUg
cnVsZXMgdG8gdGhpcyBtYXRjaGVyIGlzIGFuIGV4Y2VsbGVudCB3YXkgb2YgaW1wcm92aW5nIHBl
cmZvcm1hbmNlIQorCitMb2FkID0gTG9hZChhZGRyZXNzKQorCitBZGRMb2FkID0gQWRkKExvYWQo
YWRkcmVzcyksIHZhbHVlKQorQWRkID0gQWRkKGxlZnQsIHJpZ2h0KQorCitTdG9yZUFkZExvYWQg
PSBTdG9yZShBZGQoTG9hZChhZGRyZXNzKSwgdmFsdWUpLCBhZGRyZXNzKQorU3RvcmVBbmRMb2Fk
ID0gU3RvcmUoQW5kKExvYWQoYWRkcmVzcyksIHZhbHVlKSwgYWRkcmVzcykKK1N0b3JlID0gU3Rv
cmUodmFsdWUsIGFkZHJlc3MpCisKK1JldHVybiA9IFJldHVybih2YWx1ZSkKKwpJbmRleDogU291
cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzTWVtb3J5VmFsdWUuY3BwCj09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNv
dXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM01lbW9yeVZhbHVlLmNwcAkocmV2aXNpb24gMCkKKysr
IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM01lbW9yeVZhbHVlLmNwcAkod29ya2luZyBjb3B5
KQpAQCAtMCwwICsxLDQyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE1IEFwcGxlIEluYy4g
QWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNv
dXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwg
YXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICog
YXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFp
biB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRp
b25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMg
aW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAg
bm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFp
bWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHBy
b3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBS
T1ZJREVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1Q
TElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJ
TVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBB
UlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBB
UFBMRSBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJ
TkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVO
VElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVN
RU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBP
UgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBB
TkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBT
VFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RI
RVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09G
VFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0Uu
IAorICovCisKKyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJCM01lbW9yeVZhbHVlLmgi
CisKK25hbWVzcGFjZSBKU0MgeyBuYW1lc3BhY2UgQjMgeworCitNZW1vcnlWYWx1ZTo6fk1lbW9y
eVZhbHVlKCkKK3sKK30KKwordm9pZCBNZW1vcnlWYWx1ZTo6ZHVtcE1ldGEoUHJpbnRTdHJlYW0m
IG91dCkgY29uc3QKK3sKKyAgICBpZiAobV9vZmZzZXQpCisgICAgICAgIG91dC5wcmludCgib2Zm
c2V0ID0gIiwgbV9vZmZzZXQpOworfQorCit9IH0gLy8gbmFtZXNwYWNlIEpTQzo6QjMKKwpJbmRl
eDogU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzTWVtb3J5VmFsdWUuaAo9PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0t
LSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNNZW1vcnlWYWx1ZS5oCShyZXZpc2lvbiAwKQor
KysgU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzTWVtb3J5VmFsdWUuaAkod29ya2luZyBjb3B5
KQpAQCAtMCwwICsxLDE0MiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNSBBcHBsZSBJbmMu
IEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBz
b3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24s
IGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAq
IGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRh
aW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0
aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25z
IGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAg
IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xh
aW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBw
cm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQ
Uk9WSURFRCBCWSBBUFBMRSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElN
UExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICog
SU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQ
QVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwg
QVBQTEUgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwg
SU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVF
TlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJF
TUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwg
T1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQg
QU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwg
U1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9U
SEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNP
RlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdF
LiAKKyAqLworCisjaWZuZGVmIEIzTWVtb3J5VmFsdWVfaAorI2RlZmluZSBCM01lbW9yeVZhbHVl
X2gKKworI2luY2x1ZGUgIkIzVmFsdWUuaCIKKworbmFtZXNwYWNlIEpTQyB7IG5hbWVzcGFjZSBC
MyB7CisKK2NsYXNzIE1lbW9yeVZhbHVlIDogcHVibGljIFZhbHVlIHsKK3B1YmxpYzoKKyAgICBz
dGF0aWMgYm9vbCBhY2NlcHRzKE9wY29kZSBvcGNvZGUpCisgICAgeworICAgICAgICBzd2l0Y2gg
KG9wY29kZSkgeworICAgICAgICBjYXNlIExvYWQ4WjoKKyAgICAgICAgY2FzZSBMb2FkOFM6Cisg
ICAgICAgIGNhc2UgTG9hZDE2WjoKKyAgICAgICAgY2FzZSBMb2FkMTZTOgorICAgICAgICBjYXNl
IExvYWRGbG9hdDoKKyAgICAgICAgY2FzZSBMb2FkOgorICAgICAgICBjYXNlIFN0b3JlODoKKyAg
ICAgICAgY2FzZSBTdG9yZTE2OgorICAgICAgICBjYXNlIFN0b3JlRmxvYXQ6CisgICAgICAgIGNh
c2UgU3RvcmU6CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgZGVmYXVsdDoKKyAg
ICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIH5NZW1vcnlW
YWx1ZSgpOworCisgICAgaW50cHRyX3Qgb2Zmc2V0KCkgY29uc3QgeyByZXR1cm4gbV9vZmZzZXQ7
IH0KKworcHJvdGVjdGVkOgorICAgIHZvaWQgZHVtcE1ldGEoUHJpbnRTdHJlYW0mKSBjb25zdCBv
dmVycmlkZTsKKworcHJpdmF0ZToKKyAgICBmcmllbmQgY2xhc3MgUHJvY2VkdXJlOworCisgICAg
Ly8gVXNlIHRoaXMgZm9ybSBmb3IgTG9hZCAoYnV0IG5vdCBMb2FkOFosIExvYWQ4Uywgb3IgYW55
IG9mIHRoZSBMb2FkcyB0aGF0IGhhdmUgYSBzdWZmaXggdGhhdAorICAgIC8vIGRlc2NyaWJlcyB0
aGUgcmV0dXJuZWQgdHlwZSkuCisgICAgTWVtb3J5VmFsdWUoCisgICAgICAgIHVuc2lnbmVkIGlu
ZGV4LCBPcGNvZGUgb3Bjb2RlLCBUeXBlIHR5cGUsIE9yaWdpbiBvcmlnaW4sIFZhbHVlKiBwb2lu
dGVyLAorICAgICAgICBpbnRwdHJfdCBvZmZzZXQgPSAwKQorICAgICAgICA6IFZhbHVlKGluZGV4
LCBvcGNvZGUsIHR5cGUsIG9yaWdpbiwgcG9pbnRlcikKKyAgICAgICAgLCBtX29mZnNldChvZmZz
ZXQpCisgICAgeworICAgICAgICBpZiAoIUFTU0VSVF9ESVNBQkxFRCkgeworICAgICAgICAgICAg
c3dpdGNoIChvcGNvZGUpIHsKKyAgICAgICAgICAgIGNhc2UgTG9hZDoKKyAgICAgICAgICAgICAg
ICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgTG9hZDhaOgorICAgICAgICAgICAgY2FzZSBMb2Fk
OFM6CisgICAgICAgICAgICBjYXNlIExvYWQxNlo6CisgICAgICAgICAgICBjYXNlIExvYWQxNlM6
CisgICAgICAgICAgICAgICAgQVNTRVJUKHR5cGUgPT0gSW50MzIpOworICAgICAgICAgICAgICAg
IGJyZWFrOworICAgICAgICAgICAgY2FzZSBMb2FkRmxvYXQ6CisgICAgICAgICAgICAgICAgQVNT
RVJUKHR5cGUgPT0gRG91YmxlKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAg
IGNhc2UgU3RvcmU4OgorICAgICAgICAgICAgY2FzZSBTdG9yZTE2OgorICAgICAgICAgICAgY2Fz
ZSBTdG9yZUZsb2F0OgorICAgICAgICAgICAgY2FzZSBTdG9yZToKKyAgICAgICAgICAgICAgICBB
U1NFUlQodHlwZSA9PSBWb2lkKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAg
IGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgQVNTRVJUX05PVF9SRUFDSEVEKCk7CisgICAgICAg
ICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBVc2UgdGhpcyBmb3JtIGZvciBsb2Fk
cyB3aGVyZSB0aGUgcmV0dXJuIHR5cGUgaXMgaW1wbGllZC4KKyAgICBNZW1vcnlWYWx1ZSh1bnNp
Z25lZCBpbmRleCwgT3Bjb2RlIG9wY29kZSwgT3JpZ2luIG9yaWdpbiwgVmFsdWUqIHBvaW50ZXIs
IGludHB0cl90IG9mZnNldCA9IDApCisgICAgICAgIDogVmFsdWUoaW5kZXgsIG9wY29kZSwgb3Bj
b2RlID09IExvYWRGbG9hdCA/IERvdWJsZSA6IEludDMyLCBvcmlnaW4sIHBvaW50ZXIpCisgICAg
ICAgICwgbV9vZmZzZXQob2Zmc2V0KQorICAgIHsKKyAgICAgICAgaWYgKCFBU1NFUlRfRElTQUJM
RUQpIHsKKyAgICAgICAgICAgIHN3aXRjaCAob3Bjb2RlKSB7CisgICAgICAgICAgICBjYXNlIExv
YWQ4WjoKKyAgICAgICAgICAgIGNhc2UgTG9hZDhTOgorICAgICAgICAgICAgY2FzZSBMb2FkMTZa
OgorICAgICAgICAgICAgY2FzZSBMb2FkMTZTOgorICAgICAgICAgICAgY2FzZSBMb2FkRmxvYXQ6
CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAg
ICAgICAgIEFTU0VSVF9OT1RfUkVBQ0hFRCgpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAg
ICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLy8gVXNlIHRoaXMgZm9ybSBmb3Ig
c3RvcmVzLgorICAgIE1lbW9yeVZhbHVlKAorICAgICAgICB1bnNpZ25lZCBpbmRleCwgT3Bjb2Rl
IG9wY29kZSwgT3JpZ2luIG9yaWdpbiwgVmFsdWUqIHZhbHVlLCBWYWx1ZSogcG9pbnRlciwKKyAg
ICAgICAgaW50cHRyX3Qgb2Zmc2V0ID0gMCkKKyAgICAgICAgOiBWYWx1ZShpbmRleCwgb3Bjb2Rl
LCBWb2lkLCBvcmlnaW4sIHZhbHVlLCBwb2ludGVyKQorICAgICAgICAsIG1fb2Zmc2V0KG9mZnNl
dCkKKyAgICB7CisgICAgICAgIGlmICghQVNTRVJUX0RJU0FCTEVEKSB7CisgICAgICAgICAgICBz
d2l0Y2ggKG9wY29kZSkgeworICAgICAgICAgICAgY2FzZSBTdG9yZTg6CisgICAgICAgICAgICBj
YXNlIFN0b3JlMTY6CisgICAgICAgICAgICBjYXNlIFN0b3JlRmxvYXQ6CisgICAgICAgICAgICBj
YXNlIFN0b3JlOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoK
KyAgICAgICAgICAgICAgICBBU1NFUlRfTk9UX1JFQUNIRUQoKTsKKyAgICAgICAgICAgICAgICBi
cmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK307CisKK30gfSAvLyBuYW1l
c3BhY2UgSlNDOjpCMworCisjZW5kaWYgLy8gQjNNZW1vcnlWYWx1ZV9oCisKSW5kZXg6IFNvdXJj
ZS9KYXZhU2NyaXB0Q29yZS9iMy9CM09wY29kZS5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL0ph
dmFTY3JpcHRDb3JlL2IzL0IzT3Bjb2RlLmNwcAkocmV2aXNpb24gMCkKKysrIFNvdXJjZS9KYXZh
U2NyaXB0Q29yZS9iMy9CM09wY29kZS5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSw0NyBA
QAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNSBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2
ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBm
b3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJv
dmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBS
ZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHly
aWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxv
d2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11
c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0
IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAg
IGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBk
aXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJ
TkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywg
SU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVT
IE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQ
T1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUgorICog
Q09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5U
QUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5D
TFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRF
IEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9S
IEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkK
KyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwg
T1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJ
TiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFE
VklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLiAKKyAqLworCisjaW5jbHVk
ZSAiY29uZmlnLmgiCisjaW5jbHVkZSAiQjNPcGNvZGUuaCIKKworI2luY2x1ZGUgPHd0Zi9Qcmlu
dFN0cmVhbS5oPgorCituYW1lc3BhY2UgV1RGIHsKKwordXNpbmcgbmFtZXNwYWNlIEpTQzo6QjM7
CisKK3ZvaWQgcHJpbnRJbnRlcm5hbChQcmludFN0cmVhbSYgb3V0LCBPcGNvZGUgb3Bjb2RlKQor
eworICAgIHN3aXRjaCAob3Bjb2RlKSB7CisgICAgY2FzZSBJZGVudGl0eToKKyAgICAgICAgb3V0
LnByaW50KCJJZGVudGl0eSIpOworICAgICAgICByZXR1cm47CisgICAgICAgIC8vIEZJWE1FCisg
ICAgfQorICAgIFJFTEVBU0VfQVNTRVJUX05PVF9SRUFDSEVEKCk7Cit9CisKK30gLy8gbmFtZXNw
YWNlIFdURgorCkluZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNPcGNvZGUuaAo9PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNPcGNvZGUuaAkocmV2aXNpb24g
MCkKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM09wY29kZS5oCSh3b3JraW5nIGNvcHkp
CkBAIC0wLDAgKzEsMjAzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE1IEFwcGxlIEluYy4g
QWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNv
dXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwg
YXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICog
YXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFp
biB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRp
b25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMg
aW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAg
bm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFp
bWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHBy
b3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBS
T1ZJREVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1Q
TElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJ
TVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBB
UlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBB
UFBMRSBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJ
TkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVO
VElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVN
RU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBP
UgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBB
TkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBT
VFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RI
RVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09G
VFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0Uu
IAorICovCisKKyNpZm5kZWYgQjNPcGNvZGVfaAorI2RlZmluZSBCM09wY29kZV9oCisKKyNpbmNs
dWRlIDx3dGYvU3RkTGliRXh0cmFzLmg+CisKK25hbWVzcGFjZSBKU0MgeyBuYW1lc3BhY2UgQjMg
eworCitlbnVtIE9wY29kZSA6IGludDE2X3QgeworICAgIC8vIEEgbm8tb3AgdGhhdCByZXR1cm5z
IFZvaWQsIHVzZWZ1bCBmb3Igd2hlbiB5b3Ugd2FudCB0byByZW1vdmUgYSB2YWx1ZS4KKyAgICBO
b3AsCisgICAgIAorICAgIC8vIFBvbHltb3JwaGljIGlkZW50aXR5LCB1c2FibGUgd2l0aCBhbnkg
dmFsdWUgdHlwZS4KKyAgICBJZGVudGl0eSwKKworICAgIC8vIENvbnN0YW50cy4gVXNlIHRoZSBD
b25zdFZhbHVlKiBjbGFzc2VzLiBDb25zdGFudHMgZXhpc3QgaW4gdGhlIGNvbnRyb2wgZmxvdywg
c28gdGhhdCB3ZSBjYW4KKyAgICAvLyByZWFzb24gYWJvdXQgd2hlcmUgd2Ugd291bGQgY29uc3Ry
dWN0IHRoZW0uIExhcmdlIGNvbnN0YW50cyBhcmUgZXhwZW5zaXZlIHRvIGNyZWF0ZS4KKyAgICBD
b25zdDMyLAorICAgIENvbnN0NjQsCisgICAgQ29uc3REb3VibGUsCisKKyAgICAvLyBUaGUgbWFn
aWNhbCBzdGFjayBzbG90LiBUaGlzIGlzIHZpZXdlZCBhcyBleGVjdXRpbmcgYXQgdGhlIHRvcCBv
ZiB0aGUgcHJvZ3JhbSByZWdhcmRsZXNzIG9mCisgICAgLy8gd2hlcmUgaW4gY29udHJvbCBmbG93
IHlvdSBwdXQgaXQuIEVhY2ggaW5zdGFuY2Ugb2YgYSBTdGFja1Nsb3QgVmFsdWUgZ2V0cyBhIGRp
c2pvaW50IHJhbmdlIG9mCisgICAgLy8gc3RhY2sgbWVtb3J5LiBVc2UgdGhlIFN0YWNrU2xvdFZh
bHVlIGNsYXNzLgorICAgIFN0YWNrU2xvdCwKKworICAgIC8vIFRoZSBtYWdpY2FsIGFyZ3VtZW50
IHJlZ2lzdGVyLiBUaGlzIGlzIHZpZXdlZCBhcyBleGVjdXRpbmcgYXQgdGhlIHRvcCBvZiB0aGUg
cHJvZ3JhbQorICAgIC8vIHJlZ2FyZGxlc3Mgb2Ygd2hlcmUgaW4gY29udHJvbCBmbG93IHlvdSBw
dXQgaXQsIGFuZCB0aGUgY29tcGlsZXIgdGFrZXMgY2FyZSB0byBlbnN1cmUgdGhhdCB3ZQorICAg
IC8vIGRvbid0IGNsb2JiZXIgdGhlIHZhbHVlIGJ5IHJlZ2lzdGVyIGFsbG9jYXRpb24gb3IgY2Fs
bHMgKGVpdGhlciBieSBzYXZpbmcgdGhlIGFyZ3VtZW50IHRvIHRoZQorICAgIC8vIHN0YWNrIG9y
IHByZXNlcnZpbmcgaXQgaW4gYSBjYWxsZWUtc2F2ZSByZWdpc3RlcikuIFVzZSB0aGUgQXJndW1l
bnRSZWdWYWx1ZSBjbGFzcy4gVGhlIHJldHVybgorICAgIC8vIHR5cGUgaXMgZWl0aGVyIHBvaW50
ZXIoKSAoZm9yIEdQUnMpIG9yIERvdWJsZSAoZm9yIEZQUnMpLgorICAgIEFyZ3VtZW50UmVnLAor
CisgICAgLy8gVGhlIGZyYW1lIHBvaW50ZXIuIFlvdSBjYW4gcHV0IHRoaXMgYW55d2hlcmUgaW4g
Y29udHJvbCBmbG93IGJ1dCBpdCB3aWxsIGFsd2F5cyB5aWVsZCB0aGUKKyAgICAvLyBmcmFtZSBw
b2ludGVyLCB3aXRoIGEgY2F2ZWF0OiBpZiBvdXIgY29tcGlsZXIgY2hhbmdlcyB0aGUgZnJhbWUg
cG9pbnRlciB0ZW1wb3JhcmlseSBmb3Igc29tZQorICAgIC8vIHNpbGx5IHJlYXNvbiwgdGhlIEZy
YW1lUG9pbnRlciBpbnRyaW5zaWMgd2lsbCByZXR1cm4gd2hlcmUgdGhlIGZyYW1lIHBvaW50ZXIg
KnNob3VsZCogYmUgbm90CisgICAgLy8gd2hlcmUgaXQgaGFwcGVucyB0byBiZSByaWdodCBub3cu
CisgICAgRnJhbWVQb2ludGVyLAorCisgICAgLy8gUG9seW1vcnBoaWMgbWF0aCwgdXNhYmxlIHdp
dGggYW55IHZhbHVlIHR5cGUuCisgICAgQWRkLAorICAgIFN1YiwKKyAgICBNdWwsCisgICAgRGl2
LAorCisgICAgLy8gSW50ZWdlciBtYXRoLgorICAgIENoaWxsRGl2LCAvLyBkb2Vzbid0IHRyYXAg
ZXZlciwgYmVoYXZlcyBsaWtlIEpTICh4L3kpfDAuCisgICAgTW9kLAorICAgIEJpdEFuZCwKKyAg
ICBCaXRPciwKKyAgICBCaXRYb3IsCisgICAgU2hsLAorICAgIFNTaHIsCisgICAgWlNociwKKwor
ICAgIC8vIENhc3RzIGFuZCBzdWNoLgorICAgIC8vIFRha2VzIGFuZCByZXR1cm5zIEludDMyOgor
ICAgIFNFeHQ4LAorICAgIFNFeHQxNiwKKyAgICAvLyBUYWtlcyBJbnQzMiBhbmQgcmV0dXJucyBJ
bnQ2NDoKKyAgICBTRXh0MzIsCisgICAgWkV4dDMyLAorICAgIC8vIFRha2VzIGFuZCByZXR1cm5z
IERvdWJsZToKKyAgICBGUm91bmQsCisgICAgLy8gVGFrZXMgaW50cyBhbmQgcmV0dXJucyBEb3Vi
bGU6CisgICAgSVRvRCwKKyAgICAvLyBUYWtlcyBEb3VibGUgYW5kIHJldHVybnMgSW50MzI6Cisg
ICAgRFRvSTMyLAorCisgICAgLy8gUG9seW1vcnBoaWMgY29tcGFyaXNvbnMsIHVzYWJsZSB3aXRo
IGFueSB2YWx1ZSB0eXBlLiBSZXR1cm5zIGludDMyIDAgb3IgMS4gTm90ZSB0aGF0ICJOb3QiCisg
ICAgLy8gaXMganVzdCBFcXVhbCh4LCAwKS4KKyAgICBFcXVhbCwKKyAgICBOb3RFcXVhbCwKKyAg
ICBMZXNzVGhhbiwKKyAgICBHcmVhdGVyVGhhbiwKKyAgICBMZXNzRXF1YWwsCisgICAgR3JlYXRl
ckVxdWFsLAorCisgICAgLy8gSW50ZWdlciBjb21wYXJpc29ucy4gUmV0dXJucyBpbnQzMiAwIG9y
IDEuCisgICAgQWJvdmUsCisgICAgQmVsb3csCisgICAgQWJvdmVFcXVhbAorICAgIEJlbG93RXF1
YWwsCisKKyAgICAvLyBNZW1vcnkgbG9hZHMuIE9wY29kZSBpbmRpY2F0ZXMgaG93IHdlIGxvYWQg
YW5kIHRoZSBsb2FkZWQgdHlwZS4gVGhlc2UgdXNlIE1lbW9yeVZhbHVlLgorICAgIC8vIFRoZXNl
IHJldHVybiBJbnQzMjoKKyAgICBMb2FkOFosCisgICAgTG9hZDhTLAorICAgIExvYWQxNlosCisg
ICAgTG9hZDE2UywKKyAgICAvLyBUaGlzIHJldHVybnMgRG91YmxlOgorICAgIExvYWRGbG9hdCwK
KyAgICAvLyBUaGlzIHJldHVybiB3aGF0ZXZlciB0aGUgcmV0dXJuIHR5cGUgaXM6CisgICAgTG9h
ZCwKKworICAgIC8vIE1lbW9yeSBzdG9yZXMuIE9wY29kZSBpbmRpY2F0ZXMgaG93IHRoZSB2YWx1
ZSBpcyBzdG9yZWQuIFRoZXNlIHVzZSBNZW1vcnlWYWx1ZS4KKyAgICAvLyBUaGVzZSB0YWtlIGFu
IEludDMyIHZhbHVlOgorICAgIFN0b3JlOCwKKyAgICBTdG9yZTE2LAorICAgIC8vIFRoaXMgdGFr
ZXMgYSBEb3VibGUgdmFsdWU6CisgICAgU3RvcmVGbG9hdCwKKyAgICAvLyBUaGlzIGlzIGEgcG9s
eW1vcnBoaWMgc3RvcmUgZm9yIEludDMyLCBJbnQ2NCwgYW5kIERvdWJsZToKKyAgICBTdG9yZSwK
KworICAgIC8vIFRoaXMgaXMgYSByZWd1bGFyIG9yZGluYXJ5IEMgZnVuY3Rpb24gY2FsbCwgdXNp
bmcgdGhlIHN5c3RlbSBDIGNhbGxpbmcgY29udmVudGlvbi4gTWFrZSBzdXJlCisgICAgLy8gdGhh
dCB0aGUgYXJndW1lbnRzIGFyZSBwYXNzZWQgdXNpbmcgdGhlIHJpZ2h0IHR5cGVzLgorICAgIEND
YWxsLAorCisgICAgLy8gVGhpcyBpcyBhIHBhdGNocG9pbnQuIFVzZSB0aGUgUGF0Y2hwb2ludFZh
bHVlIGNsYXNzLiBUaGlzIGlzIHZpZXdlZCBhcyBiZWhhdmluZyBsaWtlIGEgY2FsbCwKKyAgICAv
LyBidXQgb25seSBlbWl0cyBjb2RlIHZpYSBhIGNvZGUgZ2VuZXJhdGlvbiBjYWxsYmFjay4gVGhh
dCBjYWxsYmFjayBnZXRzIHRvIGVtaXQgY29kZSBpbmxpbmUuCisgICAgLy8gWW91IGNhbiBwYXNz
IGEgc3RhY2ttYXAgYWxvbmcgd2l0aCBjb25zdHJhaW50cyBvbiBob3cgZWFjaCBzdGFja21hcCBh
cmd1bWVudCBtdXN0IGJlIHBhc3NlZC4KKyAgICAvLyBJdCdzIGxlZ2FsIHRvIHJlcXVlc3QgdGhh
dCBhIHN0YWNrbWFwIGFyZ3VtZW50IGlzIGluIHNvbWUgcmVnaXN0ZXIgYW5kIGl0J3MgbGVnYWwg
dG8gcmVxdWVzdAorICAgIC8vIHRoYXQgYSBzdGFja21hcCBhcmd1bWVudCBpcyBhdCBzb21lIG9m
ZnNldCBmcm9tIHRoZSB0b3Agb2YgdGhlIGFyZ3VtZW50IHBhc3NpbmcgYXJlYSBvbiB0aGUKKyAg
ICAvLyBzdGFjay4KKyAgICBQYXRjaHBvaW50LAorCisgICAgLy8gQ2hlY2tlZCBtYXRoLiBVc2Ug
dGhlIENoZWNrVmFsdWUgY2xhc3MuIExpa2UgYSBQYXRjaHBvaW50LCB0aGlzIHRha2VzIGEgY29k
ZSBnZW5lcmF0aW9uCisgICAgLy8gY2FsbGJhY2suIFRoYXQgY2FsbGJhY2sgZ2V0cyB0byBlbWl0
IHNvbWUgY29kZSBhZnRlciB0aGUgZXBpbG9ndWUsIGFuZCBnZXRzIHRvIGxpbmsgdGhlIGp1bXAK
KyAgICAvLyBmcm9tIHRoZSBjaGVjaywgYW5kIHRoZSBjaG9pY2Ugb2YgcmVnaXN0ZXJzLiBZb3Ug
YWxzbyBnZXQgdG8gc3VwcGx5IGEgc3RhY2ttYXAuIE5vdGUgdGhhdCB5b3UKKyAgICAvLyBhcmUg
bm90IGFsbG93ZWQgdG8ganVtcCBiYWNrIGludG8gdGhlIG1haW5saW5lIGNvZGUgZnJvbSB5b3Vy
IHNsb3cgcGF0aCwgc2luY2UgdGhlIGNvbXBpbGVyCisgICAgLy8gd2lsbCBhc3N1bWUgdGhhdCB0
aGUgZXhlY3V0aW9uIG9mIHRoZXNlIGluc3RydWN0aW9ucyBwcm92ZXMgdGhhdCBvdmVyZmxvdyBk
aWRuJ3QgaGFwcGVuLiBGb3IKKyAgICAvLyBleGFtcGxlLCBpZiB5b3UgaGF2ZSB0d28gQ2hlY2tB
ZGQnczoKKyAgICAvLworICAgIC8vIGEgPSBDaGVja0FkZCh4LCB5KQorICAgIC8vIGIgPSBDaGVj
a0FkZCh4LCB5KQorICAgIC8vCisgICAgLy8gVGhlbiBpdCdzIHZhbGlkIHRvIGNoYW5nZSB0aGlz
IHRvOgorICAgIC8vCisgICAgLy8gYSA9IENoZWNrQWRkKHgsIHkpCisgICAgLy8gYiA9IElkZW50
aXR5KGEpCisgICAgLy8KKyAgICAvLyBUaGlzIGlzIHZhbGlkIHJlZ2FyZGxlc3Mgb2YgdGhlIGNh
bGxiYWNrcyB1c2VkIGJ5IHRoZSB0d28gQ2hlY2tBZGRzLiBUaGV5IG1heSBoYXZlIGRpZmZlcmVu
dAorICAgIC8vIGNhbGxiYWNrcy4gWWV0LCB0aGlzIHRyYW5zZm9ybWF0aW9uIGlzIHZhbGlkIGV2
ZW4gaWYgdGhleSBhcmUgZGlmZmVyZW50IGJlY2F1c2Ugd2Uga25vdyB0aGF0CisgICAgLy8gYWZ0
ZXIgdGhlIGZpcnN0IENoZWNrQWRkIGV4ZWN1dGVzLCB0aGUgc2Vjb25kIENoZWNrQWRkIGNvdWxk
IG5vdCBoYXZlIHBvc3NpYmx5IHRha2VuIHNsb3cKKyAgICAvLyBwYXRoLiBUaGVyZWZvcmUsIHRo
ZSBzZWNvbmQgQ2hlY2tBZGQncyBjYWxsYmFjayBpcyBpcnJlbGV2YW50LgorICAgIENoZWNrQWRk
LAorICAgIENoZWNrU3ViLAorICAgIENoZWNrTXVsLAorCisgICAgLy8gQ2hlY2sgdGhhdCBzaWRl
LWV4aXRzLiBVc2UgdGhlIENoZWNrVmFsdWUgY2xhc3MuIExpa2UgQ2hlY2tBZGQgYW5kIGZyaWVu
ZHMsIHRoaXMgaGFzIGEKKyAgICAvLyBzdGFja21hcCB3aXRoIGEgZ2VuZXJhdGlvbiBjYWxsYmFj
ay4gVGhpcyB0YWtlcyBhbiBJbnQzMiBhcmd1bWVudCB0aGF0IHRoaXMgYnJhbmNoZXMgb24sIHdp
dGgKKyAgICAvLyBmdWxsIGJyYW5jaCBmdXNpb24gaW4gdGhlIGluc3RydWN0aW9uIHNlbGVjdG9y
LiBBIHRydWUgdmFsdWUganVtcHMgdG8gdGhlIGdlbmVyYXRvcidzIHNsb3cKKyAgICAvLyBwYXRo
LgorICAgIENoZWNrLAorCisgICAgLy8gU1NBIHN1cHBvcnQsIGluIHRoZSBzdHlsZSBvZiBERkcg
U1NBLgorICAgIFVwc2lsb24sIC8vIFRoaXMgdXNlcyB0aGUgVXBzaWxvblZhbHVlIGNsYXNzLgor
ICAgIFBoaSwKKworICAgIC8vIEp1bXAuIFVzZXMgdGhlIENvbnRyb2xWYWx1ZSBjbGFzcy4KKyAg
ICBKdW1wLAorICAgIAorICAgIC8vIFBvbHltb3JwaGljIGJyYW5jaCwgdXNhYmxlIHdpdGggYW55
IHZhbHVlIHR5cGUuIEJyYW5jaGVzIGlmIG5vdCBlcXVhbCB0byB6ZXJvLiBVc2VzIHRoZQorICAg
IC8vIENvbnRyb2xWYWx1ZSBjbGFzcywgd2l0aCB0aGUgMC1pbmRleCBzdWNjZXNzb3IgYmVpbmcg
dGhlIHRydWUgc3VjY2Vzc29yLgorICAgIEJyYW5jaCwKKworICAgIC8vIFN3aXRjaC4gU3dpdGNo
ZXMgb3ZlciBlaXRoZXIgSW50MzIgb3IgSW50NjQuIFVzZXMgdGhlIFN3aXRjaFZhbHVlIGNsYXNz
LgorICAgIFN3aXRjaCwKKworICAgIC8vIFJldHVybi4gTm90ZSB0aGF0IEIzIHByb2NlZHVyZXMg
ZG9uJ3Qga25vdyB0aGVpciByZXR1cm4gdHlwZSwgc28gdGhpcyBjYW4ganVzdCByZXR1cm4gYW55
CisgICAgLy8gdHlwZS4gVXNlcyB0aGUgQ29udHJvbFZhbHVlIGNsYXNzLgorICAgIFJldHVybiwK
KworICAgIC8vIFRoaXMgaXMgYSB0ZXJtaW5hbCB0aGF0IGluZGljYXRlcyB0aGF0IHdlIHdpbGwg
bmV2ZXIgZ2V0IGhlcmUuIFVzZXMgdGhlIENvbnRyb2xWYWx1ZSBjbGFzcy4KKyAgICBPb3BzCit9
OworCit9IH0gLy8gbmFtZXNwYWNlIEpTQzo6QjMKKworbmFtZXNwYWNlIFdURiB7CisKK2NsYXNz
IFByaW50U3RyZWFtOworCit2b2lkIHByaW50SW50ZXJuYWwoUHJpbnRTdHJlYW0mLCBKU0M6OkIz
OjpPcGNvZGUpOworCit9IC8vIG5hbWVzcGFjZSBXVEYKKworI2VuZGlmIC8vIEIzT3Bjb2RlX2gK
KwpJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzT3JpZ2luLmNwcAo9PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNPcmlnaW4uY3BwCShyZXZpc2lvbiAwKQor
KysgU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzT3JpZ2luLmNwcAkod29ya2luZyBjb3B5KQpA
QCAtMCwwICsxLDM3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE1IEFwcGxlIEluYy4gQWxs
IHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJj
ZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJl
IHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJl
IG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0
aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25z
IGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4g
YmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90
aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVy
IGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3Zp
ZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJ
REVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElF
RCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBM
SUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJ
Q1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBM
RSBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJ
UkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElB
TCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5U
IE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgor
ICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQg
T04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJ
Q1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJX
SVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdB
UkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAor
ICovCisKKyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJCM09yaWdpbi5oIgorCituYW1l
c3BhY2UgSlNDIHsgbmFtZXNwYWNlIEIzIHsKKwordm9pZCBPcmlnaW46OmR1bXAoUHJpbnRTdHJl
YW0mIG91dCkgY29uc3QKK3sKKyAgICBvdXQucHJpbnQoIk9yaWdpbigiLCBSYXdQb2ludGVyKG1f
ZGF0YSksICIpIik7Cit9CisKK30gfSAvLyBuYW1lc3BhY2UgSlNDOjpCMworCkluZGV4OiBTb3Vy
Y2UvSmF2YVNjcmlwdENvcmUvYjMvQjNPcmlnaW4uaAo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2
YVNjcmlwdENvcmUvYjMvQjNPcmlnaW4uaAkocmV2aXNpb24gMCkKKysrIFNvdXJjZS9KYXZhU2Ny
aXB0Q29yZS9iMy9CM09yaWdpbi5oCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsNTUgQEAKKy8q
CisgKiBDb3B5cmlnaHQgKEMpIDIwMTUgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgor
ICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMs
IHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVk
IHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0
cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQK
KyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcg
ZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJl
cHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBj
b25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1
bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJp
YnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBg
YEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xV
RElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBN
RVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBB
UkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IKKyAqIENPTlRS
SUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBT
UEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElO
RywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09E
UyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJ
TkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBP
RiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRP
UlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5Z
IFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VE
IE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKworI2lmbmRlZiBCM09y
aWdpbl9oCisjZGVmaW5lIEIzT3JpZ2luX2gKKworI2luY2x1ZGUgPHd0Zi9QcmludFN0cmVhbS5o
PgorCituYW1lc3BhY2UgSlNDIHsgbmFtZXNwYWNlIEIzIHsKKworLy8gV2hvZXZlciBnZW5lcmF0
ZXMgQjNJUiBjYW4gY2hvb3NlIHRvIHB1dCBvcmlnaW5zIG9uIHZhbHVlcy4gV2hlbiB5b3UgZG8g
dGhpcywgQjMgd2lsbCBiZSBhYmxlIHRvCisvLyBhY2NvdW50LCBkb3duIHRvIHRoZSBtYWNoaW5l
IGNvZGUsIHdoaWNoIGluc3RydWN0aW9uIGNvcnJlc3BvbmRzIHRvIHdoaWNoIG9yaWdpbi4gQjMK
Ky8vIHRyYW5zZm9ybWF0aW9ucyBtdXN0IHByZXNlcnZlIE9yaWdpbnMgY2FyZWZ1bGx5LiBJdCdz
IGFuIGVycm9yIHRvIHdyaXRlIGEgdHJhbnNmb3JtYXRpb24gdGhhdAorLy8gZWl0aGVyIGRyb3Bz
IE9yaWdpbnMgb3IgbGllcyBhYm91dCB0aGVtLgorY2xhc3MgT3JpZ2luIHsKK3B1YmxpYzoKKyAg
ICBleHBsaWNpdCBPcmlnaW4oY29uc3Qgdm9pZCogZGF0YSA9IG51bGxwdHIpCisgICAgICAgIDog
bV9kYXRhKGRhdGEpCisgICAgeworICAgIH0KKworICAgIGNvbnN0IHZvaWQqIGRhdGEoKSBjb25z
dCB7IHJldHVybiBtX2RhdGE7IH0KKworICAgIHZvaWQgZHVtcChQcmludFN0cmVhbSYpIGNvbnN0
OworICAgIAorcHJpdmF0ZToKKyAgICBjb25zdCB2b2lkKiBtX2RhdGE7Cit9OworCit9IH0gLy8g
bmFtZXNwYWNlIEpTQzo6QjMKKworI2VuZGlmIC8vIEIzT3JpZ2luX2gKKwpJbmRleDogU291cmNl
L0phdmFTY3JpcHRDb3JlL2IzL0IzUGF0Y2hwb2ludFZhbHVlLmNwcAo9PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBT
b3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNQYXRjaHBvaW50VmFsdWUuY3BwCShyZXZpc2lvbiAw
KQorKysgU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzUGF0Y2hwb2ludFZhbHVlLmNwcAkod29y
a2luZyBjb3B5KQpAQCAtMCwwICsxLDQ2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE1IEFw
cGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQg
dXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlm
aWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0
aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBt
dXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBv
ZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3Ry
aWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdo
dAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2lu
ZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0
ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRX
QVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJF
U1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywg
VEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNT
IEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVO
VCBTSEFMTCBBUFBMRSBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkg
RElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1Ig
Q09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAq
IFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNF
LCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVS
IENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENP
TlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VO
Q0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9G
IFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VD
SCBEQU1BR0UuIAorICovCisKKyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJCM1BhdGNo
cG9pbnRWYWx1ZS5oIgorCisjaW5jbHVkZSA8d3RmL0NvbW1hUHJpbnRlci5oPgorCituYW1lc3Bh
Y2UgSlNDIHsgbmFtZXNwYWNlIEIzIHsKKworUGF0Y2hwb2ludFZhbHVlOjp+UGF0Y2hwb2ludFZh
bHVlKCkKK3sKK30KKwordm9pZCBQYXRjaHBvaW50VmFsdWU6OmR1bXBNZXRhKFByaW50U3RyZWFt
JiBvdXQpIGNvbnN0Cit7CisgICAgQ29tbWFQcmludGVyIGNvbW1hOworICAgIG91dC5wcmludChj
b21tYSwgInN0YWNrbWFwID0gIiwgc3RhY2ttYXApOworICAgIGlmIChzaGFkb3cpCisgICAgICAg
IG91dC5wcmludChjb21tYSwgInNoYWRvdyA9ICIsIHNoYWRvdyk7Cit9CisKK30gfSAvLyBuYW1l
c3BhY2UgSlNDOjpCMworCkluZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNQYXRjaHBv
aW50VmFsdWUuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNQYXRj
aHBvaW50VmFsdWUuaAkocmV2aXNpb24gMCkKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9C
M1BhdGNocG9pbnRWYWx1ZS5oCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsNTggQEAKKy8qCisg
KiBDb3B5cmlnaHQgKEMpIDIwMTUgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoK
KyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdp
dGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRo
YXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmli
dXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAq
ICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlz
Y2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJv
ZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25k
aXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVu
dGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0
aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFT
IElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElO
RywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJD
SEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUg
RElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IKKyAqIENPTlRSSUJV
VE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVD
SUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywg
QlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBP
UiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVT
UyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBM
SUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQK
KyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdB
WSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9G
IFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKworI2lmbmRlZiBCM1BhdGNo
cG9pbnRWYWx1ZV9oCisjZGVmaW5lIEIzUGF0Y2hwb2ludFZhbHVlX2gKKworI2luY2x1ZGUgIkIz
VmFsdWUuaCIKKyNpbmNsdWRlICJCM1N0YWNrbWFwLmgiCisKK25hbWVzcGFjZSBKU0MgeyBuYW1l
c3BhY2UgQjMgeworCitjbGFzcyBQYXRjaHBvaW50VmFsdWUgOiBwdWJsaWMgVmFsdWUgeworcHVi
bGljOgorICAgIHN0YXRpYyBib29sIGFjY2VwdHMoT3Bjb2RlIG9wY29kZSkgeyByZXR1cm4gb3Bj
b2RlID09IFBhdGNocG9pbnQ7IH0KKworICAgIH5QYXRjaHBvaW50VmFsdWUoKTsKKworICAgIFN0
YWNrbWFwIHN0YWNrbWFwOworICAgIHVuc2lnbmVkIHNoYWRvdyB7IDAgfTsKKworcHJvdGVjdGVk
OgorICAgIHZvaWQgZHVtcE1ldGEoUHJpbnRTdHJlYW0mKSBjb25zdCBvdmVycmlkZTsKKworcHJp
dmF0ZToKKyAgICBmcmllbmQgY2xhc3MgUHJvY2VkdXJlOworCisgICAgUGF0Y2hwb2ludFZhbHVl
KHVuc2lnbmVkIGluZGV4LCBUeXBlIHR5cGUsIE9yaWdpbiBvcmlnaW4sIGNvbnN0IEFkamFjZW5j
eUxpc3QmIGNoaWxkcmVuKQorICAgICAgICA6IFZhbHVlKGluZGV4LCBQYXRjaHBvaW50LCB0eXBl
LCBvcmlnaW4sIGNoaWxkcmVuKQorICAgIHsKKyAgICB9Cit9OworCit9IH0gLy8gbmFtZXNwYWNl
IEpTQzo6QjMKKworI2VuZGlmIC8vIEIzUGF0Y2hwb2ludFZhbHVlX2gKKwpJbmRleDogU291cmNl
L0phdmFTY3JpcHRDb3JlL2IzL0IzUHJvY2VkdXJlLmNwcAo9PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2Uv
SmF2YVNjcmlwdENvcmUvYjMvQjNQcm9jZWR1cmUuY3BwCShyZXZpc2lvbiAwKQorKysgU291cmNl
L0phdmFTY3JpcHRDb3JlL2IzL0IzUHJvY2VkdXJlLmNwcAkod29ya2luZyBjb3B5KQpAQCAtMCww
ICsxLDU2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE1IEFwcGxlIEluYy4gQWxsIHJpZ2h0
cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQg
YmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1p
dHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoK
KyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJv
dmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0
aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5
IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0
aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRo
ZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdp
dGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZ
IEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJS
QU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdB
UlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIK
KyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMu
IE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwg
SU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1B
R0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNV
QlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJP
RklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5Z
IFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElB
QklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBB
UklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVW
RU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisK
KyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJCM1Byb2NlZHVyZS5oIgorCisjaW5jbHVk
ZSAiQjNCYXNpY0Jsb2NrLmgiCisjaW5jbHVkZSAiQjNWYWx1ZS5oIgorCituYW1lc3BhY2UgSlND
IHsgbmFtZXNwYWNlIEIzIHsKKworUHJvY2VkdXJlOjpQcm9jZWR1cmUoKQoreworfQorCitQcm9j
ZWR1cmU6On5Qcm9jZWR1cmUoKQoreworfQorCitCYXNpY0Jsb2NrKiBQcm9jZWR1cmU6OmFkZEJs
b2NrKCkKK3sKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8QmFzaWNCbG9jaz4gYmxvY2sgPSBzdGQ6Om1h
a2VfdW5pcXVlPEJhc2ljQmxvY2s+KG1fYmxvY2tzLnNpemUoKSk7CisgICAgQmFzaWNCbG9jayog
cmVzdWx0ID0gYmxvY2suZ2V0KCk7CisgICAgbV9ibG9ja3MuYXBwZW5kKFdURjo6bW92ZShibG9j
aykpOworICAgIHJldHVybiByZXN1bHQ7Cit9CisKK3ZvaWQgUHJvY2VkdXJlOjpkdW1wKFByaW50
U3RyZWFtJiBvdXQpIGNvbnN0Cit7CisgICAgZm9yIChCYXNpY0Jsb2NrKiBibG9jayA6ICp0aGlz
KQorICAgICAgICBvdXQucHJpbnQoZGVlcER1bXAoYmxvY2spKTsKK30KKworfSB9IC8vIG5hbWVz
cGFjZSBKU0M6OkIzCkluZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNQcm9jZWR1cmUu
aAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNQcm9jZWR1cmUuaAko
cmV2aXNpb24gMCkKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM1Byb2NlZHVyZS5oCSh3
b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsMTc3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE1
IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBh
bmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1v
ZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29u
ZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29k
ZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlz
dCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRp
c3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHly
aWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxv
d2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIg
bWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNP
RlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVY
UFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBU
TywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRO
RVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBF
VkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBB
TlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwg
T1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywK
KyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0Yg
VVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dF
VkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElO
IENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJ
R0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAq
IE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0Yg
U1VDSCBEQU1BR0UuIAorICovCisKKyNpZm5kZWYgQjNQcm9jZWR1cmVfaAorI2RlZmluZSBCM1By
b2NlZHVyZV9oCisKKyNpbmNsdWRlIDx3dGYvQmFnLmg+CisjaW5jbHVkZSA8d3RmL0Zhc3RNYWxs
b2MuaD4KKyNpbmNsdWRlIDx3dGYvTm9uY29weWFibGUuaD4KKyNpbmNsdWRlIDx3dGYvVmVjdG9y
Lmg+CisKK25hbWVzcGFjZSBKU0MgeyBuYW1lc3BhY2UgQjMgeworCitjbGFzcyBCYXNpY0Jsb2Nr
OworY2xhc3MgVmFsdWU7CisKK2NsYXNzIFByb2NlZHVyZSB7CisgICAgV1RGX01BS0VfTk9OQ09Q
WUFCTEUoUHJvY2VkdXJlKTsKKyAgICBXVEZfTUFLRV9GQVNUX0FMTE9DQVRFRDsKK3B1YmxpYzoK
KworICAgIFByb2NlZHVyZSgpOworICAgIH5Qcm9jZWR1cmUoKTsKKworICAgIEJhc2ljQmxvY2sq
IGFkZEJsb2NrKCk7CisgICAgCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVmFsdWVUeXBlLCB0eXBl
bmFtZS4uLiBBcmd1bWVudHM+CisgICAgVmFsdWVUeXBlKiBhZGQoQXJndW1lbnRzLi4uKTsKKwor
ICAgIHZvaWQgZHVtcChQcmludFN0cmVhbSYpIGNvbnN0OworCisgICAgdW5zaWduZWQgc2l6ZSgp
IGNvbnN0IHsgcmV0dXJuIG1fYmxvY2tzLnNpemUoKTsgfQorICAgIEJhc2ljQmxvY2sqIGF0KHVu
c2lnbmVkIGluZGV4KSBjb25zdCB7IHJldHVybiBtX2Jsb2Nrc1tpbmRleF07IH0KKyAgICBCYXNp
Y0Jsb2NrKiBvcGVyYXRvcltdKHVuc2lnbmVkIGluZGV4KSBjb25zdCB7IHJldHVybiBhdChpbmRl
eCk7IH0KKworICAgIGNsYXNzIGl0ZXJhdG9yIHsKKyAgICBwdWJsaWM6CisgICAgICAgIGl0ZXJh
dG9yKCk6CisgICAgICAgICAgICA6IG1fcHJvY2VkdXJlKG51bGxwdHIpCisgICAgICAgICAgICAs
IG1faW5kZXgoMCkKKyAgICAgICAgeworICAgICAgICB9CisKKyAgICAgICAgaXRlcmF0b3IoUHJv
Y2VkdXJlJiBwcm9jZWR1cmUsIHVuc2lnbmVkIGluZGV4KQorICAgICAgICAgICAgOiBtX3Byb2Nl
ZHVyZSgmcHJvY2VkdXJlKQorICAgICAgICAgICAgLCBtX2luZGV4KGluZGV4KQorICAgICAgICB7
CisgICAgICAgIH0KKworICAgICAgICBCYXNpY0Jsb2NrKiBvcGVyYXRvciooKQorICAgICAgICB7
CisgICAgICAgICAgICByZXR1cm4gbV9wcm9jZWR1cmUtPmF0KG1faW5kZXgpOworICAgICAgICB9
CisKKyAgICAgICAgaXRlcmF0b3ImIG9wZXJhdG9yKysoKQorICAgICAgICB7CisgICAgICAgICAg
ICBtX2luZGV4ID0gZmluZE5leHQobV9pbmRleCArIDEpOworICAgICAgICAgICAgcmV0dXJuICp0
aGlzOworICAgICAgICB9CisKKyAgICAgICAgYm9vbCBvcGVyYXRvcj09KGNvbnN0IGl0ZXJhdG9y
JiBvdGhlcikgY29uc3QKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIG1faW5kZXggPT0g
b3RoZXIubV9pbmRleDsKKyAgICAgICAgfQorCisgICAgICAgIGJvb2wgb3BlcmF0b3IhPShjb25z
dCBpdGVyYXRvciYgb3RoZXIpIGNvbnN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiAh
KCp0aGlzID09IG90aGVyKTsKKyAgICAgICAgfQorCisgICAgcHJpdmF0ZToKKyAgICAgICAgdW5z
aWduZWQgZmluZE5leHQodW5zaWduZWQgaW5kZXgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHdo
aWxlIChpbmRleCA8IG1fcHJvY2VkdXJlLT5zaXplKCkgJiYgIW1fcHJvY2VkdXJlLT5hdChpbmRl
eCkpCisgICAgICAgICAgICAgICAgaW5kZXgrKzsKKyAgICAgICAgICAgIHJldHVybiBpbmV4Owor
ICAgICAgICB9CisKKyAgICAgICAgUHJvY2VkdXJlKiBtX3Byb2NlZHVyZTsKKyAgICAgICAgdW5z
aWduZWQgbV9pbmRleDsKKyAgICB9OworCisgICAgaXRlcmF0b3IgYmVnaW4oKSBjb25zdCB7IHJl
dHVybiBpdGVyYXRvcigqdGhpcywgMCk7IH0KKyAgICBpdGVyYXRvciBlbmQoKSBjb25zdCB7IHJl
dHVybiBpdGVyYXRvcigqdGhpcywgbnVtQmxvY2tzKCkpOyB9CisKKyAgICBjbGFzcyBWYWx1ZXND
b2xsZWN0aW9uIHsKKyAgICBwdWJsaWM6CisgICAgICAgIFZhbHVlc0NvbGxlY3Rpb24oUHJvY2Vk
dXJlJiBwcm9jZWR1cmUpCisgICAgICAgICAgICA6IG1fcHJvY2VkdXJlKHByb2NlZHVyZSkKKyAg
ICAgICAgeworICAgICAgICB9CisKKyAgICAgICAgY2xhc3MgaXRlcmF0b3IgeworICAgICAgICBw
dWJsaWM6CisgICAgICAgICAgICBpdGVyYXRvcigpOgorICAgICAgICAgICAgICAgIDogbV9wcm9j
ZWR1cmUobnVsbHB0cikKKyAgICAgICAgICAgICAgICAsIG1faW5kZXgoMCkKKyAgICAgICAgICAg
IHsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaXRlcmF0b3IoUHJvY2VkdXJlJiBwcm9j
ZWR1cmUsIHVuc2lnbmVkIGluZGV4KQorICAgICAgICAgICAgICAgIDogbV9wcm9jZWR1cmUoJnBy
b2NlZHVyZSkKKyAgICAgICAgICAgICAgICAsIG1faW5kZXgoaW5kZXgpCisgICAgICAgICAgICB7
CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIFZhbHVlKiBvcGVyYXRvciooKQorICAgICAg
ICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBtX3Byb2NlZHVyZS0+YmxvY2sobV9pbmRl
eCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGl0ZXJhdG9yJiBvcGVyYXRvcisrKCkK
KyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtX2luZGV4Kys7CisgICAgICAgICAgICAg
ICAgcmV0dXJuICp0aGlzOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBib29sIG9wZXJh
dG9yPT0oY29uc3QgaXRlcmF0b3ImIG90aGVyKSBjb25zdAorICAgICAgICAgICAgeworICAgICAg
ICAgICAgICAgIHJldHVybiBtX2luZGV4ID09IG90aGVyLm1faW5kZXg7CisgICAgICAgICAgICB9
CisKKyAgICAgICAgICAgIGJvb2wgb3BlcmF0b3IhPShjb25zdCBpdGVyYXRvciYgb3RoZXIpIGNv
bnN0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuICEoKnRoaXMgPT0gb3Ro
ZXIpOworICAgICAgICAgICAgfQorCisgICAgICAgIHByaXZhdGU6CisKKyAgICAgICAgICAgIFBy
b2NlZHVyZSogbV9wcm9jZWR1cmU7CisgICAgICAgICAgICB1bnNpZ25lZCBtX2luZGV4OworICAg
ICAgICB9OworCisgICAgICAgIGl0ZXJhdG9yIGJlZ2luKCkgY29uc3QgeyByZXR1cm4gaXRlcmF0
b3IobV9wcm9jZWR1cmUsIDApOyB9CisgICAgICAgIGl0ZXJhdG9yIGVuZCgpIGNvbnN0IHsgcmV0
dXJuIGl0ZXJhdG9yKG1fcHJvY2VkdXJlLCBtX3Byb2NlZHVyZS5tX3ZhbHVlcy5zaXplKCkpOyB9
CisKKyAgICAgICAgdW5zaWduZWQgc2l6ZSgpIGNvbnN0IHsgcmV0dXJuIG1fcHJvY2VkdXJlLm1f
dmFsdWVzLnNpemUoKTsgfQorICAgICAgICBWYWx1ZSogYXQodW5zaWduZWQgaW5kZXgpIGNvbnN0
IHsgcmV0dXJuIG1fcHJvY2VkdXJlLm1fdmFsdWVzW2luZGV4XTsgfQorICAgICAgICBWYWx1ZSog
b3BlcmF0b3JbXSh1bnNpZ25lZCBpbmRleCkgY29uc3QgeyByZXR1cm4gYXQoaW5kZXgpOyB9Cisg
ICAgICAgIAorICAgIHByaXZhdGU6CisgICAgICAgIFByb2NlZHVyZSYgbV9wcm9jZWR1cmU7Cisg
ICAgfTsKKworICAgIFZhbHVlc0NvbGxlY3Rpb24gdmFsdWVzKCkgeyByZXR1cm4gVmFsdWVzQ29s
bGVjdGlvbigqdGhpcyk7IH0KKworcHJpdmF0ZToKKyAgICBWZWN0b3I8c3RkOjp1bmlxdWVfcHRy
PEJhc2ljQmxvY2s+PiBtX2Jsb2NrczsKKyAgICBWZWN0b3I8c3RkOjp1bmlxdWVfcHRyPFZhbHVl
Pj4gbV92YWx1ZXM7Cit9OworCit9IH0gLy8gbmFtZXNwYWNlIEpTQzo6QjMKKworI2VuZGlmIC8v
IEIzUHJvY2VkdXJlX2gKKwpJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzUHJvY2Vk
dXJlSW5saW5lcy5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM1By
b2NlZHVyZUlubGluZXMuaAkocmV2aXNpb24gMCkKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9i
My9CM1Byb2NlZHVyZUlubGluZXMuaAkod29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDQ2IEBACisv
KgorICogQ29weXJpZ2h0IChDKSAyMDE1IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4K
KyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1z
LCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRl
ZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlz
dHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0
CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5n
IGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCBy
ZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2Yg
Y29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9j
dW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3Ry
aWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4g
YGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNM
VURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0Yg
TUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0Ug
QVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SCisgKiBDT05U
UklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwg
U1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJ
TkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09P
RFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVT
SU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICog
T0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBU
T1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFO
WSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNF
RCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisKKyNpZm5kZWYgQjNQ
cm9jZWR1cmVJbmxpbmVzX2gKKyNkZWZpbmUgQjNQcm9jZWR1cmVJbmxpbmVzX2gKKworI2luY2x1
ZGUgIkIzQmFzaWNCbG9jay5oIgorI2luY2x1ZGUgIkIzUHJvY2VkdXJlLmgiCisKK25hbWVzcGFj
ZSBKU0MgeyBuYW1lc3BhY2UgQjMgeworCit0ZW1wbGF0ZTx0eXBlbmFtZSBWYWx1ZVR5cGUsIHR5
cGVuYW1lLi4uIEFyZ3VtZW50cz4KK1ZhbHVlVHlwZSogUHJvY2VkdXJlOjphZGQoQXJndWVudHMu
Li4gYXJndW1lbnRzKQoreworICAgIHN0ZDo6dW5pcXVlX3B0cjxWYWx1ZVR5cGU+IHZhbHVlKG5l
dyBWYWx1ZVR5cGUobV92YWx1ZXMuc2l6ZSgpLCBhcmd1bWVudHMuLi4pKTsKKyAgICBWYWx1ZVR5
cGUqIHJlc3VsdCA9IHZhbHVlLmdldCgpOworICAgIG1fdmFsdWVzLmFwcGVuZChXVEY6Om1vdmUo
dmFsdWUpKTsKKyAgICByZXR1cm4gcmVzdWx0OworfQorCit9IH0gLy8gbmFtZXNwYWNlIEpTQzo6
QjMKKworI2VuZGlmIC8vIEIzUHJvY2VkdXJlSW5saW5lc19oCisKSW5kZXg6IFNvdXJjZS9KYXZh
U2NyaXB0Q29yZS9iMy9CM1N0YWNrU2xvdFZhbHVlLmNwcAo9PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2Uv
SmF2YVNjcmlwdENvcmUvYjMvQjNTdGFja1Nsb3RWYWx1ZS5jcHAJKHJldmlzaW9uIDApCisrKyBT
b3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNTdGFja1Nsb3RWYWx1ZS5jcHAJKHdvcmtpbmcgY29w
eSkKQEAgLTAsMCArMSw0MSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNSBBcHBsZSBJbmMu
IEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBz
b3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24s
IGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAq
IGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRh
aW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0
aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25z
IGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAg
IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xh
aW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBw
cm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQ
Uk9WSURFRCBCWSBBUFBMRSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElN
UExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICog
SU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQ
QVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwg
QVBQTEUgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwg
SU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVF
TlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJF
TUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwg
T1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQg
QU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwg
U1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9U
SEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNP
RlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdF
LiAKKyAqLworCisjaW5jbHVkZSAiY29uZmlnLmgiCisjaW5jbHVkZSAiQjNTdGFja1Nsb3RWYWx1
ZS5oIgorCituYW1lc3BhY2UgSlNDIHsgbmFtZXNwYWNlIEIzIHsKKworU3RhY2tTbG90VmFsdWU6
On5TdGFja1Nsb3RWYWx1ZSgpCit7Cit9CisKK3ZvaWQgU3RhY2tTbG90VmFsdWU6OmR1bXBNZXRh
KFByaW50U3RyZWFtJiBvdXQpIGNvbnN0Cit7CisgICAgb3V0LnByaW50KCJieXRlU2l6ZSA9ICIs
IG1fYnl0ZVNpemUpOworfQorCit9IH0gLy8gbmFtZXNwYWNlIEpTQzo6QjMKKwpJbmRleDogU291
cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzU3RhY2tTbG90VmFsdWUuaAo9PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBT
b3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNTdGFja1Nsb3RWYWx1ZS5oCShyZXZpc2lvbiAwKQor
KysgU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzU3RhY2tTbG90VmFsdWUuaAkod29ya2luZyBj
b3B5KQpAQCAtMCwwICsxLDY1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE1IEFwcGxlIElu
Yy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGlu
IHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlv
biwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwor
ICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJl
dGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25k
aXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlv
bnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICog
ICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNj
bGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxz
IHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElT
IFBST1ZJREVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1Ig
SU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisg
KiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBB
IFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFM
TCBBUFBMRSBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNU
LCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VR
VUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NV
UkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRB
LCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNF
RCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNU
LCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1Ig
T1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMg
U09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1B
R0UuIAorICovCisKKyNpZm5kZWYgQjNTdGFja1Nsb3RWYWx1ZV9oCisjZGVmaW5lIEIzU3RhY2tT
bG90VmFsdWVfaAorCisjaW5jbHVkZSAiQjNWYWx1ZS5oIgorCituYW1lc3BhY2UgSlNDIHsgbmFt
ZXNwYWNlIEIzIHsKKworY2xhc3MgU3RhY2tTbG90VmFsdWUgOiBwdWJsaWMgVmFsdWUgeworcHVi
bGljOgorICAgIHN0YXRpYyBib29sIGFjY2VwdHMoT3Bjb2RlIG9wY29kZSkgeyByZXR1cm4gb3Bj
b2RlID09IFN0YWNrU2xvdDsgfQorCisgICAgflN0YWNrU2xvdFZhbHVlKCk7CisKKyAgICB1bnNp
Z25lZCBieXRlU2l6ZSgpIGNvbnN0IHsgcmV0dXJuIG1fYnl0ZVNpemU7IH0KKworICAgIC8vIFRo
aXMgZ2V0cyBhc3NpZ25lZCBhdCB0aGUgZW5kIG9mIGNvbXBpbGF0aW9uLiBZb3UgY2Fubm90IHJl
bHkgb24gaXQgaGF2aW5nIGEgbWVhbmluZ2Z1bAorICAgIC8vIHZhbHVlIHdoaWxlIHRoZSBjb21w
aWxlciBpcyBydW5uaW5nLgorICAgIGludHB0cl90IG9mZnNldEZyb21GUCgpIGNvbnN0IHsgcmV0
dXJuIG1fb2Zmc2V0RnJvbUZQOyB9CisKK3Byb3RlY3RlZDoKKyAgICB2b2lkIGR1bXBNZXRhKFBy
aW50U3RyZWFtJikgY29uc3Qgb3ZlcnJpZGU7CisKK3ByaXZhdGU6CisgICAgZnJpZW5kIGNsYXNz
IFByb2NlZHVyZTsKKworICAgIFN0YWNrU2xvdFZhbHVlKHVuc2lnbmVkIGluZGV4LCBPcmlnaW4g
b3JpZ2luLCB1bnNpZ25lZCBieXRlU2l6ZSkKKyAgICAgICAgOiBWYWx1ZShpbmRleCwgU3RhY2tT
bG90LCBwb2ludGVyKCksIG9yaWdpbikKKyAgICAgICAgLCBtX2J5dGVTaXplKGJ5dGVTaXplKQor
ICAgICAgICAsIG1fb2Zmc2V0RnJvbUZQKDApCisgICAgeworICAgIH0KKworICAgIHVuc2lnbmVk
IG1fYnl0ZVNpemU7CisgICAgaW50cHRyX3QgbV9vZmZzZXRGcm9tRlA7Cit9OworCit9IH0gLy8g
bmFtZXNwYWNlIEpTQzo6QjMKKworI2VuZGlmIC8vIEIzU3RhY2tTbG90VmFsdWVfaAorCkluZGV4
OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNTdGFja21hcC5jcHAKPT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0g
U291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzU3RhY2ttYXAuY3BwCShyZXZpc2lvbiAwKQorKysg
U291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzU3RhY2ttYXAuY3BwCSh3b3JraW5nIGNvcHkpCkBA
IC0wLDAgKzEsNDAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTUgQXBwbGUgSW5jLiBBbGwg
cmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNl
IGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUg
cGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUg
bWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRo
ZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMg
YW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBi
aW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3Rp
Y2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIg
aW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlk
ZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklE
RUQgQlkgQVBQTEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVE
IFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJ
RUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElD
VUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExF
IElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElS
RUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFM
IERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQg
T0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisg
KiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBP
TiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklD
VCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJ
U0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FS
RSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisg
Ki8KKworI2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgIkIzU3RhY2ttYXAuaCIKKworbmFt
ZXNwYWNlIEpTQyB7IG5hbWVzcGFjZSBCMyB7CisKK3ZvaWQgU3RhY2ttYXA6OmR1bXAoUHJpbnRT
dHJlYW0mIG91dCkgY29uc3QKK3sKKyAgICBvdXQucHJpbnQoCisgICAgICAgICJ7b3BhcXVlID0g
IiwgUmF3UG9pbnRlcihtX29wYXF1ZSksICIsIHJlcHMgPSAiLCBsaXN0RHVtcChtX3JlcHMpLAor
ICAgICAgICAiLCBnZW5lcmF0b3IgPSAiLCBSYXdQb2ludGVyKG1fZ2VuZXJhdG9yLmdldCgpKSwg
IiwgY2xvYmJlcmVkID0gIiwgbV9jbG9iYmVyZWQsCisgICAgICAgICIsIHVzZWRSZWdpc3RlcnMg
PSAiLCBtX3VzZWRSZWdpc3RlcnMsICJ9Iik7Cit9CisKK30gfSAvLyBuYW1lc3BhY2UgSlNDOjpC
MworCkluZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNTdGFja21hcC5oCj09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM1N0YWNrbWFwLmgJKHJldmlzaW9uIDAp
CisrKyBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNTdGFja21hcC5oCSh3b3JraW5nIGNvcHkp
CkBAIC0wLDAgKzEsMTIyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE1IEFwcGxlIEluYy4g
QWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNv
dXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwg
YXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICog
YXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFp
biB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRp
b25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMg
aW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAg
bm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFp
bWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHBy
b3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBS
T1ZJREVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1Q
TElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJ
TVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBB
UlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBB
UFBMRSBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJ
TkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVO
VElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVN
RU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBP
UgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBB
TkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBT
VFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RI
RVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09G
VFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0Uu
IAorICovCisKKyNpZm5kZWYgQjNTdGFja21hcF9oCisjZGVmaW5lIEIzU3RhY2ttYXBfaAorCisj
aW5jbHVkZSAiQjNWYWx1ZVJlcC5oIgorI2luY2x1ZGUgIkNDYWxsSGVscGVycy5oIgorI2luY2x1
ZGUgIlJlZ2lzdGVyU2V0LmgiCisjaW5jbHVkZSA8d3RmL1NoYXJlZFRhc2suaD4KKworbmFtZXNw
YWNlIEpTQyB7IG5hbWVzcGFjZSBCMyB7CisKK2NsYXNzIEIzVmFsdWU7CisKK2NsYXNzIFN0YWNr
bWFwIHsKK3B1YmxpYzoKKyAgICBzdHJ1Y3QgR2VuZXJhdGlvblBhcmFtcyB7CisgICAgICAgIC8v
IFRoaXMgaXMgdGhlIFZhbHVlIGNvbnRhaW5pbmcgdGhlIHN0YWNrbWFwLgorICAgICAgICBWYWx1
ZSogdmFsdWU7CisKKyAgICAgICAgLy8gVGhpcyBpcyB0aGUgc3RhY2ttYXAuCisgICAgICAgIFN0
YWNrbWFwKiBzdGFja21hcDsKKworICAgICAgICAvLyBUaGlzIGlzIHRoZSBqdW1wIHRvIHRoZSBz
bG93IHBhdGgsIGlmIHRoaXMgaXMgYSBzdGFja21hcCBmb3IgYSBDaGVjayB2YWx1ZS4KKyAgICAg
ICAgQ0NhbGxIZWxwZXJzOjpKdW1wIGp1bXA7CisgICAgfTsKKyAgICAKKyAgICB0eXBlZGVmIHZv
aWQgR2VuZXJhdG9yRnVuY3Rpb24oQ0NhbGxIZWxwZXJzJiwgY29uc3QgR2VuZXJhdGlvblBhcmFt
cyYpOworICAgIHR5cGVkZWYgU2hhcmVkVGFzazxHZW5lcmF0b3JGdW5jdGlvbj4gR2VuZXJhdG9y
OworICAgIAorICAgIFN0YWNrbWFwKCkKKyAgICB7CisgICAgfQorCisgICAgLy8gU2V0IHNvbWUg
b3BhcXVlIGRhdGEgdG8gaWRlbnRpZnkgdGhpcyBzdGFja21hcC4gVGhpcyBpcyB1c2VmdWwgYmVj
YXVzZSBhIFN0YWNrbWFwLXVzaW5nIFZhbHVlCisgICAgLy8gY2FuIGJlIGR1cGxpY2F0ZWQsIGFu
ZCBlYWNoIGR1cGxpY2F0ZSBtYXkgZW5kIHVwIGhhdmluZyBkaWZmZXJlbnQgcmVnaXN0ZXIgYWxs
b2NhdGlvbi4gVGhpcworICAgIC8vIGFsbG93cyBhbGwgb2YgdGhvc2UgZHVwbGljYXRlcyB0byBi
ZSBhYmxlIHRvIHJlZmVyIGJhY2sgdG8gd2hhdGV2ZXIgaGlnaC1sZXZlbCBkYXRhIHN0cnVjdHVy
ZXMKKyAgICAvLyB3ZSB3ZXJlIHVzaW5nIHRvIGNyZWF0ZSB0aGUgdmFsdWUuCisgICAgdm9pZCBz
ZXRPcGFxdWUodm9pZCogcGFyYW1ldGVyKQorICAgIHsKKyAgICAgICAgbV9vcGFxdWUgPSBwYXJh
bWV0ZXI7CisgICAgfQorICAgIHZvaWQqIG9wYXF1ZSgpIGNvbnN0IHsgcmV0dXJuIG1fb3BhcXVl
OyB9CisKKyAgICAvLyBDb252ZW5pZW5jZSBoZWxwZXJzIHdoZW4gdXNpbmcgaW5kaWNlcyBpbnN0
ZWFkIG9mIHBvaW50ZXJzLgorICAgIHZvaWQgc2V0T3BhcXVlSW5kZXgoc2l6ZV90IGluZGV4KQor
ICAgIHsKKyAgICAgICAgc2V0T3BhcXVlKGJpdHdpc2VfY2FzdDx2b2lkKj4oaW5kZXgpKTsKKyAg
ICB9CisgICAgc2l6ZV90IG9wYXF1ZUluZGV4KCkgY29uc3QgeyByZXR1cm4gYml0d2lzZV9jYXN0
PHNpemVfdD4ob3BhcXVlKCkpOyB9CisKKyAgICAvLyBDb25zdHJhaW4gYW4gYXJndW1lbnQgdG8g
dGhlIFZhbHVlIHRoYXQgdXNlcyB0aGlzIFN0YWNrbWFwLiBOb3RlIHRoYXQgaW5kZXggemVybyBy
ZWZlcnMgdG8gdGhlCisgICAgLy8gZmlyc3QgYXJndW1lbnQgdG8gdGhhdCBWYWx1ZSwgZXZlbiBp
ZiB0aGF0IGFyZ3VtZW50IGlzIG5vdCBjb25zdHJhaW5hYmxlLiBGb3IgZXhhbXBsZSwgaW4gYQor
ICAgIC8vIENoZWNrQWRkIHZhbHVlLCBpdCB3b3VsZCBiZSBhbiBlcnJvciB0byBjb25zdHJhaW4g
aW5kaWNlcyAwIGFuZCAxLiBJbiBhIENoZWNrIHZhbHVlLCBpdCB3b3VsZAorICAgIC8vIGJlIGFu
IGVycm9yIHRvIGNvbnN0cmFpbiBpbmRleCAwLiBCdXQsIHdoZW4gdGhlIGdlbmVyYXRpb24gY2Fs
bGJhY2sgaXMgY2FsbGVkLCB5b3UgY2FuIGRlcGVuZAorICAgIC8vIG9uIHRoZSByZXBzIGZvciB0
aG9zZSBpbmRpY2VzIGJlaW5nIGZpbGxlZCBpbi4KKyAgICB2b2lkIGNvbnN0cmFpbih1bnNpZ25l
ZCBpbmRleCwgY29uc3QgVmFsdWVSZXAmIHJlcCkKKyAgICB7CisgICAgICAgIGlmIChpbmRleCAr
IDEgPCBtX3JlcHMuc2l6ZSgpKQorICAgICAgICAgICAgbV9yZXBzLmdyb3coaW5kZXggKyAxKTsK
KyAgICAgICAgbV9yZXBzW2luZGV4XSA9IHJlcDsKKyAgICB9CisKKyAgICB2b2lkIGNsb2JiZXIo
Y29uc3QgUmVnaXN0ZXJTZXQmIHNldCkKKyAgICB7CisgICAgICAgIG1fY2xvYmJlcmVkLm1lcmdl
KHNldCk7CisgICAgfQorCisgICAgY29uc3QgUmVnaXN0ZXJTZXQmIGNsb2JiZXJlZCgpIGNvbnN0
IHsgcmV0dXJuIG1fY2xvYmJlcmVkOyB9CisKKyAgICB2b2lkIHNldEdlbmVyYXRvcihSZWZQdHI8
R2VuZXJhdG9yPiBnZW5lcmF0b3IpCisgICAgeworICAgICAgICBtX2dlbmVyYXRvciA9IGdlbmVy
YXRvcjsKKyAgICB9CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBGdW5jdG9yPgorICAgIHZvaWQg
c2V0R2VuZXJhdG9yKGNvbnN0IEZ1bmN0b3ImIGZ1bmN0b3IpCisgICAgeworICAgICAgICBtX2dl
bmVyYXRvciA9IGNyZWF0ZVNoYXJlZFRhc2s8R2VuZXJhdG9yRnVuY3Rpb24+KGZ1bmN0b3IpOwor
ICAgIH0KKworICAgIC8vIFRoZXNlIHdpbGwgcmV0dXJuIGludGVyZXN0aW5nIHRoaW5ncyBpbnNp
ZGUgdGhlIGdlbmVyYXRvciBjYWxsYmFjaywgb3IgYWZ0ZXIgY29tcGlsYXRpb24uCisgICAgY29u
c3QgVmVjdG9yPFZhbHVlUmVwPiYgcmVwcygpIGNvbnN0IHsgcmV0dXJuIG1fcmVwczsgfQorICAg
IGNvbnN0IFJlZ2lzdGVyU2V0JiB1c2VkUmVnaXN0ZXJzKCkgY29uc3QgeyByZXR1cm4gbV91c2Vk
UmVnaXN0ZXJzOyB9CisKKyAgICB2b2lkIGR1bXAoUHJpbnRTdHJlYW0mKSBjb25zdDsKKyAgICAK
K3ByaXZhdGU6CisgICAgdm9pZCogbV9vcGFxdWUgeyBudWxscHRyIH07CisgICAgVmVjdG9yPFZh
bHVlUmVwPiBtX3JlcHM7CisgICAgUmVmUHRyPEdlbmVyYXRvcj4gbV9nZW5lcmF0b3I7CisgICAg
UmVnaXN0ZXJTZXQgbV9jbG9iYmVyZWQ7CisgICAgUmVnaXN0ZXJTZXQgbV91c2VkUmVnaXN0ZXJz
OworfTsKKworfSB9IC8vIG5hbWVzcGFjZSBKU0M6OkIzCisKKyNlbmRpZiAvLyBCM1N0YWNrbWFw
X2gKKwpJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzU3dpdGNoQ2FzZS5jcHAKPT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzU3dpdGNoQ2FzZS5jcHAJKHJl
dmlzaW9uIDApCisrKyBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNTd2l0Y2hDYXNlLmNwcAko
d29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDM5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE1
IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBh
bmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1v
ZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29u
ZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29k
ZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlz
dCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRp
c3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHly
aWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxv
d2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIg
bWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNP
RlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVY
UFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBU
TywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRO
RVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBF
VkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBB
TlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwg
T1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywK
KyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0Yg
VVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dF
VkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElO
IENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJ
R0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAq
IE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0Yg
U1VDSCBEQU1BR0UuIAorICovCisKKyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJCM1N3
aXRjaENhc2UuaCIKKworI2luY2x1ZGUgIkIzQmFzaWNCbG9jay5oIgorCituYW1lc3BhY2UgSlND
IHsgbmFtZXNwYWNlIEIzIHsKKwordm9pZCBTd2l0Y2hDYXNlOjpkdW1wKFByaW50U3RyZWFtJiBv
dXQpIGNvbnN0Cit7CisgICAgb3V0LnByaW50KG1fY2FzZVZhbHVlLCAiLT4iLCBwb2ludGVyRHVt
cChtX3RhcmdldCkpOworfQorCit9IH0gLy8gbmFtZXNwYWNlIEpTQzo6QjMKKwpJbmRleDogU291
cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzU3dpdGNoQ2FzZS5oCj09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJj
ZS9KYXZhU2NyaXB0Q29yZS9iMy9CM1N3aXRjaENhc2UuaAkocmV2aXNpb24gMCkKKysrIFNvdXJj
ZS9KYXZhU2NyaXB0Q29yZS9iMy9CM1N3aXRjaENhc2UuaAkod29ya2luZyBjb3B5KQpAQCAtMCww
ICsxLDYzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE1IEFwcGxlIEluYy4gQWxsIHJpZ2h0
cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQg
YmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1p
dHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoK
KyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJv
dmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0
aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5
IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0
aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRo
ZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdp
dGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZ
IEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJS
QU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdB
UlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIK
KyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMu
IE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwg
SU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1B
R0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNV
QlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJP
RklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5Z
IFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElB
QklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBB
UklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVW
RU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisK
KyNpZm5kZWYgQjNTd2l0Y2hDYXNlX2gKKyNkZWZpbmUgQjNTd2l0Y2hDYXNlX2gKKworI2luY2x1
ZGUgPHd0Zi9TdGRMaWJFeHRyYXMuaD4KKyNpbmNsdWRlIDx3dGYvUHJpbnRTdHJlYW0uaD4KKwor
bmFtZXNwYWNlIEpTQyB7IG5hbWVzcGFjZSBCMyB7CisKK2NsYXNzIEJhc2ljQmxvY2s7CisKK2Ns
YXNzIFN3aXRjaENhc2UgeworcHVibGljOgorICAgIFN3aXRjaENhc2UoKQorICAgIHsKKyAgICB9
CisKKyAgICBTd2l0Y2hDYXNlKGludDY0X3QgY2FzZVZhbHVlLCBCYXNpY0Jsb2NrKiB0YXJnZXQp
CisgICAgICAgIDogbV9jYXNlVmFsdWUoY2FzZVZhbHVlKQorICAgICAgICAsIG1fdGFyZ2V0KHRh
cmdldCkKKyAgICB7CisgICAgfQorCisgICAgZXhwbGljaXQgb3BlcmF0b3IgYm9vbCgpIGNvbnN0
IHsgcmV0dXJuICEhbV90YXJnZXQ7IH0KKworICAgIGludDY0X3QgY2FzZVZhbHVlKCkgY29uc3Qg
eyByZXR1cm4gbV9jYXNlVmFsdWU7IH0KKyAgICBCYXNpY0Jsb2NrKiB0YXJnZXQoKSBjb25zdCB7
IHJldHVybiBtX3RhcmdldDsgfQorCisgICAgdm9pZCBkdW1wKFByaW50U3RyZWFtJiBvdXQpIGNv
bnN0OworCitwcml2YXRlOgorICAgIGludDY0X3QgY2FzZVZhbHVlOworICAgIEJhc2ljQmxvY2sq
IHRhcmdldDsKK307CisKK30gfSAvLyBuYW1lc3BhY2UgSlNDOjpCMworCisjZW5kaWYgLy8gQjNT
d2l0Y2hDYXNlX2gKKwpJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzU3dpdGNoVmFs
dWUuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM1N3aXRjaFZh
bHVlLmNwcAkocmV2aXNpb24gMCkKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM1N3aXRj
aFZhbHVlLmNwcAkod29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDYzIEBACisvKgorICogQ29weXJp
Z2h0IChDKSAyMDE1IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRp
c3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdp
dGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBm
b2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBv
ZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3Rp
Y2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIu
CisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhl
IGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBh
bmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBh
bmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAq
CisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFO
RCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBO
T1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklM
SVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlN
RUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUg
TElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAq
IEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1Qg
TElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklD
RVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJS
VVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZ
LCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5D
TFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9G
IFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9T
U0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisKKyNpbmNsdWRlICJjb25maWcuaCIKKyNp
bmNsZHVlICJCM1N3aXRjaFZhbHVlLmgiCisKK25hbWVzcGFjZSBKU0MgeyBuYW1lc3BhY2UgQjMg
eworCitTd2l0Y2hWYWx1ZTo6flN3aXRjaFZhbHVlKCkKK3sKK30KKworU3dpdGNoQ2FzZSBTd2l0
Y2hWYWx1ZTo6cmVtb3ZlQ2FzZSh1bnNpZ25lZCBpbmRleCkKK3sKKyAgICBTd2l0Y2hDYXNlIHJl
c3VsdCA9IG1fc3VjY2Vzc29yc1tpbmRleF07CisgICAgbV9zdWNjZXNzb3JzW2luZGV4XSA9IG1f
c3VjY2Vzc29ycy5sYXN0KCk7CisgICAgbV9zdWNjZXNzb3JzLnJlbW92ZUxhc3QoKTsKKyAgICBy
ZXR1cm4gcmVzdWx0OworfQorCit2b2lkIFN3aXRjaFZhbHVlOjphcHBlbmRDYXNlKGNvbnN0IFN3
aXRjaENhc2UmIHN3aXRjaENhc2UpCit7CisgICAgbV9zdWNjZXNzb3JzLmFwcGVuZChtX3N1Y2Nl
c3NvcnMubGFzdCgpKTsKKyAgICBtX3N1Y2Nlc3NvcnNbbV9zdWNjZXNzb3JzLnNpemUoKSAtIDJd
ID0gc3dpdGNoQ2FzZS50YXJnZXQoKTsKKyAgICBtX3ZhbHVlcy5hcHBlbmQoc3dpdGNoQ2FzZS5j
YXNlVmFsdWUoKSk7Cit9CisKK3ZvaWQgU3dpdGNoVmFsdWU6OmR1bXBNZXRhKFByaW50U3RyZWFt
JiBvdXQpIGNvbnN0Cit7CisgICAgLy8gVGhpcyBkZXN0cnVjdGl2ZWx5IG92ZXJyaWRlcyBDb250
cm9sVmFsdWUncyBkdW1wTWV0YSgpLgorICAgIG91dC5wcmludChsaXN0RHVtcCgqdGhpcykpOwor
fQorCitTd2l0Y2hWYWx1ZTo6U3dpdGNoVmFsdWUodW5zaWduZWQgaW5kZXgsIE9yaWdpbiBvcmln
aW4sIEJhc2ljQmxvY2sqIGZhbGxUaHJvdWdoKQorICAgIDogQ29udHJvbFZhbHVlKGluZGV4LCBT
d2l0Y2gsIG9yaWdpbikKK3sKKyAgICBtX3N1Y2Nlc3NvcnMuYXBwZW5kKGZhbGxUaHJvdWdoKTsK
K30KKworfSB9IC8vIG5hbWVzcGFjZSBKU0M6OkIzCisKSW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0
Q29yZS9iMy9CM1N3aXRjaFZhbHVlLmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRD
b3JlL2IzL0IzU3dpdGNoVmFsdWUuaAkocmV2aXNpb24gMCkKKysrIFNvdXJjZS9KYXZhU2NyaXB0
Q29yZS9iMy9CM1N3aXRjaFZhbHVlLmgJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSwxMjMgQEAK
Ky8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTUgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVk
LgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9y
bXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3Zp
ZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVk
aXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmln
aHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dp
bmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0
IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBv
ZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBk
b2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlz
dHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5D
LiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElO
Q0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBP
RiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9T
RSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IKKyAqIENP
TlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFM
LCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xV
RElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBH
T09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBC
VVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisg
KiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9S
IFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4g
QU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJ
U0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKworI2lmbmRlZiBC
M1N3aXRjaFZhbHVlX2gKKyNkZWZpbmUgQjNTd2l0Y2hWYWx1ZV9oCisKKyNpbmNsdWRlICJCM0Nv
bnRyb2xWYWx1ZS5oIgorI2luY2x1ZGUgIkIzU3dpdGNoQ2FzZS5oIgorCituYW1lc3BhY2UgSlND
IHsgbmFtZXNwYWNlIEIzIHsKKworY2xhc3MgU3dpdGNoVmFsdWUgOiBwdWJsaWMgQ29udHJvbFZh
bHVlIHsKK3B1YmxpYzoKKyAgICBzdGF0aWMgYm9vbCBhY2NlcHRzKE9wY29kZSBvcGNvZGUpIHsg
cmV0dXJuIG9wY29kZSA9PSBTd2l0Y2g7IH0KKworICAgIH5Td2l0Y2hWYWx1ZSgpOworCisgICAg
Ly8gbnVtQ2FzZVZhbHVlcygpICsgMSA9PSBudW1TdWNjZXNzb3JzKCkuCisgICAgdW5zaWduZWQg
bnVtQ2FzZVZhbHVlcygpIGNvbnN0IHsgcmV0dXJuIG1fdmFsdWVzLnNpemUoKTsgfQorCisgICAg
Ly8gVGhlIHN1Y2Nlc3NvciBmb3IgdGhpcyBjYXNlIHZhbHVlIGlzIGF0IHRoZSBzYW1lIGluZGV4
LgorICAgIGludDY0X3QgY2FzZVZhbHVlKHVuc2lnbmVkIGluZGV4KSBjb25zdCB7IHJldHVybiBt
X3ZhbHVlc1tpXTsgfQorICAgIAorICAgIGNvbnN0IFZlY3RvcjxpbnQ2NF90PiYgY2FzZVZhbHVl
cygpIGNvbnN0IHsgcmV0dXJuIG1fdmFsdWVzOyB9CisKKyAgICBCYXNpY0Jsb2NrKiBmYWxsVGhy
b3VnaCgpIGNvbnN0IHsgcmV0dXJuIHN1Y2Nlc3NvcnMoKS5sYXN0KCk7IH0KKyAgICBCYXNpY0Js
b2NrKiYgZmFsbFRocm91Z2goKSB7IHJldHVybiBzdWNjZXNzb3JzKCkubGFzdCgpOyB9CisKKyAg
ICB1bnNpZ25lZCBzaXplKCkgY29uc3QgeyByZXR1cm4gbnVtQ2FzZVZhbHVlcygpOyB9CisgICAg
U3dpdGNoQ2FzZSBhdCh1bnNpZ25lZCBpbmRleCkgY29uc3QKKyAgICB7CisgICAgICAgIHJldHVy
biBTd2l0Y2hDYXNlKGNhc2VWYWx1ZShpbmRleCksIHN1Y2Nlc3NvcihpbmRleCkpOworICAgIH0K
KyAgICBTd2l0Y2hDYXNlIG9wZXJhdG9yW10odW5zaWduZWQgaW5kZXgpIGNvbnN0CisgICAgewor
ICAgICAgICByZXR1cm4gYXQoaW5kZXgpOworICAgIH0KKworICAgIGNsYXNzIGl0ZXJhdG9yIHsK
KyAgICBwdWJsaWM6CisgICAgICAgIGl0ZXJhdG9yKCkKKyAgICAgICAgICAgIDogbV9zd2l0Y2go
bnVsbHB0cikKKyAgICAgICAgICAgICwgbV9pbmRleCgwKQorICAgICAgICB7CisgICAgICAgIH0K
KworICAgICAgICBpdGVyYXRvcihTd2l0Y2hWYWx1ZSYgc3dpdGNoVmFsdWUsIHVuc2lnbmVkIGlu
ZGV4KQorICAgICAgICAgICAgOiBtX3N3aXRjaCgmc3dpdGNoVmFsdWUpCisgICAgICAgICAgICAs
IG1faW5kZXgoaW5kZXgpCisgICAgICAgIHsKKyAgICAgICAgfQorCisgICAgICAgIFN3aXRjaENh
c2Ugb3BlcmF0b3IqKCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIG1fc3dpdGNoLT5h
dChtX2luZGV4KTsKKyAgICAgICAgfQorCisgICAgICAgIGl0ZXJhdG9yJiBvcGVyYXRvcisrKCkK
KyAgICAgICAgeworICAgICAgICAgICAgbV9pbmRleCsrOworICAgICAgICAgICAgcmV0dXJuICp0
aGlzOworICAgICAgICB9CisKKyAgICAgICAgYm9vbCBvcGVyYXRvcj09KGNvbnN0IGl0ZXJhdG9y
JiBvdGhlcikgY29uc3QKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIG1faW5kZXggPT0g
b3RoZXIubV9pbmRleDsKKyAgICAgICAgfQorCisgICAgICAgIGJvb2wgb3BlcmF0b3IhPShjb25z
dCBpdGVyYXRvciYgb3RoZXIpIGNvbnN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiAh
KCp0aGlzID09IG90aGVyKTsKKyAgICAgICAgfQorCisgICAgcHJpdmF0ZToKKyAgICAgICAgU3dp
dGNoVmFsdWUqIG1fc3dpdGNoOworICAgICAgICB1bnNpZ25lZCBtX2luZGV4OworICAgIH07CisK
KyAgICBpdGVyYXRvciBiZWdpbigpIGNvbnN0IHsgcmV0dXJuIGl0ZXJhdG9yKCp0aGlzLCAwKTsg
fQorICAgIGl0ZXJhdG9yIGVuZCgpIGNvbnN0IHsgcmV0dXJuIGl0ZXJhdG9yKCp0aGlzLCBzaXpl
KCkpOyB9CisKKyAgICAvLyBUaGlzIHJlbW92ZXMgdGhlIGNhc2UgYW5kIHJlb3JkZXJzIHRoaW5n
cyBhIGJpdC4gSWYgeW91J3JlIGl0ZXJhdGluZyB0aGUgY2FzZXMgZnJvbSAwIHRvIE4sCisgICAg
Ly8gdGhlbiB5b3UgY2FuIGtlZXAgaXRlcmF0aW5nIGFmdGVyIHRoaXMgc28gbG9uZyBhcyB5b3Ug
cmV2aXNpdCB0aGlzIHNhbWUgaW5kZXggKHdoaWNoIHdpbGwgbm93CisgICAgLy8gY29udGFpbiBz
b21lIG90aGVyIGNhc2UgdmFsdWUpLiBUaGlzIHJlbW92ZXMgdGhlIGNhc2UgdGhhdCB3YXMgcmVt
b3ZlZC4KKyAgICBTd2l0Y2hDYXNlIHJlbW92ZUNhc2UodW5zaWduZWQgaW5kZXgpOworCisgICAg
dm9pZCBhcHBlbmRDYXNlKGNvbnN0IFN3aXRjaENhc2UmIHN3aXRjaENhc2UpOworCitwcm90ZWN0
ZWQ6CisgICAgdm9pZCBkdW1wTWV0YShQcmludFN0cmVhbSYpIGNvbnN0IG92ZXJyaWRlOworCitw
cml2YXRlOgorICAgIGZyaWVuZCBjbGFzcyBQcm9jZWR1cmU7CisKKyAgICBTd2l0Y2hWYWx1ZSh1
bnNpZ25lZCBpbmRleCwgT3JpZ2luIG9yaWdpbiwgQmFzaWNCbG9jayogZmFsbFRocm91Z2gpOwor
fTsKKworfSB9IC8vIG5hbWVzcGFjZSBKU0M6OkIzCisKKyNlbmRpZiAvLyBCM1N3aXRjaFZhbHVl
X2gKKwpJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzVHlwZS5jcHAKPT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PQotLS0gU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzVHlwZS5jcHAJKHJldmlzaW9uIDApCisr
KyBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNUeXBlLmNwcAkod29ya2luZyBjb3B5KQpAQCAt
MCwwICsxLDU0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE1IEFwcGxlIEluYy4gQWxsIHJp
Z2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBh
bmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBl
cm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1l
dDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUg
YWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFu
ZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmlu
YXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNl
LCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGlu
IHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVk
IHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVE
IEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBX
QVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVE
IFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VM
QVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJ
TkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVD
VCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBE
QU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9G
IFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICog
UFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04g
QU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1Qg
TElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNF
KSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUs
IEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICov
CisKKyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJCM1R5cGUuaCIKKworI2luY2x1ZGUg
PHd0Zi9QcmludFN0cmVhbS5oPgorCituYW1lc3BhY2UgV1RGIHsKKwordXNpbmcgbmFtZXNwYWNl
IEpTQzo6QjM7CisKK3ZvaWQgcHJpbnRJbnRlcm5hbChQcmludFN0cmVhbSYgb3V0LCBUeXBlIHR5
cGUpCit7CisgICAgc3dpdGNoICh0eXBlKSB7CisgICAgY2FzZSBWb2lkOgorICAgICAgICBvdXQu
cHJpbnQoIlZvaWQiKTsKKyAgICAgICAgcmV0dXJuOworICAgIGNhc2UgSW50MzI6CisgICAgICAg
IG91dC5wcmludCgiSW50MzIiKTsKKyAgICAgICAgcmV0dXJuOworICAgIGNhc2UgSW50NjQ6Cisg
ICAgICAgIG91dC5wcmludCgiSW50NjQiKTsKKyAgICAgICAgcmV0dXJuOworICAgIGNhc2UgRG91
YmxlOgorICAgICAgICBvdXQucHJpbnQoIkRvdWJsZSIpOworICAgICAgICByZXR1cm47CisgICAg
fQorICAgIFJFTEVBU0VfQVNTRVJUX05PVF9SRUFDSEVEKCk7Cit9CisKK30gLy8gbmFtZXNwYWNl
IFdURgpJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzVHlwZS5oCj09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0K
LS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM1R5cGUuaAkocmV2aXNpb24gMCkKKysrIFNv
dXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM1R5cGUuaAkod29ya2luZyBjb3B5KQpAQCAtMCwwICsx
LDY4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE1IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyBy
ZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmlu
YXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRl
ZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAq
IDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUg
Y29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUg
Zm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZv
cm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlz
IGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQor
ICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGgg
dGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQ
UExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5U
SUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJB
TlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAq
IFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9S
CisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5D
SURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VT
IChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNU
SVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklU
UzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRI
RU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklM
SVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklT
SU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4g
SUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisKKyNp
Zm5kZWYgQjNUeXBlX2gKKyNkZWZpbmUgQjNUeXBlX2gKKworI2luY2x1ZGUgPHd0Zi9TdGRMaWJF
eHRyYXMuaD4KKworbmFtZXNwYWNlIEpTQyB7IG5hbWVzcGFjZSBCMyB7CisKK2VudW0gVHlwZSB7
CisgICAgVm9pZCwKKyAgICBJbnQzMiwKKyAgICBJbnQ2NCwKKyAgICBEb3VibGUKK307CisKK2lu
bGluZSBib29sIGlzSW50KFR5cGUgdHlwZSkKK3sKKyAgICByZXR1cm4gdHlwZSA9PSBJbnQzMiB8
fCB0eXBlID09IEludDY0OworfQorCitpbmxpbmUgYm9vbCBpc0Zsb2F0KFR5cGUgdHlwZSkKK3sK
KyAgICByZXR1cm4gdHlwZSA9PSBEb3VibGU7Cit9CisKK2lubGluZSBUeXBlIHBvaW50ZXIoKSBj
b25zdAoreworICAgIGlmIChzaXplb2Yodm9pZCopID09IDQpCisgICAgICAgIHJldHVybiBJbnQz
MjsKKyAgICByZXR1cm4gSW50NjQ7Cit9CisKK30gfSAvLyBuYW1lc3BhY2UgSlNDOjpCMworCitu
YW1lc3BhY2UgV1RGIHsKKworY2xhc3MgUHJpbnRTdHJlYW07CisKK3ZvaWQgcHJpbnRJbnRlcm5h
bChQcmludFN0cmVhbSYsIEpTQzo6QjM6OlR5cGUpOworCit9IC8vIG5hbWVzcGFjZSBXVEYKKwor
I2VuZGlmIC8vIEIzVHlwZV9oCisKSW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM1Vw
c2lsb25WYWx1ZS5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0Iz
VXBzaWxvblZhbHVlLmNwcAkocmV2aXNpb24gMCkKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9i
My9CM1Vwc2lsb25WYWx1ZS5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSw0MSBAQAorLyoK
KyAqIENvcHlyaWdodCAoQykgMjAxNSBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisg
KgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywg
d2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQg
dGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3Ry
aWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAor
ICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBk
aXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVw
cm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNv
bmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3Vt
ZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmli
dXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIGBg
QVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVE
SU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1F
UkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFS
RSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUgorICogQ09OVFJJ
QlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQ
RUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5H
LCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RT
IE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lO
RVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9G
IExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9S
VAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkg
V0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQg
T0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLiAKKyAqLworCisjaW5jbHVkZSAiY29u
ZmlnLmgiCisjaW5jbHVkZSAiQjNVcHNpbG9uVmFsdWUuaCIKKworbmFtZXNwYWNlIEpTQyB7IG5h
bWVzcGFjZSBCMyB7CisKK1Vwc2lsb25WYWx1ZTo6flVwc2lsb25WYWx1ZSgpCit7Cit9CisKK3Zv
aWQgVXBzaWxvblZhbHVlOjpkdW1wTWV0YShQcmludFN0cmVhbSYgb3V0KSBjb25zdAoreworICAg
IG91dC5wcmludCgiXiIsIG1fcGhpLT5pbmRleCgpKTsKK30KKworfSB9IC8vIG5hbWVzcGFjZSBK
U0M6OkIzCisKSW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM1Vwc2lsb25WYWx1ZS5o
Cj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM1Vwc2lsb25WYWx1ZS5o
CShyZXZpc2lvbiAwKQorKysgU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzVXBzaWxvblZhbHVl
LmgJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSw2MCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykg
MjAxNSBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRp
b24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Cisg
KiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5n
IGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNl
IGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlz
IGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4g
UmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBj
b3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBm
b2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90
aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJ
UyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisg
KiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlU
RUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQg
RklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4g
Tk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBG
T1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExB
UlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQg
VE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NT
IE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikg
SE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhF
UiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBO
RUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNF
CisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZ
IE9GIFNVQ0ggREFNQUdFLiAKKyAqLworCisjaWZuZGVmIEIzVXBzaWxvblZhbHVlX2gKKyNkZWZp
bmUgQjNVcHNpbG9uVmFsdWVfaAorCisjaW5jbHVkZSAiQjNWYWx1ZS5oIgorCituYW1lc3BhY2Ug
SlNDIHsgbmFtZXNwYWNlIEIzIHsKKworY2xhc3MgVXBzaWxvblZhbHVlIDogcHVibGljIFZhbHVl
IHsKK3B1YmxpYzoKKyAgICBzdGF0aWMgYm9vbCBhY2NlcHRzKE9wY29kZSBvcGNvZGUpIHsgcmV0
dXJuIG9wY29kZSA9PSBVcHNpbG9uOyB9CisKKyAgICB+VXBzaWxvblZhbHVlKCk7CisKKyAgICBW
YWx1ZSogcGhpKCkgY29uc3QgeyByZXR1cm4gbV9waGk7IH0KKworcHJvdGVjdGVkOgorICAgIHZv
aWQgZHVtcE1ldGEoUHJpbnRTdHJlYW0mKSBjb25zdCBvdmVycmlkZTsKKworcHJpdmF0ZToKKyAg
ICBmcmllbmQgY2xhc3MgUHJvY2VkdXJlOworICAgIAorICAgIFVwc2lsb25WYWx1ZSh1bnNpZ25l
ZCBpbmRleCwgT3JpZ2luIG9yaWdpbiwgVmFsdWUqIHZhbHVlLCBWYWx1ZSogcGhpKQorICAgICAg
ICA6IFZhbHVlKGluZGV4LCBQaGksIFZvaWQsIG9yaWdpbiwgdmFsdWUpCisgICAgICAgICwgbV9w
aGkocGhpKQorICAgIHsKKyAgICAgICAgQVNTRVJUKHZhbHVlLT50eXBlKCkgPT0gcGhpLT50eXBl
KCkpOworICAgIH0KKworICAgIFZhbHVlKiBtX3BoaTsKK307CisKK30gfSAvLyBuYW1lc3BhY2Ug
SlNDOjpCMworCisjZW5kaWYgLy8gQjNVcHNpbG9uVmFsdWVfaAorCkluZGV4OiBTb3VyY2UvSmF2
YVNjcmlwdENvcmUvYjMvQjNWYWx1ZS5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL0phdmFTY3Jp
cHRDb3JlL2IzL0IzVmFsdWUuY3BwCShyZXZpc2lvbiAwKQorKysgU291cmNlL0phdmFTY3JpcHRD
b3JlL2IzL0IzVmFsdWUuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsMTY5IEBACisvKgor
ICogQ29weXJpZ2h0IChDKSAyMDE1IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAq
CisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3
aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0
aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJp
YnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Cisg
KiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRp
c2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXBy
b2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29u
ZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1l
bnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1
dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gYGBB
UyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJ
TkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVS
Q0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJF
IERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SCisgKiBDT05UUklC
VVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BF
Q0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcs
IEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMg
T1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5F
U1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0Yg
TElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JU
CisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBX
QVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBP
RiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisKKyNpbmNsdWRlICJjb25m
aWcuaCIKKyNpbmNsdWRlICJCM1ZhbHVlLmgiCisKK25hbWVzcGFjZSBKU0MgeyBuYW1lc3BhY2Ug
QjMgeworCitWYWx1ZTo6flZhbHVlKCkKK3sKK30KKwordm9pZCBWYWx1ZTo6cmVwbGFjZVdpdGhJ
ZGVudGl0eShWYWx1ZSogdmFsdWUpCit7CisgICAgLy8gVGhpcyBpcyBhIGJpdCBjcmF6eS4gSXQg
ZG9lcyBhbiBpbi1wbGFjZSByZXBsYWNlbWVudCBvZiB3aGF0ZXZlciBWYWx1ZSBzdWJjbGFzcyB0
aGlzIGlzIHdpdGgKKyAgICAvLyBhIHBsYWluIElkZW50aXR5IFZhbHVlLiBXZSBmaXJzdCBjb2xs
ZWN0IGFsbCBvZiB0aGUgaW5mb3JtYXRpb24gd2UgbmVlZCwgdGhlbiB3ZSBkZXN0cnVjdCB0aGUK
KyAgICAvLyBwcmV2aW91cyB2YWx1ZSBpbiBwbGFjZSwgYW5kIHRoZW4gd2UgY29uc3RydWN0IHRo
ZSBJZGVudGl0eSBWYWx1ZSBpbiBwbGFjZS4KKworICAgIHVuc2lnbmVkIGluZGV4ID0gbV9pbmRl
eDsKKyAgICBUeXBlIHR5cGUgPSBtX3R5cGU7CisgICAgT3JpZ2luIG9yaWdpbiA9IG1fb3JpZ2lu
OworICAgIEJhc2ljQmxvY2sqIG93bmVyID0gdGhpcy0+b3duZXI7CisgICAgVmFsdWUqIHJlcGxh
Y2VtZW50ID0gdGhpcy0+cmVwbGFjZW1lbnQ7CisgICAgdm9pZCogbWlzYyA9IHRoaXMtPm1pc2M7
CisKKyAgICBSRUxFQVNFX0FTU0VSVCh0eXBlID09IHZhbHVlLT50eXBlKCkpOworCisgICAgdGhp
cy0+VmFsdWU6On5WYWx1ZSgpOworCisgICAgbmV3ICh0aGlzKSAoaW5kZXgsIElkZW50aWZ5LCB0
eXBlLCBvcmlnaW4sIHZhbHVlKTsKKworICAgIHRoaXMtPm93bmVyID0gb3duZXI7CisgICAgdGhp
cy0+cmVwbGFjZW1lbnQgPSByZXBsYWNlbWVudDsKKyAgICB0aGlzLT5taXNjID0gbWlzYzsKK30K
Kwordm9pZCBWYWx1ZTo6ZHVtcChQcmludFN0cmVhbSYgb3V0KSBjb25zdAoreworICAgIG91dC5w
cmludChkdW1wUHJlZml4LCBtX2luZGV4KTsKK30KKwordm9pZCBWYWx1ZTo6ZGVlcER1bXAoUHJp
bnRTdHJlYW0mIG91dCkgY29uc3QKK3sKKyAgICBvdXQucHJpbnQobV90eXBlLCAiICIsICp0aGlz
LCAiID0gIiwgbV9vcGNvZGUpOworCisgICAgb3V0LnByaW50KCIoIik7CisgICAgQ29tbWFQcmlu
dGVyIGNvbW1hOworICAgIGZvciAoVmFsdWUqIGNoaWxkIDogY2hpbGRyZW4oKSkKKyAgICAgICAg
b3V0LnByaW50KGNvbW1hLCBwb2ludGVyRHVtcChjaGlsZCkpOworCisgICAgU3RyaW5nUHJpbnRT
dHJlYW0gc3RyaW5nT3V0OworICAgIGR1bXBNZXRhKHN0cmluZ091dCk7CisgICAgQ1N0cmluZyBz
dHJpbmcgPSBzdHJpbmdPdXQudG9DU3RyaW5nKCk7CisgICAgaWYgKHN0cmluZy5sZW5ndGgoKSkK
KyAgICAgICAgb3V0LnByaW50KGNvbW1hLCBzdHJpbmcpOworCisgICAgb3V0LnByaW50KCIpIik7
Cit9CisKK2Jvb2wgVmFsdWU6Omhhc0ludDMyKCkgY29uc3QKK3sKKyAgICByZXR1cm4gZmFsc2U7
Cit9CisKK2ludDMyX3QgVmFsdWU6OmFzSW50MzIoKSBjb25zdAoreworICAgIFJFTEVBU0VfQVNT
RVJUX05PVF9SRUFDSEVEKCk7CisgICAgcmV0dXJuIDA7Cit9CisKK2Jvb2wgVmFsdWU6Omhhc0lu
dDY0KCkgY29uc3QKK3sKKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK2ludDY0X3QgVmFsdWU6OmFz
SW50NjQoKSBjb25zdAoreworICAgIFJFTEVBU0VfQVNTRVJUX05PVF9SRUFDSEVEKCk7CisgICAg
cmV0dXJuIDA7Cit9CisKK2Jvb2wgVmFsdWU6Omhhc0RvdWJsZSgpIGNvbnN0Cit7CisgICAgcmV0
dXJuIGZhbHNlOworfQorCitkb3VibGUgVmFsdWU6OmFzRG91YmxlKCkgY29uc3QKK3sKKyAgICBS
RUxFQVNFX0FTU0VSVF9OT1RfUkVBQ0hFRCgpOworICAgIHJldHVybiAwOworfQorCit2b2lkIFZh
bHVlOjpkdW1wTWV0YShQcmludFN0cmVhbSYpIGNvbnN0Cit7Cit9CisKK1R5cGUgVmFsdWU6OnR5
cGVGb3IoT3Bjb2RlIG9wY29kZSwgVmFsdWUqIGZpcnN0Q2hpbGQpCit7CisgICAgc3dpdGNoIChv
cGNvZGUpIHsKKyAgICBjYXNlIElkZW50aXR5OgorICAgIGNhc2UgQWRkOgorICAgIGNhc2UgU3Vi
OgorICAgIGNhc2UgTXVsOgorICAgIGNhc2UgRGl2OgorICAgIGNhc2UgQ2hpbGxEaXY6CisgICAg
Y2FzZSBNb2Q6CisgICAgY2FzZSBCaXRBbmQ6CisgICAgY2FzZSBCaXRPcjoKKyAgICBjYXNlIEJp
dFhvcjoKKyAgICBjYXNlIFNobDoKKyAgICBjYXNlIFNTaHI6CisgICAgY2FzZSBaU2hyOgorICAg
IGNhc2UgQ2hlY2tBZGQ6CisgICAgY2FzZSBDaGVja1N1YjoKKyAgICBjYXNlIENoZWNrTXVsOgor
ICAgICAgICByZXR1cm4gZmlyc3RDaGlsZC0+dHlwZSgpOworICAgIGNhc2UgRnJhbWVQb2ludGVy
OgorICAgICAgICByZXR1cm4gcG9pbnRlcigpOworICAgIGNhc2UgU0V4dDg6CisgICAgY2FzZSBT
RXh0MTY6CisgICAgY2FzZSBEVG9JMzI6CisgICAgY2FzZSBFcXVhbDoKKyAgICBjYXNlIE5vdEVx
dWFsOgorICAgIGNhc2UgTGVzc1RoYW46CisgICAgY2FzZSBHcmVhdGVyVGhhbjoKKyAgICBjYXNl
IExlc3NFcXVhbDoKKyAgICBjYXNlIEdyZWF0ZXJFcXVhbDoKKyAgICBjYXNlIEFib3ZlOgorICAg
IGNhc2UgQmVsb3c6CisgICAgY2FzZSBBYm92ZUVxdWFsOgorICAgIGNhc2UgQmVsb3dFcXVhbDoK
KyAgICAgICAgcmV0dXJuIEludDMyOworICAgIGNhc2UgU0V4dDMyOgorICAgIGNhc2UgWkV4dDMy
OgorICAgICAgICByZXR1cm4gSW50NjQ7CisgICAgY2FzZSBGUm91bmQ6CisgICAgY2FzZSBJVG9E
OgorICAgICAgICByZXR1cm4gRG91YmxlOworICAgIGNhc2UgTm9wOgorICAgICAgICByZXR1cm4g
Vm9pZDsKKyAgICBkZWZhdWx0OgorICAgICAgICBSRUxFQVNFX0FTU0VSVF9OT1RfUkVBQ0hFRCgp
OworICAgIH0KK30KKworfSB9IC8vIG5hbWVzcGFjZSBKU0M6OkIzCisKSW5kZXg6IFNvdXJjZS9K
YXZhU2NyaXB0Q29yZS9iMy9CM1ZhbHVlLmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL0phdmFTY3Jp
cHRDb3JlL2IzL0IzVmFsdWUuaAkocmV2aXNpb24gMCkKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29y
ZS9iMy9CM1ZhbHVlLmgJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSwxOTYgQEAKKy8qCisgKiBD
b3B5cmlnaHQgKEMpIDIwMTUgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAq
IFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGgg
b3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQg
dGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRp
b25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAg
IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xh
aW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVj
ZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRp
b25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0
aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9u
LgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFTIElT
JycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywg
QlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFO
VEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElT
Q0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IKKyAqIENPTlRSSUJVVE9S
UyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFM
LAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVU
IE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBT
RVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJ
TlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFC
SUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAq
IChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBP
VVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRI
RSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKworI2lmbmRlZiBCM1ZhbHVlX2gK
KyNkZWZpbmUgQjNWYWx1ZV9oCisKKyNpbmNsdWRlICJCM09yaWdpbi5oIgorI2luY2x1ZGUgIkIz
VHlwZS5oIgorI2luY2x1ZGUgPHd0Zi9GYXN0TWFsbG9jLmg+CisjaW5jbHVkZSA8d3RmL05vbmNv
cHlhYmxlLmg+CisKK25hbWVzcGFjZSBKU0MgeyBuYW1lc3BhY2UgQjMgeworCitjbGFzcyBWYWx1
ZSB7CisgICAgV1RGX01BS0VfTk9OQ09QWUFCTEUoVmFsdWUpOworICAgIFdURl9NQUtFX0ZBU1Rf
QUxMT0NBVEVEOworcHVibGljOgorICAgIHR5cGVkZWYgVmVjdG9yPFZhbHVlKiwgMz4gQWRqYWNl
bmN5TGlzdDsKKworICAgIHN0YXRpYyBjb25zdCBjaGFyKiBkdW1wUHJlZml4ID0gIkAiOworCisg
ICAgc3RhdGljIGJvb2wgYWNjZXB0cyhPcGNvZGUpIHsgcmV0dXJuIHRydWU7IH0KKworICAgIHZp
cnR1YWwgflZhbHVlKCk7CisKKyAgICB1bnNpZ25lZCBpbmRleCgpIGNvbnN0IHsgcmV0dXJuIG1f
aW5kZXg7IH0KKyAgICAKKyAgICAvLyBOb3RlIHRoYXQgdGhlIG9wY29kZSBpcyBpbW11dGFibGUs
IGV4Y2VwdCBmb3IgcmVwbGFjaW5nIHZhbHVlcyB3aXRoIGlkZW50aXR5LgorICAgIE9wY29kZSBv
cGNvZGUoKSBjb25zdCB7IHJldHVybiBtX29wY29kZTsgfQorCisgICAgT3JpZ2luIG9yaWdpbigp
IGNvbnN0IHsgcmV0dXJuIG1fb3JpZ2luOyB9CisgICAgCisgICAgVmFsdWUqJiBjaGlsZCh1bnNp
Z25lZCBpbmRleCkgeyByZXR1cm4gbV9jaGlsZHJlbltpbmRleF07IH0KKyAgICBWYWx1ZSogY2hp
bGQodW5zaWduZWQgaW5kZXgpIGNvbnN0IHsgcmV0dXJuIG1fY2hpbGRyZW5baW5kZXhdOyB9CisK
KyAgICAvLyBUaGlzIGNvbXB1dGVzIHRoZSB0eXBlIHVzaW5nIHRoZSBvcGNvZGUuCisgICAgVHlw
ZSB0eXBlKCkgY29uc3QgeyByZXR1cm4gbV90eXBlOyB9CisKKyAgICBBZGphY2VuY3lMaXN0JiBj
aGlsZHJlbigpIHsgcmV0dXJuIG1fY2hpbGRyZW47IH0gCisgICAgY29uc3QgQWRqYWNlbmN5TGlz
dCYgY2hpbGRyZW4oKSBjb25zdCB7IHJldHVybiBtX2NoaWxkcmVuOyB9CisKKyAgICB2b2lkIHJl
cGxhY2VXaXRoSWRlbnRpdHkoVmFsdWUqKTsKKyAgICB2b2lkIHJlcGxhY2VXaXRoTm9wKCk7CisK
KyAgICB2b2lkIGR1bXAoUHJpbnRTdHJlYW0mKSBjb25zdDsKKyAgICB2b2lkIGRlZXBEdW1wKFBy
aW50U3RyZWFtJikgY29uc3Q7CisKKyAgICAvLyBUaGlzIGlzIGhvdyB5b3UgY2FzdCBWYWx1ZXMu
IEZvciBleGFtcGxlLCBpZiB5b3Ugd2FudCB0byBkbyBzb21ldGhpbmcgcHJvdmlkZWQgdGhhdCB3
ZSBoYXZlIGEKKyAgICAvLyBBcmd1bWVudFJlZ1ZhbHVlLCB5b3UgY2FuIGRvOgorICAgIC8vCisg
ICAgLy8gaWYgKEFyZ3VtZW50UmVnVmFsdWUqIGFyZ3VtZW50UmVnID0gdmFsdWUtPmFzPEFyZ3Vt
ZW50UmVnVmFsdWU+KCkpIHsKKyAgICAvLyAgICAgdGhpbmdzCisgICAgLy8gfQorICAgIC8vCisg
ICAgLy8gVGhpcyB3aWxsIHJldHVybiBudWxsIGlmIHRoaXMgb3Bjb2RlKCkgIT0gQXJndW1lbnRS
ZWcuIFRoaXMgd29ya3MgYmVjYXVzZSB0aGlzIHJldHVybnMgbnVsbHB0cgorICAgIC8vIGlmIFQ6
OmFjY2VwdHMob3Bjb2RlKCkpIHJldHVybnMgZmFsc2UuCisgICAgdGVtcGxhdGU8dHlwZW5hbWUg
VD4KKyAgICBUKiBhcygpOworICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+CisgICAgY29uc3QgVCog
YXMoKSBjb25zdDsKKyAgICAKKyAgICBib29sIGhhc0ludDMyKCkgY29uc3Q7CisgICAgaW50MzJf
dCBhc0ludDMyKCkgY29uc3Q7CisgICAgCisgICAgYm9vbCBoYXNJbnQ2NCgpIGNvbnN0OworICAg
IGludDY0X3QgYXNJbnQ2NCgpIGNvbnN0OworCisgICAgYm9vbCBoYXNJbnQoKSBjb25zdDsKKyAg
ICBpbnQ2NF90IGFzSW50KCkgY29uc3Q7CisgICAgYm9vbCBpc0ludChpbnQ2NF90IHZhbHVlKSBj
b25zdDsKKworICAgIGJvb2wgaGFzRG91YmxlKCkgY29uc3Q7CisgICAgZG91YmxlIGFzRG91Ymxl
KCkgY29uc3Q7CisKKyAgICBTdGFja21hcCogc3RhY2ttYXAoKTsKKworcHJvdGVjdGVkOgorICAg
IHZpcnR1YWwgdm9pZCBkdW1wTWV0YShQcmludFN0cmVhbSYpIGNvbnN0OworICAgIAorcHJpdmF0
ZToKKyAgICBmcmllbmQgY2xhc3MgUHJvY2VkdXJlOworICAgIAorICAgIC8vIEluc3RhbnRpYXRl
IHZhbHVlcyB2aWEgUHJvY2VkdXJlLgorICAgIC8vIFRoaXMgZm9ybSByZXF1aXJlcyBzcGVjaWZ5
aW5nIHRoZSB0eXBlIGV4cGxpY2l0bHk6CisgICAgdGVtcGxhdGU8dHlwZW5hbWUuLi4gQXJndW1l
bnRzPgorICAgIGV4cGxpY2l0IFZhbHVlKHVuc2lnbmVkIGluZGV4LCBPcGNvZGUgb3Bjb2RlLCBU
eXBlIHR5cGUsIE9yaWdpbiBvcmlnaW4sIFZhbHVlKiBmaXJzdENoaWxkLCBBcmd1bWVudHMuLi4g
YXJndW1lbnRzKQorICAgICAgICA6IG1faW5kZXgoaW5kZXgpCisgICAgICAgICwgbV9vcGNvZGUo
b3Bjb2RlKQorICAgICAgICAsIG1fdHlwZSh0eXBlKQorICAgICAgICAsIG1fb3JpZ2luKG9yaWdp
bikKKyAgICAgICAgLCBtX2NoaWxkcmVueyBmaXJzdENoaWxkLCBhcmd1bWVudHMuLi4gfQorICAg
IHsKKyAgICB9CisgICAgLy8gVGhpcyBmb3JtIGlzIGZvciBzcGVjaWZ5aW5nIHRoZSB0eXBlIGV4
cGxpY2l0bHkgd2hlbiB0aGUgb3Bjb2RlIGhhcyBubyBjaGlsZHJlbjoKKyAgICBleHBsaWNpdCBW
YWx1ZSh1bnNpZ25lZCBpbmRleCwgT3Bjb2RlIG9wY29kZSwgVHlwZSB0eXBlLCBPcmlnaW4gb3Jp
Z2luKQorICAgICAgICA6IG1faW5kZXgoaW5kZXgpCisgICAgICAgICwgbV9vcGNvZGUob3Bjb2Rl
KQorICAgICAgICAsIG1fdHlwZSh0eXBlKQorICAgICAgICAsIG1fb3JpZ2luKG9yaWdpbikKKyAg
ICB7CisgICAgfQorICAgIC8vIFRoaXMgZm9ybSBpcyBmb3IgdGhvc2Ugb3Bjb2RlcyB0aGF0IGNh
biBpbmZlciB0aGVpciB0eXBlIGZyb20gdGhlIG9wY29kZSBhbmQgZmlyc3QgY2hpbGQ6CisgICAg
dGVtcGxhdGU8dHlwZW5hbWUuLi4gQXJndW1lbnRzPgorICAgIGV4cGxpY2l0IFZhbHVlKHVuc2ln
bmVkIGluZGV4LCBPcGNvZGUgb3Bjb2RlLCBPcmlnaW4gb3JpZ2luLCBWYWx1ZSogZmlyc3RDaGls
ZCwgQXJndW1lbnRzLi4uIGFyZ3VtZW50cykKKyAgICAgICAgOiBtX2luZGV4KGluZGV4KQorICAg
ICAgICAsIG1fb3Bjb2RlKG9wY29kZSkKKyAgICAgICAgLCBtX3R5cGUodHlwZUZvcihvcGNvZGUs
IGZpcnN0Q2hpbGQpKQorICAgICAgICAsIG1fb3JpZ2luKG9yaWdpbikKKyAgICAgICAgLCBtX2No
aWxkcmVueyBmaXJzdENoaWxkLCBhcmd1bWVudHMuLi4gfQorICAgIHsKKyAgICB9CisgICAgLy8g
VGhpcyBmb3JtIGlzIGZvciB0aG9zZSBvcGNvZGVzIHRoYXQgY2FuIGluZmVyIHRoZWlyIHR5cGUg
ZnJvbSB0aGUgb3Bjb2RlIGFsb25lLCBhbmQgdGhhdCBkb24ndAorICAgIC8vIHRha2UgYW55IGFy
Z3VtZW50czoKKyAgICBleHBsaWNpdCBWYWx1ZSh1bnNpZ25lZCBpbmRleCwgT3Bjb2RlIG9wY29k
ZSwgT3JpZ2luIG9yaWdpbikKKyAgICAgICAgOiBtX2luZGV4KGluZGV4KQorICAgICAgICAsIG1f
b3Bjb2RlKG9wY29kZSkKKyAgICAgICAgLCBtX3R5cGUodHlwZUZvcihvcGNvZGUsIG51bGxwdHIp
KQorICAgICAgICAsIG1fb3JpZ2luKG9yaWdpbikKKyAgICB7CisgICAgfQorICAgIC8vIFVzZSB0
aGlzIGZvcm0gZm9yIHZhcmFyZ3MuCisgICAgZXhwaWNpdCBWYWx1ZSh1bnNpZ25lZCBpbmRleCwg
T3Bjb2RlIG9wY29kZSwgVHlwZSB0eXBlLCBPcmlnaW4gb3JpZ2luLCBjb25zdCBBZGphY2VuY3lM
aXN0JiBjaGlsZHJlbikKKyAgICAgICAgOiBtX2luZGV4KGluZGV4KQorICAgICAgICAsIG1fb3Bj
b2RlKG9wY29kZSkKKyAgICAgICAgLCBtX3R5cGUodHlwZSkKKyAgICAgICAgLCBtX29yaWdpbihv
cmlnaW4pCisgICAgICAgICwgbV9jaGlsZHJlbihjaGlsZHJlbikKKyAgICB7CisgICAgfQorCisg
ICAgc3RhdGljIFR5cGUgdHlwZUZvcihPcGNvZGUsIFZhbHVlKiBmaXJzdENoaWxkKTsKKworICAg
IC8vIFRoaXMgZ3JvdXAgb2YgZmllbGRzIGlzIGFycmFuZ2VkIHRvIGZpdCBpbiA2NCBiaXRzLgor
ICAgIHVuc2lnbmVkIG1faW5kZXg7CisgICAgT3Bjb2RlIG1fb3Bjb2RlOworICAgIFR5cGUgbV90
eXBlOworICAgIAorICAgIE9yaWdpbiBtX29yaWdpbjsKKyAgICBBZGphY2VuY3lMaXN0IG1fY2hp
bGRyZW47CisKK3B1YmxpYzoKKyAgICBCYXNpY0Jsb2NrKiBvd25lciB7IG51bGxwdHIgfTsgLy8g
Y29tcHV0ZWQgbGF6aWx5LgorICAgIFZhbHVlKiByZXBsYWNlbWVudCB7IG51bGxwdHIgfTsgLy8g
dXNlZCBmb3IgYW5hbHlzZXMgYW5kIHRyYW5zZm9ybWF0aW9ucy4KKyAgICB2b2lkKiBtaXNjIHsg
bnVsbHB0ciB9OworfTsKKworY2xhc3MgRGVlcFZhbHVlRHVtcCB7CitwdWJsaWM6CisgICAgRGVl
cFZhbHVlRHVtcChWYWx1ZSogdmFsdWUpCisgICAgICAgIDogbV92YWx1ZSh2YWx1ZSkKKyAgICB7
CisgICAgfQorCisgICAgdm9pZCBkdW1wKFByaW50U3RyZWFtJiBvdXQpIGNvbnN0CisgICAgewor
ICAgICAgICBpZiAobV92YWx1ZSkKKyAgICAgICAgICAgIG1fdmFsdWUtPmRlZXBEdW1wKG91dCk7
CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIG91dC5wcmludCgiPG51bGw+Iik7CisgICAgfQor
Citwcml2YXRlOgorICAgIFZhbHVlKiBtX3ZhbHVlOworfTsKKworRGVlcFZhbHVlRHVtcCBkZWVw
RHVtcChWYWx1ZSogdmFsdWUpCit7CisgICAgcmV0dXJuIERlZXBWYWx1ZUR1bXAodmFsdWUpOwor
fQorCit9IH0gLy8gbmFtZXNwYWNlIEpTQzo6QjMKKworI2VuZGlmIC8vIEIzVmFsdWVfaAorCklu
ZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNWYWx1ZUlubGluZXMuaAo9PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNWYWx1ZUlubGluZXMuaAkocmV2aXNpb24g
MCkKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM1ZhbHVlSW5saW5lcy5oCSh3b3JraW5n
IGNvcHkpCkBAIC0wLDAgKzEsMTA5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE1IEFwcGxl
IEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNl
IGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNh
dGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9u
cworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0
IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBj
b25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1
dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAor
ICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBk
aXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJp
YWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJF
IElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1Mg
T1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhF
CisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZP
UiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBT
SEFMTCBBUFBMRSBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElS
RUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09O
U0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBS
T0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBE
QVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENB
VVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRS
QUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0Ug
T1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRI
SVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBE
QU1BR0UuIAorICovCisKKyNpZm5kZWYgQjNWYWx1ZUlubGluZXNfaAorI2RlZmluZSBCM1ZhbHVl
SW5saW5lc19oCisKKyNpbmNsdWRlICJCM0NoZWNrVmFsdWUuaCIKKyNpbmNsdWRlICJCM0NvbnN0
MzJWYWx1ZS5oIgorI2luY2x1ZGUgIkIzQ29uc3Q2NFZhbHVlLmgiCisjaW5jbHVkZSAiQjNDb25z
dERvdWJsZVZhbHVlLmgiCisjaW5jbHVkZSAiQjNQYXRjaHBvaW50VmFsdWUuaCIKKyNpbmNsdWRl
ICJCM1ZhbHVlLmgiCisKK25hbWVzcGFjZSBKU0MgeyBuYW1lc3BhY2UgQjMgeworCit0ZW1wbGF0
ZTx0eXBlbmFtZSBUPgorVCogVmFsdWU6OmFzKCkKK3sKKyAgICBpZiAoVDo6YWNjZXB0cyhvcGNv
ZGUoKSkpCisgICAgICAgIHJldHVybiBzdGF0aWNfY2FzdDxUKj4odGhpcyk7CisgICAgcmV0dXJu
IG51bGxwdHI7Cit9CisKK3RlbXBsYXRlPnR5cGVuYW1lIFQ+Citjb25zdCBUKiBWYWx1ZTo6YXMo
KSBjb25zdAoreworICAgIHJldHVybiBjb25zdF9jYXN0PFZhbHVlKj4odGhpcyktPmFzPFQ+KCk7
Cit9CisKK2Jvb2wgVmFsdWU6Omhhc0ludDMyKCkgY29uc3QKK3sKKyAgICByZXR1cm4gISFhczxD
b25zdDMyVmFsdWU+KCk7Cit9CisKK2ludDMyX3QgVmFsdWU6OmFzSW50MzIoKSBjb25zdAorewor
ICAgIHJldHVybiBhczxDb25zdDMyVmFsdWU+KCktPnZhbHVlKCk7Cit9CisKK2Jvb2wgVmFsdWU6
Omhhc0ludDY0KCkgY29uc3QKK3sKKyAgICByZXR1cm4gISFhczxDb25zdDY0VmFsdWU+KCk7Cit9
CisKK2ludDY0X3QgVmFsdWU6OmFzSW50NjQoKSBjb25zdAoreworICAgIHJldHVybiBhczxDb25z
dDY0VmFsdWU+KCktPnZhbHVlKCk7Cit9CisKK2Jvb2wgVmFsdWU6Omhhc0ludCgpIGNvbnN0Cit7
CisgICAgcmV0dXJuIGhhc0ludDMyKCkgfHwgaGFzSW50NjQoKTsKK30KKworaW50NjRfdCBWYWx1
ZTo6YXNJbnQoKSBjb25zdAoreworICAgIHJldHVybiBoYXNJbnQzMigpID8gYXNJbnQzMigpIDog
YXNJbnQ2NCgpOworfQorCitib29sIFZhbHVlOjppc0ludChpbnQ2NF90IHZhbHVlKSBjb25zdAor
eworICAgIHJldHVybiBoYXNJbnQoKSAmJiBhc0ludCgpID09IHZhbHVlOworfQorCitib29sIFZh
bHVlOjpoYXNEb3VibGUoKSBjb25zdAoreworICAgIHJldHVybiAhIWFzPENvbnN0RG91YmxlVmFs
dWU+KCk7Cit9CisKK2RvdWJsZSBWYWx1ZTo6YXNEb3VibGUoKSBjb25zdAoreworICAgIHJldHVy
biBhczxDb25zdERvdWJsZVZhbHVlPigpLT52YWx1ZSgpOworfQorCitTdGFja21hcCogVmFsdWU6
OnN0YWNrbWFwKCkKK3sKKyAgICBpZiAoQ2hlY2tWYWx1ZSogY2hlY2sgPSBhczxDaGVja1ZhbHVl
PigpKQorICAgICAgICByZXR1cm4gJmNoZWNrLT5zdGFja21hcDsKKyAgICBpZiAoUGF0Y2hwb2lu
dFZhbHVlKiBwYXRjaHBvaW50ID0gYXM8UGF0Y2hwb2ludFZhbHVlPigpKQorICAgICAgICByZXR1
cm4gJnBhdGNocG9pbnQtPnN0YWNrbWFwOworICAgIHJldHVybiBudWxscHRyOworfQorCit9IH0g
Ly8gbmFtZXNwYWNlIEpTQzo6QjMKKworI2VuZGlmIC8vIEIzVmFsdWVJbmxpbmVzX2gKKwpJbmRl
eDogU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzVmFsdWVSZXAuY3BwCj09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0t
IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM1ZhbHVlUmVwLmNwcAkocmV2aXNpb24gMCkKKysr
IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM1ZhbHVlUmVwLmNwcAkod29ya2luZyBjb3B5KQpA
QCAtMCwwICsxLDg2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE1IEFwcGxlIEluYy4gQWxs
IHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJj
ZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJl
IHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJl
IG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0
aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25z
IGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4g
YmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90
aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVy
IGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3Zp
ZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJ
REVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElF
RCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBM
SUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJ
Q1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBM
RSBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJ
UkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElB
TCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5U
IE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgor
ICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQg
T04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJ
Q1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJX
SVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdB
UkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAor
ICovCisKKyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJCM1ZhbHVlUmVwLmgiCisKK25h
bWVzcGFjZSBKU0MgeyBuYW1lc3BhY2UgQjMgeworCit2b2lkIFZhbHVlUmVwOjpkdW1wKFByaW50
U3RyZWFtJiBvdXQpIGNvbnN0Cit7CisgICAgb3V0LnByaW50KG1fa2luZCk7CisgICAgc3dpdGNo
IChtX2tpbmQpIHsKKyAgICBjYXNlIE5vbmU6CisgICAgY2FzZSBTb21lUmVnaXN0ZXI6CisgICAg
ICAgIHJldHVybjsKKyAgICBjYXNlIFJlZ2lzdGVyOgorICAgICAgICBvdXQucHJpbnQoIigiLCBy
ZWcoKSwgIikiKTsKKyAgICAgICAgcmV0dXJuOworICAgIGNhc2UgU3RhY2s6CisgICAgICAgIG91
dC5wcmludCgiKCIsIG9mZnNldEZyb21GUCgpLCAiKSIpOworICAgICAgICByZXR1cm47CisgICAg
Y2FzZSBTdGFja0FyZ3VtZW50OgorICAgICAgICBvdXQucHJpbnQoIigiLCBvZmZzZXRGcm9tU1Ao
KSwgIikiKTsKKyAgICAgICAgcmV0dXJuOworICAgIGNhc2UgQ29uc3RhbnQ6CisgICAgICAgIG91
dC5wcmludCgiKCIsIHZhbHVlKCksICIpIik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAg
UkVMRUFTRV9BU1NFUlRfTk9UX1JFQUNIRUQoKTsKK30KKworfSB9IC8vIG5hbWVzcGFjZSBKU0M6
OkIzCisKK25hbWVzcGFjZSBXVEYgeworCit1c2luZyBuYW1lc3BhY2UgSlNDOjpCMzsKKwordm9p
ZCBwcmludEludGVybmFsKFByaW50U3RyZWFtJiBvdXQsIFZhbHVlUmVwOjpLaW5kIGtpbmQpCit7
CisgICAgc3dpdGNoIChraW5kKSB7CisgICAgY2FzZSBWYWx1ZVJlcDo6QW55OgorICAgICAgICBv
dXQucHJpbnQoIkFueSIpOworICAgICAgICByZXR1cm47CisgICAgY2FzZSBWYWx1ZVJlcDo6U29t
ZVJlZ2lzdGVyOgorICAgICAgICBvdXQucHJpbnQoIlNvbWVSZWdpc3RlciIpOworICAgICAgICBy
ZXR1cm47CisgICAgY2FzZSBWYWx1ZVJlcDo6UmVnaXN0ZXI6CisgICAgICAgIG91dC5wcmludCgi
UmVnaXN0ZXIiKTsKKyAgICAgICAgcmV0dXJuOworICAgIGNhc2UgVmFsdWVSZXA6OlN0YWNrOgor
ICAgICAgICBvdXQucHJpbnQoIlN0YWNrIik7CisgICAgICAgIHJldHVybjsKKyAgICBjYXNlIFZh
bHVlUmVwOjpTdGFja0FyZ3VtZW50OgorICAgICAgICBvdXQucHJpbnQoIlN0YWNrQXJndW1lbnQi
KTsKKyAgICAgICAgcmV0dXJuOworICAgIGNhc2UgVmFsdWVSZXA6OkNvbnN0YW50OgorICAgICAg
ICBvdXQucHJpbnQoIkNvbnN0YW50Iik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgUkVM
RUFTRV9BU1NFUlRfTk9UX1JFQUNIRUQoKTsKK30KKworfSAvLyBuYW1lc3BhY2UgV1RGCisKSW5k
ZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM1ZhbHVlUmVwLmgKPT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0g
U291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzVmFsdWVSZXAuaAkocmV2aXNpb24gMCkKKysrIFNv
dXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM1ZhbHVlUmVwLmgJKHdvcmtpbmcgY29weSkKQEAgLTAs
MCArMSwxNTYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTUgQXBwbGUgSW5jLiBBbGwgcmln
aHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFu
ZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVy
bWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0
OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBh
Ym92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5k
IHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5h
cnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2Us
IHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4g
dGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQg
d2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQg
QlkgQVBQTEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdB
UlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQg
V0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxB
UgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElO
Qy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNU
LCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERB
TUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0Yg
U1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQ
Uk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBB
TlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBM
SUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0Up
IEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwg
RVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8K
KworI2lmbmRlZiBCM1ZhbHVlUmVwX2gKKyNkZWZpbmUgQjNWYWx1ZVJlcF9oCisKKyNpbmNsdWRl
ICJSZWcuaCIKKyNpbmNsdWRlIDx3dGYvUHJpbnRTdHJlYW0uaD4KKworbmFtZXNwYWNlIEpTQyB7
IG5hbWVzcGFjZSBCMyB7CisKKy8vIFdlIHVzZSB0aGlzIGNsYXNzIHRvIGRlc2NyaWJlIHZhbHVl
IHJlcHJlc2VudGF0aW9ucyBhdCBzdGFja21hcHMuIEl0J3MgdXNlZCBib3RoIHRvIGZvcmNlIGEK
Ky8vIHJlcHJlc2VudGF0aW9uIGFuZCB0byBnZXQgdGhlIHJlcHJlc2VudGF0aW9uLiBXaGVuIHRo
ZSBCMyBjbGllbnQgZm9yY2VzIGEgcmVwcmVzZW50YXRpb24sIHdlIHNheQorLy8gdGhhdCBpdCdz
IGFuIGlucHV0LiBXaGVuIEIzIHRlbGxzIHRoZSBjbGllbnQgd2hhdCByZXByZXNlbnRhdGlvbiBp
dCBwaWNrZWQsIHdlIHNheSB0aGF0IGl0J3MgYW4KKy8vIG91dHB1dC4KKworY2xhc3MgVmFsdWVS
ZXAgeworcHVibGljOgorICAgIGVudW0gS2luZCB7CisgICAgICAgIC8vIEFzIGFuIGlucHV0IHJl
cHJlc2VudGF0aW9uLCB0aGlzIG1lYW5zIHRoYXQgQjMgY2FuIHBpY2sgYW55IHJlcHJlc2VudGF0
aW9uLgorICAgICAgICBBbnksCisKKyAgICAgICAgLy8gQXMgYW4gaW5wdXQgcmVwcmVzZW50YXRp
b24sIHRoaXMgbWVhbnMgdGhhdCBCMyBzaG91bGQgcGljayBzb21lIHJlZ2lzdGVyLCBwcm92aWRl
ZCB0aGF0CisgICAgICAgIC8vIGl0J3Mgbm90IGFsc28gYSByZWdpc3RlciB0aGF0IHdhcyBjbG9i
YmVyZWQuCisgICAgICAgIFNvbWVSZWdpc3RlciwKKworICAgICAgICAvLyBBcyBhbiBpbnB1dCBy
ZXByZXNlbnRhdGlvbiwgdGhpcyBmb3JjZXMgYSBwYXJ0aWN1bGFyIHJlZ2lzdGVyLiBBcyBhbiBv
dXRwdXQKKyAgICAgICAgLy8gcmVwcmVzZW50YXRpb24sIHRoaXMgdGVsbHMgdXMgd2hhdCByZWdp
c3RlciBCMyBwaWNrZWQuCisgICAgICAgIFJlZ2lzdGVyLAorCisgICAgICAgIC8vIEFzIGFuIG91
dHB1dCByZXByZXNlbnRhdGlvbiwgdGhpcyB0ZWxscyB1cyB3aGF0IHN0YWNrIHNsb3QgQjMgcGlj
a2VkLiBJdCdzIG5vdCBhIHZhbGlkCisgICAgICAgIC8vIGlucHV0IHJlcHJlc2VudGF0aW9uLgor
ICAgICAgICBTdGFjaywKKworICAgICAgICAvLyBBcyBhbiBpbnB1dCByZXByZXNlbnRhdGlvbiwg
dGhpcyBmb3JjZXMgdGhlIHZhbHVlIHRvIGVuZCB1cCBpbiB0aGUgYXJndW1lbnQgYXJlYSBhdCBz
b21lCisgICAgICAgIC8vIG9mZnNldC4KKyAgICAgICAgU3RhY2tBcmd1bWVudCwKKworICAgICAg
ICAvLyBBcyBhbiBvdXRwdXQgcmVwcmVzZW50YXRpb24sIHRoaXMgdGVsbHMgdXMgdGhhdCBCMyBj
b25zdGFudC1mb2xkZWQgdGhlIHZhbHVlLgorICAgICAgICBDb25zdGFudAorICAgIH07CisgICAg
CisgICAgVmFsdWVSZXAoKQorICAgICAgICA6IG1fa2luZChBbnkpCisgICAgeworICAgIH0KKwor
ICAgIGV4cGxpY2l0IFZhbHVlUmVwKFJlZyByZWcpCisgICAgICAgIDogbV9raW5kKFJlZ2lzdGVy
KQorICAgICAgICAsIG1fdmFsdWUocmVnLmluZGV4KCkpCisgICAgeworICAgIH0KKworICAgIHN0
YXRpYyBWYWx1ZVJlcCByZWcoUmVnIHJlZykKKyAgICB7CisgICAgICAgIHJldHVybiBWYWx1ZVJl
cChyZWcpOworICAgIH0KKworICAgIHN0YXRpYyBWYWx1ZVJlcCBzdGFjayhpbnRwdHJfdCBvZmZz
ZXRGcm9tRlApCisgICAgeworICAgICAgICBWYWx1ZVJlcCByZXN1bHQ7CisgICAgICAgIHJlc3Vs
dC5tX2tpbmQgPSBTdGFjazsKKyAgICAgICAgcmVzdWx0Lm1fdmFsdWUgPSBvZmZzZXRGcm9tRlA7
CisgICAgfQorCisgICAgc3RhdGljIFZhbHVlUmVwIHN0YWNrQXJndW1lbnQoaW50cHRyX3Qgb2Zm
c2V0RnJvbVNQKQorICAgIHsKKyAgICAgICAgVmFsdWVSZXAgcmVzdWx0OworICAgICAgICByZXN1
bHQubV9raW5kID0gU3RhY2tBcmd1bWVudDsKKyAgICAgICAgcmVzdWx0Lm1fdmFsdWUgPSBvZmZz
ZXRGcm9tU1A7CisgICAgfQorCisgICAgc3RhdGljIFZhbHVlUmVwIGNvbnN0YW50KGludDY0X3Qg
dmFsdWUpCisgICAgeworICAgICAgICBWYWx1ZVJlcCByZXN1bHQ7CisgICAgICAgIHJlc3VsdC5t
X2tpbmQgPSBDb25zdGFudDsKKyAgICAgICAgcmVzdWx0Lm1fdmFsdWUgPSB2YWx1ZTsKKyAgICB9
CisKKyAgICBzdGF0aWMgVmFsdWVSZXAgY29uc3RhbnQoZG91YmxlIHZhbHVlKQorICAgIHsKKyAg
ICAgICAgcmV0dXJuIFZhbHVlUmVwKGJpdHdpc2VfY2FzdDxpbnQ2NF90Pih2YWx1ZSkpOworICAg
IH0KKworICAgIEtpbmQga2luZCgpIGNvbnN0IHsgcmV0dXJuIG1fa2luZDsgfQorCisgICAgZXhw
bGljaXQgb3BlcmF0b3IgYm9vbCgpIGNvbnN0IHsgcmV0dXJuIGtpbmQoKSAhPSBBbnk7IH0KKwor
ICAgIFJlZyByZWcoKSBjb25zdAorICAgIHsKKyAgICAgICAgQVNTRVJUKGtpbmQoKSA9PSBSZWdp
c3Rlcik7CisgICAgICAgIHJldHVybiBSZWc6OmZyb21JbmRleChtX3ZhbHVlKTsKKyAgICB9CisK
KyAgICBpbnRwdHJfdCBvZmZzZXRGcm9tRlAoKSBjb25zdAorICAgIHsKKyAgICAgICAgQVNTRVJU
KGtpbmQoKSA9PSBTdGFjayk7CisgICAgICAgIHJldHVybiBzdGF0aWNfY2FzdDxpbnRwdHJfdD4o
bV92YWx1ZSk7CisgICAgfQorCisgICAgaW50cHRyX3Qgb2Zmc2V0RnJvbVNQKCkgY29uc3QKKyAg
ICB7CisgICAgICAgIEFTU0VSVChraW5kKCkgPT0gU3RhY2tBcmd1bWVudCk7CisgICAgICAgIHJl
dHVybiBzdGF0aWNfY2FzdDxpbnRwdHJfdD4obV92YWx1ZSk7CisgICAgfQorCisgICAgaW50NjRf
dCB2YWx1ZSgpIGNvbnN0CisgICAgeworICAgICAgICBBU1NFUlQoa2luZCgpID09IENvbnN0YW50
KTsKKyAgICAgICAgcmV0dXJuIG1fdmFsdWU7CisgICAgfQorCisgICAgZG91YmxlIGRvdWJsZVZh
bHVlKCkgY29uc3QKKyAgICB7CisgICAgICAgIHJldHVybiBiaXR3aXNlX2Nhc3Q8ZG91YmxlPih2
YWx1ZSgpKTsKKyAgICB9CisKKyAgICB2b2lkIGR1bXAoUHJpbnRTdHJlYW0mKSBjb25zdDsKKwor
cHJpdmF0ZToKKyAgICBLaW5kIG1fa2luZDsKKyAgICBpbnQ2NF90IG1fdmFsdWU7Cit9OworCit9
IH0gLy8gbmFtZXNwYWNlIEpTQzo6QjMKKworbmFtZXNwYWNlIFdURiB7CisKK3ZvaWQgcHJpbnRJ
bnRlcm5hbChQcmludFN0cmVhbSYsIEpTQzo6QjM6OlZhbHVlUmVwOjpLaW5kKTsKKworfSAvLyBu
YW1lc3BhY2UgV1RGCisKKyNlbmRpZiAvLyBCM1ZhbHVlUmVwX2gKKwpJbmRleDogU291cmNlL0ph
dmFTY3JpcHRDb3JlL2IzL2dlbmVyYXRlX3BhdHRlcm5fbWF0Y2hlci5yYgo9PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0t
LSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvZ2VuZXJhdGVfcGF0dGVybl9tYXRjaGVyLnJiCShy
ZXZpc2lvbiAwKQorKysgU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL2dlbmVyYXRlX3BhdHRlcm5f
bWF0Y2hlci5yYgkod29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDQ3NSBAQAorIyEvdXNyL2Jpbi9l
bnYgcnVieQorCisjIENvcHlyaWdodCAoQykgMjAxNSBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVz
ZXJ2ZWQuCisjCisjIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkg
Zm9ybXMsIHdpdGggb3Igd2l0aG91dAorIyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJv
dmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyMgYXJlIG1ldDoKKyMgMS4gUmVk
aXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmln
aHQKKyMgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2lu
ZyBkaXNjbGFpbWVyLgorIyAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCBy
ZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorIyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBj
b25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisjICAgIGRvY3Vt
ZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmli
dXRpb24uCisjCisjIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBBTkQg
SVRTIENPTlRSSUJVVE9SUyBgYEFTIElTJycKKyMgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQg
V0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisjIFRIRSBJTVBMSUVE
IFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VM
QVIKKyMgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5D
LiBPUiBJVFMgQ09OVFJJQlVUT1JTCisjIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJF
Q1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKKyMgQ09OU0VRVUVOVElBTCBE
QU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKKyMg
U1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJ
VFM7IE9SIEJVU0lORVNTCisjIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFO
WSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOCisjIENPTlRSQUNULCBTVFJJQ1QgTElB
QklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisjIEFS
SVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElG
IEFEVklTRUQgT0YKKyMgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCityZXF1aXJl
ICJwYXRobmFtZSIKKworJHZhckluZGV4ID0gMAorZGVmIG5ld1ZhcgorICAgICR2YXJJbmRleCAr
PSAxCisgICAgIl90bXAjeyR2YXJJbmRleH0iCitlbmQKKworY2xhc3MgUHJvZHVjdGlvbgorICAg
IGF0dHJfcmVhZGVyIDpvcmlnaW4sIDpuYW1lLCA6dmFyTmFtZSwgOmFub255bW91cywgOm9wY29k
ZSwgOmNoaWxkcmVuCisKKyAgICBkZWYgaW5pdGlhbGl6ZShvcmlnaW4sIG5hbWUsIG9wY29kZSwg
Y2hpbGRyZW4pCisgICAgICAgIEBvcmlnaW4gPSBvcmlnaW4KKyAgICAgICAgQG5hbWUgPSBuYW1l
CisgICAgICAgIEBhbm9ueW1vdXMgPSAobmFtZSA9PSBuaWwgb3IgbmFtZSA9fiAvXEFcJChbMC05
XSspXFovKQorICAgICAgICBAdmFyTmFtZSA9IEBhbm9ueW1vdXMgPyBuZXdWYXIgOiBuYW1lCisg
ICAgICAgIEBvcGNvZGUgPSBvcGNvZGUKKyAgICAgICAgQGNoaWxkcmVuID0gY2hpbGRyZW4gPyBj
aGlsZHJlbiA6IFtdCisgICAgZW5kCisKKyAgICBkZWYgaGFzT3Bjb2RlCisgICAgICAgIG9wY29k
ZSAhPSBuaWwKKyAgICBlbmQKKworICAgIGRlZiBlYWNoVmFyaWFibGUoJnByb2MpCisgICAgICAg
IGNoaWxkcmVuLmVhY2hfd2l0aF9pbmRleCB7CisgICAgICAgICAgICB8IGNoaWxkLCBpbmRleCB8
CisgICAgICAgICAgICB5aWVsZCB2YXJOYW1lLAorICAgICAgICAgICAgICAgICAgY2hpbGQubmFt
ZSwKKyAgICAgICAgICAgICAgICAgIGNoaWxkLnZhck5hbWUsCisgICAgICAgICAgICAgICAgICBj
aGlsZC5hbm9ueW1vdXMgPyAoY2hpbGQub3Bjb2RlID8gOmFub25JbnRlcm5hbCA6IDphbm9uT3Bl
cmFuZCkgOiAoY2hpbGQub3Bjb2RlID8gOmludGVybmFsIDogOm9wZXJhbmQpLAorICAgICAgICAg
ICAgICAgICAgaW5kZXgKKyAgICAgICAgICAgIGNoaWxkLmVhY2hWYXJpYWJsZSgmcHJvYykKKyAg
ICAgICAgfQorICAgIGVuZAorZW5kCisKK2NsYXNzIE1hdGNoZXIKKyAgICBhdHRyX3JlYWRlciA6
bmFtZSwgOnByb2R1Y3Rpb25zCisKKyAgICBkZWYgaW5pdGlhbGl6ZShuYW1lLCBwcm9kdWN0aW9u
cykKKyAgICAgICAgQG5hbWUgPSBuYW1lCisgICAgICAgIEBwcm9kdWN0aW9ucyA9IHByb2R1Y3Rp
b25zCisgICAgZW5kCitlbmQKKworY2xhc3MgT3JpZ2luCisgICAgYXR0cl9yZWFkZXIgOmZpbGVO
YW1lLCA6bGluZU51bWJlcgorICAgIAorICAgIGRlZiBpbml0aWFsaXplKGZpbGVOYW1lLCBsaW5l
TnVtYmVyKQorICAgICAgICBAZmlsZU5hbWUgPSBmaWxlTmFtZQorICAgICAgICBAbGluZU51bWJl
ciA9IGxpbmVOdW1iZXIKKyAgICBlbmQKKyAgICAKKyAgICBkZWYgdG9fcworICAgICAgICAiI3tm
aWxlTmFtZX06I3tsaW5lTnVtYmVyfSIKKyAgICBlbmQKK2VuZAorCitjbGFzcyBUb2tlbgorICAg
IGF0dHJfcmVhZGVyIDpvcmlnaW4sIDpzdHJpbmcKKyAgICAKKyAgICBkZWYgaW5pdGlhbGl6ZShv
cmlnaW4sIHN0cmluZykKKyAgICAgICAgQG9yaWdpbiA9IG9yaWdpbgorICAgICAgICBAc3RyaW5n
ID0gc3RyaW5nCisgICAgZW5kCisgICAgCisgICAgZGVmID09KG90aGVyKQorICAgICAgICBpZiBv
dGhlci5pc19hPyBUb2tlbgorICAgICAgICAgICAgQHN0cmluZyA9PSBvdGhlci5zdHJpbmcKKyAg
ICAgICAgZWxzZQorICAgICAgICAgICAgQHN0cmluZyA9PSBvdGhlcgorICAgICAgICBlbmQKKyAg
ICBlbmQKKyAgICAKKyAgICBkZWYgPX4ob3RoZXIpCisgICAgICAgIEBzdHJpbmcgPX4gb3RoZXIK
KyAgICBlbmQKKyAgICAKKyAgICBkZWYgdG9fcworICAgICAgICAiI3tAc3RyaW5nLmluc3BlY3R9
IGF0ICN7b3JpZ2lufSIKKyAgICBlbmQKKyAgICAKKyAgICBkZWYgcGFyc2VFcnJvcigqY29tbWVu
dCkKKyAgICAgICAgaWYgY29tbWVudC5lbXB0eT8KKyAgICAgICAgICAgIHJhaXNlICJQYXJzZSBl
cnJvcjogI3t0b19zfSIKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcmFpc2UgIlBhcnNlIGVy
cm9yOiAje3RvX3N9OiAje2NvbW1lbnRbMF19IgorICAgICAgICBlbmQKKyAgICBlbmQKK2VuZAor
CitkZWYgbGV4KHN0ciwgZmlsZU5hbWUpCisgICAgZmlsZU5hbWUgPSBQYXRobmFtZS5uZXcoZmls
ZU5hbWUpCisgICAgcmVzdWx0ID0gW10KKyAgICBsaW5lTnVtYmVyID0gMQorICAgIHdoaWxlIG5v
dCBzdHIuZW1wdHk/CisgICAgICAgIGNhc2Ugc3RyCisgICAgICAgIHdoZW4gL1xBXCMoW15cbl0q
KS8KKyAgICAgICAgICAgICMgY29tbWVudCwgaWdub3JlCisgICAgICAgIHdoZW4gL1xBXG4vCisg
ICAgICAgICAgICAjIG5ld2xpbmUsIGlnbm9yZQorICAgICAgICAgICAgbGluZU51bWJlciArPSAx
CisgICAgICAgIHdoZW4gL1xBW2EtekEtWjAtOSRdKFthLXpBLVowLTlfXSopLworICAgICAgICAg
ICAgcmVzdWx0IDw8IFRva2VuLm5ldyhPcmlnaW4ubmV3KGZpbGVOYW1lLCBsaW5lTnVtYmVyKSwg
JCYpCisgICAgICAgIHdoZW4gL1xBKFsgXHRccl0rKS8KKyAgICAgICAgICAgICMgd2hpdGVzcGFj
ZSwgaWdub3JlCisgICAgICAgIHdoZW4gL1xBWz0oKSxdLworICAgICAgICAgICAgcmVzdWx0IDw8
IFRva2VuLm5ldyhPcmlnaW4ubmV3KGZpbGVOYW1lLCBsaW5lTnVtYmVyKSwgJCYpCisgICAgICAg
IGVsc2UKKyAgICAgICAgICAgIHJhaXNlICJMZXhlciBlcnJvciBhdCAje09yaWdpbi5uZXcoZmls
ZU5hbWUsIGxpbmVOdW1iZXIpLnRvX3N9LCB1bmV4cGVjdGVkIHNlcXVlbmNlICN7c3RyWzAuLjIw
XS5pbnNwZWN0fSIKKyAgICAgICAgZW5kCisgICAgICAgIHN0ciA9ICR+LnBvc3RfbWF0Y2gKKyAg
ICBlbmQKKyAgICByZXN1bHQKK2VuZAorCitkZWYgaXNLZXl3b3JkKHRva2VuKQorICAgICMgV2Ug
Y2FuIGV4dGVuZCB0aGlzIGFzIHdlIGFkZCBtb3JlIGtleXdvcmRzLiBMaWtlLCB3ZSBtaWdodCB3
YW50ICJpbmNsdWRlIiBldmVudHVhbGx5LgorICAgIHRva2VuID1+IC9cQSgobWF0Y2hlcikpXFov
CitlbmQKKworZGVmIGlzSWRlbnRpZmllcih0b2tlbikKKyAgICB0b2tlbiA9fiAvXEFbYS16QS1a
MC05JF0oW2EtekEtWjAtOV9dKilcWi8gYW5kIG5vdCBpc0tleXdvcmQodG9rZW4pCitlbmQKKwor
Y2xhc3MgUGFyc2VyCisgICAgZGVmIGluaXRpYWxpemUoZGF0YSwgZmlsZU5hbWUpCisgICAgICAg
IEB0b2tlbnMgPSBsZXgoZGF0YSwgZmlsZU5hbWUpCisgICAgICAgIEBpZHggPSAwCisgICAgZW5k
CisKKyAgICBkZWYgdG9rZW4KKyAgICAgICAgQHRva2Vuc1tAaWR4XQorICAgIGVuZAorCisgICAg
ZGVmIGFkdmFuY2UKKyAgICAgICAgQGlkeCArPSAxCisgICAgZW5kCisKKyAgICBkZWYgcGFyc2VF
cnJvcigqY29tbWVudCkKKyAgICAgICAgaWYgdG9rZW4KKyAgICAgICAgICAgIHRva2VuLnBhcnNl
RXJyb3IoKmNvbW1lbnQpCisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGlmIGNvbW1lbnQuZW1w
dHk/CisgICAgICAgICAgICAgICAgcmFpc2UgIlBhcnNlIGVycm9yIGF0IGVuZCBvZiBmaWxlIgor
ICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHJhaXNlICJQYXJzZSBlcnJvciBhdCBl
bmQgb2YgZmlsZTogI3tjb21tZW50WzBdfSIKKyAgICAgICAgICAgIGVuZAorICAgICAgICBlbmQK
KyAgICBlbmQKKworICAgIGRlZiBjb25zdW1lKHN0cmluZykKKyAgICAgICAgcGFyc2VFcnJvcigi
RXhwZWN0ZWQgI3tzdHJpbmd9IikgdW5sZXNzIHRva2VuID09IHN0cmluZworICAgICAgICBhZHZh
bmNlCisgICAgZW5kCisKKyAgICBkZWYgY29uc3VtZUlkZW50aWZpZXIKKyAgICAgICAgcmVzdWx0
ID0gdG9rZW4uc3RyaW5nCisgICAgICAgIHBhcnNlRXJyb3IoIkV4cGVjdGVkIGlkZW50aWZpZXIi
KSB1bmxlc3MgaXNJZGVudGlmaWVyKHJlc3VsdCkKKyAgICAgICAgYWR2YW5jZQorICAgICAgICBy
ZXN1bHQKKyAgICBlbmQKKworICAgIGRlZiBhZGRVbmlxdWUobmFtZSwgcHJvZHVjdGlvbnMsIHBy
b2R1Y3Rpb24pCisgICAgICAgIGlmIG5hbWUgPT0gcHJvZHVjdGlvbi52YXJOYW1lCisgICAgICAg
ICAgICBwYXJzZUVycm9yKCJDaGlsZCBwcm9kdWN0aW9uIGhhcyBzYW1lIG5hbWUgYXMgcGFyZW50
IHByb2R1Y3Rpb24iKQorICAgICAgICBlbmQKKyAgICAgICAgaWYgcHJvZHVjdGlvbnMuZGV0ZWN0
IHsgfCBlbnRyeSB8IGVudHJ5Lm5hbWUgPT0gcHJvZHVjdGlvbi5uYW1lIH0KKyAgICAgICAgICAg
IHBhcnNlRXJyb3IoIkR1cGxpY2F0ZSBwcm9kdWN0aW9uIikKKyAgICAgICAgZW5kCisgICAgICAg
IHByb2R1Y3Rpb25zIDw8IHByb2R1Y3Rpb24KKyAgICBlbmQKKworICAgIGRlZiBwYXJzZQorICAg
ICAgICBjb25zdW1lKCJtYXRjaGVyIikKKworICAgICAgICBtYXRjaGVyTmFtZSA9IGNvbnN1bWVJ
ZGVudGlmaWVyCisKKyAgICAgICAgcHJvZHVjdGlvbnMgPSBbXQorCisgICAgICAgIGxvb3Agewor
ICAgICAgICAgICAgYnJlYWsgaWYgQGlkeCA+PSBAdG9rZW5zLmxlbmd0aAorCisgICAgICAgICAg
ICAjIFdlIG1pZ2h0IHdhbnQgdG8gc3VwcG9ydCAiaW5jbHVkZSIuIElmIHdlIGRpZCB0aGF0LCBp
dCB3b3VsZCBnbyBoZXJlLgorICAgICAgICAgICAgYWRkVW5pcXVlKG1hdGNoZXJOYW1lLCBwcm9k
dWN0aW9ucywgcGFyc2VQcm9kdWN0aW9uKQorICAgICAgICB9CisKKyAgICAgICAgTWF0Y2hlci5u
ZXcobWF0Y2hlck5hbWUsIHByb2R1Y3Rpb25zKQorICAgIGVuZAorCisgICAgZGVmIHBhcnNlUHJv
ZHVjdGlvbgorICAgICAgICBvcmlnaW4gPSB0b2tlbi5vcmlnaW4KKyAgICAgICAgbmFtZSA9IGNv
bnN1bWVJZGVudGlmaWVyCisKKyAgICAgICAgaWYgdG9rZW4gPT0gIj0iCisgICAgICAgICAgICBj
b25zdW1lKCI9IikKKyAgICAgICAgICAgIG9wY29kZSA9IGNvbnN1bWVJZGVudGlmaWVyCisgICAg
ICAgICAgICBjb25zdW1lKCIoIikKKyAgICAgICAgZWxzaWYgdG9rZW4gPT0gIigiCisgICAgICAg
ICAgICBjb25zdW1lKCIoIikKKyAgICAgICAgICAgIG9wY29kZSA9IG5hbWUKKyAgICAgICAgICAg
IG5hbWUgPSBuaWwKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcmV0dXJuIFByb2R1Y3Rpb24u
bmV3KG9yaWdpbiwgbmFtZSwgbmlsLCBuaWwpCisgICAgICAgIGVuZAorICAgICAgICAKKyAgICAg
ICAgcHJvZHVjdGlvbnMgPSBbXQorICAgICAgICBsb29wIHsKKyAgICAgICAgICAgIGJyZWFrIGlm
IHRva2VuID09ICIpIgorCisgICAgICAgICAgICBhZGRVbmlxdWUobmFtZSwgcHJvZHVjdGlvbnMs
IHBhcnNlUHJvZHVjdGlvbikKKworICAgICAgICAgICAgYnJlYWsgaWYgdG9rZW4gPT0gIikiCisg
ICAgICAgICAgICBjb25zdW1lKCIsIikKKyAgICAgICAgfQorCisgICAgICAgICMgQWR2YW5jZSBh
ZnRlciB0aGUgIikiCisgICAgICAgIGFkdmFuY2UKKworICAgICAgICBQcm9kdWN0aW9uLm5ldyhv
cmlnaW4sIG5hbWUsIG9wY29kZSwgcHJvZHVjdGlvbnMpCisgICAgZW5kCitlbmQKKworZmlsZU5h
bWUgPSBBUkdWWzBdCisKK3BhcnNlciA9IFBhcnNlci5uZXcoSU86OnJlYWQoZmlsZU5hbWUpLCBm
aWxlTmFtZSkKK21hdGNoZXIgPSBwYXJzZXIucGFyc2UKKworY2xhc3MgU3ViTWF0Y2gKKyAgICBh
dHRyX3JlYWRlciA6aW5kZXhNYXAsIDpwcm9kdWN0aW9ucworICAgIAorICAgIGRlZiBpbml0aWFs
aXplKGluZGV4TGlzdCwgcHJvZHVjdGlvbnMpCisgICAgICAgIEBpbmRleE1hcCA9IFtdCisgICAg
ICAgIEBwcm9kdWN0aW9ucyA9IFtdCisgICAgICAgIGluZGV4TGlzdC5lYWNoIHsKKyAgICAgICAg
ICAgIHwgaW5kZXggfAorICAgICAgICAgICAgQGluZGV4TWFwIDw8IGluZGV4CisgICAgICAgICAg
ICBAcHJvZHVjdGlvbnMgPDwgcHJvZHVjdGlvbnNbaW5kZXhdCisgICAgICAgIH0KKyAgICBlbmQK
KworICAgIGRlZiBtYXBJbmRleExpc3QoaW5kZXhMaXN0KQorICAgICAgICBpbmRleExpc3QubWFw
IHsKKyAgICAgICAgICAgIHwgaW5kZXggfAorICAgICAgICAgICAgQGluZGV4TWFwW2luZGV4XQor
ICAgICAgICB9CisgICAgZW5kCitlbmQKKworRmlsZS5vcGVuKCJCMyIgKyBtYXRjaGVyLm5hbWUg
KyAiLmgiLCAidyIpIHsKKyAgICB8IG91dHAgfAorCisgICAgb3V0cC5wdXRzICIvLyBHZW5lcmF0
ZWQgYnkgZ2VuZXJhdGVfcGF0dGVybl9tYXRjaGVyLnJiIGZyb20gI3tmaWxlTmFtZX0gLS0gZG8g
bm90IGVkaXQhIgorCisgICAgb3V0cC5wdXRzICIjaWZuZGVmIEIzI3ttYXRjaGVyLm5hbWV9X2gi
CisgICAgb3V0cC5wdXRzICIjZGVmaW5lIEIzI3ttYXRjaGVyLm5hbWV9X2giCisgICAgCisgICAg
b3V0cC5wdXRzICIjaW5jbHVkZSBcIkIzVmFsdWUuaFwiIgorICAgIAorICAgIG91dHAucHV0cyAi
bmFtZXNwYWNlIEpTQyB7IG5hbWVzcGFjZSBCMyB7IgorCisgICAgb3V0cC5wdXRzICJ0ZW1wbGF0
ZTx0eXBlbmFtZSBBZGFwdG9yPiIKKyAgICBvdXRwLnB1dHMgInZvaWQgcnVuI3ttYXRjaGVyLm5h
bWV9KFZhbHVlKiBfdmFsdWUsIEFkYXB0b3ImIGFkYXB0b3IpIgorICAgIG91dHAucHV0cyAieyIK
KworICAgICMgTm90ZSB0aGF0IHRoaXMgZG9lcyBub3QgZW1pdCBwcm9wZXJseSBpbmRlbnRlZCBj
b2RlLCBiZWNhdXNlIGl0J3MgYSByZWN1cnNpdmUgZW1pdHRlci4gSWYgeW91CisgICAgIyB3YW50
IHRvIHNlZSB0aGUgY29kZSBuaWNlbHkgZm9ybWF0dGVkLCBvcGVuIGl0IGluIGEgZ29vZCB0ZXh0
IGVkaXRvciBhbmQgYXNrIGl0IHRvIGZvcm1hdCBpdAorICAgICMgZm9yIHlvdS4KKworICAgICMg
SW4gb2RkIHNpdHVhdGlvbnMsIHdlIG1heSBub3QgdXNlIHRoZSBpbnB1dCB2YWx1ZS4gVGVsbCB0
aGUgY29tcGlsZXIgdG8gY2hpbGwgb3V0IGFib3V0IGl0LgorICAgIG91dHAucHV0cyAiVU5VU0VE
X1BBUkFNKF92YWx1ZSk7IgorICAgICAgICAKKyAgICAjIFRoaXMganVzdCBwcm90ZWN0cyB0aGUg
Y2FsbGVyIGZyb20gaGF2aW5nIHRvIHdvcnJ5IGFib3V0IHByb2R1Y3Rpb25zIGhhdmluZyBkaWZm
ZXJlbnQgbGVuZ3Rocy4KKyAgICBkZWYgbWF0Y2hMZW5ndGgob3V0cCwgdmFsdWVOYW1lLCBwcm9k
dWN0aW9ucykKKyAgICAgICAgaW5kZXhMaXN0cyA9IFtdCisgICAgICAgIHByb2R1Y3Rpb25zLmVh
Y2hfd2l0aF9pbmRleCB7CisgICAgICAgICAgICB8IHByb2R1Y3Rpb24sIGluZGV4IHwKKyAgICAg
ICAgICAgIGlmIGluZGV4TGlzdHNbLTFdIGFuZCBwcm9kdWN0aW9uc1tpbmRleExpc3RzWy0xXVsw
XV0uY2hpbGRyZW4ubGVuZ3RoID09IHByb2R1Y3Rpb24uY2hpbGRyZW4ubGVuZ3RoCisgICAgICAg
ICAgICAgICAgaW5kZXhMaXN0c1stMV0gPDwgaW5kZXgKKyAgICAgICAgICAgIGVsc2UKKyAgICAg
ICAgICAgICAgICBpbmRleExpc3RzIDw8IFtpbmRleF0KKyAgICAgICAgICAgIGVuZAorICAgICAg
ICB9CisKKyAgICAgICAgaW5kZXhMaXN0cy5lYWNoIHsKKyAgICAgICAgICAgIHwgaW5kZXhMaXN0
IHwKKyAgICAgICAgICAgIGxlbmd0aCA9IHByb2R1Y3Rpb25zW2luZGV4TGlzdFswXV0uY2hpbGRy
ZW4ubGVuZ3RoCisgICAgICAgICAgICBpZiBsZW5ndGggPiAwCisgICAgICAgICAgICAgICAgb3V0
cC5wdXRzICJpZiAoI3t2YWx1ZU5hbWV9LT5jaGlsZHJlbi5zaXplKCkgPj0gI3tsZW5ndGh9KSB7
IgorICAgICAgICAgICAgICAgIHlpZWxkIGluZGV4TGlzdAorICAgICAgICAgICAgICAgIG91dHAu
cHV0cyAifSIKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB5aWVsZCBpbmRleExp
c3QKKyAgICAgICAgICAgIGVuZAorICAgICAgICB9CisgICAgZW5kCisKKyAgICAjIFRoaXMgZWZm
aWNpZW50bHkgc2VsZWN0cyBmcm9tIHRoZSBnaXZlbiBzZXQgb2YgcHJvZHVjdGlvbnMuIEl0IGFz
c3VtZXMgdGhhdCBwcm9kdWN0aW9ucworICAgICMgYXJlIG5vdCBkdXBsaWNhdGVkLiBJdCB5aWVs
ZHMgdGhlIGluZGV4IG9mIHRoZSBmb3VuZCBwcm9kdWN0aW9uLCBhbmQgdGhlIGNvcm91dGluZSBp
cworICAgICMgcmVzcG9uc2libGUgZm9yIGVtaXR0aW5nIHNwZWNpZmljIGNvZGUgZm9yIHRoYXQg
cHJvZHVjdGlvbi4gVGhlIGNvcm91dGluZSBpcyBnaXZlbiBsaXN0cyBvZgorICAgICMgaW5kaWNl
cyBvZiBwb3NzaWJseS1tYXRjaGluZyBwcm9kdWN0aW9ucy4KKyAgICBkZWYgbWF0Y2hQcm9kdWN0
aW9ucyhvdXRwLCB2YWx1ZU5hbWUsIHByb2R1Y3Rpb25zKQorICAgICAgICAjIEZpcnN0LCBzcGxp
dCB0aGUgcHJvZHVjdGlvbnMgbGlzdCBpbnRvIHJ1bnMgb2YgcHJvZHVjdGlvbnMgd2l0aCBhbiBv
cGNvZGUgYW5kIHByb2R1Y3Rpb25zCisgICAgICAgICMgd2l0aG91dCBvbmUuCisgICAgICAgIGlu
ZGV4TGlzdHMgPSBbXQorICAgICAgICBwcm9kdWN0aW9ucy5lYWNoX3dpdGhfaW5kZXggeworICAg
ICAgICAgICAgfCBwcm9kdWN0aW9uLCBpbmRleCB8CisgICAgICAgICAgICBpZiBpbmRleExpc3Rz
Wy0xXSBhbmQgcHJvZHVjdGlvbnNbaW5kZXhMaXN0c1stMV1bMF1dLmhhc09wY29kZSA9PSBwcm9k
dWN0aW9uLmhhc09wY29kZQorICAgICAgICAgICAgICAgIGluZGV4TGlzdHNbLTFdIDw8IGluZGV4
CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgaW5kZXhMaXN0cyA8PCBbaW5kZXhd
CisgICAgICAgICAgICBlbmQKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgIyBOb3csIGVt
aXQgcGF0dGVybiBtYXRjaGluZyBjb2RlLiBXZSBkbyBpdCBkaWZmZXJlbnRseSBmb3IgbGlzdHMg
d2l0aCBhbiBvcGNvZGUgdGhhbiBmb3IKKyAgICAgICAgIyBsaXN0cyB3aXRob3V0IG9uZS4KKyAg
ICAgICAgaW5kZXhMaXN0cy5lYWNoIHsKKyAgICAgICAgICAgIHwgaW5kZXhMaXN0IHwKKyAgICAg
ICAgICAgIGlmIHByb2R1Y3Rpb25zW2luZGV4TGlzdFswXV0uaGFzT3Bjb2RlCisgICAgICAgICAg
ICAgICAgIyBOb3csIHdlIHNwbGl0IHRoaXMgaW5kZXggbGlzdCBpbnRvIGdyb3VwcyBmb3IgZWFj
aCBvcGNvZGUuCisgICAgICAgICAgICAgICAgZ3JvdXBzID0ge30KKyAgICAgICAgICAgICAgICBp
bmRleExpc3QuZWFjaCB7CisgICAgICAgICAgICAgICAgICAgIHwgaW5kZXggfAorICAgICAgICAg
ICAgICAgICAgICBwcm9kdWN0aW9uID0gcHJvZHVjdGlvbnNbaW5kZXhdCisgICAgICAgICAgICAg
ICAgICAgIGlmIGdyb3Vwc1twcm9kdWN0aW9uLm9wY29kZV0KKyAgICAgICAgICAgICAgICAgICAg
ICAgIGdyb3Vwc1twcm9kdWN0aW9uLm9wY29kZV0gPDwgaW5kZXgKKyAgICAgICAgICAgICAgICAg
ICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgZ3JvdXBzW3Byb2R1Y3Rpb24ub3Bjb2Rl
XSA9IFtpbmRleF0KKyAgICAgICAgICAgICAgICAgICAgZW5kCisgICAgICAgICAgICAgICAgfQor
CisgICAgICAgICAgICAgICAgIyBFbWl0IGEgc3dpdGNoIHN0YXRlbWVudC4KKyAgICAgICAgICAg
ICAgICBvdXRwLnB1dHMgInN3aXRjaCAoI3t2YWx1ZU5hbWV9LT5vcGNvZGUoKSkgeyIKKyAgICAg
ICAgICAgICAgICBncm91cHMuZWFjaF9wYWlyIHsKKyAgICAgICAgICAgICAgICAgICAgfCBvcGNv
ZGUsIHN1YkluZGV4TGlzdCB8CisgICAgICAgICAgICAgICAgICAgIG91dHAucHV0cyAiY2FzZSAj
e29wY29kZX06IgorICAgICAgICAgICAgICAgICAgICBzdWJNYXRjaCA9IFN1Yk1hdGNoLm5ldyhz
dWJJbmRleExpc3QsIHByb2R1Y3Rpb25zKQorICAgICAgICAgICAgICAgICAgICBtYXRjaExlbmd0
aChvdXRwLCB2YWx1ZU5hbWUsIHN1Yk1hdGNoLnByb2R1Y3Rpb25zKSB7CisgICAgICAgICAgICAg
ICAgICAgICAgICB8IGluZGV4TGlzdCB8CisgICAgICAgICAgICAgICAgICAgICAgICB5aWVsZCBz
dWJNYXRjaC5tYXBJbmRleExpc3QoaW5kZXhMaXN0KQorICAgICAgICAgICAgICAgICAgICB9Cisg
ICAgICAgICAgICAgICAgICAgIG91dHAucHV0cyAiYnJlYWs7IgorICAgICAgICAgICAgICAgIH0K
KyAgICAgICAgICAgICAgICBvdXRwLnB1dHMgImRlZmF1bHQ6IgorICAgICAgICAgICAgICAgIG91
dHAucHV0cyAiYnJlYWs7IgorICAgICAgICAgICAgICAgIG91dHAucHV0cyAifSIKKyAgICAgICAg
ICAgIGVsc2UKKyAgICAgICAgICAgICAgICBzdWJNYXRjaCA9IFN1Yk1hdGNoLm5ldyhpbmRleExp
c3QsIHByb2R1Y3Rpb25zKQorICAgICAgICAgICAgICAgIG1hdGNoTGVuZ3RoKG91dHAsIHZhbHVl
TmFtZSwgc3ViTWF0Y2gucHJvZHVjdGlvbnMpIHsKKyAgICAgICAgICAgICAgICAgICAgfCBpbmRl
eExpc3QgfAorICAgICAgICAgICAgICAgICAgICB5aWVsZCBzdWJNYXRjaC5tYXBJbmRleExpc3Qo
aW5kZXhMaXN0KQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVuZAorICAgICAgICB9
CisgICAgZW5kCisKKyAgICAjIFRha2VzIHByb2R1Y3Rpb25zIHRoYXQgaGF2ZSB0aGUgc2FtZSBv
cGNvZGUgYW5kIHRoZSBzYW1lIGxlbmd0aCBhbmQgc2VsZWN0cyBmcm9tIHRoZW0gYmFzZWQgb24K
KyAgICAjIHRoZSBwcm9kdWN0aW9ucyBhdCB0aGUgZ2l2ZW4gY29sdW1uLgorICAgIGRlZiBtYXRj
aENvbHVtbihvdXRwLCB2YWx1ZU5hbWUsIHByb2R1Y3Rpb25zLCBjb2x1bW5JbmRleCkKKyAgICAg
ICAgaWYgY29sdW1uSW5kZXggPj0gcHJvZHVjdGlvbnNbMF0uY2hpbGRyZW4ubGVuZ3RoCisgICAg
ICAgICAgICB5aWVsZCAoMC4uLihwcm9kdWN0aW9ucy5zaXplKSkudG9fYQorICAgICAgICAgICAg
cmV0dXJuCisgICAgICAgIGVuZAorCisgICAgICAgIHN1YlZhbHVlID0gbmV3VmFyCisgICAgICAg
IAorICAgICAgICBvdXRwLnB1dHMgInsiCisgICAgICAgIG91dHAucHV0cyAiVmFsdWUqICN7c3Vi
VmFsdWV9ID0gI3t2YWx1ZU5hbWV9LT5jaGlsZCgje2NvbHVtbkluZGV4fSk7IgorCisgICAgICAg
ICMgV2UgbWF5IG5vdCB1c2UgdGhpcyB2YWx1ZS4gVGVsbCB0aGUgY29tcGlsZXIgdG8gY2hpbGwg
b3V0IGFib3V0IGl0LgorICAgICAgICBvdXRwLnB1dHMgIlVOVVNFRF9QQVJBTSgje3N1YlZhbHVl
fSk7IgorICAgICAgICAKKyAgICAgICAgc3ViUHJvZHVjdGlvbnMgPSBwcm9kdWN0aW9ucy5tYXAg
eworICAgICAgICAgICAgfCBwcm9kdWN0aW9uIHwKKyAgICAgICAgICAgIHByb2R1Y3Rpb24uY2hp
bGRyZW5bY29sdW1uSW5kZXhdCisgICAgICAgIH0KKworICAgICAgICBtYXRjaFJlY3Vyc2l2ZWx5
KG91dHAsIHN1YlZhbHVlLCBzdWJQcm9kdWN0aW9ucykgeworICAgICAgICAgICAgfCBpbmRleExp
c3QgfAorICAgICAgICAgICAgc3ViTWF0Y2ggPSBTdWJNYXRjaC5uZXcoaW5kZXhMaXN0LCBwcm9k
dWN0aW9ucykKKyAgICAgICAgICAgIG1hdGNoQ29sdW1uKG91dHAsIHZhbHVlTmFtZSwgc3ViTWF0
Y2gucHJvZHVjdGlvbnMsIGNvbHVtbkluZGV4ICsgMSkgeworICAgICAgICAgICAgICAgIHwgaW5k
ZXhMaXN0IHwKKyAgICAgICAgICAgICAgICB5aWVsZCBzdWJNYXRjaC5tYXBJbmRleExpc3QoaW5k
ZXhMaXN0KQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgb3V0cC5wdXRzICJ9
IgorICAgIGVuZAorCisgICAgZGVmIG1hdGNoUmVjdXJzaXZlbHkob3V0cCwgdmFsdWVOYW1lLCBw
cm9kdWN0aW9ucykKKyAgICAgICAgbWF0Y2hQcm9kdWN0aW9ucyhvdXRwLCB2YWx1ZU5hbWUsIHBy
b2R1Y3Rpb25zKSB7CisgICAgICAgICAgICB8IGluZGV4TGlzdCB8CisgICAgICAgICAgICAjIFdl
IGFyZSBndWFyYW50ZWVkIHRoYXQgdGhpcyBpbmRleCBsaXN0IGNvbnRhaW5zIHByb2R1Y3Rpb25z
IHdpdGggdGhlIHNhbWUgb3Bjb2RlIGFuZAorICAgICAgICAgICAgIyB0aGUgc2FtZSBsZW5ndGgu
CisgICAgICAgICAgICBzdWJNYXRjaCA9IFN1Yk1hdGNoLm5ldyhpbmRleExpc3QsIHByb2R1Y3Rp
b25zKQorICAgICAgICAgICAgbWF0Y2hDb2x1bW4ob3V0cCwgdmFsdWVOYW1lLCBzdWJNYXRjaC5w
cm9kdWN0aW9ucywgMCkgeworICAgICAgICAgICAgICAgIHwgaW5kZXhMaXN0IHwKKyAgICAgICAg
ICAgICAgICB5aWVsZCBzdWJNYXRjaC5tYXBJbmRleExpc3QoaW5kZXhMaXN0KQorICAgICAgICAg
ICAgfQorICAgICAgICB9CisgICAgZW5kCisKKyAgICBtYXRjaFJlY3Vyc2l2ZWx5KG91dHAsICJf
dmFsdWUiLCBtYXRjaGVyLnByb2R1Y3Rpb25zKSB7CisgICAgICAgIHwgaW5kZXhMaXN0IHwKKyAg
ICAgICAgaW5kZXhMaXN0LmVhY2ggeworICAgICAgICAgICAgfCBpbmRleCB8CisgICAgICAgICAg
ICBwcm9kdWN0aW9uID0gbWF0Y2hlci5wcm9kdWN0aW9uc1tpbmRleF0KKyAgICAgICAgICAgIG91
dHAucHV0cyAieyIKKyAgICAgICAgICAgIG91dHAucHV0cyAiVmFsdWUqICN7cHJvZHVjdGlvbi52
YXJOYW1lfSA9IF92YWx1ZTsiCisgICAgICAgICAgICBpbnRlcm5hbEFyZ3VtZW50cyA9IFtdCisg
ICAgICAgICAgICBvcGVyYW5kQXJndW1lbnRzID0gW10KKyAgICAgICAgICAgIHRyeUFyZ3VtZW50
cyA9IFtdCisgICAgICAgICAgICBudW1TY29wZXMgPSAwCisgICAgICAgICAgICBwcm9kdWN0aW9u
LmVhY2hWYXJpYWJsZSB7CisgICAgICAgICAgICAgICAgfCBwYXJlbnRWYXJOYW1lLCBjaGlsZE5h
bWUsIGNoaWxkVmFyTmFtZSwga2luZCwgaW5kZXggfAorICAgICAgICAgICAgICAgIG91dHAucHV0
cyAiVmFsdWUqICN7Y2hpbGRWYXJOYW1lfSA9ICN7cGFyZW50VmFyTmFtZX0tPmNoaWxkKCN7aW5k
ZXh9KTsiCisKKyAgICAgICAgICAgICAgICBpZiBjaGlsZE5hbWUgPX4gL1xBXCQvCisgICAgICAg
ICAgICAgICAgICAgIGlmIGNoaWxkTmFtZSA9fiAvXEFcJChbMC05XSspXFovCisgICAgICAgICAg
ICAgICAgICAgICAgICBvdXRwLnB1dHMgImlmICgje2NoaWxkVmFyTmFtZX0tPmlzSW50KCN7JDF9
KSkgeyIKKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAg
b3V0cC5wdXRzICJpZiAoI3tjaGlsZFZhck5hbWV9LT5oYXNJbnQoKSkgeyIKKyAgICAgICAgICAg
ICAgICAgICAgZW5kCisgICAgICAgICAgICAgICAgICAgIG51bVNjb3BlcyArPSAxCisgICAgICAg
ICAgICAgICAgZW5kCisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgaW50ZXJuYWxB
cmd1bWVudHMgPDwgY2hpbGRWYXJOYW1lIGlmIGtpbmQgPT0gOmludGVybmFsIG9yIGtpbmQgPT0g
OmFub25JbnRlcm5hbAorICAgICAgICAgICAgICAgIG9wZXJhbmRBcmd1bWVudHMgPDwgY2hpbGRW
YXJOYW1lIGlmIGtpbmQgPT0gOm9wZXJhbmQgb3Iga2luZCA9PSA6YW5vbk9wZXJhbmQKKyAgICAg
ICAgICAgICAgICB0cnlBcmd1bWVudHMgPDwgY2hpbGRWYXJOYW1lIGlmIGtpbmQgPT0gOmludGVy
bmFsIG9yIGtpbmQgPT0gOm9wZXJhbmQKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG91dHAu
cHV0cyAiaWYgKGFkYXB0b3IuYWNjZXB0Um9vdChfdmFsdWUpIgorICAgICAgICAgICAgb3V0cC5w
dXRzKCIgICAgJiYgYWRhcHRvci5hY2NlcHRJbnRlcm5hbHMoIiArIGludGVybmFsQXJndW1lbnRz
LmpvaW4oIiwgIikgKyAiKSIpCisgICAgICAgICAgICBvdXRwLnB1dHMoIiAgICAmJiBhZGFwdG9y
LmFjY2VwdE9wZXJhbmRzKCIgKyBvcGVyYW5kQXJndW1lbnRzLmpvaW4oIiwgIikgKyAiKSIpCisg
ICAgICAgICAgICBvdXRwLnB1dHMoIiAgICAmJiBhZGFwdG9yLnRyeSN7cHJvZHVjdGlvbi5uYW1l
fSgiICsgdHJ5QXJndW1lbnRzLmpvaW4oIiwgIikgKyAiKSkiKQorICAgICAgICAgICAgb3V0cC5w
dXRzICIgICAgcmV0dXJuOyIKKyAgICAgICAgICAgIG51bVNjb3Blcy50aW1lcyB7CisgICAgICAg
ICAgICAgICAgb3V0cC5wdXRzICJ9IgorICAgICAgICAgICAgfQorICAgICAgICAgICAgb3V0cC5w
dXRzICJ9IgorICAgICAgICB9CisgICAgfQorICAgIAorICAgIG91dHAucHV0cyAiICAgIFJFTEVB
U0VfQVNTRVJUX05PVF9SRUFDSEVEKCk7IgorICAgIG91dHAucHV0cyAifSIKKyAgICAKKyAgICBv
dXRwLnB1dHMgIn0gfSAvLyBuYW1lc3BhY2UgSlNDOjpCMyIKKworICAgIG91dHAucHV0cyAiI2Vu
ZGlmIC8vIEIzI3ttYXRjaGVyLm5hbWV9X2giCit9CkluZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENv
cmUvYjMvYWlyL0FpckFyZy5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRDb3Jl
L2IzL2Fpci9BaXJBcmcuY3BwCShyZXZpc2lvbiAwKQorKysgU291cmNlL0phdmFTY3JpcHRDb3Jl
L2IzL2Fpci9BaXJBcmcuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsNjIgQEAKKy8qCisg
KiBDb3B5cmlnaHQgKEMpIDIwMTUgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoK
KyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdp
dGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRo
YXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmli
dXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAq
ICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlz
Y2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJv
ZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25k
aXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVu
dGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0
aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFT
IElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElO
RywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJD
SEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUg
RElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IKKyAqIENPTlRSSUJV
VE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVD
SUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywg
QlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBP
UiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVT
UyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBM
SUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQK
KyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdB
WSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9G
IFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKworI2luY2x1ZGUgImNvbmZp
Zy5oIgorI2luY2x1ZGUgIkFpckFyZy5oIgorCituYW1lc3BhY2UgSlNDIHsgbmFtZXNwYWNlIEIz
IHsgbmFtZXNwYWNlIEFpciB7CisKK3ZvaWQgQXJnOjpkdW1wKFByaW50U3RyZWFtJiBvdXQpIGNv
bnN0Cit7CisgICAgc3dpdGNoIChtX2tpbmQpIHsKKyAgICBjYXNlIFRtcDoKKyAgICAgICAgb3V0
LnByaW50KHRtcCgpKTsKKyAgICAgICAgcmV0dXJuOworICAgIGNhc2UgSW1tOgorICAgICAgICBv
dXQucHJpbnQoIiQiLCBtX29mZnNldCk7CisgICAgICAgIHJldHVybjsKKyAgICBjYXNlIEFkZHI6
CisgICAgICAgIGlmIChtX29mZnNldCkKKyAgICAgICAgICAgIG91dC5wcmludChtX29mZnNldCk7
CisgICAgICAgIG91dC5wcmludCgiKCIsIGJhc2UoKSwgIikiKTsKKyAgICAgICAgcmV0dXJuOwor
ICAgIGNhc2UgSW5kZXg6CisgICAgICAgIGlmIChtX29mZnNldCkKKyAgICAgICAgICAgIG91dC5w
cmludChtX29mZnNldCk7CisgICAgICAgIG91dC5wcmludCgiKCIsIGJhc2UoKSwgIiwiLCBpbmRl
eCgpKTsKKyAgICAgICAgaWYgKHNjYWxlKCkgIT0gMSkKKyAgICAgICAgICAgIG91dC5wcmludCgi
LCIsIHNjYWxlKCkpOworICAgICAgICBvdXQucHJpbnQoIikiKTsKKyAgICAgICAgcmV0dXJuOwor
ICAgIGNhc2UgQWJzOgorICAgICAgICBvdXQucHJpbnQobV9vZmZzZXQpOworICAgICAgICByZXR1
cm47CisgICAgfQorCisgICAgUkVMRUFTRV9BU1NFUlRfTk9UX1JFQUNIRUQoKTsKK30KKworfSB9
IH0gLy8gbmFtZXNwYWNlIEpTQzo6QjM6OkFpcgorCkluZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENv
cmUvYjMvYWlyL0FpckFyZy5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9i
My9haXIvQWlyQXJnLmgJKHJldmlzaW9uIDApCisrKyBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMv
YWlyL0FpckFyZy5oCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsNDEyIEBACisvKgorICogQ29w
eXJpZ2h0IChDKSAyMDE1IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBS
ZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9y
IHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRo
ZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9u
cyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBu
b3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWlt
ZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2Ug
dGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9u
cyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlv
biBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4K
KyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycn
IEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJV
VCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRB
QklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NM
QUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMg
QkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwK
KyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBO
T1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VS
VklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5U
RVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklM
SVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAo
SU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VU
IE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUg
UE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisKKyNpZm5kZWYgQWlyQXJnX2gKKyNk
ZWZpbmUgQWlyQXJnX2gKKworI2luY2x1ZGUgIkFpclRtcC5oIgorCituYW1lc3BhY2UgSlNDIHsg
bmFtZXNwYWNlIEIzIHsgbmFtZXNwYWNlIEFpciB7CisKKy8vIFRoaXMgY2xhc3MgbmFtZSBpcyBh
bHNvIGludGVudGlvbmFsbHkgdGVyc2UgYmVjYXVzZSB3ZSB3aWxsIHNheSBpdCBhIGxvdC4gWW91
J2xsIHNlZSBjb2RlIGxpa2UKKy8vIEluc3QoLi4uLCBBcmc6OmltbSg1KSwgQXJnOjphZGRyKHRo
aW5nLCBibGFoKSwgLi4uKQorY2xhc3MgQXJnIHsKK3B1YmxpYzoKKyAgICAvLyBUaGVzZSBlbnVt
IG1lbWJlcnMgYXJlIGludGVudGlvbmFsbHkgdGVyc2UgYmVjYXVzZSB3ZSBoYXZlIHRvIG1lbnRp
b24gdGhlbSBhIGxvdC4KKyAgICBlbnVtIEtpbmQgOiBpbnQ4X3QgeworICAgICAgICBUbXAsCisg
ICAgICAgIEltbSwKKyAgICAgICAgSW1tUHRyLAorICAgICAgICBBZGRyLAorICAgICAgICBJbmRl
eCwKKyAgICB9OworCisgICAgZW51bSBSb2xlIDogaW50OF90IHsKKyAgICAgICAgVXNlLAorICAg
ICAgICBEZWYsCisgICAgICAgIFVzZURlZgorICAgIH07CisKKyAgICBlbnVtIFR5cGUgOiBpbnQ4
X3QgeworICAgICAgICBHUCwKKyAgICAgICAgRlAKKyAgICB9OworCisgICAgc3RhdGljIGJvb2wg
aXNVc2UoUm9sZSByb2xlKQorICAgIHsKKyAgICAgICAgc3dpdGNoIChyb2xlKSB7CisgICAgICAg
IGNhc2UgVXNlOgorICAgICAgICBjYXNlIFVzZURlZjoKKyAgICAgICAgICAgIHJldHVybiB0cnVl
OworICAgICAgICBjYXNlIERlZjoKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAg
fQorICAgIH0KKworICAgIHN0YXRpYyBib29sIGlzRGVmKFJvbGUgcm9sZSkKKyAgICB7CisgICAg
ICAgIHN3aXRjaCAocm9sZSkgeworICAgICAgICBjYXNlIFVzZToKKyAgICAgICAgICAgIHJldHVy
biBmYWxzZTsKKyAgICAgICAgY2FzZSBEZWY6CisgICAgICAgIGNhc2UgVXNlRGVmOgorICAgICAg
ICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBBcmcoKQorICAgIHsK
KyAgICB9CisKKyAgICBBcmcoQWlyOjpUbXAgdG1wKQorICAgICAgICA6IG1fa2luZChUbXApCisg
ICAgICAgICwgbV9iYXNlKHRtcCkKKyAgICB7CisgICAgfQorCisgICAgc3RhdGljIEFyZyBpbW0o
aW50cHRyX3QgdmFsdWUpCisgICAgeworICAgICAgICBBcmcgcmVzdWx0OworICAgICAgICByZXN1
bHQubV9raW5kID0gSW1tOworICAgICAgICByZXN1bHQubV9vZmZzZXQgPSB2YWx1ZTsKKyAgICAg
ICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisKKyAgICBzdGF0aWMgQXJnIGltbVB0cihpbnRwdHJf
dCB2YWx1ZSkKKyAgICB7CisgICAgICAgIEFyZyByZXN1bHQ7CisgICAgICAgIHJlc3VsdC5tX2tp
bmQgPSBJbW1QdHI7CisgICAgICAgIHJlc3VsdC5tX29mZnNldCA9IHZhbHVlOworICAgICAgICBy
ZXR1cm4gcmVzdWx0OworICAgIH0KKworICAgIHN0YXRpYyBBcmcgYWRkcmVzcyhBaXI6OlRtcCBi
YXNlLCBpbnQzMl90IG9mZnNldCA9IDApCisgICAgeworICAgICAgICBBU1NFUlQoYmFzZS5pc0dQ
KCkpOworICAgICAgICBBcmcgcmVzdWx0OworICAgICAgICByZXN1bHQubV9raW5kID0gQWRkcjsK
KyAgICAgICAgcmVzdWx0Lm1fYmFzZSA9IGJhc2U7CisgICAgICAgIHJlc3VsdC5tX29mZnNldCA9
IG9mZnNldDsKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisKKyAgICBzdGF0aWMgYm9v
bCBpc1ZhbGlkU2NhbGUodW5zaWduZWQgc2NhbGUpCisgICAgeworICAgICAgICBzd2l0Y2ggKHNj
YWxlKSB7CisgICAgICAgIGNhc2UgMToKKyAgICAgICAgY2FzZSAyOgorICAgICAgICBjYXNlIDQ6
CisgICAgICAgIGNhc2UgODoKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICBkZWZh
dWx0OgorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgfQorCisgICAg
c3RhdGljIHVuc2lnbmVkIGxvZ1NjYWxlKHVuc2lnbmVkIHNjYWxlKQorICAgIHsKKyAgICAgICAg
c3dpdGNoIChzY2FsZSkgeworICAgICAgICBjYXNlIDE6CisgICAgICAgICAgICByZXR1cm4gMDsK
KyAgICAgICAgY2FzZSAyOgorICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgIGNhc2UgNDoK
KyAgICAgICAgICAgIHJldHVybiAyOworICAgICAgICBjYXNlIDg6CisgICAgICAgICAgICByZXR1
cm4gMzsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIEFTU0VSVF9OT1RfUkVBQ0hFRCgp
OworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBzdGF0aWMg
QXJnIGluZGV4KEFpcjo6VG1wIGJhc2UsIEFpcjo6VG1wIGluZGV4LCB1bnNpZ25lZCBzY2FsZSA9
IDEsIGludDMyX3Qgb2Zmc2V0ID0gMCkKKyAgICB7CisgICAgICAgIEFTU0VSVChiYXNlLmlzR1Ao
KSk7CisgICAgICAgIEFTU0VSVChpbmRleC5pc0dQKCkpOworICAgICAgICBBU1NFUlQoaXNWYWxp
ZFNjYWxlKHNjYWxlKSk7CisgICAgICAgIEFyZyByZXN1bHQ7CisgICAgICAgIHJlc3VsdC5tX2tp
bmQgPSBJbmRleDsKKyAgICAgICAgcmVzdWx0Lm1fYmFzZSA9IGJhc2U7CisgICAgICAgIHJlc3Vs
dC5tX2luZGV4ID0gaW5kZXg7CisgICAgICAgIHJlc3VsdC5tX3NjYWxlID0gc3RhdGljX2Nhc3Q8
dWludDhfdD4oc2NhbGUpOworICAgICAgICByZXN1bHQubV9vZmZzZXQgPSBvZmZzZXQ7CisgICAg
ICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorCisgICAgYm9vbCBvcGVyYXRvcj09KGNvbnN0IEFy
ZyYgb3RoZXIpIGNvbnN0CisgICAgeworICAgICAgICByZXR1cm4gbV9vZmZzZXQgPT0gb3RoZXIu
bV9vZmZzZXQKKyAgICAgICAgICAgICYmIG1fa2luZCA9PSBvdGhlci5tX2tpbmQKKyAgICAgICAg
ICAgICYmIG1fYmFzZSA9PSBvdGhlci5tX2Jhc2UKKyAgICAgICAgICAgICYmIG1faW5kZXggPT0g
b3RoZXIubV9pbmRleAorICAgICAgICAgICAgJiYgbV9zY2FsZSA9PSBvdGhlci5tX3NjYWxlOwor
ICAgIH0KKworICAgIGJvb2wgb3BlcmF0b3IhPShjb25zdCBBcmcmIG90aGVyKSBjb25zdAorICAg
IHsKKyAgICAgICAgcmV0dXJuICEoKnRoaXMgPT0gb3RoZXIpOworICAgIH0KKworICAgIGV4cGxp
Y2l0IG9wZXJhdG9yIGJvb2woKSBjb25zdCB7IHJldHVybiAqdGhpcyAhPSBBcmcoKTsgfQorCisg
ICAgS2luZCBraW5kKCkgY29uc3QKKyAgICB7CisgICAgICAgIHJldHVybiBtX2tpbmQ7CisgICAg
fQorCisgICAgYm9vbCBpc1RtcCgpIGNvbnN0CisgICAgeworICAgICAgICByZXR1cm4ga2luZCgp
ID09IFRtcDsKKyAgICB9CisKKyAgICBib29sIGlzSW1tKCkgY29uc3QKKyAgICB7CisgICAgICAg
IHJldHVybiBraW5kKCkgPT0gSW1tOworICAgIH0KKworICAgIGJvb2wgaXNJbW1QdHIoKSBjb25z
dAorICAgIHsKKyAgICAgICAgcmV0dXJuIGtpbmQoKSA9PSBJbW1QdHI7CisgICAgfQorCisgICAg
Ym9vbCBpc0FkZHIoKSBjb25zdAorICAgIHsKKyAgICAgICAgcmV0dXJuIGtpbmQoKSA9PSBBZGRy
OworICAgIH0KKworICAgIGJvb2wgaXNJbmRleCgpIGNvbnN0CisgICAgeworICAgICAgICByZXR1
cm4ga2luZCgpID09IEluZGV4OworICAgIH0KKworICAgIEFpcjo6VG1wIHRtcCgpIGNvbnN0Cisg
ICAgeworICAgICAgICBBU1NFUlQoa2luZCgpID09IFRtcCk7CisgICAgICAgIHJldHVybiBtX2Jh
c2U7CisgICAgfQorCisgICAgaW50cHRyX3QgdmFsdWUoKSBjb25zdAorICAgIHsKKyAgICAgICAg
QVNTRVJUKGtpbmQoKSA9PSBJbW0gfHwga2luZCgpID09IEltbVB0cik7CisgICAgICAgIHJldHVy
biBtX29mZnNldDsKKyAgICB9CisKKyAgICBBaXI6OlRtcCBiYXNlKCkgY29uc3QKKyAgICB7Cisg
ICAgICAgIEFTU0VSVChraW5kKCkgPT0gQWRkciB8fCBraW5kKCkgPT0gSW5kZXgpOworICAgICAg
ICByZXR1cm4gbV9iYXNlOworICAgIH0KKworICAgIGludDMyX3Qgb2Zmc2V0KCkgY29uc3QKKyAg
ICB7CisgICAgICAgIEFTU0VSVChraW5kKCkgPT0gQWRkciB8fCBraW5kKCkgPT0gSW5kZXgpOwor
ICAgICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8aW50MzJfdD4obV9vZmZzZXQpOworICAgIH0KKwor
ICAgIEFpcjo6VG1wIGluZGV4KCkgY29uc3QKKyAgICB7CisgICAgICAgIEFTU0VSVChraW5kKCkg
PT0gSW5kZXgpOworICAgICAgICByZXR1cm4gbV9pbmRleDsKKyAgICB9CisKKyAgICB1bnNpZ25l
ZCBzY2FsZSgpIGNvbnN0CisgICAgeworICAgICAgICBBU1NFUlQoa2luZCgpID09IEluZGV4KTsK
KyAgICAgICAgcmV0dXJuIG1fc2NhbGU7CisgICAgfQorCisgICAgdW5zaWduZWQgbG9nU2NhbGUo
KSBjb25zdAorICAgIHsKKyAgICAgICAgcmV0dXJuIGxvZ1NjYWxlKHNjYWxlKCkpOworICAgIH0K
KworICAgIGJvb2wgaXNHUFRtcCgpIGNvbnN0CisgICAgeworICAgICAgICByZXR1cm4gaXNUbXAo
KSAmJiB0bXAoKS5pc0dQKCk7CisgICAgfQorCisgICAgYm9vbCBpc0ZQVG1wKCkgY29uc3QKKyAg
ICB7CisgICAgICAgIHJldHVybiBpc1RtcCgpICYmIHRtcCgpLmlzRlAoKTsKKyAgICB9CisgICAg
CisgICAgLy8gVGVsbHMgdXMgaWYgdGhpcyBBcmcgY2FuIGJlIHVzZWQgaW4gYSBwb3NpdGlvbiB0
aGF0IHJlcXVpcmVzIGEgR1AgdmFsdWUuCisgICAgYm9vbCBpc0dQKCkgY29uc3QKKyAgICB7Cisg
ICAgICAgIHN3aXRjaCAoa2luZCgpKSB7CisgICAgICAgIGNhc2UgSW1tOgorICAgICAgICBjYXNl
IEltbVB0cjoKKyAgICAgICAgY2FzZSBBZGRyOgorICAgICAgICBjYXNlIEluZGV4OgorICAgICAg
ICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIGNhc2UgVG1wOgorICAgICAgICAgICAgcmV0dXJu
IGlzR1BUbXAoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIFRlbGxzIHVzIGlmIHRoaXMg
QXJnIGNhbiBiZSB1c2VkIGluIGEgcG9zaXRpb24gdGhhdCByZXF1aXJlcyBhIEZQIHZhbHVlLgor
ICAgIGJvb2wgaXNGUCgpIGNvbnN0CisgICAgeworICAgICAgICBzd2l0Y2ggKGtpbmQoKSkgewor
ICAgICAgICBjYXNlIEltbToKKyAgICAgICAgY2FzZSBJbW1QdHI6CisgICAgICAgICAgICByZXR1
cm4gZmFsc2U7CisgICAgICAgIGNhc2UgQWRkcjoKKyAgICAgICAgY2FzZSBJbmRleDoKKyAgICAg
ICAgY2FzZSBCYXNlOgorICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIGNhc2UgVG1w
OgorICAgICAgICAgICAgcmV0dXJuIGlzRlBUbXAoKTsKKyAgICAgICAgfQorICAgIH0KKworICAg
IGJvb2wgaXNHUFIoKSBjb25zdAorICAgIHsKKyAgICAgICAgcmV0dXJuIGlzVG1wKCkgJiYgdG1w
KCkuaXNHUFIoKTsKKyAgICB9CisKKyAgICBHUFJSZWcgZ3ByKCkgY29uc3QKKyAgICB7CisgICAg
ICAgIHJldHVybiB0bXAoKS5ncHIoKTsKKyAgICB9CisKKyAgICBib29sIGlzRlBSKCkgY29uc3QK
KyAgICB7CisgICAgICAgIHJldHVybiBpc1RtcCgpICYmIHRtcCgpLmlzRlBSKCk7CisgICAgfQor
CisgICAgRlBSUmVnIGZwcigpIGNvbnN0CisgICAgeworICAgICAgICByZXR1cm4gdG1wKCkuZnBy
KCk7CisgICAgfQorICAgIAorICAgIGJvb2wgaXNSZWcoKSBjb25zdAorICAgIHsKKyAgICAgICAg
cmV0dXJuIGlzVG1wKCkgJiYgdG1wKCkuaXNSZWcoKTsKKyAgICB9CisKKyAgICBSZWcgcmVnKCkg
Y29uc3QKKyAgICB7CisgICAgICAgIHJldHVybiB0bXAoKS5yZWcoKTsKKyAgICB9CisKKyAgICB1
bnNpZ25lZCBncFRtcEluZGV4KCkgY29uc3QKKyAgICB7CisgICAgICAgIHJldHVybiB0bXAoKS5n
cFRtcEluZGV4KCk7CisgICAgfQorCisgICAgdW5zaWduZWQgZnBUbXBJbmRleCgpIGNvbnN0Cisg
ICAgeworICAgICAgICByZXR1cm4gdG1wKCkuZnBUbXBJbmRleCgpOworICAgIH0KKworICAgIHVu
c2lnbmVkIHRtcEluZGV4KCkgY29uc3QKKyAgICB7CisgICAgICAgIHJldHVybiB0bXAoKS50bXBJ
bmRleCgpOworICAgIH0KKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIEZ1bmN0b3I+CisgICAgdm9p
ZCBmb3JFYWNoVG1wRmFzdChjb25zdCBGdW5jdG9yJiBmdW5jdG9yKQorICAgIHsKKyAgICAgICAg
c3dpdGNoIChtX2tpbmQpIHsKKyAgICAgICAgY2FzZSBUbXA6CisgICAgICAgIGNhc2UgQWRkcjoK
KyAgICAgICAgICAgIGZ1bmN0b3IobV9iYXNlKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAg
ICBjYXNlIEluZGV4OgorICAgICAgICAgICAgZnVuY3RvcihtX2Jhc2UpOworICAgICAgICAgICAg
ZnVuY3RvcihtX2luZGV4KTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0Ogor
ICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBUaGlzIGlzIHNt
YXJ0IGVub3VnaCB0byBrbm93IHRoYXQgYW4gYWRkcmVzcyBhcmcgaW4gYSBEZWYgb3IgVXNlRGVm
IHJ1bGUgd2lsbCB1c2UgaXRzCisgICAgLy8gdG1wcyBhbmQgbmV2ZXIgZGVmIHRoZW0uIEZvciBl
eGFtcGxlLCB0aGlzOgorICAgIC8vCisgICAgLy8gbW92ICVyYXgsICglcmN4KQorICAgIC8vCisg
ICAgLy8gVGhpcyBkZWZzICglcmN4KSBidXQgdXNlcyAlcmN4LgorICAgIHRlbXBsYXRlPHR5cGVu
YW1lIEZ1bmN0b3I+CisgICAgdm9pZCBmb3JFYWNoVG1wKFJvbGUgYXJnUm9sZSwgVHlwZSBhcmdU
eXBlLCBjb25zdCBGdW5jdG9yJiBmdW5jdG9yKQorICAgIHsKKyAgICAgICAgc3dpdGNoIChtX2tp
bmQpIHsKKyAgICAgICAgY2FzZSBUbXA6CisgICAgICAgICAgICBmdW5jdG9yKG1fYmFzZSwgYXJn
Um9sZSwgYXJnVHlwZSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBBZGRyOgor
ICAgICAgICAgICAgZnVuY3RvcihtX2Jhc2UsIFVzZSwgR1ApOworICAgICAgICAgICAgYnJlYWs7
CisgICAgICAgIGNhc2UgSW5kZXg6CisgICAgICAgICAgICBmdW5jdG9yKG1fYmFzZSwgVXNlLCBH
UCk7CisgICAgICAgICAgICBmdW5jdG9yKG1faW5kZXgsIFVzZSwgR1ApOworICAgICAgICAgICAg
YnJlYWs7CisgICAgICAgIGRlZmF1dDoKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9Cisg
ICAgfQorCisgICAgTWFjcm9Bc3NlbWJsZXI6OlRydXN0ZWRJbW0zMiBhc1RydXN0ZWRJbW0zMigp
IGNvbnN0CisgICAgeworICAgICAgICBBU1NFUlQoaXNJbW0oKSk7CisgICAgICAgIHJldHVybiBN
YWNyb0Fzc2VtYmxlcjo6VHJ1c3RlZEltbTMyKHN0YXRpY19jYXN0PGludDMyX3Q+KG1fb2Zmc2V0
KSk7CisgICAgfQorCisgICAgTWFjcm9Bc3NlbWJsZXI6OlRydXN0ZWRJbW0zMiBhc1RydXN0ZWRJ
bW1QdHIoKSBjb25zdAorICAgIHsKKyAgICAgICAgQVNTRVJUKGlzSW1tUHRyKCkpOworICAgICAg
ICByZXR1cm4gTWFjcm9Bc3NlbWJsZXI6OlRydXN0ZWRJbW1QdHIobV9vZmZzZXQpOworICAgIH0K
KworICAgIE1hY3JvQXNzZW1ibGVyOjpBZGRyZXNzIGFzQWRkcmVzcygpIGNvbnN0CisgICAgewor
ICAgICAgICBBU1NFUlQoaXNBZGRyKCkpOworICAgICAgICByZXR1cm4gTWFjcm9Bc3NlbWJsZXI6
OkFkZHJlc3MobV9iYXNlLmdwcigpLCBzdGF0aWNfY2FzdDxpbnQzMl90PihtX29mZnNldCkpOwor
ICAgIH0KKworICAgIE1hY3JvQXNzZW1ibGVyOjpCYXNlSW5kZXggYXNCYXNlSW5kZXgoKSBjb25z
dAorICAgIHsKKyAgICAgICAgQVNTRVJUKGlzSW5kZXgoKSk7CisgICAgICAgIHJldHVybiBNYWNy
b0Fzc2VtYmxlcjo6QmFzZUluZGV4KAorICAgICAgICAgICAgbV9iYXNlLmdwcigpLCBtX2luZGV4
LmdwcigpLCBzdGF0aWNfY2FzdDxNYWNyb0Fzc2VtYmxlcjo6U2NhbGU+KGxvZ1NjYWxlKCkpLAor
ICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50MzJfdD4obV9vZmZzZXQpKTsKKyAgICB9CisKKyAg
ICB2b2lkIGR1bXAoUHJpbnRTdHJlYW0mKSBjb25zdDsKKworcHJpdmF0ZToKKyAgICBpbnRwdHJf
dCBtX29mZnNldCB7IDAgfTsKKyAgICBLaW5kIG1fa2luZCB7IEltbSB9OworICAgIHVpbnQ4X3Qg
bV9zY2FsZSB7IDEgfTsKKyAgICBBaXI6OlRtcCBtX2Jhc2U7CisgICAgQWlyOjpUbXAgbV9pbmRl
eDsKK307CisKK30gfSB9IC8vIG5hbWVzcGFjZSBKU0M6OkIzOjpBaXIKKworI2VuZGlmIC8vIEFp
ckFyZ19oCisKSW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9haXIvQWlySW5zdC5jcHAK
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL2Fpci9BaXJJbnN0LmNwcAko
cmV2aXNpb24gMCkKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9haXIvQWlySW5zdC5jcHAJ
KHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSwzOSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAx
NSBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24g
YW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBt
b2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNv
bmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNv
ZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxp
c3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVk
aXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5
cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xs
b3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVy
IG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBT
T0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBF
WFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQg
VE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklU
TkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8g
RVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1Ig
QU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlks
IE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8s
CisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9G
IFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9X
RVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJ
TiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdM
SUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisg
KiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9G
IFNVQ0ggREFNQUdFLiAKKyAqLworCisjaW5jbHVkZSAiY29uZmlnLmgiCisjaW5jbHVkZSAiQWly
SW5zdC5oIgorCisjaW5jbHVkZSA8d3RmL0xpc3REdW1wLmg+CisKK25hbWVzcGFjZSBKU0MgeyBu
YW1lc3BhY2UgQjMgeyBuYW1lc3BhY2UgQWlyIHsKKwordm9pZCBJbnN0OjpkdW1wKFByaW50U3Ry
ZWFtJiBvdXQpIGNvbnN0Cit7CisgICAgb3V0LnByaW50KG9wY29kZSwgIiAiLCBsaXN0RHVtcChh
cmdzKSk7Cit9CisKK30gfSB9IC8vIG5hbWVzcGFjZSBKU0M6OkIzOjpBaXIKKwpJbmRleDogU291
cmNlL0phdmFTY3JpcHRDb3JlL2IzL2Fpci9BaXJJbnN0LmgKPT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNl
L0phdmFTY3JpcHRDb3JlL2IzL2Fpci9BaXJJbnN0LmgJKHJldmlzaW9uIDApCisrKyBTb3VyY2Uv
SmF2YVNjcmlwdENvcmUvYjMvYWlyL0Fpckluc3QuaAkod29ya2luZyBjb3B5KQpAQCAtMCwwICsx
LDEyMiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNSBBcHBsZSBJbmMuIEFsbCByaWdodHMg
cmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJp
bmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0
ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6Cisg
KiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3Zl
IGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhl
IGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBm
b3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhp
cyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUK
KyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRo
IHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBB
UFBMRSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFO
VElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJS
QU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisg
KiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBP
UgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElO
Q0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdF
UyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJT
VElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJ
VFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBU
SEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJ
TElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJ
U0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVO
IElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLiAKKyAqLworCisj
aWZuZGVmIEFpckluc3RfaAorI2RlZmluZSBBaXJJbnN0X2gKKworI2luY2x1ZGUgIkFpckFyZy5o
IgorI2luY2x1ZGUgIkFpck9wY29kZS5oIgorCituYW1lc3BhY2UgSlNDIHsgbmFtZXNwYWNlIEIz
IHsKKworY2xhc3MgVmFsdWU7CisKK25hbWVzcGFjZSBBaXIgeworCitzdHJ1Y3QgSW5zdCB7Citw
dWJsaWM6CisgICAgdHlwZWRlZiBWZWN0b3I8QXJnLCAzPiBBcmdMaXN0OworCisgICAgSW5zdChP
cGNvZGUgb3Bjb2RlLCBWYWx1ZSogb3JpZ2luKQorICAgICAgICA6IG9wY29kZShvcGNvZGUpCisg
ICAgICAgICwgb3JpZ2luKG9yaWdpbikKKyAgICB7CisgICAgfQorICAgIAorICAgIHRlbXBsYXRl
PHR5cGVuYW1lLi4uIEFyZ3VtZW50cz4KKyAgICBJbnN0KE9wY29kZSBvcGNvZGUsIFZhbHVlKiBv
cmlnaW4sIEFyZyBhcmcsIEFyZ3VtZW50cy4uLiBhcmd1bWVudHMpCisgICAgICAgIDogb3Bjb2Rl
KG9wY29kZSkKKyAgICAgICAgLCBhcmdzeyBhcmcsIGFyZ3VtZW50cy4uLiB9CisgICAgICAgICwg
b3JpZ2luKG9yaWdpbikKKyAgICB7CisgICAgfQorCisgICAgSW5zdChPcGNvZGUgb3Bjb2RlLCBW
YWx1ZSogb3JpZ2luLCBjb25zdCBBcmdMaXN0JiBhcmd1bWVudHMpCisgICAgICAgIDogb3Bjb2Rl
KG9wY29kZSkKKyAgICAgICAgLCBhcmdzKGFyZ3MpCisgICAgICAgICwgb3JpZ2luKG9yaWdpbikK
KyAgICB7CisgICAgfQorCisgICAgLy8gTm90ZSB0aGF0IHRoZXNlIGZ1bmN0b3JzIGFsbCBhdm9p
ZCB1c2luZyAiY29uc3QiIGJlY2F1c2Ugd2Ugd2FudCB0byB1c2UgdGhlbSBmb3IgdGhpbmdzIHRo
YXQKKyAgICAvLyBlZGl0IElSLiBJUiBpcyBtZWFudCB0byBiZSBlZGl0ZWQ7IGlmIHlvdSdyZSBj
YXJyeWluZyBhcm91bmQgYSAiY29uc3QgSW5zdCYiIHRoZW4geW91J3JlCisgICAgLy8gcHJvYmFi
bHkgZG9pbmcgaXQgd3JvbmcuCisKKyAgICAvLyBUaGlzIG9ubHkgd2Fsa3MgdGhvc2UgVG1wcyB0
aGF0IGFyZSBleHBsaWNpdGx5IG1lbnRpb25lZCwgYW5kIGl0IGRvZXNuJ3QgdGVsbCB5b3UgdGhl
aXIgcm9sZQorICAgIC8vIG9yIHR5cGUuCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgRnVuY3Rvcj4K
KyAgICB2b2lkIGZvckVhY2hUbXBGYXN0KGNvbnN0IEZ1bmN0b3ImIGZ1bmN0b3IpCisgICAgewor
ICAgICAgICBmb3IgKEFyZyBhcmcgOiBhcmdzKQorICAgICAgICAgICAgYXJnLmZvckVhY2hUbXBG
YXN0KGZ1bmN0b3IpOworICAgIH0KKworICAgIC8vIENhbGxzIHRoZSBmdW5jdG9yIHdpdGggKGFy
Zywgcm9sZSwgdHlwZSkuIFRoaXMgZnVuY3Rpb24gaXMgYXV0by1nZW5lcmF0ZWQgYnkKKyAgICAv
LyBvcGNvZGVfZ2VuZXJhdG9yLnJiLgorICAgIHRlbXBsYXRlPHR5cGVuYW1lIEZ1bmN0b3I+Cisg
ICAgdm9pZCBmb3JFYWNoQXJnKGNvbnN0IEZ1bmN0b3ImIGZ1bmN0b3IpOworCisgICAgLy8gQ2Fs
bHMgdGhlIGZ1bmN0b3Igd2l0aCAodG1wLCByb2xlLCB0eXBlKS4KKyAgICB0ZW1wbGF0ZTx0eXBl
bmFtZSBGdW5jdG9yPgorICAgIHZvaWQgZm9yRWFjaFRtcChjb25zdCBGdW5jdG9yJiBmdW5jdG9y
KQorICAgIHsKKyAgICAgICAgZm9yRWFjaEFyZ1JvbGUoCisgICAgICAgICAgICBbJl0gKEFyZyYg
YXJnLCBBcmc6OlJvbGUgcm9sZSwgQXJnOjpUeXBlIHR5cGUpIHsKKyAgICAgICAgICAgICAgICBh
cmcuZm9yRWFjaFRtcChyb2xlLCB0eXBlLCBmdW5jdG9yKTsKKyAgICAgICAgICAgIH0pOworICAg
IH0KKworICAgIC8vIFJlcG9ydHMgYW55IGFkZGl0aW9uYWwgcmVnaXN0ZXJzIGNsb2JiZXJlZCBi
eSB0aGlzIG9wZXJhdGlvbi4KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBGdW5jdG9yPgorICAgIHZv
aWQgZm9yRWFjaENsb2JiZXJlZFJlZyhjb25zdCBGdW5jdG9yJik7CisKKyAgICAvLyBJcyB0aGlz
IGluc3RydWN0aW9uIGluIG9uZSBvZiB0aGUgdmFsaWQgZm9ybXMgcmlnaHQgbm93PyBUaGlzIGZ1
bmN0aW9uIGlzIGF1dG8tZ2VuZXJhdGVkIGJ5CisgICAgLy8gb3Bjb2RlX2dlbmVyYXRvci5yYi4K
KyAgICBib29sIGlzVmFsaWRGb3JtKCk7CisKKyAgICAvLyBBc3N1bWluZyB0aGlzIGluc3RydWN0
aW9uIGlzIGluIGEgdmFsaWQgZm9ybSByaWdodCBub3csIHdpbGwgaXQgc3RpbGwgYmUgaW4gb25l
IG9mIHRoZSB2YWxpZAorICAgIC8vIGZvcm1zIGlmIHdlIHB1dCBhbiBBZGRyIGluIHRoZSBnaXZl
biBpbmRleD8gU3BpbGxpbmcgdXNlcyB0aGlzOiBpdCB3YWxrcyB0aGUgYXJncyBieSBpbmRleCB0
bworICAgIC8vIGZpbmQgVG1wcyB0aGF0IG5lZWQgc3BpbGxpbmc7IGlmIGl0IGZpbmRzIG9uZSwg
aXQgY2FsbHMgdGhpcyB0byBzZWUgaWYgaXQgY2FuIHJlcGxhY2UgdGhlCisgICAgLy8gQXJnOjpU
bXAgd2l0aCBhbiBBcmc6OkFkZHIuIElmIGl0IGZpbmRzIGEgbm9uLVRtcCBBcmcsIHRoZW4gaXQg
Y2FsbHMgdGhhdCBBcmcncyBmb3JFYWNoVG1wIHRvCisgICAgLy8gZG8gYSByZXBsYWNlbWVudCB0
aGF0IHdheS4KKyAgICAvLworICAgIC8vIFRoaXMgZnVuY3Rpb24gaXMgYXV0by1nZW5lcmF0ZWQg
Ynkgb3Bjb2RlX2dlbmVyYXRvci5yYi4KKyAgICBib29sIGFkbWl0c0FkZHIodW5zaWduZWQgYXJn
SW5kZXgpOworCisgICAgLy8gR2VuZXJhdGUgc29tZSBjb2RlIGZvciB0aGlzIGluc3RydWN0aW9u
LiBUaGlzIGlzLCBsaWtlLCBsaXRlcmFsbHkgb3VyIGJhY2tlbmQuIFRoaXMgZnVuY3Rpb24KKyAg
ICAvLyBpcyBhdXRvLWdlbmVyYXRlZCBieSBvcGNvZGVfZ2VuZXJhdG9yLnJiLgorICAgIHZvaWQg
Z2VuZXJhdGUoTWFjcm9Bc3NlbWJsZXImKTsKKworICAgIHZvaWQgZHVtcChQcmludFN0cmVhbSYp
IGNvbnN0OworCisgICAgT3Bjb2RlIG9wY29kZTsKKyAgICBBcmdMaXN0IGFyZ3M7CisgICAgVmFs
dWUqIG9yaWdpbjsgLy8gVGhlIEIzOjpWYWx1ZSB0aGF0IHRoaXMgb3JpZ2luYXRlZCBmcm9tLgor
fTsKKworfSB9IH0gLy8gbmFtZXNwYWNlIEpTQzo6QjM6OkFpcgorCisjZW5kaWYgLy8gQWlySW5z
dF9oCisKSW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9haXIvQWlySW5zdElubGluZXMu
aAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvYWlyL0Fpckluc3RJbmxp
bmVzLmgJKHJldmlzaW9uIDApCisrKyBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvYWlyL0Fpcklu
c3RJbmxpbmVzLmgJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSw2NiBAQAorLyoKKyAqIENvcHly
aWdodCAoQykgMjAxNSBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVk
aXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3
aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUg
Zm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMg
b2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90
aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVy
LgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRo
ZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMg
YW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24g
YW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisg
KgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIGBgQVMgSVMnJyBB
TkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQg
Tk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJ
TElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJ
TUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJF
IExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisg
KiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9U
IExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJ
Q0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVS
UlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElU
WSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElO
Q0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBP
RiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBP
U1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLiAKKyAqLworCisjaWZuZGVmIEFpckluc3RJbmxpbmVz
X2gKKyNkZWZpbmUgQWlySW5zdElubGluZXNfaAorCisjaW5jbHVkZSAiQWlySW5zdC5oIgorI2lu
Y2x1ZGUgIkFpck9wY29kZVV0aWxzLmgiCisjaW5jbHVkZSAiQWlyU3BlY2lhbHMuaCIKKyNpbmNs
dWRlICJCM1N0YWNrbWFwLmgiCisjaW5jbHVkZSAiQjNWYWx1ZS5oIgorCituYW1lc3BhY2UgSlND
IHsgbmFtZXNwYWNlIEIzIHsgbmFtZXNwYWNlIEFpciB7CisKK3RlbXBsYXRlPHR5cGVuYW1lIEZ1
bmN0b3I+Cit2b2lkIEluc3Q6OmZvckVhY2hDbG9iYmVyZWRSZWcoY29uc3QgRnVuY3RvciYgZnVu
Y3RvcikKK3sKKyAgICBzd2l0Y2ggKG9wY29kZSkgeworICAgIGNhc2UgQ2hlY2s6CisgICAgY2Fz
ZSBDaGVja0FkZDoKKyAgICBjYXNlIENoZWNrU3ViOgorICAgIGNhc2UgQ2hlY2tNdWw6CisgICAg
Y2FzZSBQYXRjaHBvaW50OgorICAgICAgICBvcmlnaW4tPnN0YWNrbWFwKCktPmNsb2JiZXJlZCgp
LmZvckVhY2goZnVuY3Rvcik7CisgICAgICAgIGJyZWFrOworCisgICAgY2FzZSBDYWxsOiB7Cisg
ICAgICAgIFJlZ2lzdGVyU2V0IGNhbGxlZVNhdmVSZWdpc3RlcnMgPSBSZWdpc3RlclNldDo6Y2Fs
bGVlU2F2ZVJlZ2lzdGVycygpOworICAgICAgICBmb3IgKFJlZyByZWcgOiBSZWc6OmFsbCgpKSB7
CisgICAgICAgICAgICBpZiAoIWNhbGxlZVNhdmVSZWdpc3RlcnMuZ2V0KHJlZykpCisgICAgICAg
ICAgICAgICAgZnVuY3RvcihyZWcpOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIH0K
KworICAgIGRlZmF1bHQ6CisgICAgICAgIGJyZWFrOworICAgIH0KK30KKworfSB9IH0gLy8gbmFt
ZXNwYWNlIEpTQzo6QjM6OkFpcgorCisjZW5kaWYgLy8gQWlySW5zdElubGluZXNfaAorCkluZGV4
OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvYWlyL0Fpck9wY29kZXMub3Bjb2Rlcwo9PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvYWlyL0Fpck9wY29kZXMub3Bjb2Rlcwko
cmV2aXNpb24gMCkKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9haXIvQWlyT3Bjb2Rlcy5v
cGNvZGVzCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsOTMgQEAKKyMgQ29weXJpZ2h0IChDKSAy
MDE1IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyMKKyMgUmVkaXN0cmlidXRpb24g
YW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisjIG1v
ZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29u
ZGl0aW9ucworIyBhcmUgbWV0OgorIyAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUg
bXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorIyAgICBub3RpY2UsIHRoaXMgbGlzdCBv
ZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisjIDIuIFJlZGlzdHJp
YnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0
CisjICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcg
ZGlzY2xhaW1lciBpbiB0aGUKKyMgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJp
YWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyMKKyMgVEhJUyBTT0ZUV0FSRSBJ
UyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIEFORCBJVFMgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJwor
IyBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBO
T1QgTElNSVRFRCBUTywKKyMgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJ
VFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorIyBQVVJQT1NFIEFSRSBESVNDTEFJTUVE
LiBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SIElUUyBDT05UUklCVVRPUlMKKyMgQkUg
TElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhF
TVBMQVJZLCBPUgorIyBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBM
SU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgorIyBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VT
OyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MKKyMgSU5URVJSVVBU
SU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRI
RVIgSU4KKyMgQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBO
RUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKyMgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUg
VVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRgorIyBUSEUgUE9TU0lCSUxJ
VFkgT0YgU1VDSCBEQU1BR0UuCisKKyMgU3lsbGFidXM6CisjIFU6RyA9PiB1c2Ugb2YgYSBnZW5l
cmFsLXB1cnBvc2UgcmVnaXN0ZXIgb3IgdmFsdWUKKyMgRDpHID0+IGRlZiBvZiBhIGdlbmVyYWwt
cHVycG9zZSByZWdpc3RlciBvciB2YWx1ZQorIyBVRDpHID0+IHVzZSBhbmQgZGVmIG9mIGEgZ2Vu
ZXJhbC1wdXJwb3NlIHJlZ2lzdGVyIG9yIHZhbHVlCisjIFU6RiA9PiB1c2Ugb2YgYSBmbG9hdCBy
ZWdpc3RlciBvciB2YWx1ZQorIyBEOkYgPT4gZGVmIG9mIGEgZmxvYXQgcmVnaXN0ZXIgb3IgdmFs
dWUKKyMgVUQ6RiA9PiB1c2UgYW5kIGRlZiBvZiBhIGZsb2F0IHJlZ2lzdGVyIG9yIHZhbHVlCisj
IFRtcCA9PiB0ZW1wb3Jhcnkgb3IgcmVnaXN0ZXIKKyMgQWRkciA9PiBhZGRyZXNzIGFzIHRlbXBv
cmFyeS9yZWdpc3RlcitvZmZzZXQKKyMgSW5kZXggPT4gQmFzZUluZGV4IGFkZHJlc3MKKyMgQWJz
ID0+IEFic29sdXRlQWRkcmVzcworCisjIE5vdGUgdGhhdCB0aGUgb3Bjb2RlcyBoZXJlIGhhdmUg
YSBsZWFkaW5nIGNhcGl0YWwgKEFkZDMyKSBidXQgbXVzdCBjb3JyZXNwb25kIHRvIE1hY3JvQXNz
ZW1ibGVyCisjIEFQSSB0aGF0IGhhcyBhIGxlYWRpbmcgbG93ZXItY2FzZSAoYWRkMzIpLgorCitB
ZGQzMiBVOkcsIFVEOkcKKyAgICBUbXAsIFRtcAorICAgIEltbSwgQWRkcgorICAgIEltbSwgVG1w
CisgICAgQWRkciwgVG1wCisgICAgVG1wLCBBZGRyCisKK0FkZDMyIFU6RywgVTpHLCBEOkcKKyAg
ICBJbW0sIFRtcCwgVG1wCisKK0FuZDMyIFU6RywgVUQ6RworICAgIFRtcCwgVG1wCisgICAgSW1t
LCBUbXAKKyAgICBUbXAsIEFkZHIKKyAgICBBZGRyLCBUbXAKKyAgICBJbW0sIEFkZHIKKworTHNo
aWZ0MzIgVTpHLCBVRDpHCisgICAgVG1wKiwgVG1wCisgICAgSW1tLCBUbXAKKworTXVsMzIgVTpH
LCBVRDpHCisgICAgVG1wLCBUbXAKKyAgICBBZGRyLCBUbXAKKworTW92ZSBVOkcsIEQ6RworICAg
IFRtcCwgVG1wCisgICAgSW1tLCBUbXAKKyAgICBJbW1QdHIsIFRtcAorICAgIEFkZHIsIFRtcCBh
cyBsb2FkICMgVGhpcyBtZWFucyB0aGF0ICJNb3ZlIEFkZHIsIFRtcCIgaXMgY29kZS1nZW5lcmF0
ZWQgYXMgImxvYWQiIG5vdCAibW92ZSIuCisgICAgVG1wLCBBZGRyIGFzIHN0b3JlCisKK01vdmVE
b3VibGUgVTpGLCBEOkYKKyAgICBUbXAsIFRtcAorICAgIEFkZHIsIFRtcCBhcyBsb2FkRG91Ymxl
CisgICAgVG1wLCBBZGRyIGFzIHN0b3JlRG91YmxlCisKK01vdmU2NFRvRG91YmxlIFU6RywgRDpG
CisgICAgVG1wLCBUbXAKKworTW92ZURvdWJsZVRvNjQgVTpGLCBEOkcKKyAgICBUbXAsIFRtcAor
CisjIFNvbWUgb3Bjb2RlcyBiZWhhdmUgZXhvdGljYWxseS4gRm9yIGV4YW1wbGUsIHRoZXkgbWF5
IGhhdmUgdmFyYXJncy4gT3IsIHRoZXkgbWF5IHJlcXVpcmUgYSBzcGVjaWFsCisjIGNsYXNzIG9m
IHJlZ2lzdGVycyBmb3Igc29tZSBvcGVyYW5kLiBPciwgdGhleSBtYXkgdXNlIG9yIGRlZiBhZGRp
dGlvbmFsIHJlZ2lzdGVycy4KKworIyBUaGVzZSBiZWhhdmUgbGlrZSBob3cgdGhlIFN0YWNrbWFw
IG9iamVjdCB0ZWxscyB0aGVtIHRvIGJlaGF2ZS4KK3NwZWNpYWwgQ2hlY2tBZGQKK3NwZWNpYWwg
Q2hlY2tTdWIgCitzcGVjaWFsIENoZWNrTXVsCitzcGVjaWFsIENoZWNrCitzcGVjaWFsIFBhdGNo
cG9pbnQKKworIyBUYWtlcyBhcmd1bWVudCByZWdpc3RlcnMgYXMgaW5wdXRzLgorc3BlY2lhbCBD
YWxsCkluZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvYWlyL0FpclRtcC5jcHAKPT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL2Fpci9BaXJUbXAuY3BwCShyZXZpc2lv
biAwKQorKysgU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL2Fpci9BaXJUbXAuY3BwCSh3b3JraW5n
IGNvcHkpCkBAIC0wLDAgKzEsNTIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTUgQXBwbGUg
SW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2Ug
aW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0
aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25z
CisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3Qg
cmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNv
bmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0
aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Cisg
KiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRp
c2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlh
bHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUg
SVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBP
UiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUK
KyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9S
IEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNI
QUxMIEFQUExFIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJF
Q1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05T
RVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJP
Q1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERB
VEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FV
U0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJB
Q1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBP
UiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJ
UyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERB
TUFHRS4gCisgKi8KKworI2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgIkFpclRtcC5oIgor
CituYW1lc3BhY2UgSlNDIHsgbmFtZXNwYWNlIEIzIHsgbmFtZXNwYWNlIEFpciB7CisKK3ZvaWQg
VG1wOjpkdW1wKFByaW50U3RyZWFtJiBvdXQpIGNvbnN0Cit7CisgICAgaWYgKCEqdGhpcykgewor
ICAgICAgICBvdXQucHJpbnQoIjxub25lPiIpOworICAgICAgICByZXR1cm47CisgICAgfQorCisg
ICAgaWYgKGlzUmVnKCkpIHsKKyAgICAgICAgb3V0LnByaW50KHJlZygpKTsKKyAgICAgICAgcmV0
dXJuOworICAgIH0KKworICAgIGlmIChpc0dQVG1wKCkpIHsKKyAgICAgICAgb3V0LnByaW50KCIl
dG1wIiwgZ3BUbXBJbmRleCgpKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIG91dC5w
cmludCgiJWZ0bXAiLCBmcFRtcEluZGV4KCkpOworfQorCit9IH0gfSAvLyBuYW1lc3BhY2UgSlND
OjpCMzo6QWlyCisKSW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9haXIvQWlyVG1wLmgK
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL2Fpci9BaXJUbXAuaAkocmV2
aXNpb24gMCkKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9haXIvQWlyVG1wLmgJKHdvcmtp
bmcgY29weSkKQEAgLTAsMCArMSwyNDggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTUgQXBw
bGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1
c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZp
Y2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRp
b25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11
c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9m
IGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJp
YnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0
CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5n
IGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRl
cmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdB
UkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVT
UyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBU
SEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1Mg
Rk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5U
IFNIQUxMIEFQUExFIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBE
SVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBD
T05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICog
UFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0Us
IERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIg
Q0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09O
VFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5D
RSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0Yg
VEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNI
IERBTUFHRS4gCisgKi8KKworI2lmbmRlZiBBaXJUbXBfaAorI2RlZmluZSBBaXJUbXBfaAorCisj
aW5jbHVkZSAiUmVnLmgiCisKK25hbWVzcGFjZSBKU0MgeyBuYW1lc3BhY2UgQjMgeyBuYW1lc3Bh
Y2UgQWlyIHsKKworLy8gQSBUbXAgaXMgYSBnZW5lcmFsaXphdGlvbiBvZiBhIHJlZ2lzdGVyLiBJ
dCBjYW4gYmUgdXNlZCB0byByZWZlciB0byBhbnkgR1BSIG9yIEZQUi4gSXQgY2FuIGFsc28KKy8v
IGJlIHVzZWQgdG8gcmVmZXIgdG8gYW4gdW5hbGxvY2F0ZWQgcmVnaXN0ZXIgKGkuZS4gYSB0ZW1w
b3JhcnkpLiBMaWtlIG1hbnkgQWlyIGNsYXNzZXMsIHdlIHVzZQorLy8gZGVsaWJlcmF0ZWx5IHRl
cnNlIG5hbWluZyBzaW5jZSB3ZSB3aWxsIGhhdmUgdG8gdXNlIHRoaXMgbmFtZSBhIGxvdC4KKwor
Y2xhc3MgVG1wIHsKK3B1YmxpYzoKKyAgICBUbXAoKQorICAgICAgICA6IG1fdmFsdWUoMCkKKyAg
ICB7CisgICAgfQorCisgICAgZXhwbGljaXQgVG1wKFJlZyByZWcpCisgICAgeworICAgICAgICBp
ZiAocmVnKSB7CisgICAgICAgICAgICBpZiAocmVnLmlzR1BSKCkpCisgICAgICAgICAgICAgICAg
bV92YWx1ZSA9IGVuY29kZUdQUihyZWcuZ3ByKCkpOworICAgICAgICAgICAgZWxzZQorICAgICAg
ICAgICAgICAgIG1fdmFsdWUgPSBlbmNvZGVGUFIocmVnLmZwcigpKTsKKyAgICAgICAgfSBlbHNl
CisgICAgICAgICAgICBtX3ZhbHVlID0gMDsKKyAgICB9CisKKyAgICBzdGF0aWMgVG1wIGdwVG1w
Rm9ySW5kZXgodW5zaWduZWQgaW5kZXgpCisgICAgeworICAgICAgICBUbXAgcmVzdWx0OworICAg
ICAgICByZXN1bHQubV92YWx1ZSA9IGVuY29kZUdQVG1wKGluZGV4KTsKKyAgICAgICAgcmV0dXJu
IHJlc3VsdDsKKyAgICB9CisKKyAgICBzdGF0aWMgVG1wIGZwVG1wRm9ySW5kZXgodW5zaWduZWQg
aW5kZXgpCisgICAgeworICAgICAgICBUbXAgcmVzdWx0OworICAgICAgICByZXN1bHQubV92YWx1
ZSA9IGVuY29kZUZQVG1wKGluZGV4KTsKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisK
KyAgICBzdGF0aWMgVG1wIGZvclJhd1ZhbHVlKHVuc2lnbmVkIGluZGV4KQorICAgIHsKKyAgICAg
ICAgVG1wIHJlc3VsdDsKKyAgICAgICAgcmVzdWx0Lm1fdmFsdWUgPSBpbmRleDsKKyAgICAgICAg
cmV0dXJuIHJlc3VsdDsKKyAgICB9CisKKyAgICBleHBsaWNpdCBvcGVyYXRvciBib29sKCkgY29u
c3QgeyByZXR1cm4gISFtX3ZhbHVlOyB9CisKKyAgICBib29sIHJhd1ZhbHVlKCkgY29uc3QgeyBy
ZXR1cm4gbV92YWx1ZTsgfQorCisgICAgYm9vbCBpc0dQKCkgY29uc3QKKyAgICB7CisgICAgICAg
IHJldHVybiBpc0VuY29kZWRHUChtX3ZhbHVlKTsKKyAgICB9CisKKyAgICBib29sIGlzRlAoKSBj
b25zdAorICAgIHsKKyAgICAgICAgcmV0dXJuIGlzRW5jb2RlZEZQKG1fdmFsdWUpOworICAgIH0K
KworICAgIGJvb2wgaXNHUFIoKSBjb25zdAorICAgIHsKKyAgICAgICAgcmV0dXJuIGlzRW5jb2Rl
ZEdQUihtX3ZhbHVlKTsKKyAgICB9CisKKyAgICBib29sIGlzRlBSKCkgY29uc3QKKyAgICB7Cisg
ICAgICAgIHJldHVybiBpc0VuY29kZWRGUFIobV92YWx1ZSk7CisgICAgfQorCisgICAgYm9vbCBp
c1JlZygpIGNvbnN0CisgICAgeworICAgICAgICByZXR1cm4gaXNHUFIoKSB8fCBpc0ZQUigpOwor
ICAgIH0KKworICAgIEdQUlJlZyBncHIoKSBjb25zdAorICAgIHsKKyAgICAgICAgcmV0dXJuIGRl
Y29kZUdQUihtX3ZhbHVlKTsKKyAgICB9CisKKyAgICBGUFJSZWcgZnByKCkgY29uc3QKKyAgICB7
CisgICAgICAgIHJldHVybiBkZWNvZGVGUFIobV92YWx1ZSk7CisgICAgfQorCisgICAgUmVnIHJl
ZygpIGNvbnN0CisgICAgeworICAgICAgICBpZiAoaXNHUCgpKQorICAgICAgICAgICAgcmV0dXJu
IGdwcigpOworICAgICAgICByZXR1cm4gZnByKCk7CisgICAgfQorCisgICAgdW5zaWduZWQgZ3BU
bXBJbmRleCgpIGNvbnN0CisgICAgeworICAgICAgICByZXR1cm4gZGVjb2RlR1BUbXAobV92YWx1
ZSk7CisgICAgfQorCisgICAgdW5zaWduZWQgZnBUbXBJbmRleCgpIGNvbnN0CisgICAgeworICAg
ICAgICByZXR1cm4gZGVjb2RlRlBUbXAobV92YWx1ZSk7CisgICAgfQorCisgICAgdW5zaWduZWQg
dG1wSW5kZXgoKSBjb25zdAorICAgIHsKKyAgICAgICAgaWYgKGlzR1AoKSkKKyAgICAgICAgICAg
IHJldHVybiBncFRtcEluZGV4KCk7CisgICAgICAgIHJldHVybiBmcFRtcEluZGV4KCk7CisgICAg
fQorCisgICAgYm9vbCBvcGVyYXRvcj09KGNvbnN0IFRtcCYgb3RoZXIpIGNvbnN0CisgICAgewor
ICAgICAgICByZXR1cm4gbV92YWx1ZSA9PSBvdGhlci5tX3ZhbHVlOworICAgIH0KKworICAgIGJv
b2wgb3BlcmF0b3IhPShjb25zdCBUbXAmIG90aGVyKSBjb25zdAorICAgIHsKKyAgICAgICAgcmV0
dXJuICEoKnRoaXMgPT0gb3RoZXIpOworICAgIH0KKworICAgIHZvaWQgZHVtcChQcmludFN0cmVh
bSYgb3V0KSBjb25zdDsKKyAgICAKK3ByaXZhdGU6CisgICAgc3RhdGljIGludCBlbmNvZGVHUCh1
bnNpZ25lZCBpbmRleCkKKyAgICB7CisgICAgICAgIHJldHVybiAxICsgaW5kZXg7CisgICAgfQor
CisgICAgc3RhdGljIGludCBlbmNvZGVGUCh1bnNpZ25lZCBpbmRleCkKKyAgICB7CisgICAgICAg
IHJldHVybiAtMSAtIGluZGV4OworICAgIH0KKworICAgIHN0YXRpYyBpbnQgZW5jb2RlR1BSKEdQ
UlJlZyBncHIpCisgICAgeworICAgICAgICByZXR1cm4gZW5jb2RlR1AoZ3ByIC0gTWFjcm9Bc3Nl
bWJsZXI6OmZpcnN0UmVnaXN0ZXIoKSk7CisgICAgfQorCisgICAgc3RhdGljIGludCBlbmNvZGVG
UFIoRlBSUmVnIGZwcikKKyAgICB7CisgICAgICAgIHJldHVybiBlbmNvZGVGUChmcHIgLSBNYWNy
b0Fzc2VtYmxlcjo6Zmlyc3RGUFJSZWdpc3RlcigpKTsKKyAgICB9CisKKyAgICBzdGF0aWMgaW50
IGVuY29kZUdQVG1wKHVuc2lnbmVkIGluZGV4KQorICAgIHsKKyAgICAgICAgcmV0dXJuIGVuY29k
ZUdQUihNYWNyb0Fzc2VtYmxlcjo6bGFzdFJlZ2lzdGVyKCkpICsgMSArIGluZGV4OworICAgIH0K
KworICAgIHN0YXRpYyBpbnQgZW5jb2RlRlBUbXAodW5zaWduZWQgaW5kZXgpCisgICAgeworICAg
ICAgICByZXR1cm4gZW5jb2RlRlBSKE1hY3JvQXNzZW1ibGVyOjpsYXN0RlBSZWdpc3RlcigpKSAt
IDEgLSBpbmRleDsKKyAgICB9CisKKyAgICBzdGF0aWMgYm9vbCBpc0VuY29kZWRHUChpbnQgdmFs
dWUpCisgICAgeworICAgICAgICByZXR1cm4gdmFsdWUgPiAwOworICAgIH0KKworICAgIHN0YXRp
YyBib29sIGlzRW5jb2RlZEZQKGludCB2YWx1ZSkKKyAgICB7CisgICAgICAgIHJldHVybiB2YWx1
ZSA8IDA7CisgICAgfQorCisgICAgc3RhdGljIGJvb2wgaXNFbmNvZGVkR1BSKGludCB2YWx1ZSkK
KyAgICB7CisgICAgICAgIHJldHVybiBpc0VuY29kZWRHUCh2YWx1ZSkgJiYgdmFsdWUgPD0gZW5j
b2RlR1BSKE1hY3JvQXNzZW1ibGVyOjpsYXN0UmVnaXN0ZXIoKSk7CisgICAgfQorCisgICAgc3Rh
dGljIGJvb2wgaXNFbmNvZGVkRlBSKGludCB2YWx1ZSkKKyAgICB7CisgICAgICAgIHJldHVybiBp
c0VuY29kZWRGUCh2YWx1ZSkgJiYgdmFsdWUgPj0gZW5jb2RlZEZQUihNYWNyb0Fzc2VtYmxlcjo6
bGFzdEZQUmVnaXN0ZXIoKSk7CisgICAgfQorCisgICAgc3RhdGljIGJvb2wgaXNFbmNvZGVkR1BU
bXAoaW50IHZhbHVlKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGlzRW5jb2RlZEdQKHZhbHVlKSAm
JiAhaXNFbmNvZGVkR1BSKHZhbHVlKTsKKyAgICB9CisKKyAgICBzdGF0aWMgYm9vbCBpc0VuY29k
ZWRGUFRtcChpbnQgdmFsdWUpCisgICAgeworICAgICAgICByZXR1cm4gaXNFbmNvZGVkRlAodmFs
dWUpICYmICFpc0VuY29kZWRGUFIodmFsdWUpOworICAgIH0KKworICAgIHN0YXRpYyBHUFJSZWcg
ZGVjb2RlR1BSKGludCB2YWx1ZSkKKyAgICB7CisgICAgICAgIEFTU0VSVChpc0VuY29kZWRHUFIo
dmFsdWUpKTsKKyAgICAgICAgcmV0dXJuIHN0YXRpY19jYXN0PEdQUlJlZz4oCisgICAgICAgICAg
ICAodmFsdWUgLSBlbmNvZGVHUFIoTWFjcm9Bc3NlbWJsZXI6OmZpcnN0UmVnaXN0ZXIoKSkpICsg
TWFjcm9Bc3NlbWJsZXI6OmZpcnN0UmVnaXN0ZXIoKSk7CisgICAgfQorCisgICAgc3RhdGljIEZQ
UlJlZyBkZWNvZGVGUFIoaW50IHZhbHVlKQorICAgIHsKKyAgICAgICAgQVNTRVJUKGlzRW5jb2Rl
ZEZQUih2YWx1ZSkpOworICAgICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8RlBSUmVnPigKKyAgICAg
ICAgICAgIChlbmNvZGVGUFIoTWFjcm9Bc3NlbWJsZXI6OmZpcnN0RlBSZWdpc3RlcigpKSAtIHZh
bHVlKSArCisgICAgICAgICAgICBNYWNyb0Fzc2VtYmxlcjo6Zmlyc3RGUFJlZ2lzdGVyKCkpOwor
ICAgIH0KKworICAgIHN0YXRpYyB1bnNpZ25lZCBkZWNvZGVHUFRtcChpbnQgdmFsdWUpCisgICAg
eworICAgICAgICBBU1NFUlQoaXNFbmNvZGVkR1BUbXAodmFsdWUpKTsKKyAgICAgICAgcmV0dXJu
IHZhbHVlIC0gKGVuY29kZUdQUihNYWNyb0Fzc2VtYmxlcjo6bGFzdFJlZ2lzdGVyKCkpICsgMSk7
CisgICAgfQorCisgICAgc3RhdGljIHVuc2lnbmVkIGRlY29kZUZQVG1wKGludCB2YWx1ZSkKKyAg
ICB7CisgICAgICAgIEFTU0VSVChpc0VuY29kZWRGUFRtcCh2YWx1ZSkpOworICAgICAgICByZXR1
cm4gKGVuY29kZUZQUihNYWNyb0Fzc2VtYmxlcjo6bGFzdEZQUmVnaXN0ZXIoKSkgLSAxKSAtIHZh
bHVlOworICAgIH0KKworICAgIC8vIDA6IGVtcHR5IFRtcAorICAgIC8vIHBvc2l0aXZlOiBHUFJz
IGFuZCB0aGVuIEdQIHRlbXBzLgorICAgIC8vIG5lZ2F0aXZlOiBGUFJzIGFuZCB0aGVuIEZQIHRl
bXBzLgorICAgIGludCBtX3ZhbHVlOworfTsKKworfSB9IH0gLy8gbmFtZXNwYWNlIEpTQzo6QjM6
OkFpcgorCisjZW5kaWYgLy8gQWlyVG1wX2gKKwpJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3Jl
L2IzL2Fpci9vcGNvZGVfZ2VuZXJhdG9yLnJiCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2Ny
aXB0Q29yZS9iMy9haXIvb3Bjb2RlX2dlbmVyYXRvci5yYgkocmV2aXNpb24gMCkKKysrIFNvdXJj
ZS9KYXZhU2NyaXB0Q29yZS9iMy9haXIvb3Bjb2RlX2dlbmVyYXRvci5yYgkod29ya2luZyBjb3B5
KQpAQCAtMCwwICsxLDc0OCBAQAorIyEvdXNyL2Jpbi9lbnYgcnVieQorCisjIENvcHlyaWdodCAo
QykgMjAxNSBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisjCisjIFJlZGlzdHJpYnV0
aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAor
IyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5n
IGNvbmRpdGlvbnMKKyMgYXJlIG1ldDoKKyMgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBj
b2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyMgICAgbm90aWNlLCB0aGlzIGxp
c3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorIyAyLiBSZWRp
c3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHly
aWdodAorIyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93
aW5nIGRpc2NsYWltZXIgaW4gdGhlCisjICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1h
dGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisjCisjIFRISVMgU09GVFdB
UkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBBTkQgSVRTIENPTlRSSUJVVE9SUyBgYEFTIElT
JycKKyMgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBC
VVQgTk9UIExJTUlURUQgVE8sCisjIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRB
QklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyMgUFVSUE9TRSBBUkUgRElTQ0xB
SU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUiBJVFMgQ09OVFJJQlVUT1JTCisj
IEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUws
IEVYRU1QTEFSWSwgT1IKKyMgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBO
T1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKKyMgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJW
SUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTCisjIElOVEVS
UlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBX
SEVUSEVSIElOCisjIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJ
TkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisjIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0Yg
VEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YKKyMgVEhFIFBPU1NJ
QklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCityZXF1aXJlICJwYXRobmFtZSIKKworY2xhc3MgT3Bj
b2RlCisgICAgYXR0cl9yZWFkZXIgOm5hbWUsIDpzcGVjaWFsLCA6b3ZlcmxvYWRzCisKKyAgICBk
ZWYgaW5pdGlhbGl6ZShuYW1lLCBzcGVjaWFsKQorICAgICAgICBAbmFtZSA9IG5hbWUKKyAgICAg
ICAgQHNwZWNpYWwgPSBzcGVjaWFsCisgICAgICAgIHVubGVzcyBzcGVjaWFsCisgICAgICAgICAg
ICBAb3ZlcmxvYWRzID0gW10KKyAgICAgICAgZW5kCisgICAgZW5kCisKKyAgICBkZWYgbWFzbU5h
bWUKKyAgICAgICAgbmFtZVswXS5kb3duY2FzZSArIG5hbWVbMS4uLTFdCisgICAgZW5kCitlbmQK
KworY2xhc3MgQXJnCisgICAgYXR0cl9yZWFkZXIgOnJvbGUsIDp0eXBlCisKKyAgICBkZWYgaW5p
dGlhbGl6ZShyb2xlLCB0eXBlKQorICAgICAgICBAcm9sZSA9IHJvbGUKKyAgICAgICAgQHR5cGUg
PSB0eXBlCisgICAgZW5kCitlbmQKKworY2xhc3MgT3ZlcmxvYWQKKyAgICBhdHRyX3JlYWRlciA6
c2lnbmF0dXJlLCA6Zm9ybXMKKworICAgIGRlZiBpbml0aWFsaXplKHNpZ25hdHVyZSwgZm9ybXMp
CisgICAgICAgIEBzaWduYXR1cmUgPSBzaWduYXR1cmUKKyAgICAgICAgQGZvcm1zID0gZm9ybXMK
KyAgICBlbmQKK2VuZAorCitjbGFzcyBLaW5kCisgICAgYXR0cl9yZWFkZXIgOm5hbWUKKyAgICBh
dHRyX2FjY2Vzc29yIDpzcGVjaWFsCisKKyAgICBkZWYgaW5pdGlhbGl6ZShuYW1lKQorICAgICAg
ICBAbmFtZSA9IG5hbWUKKyAgICAgICAgQHNwZWNpYWwgPSBmYWxzZQorICAgIGVuZAorCisgICAg
ZGVmID09KG90aGVyKQorICAgICAgICBpZiBvdGhlci5pc19hPyBTdHJpbmcKKyAgICAgICAgICAg
IEBuYW1lID09IG90aGVyCisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIEBuYW1lID09IG90aGVy
Lm5hbWUgYW5kIEBzcGVjaWFsID09IG90aGVyLnNwZWNpYWwKKyAgICAgICAgZW5kCisgICAgZW5k
CitlbmQKKworY2xhc3MgRm9ybQorICAgIGF0dHJfcmVhZGVyIDpraW5kcywgOmFsdE5hbWUKKwor
ICAgIGRlZiBpbml0aWFsaXplKGtpbmRzLCBhbHROYW1lKQorICAgICAgICBAa2luZHMgPSBraW5k
cworICAgICAgICBAYWx0TmFtZSA9IGFsdE5hbWUKKyAgICBlbmQKK2VuZAorCitjbGFzcyBPcmln
aW4KKyAgICBhdHRyX3JlYWRlciA6ZmlsZU5hbWUsIDpsaW5lTnVtYmVyCisgICAgCisgICAgZGVm
IGluaXRpYWxpemUoZmlsZU5hbWUsIGxpbmVOdW1iZXIpCisgICAgICAgIEBmaWxlTmFtZSA9IGZp
bGVOYW1lCisgICAgICAgIEBsaW5lTnVtYmVyID0gbGluZU51bWJlcgorICAgIGVuZAorICAgIAor
ICAgIGRlZiB0b19zCisgICAgICAgICIje2ZpbGVOYW1lfToje2xpbmVOdW1iZXJ9IgorICAgIGVu
ZAorZW5kCisKK2NsYXNzIFRva2VuCisgICAgYXR0cl9yZWFkZXIgOm9yaWdpbiwgOnN0cmluZwor
ICAgIAorICAgIGRlZiBpbml0aWFsaXplKG9yaWdpbiwgc3RyaW5nKQorICAgICAgICBAb3JpZ2lu
ID0gb3JpZ2luCisgICAgICAgIEBzdHJpbmcgPSBzdHJpbmcKKyAgICBlbmQKKyAgICAKKyAgICBk
ZWYgPT0ob3RoZXIpCisgICAgICAgIGlmIG90aGVyLmlzX2E/IFRva2VuCisgICAgICAgICAgICBA
c3RyaW5nID09IG90aGVyLnN0cmluZworICAgICAgICBlbHNlCisgICAgICAgICAgICBAc3RyaW5n
ID09IG90aGVyCisgICAgICAgIGVuZAorICAgIGVuZAorICAgIAorICAgIGRlZiA9fihvdGhlcikK
KyAgICAgICAgQHN0cmluZyA9fiBvdGhlcgorICAgIGVuZAorICAgIAorICAgIGRlZiB0b19zCisg
ICAgICAgICIje0BzdHJpbmcuaW5zcGVjdH0gYXQgI3tvcmlnaW59IgorICAgIGVuZAorICAgIAor
ICAgIGRlZiBwYXJzZUVycm9yKCpjb21tZW50KQorICAgICAgICBpZiBjb21tZW50LmVtcHR5Pwor
ICAgICAgICAgICAgcmFpc2UgIlBhcnNlIGVycm9yOiAje3RvX3N9IgorICAgICAgICBlbHNlCisg
ICAgICAgICAgICByYWlzZSAiUGFyc2UgZXJyb3I6ICN7dG9fc306ICN7Y29tbWVudFswXX0iCisg
ICAgICAgIGVuZAorICAgIGVuZAorZW5kCisKK2RlZiBsZXgoc3RyLCBmaWxlTmFtZSkKKyAgICBm
aWxlTmFtZSA9IFBhdGhuYW1lLm5ldyhmaWxlTmFtZSkKKyAgICByZXN1bHQgPSBbXQorICAgIGxp
bmVOdW1iZXIgPSAxCisgICAgd2hpbGUgbm90IHN0ci5lbXB0eT8KKyAgICAgICAgY2FzZSBzdHIK
KyAgICAgICAgd2hlbiAvXEFcIyhbXlxuXSopLworICAgICAgICAgICAgIyBjb21tZW50LCBpZ25v
cmUKKyAgICAgICAgd2hlbiAvXEFcbi8KKyAgICAgICAgICAgICMgbmV3bGluZSwgaWdub3JlCisg
ICAgICAgICAgICBsaW5lTnVtYmVyICs9IDEKKyAgICAgICAgd2hlbiAvXEEoW2EtekEtWjAtOV9d
KykvCisgICAgICAgICAgICByZXN1bHQgPDwgVG9rZW4ubmV3KE9yaWdpbi5uZXcoZmlsZU5hbWUs
IGxpbmVOdW1iZXIpLCAkJikKKyAgICAgICAgd2hlbiAvXEEoWyBcdFxyXSspLworICAgICAgICAg
ICAgIyB3aGl0ZXNwYWNlLCBpZ25vcmUKKyAgICAgICAgd2hlbiAvXEFbLDoqXS8KKyAgICAgICAg
ICAgIHJlc3VsdCA8PCBUb2tlbi5uZXcoT3JpZ2luLm5ldyhmaWxlTmFtZSwgbGluZU51bWJlciks
ICQmKQorICAgICAgICBlbHNlCisgICAgICAgICAgICByYWlzZSAiTGV4ZXIgZXJyb3IgYXQgI3tP
cmlnaW4ubmV3KGZpbGVOYW1lLCBsaW5lTnVtYmVyKS50b19zfSwgdW5leHBlY3RlZCBzZXF1ZW5j
ZSAje3N0clswLi4yMF0uaW5zcGVjdH0iCisgICAgICAgIGVuZAorICAgICAgICBzdHIgPSAkfi5w
b3N0X21hdGNoCisgICAgZW5kCisgICAgcmVzdWx0CitlbmQKKworZGVmIGlzVUQodG9rZW4pCisg
ICAgdG9rZW4gPX4gL1xBKChVKXwoRCl8KFVEKSlcWi8KK2VuZAorCitkZWYgaXNHRih0b2tlbikK
KyAgICB0b2tlbiA9fiAvXEEoKEcpfChGKSlcWi8KK2VuZAorCitkZWYgaXNLaW5kKHRva2VuKQor
ICAgIHRva2VuID1+IC9cQSgoVG1wKXwoSW1tKXwoSW1tUHRyKXwoQWRkcil8KEluZGV4KSlcWi8K
K2VuZAorCitkZWYgaXNLZXl3b3JkKHRva2VuKQorICAgIGlzVUQodG9rZW4pIG9yIGlzR0YodG9r
ZW4pIG9yIGlzS2luZCh0b2tlbikgb3IKKyAgICAgICAgdG9rZW4gPT0gInNwZWNpYWwiIG9yIHRv
a2VuID09ICJhcyIKK2VuZAorCitkZWYgaXNJZGVudGlmaWVyKHRva2VuKQorICAgIHRva2VuID1+
IC9cQShbYS16QS1aMC05X10rKVxaLyBhbmQgbm90IGlzS2V5d29yZCh0b2tlbikKK2VuZAorCitj
bGFzcyBQYXJzZXIKKyAgICBkZWYgaW5pdGlhbGl6ZShkYXRhLCBmaWxlTmFtZSkKKyAgICAgICAg
QHRva2VucyA9IGxleChkYXRhLCBmaWxlTmFtZSkKKyAgICAgICAgQGlkeCA9IDAKKyAgICBlbmQK
KworICAgIGRlZiB0b2tlbgorICAgICAgICBAdG9rZW5zW0BpZHhdCisgICAgZW5kCisKKyAgICBk
ZWYgYWR2YW5jZQorICAgICAgICBAaWR4ICs9IDEKKyAgICBlbmQKKworICAgIGRlZiBwYXJzZUVy
cm9yKCpjb21tZW50KQorICAgICAgICBpZiB0b2tlbgorICAgICAgICAgICAgdG9rZW4ucGFyc2VF
cnJvcigqY29tbWVudCkKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgaWYgY29tbWVudC5lbXB0
eT8KKyAgICAgICAgICAgICAgICByYWlzZSAiUGFyc2UgZXJyb3IgYXQgZW5kIG9mIGZpbGUiCisg
ICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgcmFpc2UgIlBhcnNlIGVycm9yIGF0IGVu
ZCBvZiBmaWxlOiAje2NvbW1lbnRbMF19IgorICAgICAgICAgICAgZW5kCisgICAgICAgIGVuZAor
ICAgIGVuZAorCisgICAgZGVmIGNvbnN1bWUoc3RyaW5nKQorICAgICAgICBwYXJzZUVycm9yKCJF
eHBlY3RlZCAje3N0cmluZ30iKSB1bmxlc3MgdG9rZW4gPT0gc3RyaW5nCisgICAgICAgIGFkdmFu
Y2UKKyAgICBlbmQKKworICAgIGRlZiBjb25zdW1lSWRlbnRpZmllcgorICAgICAgICByZXN1bHQg
PSB0b2tlbi5zdHJpbmcKKyAgICAgICAgcGFyc2VFcnJvcigiRXhwZWN0ZWQgaWRlbnRpZmllciIp
IHVubGVzcyBpc0lkZW50aWZpZXIocmVzdWx0KQorICAgICAgICBhZHZhbmNlCisgICAgICAgIHJl
c3VsdAorICAgIGVuZAorCisgICAgZGVmIGNvbnN1bWVSb2xlCisgICAgICAgIHJlc3VsdCA9IHRv
a2VuLnN0cmluZworICAgICAgICBwYXJzZUVycm9yKCJFeHBlY3RlZCByb2xlIChVLCBELCBvciBV
RCkiKSB1bmxlc3MgaXNVRChyZXN1bHQpCisgICAgICAgIGFkdmFuY2UKKyAgICAgICAgcmVzdWx0
CisgICAgZW5kCisKKyAgICBkZWYgY29uc3VtZVR5cGUKKyAgICAgICAgcmVzdWx0ID0gdG9rZW4u
c3RyaW5nCisgICAgICAgIHBhcnNlRXJyb3IoIkV4cGVjdGVkIHR5cGUgKEcgb3IgRikiKSB1bmxl
c3MgaXNHRihyZXN1bHQpCisgICAgICAgIGFkdmFuY2UKKyAgICAgICAgcmVzdWx0CisgICAgZW5k
CisKKyAgICBkZWYgY29uc3VtZUtpbmQKKyAgICAgICAgcmVzdWx0ID0gdG9rZW4uc3RyaW5nCisg
ICAgICAgIHBhcnNlRXJyb3IoIkV4cGVjdGVkIGtpbmQgKEltbSwgSW1tUHRyLCBUbXAsIEFkZHIs
IG9yIEluZGV4KSIpIHVubGVzcyBpc0tpbmQocmVzdWx0KQorICAgICAgICBhZHZhbmNlCisgICAg
ICAgIHJlc3VsdAorICAgIGVuZAorCisgICAgZGVmIHBhcnNlCisgICAgICAgIHJlc3VsdCA9IHt9
CisgICAgICAgIAorICAgICAgICBsb29wIHsKKyAgICAgICAgICAgIGJyZWFrIGlmIEBpZHggPj0g
QHRva2Vucy5sZW5ndGgKKworICAgICAgICAgICAgaWYgdG9rZW4gPT0gInNwZWNpYWwiCisgICAg
ICAgICAgICAgICAgY29uc3VtZSgic3BlY2lhbCIpCisgICAgICAgICAgICAgICAgb3Bjb2RlTmFt
ZSA9IGNvbnN1bWVJZGVudGlmaWVyCisKKyAgICAgICAgICAgICAgICBwYXJzZUVycm9yKCJDYW5u
b3Qgb3ZlcmxvYWQgYSBzcGVjaWFsIG9wY29kZSIpIGlmIHJlc3VsdFtvcGNvZGVOYW1lXQorCisg
ICAgICAgICAgICAgICAgcmVzdWx0W29wY29kZU5hbWVdID0gT3Bjb2RlLm5ldyhvcGNvZGVOYW1l
LCB0cnVlKQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIG9wY29kZU5hbWUgPSBj
b25zdW1lSWRlbnRpZmllcgorCisgICAgICAgICAgICAgICAgaWYgcmVzdWx0W29wY29kZU5hbWVd
CisgICAgICAgICAgICAgICAgICAgIG9wY29kZSA9IHJlc3VsdFtvcGNvZGVOYW1lXQorICAgICAg
ICAgICAgICAgICAgICBwYXJzZUVycm9yKCJDYW5ub3Qgb3ZlcmxvYWQgYSBzcGVjaWFsIG9wY29k
ZSIpIGlmIG9wY29kZS5zcGVjaWFsCisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAg
ICAgICAgICBvcGNvZGUgPSBPcGNvZGUubmV3KG9wY29kZU5hbWUsIGZhbHNlKQorICAgICAgICAg
ICAgICAgICAgICByZXN1bHRbb3Bjb2RlTmFtZV0gPSBvcGNvZGUKKyAgICAgICAgICAgICAgICBl
bmQKKworICAgICAgICAgICAgICAgIHNpZ25hdHVyZSA9IFtdCisgICAgICAgICAgICAgICAgaWYg
aXNVRCh0b2tlbikKKyAgICAgICAgICAgICAgICAgICAgbG9vcCB7CisgICAgICAgICAgICAgICAg
ICAgICAgICByb2xlID0gY29uc3VtZVJvbGUKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN1
bWUoIjoiKQorICAgICAgICAgICAgICAgICAgICAgICAgdHlwZSA9IGNvbnN1bWVUeXBlCisgICAg
ICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgIHNpZ25hdHVyZSA8
PCBBcmcubmV3KHJvbGUsIHR5cGUpCisgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAg
ICAgICAgICAgICAgICAgIGJyZWFrIHVubGVzcyB0b2tlbiA9PSAiLCIKKyAgICAgICAgICAgICAg
ICAgICAgICAgIGNvbnN1bWUoIiwiKQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAg
ICAgICAgZW5kCisKKyAgICAgICAgICAgICAgICBmb3JtcyA9IFtdCisgICAgICAgICAgICAgICAg
bG9vcCB7CisgICAgICAgICAgICAgICAgICAgIGtpbmRzID0gW10KKyAgICAgICAgICAgICAgICAg
ICAgYWx0TmFtZSA9IG5pbAorICAgICAgICAgICAgICAgICAgICBsb29wIHsKKyAgICAgICAgICAg
ICAgICAgICAgICAgIGtpbmRzIDw8IEtpbmQubmV3KGNvbnN1bWVLaW5kKQorCisgICAgICAgICAg
ICAgICAgICAgICAgICBpZiB0b2tlbiA9PSAiKiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAg
ICBwYXJzZUVycm9yKCJDYW4gb25seSBhcHBseSAqIHRvIFRtcCIpIHVubGVzcyBraW5kc1stMV0u
bmFtZSA9PSAiVG1wIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtpbmRzWy0xXS5zcGVj
aWFsID0gdHJ1ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN1bWUoIioiKQorICAg
ICAgICAgICAgICAgICAgICAgICAgZW5kCisKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFr
IHVubGVzcyB0b2tlbiA9PSAiLCIKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN1bWUoIiwi
KQorICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgaWYgdG9rZW4g
PT0gImFzIgorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3VtZSgiYXMiKQorICAgICAgICAg
ICAgICAgICAgICAgICAgYWx0TmFtZSA9IGNvbnN1bWVJZGVudGlmaWVyCisgICAgICAgICAgICAg
ICAgICAgIGVuZAorCisgICAgICAgICAgICAgICAgICAgIHBhcnNlRXJyb3IoIkZvcm0gaGFzIHdy
b25nIG51bWJlciBvZiBhcmd1bWVudHMgZm9yIG92ZXJsb2FkIikgdW5sZXNzIGtpbmRzLmxlbmd0
aCA9PSBzaWduYXR1cmUubGVuZ3RoCisgICAgICAgICAgICAgICAgICAgIGtpbmRzLmVhY2hfd2l0
aF9pbmRleCB7CisgICAgICAgICAgICAgICAgICAgICAgICB8IGtpbmQsIGluZGV4IHwKKyAgICAg
ICAgICAgICAgICAgICAgICAgIGlmIGtpbmQubmFtZSA9PSAiSW1tIiBvciBraW5kLm5hbWUgPT0g
IkltbVB0ciIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiBzaWduYXR1cmVbaW5kZXhd
LnJvbGUgIT0gIlUiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnNlRXJyb3Io
IkZvcm0gaGFzIGFuIGltbWVkaWF0ZSBmb3IgYSBub24tdXNlIGFyZ3VtZW50IikKKyAgICAgICAg
ICAgICAgICAgICAgICAgICAgICBlbmQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiBz
aWduYXR1cmVbaW5kZXhdLnR5cGUgIT0gIkciCisgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgIHBhcnNlRXJyb3IoIkZvcm0gaGFzIGFuIGltbWVkaWF0ZSBmb3IgYSBub24tZ2VuZXJhbC1w
dXJwb3NlIGFyZ3VtZW50IikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmQKKyAgICAg
ICAgICAgICAgICAgICAgICAgIGVuZAorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAg
ICAgICAgICAgIGZvcm1zIDw8IEZvcm0ubmV3KGtpbmRzLCBhbHROYW1lKQorICAgICAgICAgICAg
ICAgICAgICBicmVhayB1bmxlc3MgaXNLaW5kKHRva2VuKQorICAgICAgICAgICAgICAgIH0KKwor
ICAgICAgICAgICAgICAgIG9wY29kZS5vdmVybG9hZHMgPDwgT3ZlcmxvYWQubmV3KHNpZ25hdHVy
ZSwgZm9ybXMpCisgICAgICAgICAgICBlbmQKKyAgICAgICAgfQorCisgICAgICAgIHJlc3VsdAor
ICAgIGVuZAorZW5kCisKKyRmaWxlTmFtZSA9IEFSR1ZbMF0KKworcGFyc2VyID0gUGFyc2VyLm5l
dyhJTzo6cmVhZCgkZmlsZU5hbWUpLCAkZmlsZU5hbWUpCiskb3Bjb2RlcyA9IHBhcnNlci5wYXJz
ZQorCitkZWYgd3JpdGVIKGZpbGVuYW1lKQorICAgIEZpbGUub3BlbigiQWlyI3tmaWxlbmFtZX0u
aCIsICJ3IikgeworICAgICAgICB8IG91dHAgfAorICAgICAgICAKKyAgICAgICAgb3V0cC5wdXRz
ICIvLyBHZW5lcmF0ZWQgYnkgb3Bjb2RlX2dlbmVyYXRvci5yYiBmcm9tICN7JGZpbGVOYW1lfSAt
LSBkbyBub3QgZWRpdCEiCisgICAgICAgIAorICAgICAgICBvdXRwLnB1dHMgIiNpZm5kZWYgQWly
I3tmaWxlbmFtZX1faCIKKyAgICAgICAgb3V0cC5wdXRzICIjZGVmaW5lIEFpciN7ZmlsZW5hbWV9
X2giCisKKyAgICAgICAgeWllbGQgb3V0cAorICAgICAgICAKKyAgICAgICAgb3V0cC5wdXRzICIj
ZW5kaWYgLy8gQWlyI3tmaWxlbmFtZX1faCIKKyAgICB9CitlbmQKKworZGVmIHdyaXRlQ1BQKGZp
bGVuYW1lKQorICAgIEZpbGUub3BlbigiQWlyI3tmaWxlbmFtZX0uY3BwIiwgInciKSB7CisgICAg
ICAgIHwgb3V0cCB8CisgICAgICAgIAorICAgICAgICBvdXRwLnB1dHMgIi8vIEdlbmVyYXRlZCBi
eSBvcGNvZGVfZ2VuZXJhdG9yLnJiIGZyb20gI3skZmlsZU5hbWV9IC0tIGRvIG5vdCBlZGl0ISIK
KyAgICAgICAgCisgICAgICAgIG91dHAucHV0cyAiI2luY2x1ZGUgXCJjb25maWcuaFwiIgorICAg
ICAgICBvdXRwLnB1dHMgIiNpbmNsdWRlIFwiQWlyI3tmaWxlbmFtZX0uaFwiIgorCisgICAgICAg
IHlpZWxkIG91dHAKKyAgICB9CitlbmQKKword3JpdGVIKCJPcGNvZGVzIikgeworICAgIHwgb3V0
cCB8CisgICAgb3V0cC5wdXRzICJuYW1lc3BhY2UgSlNDIHsgbmFtZXNwYWNlIEIzIHsgbmFtZXNw
YWNlIEFpciB7IgorICAgIG91dHAucHV0cyAiZW51bSBPcGNvZGUgOiBpbnQxNl90IHsiCisgICAg
JG9wY29kZXMua2V5cy5zb3J0LmVhY2ggeworICAgICAgICB8IG9wY29kZSB8CisgICAgICAgIG91
dHAucHV0cyAiICAgICN7b3Bjb2RlfSwiCisgICAgfQorICAgIG91dHAucHV0cyAifSIKKworICAg
IG91dHAucHV0cyAic3RhdGljIGNvbnN0IHVuc2lnbmVkIG51bU9wY29kZXMgPSAjeyRvcGNvZGVz
LmtleXMuc2l6ZX07IgorICAgIG91dHAucHV0cyAifSB9IH0gLy8gbmFtZXNwYWNlIEpTQzo6QjM6
OkFpciIKKyAgICAKKyAgICBvdXRwLnB1dHMgIm5hbWVzcGFjZSBXVEYgeyIKKyAgICBvdXRwLnB1
dHMgImNsYXNzIFByaW50U3RyZWFtOyIKKyAgICBvdXRwLnB1dHMgInZvaWQgcHJpbnRJbnRlcm5h
bChQcmludFN0cmVhbSYsIEpTQzo6QjM6OkFpcjo6T3Bjb2RlKTsiCisgICAgb3V0cC5wdXRzICJ9
IC8vIG5hbWVzcGFjZSBXVEYiCit9CisKK3dyaXRlQ1BQKCJPcGNvZGVzIikgeworICAgIHwgb3V0
cCB8CisgICAgb3V0cC5wdXRzICIjaW5jbHVkZSBcInd0Zi9QcmludFN0cmVhbS5oXCIiCisgICAg
b3V0cC5wdXRzICJuYW1lc3BhY2UgV1RGIHsiCisgICAgb3V0cC5wdXRzICJ1c2luZyBuYW1lc3Bh
Y2UgSlNDOjpCMzo6QWlyOyIKKyAgICBvdXRwLnB1dHMgInZvaWQgcHJpbnRJbnRlcm5hbChQcmlu
dFN0cmVhbSYgb3V0LCBPcGNvZGUgb3Bjb2RlKSIKKyAgICBvdXRwLnB1dHMgInsiCisgICAgb3V0
cC5wdXRzICIgICAgc3dpdGNoIChvcGNvZGUpIHsiCisgICAgJG9wY29kZXMua2V5cy5lYWNoIHsK
KyAgICAgICAgfCBvcGNvZGUgfAorICAgICAgICBvdXRwLnB1dHMgIiAgICBjYXNlICN7b3Bjb2Rl
fToiCisgICAgICAgIG91dHAucHV0cyAiICAgICAgICBvdXQucHJpbnQoXCIje29wY29kZX1cIik7
IgorICAgICAgICBvdXRwLnB1dHMgIiAgICAgICAgcmV0dXJuOyIKKyAgICB9CisgICAgb3V0cC5w
dXRzICIgICAgfSIKKyAgICBvdXRwLnB1dHMgIiAgICBSRUxFQVNFX0FTU0VSVF9OT1RfUkVBQ0hF
RCgpOyIKKyAgICBvdXRwLnB1dHMgIn0iCisgICAgb3V0cC5wdXRzICJ9IC8vIG5hbWVzcGFjZSBX
VEYiCit9CisKKyMgRnJvbSBoZXJlIG9uLCB3ZSBkb24ndCB0cnkgdG8gZW1pdCBwcm9wZXJseSBp
bmRlbnRlZCBjb2RlLCBzaW5jZSB3ZSdyZSB1c2luZyBhIHJlY3Vyc2l2ZSBwYXR0ZXJuCisjIG1h
dGNoZXIuCisKK2RlZiBtYXRjaEZvcm1zKG91dHAsIHNwZWVkLCBmb3JtcywgY29sdW1uSW5kZXgs
IGNvbHVtbkdldHRlciwgZmlsdGVyLCBjYWxsYmFjaykKKyAgICByZXR1cm4gaWYgZm9ybXMubGVu
Z3RoID09IDAKKworICAgIGlmIGZpbHRlcltmb3Jtc10KKyAgICAgICAgcmV0dXJuCisgICAgZW5k
CisKKyAgICBvdXRwLnB1dHMgIiAvLyBjb2x1bW5JbmRleCA9ICN7Y29sdW1uSW5kZXh9LCBmb3Jt
cyA9ICN7Zm9ybXMuaW5zcGVjdH0sIG51bUNvbHVtbnMgPSAje2Zvcm1zWzBdLmtpbmRzLmxlbmd0
aH0iCisgICAgaWYgY29sdW1uSW5kZXggPj0gZm9ybXNbMF0ua2luZHMubGVuZ3RoCisgICAgICAg
IHJhaXNlIHVubGVzcyBmb3Jtcy5sZW5ndGggPT0gMQorICAgICAgICBjYWxsYmFja1tmb3Jtc1sw
XV0KKyAgICAgICAgcmV0dXJuCisgICAgZW5kCisgICAgCisgICAgZ3JvdXBzID0ge30KKyAgICBm
b3Jtcy5lYWNoIHsKKyAgICAgICAgfCBmb3JtIHwKKyAgICAgICAga2luZCA9IGZvcm0ua2luZHNb
Y29sdW1uSW5kZXhdLm5hbWUKKyAgICAgICAgaWYgZ3JvdXBzW2tpbmRdCisgICAgICAgICAgICBn
cm91cHNba2luZF0gPDwgZm9ybQorICAgICAgICBlbHNlCisgICAgICAgICAgICBncm91cHNba2lu
ZF0gPSBbZm9ybV0KKyAgICAgICAgZW5kCisgICAgfQorCisgICAgaWYgc3BlZWQgPT0gOmZhc3Qg
YW5kIGdyb3Vwcy5sZW5ndGggPT0gMQorICAgICAgICBtYXRjaEZvcm1zKG91dHAsIHNwZWVkLCBm
b3JtcywgY29sdW1uSW5kZXggKyAxLCBjb2x1bW5HZXR0ZXIsIGZpbHRlciwgY2FsbGJhY2spCisg
ICAgICAgIHJldHVybgorICAgIGVuZAorCisgICAgb3V0cC5wdXRzICJzd2l0Y2ggKCN7Y29sdW1u
R2V0dGVyW2NvbHVtbkluZGV4XX0pIHsiCisgICAgZ3JvdXBzLmVhY2hfcGFpciB7CisgICAgICAg
IHwga2V5LCB2YWx1ZSB8CisgICAgICAgIG91dHAucHV0cyAiY2FzZSBBcmc6OiN7a2V5fToiCisg
ICAgICAgIG1hdGNoRm9ybXMob3V0cCwgc3BlZWQsIHZhbHVlLCBjb2x1bW5JbmRleCArIDEsIGNv
bHVtbkdldHRlciwgZmlsdGVyLCBjYWxsYmFjaykKKyAgICAgICAgb3V0cC5wdXRzICJicmVhazsi
CisgICAgfQorICAgIG91dHAucHV0cyAiZGVmYXVsdDoiCisgICAgb3V0cC5wdXRzICJicmVhazsi
CisgICAgb3V0cC5wdXRzICJ9IgorZW5kCisKK2RlZiBtYXRjaEluc3RPdmVybG9hZChvdXRwLCBz
cGVlZCwgaW5zdCkKKyAgICBvdXRwLnB1dHMgInN3aXRjaCAoI3tpbnN0fS0+b3Bjb2RlKSB7Igor
ICAgICRvcGNvZGVzLnZhbHVlcy5lYWNoIHsKKyAgICAgICAgfCBvcGNvZGUgfAorICAgICAgICBv
dXRwLnB1dHMgImNhc2UgI3tvcGNvZGUubmFtZX06IgorICAgICAgICBpZiBvcGNvZGUuc3BlY2lh
bAorICAgICAgICAgICAgeWllbGQgb3Bjb2RlLCBuaWwKKyAgICAgICAgZWxzZQorICAgICAgICAg
ICAgbmVlZE92ZXJsb2FkU3dpdGNoID0gKG9wY29kZS5vdmVybG9hZHMuc2l6ZSAhPSAxKSBvciBz
cGVlZCA9PSA6c2FmZQorICAgICAgICAgICAgb3V0cC5wdXRzICJzd2l0Y2ggKCN7aW5zdH0tPmFy
Z3Muc2l6ZSgpKSB7IiBpZiBuZWVkT3ZlcmxvYWRTd2l0Y2gKKyAgICAgICAgICAgIG9wY29kZS5v
dmVybG9hZHMuZWFjaCB7CisgICAgICAgICAgICAgICAgfCBvdmVybG9hZCB8CisgICAgICAgICAg
ICAgICAgb3V0cC5wdXRzICJjYXNlICN7b3ZlcmxvYWQuc2lnbmF0dXJlLmxlbmd0aH06IiBpZiBu
ZWVkT3ZlcmxvYWRTd2l0Y2gKKyAgICAgICAgICAgICAgICB5aWVsZCBvcGNvZGUsIG92ZXJsb2Fk
CisgICAgICAgICAgICAgICAgb3V0cC5wdXRzICJicmVhazsiIGlmIG5lZWRPdmVybG9hZFN3aXRj
aAorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgbmVlZE92ZXJsb2FkU3dpdGNoCisgICAg
ICAgICAgICAgICAgb3V0cC5wdXRzICJkZWZhdWx0OiIKKyAgICAgICAgICAgICAgICBvdXRwLnB1
dHMgImJyZWFrOyIKKyAgICAgICAgICAgICAgICBvdXRwLnB1dHMgIn0iCisgICAgICAgICAgICBl
bmQKKyAgICAgICAgZW5kCisgICAgICAgIG91dHAucHV0cyAiYnJlYWs7IgorICAgIH0KKyAgICBv
dXRwLnB1dHMgImRlZmF1bHQ6IgorICAgIG91dHAucHV0cyAiYnJlYWs7IgorICAgIG91dHAucHV0
cyAifSIKK2VuZAorICAgIAorZGVmIG1hdGNoSW5zdE92ZXJsb2FkRm9ybShvdXRwLCBzcGVlZCwg
aW5zdCkKKyAgICBtYXRjaEluc3RPdmVybG9hZChvdXRwLCBzcGVlZCwgaW5zdCkgeworICAgICAg
ICB8IG9wY29kZSwgb3ZlcmxvYWQgfAorICAgICAgICBpZiBvcGNvZGUuc3BlY2lhbAorICAgICAg
ICAgICAgeWllbGQgb3Bjb2RlLCBuaWwsIG5pbAorICAgICAgICBlbHNlCisgICAgICAgICAgICBj
b2x1bW5HZXR0ZXIgPSBwcm9jIHsKKyAgICAgICAgICAgICAgICB8IGNvbHVtbkluZGV4IHwKKyAg
ICAgICAgICAgICAgICAiI3tpbnN0fS0+YXJnc1sje2NvbHVtbkluZGV4fV0ua2luZCgpIgorICAg
ICAgICAgICAgfQorICAgICAgICAgICAgZmlsdGVyID0gcHJvYyB7IGZhbHNlIH0KKyAgICAgICAg
ICAgIGNhbGxiYWNrID0gcHJvYyB7CisgICAgICAgICAgICAgICAgfCBmb3JtIHwKKyAgICAgICAg
ICAgICAgICB5aWVsZCBvcGNvZGUsIG92ZXJsb2FkLCBmb3JtCisgICAgICAgICAgICB9CisgICAg
ICAgICAgICBtYXRjaEZvcm1zKG91dHAsIHNwZWVkLCBvdmVybG9hZC5mb3JtcywgMCwgY29sdW1u
R2V0dGVyLCBmaWx0ZXIsIGNhbGxiYWNrKQorICAgICAgICBlbmQKKyAgICB9CitlbmQKKword3Jp
dGVIKCJPcGNvZGVVdGlscyIpIHsKKyAgICB8IG91dHAgfAorICAgIG91dHAucHV0cyAiI2luY2x1
ZGUgXCJBaXJJbnN0LmhcIiIKKyAgICBvdXRwLnB1dHMgIiNpbmNsdWRlIFwiQWlyU3BlY2lhbHMu
aFwiIgorICAgIG91dHAucHV0cyAibmFtZXNwYWNlIEpTQyB7IG5hbWVzcGFjZSBCMyB7IG5hbWVz
cGFjZSBBaXIgeyIKKyAgICBvdXRwLnB1dHMgInRlbXBsYXRlPHR5cGVuYW1lIEZ1bmN0b3I+Igor
ICAgIG91dHAucHV0cyAidm9pZCBJbnN0Ojpmb3JFYWNoQXJnUm9sZShjb25zdCBGdW5jdG9yJiBm
dW5jdG9yKSIKKyAgICBvdXRwLnB1dHMgInsiCisgICAgbWF0Y2hJbnN0T3ZlcmxvYWQob3V0cCwg
OmZhc3QsICJ0aGlzIikgeworICAgICAgICB8IG9wY29kZSwgb3ZlcmxvYWQgfAorICAgICAgICBp
ZiBvcGNvZGUuc3BlY2lhbAorICAgICAgICAgICAgb3V0cC5wdXRzICIje29wY29kZS5uYW1lfVNw
ZWNpYWxzOjpmb3JFYWNoQXJnUm9sZSh0aGlzLCBmdW5jdG9yKTsiCisgICAgICAgIGVsc2UKKyAg
ICAgICAgICAgIG92ZXJsb2FkLnNpZ25hdHVyZS5lYWNoX3dpdGhfaW5kZXggeworICAgICAgICAg
ICAgICAgIHwgYXJnLCBpbmRleCB8CisgICAgICAgICAgICAgICAgcm9sZSA9IG5pbAorICAgICAg
ICAgICAgICAgIGNhc2UgYXJnLnJvbGUKKyAgICAgICAgICAgICAgICB3aGVuICJVIgorICAgICAg
ICAgICAgICAgICAgICByb2xlID0gIlVzZSIKKyAgICAgICAgICAgICAgICB3aGVuICJEIgorICAg
ICAgICAgICAgICAgICAgICByb2xlID0gIkRlZiIKKyAgICAgICAgICAgICAgICB3aGVuICJVRCIK
KyAgICAgICAgICAgICAgICAgICAgcm9sZSA9ICJVc2VEZWYiCisgICAgICAgICAgICAgICAgZWxz
ZQorICAgICAgICAgICAgICAgICAgICByYWlzZQorICAgICAgICAgICAgICAgIGVuZAorICAgICAg
ICAgICAgICAgIAorICAgICAgICAgICAgICAgIG91dHAucHV0cyAiZnVuY3RvcihhcmdzWyN7aW5k
ZXh9XSwgQXJnOjoje3JvbGV9LCBBcmc6OiN7YXJnLnR5cGV9UCk7IgorICAgICAgICAgICAgfQor
ICAgICAgICBlbmQKKyAgICB9CisgICAgb3V0cC5wdXRzICJ9IgorICAgIG91dHAucHV0cyAifSB9
IH0gLy8gbmFtZXNwYWNlIEpTQzo6QjM6OkFpciIKK30KKword3JpdGVDUFAoIk9wY29kZVV0aWxz
IikgeworICAgIHwgb3V0cCB8CisgICAgb3V0cC5wdXRzICIjaW5jbHVkZSBcIkFpckluc3QuaFwi
IgorICAgIG91dHAucHV0cyAiI2luY2x1ZGUgXCJBaXJTcGVjaWFscy5oXCIiCisgICAgb3V0cC5w
dXRzICJuYW1lc3BhY2UgSlNDIHsgbmFtZXNwYWNlIEIzIHsgbmFtZXNwYWNlIEFpciB7IgorICAg
IG91dHAucHV0cyAiaW5saW5lIGJvb2wgaGlkZGVuVHJ1dGgoKSB7IHJldHVybiB0cnVlOyB9Igor
ICAgIG91dHAucHV0cyAiI2RlZmluZSBSRVRVUk4odmFsdWUpIGRvIHtcXCIKKyAgICBvdXRwLnB1
dHMgIiAgICBpZiAoaGlkZGVuVHJ1dGgoKSlcXCIKKyAgICBvdXRwLnB1dHMgIiAgICAgICAgcmV0
dXJuICh2YWx1ZSk7XFwiCisgICAgb3V0cC5wdXRzICJ9IgorICAgIG91dHAucHV0cyAiYm9vbCBJ
bnN0Ojppc1ZhbGlkRm9ybSgpIgorICAgIG91dHAucHV0cyAieyIKKyAgICBtYXRjaEluc3RPdmVy
bG9hZEZvcm0ob3V0cCwgOnNhZmUsICJ0aGlzIikgeworICAgICAgICB8IG9wY29kZSwgb3Zlcmxv
YWQsIGZvcm0gfAorICAgICAgICBpZiBvcGNvZGUuc3BlY2lhbAorICAgICAgICAgICAgb3V0cC5w
dXRzICJSRVRVUk4oI3tvcGNvZGUubmFtZX1TcGVjaWFsczo6aXNWYWxpZCh0aGlzKSk7IgorICAg
ICAgICBlbHNlCisgICAgICAgICAgICBuZWVkc01vcmVWYWxpZGF0aW9uID0gZmFsc2UKKyAgICAg
ICAgICAgIG92ZXJsb2FkLnNpZ25hdHVyZS5sZW5ndGgudGltZXMgeworICAgICAgICAgICAgICAg
IHwgaW5kZXggfAorICAgICAgICAgICAgICAgIHJvbGUgPSBvdmVybG9hZC5zaWduYXR1cmVbaW5k
ZXhdLnJvbGUKKyAgICAgICAgICAgICAgICB0eXBlID0gb3ZlcmxvYWQuc2lnbmF0dXJlW2luZGV4
XS50eXBlCisgICAgICAgICAgICAgICAga2luZCA9IGZvcm0ua2luZHNbaW5kZXhdCisgICAgICAg
ICAgICAgICAgbmVlZHNNb3JlVmFsaWRhdGlvbiB8PSBraW5kLnNwZWNpYWwKKyAgICAgICAgICAg
ICAgICAKKyAgICAgICAgICAgICAgICAjIFdlIGFscmVhZHkga25vdyB0aGF0IHRoZSBmb3JtIG1h
dGNoZXMuIFdlIGRvbid0IGhhdmUgdG8gdmFsaWRhdGUgdGhlIHJvbGUsIHNpbmNlCisgICAgICAg
ICAgICAgICAgIyBraW5kIGltcGxpZXMgcm9sZS4gU28sIHRoZSBvbmx5IHRoaW5nIGxlZnQgdG8g
dmFsaWRhdGUgaXMgdGhlIHR5cGUuIEFuZCB3ZSBvbmx5IGhhdmUKKyAgICAgICAgICAgICAgICAj
IHRvIHZhbGlkYXRlIHRoZSB0eXBlIGlmIHdlIGhhdmUgYSBUbXAuCisgICAgICAgICAgICAgICAg
aWYga2luZC5uYW1lID09ICJUbXAiCisgICAgICAgICAgICAgICAgICAgIG91dHAucHV0cyAiaWYg
KCFhcmdzWyN7aW5kZXh9XS50bXAoKS5pcyN7dHlwZX1QKCkpIgorICAgICAgICAgICAgICAgICAg
ICBvdXRwLnB1dHMgIlJFVFVSTihmYWxzZSk7IgorICAgICAgICAgICAgICAgIGVuZAorICAgICAg
ICAgICAgfQorICAgICAgICAgICAgaWYgbmVlZHNNb3JlVmFsaWRhdGlvbgorICAgICAgICAgICAg
ICAgIG91dHAucHV0cyAiaWYgKCEje29wY29kZS5uYW1lfVNwZWNpYWxzOjppc1ZhbGlkKHRoaXMp
KSIKKyAgICAgICAgICAgICAgICBvdXRwLnB1dHMgIlJFVFVSTihmYWxzZSk7IgorICAgICAgICAg
ICAgZW5kCisgICAgICAgICAgICBvdXRwLnB1dHMgIlJFVFVSTih0cnVlKTsiCisgICAgICAgIGVu
ZAorICAgIH0KKyAgICBvdXRwLnB1dHMgInJldHVybiBmYWxzZTsiCisgICAgb3V0cC5wdXRzICJ9
IgorCisgICAgb3V0cC5wdXRzICJib29sIEluc3Q6OmFkbWl0c0FkZHIodW5zaWduZWQgYXJnSW5k
ZXgpIgorICAgIG91dHAucHV0cyAieyIKKyAgICBvdXRwLnB1dHMgInN3aXRjaCAob3Bjb2RlKSB7
IgorICAgICRvcGNvZGVzLnZhbHVlcy5lYWNoIHsKKyAgICAgICAgfCBvcGNvZGUgfAorICAgICAg
ICBvdXRwLnB1dHMgImNhc2UgI3tvcGNvZGUubmFtZX06IgorCisgICAgICAgIGlmIG9wY29kZS5z
cGVjaWFsCisgICAgICAgICAgICBvdXRwLnB1dHMgIlJFVFVSTigje29wY29kZS5uYW1lfVNwZWNp
YWxzOjphZG1pdHNBZGRyKGFyZ0luZGV4KSk7IgorICAgICAgICBlbHNlCisgICAgICAgICAgICAj
IFN3aXRjaCBvbiB0aGUgYXJnSW5kZXguCisgICAgICAgICAgICBvdXRwLnB1dHMgInN3aXRjaCAo
YXJnSW5kZXgpIHsiCisKKyAgICAgICAgICAgIG51bUFyZ3MgPSBvcGNvZGUub3ZlcmxvYWRzLm1h
cCB7CisgICAgICAgICAgICAgICAgfCBvdmVybG9hZCB8CisgICAgICAgICAgICAgICAgb3Zlcmxv
YWQuc2lnbmF0dXJlLmxlbmd0aAorICAgICAgICAgICAgfS5tYXgKKyAgICAgICAgICAgIAorICAg
ICAgICAgICAgbnVtQXJncy50aW1lcyB7CisgICAgICAgICAgICAgICAgfCBhcmdJbmRleCB8Cisg
ICAgICAgICAgICAgICAgb3V0cC5wdXRzICJjYXNlICN7YXJnSW5kZXh9OiIKKworICAgICAgICAg
ICAgICAgICMgQ2hlY2sgaWYgYWxsIG9mIHRoZSBmb3JtcyBvZiBhbGwgb2YgdGhlIG92ZXJsb2Fk
cyBlaXRoZXIgZG8sIG9yIGRvbid0LCBhZG1pdCBhbiBhZGRyZXNzCisgICAgICAgICAgICAgICAg
IyBhdCB0aGlzIGluZGV4LiBXZSBleHBlY3QgdGhpcyB0byBiZSBhIHZlcnkgY29tbW9uIGNhc2Uu
CisgICAgICAgICAgICAgICAgbnVtWWVzID0gMAorICAgICAgICAgICAgICAgIG51bU5vID0gMAor
ICAgICAgICAgICAgICAgIG9wY29kZS5vdmVybG9hZHMuZWFjaCB7CisgICAgICAgICAgICAgICAg
ICAgIHwgb3ZlcmxvYWQgfAorICAgICAgICAgICAgICAgICAgICBvdmVybG9hZC5mb3Jtcy5lYWNo
IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHwgZm9ybSB8CisgICAgICAgICAgICAgICAgICAg
ICAgICBpZiBmb3JtLmtpbmRzW2FyZ0luZGV4XSA9PSAiQWRkciIKKyAgICAgICAgICAgICAgICAg
ICAgICAgICAgICBudW1ZZXMgKz0gMQorICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAg
ICAgICAgICAgICAgICAgICAgICAgICAgIG51bU5vICs9IDEKKyAgICAgICAgICAgICAgICAgICAg
ICAgIGVuZAorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAg
ICAgICAgICAgICAgIyBOb3RlIHRoYXQgd2UgZGVsaWJlcmF0ZWx5IHRlc3QgbnVtWWVzIGZpcnN0
IGJlY2F1c2UgaWYgd2UgZW5kIHVwIHdpdGggbm8gZm9ybXMsIHdlIHdhbnQKKyAgICAgICAgICAg
ICAgICAjIHRvIHNheSB0aGF0IEFkZHJlc3MgaXMgaW5hZG1pc3NpYmxlLgorICAgICAgICAgICAg
ICAgIGlmIG51bVllcyA9PSAwCisgICAgICAgICAgICAgICAgICAgIG91dHAucHV0cyAiUkVUVVJO
KGZhbHNlKTsiCisgICAgICAgICAgICAgICAgZWxzaWYgbnVtTm8gPT0gMAorICAgICAgICAgICAg
ICAgICAgICBvdXRwLnB1dHMgIlJFVFVSTih0cnVlKTsiCisgICAgICAgICAgICAgICAgZWxzZQor
ICAgICAgICAgICAgICAgICAgICAjIE5vdyBkbyB0aGUgZnVsbCB0ZXN0LgorCisgICAgICAgICAg
ICAgICAgICAgIG5lZWRPdmVybG9hZFN3aXRjaCA9IChvcGNvZGUub3ZlcmxvYWRzLnNpemUgIT0g
MSkKKworICAgICAgICAgICAgICAgICAgICBvdXRwLnB1dHMgInN3aXRjaCAoYXJncy5zaXplKCkp
IHsiIGlmIG5lZWRPdmVybG9hZFN3aXRjaAorICAgICAgICAgICAgICAgICAgICBvcGNvZGUub3Zl
cmxvYWRzLmVhY2ggeworICAgICAgICAgICAgICAgICAgICAgICAgfCBvdmVybG9hZCB8CisKKyAg
ICAgICAgICAgICAgICAgICAgICAgICMgQWdhaW4sIGNoZWNrIGlmIGFsbCBvZiB0aGVtIGRvIHdo
YXQgd2Ugd2FudC4KKyAgICAgICAgICAgICAgICAgICAgICAgIG51bVllcyA9IDAKKyAgICAgICAg
ICAgICAgICAgICAgICAgIG51bU5vID0gMAorICAgICAgICAgICAgICAgICAgICAgICAgb3Zlcmxv
YWQuZm9ybXMuZWFjaCB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBmb3JtIHwKKyAg
ICAgICAgICAgICAgICAgICAgICAgICAgICBpZiBmb3JtLmtpbmRzW2FyZ0luZGV4XSA9PSAiQWRk
ciIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtWWVzICs9IDEKKyAgICAgICAg
ICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
IG51bU5vICs9IDEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmQKKyAgICAgICAgICAg
ICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgaWYgbnVtWWVzID09IDAK
KyAgICAgICAgICAgICAgICAgICAgICAgICMgRG9uJ3QgZW1pdCBhbnl0aGluZywganVzdCBkcm9w
IHRvIGRlZmF1bHQuCisgICAgICAgICAgICAgICAgICAgICAgICBlbHNpZiBudW1ObyA9PSAwCisg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cC5wdXRzICJjYXNlICN7b3ZlcmxvYWQuc2ln
bmF0dXJlLmxlbmd0aH06IiBpZiBuZWVkT3ZlcmxvYWRTd2l0Y2gKKyAgICAgICAgICAgICAgICAg
ICAgICAgICAgICBvdXRwLnB1dHMgIlJFVFVSTih0cnVlKTsiCisgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgb3V0cC5wdXRzICJicmVhazsiIGlmIG5lZWRPdmVybG9hZFN3aXRjaAorICAgICAg
ICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHAu
cHV0cyAiY2FzZSAje292ZXJsb2FkLnNpZ25hdHVyZS5sZW5ndGh9OiIgaWYgbmVlZE92ZXJsb2Fk
U3dpdGNoCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIFRoaXMgaXMgaG93IHdlIHRl
c3QgdGhlIGh5cG90aGVzaXMgdGhhdCBjaGFuZ2luZyB0aGlzIGFyZ3VtZW50IHRvIGFuCisgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgIyBhZGRyZXNzIHlpZWxkcyBhIHZhbGlkIGZvcm0uCisg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sdW1uR2V0dGVyID0gcHJvYyB7CisgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgIHwgY29sdW1uSW5kZXggfAorICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICBpZiBjb2x1bW5JbmRleCA9PSBhcmdJbmRleAorICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgIkFyZzo6QWRkciIKKyAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImFy
Z3NbI3tjb2x1bW5JbmRleH1dLmtpbmQoKSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgZW5kCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAg
ICAgICAgICAgIGZpbHRlciA9IHByb2MgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICB8IGZvcm1zIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cC5wdXRzICIg
Ly8gQ29uc2lkZXJpbmcgZm9ybXM6ICN7Zm9ybXMuaW5zcGVjdH0iCisgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgIG51bVllcyA9IDAKKworICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICBmb3Jtcy5lYWNoIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwg
Zm9ybSB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiBmb3JtLmtpbmRz
W2FyZ0luZGV4XSA9PSAiQWRkciIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICBudW1ZZXMgKz0gMQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5k
CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICBpZiBudW1ZZXMgPT0gMAorICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgIyBEcm9wIGRvd24sIGVtaXQgbm8gY29kZSwgc2luY2Ugd2UgY2Fubm90IG1hdGNo
LgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZQorICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAjIEtlZXAgZ29pbmcuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBm
YWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmQKKyAgICAgICAgICAgICAg
ICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2sgPSBw
cm9jIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cC5wdXRzICJSRVRVUk4o
dHJ1ZSk7IgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAg
ICAgICAgICAgICBvdXRwLnB1dHMgIiAvLyBNYXRjaGluZyBmb3JtcyBvZiBvdmVybG9hZDogI3tv
dmVybG9hZC5pbnNwZWN0fSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXRjaEZvcm1z
KG91dHAsIDpzYWZlLCBvdmVybG9hZC5mb3JtcywgMCwgY29sdW1uR2V0dGVyLCBmaWx0ZXIsIGNh
bGxiYWNrKQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cC5wdXRzICJicmVhazsi
IGlmIG5lZWRPdmVybG9hZFN3aXRjaAorICAgICAgICAgICAgICAgICAgICAgICAgZW5kCisgICAg
ICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgbmVlZE92ZXJsb2FkU3dp
dGNoCisgICAgICAgICAgICAgICAgICAgICAgICBvdXRwLnB1dHMgImRlZmF1bHQ6IgorICAgICAg
ICAgICAgICAgICAgICAgICAgb3V0cC5wdXRzICJicmVhazsiCisgICAgICAgICAgICAgICAgICAg
ICAgICBvdXRwLnB1dHMgIn0iCisgICAgICAgICAgICAgICAgICAgIGVuZAorICAgICAgICAgICAg
ICAgIGVuZAorICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIG91dHAucHV0cyAiYnJl
YWs7IgorICAgICAgICAgICAgfQorICAgICAgICAgICAgCisgICAgICAgICAgICBvdXRwLnB1dHMg
ImRlZmF1bHQ6IgorICAgICAgICAgICAgb3V0cC5wdXRzICJicmVhazsiCisgICAgICAgICAgICBv
dXRwLnB1dHMgIn0iCisgICAgICAgIGVuZAorICAgICAgICAKKyAgICAgICAgb3V0cC5wdXRzICJi
cmVhazsiCisgICAgfQorICAgIG91dHAucHV0cyAiZGVmYXVsdDoiOworICAgIG91dHAucHV0cyAi
YnJlYWs7IgorICAgIG91dHAucHV0cyAifSIKKyAgICBvdXRwLnB1dHMgInJldHVybiBmYWxzZTsi
CisgICAgb3V0cC5wdXRzICJ9IgorCisgICAgb3V0cC5wdXRzICJ2b2lkIEluc3Q6OmdlbmVyYXRl
KE1hY3JvQXNzZW1ibGVyJiBqaXQpIGNvbnN0IgorICAgIG91dHAucHV0cyAieyIKKyAgICBtYXRj
aEluc3RPdmVybG9hZEZvcm0ob3V0cCwgOmZhc3QsICJ0aGlzIikgeworICAgICAgICB8IG9wY29k
ZSwgb3ZlcmxvYWQsIGZvcm0gfAorICAgICAgICBpZiBvcGNvZGUuc3BlY2lhbAorICAgICAgICAg
ICAgb3V0cC5wdXRzICIje29wY29kZS5uYW1lfVNwZWNpYWxzOjpnZW5lcmF0ZSh0aGlzLCBqaXQp
OyIKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgaWYgZm9ybS5hbHROYW1lCisgICAgICAgICAg
ICAgICAgbWV0aG9kTmFtZSA9IGZvcm0uYWx0TmFtZQorICAgICAgICAgICAgZWxzZQorICAgICAg
ICAgICAgICAgIG1ldGhvZE5hbWUgPSBvcGNvZGUubWFzbU5hbWUKKyAgICAgICAgICAgIGVuZAor
ICAgICAgICAgICAgb3V0cC5wcmludCAiaml0LiN7bWV0aG9kTmFtZX0oIgorCisgICAgICAgICAg
ICBmb3JtLmtpbmRzLmVhY2hfd2l0aF9pbmRleCB7CisgICAgICAgICAgICAgICAgfCBraW5kLCBp
bmRleCB8CisgICAgICAgICAgICAgICAgaWYgaW5kZXggIT0gMAorICAgICAgICAgICAgICAgICAg
ICBvdXRwLnByaW50ICIsICIKKyAgICAgICAgICAgICAgICBlbmQKKyAgICAgICAgICAgICAgICBj
YXNlIGtpbmQubmFtZQorICAgICAgICAgICAgICAgIHdoZW4gIlRtcCIKKyAgICAgICAgICAgICAg
ICAgICAgaWYgb3ZlcmxvYWQuc2lnbmF0dXJlW2luZGV4XS50eXBlID09ICJHIgorICAgICAgICAg
ICAgICAgICAgICAgICAgb3V0cC5wcmludCAiYXJnc1sje2luZGV4fV0uZ3ByKCkiCisgICAgICAg
ICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgIG91dHAucHJpbnQgImFy
Z3NbI3tpbmRleH1dLmZwcigpIgorICAgICAgICAgICAgICAgICAgICBlbmQKKyAgICAgICAgICAg
ICAgICB3aGVuICJJbW0iCisgICAgICAgICAgICAgICAgICAgIG91dHAucHJpbnQgImFyZ3NbI3tp
bmRleH1dLmFzVHJ1c3RlZEltbTMyKCkiCisgICAgICAgICAgICAgICAgd2hlbiAiSW1tUHRyIgor
ICAgICAgICAgICAgICAgICAgICBvdXRwLnByaW50ICJhcmdzWyN7aW5kZXh9XS5hc1RydXN0ZWRJ
bW1QdHIoKSIKKyAgICAgICAgICAgICAgICB3aGVuICJBZGRyIgorICAgICAgICAgICAgICAgICAg
ICBvdXRwLnByaW50ICJhcmdzWyN7aW5kZXh9XS5hc0FkZHJlc3MoKSIKKyAgICAgICAgICAgICAg
ICB3aGVuICJJbmRleCIKKyAgICAgICAgICAgICAgICAgICAgb3V0cC5wcmludCAiYXJnc1sje2lu
ZGV4fV0uYXNCYXNlSW5kZXgoKSIKKyAgICAgICAgICAgICAgICBlbmQKKyAgICAgICAgICAgIH0K
KworICAgICAgICAgICAgb3V0cC5wdXRzICIpOyIKKyAgICAgICAgZW5kCisgICAgfQorICAgIG91
dHAucHV0cyAifSIKKyAgICAKKyAgICBvdXRwLnB1dHMgIn0gfSB9IC8vIG5hbWVzcGFjZSBKU0M6
OkIzOjpBaXIiCit9CisKSW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9qaXQvUmVnLmgKPT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRDb3JlL2ppdC9SZWcuaAkocmV2aXNpb24gMTkx
MjM5KQorKysgU291cmNlL0phdmFTY3JpcHRDb3JlL2ppdC9SZWcuaAkod29ya2luZyBjb3B5KQpA
QCAtMTA1LDcgKzEwNSw2IEBAIHB1YmxpYzoKICAgICB1bnNpZ25lZCBpbmRleCgpIGNvbnN0IHsg
cmV0dXJuIG1faW5kZXg7IH0KICAgICAKICAgICBib29sIGlzU2V0KCkgY29uc3QgeyByZXR1cm4g
bV9pbmRleCAhPSBpbnZhbGlkKCk7IH0KLSAgICBib29sIG9wZXJhdG9yISgpIGNvbnN0IHsgcmV0
dXJuICFpc1NldCgpOyB9CiAgICAgZXhwbGljaXQgb3BlcmF0b3IgYm9vbCgpIGNvbnN0IHsgcmV0
dXJuIGlzU2V0KCk7IH0KIAogICAgIGJvb2wgaXNIYXNoVGFibGVEZWxldGVkVmFsdWUoKSBjb25z
dCB7IHJldHVybiBtX2luZGV4ID09IGRlbGV0ZWQoKTsgfQpAQCAtMTcwLDYgKzE2OSw0NiBAQCBw
dWJsaWM6CiAgICAgCiAgICAgdm9pZCBkdW1wKFByaW50U3RyZWFtJikgY29uc3Q7CiAKKyAgICBj
bGFzcyBBbGxSZWdzSXRlcmFibGUgeworICAgIHB1YmxpYzoKKworICAgICAgICBjbGFzcyBpdGVy
YXRvciB7CisgICAgICAgIHB1YmxpYzoKKyAgICAgICAgICAgIGl0ZXJhdG9yKCkgeyB9CisKKyAg
ICAgICAgICAgIGV4cGxpY2l0IGl0ZXJhdG9yKFJlZyByZWcpCisgICAgICAgICAgICAgICAgOiBt
X3JlZyhyZWcpCisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIFJl
ZyBvcGVyYXRvciooKSBjb25zdCB7IHJldHVybiBtX3JlZzsgfQorCisgICAgICAgICAgICBpdGVy
YXRvciYgb3BlcmF0b3IrKygpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbV9yZWcg
PSBtX3JlZy5uZXh0KCk7CisgICAgICAgICAgICAgICAgcmV0dXJuICp0aGlzOworICAgICAgICAg
ICAgfQorCisgICAgICAgICAgICBib29sIG9wZXJhdG9yPT0oY29uc3QgaXRlcmF0b3ImIG90aGVy
KSBjb25zdAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBtX3JlZyA9PSBv
dGhlci5tX3JlZzsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgYm9vbCBvcGVyYXRvciE9
KGNvbnN0IGl0ZXJhdG9yJiBvdGhlcikgY29uc3QKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAg
ICAgICByZXR1cm4gISgqdGhpcyA9PSBvdGhlcik7CisgICAgICAgICAgICB9CisKKyAgICAgICAg
cHJpdmF0ZToKKyAgICAgICAgICAgIFJlZyBtX3JlZzsKKyAgICAgICAgfTsKKworICAgICAgICBp
dGVyYXRvciBiZWdpbigpIGNvbnN0IHsgcmV0dXJuIGl0ZXJhdG9yKFJlZzo6Zmlyc3QoKSk7IH0K
KyAgICAgICAgaXRlcmF0b3IgZW5kKCkgY29uc3QgeyByZXR1cm4gaXRlcmF0b3IoUmVnKCkpOyB9
CisgICAgfTsKKworICAgIHN0YXRpYyBBbGxSZWdzSXRlcmFibGUgYWxsKCkgY29uc3QgeyByZXR1
cm4gQWxsUmVnc0l0ZXJhYmxlKCk7IH0KKwogcHJpdmF0ZToKICAgICBzdGF0aWMgdWludDhfdCBp
bnZhbGlkKCkgeyByZXR1cm4gMHhmZjsgfQogCkluZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUv
aml0L1JlZ2lzdGVyU2V0LmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRDb3JlL2pp
dC9SZWdpc3RlclNldC5oCShyZXZpc2lvbiAxOTEyMzkpCisrKyBTb3VyY2UvSmF2YVNjcmlwdENv
cmUvaml0L1JlZ2lzdGVyU2V0LmgJKHdvcmtpbmcgY29weSkKQEAgLTExNyw2ICsxMTcsMTMgQEAg
cHVibGljOgogICAgIAogICAgIGJvb2wgb3BlcmF0b3I9PShjb25zdCBSZWdpc3RlclNldCYgb3Ro
ZXIpIGNvbnN0IHsgcmV0dXJuIG1fdmVjdG9yID09IG90aGVyLm1fdmVjdG9yOyB9CiAgICAgdW5z
aWduZWQgaGFzaCgpIGNvbnN0IHsgcmV0dXJuIG1fdmVjdG9yLmhhc2goKTsgfQorCisgICAgdGVt
cGxhdGU8dHlwZW5hbWUgRnVuY3Rvcj4KKyAgICB2b2lkIGZvckVhY2goY29uc3QgRnVuY3RvciYg
ZnVuY3RvcikKKyAgICB7CisgICAgICAgIGZvciAoc2l6ZV90IGluZGV4IDogbV92ZWN0b3Iuc2V0
Qml0cygpKQorICAgICAgICAgICAgZnVuY3RvcihSZWc6OmZyb21JbmRleChpbmRleCkpOworICAg
IH0KICAgICAKIHByaXZhdGU6CiAgICAgdm9pZCBzZXRBbnkoUmVnIHJlZykgeyBzZXQocmVnKTsg
fQo=
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>263546</attachid>
            <date>2015-10-19 20:00:58 -0700</date>
            <delta_ts>2015-10-19 21:59:56 -0700</delta_ts>
            <desc>a little more</desc>
            <filename>blah.patch</filename>
            <type>text/plain</type>
            <size>219695</size>
            <attacher name="Filip Pizlo">fpizlo</attacher>
            
              <data encoding="base64">SW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM0FkZHJlc3NNYXRjaGVyLnBhdHRlcm5z
Cj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM0FkZHJlc3NNYXRjaGVy
LnBhdHRlcm5zCShyZXZpc2lvbiAwKQorKysgU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzQWRk
cmVzc01hdGNoZXIucGF0dGVybnMJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSw0MSBAQAorIyBD
b3B5cmlnaHQgKEMpIDIwMTUgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorIworIyBS
ZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9y
IHdpdGhvdXQKKyMgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhl
IGZvbGxvd2luZyBjb25kaXRpb25zCisjIGFyZSBtZXQ6CisjIDEuIFJlZGlzdHJpYnV0aW9ucyBv
ZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisjICAgIG5vdGlj
ZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4K
KyMgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBh
Ym92ZSBjb3B5cmlnaHQKKyMgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQg
dGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorIyAgICBkb2N1bWVudGF0aW9uIGFuZC9v
ciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorIworIyBU
SElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gQU5EIElUUyBDT05UUklCVVRP
UlMgYGBBUyBJUycnCisjIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElO
Q0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorIyBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9G
IE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisjIFBVUlBPU0Ug
QVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IgSVRTIENPTlRS
SUJVVE9SUworIyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFM
LCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCisjIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVE
SU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCisjIFNVQlNUSVRVVEUgR09P
RFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVT
UworIyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJ
QUJJTElUWSwgV0hFVEhFUiBJTgorIyBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9S
VCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorIyBBUklTSU5HIElOIEFOWSBX
QVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GCisj
IFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworbWF0Y2hlciBBZGRyZXNzTWF0Y2hl
cgorCisjIE5vdGUgdGhhdCB0aGlzIHJlbGllcyBvbiBCMyBkb2luZyBhZ2dyZXNzaXZlIHJlYXNz
b2NpYXRpb24gYW5kIGNhbm9uY2FsaXphdGlvbiBvZiBpbnRlZ2VyIGFkZHMuCisjIFdlJ2xsIG5l
dmVyIHNlZSBBZGQoQWRkKHgsIGNvbnN0MSksIGNvbnN0MikgYmVjYXVzZSBpdCB3b3VsZCBoYXZl
IGFscmVhZHkgYmVlbiByZWFzc29jaWF0ZWQgaW50bworIyBBZGQoeCwgY29uc3QxICsgY29uc3Qy
KS4gQWxzbywgd2Ugd2lsbCBuZXZlciBzZWUgQWRkKGNvbnN0LCB4KSwgYmVjYXVzZSB3ZSB3b3Vs
ZCBoYXZlIGNhbm9uaWNhbGl6ZWQKKyMgaXQgdG8gQWRkKHgsIGNvbnN0KS4gVGhhdCBzYWlkLCBp
biB0aGlzIGNvZGUgd2UgbmV2ZXIgbWFrZSBhc3NlcnRpb25zIGFib3V0IHRoZXNlIG9wdGltaXph
dGlvbnMKKyMgaGF2aW5nIGJlZW4gcGVyZm9ybWVkLiBBbHNvLCBzaW5jZSB0aGUgTG9hZC9TdG9y
ZSBpbnN0cnVjdGlvbnMgaW4gQjMgaGF2ZSBhIGJ1aWx0LWluIG9mZnNldCwgd2UKKyMgZG9uJ3Qg
bmVlZCB0byBtYXRjaCBBZGQoeCwgY29uc3QpLiBUaGF0IHdvdWxkIGhhdmUgYmVlbiBmb2xkZWQg
aW50byB0aGUgTG9hZC9TdG9yZSBpbnN0cnVjdGlvbnMKKyMgYWxyZWFkeS4gU28sIHRoZSBvbmx5
IGZhbmN5IG1hdGhpbmcgdGhpcyBjYW4gZG8gaXMganVzdCBCYXNlSW5kZXggZm9ybXMuCisKK0Fk
ZFNoaWZ0MSA9IEFkZChTaGwoaW5kZXgsICRsb2dTY2FsZSksIGJhc2UpCitBZGRTaGlmdDIgPSBB
ZGQoYmFzZSwgU2hsKGluZGV4LCAkbG9nU2NhbGUpKQorCitBZGQgPSBBZGQobGVmdCwgcmlnaHQp
CisKKyRDb25zdAorCitEaXJlY3QKSW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM0Fy
Z3VtZW50UmVnVmFsdWUuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9i
My9CM0FyZ3VtZW50UmVnVmFsdWUuY3BwCShyZXZpc2lvbiAwKQorKysgU291cmNlL0phdmFTY3Jp
cHRDb3JlL2IzL0IzQXJndW1lbnRSZWdWYWx1ZS5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTAsMCAr
MSw0MSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNSBBcHBsZSBJbmMuIEFsbCByaWdodHMg
cmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJp
bmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0
ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6Cisg
KiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3Zl
IGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhl
IGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBm
b3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhp
cyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUK
KyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRo
IHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBB
UFBMRSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFO
VElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJS
QU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisg
KiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBP
UgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElO
Q0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdF
UyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJT
VElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJ
VFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBU
SEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJ
TElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJ
U0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVO
IElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLiAKKyAqLworCisj
aW5jbHVkZSAiY29uZmlnLmgiCisjaW5jbHVkZSAiQjNBcmd1bWVudFJlZ1ZhbHVlLmgiCisKK25h
bWVzcGFjZSBKU0MgeyBuYW1lc3BhY2UgQjMgeworCitBcmd1bWVudFJlZ1ZhbHVlOjp+QXJndW1l
bnRSZWdWYWx1ZSgpCit7Cit9CisKK3ZvaWQgQXJndW1lbnRSZWdWYWx1ZTo6ZHVtcE1ldGEoUHJp
bnRTdHJlYW0mIG91dCkgY29uc3QKK3sKKyAgICBvdXQucHJpbnQobV9yZWcpOworfQorCit9IH0g
Ly8gbmFtZXNwYWNlIEpTQzo6QjMKKwpJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0Iz
QXJndW1lbnRSZWdWYWx1ZS5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9i
My9CM0FyZ3VtZW50UmVnVmFsdWUuaAkocmV2aXNpb24gMCkKKysrIFNvdXJjZS9KYXZhU2NyaXB0
Q29yZS9iMy9CM0FyZ3VtZW50UmVnVmFsdWUuaAkod29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDYw
IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE1IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNl
cnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5
IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBw
cm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEu
IFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29w
eXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9s
bG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0g
bXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxp
c3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICog
ICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhl
IGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExF
IElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVT
LCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJ
RVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBV
UlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SCisg
KiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURF
TlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJ
TkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRV
VEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsg
T1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9S
WQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZ
LCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5H
IElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYg
QURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisKKyNpZm5k
ZWYgQjNBcmd1bWVudFJlZ1ZhbHVlX2gKKyNkZWZpbmUgQjNBcmd1bWVudFJlZ1ZhbHVlX2gKKwor
I2luY2x1ZGUgIkIzVmFsdWUuaCIKKyNpbmNsdWRlICJSZWcuaCIKKworbmFtZXNwYWNlIEpTQyB7
IG5hbWVzcGFjZSBCMyB7CisKK2NsYXNzIEFyZ3VtZW50UmVnVmFsdWUgOiBwdWJsaWMgVmFsdWUg
eworcHVibGljOgorICAgIHN0YXRpYyBib29sIGFjY2VwdHMoT3Bjb2RlIG9wY29kZSkgeyByZXR1
cm4gb3Bjb2RlID09IEFyZ3VtZW50UmVnOyB9CisgICAgCisgICAgfkFyZ3VtZW50UmVnVmFsdWUo
KTsKKworICAgIFJlZyBhcmd1bWVudFJlZygpIGNvbnN0IHsgcmV0dXJuIG1fcmVnOyB9CisKK3By
b3RlY3RlZDoKKyAgICB2b2lkIGR1bXBNZXRhKFByaW50U3RyZWFtJikgY29uc3Qgb3ZlcnJpZGU7
CisKK3ByaXZhdGU6CisgICAgZnJpZW5kIGNsYXNzIFByb2NlZHVyZTsKKworICAgIEFyZ3VtZW50
UmVnVmFsdWUodW5zaWduZWQgaW5kZXgsIE9yaWdpbiBvcmlnaW4sIFJlZyByZWcpCisgICAgICAg
IDogVmFsdWUoaW5kZXgsIEFyZ3VtZW50UmVnLCByZWcuaXNHUFIoKSA/IHBvaW50ZXIoKSA6IERv
dWJsZSwgb3JpZ2luKQorICAgICAgICAsIG1fcmVnKHJlZykKKyAgICB7CisgICAgfQorCisgICAg
UmVnIG1fcmVnOworfTsKKworfSB9IC8vIG5hbWVzcGFjZSBKU0M6OkIzCisKKyNlbmRpZiAvLyBC
M0FyZ3VtZW50UmVnVmFsdWVfaAorCkluZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNC
YXNpY0Jsb2NrLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNC
YXNpY0Jsb2NrLmNwcAkocmV2aXNpb24gMCkKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9C
M0Jhc2ljQmxvY2suY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsNTggQEAKKy8qCisgKiBD
b3B5cmlnaHQgKEMpIDIwMTUgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAq
IFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGgg
b3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQg
dGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRp
b25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAg
IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xh
aW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVj
ZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRp
b25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0
aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9u
LgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFTIElT
JycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywg
QlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFO
VEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElT
Q0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IKKyAqIENPTlRSSUJVVE9S
UyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFM
LAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVU
IE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBT
RVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJ
TlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFC
SUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAq
IChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBP
VVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRI
RSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKworI2luY2x1ZGUgImNvbmZpZy5o
IgorI2luY2x1ZGUgIkIzQmFzaWNCbG9jay5oIgorCituYW1lc3BhY2UgSlNDIHsgbmFtZXNwYWNl
IEIzIHsKKworQmFzaWNCbG9jazo6QmFzaWNCbG9jayh1bnNpZ25lZCBpbmRleCkKKyAgICA6IG1f
aW5kZXgoaW5kZXgpCit7Cit9CisKK0Jhc2ljQmxvY2s6On5CYXNpY0Jsb2NrKCkKK3sKK30KKwor
dm9pZCBCYXNpY0Jsb2NrOjphcHBlbmQoVmFsdWUqIHZhbHVlKQoreworICAgIG1fdmFsdWVzLmFw
cGVuZCh2YWx1ZSk7Cit9CisKK3ZvaWQgQmFzaWNCbG9jazo6ZHVtcChQcmludFN0cmVhbSYgb3V0
KSBjb25zdAoreworICAgIG91dC5wcmludChkdW1wUHJlZml4LCBtX2luZGV4KTsKK30KKwordm9p
ZCBCYXNpY0Jsb2NrOjpkZWVwRHVtcChQcmludFN0cmVhbSYgb3V0KSBjb25zdAoreworICAgIG91
dC5wcmludCgiQkIiLCAqdGhpcywgIjpcbiIpOworICAgIGZvciAoVmFsdWUqIHZhbHVlIDogKnRo
aXMpCisgICAgICAgIG91dC5wcmludCgiICAgICIsIGRlZXBEdW1wKHZhbHVlKSwgIlxuIik7Cit9
CisKK30gfSAvLyBuYW1lc3BhY2UgSlNDOjpCMworCkluZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENv
cmUvYjMvQjNCYXNpY0Jsb2NrLmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRDb3Jl
L2IzL0IzQmFzaWNCbG9jay5oCShyZXZpc2lvbiAwKQorKysgU291cmNlL0phdmFTY3JpcHRDb3Jl
L2IzL0IzQmFzaWNCbG9jay5oCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsMTEyIEBACisvKgor
ICogQ29weXJpZ2h0IChDKSAyMDE1IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAq
CisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3
aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0
aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJp
YnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Cisg
KiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRp
c2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXBy
b2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29u
ZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1l
bnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1
dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gYGBB
UyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJ
TkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVS
Q0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJF
IERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SCisgKiBDT05UUklC
VVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BF
Q0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcs
IEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMg
T1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5F
U1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0Yg
TElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JU
CisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBX
QVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBP
RiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisKKyNpZm5kZWYgQjNCYXNp
Y0Jsb2NrCisjZGVmaW5lIEIzQmFzaWNCbG9jaworCituYW1lc3BhY2UgSlNDIHsgbmFtZXNwYWNl
IEIzIHsKKworY2xhc3MgUHJvY2VkdXJlOworY2xhc3MgVmFsdWU7CisKK2NsYXNzIEJhc2ljQmxv
Y2sgeworICAgIFdURl9NQUtFX05PTkNPUFlBQkxFKEJhc2ljQmxvY2spOworICAgIFdURl9NQUtF
X0ZBU1RfQUxMT0NBVEVEOworcHVibGljOgorICAgIHR5cGVkZWYgVmVjdG9yPFZhbHVlKj4gVmFs
dWVMaXN0OworICAgIHR5cGVkZWYgVmVjdG9yPEJhc2ljQmxvY2sqLCAyPiBTdWNjZXNzb3JMaXN0
OyAvLyBUaGlzIG1hdGNoZXMgQ29udHJvbFZhbHVlJ3MgdHlwZWRlZi4KKworICAgIHN0YXRpYyBj
b25zdCBjaGFyKiBkdW1wUHJlZml4ID0gIiMiOworCisgICAgfkJhc2ljQmxvY2soKTsKKworICAg
IHVuc2lnbmVkIGluZGV4KCkgY29uc3QgeyByZXR1cm4gbV9pbmRleDsgfQorCisgICAgVmFsdWVM
aXN0OjppdGVyYXRvciBiZWdpbigpIHsgcmV0dXJuIG1fdmFsdWVzLmJlZ2luKCk7IH0KKyAgICBW
YWx1ZUxpc3Q6Oml0ZXJhdG9yIGVuZCgpIHsgcmV0dXJuIG1fdmFsdWVzLmVuZCgpOyB9CisgICAg
VmFsdWVMaXN0Ojpjb25zdF9pdGVyYXRvciBiZWdpbigpIGNvbnN0IHsgcmV0dXJuIG1fdmFsdWVz
LmJlZ2luKCk7IH0KKyAgICBWYWx1ZUxpc3Q6OmNvbnN0X2l0ZXJhdG9yIGVuZCgpIGNvbnN0IHsg
cmV0dXJuIG1fdmFsdWVzLmVuZCgpOyB9CisKKyAgICBzaXplX3Qgc2l6ZSgpIGNvbnN0IHsgcmV0
dXJuIG1fdmFsdWVzLnNpemUoKTsgfQorICAgIFZhbHVlKiBhdChzaXplX3QgaW5kZXgpIGNvbnN0
IHsgcmV0dXJuIG1fdmFsdWVzW2luZGV4XTsgfQorICAgIFZhbHVlKiYgYXQoc2l6ZV90IGluZGV4
KSB7IHJldHVybiBtX3ZhbHVlc1tpbmRleF07IH0KKworICAgIFZhbHVlKiBsYXN0KCkgY29uc3Qg
eyByZXR1cm4gbV92YWx1ZXMubGFzdCgpOyB9CisgICAgVmFsdWUqJiBsYXN0KCkgeyByZXR1cm4g
bV92YWx1ZXMubGFzdCgpOyB9CisKKyAgICBjb25zdCBWYWx1ZUxpc3QmIHZhbHVlcygpIGNvbnN0
IHsgcmV0dXJuIG1fdmFsdWVzOyB9CisgICAgVmFsdWVMaXN0JiB2YWx1ZXMoKSB7IHJldHVybiBt
X3ZhbHVlczsgfQorCisgICAgdm9pZCBhcHBlbmQoVmFsdWUqKTsKKworICAgIHRlbXBsYXRlPHR5
cGVuYW1lIFZhbHVlVHlwZSwgdHlwZW5hbWUuLi4gQXJndW1lbnRzPgorICAgIFZhbHVlVHlwZSog
YXBwZW5kTmV3KFByb2NlZHVyZSYsIEFyZ3VtZW50cy4uLik7CisKKyAgICB1bnNpZ25lZCBudW1T
dWNjZXNzb3JzKCkgY29uc3Q7CisgICAgQmFzaWNCbG9jayogc3VjY2Vzc29yKHVuc2lnbmVkIGlu
ZGV4KSBjb25zdDsKKyAgICBCYXNpY0Jsb2NrKiYgc3VjY2Vzc29yKHVuc2lnbmVkIGluZGV4KTsK
KyAgICBjb25zdCBTdWNjZXNzb3JMaXN0JiBzdWNjZXNzb3JzKCkgY29uc3Q7CisKKyAgICB2b2lk
IGR1bXAoUHJpbnRTdHJlYW0mKSBjb25zdDsKKyAgICB2b2lkIGRlZXBEdW1wKFByaW50U3RyZWFt
JikgY29uc3Q7CisKK3ByaXZhdGU6CisgICAgZnJpZW5kIGNsYXNzIFByb2NlZHVyZTsKKyAgICAK
KyAgICAvLyBJbnN0YW50aWF0ZSB2aWEgUHJvY2VkdXJlLgorICAgIEJhc2ljQmxvY2sodW5zaWdu
ZWQgaW5kZXgpOworCisgICAgdW5zaWduZWQgbV9pbmRleDsKKyAgICBWYWx1ZUxpc3QgbV92YWx1
ZXM7Cit9OworCitjbGFzcyBEZWVwQmFzaWNCbG9ja0R1bXAgeworcHVibGljOgorICAgIERlZXBC
YXNpY0Jsb2NrRHVtcChCYXNpY0Jsb2NrKiBibG9jaykKKyAgICAgICAgOiBtX2Jsb2NrKGJsb2Nr
KQorICAgIHsKKyAgICB9CisKKyAgICB2b2lkIGR1bXAoUHJpbnRTdHJlYW0mIG91dCkgY29uc3QK
KyAgICB7CisgICAgICAgIGlmIChtX2Jsb2NrKQorICAgICAgICAgICAgbV9ibG9jay0+ZGVlcER1
bXAob3V0KTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgb3V0LnByaW50KCI8bnVsbD4iKTsK
KyAgICB9CisKK3ByaXZhdGU6CisgICAgQmFzaWNCbG9jayogbV9ibG9jazsKK307CisKK0RlZXBC
YXNpY0Jsb2NrRHVtcCBkZWVwRHVtcChCYXNpY0Jsb2NrKiBibG9jaykKK3sKKyAgICByZXR1cm4g
RGVlcEJhc2ljQmxvY2tEdW1wKGJsb2NrKTsKK30KKworfSB9IC8vIG5hbWVzcGFjZSBKU0M6OkIz
CisKKyNlbmRpZiAvLyBCM0Jhc2ljQmxvY2sKKwpJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3Jl
L2IzL0IzQmFzaWNCbG9ja0lubGluZXMuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlw
dENvcmUvYjMvQjNCYXNpY0Jsb2NrSW5saW5lcy5oCShyZXZpc2lvbiAwKQorKysgU291cmNlL0ph
dmFTY3JpcHRDb3JlL2IzL0IzQmFzaWNCbG9ja0lubGluZXMuaAkod29ya2luZyBjb3B5KQpAQCAt
MCwwICsxLDY2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE1IEFwcGxlIEluYy4gQWxsIHJp
Z2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBh
bmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBl
cm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1l
dDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUg
YWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFu
ZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmlu
YXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNl
LCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGlu
IHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVk
IHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVE
IEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBX
QVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVE
IFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VM
QVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJ
TkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVD
VCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBE
QU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9G
IFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICog
UFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04g
QU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1Qg
TElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNF
KSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUs
IEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICov
CisKKyNpZm5kZWYgQjNCYXNpY0Jsb2NrSW5saW5lc19oCisjZGVmaW5lIEIzQmFzaWNCbG9ja0lu
bGluZXNfaAorCisjaW5jbHVkZSAiQjNCYXNpY0Jsb2NrLmgiCisjaW5jbHVkZSAiQjNDb250cm9s
VmFsdWUuaCIKKyNpbmNsdWRlICJCM1Byb2NlZHVyZUlubGluZXMuaCIKKworbmFtZXNwYWNlIEpT
QyB7IG5hbWVzcGFjZSBCMyB7CisKK3RlbXBsYXRlPHR5cGVuYW1lIFZhbHVlVHlwZSB0eXBlbmFt
ZS4uLiBBcmd1bWVudHM+CitWYWx1ZVR5cGUqIEJhc2ljQmxvY2s6OmFwcGVuZE5ldyhQcm9jZWR1
cmUmIHByb2NlZHVyZSwgQXJndW1lbnRzLi4uIGFyZ3VtZW50cykKK3sKKyAgICBWYWx1ZVR5cGUq
IHJlc3VsdCA9IHByb2NlZHVyZS5hZGQ8VmFsdWVUeXBlPihhcmd1bWVudHMuLi4pOworICAgIGFw
cGVuZChyZXN1bHQpOworICAgIHJldHVybiByZXN1bHQ7Cit9CisKK3Vuc2lnbmVkIEJhc2ljQmxv
Y2s6Om51bVN1Y2Nlc3NvcnMoKSBjb25zdAoreworICAgIHJldHVybiBsYXN0KCktPmFzPENvbnRy
b2xWYWx1ZT4oKS0+bnVtU3VjY2Vzc29ycygpOworfQorCitCYXNpY0Jsb2NrKiBCYXNpY0Jsb2Nr
OjpzdWNjZXNzb3IodW5zaWduZWQgaW5kZXgpIGNvbnN0Cit7CisgICAgcmV0dXJuIGxhc3QoKS0+
YXM8Q29udHJvbFZhbHVlPigpLT5zdWNjZXNzb3IoaW5kZXgpOworfQorCitCYXNpY0Jsb2NrKiYg
QmFzaWNCbG9jazo6c3VjY2Vzc29yKHVuc2lnbmVkIGluZGV4KQoreworICAgIHJldHVybiBsYXN0
KCktPmFzPENvbnRyb2xWYWx1ZT4oKS0+c3VjY2Vzc29yKGluZGV4KTsKK30KKworY29uc3QgQmFz
aWNCbG9jazo6U3VjY2Vzc29yTGlzdCYgQmFzaWNCbG9jazo6c3VjY2Vzc29ycygpIGNvbnN0Cit7
CisgICAgcmV0dXJuIGxhc3QoKS0+YXM8Q29udHJvbFZhbHVlPigpLT5zdWNjZXNzb3JzKCk7Cit9
CisKK30gfSAvLyBuYW1lc3BhY2UgSlNDOjpCMworCisjZW5kaWYgLy8gQjNCYXNpY0Jsb2NrSW5s
aW5lc19oCisKSW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM0NoZWNrVmFsdWUuY3Bw
Cj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM0NoZWNrVmFsdWUuY3Bw
CShyZXZpc2lvbiAwKQorKysgU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzQ2hlY2tWYWx1ZS5j
cHAJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSw0MSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykg
MjAxNSBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRp
b24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Cisg
KiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5n
IGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNl
IGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlz
IGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4g
UmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBj
b3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBm
b2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90
aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJ
UyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisg
KiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlU
RUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQg
RklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4g
Tk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBG
T1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExB
UlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQg
VE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NT
IE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikg
SE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhF
UiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBO
RUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNF
CisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZ
IE9GIFNVQ0ggREFNQUdFLiAKKyAqLworCisjaW5jbHVkZSAiY29uZmlnLmgiCisjaW5jbHVkZSAi
QjNDaGVja1ZhbHVlLmgiCisKK25hbWVzcGFjZSBKU0MgeyBuYW1lc3BhY2UgQjMgeworCitDaGVj
a1ZhbHVlOjp+Q2hlY2tWYWx1ZSgpCit7Cit9CisKK3ZvaWQgQ2hlY2tWYWx1ZTo6ZHVtcE1ldGEo
UHJpbnRTdHJlYW0mIG91dCkgY29uc3QKK3sKKyAgICBvdXQucHJpbnQoInN0YWNrbWFwID0gIiwg
c3RhY2ttYXApOworfQorCit9IH0gLy8gbmFtZXNwYWNlIEpTQzo6QjMKKwpJbmRleDogU291cmNl
L0phdmFTY3JpcHRDb3JlL2IzL0IzQ2hlY2tWYWx1ZS5oCj09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9K
YXZhU2NyaXB0Q29yZS9iMy9CM0NoZWNrVmFsdWUuaAkocmV2aXNpb24gMCkKKysrIFNvdXJjZS9K
YXZhU2NyaXB0Q29yZS9iMy9CM0NoZWNrVmFsdWUuaAkod29ya2luZyBjb3B5KQpAQCAtMCwwICsx
LDgwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE1IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyBy
ZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmlu
YXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRl
ZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAq
IDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUg
Y29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUg
Zm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZv
cm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlz
IGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQor
ICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGgg
dGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQ
UExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5U
SUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJB
TlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAq
IFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9S
CisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5D
SURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VT
IChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNU
SVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklU
UzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRI
RU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklM
SVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklT
SU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4g
SUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisKKyNp
Zm5kZWYgQjNDaGVja1ZhbHVlX2gKKyNkZWZpbmUgQjNDaGVja1ZhbHVlX2gKKworI2luY2x1ZGUg
IkIzVmFsdWUuaCIKKyNpbmNsdWRlICJCM1N0YWNrbWFwLmgiCisKK25hbWVzcGFjZSBKU0MgeyBu
YW1lc3BhY2UgQjMgeworCitjbGFzcyBDaGVja1ZhbHVlIDogcHVibGljIENoZWNrIHsKK3B1Ymxp
YzoKKyAgICBzdGF0aWMgYm9vbCBhY2NlcHRzKE9wY29kZSBvcGNvZGUpCisgICAgeworICAgICAg
ICBzd2l0Y2ggKG9wY29kZSkgeworICAgICAgICBjYXNlIENoZWNrQWRkOgorICAgICAgICBjYXNl
IENoZWNrU3ViOgorICAgICAgICBjYXNlIENoZWNrTXVsOgorICAgICAgICBjYXNlIENoZWNrOgor
ICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBy
ZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICB+Q2hlY2tWYWx1ZSgpOworCisg
ICAgU3RhY2ttYXAgc3RhY2ttYXA7CisKK3Byb3RlY3RlZDoKKyAgICB2b2lkIGR1bXBNZXRhKFBy
aW50U3RyZWFtJikgY29uc3Qgb3ZlcnJpZGU7CisKK3ByaXZhdGU6CisgICAgZnJpZW5kIGNsYXNz
IFByb2NlZHVyZTsKKworICAgIC8vIFVzZSB0aGlzIGZvcm0gZm9yIENoZWNrQWRkLCBDaGVja1N1
YiwgYW5kIENoZWNrTXVsLgorICAgIENoZWNrVmFsdWUodW5zaWduZWQgaW5kZXgsIE9wY29kZSBv
cGNvZGUsIE9yaWdpbiBvcmlnaW4sIFZhbHVlKiBsZWZ0LCBWYWx1ZSogcmlnaHQpCisgICAgICAg
IDogVmFsdWUoaW5kZXgsIG9wY29kZSwgbGVmdC0+dHlwZSgpLCBvcmlnaW4sIGxlZnQsIHJpZ2h0
KQorICAgIHsKKyAgICAgICAgQVNTRVJUKGlzSW50KHR5cGUoKSkpOworICAgICAgICBBU1NFUlQo
bGVmdC0+dHlwZSgpID09IHJpZ2h0LT50eXBlKCkpOworICAgICAgICBBU1NFUlQob3Bjb2RlID09
IENoZWNrQWRkIHx8IG9wY29kZSA9PSBDaGVja1N1YiB8fCBvcGNvZGUgPT0gQ2hlY2tNdWwpOwor
ICAgIH0KKworICAgIC8vIFVzZSB0aGlzIGZvcm0gZm9yIENoZWNrLgorICAgIENoZWNrVmFsdWUo
dW5zaWduZWQgaW5kZXgsIE9wY29kZSBvcGNvZGUsIE9yaWdpbiBvcmlnaW4sIFZhbHVlKiBwcmVk
aWNhdGUpCisgICAgICAgIDogVmFsdWUoaW5kZXgsIG9wY29kZSwgVm9pZCwgb3JpZ2luLCBwcmVk
aWNhdGUpCisgICAgeworICAgICAgICBBU1NFUlQob3BjZGUgPT0gQ2hlY2spOworICAgIH0KK307
CisKK30gfSAvLyBuYW1lc3BhY2UgSlNDOjpCMworCisjZW5kaWYgLy8gQjNDaGVja1ZhbHVlX2gK
KworCkluZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNDb21wYXJpc29uTWF0Y2hlci5w
YXR0ZXJucwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNDb21wYXJp
c29uTWF0Y2hlci5wYXR0ZXJucwkocmV2aXNpb24gMCkKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29y
ZS9iMy9CM0NvbXBhcmlzb25NYXRjaGVyLnBhdHRlcm5zCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAg
KzEsMzggQEAKKyMgQ29weXJpZ2h0IChDKSAyMDE1IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNl
cnZlZC4KKyMKKyMgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBm
b3Jtcywgd2l0aCBvciB3aXRob3V0CisjIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92
aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworIyBhcmUgbWV0OgorIyAxLiBSZWRp
c3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdo
dAorIyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5n
IGRpc2NsYWltZXIuCisjIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJl
cHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisjICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNv
bmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyMgICAgZG9jdW1l
bnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1
dGlvbi4KKyMKKyMgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIEFORCBJ
VFMgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJworIyBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBX
QVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyMgVEhFIElNUExJRUQg
V0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxB
UgorIyBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMu
IE9SIElUUyBDT05UUklCVVRPUlMKKyMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVD
VCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgorIyBDT05TRVFVRU5USUFMIERB
TUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgorIyBT
VUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklU
UzsgT1IgQlVTSU5FU1MKKyMgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5Z
IFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KKyMgQ09OVFJBQ1QsIFNUUklDVCBMSUFC
SUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKyMgQVJJ
U0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYg
QURWSVNFRCBPRgorIyBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKK21hdGNoZXIg
Q29tcGFyaXNvbk1hdGNoZXIKKworVGVzdExvYWROb3RaZXJvMSA9IEFuZChMb2FkKGFkZHJlc3Mp
LCByaWdodCkKK1Rlc3RMb2FkTm90WmVybzIgPSBBbmQobGVmdCwgTG9hZChhZGRyZXNzKSkKK1Rl
c3ROb3RaZXJvID0gQW5kKGxlZnQsIHJpZ2h0KQorCitUZXN0TG9hZFplcm8xID0gRXF1YWwoQW5k
KExvYWQoYWRkcmVzcyksIHJpZ2h0KSwgJDApCitUZXN0TG9hZFplcm8yID0gRXF1YWwoQW5kKGxl
ZnQsIExvYWQoYWRkcmVzcykpLCAkMCkKK1Rlc3RaZXJvID0gRXF1YWwoQW5kKGxlZnQsIHJpZ2h0
KSwgJDApCisKK0xvYWRFcXVhbDEgPSBFcXVhbChMb2FkKGFkZHJlc3MpLCByaWdodCkKK0xvYWRF
cXVhbDIgPSBFcXVhbChsZWZ0LCBMb2FkKGFkZHJlc3MpKQorTm90ID0gRXF1YWwodmFsdWUsICQw
KQorRXF1YWwgPSBFcXVhbChsZWZ0LCByaWdodCkKKwpJbmRleDogU291cmNlL0phdmFTY3JpcHRD
b3JlL2IzL0IzQ29uc3QzMlZhbHVlLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlw
dENvcmUvYjMvQjNDb25zdDMyVmFsdWUuY3BwCShyZXZpc2lvbiAwKQorKysgU291cmNlL0phdmFT
Y3JpcHRDb3JlL2IzL0IzQ29uc3QzMlZhbHVlLmNwcAkod29ya2luZyBjb3B5KQpAQCAtMCwwICsx
LDQxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE1IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyBy
ZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmlu
YXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRl
ZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAq
IDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUg
Y29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUg
Zm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZv
cm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlz
IGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQor
ICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGgg
dGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQ
UExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5U
SUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJB
TlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAq
IFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9S
CisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5D
SURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VT
IChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNU
SVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklU
UzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRI
RU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklM
SVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklT
SU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4g
SUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisKKyNp
bmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJCM0NvbnN0MzJWYWx1ZS5oIgorCituYW1lc3Bh
Y2UgSlNDIHsgbmFtZXNwYWNlIEIzIHsKKworQ29uc3QzMlZhbHVlOjp+Q29uc3QzMlZhbHVlKCkK
K3sKK30KKwordm9pZCBDb25zdDMyVmFsdWU6OmR1bXBNZXRhKFByaW50U3RyZWFtJiBvdXQpIGNv
bnN0Cit7CisgICAgb3V0LnByaW50KG1fdmFsdWUpOworfQorCit9IH0gLy8gbmFtZXNwYWNlIEpT
Qzo6QjMKKwpJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzQ29uc3QzMlZhbHVlLmgK
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzQ29uc3QzMlZhbHVlLmgJ
KHJldmlzaW9uIDApCisrKyBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNDb25zdDMyVmFsdWUu
aAkod29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDU5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAy
MDE1IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlv
biBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAq
IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcg
Y29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2Ug
Y29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMg
bGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBS
ZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNv
cHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZv
bGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3Ro
ZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElT
IFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAq
IEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRF
RCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBG
SVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBO
TyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZP
UiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFS
WSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBU
TywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1Mg
T0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBI
T1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVS
IElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5F
R0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UK
KyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkg
T0YgU1VDSCBEQU1BR0UuIAorICovCisKKyNpZm5kZWYgQjNDb25zdDMyVmFsdWVfaAorI2RlZmlu
ZSBCM0NvbnN0MzJWYWx1ZV9oCisKKyNpbmNsdWRlICJCM1ZhbHVlLmgiCisKK25hbWVzcGFjZSBK
U0MgeyBuYW1lc3BhY2UgQjMgeworCitjbGFzcyBDb25zdDMyVmFsdWUgOiBwdWJsaWMgVmFsdWUg
eworcHVibGljOgorICAgIHN0YXRpYyBib29sIGFjY2VwdHMoT3Bjb2RlIG9wY29kZSkgeyByZXR1
cm4gb3Bjb2RlID09IENvbnN0MzI7IH0KKyAgICAKKyAgICB+Q29uc3QzMlZhbHVlKCk7CisgICAg
CisgICAgaW50MzJfdCB2YWx1ZSgpIGNvbnN0IHsgcmV0dXJuIG1fdmFsdWU7IH0KKworcHJvdGVj
dGVkOgorICAgIHZvaWQgZHVtcE1ldGEoUHJpbnRTdHJlYW0mKSBjb25zdCBvdmVycmlkZTsKKwor
cHJpdmF0ZToKKyAgICBmcmllbmQgY2xhc3MgUHJvY2VkdXJlOworCisgICAgQ29uc3QzMlZhbHVl
KHVuc2lnbmVkIGluZGV4LCBPcmlnaW4gb3JpZ2luLCBpbnQzMl90IHZhbHVlKQorICAgICAgICA6
IFZhbHVlKGluZGV4LCBDb25zdDMyLCBJbnQzMiwgb3JpZ2luKQorICAgICAgICAsIG1fdmFsdWUo
dmFsdWUpCisgICAgeworICAgIH0KKyAgICAKKyAgICBpbnQzMl90IG1fdmFsdWU7Cit9OworCit9
IH0gLy8gbmFtZXNwYWNlIEpTQzo6QjMKKworI2VuZGlmIC8vIEIzQ29uc3QzMlZhbHVlX2gKKwpJ
bmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzQ29uc3Q2NFZhbHVlLmNwcAo9PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNDb25zdDY0VmFsdWUuY3BwCShyZXZp
c2lvbiAwKQorKysgU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzQ29uc3Q2NFZhbHVlLmNwcAko
d29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDQxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE1
IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBh
bmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1v
ZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29u
ZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29k
ZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlz
dCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRp
c3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHly
aWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxv
d2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIg
bWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNP
RlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVY
UFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBU
TywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRO
RVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBF
VkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBB
TlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwg
T1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywK
KyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0Yg
VVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dF
VkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElO
IENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJ
R0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAq
IE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0Yg
U1VDSCBEQU1BR0UuIAorICovCisKKyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJCM0Nv
bnN0NjRWYWx1ZS5oIgorCituYW1lc3BhY2UgSlNDIHsgbmFtZXNwYWNlIEIzIHsKKworQ29uc3Q2
NFZhbHVlOjp+Q29uc3Q2NFZhbHVlKCkKK3sKK30KKwordm9pZCBDb25zdDY0VmFsdWU6OmR1bXBN
ZXRhKFByaW50U3RyZWFtJiBvdXQpIGNvbnN0Cit7CisgICAgb3V0LnByaW50KG1fdmFsdWUpOwor
fQorCit9IH0gLy8gbmFtZXNwYWNlIEpTQzo6QjMKKwpJbmRleDogU291cmNlL0phdmFTY3JpcHRD
b3JlL2IzL0IzQ29uc3Q2NFZhbHVlLmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRD
b3JlL2IzL0IzQ29uc3Q2NFZhbHVlLmgJKHJldmlzaW9uIDApCisrKyBTb3VyY2UvSmF2YVNjcmlw
dENvcmUvYjMvQjNDb25zdDY0VmFsdWUuaAkod29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDU5IEBA
CisvKgorICogQ29weXJpZ2h0IChDKSAyMDE1IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZl
ZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZv
cm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92
aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJl
ZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJp
Z2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93
aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVz
dCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qg
b2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAg
ZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRp
c3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElO
Qy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJ
TkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMg
T0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBP
U0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SCisgKiBD
T05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRB
TCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNM
VURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUg
R09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1Ig
QlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQor
ICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBP
UiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElO
IEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURW
SVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisKKyNpZm5kZWYg
QjNDb25zdDY0VmFsdWVfaAorI2RlZmluZSBCM0NvbnN0NjRWYWx1ZV9oCisKKyNpbmNsdWRlICJC
M1ZhbHVlLmgiCisKK25hbWVzcGFjZSBKU0MgeyBuYW1lc3BhY2UgQjMgeworCitjbGFzcyBDb25z
dDY0VmFsdWUgOiBwdWJsaWMgVmFsdWUgeworcHVibGljOgorICAgIHN0YXRpYyBib29sIGFjY2Vw
dHMoT3Bjb2RlIG9wY29kZSkgeyByZXR1cm4gb3Bjb2RlID09IENvbnN0NjQ7IH0KKyAgICAKKyAg
ICB+Q29uc3Q2NFZhbHVlKCk7CisgICAgCisgICAgaW50NjRfdCB2YWx1ZSgpIGNvbnN0IHsgcmV0
dXJuIG1fdmFsdWU7IH0KKworcHJvdGVjdGVkOgorICAgIHZvaWQgZHVtcE1ldGEoUHJpbnRTdHJl
YW0mKSBjb25zdCBvdmVycmlkZTsKKworcHJpdmF0ZToKKyAgICBmcmllbmQgY2xhc3MgUHJvY2Vk
dXJlOworCisgICAgQ29uc3Q2NFZhbHVlKHVuc2lnbmVkIGluZGV4LCBPcmlnaW4gb3JpZ2luLCBp
bnQ2NF90IHZhbHVlKQorICAgICAgICA6IFZhbHVlKGluZGV4LCBDb25zdDY0LCBJbnQ2NCwgb3Jp
Z2luKQorICAgICAgICAsIG1fdmFsdWUodmFsdWUpCisgICAgeworICAgIH0KKyAgICAKKyAgICBp
bnQ2NF90IG1fdmFsdWU7Cit9OworCit9IH0gLy8gbmFtZXNwYWNlIEpTQzo6QjMKKworI2VuZGlm
IC8vIEIzQ29uc3Q2NFZhbHVlX2gKKwpJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0Iz
Q29uc3REb3VibGVWYWx1ZS5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRDb3Jl
L2IzL0IzQ29uc3REb3VibGVWYWx1ZS5jcHAJKHJldmlzaW9uIDApCisrKyBTb3VyY2UvSmF2YVNj
cmlwdENvcmUvYjMvQjNDb25zdERvdWJsZVZhbHVlLmNwcAkod29ya2luZyBjb3B5KQpAQCAtMCww
ICsxLDQxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE1IEFwcGxlIEluYy4gQWxsIHJpZ2h0
cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQg
YmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1p
dHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoK
KyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJv
dmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0
aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5
IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0
aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRo
ZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdp
dGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZ
IEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJS
QU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdB
UlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIK
KyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMu
IE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwg
SU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1B
R0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNV
QlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJP
RklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5Z
IFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElB
QklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBB
UklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVW
RU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisK
KyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJCM0NvbnN0RG91YmxlVmFsdWUuaCIKKwor
bmFtZXNwYWNlIEpTQyB7IG5hbWVzcGFjZSBCMyB7CisKK0NvbnN0RG91YmxlVmFsdWU6On5Db25z
dERvdWJsZVZhbHVlKCkKK3sKK30KKwordm9pZCBDb25zdERvdWJsZVZhbHVlOjpkdW1wTWV0YShQ
cmludFN0cmVhbSYgb3V0KSBjb25zdAoreworICAgIG91dC5wcmludGYoIiVsZSIsIG1fdmFsdWUp
OworfQorCit9IH0gLy8gbmFtZXNwYWNlIEpTQzo6QjMKKwpJbmRleDogU291cmNlL0phdmFTY3Jp
cHRDb3JlL2IzL0IzQ29uc3REb3VibGVWYWx1ZS5oCj09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZh
U2NyaXB0Q29yZS9iMy9CM0NvbnN0RG91YmxlVmFsdWUuaAkocmV2aXNpb24gMCkKKysrIFNvdXJj
ZS9KYXZhU2NyaXB0Q29yZS9iMy9CM0NvbnN0RG91YmxlVmFsdWUuaAkod29ya2luZyBjb3B5KQpA
QCAtMCwwICsxLDU5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE1IEFwcGxlIEluYy4gQWxs
IHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJj
ZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJl
IHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJl
IG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0
aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25z
IGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4g
YmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90
aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVy
IGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3Zp
ZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJ
REVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElF
RCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBM
SUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJ
Q1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBM
RSBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJ
UkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElB
TCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5U
IE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgor
ICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQg
T04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJ
Q1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJX
SVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdB
UkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAor
ICovCisKKyNpZm5kZWYgQjNDb25zdERvdWJsZVZhbHVlX2gKKyNkZWZpbmUgQjNDb25zdERvdWJs
ZVZhbHVlX2gKKworI2luY2x1ZGUgIkIzVmFsdWUuaCIKKworbmFtZXNwYWNlIEpTQyB7IG5hbWVz
cGFjZSBCMyB7CisKK2NsYXNzIENvbnN0RG91YmxlVmFsdWUgOiBwdWJsaWMgVmFsdWUgeworcHVi
bGljOgorICAgIHN0YXRpYyBib29sIGFjY2VwdHMoT3Bjb2RlIG9wY29kZSkgeyByZXR1cm4gb3Bj
b2RlID09IENvbnN0RG91YmxlOyB9CisgICAgCisgICAgfkNvbnN0RG91YmxlVmFsdWUoKTsKKyAg
ICAKKyAgICBkb3VibGUgdmFsdWUoKSBjb25zdCB7IHJldHVybiBtX3ZhbHVlOyB9CisKK3Byb3Rl
Y3RlZDoKKyAgICB2b2lkIGR1bXBNZXRhKFByaW50U3RyZWFtJikgY29uc3Qgb3ZlcnJpZGU7CisK
K3ByaXZhdGU6CisgICAgZnJpZW5kIGNsYXNzIFByb2NlZHVyZTsKKworICAgIENvbnN0RG91Ymxl
VmFsdWUodW5zaWduZWQgaW5kZXgsIE9yaWdpbiBvcmlnaW4sIGRvdWJsZSB2YWx1ZSkKKyAgICAg
ICAgOiBWYWx1ZShpbmRleCwgQ29uc3REb3VibGUsIERvdWJsZSwgb3JpZ2luKQorICAgICAgICAs
IG1fdmFsdWUodmFsdWUpCisgICAgeworICAgIH0KKyAgICAKKyAgICBkb3VibGUgbV92YWx1ZTsK
K307CisKK30gfSAvLyBuYW1lc3BhY2UgSlNDOjpCMworCisjZW5kaWYgLy8gQjNDb25zdERvdWJs
ZVZhbHVlX2gKKwpJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzQ29udHJvbFZhbHVl
LmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNDb250cm9sVmFs
dWUuY3BwCShyZXZpc2lvbiAwKQorKysgU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzQ29udHJv
bFZhbHVlLmNwcAkod29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDQzIEBACisvKgorICogQ29weXJp
Z2h0IChDKSAyMDE1IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRp
c3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdp
dGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBm
b2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBv
ZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3Rp
Y2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIu
CisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhl
IGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBh
bmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBh
bmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAq
CisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFO
RCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBO
T1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklM
SVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlN
RUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUg
TElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAq
IEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1Qg
TElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklD
RVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJS
VVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZ
LCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5D
TFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9G
IFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9T
U0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisKKyNpbmNsdWRlICJjb25maWcuaCIKKyNp
bmNsdWRlICJCM0NvbnRyb2xWYWx1ZS5oIgorCituYW1lc3BhY2UgSlNDIHsgbmFtZXNwYWNlIEIz
IHsKKworQ29udHJvbFZhbHVlOjp+Q29udHJvbFZhbHVlKCkKK3sKK30KKwordm9pZCBDb250cm9s
VmFsdWU6OmR1bXBNZXRhKFByaW50U3RyZWFtJiBvdXQpIGNvbnN0Cit7CisgICAgQ29tbWFQcmlu
dGVyIGNvbW1hOworICAgIGZvciAoQmFzaWNCbG9jayogYmxvY2sgOiBtX3N1Y2Nlc3NvcnMpCisg
ICAgICAgIG91dC5wcmludChjb21tYSwgcG9pbnRlckR1bXAoYmxvY2spKTsKK30KKworfSB9IC8v
IG5hbWVzcGFjZSBKU0M6OkIzCisKSW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM0Nv
bnRyb2xWYWx1ZS5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM0Nv
bnRyb2xWYWx1ZS5oCShyZXZpc2lvbiAwKQorKysgU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0Iz
Q29udHJvbFZhbHVlLmgJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSwxMTcgQEAKKy8qCisgKiBD
b3B5cmlnaHQgKEMpIDIwMTUgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAq
IFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGgg
b3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQg
dGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRp
b25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAg
IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xh
aW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVj
ZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRp
b25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0
aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9u
LgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFTIElT
JycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywg
QlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFO
VEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElT
Q0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IKKyAqIENPTlRSSUJVVE9S
UyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFM
LAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVU
IE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBT
RVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJ
TlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFC
SUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAq
IChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBP
VVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRI
RSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKworI2lmbmRlZiBCM0NvbnRyb2xW
YWx1ZV9oCisjZGVmaW5lIEIzQ29udHJvbFZhbHVlX2gKKworI2luY2x1ZGUgIkIzVmFsdWUuaCIK
KworbmFtZXNwYWNlIEpTQyB7IG5hbWVzcGFjZSBCMyB7CisKK2NsYXNzIEJhc2ljQmxvY2s7CisK
K2NsYXNzIENvbnRyb2xWYWx1ZSA6IHB1YmxpYyBWYWx1ZSB7CitwdWJsaWM6CisgICAgc3RhdGlj
IGJvb2wgYWNjZXB0cyhPcGNvZGUgb3Bjb2RlKQorICAgIHsKKyAgICAgICAgc3dpdGNoIChvcGNv
ZGUpIHsKKyAgICAgICAgY2FzZSBKdW1wOgorICAgICAgICBjYXNlIEJyYW5jaDoKKyAgICAgICAg
Y2FzZSBSZXR1cm46CisgICAgICAgIGNhc2UgT29wczoKKyAgICAgICAgICAgIHJldHVybiB0cnVl
OworICAgICAgICBjYXNlIFN3aXRjaDogCisgICAgICAgICAgICAvLyBUaGlzIGlzIGhlcmUgYmVj
YXVzZSBTd2l0Y2hWYWx1ZSBpcyBhIHN1YmNsYXNzIG9mIENvbnRyb2xWYWx1ZSwgc28gd2Ugd2Fu
dAorICAgICAgICAgICAgLy8gc3d0aWNoVmFsdWUtPmFzPENvbnRyb2xWYWx1ZT4oKSB0byByZXR1
cm4gbm9uLW51bGwuCisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgZGVmYXVsdDoK
KyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHR5cGVk
ZWYgVmVjdG9yPEJhc2ljQmxvY2sqLCAyPiBTdWNjZXNzb3JMaXN0OworCisgICAgfkNvbnRyb2xW
YWx1ZSgpOworCisgICAgdW5zaWduZWQgbnVtU3VjY2Vzc29ycygpIGNvbnN0IHsgcmV0dXJuIG1f
c3VjY2Vzc29ycy5zaXplKCk7IH0KKyAgICBCYXNpY0Jsb2NrKiBzdWNjZXNzb3IodW5zaWduZWQg
aW5kZXgpIGNvbnN0IHsgcmV0dXJuIG1fc3VjY2Vzc29yc1tpXTsgfQorICAgIEJhc2ljQmxvY2sq
JiBzdWNjZXNzb3IodW5zaWduZWQgaW5kZXgpIHsgcmV0dXJuIG1fc3VjY2Vzc29yc1tpXTsgfQor
CisgICAgY29uc3QgU3VjY2Vzc29yTGlzdCYgc3VjY2Vzc29ycygpIGNvbnN0IHsgcmV0dXJuIG1f
c3VjY2Vzc29yczsgfQorCitwcm90ZWN0ZWQ6CisgICAgdm9pZCBkdW1wTWV0YShQcmludFN0cmVh
bSYpIGNvbnN0IG92ZXJyaWRlOworCisgICAgLy8gVXNlIHRoaXMgZm9yIHN1YmNsYXNzZXMuCisg
ICAgdGVtcGxhdGU8dHlwZW5hbWUuLi4gQXJndW1lbnRzPgorICAgIENvbnRyb2xWYWx1ZSh1bnNp
Z25lZCBpbmRleCwgT3Bjb2RlIG9wY29kZSwgVHlwZSB0eXBlLCBPcmlnaW4gb3JpZ2luLCBBcmd1
bWVudHMuLi4gYXJndW1lbnRzKQorICAgICAgICA6IFZhbHVlKGluZGV4LCBvcGNvZGUsIHR5cGUs
IG9yaWdpbiwgYXJndW1lbnRzLi4uKQorICAgIHsKKyAgICB9CisKKyAgICAvLyBTdWJjbGFzc2Vz
IHdpbGwgcG9wdWxhdGUgdGhpcy4KKyAgICBTdWNjZXNzb3JMaXN0IG1fc3VjY2Vzc29yczsKKwor
cHJpdmF0ZToKKyAgICBmcmllbmQgY2xhc3MgUHJvY2VkdXJlOworCisgICAgLy8gVXNlIHRoaXMg
Zm9yIE9vcHMuCisgICAgQ29udHJvbFZhbHVlKHVuc2lnbmVkIGluZGV4LCBPcGNvZGUgb3Bjb2Rl
LCBPcmlnaW4gb3JpZ2luKQorICAgICAgICA6IFZhbHVlKGluZGV4LCBvcGNvZGUsIFZvaWQsIG9y
aWdpbikKKyAgICB7CisgICAgICAgIEFTU0VSVChvcGNvZGUgPT0gT29wcyk7CisgICAgfQorCisg
ICAgLy8gVXNlIHRoaXMgZm9yIFJldHVybi4KKyAgICBDb250cm9sVmFsdWUodW5zaWduZWQgaW5k
ZXgsIE9wY29kZSBvcGNvZGUsIE9yaWdpbiBvcmlnaW4sIFZhbHVlKiByZXN1bHQpCisgICAgICAg
IDogVmFsdWUoaW5kZXgsIG9wY29kZSwgVm9pZCwgb3JpZ2luLCByZXN1bHQpCisgICAgeworICAg
ICAgICBBU1NFUlQob3Bjb2RlID09IFJldHVybik7CisgICAgfQorCisgICAgLy8gVXNlIHRoaXMg
Zm9yIEp1bXAuCisgICAgQ29udHJvbFZhbHVlKHVuc2lnbmVkIGluZGV4LCBPcGNvZGUgb3Bjb2Rl
LCBPcmlnaW4gb3JpZ2luLCBCYXNpY0Jsb2NrKiB0YXJnZXQpCisgICAgICAgIDogVmFsdWUoaW5k
ZXgsIG9wY29kZSwgVm9pZCwgb3JpZ2luKQorICAgIHsKKyAgICAgICAgQVNTRVJUKG9wY29kZSA9
PSBKdW1wKTsKKyAgICAgICAgbV9zdWNjZXNzb3JzLmFwcGVuZCh0YXJnZXQpOworICAgIH0KKwor
ICAgIC8vIFVzZSB0aGlzIGZvciBCcmFuY2guCisgICAgQ29udHJvbFZhbHVlKAorICAgICAgICB1
bnNpZ25lZCBpbmRleCwgT3Bjb2RlIG9wY29kZSwgT3JpZ2luIG9yaWdpbiwgVmFsdWUqIHByZWRp
Y2F0ZSwKKyAgICAgICAgQmFzaWNCbG9jayogeWVzLCBCYXNpY0Jsb2NrKiBubykKKyAgICAgICAg
OiBWYWx1ZShpbmRleCwgb3Bjb2RlLCBWb2lkLCBvcmlnaW4sIHByZWRpY2F0ZSkKKyAgICB7Cisg
ICAgICAgIEFTU0VSVChvcGNvZGUgPT0gQnJhbmNoKTsKKyAgICAgICAgbV9zdWNjZXNzb3JzLmFw
cGVuZCh5ZXMpOworICAgICAgICBtX3N1Y2Nlc3NvcnMuYXBwZW5kKG5vKTsKKyAgICB9Cit9Owor
Cit9IH0gLy8gbmFtZXNwYWNlIEpTQzo6QjMKKworI2VuZGlmIC8vIEIzQ29udHJvbFZhbHVlX2gK
KwpJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzSW5kZXhTZXQuaAo9PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNJbmRleFNldC5oCShyZXZpc2lvbiAwKQor
KysgU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzSW5kZXhTZXQuaAkod29ya2luZyBjb3B5KQpA
QCAtMCwwICsxLDE0MSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNSBBcHBsZSBJbmMuIEFs
bCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3Vy
Y2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFy
ZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFy
ZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4g
dGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9u
cyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGlu
IGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5v
dGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1l
ciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92
aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9W
SURFRCBCWSBBUFBMRSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJ
RUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1Q
TElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJU
SUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQ
TEUgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5E
SVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJ
QUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVO
VCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IK
KyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5E
IE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RS
SUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVS
V0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRX
QVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLiAK
KyAqLworCisjaWZuZGVmIEIzSW5kZXhTZXRfaAorI2RlZmluZSBCM0luZGV4U2V0X2gKKworI2lu
Y2x1ZGUgPHd0Zi9CaXRWZWN0b3IuaD4KKyNpbmNsdWRlIDx3dGYvQ29tbWFQcmludGVyLmg+CisK
K25hbWVzcGFjZSBKU0MgeyBuYW1lc3BhY2UgQjMgeworCisvLyBUaGlzIGlzIGEgc2V0IGZvciB0
aGluZ3MgdGhhdCBoYXZlIGFuIGluZGV4KCkuIEl0J3Mgc3VwZXIgZWZmaWNpZW50IGZvciBCYXNp
Y0Jsb2Nrcy4gSXQncyBvbmx5CisvLyBlZmZpY2llbnQgZm9yIFZhbHVlcyBpZiB5b3UgZG9uJ3Qg
Y3JlYXRlIHRvbyBtYW55IG9mIHRoZXNlIHNldHMsIHNpbmNlIFZhbHVlcyBjYW4gaGF2ZSB2ZXJ5
IHNwYXJzZQorLy8gaW5kaWNlcyBhbmQgdGhlcmUgYXJlIGEgbG90IG9mIFZhbHVlcy4KKworLy8g
SWYgeW91IHdhbnQgYSBzZXQgb2YgQmFzaWNCbG9ja3MsIHlvdSBkbyBJbmRleFNldDxCYXNpY0Js
b2NrPi4gU28sIFQgPSBCYXNpY0Jsb2NrLgordGVtcGxhdGU8dHlwZW5hbWUgVD4KK2NsYXNzIElu
ZGV4U2V0IHsKK3B1YmxpYzoKKyAgICBJbmRleFNldCgpCisgICAgeworICAgIH0KKworICAgIGJv
b2wgYWRkKFQqIHZhbHVlKQorICAgIHsKKyAgICAgICAgcmV0dXJuICFtX3NldC5zZXQodmFsdWUt
PmluZGV4KCkpOworICAgIH0KKworICAgIGJvb2wgY29udGFpbnMoVCogdmFsdWUpIGNvbnN0Cisg
ICAgeworICAgICAgICBpZiAoIXZhbHVlKQorICAgICAgICAgICAgcmV0dXJuIG51bGxwdHI7Cisg
ICAgICAgIHJldHVybiBtX3NldC5nZXQodmFsdWUtPmluZGV4KCkpOworICAgIH0KKworICAgIHRl
bXBsYXRlPHR5cGVuYW1lIENvbGxlY3Rpb25UeXBlPgorICAgIGNsYXNzIEl0ZXJhYmxlIHsKKyAg
ICBwdWJsaWM6CisgICAgICAgIEl0ZXJhYmxlKGNvbnN0IENvbGxlY3Rpb25UeXBlJiBjb2xsZWN0
aW9uLCBjb25zdCBJbmRleFNldCYgc2V0KQorICAgICAgICAgICAgOiBtX2NvbGxlY3Rpb24oY29s
bGVjdGlvbikKKyAgICAgICAgICAgICwgbV9zZXQoc2V0KQorICAgICAgICB7CisgICAgICAgIH0K
KworICAgICAgICBjbGFzcyBpdGVyYXRvciB7CisgICAgICAgIHB1YmxpYzoKKyAgICAgICAgICAg
IGl0ZXJhdG9yKCkKKyAgICAgICAgICAgICAgICA6IG1fY29sbGVjdGlvbihudWxscHRyKQorICAg
ICAgICAgICAgeworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpdGVyYXRvcihjb25zdCBD
b2xsZWN0aW9uVHlwZSYgY29sbGVjdGlvbiwgQml0VmVjdG9yOjpTZXRCaXRzSXRlcmFibGU6Oml0
ZXJhdG9yIGl0ZXIpCisgICAgICAgICAgICAgICAgOiBtX2NvbGxlY3Rpb24oJmNvbGxlY3Rpb24p
CisgICAgICAgICAgICAgICAgLCBtX2l0ZXIoaXRlcikKKyAgICAgICAgICAgIHsKKyAgICAgICAg
ICAgIH0KKworICAgICAgICAgICAgVCogb3BlcmF0b3IqKCkKKyAgICAgICAgICAgIHsKKyAgICAg
ICAgICAgICAgICByZXR1cm4gbV9jb2xsZWN0aW9uLT5hdCgqbV9pdGVyKTsKKyAgICAgICAgICAg
IH0KKworICAgICAgICAgICAgaXRlcmF0b3ImIG9wZXJhdG9yKysoKQorICAgICAgICAgICAgewor
ICAgICAgICAgICAgICAgIG1faXRlcisrOworICAgICAgICAgICAgICAgIHJldHVybiAqdGhpczsK
KyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgYm9vbCBvcGVyYXRvcj09KGNvbnN0IGl0ZXJh
dG9yJiBvdGhlcikgY29uc3QKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4g
bV9pdGVyID09IG90aGVyLm1faXRlcjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgYm9v
bCBvcGVyYXRvciE9KGNvbnN0IGl0ZXJhdG9yJiBvdGhlcikgY29uc3QKKyAgICAgICAgICAgIHsK
KyAgICAgICAgICAgICAgICByZXR1cm4gISgqdGhpcyA9PSBvdGhlcik7CisgICAgICAgICAgICB9
CisKKyAgICAgICAgcHJpdmF0ZToKKyAgICAgICAgICAgIGNvbnN0IENvbGxlY3Rpb25UeXBlKiBt
X2NvbGxlY3Rpb247CisgICAgICAgICAgICBCaXRWZWN0b3I6OlNldEJpdHNJdGVyYWJsZTo6aXRl
cmF0b3IgbV9pdGVyOworICAgICAgICB9OworCisgICAgICAgIGl0ZXJhdG9yIGJlZ2luKCkgY29u
c3QgeyByZXR1cm4gaXRlcmF0b3IobV9jb2xsZWN0aW9uLCBtX3NldC5iZWdpbigpKTsgfQorICAg
ICAgICBpdGVyYXRvciBlbmQoKSBjb25zdCB7IHJldHVybiBpdGVyYXRvcihtX2NvbGxlY3Rpb24s
IG1fc2V0LmVuZCgpKTsgfQorCisgICAgcHJpdmF0ZToKKyAgICAgICAgY29uc3QgQ29sbGVjdGlv
blR5cGUmIG1fY29sbGVjdGlvbjsKKyAgICAgICAgY29uc3QgSW5kZXhTZXQmIG1fc2V0OworICAg
IH07CisKKyAgICAvLyBGb3IgYmFzaWMgYmxvY2tzLCB5b3UgZG86CisgICAgLy8gaW5kZXhTZXQu
dmFsdWVzKHByb2NlZHVyZSk7CisgICAgLy8KKyAgICAvLyBGb3IgdmFsdWVzLCB5b3UgZG86Cisg
ICAgLy8gaW5kZXhTZXQudmFsdWVzKHByb2NlZHVyZS52YWx1ZXMoKSk7CisgICAgdGVtcGxhdGU8
dHlwZW5hbWUgQ29sbGVjdGlvblR5cGU+CisgICAgSXRlcmFibGU8Q29sbGVjdGlvblR5cGU+IHZh
bHVlcyhjb25zdCBDb2xsZWN0aW9uVHlwZSYgY29sbGVjdGlvbikgY29uc3QKKyAgICB7CisgICAg
ICAgIHJldHVybiBJdGVyYWJsZTxDb2xsZWN0aW9uVHlwZT4oY29sbGVjdGlvbik7CisgICAgfQor
CisgICAgY29uc3QgQml0VmVjdG9yJiBpbmRpY2VzKCkgY29uc3QgeyByZXR1cm4gbV9zZXQ7IH0K
KworICAgIHZvaWQgZHVtcChQcmludFN0cmVhbSYgb3V0KSBjb25zdAorICAgIHsKKyAgICAgICAg
Q29tbWFQcmludGVyIGNvbW1hOworICAgICAgICBmb3IgKHNpemVfdCBpbmRleCA6IGluZGljZXMo
KS5zZXRCaXRzKCkpCisgICAgICAgICAgICBvdXQucHJpbnQoY29tbWEsIFQ6OmR1bXBQcmVmaXgs
IGluZGV4KTsKKyAgICB9CisKK3ByaXZhdGU6CisgICAgQml0VmVjdG9yIG1fc2V0OworfTsKKwor
fSB9IC8vIG5hbWVzcGFjZSBKU0M6OkIzCisKKyNlbmRpZiAvLyBCM0luZGV4U2V0X2gKKwpJbmRl
eDogU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzTG93ZXJpbmdNYXRjaGVyLnBhdHRlcm5zCj09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM0xvd2VyaW5nTWF0Y2hlci5w
YXR0ZXJucwkocmV2aXNpb24gMCkKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM0xvd2Vy
aW5nTWF0Y2hlci5wYXR0ZXJucwkod29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDQxIEBACisjIENv
cHlyaWdodCAoQykgMjAxNSBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisjCisjIFJl
ZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Ig
d2l0aG91dAorIyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUg
Zm9sbG93aW5nIGNvbmRpdGlvbnMKKyMgYXJlIG1ldDoKKyMgMS4gUmVkaXN0cmlidXRpb25zIG9m
IHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyMgICAgbm90aWNl
LCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgor
IyAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFi
b3ZlIGNvcHlyaWdodAorIyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0
aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisjICAgIGRvY3VtZW50YXRpb24gYW5kL29y
IG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisjCisjIFRI
SVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBBTkQgSVRTIENPTlRSSUJVVE9S
UyBgYEFTIElTJycKKyMgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5D
TFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisjIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0Yg
TUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyMgUFVSUE9TRSBB
UkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUiBJVFMgQ09OVFJJ
QlVUT1JTCisjIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUws
IFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKKyMgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJ
TkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKKyMgU1VCU1RJVFVURSBHT09E
UyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNT
CisjIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElB
QklMSVRZLCBXSEVUSEVSIElOCisjIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JU
IChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisjIEFSSVNJTkcgSU4gQU5ZIFdB
WSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YKKyMg
VEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCittYXRjaGVyIExvd2VyaW5nTWF0Y2hl
cgorCisjIFRoZXNlIHJ1bGVzIGFyZSBjb25zaWRlcmVkIGluIGEgY2FzY2FkZSwgc3RhcnRpbmcg
YXQgdGhlIHRvcC4gSXQncyBpbXBsZW5lbnRlZCB1c2luZyBzd2l0Y2gKKyMgc3RhdGVtZW50cyB3
aGVyZXZlciBwb3NzaWJsZS4KKworIyBOb3RlOiBhZGRpbmcgbW9yZSBydWxlcyB0byB0aGlzIG1h
dGNoZXIgaXMgYW4gZXhjZWxsZW50IHdheSBvZiBpbXByb3ZpbmcgcGVyZm9ybWFuY2UhCisKK0xv
YWQgPSBMb2FkKGFkZHJlc3MpCisKK0FkZExvYWQgPSBBZGQoTG9hZChhZGRyZXNzKSwgdmFsdWUp
CitBZGQgPSBBZGQobGVmdCwgcmlnaHQpCisKK1N0b3JlQWRkTG9hZCA9IFN0b3JlKEFkZChMb2Fk
KGFkZHJlc3MpLCB2YWx1ZSksIGFkZHJlc3MpCitTdG9yZUFuZExvYWQgPSBTdG9yZShBbmQoTG9h
ZChhZGRyZXNzKSwgdmFsdWUpLCBhZGRyZXNzKQorU3RvcmUgPSBTdG9yZSh2YWx1ZSwgYWRkcmVz
cykKKworUmV0dXJuID0gUmV0dXJuKHZhbHVlKQorCkluZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENv
cmUvYjMvQjNNZW1vcnlWYWx1ZS5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRD
b3JlL2IzL0IzTWVtb3J5VmFsdWUuY3BwCShyZXZpc2lvbiAwKQorKysgU291cmNlL0phdmFTY3Jp
cHRDb3JlL2IzL0IzTWVtb3J5VmFsdWUuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsNDIg
QEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTUgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2Vy
dmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkg
Zm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHBy
b3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4g
UmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5
cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xs
b3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBt
dXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlz
dCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAg
ICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUg
ZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUg
SU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMs
IElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElF
UyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVS
UE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IKKyAq
IENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVO
VEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElO
Q0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVU
RSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBP
UiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZ
CisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFks
IE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcg
SU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBB
RFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKworI2luY2x1
ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgIkIzTWVtb3J5VmFsdWUuaCIKKworbmFtZXNwYWNlIEpT
QyB7IG5hbWVzcGFjZSBCMyB7CisKK01lbW9yeVZhbHVlOjp+TWVtb3J5VmFsdWUoKQoreworfQor
Cit2b2lkIE1lbW9yeVZhbHVlOjpkdW1wTWV0YShQcmludFN0cmVhbSYgb3V0KSBjb25zdAorewor
ICAgIGlmIChtX29mZnNldCkKKyAgICAgICAgb3V0LnByaW50KCJvZmZzZXQgPSAiLCBtX29mZnNl
dCk7Cit9CisKK30gfSAvLyBuYW1lc3BhY2UgSlNDOjpCMworCkluZGV4OiBTb3VyY2UvSmF2YVNj
cmlwdENvcmUvYjMvQjNNZW1vcnlWYWx1ZS5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2Ny
aXB0Q29yZS9iMy9CM01lbW9yeVZhbHVlLmgJKHJldmlzaW9uIDApCisrKyBTb3VyY2UvSmF2YVNj
cmlwdENvcmUvYjMvQjNNZW1vcnlWYWx1ZS5oCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsMTQy
IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE1IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNl
cnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5
IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBw
cm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEu
IFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29w
eXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9s
bG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0g
bXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxp
c3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICog
ICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhl
IGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExF
IElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVT
LCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJ
RVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBV
UlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SCisg
KiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURF
TlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJ
TkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRV
VEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsg
T1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9S
WQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZ
LCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5H
IElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYg
QURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisKKyNpZm5k
ZWYgQjNNZW1vcnlWYWx1ZV9oCisjZGVmaW5lIEIzTWVtb3J5VmFsdWVfaAorCisjaW5jbHVkZSAi
QjNWYWx1ZS5oIgorCituYW1lc3BhY2UgSlNDIHsgbmFtZXNwYWNlIEIzIHsKKworY2xhc3MgTWVt
b3J5VmFsdWUgOiBwdWJsaWMgVmFsdWUgeworcHVibGljOgorICAgIHN0YXRpYyBib29sIGFjY2Vw
dHMoT3Bjb2RlIG9wY29kZSkKKyAgICB7CisgICAgICAgIHN3aXRjaCAob3Bjb2RlKSB7CisgICAg
ICAgIGNhc2UgTG9hZDhaOgorICAgICAgICBjYXNlIExvYWQ4UzoKKyAgICAgICAgY2FzZSBMb2Fk
MTZaOgorICAgICAgICBjYXNlIExvYWQxNlM6CisgICAgICAgIGNhc2UgTG9hZEZsb2F0OgorICAg
ICAgICBjYXNlIExvYWQ6CisgICAgICAgIGNhc2UgU3RvcmU4OgorICAgICAgICBjYXNlIFN0b3Jl
MTY6CisgICAgICAgIGNhc2UgU3RvcmVGbG9hdDoKKyAgICAgICAgY2FzZSBTdG9yZToKKyAgICAg
ICAgICAgIHJldHVybiB0cnVlOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJu
IGZhbHNlOworICAgICAgICB9CisgICAgfQorCisgICAgfk1lbW9yeVZhbHVlKCk7CisKKyAgICBp
bnRwdHJfdCBvZmZzZXQoKSBjb25zdCB7IHJldHVybiBtX29mZnNldDsgfQorCitwcm90ZWN0ZWQ6
CisgICAgdm9pZCBkdW1wTWV0YShQcmludFN0cmVhbSYpIGNvbnN0IG92ZXJyaWRlOworCitwcml2
YXRlOgorICAgIGZyaWVuZCBjbGFzcyBQcm9jZWR1cmU7CisKKyAgICAvLyBVc2UgdGhpcyBmb3Jt
IGZvciBMb2FkIChidXQgbm90IExvYWQ4WiwgTG9hZDhTLCBvciBhbnkgb2YgdGhlIExvYWRzIHRo
YXQgaGF2ZSBhIHN1ZmZpeCB0aGF0CisgICAgLy8gZGVzY3JpYmVzIHRoZSByZXR1cm5lZCB0eXBl
KS4KKyAgICBNZW1vcnlWYWx1ZSgKKyAgICAgICAgdW5zaWduZWQgaW5kZXgsIE9wY29kZSBvcGNv
ZGUsIFR5cGUgdHlwZSwgT3JpZ2luIG9yaWdpbiwgVmFsdWUqIHBvaW50ZXIsCisgICAgICAgIGlu
dHB0cl90IG9mZnNldCA9IDApCisgICAgICAgIDogVmFsdWUoaW5kZXgsIG9wY29kZSwgdHlwZSwg
b3JpZ2luLCBwb2ludGVyKQorICAgICAgICAsIG1fb2Zmc2V0KG9mZnNldCkKKyAgICB7CisgICAg
ICAgIGlmICghQVNTRVJUX0RJU0FCTEVEKSB7CisgICAgICAgICAgICBzd2l0Y2ggKG9wY29kZSkg
eworICAgICAgICAgICAgY2FzZSBMb2FkOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAg
ICAgICAgY2FzZSBMb2FkOFo6CisgICAgICAgICAgICBjYXNlIExvYWQ4UzoKKyAgICAgICAgICAg
IGNhc2UgTG9hZDE2WjoKKyAgICAgICAgICAgIGNhc2UgTG9hZDE2UzoKKyAgICAgICAgICAgICAg
ICBBU1NFUlQodHlwZSA9PSBJbnQzMik7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAg
ICAgICBjYXNlIExvYWRGbG9hdDoKKyAgICAgICAgICAgICAgICBBU1NFUlQodHlwZSA9PSBEb3Vi
bGUpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBTdG9yZTg6Cisg
ICAgICAgICAgICBjYXNlIFN0b3JlMTY6CisgICAgICAgICAgICBjYXNlIFN0b3JlRmxvYXQ6Cisg
ICAgICAgICAgICBjYXNlIFN0b3JlOgorICAgICAgICAgICAgICAgIEFTU0VSVCh0eXBlID09IFZv
aWQpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAg
ICAgICAgICAgICBBU1NFUlRfTk9UX1JFQUNIRUQoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAg
fQorICAgIH0KKworICAgIC8vIFVzZSB0aGlzIGZvcm0gZm9yIGxvYWRzIHdoZXJlIHRoZSByZXR1
cm4gdHlwZSBpcyBpbXBsaWVkLgorICAgIE1lbW9yeVZhbHVlKHVuc2lnbmVkIGluZGV4LCBPcGNv
ZGUgb3Bjb2RlLCBPcmlnaW4gb3JpZ2luLCBWYWx1ZSogcG9pbnRlciwgaW50cHRyX3Qgb2Zmc2V0
ID0gMCkKKyAgICAgICAgOiBWYWx1ZShpbmRleCwgb3Bjb2RlLCBvcGNvZGUgPT0gTG9hZEZsb2F0
ID8gRG91YmxlIDogSW50MzIsIG9yaWdpbiwgcG9pbnRlcikKKyAgICAgICAgLCBtX29mZnNldChv
ZmZzZXQpCisgICAgeworICAgICAgICBpZiAoIUFTU0VSVF9ESVNBQkxFRCkgeworICAgICAgICAg
ICAgc3dpdGNoIChvcGNvZGUpIHsKKyAgICAgICAgICAgIGNhc2UgTG9hZDhaOgorICAgICAgICAg
ICAgY2FzZSBMb2FkOFM6CisgICAgICAgICAgICBjYXNlIExvYWQxNlo6CisgICAgICAgICAgICBj
YXNlIExvYWQxNlM6CisgICAgICAgICAgICBjYXNlIExvYWRGbG9hdDoKKyAgICAgICAgICAgICAg
ICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgQVNTRVJUX05P
VF9SRUFDSEVEKCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAg
ICAgIH0KKyAgICB9CisKKyAgICAvLyBVc2UgdGhpcyBmb3JtIGZvciBzdG9yZXMuCisgICAgTWVt
b3J5VmFsdWUoCisgICAgICAgIHVuc2lnbmVkIGluZGV4LCBPcGNvZGUgb3Bjb2RlLCBPcmlnaW4g
b3JpZ2luLCBWYWx1ZSogdmFsdWUsIFZhbHVlKiBwb2ludGVyLAorICAgICAgICBpbnRwdHJfdCBv
ZmZzZXQgPSAwKQorICAgICAgICA6IFZhbHVlKGluZGV4LCBvcGNvZGUsIFZvaWQsIG9yaWdpbiwg
dmFsdWUsIHBvaW50ZXIpCisgICAgICAgICwgbV9vZmZzZXQob2Zmc2V0KQorICAgIHsKKyAgICAg
ICAgaWYgKCFBU1NFUlRfRElTQUJMRUQpIHsKKyAgICAgICAgICAgIHN3aXRjaCAob3Bjb2RlKSB7
CisgICAgICAgICAgICBjYXNlIFN0b3JlODoKKyAgICAgICAgICAgIGNhc2UgU3RvcmUxNjoKKyAg
ICAgICAgICAgIGNhc2UgU3RvcmVGbG9hdDoKKyAgICAgICAgICAgIGNhc2UgU3RvcmU6CisgICAg
ICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAg
IEFTU0VSVF9OT1RfUkVBQ0hFRCgpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAg
ICAgfQorICAgICAgICB9CisgICAgfQorfTsKKworfSB9IC8vIG5hbWVzcGFjZSBKU0M6OkIzCisK
KyNlbmRpZiAvLyBCM01lbW9yeVZhbHVlX2gKKwpJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3Jl
L2IzL0IzT3Bjb2RlLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMv
QjNPcGNvZGUuY3BwCShyZXZpc2lvbiAwKQorKysgU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0Iz
T3Bjb2RlLmNwcAkod29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDQ3IEBACisvKgorICogQ29weXJp
Z2h0IChDKSAyMDE1IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRp
c3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdp
dGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBm
b2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBv
ZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3Rp
Y2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIu
CisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhl
IGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBh
bmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBh
bmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAq
CisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFO
RCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBO
T1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklM
SVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlN
RUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUg
TElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAq
IEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1Qg
TElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklD
RVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJS
VVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZ
LCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5D
TFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9G
IFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9T
U0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisKKyNpbmNsdWRlICJjb25maWcuaCIKKyNp
bmNsdWRlICJCM09wY29kZS5oIgorCisjaW5jbHVkZSA8d3RmL1ByaW50U3RyZWFtLmg+CisKK25h
bWVzcGFjZSBXVEYgeworCit1c2luZyBuYW1lc3BhY2UgSlNDOjpCMzsKKwordm9pZCBwcmludElu
dGVybmFsKFByaW50U3RyZWFtJiBvdXQsIE9wY29kZSBvcGNvZGUpCit7CisgICAgc3dpdGNoIChv
cGNvZGUpIHsKKyAgICBjYXNlIElkZW50aXR5OgorICAgICAgICBvdXQucHJpbnQoIklkZW50aXR5
Iik7CisgICAgICAgIHJldHVybjsKKyAgICAgICAgLy8gRklYTUUKKyAgICB9CisgICAgUkVMRUFT
RV9BU1NFUlRfTk9UX1JFQUNIRUQoKTsKK30KKworfSAvLyBuYW1lc3BhY2UgV1RGCisKSW5kZXg6
IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM09wY29kZS5oCj09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJj
ZS9KYXZhU2NyaXB0Q29yZS9iMy9CM09wY29kZS5oCShyZXZpc2lvbiAwKQorKysgU291cmNlL0ph
dmFTY3JpcHRDb3JlL2IzL0IzT3Bjb2RlLmgJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSwyMDMg
QEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTUgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2Vy
dmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkg
Zm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHBy
b3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4g
UmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5
cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xs
b3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBt
dXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlz
dCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAg
ICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUg
ZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUg
SU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMs
IElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElF
UyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVS
UE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IKKyAq
IENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVO
VEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElO
Q0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVU
RSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBP
UiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZ
CisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFks
IE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcg
SU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBB
RFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKworI2lmbmRl
ZiBCM09wY29kZV9oCisjZGVmaW5lIEIzT3Bjb2RlX2gKKworI2luY2x1ZGUgPHd0Zi9TdGRMaWJF
eHRyYXMuaD4KKworbmFtZXNwYWNlIEpTQyB7IG5hbWVzcGFjZSBCMyB7CisKK2VudW0gT3Bjb2Rl
IDogaW50MTZfdCB7CisgICAgLy8gQSBuby1vcCB0aGF0IHJldHVybnMgVm9pZCwgdXNlZnVsIGZv
ciB3aGVuIHlvdSB3YW50IHRvIHJlbW92ZSBhIHZhbHVlLgorICAgIE5vcCwKKyAgICAgCisgICAg
Ly8gUG9seW1vcnBoaWMgaWRlbnRpdHksIHVzYWJsZSB3aXRoIGFueSB2YWx1ZSB0eXBlLgorICAg
IElkZW50aXR5LAorCisgICAgLy8gQ29uc3RhbnRzLiBVc2UgdGhlIENvbnN0VmFsdWUqIGNsYXNz
ZXMuIENvbnN0YW50cyBleGlzdCBpbiB0aGUgY29udHJvbCBmbG93LCBzbyB0aGF0IHdlIGNhbgor
ICAgIC8vIHJlYXNvbiBhYm91dCB3aGVyZSB3ZSB3b3VsZCBjb25zdHJ1Y3QgdGhlbS4gTGFyZ2Ug
Y29uc3RhbnRzIGFyZSBleHBlbnNpdmUgdG8gY3JlYXRlLgorICAgIENvbnN0MzIsCisgICAgQ29u
c3Q2NCwKKyAgICBDb25zdERvdWJsZSwKKworICAgIC8vIFRoZSBtYWdpY2FsIHN0YWNrIHNsb3Qu
IFRoaXMgaXMgdmlld2VkIGFzIGV4ZWN1dGluZyBhdCB0aGUgdG9wIG9mIHRoZSBwcm9ncmFtIHJl
Z2FyZGxlc3Mgb2YKKyAgICAvLyB3aGVyZSBpbiBjb250cm9sIGZsb3cgeW91IHB1dCBpdC4gRWFj
aCBpbnN0YW5jZSBvZiBhIFN0YWNrU2xvdCBWYWx1ZSBnZXRzIGEgZGlzam9pbnQgcmFuZ2Ugb2YK
KyAgICAvLyBzdGFjayBtZW1vcnkuIFVzZSB0aGUgU3RhY2tTbG90VmFsdWUgY2xhc3MuCisgICAg
U3RhY2tTbG90LAorCisgICAgLy8gVGhlIG1hZ2ljYWwgYXJndW1lbnQgcmVnaXN0ZXIuIFRoaXMg
aXMgdmlld2VkIGFzIGV4ZWN1dGluZyBhdCB0aGUgdG9wIG9mIHRoZSBwcm9ncmFtCisgICAgLy8g
cmVnYXJkbGVzcyBvZiB3aGVyZSBpbiBjb250cm9sIGZsb3cgeW91IHB1dCBpdCwgYW5kIHRoZSBj
b21waWxlciB0YWtlcyBjYXJlIHRvIGVuc3VyZSB0aGF0IHdlCisgICAgLy8gZG9uJ3QgY2xvYmJl
ciB0aGUgdmFsdWUgYnkgcmVnaXN0ZXIgYWxsb2NhdGlvbiBvciBjYWxscyAoZWl0aGVyIGJ5IHNh
dmluZyB0aGUgYXJndW1lbnQgdG8gdGhlCisgICAgLy8gc3RhY2sgb3IgcHJlc2VydmluZyBpdCBp
biBhIGNhbGxlZS1zYXZlIHJlZ2lzdGVyKS4gVXNlIHRoZSBBcmd1bWVudFJlZ1ZhbHVlIGNsYXNz
LiBUaGUgcmV0dXJuCisgICAgLy8gdHlwZSBpcyBlaXRoZXIgcG9pbnRlcigpIChmb3IgR1BScykg
b3IgRG91YmxlIChmb3IgRlBScykuCisgICAgQXJndW1lbnRSZWcsCisKKyAgICAvLyBUaGUgZnJh
bWUgcG9pbnRlci4gWW91IGNhbiBwdXQgdGhpcyBhbnl3aGVyZSBpbiBjb250cm9sIGZsb3cgYnV0
IGl0IHdpbGwgYWx3YXlzIHlpZWxkIHRoZQorICAgIC8vIGZyYW1lIHBvaW50ZXIsIHdpdGggYSBj
YXZlYXQ6IGlmIG91ciBjb21waWxlciBjaGFuZ2VzIHRoZSBmcmFtZSBwb2ludGVyIHRlbXBvcmFy
aWx5IGZvciBzb21lCisgICAgLy8gc2lsbHkgcmVhc29uLCB0aGUgRnJhbWVQb2ludGVyIGludHJp
bnNpYyB3aWxsIHJldHVybiB3aGVyZSB0aGUgZnJhbWUgcG9pbnRlciAqc2hvdWxkKiBiZSBub3QK
KyAgICAvLyB3aGVyZSBpdCBoYXBwZW5zIHRvIGJlIHJpZ2h0IG5vdy4KKyAgICBGcmFtZVBvaW50
ZXIsCisKKyAgICAvLyBQb2x5bW9ycGhpYyBtYXRoLCB1c2FibGUgd2l0aCBhbnkgdmFsdWUgdHlw
ZS4KKyAgICBBZGQsCisgICAgU3ViLAorICAgIE11bCwKKyAgICBEaXYsCisKKyAgICAvLyBJbnRl
Z2VyIG1hdGguCisgICAgQ2hpbGxEaXYsIC8vIGRvZXNuJ3QgdHJhcCBldmVyLCBiZWhhdmVzIGxp
a2UgSlMgKHgveSl8MC4KKyAgICBNb2QsCisgICAgQml0QW5kLAorICAgIEJpdE9yLAorICAgIEJp
dFhvciwKKyAgICBTaGwsCisgICAgU1NociwKKyAgICBaU2hyLAorCisgICAgLy8gQ2FzdHMgYW5k
IHN1Y2guCisgICAgLy8gVGFrZXMgYW5kIHJldHVybnMgSW50MzI6CisgICAgU0V4dDgsCisgICAg
U0V4dDE2LAorICAgIC8vIFRha2VzIEludDMyIGFuZCByZXR1cm5zIEludDY0OgorICAgIFNFeHQz
MiwKKyAgICBaRXh0MzIsCisgICAgLy8gVGFrZXMgYW5kIHJldHVybnMgRG91YmxlOgorICAgIEZS
b3VuZCwKKyAgICAvLyBUYWtlcyBpbnRzIGFuZCByZXR1cm5zIERvdWJsZToKKyAgICBJVG9ELAor
ICAgIC8vIFRha2VzIERvdWJsZSBhbmQgcmV0dXJucyBJbnQzMjoKKyAgICBEVG9JMzIsCisKKyAg
ICAvLyBQb2x5bW9ycGhpYyBjb21wYXJpc29ucywgdXNhYmxlIHdpdGggYW55IHZhbHVlIHR5cGUu
IFJldHVybnMgaW50MzIgMCBvciAxLiBOb3RlIHRoYXQgIk5vdCIKKyAgICAvLyBpcyBqdXN0IEVx
dWFsKHgsIDApLgorICAgIEVxdWFsLAorICAgIE5vdEVxdWFsLAorICAgIExlc3NUaGFuLAorICAg
IEdyZWF0ZXJUaGFuLAorICAgIExlc3NFcXVhbCwKKyAgICBHcmVhdGVyRXF1YWwsCisKKyAgICAv
LyBJbnRlZ2VyIGNvbXBhcmlzb25zLiBSZXR1cm5zIGludDMyIDAgb3IgMS4KKyAgICBBYm92ZSwK
KyAgICBCZWxvdywKKyAgICBBYm92ZUVxdWFsCisgICAgQmVsb3dFcXVhbCwKKworICAgIC8vIE1l
bW9yeSBsb2Fkcy4gT3Bjb2RlIGluZGljYXRlcyBob3cgd2UgbG9hZCBhbmQgdGhlIGxvYWRlZCB0
eXBlLiBUaGVzZSB1c2UgTWVtb3J5VmFsdWUuCisgICAgLy8gVGhlc2UgcmV0dXJuIEludDMyOgor
ICAgIExvYWQ4WiwKKyAgICBMb2FkOFMsCisgICAgTG9hZDE2WiwKKyAgICBMb2FkMTZTLAorICAg
IC8vIFRoaXMgcmV0dXJucyBEb3VibGU6CisgICAgTG9hZEZsb2F0LAorICAgIC8vIFRoaXMgcmV0
dXJuIHdoYXRldmVyIHRoZSByZXR1cm4gdHlwZSBpczoKKyAgICBMb2FkLAorCisgICAgLy8gTWVt
b3J5IHN0b3Jlcy4gT3Bjb2RlIGluZGljYXRlcyBob3cgdGhlIHZhbHVlIGlzIHN0b3JlZC4gVGhl
c2UgdXNlIE1lbW9yeVZhbHVlLgorICAgIC8vIFRoZXNlIHRha2UgYW4gSW50MzIgdmFsdWU6Cisg
ICAgU3RvcmU4LAorICAgIFN0b3JlMTYsCisgICAgLy8gVGhpcyB0YWtlcyBhIERvdWJsZSB2YWx1
ZToKKyAgICBTdG9yZUZsb2F0LAorICAgIC8vIFRoaXMgaXMgYSBwb2x5bW9ycGhpYyBzdG9yZSBm
b3IgSW50MzIsIEludDY0LCBhbmQgRG91YmxlOgorICAgIFN0b3JlLAorCisgICAgLy8gVGhpcyBp
cyBhIHJlZ3VsYXIgb3JkaW5hcnkgQyBmdW5jdGlvbiBjYWxsLCB1c2luZyB0aGUgc3lzdGVtIEMg
Y2FsbGluZyBjb252ZW50aW9uLiBNYWtlIHN1cmUKKyAgICAvLyB0aGF0IHRoZSBhcmd1bWVudHMg
YXJlIHBhc3NlZCB1c2luZyB0aGUgcmlnaHQgdHlwZXMuCisgICAgQ0NhbGwsCisKKyAgICAvLyBU
aGlzIGlzIGEgcGF0Y2hwb2ludC4gVXNlIHRoZSBQYXRjaHBvaW50VmFsdWUgY2xhc3MuIFRoaXMg
aXMgdmlld2VkIGFzIGJlaGF2aW5nIGxpa2UgYSBjYWxsLAorICAgIC8vIGJ1dCBvbmx5IGVtaXRz
IGNvZGUgdmlhIGEgY29kZSBnZW5lcmF0aW9uIGNhbGxiYWNrLiBUaGF0IGNhbGxiYWNrIGdldHMg
dG8gZW1pdCBjb2RlIGlubGluZS4KKyAgICAvLyBZb3UgY2FuIHBhc3MgYSBzdGFja21hcCBhbG9u
ZyB3aXRoIGNvbnN0cmFpbnRzIG9uIGhvdyBlYWNoIHN0YWNrbWFwIGFyZ3VtZW50IG11c3QgYmUg
cGFzc2VkLgorICAgIC8vIEl0J3MgbGVnYWwgdG8gcmVxdWVzdCB0aGF0IGEgc3RhY2ttYXAgYXJn
dW1lbnQgaXMgaW4gc29tZSByZWdpc3RlciBhbmQgaXQncyBsZWdhbCB0byByZXF1ZXN0CisgICAg
Ly8gdGhhdCBhIHN0YWNrbWFwIGFyZ3VtZW50IGlzIGF0IHNvbWUgb2Zmc2V0IGZyb20gdGhlIHRv
cCBvZiB0aGUgYXJndW1lbnQgcGFzc2luZyBhcmVhIG9uIHRoZQorICAgIC8vIHN0YWNrLgorICAg
IFBhdGNocG9pbnQsCisKKyAgICAvLyBDaGVja2VkIG1hdGguIFVzZSB0aGUgQ2hlY2tWYWx1ZSBj
bGFzcy4gTGlrZSBhIFBhdGNocG9pbnQsIHRoaXMgdGFrZXMgYSBjb2RlIGdlbmVyYXRpb24KKyAg
ICAvLyBjYWxsYmFjay4gVGhhdCBjYWxsYmFjayBnZXRzIHRvIGVtaXQgc29tZSBjb2RlIGFmdGVy
IHRoZSBlcGlsb2d1ZSwgYW5kIGdldHMgdG8gbGluayB0aGUganVtcAorICAgIC8vIGZyb20gdGhl
IGNoZWNrLCBhbmQgdGhlIGNob2ljZSBvZiByZWdpc3RlcnMuIFlvdSBhbHNvIGdldCB0byBzdXBw
bHkgYSBzdGFja21hcC4gTm90ZSB0aGF0IHlvdQorICAgIC8vIGFyZSBub3QgYWxsb3dlZCB0byBq
dW1wIGJhY2sgaW50byB0aGUgbWFpbmxpbmUgY29kZSBmcm9tIHlvdXIgc2xvdyBwYXRoLCBzaW5j
ZSB0aGUgY29tcGlsZXIKKyAgICAvLyB3aWxsIGFzc3VtZSB0aGF0IHRoZSBleGVjdXRpb24gb2Yg
dGhlc2UgaW5zdHJ1Y3Rpb25zIHByb3ZlcyB0aGF0IG92ZXJmbG93IGRpZG4ndCBoYXBwZW4uIEZv
cgorICAgIC8vIGV4YW1wbGUsIGlmIHlvdSBoYXZlIHR3byBDaGVja0FkZCdzOgorICAgIC8vCisg
ICAgLy8gYSA9IENoZWNrQWRkKHgsIHkpCisgICAgLy8gYiA9IENoZWNrQWRkKHgsIHkpCisgICAg
Ly8KKyAgICAvLyBUaGVuIGl0J3MgdmFsaWQgdG8gY2hhbmdlIHRoaXMgdG86CisgICAgLy8KKyAg
ICAvLyBhID0gQ2hlY2tBZGQoeCwgeSkKKyAgICAvLyBiID0gSWRlbnRpdHkoYSkKKyAgICAvLwor
ICAgIC8vIFRoaXMgaXMgdmFsaWQgcmVnYXJkbGVzcyBvZiB0aGUgY2FsbGJhY2tzIHVzZWQgYnkg
dGhlIHR3byBDaGVja0FkZHMuIFRoZXkgbWF5IGhhdmUgZGlmZmVyZW50CisgICAgLy8gY2FsbGJh
Y2tzLiBZZXQsIHRoaXMgdHJhbnNmb3JtYXRpb24gaXMgdmFsaWQgZXZlbiBpZiB0aGV5IGFyZSBk
aWZmZXJlbnQgYmVjYXVzZSB3ZSBrbm93IHRoYXQKKyAgICAvLyBhZnRlciB0aGUgZmlyc3QgQ2hl
Y2tBZGQgZXhlY3V0ZXMsIHRoZSBzZWNvbmQgQ2hlY2tBZGQgY291bGQgbm90IGhhdmUgcG9zc2li
bHkgdGFrZW4gc2xvdworICAgIC8vIHBhdGguIFRoZXJlZm9yZSwgdGhlIHNlY29uZCBDaGVja0Fk
ZCdzIGNhbGxiYWNrIGlzIGlycmVsZXZhbnQuCisgICAgQ2hlY2tBZGQsCisgICAgQ2hlY2tTdWIs
CisgICAgQ2hlY2tNdWwsCisKKyAgICAvLyBDaGVjayB0aGF0IHNpZGUtZXhpdHMuIFVzZSB0aGUg
Q2hlY2tWYWx1ZSBjbGFzcy4gTGlrZSBDaGVja0FkZCBhbmQgZnJpZW5kcywgdGhpcyBoYXMgYQor
ICAgIC8vIHN0YWNrbWFwIHdpdGggYSBnZW5lcmF0aW9uIGNhbGxiYWNrLiBUaGlzIHRha2VzIGFu
IEludDMyIGFyZ3VtZW50IHRoYXQgdGhpcyBicmFuY2hlcyBvbiwgd2l0aAorICAgIC8vIGZ1bGwg
YnJhbmNoIGZ1c2lvbiBpbiB0aGUgaW5zdHJ1Y3Rpb24gc2VsZWN0b3IuIEEgdHJ1ZSB2YWx1ZSBq
dW1wcyB0byB0aGUgZ2VuZXJhdG9yJ3Mgc2xvdworICAgIC8vIHBhdGguCisgICAgQ2hlY2ssCisK
KyAgICAvLyBTU0Egc3VwcG9ydCwgaW4gdGhlIHN0eWxlIG9mIERGRyBTU0EuCisgICAgVXBzaWxv
biwgLy8gVGhpcyB1c2VzIHRoZSBVcHNpbG9uVmFsdWUgY2xhc3MuCisgICAgUGhpLAorCisgICAg
Ly8gSnVtcC4gVXNlcyB0aGUgQ29udHJvbFZhbHVlIGNsYXNzLgorICAgIEp1bXAsCisgICAgCisg
ICAgLy8gUG9seW1vcnBoaWMgYnJhbmNoLCB1c2FibGUgd2l0aCBhbnkgdmFsdWUgdHlwZS4gQnJh
bmNoZXMgaWYgbm90IGVxdWFsIHRvIHplcm8uIFVzZXMgdGhlCisgICAgLy8gQ29udHJvbFZhbHVl
IGNsYXNzLCB3aXRoIHRoZSAwLWluZGV4IHN1Y2Nlc3NvciBiZWluZyB0aGUgdHJ1ZSBzdWNjZXNz
b3IuCisgICAgQnJhbmNoLAorCisgICAgLy8gU3dpdGNoLiBTd2l0Y2hlcyBvdmVyIGVpdGhlciBJ
bnQzMiBvciBJbnQ2NC4gVXNlcyB0aGUgU3dpdGNoVmFsdWUgY2xhc3MuCisgICAgU3dpdGNoLAor
CisgICAgLy8gUmV0dXJuLiBOb3RlIHRoYXQgQjMgcHJvY2VkdXJlcyBkb24ndCBrbm93IHRoZWly
IHJldHVybiB0eXBlLCBzbyB0aGlzIGNhbiBqdXN0IHJldHVybiBhbnkKKyAgICAvLyB0eXBlLiBV
c2VzIHRoZSBDb250cm9sVmFsdWUgY2xhc3MuCisgICAgUmV0dXJuLAorCisgICAgLy8gVGhpcyBp
cyBhIHRlcm1pbmFsIHRoYXQgaW5kaWNhdGVzIHRoYXQgd2Ugd2lsbCBuZXZlciBnZXQgaGVyZS4g
VXNlcyB0aGUgQ29udHJvbFZhbHVlIGNsYXNzLgorICAgIE9vcHMKK307CisKK30gfSAvLyBuYW1l
c3BhY2UgSlNDOjpCMworCituYW1lc3BhY2UgV1RGIHsKKworY2xhc3MgUHJpbnRTdHJlYW07CisK
K3ZvaWQgcHJpbnRJbnRlcm5hbChQcmludFN0cmVhbSYsIEpTQzo6QjM6Ok9wY29kZSk7CisKK30g
Ly8gbmFtZXNwYWNlIFdURgorCisjZW5kaWYgLy8gQjNPcGNvZGVfaAorCkluZGV4OiBTb3VyY2Uv
SmF2YVNjcmlwdENvcmUvYjMvQjNPcmlnaW4uY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZh
U2NyaXB0Q29yZS9iMy9CM09yaWdpbi5jcHAJKHJldmlzaW9uIDApCisrKyBTb3VyY2UvSmF2YVNj
cmlwdENvcmUvYjMvQjNPcmlnaW4uY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsMzcgQEAK
Ky8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTUgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVk
LgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9y
bXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3Zp
ZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVk
aXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmln
aHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dp
bmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0
IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBv
ZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBk
b2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlz
dHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5D
LiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElO
Q0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBP
RiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9T
RSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IKKyAqIENP
TlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFM
LCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xV
RElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBH
T09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBC
VVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisg
KiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9S
IFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4g
QU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJ
U0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKworI2luY2x1ZGUg
ImNvbmZpZy5oIgorI2luY2x1ZGUgIkIzT3JpZ2luLmgiCisKK25hbWVzcGFjZSBKU0MgeyBuYW1l
c3BhY2UgQjMgeworCit2b2lkIE9yaWdpbjo6ZHVtcChQcmludFN0cmVhbSYgb3V0KSBjb25zdAor
eworICAgIG91dC5wcmludCgiT3JpZ2luKCIsIFJhd1BvaW50ZXIobV9kYXRhKSwgIikiKTsKK30K
KworfSB9IC8vIG5hbWVzcGFjZSBKU0M6OkIzCisKSW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29y
ZS9iMy9CM09yaWdpbi5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9C
M09yaWdpbi5oCShyZXZpc2lvbiAwKQorKysgU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzT3Jp
Z2luLmgJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSw1NSBAQAorLyoKKyAqIENvcHlyaWdodCAo
QykgMjAxNSBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmli
dXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0
CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93
aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291
cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0
aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICog
Mi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92
ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRo
ZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29y
IG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICog
VEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5Z
CisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJ
TUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBB
TkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAg
SU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJM
RSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVN
UExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlU
RUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBM
T1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElP
TikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hF
VEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElO
RyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUg
VVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklM
SVRZIE9GIFNVQ0ggREFNQUdFLiAKKyAqLworCisjaWZuZGVmIEIzT3JpZ2luX2gKKyNkZWZpbmUg
QjNPcmlnaW5faAorCisjaW5jbHVkZSA8d3RmL1ByaW50U3RyZWFtLmg+CisKK25hbWVzcGFjZSBK
U0MgeyBuYW1lc3BhY2UgQjMgeworCisvLyBXaG9ldmVyIGdlbmVyYXRlcyBCM0lSIGNhbiBjaG9v
c2UgdG8gcHV0IG9yaWdpbnMgb24gdmFsdWVzLiBXaGVuIHlvdSBkbyB0aGlzLCBCMyB3aWxsIGJl
IGFibGUgdG8KKy8vIGFjY291bnQsIGRvd24gdG8gdGhlIG1hY2hpbmUgY29kZSwgd2hpY2ggaW5z
dHJ1Y3Rpb24gY29ycmVzcG9uZHMgdG8gd2hpY2ggb3JpZ2luLiBCMworLy8gdHJhbnNmb3JtYXRp
b25zIG11c3QgcHJlc2VydmUgT3JpZ2lucyBjYXJlZnVsbHkuIEl0J3MgYW4gZXJyb3IgdG8gd3Jp
dGUgYSB0cmFuc2Zvcm1hdGlvbiB0aGF0CisvLyBlaXRoZXIgZHJvcHMgT3JpZ2lucyBvciBsaWVz
IGFib3V0IHRoZW0uCitjbGFzcyBPcmlnaW4geworcHVibGljOgorICAgIGV4cGxpY2l0IE9yaWdp
bihjb25zdCB2b2lkKiBkYXRhID0gbnVsbHB0cikKKyAgICAgICAgOiBtX2RhdGEoZGF0YSkKKyAg
ICB7CisgICAgfQorCisgICAgY29uc3Qgdm9pZCogZGF0YSgpIGNvbnN0IHsgcmV0dXJuIG1fZGF0
YTsgfQorCisgICAgdm9pZCBkdW1wKFByaW50U3RyZWFtJikgY29uc3Q7CisgICAgCitwcml2YXRl
OgorICAgIGNvbnN0IHZvaWQqIG1fZGF0YTsKK307CisKK30gfSAvLyBuYW1lc3BhY2UgSlNDOjpC
MworCisjZW5kaWYgLy8gQjNPcmlnaW5faAorCkluZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUv
YjMvQjNQYXRjaHBvaW50VmFsdWUuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0
Q29yZS9iMy9CM1BhdGNocG9pbnRWYWx1ZS5jcHAJKHJldmlzaW9uIDApCisrKyBTb3VyY2UvSmF2
YVNjcmlwdENvcmUvYjMvQjNQYXRjaHBvaW50VmFsdWUuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0w
LDAgKzEsNDYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTUgQXBwbGUgSW5jLiBBbGwgcmln
aHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFu
ZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVy
bWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0
OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBh
Ym92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5k
IHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5h
cnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2Us
IHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4g
dGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQg
d2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQg
QlkgQVBQTEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdB
UlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQg
V0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxB
UgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElO
Qy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNU
LCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERB
TUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0Yg
U1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQ
Uk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBB
TlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBM
SUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0Up
IEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwg
RVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8K
KworI2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgIkIzUGF0Y2hwb2ludFZhbHVlLmgiCisK
KyNpbmNsdWRlIDx3dGYvQ29tbWFQcmludGVyLmg+CisKK25hbWVzcGFjZSBKU0MgeyBuYW1lc3Bh
Y2UgQjMgeworCitQYXRjaHBvaW50VmFsdWU6On5QYXRjaHBvaW50VmFsdWUoKQoreworfQorCit2
b2lkIFBhdGNocG9pbnRWYWx1ZTo6ZHVtcE1ldGEoUHJpbnRTdHJlYW0mIG91dCkgY29uc3QKK3sK
KyAgICBDb21tYVByaW50ZXIgY29tbWE7CisgICAgb3V0LnByaW50KGNvbW1hLCAic3RhY2ttYXAg
PSAiLCBzdGFja21hcCk7CisgICAgaWYgKHNoYWRvdykKKyAgICAgICAgb3V0LnByaW50KGNvbW1h
LCAic2hhZG93ID0gIiwgc2hhZG93KTsKK30KKworfSB9IC8vIG5hbWVzcGFjZSBKU0M6OkIzCisK
SW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM1BhdGNocG9pbnRWYWx1ZS5oCj09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM1BhdGNocG9pbnRWYWx1ZS5oCShy
ZXZpc2lvbiAwKQorKysgU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzUGF0Y2hwb2ludFZhbHVl
LmgJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSw1OCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykg
MjAxNSBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRp
b24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Cisg
KiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5n
IGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNl
IGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlz
IGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4g
UmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBj
b3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBm
b2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90
aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJ
UyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisg
KiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlU
RUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQg
RklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4g
Tk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBG
T1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExB
UlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQg
VE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NT
IE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikg
SE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhF
UiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBO
RUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNF
CisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZ
IE9GIFNVQ0ggREFNQUdFLiAKKyAqLworCisjaWZuZGVmIEIzUGF0Y2hwb2ludFZhbHVlX2gKKyNk
ZWZpbmUgQjNQYXRjaHBvaW50VmFsdWVfaAorCisjaW5jbHVkZSAiQjNWYWx1ZS5oIgorI2luY2x1
ZGUgIkIzU3RhY2ttYXAuaCIKKworbmFtZXNwYWNlIEpTQyB7IG5hbWVzcGFjZSBCMyB7CisKK2Ns
YXNzIFBhdGNocG9pbnRWYWx1ZSA6IHB1YmxpYyBWYWx1ZSB7CitwdWJsaWM6CisgICAgc3RhdGlj
IGJvb2wgYWNjZXB0cyhPcGNvZGUgb3Bjb2RlKSB7IHJldHVybiBvcGNvZGUgPT0gUGF0Y2hwb2lu
dDsgfQorCisgICAgflBhdGNocG9pbnRWYWx1ZSgpOworCisgICAgU3RhY2ttYXAgc3RhY2ttYXA7
CisgICAgdW5zaWduZWQgc2hhZG93IHsgMCB9OworCitwcm90ZWN0ZWQ6CisgICAgdm9pZCBkdW1w
TWV0YShQcmludFN0cmVhbSYpIGNvbnN0IG92ZXJyaWRlOworCitwcml2YXRlOgorICAgIGZyaWVu
ZCBjbGFzcyBQcm9jZWR1cmU7CisKKyAgICBQYXRjaHBvaW50VmFsdWUodW5zaWduZWQgaW5kZXgs
IFR5cGUgdHlwZSwgT3JpZ2luIG9yaWdpbiwgY29uc3QgQWRqYWNlbmN5TGlzdCYgY2hpbGRyZW4p
CisgICAgICAgIDogVmFsdWUoaW5kZXgsIFBhdGNocG9pbnQsIHR5cGUsIG9yaWdpbiwgY2hpbGRy
ZW4pCisgICAgeworICAgIH0KK307CisKK30gfSAvLyBuYW1lc3BhY2UgSlNDOjpCMworCisjZW5k
aWYgLy8gQjNQYXRjaHBvaW50VmFsdWVfaAorCkluZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUv
YjMvQjNQcm9jZWR1cmUuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9i
My9CM1Byb2NlZHVyZS5jcHAJKHJldmlzaW9uIDApCisrKyBTb3VyY2UvSmF2YVNjcmlwdENvcmUv
YjMvQjNQcm9jZWR1cmUuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsNTYgQEAKKy8qCisg
KiBDb3B5cmlnaHQgKEMpIDIwMTUgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoK
KyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdp
dGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRo
YXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmli
dXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAq
ICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlz
Y2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJv
ZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25k
aXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVu
dGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0
aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFT
IElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElO
RywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJD
SEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUg
RElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IKKyAqIENPTlRSSUJV
VE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVD
SUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywg
QlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBP
UiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVT
UyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBM
SUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQK
KyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdB
WSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9G
IFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKworI2luY2x1ZGUgImNvbmZp
Zy5oIgorI2luY2x1ZGUgIkIzUHJvY2VkdXJlLmgiCisKKyNpbmNsdWRlICJCM0Jhc2ljQmxvY2su
aCIKKyNpbmNsdWRlICJCM1ZhbHVlLmgiCisKK25hbWVzcGFjZSBKU0MgeyBuYW1lc3BhY2UgQjMg
eworCitQcm9jZWR1cmU6OlByb2NlZHVyZSgpCit7Cit9CisKK1Byb2NlZHVyZTo6flByb2NlZHVy
ZSgpCit7Cit9CisKK0Jhc2ljQmxvY2sqIFByb2NlZHVyZTo6YWRkQmxvY2soKQoreworICAgIHN0
ZDo6dW5pcXVlX3B0cjxCYXNpY0Jsb2NrPiBibG9jayA9IHN0ZDo6bWFrZV91bmlxdWU8QmFzaWNC
bG9jaz4obV9ibG9ja3Muc2l6ZSgpKTsKKyAgICBCYXNpY0Jsb2NrKiByZXN1bHQgPSBibG9jay5n
ZXQoKTsKKyAgICBtX2Jsb2Nrcy5hcHBlbmQoV1RGOjptb3ZlKGJsb2NrKSk7CisgICAgcmV0dXJu
IHJlc3VsdDsKK30KKwordm9pZCBQcm9jZWR1cmU6OmR1bXAoUHJpbnRTdHJlYW0mIG91dCkgY29u
c3QKK3sKKyAgICBmb3IgKEJhc2ljQmxvY2sqIGJsb2NrIDogKnRoaXMpCisgICAgICAgIG91dC5w
cmludChkZWVwRHVtcChibG9jaykpOworfQorCit9IH0gLy8gbmFtZXNwYWNlIEpTQzo6QjMKSW5k
ZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM1Byb2NlZHVyZS5oCj09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0t
IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM1Byb2NlZHVyZS5oCShyZXZpc2lvbiAwKQorKysg
U291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzUHJvY2VkdXJlLmgJKHdvcmtpbmcgY29weSkKQEAg
LTAsMCArMSwxNzcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTUgQXBwbGUgSW5jLiBBbGwg
cmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNl
IGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUg
cGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUg
bWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRo
ZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMg
YW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBi
aW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3Rp
Y2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIg
aW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlk
ZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklE
RUQgQlkgQVBQTEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVE
IFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJ
RUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElD
VUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExF
IElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElS
RUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFM
IERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQg
T0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisg
KiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBP
TiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklD
VCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJ
U0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FS
RSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisg
Ki8KKworI2lmbmRlZiBCM1Byb2NlZHVyZV9oCisjZGVmaW5lIEIzUHJvY2VkdXJlX2gKKworI2lu
Y2x1ZGUgPHd0Zi9CYWcuaD4KKyNpbmNsdWRlIDx3dGYvRmFzdE1hbGxvYy5oPgorI2luY2x1ZGUg
PHd0Zi9Ob25jb3B5YWJsZS5oPgorI2luY2x1ZGUgPHd0Zi9WZWN0b3IuaD4KKworbmFtZXNwYWNl
IEpTQyB7IG5hbWVzcGFjZSBCMyB7CisKK2NsYXNzIEJhc2ljQmxvY2s7CitjbGFzcyBWYWx1ZTsK
KworY2xhc3MgUHJvY2VkdXJlIHsKKyAgICBXVEZfTUFLRV9OT05DT1BZQUJMRShQcm9jZWR1cmUp
OworICAgIFdURl9NQUtFX0ZBU1RfQUxMT0NBVEVEOworcHVibGljOgorCisgICAgUHJvY2VkdXJl
KCk7CisgICAgflByb2NlZHVyZSgpOworCisgICAgQmFzaWNCbG9jayogYWRkQmxvY2soKTsKKyAg
ICAKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBWYWx1ZVR5cGUsIHR5cGVuYW1lLi4uIEFyZ3VtZW50
cz4KKyAgICBWYWx1ZVR5cGUqIGFkZChBcmd1bWVudHMuLi4pOworCisgICAgdm9pZCBkdW1wKFBy
aW50U3RyZWFtJikgY29uc3Q7CisKKyAgICB1bnNpZ25lZCBzaXplKCkgY29uc3QgeyByZXR1cm4g
bV9ibG9ja3Muc2l6ZSgpOyB9CisgICAgQmFzaWNCbG9jayogYXQodW5zaWduZWQgaW5kZXgpIGNv
bnN0IHsgcmV0dXJuIG1fYmxvY2tzW2luZGV4XTsgfQorICAgIEJhc2ljQmxvY2sqIG9wZXJhdG9y
W10odW5zaWduZWQgaW5kZXgpIGNvbnN0IHsgcmV0dXJuIGF0KGluZGV4KTsgfQorCisgICAgY2xh
c3MgaXRlcmF0b3IgeworICAgIHB1YmxpYzoKKyAgICAgICAgaXRlcmF0b3IoKToKKyAgICAgICAg
ICAgIDogbV9wcm9jZWR1cmUobnVsbHB0cikKKyAgICAgICAgICAgICwgbV9pbmRleCgwKQorICAg
ICAgICB7CisgICAgICAgIH0KKworICAgICAgICBpdGVyYXRvcihQcm9jZWR1cmUmIHByb2NlZHVy
ZSwgdW5zaWduZWQgaW5kZXgpCisgICAgICAgICAgICA6IG1fcHJvY2VkdXJlKCZwcm9jZWR1cmUp
CisgICAgICAgICAgICAsIG1faW5kZXgoaW5kZXgpCisgICAgICAgIHsKKyAgICAgICAgfQorCisg
ICAgICAgIEJhc2ljQmxvY2sqIG9wZXJhdG9yKigpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJl
dHVybiBtX3Byb2NlZHVyZS0+YXQobV9pbmRleCk7CisgICAgICAgIH0KKworICAgICAgICBpdGVy
YXRvciYgb3BlcmF0b3IrKygpCisgICAgICAgIHsKKyAgICAgICAgICAgIG1faW5kZXggPSBmaW5k
TmV4dChtX2luZGV4ICsgMSk7CisgICAgICAgICAgICByZXR1cm4gKnRoaXM7CisgICAgICAgIH0K
KworICAgICAgICBib29sIG9wZXJhdG9yPT0oY29uc3QgaXRlcmF0b3ImIG90aGVyKSBjb25zdAor
ICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gbV9pbmRleCA9PSBvdGhlci5tX2luZGV4Owor
ICAgICAgICB9CisKKyAgICAgICAgYm9vbCBvcGVyYXRvciE9KGNvbnN0IGl0ZXJhdG9yJiBvdGhl
cikgY29uc3QKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuICEoKnRoaXMgPT0gb3RoZXIp
OworICAgICAgICB9CisKKyAgICBwcml2YXRlOgorICAgICAgICB1bnNpZ25lZCBmaW5kTmV4dCh1
bnNpZ25lZCBpbmRleCkKKyAgICAgICAgeworICAgICAgICAgICAgd2hpbGUgKGluZGV4IDwgbV9w
cm9jZWR1cmUtPnNpemUoKSAmJiAhbV9wcm9jZWR1cmUtPmF0KGluZGV4KSkKKyAgICAgICAgICAg
ICAgICBpbmRleCsrOworICAgICAgICAgICAgcmV0dXJuIGluZXg7CisgICAgICAgIH0KKworICAg
ICAgICBQcm9jZWR1cmUqIG1fcHJvY2VkdXJlOworICAgICAgICB1bnNpZ25lZCBtX2luZGV4Owor
ICAgIH07CisKKyAgICBpdGVyYXRvciBiZWdpbigpIGNvbnN0IHsgcmV0dXJuIGl0ZXJhdG9yKCp0
aGlzLCAwKTsgfQorICAgIGl0ZXJhdG9yIGVuZCgpIGNvbnN0IHsgcmV0dXJuIGl0ZXJhdG9yKCp0
aGlzLCBudW1CbG9ja3MoKSk7IH0KKworICAgIGNsYXNzIFZhbHVlc0NvbGxlY3Rpb24geworICAg
IHB1YmxpYzoKKyAgICAgICAgVmFsdWVzQ29sbGVjdGlvbihQcm9jZWR1cmUmIHByb2NlZHVyZSkK
KyAgICAgICAgICAgIDogbV9wcm9jZWR1cmUocHJvY2VkdXJlKQorICAgICAgICB7CisgICAgICAg
IH0KKworICAgICAgICBjbGFzcyBpdGVyYXRvciB7CisgICAgICAgIHB1YmxpYzoKKyAgICAgICAg
ICAgIGl0ZXJhdG9yKCk6CisgICAgICAgICAgICAgICAgOiBtX3Byb2NlZHVyZShudWxscHRyKQor
ICAgICAgICAgICAgICAgICwgbV9pbmRleCgwKQorICAgICAgICAgICAgeworICAgICAgICAgICAg
fQorCisgICAgICAgICAgICBpdGVyYXRvcihQcm9jZWR1cmUmIHByb2NlZHVyZSwgdW5zaWduZWQg
aW5kZXgpCisgICAgICAgICAgICAgICAgOiBtX3Byb2NlZHVyZSgmcHJvY2VkdXJlKQorICAgICAg
ICAgICAgICAgICwgbV9pbmRleChpbmRleCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0K
KworICAgICAgICAgICAgVmFsdWUqIG9wZXJhdG9yKigpCisgICAgICAgICAgICB7CisgICAgICAg
ICAgICAgICAgcmV0dXJuIG1fcHJvY2VkdXJlLT5ibG9jayhtX2luZGV4KTsKKyAgICAgICAgICAg
IH0KKworICAgICAgICAgICAgaXRlcmF0b3ImIG9wZXJhdG9yKysoKQorICAgICAgICAgICAgewor
ICAgICAgICAgICAgICAgIG1faW5kZXgrKzsKKyAgICAgICAgICAgICAgICByZXR1cm4gKnRoaXM7
CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGJvb2wgb3BlcmF0b3I9PShjb25zdCBpdGVy
YXRvciYgb3RoZXIpIGNvbnN0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJu
IG1faW5kZXggPT0gb3RoZXIubV9pbmRleDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAg
Ym9vbCBvcGVyYXRvciE9KGNvbnN0IGl0ZXJhdG9yJiBvdGhlcikgY29uc3QKKyAgICAgICAgICAg
IHsKKyAgICAgICAgICAgICAgICByZXR1cm4gISgqdGhpcyA9PSBvdGhlcik7CisgICAgICAgICAg
ICB9CisKKyAgICAgICAgcHJpdmF0ZToKKworICAgICAgICAgICAgUHJvY2VkdXJlKiBtX3Byb2Nl
ZHVyZTsKKyAgICAgICAgICAgIHVuc2lnbmVkIG1faW5kZXg7CisgICAgICAgIH07CisKKyAgICAg
ICAgaXRlcmF0b3IgYmVnaW4oKSBjb25zdCB7IHJldHVybiBpdGVyYXRvcihtX3Byb2NlZHVyZSwg
MCk7IH0KKyAgICAgICAgaXRlcmF0b3IgZW5kKCkgY29uc3QgeyByZXR1cm4gaXRlcmF0b3IobV9w
cm9jZWR1cmUsIG1fcHJvY2VkdXJlLm1fdmFsdWVzLnNpemUoKSk7IH0KKworICAgICAgICB1bnNp
Z25lZCBzaXplKCkgY29uc3QgeyByZXR1cm4gbV9wcm9jZWR1cmUubV92YWx1ZXMuc2l6ZSgpOyB9
CisgICAgICAgIFZhbHVlKiBhdCh1bnNpZ25lZCBpbmRleCkgY29uc3QgeyByZXR1cm4gbV9wcm9j
ZWR1cmUubV92YWx1ZXNbaW5kZXhdOyB9CisgICAgICAgIFZhbHVlKiBvcGVyYXRvcltdKHVuc2ln
bmVkIGluZGV4KSBjb25zdCB7IHJldHVybiBhdChpbmRleCk7IH0KKyAgICAgICAgCisgICAgcHJp
dmF0ZToKKyAgICAgICAgUHJvY2VkdXJlJiBtX3Byb2NlZHVyZTsKKyAgICB9OworCisgICAgVmFs
dWVzQ29sbGVjdGlvbiB2YWx1ZXMoKSB7IHJldHVybiBWYWx1ZXNDb2xsZWN0aW9uKCp0aGlzKTsg
fQorCitwcml2YXRlOgorICAgIFZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QmFzaWNCbG9jaz4+IG1f
YmxvY2tzOworICAgIFZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8VmFsdWU+PiBtX3ZhbHVlczsKK307
CisKK30gfSAvLyBuYW1lc3BhY2UgSlNDOjpCMworCisjZW5kaWYgLy8gQjNQcm9jZWR1cmVfaAor
CkluZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNQcm9jZWR1cmVJbmxpbmVzLmgKPT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzUHJvY2VkdXJlSW5saW5lcy5o
CShyZXZpc2lvbiAwKQorKysgU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzUHJvY2VkdXJlSW5s
aW5lcy5oCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsNDYgQEAKKy8qCisgKiBDb3B5cmlnaHQg
KEMpIDIwMTUgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJp
YnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91
dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxv
d2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNv
dXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwg
dGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAq
IDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJv
dmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0
aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9v
ciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAq
IFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFTIElTJycgQU5EIEFO
WQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBM
SU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkg
QU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4g
IElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFC
TEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhF
TVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1J
VEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsg
TE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJ
T04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdI
RVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJ
TkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhF
IFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJ
TElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKworI2lmbmRlZiBCM1Byb2NlZHVyZUlubGluZXNf
aAorI2RlZmluZSBCM1Byb2NlZHVyZUlubGluZXNfaAorCisjaW5jbHVkZSAiQjNCYXNpY0Jsb2Nr
LmgiCisjaW5jbHVkZSAiQjNQcm9jZWR1cmUuaCIKKworbmFtZXNwYWNlIEpTQyB7IG5hbWVzcGFj
ZSBCMyB7CisKK3RlbXBsYXRlPHR5cGVuYW1lIFZhbHVlVHlwZSwgdHlwZW5hbWUuLi4gQXJndW1l
bnRzPgorVmFsdWVUeXBlKiBQcm9jZWR1cmU6OmFkZChBcmd1ZW50cy4uLiBhcmd1bWVudHMpCit7
CisgICAgc3RkOjp1bmlxdWVfcHRyPFZhbHVlVHlwZT4gdmFsdWUobmV3IFZhbHVlVHlwZShtX3Zh
bHVlcy5zaXplKCksIGFyZ3VtZW50cy4uLikpOworICAgIFZhbHVlVHlwZSogcmVzdWx0ID0gdmFs
dWUuZ2V0KCk7CisgICAgbV92YWx1ZXMuYXBwZW5kKFdURjo6bW92ZSh2YWx1ZSkpOworICAgIHJl
dHVybiByZXN1bHQ7Cit9CisKK30gfSAvLyBuYW1lc3BhY2UgSlNDOjpCMworCisjZW5kaWYgLy8g
QjNQcm9jZWR1cmVJbmxpbmVzX2gKKwpJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0Iz
U3RhY2tTbG90VmFsdWUuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9i
My9CM1N0YWNrU2xvdFZhbHVlLmNwcAkocmV2aXNpb24gMCkKKysrIFNvdXJjZS9KYXZhU2NyaXB0
Q29yZS9iMy9CM1N0YWNrU2xvdFZhbHVlLmNwcAkod29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDQx
IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE1IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNl
cnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5
IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBw
cm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEu
IFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29w
eXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9s
bG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0g
bXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxp
c3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICog
ICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhl
IGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExF
IElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVT
LCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJ
RVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBV
UlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SCisg
KiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURF
TlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJ
TkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRV
VEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsg
T1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9S
WQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZ
LCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5H
IElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYg
QURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisKKyNpbmNs
dWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJCM1N0YWNrU2xvdFZhbHVlLmgiCisKK25hbWVzcGFj
ZSBKU0MgeyBuYW1lc3BhY2UgQjMgeworCitTdGFja1Nsb3RWYWx1ZTo6flN0YWNrU2xvdFZhbHVl
KCkKK3sKK30KKwordm9pZCBTdGFja1Nsb3RWYWx1ZTo6ZHVtcE1ldGEoUHJpbnRTdHJlYW0mIG91
dCkgY29uc3QKK3sKKyAgICBvdXQucHJpbnQoImJ5dGVTaXplID0gIiwgbV9ieXRlU2l6ZSk7Cit9
CisKK30gfSAvLyBuYW1lc3BhY2UgSlNDOjpCMworCkluZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENv
cmUvYjMvQjNTdGFja1Nsb3RWYWx1ZS5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0
Q29yZS9iMy9CM1N0YWNrU2xvdFZhbHVlLmgJKHJldmlzaW9uIDApCisrKyBTb3VyY2UvSmF2YVNj
cmlwdENvcmUvYjMvQjNTdGFja1Nsb3RWYWx1ZS5oCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEs
NjUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTUgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJl
c2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5h
cnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVk
IHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICog
MS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBj
b3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBm
b2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9y
bSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMg
bGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisg
KiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0
aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQ
TEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJ
RVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFO
VElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICog
UFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IK
KyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJ
REVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMg
KElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJ
VFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRT
OyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhF
T1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJ
VFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJ
TkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJ
RiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKworI2lm
bmRlZiBCM1N0YWNrU2xvdFZhbHVlX2gKKyNkZWZpbmUgQjNTdGFja1Nsb3RWYWx1ZV9oCisKKyNp
bmNsdWRlICJCM1ZhbHVlLmgiCisKK25hbWVzcGFjZSBKU0MgeyBuYW1lc3BhY2UgQjMgeworCitj
bGFzcyBTdGFja1Nsb3RWYWx1ZSA6IHB1YmxpYyBWYWx1ZSB7CitwdWJsaWM6CisgICAgc3RhdGlj
IGJvb2wgYWNjZXB0cyhPcGNvZGUgb3Bjb2RlKSB7IHJldHVybiBvcGNvZGUgPT0gU3RhY2tTbG90
OyB9CisKKyAgICB+U3RhY2tTbG90VmFsdWUoKTsKKworICAgIHVuc2lnbmVkIGJ5dGVTaXplKCkg
Y29uc3QgeyByZXR1cm4gbV9ieXRlU2l6ZTsgfQorCisgICAgLy8gVGhpcyBnZXRzIGFzc2lnbmVk
IGF0IHRoZSBlbmQgb2YgY29tcGlsYXRpb24uIFlvdSBjYW5ub3QgcmVseSBvbiBpdCBoYXZpbmcg
YSBtZWFuaW5nZnVsCisgICAgLy8gdmFsdWUgd2hpbGUgdGhlIGNvbXBpbGVyIGlzIHJ1bm5pbmcu
CisgICAgaW50cHRyX3Qgb2Zmc2V0RnJvbUZQKCkgY29uc3QgeyByZXR1cm4gbV9vZmZzZXRGcm9t
RlA7IH0KKworcHJvdGVjdGVkOgorICAgIHZvaWQgZHVtcE1ldGEoUHJpbnRTdHJlYW0mKSBjb25z
dCBvdmVycmlkZTsKKworcHJpdmF0ZToKKyAgICBmcmllbmQgY2xhc3MgUHJvY2VkdXJlOworCisg
ICAgU3RhY2tTbG90VmFsdWUodW5zaWduZWQgaW5kZXgsIE9yaWdpbiBvcmlnaW4sIHVuc2lnbmVk
IGJ5dGVTaXplKQorICAgICAgICA6IFZhbHVlKGluZGV4LCBTdGFja1Nsb3QsIHBvaW50ZXIoKSwg
b3JpZ2luKQorICAgICAgICAsIG1fYnl0ZVNpemUoYnl0ZVNpemUpCisgICAgICAgICwgbV9vZmZz
ZXRGcm9tRlAoMCkKKyAgICB7CisgICAgfQorCisgICAgdW5zaWduZWQgbV9ieXRlU2l6ZTsKKyAg
ICBpbnRwdHJfdCBtX29mZnNldEZyb21GUDsKK307CisKK30gfSAvLyBuYW1lc3BhY2UgSlNDOjpC
MworCisjZW5kaWYgLy8gQjNTdGFja1Nsb3RWYWx1ZV9oCisKSW5kZXg6IFNvdXJjZS9KYXZhU2Ny
aXB0Q29yZS9iMy9CM1N0YWNrbWFwLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlw
dENvcmUvYjMvQjNTdGFja21hcC5jcHAJKHJldmlzaW9uIDApCisrKyBTb3VyY2UvSmF2YVNjcmlw
dENvcmUvYjMvQjNTdGFja21hcC5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSw0MCBAQAor
LyoKKyAqIENvcHlyaWdodCAoQykgMjAxNSBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQu
CisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jt
cywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlk
ZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRp
c3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdo
dAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2lu
ZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3Qg
cmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9m
IGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRv
Y3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0
cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMu
IGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5D
TFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9G
IE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NF
IEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUgorICogQ09O
VFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUws
IFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVE
SU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdP
T0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJV
U0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAq
IE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1Ig
VE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBB
TlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklT
RUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLiAKKyAqLworCisjaW5jbHVkZSAi
Y29uZmlnLmgiCisjaW5jbHVkZSAiQjNTdGFja21hcC5oIgorCituYW1lc3BhY2UgSlNDIHsgbmFt
ZXNwYWNlIEIzIHsKKwordm9pZCBTdGFja21hcDo6ZHVtcChQcmludFN0cmVhbSYgb3V0KSBjb25z
dAoreworICAgIG91dC5wcmludCgKKyAgICAgICAgIntvcGFxdWUgPSAiLCBSYXdQb2ludGVyKG1f
b3BhcXVlKSwgIiwgcmVwcyA9ICIsIGxpc3REdW1wKG1fcmVwcyksCisgICAgICAgICIsIGdlbmVy
YXRvciA9ICIsIFJhd1BvaW50ZXIobV9nZW5lcmF0b3IuZ2V0KCkpLCAiLCBjbG9iYmVyZWQgPSAi
LCBtX2Nsb2JiZXJlZCwKKyAgICAgICAgIiwgdXNlZFJlZ2lzdGVycyA9ICIsIG1fdXNlZFJlZ2lz
dGVycywgIn0iKTsKK30KKworfSB9IC8vIG5hbWVzcGFjZSBKU0M6OkIzCisKSW5kZXg6IFNvdXJj
ZS9KYXZhU2NyaXB0Q29yZS9iMy9CM1N0YWNrbWFwLmgKPT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL0ph
dmFTY3JpcHRDb3JlL2IzL0IzU3RhY2ttYXAuaAkocmV2aXNpb24gMCkKKysrIFNvdXJjZS9KYXZh
U2NyaXB0Q29yZS9iMy9CM1N0YWNrbWFwLmgJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSwxMjIg
QEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTUgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2Vy
dmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkg
Zm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHBy
b3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4g
UmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5
cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xs
b3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBt
dXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlz
dCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAg
ICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUg
ZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUg
SU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMs
IElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElF
UyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVS
UE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IKKyAq
IENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVO
VEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElO
Q0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVU
RSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBP
UiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZ
CisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFks
IE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcg
SU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBB
RFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKworI2lmbmRl
ZiBCM1N0YWNrbWFwX2gKKyNkZWZpbmUgQjNTdGFja21hcF9oCisKKyNpbmNsdWRlICJCM1ZhbHVl
UmVwLmgiCisjaW5jbHVkZSAiQ0NhbGxIZWxwZXJzLmgiCisjaW5jbHVkZSAiUmVnaXN0ZXJTZXQu
aCIKKyNpbmNsdWRlIDx3dGYvU2hhcmVkVGFzay5oPgorCituYW1lc3BhY2UgSlNDIHsgbmFtZXNw
YWNlIEIzIHsKKworY2xhc3MgQjNWYWx1ZTsKKworY2xhc3MgU3RhY2ttYXAgeworcHVibGljOgor
ICAgIHN0cnVjdCBHZW5lcmF0aW9uUGFyYW1zIHsKKyAgICAgICAgLy8gVGhpcyBpcyB0aGUgVmFs
dWUgY29udGFpbmluZyB0aGUgc3RhY2ttYXAuCisgICAgICAgIFZhbHVlKiB2YWx1ZTsKKworICAg
ICAgICAvLyBUaGlzIGlzIHRoZSBzdGFja21hcC4KKyAgICAgICAgU3RhY2ttYXAqIHN0YWNrbWFw
OworCisgICAgICAgIC8vIFRoaXMgaXMgdGhlIGp1bXAgdG8gdGhlIHNsb3cgcGF0aCwgaWYgdGhp
cyBpcyBhIHN0YWNrbWFwIGZvciBhIENoZWNrIHZhbHVlLgorICAgICAgICBDQ2FsbEhlbHBlcnM6
Okp1bXAganVtcDsKKyAgICB9OworICAgIAorICAgIHR5cGVkZWYgdm9pZCBHZW5lcmF0b3JGdW5j
dGlvbihDQ2FsbEhlbHBlcnMmLCBjb25zdCBHZW5lcmF0aW9uUGFyYW1zJik7CisgICAgdHlwZWRl
ZiBTaGFyZWRUYXNrPEdlbmVyYXRvckZ1bmN0aW9uPiBHZW5lcmF0b3I7CisgICAgCisgICAgU3Rh
Y2ttYXAoKQorICAgIHsKKyAgICB9CisKKyAgICAvLyBTZXQgc29tZSBvcGFxdWUgZGF0YSB0byBp
ZGVudGlmeSB0aGlzIHN0YWNrbWFwLiBUaGlzIGlzIHVzZWZ1bCBiZWNhdXNlIGEgU3RhY2ttYXAt
dXNpbmcgVmFsdWUKKyAgICAvLyBjYW4gYmUgZHVwbGljYXRlZCwgYW5kIGVhY2ggZHVwbGljYXRl
IG1heSBlbmQgdXAgaGF2aW5nIGRpZmZlcmVudCByZWdpc3RlciBhbGxvY2F0aW9uLiBUaGlzCisg
ICAgLy8gYWxsb3dzIGFsbCBvZiB0aG9zZSBkdXBsaWNhdGVzIHRvIGJlIGFibGUgdG8gcmVmZXIg
YmFjayB0byB3aGF0ZXZlciBoaWdoLWxldmVsIGRhdGEgc3RydWN0dXJlcworICAgIC8vIHdlIHdl
cmUgdXNpbmcgdG8gY3JlYXRlIHRoZSB2YWx1ZS4KKyAgICB2b2lkIHNldE9wYXF1ZSh2b2lkKiBw
YXJhbWV0ZXIpCisgICAgeworICAgICAgICBtX29wYXF1ZSA9IHBhcmFtZXRlcjsKKyAgICB9Cisg
ICAgdm9pZCogb3BhcXVlKCkgY29uc3QgeyByZXR1cm4gbV9vcGFxdWU7IH0KKworICAgIC8vIENv
bnZlbmllbmNlIGhlbHBlcnMgd2hlbiB1c2luZyBpbmRpY2VzIGluc3RlYWQgb2YgcG9pbnRlcnMu
CisgICAgdm9pZCBzZXRPcGFxdWVJbmRleChzaXplX3QgaW5kZXgpCisgICAgeworICAgICAgICBz
ZXRPcGFxdWUoYml0d2lzZV9jYXN0PHZvaWQqPihpbmRleCkpOworICAgIH0KKyAgICBzaXplX3Qg
b3BhcXVlSW5kZXgoKSBjb25zdCB7IHJldHVybiBiaXR3aXNlX2Nhc3Q8c2l6ZV90PihvcGFxdWUo
KSk7IH0KKworICAgIC8vIENvbnN0cmFpbiBhbiBhcmd1bWVudCB0byB0aGUgVmFsdWUgdGhhdCB1
c2VzIHRoaXMgU3RhY2ttYXAuIE5vdGUgdGhhdCBpbmRleCB6ZXJvIHJlZmVycyB0byB0aGUKKyAg
ICAvLyBmaXJzdCBhcmd1bWVudCB0byB0aGF0IFZhbHVlLCBldmVuIGlmIHRoYXQgYXJndW1lbnQg
aXMgbm90IGNvbnN0cmFpbmFibGUuIEZvciBleGFtcGxlLCBpbiBhCisgICAgLy8gQ2hlY2tBZGQg
dmFsdWUsIGl0IHdvdWxkIGJlIGFuIGVycm9yIHRvIGNvbnN0cmFpbiBpbmRpY2VzIDAgYW5kIDEu
IEluIGEgQ2hlY2sgdmFsdWUsIGl0IHdvdWxkCisgICAgLy8gYmUgYW4gZXJyb3IgdG8gY29uc3Ry
YWluIGluZGV4IDAuIEJ1dCwgd2hlbiB0aGUgZ2VuZXJhdGlvbiBjYWxsYmFjayBpcyBjYWxsZWQs
IHlvdSBjYW4gZGVwZW5kCisgICAgLy8gb24gdGhlIHJlcHMgZm9yIHRob3NlIGluZGljZXMgYmVp
bmcgZmlsbGVkIGluLgorICAgIHZvaWQgY29uc3RyYWluKHVuc2lnbmVkIGluZGV4LCBjb25zdCBW
YWx1ZVJlcCYgcmVwKQorICAgIHsKKyAgICAgICAgaWYgKGluZGV4ICsgMSA8IG1fcmVwcy5zaXpl
KCkpCisgICAgICAgICAgICBtX3JlcHMuZ3JvdyhpbmRleCArIDEpOworICAgICAgICBtX3JlcHNb
aW5kZXhdID0gcmVwOworICAgIH0KKworICAgIHZvaWQgY2xvYmJlcihjb25zdCBSZWdpc3RlclNl
dCYgc2V0KQorICAgIHsKKyAgICAgICAgbV9jbG9iYmVyZWQubWVyZ2Uoc2V0KTsKKyAgICB9CisK
KyAgICBjb25zdCBSZWdpc3RlclNldCYgY2xvYmJlcmVkKCkgY29uc3QgeyByZXR1cm4gbV9jbG9i
YmVyZWQ7IH0KKworICAgIHZvaWQgc2V0R2VuZXJhdG9yKFJlZlB0cjxHZW5lcmF0b3I+IGdlbmVy
YXRvcikKKyAgICB7CisgICAgICAgIG1fZ2VuZXJhdG9yID0gZ2VuZXJhdG9yOworICAgIH0KKwor
ICAgIHRlbXBsYXRlPHR5cGVuYW1lIEZ1bmN0b3I+CisgICAgdm9pZCBzZXRHZW5lcmF0b3IoY29u
c3QgRnVuY3RvciYgZnVuY3RvcikKKyAgICB7CisgICAgICAgIG1fZ2VuZXJhdG9yID0gY3JlYXRl
U2hhcmVkVGFzazxHZW5lcmF0b3JGdW5jdGlvbj4oZnVuY3Rvcik7CisgICAgfQorCisgICAgLy8g
VGhlc2Ugd2lsbCByZXR1cm4gaW50ZXJlc3RpbmcgdGhpbmdzIGluc2lkZSB0aGUgZ2VuZXJhdG9y
IGNhbGxiYWNrLCBvciBhZnRlciBjb21waWxhdGlvbi4KKyAgICBjb25zdCBWZWN0b3I8VmFsdWVS
ZXA+JiByZXBzKCkgY29uc3QgeyByZXR1cm4gbV9yZXBzOyB9CisgICAgY29uc3QgUmVnaXN0ZXJT
ZXQmIHVzZWRSZWdpc3RlcnMoKSBjb25zdCB7IHJldHVybiBtX3VzZWRSZWdpc3RlcnM7IH0KKwor
ICAgIHZvaWQgZHVtcChQcmludFN0cmVhbSYpIGNvbnN0OworICAgIAorcHJpdmF0ZToKKyAgICB2
b2lkKiBtX29wYXF1ZSB7IG51bGxwdHIgfTsKKyAgICBWZWN0b3I8VmFsdWVSZXA+IG1fcmVwczsK
KyAgICBSZWZQdHI8R2VuZXJhdG9yPiBtX2dlbmVyYXRvcjsKKyAgICBSZWdpc3RlclNldCBtX2Ns
b2JiZXJlZDsKKyAgICBSZWdpc3RlclNldCBtX3VzZWRSZWdpc3RlcnM7Cit9OworCit9IH0gLy8g
bmFtZXNwYWNlIEpTQzo6QjMKKworI2VuZGlmIC8vIEIzU3RhY2ttYXBfaAorCkluZGV4OiBTb3Vy
Y2UvSmF2YVNjcmlwdENvcmUvYjMvQjNTd2l0Y2hDYXNlLmNwcAo9PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3Vy
Y2UvSmF2YVNjcmlwdENvcmUvYjMvQjNTd2l0Y2hDYXNlLmNwcAkocmV2aXNpb24gMCkKKysrIFNv
dXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM1N3aXRjaENhc2UuY3BwCSh3b3JraW5nIGNvcHkpCkBA
IC0wLDAgKzEsMzkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTUgQXBwbGUgSW5jLiBBbGwg
cmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNl
IGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUg
cGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUg
bWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRo
ZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMg
YW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBi
aW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3Rp
Y2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIg
aW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlk
ZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklE
RUQgQlkgQVBQTEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVE
IFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJ
RUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElD
VUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExF
IElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElS
RUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFM
IERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQg
T0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisg
KiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBP
TiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklD
VCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJ
U0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FS
RSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisg
Ki8KKworI2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgIkIzU3dpdGNoQ2FzZS5oIgorCisj
aW5jbHVkZSAiQjNCYXNpY0Jsb2NrLmgiCisKK25hbWVzcGFjZSBKU0MgeyBuYW1lc3BhY2UgQjMg
eworCit2b2lkIFN3aXRjaENhc2U6OmR1bXAoUHJpbnRTdHJlYW0mIG91dCkgY29uc3QKK3sKKyAg
ICBvdXQucHJpbnQobV9jYXNlVmFsdWUsICItPiIsIHBvaW50ZXJEdW1wKG1fdGFyZ2V0KSk7Cit9
CisKK30gfSAvLyBuYW1lc3BhY2UgSlNDOjpCMworCkluZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENv
cmUvYjMvQjNTd2l0Y2hDYXNlLmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRDb3Jl
L2IzL0IzU3dpdGNoQ2FzZS5oCShyZXZpc2lvbiAwKQorKysgU291cmNlL0phdmFTY3JpcHRDb3Jl
L2IzL0IzU3dpdGNoQ2FzZS5oCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsNjMgQEAKKy8qCisg
KiBDb3B5cmlnaHQgKEMpIDIwMTUgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoK
KyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdp
dGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRo
YXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmli
dXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAq
ICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlz
Y2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJv
ZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25k
aXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVu
dGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0
aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFT
IElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElO
RywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJD
SEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUg
RElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IKKyAqIENPTlRSSUJV
VE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVD
SUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywg
QlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBP
UiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVT
UyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBM
SUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQK
KyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdB
WSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9G
IFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKworI2lmbmRlZiBCM1N3aXRj
aENhc2VfaAorI2RlZmluZSBCM1N3aXRjaENhc2VfaAorCisjaW5jbHVkZSA8d3RmL1N0ZExpYkV4
dHJhcy5oPgorI2luY2x1ZGUgPHd0Zi9QcmludFN0cmVhbS5oPgorCituYW1lc3BhY2UgSlNDIHsg
bmFtZXNwYWNlIEIzIHsKKworY2xhc3MgQmFzaWNCbG9jazsKKworY2xhc3MgU3dpdGNoQ2FzZSB7
CitwdWJsaWM6CisgICAgU3dpdGNoQ2FzZSgpCisgICAgeworICAgIH0KKworICAgIFN3aXRjaENh
c2UoaW50NjRfdCBjYXNlVmFsdWUsIEJhc2ljQmxvY2sqIHRhcmdldCkKKyAgICAgICAgOiBtX2Nh
c2VWYWx1ZShjYXNlVmFsdWUpCisgICAgICAgICwgbV90YXJnZXQodGFyZ2V0KQorICAgIHsKKyAg
ICB9CisKKyAgICBleHBsaWNpdCBvcGVyYXRvciBib29sKCkgY29uc3QgeyByZXR1cm4gISFtX3Rh
cmdldDsgfQorCisgICAgaW50NjRfdCBjYXNlVmFsdWUoKSBjb25zdCB7IHJldHVybiBtX2Nhc2VW
YWx1ZTsgfQorICAgIEJhc2ljQmxvY2sqIHRhcmdldCgpIGNvbnN0IHsgcmV0dXJuIG1fdGFyZ2V0
OyB9CisKKyAgICB2b2lkIGR1bXAoUHJpbnRTdHJlYW0mIG91dCkgY29uc3Q7CisKK3ByaXZhdGU6
CisgICAgaW50NjRfdCBjYXNlVmFsdWU7CisgICAgQmFzaWNCbG9jayogdGFyZ2V0OworfTsKKwor
fSB9IC8vIG5hbWVzcGFjZSBKU0M6OkIzCisKKyNlbmRpZiAvLyBCM1N3aXRjaENhc2VfaAorCklu
ZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNTd2l0Y2hWYWx1ZS5jcHAKPT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PQotLS0gU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzU3dpdGNoVmFsdWUuY3BwCShyZXZpc2lv
biAwKQorKysgU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzU3dpdGNoVmFsdWUuY3BwCSh3b3Jr
aW5nIGNvcHkpCkBAIC0wLDAgKzEsNjMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTUgQXBw
bGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1
c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZp
Y2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRp
b25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11
c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9m
IGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJp
YnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0
CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5n
IGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRl
cmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdB
UkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVT
UyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBU
SEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1Mg
Rk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5U
IFNIQUxMIEFQUExFIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBE
SVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBD
T05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICog
UFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0Us
IERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIg
Q0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09O
VFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5D
RSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0Yg
VEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNI
IERBTUFHRS4gCisgKi8KKworI2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2xkdWUgIkIzU3dpdGNo
VmFsdWUuaCIKKworbmFtZXNwYWNlIEpTQyB7IG5hbWVzcGFjZSBCMyB7CisKK1N3aXRjaFZhbHVl
Ojp+U3dpdGNoVmFsdWUoKQoreworfQorCitTd2l0Y2hDYXNlIFN3aXRjaFZhbHVlOjpyZW1vdmVD
YXNlKHVuc2lnbmVkIGluZGV4KQoreworICAgIFN3aXRjaENhc2UgcmVzdWx0ID0gbV9zdWNjZXNz
b3JzW2luZGV4XTsKKyAgICBtX3N1Y2Nlc3NvcnNbaW5kZXhdID0gbV9zdWNjZXNzb3JzLmxhc3Qo
KTsKKyAgICBtX3N1Y2Nlc3NvcnMucmVtb3ZlTGFzdCgpOworICAgIHJldHVybiByZXN1bHQ7Cit9
CisKK3ZvaWQgU3dpdGNoVmFsdWU6OmFwcGVuZENhc2UoY29uc3QgU3dpdGNoQ2FzZSYgc3dpdGNo
Q2FzZSkKK3sKKyAgICBtX3N1Y2Nlc3NvcnMuYXBwZW5kKG1fc3VjY2Vzc29ycy5sYXN0KCkpOwor
ICAgIG1fc3VjY2Vzc29yc1ttX3N1Y2Nlc3NvcnMuc2l6ZSgpIC0gMl0gPSBzd2l0Y2hDYXNlLnRh
cmdldCgpOworICAgIG1fdmFsdWVzLmFwcGVuZChzd2l0Y2hDYXNlLmNhc2VWYWx1ZSgpKTsKK30K
Kwordm9pZCBTd2l0Y2hWYWx1ZTo6ZHVtcE1ldGEoUHJpbnRTdHJlYW0mIG91dCkgY29uc3QKK3sK
KyAgICAvLyBUaGlzIGRlc3RydWN0aXZlbHkgb3ZlcnJpZGVzIENvbnRyb2xWYWx1ZSdzIGR1bXBN
ZXRhKCkuCisgICAgb3V0LnByaW50KGxpc3REdW1wKCp0aGlzKSk7Cit9CisKK1N3aXRjaFZhbHVl
OjpTd2l0Y2hWYWx1ZSh1bnNpZ25lZCBpbmRleCwgT3JpZ2luIG9yaWdpbiwgQmFzaWNCbG9jayog
ZmFsbFRocm91Z2gpCisgICAgOiBDb250cm9sVmFsdWUoaW5kZXgsIFN3aXRjaCwgb3JpZ2luKQor
eworICAgIG1fc3VjY2Vzc29ycy5hcHBlbmQoZmFsbFRocm91Z2gpOworfQorCit9IH0gLy8gbmFt
ZXNwYWNlIEpTQzo6QjMKKwpJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzU3dpdGNo
VmFsdWUuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNTd2l0Y2hW
YWx1ZS5oCShyZXZpc2lvbiAwKQorKysgU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzU3dpdGNo
VmFsdWUuaAkod29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDEyMyBAQAorLyoKKyAqIENvcHlyaWdo
dCAoQykgMjAxNSBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0
cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRo
b3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9s
bG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Yg
c291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNl
LCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgor
ICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBh
Ym92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5k
IHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5k
L29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgor
ICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIGBgQVMgSVMnJyBBTkQg
QU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9U
IExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElU
WSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVE
LiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJ
QUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBF
WEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJ
TUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VT
OyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQ
VElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwg
V0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xV
RElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBU
SEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJ
QklMSVRZIE9GIFNVQ0ggREFNQUdFLiAKKyAqLworCisjaWZuZGVmIEIzU3dpdGNoVmFsdWVfaAor
I2RlZmluZSBCM1N3aXRjaFZhbHVlX2gKKworI2luY2x1ZGUgIkIzQ29udHJvbFZhbHVlLmgiCisj
aW5jbHVkZSAiQjNTd2l0Y2hDYXNlLmgiCisKK25hbWVzcGFjZSBKU0MgeyBuYW1lc3BhY2UgQjMg
eworCitjbGFzcyBTd2l0Y2hWYWx1ZSA6IHB1YmxpYyBDb250cm9sVmFsdWUgeworcHVibGljOgor
ICAgIHN0YXRpYyBib29sIGFjY2VwdHMoT3Bjb2RlIG9wY29kZSkgeyByZXR1cm4gb3Bjb2RlID09
IFN3aXRjaDsgfQorCisgICAgflN3aXRjaFZhbHVlKCk7CisKKyAgICAvLyBudW1DYXNlVmFsdWVz
KCkgKyAxID09IG51bVN1Y2Nlc3NvcnMoKS4KKyAgICB1bnNpZ25lZCBudW1DYXNlVmFsdWVzKCkg
Y29uc3QgeyByZXR1cm4gbV92YWx1ZXMuc2l6ZSgpOyB9CisKKyAgICAvLyBUaGUgc3VjY2Vzc29y
IGZvciB0aGlzIGNhc2UgdmFsdWUgaXMgYXQgdGhlIHNhbWUgaW5kZXguCisgICAgaW50NjRfdCBj
YXNlVmFsdWUodW5zaWduZWQgaW5kZXgpIGNvbnN0IHsgcmV0dXJuIG1fdmFsdWVzW2ldOyB9Cisg
ICAgCisgICAgY29uc3QgVmVjdG9yPGludDY0X3Q+JiBjYXNlVmFsdWVzKCkgY29uc3QgeyByZXR1
cm4gbV92YWx1ZXM7IH0KKworICAgIEJhc2ljQmxvY2sqIGZhbGxUaHJvdWdoKCkgY29uc3QgeyBy
ZXR1cm4gc3VjY2Vzc29ycygpLmxhc3QoKTsgfQorICAgIEJhc2ljQmxvY2sqJiBmYWxsVGhyb3Vn
aCgpIHsgcmV0dXJuIHN1Y2Nlc3NvcnMoKS5sYXN0KCk7IH0KKworICAgIHVuc2lnbmVkIHNpemUo
KSBjb25zdCB7IHJldHVybiBudW1DYXNlVmFsdWVzKCk7IH0KKyAgICBTd2l0Y2hDYXNlIGF0KHVu
c2lnbmVkIGluZGV4KSBjb25zdAorICAgIHsKKyAgICAgICAgcmV0dXJuIFN3aXRjaENhc2UoY2Fz
ZVZhbHVlKGluZGV4KSwgc3VjY2Vzc29yKGluZGV4KSk7CisgICAgfQorICAgIFN3aXRjaENhc2Ug
b3BlcmF0b3JbXSh1bnNpZ25lZCBpbmRleCkgY29uc3QKKyAgICB7CisgICAgICAgIHJldHVybiBh
dChpbmRleCk7CisgICAgfQorCisgICAgY2xhc3MgaXRlcmF0b3IgeworICAgIHB1YmxpYzoKKyAg
ICAgICAgaXRlcmF0b3IoKQorICAgICAgICAgICAgOiBtX3N3aXRjaChudWxscHRyKQorICAgICAg
ICAgICAgLCBtX2luZGV4KDApCisgICAgICAgIHsKKyAgICAgICAgfQorCisgICAgICAgIGl0ZXJh
dG9yKFN3aXRjaFZhbHVlJiBzd2l0Y2hWYWx1ZSwgdW5zaWduZWQgaW5kZXgpCisgICAgICAgICAg
ICA6IG1fc3dpdGNoKCZzd2l0Y2hWYWx1ZSkKKyAgICAgICAgICAgICwgbV9pbmRleChpbmRleCkK
KyAgICAgICAgeworICAgICAgICB9CisKKyAgICAgICAgU3dpdGNoQ2FzZSBvcGVyYXRvciooKQor
ICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gbV9zd2l0Y2gtPmF0KG1faW5kZXgpOworICAg
ICAgICB9CisKKyAgICAgICAgaXRlcmF0b3ImIG9wZXJhdG9yKysoKQorICAgICAgICB7CisgICAg
ICAgICAgICBtX2luZGV4Kys7CisgICAgICAgICAgICByZXR1cm4gKnRoaXM7CisgICAgICAgIH0K
KworICAgICAgICBib29sIG9wZXJhdG9yPT0oY29uc3QgaXRlcmF0b3ImIG90aGVyKSBjb25zdAor
ICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gbV9pbmRleCA9PSBvdGhlci5tX2luZGV4Owor
ICAgICAgICB9CisKKyAgICAgICAgYm9vbCBvcGVyYXRvciE9KGNvbnN0IGl0ZXJhdG9yJiBvdGhl
cikgY29uc3QKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuICEoKnRoaXMgPT0gb3RoZXIp
OworICAgICAgICB9CisKKyAgICBwcml2YXRlOgorICAgICAgICBTd2l0Y2hWYWx1ZSogbV9zd2l0
Y2g7CisgICAgICAgIHVuc2lnbmVkIG1faW5kZXg7CisgICAgfTsKKworICAgIGl0ZXJhdG9yIGJl
Z2luKCkgY29uc3QgeyByZXR1cm4gaXRlcmF0b3IoKnRoaXMsIDApOyB9CisgICAgaXRlcmF0b3Ig
ZW5kKCkgY29uc3QgeyByZXR1cm4gaXRlcmF0b3IoKnRoaXMsIHNpemUoKSk7IH0KKworICAgIC8v
IFRoaXMgcmVtb3ZlcyB0aGUgY2FzZSBhbmQgcmVvcmRlcnMgdGhpbmdzIGEgYml0LiBJZiB5b3Un
cmUgaXRlcmF0aW5nIHRoZSBjYXNlcyBmcm9tIDAgdG8gTiwKKyAgICAvLyB0aGVuIHlvdSBjYW4g
a2VlcCBpdGVyYXRpbmcgYWZ0ZXIgdGhpcyBzbyBsb25nIGFzIHlvdSByZXZpc2l0IHRoaXMgc2Ft
ZSBpbmRleCAod2hpY2ggd2lsbCBub3cKKyAgICAvLyBjb250YWluIHNvbWUgb3RoZXIgY2FzZSB2
YWx1ZSkuIFRoaXMgcmVtb3ZlcyB0aGUgY2FzZSB0aGF0IHdhcyByZW1vdmVkLgorICAgIFN3aXRj
aENhc2UgcmVtb3ZlQ2FzZSh1bnNpZ25lZCBpbmRleCk7CisKKyAgICB2b2lkIGFwcGVuZENhc2Uo
Y29uc3QgU3dpdGNoQ2FzZSYgc3dpdGNoQ2FzZSk7CisKK3Byb3RlY3RlZDoKKyAgICB2b2lkIGR1
bXBNZXRhKFByaW50U3RyZWFtJikgY29uc3Qgb3ZlcnJpZGU7CisKK3ByaXZhdGU6CisgICAgZnJp
ZW5kIGNsYXNzIFByb2NlZHVyZTsKKworICAgIFN3aXRjaFZhbHVlKHVuc2lnbmVkIGluZGV4LCBP
cmlnaW4gb3JpZ2luLCBCYXNpY0Jsb2NrKiBmYWxsVGhyb3VnaCk7Cit9OworCit9IH0gLy8gbmFt
ZXNwYWNlIEpTQzo6QjMKKworI2VuZGlmIC8vIEIzU3dpdGNoVmFsdWVfaAorCkluZGV4OiBTb3Vy
Y2UvSmF2YVNjcmlwdENvcmUvYjMvQjNUeXBlLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2
YVNjcmlwdENvcmUvYjMvQjNUeXBlLmNwcAkocmV2aXNpb24gMCkKKysrIFNvdXJjZS9KYXZhU2Ny
aXB0Q29yZS9iMy9CM1R5cGUuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsNTQgQEAKKy8q
CisgKiBDb3B5cmlnaHQgKEMpIDIwMTUgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgor
ICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMs
IHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVk
IHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0
cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQK
KyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcg
ZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJl
cHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBj
b25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1
bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJp
YnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBg
YEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xV
RElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBN
RVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBB
UkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IKKyAqIENPTlRS
SUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBT
UEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElO
RywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09E
UyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJ
TkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBP
RiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRP
UlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5Z
IFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VE
IE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKworI2luY2x1ZGUgImNv
bmZpZy5oIgorI2luY2x1ZGUgIkIzVHlwZS5oIgorCisjaW5jbHVkZSA8d3RmL1ByaW50U3RyZWFt
Lmg+CisKK25hbWVzcGFjZSBXVEYgeworCit1c2luZyBuYW1lc3BhY2UgSlNDOjpCMzsKKwordm9p
ZCBwcmludEludGVybmFsKFByaW50U3RyZWFtJiBvdXQsIFR5cGUgdHlwZSkKK3sKKyAgICBzd2l0
Y2ggKHR5cGUpIHsKKyAgICBjYXNlIFZvaWQ6CisgICAgICAgIG91dC5wcmludCgiVm9pZCIpOwor
ICAgICAgICByZXR1cm47CisgICAgY2FzZSBJbnQzMjoKKyAgICAgICAgb3V0LnByaW50KCJJbnQz
MiIpOworICAgICAgICByZXR1cm47CisgICAgY2FzZSBJbnQ2NDoKKyAgICAgICAgb3V0LnByaW50
KCJJbnQ2NCIpOworICAgICAgICByZXR1cm47CisgICAgY2FzZSBEb3VibGU6CisgICAgICAgIG91
dC5wcmludCgiRG91YmxlIik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgUkVMRUFTRV9B
U1NFUlRfTk9UX1JFQUNIRUQoKTsKK30KKworfSAvLyBuYW1lc3BhY2UgV1RGCkluZGV4OiBTb3Vy
Y2UvSmF2YVNjcmlwdENvcmUvYjMvQjNUeXBlLmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL0phdmFT
Y3JpcHRDb3JlL2IzL0IzVHlwZS5oCShyZXZpc2lvbiAwKQorKysgU291cmNlL0phdmFTY3JpcHRD
b3JlL2IzL0IzVHlwZS5oCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsNjggQEAKKy8qCisgKiBD
b3B5cmlnaHQgKEMpIDIwMTUgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAq
IFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGgg
b3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQg
dGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRp
b25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAg
IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xh
aW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVj
ZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRp
b25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0
aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9u
LgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFTIElT
JycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywg
QlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFO
VEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElT
Q0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IKKyAqIENPTlRSSUJVVE9S
UyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFM
LAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVU
IE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBT
RVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJ
TlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFC
SUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAq
IChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBP
VVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRI
RSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKworI2lmbmRlZiBCM1R5cGVfaAor
I2RlZmluZSBCM1R5cGVfaAorCisjaW5jbHVkZSA8d3RmL1N0ZExpYkV4dHJhcy5oPgorCituYW1l
c3BhY2UgSlNDIHsgbmFtZXNwYWNlIEIzIHsKKworZW51bSBUeXBlIHsKKyAgICBWb2lkLAorICAg
IEludDMyLAorICAgIEludDY0LAorICAgIERvdWJsZQorfTsKKworaW5saW5lIGJvb2wgaXNJbnQo
VHlwZSB0eXBlKQoreworICAgIHJldHVybiB0eXBlID09IEludDMyIHx8IHR5cGUgPT0gSW50NjQ7
Cit9CisKK2lubGluZSBib29sIGlzRmxvYXQoVHlwZSB0eXBlKQoreworICAgIHJldHVybiB0eXBl
ID09IERvdWJsZTsKK30KKworaW5saW5lIFR5cGUgcG9pbnRlcigpIGNvbnN0Cit7CisgICAgaWYg
KHNpemVvZih2b2lkKikgPT0gNCkKKyAgICAgICAgcmV0dXJuIEludDMyOworICAgIHJldHVybiBJ
bnQ2NDsKK30KKworfSB9IC8vIG5hbWVzcGFjZSBKU0M6OkIzCisKK25hbWVzcGFjZSBXVEYgewor
CitjbGFzcyBQcmludFN0cmVhbTsKKwordm9pZCBwcmludEludGVybmFsKFByaW50U3RyZWFtJiwg
SlNDOjpCMzo6VHlwZSk7CisKK30gLy8gbmFtZXNwYWNlIFdURgorCisjZW5kaWYgLy8gQjNUeXBl
X2gKKwpJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzVXBzaWxvblZhbHVlLmNwcAo9
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNVcHNpbG9uVmFsdWUuY3Bw
CShyZXZpc2lvbiAwKQorKysgU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzVXBzaWxvblZhbHVl
LmNwcAkod29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDQxIEBACisvKgorICogQ29weXJpZ2h0IChD
KSAyMDE1IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1
dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQK
KyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dp
bmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3Vy
Y2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRo
aXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAy
LiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3Zl
IGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhl
IGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Ig
b3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBU
SElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkK
KyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElN
SVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFO
RCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJ
TiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxF
IEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1Q
TEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRF
RCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExP
U1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9O
KSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVU
SEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5H
IE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBV
U0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJ
VFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisKKyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRl
ICJCM1Vwc2lsb25WYWx1ZS5oIgorCituYW1lc3BhY2UgSlNDIHsgbmFtZXNwYWNlIEIzIHsKKwor
VXBzaWxvblZhbHVlOjp+VXBzaWxvblZhbHVlKCkKK3sKK30KKwordm9pZCBVcHNpbG9uVmFsdWU6
OmR1bXBNZXRhKFByaW50U3RyZWFtJiBvdXQpIGNvbnN0Cit7CisgICAgb3V0LnByaW50KCJeIiwg
bV9waGktPmluZGV4KCkpOworfQorCit9IH0gLy8gbmFtZXNwYWNlIEpTQzo6QjMKKwpJbmRleDog
U291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzVXBzaWxvblZhbHVlLmgKPT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0g
U291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzVXBzaWxvblZhbHVlLmgJKHJldmlzaW9uIDApCisr
KyBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNVcHNpbG9uVmFsdWUuaAkod29ya2luZyBjb3B5
KQpAQCAtMCwwICsxLDYwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE1IEFwcGxlIEluYy4g
QWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNv
dXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwg
YXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICog
YXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFp
biB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRp
b25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMg
aW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAg
bm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFp
bWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHBy
b3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBS
T1ZJREVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1Q
TElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJ
TVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBB
UlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBB
UFBMRSBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJ
TkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVO
VElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVN
RU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBP
UgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBB
TkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBT
VFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RI
RVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09G
VFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0Uu
IAorICovCisKKyNpZm5kZWYgQjNVcHNpbG9uVmFsdWVfaAorI2RlZmluZSBCM1Vwc2lsb25WYWx1
ZV9oCisKKyNpbmNsdWRlICJCM1ZhbHVlLmgiCisKK25hbWVzcGFjZSBKU0MgeyBuYW1lc3BhY2Ug
QjMgeworCitjbGFzcyBVcHNpbG9uVmFsdWUgOiBwdWJsaWMgVmFsdWUgeworcHVibGljOgorICAg
IHN0YXRpYyBib29sIGFjY2VwdHMoT3Bjb2RlIG9wY29kZSkgeyByZXR1cm4gb3Bjb2RlID09IFVw
c2lsb247IH0KKworICAgIH5VcHNpbG9uVmFsdWUoKTsKKworICAgIFZhbHVlKiBwaGkoKSBjb25z
dCB7IHJldHVybiBtX3BoaTsgfQorCitwcm90ZWN0ZWQ6CisgICAgdm9pZCBkdW1wTWV0YShQcmlu
dFN0cmVhbSYpIGNvbnN0IG92ZXJyaWRlOworCitwcml2YXRlOgorICAgIGZyaWVuZCBjbGFzcyBQ
cm9jZWR1cmU7CisgICAgCisgICAgVXBzaWxvblZhbHVlKHVuc2lnbmVkIGluZGV4LCBPcmlnaW4g
b3JpZ2luLCBWYWx1ZSogdmFsdWUsIFZhbHVlKiBwaGkpCisgICAgICAgIDogVmFsdWUoaW5kZXgs
IFBoaSwgVm9pZCwgb3JpZ2luLCB2YWx1ZSkKKyAgICAgICAgLCBtX3BoaShwaGkpCisgICAgewor
ICAgICAgICBBU1NFUlQodmFsdWUtPnR5cGUoKSA9PSBwaGktPnR5cGUoKSk7CisgICAgfQorCisg
ICAgVmFsdWUqIG1fcGhpOworfTsKKworfSB9IC8vIG5hbWVzcGFjZSBKU0M6OkIzCisKKyNlbmRp
ZiAvLyBCM1Vwc2lsb25WYWx1ZV9oCisKSW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9C
M1ZhbHVlLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNWYWx1
ZS5jcHAJKHJldmlzaW9uIDApCisrKyBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNWYWx1ZS5j
cHAJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSwxNjkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMp
IDIwMTUgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0
aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAor
ICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2lu
ZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJj
ZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhp
cyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIu
IFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUg
Y29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUg
Zm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBv
dGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRI
SVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQor
ICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1J
VEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5E
IEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElO
IE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUg
Rk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBM
QVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVE
IFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9T
UyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04p
IEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRI
RVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcg
TkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVT
RQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElU
WSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKworI2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUg
IkIzVmFsdWUuaCIKKworbmFtZXNwYWNlIEpTQyB7IG5hbWVzcGFjZSBCMyB7CisKK1ZhbHVlOjp+
VmFsdWUoKQoreworfQorCit2b2lkIFZhbHVlOjpyZXBsYWNlV2l0aElkZW50aXR5KFZhbHVlKiB2
YWx1ZSkKK3sKKyAgICAvLyBUaGlzIGlzIGEgYml0IGNyYXp5LiBJdCBkb2VzIGFuIGluLXBsYWNl
IHJlcGxhY2VtZW50IG9mIHdoYXRldmVyIFZhbHVlIHN1YmNsYXNzIHRoaXMgaXMgd2l0aAorICAg
IC8vIGEgcGxhaW4gSWRlbnRpdHkgVmFsdWUuIFdlIGZpcnN0IGNvbGxlY3QgYWxsIG9mIHRoZSBp
bmZvcm1hdGlvbiB3ZSBuZWVkLCB0aGVuIHdlIGRlc3RydWN0IHRoZQorICAgIC8vIHByZXZpb3Vz
IHZhbHVlIGluIHBsYWNlLCBhbmQgdGhlbiB3ZSBjb25zdHJ1Y3QgdGhlIElkZW50aXR5IFZhbHVl
IGluIHBsYWNlLgorCisgICAgdW5zaWduZWQgaW5kZXggPSBtX2luZGV4OworICAgIFR5cGUgdHlw
ZSA9IG1fdHlwZTsKKyAgICBPcmlnaW4gb3JpZ2luID0gbV9vcmlnaW47CisgICAgQmFzaWNCbG9j
ayogb3duZXIgPSB0aGlzLT5vd25lcjsKKyAgICBWYWx1ZSogcmVwbGFjZW1lbnQgPSB0aGlzLT5y
ZXBsYWNlbWVudDsKKyAgICB2b2lkKiBtaXNjID0gdGhpcy0+bWlzYzsKKworICAgIFJFTEVBU0Vf
QVNTRVJUKHR5cGUgPT0gdmFsdWUtPnR5cGUoKSk7CisKKyAgICB0aGlzLT5WYWx1ZTo6flZhbHVl
KCk7CisKKyAgICBuZXcgKHRoaXMpIChpbmRleCwgSWRlbnRpZnksIHR5cGUsIG9yaWdpbiwgdmFs
dWUpOworCisgICAgdGhpcy0+b3duZXIgPSBvd25lcjsKKyAgICB0aGlzLT5yZXBsYWNlbWVudCA9
IHJlcGxhY2VtZW50OworICAgIHRoaXMtPm1pc2MgPSBtaXNjOworfQorCit2b2lkIFZhbHVlOjpk
dW1wKFByaW50U3RyZWFtJiBvdXQpIGNvbnN0Cit7CisgICAgb3V0LnByaW50KGR1bXBQcmVmaXgs
IG1faW5kZXgpOworfQorCit2b2lkIFZhbHVlOjpkZWVwRHVtcChQcmludFN0cmVhbSYgb3V0KSBj
b25zdAoreworICAgIG91dC5wcmludChtX3R5cGUsICIgIiwgKnRoaXMsICIgPSAiLCBtX29wY29k
ZSk7CisKKyAgICBvdXQucHJpbnQoIigiKTsKKyAgICBDb21tYVByaW50ZXIgY29tbWE7CisgICAg
Zm9yIChWYWx1ZSogY2hpbGQgOiBjaGlsZHJlbigpKQorICAgICAgICBvdXQucHJpbnQoY29tbWEs
IHBvaW50ZXJEdW1wKGNoaWxkKSk7CisKKyAgICBTdHJpbmdQcmludFN0cmVhbSBzdHJpbmdPdXQ7
CisgICAgZHVtcE1ldGEoc3RyaW5nT3V0KTsKKyAgICBDU3RyaW5nIHN0cmluZyA9IHN0cmluZ091
dC50b0NTdHJpbmcoKTsKKyAgICBpZiAoc3RyaW5nLmxlbmd0aCgpKQorICAgICAgICBvdXQucHJp
bnQoY29tbWEsIHN0cmluZyk7CisKKyAgICBvdXQucHJpbnQoIikiKTsKK30KKworYm9vbCBWYWx1
ZTo6aGFzSW50MzIoKSBjb25zdAoreworICAgIHJldHVybiBmYWxzZTsKK30KKworaW50MzJfdCBW
YWx1ZTo6YXNJbnQzMigpIGNvbnN0Cit7CisgICAgUkVMRUFTRV9BU1NFUlRfTk9UX1JFQUNIRUQo
KTsKKyAgICByZXR1cm4gMDsKK30KKworYm9vbCBWYWx1ZTo6aGFzSW50NjQoKSBjb25zdAorewor
ICAgIHJldHVybiBmYWxzZTsKK30KKworaW50NjRfdCBWYWx1ZTo6YXNJbnQ2NCgpIGNvbnN0Cit7
CisgICAgUkVMRUFTRV9BU1NFUlRfTk9UX1JFQUNIRUQoKTsKKyAgICByZXR1cm4gMDsKK30KKwor
Ym9vbCBWYWx1ZTo6aGFzRG91YmxlKCkgY29uc3QKK3sKKyAgICByZXR1cm4gZmFsc2U7Cit9CisK
K2RvdWJsZSBWYWx1ZTo6YXNEb3VibGUoKSBjb25zdAoreworICAgIFJFTEVBU0VfQVNTRVJUX05P
VF9SRUFDSEVEKCk7CisgICAgcmV0dXJuIDA7Cit9CisKK3ZvaWQgVmFsdWU6OmR1bXBNZXRhKFBy
aW50U3RyZWFtJikgY29uc3QKK3sKK30KKworVHlwZSBWYWx1ZTo6dHlwZUZvcihPcGNvZGUgb3Bj
b2RlLCBWYWx1ZSogZmlyc3RDaGlsZCkKK3sKKyAgICBzd2l0Y2ggKG9wY29kZSkgeworICAgIGNh
c2UgSWRlbnRpdHk6CisgICAgY2FzZSBBZGQ6CisgICAgY2FzZSBTdWI6CisgICAgY2FzZSBNdWw6
CisgICAgY2FzZSBEaXY6CisgICAgY2FzZSBDaGlsbERpdjoKKyAgICBjYXNlIE1vZDoKKyAgICBj
YXNlIEJpdEFuZDoKKyAgICBjYXNlIEJpdE9yOgorICAgIGNhc2UgQml0WG9yOgorICAgIGNhc2Ug
U2hsOgorICAgIGNhc2UgU1NocjoKKyAgICBjYXNlIFpTaHI6CisgICAgY2FzZSBDaGVja0FkZDoK
KyAgICBjYXNlIENoZWNrU3ViOgorICAgIGNhc2UgQ2hlY2tNdWw6CisgICAgICAgIHJldHVybiBm
aXJzdENoaWxkLT50eXBlKCk7CisgICAgY2FzZSBGcmFtZVBvaW50ZXI6CisgICAgICAgIHJldHVy
biBwb2ludGVyKCk7CisgICAgY2FzZSBTRXh0ODoKKyAgICBjYXNlIFNFeHQxNjoKKyAgICBjYXNl
IERUb0kzMjoKKyAgICBjYXNlIEVxdWFsOgorICAgIGNhc2UgTm90RXF1YWw6CisgICAgY2FzZSBM
ZXNzVGhhbjoKKyAgICBjYXNlIEdyZWF0ZXJUaGFuOgorICAgIGNhc2UgTGVzc0VxdWFsOgorICAg
IGNhc2UgR3JlYXRlckVxdWFsOgorICAgIGNhc2UgQWJvdmU6CisgICAgY2FzZSBCZWxvdzoKKyAg
ICBjYXNlIEFib3ZlRXF1YWw6CisgICAgY2FzZSBCZWxvd0VxdWFsOgorICAgICAgICByZXR1cm4g
SW50MzI7CisgICAgY2FzZSBTRXh0MzI6CisgICAgY2FzZSBaRXh0MzI6CisgICAgICAgIHJldHVy
biBJbnQ2NDsKKyAgICBjYXNlIEZSb3VuZDoKKyAgICBjYXNlIElUb0Q6CisgICAgICAgIHJldHVy
biBEb3VibGU7CisgICAgY2FzZSBOb3A6CisgICAgICAgIHJldHVybiBWb2lkOworICAgIGRlZmF1
bHQ6CisgICAgICAgIFJFTEVBU0VfQVNTRVJUX05PVF9SRUFDSEVEKCk7CisgICAgfQorfQorCit9
IH0gLy8gbmFtZXNwYWNlIEpTQzo6QjMKKwpJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL2Iz
L0IzVmFsdWUuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNWYWx1
ZS5oCShyZXZpc2lvbiAwKQorKysgU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzVmFsdWUuaAko
d29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDE5NiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAx
NSBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24g
YW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBt
b2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNv
bmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNv
ZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxp
c3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVk
aXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5
cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xs
b3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVy
IG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBT
T0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBF
WFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQg
VE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklU
TkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8g
RVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1Ig
QU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlks
IE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8s
CisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9G
IFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9X
RVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJ
TiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdM
SUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisg
KiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9G
IFNVQ0ggREFNQUdFLiAKKyAqLworCisjaWZuZGVmIEIzVmFsdWVfaAorI2RlZmluZSBCM1ZhbHVl
X2gKKworI2luY2x1ZGUgIkIzT3JpZ2luLmgiCisjaW5jbHVkZSAiQjNUeXBlLmgiCisjaW5jbHVk
ZSA8d3RmL0Zhc3RNYWxsb2MuaD4KKyNpbmNsdWRlIDx3dGYvTm9uY29weWFibGUuaD4KKworbmFt
ZXNwYWNlIEpTQyB7IG5hbWVzcGFjZSBCMyB7CisKK2NsYXNzIFZhbHVlIHsKKyAgICBXVEZfTUFL
RV9OT05DT1BZQUJMRShWYWx1ZSk7CisgICAgV1RGX01BS0VfRkFTVF9BTExPQ0FURUQ7CitwdWJs
aWM6CisgICAgdHlwZWRlZiBWZWN0b3I8VmFsdWUqLCAzPiBBZGphY2VuY3lMaXN0OworCisgICAg
c3RhdGljIGNvbnN0IGNoYXIqIGR1bXBQcmVmaXggPSAiQCI7CisKKyAgICBzdGF0aWMgYm9vbCBh
Y2NlcHRzKE9wY29kZSkgeyByZXR1cm4gdHJ1ZTsgfQorCisgICAgdmlydHVhbCB+VmFsdWUoKTsK
KworICAgIHVuc2lnbmVkIGluZGV4KCkgY29uc3QgeyByZXR1cm4gbV9pbmRleDsgfQorICAgIAor
ICAgIC8vIE5vdGUgdGhhdCB0aGUgb3Bjb2RlIGlzIGltbXV0YWJsZSwgZXhjZXB0IGZvciByZXBs
YWNpbmcgdmFsdWVzIHdpdGggaWRlbnRpdHkuCisgICAgT3Bjb2RlIG9wY29kZSgpIGNvbnN0IHsg
cmV0dXJuIG1fb3Bjb2RlOyB9CisKKyAgICBPcmlnaW4gb3JpZ2luKCkgY29uc3QgeyByZXR1cm4g
bV9vcmlnaW47IH0KKyAgICAKKyAgICBWYWx1ZSomIGNoaWxkKHVuc2lnbmVkIGluZGV4KSB7IHJl
dHVybiBtX2NoaWxkcmVuW2luZGV4XTsgfQorICAgIFZhbHVlKiBjaGlsZCh1bnNpZ25lZCBpbmRl
eCkgY29uc3QgeyByZXR1cm4gbV9jaGlsZHJlbltpbmRleF07IH0KKworICAgIC8vIFRoaXMgY29t
cHV0ZXMgdGhlIHR5cGUgdXNpbmcgdGhlIG9wY29kZS4KKyAgICBUeXBlIHR5cGUoKSBjb25zdCB7
IHJldHVybiBtX3R5cGU7IH0KKworICAgIEFkamFjZW5jeUxpc3QmIGNoaWxkcmVuKCkgeyByZXR1
cm4gbV9jaGlsZHJlbjsgfSAKKyAgICBjb25zdCBBZGphY2VuY3lMaXN0JiBjaGlsZHJlbigpIGNv
bnN0IHsgcmV0dXJuIG1fY2hpbGRyZW47IH0KKworICAgIHZvaWQgcmVwbGFjZVdpdGhJZGVudGl0
eShWYWx1ZSopOworICAgIHZvaWQgcmVwbGFjZVdpdGhOb3AoKTsKKworICAgIHZvaWQgZHVtcChQ
cmludFN0cmVhbSYpIGNvbnN0OworICAgIHZvaWQgZGVlcER1bXAoUHJpbnRTdHJlYW0mKSBjb25z
dDsKKworICAgIC8vIFRoaXMgaXMgaG93IHlvdSBjYXN0IFZhbHVlcy4gRm9yIGV4YW1wbGUsIGlm
IHlvdSB3YW50IHRvIGRvIHNvbWV0aGluZyBwcm92aWRlZCB0aGF0IHdlIGhhdmUgYQorICAgIC8v
IEFyZ3VtZW50UmVnVmFsdWUsIHlvdSBjYW4gZG86CisgICAgLy8KKyAgICAvLyBpZiAoQXJndW1l
bnRSZWdWYWx1ZSogYXJndW1lbnRSZWcgPSB2YWx1ZS0+YXM8QXJndW1lbnRSZWdWYWx1ZT4oKSkg
eworICAgIC8vICAgICB0aGluZ3MKKyAgICAvLyB9CisgICAgLy8KKyAgICAvLyBUaGlzIHdpbGwg
cmV0dXJuIG51bGwgaWYgdGhpcyBvcGNvZGUoKSAhPSBBcmd1bWVudFJlZy4gVGhpcyB3b3JrcyBi
ZWNhdXNlIHRoaXMgcmV0dXJucyBudWxscHRyCisgICAgLy8gaWYgVDo6YWNjZXB0cyhvcGNvZGUo
KSkgcmV0dXJucyBmYWxzZS4KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorICAgIFQqIGFzKCk7
CisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4KKyAgICBjb25zdCBUKiBhcygpIGNvbnN0OworICAg
IAorICAgIGJvb2wgaGFzSW50MzIoKSBjb25zdDsKKyAgICBpbnQzMl90IGFzSW50MzIoKSBjb25z
dDsKKyAgICAKKyAgICBib29sIGhhc0ludDY0KCkgY29uc3Q7CisgICAgaW50NjRfdCBhc0ludDY0
KCkgY29uc3Q7CisKKyAgICBib29sIGhhc0ludCgpIGNvbnN0OworICAgIGludDY0X3QgYXNJbnQo
KSBjb25zdDsKKyAgICBib29sIGlzSW50KGludDY0X3QgdmFsdWUpIGNvbnN0OworCisgICAgYm9v
bCBoYXNEb3VibGUoKSBjb25zdDsKKyAgICBkb3VibGUgYXNEb3VibGUoKSBjb25zdDsKKworICAg
IFN0YWNrbWFwKiBzdGFja21hcCgpOworCitwcm90ZWN0ZWQ6CisgICAgdmlydHVhbCB2b2lkIGR1
bXBNZXRhKFByaW50U3RyZWFtJikgY29uc3Q7CisgICAgCitwcml2YXRlOgorICAgIGZyaWVuZCBj
bGFzcyBQcm9jZWR1cmU7CisgICAgCisgICAgLy8gSW5zdGFudGlhdGUgdmFsdWVzIHZpYSBQcm9j
ZWR1cmUuCisgICAgLy8gVGhpcyBmb3JtIHJlcXVpcmVzIHNwZWNpZnlpbmcgdGhlIHR5cGUgZXhw
bGljaXRseToKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZS4uLiBBcmd1bWVudHM+CisgICAgZXhwbGlj
aXQgVmFsdWUodW5zaWduZWQgaW5kZXgsIE9wY29kZSBvcGNvZGUsIFR5cGUgdHlwZSwgT3JpZ2lu
IG9yaWdpbiwgVmFsdWUqIGZpcnN0Q2hpbGQsIEFyZ3VtZW50cy4uLiBhcmd1bWVudHMpCisgICAg
ICAgIDogbV9pbmRleChpbmRleCkKKyAgICAgICAgLCBtX29wY29kZShvcGNvZGUpCisgICAgICAg
ICwgbV90eXBlKHR5cGUpCisgICAgICAgICwgbV9vcmlnaW4ob3JpZ2luKQorICAgICAgICAsIG1f
Y2hpbGRyZW57IGZpcnN0Q2hpbGQsIGFyZ3VtZW50cy4uLiB9CisgICAgeworICAgIH0KKyAgICAv
LyBUaGlzIGZvcm0gaXMgZm9yIHNwZWNpZnlpbmcgdGhlIHR5cGUgZXhwbGljaXRseSB3aGVuIHRo
ZSBvcGNvZGUgaGFzIG5vIGNoaWxkcmVuOgorICAgIGV4cGxpY2l0IFZhbHVlKHVuc2lnbmVkIGlu
ZGV4LCBPcGNvZGUgb3Bjb2RlLCBUeXBlIHR5cGUsIE9yaWdpbiBvcmlnaW4pCisgICAgICAgIDog
bV9pbmRleChpbmRleCkKKyAgICAgICAgLCBtX29wY29kZShvcGNvZGUpCisgICAgICAgICwgbV90
eXBlKHR5cGUpCisgICAgICAgICwgbV9vcmlnaW4ob3JpZ2luKQorICAgIHsKKyAgICB9CisgICAg
Ly8gVGhpcyBmb3JtIGlzIGZvciB0aG9zZSBvcGNvZGVzIHRoYXQgY2FuIGluZmVyIHRoZWlyIHR5
cGUgZnJvbSB0aGUgb3Bjb2RlIGFuZCBmaXJzdCBjaGlsZDoKKyAgICB0ZW1wbGF0ZTx0eXBlbmFt
ZS4uLiBBcmd1bWVudHM+CisgICAgZXhwbGljaXQgVmFsdWUodW5zaWduZWQgaW5kZXgsIE9wY29k
ZSBvcGNvZGUsIE9yaWdpbiBvcmlnaW4sIFZhbHVlKiBmaXJzdENoaWxkLCBBcmd1bWVudHMuLi4g
YXJndW1lbnRzKQorICAgICAgICA6IG1faW5kZXgoaW5kZXgpCisgICAgICAgICwgbV9vcGNvZGUo
b3Bjb2RlKQorICAgICAgICAsIG1fdHlwZSh0eXBlRm9yKG9wY29kZSwgZmlyc3RDaGlsZCkpCisg
ICAgICAgICwgbV9vcmlnaW4ob3JpZ2luKQorICAgICAgICAsIG1fY2hpbGRyZW57IGZpcnN0Q2hp
bGQsIGFyZ3VtZW50cy4uLiB9CisgICAgeworICAgIH0KKyAgICAvLyBUaGlzIGZvcm0gaXMgZm9y
IHRob3NlIG9wY29kZXMgdGhhdCBjYW4gaW5mZXIgdGhlaXIgdHlwZSBmcm9tIHRoZSBvcGNvZGUg
YWxvbmUsIGFuZCB0aGF0IGRvbid0CisgICAgLy8gdGFrZSBhbnkgYXJndW1lbnRzOgorICAgIGV4
cGxpY2l0IFZhbHVlKHVuc2lnbmVkIGluZGV4LCBPcGNvZGUgb3Bjb2RlLCBPcmlnaW4gb3JpZ2lu
KQorICAgICAgICA6IG1faW5kZXgoaW5kZXgpCisgICAgICAgICwgbV9vcGNvZGUob3Bjb2RlKQor
ICAgICAgICAsIG1fdHlwZSh0eXBlRm9yKG9wY29kZSwgbnVsbHB0cikpCisgICAgICAgICwgbV9v
cmlnaW4ob3JpZ2luKQorICAgIHsKKyAgICB9CisgICAgLy8gVXNlIHRoaXMgZm9ybSBmb3IgdmFy
YXJncy4KKyAgICBleHBpY2l0IFZhbHVlKHVuc2lnbmVkIGluZGV4LCBPcGNvZGUgb3Bjb2RlLCBU
eXBlIHR5cGUsIE9yaWdpbiBvcmlnaW4sIGNvbnN0IEFkamFjZW5jeUxpc3QmIGNoaWxkcmVuKQor
ICAgICAgICA6IG1faW5kZXgoaW5kZXgpCisgICAgICAgICwgbV9vcGNvZGUob3Bjb2RlKQorICAg
ICAgICAsIG1fdHlwZSh0eXBlKQorICAgICAgICAsIG1fb3JpZ2luKG9yaWdpbikKKyAgICAgICAg
LCBtX2NoaWxkcmVuKGNoaWxkcmVuKQorICAgIHsKKyAgICB9CisKKyAgICBzdGF0aWMgVHlwZSB0
eXBlRm9yKE9wY29kZSwgVmFsdWUqIGZpcnN0Q2hpbGQpOworCisgICAgLy8gVGhpcyBncm91cCBv
ZiBmaWVsZHMgaXMgYXJyYW5nZWQgdG8gZml0IGluIDY0IGJpdHMuCisgICAgdW5zaWduZWQgbV9p
bmRleDsKKyAgICBPcGNvZGUgbV9vcGNvZGU7CisgICAgVHlwZSBtX3R5cGU7CisgICAgCisgICAg
T3JpZ2luIG1fb3JpZ2luOworICAgIEFkamFjZW5jeUxpc3QgbV9jaGlsZHJlbjsKKworcHVibGlj
OgorICAgIEJhc2ljQmxvY2sqIG93bmVyIHsgbnVsbHB0ciB9OyAvLyBjb21wdXRlZCBsYXppbHku
CisgICAgVmFsdWUqIHJlcGxhY2VtZW50IHsgbnVsbHB0ciB9OyAvLyB1c2VkIGZvciBhbmFseXNl
cyBhbmQgdHJhbnNmb3JtYXRpb25zLgorICAgIHZvaWQqIG1pc2MgeyBudWxscHRyIH07Cit9Owor
CitjbGFzcyBEZWVwVmFsdWVEdW1wIHsKK3B1YmxpYzoKKyAgICBEZWVwVmFsdWVEdW1wKFZhbHVl
KiB2YWx1ZSkKKyAgICAgICAgOiBtX3ZhbHVlKHZhbHVlKQorICAgIHsKKyAgICB9CisKKyAgICB2
b2lkIGR1bXAoUHJpbnRTdHJlYW0mIG91dCkgY29uc3QKKyAgICB7CisgICAgICAgIGlmIChtX3Zh
bHVlKQorICAgICAgICAgICAgbV92YWx1ZS0+ZGVlcER1bXAob3V0KTsKKyAgICAgICAgZWxzZQor
ICAgICAgICAgICAgb3V0LnByaW50KCI8bnVsbD4iKTsKKyAgICB9CisKK3ByaXZhdGU6CisgICAg
VmFsdWUqIG1fdmFsdWU7Cit9OworCitEZWVwVmFsdWVEdW1wIGRlZXBEdW1wKFZhbHVlKiB2YWx1
ZSkKK3sKKyAgICByZXR1cm4gRGVlcFZhbHVlRHVtcCh2YWx1ZSk7Cit9CisKK30gfSAvLyBuYW1l
c3BhY2UgSlNDOjpCMworCisjZW5kaWYgLy8gQjNWYWx1ZV9oCisKSW5kZXg6IFNvdXJjZS9KYXZh
U2NyaXB0Q29yZS9iMy9CM1ZhbHVlSW5saW5lcy5oCj09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZh
U2NyaXB0Q29yZS9iMy9CM1ZhbHVlSW5saW5lcy5oCShyZXZpc2lvbiAwKQorKysgU291cmNlL0ph
dmFTY3JpcHRDb3JlL2IzL0IzVmFsdWVJbmxpbmVzLmgJKHdvcmtpbmcgY29weSkKQEAgLTAsMCAr
MSwxMDkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTUgQXBwbGUgSW5jLiBBbGwgcmlnaHRz
IHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBi
aW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0
dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0Ogor
ICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92
ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRo
ZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkg
Zm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRo
aXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhl
CisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0
aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkg
QVBQTEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJB
TlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FS
UkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgor
ICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4g
T1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJ
TkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFH
RVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VC
U1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9G
SVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkg
VEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFC
SUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFS
SVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZF
TiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKwor
I2lmbmRlZiBCM1ZhbHVlSW5saW5lc19oCisjZGVmaW5lIEIzVmFsdWVJbmxpbmVzX2gKKworI2lu
Y2x1ZGUgIkIzQ2hlY2tWYWx1ZS5oIgorI2luY2x1ZGUgIkIzQ29uc3QzMlZhbHVlLmgiCisjaW5j
bHVkZSAiQjNDb25zdDY0VmFsdWUuaCIKKyNpbmNsdWRlICJCM0NvbnN0RG91YmxlVmFsdWUuaCIK
KyNpbmNsdWRlICJCM1BhdGNocG9pbnRWYWx1ZS5oIgorI2luY2x1ZGUgIkIzVmFsdWUuaCIKKwor
bmFtZXNwYWNlIEpTQyB7IG5hbWVzcGFjZSBCMyB7CisKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+CitU
KiBWYWx1ZTo6YXMoKQoreworICAgIGlmIChUOjphY2NlcHRzKG9wY29kZSgpKSkKKyAgICAgICAg
cmV0dXJuIHN0YXRpY19jYXN0PFQqPih0aGlzKTsKKyAgICByZXR1cm4gbnVsbHB0cjsKK30KKwor
dGVtcGxhdGU+dHlwZW5hbWUgVD4KK2NvbnN0IFQqIFZhbHVlOjphcygpIGNvbnN0Cit7CisgICAg
cmV0dXJuIGNvbnN0X2Nhc3Q8VmFsdWUqPih0aGlzKS0+YXM8VD4oKTsKK30KKworYm9vbCBWYWx1
ZTo6aGFzSW50MzIoKSBjb25zdAoreworICAgIHJldHVybiAhIWFzPENvbnN0MzJWYWx1ZT4oKTsK
K30KKworaW50MzJfdCBWYWx1ZTo6YXNJbnQzMigpIGNvbnN0Cit7CisgICAgcmV0dXJuIGFzPENv
bnN0MzJWYWx1ZT4oKS0+dmFsdWUoKTsKK30KKworYm9vbCBWYWx1ZTo6aGFzSW50NjQoKSBjb25z
dAoreworICAgIHJldHVybiAhIWFzPENvbnN0NjRWYWx1ZT4oKTsKK30KKworaW50NjRfdCBWYWx1
ZTo6YXNJbnQ2NCgpIGNvbnN0Cit7CisgICAgcmV0dXJuIGFzPENvbnN0NjRWYWx1ZT4oKS0+dmFs
dWUoKTsKK30KKworYm9vbCBWYWx1ZTo6aGFzSW50KCkgY29uc3QKK3sKKyAgICByZXR1cm4gaGFz
SW50MzIoKSB8fCBoYXNJbnQ2NCgpOworfQorCitpbnQ2NF90IFZhbHVlOjphc0ludCgpIGNvbnN0
Cit7CisgICAgcmV0dXJuIGhhc0ludDMyKCkgPyBhc0ludDMyKCkgOiBhc0ludDY0KCk7Cit9CisK
K2Jvb2wgVmFsdWU6OmlzSW50KGludDY0X3QgdmFsdWUpIGNvbnN0Cit7CisgICAgcmV0dXJuIGhh
c0ludCgpICYmIGFzSW50KCkgPT0gdmFsdWU7Cit9CisKK2Jvb2wgVmFsdWU6Omhhc0RvdWJsZSgp
IGNvbnN0Cit7CisgICAgcmV0dXJuICEhYXM8Q29uc3REb3VibGVWYWx1ZT4oKTsKK30KKworZG91
YmxlIFZhbHVlOjphc0RvdWJsZSgpIGNvbnN0Cit7CisgICAgcmV0dXJuIGFzPENvbnN0RG91Ymxl
VmFsdWU+KCktPnZhbHVlKCk7Cit9CisKK1N0YWNrbWFwKiBWYWx1ZTo6c3RhY2ttYXAoKQorewor
ICAgIGlmIChDaGVja1ZhbHVlKiBjaGVjayA9IGFzPENoZWNrVmFsdWU+KCkpCisgICAgICAgIHJl
dHVybiAmY2hlY2stPnN0YWNrbWFwOworICAgIGlmIChQYXRjaHBvaW50VmFsdWUqIHBhdGNocG9p
bnQgPSBhczxQYXRjaHBvaW50VmFsdWU+KCkpCisgICAgICAgIHJldHVybiAmcGF0Y2hwb2ludC0+
c3RhY2ttYXA7CisgICAgcmV0dXJuIG51bGxwdHI7Cit9CisKK30gfSAvLyBuYW1lc3BhY2UgSlND
OjpCMworCisjZW5kaWYgLy8gQjNWYWx1ZUlubGluZXNfaAorCkluZGV4OiBTb3VyY2UvSmF2YVNj
cmlwdENvcmUvYjMvQjNWYWx1ZVJlcC5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL0phdmFTY3Jp
cHRDb3JlL2IzL0IzVmFsdWVSZXAuY3BwCShyZXZpc2lvbiAwKQorKysgU291cmNlL0phdmFTY3Jp
cHRDb3JlL2IzL0IzVmFsdWVSZXAuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsODYgQEAK
Ky8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTUgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVk
LgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9y
bXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3Zp
ZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVk
aXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmln
aHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dp
bmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0
IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBv
ZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBk
b2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlz
dHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5D
LiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElO
Q0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBP
RiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9T
RSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IKKyAqIENP
TlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFM
LCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xV
RElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBH
T09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBC
VVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisg
KiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9S
IFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4g
QU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJ
U0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKworI2luY2x1ZGUg
ImNvbmZpZy5oIgorI2luY2x1ZGUgIkIzVmFsdWVSZXAuaCIKKworbmFtZXNwYWNlIEpTQyB7IG5h
bWVzcGFjZSBCMyB7CisKK3ZvaWQgVmFsdWVSZXA6OmR1bXAoUHJpbnRTdHJlYW0mIG91dCkgY29u
c3QKK3sKKyAgICBvdXQucHJpbnQobV9raW5kKTsKKyAgICBzd2l0Y2ggKG1fa2luZCkgeworICAg
IGNhc2UgTm9uZToKKyAgICBjYXNlIFNvbWVSZWdpc3RlcjoKKyAgICAgICAgcmV0dXJuOworICAg
IGNhc2UgUmVnaXN0ZXI6CisgICAgICAgIG91dC5wcmludCgiKCIsIHJlZygpLCAiKSIpOworICAg
ICAgICByZXR1cm47CisgICAgY2FzZSBTdGFjazoKKyAgICAgICAgb3V0LnByaW50KCIoIiwgb2Zm
c2V0RnJvbUZQKCksICIpIik7CisgICAgICAgIHJldHVybjsKKyAgICBjYXNlIFN0YWNrQXJndW1l
bnQ6CisgICAgICAgIG91dC5wcmludCgiKCIsIG9mZnNldEZyb21TUCgpLCAiKSIpOworICAgICAg
ICByZXR1cm47CisgICAgY2FzZSBDb25zdGFudDoKKyAgICAgICAgb3V0LnByaW50KCIoIiwgdmFs
dWUoKSwgIikiKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBSRUxFQVNFX0FTU0VSVF9O
T1RfUkVBQ0hFRCgpOworfQorCit9IH0gLy8gbmFtZXNwYWNlIEpTQzo6QjMKKworbmFtZXNwYWNl
IFdURiB7CisKK3VzaW5nIG5hbWVzcGFjZSBKU0M6OkIzOworCit2b2lkIHByaW50SW50ZXJuYWwo
UHJpbnRTdHJlYW0mIG91dCwgVmFsdWVSZXA6OktpbmQga2luZCkKK3sKKyAgICBzd2l0Y2ggKGtp
bmQpIHsKKyAgICBjYXNlIFZhbHVlUmVwOjpBbnk6CisgICAgICAgIG91dC5wcmludCgiQW55Iik7
CisgICAgICAgIHJldHVybjsKKyAgICBjYXNlIFZhbHVlUmVwOjpTb21lUmVnaXN0ZXI6CisgICAg
ICAgIG91dC5wcmludCgiU29tZVJlZ2lzdGVyIik7CisgICAgICAgIHJldHVybjsKKyAgICBjYXNl
IFZhbHVlUmVwOjpSZWdpc3RlcjoKKyAgICAgICAgb3V0LnByaW50KCJSZWdpc3RlciIpOworICAg
ICAgICByZXR1cm47CisgICAgY2FzZSBWYWx1ZVJlcDo6U3RhY2s6CisgICAgICAgIG91dC5wcmlu
dCgiU3RhY2siKTsKKyAgICAgICAgcmV0dXJuOworICAgIGNhc2UgVmFsdWVSZXA6OlN0YWNrQXJn
dW1lbnQ6CisgICAgICAgIG91dC5wcmludCgiU3RhY2tBcmd1bWVudCIpOworICAgICAgICByZXR1
cm47CisgICAgY2FzZSBWYWx1ZVJlcDo6Q29uc3RhbnQ6CisgICAgICAgIG91dC5wcmludCgiQ29u
c3RhbnQiKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBSRUxFQVNFX0FTU0VSVF9OT1Rf
UkVBQ0hFRCgpOworfQorCit9IC8vIG5hbWVzcGFjZSBXVEYKKwpJbmRleDogU291cmNlL0phdmFT
Y3JpcHRDb3JlL2IzL0IzVmFsdWVSZXAuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlw
dENvcmUvYjMvQjNWYWx1ZVJlcC5oCShyZXZpc2lvbiAwKQorKysgU291cmNlL0phdmFTY3JpcHRD
b3JlL2IzL0IzVmFsdWVSZXAuaAkod29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDE1NiBAQAorLyoK
KyAqIENvcHlyaWdodCAoQykgMjAxNSBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisg
KgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywg
d2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQg
dGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3Ry
aWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAor
ICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBk
aXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVw
cm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNv
bmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3Vt
ZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmli
dXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIGBg
QVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVE
SU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1F
UkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFS
RSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUgorICogQ09OVFJJ
QlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQ
RUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5H
LCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RT
IE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lO
RVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9G
IExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9S
VAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkg
V0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQg
T0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLiAKKyAqLworCisjaWZuZGVmIEIzVmFs
dWVSZXBfaAorI2RlZmluZSBCM1ZhbHVlUmVwX2gKKworI2luY2x1ZGUgIlJlZy5oIgorI2luY2x1
ZGUgPHd0Zi9QcmludFN0cmVhbS5oPgorCituYW1lc3BhY2UgSlNDIHsgbmFtZXNwYWNlIEIzIHsK
KworLy8gV2UgdXNlIHRoaXMgY2xhc3MgdG8gZGVzY3JpYmUgdmFsdWUgcmVwcmVzZW50YXRpb25z
IGF0IHN0YWNrbWFwcy4gSXQncyB1c2VkIGJvdGggdG8gZm9yY2UgYQorLy8gcmVwcmVzZW50YXRp
b24gYW5kIHRvIGdldCB0aGUgcmVwcmVzZW50YXRpb24uIFdoZW4gdGhlIEIzIGNsaWVudCBmb3Jj
ZXMgYSByZXByZXNlbnRhdGlvbiwgd2Ugc2F5CisvLyB0aGF0IGl0J3MgYW4gaW5wdXQuIFdoZW4g
QjMgdGVsbHMgdGhlIGNsaWVudCB3aGF0IHJlcHJlc2VudGF0aW9uIGl0IHBpY2tlZCwgd2Ugc2F5
IHRoYXQgaXQncyBhbgorLy8gb3V0cHV0LgorCitjbGFzcyBWYWx1ZVJlcCB7CitwdWJsaWM6Cisg
ICAgZW51bSBLaW5kIHsKKyAgICAgICAgLy8gQXMgYW4gaW5wdXQgcmVwcmVzZW50YXRpb24sIHRo
aXMgbWVhbnMgdGhhdCBCMyBjYW4gcGljayBhbnkgcmVwcmVzZW50YXRpb24uCisgICAgICAgIEFu
eSwKKworICAgICAgICAvLyBBcyBhbiBpbnB1dCByZXByZXNlbnRhdGlvbiwgdGhpcyBtZWFucyB0
aGF0IEIzIHNob3VsZCBwaWNrIHNvbWUgcmVnaXN0ZXIsIHByb3ZpZGVkIHRoYXQKKyAgICAgICAg
Ly8gaXQncyBub3QgYWxzbyBhIHJlZ2lzdGVyIHRoYXQgd2FzIGNsb2JiZXJlZC4KKyAgICAgICAg
U29tZVJlZ2lzdGVyLAorCisgICAgICAgIC8vIEFzIGFuIGlucHV0IHJlcHJlc2VudGF0aW9uLCB0
aGlzIGZvcmNlcyBhIHBhcnRpY3VsYXIgcmVnaXN0ZXIuIEFzIGFuIG91dHB1dAorICAgICAgICAv
LyByZXByZXNlbnRhdGlvbiwgdGhpcyB0ZWxscyB1cyB3aGF0IHJlZ2lzdGVyIEIzIHBpY2tlZC4K
KyAgICAgICAgUmVnaXN0ZXIsCisKKyAgICAgICAgLy8gQXMgYW4gb3V0cHV0IHJlcHJlc2VudGF0
aW9uLCB0aGlzIHRlbGxzIHVzIHdoYXQgc3RhY2sgc2xvdCBCMyBwaWNrZWQuIEl0J3Mgbm90IGEg
dmFsaWQKKyAgICAgICAgLy8gaW5wdXQgcmVwcmVzZW50YXRpb24uCisgICAgICAgIFN0YWNrLAor
CisgICAgICAgIC8vIEFzIGFuIGlucHV0IHJlcHJlc2VudGF0aW9uLCB0aGlzIGZvcmNlcyB0aGUg
dmFsdWUgdG8gZW5kIHVwIGluIHRoZSBhcmd1bWVudCBhcmVhIGF0IHNvbWUKKyAgICAgICAgLy8g
b2Zmc2V0LgorICAgICAgICBTdGFja0FyZ3VtZW50LAorCisgICAgICAgIC8vIEFzIGFuIG91dHB1
dCByZXByZXNlbnRhdGlvbiwgdGhpcyB0ZWxscyB1cyB0aGF0IEIzIGNvbnN0YW50LWZvbGRlZCB0
aGUgdmFsdWUuCisgICAgICAgIENvbnN0YW50CisgICAgfTsKKyAgICAKKyAgICBWYWx1ZVJlcCgp
CisgICAgICAgIDogbV9raW5kKEFueSkKKyAgICB7CisgICAgfQorCisgICAgZXhwbGljaXQgVmFs
dWVSZXAoUmVnIHJlZykKKyAgICAgICAgOiBtX2tpbmQoUmVnaXN0ZXIpCisgICAgICAgICwgbV92
YWx1ZShyZWcuaW5kZXgoKSkKKyAgICB7CisgICAgfQorCisgICAgc3RhdGljIFZhbHVlUmVwIHJl
ZyhSZWcgcmVnKQorICAgIHsKKyAgICAgICAgcmV0dXJuIFZhbHVlUmVwKHJlZyk7CisgICAgfQor
CisgICAgc3RhdGljIFZhbHVlUmVwIHN0YWNrKGludHB0cl90IG9mZnNldEZyb21GUCkKKyAgICB7
CisgICAgICAgIFZhbHVlUmVwIHJlc3VsdDsKKyAgICAgICAgcmVzdWx0Lm1fa2luZCA9IFN0YWNr
OworICAgICAgICByZXN1bHQubV92YWx1ZSA9IG9mZnNldEZyb21GUDsKKyAgICB9CisKKyAgICBz
dGF0aWMgVmFsdWVSZXAgc3RhY2tBcmd1bWVudChpbnRwdHJfdCBvZmZzZXRGcm9tU1ApCisgICAg
eworICAgICAgICBWYWx1ZVJlcCByZXN1bHQ7CisgICAgICAgIHJlc3VsdC5tX2tpbmQgPSBTdGFj
a0FyZ3VtZW50OworICAgICAgICByZXN1bHQubV92YWx1ZSA9IG9mZnNldEZyb21TUDsKKyAgICB9
CisKKyAgICBzdGF0aWMgVmFsdWVSZXAgY29uc3RhbnQoaW50NjRfdCB2YWx1ZSkKKyAgICB7Cisg
ICAgICAgIFZhbHVlUmVwIHJlc3VsdDsKKyAgICAgICAgcmVzdWx0Lm1fa2luZCA9IENvbnN0YW50
OworICAgICAgICByZXN1bHQubV92YWx1ZSA9IHZhbHVlOworICAgIH0KKworICAgIHN0YXRpYyBW
YWx1ZVJlcCBjb25zdGFudChkb3VibGUgdmFsdWUpCisgICAgeworICAgICAgICByZXR1cm4gVmFs
dWVSZXAoYml0d2lzZV9jYXN0PGludDY0X3Q+KHZhbHVlKSk7CisgICAgfQorCisgICAgS2luZCBr
aW5kKCkgY29uc3QgeyByZXR1cm4gbV9raW5kOyB9CisKKyAgICBleHBsaWNpdCBvcGVyYXRvciBi
b29sKCkgY29uc3QgeyByZXR1cm4ga2luZCgpICE9IEFueTsgfQorCisgICAgUmVnIHJlZygpIGNv
bnN0CisgICAgeworICAgICAgICBBU1NFUlQoa2luZCgpID09IFJlZ2lzdGVyKTsKKyAgICAgICAg
cmV0dXJuIFJlZzo6ZnJvbUluZGV4KG1fdmFsdWUpOworICAgIH0KKworICAgIGludHB0cl90IG9m
ZnNldEZyb21GUCgpIGNvbnN0CisgICAgeworICAgICAgICBBU1NFUlQoa2luZCgpID09IFN0YWNr
KTsKKyAgICAgICAgcmV0dXJuIHN0YXRpY19jYXN0PGludHB0cl90PihtX3ZhbHVlKTsKKyAgICB9
CisKKyAgICBpbnRwdHJfdCBvZmZzZXRGcm9tU1AoKSBjb25zdAorICAgIHsKKyAgICAgICAgQVNT
RVJUKGtpbmQoKSA9PSBTdGFja0FyZ3VtZW50KTsKKyAgICAgICAgcmV0dXJuIHN0YXRpY19jYXN0
PGludHB0cl90PihtX3ZhbHVlKTsKKyAgICB9CisKKyAgICBpbnQ2NF90IHZhbHVlKCkgY29uc3QK
KyAgICB7CisgICAgICAgIEFTU0VSVChraW5kKCkgPT0gQ29uc3RhbnQpOworICAgICAgICByZXR1
cm4gbV92YWx1ZTsKKyAgICB9CisKKyAgICBkb3VibGUgZG91YmxlVmFsdWUoKSBjb25zdAorICAg
IHsKKyAgICAgICAgcmV0dXJuIGJpdHdpc2VfY2FzdDxkb3VibGU+KHZhbHVlKCkpOworICAgIH0K
KworICAgIHZvaWQgZHVtcChQcmludFN0cmVhbSYpIGNvbnN0OworCitwcml2YXRlOgorICAgIEtp
bmQgbV9raW5kOworICAgIGludDY0X3QgbV92YWx1ZTsKK307CisKK30gfSAvLyBuYW1lc3BhY2Ug
SlNDOjpCMworCituYW1lc3BhY2UgV1RGIHsKKwordm9pZCBwcmludEludGVybmFsKFByaW50U3Ry
ZWFtJiwgSlNDOjpCMzo6VmFsdWVSZXA6OktpbmQpOworCit9IC8vIG5hbWVzcGFjZSBXVEYKKwor
I2VuZGlmIC8vIEIzVmFsdWVSZXBfaAorCkluZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMv
Z2VuZXJhdGVfcGF0dGVybl9tYXRjaGVyLnJiCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2Ny
aXB0Q29yZS9iMy9nZW5lcmF0ZV9wYXR0ZXJuX21hdGNoZXIucmIJKHJldmlzaW9uIDApCisrKyBT
b3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvZ2VuZXJhdGVfcGF0dGVybl9tYXRjaGVyLnJiCSh3b3Jr
aW5nIGNvcHkpCkBAIC0wLDAgKzEsNDc1IEBACisjIS91c3IvYmluL2VudiBydWJ5CisKKyMgQ29w
eXJpZ2h0IChDKSAyMDE1IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyMKKyMgUmVk
aXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3
aXRob3V0CisjIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBm
b2xsb3dpbmcgY29uZGl0aW9ucworIyBhcmUgbWV0OgorIyAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Yg
c291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorIyAgICBub3RpY2Us
IHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisj
IDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJv
dmUgY29weXJpZ2h0CisjICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRo
ZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyMgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Ig
b3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyMKKyMgVEhJ
UyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIEFORCBJVFMgQ09OVFJJQlVUT1JT
IGBgQVMgSVMnJworIyBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNM
VURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyMgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBN
RVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorIyBQVVJQT1NFIEFS
RSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SIElUUyBDT05UUklC
VVRPUlMKKyMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwg
U1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgorIyBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElO
RywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgorIyBTVUJTVElUVVRFIEdPT0RT
IE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MK
KyMgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFC
SUxJVFksIFdIRVRIRVIgSU4KKyMgQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQg
KElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKyMgQVJJU0lORyBJTiBBTlkgV0FZ
IE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRgorIyBU
SEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKK3JlcXVpcmUgInBhdGhuYW1lIgorCisk
dmFySW5kZXggPSAwCitkZWYgbmV3VmFyCisgICAgJHZhckluZGV4ICs9IDEKKyAgICAiX3RtcCN7
JHZhckluZGV4fSIKK2VuZAorCitjbGFzcyBQcm9kdWN0aW9uCisgICAgYXR0cl9yZWFkZXIgOm9y
aWdpbiwgOm5hbWUsIDp2YXJOYW1lLCA6YW5vbnltb3VzLCA6b3Bjb2RlLCA6Y2hpbGRyZW4KKwor
ICAgIGRlZiBpbml0aWFsaXplKG9yaWdpbiwgbmFtZSwgb3Bjb2RlLCBjaGlsZHJlbikKKyAgICAg
ICAgQG9yaWdpbiA9IG9yaWdpbgorICAgICAgICBAbmFtZSA9IG5hbWUKKyAgICAgICAgQGFub255
bW91cyA9IChuYW1lID09IG5pbCBvciBuYW1lID1+IC9cQVwkKFswLTldKylcWi8pCisgICAgICAg
IEB2YXJOYW1lID0gQGFub255bW91cyA/IG5ld1ZhciA6IG5hbWUKKyAgICAgICAgQG9wY29kZSA9
IG9wY29kZQorICAgICAgICBAY2hpbGRyZW4gPSBjaGlsZHJlbiA/IGNoaWxkcmVuIDogW10KKyAg
ICBlbmQKKworICAgIGRlZiBoYXNPcGNvZGUKKyAgICAgICAgb3Bjb2RlICE9IG5pbAorICAgIGVu
ZAorCisgICAgZGVmIGVhY2hWYXJpYWJsZSgmcHJvYykKKyAgICAgICAgY2hpbGRyZW4uZWFjaF93
aXRoX2luZGV4IHsKKyAgICAgICAgICAgIHwgY2hpbGQsIGluZGV4IHwKKyAgICAgICAgICAgIHlp
ZWxkIHZhck5hbWUsCisgICAgICAgICAgICAgICAgICBjaGlsZC5uYW1lLAorICAgICAgICAgICAg
ICAgICAgY2hpbGQudmFyTmFtZSwKKyAgICAgICAgICAgICAgICAgIGNoaWxkLmFub255bW91cyA/
IChjaGlsZC5vcGNvZGUgPyA6YW5vbkludGVybmFsIDogOmFub25PcGVyYW5kKSA6IChjaGlsZC5v
cGNvZGUgPyA6aW50ZXJuYWwgOiA6b3BlcmFuZCksCisgICAgICAgICAgICAgICAgICBpbmRleAor
ICAgICAgICAgICAgY2hpbGQuZWFjaFZhcmlhYmxlKCZwcm9jKQorICAgICAgICB9CisgICAgZW5k
CitlbmQKKworY2xhc3MgTWF0Y2hlcgorICAgIGF0dHJfcmVhZGVyIDpuYW1lLCA6cHJvZHVjdGlv
bnMKKworICAgIGRlZiBpbml0aWFsaXplKG5hbWUsIHByb2R1Y3Rpb25zKQorICAgICAgICBAbmFt
ZSA9IG5hbWUKKyAgICAgICAgQHByb2R1Y3Rpb25zID0gcHJvZHVjdGlvbnMKKyAgICBlbmQKK2Vu
ZAorCitjbGFzcyBPcmlnaW4KKyAgICBhdHRyX3JlYWRlciA6ZmlsZU5hbWUsIDpsaW5lTnVtYmVy
CisgICAgCisgICAgZGVmIGluaXRpYWxpemUoZmlsZU5hbWUsIGxpbmVOdW1iZXIpCisgICAgICAg
IEBmaWxlTmFtZSA9IGZpbGVOYW1lCisgICAgICAgIEBsaW5lTnVtYmVyID0gbGluZU51bWJlcgor
ICAgIGVuZAorICAgIAorICAgIGRlZiB0b19zCisgICAgICAgICIje2ZpbGVOYW1lfToje2xpbmVO
dW1iZXJ9IgorICAgIGVuZAorZW5kCisKK2NsYXNzIFRva2VuCisgICAgYXR0cl9yZWFkZXIgOm9y
aWdpbiwgOnN0cmluZworICAgIAorICAgIGRlZiBpbml0aWFsaXplKG9yaWdpbiwgc3RyaW5nKQor
ICAgICAgICBAb3JpZ2luID0gb3JpZ2luCisgICAgICAgIEBzdHJpbmcgPSBzdHJpbmcKKyAgICBl
bmQKKyAgICAKKyAgICBkZWYgPT0ob3RoZXIpCisgICAgICAgIGlmIG90aGVyLmlzX2E/IFRva2Vu
CisgICAgICAgICAgICBAc3RyaW5nID09IG90aGVyLnN0cmluZworICAgICAgICBlbHNlCisgICAg
ICAgICAgICBAc3RyaW5nID09IG90aGVyCisgICAgICAgIGVuZAorICAgIGVuZAorICAgIAorICAg
IGRlZiA9fihvdGhlcikKKyAgICAgICAgQHN0cmluZyA9fiBvdGhlcgorICAgIGVuZAorICAgIAor
ICAgIGRlZiB0b19zCisgICAgICAgICIje0BzdHJpbmcuaW5zcGVjdH0gYXQgI3tvcmlnaW59Igor
ICAgIGVuZAorICAgIAorICAgIGRlZiBwYXJzZUVycm9yKCpjb21tZW50KQorICAgICAgICBpZiBj
b21tZW50LmVtcHR5PworICAgICAgICAgICAgcmFpc2UgIlBhcnNlIGVycm9yOiAje3RvX3N9Igor
ICAgICAgICBlbHNlCisgICAgICAgICAgICByYWlzZSAiUGFyc2UgZXJyb3I6ICN7dG9fc306ICN7
Y29tbWVudFswXX0iCisgICAgICAgIGVuZAorICAgIGVuZAorZW5kCisKK2RlZiBsZXgoc3RyLCBm
aWxlTmFtZSkKKyAgICBmaWxlTmFtZSA9IFBhdGhuYW1lLm5ldyhmaWxlTmFtZSkKKyAgICByZXN1
bHQgPSBbXQorICAgIGxpbmVOdW1iZXIgPSAxCisgICAgd2hpbGUgbm90IHN0ci5lbXB0eT8KKyAg
ICAgICAgY2FzZSBzdHIKKyAgICAgICAgd2hlbiAvXEFcIyhbXlxuXSopLworICAgICAgICAgICAg
IyBjb21tZW50LCBpZ25vcmUKKyAgICAgICAgd2hlbiAvXEFcbi8KKyAgICAgICAgICAgICMgbmV3
bGluZSwgaWdub3JlCisgICAgICAgICAgICBsaW5lTnVtYmVyICs9IDEKKyAgICAgICAgd2hlbiAv
XEFbYS16QS1aMC05JF0oW2EtekEtWjAtOV9dKikvCisgICAgICAgICAgICByZXN1bHQgPDwgVG9r
ZW4ubmV3KE9yaWdpbi5uZXcoZmlsZU5hbWUsIGxpbmVOdW1iZXIpLCAkJikKKyAgICAgICAgd2hl
biAvXEEoWyBcdFxyXSspLworICAgICAgICAgICAgIyB3aGl0ZXNwYWNlLCBpZ25vcmUKKyAgICAg
ICAgd2hlbiAvXEFbPSgpLF0vCisgICAgICAgICAgICByZXN1bHQgPDwgVG9rZW4ubmV3KE9yaWdp
bi5uZXcoZmlsZU5hbWUsIGxpbmVOdW1iZXIpLCAkJikKKyAgICAgICAgZWxzZQorICAgICAgICAg
ICAgcmFpc2UgIkxleGVyIGVycm9yIGF0ICN7T3JpZ2luLm5ldyhmaWxlTmFtZSwgbGluZU51bWJl
cikudG9fc30sIHVuZXhwZWN0ZWQgc2VxdWVuY2UgI3tzdHJbMC4uMjBdLmluc3BlY3R9IgorICAg
ICAgICBlbmQKKyAgICAgICAgc3RyID0gJH4ucG9zdF9tYXRjaAorICAgIGVuZAorICAgIHJlc3Vs
dAorZW5kCisKK2RlZiBpc0tleXdvcmQodG9rZW4pCisgICAgIyBXZSBjYW4gZXh0ZW5kIHRoaXMg
YXMgd2UgYWRkIG1vcmUga2V5d29yZHMuIExpa2UsIHdlIG1pZ2h0IHdhbnQgImluY2x1ZGUiIGV2
ZW50dWFsbHkuCisgICAgdG9rZW4gPX4gL1xBKChtYXRjaGVyKSlcWi8KK2VuZAorCitkZWYgaXNJ
ZGVudGlmaWVyKHRva2VuKQorICAgIHRva2VuID1+IC9cQVthLXpBLVowLTkkXShbYS16QS1aMC05
X10qKVxaLyBhbmQgbm90IGlzS2V5d29yZCh0b2tlbikKK2VuZAorCitjbGFzcyBQYXJzZXIKKyAg
ICBkZWYgaW5pdGlhbGl6ZShkYXRhLCBmaWxlTmFtZSkKKyAgICAgICAgQHRva2VucyA9IGxleChk
YXRhLCBmaWxlTmFtZSkKKyAgICAgICAgQGlkeCA9IDAKKyAgICBlbmQKKworICAgIGRlZiB0b2tl
bgorICAgICAgICBAdG9rZW5zW0BpZHhdCisgICAgZW5kCisKKyAgICBkZWYgYWR2YW5jZQorICAg
ICAgICBAaWR4ICs9IDEKKyAgICBlbmQKKworICAgIGRlZiBwYXJzZUVycm9yKCpjb21tZW50KQor
ICAgICAgICBpZiB0b2tlbgorICAgICAgICAgICAgdG9rZW4ucGFyc2VFcnJvcigqY29tbWVudCkK
KyAgICAgICAgZWxzZQorICAgICAgICAgICAgaWYgY29tbWVudC5lbXB0eT8KKyAgICAgICAgICAg
ICAgICByYWlzZSAiUGFyc2UgZXJyb3IgYXQgZW5kIG9mIGZpbGUiCisgICAgICAgICAgICBlbHNl
CisgICAgICAgICAgICAgICAgcmFpc2UgIlBhcnNlIGVycm9yIGF0IGVuZCBvZiBmaWxlOiAje2Nv
bW1lbnRbMF19IgorICAgICAgICAgICAgZW5kCisgICAgICAgIGVuZAorICAgIGVuZAorCisgICAg
ZGVmIGNvbnN1bWUoc3RyaW5nKQorICAgICAgICBwYXJzZUVycm9yKCJFeHBlY3RlZCAje3N0cmlu
Z30iKSB1bmxlc3MgdG9rZW4gPT0gc3RyaW5nCisgICAgICAgIGFkdmFuY2UKKyAgICBlbmQKKwor
ICAgIGRlZiBjb25zdW1lSWRlbnRpZmllcgorICAgICAgICByZXN1bHQgPSB0b2tlbi5zdHJpbmcK
KyAgICAgICAgcGFyc2VFcnJvcigiRXhwZWN0ZWQgaWRlbnRpZmllciIpIHVubGVzcyBpc0lkZW50
aWZpZXIocmVzdWx0KQorICAgICAgICBhZHZhbmNlCisgICAgICAgIHJlc3VsdAorICAgIGVuZAor
CisgICAgZGVmIGFkZFVuaXF1ZShuYW1lLCBwcm9kdWN0aW9ucywgcHJvZHVjdGlvbikKKyAgICAg
ICAgaWYgbmFtZSA9PSBwcm9kdWN0aW9uLnZhck5hbWUKKyAgICAgICAgICAgIHBhcnNlRXJyb3Io
IkNoaWxkIHByb2R1Y3Rpb24gaGFzIHNhbWUgbmFtZSBhcyBwYXJlbnQgcHJvZHVjdGlvbiIpCisg
ICAgICAgIGVuZAorICAgICAgICBpZiBwcm9kdWN0aW9ucy5kZXRlY3QgeyB8IGVudHJ5IHwgZW50
cnkubmFtZSA9PSBwcm9kdWN0aW9uLm5hbWUgfQorICAgICAgICAgICAgcGFyc2VFcnJvcigiRHVw
bGljYXRlIHByb2R1Y3Rpb24iKQorICAgICAgICBlbmQKKyAgICAgICAgcHJvZHVjdGlvbnMgPDwg
cHJvZHVjdGlvbgorICAgIGVuZAorCisgICAgZGVmIHBhcnNlCisgICAgICAgIGNvbnN1bWUoIm1h
dGNoZXIiKQorCisgICAgICAgIG1hdGNoZXJOYW1lID0gY29uc3VtZUlkZW50aWZpZXIKKworICAg
ICAgICBwcm9kdWN0aW9ucyA9IFtdCisKKyAgICAgICAgbG9vcCB7CisgICAgICAgICAgICBicmVh
ayBpZiBAaWR4ID49IEB0b2tlbnMubGVuZ3RoCisKKyAgICAgICAgICAgICMgV2UgbWlnaHQgd2Fu
dCB0byBzdXBwb3J0ICJpbmNsdWRlIi4gSWYgd2UgZGlkIHRoYXQsIGl0IHdvdWxkIGdvIGhlcmUu
CisgICAgICAgICAgICBhZGRVbmlxdWUobWF0Y2hlck5hbWUsIHByb2R1Y3Rpb25zLCBwYXJzZVBy
b2R1Y3Rpb24pCisgICAgICAgIH0KKworICAgICAgICBNYXRjaGVyLm5ldyhtYXRjaGVyTmFtZSwg
cHJvZHVjdGlvbnMpCisgICAgZW5kCisKKyAgICBkZWYgcGFyc2VQcm9kdWN0aW9uCisgICAgICAg
IG9yaWdpbiA9IHRva2VuLm9yaWdpbgorICAgICAgICBuYW1lID0gY29uc3VtZUlkZW50aWZpZXIK
KworICAgICAgICBpZiB0b2tlbiA9PSAiPSIKKyAgICAgICAgICAgIGNvbnN1bWUoIj0iKQorICAg
ICAgICAgICAgb3Bjb2RlID0gY29uc3VtZUlkZW50aWZpZXIKKyAgICAgICAgICAgIGNvbnN1bWUo
IigiKQorICAgICAgICBlbHNpZiB0b2tlbiA9PSAiKCIKKyAgICAgICAgICAgIGNvbnN1bWUoIigi
KQorICAgICAgICAgICAgb3Bjb2RlID0gbmFtZQorICAgICAgICAgICAgbmFtZSA9IG5pbAorICAg
ICAgICBlbHNlCisgICAgICAgICAgICByZXR1cm4gUHJvZHVjdGlvbi5uZXcob3JpZ2luLCBuYW1l
LCBuaWwsIG5pbCkKKyAgICAgICAgZW5kCisgICAgICAgIAorICAgICAgICBwcm9kdWN0aW9ucyA9
IFtdCisgICAgICAgIGxvb3AgeworICAgICAgICAgICAgYnJlYWsgaWYgdG9rZW4gPT0gIikiCisK
KyAgICAgICAgICAgIGFkZFVuaXF1ZShuYW1lLCBwcm9kdWN0aW9ucywgcGFyc2VQcm9kdWN0aW9u
KQorCisgICAgICAgICAgICBicmVhayBpZiB0b2tlbiA9PSAiKSIKKyAgICAgICAgICAgIGNvbnN1
bWUoIiwiKQorICAgICAgICB9CisKKyAgICAgICAgIyBBZHZhbmNlIGFmdGVyIHRoZSAiKSIKKyAg
ICAgICAgYWR2YW5jZQorCisgICAgICAgIFByb2R1Y3Rpb24ubmV3KG9yaWdpbiwgbmFtZSwgb3Bj
b2RlLCBwcm9kdWN0aW9ucykKKyAgICBlbmQKK2VuZAorCitmaWxlTmFtZSA9IEFSR1ZbMF0KKwor
cGFyc2VyID0gUGFyc2VyLm5ldyhJTzo6cmVhZChmaWxlTmFtZSksIGZpbGVOYW1lKQorbWF0Y2hl
ciA9IHBhcnNlci5wYXJzZQorCitjbGFzcyBTdWJNYXRjaAorICAgIGF0dHJfcmVhZGVyIDppbmRl
eE1hcCwgOnByb2R1Y3Rpb25zCisgICAgCisgICAgZGVmIGluaXRpYWxpemUoaW5kZXhMaXN0LCBw
cm9kdWN0aW9ucykKKyAgICAgICAgQGluZGV4TWFwID0gW10KKyAgICAgICAgQHByb2R1Y3Rpb25z
ID0gW10KKyAgICAgICAgaW5kZXhMaXN0LmVhY2ggeworICAgICAgICAgICAgfCBpbmRleCB8Cisg
ICAgICAgICAgICBAaW5kZXhNYXAgPDwgaW5kZXgKKyAgICAgICAgICAgIEBwcm9kdWN0aW9ucyA8
PCBwcm9kdWN0aW9uc1tpbmRleF0KKyAgICAgICAgfQorICAgIGVuZAorCisgICAgZGVmIG1hcElu
ZGV4TGlzdChpbmRleExpc3QpCisgICAgICAgIGluZGV4TGlzdC5tYXAgeworICAgICAgICAgICAg
fCBpbmRleCB8CisgICAgICAgICAgICBAaW5kZXhNYXBbaW5kZXhdCisgICAgICAgIH0KKyAgICBl
bmQKK2VuZAorCitGaWxlLm9wZW4oIkIzIiArIG1hdGNoZXIubmFtZSArICIuaCIsICJ3Iikgewor
ICAgIHwgb3V0cCB8CisKKyAgICBvdXRwLnB1dHMgIi8vIEdlbmVyYXRlZCBieSBnZW5lcmF0ZV9w
YXR0ZXJuX21hdGNoZXIucmIgZnJvbSAje2ZpbGVOYW1lfSAtLSBkbyBub3QgZWRpdCEiCisKKyAg
ICBvdXRwLnB1dHMgIiNpZm5kZWYgQjMje21hdGNoZXIubmFtZX1faCIKKyAgICBvdXRwLnB1dHMg
IiNkZWZpbmUgQjMje21hdGNoZXIubmFtZX1faCIKKyAgICAKKyAgICBvdXRwLnB1dHMgIiNpbmNs
dWRlIFwiQjNWYWx1ZS5oXCIiCisgICAgCisgICAgb3V0cC5wdXRzICJuYW1lc3BhY2UgSlNDIHsg
bmFtZXNwYWNlIEIzIHsiCisKKyAgICBvdXRwLnB1dHMgInRlbXBsYXRlPHR5cGVuYW1lIEFkYXB0
b3I+IgorICAgIG91dHAucHV0cyAidm9pZCBydW4je21hdGNoZXIubmFtZX0oVmFsdWUqIF92YWx1
ZSwgQWRhcHRvciYgYWRhcHRvcikiCisgICAgb3V0cC5wdXRzICJ7IgorCisgICAgIyBOb3RlIHRo
YXQgdGhpcyBkb2VzIG5vdCBlbWl0IHByb3Blcmx5IGluZGVudGVkIGNvZGUsIGJlY2F1c2UgaXQn
cyBhIHJlY3Vyc2l2ZSBlbWl0dGVyLiBJZiB5b3UKKyAgICAjIHdhbnQgdG8gc2VlIHRoZSBjb2Rl
IG5pY2VseSBmb3JtYXR0ZWQsIG9wZW4gaXQgaW4gYSBnb29kIHRleHQgZWRpdG9yIGFuZCBhc2sg
aXQgdG8gZm9ybWF0IGl0CisgICAgIyBmb3IgeW91LgorCisgICAgIyBJbiBvZGQgc2l0dWF0aW9u
cywgd2UgbWF5IG5vdCB1c2UgdGhlIGlucHV0IHZhbHVlLiBUZWxsIHRoZSBjb21waWxlciB0byBj
aGlsbCBvdXQgYWJvdXQgaXQuCisgICAgb3V0cC5wdXRzICJVTlVTRURfUEFSQU0oX3ZhbHVlKTsi
CisgICAgICAgIAorICAgICMgVGhpcyBqdXN0IHByb3RlY3RzIHRoZSBjYWxsZXIgZnJvbSBoYXZp
bmcgdG8gd29ycnkgYWJvdXQgcHJvZHVjdGlvbnMgaGF2aW5nIGRpZmZlcmVudCBsZW5ndGhzLgor
ICAgIGRlZiBtYXRjaExlbmd0aChvdXRwLCB2YWx1ZU5hbWUsIHByb2R1Y3Rpb25zKQorICAgICAg
ICBpbmRleExpc3RzID0gW10KKyAgICAgICAgcHJvZHVjdGlvbnMuZWFjaF93aXRoX2luZGV4IHsK
KyAgICAgICAgICAgIHwgcHJvZHVjdGlvbiwgaW5kZXggfAorICAgICAgICAgICAgaWYgaW5kZXhM
aXN0c1stMV0gYW5kIHByb2R1Y3Rpb25zW2luZGV4TGlzdHNbLTFdWzBdXS5jaGlsZHJlbi5sZW5n
dGggPT0gcHJvZHVjdGlvbi5jaGlsZHJlbi5sZW5ndGgKKyAgICAgICAgICAgICAgICBpbmRleExp
c3RzWy0xXSA8PCBpbmRleAorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIGluZGV4
TGlzdHMgPDwgW2luZGV4XQorICAgICAgICAgICAgZW5kCisgICAgICAgIH0KKworICAgICAgICBp
bmRleExpc3RzLmVhY2ggeworICAgICAgICAgICAgfCBpbmRleExpc3QgfAorICAgICAgICAgICAg
bGVuZ3RoID0gcHJvZHVjdGlvbnNbaW5kZXhMaXN0WzBdXS5jaGlsZHJlbi5sZW5ndGgKKyAgICAg
ICAgICAgIGlmIGxlbmd0aCA+IDAKKyAgICAgICAgICAgICAgICBvdXRwLnB1dHMgImlmICgje3Zh
bHVlTmFtZX0tPmNoaWxkcmVuLnNpemUoKSA+PSAje2xlbmd0aH0pIHsiCisgICAgICAgICAgICAg
ICAgeWllbGQgaW5kZXhMaXN0CisgICAgICAgICAgICAgICAgb3V0cC5wdXRzICJ9IgorICAgICAg
ICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHlpZWxkIGluZGV4TGlzdAorICAgICAgICAgICAg
ZW5kCisgICAgICAgIH0KKyAgICBlbmQKKworICAgICMgVGhpcyBlZmZpY2llbnRseSBzZWxlY3Rz
IGZyb20gdGhlIGdpdmVuIHNldCBvZiBwcm9kdWN0aW9ucy4gSXQgYXNzdW1lcyB0aGF0IHByb2R1
Y3Rpb25zCisgICAgIyBhcmUgbm90IGR1cGxpY2F0ZWQuIEl0IHlpZWxkcyB0aGUgaW5kZXggb2Yg
dGhlIGZvdW5kIHByb2R1Y3Rpb24sIGFuZCB0aGUgY29yb3V0aW5lIGlzCisgICAgIyByZXNwb25z
aWJsZSBmb3IgZW1pdHRpbmcgc3BlY2lmaWMgY29kZSBmb3IgdGhhdCBwcm9kdWN0aW9uLiBUaGUg
Y29yb3V0aW5lIGlzIGdpdmVuIGxpc3RzIG9mCisgICAgIyBpbmRpY2VzIG9mIHBvc3NpYmx5LW1h
dGNoaW5nIHByb2R1Y3Rpb25zLgorICAgIGRlZiBtYXRjaFByb2R1Y3Rpb25zKG91dHAsIHZhbHVl
TmFtZSwgcHJvZHVjdGlvbnMpCisgICAgICAgICMgRmlyc3QsIHNwbGl0IHRoZSBwcm9kdWN0aW9u
cyBsaXN0IGludG8gcnVucyBvZiBwcm9kdWN0aW9ucyB3aXRoIGFuIG9wY29kZSBhbmQgcHJvZHVj
dGlvbnMKKyAgICAgICAgIyB3aXRob3V0IG9uZS4KKyAgICAgICAgaW5kZXhMaXN0cyA9IFtdCisg
ICAgICAgIHByb2R1Y3Rpb25zLmVhY2hfd2l0aF9pbmRleCB7CisgICAgICAgICAgICB8IHByb2R1
Y3Rpb24sIGluZGV4IHwKKyAgICAgICAgICAgIGlmIGluZGV4TGlzdHNbLTFdIGFuZCBwcm9kdWN0
aW9uc1tpbmRleExpc3RzWy0xXVswXV0uaGFzT3Bjb2RlID09IHByb2R1Y3Rpb24uaGFzT3Bjb2Rl
CisgICAgICAgICAgICAgICAgaW5kZXhMaXN0c1stMV0gPDwgaW5kZXgKKyAgICAgICAgICAgIGVs
c2UKKyAgICAgICAgICAgICAgICBpbmRleExpc3RzIDw8IFtpbmRleF0KKyAgICAgICAgICAgIGVu
ZAorICAgICAgICB9CisgICAgICAgIAorICAgICAgICAjIE5vdywgZW1pdCBwYXR0ZXJuIG1hdGNo
aW5nIGNvZGUuIFdlIGRvIGl0IGRpZmZlcmVudGx5IGZvciBsaXN0cyB3aXRoIGFuIG9wY29kZSB0
aGFuIGZvcgorICAgICAgICAjIGxpc3RzIHdpdGhvdXQgb25lLgorICAgICAgICBpbmRleExpc3Rz
LmVhY2ggeworICAgICAgICAgICAgfCBpbmRleExpc3QgfAorICAgICAgICAgICAgaWYgcHJvZHVj
dGlvbnNbaW5kZXhMaXN0WzBdXS5oYXNPcGNvZGUKKyAgICAgICAgICAgICAgICAjIE5vdywgd2Ug
c3BsaXQgdGhpcyBpbmRleCBsaXN0IGludG8gZ3JvdXBzIGZvciBlYWNoIG9wY29kZS4KKyAgICAg
ICAgICAgICAgICBncm91cHMgPSB7fQorICAgICAgICAgICAgICAgIGluZGV4TGlzdC5lYWNoIHsK
KyAgICAgICAgICAgICAgICAgICAgfCBpbmRleCB8CisgICAgICAgICAgICAgICAgICAgIHByb2R1
Y3Rpb24gPSBwcm9kdWN0aW9uc1tpbmRleF0KKyAgICAgICAgICAgICAgICAgICAgaWYgZ3JvdXBz
W3Byb2R1Y3Rpb24ub3Bjb2RlXQorICAgICAgICAgICAgICAgICAgICAgICAgZ3JvdXBzW3Byb2R1
Y3Rpb24ub3Bjb2RlXSA8PCBpbmRleAorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAg
ICAgICAgICAgICAgICAgICBncm91cHNbcHJvZHVjdGlvbi5vcGNvZGVdID0gW2luZGV4XQorICAg
ICAgICAgICAgICAgICAgICBlbmQKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAg
ICAjIEVtaXQgYSBzd2l0Y2ggc3RhdGVtZW50LgorICAgICAgICAgICAgICAgIG91dHAucHV0cyAi
c3dpdGNoICgje3ZhbHVlTmFtZX0tPm9wY29kZSgpKSB7IgorICAgICAgICAgICAgICAgIGdyb3Vw
cy5lYWNoX3BhaXIgeworICAgICAgICAgICAgICAgICAgICB8IG9wY29kZSwgc3ViSW5kZXhMaXN0
IHwKKyAgICAgICAgICAgICAgICAgICAgb3V0cC5wdXRzICJjYXNlICN7b3Bjb2RlfToiCisgICAg
ICAgICAgICAgICAgICAgIHN1Yk1hdGNoID0gU3ViTWF0Y2gubmV3KHN1YkluZGV4TGlzdCwgcHJv
ZHVjdGlvbnMpCisgICAgICAgICAgICAgICAgICAgIG1hdGNoTGVuZ3RoKG91dHAsIHZhbHVlTmFt
ZSwgc3ViTWF0Y2gucHJvZHVjdGlvbnMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHwgaW5k
ZXhMaXN0IHwKKyAgICAgICAgICAgICAgICAgICAgICAgIHlpZWxkIHN1Yk1hdGNoLm1hcEluZGV4
TGlzdChpbmRleExpc3QpCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAg
ICAgb3V0cC5wdXRzICJicmVhazsiCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAg
IG91dHAucHV0cyAiZGVmYXVsdDoiCisgICAgICAgICAgICAgICAgb3V0cC5wdXRzICJicmVhazsi
CisgICAgICAgICAgICAgICAgb3V0cC5wdXRzICJ9IgorICAgICAgICAgICAgZWxzZQorICAgICAg
ICAgICAgICAgIHN1Yk1hdGNoID0gU3ViTWF0Y2gubmV3KGluZGV4TGlzdCwgcHJvZHVjdGlvbnMp
CisgICAgICAgICAgICAgICAgbWF0Y2hMZW5ndGgob3V0cCwgdmFsdWVOYW1lLCBzdWJNYXRjaC5w
cm9kdWN0aW9ucykgeworICAgICAgICAgICAgICAgICAgICB8IGluZGV4TGlzdCB8CisgICAgICAg
ICAgICAgICAgICAgIHlpZWxkIHN1Yk1hdGNoLm1hcEluZGV4TGlzdChpbmRleExpc3QpCisgICAg
ICAgICAgICAgICAgfQorICAgICAgICAgICAgZW5kCisgICAgICAgIH0KKyAgICBlbmQKKworICAg
ICMgVGFrZXMgcHJvZHVjdGlvbnMgdGhhdCBoYXZlIHRoZSBzYW1lIG9wY29kZSBhbmQgdGhlIHNh
bWUgbGVuZ3RoIGFuZCBzZWxlY3RzIGZyb20gdGhlbSBiYXNlZCBvbgorICAgICMgdGhlIHByb2R1
Y3Rpb25zIGF0IHRoZSBnaXZlbiBjb2x1bW4uCisgICAgZGVmIG1hdGNoQ29sdW1uKG91dHAsIHZh
bHVlTmFtZSwgcHJvZHVjdGlvbnMsIGNvbHVtbkluZGV4KQorICAgICAgICBpZiBjb2x1bW5JbmRl
eCA+PSBwcm9kdWN0aW9uc1swXS5jaGlsZHJlbi5sZW5ndGgKKyAgICAgICAgICAgIHlpZWxkICgw
Li4uKHByb2R1Y3Rpb25zLnNpemUpKS50b19hCisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAg
ZW5kCisKKyAgICAgICAgc3ViVmFsdWUgPSBuZXdWYXIKKyAgICAgICAgCisgICAgICAgIG91dHAu
cHV0cyAieyIKKyAgICAgICAgb3V0cC5wdXRzICJWYWx1ZSogI3tzdWJWYWx1ZX0gPSAje3ZhbHVl
TmFtZX0tPmNoaWxkKCN7Y29sdW1uSW5kZXh9KTsiCisKKyAgICAgICAgIyBXZSBtYXkgbm90IHVz
ZSB0aGlzIHZhbHVlLiBUZWxsIHRoZSBjb21waWxlciB0byBjaGlsbCBvdXQgYWJvdXQgaXQuCisg
ICAgICAgIG91dHAucHV0cyAiVU5VU0VEX1BBUkFNKCN7c3ViVmFsdWV9KTsiCisgICAgICAgIAor
ICAgICAgICBzdWJQcm9kdWN0aW9ucyA9IHByb2R1Y3Rpb25zLm1hcCB7CisgICAgICAgICAgICB8
IHByb2R1Y3Rpb24gfAorICAgICAgICAgICAgcHJvZHVjdGlvbi5jaGlsZHJlbltjb2x1bW5JbmRl
eF0KKyAgICAgICAgfQorCisgICAgICAgIG1hdGNoUmVjdXJzaXZlbHkob3V0cCwgc3ViVmFsdWUs
IHN1YlByb2R1Y3Rpb25zKSB7CisgICAgICAgICAgICB8IGluZGV4TGlzdCB8CisgICAgICAgICAg
ICBzdWJNYXRjaCA9IFN1Yk1hdGNoLm5ldyhpbmRleExpc3QsIHByb2R1Y3Rpb25zKQorICAgICAg
ICAgICAgbWF0Y2hDb2x1bW4ob3V0cCwgdmFsdWVOYW1lLCBzdWJNYXRjaC5wcm9kdWN0aW9ucywg
Y29sdW1uSW5kZXggKyAxKSB7CisgICAgICAgICAgICAgICAgfCBpbmRleExpc3QgfAorICAgICAg
ICAgICAgICAgIHlpZWxkIHN1Yk1hdGNoLm1hcEluZGV4TGlzdChpbmRleExpc3QpCisgICAgICAg
ICAgICB9CisgICAgICAgIH0KKworICAgICAgICBvdXRwLnB1dHMgIn0iCisgICAgZW5kCisKKyAg
ICBkZWYgbWF0Y2hSZWN1cnNpdmVseShvdXRwLCB2YWx1ZU5hbWUsIHByb2R1Y3Rpb25zKQorICAg
ICAgICBtYXRjaFByb2R1Y3Rpb25zKG91dHAsIHZhbHVlTmFtZSwgcHJvZHVjdGlvbnMpIHsKKyAg
ICAgICAgICAgIHwgaW5kZXhMaXN0IHwKKyAgICAgICAgICAgICMgV2UgYXJlIGd1YXJhbnRlZWQg
dGhhdCB0aGlzIGluZGV4IGxpc3QgY29udGFpbnMgcHJvZHVjdGlvbnMgd2l0aCB0aGUgc2FtZSBv
cGNvZGUgYW5kCisgICAgICAgICAgICAjIHRoZSBzYW1lIGxlbmd0aC4KKyAgICAgICAgICAgIHN1
Yk1hdGNoID0gU3ViTWF0Y2gubmV3KGluZGV4TGlzdCwgcHJvZHVjdGlvbnMpCisgICAgICAgICAg
ICBtYXRjaENvbHVtbihvdXRwLCB2YWx1ZU5hbWUsIHN1Yk1hdGNoLnByb2R1Y3Rpb25zLCAwKSB7
CisgICAgICAgICAgICAgICAgfCBpbmRleExpc3QgfAorICAgICAgICAgICAgICAgIHlpZWxkIHN1
Yk1hdGNoLm1hcEluZGV4TGlzdChpbmRleExpc3QpCisgICAgICAgICAgICB9CisgICAgICAgIH0K
KyAgICBlbmQKKworICAgIG1hdGNoUmVjdXJzaXZlbHkob3V0cCwgIl92YWx1ZSIsIG1hdGNoZXIu
cHJvZHVjdGlvbnMpIHsKKyAgICAgICAgfCBpbmRleExpc3QgfAorICAgICAgICBpbmRleExpc3Qu
ZWFjaCB7CisgICAgICAgICAgICB8IGluZGV4IHwKKyAgICAgICAgICAgIHByb2R1Y3Rpb24gPSBt
YXRjaGVyLnByb2R1Y3Rpb25zW2luZGV4XQorICAgICAgICAgICAgb3V0cC5wdXRzICJ7IgorICAg
ICAgICAgICAgb3V0cC5wdXRzICJWYWx1ZSogI3twcm9kdWN0aW9uLnZhck5hbWV9ID0gX3ZhbHVl
OyIKKyAgICAgICAgICAgIGludGVybmFsQXJndW1lbnRzID0gW10KKyAgICAgICAgICAgIG9wZXJh
bmRBcmd1bWVudHMgPSBbXQorICAgICAgICAgICAgdHJ5QXJndW1lbnRzID0gW10KKyAgICAgICAg
ICAgIG51bVNjb3BlcyA9IDAKKyAgICAgICAgICAgIHByb2R1Y3Rpb24uZWFjaFZhcmlhYmxlIHsK
KyAgICAgICAgICAgICAgICB8IHBhcmVudFZhck5hbWUsIGNoaWxkTmFtZSwgY2hpbGRWYXJOYW1l
LCBraW5kLCBpbmRleCB8CisgICAgICAgICAgICAgICAgb3V0cC5wdXRzICJWYWx1ZSogI3tjaGls
ZFZhck5hbWV9ID0gI3twYXJlbnRWYXJOYW1lfS0+Y2hpbGQoI3tpbmRleH0pOyIKKworICAgICAg
ICAgICAgICAgIGlmIGNoaWxkTmFtZSA9fiAvXEFcJC8KKyAgICAgICAgICAgICAgICAgICAgaWYg
Y2hpbGROYW1lID1+IC9cQVwkKFswLTldKylcWi8KKyAgICAgICAgICAgICAgICAgICAgICAgIG91
dHAucHV0cyAiaWYgKCN7Y2hpbGRWYXJOYW1lfS0+aXNJbnQoI3skMX0pKSB7IgorICAgICAgICAg
ICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICBvdXRwLnB1dHMgImlmICgj
e2NoaWxkVmFyTmFtZX0tPmhhc0ludCgpKSB7IgorICAgICAgICAgICAgICAgICAgICBlbmQKKyAg
ICAgICAgICAgICAgICAgICAgbnVtU2NvcGVzICs9IDEKKyAgICAgICAgICAgICAgICBlbmQKKyAg
ICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBpbnRlcm5hbEFyZ3VtZW50cyA8PCBjaGls
ZFZhck5hbWUgaWYga2luZCA9PSA6aW50ZXJuYWwgb3Iga2luZCA9PSA6YW5vbkludGVybmFsCisg
ICAgICAgICAgICAgICAgb3BlcmFuZEFyZ3VtZW50cyA8PCBjaGlsZFZhck5hbWUgaWYga2luZCA9
PSA6b3BlcmFuZCBvciBraW5kID09IDphbm9uT3BlcmFuZAorICAgICAgICAgICAgICAgIHRyeUFy
Z3VtZW50cyA8PCBjaGlsZFZhck5hbWUgaWYga2luZCA9PSA6aW50ZXJuYWwgb3Iga2luZCA9PSA6
b3BlcmFuZAorICAgICAgICAgICAgfQorICAgICAgICAgICAgb3V0cC5wdXRzICJpZiAoYWRhcHRv
ci5hY2NlcHRSb290KF92YWx1ZSkiCisgICAgICAgICAgICBvdXRwLnB1dHMoIiAgICAmJiBhZGFw
dG9yLmFjY2VwdEludGVybmFscygiICsgaW50ZXJuYWxBcmd1bWVudHMuam9pbigiLCAiKSArICIp
IikKKyAgICAgICAgICAgIG91dHAucHV0cygiICAgICYmIGFkYXB0b3IuYWNjZXB0T3BlcmFuZHMo
IiArIG9wZXJhbmRBcmd1bWVudHMuam9pbigiLCAiKSArICIpIikKKyAgICAgICAgICAgIG91dHAu
cHV0cygiICAgICYmIGFkYXB0b3IudHJ5I3twcm9kdWN0aW9uLm5hbWV9KCIgKyB0cnlBcmd1bWVu
dHMuam9pbigiLCAiKSArICIpKSIpCisgICAgICAgICAgICBvdXRwLnB1dHMgIiAgICByZXR1cm47
IgorICAgICAgICAgICAgbnVtU2NvcGVzLnRpbWVzIHsKKyAgICAgICAgICAgICAgICBvdXRwLnB1
dHMgIn0iCisgICAgICAgICAgICB9CisgICAgICAgICAgICBvdXRwLnB1dHMgIn0iCisgICAgICAg
IH0KKyAgICB9CisgICAgCisgICAgb3V0cC5wdXRzICIgICAgUkVMRUFTRV9BU1NFUlRfTk9UX1JF
QUNIRUQoKTsiCisgICAgb3V0cC5wdXRzICJ9IgorICAgIAorICAgIG91dHAucHV0cyAifSB9IC8v
IG5hbWVzcGFjZSBKU0M6OkIzIgorCisgICAgb3V0cC5wdXRzICIjZW5kaWYgLy8gQjMje21hdGNo
ZXIubmFtZX1faCIKK30KSW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9haXIvQWlyQXJn
LmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvYWlyL0FpckFyZy5j
cHAJKHJldmlzaW9uIDApCisrKyBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvYWlyL0FpckFyZy5j
cHAJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSw2MiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykg
MjAxNSBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRp
b24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Cisg
KiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5n
IGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNl
IGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlz
IGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4g
UmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBj
b3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBm
b2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90
aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJ
UyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisg
KiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlU
RUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQg
RklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4g
Tk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBG
T1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExB
UlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQg
VE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NT
IE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikg
SE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhF
UiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBO
RUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNF
CisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZ
IE9GIFNVQ0ggREFNQUdFLiAKKyAqLworCisjaW5jbHVkZSAiY29uZmlnLmgiCisjaW5jbHVkZSAi
QWlyQXJnLmgiCisKK25hbWVzcGFjZSBKU0MgeyBuYW1lc3BhY2UgQjMgeyBuYW1lc3BhY2UgQWly
IHsKKwordm9pZCBBcmc6OmR1bXAoUHJpbnRTdHJlYW0mIG91dCkgY29uc3QKK3sKKyAgICBzd2l0
Y2ggKG1fa2luZCkgeworICAgIGNhc2UgVG1wOgorICAgICAgICBvdXQucHJpbnQodG1wKCkpOwor
ICAgICAgICByZXR1cm47CisgICAgY2FzZSBJbW06CisgICAgICAgIG91dC5wcmludCgiJCIsIG1f
b2Zmc2V0KTsKKyAgICAgICAgcmV0dXJuOworICAgIGNhc2UgQWRkcjoKKyAgICAgICAgaWYgKG1f
b2Zmc2V0KQorICAgICAgICAgICAgb3V0LnByaW50KG1fb2Zmc2V0KTsKKyAgICAgICAgb3V0LnBy
aW50KCIoIiwgYmFzZSgpLCAiKSIpOworICAgICAgICByZXR1cm47CisgICAgY2FzZSBJbmRleDoK
KyAgICAgICAgaWYgKG1fb2Zmc2V0KQorICAgICAgICAgICAgb3V0LnByaW50KG1fb2Zmc2V0KTsK
KyAgICAgICAgb3V0LnByaW50KCIoIiwgYmFzZSgpLCAiLCIsIGluZGV4KCkpOworICAgICAgICBp
ZiAoc2NhbGUoKSAhPSAxKQorICAgICAgICAgICAgb3V0LnByaW50KCIsIiwgc2NhbGUoKSk7Cisg
ICAgICAgIG91dC5wcmludCgiKSIpOworICAgICAgICByZXR1cm47CisgICAgY2FzZSBBYnM6Cisg
ICAgICAgIG91dC5wcmludChtX29mZnNldCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAg
ICBSRUxFQVNFX0FTU0VSVF9OT1RfUkVBQ0hFRCgpOworfQorCit9IH0gfSAvLyBuYW1lc3BhY2Ug
SlNDOjpCMzo6QWlyCisKSW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9haXIvQWlyQXJn
LmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL2Fpci9BaXJBcmcuaAko
cmV2aXNpb24gMCkKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9haXIvQWlyQXJnLmgJKHdv
cmtpbmcgY29weSkKQEAgLTAsMCArMSw0MTIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTUg
QXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFu
ZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9k
aWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25k
aXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2Rl
IG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0
IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlz
dHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJp
Z2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93
aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBt
YXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09G
VFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQ
UkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRP
LCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5F
U1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVW
RU5UIFNIQUxMIEFQUExFIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFO
WSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBP
UiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAor
ICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBV
U0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VW
RVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4g
Q09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElH
RU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICog
T0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBT
VUNIIERBTUFHRS4gCisgKi8KKworI2lmbmRlZiBBaXJBcmdfaAorI2RlZmluZSBBaXJBcmdfaAor
CisjaW5jbHVkZSAiQWlyVG1wLmgiCisKK25hbWVzcGFjZSBKU0MgeyBuYW1lc3BhY2UgQjMgeyBu
YW1lc3BhY2UgQWlyIHsKKworLy8gVGhpcyBjbGFzcyBuYW1lIGlzIGFsc28gaW50ZW50aW9uYWxs
eSB0ZXJzZSBiZWNhdXNlIHdlIHdpbGwgc2F5IGl0IGEgbG90LiBZb3UnbGwgc2VlIGNvZGUgbGlr
ZQorLy8gSW5zdCguLi4sIEFyZzo6aW1tKDUpLCBBcmc6OmFkZHIodGhpbmcsIGJsYWgpLCAuLi4p
CitjbGFzcyBBcmcgeworcHVibGljOgorICAgIC8vIFRoZXNlIGVudW0gbWVtYmVycyBhcmUgaW50
ZW50aW9uYWxseSB0ZXJzZSBiZWNhdXNlIHdlIGhhdmUgdG8gbWVudGlvbiB0aGVtIGEgbG90Lgor
ICAgIGVudW0gS2luZCA6IGludDhfdCB7CisgICAgICAgIFRtcCwKKyAgICAgICAgSW1tLAorICAg
ICAgICBJbW1QdHIsCisgICAgICAgIEFkZHIsCisgICAgICAgIEluZGV4LAorICAgIH07CisKKyAg
ICBlbnVtIFJvbGUgOiBpbnQ4X3QgeworICAgICAgICBVc2UsCisgICAgICAgIERlZiwKKyAgICAg
ICAgVXNlRGVmCisgICAgfTsKKworICAgIGVudW0gVHlwZSA6IGludDhfdCB7CisgICAgICAgIEdQ
LAorICAgICAgICBGUAorICAgIH07CisKKyAgICBzdGF0aWMgYm9vbCBpc1VzZShSb2xlIHJvbGUp
CisgICAgeworICAgICAgICBzd2l0Y2ggKHJvbGUpIHsKKyAgICAgICAgY2FzZSBVc2U6CisgICAg
ICAgIGNhc2UgVXNlRGVmOgorICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIGNhc2Ug
RGVmOgorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgfQorCisgICAg
c3RhdGljIGJvb2wgaXNEZWYoUm9sZSByb2xlKQorICAgIHsKKyAgICAgICAgc3dpdGNoIChyb2xl
KSB7CisgICAgICAgIGNhc2UgVXNlOgorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAg
ICBjYXNlIERlZjoKKyAgICAgICAgY2FzZSBVc2VEZWY6CisgICAgICAgICAgICByZXR1cm4gdHJ1
ZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEFyZygpCisgICAgeworICAgIH0KKworICAgIEFy
ZyhBaXI6OlRtcCB0bXApCisgICAgICAgIDogbV9raW5kKFRtcCkKKyAgICAgICAgLCBtX2Jhc2Uo
dG1wKQorICAgIHsKKyAgICB9CisKKyAgICBzdGF0aWMgQXJnIGltbShpbnRwdHJfdCB2YWx1ZSkK
KyAgICB7CisgICAgICAgIEFyZyByZXN1bHQ7CisgICAgICAgIHJlc3VsdC5tX2tpbmQgPSBJbW07
CisgICAgICAgIHJlc3VsdC5tX29mZnNldCA9IHZhbHVlOworICAgICAgICByZXR1cm4gcmVzdWx0
OworICAgIH0KKworICAgIHN0YXRpYyBBcmcgaW1tUHRyKGludHB0cl90IHZhbHVlKQorICAgIHsK
KyAgICAgICAgQXJnIHJlc3VsdDsKKyAgICAgICAgcmVzdWx0Lm1fa2luZCA9IEltbVB0cjsKKyAg
ICAgICAgcmVzdWx0Lm1fb2Zmc2V0ID0gdmFsdWU7CisgICAgICAgIHJldHVybiByZXN1bHQ7Cisg
ICAgfQorCisgICAgc3RhdGljIEFyZyBhZGRyZXNzKEFpcjo6VG1wIGJhc2UsIGludDMyX3Qgb2Zm
c2V0ID0gMCkKKyAgICB7CisgICAgICAgIEFTU0VSVChiYXNlLmlzR1AoKSk7CisgICAgICAgIEFy
ZyByZXN1bHQ7CisgICAgICAgIHJlc3VsdC5tX2tpbmQgPSBBZGRyOworICAgICAgICByZXN1bHQu
bV9iYXNlID0gYmFzZTsKKyAgICAgICAgcmVzdWx0Lm1fb2Zmc2V0ID0gb2Zmc2V0OworICAgICAg
ICByZXR1cm4gcmVzdWx0OworICAgIH0KKworICAgIHN0YXRpYyBib29sIGlzVmFsaWRTY2FsZSh1
bnNpZ25lZCBzY2FsZSkKKyAgICB7CisgICAgICAgIHN3aXRjaCAoc2NhbGUpIHsKKyAgICAgICAg
Y2FzZSAxOgorICAgICAgICBjYXNlIDI6CisgICAgICAgIGNhc2UgNDoKKyAgICAgICAgY2FzZSA4
OgorICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAg
ICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBzdGF0aWMgdW5zaWduZWQg
bG9nU2NhbGUodW5zaWduZWQgc2NhbGUpCisgICAgeworICAgICAgICBzd2l0Y2ggKHNjYWxlKSB7
CisgICAgICAgIGNhc2UgMToKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICBjYXNlIDI6
CisgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgY2FzZSA0OgorICAgICAgICAgICAgcmV0
dXJuIDI7CisgICAgICAgIGNhc2UgODoKKyAgICAgICAgICAgIHJldHVybiAzOworICAgICAgICBk
ZWZhdWx0OgorICAgICAgICAgICAgQVNTRVJUX05PVF9SRUFDSEVEKCk7CisgICAgICAgICAgICBy
ZXR1cm4gMDsKKyAgICAgICAgfQorICAgIH0KKworICAgIHN0YXRpYyBBcmcgaW5kZXgoQWlyOjpU
bXAgYmFzZSwgQWlyOjpUbXAgaW5kZXgsIHVuc2lnbmVkIHNjYWxlID0gMSwgaW50MzJfdCBvZmZz
ZXQgPSAwKQorICAgIHsKKyAgICAgICAgQVNTRVJUKGJhc2UuaXNHUCgpKTsKKyAgICAgICAgQVNT
RVJUKGluZGV4LmlzR1AoKSk7CisgICAgICAgIEFTU0VSVChpc1ZhbGlkU2NhbGUoc2NhbGUpKTsK
KyAgICAgICAgQXJnIHJlc3VsdDsKKyAgICAgICAgcmVzdWx0Lm1fa2luZCA9IEluZGV4OworICAg
ICAgICByZXN1bHQubV9iYXNlID0gYmFzZTsKKyAgICAgICAgcmVzdWx0Lm1faW5kZXggPSBpbmRl
eDsKKyAgICAgICAgcmVzdWx0Lm1fc2NhbGUgPSBzdGF0aWNfY2FzdDx1aW50OF90PihzY2FsZSk7
CisgICAgICAgIHJlc3VsdC5tX29mZnNldCA9IG9mZnNldDsKKyAgICAgICAgcmV0dXJuIHJlc3Vs
dDsKKyAgICB9CisKKyAgICBib29sIG9wZXJhdG9yPT0oY29uc3QgQXJnJiBvdGhlcikgY29uc3QK
KyAgICB7CisgICAgICAgIHJldHVybiBtX29mZnNldCA9PSBvdGhlci5tX29mZnNldAorICAgICAg
ICAgICAgJiYgbV9raW5kID09IG90aGVyLm1fa2luZAorICAgICAgICAgICAgJiYgbV9iYXNlID09
IG90aGVyLm1fYmFzZQorICAgICAgICAgICAgJiYgbV9pbmRleCA9PSBvdGhlci5tX2luZGV4Cisg
ICAgICAgICAgICAmJiBtX3NjYWxlID09IG90aGVyLm1fc2NhbGU7CisgICAgfQorCisgICAgYm9v
bCBvcGVyYXRvciE9KGNvbnN0IEFyZyYgb3RoZXIpIGNvbnN0CisgICAgeworICAgICAgICByZXR1
cm4gISgqdGhpcyA9PSBvdGhlcik7CisgICAgfQorCisgICAgZXhwbGljaXQgb3BlcmF0b3IgYm9v
bCgpIGNvbnN0IHsgcmV0dXJuICp0aGlzICE9IEFyZygpOyB9CisKKyAgICBLaW5kIGtpbmQoKSBj
b25zdAorICAgIHsKKyAgICAgICAgcmV0dXJuIG1fa2luZDsKKyAgICB9CisKKyAgICBib29sIGlz
VG1wKCkgY29uc3QKKyAgICB7CisgICAgICAgIHJldHVybiBraW5kKCkgPT0gVG1wOworICAgIH0K
KworICAgIGJvb2wgaXNJbW0oKSBjb25zdAorICAgIHsKKyAgICAgICAgcmV0dXJuIGtpbmQoKSA9
PSBJbW07CisgICAgfQorCisgICAgYm9vbCBpc0ltbVB0cigpIGNvbnN0CisgICAgeworICAgICAg
ICByZXR1cm4ga2luZCgpID09IEltbVB0cjsKKyAgICB9CisKKyAgICBib29sIGlzQWRkcigpIGNv
bnN0CisgICAgeworICAgICAgICByZXR1cm4ga2luZCgpID09IEFkZHI7CisgICAgfQorCisgICAg
Ym9vbCBpc0luZGV4KCkgY29uc3QKKyAgICB7CisgICAgICAgIHJldHVybiBraW5kKCkgPT0gSW5k
ZXg7CisgICAgfQorCisgICAgQWlyOjpUbXAgdG1wKCkgY29uc3QKKyAgICB7CisgICAgICAgIEFT
U0VSVChraW5kKCkgPT0gVG1wKTsKKyAgICAgICAgcmV0dXJuIG1fYmFzZTsKKyAgICB9CisKKyAg
ICBpbnRwdHJfdCB2YWx1ZSgpIGNvbnN0CisgICAgeworICAgICAgICBBU1NFUlQoa2luZCgpID09
IEltbSB8fCBraW5kKCkgPT0gSW1tUHRyKTsKKyAgICAgICAgcmV0dXJuIG1fb2Zmc2V0OworICAg
IH0KKworICAgIEFpcjo6VG1wIGJhc2UoKSBjb25zdAorICAgIHsKKyAgICAgICAgQVNTRVJUKGtp
bmQoKSA9PSBBZGRyIHx8IGtpbmQoKSA9PSBJbmRleCk7CisgICAgICAgIHJldHVybiBtX2Jhc2U7
CisgICAgfQorCisgICAgaW50MzJfdCBvZmZzZXQoKSBjb25zdAorICAgIHsKKyAgICAgICAgQVNT
RVJUKGtpbmQoKSA9PSBBZGRyIHx8IGtpbmQoKSA9PSBJbmRleCk7CisgICAgICAgIHJldHVybiBz
dGF0aWNfY2FzdDxpbnQzMl90PihtX29mZnNldCk7CisgICAgfQorCisgICAgQWlyOjpUbXAgaW5k
ZXgoKSBjb25zdAorICAgIHsKKyAgICAgICAgQVNTRVJUKGtpbmQoKSA9PSBJbmRleCk7CisgICAg
ICAgIHJldHVybiBtX2luZGV4OworICAgIH0KKworICAgIHVuc2lnbmVkIHNjYWxlKCkgY29uc3QK
KyAgICB7CisgICAgICAgIEFTU0VSVChraW5kKCkgPT0gSW5kZXgpOworICAgICAgICByZXR1cm4g
bV9zY2FsZTsKKyAgICB9CisKKyAgICB1bnNpZ25lZCBsb2dTY2FsZSgpIGNvbnN0CisgICAgewor
ICAgICAgICByZXR1cm4gbG9nU2NhbGUoc2NhbGUoKSk7CisgICAgfQorCisgICAgYm9vbCBpc0dQ
VG1wKCkgY29uc3QKKyAgICB7CisgICAgICAgIHJldHVybiBpc1RtcCgpICYmIHRtcCgpLmlzR1Ao
KTsKKyAgICB9CisKKyAgICBib29sIGlzRlBUbXAoKSBjb25zdAorICAgIHsKKyAgICAgICAgcmV0
dXJuIGlzVG1wKCkgJiYgdG1wKCkuaXNGUCgpOworICAgIH0KKyAgICAKKyAgICAvLyBUZWxscyB1
cyBpZiB0aGlzIEFyZyBjYW4gYmUgdXNlZCBpbiBhIHBvc2l0aW9uIHRoYXQgcmVxdWlyZXMgYSBH
UCB2YWx1ZS4KKyAgICBib29sIGlzR1AoKSBjb25zdAorICAgIHsKKyAgICAgICAgc3dpdGNoIChr
aW5kKCkpIHsKKyAgICAgICAgY2FzZSBJbW06CisgICAgICAgIGNhc2UgSW1tUHRyOgorICAgICAg
ICBjYXNlIEFkZHI6CisgICAgICAgIGNhc2UgSW5kZXg6CisgICAgICAgICAgICByZXR1cm4gdHJ1
ZTsKKyAgICAgICAgY2FzZSBUbXA6CisgICAgICAgICAgICByZXR1cm4gaXNHUFRtcCgpOworICAg
ICAgICB9CisgICAgfQorCisgICAgLy8gVGVsbHMgdXMgaWYgdGhpcyBBcmcgY2FuIGJlIHVzZWQg
aW4gYSBwb3NpdGlvbiB0aGF0IHJlcXVpcmVzIGEgRlAgdmFsdWUuCisgICAgYm9vbCBpc0ZQKCkg
Y29uc3QKKyAgICB7CisgICAgICAgIHN3aXRjaCAoa2luZCgpKSB7CisgICAgICAgIGNhc2UgSW1t
OgorICAgICAgICBjYXNlIEltbVB0cjoKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAg
ICAgY2FzZSBBZGRyOgorICAgICAgICBjYXNlIEluZGV4OgorICAgICAgICBjYXNlIEJhc2U6Cisg
ICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgY2FzZSBUbXA6CisgICAgICAgICAgICBy
ZXR1cm4gaXNGUFRtcCgpOworICAgICAgICB9CisgICAgfQorCisgICAgYm9vbCBpc0dQUigpIGNv
bnN0CisgICAgeworICAgICAgICByZXR1cm4gaXNUbXAoKSAmJiB0bXAoKS5pc0dQUigpOworICAg
IH0KKworICAgIEdQUlJlZyBncHIoKSBjb25zdAorICAgIHsKKyAgICAgICAgcmV0dXJuIHRtcCgp
LmdwcigpOworICAgIH0KKworICAgIGJvb2wgaXNGUFIoKSBjb25zdAorICAgIHsKKyAgICAgICAg
cmV0dXJuIGlzVG1wKCkgJiYgdG1wKCkuaXNGUFIoKTsKKyAgICB9CisKKyAgICBGUFJSZWcgZnBy
KCkgY29uc3QKKyAgICB7CisgICAgICAgIHJldHVybiB0bXAoKS5mcHIoKTsKKyAgICB9CisgICAg
CisgICAgYm9vbCBpc1JlZygpIGNvbnN0CisgICAgeworICAgICAgICByZXR1cm4gaXNUbXAoKSAm
JiB0bXAoKS5pc1JlZygpOworICAgIH0KKworICAgIFJlZyByZWcoKSBjb25zdAorICAgIHsKKyAg
ICAgICAgcmV0dXJuIHRtcCgpLnJlZygpOworICAgIH0KKworICAgIHVuc2lnbmVkIGdwVG1wSW5k
ZXgoKSBjb25zdAorICAgIHsKKyAgICAgICAgcmV0dXJuIHRtcCgpLmdwVG1wSW5kZXgoKTsKKyAg
ICB9CisKKyAgICB1bnNpZ25lZCBmcFRtcEluZGV4KCkgY29uc3QKKyAgICB7CisgICAgICAgIHJl
dHVybiB0bXAoKS5mcFRtcEluZGV4KCk7CisgICAgfQorCisgICAgdW5zaWduZWQgdG1wSW5kZXgo
KSBjb25zdAorICAgIHsKKyAgICAgICAgcmV0dXJuIHRtcCgpLnRtcEluZGV4KCk7CisgICAgfQor
CisgICAgdGVtcGxhdGU8dHlwZW5hbWUgRnVuY3Rvcj4KKyAgICB2b2lkIGZvckVhY2hUbXBGYXN0
KGNvbnN0IEZ1bmN0b3ImIGZ1bmN0b3IpCisgICAgeworICAgICAgICBzd2l0Y2ggKG1fa2luZCkg
eworICAgICAgICBjYXNlIFRtcDoKKyAgICAgICAgY2FzZSBBZGRyOgorICAgICAgICAgICAgZnVu
Y3RvcihtX2Jhc2UpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgSW5kZXg6Cisg
ICAgICAgICAgICBmdW5jdG9yKG1fYmFzZSk7CisgICAgICAgICAgICBmdW5jdG9yKG1faW5kZXgp
OworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBicmVh
azsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIFRoaXMgaXMgc21hcnQgZW5vdWdoIHRvIGtu
b3cgdGhhdCBhbiBhZGRyZXNzIGFyZyBpbiBhIERlZiBvciBVc2VEZWYgcnVsZSB3aWxsIHVzZSBp
dHMKKyAgICAvLyB0bXBzIGFuZCBuZXZlciBkZWYgdGhlbS4gRm9yIGV4YW1wbGUsIHRoaXM6Cisg
ICAgLy8KKyAgICAvLyBtb3YgJXJheCwgKCVyY3gpCisgICAgLy8KKyAgICAvLyBUaGlzIGRlZnMg
KCVyY3gpIGJ1dCB1c2VzICVyY3guCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgRnVuY3Rvcj4KKyAg
ICB2b2lkIGZvckVhY2hUbXAoUm9sZSBhcmdSb2xlLCBUeXBlIGFyZ1R5cGUsIGNvbnN0IEZ1bmN0
b3ImIGZ1bmN0b3IpCisgICAgeworICAgICAgICBzd2l0Y2ggKG1fa2luZCkgeworICAgICAgICBj
YXNlIFRtcDoKKyAgICAgICAgICAgIGZ1bmN0b3IobV9iYXNlLCBhcmdSb2xlLCBhcmdUeXBlKTsK
KyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEFkZHI6CisgICAgICAgICAgICBmdW5j
dG9yKG1fYmFzZSwgVXNlLCBHUCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBJ
bmRleDoKKyAgICAgICAgICAgIGZ1bmN0b3IobV9iYXNlLCBVc2UsIEdQKTsKKyAgICAgICAgICAg
IGZ1bmN0b3IobV9pbmRleCwgVXNlLCBHUCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAg
ZGVmYXV0OgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBNYWNy
b0Fzc2VtYmxlcjo6VHJ1c3RlZEltbTMyIGFzVHJ1c3RlZEltbTMyKCkgY29uc3QKKyAgICB7Cisg
ICAgICAgIEFTU0VSVChpc0ltbSgpKTsKKyAgICAgICAgcmV0dXJuIE1hY3JvQXNzZW1ibGVyOjpU
cnVzdGVkSW1tMzIoc3RhdGljX2Nhc3Q8aW50MzJfdD4obV9vZmZzZXQpKTsKKyAgICB9CisKKyAg
ICBNYWNyb0Fzc2VtYmxlcjo6VHJ1c3RlZEltbTMyIGFzVHJ1c3RlZEltbVB0cigpIGNvbnN0Cisg
ICAgeworICAgICAgICBBU1NFUlQoaXNJbW1QdHIoKSk7CisgICAgICAgIHJldHVybiBNYWNyb0Fz
c2VtYmxlcjo6VHJ1c3RlZEltbVB0cihtX29mZnNldCk7CisgICAgfQorCisgICAgTWFjcm9Bc3Nl
bWJsZXI6OkFkZHJlc3MgYXNBZGRyZXNzKCkgY29uc3QKKyAgICB7CisgICAgICAgIEFTU0VSVChp
c0FkZHIoKSk7CisgICAgICAgIHJldHVybiBNYWNyb0Fzc2VtYmxlcjo6QWRkcmVzcyhtX2Jhc2Uu
Z3ByKCksIHN0YXRpY19jYXN0PGludDMyX3Q+KG1fb2Zmc2V0KSk7CisgICAgfQorCisgICAgTWFj
cm9Bc3NlbWJsZXI6OkJhc2VJbmRleCBhc0Jhc2VJbmRleCgpIGNvbnN0CisgICAgeworICAgICAg
ICBBU1NFUlQoaXNJbmRleCgpKTsKKyAgICAgICAgcmV0dXJuIE1hY3JvQXNzZW1ibGVyOjpCYXNl
SW5kZXgoCisgICAgICAgICAgICBtX2Jhc2UuZ3ByKCksIG1faW5kZXguZ3ByKCksIHN0YXRpY19j
YXN0PE1hY3JvQXNzZW1ibGVyOjpTY2FsZT4obG9nU2NhbGUoKSksCisgICAgICAgICAgICBzdGF0
aWNfY2FzdDxpbnQzMl90PihtX29mZnNldCkpOworICAgIH0KKworICAgIHZvaWQgZHVtcChQcmlu
dFN0cmVhbSYpIGNvbnN0OworCitwcml2YXRlOgorICAgIGludHB0cl90IG1fb2Zmc2V0IHsgMCB9
OworICAgIEtpbmQgbV9raW5kIHsgSW1tIH07CisgICAgdWludDhfdCBtX3NjYWxlIHsgMSB9Owor
ICAgIEFpcjo6VG1wIG1fYmFzZTsKKyAgICBBaXI6OlRtcCBtX2luZGV4OworfTsKKworfSB9IH0g
Ly8gbmFtZXNwYWNlIEpTQzo6QjM6OkFpcgorCisjZW5kaWYgLy8gQWlyQXJnX2gKKwpJbmRleDog
U291cmNlL0phdmFTY3JpcHRDb3JlL2IzL2Fpci9BaXJCYXNpY0Jsb2NrLmNwcAo9PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvYWlyL0FpckJhc2ljQmxvY2suY3BwCShyZXZp
c2lvbiAwKQorKysgU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL2Fpci9BaXJCYXNpY0Jsb2NrLmNw
cAkod29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDQ0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAy
MDE1IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlv
biBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAq
IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcg
Y29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2Ug
Y29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMg
bGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBS
ZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNv
cHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZv
bGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3Ro
ZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElT
IFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAq
IEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRF
RCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBG
SVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBO
TyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZP
UiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFS
WSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBU
TywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1Mg
T0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBI
T1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVS
IElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5F
R0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UK
KyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkg
T0YgU1VDSCBEQU1BR0UuIAorICovCisKKyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJB
aXJCYXNpY0Jsb2NrLmgiCisKK25hbWVzcGFjZSBKU0MgeyBuYW1lc3BhY2UgQjMgeyBuYW1lc3Bh
Y2UgQWlyIHsKKwordm9pZCBCYXNpY0Jsb2NrOjpkdW1wKFByaW50U3RyZWFtJiBvdXQpIGNvbnN0
Cit7CisgICAgb3V0LnByaW50KGR1bXBQcmVmaXgsIG1faW5kZXgpOworfQorCit2b2lkIEJhc2lj
QmxvY2s6OmRlZXBEdW1wKFByaW50U3RyZWFtJiBvdXQpIGNvbnN0Cit7CisgICAgb3V0LnByaW50
KCJCQiIsICp0aGlzLCAiOlxuIik7CisgICAgZm9yIChjb25zdCBJbnN0JiBpbnN0IDogKnRoaXMp
CisgICAgICAgIG91dC5wcmludCgiICAgICIsIGluc3QsICJcbiIpOworfQorCit9IH0gfSAvLyBu
YW1lc3BhY2UgSlNDOjpCMzo6QWlyCisKSW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9h
aXIvQWlyQmFzaWNCbG9jay5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9i
My9haXIvQWlyQmFzaWNCbG9jay5oCShyZXZpc2lvbiAwKQorKysgU291cmNlL0phdmFTY3JpcHRD
b3JlL2IzL2Fpci9BaXJCYXNpY0Jsb2NrLmgJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSwxMTUg
QEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTUgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2Vy
dmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkg
Zm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHBy
b3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4g
UmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5
cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xs
b3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBt
dXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlz
dCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAg
ICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUg
ZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUg
SU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMs
IElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElF
UyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVS
UE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IKKyAq
IENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVO
VEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElO
Q0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVU
RSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBP
UiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZ
CisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFks
IE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcg
SU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBB
RFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKworI2lmbmRl
ZiBBaXJCYXNpY0Jsb2NrX2gKKyNkZWZpbmUgQWlyQmFzaWNCbG9ja19oCisKKyNpbmNsdWRlICJB
aXJJbnN0LmgiCisjaW5jbHVkZSA8d3RmL05vbkNvcHlhYmxlLmg+CisjaW5jbHVkZSA8d3RmL0Zh
c3RNYWxsb2MuaD4KKworbmFtZXNwYWNlIEpTQyB7IG5hbWVzcGFjZSBCMyB7IG5hbWVzcGFjZSBB
aXIgeworCitjbGFzcyBDb2RlOworCitjbGFzcyBCYXNpY0Jsb2NrIHsKKyAgICBXVEZfTUFLRV9O
T05DT1BZQUJMRShCYXNpY0Jsb2NrKTsKKyAgICBXVEZfTUFLRV9GQVNUX0FMTE9DQVRFRDsKK3B1
YmxpYzoKKyAgICBzdGF0aWMgY29uc3QgY2hhciogZHVtcFByZWZpeCA9ICIjIjsKKworICAgIHR5
cGVkZWYgVmVjdG9yPEluc3Q+IEluc3RMaXN0OworICAgIHR5cGVkZWYgVmVjdG9yPEJhc2ljQmxv
Y2sqLCAyPiBTdWNjZXNzb3JMaXN0OworICAgIAorICAgIHVuc2lnbmVkIHNpemUoKSBjb25zdCB7
IHJldHVybiBtX2luc3RzLnNpemUoKTsgfQorICAgIEluc3RMaXN0OjppdGVyYXRvciBiZWdpbigp
IHsgcmV0dXJuIG1faW5zdHMuYmVnaW4oKTsgfQorICAgIEluc3RMaXN0OjppdGVyYXRvciBlbmQo
KSB7IHJldHVybiBtX2luc3RzLmVuZCgpOyB9CisgICAgSW5zdExpc3Q6OmNvbnN0X2l0ZXJhdG9y
IGJlZ2luKCkgY29uc3QgeyByZXR1cm4gbV9pbnN0cy5iZWdpbigpOyB9CisgICAgSW5zdExpc3Q6
OmNvbnN0X2l0ZXJhdG9yIGVuZCgpIGNvbnN0IHsgcmV0dXJuIG1faW5zdHMuZW5kKCk7IH0KKwor
ICAgIHNpemVfdCBzaXplKCkgY29uc3QgeyByZXR1cm4gbV9pbnN0cy5zaXplKCk7IH0KKyAgICBj
b25zdCBJbnN0JiBhdChzaXplX3QgaW5kZXgpIGNvbnN0IHsgcmV0dXJuIG1faW5zdHNbaW5kZXhd
OyB9CisgICAgSW5zdCYgYXQoc2l6ZV90IGluZGV4KSB7IHJldHVybiBtX2luc3RzW2luZGV4XTsg
fQorCisgICAgY29uc3QgSW5zdCYgbGFzdCgpIGNvbnN0IHsgcmV0dXJuIG1faW5zdHMubGFzdCgp
OyB9CisgICAgSW5zdCYgbGFzdCgpIHsgcmV0dXJuIG1faW5zdHMubGFzdCgpOyB9CisKKyAgICB0
ZW1wbGF0ZTx0eXBlbmFtZS4uLiBBcmd1bWVudHM+CisgICAgdm9pZCBhcHBlbmQoQXJndW1lbnRz
JiYuLi4gYXJndW1lbnRzKQorICAgIHsKKyAgICAgICAgbV9pbnN0cy5hcHBlbmQoSW5zdChzdGQ6
OmZvcndhcmQoYXJndW1lbnRzKS4uLikpOworICAgIH0KKworICAgIC8vIFRoZSAiMCIgY2FzZSBp
cyB0aGUgY2FzZSB0byB3aGljaCB0aGUgYnJhbmNoIGp1bXBzLCBzbyB0aGUgInRoZW4iIGNhc2Uu
IFRoZSAiMSIgY2FzZSBpcyB0aGUKKyAgICAvLyAiZWxzZSIgY2FzZSwgYW5kIGlzIHVzZWQgdG8g
cmVwcmVzZW50IHRoZSBmYWxsLXRocm91Z2ggb2YgYSBjb25kaXRpb25hbCBicmFuY2guCisgICAg
dW5zaWduZWQgbnVtU3VjY2Vzc29ycygpIGNvbnN0IHsgcmV0dXJuIG1fc3VjY2Vzc29ycy5zaXpl
KCk7IH0KKyAgICBCYXNpY0Jsb2NrKiBzdWNjZXNzb3IodW5zaWduZWQgaW5kZXgpIGNvbnN0IHsg
cmV0dXJuIG1fc3VjY2Vzc29yc1tpbmRleF07IH0KKyAgICBCYXNpY0Jsb2NrKiYgc3VjY2Vzc29y
KHVuc2lnbmVkIGluZGV4KSB7IHJldHVybiBtX3N1Y2Nlc3NvcnNbaW5kZXhdOyB9CisgICAgY29u
c3QgU3VjY2Vzc29yTGlzdCYgc3VjY2Vzc29ycygpIGNvbnN0IHsgcmV0dXJuIG1fc3VjY2Vzc29y
c1tpbmRleF07IH0KKyAgICBTdWNjZXNzb3JMaXN0JiBzdWNjZXNzb3JzKCkgeyByZXR1cm4gbV9z
dWNjZXNzb3JzW2luZGV4XTsgfQorCisgICAgdm9pZCBkdW1wKFByaW50U3RyZWFtJikgY29uc3Q7
CisgICAgdm9pZCBkZWVwRHVtcChQcmludFN0cmVhbSYpIGNvbnN0OworCitwcml2YXRlOgorICAg
IGZyaWVuZCBjbGFzcyBDb2RlOworICAgIAorICAgIEJhc2ljQmxvY2sodW5zaWduZWQgaW5kZXgp
CisgICAgeworICAgIH0KKworICAgIHVuc2lnbmVkIG1faW5kZXg7CisgICAgSW5zdExpc3QgbV9p
bnN0czsKKyAgICBTdWNjZXNzb3JMaXN0IG1fc3VjY2Vzc29yczsKK307CisKK2NsYXNzIERlZXBC
YXNpY0Jsb2NrRHVtcCB7CitwdWJsaWM6CisgICAgRGVlcEJhc2ljQmxvY2tEdW1wKEJhc2ljQmxv
Y2sqIGJsb2NrKQorICAgICAgICA6IG1fYmxvY2soYmxvY2spCisgICAgeworICAgIH0KKworICAg
IHZvaWQgZHVtcChQcmludFN0cmVhbSYgb3V0KSBjb25zdAorICAgIHsKKyAgICAgICAgaWYgKG1f
YmxvY2spCisgICAgICAgICAgICBtX2Jsb2NrLT5kZWVwRHVtcChvdXQpOworICAgICAgICBlbHNl
CisgICAgICAgICAgICBvdXQucHJpbnQoIjxudWxsPiIpOworICAgIH0KKworcHJpdmF0ZToKKyAg
ICBCYXNpY0Jsb2NrKiBtX2Jsb2NrOworfTsKKworRGVlcEJhc2ljQmxvY2tEdW1wIGRlZXBEdW1w
KEJhc2ljQmxvY2sqIGJsb2NrKQoreworICAgIHJldHVybiBEZWVwQmFzaWNCbG9ja0R1bXAoYmxv
Y2spOworfQorCit9IH0gfSAvLyBuYW1lc3BhY2UgSlNDOjpCMzo6QWlyCisKKyNlbmRpZiAvLyBB
aXJCYXNpY0Jsb2NrX2gKKwpJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL2Fpci9BaXJD
b2RlLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvYWlyL0FpckNv
ZGUuY3BwCShyZXZpc2lvbiAwKQorKysgU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL2Fpci9BaXJD
b2RlLmNwcAkod29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDU0IEBACisvKgorICogQ29weXJpZ2h0
IChDKSAyMDE1IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3Ry
aWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhv
dXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xs
b3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBz
b3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2Us
IHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisg
KiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFi
b3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQg
dGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQv
b3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisg
KiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBB
TlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1Qg
TElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZ
IEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQu
ICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElB
QkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVY
RU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElN
SVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7
IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBU
SU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBX
SEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVE
SU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRI
RSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lC
SUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisKKyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNs
dWRlICJBaXJDb2RlLmgiCisKK25hbWVzcGFjZSBKU0MgeyBuYW1lc3BhY2UgQjMgeyBuYW1lc3Bh
Y2UgQWlyIHsKKworQ29kZTo6Q29kZSgpCit7Cit9CisKK0NvZGU6On5Db2RlKCkKK3sKK30KKwor
QmFzaWNCbG9jayogQ29kZTo6YWRkQmxvY2soKQoreworICAgIHN0ZDo6dW5pcXVlX3B0cjxCYXNp
Y0Jsb2NrPiBibG9jayhuZXcgQmFzaWNCbG9jayhtX2Jsb2Nrcy5zaXplKCkpKTsKKyAgICBCYXNp
Y0Jsb2NrKiByZXN1bHQgPSBibG9jay5nZXQoKTsKKyAgICBtX2Jsb2Nrcy5hcHBlbmQoV1RGOjpt
b3ZlKGJsb2NrKSk7CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKwordm9pZCBDb2RlOjpkdW1wKFBy
aW50U3RyZWFtJiBvdXQpIGNvbnN0Cit7CisgICAgZm9yIChCYXNpY0Jsb2NrKiBibG9jayA6ICp0
aGlzKQorICAgICAgICBvdXQucHJpbnQoZGVlcER1bXAoYmxvY2spKTsKK30KKworfSB9IH0gLy8g
bmFtZXNwYWNlIEpTQzo6QjM6OkFpcgorCkluZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMv
YWlyL0FpckNvZGUuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvYWly
L0FpckNvZGUuaAkocmV2aXNpb24gMCkKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9haXIv
QWlyQ29kZS5oCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsMTA1IEBACisvKgorICogQ29weXJp
Z2h0IChDKSAyMDE1IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRp
c3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdp
dGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBm
b2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBv
ZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3Rp
Y2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIu
CisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhl
IGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBh
bmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBh
bmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAq
CisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFO
RCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBO
T1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklM
SVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlN
RUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUg
TElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAq
IEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1Qg
TElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklD
RVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJS
VVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZ
LCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5D
TFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9G
IFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9T
U0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisKKyNpZm5kZWYgQWlyQ29kZV9oCisjZGVm
aW5lIEFpckNvZGVfaAorCisjaW5jbHVkZSAiQWlyQmFzaWNCbG9jay5oIgorCituYW1lc3BhY2Ug
SlNDIHsgbmFtZXNwYWNlIEIzIHsgbmFtZXNwYWNlIEFpciB7CisKK2NsYXNzIENvZGUgeworICAg
IFdURl9NQUtFX05PTkNPUFlBQkxFKENvZGUpOworICAgIFdURl9NQUtFX0ZBU1RfQUxMT0NBVEVE
OworcHVibGljOgorICAgIENvZGUoKTsKKyAgICB+Q29kZSgpOworCisgICAgQmFzaWNCbG9jayog
YWRkQmxvY2soKTsKKworICAgIHZvaWQgZHVtcChQcmludFN0cmVhbSYpIGNvbnN0OworCisgICAg
dW5zaWduZWQgc2l6ZSgpIGNvbnN0IHsgcmV0dXJuIG1fYmxvY2tzLnNpemUoKTsgfQorICAgIEJh
c2ljQmxvY2sqIGF0KHVuc2lnbmVkIGluZGV4KSBjb25zdCB7IHJldHVybiBtX2Jsb2Nrc1tpbmRl
eF07IH0KKyAgICBCYXNpY0Jsb2NrKiBvcGVyYXRvcltdKHVuc2lnbmVkIGluZGV4KSBjb25zdCB7
IHJldHVybiBhdChpbmRleCk7IH0KKworICAgIGNsYXNzIGl0ZXJhdG9yIHsKKyAgICBwdWJsaWM6
CisgICAgICAgIGl0ZXJhdG9yKCk6CisgICAgICAgICAgICA6IG1fcHJvY2VkdXJlKG51bGxwdHIp
CisgICAgICAgICAgICAsIG1faW5kZXgoMCkKKyAgICAgICAgeworICAgICAgICB9CisKKyAgICAg
ICAgaXRlcmF0b3IoUHJvY2VkdXJlJiBwcm9jZWR1cmUsIHVuc2lnbmVkIGluZGV4KQorICAgICAg
ICAgICAgOiBtX3Byb2NlZHVyZSgmcHJvY2VkdXJlKQorICAgICAgICAgICAgLCBtX2luZGV4KGlu
ZGV4KQorICAgICAgICB7CisgICAgICAgIH0KKworICAgICAgICBCYXNpY0Jsb2NrKiBvcGVyYXRv
ciooKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gbV9wcm9jZWR1cmUtPmF0KG1faW5k
ZXgpOworICAgICAgICB9CisKKyAgICAgICAgaXRlcmF0b3ImIG9wZXJhdG9yKysoKQorICAgICAg
ICB7CisgICAgICAgICAgICBtX2luZGV4ID0gZmluZE5leHQobV9pbmRleCArIDEpOworICAgICAg
ICAgICAgcmV0dXJuICp0aGlzOworICAgICAgICB9CisKKyAgICAgICAgYm9vbCBvcGVyYXRvcj09
KGNvbnN0IGl0ZXJhdG9yJiBvdGhlcikgY29uc3QKKyAgICAgICAgeworICAgICAgICAgICAgcmV0
dXJuIG1faW5kZXggPT0gb3RoZXIubV9pbmRleDsKKyAgICAgICAgfQorCisgICAgICAgIGJvb2wg
b3BlcmF0b3IhPShjb25zdCBpdGVyYXRvciYgb3RoZXIpIGNvbnN0CisgICAgICAgIHsKKyAgICAg
ICAgICAgIHJldHVybiAhKCp0aGlzID09IG90aGVyKTsKKyAgICAgICAgfQorCisgICAgcHJpdmF0
ZToKKyAgICAgICAgdW5zaWduZWQgZmluZE5leHQodW5zaWduZWQgaW5kZXgpCisgICAgICAgIHsK
KyAgICAgICAgICAgIHdoaWxlIChpbmRleCA8IG1fcHJvY2VkdXJlLT5zaXplKCkgJiYgIW1fcHJv
Y2VkdXJlLT5hdChpbmRleCkpCisgICAgICAgICAgICAgICAgaW5kZXgrKzsKKyAgICAgICAgICAg
IHJldHVybiBpbmV4OworICAgICAgICB9CisKKyAgICAgICAgUHJvY2VkdXJlKiBtX3Byb2NlZHVy
ZTsKKyAgICAgICAgdW5zaWduZWQgbV9pbmRleDsKKyAgICB9OworCisgICAgaXRlcmF0b3IgYmVn
aW4oKSBjb25zdCB7IHJldHVybiBpdGVyYXRvcigqdGhpcywgMCk7IH0KKyAgICBpdGVyYXRvciBl
bmQoKSBjb25zdCB7IHJldHVybiBpdGVyYXRvcigqdGhpcywgbnVtQmxvY2tzKCkpOyB9CisKK3By
aXZhdGU6CisgICAgVmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxCYXNpY0Jsb2NrPj4gbV9ibG9ja3M7
Cit9OworCit9IH0gfSAvLyBuYW1lc3BhY2UgSlNDOjpCMzo6QWlyCisKKyNlbmRpZiAvLyBBaXJD
b2RlX2gKKwpJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL2Fpci9BaXJJbnN0LmNwcAo9
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvYWlyL0Fpckluc3QuY3BwCShy
ZXZpc2lvbiAwKQorKysgU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL2Fpci9BaXJJbnN0LmNwcAko
d29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDQwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE1
IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBh
bmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1v
ZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29u
ZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29k
ZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlz
dCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRp
c3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHly
aWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxv
d2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIg
bWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNP
RlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVY
UFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBU
TywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRO
RVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBF
VkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBB
TlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwg
T1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywK
KyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0Yg
VVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dF
VkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElO
IENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJ
R0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAq
IE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0Yg
U1VDSCBEQU1BR0UuIAorICovCisKKyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJBaXJJ
bnN0LmgiCisKKyNpbmNsdWRlICJCM1ZhbHVlLmgiCisjaW5jbHVkZSA8d3RmL0xpc3REdW1wLmg+
CisKK25hbWVzcGFjZSBKU0MgeyBuYW1lc3BhY2UgQjMgeyBuYW1lc3BhY2UgQWlyIHsKKwordm9p
ZCBJbnN0OjpkdW1wKFByaW50U3RyZWFtJiBvdXQpIGNvbnN0Cit7CisgICAgb3V0LnByaW50KG9w
Y29kZSwgIiAiLCBsaXN0RHVtcChhcmdzKSwgIiAgOyAiLCAqb3JpZ2luKTsKK30KKworfSB9IH0g
Ly8gbmFtZXNwYWNlIEpTQzo6QjM6OkFpcgorCkluZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUv
YjMvYWlyL0Fpckluc3QuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMv
YWlyL0Fpckluc3QuaAkocmV2aXNpb24gMCkKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9h
aXIvQWlySW5zdC5oCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsMTIzIEBACisvKgorICogQ29w
eXJpZ2h0IChDKSAyMDE1IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBS
ZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9y
IHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRo
ZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9u
cyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBu
b3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWlt
ZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2Ug
dGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9u
cyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlv
biBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4K
KyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycn
IEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJV
VCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRB
QklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NM
QUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMg
QkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwK
KyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBO
T1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VS
VklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5U
RVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklM
SVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAo
SU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VU
IE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUg
UE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisKKyNpZm5kZWYgQWlySW5zdF9oCisj
ZGVmaW5lIEFpckluc3RfaAorCisjaW5jbHVkZSAiQWlyQXJnLmgiCisjaW5jbHVkZSAiQWlyT3Bj
b2RlLmgiCisKK25hbWVzcGFjZSBKU0MgeyBuYW1lc3BhY2UgQjMgeworCitjbGFzcyBWYWx1ZTsK
KworbmFtZXNwYWNlIEFpciB7CisKK3N0cnVjdCBJbnN0IHsKK3B1YmxpYzoKKyAgICB0eXBlZGVm
IFZlY3RvcjxBcmcsIDM+IEFyZ0xpc3Q7CisKKyAgICBJbnN0KE9wY29kZSBvcGNvZGUsIFZhbHVl
KiBvcmlnaW4pCisgICAgICAgIDogb3Bjb2RlKG9wY29kZSkKKyAgICAgICAgLCBvcmlnaW4ob3Jp
Z2luKQorICAgIHsKKyAgICB9CisgICAgCisgICAgdGVtcGxhdGU8dHlwZW5hbWUuLi4gQXJndW1l
bnRzPgorICAgIEluc3QoT3Bjb2RlIG9wY29kZSwgVmFsdWUqIG9yaWdpbiwgQXJnIGFyZywgQXJn
dW1lbnRzLi4uIGFyZ3VtZW50cykKKyAgICAgICAgOiBvcGNvZGUob3Bjb2RlKQorICAgICAgICAs
IGFyZ3N7IGFyZywgYXJndW1lbnRzLi4uIH0KKyAgICAgICAgLCBvcmlnaW4ob3JpZ2luKQorICAg
IHsKKyAgICB9CisKKyAgICBJbnN0KE9wY29kZSBvcGNvZGUsIFZhbHVlKiBvcmlnaW4sIGNvbnN0
IEFyZ0xpc3QmIGFyZ3VtZW50cykKKyAgICAgICAgOiBvcGNvZGUob3Bjb2RlKQorICAgICAgICAs
IGFyZ3MoYXJncykKKyAgICAgICAgLCBvcmlnaW4ob3JpZ2luKQorICAgIHsKKyAgICB9CisKKyAg
ICAvLyBOb3RlIHRoYXQgdGhlc2UgZnVuY3RvcnMgYWxsIGF2b2lkIHVzaW5nICJjb25zdCIgYmVj
YXVzZSB3ZSB3YW50IHRvIHVzZSB0aGVtIGZvciB0aGluZ3MgdGhhdAorICAgIC8vIGVkaXQgSVIu
IElSIGlzIG1lYW50IHRvIGJlIGVkaXRlZDsgaWYgeW91J3JlIGNhcnJ5aW5nIGFyb3VuZCBhICJj
b25zdCBJbnN0JiIgdGhlbiB5b3UncmUKKyAgICAvLyBwcm9iYWJseSBkb2luZyBpdCB3cm9uZy4K
KworICAgIC8vIFRoaXMgb25seSB3YWxrcyB0aG9zZSBUbXBzIHRoYXQgYXJlIGV4cGxpY2l0bHkg
bWVudGlvbmVkLCBhbmQgaXQgZG9lc24ndCB0ZWxsIHlvdSB0aGVpciByb2xlCisgICAgLy8gb3Ig
dHlwZS4KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBGdW5jdG9yPgorICAgIHZvaWQgZm9yRWFjaFRt
cEZhc3QoY29uc3QgRnVuY3RvciYgZnVuY3RvcikKKyAgICB7CisgICAgICAgIGZvciAoQXJnIGFy
ZyA6IGFyZ3MpCisgICAgICAgICAgICBhcmcuZm9yRWFjaFRtcEZhc3QoZnVuY3Rvcik7CisgICAg
fQorCisgICAgLy8gQ2FsbHMgdGhlIGZ1bmN0b3Igd2l0aCAoYXJnLCByb2xlLCB0eXBlKS4gVGhp
cyBmdW5jdGlvbiBpcyBhdXRvLWdlbmVyYXRlZCBieQorICAgIC8vIG9wY29kZV9nZW5lcmF0b3Iu
cmIuCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgRnVuY3Rvcj4KKyAgICB2b2lkIGZvckVhY2hBcmco
Y29uc3QgRnVuY3RvciYgZnVuY3Rvcik7CisKKyAgICAvLyBDYWxscyB0aGUgZnVuY3RvciB3aXRo
ICh0bXAsIHJvbGUsIHR5cGUpLgorICAgIHRlbXBsYXRlPHR5cGVuYW1lIEZ1bmN0b3I+CisgICAg
dm9pZCBmb3JFYWNoVG1wKGNvbnN0IEZ1bmN0b3ImIGZ1bmN0b3IpCisgICAgeworICAgICAgICBm
b3JFYWNoQXJnUm9sZSgKKyAgICAgICAgICAgIFsmXSAoQXJnJiBhcmcsIEFyZzo6Um9sZSByb2xl
LCBBcmc6OlR5cGUgdHlwZSkgeworICAgICAgICAgICAgICAgIGFyZy5mb3JFYWNoVG1wKHJvbGUs
IHR5cGUsIGZ1bmN0b3IpOworICAgICAgICAgICAgfSk7CisgICAgfQorCisgICAgLy8gUmVwb3J0
cyBhbnkgYWRkaXRpb25hbCByZWdpc3RlcnMgY2xvYmJlcmVkIGJ5IHRoaXMgb3BlcmF0aW9uLgor
ICAgIHRlbXBsYXRlPHR5cGVuYW1lIEZ1bmN0b3I+CisgICAgdm9pZCBmb3JFYWNoQ2xvYmJlcmVk
UmVnKGNvbnN0IEZ1bmN0b3ImKTsKKworICAgIC8vIElzIHRoaXMgaW5zdHJ1Y3Rpb24gaW4gb25l
IG9mIHRoZSB2YWxpZCBmb3JtcyByaWdodCBub3c/IFRoaXMgZnVuY3Rpb24gaXMgYXV0by1nZW5l
cmF0ZWQgYnkKKyAgICAvLyBvcGNvZGVfZ2VuZXJhdG9yLnJiLgorICAgIGJvb2wgaXNWYWxpZEZv
cm0oKTsKKworICAgIC8vIEFzc3VtaW5nIHRoaXMgaW5zdHJ1Y3Rpb24gaXMgaW4gYSB2YWxpZCBm
b3JtIHJpZ2h0IG5vdywgd2lsbCBpdCBzdGlsbCBiZSBpbiBvbmUgb2YgdGhlIHZhbGlkCisgICAg
Ly8gZm9ybXMgaWYgd2UgcHV0IGFuIEFkZHIgaW4gdGhlIGdpdmVuIGluZGV4PyBTcGlsbGluZyB1
c2VzIHRoaXM6IGl0IHdhbGtzIHRoZSBhcmdzIGJ5IGluZGV4IHRvCisgICAgLy8gZmluZCBUbXBz
IHRoYXQgbmVlZCBzcGlsbGluZzsgaWYgaXQgZmluZHMgb25lLCBpdCBjYWxscyB0aGlzIHRvIHNl
ZSBpZiBpdCBjYW4gcmVwbGFjZSB0aGUKKyAgICAvLyBBcmc6OlRtcCB3aXRoIGFuIEFyZzo6QWRk
ci4gSWYgaXQgZmluZHMgYSBub24tVG1wIEFyZywgdGhlbiBpdCBjYWxscyB0aGF0IEFyZydzIGZv
ckVhY2hUbXAgdG8KKyAgICAvLyBkbyBhIHJlcGxhY2VtZW50IHRoYXQgd2F5LgorICAgIC8vCisg
ICAgLy8gVGhpcyBmdW5jdGlvbiBpcyBhdXRvLWdlbmVyYXRlZCBieSBvcGNvZGVfZ2VuZXJhdG9y
LnJiLgorICAgIGJvb2wgYWRtaXRzQWRkcih1bnNpZ25lZCBhcmdJbmRleCk7CisKKyAgICAvLyBH
ZW5lcmF0ZSBzb21lIGNvZGUgZm9yIHRoaXMgaW5zdHJ1Y3Rpb24uIFRoaXMgaXMsIGxpa2UsIGxp
dGVyYWxseSBvdXIgYmFja2VuZC4gSWYgdGhpcyBpcyB0aGUKKyAgICAvLyB0ZXJtaW5hbCwgaXQg
cmV0dXJucyB0aGUganVtcCB0aGF0IG5lZWRzIHRvIGJlIGxpbmtlZCBmb3IgdGhlICJ0aGVuIiBj
YXNlLCB3aXRoIHRoZSAiZWxzZSIKKyAgICAvLyBjYXNlIGJlaW5nIGZhbGwtdGhyb3VnaC4gVGhp
cyBmdW5jdGlvbiBpcyBhdXRvLWdlbmVyYXRlZCBieSBvcGNvZGVfZ2VuZXJhdG9yLnJiLgorICAg
IE1hY3JvQXNzZW1ibGVyOjpKdW1wIGdlbmVyYXRlKE1hY3JvQXNzZW1ibGVyJik7CisKKyAgICB2
b2lkIGR1bXAoUHJpbnRTdHJlYW0mKSBjb25zdDsKKworICAgIE9wY29kZSBvcGNvZGU7CisgICAg
QXJnTGlzdCBhcmdzOworICAgIFZhbHVlKiBvcmlnaW47IC8vIFRoZSBCMzo6VmFsdWUgdGhhdCB0
aGlzIG9yaWdpbmF0ZWQgZnJvbS4KK307CisKK30gfSB9IC8vIG5hbWVzcGFjZSBKU0M6OkIzOjpB
aXIKKworI2VuZGlmIC8vIEFpckluc3RfaAorCkluZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUv
YjMvYWlyL0Fpckluc3RJbmxpbmVzLmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRD
b3JlL2IzL2Fpci9BaXJJbnN0SW5saW5lcy5oCShyZXZpc2lvbiAwKQorKysgU291cmNlL0phdmFT
Y3JpcHRDb3JlL2IzL2Fpci9BaXJJbnN0SW5saW5lcy5oCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAg
KzEsNjYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTUgQXBwbGUgSW5jLiBBbGwgcmlnaHRz
IHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBi
aW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0
dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0Ogor
ICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92
ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRo
ZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkg
Zm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRo
aXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhl
CisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0
aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkg
QVBQTEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJB
TlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FS
UkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgor
ICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4g
T1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJ
TkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFH
RVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VC
U1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9G
SVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkg
VEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFC
SUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFS
SVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZF
TiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKwor
I2lmbmRlZiBBaXJJbnN0SW5saW5lc19oCisjZGVmaW5lIEFpckluc3RJbmxpbmVzX2gKKworI2lu
Y2x1ZGUgIkFpckluc3QuaCIKKyNpbmNsdWRlICJBaXJPcGNvZGVVdGlscy5oIgorI2luY2x1ZGUg
IkFpclNwZWNpYWxzLmgiCisjaW5jbHVkZSAiQjNTdGFja21hcC5oIgorI2luY2x1ZGUgIkIzVmFs
dWUuaCIKKworbmFtZXNwYWNlIEpTQyB7IG5hbWVzcGFjZSBCMyB7IG5hbWVzcGFjZSBBaXIgewor
Cit0ZW1wbGF0ZTx0eXBlbmFtZSBGdW5jdG9yPgordm9pZCBJbnN0Ojpmb3JFYWNoQ2xvYmJlcmVk
UmVnKGNvbnN0IEZ1bmN0b3ImIGZ1bmN0b3IpCit7CisgICAgc3dpdGNoIChvcGNvZGUpIHsKKyAg
ICBjYXNlIENoZWNrOgorICAgIGNhc2UgQ2hlY2tBZGQ6CisgICAgY2FzZSBDaGVja1N1YjoKKyAg
ICBjYXNlIENoZWNrTXVsOgorICAgIGNhc2UgUGF0Y2hwb2ludDoKKyAgICAgICAgb3JpZ2luLT5z
dGFja21hcCgpLT5jbG9iYmVyZWQoKS5mb3JFYWNoKGZ1bmN0b3IpOworICAgICAgICBicmVhazsK
KworICAgIGNhc2UgQ2FsbDogeworICAgICAgICBSZWdpc3RlclNldCBjYWxsZWVTYXZlUmVnaXN0
ZXJzID0gUmVnaXN0ZXJTZXQ6OmNhbGxlZVNhdmVSZWdpc3RlcnMoKTsKKyAgICAgICAgZm9yIChS
ZWcgcmVnIDogUmVnOjphbGwoKSkgeworICAgICAgICAgICAgaWYgKCFjYWxsZWVTYXZlUmVnaXN0
ZXJzLmdldChyZWcpKQorICAgICAgICAgICAgICAgIGZ1bmN0b3IocmVnKTsKKyAgICAgICAgfQor
ICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICBkZWZhdWx0OgorICAgICAgICBicmVhazsKKyAg
ICB9Cit9CisKK30gfSB9IC8vIG5hbWVzcGFjZSBKU0M6OkIzOjpBaXIKKworI2VuZGlmIC8vIEFp
ckluc3RJbmxpbmVzX2gKKwpJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL2Fpci9BaXJP
cGNvZGVzLm9wY29kZXMKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL2Fp
ci9BaXJPcGNvZGVzLm9wY29kZXMJKHJldmlzaW9uIDApCisrKyBTb3VyY2UvSmF2YVNjcmlwdENv
cmUvYjMvYWlyL0Fpck9wY29kZXMub3Bjb2Rlcwkod29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDk1
IEBACisjIENvcHlyaWdodCAoQykgMjAxNSBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQu
CisjCisjIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMs
IHdpdGggb3Igd2l0aG91dAorIyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQg
dGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyMgYXJlIG1ldDoKKyMgMS4gUmVkaXN0cmli
dXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyMg
ICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNj
bGFpbWVyLgorIyAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1
Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorIyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRp
b25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisjICAgIGRvY3VtZW50YXRp
b24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24u
CisjCisjIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBBTkQgSVRTIENP
TlRSSUJVVE9SUyBgYEFTIElTJycKKyMgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFO
VElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisjIFRIRSBJTVBMSUVEIFdBUlJB
TlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyMg
UFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUiBJ
VFMgQ09OVFJJQlVUT1JTCisjIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElO
Q0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKKyMgQ09OU0VRVUVOVElBTCBEQU1BR0VT
IChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKKyMgU1VCU1RJ
VFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9S
IEJVU0lORVNTCisjIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVP
UlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOCisjIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZ
LCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisjIEFSSVNJTkcg
SU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklT
RUQgT0YKKyMgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisjIFN5bGxhYnVzOgor
IyBVOkcgPT4gdXNlIG9mIGEgZ2VuZXJhbC1wdXJwb3NlIHJlZ2lzdGVyIG9yIHZhbHVlCisjIEQ6
RyA9PiBkZWYgb2YgYSBnZW5lcmFsLXB1cnBvc2UgcmVnaXN0ZXIgb3IgdmFsdWUKKyMgVUQ6RyA9
PiB1c2UgYW5kIGRlZiBvZiBhIGdlbmVyYWwtcHVycG9zZSByZWdpc3RlciBvciB2YWx1ZQorIyBV
OkYgPT4gdXNlIG9mIGEgZmxvYXQgcmVnaXN0ZXIgb3IgdmFsdWUKKyMgRDpGID0+IGRlZiBvZiBh
IGZsb2F0IHJlZ2lzdGVyIG9yIHZhbHVlCisjIFVEOkYgPT4gdXNlIGFuZCBkZWYgb2YgYSBmbG9h
dCByZWdpc3RlciBvciB2YWx1ZQorIyBUbXAgPT4gdGVtcG9yYXJ5IG9yIHJlZ2lzdGVyCisjIEFk
ZHIgPT4gYWRkcmVzcyBhcyB0ZW1wb3JhcnkvcmVnaXN0ZXIrb2Zmc2V0CisjIEluZGV4ID0+IEJh
c2VJbmRleCBhZGRyZXNzCisjIEFicyA9PiBBYnNvbHV0ZUFkZHJlc3MKKworIyBOb3RlIHRoYXQg
dGhlIG9wY29kZXMgaGVyZSBoYXZlIGEgbGVhZGluZyBjYXBpdGFsIChBZGQzMikgYnV0IG11c3Qg
Y29ycmVzcG9uZCB0byBNYWNyb0Fzc2VtYmxlcgorIyBBUEkgdGhhdCBoYXMgYSBsZWFkaW5nIGxv
d2VyLWNhc2UgKGFkZDMyKS4KKworQWRkMzIgVTpHLCBVRDpHCisgICAgVG1wLCBUbXAKKyAgICBJ
bW0sIEFkZHIKKyAgICBJbW0sIFRtcAorICAgIEFkZHIsIFRtcAorICAgIFRtcCwgQWRkcgorCitB
ZGQzMiBVOkcsIFU6RywgRDpHCisgICAgSW1tLCBUbXAsIFRtcAorCitBbmQzMiBVOkcsIFVEOkcK
KyAgICBUbXAsIFRtcAorICAgIEltbSwgVG1wCisgICAgVG1wLCBBZGRyCisgICAgQWRkciwgVG1w
CisgICAgSW1tLCBBZGRyCisKK0xzaGlmdDMyIFU6RywgVUQ6RworICAgIFRtcCosIFRtcAorICAg
IEltbSwgVG1wCisKK011bDMyIFU6RywgVUQ6RworICAgIFRtcCwgVG1wCisgICAgQWRkciwgVG1w
CisKK01vdmUgVTpHLCBEOkcKKyAgICBUbXAsIFRtcAorICAgIEltbSwgVG1wCisgICAgSW1tUHRy
LCBUbXAKKyAgICBBZGRyLCBUbXAgYXMgbG9hZCAjIFRoaXMgbWVhbnMgdGhhdCAiTW92ZSBBZGRy
LCBUbXAiIGlzIGNvZGUtZ2VuZXJhdGVkIGFzICJsb2FkIiBub3QgIm1vdmUiLgorICAgIFRtcCwg
QWRkciBhcyBzdG9yZQorCitNb3ZlRG91YmxlIFU6RiwgRDpGCisgICAgVG1wLCBUbXAKKyAgICBB
ZGRyLCBUbXAgYXMgbG9hZERvdWJsZQorICAgIFRtcCwgQWRkciBhcyBzdG9yZURvdWJsZQorCitN
b3ZlNjRUb0RvdWJsZSBVOkcsIEQ6RgorICAgIFRtcCwgVG1wCisKK01vdmVEb3VibGVUbzY0IFU6
RiwgRDpHCisgICAgVG1wLCBUbXAKKworUmV0CisKKyMgU29tZSBvcGNvZGVzIGJlaGF2ZSBleG90
aWNhbGx5LiBGb3IgZXhhbXBsZSwgdGhleSBtYXkgaGF2ZSB2YXJhcmdzLiBPciwgdGhleSBtYXkg
cmVxdWlyZSBhIHNwZWNpYWwKKyMgY2xhc3Mgb2YgcmVnaXN0ZXJzIGZvciBzb21lIG9wZXJhbmQu
IE9yLCB0aGV5IG1heSB1c2Ugb3IgZGVmIGFkZGl0aW9uYWwgcmVnaXN0ZXJzLgorCisjIFRoZXNl
IGJlaGF2ZSBsaWtlIGhvdyB0aGUgU3RhY2ttYXAgb2JqZWN0IHRlbGxzIHRoZW0gdG8gYmVoYXZl
Lgorc3BlY2lhbCBDaGVja0FkZAorc3BlY2lhbCBDaGVja1N1YiAKK3NwZWNpYWwgQ2hlY2tNdWwK
K3NwZWNpYWwgQ2hlY2sKK3NwZWNpYWwgUGF0Y2hwb2ludAorCisjIFRha2VzIGFyZ3VtZW50IHJl
Z2lzdGVycyBhcyBpbnB1dHMuCitzcGVjaWFsIENhbGwKSW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0
Q29yZS9iMy9haXIvQWlyVG1wLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENv
cmUvYjMvYWlyL0FpclRtcC5jcHAJKHJldmlzaW9uIDApCisrKyBTb3VyY2UvSmF2YVNjcmlwdENv
cmUvYjMvYWlyL0FpclRtcC5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSw1MiBAQAorLyoK
KyAqIENvcHlyaWdodCAoQykgMjAxNSBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisg
KgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywg
d2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQg
dGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3Ry
aWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAor
ICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBk
aXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVw
cm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNv
bmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3Vt
ZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmli
dXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIGBg
QVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVE
SU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1F
UkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFS
RSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUgorICogQ09OVFJJ
QlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQ
RUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5H
LCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RT
IE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lO
RVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9G
IExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9S
VAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkg
V0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQg
T0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLiAKKyAqLworCisjaW5jbHVkZSAiY29u
ZmlnLmgiCisjaW5jbHVkZSAiQWlyVG1wLmgiCisKK25hbWVzcGFjZSBKU0MgeyBuYW1lc3BhY2Ug
QjMgeyBuYW1lc3BhY2UgQWlyIHsKKwordm9pZCBUbXA6OmR1bXAoUHJpbnRTdHJlYW0mIG91dCkg
Y29uc3QKK3sKKyAgICBpZiAoISp0aGlzKSB7CisgICAgICAgIG91dC5wcmludCgiPG5vbmU+Iik7
CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpZiAoaXNSZWcoKSkgeworICAgICAgICBv
dXQucHJpbnQocmVnKCkpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgaWYgKGlzR1BU
bXAoKSkgeworICAgICAgICBvdXQucHJpbnQoIiV0bXAiLCBncFRtcEluZGV4KCkpOworICAgICAg
ICByZXR1cm47CisgICAgfQorCisgICAgb3V0LnByaW50KCIlZnRtcCIsIGZwVG1wSW5kZXgoKSk7
Cit9CisKK30gfSB9IC8vIG5hbWVzcGFjZSBKU0M6OkIzOjpBaXIKKwpJbmRleDogU291cmNlL0ph
dmFTY3JpcHRDb3JlL2IzL2Fpci9BaXJUbXAuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNj
cmlwdENvcmUvYjMvYWlyL0FpclRtcC5oCShyZXZpc2lvbiAwKQorKysgU291cmNlL0phdmFTY3Jp
cHRDb3JlL2IzL2Fpci9BaXJUbXAuaAkod29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDI0OCBAQAor
LyoKKyAqIENvcHlyaWdodCAoQykgMjAxNSBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQu
CisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jt
cywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlk
ZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRp
c3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdo
dAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2lu
ZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3Qg
cmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9m
IGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRv
Y3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0
cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMu
IGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5D
TFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9G
IE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NF
IEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUgorICogQ09O
VFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUws
IFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVE
SU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdP
T0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJV
U0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAq
IE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1Ig
VE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBB
TlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklT
RUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLiAKKyAqLworCisjaWZuZGVmIEFp
clRtcF9oCisjZGVmaW5lIEFpclRtcF9oCisKKyNpbmNsdWRlICJSZWcuaCIKKworbmFtZXNwYWNl
IEpTQyB7IG5hbWVzcGFjZSBCMyB7IG5hbWVzcGFjZSBBaXIgeworCisvLyBBIFRtcCBpcyBhIGdl
bmVyYWxpemF0aW9uIG9mIGEgcmVnaXN0ZXIuIEl0IGNhbiBiZSB1c2VkIHRvIHJlZmVyIHRvIGFu
eSBHUFIgb3IgRlBSLiBJdCBjYW4gYWxzbworLy8gYmUgdXNlZCB0byByZWZlciB0byBhbiB1bmFs
bG9jYXRlZCByZWdpc3RlciAoaS5lLiBhIHRlbXBvcmFyeSkuIExpa2UgbWFueSBBaXIgY2xhc3Nl
cywgd2UgdXNlCisvLyBkZWxpYmVyYXRlbHkgdGVyc2UgbmFtaW5nIHNpbmNlIHdlIHdpbGwgaGF2
ZSB0byB1c2UgdGhpcyBuYW1lIGEgbG90LgorCitjbGFzcyBUbXAgeworcHVibGljOgorICAgIFRt
cCgpCisgICAgICAgIDogbV92YWx1ZSgwKQorICAgIHsKKyAgICB9CisKKyAgICBleHBsaWNpdCBU
bXAoUmVnIHJlZykKKyAgICB7CisgICAgICAgIGlmIChyZWcpIHsKKyAgICAgICAgICAgIGlmIChy
ZWcuaXNHUFIoKSkKKyAgICAgICAgICAgICAgICBtX3ZhbHVlID0gZW5jb2RlR1BSKHJlZy5ncHIo
KSk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgbV92YWx1ZSA9IGVuY29kZUZQ
UihyZWcuZnByKCkpOworICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgIG1fdmFsdWUgPSAwOwor
ICAgIH0KKworICAgIHN0YXRpYyBUbXAgZ3BUbXBGb3JJbmRleCh1bnNpZ25lZCBpbmRleCkKKyAg
ICB7CisgICAgICAgIFRtcCByZXN1bHQ7CisgICAgICAgIHJlc3VsdC5tX3ZhbHVlID0gZW5jb2Rl
R1BUbXAoaW5kZXgpOworICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKworICAgIHN0YXRp
YyBUbXAgZnBUbXBGb3JJbmRleCh1bnNpZ25lZCBpbmRleCkKKyAgICB7CisgICAgICAgIFRtcCBy
ZXN1bHQ7CisgICAgICAgIHJlc3VsdC5tX3ZhbHVlID0gZW5jb2RlRlBUbXAoaW5kZXgpOworICAg
ICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKworICAgIHN0YXRpYyBUbXAgZm9yUmF3VmFsdWUo
dW5zaWduZWQgaW5kZXgpCisgICAgeworICAgICAgICBUbXAgcmVzdWx0OworICAgICAgICByZXN1
bHQubV92YWx1ZSA9IGluZGV4OworICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKworICAg
IGV4cGxpY2l0IG9wZXJhdG9yIGJvb2woKSBjb25zdCB7IHJldHVybiAhIW1fdmFsdWU7IH0KKwor
ICAgIGJvb2wgcmF3VmFsdWUoKSBjb25zdCB7IHJldHVybiBtX3ZhbHVlOyB9CisKKyAgICBib29s
IGlzR1AoKSBjb25zdAorICAgIHsKKyAgICAgICAgcmV0dXJuIGlzRW5jb2RlZEdQKG1fdmFsdWUp
OworICAgIH0KKworICAgIGJvb2wgaXNGUCgpIGNvbnN0CisgICAgeworICAgICAgICByZXR1cm4g
aXNFbmNvZGVkRlAobV92YWx1ZSk7CisgICAgfQorCisgICAgYm9vbCBpc0dQUigpIGNvbnN0Cisg
ICAgeworICAgICAgICByZXR1cm4gaXNFbmNvZGVkR1BSKG1fdmFsdWUpOworICAgIH0KKworICAg
IGJvb2wgaXNGUFIoKSBjb25zdAorICAgIHsKKyAgICAgICAgcmV0dXJuIGlzRW5jb2RlZEZQUiht
X3ZhbHVlKTsKKyAgICB9CisKKyAgICBib29sIGlzUmVnKCkgY29uc3QKKyAgICB7CisgICAgICAg
IHJldHVybiBpc0dQUigpIHx8IGlzRlBSKCk7CisgICAgfQorCisgICAgR1BSUmVnIGdwcigpIGNv
bnN0CisgICAgeworICAgICAgICByZXR1cm4gZGVjb2RlR1BSKG1fdmFsdWUpOworICAgIH0KKwor
ICAgIEZQUlJlZyBmcHIoKSBjb25zdAorICAgIHsKKyAgICAgICAgcmV0dXJuIGRlY29kZUZQUiht
X3ZhbHVlKTsKKyAgICB9CisKKyAgICBSZWcgcmVnKCkgY29uc3QKKyAgICB7CisgICAgICAgIGlm
IChpc0dQKCkpCisgICAgICAgICAgICByZXR1cm4gZ3ByKCk7CisgICAgICAgIHJldHVybiBmcHIo
KTsKKyAgICB9CisKKyAgICB1bnNpZ25lZCBncFRtcEluZGV4KCkgY29uc3QKKyAgICB7CisgICAg
ICAgIHJldHVybiBkZWNvZGVHUFRtcChtX3ZhbHVlKTsKKyAgICB9CisKKyAgICB1bnNpZ25lZCBm
cFRtcEluZGV4KCkgY29uc3QKKyAgICB7CisgICAgICAgIHJldHVybiBkZWNvZGVGUFRtcChtX3Zh
bHVlKTsKKyAgICB9CisKKyAgICB1bnNpZ25lZCB0bXBJbmRleCgpIGNvbnN0CisgICAgeworICAg
ICAgICBpZiAoaXNHUCgpKQorICAgICAgICAgICAgcmV0dXJuIGdwVG1wSW5kZXgoKTsKKyAgICAg
ICAgcmV0dXJuIGZwVG1wSW5kZXgoKTsKKyAgICB9CisKKyAgICBib29sIG9wZXJhdG9yPT0oY29u
c3QgVG1wJiBvdGhlcikgY29uc3QKKyAgICB7CisgICAgICAgIHJldHVybiBtX3ZhbHVlID09IG90
aGVyLm1fdmFsdWU7CisgICAgfQorCisgICAgYm9vbCBvcGVyYXRvciE9KGNvbnN0IFRtcCYgb3Ro
ZXIpIGNvbnN0CisgICAgeworICAgICAgICByZXR1cm4gISgqdGhpcyA9PSBvdGhlcik7CisgICAg
fQorCisgICAgdm9pZCBkdW1wKFByaW50U3RyZWFtJiBvdXQpIGNvbnN0OworICAgIAorcHJpdmF0
ZToKKyAgICBzdGF0aWMgaW50IGVuY29kZUdQKHVuc2lnbmVkIGluZGV4KQorICAgIHsKKyAgICAg
ICAgcmV0dXJuIDEgKyBpbmRleDsKKyAgICB9CisKKyAgICBzdGF0aWMgaW50IGVuY29kZUZQKHVu
c2lnbmVkIGluZGV4KQorICAgIHsKKyAgICAgICAgcmV0dXJuIC0xIC0gaW5kZXg7CisgICAgfQor
CisgICAgc3RhdGljIGludCBlbmNvZGVHUFIoR1BSUmVnIGdwcikKKyAgICB7CisgICAgICAgIHJl
dHVybiBlbmNvZGVHUChncHIgLSBNYWNyb0Fzc2VtYmxlcjo6Zmlyc3RSZWdpc3RlcigpKTsKKyAg
ICB9CisKKyAgICBzdGF0aWMgaW50IGVuY29kZUZQUihGUFJSZWcgZnByKQorICAgIHsKKyAgICAg
ICAgcmV0dXJuIGVuY29kZUZQKGZwciAtIE1hY3JvQXNzZW1ibGVyOjpmaXJzdEZQUlJlZ2lzdGVy
KCkpOworICAgIH0KKworICAgIHN0YXRpYyBpbnQgZW5jb2RlR1BUbXAodW5zaWduZWQgaW5kZXgp
CisgICAgeworICAgICAgICByZXR1cm4gZW5jb2RlR1BSKE1hY3JvQXNzZW1ibGVyOjpsYXN0UmVn
aXN0ZXIoKSkgKyAxICsgaW5kZXg7CisgICAgfQorCisgICAgc3RhdGljIGludCBlbmNvZGVGUFRt
cCh1bnNpZ25lZCBpbmRleCkKKyAgICB7CisgICAgICAgIHJldHVybiBlbmNvZGVGUFIoTWFjcm9B
c3NlbWJsZXI6Omxhc3RGUFJlZ2lzdGVyKCkpIC0gMSAtIGluZGV4OworICAgIH0KKworICAgIHN0
YXRpYyBib29sIGlzRW5jb2RlZEdQKGludCB2YWx1ZSkKKyAgICB7CisgICAgICAgIHJldHVybiB2
YWx1ZSA+IDA7CisgICAgfQorCisgICAgc3RhdGljIGJvb2wgaXNFbmNvZGVkRlAoaW50IHZhbHVl
KQorICAgIHsKKyAgICAgICAgcmV0dXJuIHZhbHVlIDwgMDsKKyAgICB9CisKKyAgICBzdGF0aWMg
Ym9vbCBpc0VuY29kZWRHUFIoaW50IHZhbHVlKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGlzRW5j
b2RlZEdQKHZhbHVlKSAmJiB2YWx1ZSA8PSBlbmNvZGVHUFIoTWFjcm9Bc3NlbWJsZXI6Omxhc3RS
ZWdpc3RlcigpKTsKKyAgICB9CisKKyAgICBzdGF0aWMgYm9vbCBpc0VuY29kZWRGUFIoaW50IHZh
bHVlKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGlzRW5jb2RlZEZQKHZhbHVlKSAmJiB2YWx1ZSA+
PSBlbmNvZGVkRlBSKE1hY3JvQXNzZW1ibGVyOjpsYXN0RlBSZWdpc3RlcigpKTsKKyAgICB9CisK
KyAgICBzdGF0aWMgYm9vbCBpc0VuY29kZWRHUFRtcChpbnQgdmFsdWUpCisgICAgeworICAgICAg
ICByZXR1cm4gaXNFbmNvZGVkR1AodmFsdWUpICYmICFpc0VuY29kZWRHUFIodmFsdWUpOworICAg
IH0KKworICAgIHN0YXRpYyBib29sIGlzRW5jb2RlZEZQVG1wKGludCB2YWx1ZSkKKyAgICB7Cisg
ICAgICAgIHJldHVybiBpc0VuY29kZWRGUCh2YWx1ZSkgJiYgIWlzRW5jb2RlZEZQUih2YWx1ZSk7
CisgICAgfQorCisgICAgc3RhdGljIEdQUlJlZyBkZWNvZGVHUFIoaW50IHZhbHVlKQorICAgIHsK
KyAgICAgICAgQVNTRVJUKGlzRW5jb2RlZEdQUih2YWx1ZSkpOworICAgICAgICByZXR1cm4gc3Rh
dGljX2Nhc3Q8R1BSUmVnPigKKyAgICAgICAgICAgICh2YWx1ZSAtIGVuY29kZUdQUihNYWNyb0Fz
c2VtYmxlcjo6Zmlyc3RSZWdpc3RlcigpKSkgKyBNYWNyb0Fzc2VtYmxlcjo6Zmlyc3RSZWdpc3Rl
cigpKTsKKyAgICB9CisKKyAgICBzdGF0aWMgRlBSUmVnIGRlY29kZUZQUihpbnQgdmFsdWUpCisg
ICAgeworICAgICAgICBBU1NFUlQoaXNFbmNvZGVkRlBSKHZhbHVlKSk7CisgICAgICAgIHJldHVy
biBzdGF0aWNfY2FzdDxGUFJSZWc+KAorICAgICAgICAgICAgKGVuY29kZUZQUihNYWNyb0Fzc2Vt
Ymxlcjo6Zmlyc3RGUFJlZ2lzdGVyKCkpIC0gdmFsdWUpICsKKyAgICAgICAgICAgIE1hY3JvQXNz
ZW1ibGVyOjpmaXJzdEZQUmVnaXN0ZXIoKSk7CisgICAgfQorCisgICAgc3RhdGljIHVuc2lnbmVk
IGRlY29kZUdQVG1wKGludCB2YWx1ZSkKKyAgICB7CisgICAgICAgIEFTU0VSVChpc0VuY29kZWRH
UFRtcCh2YWx1ZSkpOworICAgICAgICByZXR1cm4gdmFsdWUgLSAoZW5jb2RlR1BSKE1hY3JvQXNz
ZW1ibGVyOjpsYXN0UmVnaXN0ZXIoKSkgKyAxKTsKKyAgICB9CisKKyAgICBzdGF0aWMgdW5zaWdu
ZWQgZGVjb2RlRlBUbXAoaW50IHZhbHVlKQorICAgIHsKKyAgICAgICAgQVNTRVJUKGlzRW5jb2Rl
ZEZQVG1wKHZhbHVlKSk7CisgICAgICAgIHJldHVybiAoZW5jb2RlRlBSKE1hY3JvQXNzZW1ibGVy
OjpsYXN0RlBSZWdpc3RlcigpKSAtIDEpIC0gdmFsdWU7CisgICAgfQorCisgICAgLy8gMDogZW1w
dHkgVG1wCisgICAgLy8gcG9zaXRpdmU6IEdQUnMgYW5kIHRoZW4gR1AgdGVtcHMuCisgICAgLy8g
bmVnYXRpdmU6IEZQUnMgYW5kIHRoZW4gRlAgdGVtcHMuCisgICAgaW50IG1fdmFsdWU7Cit9Owor
Cit9IH0gfSAvLyBuYW1lc3BhY2UgSlNDOjpCMzo6QWlyCisKKyNlbmRpZiAvLyBBaXJUbXBfaAor
CkluZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvYWlyL29wY29kZV9nZW5lcmF0b3IucmIK
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL2Fpci9vcGNvZGVfZ2VuZXJh
dG9yLnJiCShyZXZpc2lvbiAwKQorKysgU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL2Fpci9vcGNv
ZGVfZ2VuZXJhdG9yLnJiCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsNzUxIEBACisjIS91c3Iv
YmluL2VudiBydWJ5CisKKyMgQ29weXJpZ2h0IChDKSAyMDE1IEFwcGxlIEluYy4gQWxsIHJpZ2h0
cyByZXNlcnZlZC4KKyMKKyMgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJp
bmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisjIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRl
ZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworIyBhcmUgbWV0OgorIyAx
LiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNv
cHlyaWdodAorIyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9s
bG93aW5nIGRpc2NsYWltZXIuCisjIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBt
dXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisjICAgIG5vdGljZSwgdGhpcyBsaXN0
IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyMgICAg
ZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRp
c3RyaWJ1dGlvbi4KKyMKKyMgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMu
IEFORCBJVFMgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJworIyBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1Q
TElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyMgVEhFIElN
UExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFS
VElDVUxBUgorIyBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBBUFBM
RSBJTkMuIE9SIElUUyBDT05UUklCVVRPUlMKKyMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJ
TkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgorIyBDT05TRVFVRU5U
SUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBP
RgorIyBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1Ig
UFJPRklUUzsgT1IgQlVTSU5FU1MKKyMgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQg
T04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KKyMgQ09OVFJBQ1QsIFNUUklD
VCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkK
KyMgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVW
RU4gSUYgQURWSVNFRCBPRgorIyBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKK3Jl
cXVpcmUgInBhdGhuYW1lIgorCitjbGFzcyBPcGNvZGUKKyAgICBhdHRyX3JlYWRlciA6bmFtZSwg
OnNwZWNpYWwsIDpvdmVybG9hZHMKKworICAgIGRlZiBpbml0aWFsaXplKG5hbWUsIHNwZWNpYWwp
CisgICAgICAgIEBuYW1lID0gbmFtZQorICAgICAgICBAc3BlY2lhbCA9IHNwZWNpYWwKKyAgICAg
ICAgdW5sZXNzIHNwZWNpYWwKKyAgICAgICAgICAgIEBvdmVybG9hZHMgPSBbXQorICAgICAgICBl
bmQKKyAgICBlbmQKKworICAgIGRlZiBtYXNtTmFtZQorICAgICAgICBuYW1lWzBdLmRvd25jYXNl
ICsgbmFtZVsxLi4tMV0KKyAgICBlbmQKK2VuZAorCitjbGFzcyBBcmcKKyAgICBhdHRyX3JlYWRl
ciA6cm9sZSwgOnR5cGUKKworICAgIGRlZiBpbml0aWFsaXplKHJvbGUsIHR5cGUpCisgICAgICAg
IEByb2xlID0gcm9sZQorICAgICAgICBAdHlwZSA9IHR5cGUKKyAgICBlbmQKK2VuZAorCitjbGFz
cyBPdmVybG9hZAorICAgIGF0dHJfcmVhZGVyIDpzaWduYXR1cmUsIDpmb3JtcworCisgICAgZGVm
IGluaXRpYWxpemUoc2lnbmF0dXJlLCBmb3JtcykKKyAgICAgICAgQHNpZ25hdHVyZSA9IHNpZ25h
dHVyZQorICAgICAgICBAZm9ybXMgPSBmb3JtcworICAgIGVuZAorZW5kCisKK2NsYXNzIEtpbmQK
KyAgICBhdHRyX3JlYWRlciA6bmFtZQorICAgIGF0dHJfYWNjZXNzb3IgOnNwZWNpYWwKKworICAg
IGRlZiBpbml0aWFsaXplKG5hbWUpCisgICAgICAgIEBuYW1lID0gbmFtZQorICAgICAgICBAc3Bl
Y2lhbCA9IGZhbHNlCisgICAgZW5kCisKKyAgICBkZWYgPT0ob3RoZXIpCisgICAgICAgIGlmIG90
aGVyLmlzX2E/IFN0cmluZworICAgICAgICAgICAgQG5hbWUgPT0gb3RoZXIKKyAgICAgICAgZWxz
ZQorICAgICAgICAgICAgQG5hbWUgPT0gb3RoZXIubmFtZSBhbmQgQHNwZWNpYWwgPT0gb3RoZXIu
c3BlY2lhbAorICAgICAgICBlbmQKKyAgICBlbmQKK2VuZAorCitjbGFzcyBGb3JtCisgICAgYXR0
cl9yZWFkZXIgOmtpbmRzLCA6YWx0TmFtZQorCisgICAgZGVmIGluaXRpYWxpemUoa2luZHMsIGFs
dE5hbWUpCisgICAgICAgIEBraW5kcyA9IGtpbmRzCisgICAgICAgIEBhbHROYW1lID0gYWx0TmFt
ZQorICAgIGVuZAorZW5kCisKK2NsYXNzIE9yaWdpbgorICAgIGF0dHJfcmVhZGVyIDpmaWxlTmFt
ZSwgOmxpbmVOdW1iZXIKKyAgICAKKyAgICBkZWYgaW5pdGlhbGl6ZShmaWxlTmFtZSwgbGluZU51
bWJlcikKKyAgICAgICAgQGZpbGVOYW1lID0gZmlsZU5hbWUKKyAgICAgICAgQGxpbmVOdW1iZXIg
PSBsaW5lTnVtYmVyCisgICAgZW5kCisgICAgCisgICAgZGVmIHRvX3MKKyAgICAgICAgIiN7Zmls
ZU5hbWV9OiN7bGluZU51bWJlcn0iCisgICAgZW5kCitlbmQKKworY2xhc3MgVG9rZW4KKyAgICBh
dHRyX3JlYWRlciA6b3JpZ2luLCA6c3RyaW5nCisgICAgCisgICAgZGVmIGluaXRpYWxpemUob3Jp
Z2luLCBzdHJpbmcpCisgICAgICAgIEBvcmlnaW4gPSBvcmlnaW4KKyAgICAgICAgQHN0cmluZyA9
IHN0cmluZworICAgIGVuZAorICAgIAorICAgIGRlZiA9PShvdGhlcikKKyAgICAgICAgaWYgb3Ro
ZXIuaXNfYT8gVG9rZW4KKyAgICAgICAgICAgIEBzdHJpbmcgPT0gb3RoZXIuc3RyaW5nCisgICAg
ICAgIGVsc2UKKyAgICAgICAgICAgIEBzdHJpbmcgPT0gb3RoZXIKKyAgICAgICAgZW5kCisgICAg
ZW5kCisgICAgCisgICAgZGVmID1+KG90aGVyKQorICAgICAgICBAc3RyaW5nID1+IG90aGVyCisg
ICAgZW5kCisgICAgCisgICAgZGVmIHRvX3MKKyAgICAgICAgIiN7QHN0cmluZy5pbnNwZWN0fSBh
dCAje29yaWdpbn0iCisgICAgZW5kCisgICAgCisgICAgZGVmIHBhcnNlRXJyb3IoKmNvbW1lbnQp
CisgICAgICAgIGlmIGNvbW1lbnQuZW1wdHk/CisgICAgICAgICAgICByYWlzZSAiUGFyc2UgZXJy
b3I6ICN7dG9fc30iCisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHJhaXNlICJQYXJzZSBlcnJv
cjogI3t0b19zfTogI3tjb21tZW50WzBdfSIKKyAgICAgICAgZW5kCisgICAgZW5kCitlbmQKKwor
ZGVmIGxleChzdHIsIGZpbGVOYW1lKQorICAgIGZpbGVOYW1lID0gUGF0aG5hbWUubmV3KGZpbGVO
YW1lKQorICAgIHJlc3VsdCA9IFtdCisgICAgbGluZU51bWJlciA9IDEKKyAgICB3aGlsZSBub3Qg
c3RyLmVtcHR5PworICAgICAgICBjYXNlIHN0cgorICAgICAgICB3aGVuIC9cQVwjKFteXG5dKikv
CisgICAgICAgICAgICAjIGNvbW1lbnQsIGlnbm9yZQorICAgICAgICB3aGVuIC9cQVxuLworICAg
ICAgICAgICAgIyBuZXdsaW5lLCBpZ25vcmUKKyAgICAgICAgICAgIGxpbmVOdW1iZXIgKz0gMQor
ICAgICAgICB3aGVuIC9cQShbYS16QS1aMC05X10rKS8KKyAgICAgICAgICAgIHJlc3VsdCA8PCBU
b2tlbi5uZXcoT3JpZ2luLm5ldyhmaWxlTmFtZSwgbGluZU51bWJlciksICQmKQorICAgICAgICB3
aGVuIC9cQShbIFx0XHJdKykvCisgICAgICAgICAgICAjIHdoaXRlc3BhY2UsIGlnbm9yZQorICAg
ICAgICB3aGVuIC9cQVssOipdLworICAgICAgICAgICAgcmVzdWx0IDw8IFRva2VuLm5ldyhPcmln
aW4ubmV3KGZpbGVOYW1lLCBsaW5lTnVtYmVyKSwgJCYpCisgICAgICAgIGVsc2UKKyAgICAgICAg
ICAgIHJhaXNlICJMZXhlciBlcnJvciBhdCAje09yaWdpbi5uZXcoZmlsZU5hbWUsIGxpbmVOdW1i
ZXIpLnRvX3N9LCB1bmV4cGVjdGVkIHNlcXVlbmNlICN7c3RyWzAuLjIwXS5pbnNwZWN0fSIKKyAg
ICAgICAgZW5kCisgICAgICAgIHN0ciA9ICR+LnBvc3RfbWF0Y2gKKyAgICBlbmQKKyAgICByZXN1
bHQKK2VuZAorCitkZWYgaXNVRCh0b2tlbikKKyAgICB0b2tlbiA9fiAvXEEoKFUpfChEKXwoVUQp
KVxaLworZW5kCisKK2RlZiBpc0dGKHRva2VuKQorICAgIHRva2VuID1+IC9cQSgoRyl8KEYpKVxa
LworZW5kCisKK2RlZiBpc0tpbmQodG9rZW4pCisgICAgdG9rZW4gPX4gL1xBKChUbXApfChJbW0p
fChJbW1QdHIpfChBZGRyKXwoSW5kZXgpKVxaLworZW5kCisKK2RlZiBpc0tleXdvcmQodG9rZW4p
CisgICAgaXNVRCh0b2tlbikgb3IgaXNHRih0b2tlbikgb3IgaXNLaW5kKHRva2VuKSBvcgorICAg
ICAgICB0b2tlbiA9PSAic3BlY2lhbCIgb3IgdG9rZW4gPT0gImFzIgorZW5kCisKK2RlZiBpc0lk
ZW50aWZpZXIodG9rZW4pCisgICAgdG9rZW4gPX4gL1xBKFthLXpBLVowLTlfXSspXFovIGFuZCBu
b3QgaXNLZXl3b3JkKHRva2VuKQorZW5kCisKK2NsYXNzIFBhcnNlcgorICAgIGRlZiBpbml0aWFs
aXplKGRhdGEsIGZpbGVOYW1lKQorICAgICAgICBAdG9rZW5zID0gbGV4KGRhdGEsIGZpbGVOYW1l
KQorICAgICAgICBAaWR4ID0gMAorICAgIGVuZAorCisgICAgZGVmIHRva2VuCisgICAgICAgIEB0
b2tlbnNbQGlkeF0KKyAgICBlbmQKKworICAgIGRlZiBhZHZhbmNlCisgICAgICAgIEBpZHggKz0g
MQorICAgIGVuZAorCisgICAgZGVmIHBhcnNlRXJyb3IoKmNvbW1lbnQpCisgICAgICAgIGlmIHRv
a2VuCisgICAgICAgICAgICB0b2tlbi5wYXJzZUVycm9yKCpjb21tZW50KQorICAgICAgICBlbHNl
CisgICAgICAgICAgICBpZiBjb21tZW50LmVtcHR5PworICAgICAgICAgICAgICAgIHJhaXNlICJQ
YXJzZSBlcnJvciBhdCBlbmQgb2YgZmlsZSIKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAg
ICAgICByYWlzZSAiUGFyc2UgZXJyb3IgYXQgZW5kIG9mIGZpbGU6ICN7Y29tbWVudFswXX0iCisg
ICAgICAgICAgICBlbmQKKyAgICAgICAgZW5kCisgICAgZW5kCisKKyAgICBkZWYgY29uc3VtZShz
dHJpbmcpCisgICAgICAgIHBhcnNlRXJyb3IoIkV4cGVjdGVkICN7c3RyaW5nfSIpIHVubGVzcyB0
b2tlbiA9PSBzdHJpbmcKKyAgICAgICAgYWR2YW5jZQorICAgIGVuZAorCisgICAgZGVmIGNvbnN1
bWVJZGVudGlmaWVyCisgICAgICAgIHJlc3VsdCA9IHRva2VuLnN0cmluZworICAgICAgICBwYXJz
ZUVycm9yKCJFeHBlY3RlZCBpZGVudGlmaWVyIikgdW5sZXNzIGlzSWRlbnRpZmllcihyZXN1bHQp
CisgICAgICAgIGFkdmFuY2UKKyAgICAgICAgcmVzdWx0CisgICAgZW5kCisKKyAgICBkZWYgY29u
c3VtZVJvbGUKKyAgICAgICAgcmVzdWx0ID0gdG9rZW4uc3RyaW5nCisgICAgICAgIHBhcnNlRXJy
b3IoIkV4cGVjdGVkIHJvbGUgKFUsIEQsIG9yIFVEKSIpIHVubGVzcyBpc1VEKHJlc3VsdCkKKyAg
ICAgICAgYWR2YW5jZQorICAgICAgICByZXN1bHQKKyAgICBlbmQKKworICAgIGRlZiBjb25zdW1l
VHlwZQorICAgICAgICByZXN1bHQgPSB0b2tlbi5zdHJpbmcKKyAgICAgICAgcGFyc2VFcnJvcigi
RXhwZWN0ZWQgdHlwZSAoRyBvciBGKSIpIHVubGVzcyBpc0dGKHJlc3VsdCkKKyAgICAgICAgYWR2
YW5jZQorICAgICAgICByZXN1bHQKKyAgICBlbmQKKworICAgIGRlZiBjb25zdW1lS2luZAorICAg
ICAgICByZXN1bHQgPSB0b2tlbi5zdHJpbmcKKyAgICAgICAgcGFyc2VFcnJvcigiRXhwZWN0ZWQg
a2luZCAoSW1tLCBJbW1QdHIsIFRtcCwgQWRkciwgb3IgSW5kZXgpIikgdW5sZXNzIGlzS2luZChy
ZXN1bHQpCisgICAgICAgIGFkdmFuY2UKKyAgICAgICAgcmVzdWx0CisgICAgZW5kCisKKyAgICBk
ZWYgcGFyc2UKKyAgICAgICAgcmVzdWx0ID0ge30KKyAgICAgICAgCisgICAgICAgIGxvb3Agewor
ICAgICAgICAgICAgYnJlYWsgaWYgQGlkeCA+PSBAdG9rZW5zLmxlbmd0aAorCisgICAgICAgICAg
ICBpZiB0b2tlbiA9PSAic3BlY2lhbCIKKyAgICAgICAgICAgICAgICBjb25zdW1lKCJzcGVjaWFs
IikKKyAgICAgICAgICAgICAgICBvcGNvZGVOYW1lID0gY29uc3VtZUlkZW50aWZpZXIKKworICAg
ICAgICAgICAgICAgIHBhcnNlRXJyb3IoIkNhbm5vdCBvdmVybG9hZCBhIHNwZWNpYWwgb3Bjb2Rl
IikgaWYgcmVzdWx0W29wY29kZU5hbWVdCisKKyAgICAgICAgICAgICAgICByZXN1bHRbb3Bjb2Rl
TmFtZV0gPSBPcGNvZGUubmV3KG9wY29kZU5hbWUsIHRydWUpCisgICAgICAgICAgICBlbHNlCisg
ICAgICAgICAgICAgICAgb3Bjb2RlTmFtZSA9IGNvbnN1bWVJZGVudGlmaWVyCisKKyAgICAgICAg
ICAgICAgICBpZiByZXN1bHRbb3Bjb2RlTmFtZV0KKyAgICAgICAgICAgICAgICAgICAgb3Bjb2Rl
ID0gcmVzdWx0W29wY29kZU5hbWVdCisgICAgICAgICAgICAgICAgICAgIHBhcnNlRXJyb3IoIkNh
bm5vdCBvdmVybG9hZCBhIHNwZWNpYWwgb3Bjb2RlIikgaWYgb3Bjb2RlLnNwZWNpYWwKKyAgICAg
ICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIG9wY29kZSA9IE9wY29kZS5uZXco
b3Bjb2RlTmFtZSwgZmFsc2UpCisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtvcGNvZGVOYW1l
XSA9IG9wY29kZQorICAgICAgICAgICAgICAgIGVuZAorCisgICAgICAgICAgICAgICAgc2lnbmF0
dXJlID0gW10KKyAgICAgICAgICAgICAgICBmb3JtcyA9IFtdCisgICAgICAgICAgICAgICAgaWYg
aXNVRCh0b2tlbikKKyAgICAgICAgICAgICAgICAgICAgbG9vcCB7CisgICAgICAgICAgICAgICAg
ICAgICAgICByb2xlID0gY29uc3VtZVJvbGUKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN1
bWUoIjoiKQorICAgICAgICAgICAgICAgICAgICAgICAgdHlwZSA9IGNvbnN1bWVUeXBlCisgICAg
ICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgIHNpZ25hdHVyZSA8
PCBBcmcubmV3KHJvbGUsIHR5cGUpCisgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAg
ICAgICAgICAgICAgICAgIGJyZWFrIHVubGVzcyB0b2tlbiA9PSAiLCIKKyAgICAgICAgICAgICAg
ICAgICAgICAgIGNvbnN1bWUoIiwiKQorICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAg
ICAgICAgICAgICAgbG9vcCB7CisgICAgICAgICAgICAgICAgICAgICAgICBraW5kcyA9IFtdCisg
ICAgICAgICAgICAgICAgICAgICAgICBhbHROYW1lID0gbmlsCisgICAgICAgICAgICAgICAgICAg
ICAgICBsb29wIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBraW5kcyA8PCBLaW5kLm5l
dyhjb25zdW1lS2luZCkKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIHRva2VuID09
ICIqIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJzZUVycm9yKCJDYW4gb25s
eSBhcHBseSAqIHRvIFRtcCIpIHVubGVzcyBraW5kc1stMV0ubmFtZSA9PSAiVG1wIgorICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICBraW5kc1stMV0uc3BlY2lhbCA9IHRydWUKKyAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3VtZSgiKiIpCisgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgZW5kCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhayB1bmxl
c3MgdG9rZW4gPT0gIiwiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3VtZSgiLCIp
CisgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGlm
IHRva2VuID09ICJhcyIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdW1lKCJhcyIp
CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWx0TmFtZSA9IGNvbnN1bWVJZGVudGlmaWVy
CisgICAgICAgICAgICAgICAgICAgICAgICBlbmQKKworICAgICAgICAgICAgICAgICAgICAgICAg
cGFyc2VFcnJvcigiRm9ybSBoYXMgd3JvbmcgbnVtYmVyIG9mIGFyZ3VtZW50cyBmb3Igb3Zlcmxv
YWQiKSB1bmxlc3Mga2luZHMubGVuZ3RoID09IHNpZ25hdHVyZS5sZW5ndGgKKyAgICAgICAgICAg
ICAgICAgICAgICAgIGtpbmRzLmVhY2hfd2l0aF9pbmRleCB7CisgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgfCBraW5kLCBpbmRleCB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYg
a2luZC5uYW1lID09ICJJbW0iIG9yIGtpbmQubmFtZSA9PSAiSW1tUHRyIgorICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICBpZiBzaWduYXR1cmVbaW5kZXhdLnJvbGUgIT0gIlUiCisgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJzZUVycm9yKCJGb3JtIGhhcyBhbiBp
bW1lZGlhdGUgZm9yIGEgbm9uLXVzZSBhcmd1bWVudCIpCisgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgIGVuZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiBzaWduYXR1
cmVbaW5kZXhdLnR5cGUgIT0gIkciCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICBwYXJzZUVycm9yKCJGb3JtIGhhcyBhbiBpbW1lZGlhdGUgZm9yIGEgbm9uLWdlbmVyYWwtcHVy
cG9zZSBhcmd1bWVudCIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuZAorICAg
ICAgICAgICAgICAgICAgICAgICAgICAgIGVuZAorICAgICAgICAgICAgICAgICAgICAgICAgfQor
ICAgICAgICAgICAgICAgICAgICAgICAgZm9ybXMgPDwgRm9ybS5uZXcoa2luZHMsIGFsdE5hbWUp
CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhayB1bmxlc3MgaXNLaW5kKHRva2VuKQorICAg
ICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAg
ICAgICBzaWduYXR1cmUgPSBbXQorICAgICAgICAgICAgICAgICAgICBmb3JtcyA9IFtGb3JtLm5l
dyhbXSwgbmlsKV0KKyAgICAgICAgICAgICAgICBlbmQKKworICAgICAgICAgICAgICAgIG9wY29k
ZS5vdmVybG9hZHMgPDwgT3ZlcmxvYWQubmV3KHNpZ25hdHVyZSwgZm9ybXMpCisgICAgICAgICAg
ICBlbmQKKyAgICAgICAgfQorCisgICAgICAgIHJlc3VsdAorICAgIGVuZAorZW5kCisKKyRmaWxl
TmFtZSA9IEFSR1ZbMF0KKworcGFyc2VyID0gUGFyc2VyLm5ldyhJTzo6cmVhZCgkZmlsZU5hbWUp
LCAkZmlsZU5hbWUpCiskb3Bjb2RlcyA9IHBhcnNlci5wYXJzZQorCitkZWYgd3JpdGVIKGZpbGVu
YW1lKQorICAgIEZpbGUub3BlbigiQWlyI3tmaWxlbmFtZX0uaCIsICJ3IikgeworICAgICAgICB8
IG91dHAgfAorICAgICAgICAKKyAgICAgICAgb3V0cC5wdXRzICIvLyBHZW5lcmF0ZWQgYnkgb3Bj
b2RlX2dlbmVyYXRvci5yYiBmcm9tICN7JGZpbGVOYW1lfSAtLSBkbyBub3QgZWRpdCEiCisgICAg
ICAgIAorICAgICAgICBvdXRwLnB1dHMgIiNpZm5kZWYgQWlyI3tmaWxlbmFtZX1faCIKKyAgICAg
ICAgb3V0cC5wdXRzICIjZGVmaW5lIEFpciN7ZmlsZW5hbWV9X2giCisKKyAgICAgICAgeWllbGQg
b3V0cAorICAgICAgICAKKyAgICAgICAgb3V0cC5wdXRzICIjZW5kaWYgLy8gQWlyI3tmaWxlbmFt
ZX1faCIKKyAgICB9CitlbmQKKworZGVmIHdyaXRlQ1BQKGZpbGVuYW1lKQorICAgIEZpbGUub3Bl
bigiQWlyI3tmaWxlbmFtZX0uY3BwIiwgInciKSB7CisgICAgICAgIHwgb3V0cCB8CisgICAgICAg
IAorICAgICAgICBvdXRwLnB1dHMgIi8vIEdlbmVyYXRlZCBieSBvcGNvZGVfZ2VuZXJhdG9yLnJi
IGZyb20gI3skZmlsZU5hbWV9IC0tIGRvIG5vdCBlZGl0ISIKKyAgICAgICAgCisgICAgICAgIG91
dHAucHV0cyAiI2luY2x1ZGUgXCJjb25maWcuaFwiIgorICAgICAgICBvdXRwLnB1dHMgIiNpbmNs
dWRlIFwiQWlyI3tmaWxlbmFtZX0uaFwiIgorCisgICAgICAgIHlpZWxkIG91dHAKKyAgICB9Citl
bmQKKword3JpdGVIKCJPcGNvZGVzIikgeworICAgIHwgb3V0cCB8CisgICAgb3V0cC5wdXRzICJu
YW1lc3BhY2UgSlNDIHsgbmFtZXNwYWNlIEIzIHsgbmFtZXNwYWNlIEFpciB7IgorICAgIG91dHAu
cHV0cyAiZW51bSBPcGNvZGUgOiBpbnQxNl90IHsiCisgICAgJG9wY29kZXMua2V5cy5zb3J0LmVh
Y2ggeworICAgICAgICB8IG9wY29kZSB8CisgICAgICAgIG91dHAucHV0cyAiICAgICN7b3Bjb2Rl
fSwiCisgICAgfQorICAgIG91dHAucHV0cyAifSIKKworICAgIG91dHAucHV0cyAic3RhdGljIGNv
bnN0IHVuc2lnbmVkIG51bU9wY29kZXMgPSAjeyRvcGNvZGVzLmtleXMuc2l6ZX07IgorICAgIG91
dHAucHV0cyAifSB9IH0gLy8gbmFtZXNwYWNlIEpTQzo6QjM6OkFpciIKKyAgICAKKyAgICBvdXRw
LnB1dHMgIm5hbWVzcGFjZSBXVEYgeyIKKyAgICBvdXRwLnB1dHMgImNsYXNzIFByaW50U3RyZWFt
OyIKKyAgICBvdXRwLnB1dHMgInZvaWQgcHJpbnRJbnRlcm5hbChQcmludFN0cmVhbSYsIEpTQzo6
QjM6OkFpcjo6T3Bjb2RlKTsiCisgICAgb3V0cC5wdXRzICJ9IC8vIG5hbWVzcGFjZSBXVEYiCit9
CisKK3dyaXRlQ1BQKCJPcGNvZGVzIikgeworICAgIHwgb3V0cCB8CisgICAgb3V0cC5wdXRzICIj
aW5jbHVkZSBcInd0Zi9QcmludFN0cmVhbS5oXCIiCisgICAgb3V0cC5wdXRzICJuYW1lc3BhY2Ug
V1RGIHsiCisgICAgb3V0cC5wdXRzICJ1c2luZyBuYW1lc3BhY2UgSlNDOjpCMzo6QWlyOyIKKyAg
ICBvdXRwLnB1dHMgInZvaWQgcHJpbnRJbnRlcm5hbChQcmludFN0cmVhbSYgb3V0LCBPcGNvZGUg
b3Bjb2RlKSIKKyAgICBvdXRwLnB1dHMgInsiCisgICAgb3V0cC5wdXRzICIgICAgc3dpdGNoIChv
cGNvZGUpIHsiCisgICAgJG9wY29kZXMua2V5cy5lYWNoIHsKKyAgICAgICAgfCBvcGNvZGUgfAor
ICAgICAgICBvdXRwLnB1dHMgIiAgICBjYXNlICN7b3Bjb2RlfToiCisgICAgICAgIG91dHAucHV0
cyAiICAgICAgICBvdXQucHJpbnQoXCIje29wY29kZX1cIik7IgorICAgICAgICBvdXRwLnB1dHMg
IiAgICAgICAgcmV0dXJuOyIKKyAgICB9CisgICAgb3V0cC5wdXRzICIgICAgfSIKKyAgICBvdXRw
LnB1dHMgIiAgICBSRUxFQVNFX0FTU0VSVF9OT1RfUkVBQ0hFRCgpOyIKKyAgICBvdXRwLnB1dHMg
In0iCisgICAgb3V0cC5wdXRzICJ9IC8vIG5hbWVzcGFjZSBXVEYiCit9CisKKyMgRnJvbSBoZXJl
IG9uLCB3ZSBkb24ndCB0cnkgdG8gZW1pdCBwcm9wZXJseSBpbmRlbnRlZCBjb2RlLCBzaW5jZSB3
ZSdyZSB1c2luZyBhIHJlY3Vyc2l2ZSBwYXR0ZXJuCisjIG1hdGNoZXIuCisKK2RlZiBtYXRjaEZv
cm1zKG91dHAsIHNwZWVkLCBmb3JtcywgY29sdW1uSW5kZXgsIGNvbHVtbkdldHRlciwgZmlsdGVy
LCBjYWxsYmFjaykKKyAgICByZXR1cm4gaWYgZm9ybXMubGVuZ3RoID09IDAKKworICAgIGlmIGZp
bHRlcltmb3Jtc10KKyAgICAgICAgcmV0dXJuCisgICAgZW5kCisKKyAgICBpZiBjb2x1bW5JbmRl
eCA+PSBmb3Jtc1swXS5raW5kcy5sZW5ndGgKKyAgICAgICAgcmFpc2UgdW5sZXNzIGZvcm1zLmxl
bmd0aCA9PSAxCisgICAgICAgIGNhbGxiYWNrW2Zvcm1zWzBdXQorICAgICAgICByZXR1cm4KKyAg
ICBlbmQKKyAgICAKKyAgICBncm91cHMgPSB7fQorICAgIGZvcm1zLmVhY2ggeworICAgICAgICB8
IGZvcm0gfAorICAgICAgICBraW5kID0gZm9ybS5raW5kc1tjb2x1bW5JbmRleF0ubmFtZQorICAg
ICAgICBpZiBncm91cHNba2luZF0KKyAgICAgICAgICAgIGdyb3Vwc1traW5kXSA8PCBmb3JtCisg
ICAgICAgIGVsc2UKKyAgICAgICAgICAgIGdyb3Vwc1traW5kXSA9IFtmb3JtXQorICAgICAgICBl
bmQKKyAgICB9CisKKyAgICBpZiBzcGVlZCA9PSA6ZmFzdCBhbmQgZ3JvdXBzLmxlbmd0aCA9PSAx
CisgICAgICAgIG1hdGNoRm9ybXMob3V0cCwgc3BlZWQsIGZvcm1zLCBjb2x1bW5JbmRleCArIDEs
IGNvbHVtbkdldHRlciwgZmlsdGVyLCBjYWxsYmFjaykKKyAgICAgICAgcmV0dXJuCisgICAgZW5k
CisKKyAgICBvdXRwLnB1dHMgInN3aXRjaCAoI3tjb2x1bW5HZXR0ZXJbY29sdW1uSW5kZXhdfSkg
eyIKKyAgICBncm91cHMuZWFjaF9wYWlyIHsKKyAgICAgICAgfCBrZXksIHZhbHVlIHwKKyAgICAg
ICAgb3V0cC5wdXRzICJjYXNlIEFyZzo6I3trZXl9OiIKKyAgICAgICAgbWF0Y2hGb3JtcyhvdXRw
LCBzcGVlZCwgdmFsdWUsIGNvbHVtbkluZGV4ICsgMSwgY29sdW1uR2V0dGVyLCBmaWx0ZXIsIGNh
bGxiYWNrKQorICAgICAgICBvdXRwLnB1dHMgImJyZWFrOyIKKyAgICB9CisgICAgb3V0cC5wdXRz
ICJkZWZhdWx0OiIKKyAgICBvdXRwLnB1dHMgImJyZWFrOyIKKyAgICBvdXRwLnB1dHMgIn0iCitl
bmQKKworZGVmIG1hdGNoSW5zdE92ZXJsb2FkKG91dHAsIHNwZWVkLCBpbnN0KQorICAgIG91dHAu
cHV0cyAic3dpdGNoICgje2luc3R9LT5vcGNvZGUpIHsiCisgICAgJG9wY29kZXMudmFsdWVzLmVh
Y2ggeworICAgICAgICB8IG9wY29kZSB8CisgICAgICAgIG91dHAucHV0cyAiY2FzZSAje29wY29k
ZS5uYW1lfToiCisgICAgICAgIGlmIG9wY29kZS5zcGVjaWFsCisgICAgICAgICAgICB5aWVsZCBv
cGNvZGUsIG5pbAorICAgICAgICBlbHNlCisgICAgICAgICAgICBuZWVkT3ZlcmxvYWRTd2l0Y2gg
PSAoKG9wY29kZS5vdmVybG9hZHMuc2l6ZSAhPSAxKSBvciBzcGVlZCA9PSA6c2FmZSkKKyAgICAg
ICAgICAgIG91dHAucHV0cyAic3dpdGNoICgje2luc3R9LT5hcmdzLnNpemUoKSkgeyIgaWYgbmVl
ZE92ZXJsb2FkU3dpdGNoCisgICAgICAgICAgICBvcGNvZGUub3ZlcmxvYWRzLmVhY2ggeworICAg
ICAgICAgICAgICAgIHwgb3ZlcmxvYWQgfAorICAgICAgICAgICAgICAgIG91dHAucHV0cyAiY2Fz
ZSAje292ZXJsb2FkLnNpZ25hdHVyZS5sZW5ndGh9OiIgaWYgbmVlZE92ZXJsb2FkU3dpdGNoCisg
ICAgICAgICAgICAgICAgeWllbGQgb3Bjb2RlLCBvdmVybG9hZAorICAgICAgICAgICAgICAgIG91
dHAucHV0cyAiYnJlYWs7IiBpZiBuZWVkT3ZlcmxvYWRTd2l0Y2gKKyAgICAgICAgICAgIH0KKyAg
ICAgICAgICAgIGlmIG5lZWRPdmVybG9hZFN3aXRjaAorICAgICAgICAgICAgICAgIG91dHAucHV0
cyAiZGVmYXVsdDoiCisgICAgICAgICAgICAgICAgb3V0cC5wdXRzICJicmVhazsiCisgICAgICAg
ICAgICAgICAgb3V0cC5wdXRzICJ9IgorICAgICAgICAgICAgZW5kCisgICAgICAgIGVuZAorICAg
ICAgICBvdXRwLnB1dHMgImJyZWFrOyIKKyAgICB9CisgICAgb3V0cC5wdXRzICJkZWZhdWx0OiIK
KyAgICBvdXRwLnB1dHMgImJyZWFrOyIKKyAgICBvdXRwLnB1dHMgIn0iCitlbmQKKyAgICAKK2Rl
ZiBtYXRjaEluc3RPdmVybG9hZEZvcm0ob3V0cCwgc3BlZWQsIGluc3QpCisgICAgbWF0Y2hJbnN0
T3ZlcmxvYWQob3V0cCwgc3BlZWQsIGluc3QpIHsKKyAgICAgICAgfCBvcGNvZGUsIG92ZXJsb2Fk
IHwKKyAgICAgICAgaWYgb3Bjb2RlLnNwZWNpYWwKKyAgICAgICAgICAgIHlpZWxkIG9wY29kZSwg
bmlsLCBuaWwKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgY29sdW1uR2V0dGVyID0gcHJvYyB7
CisgICAgICAgICAgICAgICAgfCBjb2x1bW5JbmRleCB8CisgICAgICAgICAgICAgICAgIiN7aW5z
dH0tPmFyZ3NbI3tjb2x1bW5JbmRleH1dLmtpbmQoKSIKKyAgICAgICAgICAgIH0KKyAgICAgICAg
ICAgIGZpbHRlciA9IHByb2MgeyBmYWxzZSB9CisgICAgICAgICAgICBjYWxsYmFjayA9IHByb2Mg
eworICAgICAgICAgICAgICAgIHwgZm9ybSB8CisgICAgICAgICAgICAgICAgeWllbGQgb3Bjb2Rl
LCBvdmVybG9hZCwgZm9ybQorICAgICAgICAgICAgfQorICAgICAgICAgICAgbWF0Y2hGb3Jtcyhv
dXRwLCBzcGVlZCwgb3ZlcmxvYWQuZm9ybXMsIDAsIGNvbHVtbkdldHRlciwgZmlsdGVyLCBjYWxs
YmFjaykKKyAgICAgICAgZW5kCisgICAgfQorZW5kCisKK3dyaXRlSCgiT3Bjb2RlVXRpbHMiKSB7
CisgICAgfCBvdXRwIHwKKyAgICBvdXRwLnB1dHMgIiNpbmNsdWRlIFwiQWlySW5zdC5oXCIiCisg
ICAgb3V0cC5wdXRzICIjaW5jbHVkZSBcIkFpclNwZWNpYWxzLmhcIiIKKyAgICBvdXRwLnB1dHMg
Im5hbWVzcGFjZSBKU0MgeyBuYW1lc3BhY2UgQjMgeyBuYW1lc3BhY2UgQWlyIHsiCisgICAgb3V0
cC5wdXRzICJ0ZW1wbGF0ZTx0eXBlbmFtZSBGdW5jdG9yPiIKKyAgICBvdXRwLnB1dHMgInZvaWQg
SW5zdDo6Zm9yRWFjaEFyZ1JvbGUoY29uc3QgRnVuY3RvciYgZnVuY3RvcikiCisgICAgb3V0cC5w
dXRzICJ7IgorICAgIG1hdGNoSW5zdE92ZXJsb2FkKG91dHAsIDpmYXN0LCAidGhpcyIpIHsKKyAg
ICAgICAgfCBvcGNvZGUsIG92ZXJsb2FkIHwKKyAgICAgICAgaWYgb3Bjb2RlLnNwZWNpYWwKKyAg
ICAgICAgICAgIG91dHAucHV0cyAiI3tvcGNvZGUubmFtZX1TcGVjaWFsczo6Zm9yRWFjaEFyZ1Jv
bGUodGhpcywgZnVuY3Rvcik7IgorICAgICAgICBlbHNlCisgICAgICAgICAgICBvdmVybG9hZC5z
aWduYXR1cmUuZWFjaF93aXRoX2luZGV4IHsKKyAgICAgICAgICAgICAgICB8IGFyZywgaW5kZXgg
fAorICAgICAgICAgICAgICAgIHJvbGUgPSBuaWwKKyAgICAgICAgICAgICAgICBjYXNlIGFyZy5y
b2xlCisgICAgICAgICAgICAgICAgd2hlbiAiVSIKKyAgICAgICAgICAgICAgICAgICAgcm9sZSA9
ICJVc2UiCisgICAgICAgICAgICAgICAgd2hlbiAiRCIKKyAgICAgICAgICAgICAgICAgICAgcm9s
ZSA9ICJEZWYiCisgICAgICAgICAgICAgICAgd2hlbiAiVUQiCisgICAgICAgICAgICAgICAgICAg
IHJvbGUgPSAiVXNlRGVmIgorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAg
ICAgcmFpc2UKKyAgICAgICAgICAgICAgICBlbmQKKyAgICAgICAgICAgICAgICAKKyAgICAgICAg
ICAgICAgICBvdXRwLnB1dHMgImZ1bmN0b3IoYXJnc1sje2luZGV4fV0sIEFyZzo6I3tyb2xlfSwg
QXJnOjoje2FyZy50eXBlfVApOyIKKyAgICAgICAgICAgIH0KKyAgICAgICAgZW5kCisgICAgfQor
ICAgIG91dHAucHV0cyAifSIKKyAgICBvdXRwLnB1dHMgIn0gfSB9IC8vIG5hbWVzcGFjZSBKU0M6
OkIzOjpBaXIiCit9CisKK3dyaXRlQ1BQKCJPcGNvZGVVdGlscyIpIHsKKyAgICB8IG91dHAgfAor
ICAgIG91dHAucHV0cyAiI2luY2x1ZGUgXCJBaXJJbnN0LmhcIiIKKyAgICBvdXRwLnB1dHMgIiNp
bmNsdWRlIFwiQWlyU3BlY2lhbHMuaFwiIgorICAgIG91dHAucHV0cyAibmFtZXNwYWNlIEpTQyB7
IG5hbWVzcGFjZSBCMyB7IG5hbWVzcGFjZSBBaXIgeyIKKyAgICBvdXRwLnB1dHMgImlubGluZSBi
b29sIGhpZGRlblRydXRoKCkgeyByZXR1cm4gdHJ1ZTsgfSIKKyAgICBvdXRwLnB1dHMgIiNkZWZp
bmUgUkVUVVJOKHZhbHVlKSBkbyB7XFwiCisgICAgb3V0cC5wdXRzICIgICAgaWYgKGhpZGRlblRy
dXRoKCkpXFwiCisgICAgb3V0cC5wdXRzICIgICAgICAgIHJldHVybiB2YWx1ZTtcXCIKKyAgICBv
dXRwLnB1dHMgIn0iCisgICAgb3V0cC5wdXRzICJib29sIEluc3Q6OmlzVmFsaWRGb3JtKCkiCisg
ICAgb3V0cC5wdXRzICJ7IgorICAgIG1hdGNoSW5zdE92ZXJsb2FkRm9ybShvdXRwLCA6c2FmZSwg
InRoaXMiKSB7CisgICAgICAgIHwgb3Bjb2RlLCBvdmVybG9hZCwgZm9ybSB8CisgICAgICAgIGlm
IG9wY29kZS5zcGVjaWFsCisgICAgICAgICAgICBvdXRwLnB1dHMgIlJFVFVSTigje29wY29kZS5u
YW1lfVNwZWNpYWxzOjppc1ZhbGlkKHRoaXMpKTsiCisgICAgICAgIGVsc2UKKyAgICAgICAgICAg
IG5lZWRzTW9yZVZhbGlkYXRpb24gPSBmYWxzZQorICAgICAgICAgICAgb3ZlcmxvYWQuc2lnbmF0
dXJlLmxlbmd0aC50aW1lcyB7CisgICAgICAgICAgICAgICAgfCBpbmRleCB8CisgICAgICAgICAg
ICAgICAgcm9sZSA9IG92ZXJsb2FkLnNpZ25hdHVyZVtpbmRleF0ucm9sZQorICAgICAgICAgICAg
ICAgIHR5cGUgPSBvdmVybG9hZC5zaWduYXR1cmVbaW5kZXhdLnR5cGUKKyAgICAgICAgICAgICAg
ICBraW5kID0gZm9ybS5raW5kc1tpbmRleF0KKyAgICAgICAgICAgICAgICBuZWVkc01vcmVWYWxp
ZGF0aW9uIHw9IGtpbmQuc3BlY2lhbAorICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAg
ICMgV2UgYWxyZWFkeSBrbm93IHRoYXQgdGhlIGZvcm0gbWF0Y2hlcy4gV2UgZG9uJ3QgaGF2ZSB0
byB2YWxpZGF0ZSB0aGUgcm9sZSwgc2luY2UKKyAgICAgICAgICAgICAgICAjIGtpbmQgaW1wbGll
cyByb2xlLiBTbywgdGhlIG9ubHkgdGhpbmcgbGVmdCB0byB2YWxpZGF0ZSBpcyB0aGUgdHlwZS4g
QW5kIHdlIG9ubHkgaGF2ZQorICAgICAgICAgICAgICAgICMgdG8gdmFsaWRhdGUgdGhlIHR5cGUg
aWYgd2UgaGF2ZSBhIFRtcC4KKyAgICAgICAgICAgICAgICBpZiBraW5kLm5hbWUgPT0gIlRtcCIK
KyAgICAgICAgICAgICAgICAgICAgb3V0cC5wdXRzICJpZiAoIWFyZ3NbI3tpbmRleH1dLnRtcCgp
LmlzI3t0eXBlfVAoKSkiCisgICAgICAgICAgICAgICAgICAgIG91dHAucHV0cyAiUkVUVVJOKGZh
bHNlKTsiCisgICAgICAgICAgICAgICAgZW5kCisgICAgICAgICAgICB9CisgICAgICAgICAgICBp
ZiBuZWVkc01vcmVWYWxpZGF0aW9uCisgICAgICAgICAgICAgICAgb3V0cC5wdXRzICJpZiAoISN7
b3Bjb2RlLm5hbWV9U3BlY2lhbHM6OmlzVmFsaWQodGhpcykpIgorICAgICAgICAgICAgICAgIG91
dHAucHV0cyAiUkVUVVJOKGZhbHNlKTsiCisgICAgICAgICAgICBlbmQKKyAgICAgICAgICAgIG91
dHAucHV0cyAiUkVUVVJOKHRydWUpOyIKKyAgICAgICAgZW5kCisgICAgfQorICAgIG91dHAucHV0
cyAicmV0dXJuIGZhbHNlOyIKKyAgICBvdXRwLnB1dHMgIn0iCisKKyAgICBvdXRwLnB1dHMgImJv
b2wgSW5zdDo6YWRtaXRzQWRkcih1bnNpZ25lZCBhcmdJbmRleCkiCisgICAgb3V0cC5wdXRzICJ7
IgorICAgIG91dHAucHV0cyAic3dpdGNoIChvcGNvZGUpIHsiCisgICAgJG9wY29kZXMudmFsdWVz
LmVhY2ggeworICAgICAgICB8IG9wY29kZSB8CisgICAgICAgIG91dHAucHV0cyAiY2FzZSAje29w
Y29kZS5uYW1lfToiCisKKyAgICAgICAgaWYgb3Bjb2RlLnNwZWNpYWwKKyAgICAgICAgICAgIG91
dHAucHV0cyAiUkVUVVJOKCN7b3Bjb2RlLm5hbWV9U3BlY2lhbHM6OmFkbWl0c0FkZHIoYXJnSW5k
ZXgpKTsiCisgICAgICAgIGVsc2UKKyAgICAgICAgICAgICMgU3dpdGNoIG9uIHRoZSBhcmdJbmRl
eC4KKyAgICAgICAgICAgIG91dHAucHV0cyAic3dpdGNoIChhcmdJbmRleCkgeyIKKworICAgICAg
ICAgICAgbnVtQXJncyA9IG9wY29kZS5vdmVybG9hZHMubWFwIHsKKyAgICAgICAgICAgICAgICB8
IG92ZXJsb2FkIHwKKyAgICAgICAgICAgICAgICBvdmVybG9hZC5zaWduYXR1cmUubGVuZ3RoCisg
ICAgICAgICAgICB9Lm1heAorICAgICAgICAgICAgCisgICAgICAgICAgICBudW1BcmdzLnRpbWVz
IHsKKyAgICAgICAgICAgICAgICB8IGFyZ0luZGV4IHwKKyAgICAgICAgICAgICAgICBvdXRwLnB1
dHMgImNhc2UgI3thcmdJbmRleH06IgorCisgICAgICAgICAgICAgICAgIyBDaGVjayBpZiBhbGwg
b2YgdGhlIGZvcm1zIG9mIGFsbCBvZiB0aGUgb3ZlcmxvYWRzIGVpdGhlciBkbywgb3IgZG9uJ3Qs
IGFkbWl0IGFuIGFkZHJlc3MKKyAgICAgICAgICAgICAgICAjIGF0IHRoaXMgaW5kZXguIFdlIGV4
cGVjdCB0aGlzIHRvIGJlIGEgdmVyeSBjb21tb24gY2FzZS4KKyAgICAgICAgICAgICAgICBudW1Z
ZXMgPSAwCisgICAgICAgICAgICAgICAgbnVtTm8gPSAwCisgICAgICAgICAgICAgICAgb3Bjb2Rl
Lm92ZXJsb2Fkcy5lYWNoIHsKKyAgICAgICAgICAgICAgICAgICAgfCBvdmVybG9hZCB8CisgICAg
ICAgICAgICAgICAgICAgIG92ZXJsb2FkLmZvcm1zLmVhY2ggeworICAgICAgICAgICAgICAgICAg
ICAgICAgfCBmb3JtIHwKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIGZvcm0ua2luZHNbYXJn
SW5kZXhdID09ICJBZGRyIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bVllcyArPSAx
CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgbnVtTm8gKz0gMQorICAgICAgICAgICAgICAgICAgICAgICAgZW5kCisgICAgICAgICAgICAg
ICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAjIE5vdGUgdGhh
dCB3ZSBkZWxpYmVyYXRlbHkgdGVzdCBudW1ZZXMgZmlyc3QgYmVjYXVzZSBpZiB3ZSBlbmQgdXAg
d2l0aCBubyBmb3Jtcywgd2Ugd2FudAorICAgICAgICAgICAgICAgICMgdG8gc2F5IHRoYXQgQWRk
cmVzcyBpcyBpbmFkbWlzc2libGUuCisgICAgICAgICAgICAgICAgaWYgbnVtWWVzID09IDAKKyAg
ICAgICAgICAgICAgICAgICAgb3V0cC5wdXRzICJSRVRVUk4oZmFsc2UpOyIKKyAgICAgICAgICAg
ICAgICBlbHNpZiBudW1ObyA9PSAwCisgICAgICAgICAgICAgICAgICAgIG91dHAucHV0cyAiUkVU
VVJOKHRydWUpOyIKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICMg
Tm93IGRvIHRoZSBmdWxsIHRlc3QuCisKKyAgICAgICAgICAgICAgICAgICAgbmVlZE92ZXJsb2Fk
U3dpdGNoID0gKG9wY29kZS5vdmVybG9hZHMuc2l6ZSAhPSAxKQorCisgICAgICAgICAgICAgICAg
ICAgIG91dHAucHV0cyAic3dpdGNoIChhcmdzLnNpemUoKSkgeyIgaWYgbmVlZE92ZXJsb2FkU3dp
dGNoCisgICAgICAgICAgICAgICAgICAgIG9wY29kZS5vdmVybG9hZHMuZWFjaCB7CisgICAgICAg
ICAgICAgICAgICAgICAgICB8IG92ZXJsb2FkIHwKKworICAgICAgICAgICAgICAgICAgICAgICAg
IyBBZ2FpbiwgY2hlY2sgaWYgYWxsIG9mIHRoZW0gZG8gd2hhdCB3ZSB3YW50LgorICAgICAgICAg
ICAgICAgICAgICAgICAgbnVtWWVzID0gMAorICAgICAgICAgICAgICAgICAgICAgICAgbnVtTm8g
PSAwCisgICAgICAgICAgICAgICAgICAgICAgICBvdmVybG9hZC5mb3Jtcy5lYWNoIHsKKyAgICAg
ICAgICAgICAgICAgICAgICAgICAgICB8IGZvcm0gfAorICAgICAgICAgICAgICAgICAgICAgICAg
ICAgIGlmIGZvcm0ua2luZHNbYXJnSW5kZXhdID09ICJBZGRyIgorICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICBudW1ZZXMgKz0gMQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVs
c2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtTm8gKz0gMQorICAgICAgICAg
ICAgICAgICAgICAgICAgICAgIGVuZAorICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAg
ICAgICAgICAgICAgICAgICAgICBpZiBudW1ZZXMgPT0gMAorICAgICAgICAgICAgICAgICAgICAg
ICAgIyBEb24ndCBlbWl0IGFueXRoaW5nLCBqdXN0IGRyb3AgdG8gZGVmYXVsdC4KKyAgICAgICAg
ICAgICAgICAgICAgICAgIGVsc2lmIG51bU5vID09IDAKKyAgICAgICAgICAgICAgICAgICAgICAg
ICAgICBvdXRwLnB1dHMgImNhc2UgI3tvdmVybG9hZC5zaWduYXR1cmUubGVuZ3RofToiIGlmIG5l
ZWRPdmVybG9hZFN3aXRjaAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHAucHV0cyAi
UkVUVVJOKHRydWUpOyIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwLnB1dHMgImJy
ZWFrOyIgaWYgbmVlZE92ZXJsb2FkU3dpdGNoCisgICAgICAgICAgICAgICAgICAgICAgICBlbHNl
CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cC5wdXRzICJjYXNlICN7b3ZlcmxvYWQu
c2lnbmF0dXJlLmxlbmd0aH06IiBpZiBuZWVkT3ZlcmxvYWRTd2l0Y2gKKworICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICMgVGhpcyBpcyBob3cgd2UgdGVzdCB0aGUgaHlwb3RoZXNpcyB0aGF0
IGNoYW5naW5nIHRoaXMgYXJndW1lbnQgdG8gYW4KKyAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAjIGFkZHJlc3MgeWllbGRzIGEgdmFsaWQgZm9ybS4KKyAgICAgICAgICAgICAgICAgICAgICAg
ICAgICBjb2x1bW5HZXR0ZXIgPSBwcm9jIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgfCBjb2x1bW5JbmRleCB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIGNv
bHVtbkluZGV4ID09IGFyZ0luZGV4CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAiQXJnOjpBZGRyIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYXJnc1sje2NvbHVtbkluZGV4fV0ua2lu
ZCgpIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmQKKyAgICAgICAgICAgICAg
ICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyID0gcHJv
YyB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgZm9ybXMgfAorICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICBudW1ZZXMgPSAwCisKKyAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgZm9ybXMuZWFjaCB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICB8IGZvcm0gfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgZm9y
bS5raW5kc1thcmdJbmRleF0gPT0gIkFkZHIiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgbnVtWWVzICs9IDEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgIGVuZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgaWYgbnVtWWVzID09IDAKKyAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICMgRHJvcCBkb3duLCBlbWl0IG5vIGNvZGUsIHNpbmNlIHdlIGNhbm5v
dCBtYXRjaC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRydWUKKyAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgIyBLZWVwIGdvaW5nLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgZmFsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5kCisgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxi
YWNrID0gcHJvYyB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHAucHV0cyAi
UkVUVVJOKHRydWUpOyIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgbWF0Y2hGb3JtcyhvdXRwLCA6c2FmZSwgb3ZlcmxvYWQuZm9ybXMs
IDAsIGNvbHVtbkdldHRlciwgZmlsdGVyLCBjYWxsYmFjaykKKworICAgICAgICAgICAgICAgICAg
ICAgICAgICAgIG91dHAucHV0cyAiYnJlYWs7IiBpZiBuZWVkT3ZlcmxvYWRTd2l0Y2gKKyAgICAg
ICAgICAgICAgICAgICAgICAgIGVuZAorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAg
ICAgICAgICAgIGlmIG5lZWRPdmVybG9hZFN3aXRjaAorICAgICAgICAgICAgICAgICAgICAgICAg
b3V0cC5wdXRzICJkZWZhdWx0OiIKKyAgICAgICAgICAgICAgICAgICAgICAgIG91dHAucHV0cyAi
YnJlYWs7IgorICAgICAgICAgICAgICAgICAgICAgICAgb3V0cC5wdXRzICJ9IgorICAgICAgICAg
ICAgICAgICAgICBlbmQKKyAgICAgICAgICAgICAgICBlbmQKKyAgICAgICAgICAgICAgICAKKyAg
ICAgICAgICAgICAgICBvdXRwLnB1dHMgImJyZWFrOyIKKyAgICAgICAgICAgIH0KKyAgICAgICAg
ICAgIAorICAgICAgICAgICAgb3V0cC5wdXRzICJkZWZhdWx0OiIKKyAgICAgICAgICAgIG91dHAu
cHV0cyAiYnJlYWs7IgorICAgICAgICAgICAgb3V0cC5wdXRzICJ9IgorICAgICAgICBlbmQKKyAg
ICAgICAgCisgICAgICAgIG91dHAucHV0cyAiYnJlYWs7IgorICAgIH0KKyAgICBvdXRwLnB1dHMg
ImRlZmF1bHQ6IjsKKyAgICBvdXRwLnB1dHMgImJyZWFrOyIKKyAgICBvdXRwLnB1dHMgIn0iCisg
ICAgb3V0cC5wdXRzICJyZXR1cm4gZmFsc2U7IgorICAgIG91dHAucHV0cyAifSIKKworICAgIG91
dHAucHV0cyAiTWFjcm9Bc3NlbWJsZXI6Okp1bXAgSW5zdDo6Z2VuZXJhdGUoTWFjcm9Bc3NlbWJs
ZXImIGppdCkgY29uc3QiCisgICAgb3V0cC5wdXRzICJ7IgorICAgIG91dHAucHV0cyAiTWFjcm9B
c3NlbWJsZXI6Okp1bXAgcmVzdWx0OyIKKyAgICBtYXRjaEluc3RPdmVybG9hZEZvcm0ob3V0cCwg
OmZhc3QsICJ0aGlzIikgeworICAgICAgICB8IG9wY29kZSwgb3ZlcmxvYWQsIGZvcm0gfAorICAg
ICAgICBpZiBvcGNvZGUuc3BlY2lhbAorICAgICAgICAgICAgb3V0cC5wdXRzICJSRVRVUk4oI3tv
cGNvZGUubmFtZX1TcGVjaWFsczo6Z2VuZXJhdGUodGhpcywgaml0KSk7IgorICAgICAgICBlbHNl
CisgICAgICAgICAgICBpZiBmb3JtLmFsdE5hbWUKKyAgICAgICAgICAgICAgICBtZXRob2ROYW1l
ID0gZm9ybS5hbHROYW1lCisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgbWV0aG9k
TmFtZSA9IG9wY29kZS5tYXNtTmFtZQorICAgICAgICAgICAgZW5kCisgICAgICAgICAgICBvdXRw
LnByaW50ICJqaXQuI3ttZXRob2ROYW1lfSgiCisKKyAgICAgICAgICAgIGZvcm0ua2luZHMuZWFj
aF93aXRoX2luZGV4IHsKKyAgICAgICAgICAgICAgICB8IGtpbmQsIGluZGV4IHwKKyAgICAgICAg
ICAgICAgICBpZiBpbmRleCAhPSAwCisgICAgICAgICAgICAgICAgICAgIG91dHAucHJpbnQgIiwg
IgorICAgICAgICAgICAgICAgIGVuZAorICAgICAgICAgICAgICAgIGNhc2Uga2luZC5uYW1lCisg
ICAgICAgICAgICAgICAgd2hlbiAiVG1wIgorICAgICAgICAgICAgICAgICAgICBpZiBvdmVybG9h
ZC5zaWduYXR1cmVbaW5kZXhdLnR5cGUgPT0gIkciCisgICAgICAgICAgICAgICAgICAgICAgICBv
dXRwLnByaW50ICJhcmdzWyN7aW5kZXh9XS5ncHIoKSIKKyAgICAgICAgICAgICAgICAgICAgZWxz
ZQorICAgICAgICAgICAgICAgICAgICAgICAgb3V0cC5wcmludCAiYXJnc1sje2luZGV4fV0uZnBy
KCkiCisgICAgICAgICAgICAgICAgICAgIGVuZAorICAgICAgICAgICAgICAgIHdoZW4gIkltbSIK
KyAgICAgICAgICAgICAgICAgICAgb3V0cC5wcmludCAiYXJnc1sje2luZGV4fV0uYXNUcnVzdGVk
SW1tMzIoKSIKKyAgICAgICAgICAgICAgICB3aGVuICJJbW1QdHIiCisgICAgICAgICAgICAgICAg
ICAgIG91dHAucHJpbnQgImFyZ3NbI3tpbmRleH1dLmFzVHJ1c3RlZEltbVB0cigpIgorICAgICAg
ICAgICAgICAgIHdoZW4gIkFkZHIiCisgICAgICAgICAgICAgICAgICAgIG91dHAucHJpbnQgImFy
Z3NbI3tpbmRleH1dLmFzQWRkcmVzcygpIgorICAgICAgICAgICAgICAgIHdoZW4gIkluZGV4Igor
ICAgICAgICAgICAgICAgICAgICBvdXRwLnByaW50ICJhcmdzWyN7aW5kZXh9XS5hc0Jhc2VJbmRl
eCgpIgorICAgICAgICAgICAgICAgIGVuZAorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBv
dXRwLnB1dHMgIik7IgorICAgICAgICAgICAgb3V0cC5wdXRzICJSRVRVUk4ocmVzdWx0KTsiCisg
ICAgICAgIGVuZAorICAgIH0KKyAgICBvdXRwLnB1dHMgIlJFTEVBU0VfQVNTRVJUX05PVF9SRUFD
SEVEKCk7IgorICAgIG91dHAucHV0cyAifSIKKyAgICAKKyAgICBvdXRwLnB1dHMgIn0gfSB9IC8v
IG5hbWVzcGFjZSBKU0M6OkIzOjpBaXIiCit9CisKSW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29y
ZS9qaXQvUmVnLmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRDb3JlL2ppdC9SZWcu
aAkocmV2aXNpb24gMTkxMjM5KQorKysgU291cmNlL0phdmFTY3JpcHRDb3JlL2ppdC9SZWcuaAko
d29ya2luZyBjb3B5KQpAQCAtMTA1LDcgKzEwNSw2IEBAIHB1YmxpYzoKICAgICB1bnNpZ25lZCBp
bmRleCgpIGNvbnN0IHsgcmV0dXJuIG1faW5kZXg7IH0KICAgICAKICAgICBib29sIGlzU2V0KCkg
Y29uc3QgeyByZXR1cm4gbV9pbmRleCAhPSBpbnZhbGlkKCk7IH0KLSAgICBib29sIG9wZXJhdG9y
ISgpIGNvbnN0IHsgcmV0dXJuICFpc1NldCgpOyB9CiAgICAgZXhwbGljaXQgb3BlcmF0b3IgYm9v
bCgpIGNvbnN0IHsgcmV0dXJuIGlzU2V0KCk7IH0KIAogICAgIGJvb2wgaXNIYXNoVGFibGVEZWxl
dGVkVmFsdWUoKSBjb25zdCB7IHJldHVybiBtX2luZGV4ID09IGRlbGV0ZWQoKTsgfQpAQCAtMTcw
LDYgKzE2OSw0NiBAQCBwdWJsaWM6CiAgICAgCiAgICAgdm9pZCBkdW1wKFByaW50U3RyZWFtJikg
Y29uc3Q7CiAKKyAgICBjbGFzcyBBbGxSZWdzSXRlcmFibGUgeworICAgIHB1YmxpYzoKKworICAg
ICAgICBjbGFzcyBpdGVyYXRvciB7CisgICAgICAgIHB1YmxpYzoKKyAgICAgICAgICAgIGl0ZXJh
dG9yKCkgeyB9CisKKyAgICAgICAgICAgIGV4cGxpY2l0IGl0ZXJhdG9yKFJlZyByZWcpCisgICAg
ICAgICAgICAgICAgOiBtX3JlZyhyZWcpCisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisK
KyAgICAgICAgICAgIFJlZyBvcGVyYXRvciooKSBjb25zdCB7IHJldHVybiBtX3JlZzsgfQorCisg
ICAgICAgICAgICBpdGVyYXRvciYgb3BlcmF0b3IrKygpCisgICAgICAgICAgICB7CisgICAgICAg
ICAgICAgICAgbV9yZWcgPSBtX3JlZy5uZXh0KCk7CisgICAgICAgICAgICAgICAgcmV0dXJuICp0
aGlzOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBib29sIG9wZXJhdG9yPT0oY29uc3Qg
aXRlcmF0b3ImIG90aGVyKSBjb25zdAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJl
dHVybiBtX3JlZyA9PSBvdGhlci5tX3JlZzsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAg
Ym9vbCBvcGVyYXRvciE9KGNvbnN0IGl0ZXJhdG9yJiBvdGhlcikgY29uc3QKKyAgICAgICAgICAg
IHsKKyAgICAgICAgICAgICAgICByZXR1cm4gISgqdGhpcyA9PSBvdGhlcik7CisgICAgICAgICAg
ICB9CisKKyAgICAgICAgcHJpdmF0ZToKKyAgICAgICAgICAgIFJlZyBtX3JlZzsKKyAgICAgICAg
fTsKKworICAgICAgICBpdGVyYXRvciBiZWdpbigpIGNvbnN0IHsgcmV0dXJuIGl0ZXJhdG9yKFJl
Zzo6Zmlyc3QoKSk7IH0KKyAgICAgICAgaXRlcmF0b3IgZW5kKCkgY29uc3QgeyByZXR1cm4gaXRl
cmF0b3IoUmVnKCkpOyB9CisgICAgfTsKKworICAgIHN0YXRpYyBBbGxSZWdzSXRlcmFibGUgYWxs
KCkgY29uc3QgeyByZXR1cm4gQWxsUmVnc0l0ZXJhYmxlKCk7IH0KKwogcHJpdmF0ZToKICAgICBz
dGF0aWMgdWludDhfdCBpbnZhbGlkKCkgeyByZXR1cm4gMHhmZjsgfQogCkluZGV4OiBTb3VyY2Uv
SmF2YVNjcmlwdENvcmUvaml0L1JlZ2lzdGVyU2V0LmgKPT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL0ph
dmFTY3JpcHRDb3JlL2ppdC9SZWdpc3RlclNldC5oCShyZXZpc2lvbiAxOTEyMzkpCisrKyBTb3Vy
Y2UvSmF2YVNjcmlwdENvcmUvaml0L1JlZ2lzdGVyU2V0LmgJKHdvcmtpbmcgY29weSkKQEAgLTEx
Nyw2ICsxMTcsMTMgQEAgcHVibGljOgogICAgIAogICAgIGJvb2wgb3BlcmF0b3I9PShjb25zdCBS
ZWdpc3RlclNldCYgb3RoZXIpIGNvbnN0IHsgcmV0dXJuIG1fdmVjdG9yID09IG90aGVyLm1fdmVj
dG9yOyB9CiAgICAgdW5zaWduZWQgaGFzaCgpIGNvbnN0IHsgcmV0dXJuIG1fdmVjdG9yLmhhc2go
KTsgfQorCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgRnVuY3Rvcj4KKyAgICB2b2lkIGZvckVhY2go
Y29uc3QgRnVuY3RvciYgZnVuY3RvcikKKyAgICB7CisgICAgICAgIGZvciAoc2l6ZV90IGluZGV4
IDogbV92ZWN0b3Iuc2V0Qml0cygpKQorICAgICAgICAgICAgZnVuY3RvcihSZWc6OmZyb21JbmRl
eChpbmRleCkpOworICAgIH0KICAgICAKIHByaXZhdGU6CiAgICAgdm9pZCBzZXRBbnkoUmVnIHJl
ZykgeyBzZXQocmVnKTsgfQo=
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>263549</attachid>
            <date>2015-10-19 21:59:56 -0700</date>
            <delta_ts>2015-10-20 14:16:18 -0700</delta_ts>
            <desc>a bit more</desc>
            <filename>blah.patch</filename>
            <type>text/plain</type>
            <size>228283</size>
            <attacher name="Filip Pizlo">fpizlo</attacher>
            
              <data encoding="base64">SW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM0FkZHJlc3NNYXRjaGVyLnBhdHRlcm5z
Cj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM0FkZHJlc3NNYXRjaGVy
LnBhdHRlcm5zCShyZXZpc2lvbiAwKQorKysgU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzQWRk
cmVzc01hdGNoZXIucGF0dGVybnMJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSw0MSBAQAorIyBD
b3B5cmlnaHQgKEMpIDIwMTUgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorIworIyBS
ZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9y
IHdpdGhvdXQKKyMgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhl
IGZvbGxvd2luZyBjb25kaXRpb25zCisjIGFyZSBtZXQ6CisjIDEuIFJlZGlzdHJpYnV0aW9ucyBv
ZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisjICAgIG5vdGlj
ZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4K
KyMgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBh
Ym92ZSBjb3B5cmlnaHQKKyMgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQg
dGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorIyAgICBkb2N1bWVudGF0aW9uIGFuZC9v
ciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorIworIyBU
SElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gQU5EIElUUyBDT05UUklCVVRP
UlMgYGBBUyBJUycnCisjIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElO
Q0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorIyBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9G
IE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisjIFBVUlBPU0Ug
QVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IgSVRTIENPTlRS
SUJVVE9SUworIyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFM
LCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCisjIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVE
SU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCisjIFNVQlNUSVRVVEUgR09P
RFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVT
UworIyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJ
QUJJTElUWSwgV0hFVEhFUiBJTgorIyBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9S
VCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorIyBBUklTSU5HIElOIEFOWSBX
QVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GCisj
IFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworbWF0Y2hlciBBZGRyZXNzTWF0Y2hl
cgorCisjIE5vdGUgdGhhdCB0aGlzIHJlbGllcyBvbiBCMyBkb2luZyBhZ2dyZXNzaXZlIHJlYXNz
b2NpYXRpb24gYW5kIGNhbm9uY2FsaXphdGlvbiBvZiBpbnRlZ2VyIGFkZHMuCisjIFdlJ2xsIG5l
dmVyIHNlZSBBZGQoQWRkKHgsIGNvbnN0MSksIGNvbnN0MikgYmVjYXVzZSBpdCB3b3VsZCBoYXZl
IGFscmVhZHkgYmVlbiByZWFzc29jaWF0ZWQgaW50bworIyBBZGQoeCwgY29uc3QxICsgY29uc3Qy
KS4gQWxzbywgd2Ugd2lsbCBuZXZlciBzZWUgQWRkKGNvbnN0LCB4KSwgYmVjYXVzZSB3ZSB3b3Vs
ZCBoYXZlIGNhbm9uaWNhbGl6ZWQKKyMgaXQgdG8gQWRkKHgsIGNvbnN0KS4gVGhhdCBzYWlkLCBp
biB0aGlzIGNvZGUgd2UgbmV2ZXIgbWFrZSBhc3NlcnRpb25zIGFib3V0IHRoZXNlIG9wdGltaXph
dGlvbnMKKyMgaGF2aW5nIGJlZW4gcGVyZm9ybWVkLiBBbHNvLCBzaW5jZSB0aGUgTG9hZC9TdG9y
ZSBpbnN0cnVjdGlvbnMgaW4gQjMgaGF2ZSBhIGJ1aWx0LWluIG9mZnNldCwgd2UKKyMgZG9uJ3Qg
bmVlZCB0byBtYXRjaCBBZGQoeCwgY29uc3QpLiBUaGF0IHdvdWxkIGhhdmUgYmVlbiBmb2xkZWQg
aW50byB0aGUgTG9hZC9TdG9yZSBpbnN0cnVjdGlvbnMKKyMgYWxyZWFkeS4gU28sIHRoZSBvbmx5
IGZhbmN5IG1hdGhpbmcgdGhpcyBjYW4gZG8gaXMganVzdCBCYXNlSW5kZXggZm9ybXMuCisKK0Fk
ZFNoaWZ0MSA9IEFkZChTaGwoaW5kZXgsICRsb2dTY2FsZSksIGJhc2UpCitBZGRTaGlmdDIgPSBB
ZGQoYmFzZSwgU2hsKGluZGV4LCAkbG9nU2NhbGUpKQorCitBZGQgPSBBZGQobGVmdCwgcmlnaHQp
CisKKyRDb25zdAorCitEaXJlY3QKSW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM0Fy
Z3VtZW50UmVnVmFsdWUuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9i
My9CM0FyZ3VtZW50UmVnVmFsdWUuY3BwCShyZXZpc2lvbiAwKQorKysgU291cmNlL0phdmFTY3Jp
cHRDb3JlL2IzL0IzQXJndW1lbnRSZWdWYWx1ZS5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTAsMCAr
MSw0MSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNSBBcHBsZSBJbmMuIEFsbCByaWdodHMg
cmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJp
bmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0
ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6Cisg
KiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3Zl
IGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhl
IGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBm
b3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhp
cyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUK
KyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRo
IHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBB
UFBMRSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFO
VElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJS
QU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisg
KiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBP
UgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElO
Q0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdF
UyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJT
VElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJ
VFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBU
SEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJ
TElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJ
U0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVO
IElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLiAKKyAqLworCisj
aW5jbHVkZSAiY29uZmlnLmgiCisjaW5jbHVkZSAiQjNBcmd1bWVudFJlZ1ZhbHVlLmgiCisKK25h
bWVzcGFjZSBKU0MgeyBuYW1lc3BhY2UgQjMgeworCitBcmd1bWVudFJlZ1ZhbHVlOjp+QXJndW1l
bnRSZWdWYWx1ZSgpCit7Cit9CisKK3ZvaWQgQXJndW1lbnRSZWdWYWx1ZTo6ZHVtcE1ldGEoUHJp
bnRTdHJlYW0mIG91dCkgY29uc3QKK3sKKyAgICBvdXQucHJpbnQobV9yZWcpOworfQorCit9IH0g
Ly8gbmFtZXNwYWNlIEpTQzo6QjMKKwpJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0Iz
QXJndW1lbnRSZWdWYWx1ZS5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9i
My9CM0FyZ3VtZW50UmVnVmFsdWUuaAkocmV2aXNpb24gMCkKKysrIFNvdXJjZS9KYXZhU2NyaXB0
Q29yZS9iMy9CM0FyZ3VtZW50UmVnVmFsdWUuaAkod29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDYw
IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE1IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNl
cnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5
IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBw
cm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEu
IFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29w
eXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9s
bG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0g
bXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxp
c3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICog
ICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhl
IGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExF
IElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVT
LCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJ
RVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBV
UlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SCisg
KiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURF
TlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJ
TkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRV
VEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsg
T1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9S
WQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZ
LCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5H
IElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYg
QURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisKKyNpZm5k
ZWYgQjNBcmd1bWVudFJlZ1ZhbHVlX2gKKyNkZWZpbmUgQjNBcmd1bWVudFJlZ1ZhbHVlX2gKKwor
I2luY2x1ZGUgIkIzVmFsdWUuaCIKKyNpbmNsdWRlICJSZWcuaCIKKworbmFtZXNwYWNlIEpTQyB7
IG5hbWVzcGFjZSBCMyB7CisKK2NsYXNzIEFyZ3VtZW50UmVnVmFsdWUgOiBwdWJsaWMgVmFsdWUg
eworcHVibGljOgorICAgIHN0YXRpYyBib29sIGFjY2VwdHMoT3Bjb2RlIG9wY29kZSkgeyByZXR1
cm4gb3Bjb2RlID09IEFyZ3VtZW50UmVnOyB9CisgICAgCisgICAgfkFyZ3VtZW50UmVnVmFsdWUo
KTsKKworICAgIFJlZyBhcmd1bWVudFJlZygpIGNvbnN0IHsgcmV0dXJuIG1fcmVnOyB9CisKK3By
b3RlY3RlZDoKKyAgICB2b2lkIGR1bXBNZXRhKFByaW50U3RyZWFtJikgY29uc3Qgb3ZlcnJpZGU7
CisKK3ByaXZhdGU6CisgICAgZnJpZW5kIGNsYXNzIFByb2NlZHVyZTsKKworICAgIEFyZ3VtZW50
UmVnVmFsdWUodW5zaWduZWQgaW5kZXgsIE9yaWdpbiBvcmlnaW4sIFJlZyByZWcpCisgICAgICAg
IDogVmFsdWUoaW5kZXgsIEFyZ3VtZW50UmVnLCByZWcuaXNHUFIoKSA/IHBvaW50ZXIoKSA6IERv
dWJsZSwgb3JpZ2luKQorICAgICAgICAsIG1fcmVnKHJlZykKKyAgICB7CisgICAgfQorCisgICAg
UmVnIG1fcmVnOworfTsKKworfSB9IC8vIG5hbWVzcGFjZSBKU0M6OkIzCisKKyNlbmRpZiAvLyBC
M0FyZ3VtZW50UmVnVmFsdWVfaAorCkluZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNC
YXNpY0Jsb2NrLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNC
YXNpY0Jsb2NrLmNwcAkocmV2aXNpb24gMCkKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9C
M0Jhc2ljQmxvY2suY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsNTggQEAKKy8qCisgKiBD
b3B5cmlnaHQgKEMpIDIwMTUgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAq
IFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGgg
b3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQg
dGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRp
b25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAg
IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xh
aW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVj
ZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRp
b25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0
aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9u
LgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFTIElT
JycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywg
QlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFO
VEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElT
Q0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IKKyAqIENPTlRSSUJVVE9S
UyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFM
LAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVU
IE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBT
RVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJ
TlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFC
SUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAq
IChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBP
VVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRI
RSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKworI2luY2x1ZGUgImNvbmZpZy5o
IgorI2luY2x1ZGUgIkIzQmFzaWNCbG9jay5oIgorCituYW1lc3BhY2UgSlNDIHsgbmFtZXNwYWNl
IEIzIHsKKworQmFzaWNCbG9jazo6QmFzaWNCbG9jayh1bnNpZ25lZCBpbmRleCkKKyAgICA6IG1f
aW5kZXgoaW5kZXgpCit7Cit9CisKK0Jhc2ljQmxvY2s6On5CYXNpY0Jsb2NrKCkKK3sKK30KKwor
dm9pZCBCYXNpY0Jsb2NrOjphcHBlbmQoVmFsdWUqIHZhbHVlKQoreworICAgIG1fdmFsdWVzLmFw
cGVuZCh2YWx1ZSk7Cit9CisKK3ZvaWQgQmFzaWNCbG9jazo6ZHVtcChQcmludFN0cmVhbSYgb3V0
KSBjb25zdAoreworICAgIG91dC5wcmludChkdW1wUHJlZml4LCBtX2luZGV4KTsKK30KKwordm9p
ZCBCYXNpY0Jsb2NrOjpkZWVwRHVtcChQcmludFN0cmVhbSYgb3V0KSBjb25zdAoreworICAgIG91
dC5wcmludCgiQkIiLCAqdGhpcywgIjpcbiIpOworICAgIGZvciAoVmFsdWUqIHZhbHVlIDogKnRo
aXMpCisgICAgICAgIG91dC5wcmludCgiICAgICIsIGRlZXBEdW1wKHZhbHVlKSwgIlxuIik7Cit9
CisKK30gfSAvLyBuYW1lc3BhY2UgSlNDOjpCMworCkluZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENv
cmUvYjMvQjNCYXNpY0Jsb2NrLmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRDb3Jl
L2IzL0IzQmFzaWNCbG9jay5oCShyZXZpc2lvbiAwKQorKysgU291cmNlL0phdmFTY3JpcHRDb3Jl
L2IzL0IzQmFzaWNCbG9jay5oCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsMTEyIEBACisvKgor
ICogQ29weXJpZ2h0IChDKSAyMDE1IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAq
CisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3
aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0
aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJp
YnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Cisg
KiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRp
c2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXBy
b2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29u
ZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1l
bnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1
dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gYGBB
UyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJ
TkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVS
Q0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJF
IERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SCisgKiBDT05UUklC
VVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BF
Q0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcs
IEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMg
T1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5F
U1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0Yg
TElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JU
CisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBX
QVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBP
RiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisKKyNpZm5kZWYgQjNCYXNp
Y0Jsb2NrCisjZGVmaW5lIEIzQmFzaWNCbG9jaworCituYW1lc3BhY2UgSlNDIHsgbmFtZXNwYWNl
IEIzIHsKKworY2xhc3MgUHJvY2VkdXJlOworY2xhc3MgVmFsdWU7CisKK2NsYXNzIEJhc2ljQmxv
Y2sgeworICAgIFdURl9NQUtFX05PTkNPUFlBQkxFKEJhc2ljQmxvY2spOworICAgIFdURl9NQUtF
X0ZBU1RfQUxMT0NBVEVEOworcHVibGljOgorICAgIHR5cGVkZWYgVmVjdG9yPFZhbHVlKj4gVmFs
dWVMaXN0OworICAgIHR5cGVkZWYgVmVjdG9yPEJhc2ljQmxvY2sqLCAyPiBTdWNjZXNzb3JMaXN0
OyAvLyBUaGlzIG1hdGNoZXMgQ29udHJvbFZhbHVlJ3MgdHlwZWRlZi4KKworICAgIHN0YXRpYyBj
b25zdCBjaGFyKiBkdW1wUHJlZml4ID0gIiMiOworCisgICAgfkJhc2ljQmxvY2soKTsKKworICAg
IHVuc2lnbmVkIGluZGV4KCkgY29uc3QgeyByZXR1cm4gbV9pbmRleDsgfQorCisgICAgVmFsdWVM
aXN0OjppdGVyYXRvciBiZWdpbigpIHsgcmV0dXJuIG1fdmFsdWVzLmJlZ2luKCk7IH0KKyAgICBW
YWx1ZUxpc3Q6Oml0ZXJhdG9yIGVuZCgpIHsgcmV0dXJuIG1fdmFsdWVzLmVuZCgpOyB9CisgICAg
VmFsdWVMaXN0Ojpjb25zdF9pdGVyYXRvciBiZWdpbigpIGNvbnN0IHsgcmV0dXJuIG1fdmFsdWVz
LmJlZ2luKCk7IH0KKyAgICBWYWx1ZUxpc3Q6OmNvbnN0X2l0ZXJhdG9yIGVuZCgpIGNvbnN0IHsg
cmV0dXJuIG1fdmFsdWVzLmVuZCgpOyB9CisKKyAgICBzaXplX3Qgc2l6ZSgpIGNvbnN0IHsgcmV0
dXJuIG1fdmFsdWVzLnNpemUoKTsgfQorICAgIFZhbHVlKiBhdChzaXplX3QgaW5kZXgpIGNvbnN0
IHsgcmV0dXJuIG1fdmFsdWVzW2luZGV4XTsgfQorICAgIFZhbHVlKiYgYXQoc2l6ZV90IGluZGV4
KSB7IHJldHVybiBtX3ZhbHVlc1tpbmRleF07IH0KKworICAgIFZhbHVlKiBsYXN0KCkgY29uc3Qg
eyByZXR1cm4gbV92YWx1ZXMubGFzdCgpOyB9CisgICAgVmFsdWUqJiBsYXN0KCkgeyByZXR1cm4g
bV92YWx1ZXMubGFzdCgpOyB9CisKKyAgICBjb25zdCBWYWx1ZUxpc3QmIHZhbHVlcygpIGNvbnN0
IHsgcmV0dXJuIG1fdmFsdWVzOyB9CisgICAgVmFsdWVMaXN0JiB2YWx1ZXMoKSB7IHJldHVybiBt
X3ZhbHVlczsgfQorCisgICAgdm9pZCBhcHBlbmQoVmFsdWUqKTsKKworICAgIHRlbXBsYXRlPHR5
cGVuYW1lIFZhbHVlVHlwZSwgdHlwZW5hbWUuLi4gQXJndW1lbnRzPgorICAgIFZhbHVlVHlwZSog
YXBwZW5kTmV3KFByb2NlZHVyZSYsIEFyZ3VtZW50cy4uLik7CisKKyAgICB1bnNpZ25lZCBudW1T
dWNjZXNzb3JzKCkgY29uc3Q7CisgICAgQmFzaWNCbG9jayogc3VjY2Vzc29yKHVuc2lnbmVkIGlu
ZGV4KSBjb25zdDsKKyAgICBCYXNpY0Jsb2NrKiYgc3VjY2Vzc29yKHVuc2lnbmVkIGluZGV4KTsK
KyAgICBjb25zdCBTdWNjZXNzb3JMaXN0JiBzdWNjZXNzb3JzKCkgY29uc3Q7CisKKyAgICB2b2lk
IGR1bXAoUHJpbnRTdHJlYW0mKSBjb25zdDsKKyAgICB2b2lkIGRlZXBEdW1wKFByaW50U3RyZWFt
JikgY29uc3Q7CisKK3ByaXZhdGU6CisgICAgZnJpZW5kIGNsYXNzIFByb2NlZHVyZTsKKyAgICAK
KyAgICAvLyBJbnN0YW50aWF0ZSB2aWEgUHJvY2VkdXJlLgorICAgIEJhc2ljQmxvY2sodW5zaWdu
ZWQgaW5kZXgpOworCisgICAgdW5zaWduZWQgbV9pbmRleDsKKyAgICBWYWx1ZUxpc3QgbV92YWx1
ZXM7Cit9OworCitjbGFzcyBEZWVwQmFzaWNCbG9ja0R1bXAgeworcHVibGljOgorICAgIERlZXBC
YXNpY0Jsb2NrRHVtcChCYXNpY0Jsb2NrKiBibG9jaykKKyAgICAgICAgOiBtX2Jsb2NrKGJsb2Nr
KQorICAgIHsKKyAgICB9CisKKyAgICB2b2lkIGR1bXAoUHJpbnRTdHJlYW0mIG91dCkgY29uc3QK
KyAgICB7CisgICAgICAgIGlmIChtX2Jsb2NrKQorICAgICAgICAgICAgbV9ibG9jay0+ZGVlcER1
bXAob3V0KTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgb3V0LnByaW50KCI8bnVsbD4iKTsK
KyAgICB9CisKK3ByaXZhdGU6CisgICAgQmFzaWNCbG9jayogbV9ibG9jazsKK307CisKK0RlZXBC
YXNpY0Jsb2NrRHVtcCBkZWVwRHVtcChCYXNpY0Jsb2NrKiBibG9jaykKK3sKKyAgICByZXR1cm4g
RGVlcEJhc2ljQmxvY2tEdW1wKGJsb2NrKTsKK30KKworfSB9IC8vIG5hbWVzcGFjZSBKU0M6OkIz
CisKKyNlbmRpZiAvLyBCM0Jhc2ljQmxvY2sKKwpJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3Jl
L2IzL0IzQmFzaWNCbG9ja0lubGluZXMuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlw
dENvcmUvYjMvQjNCYXNpY0Jsb2NrSW5saW5lcy5oCShyZXZpc2lvbiAwKQorKysgU291cmNlL0ph
dmFTY3JpcHRDb3JlL2IzL0IzQmFzaWNCbG9ja0lubGluZXMuaAkod29ya2luZyBjb3B5KQpAQCAt
MCwwICsxLDY2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE1IEFwcGxlIEluYy4gQWxsIHJp
Z2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBh
bmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBl
cm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1l
dDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUg
YWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFu
ZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmlu
YXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNl
LCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGlu
IHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVk
IHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVE
IEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBX
QVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVE
IFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VM
QVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJ
TkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVD
VCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBE
QU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9G
IFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICog
UFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04g
QU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1Qg
TElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNF
KSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUs
IEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICov
CisKKyNpZm5kZWYgQjNCYXNpY0Jsb2NrSW5saW5lc19oCisjZGVmaW5lIEIzQmFzaWNCbG9ja0lu
bGluZXNfaAorCisjaW5jbHVkZSAiQjNCYXNpY0Jsb2NrLmgiCisjaW5jbHVkZSAiQjNDb250cm9s
VmFsdWUuaCIKKyNpbmNsdWRlICJCM1Byb2NlZHVyZUlubGluZXMuaCIKKworbmFtZXNwYWNlIEpT
QyB7IG5hbWVzcGFjZSBCMyB7CisKK3RlbXBsYXRlPHR5cGVuYW1lIFZhbHVlVHlwZSB0eXBlbmFt
ZS4uLiBBcmd1bWVudHM+CitWYWx1ZVR5cGUqIEJhc2ljQmxvY2s6OmFwcGVuZE5ldyhQcm9jZWR1
cmUmIHByb2NlZHVyZSwgQXJndW1lbnRzLi4uIGFyZ3VtZW50cykKK3sKKyAgICBWYWx1ZVR5cGUq
IHJlc3VsdCA9IHByb2NlZHVyZS5hZGQ8VmFsdWVUeXBlPihhcmd1bWVudHMuLi4pOworICAgIGFw
cGVuZChyZXN1bHQpOworICAgIHJldHVybiByZXN1bHQ7Cit9CisKK3Vuc2lnbmVkIEJhc2ljQmxv
Y2s6Om51bVN1Y2Nlc3NvcnMoKSBjb25zdAoreworICAgIHJldHVybiBsYXN0KCktPmFzPENvbnRy
b2xWYWx1ZT4oKS0+bnVtU3VjY2Vzc29ycygpOworfQorCitCYXNpY0Jsb2NrKiBCYXNpY0Jsb2Nr
OjpzdWNjZXNzb3IodW5zaWduZWQgaW5kZXgpIGNvbnN0Cit7CisgICAgcmV0dXJuIGxhc3QoKS0+
YXM8Q29udHJvbFZhbHVlPigpLT5zdWNjZXNzb3IoaW5kZXgpOworfQorCitCYXNpY0Jsb2NrKiYg
QmFzaWNCbG9jazo6c3VjY2Vzc29yKHVuc2lnbmVkIGluZGV4KQoreworICAgIHJldHVybiBsYXN0
KCktPmFzPENvbnRyb2xWYWx1ZT4oKS0+c3VjY2Vzc29yKGluZGV4KTsKK30KKworY29uc3QgQmFz
aWNCbG9jazo6U3VjY2Vzc29yTGlzdCYgQmFzaWNCbG9jazo6c3VjY2Vzc29ycygpIGNvbnN0Cit7
CisgICAgcmV0dXJuIGxhc3QoKS0+YXM8Q29udHJvbFZhbHVlPigpLT5zdWNjZXNzb3JzKCk7Cit9
CisKK30gfSAvLyBuYW1lc3BhY2UgSlNDOjpCMworCisjZW5kaWYgLy8gQjNCYXNpY0Jsb2NrSW5s
aW5lc19oCisKSW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM0NoZWNrVmFsdWUuY3Bw
Cj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM0NoZWNrVmFsdWUuY3Bw
CShyZXZpc2lvbiAwKQorKysgU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzQ2hlY2tWYWx1ZS5j
cHAJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSw0MSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykg
MjAxNSBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRp
b24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Cisg
KiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5n
IGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNl
IGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlz
IGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4g
UmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBj
b3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBm
b2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90
aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJ
UyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisg
KiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlU
RUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQg
RklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4g
Tk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBG
T1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExB
UlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQg
VE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NT
IE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikg
SE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhF
UiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBO
RUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNF
CisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZ
IE9GIFNVQ0ggREFNQUdFLiAKKyAqLworCisjaW5jbHVkZSAiY29uZmlnLmgiCisjaW5jbHVkZSAi
QjNDaGVja1ZhbHVlLmgiCisKK25hbWVzcGFjZSBKU0MgeyBuYW1lc3BhY2UgQjMgeworCitDaGVj
a1ZhbHVlOjp+Q2hlY2tWYWx1ZSgpCit7Cit9CisKK3ZvaWQgQ2hlY2tWYWx1ZTo6ZHVtcE1ldGEo
UHJpbnRTdHJlYW0mIG91dCkgY29uc3QKK3sKKyAgICBvdXQucHJpbnQoInN0YWNrbWFwID0gIiwg
c3RhY2ttYXApOworfQorCit9IH0gLy8gbmFtZXNwYWNlIEpTQzo6QjMKKwpJbmRleDogU291cmNl
L0phdmFTY3JpcHRDb3JlL2IzL0IzQ2hlY2tWYWx1ZS5oCj09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9K
YXZhU2NyaXB0Q29yZS9iMy9CM0NoZWNrVmFsdWUuaAkocmV2aXNpb24gMCkKKysrIFNvdXJjZS9K
YXZhU2NyaXB0Q29yZS9iMy9CM0NoZWNrVmFsdWUuaAkod29ya2luZyBjb3B5KQpAQCAtMCwwICsx
LDgwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE1IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyBy
ZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmlu
YXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRl
ZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAq
IDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUg
Y29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUg
Zm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZv
cm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlz
IGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQor
ICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGgg
dGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQ
UExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5U
SUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJB
TlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAq
IFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9S
CisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5D
SURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VT
IChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNU
SVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklU
UzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRI
RU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklM
SVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklT
SU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4g
SUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisKKyNp
Zm5kZWYgQjNDaGVja1ZhbHVlX2gKKyNkZWZpbmUgQjNDaGVja1ZhbHVlX2gKKworI2luY2x1ZGUg
IkIzVmFsdWUuaCIKKyNpbmNsdWRlICJCM1N0YWNrbWFwLmgiCisKK25hbWVzcGFjZSBKU0MgeyBu
YW1lc3BhY2UgQjMgeworCitjbGFzcyBDaGVja1ZhbHVlIDogcHVibGljIENoZWNrIHsKK3B1Ymxp
YzoKKyAgICBzdGF0aWMgYm9vbCBhY2NlcHRzKE9wY29kZSBvcGNvZGUpCisgICAgeworICAgICAg
ICBzd2l0Y2ggKG9wY29kZSkgeworICAgICAgICBjYXNlIENoZWNrQWRkOgorICAgICAgICBjYXNl
IENoZWNrU3ViOgorICAgICAgICBjYXNlIENoZWNrTXVsOgorICAgICAgICBjYXNlIENoZWNrOgor
ICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBy
ZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICB+Q2hlY2tWYWx1ZSgpOworCisg
ICAgU3RhY2ttYXAgc3RhY2ttYXA7CisKK3Byb3RlY3RlZDoKKyAgICB2b2lkIGR1bXBNZXRhKFBy
aW50U3RyZWFtJikgY29uc3Qgb3ZlcnJpZGU7CisKK3ByaXZhdGU6CisgICAgZnJpZW5kIGNsYXNz
IFByb2NlZHVyZTsKKworICAgIC8vIFVzZSB0aGlzIGZvcm0gZm9yIENoZWNrQWRkLCBDaGVja1N1
YiwgYW5kIENoZWNrTXVsLgorICAgIENoZWNrVmFsdWUodW5zaWduZWQgaW5kZXgsIE9wY29kZSBv
cGNvZGUsIE9yaWdpbiBvcmlnaW4sIFZhbHVlKiBsZWZ0LCBWYWx1ZSogcmlnaHQpCisgICAgICAg
IDogVmFsdWUoaW5kZXgsIG9wY29kZSwgbGVmdC0+dHlwZSgpLCBvcmlnaW4sIGxlZnQsIHJpZ2h0
KQorICAgIHsKKyAgICAgICAgQVNTRVJUKGlzSW50KHR5cGUoKSkpOworICAgICAgICBBU1NFUlQo
bGVmdC0+dHlwZSgpID09IHJpZ2h0LT50eXBlKCkpOworICAgICAgICBBU1NFUlQob3Bjb2RlID09
IENoZWNrQWRkIHx8IG9wY29kZSA9PSBDaGVja1N1YiB8fCBvcGNvZGUgPT0gQ2hlY2tNdWwpOwor
ICAgIH0KKworICAgIC8vIFVzZSB0aGlzIGZvcm0gZm9yIENoZWNrLgorICAgIENoZWNrVmFsdWUo
dW5zaWduZWQgaW5kZXgsIE9wY29kZSBvcGNvZGUsIE9yaWdpbiBvcmlnaW4sIFZhbHVlKiBwcmVk
aWNhdGUpCisgICAgICAgIDogVmFsdWUoaW5kZXgsIG9wY29kZSwgVm9pZCwgb3JpZ2luLCBwcmVk
aWNhdGUpCisgICAgeworICAgICAgICBBU1NFUlQob3BjZGUgPT0gQ2hlY2spOworICAgIH0KK307
CisKK30gfSAvLyBuYW1lc3BhY2UgSlNDOjpCMworCisjZW5kaWYgLy8gQjNDaGVja1ZhbHVlX2gK
KworCkluZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNDb21wYXJpc29uTWF0Y2hlci5w
YXR0ZXJucwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNDb21wYXJp
c29uTWF0Y2hlci5wYXR0ZXJucwkocmV2aXNpb24gMCkKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29y
ZS9iMy9CM0NvbXBhcmlzb25NYXRjaGVyLnBhdHRlcm5zCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAg
KzEsMzggQEAKKyMgQ29weXJpZ2h0IChDKSAyMDE1IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNl
cnZlZC4KKyMKKyMgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBm
b3Jtcywgd2l0aCBvciB3aXRob3V0CisjIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92
aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworIyBhcmUgbWV0OgorIyAxLiBSZWRp
c3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdo
dAorIyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5n
IGRpc2NsYWltZXIuCisjIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJl
cHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisjICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNv
bmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyMgICAgZG9jdW1l
bnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1
dGlvbi4KKyMKKyMgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIEFORCBJ
VFMgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJworIyBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBX
QVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyMgVEhFIElNUExJRUQg
V0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxB
UgorIyBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMu
IE9SIElUUyBDT05UUklCVVRPUlMKKyMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVD
VCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgorIyBDT05TRVFVRU5USUFMIERB
TUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgorIyBT
VUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklU
UzsgT1IgQlVTSU5FU1MKKyMgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5Z
IFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KKyMgQ09OVFJBQ1QsIFNUUklDVCBMSUFC
SUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKyMgQVJJ
U0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYg
QURWSVNFRCBPRgorIyBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKK21hdGNoZXIg
Q29tcGFyaXNvbk1hdGNoZXIKKworVGVzdExvYWROb3RaZXJvMSA9IEFuZChMb2FkKGFkZHJlc3Mp
LCByaWdodCkKK1Rlc3RMb2FkTm90WmVybzIgPSBBbmQobGVmdCwgTG9hZChhZGRyZXNzKSkKK1Rl
c3ROb3RaZXJvID0gQW5kKGxlZnQsIHJpZ2h0KQorCitUZXN0TG9hZFplcm8xID0gRXF1YWwoQW5k
KExvYWQoYWRkcmVzcyksIHJpZ2h0KSwgJDApCitUZXN0TG9hZFplcm8yID0gRXF1YWwoQW5kKGxl
ZnQsIExvYWQoYWRkcmVzcykpLCAkMCkKK1Rlc3RaZXJvID0gRXF1YWwoQW5kKGxlZnQsIHJpZ2h0
KSwgJDApCisKK0xvYWRFcXVhbDEgPSBFcXVhbChMb2FkKGFkZHJlc3MpLCByaWdodCkKK0xvYWRF
cXVhbDIgPSBFcXVhbChsZWZ0LCBMb2FkKGFkZHJlc3MpKQorTm90ID0gRXF1YWwodmFsdWUsICQw
KQorRXF1YWwgPSBFcXVhbChsZWZ0LCByaWdodCkKKwpJbmRleDogU291cmNlL0phdmFTY3JpcHRD
b3JlL2IzL0IzQ29uc3QzMlZhbHVlLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlw
dENvcmUvYjMvQjNDb25zdDMyVmFsdWUuY3BwCShyZXZpc2lvbiAwKQorKysgU291cmNlL0phdmFT
Y3JpcHRDb3JlL2IzL0IzQ29uc3QzMlZhbHVlLmNwcAkod29ya2luZyBjb3B5KQpAQCAtMCwwICsx
LDQxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE1IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyBy
ZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmlu
YXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRl
ZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAq
IDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUg
Y29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUg
Zm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZv
cm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlz
IGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQor
ICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGgg
dGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQ
UExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5U
SUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJB
TlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAq
IFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9S
CisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5D
SURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VT
IChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNU
SVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklU
UzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRI
RU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklM
SVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklT
SU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4g
SUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisKKyNp
bmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJCM0NvbnN0MzJWYWx1ZS5oIgorCituYW1lc3Bh
Y2UgSlNDIHsgbmFtZXNwYWNlIEIzIHsKKworQ29uc3QzMlZhbHVlOjp+Q29uc3QzMlZhbHVlKCkK
K3sKK30KKwordm9pZCBDb25zdDMyVmFsdWU6OmR1bXBNZXRhKFByaW50U3RyZWFtJiBvdXQpIGNv
bnN0Cit7CisgICAgb3V0LnByaW50KG1fdmFsdWUpOworfQorCit9IH0gLy8gbmFtZXNwYWNlIEpT
Qzo6QjMKKwpJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzQ29uc3QzMlZhbHVlLmgK
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzQ29uc3QzMlZhbHVlLmgJ
KHJldmlzaW9uIDApCisrKyBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNDb25zdDMyVmFsdWUu
aAkod29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDU5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAy
MDE1IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlv
biBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAq
IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcg
Y29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2Ug
Y29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMg
bGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBS
ZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNv
cHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZv
bGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3Ro
ZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElT
IFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAq
IEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRF
RCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBG
SVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBO
TyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZP
UiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFS
WSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBU
TywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1Mg
T0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBI
T1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVS
IElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5F
R0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UK
KyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkg
T0YgU1VDSCBEQU1BR0UuIAorICovCisKKyNpZm5kZWYgQjNDb25zdDMyVmFsdWVfaAorI2RlZmlu
ZSBCM0NvbnN0MzJWYWx1ZV9oCisKKyNpbmNsdWRlICJCM1ZhbHVlLmgiCisKK25hbWVzcGFjZSBK
U0MgeyBuYW1lc3BhY2UgQjMgeworCitjbGFzcyBDb25zdDMyVmFsdWUgOiBwdWJsaWMgVmFsdWUg
eworcHVibGljOgorICAgIHN0YXRpYyBib29sIGFjY2VwdHMoT3Bjb2RlIG9wY29kZSkgeyByZXR1
cm4gb3Bjb2RlID09IENvbnN0MzI7IH0KKyAgICAKKyAgICB+Q29uc3QzMlZhbHVlKCk7CisgICAg
CisgICAgaW50MzJfdCB2YWx1ZSgpIGNvbnN0IHsgcmV0dXJuIG1fdmFsdWU7IH0KKworcHJvdGVj
dGVkOgorICAgIHZvaWQgZHVtcE1ldGEoUHJpbnRTdHJlYW0mKSBjb25zdCBvdmVycmlkZTsKKwor
cHJpdmF0ZToKKyAgICBmcmllbmQgY2xhc3MgUHJvY2VkdXJlOworCisgICAgQ29uc3QzMlZhbHVl
KHVuc2lnbmVkIGluZGV4LCBPcmlnaW4gb3JpZ2luLCBpbnQzMl90IHZhbHVlKQorICAgICAgICA6
IFZhbHVlKGluZGV4LCBDb25zdDMyLCBJbnQzMiwgb3JpZ2luKQorICAgICAgICAsIG1fdmFsdWUo
dmFsdWUpCisgICAgeworICAgIH0KKyAgICAKKyAgICBpbnQzMl90IG1fdmFsdWU7Cit9OworCit9
IH0gLy8gbmFtZXNwYWNlIEpTQzo6QjMKKworI2VuZGlmIC8vIEIzQ29uc3QzMlZhbHVlX2gKKwpJ
bmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzQ29uc3Q2NFZhbHVlLmNwcAo9PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNDb25zdDY0VmFsdWUuY3BwCShyZXZp
c2lvbiAwKQorKysgU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzQ29uc3Q2NFZhbHVlLmNwcAko
d29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDQxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE1
IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBh
bmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1v
ZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29u
ZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29k
ZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlz
dCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRp
c3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHly
aWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxv
d2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIg
bWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNP
RlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVY
UFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBU
TywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRO
RVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBF
VkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBB
TlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwg
T1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywK
KyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0Yg
VVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dF
VkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElO
IENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJ
R0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAq
IE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0Yg
U1VDSCBEQU1BR0UuIAorICovCisKKyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJCM0Nv
bnN0NjRWYWx1ZS5oIgorCituYW1lc3BhY2UgSlNDIHsgbmFtZXNwYWNlIEIzIHsKKworQ29uc3Q2
NFZhbHVlOjp+Q29uc3Q2NFZhbHVlKCkKK3sKK30KKwordm9pZCBDb25zdDY0VmFsdWU6OmR1bXBN
ZXRhKFByaW50U3RyZWFtJiBvdXQpIGNvbnN0Cit7CisgICAgb3V0LnByaW50KG1fdmFsdWUpOwor
fQorCit9IH0gLy8gbmFtZXNwYWNlIEpTQzo6QjMKKwpJbmRleDogU291cmNlL0phdmFTY3JpcHRD
b3JlL2IzL0IzQ29uc3Q2NFZhbHVlLmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRD
b3JlL2IzL0IzQ29uc3Q2NFZhbHVlLmgJKHJldmlzaW9uIDApCisrKyBTb3VyY2UvSmF2YVNjcmlw
dENvcmUvYjMvQjNDb25zdDY0VmFsdWUuaAkod29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDU5IEBA
CisvKgorICogQ29weXJpZ2h0IChDKSAyMDE1IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZl
ZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZv
cm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92
aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJl
ZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJp
Z2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93
aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVz
dCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qg
b2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAg
ZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRp
c3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElO
Qy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJ
TkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMg
T0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBP
U0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SCisgKiBD
T05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRB
TCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNM
VURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUg
R09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1Ig
QlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQor
ICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBP
UiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElO
IEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURW
SVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisKKyNpZm5kZWYg
QjNDb25zdDY0VmFsdWVfaAorI2RlZmluZSBCM0NvbnN0NjRWYWx1ZV9oCisKKyNpbmNsdWRlICJC
M1ZhbHVlLmgiCisKK25hbWVzcGFjZSBKU0MgeyBuYW1lc3BhY2UgQjMgeworCitjbGFzcyBDb25z
dDY0VmFsdWUgOiBwdWJsaWMgVmFsdWUgeworcHVibGljOgorICAgIHN0YXRpYyBib29sIGFjY2Vw
dHMoT3Bjb2RlIG9wY29kZSkgeyByZXR1cm4gb3Bjb2RlID09IENvbnN0NjQ7IH0KKyAgICAKKyAg
ICB+Q29uc3Q2NFZhbHVlKCk7CisgICAgCisgICAgaW50NjRfdCB2YWx1ZSgpIGNvbnN0IHsgcmV0
dXJuIG1fdmFsdWU7IH0KKworcHJvdGVjdGVkOgorICAgIHZvaWQgZHVtcE1ldGEoUHJpbnRTdHJl
YW0mKSBjb25zdCBvdmVycmlkZTsKKworcHJpdmF0ZToKKyAgICBmcmllbmQgY2xhc3MgUHJvY2Vk
dXJlOworCisgICAgQ29uc3Q2NFZhbHVlKHVuc2lnbmVkIGluZGV4LCBPcmlnaW4gb3JpZ2luLCBp
bnQ2NF90IHZhbHVlKQorICAgICAgICA6IFZhbHVlKGluZGV4LCBDb25zdDY0LCBJbnQ2NCwgb3Jp
Z2luKQorICAgICAgICAsIG1fdmFsdWUodmFsdWUpCisgICAgeworICAgIH0KKyAgICAKKyAgICBp
bnQ2NF90IG1fdmFsdWU7Cit9OworCit9IH0gLy8gbmFtZXNwYWNlIEpTQzo6QjMKKworI2VuZGlm
IC8vIEIzQ29uc3Q2NFZhbHVlX2gKKwpJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0Iz
Q29uc3REb3VibGVWYWx1ZS5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRDb3Jl
L2IzL0IzQ29uc3REb3VibGVWYWx1ZS5jcHAJKHJldmlzaW9uIDApCisrKyBTb3VyY2UvSmF2YVNj
cmlwdENvcmUvYjMvQjNDb25zdERvdWJsZVZhbHVlLmNwcAkod29ya2luZyBjb3B5KQpAQCAtMCww
ICsxLDQxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE1IEFwcGxlIEluYy4gQWxsIHJpZ2h0
cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQg
YmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1p
dHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoK
KyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJv
dmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0
aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5
IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0
aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRo
ZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdp
dGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZ
IEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJS
QU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdB
UlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIK
KyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMu
IE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwg
SU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1B
R0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNV
QlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJP
RklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5Z
IFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElB
QklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBB
UklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVW
RU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisK
KyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJCM0NvbnN0RG91YmxlVmFsdWUuaCIKKwor
bmFtZXNwYWNlIEpTQyB7IG5hbWVzcGFjZSBCMyB7CisKK0NvbnN0RG91YmxlVmFsdWU6On5Db25z
dERvdWJsZVZhbHVlKCkKK3sKK30KKwordm9pZCBDb25zdERvdWJsZVZhbHVlOjpkdW1wTWV0YShQ
cmludFN0cmVhbSYgb3V0KSBjb25zdAoreworICAgIG91dC5wcmludGYoIiVsZSIsIG1fdmFsdWUp
OworfQorCit9IH0gLy8gbmFtZXNwYWNlIEpTQzo6QjMKKwpJbmRleDogU291cmNlL0phdmFTY3Jp
cHRDb3JlL2IzL0IzQ29uc3REb3VibGVWYWx1ZS5oCj09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZh
U2NyaXB0Q29yZS9iMy9CM0NvbnN0RG91YmxlVmFsdWUuaAkocmV2aXNpb24gMCkKKysrIFNvdXJj
ZS9KYXZhU2NyaXB0Q29yZS9iMy9CM0NvbnN0RG91YmxlVmFsdWUuaAkod29ya2luZyBjb3B5KQpA
QCAtMCwwICsxLDU5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE1IEFwcGxlIEluYy4gQWxs
IHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJj
ZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJl
IHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJl
IG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0
aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25z
IGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4g
YmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90
aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVy
IGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3Zp
ZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJ
REVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElF
RCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBM
SUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJ
Q1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBM
RSBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJ
UkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElB
TCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5U
IE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgor
ICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQg
T04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJ
Q1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJX
SVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdB
UkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAor
ICovCisKKyNpZm5kZWYgQjNDb25zdERvdWJsZVZhbHVlX2gKKyNkZWZpbmUgQjNDb25zdERvdWJs
ZVZhbHVlX2gKKworI2luY2x1ZGUgIkIzVmFsdWUuaCIKKworbmFtZXNwYWNlIEpTQyB7IG5hbWVz
cGFjZSBCMyB7CisKK2NsYXNzIENvbnN0RG91YmxlVmFsdWUgOiBwdWJsaWMgVmFsdWUgeworcHVi
bGljOgorICAgIHN0YXRpYyBib29sIGFjY2VwdHMoT3Bjb2RlIG9wY29kZSkgeyByZXR1cm4gb3Bj
b2RlID09IENvbnN0RG91YmxlOyB9CisgICAgCisgICAgfkNvbnN0RG91YmxlVmFsdWUoKTsKKyAg
ICAKKyAgICBkb3VibGUgdmFsdWUoKSBjb25zdCB7IHJldHVybiBtX3ZhbHVlOyB9CisKK3Byb3Rl
Y3RlZDoKKyAgICB2b2lkIGR1bXBNZXRhKFByaW50U3RyZWFtJikgY29uc3Qgb3ZlcnJpZGU7CisK
K3ByaXZhdGU6CisgICAgZnJpZW5kIGNsYXNzIFByb2NlZHVyZTsKKworICAgIENvbnN0RG91Ymxl
VmFsdWUodW5zaWduZWQgaW5kZXgsIE9yaWdpbiBvcmlnaW4sIGRvdWJsZSB2YWx1ZSkKKyAgICAg
ICAgOiBWYWx1ZShpbmRleCwgQ29uc3REb3VibGUsIERvdWJsZSwgb3JpZ2luKQorICAgICAgICAs
IG1fdmFsdWUodmFsdWUpCisgICAgeworICAgIH0KKyAgICAKKyAgICBkb3VibGUgbV92YWx1ZTsK
K307CisKK30gfSAvLyBuYW1lc3BhY2UgSlNDOjpCMworCisjZW5kaWYgLy8gQjNDb25zdERvdWJs
ZVZhbHVlX2gKKwpJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzQ29udHJvbFZhbHVl
LmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNDb250cm9sVmFs
dWUuY3BwCShyZXZpc2lvbiAwKQorKysgU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzQ29udHJv
bFZhbHVlLmNwcAkod29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDQzIEBACisvKgorICogQ29weXJp
Z2h0IChDKSAyMDE1IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRp
c3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdp
dGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBm
b2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBv
ZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3Rp
Y2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIu
CisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhl
IGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBh
bmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBh
bmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAq
CisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFO
RCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBO
T1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklM
SVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlN
RUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUg
TElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAq
IEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1Qg
TElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklD
RVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJS
VVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZ
LCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5D
TFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9G
IFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9T
U0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisKKyNpbmNsdWRlICJjb25maWcuaCIKKyNp
bmNsdWRlICJCM0NvbnRyb2xWYWx1ZS5oIgorCituYW1lc3BhY2UgSlNDIHsgbmFtZXNwYWNlIEIz
IHsKKworQ29udHJvbFZhbHVlOjp+Q29udHJvbFZhbHVlKCkKK3sKK30KKwordm9pZCBDb250cm9s
VmFsdWU6OmR1bXBNZXRhKFByaW50U3RyZWFtJiBvdXQpIGNvbnN0Cit7CisgICAgQ29tbWFQcmlu
dGVyIGNvbW1hOworICAgIGZvciAoQmFzaWNCbG9jayogYmxvY2sgOiBtX3N1Y2Nlc3NvcnMpCisg
ICAgICAgIG91dC5wcmludChjb21tYSwgcG9pbnRlckR1bXAoYmxvY2spKTsKK30KKworfSB9IC8v
IG5hbWVzcGFjZSBKU0M6OkIzCisKSW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM0Nv
bnRyb2xWYWx1ZS5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM0Nv
bnRyb2xWYWx1ZS5oCShyZXZpc2lvbiAwKQorKysgU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0Iz
Q29udHJvbFZhbHVlLmgJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSwxMTcgQEAKKy8qCisgKiBD
b3B5cmlnaHQgKEMpIDIwMTUgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAq
IFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGgg
b3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQg
dGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRp
b25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAg
IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xh
aW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVj
ZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRp
b25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0
aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9u
LgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFTIElT
JycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywg
QlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFO
VEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElT
Q0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IKKyAqIENPTlRSSUJVVE9S
UyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFM
LAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVU
IE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBT
RVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJ
TlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFC
SUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAq
IChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBP
VVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRI
RSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKworI2lmbmRlZiBCM0NvbnRyb2xW
YWx1ZV9oCisjZGVmaW5lIEIzQ29udHJvbFZhbHVlX2gKKworI2luY2x1ZGUgIkIzVmFsdWUuaCIK
KworbmFtZXNwYWNlIEpTQyB7IG5hbWVzcGFjZSBCMyB7CisKK2NsYXNzIEJhc2ljQmxvY2s7CisK
K2NsYXNzIENvbnRyb2xWYWx1ZSA6IHB1YmxpYyBWYWx1ZSB7CitwdWJsaWM6CisgICAgc3RhdGlj
IGJvb2wgYWNjZXB0cyhPcGNvZGUgb3Bjb2RlKQorICAgIHsKKyAgICAgICAgc3dpdGNoIChvcGNv
ZGUpIHsKKyAgICAgICAgY2FzZSBKdW1wOgorICAgICAgICBjYXNlIEJyYW5jaDoKKyAgICAgICAg
Y2FzZSBSZXR1cm46CisgICAgICAgIGNhc2UgT29wczoKKyAgICAgICAgICAgIHJldHVybiB0cnVl
OworICAgICAgICBjYXNlIFN3aXRjaDogCisgICAgICAgICAgICAvLyBUaGlzIGlzIGhlcmUgYmVj
YXVzZSBTd2l0Y2hWYWx1ZSBpcyBhIHN1YmNsYXNzIG9mIENvbnRyb2xWYWx1ZSwgc28gd2Ugd2Fu
dAorICAgICAgICAgICAgLy8gc3d0aWNoVmFsdWUtPmFzPENvbnRyb2xWYWx1ZT4oKSB0byByZXR1
cm4gbm9uLW51bGwuCisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgZGVmYXVsdDoK
KyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHR5cGVk
ZWYgVmVjdG9yPEJhc2ljQmxvY2sqLCAyPiBTdWNjZXNzb3JMaXN0OworCisgICAgfkNvbnRyb2xW
YWx1ZSgpOworCisgICAgdW5zaWduZWQgbnVtU3VjY2Vzc29ycygpIGNvbnN0IHsgcmV0dXJuIG1f
c3VjY2Vzc29ycy5zaXplKCk7IH0KKyAgICBCYXNpY0Jsb2NrKiBzdWNjZXNzb3IodW5zaWduZWQg
aW5kZXgpIGNvbnN0IHsgcmV0dXJuIG1fc3VjY2Vzc29yc1tpXTsgfQorICAgIEJhc2ljQmxvY2sq
JiBzdWNjZXNzb3IodW5zaWduZWQgaW5kZXgpIHsgcmV0dXJuIG1fc3VjY2Vzc29yc1tpXTsgfQor
CisgICAgY29uc3QgU3VjY2Vzc29yTGlzdCYgc3VjY2Vzc29ycygpIGNvbnN0IHsgcmV0dXJuIG1f
c3VjY2Vzc29yczsgfQorCitwcm90ZWN0ZWQ6CisgICAgdm9pZCBkdW1wTWV0YShQcmludFN0cmVh
bSYpIGNvbnN0IG92ZXJyaWRlOworCisgICAgLy8gVXNlIHRoaXMgZm9yIHN1YmNsYXNzZXMuCisg
ICAgdGVtcGxhdGU8dHlwZW5hbWUuLi4gQXJndW1lbnRzPgorICAgIENvbnRyb2xWYWx1ZSh1bnNp
Z25lZCBpbmRleCwgT3Bjb2RlIG9wY29kZSwgVHlwZSB0eXBlLCBPcmlnaW4gb3JpZ2luLCBBcmd1
bWVudHMuLi4gYXJndW1lbnRzKQorICAgICAgICA6IFZhbHVlKGluZGV4LCBvcGNvZGUsIHR5cGUs
IG9yaWdpbiwgYXJndW1lbnRzLi4uKQorICAgIHsKKyAgICB9CisKKyAgICAvLyBTdWJjbGFzc2Vz
IHdpbGwgcG9wdWxhdGUgdGhpcy4KKyAgICBTdWNjZXNzb3JMaXN0IG1fc3VjY2Vzc29yczsKKwor
cHJpdmF0ZToKKyAgICBmcmllbmQgY2xhc3MgUHJvY2VkdXJlOworCisgICAgLy8gVXNlIHRoaXMg
Zm9yIE9vcHMuCisgICAgQ29udHJvbFZhbHVlKHVuc2lnbmVkIGluZGV4LCBPcGNvZGUgb3Bjb2Rl
LCBPcmlnaW4gb3JpZ2luKQorICAgICAgICA6IFZhbHVlKGluZGV4LCBvcGNvZGUsIFZvaWQsIG9y
aWdpbikKKyAgICB7CisgICAgICAgIEFTU0VSVChvcGNvZGUgPT0gT29wcyk7CisgICAgfQorCisg
ICAgLy8gVXNlIHRoaXMgZm9yIFJldHVybi4KKyAgICBDb250cm9sVmFsdWUodW5zaWduZWQgaW5k
ZXgsIE9wY29kZSBvcGNvZGUsIE9yaWdpbiBvcmlnaW4sIFZhbHVlKiByZXN1bHQpCisgICAgICAg
IDogVmFsdWUoaW5kZXgsIG9wY29kZSwgVm9pZCwgb3JpZ2luLCByZXN1bHQpCisgICAgeworICAg
ICAgICBBU1NFUlQob3Bjb2RlID09IFJldHVybik7CisgICAgfQorCisgICAgLy8gVXNlIHRoaXMg
Zm9yIEp1bXAuCisgICAgQ29udHJvbFZhbHVlKHVuc2lnbmVkIGluZGV4LCBPcGNvZGUgb3Bjb2Rl
LCBPcmlnaW4gb3JpZ2luLCBCYXNpY0Jsb2NrKiB0YXJnZXQpCisgICAgICAgIDogVmFsdWUoaW5k
ZXgsIG9wY29kZSwgVm9pZCwgb3JpZ2luKQorICAgIHsKKyAgICAgICAgQVNTRVJUKG9wY29kZSA9
PSBKdW1wKTsKKyAgICAgICAgbV9zdWNjZXNzb3JzLmFwcGVuZCh0YXJnZXQpOworICAgIH0KKwor
ICAgIC8vIFVzZSB0aGlzIGZvciBCcmFuY2guCisgICAgQ29udHJvbFZhbHVlKAorICAgICAgICB1
bnNpZ25lZCBpbmRleCwgT3Bjb2RlIG9wY29kZSwgT3JpZ2luIG9yaWdpbiwgVmFsdWUqIHByZWRp
Y2F0ZSwKKyAgICAgICAgQmFzaWNCbG9jayogeWVzLCBCYXNpY0Jsb2NrKiBubykKKyAgICAgICAg
OiBWYWx1ZShpbmRleCwgb3Bjb2RlLCBWb2lkLCBvcmlnaW4sIHByZWRpY2F0ZSkKKyAgICB7Cisg
ICAgICAgIEFTU0VSVChvcGNvZGUgPT0gQnJhbmNoKTsKKyAgICAgICAgbV9zdWNjZXNzb3JzLmFw
cGVuZCh5ZXMpOworICAgICAgICBtX3N1Y2Nlc3NvcnMuYXBwZW5kKG5vKTsKKyAgICB9Cit9Owor
Cit9IH0gLy8gbmFtZXNwYWNlIEpTQzo6QjMKKworI2VuZGlmIC8vIEIzQ29udHJvbFZhbHVlX2gK
KwpJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzSW5kZXhTZXQuaAo9PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNJbmRleFNldC5oCShyZXZpc2lvbiAwKQor
KysgU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzSW5kZXhTZXQuaAkod29ya2luZyBjb3B5KQpA
QCAtMCwwICsxLDE0MSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNSBBcHBsZSBJbmMuIEFs
bCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3Vy
Y2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFy
ZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFy
ZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4g
dGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9u
cyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGlu
IGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5v
dGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1l
ciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92
aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9W
SURFRCBCWSBBUFBMRSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJ
RUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1Q
TElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJU
SUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQ
TEUgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5E
SVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJ
QUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVO
VCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IK
KyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5E
IE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RS
SUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVS
V0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRX
QVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLiAK
KyAqLworCisjaWZuZGVmIEIzSW5kZXhTZXRfaAorI2RlZmluZSBCM0luZGV4U2V0X2gKKworI2lu
Y2x1ZGUgPHd0Zi9CaXRWZWN0b3IuaD4KKyNpbmNsdWRlIDx3dGYvQ29tbWFQcmludGVyLmg+CisK
K25hbWVzcGFjZSBKU0MgeyBuYW1lc3BhY2UgQjMgeworCisvLyBUaGlzIGlzIGEgc2V0IGZvciB0
aGluZ3MgdGhhdCBoYXZlIGFuIGluZGV4KCkuIEl0J3Mgc3VwZXIgZWZmaWNpZW50IGZvciBCYXNp
Y0Jsb2Nrcy4gSXQncyBvbmx5CisvLyBlZmZpY2llbnQgZm9yIFZhbHVlcyBpZiB5b3UgZG9uJ3Qg
Y3JlYXRlIHRvbyBtYW55IG9mIHRoZXNlIHNldHMsIHNpbmNlIFZhbHVlcyBjYW4gaGF2ZSB2ZXJ5
IHNwYXJzZQorLy8gaW5kaWNlcyBhbmQgdGhlcmUgYXJlIGEgbG90IG9mIFZhbHVlcy4KKworLy8g
SWYgeW91IHdhbnQgYSBzZXQgb2YgQmFzaWNCbG9ja3MsIHlvdSBkbyBJbmRleFNldDxCYXNpY0Js
b2NrPi4gU28sIFQgPSBCYXNpY0Jsb2NrLgordGVtcGxhdGU8dHlwZW5hbWUgVD4KK2NsYXNzIElu
ZGV4U2V0IHsKK3B1YmxpYzoKKyAgICBJbmRleFNldCgpCisgICAgeworICAgIH0KKworICAgIGJv
b2wgYWRkKFQqIHZhbHVlKQorICAgIHsKKyAgICAgICAgcmV0dXJuICFtX3NldC5zZXQodmFsdWUt
PmluZGV4KCkpOworICAgIH0KKworICAgIGJvb2wgY29udGFpbnMoVCogdmFsdWUpIGNvbnN0Cisg
ICAgeworICAgICAgICBpZiAoIXZhbHVlKQorICAgICAgICAgICAgcmV0dXJuIG51bGxwdHI7Cisg
ICAgICAgIHJldHVybiBtX3NldC5nZXQodmFsdWUtPmluZGV4KCkpOworICAgIH0KKworICAgIHRl
bXBsYXRlPHR5cGVuYW1lIENvbGxlY3Rpb25UeXBlPgorICAgIGNsYXNzIEl0ZXJhYmxlIHsKKyAg
ICBwdWJsaWM6CisgICAgICAgIEl0ZXJhYmxlKGNvbnN0IENvbGxlY3Rpb25UeXBlJiBjb2xsZWN0
aW9uLCBjb25zdCBJbmRleFNldCYgc2V0KQorICAgICAgICAgICAgOiBtX2NvbGxlY3Rpb24oY29s
bGVjdGlvbikKKyAgICAgICAgICAgICwgbV9zZXQoc2V0KQorICAgICAgICB7CisgICAgICAgIH0K
KworICAgICAgICBjbGFzcyBpdGVyYXRvciB7CisgICAgICAgIHB1YmxpYzoKKyAgICAgICAgICAg
IGl0ZXJhdG9yKCkKKyAgICAgICAgICAgICAgICA6IG1fY29sbGVjdGlvbihudWxscHRyKQorICAg
ICAgICAgICAgeworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpdGVyYXRvcihjb25zdCBD
b2xsZWN0aW9uVHlwZSYgY29sbGVjdGlvbiwgQml0VmVjdG9yOjpTZXRCaXRzSXRlcmFibGU6Oml0
ZXJhdG9yIGl0ZXIpCisgICAgICAgICAgICAgICAgOiBtX2NvbGxlY3Rpb24oJmNvbGxlY3Rpb24p
CisgICAgICAgICAgICAgICAgLCBtX2l0ZXIoaXRlcikKKyAgICAgICAgICAgIHsKKyAgICAgICAg
ICAgIH0KKworICAgICAgICAgICAgVCogb3BlcmF0b3IqKCkKKyAgICAgICAgICAgIHsKKyAgICAg
ICAgICAgICAgICByZXR1cm4gbV9jb2xsZWN0aW9uLT5hdCgqbV9pdGVyKTsKKyAgICAgICAgICAg
IH0KKworICAgICAgICAgICAgaXRlcmF0b3ImIG9wZXJhdG9yKysoKQorICAgICAgICAgICAgewor
ICAgICAgICAgICAgICAgIG1faXRlcisrOworICAgICAgICAgICAgICAgIHJldHVybiAqdGhpczsK
KyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgYm9vbCBvcGVyYXRvcj09KGNvbnN0IGl0ZXJh
dG9yJiBvdGhlcikgY29uc3QKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4g
bV9pdGVyID09IG90aGVyLm1faXRlcjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgYm9v
bCBvcGVyYXRvciE9KGNvbnN0IGl0ZXJhdG9yJiBvdGhlcikgY29uc3QKKyAgICAgICAgICAgIHsK
KyAgICAgICAgICAgICAgICByZXR1cm4gISgqdGhpcyA9PSBvdGhlcik7CisgICAgICAgICAgICB9
CisKKyAgICAgICAgcHJpdmF0ZToKKyAgICAgICAgICAgIGNvbnN0IENvbGxlY3Rpb25UeXBlKiBt
X2NvbGxlY3Rpb247CisgICAgICAgICAgICBCaXRWZWN0b3I6OlNldEJpdHNJdGVyYWJsZTo6aXRl
cmF0b3IgbV9pdGVyOworICAgICAgICB9OworCisgICAgICAgIGl0ZXJhdG9yIGJlZ2luKCkgY29u
c3QgeyByZXR1cm4gaXRlcmF0b3IobV9jb2xsZWN0aW9uLCBtX3NldC5iZWdpbigpKTsgfQorICAg
ICAgICBpdGVyYXRvciBlbmQoKSBjb25zdCB7IHJldHVybiBpdGVyYXRvcihtX2NvbGxlY3Rpb24s
IG1fc2V0LmVuZCgpKTsgfQorCisgICAgcHJpdmF0ZToKKyAgICAgICAgY29uc3QgQ29sbGVjdGlv
blR5cGUmIG1fY29sbGVjdGlvbjsKKyAgICAgICAgY29uc3QgSW5kZXhTZXQmIG1fc2V0OworICAg
IH07CisKKyAgICAvLyBGb3IgYmFzaWMgYmxvY2tzLCB5b3UgZG86CisgICAgLy8gaW5kZXhTZXQu
dmFsdWVzKHByb2NlZHVyZSk7CisgICAgLy8KKyAgICAvLyBGb3IgdmFsdWVzLCB5b3UgZG86Cisg
ICAgLy8gaW5kZXhTZXQudmFsdWVzKHByb2NlZHVyZS52YWx1ZXMoKSk7CisgICAgdGVtcGxhdGU8
dHlwZW5hbWUgQ29sbGVjdGlvblR5cGU+CisgICAgSXRlcmFibGU8Q29sbGVjdGlvblR5cGU+IHZh
bHVlcyhjb25zdCBDb2xsZWN0aW9uVHlwZSYgY29sbGVjdGlvbikgY29uc3QKKyAgICB7CisgICAg
ICAgIHJldHVybiBJdGVyYWJsZTxDb2xsZWN0aW9uVHlwZT4oY29sbGVjdGlvbik7CisgICAgfQor
CisgICAgY29uc3QgQml0VmVjdG9yJiBpbmRpY2VzKCkgY29uc3QgeyByZXR1cm4gbV9zZXQ7IH0K
KworICAgIHZvaWQgZHVtcChQcmludFN0cmVhbSYgb3V0KSBjb25zdAorICAgIHsKKyAgICAgICAg
Q29tbWFQcmludGVyIGNvbW1hOworICAgICAgICBmb3IgKHNpemVfdCBpbmRleCA6IGluZGljZXMo
KS5zZXRCaXRzKCkpCisgICAgICAgICAgICBvdXQucHJpbnQoY29tbWEsIFQ6OmR1bXBQcmVmaXgs
IGluZGV4KTsKKyAgICB9CisKK3ByaXZhdGU6CisgICAgQml0VmVjdG9yIG1fc2V0OworfTsKKwor
fSB9IC8vIG5hbWVzcGFjZSBKU0M6OkIzCisKKyNlbmRpZiAvLyBCM0luZGV4U2V0X2gKKwpJbmRl
eDogU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzTG93ZXJpbmdNYXRjaGVyLnBhdHRlcm5zCj09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM0xvd2VyaW5nTWF0Y2hlci5w
YXR0ZXJucwkocmV2aXNpb24gMCkKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM0xvd2Vy
aW5nTWF0Y2hlci5wYXR0ZXJucwkod29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDQxIEBACisjIENv
cHlyaWdodCAoQykgMjAxNSBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisjCisjIFJl
ZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Ig
d2l0aG91dAorIyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUg
Zm9sbG93aW5nIGNvbmRpdGlvbnMKKyMgYXJlIG1ldDoKKyMgMS4gUmVkaXN0cmlidXRpb25zIG9m
IHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyMgICAgbm90aWNl
LCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgor
IyAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFi
b3ZlIGNvcHlyaWdodAorIyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0
aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisjICAgIGRvY3VtZW50YXRpb24gYW5kL29y
IG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisjCisjIFRI
SVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBBTkQgSVRTIENPTlRSSUJVVE9S
UyBgYEFTIElTJycKKyMgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5D
TFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisjIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0Yg
TUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyMgUFVSUE9TRSBB
UkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUiBJVFMgQ09OVFJJ
QlVUT1JTCisjIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUws
IFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKKyMgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJ
TkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKKyMgU1VCU1RJVFVURSBHT09E
UyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNT
CisjIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElB
QklMSVRZLCBXSEVUSEVSIElOCisjIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JU
IChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisjIEFSSVNJTkcgSU4gQU5ZIFdB
WSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YKKyMg
VEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCittYXRjaGVyIExvd2VyaW5nTWF0Y2hl
cgorCisjIFRoZXNlIHJ1bGVzIGFyZSBjb25zaWRlcmVkIGluIGEgY2FzY2FkZSwgc3RhcnRpbmcg
YXQgdGhlIHRvcC4gSXQncyBpbXBsZW5lbnRlZCB1c2luZyBzd2l0Y2gKKyMgc3RhdGVtZW50cyB3
aGVyZXZlciBwb3NzaWJsZS4KKworIyBOb3RlOiBhZGRpbmcgbW9yZSBydWxlcyB0byB0aGlzIG1h
dGNoZXIgaXMgYW4gZXhjZWxsZW50IHdheSBvZiBpbXByb3ZpbmcgcGVyZm9ybWFuY2UhCisKK0xv
YWQgPSBMb2FkKGFkZHJlc3MpCisKK0FkZExvYWQgPSBBZGQoTG9hZChhZGRyZXNzKSwgdmFsdWUp
CitBZGQgPSBBZGQobGVmdCwgcmlnaHQpCisKK1N0b3JlQWRkTG9hZCA9IFN0b3JlKEFkZChMb2Fk
KGFkZHJlc3MpLCB2YWx1ZSksIGFkZHJlc3MpCitTdG9yZUFuZExvYWQgPSBTdG9yZShBbmQoTG9h
ZChhZGRyZXNzKSwgdmFsdWUpLCBhZGRyZXNzKQorU3RvcmUgPSBTdG9yZSh2YWx1ZSwgYWRkcmVz
cykKKworUmV0dXJuID0gUmV0dXJuKHZhbHVlKQorCkluZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENv
cmUvYjMvQjNNZW1vcnlWYWx1ZS5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRD
b3JlL2IzL0IzTWVtb3J5VmFsdWUuY3BwCShyZXZpc2lvbiAwKQorKysgU291cmNlL0phdmFTY3Jp
cHRDb3JlL2IzL0IzTWVtb3J5VmFsdWUuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsNDIg
QEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTUgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2Vy
dmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkg
Zm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHBy
b3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4g
UmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5
cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xs
b3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBt
dXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlz
dCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAg
ICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUg
ZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUg
SU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMs
IElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElF
UyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVS
UE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IKKyAq
IENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVO
VEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElO
Q0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVU
RSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBP
UiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZ
CisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFks
IE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcg
SU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBB
RFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKworI2luY2x1
ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgIkIzTWVtb3J5VmFsdWUuaCIKKworbmFtZXNwYWNlIEpT
QyB7IG5hbWVzcGFjZSBCMyB7CisKK01lbW9yeVZhbHVlOjp+TWVtb3J5VmFsdWUoKQoreworfQor
Cit2b2lkIE1lbW9yeVZhbHVlOjpkdW1wTWV0YShQcmludFN0cmVhbSYgb3V0KSBjb25zdAorewor
ICAgIGlmIChtX29mZnNldCkKKyAgICAgICAgb3V0LnByaW50KCJvZmZzZXQgPSAiLCBtX29mZnNl
dCk7Cit9CisKK30gfSAvLyBuYW1lc3BhY2UgSlNDOjpCMworCkluZGV4OiBTb3VyY2UvSmF2YVNj
cmlwdENvcmUvYjMvQjNNZW1vcnlWYWx1ZS5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2Ny
aXB0Q29yZS9iMy9CM01lbW9yeVZhbHVlLmgJKHJldmlzaW9uIDApCisrKyBTb3VyY2UvSmF2YVNj
cmlwdENvcmUvYjMvQjNNZW1vcnlWYWx1ZS5oCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsMTQy
IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE1IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNl
cnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5
IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBw
cm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEu
IFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29w
eXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9s
bG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0g
bXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxp
c3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICog
ICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhl
IGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExF
IElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVT
LCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJ
RVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBV
UlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SCisg
KiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURF
TlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJ
TkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRV
VEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsg
T1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9S
WQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZ
LCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5H
IElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYg
QURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisKKyNpZm5k
ZWYgQjNNZW1vcnlWYWx1ZV9oCisjZGVmaW5lIEIzTWVtb3J5VmFsdWVfaAorCisjaW5jbHVkZSAi
QjNWYWx1ZS5oIgorCituYW1lc3BhY2UgSlNDIHsgbmFtZXNwYWNlIEIzIHsKKworY2xhc3MgTWVt
b3J5VmFsdWUgOiBwdWJsaWMgVmFsdWUgeworcHVibGljOgorICAgIHN0YXRpYyBib29sIGFjY2Vw
dHMoT3Bjb2RlIG9wY29kZSkKKyAgICB7CisgICAgICAgIHN3aXRjaCAob3Bjb2RlKSB7CisgICAg
ICAgIGNhc2UgTG9hZDhaOgorICAgICAgICBjYXNlIExvYWQ4UzoKKyAgICAgICAgY2FzZSBMb2Fk
MTZaOgorICAgICAgICBjYXNlIExvYWQxNlM6CisgICAgICAgIGNhc2UgTG9hZEZsb2F0OgorICAg
ICAgICBjYXNlIExvYWQ6CisgICAgICAgIGNhc2UgU3RvcmU4OgorICAgICAgICBjYXNlIFN0b3Jl
MTY6CisgICAgICAgIGNhc2UgU3RvcmVGbG9hdDoKKyAgICAgICAgY2FzZSBTdG9yZToKKyAgICAg
ICAgICAgIHJldHVybiB0cnVlOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJu
IGZhbHNlOworICAgICAgICB9CisgICAgfQorCisgICAgfk1lbW9yeVZhbHVlKCk7CisKKyAgICBp
bnRwdHJfdCBvZmZzZXQoKSBjb25zdCB7IHJldHVybiBtX29mZnNldDsgfQorCitwcm90ZWN0ZWQ6
CisgICAgdm9pZCBkdW1wTWV0YShQcmludFN0cmVhbSYpIGNvbnN0IG92ZXJyaWRlOworCitwcml2
YXRlOgorICAgIGZyaWVuZCBjbGFzcyBQcm9jZWR1cmU7CisKKyAgICAvLyBVc2UgdGhpcyBmb3Jt
IGZvciBMb2FkIChidXQgbm90IExvYWQ4WiwgTG9hZDhTLCBvciBhbnkgb2YgdGhlIExvYWRzIHRo
YXQgaGF2ZSBhIHN1ZmZpeCB0aGF0CisgICAgLy8gZGVzY3JpYmVzIHRoZSByZXR1cm5lZCB0eXBl
KS4KKyAgICBNZW1vcnlWYWx1ZSgKKyAgICAgICAgdW5zaWduZWQgaW5kZXgsIE9wY29kZSBvcGNv
ZGUsIFR5cGUgdHlwZSwgT3JpZ2luIG9yaWdpbiwgVmFsdWUqIHBvaW50ZXIsCisgICAgICAgIGlu
dHB0cl90IG9mZnNldCA9IDApCisgICAgICAgIDogVmFsdWUoaW5kZXgsIG9wY29kZSwgdHlwZSwg
b3JpZ2luLCBwb2ludGVyKQorICAgICAgICAsIG1fb2Zmc2V0KG9mZnNldCkKKyAgICB7CisgICAg
ICAgIGlmICghQVNTRVJUX0RJU0FCTEVEKSB7CisgICAgICAgICAgICBzd2l0Y2ggKG9wY29kZSkg
eworICAgICAgICAgICAgY2FzZSBMb2FkOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAg
ICAgICAgY2FzZSBMb2FkOFo6CisgICAgICAgICAgICBjYXNlIExvYWQ4UzoKKyAgICAgICAgICAg
IGNhc2UgTG9hZDE2WjoKKyAgICAgICAgICAgIGNhc2UgTG9hZDE2UzoKKyAgICAgICAgICAgICAg
ICBBU1NFUlQodHlwZSA9PSBJbnQzMik7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAg
ICAgICBjYXNlIExvYWRGbG9hdDoKKyAgICAgICAgICAgICAgICBBU1NFUlQodHlwZSA9PSBEb3Vi
bGUpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBTdG9yZTg6Cisg
ICAgICAgICAgICBjYXNlIFN0b3JlMTY6CisgICAgICAgICAgICBjYXNlIFN0b3JlRmxvYXQ6Cisg
ICAgICAgICAgICBjYXNlIFN0b3JlOgorICAgICAgICAgICAgICAgIEFTU0VSVCh0eXBlID09IFZv
aWQpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAg
ICAgICAgICAgICBBU1NFUlRfTk9UX1JFQUNIRUQoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAg
fQorICAgIH0KKworICAgIC8vIFVzZSB0aGlzIGZvcm0gZm9yIGxvYWRzIHdoZXJlIHRoZSByZXR1
cm4gdHlwZSBpcyBpbXBsaWVkLgorICAgIE1lbW9yeVZhbHVlKHVuc2lnbmVkIGluZGV4LCBPcGNv
ZGUgb3Bjb2RlLCBPcmlnaW4gb3JpZ2luLCBWYWx1ZSogcG9pbnRlciwgaW50cHRyX3Qgb2Zmc2V0
ID0gMCkKKyAgICAgICAgOiBWYWx1ZShpbmRleCwgb3Bjb2RlLCBvcGNvZGUgPT0gTG9hZEZsb2F0
ID8gRG91YmxlIDogSW50MzIsIG9yaWdpbiwgcG9pbnRlcikKKyAgICAgICAgLCBtX29mZnNldChv
ZmZzZXQpCisgICAgeworICAgICAgICBpZiAoIUFTU0VSVF9ESVNBQkxFRCkgeworICAgICAgICAg
ICAgc3dpdGNoIChvcGNvZGUpIHsKKyAgICAgICAgICAgIGNhc2UgTG9hZDhaOgorICAgICAgICAg
ICAgY2FzZSBMb2FkOFM6CisgICAgICAgICAgICBjYXNlIExvYWQxNlo6CisgICAgICAgICAgICBj
YXNlIExvYWQxNlM6CisgICAgICAgICAgICBjYXNlIExvYWRGbG9hdDoKKyAgICAgICAgICAgICAg
ICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgQVNTRVJUX05P
VF9SRUFDSEVEKCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAg
ICAgIH0KKyAgICB9CisKKyAgICAvLyBVc2UgdGhpcyBmb3JtIGZvciBzdG9yZXMuCisgICAgTWVt
b3J5VmFsdWUoCisgICAgICAgIHVuc2lnbmVkIGluZGV4LCBPcGNvZGUgb3Bjb2RlLCBPcmlnaW4g
b3JpZ2luLCBWYWx1ZSogdmFsdWUsIFZhbHVlKiBwb2ludGVyLAorICAgICAgICBpbnRwdHJfdCBv
ZmZzZXQgPSAwKQorICAgICAgICA6IFZhbHVlKGluZGV4LCBvcGNvZGUsIFZvaWQsIG9yaWdpbiwg
dmFsdWUsIHBvaW50ZXIpCisgICAgICAgICwgbV9vZmZzZXQob2Zmc2V0KQorICAgIHsKKyAgICAg
ICAgaWYgKCFBU1NFUlRfRElTQUJMRUQpIHsKKyAgICAgICAgICAgIHN3aXRjaCAob3Bjb2RlKSB7
CisgICAgICAgICAgICBjYXNlIFN0b3JlODoKKyAgICAgICAgICAgIGNhc2UgU3RvcmUxNjoKKyAg
ICAgICAgICAgIGNhc2UgU3RvcmVGbG9hdDoKKyAgICAgICAgICAgIGNhc2UgU3RvcmU6CisgICAg
ICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAg
IEFTU0VSVF9OT1RfUkVBQ0hFRCgpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAg
ICAgfQorICAgICAgICB9CisgICAgfQorfTsKKworfSB9IC8vIG5hbWVzcGFjZSBKU0M6OkIzCisK
KyNlbmRpZiAvLyBCM01lbW9yeVZhbHVlX2gKKwpJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3Jl
L2IzL0IzT3Bjb2RlLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMv
QjNPcGNvZGUuY3BwCShyZXZpc2lvbiAwKQorKysgU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0Iz
T3Bjb2RlLmNwcAkod29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDQ3IEBACisvKgorICogQ29weXJp
Z2h0IChDKSAyMDE1IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRp
c3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdp
dGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBm
b2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBv
ZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3Rp
Y2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIu
CisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhl
IGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBh
bmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBh
bmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAq
CisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFO
RCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBO
T1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklM
SVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlN
RUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUg
TElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAq
IEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1Qg
TElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklD
RVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJS
VVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZ
LCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5D
TFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9G
IFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9T
U0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisKKyNpbmNsdWRlICJjb25maWcuaCIKKyNp
bmNsdWRlICJCM09wY29kZS5oIgorCisjaW5jbHVkZSA8d3RmL1ByaW50U3RyZWFtLmg+CisKK25h
bWVzcGFjZSBXVEYgeworCit1c2luZyBuYW1lc3BhY2UgSlNDOjpCMzsKKwordm9pZCBwcmludElu
dGVybmFsKFByaW50U3RyZWFtJiBvdXQsIE9wY29kZSBvcGNvZGUpCit7CisgICAgc3dpdGNoIChv
cGNvZGUpIHsKKyAgICBjYXNlIElkZW50aXR5OgorICAgICAgICBvdXQucHJpbnQoIklkZW50aXR5
Iik7CisgICAgICAgIHJldHVybjsKKyAgICAgICAgLy8gRklYTUUKKyAgICB9CisgICAgUkVMRUFT
RV9BU1NFUlRfTk9UX1JFQUNIRUQoKTsKK30KKworfSAvLyBuYW1lc3BhY2UgV1RGCisKSW5kZXg6
IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM09wY29kZS5oCj09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJj
ZS9KYXZhU2NyaXB0Q29yZS9iMy9CM09wY29kZS5oCShyZXZpc2lvbiAwKQorKysgU291cmNlL0ph
dmFTY3JpcHRDb3JlL2IzL0IzT3Bjb2RlLmgJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSwyMDMg
QEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTUgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2Vy
dmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkg
Zm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHBy
b3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4g
UmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5
cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xs
b3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBt
dXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlz
dCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAg
ICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUg
ZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUg
SU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMs
IElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElF
UyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVS
UE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IKKyAq
IENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVO
VEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElO
Q0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVU
RSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBP
UiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZ
CisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFks
IE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcg
SU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBB
RFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKworI2lmbmRl
ZiBCM09wY29kZV9oCisjZGVmaW5lIEIzT3Bjb2RlX2gKKworI2luY2x1ZGUgPHd0Zi9TdGRMaWJF
eHRyYXMuaD4KKworbmFtZXNwYWNlIEpTQyB7IG5hbWVzcGFjZSBCMyB7CisKK2VudW0gT3Bjb2Rl
IDogaW50MTZfdCB7CisgICAgLy8gQSBuby1vcCB0aGF0IHJldHVybnMgVm9pZCwgdXNlZnVsIGZv
ciB3aGVuIHlvdSB3YW50IHRvIHJlbW92ZSBhIHZhbHVlLgorICAgIE5vcCwKKyAgICAgCisgICAg
Ly8gUG9seW1vcnBoaWMgaWRlbnRpdHksIHVzYWJsZSB3aXRoIGFueSB2YWx1ZSB0eXBlLgorICAg
IElkZW50aXR5LAorCisgICAgLy8gQ29uc3RhbnRzLiBVc2UgdGhlIENvbnN0VmFsdWUqIGNsYXNz
ZXMuIENvbnN0YW50cyBleGlzdCBpbiB0aGUgY29udHJvbCBmbG93LCBzbyB0aGF0IHdlIGNhbgor
ICAgIC8vIHJlYXNvbiBhYm91dCB3aGVyZSB3ZSB3b3VsZCBjb25zdHJ1Y3QgdGhlbS4gTGFyZ2Ug
Y29uc3RhbnRzIGFyZSBleHBlbnNpdmUgdG8gY3JlYXRlLgorICAgIENvbnN0MzIsCisgICAgQ29u
c3Q2NCwKKyAgICBDb25zdERvdWJsZSwKKworICAgIC8vIFRoZSBtYWdpY2FsIHN0YWNrIHNsb3Qu
IFRoaXMgaXMgdmlld2VkIGFzIGV4ZWN1dGluZyBhdCB0aGUgdG9wIG9mIHRoZSBwcm9ncmFtIHJl
Z2FyZGxlc3Mgb2YKKyAgICAvLyB3aGVyZSBpbiBjb250cm9sIGZsb3cgeW91IHB1dCBpdC4gRWFj
aCBpbnN0YW5jZSBvZiBhIFN0YWNrU2xvdCBWYWx1ZSBnZXRzIGEgZGlzam9pbnQgcmFuZ2Ugb2YK
KyAgICAvLyBzdGFjayBtZW1vcnkuIFVzZSB0aGUgU3RhY2tTbG90VmFsdWUgY2xhc3MuCisgICAg
U3RhY2tTbG90LAorCisgICAgLy8gVGhlIG1hZ2ljYWwgYXJndW1lbnQgcmVnaXN0ZXIuIFRoaXMg
aXMgdmlld2VkIGFzIGV4ZWN1dGluZyBhdCB0aGUgdG9wIG9mIHRoZSBwcm9ncmFtCisgICAgLy8g
cmVnYXJkbGVzcyBvZiB3aGVyZSBpbiBjb250cm9sIGZsb3cgeW91IHB1dCBpdCwgYW5kIHRoZSBj
b21waWxlciB0YWtlcyBjYXJlIHRvIGVuc3VyZSB0aGF0IHdlCisgICAgLy8gZG9uJ3QgY2xvYmJl
ciB0aGUgdmFsdWUgYnkgcmVnaXN0ZXIgYWxsb2NhdGlvbiBvciBjYWxscyAoZWl0aGVyIGJ5IHNh
dmluZyB0aGUgYXJndW1lbnQgdG8gdGhlCisgICAgLy8gc3RhY2sgb3IgcHJlc2VydmluZyBpdCBp
biBhIGNhbGxlZS1zYXZlIHJlZ2lzdGVyKS4gVXNlIHRoZSBBcmd1bWVudFJlZ1ZhbHVlIGNsYXNz
LiBUaGUgcmV0dXJuCisgICAgLy8gdHlwZSBpcyBlaXRoZXIgcG9pbnRlcigpIChmb3IgR1BScykg
b3IgRG91YmxlIChmb3IgRlBScykuCisgICAgQXJndW1lbnRSZWcsCisKKyAgICAvLyBUaGUgZnJh
bWUgcG9pbnRlci4gWW91IGNhbiBwdXQgdGhpcyBhbnl3aGVyZSBpbiBjb250cm9sIGZsb3cgYnV0
IGl0IHdpbGwgYWx3YXlzIHlpZWxkIHRoZQorICAgIC8vIGZyYW1lIHBvaW50ZXIsIHdpdGggYSBj
YXZlYXQ6IGlmIG91ciBjb21waWxlciBjaGFuZ2VzIHRoZSBmcmFtZSBwb2ludGVyIHRlbXBvcmFy
aWx5IGZvciBzb21lCisgICAgLy8gc2lsbHkgcmVhc29uLCB0aGUgRnJhbWVQb2ludGVyIGludHJp
bnNpYyB3aWxsIHJldHVybiB3aGVyZSB0aGUgZnJhbWUgcG9pbnRlciAqc2hvdWxkKiBiZSBub3QK
KyAgICAvLyB3aGVyZSBpdCBoYXBwZW5zIHRvIGJlIHJpZ2h0IG5vdy4KKyAgICBGcmFtZVBvaW50
ZXIsCisKKyAgICAvLyBQb2x5bW9ycGhpYyBtYXRoLCB1c2FibGUgd2l0aCBhbnkgdmFsdWUgdHlw
ZS4KKyAgICBBZGQsCisgICAgU3ViLAorICAgIE11bCwKKyAgICBEaXYsCisKKyAgICAvLyBJbnRl
Z2VyIG1hdGguCisgICAgQ2hpbGxEaXYsIC8vIGRvZXNuJ3QgdHJhcCBldmVyLCBiZWhhdmVzIGxp
a2UgSlMgKHgveSl8MC4KKyAgICBNb2QsCisgICAgQml0QW5kLAorICAgIEJpdE9yLAorICAgIEJp
dFhvciwKKyAgICBTaGwsCisgICAgU1NociwKKyAgICBaU2hyLAorCisgICAgLy8gQ2FzdHMgYW5k
IHN1Y2guCisgICAgLy8gVGFrZXMgYW5kIHJldHVybnMgSW50MzI6CisgICAgU0V4dDgsCisgICAg
U0V4dDE2LAorICAgIC8vIFRha2VzIEludDMyIGFuZCByZXR1cm5zIEludDY0OgorICAgIFNFeHQz
MiwKKyAgICBaRXh0MzIsCisgICAgLy8gVGFrZXMgYW5kIHJldHVybnMgRG91YmxlOgorICAgIEZS
b3VuZCwKKyAgICAvLyBUYWtlcyBpbnRzIGFuZCByZXR1cm5zIERvdWJsZToKKyAgICBJVG9ELAor
ICAgIC8vIFRha2VzIERvdWJsZSBhbmQgcmV0dXJucyBJbnQzMjoKKyAgICBEVG9JMzIsCisKKyAg
ICAvLyBQb2x5bW9ycGhpYyBjb21wYXJpc29ucywgdXNhYmxlIHdpdGggYW55IHZhbHVlIHR5cGUu
IFJldHVybnMgaW50MzIgMCBvciAxLiBOb3RlIHRoYXQgIk5vdCIKKyAgICAvLyBpcyBqdXN0IEVx
dWFsKHgsIDApLgorICAgIEVxdWFsLAorICAgIE5vdEVxdWFsLAorICAgIExlc3NUaGFuLAorICAg
IEdyZWF0ZXJUaGFuLAorICAgIExlc3NFcXVhbCwKKyAgICBHcmVhdGVyRXF1YWwsCisKKyAgICAv
LyBJbnRlZ2VyIGNvbXBhcmlzb25zLiBSZXR1cm5zIGludDMyIDAgb3IgMS4KKyAgICBBYm92ZSwK
KyAgICBCZWxvdywKKyAgICBBYm92ZUVxdWFsCisgICAgQmVsb3dFcXVhbCwKKworICAgIC8vIE1l
bW9yeSBsb2Fkcy4gT3Bjb2RlIGluZGljYXRlcyBob3cgd2UgbG9hZCBhbmQgdGhlIGxvYWRlZCB0
eXBlLiBUaGVzZSB1c2UgTWVtb3J5VmFsdWUuCisgICAgLy8gVGhlc2UgcmV0dXJuIEludDMyOgor
ICAgIExvYWQ4WiwKKyAgICBMb2FkOFMsCisgICAgTG9hZDE2WiwKKyAgICBMb2FkMTZTLAorICAg
IC8vIFRoaXMgcmV0dXJucyBEb3VibGU6CisgICAgTG9hZEZsb2F0LAorICAgIC8vIFRoaXMgcmV0
dXJuIHdoYXRldmVyIHRoZSByZXR1cm4gdHlwZSBpczoKKyAgICBMb2FkLAorCisgICAgLy8gTWVt
b3J5IHN0b3Jlcy4gT3Bjb2RlIGluZGljYXRlcyBob3cgdGhlIHZhbHVlIGlzIHN0b3JlZC4gVGhl
c2UgdXNlIE1lbW9yeVZhbHVlLgorICAgIC8vIFRoZXNlIHRha2UgYW4gSW50MzIgdmFsdWU6Cisg
ICAgU3RvcmU4LAorICAgIFN0b3JlMTYsCisgICAgLy8gVGhpcyB0YWtlcyBhIERvdWJsZSB2YWx1
ZToKKyAgICBTdG9yZUZsb2F0LAorICAgIC8vIFRoaXMgaXMgYSBwb2x5bW9ycGhpYyBzdG9yZSBm
b3IgSW50MzIsIEludDY0LCBhbmQgRG91YmxlOgorICAgIFN0b3JlLAorCisgICAgLy8gVGhpcyBp
cyBhIHJlZ3VsYXIgb3JkaW5hcnkgQyBmdW5jdGlvbiBjYWxsLCB1c2luZyB0aGUgc3lzdGVtIEMg
Y2FsbGluZyBjb252ZW50aW9uLiBNYWtlIHN1cmUKKyAgICAvLyB0aGF0IHRoZSBhcmd1bWVudHMg
YXJlIHBhc3NlZCB1c2luZyB0aGUgcmlnaHQgdHlwZXMuCisgICAgQ0NhbGwsCisKKyAgICAvLyBU
aGlzIGlzIGEgcGF0Y2hwb2ludC4gVXNlIHRoZSBQYXRjaHBvaW50VmFsdWUgY2xhc3MuIFRoaXMg
aXMgdmlld2VkIGFzIGJlaGF2aW5nIGxpa2UgYSBjYWxsLAorICAgIC8vIGJ1dCBvbmx5IGVtaXRz
IGNvZGUgdmlhIGEgY29kZSBnZW5lcmF0aW9uIGNhbGxiYWNrLiBUaGF0IGNhbGxiYWNrIGdldHMg
dG8gZW1pdCBjb2RlIGlubGluZS4KKyAgICAvLyBZb3UgY2FuIHBhc3MgYSBzdGFja21hcCBhbG9u
ZyB3aXRoIGNvbnN0cmFpbnRzIG9uIGhvdyBlYWNoIHN0YWNrbWFwIGFyZ3VtZW50IG11c3QgYmUg
cGFzc2VkLgorICAgIC8vIEl0J3MgbGVnYWwgdG8gcmVxdWVzdCB0aGF0IGEgc3RhY2ttYXAgYXJn
dW1lbnQgaXMgaW4gc29tZSByZWdpc3RlciBhbmQgaXQncyBsZWdhbCB0byByZXF1ZXN0CisgICAg
Ly8gdGhhdCBhIHN0YWNrbWFwIGFyZ3VtZW50IGlzIGF0IHNvbWUgb2Zmc2V0IGZyb20gdGhlIHRv
cCBvZiB0aGUgYXJndW1lbnQgcGFzc2luZyBhcmVhIG9uIHRoZQorICAgIC8vIHN0YWNrLgorICAg
IFBhdGNocG9pbnQsCisKKyAgICAvLyBDaGVja2VkIG1hdGguIFVzZSB0aGUgQ2hlY2tWYWx1ZSBj
bGFzcy4gTGlrZSBhIFBhdGNocG9pbnQsIHRoaXMgdGFrZXMgYSBjb2RlIGdlbmVyYXRpb24KKyAg
ICAvLyBjYWxsYmFjay4gVGhhdCBjYWxsYmFjayBnZXRzIHRvIGVtaXQgc29tZSBjb2RlIGFmdGVy
IHRoZSBlcGlsb2d1ZSwgYW5kIGdldHMgdG8gbGluayB0aGUganVtcAorICAgIC8vIGZyb20gdGhl
IGNoZWNrLCBhbmQgdGhlIGNob2ljZSBvZiByZWdpc3RlcnMuIFlvdSBhbHNvIGdldCB0byBzdXBw
bHkgYSBzdGFja21hcC4gTm90ZSB0aGF0IHlvdQorICAgIC8vIGFyZSBub3QgYWxsb3dlZCB0byBq
dW1wIGJhY2sgaW50byB0aGUgbWFpbmxpbmUgY29kZSBmcm9tIHlvdXIgc2xvdyBwYXRoLCBzaW5j
ZSB0aGUgY29tcGlsZXIKKyAgICAvLyB3aWxsIGFzc3VtZSB0aGF0IHRoZSBleGVjdXRpb24gb2Yg
dGhlc2UgaW5zdHJ1Y3Rpb25zIHByb3ZlcyB0aGF0IG92ZXJmbG93IGRpZG4ndCBoYXBwZW4uIEZv
cgorICAgIC8vIGV4YW1wbGUsIGlmIHlvdSBoYXZlIHR3byBDaGVja0FkZCdzOgorICAgIC8vCisg
ICAgLy8gYSA9IENoZWNrQWRkKHgsIHkpCisgICAgLy8gYiA9IENoZWNrQWRkKHgsIHkpCisgICAg
Ly8KKyAgICAvLyBUaGVuIGl0J3MgdmFsaWQgdG8gY2hhbmdlIHRoaXMgdG86CisgICAgLy8KKyAg
ICAvLyBhID0gQ2hlY2tBZGQoeCwgeSkKKyAgICAvLyBiID0gSWRlbnRpdHkoYSkKKyAgICAvLwor
ICAgIC8vIFRoaXMgaXMgdmFsaWQgcmVnYXJkbGVzcyBvZiB0aGUgY2FsbGJhY2tzIHVzZWQgYnkg
dGhlIHR3byBDaGVja0FkZHMuIFRoZXkgbWF5IGhhdmUgZGlmZmVyZW50CisgICAgLy8gY2FsbGJh
Y2tzLiBZZXQsIHRoaXMgdHJhbnNmb3JtYXRpb24gaXMgdmFsaWQgZXZlbiBpZiB0aGV5IGFyZSBk
aWZmZXJlbnQgYmVjYXVzZSB3ZSBrbm93IHRoYXQKKyAgICAvLyBhZnRlciB0aGUgZmlyc3QgQ2hl
Y2tBZGQgZXhlY3V0ZXMsIHRoZSBzZWNvbmQgQ2hlY2tBZGQgY291bGQgbm90IGhhdmUgcG9zc2li
bHkgdGFrZW4gc2xvdworICAgIC8vIHBhdGguIFRoZXJlZm9yZSwgdGhlIHNlY29uZCBDaGVja0Fk
ZCdzIGNhbGxiYWNrIGlzIGlycmVsZXZhbnQuCisgICAgQ2hlY2tBZGQsCisgICAgQ2hlY2tTdWIs
CisgICAgQ2hlY2tNdWwsCisKKyAgICAvLyBDaGVjayB0aGF0IHNpZGUtZXhpdHMuIFVzZSB0aGUg
Q2hlY2tWYWx1ZSBjbGFzcy4gTGlrZSBDaGVja0FkZCBhbmQgZnJpZW5kcywgdGhpcyBoYXMgYQor
ICAgIC8vIHN0YWNrbWFwIHdpdGggYSBnZW5lcmF0aW9uIGNhbGxiYWNrLiBUaGlzIHRha2VzIGFu
IEludDMyIGFyZ3VtZW50IHRoYXQgdGhpcyBicmFuY2hlcyBvbiwgd2l0aAorICAgIC8vIGZ1bGwg
YnJhbmNoIGZ1c2lvbiBpbiB0aGUgaW5zdHJ1Y3Rpb24gc2VsZWN0b3IuIEEgdHJ1ZSB2YWx1ZSBq
dW1wcyB0byB0aGUgZ2VuZXJhdG9yJ3Mgc2xvdworICAgIC8vIHBhdGguCisgICAgQ2hlY2ssCisK
KyAgICAvLyBTU0Egc3VwcG9ydCwgaW4gdGhlIHN0eWxlIG9mIERGRyBTU0EuCisgICAgVXBzaWxv
biwgLy8gVGhpcyB1c2VzIHRoZSBVcHNpbG9uVmFsdWUgY2xhc3MuCisgICAgUGhpLAorCisgICAg
Ly8gSnVtcC4gVXNlcyB0aGUgQ29udHJvbFZhbHVlIGNsYXNzLgorICAgIEp1bXAsCisgICAgCisg
ICAgLy8gUG9seW1vcnBoaWMgYnJhbmNoLCB1c2FibGUgd2l0aCBhbnkgdmFsdWUgdHlwZS4gQnJh
bmNoZXMgaWYgbm90IGVxdWFsIHRvIHplcm8uIFVzZXMgdGhlCisgICAgLy8gQ29udHJvbFZhbHVl
IGNsYXNzLCB3aXRoIHRoZSAwLWluZGV4IHN1Y2Nlc3NvciBiZWluZyB0aGUgdHJ1ZSBzdWNjZXNz
b3IuCisgICAgQnJhbmNoLAorCisgICAgLy8gU3dpdGNoLiBTd2l0Y2hlcyBvdmVyIGVpdGhlciBJ
bnQzMiBvciBJbnQ2NC4gVXNlcyB0aGUgU3dpdGNoVmFsdWUgY2xhc3MuCisgICAgU3dpdGNoLAor
CisgICAgLy8gUmV0dXJuLiBOb3RlIHRoYXQgQjMgcHJvY2VkdXJlcyBkb24ndCBrbm93IHRoZWly
IHJldHVybiB0eXBlLCBzbyB0aGlzIGNhbiBqdXN0IHJldHVybiBhbnkKKyAgICAvLyB0eXBlLiBV
c2VzIHRoZSBDb250cm9sVmFsdWUgY2xhc3MuCisgICAgUmV0dXJuLAorCisgICAgLy8gVGhpcyBp
cyBhIHRlcm1pbmFsIHRoYXQgaW5kaWNhdGVzIHRoYXQgd2Ugd2lsbCBuZXZlciBnZXQgaGVyZS4g
VXNlcyB0aGUgQ29udHJvbFZhbHVlIGNsYXNzLgorICAgIE9vcHMKK307CisKK30gfSAvLyBuYW1l
c3BhY2UgSlNDOjpCMworCituYW1lc3BhY2UgV1RGIHsKKworY2xhc3MgUHJpbnRTdHJlYW07CisK
K3ZvaWQgcHJpbnRJbnRlcm5hbChQcmludFN0cmVhbSYsIEpTQzo6QjM6Ok9wY29kZSk7CisKK30g
Ly8gbmFtZXNwYWNlIFdURgorCisjZW5kaWYgLy8gQjNPcGNvZGVfaAorCkluZGV4OiBTb3VyY2Uv
SmF2YVNjcmlwdENvcmUvYjMvQjNPcmlnaW4uY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZh
U2NyaXB0Q29yZS9iMy9CM09yaWdpbi5jcHAJKHJldmlzaW9uIDApCisrKyBTb3VyY2UvSmF2YVNj
cmlwdENvcmUvYjMvQjNPcmlnaW4uY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsMzcgQEAK
Ky8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTUgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVk
LgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9y
bXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3Zp
ZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVk
aXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmln
aHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dp
bmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0
IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBv
ZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBk
b2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlz
dHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5D
LiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElO
Q0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBP
RiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9T
RSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IKKyAqIENP
TlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFM
LCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xV
RElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBH
T09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBC
VVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisg
KiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9S
IFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4g
QU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJ
U0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKworI2luY2x1ZGUg
ImNvbmZpZy5oIgorI2luY2x1ZGUgIkIzT3JpZ2luLmgiCisKK25hbWVzcGFjZSBKU0MgeyBuYW1l
c3BhY2UgQjMgeworCit2b2lkIE9yaWdpbjo6ZHVtcChQcmludFN0cmVhbSYgb3V0KSBjb25zdAor
eworICAgIG91dC5wcmludCgiT3JpZ2luKCIsIFJhd1BvaW50ZXIobV9kYXRhKSwgIikiKTsKK30K
KworfSB9IC8vIG5hbWVzcGFjZSBKU0M6OkIzCisKSW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29y
ZS9iMy9CM09yaWdpbi5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9C
M09yaWdpbi5oCShyZXZpc2lvbiAwKQorKysgU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzT3Jp
Z2luLmgJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSw1NSBAQAorLyoKKyAqIENvcHlyaWdodCAo
QykgMjAxNSBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmli
dXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0
CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93
aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291
cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0
aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICog
Mi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92
ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRo
ZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29y
IG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICog
VEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5Z
CisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJ
TUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBB
TkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAg
SU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJM
RSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVN
UExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlU
RUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBM
T1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElP
TikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hF
VEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElO
RyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUg
VVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklM
SVRZIE9GIFNVQ0ggREFNQUdFLiAKKyAqLworCisjaWZuZGVmIEIzT3JpZ2luX2gKKyNkZWZpbmUg
QjNPcmlnaW5faAorCisjaW5jbHVkZSA8d3RmL1ByaW50U3RyZWFtLmg+CisKK25hbWVzcGFjZSBK
U0MgeyBuYW1lc3BhY2UgQjMgeworCisvLyBXaG9ldmVyIGdlbmVyYXRlcyBCM0lSIGNhbiBjaG9v
c2UgdG8gcHV0IG9yaWdpbnMgb24gdmFsdWVzLiBXaGVuIHlvdSBkbyB0aGlzLCBCMyB3aWxsIGJl
IGFibGUgdG8KKy8vIGFjY291bnQsIGRvd24gdG8gdGhlIG1hY2hpbmUgY29kZSwgd2hpY2ggaW5z
dHJ1Y3Rpb24gY29ycmVzcG9uZHMgdG8gd2hpY2ggb3JpZ2luLiBCMworLy8gdHJhbnNmb3JtYXRp
b25zIG11c3QgcHJlc2VydmUgT3JpZ2lucyBjYXJlZnVsbHkuIEl0J3MgYW4gZXJyb3IgdG8gd3Jp
dGUgYSB0cmFuc2Zvcm1hdGlvbiB0aGF0CisvLyBlaXRoZXIgZHJvcHMgT3JpZ2lucyBvciBsaWVz
IGFib3V0IHRoZW0uCitjbGFzcyBPcmlnaW4geworcHVibGljOgorICAgIGV4cGxpY2l0IE9yaWdp
bihjb25zdCB2b2lkKiBkYXRhID0gbnVsbHB0cikKKyAgICAgICAgOiBtX2RhdGEoZGF0YSkKKyAg
ICB7CisgICAgfQorCisgICAgY29uc3Qgdm9pZCogZGF0YSgpIGNvbnN0IHsgcmV0dXJuIG1fZGF0
YTsgfQorCisgICAgdm9pZCBkdW1wKFByaW50U3RyZWFtJikgY29uc3Q7CisgICAgCitwcml2YXRl
OgorICAgIGNvbnN0IHZvaWQqIG1fZGF0YTsKK307CisKK30gfSAvLyBuYW1lc3BhY2UgSlNDOjpC
MworCisjZW5kaWYgLy8gQjNPcmlnaW5faAorCkluZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUv
YjMvQjNQYXRjaHBvaW50VmFsdWUuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0
Q29yZS9iMy9CM1BhdGNocG9pbnRWYWx1ZS5jcHAJKHJldmlzaW9uIDApCisrKyBTb3VyY2UvSmF2
YVNjcmlwdENvcmUvYjMvQjNQYXRjaHBvaW50VmFsdWUuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0w
LDAgKzEsNDYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTUgQXBwbGUgSW5jLiBBbGwgcmln
aHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFu
ZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVy
bWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0
OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBh
Ym92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5k
IHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5h
cnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2Us
IHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4g
dGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQg
d2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQg
QlkgQVBQTEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdB
UlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQg
V0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxB
UgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElO
Qy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNU
LCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERB
TUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0Yg
U1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQ
Uk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBB
TlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBM
SUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0Up
IEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwg
RVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8K
KworI2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgIkIzUGF0Y2hwb2ludFZhbHVlLmgiCisK
KyNpbmNsdWRlIDx3dGYvQ29tbWFQcmludGVyLmg+CisKK25hbWVzcGFjZSBKU0MgeyBuYW1lc3Bh
Y2UgQjMgeworCitQYXRjaHBvaW50VmFsdWU6On5QYXRjaHBvaW50VmFsdWUoKQoreworfQorCit2
b2lkIFBhdGNocG9pbnRWYWx1ZTo6ZHVtcE1ldGEoUHJpbnRTdHJlYW0mIG91dCkgY29uc3QKK3sK
KyAgICBDb21tYVByaW50ZXIgY29tbWE7CisgICAgb3V0LnByaW50KGNvbW1hLCAic3RhY2ttYXAg
PSAiLCBzdGFja21hcCk7CisgICAgaWYgKHNoYWRvdykKKyAgICAgICAgb3V0LnByaW50KGNvbW1h
LCAic2hhZG93ID0gIiwgc2hhZG93KTsKK30KKworfSB9IC8vIG5hbWVzcGFjZSBKU0M6OkIzCisK
SW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM1BhdGNocG9pbnRWYWx1ZS5oCj09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM1BhdGNocG9pbnRWYWx1ZS5oCShy
ZXZpc2lvbiAwKQorKysgU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzUGF0Y2hwb2ludFZhbHVl
LmgJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSw1OCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykg
MjAxNSBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRp
b24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Cisg
KiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5n
IGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNl
IGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlz
IGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4g
UmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBj
b3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBm
b2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90
aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJ
UyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisg
KiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlU
RUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQg
RklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4g
Tk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBG
T1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExB
UlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQg
VE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NT
IE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikg
SE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhF
UiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBO
RUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNF
CisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZ
IE9GIFNVQ0ggREFNQUdFLiAKKyAqLworCisjaWZuZGVmIEIzUGF0Y2hwb2ludFZhbHVlX2gKKyNk
ZWZpbmUgQjNQYXRjaHBvaW50VmFsdWVfaAorCisjaW5jbHVkZSAiQjNWYWx1ZS5oIgorI2luY2x1
ZGUgIkIzU3RhY2ttYXAuaCIKKworbmFtZXNwYWNlIEpTQyB7IG5hbWVzcGFjZSBCMyB7CisKK2Ns
YXNzIFBhdGNocG9pbnRWYWx1ZSA6IHB1YmxpYyBWYWx1ZSB7CitwdWJsaWM6CisgICAgc3RhdGlj
IGJvb2wgYWNjZXB0cyhPcGNvZGUgb3Bjb2RlKSB7IHJldHVybiBvcGNvZGUgPT0gUGF0Y2hwb2lu
dDsgfQorCisgICAgflBhdGNocG9pbnRWYWx1ZSgpOworCisgICAgU3RhY2ttYXAgc3RhY2ttYXA7
CisgICAgdW5zaWduZWQgc2hhZG93IHsgMCB9OworCitwcm90ZWN0ZWQ6CisgICAgdm9pZCBkdW1w
TWV0YShQcmludFN0cmVhbSYpIGNvbnN0IG92ZXJyaWRlOworCitwcml2YXRlOgorICAgIGZyaWVu
ZCBjbGFzcyBQcm9jZWR1cmU7CisKKyAgICBQYXRjaHBvaW50VmFsdWUodW5zaWduZWQgaW5kZXgs
IFR5cGUgdHlwZSwgT3JpZ2luIG9yaWdpbiwgY29uc3QgQWRqYWNlbmN5TGlzdCYgY2hpbGRyZW4p
CisgICAgICAgIDogVmFsdWUoaW5kZXgsIFBhdGNocG9pbnQsIHR5cGUsIG9yaWdpbiwgY2hpbGRy
ZW4pCisgICAgeworICAgIH0KK307CisKK30gfSAvLyBuYW1lc3BhY2UgSlNDOjpCMworCisjZW5k
aWYgLy8gQjNQYXRjaHBvaW50VmFsdWVfaAorCkluZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUv
YjMvQjNQcm9jZWR1cmUuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9i
My9CM1Byb2NlZHVyZS5jcHAJKHJldmlzaW9uIDApCisrKyBTb3VyY2UvSmF2YVNjcmlwdENvcmUv
YjMvQjNQcm9jZWR1cmUuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsNTYgQEAKKy8qCisg
KiBDb3B5cmlnaHQgKEMpIDIwMTUgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoK
KyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdp
dGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRo
YXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmli
dXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAq
ICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlz
Y2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJv
ZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25k
aXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVu
dGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0
aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFT
IElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElO
RywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJD
SEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUg
RElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IKKyAqIENPTlRSSUJV
VE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVD
SUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywg
QlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBP
UiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVT
UyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBM
SUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQK
KyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdB
WSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9G
IFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKworI2luY2x1ZGUgImNvbmZp
Zy5oIgorI2luY2x1ZGUgIkIzUHJvY2VkdXJlLmgiCisKKyNpbmNsdWRlICJCM0Jhc2ljQmxvY2su
aCIKKyNpbmNsdWRlICJCM1ZhbHVlLmgiCisKK25hbWVzcGFjZSBKU0MgeyBuYW1lc3BhY2UgQjMg
eworCitQcm9jZWR1cmU6OlByb2NlZHVyZSgpCit7Cit9CisKK1Byb2NlZHVyZTo6flByb2NlZHVy
ZSgpCit7Cit9CisKK0Jhc2ljQmxvY2sqIFByb2NlZHVyZTo6YWRkQmxvY2soKQoreworICAgIHN0
ZDo6dW5pcXVlX3B0cjxCYXNpY0Jsb2NrPiBibG9jayA9IHN0ZDo6bWFrZV91bmlxdWU8QmFzaWNC
bG9jaz4obV9ibG9ja3Muc2l6ZSgpKTsKKyAgICBCYXNpY0Jsb2NrKiByZXN1bHQgPSBibG9jay5n
ZXQoKTsKKyAgICBtX2Jsb2Nrcy5hcHBlbmQoV1RGOjptb3ZlKGJsb2NrKSk7CisgICAgcmV0dXJu
IHJlc3VsdDsKK30KKwordm9pZCBQcm9jZWR1cmU6OmR1bXAoUHJpbnRTdHJlYW0mIG91dCkgY29u
c3QKK3sKKyAgICBmb3IgKEJhc2ljQmxvY2sqIGJsb2NrIDogKnRoaXMpCisgICAgICAgIG91dC5w
cmludChkZWVwRHVtcChibG9jaykpOworfQorCit9IH0gLy8gbmFtZXNwYWNlIEpTQzo6QjMKSW5k
ZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM1Byb2NlZHVyZS5oCj09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0t
IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM1Byb2NlZHVyZS5oCShyZXZpc2lvbiAwKQorKysg
U291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzUHJvY2VkdXJlLmgJKHdvcmtpbmcgY29weSkKQEAg
LTAsMCArMSwxNzcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTUgQXBwbGUgSW5jLiBBbGwg
cmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNl
IGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUg
cGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUg
bWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRo
ZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMg
YW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBi
aW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3Rp
Y2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIg
aW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlk
ZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklE
RUQgQlkgQVBQTEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVE
IFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJ
RUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElD
VUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExF
IElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElS
RUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFM
IERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQg
T0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisg
KiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBP
TiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklD
VCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJ
U0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FS
RSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisg
Ki8KKworI2lmbmRlZiBCM1Byb2NlZHVyZV9oCisjZGVmaW5lIEIzUHJvY2VkdXJlX2gKKworI2lu
Y2x1ZGUgPHd0Zi9CYWcuaD4KKyNpbmNsdWRlIDx3dGYvRmFzdE1hbGxvYy5oPgorI2luY2x1ZGUg
PHd0Zi9Ob25jb3B5YWJsZS5oPgorI2luY2x1ZGUgPHd0Zi9WZWN0b3IuaD4KKworbmFtZXNwYWNl
IEpTQyB7IG5hbWVzcGFjZSBCMyB7CisKK2NsYXNzIEJhc2ljQmxvY2s7CitjbGFzcyBWYWx1ZTsK
KworY2xhc3MgUHJvY2VkdXJlIHsKKyAgICBXVEZfTUFLRV9OT05DT1BZQUJMRShQcm9jZWR1cmUp
OworICAgIFdURl9NQUtFX0ZBU1RfQUxMT0NBVEVEOworcHVibGljOgorCisgICAgUHJvY2VkdXJl
KCk7CisgICAgflByb2NlZHVyZSgpOworCisgICAgQmFzaWNCbG9jayogYWRkQmxvY2soKTsKKyAg
ICAKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBWYWx1ZVR5cGUsIHR5cGVuYW1lLi4uIEFyZ3VtZW50
cz4KKyAgICBWYWx1ZVR5cGUqIGFkZChBcmd1bWVudHMuLi4pOworCisgICAgdm9pZCBkdW1wKFBy
aW50U3RyZWFtJikgY29uc3Q7CisKKyAgICB1bnNpZ25lZCBzaXplKCkgY29uc3QgeyByZXR1cm4g
bV9ibG9ja3Muc2l6ZSgpOyB9CisgICAgQmFzaWNCbG9jayogYXQodW5zaWduZWQgaW5kZXgpIGNv
bnN0IHsgcmV0dXJuIG1fYmxvY2tzW2luZGV4XTsgfQorICAgIEJhc2ljQmxvY2sqIG9wZXJhdG9y
W10odW5zaWduZWQgaW5kZXgpIGNvbnN0IHsgcmV0dXJuIGF0KGluZGV4KTsgfQorCisgICAgY2xh
c3MgaXRlcmF0b3IgeworICAgIHB1YmxpYzoKKyAgICAgICAgaXRlcmF0b3IoKToKKyAgICAgICAg
ICAgIDogbV9wcm9jZWR1cmUobnVsbHB0cikKKyAgICAgICAgICAgICwgbV9pbmRleCgwKQorICAg
ICAgICB7CisgICAgICAgIH0KKworICAgICAgICBpdGVyYXRvcihQcm9jZWR1cmUmIHByb2NlZHVy
ZSwgdW5zaWduZWQgaW5kZXgpCisgICAgICAgICAgICA6IG1fcHJvY2VkdXJlKCZwcm9jZWR1cmUp
CisgICAgICAgICAgICAsIG1faW5kZXgoaW5kZXgpCisgICAgICAgIHsKKyAgICAgICAgfQorCisg
ICAgICAgIEJhc2ljQmxvY2sqIG9wZXJhdG9yKigpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJl
dHVybiBtX3Byb2NlZHVyZS0+YXQobV9pbmRleCk7CisgICAgICAgIH0KKworICAgICAgICBpdGVy
YXRvciYgb3BlcmF0b3IrKygpCisgICAgICAgIHsKKyAgICAgICAgICAgIG1faW5kZXggPSBmaW5k
TmV4dChtX2luZGV4ICsgMSk7CisgICAgICAgICAgICByZXR1cm4gKnRoaXM7CisgICAgICAgIH0K
KworICAgICAgICBib29sIG9wZXJhdG9yPT0oY29uc3QgaXRlcmF0b3ImIG90aGVyKSBjb25zdAor
ICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gbV9pbmRleCA9PSBvdGhlci5tX2luZGV4Owor
ICAgICAgICB9CisKKyAgICAgICAgYm9vbCBvcGVyYXRvciE9KGNvbnN0IGl0ZXJhdG9yJiBvdGhl
cikgY29uc3QKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuICEoKnRoaXMgPT0gb3RoZXIp
OworICAgICAgICB9CisKKyAgICBwcml2YXRlOgorICAgICAgICB1bnNpZ25lZCBmaW5kTmV4dCh1
bnNpZ25lZCBpbmRleCkKKyAgICAgICAgeworICAgICAgICAgICAgd2hpbGUgKGluZGV4IDwgbV9w
cm9jZWR1cmUtPnNpemUoKSAmJiAhbV9wcm9jZWR1cmUtPmF0KGluZGV4KSkKKyAgICAgICAgICAg
ICAgICBpbmRleCsrOworICAgICAgICAgICAgcmV0dXJuIGluZXg7CisgICAgICAgIH0KKworICAg
ICAgICBQcm9jZWR1cmUqIG1fcHJvY2VkdXJlOworICAgICAgICB1bnNpZ25lZCBtX2luZGV4Owor
ICAgIH07CisKKyAgICBpdGVyYXRvciBiZWdpbigpIGNvbnN0IHsgcmV0dXJuIGl0ZXJhdG9yKCp0
aGlzLCAwKTsgfQorICAgIGl0ZXJhdG9yIGVuZCgpIGNvbnN0IHsgcmV0dXJuIGl0ZXJhdG9yKCp0
aGlzLCBudW1CbG9ja3MoKSk7IH0KKworICAgIGNsYXNzIFZhbHVlc0NvbGxlY3Rpb24geworICAg
IHB1YmxpYzoKKyAgICAgICAgVmFsdWVzQ29sbGVjdGlvbihQcm9jZWR1cmUmIHByb2NlZHVyZSkK
KyAgICAgICAgICAgIDogbV9wcm9jZWR1cmUocHJvY2VkdXJlKQorICAgICAgICB7CisgICAgICAg
IH0KKworICAgICAgICBjbGFzcyBpdGVyYXRvciB7CisgICAgICAgIHB1YmxpYzoKKyAgICAgICAg
ICAgIGl0ZXJhdG9yKCk6CisgICAgICAgICAgICAgICAgOiBtX3Byb2NlZHVyZShudWxscHRyKQor
ICAgICAgICAgICAgICAgICwgbV9pbmRleCgwKQorICAgICAgICAgICAgeworICAgICAgICAgICAg
fQorCisgICAgICAgICAgICBpdGVyYXRvcihQcm9jZWR1cmUmIHByb2NlZHVyZSwgdW5zaWduZWQg
aW5kZXgpCisgICAgICAgICAgICAgICAgOiBtX3Byb2NlZHVyZSgmcHJvY2VkdXJlKQorICAgICAg
ICAgICAgICAgICwgbV9pbmRleChpbmRleCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0K
KworICAgICAgICAgICAgVmFsdWUqIG9wZXJhdG9yKigpCisgICAgICAgICAgICB7CisgICAgICAg
ICAgICAgICAgcmV0dXJuIG1fcHJvY2VkdXJlLT5ibG9jayhtX2luZGV4KTsKKyAgICAgICAgICAg
IH0KKworICAgICAgICAgICAgaXRlcmF0b3ImIG9wZXJhdG9yKysoKQorICAgICAgICAgICAgewor
ICAgICAgICAgICAgICAgIG1faW5kZXgrKzsKKyAgICAgICAgICAgICAgICByZXR1cm4gKnRoaXM7
CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGJvb2wgb3BlcmF0b3I9PShjb25zdCBpdGVy
YXRvciYgb3RoZXIpIGNvbnN0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJu
IG1faW5kZXggPT0gb3RoZXIubV9pbmRleDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAg
Ym9vbCBvcGVyYXRvciE9KGNvbnN0IGl0ZXJhdG9yJiBvdGhlcikgY29uc3QKKyAgICAgICAgICAg
IHsKKyAgICAgICAgICAgICAgICByZXR1cm4gISgqdGhpcyA9PSBvdGhlcik7CisgICAgICAgICAg
ICB9CisKKyAgICAgICAgcHJpdmF0ZToKKworICAgICAgICAgICAgUHJvY2VkdXJlKiBtX3Byb2Nl
ZHVyZTsKKyAgICAgICAgICAgIHVuc2lnbmVkIG1faW5kZXg7CisgICAgICAgIH07CisKKyAgICAg
ICAgaXRlcmF0b3IgYmVnaW4oKSBjb25zdCB7IHJldHVybiBpdGVyYXRvcihtX3Byb2NlZHVyZSwg
MCk7IH0KKyAgICAgICAgaXRlcmF0b3IgZW5kKCkgY29uc3QgeyByZXR1cm4gaXRlcmF0b3IobV9w
cm9jZWR1cmUsIG1fcHJvY2VkdXJlLm1fdmFsdWVzLnNpemUoKSk7IH0KKworICAgICAgICB1bnNp
Z25lZCBzaXplKCkgY29uc3QgeyByZXR1cm4gbV9wcm9jZWR1cmUubV92YWx1ZXMuc2l6ZSgpOyB9
CisgICAgICAgIFZhbHVlKiBhdCh1bnNpZ25lZCBpbmRleCkgY29uc3QgeyByZXR1cm4gbV9wcm9j
ZWR1cmUubV92YWx1ZXNbaW5kZXhdOyB9CisgICAgICAgIFZhbHVlKiBvcGVyYXRvcltdKHVuc2ln
bmVkIGluZGV4KSBjb25zdCB7IHJldHVybiBhdChpbmRleCk7IH0KKyAgICAgICAgCisgICAgcHJp
dmF0ZToKKyAgICAgICAgUHJvY2VkdXJlJiBtX3Byb2NlZHVyZTsKKyAgICB9OworCisgICAgVmFs
dWVzQ29sbGVjdGlvbiB2YWx1ZXMoKSB7IHJldHVybiBWYWx1ZXNDb2xsZWN0aW9uKCp0aGlzKTsg
fQorCitwcml2YXRlOgorICAgIFZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QmFzaWNCbG9jaz4+IG1f
YmxvY2tzOworICAgIFZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8VmFsdWU+PiBtX3ZhbHVlczsKK307
CisKK30gfSAvLyBuYW1lc3BhY2UgSlNDOjpCMworCisjZW5kaWYgLy8gQjNQcm9jZWR1cmVfaAor
CkluZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNQcm9jZWR1cmVJbmxpbmVzLmgKPT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzUHJvY2VkdXJlSW5saW5lcy5o
CShyZXZpc2lvbiAwKQorKysgU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzUHJvY2VkdXJlSW5s
aW5lcy5oCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsNDYgQEAKKy8qCisgKiBDb3B5cmlnaHQg
KEMpIDIwMTUgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJp
YnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91
dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxv
d2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNv
dXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwg
dGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAq
IDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJv
dmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0
aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9v
ciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAq
IFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFTIElTJycgQU5EIEFO
WQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBM
SU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkg
QU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4g
IElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFC
TEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhF
TVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1J
VEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsg
TE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJ
T04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdI
RVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJ
TkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhF
IFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJ
TElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKworI2lmbmRlZiBCM1Byb2NlZHVyZUlubGluZXNf
aAorI2RlZmluZSBCM1Byb2NlZHVyZUlubGluZXNfaAorCisjaW5jbHVkZSAiQjNCYXNpY0Jsb2Nr
LmgiCisjaW5jbHVkZSAiQjNQcm9jZWR1cmUuaCIKKworbmFtZXNwYWNlIEpTQyB7IG5hbWVzcGFj
ZSBCMyB7CisKK3RlbXBsYXRlPHR5cGVuYW1lIFZhbHVlVHlwZSwgdHlwZW5hbWUuLi4gQXJndW1l
bnRzPgorVmFsdWVUeXBlKiBQcm9jZWR1cmU6OmFkZChBcmd1ZW50cy4uLiBhcmd1bWVudHMpCit7
CisgICAgc3RkOjp1bmlxdWVfcHRyPFZhbHVlVHlwZT4gdmFsdWUobmV3IFZhbHVlVHlwZShtX3Zh
bHVlcy5zaXplKCksIGFyZ3VtZW50cy4uLikpOworICAgIFZhbHVlVHlwZSogcmVzdWx0ID0gdmFs
dWUuZ2V0KCk7CisgICAgbV92YWx1ZXMuYXBwZW5kKFdURjo6bW92ZSh2YWx1ZSkpOworICAgIHJl
dHVybiByZXN1bHQ7Cit9CisKK30gfSAvLyBuYW1lc3BhY2UgSlNDOjpCMworCisjZW5kaWYgLy8g
QjNQcm9jZWR1cmVJbmxpbmVzX2gKKwpJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0Iz
U3RhY2tTbG90VmFsdWUuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9i
My9CM1N0YWNrU2xvdFZhbHVlLmNwcAkocmV2aXNpb24gMCkKKysrIFNvdXJjZS9KYXZhU2NyaXB0
Q29yZS9iMy9CM1N0YWNrU2xvdFZhbHVlLmNwcAkod29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDQx
IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE1IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNl
cnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5
IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBw
cm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEu
IFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29w
eXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9s
bG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0g
bXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxp
c3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICog
ICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhl
IGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExF
IElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVT
LCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJ
RVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBV
UlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SCisg
KiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURF
TlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJ
TkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRV
VEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsg
T1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9S
WQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZ
LCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5H
IElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYg
QURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisKKyNpbmNs
dWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJCM1N0YWNrU2xvdFZhbHVlLmgiCisKK25hbWVzcGFj
ZSBKU0MgeyBuYW1lc3BhY2UgQjMgeworCitTdGFja1Nsb3RWYWx1ZTo6flN0YWNrU2xvdFZhbHVl
KCkKK3sKK30KKwordm9pZCBTdGFja1Nsb3RWYWx1ZTo6ZHVtcE1ldGEoUHJpbnRTdHJlYW0mIG91
dCkgY29uc3QKK3sKKyAgICBvdXQucHJpbnQoImJ5dGVTaXplID0gIiwgbV9ieXRlU2l6ZSk7Cit9
CisKK30gfSAvLyBuYW1lc3BhY2UgSlNDOjpCMworCkluZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENv
cmUvYjMvQjNTdGFja1Nsb3RWYWx1ZS5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0
Q29yZS9iMy9CM1N0YWNrU2xvdFZhbHVlLmgJKHJldmlzaW9uIDApCisrKyBTb3VyY2UvSmF2YVNj
cmlwdENvcmUvYjMvQjNTdGFja1Nsb3RWYWx1ZS5oCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEs
NjUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTUgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJl
c2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5h
cnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVk
IHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICog
MS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBj
b3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBm
b2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9y
bSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMg
bGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisg
KiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0
aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQ
TEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJ
RVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFO
VElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICog
UFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IK
KyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJ
REVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMg
KElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJ
VFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRT
OyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhF
T1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJ
VFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJ
TkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJ
RiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKworI2lm
bmRlZiBCM1N0YWNrU2xvdFZhbHVlX2gKKyNkZWZpbmUgQjNTdGFja1Nsb3RWYWx1ZV9oCisKKyNp
bmNsdWRlICJCM1ZhbHVlLmgiCisKK25hbWVzcGFjZSBKU0MgeyBuYW1lc3BhY2UgQjMgeworCitj
bGFzcyBTdGFja1Nsb3RWYWx1ZSA6IHB1YmxpYyBWYWx1ZSB7CitwdWJsaWM6CisgICAgc3RhdGlj
IGJvb2wgYWNjZXB0cyhPcGNvZGUgb3Bjb2RlKSB7IHJldHVybiBvcGNvZGUgPT0gU3RhY2tTbG90
OyB9CisKKyAgICB+U3RhY2tTbG90VmFsdWUoKTsKKworICAgIHVuc2lnbmVkIGJ5dGVTaXplKCkg
Y29uc3QgeyByZXR1cm4gbV9ieXRlU2l6ZTsgfQorCisgICAgLy8gVGhpcyBnZXRzIGFzc2lnbmVk
IGF0IHRoZSBlbmQgb2YgY29tcGlsYXRpb24uIFlvdSBjYW5ub3QgcmVseSBvbiBpdCBoYXZpbmcg
YSBtZWFuaW5nZnVsCisgICAgLy8gdmFsdWUgd2hpbGUgdGhlIGNvbXBpbGVyIGlzIHJ1bm5pbmcu
CisgICAgaW50cHRyX3Qgb2Zmc2V0RnJvbUZQKCkgY29uc3QgeyByZXR1cm4gbV9vZmZzZXRGcm9t
RlA7IH0KKworcHJvdGVjdGVkOgorICAgIHZvaWQgZHVtcE1ldGEoUHJpbnRTdHJlYW0mKSBjb25z
dCBvdmVycmlkZTsKKworcHJpdmF0ZToKKyAgICBmcmllbmQgY2xhc3MgUHJvY2VkdXJlOworCisg
ICAgU3RhY2tTbG90VmFsdWUodW5zaWduZWQgaW5kZXgsIE9yaWdpbiBvcmlnaW4sIHVuc2lnbmVk
IGJ5dGVTaXplKQorICAgICAgICA6IFZhbHVlKGluZGV4LCBTdGFja1Nsb3QsIHBvaW50ZXIoKSwg
b3JpZ2luKQorICAgICAgICAsIG1fYnl0ZVNpemUoYnl0ZVNpemUpCisgICAgICAgICwgbV9vZmZz
ZXRGcm9tRlAoMCkKKyAgICB7CisgICAgfQorCisgICAgdW5zaWduZWQgbV9ieXRlU2l6ZTsKKyAg
ICBpbnRwdHJfdCBtX29mZnNldEZyb21GUDsKK307CisKK30gfSAvLyBuYW1lc3BhY2UgSlNDOjpC
MworCisjZW5kaWYgLy8gQjNTdGFja1Nsb3RWYWx1ZV9oCisKSW5kZXg6IFNvdXJjZS9KYXZhU2Ny
aXB0Q29yZS9iMy9CM1N0YWNrbWFwLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlw
dENvcmUvYjMvQjNTdGFja21hcC5jcHAJKHJldmlzaW9uIDApCisrKyBTb3VyY2UvSmF2YVNjcmlw
dENvcmUvYjMvQjNTdGFja21hcC5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSw0MCBAQAor
LyoKKyAqIENvcHlyaWdodCAoQykgMjAxNSBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQu
CisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jt
cywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlk
ZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRp
c3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdo
dAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2lu
ZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3Qg
cmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9m
IGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRv
Y3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0
cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMu
IGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5D
TFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9G
IE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NF
IEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUgorICogQ09O
VFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUws
IFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVE
SU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdP
T0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJV
U0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAq
IE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1Ig
VE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBB
TlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklT
RUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLiAKKyAqLworCisjaW5jbHVkZSAi
Y29uZmlnLmgiCisjaW5jbHVkZSAiQjNTdGFja21hcC5oIgorCituYW1lc3BhY2UgSlNDIHsgbmFt
ZXNwYWNlIEIzIHsKKwordm9pZCBTdGFja21hcDo6ZHVtcChQcmludFN0cmVhbSYgb3V0KSBjb25z
dAoreworICAgIG91dC5wcmludCgKKyAgICAgICAgIntvcGFxdWUgPSAiLCBSYXdQb2ludGVyKG1f
b3BhcXVlKSwgIiwgcmVwcyA9ICIsIGxpc3REdW1wKG1fcmVwcyksCisgICAgICAgICIsIGdlbmVy
YXRvciA9ICIsIFJhd1BvaW50ZXIobV9nZW5lcmF0b3IuZ2V0KCkpLCAiLCBjbG9iYmVyZWQgPSAi
LCBtX2Nsb2JiZXJlZCwKKyAgICAgICAgIiwgdXNlZFJlZ2lzdGVycyA9ICIsIG1fdXNlZFJlZ2lz
dGVycywgIn0iKTsKK30KKworfSB9IC8vIG5hbWVzcGFjZSBKU0M6OkIzCisKSW5kZXg6IFNvdXJj
ZS9KYXZhU2NyaXB0Q29yZS9iMy9CM1N0YWNrbWFwLmgKPT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL0ph
dmFTY3JpcHRDb3JlL2IzL0IzU3RhY2ttYXAuaAkocmV2aXNpb24gMCkKKysrIFNvdXJjZS9KYXZh
U2NyaXB0Q29yZS9iMy9CM1N0YWNrbWFwLmgJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSwxMjIg
QEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTUgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2Vy
dmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkg
Zm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHBy
b3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4g
UmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5
cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xs
b3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBt
dXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlz
dCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAg
ICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUg
ZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUg
SU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMs
IElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElF
UyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVS
UE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IKKyAq
IENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVO
VEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElO
Q0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVU
RSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBP
UiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZ
CisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFks
IE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcg
SU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBB
RFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKworI2lmbmRl
ZiBCM1N0YWNrbWFwX2gKKyNkZWZpbmUgQjNTdGFja21hcF9oCisKKyNpbmNsdWRlICJCM1ZhbHVl
UmVwLmgiCisjaW5jbHVkZSAiQ0NhbGxIZWxwZXJzLmgiCisjaW5jbHVkZSAiUmVnaXN0ZXJTZXQu
aCIKKyNpbmNsdWRlIDx3dGYvU2hhcmVkVGFzay5oPgorCituYW1lc3BhY2UgSlNDIHsgbmFtZXNw
YWNlIEIzIHsKKworY2xhc3MgQjNWYWx1ZTsKKworY2xhc3MgU3RhY2ttYXAgeworcHVibGljOgor
ICAgIHN0cnVjdCBHZW5lcmF0aW9uUGFyYW1zIHsKKyAgICAgICAgLy8gVGhpcyBpcyB0aGUgVmFs
dWUgY29udGFpbmluZyB0aGUgc3RhY2ttYXAuCisgICAgICAgIFZhbHVlKiB2YWx1ZTsKKworICAg
ICAgICAvLyBUaGlzIGlzIHRoZSBzdGFja21hcC4KKyAgICAgICAgU3RhY2ttYXAqIHN0YWNrbWFw
OworCisgICAgICAgIC8vIFRoaXMgaXMgdGhlIGp1bXAgdG8gdGhlIHNsb3cgcGF0aCwgaWYgdGhp
cyBpcyBhIHN0YWNrbWFwIGZvciBhIENoZWNrIHZhbHVlLgorICAgICAgICBDQ2FsbEhlbHBlcnM6
Okp1bXAganVtcDsKKyAgICB9OworICAgIAorICAgIHR5cGVkZWYgdm9pZCBHZW5lcmF0b3JGdW5j
dGlvbihDQ2FsbEhlbHBlcnMmLCBjb25zdCBHZW5lcmF0aW9uUGFyYW1zJik7CisgICAgdHlwZWRl
ZiBTaGFyZWRUYXNrPEdlbmVyYXRvckZ1bmN0aW9uPiBHZW5lcmF0b3I7CisgICAgCisgICAgU3Rh
Y2ttYXAoKQorICAgIHsKKyAgICB9CisKKyAgICAvLyBTZXQgc29tZSBvcGFxdWUgZGF0YSB0byBp
ZGVudGlmeSB0aGlzIHN0YWNrbWFwLiBUaGlzIGlzIHVzZWZ1bCBiZWNhdXNlIGEgU3RhY2ttYXAt
dXNpbmcgVmFsdWUKKyAgICAvLyBjYW4gYmUgZHVwbGljYXRlZCwgYW5kIGVhY2ggZHVwbGljYXRl
IG1heSBlbmQgdXAgaGF2aW5nIGRpZmZlcmVudCByZWdpc3RlciBhbGxvY2F0aW9uLiBUaGlzCisg
ICAgLy8gYWxsb3dzIGFsbCBvZiB0aG9zZSBkdXBsaWNhdGVzIHRvIGJlIGFibGUgdG8gcmVmZXIg
YmFjayB0byB3aGF0ZXZlciBoaWdoLWxldmVsIGRhdGEgc3RydWN0dXJlcworICAgIC8vIHdlIHdl
cmUgdXNpbmcgdG8gY3JlYXRlIHRoZSB2YWx1ZS4KKyAgICB2b2lkIHNldE9wYXF1ZSh2b2lkKiBw
YXJhbWV0ZXIpCisgICAgeworICAgICAgICBtX29wYXF1ZSA9IHBhcmFtZXRlcjsKKyAgICB9Cisg
ICAgdm9pZCogb3BhcXVlKCkgY29uc3QgeyByZXR1cm4gbV9vcGFxdWU7IH0KKworICAgIC8vIENv
bnZlbmllbmNlIGhlbHBlcnMgd2hlbiB1c2luZyBpbmRpY2VzIGluc3RlYWQgb2YgcG9pbnRlcnMu
CisgICAgdm9pZCBzZXRPcGFxdWVJbmRleChzaXplX3QgaW5kZXgpCisgICAgeworICAgICAgICBz
ZXRPcGFxdWUoYml0d2lzZV9jYXN0PHZvaWQqPihpbmRleCkpOworICAgIH0KKyAgICBzaXplX3Qg
b3BhcXVlSW5kZXgoKSBjb25zdCB7IHJldHVybiBiaXR3aXNlX2Nhc3Q8c2l6ZV90PihvcGFxdWUo
KSk7IH0KKworICAgIC8vIENvbnN0cmFpbiBhbiBhcmd1bWVudCB0byB0aGUgVmFsdWUgdGhhdCB1
c2VzIHRoaXMgU3RhY2ttYXAuIE5vdGUgdGhhdCBpbmRleCB6ZXJvIHJlZmVycyB0byB0aGUKKyAg
ICAvLyBmaXJzdCBhcmd1bWVudCB0byB0aGF0IFZhbHVlLCBldmVuIGlmIHRoYXQgYXJndW1lbnQg
aXMgbm90IGNvbnN0cmFpbmFibGUuIEZvciBleGFtcGxlLCBpbiBhCisgICAgLy8gQ2hlY2tBZGQg
dmFsdWUsIGl0IHdvdWxkIGJlIGFuIGVycm9yIHRvIGNvbnN0cmFpbiBpbmRpY2VzIDAgYW5kIDEu
IEluIGEgQ2hlY2sgdmFsdWUsIGl0IHdvdWxkCisgICAgLy8gYmUgYW4gZXJyb3IgdG8gY29uc3Ry
YWluIGluZGV4IDAuIEJ1dCwgd2hlbiB0aGUgZ2VuZXJhdGlvbiBjYWxsYmFjayBpcyBjYWxsZWQs
IHlvdSBjYW4gZGVwZW5kCisgICAgLy8gb24gdGhlIHJlcHMgZm9yIHRob3NlIGluZGljZXMgYmVp
bmcgZmlsbGVkIGluLgorICAgIHZvaWQgY29uc3RyYWluKHVuc2lnbmVkIGluZGV4LCBjb25zdCBW
YWx1ZVJlcCYgcmVwKQorICAgIHsKKyAgICAgICAgaWYgKGluZGV4ICsgMSA8IG1fcmVwcy5zaXpl
KCkpCisgICAgICAgICAgICBtX3JlcHMuZ3JvdyhpbmRleCArIDEpOworICAgICAgICBtX3JlcHNb
aW5kZXhdID0gcmVwOworICAgIH0KKworICAgIHZvaWQgY2xvYmJlcihjb25zdCBSZWdpc3RlclNl
dCYgc2V0KQorICAgIHsKKyAgICAgICAgbV9jbG9iYmVyZWQubWVyZ2Uoc2V0KTsKKyAgICB9CisK
KyAgICBjb25zdCBSZWdpc3RlclNldCYgY2xvYmJlcmVkKCkgY29uc3QgeyByZXR1cm4gbV9jbG9i
YmVyZWQ7IH0KKworICAgIHZvaWQgc2V0R2VuZXJhdG9yKFJlZlB0cjxHZW5lcmF0b3I+IGdlbmVy
YXRvcikKKyAgICB7CisgICAgICAgIG1fZ2VuZXJhdG9yID0gZ2VuZXJhdG9yOworICAgIH0KKwor
ICAgIHRlbXBsYXRlPHR5cGVuYW1lIEZ1bmN0b3I+CisgICAgdm9pZCBzZXRHZW5lcmF0b3IoY29u
c3QgRnVuY3RvciYgZnVuY3RvcikKKyAgICB7CisgICAgICAgIG1fZ2VuZXJhdG9yID0gY3JlYXRl
U2hhcmVkVGFzazxHZW5lcmF0b3JGdW5jdGlvbj4oZnVuY3Rvcik7CisgICAgfQorCisgICAgLy8g
VGhlc2Ugd2lsbCByZXR1cm4gaW50ZXJlc3RpbmcgdGhpbmdzIGluc2lkZSB0aGUgZ2VuZXJhdG9y
IGNhbGxiYWNrLCBvciBhZnRlciBjb21waWxhdGlvbi4KKyAgICBjb25zdCBWZWN0b3I8VmFsdWVS
ZXA+JiByZXBzKCkgY29uc3QgeyByZXR1cm4gbV9yZXBzOyB9CisgICAgY29uc3QgUmVnaXN0ZXJT
ZXQmIHVzZWRSZWdpc3RlcnMoKSBjb25zdCB7IHJldHVybiBtX3VzZWRSZWdpc3RlcnM7IH0KKwor
ICAgIHZvaWQgZHVtcChQcmludFN0cmVhbSYpIGNvbnN0OworICAgIAorcHJpdmF0ZToKKyAgICB2
b2lkKiBtX29wYXF1ZSB7IG51bGxwdHIgfTsKKyAgICBWZWN0b3I8VmFsdWVSZXA+IG1fcmVwczsK
KyAgICBSZWZQdHI8R2VuZXJhdG9yPiBtX2dlbmVyYXRvcjsKKyAgICBSZWdpc3RlclNldCBtX2Ns
b2JiZXJlZDsKKyAgICBSZWdpc3RlclNldCBtX3VzZWRSZWdpc3RlcnM7Cit9OworCit9IH0gLy8g
bmFtZXNwYWNlIEpTQzo6QjMKKworI2VuZGlmIC8vIEIzU3RhY2ttYXBfaAorCkluZGV4OiBTb3Vy
Y2UvSmF2YVNjcmlwdENvcmUvYjMvQjNTd2l0Y2hDYXNlLmNwcAo9PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3Vy
Y2UvSmF2YVNjcmlwdENvcmUvYjMvQjNTd2l0Y2hDYXNlLmNwcAkocmV2aXNpb24gMCkKKysrIFNv
dXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM1N3aXRjaENhc2UuY3BwCSh3b3JraW5nIGNvcHkpCkBA
IC0wLDAgKzEsMzkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTUgQXBwbGUgSW5jLiBBbGwg
cmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNl
IGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUg
cGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUg
bWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRo
ZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMg
YW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBi
aW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3Rp
Y2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIg
aW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlk
ZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklE
RUQgQlkgQVBQTEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVE
IFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJ
RUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElD
VUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExF
IElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElS
RUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFM
IERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQg
T0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisg
KiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBP
TiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklD
VCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJ
U0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FS
RSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisg
Ki8KKworI2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgIkIzU3dpdGNoQ2FzZS5oIgorCisj
aW5jbHVkZSAiQjNCYXNpY0Jsb2NrLmgiCisKK25hbWVzcGFjZSBKU0MgeyBuYW1lc3BhY2UgQjMg
eworCit2b2lkIFN3aXRjaENhc2U6OmR1bXAoUHJpbnRTdHJlYW0mIG91dCkgY29uc3QKK3sKKyAg
ICBvdXQucHJpbnQobV9jYXNlVmFsdWUsICItPiIsIHBvaW50ZXJEdW1wKG1fdGFyZ2V0KSk7Cit9
CisKK30gfSAvLyBuYW1lc3BhY2UgSlNDOjpCMworCkluZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENv
cmUvYjMvQjNTd2l0Y2hDYXNlLmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRDb3Jl
L2IzL0IzU3dpdGNoQ2FzZS5oCShyZXZpc2lvbiAwKQorKysgU291cmNlL0phdmFTY3JpcHRDb3Jl
L2IzL0IzU3dpdGNoQ2FzZS5oCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsNjMgQEAKKy8qCisg
KiBDb3B5cmlnaHQgKEMpIDIwMTUgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoK
KyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdp
dGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRo
YXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmli
dXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAq
ICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlz
Y2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJv
ZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25k
aXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVu
dGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0
aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFT
IElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElO
RywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJD
SEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUg
RElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IKKyAqIENPTlRSSUJV
VE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVD
SUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywg
QlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBP
UiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVT
UyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBM
SUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQK
KyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdB
WSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9G
IFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKworI2lmbmRlZiBCM1N3aXRj
aENhc2VfaAorI2RlZmluZSBCM1N3aXRjaENhc2VfaAorCisjaW5jbHVkZSA8d3RmL1N0ZExpYkV4
dHJhcy5oPgorI2luY2x1ZGUgPHd0Zi9QcmludFN0cmVhbS5oPgorCituYW1lc3BhY2UgSlNDIHsg
bmFtZXNwYWNlIEIzIHsKKworY2xhc3MgQmFzaWNCbG9jazsKKworY2xhc3MgU3dpdGNoQ2FzZSB7
CitwdWJsaWM6CisgICAgU3dpdGNoQ2FzZSgpCisgICAgeworICAgIH0KKworICAgIFN3aXRjaENh
c2UoaW50NjRfdCBjYXNlVmFsdWUsIEJhc2ljQmxvY2sqIHRhcmdldCkKKyAgICAgICAgOiBtX2Nh
c2VWYWx1ZShjYXNlVmFsdWUpCisgICAgICAgICwgbV90YXJnZXQodGFyZ2V0KQorICAgIHsKKyAg
ICB9CisKKyAgICBleHBsaWNpdCBvcGVyYXRvciBib29sKCkgY29uc3QgeyByZXR1cm4gISFtX3Rh
cmdldDsgfQorCisgICAgaW50NjRfdCBjYXNlVmFsdWUoKSBjb25zdCB7IHJldHVybiBtX2Nhc2VW
YWx1ZTsgfQorICAgIEJhc2ljQmxvY2sqIHRhcmdldCgpIGNvbnN0IHsgcmV0dXJuIG1fdGFyZ2V0
OyB9CisKKyAgICB2b2lkIGR1bXAoUHJpbnRTdHJlYW0mIG91dCkgY29uc3Q7CisKK3ByaXZhdGU6
CisgICAgaW50NjRfdCBjYXNlVmFsdWU7CisgICAgQmFzaWNCbG9jayogdGFyZ2V0OworfTsKKwor
fSB9IC8vIG5hbWVzcGFjZSBKU0M6OkIzCisKKyNlbmRpZiAvLyBCM1N3aXRjaENhc2VfaAorCklu
ZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNTd2l0Y2hWYWx1ZS5jcHAKPT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PQotLS0gU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzU3dpdGNoVmFsdWUuY3BwCShyZXZpc2lv
biAwKQorKysgU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzU3dpdGNoVmFsdWUuY3BwCSh3b3Jr
aW5nIGNvcHkpCkBAIC0wLDAgKzEsNjMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTUgQXBw
bGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1
c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZp
Y2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRp
b25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11
c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9m
IGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJp
YnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0
CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5n
IGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRl
cmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdB
UkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVT
UyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBU
SEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1Mg
Rk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5U
IFNIQUxMIEFQUExFIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBE
SVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBD
T05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICog
UFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0Us
IERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIg
Q0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09O
VFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5D
RSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0Yg
VEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNI
IERBTUFHRS4gCisgKi8KKworI2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2xkdWUgIkIzU3dpdGNo
VmFsdWUuaCIKKworbmFtZXNwYWNlIEpTQyB7IG5hbWVzcGFjZSBCMyB7CisKK1N3aXRjaFZhbHVl
Ojp+U3dpdGNoVmFsdWUoKQoreworfQorCitTd2l0Y2hDYXNlIFN3aXRjaFZhbHVlOjpyZW1vdmVD
YXNlKHVuc2lnbmVkIGluZGV4KQoreworICAgIFN3aXRjaENhc2UgcmVzdWx0ID0gbV9zdWNjZXNz
b3JzW2luZGV4XTsKKyAgICBtX3N1Y2Nlc3NvcnNbaW5kZXhdID0gbV9zdWNjZXNzb3JzLmxhc3Qo
KTsKKyAgICBtX3N1Y2Nlc3NvcnMucmVtb3ZlTGFzdCgpOworICAgIHJldHVybiByZXN1bHQ7Cit9
CisKK3ZvaWQgU3dpdGNoVmFsdWU6OmFwcGVuZENhc2UoY29uc3QgU3dpdGNoQ2FzZSYgc3dpdGNo
Q2FzZSkKK3sKKyAgICBtX3N1Y2Nlc3NvcnMuYXBwZW5kKG1fc3VjY2Vzc29ycy5sYXN0KCkpOwor
ICAgIG1fc3VjY2Vzc29yc1ttX3N1Y2Nlc3NvcnMuc2l6ZSgpIC0gMl0gPSBzd2l0Y2hDYXNlLnRh
cmdldCgpOworICAgIG1fdmFsdWVzLmFwcGVuZChzd2l0Y2hDYXNlLmNhc2VWYWx1ZSgpKTsKK30K
Kwordm9pZCBTd2l0Y2hWYWx1ZTo6ZHVtcE1ldGEoUHJpbnRTdHJlYW0mIG91dCkgY29uc3QKK3sK
KyAgICAvLyBUaGlzIGRlc3RydWN0aXZlbHkgb3ZlcnJpZGVzIENvbnRyb2xWYWx1ZSdzIGR1bXBN
ZXRhKCkuCisgICAgb3V0LnByaW50KGxpc3REdW1wKCp0aGlzKSk7Cit9CisKK1N3aXRjaFZhbHVl
OjpTd2l0Y2hWYWx1ZSh1bnNpZ25lZCBpbmRleCwgT3JpZ2luIG9yaWdpbiwgQmFzaWNCbG9jayog
ZmFsbFRocm91Z2gpCisgICAgOiBDb250cm9sVmFsdWUoaW5kZXgsIFN3aXRjaCwgb3JpZ2luKQor
eworICAgIG1fc3VjY2Vzc29ycy5hcHBlbmQoZmFsbFRocm91Z2gpOworfQorCit9IH0gLy8gbmFt
ZXNwYWNlIEpTQzo6QjMKKwpJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzU3dpdGNo
VmFsdWUuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNTd2l0Y2hW
YWx1ZS5oCShyZXZpc2lvbiAwKQorKysgU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzU3dpdGNo
VmFsdWUuaAkod29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDEyMyBAQAorLyoKKyAqIENvcHlyaWdo
dCAoQykgMjAxNSBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0
cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRo
b3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9s
bG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Yg
c291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNl
LCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgor
ICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBh
Ym92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5k
IHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5k
L29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgor
ICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIGBgQVMgSVMnJyBBTkQg
QU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9U
IExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElU
WSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVE
LiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJ
QUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBF
WEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJ
TUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VT
OyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQ
VElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwg
V0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xV
RElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBU
SEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJ
QklMSVRZIE9GIFNVQ0ggREFNQUdFLiAKKyAqLworCisjaWZuZGVmIEIzU3dpdGNoVmFsdWVfaAor
I2RlZmluZSBCM1N3aXRjaFZhbHVlX2gKKworI2luY2x1ZGUgIkIzQ29udHJvbFZhbHVlLmgiCisj
aW5jbHVkZSAiQjNTd2l0Y2hDYXNlLmgiCisKK25hbWVzcGFjZSBKU0MgeyBuYW1lc3BhY2UgQjMg
eworCitjbGFzcyBTd2l0Y2hWYWx1ZSA6IHB1YmxpYyBDb250cm9sVmFsdWUgeworcHVibGljOgor
ICAgIHN0YXRpYyBib29sIGFjY2VwdHMoT3Bjb2RlIG9wY29kZSkgeyByZXR1cm4gb3Bjb2RlID09
IFN3aXRjaDsgfQorCisgICAgflN3aXRjaFZhbHVlKCk7CisKKyAgICAvLyBudW1DYXNlVmFsdWVz
KCkgKyAxID09IG51bVN1Y2Nlc3NvcnMoKS4KKyAgICB1bnNpZ25lZCBudW1DYXNlVmFsdWVzKCkg
Y29uc3QgeyByZXR1cm4gbV92YWx1ZXMuc2l6ZSgpOyB9CisKKyAgICAvLyBUaGUgc3VjY2Vzc29y
IGZvciB0aGlzIGNhc2UgdmFsdWUgaXMgYXQgdGhlIHNhbWUgaW5kZXguCisgICAgaW50NjRfdCBj
YXNlVmFsdWUodW5zaWduZWQgaW5kZXgpIGNvbnN0IHsgcmV0dXJuIG1fdmFsdWVzW2ldOyB9Cisg
ICAgCisgICAgY29uc3QgVmVjdG9yPGludDY0X3Q+JiBjYXNlVmFsdWVzKCkgY29uc3QgeyByZXR1
cm4gbV92YWx1ZXM7IH0KKworICAgIEJhc2ljQmxvY2sqIGZhbGxUaHJvdWdoKCkgY29uc3QgeyBy
ZXR1cm4gc3VjY2Vzc29ycygpLmxhc3QoKTsgfQorICAgIEJhc2ljQmxvY2sqJiBmYWxsVGhyb3Vn
aCgpIHsgcmV0dXJuIHN1Y2Nlc3NvcnMoKS5sYXN0KCk7IH0KKworICAgIHVuc2lnbmVkIHNpemUo
KSBjb25zdCB7IHJldHVybiBudW1DYXNlVmFsdWVzKCk7IH0KKyAgICBTd2l0Y2hDYXNlIGF0KHVu
c2lnbmVkIGluZGV4KSBjb25zdAorICAgIHsKKyAgICAgICAgcmV0dXJuIFN3aXRjaENhc2UoY2Fz
ZVZhbHVlKGluZGV4KSwgc3VjY2Vzc29yKGluZGV4KSk7CisgICAgfQorICAgIFN3aXRjaENhc2Ug
b3BlcmF0b3JbXSh1bnNpZ25lZCBpbmRleCkgY29uc3QKKyAgICB7CisgICAgICAgIHJldHVybiBh
dChpbmRleCk7CisgICAgfQorCisgICAgY2xhc3MgaXRlcmF0b3IgeworICAgIHB1YmxpYzoKKyAg
ICAgICAgaXRlcmF0b3IoKQorICAgICAgICAgICAgOiBtX3N3aXRjaChudWxscHRyKQorICAgICAg
ICAgICAgLCBtX2luZGV4KDApCisgICAgICAgIHsKKyAgICAgICAgfQorCisgICAgICAgIGl0ZXJh
dG9yKFN3aXRjaFZhbHVlJiBzd2l0Y2hWYWx1ZSwgdW5zaWduZWQgaW5kZXgpCisgICAgICAgICAg
ICA6IG1fc3dpdGNoKCZzd2l0Y2hWYWx1ZSkKKyAgICAgICAgICAgICwgbV9pbmRleChpbmRleCkK
KyAgICAgICAgeworICAgICAgICB9CisKKyAgICAgICAgU3dpdGNoQ2FzZSBvcGVyYXRvciooKQor
ICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gbV9zd2l0Y2gtPmF0KG1faW5kZXgpOworICAg
ICAgICB9CisKKyAgICAgICAgaXRlcmF0b3ImIG9wZXJhdG9yKysoKQorICAgICAgICB7CisgICAg
ICAgICAgICBtX2luZGV4Kys7CisgICAgICAgICAgICByZXR1cm4gKnRoaXM7CisgICAgICAgIH0K
KworICAgICAgICBib29sIG9wZXJhdG9yPT0oY29uc3QgaXRlcmF0b3ImIG90aGVyKSBjb25zdAor
ICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gbV9pbmRleCA9PSBvdGhlci5tX2luZGV4Owor
ICAgICAgICB9CisKKyAgICAgICAgYm9vbCBvcGVyYXRvciE9KGNvbnN0IGl0ZXJhdG9yJiBvdGhl
cikgY29uc3QKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuICEoKnRoaXMgPT0gb3RoZXIp
OworICAgICAgICB9CisKKyAgICBwcml2YXRlOgorICAgICAgICBTd2l0Y2hWYWx1ZSogbV9zd2l0
Y2g7CisgICAgICAgIHVuc2lnbmVkIG1faW5kZXg7CisgICAgfTsKKworICAgIGl0ZXJhdG9yIGJl
Z2luKCkgY29uc3QgeyByZXR1cm4gaXRlcmF0b3IoKnRoaXMsIDApOyB9CisgICAgaXRlcmF0b3Ig
ZW5kKCkgY29uc3QgeyByZXR1cm4gaXRlcmF0b3IoKnRoaXMsIHNpemUoKSk7IH0KKworICAgIC8v
IFRoaXMgcmVtb3ZlcyB0aGUgY2FzZSBhbmQgcmVvcmRlcnMgdGhpbmdzIGEgYml0LiBJZiB5b3Un
cmUgaXRlcmF0aW5nIHRoZSBjYXNlcyBmcm9tIDAgdG8gTiwKKyAgICAvLyB0aGVuIHlvdSBjYW4g
a2VlcCBpdGVyYXRpbmcgYWZ0ZXIgdGhpcyBzbyBsb25nIGFzIHlvdSByZXZpc2l0IHRoaXMgc2Ft
ZSBpbmRleCAod2hpY2ggd2lsbCBub3cKKyAgICAvLyBjb250YWluIHNvbWUgb3RoZXIgY2FzZSB2
YWx1ZSkuIFRoaXMgcmVtb3ZlcyB0aGUgY2FzZSB0aGF0IHdhcyByZW1vdmVkLgorICAgIFN3aXRj
aENhc2UgcmVtb3ZlQ2FzZSh1bnNpZ25lZCBpbmRleCk7CisKKyAgICB2b2lkIGFwcGVuZENhc2Uo
Y29uc3QgU3dpdGNoQ2FzZSYgc3dpdGNoQ2FzZSk7CisKK3Byb3RlY3RlZDoKKyAgICB2b2lkIGR1
bXBNZXRhKFByaW50U3RyZWFtJikgY29uc3Qgb3ZlcnJpZGU7CisKK3ByaXZhdGU6CisgICAgZnJp
ZW5kIGNsYXNzIFByb2NlZHVyZTsKKworICAgIFN3aXRjaFZhbHVlKHVuc2lnbmVkIGluZGV4LCBP
cmlnaW4gb3JpZ2luLCBCYXNpY0Jsb2NrKiBmYWxsVGhyb3VnaCk7Cit9OworCit9IH0gLy8gbmFt
ZXNwYWNlIEpTQzo6QjMKKworI2VuZGlmIC8vIEIzU3dpdGNoVmFsdWVfaAorCkluZGV4OiBTb3Vy
Y2UvSmF2YVNjcmlwdENvcmUvYjMvQjNUeXBlLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2
YVNjcmlwdENvcmUvYjMvQjNUeXBlLmNwcAkocmV2aXNpb24gMCkKKysrIFNvdXJjZS9KYXZhU2Ny
aXB0Q29yZS9iMy9CM1R5cGUuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsNTQgQEAKKy8q
CisgKiBDb3B5cmlnaHQgKEMpIDIwMTUgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgor
ICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMs
IHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVk
IHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0
cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQK
KyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcg
ZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJl
cHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBj
b25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1
bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJp
YnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBg
YEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xV
RElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBN
RVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBB
UkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IKKyAqIENPTlRS
SUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBT
UEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElO
RywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09E
UyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJ
TkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBP
RiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRP
UlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5Z
IFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VE
IE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKworI2luY2x1ZGUgImNv
bmZpZy5oIgorI2luY2x1ZGUgIkIzVHlwZS5oIgorCisjaW5jbHVkZSA8d3RmL1ByaW50U3RyZWFt
Lmg+CisKK25hbWVzcGFjZSBXVEYgeworCit1c2luZyBuYW1lc3BhY2UgSlNDOjpCMzsKKwordm9p
ZCBwcmludEludGVybmFsKFByaW50U3RyZWFtJiBvdXQsIFR5cGUgdHlwZSkKK3sKKyAgICBzd2l0
Y2ggKHR5cGUpIHsKKyAgICBjYXNlIFZvaWQ6CisgICAgICAgIG91dC5wcmludCgiVm9pZCIpOwor
ICAgICAgICByZXR1cm47CisgICAgY2FzZSBJbnQzMjoKKyAgICAgICAgb3V0LnByaW50KCJJbnQz
MiIpOworICAgICAgICByZXR1cm47CisgICAgY2FzZSBJbnQ2NDoKKyAgICAgICAgb3V0LnByaW50
KCJJbnQ2NCIpOworICAgICAgICByZXR1cm47CisgICAgY2FzZSBEb3VibGU6CisgICAgICAgIG91
dC5wcmludCgiRG91YmxlIik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgUkVMRUFTRV9B
U1NFUlRfTk9UX1JFQUNIRUQoKTsKK30KKworfSAvLyBuYW1lc3BhY2UgV1RGCkluZGV4OiBTb3Vy
Y2UvSmF2YVNjcmlwdENvcmUvYjMvQjNUeXBlLmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL0phdmFT
Y3JpcHRDb3JlL2IzL0IzVHlwZS5oCShyZXZpc2lvbiAwKQorKysgU291cmNlL0phdmFTY3JpcHRD
b3JlL2IzL0IzVHlwZS5oCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsNjggQEAKKy8qCisgKiBD
b3B5cmlnaHQgKEMpIDIwMTUgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAq
IFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGgg
b3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQg
dGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRp
b25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAg
IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xh
aW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVj
ZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRp
b25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0
aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9u
LgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFTIElT
JycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywg
QlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFO
VEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElT
Q0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IKKyAqIENPTlRSSUJVVE9S
UyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFM
LAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVU
IE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBT
RVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJ
TlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFC
SUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAq
IChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBP
VVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRI
RSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKworI2lmbmRlZiBCM1R5cGVfaAor
I2RlZmluZSBCM1R5cGVfaAorCisjaW5jbHVkZSA8d3RmL1N0ZExpYkV4dHJhcy5oPgorCituYW1l
c3BhY2UgSlNDIHsgbmFtZXNwYWNlIEIzIHsKKworZW51bSBUeXBlIHsKKyAgICBWb2lkLAorICAg
IEludDMyLAorICAgIEludDY0LAorICAgIERvdWJsZQorfTsKKworaW5saW5lIGJvb2wgaXNJbnQo
VHlwZSB0eXBlKQoreworICAgIHJldHVybiB0eXBlID09IEludDMyIHx8IHR5cGUgPT0gSW50NjQ7
Cit9CisKK2lubGluZSBib29sIGlzRmxvYXQoVHlwZSB0eXBlKQoreworICAgIHJldHVybiB0eXBl
ID09IERvdWJsZTsKK30KKworaW5saW5lIFR5cGUgcG9pbnRlcigpIGNvbnN0Cit7CisgICAgaWYg
KHNpemVvZih2b2lkKikgPT0gNCkKKyAgICAgICAgcmV0dXJuIEludDMyOworICAgIHJldHVybiBJ
bnQ2NDsKK30KKworfSB9IC8vIG5hbWVzcGFjZSBKU0M6OkIzCisKK25hbWVzcGFjZSBXVEYgewor
CitjbGFzcyBQcmludFN0cmVhbTsKKwordm9pZCBwcmludEludGVybmFsKFByaW50U3RyZWFtJiwg
SlNDOjpCMzo6VHlwZSk7CisKK30gLy8gbmFtZXNwYWNlIFdURgorCisjZW5kaWYgLy8gQjNUeXBl
X2gKKwpJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzVXBzaWxvblZhbHVlLmNwcAo9
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNVcHNpbG9uVmFsdWUuY3Bw
CShyZXZpc2lvbiAwKQorKysgU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzVXBzaWxvblZhbHVl
LmNwcAkod29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDQxIEBACisvKgorICogQ29weXJpZ2h0IChD
KSAyMDE1IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1
dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQK
KyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dp
bmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3Vy
Y2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRo
aXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAy
LiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3Zl
IGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhl
IGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Ig
b3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBU
SElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkK
KyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElN
SVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFO
RCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJ
TiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxF
IEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1Q
TEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRF
RCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExP
U1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9O
KSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVU
SEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5H
IE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBV
U0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJ
VFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisKKyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRl
ICJCM1Vwc2lsb25WYWx1ZS5oIgorCituYW1lc3BhY2UgSlNDIHsgbmFtZXNwYWNlIEIzIHsKKwor
VXBzaWxvblZhbHVlOjp+VXBzaWxvblZhbHVlKCkKK3sKK30KKwordm9pZCBVcHNpbG9uVmFsdWU6
OmR1bXBNZXRhKFByaW50U3RyZWFtJiBvdXQpIGNvbnN0Cit7CisgICAgb3V0LnByaW50KCJeIiwg
bV9waGktPmluZGV4KCkpOworfQorCit9IH0gLy8gbmFtZXNwYWNlIEpTQzo6QjMKKwpJbmRleDog
U291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzVXBzaWxvblZhbHVlLmgKPT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0g
U291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzVXBzaWxvblZhbHVlLmgJKHJldmlzaW9uIDApCisr
KyBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNVcHNpbG9uVmFsdWUuaAkod29ya2luZyBjb3B5
KQpAQCAtMCwwICsxLDYwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE1IEFwcGxlIEluYy4g
QWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNv
dXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwg
YXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICog
YXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFp
biB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRp
b25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMg
aW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAg
bm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFp
bWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHBy
b3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBS
T1ZJREVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1Q
TElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJ
TVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBB
UlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBB
UFBMRSBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJ
TkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVO
VElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVN
RU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBP
UgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBB
TkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBT
VFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RI
RVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09G
VFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0Uu
IAorICovCisKKyNpZm5kZWYgQjNVcHNpbG9uVmFsdWVfaAorI2RlZmluZSBCM1Vwc2lsb25WYWx1
ZV9oCisKKyNpbmNsdWRlICJCM1ZhbHVlLmgiCisKK25hbWVzcGFjZSBKU0MgeyBuYW1lc3BhY2Ug
QjMgeworCitjbGFzcyBVcHNpbG9uVmFsdWUgOiBwdWJsaWMgVmFsdWUgeworcHVibGljOgorICAg
IHN0YXRpYyBib29sIGFjY2VwdHMoT3Bjb2RlIG9wY29kZSkgeyByZXR1cm4gb3Bjb2RlID09IFVw
c2lsb247IH0KKworICAgIH5VcHNpbG9uVmFsdWUoKTsKKworICAgIFZhbHVlKiBwaGkoKSBjb25z
dCB7IHJldHVybiBtX3BoaTsgfQorCitwcm90ZWN0ZWQ6CisgICAgdm9pZCBkdW1wTWV0YShQcmlu
dFN0cmVhbSYpIGNvbnN0IG92ZXJyaWRlOworCitwcml2YXRlOgorICAgIGZyaWVuZCBjbGFzcyBQ
cm9jZWR1cmU7CisgICAgCisgICAgVXBzaWxvblZhbHVlKHVuc2lnbmVkIGluZGV4LCBPcmlnaW4g
b3JpZ2luLCBWYWx1ZSogdmFsdWUsIFZhbHVlKiBwaGkpCisgICAgICAgIDogVmFsdWUoaW5kZXgs
IFBoaSwgVm9pZCwgb3JpZ2luLCB2YWx1ZSkKKyAgICAgICAgLCBtX3BoaShwaGkpCisgICAgewor
ICAgICAgICBBU1NFUlQodmFsdWUtPnR5cGUoKSA9PSBwaGktPnR5cGUoKSk7CisgICAgfQorCisg
ICAgVmFsdWUqIG1fcGhpOworfTsKKworfSB9IC8vIG5hbWVzcGFjZSBKU0M6OkIzCisKKyNlbmRp
ZiAvLyBCM1Vwc2lsb25WYWx1ZV9oCisKSW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9C
M1ZhbHVlLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNWYWx1
ZS5jcHAJKHJldmlzaW9uIDApCisrKyBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNWYWx1ZS5j
cHAJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSwxNjkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMp
IDIwMTUgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0
aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAor
ICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2lu
ZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJj
ZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhp
cyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIu
IFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUg
Y29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUg
Zm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBv
dGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRI
SVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQor
ICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1J
VEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5E
IEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElO
IE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUg
Rk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBM
QVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVE
IFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9T
UyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04p
IEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRI
RVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcg
TkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVT
RQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElU
WSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKworI2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUg
IkIzVmFsdWUuaCIKKworbmFtZXNwYWNlIEpTQyB7IG5hbWVzcGFjZSBCMyB7CisKK1ZhbHVlOjp+
VmFsdWUoKQoreworfQorCit2b2lkIFZhbHVlOjpyZXBsYWNlV2l0aElkZW50aXR5KFZhbHVlKiB2
YWx1ZSkKK3sKKyAgICAvLyBUaGlzIGlzIGEgYml0IGNyYXp5LiBJdCBkb2VzIGFuIGluLXBsYWNl
IHJlcGxhY2VtZW50IG9mIHdoYXRldmVyIFZhbHVlIHN1YmNsYXNzIHRoaXMgaXMgd2l0aAorICAg
IC8vIGEgcGxhaW4gSWRlbnRpdHkgVmFsdWUuIFdlIGZpcnN0IGNvbGxlY3QgYWxsIG9mIHRoZSBp
bmZvcm1hdGlvbiB3ZSBuZWVkLCB0aGVuIHdlIGRlc3RydWN0IHRoZQorICAgIC8vIHByZXZpb3Vz
IHZhbHVlIGluIHBsYWNlLCBhbmQgdGhlbiB3ZSBjb25zdHJ1Y3QgdGhlIElkZW50aXR5IFZhbHVl
IGluIHBsYWNlLgorCisgICAgdW5zaWduZWQgaW5kZXggPSBtX2luZGV4OworICAgIFR5cGUgdHlw
ZSA9IG1fdHlwZTsKKyAgICBPcmlnaW4gb3JpZ2luID0gbV9vcmlnaW47CisgICAgQmFzaWNCbG9j
ayogb3duZXIgPSB0aGlzLT5vd25lcjsKKyAgICBWYWx1ZSogcmVwbGFjZW1lbnQgPSB0aGlzLT5y
ZXBsYWNlbWVudDsKKyAgICB2b2lkKiBtaXNjID0gdGhpcy0+bWlzYzsKKworICAgIFJFTEVBU0Vf
QVNTRVJUKHR5cGUgPT0gdmFsdWUtPnR5cGUoKSk7CisKKyAgICB0aGlzLT5WYWx1ZTo6flZhbHVl
KCk7CisKKyAgICBuZXcgKHRoaXMpIChpbmRleCwgSWRlbnRpZnksIHR5cGUsIG9yaWdpbiwgdmFs
dWUpOworCisgICAgdGhpcy0+b3duZXIgPSBvd25lcjsKKyAgICB0aGlzLT5yZXBsYWNlbWVudCA9
IHJlcGxhY2VtZW50OworICAgIHRoaXMtPm1pc2MgPSBtaXNjOworfQorCit2b2lkIFZhbHVlOjpk
dW1wKFByaW50U3RyZWFtJiBvdXQpIGNvbnN0Cit7CisgICAgb3V0LnByaW50KGR1bXBQcmVmaXgs
IG1faW5kZXgpOworfQorCit2b2lkIFZhbHVlOjpkZWVwRHVtcChQcmludFN0cmVhbSYgb3V0KSBj
b25zdAoreworICAgIG91dC5wcmludChtX3R5cGUsICIgIiwgKnRoaXMsICIgPSAiLCBtX29wY29k
ZSk7CisKKyAgICBvdXQucHJpbnQoIigiKTsKKyAgICBDb21tYVByaW50ZXIgY29tbWE7CisgICAg
Zm9yIChWYWx1ZSogY2hpbGQgOiBjaGlsZHJlbigpKQorICAgICAgICBvdXQucHJpbnQoY29tbWEs
IHBvaW50ZXJEdW1wKGNoaWxkKSk7CisKKyAgICBTdHJpbmdQcmludFN0cmVhbSBzdHJpbmdPdXQ7
CisgICAgZHVtcE1ldGEoc3RyaW5nT3V0KTsKKyAgICBDU3RyaW5nIHN0cmluZyA9IHN0cmluZ091
dC50b0NTdHJpbmcoKTsKKyAgICBpZiAoc3RyaW5nLmxlbmd0aCgpKQorICAgICAgICBvdXQucHJp
bnQoY29tbWEsIHN0cmluZyk7CisKKyAgICBvdXQucHJpbnQoIikiKTsKK30KKworYm9vbCBWYWx1
ZTo6aGFzSW50MzIoKSBjb25zdAoreworICAgIHJldHVybiBmYWxzZTsKK30KKworaW50MzJfdCBW
YWx1ZTo6YXNJbnQzMigpIGNvbnN0Cit7CisgICAgUkVMRUFTRV9BU1NFUlRfTk9UX1JFQUNIRUQo
KTsKKyAgICByZXR1cm4gMDsKK30KKworYm9vbCBWYWx1ZTo6aGFzSW50NjQoKSBjb25zdAorewor
ICAgIHJldHVybiBmYWxzZTsKK30KKworaW50NjRfdCBWYWx1ZTo6YXNJbnQ2NCgpIGNvbnN0Cit7
CisgICAgUkVMRUFTRV9BU1NFUlRfTk9UX1JFQUNIRUQoKTsKKyAgICByZXR1cm4gMDsKK30KKwor
Ym9vbCBWYWx1ZTo6aGFzRG91YmxlKCkgY29uc3QKK3sKKyAgICByZXR1cm4gZmFsc2U7Cit9CisK
K2RvdWJsZSBWYWx1ZTo6YXNEb3VibGUoKSBjb25zdAoreworICAgIFJFTEVBU0VfQVNTRVJUX05P
VF9SRUFDSEVEKCk7CisgICAgcmV0dXJuIDA7Cit9CisKK3ZvaWQgVmFsdWU6OmR1bXBNZXRhKFBy
aW50U3RyZWFtJikgY29uc3QKK3sKK30KKworVHlwZSBWYWx1ZTo6dHlwZUZvcihPcGNvZGUgb3Bj
b2RlLCBWYWx1ZSogZmlyc3RDaGlsZCkKK3sKKyAgICBzd2l0Y2ggKG9wY29kZSkgeworICAgIGNh
c2UgSWRlbnRpdHk6CisgICAgY2FzZSBBZGQ6CisgICAgY2FzZSBTdWI6CisgICAgY2FzZSBNdWw6
CisgICAgY2FzZSBEaXY6CisgICAgY2FzZSBDaGlsbERpdjoKKyAgICBjYXNlIE1vZDoKKyAgICBj
YXNlIEJpdEFuZDoKKyAgICBjYXNlIEJpdE9yOgorICAgIGNhc2UgQml0WG9yOgorICAgIGNhc2Ug
U2hsOgorICAgIGNhc2UgU1NocjoKKyAgICBjYXNlIFpTaHI6CisgICAgY2FzZSBDaGVja0FkZDoK
KyAgICBjYXNlIENoZWNrU3ViOgorICAgIGNhc2UgQ2hlY2tNdWw6CisgICAgICAgIHJldHVybiBm
aXJzdENoaWxkLT50eXBlKCk7CisgICAgY2FzZSBGcmFtZVBvaW50ZXI6CisgICAgICAgIHJldHVy
biBwb2ludGVyKCk7CisgICAgY2FzZSBTRXh0ODoKKyAgICBjYXNlIFNFeHQxNjoKKyAgICBjYXNl
IERUb0kzMjoKKyAgICBjYXNlIEVxdWFsOgorICAgIGNhc2UgTm90RXF1YWw6CisgICAgY2FzZSBM
ZXNzVGhhbjoKKyAgICBjYXNlIEdyZWF0ZXJUaGFuOgorICAgIGNhc2UgTGVzc0VxdWFsOgorICAg
IGNhc2UgR3JlYXRlckVxdWFsOgorICAgIGNhc2UgQWJvdmU6CisgICAgY2FzZSBCZWxvdzoKKyAg
ICBjYXNlIEFib3ZlRXF1YWw6CisgICAgY2FzZSBCZWxvd0VxdWFsOgorICAgICAgICByZXR1cm4g
SW50MzI7CisgICAgY2FzZSBTRXh0MzI6CisgICAgY2FzZSBaRXh0MzI6CisgICAgICAgIHJldHVy
biBJbnQ2NDsKKyAgICBjYXNlIEZSb3VuZDoKKyAgICBjYXNlIElUb0Q6CisgICAgICAgIHJldHVy
biBEb3VibGU7CisgICAgY2FzZSBOb3A6CisgICAgICAgIHJldHVybiBWb2lkOworICAgIGRlZmF1
bHQ6CisgICAgICAgIFJFTEVBU0VfQVNTRVJUX05PVF9SRUFDSEVEKCk7CisgICAgfQorfQorCit9
IH0gLy8gbmFtZXNwYWNlIEpTQzo6QjMKKwpJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL2Iz
L0IzVmFsdWUuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNWYWx1
ZS5oCShyZXZpc2lvbiAwKQorKysgU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzVmFsdWUuaAko
d29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDE5NiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAx
NSBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24g
YW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBt
b2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNv
bmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNv
ZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxp
c3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVk
aXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5
cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xs
b3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVy
IG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBT
T0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBF
WFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQg
VE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklU
TkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8g
RVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1Ig
QU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlks
IE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8s
CisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9G
IFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9X
RVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJ
TiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdM
SUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisg
KiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9G
IFNVQ0ggREFNQUdFLiAKKyAqLworCisjaWZuZGVmIEIzVmFsdWVfaAorI2RlZmluZSBCM1ZhbHVl
X2gKKworI2luY2x1ZGUgIkIzT3JpZ2luLmgiCisjaW5jbHVkZSAiQjNUeXBlLmgiCisjaW5jbHVk
ZSA8d3RmL0Zhc3RNYWxsb2MuaD4KKyNpbmNsdWRlIDx3dGYvTm9uY29weWFibGUuaD4KKworbmFt
ZXNwYWNlIEpTQyB7IG5hbWVzcGFjZSBCMyB7CisKK2NsYXNzIFZhbHVlIHsKKyAgICBXVEZfTUFL
RV9OT05DT1BZQUJMRShWYWx1ZSk7CisgICAgV1RGX01BS0VfRkFTVF9BTExPQ0FURUQ7CitwdWJs
aWM6CisgICAgdHlwZWRlZiBWZWN0b3I8VmFsdWUqLCAzPiBBZGphY2VuY3lMaXN0OworCisgICAg
c3RhdGljIGNvbnN0IGNoYXIqIGR1bXBQcmVmaXggPSAiQCI7CisKKyAgICBzdGF0aWMgYm9vbCBh
Y2NlcHRzKE9wY29kZSkgeyByZXR1cm4gdHJ1ZTsgfQorCisgICAgdmlydHVhbCB+VmFsdWUoKTsK
KworICAgIHVuc2lnbmVkIGluZGV4KCkgY29uc3QgeyByZXR1cm4gbV9pbmRleDsgfQorICAgIAor
ICAgIC8vIE5vdGUgdGhhdCB0aGUgb3Bjb2RlIGlzIGltbXV0YWJsZSwgZXhjZXB0IGZvciByZXBs
YWNpbmcgdmFsdWVzIHdpdGggaWRlbnRpdHkuCisgICAgT3Bjb2RlIG9wY29kZSgpIGNvbnN0IHsg
cmV0dXJuIG1fb3Bjb2RlOyB9CisKKyAgICBPcmlnaW4gb3JpZ2luKCkgY29uc3QgeyByZXR1cm4g
bV9vcmlnaW47IH0KKyAgICAKKyAgICBWYWx1ZSomIGNoaWxkKHVuc2lnbmVkIGluZGV4KSB7IHJl
dHVybiBtX2NoaWxkcmVuW2luZGV4XTsgfQorICAgIFZhbHVlKiBjaGlsZCh1bnNpZ25lZCBpbmRl
eCkgY29uc3QgeyByZXR1cm4gbV9jaGlsZHJlbltpbmRleF07IH0KKworICAgIC8vIFRoaXMgY29t
cHV0ZXMgdGhlIHR5cGUgdXNpbmcgdGhlIG9wY29kZS4KKyAgICBUeXBlIHR5cGUoKSBjb25zdCB7
IHJldHVybiBtX3R5cGU7IH0KKworICAgIEFkamFjZW5jeUxpc3QmIGNoaWxkcmVuKCkgeyByZXR1
cm4gbV9jaGlsZHJlbjsgfSAKKyAgICBjb25zdCBBZGphY2VuY3lMaXN0JiBjaGlsZHJlbigpIGNv
bnN0IHsgcmV0dXJuIG1fY2hpbGRyZW47IH0KKworICAgIHZvaWQgcmVwbGFjZVdpdGhJZGVudGl0
eShWYWx1ZSopOworICAgIHZvaWQgcmVwbGFjZVdpdGhOb3AoKTsKKworICAgIHZvaWQgZHVtcChQ
cmludFN0cmVhbSYpIGNvbnN0OworICAgIHZvaWQgZGVlcER1bXAoUHJpbnRTdHJlYW0mKSBjb25z
dDsKKworICAgIC8vIFRoaXMgaXMgaG93IHlvdSBjYXN0IFZhbHVlcy4gRm9yIGV4YW1wbGUsIGlm
IHlvdSB3YW50IHRvIGRvIHNvbWV0aGluZyBwcm92aWRlZCB0aGF0IHdlIGhhdmUgYQorICAgIC8v
IEFyZ3VtZW50UmVnVmFsdWUsIHlvdSBjYW4gZG86CisgICAgLy8KKyAgICAvLyBpZiAoQXJndW1l
bnRSZWdWYWx1ZSogYXJndW1lbnRSZWcgPSB2YWx1ZS0+YXM8QXJndW1lbnRSZWdWYWx1ZT4oKSkg
eworICAgIC8vICAgICB0aGluZ3MKKyAgICAvLyB9CisgICAgLy8KKyAgICAvLyBUaGlzIHdpbGwg
cmV0dXJuIG51bGwgaWYgdGhpcyBvcGNvZGUoKSAhPSBBcmd1bWVudFJlZy4gVGhpcyB3b3JrcyBi
ZWNhdXNlIHRoaXMgcmV0dXJucyBudWxscHRyCisgICAgLy8gaWYgVDo6YWNjZXB0cyhvcGNvZGUo
KSkgcmV0dXJucyBmYWxzZS4KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorICAgIFQqIGFzKCk7
CisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4KKyAgICBjb25zdCBUKiBhcygpIGNvbnN0OworICAg
IAorICAgIGJvb2wgaGFzSW50MzIoKSBjb25zdDsKKyAgICBpbnQzMl90IGFzSW50MzIoKSBjb25z
dDsKKyAgICAKKyAgICBib29sIGhhc0ludDY0KCkgY29uc3Q7CisgICAgaW50NjRfdCBhc0ludDY0
KCkgY29uc3Q7CisKKyAgICBib29sIGhhc0ludCgpIGNvbnN0OworICAgIGludDY0X3QgYXNJbnQo
KSBjb25zdDsKKyAgICBib29sIGlzSW50KGludDY0X3QgdmFsdWUpIGNvbnN0OworCisgICAgYm9v
bCBoYXNEb3VibGUoKSBjb25zdDsKKyAgICBkb3VibGUgYXNEb3VibGUoKSBjb25zdDsKKworICAg
IFN0YWNrbWFwKiBzdGFja21hcCgpOworCitwcm90ZWN0ZWQ6CisgICAgdmlydHVhbCB2b2lkIGR1
bXBNZXRhKFByaW50U3RyZWFtJikgY29uc3Q7CisgICAgCitwcml2YXRlOgorICAgIGZyaWVuZCBj
bGFzcyBQcm9jZWR1cmU7CisgICAgCisgICAgLy8gSW5zdGFudGlhdGUgdmFsdWVzIHZpYSBQcm9j
ZWR1cmUuCisgICAgLy8gVGhpcyBmb3JtIHJlcXVpcmVzIHNwZWNpZnlpbmcgdGhlIHR5cGUgZXhw
bGljaXRseToKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZS4uLiBBcmd1bWVudHM+CisgICAgZXhwbGlj
aXQgVmFsdWUodW5zaWduZWQgaW5kZXgsIE9wY29kZSBvcGNvZGUsIFR5cGUgdHlwZSwgT3JpZ2lu
IG9yaWdpbiwgVmFsdWUqIGZpcnN0Q2hpbGQsIEFyZ3VtZW50cy4uLiBhcmd1bWVudHMpCisgICAg
ICAgIDogbV9pbmRleChpbmRleCkKKyAgICAgICAgLCBtX29wY29kZShvcGNvZGUpCisgICAgICAg
ICwgbV90eXBlKHR5cGUpCisgICAgICAgICwgbV9vcmlnaW4ob3JpZ2luKQorICAgICAgICAsIG1f
Y2hpbGRyZW57IGZpcnN0Q2hpbGQsIGFyZ3VtZW50cy4uLiB9CisgICAgeworICAgIH0KKyAgICAv
LyBUaGlzIGZvcm0gaXMgZm9yIHNwZWNpZnlpbmcgdGhlIHR5cGUgZXhwbGljaXRseSB3aGVuIHRo
ZSBvcGNvZGUgaGFzIG5vIGNoaWxkcmVuOgorICAgIGV4cGxpY2l0IFZhbHVlKHVuc2lnbmVkIGlu
ZGV4LCBPcGNvZGUgb3Bjb2RlLCBUeXBlIHR5cGUsIE9yaWdpbiBvcmlnaW4pCisgICAgICAgIDog
bV9pbmRleChpbmRleCkKKyAgICAgICAgLCBtX29wY29kZShvcGNvZGUpCisgICAgICAgICwgbV90
eXBlKHR5cGUpCisgICAgICAgICwgbV9vcmlnaW4ob3JpZ2luKQorICAgIHsKKyAgICB9CisgICAg
Ly8gVGhpcyBmb3JtIGlzIGZvciB0aG9zZSBvcGNvZGVzIHRoYXQgY2FuIGluZmVyIHRoZWlyIHR5
cGUgZnJvbSB0aGUgb3Bjb2RlIGFuZCBmaXJzdCBjaGlsZDoKKyAgICB0ZW1wbGF0ZTx0eXBlbmFt
ZS4uLiBBcmd1bWVudHM+CisgICAgZXhwbGljaXQgVmFsdWUodW5zaWduZWQgaW5kZXgsIE9wY29k
ZSBvcGNvZGUsIE9yaWdpbiBvcmlnaW4sIFZhbHVlKiBmaXJzdENoaWxkLCBBcmd1bWVudHMuLi4g
YXJndW1lbnRzKQorICAgICAgICA6IG1faW5kZXgoaW5kZXgpCisgICAgICAgICwgbV9vcGNvZGUo
b3Bjb2RlKQorICAgICAgICAsIG1fdHlwZSh0eXBlRm9yKG9wY29kZSwgZmlyc3RDaGlsZCkpCisg
ICAgICAgICwgbV9vcmlnaW4ob3JpZ2luKQorICAgICAgICAsIG1fY2hpbGRyZW57IGZpcnN0Q2hp
bGQsIGFyZ3VtZW50cy4uLiB9CisgICAgeworICAgIH0KKyAgICAvLyBUaGlzIGZvcm0gaXMgZm9y
IHRob3NlIG9wY29kZXMgdGhhdCBjYW4gaW5mZXIgdGhlaXIgdHlwZSBmcm9tIHRoZSBvcGNvZGUg
YWxvbmUsIGFuZCB0aGF0IGRvbid0CisgICAgLy8gdGFrZSBhbnkgYXJndW1lbnRzOgorICAgIGV4
cGxpY2l0IFZhbHVlKHVuc2lnbmVkIGluZGV4LCBPcGNvZGUgb3Bjb2RlLCBPcmlnaW4gb3JpZ2lu
KQorICAgICAgICA6IG1faW5kZXgoaW5kZXgpCisgICAgICAgICwgbV9vcGNvZGUob3Bjb2RlKQor
ICAgICAgICAsIG1fdHlwZSh0eXBlRm9yKG9wY29kZSwgbnVsbHB0cikpCisgICAgICAgICwgbV9v
cmlnaW4ob3JpZ2luKQorICAgIHsKKyAgICB9CisgICAgLy8gVXNlIHRoaXMgZm9ybSBmb3IgdmFy
YXJncy4KKyAgICBleHBpY2l0IFZhbHVlKHVuc2lnbmVkIGluZGV4LCBPcGNvZGUgb3Bjb2RlLCBU
eXBlIHR5cGUsIE9yaWdpbiBvcmlnaW4sIGNvbnN0IEFkamFjZW5jeUxpc3QmIGNoaWxkcmVuKQor
ICAgICAgICA6IG1faW5kZXgoaW5kZXgpCisgICAgICAgICwgbV9vcGNvZGUob3Bjb2RlKQorICAg
ICAgICAsIG1fdHlwZSh0eXBlKQorICAgICAgICAsIG1fb3JpZ2luKG9yaWdpbikKKyAgICAgICAg
LCBtX2NoaWxkcmVuKGNoaWxkcmVuKQorICAgIHsKKyAgICB9CisKKyAgICBzdGF0aWMgVHlwZSB0
eXBlRm9yKE9wY29kZSwgVmFsdWUqIGZpcnN0Q2hpbGQpOworCisgICAgLy8gVGhpcyBncm91cCBv
ZiBmaWVsZHMgaXMgYXJyYW5nZWQgdG8gZml0IGluIDY0IGJpdHMuCisgICAgdW5zaWduZWQgbV9p
bmRleDsKKyAgICBPcGNvZGUgbV9vcGNvZGU7CisgICAgVHlwZSBtX3R5cGU7CisgICAgCisgICAg
T3JpZ2luIG1fb3JpZ2luOworICAgIEFkamFjZW5jeUxpc3QgbV9jaGlsZHJlbjsKKworcHVibGlj
OgorICAgIEJhc2ljQmxvY2sqIG93bmVyIHsgbnVsbHB0ciB9OyAvLyBjb21wdXRlZCBsYXppbHku
CisgICAgVmFsdWUqIHJlcGxhY2VtZW50IHsgbnVsbHB0ciB9OyAvLyB1c2VkIGZvciBhbmFseXNl
cyBhbmQgdHJhbnNmb3JtYXRpb25zLgorICAgIHZvaWQqIG1pc2MgeyBudWxscHRyIH07Cit9Owor
CitjbGFzcyBEZWVwVmFsdWVEdW1wIHsKK3B1YmxpYzoKKyAgICBEZWVwVmFsdWVEdW1wKFZhbHVl
KiB2YWx1ZSkKKyAgICAgICAgOiBtX3ZhbHVlKHZhbHVlKQorICAgIHsKKyAgICB9CisKKyAgICB2
b2lkIGR1bXAoUHJpbnRTdHJlYW0mIG91dCkgY29uc3QKKyAgICB7CisgICAgICAgIGlmIChtX3Zh
bHVlKQorICAgICAgICAgICAgbV92YWx1ZS0+ZGVlcER1bXAob3V0KTsKKyAgICAgICAgZWxzZQor
ICAgICAgICAgICAgb3V0LnByaW50KCI8bnVsbD4iKTsKKyAgICB9CisKK3ByaXZhdGU6CisgICAg
VmFsdWUqIG1fdmFsdWU7Cit9OworCitEZWVwVmFsdWVEdW1wIGRlZXBEdW1wKFZhbHVlKiB2YWx1
ZSkKK3sKKyAgICByZXR1cm4gRGVlcFZhbHVlRHVtcCh2YWx1ZSk7Cit9CisKK30gfSAvLyBuYW1l
c3BhY2UgSlNDOjpCMworCisjZW5kaWYgLy8gQjNWYWx1ZV9oCisKSW5kZXg6IFNvdXJjZS9KYXZh
U2NyaXB0Q29yZS9iMy9CM1ZhbHVlSW5saW5lcy5oCj09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZh
U2NyaXB0Q29yZS9iMy9CM1ZhbHVlSW5saW5lcy5oCShyZXZpc2lvbiAwKQorKysgU291cmNlL0ph
dmFTY3JpcHRDb3JlL2IzL0IzVmFsdWVJbmxpbmVzLmgJKHdvcmtpbmcgY29weSkKQEAgLTAsMCAr
MSwxMDkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTUgQXBwbGUgSW5jLiBBbGwgcmlnaHRz
IHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBi
aW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0
dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0Ogor
ICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92
ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRo
ZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkg
Zm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRo
aXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhl
CisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0
aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkg
QVBQTEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJB
TlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FS
UkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgor
ICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4g
T1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJ
TkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFH
RVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VC
U1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9G
SVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkg
VEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFC
SUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFS
SVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZF
TiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKwor
I2lmbmRlZiBCM1ZhbHVlSW5saW5lc19oCisjZGVmaW5lIEIzVmFsdWVJbmxpbmVzX2gKKworI2lu
Y2x1ZGUgIkIzQ2hlY2tWYWx1ZS5oIgorI2luY2x1ZGUgIkIzQ29uc3QzMlZhbHVlLmgiCisjaW5j
bHVkZSAiQjNDb25zdDY0VmFsdWUuaCIKKyNpbmNsdWRlICJCM0NvbnN0RG91YmxlVmFsdWUuaCIK
KyNpbmNsdWRlICJCM1BhdGNocG9pbnRWYWx1ZS5oIgorI2luY2x1ZGUgIkIzVmFsdWUuaCIKKwor
bmFtZXNwYWNlIEpTQyB7IG5hbWVzcGFjZSBCMyB7CisKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+CitU
KiBWYWx1ZTo6YXMoKQoreworICAgIGlmIChUOjphY2NlcHRzKG9wY29kZSgpKSkKKyAgICAgICAg
cmV0dXJuIHN0YXRpY19jYXN0PFQqPih0aGlzKTsKKyAgICByZXR1cm4gbnVsbHB0cjsKK30KKwor
dGVtcGxhdGU+dHlwZW5hbWUgVD4KK2NvbnN0IFQqIFZhbHVlOjphcygpIGNvbnN0Cit7CisgICAg
cmV0dXJuIGNvbnN0X2Nhc3Q8VmFsdWUqPih0aGlzKS0+YXM8VD4oKTsKK30KKworYm9vbCBWYWx1
ZTo6aGFzSW50MzIoKSBjb25zdAoreworICAgIHJldHVybiAhIWFzPENvbnN0MzJWYWx1ZT4oKTsK
K30KKworaW50MzJfdCBWYWx1ZTo6YXNJbnQzMigpIGNvbnN0Cit7CisgICAgcmV0dXJuIGFzPENv
bnN0MzJWYWx1ZT4oKS0+dmFsdWUoKTsKK30KKworYm9vbCBWYWx1ZTo6aGFzSW50NjQoKSBjb25z
dAoreworICAgIHJldHVybiAhIWFzPENvbnN0NjRWYWx1ZT4oKTsKK30KKworaW50NjRfdCBWYWx1
ZTo6YXNJbnQ2NCgpIGNvbnN0Cit7CisgICAgcmV0dXJuIGFzPENvbnN0NjRWYWx1ZT4oKS0+dmFs
dWUoKTsKK30KKworYm9vbCBWYWx1ZTo6aGFzSW50KCkgY29uc3QKK3sKKyAgICByZXR1cm4gaGFz
SW50MzIoKSB8fCBoYXNJbnQ2NCgpOworfQorCitpbnQ2NF90IFZhbHVlOjphc0ludCgpIGNvbnN0
Cit7CisgICAgcmV0dXJuIGhhc0ludDMyKCkgPyBhc0ludDMyKCkgOiBhc0ludDY0KCk7Cit9CisK
K2Jvb2wgVmFsdWU6OmlzSW50KGludDY0X3QgdmFsdWUpIGNvbnN0Cit7CisgICAgcmV0dXJuIGhh
c0ludCgpICYmIGFzSW50KCkgPT0gdmFsdWU7Cit9CisKK2Jvb2wgVmFsdWU6Omhhc0RvdWJsZSgp
IGNvbnN0Cit7CisgICAgcmV0dXJuICEhYXM8Q29uc3REb3VibGVWYWx1ZT4oKTsKK30KKworZG91
YmxlIFZhbHVlOjphc0RvdWJsZSgpIGNvbnN0Cit7CisgICAgcmV0dXJuIGFzPENvbnN0RG91Ymxl
VmFsdWU+KCktPnZhbHVlKCk7Cit9CisKK1N0YWNrbWFwKiBWYWx1ZTo6c3RhY2ttYXAoKQorewor
ICAgIGlmIChDaGVja1ZhbHVlKiBjaGVjayA9IGFzPENoZWNrVmFsdWU+KCkpCisgICAgICAgIHJl
dHVybiAmY2hlY2stPnN0YWNrbWFwOworICAgIGlmIChQYXRjaHBvaW50VmFsdWUqIHBhdGNocG9p
bnQgPSBhczxQYXRjaHBvaW50VmFsdWU+KCkpCisgICAgICAgIHJldHVybiAmcGF0Y2hwb2ludC0+
c3RhY2ttYXA7CisgICAgcmV0dXJuIG51bGxwdHI7Cit9CisKK30gfSAvLyBuYW1lc3BhY2UgSlND
OjpCMworCisjZW5kaWYgLy8gQjNWYWx1ZUlubGluZXNfaAorCkluZGV4OiBTb3VyY2UvSmF2YVNj
cmlwdENvcmUvYjMvQjNWYWx1ZVJlcC5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL0phdmFTY3Jp
cHRDb3JlL2IzL0IzVmFsdWVSZXAuY3BwCShyZXZpc2lvbiAwKQorKysgU291cmNlL0phdmFTY3Jp
cHRDb3JlL2IzL0IzVmFsdWVSZXAuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsODYgQEAK
Ky8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTUgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVk
LgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9y
bXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3Zp
ZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVk
aXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmln
aHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dp
bmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0
IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBv
ZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBk
b2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlz
dHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5D
LiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElO
Q0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBP
RiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9T
RSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IKKyAqIENP
TlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFM
LCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xV
RElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBH
T09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBC
VVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisg
KiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9S
IFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4g
QU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJ
U0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKworI2luY2x1ZGUg
ImNvbmZpZy5oIgorI2luY2x1ZGUgIkIzVmFsdWVSZXAuaCIKKworbmFtZXNwYWNlIEpTQyB7IG5h
bWVzcGFjZSBCMyB7CisKK3ZvaWQgVmFsdWVSZXA6OmR1bXAoUHJpbnRTdHJlYW0mIG91dCkgY29u
c3QKK3sKKyAgICBvdXQucHJpbnQobV9raW5kKTsKKyAgICBzd2l0Y2ggKG1fa2luZCkgeworICAg
IGNhc2UgTm9uZToKKyAgICBjYXNlIFNvbWVSZWdpc3RlcjoKKyAgICAgICAgcmV0dXJuOworICAg
IGNhc2UgUmVnaXN0ZXI6CisgICAgICAgIG91dC5wcmludCgiKCIsIHJlZygpLCAiKSIpOworICAg
ICAgICByZXR1cm47CisgICAgY2FzZSBTdGFjazoKKyAgICAgICAgb3V0LnByaW50KCIoIiwgb2Zm
c2V0RnJvbUZQKCksICIpIik7CisgICAgICAgIHJldHVybjsKKyAgICBjYXNlIFN0YWNrQXJndW1l
bnQ6CisgICAgICAgIG91dC5wcmludCgiKCIsIG9mZnNldEZyb21TUCgpLCAiKSIpOworICAgICAg
ICByZXR1cm47CisgICAgY2FzZSBDb25zdGFudDoKKyAgICAgICAgb3V0LnByaW50KCIoIiwgdmFs
dWUoKSwgIikiKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBSRUxFQVNFX0FTU0VSVF9O
T1RfUkVBQ0hFRCgpOworfQorCit9IH0gLy8gbmFtZXNwYWNlIEpTQzo6QjMKKworbmFtZXNwYWNl
IFdURiB7CisKK3VzaW5nIG5hbWVzcGFjZSBKU0M6OkIzOworCit2b2lkIHByaW50SW50ZXJuYWwo
UHJpbnRTdHJlYW0mIG91dCwgVmFsdWVSZXA6OktpbmQga2luZCkKK3sKKyAgICBzd2l0Y2ggKGtp
bmQpIHsKKyAgICBjYXNlIFZhbHVlUmVwOjpBbnk6CisgICAgICAgIG91dC5wcmludCgiQW55Iik7
CisgICAgICAgIHJldHVybjsKKyAgICBjYXNlIFZhbHVlUmVwOjpTb21lUmVnaXN0ZXI6CisgICAg
ICAgIG91dC5wcmludCgiU29tZVJlZ2lzdGVyIik7CisgICAgICAgIHJldHVybjsKKyAgICBjYXNl
IFZhbHVlUmVwOjpSZWdpc3RlcjoKKyAgICAgICAgb3V0LnByaW50KCJSZWdpc3RlciIpOworICAg
ICAgICByZXR1cm47CisgICAgY2FzZSBWYWx1ZVJlcDo6U3RhY2s6CisgICAgICAgIG91dC5wcmlu
dCgiU3RhY2siKTsKKyAgICAgICAgcmV0dXJuOworICAgIGNhc2UgVmFsdWVSZXA6OlN0YWNrQXJn
dW1lbnQ6CisgICAgICAgIG91dC5wcmludCgiU3RhY2tBcmd1bWVudCIpOworICAgICAgICByZXR1
cm47CisgICAgY2FzZSBWYWx1ZVJlcDo6Q29uc3RhbnQ6CisgICAgICAgIG91dC5wcmludCgiQ29u
c3RhbnQiKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBSRUxFQVNFX0FTU0VSVF9OT1Rf
UkVBQ0hFRCgpOworfQorCit9IC8vIG5hbWVzcGFjZSBXVEYKKwpJbmRleDogU291cmNlL0phdmFT
Y3JpcHRDb3JlL2IzL0IzVmFsdWVSZXAuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlw
dENvcmUvYjMvQjNWYWx1ZVJlcC5oCShyZXZpc2lvbiAwKQorKysgU291cmNlL0phdmFTY3JpcHRD
b3JlL2IzL0IzVmFsdWVSZXAuaAkod29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDE1NiBAQAorLyoK
KyAqIENvcHlyaWdodCAoQykgMjAxNSBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisg
KgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywg
d2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQg
dGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3Ry
aWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAor
ICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBk
aXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVw
cm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNv
bmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3Vt
ZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmli
dXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIGBg
QVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVE
SU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1F
UkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFS
RSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUgorICogQ09OVFJJ
QlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQ
RUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5H
LCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RT
IE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lO
RVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9G
IExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9S
VAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkg
V0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQg
T0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLiAKKyAqLworCisjaWZuZGVmIEIzVmFs
dWVSZXBfaAorI2RlZmluZSBCM1ZhbHVlUmVwX2gKKworI2luY2x1ZGUgIlJlZy5oIgorI2luY2x1
ZGUgPHd0Zi9QcmludFN0cmVhbS5oPgorCituYW1lc3BhY2UgSlNDIHsgbmFtZXNwYWNlIEIzIHsK
KworLy8gV2UgdXNlIHRoaXMgY2xhc3MgdG8gZGVzY3JpYmUgdmFsdWUgcmVwcmVzZW50YXRpb25z
IGF0IHN0YWNrbWFwcy4gSXQncyB1c2VkIGJvdGggdG8gZm9yY2UgYQorLy8gcmVwcmVzZW50YXRp
b24gYW5kIHRvIGdldCB0aGUgcmVwcmVzZW50YXRpb24uIFdoZW4gdGhlIEIzIGNsaWVudCBmb3Jj
ZXMgYSByZXByZXNlbnRhdGlvbiwgd2Ugc2F5CisvLyB0aGF0IGl0J3MgYW4gaW5wdXQuIFdoZW4g
QjMgdGVsbHMgdGhlIGNsaWVudCB3aGF0IHJlcHJlc2VudGF0aW9uIGl0IHBpY2tlZCwgd2Ugc2F5
IHRoYXQgaXQncyBhbgorLy8gb3V0cHV0LgorCitjbGFzcyBWYWx1ZVJlcCB7CitwdWJsaWM6Cisg
ICAgZW51bSBLaW5kIHsKKyAgICAgICAgLy8gQXMgYW4gaW5wdXQgcmVwcmVzZW50YXRpb24sIHRo
aXMgbWVhbnMgdGhhdCBCMyBjYW4gcGljayBhbnkgcmVwcmVzZW50YXRpb24uCisgICAgICAgIEFu
eSwKKworICAgICAgICAvLyBBcyBhbiBpbnB1dCByZXByZXNlbnRhdGlvbiwgdGhpcyBtZWFucyB0
aGF0IEIzIHNob3VsZCBwaWNrIHNvbWUgcmVnaXN0ZXIsIHByb3ZpZGVkIHRoYXQKKyAgICAgICAg
Ly8gaXQncyBub3QgYWxzbyBhIHJlZ2lzdGVyIHRoYXQgd2FzIGNsb2JiZXJlZC4KKyAgICAgICAg
U29tZVJlZ2lzdGVyLAorCisgICAgICAgIC8vIEFzIGFuIGlucHV0IHJlcHJlc2VudGF0aW9uLCB0
aGlzIGZvcmNlcyBhIHBhcnRpY3VsYXIgcmVnaXN0ZXIuIEFzIGFuIG91dHB1dAorICAgICAgICAv
LyByZXByZXNlbnRhdGlvbiwgdGhpcyB0ZWxscyB1cyB3aGF0IHJlZ2lzdGVyIEIzIHBpY2tlZC4K
KyAgICAgICAgUmVnaXN0ZXIsCisKKyAgICAgICAgLy8gQXMgYW4gb3V0cHV0IHJlcHJlc2VudGF0
aW9uLCB0aGlzIHRlbGxzIHVzIHdoYXQgc3RhY2sgc2xvdCBCMyBwaWNrZWQuIEl0J3Mgbm90IGEg
dmFsaWQKKyAgICAgICAgLy8gaW5wdXQgcmVwcmVzZW50YXRpb24uCisgICAgICAgIFN0YWNrLAor
CisgICAgICAgIC8vIEFzIGFuIGlucHV0IHJlcHJlc2VudGF0aW9uLCB0aGlzIGZvcmNlcyB0aGUg
dmFsdWUgdG8gZW5kIHVwIGluIHRoZSBhcmd1bWVudCBhcmVhIGF0IHNvbWUKKyAgICAgICAgLy8g
b2Zmc2V0LgorICAgICAgICBTdGFja0FyZ3VtZW50LAorCisgICAgICAgIC8vIEFzIGFuIG91dHB1
dCByZXByZXNlbnRhdGlvbiwgdGhpcyB0ZWxscyB1cyB0aGF0IEIzIGNvbnN0YW50LWZvbGRlZCB0
aGUgdmFsdWUuCisgICAgICAgIENvbnN0YW50CisgICAgfTsKKyAgICAKKyAgICBWYWx1ZVJlcCgp
CisgICAgICAgIDogbV9raW5kKEFueSkKKyAgICB7CisgICAgfQorCisgICAgZXhwbGljaXQgVmFs
dWVSZXAoUmVnIHJlZykKKyAgICAgICAgOiBtX2tpbmQoUmVnaXN0ZXIpCisgICAgICAgICwgbV92
YWx1ZShyZWcuaW5kZXgoKSkKKyAgICB7CisgICAgfQorCisgICAgc3RhdGljIFZhbHVlUmVwIHJl
ZyhSZWcgcmVnKQorICAgIHsKKyAgICAgICAgcmV0dXJuIFZhbHVlUmVwKHJlZyk7CisgICAgfQor
CisgICAgc3RhdGljIFZhbHVlUmVwIHN0YWNrKGludHB0cl90IG9mZnNldEZyb21GUCkKKyAgICB7
CisgICAgICAgIFZhbHVlUmVwIHJlc3VsdDsKKyAgICAgICAgcmVzdWx0Lm1fa2luZCA9IFN0YWNr
OworICAgICAgICByZXN1bHQubV92YWx1ZSA9IG9mZnNldEZyb21GUDsKKyAgICB9CisKKyAgICBz
dGF0aWMgVmFsdWVSZXAgc3RhY2tBcmd1bWVudChpbnRwdHJfdCBvZmZzZXRGcm9tU1ApCisgICAg
eworICAgICAgICBWYWx1ZVJlcCByZXN1bHQ7CisgICAgICAgIHJlc3VsdC5tX2tpbmQgPSBTdGFj
a0FyZ3VtZW50OworICAgICAgICByZXN1bHQubV92YWx1ZSA9IG9mZnNldEZyb21TUDsKKyAgICB9
CisKKyAgICBzdGF0aWMgVmFsdWVSZXAgY29uc3RhbnQoaW50NjRfdCB2YWx1ZSkKKyAgICB7Cisg
ICAgICAgIFZhbHVlUmVwIHJlc3VsdDsKKyAgICAgICAgcmVzdWx0Lm1fa2luZCA9IENvbnN0YW50
OworICAgICAgICByZXN1bHQubV92YWx1ZSA9IHZhbHVlOworICAgIH0KKworICAgIHN0YXRpYyBW
YWx1ZVJlcCBjb25zdGFudChkb3VibGUgdmFsdWUpCisgICAgeworICAgICAgICByZXR1cm4gVmFs
dWVSZXAoYml0d2lzZV9jYXN0PGludDY0X3Q+KHZhbHVlKSk7CisgICAgfQorCisgICAgS2luZCBr
aW5kKCkgY29uc3QgeyByZXR1cm4gbV9raW5kOyB9CisKKyAgICBleHBsaWNpdCBvcGVyYXRvciBi
b29sKCkgY29uc3QgeyByZXR1cm4ga2luZCgpICE9IEFueTsgfQorCisgICAgUmVnIHJlZygpIGNv
bnN0CisgICAgeworICAgICAgICBBU1NFUlQoa2luZCgpID09IFJlZ2lzdGVyKTsKKyAgICAgICAg
cmV0dXJuIFJlZzo6ZnJvbUluZGV4KG1fdmFsdWUpOworICAgIH0KKworICAgIGludHB0cl90IG9m
ZnNldEZyb21GUCgpIGNvbnN0CisgICAgeworICAgICAgICBBU1NFUlQoa2luZCgpID09IFN0YWNr
KTsKKyAgICAgICAgcmV0dXJuIHN0YXRpY19jYXN0PGludHB0cl90PihtX3ZhbHVlKTsKKyAgICB9
CisKKyAgICBpbnRwdHJfdCBvZmZzZXRGcm9tU1AoKSBjb25zdAorICAgIHsKKyAgICAgICAgQVNT
RVJUKGtpbmQoKSA9PSBTdGFja0FyZ3VtZW50KTsKKyAgICAgICAgcmV0dXJuIHN0YXRpY19jYXN0
PGludHB0cl90PihtX3ZhbHVlKTsKKyAgICB9CisKKyAgICBpbnQ2NF90IHZhbHVlKCkgY29uc3QK
KyAgICB7CisgICAgICAgIEFTU0VSVChraW5kKCkgPT0gQ29uc3RhbnQpOworICAgICAgICByZXR1
cm4gbV92YWx1ZTsKKyAgICB9CisKKyAgICBkb3VibGUgZG91YmxlVmFsdWUoKSBjb25zdAorICAg
IHsKKyAgICAgICAgcmV0dXJuIGJpdHdpc2VfY2FzdDxkb3VibGU+KHZhbHVlKCkpOworICAgIH0K
KworICAgIHZvaWQgZHVtcChQcmludFN0cmVhbSYpIGNvbnN0OworCitwcml2YXRlOgorICAgIEtp
bmQgbV9raW5kOworICAgIGludDY0X3QgbV92YWx1ZTsKK307CisKK30gfSAvLyBuYW1lc3BhY2Ug
SlNDOjpCMworCituYW1lc3BhY2UgV1RGIHsKKwordm9pZCBwcmludEludGVybmFsKFByaW50U3Ry
ZWFtJiwgSlNDOjpCMzo6VmFsdWVSZXA6OktpbmQpOworCit9IC8vIG5hbWVzcGFjZSBXVEYKKwor
I2VuZGlmIC8vIEIzVmFsdWVSZXBfaAorCkluZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMv
Z2VuZXJhdGVfcGF0dGVybl9tYXRjaGVyLnJiCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2Ny
aXB0Q29yZS9iMy9nZW5lcmF0ZV9wYXR0ZXJuX21hdGNoZXIucmIJKHJldmlzaW9uIDApCisrKyBT
b3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvZ2VuZXJhdGVfcGF0dGVybl9tYXRjaGVyLnJiCSh3b3Jr
aW5nIGNvcHkpCkBAIC0wLDAgKzEsNDc1IEBACisjIS91c3IvYmluL2VudiBydWJ5CisKKyMgQ29w
eXJpZ2h0IChDKSAyMDE1IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyMKKyMgUmVk
aXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3
aXRob3V0CisjIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBm
b2xsb3dpbmcgY29uZGl0aW9ucworIyBhcmUgbWV0OgorIyAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Yg
c291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorIyAgICBub3RpY2Us
IHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisj
IDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJv
dmUgY29weXJpZ2h0CisjICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRo
ZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyMgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Ig
b3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyMKKyMgVEhJ
UyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIEFORCBJVFMgQ09OVFJJQlVUT1JT
IGBgQVMgSVMnJworIyBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNM
VURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyMgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBN
RVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorIyBQVVJQT1NFIEFS
RSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SIElUUyBDT05UUklC
VVRPUlMKKyMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwg
U1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgorIyBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElO
RywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgorIyBTVUJTVElUVVRFIEdPT0RT
IE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MK
KyMgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFC
SUxJVFksIFdIRVRIRVIgSU4KKyMgQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQg
KElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKyMgQVJJU0lORyBJTiBBTlkgV0FZ
IE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRgorIyBU
SEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKK3JlcXVpcmUgInBhdGhuYW1lIgorCisk
dmFySW5kZXggPSAwCitkZWYgbmV3VmFyCisgICAgJHZhckluZGV4ICs9IDEKKyAgICAiX3RtcCN7
JHZhckluZGV4fSIKK2VuZAorCitjbGFzcyBQcm9kdWN0aW9uCisgICAgYXR0cl9yZWFkZXIgOm9y
aWdpbiwgOm5hbWUsIDp2YXJOYW1lLCA6YW5vbnltb3VzLCA6b3Bjb2RlLCA6Y2hpbGRyZW4KKwor
ICAgIGRlZiBpbml0aWFsaXplKG9yaWdpbiwgbmFtZSwgb3Bjb2RlLCBjaGlsZHJlbikKKyAgICAg
ICAgQG9yaWdpbiA9IG9yaWdpbgorICAgICAgICBAbmFtZSA9IG5hbWUKKyAgICAgICAgQGFub255
bW91cyA9IChuYW1lID09IG5pbCBvciBuYW1lID1+IC9cQVwkKFswLTldKylcWi8pCisgICAgICAg
IEB2YXJOYW1lID0gQGFub255bW91cyA/IG5ld1ZhciA6IG5hbWUKKyAgICAgICAgQG9wY29kZSA9
IG9wY29kZQorICAgICAgICBAY2hpbGRyZW4gPSBjaGlsZHJlbiA/IGNoaWxkcmVuIDogW10KKyAg
ICBlbmQKKworICAgIGRlZiBoYXNPcGNvZGUKKyAgICAgICAgb3Bjb2RlICE9IG5pbAorICAgIGVu
ZAorCisgICAgZGVmIGVhY2hWYXJpYWJsZSgmcHJvYykKKyAgICAgICAgY2hpbGRyZW4uZWFjaF93
aXRoX2luZGV4IHsKKyAgICAgICAgICAgIHwgY2hpbGQsIGluZGV4IHwKKyAgICAgICAgICAgIHlp
ZWxkIHZhck5hbWUsCisgICAgICAgICAgICAgICAgICBjaGlsZC5uYW1lLAorICAgICAgICAgICAg
ICAgICAgY2hpbGQudmFyTmFtZSwKKyAgICAgICAgICAgICAgICAgIGNoaWxkLmFub255bW91cyA/
IChjaGlsZC5vcGNvZGUgPyA6YW5vbkludGVybmFsIDogOmFub25PcGVyYW5kKSA6IChjaGlsZC5v
cGNvZGUgPyA6aW50ZXJuYWwgOiA6b3BlcmFuZCksCisgICAgICAgICAgICAgICAgICBpbmRleAor
ICAgICAgICAgICAgY2hpbGQuZWFjaFZhcmlhYmxlKCZwcm9jKQorICAgICAgICB9CisgICAgZW5k
CitlbmQKKworY2xhc3MgTWF0Y2hlcgorICAgIGF0dHJfcmVhZGVyIDpuYW1lLCA6cHJvZHVjdGlv
bnMKKworICAgIGRlZiBpbml0aWFsaXplKG5hbWUsIHByb2R1Y3Rpb25zKQorICAgICAgICBAbmFt
ZSA9IG5hbWUKKyAgICAgICAgQHByb2R1Y3Rpb25zID0gcHJvZHVjdGlvbnMKKyAgICBlbmQKK2Vu
ZAorCitjbGFzcyBPcmlnaW4KKyAgICBhdHRyX3JlYWRlciA6ZmlsZU5hbWUsIDpsaW5lTnVtYmVy
CisgICAgCisgICAgZGVmIGluaXRpYWxpemUoZmlsZU5hbWUsIGxpbmVOdW1iZXIpCisgICAgICAg
IEBmaWxlTmFtZSA9IGZpbGVOYW1lCisgICAgICAgIEBsaW5lTnVtYmVyID0gbGluZU51bWJlcgor
ICAgIGVuZAorICAgIAorICAgIGRlZiB0b19zCisgICAgICAgICIje2ZpbGVOYW1lfToje2xpbmVO
dW1iZXJ9IgorICAgIGVuZAorZW5kCisKK2NsYXNzIFRva2VuCisgICAgYXR0cl9yZWFkZXIgOm9y
aWdpbiwgOnN0cmluZworICAgIAorICAgIGRlZiBpbml0aWFsaXplKG9yaWdpbiwgc3RyaW5nKQor
ICAgICAgICBAb3JpZ2luID0gb3JpZ2luCisgICAgICAgIEBzdHJpbmcgPSBzdHJpbmcKKyAgICBl
bmQKKyAgICAKKyAgICBkZWYgPT0ob3RoZXIpCisgICAgICAgIGlmIG90aGVyLmlzX2E/IFRva2Vu
CisgICAgICAgICAgICBAc3RyaW5nID09IG90aGVyLnN0cmluZworICAgICAgICBlbHNlCisgICAg
ICAgICAgICBAc3RyaW5nID09IG90aGVyCisgICAgICAgIGVuZAorICAgIGVuZAorICAgIAorICAg
IGRlZiA9fihvdGhlcikKKyAgICAgICAgQHN0cmluZyA9fiBvdGhlcgorICAgIGVuZAorICAgIAor
ICAgIGRlZiB0b19zCisgICAgICAgICIje0BzdHJpbmcuaW5zcGVjdH0gYXQgI3tvcmlnaW59Igor
ICAgIGVuZAorICAgIAorICAgIGRlZiBwYXJzZUVycm9yKCpjb21tZW50KQorICAgICAgICBpZiBj
b21tZW50LmVtcHR5PworICAgICAgICAgICAgcmFpc2UgIlBhcnNlIGVycm9yOiAje3RvX3N9Igor
ICAgICAgICBlbHNlCisgICAgICAgICAgICByYWlzZSAiUGFyc2UgZXJyb3I6ICN7dG9fc306ICN7
Y29tbWVudFswXX0iCisgICAgICAgIGVuZAorICAgIGVuZAorZW5kCisKK2RlZiBsZXgoc3RyLCBm
aWxlTmFtZSkKKyAgICBmaWxlTmFtZSA9IFBhdGhuYW1lLm5ldyhmaWxlTmFtZSkKKyAgICByZXN1
bHQgPSBbXQorICAgIGxpbmVOdW1iZXIgPSAxCisgICAgd2hpbGUgbm90IHN0ci5lbXB0eT8KKyAg
ICAgICAgY2FzZSBzdHIKKyAgICAgICAgd2hlbiAvXEFcIyhbXlxuXSopLworICAgICAgICAgICAg
IyBjb21tZW50LCBpZ25vcmUKKyAgICAgICAgd2hlbiAvXEFcbi8KKyAgICAgICAgICAgICMgbmV3
bGluZSwgaWdub3JlCisgICAgICAgICAgICBsaW5lTnVtYmVyICs9IDEKKyAgICAgICAgd2hlbiAv
XEFbYS16QS1aMC05JF0oW2EtekEtWjAtOV9dKikvCisgICAgICAgICAgICByZXN1bHQgPDwgVG9r
ZW4ubmV3KE9yaWdpbi5uZXcoZmlsZU5hbWUsIGxpbmVOdW1iZXIpLCAkJikKKyAgICAgICAgd2hl
biAvXEEoWyBcdFxyXSspLworICAgICAgICAgICAgIyB3aGl0ZXNwYWNlLCBpZ25vcmUKKyAgICAg
ICAgd2hlbiAvXEFbPSgpLF0vCisgICAgICAgICAgICByZXN1bHQgPDwgVG9rZW4ubmV3KE9yaWdp
bi5uZXcoZmlsZU5hbWUsIGxpbmVOdW1iZXIpLCAkJikKKyAgICAgICAgZWxzZQorICAgICAgICAg
ICAgcmFpc2UgIkxleGVyIGVycm9yIGF0ICN7T3JpZ2luLm5ldyhmaWxlTmFtZSwgbGluZU51bWJl
cikudG9fc30sIHVuZXhwZWN0ZWQgc2VxdWVuY2UgI3tzdHJbMC4uMjBdLmluc3BlY3R9IgorICAg
ICAgICBlbmQKKyAgICAgICAgc3RyID0gJH4ucG9zdF9tYXRjaAorICAgIGVuZAorICAgIHJlc3Vs
dAorZW5kCisKK2RlZiBpc0tleXdvcmQodG9rZW4pCisgICAgIyBXZSBjYW4gZXh0ZW5kIHRoaXMg
YXMgd2UgYWRkIG1vcmUga2V5d29yZHMuIExpa2UsIHdlIG1pZ2h0IHdhbnQgImluY2x1ZGUiIGV2
ZW50dWFsbHkuCisgICAgdG9rZW4gPX4gL1xBKChtYXRjaGVyKSlcWi8KK2VuZAorCitkZWYgaXNJ
ZGVudGlmaWVyKHRva2VuKQorICAgIHRva2VuID1+IC9cQVthLXpBLVowLTkkXShbYS16QS1aMC05
X10qKVxaLyBhbmQgbm90IGlzS2V5d29yZCh0b2tlbikKK2VuZAorCitjbGFzcyBQYXJzZXIKKyAg
ICBkZWYgaW5pdGlhbGl6ZShkYXRhLCBmaWxlTmFtZSkKKyAgICAgICAgQHRva2VucyA9IGxleChk
YXRhLCBmaWxlTmFtZSkKKyAgICAgICAgQGlkeCA9IDAKKyAgICBlbmQKKworICAgIGRlZiB0b2tl
bgorICAgICAgICBAdG9rZW5zW0BpZHhdCisgICAgZW5kCisKKyAgICBkZWYgYWR2YW5jZQorICAg
ICAgICBAaWR4ICs9IDEKKyAgICBlbmQKKworICAgIGRlZiBwYXJzZUVycm9yKCpjb21tZW50KQor
ICAgICAgICBpZiB0b2tlbgorICAgICAgICAgICAgdG9rZW4ucGFyc2VFcnJvcigqY29tbWVudCkK
KyAgICAgICAgZWxzZQorICAgICAgICAgICAgaWYgY29tbWVudC5lbXB0eT8KKyAgICAgICAgICAg
ICAgICByYWlzZSAiUGFyc2UgZXJyb3IgYXQgZW5kIG9mIGZpbGUiCisgICAgICAgICAgICBlbHNl
CisgICAgICAgICAgICAgICAgcmFpc2UgIlBhcnNlIGVycm9yIGF0IGVuZCBvZiBmaWxlOiAje2Nv
bW1lbnRbMF19IgorICAgICAgICAgICAgZW5kCisgICAgICAgIGVuZAorICAgIGVuZAorCisgICAg
ZGVmIGNvbnN1bWUoc3RyaW5nKQorICAgICAgICBwYXJzZUVycm9yKCJFeHBlY3RlZCAje3N0cmlu
Z30iKSB1bmxlc3MgdG9rZW4gPT0gc3RyaW5nCisgICAgICAgIGFkdmFuY2UKKyAgICBlbmQKKwor
ICAgIGRlZiBjb25zdW1lSWRlbnRpZmllcgorICAgICAgICByZXN1bHQgPSB0b2tlbi5zdHJpbmcK
KyAgICAgICAgcGFyc2VFcnJvcigiRXhwZWN0ZWQgaWRlbnRpZmllciIpIHVubGVzcyBpc0lkZW50
aWZpZXIocmVzdWx0KQorICAgICAgICBhZHZhbmNlCisgICAgICAgIHJlc3VsdAorICAgIGVuZAor
CisgICAgZGVmIGFkZFVuaXF1ZShuYW1lLCBwcm9kdWN0aW9ucywgcHJvZHVjdGlvbikKKyAgICAg
ICAgaWYgbmFtZSA9PSBwcm9kdWN0aW9uLnZhck5hbWUKKyAgICAgICAgICAgIHBhcnNlRXJyb3Io
IkNoaWxkIHByb2R1Y3Rpb24gaGFzIHNhbWUgbmFtZSBhcyBwYXJlbnQgcHJvZHVjdGlvbiIpCisg
ICAgICAgIGVuZAorICAgICAgICBpZiBwcm9kdWN0aW9ucy5kZXRlY3QgeyB8IGVudHJ5IHwgZW50
cnkubmFtZSA9PSBwcm9kdWN0aW9uLm5hbWUgfQorICAgICAgICAgICAgcGFyc2VFcnJvcigiRHVw
bGljYXRlIHByb2R1Y3Rpb24iKQorICAgICAgICBlbmQKKyAgICAgICAgcHJvZHVjdGlvbnMgPDwg
cHJvZHVjdGlvbgorICAgIGVuZAorCisgICAgZGVmIHBhcnNlCisgICAgICAgIGNvbnN1bWUoIm1h
dGNoZXIiKQorCisgICAgICAgIG1hdGNoZXJOYW1lID0gY29uc3VtZUlkZW50aWZpZXIKKworICAg
ICAgICBwcm9kdWN0aW9ucyA9IFtdCisKKyAgICAgICAgbG9vcCB7CisgICAgICAgICAgICBicmVh
ayBpZiBAaWR4ID49IEB0b2tlbnMubGVuZ3RoCisKKyAgICAgICAgICAgICMgV2UgbWlnaHQgd2Fu
dCB0byBzdXBwb3J0ICJpbmNsdWRlIi4gSWYgd2UgZGlkIHRoYXQsIGl0IHdvdWxkIGdvIGhlcmUu
CisgICAgICAgICAgICBhZGRVbmlxdWUobWF0Y2hlck5hbWUsIHByb2R1Y3Rpb25zLCBwYXJzZVBy
b2R1Y3Rpb24pCisgICAgICAgIH0KKworICAgICAgICBNYXRjaGVyLm5ldyhtYXRjaGVyTmFtZSwg
cHJvZHVjdGlvbnMpCisgICAgZW5kCisKKyAgICBkZWYgcGFyc2VQcm9kdWN0aW9uCisgICAgICAg
IG9yaWdpbiA9IHRva2VuLm9yaWdpbgorICAgICAgICBuYW1lID0gY29uc3VtZUlkZW50aWZpZXIK
KworICAgICAgICBpZiB0b2tlbiA9PSAiPSIKKyAgICAgICAgICAgIGNvbnN1bWUoIj0iKQorICAg
ICAgICAgICAgb3Bjb2RlID0gY29uc3VtZUlkZW50aWZpZXIKKyAgICAgICAgICAgIGNvbnN1bWUo
IigiKQorICAgICAgICBlbHNpZiB0b2tlbiA9PSAiKCIKKyAgICAgICAgICAgIGNvbnN1bWUoIigi
KQorICAgICAgICAgICAgb3Bjb2RlID0gbmFtZQorICAgICAgICAgICAgbmFtZSA9IG5pbAorICAg
ICAgICBlbHNlCisgICAgICAgICAgICByZXR1cm4gUHJvZHVjdGlvbi5uZXcob3JpZ2luLCBuYW1l
LCBuaWwsIG5pbCkKKyAgICAgICAgZW5kCisgICAgICAgIAorICAgICAgICBwcm9kdWN0aW9ucyA9
IFtdCisgICAgICAgIGxvb3AgeworICAgICAgICAgICAgYnJlYWsgaWYgdG9rZW4gPT0gIikiCisK
KyAgICAgICAgICAgIGFkZFVuaXF1ZShuYW1lLCBwcm9kdWN0aW9ucywgcGFyc2VQcm9kdWN0aW9u
KQorCisgICAgICAgICAgICBicmVhayBpZiB0b2tlbiA9PSAiKSIKKyAgICAgICAgICAgIGNvbnN1
bWUoIiwiKQorICAgICAgICB9CisKKyAgICAgICAgIyBBZHZhbmNlIGFmdGVyIHRoZSAiKSIKKyAg
ICAgICAgYWR2YW5jZQorCisgICAgICAgIFByb2R1Y3Rpb24ubmV3KG9yaWdpbiwgbmFtZSwgb3Bj
b2RlLCBwcm9kdWN0aW9ucykKKyAgICBlbmQKK2VuZAorCitmaWxlTmFtZSA9IEFSR1ZbMF0KKwor
cGFyc2VyID0gUGFyc2VyLm5ldyhJTzo6cmVhZChmaWxlTmFtZSksIGZpbGVOYW1lKQorbWF0Y2hl
ciA9IHBhcnNlci5wYXJzZQorCitjbGFzcyBTdWJNYXRjaAorICAgIGF0dHJfcmVhZGVyIDppbmRl
eE1hcCwgOnByb2R1Y3Rpb25zCisgICAgCisgICAgZGVmIGluaXRpYWxpemUoaW5kZXhMaXN0LCBw
cm9kdWN0aW9ucykKKyAgICAgICAgQGluZGV4TWFwID0gW10KKyAgICAgICAgQHByb2R1Y3Rpb25z
ID0gW10KKyAgICAgICAgaW5kZXhMaXN0LmVhY2ggeworICAgICAgICAgICAgfCBpbmRleCB8Cisg
ICAgICAgICAgICBAaW5kZXhNYXAgPDwgaW5kZXgKKyAgICAgICAgICAgIEBwcm9kdWN0aW9ucyA8
PCBwcm9kdWN0aW9uc1tpbmRleF0KKyAgICAgICAgfQorICAgIGVuZAorCisgICAgZGVmIG1hcElu
ZGV4TGlzdChpbmRleExpc3QpCisgICAgICAgIGluZGV4TGlzdC5tYXAgeworICAgICAgICAgICAg
fCBpbmRleCB8CisgICAgICAgICAgICBAaW5kZXhNYXBbaW5kZXhdCisgICAgICAgIH0KKyAgICBl
bmQKK2VuZAorCitGaWxlLm9wZW4oIkIzIiArIG1hdGNoZXIubmFtZSArICIuaCIsICJ3Iikgewor
ICAgIHwgb3V0cCB8CisKKyAgICBvdXRwLnB1dHMgIi8vIEdlbmVyYXRlZCBieSBnZW5lcmF0ZV9w
YXR0ZXJuX21hdGNoZXIucmIgZnJvbSAje2ZpbGVOYW1lfSAtLSBkbyBub3QgZWRpdCEiCisKKyAg
ICBvdXRwLnB1dHMgIiNpZm5kZWYgQjMje21hdGNoZXIubmFtZX1faCIKKyAgICBvdXRwLnB1dHMg
IiNkZWZpbmUgQjMje21hdGNoZXIubmFtZX1faCIKKyAgICAKKyAgICBvdXRwLnB1dHMgIiNpbmNs
dWRlIFwiQjNWYWx1ZS5oXCIiCisgICAgCisgICAgb3V0cC5wdXRzICJuYW1lc3BhY2UgSlNDIHsg
bmFtZXNwYWNlIEIzIHsiCisKKyAgICBvdXRwLnB1dHMgInRlbXBsYXRlPHR5cGVuYW1lIEFkYXB0
b3I+IgorICAgIG91dHAucHV0cyAidm9pZCBydW4je21hdGNoZXIubmFtZX0oVmFsdWUqIF92YWx1
ZSwgQWRhcHRvciYgYWRhcHRvcikiCisgICAgb3V0cC5wdXRzICJ7IgorCisgICAgIyBOb3RlIHRo
YXQgdGhpcyBkb2VzIG5vdCBlbWl0IHByb3Blcmx5IGluZGVudGVkIGNvZGUsIGJlY2F1c2UgaXQn
cyBhIHJlY3Vyc2l2ZSBlbWl0dGVyLiBJZiB5b3UKKyAgICAjIHdhbnQgdG8gc2VlIHRoZSBjb2Rl
IG5pY2VseSBmb3JtYXR0ZWQsIG9wZW4gaXQgaW4gYSBnb29kIHRleHQgZWRpdG9yIGFuZCBhc2sg
aXQgdG8gZm9ybWF0IGl0CisgICAgIyBmb3IgeW91LgorCisgICAgIyBJbiBvZGQgc2l0dWF0aW9u
cywgd2UgbWF5IG5vdCB1c2UgdGhlIGlucHV0IHZhbHVlLiBUZWxsIHRoZSBjb21waWxlciB0byBj
aGlsbCBvdXQgYWJvdXQgaXQuCisgICAgb3V0cC5wdXRzICJVTlVTRURfUEFSQU0oX3ZhbHVlKTsi
CisgICAgICAgIAorICAgICMgVGhpcyBqdXN0IHByb3RlY3RzIHRoZSBjYWxsZXIgZnJvbSBoYXZp
bmcgdG8gd29ycnkgYWJvdXQgcHJvZHVjdGlvbnMgaGF2aW5nIGRpZmZlcmVudCBsZW5ndGhzLgor
ICAgIGRlZiBtYXRjaExlbmd0aChvdXRwLCB2YWx1ZU5hbWUsIHByb2R1Y3Rpb25zKQorICAgICAg
ICBpbmRleExpc3RzID0gW10KKyAgICAgICAgcHJvZHVjdGlvbnMuZWFjaF93aXRoX2luZGV4IHsK
KyAgICAgICAgICAgIHwgcHJvZHVjdGlvbiwgaW5kZXggfAorICAgICAgICAgICAgaWYgaW5kZXhM
aXN0c1stMV0gYW5kIHByb2R1Y3Rpb25zW2luZGV4TGlzdHNbLTFdWzBdXS5jaGlsZHJlbi5sZW5n
dGggPT0gcHJvZHVjdGlvbi5jaGlsZHJlbi5sZW5ndGgKKyAgICAgICAgICAgICAgICBpbmRleExp
c3RzWy0xXSA8PCBpbmRleAorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIGluZGV4
TGlzdHMgPDwgW2luZGV4XQorICAgICAgICAgICAgZW5kCisgICAgICAgIH0KKworICAgICAgICBp
bmRleExpc3RzLmVhY2ggeworICAgICAgICAgICAgfCBpbmRleExpc3QgfAorICAgICAgICAgICAg
bGVuZ3RoID0gcHJvZHVjdGlvbnNbaW5kZXhMaXN0WzBdXS5jaGlsZHJlbi5sZW5ndGgKKyAgICAg
ICAgICAgIGlmIGxlbmd0aCA+IDAKKyAgICAgICAgICAgICAgICBvdXRwLnB1dHMgImlmICgje3Zh
bHVlTmFtZX0tPmNoaWxkcmVuLnNpemUoKSA+PSAje2xlbmd0aH0pIHsiCisgICAgICAgICAgICAg
ICAgeWllbGQgaW5kZXhMaXN0CisgICAgICAgICAgICAgICAgb3V0cC5wdXRzICJ9IgorICAgICAg
ICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHlpZWxkIGluZGV4TGlzdAorICAgICAgICAgICAg
ZW5kCisgICAgICAgIH0KKyAgICBlbmQKKworICAgICMgVGhpcyBlZmZpY2llbnRseSBzZWxlY3Rz
IGZyb20gdGhlIGdpdmVuIHNldCBvZiBwcm9kdWN0aW9ucy4gSXQgYXNzdW1lcyB0aGF0IHByb2R1
Y3Rpb25zCisgICAgIyBhcmUgbm90IGR1cGxpY2F0ZWQuIEl0IHlpZWxkcyB0aGUgaW5kZXggb2Yg
dGhlIGZvdW5kIHByb2R1Y3Rpb24sIGFuZCB0aGUgY29yb3V0aW5lIGlzCisgICAgIyByZXNwb25z
aWJsZSBmb3IgZW1pdHRpbmcgc3BlY2lmaWMgY29kZSBmb3IgdGhhdCBwcm9kdWN0aW9uLiBUaGUg
Y29yb3V0aW5lIGlzIGdpdmVuIGxpc3RzIG9mCisgICAgIyBpbmRpY2VzIG9mIHBvc3NpYmx5LW1h
dGNoaW5nIHByb2R1Y3Rpb25zLgorICAgIGRlZiBtYXRjaFByb2R1Y3Rpb25zKG91dHAsIHZhbHVl
TmFtZSwgcHJvZHVjdGlvbnMpCisgICAgICAgICMgRmlyc3QsIHNwbGl0IHRoZSBwcm9kdWN0aW9u
cyBsaXN0IGludG8gcnVucyBvZiBwcm9kdWN0aW9ucyB3aXRoIGFuIG9wY29kZSBhbmQgcHJvZHVj
dGlvbnMKKyAgICAgICAgIyB3aXRob3V0IG9uZS4KKyAgICAgICAgaW5kZXhMaXN0cyA9IFtdCisg
ICAgICAgIHByb2R1Y3Rpb25zLmVhY2hfd2l0aF9pbmRleCB7CisgICAgICAgICAgICB8IHByb2R1
Y3Rpb24sIGluZGV4IHwKKyAgICAgICAgICAgIGlmIGluZGV4TGlzdHNbLTFdIGFuZCBwcm9kdWN0
aW9uc1tpbmRleExpc3RzWy0xXVswXV0uaGFzT3Bjb2RlID09IHByb2R1Y3Rpb24uaGFzT3Bjb2Rl
CisgICAgICAgICAgICAgICAgaW5kZXhMaXN0c1stMV0gPDwgaW5kZXgKKyAgICAgICAgICAgIGVs
c2UKKyAgICAgICAgICAgICAgICBpbmRleExpc3RzIDw8IFtpbmRleF0KKyAgICAgICAgICAgIGVu
ZAorICAgICAgICB9CisgICAgICAgIAorICAgICAgICAjIE5vdywgZW1pdCBwYXR0ZXJuIG1hdGNo
aW5nIGNvZGUuIFdlIGRvIGl0IGRpZmZlcmVudGx5IGZvciBsaXN0cyB3aXRoIGFuIG9wY29kZSB0
aGFuIGZvcgorICAgICAgICAjIGxpc3RzIHdpdGhvdXQgb25lLgorICAgICAgICBpbmRleExpc3Rz
LmVhY2ggeworICAgICAgICAgICAgfCBpbmRleExpc3QgfAorICAgICAgICAgICAgaWYgcHJvZHVj
dGlvbnNbaW5kZXhMaXN0WzBdXS5oYXNPcGNvZGUKKyAgICAgICAgICAgICAgICAjIE5vdywgd2Ug
c3BsaXQgdGhpcyBpbmRleCBsaXN0IGludG8gZ3JvdXBzIGZvciBlYWNoIG9wY29kZS4KKyAgICAg
ICAgICAgICAgICBncm91cHMgPSB7fQorICAgICAgICAgICAgICAgIGluZGV4TGlzdC5lYWNoIHsK
KyAgICAgICAgICAgICAgICAgICAgfCBpbmRleCB8CisgICAgICAgICAgICAgICAgICAgIHByb2R1
Y3Rpb24gPSBwcm9kdWN0aW9uc1tpbmRleF0KKyAgICAgICAgICAgICAgICAgICAgaWYgZ3JvdXBz
W3Byb2R1Y3Rpb24ub3Bjb2RlXQorICAgICAgICAgICAgICAgICAgICAgICAgZ3JvdXBzW3Byb2R1
Y3Rpb24ub3Bjb2RlXSA8PCBpbmRleAorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAg
ICAgICAgICAgICAgICAgICBncm91cHNbcHJvZHVjdGlvbi5vcGNvZGVdID0gW2luZGV4XQorICAg
ICAgICAgICAgICAgICAgICBlbmQKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAg
ICAjIEVtaXQgYSBzd2l0Y2ggc3RhdGVtZW50LgorICAgICAgICAgICAgICAgIG91dHAucHV0cyAi
c3dpdGNoICgje3ZhbHVlTmFtZX0tPm9wY29kZSgpKSB7IgorICAgICAgICAgICAgICAgIGdyb3Vw
cy5lYWNoX3BhaXIgeworICAgICAgICAgICAgICAgICAgICB8IG9wY29kZSwgc3ViSW5kZXhMaXN0
IHwKKyAgICAgICAgICAgICAgICAgICAgb3V0cC5wdXRzICJjYXNlICN7b3Bjb2RlfToiCisgICAg
ICAgICAgICAgICAgICAgIHN1Yk1hdGNoID0gU3ViTWF0Y2gubmV3KHN1YkluZGV4TGlzdCwgcHJv
ZHVjdGlvbnMpCisgICAgICAgICAgICAgICAgICAgIG1hdGNoTGVuZ3RoKG91dHAsIHZhbHVlTmFt
ZSwgc3ViTWF0Y2gucHJvZHVjdGlvbnMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHwgaW5k
ZXhMaXN0IHwKKyAgICAgICAgICAgICAgICAgICAgICAgIHlpZWxkIHN1Yk1hdGNoLm1hcEluZGV4
TGlzdChpbmRleExpc3QpCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAg
ICAgb3V0cC5wdXRzICJicmVhazsiCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAg
IG91dHAucHV0cyAiZGVmYXVsdDoiCisgICAgICAgICAgICAgICAgb3V0cC5wdXRzICJicmVhazsi
CisgICAgICAgICAgICAgICAgb3V0cC5wdXRzICJ9IgorICAgICAgICAgICAgZWxzZQorICAgICAg
ICAgICAgICAgIHN1Yk1hdGNoID0gU3ViTWF0Y2gubmV3KGluZGV4TGlzdCwgcHJvZHVjdGlvbnMp
CisgICAgICAgICAgICAgICAgbWF0Y2hMZW5ndGgob3V0cCwgdmFsdWVOYW1lLCBzdWJNYXRjaC5w
cm9kdWN0aW9ucykgeworICAgICAgICAgICAgICAgICAgICB8IGluZGV4TGlzdCB8CisgICAgICAg
ICAgICAgICAgICAgIHlpZWxkIHN1Yk1hdGNoLm1hcEluZGV4TGlzdChpbmRleExpc3QpCisgICAg
ICAgICAgICAgICAgfQorICAgICAgICAgICAgZW5kCisgICAgICAgIH0KKyAgICBlbmQKKworICAg
ICMgVGFrZXMgcHJvZHVjdGlvbnMgdGhhdCBoYXZlIHRoZSBzYW1lIG9wY29kZSBhbmQgdGhlIHNh
bWUgbGVuZ3RoIGFuZCBzZWxlY3RzIGZyb20gdGhlbSBiYXNlZCBvbgorICAgICMgdGhlIHByb2R1
Y3Rpb25zIGF0IHRoZSBnaXZlbiBjb2x1bW4uCisgICAgZGVmIG1hdGNoQ29sdW1uKG91dHAsIHZh
bHVlTmFtZSwgcHJvZHVjdGlvbnMsIGNvbHVtbkluZGV4KQorICAgICAgICBpZiBjb2x1bW5JbmRl
eCA+PSBwcm9kdWN0aW9uc1swXS5jaGlsZHJlbi5sZW5ndGgKKyAgICAgICAgICAgIHlpZWxkICgw
Li4uKHByb2R1Y3Rpb25zLnNpemUpKS50b19hCisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAg
ZW5kCisKKyAgICAgICAgc3ViVmFsdWUgPSBuZXdWYXIKKyAgICAgICAgCisgICAgICAgIG91dHAu
cHV0cyAieyIKKyAgICAgICAgb3V0cC5wdXRzICJWYWx1ZSogI3tzdWJWYWx1ZX0gPSAje3ZhbHVl
TmFtZX0tPmNoaWxkKCN7Y29sdW1uSW5kZXh9KTsiCisKKyAgICAgICAgIyBXZSBtYXkgbm90IHVz
ZSB0aGlzIHZhbHVlLiBUZWxsIHRoZSBjb21waWxlciB0byBjaGlsbCBvdXQgYWJvdXQgaXQuCisg
ICAgICAgIG91dHAucHV0cyAiVU5VU0VEX1BBUkFNKCN7c3ViVmFsdWV9KTsiCisgICAgICAgIAor
ICAgICAgICBzdWJQcm9kdWN0aW9ucyA9IHByb2R1Y3Rpb25zLm1hcCB7CisgICAgICAgICAgICB8
IHByb2R1Y3Rpb24gfAorICAgICAgICAgICAgcHJvZHVjdGlvbi5jaGlsZHJlbltjb2x1bW5JbmRl
eF0KKyAgICAgICAgfQorCisgICAgICAgIG1hdGNoUmVjdXJzaXZlbHkob3V0cCwgc3ViVmFsdWUs
IHN1YlByb2R1Y3Rpb25zKSB7CisgICAgICAgICAgICB8IGluZGV4TGlzdCB8CisgICAgICAgICAg
ICBzdWJNYXRjaCA9IFN1Yk1hdGNoLm5ldyhpbmRleExpc3QsIHByb2R1Y3Rpb25zKQorICAgICAg
ICAgICAgbWF0Y2hDb2x1bW4ob3V0cCwgdmFsdWVOYW1lLCBzdWJNYXRjaC5wcm9kdWN0aW9ucywg
Y29sdW1uSW5kZXggKyAxKSB7CisgICAgICAgICAgICAgICAgfCBpbmRleExpc3QgfAorICAgICAg
ICAgICAgICAgIHlpZWxkIHN1Yk1hdGNoLm1hcEluZGV4TGlzdChpbmRleExpc3QpCisgICAgICAg
ICAgICB9CisgICAgICAgIH0KKworICAgICAgICBvdXRwLnB1dHMgIn0iCisgICAgZW5kCisKKyAg
ICBkZWYgbWF0Y2hSZWN1cnNpdmVseShvdXRwLCB2YWx1ZU5hbWUsIHByb2R1Y3Rpb25zKQorICAg
ICAgICBtYXRjaFByb2R1Y3Rpb25zKG91dHAsIHZhbHVlTmFtZSwgcHJvZHVjdGlvbnMpIHsKKyAg
ICAgICAgICAgIHwgaW5kZXhMaXN0IHwKKyAgICAgICAgICAgICMgV2UgYXJlIGd1YXJhbnRlZWQg
dGhhdCB0aGlzIGluZGV4IGxpc3QgY29udGFpbnMgcHJvZHVjdGlvbnMgd2l0aCB0aGUgc2FtZSBv
cGNvZGUgYW5kCisgICAgICAgICAgICAjIHRoZSBzYW1lIGxlbmd0aC4KKyAgICAgICAgICAgIHN1
Yk1hdGNoID0gU3ViTWF0Y2gubmV3KGluZGV4TGlzdCwgcHJvZHVjdGlvbnMpCisgICAgICAgICAg
ICBtYXRjaENvbHVtbihvdXRwLCB2YWx1ZU5hbWUsIHN1Yk1hdGNoLnByb2R1Y3Rpb25zLCAwKSB7
CisgICAgICAgICAgICAgICAgfCBpbmRleExpc3QgfAorICAgICAgICAgICAgICAgIHlpZWxkIHN1
Yk1hdGNoLm1hcEluZGV4TGlzdChpbmRleExpc3QpCisgICAgICAgICAgICB9CisgICAgICAgIH0K
KyAgICBlbmQKKworICAgIG1hdGNoUmVjdXJzaXZlbHkob3V0cCwgIl92YWx1ZSIsIG1hdGNoZXIu
cHJvZHVjdGlvbnMpIHsKKyAgICAgICAgfCBpbmRleExpc3QgfAorICAgICAgICBpbmRleExpc3Qu
ZWFjaCB7CisgICAgICAgICAgICB8IGluZGV4IHwKKyAgICAgICAgICAgIHByb2R1Y3Rpb24gPSBt
YXRjaGVyLnByb2R1Y3Rpb25zW2luZGV4XQorICAgICAgICAgICAgb3V0cC5wdXRzICJ7IgorICAg
ICAgICAgICAgb3V0cC5wdXRzICJWYWx1ZSogI3twcm9kdWN0aW9uLnZhck5hbWV9ID0gX3ZhbHVl
OyIKKyAgICAgICAgICAgIGludGVybmFsQXJndW1lbnRzID0gW10KKyAgICAgICAgICAgIG9wZXJh
bmRBcmd1bWVudHMgPSBbXQorICAgICAgICAgICAgdHJ5QXJndW1lbnRzID0gW10KKyAgICAgICAg
ICAgIG51bVNjb3BlcyA9IDAKKyAgICAgICAgICAgIHByb2R1Y3Rpb24uZWFjaFZhcmlhYmxlIHsK
KyAgICAgICAgICAgICAgICB8IHBhcmVudFZhck5hbWUsIGNoaWxkTmFtZSwgY2hpbGRWYXJOYW1l
LCBraW5kLCBpbmRleCB8CisgICAgICAgICAgICAgICAgb3V0cC5wdXRzICJWYWx1ZSogI3tjaGls
ZFZhck5hbWV9ID0gI3twYXJlbnRWYXJOYW1lfS0+Y2hpbGQoI3tpbmRleH0pOyIKKworICAgICAg
ICAgICAgICAgIGlmIGNoaWxkTmFtZSA9fiAvXEFcJC8KKyAgICAgICAgICAgICAgICAgICAgaWYg
Y2hpbGROYW1lID1+IC9cQVwkKFswLTldKylcWi8KKyAgICAgICAgICAgICAgICAgICAgICAgIG91
dHAucHV0cyAiaWYgKCN7Y2hpbGRWYXJOYW1lfS0+aXNJbnQoI3skMX0pKSB7IgorICAgICAgICAg
ICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICBvdXRwLnB1dHMgImlmICgj
e2NoaWxkVmFyTmFtZX0tPmhhc0ludCgpKSB7IgorICAgICAgICAgICAgICAgICAgICBlbmQKKyAg
ICAgICAgICAgICAgICAgICAgbnVtU2NvcGVzICs9IDEKKyAgICAgICAgICAgICAgICBlbmQKKyAg
ICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBpbnRlcm5hbEFyZ3VtZW50cyA8PCBjaGls
ZFZhck5hbWUgaWYga2luZCA9PSA6aW50ZXJuYWwgb3Iga2luZCA9PSA6YW5vbkludGVybmFsCisg
ICAgICAgICAgICAgICAgb3BlcmFuZEFyZ3VtZW50cyA8PCBjaGlsZFZhck5hbWUgaWYga2luZCA9
PSA6b3BlcmFuZCBvciBraW5kID09IDphbm9uT3BlcmFuZAorICAgICAgICAgICAgICAgIHRyeUFy
Z3VtZW50cyA8PCBjaGlsZFZhck5hbWUgaWYga2luZCA9PSA6aW50ZXJuYWwgb3Iga2luZCA9PSA6
b3BlcmFuZAorICAgICAgICAgICAgfQorICAgICAgICAgICAgb3V0cC5wdXRzICJpZiAoYWRhcHRv
ci5hY2NlcHRSb290KF92YWx1ZSkiCisgICAgICAgICAgICBvdXRwLnB1dHMoIiAgICAmJiBhZGFw
dG9yLmFjY2VwdEludGVybmFscygiICsgaW50ZXJuYWxBcmd1bWVudHMuam9pbigiLCAiKSArICIp
IikKKyAgICAgICAgICAgIG91dHAucHV0cygiICAgICYmIGFkYXB0b3IuYWNjZXB0T3BlcmFuZHMo
IiArIG9wZXJhbmRBcmd1bWVudHMuam9pbigiLCAiKSArICIpIikKKyAgICAgICAgICAgIG91dHAu
cHV0cygiICAgICYmIGFkYXB0b3IudHJ5I3twcm9kdWN0aW9uLm5hbWV9KCIgKyB0cnlBcmd1bWVu
dHMuam9pbigiLCAiKSArICIpKSIpCisgICAgICAgICAgICBvdXRwLnB1dHMgIiAgICByZXR1cm47
IgorICAgICAgICAgICAgbnVtU2NvcGVzLnRpbWVzIHsKKyAgICAgICAgICAgICAgICBvdXRwLnB1
dHMgIn0iCisgICAgICAgICAgICB9CisgICAgICAgICAgICBvdXRwLnB1dHMgIn0iCisgICAgICAg
IH0KKyAgICB9CisgICAgCisgICAgb3V0cC5wdXRzICIgICAgUkVMRUFTRV9BU1NFUlRfTk9UX1JF
QUNIRUQoKTsiCisgICAgb3V0cC5wdXRzICJ9IgorICAgIAorICAgIG91dHAucHV0cyAifSB9IC8v
IG5hbWVzcGFjZSBKU0M6OkIzIgorCisgICAgb3V0cC5wdXRzICIjZW5kaWYgLy8gQjMje21hdGNo
ZXIubmFtZX1faCIKK30KSW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9haXIvQWlyQXJn
LmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvYWlyL0FpckFyZy5j
cHAJKHJldmlzaW9uIDApCisrKyBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvYWlyL0FpckFyZy5j
cHAJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSw3MiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykg
MjAxNSBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRp
b24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Cisg
KiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5n
IGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNl
IGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlz
IGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4g
UmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBj
b3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBm
b2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90
aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJ
UyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisg
KiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlU
RUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQg
RklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4g
Tk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBG
T1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExB
UlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQg
VE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NT
IE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikg
SE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhF
UiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBO
RUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNF
CisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZ
IE9GIFNVQ0ggREFNQUdFLiAKKyAqLworCisjaW5jbHVkZSAiY29uZmlnLmgiCisjaW5jbHVkZSAi
QWlyQXJnLmgiCisKK25hbWVzcGFjZSBKU0MgeyBuYW1lc3BhY2UgQjMgeyBuYW1lc3BhY2UgQWly
IHsKKwordm9pZCBBcmc6OmR1bXAoUHJpbnRTdHJlYW0mIG91dCkgY29uc3QKK3sKKyAgICBzd2l0
Y2ggKG1fa2luZCkgeworICAgIGNhc2UgVG1wOgorICAgICAgICBvdXQucHJpbnQodG1wKCkpOwor
ICAgICAgICByZXR1cm47CisgICAgY2FzZSBJbW06CisgICAgICAgIG91dC5wcmludCgiJCIsIG1f
b2Zmc2V0KTsKKyAgICAgICAgcmV0dXJuOworICAgIGNhc2UgSW1tUHRyOgorICAgICAgICBvdXQu
cHJpbnRmKCIkMHgleCIsIG1fb2Zmc2V0KTsKKyAgICAgICAgcmV0dXJuOworICAgIGNhc2UgQWRk
cjoKKyAgICAgICAgaWYgKG9mZnNldCgpKQorICAgICAgICAgICAgb3V0LnByaW50KG9mZnNldCgp
KTsKKyAgICAgICAgb3V0LnByaW50KCIoIiwgYmFzZSgpLCAiKSIpOworICAgICAgICByZXR1cm47
CisgICAgY2FzZSBJbmRleDoKKyAgICAgICAgaWYgKG9mZnNldCgpKQorICAgICAgICAgICAgb3V0
LnByaW50KG9mZnNldCgpKTsKKyAgICAgICAgb3V0LnByaW50KCIoIiwgYmFzZSgpLCAiLCIsIGlu
ZGV4KCkpOworICAgICAgICBpZiAoc2NhbGUoKSAhPSAxKQorICAgICAgICAgICAgb3V0LnByaW50
KCIsIiwgc2NhbGUoKSk7CisgICAgICAgIG91dC5wcmludCgiKSIpOworICAgICAgICByZXR1cm47
CisgICAgY2FzZSBTdGFjazoKKyAgICAgICAgaWYgKG9mZnNldCgpKQorICAgICAgICAgICAgb3V0
LnByaW50KG9mZnNldCk7CisgICAgICAgIG91dC5wcmludCgiKCIsIHBvaW50ZXJEdW1wKHN0YWNr
U2xvdCgpKSwgIikiKTsKKyAgICAgICAgcmV0dXJuOworICAgIGNhc2UgQ2FsbEFyZzoKKyAgICAg
ICAgaWYgKG9mZnNldCgpKQorICAgICAgICAgICAgb3V0LnByaW50KG9mZnNldCk7CisgICAgICAg
IG91dC5wcmludCgiKGNhbGxBcmcpIik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBS
RUxFQVNFX0FTU0VSVF9OT1RfUkVBQ0hFRCgpOworfQorCit9IH0gfSAvLyBuYW1lc3BhY2UgSlND
OjpCMzo6QWlyCisKSW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9haXIvQWlyQXJnLmgK
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL2Fpci9BaXJBcmcuaAkocmV2
aXNpb24gMCkKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9haXIvQWlyQXJnLmgJKHdvcmtp
bmcgY29weSkKQEAgLTAsMCArMSw0NDUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTUgQXBw
bGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1
c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZp
Y2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRp
b25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11
c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9m
IGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJp
YnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0
CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5n
IGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRl
cmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdB
UkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVT
UyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBU
SEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1Mg
Rk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5U
IFNIQUxMIEFQUExFIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBE
SVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBD
T05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICog
UFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0Us
IERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIg
Q0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09O
VFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5D
RSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0Yg
VEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNI
IERBTUFHRS4gCisgKi8KKworI2lmbmRlZiBBaXJBcmdfaAorI2RlZmluZSBBaXJBcmdfaAorCisj
aW5jbHVkZSAiQWlyVG1wLmgiCisKK25hbWVzcGFjZSBKU0MgeyBuYW1lc3BhY2UgQjMgeyBuYW1l
c3BhY2UgQWlyIHsKKworY2xhc3MgU3RhY2tTbG90OworCisvLyBUaGlzIGNsYXNzIG5hbWUgaXMg
YWxzbyBpbnRlbnRpb25hbGx5IHRlcnNlIGJlY2F1c2Ugd2Ugd2lsbCBzYXkgaXQgYSBsb3QuIFlv
dSdsbCBzZWUgY29kZSBsaWtlCisvLyBJbnN0KC4uLiwgQXJnOjppbW0oNSksIEFyZzo6YWRkcih0
aGluZywgYmxhaCksIC4uLikKK2NsYXNzIEFyZyB7CitwdWJsaWM6CisgICAgLy8gVGhlc2UgZW51
bSBtZW1iZXJzIGFyZSBpbnRlbnRpb25hbGx5IHRlcnNlIGJlY2F1c2Ugd2UgaGF2ZSB0byBtZW50
aW9uIHRoZW0gYSBsb3QuCisgICAgZW51bSBLaW5kIDogaW50OF90IHsKKyAgICAgICAgVG1wLAor
ICAgICAgICBJbW0sCisgICAgICAgIEltbVB0ciwKKyAgICAgICAgQWRkciwKKyAgICAgICAgU3Rh
Y2ssCisgICAgICAgIENhbGxBcmcsCisgICAgICAgIEluZGV4LAorICAgIH07CisKKyAgICBlbnVt
IFJvbGUgOiBpbnQ4X3QgeworICAgICAgICBVc2UsCisgICAgICAgIERlZiwKKyAgICAgICAgVXNl
RGVmCisgICAgfTsKKworICAgIGVudW0gVHlwZSA6IGludDhfdCB7CisgICAgICAgIEdQLAorICAg
ICAgICBGUAorICAgIH07CisKKyAgICBzdGF0aWMgYm9vbCBpc1VzZShSb2xlIHJvbGUpCisgICAg
eworICAgICAgICBzd2l0Y2ggKHJvbGUpIHsKKyAgICAgICAgY2FzZSBVc2U6CisgICAgICAgIGNh
c2UgVXNlRGVmOgorICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIGNhc2UgRGVmOgor
ICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgfQorCisgICAgc3RhdGlj
IGJvb2wgaXNEZWYoUm9sZSByb2xlKQorICAgIHsKKyAgICAgICAgc3dpdGNoIChyb2xlKSB7Cisg
ICAgICAgIGNhc2UgVXNlOgorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICBjYXNl
IERlZjoKKyAgICAgICAgY2FzZSBVc2VEZWY6CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAg
ICAgICAgfQorICAgIH0KKworICAgIEFyZygpCisgICAgeworICAgIH0KKworICAgIEFyZyhBaXI6
OlRtcCB0bXApCisgICAgICAgIDogbV9raW5kKFRtcCkKKyAgICAgICAgLCBtX2Jhc2UodG1wKQor
ICAgIHsKKyAgICB9CisKKyAgICBzdGF0aWMgQXJnIGltbShpbnRwdHJfdCB2YWx1ZSkKKyAgICB7
CisgICAgICAgIEFyZyByZXN1bHQ7CisgICAgICAgIHJlc3VsdC5tX2tpbmQgPSBJbW07CisgICAg
ICAgIHJlc3VsdC5tX29mZnNldCA9IHZhbHVlOworICAgICAgICByZXR1cm4gcmVzdWx0OworICAg
IH0KKworICAgIHN0YXRpYyBBcmcgaW1tUHRyKGludHB0cl90IHZhbHVlKQorICAgIHsKKyAgICAg
ICAgQXJnIHJlc3VsdDsKKyAgICAgICAgcmVzdWx0Lm1fa2luZCA9IEltbVB0cjsKKyAgICAgICAg
cmVzdWx0Lm1fb2Zmc2V0ID0gdmFsdWU7CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQor
CisgICAgc3RhdGljIEFyZyBhZGRyZXNzKEFpcjo6VG1wIGJhc2UsIGludDMyX3Qgb2Zmc2V0ID0g
MCkKKyAgICB7CisgICAgICAgIEFTU0VSVChiYXNlLmlzR1AoKSk7CisgICAgICAgIEFyZyByZXN1
bHQ7CisgICAgICAgIHJlc3VsdC5tX2tpbmQgPSBBZGRyOworICAgICAgICByZXN1bHQubV9iYXNl
ID0gYmFzZTsKKyAgICAgICAgcmVzdWx0Lm1fb2Zmc2V0ID0gb2Zmc2V0OworICAgICAgICByZXR1
cm4gcmVzdWx0OworICAgIH0KKworICAgIHN0YXRpYyBBcmcgc3RhY2soU3RhY2tTbG90KiB2YWx1
ZSwgaW50MzJfdCBvZmZzZXQgPSAwKQorICAgIHsKKyAgICAgICAgQXJnIHJlc3VsdDsKKyAgICAg
ICAgcmVzdWx0Lm1fa2luZCA9IFN0YWNrOworICAgICAgICByZXN1bHQubV9vZmZzZXQgPSBiaXR3
aXNlX2Nhc3Q8aW50cHRyX3Q+KHZhbHVlKTsKKyAgICAgICAgcmVzdWx0Lm1fc2NhbGUgPSBvZmZz
ZXQ7IC8vIEkga25vdywgeXVjay4KKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisKKyAg
ICBzdGF0aWMgQXJnIGNhbGxBcmcoaW50MzJfdCBvZmZzZXQpCisgICAgeworICAgICAgICBBcmcg
cmVzdWx0OworICAgICAgICByZXN1bHQubV9raW5kID0gQ2FsbEFyZzsKKyAgICAgICAgcmVzdWx0
Lm1fb2Zmc2V0ID0gb2Zmc2V0OworICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKworICAg
IHN0YXRpYyBib29sIGlzVmFsaWRTY2FsZSh1bnNpZ25lZCBzY2FsZSkKKyAgICB7CisgICAgICAg
IHN3aXRjaCAoc2NhbGUpIHsKKyAgICAgICAgY2FzZSAxOgorICAgICAgICBjYXNlIDI6CisgICAg
ICAgIGNhc2UgNDoKKyAgICAgICAgY2FzZSA4OgorICAgICAgICAgICAgcmV0dXJuIHRydWU7Cisg
ICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAg
ICB9CisKKyAgICBzdGF0aWMgdW5zaWduZWQgbG9nU2NhbGUodW5zaWduZWQgc2NhbGUpCisgICAg
eworICAgICAgICBzd2l0Y2ggKHNjYWxlKSB7CisgICAgICAgIGNhc2UgMToKKyAgICAgICAgICAg
IHJldHVybiAwOworICAgICAgICBjYXNlIDI6CisgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAg
ICAgY2FzZSA0OgorICAgICAgICAgICAgcmV0dXJuIDI7CisgICAgICAgIGNhc2UgODoKKyAgICAg
ICAgICAgIHJldHVybiAzOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgQVNTRVJUX05P
VF9SRUFDSEVEKCk7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorICAgIH0KKwor
ICAgIHN0YXRpYyBBcmcgaW5kZXgoQWlyOjpUbXAgYmFzZSwgQWlyOjpUbXAgaW5kZXgsIHVuc2ln
bmVkIHNjYWxlID0gMSwgaW50MzJfdCBvZmZzZXQgPSAwKQorICAgIHsKKyAgICAgICAgQVNTRVJU
KGJhc2UuaXNHUCgpKTsKKyAgICAgICAgQVNTRVJUKGluZGV4LmlzR1AoKSk7CisgICAgICAgIEFT
U0VSVChpc1ZhbGlkU2NhbGUoc2NhbGUpKTsKKyAgICAgICAgQXJnIHJlc3VsdDsKKyAgICAgICAg
cmVzdWx0Lm1fa2luZCA9IEluZGV4OworICAgICAgICByZXN1bHQubV9iYXNlID0gYmFzZTsKKyAg
ICAgICAgcmVzdWx0Lm1faW5kZXggPSBpbmRleDsKKyAgICAgICAgcmVzdWx0Lm1fc2NhbGUgPSBz
dGF0aWNfY2FzdDx1aW50OF90PihzY2FsZSk7CisgICAgICAgIHJlc3VsdC5tX29mZnNldCA9IG9m
ZnNldDsKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisKKyAgICBib29sIG9wZXJhdG9y
PT0oY29uc3QgQXJnJiBvdGhlcikgY29uc3QKKyAgICB7CisgICAgICAgIHJldHVybiBtX29mZnNl
dCA9PSBvdGhlci5tX29mZnNldAorICAgICAgICAgICAgJiYgbV9raW5kID09IG90aGVyLm1fa2lu
ZAorICAgICAgICAgICAgJiYgbV9iYXNlID09IG90aGVyLm1fYmFzZQorICAgICAgICAgICAgJiYg
bV9pbmRleCA9PSBvdGhlci5tX2luZGV4CisgICAgICAgICAgICAmJiBtX3NjYWxlID09IG90aGVy
Lm1fc2NhbGU7CisgICAgfQorCisgICAgYm9vbCBvcGVyYXRvciE9KGNvbnN0IEFyZyYgb3RoZXIp
IGNvbnN0CisgICAgeworICAgICAgICByZXR1cm4gISgqdGhpcyA9PSBvdGhlcik7CisgICAgfQor
CisgICAgZXhwbGljaXQgb3BlcmF0b3IgYm9vbCgpIGNvbnN0IHsgcmV0dXJuICp0aGlzICE9IEFy
ZygpOyB9CisKKyAgICBLaW5kIGtpbmQoKSBjb25zdAorICAgIHsKKyAgICAgICAgcmV0dXJuIG1f
a2luZDsKKyAgICB9CisKKyAgICBib29sIGlzVG1wKCkgY29uc3QKKyAgICB7CisgICAgICAgIHJl
dHVybiBraW5kKCkgPT0gVG1wOworICAgIH0KKworICAgIGJvb2wgaXNJbW0oKSBjb25zdAorICAg
IHsKKyAgICAgICAgcmV0dXJuIGtpbmQoKSA9PSBJbW07CisgICAgfQorCisgICAgYm9vbCBpc0lt
bVB0cigpIGNvbnN0CisgICAgeworICAgICAgICByZXR1cm4ga2luZCgpID09IEltbVB0cjsKKyAg
ICB9CisKKyAgICBib29sIGlzQWRkcigpIGNvbnN0CisgICAgeworICAgICAgICByZXR1cm4ga2lu
ZCgpID09IEFkZHI7CisgICAgfQorCisgICAgYm9vbCBpc0luZGV4KCkgY29uc3QKKyAgICB7Cisg
ICAgICAgIHJldHVybiBraW5kKCkgPT0gSW5kZXg7CisgICAgfQorCisgICAgQWlyOjpUbXAgdG1w
KCkgY29uc3QKKyAgICB7CisgICAgICAgIEFTU0VSVChraW5kKCkgPT0gVG1wKTsKKyAgICAgICAg
cmV0dXJuIG1fYmFzZTsKKyAgICB9CisKKyAgICBpbnRwdHJfdCB2YWx1ZSgpIGNvbnN0CisgICAg
eworICAgICAgICBBU1NFUlQoa2luZCgpID09IEltbSB8fCBraW5kKCkgPT0gSW1tUHRyKTsKKyAg
ICAgICAgcmV0dXJuIG1fb2Zmc2V0OworICAgIH0KKworICAgIEFpcjo6VG1wIGJhc2UoKSBjb25z
dAorICAgIHsKKyAgICAgICAgQVNTRVJUKGtpbmQoKSA9PSBBZGRyIHx8IGtpbmQoKSA9PSBJbmRl
eCk7CisgICAgICAgIHJldHVybiBtX2Jhc2U7CisgICAgfQorCisgICAgaW50MzJfdCBvZmZzZXQo
KSBjb25zdAorICAgIHsKKyAgICAgICAgaWYgKGtpbmQoKSA9PSBTdGFjaykKKyAgICAgICAgICAg
IHJldHVybiBzdGF0aWNfY2FzdDxpbnQzMl90PihtX3NjYWxlKTsKKyAgICAgICAgQVNTRVJUKGtp
bmQoKSA9PSBBZGRyIHx8IGtpbmQoKSA9PSBDYWxsQXJnIHx8IGtpbmQoKSA9PSBJbmRleCk7Cisg
ICAgICAgIHJldHVybiBzdGF0aWNfY2FzdDxpbnQzMl90PihtX29mZnNldCk7CisgICAgfQorCisg
ICAgU3RhY2tTbG90KiBzdGFja1Nsb3QoKSBjb25zdAorICAgIHsKKyAgICAgICAgQVNTRVJUKGtp
bmQoKSA9PSBTdGFjayk7CisgICAgICAgIHJldHVybiBiaXR3aXNlX2Nhc3Q8U3RhY2tTbG90Kj4o
bV9vZmZzZXQpOworICAgIH0KKworICAgIEFpcjo6VG1wIGluZGV4KCkgY29uc3QKKyAgICB7Cisg
ICAgICAgIEFTU0VSVChraW5kKCkgPT0gSW5kZXgpOworICAgICAgICByZXR1cm4gbV9pbmRleDsK
KyAgICB9CisKKyAgICB1bnNpZ25lZCBzY2FsZSgpIGNvbnN0CisgICAgeworICAgICAgICBBU1NF
UlQoa2luZCgpID09IEluZGV4KTsKKyAgICAgICAgcmV0dXJuIG1fc2NhbGU7CisgICAgfQorCisg
ICAgdW5zaWduZWQgbG9nU2NhbGUoKSBjb25zdAorICAgIHsKKyAgICAgICAgcmV0dXJuIGxvZ1Nj
YWxlKHNjYWxlKCkpOworICAgIH0KKworICAgIGJvb2wgaXNHUFRtcCgpIGNvbnN0CisgICAgewor
ICAgICAgICByZXR1cm4gaXNUbXAoKSAmJiB0bXAoKS5pc0dQKCk7CisgICAgfQorCisgICAgYm9v
bCBpc0ZQVG1wKCkgY29uc3QKKyAgICB7CisgICAgICAgIHJldHVybiBpc1RtcCgpICYmIHRtcCgp
LmlzRlAoKTsKKyAgICB9CisgICAgCisgICAgLy8gVGVsbHMgdXMgaWYgdGhpcyBBcmcgY2FuIGJl
IHVzZWQgaW4gYSBwb3NpdGlvbiB0aGF0IHJlcXVpcmVzIGEgR1AgdmFsdWUuCisgICAgYm9vbCBp
c0dQKCkgY29uc3QKKyAgICB7CisgICAgICAgIHN3aXRjaCAoa2luZCgpKSB7CisgICAgICAgIGNh
c2UgSW1tOgorICAgICAgICBjYXNlIEltbVB0cjoKKyAgICAgICAgY2FzZSBBZGRyOgorICAgICAg
ICBjYXNlIEluZGV4OgorICAgICAgICBjYXNlIFN0YWNrU2xvdDoKKyAgICAgICAgY2FzZSBDYWxs
QXJnOgorICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIGNhc2UgVG1wOgorICAgICAg
ICAgICAgcmV0dXJuIGlzR1BUbXAoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIFRlbGxz
IHVzIGlmIHRoaXMgQXJnIGNhbiBiZSB1c2VkIGluIGEgcG9zaXRpb24gdGhhdCByZXF1aXJlcyBh
IEZQIHZhbHVlLgorICAgIGJvb2wgaXNGUCgpIGNvbnN0CisgICAgeworICAgICAgICBzd2l0Y2gg
KGtpbmQoKSkgeworICAgICAgICBjYXNlIEltbToKKyAgICAgICAgY2FzZSBJbW1QdHI6CisgICAg
ICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIGNhc2UgQWRkcjoKKyAgICAgICAgY2FzZSBJ
bmRleDoKKyAgICAgICAgY2FzZSBCYXNlOgorICAgICAgICBjYXNlIFN0YWNrU2xvdDoKKyAgICAg
ICAgY2FzZSBDYWxsQXJnOgorICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIGNhc2Ug
VG1wOgorICAgICAgICAgICAgcmV0dXJuIGlzRlBUbXAoKTsKKyAgICAgICAgfQorICAgIH0KKwor
ICAgIGJvb2wgaXNHUFIoKSBjb25zdAorICAgIHsKKyAgICAgICAgcmV0dXJuIGlzVG1wKCkgJiYg
dG1wKCkuaXNHUFIoKTsKKyAgICB9CisKKyAgICBHUFJSZWcgZ3ByKCkgY29uc3QKKyAgICB7Cisg
ICAgICAgIHJldHVybiB0bXAoKS5ncHIoKTsKKyAgICB9CisKKyAgICBib29sIGlzRlBSKCkgY29u
c3QKKyAgICB7CisgICAgICAgIHJldHVybiBpc1RtcCgpICYmIHRtcCgpLmlzRlBSKCk7CisgICAg
fQorCisgICAgRlBSUmVnIGZwcigpIGNvbnN0CisgICAgeworICAgICAgICByZXR1cm4gdG1wKCku
ZnByKCk7CisgICAgfQorICAgIAorICAgIGJvb2wgaXNSZWcoKSBjb25zdAorICAgIHsKKyAgICAg
ICAgcmV0dXJuIGlzVG1wKCkgJiYgdG1wKCkuaXNSZWcoKTsKKyAgICB9CisKKyAgICBSZWcgcmVn
KCkgY29uc3QKKyAgICB7CisgICAgICAgIHJldHVybiB0bXAoKS5yZWcoKTsKKyAgICB9CisKKyAg
ICB1bnNpZ25lZCBncFRtcEluZGV4KCkgY29uc3QKKyAgICB7CisgICAgICAgIHJldHVybiB0bXAo
KS5ncFRtcEluZGV4KCk7CisgICAgfQorCisgICAgdW5zaWduZWQgZnBUbXBJbmRleCgpIGNvbnN0
CisgICAgeworICAgICAgICByZXR1cm4gdG1wKCkuZnBUbXBJbmRleCgpOworICAgIH0KKworICAg
IHVuc2lnbmVkIHRtcEluZGV4KCkgY29uc3QKKyAgICB7CisgICAgICAgIHJldHVybiB0bXAoKS50
bXBJbmRleCgpOworICAgIH0KKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIEZ1bmN0b3I+CisgICAg
dm9pZCBmb3JFYWNoVG1wRmFzdChjb25zdCBGdW5jdG9yJiBmdW5jdG9yKQorICAgIHsKKyAgICAg
ICAgc3dpdGNoIChtX2tpbmQpIHsKKyAgICAgICAgY2FzZSBUbXA6CisgICAgICAgIGNhc2UgQWRk
cjoKKyAgICAgICAgICAgIGZ1bmN0b3IobV9iYXNlKTsKKyAgICAgICAgICAgIGJyZWFrOworICAg
ICAgICBjYXNlIEluZGV4OgorICAgICAgICAgICAgZnVuY3RvcihtX2Jhc2UpOworICAgICAgICAg
ICAgZnVuY3RvcihtX2luZGV4KTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0
OgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBUaGlzIGlz
IHNtYXJ0IGVub3VnaCB0byBrbm93IHRoYXQgYW4gYWRkcmVzcyBhcmcgaW4gYSBEZWYgb3IgVXNl
RGVmIHJ1bGUgd2lsbCB1c2UgaXRzCisgICAgLy8gdG1wcyBhbmQgbmV2ZXIgZGVmIHRoZW0uIEZv
ciBleGFtcGxlLCB0aGlzOgorICAgIC8vCisgICAgLy8gbW92ICVyYXgsICglcmN4KQorICAgIC8v
CisgICAgLy8gVGhpcyBkZWZzICglcmN4KSBidXQgdXNlcyAlcmN4LgorICAgIHRlbXBsYXRlPHR5
cGVuYW1lIEZ1bmN0b3I+CisgICAgdm9pZCBmb3JFYWNoVG1wKFJvbGUgYXJnUm9sZSwgVHlwZSBh
cmdUeXBlLCBjb25zdCBGdW5jdG9yJiBmdW5jdG9yKQorICAgIHsKKyAgICAgICAgc3dpdGNoICht
X2tpbmQpIHsKKyAgICAgICAgY2FzZSBUbXA6CisgICAgICAgICAgICBmdW5jdG9yKG1fYmFzZSwg
YXJnUm9sZSwgYXJnVHlwZSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBBZGRy
OgorICAgICAgICAgICAgZnVuY3RvcihtX2Jhc2UsIFVzZSwgR1ApOworICAgICAgICAgICAgYnJl
YWs7CisgICAgICAgIGNhc2UgSW5kZXg6CisgICAgICAgICAgICBmdW5jdG9yKG1fYmFzZSwgVXNl
LCBHUCk7CisgICAgICAgICAgICBmdW5jdG9yKG1faW5kZXgsIFVzZSwgR1ApOworICAgICAgICAg
ICAgYnJlYWs7CisgICAgICAgIGRlZmF1dDoKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9
CisgICAgfQorCisgICAgTWFjcm9Bc3NlbWJsZXI6OlRydXN0ZWRJbW0zMiBhc1RydXN0ZWRJbW0z
MigpIGNvbnN0CisgICAgeworICAgICAgICBBU1NFUlQoaXNJbW0oKSk7CisgICAgICAgIHJldHVy
biBNYWNyb0Fzc2VtYmxlcjo6VHJ1c3RlZEltbTMyKHN0YXRpY19jYXN0PGludDMyX3Q+KG1fb2Zm
c2V0KSk7CisgICAgfQorCisgICAgTWFjcm9Bc3NlbWJsZXI6OlRydXN0ZWRJbW0zMiBhc1RydXN0
ZWRJbW1QdHIoKSBjb25zdAorICAgIHsKKyAgICAgICAgQVNTRVJUKGlzSW1tUHRyKCkpOworICAg
ICAgICByZXR1cm4gTWFjcm9Bc3NlbWJsZXI6OlRydXN0ZWRJbW1QdHIobV9vZmZzZXQpOworICAg
IH0KKworICAgIE1hY3JvQXNzZW1ibGVyOjpBZGRyZXNzIGFzQWRkcmVzcygpIGNvbnN0CisgICAg
eworICAgICAgICBBU1NFUlQoaXNBZGRyKCkpOworICAgICAgICByZXR1cm4gTWFjcm9Bc3NlbWJs
ZXI6OkFkZHJlc3MobV9iYXNlLmdwcigpLCBzdGF0aWNfY2FzdDxpbnQzMl90PihtX29mZnNldCkp
OworICAgIH0KKworICAgIE1hY3JvQXNzZW1ibGVyOjpCYXNlSW5kZXggYXNCYXNlSW5kZXgoKSBj
b25zdAorICAgIHsKKyAgICAgICAgQVNTRVJUKGlzSW5kZXgoKSk7CisgICAgICAgIHJldHVybiBN
YWNyb0Fzc2VtYmxlcjo6QmFzZUluZGV4KAorICAgICAgICAgICAgbV9iYXNlLmdwcigpLCBtX2lu
ZGV4LmdwcigpLCBzdGF0aWNfY2FzdDxNYWNyb0Fzc2VtYmxlcjo6U2NhbGU+KGxvZ1NjYWxlKCkp
LAorICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50MzJfdD4obV9vZmZzZXQpKTsKKyAgICB9CisK
KyAgICB2b2lkIGR1bXAoUHJpbnRTdHJlYW0mKSBjb25zdDsKKworcHJpdmF0ZToKKyAgICBpbnRw
dHJfdCBtX29mZnNldCB7IDAgfTsKKyAgICBLaW5kIG1fa2luZCB7IEltbSB9OworICAgIGludDMy
X3QgbV9zY2FsZSB7IDEgfTsKKyAgICBBaXI6OlRtcCBtX2Jhc2U7CisgICAgQWlyOjpUbXAgbV9p
bmRleDsKK307CisKK30gfSB9IC8vIG5hbWVzcGFjZSBKU0M6OkIzOjpBaXIKKworI2VuZGlmIC8v
IEFpckFyZ19oCisKSW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9haXIvQWlyQmFzaWNC
bG9jay5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL2Fpci9BaXJC
YXNpY0Jsb2NrLmNwcAkocmV2aXNpb24gMCkKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9h
aXIvQWlyQmFzaWNCbG9jay5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSw0NCBAQAorLyoK
KyAqIENvcHlyaWdodCAoQykgMjAxNSBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisg
KgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywg
d2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQg
dGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3Ry
aWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAor
ICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBk
aXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVw
cm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNv
bmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3Vt
ZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmli
dXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIGBg
QVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVE
SU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1F
UkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFS
RSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUgorICogQ09OVFJJ
QlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQ
RUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5H
LCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RT
IE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lO
RVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9G
IExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9S
VAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkg
V0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQg
T0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLiAKKyAqLworCisjaW5jbHVkZSAiY29u
ZmlnLmgiCisjaW5jbHVkZSAiQWlyQmFzaWNCbG9jay5oIgorCituYW1lc3BhY2UgSlNDIHsgbmFt
ZXNwYWNlIEIzIHsgbmFtZXNwYWNlIEFpciB7CisKK3ZvaWQgQmFzaWNCbG9jazo6ZHVtcChQcmlu
dFN0cmVhbSYgb3V0KSBjb25zdAoreworICAgIG91dC5wcmludChkdW1wUHJlZml4LCBtX2luZGV4
KTsKK30KKwordm9pZCBCYXNpY0Jsb2NrOjpkZWVwRHVtcChQcmludFN0cmVhbSYgb3V0KSBjb25z
dAoreworICAgIG91dC5wcmludCgiQkIiLCAqdGhpcywgIjpcbiIpOworICAgIGZvciAoY29uc3Qg
SW5zdCYgaW5zdCA6ICp0aGlzKQorICAgICAgICBvdXQucHJpbnQoIiAgICAiLCBpbnN0LCAiXG4i
KTsKK30KKworfSB9IH0gLy8gbmFtZXNwYWNlIEpTQzo6QjM6OkFpcgorCkluZGV4OiBTb3VyY2Uv
SmF2YVNjcmlwdENvcmUvYjMvYWlyL0FpckJhc2ljQmxvY2suaAo9PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3Vy
Y2UvSmF2YVNjcmlwdENvcmUvYjMvYWlyL0FpckJhc2ljQmxvY2suaAkocmV2aXNpb24gMCkKKysr
IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9haXIvQWlyQmFzaWNCbG9jay5oCSh3b3JraW5nIGNv
cHkpCkBAIC0wLDAgKzEsMTIxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE1IEFwcGxlIElu
Yy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGlu
IHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlv
biwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwor
ICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJl
dGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25k
aXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlv
bnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICog
ICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNj
bGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxz
IHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElT
IFBST1ZJREVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1Ig
SU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisg
KiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBB
IFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFM
TCBBUFBMRSBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNU
LCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VR
VUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NV
UkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRB
LCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNF
RCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNU
LCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1Ig
T1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMg
U09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1B
R0UuIAorICovCisKKyNpZm5kZWYgQWlyQmFzaWNCbG9ja19oCisjZGVmaW5lIEFpckJhc2ljQmxv
Y2tfaAorCisjaW5jbHVkZSAiQWlySW5zdC5oIgorI2luY2x1ZGUgPHd0Zi9Ob25Db3B5YWJsZS5o
PgorI2luY2x1ZGUgPHd0Zi9GYXN0TWFsbG9jLmg+CisKK25hbWVzcGFjZSBKU0MgeyBuYW1lc3Bh
Y2UgQjMgeyBuYW1lc3BhY2UgQWlyIHsKKworY2xhc3MgQ29kZTsKKworY2xhc3MgQmFzaWNCbG9j
ayB7CisgICAgV1RGX01BS0VfTk9OQ09QWUFCTEUoQmFzaWNCbG9jayk7CisgICAgV1RGX01BS0Vf
RkFTVF9BTExPQ0FURUQ7CitwdWJsaWM6CisgICAgc3RhdGljIGNvbnN0IGNoYXIqIGR1bXBQcmVm
aXggPSAiIyI7CisKKyAgICB0eXBlZGVmIFZlY3RvcjxJbnN0PiBJbnN0TGlzdDsKKyAgICB0eXBl
ZGVmIFZlY3RvcjxCYXNpY0Jsb2NrKiwgMj4gU3VjY2Vzc29yTGlzdDsKKyAgICAKKyAgICB1bnNp
Z25lZCBzaXplKCkgY29uc3QgeyByZXR1cm4gbV9pbnN0cy5zaXplKCk7IH0KKyAgICBJbnN0TGlz
dDo6aXRlcmF0b3IgYmVnaW4oKSB7IHJldHVybiBtX2luc3RzLmJlZ2luKCk7IH0KKyAgICBJbnN0
TGlzdDo6aXRlcmF0b3IgZW5kKCkgeyByZXR1cm4gbV9pbnN0cy5lbmQoKTsgfQorICAgIEluc3RM
aXN0Ojpjb25zdF9pdGVyYXRvciBiZWdpbigpIGNvbnN0IHsgcmV0dXJuIG1faW5zdHMuYmVnaW4o
KTsgfQorICAgIEluc3RMaXN0Ojpjb25zdF9pdGVyYXRvciBlbmQoKSBjb25zdCB7IHJldHVybiBt
X2luc3RzLmVuZCgpOyB9CisKKyAgICBzaXplX3Qgc2l6ZSgpIGNvbnN0IHsgcmV0dXJuIG1faW5z
dHMuc2l6ZSgpOyB9CisgICAgY29uc3QgSW5zdCYgYXQoc2l6ZV90IGluZGV4KSBjb25zdCB7IHJl
dHVybiBtX2luc3RzW2luZGV4XTsgfQorICAgIEluc3QmIGF0KHNpemVfdCBpbmRleCkgeyByZXR1
cm4gbV9pbnN0c1tpbmRleF07IH0KKworICAgIGNvbnN0IEluc3QmIGxhc3QoKSBjb25zdCB7IHJl
dHVybiBtX2luc3RzLmxhc3QoKTsgfQorICAgIEluc3QmIGxhc3QoKSB7IHJldHVybiBtX2luc3Rz
Lmxhc3QoKTsgfQorCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgSW5zdD4KKyAgICB2b2lkIGFwcGVu
ZEluc3QoSW5zdCYmIGluc3QpCisgICAgeworICAgICAgICBtX2luc3RzLmFwcGVuZChzdGQ6OmZv
cndhcmQ8SW5zdD4oaW5zdCkpOworICAgIH0KKworICAgIHRlbXBsYXRlPHR5cGVuYW1lLi4uIEFy
Z3VtZW50cz4KKyAgICB2b2lkIGFwcGVuZChBcmd1bWVudHMmJi4uLiBhcmd1bWVudHMpCisgICAg
eworICAgICAgICBtX2luc3RzLmFwcGVuZChJbnN0KHN0ZDo6Zm9yd2FyZDxBcmd1bWVudHM+KGFy
Z3VtZW50cykuLi4pKTsKKyAgICB9CisKKyAgICAvLyBUaGUgIjAiIGNhc2UgaXMgdGhlIGNhc2Ug
dG8gd2hpY2ggdGhlIGJyYW5jaCBqdW1wcywgc28gdGhlICJ0aGVuIiBjYXNlLiBUaGUgIjEiIGNh
c2UgaXMgdGhlCisgICAgLy8gImVsc2UiIGNhc2UsIGFuZCBpcyB1c2VkIHRvIHJlcHJlc2VudCB0
aGUgZmFsbC10aHJvdWdoIG9mIGEgY29uZGl0aW9uYWwgYnJhbmNoLgorICAgIHVuc2lnbmVkIG51
bVN1Y2Nlc3NvcnMoKSBjb25zdCB7IHJldHVybiBtX3N1Y2Nlc3NvcnMuc2l6ZSgpOyB9CisgICAg
QmFzaWNCbG9jayogc3VjY2Vzc29yKHVuc2lnbmVkIGluZGV4KSBjb25zdCB7IHJldHVybiBtX3N1
Y2Nlc3NvcnNbaW5kZXhdOyB9CisgICAgQmFzaWNCbG9jayomIHN1Y2Nlc3Nvcih1bnNpZ25lZCBp
bmRleCkgeyByZXR1cm4gbV9zdWNjZXNzb3JzW2luZGV4XTsgfQorICAgIGNvbnN0IFN1Y2Nlc3Nv
ckxpc3QmIHN1Y2Nlc3NvcnMoKSBjb25zdCB7IHJldHVybiBtX3N1Y2Nlc3NvcnNbaW5kZXhdOyB9
CisgICAgU3VjY2Vzc29yTGlzdCYgc3VjY2Vzc29ycygpIHsgcmV0dXJuIG1fc3VjY2Vzc29yc1tp
bmRleF07IH0KKworICAgIHZvaWQgZHVtcChQcmludFN0cmVhbSYpIGNvbnN0OworICAgIHZvaWQg
ZGVlcER1bXAoUHJpbnRTdHJlYW0mKSBjb25zdDsKKworcHJpdmF0ZToKKyAgICBmcmllbmQgY2xh
c3MgQ29kZTsKKyAgICAKKyAgICBCYXNpY0Jsb2NrKHVuc2lnbmVkIGluZGV4KQorICAgIHsKKyAg
ICB9CisKKyAgICB1bnNpZ25lZCBtX2luZGV4OworICAgIEluc3RMaXN0IG1faW5zdHM7CisgICAg
U3VjY2Vzc29yTGlzdCBtX3N1Y2Nlc3NvcnM7Cit9OworCitjbGFzcyBEZWVwQmFzaWNCbG9ja0R1
bXAgeworcHVibGljOgorICAgIERlZXBCYXNpY0Jsb2NrRHVtcChCYXNpY0Jsb2NrKiBibG9jaykK
KyAgICAgICAgOiBtX2Jsb2NrKGJsb2NrKQorICAgIHsKKyAgICB9CisKKyAgICB2b2lkIGR1bXAo
UHJpbnRTdHJlYW0mIG91dCkgY29uc3QKKyAgICB7CisgICAgICAgIGlmIChtX2Jsb2NrKQorICAg
ICAgICAgICAgbV9ibG9jay0+ZGVlcER1bXAob3V0KTsKKyAgICAgICAgZWxzZQorICAgICAgICAg
ICAgb3V0LnByaW50KCI8bnVsbD4iKTsKKyAgICB9CisKK3ByaXZhdGU6CisgICAgQmFzaWNCbG9j
ayogbV9ibG9jazsKK307CisKK0RlZXBCYXNpY0Jsb2NrRHVtcCBkZWVwRHVtcChCYXNpY0Jsb2Nr
KiBibG9jaykKK3sKKyAgICByZXR1cm4gRGVlcEJhc2ljQmxvY2tEdW1wKGJsb2NrKTsKK30KKwor
fSB9IH0gLy8gbmFtZXNwYWNlIEpTQzo6QjM6OkFpcgorCisjZW5kaWYgLy8gQWlyQmFzaWNCbG9j
a19oCisKSW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9haXIvQWlyQ29kZS5jcHAKPT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL2Fpci9BaXJDb2RlLmNwcAkocmV2
aXNpb24gMCkKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9haXIvQWlyQ29kZS5jcHAJKHdv
cmtpbmcgY29weSkKQEAgLTAsMCArMSw1OSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNSBB
cHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5k
IHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2Rp
ZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRp
dGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUg
bXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qg
b2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0
cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmln
aHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dp
bmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1h
dGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZU
V0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBS
RVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8s
IFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVT
UyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZF
TlQgU0hBTEwgQVBQTEUgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5Z
IERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9S
IENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisg
KiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVT
RSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZF
UiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBD
T05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdF
TkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBP
RiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNV
Q0ggREFNQUdFLiAKKyAqLworCisjaW5jbHVkZSAiY29uZmlnLmgiCisjaW5jbHVkZSAiQWlyQ29k
ZS5oIgorCituYW1lc3BhY2UgSlNDIHsgbmFtZXNwYWNlIEIzIHsgbmFtZXNwYWNlIEFpciB7CisK
K0NvZGU6OkNvZGUoKQoreworfQorCitDb2RlOjp+Q29kZSgpCit7Cit9CisKK0Jhc2ljQmxvY2sq
IENvZGU6OmFkZEJsb2NrKCkKK3sKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8QmFzaWNCbG9jaz4gYmxv
Y2sobmV3IEJhc2ljQmxvY2sobV9ibG9ja3Muc2l6ZSgpKSk7CisgICAgQmFzaWNCbG9jayogcmVz
dWx0ID0gYmxvY2suZ2V0KCk7CisgICAgbV9ibG9ja3MuYXBwZW5kKFdURjo6bW92ZShibG9jaykp
OworICAgIHJldHVybiByZXN1bHQ7Cit9CisKK3ZvaWQgQ29kZTo6ZHVtcChQcmludFN0cmVhbSYg
b3V0KSBjb25zdAoreworICAgIGZvciAoQmFzaWNCbG9jayogYmxvY2sgOiAqdGhpcykKKyAgICAg
ICAgb3V0LnByaW50KGRlZXBEdW1wKGJsb2NrKSk7CisgICAgaWYgKG51bVN0YWNrU2xvdHMoKSkg
eworICAgICAgICBvdXQucHJpbnQoIlN0YWNrIHNsb3RzOlxuIik7CisgICAgICAgIGZvciAoU3Rh
Y2tTbG90KiBzbG90IDogc3RhY2tTbG90cygpKQorICAgICAgICAgICAgb3V0LnByaW50KCIgICAg
IiwgZGVlcER1bXAoc2xvdCksICJcbiIpOworICAgIH0KK30KKworfSB9IH0gLy8gbmFtZXNwYWNl
IEpTQzo6QjM6OkFpcgorCkluZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvYWlyL0FpckNv
ZGUuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvYWlyL0FpckNvZGUu
aAkocmV2aXNpb24gMCkKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9haXIvQWlyQ29kZS5o
CSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsMTE2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAy
MDE1IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlv
biBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAq
IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcg
Y29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2Ug
Y29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMg
bGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBS
ZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNv
cHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZv
bGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3Ro
ZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElT
IFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAq
IEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRF
RCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBG
SVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBO
TyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZP
UiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFS
WSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBU
TywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1Mg
T0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBI
T1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVS
IElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5F
R0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UK
KyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkg
T0YgU1VDSCBEQU1BR0UuIAorICovCisKKyNpZm5kZWYgQWlyQ29kZV9oCisjZGVmaW5lIEFpckNv
ZGVfaAorCisjaW5jbHVkZSAiQWlyQmFzaWNCbG9jay5oIgorCituYW1lc3BhY2UgSlNDIHsgbmFt
ZXNwYWNlIEIzIHsKKworY2xhc3MgUHJvY2VkdXJlOworCituYW1lc3BhY2UgQWlyIHsKKworLy8g
VGhpcyBpcyBhbiBJUiB0aGF0IGlzIHZlcnkgY2xvc2UgdG8gdGhlIGJhcmUgbWV0YWwuIEl0IHJl
cXVpcmVzIGFib3V0IDQweCBtb3JlIGJ5dGVzIHRoYW4gdGhlCisvLyBnZW5lcmF0ZWQgbWFjaGlu
ZSBjb2RlIC0gZm9yIGV4YW1wbGUgaWYgeW91J3JlIGdlbmVyYXRpbmcgMU1CIG9mIG1hY2hpbmUg
Y29kZSwgeW91IG5lZWQgYWJvdXQKKy8vIDQwTUIgb2YgQWlyLgorCitjbGFzcyBDb2RlIHsKKyAg
ICBXVEZfTUFLRV9OT05DT1BZQUJMRShDb2RlKTsKKyAgICBXVEZfTUFLRV9GQVNUX0FMTE9DQVRF
RDsKK3B1YmxpYzoKKyAgICBDb2RlKCk7CisgICAgfkNvZGUoKTsKKworICAgIEJhc2ljQmxvY2sq
IGFkZEJsb2NrKCk7CisKKyAgICBTdGFja1Nsb3QqIGFkZFN0YWNrU2xvdCgpOworCisgICAgdm9p
ZCBkdW1wKFByaW50U3RyZWFtJikgY29uc3Q7CisKKyAgICB1bnNpZ25lZCBzaXplKCkgY29uc3Qg
eyByZXR1cm4gbV9ibG9ja3Muc2l6ZSgpOyB9CisgICAgQmFzaWNCbG9jayogYXQodW5zaWduZWQg
aW5kZXgpIGNvbnN0IHsgcmV0dXJuIG1fYmxvY2tzW2luZGV4XTsgfQorICAgIEJhc2ljQmxvY2sq
IG9wZXJhdG9yW10odW5zaWduZWQgaW5kZXgpIGNvbnN0IHsgcmV0dXJuIGF0KGluZGV4KTsgfQor
CisgICAgY2xhc3MgaXRlcmF0b3IgeworICAgIHB1YmxpYzoKKyAgICAgICAgaXRlcmF0b3IoKToK
KyAgICAgICAgICAgIDogbV9wcm9jZWR1cmUobnVsbHB0cikKKyAgICAgICAgICAgICwgbV9pbmRl
eCgwKQorICAgICAgICB7CisgICAgICAgIH0KKworICAgICAgICBpdGVyYXRvcihQcm9jZWR1cmUm
IHByb2NlZHVyZSwgdW5zaWduZWQgaW5kZXgpCisgICAgICAgICAgICA6IG1fcHJvY2VkdXJlKCZw
cm9jZWR1cmUpCisgICAgICAgICAgICAsIG1faW5kZXgoaW5kZXgpCisgICAgICAgIHsKKyAgICAg
ICAgfQorCisgICAgICAgIEJhc2ljQmxvY2sqIG9wZXJhdG9yKigpCisgICAgICAgIHsKKyAgICAg
ICAgICAgIHJldHVybiBtX3Byb2NlZHVyZS0+YXQobV9pbmRleCk7CisgICAgICAgIH0KKworICAg
ICAgICBpdGVyYXRvciYgb3BlcmF0b3IrKygpCisgICAgICAgIHsKKyAgICAgICAgICAgIG1faW5k
ZXggPSBmaW5kTmV4dChtX2luZGV4ICsgMSk7CisgICAgICAgICAgICByZXR1cm4gKnRoaXM7Cisg
ICAgICAgIH0KKworICAgICAgICBib29sIG9wZXJhdG9yPT0oY29uc3QgaXRlcmF0b3ImIG90aGVy
KSBjb25zdAorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gbV9pbmRleCA9PSBvdGhlci5t
X2luZGV4OworICAgICAgICB9CisKKyAgICAgICAgYm9vbCBvcGVyYXRvciE9KGNvbnN0IGl0ZXJh
dG9yJiBvdGhlcikgY29uc3QKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuICEoKnRoaXMg
PT0gb3RoZXIpOworICAgICAgICB9CisKKyAgICBwcml2YXRlOgorICAgICAgICB1bnNpZ25lZCBm
aW5kTmV4dCh1bnNpZ25lZCBpbmRleCkKKyAgICAgICAgeworICAgICAgICAgICAgd2hpbGUgKGlu
ZGV4IDwgbV9wcm9jZWR1cmUtPnNpemUoKSAmJiAhbV9wcm9jZWR1cmUtPmF0KGluZGV4KSkKKyAg
ICAgICAgICAgICAgICBpbmRleCsrOworICAgICAgICAgICAgcmV0dXJuIGluZXg7CisgICAgICAg
IH0KKworICAgICAgICBQcm9jZWR1cmUqIG1fcHJvY2VkdXJlOworICAgICAgICB1bnNpZ25lZCBt
X2luZGV4OworICAgIH07CisKKyAgICBpdGVyYXRvciBiZWdpbigpIGNvbnN0IHsgcmV0dXJuIGl0
ZXJhdG9yKCp0aGlzLCAwKTsgfQorICAgIGl0ZXJhdG9yIGVuZCgpIGNvbnN0IHsgcmV0dXJuIGl0
ZXJhdG9yKCp0aGlzLCBudW1CbG9ja3MoKSk7IH0KKworcHJpdmF0ZToKKyAgICBWZWN0b3I8c3Rk
Ojp1bmlxdWVfcHRyPFN0YWNrU2xvdD4+IG1fc3RhY2tTbG90czsKKyAgICBWZWN0b3I8c3RkOjp1
bmlxdWVfcHRyPEJhc2ljQmxvY2s+PiBtX2Jsb2NrczsKK307CisKK30gfSB9IC8vIG5hbWVzcGFj
ZSBKU0M6OkIzOjpBaXIKKworI2VuZGlmIC8vIEFpckNvZGVfaAorCkluZGV4OiBTb3VyY2UvSmF2
YVNjcmlwdENvcmUvYjMvYWlyL0Fpckluc3QuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZh
U2NyaXB0Q29yZS9iMy9haXIvQWlySW5zdC5jcHAJKHJldmlzaW9uIDApCisrKyBTb3VyY2UvSmF2
YVNjcmlwdENvcmUvYjMvYWlyL0Fpckluc3QuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEs
NDAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTUgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJl
c2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5h
cnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVk
IHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICog
MS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBj
b3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBm
b2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9y
bSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMg
bGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisg
KiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0
aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQ
TEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJ
RVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFO
VElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICog
UFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IK
KyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJ
REVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMg
KElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJ
VFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRT
OyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhF
T1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJ
VFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJ
TkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJ
RiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKworI2lu
Y2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgIkFpckluc3QuaCIKKworI2luY2x1ZGUgIkIzVmFs
dWUuaCIKKyNpbmNsdWRlIDx3dGYvTGlzdER1bXAuaD4KKworbmFtZXNwYWNlIEpTQyB7IG5hbWVz
cGFjZSBCMyB7IG5hbWVzcGFjZSBBaXIgeworCit2b2lkIEluc3Q6OmR1bXAoUHJpbnRTdHJlYW0m
IG91dCkgY29uc3QKK3sKKyAgICBvdXQucHJpbnQob3Bjb2RlLCAiICIsIGxpc3REdW1wKGFyZ3Mp
LCAiICA7ICIsICpvcmlnaW4pOworfQorCit9IH0gfSAvLyBuYW1lc3BhY2UgSlNDOjpCMzo6QWly
CisKSW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9haXIvQWlySW5zdC5oCj09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9haXIvQWlySW5zdC5oCShyZXZpc2lvbiAw
KQorKysgU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL2Fpci9BaXJJbnN0LmgJKHdvcmtpbmcgY29w
eSkKQEAgLTAsMCArMSwxMjkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTUgQXBwbGUgSW5j
LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4g
c291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9u
LCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisg
KiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0
YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRp
dGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9u
cyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAg
ICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2Ns
YWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMg
cHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMg
UFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJ
TVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAq
IElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEg
UEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxM
IEFQUExFIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1Qs
IElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFV
RU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VS
RU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEs
IE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VE
IEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1Qs
IFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBP
VEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBT
T0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFH
RS4gCisgKi8KKworI2lmbmRlZiBBaXJJbnN0X2gKKyNkZWZpbmUgQWlySW5zdF9oCisKKyNpbmNs
dWRlICJBaXJBcmcuaCIKKyNpbmNsdWRlICJBaXJPcGNvZGUuaCIKKworbmFtZXNwYWNlIEpTQyB7
IG5hbWVzcGFjZSBCMyB7CisKK2NsYXNzIFZhbHVlOworCituYW1lc3BhY2UgQWlyIHsKKworc3Ry
dWN0IEluc3QgeworcHVibGljOgorICAgIHR5cGVkZWYgVmVjdG9yPEFyZywgMz4gQXJnTGlzdDsK
KworICAgIEluc3QoT3Bjb2RlIG9wY29kZSwgVmFsdWUqIG9yaWdpbikKKyAgICAgICAgOiBvcmln
aW4ob3JpZ2luKQorICAgICAgICAsIG9wY29kZShvcGNvZGUpCisgICAgeworICAgIH0KKyAgICAK
KyAgICB0ZW1wbGF0ZTx0eXBlbmFtZS4uLiBBcmd1bWVudHM+CisgICAgSW5zdChPcGNvZGUgb3Bj
b2RlLCBWYWx1ZSogb3JpZ2luLCBBcmcgYXJnLCBBcmd1bWVudHMuLi4gYXJndW1lbnRzKQorICAg
ICAgICA6IGFyZ3N7IGFyZywgYXJndW1lbnRzLi4uIH0KKyAgICAgICAgLCBvcmlnaW4ob3JpZ2lu
KQorICAgICAgICAsIG9wY29kZShvcGNvZGUpCisgICAgeworICAgIH0KKworICAgIEluc3QoT3Bj
b2RlIG9wY29kZSwgVmFsdWUqIG9yaWdpbiwgY29uc3QgQXJnTGlzdCYgYXJndW1lbnRzKQorICAg
ICAgICA6IGFyZ3MoYXJncykKKyAgICAgICAgLCBvcmlnaW4ob3JpZ2luKQorICAgICAgICAsIG9w
Y29kZShvcGNvZGUpCisgICAgeworICAgIH0KKworICAgIC8vIE5vdGUgdGhhdCB0aGVzZSBmdW5j
dG9ycyBhbGwgYXZvaWQgdXNpbmcgImNvbnN0IiBiZWNhdXNlIHdlIHdhbnQgdG8gdXNlIHRoZW0g
Zm9yIHRoaW5ncyB0aGF0CisgICAgLy8gZWRpdCBJUi4gSVIgaXMgbWVhbnQgdG8gYmUgZWRpdGVk
OyBpZiB5b3UncmUgY2FycnlpbmcgYXJvdW5kIGEgImNvbnN0IEluc3QmIiB0aGVuIHlvdSdyZQor
ICAgIC8vIHByb2JhYmx5IGRvaW5nIGl0IHdyb25nLgorCisgICAgLy8gVGhpcyBvbmx5IHdhbGtz
IHRob3NlIFRtcHMgdGhhdCBhcmUgZXhwbGljaXRseSBtZW50aW9uZWQsIGFuZCBpdCBkb2Vzbid0
IHRlbGwgeW91IHRoZWlyIHJvbGUKKyAgICAvLyBvciB0eXBlLgorICAgIHRlbXBsYXRlPHR5cGVu
YW1lIEZ1bmN0b3I+CisgICAgdm9pZCBmb3JFYWNoVG1wRmFzdChjb25zdCBGdW5jdG9yJiBmdW5j
dG9yKQorICAgIHsKKyAgICAgICAgZm9yIChBcmcgYXJnIDogYXJncykKKyAgICAgICAgICAgIGFy
Zy5mb3JFYWNoVG1wRmFzdChmdW5jdG9yKTsKKyAgICB9CisKKyAgICAvLyBDYWxscyB0aGUgZnVu
Y3RvciB3aXRoIChhcmcsIHJvbGUsIHR5cGUpLiBUaGlzIGZ1bmN0aW9uIGlzIGF1dG8tZ2VuZXJh
dGVkIGJ5CisgICAgLy8gb3Bjb2RlX2dlbmVyYXRvci5yYi4KKyAgICB0ZW1wbGF0ZTx0eXBlbmFt
ZSBGdW5jdG9yPgorICAgIHZvaWQgZm9yRWFjaEFyZyhjb25zdCBGdW5jdG9yJiBmdW5jdG9yKTsK
KworICAgIC8vIENhbGxzIHRoZSBmdW5jdG9yIHdpdGggKHRtcCwgcm9sZSwgdHlwZSkuCisgICAg
dGVtcGxhdGU8dHlwZW5hbWUgRnVuY3Rvcj4KKyAgICB2b2lkIGZvckVhY2hUbXAoY29uc3QgRnVu
Y3RvciYgZnVuY3RvcikKKyAgICB7CisgICAgICAgIGZvckVhY2hBcmdSb2xlKAorICAgICAgICAg
ICAgWyZdIChBcmcmIGFyZywgQXJnOjpSb2xlIHJvbGUsIEFyZzo6VHlwZSB0eXBlKSB7CisgICAg
ICAgICAgICAgICAgYXJnLmZvckVhY2hUbXAocm9sZSwgdHlwZSwgZnVuY3Rvcik7CisgICAgICAg
ICAgICB9KTsKKyAgICB9CisKKyAgICAvLyBSZXBvcnRzIGFueSBhZGRpdGlvbmFsIHJlZ2lzdGVy
cyBjbG9iYmVyZWQgYnkgdGhpcyBvcGVyYXRpb24uCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgRnVu
Y3Rvcj4KKyAgICB2b2lkIGZvckVhY2hDbG9iYmVyZWRSZWcoY29uc3QgRnVuY3RvciYpOworCisg
ICAgLy8gSXMgdGhpcyBpbnN0cnVjdGlvbiBpbiBvbmUgb2YgdGhlIHZhbGlkIGZvcm1zIHJpZ2h0
IG5vdz8gVGhpcyBmdW5jdGlvbiBpcyBhdXRvLWdlbmVyYXRlZCBieQorICAgIC8vIG9wY29kZV9n
ZW5lcmF0b3IucmIuCisgICAgYm9vbCBpc1ZhbGlkRm9ybSgpOworCisgICAgLy8gVGVzdHMgd2hl
dGhlciB3ZSBjb3VsZCBjb25zdHJ1Y3QgYW4gaW5zdHJ1Y3Rpb24gd2l0aCBzb21lIGZvcm0uIENh
bGwgd2l0aCBhIGxpc3Qgb2Yga2luZHMsCisgICAgLy8gbGlrZTogSW5zdDo6aXNWYWxpZEZvcm0o
QWRkMzIsIEFyZzo6QWRkciwgQXJnOjpUbXApLiBUaGlzIGZ1bmN0aW9uIHVzZXMgYSBoZWxwZXIg
dGhhdCBpcworICAgIC8vIGF1dG8tZ2VuZXJhdGVkIGJ5IG9wY29kZV9nZW5lcmF0b3IucmIuCisg
ICAgdGVtcGxhdGU8dHlwZW5hbWUuLi4gQXJndW1lbnRzPgorICAgIHN0YXRpYyBib29sIGlzVmFs
aWRGb3JtKE9wY29kZSwgQXJndW1lbnRzLi4uKTsKKworICAgIC8vIEFzc3VtaW5nIHRoaXMgaW5z
dHJ1Y3Rpb24gaXMgaW4gYSB2YWxpZCBmb3JtIHJpZ2h0IG5vdywgd2lsbCBpdCBzdGlsbCBiZSBp
biBvbmUgb2YgdGhlIHZhbGlkCisgICAgLy8gZm9ybXMgaWYgd2UgcHV0IGFuIEFkZHIgcmVmZXJl
bmNpbmcgdGhlIHN0YWNrIChvciBhIFN0YWNrU2xvdCBvciBDYWxsQXJnLCBvZiBjb3Vyc2UpIGlu
IHRoZQorICAgIC8vIGdpdmVuIGluZGV4PyBTcGlsbGluZyB1c2VzIHRoaXM6IGl0IHdhbGtzIHRo
ZSBhcmdzIGJ5IGluZGV4IHRvIGZpbmQgVG1wcyB0aGF0IG5lZWQgc3BpbGxpbmc7CisgICAgLy8g
aWYgaXQgZmluZHMgb25lLCBpdCBjYWxscyB0aGlzIHRvIHNlZSBpZiBpdCBjYW4gcmVwbGFjZSB0
aGUgQXJnOjpUbXAgd2l0aCBhbiBBcmc6OkFkZHIuIElmIGl0CisgICAgLy8gZmluZHMgYSBub24t
VG1wIEFyZywgdGhlbiBpdCBjYWxscyB0aGF0IEFyZydzIGZvckVhY2hUbXAgdG8gZG8gYSByZXBs
YWNlbWVudCB0aGF0IHdheS4KKyAgICAvLworICAgIC8vIFRoaXMgZnVuY3Rpb24gaXMgYXV0by1n
ZW5lcmF0ZWQgYnkgb3Bjb2RlX2dlbmVyYXRvci5yYi4KKyAgICBib29sIGFkbWl0c1N0YWNrKHVu
c2lnbmVkIGFyZ0luZGV4KTsKKworICAgIC8vIEdlbmVyYXRlIHNvbWUgY29kZSBmb3IgdGhpcyBp
bnN0cnVjdGlvbi4gVGhpcyBpcywgbGlrZSwgbGl0ZXJhbGx5IG91ciBiYWNrZW5kLiBJZiB0aGlz
IGlzIHRoZQorICAgIC8vIHRlcm1pbmFsLCBpdCByZXR1cm5zIHRoZSBqdW1wIHRoYXQgbmVlZHMg
dG8gYmUgbGlua2VkIGZvciB0aGUgInRoZW4iIGNhc2UsIHdpdGggdGhlICJlbHNlIgorICAgIC8v
IGNhc2UgYmVpbmcgZmFsbC10aHJvdWdoLiBUaGlzIGZ1bmN0aW9uIGlzIGF1dG8tZ2VuZXJhdGVk
IGJ5IG9wY29kZV9nZW5lcmF0b3IucmIuCisgICAgTWFjcm9Bc3NlbWJsZXI6Okp1bXAgZ2VuZXJh
dGUoTWFjcm9Bc3NlbWJsZXImKTsKKworICAgIHZvaWQgZHVtcChQcmludFN0cmVhbSYpIGNvbnN0
OworCisgICAgQXJnTGlzdCBhcmdzOworICAgIFZhbHVlKiBvcmlnaW47IC8vIFRoZSBCMzo6VmFs
dWUgdGhhdCB0aGlzIG9yaWdpbmF0ZWQgZnJvbS4KKyAgICBPcGNvZGUgb3Bjb2RlOworfTsKKwor
fSB9IH0gLy8gbmFtZXNwYWNlIEpTQzo6QjM6OkFpcgorCisjZW5kaWYgLy8gQWlySW5zdF9oCisK
SW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9haXIvQWlySW5zdElubGluZXMuaAo9PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvYWlyL0Fpckluc3RJbmxpbmVzLmgJ
KHJldmlzaW9uIDApCisrKyBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvYWlyL0Fpckluc3RJbmxp
bmVzLmgJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSw3MiBAQAorLyoKKyAqIENvcHlyaWdodCAo
QykgMjAxNSBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmli
dXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0
CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93
aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291
cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0
aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICog
Mi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92
ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRo
ZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29y
IG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICog
VEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5Z
CisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJ
TUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBB
TkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAg
SU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJM
RSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVN
UExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlU
RUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBM
T1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElP
TikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hF
VEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElO
RyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUg
VVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklM
SVRZIE9GIFNVQ0ggREFNQUdFLiAKKyAqLworCisjaWZuZGVmIEFpckluc3RJbmxpbmVzX2gKKyNk
ZWZpbmUgQWlySW5zdElubGluZXNfaAorCisjaW5jbHVkZSAiQWlySW5zdC5oIgorI2luY2x1ZGUg
IkFpck9wY29kZVV0aWxzLmgiCisjaW5jbHVkZSAiQWlyU3BlY2lhbHMuaCIKKyNpbmNsdWRlICJC
M1N0YWNrbWFwLmgiCisjaW5jbHVkZSAiQjNWYWx1ZS5oIgorCituYW1lc3BhY2UgSlNDIHsgbmFt
ZXNwYWNlIEIzIHsgbmFtZXNwYWNlIEFpciB7CisKK3RlbXBsYXRlPHR5cGVuYW1lIEZ1bmN0b3I+
Cit2b2lkIEluc3Q6OmZvckVhY2hDbG9iYmVyZWRSZWcoY29uc3QgRnVuY3RvciYgZnVuY3RvcikK
K3sKKyAgICBzd2l0Y2ggKG9wY29kZSkgeworICAgIGNhc2UgQ2hlY2s6CisgICAgY2FzZSBDaGVj
a0FkZDoKKyAgICBjYXNlIENoZWNrU3ViOgorICAgIGNhc2UgQ2hlY2tNdWw6CisgICAgY2FzZSBQ
YXRjaHBvaW50OgorICAgICAgICBvcmlnaW4tPnN0YWNrbWFwKCktPmNsb2JiZXJlZCgpLmZvckVh
Y2goZnVuY3Rvcik7CisgICAgICAgIGJyZWFrOworCisgICAgY2FzZSBDYWxsOiB7CisgICAgICAg
IFJlZ2lzdGVyU2V0IGNhbGxlZVNhdmVSZWdpc3RlcnMgPSBSZWdpc3RlclNldDo6Y2FsbGVlU2F2
ZVJlZ2lzdGVycygpOworICAgICAgICBmb3IgKFJlZyByZWcgOiBSZWc6OmFsbCgpKSB7CisgICAg
ICAgICAgICBpZiAoIWNhbGxlZVNhdmVSZWdpc3RlcnMuZ2V0KHJlZykpCisgICAgICAgICAgICAg
ICAgZnVuY3RvcihyZWcpOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIH0KKworICAg
IGRlZmF1bHQ6CisgICAgICAgIGJyZWFrOworICAgIH0KK30KKwordGVtcGxhdGU8dHlwZW5hbWUu
Li4gQXJndW1lbnRzPgorYm9vbCBJbnN0Ojppc1ZhbGlkRm9ybShPcGNvZGUgb3Bjb2RlLCBBcmd1
bWVuc3QuLi4gYXJndW1lbnRzKQoreworICAgIHJldHVybiBpc1ZhbGlkSW5zdEZvcm1JbXBsKG9w
Y29kZSwgc2l6ZW9mLi4uKEFyZ3VtZW50cyksIGFyZ3VtZW50cy4uLik7Cit9CisKK30gfSB9IC8v
IG5hbWVzcGFjZSBKU0M6OkIzOjpBaXIKKworI2VuZGlmIC8vIEFpckluc3RJbmxpbmVzX2gKKwpJ
bmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL2Fpci9BaXJPcGNvZGUub3Bjb2Rlcwo9PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvYWlyL0Fpck9wY29kZS5vcGNvZGVz
CShyZXZpc2lvbiAwKQorKysgU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL2Fpci9BaXJPcGNvZGUu
b3Bjb2Rlcwkod29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDExNSBAQAorIyBDb3B5cmlnaHQgKEMp
IDIwMTUgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorIworIyBSZWRpc3RyaWJ1dGlv
biBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyMg
bW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBj
b25kaXRpb25zCisjIGFyZSBtZXQ6CisjIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29k
ZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisjICAgIG5vdGljZSwgdGhpcyBsaXN0
IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyMgMi4gUmVkaXN0
cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmln
aHQKKyMgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2lu
ZyBkaXNjbGFpbWVyIGluIHRoZQorIyAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRl
cmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorIworIyBUSElTIFNPRlRXQVJF
IElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gQU5EIElUUyBDT05UUklCVVRPUlMgYGBBUyBJUycn
CisjIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVU
IE5PVCBMSU1JVEVEIFRPLAorIyBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJ
TElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisjIFBVUlBPU0UgQVJFIERJU0NMQUlN
RUQuIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IgSVRTIENPTlRSSUJVVE9SUworIyBC
RSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBF
WEVNUExBUlksIE9SCisjIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9U
IExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCisjIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklD
RVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUworIyBJTlRFUlJV
UFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hF
VEhFUiBJTgorIyBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5H
IE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorIyBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRI
RSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GCisjIFRIRSBQT1NTSUJJ
TElUWSBPRiBTVUNIIERBTUFHRS4KKworIyBTeWxsYWJ1czoKKyMKKyMgUm9sZXMgYW5kIHR5cGVz
OgorIyBVOkcgPT4gdXNlIG9mIGEgZ2VuZXJhbC1wdXJwb3NlIHJlZ2lzdGVyIG9yIHZhbHVlCisj
IEQ6RyA9PiBkZWYgb2YgYSBnZW5lcmFsLXB1cnBvc2UgcmVnaXN0ZXIgb3IgdmFsdWUKKyMgVUQ6
RyA9PiB1c2UgYW5kIGRlZiBvZiBhIGdlbmVyYWwtcHVycG9zZSByZWdpc3RlciBvciB2YWx1ZQor
IyBVOkYgPT4gdXNlIG9mIGEgZmxvYXQgcmVnaXN0ZXIgb3IgdmFsdWUKKyMgRDpGID0+IGRlZiBv
ZiBhIGZsb2F0IHJlZ2lzdGVyIG9yIHZhbHVlCisjIFVEOkYgPT4gdXNlIGFuZCBkZWYgb2YgYSBm
bG9hdCByZWdpc3RlciBvciB2YWx1ZQorIworIyBBcmd1bWVudCBraW5kczoKKyMgVG1wID0+IHRl
bXBvcmFyeSBvciByZWdpc3RlcgorIyBJbW0gPT4gMzItYml0IGltbWVkaWF0ZSBpbnQKKyMgSW1t
UHRyID0+IFRydXN0ZWRJbW1QdHIKKyMgQWRkciA9PiBhZGRyZXNzIGFzIHRlbXBvcmFyeS9yZWdp
c3RlcitvZmZzZXQKKyMgSW5kZXggPT4gQmFzZUluZGV4IGFkZHJlc3MKKyMgQWJzID0+IEFic29s
dXRlQWRkcmVzcworIworIyBUaGUgcGFyc2VyIHZpZXdzIHRoZXNlIHRoaW5ncyBhcyBrZXl3b3Jk
cywgYW5kIHVuZGVyc3RhbmRzIHRoYXQgdGhleSBmYWxsIGludG8gdHdvIGRpc3RpbmN0IGNsYXNz
ZXMKKyMgb2YgdGhpbmdzLiBTbywgYWx0aG91Z2ggdGhpcyBmaWxlIHVzZXMgYSBwYXJ0aWN1bGFy
IGluZGVudGF0aW9uIHN0eWxlLCBub25lIG9mIHRoZSB3aGl0ZXNwYWNlIG9yCisjIGV2ZW4gbmV3
bGluZXMgYXJlIG1lYW5pbmdmdWwgdG8gdGhlIHBhcnNlci4gRm9yIGV4YW1wbGUsIHlvdSBjb3Vs
ZCB3cml0ZToKKyMKKyMgRm9vNDIgVTpHLCBVRDpGIEltbSwgVG1wIEFkZHIsIFRtcAorIworIyBB
bmQgdGhlIHBhcnNlciB3b3VsZCBrbm93IHRoYXQgdGhpcyBpcyB0aGUgc2FtZSBhczoKKyMKKyMg
Rm9vNDIgVTpHLCBVRDpGCisjICAgICBJbW0sIFRtcAorIyAgICAgQWRkciwgVG1wCisjCisjIEku
ZS4gYSB0d28tZm9ybSBpbnN0cnVjdGlvbiB0aGF0IHVzZXMgYSBHUFIgb3IgYW4gaW50IGltbWVk
aWF0ZSBhbmQgdXNlcytkZWZzIGEgZmxvYXQgcmVnaXN0ZXIuCisKKyMgTm90ZSB0aGF0IHRoZSBv
cGNvZGVzIGhlcmUgaGF2ZSBhIGxlYWRpbmcgY2FwaXRhbCAoQWRkMzIpIGJ1dCBtdXN0IGNvcnJl
c3BvbmQgdG8gTWFjcm9Bc3NlbWJsZXIKKyMgQVBJIHRoYXQgaGFzIGEgbGVhZGluZyBsb3dlci1j
YXNlIChhZGQzMikuCisKK0FkZDMyIFU6RywgVUQ6RworICAgIFRtcCwgVG1wCisgICAgSW1tLCBB
ZGRyCisgICAgSW1tLCBUbXAKKyAgICBBZGRyLCBUbXAKKyAgICBUbXAsIEFkZHIKKworQWRkMzIg
VTpHLCBVOkcsIEQ6RworICAgIEltbSwgVG1wLCBUbXAKKworQW5kMzIgVTpHLCBVRDpHCisgICAg
VG1wLCBUbXAKKyAgICBJbW0sIFRtcAorICAgIFRtcCwgQWRkcgorICAgIEFkZHIsIFRtcAorICAg
IEltbSwgQWRkcgorCitMc2hpZnQzMiBVOkcsIFVEOkcKKyAgICBUbXAqLCBUbXAKKyAgICBJbW0s
IFRtcAorCitNdWwzMiBVOkcsIFVEOkcKKyAgICBUbXAsIFRtcAorICAgIEFkZHIsIFRtcAorCitN
b3ZlIFU6RywgRDpHCisgICAgVG1wLCBUbXAKKyAgICBJbW0sIFRtcAorICAgIEltbVB0ciwgVG1w
CisgICAgQWRkciwgVG1wIGFzIGxvYWQgIyBUaGlzIG1lYW5zIHRoYXQgIk1vdmUgQWRkciwgVG1w
IiBpcyBjb2RlLWdlbmVyYXRlZCBhcyAibG9hZCIgbm90ICJtb3ZlIi4KKyAgICBUbXAsIEFkZHIg
YXMgc3RvcmUKKworTW92ZURvdWJsZSBVOkYsIEQ6RgorICAgIFRtcCwgVG1wCisgICAgQWRkciwg
VG1wIGFzIGxvYWREb3VibGUKKyAgICBUbXAsIEFkZHIgYXMgc3RvcmVEb3VibGUKKworTW92ZTY0
VG9Eb3VibGUgVTpHLCBEOkYKKyAgICBUbXAsIFRtcAorCitNb3ZlRG91YmxlVG82NCBVOkYsIEQ6
RworICAgIFRtcCwgVG1wCisKK1JldAorCisjIFNvbWUgb3Bjb2RlcyBiZWhhdmUgZXhvdGljYWxs
eS4gRm9yIGV4YW1wbGUsIHRoZXkgbWF5IGhhdmUgdmFyYXJncy4gT3IsIHRoZXkgbWF5IHJlcXVp
cmUgYSBzcGVjaWFsCisjIGNsYXNzIG9mIHJlZ2lzdGVycyBmb3Igc29tZSBvcGVyYW5kLiBPciwg
dGhleSBtYXkgdXNlIG9yIGRlZiBhZGRpdGlvbmFsIHJlZ2lzdGVycy4KKworIyBUaGVzZSBiZWhh
dmUgbGlrZSBob3cgdGhlIFN0YWNrbWFwIG9iamVjdCB0ZWxscyB0aGVtIHRvIGJlaGF2ZS4KK3Nw
ZWNpYWwgQ2hlY2tBZGQKK3NwZWNpYWwgQ2hlY2tTdWIgCitzcGVjaWFsIENoZWNrTXVsCitzcGVj
aWFsIENoZWNrCitzcGVjaWFsIFBhdGNocG9pbnQKKworIyBUYWtlcyBhcmd1bWVudCByZWdpc3Rl
cnMgYXMgaW5wdXRzLgorc3BlY2lhbCBDYWxsCkluZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUv
YjMvYWlyL0FpclNwZWNpYWxzLmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRDb3Jl
L2IzL2Fpci9BaXJTcGVjaWFscy5oCShyZXZpc2lvbiAwKQorKysgU291cmNlL0phdmFTY3JpcHRD
b3JlL2IzL2Fpci9BaXJTcGVjaWFscy5oCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsNTkgQEAK
Ky8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTUgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVk
LgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9y
bXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3Zp
ZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVk
aXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmln
aHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dp
bmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0
IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBv
ZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBk
b2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlz
dHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5D
LiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElO
Q0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBP
RiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9T
RSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IKKyAqIENP
TlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFM
LCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xV
RElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBH
T09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBC
VVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisg
KiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9S
IFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4g
QU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJ
U0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKworI2lmbmRlZiBB
aXJTcGVjaWFsc19oCisjZGVmaW5lIEFpclNwZWNpYWxzX2gKKworI2luY2x1ZGUgIkFpckluc3Qu
aCIKKyNpbmNsdWRlICJCM1ZhbHVlLmgiCisKK25hbWVzcGFjZSBKU0MgeyBuYW1lc3BhY2UgQjMg
eyBuYW1lc3BhY2UgQWlyIHsKKwordGVtcGxhdGU8dHlwZW5hbWUgRnVuY3Rvcj4KK3ZvaWQgZm9y
RWFjaFN0YWNrTWFwQXJnKEluc3QqIGluc3QsIGNvbnN0IEZ1bmN0b3ImIGZ1bmN0b3IpCit7Cisg
ICAgU3RhY2ttYXAqIHN0YWNrbWFwID0gaW5zdC0+b3JpZ2luLT5zdGFja21hcCgpOworICAgIEFT
U0VSVChzdGFja21hcCk7CisKKyAgICBmb3IgKHVuc2lnbmVkIGluZGV4ID0gMDsgaW5kZXggPCBp
bnN0LT5hcmdzLnNpemUoKTsgKytpbmRleCkgeworICAgICAgICBBcmcmIGFyZyA9IGluc3QtPmFy
Z3NbaW5kZXhdOworCisgICAgICAgIC8vIEFjdHVhbGx5LCB0aGlzIHRoaW5nIG9ubHkgYWRtaXRz
IEFkZHJlc3MgZm9ybXMgdGhhdCBhcmUgc3RhY2sgb2Zmc2V0cy4gV2UgbmVlZCBzb21lIHdheQor
ICAgICAgICAvLyBvZiBzYXlpbmcgdGhhdC4KKyAgICB9Cit9CisKK3N0cnVjdCBDaGVja1NwZWNp
YWxzIHsKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBGdW5jdG9yPgorICAgIHN0YXRpYyB2b2lkIGZv
ckVhY2hBcmcoSW5zdCogaW5zdCwgY29uc3QgRnVuY3RvciYgZnVuY3RvcikKKyAgICB7CisgICAg
ICAgIGZvckVhY2hTdGFja21hcEFyZyhpbnN0LCBmdW5jdG9yKTsKKyAgICB9Cit9OworCit9IH0g
fSAvLyBuYW1lc3BhY2UgSlNDOjpCMzo6QWlyCisKKyNlbmRpZiAvLyBBaXJTcGVjaWFsc19oCisK
SW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9haXIvQWlyU3RhY2tTbG90LmgKPT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL2Fpci9BaXJTdGFja1Nsb3QuaAkocmV2
aXNpb24gMCkKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9haXIvQWlyU3RhY2tTbG90LmgJ
KHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSw5MiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAx
NSBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24g
YW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBt
b2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNv
bmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNv
ZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxp
c3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVk
aXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5
cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xs
b3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVy
IG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBT
T0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBF
WFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQg
VE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklU
TkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8g
RVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1Ig
QU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlks
IE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8s
CisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9G
IFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9X
RVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJ
TiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdM
SUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisg
KiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9G
IFNVQ0ggREFNQUdFLiAKKyAqLworCisjaWZuZGVmIEFpclN0YWNrU2xvdF9oCisjZGVmaW5lIEFp
clN0YWNrU2xvdF9oCisKKyNpbmNsdWRlIDx3dGYvTm9uQ29weWFibGUuaD4KKyNpbmNsdWRlIDx3
dGYvRmFzdE1hbGxvYy5oPgorCituYW1lc3BhY2UgSlNDIHsgbmFtZXNwYWNlIEIzIHsKKworY2xh
c3MgU3RhY2tTbG90dmFsdWU7CisKK25hbWVzcGFjZSBBaXIgeworCitjbGFzcyBTdGFja1Nsb3Qg
eworICAgIFdURl9NQUtFX05PTkNPUFlBQkxFKFN0YWNrU2xvdCk7CisgICAgV1RGX01BS0VfRkFT
VF9BTExPQ0FURUQ7CitwdWJsaWM6CisgICAgdW5zaWduZWQgYnl0ZVNpemUoKSBjb25zdCB7IHJl
dHVybiBtX2J5dGVTaXplOyB9CisgICAgdW5zaWduZWQgaW5kZXgoKSBjb25zdCB7IHJldHVybiBt
X2luZGV4OyB9CisKKyAgICBTdGFja1Nsb3RWYWx1ZSogdmFsdWUoKSBjb25zdCB7IHJldHVybiBt
X3ZhbHVlOyB9CisKKyAgICB2b2lkIGR1bXAoUHJpbnRTdHJlYW0mKSBjb25zdDsKKyAgICB2b2lk
IGRlZXBEdW1wKFByaW50U3RyZWFtJikgY29uc3Q7CisKK3ByaXZhdGU6CisgICAgZnJpZW5kIGNs
YXNzIENvZGU7CisKKyAgICBTdGFja1Nsb3QodW5zaWduZWQgYnl0ZVNpemUsIHVuc2lnbmVkIGlu
ZGV4LCBTdGFja1Nsb3RWYWx1ZSogdmFsdWUpCisgICAgICAgIDogbV9ieXRlU2l6ZShieXRlU2l6
ZSkKKyAgICAgICAgLCBtX2luZGV4KGluZGV4KQorICAgICAgICAsIG1fdmFsdWUodmFsdWUpCisg
ICAgeworICAgIH0KKyAgICAKKyAgICB1bnNpZ25lZCBtX2J5dGVTaXplOworICAgIHVuc2lnbmVk
IG1faW5kZXg7CisgICAgU3RhY2tTbG90VmFsdWUqIG1fdmFsdWU7Cit9OworCitjbGFzcyBEZWVw
U3RhY2tTbG90RHVtcCB7CitwdWJsaWM6CisgICAgRGVlcFN0YWNrU2xvdER1bXAoU3RhY2tTbG90
KiBzbG90KQorICAgICAgICA6IG1fc2xvdChzbG90KQorICAgIHsKKyAgICB9CisKKyAgICB2b2lk
IGR1bXAoUHJpbnRTdHJlYW0mIG91dCkgY29uc3QKKyAgICB7CisgICAgICAgIGlmIChtX3Nsb3Qp
CisgICAgICAgICAgICBtX3Nsb3QtPmRlZXBEdW1wKG91dCk7CisgICAgICAgIGVsc2UKKyAgICAg
ICAgICAgIG91dC5wcmludCgiPG51bGw+Iik7CisgICAgfQorCitwcml2YXRlOgorICAgIFN0YWNr
U2xvdCogbV9zbG90OworfTsKKworRGVlcFN0YWNrU2xvdER1bXAgZGVlcER1bXAoU3RhY2tTbG90
KiBzbG90KQoreworICAgIHJldHVybiBEZWVwU3RhY2tTbG90RHVtcChzbG90KTsKK30KKworfSB9
IH0gLy8gbmFtZXNwYWNlIEpTQzo6QjM6OkFpcgorCisjZW5kaWYgLy8gQWlyU3RhY2tTbG90X2gK
KwpJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL2Fpci9BaXJUbXAuY3BwCj09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9haXIvQWlyVG1wLmNwcAkocmV2aXNpb24g
MCkKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9haXIvQWlyVG1wLmNwcAkod29ya2luZyBj
b3B5KQpAQCAtMCwwICsxLDUyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE1IEFwcGxlIElu
Yy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGlu
IHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlv
biwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwor
ICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJl
dGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25k
aXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlv
bnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICog
ICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNj
bGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxz
IHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElT
IFBST1ZJREVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1Ig
SU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisg
KiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBB
IFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFM
TCBBUFBMRSBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNU
LCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VR
VUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NV
UkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRB
LCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNF
RCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNU
LCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1Ig
T1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMg
U09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1B
R0UuIAorICovCisKKyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJBaXJUbXAuaCIKKwor
bmFtZXNwYWNlIEpTQyB7IG5hbWVzcGFjZSBCMyB7IG5hbWVzcGFjZSBBaXIgeworCit2b2lkIFRt
cDo6ZHVtcChQcmludFN0cmVhbSYgb3V0KSBjb25zdAoreworICAgIGlmICghKnRoaXMpIHsKKyAg
ICAgICAgb3V0LnByaW50KCI8bm9uZT4iKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAg
IGlmIChpc1JlZygpKSB7CisgICAgICAgIG91dC5wcmludChyZWcoKSk7CisgICAgICAgIHJldHVy
bjsKKyAgICB9CisKKyAgICBpZiAoaXNHUFRtcCgpKSB7CisgICAgICAgIG91dC5wcmludCgiJXRt
cCIsIGdwVG1wSW5kZXgoKSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBvdXQucHJp
bnQoIiVmdG1wIiwgZnBUbXBJbmRleCgpKTsKK30KKworfSB9IH0gLy8gbmFtZXNwYWNlIEpTQzo6
QjM6OkFpcgorCkluZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvYWlyL0FpclRtcC5oCj09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9haXIvQWlyVG1wLmgJKHJldmlz
aW9uIDApCisrKyBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvYWlyL0FpclRtcC5oCSh3b3JraW5n
IGNvcHkpCkBAIC0wLDAgKzEsMjQ4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE1IEFwcGxl
IEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNl
IGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNh
dGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9u
cworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0
IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBj
b25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1
dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAor
ICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBk
aXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJp
YWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJF
IElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1Mg
T1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhF
CisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZP
UiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBT
SEFMTCBBUFBMRSBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElS
RUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09O
U0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBS
T0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBE
QVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENB
VVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRS
QUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0Ug
T1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRI
SVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBE
QU1BR0UuIAorICovCisKKyNpZm5kZWYgQWlyVG1wX2gKKyNkZWZpbmUgQWlyVG1wX2gKKworI2lu
Y2x1ZGUgIlJlZy5oIgorCituYW1lc3BhY2UgSlNDIHsgbmFtZXNwYWNlIEIzIHsgbmFtZXNwYWNl
IEFpciB7CisKKy8vIEEgVG1wIGlzIGEgZ2VuZXJhbGl6YXRpb24gb2YgYSByZWdpc3Rlci4gSXQg
Y2FuIGJlIHVzZWQgdG8gcmVmZXIgdG8gYW55IEdQUiBvciBGUFIuIEl0IGNhbiBhbHNvCisvLyBi
ZSB1c2VkIHRvIHJlZmVyIHRvIGFuIHVuYWxsb2NhdGVkIHJlZ2lzdGVyIChpLmUuIGEgdGVtcG9y
YXJ5KS4gTGlrZSBtYW55IEFpciBjbGFzc2VzLCB3ZSB1c2UKKy8vIGRlbGliZXJhdGVseSB0ZXJz
ZSBuYW1pbmcgc2luY2Ugd2Ugd2lsbCBoYXZlIHRvIHVzZSB0aGlzIG5hbWUgYSBsb3QuCisKK2Ns
YXNzIFRtcCB7CitwdWJsaWM6CisgICAgVG1wKCkKKyAgICAgICAgOiBtX3ZhbHVlKDApCisgICAg
eworICAgIH0KKworICAgIGV4cGxpY2l0IFRtcChSZWcgcmVnKQorICAgIHsKKyAgICAgICAgaWYg
KHJlZykgeworICAgICAgICAgICAgaWYgKHJlZy5pc0dQUigpKQorICAgICAgICAgICAgICAgIG1f
dmFsdWUgPSBlbmNvZGVHUFIocmVnLmdwcigpKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAg
ICAgICAgICBtX3ZhbHVlID0gZW5jb2RlRlBSKHJlZy5mcHIoKSk7CisgICAgICAgIH0gZWxzZQor
ICAgICAgICAgICAgbV92YWx1ZSA9IDA7CisgICAgfQorCisgICAgc3RhdGljIFRtcCBncFRtcEZv
ckluZGV4KHVuc2lnbmVkIGluZGV4KQorICAgIHsKKyAgICAgICAgVG1wIHJlc3VsdDsKKyAgICAg
ICAgcmVzdWx0Lm1fdmFsdWUgPSBlbmNvZGVHUFRtcChpbmRleCk7CisgICAgICAgIHJldHVybiBy
ZXN1bHQ7CisgICAgfQorCisgICAgc3RhdGljIFRtcCBmcFRtcEZvckluZGV4KHVuc2lnbmVkIGlu
ZGV4KQorICAgIHsKKyAgICAgICAgVG1wIHJlc3VsdDsKKyAgICAgICAgcmVzdWx0Lm1fdmFsdWUg
PSBlbmNvZGVGUFRtcChpbmRleCk7CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorCisg
ICAgc3RhdGljIFRtcCBmb3JSYXdWYWx1ZSh1bnNpZ25lZCBpbmRleCkKKyAgICB7CisgICAgICAg
IFRtcCByZXN1bHQ7CisgICAgICAgIHJlc3VsdC5tX3ZhbHVlID0gaW5kZXg7CisgICAgICAgIHJl
dHVybiByZXN1bHQ7CisgICAgfQorCisgICAgZXhwbGljaXQgb3BlcmF0b3IgYm9vbCgpIGNvbnN0
IHsgcmV0dXJuICEhbV92YWx1ZTsgfQorCisgICAgYm9vbCByYXdWYWx1ZSgpIGNvbnN0IHsgcmV0
dXJuIG1fdmFsdWU7IH0KKworICAgIGJvb2wgaXNHUCgpIGNvbnN0CisgICAgeworICAgICAgICBy
ZXR1cm4gaXNFbmNvZGVkR1AobV92YWx1ZSk7CisgICAgfQorCisgICAgYm9vbCBpc0ZQKCkgY29u
c3QKKyAgICB7CisgICAgICAgIHJldHVybiBpc0VuY29kZWRGUChtX3ZhbHVlKTsKKyAgICB9CisK
KyAgICBib29sIGlzR1BSKCkgY29uc3QKKyAgICB7CisgICAgICAgIHJldHVybiBpc0VuY29kZWRH
UFIobV92YWx1ZSk7CisgICAgfQorCisgICAgYm9vbCBpc0ZQUigpIGNvbnN0CisgICAgeworICAg
ICAgICByZXR1cm4gaXNFbmNvZGVkRlBSKG1fdmFsdWUpOworICAgIH0KKworICAgIGJvb2wgaXNS
ZWcoKSBjb25zdAorICAgIHsKKyAgICAgICAgcmV0dXJuIGlzR1BSKCkgfHwgaXNGUFIoKTsKKyAg
ICB9CisKKyAgICBHUFJSZWcgZ3ByKCkgY29uc3QKKyAgICB7CisgICAgICAgIHJldHVybiBkZWNv
ZGVHUFIobV92YWx1ZSk7CisgICAgfQorCisgICAgRlBSUmVnIGZwcigpIGNvbnN0CisgICAgewor
ICAgICAgICByZXR1cm4gZGVjb2RlRlBSKG1fdmFsdWUpOworICAgIH0KKworICAgIFJlZyByZWco
KSBjb25zdAorICAgIHsKKyAgICAgICAgaWYgKGlzR1AoKSkKKyAgICAgICAgICAgIHJldHVybiBn
cHIoKTsKKyAgICAgICAgcmV0dXJuIGZwcigpOworICAgIH0KKworICAgIHVuc2lnbmVkIGdwVG1w
SW5kZXgoKSBjb25zdAorICAgIHsKKyAgICAgICAgcmV0dXJuIGRlY29kZUdQVG1wKG1fdmFsdWUp
OworICAgIH0KKworICAgIHVuc2lnbmVkIGZwVG1wSW5kZXgoKSBjb25zdAorICAgIHsKKyAgICAg
ICAgcmV0dXJuIGRlY29kZUZQVG1wKG1fdmFsdWUpOworICAgIH0KKworICAgIHVuc2lnbmVkIHRt
cEluZGV4KCkgY29uc3QKKyAgICB7CisgICAgICAgIGlmIChpc0dQKCkpCisgICAgICAgICAgICBy
ZXR1cm4gZ3BUbXBJbmRleCgpOworICAgICAgICByZXR1cm4gZnBUbXBJbmRleCgpOworICAgIH0K
KworICAgIGJvb2wgb3BlcmF0b3I9PShjb25zdCBUbXAmIG90aGVyKSBjb25zdAorICAgIHsKKyAg
ICAgICAgcmV0dXJuIG1fdmFsdWUgPT0gb3RoZXIubV92YWx1ZTsKKyAgICB9CisKKyAgICBib29s
IG9wZXJhdG9yIT0oY29uc3QgVG1wJiBvdGhlcikgY29uc3QKKyAgICB7CisgICAgICAgIHJldHVy
biAhKCp0aGlzID09IG90aGVyKTsKKyAgICB9CisKKyAgICB2b2lkIGR1bXAoUHJpbnRTdHJlYW0m
IG91dCkgY29uc3Q7CisgICAgCitwcml2YXRlOgorICAgIHN0YXRpYyBpbnQgZW5jb2RlR1AodW5z
aWduZWQgaW5kZXgpCisgICAgeworICAgICAgICByZXR1cm4gMSArIGluZGV4OworICAgIH0KKwor
ICAgIHN0YXRpYyBpbnQgZW5jb2RlRlAodW5zaWduZWQgaW5kZXgpCisgICAgeworICAgICAgICBy
ZXR1cm4gLTEgLSBpbmRleDsKKyAgICB9CisKKyAgICBzdGF0aWMgaW50IGVuY29kZUdQUihHUFJS
ZWcgZ3ByKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGVuY29kZUdQKGdwciAtIE1hY3JvQXNzZW1i
bGVyOjpmaXJzdFJlZ2lzdGVyKCkpOworICAgIH0KKworICAgIHN0YXRpYyBpbnQgZW5jb2RlRlBS
KEZQUlJlZyBmcHIpCisgICAgeworICAgICAgICByZXR1cm4gZW5jb2RlRlAoZnByIC0gTWFjcm9B
c3NlbWJsZXI6OmZpcnN0RlBSUmVnaXN0ZXIoKSk7CisgICAgfQorCisgICAgc3RhdGljIGludCBl
bmNvZGVHUFRtcCh1bnNpZ25lZCBpbmRleCkKKyAgICB7CisgICAgICAgIHJldHVybiBlbmNvZGVH
UFIoTWFjcm9Bc3NlbWJsZXI6Omxhc3RSZWdpc3RlcigpKSArIDEgKyBpbmRleDsKKyAgICB9CisK
KyAgICBzdGF0aWMgaW50IGVuY29kZUZQVG1wKHVuc2lnbmVkIGluZGV4KQorICAgIHsKKyAgICAg
ICAgcmV0dXJuIGVuY29kZUZQUihNYWNyb0Fzc2VtYmxlcjo6bGFzdEZQUmVnaXN0ZXIoKSkgLSAx
IC0gaW5kZXg7CisgICAgfQorCisgICAgc3RhdGljIGJvb2wgaXNFbmNvZGVkR1AoaW50IHZhbHVl
KQorICAgIHsKKyAgICAgICAgcmV0dXJuIHZhbHVlID4gMDsKKyAgICB9CisKKyAgICBzdGF0aWMg
Ym9vbCBpc0VuY29kZWRGUChpbnQgdmFsdWUpCisgICAgeworICAgICAgICByZXR1cm4gdmFsdWUg
PCAwOworICAgIH0KKworICAgIHN0YXRpYyBib29sIGlzRW5jb2RlZEdQUihpbnQgdmFsdWUpCisg
ICAgeworICAgICAgICByZXR1cm4gaXNFbmNvZGVkR1AodmFsdWUpICYmIHZhbHVlIDw9IGVuY29k
ZUdQUihNYWNyb0Fzc2VtYmxlcjo6bGFzdFJlZ2lzdGVyKCkpOworICAgIH0KKworICAgIHN0YXRp
YyBib29sIGlzRW5jb2RlZEZQUihpbnQgdmFsdWUpCisgICAgeworICAgICAgICByZXR1cm4gaXNF
bmNvZGVkRlAodmFsdWUpICYmIHZhbHVlID49IGVuY29kZWRGUFIoTWFjcm9Bc3NlbWJsZXI6Omxh
c3RGUFJlZ2lzdGVyKCkpOworICAgIH0KKworICAgIHN0YXRpYyBib29sIGlzRW5jb2RlZEdQVG1w
KGludCB2YWx1ZSkKKyAgICB7CisgICAgICAgIHJldHVybiBpc0VuY29kZWRHUCh2YWx1ZSkgJiYg
IWlzRW5jb2RlZEdQUih2YWx1ZSk7CisgICAgfQorCisgICAgc3RhdGljIGJvb2wgaXNFbmNvZGVk
RlBUbXAoaW50IHZhbHVlKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGlzRW5jb2RlZEZQKHZhbHVl
KSAmJiAhaXNFbmNvZGVkRlBSKHZhbHVlKTsKKyAgICB9CisKKyAgICBzdGF0aWMgR1BSUmVnIGRl
Y29kZUdQUihpbnQgdmFsdWUpCisgICAgeworICAgICAgICBBU1NFUlQoaXNFbmNvZGVkR1BSKHZh
bHVlKSk7CisgICAgICAgIHJldHVybiBzdGF0aWNfY2FzdDxHUFJSZWc+KAorICAgICAgICAgICAg
KHZhbHVlIC0gZW5jb2RlR1BSKE1hY3JvQXNzZW1ibGVyOjpmaXJzdFJlZ2lzdGVyKCkpKSArIE1h
Y3JvQXNzZW1ibGVyOjpmaXJzdFJlZ2lzdGVyKCkpOworICAgIH0KKworICAgIHN0YXRpYyBGUFJS
ZWcgZGVjb2RlRlBSKGludCB2YWx1ZSkKKyAgICB7CisgICAgICAgIEFTU0VSVChpc0VuY29kZWRG
UFIodmFsdWUpKTsKKyAgICAgICAgcmV0dXJuIHN0YXRpY19jYXN0PEZQUlJlZz4oCisgICAgICAg
ICAgICAoZW5jb2RlRlBSKE1hY3JvQXNzZW1ibGVyOjpmaXJzdEZQUmVnaXN0ZXIoKSkgLSB2YWx1
ZSkgKworICAgICAgICAgICAgTWFjcm9Bc3NlbWJsZXI6OmZpcnN0RlBSZWdpc3RlcigpKTsKKyAg
ICB9CisKKyAgICBzdGF0aWMgdW5zaWduZWQgZGVjb2RlR1BUbXAoaW50IHZhbHVlKQorICAgIHsK
KyAgICAgICAgQVNTRVJUKGlzRW5jb2RlZEdQVG1wKHZhbHVlKSk7CisgICAgICAgIHJldHVybiB2
YWx1ZSAtIChlbmNvZGVHUFIoTWFjcm9Bc3NlbWJsZXI6Omxhc3RSZWdpc3RlcigpKSArIDEpOwor
ICAgIH0KKworICAgIHN0YXRpYyB1bnNpZ25lZCBkZWNvZGVGUFRtcChpbnQgdmFsdWUpCisgICAg
eworICAgICAgICBBU1NFUlQoaXNFbmNvZGVkRlBUbXAodmFsdWUpKTsKKyAgICAgICAgcmV0dXJu
IChlbmNvZGVGUFIoTWFjcm9Bc3NlbWJsZXI6Omxhc3RGUFJlZ2lzdGVyKCkpIC0gMSkgLSB2YWx1
ZTsKKyAgICB9CisKKyAgICAvLyAwOiBlbXB0eSBUbXAKKyAgICAvLyBwb3NpdGl2ZTogR1BScyBh
bmQgdGhlbiBHUCB0ZW1wcy4KKyAgICAvLyBuZWdhdGl2ZTogRlBScyBhbmQgdGhlbiBGUCB0ZW1w
cy4KKyAgICBpbnQgbV92YWx1ZTsKK307CisKK30gfSB9IC8vIG5hbWVzcGFjZSBKU0M6OkIzOjpB
aXIKKworI2VuZGlmIC8vIEFpclRtcF9oCisKSW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9i
My9haXIvb3Bjb2RlX2dlbmVyYXRvci5yYgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlw
dENvcmUvYjMvYWlyL29wY29kZV9nZW5lcmF0b3IucmIJKHJldmlzaW9uIDApCisrKyBTb3VyY2Uv
SmF2YVNjcmlwdENvcmUvYjMvYWlyL29wY29kZV9nZW5lcmF0b3IucmIJKHdvcmtpbmcgY29weSkK
QEAgLTAsMCArMSw3NjggQEAKKyMhL3Vzci9iaW4vZW52IHJ1YnkKKworIyBDb3B5cmlnaHQgKEMp
IDIwMTUgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorIworIyBSZWRpc3RyaWJ1dGlv
biBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyMg
bW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBj
b25kaXRpb25zCisjIGFyZSBtZXQ6CisjIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29k
ZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisjICAgIG5vdGljZSwgdGhpcyBsaXN0
IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyMgMi4gUmVkaXN0
cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmln
aHQKKyMgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2lu
ZyBkaXNjbGFpbWVyIGluIHRoZQorIyAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRl
cmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorIworIyBUSElTIFNPRlRXQVJF
IElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gQU5EIElUUyBDT05UUklCVVRPUlMgYGBBUyBJUycn
CisjIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVU
IE5PVCBMSU1JVEVEIFRPLAorIyBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJ
TElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisjIFBVUlBPU0UgQVJFIERJU0NMQUlN
RUQuIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IgSVRTIENPTlRSSUJVVE9SUworIyBC
RSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBF
WEVNUExBUlksIE9SCisjIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9U
IExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCisjIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklD
RVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUworIyBJTlRFUlJV
UFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hF
VEhFUiBJTgorIyBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5H
IE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorIyBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRI
RSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GCisjIFRIRSBQT1NTSUJJ
TElUWSBPRiBTVUNIIERBTUFHRS4KKworcmVxdWlyZSAicGF0aG5hbWUiCisKK2NsYXNzIE9wY29k
ZQorICAgIGF0dHJfcmVhZGVyIDpuYW1lLCA6c3BlY2lhbCwgOm92ZXJsb2FkcworCisgICAgZGVm
IGluaXRpYWxpemUobmFtZSwgc3BlY2lhbCkKKyAgICAgICAgQG5hbWUgPSBuYW1lCisgICAgICAg
IEBzcGVjaWFsID0gc3BlY2lhbAorICAgICAgICB1bmxlc3Mgc3BlY2lhbAorICAgICAgICAgICAg
QG92ZXJsb2FkcyA9IFtdCisgICAgICAgIGVuZAorICAgIGVuZAorCisgICAgZGVmIG1hc21OYW1l
CisgICAgICAgIG5hbWVbMF0uZG93bmNhc2UgKyBuYW1lWzEuLi0xXQorICAgIGVuZAorZW5kCisK
K2NsYXNzIEFyZworICAgIGF0dHJfcmVhZGVyIDpyb2xlLCA6dHlwZQorCisgICAgZGVmIGluaXRp
YWxpemUocm9sZSwgdHlwZSkKKyAgICAgICAgQHJvbGUgPSByb2xlCisgICAgICAgIEB0eXBlID0g
dHlwZQorICAgIGVuZAorZW5kCisKK2NsYXNzIE92ZXJsb2FkCisgICAgYXR0cl9yZWFkZXIgOnNp
Z25hdHVyZSwgOmZvcm1zCisKKyAgICBkZWYgaW5pdGlhbGl6ZShzaWduYXR1cmUsIGZvcm1zKQor
ICAgICAgICBAc2lnbmF0dXJlID0gc2lnbmF0dXJlCisgICAgICAgIEBmb3JtcyA9IGZvcm1zCisg
ICAgZW5kCitlbmQKKworY2xhc3MgS2luZAorICAgIGF0dHJfcmVhZGVyIDpuYW1lCisgICAgYXR0
cl9hY2Nlc3NvciA6c3BlY2lhbAorCisgICAgZGVmIGluaXRpYWxpemUobmFtZSkKKyAgICAgICAg
QG5hbWUgPSBuYW1lCisgICAgICAgIEBzcGVjaWFsID0gZmFsc2UKKyAgICBlbmQKKworICAgIGRl
ZiA9PShvdGhlcikKKyAgICAgICAgaWYgb3RoZXIuaXNfYT8gU3RyaW5nCisgICAgICAgICAgICBA
bmFtZSA9PSBvdGhlcgorICAgICAgICBlbHNlCisgICAgICAgICAgICBAbmFtZSA9PSBvdGhlci5u
YW1lIGFuZCBAc3BlY2lhbCA9PSBvdGhlci5zcGVjaWFsCisgICAgICAgIGVuZAorICAgIGVuZAor
CisgICAgZGVmIEtpbmQuYXJnS2luZHMoa2luZCkKKyAgICAgICAgaWYga2luZCA9PSAiQWRkciIK
KyAgICAgICAgICAgIFsiQWRkciIsICJTdGFja1Nsb3QiLCAiQ2FsbEFyZyJdCisgICAgICAgIGVs
c2UKKyAgICAgICAgICAgIFtraW5kXQorICAgICAgICBlbmQKKyAgICBlbmQKKworICAgIGRlZiBh
cmdLaW5kcworICAgICAgICBLaW5kLmFyZ0tpbmRzKGtpbmQpCisgICAgZW5kCitlbmQKKworY2xh
c3MgRm9ybQorICAgIGF0dHJfcmVhZGVyIDpraW5kcywgOmFsdE5hbWUKKworICAgIGRlZiBpbml0
aWFsaXplKGtpbmRzLCBhbHROYW1lKQorICAgICAgICBAa2luZHMgPSBraW5kcworICAgICAgICBA
YWx0TmFtZSA9IGFsdE5hbWUKKyAgICBlbmQKK2VuZAorCitjbGFzcyBPcmlnaW4KKyAgICBhdHRy
X3JlYWRlciA6ZmlsZU5hbWUsIDpsaW5lTnVtYmVyCisgICAgCisgICAgZGVmIGluaXRpYWxpemUo
ZmlsZU5hbWUsIGxpbmVOdW1iZXIpCisgICAgICAgIEBmaWxlTmFtZSA9IGZpbGVOYW1lCisgICAg
ICAgIEBsaW5lTnVtYmVyID0gbGluZU51bWJlcgorICAgIGVuZAorICAgIAorICAgIGRlZiB0b19z
CisgICAgICAgICIje2ZpbGVOYW1lfToje2xpbmVOdW1iZXJ9IgorICAgIGVuZAorZW5kCisKK2Ns
YXNzIFRva2VuCisgICAgYXR0cl9yZWFkZXIgOm9yaWdpbiwgOnN0cmluZworICAgIAorICAgIGRl
ZiBpbml0aWFsaXplKG9yaWdpbiwgc3RyaW5nKQorICAgICAgICBAb3JpZ2luID0gb3JpZ2luCisg
ICAgICAgIEBzdHJpbmcgPSBzdHJpbmcKKyAgICBlbmQKKyAgICAKKyAgICBkZWYgPT0ob3RoZXIp
CisgICAgICAgIGlmIG90aGVyLmlzX2E/IFRva2VuCisgICAgICAgICAgICBAc3RyaW5nID09IG90
aGVyLnN0cmluZworICAgICAgICBlbHNlCisgICAgICAgICAgICBAc3RyaW5nID09IG90aGVyCisg
ICAgICAgIGVuZAorICAgIGVuZAorICAgIAorICAgIGRlZiA9fihvdGhlcikKKyAgICAgICAgQHN0
cmluZyA9fiBvdGhlcgorICAgIGVuZAorICAgIAorICAgIGRlZiB0b19zCisgICAgICAgICIje0Bz
dHJpbmcuaW5zcGVjdH0gYXQgI3tvcmlnaW59IgorICAgIGVuZAorICAgIAorICAgIGRlZiBwYXJz
ZUVycm9yKCpjb21tZW50KQorICAgICAgICBpZiBjb21tZW50LmVtcHR5PworICAgICAgICAgICAg
cmFpc2UgIlBhcnNlIGVycm9yOiAje3RvX3N9IgorICAgICAgICBlbHNlCisgICAgICAgICAgICBy
YWlzZSAiUGFyc2UgZXJyb3I6ICN7dG9fc306ICN7Y29tbWVudFswXX0iCisgICAgICAgIGVuZAor
ICAgIGVuZAorZW5kCisKK2RlZiBsZXgoc3RyLCBmaWxlTmFtZSkKKyAgICBmaWxlTmFtZSA9IFBh
dGhuYW1lLm5ldyhmaWxlTmFtZSkKKyAgICByZXN1bHQgPSBbXQorICAgIGxpbmVOdW1iZXIgPSAx
CisgICAgd2hpbGUgbm90IHN0ci5lbXB0eT8KKyAgICAgICAgY2FzZSBzdHIKKyAgICAgICAgd2hl
biAvXEFcIyhbXlxuXSopLworICAgICAgICAgICAgIyBjb21tZW50LCBpZ25vcmUKKyAgICAgICAg
d2hlbiAvXEFcbi8KKyAgICAgICAgICAgICMgbmV3bGluZSwgaWdub3JlCisgICAgICAgICAgICBs
aW5lTnVtYmVyICs9IDEKKyAgICAgICAgd2hlbiAvXEEoW2EtekEtWjAtOV9dKykvCisgICAgICAg
ICAgICByZXN1bHQgPDwgVG9rZW4ubmV3KE9yaWdpbi5uZXcoZmlsZU5hbWUsIGxpbmVOdW1iZXIp
LCAkJikKKyAgICAgICAgd2hlbiAvXEEoWyBcdFxyXSspLworICAgICAgICAgICAgIyB3aGl0ZXNw
YWNlLCBpZ25vcmUKKyAgICAgICAgd2hlbiAvXEFbLDoqXS8KKyAgICAgICAgICAgIHJlc3VsdCA8
PCBUb2tlbi5uZXcoT3JpZ2luLm5ldyhmaWxlTmFtZSwgbGluZU51bWJlciksICQmKQorICAgICAg
ICBlbHNlCisgICAgICAgICAgICByYWlzZSAiTGV4ZXIgZXJyb3IgYXQgI3tPcmlnaW4ubmV3KGZp
bGVOYW1lLCBsaW5lTnVtYmVyKS50b19zfSwgdW5leHBlY3RlZCBzZXF1ZW5jZSAje3N0clswLi4y
MF0uaW5zcGVjdH0iCisgICAgICAgIGVuZAorICAgICAgICBzdHIgPSAkfi5wb3N0X21hdGNoCisg
ICAgZW5kCisgICAgcmVzdWx0CitlbmQKKworZGVmIGlzVUQodG9rZW4pCisgICAgdG9rZW4gPX4g
L1xBKChVKXwoRCl8KFVEKSlcWi8KK2VuZAorCitkZWYgaXNHRih0b2tlbikKKyAgICB0b2tlbiA9
fiAvXEEoKEcpfChGKSlcWi8KK2VuZAorCitkZWYgaXNLaW5kKHRva2VuKQorICAgIHRva2VuID1+
IC9cQSgoVG1wKXwoSW1tKXwoSW1tUHRyKXwoQWRkcil8KEluZGV4KSlcWi8KK2VuZAorCitkZWYg
aXNLZXl3b3JkKHRva2VuKQorICAgIGlzVUQodG9rZW4pIG9yIGlzR0YodG9rZW4pIG9yIGlzS2lu
ZCh0b2tlbikgb3IKKyAgICAgICAgdG9rZW4gPT0gInNwZWNpYWwiIG9yIHRva2VuID09ICJhcyIK
K2VuZAorCitkZWYgaXNJZGVudGlmaWVyKHRva2VuKQorICAgIHRva2VuID1+IC9cQShbYS16QS1a
MC05X10rKVxaLyBhbmQgbm90IGlzS2V5d29yZCh0b2tlbikKK2VuZAorCitjbGFzcyBQYXJzZXIK
KyAgICBkZWYgaW5pdGlhbGl6ZShkYXRhLCBmaWxlTmFtZSkKKyAgICAgICAgQHRva2VucyA9IGxl
eChkYXRhLCBmaWxlTmFtZSkKKyAgICAgICAgQGlkeCA9IDAKKyAgICBlbmQKKworICAgIGRlZiB0
b2tlbgorICAgICAgICBAdG9rZW5zW0BpZHhdCisgICAgZW5kCisKKyAgICBkZWYgYWR2YW5jZQor
ICAgICAgICBAaWR4ICs9IDEKKyAgICBlbmQKKworICAgIGRlZiBwYXJzZUVycm9yKCpjb21tZW50
KQorICAgICAgICBpZiB0b2tlbgorICAgICAgICAgICAgdG9rZW4ucGFyc2VFcnJvcigqY29tbWVu
dCkKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgaWYgY29tbWVudC5lbXB0eT8KKyAgICAgICAg
ICAgICAgICByYWlzZSAiUGFyc2UgZXJyb3IgYXQgZW5kIG9mIGZpbGUiCisgICAgICAgICAgICBl
bHNlCisgICAgICAgICAgICAgICAgcmFpc2UgIlBhcnNlIGVycm9yIGF0IGVuZCBvZiBmaWxlOiAj
e2NvbW1lbnRbMF19IgorICAgICAgICAgICAgZW5kCisgICAgICAgIGVuZAorICAgIGVuZAorCisg
ICAgZGVmIGNvbnN1bWUoc3RyaW5nKQorICAgICAgICBwYXJzZUVycm9yKCJFeHBlY3RlZCAje3N0
cmluZ30iKSB1bmxlc3MgdG9rZW4gPT0gc3RyaW5nCisgICAgICAgIGFkdmFuY2UKKyAgICBlbmQK
KworICAgIGRlZiBjb25zdW1lSWRlbnRpZmllcgorICAgICAgICByZXN1bHQgPSB0b2tlbi5zdHJp
bmcKKyAgICAgICAgcGFyc2VFcnJvcigiRXhwZWN0ZWQgaWRlbnRpZmllciIpIHVubGVzcyBpc0lk
ZW50aWZpZXIocmVzdWx0KQorICAgICAgICBhZHZhbmNlCisgICAgICAgIHJlc3VsdAorICAgIGVu
ZAorCisgICAgZGVmIGNvbnN1bWVSb2xlCisgICAgICAgIHJlc3VsdCA9IHRva2VuLnN0cmluZwor
ICAgICAgICBwYXJzZUVycm9yKCJFeHBlY3RlZCByb2xlIChVLCBELCBvciBVRCkiKSB1bmxlc3Mg
aXNVRChyZXN1bHQpCisgICAgICAgIGFkdmFuY2UKKyAgICAgICAgcmVzdWx0CisgICAgZW5kCisK
KyAgICBkZWYgY29uc3VtZVR5cGUKKyAgICAgICAgcmVzdWx0ID0gdG9rZW4uc3RyaW5nCisgICAg
ICAgIHBhcnNlRXJyb3IoIkV4cGVjdGVkIHR5cGUgKEcgb3IgRikiKSB1bmxlc3MgaXNHRihyZXN1
bHQpCisgICAgICAgIGFkdmFuY2UKKyAgICAgICAgcmVzdWx0CisgICAgZW5kCisKKyAgICBkZWYg
Y29uc3VtZUtpbmQKKyAgICAgICAgcmVzdWx0ID0gdG9rZW4uc3RyaW5nCisgICAgICAgIHBhcnNl
RXJyb3IoIkV4cGVjdGVkIGtpbmQgKEltbSwgSW1tUHRyLCBUbXAsIEFkZHIsIG9yIEluZGV4KSIp
IHVubGVzcyBpc0tpbmQocmVzdWx0KQorICAgICAgICBhZHZhbmNlCisgICAgICAgIHJlc3VsdAor
ICAgIGVuZAorCisgICAgZGVmIHBhcnNlCisgICAgICAgIHJlc3VsdCA9IHt9CisgICAgICAgIAor
ICAgICAgICBsb29wIHsKKyAgICAgICAgICAgIGJyZWFrIGlmIEBpZHggPj0gQHRva2Vucy5sZW5n
dGgKKworICAgICAgICAgICAgaWYgdG9rZW4gPT0gInNwZWNpYWwiCisgICAgICAgICAgICAgICAg
Y29uc3VtZSgic3BlY2lhbCIpCisgICAgICAgICAgICAgICAgb3Bjb2RlTmFtZSA9IGNvbnN1bWVJ
ZGVudGlmaWVyCisKKyAgICAgICAgICAgICAgICBwYXJzZUVycm9yKCJDYW5ub3Qgb3ZlcmxvYWQg
YSBzcGVjaWFsIG9wY29kZSIpIGlmIHJlc3VsdFtvcGNvZGVOYW1lXQorCisgICAgICAgICAgICAg
ICAgcmVzdWx0W29wY29kZU5hbWVdID0gT3Bjb2RlLm5ldyhvcGNvZGVOYW1lLCB0cnVlKQorICAg
ICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIG9wY29kZU5hbWUgPSBjb25zdW1lSWRlbnRp
ZmllcgorCisgICAgICAgICAgICAgICAgaWYgcmVzdWx0W29wY29kZU5hbWVdCisgICAgICAgICAg
ICAgICAgICAgIG9wY29kZSA9IHJlc3VsdFtvcGNvZGVOYW1lXQorICAgICAgICAgICAgICAgICAg
ICBwYXJzZUVycm9yKCJDYW5ub3Qgb3ZlcmxvYWQgYSBzcGVjaWFsIG9wY29kZSIpIGlmIG9wY29k
ZS5zcGVjaWFsCisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICBvcGNv
ZGUgPSBPcGNvZGUubmV3KG9wY29kZU5hbWUsIGZhbHNlKQorICAgICAgICAgICAgICAgICAgICBy
ZXN1bHRbb3Bjb2RlTmFtZV0gPSBvcGNvZGUKKyAgICAgICAgICAgICAgICBlbmQKKworICAgICAg
ICAgICAgICAgIHNpZ25hdHVyZSA9IFtdCisgICAgICAgICAgICAgICAgZm9ybXMgPSBbXQorICAg
ICAgICAgICAgICAgIGlmIGlzVUQodG9rZW4pCisgICAgICAgICAgICAgICAgICAgIGxvb3Agewor
ICAgICAgICAgICAgICAgICAgICAgICAgcm9sZSA9IGNvbnN1bWVSb2xlCisgICAgICAgICAgICAg
ICAgICAgICAgICBjb25zdW1lKCI6IikKKyAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUgPSBj
b25zdW1lVHlwZQorICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAg
ICAgICBzaWduYXR1cmUgPDwgQXJnLm5ldyhyb2xlLCB0eXBlKQorICAgICAgICAgICAgICAgICAg
ICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICBicmVhayB1bmxlc3MgdG9rZW4gPT0gIiwi
CisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdW1lKCIsIikKKyAgICAgICAgICAgICAgICAg
ICAgfQorCisgICAgICAgICAgICAgICAgICAgIGxvb3AgeworICAgICAgICAgICAgICAgICAgICAg
ICAga2luZHMgPSBbXQorICAgICAgICAgICAgICAgICAgICAgICAgYWx0TmFtZSA9IG5pbAorICAg
ICAgICAgICAgICAgICAgICAgICAgbG9vcCB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAg
a2luZHMgPDwgS2luZC5uZXcoY29uc3VtZUtpbmQpCisKKyAgICAgICAgICAgICAgICAgICAgICAg
ICAgICBpZiB0b2tlbiA9PSAiKiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFy
c2VFcnJvcigiQ2FuIG9ubHkgYXBwbHkgKiB0byBUbXAiKSB1bmxlc3Mga2luZHNbLTFdLm5hbWUg
PT0gIlRtcCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2luZHNbLTFdLnNwZWNp
YWwgPSB0cnVlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN1bWUoIioiKQor
ICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuZAorCisgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgYnJlYWsgdW5sZXNzIHRva2VuID09ICIsIgorICAgICAgICAgICAgICAgICAgICAgICAg
ICAgIGNvbnN1bWUoIiwiKQorICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAg
ICAgICAgICAgICAgICBpZiB0b2tlbiA9PSAiYXMiCisgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgY29uc3VtZSgiYXMiKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsdE5hbWUgPSBj
b25zdW1lSWRlbnRpZmllcgorICAgICAgICAgICAgICAgICAgICAgICAgZW5kCisKKyAgICAgICAg
ICAgICAgICAgICAgICAgIHBhcnNlRXJyb3IoIkZvcm0gaGFzIHdyb25nIG51bWJlciBvZiBhcmd1
bWVudHMgZm9yIG92ZXJsb2FkIikgdW5sZXNzIGtpbmRzLmxlbmd0aCA9PSBzaWduYXR1cmUubGVu
Z3RoCisgICAgICAgICAgICAgICAgICAgICAgICBraW5kcy5lYWNoX3dpdGhfaW5kZXggeworICAg
ICAgICAgICAgICAgICAgICAgICAgICAgIHwga2luZCwgaW5kZXggfAorICAgICAgICAgICAgICAg
ICAgICAgICAgICAgIGlmIGtpbmQubmFtZSA9PSAiSW1tIiBvciBraW5kLm5hbWUgPT0gIkltbVB0
ciIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgc2lnbmF0dXJlW2luZGV4XS5y
b2xlICE9ICJVIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyc2VFcnJv
cigiRm9ybSBoYXMgYW4gaW1tZWRpYXRlIGZvciBhIG5vbi11c2UgYXJndW1lbnQiKQorICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICBlbmQKKyAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgaWYgc2lnbmF0dXJlW2luZGV4XS50eXBlICE9ICJHIgorICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgcGFyc2VFcnJvcigiRm9ybSBoYXMgYW4gaW1tZWRpYXRlIGZvciBh
IG5vbi1nZW5lcmFsLXB1cnBvc2UgYXJndW1lbnQiKQorICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICBlbmQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmQKKyAgICAgICAgICAg
ICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1zIDw8IEZvcm0ubmV3
KGtpbmRzLCBhbHROYW1lKQorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsgdW5sZXNzIGlz
S2luZCh0b2tlbikKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UK
KyAgICAgICAgICAgICAgICAgICAgc2lnbmF0dXJlID0gW10KKyAgICAgICAgICAgICAgICAgICAg
Zm9ybXMgPSBbRm9ybS5uZXcoW10sIG5pbCldCisgICAgICAgICAgICAgICAgZW5kCisKKyAgICAg
ICAgICAgICAgICBvcGNvZGUub3ZlcmxvYWRzIDw8IE92ZXJsb2FkLm5ldyhzaWduYXR1cmUsIGZv
cm1zKQorICAgICAgICAgICAgZW5kCisgICAgICAgIH0KKworICAgICAgICByZXN1bHQKKyAgICBl
bmQKK2VuZAorCiskZmlsZU5hbWUgPSBBUkdWWzBdCisKK3BhcnNlciA9IFBhcnNlci5uZXcoSU86
OnJlYWQoJGZpbGVOYW1lKSwgJGZpbGVOYW1lKQorJG9wY29kZXMgPSBwYXJzZXIucGFyc2UKKwor
ZGVmIHdyaXRlSChmaWxlbmFtZSkKKyAgICBGaWxlLm9wZW4oIkFpciN7ZmlsZW5hbWV9LmgiLCAi
dyIpIHsKKyAgICAgICAgfCBvdXRwIHwKKyAgICAgICAgCisgICAgICAgIG91dHAucHV0cyAiLy8g
R2VuZXJhdGVkIGJ5IG9wY29kZV9nZW5lcmF0b3IucmIgZnJvbSAjeyRmaWxlTmFtZX0gLS0gZG8g
bm90IGVkaXQhIgorICAgICAgICAKKyAgICAgICAgb3V0cC5wdXRzICIjaWZuZGVmIEFpciN7Zmls
ZW5hbWV9X2giCisgICAgICAgIG91dHAucHV0cyAiI2RlZmluZSBBaXIje2ZpbGVuYW1lfV9oIgor
CisgICAgICAgIHlpZWxkIG91dHAKKyAgICAgICAgCisgICAgICAgIG91dHAucHV0cyAiI2VuZGlm
IC8vIEFpciN7ZmlsZW5hbWV9X2giCisgICAgfQorZW5kCisKK2RlZiB3cml0ZUNQUChmaWxlbmFt
ZSkKKyAgICBGaWxlLm9wZW4oIkFpciN7ZmlsZW5hbWV9LmNwcCIsICJ3IikgeworICAgICAgICB8
IG91dHAgfAorICAgICAgICAKKyAgICAgICAgb3V0cC5wdXRzICIvLyBHZW5lcmF0ZWQgYnkgb3Bj
b2RlX2dlbmVyYXRvci5yYiBmcm9tICN7JGZpbGVOYW1lfSAtLSBkbyBub3QgZWRpdCEiCisgICAg
ICAgIAorICAgICAgICBvdXRwLnB1dHMgIiNpbmNsdWRlIFwiY29uZmlnLmhcIiIKKyAgICAgICAg
b3V0cC5wdXRzICIjaW5jbHVkZSBcIkFpciN7ZmlsZW5hbWV9LmhcIiIKKworICAgICAgICB5aWVs
ZCBvdXRwCisgICAgfQorZW5kCisKK3dyaXRlSCgiT3Bjb2RlIikgeworICAgIHwgb3V0cCB8Cisg
ICAgb3V0cC5wdXRzICJuYW1lc3BhY2UgSlNDIHsgbmFtZXNwYWNlIEIzIHsgbmFtZXNwYWNlIEFp
ciB7IgorICAgIG91dHAucHV0cyAiZW51bSBPcGNvZGUgOiBpbnQxNl90IHsiCisgICAgJG9wY29k
ZXMua2V5cy5zb3J0LmVhY2ggeworICAgICAgICB8IG9wY29kZSB8CisgICAgICAgIG91dHAucHV0
cyAiICAgICN7b3Bjb2RlfSwiCisgICAgfQorICAgIG91dHAucHV0cyAifSIKKworICAgIG91dHAu
cHV0cyAic3RhdGljIGNvbnN0IHVuc2lnbmVkIG51bU9wY29kZXMgPSAjeyRvcGNvZGVzLmtleXMu
c2l6ZX07IgorICAgIG91dHAucHV0cyAifSB9IH0gLy8gbmFtZXNwYWNlIEpTQzo6QjM6OkFpciIK
KyAgICAKKyAgICBvdXRwLnB1dHMgIm5hbWVzcGFjZSBXVEYgeyIKKyAgICBvdXRwLnB1dHMgImNs
YXNzIFByaW50U3RyZWFtOyIKKyAgICBvdXRwLnB1dHMgInZvaWQgcHJpbnRJbnRlcm5hbChQcmlu
dFN0cmVhbSYsIEpTQzo6QjM6OkFpcjo6T3Bjb2RlKTsiCisgICAgb3V0cC5wdXRzICJ9IC8vIG5h
bWVzcGFjZSBXVEYiCit9CisKK3dyaXRlQ1BQKCJPcGNvZGUiKSB7CisgICAgfCBvdXRwIHwKKyAg
ICBvdXRwLnB1dHMgIiNpbmNsdWRlIFwid3RmL1ByaW50U3RyZWFtLmhcIiIKKyAgICBvdXRwLnB1
dHMgIm5hbWVzcGFjZSBXVEYgeyIKKyAgICBvdXRwLnB1dHMgInVzaW5nIG5hbWVzcGFjZSBKU0M6
OkIzOjpBaXI7IgorICAgIG91dHAucHV0cyAidm9pZCBwcmludEludGVybmFsKFByaW50U3RyZWFt
JiBvdXQsIE9wY29kZSBvcGNvZGUpIgorICAgIG91dHAucHV0cyAieyIKKyAgICBvdXRwLnB1dHMg
IiAgICBzd2l0Y2ggKG9wY29kZSkgeyIKKyAgICAkb3Bjb2Rlcy5rZXlzLmVhY2ggeworICAgICAg
ICB8IG9wY29kZSB8CisgICAgICAgIG91dHAucHV0cyAiICAgIGNhc2UgI3tvcGNvZGV9OiIKKyAg
ICAgICAgb3V0cC5wdXRzICIgICAgICAgIG91dC5wcmludChcIiN7b3Bjb2RlfVwiKTsiCisgICAg
ICAgIG91dHAucHV0cyAiICAgICAgICByZXR1cm47IgorICAgIH0KKyAgICBvdXRwLnB1dHMgIiAg
ICB9IgorICAgIG91dHAucHV0cyAiICAgIFJFTEVBU0VfQVNTRVJUX05PVF9SRUFDSEVEKCk7Igor
ICAgIG91dHAucHV0cyAifSIKKyAgICBvdXRwLnB1dHMgIn0gLy8gbmFtZXNwYWNlIFdURiIKK30K
KworIyBGcm9tIGhlcmUgb24sIHdlIGRvbid0IHRyeSB0byBlbWl0IHByb3Blcmx5IGluZGVudGVk
IGNvZGUsIHNpbmNlIHdlJ3JlIHVzaW5nIGEgcmVjdXJzaXZlIHBhdHRlcm4KKyMgbWF0Y2hlci4K
KworZGVmIG1hdGNoRm9ybXMob3V0cCwgc3BlZWQsIGZvcm1zLCBjb2x1bW5JbmRleCwgY29sdW1u
R2V0dGVyLCBmaWx0ZXIsIGNhbGxiYWNrKQorICAgIHJldHVybiBpZiBmb3Jtcy5sZW5ndGggPT0g
MAorCisgICAgaWYgZmlsdGVyW2Zvcm1zXQorICAgICAgICByZXR1cm4KKyAgICBlbmQKKworICAg
IGlmIGNvbHVtbkluZGV4ID49IGZvcm1zWzBdLmtpbmRzLmxlbmd0aAorICAgICAgICByYWlzZSB1
bmxlc3MgZm9ybXMubGVuZ3RoID09IDEKKyAgICAgICAgY2FsbGJhY2tbZm9ybXNbMF1dCisgICAg
ICAgIHJldHVybgorICAgIGVuZAorICAgIAorICAgIGdyb3VwcyA9IHt9CisgICAgZm9ybXMuZWFj
aCB7CisgICAgICAgIHwgZm9ybSB8CisgICAgICAgIGtpbmQgPSBmb3JtLmtpbmRzW2NvbHVtbklu
ZGV4XS5uYW1lCisgICAgICAgIGlmIGdyb3Vwc1traW5kXQorICAgICAgICAgICAgZ3JvdXBzW2tp
bmRdIDw8IGZvcm0KKyAgICAgICAgZWxzZQorICAgICAgICAgICAgZ3JvdXBzW2tpbmRdID0gW2Zv
cm1dCisgICAgICAgIGVuZAorICAgIH0KKworICAgIGlmIHNwZWVkID09IDpmYXN0IGFuZCBncm91
cHMubGVuZ3RoID09IDEKKyAgICAgICAgbWF0Y2hGb3JtcyhvdXRwLCBzcGVlZCwgZm9ybXMsIGNv
bHVtbkluZGV4ICsgMSwgY29sdW1uR2V0dGVyLCBmaWx0ZXIsIGNhbGxiYWNrKQorICAgICAgICBy
ZXR1cm4KKyAgICBlbmQKKworICAgIG91dHAucHV0cyAic3dpdGNoICgje2NvbHVtbkdldHRlcltj
b2x1bW5JbmRleF19KSB7IgorICAgIGdyb3Vwcy5lYWNoX3BhaXIgeworICAgICAgICB8IGtleSwg
dmFsdWUgfAorICAgICAgICBLaW5kLmFyZ0tpbmRzKGtleSkuZWFjaCB7CisgICAgICAgICAgICB8
IGFyZ0tpbmQgfAorICAgICAgICAgICAgb3V0cC5wdXRzICJjYXNlIEFyZzo6I3thcmdLaW5kfToi
CisgICAgICAgIH0KKyAgICAgICAgbWF0Y2hGb3JtcyhvdXRwLCBzcGVlZCwgdmFsdWUsIGNvbHVt
bkluZGV4ICsgMSwgY29sdW1uR2V0dGVyLCBmaWx0ZXIsIGNhbGxiYWNrKQorICAgICAgICBvdXRw
LnB1dHMgImJyZWFrOyIKKyAgICB9CisgICAgb3V0cC5wdXRzICJkZWZhdWx0OiIKKyAgICBvdXRw
LnB1dHMgImJyZWFrOyIKKyAgICBvdXRwLnB1dHMgIn0iCitlbmQKKworZGVmIG1hdGNoSW5zdE92
ZXJsb2FkKG91dHAsIHNwZWVkLCBpbnN0KQorICAgIG91dHAucHV0cyAic3dpdGNoICgje2luc3R9
LT5vcGNvZGUpIHsiCisgICAgJG9wY29kZXMudmFsdWVzLmVhY2ggeworICAgICAgICB8IG9wY29k
ZSB8CisgICAgICAgIG91dHAucHV0cyAiY2FzZSAje29wY29kZS5uYW1lfToiCisgICAgICAgIGlm
IG9wY29kZS5zcGVjaWFsCisgICAgICAgICAgICB5aWVsZCBvcGNvZGUsIG5pbAorICAgICAgICBl
bHNlCisgICAgICAgICAgICBuZWVkT3ZlcmxvYWRTd2l0Y2ggPSAoKG9wY29kZS5vdmVybG9hZHMu
c2l6ZSAhPSAxKSBvciBzcGVlZCA9PSA6c2FmZSkKKyAgICAgICAgICAgIG91dHAucHV0cyAic3dp
dGNoICgje2luc3R9LT5hcmdzLnNpemUoKSkgeyIgaWYgbmVlZE92ZXJsb2FkU3dpdGNoCisgICAg
ICAgICAgICBvcGNvZGUub3ZlcmxvYWRzLmVhY2ggeworICAgICAgICAgICAgICAgIHwgb3Zlcmxv
YWQgfAorICAgICAgICAgICAgICAgIG91dHAucHV0cyAiY2FzZSAje292ZXJsb2FkLnNpZ25hdHVy
ZS5sZW5ndGh9OiIgaWYgbmVlZE92ZXJsb2FkU3dpdGNoCisgICAgICAgICAgICAgICAgeWllbGQg
b3Bjb2RlLCBvdmVybG9hZAorICAgICAgICAgICAgICAgIG91dHAucHV0cyAiYnJlYWs7IiBpZiBu
ZWVkT3ZlcmxvYWRTd2l0Y2gKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIG5lZWRPdmVy
bG9hZFN3aXRjaAorICAgICAgICAgICAgICAgIG91dHAucHV0cyAiZGVmYXVsdDoiCisgICAgICAg
ICAgICAgICAgb3V0cC5wdXRzICJicmVhazsiCisgICAgICAgICAgICAgICAgb3V0cC5wdXRzICJ9
IgorICAgICAgICAgICAgZW5kCisgICAgICAgIGVuZAorICAgICAgICBvdXRwLnB1dHMgImJyZWFr
OyIKKyAgICB9CisgICAgb3V0cC5wdXRzICJkZWZhdWx0OiIKKyAgICBvdXRwLnB1dHMgImJyZWFr
OyIKKyAgICBvdXRwLnB1dHMgIn0iCitlbmQKKyAgICAKK2RlZiBtYXRjaEluc3RPdmVybG9hZEZv
cm0ob3V0cCwgc3BlZWQsIGluc3QpCisgICAgbWF0Y2hJbnN0T3ZlcmxvYWQob3V0cCwgc3BlZWQs
IGluc3QpIHsKKyAgICAgICAgfCBvcGNvZGUsIG92ZXJsb2FkIHwKKyAgICAgICAgaWYgb3Bjb2Rl
LnNwZWNpYWwKKyAgICAgICAgICAgIHlpZWxkIG9wY29kZSwgbmlsLCBuaWwKKyAgICAgICAgZWxz
ZQorICAgICAgICAgICAgY29sdW1uR2V0dGVyID0gcHJvYyB7CisgICAgICAgICAgICAgICAgfCBj
b2x1bW5JbmRleCB8CisgICAgICAgICAgICAgICAgIiN7aW5zdH0tPmFyZ3NbI3tjb2x1bW5JbmRl
eH1dLmtpbmQoKSIKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZpbHRlciA9IHByb2MgeyBm
YWxzZSB9CisgICAgICAgICAgICBjYWxsYmFjayA9IHByb2MgeworICAgICAgICAgICAgICAgIHwg
Zm9ybSB8CisgICAgICAgICAgICAgICAgeWllbGQgb3Bjb2RlLCBvdmVybG9hZCwgZm9ybQorICAg
ICAgICAgICAgfQorICAgICAgICAgICAgbWF0Y2hGb3JtcyhvdXRwLCBzcGVlZCwgb3ZlcmxvYWQu
Zm9ybXMsIDAsIGNvbHVtbkdldHRlciwgZmlsdGVyLCBjYWxsYmFjaykKKyAgICAgICAgZW5kCisg
ICAgfQorZW5kCisKK3dyaXRlSCgiT3Bjb2RlVXRpbHMiKSB7CisgICAgfCBvdXRwIHwKKyAgICBv
dXRwLnB1dHMgIiNpbmNsdWRlIFwiQWlySW5zdC5oXCIiCisgICAgb3V0cC5wdXRzICIjaW5jbHVk
ZSBcIkFpclNwZWNpYWxzLmhcIiIKKyAgICBvdXRwLnB1dHMgIm5hbWVzcGFjZSBKU0MgeyBuYW1l
c3BhY2UgQjMgeyBuYW1lc3BhY2UgQWlyIHsiCisgICAgCisgICAgb3V0cC5wdXRzICJ0ZW1wbGF0
ZTx0eXBlbmFtZSBGdW5jdG9yPiIKKyAgICBvdXRwLnB1dHMgInZvaWQgSW5zdDo6Zm9yRWFjaEFy
Zyhjb25zdCBGdW5jdG9yJiBmdW5jdG9yKSIKKyAgICBvdXRwLnB1dHMgInsiCisgICAgbWF0Y2hJ
bnN0T3ZlcmxvYWQob3V0cCwgOmZhc3QsICJ0aGlzIikgeworICAgICAgICB8IG9wY29kZSwgb3Zl
cmxvYWQgfAorICAgICAgICBpZiBvcGNvZGUuc3BlY2lhbAorICAgICAgICAgICAgb3V0cC5wdXRz
ICIje29wY29kZS5uYW1lfVNwZWNpYWxzOjpmb3JFYWNoQXJnKHRoaXMsIGZ1bmN0b3IpOyIKKyAg
ICAgICAgZWxzZQorICAgICAgICAgICAgb3ZlcmxvYWQuc2lnbmF0dXJlLmVhY2hfd2l0aF9pbmRl
eCB7CisgICAgICAgICAgICAgICAgfCBhcmcsIGluZGV4IHwKKyAgICAgICAgICAgICAgICByb2xl
ID0gbmlsCisgICAgICAgICAgICAgICAgY2FzZSBhcmcucm9sZQorICAgICAgICAgICAgICAgIHdo
ZW4gIlUiCisgICAgICAgICAgICAgICAgICAgIHJvbGUgPSAiVXNlIgorICAgICAgICAgICAgICAg
IHdoZW4gIkQiCisgICAgICAgICAgICAgICAgICAgIHJvbGUgPSAiRGVmIgorICAgICAgICAgICAg
ICAgIHdoZW4gIlVEIgorICAgICAgICAgICAgICAgICAgICByb2xlID0gIlVzZURlZiIKKyAgICAg
ICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHJhaXNlCisgICAgICAgICAgICAg
ICAgZW5kCisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgb3V0cC5wdXRzICJmdW5j
dG9yKGFyZ3NbI3tpbmRleH1dLCBBcmc6OiN7cm9sZX0sIEFyZzo6I3thcmcudHlwZX1QKTsiCisg
ICAgICAgICAgICB9CisgICAgICAgIGVuZAorICAgIH0KKyAgICBvdXRwLnB1dHMgIn0iCisgICAg
CisgICAgb3V0cC5wdXRzICJ9IH0gfSAvLyBuYW1lc3BhY2UgSlNDOjpCMzo6QWlyIgorfQorCit3
cml0ZUNQUCgiT3Bjb2RlVXRpbHMiKSB7CisgICAgfCBvdXRwIHwKKyAgICBvdXRwLnB1dHMgIiNp
bmNsdWRlIFwiQWlySW5zdC5oXCIiCisgICAgb3V0cC5wdXRzICIjaW5jbHVkZSBcIkFpclNwZWNp
YWxzLmhcIiIKKyAgICBvdXRwLnB1dHMgIm5hbWVzcGFjZSBKU0MgeyBuYW1lc3BhY2UgQjMgeyBu
YW1lc3BhY2UgQWlyIHsiCisgICAgb3V0cC5wdXRzICJpbmxpbmUgYm9vbCBoaWRkZW5UcnV0aCgp
IHsgcmV0dXJuIHRydWU7IH0iCisgICAgb3V0cC5wdXRzICIjZGVmaW5lIFJFVFVSTih2YWx1ZSkg
ZG8ge1xcIgorICAgIG91dHAucHV0cyAiICAgIGlmIChoaWRkZW5UcnV0aCgpKVxcIgorICAgIG91
dHAucHV0cyAiICAgICAgICByZXR1cm4gdmFsdWU7XFwiCisgICAgb3V0cC5wdXRzICJ9IgorICAg
IG91dHAucHV0cyAiYm9vbCBJbnN0Ojppc1ZhbGlkRm9ybSgpIgorICAgIG91dHAucHV0cyAieyIK
KyAgICBtYXRjaEluc3RPdmVybG9hZEZvcm0ob3V0cCwgOnNhZmUsICJ0aGlzIikgeworICAgICAg
ICB8IG9wY29kZSwgb3ZlcmxvYWQsIGZvcm0gfAorICAgICAgICBpZiBvcGNvZGUuc3BlY2lhbAor
ICAgICAgICAgICAgb3V0cC5wdXRzICJSRVRVUk4oI3tvcGNvZGUubmFtZX1TcGVjaWFsczo6aXNW
YWxpZCh0aGlzKSk7IgorICAgICAgICBlbHNlCisgICAgICAgICAgICBuZWVkc01vcmVWYWxpZGF0
aW9uID0gZmFsc2UKKyAgICAgICAgICAgIG92ZXJsb2FkLnNpZ25hdHVyZS5sZW5ndGgudGltZXMg
eworICAgICAgICAgICAgICAgIHwgaW5kZXggfAorICAgICAgICAgICAgICAgIHJvbGUgPSBvdmVy
bG9hZC5zaWduYXR1cmVbaW5kZXhdLnJvbGUKKyAgICAgICAgICAgICAgICB0eXBlID0gb3Zlcmxv
YWQuc2lnbmF0dXJlW2luZGV4XS50eXBlCisgICAgICAgICAgICAgICAga2luZCA9IGZvcm0ua2lu
ZHNbaW5kZXhdCisgICAgICAgICAgICAgICAgbmVlZHNNb3JlVmFsaWRhdGlvbiB8PSBraW5kLnNw
ZWNpYWwKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAjIFdlIGFscmVhZHkga25v
dyB0aGF0IHRoZSBmb3JtIG1hdGNoZXMuIFdlIGRvbid0IGhhdmUgdG8gdmFsaWRhdGUgdGhlIHJv
bGUsIHNpbmNlCisgICAgICAgICAgICAgICAgIyBraW5kIGltcGxpZXMgcm9sZS4gU28sIHRoZSBv
bmx5IHRoaW5nIGxlZnQgdG8gdmFsaWRhdGUgaXMgdGhlIHR5cGUuIEFuZCB3ZSBvbmx5IGhhdmUK
KyAgICAgICAgICAgICAgICAjIHRvIHZhbGlkYXRlIHRoZSB0eXBlIGlmIHdlIGhhdmUgYSBUbXAu
CisgICAgICAgICAgICAgICAgaWYga2luZC5uYW1lID09ICJUbXAiCisgICAgICAgICAgICAgICAg
ICAgIG91dHAucHV0cyAiaWYgKCFhcmdzWyN7aW5kZXh9XS50bXAoKS5pcyN7dHlwZX1QKCkpIgor
ICAgICAgICAgICAgICAgICAgICBvdXRwLnB1dHMgIlJFVFVSTihmYWxzZSk7IgorICAgICAgICAg
ICAgICAgIGVuZAorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgbmVlZHNNb3JlVmFsaWRh
dGlvbgorICAgICAgICAgICAgICAgIG91dHAucHV0cyAiaWYgKCEje29wY29kZS5uYW1lfVNwZWNp
YWxzOjppc1ZhbGlkKHRoaXMpKSIKKyAgICAgICAgICAgICAgICBvdXRwLnB1dHMgIlJFVFVSTihm
YWxzZSk7IgorICAgICAgICAgICAgZW5kCisgICAgICAgICAgICBvdXRwLnB1dHMgIlJFVFVSTih0
cnVlKTsiCisgICAgICAgIGVuZAorICAgIH0KKyAgICBvdXRwLnB1dHMgInJldHVybiBmYWxzZTsi
CisgICAgb3V0cC5wdXRzICJ9IgorCisgICAgb3V0cC5wdXRzICJib29sIEluc3Q6OmFkbWl0c1N0
YWNrKHVuc2lnbmVkIGFyZ0luZGV4KSIKKyAgICBvdXRwLnB1dHMgInsiCisgICAgb3V0cC5wdXRz
ICJzd2l0Y2ggKG9wY29kZSkgeyIKKyAgICAkb3Bjb2Rlcy52YWx1ZXMuZWFjaCB7CisgICAgICAg
IHwgb3Bjb2RlIHwKKyAgICAgICAgb3V0cC5wdXRzICJjYXNlICN7b3Bjb2RlLm5hbWV9OiIKKwor
ICAgICAgICBpZiBvcGNvZGUuc3BlY2lhbAorICAgICAgICAgICAgb3V0cC5wdXRzICJSRVRVUk4o
I3tvcGNvZGUubmFtZX1TcGVjaWFsczo6YWRtaXRzU3RhY2soYXJnSW5kZXgpKTsiCisgICAgICAg
IGVsc2UKKyAgICAgICAgICAgICMgU3dpdGNoIG9uIHRoZSBhcmdJbmRleC4KKyAgICAgICAgICAg
IG91dHAucHV0cyAic3dpdGNoIChhcmdJbmRleCkgeyIKKworICAgICAgICAgICAgbnVtQXJncyA9
IG9wY29kZS5vdmVybG9hZHMubWFwIHsKKyAgICAgICAgICAgICAgICB8IG92ZXJsb2FkIHwKKyAg
ICAgICAgICAgICAgICBvdmVybG9hZC5zaWduYXR1cmUubGVuZ3RoCisgICAgICAgICAgICB9Lm1h
eAorICAgICAgICAgICAgCisgICAgICAgICAgICBudW1BcmdzLnRpbWVzIHsKKyAgICAgICAgICAg
ICAgICB8IGFyZ0luZGV4IHwKKyAgICAgICAgICAgICAgICBvdXRwLnB1dHMgImNhc2UgI3thcmdJ
bmRleH06IgorCisgICAgICAgICAgICAgICAgIyBDaGVjayBpZiBhbGwgb2YgdGhlIGZvcm1zIG9m
IGFsbCBvZiB0aGUgb3ZlcmxvYWRzIGVpdGhlciBkbywgb3IgZG9uJ3QsIGFkbWl0IGFuIGFkZHJl
c3MKKyAgICAgICAgICAgICAgICAjIGF0IHRoaXMgaW5kZXguIFdlIGV4cGVjdCB0aGlzIHRvIGJl
IGEgdmVyeSBjb21tb24gY2FzZS4KKyAgICAgICAgICAgICAgICBudW1ZZXMgPSAwCisgICAgICAg
ICAgICAgICAgbnVtTm8gPSAwCisgICAgICAgICAgICAgICAgb3Bjb2RlLm92ZXJsb2Fkcy5lYWNo
IHsKKyAgICAgICAgICAgICAgICAgICAgfCBvdmVybG9hZCB8CisgICAgICAgICAgICAgICAgICAg
IG92ZXJsb2FkLmZvcm1zLmVhY2ggeworICAgICAgICAgICAgICAgICAgICAgICAgfCBmb3JtIHwK
KyAgICAgICAgICAgICAgICAgICAgICAgIGlmIGZvcm0ua2luZHNbYXJnSW5kZXhdID09ICJBZGRy
IgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bVllcyArPSAxCisgICAgICAgICAgICAg
ICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtTm8gKz0gMQor
ICAgICAgICAgICAgICAgICAgICAgICAgZW5kCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAg
ICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAjIE5vdGUgdGhhdCB3ZSBkZWxpYmVyYXRl
bHkgdGVzdCBudW1ZZXMgZmlyc3QgYmVjYXVzZSBpZiB3ZSBlbmQgdXAgd2l0aCBubyBmb3Jtcywg
d2Ugd2FudAorICAgICAgICAgICAgICAgICMgdG8gc2F5IHRoYXQgQWRkcmVzcyBpcyBpbmFkbWlz
c2libGUuCisgICAgICAgICAgICAgICAgaWYgbnVtWWVzID09IDAKKyAgICAgICAgICAgICAgICAg
ICAgb3V0cC5wdXRzICJSRVRVUk4oZmFsc2UpOyIKKyAgICAgICAgICAgICAgICBlbHNpZiBudW1O
byA9PSAwCisgICAgICAgICAgICAgICAgICAgIG91dHAucHV0cyAiUkVUVVJOKHRydWUpOyIKKyAg
ICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICMgTm93IGRvIHRoZSBmdWxs
IHRlc3QuCisKKyAgICAgICAgICAgICAgICAgICAgbmVlZE92ZXJsb2FkU3dpdGNoID0gKG9wY29k
ZS5vdmVybG9hZHMuc2l6ZSAhPSAxKQorCisgICAgICAgICAgICAgICAgICAgIG91dHAucHV0cyAi
c3dpdGNoIChhcmdzLnNpemUoKSkgeyIgaWYgbmVlZE92ZXJsb2FkU3dpdGNoCisgICAgICAgICAg
ICAgICAgICAgIG9wY29kZS5vdmVybG9hZHMuZWFjaCB7CisgICAgICAgICAgICAgICAgICAgICAg
ICB8IG92ZXJsb2FkIHwKKworICAgICAgICAgICAgICAgICAgICAgICAgIyBBZ2FpbiwgY2hlY2sg
aWYgYWxsIG9mIHRoZW0gZG8gd2hhdCB3ZSB3YW50LgorICAgICAgICAgICAgICAgICAgICAgICAg
bnVtWWVzID0gMAorICAgICAgICAgICAgICAgICAgICAgICAgbnVtTm8gPSAwCisgICAgICAgICAg
ICAgICAgICAgICAgICBvdmVybG9hZC5mb3Jtcy5lYWNoIHsKKyAgICAgICAgICAgICAgICAgICAg
ICAgICAgICB8IGZvcm0gfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIGZvcm0ua2lu
ZHNbYXJnSW5kZXhdID09ICJBZGRyIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBu
dW1ZZXMgKz0gMQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgbnVtTm8gKz0gMQorICAgICAgICAgICAgICAgICAgICAgICAg
ICAgIGVuZAorICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAg
ICAgICBpZiBudW1ZZXMgPT0gMAorICAgICAgICAgICAgICAgICAgICAgICAgIyBEb24ndCBlbWl0
IGFueXRoaW5nLCBqdXN0IGRyb3AgdG8gZGVmYXVsdC4KKyAgICAgICAgICAgICAgICAgICAgICAg
IGVsc2lmIG51bU5vID09IDAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwLnB1dHMg
ImNhc2UgI3tvdmVybG9hZC5zaWduYXR1cmUubGVuZ3RofToiIGlmIG5lZWRPdmVybG9hZFN3aXRj
aAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHAucHV0cyAiUkVUVVJOKHRydWUpOyIK
KyAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwLnB1dHMgImJyZWFrOyIgaWYgbmVlZE92
ZXJsb2FkU3dpdGNoCisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgb3V0cC5wdXRzICJjYXNlICN7b3ZlcmxvYWQuc2lnbmF0dXJlLmxlbmd0
aH06IiBpZiBuZWVkT3ZlcmxvYWRTd2l0Y2gKKworICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICMgVGhpcyBpcyBob3cgd2UgdGVzdCB0aGUgaHlwb3RoZXNpcyB0aGF0IGNoYW5naW5nIHRoaXMg
YXJndW1lbnQgdG8gYW4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIGFkZHJlc3MgeWll
bGRzIGEgdmFsaWQgZm9ybS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2x1bW5HZXR0
ZXIgPSBwcm9jIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBjb2x1bW5JbmRl
eCB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIGNvbHVtbkluZGV4ID09IGFy
Z0luZGV4CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQXJnOjpBZGRyIgor
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAiYXJnc1sje2NvbHVtbkluZGV4fV0ua2luZCgpIgorICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICBlbmQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9
CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyID0gcHJvYyB7CisgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgIHwgZm9ybXMgfAorICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICBudW1ZZXMgPSAwCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9y
bXMuZWFjaCB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGZvcm0gfAor
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgZm9ybS5raW5kc1thcmdJbmRl
eF0gPT0gIkFkZHIiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVt
WWVzICs9IDEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuZAorICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgaWYgbnVtWWVzID09IDAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICMgRHJvcCBkb3duLCBlbWl0IG5vIGNvZGUsIHNpbmNlIHdlIGNhbm5vdCBtYXRjaC4KKyAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRydWUKKyAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBL
ZWVwIGdvaW5nLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UKKyAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5kCisgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrID0gcHJvYyB7Cisg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHAucHV0cyAiUkVUVVJOKHRydWUpOyIK
KyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgbWF0Y2hGb3JtcyhvdXRwLCA6c2FmZSwgb3ZlcmxvYWQuZm9ybXMsIDAsIGNvbHVtbkdldHRl
ciwgZmlsdGVyLCBjYWxsYmFjaykKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHAu
cHV0cyAiYnJlYWs7IiBpZiBuZWVkT3ZlcmxvYWRTd2l0Y2gKKyAgICAgICAgICAgICAgICAgICAg
ICAgIGVuZAorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmIG5l
ZWRPdmVybG9hZFN3aXRjaAorICAgICAgICAgICAgICAgICAgICAgICAgb3V0cC5wdXRzICJkZWZh
dWx0OiIKKyAgICAgICAgICAgICAgICAgICAgICAgIG91dHAucHV0cyAiYnJlYWs7IgorICAgICAg
ICAgICAgICAgICAgICAgICAgb3V0cC5wdXRzICJ9IgorICAgICAgICAgICAgICAgICAgICBlbmQK
KyAgICAgICAgICAgICAgICBlbmQKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBv
dXRwLnB1dHMgImJyZWFrOyIKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIAorICAgICAgICAg
ICAgb3V0cC5wdXRzICJkZWZhdWx0OiIKKyAgICAgICAgICAgIG91dHAucHV0cyAiYnJlYWs7Igor
ICAgICAgICAgICAgb3V0cC5wdXRzICJ9IgorICAgICAgICBlbmQKKyAgICAgICAgCisgICAgICAg
IG91dHAucHV0cyAiYnJlYWs7IgorICAgIH0KKyAgICBvdXRwLnB1dHMgImRlZmF1bHQ6IjsKKyAg
ICBvdXRwLnB1dHMgImJyZWFrOyIKKyAgICBvdXRwLnB1dHMgIn0iCisgICAgb3V0cC5wdXRzICJy
ZXR1cm4gZmFsc2U7IgorICAgIG91dHAucHV0cyAifSIKKworICAgIG91dHAucHV0cyAiTWFjcm9B
c3NlbWJsZXI6Okp1bXAgSW5zdDo6Z2VuZXJhdGUoTWFjcm9Bc3NlbWJsZXImIGppdCkgY29uc3Qi
CisgICAgb3V0cC5wdXRzICJ7IgorICAgIG91dHAucHV0cyAiTWFjcm9Bc3NlbWJsZXI6Okp1bXAg
cmVzdWx0OyIKKyAgICBtYXRjaEluc3RPdmVybG9hZEZvcm0ob3V0cCwgOmZhc3QsICJ0aGlzIikg
eworICAgICAgICB8IG9wY29kZSwgb3ZlcmxvYWQsIGZvcm0gfAorICAgICAgICBpZiBvcGNvZGUu
c3BlY2lhbAorICAgICAgICAgICAgb3V0cC5wdXRzICJSRVRVUk4oI3tvcGNvZGUubmFtZX1TcGVj
aWFsczo6Z2VuZXJhdGUodGhpcywgaml0KSk7IgorICAgICAgICBlbHNlCisgICAgICAgICAgICBp
ZiBmb3JtLmFsdE5hbWUKKyAgICAgICAgICAgICAgICBtZXRob2ROYW1lID0gZm9ybS5hbHROYW1l
CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9IG9wY29kZS5t
YXNtTmFtZQorICAgICAgICAgICAgZW5kCisgICAgICAgICAgICBvdXRwLnByaW50ICJqaXQuI3tt
ZXRob2ROYW1lfSgiCisKKyAgICAgICAgICAgIGZvcm0ua2luZHMuZWFjaF93aXRoX2luZGV4IHsK
KyAgICAgICAgICAgICAgICB8IGtpbmQsIGluZGV4IHwKKyAgICAgICAgICAgICAgICBpZiBpbmRl
eCAhPSAwCisgICAgICAgICAgICAgICAgICAgIG91dHAucHJpbnQgIiwgIgorICAgICAgICAgICAg
ICAgIGVuZAorICAgICAgICAgICAgICAgIGNhc2Uga2luZC5uYW1lCisgICAgICAgICAgICAgICAg
d2hlbiAiVG1wIgorICAgICAgICAgICAgICAgICAgICBpZiBvdmVybG9hZC5zaWduYXR1cmVbaW5k
ZXhdLnR5cGUgPT0gIkciCisgICAgICAgICAgICAgICAgICAgICAgICBvdXRwLnByaW50ICJhcmdz
WyN7aW5kZXh9XS5ncHIoKSIKKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAg
ICAgICAgICAgICAgb3V0cC5wcmludCAiYXJnc1sje2luZGV4fV0uZnByKCkiCisgICAgICAgICAg
ICAgICAgICAgIGVuZAorICAgICAgICAgICAgICAgIHdoZW4gIkltbSIKKyAgICAgICAgICAgICAg
ICAgICAgb3V0cC5wcmludCAiYXJnc1sje2luZGV4fV0uYXNUcnVzdGVkSW1tMzIoKSIKKyAgICAg
ICAgICAgICAgICB3aGVuICJJbW1QdHIiCisgICAgICAgICAgICAgICAgICAgIG91dHAucHJpbnQg
ImFyZ3NbI3tpbmRleH1dLmFzVHJ1c3RlZEltbVB0cigpIgorICAgICAgICAgICAgICAgIHdoZW4g
IkFkZHIiCisgICAgICAgICAgICAgICAgICAgIG91dHAucHJpbnQgImFyZ3NbI3tpbmRleH1dLmFz
QWRkcmVzcygpIgorICAgICAgICAgICAgICAgIHdoZW4gIkluZGV4IgorICAgICAgICAgICAgICAg
ICAgICBvdXRwLnByaW50ICJhcmdzWyN7aW5kZXh9XS5hc0Jhc2VJbmRleCgpIgorICAgICAgICAg
ICAgICAgIGVuZAorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBvdXRwLnB1dHMgIik7Igor
ICAgICAgICAgICAgb3V0cC5wdXRzICJSRVRVUk4ocmVzdWx0KTsiCisgICAgICAgIGVuZAorICAg
IH0KKyAgICBvdXRwLnB1dHMgIlJFTEVBU0VfQVNTRVJUX05PVF9SRUFDSEVEKCk7IgorICAgIG91
dHAucHV0cyAifSIKKworICAgIG91dHAucHV0cyAifSB9IH0gLy8gbmFtZXNwYWNlIEpTQzo6QjM6
OkFpciIKK30KKwpJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL2ppdC9SZWcuaAo9PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvaml0L1JlZy5oCShyZXZpc2lvbiAxOTEyMzkp
CisrKyBTb3VyY2UvSmF2YVNjcmlwdENvcmUvaml0L1JlZy5oCSh3b3JraW5nIGNvcHkpCkBAIC0x
MDUsNyArMTA1LDYgQEAgcHVibGljOgogICAgIHVuc2lnbmVkIGluZGV4KCkgY29uc3QgeyByZXR1
cm4gbV9pbmRleDsgfQogICAgIAogICAgIGJvb2wgaXNTZXQoKSBjb25zdCB7IHJldHVybiBtX2lu
ZGV4ICE9IGludmFsaWQoKTsgfQotICAgIGJvb2wgb3BlcmF0b3IhKCkgY29uc3QgeyByZXR1cm4g
IWlzU2V0KCk7IH0KICAgICBleHBsaWNpdCBvcGVyYXRvciBib29sKCkgY29uc3QgeyByZXR1cm4g
aXNTZXQoKTsgfQogCiAgICAgYm9vbCBpc0hhc2hUYWJsZURlbGV0ZWRWYWx1ZSgpIGNvbnN0IHsg
cmV0dXJuIG1faW5kZXggPT0gZGVsZXRlZCgpOyB9CkBAIC0xNzAsNiArMTY5LDQ2IEBAIHB1Ymxp
YzoKICAgICAKICAgICB2b2lkIGR1bXAoUHJpbnRTdHJlYW0mKSBjb25zdDsKIAorICAgIGNsYXNz
IEFsbFJlZ3NJdGVyYWJsZSB7CisgICAgcHVibGljOgorCisgICAgICAgIGNsYXNzIGl0ZXJhdG9y
IHsKKyAgICAgICAgcHVibGljOgorICAgICAgICAgICAgaXRlcmF0b3IoKSB7IH0KKworICAgICAg
ICAgICAgZXhwbGljaXQgaXRlcmF0b3IoUmVnIHJlZykKKyAgICAgICAgICAgICAgICA6IG1fcmVn
KHJlZykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgUmVnIG9w
ZXJhdG9yKigpIGNvbnN0IHsgcmV0dXJuIG1fcmVnOyB9CisKKyAgICAgICAgICAgIGl0ZXJhdG9y
JiBvcGVyYXRvcisrKCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtX3JlZyA9IG1f
cmVnLm5leHQoKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gKnRoaXM7CisgICAgICAgICAgICB9
CisKKyAgICAgICAgICAgIGJvb2wgb3BlcmF0b3I9PShjb25zdCBpdGVyYXRvciYgb3RoZXIpIGNv
bnN0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG1fcmVnID09IG90aGVy
Lm1fcmVnOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBib29sIG9wZXJhdG9yIT0oY29u
c3QgaXRlcmF0b3ImIG90aGVyKSBjb25zdAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAg
IHJldHVybiAhKCp0aGlzID09IG90aGVyKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICBwcml2
YXRlOgorICAgICAgICAgICAgUmVnIG1fcmVnOworICAgICAgICB9OworCisgICAgICAgIGl0ZXJh
dG9yIGJlZ2luKCkgY29uc3QgeyByZXR1cm4gaXRlcmF0b3IoUmVnOjpmaXJzdCgpKTsgfQorICAg
ICAgICBpdGVyYXRvciBlbmQoKSBjb25zdCB7IHJldHVybiBpdGVyYXRvcihSZWcoKSk7IH0KKyAg
ICB9OworCisgICAgc3RhdGljIEFsbFJlZ3NJdGVyYWJsZSBhbGwoKSBjb25zdCB7IHJldHVybiBB
bGxSZWdzSXRlcmFibGUoKTsgfQorCiBwcml2YXRlOgogICAgIHN0YXRpYyB1aW50OF90IGludmFs
aWQoKSB7IHJldHVybiAweGZmOyB9CiAKSW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9qaXQv
UmVnaXN0ZXJTZXQuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvaml0L1Jl
Z2lzdGVyU2V0LmgJKHJldmlzaW9uIDE5MTIzOSkKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9q
aXQvUmVnaXN0ZXJTZXQuaAkod29ya2luZyBjb3B5KQpAQCAtMTE3LDYgKzExNywxMyBAQCBwdWJs
aWM6CiAgICAgCiAgICAgYm9vbCBvcGVyYXRvcj09KGNvbnN0IFJlZ2lzdGVyU2V0JiBvdGhlcikg
Y29uc3QgeyByZXR1cm4gbV92ZWN0b3IgPT0gb3RoZXIubV92ZWN0b3I7IH0KICAgICB1bnNpZ25l
ZCBoYXNoKCkgY29uc3QgeyByZXR1cm4gbV92ZWN0b3IuaGFzaCgpOyB9CisKKyAgICB0ZW1wbGF0
ZTx0eXBlbmFtZSBGdW5jdG9yPgorICAgIHZvaWQgZm9yRWFjaChjb25zdCBGdW5jdG9yJiBmdW5j
dG9yKQorICAgIHsKKyAgICAgICAgZm9yIChzaXplX3QgaW5kZXggOiBtX3ZlY3Rvci5zZXRCaXRz
KCkpCisgICAgICAgICAgICBmdW5jdG9yKFJlZzo6ZnJvbUluZGV4KGluZGV4KSk7CisgICAgfQog
ICAgIAogcHJpdmF0ZToKICAgICB2b2lkIHNldEFueShSZWcgcmVnKSB7IHNldChyZWcpOyB9Cg==
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>263615</attachid>
            <date>2015-10-20 14:16:18 -0700</date>
            <delta_ts>2015-10-20 15:32:25 -0700</delta_ts>
            <desc>cool story for specials</desc>
            <filename>blah.patch</filename>
            <type>text/plain</type>
            <size>239782</size>
            <attacher name="Filip Pizlo">fpizlo</attacher>
            
              <data encoding="base64">SW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM0FkZHJlc3NNYXRjaGVyLnBhdHRlcm5z
Cj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM0FkZHJlc3NNYXRjaGVy
LnBhdHRlcm5zCShyZXZpc2lvbiAwKQorKysgU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzQWRk
cmVzc01hdGNoZXIucGF0dGVybnMJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSw0MSBAQAorIyBD
b3B5cmlnaHQgKEMpIDIwMTUgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorIworIyBS
ZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9y
IHdpdGhvdXQKKyMgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhl
IGZvbGxvd2luZyBjb25kaXRpb25zCisjIGFyZSBtZXQ6CisjIDEuIFJlZGlzdHJpYnV0aW9ucyBv
ZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisjICAgIG5vdGlj
ZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4K
KyMgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBh
Ym92ZSBjb3B5cmlnaHQKKyMgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQg
dGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorIyAgICBkb2N1bWVudGF0aW9uIGFuZC9v
ciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorIworIyBU
SElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gQU5EIElUUyBDT05UUklCVVRP
UlMgYGBBUyBJUycnCisjIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElO
Q0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorIyBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9G
IE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisjIFBVUlBPU0Ug
QVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IgSVRTIENPTlRS
SUJVVE9SUworIyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFM
LCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCisjIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVE
SU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCisjIFNVQlNUSVRVVEUgR09P
RFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVT
UworIyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJ
QUJJTElUWSwgV0hFVEhFUiBJTgorIyBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9S
VCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorIyBBUklTSU5HIElOIEFOWSBX
QVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GCisj
IFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworbWF0Y2hlciBBZGRyZXNzTWF0Y2hl
cgorCisjIE5vdGUgdGhhdCB0aGlzIHJlbGllcyBvbiBCMyBkb2luZyBhZ2dyZXNzaXZlIHJlYXNz
b2NpYXRpb24gYW5kIGNhbm9uY2FsaXphdGlvbiBvZiBpbnRlZ2VyIGFkZHMuCisjIFdlJ2xsIG5l
dmVyIHNlZSBBZGQoQWRkKHgsIGNvbnN0MSksIGNvbnN0MikgYmVjYXVzZSBpdCB3b3VsZCBoYXZl
IGFscmVhZHkgYmVlbiByZWFzc29jaWF0ZWQgaW50bworIyBBZGQoeCwgY29uc3QxICsgY29uc3Qy
KS4gQWxzbywgd2Ugd2lsbCBuZXZlciBzZWUgQWRkKGNvbnN0LCB4KSwgYmVjYXVzZSB3ZSB3b3Vs
ZCBoYXZlIGNhbm9uaWNhbGl6ZWQKKyMgaXQgdG8gQWRkKHgsIGNvbnN0KS4gVGhhdCBzYWlkLCBp
biB0aGlzIGNvZGUgd2UgbmV2ZXIgbWFrZSBhc3NlcnRpb25zIGFib3V0IHRoZXNlIG9wdGltaXph
dGlvbnMKKyMgaGF2aW5nIGJlZW4gcGVyZm9ybWVkLiBBbHNvLCBzaW5jZSB0aGUgTG9hZC9TdG9y
ZSBpbnN0cnVjdGlvbnMgaW4gQjMgaGF2ZSBhIGJ1aWx0LWluIG9mZnNldCwgd2UKKyMgZG9uJ3Qg
bmVlZCB0byBtYXRjaCBBZGQoeCwgY29uc3QpLiBUaGF0IHdvdWxkIGhhdmUgYmVlbiBmb2xkZWQg
aW50byB0aGUgTG9hZC9TdG9yZSBpbnN0cnVjdGlvbnMKKyMgYWxyZWFkeS4gU28sIHRoZSBvbmx5
IGZhbmN5IG1hdGhpbmcgdGhpcyBjYW4gZG8gaXMganVzdCBCYXNlSW5kZXggZm9ybXMuCisKK0Fk
ZFNoaWZ0MSA9IEFkZChTaGwoaW5kZXgsICRsb2dTY2FsZSksIGJhc2UpCitBZGRTaGlmdDIgPSBB
ZGQoYmFzZSwgU2hsKGluZGV4LCAkbG9nU2NhbGUpKQorCitBZGQgPSBBZGQobGVmdCwgcmlnaHQp
CisKKyRDb25zdAorCitEaXJlY3QKSW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM0Fy
Z3VtZW50UmVnVmFsdWUuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9i
My9CM0FyZ3VtZW50UmVnVmFsdWUuY3BwCShyZXZpc2lvbiAwKQorKysgU291cmNlL0phdmFTY3Jp
cHRDb3JlL2IzL0IzQXJndW1lbnRSZWdWYWx1ZS5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTAsMCAr
MSw0MSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNSBBcHBsZSBJbmMuIEFsbCByaWdodHMg
cmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJp
bmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0
ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6Cisg
KiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3Zl
IGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhl
IGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBm
b3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhp
cyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUK
KyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRo
IHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBB
UFBMRSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFO
VElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJS
QU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisg
KiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBP
UgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElO
Q0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdF
UyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJT
VElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJ
VFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBU
SEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJ
TElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJ
U0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVO
IElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLiAKKyAqLworCisj
aW5jbHVkZSAiY29uZmlnLmgiCisjaW5jbHVkZSAiQjNBcmd1bWVudFJlZ1ZhbHVlLmgiCisKK25h
bWVzcGFjZSBKU0MgeyBuYW1lc3BhY2UgQjMgeworCitBcmd1bWVudFJlZ1ZhbHVlOjp+QXJndW1l
bnRSZWdWYWx1ZSgpCit7Cit9CisKK3ZvaWQgQXJndW1lbnRSZWdWYWx1ZTo6ZHVtcE1ldGEoUHJp
bnRTdHJlYW0mIG91dCkgY29uc3QKK3sKKyAgICBvdXQucHJpbnQobV9yZWcpOworfQorCit9IH0g
Ly8gbmFtZXNwYWNlIEpTQzo6QjMKKwpJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0Iz
QXJndW1lbnRSZWdWYWx1ZS5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9i
My9CM0FyZ3VtZW50UmVnVmFsdWUuaAkocmV2aXNpb24gMCkKKysrIFNvdXJjZS9KYXZhU2NyaXB0
Q29yZS9iMy9CM0FyZ3VtZW50UmVnVmFsdWUuaAkod29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDYw
IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE1IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNl
cnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5
IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBw
cm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEu
IFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29w
eXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9s
bG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0g
bXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxp
c3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICog
ICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhl
IGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExF
IElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVT
LCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJ
RVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBV
UlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SCisg
KiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURF
TlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJ
TkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRV
VEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsg
T1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9S
WQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZ
LCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5H
IElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYg
QURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisKKyNpZm5k
ZWYgQjNBcmd1bWVudFJlZ1ZhbHVlX2gKKyNkZWZpbmUgQjNBcmd1bWVudFJlZ1ZhbHVlX2gKKwor
I2luY2x1ZGUgIkIzVmFsdWUuaCIKKyNpbmNsdWRlICJSZWcuaCIKKworbmFtZXNwYWNlIEpTQyB7
IG5hbWVzcGFjZSBCMyB7CisKK2NsYXNzIEFyZ3VtZW50UmVnVmFsdWUgOiBwdWJsaWMgVmFsdWUg
eworcHVibGljOgorICAgIHN0YXRpYyBib29sIGFjY2VwdHMoT3Bjb2RlIG9wY29kZSkgeyByZXR1
cm4gb3Bjb2RlID09IEFyZ3VtZW50UmVnOyB9CisgICAgCisgICAgfkFyZ3VtZW50UmVnVmFsdWUo
KTsKKworICAgIFJlZyBhcmd1bWVudFJlZygpIGNvbnN0IHsgcmV0dXJuIG1fcmVnOyB9CisKK3By
b3RlY3RlZDoKKyAgICB2b2lkIGR1bXBNZXRhKFByaW50U3RyZWFtJikgY29uc3Qgb3ZlcnJpZGU7
CisKK3ByaXZhdGU6CisgICAgZnJpZW5kIGNsYXNzIFByb2NlZHVyZTsKKworICAgIEFyZ3VtZW50
UmVnVmFsdWUodW5zaWduZWQgaW5kZXgsIE9yaWdpbiBvcmlnaW4sIFJlZyByZWcpCisgICAgICAg
IDogVmFsdWUoaW5kZXgsIEFyZ3VtZW50UmVnLCByZWcuaXNHUFIoKSA/IHBvaW50ZXIoKSA6IERv
dWJsZSwgb3JpZ2luKQorICAgICAgICAsIG1fcmVnKHJlZykKKyAgICB7CisgICAgfQorCisgICAg
UmVnIG1fcmVnOworfTsKKworfSB9IC8vIG5hbWVzcGFjZSBKU0M6OkIzCisKKyNlbmRpZiAvLyBC
M0FyZ3VtZW50UmVnVmFsdWVfaAorCkluZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNC
YXNpY0Jsb2NrLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNC
YXNpY0Jsb2NrLmNwcAkocmV2aXNpb24gMCkKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9C
M0Jhc2ljQmxvY2suY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsNTggQEAKKy8qCisgKiBD
b3B5cmlnaHQgKEMpIDIwMTUgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAq
IFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGgg
b3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQg
dGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRp
b25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAg
IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xh
aW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVj
ZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRp
b25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0
aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9u
LgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFTIElT
JycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywg
QlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFO
VEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElT
Q0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IKKyAqIENPTlRSSUJVVE9S
UyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFM
LAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVU
IE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBT
RVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJ
TlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFC
SUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAq
IChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBP
VVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRI
RSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKworI2luY2x1ZGUgImNvbmZpZy5o
IgorI2luY2x1ZGUgIkIzQmFzaWNCbG9jay5oIgorCituYW1lc3BhY2UgSlNDIHsgbmFtZXNwYWNl
IEIzIHsKKworQmFzaWNCbG9jazo6QmFzaWNCbG9jayh1bnNpZ25lZCBpbmRleCkKKyAgICA6IG1f
aW5kZXgoaW5kZXgpCit7Cit9CisKK0Jhc2ljQmxvY2s6On5CYXNpY0Jsb2NrKCkKK3sKK30KKwor
dm9pZCBCYXNpY0Jsb2NrOjphcHBlbmQoVmFsdWUqIHZhbHVlKQoreworICAgIG1fdmFsdWVzLmFw
cGVuZCh2YWx1ZSk7Cit9CisKK3ZvaWQgQmFzaWNCbG9jazo6ZHVtcChQcmludFN0cmVhbSYgb3V0
KSBjb25zdAoreworICAgIG91dC5wcmludChkdW1wUHJlZml4LCBtX2luZGV4KTsKK30KKwordm9p
ZCBCYXNpY0Jsb2NrOjpkZWVwRHVtcChQcmludFN0cmVhbSYgb3V0KSBjb25zdAoreworICAgIG91
dC5wcmludCgiQkIiLCAqdGhpcywgIjpcbiIpOworICAgIGZvciAoVmFsdWUqIHZhbHVlIDogKnRo
aXMpCisgICAgICAgIG91dC5wcmludCgiICAgICIsIGRlZXBEdW1wKHZhbHVlKSwgIlxuIik7Cit9
CisKK30gfSAvLyBuYW1lc3BhY2UgSlNDOjpCMworCkluZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENv
cmUvYjMvQjNCYXNpY0Jsb2NrLmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRDb3Jl
L2IzL0IzQmFzaWNCbG9jay5oCShyZXZpc2lvbiAwKQorKysgU291cmNlL0phdmFTY3JpcHRDb3Jl
L2IzL0IzQmFzaWNCbG9jay5oCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsMTEyIEBACisvKgor
ICogQ29weXJpZ2h0IChDKSAyMDE1IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAq
CisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3
aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0
aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJp
YnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Cisg
KiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRp
c2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXBy
b2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29u
ZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1l
bnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1
dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gYGBB
UyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJ
TkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVS
Q0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJF
IERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SCisgKiBDT05UUklC
VVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BF
Q0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcs
IEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMg
T1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5F
U1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0Yg
TElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JU
CisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBX
QVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBP
RiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisKKyNpZm5kZWYgQjNCYXNp
Y0Jsb2NrCisjZGVmaW5lIEIzQmFzaWNCbG9jaworCituYW1lc3BhY2UgSlNDIHsgbmFtZXNwYWNl
IEIzIHsKKworY2xhc3MgUHJvY2VkdXJlOworY2xhc3MgVmFsdWU7CisKK2NsYXNzIEJhc2ljQmxv
Y2sgeworICAgIFdURl9NQUtFX05PTkNPUFlBQkxFKEJhc2ljQmxvY2spOworICAgIFdURl9NQUtF
X0ZBU1RfQUxMT0NBVEVEOworcHVibGljOgorICAgIHR5cGVkZWYgVmVjdG9yPFZhbHVlKj4gVmFs
dWVMaXN0OworICAgIHR5cGVkZWYgVmVjdG9yPEJhc2ljQmxvY2sqLCAyPiBTdWNjZXNzb3JMaXN0
OyAvLyBUaGlzIG1hdGNoZXMgQ29udHJvbFZhbHVlJ3MgdHlwZWRlZi4KKworICAgIHN0YXRpYyBj
b25zdCBjaGFyKiBkdW1wUHJlZml4ID0gIiMiOworCisgICAgfkJhc2ljQmxvY2soKTsKKworICAg
IHVuc2lnbmVkIGluZGV4KCkgY29uc3QgeyByZXR1cm4gbV9pbmRleDsgfQorCisgICAgVmFsdWVM
aXN0OjppdGVyYXRvciBiZWdpbigpIHsgcmV0dXJuIG1fdmFsdWVzLmJlZ2luKCk7IH0KKyAgICBW
YWx1ZUxpc3Q6Oml0ZXJhdG9yIGVuZCgpIHsgcmV0dXJuIG1fdmFsdWVzLmVuZCgpOyB9CisgICAg
VmFsdWVMaXN0Ojpjb25zdF9pdGVyYXRvciBiZWdpbigpIGNvbnN0IHsgcmV0dXJuIG1fdmFsdWVz
LmJlZ2luKCk7IH0KKyAgICBWYWx1ZUxpc3Q6OmNvbnN0X2l0ZXJhdG9yIGVuZCgpIGNvbnN0IHsg
cmV0dXJuIG1fdmFsdWVzLmVuZCgpOyB9CisKKyAgICBzaXplX3Qgc2l6ZSgpIGNvbnN0IHsgcmV0
dXJuIG1fdmFsdWVzLnNpemUoKTsgfQorICAgIFZhbHVlKiBhdChzaXplX3QgaW5kZXgpIGNvbnN0
IHsgcmV0dXJuIG1fdmFsdWVzW2luZGV4XTsgfQorICAgIFZhbHVlKiYgYXQoc2l6ZV90IGluZGV4
KSB7IHJldHVybiBtX3ZhbHVlc1tpbmRleF07IH0KKworICAgIFZhbHVlKiBsYXN0KCkgY29uc3Qg
eyByZXR1cm4gbV92YWx1ZXMubGFzdCgpOyB9CisgICAgVmFsdWUqJiBsYXN0KCkgeyByZXR1cm4g
bV92YWx1ZXMubGFzdCgpOyB9CisKKyAgICBjb25zdCBWYWx1ZUxpc3QmIHZhbHVlcygpIGNvbnN0
IHsgcmV0dXJuIG1fdmFsdWVzOyB9CisgICAgVmFsdWVMaXN0JiB2YWx1ZXMoKSB7IHJldHVybiBt
X3ZhbHVlczsgfQorCisgICAgdm9pZCBhcHBlbmQoVmFsdWUqKTsKKworICAgIHRlbXBsYXRlPHR5
cGVuYW1lIFZhbHVlVHlwZSwgdHlwZW5hbWUuLi4gQXJndW1lbnRzPgorICAgIFZhbHVlVHlwZSog
YXBwZW5kTmV3KFByb2NlZHVyZSYsIEFyZ3VtZW50cy4uLik7CisKKyAgICB1bnNpZ25lZCBudW1T
dWNjZXNzb3JzKCkgY29uc3Q7CisgICAgQmFzaWNCbG9jayogc3VjY2Vzc29yKHVuc2lnbmVkIGlu
ZGV4KSBjb25zdDsKKyAgICBCYXNpY0Jsb2NrKiYgc3VjY2Vzc29yKHVuc2lnbmVkIGluZGV4KTsK
KyAgICBjb25zdCBTdWNjZXNzb3JMaXN0JiBzdWNjZXNzb3JzKCkgY29uc3Q7CisKKyAgICB2b2lk
IGR1bXAoUHJpbnRTdHJlYW0mKSBjb25zdDsKKyAgICB2b2lkIGRlZXBEdW1wKFByaW50U3RyZWFt
JikgY29uc3Q7CisKK3ByaXZhdGU6CisgICAgZnJpZW5kIGNsYXNzIFByb2NlZHVyZTsKKyAgICAK
KyAgICAvLyBJbnN0YW50aWF0ZSB2aWEgUHJvY2VkdXJlLgorICAgIEJhc2ljQmxvY2sodW5zaWdu
ZWQgaW5kZXgpOworCisgICAgdW5zaWduZWQgbV9pbmRleDsKKyAgICBWYWx1ZUxpc3QgbV92YWx1
ZXM7Cit9OworCitjbGFzcyBEZWVwQmFzaWNCbG9ja0R1bXAgeworcHVibGljOgorICAgIERlZXBC
YXNpY0Jsb2NrRHVtcChCYXNpY0Jsb2NrKiBibG9jaykKKyAgICAgICAgOiBtX2Jsb2NrKGJsb2Nr
KQorICAgIHsKKyAgICB9CisKKyAgICB2b2lkIGR1bXAoUHJpbnRTdHJlYW0mIG91dCkgY29uc3QK
KyAgICB7CisgICAgICAgIGlmIChtX2Jsb2NrKQorICAgICAgICAgICAgbV9ibG9jay0+ZGVlcER1
bXAob3V0KTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgb3V0LnByaW50KCI8bnVsbD4iKTsK
KyAgICB9CisKK3ByaXZhdGU6CisgICAgQmFzaWNCbG9jayogbV9ibG9jazsKK307CisKK0RlZXBC
YXNpY0Jsb2NrRHVtcCBkZWVwRHVtcChCYXNpY0Jsb2NrKiBibG9jaykKK3sKKyAgICByZXR1cm4g
RGVlcEJhc2ljQmxvY2tEdW1wKGJsb2NrKTsKK30KKworfSB9IC8vIG5hbWVzcGFjZSBKU0M6OkIz
CisKKyNlbmRpZiAvLyBCM0Jhc2ljQmxvY2sKKwpJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3Jl
L2IzL0IzQmFzaWNCbG9ja0lubGluZXMuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlw
dENvcmUvYjMvQjNCYXNpY0Jsb2NrSW5saW5lcy5oCShyZXZpc2lvbiAwKQorKysgU291cmNlL0ph
dmFTY3JpcHRDb3JlL2IzL0IzQmFzaWNCbG9ja0lubGluZXMuaAkod29ya2luZyBjb3B5KQpAQCAt
MCwwICsxLDY2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE1IEFwcGxlIEluYy4gQWxsIHJp
Z2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBh
bmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBl
cm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1l
dDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUg
YWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFu
ZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmlu
YXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNl
LCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGlu
IHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVk
IHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVE
IEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBX
QVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVE
IFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VM
QVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJ
TkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVD
VCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBE
QU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9G
IFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICog
UFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04g
QU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1Qg
TElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNF
KSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUs
IEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICov
CisKKyNpZm5kZWYgQjNCYXNpY0Jsb2NrSW5saW5lc19oCisjZGVmaW5lIEIzQmFzaWNCbG9ja0lu
bGluZXNfaAorCisjaW5jbHVkZSAiQjNCYXNpY0Jsb2NrLmgiCisjaW5jbHVkZSAiQjNDb250cm9s
VmFsdWUuaCIKKyNpbmNsdWRlICJCM1Byb2NlZHVyZUlubGluZXMuaCIKKworbmFtZXNwYWNlIEpT
QyB7IG5hbWVzcGFjZSBCMyB7CisKK3RlbXBsYXRlPHR5cGVuYW1lIFZhbHVlVHlwZSB0eXBlbmFt
ZS4uLiBBcmd1bWVudHM+CitWYWx1ZVR5cGUqIEJhc2ljQmxvY2s6OmFwcGVuZE5ldyhQcm9jZWR1
cmUmIHByb2NlZHVyZSwgQXJndW1lbnRzLi4uIGFyZ3VtZW50cykKK3sKKyAgICBWYWx1ZVR5cGUq
IHJlc3VsdCA9IHByb2NlZHVyZS5hZGQ8VmFsdWVUeXBlPihhcmd1bWVudHMuLi4pOworICAgIGFw
cGVuZChyZXN1bHQpOworICAgIHJldHVybiByZXN1bHQ7Cit9CisKK3Vuc2lnbmVkIEJhc2ljQmxv
Y2s6Om51bVN1Y2Nlc3NvcnMoKSBjb25zdAoreworICAgIHJldHVybiBsYXN0KCktPmFzPENvbnRy
b2xWYWx1ZT4oKS0+bnVtU3VjY2Vzc29ycygpOworfQorCitCYXNpY0Jsb2NrKiBCYXNpY0Jsb2Nr
OjpzdWNjZXNzb3IodW5zaWduZWQgaW5kZXgpIGNvbnN0Cit7CisgICAgcmV0dXJuIGxhc3QoKS0+
YXM8Q29udHJvbFZhbHVlPigpLT5zdWNjZXNzb3IoaW5kZXgpOworfQorCitCYXNpY0Jsb2NrKiYg
QmFzaWNCbG9jazo6c3VjY2Vzc29yKHVuc2lnbmVkIGluZGV4KQoreworICAgIHJldHVybiBsYXN0
KCktPmFzPENvbnRyb2xWYWx1ZT4oKS0+c3VjY2Vzc29yKGluZGV4KTsKK30KKworY29uc3QgQmFz
aWNCbG9jazo6U3VjY2Vzc29yTGlzdCYgQmFzaWNCbG9jazo6c3VjY2Vzc29ycygpIGNvbnN0Cit7
CisgICAgcmV0dXJuIGxhc3QoKS0+YXM8Q29udHJvbFZhbHVlPigpLT5zdWNjZXNzb3JzKCk7Cit9
CisKK30gfSAvLyBuYW1lc3BhY2UgSlNDOjpCMworCisjZW5kaWYgLy8gQjNCYXNpY0Jsb2NrSW5s
aW5lc19oCisKSW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM0NoZWNrVmFsdWUuY3Bw
Cj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM0NoZWNrVmFsdWUuY3Bw
CShyZXZpc2lvbiAwKQorKysgU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzQ2hlY2tWYWx1ZS5j
cHAJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSw0MSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykg
MjAxNSBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRp
b24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Cisg
KiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5n
IGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNl
IGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlz
IGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4g
UmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBj
b3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBm
b2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90
aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJ
UyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisg
KiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlU
RUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQg
RklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4g
Tk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBG
T1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExB
UlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQg
VE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NT
IE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikg
SE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhF
UiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBO
RUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNF
CisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZ
IE9GIFNVQ0ggREFNQUdFLiAKKyAqLworCisjaW5jbHVkZSAiY29uZmlnLmgiCisjaW5jbHVkZSAi
QjNDaGVja1ZhbHVlLmgiCisKK25hbWVzcGFjZSBKU0MgeyBuYW1lc3BhY2UgQjMgeworCitDaGVj
a1ZhbHVlOjp+Q2hlY2tWYWx1ZSgpCit7Cit9CisKK3ZvaWQgQ2hlY2tWYWx1ZTo6ZHVtcE1ldGEo
UHJpbnRTdHJlYW0mIG91dCkgY29uc3QKK3sKKyAgICBvdXQucHJpbnQoInN0YWNrbWFwID0gIiwg
c3RhY2ttYXApOworfQorCit9IH0gLy8gbmFtZXNwYWNlIEpTQzo6QjMKKwpJbmRleDogU291cmNl
L0phdmFTY3JpcHRDb3JlL2IzL0IzQ2hlY2tWYWx1ZS5oCj09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9K
YXZhU2NyaXB0Q29yZS9iMy9CM0NoZWNrVmFsdWUuaAkocmV2aXNpb24gMCkKKysrIFNvdXJjZS9K
YXZhU2NyaXB0Q29yZS9iMy9CM0NoZWNrVmFsdWUuaAkod29ya2luZyBjb3B5KQpAQCAtMCwwICsx
LDgwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE1IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyBy
ZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmlu
YXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRl
ZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAq
IDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUg
Y29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUg
Zm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZv
cm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlz
IGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQor
ICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGgg
dGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQ
UExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5U
SUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJB
TlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAq
IFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9S
CisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5D
SURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VT
IChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNU
SVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklU
UzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRI
RU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklM
SVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklT
SU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4g
SUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisKKyNp
Zm5kZWYgQjNDaGVja1ZhbHVlX2gKKyNkZWZpbmUgQjNDaGVja1ZhbHVlX2gKKworI2luY2x1ZGUg
IkIzVmFsdWUuaCIKKyNpbmNsdWRlICJCM1N0YWNrbWFwLmgiCisKK25hbWVzcGFjZSBKU0MgeyBu
YW1lc3BhY2UgQjMgeworCitjbGFzcyBDaGVja1ZhbHVlIDogcHVibGljIENoZWNrIHsKK3B1Ymxp
YzoKKyAgICBzdGF0aWMgYm9vbCBhY2NlcHRzKE9wY29kZSBvcGNvZGUpCisgICAgeworICAgICAg
ICBzd2l0Y2ggKG9wY29kZSkgeworICAgICAgICBjYXNlIENoZWNrQWRkOgorICAgICAgICBjYXNl
IENoZWNrU3ViOgorICAgICAgICBjYXNlIENoZWNrTXVsOgorICAgICAgICBjYXNlIENoZWNrOgor
ICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBy
ZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICB+Q2hlY2tWYWx1ZSgpOworCisg
ICAgU3RhY2ttYXAgc3RhY2ttYXA7CisKK3Byb3RlY3RlZDoKKyAgICB2b2lkIGR1bXBNZXRhKFBy
aW50U3RyZWFtJikgY29uc3Qgb3ZlcnJpZGU7CisKK3ByaXZhdGU6CisgICAgZnJpZW5kIGNsYXNz
IFByb2NlZHVyZTsKKworICAgIC8vIFVzZSB0aGlzIGZvcm0gZm9yIENoZWNrQWRkLCBDaGVja1N1
YiwgYW5kIENoZWNrTXVsLgorICAgIENoZWNrVmFsdWUodW5zaWduZWQgaW5kZXgsIE9wY29kZSBv
cGNvZGUsIE9yaWdpbiBvcmlnaW4sIFZhbHVlKiBsZWZ0LCBWYWx1ZSogcmlnaHQpCisgICAgICAg
IDogVmFsdWUoaW5kZXgsIG9wY29kZSwgbGVmdC0+dHlwZSgpLCBvcmlnaW4sIGxlZnQsIHJpZ2h0
KQorICAgIHsKKyAgICAgICAgQVNTRVJUKGlzSW50KHR5cGUoKSkpOworICAgICAgICBBU1NFUlQo
bGVmdC0+dHlwZSgpID09IHJpZ2h0LT50eXBlKCkpOworICAgICAgICBBU1NFUlQob3Bjb2RlID09
IENoZWNrQWRkIHx8IG9wY29kZSA9PSBDaGVja1N1YiB8fCBvcGNvZGUgPT0gQ2hlY2tNdWwpOwor
ICAgIH0KKworICAgIC8vIFVzZSB0aGlzIGZvcm0gZm9yIENoZWNrLgorICAgIENoZWNrVmFsdWUo
dW5zaWduZWQgaW5kZXgsIE9wY29kZSBvcGNvZGUsIE9yaWdpbiBvcmlnaW4sIFZhbHVlKiBwcmVk
aWNhdGUpCisgICAgICAgIDogVmFsdWUoaW5kZXgsIG9wY29kZSwgVm9pZCwgb3JpZ2luLCBwcmVk
aWNhdGUpCisgICAgeworICAgICAgICBBU1NFUlQob3BjZGUgPT0gQ2hlY2spOworICAgIH0KK307
CisKK30gfSAvLyBuYW1lc3BhY2UgSlNDOjpCMworCisjZW5kaWYgLy8gQjNDaGVja1ZhbHVlX2gK
KworCkluZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNDb21wYXJpc29uTWF0Y2hlci5w
YXR0ZXJucwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNDb21wYXJp
c29uTWF0Y2hlci5wYXR0ZXJucwkocmV2aXNpb24gMCkKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29y
ZS9iMy9CM0NvbXBhcmlzb25NYXRjaGVyLnBhdHRlcm5zCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAg
KzEsMzggQEAKKyMgQ29weXJpZ2h0IChDKSAyMDE1IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNl
cnZlZC4KKyMKKyMgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBm
b3Jtcywgd2l0aCBvciB3aXRob3V0CisjIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92
aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworIyBhcmUgbWV0OgorIyAxLiBSZWRp
c3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdo
dAorIyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5n
IGRpc2NsYWltZXIuCisjIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJl
cHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisjICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNv
bmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyMgICAgZG9jdW1l
bnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1
dGlvbi4KKyMKKyMgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIEFORCBJ
VFMgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJworIyBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBX
QVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyMgVEhFIElNUExJRUQg
V0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxB
UgorIyBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMu
IE9SIElUUyBDT05UUklCVVRPUlMKKyMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVD
VCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgorIyBDT05TRVFVRU5USUFMIERB
TUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgorIyBT
VUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklU
UzsgT1IgQlVTSU5FU1MKKyMgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5Z
IFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KKyMgQ09OVFJBQ1QsIFNUUklDVCBMSUFC
SUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKyMgQVJJ
U0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYg
QURWSVNFRCBPRgorIyBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKK21hdGNoZXIg
Q29tcGFyaXNvbk1hdGNoZXIKKworVGVzdExvYWROb3RaZXJvMSA9IEFuZChMb2FkKGFkZHJlc3Mp
LCByaWdodCkKK1Rlc3RMb2FkTm90WmVybzIgPSBBbmQobGVmdCwgTG9hZChhZGRyZXNzKSkKK1Rl
c3ROb3RaZXJvID0gQW5kKGxlZnQsIHJpZ2h0KQorCitUZXN0TG9hZFplcm8xID0gRXF1YWwoQW5k
KExvYWQoYWRkcmVzcyksIHJpZ2h0KSwgJDApCitUZXN0TG9hZFplcm8yID0gRXF1YWwoQW5kKGxl
ZnQsIExvYWQoYWRkcmVzcykpLCAkMCkKK1Rlc3RaZXJvID0gRXF1YWwoQW5kKGxlZnQsIHJpZ2h0
KSwgJDApCisKK0xvYWRFcXVhbDEgPSBFcXVhbChMb2FkKGFkZHJlc3MpLCByaWdodCkKK0xvYWRF
cXVhbDIgPSBFcXVhbChsZWZ0LCBMb2FkKGFkZHJlc3MpKQorTm90ID0gRXF1YWwodmFsdWUsICQw
KQorRXF1YWwgPSBFcXVhbChsZWZ0LCByaWdodCkKKwpJbmRleDogU291cmNlL0phdmFTY3JpcHRD
b3JlL2IzL0IzQ29uc3QzMlZhbHVlLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlw
dENvcmUvYjMvQjNDb25zdDMyVmFsdWUuY3BwCShyZXZpc2lvbiAwKQorKysgU291cmNlL0phdmFT
Y3JpcHRDb3JlL2IzL0IzQ29uc3QzMlZhbHVlLmNwcAkod29ya2luZyBjb3B5KQpAQCAtMCwwICsx
LDQxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE1IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyBy
ZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmlu
YXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRl
ZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAq
IDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUg
Y29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUg
Zm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZv
cm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlz
IGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQor
ICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGgg
dGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQ
UExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5U
SUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJB
TlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAq
IFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9S
CisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5D
SURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VT
IChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNU
SVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklU
UzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRI
RU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklM
SVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklT
SU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4g
SUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisKKyNp
bmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJCM0NvbnN0MzJWYWx1ZS5oIgorCituYW1lc3Bh
Y2UgSlNDIHsgbmFtZXNwYWNlIEIzIHsKKworQ29uc3QzMlZhbHVlOjp+Q29uc3QzMlZhbHVlKCkK
K3sKK30KKwordm9pZCBDb25zdDMyVmFsdWU6OmR1bXBNZXRhKFByaW50U3RyZWFtJiBvdXQpIGNv
bnN0Cit7CisgICAgb3V0LnByaW50KG1fdmFsdWUpOworfQorCit9IH0gLy8gbmFtZXNwYWNlIEpT
Qzo6QjMKKwpJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzQ29uc3QzMlZhbHVlLmgK
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzQ29uc3QzMlZhbHVlLmgJ
KHJldmlzaW9uIDApCisrKyBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNDb25zdDMyVmFsdWUu
aAkod29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDU5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAy
MDE1IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlv
biBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAq
IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcg
Y29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2Ug
Y29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMg
bGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBS
ZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNv
cHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZv
bGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3Ro
ZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElT
IFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAq
IEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRF
RCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBG
SVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBO
TyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZP
UiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFS
WSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBU
TywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1Mg
T0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBI
T1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVS
IElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5F
R0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UK
KyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkg
T0YgU1VDSCBEQU1BR0UuIAorICovCisKKyNpZm5kZWYgQjNDb25zdDMyVmFsdWVfaAorI2RlZmlu
ZSBCM0NvbnN0MzJWYWx1ZV9oCisKKyNpbmNsdWRlICJCM1ZhbHVlLmgiCisKK25hbWVzcGFjZSBK
U0MgeyBuYW1lc3BhY2UgQjMgeworCitjbGFzcyBDb25zdDMyVmFsdWUgOiBwdWJsaWMgVmFsdWUg
eworcHVibGljOgorICAgIHN0YXRpYyBib29sIGFjY2VwdHMoT3Bjb2RlIG9wY29kZSkgeyByZXR1
cm4gb3Bjb2RlID09IENvbnN0MzI7IH0KKyAgICAKKyAgICB+Q29uc3QzMlZhbHVlKCk7CisgICAg
CisgICAgaW50MzJfdCB2YWx1ZSgpIGNvbnN0IHsgcmV0dXJuIG1fdmFsdWU7IH0KKworcHJvdGVj
dGVkOgorICAgIHZvaWQgZHVtcE1ldGEoUHJpbnRTdHJlYW0mKSBjb25zdCBvdmVycmlkZTsKKwor
cHJpdmF0ZToKKyAgICBmcmllbmQgY2xhc3MgUHJvY2VkdXJlOworCisgICAgQ29uc3QzMlZhbHVl
KHVuc2lnbmVkIGluZGV4LCBPcmlnaW4gb3JpZ2luLCBpbnQzMl90IHZhbHVlKQorICAgICAgICA6
IFZhbHVlKGluZGV4LCBDb25zdDMyLCBJbnQzMiwgb3JpZ2luKQorICAgICAgICAsIG1fdmFsdWUo
dmFsdWUpCisgICAgeworICAgIH0KKyAgICAKKyAgICBpbnQzMl90IG1fdmFsdWU7Cit9OworCit9
IH0gLy8gbmFtZXNwYWNlIEpTQzo6QjMKKworI2VuZGlmIC8vIEIzQ29uc3QzMlZhbHVlX2gKKwpJ
bmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzQ29uc3Q2NFZhbHVlLmNwcAo9PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNDb25zdDY0VmFsdWUuY3BwCShyZXZp
c2lvbiAwKQorKysgU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzQ29uc3Q2NFZhbHVlLmNwcAko
d29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDQxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE1
IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBh
bmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1v
ZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29u
ZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29k
ZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlz
dCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRp
c3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHly
aWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxv
d2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIg
bWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNP
RlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVY
UFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBU
TywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRO
RVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBF
VkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBB
TlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwg
T1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywK
KyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0Yg
VVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dF
VkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElO
IENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJ
R0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAq
IE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0Yg
U1VDSCBEQU1BR0UuIAorICovCisKKyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJCM0Nv
bnN0NjRWYWx1ZS5oIgorCituYW1lc3BhY2UgSlNDIHsgbmFtZXNwYWNlIEIzIHsKKworQ29uc3Q2
NFZhbHVlOjp+Q29uc3Q2NFZhbHVlKCkKK3sKK30KKwordm9pZCBDb25zdDY0VmFsdWU6OmR1bXBN
ZXRhKFByaW50U3RyZWFtJiBvdXQpIGNvbnN0Cit7CisgICAgb3V0LnByaW50KG1fdmFsdWUpOwor
fQorCit9IH0gLy8gbmFtZXNwYWNlIEpTQzo6QjMKKwpJbmRleDogU291cmNlL0phdmFTY3JpcHRD
b3JlL2IzL0IzQ29uc3Q2NFZhbHVlLmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRD
b3JlL2IzL0IzQ29uc3Q2NFZhbHVlLmgJKHJldmlzaW9uIDApCisrKyBTb3VyY2UvSmF2YVNjcmlw
dENvcmUvYjMvQjNDb25zdDY0VmFsdWUuaAkod29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDU5IEBA
CisvKgorICogQ29weXJpZ2h0IChDKSAyMDE1IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZl
ZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZv
cm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92
aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJl
ZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJp
Z2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93
aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVz
dCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qg
b2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAg
ZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRp
c3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElO
Qy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJ
TkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMg
T0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBP
U0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SCisgKiBD
T05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRB
TCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNM
VURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUg
R09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1Ig
QlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQor
ICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBP
UiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElO
IEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURW
SVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisKKyNpZm5kZWYg
QjNDb25zdDY0VmFsdWVfaAorI2RlZmluZSBCM0NvbnN0NjRWYWx1ZV9oCisKKyNpbmNsdWRlICJC
M1ZhbHVlLmgiCisKK25hbWVzcGFjZSBKU0MgeyBuYW1lc3BhY2UgQjMgeworCitjbGFzcyBDb25z
dDY0VmFsdWUgOiBwdWJsaWMgVmFsdWUgeworcHVibGljOgorICAgIHN0YXRpYyBib29sIGFjY2Vw
dHMoT3Bjb2RlIG9wY29kZSkgeyByZXR1cm4gb3Bjb2RlID09IENvbnN0NjQ7IH0KKyAgICAKKyAg
ICB+Q29uc3Q2NFZhbHVlKCk7CisgICAgCisgICAgaW50NjRfdCB2YWx1ZSgpIGNvbnN0IHsgcmV0
dXJuIG1fdmFsdWU7IH0KKworcHJvdGVjdGVkOgorICAgIHZvaWQgZHVtcE1ldGEoUHJpbnRTdHJl
YW0mKSBjb25zdCBvdmVycmlkZTsKKworcHJpdmF0ZToKKyAgICBmcmllbmQgY2xhc3MgUHJvY2Vk
dXJlOworCisgICAgQ29uc3Q2NFZhbHVlKHVuc2lnbmVkIGluZGV4LCBPcmlnaW4gb3JpZ2luLCBp
bnQ2NF90IHZhbHVlKQorICAgICAgICA6IFZhbHVlKGluZGV4LCBDb25zdDY0LCBJbnQ2NCwgb3Jp
Z2luKQorICAgICAgICAsIG1fdmFsdWUodmFsdWUpCisgICAgeworICAgIH0KKyAgICAKKyAgICBp
bnQ2NF90IG1fdmFsdWU7Cit9OworCit9IH0gLy8gbmFtZXNwYWNlIEpTQzo6QjMKKworI2VuZGlm
IC8vIEIzQ29uc3Q2NFZhbHVlX2gKKwpJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0Iz
Q29uc3REb3VibGVWYWx1ZS5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRDb3Jl
L2IzL0IzQ29uc3REb3VibGVWYWx1ZS5jcHAJKHJldmlzaW9uIDApCisrKyBTb3VyY2UvSmF2YVNj
cmlwdENvcmUvYjMvQjNDb25zdERvdWJsZVZhbHVlLmNwcAkod29ya2luZyBjb3B5KQpAQCAtMCww
ICsxLDQxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE1IEFwcGxlIEluYy4gQWxsIHJpZ2h0
cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQg
YmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1p
dHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoK
KyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJv
dmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0
aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5
IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0
aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRo
ZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdp
dGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZ
IEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJS
QU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdB
UlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIK
KyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMu
IE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwg
SU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1B
R0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNV
QlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJP
RklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5Z
IFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElB
QklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBB
UklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVW
RU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisK
KyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJCM0NvbnN0RG91YmxlVmFsdWUuaCIKKwor
bmFtZXNwYWNlIEpTQyB7IG5hbWVzcGFjZSBCMyB7CisKK0NvbnN0RG91YmxlVmFsdWU6On5Db25z
dERvdWJsZVZhbHVlKCkKK3sKK30KKwordm9pZCBDb25zdERvdWJsZVZhbHVlOjpkdW1wTWV0YShQ
cmludFN0cmVhbSYgb3V0KSBjb25zdAoreworICAgIG91dC5wcmludGYoIiVsZSIsIG1fdmFsdWUp
OworfQorCit9IH0gLy8gbmFtZXNwYWNlIEpTQzo6QjMKKwpJbmRleDogU291cmNlL0phdmFTY3Jp
cHRDb3JlL2IzL0IzQ29uc3REb3VibGVWYWx1ZS5oCj09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZh
U2NyaXB0Q29yZS9iMy9CM0NvbnN0RG91YmxlVmFsdWUuaAkocmV2aXNpb24gMCkKKysrIFNvdXJj
ZS9KYXZhU2NyaXB0Q29yZS9iMy9CM0NvbnN0RG91YmxlVmFsdWUuaAkod29ya2luZyBjb3B5KQpA
QCAtMCwwICsxLDU5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE1IEFwcGxlIEluYy4gQWxs
IHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJj
ZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJl
IHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJl
IG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0
aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25z
IGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4g
YmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90
aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVy
IGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3Zp
ZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJ
REVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElF
RCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBM
SUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJ
Q1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBM
RSBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJ
UkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElB
TCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5U
IE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgor
ICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQg
T04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJ
Q1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJX
SVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdB
UkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAor
ICovCisKKyNpZm5kZWYgQjNDb25zdERvdWJsZVZhbHVlX2gKKyNkZWZpbmUgQjNDb25zdERvdWJs
ZVZhbHVlX2gKKworI2luY2x1ZGUgIkIzVmFsdWUuaCIKKworbmFtZXNwYWNlIEpTQyB7IG5hbWVz
cGFjZSBCMyB7CisKK2NsYXNzIENvbnN0RG91YmxlVmFsdWUgOiBwdWJsaWMgVmFsdWUgeworcHVi
bGljOgorICAgIHN0YXRpYyBib29sIGFjY2VwdHMoT3Bjb2RlIG9wY29kZSkgeyByZXR1cm4gb3Bj
b2RlID09IENvbnN0RG91YmxlOyB9CisgICAgCisgICAgfkNvbnN0RG91YmxlVmFsdWUoKTsKKyAg
ICAKKyAgICBkb3VibGUgdmFsdWUoKSBjb25zdCB7IHJldHVybiBtX3ZhbHVlOyB9CisKK3Byb3Rl
Y3RlZDoKKyAgICB2b2lkIGR1bXBNZXRhKFByaW50U3RyZWFtJikgY29uc3Qgb3ZlcnJpZGU7CisK
K3ByaXZhdGU6CisgICAgZnJpZW5kIGNsYXNzIFByb2NlZHVyZTsKKworICAgIENvbnN0RG91Ymxl
VmFsdWUodW5zaWduZWQgaW5kZXgsIE9yaWdpbiBvcmlnaW4sIGRvdWJsZSB2YWx1ZSkKKyAgICAg
ICAgOiBWYWx1ZShpbmRleCwgQ29uc3REb3VibGUsIERvdWJsZSwgb3JpZ2luKQorICAgICAgICAs
IG1fdmFsdWUodmFsdWUpCisgICAgeworICAgIH0KKyAgICAKKyAgICBkb3VibGUgbV92YWx1ZTsK
K307CisKK30gfSAvLyBuYW1lc3BhY2UgSlNDOjpCMworCisjZW5kaWYgLy8gQjNDb25zdERvdWJs
ZVZhbHVlX2gKKwpJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzQ29udHJvbFZhbHVl
LmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNDb250cm9sVmFs
dWUuY3BwCShyZXZpc2lvbiAwKQorKysgU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzQ29udHJv
bFZhbHVlLmNwcAkod29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDQzIEBACisvKgorICogQ29weXJp
Z2h0IChDKSAyMDE1IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRp
c3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdp
dGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBm
b2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBv
ZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3Rp
Y2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIu
CisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhl
IGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBh
bmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBh
bmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAq
CisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFO
RCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBO
T1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklM
SVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlN
RUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUg
TElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAq
IEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1Qg
TElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklD
RVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJS
VVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZ
LCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5D
TFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9G
IFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9T
U0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisKKyNpbmNsdWRlICJjb25maWcuaCIKKyNp
bmNsdWRlICJCM0NvbnRyb2xWYWx1ZS5oIgorCituYW1lc3BhY2UgSlNDIHsgbmFtZXNwYWNlIEIz
IHsKKworQ29udHJvbFZhbHVlOjp+Q29udHJvbFZhbHVlKCkKK3sKK30KKwordm9pZCBDb250cm9s
VmFsdWU6OmR1bXBNZXRhKFByaW50U3RyZWFtJiBvdXQpIGNvbnN0Cit7CisgICAgQ29tbWFQcmlu
dGVyIGNvbW1hOworICAgIGZvciAoQmFzaWNCbG9jayogYmxvY2sgOiBtX3N1Y2Nlc3NvcnMpCisg
ICAgICAgIG91dC5wcmludChjb21tYSwgcG9pbnRlckR1bXAoYmxvY2spKTsKK30KKworfSB9IC8v
IG5hbWVzcGFjZSBKU0M6OkIzCisKSW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM0Nv
bnRyb2xWYWx1ZS5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM0Nv
bnRyb2xWYWx1ZS5oCShyZXZpc2lvbiAwKQorKysgU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0Iz
Q29udHJvbFZhbHVlLmgJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSwxMTcgQEAKKy8qCisgKiBD
b3B5cmlnaHQgKEMpIDIwMTUgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAq
IFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGgg
b3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQg
dGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRp
b25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAg
IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xh
aW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVj
ZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRp
b25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0
aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9u
LgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFTIElT
JycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywg
QlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFO
VEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElT
Q0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IKKyAqIENPTlRSSUJVVE9S
UyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFM
LAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVU
IE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBT
RVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJ
TlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFC
SUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAq
IChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBP
VVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRI
RSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKworI2lmbmRlZiBCM0NvbnRyb2xW
YWx1ZV9oCisjZGVmaW5lIEIzQ29udHJvbFZhbHVlX2gKKworI2luY2x1ZGUgIkIzVmFsdWUuaCIK
KworbmFtZXNwYWNlIEpTQyB7IG5hbWVzcGFjZSBCMyB7CisKK2NsYXNzIEJhc2ljQmxvY2s7CisK
K2NsYXNzIENvbnRyb2xWYWx1ZSA6IHB1YmxpYyBWYWx1ZSB7CitwdWJsaWM6CisgICAgc3RhdGlj
IGJvb2wgYWNjZXB0cyhPcGNvZGUgb3Bjb2RlKQorICAgIHsKKyAgICAgICAgc3dpdGNoIChvcGNv
ZGUpIHsKKyAgICAgICAgY2FzZSBKdW1wOgorICAgICAgICBjYXNlIEJyYW5jaDoKKyAgICAgICAg
Y2FzZSBSZXR1cm46CisgICAgICAgIGNhc2UgT29wczoKKyAgICAgICAgICAgIHJldHVybiB0cnVl
OworICAgICAgICBjYXNlIFN3aXRjaDogCisgICAgICAgICAgICAvLyBUaGlzIGlzIGhlcmUgYmVj
YXVzZSBTd2l0Y2hWYWx1ZSBpcyBhIHN1YmNsYXNzIG9mIENvbnRyb2xWYWx1ZSwgc28gd2Ugd2Fu
dAorICAgICAgICAgICAgLy8gc3d0aWNoVmFsdWUtPmFzPENvbnRyb2xWYWx1ZT4oKSB0byByZXR1
cm4gbm9uLW51bGwuCisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgZGVmYXVsdDoK
KyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHR5cGVk
ZWYgVmVjdG9yPEJhc2ljQmxvY2sqLCAyPiBTdWNjZXNzb3JMaXN0OworCisgICAgfkNvbnRyb2xW
YWx1ZSgpOworCisgICAgdW5zaWduZWQgbnVtU3VjY2Vzc29ycygpIGNvbnN0IHsgcmV0dXJuIG1f
c3VjY2Vzc29ycy5zaXplKCk7IH0KKyAgICBCYXNpY0Jsb2NrKiBzdWNjZXNzb3IodW5zaWduZWQg
aW5kZXgpIGNvbnN0IHsgcmV0dXJuIG1fc3VjY2Vzc29yc1tpXTsgfQorICAgIEJhc2ljQmxvY2sq
JiBzdWNjZXNzb3IodW5zaWduZWQgaW5kZXgpIHsgcmV0dXJuIG1fc3VjY2Vzc29yc1tpXTsgfQor
CisgICAgY29uc3QgU3VjY2Vzc29yTGlzdCYgc3VjY2Vzc29ycygpIGNvbnN0IHsgcmV0dXJuIG1f
c3VjY2Vzc29yczsgfQorCitwcm90ZWN0ZWQ6CisgICAgdm9pZCBkdW1wTWV0YShQcmludFN0cmVh
bSYpIGNvbnN0IG92ZXJyaWRlOworCisgICAgLy8gVXNlIHRoaXMgZm9yIHN1YmNsYXNzZXMuCisg
ICAgdGVtcGxhdGU8dHlwZW5hbWUuLi4gQXJndW1lbnRzPgorICAgIENvbnRyb2xWYWx1ZSh1bnNp
Z25lZCBpbmRleCwgT3Bjb2RlIG9wY29kZSwgVHlwZSB0eXBlLCBPcmlnaW4gb3JpZ2luLCBBcmd1
bWVudHMuLi4gYXJndW1lbnRzKQorICAgICAgICA6IFZhbHVlKGluZGV4LCBvcGNvZGUsIHR5cGUs
IG9yaWdpbiwgYXJndW1lbnRzLi4uKQorICAgIHsKKyAgICB9CisKKyAgICAvLyBTdWJjbGFzc2Vz
IHdpbGwgcG9wdWxhdGUgdGhpcy4KKyAgICBTdWNjZXNzb3JMaXN0IG1fc3VjY2Vzc29yczsKKwor
cHJpdmF0ZToKKyAgICBmcmllbmQgY2xhc3MgUHJvY2VkdXJlOworCisgICAgLy8gVXNlIHRoaXMg
Zm9yIE9vcHMuCisgICAgQ29udHJvbFZhbHVlKHVuc2lnbmVkIGluZGV4LCBPcGNvZGUgb3Bjb2Rl
LCBPcmlnaW4gb3JpZ2luKQorICAgICAgICA6IFZhbHVlKGluZGV4LCBvcGNvZGUsIFZvaWQsIG9y
aWdpbikKKyAgICB7CisgICAgICAgIEFTU0VSVChvcGNvZGUgPT0gT29wcyk7CisgICAgfQorCisg
ICAgLy8gVXNlIHRoaXMgZm9yIFJldHVybi4KKyAgICBDb250cm9sVmFsdWUodW5zaWduZWQgaW5k
ZXgsIE9wY29kZSBvcGNvZGUsIE9yaWdpbiBvcmlnaW4sIFZhbHVlKiByZXN1bHQpCisgICAgICAg
IDogVmFsdWUoaW5kZXgsIG9wY29kZSwgVm9pZCwgb3JpZ2luLCByZXN1bHQpCisgICAgeworICAg
ICAgICBBU1NFUlQob3Bjb2RlID09IFJldHVybik7CisgICAgfQorCisgICAgLy8gVXNlIHRoaXMg
Zm9yIEp1bXAuCisgICAgQ29udHJvbFZhbHVlKHVuc2lnbmVkIGluZGV4LCBPcGNvZGUgb3Bjb2Rl
LCBPcmlnaW4gb3JpZ2luLCBCYXNpY0Jsb2NrKiB0YXJnZXQpCisgICAgICAgIDogVmFsdWUoaW5k
ZXgsIG9wY29kZSwgVm9pZCwgb3JpZ2luKQorICAgIHsKKyAgICAgICAgQVNTRVJUKG9wY29kZSA9
PSBKdW1wKTsKKyAgICAgICAgbV9zdWNjZXNzb3JzLmFwcGVuZCh0YXJnZXQpOworICAgIH0KKwor
ICAgIC8vIFVzZSB0aGlzIGZvciBCcmFuY2guCisgICAgQ29udHJvbFZhbHVlKAorICAgICAgICB1
bnNpZ25lZCBpbmRleCwgT3Bjb2RlIG9wY29kZSwgT3JpZ2luIG9yaWdpbiwgVmFsdWUqIHByZWRp
Y2F0ZSwKKyAgICAgICAgQmFzaWNCbG9jayogeWVzLCBCYXNpY0Jsb2NrKiBubykKKyAgICAgICAg
OiBWYWx1ZShpbmRleCwgb3Bjb2RlLCBWb2lkLCBvcmlnaW4sIHByZWRpY2F0ZSkKKyAgICB7Cisg
ICAgICAgIEFTU0VSVChvcGNvZGUgPT0gQnJhbmNoKTsKKyAgICAgICAgbV9zdWNjZXNzb3JzLmFw
cGVuZCh5ZXMpOworICAgICAgICBtX3N1Y2Nlc3NvcnMuYXBwZW5kKG5vKTsKKyAgICB9Cit9Owor
Cit9IH0gLy8gbmFtZXNwYWNlIEpTQzo6QjMKKworI2VuZGlmIC8vIEIzQ29udHJvbFZhbHVlX2gK
KwpJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzSW5kZXhTZXQuaAo9PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNJbmRleFNldC5oCShyZXZpc2lvbiAwKQor
KysgU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzSW5kZXhTZXQuaAkod29ya2luZyBjb3B5KQpA
QCAtMCwwICsxLDE0MSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNSBBcHBsZSBJbmMuIEFs
bCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3Vy
Y2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFy
ZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFy
ZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4g
dGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9u
cyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGlu
IGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5v
dGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1l
ciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92
aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9W
SURFRCBCWSBBUFBMRSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJ
RUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1Q
TElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJU
SUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQ
TEUgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5E
SVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJ
QUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVO
VCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IK
KyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5E
IE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RS
SUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVS
V0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRX
QVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLiAK
KyAqLworCisjaWZuZGVmIEIzSW5kZXhTZXRfaAorI2RlZmluZSBCM0luZGV4U2V0X2gKKworI2lu
Y2x1ZGUgPHd0Zi9CaXRWZWN0b3IuaD4KKyNpbmNsdWRlIDx3dGYvQ29tbWFQcmludGVyLmg+CisK
K25hbWVzcGFjZSBKU0MgeyBuYW1lc3BhY2UgQjMgeworCisvLyBUaGlzIGlzIGEgc2V0IGZvciB0
aGluZ3MgdGhhdCBoYXZlIGFuIGluZGV4KCkuIEl0J3Mgc3VwZXIgZWZmaWNpZW50IGZvciBCYXNp
Y0Jsb2Nrcy4gSXQncyBvbmx5CisvLyBlZmZpY2llbnQgZm9yIFZhbHVlcyBpZiB5b3UgZG9uJ3Qg
Y3JlYXRlIHRvbyBtYW55IG9mIHRoZXNlIHNldHMsIHNpbmNlIFZhbHVlcyBjYW4gaGF2ZSB2ZXJ5
IHNwYXJzZQorLy8gaW5kaWNlcyBhbmQgdGhlcmUgYXJlIGEgbG90IG9mIFZhbHVlcy4KKworLy8g
SWYgeW91IHdhbnQgYSBzZXQgb2YgQmFzaWNCbG9ja3MsIHlvdSBkbyBJbmRleFNldDxCYXNpY0Js
b2NrPi4gU28sIFQgPSBCYXNpY0Jsb2NrLgordGVtcGxhdGU8dHlwZW5hbWUgVD4KK2NsYXNzIElu
ZGV4U2V0IHsKK3B1YmxpYzoKKyAgICBJbmRleFNldCgpCisgICAgeworICAgIH0KKworICAgIGJv
b2wgYWRkKFQqIHZhbHVlKQorICAgIHsKKyAgICAgICAgcmV0dXJuICFtX3NldC5zZXQodmFsdWUt
PmluZGV4KCkpOworICAgIH0KKworICAgIGJvb2wgY29udGFpbnMoVCogdmFsdWUpIGNvbnN0Cisg
ICAgeworICAgICAgICBpZiAoIXZhbHVlKQorICAgICAgICAgICAgcmV0dXJuIG51bGxwdHI7Cisg
ICAgICAgIHJldHVybiBtX3NldC5nZXQodmFsdWUtPmluZGV4KCkpOworICAgIH0KKworICAgIHRl
bXBsYXRlPHR5cGVuYW1lIENvbGxlY3Rpb25UeXBlPgorICAgIGNsYXNzIEl0ZXJhYmxlIHsKKyAg
ICBwdWJsaWM6CisgICAgICAgIEl0ZXJhYmxlKGNvbnN0IENvbGxlY3Rpb25UeXBlJiBjb2xsZWN0
aW9uLCBjb25zdCBJbmRleFNldCYgc2V0KQorICAgICAgICAgICAgOiBtX2NvbGxlY3Rpb24oY29s
bGVjdGlvbikKKyAgICAgICAgICAgICwgbV9zZXQoc2V0KQorICAgICAgICB7CisgICAgICAgIH0K
KworICAgICAgICBjbGFzcyBpdGVyYXRvciB7CisgICAgICAgIHB1YmxpYzoKKyAgICAgICAgICAg
IGl0ZXJhdG9yKCkKKyAgICAgICAgICAgICAgICA6IG1fY29sbGVjdGlvbihudWxscHRyKQorICAg
ICAgICAgICAgeworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpdGVyYXRvcihjb25zdCBD
b2xsZWN0aW9uVHlwZSYgY29sbGVjdGlvbiwgQml0VmVjdG9yOjpTZXRCaXRzSXRlcmFibGU6Oml0
ZXJhdG9yIGl0ZXIpCisgICAgICAgICAgICAgICAgOiBtX2NvbGxlY3Rpb24oJmNvbGxlY3Rpb24p
CisgICAgICAgICAgICAgICAgLCBtX2l0ZXIoaXRlcikKKyAgICAgICAgICAgIHsKKyAgICAgICAg
ICAgIH0KKworICAgICAgICAgICAgVCogb3BlcmF0b3IqKCkKKyAgICAgICAgICAgIHsKKyAgICAg
ICAgICAgICAgICByZXR1cm4gbV9jb2xsZWN0aW9uLT5hdCgqbV9pdGVyKTsKKyAgICAgICAgICAg
IH0KKworICAgICAgICAgICAgaXRlcmF0b3ImIG9wZXJhdG9yKysoKQorICAgICAgICAgICAgewor
ICAgICAgICAgICAgICAgIG1faXRlcisrOworICAgICAgICAgICAgICAgIHJldHVybiAqdGhpczsK
KyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgYm9vbCBvcGVyYXRvcj09KGNvbnN0IGl0ZXJh
dG9yJiBvdGhlcikgY29uc3QKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4g
bV9pdGVyID09IG90aGVyLm1faXRlcjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgYm9v
bCBvcGVyYXRvciE9KGNvbnN0IGl0ZXJhdG9yJiBvdGhlcikgY29uc3QKKyAgICAgICAgICAgIHsK
KyAgICAgICAgICAgICAgICByZXR1cm4gISgqdGhpcyA9PSBvdGhlcik7CisgICAgICAgICAgICB9
CisKKyAgICAgICAgcHJpdmF0ZToKKyAgICAgICAgICAgIGNvbnN0IENvbGxlY3Rpb25UeXBlKiBt
X2NvbGxlY3Rpb247CisgICAgICAgICAgICBCaXRWZWN0b3I6OlNldEJpdHNJdGVyYWJsZTo6aXRl
cmF0b3IgbV9pdGVyOworICAgICAgICB9OworCisgICAgICAgIGl0ZXJhdG9yIGJlZ2luKCkgY29u
c3QgeyByZXR1cm4gaXRlcmF0b3IobV9jb2xsZWN0aW9uLCBtX3NldC5iZWdpbigpKTsgfQorICAg
ICAgICBpdGVyYXRvciBlbmQoKSBjb25zdCB7IHJldHVybiBpdGVyYXRvcihtX2NvbGxlY3Rpb24s
IG1fc2V0LmVuZCgpKTsgfQorCisgICAgcHJpdmF0ZToKKyAgICAgICAgY29uc3QgQ29sbGVjdGlv
blR5cGUmIG1fY29sbGVjdGlvbjsKKyAgICAgICAgY29uc3QgSW5kZXhTZXQmIG1fc2V0OworICAg
IH07CisKKyAgICAvLyBGb3IgYmFzaWMgYmxvY2tzLCB5b3UgZG86CisgICAgLy8gaW5kZXhTZXQu
dmFsdWVzKHByb2NlZHVyZSk7CisgICAgLy8KKyAgICAvLyBGb3IgdmFsdWVzLCB5b3UgZG86Cisg
ICAgLy8gaW5kZXhTZXQudmFsdWVzKHByb2NlZHVyZS52YWx1ZXMoKSk7CisgICAgdGVtcGxhdGU8
dHlwZW5hbWUgQ29sbGVjdGlvblR5cGU+CisgICAgSXRlcmFibGU8Q29sbGVjdGlvblR5cGU+IHZh
bHVlcyhjb25zdCBDb2xsZWN0aW9uVHlwZSYgY29sbGVjdGlvbikgY29uc3QKKyAgICB7CisgICAg
ICAgIHJldHVybiBJdGVyYWJsZTxDb2xsZWN0aW9uVHlwZT4oY29sbGVjdGlvbik7CisgICAgfQor
CisgICAgY29uc3QgQml0VmVjdG9yJiBpbmRpY2VzKCkgY29uc3QgeyByZXR1cm4gbV9zZXQ7IH0K
KworICAgIHZvaWQgZHVtcChQcmludFN0cmVhbSYgb3V0KSBjb25zdAorICAgIHsKKyAgICAgICAg
Q29tbWFQcmludGVyIGNvbW1hOworICAgICAgICBmb3IgKHNpemVfdCBpbmRleCA6IGluZGljZXMo
KS5zZXRCaXRzKCkpCisgICAgICAgICAgICBvdXQucHJpbnQoY29tbWEsIFQ6OmR1bXBQcmVmaXgs
IGluZGV4KTsKKyAgICB9CisKK3ByaXZhdGU6CisgICAgQml0VmVjdG9yIG1fc2V0OworfTsKKwor
fSB9IC8vIG5hbWVzcGFjZSBKU0M6OkIzCisKKyNlbmRpZiAvLyBCM0luZGV4U2V0X2gKKwpJbmRl
eDogU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzTG93ZXJpbmdNYXRjaGVyLnBhdHRlcm5zCj09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM0xvd2VyaW5nTWF0Y2hlci5w
YXR0ZXJucwkocmV2aXNpb24gMCkKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM0xvd2Vy
aW5nTWF0Y2hlci5wYXR0ZXJucwkod29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDQyIEBACisjIENv
cHlyaWdodCAoQykgMjAxNSBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisjCisjIFJl
ZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Ig
d2l0aG91dAorIyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUg
Zm9sbG93aW5nIGNvbmRpdGlvbnMKKyMgYXJlIG1ldDoKKyMgMS4gUmVkaXN0cmlidXRpb25zIG9m
IHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyMgICAgbm90aWNl
LCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgor
IyAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFi
b3ZlIGNvcHlyaWdodAorIyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0
aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisjICAgIGRvY3VtZW50YXRpb24gYW5kL29y
IG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisjCisjIFRI
SVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBBTkQgSVRTIENPTlRSSUJVVE9S
UyBgYEFTIElTJycKKyMgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5D
TFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisjIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0Yg
TUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyMgUFVSUE9TRSBB
UkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUiBJVFMgQ09OVFJJ
QlVUT1JTCisjIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUws
IFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKKyMgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJ
TkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKKyMgU1VCU1RJVFVURSBHT09E
UyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNT
CisjIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElB
QklMSVRZLCBXSEVUSEVSIElOCisjIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JU
IChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisjIEFSSVNJTkcgSU4gQU5ZIFdB
WSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YKKyMg
VEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCittYXRjaGVyIExvd2VyaW5nTWF0Y2hl
cgorCisjIFRoZXNlIHJ1bGVzIGFyZSBjb25zaWRlcmVkIGluIGEgY2FzY2FkZSwgc3RhcnRpbmcg
YXQgdGhlIHRvcC4gSXQncyBpbXBsZW5lbnRlZCB1c2luZyBzd2l0Y2gKKyMgc3RhdGVtZW50cyB3
aGVyZXZlciBwb3NzaWJsZS4KKworIyBOb3RlOiBhZGRpbmcgbW9yZSBydWxlcyB0byB0aGlzIG1h
dGNoZXIgaXMgYW4gZXhjZWxsZW50IHdheSBvZiBpbXByb3ZpbmcgcGVyZm9ybWFuY2UhCisKK0xv
YWQgPSBMb2FkKGFkZHJlc3MpCisKK0FkZExvYWQgPSBBZGQoTG9hZChhZGRyZXNzKSwgdmFsdWUp
CitBZGQgPSBBZGQobGVmdCwgcmlnaHQpCisKK1N0b3JlQWRkTG9hZDEgPSBTdG9yZShBZGQoTG9h
ZChhZGRyZXNzKSwgdmFsdWUpLCBhZGRyZXNzKQorU3RvcmVBZGRMb2FkMiA9IFN0b3JlKEFkZCh2
YWx1ZSwgTG9hZChhZGRyZXNzKSksIGFkZHJlc3MpCitTdG9yZUFuZExvYWQgPSBTdG9yZShBbmQo
TG9hZChhZGRyZXNzKSwgdmFsdWUpLCBhZGRyZXNzKQorU3RvcmUgPSBTdG9yZSh2YWx1ZSwgYWRk
cmVzcykKKworUmV0dXJuID0gUmV0dXJuKHZhbHVlKQorCkluZGV4OiBTb3VyY2UvSmF2YVNjcmlw
dENvcmUvYjMvQjNNZW1vcnlWYWx1ZS5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL0phdmFTY3Jp
cHRDb3JlL2IzL0IzTWVtb3J5VmFsdWUuY3BwCShyZXZpc2lvbiAwKQorKysgU291cmNlL0phdmFT
Y3JpcHRDb3JlL2IzL0IzTWVtb3J5VmFsdWUuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEs
NDIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTUgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJl
c2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5h
cnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVk
IHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICog
MS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBj
b3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBm
b2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9y
bSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMg
bGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisg
KiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0
aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQ
TEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJ
RVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFO
VElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICog
UFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IK
KyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJ
REVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMg
KElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJ
VFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRT
OyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhF
T1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJ
VFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJ
TkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJ
RiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKworI2lu
Y2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgIkIzTWVtb3J5VmFsdWUuaCIKKworbmFtZXNwYWNl
IEpTQyB7IG5hbWVzcGFjZSBCMyB7CisKK01lbW9yeVZhbHVlOjp+TWVtb3J5VmFsdWUoKQorewor
fQorCit2b2lkIE1lbW9yeVZhbHVlOjpkdW1wTWV0YShQcmludFN0cmVhbSYgb3V0KSBjb25zdAor
eworICAgIGlmIChtX29mZnNldCkKKyAgICAgICAgb3V0LnByaW50KCJvZmZzZXQgPSAiLCBtX29m
ZnNldCk7Cit9CisKK30gfSAvLyBuYW1lc3BhY2UgSlNDOjpCMworCkluZGV4OiBTb3VyY2UvSmF2
YVNjcmlwdENvcmUvYjMvQjNNZW1vcnlWYWx1ZS5oCj09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZh
U2NyaXB0Q29yZS9iMy9CM01lbW9yeVZhbHVlLmgJKHJldmlzaW9uIDApCisrKyBTb3VyY2UvSmF2
YVNjcmlwdENvcmUvYjMvQjNNZW1vcnlWYWx1ZS5oCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEs
MTQyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE1IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyBy
ZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmlu
YXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRl
ZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAq
IDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUg
Y29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUg
Zm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZv
cm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlz
IGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQor
ICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGgg
dGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQ
UExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5U
SUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJB
TlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAq
IFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9S
CisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5D
SURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VT
IChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNU
SVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklU
UzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRI
RU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklM
SVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklT
SU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4g
SUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisKKyNp
Zm5kZWYgQjNNZW1vcnlWYWx1ZV9oCisjZGVmaW5lIEIzTWVtb3J5VmFsdWVfaAorCisjaW5jbHVk
ZSAiQjNWYWx1ZS5oIgorCituYW1lc3BhY2UgSlNDIHsgbmFtZXNwYWNlIEIzIHsKKworY2xhc3Mg
TWVtb3J5VmFsdWUgOiBwdWJsaWMgVmFsdWUgeworcHVibGljOgorICAgIHN0YXRpYyBib29sIGFj
Y2VwdHMoT3Bjb2RlIG9wY29kZSkKKyAgICB7CisgICAgICAgIHN3aXRjaCAob3Bjb2RlKSB7Cisg
ICAgICAgIGNhc2UgTG9hZDhaOgorICAgICAgICBjYXNlIExvYWQ4UzoKKyAgICAgICAgY2FzZSBM
b2FkMTZaOgorICAgICAgICBjYXNlIExvYWQxNlM6CisgICAgICAgIGNhc2UgTG9hZEZsb2F0Ogor
ICAgICAgICBjYXNlIExvYWQ6CisgICAgICAgIGNhc2UgU3RvcmU4OgorICAgICAgICBjYXNlIFN0
b3JlMTY6CisgICAgICAgIGNhc2UgU3RvcmVGbG9hdDoKKyAgICAgICAgY2FzZSBTdG9yZToKKyAg
ICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0
dXJuIGZhbHNlOworICAgICAgICB9CisgICAgfQorCisgICAgfk1lbW9yeVZhbHVlKCk7CisKKyAg
ICBpbnRwdHJfdCBvZmZzZXQoKSBjb25zdCB7IHJldHVybiBtX29mZnNldDsgfQorCitwcm90ZWN0
ZWQ6CisgICAgdm9pZCBkdW1wTWV0YShQcmludFN0cmVhbSYpIGNvbnN0IG92ZXJyaWRlOworCitw
cml2YXRlOgorICAgIGZyaWVuZCBjbGFzcyBQcm9jZWR1cmU7CisKKyAgICAvLyBVc2UgdGhpcyBm
b3JtIGZvciBMb2FkIChidXQgbm90IExvYWQ4WiwgTG9hZDhTLCBvciBhbnkgb2YgdGhlIExvYWRz
IHRoYXQgaGF2ZSBhIHN1ZmZpeCB0aGF0CisgICAgLy8gZGVzY3JpYmVzIHRoZSByZXR1cm5lZCB0
eXBlKS4KKyAgICBNZW1vcnlWYWx1ZSgKKyAgICAgICAgdW5zaWduZWQgaW5kZXgsIE9wY29kZSBv
cGNvZGUsIFR5cGUgdHlwZSwgT3JpZ2luIG9yaWdpbiwgVmFsdWUqIHBvaW50ZXIsCisgICAgICAg
IGludHB0cl90IG9mZnNldCA9IDApCisgICAgICAgIDogVmFsdWUoaW5kZXgsIG9wY29kZSwgdHlw
ZSwgb3JpZ2luLCBwb2ludGVyKQorICAgICAgICAsIG1fb2Zmc2V0KG9mZnNldCkKKyAgICB7Cisg
ICAgICAgIGlmICghQVNTRVJUX0RJU0FCTEVEKSB7CisgICAgICAgICAgICBzd2l0Y2ggKG9wY29k
ZSkgeworICAgICAgICAgICAgY2FzZSBMb2FkOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAg
ICAgICAgICAgY2FzZSBMb2FkOFo6CisgICAgICAgICAgICBjYXNlIExvYWQ4UzoKKyAgICAgICAg
ICAgIGNhc2UgTG9hZDE2WjoKKyAgICAgICAgICAgIGNhc2UgTG9hZDE2UzoKKyAgICAgICAgICAg
ICAgICBBU1NFUlQodHlwZSA9PSBJbnQzMik7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAg
ICAgICAgICBjYXNlIExvYWRGbG9hdDoKKyAgICAgICAgICAgICAgICBBU1NFUlQodHlwZSA9PSBE
b3VibGUpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBTdG9yZTg6
CisgICAgICAgICAgICBjYXNlIFN0b3JlMTY6CisgICAgICAgICAgICBjYXNlIFN0b3JlRmxvYXQ6
CisgICAgICAgICAgICBjYXNlIFN0b3JlOgorICAgICAgICAgICAgICAgIEFTU0VSVCh0eXBlID09
IFZvaWQpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAg
ICAgICAgICAgICAgICBBU1NFUlRfTk9UX1JFQUNIRUQoKTsKKyAgICAgICAgICAgIH0KKyAgICAg
ICAgfQorICAgIH0KKworICAgIC8vIFVzZSB0aGlzIGZvcm0gZm9yIGxvYWRzIHdoZXJlIHRoZSBy
ZXR1cm4gdHlwZSBpcyBpbXBsaWVkLgorICAgIE1lbW9yeVZhbHVlKHVuc2lnbmVkIGluZGV4LCBP
cGNvZGUgb3Bjb2RlLCBPcmlnaW4gb3JpZ2luLCBWYWx1ZSogcG9pbnRlciwgaW50cHRyX3Qgb2Zm
c2V0ID0gMCkKKyAgICAgICAgOiBWYWx1ZShpbmRleCwgb3Bjb2RlLCBvcGNvZGUgPT0gTG9hZEZs
b2F0ID8gRG91YmxlIDogSW50MzIsIG9yaWdpbiwgcG9pbnRlcikKKyAgICAgICAgLCBtX29mZnNl
dChvZmZzZXQpCisgICAgeworICAgICAgICBpZiAoIUFTU0VSVF9ESVNBQkxFRCkgeworICAgICAg
ICAgICAgc3dpdGNoIChvcGNvZGUpIHsKKyAgICAgICAgICAgIGNhc2UgTG9hZDhaOgorICAgICAg
ICAgICAgY2FzZSBMb2FkOFM6CisgICAgICAgICAgICBjYXNlIExvYWQxNlo6CisgICAgICAgICAg
ICBjYXNlIExvYWQxNlM6CisgICAgICAgICAgICBjYXNlIExvYWRGbG9hdDoKKyAgICAgICAgICAg
ICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgQVNTRVJU
X05PVF9SRUFDSEVEKCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9Cisg
ICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBVc2UgdGhpcyBmb3JtIGZvciBzdG9yZXMuCisgICAg
TWVtb3J5VmFsdWUoCisgICAgICAgIHVuc2lnbmVkIGluZGV4LCBPcGNvZGUgb3Bjb2RlLCBPcmln
aW4gb3JpZ2luLCBWYWx1ZSogdmFsdWUsIFZhbHVlKiBwb2ludGVyLAorICAgICAgICBpbnRwdHJf
dCBvZmZzZXQgPSAwKQorICAgICAgICA6IFZhbHVlKGluZGV4LCBvcGNvZGUsIFZvaWQsIG9yaWdp
biwgdmFsdWUsIHBvaW50ZXIpCisgICAgICAgICwgbV9vZmZzZXQob2Zmc2V0KQorICAgIHsKKyAg
ICAgICAgaWYgKCFBU1NFUlRfRElTQUJMRUQpIHsKKyAgICAgICAgICAgIHN3aXRjaCAob3Bjb2Rl
KSB7CisgICAgICAgICAgICBjYXNlIFN0b3JlODoKKyAgICAgICAgICAgIGNhc2UgU3RvcmUxNjoK
KyAgICAgICAgICAgIGNhc2UgU3RvcmVGbG9hdDoKKyAgICAgICAgICAgIGNhc2UgU3RvcmU6Cisg
ICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAg
ICAgIEFTU0VSVF9OT1RfUkVBQ0hFRCgpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAg
ICAgICAgfQorICAgICAgICB9CisgICAgfQorfTsKKworfSB9IC8vIG5hbWVzcGFjZSBKU0M6OkIz
CisKKyNlbmRpZiAvLyBCM01lbW9yeVZhbHVlX2gKKwpJbmRleDogU291cmNlL0phdmFTY3JpcHRD
b3JlL2IzL0IzT3Bjb2RlLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUv
YjMvQjNPcGNvZGUuY3BwCShyZXZpc2lvbiAwKQorKysgU291cmNlL0phdmFTY3JpcHRDb3JlL2Iz
L0IzT3Bjb2RlLmNwcAkod29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDQ3IEBACisvKgorICogQ29w
eXJpZ2h0IChDKSAyMDE1IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBS
ZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9y
IHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRo
ZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9u
cyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBu
b3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWlt
ZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2Ug
dGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9u
cyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlv
biBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4K
KyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycn
IEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJV
VCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRB
QklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NM
QUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMg
QkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwK
KyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBO
T1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VS
VklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5U
RVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklM
SVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAo
SU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VU
IE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUg
UE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisKKyNpbmNsdWRlICJjb25maWcuaCIK
KyNpbmNsdWRlICJCM09wY29kZS5oIgorCisjaW5jbHVkZSA8d3RmL1ByaW50U3RyZWFtLmg+CisK
K25hbWVzcGFjZSBXVEYgeworCit1c2luZyBuYW1lc3BhY2UgSlNDOjpCMzsKKwordm9pZCBwcmlu
dEludGVybmFsKFByaW50U3RyZWFtJiBvdXQsIE9wY29kZSBvcGNvZGUpCit7CisgICAgc3dpdGNo
IChvcGNvZGUpIHsKKyAgICBjYXNlIElkZW50aXR5OgorICAgICAgICBvdXQucHJpbnQoIklkZW50
aXR5Iik7CisgICAgICAgIHJldHVybjsKKyAgICAgICAgLy8gRklYTUUKKyAgICB9CisgICAgUkVM
RUFTRV9BU1NFUlRfTk9UX1JFQUNIRUQoKTsKK30KKworfSAvLyBuYW1lc3BhY2UgV1RGCisKSW5k
ZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM09wY29kZS5oCj09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNv
dXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM09wY29kZS5oCShyZXZpc2lvbiAwKQorKysgU291cmNl
L0phdmFTY3JpcHRDb3JlL2IzL0IzT3Bjb2RlLmgJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSwy
MDMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTUgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJl
c2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5h
cnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVk
IHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICog
MS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBj
b3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBm
b2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9y
bSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMg
bGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisg
KiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0
aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQ
TEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJ
RVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFO
VElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICog
UFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IK
KyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJ
REVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMg
KElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJ
VFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRT
OyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhF
T1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJ
VFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJ
TkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJ
RiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKworI2lm
bmRlZiBCM09wY29kZV9oCisjZGVmaW5lIEIzT3Bjb2RlX2gKKworI2luY2x1ZGUgPHd0Zi9TdGRM
aWJFeHRyYXMuaD4KKworbmFtZXNwYWNlIEpTQyB7IG5hbWVzcGFjZSBCMyB7CisKK2VudW0gT3Bj
b2RlIDogaW50MTZfdCB7CisgICAgLy8gQSBuby1vcCB0aGF0IHJldHVybnMgVm9pZCwgdXNlZnVs
IGZvciB3aGVuIHlvdSB3YW50IHRvIHJlbW92ZSBhIHZhbHVlLgorICAgIE5vcCwKKyAgICAgCisg
ICAgLy8gUG9seW1vcnBoaWMgaWRlbnRpdHksIHVzYWJsZSB3aXRoIGFueSB2YWx1ZSB0eXBlLgor
ICAgIElkZW50aXR5LAorCisgICAgLy8gQ29uc3RhbnRzLiBVc2UgdGhlIENvbnN0VmFsdWUqIGNs
YXNzZXMuIENvbnN0YW50cyBleGlzdCBpbiB0aGUgY29udHJvbCBmbG93LCBzbyB0aGF0IHdlIGNh
bgorICAgIC8vIHJlYXNvbiBhYm91dCB3aGVyZSB3ZSB3b3VsZCBjb25zdHJ1Y3QgdGhlbS4gTGFy
Z2UgY29uc3RhbnRzIGFyZSBleHBlbnNpdmUgdG8gY3JlYXRlLgorICAgIENvbnN0MzIsCisgICAg
Q29uc3Q2NCwKKyAgICBDb25zdERvdWJsZSwKKworICAgIC8vIFRoZSBtYWdpY2FsIHN0YWNrIHNs
b3QuIFRoaXMgaXMgdmlld2VkIGFzIGV4ZWN1dGluZyBhdCB0aGUgdG9wIG9mIHRoZSBwcm9ncmFt
IHJlZ2FyZGxlc3Mgb2YKKyAgICAvLyB3aGVyZSBpbiBjb250cm9sIGZsb3cgeW91IHB1dCBpdC4g
RWFjaCBpbnN0YW5jZSBvZiBhIFN0YWNrU2xvdCBWYWx1ZSBnZXRzIGEgZGlzam9pbnQgcmFuZ2Ug
b2YKKyAgICAvLyBzdGFjayBtZW1vcnkuIFVzZSB0aGUgU3RhY2tTbG90VmFsdWUgY2xhc3MuCisg
ICAgU3RhY2tTbG90LAorCisgICAgLy8gVGhlIG1hZ2ljYWwgYXJndW1lbnQgcmVnaXN0ZXIuIFRo
aXMgaXMgdmlld2VkIGFzIGV4ZWN1dGluZyBhdCB0aGUgdG9wIG9mIHRoZSBwcm9ncmFtCisgICAg
Ly8gcmVnYXJkbGVzcyBvZiB3aGVyZSBpbiBjb250cm9sIGZsb3cgeW91IHB1dCBpdCwgYW5kIHRo
ZSBjb21waWxlciB0YWtlcyBjYXJlIHRvIGVuc3VyZSB0aGF0IHdlCisgICAgLy8gZG9uJ3QgY2xv
YmJlciB0aGUgdmFsdWUgYnkgcmVnaXN0ZXIgYWxsb2NhdGlvbiBvciBjYWxscyAoZWl0aGVyIGJ5
IHNhdmluZyB0aGUgYXJndW1lbnQgdG8gdGhlCisgICAgLy8gc3RhY2sgb3IgcHJlc2VydmluZyBp
dCBpbiBhIGNhbGxlZS1zYXZlIHJlZ2lzdGVyKS4gVXNlIHRoZSBBcmd1bWVudFJlZ1ZhbHVlIGNs
YXNzLiBUaGUgcmV0dXJuCisgICAgLy8gdHlwZSBpcyBlaXRoZXIgcG9pbnRlcigpIChmb3IgR1BS
cykgb3IgRG91YmxlIChmb3IgRlBScykuCisgICAgQXJndW1lbnRSZWcsCisKKyAgICAvLyBUaGUg
ZnJhbWUgcG9pbnRlci4gWW91IGNhbiBwdXQgdGhpcyBhbnl3aGVyZSBpbiBjb250cm9sIGZsb3cg
YnV0IGl0IHdpbGwgYWx3YXlzIHlpZWxkIHRoZQorICAgIC8vIGZyYW1lIHBvaW50ZXIsIHdpdGgg
YSBjYXZlYXQ6IGlmIG91ciBjb21waWxlciBjaGFuZ2VzIHRoZSBmcmFtZSBwb2ludGVyIHRlbXBv
cmFyaWx5IGZvciBzb21lCisgICAgLy8gc2lsbHkgcmVhc29uLCB0aGUgRnJhbWVQb2ludGVyIGlu
dHJpbnNpYyB3aWxsIHJldHVybiB3aGVyZSB0aGUgZnJhbWUgcG9pbnRlciAqc2hvdWxkKiBiZSBu
b3QKKyAgICAvLyB3aGVyZSBpdCBoYXBwZW5zIHRvIGJlIHJpZ2h0IG5vdy4KKyAgICBGcmFtZVBv
aW50ZXIsCisKKyAgICAvLyBQb2x5bW9ycGhpYyBtYXRoLCB1c2FibGUgd2l0aCBhbnkgdmFsdWUg
dHlwZS4KKyAgICBBZGQsCisgICAgU3ViLAorICAgIE11bCwKKyAgICBEaXYsCisKKyAgICAvLyBJ
bnRlZ2VyIG1hdGguCisgICAgQ2hpbGxEaXYsIC8vIGRvZXNuJ3QgdHJhcCBldmVyLCBiZWhhdmVz
IGxpa2UgSlMgKHgveSl8MC4KKyAgICBNb2QsCisgICAgQml0QW5kLAorICAgIEJpdE9yLAorICAg
IEJpdFhvciwKKyAgICBTaGwsCisgICAgU1NociwKKyAgICBaU2hyLAorCisgICAgLy8gQ2FzdHMg
YW5kIHN1Y2guCisgICAgLy8gVGFrZXMgYW5kIHJldHVybnMgSW50MzI6CisgICAgU0V4dDgsCisg
ICAgU0V4dDE2LAorICAgIC8vIFRha2VzIEludDMyIGFuZCByZXR1cm5zIEludDY0OgorICAgIFNF
eHQzMiwKKyAgICBaRXh0MzIsCisgICAgLy8gVGFrZXMgYW5kIHJldHVybnMgRG91YmxlOgorICAg
IEZSb3VuZCwKKyAgICAvLyBUYWtlcyBpbnRzIGFuZCByZXR1cm5zIERvdWJsZToKKyAgICBJVG9E
LAorICAgIC8vIFRha2VzIERvdWJsZSBhbmQgcmV0dXJucyBJbnQzMjoKKyAgICBEVG9JMzIsCisK
KyAgICAvLyBQb2x5bW9ycGhpYyBjb21wYXJpc29ucywgdXNhYmxlIHdpdGggYW55IHZhbHVlIHR5
cGUuIFJldHVybnMgaW50MzIgMCBvciAxLiBOb3RlIHRoYXQgIk5vdCIKKyAgICAvLyBpcyBqdXN0
IEVxdWFsKHgsIDApLgorICAgIEVxdWFsLAorICAgIE5vdEVxdWFsLAorICAgIExlc3NUaGFuLAor
ICAgIEdyZWF0ZXJUaGFuLAorICAgIExlc3NFcXVhbCwKKyAgICBHcmVhdGVyRXF1YWwsCisKKyAg
ICAvLyBJbnRlZ2VyIGNvbXBhcmlzb25zLiBSZXR1cm5zIGludDMyIDAgb3IgMS4KKyAgICBBYm92
ZSwKKyAgICBCZWxvdywKKyAgICBBYm92ZUVxdWFsCisgICAgQmVsb3dFcXVhbCwKKworICAgIC8v
IE1lbW9yeSBsb2Fkcy4gT3Bjb2RlIGluZGljYXRlcyBob3cgd2UgbG9hZCBhbmQgdGhlIGxvYWRl
ZCB0eXBlLiBUaGVzZSB1c2UgTWVtb3J5VmFsdWUuCisgICAgLy8gVGhlc2UgcmV0dXJuIEludDMy
OgorICAgIExvYWQ4WiwKKyAgICBMb2FkOFMsCisgICAgTG9hZDE2WiwKKyAgICBMb2FkMTZTLAor
ICAgIC8vIFRoaXMgcmV0dXJucyBEb3VibGU6CisgICAgTG9hZEZsb2F0LAorICAgIC8vIFRoaXMg
cmV0dXJuIHdoYXRldmVyIHRoZSByZXR1cm4gdHlwZSBpczoKKyAgICBMb2FkLAorCisgICAgLy8g
TWVtb3J5IHN0b3Jlcy4gT3Bjb2RlIGluZGljYXRlcyBob3cgdGhlIHZhbHVlIGlzIHN0b3JlZC4g
VGhlc2UgdXNlIE1lbW9yeVZhbHVlLgorICAgIC8vIFRoZXNlIHRha2UgYW4gSW50MzIgdmFsdWU6
CisgICAgU3RvcmU4LAorICAgIFN0b3JlMTYsCisgICAgLy8gVGhpcyB0YWtlcyBhIERvdWJsZSB2
YWx1ZToKKyAgICBTdG9yZUZsb2F0LAorICAgIC8vIFRoaXMgaXMgYSBwb2x5bW9ycGhpYyBzdG9y
ZSBmb3IgSW50MzIsIEludDY0LCBhbmQgRG91YmxlOgorICAgIFN0b3JlLAorCisgICAgLy8gVGhp
cyBpcyBhIHJlZ3VsYXIgb3JkaW5hcnkgQyBmdW5jdGlvbiBjYWxsLCB1c2luZyB0aGUgc3lzdGVt
IEMgY2FsbGluZyBjb252ZW50aW9uLiBNYWtlIHN1cmUKKyAgICAvLyB0aGF0IHRoZSBhcmd1bWVu
dHMgYXJlIHBhc3NlZCB1c2luZyB0aGUgcmlnaHQgdHlwZXMuCisgICAgQ0NhbGwsCisKKyAgICAv
LyBUaGlzIGlzIGEgcGF0Y2hwb2ludC4gVXNlIHRoZSBQYXRjaHBvaW50VmFsdWUgY2xhc3MuIFRo
aXMgaXMgdmlld2VkIGFzIGJlaGF2aW5nIGxpa2UgYSBjYWxsLAorICAgIC8vIGJ1dCBvbmx5IGVt
aXRzIGNvZGUgdmlhIGEgY29kZSBnZW5lcmF0aW9uIGNhbGxiYWNrLiBUaGF0IGNhbGxiYWNrIGdl
dHMgdG8gZW1pdCBjb2RlIGlubGluZS4KKyAgICAvLyBZb3UgY2FuIHBhc3MgYSBzdGFja21hcCBh
bG9uZyB3aXRoIGNvbnN0cmFpbnRzIG9uIGhvdyBlYWNoIHN0YWNrbWFwIGFyZ3VtZW50IG11c3Qg
YmUgcGFzc2VkLgorICAgIC8vIEl0J3MgbGVnYWwgdG8gcmVxdWVzdCB0aGF0IGEgc3RhY2ttYXAg
YXJndW1lbnQgaXMgaW4gc29tZSByZWdpc3RlciBhbmQgaXQncyBsZWdhbCB0byByZXF1ZXN0Cisg
ICAgLy8gdGhhdCBhIHN0YWNrbWFwIGFyZ3VtZW50IGlzIGF0IHNvbWUgb2Zmc2V0IGZyb20gdGhl
IHRvcCBvZiB0aGUgYXJndW1lbnQgcGFzc2luZyBhcmVhIG9uIHRoZQorICAgIC8vIHN0YWNrLgor
ICAgIFBhdGNocG9pbnQsCisKKyAgICAvLyBDaGVja2VkIG1hdGguIFVzZSB0aGUgQ2hlY2tWYWx1
ZSBjbGFzcy4gTGlrZSBhIFBhdGNocG9pbnQsIHRoaXMgdGFrZXMgYSBjb2RlIGdlbmVyYXRpb24K
KyAgICAvLyBjYWxsYmFjay4gVGhhdCBjYWxsYmFjayBnZXRzIHRvIGVtaXQgc29tZSBjb2RlIGFm
dGVyIHRoZSBlcGlsb2d1ZSwgYW5kIGdldHMgdG8gbGluayB0aGUganVtcAorICAgIC8vIGZyb20g
dGhlIGNoZWNrLCBhbmQgdGhlIGNob2ljZSBvZiByZWdpc3RlcnMuIFlvdSBhbHNvIGdldCB0byBz
dXBwbHkgYSBzdGFja21hcC4gTm90ZSB0aGF0IHlvdQorICAgIC8vIGFyZSBub3QgYWxsb3dlZCB0
byBqdW1wIGJhY2sgaW50byB0aGUgbWFpbmxpbmUgY29kZSBmcm9tIHlvdXIgc2xvdyBwYXRoLCBz
aW5jZSB0aGUgY29tcGlsZXIKKyAgICAvLyB3aWxsIGFzc3VtZSB0aGF0IHRoZSBleGVjdXRpb24g
b2YgdGhlc2UgaW5zdHJ1Y3Rpb25zIHByb3ZlcyB0aGF0IG92ZXJmbG93IGRpZG4ndCBoYXBwZW4u
IEZvcgorICAgIC8vIGV4YW1wbGUsIGlmIHlvdSBoYXZlIHR3byBDaGVja0FkZCdzOgorICAgIC8v
CisgICAgLy8gYSA9IENoZWNrQWRkKHgsIHkpCisgICAgLy8gYiA9IENoZWNrQWRkKHgsIHkpCisg
ICAgLy8KKyAgICAvLyBUaGVuIGl0J3MgdmFsaWQgdG8gY2hhbmdlIHRoaXMgdG86CisgICAgLy8K
KyAgICAvLyBhID0gQ2hlY2tBZGQoeCwgeSkKKyAgICAvLyBiID0gSWRlbnRpdHkoYSkKKyAgICAv
LworICAgIC8vIFRoaXMgaXMgdmFsaWQgcmVnYXJkbGVzcyBvZiB0aGUgY2FsbGJhY2tzIHVzZWQg
YnkgdGhlIHR3byBDaGVja0FkZHMuIFRoZXkgbWF5IGhhdmUgZGlmZmVyZW50CisgICAgLy8gY2Fs
bGJhY2tzLiBZZXQsIHRoaXMgdHJhbnNmb3JtYXRpb24gaXMgdmFsaWQgZXZlbiBpZiB0aGV5IGFy
ZSBkaWZmZXJlbnQgYmVjYXVzZSB3ZSBrbm93IHRoYXQKKyAgICAvLyBhZnRlciB0aGUgZmlyc3Qg
Q2hlY2tBZGQgZXhlY3V0ZXMsIHRoZSBzZWNvbmQgQ2hlY2tBZGQgY291bGQgbm90IGhhdmUgcG9z
c2libHkgdGFrZW4gc2xvdworICAgIC8vIHBhdGguIFRoZXJlZm9yZSwgdGhlIHNlY29uZCBDaGVj
a0FkZCdzIGNhbGxiYWNrIGlzIGlycmVsZXZhbnQuCisgICAgQ2hlY2tBZGQsCisgICAgQ2hlY2tT
dWIsCisgICAgQ2hlY2tNdWwsCisKKyAgICAvLyBDaGVjayB0aGF0IHNpZGUtZXhpdHMuIFVzZSB0
aGUgQ2hlY2tWYWx1ZSBjbGFzcy4gTGlrZSBDaGVja0FkZCBhbmQgZnJpZW5kcywgdGhpcyBoYXMg
YQorICAgIC8vIHN0YWNrbWFwIHdpdGggYSBnZW5lcmF0aW9uIGNhbGxiYWNrLiBUaGlzIHRha2Vz
IGFuIEludDMyIGFyZ3VtZW50IHRoYXQgdGhpcyBicmFuY2hlcyBvbiwgd2l0aAorICAgIC8vIGZ1
bGwgYnJhbmNoIGZ1c2lvbiBpbiB0aGUgaW5zdHJ1Y3Rpb24gc2VsZWN0b3IuIEEgdHJ1ZSB2YWx1
ZSBqdW1wcyB0byB0aGUgZ2VuZXJhdG9yJ3Mgc2xvdworICAgIC8vIHBhdGguCisgICAgQ2hlY2ss
CisKKyAgICAvLyBTU0Egc3VwcG9ydCwgaW4gdGhlIHN0eWxlIG9mIERGRyBTU0EuCisgICAgVXBz
aWxvbiwgLy8gVGhpcyB1c2VzIHRoZSBVcHNpbG9uVmFsdWUgY2xhc3MuCisgICAgUGhpLAorCisg
ICAgLy8gSnVtcC4gVXNlcyB0aGUgQ29udHJvbFZhbHVlIGNsYXNzLgorICAgIEp1bXAsCisgICAg
CisgICAgLy8gUG9seW1vcnBoaWMgYnJhbmNoLCB1c2FibGUgd2l0aCBhbnkgdmFsdWUgdHlwZS4g
QnJhbmNoZXMgaWYgbm90IGVxdWFsIHRvIHplcm8uIFVzZXMgdGhlCisgICAgLy8gQ29udHJvbFZh
bHVlIGNsYXNzLCB3aXRoIHRoZSAwLWluZGV4IHN1Y2Nlc3NvciBiZWluZyB0aGUgdHJ1ZSBzdWNj
ZXNzb3IuCisgICAgQnJhbmNoLAorCisgICAgLy8gU3dpdGNoLiBTd2l0Y2hlcyBvdmVyIGVpdGhl
ciBJbnQzMiBvciBJbnQ2NC4gVXNlcyB0aGUgU3dpdGNoVmFsdWUgY2xhc3MuCisgICAgU3dpdGNo
LAorCisgICAgLy8gUmV0dXJuLiBOb3RlIHRoYXQgQjMgcHJvY2VkdXJlcyBkb24ndCBrbm93IHRo
ZWlyIHJldHVybiB0eXBlLCBzbyB0aGlzIGNhbiBqdXN0IHJldHVybiBhbnkKKyAgICAvLyB0eXBl
LiBVc2VzIHRoZSBDb250cm9sVmFsdWUgY2xhc3MuCisgICAgUmV0dXJuLAorCisgICAgLy8gVGhp
cyBpcyBhIHRlcm1pbmFsIHRoYXQgaW5kaWNhdGVzIHRoYXQgd2Ugd2lsbCBuZXZlciBnZXQgaGVy
ZS4gVXNlcyB0aGUgQ29udHJvbFZhbHVlIGNsYXNzLgorICAgIE9vcHMKK307CisKK30gfSAvLyBu
YW1lc3BhY2UgSlNDOjpCMworCituYW1lc3BhY2UgV1RGIHsKKworY2xhc3MgUHJpbnRTdHJlYW07
CisKK3ZvaWQgcHJpbnRJbnRlcm5hbChQcmludFN0cmVhbSYsIEpTQzo6QjM6Ok9wY29kZSk7CisK
K30gLy8gbmFtZXNwYWNlIFdURgorCisjZW5kaWYgLy8gQjNPcGNvZGVfaAorCkluZGV4OiBTb3Vy
Y2UvSmF2YVNjcmlwdENvcmUvYjMvQjNPcmlnaW4uY3BwCj09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9K
YXZhU2NyaXB0Q29yZS9iMy9CM09yaWdpbi5jcHAJKHJldmlzaW9uIDApCisrKyBTb3VyY2UvSmF2
YVNjcmlwdENvcmUvYjMvQjNPcmlnaW4uY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsMzcg
QEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTUgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2Vy
dmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkg
Zm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHBy
b3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4g
UmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5
cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xs
b3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBt
dXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlz
dCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAg
ICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUg
ZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUg
SU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMs
IElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElF
UyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVS
UE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IKKyAq
IENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVO
VEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElO
Q0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVU
RSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBP
UiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZ
CisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFks
IE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcg
SU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBB
RFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKworI2luY2x1
ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgIkIzT3JpZ2luLmgiCisKK25hbWVzcGFjZSBKU0MgeyBu
YW1lc3BhY2UgQjMgeworCit2b2lkIE9yaWdpbjo6ZHVtcChQcmludFN0cmVhbSYgb3V0KSBjb25z
dAoreworICAgIG91dC5wcmludCgiT3JpZ2luKCIsIFJhd1BvaW50ZXIobV9kYXRhKSwgIikiKTsK
K30KKworfSB9IC8vIG5hbWVzcGFjZSBKU0M6OkIzCisKSW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0
Q29yZS9iMy9CM09yaWdpbi5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9i
My9CM09yaWdpbi5oCShyZXZpc2lvbiAwKQorKysgU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0Iz
T3JpZ2luLmgJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSw1NSBAQAorLyoKKyAqIENvcHlyaWdo
dCAoQykgMjAxNSBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0
cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRo
b3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9s
bG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Yg
c291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNl
LCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgor
ICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBh
Ym92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5k
IHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5k
L29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgor
ICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIGBgQVMgSVMnJyBBTkQg
QU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9U
IExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElU
WSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVE
LiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJ
QUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBF
WEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJ
TUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VT
OyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQ
VElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwg
V0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xV
RElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBU
SEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJ
QklMSVRZIE9GIFNVQ0ggREFNQUdFLiAKKyAqLworCisjaWZuZGVmIEIzT3JpZ2luX2gKKyNkZWZp
bmUgQjNPcmlnaW5faAorCisjaW5jbHVkZSA8d3RmL1ByaW50U3RyZWFtLmg+CisKK25hbWVzcGFj
ZSBKU0MgeyBuYW1lc3BhY2UgQjMgeworCisvLyBXaG9ldmVyIGdlbmVyYXRlcyBCM0lSIGNhbiBj
aG9vc2UgdG8gcHV0IG9yaWdpbnMgb24gdmFsdWVzLiBXaGVuIHlvdSBkbyB0aGlzLCBCMyB3aWxs
IGJlIGFibGUgdG8KKy8vIGFjY291bnQsIGRvd24gdG8gdGhlIG1hY2hpbmUgY29kZSwgd2hpY2gg
aW5zdHJ1Y3Rpb24gY29ycmVzcG9uZHMgdG8gd2hpY2ggb3JpZ2luLiBCMworLy8gdHJhbnNmb3Jt
YXRpb25zIG11c3QgcHJlc2VydmUgT3JpZ2lucyBjYXJlZnVsbHkuIEl0J3MgYW4gZXJyb3IgdG8g
d3JpdGUgYSB0cmFuc2Zvcm1hdGlvbiB0aGF0CisvLyBlaXRoZXIgZHJvcHMgT3JpZ2lucyBvciBs
aWVzIGFib3V0IHRoZW0uCitjbGFzcyBPcmlnaW4geworcHVibGljOgorICAgIGV4cGxpY2l0IE9y
aWdpbihjb25zdCB2b2lkKiBkYXRhID0gbnVsbHB0cikKKyAgICAgICAgOiBtX2RhdGEoZGF0YSkK
KyAgICB7CisgICAgfQorCisgICAgY29uc3Qgdm9pZCogZGF0YSgpIGNvbnN0IHsgcmV0dXJuIG1f
ZGF0YTsgfQorCisgICAgdm9pZCBkdW1wKFByaW50U3RyZWFtJikgY29uc3Q7CisgICAgCitwcml2
YXRlOgorICAgIGNvbnN0IHZvaWQqIG1fZGF0YTsKK307CisKK30gfSAvLyBuYW1lc3BhY2UgSlND
OjpCMworCisjZW5kaWYgLy8gQjNPcmlnaW5faAorCkluZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENv
cmUvYjMvQjNQYXRjaHBvaW50VmFsdWUuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2Ny
aXB0Q29yZS9iMy9CM1BhdGNocG9pbnRWYWx1ZS5jcHAJKHJldmlzaW9uIDApCisrKyBTb3VyY2Uv
SmF2YVNjcmlwdENvcmUvYjMvQjNQYXRjaHBvaW50VmFsdWUuY3BwCSh3b3JraW5nIGNvcHkpCkBA
IC0wLDAgKzEsNDYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTUgQXBwbGUgSW5jLiBBbGwg
cmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNl
IGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUg
cGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUg
bWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRo
ZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMg
YW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBi
aW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3Rp
Y2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIg
aW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlk
ZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklE
RUQgQlkgQVBQTEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVE
IFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJ
RUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElD
VUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExF
IElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElS
RUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFM
IERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQg
T0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisg
KiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBP
TiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklD
VCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJ
U0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FS
RSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisg
Ki8KKworI2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgIkIzUGF0Y2hwb2ludFZhbHVlLmgi
CisKKyNpbmNsdWRlIDx3dGYvQ29tbWFQcmludGVyLmg+CisKK25hbWVzcGFjZSBKU0MgeyBuYW1l
c3BhY2UgQjMgeworCitQYXRjaHBvaW50VmFsdWU6On5QYXRjaHBvaW50VmFsdWUoKQoreworfQor
Cit2b2lkIFBhdGNocG9pbnRWYWx1ZTo6ZHVtcE1ldGEoUHJpbnRTdHJlYW0mIG91dCkgY29uc3QK
K3sKKyAgICBDb21tYVByaW50ZXIgY29tbWE7CisgICAgb3V0LnByaW50KGNvbW1hLCAic3RhY2tt
YXAgPSAiLCBzdGFja21hcCk7CisgICAgaWYgKHNoYWRvdykKKyAgICAgICAgb3V0LnByaW50KGNv
bW1hLCAic2hhZG93ID0gIiwgc2hhZG93KTsKK30KKworfSB9IC8vIG5hbWVzcGFjZSBKU0M6OkIz
CisKSW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM1BhdGNocG9pbnRWYWx1ZS5oCj09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM1BhdGNocG9pbnRWYWx1ZS5o
CShyZXZpc2lvbiAwKQorKysgU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzUGF0Y2hwb2ludFZh
bHVlLmgJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSw1OCBAQAorLyoKKyAqIENvcHlyaWdodCAo
QykgMjAxNSBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmli
dXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0
CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93
aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291
cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0
aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICog
Mi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92
ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRo
ZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29y
IG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICog
VEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5Z
CisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJ
TUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBB
TkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAg
SU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJM
RSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVN
UExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlU
RUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBM
T1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElP
TikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hF
VEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElO
RyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUg
VVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklM
SVRZIE9GIFNVQ0ggREFNQUdFLiAKKyAqLworCisjaWZuZGVmIEIzUGF0Y2hwb2ludFZhbHVlX2gK
KyNkZWZpbmUgQjNQYXRjaHBvaW50VmFsdWVfaAorCisjaW5jbHVkZSAiQjNWYWx1ZS5oIgorI2lu
Y2x1ZGUgIkIzU3RhY2ttYXAuaCIKKworbmFtZXNwYWNlIEpTQyB7IG5hbWVzcGFjZSBCMyB7CisK
K2NsYXNzIFBhdGNocG9pbnRWYWx1ZSA6IHB1YmxpYyBWYWx1ZSB7CitwdWJsaWM6CisgICAgc3Rh
dGljIGJvb2wgYWNjZXB0cyhPcGNvZGUgb3Bjb2RlKSB7IHJldHVybiBvcGNvZGUgPT0gUGF0Y2hw
b2ludDsgfQorCisgICAgflBhdGNocG9pbnRWYWx1ZSgpOworCisgICAgU3RhY2ttYXAgc3RhY2tt
YXA7CisgICAgdW5zaWduZWQgc2hhZG93IHsgMCB9OworCitwcm90ZWN0ZWQ6CisgICAgdm9pZCBk
dW1wTWV0YShQcmludFN0cmVhbSYpIGNvbnN0IG92ZXJyaWRlOworCitwcml2YXRlOgorICAgIGZy
aWVuZCBjbGFzcyBQcm9jZWR1cmU7CisKKyAgICBQYXRjaHBvaW50VmFsdWUodW5zaWduZWQgaW5k
ZXgsIFR5cGUgdHlwZSwgT3JpZ2luIG9yaWdpbiwgY29uc3QgQWRqYWNlbmN5TGlzdCYgY2hpbGRy
ZW4pCisgICAgICAgIDogVmFsdWUoaW5kZXgsIFBhdGNocG9pbnQsIHR5cGUsIG9yaWdpbiwgY2hp
bGRyZW4pCisgICAgeworICAgIH0KK307CisKK30gfSAvLyBuYW1lc3BhY2UgSlNDOjpCMworCisj
ZW5kaWYgLy8gQjNQYXRjaHBvaW50VmFsdWVfaAorCkluZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENv
cmUvYjMvQjNQcm9jZWR1cmUuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29y
ZS9iMy9CM1Byb2NlZHVyZS5jcHAJKHJldmlzaW9uIDApCisrKyBTb3VyY2UvSmF2YVNjcmlwdENv
cmUvYjMvQjNQcm9jZWR1cmUuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsNTYgQEAKKy8q
CisgKiBDb3B5cmlnaHQgKEMpIDIwMTUgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgor
ICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMs
IHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVk
IHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0
cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQK
KyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcg
ZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJl
cHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBj
b25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1
bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJp
YnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBg
YEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xV
RElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBN
RVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBB
UkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IKKyAqIENPTlRS
SUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBT
UEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElO
RywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09E
UyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJ
TkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBP
RiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRP
UlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5Z
IFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VE
IE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKworI2luY2x1ZGUgImNv
bmZpZy5oIgorI2luY2x1ZGUgIkIzUHJvY2VkdXJlLmgiCisKKyNpbmNsdWRlICJCM0Jhc2ljQmxv
Y2suaCIKKyNpbmNsdWRlICJCM1ZhbHVlLmgiCisKK25hbWVzcGFjZSBKU0MgeyBuYW1lc3BhY2Ug
QjMgeworCitQcm9jZWR1cmU6OlByb2NlZHVyZSgpCit7Cit9CisKK1Byb2NlZHVyZTo6flByb2Nl
ZHVyZSgpCit7Cit9CisKK0Jhc2ljQmxvY2sqIFByb2NlZHVyZTo6YWRkQmxvY2soKQoreworICAg
IHN0ZDo6dW5pcXVlX3B0cjxCYXNpY0Jsb2NrPiBibG9jayA9IHN0ZDo6bWFrZV91bmlxdWU8QmFz
aWNCbG9jaz4obV9ibG9ja3Muc2l6ZSgpKTsKKyAgICBCYXNpY0Jsb2NrKiByZXN1bHQgPSBibG9j
ay5nZXQoKTsKKyAgICBtX2Jsb2Nrcy5hcHBlbmQoV1RGOjptb3ZlKGJsb2NrKSk7CisgICAgcmV0
dXJuIHJlc3VsdDsKK30KKwordm9pZCBQcm9jZWR1cmU6OmR1bXAoUHJpbnRTdHJlYW0mIG91dCkg
Y29uc3QKK3sKKyAgICBmb3IgKEJhc2ljQmxvY2sqIGJsb2NrIDogKnRoaXMpCisgICAgICAgIG91
dC5wcmludChkZWVwRHVtcChibG9jaykpOworfQorCit9IH0gLy8gbmFtZXNwYWNlIEpTQzo6QjMK
SW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM1Byb2NlZHVyZS5oCj09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0K
LS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM1Byb2NlZHVyZS5oCShyZXZpc2lvbiAwKQor
KysgU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzUHJvY2VkdXJlLmgJKHdvcmtpbmcgY29weSkK
QEAgLTAsMCArMSwxNzcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTUgQXBwbGUgSW5jLiBB
bGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291
cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBh
cmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBh
cmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWlu
IHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlv
bnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBp
biBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBu
b3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWlt
ZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJv
dmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJP
VklERUQgQlkgQVBQTEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBM
SUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElN
UExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFS
VElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQ
UExFIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElO
RElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5U
SUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1F
TlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9S
CisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFO
RCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNU
UklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhF
UldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZU
V0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4g
CisgKi8KKworI2lmbmRlZiBCM1Byb2NlZHVyZV9oCisjZGVmaW5lIEIzUHJvY2VkdXJlX2gKKwor
I2luY2x1ZGUgPHd0Zi9CYWcuaD4KKyNpbmNsdWRlIDx3dGYvRmFzdE1hbGxvYy5oPgorI2luY2x1
ZGUgPHd0Zi9Ob25jb3B5YWJsZS5oPgorI2luY2x1ZGUgPHd0Zi9WZWN0b3IuaD4KKworbmFtZXNw
YWNlIEpTQyB7IG5hbWVzcGFjZSBCMyB7CisKK2NsYXNzIEJhc2ljQmxvY2s7CitjbGFzcyBWYWx1
ZTsKKworY2xhc3MgUHJvY2VkdXJlIHsKKyAgICBXVEZfTUFLRV9OT05DT1BZQUJMRShQcm9jZWR1
cmUpOworICAgIFdURl9NQUtFX0ZBU1RfQUxMT0NBVEVEOworcHVibGljOgorCisgICAgUHJvY2Vk
dXJlKCk7CisgICAgflByb2NlZHVyZSgpOworCisgICAgQmFzaWNCbG9jayogYWRkQmxvY2soKTsK
KyAgICAKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBWYWx1ZVR5cGUsIHR5cGVuYW1lLi4uIEFyZ3Vt
ZW50cz4KKyAgICBWYWx1ZVR5cGUqIGFkZChBcmd1bWVudHMuLi4pOworCisgICAgdm9pZCBkdW1w
KFByaW50U3RyZWFtJikgY29uc3Q7CisKKyAgICB1bnNpZ25lZCBzaXplKCkgY29uc3QgeyByZXR1
cm4gbV9ibG9ja3Muc2l6ZSgpOyB9CisgICAgQmFzaWNCbG9jayogYXQodW5zaWduZWQgaW5kZXgp
IGNvbnN0IHsgcmV0dXJuIG1fYmxvY2tzW2luZGV4XTsgfQorICAgIEJhc2ljQmxvY2sqIG9wZXJh
dG9yW10odW5zaWduZWQgaW5kZXgpIGNvbnN0IHsgcmV0dXJuIGF0KGluZGV4KTsgfQorCisgICAg
Y2xhc3MgaXRlcmF0b3IgeworICAgIHB1YmxpYzoKKyAgICAgICAgaXRlcmF0b3IoKToKKyAgICAg
ICAgICAgIDogbV9wcm9jZWR1cmUobnVsbHB0cikKKyAgICAgICAgICAgICwgbV9pbmRleCgwKQor
ICAgICAgICB7CisgICAgICAgIH0KKworICAgICAgICBpdGVyYXRvcihQcm9jZWR1cmUmIHByb2Nl
ZHVyZSwgdW5zaWduZWQgaW5kZXgpCisgICAgICAgICAgICA6IG1fcHJvY2VkdXJlKCZwcm9jZWR1
cmUpCisgICAgICAgICAgICAsIG1faW5kZXgoaW5kZXgpCisgICAgICAgIHsKKyAgICAgICAgfQor
CisgICAgICAgIEJhc2ljQmxvY2sqIG9wZXJhdG9yKigpCisgICAgICAgIHsKKyAgICAgICAgICAg
IHJldHVybiBtX3Byb2NlZHVyZS0+YXQobV9pbmRleCk7CisgICAgICAgIH0KKworICAgICAgICBp
dGVyYXRvciYgb3BlcmF0b3IrKygpCisgICAgICAgIHsKKyAgICAgICAgICAgIG1faW5kZXggPSBm
aW5kTmV4dChtX2luZGV4ICsgMSk7CisgICAgICAgICAgICByZXR1cm4gKnRoaXM7CisgICAgICAg
IH0KKworICAgICAgICBib29sIG9wZXJhdG9yPT0oY29uc3QgaXRlcmF0b3ImIG90aGVyKSBjb25z
dAorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gbV9pbmRleCA9PSBvdGhlci5tX2luZGV4
OworICAgICAgICB9CisKKyAgICAgICAgYm9vbCBvcGVyYXRvciE9KGNvbnN0IGl0ZXJhdG9yJiBv
dGhlcikgY29uc3QKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuICEoKnRoaXMgPT0gb3Ro
ZXIpOworICAgICAgICB9CisKKyAgICBwcml2YXRlOgorICAgICAgICB1bnNpZ25lZCBmaW5kTmV4
dCh1bnNpZ25lZCBpbmRleCkKKyAgICAgICAgeworICAgICAgICAgICAgd2hpbGUgKGluZGV4IDwg
bV9wcm9jZWR1cmUtPnNpemUoKSAmJiAhbV9wcm9jZWR1cmUtPmF0KGluZGV4KSkKKyAgICAgICAg
ICAgICAgICBpbmRleCsrOworICAgICAgICAgICAgcmV0dXJuIGluZXg7CisgICAgICAgIH0KKwor
ICAgICAgICBQcm9jZWR1cmUqIG1fcHJvY2VkdXJlOworICAgICAgICB1bnNpZ25lZCBtX2luZGV4
OworICAgIH07CisKKyAgICBpdGVyYXRvciBiZWdpbigpIGNvbnN0IHsgcmV0dXJuIGl0ZXJhdG9y
KCp0aGlzLCAwKTsgfQorICAgIGl0ZXJhdG9yIGVuZCgpIGNvbnN0IHsgcmV0dXJuIGl0ZXJhdG9y
KCp0aGlzLCBudW1CbG9ja3MoKSk7IH0KKworICAgIGNsYXNzIFZhbHVlc0NvbGxlY3Rpb24gewor
ICAgIHB1YmxpYzoKKyAgICAgICAgVmFsdWVzQ29sbGVjdGlvbihQcm9jZWR1cmUmIHByb2NlZHVy
ZSkKKyAgICAgICAgICAgIDogbV9wcm9jZWR1cmUocHJvY2VkdXJlKQorICAgICAgICB7CisgICAg
ICAgIH0KKworICAgICAgICBjbGFzcyBpdGVyYXRvciB7CisgICAgICAgIHB1YmxpYzoKKyAgICAg
ICAgICAgIGl0ZXJhdG9yKCk6CisgICAgICAgICAgICAgICAgOiBtX3Byb2NlZHVyZShudWxscHRy
KQorICAgICAgICAgICAgICAgICwgbV9pbmRleCgwKQorICAgICAgICAgICAgeworICAgICAgICAg
ICAgfQorCisgICAgICAgICAgICBpdGVyYXRvcihQcm9jZWR1cmUmIHByb2NlZHVyZSwgdW5zaWdu
ZWQgaW5kZXgpCisgICAgICAgICAgICAgICAgOiBtX3Byb2NlZHVyZSgmcHJvY2VkdXJlKQorICAg
ICAgICAgICAgICAgICwgbV9pbmRleChpbmRleCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAg
IH0KKworICAgICAgICAgICAgVmFsdWUqIG9wZXJhdG9yKigpCisgICAgICAgICAgICB7CisgICAg
ICAgICAgICAgICAgcmV0dXJuIG1fcHJvY2VkdXJlLT5ibG9jayhtX2luZGV4KTsKKyAgICAgICAg
ICAgIH0KKworICAgICAgICAgICAgaXRlcmF0b3ImIG9wZXJhdG9yKysoKQorICAgICAgICAgICAg
eworICAgICAgICAgICAgICAgIG1faW5kZXgrKzsKKyAgICAgICAgICAgICAgICByZXR1cm4gKnRo
aXM7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGJvb2wgb3BlcmF0b3I9PShjb25zdCBp
dGVyYXRvciYgb3RoZXIpIGNvbnN0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0
dXJuIG1faW5kZXggPT0gb3RoZXIubV9pbmRleDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAg
ICAgYm9vbCBvcGVyYXRvciE9KGNvbnN0IGl0ZXJhdG9yJiBvdGhlcikgY29uc3QKKyAgICAgICAg
ICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gISgqdGhpcyA9PSBvdGhlcik7CisgICAgICAg
ICAgICB9CisKKyAgICAgICAgcHJpdmF0ZToKKworICAgICAgICAgICAgUHJvY2VkdXJlKiBtX3By
b2NlZHVyZTsKKyAgICAgICAgICAgIHVuc2lnbmVkIG1faW5kZXg7CisgICAgICAgIH07CisKKyAg
ICAgICAgaXRlcmF0b3IgYmVnaW4oKSBjb25zdCB7IHJldHVybiBpdGVyYXRvcihtX3Byb2NlZHVy
ZSwgMCk7IH0KKyAgICAgICAgaXRlcmF0b3IgZW5kKCkgY29uc3QgeyByZXR1cm4gaXRlcmF0b3Io
bV9wcm9jZWR1cmUsIG1fcHJvY2VkdXJlLm1fdmFsdWVzLnNpemUoKSk7IH0KKworICAgICAgICB1
bnNpZ25lZCBzaXplKCkgY29uc3QgeyByZXR1cm4gbV9wcm9jZWR1cmUubV92YWx1ZXMuc2l6ZSgp
OyB9CisgICAgICAgIFZhbHVlKiBhdCh1bnNpZ25lZCBpbmRleCkgY29uc3QgeyByZXR1cm4gbV9w
cm9jZWR1cmUubV92YWx1ZXNbaW5kZXhdOyB9CisgICAgICAgIFZhbHVlKiBvcGVyYXRvcltdKHVu
c2lnbmVkIGluZGV4KSBjb25zdCB7IHJldHVybiBhdChpbmRleCk7IH0KKyAgICAgICAgCisgICAg
cHJpdmF0ZToKKyAgICAgICAgUHJvY2VkdXJlJiBtX3Byb2NlZHVyZTsKKyAgICB9OworCisgICAg
VmFsdWVzQ29sbGVjdGlvbiB2YWx1ZXMoKSB7IHJldHVybiBWYWx1ZXNDb2xsZWN0aW9uKCp0aGlz
KTsgfQorCitwcml2YXRlOgorICAgIFZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QmFzaWNCbG9jaz4+
IG1fYmxvY2tzOworICAgIFZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8VmFsdWU+PiBtX3ZhbHVlczsK
K307CisKK30gfSAvLyBuYW1lc3BhY2UgSlNDOjpCMworCisjZW5kaWYgLy8gQjNQcm9jZWR1cmVf
aAorCkluZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNQcm9jZWR1cmVJbmxpbmVzLmgK
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzUHJvY2VkdXJlSW5saW5l
cy5oCShyZXZpc2lvbiAwKQorKysgU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzUHJvY2VkdXJl
SW5saW5lcy5oCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsNDYgQEAKKy8qCisgKiBDb3B5cmln
aHQgKEMpIDIwMTUgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlz
dHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0
aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZv
bGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9m
IHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGlj
ZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4K
KyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUg
YWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFu
ZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFu
ZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoK
KyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFTIElTJycgQU5E
IEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5P
VCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJ
VFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1F
RC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBM
SUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICog
RVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBM
SU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNF
UzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJV
UFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFks
IFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNM
VURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0Yg
VEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NT
SUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKworI2lmbmRlZiBCM1Byb2NlZHVyZUlubGlu
ZXNfaAorI2RlZmluZSBCM1Byb2NlZHVyZUlubGluZXNfaAorCisjaW5jbHVkZSAiQjNCYXNpY0Js
b2NrLmgiCisjaW5jbHVkZSAiQjNQcm9jZWR1cmUuaCIKKworbmFtZXNwYWNlIEpTQyB7IG5hbWVz
cGFjZSBCMyB7CisKK3RlbXBsYXRlPHR5cGVuYW1lIFZhbHVlVHlwZSwgdHlwZW5hbWUuLi4gQXJn
dW1lbnRzPgorVmFsdWVUeXBlKiBQcm9jZWR1cmU6OmFkZChBcmd1ZW50cy4uLiBhcmd1bWVudHMp
Cit7CisgICAgc3RkOjp1bmlxdWVfcHRyPFZhbHVlVHlwZT4gdmFsdWUobmV3IFZhbHVlVHlwZSht
X3ZhbHVlcy5zaXplKCksIGFyZ3VtZW50cy4uLikpOworICAgIFZhbHVlVHlwZSogcmVzdWx0ID0g
dmFsdWUuZ2V0KCk7CisgICAgbV92YWx1ZXMuYXBwZW5kKFdURjo6bW92ZSh2YWx1ZSkpOworICAg
IHJldHVybiByZXN1bHQ7Cit9CisKK30gfSAvLyBuYW1lc3BhY2UgSlNDOjpCMworCisjZW5kaWYg
Ly8gQjNQcm9jZWR1cmVJbmxpbmVzX2gKKwpJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL2Iz
L0IzU3RhY2tTbG90VmFsdWUuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29y
ZS9iMy9CM1N0YWNrU2xvdFZhbHVlLmNwcAkocmV2aXNpb24gMCkKKysrIFNvdXJjZS9KYXZhU2Ny
aXB0Q29yZS9iMy9CM1N0YWNrU2xvdFZhbHVlLmNwcAkod29ya2luZyBjb3B5KQpAQCAtMCwwICsx
LDQxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE1IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyBy
ZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmlu
YXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRl
ZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAq
IDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUg
Y29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUg
Zm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZv
cm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlz
IGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQor
ICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGgg
dGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQ
UExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5U
SUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJB
TlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAq
IFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9S
CisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5D
SURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VT
IChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNU
SVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklU
UzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRI
RU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklM
SVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklT
SU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4g
SUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisKKyNp
bmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJCM1N0YWNrU2xvdFZhbHVlLmgiCisKK25hbWVz
cGFjZSBKU0MgeyBuYW1lc3BhY2UgQjMgeworCitTdGFja1Nsb3RWYWx1ZTo6flN0YWNrU2xvdFZh
bHVlKCkKK3sKK30KKwordm9pZCBTdGFja1Nsb3RWYWx1ZTo6ZHVtcE1ldGEoUHJpbnRTdHJlYW0m
IG91dCkgY29uc3QKK3sKKyAgICBvdXQucHJpbnQoImJ5dGVTaXplID0gIiwgbV9ieXRlU2l6ZSk7
Cit9CisKK30gfSAvLyBuYW1lc3BhY2UgSlNDOjpCMworCkluZGV4OiBTb3VyY2UvSmF2YVNjcmlw
dENvcmUvYjMvQjNTdGFja1Nsb3RWYWx1ZS5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2Ny
aXB0Q29yZS9iMy9CM1N0YWNrU2xvdFZhbHVlLmgJKHJldmlzaW9uIDApCisrKyBTb3VyY2UvSmF2
YVNjcmlwdENvcmUvYjMvQjNTdGFja1Nsb3RWYWx1ZS5oCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAg
KzEsNjUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTUgQXBwbGUgSW5jLiBBbGwgcmlnaHRz
IHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBi
aW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0
dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0Ogor
ICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92
ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRo
ZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkg
Zm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRo
aXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhl
CisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0
aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkg
QVBQTEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJB
TlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FS
UkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgor
ICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4g
T1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJ
TkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFH
RVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VC
U1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9G
SVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkg
VEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFC
SUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFS
SVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZF
TiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKwor
I2lmbmRlZiBCM1N0YWNrU2xvdFZhbHVlX2gKKyNkZWZpbmUgQjNTdGFja1Nsb3RWYWx1ZV9oCisK
KyNpbmNsdWRlICJCM1ZhbHVlLmgiCisKK25hbWVzcGFjZSBKU0MgeyBuYW1lc3BhY2UgQjMgewor
CitjbGFzcyBTdGFja1Nsb3RWYWx1ZSA6IHB1YmxpYyBWYWx1ZSB7CitwdWJsaWM6CisgICAgc3Rh
dGljIGJvb2wgYWNjZXB0cyhPcGNvZGUgb3Bjb2RlKSB7IHJldHVybiBvcGNvZGUgPT0gU3RhY2tT
bG90OyB9CisKKyAgICB+U3RhY2tTbG90VmFsdWUoKTsKKworICAgIHVuc2lnbmVkIGJ5dGVTaXpl
KCkgY29uc3QgeyByZXR1cm4gbV9ieXRlU2l6ZTsgfQorCisgICAgLy8gVGhpcyBnZXRzIGFzc2ln
bmVkIGF0IHRoZSBlbmQgb2YgY29tcGlsYXRpb24uIFlvdSBjYW5ub3QgcmVseSBvbiBpdCBoYXZp
bmcgYSBtZWFuaW5nZnVsCisgICAgLy8gdmFsdWUgd2hpbGUgdGhlIGNvbXBpbGVyIGlzIHJ1bm5p
bmcuCisgICAgaW50cHRyX3Qgb2Zmc2V0RnJvbUZQKCkgY29uc3QgeyByZXR1cm4gbV9vZmZzZXRG
cm9tRlA7IH0KKworcHJvdGVjdGVkOgorICAgIHZvaWQgZHVtcE1ldGEoUHJpbnRTdHJlYW0mKSBj
b25zdCBvdmVycmlkZTsKKworcHJpdmF0ZToKKyAgICBmcmllbmQgY2xhc3MgUHJvY2VkdXJlOwor
CisgICAgU3RhY2tTbG90VmFsdWUodW5zaWduZWQgaW5kZXgsIE9yaWdpbiBvcmlnaW4sIHVuc2ln
bmVkIGJ5dGVTaXplKQorICAgICAgICA6IFZhbHVlKGluZGV4LCBTdGFja1Nsb3QsIHBvaW50ZXIo
KSwgb3JpZ2luKQorICAgICAgICAsIG1fYnl0ZVNpemUoYnl0ZVNpemUpCisgICAgICAgICwgbV9v
ZmZzZXRGcm9tRlAoMCkKKyAgICB7CisgICAgfQorCisgICAgdW5zaWduZWQgbV9ieXRlU2l6ZTsK
KyAgICBpbnRwdHJfdCBtX29mZnNldEZyb21GUDsKK307CisKK30gfSAvLyBuYW1lc3BhY2UgSlND
OjpCMworCisjZW5kaWYgLy8gQjNTdGFja1Nsb3RWYWx1ZV9oCisKSW5kZXg6IFNvdXJjZS9KYXZh
U2NyaXB0Q29yZS9iMy9CM1N0YWNrbWFwLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNj
cmlwdENvcmUvYjMvQjNTdGFja21hcC5jcHAJKHJldmlzaW9uIDApCisrKyBTb3VyY2UvSmF2YVNj
cmlwdENvcmUvYjMvQjNTdGFja21hcC5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSw0MCBA
QAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNSBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2
ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBm
b3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJv
dmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBS
ZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHly
aWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxv
d2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11
c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0
IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAg
IGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBk
aXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJ
TkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywg
SU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVT
IE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQ
T1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUgorICog
Q09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5U
QUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5D
TFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRF
IEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9S
IEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkK
KyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwg
T1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJ
TiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFE
VklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLiAKKyAqLworCisjaW5jbHVk
ZSAiY29uZmlnLmgiCisjaW5jbHVkZSAiQjNTdGFja21hcC5oIgorCituYW1lc3BhY2UgSlNDIHsg
bmFtZXNwYWNlIEIzIHsKKwordm9pZCBTdGFja21hcDo6ZHVtcChQcmludFN0cmVhbSYgb3V0KSBj
b25zdAoreworICAgIG91dC5wcmludCgKKyAgICAgICAgIntvcGFxdWUgPSAiLCBSYXdQb2ludGVy
KG1fb3BhcXVlKSwgIiwgcmVwcyA9ICIsIGxpc3REdW1wKG1fcmVwcyksCisgICAgICAgICIsIGdl
bmVyYXRvciA9ICIsIFJhd1BvaW50ZXIobV9nZW5lcmF0b3IuZ2V0KCkpLCAiLCBjbG9iYmVyZWQg
PSAiLCBtX2Nsb2JiZXJlZCwKKyAgICAgICAgIiwgdXNlZFJlZ2lzdGVycyA9ICIsIG1fdXNlZFJl
Z2lzdGVycywgIn0iKTsKK30KKworfSB9IC8vIG5hbWVzcGFjZSBKU0M6OkIzCisKSW5kZXg6IFNv
dXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM1N0YWNrbWFwLmgKPT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNl
L0phdmFTY3JpcHRDb3JlL2IzL0IzU3RhY2ttYXAuaAkocmV2aXNpb24gMCkKKysrIFNvdXJjZS9K
YXZhU2NyaXB0Q29yZS9iMy9CM1N0YWNrbWFwLmgJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSwx
MjIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTUgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJl
c2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5h
cnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVk
IHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICog
MS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBj
b3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBm
b2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9y
bSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMg
bGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisg
KiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0
aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQ
TEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJ
RVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFO
VElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICog
UFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IK
KyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJ
REVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMg
KElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJ
VFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRT
OyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhF
T1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJ
VFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJ
TkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJ
RiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKworI2lm
bmRlZiBCM1N0YWNrbWFwX2gKKyNkZWZpbmUgQjNTdGFja21hcF9oCisKKyNpbmNsdWRlICJCM1Zh
bHVlUmVwLmgiCisjaW5jbHVkZSAiQ0NhbGxIZWxwZXJzLmgiCisjaW5jbHVkZSAiUmVnaXN0ZXJT
ZXQuaCIKKyNpbmNsdWRlIDx3dGYvU2hhcmVkVGFzay5oPgorCituYW1lc3BhY2UgSlNDIHsgbmFt
ZXNwYWNlIEIzIHsKKworY2xhc3MgQjNWYWx1ZTsKKworY2xhc3MgU3RhY2ttYXAgeworcHVibGlj
OgorICAgIHN0cnVjdCBHZW5lcmF0aW9uUGFyYW1zIHsKKyAgICAgICAgLy8gVGhpcyBpcyB0aGUg
VmFsdWUgY29udGFpbmluZyB0aGUgc3RhY2ttYXAuCisgICAgICAgIFZhbHVlKiB2YWx1ZTsKKwor
ICAgICAgICAvLyBUaGlzIGlzIHRoZSBzdGFja21hcC4KKyAgICAgICAgU3RhY2ttYXAqIHN0YWNr
bWFwOworCisgICAgICAgIC8vIFRoaXMgaXMgdGhlIGp1bXAgdG8gdGhlIHNsb3cgcGF0aCwgaWYg
dGhpcyBpcyBhIHN0YWNrbWFwIGZvciBhIENoZWNrIHZhbHVlLgorICAgICAgICBDQ2FsbEhlbHBl
cnM6Okp1bXAganVtcDsKKyAgICB9OworICAgIAorICAgIHR5cGVkZWYgdm9pZCBHZW5lcmF0b3JG
dW5jdGlvbihDQ2FsbEhlbHBlcnMmLCBjb25zdCBHZW5lcmF0aW9uUGFyYW1zJik7CisgICAgdHlw
ZWRlZiBTaGFyZWRUYXNrPEdlbmVyYXRvckZ1bmN0aW9uPiBHZW5lcmF0b3I7CisgICAgCisgICAg
U3RhY2ttYXAoKQorICAgIHsKKyAgICB9CisKKyAgICAvLyBTZXQgc29tZSBvcGFxdWUgZGF0YSB0
byBpZGVudGlmeSB0aGlzIHN0YWNrbWFwLiBUaGlzIGlzIHVzZWZ1bCBiZWNhdXNlIGEgU3RhY2tt
YXAtdXNpbmcgVmFsdWUKKyAgICAvLyBjYW4gYmUgZHVwbGljYXRlZCwgYW5kIGVhY2ggZHVwbGlj
YXRlIG1heSBlbmQgdXAgaGF2aW5nIGRpZmZlcmVudCByZWdpc3RlciBhbGxvY2F0aW9uLiBUaGlz
CisgICAgLy8gYWxsb3dzIGFsbCBvZiB0aG9zZSBkdXBsaWNhdGVzIHRvIGJlIGFibGUgdG8gcmVm
ZXIgYmFjayB0byB3aGF0ZXZlciBoaWdoLWxldmVsIGRhdGEgc3RydWN0dXJlcworICAgIC8vIHdl
IHdlcmUgdXNpbmcgdG8gY3JlYXRlIHRoZSB2YWx1ZS4KKyAgICB2b2lkIHNldE9wYXF1ZSh2b2lk
KiBwYXJhbWV0ZXIpCisgICAgeworICAgICAgICBtX29wYXF1ZSA9IHBhcmFtZXRlcjsKKyAgICB9
CisgICAgdm9pZCogb3BhcXVlKCkgY29uc3QgeyByZXR1cm4gbV9vcGFxdWU7IH0KKworICAgIC8v
IENvbnZlbmllbmNlIGhlbHBlcnMgd2hlbiB1c2luZyBpbmRpY2VzIGluc3RlYWQgb2YgcG9pbnRl
cnMuCisgICAgdm9pZCBzZXRPcGFxdWVJbmRleChzaXplX3QgaW5kZXgpCisgICAgeworICAgICAg
ICBzZXRPcGFxdWUoYml0d2lzZV9jYXN0PHZvaWQqPihpbmRleCkpOworICAgIH0KKyAgICBzaXpl
X3Qgb3BhcXVlSW5kZXgoKSBjb25zdCB7IHJldHVybiBiaXR3aXNlX2Nhc3Q8c2l6ZV90PihvcGFx
dWUoKSk7IH0KKworICAgIC8vIENvbnN0cmFpbiBhbiBhcmd1bWVudCB0byB0aGUgVmFsdWUgdGhh
dCB1c2VzIHRoaXMgU3RhY2ttYXAuIE5vdGUgdGhhdCBpbmRleCB6ZXJvIHJlZmVycyB0byB0aGUK
KyAgICAvLyBmaXJzdCBhcmd1bWVudCB0byB0aGF0IFZhbHVlLCBldmVuIGlmIHRoYXQgYXJndW1l
bnQgaXMgbm90IGNvbnN0cmFpbmFibGUuIEZvciBleGFtcGxlLCBpbiBhCisgICAgLy8gQ2hlY2tB
ZGQgdmFsdWUsIGl0IHdvdWxkIGJlIGFuIGVycm9yIHRvIGNvbnN0cmFpbiBpbmRpY2VzIDAgYW5k
IDEuIEluIGEgQ2hlY2sgdmFsdWUsIGl0IHdvdWxkCisgICAgLy8gYmUgYW4gZXJyb3IgdG8gY29u
c3RyYWluIGluZGV4IDAuIEJ1dCwgd2hlbiB0aGUgZ2VuZXJhdGlvbiBjYWxsYmFjayBpcyBjYWxs
ZWQsIHlvdSBjYW4gZGVwZW5kCisgICAgLy8gb24gdGhlIHJlcHMgZm9yIHRob3NlIGluZGljZXMg
YmVpbmcgZmlsbGVkIGluLgorICAgIHZvaWQgY29uc3RyYWluKHVuc2lnbmVkIGluZGV4LCBjb25z
dCBWYWx1ZVJlcCYgcmVwKQorICAgIHsKKyAgICAgICAgaWYgKGluZGV4ICsgMSA8IG1fcmVwcy5z
aXplKCkpCisgICAgICAgICAgICBtX3JlcHMuZ3JvdyhpbmRleCArIDEpOworICAgICAgICBtX3Jl
cHNbaW5kZXhdID0gcmVwOworICAgIH0KKworICAgIHZvaWQgY2xvYmJlcihjb25zdCBSZWdpc3Rl
clNldCYgc2V0KQorICAgIHsKKyAgICAgICAgbV9jbG9iYmVyZWQubWVyZ2Uoc2V0KTsKKyAgICB9
CisKKyAgICBjb25zdCBSZWdpc3RlclNldCYgY2xvYmJlcmVkKCkgY29uc3QgeyByZXR1cm4gbV9j
bG9iYmVyZWQ7IH0KKworICAgIHZvaWQgc2V0R2VuZXJhdG9yKFJlZlB0cjxHZW5lcmF0b3I+IGdl
bmVyYXRvcikKKyAgICB7CisgICAgICAgIG1fZ2VuZXJhdG9yID0gZ2VuZXJhdG9yOworICAgIH0K
KworICAgIHRlbXBsYXRlPHR5cGVuYW1lIEZ1bmN0b3I+CisgICAgdm9pZCBzZXRHZW5lcmF0b3Io
Y29uc3QgRnVuY3RvciYgZnVuY3RvcikKKyAgICB7CisgICAgICAgIG1fZ2VuZXJhdG9yID0gY3Jl
YXRlU2hhcmVkVGFzazxHZW5lcmF0b3JGdW5jdGlvbj4oZnVuY3Rvcik7CisgICAgfQorCisgICAg
Ly8gVGhlc2Ugd2lsbCByZXR1cm4gaW50ZXJlc3RpbmcgdGhpbmdzIGluc2lkZSB0aGUgZ2VuZXJh
dG9yIGNhbGxiYWNrLCBvciBhZnRlciBjb21waWxhdGlvbi4KKyAgICBjb25zdCBWZWN0b3I8VmFs
dWVSZXA+JiByZXBzKCkgY29uc3QgeyByZXR1cm4gbV9yZXBzOyB9CisgICAgY29uc3QgUmVnaXN0
ZXJTZXQmIHVzZWRSZWdpc3RlcnMoKSBjb25zdCB7IHJldHVybiBtX3VzZWRSZWdpc3RlcnM7IH0K
KworICAgIHZvaWQgZHVtcChQcmludFN0cmVhbSYpIGNvbnN0OworICAgIAorcHJpdmF0ZToKKyAg
ICB2b2lkKiBtX29wYXF1ZSB7IG51bGxwdHIgfTsKKyAgICBWZWN0b3I8VmFsdWVSZXA+IG1fcmVw
czsKKyAgICBSZWZQdHI8R2VuZXJhdG9yPiBtX2dlbmVyYXRvcjsKKyAgICBSZWdpc3RlclNldCBt
X2Nsb2JiZXJlZDsKKyAgICBSZWdpc3RlclNldCBtX3VzZWRSZWdpc3RlcnM7Cit9OworCit9IH0g
Ly8gbmFtZXNwYWNlIEpTQzo6QjMKKworI2VuZGlmIC8vIEIzU3RhY2ttYXBfaAorCkluZGV4OiBT
b3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNTd2l0Y2hDYXNlLmNwcAo9PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBT
b3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNTd2l0Y2hDYXNlLmNwcAkocmV2aXNpb24gMCkKKysr
IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM1N3aXRjaENhc2UuY3BwCSh3b3JraW5nIGNvcHkp
CkBAIC0wLDAgKzEsMzkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTUgQXBwbGUgSW5jLiBB
bGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291
cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBh
cmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBh
cmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWlu
IHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlv
bnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBp
biBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBu
b3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWlt
ZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJv
dmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJP
VklERUQgQlkgQVBQTEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBM
SUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElN
UExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFS
VElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQ
UExFIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElO
RElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5U
SUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1F
TlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9S
CisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFO
RCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNU
UklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhF
UldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZU
V0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4g
CisgKi8KKworI2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgIkIzU3dpdGNoQ2FzZS5oIgor
CisjaW5jbHVkZSAiQjNCYXNpY0Jsb2NrLmgiCisKK25hbWVzcGFjZSBKU0MgeyBuYW1lc3BhY2Ug
QjMgeworCit2b2lkIFN3aXRjaENhc2U6OmR1bXAoUHJpbnRTdHJlYW0mIG91dCkgY29uc3QKK3sK
KyAgICBvdXQucHJpbnQobV9jYXNlVmFsdWUsICItPiIsIHBvaW50ZXJEdW1wKG1fdGFyZ2V0KSk7
Cit9CisKK30gfSAvLyBuYW1lc3BhY2UgSlNDOjpCMworCkluZGV4OiBTb3VyY2UvSmF2YVNjcmlw
dENvcmUvYjMvQjNTd2l0Y2hDYXNlLmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRD
b3JlL2IzL0IzU3dpdGNoQ2FzZS5oCShyZXZpc2lvbiAwKQorKysgU291cmNlL0phdmFTY3JpcHRD
b3JlL2IzL0IzU3dpdGNoQ2FzZS5oCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsNjMgQEAKKy8q
CisgKiBDb3B5cmlnaHQgKEMpIDIwMTUgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgor
ICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMs
IHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVk
IHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0
cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQK
KyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcg
ZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJl
cHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBj
b25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1
bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJp
YnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBg
YEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xV
RElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBN
RVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBB
UkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IKKyAqIENPTlRS
SUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBT
UEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElO
RywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09E
UyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJ
TkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBP
RiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRP
UlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5Z
IFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VE
IE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKworI2lmbmRlZiBCM1N3
aXRjaENhc2VfaAorI2RlZmluZSBCM1N3aXRjaENhc2VfaAorCisjaW5jbHVkZSA8d3RmL1N0ZExp
YkV4dHJhcy5oPgorI2luY2x1ZGUgPHd0Zi9QcmludFN0cmVhbS5oPgorCituYW1lc3BhY2UgSlND
IHsgbmFtZXNwYWNlIEIzIHsKKworY2xhc3MgQmFzaWNCbG9jazsKKworY2xhc3MgU3dpdGNoQ2Fz
ZSB7CitwdWJsaWM6CisgICAgU3dpdGNoQ2FzZSgpCisgICAgeworICAgIH0KKworICAgIFN3aXRj
aENhc2UoaW50NjRfdCBjYXNlVmFsdWUsIEJhc2ljQmxvY2sqIHRhcmdldCkKKyAgICAgICAgOiBt
X2Nhc2VWYWx1ZShjYXNlVmFsdWUpCisgICAgICAgICwgbV90YXJnZXQodGFyZ2V0KQorICAgIHsK
KyAgICB9CisKKyAgICBleHBsaWNpdCBvcGVyYXRvciBib29sKCkgY29uc3QgeyByZXR1cm4gISFt
X3RhcmdldDsgfQorCisgICAgaW50NjRfdCBjYXNlVmFsdWUoKSBjb25zdCB7IHJldHVybiBtX2Nh
c2VWYWx1ZTsgfQorICAgIEJhc2ljQmxvY2sqIHRhcmdldCgpIGNvbnN0IHsgcmV0dXJuIG1fdGFy
Z2V0OyB9CisKKyAgICB2b2lkIGR1bXAoUHJpbnRTdHJlYW0mIG91dCkgY29uc3Q7CisKK3ByaXZh
dGU6CisgICAgaW50NjRfdCBjYXNlVmFsdWU7CisgICAgQmFzaWNCbG9jayogdGFyZ2V0OworfTsK
KworfSB9IC8vIG5hbWVzcGFjZSBKU0M6OkIzCisKKyNlbmRpZiAvLyBCM1N3aXRjaENhc2VfaAor
CkluZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNTd2l0Y2hWYWx1ZS5jcHAKPT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzU3dpdGNoVmFsdWUuY3BwCShyZXZp
c2lvbiAwKQorKysgU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzU3dpdGNoVmFsdWUuY3BwCSh3
b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsNjMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTUg
QXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFu
ZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9k
aWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25k
aXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2Rl
IG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0
IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlz
dHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJp
Z2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93
aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBt
YXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09G
VFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQ
UkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRP
LCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5F
U1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVW
RU5UIFNIQUxMIEFQUExFIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFO
WSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBP
UiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAor
ICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBV
U0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VW
RVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4g
Q09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElH
RU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICog
T0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBT
VUNIIERBTUFHRS4gCisgKi8KKworI2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2xkdWUgIkIzU3dp
dGNoVmFsdWUuaCIKKworbmFtZXNwYWNlIEpTQyB7IG5hbWVzcGFjZSBCMyB7CisKK1N3aXRjaFZh
bHVlOjp+U3dpdGNoVmFsdWUoKQoreworfQorCitTd2l0Y2hDYXNlIFN3aXRjaFZhbHVlOjpyZW1v
dmVDYXNlKHVuc2lnbmVkIGluZGV4KQoreworICAgIFN3aXRjaENhc2UgcmVzdWx0ID0gbV9zdWNj
ZXNzb3JzW2luZGV4XTsKKyAgICBtX3N1Y2Nlc3NvcnNbaW5kZXhdID0gbV9zdWNjZXNzb3JzLmxh
c3QoKTsKKyAgICBtX3N1Y2Nlc3NvcnMucmVtb3ZlTGFzdCgpOworICAgIHJldHVybiByZXN1bHQ7
Cit9CisKK3ZvaWQgU3dpdGNoVmFsdWU6OmFwcGVuZENhc2UoY29uc3QgU3dpdGNoQ2FzZSYgc3dp
dGNoQ2FzZSkKK3sKKyAgICBtX3N1Y2Nlc3NvcnMuYXBwZW5kKG1fc3VjY2Vzc29ycy5sYXN0KCkp
OworICAgIG1fc3VjY2Vzc29yc1ttX3N1Y2Nlc3NvcnMuc2l6ZSgpIC0gMl0gPSBzd2l0Y2hDYXNl
LnRhcmdldCgpOworICAgIG1fdmFsdWVzLmFwcGVuZChzd2l0Y2hDYXNlLmNhc2VWYWx1ZSgpKTsK
K30KKwordm9pZCBTd2l0Y2hWYWx1ZTo6ZHVtcE1ldGEoUHJpbnRTdHJlYW0mIG91dCkgY29uc3QK
K3sKKyAgICAvLyBUaGlzIGRlc3RydWN0aXZlbHkgb3ZlcnJpZGVzIENvbnRyb2xWYWx1ZSdzIGR1
bXBNZXRhKCkuCisgICAgb3V0LnByaW50KGxpc3REdW1wKCp0aGlzKSk7Cit9CisKK1N3aXRjaFZh
bHVlOjpTd2l0Y2hWYWx1ZSh1bnNpZ25lZCBpbmRleCwgT3JpZ2luIG9yaWdpbiwgQmFzaWNCbG9j
ayogZmFsbFRocm91Z2gpCisgICAgOiBDb250cm9sVmFsdWUoaW5kZXgsIFN3aXRjaCwgb3JpZ2lu
KQoreworICAgIG1fc3VjY2Vzc29ycy5hcHBlbmQoZmFsbFRocm91Z2gpOworfQorCit9IH0gLy8g
bmFtZXNwYWNlIEpTQzo6QjMKKwpJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzU3dp
dGNoVmFsdWUuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNTd2l0
Y2hWYWx1ZS5oCShyZXZpc2lvbiAwKQorKysgU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzU3dp
dGNoVmFsdWUuaAkod29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDEyMyBAQAorLyoKKyAqIENvcHly
aWdodCAoQykgMjAxNSBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVk
aXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3
aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUg
Zm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMg
b2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90
aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVy
LgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRo
ZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMg
YW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24g
YW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisg
KgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIGBgQVMgSVMnJyBB
TkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQg
Tk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJ
TElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJ
TUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJF
IExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisg
KiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9U
IExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJ
Q0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVS
UlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElU
WSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElO
Q0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBP
RiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBP
U1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLiAKKyAqLworCisjaWZuZGVmIEIzU3dpdGNoVmFsdWVf
aAorI2RlZmluZSBCM1N3aXRjaFZhbHVlX2gKKworI2luY2x1ZGUgIkIzQ29udHJvbFZhbHVlLmgi
CisjaW5jbHVkZSAiQjNTd2l0Y2hDYXNlLmgiCisKK25hbWVzcGFjZSBKU0MgeyBuYW1lc3BhY2Ug
QjMgeworCitjbGFzcyBTd2l0Y2hWYWx1ZSA6IHB1YmxpYyBDb250cm9sVmFsdWUgeworcHVibGlj
OgorICAgIHN0YXRpYyBib29sIGFjY2VwdHMoT3Bjb2RlIG9wY29kZSkgeyByZXR1cm4gb3Bjb2Rl
ID09IFN3aXRjaDsgfQorCisgICAgflN3aXRjaFZhbHVlKCk7CisKKyAgICAvLyBudW1DYXNlVmFs
dWVzKCkgKyAxID09IG51bVN1Y2Nlc3NvcnMoKS4KKyAgICB1bnNpZ25lZCBudW1DYXNlVmFsdWVz
KCkgY29uc3QgeyByZXR1cm4gbV92YWx1ZXMuc2l6ZSgpOyB9CisKKyAgICAvLyBUaGUgc3VjY2Vz
c29yIGZvciB0aGlzIGNhc2UgdmFsdWUgaXMgYXQgdGhlIHNhbWUgaW5kZXguCisgICAgaW50NjRf
dCBjYXNlVmFsdWUodW5zaWduZWQgaW5kZXgpIGNvbnN0IHsgcmV0dXJuIG1fdmFsdWVzW2ldOyB9
CisgICAgCisgICAgY29uc3QgVmVjdG9yPGludDY0X3Q+JiBjYXNlVmFsdWVzKCkgY29uc3QgeyBy
ZXR1cm4gbV92YWx1ZXM7IH0KKworICAgIEJhc2ljQmxvY2sqIGZhbGxUaHJvdWdoKCkgY29uc3Qg
eyByZXR1cm4gc3VjY2Vzc29ycygpLmxhc3QoKTsgfQorICAgIEJhc2ljQmxvY2sqJiBmYWxsVGhy
b3VnaCgpIHsgcmV0dXJuIHN1Y2Nlc3NvcnMoKS5sYXN0KCk7IH0KKworICAgIHVuc2lnbmVkIHNp
emUoKSBjb25zdCB7IHJldHVybiBudW1DYXNlVmFsdWVzKCk7IH0KKyAgICBTd2l0Y2hDYXNlIGF0
KHVuc2lnbmVkIGluZGV4KSBjb25zdAorICAgIHsKKyAgICAgICAgcmV0dXJuIFN3aXRjaENhc2Uo
Y2FzZVZhbHVlKGluZGV4KSwgc3VjY2Vzc29yKGluZGV4KSk7CisgICAgfQorICAgIFN3aXRjaENh
c2Ugb3BlcmF0b3JbXSh1bnNpZ25lZCBpbmRleCkgY29uc3QKKyAgICB7CisgICAgICAgIHJldHVy
biBhdChpbmRleCk7CisgICAgfQorCisgICAgY2xhc3MgaXRlcmF0b3IgeworICAgIHB1YmxpYzoK
KyAgICAgICAgaXRlcmF0b3IoKQorICAgICAgICAgICAgOiBtX3N3aXRjaChudWxscHRyKQorICAg
ICAgICAgICAgLCBtX2luZGV4KDApCisgICAgICAgIHsKKyAgICAgICAgfQorCisgICAgICAgIGl0
ZXJhdG9yKFN3aXRjaFZhbHVlJiBzd2l0Y2hWYWx1ZSwgdW5zaWduZWQgaW5kZXgpCisgICAgICAg
ICAgICA6IG1fc3dpdGNoKCZzd2l0Y2hWYWx1ZSkKKyAgICAgICAgICAgICwgbV9pbmRleChpbmRl
eCkKKyAgICAgICAgeworICAgICAgICB9CisKKyAgICAgICAgU3dpdGNoQ2FzZSBvcGVyYXRvcioo
KQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gbV9zd2l0Y2gtPmF0KG1faW5kZXgpOwor
ICAgICAgICB9CisKKyAgICAgICAgaXRlcmF0b3ImIG9wZXJhdG9yKysoKQorICAgICAgICB7Cisg
ICAgICAgICAgICBtX2luZGV4Kys7CisgICAgICAgICAgICByZXR1cm4gKnRoaXM7CisgICAgICAg
IH0KKworICAgICAgICBib29sIG9wZXJhdG9yPT0oY29uc3QgaXRlcmF0b3ImIG90aGVyKSBjb25z
dAorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gbV9pbmRleCA9PSBvdGhlci5tX2luZGV4
OworICAgICAgICB9CisKKyAgICAgICAgYm9vbCBvcGVyYXRvciE9KGNvbnN0IGl0ZXJhdG9yJiBv
dGhlcikgY29uc3QKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuICEoKnRoaXMgPT0gb3Ro
ZXIpOworICAgICAgICB9CisKKyAgICBwcml2YXRlOgorICAgICAgICBTd2l0Y2hWYWx1ZSogbV9z
d2l0Y2g7CisgICAgICAgIHVuc2lnbmVkIG1faW5kZXg7CisgICAgfTsKKworICAgIGl0ZXJhdG9y
IGJlZ2luKCkgY29uc3QgeyByZXR1cm4gaXRlcmF0b3IoKnRoaXMsIDApOyB9CisgICAgaXRlcmF0
b3IgZW5kKCkgY29uc3QgeyByZXR1cm4gaXRlcmF0b3IoKnRoaXMsIHNpemUoKSk7IH0KKworICAg
IC8vIFRoaXMgcmVtb3ZlcyB0aGUgY2FzZSBhbmQgcmVvcmRlcnMgdGhpbmdzIGEgYml0LiBJZiB5
b3UncmUgaXRlcmF0aW5nIHRoZSBjYXNlcyBmcm9tIDAgdG8gTiwKKyAgICAvLyB0aGVuIHlvdSBj
YW4ga2VlcCBpdGVyYXRpbmcgYWZ0ZXIgdGhpcyBzbyBsb25nIGFzIHlvdSByZXZpc2l0IHRoaXMg
c2FtZSBpbmRleCAod2hpY2ggd2lsbCBub3cKKyAgICAvLyBjb250YWluIHNvbWUgb3RoZXIgY2Fz
ZSB2YWx1ZSkuIFRoaXMgcmVtb3ZlcyB0aGUgY2FzZSB0aGF0IHdhcyByZW1vdmVkLgorICAgIFN3
aXRjaENhc2UgcmVtb3ZlQ2FzZSh1bnNpZ25lZCBpbmRleCk7CisKKyAgICB2b2lkIGFwcGVuZENh
c2UoY29uc3QgU3dpdGNoQ2FzZSYgc3dpdGNoQ2FzZSk7CisKK3Byb3RlY3RlZDoKKyAgICB2b2lk
IGR1bXBNZXRhKFByaW50U3RyZWFtJikgY29uc3Qgb3ZlcnJpZGU7CisKK3ByaXZhdGU6CisgICAg
ZnJpZW5kIGNsYXNzIFByb2NlZHVyZTsKKworICAgIFN3aXRjaFZhbHVlKHVuc2lnbmVkIGluZGV4
LCBPcmlnaW4gb3JpZ2luLCBCYXNpY0Jsb2NrKiBmYWxsVGhyb3VnaCk7Cit9OworCit9IH0gLy8g
bmFtZXNwYWNlIEpTQzo6QjMKKworI2VuZGlmIC8vIEIzU3dpdGNoVmFsdWVfaAorCkluZGV4OiBT
b3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNUeXBlLmNwcAo9PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2Uv
SmF2YVNjcmlwdENvcmUvYjMvQjNUeXBlLmNwcAkocmV2aXNpb24gMCkKKysrIFNvdXJjZS9KYXZh
U2NyaXB0Q29yZS9iMy9CM1R5cGUuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsNTQgQEAK
Ky8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTUgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVk
LgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9y
bXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3Zp
ZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVk
aXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmln
aHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dp
bmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0
IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBv
ZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBk
b2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlz
dHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5D
LiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElO
Q0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBP
RiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9T
RSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IKKyAqIENP
TlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFM
LCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xV
RElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBH
T09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBC
VVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisg
KiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9S
IFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4g
QU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJ
U0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKworI2luY2x1ZGUg
ImNvbmZpZy5oIgorI2luY2x1ZGUgIkIzVHlwZS5oIgorCisjaW5jbHVkZSA8d3RmL1ByaW50U3Ry
ZWFtLmg+CisKK25hbWVzcGFjZSBXVEYgeworCit1c2luZyBuYW1lc3BhY2UgSlNDOjpCMzsKKwor
dm9pZCBwcmludEludGVybmFsKFByaW50U3RyZWFtJiBvdXQsIFR5cGUgdHlwZSkKK3sKKyAgICBz
d2l0Y2ggKHR5cGUpIHsKKyAgICBjYXNlIFZvaWQ6CisgICAgICAgIG91dC5wcmludCgiVm9pZCIp
OworICAgICAgICByZXR1cm47CisgICAgY2FzZSBJbnQzMjoKKyAgICAgICAgb3V0LnByaW50KCJJ
bnQzMiIpOworICAgICAgICByZXR1cm47CisgICAgY2FzZSBJbnQ2NDoKKyAgICAgICAgb3V0LnBy
aW50KCJJbnQ2NCIpOworICAgICAgICByZXR1cm47CisgICAgY2FzZSBEb3VibGU6CisgICAgICAg
IG91dC5wcmludCgiRG91YmxlIik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgUkVMRUFT
RV9BU1NFUlRfTk9UX1JFQUNIRUQoKTsKK30KKworfSAvLyBuYW1lc3BhY2UgV1RGCkluZGV4OiBT
b3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNUeXBlLmgKPT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL0ph
dmFTY3JpcHRDb3JlL2IzL0IzVHlwZS5oCShyZXZpc2lvbiAwKQorKysgU291cmNlL0phdmFTY3Jp
cHRDb3JlL2IzL0IzVHlwZS5oCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsNjggQEAKKy8qCisg
KiBDb3B5cmlnaHQgKEMpIDIwMTUgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoK
KyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdp
dGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRo
YXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmli
dXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAq
ICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlz
Y2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJv
ZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25k
aXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVu
dGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0
aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFT
IElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElO
RywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJD
SEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUg
RElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IKKyAqIENPTlRSSUJV
VE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVD
SUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywg
QlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBP
UiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVT
UyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBM
SUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQK
KyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdB
WSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9G
IFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKworI2lmbmRlZiBCM1R5cGVf
aAorI2RlZmluZSBCM1R5cGVfaAorCisjaW5jbHVkZSA8d3RmL1N0ZExpYkV4dHJhcy5oPgorCitu
YW1lc3BhY2UgSlNDIHsgbmFtZXNwYWNlIEIzIHsKKworZW51bSBUeXBlIHsKKyAgICBWb2lkLAor
ICAgIEludDMyLAorICAgIEludDY0LAorICAgIERvdWJsZQorfTsKKworaW5saW5lIGJvb2wgaXNJ
bnQoVHlwZSB0eXBlKQoreworICAgIHJldHVybiB0eXBlID09IEludDMyIHx8IHR5cGUgPT0gSW50
NjQ7Cit9CisKK2lubGluZSBib29sIGlzRmxvYXQoVHlwZSB0eXBlKQoreworICAgIHJldHVybiB0
eXBlID09IERvdWJsZTsKK30KKworaW5saW5lIFR5cGUgcG9pbnRlcigpIGNvbnN0Cit7CisgICAg
aWYgKHNpemVvZih2b2lkKikgPT0gNCkKKyAgICAgICAgcmV0dXJuIEludDMyOworICAgIHJldHVy
biBJbnQ2NDsKK30KKworfSB9IC8vIG5hbWVzcGFjZSBKU0M6OkIzCisKK25hbWVzcGFjZSBXVEYg
eworCitjbGFzcyBQcmludFN0cmVhbTsKKwordm9pZCBwcmludEludGVybmFsKFByaW50U3RyZWFt
JiwgSlNDOjpCMzo6VHlwZSk7CisKK30gLy8gbmFtZXNwYWNlIFdURgorCisjZW5kaWYgLy8gQjNU
eXBlX2gKKwpJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzVXBzaWxvblZhbHVlLmNw
cAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNVcHNpbG9uVmFsdWUu
Y3BwCShyZXZpc2lvbiAwKQorKysgU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzVXBzaWxvblZh
bHVlLmNwcAkod29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDQxIEBACisvKgorICogQ29weXJpZ2h0
IChDKSAyMDE1IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3Ry
aWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhv
dXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xs
b3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBz
b3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2Us
IHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisg
KiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFi
b3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQg
dGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQv
b3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisg
KiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBB
TlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1Qg
TElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZ
IEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQu
ICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElB
QkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVY
RU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElN
SVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7
IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBU
SU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBX
SEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVE
SU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRI
RSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lC
SUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisKKyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNs
dWRlICJCM1Vwc2lsb25WYWx1ZS5oIgorCituYW1lc3BhY2UgSlNDIHsgbmFtZXNwYWNlIEIzIHsK
KworVXBzaWxvblZhbHVlOjp+VXBzaWxvblZhbHVlKCkKK3sKK30KKwordm9pZCBVcHNpbG9uVmFs
dWU6OmR1bXBNZXRhKFByaW50U3RyZWFtJiBvdXQpIGNvbnN0Cit7CisgICAgb3V0LnByaW50KCJe
IiwgbV9waGktPmluZGV4KCkpOworfQorCit9IH0gLy8gbmFtZXNwYWNlIEpTQzo6QjMKKwpJbmRl
eDogU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzVXBzaWxvblZhbHVlLmgKPT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQot
LS0gU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzVXBzaWxvblZhbHVlLmgJKHJldmlzaW9uIDAp
CisrKyBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNVcHNpbG9uVmFsdWUuaAkod29ya2luZyBj
b3B5KQpAQCAtMCwwICsxLDYwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE1IEFwcGxlIElu
Yy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGlu
IHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlv
biwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwor
ICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJl
dGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25k
aXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlv
bnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICog
ICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNj
bGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxz
IHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElT
IFBST1ZJREVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1Ig
SU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisg
KiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBB
IFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFM
TCBBUFBMRSBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNU
LCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VR
VUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NV
UkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRB
LCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNF
RCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNU
LCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1Ig
T1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMg
U09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1B
R0UuIAorICovCisKKyNpZm5kZWYgQjNVcHNpbG9uVmFsdWVfaAorI2RlZmluZSBCM1Vwc2lsb25W
YWx1ZV9oCisKKyNpbmNsdWRlICJCM1ZhbHVlLmgiCisKK25hbWVzcGFjZSBKU0MgeyBuYW1lc3Bh
Y2UgQjMgeworCitjbGFzcyBVcHNpbG9uVmFsdWUgOiBwdWJsaWMgVmFsdWUgeworcHVibGljOgor
ICAgIHN0YXRpYyBib29sIGFjY2VwdHMoT3Bjb2RlIG9wY29kZSkgeyByZXR1cm4gb3Bjb2RlID09
IFVwc2lsb247IH0KKworICAgIH5VcHNpbG9uVmFsdWUoKTsKKworICAgIFZhbHVlKiBwaGkoKSBj
b25zdCB7IHJldHVybiBtX3BoaTsgfQorCitwcm90ZWN0ZWQ6CisgICAgdm9pZCBkdW1wTWV0YShQ
cmludFN0cmVhbSYpIGNvbnN0IG92ZXJyaWRlOworCitwcml2YXRlOgorICAgIGZyaWVuZCBjbGFz
cyBQcm9jZWR1cmU7CisgICAgCisgICAgVXBzaWxvblZhbHVlKHVuc2lnbmVkIGluZGV4LCBPcmln
aW4gb3JpZ2luLCBWYWx1ZSogdmFsdWUsIFZhbHVlKiBwaGkpCisgICAgICAgIDogVmFsdWUoaW5k
ZXgsIFBoaSwgVm9pZCwgb3JpZ2luLCB2YWx1ZSkKKyAgICAgICAgLCBtX3BoaShwaGkpCisgICAg
eworICAgICAgICBBU1NFUlQodmFsdWUtPnR5cGUoKSA9PSBwaGktPnR5cGUoKSk7CisgICAgfQor
CisgICAgVmFsdWUqIG1fcGhpOworfTsKKworfSB9IC8vIG5hbWVzcGFjZSBKU0M6OkIzCisKKyNl
bmRpZiAvLyBCM1Vwc2lsb25WYWx1ZV9oCisKSW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9i
My9CM1ZhbHVlLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNW
YWx1ZS5jcHAJKHJldmlzaW9uIDApCisrKyBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNWYWx1
ZS5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSwxNjkgQEAKKy8qCisgKiBDb3B5cmlnaHQg
KEMpIDIwMTUgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJp
YnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91
dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxv
d2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNv
dXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwg
dGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAq
IDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJv
dmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0
aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9v
ciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAq
IFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFTIElTJycgQU5EIEFO
WQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBM
SU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkg
QU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4g
IElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFC
TEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhF
TVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1J
VEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsg
TE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJ
T04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdI
RVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJ
TkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhF
IFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJ
TElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKworI2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1
ZGUgIkIzVmFsdWUuaCIKKworbmFtZXNwYWNlIEpTQyB7IG5hbWVzcGFjZSBCMyB7CisKK1ZhbHVl
Ojp+VmFsdWUoKQoreworfQorCit2b2lkIFZhbHVlOjpyZXBsYWNlV2l0aElkZW50aXR5KFZhbHVl
KiB2YWx1ZSkKK3sKKyAgICAvLyBUaGlzIGlzIGEgYml0IGNyYXp5LiBJdCBkb2VzIGFuIGluLXBs
YWNlIHJlcGxhY2VtZW50IG9mIHdoYXRldmVyIFZhbHVlIHN1YmNsYXNzIHRoaXMgaXMgd2l0aAor
ICAgIC8vIGEgcGxhaW4gSWRlbnRpdHkgVmFsdWUuIFdlIGZpcnN0IGNvbGxlY3QgYWxsIG9mIHRo
ZSBpbmZvcm1hdGlvbiB3ZSBuZWVkLCB0aGVuIHdlIGRlc3RydWN0IHRoZQorICAgIC8vIHByZXZp
b3VzIHZhbHVlIGluIHBsYWNlLCBhbmQgdGhlbiB3ZSBjb25zdHJ1Y3QgdGhlIElkZW50aXR5IFZh
bHVlIGluIHBsYWNlLgorCisgICAgdW5zaWduZWQgaW5kZXggPSBtX2luZGV4OworICAgIFR5cGUg
dHlwZSA9IG1fdHlwZTsKKyAgICBPcmlnaW4gb3JpZ2luID0gbV9vcmlnaW47CisgICAgQmFzaWNC
bG9jayogb3duZXIgPSB0aGlzLT5vd25lcjsKKyAgICBWYWx1ZSogcmVwbGFjZW1lbnQgPSB0aGlz
LT5yZXBsYWNlbWVudDsKKyAgICB2b2lkKiBtaXNjID0gdGhpcy0+bWlzYzsKKworICAgIFJFTEVB
U0VfQVNTRVJUKHR5cGUgPT0gdmFsdWUtPnR5cGUoKSk7CisKKyAgICB0aGlzLT5WYWx1ZTo6flZh
bHVlKCk7CisKKyAgICBuZXcgKHRoaXMpIChpbmRleCwgSWRlbnRpZnksIHR5cGUsIG9yaWdpbiwg
dmFsdWUpOworCisgICAgdGhpcy0+b3duZXIgPSBvd25lcjsKKyAgICB0aGlzLT5yZXBsYWNlbWVu
dCA9IHJlcGxhY2VtZW50OworICAgIHRoaXMtPm1pc2MgPSBtaXNjOworfQorCit2b2lkIFZhbHVl
OjpkdW1wKFByaW50U3RyZWFtJiBvdXQpIGNvbnN0Cit7CisgICAgb3V0LnByaW50KGR1bXBQcmVm
aXgsIG1faW5kZXgpOworfQorCit2b2lkIFZhbHVlOjpkZWVwRHVtcChQcmludFN0cmVhbSYgb3V0
KSBjb25zdAoreworICAgIG91dC5wcmludChtX3R5cGUsICIgIiwgKnRoaXMsICIgPSAiLCBtX29w
Y29kZSk7CisKKyAgICBvdXQucHJpbnQoIigiKTsKKyAgICBDb21tYVByaW50ZXIgY29tbWE7Cisg
ICAgZm9yIChWYWx1ZSogY2hpbGQgOiBjaGlsZHJlbigpKQorICAgICAgICBvdXQucHJpbnQoY29t
bWEsIHBvaW50ZXJEdW1wKGNoaWxkKSk7CisKKyAgICBTdHJpbmdQcmludFN0cmVhbSBzdHJpbmdP
dXQ7CisgICAgZHVtcE1ldGEoc3RyaW5nT3V0KTsKKyAgICBDU3RyaW5nIHN0cmluZyA9IHN0cmlu
Z091dC50b0NTdHJpbmcoKTsKKyAgICBpZiAoc3RyaW5nLmxlbmd0aCgpKQorICAgICAgICBvdXQu
cHJpbnQoY29tbWEsIHN0cmluZyk7CisKKyAgICBvdXQucHJpbnQoIikiKTsKK30KKworYm9vbCBW
YWx1ZTo6aGFzSW50MzIoKSBjb25zdAoreworICAgIHJldHVybiBmYWxzZTsKK30KKworaW50MzJf
dCBWYWx1ZTo6YXNJbnQzMigpIGNvbnN0Cit7CisgICAgUkVMRUFTRV9BU1NFUlRfTk9UX1JFQUNI
RUQoKTsKKyAgICByZXR1cm4gMDsKK30KKworYm9vbCBWYWx1ZTo6aGFzSW50NjQoKSBjb25zdAor
eworICAgIHJldHVybiBmYWxzZTsKK30KKworaW50NjRfdCBWYWx1ZTo6YXNJbnQ2NCgpIGNvbnN0
Cit7CisgICAgUkVMRUFTRV9BU1NFUlRfTk9UX1JFQUNIRUQoKTsKKyAgICByZXR1cm4gMDsKK30K
KworYm9vbCBWYWx1ZTo6aGFzRG91YmxlKCkgY29uc3QKK3sKKyAgICByZXR1cm4gZmFsc2U7Cit9
CisKK2RvdWJsZSBWYWx1ZTo6YXNEb3VibGUoKSBjb25zdAoreworICAgIFJFTEVBU0VfQVNTRVJU
X05PVF9SRUFDSEVEKCk7CisgICAgcmV0dXJuIDA7Cit9CisKK3ZvaWQgVmFsdWU6OmR1bXBNZXRh
KFByaW50U3RyZWFtJikgY29uc3QKK3sKK30KKworVHlwZSBWYWx1ZTo6dHlwZUZvcihPcGNvZGUg
b3Bjb2RlLCBWYWx1ZSogZmlyc3RDaGlsZCkKK3sKKyAgICBzd2l0Y2ggKG9wY29kZSkgeworICAg
IGNhc2UgSWRlbnRpdHk6CisgICAgY2FzZSBBZGQ6CisgICAgY2FzZSBTdWI6CisgICAgY2FzZSBN
dWw6CisgICAgY2FzZSBEaXY6CisgICAgY2FzZSBDaGlsbERpdjoKKyAgICBjYXNlIE1vZDoKKyAg
ICBjYXNlIEJpdEFuZDoKKyAgICBjYXNlIEJpdE9yOgorICAgIGNhc2UgQml0WG9yOgorICAgIGNh
c2UgU2hsOgorICAgIGNhc2UgU1NocjoKKyAgICBjYXNlIFpTaHI6CisgICAgY2FzZSBDaGVja0Fk
ZDoKKyAgICBjYXNlIENoZWNrU3ViOgorICAgIGNhc2UgQ2hlY2tNdWw6CisgICAgICAgIHJldHVy
biBmaXJzdENoaWxkLT50eXBlKCk7CisgICAgY2FzZSBGcmFtZVBvaW50ZXI6CisgICAgICAgIHJl
dHVybiBwb2ludGVyKCk7CisgICAgY2FzZSBTRXh0ODoKKyAgICBjYXNlIFNFeHQxNjoKKyAgICBj
YXNlIERUb0kzMjoKKyAgICBjYXNlIEVxdWFsOgorICAgIGNhc2UgTm90RXF1YWw6CisgICAgY2Fz
ZSBMZXNzVGhhbjoKKyAgICBjYXNlIEdyZWF0ZXJUaGFuOgorICAgIGNhc2UgTGVzc0VxdWFsOgor
ICAgIGNhc2UgR3JlYXRlckVxdWFsOgorICAgIGNhc2UgQWJvdmU6CisgICAgY2FzZSBCZWxvdzoK
KyAgICBjYXNlIEFib3ZlRXF1YWw6CisgICAgY2FzZSBCZWxvd0VxdWFsOgorICAgICAgICByZXR1
cm4gSW50MzI7CisgICAgY2FzZSBTRXh0MzI6CisgICAgY2FzZSBaRXh0MzI6CisgICAgICAgIHJl
dHVybiBJbnQ2NDsKKyAgICBjYXNlIEZSb3VuZDoKKyAgICBjYXNlIElUb0Q6CisgICAgICAgIHJl
dHVybiBEb3VibGU7CisgICAgY2FzZSBOb3A6CisgICAgICAgIHJldHVybiBWb2lkOworICAgIGRl
ZmF1bHQ6CisgICAgICAgIFJFTEVBU0VfQVNTRVJUX05PVF9SRUFDSEVEKCk7CisgICAgfQorfQor
Cit9IH0gLy8gbmFtZXNwYWNlIEpTQzo6QjMKKwpJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3Jl
L2IzL0IzVmFsdWUuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNW
YWx1ZS5oCShyZXZpc2lvbiAwKQorKysgU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzVmFsdWUu
aAkod29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDE5NiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykg
MjAxNSBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRp
b24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Cisg
KiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5n
IGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNl
IGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlz
IGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4g
UmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBj
b3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBm
b2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90
aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJ
UyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisg
KiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlU
RUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQg
RklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4g
Tk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBG
T1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExB
UlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQg
VE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NT
IE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikg
SE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhF
UiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBO
RUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNF
CisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZ
IE9GIFNVQ0ggREFNQUdFLiAKKyAqLworCisjaWZuZGVmIEIzVmFsdWVfaAorI2RlZmluZSBCM1Zh
bHVlX2gKKworI2luY2x1ZGUgIkIzT3JpZ2luLmgiCisjaW5jbHVkZSAiQjNUeXBlLmgiCisjaW5j
bHVkZSA8d3RmL0Zhc3RNYWxsb2MuaD4KKyNpbmNsdWRlIDx3dGYvTm9uY29weWFibGUuaD4KKwor
bmFtZXNwYWNlIEpTQyB7IG5hbWVzcGFjZSBCMyB7CisKK2NsYXNzIFZhbHVlIHsKKyAgICBXVEZf
TUFLRV9OT05DT1BZQUJMRShWYWx1ZSk7CisgICAgV1RGX01BS0VfRkFTVF9BTExPQ0FURUQ7Citw
dWJsaWM6CisgICAgdHlwZWRlZiBWZWN0b3I8VmFsdWUqLCAzPiBBZGphY2VuY3lMaXN0OworCisg
ICAgc3RhdGljIGNvbnN0IGNoYXIqIGR1bXBQcmVmaXggPSAiQCI7CisKKyAgICBzdGF0aWMgYm9v
bCBhY2NlcHRzKE9wY29kZSkgeyByZXR1cm4gdHJ1ZTsgfQorCisgICAgdmlydHVhbCB+VmFsdWUo
KTsKKworICAgIHVuc2lnbmVkIGluZGV4KCkgY29uc3QgeyByZXR1cm4gbV9pbmRleDsgfQorICAg
IAorICAgIC8vIE5vdGUgdGhhdCB0aGUgb3Bjb2RlIGlzIGltbXV0YWJsZSwgZXhjZXB0IGZvciBy
ZXBsYWNpbmcgdmFsdWVzIHdpdGggaWRlbnRpdHkuCisgICAgT3Bjb2RlIG9wY29kZSgpIGNvbnN0
IHsgcmV0dXJuIG1fb3Bjb2RlOyB9CisKKyAgICBPcmlnaW4gb3JpZ2luKCkgY29uc3QgeyByZXR1
cm4gbV9vcmlnaW47IH0KKyAgICAKKyAgICBWYWx1ZSomIGNoaWxkKHVuc2lnbmVkIGluZGV4KSB7
IHJldHVybiBtX2NoaWxkcmVuW2luZGV4XTsgfQorICAgIFZhbHVlKiBjaGlsZCh1bnNpZ25lZCBp
bmRleCkgY29uc3QgeyByZXR1cm4gbV9jaGlsZHJlbltpbmRleF07IH0KKworICAgIC8vIFRoaXMg
Y29tcHV0ZXMgdGhlIHR5cGUgdXNpbmcgdGhlIG9wY29kZS4KKyAgICBUeXBlIHR5cGUoKSBjb25z
dCB7IHJldHVybiBtX3R5cGU7IH0KKworICAgIEFkamFjZW5jeUxpc3QmIGNoaWxkcmVuKCkgeyBy
ZXR1cm4gbV9jaGlsZHJlbjsgfSAKKyAgICBjb25zdCBBZGphY2VuY3lMaXN0JiBjaGlsZHJlbigp
IGNvbnN0IHsgcmV0dXJuIG1fY2hpbGRyZW47IH0KKworICAgIHZvaWQgcmVwbGFjZVdpdGhJZGVu
dGl0eShWYWx1ZSopOworICAgIHZvaWQgcmVwbGFjZVdpdGhOb3AoKTsKKworICAgIHZvaWQgZHVt
cChQcmludFN0cmVhbSYpIGNvbnN0OworICAgIHZvaWQgZGVlcER1bXAoUHJpbnRTdHJlYW0mKSBj
b25zdDsKKworICAgIC8vIFRoaXMgaXMgaG93IHlvdSBjYXN0IFZhbHVlcy4gRm9yIGV4YW1wbGUs
IGlmIHlvdSB3YW50IHRvIGRvIHNvbWV0aGluZyBwcm92aWRlZCB0aGF0IHdlIGhhdmUgYQorICAg
IC8vIEFyZ3VtZW50UmVnVmFsdWUsIHlvdSBjYW4gZG86CisgICAgLy8KKyAgICAvLyBpZiAoQXJn
dW1lbnRSZWdWYWx1ZSogYXJndW1lbnRSZWcgPSB2YWx1ZS0+YXM8QXJndW1lbnRSZWdWYWx1ZT4o
KSkgeworICAgIC8vICAgICB0aGluZ3MKKyAgICAvLyB9CisgICAgLy8KKyAgICAvLyBUaGlzIHdp
bGwgcmV0dXJuIG51bGwgaWYgdGhpcyBvcGNvZGUoKSAhPSBBcmd1bWVudFJlZy4gVGhpcyB3b3Jr
cyBiZWNhdXNlIHRoaXMgcmV0dXJucyBudWxscHRyCisgICAgLy8gaWYgVDo6YWNjZXB0cyhvcGNv
ZGUoKSkgcmV0dXJucyBmYWxzZS4KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorICAgIFQqIGFz
KCk7CisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4KKyAgICBjb25zdCBUKiBhcygpIGNvbnN0Owor
ICAgIAorICAgIGJvb2wgaGFzSW50MzIoKSBjb25zdDsKKyAgICBpbnQzMl90IGFzSW50MzIoKSBj
b25zdDsKKyAgICAKKyAgICBib29sIGhhc0ludDY0KCkgY29uc3Q7CisgICAgaW50NjRfdCBhc0lu
dDY0KCkgY29uc3Q7CisKKyAgICBib29sIGhhc0ludCgpIGNvbnN0OworICAgIGludDY0X3QgYXNJ
bnQoKSBjb25zdDsKKyAgICBib29sIGlzSW50KGludDY0X3QgdmFsdWUpIGNvbnN0OworCisgICAg
Ym9vbCBoYXNEb3VibGUoKSBjb25zdDsKKyAgICBkb3VibGUgYXNEb3VibGUoKSBjb25zdDsKKwor
ICAgIFN0YWNrbWFwKiBzdGFja21hcCgpOworCitwcm90ZWN0ZWQ6CisgICAgdmlydHVhbCB2b2lk
IGR1bXBNZXRhKFByaW50U3RyZWFtJikgY29uc3Q7CisgICAgCitwcml2YXRlOgorICAgIGZyaWVu
ZCBjbGFzcyBQcm9jZWR1cmU7CisgICAgCisgICAgLy8gSW5zdGFudGlhdGUgdmFsdWVzIHZpYSBQ
cm9jZWR1cmUuCisgICAgLy8gVGhpcyBmb3JtIHJlcXVpcmVzIHNwZWNpZnlpbmcgdGhlIHR5cGUg
ZXhwbGljaXRseToKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZS4uLiBBcmd1bWVudHM+CisgICAgZXhw
bGljaXQgVmFsdWUodW5zaWduZWQgaW5kZXgsIE9wY29kZSBvcGNvZGUsIFR5cGUgdHlwZSwgT3Jp
Z2luIG9yaWdpbiwgVmFsdWUqIGZpcnN0Q2hpbGQsIEFyZ3VtZW50cy4uLiBhcmd1bWVudHMpCisg
ICAgICAgIDogbV9pbmRleChpbmRleCkKKyAgICAgICAgLCBtX29wY29kZShvcGNvZGUpCisgICAg
ICAgICwgbV90eXBlKHR5cGUpCisgICAgICAgICwgbV9vcmlnaW4ob3JpZ2luKQorICAgICAgICAs
IG1fY2hpbGRyZW57IGZpcnN0Q2hpbGQsIGFyZ3VtZW50cy4uLiB9CisgICAgeworICAgIH0KKyAg
ICAvLyBUaGlzIGZvcm0gaXMgZm9yIHNwZWNpZnlpbmcgdGhlIHR5cGUgZXhwbGljaXRseSB3aGVu
IHRoZSBvcGNvZGUgaGFzIG5vIGNoaWxkcmVuOgorICAgIGV4cGxpY2l0IFZhbHVlKHVuc2lnbmVk
IGluZGV4LCBPcGNvZGUgb3Bjb2RlLCBUeXBlIHR5cGUsIE9yaWdpbiBvcmlnaW4pCisgICAgICAg
IDogbV9pbmRleChpbmRleCkKKyAgICAgICAgLCBtX29wY29kZShvcGNvZGUpCisgICAgICAgICwg
bV90eXBlKHR5cGUpCisgICAgICAgICwgbV9vcmlnaW4ob3JpZ2luKQorICAgIHsKKyAgICB9Cisg
ICAgLy8gVGhpcyBmb3JtIGlzIGZvciB0aG9zZSBvcGNvZGVzIHRoYXQgY2FuIGluZmVyIHRoZWly
IHR5cGUgZnJvbSB0aGUgb3Bjb2RlIGFuZCBmaXJzdCBjaGlsZDoKKyAgICB0ZW1wbGF0ZTx0eXBl
bmFtZS4uLiBBcmd1bWVudHM+CisgICAgZXhwbGljaXQgVmFsdWUodW5zaWduZWQgaW5kZXgsIE9w
Y29kZSBvcGNvZGUsIE9yaWdpbiBvcmlnaW4sIFZhbHVlKiBmaXJzdENoaWxkLCBBcmd1bWVudHMu
Li4gYXJndW1lbnRzKQorICAgICAgICA6IG1faW5kZXgoaW5kZXgpCisgICAgICAgICwgbV9vcGNv
ZGUob3Bjb2RlKQorICAgICAgICAsIG1fdHlwZSh0eXBlRm9yKG9wY29kZSwgZmlyc3RDaGlsZCkp
CisgICAgICAgICwgbV9vcmlnaW4ob3JpZ2luKQorICAgICAgICAsIG1fY2hpbGRyZW57IGZpcnN0
Q2hpbGQsIGFyZ3VtZW50cy4uLiB9CisgICAgeworICAgIH0KKyAgICAvLyBUaGlzIGZvcm0gaXMg
Zm9yIHRob3NlIG9wY29kZXMgdGhhdCBjYW4gaW5mZXIgdGhlaXIgdHlwZSBmcm9tIHRoZSBvcGNv
ZGUgYWxvbmUsIGFuZCB0aGF0IGRvbid0CisgICAgLy8gdGFrZSBhbnkgYXJndW1lbnRzOgorICAg
IGV4cGxpY2l0IFZhbHVlKHVuc2lnbmVkIGluZGV4LCBPcGNvZGUgb3Bjb2RlLCBPcmlnaW4gb3Jp
Z2luKQorICAgICAgICA6IG1faW5kZXgoaW5kZXgpCisgICAgICAgICwgbV9vcGNvZGUob3Bjb2Rl
KQorICAgICAgICAsIG1fdHlwZSh0eXBlRm9yKG9wY29kZSwgbnVsbHB0cikpCisgICAgICAgICwg
bV9vcmlnaW4ob3JpZ2luKQorICAgIHsKKyAgICB9CisgICAgLy8gVXNlIHRoaXMgZm9ybSBmb3Ig
dmFyYXJncy4KKyAgICBleHBpY2l0IFZhbHVlKHVuc2lnbmVkIGluZGV4LCBPcGNvZGUgb3Bjb2Rl
LCBUeXBlIHR5cGUsIE9yaWdpbiBvcmlnaW4sIGNvbnN0IEFkamFjZW5jeUxpc3QmIGNoaWxkcmVu
KQorICAgICAgICA6IG1faW5kZXgoaW5kZXgpCisgICAgICAgICwgbV9vcGNvZGUob3Bjb2RlKQor
ICAgICAgICAsIG1fdHlwZSh0eXBlKQorICAgICAgICAsIG1fb3JpZ2luKG9yaWdpbikKKyAgICAg
ICAgLCBtX2NoaWxkcmVuKGNoaWxkcmVuKQorICAgIHsKKyAgICB9CisKKyAgICBzdGF0aWMgVHlw
ZSB0eXBlRm9yKE9wY29kZSwgVmFsdWUqIGZpcnN0Q2hpbGQpOworCisgICAgLy8gVGhpcyBncm91
cCBvZiBmaWVsZHMgaXMgYXJyYW5nZWQgdG8gZml0IGluIDY0IGJpdHMuCisgICAgdW5zaWduZWQg
bV9pbmRleDsKKyAgICBPcGNvZGUgbV9vcGNvZGU7CisgICAgVHlwZSBtX3R5cGU7CisgICAgCisg
ICAgT3JpZ2luIG1fb3JpZ2luOworICAgIEFkamFjZW5jeUxpc3QgbV9jaGlsZHJlbjsKKworcHVi
bGljOgorICAgIEJhc2ljQmxvY2sqIG93bmVyIHsgbnVsbHB0ciB9OyAvLyBjb21wdXRlZCBsYXpp
bHkuCisgICAgVmFsdWUqIHJlcGxhY2VtZW50IHsgbnVsbHB0ciB9OyAvLyB1c2VkIGZvciBhbmFs
eXNlcyBhbmQgdHJhbnNmb3JtYXRpb25zLgorICAgIHZvaWQqIG1pc2MgeyBudWxscHRyIH07Cit9
OworCitjbGFzcyBEZWVwVmFsdWVEdW1wIHsKK3B1YmxpYzoKKyAgICBEZWVwVmFsdWVEdW1wKFZh
bHVlKiB2YWx1ZSkKKyAgICAgICAgOiBtX3ZhbHVlKHZhbHVlKQorICAgIHsKKyAgICB9CisKKyAg
ICB2b2lkIGR1bXAoUHJpbnRTdHJlYW0mIG91dCkgY29uc3QKKyAgICB7CisgICAgICAgIGlmICht
X3ZhbHVlKQorICAgICAgICAgICAgbV92YWx1ZS0+ZGVlcER1bXAob3V0KTsKKyAgICAgICAgZWxz
ZQorICAgICAgICAgICAgb3V0LnByaW50KCI8bnVsbD4iKTsKKyAgICB9CisKK3ByaXZhdGU6Cisg
ICAgVmFsdWUqIG1fdmFsdWU7Cit9OworCitEZWVwVmFsdWVEdW1wIGRlZXBEdW1wKFZhbHVlKiB2
YWx1ZSkKK3sKKyAgICByZXR1cm4gRGVlcFZhbHVlRHVtcCh2YWx1ZSk7Cit9CisKK30gfSAvLyBu
YW1lc3BhY2UgSlNDOjpCMworCisjZW5kaWYgLy8gQjNWYWx1ZV9oCisKSW5kZXg6IFNvdXJjZS9K
YXZhU2NyaXB0Q29yZS9iMy9CM1ZhbHVlSW5saW5lcy5oCj09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9K
YXZhU2NyaXB0Q29yZS9iMy9CM1ZhbHVlSW5saW5lcy5oCShyZXZpc2lvbiAwKQorKysgU291cmNl
L0phdmFTY3JpcHRDb3JlL2IzL0IzVmFsdWVJbmxpbmVzLmgJKHdvcmtpbmcgY29weSkKQEAgLTAs
MCArMSwxMDkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTUgQXBwbGUgSW5jLiBBbGwgcmln
aHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFu
ZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVy
bWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0
OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBh
Ym92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5k
IHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5h
cnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2Us
IHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4g
dGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQg
d2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQg
QlkgQVBQTEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdB
UlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQg
V0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxB
UgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElO
Qy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNU
LCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERB
TUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0Yg
U1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQ
Uk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBB
TlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBM
SUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0Up
IEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwg
RVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8K
KworI2lmbmRlZiBCM1ZhbHVlSW5saW5lc19oCisjZGVmaW5lIEIzVmFsdWVJbmxpbmVzX2gKKwor
I2luY2x1ZGUgIkIzQ2hlY2tWYWx1ZS5oIgorI2luY2x1ZGUgIkIzQ29uc3QzMlZhbHVlLmgiCisj
aW5jbHVkZSAiQjNDb25zdDY0VmFsdWUuaCIKKyNpbmNsdWRlICJCM0NvbnN0RG91YmxlVmFsdWUu
aCIKKyNpbmNsdWRlICJCM1BhdGNocG9pbnRWYWx1ZS5oIgorI2luY2x1ZGUgIkIzVmFsdWUuaCIK
KworbmFtZXNwYWNlIEpTQyB7IG5hbWVzcGFjZSBCMyB7CisKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+
CitUKiBWYWx1ZTo6YXMoKQoreworICAgIGlmIChUOjphY2NlcHRzKG9wY29kZSgpKSkKKyAgICAg
ICAgcmV0dXJuIHN0YXRpY19jYXN0PFQqPih0aGlzKTsKKyAgICByZXR1cm4gbnVsbHB0cjsKK30K
KwordGVtcGxhdGU+dHlwZW5hbWUgVD4KK2NvbnN0IFQqIFZhbHVlOjphcygpIGNvbnN0Cit7Cisg
ICAgcmV0dXJuIGNvbnN0X2Nhc3Q8VmFsdWUqPih0aGlzKS0+YXM8VD4oKTsKK30KKworYm9vbCBW
YWx1ZTo6aGFzSW50MzIoKSBjb25zdAoreworICAgIHJldHVybiAhIWFzPENvbnN0MzJWYWx1ZT4o
KTsKK30KKworaW50MzJfdCBWYWx1ZTo6YXNJbnQzMigpIGNvbnN0Cit7CisgICAgcmV0dXJuIGFz
PENvbnN0MzJWYWx1ZT4oKS0+dmFsdWUoKTsKK30KKworYm9vbCBWYWx1ZTo6aGFzSW50NjQoKSBj
b25zdAoreworICAgIHJldHVybiAhIWFzPENvbnN0NjRWYWx1ZT4oKTsKK30KKworaW50NjRfdCBW
YWx1ZTo6YXNJbnQ2NCgpIGNvbnN0Cit7CisgICAgcmV0dXJuIGFzPENvbnN0NjRWYWx1ZT4oKS0+
dmFsdWUoKTsKK30KKworYm9vbCBWYWx1ZTo6aGFzSW50KCkgY29uc3QKK3sKKyAgICByZXR1cm4g
aGFzSW50MzIoKSB8fCBoYXNJbnQ2NCgpOworfQorCitpbnQ2NF90IFZhbHVlOjphc0ludCgpIGNv
bnN0Cit7CisgICAgcmV0dXJuIGhhc0ludDMyKCkgPyBhc0ludDMyKCkgOiBhc0ludDY0KCk7Cit9
CisKK2Jvb2wgVmFsdWU6OmlzSW50KGludDY0X3QgdmFsdWUpIGNvbnN0Cit7CisgICAgcmV0dXJu
IGhhc0ludCgpICYmIGFzSW50KCkgPT0gdmFsdWU7Cit9CisKK2Jvb2wgVmFsdWU6Omhhc0RvdWJs
ZSgpIGNvbnN0Cit7CisgICAgcmV0dXJuICEhYXM8Q29uc3REb3VibGVWYWx1ZT4oKTsKK30KKwor
ZG91YmxlIFZhbHVlOjphc0RvdWJsZSgpIGNvbnN0Cit7CisgICAgcmV0dXJuIGFzPENvbnN0RG91
YmxlVmFsdWU+KCktPnZhbHVlKCk7Cit9CisKK1N0YWNrbWFwKiBWYWx1ZTo6c3RhY2ttYXAoKQor
eworICAgIGlmIChDaGVja1ZhbHVlKiBjaGVjayA9IGFzPENoZWNrVmFsdWU+KCkpCisgICAgICAg
IHJldHVybiAmY2hlY2stPnN0YWNrbWFwOworICAgIGlmIChQYXRjaHBvaW50VmFsdWUqIHBhdGNo
cG9pbnQgPSBhczxQYXRjaHBvaW50VmFsdWU+KCkpCisgICAgICAgIHJldHVybiAmcGF0Y2hwb2lu
dC0+c3RhY2ttYXA7CisgICAgcmV0dXJuIG51bGxwdHI7Cit9CisKK30gfSAvLyBuYW1lc3BhY2Ug
SlNDOjpCMworCisjZW5kaWYgLy8gQjNWYWx1ZUlubGluZXNfaAorCkluZGV4OiBTb3VyY2UvSmF2
YVNjcmlwdENvcmUvYjMvQjNWYWx1ZVJlcC5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL0phdmFT
Y3JpcHRDb3JlL2IzL0IzVmFsdWVSZXAuY3BwCShyZXZpc2lvbiAwKQorKysgU291cmNlL0phdmFT
Y3JpcHRDb3JlL2IzL0IzVmFsdWVSZXAuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsODYg
QEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTUgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2Vy
dmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkg
Zm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHBy
b3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4g
UmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5
cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xs
b3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBt
dXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlz
dCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAg
ICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUg
ZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUg
SU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMs
IElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElF
UyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVS
UE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IKKyAq
IENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVO
VEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElO
Q0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVU
RSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBP
UiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZ
CisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFks
IE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcg
SU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBB
RFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKworI2luY2x1
ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgIkIzVmFsdWVSZXAuaCIKKworbmFtZXNwYWNlIEpTQyB7
IG5hbWVzcGFjZSBCMyB7CisKK3ZvaWQgVmFsdWVSZXA6OmR1bXAoUHJpbnRTdHJlYW0mIG91dCkg
Y29uc3QKK3sKKyAgICBvdXQucHJpbnQobV9raW5kKTsKKyAgICBzd2l0Y2ggKG1fa2luZCkgewor
ICAgIGNhc2UgTm9uZToKKyAgICBjYXNlIFNvbWVSZWdpc3RlcjoKKyAgICAgICAgcmV0dXJuOwor
ICAgIGNhc2UgUmVnaXN0ZXI6CisgICAgICAgIG91dC5wcmludCgiKCIsIHJlZygpLCAiKSIpOwor
ICAgICAgICByZXR1cm47CisgICAgY2FzZSBTdGFjazoKKyAgICAgICAgb3V0LnByaW50KCIoIiwg
b2Zmc2V0RnJvbUZQKCksICIpIik7CisgICAgICAgIHJldHVybjsKKyAgICBjYXNlIFN0YWNrQXJn
dW1lbnQ6CisgICAgICAgIG91dC5wcmludCgiKCIsIG9mZnNldEZyb21TUCgpLCAiKSIpOworICAg
ICAgICByZXR1cm47CisgICAgY2FzZSBDb25zdGFudDoKKyAgICAgICAgb3V0LnByaW50KCIoIiwg
dmFsdWUoKSwgIikiKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBSRUxFQVNFX0FTU0VS
VF9OT1RfUkVBQ0hFRCgpOworfQorCit9IH0gLy8gbmFtZXNwYWNlIEpTQzo6QjMKKworbmFtZXNw
YWNlIFdURiB7CisKK3VzaW5nIG5hbWVzcGFjZSBKU0M6OkIzOworCit2b2lkIHByaW50SW50ZXJu
YWwoUHJpbnRTdHJlYW0mIG91dCwgVmFsdWVSZXA6OktpbmQga2luZCkKK3sKKyAgICBzd2l0Y2gg
KGtpbmQpIHsKKyAgICBjYXNlIFZhbHVlUmVwOjpBbnk6CisgICAgICAgIG91dC5wcmludCgiQW55
Iik7CisgICAgICAgIHJldHVybjsKKyAgICBjYXNlIFZhbHVlUmVwOjpTb21lUmVnaXN0ZXI6Cisg
ICAgICAgIG91dC5wcmludCgiU29tZVJlZ2lzdGVyIik7CisgICAgICAgIHJldHVybjsKKyAgICBj
YXNlIFZhbHVlUmVwOjpSZWdpc3RlcjoKKyAgICAgICAgb3V0LnByaW50KCJSZWdpc3RlciIpOwor
ICAgICAgICByZXR1cm47CisgICAgY2FzZSBWYWx1ZVJlcDo6U3RhY2s6CisgICAgICAgIG91dC5w
cmludCgiU3RhY2siKTsKKyAgICAgICAgcmV0dXJuOworICAgIGNhc2UgVmFsdWVSZXA6OlN0YWNr
QXJndW1lbnQ6CisgICAgICAgIG91dC5wcmludCgiU3RhY2tBcmd1bWVudCIpOworICAgICAgICBy
ZXR1cm47CisgICAgY2FzZSBWYWx1ZVJlcDo6Q29uc3RhbnQ6CisgICAgICAgIG91dC5wcmludCgi
Q29uc3RhbnQiKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBSRUxFQVNFX0FTU0VSVF9O
T1RfUkVBQ0hFRCgpOworfQorCit9IC8vIG5hbWVzcGFjZSBXVEYKKwpJbmRleDogU291cmNlL0ph
dmFTY3JpcHRDb3JlL2IzL0IzVmFsdWVSZXAuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNj
cmlwdENvcmUvYjMvQjNWYWx1ZVJlcC5oCShyZXZpc2lvbiAwKQorKysgU291cmNlL0phdmFTY3Jp
cHRDb3JlL2IzL0IzVmFsdWVSZXAuaAkod29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDE1NiBAQAor
LyoKKyAqIENvcHlyaWdodCAoQykgMjAxNSBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQu
CisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jt
cywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlk
ZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRp
c3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdo
dAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2lu
ZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3Qg
cmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9m
IGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRv
Y3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0
cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMu
IGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5D
TFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9G
IE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NF
IEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUgorICogQ09O
VFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUws
IFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVE
SU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdP
T0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJV
U0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAq
IE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1Ig
VE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBB
TlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklT
RUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLiAKKyAqLworCisjaWZuZGVmIEIz
VmFsdWVSZXBfaAorI2RlZmluZSBCM1ZhbHVlUmVwX2gKKworI2luY2x1ZGUgIlJlZy5oIgorI2lu
Y2x1ZGUgPHd0Zi9QcmludFN0cmVhbS5oPgorCituYW1lc3BhY2UgSlNDIHsgbmFtZXNwYWNlIEIz
IHsKKworLy8gV2UgdXNlIHRoaXMgY2xhc3MgdG8gZGVzY3JpYmUgdmFsdWUgcmVwcmVzZW50YXRp
b25zIGF0IHN0YWNrbWFwcy4gSXQncyB1c2VkIGJvdGggdG8gZm9yY2UgYQorLy8gcmVwcmVzZW50
YXRpb24gYW5kIHRvIGdldCB0aGUgcmVwcmVzZW50YXRpb24uIFdoZW4gdGhlIEIzIGNsaWVudCBm
b3JjZXMgYSByZXByZXNlbnRhdGlvbiwgd2Ugc2F5CisvLyB0aGF0IGl0J3MgYW4gaW5wdXQuIFdo
ZW4gQjMgdGVsbHMgdGhlIGNsaWVudCB3aGF0IHJlcHJlc2VudGF0aW9uIGl0IHBpY2tlZCwgd2Ug
c2F5IHRoYXQgaXQncyBhbgorLy8gb3V0cHV0LgorCitjbGFzcyBWYWx1ZVJlcCB7CitwdWJsaWM6
CisgICAgZW51bSBLaW5kIHsKKyAgICAgICAgLy8gQXMgYW4gaW5wdXQgcmVwcmVzZW50YXRpb24s
IHRoaXMgbWVhbnMgdGhhdCBCMyBjYW4gcGljayBhbnkgcmVwcmVzZW50YXRpb24uCisgICAgICAg
IEFueSwKKworICAgICAgICAvLyBBcyBhbiBpbnB1dCByZXByZXNlbnRhdGlvbiwgdGhpcyBtZWFu
cyB0aGF0IEIzIHNob3VsZCBwaWNrIHNvbWUgcmVnaXN0ZXIsIHByb3ZpZGVkIHRoYXQKKyAgICAg
ICAgLy8gaXQncyBub3QgYWxzbyBhIHJlZ2lzdGVyIHRoYXQgd2FzIGNsb2JiZXJlZC4KKyAgICAg
ICAgU29tZVJlZ2lzdGVyLAorCisgICAgICAgIC8vIEFzIGFuIGlucHV0IHJlcHJlc2VudGF0aW9u
LCB0aGlzIGZvcmNlcyBhIHBhcnRpY3VsYXIgcmVnaXN0ZXIuIEFzIGFuIG91dHB1dAorICAgICAg
ICAvLyByZXByZXNlbnRhdGlvbiwgdGhpcyB0ZWxscyB1cyB3aGF0IHJlZ2lzdGVyIEIzIHBpY2tl
ZC4KKyAgICAgICAgUmVnaXN0ZXIsCisKKyAgICAgICAgLy8gQXMgYW4gb3V0cHV0IHJlcHJlc2Vu
dGF0aW9uLCB0aGlzIHRlbGxzIHVzIHdoYXQgc3RhY2sgc2xvdCBCMyBwaWNrZWQuIEl0J3Mgbm90
IGEgdmFsaWQKKyAgICAgICAgLy8gaW5wdXQgcmVwcmVzZW50YXRpb24uCisgICAgICAgIFN0YWNr
LAorCisgICAgICAgIC8vIEFzIGFuIGlucHV0IHJlcHJlc2VudGF0aW9uLCB0aGlzIGZvcmNlcyB0
aGUgdmFsdWUgdG8gZW5kIHVwIGluIHRoZSBhcmd1bWVudCBhcmVhIGF0IHNvbWUKKyAgICAgICAg
Ly8gb2Zmc2V0LgorICAgICAgICBTdGFja0FyZ3VtZW50LAorCisgICAgICAgIC8vIEFzIGFuIG91
dHB1dCByZXByZXNlbnRhdGlvbiwgdGhpcyB0ZWxscyB1cyB0aGF0IEIzIGNvbnN0YW50LWZvbGRl
ZCB0aGUgdmFsdWUuCisgICAgICAgIENvbnN0YW50CisgICAgfTsKKyAgICAKKyAgICBWYWx1ZVJl
cCgpCisgICAgICAgIDogbV9raW5kKEFueSkKKyAgICB7CisgICAgfQorCisgICAgZXhwbGljaXQg
VmFsdWVSZXAoUmVnIHJlZykKKyAgICAgICAgOiBtX2tpbmQoUmVnaXN0ZXIpCisgICAgICAgICwg
bV92YWx1ZShyZWcuaW5kZXgoKSkKKyAgICB7CisgICAgfQorCisgICAgc3RhdGljIFZhbHVlUmVw
IHJlZyhSZWcgcmVnKQorICAgIHsKKyAgICAgICAgcmV0dXJuIFZhbHVlUmVwKHJlZyk7CisgICAg
fQorCisgICAgc3RhdGljIFZhbHVlUmVwIHN0YWNrKGludHB0cl90IG9mZnNldEZyb21GUCkKKyAg
ICB7CisgICAgICAgIFZhbHVlUmVwIHJlc3VsdDsKKyAgICAgICAgcmVzdWx0Lm1fa2luZCA9IFN0
YWNrOworICAgICAgICByZXN1bHQubV92YWx1ZSA9IG9mZnNldEZyb21GUDsKKyAgICB9CisKKyAg
ICBzdGF0aWMgVmFsdWVSZXAgc3RhY2tBcmd1bWVudChpbnRwdHJfdCBvZmZzZXRGcm9tU1ApCisg
ICAgeworICAgICAgICBWYWx1ZVJlcCByZXN1bHQ7CisgICAgICAgIHJlc3VsdC5tX2tpbmQgPSBT
dGFja0FyZ3VtZW50OworICAgICAgICByZXN1bHQubV92YWx1ZSA9IG9mZnNldEZyb21TUDsKKyAg
ICB9CisKKyAgICBzdGF0aWMgVmFsdWVSZXAgY29uc3RhbnQoaW50NjRfdCB2YWx1ZSkKKyAgICB7
CisgICAgICAgIFZhbHVlUmVwIHJlc3VsdDsKKyAgICAgICAgcmVzdWx0Lm1fa2luZCA9IENvbnN0
YW50OworICAgICAgICByZXN1bHQubV92YWx1ZSA9IHZhbHVlOworICAgIH0KKworICAgIHN0YXRp
YyBWYWx1ZVJlcCBjb25zdGFudChkb3VibGUgdmFsdWUpCisgICAgeworICAgICAgICByZXR1cm4g
VmFsdWVSZXAoYml0d2lzZV9jYXN0PGludDY0X3Q+KHZhbHVlKSk7CisgICAgfQorCisgICAgS2lu
ZCBraW5kKCkgY29uc3QgeyByZXR1cm4gbV9raW5kOyB9CisKKyAgICBleHBsaWNpdCBvcGVyYXRv
ciBib29sKCkgY29uc3QgeyByZXR1cm4ga2luZCgpICE9IEFueTsgfQorCisgICAgUmVnIHJlZygp
IGNvbnN0CisgICAgeworICAgICAgICBBU1NFUlQoa2luZCgpID09IFJlZ2lzdGVyKTsKKyAgICAg
ICAgcmV0dXJuIFJlZzo6ZnJvbUluZGV4KG1fdmFsdWUpOworICAgIH0KKworICAgIGludHB0cl90
IG9mZnNldEZyb21GUCgpIGNvbnN0CisgICAgeworICAgICAgICBBU1NFUlQoa2luZCgpID09IFN0
YWNrKTsKKyAgICAgICAgcmV0dXJuIHN0YXRpY19jYXN0PGludHB0cl90PihtX3ZhbHVlKTsKKyAg
ICB9CisKKyAgICBpbnRwdHJfdCBvZmZzZXRGcm9tU1AoKSBjb25zdAorICAgIHsKKyAgICAgICAg
QVNTRVJUKGtpbmQoKSA9PSBTdGFja0FyZ3VtZW50KTsKKyAgICAgICAgcmV0dXJuIHN0YXRpY19j
YXN0PGludHB0cl90PihtX3ZhbHVlKTsKKyAgICB9CisKKyAgICBpbnQ2NF90IHZhbHVlKCkgY29u
c3QKKyAgICB7CisgICAgICAgIEFTU0VSVChraW5kKCkgPT0gQ29uc3RhbnQpOworICAgICAgICBy
ZXR1cm4gbV92YWx1ZTsKKyAgICB9CisKKyAgICBkb3VibGUgZG91YmxlVmFsdWUoKSBjb25zdAor
ICAgIHsKKyAgICAgICAgcmV0dXJuIGJpdHdpc2VfY2FzdDxkb3VibGU+KHZhbHVlKCkpOworICAg
IH0KKworICAgIHZvaWQgZHVtcChQcmludFN0cmVhbSYpIGNvbnN0OworCitwcml2YXRlOgorICAg
IEtpbmQgbV9raW5kOworICAgIGludDY0X3QgbV92YWx1ZTsKK307CisKK30gfSAvLyBuYW1lc3Bh
Y2UgSlNDOjpCMworCituYW1lc3BhY2UgV1RGIHsKKwordm9pZCBwcmludEludGVybmFsKFByaW50
U3RyZWFtJiwgSlNDOjpCMzo6VmFsdWVSZXA6OktpbmQpOworCit9IC8vIG5hbWVzcGFjZSBXVEYK
KworI2VuZGlmIC8vIEIzVmFsdWVSZXBfaAorCkluZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUv
YjMvZ2VuZXJhdGVfcGF0dGVybl9tYXRjaGVyLnJiCj09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZh
U2NyaXB0Q29yZS9iMy9nZW5lcmF0ZV9wYXR0ZXJuX21hdGNoZXIucmIJKHJldmlzaW9uIDApCisr
KyBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvZ2VuZXJhdGVfcGF0dGVybl9tYXRjaGVyLnJiCSh3
b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsNDc1IEBACisjIS91c3IvYmluL2VudiBydWJ5CisKKyMg
Q29weXJpZ2h0IChDKSAyMDE1IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyMKKyMg
UmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBv
ciB3aXRob3V0CisjIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRo
ZSBmb2xsb3dpbmcgY29uZGl0aW9ucworIyBhcmUgbWV0OgorIyAxLiBSZWRpc3RyaWJ1dGlvbnMg
b2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorIyAgICBub3Rp
Y2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIu
CisjIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUg
YWJvdmUgY29weXJpZ2h0CisjICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5k
IHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyMgICAgZG9jdW1lbnRhdGlvbiBhbmQv
b3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyMKKyMg
VEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIEFORCBJVFMgQ09OVFJJQlVU
T1JTIGBgQVMgSVMnJworIyBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJ
TkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyMgVEhFIElNUExJRUQgV0FSUkFOVElFUyBP
RiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorIyBQVVJQT1NF
IEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SIElUUyBDT05U
UklCVVRPUlMKKyMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRB
TCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgorIyBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xV
RElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgorIyBTVUJTVElUVVRFIEdP
T0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5F
U1MKKyMgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBM
SUFCSUxJVFksIFdIRVRIRVIgSU4KKyMgQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRP
UlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKyMgQVJJU0lORyBJTiBBTlkg
V0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRgor
IyBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKK3JlcXVpcmUgInBhdGhuYW1lIgor
CiskdmFySW5kZXggPSAwCitkZWYgbmV3VmFyCisgICAgJHZhckluZGV4ICs9IDEKKyAgICAiX3Rt
cCN7JHZhckluZGV4fSIKK2VuZAorCitjbGFzcyBQcm9kdWN0aW9uCisgICAgYXR0cl9yZWFkZXIg
Om9yaWdpbiwgOm5hbWUsIDp2YXJOYW1lLCA6YW5vbnltb3VzLCA6b3Bjb2RlLCA6Y2hpbGRyZW4K
KworICAgIGRlZiBpbml0aWFsaXplKG9yaWdpbiwgbmFtZSwgb3Bjb2RlLCBjaGlsZHJlbikKKyAg
ICAgICAgQG9yaWdpbiA9IG9yaWdpbgorICAgICAgICBAbmFtZSA9IG5hbWUKKyAgICAgICAgQGFu
b255bW91cyA9IChuYW1lID09IG5pbCBvciBuYW1lID1+IC9cQVwkKFswLTldKylcWi8pCisgICAg
ICAgIEB2YXJOYW1lID0gQGFub255bW91cyA/IG5ld1ZhciA6IG5hbWUKKyAgICAgICAgQG9wY29k
ZSA9IG9wY29kZQorICAgICAgICBAY2hpbGRyZW4gPSBjaGlsZHJlbiA/IGNoaWxkcmVuIDogW10K
KyAgICBlbmQKKworICAgIGRlZiBoYXNPcGNvZGUKKyAgICAgICAgb3Bjb2RlICE9IG5pbAorICAg
IGVuZAorCisgICAgZGVmIGVhY2hWYXJpYWJsZSgmcHJvYykKKyAgICAgICAgY2hpbGRyZW4uZWFj
aF93aXRoX2luZGV4IHsKKyAgICAgICAgICAgIHwgY2hpbGQsIGluZGV4IHwKKyAgICAgICAgICAg
IHlpZWxkIHZhck5hbWUsCisgICAgICAgICAgICAgICAgICBjaGlsZC5uYW1lLAorICAgICAgICAg
ICAgICAgICAgY2hpbGQudmFyTmFtZSwKKyAgICAgICAgICAgICAgICAgIGNoaWxkLmFub255bW91
cyA/IChjaGlsZC5vcGNvZGUgPyA6YW5vbkludGVybmFsIDogOmFub25PcGVyYW5kKSA6IChjaGls
ZC5vcGNvZGUgPyA6aW50ZXJuYWwgOiA6b3BlcmFuZCksCisgICAgICAgICAgICAgICAgICBpbmRl
eAorICAgICAgICAgICAgY2hpbGQuZWFjaFZhcmlhYmxlKCZwcm9jKQorICAgICAgICB9CisgICAg
ZW5kCitlbmQKKworY2xhc3MgTWF0Y2hlcgorICAgIGF0dHJfcmVhZGVyIDpuYW1lLCA6cHJvZHVj
dGlvbnMKKworICAgIGRlZiBpbml0aWFsaXplKG5hbWUsIHByb2R1Y3Rpb25zKQorICAgICAgICBA
bmFtZSA9IG5hbWUKKyAgICAgICAgQHByb2R1Y3Rpb25zID0gcHJvZHVjdGlvbnMKKyAgICBlbmQK
K2VuZAorCitjbGFzcyBPcmlnaW4KKyAgICBhdHRyX3JlYWRlciA6ZmlsZU5hbWUsIDpsaW5lTnVt
YmVyCisgICAgCisgICAgZGVmIGluaXRpYWxpemUoZmlsZU5hbWUsIGxpbmVOdW1iZXIpCisgICAg
ICAgIEBmaWxlTmFtZSA9IGZpbGVOYW1lCisgICAgICAgIEBsaW5lTnVtYmVyID0gbGluZU51bWJl
cgorICAgIGVuZAorICAgIAorICAgIGRlZiB0b19zCisgICAgICAgICIje2ZpbGVOYW1lfToje2xp
bmVOdW1iZXJ9IgorICAgIGVuZAorZW5kCisKK2NsYXNzIFRva2VuCisgICAgYXR0cl9yZWFkZXIg
Om9yaWdpbiwgOnN0cmluZworICAgIAorICAgIGRlZiBpbml0aWFsaXplKG9yaWdpbiwgc3RyaW5n
KQorICAgICAgICBAb3JpZ2luID0gb3JpZ2luCisgICAgICAgIEBzdHJpbmcgPSBzdHJpbmcKKyAg
ICBlbmQKKyAgICAKKyAgICBkZWYgPT0ob3RoZXIpCisgICAgICAgIGlmIG90aGVyLmlzX2E/IFRv
a2VuCisgICAgICAgICAgICBAc3RyaW5nID09IG90aGVyLnN0cmluZworICAgICAgICBlbHNlCisg
ICAgICAgICAgICBAc3RyaW5nID09IG90aGVyCisgICAgICAgIGVuZAorICAgIGVuZAorICAgIAor
ICAgIGRlZiA9fihvdGhlcikKKyAgICAgICAgQHN0cmluZyA9fiBvdGhlcgorICAgIGVuZAorICAg
IAorICAgIGRlZiB0b19zCisgICAgICAgICIje0BzdHJpbmcuaW5zcGVjdH0gYXQgI3tvcmlnaW59
IgorICAgIGVuZAorICAgIAorICAgIGRlZiBwYXJzZUVycm9yKCpjb21tZW50KQorICAgICAgICBp
ZiBjb21tZW50LmVtcHR5PworICAgICAgICAgICAgcmFpc2UgIlBhcnNlIGVycm9yOiAje3RvX3N9
IgorICAgICAgICBlbHNlCisgICAgICAgICAgICByYWlzZSAiUGFyc2UgZXJyb3I6ICN7dG9fc306
ICN7Y29tbWVudFswXX0iCisgICAgICAgIGVuZAorICAgIGVuZAorZW5kCisKK2RlZiBsZXgoc3Ry
LCBmaWxlTmFtZSkKKyAgICBmaWxlTmFtZSA9IFBhdGhuYW1lLm5ldyhmaWxlTmFtZSkKKyAgICBy
ZXN1bHQgPSBbXQorICAgIGxpbmVOdW1iZXIgPSAxCisgICAgd2hpbGUgbm90IHN0ci5lbXB0eT8K
KyAgICAgICAgY2FzZSBzdHIKKyAgICAgICAgd2hlbiAvXEFcIyhbXlxuXSopLworICAgICAgICAg
ICAgIyBjb21tZW50LCBpZ25vcmUKKyAgICAgICAgd2hlbiAvXEFcbi8KKyAgICAgICAgICAgICMg
bmV3bGluZSwgaWdub3JlCisgICAgICAgICAgICBsaW5lTnVtYmVyICs9IDEKKyAgICAgICAgd2hl
biAvXEFbYS16QS1aMC05JF0oW2EtekEtWjAtOV9dKikvCisgICAgICAgICAgICByZXN1bHQgPDwg
VG9rZW4ubmV3KE9yaWdpbi5uZXcoZmlsZU5hbWUsIGxpbmVOdW1iZXIpLCAkJikKKyAgICAgICAg
d2hlbiAvXEEoWyBcdFxyXSspLworICAgICAgICAgICAgIyB3aGl0ZXNwYWNlLCBpZ25vcmUKKyAg
ICAgICAgd2hlbiAvXEFbPSgpLF0vCisgICAgICAgICAgICByZXN1bHQgPDwgVG9rZW4ubmV3KE9y
aWdpbi5uZXcoZmlsZU5hbWUsIGxpbmVOdW1iZXIpLCAkJikKKyAgICAgICAgZWxzZQorICAgICAg
ICAgICAgcmFpc2UgIkxleGVyIGVycm9yIGF0ICN7T3JpZ2luLm5ldyhmaWxlTmFtZSwgbGluZU51
bWJlcikudG9fc30sIHVuZXhwZWN0ZWQgc2VxdWVuY2UgI3tzdHJbMC4uMjBdLmluc3BlY3R9Igor
ICAgICAgICBlbmQKKyAgICAgICAgc3RyID0gJH4ucG9zdF9tYXRjaAorICAgIGVuZAorICAgIHJl
c3VsdAorZW5kCisKK2RlZiBpc0tleXdvcmQodG9rZW4pCisgICAgIyBXZSBjYW4gZXh0ZW5kIHRo
aXMgYXMgd2UgYWRkIG1vcmUga2V5d29yZHMuIExpa2UsIHdlIG1pZ2h0IHdhbnQgImluY2x1ZGUi
IGV2ZW50dWFsbHkuCisgICAgdG9rZW4gPX4gL1xBKChtYXRjaGVyKSlcWi8KK2VuZAorCitkZWYg
aXNJZGVudGlmaWVyKHRva2VuKQorICAgIHRva2VuID1+IC9cQVthLXpBLVowLTkkXShbYS16QS1a
MC05X10qKVxaLyBhbmQgbm90IGlzS2V5d29yZCh0b2tlbikKK2VuZAorCitjbGFzcyBQYXJzZXIK
KyAgICBkZWYgaW5pdGlhbGl6ZShkYXRhLCBmaWxlTmFtZSkKKyAgICAgICAgQHRva2VucyA9IGxl
eChkYXRhLCBmaWxlTmFtZSkKKyAgICAgICAgQGlkeCA9IDAKKyAgICBlbmQKKworICAgIGRlZiB0
b2tlbgorICAgICAgICBAdG9rZW5zW0BpZHhdCisgICAgZW5kCisKKyAgICBkZWYgYWR2YW5jZQor
ICAgICAgICBAaWR4ICs9IDEKKyAgICBlbmQKKworICAgIGRlZiBwYXJzZUVycm9yKCpjb21tZW50
KQorICAgICAgICBpZiB0b2tlbgorICAgICAgICAgICAgdG9rZW4ucGFyc2VFcnJvcigqY29tbWVu
dCkKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgaWYgY29tbWVudC5lbXB0eT8KKyAgICAgICAg
ICAgICAgICByYWlzZSAiUGFyc2UgZXJyb3IgYXQgZW5kIG9mIGZpbGUiCisgICAgICAgICAgICBl
bHNlCisgICAgICAgICAgICAgICAgcmFpc2UgIlBhcnNlIGVycm9yIGF0IGVuZCBvZiBmaWxlOiAj
e2NvbW1lbnRbMF19IgorICAgICAgICAgICAgZW5kCisgICAgICAgIGVuZAorICAgIGVuZAorCisg
ICAgZGVmIGNvbnN1bWUoc3RyaW5nKQorICAgICAgICBwYXJzZUVycm9yKCJFeHBlY3RlZCAje3N0
cmluZ30iKSB1bmxlc3MgdG9rZW4gPT0gc3RyaW5nCisgICAgICAgIGFkdmFuY2UKKyAgICBlbmQK
KworICAgIGRlZiBjb25zdW1lSWRlbnRpZmllcgorICAgICAgICByZXN1bHQgPSB0b2tlbi5zdHJp
bmcKKyAgICAgICAgcGFyc2VFcnJvcigiRXhwZWN0ZWQgaWRlbnRpZmllciIpIHVubGVzcyBpc0lk
ZW50aWZpZXIocmVzdWx0KQorICAgICAgICBhZHZhbmNlCisgICAgICAgIHJlc3VsdAorICAgIGVu
ZAorCisgICAgZGVmIGFkZFVuaXF1ZShuYW1lLCBwcm9kdWN0aW9ucywgcHJvZHVjdGlvbikKKyAg
ICAgICAgaWYgbmFtZSA9PSBwcm9kdWN0aW9uLnZhck5hbWUKKyAgICAgICAgICAgIHBhcnNlRXJy
b3IoIkNoaWxkIHByb2R1Y3Rpb24gaGFzIHNhbWUgbmFtZSBhcyBwYXJlbnQgcHJvZHVjdGlvbiIp
CisgICAgICAgIGVuZAorICAgICAgICBpZiBwcm9kdWN0aW9ucy5kZXRlY3QgeyB8IGVudHJ5IHwg
ZW50cnkubmFtZSA9PSBwcm9kdWN0aW9uLm5hbWUgfQorICAgICAgICAgICAgcGFyc2VFcnJvcigi
RHVwbGljYXRlIHByb2R1Y3Rpb24iKQorICAgICAgICBlbmQKKyAgICAgICAgcHJvZHVjdGlvbnMg
PDwgcHJvZHVjdGlvbgorICAgIGVuZAorCisgICAgZGVmIHBhcnNlCisgICAgICAgIGNvbnN1bWUo
Im1hdGNoZXIiKQorCisgICAgICAgIG1hdGNoZXJOYW1lID0gY29uc3VtZUlkZW50aWZpZXIKKwor
ICAgICAgICBwcm9kdWN0aW9ucyA9IFtdCisKKyAgICAgICAgbG9vcCB7CisgICAgICAgICAgICBi
cmVhayBpZiBAaWR4ID49IEB0b2tlbnMubGVuZ3RoCisKKyAgICAgICAgICAgICMgV2UgbWlnaHQg
d2FudCB0byBzdXBwb3J0ICJpbmNsdWRlIi4gSWYgd2UgZGlkIHRoYXQsIGl0IHdvdWxkIGdvIGhl
cmUuCisgICAgICAgICAgICBhZGRVbmlxdWUobWF0Y2hlck5hbWUsIHByb2R1Y3Rpb25zLCBwYXJz
ZVByb2R1Y3Rpb24pCisgICAgICAgIH0KKworICAgICAgICBNYXRjaGVyLm5ldyhtYXRjaGVyTmFt
ZSwgcHJvZHVjdGlvbnMpCisgICAgZW5kCisKKyAgICBkZWYgcGFyc2VQcm9kdWN0aW9uCisgICAg
ICAgIG9yaWdpbiA9IHRva2VuLm9yaWdpbgorICAgICAgICBuYW1lID0gY29uc3VtZUlkZW50aWZp
ZXIKKworICAgICAgICBpZiB0b2tlbiA9PSAiPSIKKyAgICAgICAgICAgIGNvbnN1bWUoIj0iKQor
ICAgICAgICAgICAgb3Bjb2RlID0gY29uc3VtZUlkZW50aWZpZXIKKyAgICAgICAgICAgIGNvbnN1
bWUoIigiKQorICAgICAgICBlbHNpZiB0b2tlbiA9PSAiKCIKKyAgICAgICAgICAgIGNvbnN1bWUo
IigiKQorICAgICAgICAgICAgb3Bjb2RlID0gbmFtZQorICAgICAgICAgICAgbmFtZSA9IG5pbAor
ICAgICAgICBlbHNlCisgICAgICAgICAgICByZXR1cm4gUHJvZHVjdGlvbi5uZXcob3JpZ2luLCBu
YW1lLCBuaWwsIG5pbCkKKyAgICAgICAgZW5kCisgICAgICAgIAorICAgICAgICBwcm9kdWN0aW9u
cyA9IFtdCisgICAgICAgIGxvb3AgeworICAgICAgICAgICAgYnJlYWsgaWYgdG9rZW4gPT0gIiki
CisKKyAgICAgICAgICAgIGFkZFVuaXF1ZShuYW1lLCBwcm9kdWN0aW9ucywgcGFyc2VQcm9kdWN0
aW9uKQorCisgICAgICAgICAgICBicmVhayBpZiB0b2tlbiA9PSAiKSIKKyAgICAgICAgICAgIGNv
bnN1bWUoIiwiKQorICAgICAgICB9CisKKyAgICAgICAgIyBBZHZhbmNlIGFmdGVyIHRoZSAiKSIK
KyAgICAgICAgYWR2YW5jZQorCisgICAgICAgIFByb2R1Y3Rpb24ubmV3KG9yaWdpbiwgbmFtZSwg
b3Bjb2RlLCBwcm9kdWN0aW9ucykKKyAgICBlbmQKK2VuZAorCitmaWxlTmFtZSA9IEFSR1ZbMF0K
KworcGFyc2VyID0gUGFyc2VyLm5ldyhJTzo6cmVhZChmaWxlTmFtZSksIGZpbGVOYW1lKQorbWF0
Y2hlciA9IHBhcnNlci5wYXJzZQorCitjbGFzcyBTdWJNYXRjaAorICAgIGF0dHJfcmVhZGVyIDpp
bmRleE1hcCwgOnByb2R1Y3Rpb25zCisgICAgCisgICAgZGVmIGluaXRpYWxpemUoaW5kZXhMaXN0
LCBwcm9kdWN0aW9ucykKKyAgICAgICAgQGluZGV4TWFwID0gW10KKyAgICAgICAgQHByb2R1Y3Rp
b25zID0gW10KKyAgICAgICAgaW5kZXhMaXN0LmVhY2ggeworICAgICAgICAgICAgfCBpbmRleCB8
CisgICAgICAgICAgICBAaW5kZXhNYXAgPDwgaW5kZXgKKyAgICAgICAgICAgIEBwcm9kdWN0aW9u
cyA8PCBwcm9kdWN0aW9uc1tpbmRleF0KKyAgICAgICAgfQorICAgIGVuZAorCisgICAgZGVmIG1h
cEluZGV4TGlzdChpbmRleExpc3QpCisgICAgICAgIGluZGV4TGlzdC5tYXAgeworICAgICAgICAg
ICAgfCBpbmRleCB8CisgICAgICAgICAgICBAaW5kZXhNYXBbaW5kZXhdCisgICAgICAgIH0KKyAg
ICBlbmQKK2VuZAorCitGaWxlLm9wZW4oIkIzIiArIG1hdGNoZXIubmFtZSArICIuaCIsICJ3Iikg
eworICAgIHwgb3V0cCB8CisKKyAgICBvdXRwLnB1dHMgIi8vIEdlbmVyYXRlZCBieSBnZW5lcmF0
ZV9wYXR0ZXJuX21hdGNoZXIucmIgZnJvbSAje2ZpbGVOYW1lfSAtLSBkbyBub3QgZWRpdCEiCisK
KyAgICBvdXRwLnB1dHMgIiNpZm5kZWYgQjMje21hdGNoZXIubmFtZX1faCIKKyAgICBvdXRwLnB1
dHMgIiNkZWZpbmUgQjMje21hdGNoZXIubmFtZX1faCIKKyAgICAKKyAgICBvdXRwLnB1dHMgIiNp
bmNsdWRlIFwiQjNWYWx1ZS5oXCIiCisgICAgCisgICAgb3V0cC5wdXRzICJuYW1lc3BhY2UgSlND
IHsgbmFtZXNwYWNlIEIzIHsiCisKKyAgICBvdXRwLnB1dHMgInRlbXBsYXRlPHR5cGVuYW1lIEFk
YXB0b3I+IgorICAgIG91dHAucHV0cyAidm9pZCBydW4je21hdGNoZXIubmFtZX0oVmFsdWUqIF92
YWx1ZSwgQWRhcHRvciYgYWRhcHRvcikiCisgICAgb3V0cC5wdXRzICJ7IgorCisgICAgIyBOb3Rl
IHRoYXQgdGhpcyBkb2VzIG5vdCBlbWl0IHByb3Blcmx5IGluZGVudGVkIGNvZGUsIGJlY2F1c2Ug
aXQncyBhIHJlY3Vyc2l2ZSBlbWl0dGVyLiBJZiB5b3UKKyAgICAjIHdhbnQgdG8gc2VlIHRoZSBj
b2RlIG5pY2VseSBmb3JtYXR0ZWQsIG9wZW4gaXQgaW4gYSBnb29kIHRleHQgZWRpdG9yIGFuZCBh
c2sgaXQgdG8gZm9ybWF0IGl0CisgICAgIyBmb3IgeW91LgorCisgICAgIyBJbiBvZGQgc2l0dWF0
aW9ucywgd2UgbWF5IG5vdCB1c2UgdGhlIGlucHV0IHZhbHVlLiBUZWxsIHRoZSBjb21waWxlciB0
byBjaGlsbCBvdXQgYWJvdXQgaXQuCisgICAgb3V0cC5wdXRzICJVTlVTRURfUEFSQU0oX3ZhbHVl
KTsiCisgICAgICAgIAorICAgICMgVGhpcyBqdXN0IHByb3RlY3RzIHRoZSBjYWxsZXIgZnJvbSBo
YXZpbmcgdG8gd29ycnkgYWJvdXQgcHJvZHVjdGlvbnMgaGF2aW5nIGRpZmZlcmVudCBsZW5ndGhz
LgorICAgIGRlZiBtYXRjaExlbmd0aChvdXRwLCB2YWx1ZU5hbWUsIHByb2R1Y3Rpb25zKQorICAg
ICAgICBpbmRleExpc3RzID0gW10KKyAgICAgICAgcHJvZHVjdGlvbnMuZWFjaF93aXRoX2luZGV4
IHsKKyAgICAgICAgICAgIHwgcHJvZHVjdGlvbiwgaW5kZXggfAorICAgICAgICAgICAgaWYgaW5k
ZXhMaXN0c1stMV0gYW5kIHByb2R1Y3Rpb25zW2luZGV4TGlzdHNbLTFdWzBdXS5jaGlsZHJlbi5s
ZW5ndGggPT0gcHJvZHVjdGlvbi5jaGlsZHJlbi5sZW5ndGgKKyAgICAgICAgICAgICAgICBpbmRl
eExpc3RzWy0xXSA8PCBpbmRleAorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIGlu
ZGV4TGlzdHMgPDwgW2luZGV4XQorICAgICAgICAgICAgZW5kCisgICAgICAgIH0KKworICAgICAg
ICBpbmRleExpc3RzLmVhY2ggeworICAgICAgICAgICAgfCBpbmRleExpc3QgfAorICAgICAgICAg
ICAgbGVuZ3RoID0gcHJvZHVjdGlvbnNbaW5kZXhMaXN0WzBdXS5jaGlsZHJlbi5sZW5ndGgKKyAg
ICAgICAgICAgIGlmIGxlbmd0aCA+IDAKKyAgICAgICAgICAgICAgICBvdXRwLnB1dHMgImlmICgj
e3ZhbHVlTmFtZX0tPmNoaWxkcmVuLnNpemUoKSA+PSAje2xlbmd0aH0pIHsiCisgICAgICAgICAg
ICAgICAgeWllbGQgaW5kZXhMaXN0CisgICAgICAgICAgICAgICAgb3V0cC5wdXRzICJ9IgorICAg
ICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHlpZWxkIGluZGV4TGlzdAorICAgICAgICAg
ICAgZW5kCisgICAgICAgIH0KKyAgICBlbmQKKworICAgICMgVGhpcyBlZmZpY2llbnRseSBzZWxl
Y3RzIGZyb20gdGhlIGdpdmVuIHNldCBvZiBwcm9kdWN0aW9ucy4gSXQgYXNzdW1lcyB0aGF0IHBy
b2R1Y3Rpb25zCisgICAgIyBhcmUgbm90IGR1cGxpY2F0ZWQuIEl0IHlpZWxkcyB0aGUgaW5kZXgg
b2YgdGhlIGZvdW5kIHByb2R1Y3Rpb24sIGFuZCB0aGUgY29yb3V0aW5lIGlzCisgICAgIyByZXNw
b25zaWJsZSBmb3IgZW1pdHRpbmcgc3BlY2lmaWMgY29kZSBmb3IgdGhhdCBwcm9kdWN0aW9uLiBU
aGUgY29yb3V0aW5lIGlzIGdpdmVuIGxpc3RzIG9mCisgICAgIyBpbmRpY2VzIG9mIHBvc3NpYmx5
LW1hdGNoaW5nIHByb2R1Y3Rpb25zLgorICAgIGRlZiBtYXRjaFByb2R1Y3Rpb25zKG91dHAsIHZh
bHVlTmFtZSwgcHJvZHVjdGlvbnMpCisgICAgICAgICMgRmlyc3QsIHNwbGl0IHRoZSBwcm9kdWN0
aW9ucyBsaXN0IGludG8gcnVucyBvZiBwcm9kdWN0aW9ucyB3aXRoIGFuIG9wY29kZSBhbmQgcHJv
ZHVjdGlvbnMKKyAgICAgICAgIyB3aXRob3V0IG9uZS4KKyAgICAgICAgaW5kZXhMaXN0cyA9IFtd
CisgICAgICAgIHByb2R1Y3Rpb25zLmVhY2hfd2l0aF9pbmRleCB7CisgICAgICAgICAgICB8IHBy
b2R1Y3Rpb24sIGluZGV4IHwKKyAgICAgICAgICAgIGlmIGluZGV4TGlzdHNbLTFdIGFuZCBwcm9k
dWN0aW9uc1tpbmRleExpc3RzWy0xXVswXV0uaGFzT3Bjb2RlID09IHByb2R1Y3Rpb24uaGFzT3Bj
b2RlCisgICAgICAgICAgICAgICAgaW5kZXhMaXN0c1stMV0gPDwgaW5kZXgKKyAgICAgICAgICAg
IGVsc2UKKyAgICAgICAgICAgICAgICBpbmRleExpc3RzIDw8IFtpbmRleF0KKyAgICAgICAgICAg
IGVuZAorICAgICAgICB9CisgICAgICAgIAorICAgICAgICAjIE5vdywgZW1pdCBwYXR0ZXJuIG1h
dGNoaW5nIGNvZGUuIFdlIGRvIGl0IGRpZmZlcmVudGx5IGZvciBsaXN0cyB3aXRoIGFuIG9wY29k
ZSB0aGFuIGZvcgorICAgICAgICAjIGxpc3RzIHdpdGhvdXQgb25lLgorICAgICAgICBpbmRleExp
c3RzLmVhY2ggeworICAgICAgICAgICAgfCBpbmRleExpc3QgfAorICAgICAgICAgICAgaWYgcHJv
ZHVjdGlvbnNbaW5kZXhMaXN0WzBdXS5oYXNPcGNvZGUKKyAgICAgICAgICAgICAgICAjIE5vdywg
d2Ugc3BsaXQgdGhpcyBpbmRleCBsaXN0IGludG8gZ3JvdXBzIGZvciBlYWNoIG9wY29kZS4KKyAg
ICAgICAgICAgICAgICBncm91cHMgPSB7fQorICAgICAgICAgICAgICAgIGluZGV4TGlzdC5lYWNo
IHsKKyAgICAgICAgICAgICAgICAgICAgfCBpbmRleCB8CisgICAgICAgICAgICAgICAgICAgIHBy
b2R1Y3Rpb24gPSBwcm9kdWN0aW9uc1tpbmRleF0KKyAgICAgICAgICAgICAgICAgICAgaWYgZ3Jv
dXBzW3Byb2R1Y3Rpb24ub3Bjb2RlXQorICAgICAgICAgICAgICAgICAgICAgICAgZ3JvdXBzW3By
b2R1Y3Rpb24ub3Bjb2RlXSA8PCBpbmRleAorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAg
ICAgICAgICAgICAgICAgICAgICBncm91cHNbcHJvZHVjdGlvbi5vcGNvZGVdID0gW2luZGV4XQor
ICAgICAgICAgICAgICAgICAgICBlbmQKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAg
ICAgICAjIEVtaXQgYSBzd2l0Y2ggc3RhdGVtZW50LgorICAgICAgICAgICAgICAgIG91dHAucHV0
cyAic3dpdGNoICgje3ZhbHVlTmFtZX0tPm9wY29kZSgpKSB7IgorICAgICAgICAgICAgICAgIGdy
b3Vwcy5lYWNoX3BhaXIgeworICAgICAgICAgICAgICAgICAgICB8IG9wY29kZSwgc3ViSW5kZXhM
aXN0IHwKKyAgICAgICAgICAgICAgICAgICAgb3V0cC5wdXRzICJjYXNlICN7b3Bjb2RlfToiCisg
ICAgICAgICAgICAgICAgICAgIHN1Yk1hdGNoID0gU3ViTWF0Y2gubmV3KHN1YkluZGV4TGlzdCwg
cHJvZHVjdGlvbnMpCisgICAgICAgICAgICAgICAgICAgIG1hdGNoTGVuZ3RoKG91dHAsIHZhbHVl
TmFtZSwgc3ViTWF0Y2gucHJvZHVjdGlvbnMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHwg
aW5kZXhMaXN0IHwKKyAgICAgICAgICAgICAgICAgICAgICAgIHlpZWxkIHN1Yk1hdGNoLm1hcElu
ZGV4TGlzdChpbmRleExpc3QpCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAg
ICAgICAgb3V0cC5wdXRzICJicmVhazsiCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAg
ICAgIG91dHAucHV0cyAiZGVmYXVsdDoiCisgICAgICAgICAgICAgICAgb3V0cC5wdXRzICJicmVh
azsiCisgICAgICAgICAgICAgICAgb3V0cC5wdXRzICJ9IgorICAgICAgICAgICAgZWxzZQorICAg
ICAgICAgICAgICAgIHN1Yk1hdGNoID0gU3ViTWF0Y2gubmV3KGluZGV4TGlzdCwgcHJvZHVjdGlv
bnMpCisgICAgICAgICAgICAgICAgbWF0Y2hMZW5ndGgob3V0cCwgdmFsdWVOYW1lLCBzdWJNYXRj
aC5wcm9kdWN0aW9ucykgeworICAgICAgICAgICAgICAgICAgICB8IGluZGV4TGlzdCB8CisgICAg
ICAgICAgICAgICAgICAgIHlpZWxkIHN1Yk1hdGNoLm1hcEluZGV4TGlzdChpbmRleExpc3QpCisg
ICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgZW5kCisgICAgICAgIH0KKyAgICBlbmQKKwor
ICAgICMgVGFrZXMgcHJvZHVjdGlvbnMgdGhhdCBoYXZlIHRoZSBzYW1lIG9wY29kZSBhbmQgdGhl
IHNhbWUgbGVuZ3RoIGFuZCBzZWxlY3RzIGZyb20gdGhlbSBiYXNlZCBvbgorICAgICMgdGhlIHBy
b2R1Y3Rpb25zIGF0IHRoZSBnaXZlbiBjb2x1bW4uCisgICAgZGVmIG1hdGNoQ29sdW1uKG91dHAs
IHZhbHVlTmFtZSwgcHJvZHVjdGlvbnMsIGNvbHVtbkluZGV4KQorICAgICAgICBpZiBjb2x1bW5J
bmRleCA+PSBwcm9kdWN0aW9uc1swXS5jaGlsZHJlbi5sZW5ndGgKKyAgICAgICAgICAgIHlpZWxk
ICgwLi4uKHByb2R1Y3Rpb25zLnNpemUpKS50b19hCisgICAgICAgICAgICByZXR1cm4KKyAgICAg
ICAgZW5kCisKKyAgICAgICAgc3ViVmFsdWUgPSBuZXdWYXIKKyAgICAgICAgCisgICAgICAgIG91
dHAucHV0cyAieyIKKyAgICAgICAgb3V0cC5wdXRzICJWYWx1ZSogI3tzdWJWYWx1ZX0gPSAje3Zh
bHVlTmFtZX0tPmNoaWxkKCN7Y29sdW1uSW5kZXh9KTsiCisKKyAgICAgICAgIyBXZSBtYXkgbm90
IHVzZSB0aGlzIHZhbHVlLiBUZWxsIHRoZSBjb21waWxlciB0byBjaGlsbCBvdXQgYWJvdXQgaXQu
CisgICAgICAgIG91dHAucHV0cyAiVU5VU0VEX1BBUkFNKCN7c3ViVmFsdWV9KTsiCisgICAgICAg
IAorICAgICAgICBzdWJQcm9kdWN0aW9ucyA9IHByb2R1Y3Rpb25zLm1hcCB7CisgICAgICAgICAg
ICB8IHByb2R1Y3Rpb24gfAorICAgICAgICAgICAgcHJvZHVjdGlvbi5jaGlsZHJlbltjb2x1bW5J
bmRleF0KKyAgICAgICAgfQorCisgICAgICAgIG1hdGNoUmVjdXJzaXZlbHkob3V0cCwgc3ViVmFs
dWUsIHN1YlByb2R1Y3Rpb25zKSB7CisgICAgICAgICAgICB8IGluZGV4TGlzdCB8CisgICAgICAg
ICAgICBzdWJNYXRjaCA9IFN1Yk1hdGNoLm5ldyhpbmRleExpc3QsIHByb2R1Y3Rpb25zKQorICAg
ICAgICAgICAgbWF0Y2hDb2x1bW4ob3V0cCwgdmFsdWVOYW1lLCBzdWJNYXRjaC5wcm9kdWN0aW9u
cywgY29sdW1uSW5kZXggKyAxKSB7CisgICAgICAgICAgICAgICAgfCBpbmRleExpc3QgfAorICAg
ICAgICAgICAgICAgIHlpZWxkIHN1Yk1hdGNoLm1hcEluZGV4TGlzdChpbmRleExpc3QpCisgICAg
ICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBvdXRwLnB1dHMgIn0iCisgICAgZW5kCisK
KyAgICBkZWYgbWF0Y2hSZWN1cnNpdmVseShvdXRwLCB2YWx1ZU5hbWUsIHByb2R1Y3Rpb25zKQor
ICAgICAgICBtYXRjaFByb2R1Y3Rpb25zKG91dHAsIHZhbHVlTmFtZSwgcHJvZHVjdGlvbnMpIHsK
KyAgICAgICAgICAgIHwgaW5kZXhMaXN0IHwKKyAgICAgICAgICAgICMgV2UgYXJlIGd1YXJhbnRl
ZWQgdGhhdCB0aGlzIGluZGV4IGxpc3QgY29udGFpbnMgcHJvZHVjdGlvbnMgd2l0aCB0aGUgc2Ft
ZSBvcGNvZGUgYW5kCisgICAgICAgICAgICAjIHRoZSBzYW1lIGxlbmd0aC4KKyAgICAgICAgICAg
IHN1Yk1hdGNoID0gU3ViTWF0Y2gubmV3KGluZGV4TGlzdCwgcHJvZHVjdGlvbnMpCisgICAgICAg
ICAgICBtYXRjaENvbHVtbihvdXRwLCB2YWx1ZU5hbWUsIHN1Yk1hdGNoLnByb2R1Y3Rpb25zLCAw
KSB7CisgICAgICAgICAgICAgICAgfCBpbmRleExpc3QgfAorICAgICAgICAgICAgICAgIHlpZWxk
IHN1Yk1hdGNoLm1hcEluZGV4TGlzdChpbmRleExpc3QpCisgICAgICAgICAgICB9CisgICAgICAg
IH0KKyAgICBlbmQKKworICAgIG1hdGNoUmVjdXJzaXZlbHkob3V0cCwgIl92YWx1ZSIsIG1hdGNo
ZXIucHJvZHVjdGlvbnMpIHsKKyAgICAgICAgfCBpbmRleExpc3QgfAorICAgICAgICBpbmRleExp
c3QuZWFjaCB7CisgICAgICAgICAgICB8IGluZGV4IHwKKyAgICAgICAgICAgIHByb2R1Y3Rpb24g
PSBtYXRjaGVyLnByb2R1Y3Rpb25zW2luZGV4XQorICAgICAgICAgICAgb3V0cC5wdXRzICJ7Igor
ICAgICAgICAgICAgb3V0cC5wdXRzICJWYWx1ZSogI3twcm9kdWN0aW9uLnZhck5hbWV9ID0gX3Zh
bHVlOyIKKyAgICAgICAgICAgIGludGVybmFsQXJndW1lbnRzID0gW10KKyAgICAgICAgICAgIG9w
ZXJhbmRBcmd1bWVudHMgPSBbXQorICAgICAgICAgICAgdHJ5QXJndW1lbnRzID0gW10KKyAgICAg
ICAgICAgIG51bVNjb3BlcyA9IDAKKyAgICAgICAgICAgIHByb2R1Y3Rpb24uZWFjaFZhcmlhYmxl
IHsKKyAgICAgICAgICAgICAgICB8IHBhcmVudFZhck5hbWUsIGNoaWxkTmFtZSwgY2hpbGRWYXJO
YW1lLCBraW5kLCBpbmRleCB8CisgICAgICAgICAgICAgICAgb3V0cC5wdXRzICJWYWx1ZSogI3tj
aGlsZFZhck5hbWV9ID0gI3twYXJlbnRWYXJOYW1lfS0+Y2hpbGQoI3tpbmRleH0pOyIKKworICAg
ICAgICAgICAgICAgIGlmIGNoaWxkTmFtZSA9fiAvXEFcJC8KKyAgICAgICAgICAgICAgICAgICAg
aWYgY2hpbGROYW1lID1+IC9cQVwkKFswLTldKylcWi8KKyAgICAgICAgICAgICAgICAgICAgICAg
IG91dHAucHV0cyAiaWYgKCN7Y2hpbGRWYXJOYW1lfS0+aXNJbnQoI3skMX0pKSB7IgorICAgICAg
ICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICBvdXRwLnB1dHMgImlm
ICgje2NoaWxkVmFyTmFtZX0tPmhhc0ludCgpKSB7IgorICAgICAgICAgICAgICAgICAgICBlbmQK
KyAgICAgICAgICAgICAgICAgICAgbnVtU2NvcGVzICs9IDEKKyAgICAgICAgICAgICAgICBlbmQK
KyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBpbnRlcm5hbEFyZ3VtZW50cyA8PCBj
aGlsZFZhck5hbWUgaWYga2luZCA9PSA6aW50ZXJuYWwgb3Iga2luZCA9PSA6YW5vbkludGVybmFs
CisgICAgICAgICAgICAgICAgb3BlcmFuZEFyZ3VtZW50cyA8PCBjaGlsZFZhck5hbWUgaWYga2lu
ZCA9PSA6b3BlcmFuZCBvciBraW5kID09IDphbm9uT3BlcmFuZAorICAgICAgICAgICAgICAgIHRy
eUFyZ3VtZW50cyA8PCBjaGlsZFZhck5hbWUgaWYga2luZCA9PSA6aW50ZXJuYWwgb3Iga2luZCA9
PSA6b3BlcmFuZAorICAgICAgICAgICAgfQorICAgICAgICAgICAgb3V0cC5wdXRzICJpZiAoYWRh
cHRvci5hY2NlcHRSb290KF92YWx1ZSkiCisgICAgICAgICAgICBvdXRwLnB1dHMoIiAgICAmJiBh
ZGFwdG9yLmFjY2VwdEludGVybmFscygiICsgaW50ZXJuYWxBcmd1bWVudHMuam9pbigiLCAiKSAr
ICIpIikKKyAgICAgICAgICAgIG91dHAucHV0cygiICAgICYmIGFkYXB0b3IuYWNjZXB0T3BlcmFu
ZHMoIiArIG9wZXJhbmRBcmd1bWVudHMuam9pbigiLCAiKSArICIpIikKKyAgICAgICAgICAgIG91
dHAucHV0cygiICAgICYmIGFkYXB0b3IudHJ5I3twcm9kdWN0aW9uLm5hbWV9KCIgKyB0cnlBcmd1
bWVudHMuam9pbigiLCAiKSArICIpKSIpCisgICAgICAgICAgICBvdXRwLnB1dHMgIiAgICByZXR1
cm47IgorICAgICAgICAgICAgbnVtU2NvcGVzLnRpbWVzIHsKKyAgICAgICAgICAgICAgICBvdXRw
LnB1dHMgIn0iCisgICAgICAgICAgICB9CisgICAgICAgICAgICBvdXRwLnB1dHMgIn0iCisgICAg
ICAgIH0KKyAgICB9CisgICAgCisgICAgb3V0cC5wdXRzICIgICAgUkVMRUFTRV9BU1NFUlRfTk9U
X1JFQUNIRUQoKTsiCisgICAgb3V0cC5wdXRzICJ9IgorICAgIAorICAgIG91dHAucHV0cyAifSB9
IC8vIG5hbWVzcGFjZSBKU0M6OkIzIgorCisgICAgb3V0cC5wdXRzICIjZW5kaWYgLy8gQjMje21h
dGNoZXIubmFtZX1faCIKK30KSW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9haXIvQWly
QXJnLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvYWlyL0FpckFy
Zy5jcHAJKHJldmlzaW9uIDApCisrKyBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvYWlyL0FpckFy
Zy5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSw3NSBAQAorLyoKKyAqIENvcHlyaWdodCAo
QykgMjAxNSBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmli
dXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0
CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93
aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291
cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0
aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICog
Mi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92
ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRo
ZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29y
IG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICog
VEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5Z
CisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJ
TUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBB
TkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAg
SU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJM
RSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVN
UExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlU
RUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBM
T1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElP
TikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hF
VEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElO
RyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUg
VVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklM
SVRZIE9GIFNVQ0ggREFNQUdFLiAKKyAqLworCisjaW5jbHVkZSAiY29uZmlnLmgiCisjaW5jbHVk
ZSAiQWlyQXJnLmgiCisKK25hbWVzcGFjZSBKU0MgeyBuYW1lc3BhY2UgQjMgeyBuYW1lc3BhY2Ug
QWlyIHsKKwordm9pZCBBcmc6OmR1bXAoUHJpbnRTdHJlYW0mIG91dCkgY29uc3QKK3sKKyAgICBz
d2l0Y2ggKG1fa2luZCkgeworICAgIGNhc2UgVG1wOgorICAgICAgICBvdXQucHJpbnQodG1wKCkp
OworICAgICAgICByZXR1cm47CisgICAgY2FzZSBJbW06CisgICAgICAgIG91dC5wcmludCgiJCIs
IG1fb2Zmc2V0KTsKKyAgICAgICAgcmV0dXJuOworICAgIGNhc2UgSW1tUHRyOgorICAgICAgICBv
dXQucHJpbnRmKCIkMHgleCIsIG1fb2Zmc2V0KTsKKyAgICAgICAgcmV0dXJuOworICAgIGNhc2Ug
QWRkcjoKKyAgICAgICAgaWYgKG9mZnNldCgpKQorICAgICAgICAgICAgb3V0LnByaW50KG9mZnNl
dCgpKTsKKyAgICAgICAgb3V0LnByaW50KCIoIiwgYmFzZSgpLCAiKSIpOworICAgICAgICByZXR1
cm47CisgICAgY2FzZSBJbmRleDoKKyAgICAgICAgaWYgKG9mZnNldCgpKQorICAgICAgICAgICAg
b3V0LnByaW50KG9mZnNldCgpKTsKKyAgICAgICAgb3V0LnByaW50KCIoIiwgYmFzZSgpLCAiLCIs
IGluZGV4KCkpOworICAgICAgICBpZiAoc2NhbGUoKSAhPSAxKQorICAgICAgICAgICAgb3V0LnBy
aW50KCIsIiwgc2NhbGUoKSk7CisgICAgICAgIG91dC5wcmludCgiKSIpOworICAgICAgICByZXR1
cm47CisgICAgY2FzZSBTdGFjazoKKyAgICAgICAgaWYgKG9mZnNldCgpKQorICAgICAgICAgICAg
b3V0LnByaW50KG9mZnNldCk7CisgICAgICAgIG91dC5wcmludCgiKCIsIHBvaW50ZXJEdW1wKHN0
YWNrU2xvdCgpKSwgIikiKTsKKyAgICAgICAgcmV0dXJuOworICAgIGNhc2UgQ2FsbEFyZzoKKyAg
ICAgICAgaWYgKG9mZnNldCgpKQorICAgICAgICAgICAgb3V0LnByaW50KG9mZnNldCk7CisgICAg
ICAgIG91dC5wcmludCgiKGNhbGxBcmcpIik7CisgICAgICAgIHJldHVybjsKKyAgICBjYXNlIFNw
ZWNpYWw6CisgICAgICAgIG91dC5wcmludCgiJiIsIHBvaW50ZXJEdW1wKHNwZWNpYWwoKSkpOwor
ICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgUkVMRUFTRV9BU1NFUlRfTk9UX1JFQUNIRUQo
KTsKK30KKworfSB9IH0gLy8gbmFtZXNwYWNlIEpTQzo6QjM6OkFpcgorCkluZGV4OiBTb3VyY2Uv
SmF2YVNjcmlwdENvcmUvYjMvYWlyL0FpckFyZy5oCj09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZh
U2NyaXB0Q29yZS9iMy9haXIvQWlyQXJnLmgJKHJldmlzaW9uIDApCisrKyBTb3VyY2UvSmF2YVNj
cmlwdENvcmUvYjMvYWlyL0FpckFyZy5oCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsNDk4IEBA
CisvKgorICogQ29weXJpZ2h0IChDKSAyMDE1IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZl
ZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZv
cm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92
aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJl
ZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJp
Z2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93
aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVz
dCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qg
b2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAg
ZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRp
c3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElO
Qy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJ
TkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMg
T0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBP
U0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SCisgKiBD
T05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRB
TCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNM
VURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUg
R09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1Ig
QlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQor
ICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBP
UiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElO
IEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURW
SVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisKKyNpZm5kZWYg
QWlyQXJnX2gKKyNkZWZpbmUgQWlyQXJnX2gKKworI2luY2x1ZGUgIkFpclRtcC5oIgorCituYW1l
c3BhY2UgSlNDIHsgbmFtZXNwYWNlIEIzIHsgbmFtZXNwYWNlIEFpciB7CisKK2NsYXNzIFNwZWNp
YWw7CitjbGFzcyBTdGFja1Nsb3Q7CisKKy8vIFRoaXMgY2xhc3MgbmFtZSBpcyBhbHNvIGludGVu
dGlvbmFsbHkgdGVyc2UgYmVjYXVzZSB3ZSB3aWxsIHNheSBpdCBhIGxvdC4gWW91J2xsIHNlZSBj
b2RlIGxpa2UKKy8vIEluc3QoLi4uLCBBcmc6OmltbSg1KSwgQXJnOjphZGRyKHRoaW5nLCBibGFo
KSwgLi4uKQorY2xhc3MgQXJnIHsKK3B1YmxpYzoKKyAgICAvLyBUaGVzZSBlbnVtIG1lbWJlcnMg
YXJlIGludGVudGlvbmFsbHkgdGVyc2UgYmVjYXVzZSB3ZSBoYXZlIHRvIG1lbnRpb24gdGhlbSBh
IGxvdC4KKyAgICBlbnVtIEtpbmQgOiBpbnQ4X3QgeworICAgICAgICBUbXAsCisgICAgICAgIElt
bSwKKyAgICAgICAgSW1tUHRyLAorICAgICAgICBBZGRyLAorICAgICAgICBTdGFjaywKKyAgICAg
ICAgQ2FsbEFyZywKKyAgICAgICAgSW5kZXgsCisgICAgICAgIFNwZWNpYWwKKyAgICB9OworCisg
ICAgZW51bSBSb2xlIDogaW50OF90IHsKKyAgICAgICAgVXNlLAorICAgICAgICBEZWYsCisgICAg
ICAgIFVzZURlZgorICAgIH07CisKKyAgICBlbnVtIFR5cGUgOiBpbnQ4X3QgeworICAgICAgICBH
UCwKKyAgICAgICAgRlAKKyAgICB9OworCisgICAgc3RhdGljIGJvb2wgaXNVc2UoUm9sZSByb2xl
KQorICAgIHsKKyAgICAgICAgc3dpdGNoIChyb2xlKSB7CisgICAgICAgIGNhc2UgVXNlOgorICAg
ICAgICBjYXNlIFVzZURlZjoKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICBjYXNl
IERlZjoKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KKworICAg
IHN0YXRpYyBib29sIGlzRGVmKFJvbGUgcm9sZSkKKyAgICB7CisgICAgICAgIHN3aXRjaCAocm9s
ZSkgeworICAgICAgICBjYXNlIFVzZToKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAg
ICAgY2FzZSBEZWY6CisgICAgICAgIGNhc2UgVXNlRGVmOgorICAgICAgICAgICAgcmV0dXJuIHRy
dWU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBBcmcoKQorICAgIHsKKyAgICB9CisKKyAgICBB
cmcoQWlyOjpUbXAgdG1wKQorICAgICAgICA6IG1fa2luZChUbXApCisgICAgICAgICwgbV9iYXNl
KHRtcCkKKyAgICB7CisgICAgfQorCisgICAgc3RhdGljIEFyZyBpbW0oaW50cHRyX3QgdmFsdWUp
CisgICAgeworICAgICAgICBBcmcgcmVzdWx0OworICAgICAgICByZXN1bHQubV9raW5kID0gSW1t
OworICAgICAgICByZXN1bHQubV9vZmZzZXQgPSB2YWx1ZTsKKyAgICAgICAgcmV0dXJuIHJlc3Vs
dDsKKyAgICB9CisKKyAgICBzdGF0aWMgQXJnIGltbVB0cihpbnRwdHJfdCB2YWx1ZSkKKyAgICB7
CisgICAgICAgIEFyZyByZXN1bHQ7CisgICAgICAgIHJlc3VsdC5tX2tpbmQgPSBJbW1QdHI7Cisg
ICAgICAgIHJlc3VsdC5tX29mZnNldCA9IHZhbHVlOworICAgICAgICByZXR1cm4gcmVzdWx0Owor
ICAgIH0KKworICAgIHN0YXRpYyBBcmcgYWRkcmVzcyhBaXI6OlRtcCBiYXNlLCBpbnQzMl90IG9m
ZnNldCA9IDApCisgICAgeworICAgICAgICBBU1NFUlQoYmFzZS5pc0dQKCkpOworICAgICAgICBB
cmcgcmVzdWx0OworICAgICAgICByZXN1bHQubV9raW5kID0gQWRkcjsKKyAgICAgICAgcmVzdWx0
Lm1fYmFzZSA9IGJhc2U7CisgICAgICAgIHJlc3VsdC5tX29mZnNldCA9IG9mZnNldDsKKyAgICAg
ICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisKKyAgICBzdGF0aWMgQXJnIHN0YWNrKFN0YWNrU2xv
dCogdmFsdWUsIGludDMyX3Qgb2Zmc2V0ID0gMCkKKyAgICB7CisgICAgICAgIEFyZyByZXN1bHQ7
CisgICAgICAgIHJlc3VsdC5tX2tpbmQgPSBTdGFjazsKKyAgICAgICAgcmVzdWx0Lm1fb2Zmc2V0
ID0gYml0d2lzZV9jYXN0PGludHB0cl90Pih2YWx1ZSk7CisgICAgICAgIHJlc3VsdC5tX3NjYWxl
ID0gb2Zmc2V0OyAvLyBJIGtub3csIHl1Y2suCisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAg
fQorCisgICAgc3RhdGljIEFyZyBjYWxsQXJnKGludDMyX3Qgb2Zmc2V0KQorICAgIHsKKyAgICAg
ICAgQXJnIHJlc3VsdDsKKyAgICAgICAgcmVzdWx0Lm1fa2luZCA9IENhbGxBcmc7CisgICAgICAg
IHJlc3VsdC5tX29mZnNldCA9IG9mZnNldDsKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9
CisKKyAgICBzdGF0aWMgYm9vbCBpc1ZhbGlkU2NhbGUodW5zaWduZWQgc2NhbGUpCisgICAgewor
ICAgICAgICBzd2l0Y2ggKHNjYWxlKSB7CisgICAgICAgIGNhc2UgMToKKyAgICAgICAgY2FzZSAy
OgorICAgICAgICBjYXNlIDQ6CisgICAgICAgIGNhc2UgODoKKyAgICAgICAgICAgIHJldHVybiB0
cnVlOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAg
ICB9CisgICAgfQorCisgICAgc3RhdGljIHVuc2lnbmVkIGxvZ1NjYWxlKHVuc2lnbmVkIHNjYWxl
KQorICAgIHsKKyAgICAgICAgc3dpdGNoIChzY2FsZSkgeworICAgICAgICBjYXNlIDE6CisgICAg
ICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgY2FzZSAyOgorICAgICAgICAgICAgcmV0dXJuIDE7
CisgICAgICAgIGNhc2UgNDoKKyAgICAgICAgICAgIHJldHVybiAyOworICAgICAgICBjYXNlIDg6
CisgICAgICAgICAgICByZXR1cm4gMzsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIEFT
U0VSVF9OT1RfUkVBQ0hFRCgpOworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKyAg
ICB9CisKKyAgICBzdGF0aWMgQXJnIGluZGV4KEFpcjo6VG1wIGJhc2UsIEFpcjo6VG1wIGluZGV4
LCB1bnNpZ25lZCBzY2FsZSA9IDEsIGludDMyX3Qgb2Zmc2V0ID0gMCkKKyAgICB7CisgICAgICAg
IEFTU0VSVChiYXNlLmlzR1AoKSk7CisgICAgICAgIEFTU0VSVChpbmRleC5pc0dQKCkpOworICAg
ICAgICBBU1NFUlQoaXNWYWxpZFNjYWxlKHNjYWxlKSk7CisgICAgICAgIEFyZyByZXN1bHQ7Cisg
ICAgICAgIHJlc3VsdC5tX2tpbmQgPSBJbmRleDsKKyAgICAgICAgcmVzdWx0Lm1fYmFzZSA9IGJh
c2U7CisgICAgICAgIHJlc3VsdC5tX2luZGV4ID0gaW5kZXg7CisgICAgICAgIHJlc3VsdC5tX3Nj
YWxlID0gc3RhdGljX2Nhc3Q8aW50MzJfdD4oc2NhbGUpOworICAgICAgICByZXN1bHQubV9vZmZz
ZXQgPSBvZmZzZXQ7CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorCisgICAgc3RhdGlj
IEFyZyBzcGVjaWFsKEFpcjo6U3BlY2lhbCogc3BlY2lhbCkKKyAgICB7CisgICAgICAgIEFyZyBy
ZXN1bHQ7CisgICAgICAgIHJlc3VsdC5tX2tpbmQgPSBTcGVjaWFsOworICAgICAgICByZXN1bHQu
bV9vZmZzZXQgPSBiaXR3aXNlX2Nhc3Q8aW50cHRyX3Q+KHNwZWNpYWwpOworICAgICAgICByZXR1
cm4gcmVzdWx0OworICAgIH0KKworICAgIGJvb2wgb3BlcmF0b3I9PShjb25zdCBBcmcmIG90aGVy
KSBjb25zdAorICAgIHsKKyAgICAgICAgcmV0dXJuIG1fb2Zmc2V0ID09IG90aGVyLm1fb2Zmc2V0
CisgICAgICAgICAgICAmJiBtX2tpbmQgPT0gb3RoZXIubV9raW5kCisgICAgICAgICAgICAmJiBt
X2Jhc2UgPT0gb3RoZXIubV9iYXNlCisgICAgICAgICAgICAmJiBtX2luZGV4ID09IG90aGVyLm1f
aW5kZXgKKyAgICAgICAgICAgICYmIG1fc2NhbGUgPT0gb3RoZXIubV9zY2FsZTsKKyAgICB9CisK
KyAgICBib29sIG9wZXJhdG9yIT0oY29uc3QgQXJnJiBvdGhlcikgY29uc3QKKyAgICB7CisgICAg
ICAgIHJldHVybiAhKCp0aGlzID09IG90aGVyKTsKKyAgICB9CisKKyAgICBleHBsaWNpdCBvcGVy
YXRvciBib29sKCkgY29uc3QgeyByZXR1cm4gKnRoaXMgIT0gQXJnKCk7IH0KKworICAgIEtpbmQg
a2luZCgpIGNvbnN0CisgICAgeworICAgICAgICByZXR1cm4gbV9raW5kOworICAgIH0KKworICAg
IGJvb2wgaXNUbXAoKSBjb25zdAorICAgIHsKKyAgICAgICAgcmV0dXJuIGtpbmQoKSA9PSBUbXA7
CisgICAgfQorCisgICAgYm9vbCBpc0ltbSgpIGNvbnN0CisgICAgeworICAgICAgICByZXR1cm4g
a2luZCgpID09IEltbTsKKyAgICB9CisKKyAgICBib29sIGlzSW1tUHRyKCkgY29uc3QKKyAgICB7
CisgICAgICAgIHJldHVybiBraW5kKCkgPT0gSW1tUHRyOworICAgIH0KKworICAgIGJvb2wgaXNB
ZGRyKCkgY29uc3QKKyAgICB7CisgICAgICAgIHJldHVybiBraW5kKCkgPT0gQWRkcjsKKyAgICB9
CisKKyAgICBib29sIGlzSW5kZXgoKSBjb25zdAorICAgIHsKKyAgICAgICAgcmV0dXJuIGtpbmQo
KSA9PSBJbmRleDsKKyAgICB9CisKKyAgICBBaXI6OlRtcCB0bXAoKSBjb25zdAorICAgIHsKKyAg
ICAgICAgQVNTRVJUKGtpbmQoKSA9PSBUbXApOworICAgICAgICByZXR1cm4gbV9iYXNlOworICAg
IH0KKworICAgIGludHB0cl90IHZhbHVlKCkgY29uc3QKKyAgICB7CisgICAgICAgIEFTU0VSVChr
aW5kKCkgPT0gSW1tIHx8IGtpbmQoKSA9PSBJbW1QdHIpOworICAgICAgICByZXR1cm4gbV9vZmZz
ZXQ7CisgICAgfQorCisgICAgdm9pZCogcG9pbnRlclZhbHVlKCkgY29uc3QKKyAgICB7CisgICAg
ICAgIEFTU0VSVChraW5kKCkgPT0gSW1tUHRyKTsKKyAgICAgICAgcmV0dXJuIGJpdHdpc2VfY2Fz
dDx2b2lkKj4obV9vZmZzZXQpOworICAgIH0KKworICAgIEFpcjo6VG1wIGJhc2UoKSBjb25zdAor
ICAgIHsKKyAgICAgICAgQVNTRVJUKGtpbmQoKSA9PSBBZGRyIHx8IGtpbmQoKSA9PSBJbmRleCk7
CisgICAgICAgIHJldHVybiBtX2Jhc2U7CisgICAgfQorCisgICAgaW50MzJfdCBvZmZzZXQoKSBj
b25zdAorICAgIHsKKyAgICAgICAgaWYgKGtpbmQoKSA9PSBTdGFjaykKKyAgICAgICAgICAgIHJl
dHVybiBzdGF0aWNfY2FzdDxpbnQzMl90PihtX3NjYWxlKTsKKyAgICAgICAgQVNTRVJUKGtpbmQo
KSA9PSBBZGRyIHx8IGtpbmQoKSA9PSBDYWxsQXJnIHx8IGtpbmQoKSA9PSBJbmRleCk7CisgICAg
ICAgIHJldHVybiBzdGF0aWNfY2FzdDxpbnQzMl90PihtX29mZnNldCk7CisgICAgfQorCisgICAg
U3RhY2tTbG90KiBzdGFja1Nsb3QoKSBjb25zdAorICAgIHsKKyAgICAgICAgQVNTRVJUKGtpbmQo
KSA9PSBTdGFjayk7CisgICAgICAgIHJldHVybiBiaXR3aXNlX2Nhc3Q8U3RhY2tTbG90Kj4obV9v
ZmZzZXQpOworICAgIH0KKworICAgIEFpcjo6VG1wIGluZGV4KCkgY29uc3QKKyAgICB7CisgICAg
ICAgIEFTU0VSVChraW5kKCkgPT0gSW5kZXgpOworICAgICAgICByZXR1cm4gbV9pbmRleDsKKyAg
ICB9CisKKyAgICB1bnNpZ25lZCBzY2FsZSgpIGNvbnN0CisgICAgeworICAgICAgICBBU1NFUlQo
a2luZCgpID09IEluZGV4KTsKKyAgICAgICAgcmV0dXJuIG1fc2NhbGU7CisgICAgfQorCisgICAg
dW5zaWduZWQgbG9nU2NhbGUoKSBjb25zdAorICAgIHsKKyAgICAgICAgcmV0dXJuIGxvZ1NjYWxl
KHNjYWxlKCkpOworICAgIH0KKworICAgIEFpcjo6U3BlY2lhbCogc3BlY2lhbCgpIGNvbnN0Cisg
ICAgeworICAgICAgICBBU1NFUlQoa2luZCgpID09IFNwZWNpYWwpOworICAgICAgICByZXR1cm4g
Yml0d2lzZV9jYXN0PEFpcjo6U3BlY2lhbCo+KG1fb2Zmc2V0KTsKKyAgICB9CisKKyAgICBib29s
IGlzR1BUbXAoKSBjb25zdAorICAgIHsKKyAgICAgICAgcmV0dXJuIGlzVG1wKCkgJiYgdG1wKCku
aXNHUCgpOworICAgIH0KKworICAgIGJvb2wgaXNGUFRtcCgpIGNvbnN0CisgICAgeworICAgICAg
ICByZXR1cm4gaXNUbXAoKSAmJiB0bXAoKS5pc0ZQKCk7CisgICAgfQorICAgIAorICAgIC8vIFRl
bGxzIHVzIGlmIHRoaXMgQXJnIGNhbiBiZSB1c2VkIGluIGEgcG9zaXRpb24gdGhhdCByZXF1aXJl
cyBhIEdQIHZhbHVlLgorICAgIGJvb2wgaXNHUCgpIGNvbnN0CisgICAgeworICAgICAgICBzd2l0
Y2ggKGtpbmQoKSkgeworICAgICAgICBjYXNlIEltbToKKyAgICAgICAgY2FzZSBJbW1QdHI6Cisg
ICAgICAgIGNhc2UgQWRkcjoKKyAgICAgICAgY2FzZSBJbmRleDoKKyAgICAgICAgY2FzZSBTdGFj
a1Nsb3Q6CisgICAgICAgIGNhc2UgQ2FsbEFyZzoKKyAgICAgICAgY2FzZSBTcGVjaWFsOgorICAg
ICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIGNhc2UgVG1wOgorICAgICAgICAgICAgcmV0
dXJuIGlzR1BUbXAoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIFRlbGxzIHVzIGlmIHRo
aXMgQXJnIGNhbiBiZSB1c2VkIGluIGEgcG9zaXRpb24gdGhhdCByZXF1aXJlcyBhIEZQIHZhbHVl
LgorICAgIGJvb2wgaXNGUCgpIGNvbnN0CisgICAgeworICAgICAgICBzd2l0Y2ggKGtpbmQoKSkg
eworICAgICAgICBjYXNlIEltbToKKyAgICAgICAgY2FzZSBJbW1QdHI6CisgICAgICAgIGNhc2Ug
U3BlY2lhbDoKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgY2FzZSBBZGRyOgor
ICAgICAgICBjYXNlIEluZGV4OgorICAgICAgICBjYXNlIEJhc2U6CisgICAgICAgIGNhc2UgU3Rh
Y2tTbG90OgorICAgICAgICBjYXNlIENhbGxBcmc6CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsK
KyAgICAgICAgY2FzZSBUbXA6CisgICAgICAgICAgICByZXR1cm4gaXNGUFRtcCgpOworICAgICAg
ICB9CisgICAgfQorCisgICAgYm9vbCBoYXNUeXBlKCkgY29uc3QKKyAgICB7CisgICAgICAgIHN3
aXRjaCAoa2luZCgpKSB7CisgICAgICAgIGNhc2UgSW1tOgorICAgICAgICBjYXNlIEltbVB0cjoK
KyAgICAgICAgY2FzZSBTcGVjaWFsOgorICAgICAgICBjYXNlIFRtcDoKKyAgICAgICAgICAgIHJl
dHVybiB0cnVlOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwor
ICAgICAgICB9CisgICAgfQorICAgIAorICAgIC8vIFRoZSB0eXBlIGlzIGFtYmlndW91cyBmb3Ig
c29tZSBhcmcga2luZHMuIENhbGwgd2l0aCBjYXJlLgorICAgIFR5cGUgdHlwZSgpIGNvbnN0Cisg
ICAgeworICAgICAgICBzd2l0Y2ggKGtpbmQoKSkgeworICAgICAgICBjYXNlIEltbToKKyAgICAg
ICAgY2FzZSBJbW1QdHI6CisgICAgICAgIGNhc2UgU3BlY2lhbDoKKyAgICAgICAgICAgIHJldHVy
biBHUDsKKyAgICAgICAgY2FzZSBUbXA6CisgICAgICAgICAgICByZXR1cm4gaXNHUFRtcCgpID8g
R1AgOiBGUDsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIEFTU0VSVF9OT1RfUkVBQ0hF
RCgpOworICAgICAgICAgICAgcmV0dXJuIEdQOworICAgICAgICB9CisgICAgfQorCisgICAgYm9v
bCBpc0dQUigpIGNvbnN0CisgICAgeworICAgICAgICByZXR1cm4gaXNUbXAoKSAmJiB0bXAoKS5p
c0dQUigpOworICAgIH0KKworICAgIEdQUlJlZyBncHIoKSBjb25zdAorICAgIHsKKyAgICAgICAg
cmV0dXJuIHRtcCgpLmdwcigpOworICAgIH0KKworICAgIGJvb2wgaXNGUFIoKSBjb25zdAorICAg
IHsKKyAgICAgICAgcmV0dXJuIGlzVG1wKCkgJiYgdG1wKCkuaXNGUFIoKTsKKyAgICB9CisKKyAg
ICBGUFJSZWcgZnByKCkgY29uc3QKKyAgICB7CisgICAgICAgIHJldHVybiB0bXAoKS5mcHIoKTsK
KyAgICB9CisgICAgCisgICAgYm9vbCBpc1JlZygpIGNvbnN0CisgICAgeworICAgICAgICByZXR1
cm4gaXNUbXAoKSAmJiB0bXAoKS5pc1JlZygpOworICAgIH0KKworICAgIFJlZyByZWcoKSBjb25z
dAorICAgIHsKKyAgICAgICAgcmV0dXJuIHRtcCgpLnJlZygpOworICAgIH0KKworICAgIHVuc2ln
bmVkIGdwVG1wSW5kZXgoKSBjb25zdAorICAgIHsKKyAgICAgICAgcmV0dXJuIHRtcCgpLmdwVG1w
SW5kZXgoKTsKKyAgICB9CisKKyAgICB1bnNpZ25lZCBmcFRtcEluZGV4KCkgY29uc3QKKyAgICB7
CisgICAgICAgIHJldHVybiB0bXAoKS5mcFRtcEluZGV4KCk7CisgICAgfQorCisgICAgdW5zaWdu
ZWQgdG1wSW5kZXgoKSBjb25zdAorICAgIHsKKyAgICAgICAgcmV0dXJuIHRtcCgpLnRtcEluZGV4
KCk7CisgICAgfQorCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgRnVuY3Rvcj4KKyAgICB2b2lkIGZv
ckVhY2hUbXBGYXN0KGNvbnN0IEZ1bmN0b3ImIGZ1bmN0b3IpCisgICAgeworICAgICAgICBzd2l0
Y2ggKG1fa2luZCkgeworICAgICAgICBjYXNlIFRtcDoKKyAgICAgICAgY2FzZSBBZGRyOgorICAg
ICAgICAgICAgZnVuY3RvcihtX2Jhc2UpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNh
c2UgSW5kZXg6CisgICAgICAgICAgICBmdW5jdG9yKG1fYmFzZSk7CisgICAgICAgICAgICBmdW5j
dG9yKG1faW5kZXgpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAg
ICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIFRoaXMgaXMgc21hcnQg
ZW5vdWdoIHRvIGtub3cgdGhhdCBhbiBhZGRyZXNzIGFyZyBpbiBhIERlZiBvciBVc2VEZWYgcnVs
ZSB3aWxsIHVzZSBpdHMKKyAgICAvLyB0bXBzIGFuZCBuZXZlciBkZWYgdGhlbS4gRm9yIGV4YW1w
bGUsIHRoaXM6CisgICAgLy8KKyAgICAvLyBtb3YgJXJheCwgKCVyY3gpCisgICAgLy8KKyAgICAv
LyBUaGlzIGRlZnMgKCVyY3gpIGJ1dCB1c2VzICVyY3guCisgICAgdGVtcGxhdGU8dHlwZW5hbWUg
RnVuY3Rvcj4KKyAgICB2b2lkIGZvckVhY2hUbXAoUm9sZSBhcmdSb2xlLCBUeXBlIGFyZ1R5cGUs
IGNvbnN0IEZ1bmN0b3ImIGZ1bmN0b3IpCisgICAgeworICAgICAgICBzd2l0Y2ggKG1fa2luZCkg
eworICAgICAgICBjYXNlIFRtcDoKKyAgICAgICAgICAgIGZ1bmN0b3IobV9iYXNlLCBhcmdSb2xl
LCBhcmdUeXBlKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEFkZHI6CisgICAg
ICAgICAgICBmdW5jdG9yKG1fYmFzZSwgVXNlLCBHUCk7CisgICAgICAgICAgICBicmVhazsKKyAg
ICAgICAgY2FzZSBJbmRleDoKKyAgICAgICAgICAgIGZ1bmN0b3IobV9iYXNlLCBVc2UsIEdQKTsK
KyAgICAgICAgICAgIGZ1bmN0b3IobV9pbmRleCwgVXNlLCBHUCk7CisgICAgICAgICAgICBicmVh
azsKKyAgICAgICAgZGVmYXV0OgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9
CisKKyAgICBNYWNyb0Fzc2VtYmxlcjo6VHJ1c3RlZEltbTMyIGFzVHJ1c3RlZEltbTMyKCkgY29u
c3QKKyAgICB7CisgICAgICAgIEFTU0VSVChpc0ltbSgpKTsKKyAgICAgICAgcmV0dXJuIE1hY3Jv
QXNzZW1ibGVyOjpUcnVzdGVkSW1tMzIoc3RhdGljX2Nhc3Q8aW50MzJfdD4obV9vZmZzZXQpKTsK
KyAgICB9CisKKyAgICBNYWNyb0Fzc2VtYmxlcjo6VHJ1c3RlZEltbTMyIGFzVHJ1c3RlZEltbVB0
cigpIGNvbnN0CisgICAgeworICAgICAgICBBU1NFUlQoaXNJbW1QdHIoKSk7CisgICAgICAgIHJl
dHVybiBNYWNyb0Fzc2VtYmxlcjo6VHJ1c3RlZEltbVB0cihwb2ludGVyVmFsdWUoKSk7CisgICAg
fQorCisgICAgTWFjcm9Bc3NlbWJsZXI6OkFkZHJlc3MgYXNBZGRyZXNzKCkgY29uc3QKKyAgICB7
CisgICAgICAgIEFTU0VSVChpc0FkZHIoKSk7CisgICAgICAgIHJldHVybiBNYWNyb0Fzc2VtYmxl
cjo6QWRkcmVzcyhtX2Jhc2UuZ3ByKCksIHN0YXRpY19jYXN0PGludDMyX3Q+KG1fb2Zmc2V0KSk7
CisgICAgfQorCisgICAgTWFjcm9Bc3NlbWJsZXI6OkJhc2VJbmRleCBhc0Jhc2VJbmRleCgpIGNv
bnN0CisgICAgeworICAgICAgICBBU1NFUlQoaXNJbmRleCgpKTsKKyAgICAgICAgcmV0dXJuIE1h
Y3JvQXNzZW1ibGVyOjpCYXNlSW5kZXgoCisgICAgICAgICAgICBtX2Jhc2UuZ3ByKCksIG1faW5k
ZXguZ3ByKCksIHN0YXRpY19jYXN0PE1hY3JvQXNzZW1ibGVyOjpTY2FsZT4obG9nU2NhbGUoKSks
CisgICAgICAgICAgICBzdGF0aWNfY2FzdDxpbnQzMl90PihtX29mZnNldCkpOworICAgIH0KKwor
ICAgIHZvaWQgZHVtcChQcmludFN0cmVhbSYpIGNvbnN0OworCitwcml2YXRlOgorICAgIGludHB0
cl90IG1fb2Zmc2V0IHsgMCB9OworICAgIEtpbmQgbV9raW5kIHsgSW1tIH07CisgICAgaW50MzJf
dCBtX3NjYWxlIHsgMSB9OworICAgIEFpcjo6VG1wIG1fYmFzZTsKKyAgICBBaXI6OlRtcCBtX2lu
ZGV4OworfTsKKworfSB9IH0gLy8gbmFtZXNwYWNlIEpTQzo6QjM6OkFpcgorCisjZW5kaWYgLy8g
QWlyQXJnX2gKKwpJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL2Fpci9BaXJCYXNpY0Js
b2NrLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvYWlyL0FpckJh
c2ljQmxvY2suY3BwCShyZXZpc2lvbiAwKQorKysgU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL2Fp
ci9BaXJCYXNpY0Jsb2NrLmNwcAkod29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDQ0IEBACisvKgor
ICogQ29weXJpZ2h0IChDKSAyMDE1IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAq
CisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3
aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0
aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJp
YnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Cisg
KiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRp
c2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXBy
b2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29u
ZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1l
bnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1
dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gYGBB
UyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJ
TkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVS
Q0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJF
IERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SCisgKiBDT05UUklC
VVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BF
Q0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcs
IEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMg
T1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5F
U1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0Yg
TElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JU
CisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBX
QVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBP
RiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisKKyNpbmNsdWRlICJjb25m
aWcuaCIKKyNpbmNsdWRlICJBaXJCYXNpY0Jsb2NrLmgiCisKK25hbWVzcGFjZSBKU0MgeyBuYW1l
c3BhY2UgQjMgeyBuYW1lc3BhY2UgQWlyIHsKKwordm9pZCBCYXNpY0Jsb2NrOjpkdW1wKFByaW50
U3RyZWFtJiBvdXQpIGNvbnN0Cit7CisgICAgb3V0LnByaW50KGR1bXBQcmVmaXgsIG1faW5kZXgp
OworfQorCit2b2lkIEJhc2ljQmxvY2s6OmRlZXBEdW1wKFByaW50U3RyZWFtJiBvdXQpIGNvbnN0
Cit7CisgICAgb3V0LnByaW50KCJCQiIsICp0aGlzLCAiOlxuIik7CisgICAgZm9yIChjb25zdCBJ
bnN0JiBpbnN0IDogKnRoaXMpCisgICAgICAgIG91dC5wcmludCgiICAgICIsIGluc3QsICJcbiIp
OworfQorCit9IH0gfSAvLyBuYW1lc3BhY2UgSlNDOjpCMzo6QWlyCisKSW5kZXg6IFNvdXJjZS9K
YXZhU2NyaXB0Q29yZS9iMy9haXIvQWlyQmFzaWNCbG9jay5oCj09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJj
ZS9KYXZhU2NyaXB0Q29yZS9iMy9haXIvQWlyQmFzaWNCbG9jay5oCShyZXZpc2lvbiAwKQorKysg
U291cmNlL0phdmFTY3JpcHRDb3JlL2IzL2Fpci9BaXJCYXNpY0Jsb2NrLmgJKHdvcmtpbmcgY29w
eSkKQEAgLTAsMCArMSwxMjEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTUgQXBwbGUgSW5j
LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4g
c291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9u
LCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisg
KiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0
YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRp
dGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9u
cyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAg
ICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2Ns
YWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMg
cHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMg
UFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJ
TVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAq
IElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEg
UEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxM
IEFQUExFIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1Qs
IElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFV
RU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VS
RU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEs
IE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VE
IEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1Qs
IFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBP
VEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBT
T0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFH
RS4gCisgKi8KKworI2lmbmRlZiBBaXJCYXNpY0Jsb2NrX2gKKyNkZWZpbmUgQWlyQmFzaWNCbG9j
a19oCisKKyNpbmNsdWRlICJBaXJJbnN0LmgiCisjaW5jbHVkZSA8d3RmL05vbkNvcHlhYmxlLmg+
CisjaW5jbHVkZSA8d3RmL0Zhc3RNYWxsb2MuaD4KKworbmFtZXNwYWNlIEpTQyB7IG5hbWVzcGFj
ZSBCMyB7IG5hbWVzcGFjZSBBaXIgeworCitjbGFzcyBDb2RlOworCitjbGFzcyBCYXNpY0Jsb2Nr
IHsKKyAgICBXVEZfTUFLRV9OT05DT1BZQUJMRShCYXNpY0Jsb2NrKTsKKyAgICBXVEZfTUFLRV9G
QVNUX0FMTE9DQVRFRDsKK3B1YmxpYzoKKyAgICBzdGF0aWMgY29uc3QgY2hhciogZHVtcFByZWZp
eCA9ICIjIjsKKworICAgIHR5cGVkZWYgVmVjdG9yPEluc3Q+IEluc3RMaXN0OworICAgIHR5cGVk
ZWYgVmVjdG9yPEJhc2ljQmxvY2sqLCAyPiBTdWNjZXNzb3JMaXN0OworICAgIAorICAgIHVuc2ln
bmVkIHNpemUoKSBjb25zdCB7IHJldHVybiBtX2luc3RzLnNpemUoKTsgfQorICAgIEluc3RMaXN0
OjppdGVyYXRvciBiZWdpbigpIHsgcmV0dXJuIG1faW5zdHMuYmVnaW4oKTsgfQorICAgIEluc3RM
aXN0OjppdGVyYXRvciBlbmQoKSB7IHJldHVybiBtX2luc3RzLmVuZCgpOyB9CisgICAgSW5zdExp
c3Q6OmNvbnN0X2l0ZXJhdG9yIGJlZ2luKCkgY29uc3QgeyByZXR1cm4gbV9pbnN0cy5iZWdpbigp
OyB9CisgICAgSW5zdExpc3Q6OmNvbnN0X2l0ZXJhdG9yIGVuZCgpIGNvbnN0IHsgcmV0dXJuIG1f
aW5zdHMuZW5kKCk7IH0KKworICAgIHNpemVfdCBzaXplKCkgY29uc3QgeyByZXR1cm4gbV9pbnN0
cy5zaXplKCk7IH0KKyAgICBjb25zdCBJbnN0JiBhdChzaXplX3QgaW5kZXgpIGNvbnN0IHsgcmV0
dXJuIG1faW5zdHNbaW5kZXhdOyB9CisgICAgSW5zdCYgYXQoc2l6ZV90IGluZGV4KSB7IHJldHVy
biBtX2luc3RzW2luZGV4XTsgfQorCisgICAgY29uc3QgSW5zdCYgbGFzdCgpIGNvbnN0IHsgcmV0
dXJuIG1faW5zdHMubGFzdCgpOyB9CisgICAgSW5zdCYgbGFzdCgpIHsgcmV0dXJuIG1faW5zdHMu
bGFzdCgpOyB9CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBJbnN0PgorICAgIHZvaWQgYXBwZW5k
SW5zdChJbnN0JiYgaW5zdCkKKyAgICB7CisgICAgICAgIG1faW5zdHMuYXBwZW5kKHN0ZDo6Zm9y
d2FyZDxJbnN0PihpbnN0KSk7CisgICAgfQorCisgICAgdGVtcGxhdGU8dHlwZW5hbWUuLi4gQXJn
dW1lbnRzPgorICAgIHZvaWQgYXBwZW5kKEFyZ3VtZW50cyYmLi4uIGFyZ3VtZW50cykKKyAgICB7
CisgICAgICAgIG1faW5zdHMuYXBwZW5kKEluc3Qoc3RkOjpmb3J3YXJkPEFyZ3VtZW50cz4oYXJn
dW1lbnRzKS4uLikpOworICAgIH0KKworICAgIC8vIFRoZSAiMCIgY2FzZSBpcyB0aGUgY2FzZSB0
byB3aGljaCB0aGUgYnJhbmNoIGp1bXBzLCBzbyB0aGUgInRoZW4iIGNhc2UuIFRoZSAiMSIgY2Fz
ZSBpcyB0aGUKKyAgICAvLyAiZWxzZSIgY2FzZSwgYW5kIGlzIHVzZWQgdG8gcmVwcmVzZW50IHRo
ZSBmYWxsLXRocm91Z2ggb2YgYSBjb25kaXRpb25hbCBicmFuY2guCisgICAgdW5zaWduZWQgbnVt
U3VjY2Vzc29ycygpIGNvbnN0IHsgcmV0dXJuIG1fc3VjY2Vzc29ycy5zaXplKCk7IH0KKyAgICBC
YXNpY0Jsb2NrKiBzdWNjZXNzb3IodW5zaWduZWQgaW5kZXgpIGNvbnN0IHsgcmV0dXJuIG1fc3Vj
Y2Vzc29yc1tpbmRleF07IH0KKyAgICBCYXNpY0Jsb2NrKiYgc3VjY2Vzc29yKHVuc2lnbmVkIGlu
ZGV4KSB7IHJldHVybiBtX3N1Y2Nlc3NvcnNbaW5kZXhdOyB9CisgICAgY29uc3QgU3VjY2Vzc29y
TGlzdCYgc3VjY2Vzc29ycygpIGNvbnN0IHsgcmV0dXJuIG1fc3VjY2Vzc29yc1tpbmRleF07IH0K
KyAgICBTdWNjZXNzb3JMaXN0JiBzdWNjZXNzb3JzKCkgeyByZXR1cm4gbV9zdWNjZXNzb3JzW2lu
ZGV4XTsgfQorCisgICAgdm9pZCBkdW1wKFByaW50U3RyZWFtJikgY29uc3Q7CisgICAgdm9pZCBk
ZWVwRHVtcChQcmludFN0cmVhbSYpIGNvbnN0OworCitwcml2YXRlOgorICAgIGZyaWVuZCBjbGFz
cyBDb2RlOworICAgIAorICAgIEJhc2ljQmxvY2sodW5zaWduZWQgaW5kZXgpCisgICAgeworICAg
IH0KKworICAgIHVuc2lnbmVkIG1faW5kZXg7CisgICAgSW5zdExpc3QgbV9pbnN0czsKKyAgICBT
dWNjZXNzb3JMaXN0IG1fc3VjY2Vzc29yczsKK307CisKK2NsYXNzIERlZXBCYXNpY0Jsb2NrRHVt
cCB7CitwdWJsaWM6CisgICAgRGVlcEJhc2ljQmxvY2tEdW1wKEJhc2ljQmxvY2sqIGJsb2NrKQor
ICAgICAgICA6IG1fYmxvY2soYmxvY2spCisgICAgeworICAgIH0KKworICAgIHZvaWQgZHVtcChQ
cmludFN0cmVhbSYgb3V0KSBjb25zdAorICAgIHsKKyAgICAgICAgaWYgKG1fYmxvY2spCisgICAg
ICAgICAgICBtX2Jsb2NrLT5kZWVwRHVtcChvdXQpOworICAgICAgICBlbHNlCisgICAgICAgICAg
ICBvdXQucHJpbnQoIjxudWxsPiIpOworICAgIH0KKworcHJpdmF0ZToKKyAgICBCYXNpY0Jsb2Nr
KiBtX2Jsb2NrOworfTsKKworRGVlcEJhc2ljQmxvY2tEdW1wIGRlZXBEdW1wKEJhc2ljQmxvY2sq
IGJsb2NrKQoreworICAgIHJldHVybiBEZWVwQmFzaWNCbG9ja0R1bXAoYmxvY2spOworfQorCit9
IH0gfSAvLyBuYW1lc3BhY2UgSlNDOjpCMzo6QWlyCisKKyNlbmRpZiAvLyBBaXJCYXNpY0Jsb2Nr
X2gKKwpJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL2Fpci9BaXJDQ2FsbFNwZWNpYWwu
Y3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9haXIvQWlyQ0NhbGxT
cGVjaWFsLmNwcAkocmV2aXNpb24gMCkKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9haXIv
QWlyQ0NhbGxTcGVjaWFsLmNwcAkod29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDEyNCBAQAorLyoK
KyAqIENvcHlyaWdodCAoQykgMjAxNSBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisg
KgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywg
d2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQg
dGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3Ry
aWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAor
ICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBk
aXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVw
cm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNv
bmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3Vt
ZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmli
dXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIGBg
QVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVE
SU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1F
UkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFS
RSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUgorICogQ09OVFJJ
QlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQ
RUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5H
LCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RT
IE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lO
RVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9G
IExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9S
VAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkg
V0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQg
T0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLiAKKyAqLworCisjaW5jbHVkZSAiY29u
ZmlnLmgiCisjaW5jbHVkZSAiQWlyQ0NhbGxTcGVjaWFsLmgiCisKK25hbWVzcGFjZSBKU0MgeyBu
YW1lc3BhY2UgQjMgeyBuYW1lc3BhY2UgQWlyIHsKKworQ0NhbGxTcGVjaWFsOjpDQ2FsbFNwZWNp
YWwoKQorICAgIDogU3BlY2lhbCgiQ0NhbGwiKTsKK3sKKyAgICBtX2Nsb2JiZXJlZFJlZ3MgPSBS
ZWdpc3RlclNldDo6YWxsUmVnaXN0ZXJzKCk7CisgICAgbV9jbG9iYmVyZWRSZWdzLmV4Y2x1ZGUo
UmVnaXN0ZXJTZXQ6OnN0YWNrUmVnaXN0ZXJzKCkpOworICAgIG1fY2xvYmJlcmVkUmVncy5leGNs
dWRlKFJlZ2lzdGVyU2V0OjpyZXNlcnZlZEhhcmR3YXJlUmVnaXN0ZXJzKCkpOworICAgIG1fY2xv
YmJlcmVkUmVncy5leGNsdWRlKFJlZ2lzdGVyU2V0OjpjYWxsZWVTYXZlUmVnaXN0ZXJzKCkpOwor
fQorCitDQ2FsbFNwZWNpYWw6On5DQ2FsbFNwZWNpYWwoKQoreworfQorCit2b2lkIENDYWxsU3Bl
Y2lhbDo6Zm9yRWFjaEFyZyhJbnN0JiBpbnN0LCBjb25zdCBTY29wZWRMYW1iZGE8SW5zdDo6RWFj
aEFyZ0NhbGxiYWNrPiYgY2FsbGJhY2spCit7CisgICAgY2FsbGJhY2soaW5zdC5hcmdzWzFdLCBB
cmc6OlVzZSwgQXJnOjpHUCk7CisgICAgCisgICAgZm9yICh1bnNpZ25lZCBpID0gMjsgaSA8IGlu
c3QuYXJncy5zaXplKCk7ICsraSkgeworICAgICAgICAvLyBGb3IgdGhlIHR5cGUsIHdlIGNhbiBq
dXN0IHF1ZXJ5IHRoZSBhcmcncyB0eXBlLiBUaGUgYXJnIHdpbGwgaGF2ZSBhIHR5cGUsIGJlY2F1
c2Ugd2UKKyAgICAgICAgLy8gcmVxdWlyZSB0aGVzZSBhcmdzIHRvIGJlIGFyZ3VtZW50IHJlZ2lz
dGVycy4KKyAgICAgICAgY2FsbGJhY2soaW5zdC5hcmdzW2ldLCBBcmc6OlVzZSwgaW5zdC5hcmdz
W2ldLnR5cGUoKSk7CisgICAgfQorfQorCitib29sIENDYWxsU3BlY2lhbDo6aXNWYWxpZChJbnN0
JiBpbnN0KQoreworICAgIGlmIChpbnN0LmFyZ3Muc2l6ZSgpIDwgMikKKyAgICAgICAgcmV0dXJu
IGZhbHNlOworCisgICAgc3dpdGNoIChpbnN0LmFyZ3NbMV0ua2luZCgpKSB7CisgICAgY2FzZSBB
cmc6OkltbVB0cjoKKyAgICBjYXNlIEFyZzo6VG1wOgorICAgIGNhc2UgQXJnOjpBZGRyOgorICAg
IGNhc2UgQXJnOjpTdGFjazoKKyAgICBjYXNlIEFyZzo6Q2FsbEFyZzoKKyAgICAgICAgYnJlYWs7
CisgICAgZGVmYXVsdDoKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGlmICgh
aW5zdC5hcmdzWzFdLmlzR1AoKSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgZm9yICh1
bnNpZ25lZCBpID0gMjsgaSA8IGluc3QuYXJncy5zaXplKCk7ICsraSkgeworICAgICAgICBpZiAo
IWluc3QuYXJnc1tpXS5pc1JlZygpKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAg
ICAgIGlmIChpbnN0LmFyZ3NbaV0gPT0gVG1wKHNjcmF0Y2hSZWdpc3RlcikpCisgICAgICAgICAg
ICByZXR1cm4gIGZhbHNlOworICAgIH0KKyAgICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBDQ2Fs
bFNwZWNpYWw6OmFkbWl0c1N0YWNrKEluc3QmLCB1bnNpZ25lZCBhcmdJbmRleCkKK3sKKyAgICAv
LyBBcmcgMSBjYW4gYmUgYSBzdGFjayBhZGRyZXNzIGZvciBzdXJlLgorICAgIGlmIChhcmdJbmRl
eCA9PSAxKQorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAKKyAgICByZXR1cm4gZmFsc2U7Cit9
CisKK0NDYWxsSGVscGVyczo6SnVtcCBDQ2FsbFNwZWNpYWw6OmdlbmVyYXRlKEluc3QmIGluc3Qs
IENDYWxsSGVscGVycyYgaml0KQoreworICAgIHN3aXRjaCAoaW5zdC5hcmdzWzFdLmtpbmQoKSkg
eworICAgIGNhc2UgQXJnOjpJbW1QdHI6CisgICAgICAgIGppdC5tb3ZlKENDYWxsSGVscGVyczo6
VHJ1c3RlZEltbVB0cihpbnN0LmFyZ3NbMV0ucG9pbnRlclZhbHVlKCkpLCBzY3JhdGNoUmVnaXN0
ZXIpOworICAgICAgICBqaXQuY2FsbChzY3JhdGNoUmVnaXN0ZXIpOworICAgICAgICBicmVhazsK
KyAgICBjYXNlIEFyZzo6VG1wOgorICAgICAgICBqaXQuY2FsbChpbnN0LmFyZ3NbMV0uZ3ByKCkp
OworICAgICAgICBicmVhazsKKyAgICBjYXNlIEFyZzo6QWRkcjoKKyAgICAgICAgaml0LmNhbGwo
aW5zdC5hcmdzWzFdLmFzQWRkcmVzcygpKTsKKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoK
KyAgICAgICAgUkVMRUFTRV9BU1NFUlRfTk9UX1JFQUNIRUQoKTsKKyAgICAgICAgYnJlYWs7Cisg
ICAgfQorICAgIHJldHVybiBDQ2FsbEhlbHBlcnM6Okp1bXAoKTsKK30KKworY29uc3QgUmVnaXN0
ZXJTZXQmIENDYWxsU3BlY2lhbDo6ZXh0cmFDbG9iYmVyZWRSZWdzKCkKK3sKKyAgICByZXR1cm4g
bV9jbG9iYmVyZWRSZWdzOworfQorCit2b2lkIENDYWxsU3BlY2lhbDo6ZGVlcER1bXBJbXBsKFBy
aW50U3RyZWFtJiBvdXQpIGNvbnN0Cit7CisgICAgb3V0LnByaW50KCJmdW5jdGlvbiBjYWxsIHRo
YXQgdXNlcyB0aGUgQyBjYWxsaW5nIGNvbnZlbnRpb24uIik7Cit9CisKK30gfSB9IC8vIG5hbWVz
cGFjZSBKU0M6OkIzOjpBaXIKKwpJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL2Fpci9B
aXJDQ2FsbFNwZWNpYWwuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMv
YWlyL0FpckNDYWxsU3BlY2lhbC5oCShyZXZpc2lvbiAwKQorKysgU291cmNlL0phdmFTY3JpcHRD
b3JlL2IzL2Fpci9BaXJDQ2FsbFNwZWNpYWwuaAkod29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDY2
IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE1IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNl
cnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5
IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBw
cm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEu
IFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29w
eXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9s
bG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0g
bXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxp
c3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICog
ICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhl
IGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExF
IElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVT
LCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJ
RVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBV
UlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SCisg
KiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURF
TlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJ
TkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRV
VEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsg
T1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9S
WQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZ
LCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5H
IElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYg
QURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisKKyNpZm5k
ZWYgQWlyQ0NhbGxTcGVjaWFsX2gKKyNkZWZpbmUgQWlyQ0NhbGxTcGVjaWFsX2gKKworbmFtZXNw
YWNlIEpTQyB7IG5hbWVzcGFjZSBCMyB7IG5hbWVzcGFjZSBBaXIgeworCisvLyBVc2UgdGhpcyBz
cGVjaWFsIGZvciBjb25zdHJ1Y3RpbmcgYSBDIGNhbGwuIEFyZyAwIGlzIG9mIGNvdXJzZSBhIFNw
ZWNpYWwgYXJnIHRoYXQgcmVmZXJzIHRvIHRoZQorLy8gQ0NhbGxTcGVjaWFsIG9iamVjdC4gQXJn
IDEgaXMgdGhlIGNhbGxlZSwgYW5kIGl0IGNhbiBiZSBhbiBJbW1QdHIsIGEgcmVnaXN0ZXIsIG9y
IGFuIGFkZHJlc3MuIFRoZQorLy8gcmVtYWluaW5nIGFyZ3MgYXJlIGp1c3QgdGhlIHNldCBvZiBh
cmd1bWVudCByZWdpc3RlcnMgdXNlZCBieSB0aGlzIGNhbGwuIEZvciBhcmd1bWVudHMgdGhhdCBn
byB0bworLy8gdGhlIHN0YWNrLCB5b3UgaGF2ZSB0byBkbyB0aGUgZ3J1bnQgd29yayBvZiBkb2lu
ZyB0aG9zZSBzdGFjayBzdG9yZXMuIEluIGZhY3QsIHRoZSBvbmx5IHJlYXNvbiB3aHkKKy8vIHdl
IHNwZWNpZnkgdGhlIGFyZ3VtZW50IHJlZ2lzdGVycyBhcyBhcmd1bWVudHMgdG8gYSBjYWxsIGlz
IHNvIHRoYXQgdGhlIGxpdmVuZXNzIGFuYWx5c2lzIGNhbiBzZWUKKy8vIHRoYXQgdGhleSBnZXQg
dXNlZCBoZXJlLiBJdCB3b3VsZCBiZSB3cm9uZyB0byBhdXRvbWFnaWNhbGx5IHJlcG9ydCBhbGwg
YXJndW1lbnQgcmVnaXN0ZXJzIGFzIGJlaW5nCisvLyB1c2VkIGJlY2F1c2UgaWYgd2UgaGFkIGEg
Y2FsbCB0aGF0IGRpZG4ndCBwYXNzIHRoZW0sIHRoZW4gdGhleSdkIGFwcGVhciB0byBiZSBsaXZl
IHVudGlsIHNvbWUKKy8vIGNsb2JiZXIgcG9pbnQgb3IgdGhlIHByb2xvZ3VlLCB3aGljaGV2ZXIg
aGFwcGVuZWQgc29vbmVyLgorCitjbGFzcyBDQ2FsbFNwZWNpYWwgOiBwdWJsaWMgU3BlY2lhbCB7
CitwdWJsaWM6CisgICAgQ0NhbGxTcGVjaWFsKCk7CisgICAgfkNDYWxsU3BlY2lhbCgpOworCisg
ICAgLy8gWW91IGNhbm5vdCB1c2UgdGhpcyByZWdpc3RlciB0byBwYXNzIGFyZ3VtZW50cy4gSXQg
anVzdCBzbyBoYXBwZW5zIHRoYXQgdGhpcyByZWdpc3RlciBpcyBub3QKKyAgICAvLyB1c2VkIGZv
ciBhcmd1bWVudHMgaW4gdGhlIEMgY2FsbGluZyBjb252ZW50aW9uLiBCeSB0aGUgd2F5LCB0aGlz
IGlzIHRoZSBvbmx5IHRoaW5nIHRoYXQgY2F1c2VzCisgICAgLy8gdGhpcyBzcGVjaWFsIHRvIGJl
IHNwZWNpZmljIHRvIEMgY2FsbHMuCisgICAgc3RhdGljIGNvbnN0IEdQUlJlZyBzY3JhdGNoUmVn
aXN0ZXIgPSBHUFJJbmZvOjpub25BcmdHUFIwLgorCitwcm90ZWN0ZWQ6CisgICAgdm9pZCBmb3JF
YWNoQXJnKEluc3QmLCBjb25zdCBTY29wZWRMYW1iZGE8SW5zdDo6RWFjaEFyZ0NhbGxiYWNrPiYp
IG92ZXJyaWRlOworICAgIGJvb2wgaXNWYWxpZChJbnN0Jikgb3ZlcnJpZGU7CisgICAgYm9vbCBh
ZG1pdHNTdGFjayhJbnN0JiwgdW5zaWduZWQgYXJnSW5kZXgpIG92ZXJyaWRlOworICAgIENDYWxs
SGVscGVyczo6SnVtcCBnZW5lcmF0ZShJbnN0JiwgQ0NhbGxIZWxwZXJzJikgb3ZlcnJpZGU7Cisg
ICAgY29uc3QgUmVnaXN0ZXJTZXQmIGV4dHJhQ2xvYmJlcmVkUmVncygpIG92ZXJyaWRlOworICAg
IAorICAgIHZvaWQgZGVlcER1bXBJbXBsKFByaW50U3RyZWFtJikgY29uc3Qgb3ZlcnJpZGU7CisK
K3ByaXZhdGU6CisgICAgUmVnaXN0ZXJTZXQgbV9jbG9iYmVyZWRSZWdzOworfTsKKworfSB9IH0g
Ly8gbmFtZXNwYWNlIEpTQzo6QjM6OkFpcgorCisjZW5kaWYgLy8gQWlyQ0NhbGxTcGVjaWFsX2gK
KwpJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL2Fpci9BaXJDb2RlLmNwcAo9PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvYWlyL0FpckNvZGUuY3BwCShyZXZpc2lv
biAwKQorKysgU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL2Fpci9BaXJDb2RlLmNwcAkod29ya2lu
ZyBjb3B5KQpAQCAtMCwwICsxLDY0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE1IEFwcGxl
IEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNl
IGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNh
dGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9u
cworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0
IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBj
b25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1
dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAor
ICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBk
aXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJp
YWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJF
IElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1Mg
T1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhF
CisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZP
UiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBT
SEFMTCBBUFBMRSBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElS
RUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09O
U0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBS
T0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBE
QVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENB
VVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRS
QUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0Ug
T1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRI
SVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBE
QU1BR0UuIAorICovCisKKyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJBaXJDb2RlLmgi
CisKK25hbWVzcGFjZSBKU0MgeyBuYW1lc3BhY2UgQjMgeyBuYW1lc3BhY2UgQWlyIHsKKworQ29k
ZTo6Q29kZSgpCit7Cit9CisKK0NvZGU6On5Db2RlKCkKK3sKK30KKworQmFzaWNCbG9jayogQ29k
ZTo6YWRkQmxvY2soKQoreworICAgIHN0ZDo6dW5pcXVlX3B0cjxCYXNpY0Jsb2NrPiBibG9jayhu
ZXcgQmFzaWNCbG9jayhtX2Jsb2Nrcy5zaXplKCkpKTsKKyAgICBCYXNpY0Jsb2NrKiByZXN1bHQg
PSBibG9jay5nZXQoKTsKKyAgICBtX2Jsb2Nrcy5hcHBlbmQoV1RGOjptb3ZlKGJsb2NrKSk7Cisg
ICAgcmV0dXJuIHJlc3VsdDsKK30KKwordm9pZCBDb2RlOjpkdW1wKFByaW50U3RyZWFtJiBvdXQp
IGNvbnN0Cit7CisgICAgZm9yIChCYXNpY0Jsb2NrKiBibG9jayA6ICp0aGlzKQorICAgICAgICBv
dXQucHJpbnQoZGVlcER1bXAoYmxvY2spKTsKKyAgICBpZiAobnVtU3RhY2tTbG90cygpKSB7Cisg
ICAgICAgIG91dC5wcmludCgiU3RhY2sgc2xvdHM6XG4iKTsKKyAgICAgICAgZm9yIChTdGFja1Ns
b3QqIHNsb3QgOiBzdGFja1Nsb3RzKCkpCisgICAgICAgICAgICBvdXQucHJpbnQoIiAgICAiLCBk
ZWVwRHVtcChzbG90KSwgIlxuIik7CisgICAgfQorICAgIGlmIChudW1TcGVjaWFscygpKSB7Cisg
ICAgICAgIG91dC5wcmludCgiU3BlY2lhbHM6XG4iKTsKKyAgICAgICAgZm9yIChTcGVjaWFsKiBz
cGVjaWFsIDogc3BlY2lhbHMoKSkKKyAgICAgICAgICAgIG91dC5wcmludCgiICAgICIsIGRlZXBE
dW1wKHNwZWNpYWwpLCAiXG4iKTsKKyAgICB9Cit9CisKK30gfSB9IC8vIG5hbWVzcGFjZSBKU0M6
OkIzOjpBaXIKKwpJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL2Fpci9BaXJDb2RlLmgK
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL2Fpci9BaXJDb2RlLmgJKHJl
dmlzaW9uIDApCisrKyBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvYWlyL0FpckNvZGUuaAkod29y
a2luZyBjb3B5KQpAQCAtMCwwICsxLDEyNSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNSBB
cHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5k
IHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2Rp
ZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRp
dGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUg
bXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qg
b2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0
cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmln
aHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dp
bmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1h
dGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZU
V0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBS
RVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8s
IFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVT
UyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZF
TlQgU0hBTEwgQVBQTEUgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5Z
IERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9S
IENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisg
KiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVT
RSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZF
UiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBD
T05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdF
TkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBP
RiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNV
Q0ggREFNQUdFLiAKKyAqLworCisjaWZuZGVmIEFpckNvZGVfaAorI2RlZmluZSBBaXJDb2RlX2gK
KworI2luY2x1ZGUgIkFpckJhc2ljQmxvY2suaCIKKyNpbmNsdWRlICJBaXJTcGVjaWFsLmgiCisj
aW5jbHVkZSAiQWlyU3RhY2tTbG90LmgiCisKK25hbWVzcGFjZSBKU0MgeyBuYW1lc3BhY2UgQjMg
eworCitjbGFzcyBQcm9jZWR1cmU7CisKK25hbWVzcGFjZSBBaXIgeworCisvLyBUaGlzIGlzIGFu
IElSIHRoYXQgaXMgdmVyeSBjbG9zZSB0byB0aGUgYmFyZSBtZXRhbC4gSXQgcmVxdWlyZXMgYWJv
dXQgNDB4IG1vcmUgYnl0ZXMgdGhhbiB0aGUKKy8vIGdlbmVyYXRlZCBtYWNoaW5lIGNvZGUgLSBm
b3IgZXhhbXBsZSBpZiB5b3UncmUgZ2VuZXJhdGluZyAxTUIgb2YgbWFjaGluZSBjb2RlLCB5b3Ug
bmVlZCBhYm91dAorLy8gNDBNQiBvZiBBaXIuCisKK2NsYXNzIENvZGUgeworICAgIFdURl9NQUtF
X05PTkNPUFlBQkxFKENvZGUpOworICAgIFdURl9NQUtFX0ZBU1RfQUxMT0NBVEVEOworcHVibGlj
OgorICAgIENvZGUoKTsKKyAgICB+Q29kZSgpOworCisgICAgQmFzaWNCbG9jayogYWRkQmxvY2so
KTsKKworICAgIFN0YWNrU2xvdCogYWRkU3RhY2tTbG90KCk7CisKKyAgICBTcGVjaWFsKiBhZGRT
cGVjaWFsKHN0ZDo6dW5pcXVlX3B0cjxTcGVjaWFsPik7CisKKyAgICAvLyBUaGlzIGlzIHRoZSBz
cGVjaWFsIHlvdSBuZWVkIHRvIG1ha2UgYSBDIGNhbGwhCisgICAgU3BlY2lhbCogY0NhbGxTcGVj
aWFsKCk7CisKKyAgICB2b2lkIGR1bXAoUHJpbnRTdHJlYW0mKSBjb25zdDsKKworICAgIHVuc2ln
bmVkIHNpemUoKSBjb25zdCB7IHJldHVybiBtX2Jsb2Nrcy5zaXplKCk7IH0KKyAgICBCYXNpY0Js
b2NrKiBhdCh1bnNpZ25lZCBpbmRleCkgY29uc3QgeyByZXR1cm4gbV9ibG9ja3NbaW5kZXhdOyB9
CisgICAgQmFzaWNCbG9jayogb3BlcmF0b3JbXSh1bnNpZ25lZCBpbmRleCkgY29uc3QgeyByZXR1
cm4gYXQoaW5kZXgpOyB9CisKKyAgICBjbGFzcyBpdGVyYXRvciB7CisgICAgcHVibGljOgorICAg
ICAgICBpdGVyYXRvcigpOgorICAgICAgICAgICAgOiBtX3Byb2NlZHVyZShudWxscHRyKQorICAg
ICAgICAgICAgLCBtX2luZGV4KDApCisgICAgICAgIHsKKyAgICAgICAgfQorCisgICAgICAgIGl0
ZXJhdG9yKFByb2NlZHVyZSYgcHJvY2VkdXJlLCB1bnNpZ25lZCBpbmRleCkKKyAgICAgICAgICAg
IDogbV9wcm9jZWR1cmUoJnByb2NlZHVyZSkKKyAgICAgICAgICAgICwgbV9pbmRleChpbmRleCkK
KyAgICAgICAgeworICAgICAgICB9CisKKyAgICAgICAgQmFzaWNCbG9jayogb3BlcmF0b3IqKCkK
KyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIG1fcHJvY2VkdXJlLT5hdChtX2luZGV4KTsK
KyAgICAgICAgfQorCisgICAgICAgIGl0ZXJhdG9yJiBvcGVyYXRvcisrKCkKKyAgICAgICAgewor
ICAgICAgICAgICAgbV9pbmRleCA9IGZpbmROZXh0KG1faW5kZXggKyAxKTsKKyAgICAgICAgICAg
IHJldHVybiAqdGhpczsKKyAgICAgICAgfQorCisgICAgICAgIGJvb2wgb3BlcmF0b3I9PShjb25z
dCBpdGVyYXRvciYgb3RoZXIpIGNvbnN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBt
X2luZGV4ID09IG90aGVyLm1faW5kZXg7CisgICAgICAgIH0KKworICAgICAgICBib29sIG9wZXJh
dG9yIT0oY29uc3QgaXRlcmF0b3ImIG90aGVyKSBjb25zdAorICAgICAgICB7CisgICAgICAgICAg
ICByZXR1cm4gISgqdGhpcyA9PSBvdGhlcik7CisgICAgICAgIH0KKworICAgIHByaXZhdGU6Cisg
ICAgICAgIHVuc2lnbmVkIGZpbmROZXh0KHVuc2lnbmVkIGluZGV4KQorICAgICAgICB7CisgICAg
ICAgICAgICB3aGlsZSAoaW5kZXggPCBtX3Byb2NlZHVyZS0+c2l6ZSgpICYmICFtX3Byb2NlZHVy
ZS0+YXQoaW5kZXgpKQorICAgICAgICAgICAgICAgIGluZGV4Kys7CisgICAgICAgICAgICByZXR1
cm4gaW5leDsKKyAgICAgICAgfQorCisgICAgICAgIFByb2NlZHVyZSogbV9wcm9jZWR1cmU7Cisg
ICAgICAgIHVuc2lnbmVkIG1faW5kZXg7CisgICAgfTsKKworICAgIGl0ZXJhdG9yIGJlZ2luKCkg
Y29uc3QgeyByZXR1cm4gaXRlcmF0b3IoKnRoaXMsIDApOyB9CisgICAgaXRlcmF0b3IgZW5kKCkg
Y29uc3QgeyByZXR1cm4gaXRlcmF0b3IoKnRoaXMsIG51bUJsb2NrcygpKTsgfQorCitwcml2YXRl
OgorICAgIFZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8U3RhY2tTbG90Pj4gbV9zdGFja1Nsb3RzOwor
ICAgIFZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QmFzaWNCbG9jaz4+IG1fYmxvY2tzOworICAgIFZl
Y3RvcjxzdGQ6OnVuaXF1ZV9wdHI8U3BlY2lhbD4+IG1fc3BlY2lhbHM7CisgICAgU3BlY2lhbCog
bV9jYWxsU3BlY2lhbDsKK307CisKK30gfSB9IC8vIG5hbWVzcGFjZSBKU0M6OkIzOjpBaXIKKwor
I2VuZGlmIC8vIEFpckNvZGVfaAorCkluZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvYWly
L0Fpckluc3QuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9haXIv
QWlySW5zdC5jcHAJKHJldmlzaW9uIDApCisrKyBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvYWly
L0Fpckluc3QuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsNDAgQEAKKy8qCisgKiBDb3B5
cmlnaHQgKEMpIDIwMTUgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJl
ZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Ig
d2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhl
IGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25z
IG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5v
dGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1l
ci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0
aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25z
IGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9u
IGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgor
ICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFTIElTJycg
QU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVU
IE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFC
SUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xB
SU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBC
RSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAor
ICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5P
VCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJW
SUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRF
UlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJ
VFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJ
TkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQg
T0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQ
T1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKworI2luY2x1ZGUgImNvbmZpZy5oIgor
I2luY2x1ZGUgIkFpckluc3QuaCIKKworI2luY2x1ZGUgIkIzVmFsdWUuaCIKKyNpbmNsdWRlIDx3
dGYvTGlzdER1bXAuaD4KKworbmFtZXNwYWNlIEpTQyB7IG5hbWVzcGFjZSBCMyB7IG5hbWVzcGFj
ZSBBaXIgeworCit2b2lkIEluc3Q6OmR1bXAoUHJpbnRTdHJlYW0mIG91dCkgY29uc3QKK3sKKyAg
ICBvdXQucHJpbnQob3Bjb2RlLCAiICIsIGxpc3REdW1wKGFyZ3MpLCAiICA7ICIsICpvcmlnaW4p
OworfQorCit9IH0gfSAvLyBuYW1lc3BhY2UgSlNDOjpCMzo6QWlyCisKSW5kZXg6IFNvdXJjZS9K
YXZhU2NyaXB0Q29yZS9iMy9haXIvQWlySW5zdC5oCj09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZh
U2NyaXB0Q29yZS9iMy9haXIvQWlySW5zdC5oCShyZXZpc2lvbiAwKQorKysgU291cmNlL0phdmFT
Y3JpcHRDb3JlL2IzL2Fpci9BaXJJbnN0LmgJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSwxMzYg
QEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTUgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2Vy
dmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkg
Zm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHBy
b3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4g
UmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5
cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xs
b3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBt
dXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlz
dCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAg
ICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUg
ZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUg
SU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMs
IElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElF
UyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVS
UE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IKKyAq
IENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVO
VEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElO
Q0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVU
RSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBP
UiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZ
CisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFks
IE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcg
SU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBB
RFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKworI2lmbmRl
ZiBBaXJJbnN0X2gKKyNkZWZpbmUgQWlySW5zdF9oCisKKyNpbmNsdWRlICJBaXJBcmcuaCIKKyNp
bmNsdWRlICJBaXJPcGNvZGUuaCIKKworbmFtZXNwYWNlIEpTQyB7CisKK2NsYXNzIENDYWxsSGVs
cGVyczsKKworbmFtZXNwYWNlIEIzIHsKKworY2xhc3MgVmFsdWU7CisKK25hbWVzcGFjZSBBaXIg
eworCitzdHJ1Y3QgSW5zdCB7CitwdWJsaWM6CisgICAgdHlwZWRlZiBWZWN0b3I8QXJnLCAzPiBB
cmdMaXN0OworCisgICAgSW5zdChPcGNvZGUgb3Bjb2RlLCBWYWx1ZSogb3JpZ2luKQorICAgICAg
ICA6IG9yaWdpbihvcmlnaW4pCisgICAgICAgICwgb3Bjb2RlKG9wY29kZSkKKyAgICB7CisgICAg
fQorICAgIAorICAgIHRlbXBsYXRlPHR5cGVuYW1lLi4uIEFyZ3VtZW50cz4KKyAgICBJbnN0KE9w
Y29kZSBvcGNvZGUsIFZhbHVlKiBvcmlnaW4sIEFyZyBhcmcsIEFyZ3VtZW50cy4uLiBhcmd1bWVu
dHMpCisgICAgICAgIDogYXJnc3sgYXJnLCBhcmd1bWVudHMuLi4gfQorICAgICAgICAsIG9yaWdp
bihvcmlnaW4pCisgICAgICAgICwgb3Bjb2RlKG9wY29kZSkKKyAgICB7CisgICAgfQorCisgICAg
SW5zdChPcGNvZGUgb3Bjb2RlLCBWYWx1ZSogb3JpZ2luLCBjb25zdCBBcmdMaXN0JiBhcmd1bWVu
dHMpCisgICAgICAgIDogYXJncyhhcmd1bWVudHMpCisgICAgICAgICwgb3JpZ2luKG9yaWdpbikK
KyAgICAgICAgLCBvcGNvZGUob3Bjb2RlKQorICAgIHsKKyAgICB9CisKKyAgICBJbnN0KE9wY29k
ZSBvcGNvZGUsIFZhbHVlKiBvcmlnaW4sIEFyZ0xpc3QmJiBhcmd1bWVudHMpCisgICAgICAgIDog
YXJncyhXVEY6Om1vdmUoYXJndW1lbnRzKSkKKyAgICAgICAgLCBvcmlnaW4ob3JpZ2luKQorICAg
ICAgICAsIG9wY29kZShvcGNvZGUpCisgICAgeworICAgIH0KKworICAgIC8vIE5vdGUgdGhhdCB0
aGVzZSBmdW5jdG9ycyBhbGwgYXZvaWQgdXNpbmcgImNvbnN0IiBiZWNhdXNlIHdlIHdhbnQgdG8g
dXNlIHRoZW0gZm9yIHRoaW5ncyB0aGF0CisgICAgLy8gZWRpdCBJUi4gSVIgaXMgbWVhbnQgdG8g
YmUgZWRpdGVkOyBpZiB5b3UncmUgY2FycnlpbmcgYXJvdW5kIGEgImNvbnN0IEluc3QmIiB0aGVu
IHlvdSdyZQorICAgIC8vIHByb2JhYmx5IGRvaW5nIGl0IHdyb25nLgorCisgICAgLy8gVGhpcyBv
bmx5IHdhbGtzIHRob3NlIFRtcHMgdGhhdCBhcmUgZXhwbGljaXRseSBtZW50aW9uZWQsIGFuZCBp
dCBkb2Vzbid0IHRlbGwgeW91IHRoZWlyIHJvbGUKKyAgICAvLyBvciB0eXBlLgorICAgIHRlbXBs
YXRlPHR5cGVuYW1lIEZ1bmN0b3I+CisgICAgdm9pZCBmb3JFYWNoVG1wRmFzdChjb25zdCBGdW5j
dG9yJiBmdW5jdG9yKQorICAgIHsKKyAgICAgICAgZm9yIChBcmcgYXJnIDogYXJncykKKyAgICAg
ICAgICAgIGFyZy5mb3JFYWNoVG1wRmFzdChmdW5jdG9yKTsKKyAgICB9CisKKyAgICB0eXBlZGVm
IHZvaWQgRWFjaEFyZ0NhbGxiYWNrKEFyZyYsIEFyZzo6Um9sZSwgQXJnOjpUeXBlKTsKKyAgICAK
KyAgICAvLyBDYWxscyB0aGUgZnVuY3RvciB3aXRoIChhcmcsIHJvbGUsIHR5cGUpLiBUaGlzIGZ1
bmN0aW9uIGlzIGF1dG8tZ2VuZXJhdGVkIGJ5CisgICAgLy8gb3Bjb2RlX2dlbmVyYXRvci5yYi4K
KyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBGdW5jdG9yPgorICAgIHZvaWQgZm9yRWFjaEFyZyhjb25z
dCBGdW5jdG9yJiBmdW5jdG9yKTsKKworICAgIC8vIENhbGxzIHRoZSBmdW5jdG9yIHdpdGggKHRt
cCwgcm9sZSwgdHlwZSkuCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgRnVuY3Rvcj4KKyAgICB2b2lk
IGZvckVhY2hUbXAoY29uc3QgRnVuY3RvciYgZnVuY3RvcikKKyAgICB7CisgICAgICAgIGZvckVh
Y2hBcmdSb2xlKAorICAgICAgICAgICAgWyZdIChBcmcmIGFyZywgQXJnOjpSb2xlIHJvbGUsIEFy
Zzo6VHlwZSB0eXBlKSB7CisgICAgICAgICAgICAgICAgYXJnLmZvckVhY2hUbXAocm9sZSwgdHlw
ZSwgZnVuY3Rvcik7CisgICAgICAgICAgICB9KTsKKyAgICB9CisKKyAgICAvLyBSZXBvcnRzIGFu
eSBhZGRpdGlvbmFsIHJlZ2lzdGVycyBjbG9iYmVyZWQgYnkgdGhpcyBvcGVyYXRpb24uIFRoaXMg
ZnVuY3Rpb24gaXMgYXV0by1nZW5lcmF0ZWQKKyAgICAvLyBieSBvcGNvZGVfZ2VuZXJhdG9yLnJi
LgorICAgIGNvbnN0IFJlZ2lzdGVyU2V0JiBleHRyYUNsb2JiZXJlZFJlZ3MoKTsKKworICAgIC8v
IElzIHRoaXMgaW5zdHJ1Y3Rpb24gaW4gb25lIG9mIHRoZSB2YWxpZCBmb3JtcyByaWdodCBub3c/
IFRoaXMgZnVuY3Rpb24gaXMgYXV0by1nZW5lcmF0ZWQgYnkKKyAgICAvLyBvcGNvZGVfZ2VuZXJh
dG9yLnJiLgorICAgIGJvb2wgaXNWYWxpZEZvcm0oKTsKKworICAgIC8vIEFzc3VtaW5nIHRoaXMg
aW5zdHJ1Y3Rpb24gaXMgaW4gYSB2YWxpZCBmb3JtIHJpZ2h0IG5vdywgd2lsbCBpdCBzdGlsbCBi
ZSBpbiBvbmUgb2YgdGhlIHZhbGlkCisgICAgLy8gZm9ybXMgaWYgd2UgcHV0IGFuIEFkZHIgcmVm
ZXJlbmNpbmcgdGhlIHN0YWNrIChvciBhIFN0YWNrU2xvdCBvciBDYWxsQXJnLCBvZiBjb3Vyc2Up
IGluIHRoZQorICAgIC8vIGdpdmVuIGluZGV4PyBTcGlsbGluZyB1c2VzIHRoaXM6IGl0IHdhbGtz
IHRoZSBhcmdzIGJ5IGluZGV4IHRvIGZpbmQgVG1wcyB0aGF0IG5lZWQgc3BpbGxpbmc7CisgICAg
Ly8gaWYgaXQgZmluZHMgb25lLCBpdCBjYWxscyB0aGlzIHRvIHNlZSBpZiBpdCBjYW4gcmVwbGFj
ZSB0aGUgQXJnOjpUbXAgd2l0aCBhbiBBcmc6OkFkZHIuIElmIGl0CisgICAgLy8gZmluZHMgYSBu
b24tVG1wIEFyZywgdGhlbiBpdCBjYWxscyB0aGF0IEFyZydzIGZvckVhY2hUbXAgdG8gZG8gYSBy
ZXBsYWNlbWVudCB0aGF0IHdheS4KKyAgICAvLworICAgIC8vIFRoaXMgZnVuY3Rpb24gaXMgYXV0
by1nZW5lcmF0ZWQgYnkgb3Bjb2RlX2dlbmVyYXRvci5yYi4KKyAgICBib29sIGFkbWl0c1N0YWNr
KHVuc2lnbmVkIGFyZ0luZGV4KTsKKworICAgIC8vIEdlbmVyYXRlIHNvbWUgY29kZSBmb3IgdGhp
cyBpbnN0cnVjdGlvbi4gVGhpcyBpcywgbGlrZSwgbGl0ZXJhbGx5IG91ciBiYWNrZW5kLiBJZiB0
aGlzIGlzIHRoZQorICAgIC8vIHRlcm1pbmFsLCBpdCByZXR1cm5zIHRoZSBqdW1wIHRoYXQgbmVl
ZHMgdG8gYmUgbGlua2VkIGZvciB0aGUgInRoZW4iIGNhc2UsIHdpdGggdGhlICJlbHNlIgorICAg
IC8vIGNhc2UgYmVpbmcgZmFsbC10aHJvdWdoLiBUaGlzIGZ1bmN0aW9uIGlzIGF1dG8tZ2VuZXJh
dGVkIGJ5IG9wY29kZV9nZW5lcmF0b3IucmIuCisgICAgQ0NhbGxIZWxwZXJzOjpKdW1wIGdlbmVy
YXRlKENDYWxsSGVscGVycyYpOworCisgICAgdm9pZCBkdW1wKFByaW50U3RyZWFtJikgY29uc3Q7
CisKKyAgICBBcmdMaXN0IGFyZ3M7CisgICAgVmFsdWUqIG9yaWdpbjsgLy8gVGhlIEIzOjpWYWx1
ZSB0aGF0IHRoaXMgb3JpZ2luYXRlZCBmcm9tLgorICAgIE9wY29kZSBvcGNvZGU7Cit9OworCit9
IH0gfSAvLyBuYW1lc3BhY2UgSlNDOjpCMzo6QWlyCisKKyNlbmRpZiAvLyBBaXJJbnN0X2gKKwpJ
bmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL2Fpci9BaXJJbnN0SW5saW5lcy5oCj09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9haXIvQWlySW5zdElubGluZXMuaAko
cmV2aXNpb24gMCkKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9haXIvQWlySW5zdElubGlu
ZXMuaAkod29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDU0IEBACisvKgorICogQ29weXJpZ2h0IChD
KSAyMDE1IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1
dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQK
KyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dp
bmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3Vy
Y2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRo
aXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAy
LiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3Zl
IGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhl
IGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Ig
b3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBU
SElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkK
KyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElN
SVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFO
RCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJ
TiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxF
IEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1Q
TEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRF
RCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExP
U1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9O
KSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVU
SEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5H
IE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBV
U0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJ
VFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisKKyNpZm5kZWYgQWlySW5zdElubGluZXNfaAorI2Rl
ZmluZSBBaXJJbnN0SW5saW5lc19oCisKKyNpbmNsdWRlICJBaXJJbnN0LmgiCisjaW5jbHVkZSAi
QWlyT3Bjb2RlVXRpbHMuaCIKKyNpbmNsdWRlICJBaXJTcGVjaWFscy5oIgorI2luY2x1ZGUgIkIz
U3RhY2ttYXAuaCIKKyNpbmNsdWRlICJCM1ZhbHVlLmgiCisKK25hbWVzcGFjZSBKU0MgeyBuYW1l
c3BhY2UgQjMgeyBuYW1lc3BhY2UgQWlyIHsKKworaW5saW5lIGJvb2wgaXNTaGlmdFZhbGlkKElu
c3QmIGluc3QpCit7CisjaWYgQ1BVKFg4NikKKyAgICByZXR1cm4gaW5zdC5hcmdzWzBdID09IFRt
cChYODZSZWdpc3Rlcjo6Y3gpOworI2Vsc2UKKyAgICByZXR1cm4gdHJ1ZTsKKyNlbmRpZgorfSAg
IAorCitpbmxpbmUgYm9vbCBpc0xzaGlmdDMyVmFsdWUoSW5zdCYgaW5zdCkKK3sKKyAgICByZXR1
cm4gaXNTaGlmdFZhbGlkKGluc3QpOworfQorCit9IH0gfSAvLyBuYW1lc3BhY2UgSlNDOjpCMzo6
QWlyCisKKyNlbmRpZiAvLyBBaXJJbnN0SW5saW5lc19oCisKSW5kZXg6IFNvdXJjZS9KYXZhU2Ny
aXB0Q29yZS9iMy9haXIvQWlyT3Bjb2RlLm9wY29kZXMKPT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL0ph
dmFTY3JpcHRDb3JlL2IzL2Fpci9BaXJPcGNvZGUub3Bjb2RlcwkocmV2aXNpb24gMCkKKysrIFNv
dXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9haXIvQWlyT3Bjb2RlLm9wY29kZXMJKHdvcmtpbmcgY29w
eSkKQEAgLTAsMCArMSwxMDggQEAKKyMgQ29weXJpZ2h0IChDKSAyMDE1IEFwcGxlIEluYy4gQWxs
IHJpZ2h0cyByZXNlcnZlZC4KKyMKKyMgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2Ug
YW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisjIG1vZGlmaWNhdGlvbiwgYXJlIHBl
cm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworIyBhcmUgbWV0
OgorIyAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFi
b3ZlIGNvcHlyaWdodAorIyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0
aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisjIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkg
Zm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisjICAgIG5vdGljZSwgdGhp
cyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUK
KyMgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGgg
dGhlIGRpc3RyaWJ1dGlvbi4KKyMKKyMgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBM
RSBJTkMuIEFORCBJVFMgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJworIyBBTkQgQU5ZIEVYUFJFU1Mg
T1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyMg
VEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9S
IEEgUEFSVElDVUxBUgorIyBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFM
TCBBUFBMRSBJTkMuIE9SIElUUyBDT05UUklCVVRPUlMKKyMgQkUgTElBQkxFIEZPUiBBTlkgRElS
RUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgorIyBDT05T
RVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJF
TUVOVCBPRgorIyBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFU
QSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MKKyMgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNF
RCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KKyMgQ09OVFJBQ1Qs
IFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVS
V0lTRSkKKyMgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdB
UkUsIEVWRU4gSUYgQURWSVNFRCBPRgorIyBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0Uu
CisKKyMgU3lsbGFidXM6CisjCisjIFJvbGVzIGFuZCB0eXBlczoKKyMgVTpHID0+IHVzZSBvZiBh
IGdlbmVyYWwtcHVycG9zZSByZWdpc3RlciBvciB2YWx1ZQorIyBEOkcgPT4gZGVmIG9mIGEgZ2Vu
ZXJhbC1wdXJwb3NlIHJlZ2lzdGVyIG9yIHZhbHVlCisjIFVEOkcgPT4gdXNlIGFuZCBkZWYgb2Yg
YSBnZW5lcmFsLXB1cnBvc2UgcmVnaXN0ZXIgb3IgdmFsdWUKKyMgVTpGID0+IHVzZSBvZiBhIGZs
b2F0IHJlZ2lzdGVyIG9yIHZhbHVlCisjIEQ6RiA9PiBkZWYgb2YgYSBmbG9hdCByZWdpc3RlciBv
ciB2YWx1ZQorIyBVRDpGID0+IHVzZSBhbmQgZGVmIG9mIGEgZmxvYXQgcmVnaXN0ZXIgb3IgdmFs
dWUKKyMKKyMgQXJndW1lbnQga2luZHM6CisjIFRtcCA9PiB0ZW1wb3Jhcnkgb3IgcmVnaXN0ZXIK
KyMgSW1tID0+IDMyLWJpdCBpbW1lZGlhdGUgaW50CisjIEltbVB0ciA9PiBUcnVzdGVkSW1tUHRy
CisjIEFkZHIgPT4gYWRkcmVzcyBhcyB0ZW1wb3JhcnkvcmVnaXN0ZXIrb2Zmc2V0CisjIEluZGV4
ID0+IEJhc2VJbmRleCBhZGRyZXNzCisjIEFicyA9PiBBYnNvbHV0ZUFkZHJlc3MKKyMKKyMgVGhl
IHBhcnNlciB2aWV3cyB0aGVzZSB0aGluZ3MgYXMga2V5d29yZHMsIGFuZCB1bmRlcnN0YW5kcyB0
aGF0IHRoZXkgZmFsbCBpbnRvIHR3byBkaXN0aW5jdCBjbGFzc2VzCisjIG9mIHRoaW5ncy4gU28s
IGFsdGhvdWdoIHRoaXMgZmlsZSB1c2VzIGEgcGFydGljdWxhciBpbmRlbnRhdGlvbiBzdHlsZSwg
bm9uZSBvZiB0aGUgd2hpdGVzcGFjZSBvcgorIyBldmVuIG5ld2xpbmVzIGFyZSBtZWFuaW5nZnVs
IHRvIHRoZSBwYXJzZXIuIEZvciBleGFtcGxlLCB5b3UgY291bGQgd3JpdGU6CisjCisjIEZvbzQy
IFU6RywgVUQ6RiBJbW0sIFRtcCBBZGRyLCBUbXAKKyMKKyMgQW5kIHRoZSBwYXJzZXIgd291bGQg
a25vdyB0aGF0IHRoaXMgaXMgdGhlIHNhbWUgYXM6CisjCisjIEZvbzQyIFU6RywgVUQ6RgorIyAg
ICAgSW1tLCBUbXAKKyMgICAgIEFkZHIsIFRtcAorIworIyBJLmUuIGEgdHdvLWZvcm0gaW5zdHJ1
Y3Rpb24gdGhhdCB1c2VzIGEgR1BSIG9yIGFuIGludCBpbW1lZGlhdGUgYW5kIHVzZXMrZGVmcyBh
IGZsb2F0IHJlZ2lzdGVyLgorCisjIE5vdGUgdGhhdCB0aGUgb3Bjb2RlcyBoZXJlIGhhdmUgYSBs
ZWFkaW5nIGNhcGl0YWwgKEFkZDMyKSBidXQgbXVzdCBjb3JyZXNwb25kIHRvIE1hY3JvQXNzZW1i
bGVyCisjIEFQSSB0aGF0IGhhcyBhIGxlYWRpbmcgbG93ZXItY2FzZSAoYWRkMzIpLgorCitBZGQz
MiBVOkcsIFVEOkcKKyAgICBUbXAsIFRtcAorICAgIEltbSwgQWRkcgorICAgIEltbSwgVG1wCisg
ICAgQWRkciwgVG1wCisgICAgVG1wLCBBZGRyCisKK0FkZDMyIFU6RywgVTpHLCBEOkcKKyAgICBJ
bW0sIFRtcCwgVG1wCisKK0FuZDMyIFU6RywgVUQ6RworICAgIFRtcCwgVG1wCisgICAgSW1tLCBU
bXAKKyAgICBUbXAsIEFkZHIKKyAgICBBZGRyLCBUbXAKKyAgICBJbW0sIEFkZHIKKworTHNoaWZ0
MzIgVTpHLCBVRDpHCisgICAgVG1wKiwgVG1wCisgICAgSW1tLCBUbXAKKworTXVsMzIgVTpHLCBV
RDpHCisgICAgVG1wLCBUbXAKKyAgICBBZGRyLCBUbXAKKworTW92ZSBVOkcsIEQ6RworICAgIFRt
cCwgVG1wCisgICAgSW1tLCBUbXAKKyAgICBJbW1QdHIsIFRtcAorICAgIEFkZHIsIFRtcCBhcyBs
b2FkICMgVGhpcyBtZWFucyB0aGF0ICJNb3ZlIEFkZHIsIFRtcCIgaXMgY29kZS1nZW5lcmF0ZWQg
YXMgImxvYWQiIG5vdCAibW92ZSIuCisgICAgVG1wLCBBZGRyIGFzIHN0b3JlCisKK01vdmVEb3Vi
bGUgVTpGLCBEOkYKKyAgICBUbXAsIFRtcAorICAgIEFkZHIsIFRtcCBhcyBsb2FkRG91YmxlCisg
ICAgVG1wLCBBZGRyIGFzIHN0b3JlRG91YmxlCisKK01vdmU2NFRvRG91YmxlIFU6RywgRDpGCisg
ICAgVG1wLCBUbXAKKworTW92ZURvdWJsZVRvNjQgVTpGLCBEOkcKKyAgICBUbXAsIFRtcAorCitS
ZXQKKworIyBBaXIgYWxsb3dzIGZvciBleG90aWMgYmVoYXZpb3IuCitzcGVjaWFsIFBhdGNoCisK
KyMgVGFrZXMgYXJndW1lbnQgcmVnaXN0ZXJzIGFzIGlucHV0cy4KK3NwZWNpYWwgQ2FsbApJbmRl
eDogU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL2Fpci9BaXJTcGVjaWFsLmNwcAo9PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvYWlyL0FpclNwZWNpYWwuY3BwCShyZXZpc2lv
biAwKQorKysgU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL2Fpci9BaXJTcGVjaWFsLmNwcAkod29y
a2luZyBjb3B5KQpAQCAtMCwwICsxLDU1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE1IEFw
cGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQg
dXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlm
aWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0
aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBt
dXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBv
ZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3Ry
aWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdo
dAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2lu
ZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0
ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRX
QVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJF
U1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywg
VEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNT
IEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVO
VCBTSEFMTCBBUFBMRSBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkg
RElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1Ig
Q09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAq
IFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNF
LCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVS
IENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENP
TlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VO
Q0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9G
IFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VD
SCBEQU1BR0UuIAorICovCisKKyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJBaXJTcGVj
aWFsLmgiCisKK25hbWVzcGFjZSBKU0MgeyBuYW1lc3BhY2UgQjMgeyBuYW1lc3BhY2UgQWlyIHsK
KworU3BlY2lhbDo6U3BlY2lhbChjb25zdCBjaGFyKiBuYW1lKQorICAgIDogbV9uYW1lKG5hbWUp
CisgICAgLCBtX2luZGV4KFVJTlRfTUFYKQoreworfQorCitTcGVjaWFsOjp+U3BlY2lhbCgpCit7
Cit9CisKK3ZvaWQgU3BlY2lhbDo6ZHVtcChQcmludFN0cmVhbSYgb3V0KSBjb25zdAoreworICAg
IG91dC5wcmludChtX25hbWUpOworICAgIGlmIChtX2luZGV4ICE9IFVJTlRfTUFYKQorICAgICAg
ICBvdXQucHJpbnQobV9pbmRleCk7Cit9CisKK3ZvaWQgU3BlY2lhbDo6ZGVlcER1bXAoUHJpbnRT
dHJlYW0mIG91dCkgY29uc3QKK3sKKyAgICBvdXQucHJpbnQoKnRoaXMsICI6ICIpOworICAgIGRl
ZXBEdW1wSW1wbChvdXQpOworfQorCit9IH0gfSAvLyBuYW1lc3BhY2UgSlNDOjpCMzo6QWlyCisK
SW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9haXIvQWlyU3BlY2lhbC5oCj09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9haXIvQWlyU3BlY2lhbC5oCShyZXZpc2lv
biAwKQorKysgU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL2Fpci9BaXJTcGVjaWFsLmgJKHdvcmtp
bmcgY29weSkKQEAgLTAsMCArMSw5MSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNSBBcHBs
ZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVz
ZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmlj
YXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlv
bnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVz
dCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2Yg
Y29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmli
dXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQK
KyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcg
ZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVy
aWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FS
RSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNT
IE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRI
RQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBG
T1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQg
U0hBTEwgQVBQTEUgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJ
UkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENP
TlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQ
Uk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwg
REFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBD
QVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05U
UkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNF
IE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBU
SElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0gg
REFNQUdFLiAKKyAqLworCisjaWZuZGVmIEFpclNwZWNpYWxfaAorI2RlZmluZSBBaXJTcGVjaWFs
X2gKKworI2luY2x1ZGUgIkFpckluc3QuaCIKKyNpbmNsdWRlIDx3dGYvRmFzdE1hbGxvYy5oPgor
I2luY2x1ZGUgPHd0Zi9Ob25jb3B5YWJsZS5oPgorI2luY2x1ZGUgPHd0Zi9TY29wZWRMYW1iZGEu
aD4KKworbmFtZXNwYWNlIEpTQyB7IG5hbWVzcGFjZSBCMyB7IG5hbWVzcGFjZSBBaXIgeworCitj
bGFzcyBTcGVjaWFsIHsKKyAgICBXVEZfTUFLRV9OT05DT1BZQUJMRShTcGVjaWFsKTsKKyAgICBX
VEZfTUFLRV9GQVNUX0FMTE9DQVRFRDsKK3B1YmxpYzoKKyAgICBTcGVjaWFsKGNvbnN0IGNoYXIq
IG5hbWUpOworICAgIHZpcnR1YWwgflNwZWNpYWwoKTsKKworICAgIGNvbnN0IGNoYXIqIG5hbWUo
KSBjb25zdCB7IHJldHVybiBtX25hbWU7IH0KKworICAgIHZpcnR1YWwgdm9pZCBmb3JFYWNoQXJn
KEluc3QmLCBjb25zdCBTY29wZWRMYW1iZGE8SW5zdDo6RWFjaEFyZ0NhbGxiYWNrPiYpID0gMDsK
KyAgICB2aXJ0dWFsIGJvb2wgaXNWYWxpZChJbnN0JikgPSAwOworICAgIHZpcnR1YWwgYm9vbCBh
ZG1pdHNTdGFjayhJbnN0JiwgdW5zaWduZWQgYXJnSW5kZXgpID0gMDsKKyAgICB2aXJ0dWFsIEND
YWxsSGVscGVyczo6SnVtcCBnZW5lcmF0ZShJbnN0JiwgQ0NhbGxIZWxwZXJzJikgPSAwOworICAg
IHZpcnR1YWwgY29uc3QgUmVnaXN0ZXJTZXQmIGV4dHJhQ2xvYmJlcmVkUmVncygpID0gMDsKKwor
ICAgIHZvaWQgZHVtcChQcmludFN0cmVhbSYpIGNvbnN0OworICAgIHZvaWQgZGVlcER1bXAoUHJp
bnRTdHJlYW0mKSBjb25zdDsKKworcHJvdGVjdGVkOgorICAgIHZpcnR1YWwgdm9pZCBkZWVwRHVt
cEltcGwoUHJpbnRTdHJlYW0mKSBjb25zdCA9IDA7CisKK3ByaXZhdGU6CisgICAgZnJpZW5kIGNs
YXNzIENvZGU7CisKKyAgICBjb25zdCBjaGFyKiBtX25hbWU7CisgICAgdW5zaWduZWQgbV9pbmRl
eDsKK307CisKK2NsYXNzIERlZXBTcGVjaWFsRHVtcCB7CitwdWJsaWM6CisgICAgRGVlcFNwZWNp
YWxEaW1wKFNwZWNpYWwqIHNwZWNpYWwpCisgICAgICAgIDogbV9zcGVjaWFsKHNwZWNpYWwpCisg
ICAgeworICAgIH0KKworICAgIHZvaWQgZHVtcChQcmludFN0cmVhbSYgb3V0KSBjb25zdAorICAg
IHsKKyAgICAgICAgaWYgKG1fc3BlY2lhbCkKKyAgICAgICAgICAgIG1fc3BlY2lhbC0+ZGVlcER1
bXAob3V0KTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgb3V0LnByaW50KCI8bnVsbD4iKTsK
KyAgICB9CisKK3ByaXZhdGU6CisgICAgU3BlY2lhbCogbV9zcGVjaWFsOworfTsKKworRGVlcFNw
ZWNpYWxEdW1wIGRlZXBEdW1wKFNwZWNpYWwqIHNwZWNpYWwpCit7CisgICAgcmV0dXJuIERlZXBT
cGVjaWFsRHVtcChzcGVjaWFsKTsKK30KKworfSB9IH0gLy8gbmFtZXNwYWNlIEpTQzo6QjM6OkFp
cgorCisjZW5kaWYgLy8gQWlyU3BlY2lhbF9oCisKSW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29y
ZS9iMy9haXIvQWlyU3RhY2tTbG90LmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRD
b3JlL2IzL2Fpci9BaXJTdGFja1Nsb3QuaAkocmV2aXNpb24gMCkKKysrIFNvdXJjZS9KYXZhU2Ny
aXB0Q29yZS9iMy9haXIvQWlyU3RhY2tTbG90LmgJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSw5
MiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNSBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVz
ZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFy
eSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQg
cHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAx
LiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNv
cHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZv
bGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3Jt
IG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBs
aXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAq
ICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRo
ZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBM
RSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElF
UywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5U
SUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQ
VVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUgor
ICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lE
RU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAo
SU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElU
VVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7
IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVP
UlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElU
WSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lO
RyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElG
IEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLiAKKyAqLworCisjaWZu
ZGVmIEFpclN0YWNrU2xvdF9oCisjZGVmaW5lIEFpclN0YWNrU2xvdF9oCisKKyNpbmNsdWRlIDx3
dGYvTm9uQ29weWFibGUuaD4KKyNpbmNsdWRlIDx3dGYvRmFzdE1hbGxvYy5oPgorCituYW1lc3Bh
Y2UgSlNDIHsgbmFtZXNwYWNlIEIzIHsKKworY2xhc3MgU3RhY2tTbG90dmFsdWU7CisKK25hbWVz
cGFjZSBBaXIgeworCitjbGFzcyBTdGFja1Nsb3QgeworICAgIFdURl9NQUtFX05PTkNPUFlBQkxF
KFN0YWNrU2xvdCk7CisgICAgV1RGX01BS0VfRkFTVF9BTExPQ0FURUQ7CitwdWJsaWM6CisgICAg
dW5zaWduZWQgYnl0ZVNpemUoKSBjb25zdCB7IHJldHVybiBtX2J5dGVTaXplOyB9CisgICAgdW5z
aWduZWQgaW5kZXgoKSBjb25zdCB7IHJldHVybiBtX2luZGV4OyB9CisKKyAgICBTdGFja1Nsb3RW
YWx1ZSogdmFsdWUoKSBjb25zdCB7IHJldHVybiBtX3ZhbHVlOyB9CisKKyAgICB2b2lkIGR1bXAo
UHJpbnRTdHJlYW0mKSBjb25zdDsKKyAgICB2b2lkIGRlZXBEdW1wKFByaW50U3RyZWFtJikgY29u
c3Q7CisKK3ByaXZhdGU6CisgICAgZnJpZW5kIGNsYXNzIENvZGU7CisKKyAgICBTdGFja1Nsb3Qo
dW5zaWduZWQgYnl0ZVNpemUsIHVuc2lnbmVkIGluZGV4LCBTdGFja1Nsb3RWYWx1ZSogdmFsdWUp
CisgICAgICAgIDogbV9ieXRlU2l6ZShieXRlU2l6ZSkKKyAgICAgICAgLCBtX2luZGV4KGluZGV4
KQorICAgICAgICAsIG1fdmFsdWUodmFsdWUpCisgICAgeworICAgIH0KKyAgICAKKyAgICB1bnNp
Z25lZCBtX2J5dGVTaXplOworICAgIHVuc2lnbmVkIG1faW5kZXg7CisgICAgU3RhY2tTbG90VmFs
dWUqIG1fdmFsdWU7Cit9OworCitjbGFzcyBEZWVwU3RhY2tTbG90RHVtcCB7CitwdWJsaWM6Cisg
ICAgRGVlcFN0YWNrU2xvdER1bXAoU3RhY2tTbG90KiBzbG90KQorICAgICAgICA6IG1fc2xvdChz
bG90KQorICAgIHsKKyAgICB9CisKKyAgICB2b2lkIGR1bXAoUHJpbnRTdHJlYW0mIG91dCkgY29u
c3QKKyAgICB7CisgICAgICAgIGlmIChtX3Nsb3QpCisgICAgICAgICAgICBtX3Nsb3QtPmRlZXBE
dW1wKG91dCk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIG91dC5wcmludCgiPG51bGw+Iik7
CisgICAgfQorCitwcml2YXRlOgorICAgIFN0YWNrU2xvdCogbV9zbG90OworfTsKKworRGVlcFN0
YWNrU2xvdER1bXAgZGVlcER1bXAoU3RhY2tTbG90KiBzbG90KQoreworICAgIHJldHVybiBEZWVw
U3RhY2tTbG90RHVtcChzbG90KTsKK30KKworfSB9IH0gLy8gbmFtZXNwYWNlIEpTQzo6QjM6OkFp
cgorCisjZW5kaWYgLy8gQWlyU3RhY2tTbG90X2gKKwpJbmRleDogU291cmNlL0phdmFTY3JpcHRD
b3JlL2IzL2Fpci9BaXJUbXAuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29y
ZS9iMy9haXIvQWlyVG1wLmNwcAkocmV2aXNpb24gMCkKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29y
ZS9iMy9haXIvQWlyVG1wLmNwcAkod29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDUyIEBACisvKgor
ICogQ29weXJpZ2h0IChDKSAyMDE1IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAq
CisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3
aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0
aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJp
YnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Cisg
KiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRp
c2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXBy
b2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29u
ZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1l
bnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1
dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gYGBB
UyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJ
TkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVS
Q0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJF
IERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SCisgKiBDT05UUklC
VVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BF
Q0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcs
IEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMg
T1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5F
U1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0Yg
TElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JU
CisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBX
QVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBP
RiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisKKyNpbmNsdWRlICJjb25m
aWcuaCIKKyNpbmNsdWRlICJBaXJUbXAuaCIKKworbmFtZXNwYWNlIEpTQyB7IG5hbWVzcGFjZSBC
MyB7IG5hbWVzcGFjZSBBaXIgeworCit2b2lkIFRtcDo6ZHVtcChQcmludFN0cmVhbSYgb3V0KSBj
b25zdAoreworICAgIGlmICghKnRoaXMpIHsKKyAgICAgICAgb3V0LnByaW50KCI8bm9uZT4iKTsK
KyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGlmIChpc1JlZygpKSB7CisgICAgICAgIG91
dC5wcmludChyZWcoKSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpZiAoaXNHUFRt
cCgpKSB7CisgICAgICAgIG91dC5wcmludCgiJXRtcCIsIGdwVG1wSW5kZXgoKSk7CisgICAgICAg
IHJldHVybjsKKyAgICB9CisKKyAgICBvdXQucHJpbnQoIiVmdG1wIiwgZnBUbXBJbmRleCgpKTsK
K30KKworfSB9IH0gLy8gbmFtZXNwYWNlIEpTQzo6QjM6OkFpcgorCkluZGV4OiBTb3VyY2UvSmF2
YVNjcmlwdENvcmUvYjMvYWlyL0FpclRtcC5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2Ny
aXB0Q29yZS9iMy9haXIvQWlyVG1wLmgJKHJldmlzaW9uIDApCisrKyBTb3VyY2UvSmF2YVNjcmlw
dENvcmUvYjMvYWlyL0FpclRtcC5oCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsMjQ4IEBACisv
KgorICogQ29weXJpZ2h0IChDKSAyMDE1IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4K
KyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1z
LCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRl
ZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlz
dHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0
CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5n
IGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCBy
ZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2Yg
Y29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9j
dW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3Ry
aWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4g
YGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNM
VURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0Yg
TUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0Ug
QVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SCisgKiBDT05U
UklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwg
U1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJ
TkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09P
RFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVT
SU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICog
T0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBU
T1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFO
WSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNF
RCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisKKyNpZm5kZWYgQWly
VG1wX2gKKyNkZWZpbmUgQWlyVG1wX2gKKworI2luY2x1ZGUgIlJlZy5oIgorCituYW1lc3BhY2Ug
SlNDIHsgbmFtZXNwYWNlIEIzIHsgbmFtZXNwYWNlIEFpciB7CisKKy8vIEEgVG1wIGlzIGEgZ2Vu
ZXJhbGl6YXRpb24gb2YgYSByZWdpc3Rlci4gSXQgY2FuIGJlIHVzZWQgdG8gcmVmZXIgdG8gYW55
IEdQUiBvciBGUFIuIEl0IGNhbiBhbHNvCisvLyBiZSB1c2VkIHRvIHJlZmVyIHRvIGFuIHVuYWxs
b2NhdGVkIHJlZ2lzdGVyIChpLmUuIGEgdGVtcG9yYXJ5KS4gTGlrZSBtYW55IEFpciBjbGFzc2Vz
LCB3ZSB1c2UKKy8vIGRlbGliZXJhdGVseSB0ZXJzZSBuYW1pbmcgc2luY2Ugd2Ugd2lsbCBoYXZl
IHRvIHVzZSB0aGlzIG5hbWUgYSBsb3QuCisKK2NsYXNzIFRtcCB7CitwdWJsaWM6CisgICAgVG1w
KCkKKyAgICAgICAgOiBtX3ZhbHVlKDApCisgICAgeworICAgIH0KKworICAgIGV4cGxpY2l0IFRt
cChSZWcgcmVnKQorICAgIHsKKyAgICAgICAgaWYgKHJlZykgeworICAgICAgICAgICAgaWYgKHJl
Zy5pc0dQUigpKQorICAgICAgICAgICAgICAgIG1fdmFsdWUgPSBlbmNvZGVHUFIocmVnLmdwcigp
KTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBtX3ZhbHVlID0gZW5jb2RlRlBS
KHJlZy5mcHIoKSk7CisgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgbV92YWx1ZSA9IDA7Cisg
ICAgfQorCisgICAgc3RhdGljIFRtcCBncFRtcEZvckluZGV4KHVuc2lnbmVkIGluZGV4KQorICAg
IHsKKyAgICAgICAgVG1wIHJlc3VsdDsKKyAgICAgICAgcmVzdWx0Lm1fdmFsdWUgPSBlbmNvZGVH
UFRtcChpbmRleCk7CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorCisgICAgc3RhdGlj
IFRtcCBmcFRtcEZvckluZGV4KHVuc2lnbmVkIGluZGV4KQorICAgIHsKKyAgICAgICAgVG1wIHJl
c3VsdDsKKyAgICAgICAgcmVzdWx0Lm1fdmFsdWUgPSBlbmNvZGVGUFRtcChpbmRleCk7CisgICAg
ICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorCisgICAgc3RhdGljIFRtcCBmb3JSYXdWYWx1ZSh1
bnNpZ25lZCBpbmRleCkKKyAgICB7CisgICAgICAgIFRtcCByZXN1bHQ7CisgICAgICAgIHJlc3Vs
dC5tX3ZhbHVlID0gaW5kZXg7CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorCisgICAg
ZXhwbGljaXQgb3BlcmF0b3IgYm9vbCgpIGNvbnN0IHsgcmV0dXJuICEhbV92YWx1ZTsgfQorCisg
ICAgYm9vbCByYXdWYWx1ZSgpIGNvbnN0IHsgcmV0dXJuIG1fdmFsdWU7IH0KKworICAgIGJvb2wg
aXNHUCgpIGNvbnN0CisgICAgeworICAgICAgICByZXR1cm4gaXNFbmNvZGVkR1AobV92YWx1ZSk7
CisgICAgfQorCisgICAgYm9vbCBpc0ZQKCkgY29uc3QKKyAgICB7CisgICAgICAgIHJldHVybiBp
c0VuY29kZWRGUChtX3ZhbHVlKTsKKyAgICB9CisKKyAgICBib29sIGlzR1BSKCkgY29uc3QKKyAg
ICB7CisgICAgICAgIHJldHVybiBpc0VuY29kZWRHUFIobV92YWx1ZSk7CisgICAgfQorCisgICAg
Ym9vbCBpc0ZQUigpIGNvbnN0CisgICAgeworICAgICAgICByZXR1cm4gaXNFbmNvZGVkRlBSKG1f
dmFsdWUpOworICAgIH0KKworICAgIGJvb2wgaXNSZWcoKSBjb25zdAorICAgIHsKKyAgICAgICAg
cmV0dXJuIGlzR1BSKCkgfHwgaXNGUFIoKTsKKyAgICB9CisKKyAgICBHUFJSZWcgZ3ByKCkgY29u
c3QKKyAgICB7CisgICAgICAgIHJldHVybiBkZWNvZGVHUFIobV92YWx1ZSk7CisgICAgfQorCisg
ICAgRlBSUmVnIGZwcigpIGNvbnN0CisgICAgeworICAgICAgICByZXR1cm4gZGVjb2RlRlBSKG1f
dmFsdWUpOworICAgIH0KKworICAgIFJlZyByZWcoKSBjb25zdAorICAgIHsKKyAgICAgICAgaWYg
KGlzR1AoKSkKKyAgICAgICAgICAgIHJldHVybiBncHIoKTsKKyAgICAgICAgcmV0dXJuIGZwcigp
OworICAgIH0KKworICAgIHVuc2lnbmVkIGdwVG1wSW5kZXgoKSBjb25zdAorICAgIHsKKyAgICAg
ICAgcmV0dXJuIGRlY29kZUdQVG1wKG1fdmFsdWUpOworICAgIH0KKworICAgIHVuc2lnbmVkIGZw
VG1wSW5kZXgoKSBjb25zdAorICAgIHsKKyAgICAgICAgcmV0dXJuIGRlY29kZUZQVG1wKG1fdmFs
dWUpOworICAgIH0KKworICAgIHVuc2lnbmVkIHRtcEluZGV4KCkgY29uc3QKKyAgICB7CisgICAg
ICAgIGlmIChpc0dQKCkpCisgICAgICAgICAgICByZXR1cm4gZ3BUbXBJbmRleCgpOworICAgICAg
ICByZXR1cm4gZnBUbXBJbmRleCgpOworICAgIH0KKworICAgIGJvb2wgb3BlcmF0b3I9PShjb25z
dCBUbXAmIG90aGVyKSBjb25zdAorICAgIHsKKyAgICAgICAgcmV0dXJuIG1fdmFsdWUgPT0gb3Ro
ZXIubV92YWx1ZTsKKyAgICB9CisKKyAgICBib29sIG9wZXJhdG9yIT0oY29uc3QgVG1wJiBvdGhl
cikgY29uc3QKKyAgICB7CisgICAgICAgIHJldHVybiAhKCp0aGlzID09IG90aGVyKTsKKyAgICB9
CisKKyAgICB2b2lkIGR1bXAoUHJpbnRTdHJlYW0mIG91dCkgY29uc3Q7CisgICAgCitwcml2YXRl
OgorICAgIHN0YXRpYyBpbnQgZW5jb2RlR1AodW5zaWduZWQgaW5kZXgpCisgICAgeworICAgICAg
ICByZXR1cm4gMSArIGluZGV4OworICAgIH0KKworICAgIHN0YXRpYyBpbnQgZW5jb2RlRlAodW5z
aWduZWQgaW5kZXgpCisgICAgeworICAgICAgICByZXR1cm4gLTEgLSBpbmRleDsKKyAgICB9CisK
KyAgICBzdGF0aWMgaW50IGVuY29kZUdQUihHUFJSZWcgZ3ByKQorICAgIHsKKyAgICAgICAgcmV0
dXJuIGVuY29kZUdQKGdwciAtIE1hY3JvQXNzZW1ibGVyOjpmaXJzdFJlZ2lzdGVyKCkpOworICAg
IH0KKworICAgIHN0YXRpYyBpbnQgZW5jb2RlRlBSKEZQUlJlZyBmcHIpCisgICAgeworICAgICAg
ICByZXR1cm4gZW5jb2RlRlAoZnByIC0gTWFjcm9Bc3NlbWJsZXI6OmZpcnN0RlBSUmVnaXN0ZXIo
KSk7CisgICAgfQorCisgICAgc3RhdGljIGludCBlbmNvZGVHUFRtcCh1bnNpZ25lZCBpbmRleCkK
KyAgICB7CisgICAgICAgIHJldHVybiBlbmNvZGVHUFIoTWFjcm9Bc3NlbWJsZXI6Omxhc3RSZWdp
c3RlcigpKSArIDEgKyBpbmRleDsKKyAgICB9CisKKyAgICBzdGF0aWMgaW50IGVuY29kZUZQVG1w
KHVuc2lnbmVkIGluZGV4KQorICAgIHsKKyAgICAgICAgcmV0dXJuIGVuY29kZUZQUihNYWNyb0Fz
c2VtYmxlcjo6bGFzdEZQUmVnaXN0ZXIoKSkgLSAxIC0gaW5kZXg7CisgICAgfQorCisgICAgc3Rh
dGljIGJvb2wgaXNFbmNvZGVkR1AoaW50IHZhbHVlKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHZh
bHVlID4gMDsKKyAgICB9CisKKyAgICBzdGF0aWMgYm9vbCBpc0VuY29kZWRGUChpbnQgdmFsdWUp
CisgICAgeworICAgICAgICByZXR1cm4gdmFsdWUgPCAwOworICAgIH0KKworICAgIHN0YXRpYyBi
b29sIGlzRW5jb2RlZEdQUihpbnQgdmFsdWUpCisgICAgeworICAgICAgICByZXR1cm4gaXNFbmNv
ZGVkR1AodmFsdWUpICYmIHZhbHVlIDw9IGVuY29kZUdQUihNYWNyb0Fzc2VtYmxlcjo6bGFzdFJl
Z2lzdGVyKCkpOworICAgIH0KKworICAgIHN0YXRpYyBib29sIGlzRW5jb2RlZEZQUihpbnQgdmFs
dWUpCisgICAgeworICAgICAgICByZXR1cm4gaXNFbmNvZGVkRlAodmFsdWUpICYmIHZhbHVlID49
IGVuY29kZWRGUFIoTWFjcm9Bc3NlbWJsZXI6Omxhc3RGUFJlZ2lzdGVyKCkpOworICAgIH0KKwor
ICAgIHN0YXRpYyBib29sIGlzRW5jb2RlZEdQVG1wKGludCB2YWx1ZSkKKyAgICB7CisgICAgICAg
IHJldHVybiBpc0VuY29kZWRHUCh2YWx1ZSkgJiYgIWlzRW5jb2RlZEdQUih2YWx1ZSk7CisgICAg
fQorCisgICAgc3RhdGljIGJvb2wgaXNFbmNvZGVkRlBUbXAoaW50IHZhbHVlKQorICAgIHsKKyAg
ICAgICAgcmV0dXJuIGlzRW5jb2RlZEZQKHZhbHVlKSAmJiAhaXNFbmNvZGVkRlBSKHZhbHVlKTsK
KyAgICB9CisKKyAgICBzdGF0aWMgR1BSUmVnIGRlY29kZUdQUihpbnQgdmFsdWUpCisgICAgewor
ICAgICAgICBBU1NFUlQoaXNFbmNvZGVkR1BSKHZhbHVlKSk7CisgICAgICAgIHJldHVybiBzdGF0
aWNfY2FzdDxHUFJSZWc+KAorICAgICAgICAgICAgKHZhbHVlIC0gZW5jb2RlR1BSKE1hY3JvQXNz
ZW1ibGVyOjpmaXJzdFJlZ2lzdGVyKCkpKSArIE1hY3JvQXNzZW1ibGVyOjpmaXJzdFJlZ2lzdGVy
KCkpOworICAgIH0KKworICAgIHN0YXRpYyBGUFJSZWcgZGVjb2RlRlBSKGludCB2YWx1ZSkKKyAg
ICB7CisgICAgICAgIEFTU0VSVChpc0VuY29kZWRGUFIodmFsdWUpKTsKKyAgICAgICAgcmV0dXJu
IHN0YXRpY19jYXN0PEZQUlJlZz4oCisgICAgICAgICAgICAoZW5jb2RlRlBSKE1hY3JvQXNzZW1i
bGVyOjpmaXJzdEZQUmVnaXN0ZXIoKSkgLSB2YWx1ZSkgKworICAgICAgICAgICAgTWFjcm9Bc3Nl
bWJsZXI6OmZpcnN0RlBSZWdpc3RlcigpKTsKKyAgICB9CisKKyAgICBzdGF0aWMgdW5zaWduZWQg
ZGVjb2RlR1BUbXAoaW50IHZhbHVlKQorICAgIHsKKyAgICAgICAgQVNTRVJUKGlzRW5jb2RlZEdQ
VG1wKHZhbHVlKSk7CisgICAgICAgIHJldHVybiB2YWx1ZSAtIChlbmNvZGVHUFIoTWFjcm9Bc3Nl
bWJsZXI6Omxhc3RSZWdpc3RlcigpKSArIDEpOworICAgIH0KKworICAgIHN0YXRpYyB1bnNpZ25l
ZCBkZWNvZGVGUFRtcChpbnQgdmFsdWUpCisgICAgeworICAgICAgICBBU1NFUlQoaXNFbmNvZGVk
RlBUbXAodmFsdWUpKTsKKyAgICAgICAgcmV0dXJuIChlbmNvZGVGUFIoTWFjcm9Bc3NlbWJsZXI6
Omxhc3RGUFJlZ2lzdGVyKCkpIC0gMSkgLSB2YWx1ZTsKKyAgICB9CisKKyAgICAvLyAwOiBlbXB0
eSBUbXAKKyAgICAvLyBwb3NpdGl2ZTogR1BScyBhbmQgdGhlbiBHUCB0ZW1wcy4KKyAgICAvLyBu
ZWdhdGl2ZTogRlBScyBhbmQgdGhlbiBGUCB0ZW1wcy4KKyAgICBpbnQgbV92YWx1ZTsKK307CisK
K30gfSB9IC8vIG5hbWVzcGFjZSBKU0M6OkIzOjpBaXIKKworI2VuZGlmIC8vIEFpclRtcF9oCisK
SW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9haXIvb3Bjb2RlX2dlbmVyYXRvci5yYgo9
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvYWlyL29wY29kZV9nZW5lcmF0
b3IucmIJKHJldmlzaW9uIDApCisrKyBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvYWlyL29wY29k
ZV9nZW5lcmF0b3IucmIJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSw3NzQgQEAKKyMhL3Vzci9i
aW4vZW52IHJ1YnkKKworIyBDb3B5cmlnaHQgKEMpIDIwMTUgQXBwbGUgSW5jLiBBbGwgcmlnaHRz
IHJlc2VydmVkLgorIworIyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmlu
YXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyMgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVk
IHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisjIGFyZSBtZXQ6CisjIDEu
IFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29w
eXJpZ2h0CisjICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xs
b3dpbmcgZGlzY2xhaW1lci4KKyMgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11
c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyMgICAgbm90aWNlLCB0aGlzIGxpc3Qg
b2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorIyAgICBk
b2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlz
dHJpYnV0aW9uLgorIworIyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4g
QU5EIElUUyBDT05UUklCVVRPUlMgYGBBUyBJUycnCisjIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBM
SUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorIyBUSEUgSU1Q
TElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJU
SUNVTEFSCisjIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIEFQUExF
IElOQy4gT1IgSVRTIENPTlRSSUJVVE9SUworIyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElO
RElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCisjIENPTlNFUVVFTlRJ
QUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9G
CisjIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQ
Uk9GSVRTOyBPUiBCVVNJTkVTUworIyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBP
TiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTgorIyBDT05UUkFDVCwgU1RSSUNU
IExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQor
IyBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZF
TiBJRiBBRFZJU0VEIE9GCisjIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworcmVx
dWlyZSAicGF0aG5hbWUiCisKK2NsYXNzIE9wY29kZQorICAgIGF0dHJfcmVhZGVyIDpuYW1lLCA6
c3BlY2lhbCwgOm92ZXJsb2FkcworCisgICAgZGVmIGluaXRpYWxpemUobmFtZSwgc3BlY2lhbCkK
KyAgICAgICAgQG5hbWUgPSBuYW1lCisgICAgICAgIEBzcGVjaWFsID0gc3BlY2lhbAorICAgICAg
ICB1bmxlc3Mgc3BlY2lhbAorICAgICAgICAgICAgQG92ZXJsb2FkcyA9IFtdCisgICAgICAgIGVu
ZAorICAgIGVuZAorCisgICAgZGVmIG1hc21OYW1lCisgICAgICAgIG5hbWVbMF0uZG93bmNhc2Ug
KyBuYW1lWzEuLi0xXQorICAgIGVuZAorZW5kCisKK2NsYXNzIEFyZworICAgIGF0dHJfcmVhZGVy
IDpyb2xlLCA6dHlwZQorCisgICAgZGVmIGluaXRpYWxpemUocm9sZSwgdHlwZSkKKyAgICAgICAg
QHJvbGUgPSByb2xlCisgICAgICAgIEB0eXBlID0gdHlwZQorICAgIGVuZAorZW5kCisKK2NsYXNz
IE92ZXJsb2FkCisgICAgYXR0cl9yZWFkZXIgOnNpZ25hdHVyZSwgOmZvcm1zCisKKyAgICBkZWYg
aW5pdGlhbGl6ZShzaWduYXR1cmUsIGZvcm1zKQorICAgICAgICBAc2lnbmF0dXJlID0gc2lnbmF0
dXJlCisgICAgICAgIEBmb3JtcyA9IGZvcm1zCisgICAgZW5kCitlbmQKKworY2xhc3MgS2luZAor
ICAgIGF0dHJfcmVhZGVyIDpuYW1lCisgICAgYXR0cl9hY2Nlc3NvciA6c3BlY2lhbAorCisgICAg
ZGVmIGluaXRpYWxpemUobmFtZSkKKyAgICAgICAgQG5hbWUgPSBuYW1lCisgICAgICAgIEBzcGVj
aWFsID0gZmFsc2UKKyAgICBlbmQKKworICAgIGRlZiA9PShvdGhlcikKKyAgICAgICAgaWYgb3Ro
ZXIuaXNfYT8gU3RyaW5nCisgICAgICAgICAgICBAbmFtZSA9PSBvdGhlcgorICAgICAgICBlbHNl
CisgICAgICAgICAgICBAbmFtZSA9PSBvdGhlci5uYW1lIGFuZCBAc3BlY2lhbCA9PSBvdGhlci5z
cGVjaWFsCisgICAgICAgIGVuZAorICAgIGVuZAorCisgICAgZGVmIEtpbmQuYXJnS2luZHMoa2lu
ZCkKKyAgICAgICAgaWYga2luZCA9PSAiQWRkciIKKyAgICAgICAgICAgIFsiQWRkciIsICJTdGFj
a1Nsb3QiLCAiQ2FsbEFyZyJdCisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIFtraW5kXQorICAg
ICAgICBlbmQKKyAgICBlbmQKKworICAgIGRlZiBhcmdLaW5kcworICAgICAgICBLaW5kLmFyZ0tp
bmRzKGtpbmQpCisgICAgZW5kCitlbmQKKworY2xhc3MgRm9ybQorICAgIGF0dHJfcmVhZGVyIDpr
aW5kcywgOmFsdE5hbWUKKworICAgIGRlZiBpbml0aWFsaXplKGtpbmRzLCBhbHROYW1lKQorICAg
ICAgICBAa2luZHMgPSBraW5kcworICAgICAgICBAYWx0TmFtZSA9IGFsdE5hbWUKKyAgICBlbmQK
K2VuZAorCitjbGFzcyBPcmlnaW4KKyAgICBhdHRyX3JlYWRlciA6ZmlsZU5hbWUsIDpsaW5lTnVt
YmVyCisgICAgCisgICAgZGVmIGluaXRpYWxpemUoZmlsZU5hbWUsIGxpbmVOdW1iZXIpCisgICAg
ICAgIEBmaWxlTmFtZSA9IGZpbGVOYW1lCisgICAgICAgIEBsaW5lTnVtYmVyID0gbGluZU51bWJl
cgorICAgIGVuZAorICAgIAorICAgIGRlZiB0b19zCisgICAgICAgICIje2ZpbGVOYW1lfToje2xp
bmVOdW1iZXJ9IgorICAgIGVuZAorZW5kCisKK2NsYXNzIFRva2VuCisgICAgYXR0cl9yZWFkZXIg
Om9yaWdpbiwgOnN0cmluZworICAgIAorICAgIGRlZiBpbml0aWFsaXplKG9yaWdpbiwgc3RyaW5n
KQorICAgICAgICBAb3JpZ2luID0gb3JpZ2luCisgICAgICAgIEBzdHJpbmcgPSBzdHJpbmcKKyAg
ICBlbmQKKyAgICAKKyAgICBkZWYgPT0ob3RoZXIpCisgICAgICAgIGlmIG90aGVyLmlzX2E/IFRv
a2VuCisgICAgICAgICAgICBAc3RyaW5nID09IG90aGVyLnN0cmluZworICAgICAgICBlbHNlCisg
ICAgICAgICAgICBAc3RyaW5nID09IG90aGVyCisgICAgICAgIGVuZAorICAgIGVuZAorICAgIAor
ICAgIGRlZiA9fihvdGhlcikKKyAgICAgICAgQHN0cmluZyA9fiBvdGhlcgorICAgIGVuZAorICAg
IAorICAgIGRlZiB0b19zCisgICAgICAgICIje0BzdHJpbmcuaW5zcGVjdH0gYXQgI3tvcmlnaW59
IgorICAgIGVuZAorICAgIAorICAgIGRlZiBwYXJzZUVycm9yKCpjb21tZW50KQorICAgICAgICBp
ZiBjb21tZW50LmVtcHR5PworICAgICAgICAgICAgcmFpc2UgIlBhcnNlIGVycm9yOiAje3RvX3N9
IgorICAgICAgICBlbHNlCisgICAgICAgICAgICByYWlzZSAiUGFyc2UgZXJyb3I6ICN7dG9fc306
ICN7Y29tbWVudFswXX0iCisgICAgICAgIGVuZAorICAgIGVuZAorZW5kCisKK2RlZiBsZXgoc3Ry
LCBmaWxlTmFtZSkKKyAgICBmaWxlTmFtZSA9IFBhdGhuYW1lLm5ldyhmaWxlTmFtZSkKKyAgICBy
ZXN1bHQgPSBbXQorICAgIGxpbmVOdW1iZXIgPSAxCisgICAgd2hpbGUgbm90IHN0ci5lbXB0eT8K
KyAgICAgICAgY2FzZSBzdHIKKyAgICAgICAgd2hlbiAvXEFcIyhbXlxuXSopLworICAgICAgICAg
ICAgIyBjb21tZW50LCBpZ25vcmUKKyAgICAgICAgd2hlbiAvXEFcbi8KKyAgICAgICAgICAgICMg
bmV3bGluZSwgaWdub3JlCisgICAgICAgICAgICBsaW5lTnVtYmVyICs9IDEKKyAgICAgICAgd2hl
biAvXEEoW2EtekEtWjAtOV9dKykvCisgICAgICAgICAgICByZXN1bHQgPDwgVG9rZW4ubmV3KE9y
aWdpbi5uZXcoZmlsZU5hbWUsIGxpbmVOdW1iZXIpLCAkJikKKyAgICAgICAgd2hlbiAvXEEoWyBc
dFxyXSspLworICAgICAgICAgICAgIyB3aGl0ZXNwYWNlLCBpZ25vcmUKKyAgICAgICAgd2hlbiAv
XEFbLDoqXS8KKyAgICAgICAgICAgIHJlc3VsdCA8PCBUb2tlbi5uZXcoT3JpZ2luLm5ldyhmaWxl
TmFtZSwgbGluZU51bWJlciksICQmKQorICAgICAgICBlbHNlCisgICAgICAgICAgICByYWlzZSAi
TGV4ZXIgZXJyb3IgYXQgI3tPcmlnaW4ubmV3KGZpbGVOYW1lLCBsaW5lTnVtYmVyKS50b19zfSwg
dW5leHBlY3RlZCBzZXF1ZW5jZSAje3N0clswLi4yMF0uaW5zcGVjdH0iCisgICAgICAgIGVuZAor
ICAgICAgICBzdHIgPSAkfi5wb3N0X21hdGNoCisgICAgZW5kCisgICAgcmVzdWx0CitlbmQKKwor
ZGVmIGlzVUQodG9rZW4pCisgICAgdG9rZW4gPX4gL1xBKChVKXwoRCl8KFVEKSlcWi8KK2VuZAor
CitkZWYgaXNHRih0b2tlbikKKyAgICB0b2tlbiA9fiAvXEEoKEcpfChGKSlcWi8KK2VuZAorCitk
ZWYgaXNLaW5kKHRva2VuKQorICAgIHRva2VuID1+IC9cQSgoVG1wKXwoSW1tKXwoSW1tUHRyKXwo
QWRkcil8KEluZGV4KSlcWi8KK2VuZAorCitkZWYgaXNLZXl3b3JkKHRva2VuKQorICAgIGlzVUQo
dG9rZW4pIG9yIGlzR0YodG9rZW4pIG9yIGlzS2luZCh0b2tlbikgb3IKKyAgICAgICAgdG9rZW4g
PT0gInNwZWNpYWwiIG9yIHRva2VuID09ICJhcyIKK2VuZAorCitkZWYgaXNJZGVudGlmaWVyKHRv
a2VuKQorICAgIHRva2VuID1+IC9cQShbYS16QS1aMC05X10rKVxaLyBhbmQgbm90IGlzS2V5d29y
ZCh0b2tlbikKK2VuZAorCitjbGFzcyBQYXJzZXIKKyAgICBkZWYgaW5pdGlhbGl6ZShkYXRhLCBm
aWxlTmFtZSkKKyAgICAgICAgQHRva2VucyA9IGxleChkYXRhLCBmaWxlTmFtZSkKKyAgICAgICAg
QGlkeCA9IDAKKyAgICBlbmQKKworICAgIGRlZiB0b2tlbgorICAgICAgICBAdG9rZW5zW0BpZHhd
CisgICAgZW5kCisKKyAgICBkZWYgYWR2YW5jZQorICAgICAgICBAaWR4ICs9IDEKKyAgICBlbmQK
KworICAgIGRlZiBwYXJzZUVycm9yKCpjb21tZW50KQorICAgICAgICBpZiB0b2tlbgorICAgICAg
ICAgICAgdG9rZW4ucGFyc2VFcnJvcigqY29tbWVudCkKKyAgICAgICAgZWxzZQorICAgICAgICAg
ICAgaWYgY29tbWVudC5lbXB0eT8KKyAgICAgICAgICAgICAgICByYWlzZSAiUGFyc2UgZXJyb3Ig
YXQgZW5kIG9mIGZpbGUiCisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgcmFpc2Ug
IlBhcnNlIGVycm9yIGF0IGVuZCBvZiBmaWxlOiAje2NvbW1lbnRbMF19IgorICAgICAgICAgICAg
ZW5kCisgICAgICAgIGVuZAorICAgIGVuZAorCisgICAgZGVmIGNvbnN1bWUoc3RyaW5nKQorICAg
ICAgICBwYXJzZUVycm9yKCJFeHBlY3RlZCAje3N0cmluZ30iKSB1bmxlc3MgdG9rZW4gPT0gc3Ry
aW5nCisgICAgICAgIGFkdmFuY2UKKyAgICBlbmQKKworICAgIGRlZiBjb25zdW1lSWRlbnRpZmll
cgorICAgICAgICByZXN1bHQgPSB0b2tlbi5zdHJpbmcKKyAgICAgICAgcGFyc2VFcnJvcigiRXhw
ZWN0ZWQgaWRlbnRpZmllciIpIHVubGVzcyBpc0lkZW50aWZpZXIocmVzdWx0KQorICAgICAgICBh
ZHZhbmNlCisgICAgICAgIHJlc3VsdAorICAgIGVuZAorCisgICAgZGVmIGNvbnN1bWVSb2xlCisg
ICAgICAgIHJlc3VsdCA9IHRva2VuLnN0cmluZworICAgICAgICBwYXJzZUVycm9yKCJFeHBlY3Rl
ZCByb2xlIChVLCBELCBvciBVRCkiKSB1bmxlc3MgaXNVRChyZXN1bHQpCisgICAgICAgIGFkdmFu
Y2UKKyAgICAgICAgcmVzdWx0CisgICAgZW5kCisKKyAgICBkZWYgY29uc3VtZVR5cGUKKyAgICAg
ICAgcmVzdWx0ID0gdG9rZW4uc3RyaW5nCisgICAgICAgIHBhcnNlRXJyb3IoIkV4cGVjdGVkIHR5
cGUgKEcgb3IgRikiKSB1bmxlc3MgaXNHRihyZXN1bHQpCisgICAgICAgIGFkdmFuY2UKKyAgICAg
ICAgcmVzdWx0CisgICAgZW5kCisKKyAgICBkZWYgY29uc3VtZUtpbmQKKyAgICAgICAgcmVzdWx0
ID0gdG9rZW4uc3RyaW5nCisgICAgICAgIHBhcnNlRXJyb3IoIkV4cGVjdGVkIGtpbmQgKEltbSwg
SW1tUHRyLCBUbXAsIEFkZHIsIG9yIEluZGV4KSIpIHVubGVzcyBpc0tpbmQocmVzdWx0KQorICAg
ICAgICBhZHZhbmNlCisgICAgICAgIHJlc3VsdAorICAgIGVuZAorCisgICAgZGVmIHBhcnNlCisg
ICAgICAgIHJlc3VsdCA9IHt9CisgICAgICAgIAorICAgICAgICBsb29wIHsKKyAgICAgICAgICAg
IGJyZWFrIGlmIEBpZHggPj0gQHRva2Vucy5sZW5ndGgKKworICAgICAgICAgICAgaWYgdG9rZW4g
PT0gInNwZWNpYWwiCisgICAgICAgICAgICAgICAgY29uc3VtZSgic3BlY2lhbCIpCisgICAgICAg
ICAgICAgICAgb3Bjb2RlTmFtZSA9IGNvbnN1bWVJZGVudGlmaWVyCisKKyAgICAgICAgICAgICAg
ICBwYXJzZUVycm9yKCJDYW5ub3Qgb3ZlcmxvYWQgYSBzcGVjaWFsIG9wY29kZSIpIGlmIHJlc3Vs
dFtvcGNvZGVOYW1lXQorCisgICAgICAgICAgICAgICAgcmVzdWx0W29wY29kZU5hbWVdID0gT3Bj
b2RlLm5ldyhvcGNvZGVOYW1lLCB0cnVlKQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAg
ICAgIG9wY29kZU5hbWUgPSBjb25zdW1lSWRlbnRpZmllcgorCisgICAgICAgICAgICAgICAgaWYg
cmVzdWx0W29wY29kZU5hbWVdCisgICAgICAgICAgICAgICAgICAgIG9wY29kZSA9IHJlc3VsdFtv
cGNvZGVOYW1lXQorICAgICAgICAgICAgICAgICAgICBwYXJzZUVycm9yKCJDYW5ub3Qgb3Zlcmxv
YWQgYSBzcGVjaWFsIG9wY29kZSIpIGlmIG9wY29kZS5zcGVjaWFsCisgICAgICAgICAgICAgICAg
ZWxzZQorICAgICAgICAgICAgICAgICAgICBvcGNvZGUgPSBPcGNvZGUubmV3KG9wY29kZU5hbWUs
IGZhbHNlKQorICAgICAgICAgICAgICAgICAgICByZXN1bHRbb3Bjb2RlTmFtZV0gPSBvcGNvZGUK
KyAgICAgICAgICAgICAgICBlbmQKKworICAgICAgICAgICAgICAgIHNpZ25hdHVyZSA9IFtdCisg
ICAgICAgICAgICAgICAgZm9ybXMgPSBbXQorICAgICAgICAgICAgICAgIGlmIGlzVUQodG9rZW4p
CisgICAgICAgICAgICAgICAgICAgIGxvb3AgeworICAgICAgICAgICAgICAgICAgICAgICAgcm9s
ZSA9IGNvbnN1bWVSb2xlCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdW1lKCI6IikKKyAg
ICAgICAgICAgICAgICAgICAgICAgIHR5cGUgPSBjb25zdW1lVHlwZQorICAgICAgICAgICAgICAg
ICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICBzaWduYXR1cmUgPDwgQXJnLm5ldyhy
b2xlLCB0eXBlKQorICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAg
ICAgICBicmVhayB1bmxlc3MgdG9rZW4gPT0gIiwiCisgICAgICAgICAgICAgICAgICAgICAgICBj
b25zdW1lKCIsIikKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAg
IGxvb3AgeworICAgICAgICAgICAgICAgICAgICAgICAga2luZHMgPSBbXQorICAgICAgICAgICAg
ICAgICAgICAgICAgYWx0TmFtZSA9IG5pbAorICAgICAgICAgICAgICAgICAgICAgICAgbG9vcCB7
CisgICAgICAgICAgICAgICAgICAgICAgICAgICAga2luZHMgPDwgS2luZC5uZXcoY29uc3VtZUtp
bmQpCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiB0b2tlbiA9PSAiKiIKKyAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyc2VFcnJvcigiQ2FuIG9ubHkgYXBwbHkgKiB0
byBUbXAiKSB1bmxlc3Mga2luZHNbLTFdLm5hbWUgPT0gIlRtcCIKKyAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAga2luZHNbLTFdLnNwZWNpYWwgPSB0cnVlCisgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgIGNvbnN1bWUoIioiKQorICAgICAgICAgICAgICAgICAgICAgICAgICAg
IGVuZAorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsgdW5sZXNzIHRva2VuID09
ICIsIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN1bWUoIiwiKQorICAgICAgICAg
ICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICBpZiB0b2tlbiA9PSAi
YXMiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3VtZSgiYXMiKQorICAgICAgICAg
ICAgICAgICAgICAgICAgICAgIGFsdE5hbWUgPSBjb25zdW1lSWRlbnRpZmllcgorICAgICAgICAg
ICAgICAgICAgICAgICAgZW5kCisKKyAgICAgICAgICAgICAgICAgICAgICAgIHBhcnNlRXJyb3Io
IkZvcm0gaGFzIHdyb25nIG51bWJlciBvZiBhcmd1bWVudHMgZm9yIG92ZXJsb2FkIikgdW5sZXNz
IGtpbmRzLmxlbmd0aCA9PSBzaWduYXR1cmUubGVuZ3RoCisgICAgICAgICAgICAgICAgICAgICAg
ICBraW5kcy5lYWNoX3dpdGhfaW5kZXggeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwg
a2luZCwgaW5kZXggfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIGtpbmQubmFtZSA9
PSAiSW1tIiBvciBraW5kLm5hbWUgPT0gIkltbVB0ciIKKyAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgaWYgc2lnbmF0dXJlW2luZGV4XS5yb2xlICE9ICJVIgorICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgcGFyc2VFcnJvcigiRm9ybSBoYXMgYW4gaW1tZWRpYXRlIGZv
ciBhIG5vbi11c2UgYXJndW1lbnQiKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBl
bmQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgc2lnbmF0dXJlW2luZGV4XS50
eXBlICE9ICJHIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyc2VFcnJv
cigiRm9ybSBoYXMgYW4gaW1tZWRpYXRlIGZvciBhIG5vbi1nZW5lcmFsLXB1cnBvc2UgYXJndW1l
bnQiKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmQKKyAgICAgICAgICAgICAg
ICAgICAgICAgICAgICBlbmQKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAg
ICAgICAgICAgICAgIGZvcm1zIDw8IEZvcm0ubmV3KGtpbmRzLCBhbHROYW1lKQorICAgICAgICAg
ICAgICAgICAgICAgICAgYnJlYWsgdW5sZXNzIGlzS2luZCh0b2tlbikKKyAgICAgICAgICAgICAg
ICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgc2lnbmF0
dXJlID0gW10KKyAgICAgICAgICAgICAgICAgICAgZm9ybXMgPSBbRm9ybS5uZXcoW10sIG5pbCld
CisgICAgICAgICAgICAgICAgZW5kCisKKyAgICAgICAgICAgICAgICBvcGNvZGUub3ZlcmxvYWRz
IDw8IE92ZXJsb2FkLm5ldyhzaWduYXR1cmUsIGZvcm1zKQorICAgICAgICAgICAgZW5kCisgICAg
ICAgIH0KKworICAgICAgICByZXN1bHQKKyAgICBlbmQKK2VuZAorCiskZmlsZU5hbWUgPSBBUkdW
WzBdCisKK3BhcnNlciA9IFBhcnNlci5uZXcoSU86OnJlYWQoJGZpbGVOYW1lKSwgJGZpbGVOYW1l
KQorJG9wY29kZXMgPSBwYXJzZXIucGFyc2UKKworZGVmIHdyaXRlSChmaWxlbmFtZSkKKyAgICBG
aWxlLm9wZW4oIkFpciN7ZmlsZW5hbWV9LmgiLCAidyIpIHsKKyAgICAgICAgfCBvdXRwIHwKKyAg
ICAgICAgCisgICAgICAgIG91dHAucHV0cyAiLy8gR2VuZXJhdGVkIGJ5IG9wY29kZV9nZW5lcmF0
b3IucmIgZnJvbSAjeyRmaWxlTmFtZX0gLS0gZG8gbm90IGVkaXQhIgorICAgICAgICAKKyAgICAg
ICAgb3V0cC5wdXRzICIjaWZuZGVmIEFpciN7ZmlsZW5hbWV9X2giCisgICAgICAgIG91dHAucHV0
cyAiI2RlZmluZSBBaXIje2ZpbGVuYW1lfV9oIgorCisgICAgICAgIHlpZWxkIG91dHAKKyAgICAg
ICAgCisgICAgICAgIG91dHAucHV0cyAiI2VuZGlmIC8vIEFpciN7ZmlsZW5hbWV9X2giCisgICAg
fQorZW5kCisKK2RlZiB3cml0ZUNQUChmaWxlbmFtZSkKKyAgICBGaWxlLm9wZW4oIkFpciN7Zmls
ZW5hbWV9LmNwcCIsICJ3IikgeworICAgICAgICB8IG91dHAgfAorICAgICAgICAKKyAgICAgICAg
b3V0cC5wdXRzICIvLyBHZW5lcmF0ZWQgYnkgb3Bjb2RlX2dlbmVyYXRvci5yYiBmcm9tICN7JGZp
bGVOYW1lfSAtLSBkbyBub3QgZWRpdCEiCisgICAgICAgIAorICAgICAgICBvdXRwLnB1dHMgIiNp
bmNsdWRlIFwiY29uZmlnLmhcIiIKKyAgICAgICAgb3V0cC5wdXRzICIjaW5jbHVkZSBcIkFpciN7
ZmlsZW5hbWV9LmhcIiIKKworICAgICAgICB5aWVsZCBvdXRwCisgICAgfQorZW5kCisKK3dyaXRl
SCgiT3Bjb2RlIikgeworICAgIHwgb3V0cCB8CisgICAgb3V0cC5wdXRzICJuYW1lc3BhY2UgSlND
IHsgbmFtZXNwYWNlIEIzIHsgbmFtZXNwYWNlIEFpciB7IgorICAgIG91dHAucHV0cyAiZW51bSBP
cGNvZGUgOiBpbnQxNl90IHsiCisgICAgJG9wY29kZXMua2V5cy5zb3J0LmVhY2ggeworICAgICAg
ICB8IG9wY29kZSB8CisgICAgICAgIG91dHAucHV0cyAiICAgICN7b3Bjb2RlfSwiCisgICAgfQor
ICAgIG91dHAucHV0cyAifSIKKworICAgIG91dHAucHV0cyAic3RhdGljIGNvbnN0IHVuc2lnbmVk
IG51bU9wY29kZXMgPSAjeyRvcGNvZGVzLmtleXMuc2l6ZX07IgorICAgIG91dHAucHV0cyAifSB9
IH0gLy8gbmFtZXNwYWNlIEpTQzo6QjM6OkFpciIKKyAgICAKKyAgICBvdXRwLnB1dHMgIm5hbWVz
cGFjZSBXVEYgeyIKKyAgICBvdXRwLnB1dHMgImNsYXNzIFByaW50U3RyZWFtOyIKKyAgICBvdXRw
LnB1dHMgInZvaWQgcHJpbnRJbnRlcm5hbChQcmludFN0cmVhbSYsIEpTQzo6QjM6OkFpcjo6T3Bj
b2RlKTsiCisgICAgb3V0cC5wdXRzICJ9IC8vIG5hbWVzcGFjZSBXVEYiCit9CisKK3dyaXRlQ1BQ
KCJPcGNvZGUiKSB7CisgICAgfCBvdXRwIHwKKyAgICBvdXRwLnB1dHMgIiNpbmNsdWRlIFwid3Rm
L1ByaW50U3RyZWFtLmhcIiIKKyAgICBvdXRwLnB1dHMgIm5hbWVzcGFjZSBXVEYgeyIKKyAgICBv
dXRwLnB1dHMgInVzaW5nIG5hbWVzcGFjZSBKU0M6OkIzOjpBaXI7IgorICAgIG91dHAucHV0cyAi
dm9pZCBwcmludEludGVybmFsKFByaW50U3RyZWFtJiBvdXQsIE9wY29kZSBvcGNvZGUpIgorICAg
IG91dHAucHV0cyAieyIKKyAgICBvdXRwLnB1dHMgIiAgICBzd2l0Y2ggKG9wY29kZSkgeyIKKyAg
ICAkb3Bjb2Rlcy5rZXlzLmVhY2ggeworICAgICAgICB8IG9wY29kZSB8CisgICAgICAgIG91dHAu
cHV0cyAiICAgIGNhc2UgI3tvcGNvZGV9OiIKKyAgICAgICAgb3V0cC5wdXRzICIgICAgICAgIG91
dC5wcmludChcIiN7b3Bjb2RlfVwiKTsiCisgICAgICAgIG91dHAucHV0cyAiICAgICAgICByZXR1
cm47IgorICAgIH0KKyAgICBvdXRwLnB1dHMgIiAgICB9IgorICAgIG91dHAucHV0cyAiICAgIFJF
TEVBU0VfQVNTRVJUX05PVF9SRUFDSEVEKCk7IgorICAgIG91dHAucHV0cyAifSIKKyAgICBvdXRw
LnB1dHMgIn0gLy8gbmFtZXNwYWNlIFdURiIKK30KKworIyBGcm9tIGhlcmUgb24sIHdlIGRvbid0
IHRyeSB0byBlbWl0IHByb3Blcmx5IGluZGVudGVkIGNvZGUsIHNpbmNlIHdlJ3JlIHVzaW5nIGEg
cmVjdXJzaXZlIHBhdHRlcm4KKyMgbWF0Y2hlci4KKworZGVmIG1hdGNoRm9ybXMob3V0cCwgc3Bl
ZWQsIGZvcm1zLCBjb2x1bW5JbmRleCwgY29sdW1uR2V0dGVyLCBmaWx0ZXIsIGNhbGxiYWNrKQor
ICAgIHJldHVybiBpZiBmb3Jtcy5sZW5ndGggPT0gMAorCisgICAgaWYgZmlsdGVyW2Zvcm1zXQor
ICAgICAgICByZXR1cm4KKyAgICBlbmQKKworICAgIGlmIGNvbHVtbkluZGV4ID49IGZvcm1zWzBd
LmtpbmRzLmxlbmd0aAorICAgICAgICByYWlzZSB1bmxlc3MgZm9ybXMubGVuZ3RoID09IDEKKyAg
ICAgICAgY2FsbGJhY2tbZm9ybXNbMF1dCisgICAgICAgIHJldHVybgorICAgIGVuZAorICAgIAor
ICAgIGdyb3VwcyA9IHt9CisgICAgZm9ybXMuZWFjaCB7CisgICAgICAgIHwgZm9ybSB8CisgICAg
ICAgIGtpbmQgPSBmb3JtLmtpbmRzW2NvbHVtbkluZGV4XS5uYW1lCisgICAgICAgIGlmIGdyb3Vw
c1traW5kXQorICAgICAgICAgICAgZ3JvdXBzW2tpbmRdIDw8IGZvcm0KKyAgICAgICAgZWxzZQor
ICAgICAgICAgICAgZ3JvdXBzW2tpbmRdID0gW2Zvcm1dCisgICAgICAgIGVuZAorICAgIH0KKwor
ICAgIGlmIHNwZWVkID09IDpmYXN0IGFuZCBncm91cHMubGVuZ3RoID09IDEKKyAgICAgICAgbWF0
Y2hGb3JtcyhvdXRwLCBzcGVlZCwgZm9ybXMsIGNvbHVtbkluZGV4ICsgMSwgY29sdW1uR2V0dGVy
LCBmaWx0ZXIsIGNhbGxiYWNrKQorICAgICAgICByZXR1cm4KKyAgICBlbmQKKworICAgIG91dHAu
cHV0cyAic3dpdGNoICgje2NvbHVtbkdldHRlcltjb2x1bW5JbmRleF19KSB7IgorICAgIGdyb3Vw
cy5lYWNoX3BhaXIgeworICAgICAgICB8IGtleSwgdmFsdWUgfAorICAgICAgICBLaW5kLmFyZ0tp
bmRzKGtleSkuZWFjaCB7CisgICAgICAgICAgICB8IGFyZ0tpbmQgfAorICAgICAgICAgICAgb3V0
cC5wdXRzICJjYXNlIEFyZzo6I3thcmdLaW5kfToiCisgICAgICAgIH0KKyAgICAgICAgbWF0Y2hG
b3JtcyhvdXRwLCBzcGVlZCwgdmFsdWUsIGNvbHVtbkluZGV4ICsgMSwgY29sdW1uR2V0dGVyLCBm
aWx0ZXIsIGNhbGxiYWNrKQorICAgICAgICBvdXRwLnB1dHMgImJyZWFrOyIKKyAgICB9CisgICAg
b3V0cC5wdXRzICJkZWZhdWx0OiIKKyAgICBvdXRwLnB1dHMgImJyZWFrOyIKKyAgICBvdXRwLnB1
dHMgIn0iCitlbmQKKworZGVmIG1hdGNoSW5zdE92ZXJsb2FkKG91dHAsIHNwZWVkLCBpbnN0KQor
ICAgIG91dHAucHV0cyAic3dpdGNoICgje2luc3R9LT5vcGNvZGUpIHsiCisgICAgJG9wY29kZXMu
dmFsdWVzLmVhY2ggeworICAgICAgICB8IG9wY29kZSB8CisgICAgICAgIG91dHAucHV0cyAiY2Fz
ZSAje29wY29kZS5uYW1lfToiCisgICAgICAgIGlmIG9wY29kZS5zcGVjaWFsCisgICAgICAgICAg
ICB5aWVsZCBvcGNvZGUsIG5pbAorICAgICAgICBlbHNlCisgICAgICAgICAgICBuZWVkT3Zlcmxv
YWRTd2l0Y2ggPSAoKG9wY29kZS5vdmVybG9hZHMuc2l6ZSAhPSAxKSBvciBzcGVlZCA9PSA6c2Fm
ZSkKKyAgICAgICAgICAgIG91dHAucHV0cyAic3dpdGNoICgje2luc3R9LT5hcmdzLnNpemUoKSkg
eyIgaWYgbmVlZE92ZXJsb2FkU3dpdGNoCisgICAgICAgICAgICBvcGNvZGUub3ZlcmxvYWRzLmVh
Y2ggeworICAgICAgICAgICAgICAgIHwgb3ZlcmxvYWQgfAorICAgICAgICAgICAgICAgIG91dHAu
cHV0cyAiY2FzZSAje292ZXJsb2FkLnNpZ25hdHVyZS5sZW5ndGh9OiIgaWYgbmVlZE92ZXJsb2Fk
U3dpdGNoCisgICAgICAgICAgICAgICAgeWllbGQgb3Bjb2RlLCBvdmVybG9hZAorICAgICAgICAg
ICAgICAgIG91dHAucHV0cyAiYnJlYWs7IiBpZiBuZWVkT3ZlcmxvYWRTd2l0Y2gKKyAgICAgICAg
ICAgIH0KKyAgICAgICAgICAgIGlmIG5lZWRPdmVybG9hZFN3aXRjaAorICAgICAgICAgICAgICAg
IG91dHAucHV0cyAiZGVmYXVsdDoiCisgICAgICAgICAgICAgICAgb3V0cC5wdXRzICJicmVhazsi
CisgICAgICAgICAgICAgICAgb3V0cC5wdXRzICJ9IgorICAgICAgICAgICAgZW5kCisgICAgICAg
IGVuZAorICAgICAgICBvdXRwLnB1dHMgImJyZWFrOyIKKyAgICB9CisgICAgb3V0cC5wdXRzICJk
ZWZhdWx0OiIKKyAgICBvdXRwLnB1dHMgImJyZWFrOyIKKyAgICBvdXRwLnB1dHMgIn0iCitlbmQK
KyAgICAKK2RlZiBtYXRjaEluc3RPdmVybG9hZEZvcm0ob3V0cCwgc3BlZWQsIGluc3QpCisgICAg
bWF0Y2hJbnN0T3ZlcmxvYWQob3V0cCwgc3BlZWQsIGluc3QpIHsKKyAgICAgICAgfCBvcGNvZGUs
IG92ZXJsb2FkIHwKKyAgICAgICAgaWYgb3Bjb2RlLnNwZWNpYWwKKyAgICAgICAgICAgIHlpZWxk
IG9wY29kZSwgbmlsLCBuaWwKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgY29sdW1uR2V0dGVy
ID0gcHJvYyB7CisgICAgICAgICAgICAgICAgfCBjb2x1bW5JbmRleCB8CisgICAgICAgICAgICAg
ICAgIiN7aW5zdH0tPmFyZ3NbI3tjb2x1bW5JbmRleH1dLmtpbmQoKSIKKyAgICAgICAgICAgIH0K
KyAgICAgICAgICAgIGZpbHRlciA9IHByb2MgeyBmYWxzZSB9CisgICAgICAgICAgICBjYWxsYmFj
ayA9IHByb2MgeworICAgICAgICAgICAgICAgIHwgZm9ybSB8CisgICAgICAgICAgICAgICAgeWll
bGQgb3Bjb2RlLCBvdmVybG9hZCwgZm9ybQorICAgICAgICAgICAgfQorICAgICAgICAgICAgbWF0
Y2hGb3JtcyhvdXRwLCBzcGVlZCwgb3ZlcmxvYWQuZm9ybXMsIDAsIGNvbHVtbkdldHRlciwgZmls
dGVyLCBjYWxsYmFjaykKKyAgICAgICAgZW5kCisgICAgfQorZW5kCisKK3dyaXRlSCgiT3Bjb2Rl
VXRpbHMiKSB7CisgICAgfCBvdXRwIHwKKyAgICBvdXRwLnB1dHMgIiNpbmNsdWRlIFwiQWlySW5z
dC5oXCIiCisgICAgb3V0cC5wdXRzICJuYW1lc3BhY2UgSlNDIHsgbmFtZXNwYWNlIEIzIHsgbmFt
ZXNwYWNlIEFpciB7IgorICAgIAorICAgIG91dHAucHV0cyAidGVtcGxhdGU8dHlwZW5hbWUgRnVu
Y3Rvcj4iCisgICAgb3V0cC5wdXRzICJ2b2lkIEluc3Q6OmZvckVhY2hBcmcoY29uc3QgRnVuY3Rv
ciYgZnVuY3RvcikiCisgICAgb3V0cC5wdXRzICJ7IgorICAgIG1hdGNoSW5zdE92ZXJsb2FkKG91
dHAsIDpmYXN0LCAidGhpcyIpIHsKKyAgICAgICAgfCBvcGNvZGUsIG92ZXJsb2FkIHwKKyAgICAg
ICAgaWYgb3Bjb2RlLnNwZWNpYWwKKyAgICAgICAgICAgIG91dHAucHV0cyAiZnVuY3Rvcihhcmdz
WzBdLCBBcmc6OlVzZSwgQXJnOjpHUCk7IC8vIFRoaXMgaXMgYmFzaWNhbGx5IGJvZ3VzLCBidXQg
aXQgd29ya3MgZiBhbmFseXNlcyBtb2RlbCBTcGVjaWFsIGFzIGFuIGltbWVkaWF0ZS4iCisgICAg
ICAgICAgICBvdXRwLnB1dHMgImFyZ3NbMF0uc3BlY2lhbCgpLT5mb3JFYWNoQXJnKCp0aGlzLCBz
Y29wZWRMYW1iZGE8RWFjaEFyZ0NhbGxiYWNrPihmdW5jdG9yKSk7IgorICAgICAgICBlbHNlCisg
ICAgICAgICAgICBvdmVybG9hZC5zaWduYXR1cmUuZWFjaF93aXRoX2luZGV4IHsKKyAgICAgICAg
ICAgICAgICB8IGFyZywgaW5kZXggfAorICAgICAgICAgICAgICAgIHJvbGUgPSBuaWwKKyAgICAg
ICAgICAgICAgICBjYXNlIGFyZy5yb2xlCisgICAgICAgICAgICAgICAgd2hlbiAiVSIKKyAgICAg
ICAgICAgICAgICAgICAgcm9sZSA9ICJVc2UiCisgICAgICAgICAgICAgICAgd2hlbiAiRCIKKyAg
ICAgICAgICAgICAgICAgICAgcm9sZSA9ICJEZWYiCisgICAgICAgICAgICAgICAgd2hlbiAiVUQi
CisgICAgICAgICAgICAgICAgICAgIHJvbGUgPSAiVXNlRGVmIgorICAgICAgICAgICAgICAgIGVs
c2UKKyAgICAgICAgICAgICAgICAgICAgcmFpc2UKKyAgICAgICAgICAgICAgICBlbmQKKyAgICAg
ICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBvdXRwLnB1dHMgImZ1bmN0b3IoYXJnc1sje2lu
ZGV4fV0sIEFyZzo6I3tyb2xlfSwgQXJnOjoje2FyZy50eXBlfVApOyIKKyAgICAgICAgICAgIH0K
KyAgICAgICAgZW5kCisgICAgfQorICAgIG91dHAucHV0cyAifSIKKyAgICAKKyAgICBvdXRwLnB1
dHMgIn0gfSB9IC8vIG5hbWVzcGFjZSBKU0M6OkIzOjpBaXIiCit9CisKK3dyaXRlQ1BQKCJPcGNv
ZGVVdGlscyIpIHsKKyAgICB8IG91dHAgfAorICAgIG91dHAucHV0cyAiI2luY2x1ZGUgXCJBaXJJ
bnN0SW5saW5lcy5oXCIiCisgICAgb3V0cC5wdXRzICJuYW1lc3BhY2UgSlNDIHsgbmFtZXNwYWNl
IEIzIHsgbmFtZXNwYWNlIEFpciB7IgorICAgIG91dHAucHV0cyAiaW5saW5lIGJvb2wgaGlkZGVu
VHJ1dGgoKSB7IHJldHVybiB0cnVlOyB9IgorICAgIG91dHAucHV0cyAiI2RlZmluZSBSRVRVUk4o
dmFsdWUpIGRvIHtcXCIKKyAgICBvdXRwLnB1dHMgIiAgICBpZiAoaGlkZGVuVHJ1dGgoKSlcXCIK
KyAgICBvdXRwLnB1dHMgIiAgICAgICAgcmV0dXJuIHZhbHVlO1xcIgorICAgIG91dHAucHV0cyAi
fSIKKyAgICBvdXRwLnB1dHMgImJvb2wgSW5zdDo6aXNWYWxpZEZvcm0oKSIKKyAgICBvdXRwLnB1
dHMgInsiCisgICAgbWF0Y2hJbnN0T3ZlcmxvYWRGb3JtKG91dHAsIDpzYWZlLCAidGhpcyIpIHsK
KyAgICAgICAgfCBvcGNvZGUsIG92ZXJsb2FkLCBmb3JtIHwKKyAgICAgICAgaWYgb3Bjb2RlLnNw
ZWNpYWwKKyAgICAgICAgICAgIG91dHAucHV0cyAiaWYgKGFyZ3Muc2l6ZSgpIDwgMSkiCisgICAg
ICAgICAgICBvdXRwLnB1dHMgInJldHVybiBmYWxzZTsiCisgICAgICAgICAgICBvdXRwLnB1dHMg
ImlmICghYXJnc1swXS5pc1NwZWNpYWwoKSkiCisgICAgICAgICAgICBvdXRwLnB1dHMgInJldHVy
biBmYWxzZTsiCisgICAgICAgICAgICBvdXRwLnB1dHMgIlJFVFVSTihhcmdzWzBdLnNwZWNpYWwo
KS0+aXNWYWxpZCgqdGhpcykpOyIKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgbmVlZHNNb3Jl
VmFsaWRhdGlvbiA9IGZhbHNlCisgICAgICAgICAgICBvdmVybG9hZC5zaWduYXR1cmUubGVuZ3Ro
LnRpbWVzIHsKKyAgICAgICAgICAgICAgICB8IGluZGV4IHwKKyAgICAgICAgICAgICAgICByb2xl
ID0gb3ZlcmxvYWQuc2lnbmF0dXJlW2luZGV4XS5yb2xlCisgICAgICAgICAgICAgICAgdHlwZSA9
IG92ZXJsb2FkLnNpZ25hdHVyZVtpbmRleF0udHlwZQorICAgICAgICAgICAgICAgIGtpbmQgPSBm
b3JtLmtpbmRzW2luZGV4XQorICAgICAgICAgICAgICAgIG5lZWRzTW9yZVZhbGlkYXRpb24gfD0g
a2luZC5zcGVjaWFsCisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgIyBXZSBhbHJl
YWR5IGtub3cgdGhhdCB0aGUgZm9ybSBtYXRjaGVzLiBXZSBkb24ndCBoYXZlIHRvIHZhbGlkYXRl
IHRoZSByb2xlLCBzaW5jZQorICAgICAgICAgICAgICAgICMga2luZCBpbXBsaWVzIHJvbGUuIFNv
LCB0aGUgb25seSB0aGluZyBsZWZ0IHRvIHZhbGlkYXRlIGlzIHRoZSB0eXBlLiBBbmQgd2Ugb25s
eSBoYXZlCisgICAgICAgICAgICAgICAgIyB0byB2YWxpZGF0ZSB0aGUgdHlwZSBpZiB3ZSBoYXZl
IGEgVG1wLgorICAgICAgICAgICAgICAgIGlmIGtpbmQubmFtZSA9PSAiVG1wIgorICAgICAgICAg
ICAgICAgICAgICBvdXRwLnB1dHMgImlmICghYXJnc1sje2luZGV4fV0udG1wKCkuaXMje3R5cGV9
UCgpKSIKKyAgICAgICAgICAgICAgICAgICAgb3V0cC5wdXRzICJSRVRVUk4oZmFsc2UpOyIKKyAg
ICAgICAgICAgICAgICBlbmQKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIG5lZWRzTW9y
ZVZhbGlkYXRpb24KKyAgICAgICAgICAgICAgICBvdXRwLnB1dHMgImlmICghaXMje29wY29kZS5u
YW1lfVZhbGlkKHRoaXMpKSIKKyAgICAgICAgICAgICAgICBvdXRwLnB1dHMgIlJFVFVSTihmYWxz
ZSk7IgorICAgICAgICAgICAgZW5kCisgICAgICAgICAgICBvdXRwLnB1dHMgIlJFVFVSTih0cnVl
KTsiCisgICAgICAgIGVuZAorICAgIH0KKyAgICBvdXRwLnB1dHMgInJldHVybiBmYWxzZTsiCisg
ICAgb3V0cC5wdXRzICJ9IgorCisgICAgb3V0cC5wdXRzICJib29sIEluc3Q6OmFkbWl0c1N0YWNr
KHVuc2lnbmVkIGFyZ0luZGV4KSIKKyAgICBvdXRwLnB1dHMgInsiCisgICAgb3V0cC5wdXRzICJz
d2l0Y2ggKG9wY29kZSkgeyIKKyAgICAkb3Bjb2Rlcy52YWx1ZXMuZWFjaCB7CisgICAgICAgIHwg
b3Bjb2RlIHwKKyAgICAgICAgb3V0cC5wdXRzICJjYXNlICN7b3Bjb2RlLm5hbWV9OiIKKworICAg
ICAgICBpZiBvcGNvZGUuc3BlY2lhbAorICAgICAgICAgICAgb3V0cC5wdXRzICJpZiAoIWFyZ0lu
ZGV4KSIKKyAgICAgICAgICAgIG91dHAucHV0cyAicmV0dXJuIGZhbHNlOyIKKyAgICAgICAgICAg
IG91dHAucHV0cyAiUkVUVVJOKGFyZ3NbMF0uc3BlY2lhbCgpLT5hZG1pdHNTdGFjaygqdGhpcywg
YXJnSW5zdCkpOyIKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgIyBTd2l0Y2ggb24gdGhlIGFy
Z0luZGV4LgorICAgICAgICAgICAgb3V0cC5wdXRzICJzd2l0Y2ggKGFyZ0luZGV4KSB7IgorCisg
ICAgICAgICAgICBudW1BcmdzID0gb3Bjb2RlLm92ZXJsb2Fkcy5tYXAgeworICAgICAgICAgICAg
ICAgIHwgb3ZlcmxvYWQgfAorICAgICAgICAgICAgICAgIG92ZXJsb2FkLnNpZ25hdHVyZS5sZW5n
dGgKKyAgICAgICAgICAgIH0ubWF4CisgICAgICAgICAgICAKKyAgICAgICAgICAgIG51bUFyZ3Mu
dGltZXMgeworICAgICAgICAgICAgICAgIHwgYXJnSW5kZXggfAorICAgICAgICAgICAgICAgIG91
dHAucHV0cyAiY2FzZSAje2FyZ0luZGV4fToiCisKKyAgICAgICAgICAgICAgICAjIENoZWNrIGlm
IGFsbCBvZiB0aGUgZm9ybXMgb2YgYWxsIG9mIHRoZSBvdmVybG9hZHMgZWl0aGVyIGRvLCBvciBk
b24ndCwgYWRtaXQgYW4gYWRkcmVzcworICAgICAgICAgICAgICAgICMgYXQgdGhpcyBpbmRleC4g
V2UgZXhwZWN0IHRoaXMgdG8gYmUgYSB2ZXJ5IGNvbW1vbiBjYXNlLgorICAgICAgICAgICAgICAg
IG51bVllcyA9IDAKKyAgICAgICAgICAgICAgICBudW1ObyA9IDAKKyAgICAgICAgICAgICAgICBv
cGNvZGUub3ZlcmxvYWRzLmVhY2ggeworICAgICAgICAgICAgICAgICAgICB8IG92ZXJsb2FkIHwK
KyAgICAgICAgICAgICAgICAgICAgb3ZlcmxvYWQuZm9ybXMuZWFjaCB7CisgICAgICAgICAgICAg
ICAgICAgICAgICB8IGZvcm0gfAorICAgICAgICAgICAgICAgICAgICAgICAgaWYgZm9ybS5raW5k
c1thcmdJbmRleF0gPT0gIkFkZHIiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtWWVz
ICs9IDEKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAg
ICAgICAgICBudW1ObyArPSAxCisgICAgICAgICAgICAgICAgICAgICAgICBlbmQKKyAgICAgICAg
ICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICMgTm90
ZSB0aGF0IHdlIGRlbGliZXJhdGVseSB0ZXN0IG51bVllcyBmaXJzdCBiZWNhdXNlIGlmIHdlIGVu
ZCB1cCB3aXRoIG5vIGZvcm1zLCB3ZSB3YW50CisgICAgICAgICAgICAgICAgIyB0byBzYXkgdGhh
dCBBZGRyZXNzIGlzIGluYWRtaXNzaWJsZS4KKyAgICAgICAgICAgICAgICBpZiBudW1ZZXMgPT0g
MAorICAgICAgICAgICAgICAgICAgICBvdXRwLnB1dHMgIlJFVFVSTihmYWxzZSk7IgorICAgICAg
ICAgICAgICAgIGVsc2lmIG51bU5vID09IDAKKyAgICAgICAgICAgICAgICAgICAgb3V0cC5wdXRz
ICJSRVRVUk4odHJ1ZSk7IgorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAg
ICAgIyBOb3cgZG8gdGhlIGZ1bGwgdGVzdC4KKworICAgICAgICAgICAgICAgICAgICBuZWVkT3Zl
cmxvYWRTd2l0Y2ggPSAob3Bjb2RlLm92ZXJsb2Fkcy5zaXplICE9IDEpCisKKyAgICAgICAgICAg
ICAgICAgICAgb3V0cC5wdXRzICJzd2l0Y2ggKGFyZ3Muc2l6ZSgpKSB7IiBpZiBuZWVkT3Zlcmxv
YWRTd2l0Y2gKKyAgICAgICAgICAgICAgICAgICAgb3Bjb2RlLm92ZXJsb2Fkcy5lYWNoIHsKKyAg
ICAgICAgICAgICAgICAgICAgICAgIHwgb3ZlcmxvYWQgfAorCisgICAgICAgICAgICAgICAgICAg
ICAgICAjIEFnYWluLCBjaGVjayBpZiBhbGwgb2YgdGhlbSBkbyB3aGF0IHdlIHdhbnQuCisgICAg
ICAgICAgICAgICAgICAgICAgICBudW1ZZXMgPSAwCisgICAgICAgICAgICAgICAgICAgICAgICBu
dW1ObyA9IDAKKyAgICAgICAgICAgICAgICAgICAgICAgIG92ZXJsb2FkLmZvcm1zLmVhY2ggewor
ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgZm9ybSB8CisgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgaWYgZm9ybS5raW5kc1thcmdJbmRleF0gPT0gIkFkZHIiCisgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgIG51bVllcyArPSAxCisgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudW1ObyArPSAxCisgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgZW5kCisgICAgICAgICAgICAgICAgICAgICAgICB9CisK
KyAgICAgICAgICAgICAgICAgICAgICAgIGlmIG51bVllcyA9PSAwCisgICAgICAgICAgICAgICAg
ICAgICAgICAjIERvbid0IGVtaXQgYW55dGhpbmcsIGp1c3QgZHJvcCB0byBkZWZhdWx0LgorICAg
ICAgICAgICAgICAgICAgICAgICAgZWxzaWYgbnVtTm8gPT0gMAorICAgICAgICAgICAgICAgICAg
ICAgICAgICAgIG91dHAucHV0cyAiY2FzZSAje292ZXJsb2FkLnNpZ25hdHVyZS5sZW5ndGh9OiIg
aWYgbmVlZE92ZXJsb2FkU3dpdGNoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cC5w
dXRzICJSRVRVUk4odHJ1ZSk7IgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHAucHV0
cyAiYnJlYWs7IiBpZiBuZWVkT3ZlcmxvYWRTd2l0Y2gKKyAgICAgICAgICAgICAgICAgICAgICAg
IGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwLnB1dHMgImNhc2UgI3tvdmVy
bG9hZC5zaWduYXR1cmUubGVuZ3RofToiIGlmIG5lZWRPdmVybG9hZFN3aXRjaAorCisgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgIyBUaGlzIGlzIGhvdyB3ZSB0ZXN0IHRoZSBoeXBvdGhlc2lz
IHRoYXQgY2hhbmdpbmcgdGhpcyBhcmd1bWVudCB0byBhbgorICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICMgYWRkcmVzcyB5aWVsZHMgYSB2YWxpZCBmb3JtLgorICAgICAgICAgICAgICAgICAg
ICAgICAgICAgIGNvbHVtbkdldHRlciA9IHByb2MgeworICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICB8IGNvbHVtbkluZGV4IHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
aWYgY29sdW1uSW5kZXggPT0gYXJnSW5kZXgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICJBcmc6OkFkZHIiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UK
KyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhcmdzWyN7Y29sdW1uSW5kZXh9
XS5raW5kKCkiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuZAorICAgICAgICAg
ICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXIg
PSBwcm9jIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBmb3JtcyB8CisgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bVllcyA9IDAKKworICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICBmb3Jtcy5lYWNoIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgIHwgZm9ybSB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBp
ZiBmb3JtLmtpbmRzW2FyZ0luZGV4XSA9PSAiQWRkciIKKyAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICBudW1ZZXMgKz0gMQorICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgZW5kCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICBpZiBudW1ZZXMgPT0gMAorICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgIyBEcm9wIGRvd24sIGVtaXQgbm8gY29kZSwgc2luY2Ugd2Ug
Y2Fubm90IG1hdGNoLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZQor
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAjIEtlZXAgZ29pbmcuCisgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICBmYWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmQKKyAg
ICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAg
Y2FsbGJhY2sgPSBwcm9jIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cC5w
dXRzICJSRVRVUk4odHJ1ZSk7IgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAg
ICAgICAgICAgICAgICAgICAgICAgICBtYXRjaEZvcm1zKG91dHAsIDpzYWZlLCBvdmVybG9hZC5m
b3JtcywgMCwgY29sdW1uR2V0dGVyLCBmaWx0ZXIsIGNhbGxiYWNrKQorCisgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgb3V0cC5wdXRzICJicmVhazsiIGlmIG5lZWRPdmVybG9hZFN3aXRjaAor
ICAgICAgICAgICAgICAgICAgICAgICAgZW5kCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAg
ICAgICAgICAgICAgICAgaWYgbmVlZE92ZXJsb2FkU3dpdGNoCisgICAgICAgICAgICAgICAgICAg
ICAgICBvdXRwLnB1dHMgImRlZmF1bHQ6IgorICAgICAgICAgICAgICAgICAgICAgICAgb3V0cC5w
dXRzICJicmVhazsiCisgICAgICAgICAgICAgICAgICAgICAgICBvdXRwLnB1dHMgIn0iCisgICAg
ICAgICAgICAgICAgICAgIGVuZAorICAgICAgICAgICAgICAgIGVuZAorICAgICAgICAgICAgICAg
IAorICAgICAgICAgICAgICAgIG91dHAucHV0cyAiYnJlYWs7IgorICAgICAgICAgICAgfQorICAg
ICAgICAgICAgCisgICAgICAgICAgICBvdXRwLnB1dHMgImRlZmF1bHQ6IgorICAgICAgICAgICAg
b3V0cC5wdXRzICJicmVhazsiCisgICAgICAgICAgICBvdXRwLnB1dHMgIn0iCisgICAgICAgIGVu
ZAorICAgICAgICAKKyAgICAgICAgb3V0cC5wdXRzICJicmVhazsiCisgICAgfQorICAgIG91dHAu
cHV0cyAiZGVmYXVsdDoiOworICAgIG91dHAucHV0cyAiYnJlYWs7IgorICAgIG91dHAucHV0cyAi
fSIKKyAgICBvdXRwLnB1dHMgInJldHVybiBmYWxzZTsiCisgICAgb3V0cC5wdXRzICJ9IgorCisg
ICAgb3V0cC5wdXRzICJDQ2FsbEhlbHBlcnM6Okp1bXAgSW5zdDo6Z2VuZXJhdGUoQ0NhbGxIZWxw
ZXJzJiBqaXQpIGNvbnN0IgorICAgIG91dHAucHV0cyAieyIKKyAgICBvdXRwLnB1dHMgIkNDYWxs
SGVscGVyczo6SnVtcCByZXN1bHQ7IgorICAgIG1hdGNoSW5zdE92ZXJsb2FkRm9ybShvdXRwLCA6
ZmFzdCwgInRoaXMiKSB7CisgICAgICAgIHwgb3Bjb2RlLCBvdmVybG9hZCwgZm9ybSB8CisgICAg
ICAgIGlmIG9wY29kZS5zcGVjaWFsCisgICAgICAgICAgICBvdXRwLnB1dHMgIlJFVFVSTihhcmdz
WzBdLnNwZWNpYWwoKS0+Z2VuZXJhdGUoKnRoaXMsIGppdCkpOyIKKyAgICAgICAgZWxzZQorICAg
ICAgICAgICAgaWYgZm9ybS5hbHROYW1lCisgICAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9IGZv
cm0uYWx0TmFtZQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIG1ldGhvZE5hbWUg
PSBvcGNvZGUubWFzbU5hbWUKKyAgICAgICAgICAgIGVuZAorICAgICAgICAgICAgb3V0cC5wcmlu
dCAiaml0LiN7bWV0aG9kTmFtZX0oIgorCisgICAgICAgICAgICBmb3JtLmtpbmRzLmVhY2hfd2l0
aF9pbmRleCB7CisgICAgICAgICAgICAgICAgfCBraW5kLCBpbmRleCB8CisgICAgICAgICAgICAg
ICAgaWYgaW5kZXggIT0gMAorICAgICAgICAgICAgICAgICAgICBvdXRwLnByaW50ICIsICIKKyAg
ICAgICAgICAgICAgICBlbmQKKyAgICAgICAgICAgICAgICBjYXNlIGtpbmQubmFtZQorICAgICAg
ICAgICAgICAgIHdoZW4gIlRtcCIKKyAgICAgICAgICAgICAgICAgICAgaWYgb3ZlcmxvYWQuc2ln
bmF0dXJlW2luZGV4XS50eXBlID09ICJHIgorICAgICAgICAgICAgICAgICAgICAgICAgb3V0cC5w
cmludCAiYXJnc1sje2luZGV4fV0uZ3ByKCkiCisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAg
ICAgICAgICAgICAgICAgICAgICAgIG91dHAucHJpbnQgImFyZ3NbI3tpbmRleH1dLmZwcigpIgor
ICAgICAgICAgICAgICAgICAgICBlbmQKKyAgICAgICAgICAgICAgICB3aGVuICJJbW0iCisgICAg
ICAgICAgICAgICAgICAgIG91dHAucHJpbnQgImFyZ3NbI3tpbmRleH1dLmFzVHJ1c3RlZEltbTMy
KCkiCisgICAgICAgICAgICAgICAgd2hlbiAiSW1tUHRyIgorICAgICAgICAgICAgICAgICAgICBv
dXRwLnByaW50ICJhcmdzWyN7aW5kZXh9XS5hc1RydXN0ZWRJbW1QdHIoKSIKKyAgICAgICAgICAg
ICAgICB3aGVuICJBZGRyIgorICAgICAgICAgICAgICAgICAgICBvdXRwLnByaW50ICJhcmdzWyN7
aW5kZXh9XS5hc0FkZHJlc3MoKSIKKyAgICAgICAgICAgICAgICB3aGVuICJJbmRleCIKKyAgICAg
ICAgICAgICAgICAgICAgb3V0cC5wcmludCAiYXJnc1sje2luZGV4fV0uYXNCYXNlSW5kZXgoKSIK
KyAgICAgICAgICAgICAgICBlbmQKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgb3V0cC5w
dXRzICIpOyIKKyAgICAgICAgICAgIG91dHAucHV0cyAiUkVUVVJOKHJlc3VsdCk7IgorICAgICAg
ICBlbmQKKyAgICB9CisgICAgb3V0cC5wdXRzICJSRUxFQVNFX0FTU0VSVF9OT1RfUkVBQ0hFRCgp
OyIKKyAgICBvdXRwLnB1dHMgInJldHVybiByZXN1bHQ7IgorICAgIG91dHAucHV0cyAifSIKKwor
ICAgIG91dHAucHV0cyAifSB9IH0gLy8gbmFtZXNwYWNlIEpTQzo6QjM6OkFpciIKK30KKwpJbmRl
eDogU291cmNlL0phdmFTY3JpcHRDb3JlL2ppdC9SZWcuaAo9PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2Uv
SmF2YVNjcmlwdENvcmUvaml0L1JlZy5oCShyZXZpc2lvbiAxOTEyMzkpCisrKyBTb3VyY2UvSmF2
YVNjcmlwdENvcmUvaml0L1JlZy5oCSh3b3JraW5nIGNvcHkpCkBAIC0xMDUsNyArMTA1LDYgQEAg
cHVibGljOgogICAgIHVuc2lnbmVkIGluZGV4KCkgY29uc3QgeyByZXR1cm4gbV9pbmRleDsgfQog
ICAgIAogICAgIGJvb2wgaXNTZXQoKSBjb25zdCB7IHJldHVybiBtX2luZGV4ICE9IGludmFsaWQo
KTsgfQotICAgIGJvb2wgb3BlcmF0b3IhKCkgY29uc3QgeyByZXR1cm4gIWlzU2V0KCk7IH0KICAg
ICBleHBsaWNpdCBvcGVyYXRvciBib29sKCkgY29uc3QgeyByZXR1cm4gaXNTZXQoKTsgfQogCiAg
ICAgYm9vbCBpc0hhc2hUYWJsZURlbGV0ZWRWYWx1ZSgpIGNvbnN0IHsgcmV0dXJuIG1faW5kZXgg
PT0gZGVsZXRlZCgpOyB9CkBAIC0xNzAsNiArMTY5LDQ2IEBAIHB1YmxpYzoKICAgICAKICAgICB2
b2lkIGR1bXAoUHJpbnRTdHJlYW0mKSBjb25zdDsKIAorICAgIGNsYXNzIEFsbFJlZ3NJdGVyYWJs
ZSB7CisgICAgcHVibGljOgorCisgICAgICAgIGNsYXNzIGl0ZXJhdG9yIHsKKyAgICAgICAgcHVi
bGljOgorICAgICAgICAgICAgaXRlcmF0b3IoKSB7IH0KKworICAgICAgICAgICAgZXhwbGljaXQg
aXRlcmF0b3IoUmVnIHJlZykKKyAgICAgICAgICAgICAgICA6IG1fcmVnKHJlZykKKyAgICAgICAg
ICAgIHsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgUmVnIG9wZXJhdG9yKigpIGNvbnN0
IHsgcmV0dXJuIG1fcmVnOyB9CisKKyAgICAgICAgICAgIGl0ZXJhdG9yJiBvcGVyYXRvcisrKCkK
KyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtX3JlZyA9IG1fcmVnLm5leHQoKTsKKyAg
ICAgICAgICAgICAgICByZXR1cm4gKnRoaXM7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAg
IGJvb2wgb3BlcmF0b3I9PShjb25zdCBpdGVyYXRvciYgb3RoZXIpIGNvbnN0CisgICAgICAgICAg
ICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG1fcmVnID09IG90aGVyLm1fcmVnOworICAgICAg
ICAgICAgfQorCisgICAgICAgICAgICBib29sIG9wZXJhdG9yIT0oY29uc3QgaXRlcmF0b3ImIG90
aGVyKSBjb25zdAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiAhKCp0aGlz
ID09IG90aGVyKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICBwcml2YXRlOgorICAgICAgICAg
ICAgUmVnIG1fcmVnOworICAgICAgICB9OworCisgICAgICAgIGl0ZXJhdG9yIGJlZ2luKCkgY29u
c3QgeyByZXR1cm4gaXRlcmF0b3IoUmVnOjpmaXJzdCgpKTsgfQorICAgICAgICBpdGVyYXRvciBl
bmQoKSBjb25zdCB7IHJldHVybiBpdGVyYXRvcihSZWcoKSk7IH0KKyAgICB9OworCisgICAgc3Rh
dGljIEFsbFJlZ3NJdGVyYWJsZSBhbGwoKSBjb25zdCB7IHJldHVybiBBbGxSZWdzSXRlcmFibGUo
KTsgfQorCiBwcml2YXRlOgogICAgIHN0YXRpYyB1aW50OF90IGludmFsaWQoKSB7IHJldHVybiAw
eGZmOyB9CiAKSW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9qaXQvUmVnaXN0ZXJTZXQuaAo9
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvaml0L1JlZ2lzdGVyU2V0LmgJKHJl
dmlzaW9uIDE5MTIzOSkKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9qaXQvUmVnaXN0ZXJTZXQu
aAkod29ya2luZyBjb3B5KQpAQCAtMTE3LDYgKzExNywxMyBAQCBwdWJsaWM6CiAgICAgCiAgICAg
Ym9vbCBvcGVyYXRvcj09KGNvbnN0IFJlZ2lzdGVyU2V0JiBvdGhlcikgY29uc3QgeyByZXR1cm4g
bV92ZWN0b3IgPT0gb3RoZXIubV92ZWN0b3I7IH0KICAgICB1bnNpZ25lZCBoYXNoKCkgY29uc3Qg
eyByZXR1cm4gbV92ZWN0b3IuaGFzaCgpOyB9CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBGdW5j
dG9yPgorICAgIHZvaWQgZm9yRWFjaChjb25zdCBGdW5jdG9yJiBmdW5jdG9yKQorICAgIHsKKyAg
ICAgICAgZm9yIChzaXplX3QgaW5kZXggOiBtX3ZlY3Rvci5zZXRCaXRzKCkpCisgICAgICAgICAg
ICBmdW5jdG9yKFJlZzo6ZnJvbUluZGV4KGluZGV4KSk7CisgICAgfQogICAgIAogcHJpdmF0ZToK
ICAgICB2b2lkIHNldEFueShSZWcgcmVnKSB7IHNldChyZWcpOyB9Cg==
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>263623</attachid>
            <date>2015-10-20 15:32:25 -0700</date>
            <delta_ts>2015-10-20 16:40:31 -0700</delta_ts>
            <desc>just a few little things</desc>
            <filename>blah.patch</filename>
            <type>text/plain</type>
            <size>256715</size>
            <attacher name="Filip Pizlo">fpizlo</attacher>
            
              <data encoding="base64">SW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM0FkZHJlc3NNYXRjaGVyLnBhdHRlcm5z
Cj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM0FkZHJlc3NNYXRjaGVy
LnBhdHRlcm5zCShyZXZpc2lvbiAwKQorKysgU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzQWRk
cmVzc01hdGNoZXIucGF0dGVybnMJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSw0MSBAQAorIyBD
b3B5cmlnaHQgKEMpIDIwMTUgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorIworIyBS
ZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9y
IHdpdGhvdXQKKyMgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhl
IGZvbGxvd2luZyBjb25kaXRpb25zCisjIGFyZSBtZXQ6CisjIDEuIFJlZGlzdHJpYnV0aW9ucyBv
ZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisjICAgIG5vdGlj
ZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4K
KyMgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBh
Ym92ZSBjb3B5cmlnaHQKKyMgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQg
dGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorIyAgICBkb2N1bWVudGF0aW9uIGFuZC9v
ciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorIworIyBU
SElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gQU5EIElUUyBDT05UUklCVVRP
UlMgYGBBUyBJUycnCisjIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElO
Q0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorIyBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9G
IE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisjIFBVUlBPU0Ug
QVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IgSVRTIENPTlRS
SUJVVE9SUworIyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFM
LCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCisjIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVE
SU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCisjIFNVQlNUSVRVVEUgR09P
RFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVT
UworIyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJ
QUJJTElUWSwgV0hFVEhFUiBJTgorIyBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9S
VCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorIyBBUklTSU5HIElOIEFOWSBX
QVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GCisj
IFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworbWF0Y2hlciBBZGRyZXNzTWF0Y2hl
cgorCisjIE5vdGUgdGhhdCB0aGlzIHJlbGllcyBvbiBCMyBkb2luZyBhZ2dyZXNzaXZlIHJlYXNz
b2NpYXRpb24gYW5kIGNhbm9uY2FsaXphdGlvbiBvZiBpbnRlZ2VyIGFkZHMuCisjIFdlJ2xsIG5l
dmVyIHNlZSBBZGQoQWRkKHgsIGNvbnN0MSksIGNvbnN0MikgYmVjYXVzZSBpdCB3b3VsZCBoYXZl
IGFscmVhZHkgYmVlbiByZWFzc29jaWF0ZWQgaW50bworIyBBZGQoeCwgY29uc3QxICsgY29uc3Qy
KS4gQWxzbywgd2Ugd2lsbCBuZXZlciBzZWUgQWRkKGNvbnN0LCB4KSwgYmVjYXVzZSB3ZSB3b3Vs
ZCBoYXZlIGNhbm9uaWNhbGl6ZWQKKyMgaXQgdG8gQWRkKHgsIGNvbnN0KS4gVGhhdCBzYWlkLCBp
biB0aGlzIGNvZGUgd2UgbmV2ZXIgbWFrZSBhc3NlcnRpb25zIGFib3V0IHRoZXNlIG9wdGltaXph
dGlvbnMKKyMgaGF2aW5nIGJlZW4gcGVyZm9ybWVkLiBBbHNvLCBzaW5jZSB0aGUgTG9hZC9TdG9y
ZSBpbnN0cnVjdGlvbnMgaW4gQjMgaGF2ZSBhIGJ1aWx0LWluIG9mZnNldCwgd2UKKyMgZG9uJ3Qg
bmVlZCB0byBtYXRjaCBBZGQoeCwgY29uc3QpLiBUaGF0IHdvdWxkIGhhdmUgYmVlbiBmb2xkZWQg
aW50byB0aGUgTG9hZC9TdG9yZSBpbnN0cnVjdGlvbnMKKyMgYWxyZWFkeS4gU28sIHRoZSBvbmx5
IGZhbmN5IG1hdGhpbmcgdGhpcyBjYW4gZG8gaXMganVzdCBCYXNlSW5kZXggZm9ybXMuCisKK0Fk
ZFNoaWZ0MSA9IEFkZChTaGwoaW5kZXgsICRsb2dTY2FsZSksIGJhc2UpCitBZGRTaGlmdDIgPSBB
ZGQoYmFzZSwgU2hsKGluZGV4LCAkbG9nU2NhbGUpKQorCitBZGQgPSBBZGQobGVmdCwgcmlnaHQp
CisKKyRDb25zdAorCitEaXJlY3QKSW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM0Fy
Z3VtZW50UmVnVmFsdWUuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9i
My9CM0FyZ3VtZW50UmVnVmFsdWUuY3BwCShyZXZpc2lvbiAwKQorKysgU291cmNlL0phdmFTY3Jp
cHRDb3JlL2IzL0IzQXJndW1lbnRSZWdWYWx1ZS5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTAsMCAr
MSw0MSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNSBBcHBsZSBJbmMuIEFsbCByaWdodHMg
cmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJp
bmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0
ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6Cisg
KiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3Zl
IGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhl
IGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBm
b3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhp
cyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUK
KyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRo
IHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBB
UFBMRSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFO
VElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJS
QU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisg
KiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBP
UgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElO
Q0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdF
UyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJT
VElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJ
VFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBU
SEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJ
TElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJ
U0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVO
IElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLiAKKyAqLworCisj
aW5jbHVkZSAiY29uZmlnLmgiCisjaW5jbHVkZSAiQjNBcmd1bWVudFJlZ1ZhbHVlLmgiCisKK25h
bWVzcGFjZSBKU0MgeyBuYW1lc3BhY2UgQjMgeworCitBcmd1bWVudFJlZ1ZhbHVlOjp+QXJndW1l
bnRSZWdWYWx1ZSgpCit7Cit9CisKK3ZvaWQgQXJndW1lbnRSZWdWYWx1ZTo6ZHVtcE1ldGEoUHJp
bnRTdHJlYW0mIG91dCkgY29uc3QKK3sKKyAgICBvdXQucHJpbnQobV9yZWcpOworfQorCit9IH0g
Ly8gbmFtZXNwYWNlIEpTQzo6QjMKKwpJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0Iz
QXJndW1lbnRSZWdWYWx1ZS5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9i
My9CM0FyZ3VtZW50UmVnVmFsdWUuaAkocmV2aXNpb24gMCkKKysrIFNvdXJjZS9KYXZhU2NyaXB0
Q29yZS9iMy9CM0FyZ3VtZW50UmVnVmFsdWUuaAkod29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDYw
IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE1IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNl
cnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5
IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBw
cm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEu
IFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29w
eXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9s
bG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0g
bXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxp
c3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICog
ICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhl
IGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExF
IElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVT
LCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJ
RVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBV
UlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SCisg
KiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURF
TlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJ
TkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRV
VEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsg
T1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9S
WQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZ
LCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5H
IElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYg
QURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisKKyNpZm5k
ZWYgQjNBcmd1bWVudFJlZ1ZhbHVlX2gKKyNkZWZpbmUgQjNBcmd1bWVudFJlZ1ZhbHVlX2gKKwor
I2luY2x1ZGUgIkIzVmFsdWUuaCIKKyNpbmNsdWRlICJSZWcuaCIKKworbmFtZXNwYWNlIEpTQyB7
IG5hbWVzcGFjZSBCMyB7CisKK2NsYXNzIEFyZ3VtZW50UmVnVmFsdWUgOiBwdWJsaWMgVmFsdWUg
eworcHVibGljOgorICAgIHN0YXRpYyBib29sIGFjY2VwdHMoT3Bjb2RlIG9wY29kZSkgeyByZXR1
cm4gb3Bjb2RlID09IEFyZ3VtZW50UmVnOyB9CisgICAgCisgICAgfkFyZ3VtZW50UmVnVmFsdWUo
KTsKKworICAgIFJlZyBhcmd1bWVudFJlZygpIGNvbnN0IHsgcmV0dXJuIG1fcmVnOyB9CisKK3By
b3RlY3RlZDoKKyAgICB2b2lkIGR1bXBNZXRhKFByaW50U3RyZWFtJikgY29uc3Qgb3ZlcnJpZGU7
CisKK3ByaXZhdGU6CisgICAgZnJpZW5kIGNsYXNzIFByb2NlZHVyZTsKKworICAgIEFyZ3VtZW50
UmVnVmFsdWUodW5zaWduZWQgaW5kZXgsIE9yaWdpbiBvcmlnaW4sIFJlZyByZWcpCisgICAgICAg
IDogVmFsdWUoaW5kZXgsIEFyZ3VtZW50UmVnLCByZWcuaXNHUFIoKSA/IHBvaW50ZXIoKSA6IERv
dWJsZSwgb3JpZ2luKQorICAgICAgICAsIG1fcmVnKHJlZykKKyAgICB7CisgICAgfQorCisgICAg
UmVnIG1fcmVnOworfTsKKworfSB9IC8vIG5hbWVzcGFjZSBKU0M6OkIzCisKKyNlbmRpZiAvLyBC
M0FyZ3VtZW50UmVnVmFsdWVfaAorCkluZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNC
YXNpY0Jsb2NrLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNC
YXNpY0Jsb2NrLmNwcAkocmV2aXNpb24gMCkKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9C
M0Jhc2ljQmxvY2suY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsNTggQEAKKy8qCisgKiBD
b3B5cmlnaHQgKEMpIDIwMTUgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAq
IFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGgg
b3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQg
dGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRp
b25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAg
IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xh
aW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVj
ZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRp
b25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0
aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9u
LgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFTIElT
JycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywg
QlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFO
VEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElT
Q0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IKKyAqIENPTlRSSUJVVE9S
UyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFM
LAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVU
IE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBT
RVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJ
TlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFC
SUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAq
IChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBP
VVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRI
RSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKworI2luY2x1ZGUgImNvbmZpZy5o
IgorI2luY2x1ZGUgIkIzQmFzaWNCbG9jay5oIgorCituYW1lc3BhY2UgSlNDIHsgbmFtZXNwYWNl
IEIzIHsKKworQmFzaWNCbG9jazo6QmFzaWNCbG9jayh1bnNpZ25lZCBpbmRleCkKKyAgICA6IG1f
aW5kZXgoaW5kZXgpCit7Cit9CisKK0Jhc2ljQmxvY2s6On5CYXNpY0Jsb2NrKCkKK3sKK30KKwor
dm9pZCBCYXNpY0Jsb2NrOjphcHBlbmQoVmFsdWUqIHZhbHVlKQoreworICAgIG1fdmFsdWVzLmFw
cGVuZCh2YWx1ZSk7Cit9CisKK3ZvaWQgQmFzaWNCbG9jazo6ZHVtcChQcmludFN0cmVhbSYgb3V0
KSBjb25zdAoreworICAgIG91dC5wcmludChkdW1wUHJlZml4LCBtX2luZGV4KTsKK30KKwordm9p
ZCBCYXNpY0Jsb2NrOjpkZWVwRHVtcChQcmludFN0cmVhbSYgb3V0KSBjb25zdAoreworICAgIG91
dC5wcmludCgiQkIiLCAqdGhpcywgIjpcbiIpOworICAgIGZvciAoVmFsdWUqIHZhbHVlIDogKnRo
aXMpCisgICAgICAgIG91dC5wcmludCgiICAgICIsIGRlZXBEdW1wKHZhbHVlKSwgIlxuIik7Cit9
CisKK30gfSAvLyBuYW1lc3BhY2UgSlNDOjpCMworCkluZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENv
cmUvYjMvQjNCYXNpY0Jsb2NrLmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRDb3Jl
L2IzL0IzQmFzaWNCbG9jay5oCShyZXZpc2lvbiAwKQorKysgU291cmNlL0phdmFTY3JpcHRDb3Jl
L2IzL0IzQmFzaWNCbG9jay5oCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsMTEyIEBACisvKgor
ICogQ29weXJpZ2h0IChDKSAyMDE1IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAq
CisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3
aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0
aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJp
YnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Cisg
KiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRp
c2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXBy
b2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29u
ZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1l
bnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1
dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gYGBB
UyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJ
TkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVS
Q0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJF
IERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SCisgKiBDT05UUklC
VVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BF
Q0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcs
IEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMg
T1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5F
U1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0Yg
TElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JU
CisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBX
QVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBP
RiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisKKyNpZm5kZWYgQjNCYXNp
Y0Jsb2NrCisjZGVmaW5lIEIzQmFzaWNCbG9jaworCituYW1lc3BhY2UgSlNDIHsgbmFtZXNwYWNl
IEIzIHsKKworY2xhc3MgUHJvY2VkdXJlOworY2xhc3MgVmFsdWU7CisKK2NsYXNzIEJhc2ljQmxv
Y2sgeworICAgIFdURl9NQUtFX05PTkNPUFlBQkxFKEJhc2ljQmxvY2spOworICAgIFdURl9NQUtF
X0ZBU1RfQUxMT0NBVEVEOworcHVibGljOgorICAgIHR5cGVkZWYgVmVjdG9yPFZhbHVlKj4gVmFs
dWVMaXN0OworICAgIHR5cGVkZWYgVmVjdG9yPEJhc2ljQmxvY2sqLCAyPiBTdWNjZXNzb3JMaXN0
OyAvLyBUaGlzIG1hdGNoZXMgQ29udHJvbFZhbHVlJ3MgdHlwZWRlZi4KKworICAgIHN0YXRpYyBj
b25zdCBjaGFyKiBkdW1wUHJlZml4ID0gIiMiOworCisgICAgfkJhc2ljQmxvY2soKTsKKworICAg
IHVuc2lnbmVkIGluZGV4KCkgY29uc3QgeyByZXR1cm4gbV9pbmRleDsgfQorCisgICAgVmFsdWVM
aXN0OjppdGVyYXRvciBiZWdpbigpIHsgcmV0dXJuIG1fdmFsdWVzLmJlZ2luKCk7IH0KKyAgICBW
YWx1ZUxpc3Q6Oml0ZXJhdG9yIGVuZCgpIHsgcmV0dXJuIG1fdmFsdWVzLmVuZCgpOyB9CisgICAg
VmFsdWVMaXN0Ojpjb25zdF9pdGVyYXRvciBiZWdpbigpIGNvbnN0IHsgcmV0dXJuIG1fdmFsdWVz
LmJlZ2luKCk7IH0KKyAgICBWYWx1ZUxpc3Q6OmNvbnN0X2l0ZXJhdG9yIGVuZCgpIGNvbnN0IHsg
cmV0dXJuIG1fdmFsdWVzLmVuZCgpOyB9CisKKyAgICBzaXplX3Qgc2l6ZSgpIGNvbnN0IHsgcmV0
dXJuIG1fdmFsdWVzLnNpemUoKTsgfQorICAgIFZhbHVlKiBhdChzaXplX3QgaW5kZXgpIGNvbnN0
IHsgcmV0dXJuIG1fdmFsdWVzW2luZGV4XTsgfQorICAgIFZhbHVlKiYgYXQoc2l6ZV90IGluZGV4
KSB7IHJldHVybiBtX3ZhbHVlc1tpbmRleF07IH0KKworICAgIFZhbHVlKiBsYXN0KCkgY29uc3Qg
eyByZXR1cm4gbV92YWx1ZXMubGFzdCgpOyB9CisgICAgVmFsdWUqJiBsYXN0KCkgeyByZXR1cm4g
bV92YWx1ZXMubGFzdCgpOyB9CisKKyAgICBjb25zdCBWYWx1ZUxpc3QmIHZhbHVlcygpIGNvbnN0
IHsgcmV0dXJuIG1fdmFsdWVzOyB9CisgICAgVmFsdWVMaXN0JiB2YWx1ZXMoKSB7IHJldHVybiBt
X3ZhbHVlczsgfQorCisgICAgdm9pZCBhcHBlbmQoVmFsdWUqKTsKKworICAgIHRlbXBsYXRlPHR5
cGVuYW1lIFZhbHVlVHlwZSwgdHlwZW5hbWUuLi4gQXJndW1lbnRzPgorICAgIFZhbHVlVHlwZSog
YXBwZW5kTmV3KFByb2NlZHVyZSYsIEFyZ3VtZW50cy4uLik7CisKKyAgICB1bnNpZ25lZCBudW1T
dWNjZXNzb3JzKCkgY29uc3Q7CisgICAgQmFzaWNCbG9jayogc3VjY2Vzc29yKHVuc2lnbmVkIGlu
ZGV4KSBjb25zdDsKKyAgICBCYXNpY0Jsb2NrKiYgc3VjY2Vzc29yKHVuc2lnbmVkIGluZGV4KTsK
KyAgICBjb25zdCBTdWNjZXNzb3JMaXN0JiBzdWNjZXNzb3JzKCkgY29uc3Q7CisKKyAgICB2b2lk
IGR1bXAoUHJpbnRTdHJlYW0mKSBjb25zdDsKKyAgICB2b2lkIGRlZXBEdW1wKFByaW50U3RyZWFt
JikgY29uc3Q7CisKK3ByaXZhdGU6CisgICAgZnJpZW5kIGNsYXNzIFByb2NlZHVyZTsKKyAgICAK
KyAgICAvLyBJbnN0YW50aWF0ZSB2aWEgUHJvY2VkdXJlLgorICAgIEJhc2ljQmxvY2sodW5zaWdu
ZWQgaW5kZXgpOworCisgICAgdW5zaWduZWQgbV9pbmRleDsKKyAgICBWYWx1ZUxpc3QgbV92YWx1
ZXM7Cit9OworCitjbGFzcyBEZWVwQmFzaWNCbG9ja0R1bXAgeworcHVibGljOgorICAgIERlZXBC
YXNpY0Jsb2NrRHVtcChCYXNpY0Jsb2NrKiBibG9jaykKKyAgICAgICAgOiBtX2Jsb2NrKGJsb2Nr
KQorICAgIHsKKyAgICB9CisKKyAgICB2b2lkIGR1bXAoUHJpbnRTdHJlYW0mIG91dCkgY29uc3QK
KyAgICB7CisgICAgICAgIGlmIChtX2Jsb2NrKQorICAgICAgICAgICAgbV9ibG9jay0+ZGVlcER1
bXAob3V0KTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgb3V0LnByaW50KCI8bnVsbD4iKTsK
KyAgICB9CisKK3ByaXZhdGU6CisgICAgQmFzaWNCbG9jayogbV9ibG9jazsKK307CisKK0RlZXBC
YXNpY0Jsb2NrRHVtcCBkZWVwRHVtcChCYXNpY0Jsb2NrKiBibG9jaykKK3sKKyAgICByZXR1cm4g
RGVlcEJhc2ljQmxvY2tEdW1wKGJsb2NrKTsKK30KKworfSB9IC8vIG5hbWVzcGFjZSBKU0M6OkIz
CisKKyNlbmRpZiAvLyBCM0Jhc2ljQmxvY2sKKwpJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3Jl
L2IzL0IzQmFzaWNCbG9ja0lubGluZXMuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlw
dENvcmUvYjMvQjNCYXNpY0Jsb2NrSW5saW5lcy5oCShyZXZpc2lvbiAwKQorKysgU291cmNlL0ph
dmFTY3JpcHRDb3JlL2IzL0IzQmFzaWNCbG9ja0lubGluZXMuaAkod29ya2luZyBjb3B5KQpAQCAt
MCwwICsxLDY2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE1IEFwcGxlIEluYy4gQWxsIHJp
Z2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBh
bmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBl
cm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1l
dDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUg
YWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFu
ZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmlu
YXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNl
LCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGlu
IHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVk
IHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVE
IEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBX
QVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVE
IFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VM
QVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJ
TkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVD
VCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBE
QU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9G
IFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICog
UFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04g
QU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1Qg
TElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNF
KSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUs
IEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICov
CisKKyNpZm5kZWYgQjNCYXNpY0Jsb2NrSW5saW5lc19oCisjZGVmaW5lIEIzQmFzaWNCbG9ja0lu
bGluZXNfaAorCisjaW5jbHVkZSAiQjNCYXNpY0Jsb2NrLmgiCisjaW5jbHVkZSAiQjNDb250cm9s
VmFsdWUuaCIKKyNpbmNsdWRlICJCM1Byb2NlZHVyZUlubGluZXMuaCIKKworbmFtZXNwYWNlIEpT
QyB7IG5hbWVzcGFjZSBCMyB7CisKK3RlbXBsYXRlPHR5cGVuYW1lIFZhbHVlVHlwZSB0eXBlbmFt
ZS4uLiBBcmd1bWVudHM+CitWYWx1ZVR5cGUqIEJhc2ljQmxvY2s6OmFwcGVuZE5ldyhQcm9jZWR1
cmUmIHByb2NlZHVyZSwgQXJndW1lbnRzLi4uIGFyZ3VtZW50cykKK3sKKyAgICBWYWx1ZVR5cGUq
IHJlc3VsdCA9IHByb2NlZHVyZS5hZGQ8VmFsdWVUeXBlPihhcmd1bWVudHMuLi4pOworICAgIGFw
cGVuZChyZXN1bHQpOworICAgIHJldHVybiByZXN1bHQ7Cit9CisKK3Vuc2lnbmVkIEJhc2ljQmxv
Y2s6Om51bVN1Y2Nlc3NvcnMoKSBjb25zdAoreworICAgIHJldHVybiBsYXN0KCktPmFzPENvbnRy
b2xWYWx1ZT4oKS0+bnVtU3VjY2Vzc29ycygpOworfQorCitCYXNpY0Jsb2NrKiBCYXNpY0Jsb2Nr
OjpzdWNjZXNzb3IodW5zaWduZWQgaW5kZXgpIGNvbnN0Cit7CisgICAgcmV0dXJuIGxhc3QoKS0+
YXM8Q29udHJvbFZhbHVlPigpLT5zdWNjZXNzb3IoaW5kZXgpOworfQorCitCYXNpY0Jsb2NrKiYg
QmFzaWNCbG9jazo6c3VjY2Vzc29yKHVuc2lnbmVkIGluZGV4KQoreworICAgIHJldHVybiBsYXN0
KCktPmFzPENvbnRyb2xWYWx1ZT4oKS0+c3VjY2Vzc29yKGluZGV4KTsKK30KKworY29uc3QgQmFz
aWNCbG9jazo6U3VjY2Vzc29yTGlzdCYgQmFzaWNCbG9jazo6c3VjY2Vzc29ycygpIGNvbnN0Cit7
CisgICAgcmV0dXJuIGxhc3QoKS0+YXM8Q29udHJvbFZhbHVlPigpLT5zdWNjZXNzb3JzKCk7Cit9
CisKK30gfSAvLyBuYW1lc3BhY2UgSlNDOjpCMworCisjZW5kaWYgLy8gQjNCYXNpY0Jsb2NrSW5s
aW5lc19oCisKSW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM0NoZWNrVmFsdWUuY3Bw
Cj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM0NoZWNrVmFsdWUuY3Bw
CShyZXZpc2lvbiAwKQorKysgU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzQ2hlY2tWYWx1ZS5j
cHAJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSw0MSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykg
MjAxNSBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRp
b24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Cisg
KiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5n
IGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNl
IGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlz
IGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4g
UmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBj
b3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBm
b2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90
aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJ
UyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisg
KiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlU
RUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQg
RklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4g
Tk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBG
T1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExB
UlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQg
VE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NT
IE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikg
SE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhF
UiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBO
RUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNF
CisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZ
IE9GIFNVQ0ggREFNQUdFLiAKKyAqLworCisjaW5jbHVkZSAiY29uZmlnLmgiCisjaW5jbHVkZSAi
QjNDaGVja1ZhbHVlLmgiCisKK25hbWVzcGFjZSBKU0MgeyBuYW1lc3BhY2UgQjMgeworCitDaGVj
a1ZhbHVlOjp+Q2hlY2tWYWx1ZSgpCit7Cit9CisKK3ZvaWQgQ2hlY2tWYWx1ZTo6ZHVtcE1ldGEo
UHJpbnRTdHJlYW0mIG91dCkgY29uc3QKK3sKKyAgICBvdXQucHJpbnQoInN0YWNrbWFwID0gIiwg
c3RhY2ttYXApOworfQorCit9IH0gLy8gbmFtZXNwYWNlIEpTQzo6QjMKKwpJbmRleDogU291cmNl
L0phdmFTY3JpcHRDb3JlL2IzL0IzQ2hlY2tWYWx1ZS5oCj09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9K
YXZhU2NyaXB0Q29yZS9iMy9CM0NoZWNrVmFsdWUuaAkocmV2aXNpb24gMCkKKysrIFNvdXJjZS9K
YXZhU2NyaXB0Q29yZS9iMy9CM0NoZWNrVmFsdWUuaAkod29ya2luZyBjb3B5KQpAQCAtMCwwICsx
LDgwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE1IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyBy
ZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmlu
YXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRl
ZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAq
IDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUg
Y29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUg
Zm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZv
cm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlz
IGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQor
ICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGgg
dGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQ
UExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5U
SUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJB
TlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAq
IFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9S
CisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5D
SURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VT
IChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNU
SVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklU
UzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRI
RU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklM
SVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklT
SU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4g
SUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisKKyNp
Zm5kZWYgQjNDaGVja1ZhbHVlX2gKKyNkZWZpbmUgQjNDaGVja1ZhbHVlX2gKKworI2luY2x1ZGUg
IkIzVmFsdWUuaCIKKyNpbmNsdWRlICJCM1N0YWNrbWFwLmgiCisKK25hbWVzcGFjZSBKU0MgeyBu
YW1lc3BhY2UgQjMgeworCitjbGFzcyBDaGVja1ZhbHVlIDogcHVibGljIENoZWNrIHsKK3B1Ymxp
YzoKKyAgICBzdGF0aWMgYm9vbCBhY2NlcHRzKE9wY29kZSBvcGNvZGUpCisgICAgeworICAgICAg
ICBzd2l0Y2ggKG9wY29kZSkgeworICAgICAgICBjYXNlIENoZWNrQWRkOgorICAgICAgICBjYXNl
IENoZWNrU3ViOgorICAgICAgICBjYXNlIENoZWNrTXVsOgorICAgICAgICBjYXNlIENoZWNrOgor
ICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBy
ZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICB+Q2hlY2tWYWx1ZSgpOworCisg
ICAgU3RhY2ttYXAgc3RhY2ttYXA7CisKK3Byb3RlY3RlZDoKKyAgICB2b2lkIGR1bXBNZXRhKFBy
aW50U3RyZWFtJikgY29uc3Qgb3ZlcnJpZGU7CisKK3ByaXZhdGU6CisgICAgZnJpZW5kIGNsYXNz
IFByb2NlZHVyZTsKKworICAgIC8vIFVzZSB0aGlzIGZvcm0gZm9yIENoZWNrQWRkLCBDaGVja1N1
YiwgYW5kIENoZWNrTXVsLgorICAgIENoZWNrVmFsdWUodW5zaWduZWQgaW5kZXgsIE9wY29kZSBv
cGNvZGUsIE9yaWdpbiBvcmlnaW4sIFZhbHVlKiBsZWZ0LCBWYWx1ZSogcmlnaHQpCisgICAgICAg
IDogVmFsdWUoaW5kZXgsIG9wY29kZSwgbGVmdC0+dHlwZSgpLCBvcmlnaW4sIGxlZnQsIHJpZ2h0
KQorICAgIHsKKyAgICAgICAgQVNTRVJUKGlzSW50KHR5cGUoKSkpOworICAgICAgICBBU1NFUlQo
bGVmdC0+dHlwZSgpID09IHJpZ2h0LT50eXBlKCkpOworICAgICAgICBBU1NFUlQob3Bjb2RlID09
IENoZWNrQWRkIHx8IG9wY29kZSA9PSBDaGVja1N1YiB8fCBvcGNvZGUgPT0gQ2hlY2tNdWwpOwor
ICAgIH0KKworICAgIC8vIFVzZSB0aGlzIGZvcm0gZm9yIENoZWNrLgorICAgIENoZWNrVmFsdWUo
dW5zaWduZWQgaW5kZXgsIE9wY29kZSBvcGNvZGUsIE9yaWdpbiBvcmlnaW4sIFZhbHVlKiBwcmVk
aWNhdGUpCisgICAgICAgIDogVmFsdWUoaW5kZXgsIG9wY29kZSwgVm9pZCwgb3JpZ2luLCBwcmVk
aWNhdGUpCisgICAgeworICAgICAgICBBU1NFUlQob3BjZGUgPT0gQ2hlY2spOworICAgIH0KK307
CisKK30gfSAvLyBuYW1lc3BhY2UgSlNDOjpCMworCisjZW5kaWYgLy8gQjNDaGVja1ZhbHVlX2gK
KworCkluZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNDb21wYXJpc29uTWF0Y2hlci5w
YXR0ZXJucwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNDb21wYXJp
c29uTWF0Y2hlci5wYXR0ZXJucwkocmV2aXNpb24gMCkKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29y
ZS9iMy9CM0NvbXBhcmlzb25NYXRjaGVyLnBhdHRlcm5zCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAg
KzEsMzggQEAKKyMgQ29weXJpZ2h0IChDKSAyMDE1IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNl
cnZlZC4KKyMKKyMgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBm
b3Jtcywgd2l0aCBvciB3aXRob3V0CisjIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92
aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworIyBhcmUgbWV0OgorIyAxLiBSZWRp
c3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdo
dAorIyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5n
IGRpc2NsYWltZXIuCisjIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJl
cHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisjICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNv
bmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyMgICAgZG9jdW1l
bnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1
dGlvbi4KKyMKKyMgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIEFORCBJ
VFMgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJworIyBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBX
QVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyMgVEhFIElNUExJRUQg
V0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxB
UgorIyBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMu
IE9SIElUUyBDT05UUklCVVRPUlMKKyMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVD
VCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgorIyBDT05TRVFVRU5USUFMIERB
TUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgorIyBT
VUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklU
UzsgT1IgQlVTSU5FU1MKKyMgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5Z
IFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KKyMgQ09OVFJBQ1QsIFNUUklDVCBMSUFC
SUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKyMgQVJJ
U0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYg
QURWSVNFRCBPRgorIyBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKK21hdGNoZXIg
Q29tcGFyaXNvbk1hdGNoZXIKKworVGVzdExvYWROb3RaZXJvMSA9IEFuZChMb2FkKGFkZHJlc3Mp
LCByaWdodCkKK1Rlc3RMb2FkTm90WmVybzIgPSBBbmQobGVmdCwgTG9hZChhZGRyZXNzKSkKK1Rl
c3ROb3RaZXJvID0gQW5kKGxlZnQsIHJpZ2h0KQorCitUZXN0TG9hZFplcm8xID0gRXF1YWwoQW5k
KExvYWQoYWRkcmVzcyksIHJpZ2h0KSwgJDApCitUZXN0TG9hZFplcm8yID0gRXF1YWwoQW5kKGxl
ZnQsIExvYWQoYWRkcmVzcykpLCAkMCkKK1Rlc3RaZXJvID0gRXF1YWwoQW5kKGxlZnQsIHJpZ2h0
KSwgJDApCisKK0xvYWRFcXVhbDEgPSBFcXVhbChMb2FkKGFkZHJlc3MpLCByaWdodCkKK0xvYWRF
cXVhbDIgPSBFcXVhbChsZWZ0LCBMb2FkKGFkZHJlc3MpKQorTm90ID0gRXF1YWwodmFsdWUsICQw
KQorRXF1YWwgPSBFcXVhbChsZWZ0LCByaWdodCkKKwpJbmRleDogU291cmNlL0phdmFTY3JpcHRD
b3JlL2IzL0IzQ29uc3QzMlZhbHVlLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlw
dENvcmUvYjMvQjNDb25zdDMyVmFsdWUuY3BwCShyZXZpc2lvbiAwKQorKysgU291cmNlL0phdmFT
Y3JpcHRDb3JlL2IzL0IzQ29uc3QzMlZhbHVlLmNwcAkod29ya2luZyBjb3B5KQpAQCAtMCwwICsx
LDQxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE1IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyBy
ZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmlu
YXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRl
ZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAq
IDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUg
Y29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUg
Zm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZv
cm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlz
IGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQor
ICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGgg
dGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQ
UExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5U
SUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJB
TlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAq
IFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9S
CisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5D
SURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VT
IChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNU
SVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklU
UzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRI
RU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklM
SVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklT
SU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4g
SUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisKKyNp
bmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJCM0NvbnN0MzJWYWx1ZS5oIgorCituYW1lc3Bh
Y2UgSlNDIHsgbmFtZXNwYWNlIEIzIHsKKworQ29uc3QzMlZhbHVlOjp+Q29uc3QzMlZhbHVlKCkK
K3sKK30KKwordm9pZCBDb25zdDMyVmFsdWU6OmR1bXBNZXRhKFByaW50U3RyZWFtJiBvdXQpIGNv
bnN0Cit7CisgICAgb3V0LnByaW50KG1fdmFsdWUpOworfQorCit9IH0gLy8gbmFtZXNwYWNlIEpT
Qzo6QjMKKwpJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzQ29uc3QzMlZhbHVlLmgK
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzQ29uc3QzMlZhbHVlLmgJ
KHJldmlzaW9uIDApCisrKyBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNDb25zdDMyVmFsdWUu
aAkod29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDU5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAy
MDE1IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlv
biBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAq
IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcg
Y29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2Ug
Y29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMg
bGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBS
ZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNv
cHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZv
bGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3Ro
ZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElT
IFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAq
IEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRF
RCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBG
SVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBO
TyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZP
UiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFS
WSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBU
TywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1Mg
T0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBI
T1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVS
IElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5F
R0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UK
KyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkg
T0YgU1VDSCBEQU1BR0UuIAorICovCisKKyNpZm5kZWYgQjNDb25zdDMyVmFsdWVfaAorI2RlZmlu
ZSBCM0NvbnN0MzJWYWx1ZV9oCisKKyNpbmNsdWRlICJCM1ZhbHVlLmgiCisKK25hbWVzcGFjZSBK
U0MgeyBuYW1lc3BhY2UgQjMgeworCitjbGFzcyBDb25zdDMyVmFsdWUgOiBwdWJsaWMgVmFsdWUg
eworcHVibGljOgorICAgIHN0YXRpYyBib29sIGFjY2VwdHMoT3Bjb2RlIG9wY29kZSkgeyByZXR1
cm4gb3Bjb2RlID09IENvbnN0MzI7IH0KKyAgICAKKyAgICB+Q29uc3QzMlZhbHVlKCk7CisgICAg
CisgICAgaW50MzJfdCB2YWx1ZSgpIGNvbnN0IHsgcmV0dXJuIG1fdmFsdWU7IH0KKworcHJvdGVj
dGVkOgorICAgIHZvaWQgZHVtcE1ldGEoUHJpbnRTdHJlYW0mKSBjb25zdCBvdmVycmlkZTsKKwor
cHJpdmF0ZToKKyAgICBmcmllbmQgY2xhc3MgUHJvY2VkdXJlOworCisgICAgQ29uc3QzMlZhbHVl
KHVuc2lnbmVkIGluZGV4LCBPcmlnaW4gb3JpZ2luLCBpbnQzMl90IHZhbHVlKQorICAgICAgICA6
IFZhbHVlKGluZGV4LCBDb25zdDMyLCBJbnQzMiwgb3JpZ2luKQorICAgICAgICAsIG1fdmFsdWUo
dmFsdWUpCisgICAgeworICAgIH0KKyAgICAKKyAgICBpbnQzMl90IG1fdmFsdWU7Cit9OworCit9
IH0gLy8gbmFtZXNwYWNlIEpTQzo6QjMKKworI2VuZGlmIC8vIEIzQ29uc3QzMlZhbHVlX2gKKwpJ
bmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzQ29uc3Q2NFZhbHVlLmNwcAo9PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNDb25zdDY0VmFsdWUuY3BwCShyZXZp
c2lvbiAwKQorKysgU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzQ29uc3Q2NFZhbHVlLmNwcAko
d29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDQxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE1
IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBh
bmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1v
ZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29u
ZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29k
ZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlz
dCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRp
c3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHly
aWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxv
d2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIg
bWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNP
RlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVY
UFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBU
TywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRO
RVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBF
VkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBB
TlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwg
T1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywK
KyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0Yg
VVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dF
VkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElO
IENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJ
R0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAq
IE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0Yg
U1VDSCBEQU1BR0UuIAorICovCisKKyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJCM0Nv
bnN0NjRWYWx1ZS5oIgorCituYW1lc3BhY2UgSlNDIHsgbmFtZXNwYWNlIEIzIHsKKworQ29uc3Q2
NFZhbHVlOjp+Q29uc3Q2NFZhbHVlKCkKK3sKK30KKwordm9pZCBDb25zdDY0VmFsdWU6OmR1bXBN
ZXRhKFByaW50U3RyZWFtJiBvdXQpIGNvbnN0Cit7CisgICAgb3V0LnByaW50KG1fdmFsdWUpOwor
fQorCit9IH0gLy8gbmFtZXNwYWNlIEpTQzo6QjMKKwpJbmRleDogU291cmNlL0phdmFTY3JpcHRD
b3JlL2IzL0IzQ29uc3Q2NFZhbHVlLmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRD
b3JlL2IzL0IzQ29uc3Q2NFZhbHVlLmgJKHJldmlzaW9uIDApCisrKyBTb3VyY2UvSmF2YVNjcmlw
dENvcmUvYjMvQjNDb25zdDY0VmFsdWUuaAkod29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDU5IEBA
CisvKgorICogQ29weXJpZ2h0IChDKSAyMDE1IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZl
ZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZv
cm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92
aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJl
ZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJp
Z2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93
aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVz
dCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qg
b2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAg
ZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRp
c3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElO
Qy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJ
TkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMg
T0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBP
U0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SCisgKiBD
T05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRB
TCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNM
VURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUg
R09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1Ig
QlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQor
ICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBP
UiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElO
IEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURW
SVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisKKyNpZm5kZWYg
QjNDb25zdDY0VmFsdWVfaAorI2RlZmluZSBCM0NvbnN0NjRWYWx1ZV9oCisKKyNpbmNsdWRlICJC
M1ZhbHVlLmgiCisKK25hbWVzcGFjZSBKU0MgeyBuYW1lc3BhY2UgQjMgeworCitjbGFzcyBDb25z
dDY0VmFsdWUgOiBwdWJsaWMgVmFsdWUgeworcHVibGljOgorICAgIHN0YXRpYyBib29sIGFjY2Vw
dHMoT3Bjb2RlIG9wY29kZSkgeyByZXR1cm4gb3Bjb2RlID09IENvbnN0NjQ7IH0KKyAgICAKKyAg
ICB+Q29uc3Q2NFZhbHVlKCk7CisgICAgCisgICAgaW50NjRfdCB2YWx1ZSgpIGNvbnN0IHsgcmV0
dXJuIG1fdmFsdWU7IH0KKworcHJvdGVjdGVkOgorICAgIHZvaWQgZHVtcE1ldGEoUHJpbnRTdHJl
YW0mKSBjb25zdCBvdmVycmlkZTsKKworcHJpdmF0ZToKKyAgICBmcmllbmQgY2xhc3MgUHJvY2Vk
dXJlOworCisgICAgQ29uc3Q2NFZhbHVlKHVuc2lnbmVkIGluZGV4LCBPcmlnaW4gb3JpZ2luLCBp
bnQ2NF90IHZhbHVlKQorICAgICAgICA6IFZhbHVlKGluZGV4LCBDb25zdDY0LCBJbnQ2NCwgb3Jp
Z2luKQorICAgICAgICAsIG1fdmFsdWUodmFsdWUpCisgICAgeworICAgIH0KKyAgICAKKyAgICBp
bnQ2NF90IG1fdmFsdWU7Cit9OworCit9IH0gLy8gbmFtZXNwYWNlIEpTQzo6QjMKKworI2VuZGlm
IC8vIEIzQ29uc3Q2NFZhbHVlX2gKKwpJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0Iz
Q29uc3REb3VibGVWYWx1ZS5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRDb3Jl
L2IzL0IzQ29uc3REb3VibGVWYWx1ZS5jcHAJKHJldmlzaW9uIDApCisrKyBTb3VyY2UvSmF2YVNj
cmlwdENvcmUvYjMvQjNDb25zdERvdWJsZVZhbHVlLmNwcAkod29ya2luZyBjb3B5KQpAQCAtMCww
ICsxLDQxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE1IEFwcGxlIEluYy4gQWxsIHJpZ2h0
cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQg
YmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1p
dHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoK
KyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJv
dmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0
aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5
IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0
aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRo
ZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdp
dGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZ
IEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJS
QU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdB
UlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIK
KyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMu
IE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwg
SU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1B
R0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNV
QlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJP
RklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5Z
IFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElB
QklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBB
UklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVW
RU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisK
KyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJCM0NvbnN0RG91YmxlVmFsdWUuaCIKKwor
bmFtZXNwYWNlIEpTQyB7IG5hbWVzcGFjZSBCMyB7CisKK0NvbnN0RG91YmxlVmFsdWU6On5Db25z
dERvdWJsZVZhbHVlKCkKK3sKK30KKwordm9pZCBDb25zdERvdWJsZVZhbHVlOjpkdW1wTWV0YShQ
cmludFN0cmVhbSYgb3V0KSBjb25zdAoreworICAgIG91dC5wcmludGYoIiVsZSIsIG1fdmFsdWUp
OworfQorCit9IH0gLy8gbmFtZXNwYWNlIEpTQzo6QjMKKwpJbmRleDogU291cmNlL0phdmFTY3Jp
cHRDb3JlL2IzL0IzQ29uc3REb3VibGVWYWx1ZS5oCj09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZh
U2NyaXB0Q29yZS9iMy9CM0NvbnN0RG91YmxlVmFsdWUuaAkocmV2aXNpb24gMCkKKysrIFNvdXJj
ZS9KYXZhU2NyaXB0Q29yZS9iMy9CM0NvbnN0RG91YmxlVmFsdWUuaAkod29ya2luZyBjb3B5KQpA
QCAtMCwwICsxLDU5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE1IEFwcGxlIEluYy4gQWxs
IHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJj
ZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJl
IHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJl
IG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0
aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25z
IGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4g
YmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90
aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVy
IGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3Zp
ZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJ
REVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElF
RCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBM
SUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJ
Q1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBM
RSBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJ
UkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElB
TCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5U
IE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgor
ICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQg
T04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJ
Q1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJX
SVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdB
UkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAor
ICovCisKKyNpZm5kZWYgQjNDb25zdERvdWJsZVZhbHVlX2gKKyNkZWZpbmUgQjNDb25zdERvdWJs
ZVZhbHVlX2gKKworI2luY2x1ZGUgIkIzVmFsdWUuaCIKKworbmFtZXNwYWNlIEpTQyB7IG5hbWVz
cGFjZSBCMyB7CisKK2NsYXNzIENvbnN0RG91YmxlVmFsdWUgOiBwdWJsaWMgVmFsdWUgeworcHVi
bGljOgorICAgIHN0YXRpYyBib29sIGFjY2VwdHMoT3Bjb2RlIG9wY29kZSkgeyByZXR1cm4gb3Bj
b2RlID09IENvbnN0RG91YmxlOyB9CisgICAgCisgICAgfkNvbnN0RG91YmxlVmFsdWUoKTsKKyAg
ICAKKyAgICBkb3VibGUgdmFsdWUoKSBjb25zdCB7IHJldHVybiBtX3ZhbHVlOyB9CisKK3Byb3Rl
Y3RlZDoKKyAgICB2b2lkIGR1bXBNZXRhKFByaW50U3RyZWFtJikgY29uc3Qgb3ZlcnJpZGU7CisK
K3ByaXZhdGU6CisgICAgZnJpZW5kIGNsYXNzIFByb2NlZHVyZTsKKworICAgIENvbnN0RG91Ymxl
VmFsdWUodW5zaWduZWQgaW5kZXgsIE9yaWdpbiBvcmlnaW4sIGRvdWJsZSB2YWx1ZSkKKyAgICAg
ICAgOiBWYWx1ZShpbmRleCwgQ29uc3REb3VibGUsIERvdWJsZSwgb3JpZ2luKQorICAgICAgICAs
IG1fdmFsdWUodmFsdWUpCisgICAgeworICAgIH0KKyAgICAKKyAgICBkb3VibGUgbV92YWx1ZTsK
K307CisKK30gfSAvLyBuYW1lc3BhY2UgSlNDOjpCMworCisjZW5kaWYgLy8gQjNDb25zdERvdWJs
ZVZhbHVlX2gKKwpJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzQ29udHJvbFZhbHVl
LmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNDb250cm9sVmFs
dWUuY3BwCShyZXZpc2lvbiAwKQorKysgU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzQ29udHJv
bFZhbHVlLmNwcAkod29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDQzIEBACisvKgorICogQ29weXJp
Z2h0IChDKSAyMDE1IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRp
c3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdp
dGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBm
b2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBv
ZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3Rp
Y2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIu
CisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhl
IGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBh
bmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBh
bmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAq
CisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFO
RCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBO
T1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklM
SVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlN
RUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUg
TElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAq
IEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1Qg
TElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklD
RVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJS
VVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZ
LCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5D
TFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9G
IFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9T
U0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisKKyNpbmNsdWRlICJjb25maWcuaCIKKyNp
bmNsdWRlICJCM0NvbnRyb2xWYWx1ZS5oIgorCituYW1lc3BhY2UgSlNDIHsgbmFtZXNwYWNlIEIz
IHsKKworQ29udHJvbFZhbHVlOjp+Q29udHJvbFZhbHVlKCkKK3sKK30KKwordm9pZCBDb250cm9s
VmFsdWU6OmR1bXBNZXRhKFByaW50U3RyZWFtJiBvdXQpIGNvbnN0Cit7CisgICAgQ29tbWFQcmlu
dGVyIGNvbW1hOworICAgIGZvciAoQmFzaWNCbG9jayogYmxvY2sgOiBtX3N1Y2Nlc3NvcnMpCisg
ICAgICAgIG91dC5wcmludChjb21tYSwgcG9pbnRlckR1bXAoYmxvY2spKTsKK30KKworfSB9IC8v
IG5hbWVzcGFjZSBKU0M6OkIzCisKSW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM0Nv
bnRyb2xWYWx1ZS5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM0Nv
bnRyb2xWYWx1ZS5oCShyZXZpc2lvbiAwKQorKysgU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0Iz
Q29udHJvbFZhbHVlLmgJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSwxMTcgQEAKKy8qCisgKiBD
b3B5cmlnaHQgKEMpIDIwMTUgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAq
IFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGgg
b3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQg
dGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRp
b25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAg
IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xh
aW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVj
ZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRp
b25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0
aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9u
LgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFTIElT
JycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywg
QlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFO
VEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElT
Q0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IKKyAqIENPTlRSSUJVVE9S
UyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFM
LAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVU
IE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBT
RVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJ
TlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFC
SUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAq
IChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBP
VVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRI
RSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKworI2lmbmRlZiBCM0NvbnRyb2xW
YWx1ZV9oCisjZGVmaW5lIEIzQ29udHJvbFZhbHVlX2gKKworI2luY2x1ZGUgIkIzVmFsdWUuaCIK
KworbmFtZXNwYWNlIEpTQyB7IG5hbWVzcGFjZSBCMyB7CisKK2NsYXNzIEJhc2ljQmxvY2s7CisK
K2NsYXNzIENvbnRyb2xWYWx1ZSA6IHB1YmxpYyBWYWx1ZSB7CitwdWJsaWM6CisgICAgc3RhdGlj
IGJvb2wgYWNjZXB0cyhPcGNvZGUgb3Bjb2RlKQorICAgIHsKKyAgICAgICAgc3dpdGNoIChvcGNv
ZGUpIHsKKyAgICAgICAgY2FzZSBKdW1wOgorICAgICAgICBjYXNlIEJyYW5jaDoKKyAgICAgICAg
Y2FzZSBSZXR1cm46CisgICAgICAgIGNhc2UgT29wczoKKyAgICAgICAgICAgIHJldHVybiB0cnVl
OworICAgICAgICBjYXNlIFN3aXRjaDogCisgICAgICAgICAgICAvLyBUaGlzIGlzIGhlcmUgYmVj
YXVzZSBTd2l0Y2hWYWx1ZSBpcyBhIHN1YmNsYXNzIG9mIENvbnRyb2xWYWx1ZSwgc28gd2Ugd2Fu
dAorICAgICAgICAgICAgLy8gc3d0aWNoVmFsdWUtPmFzPENvbnRyb2xWYWx1ZT4oKSB0byByZXR1
cm4gbm9uLW51bGwuCisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgZGVmYXVsdDoK
KyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHR5cGVk
ZWYgVmVjdG9yPEJhc2ljQmxvY2sqLCAyPiBTdWNjZXNzb3JMaXN0OworCisgICAgfkNvbnRyb2xW
YWx1ZSgpOworCisgICAgdW5zaWduZWQgbnVtU3VjY2Vzc29ycygpIGNvbnN0IHsgcmV0dXJuIG1f
c3VjY2Vzc29ycy5zaXplKCk7IH0KKyAgICBCYXNpY0Jsb2NrKiBzdWNjZXNzb3IodW5zaWduZWQg
aW5kZXgpIGNvbnN0IHsgcmV0dXJuIG1fc3VjY2Vzc29yc1tpXTsgfQorICAgIEJhc2ljQmxvY2sq
JiBzdWNjZXNzb3IodW5zaWduZWQgaW5kZXgpIHsgcmV0dXJuIG1fc3VjY2Vzc29yc1tpXTsgfQor
CisgICAgY29uc3QgU3VjY2Vzc29yTGlzdCYgc3VjY2Vzc29ycygpIGNvbnN0IHsgcmV0dXJuIG1f
c3VjY2Vzc29yczsgfQorCitwcm90ZWN0ZWQ6CisgICAgdm9pZCBkdW1wTWV0YShQcmludFN0cmVh
bSYpIGNvbnN0IG92ZXJyaWRlOworCisgICAgLy8gVXNlIHRoaXMgZm9yIHN1YmNsYXNzZXMuCisg
ICAgdGVtcGxhdGU8dHlwZW5hbWUuLi4gQXJndW1lbnRzPgorICAgIENvbnRyb2xWYWx1ZSh1bnNp
Z25lZCBpbmRleCwgT3Bjb2RlIG9wY29kZSwgVHlwZSB0eXBlLCBPcmlnaW4gb3JpZ2luLCBBcmd1
bWVudHMuLi4gYXJndW1lbnRzKQorICAgICAgICA6IFZhbHVlKGluZGV4LCBvcGNvZGUsIHR5cGUs
IG9yaWdpbiwgYXJndW1lbnRzLi4uKQorICAgIHsKKyAgICB9CisKKyAgICAvLyBTdWJjbGFzc2Vz
IHdpbGwgcG9wdWxhdGUgdGhpcy4KKyAgICBTdWNjZXNzb3JMaXN0IG1fc3VjY2Vzc29yczsKKwor
cHJpdmF0ZToKKyAgICBmcmllbmQgY2xhc3MgUHJvY2VkdXJlOworCisgICAgLy8gVXNlIHRoaXMg
Zm9yIE9vcHMuCisgICAgQ29udHJvbFZhbHVlKHVuc2lnbmVkIGluZGV4LCBPcGNvZGUgb3Bjb2Rl
LCBPcmlnaW4gb3JpZ2luKQorICAgICAgICA6IFZhbHVlKGluZGV4LCBvcGNvZGUsIFZvaWQsIG9y
aWdpbikKKyAgICB7CisgICAgICAgIEFTU0VSVChvcGNvZGUgPT0gT29wcyk7CisgICAgfQorCisg
ICAgLy8gVXNlIHRoaXMgZm9yIFJldHVybi4KKyAgICBDb250cm9sVmFsdWUodW5zaWduZWQgaW5k
ZXgsIE9wY29kZSBvcGNvZGUsIE9yaWdpbiBvcmlnaW4sIFZhbHVlKiByZXN1bHQpCisgICAgICAg
IDogVmFsdWUoaW5kZXgsIG9wY29kZSwgVm9pZCwgb3JpZ2luLCByZXN1bHQpCisgICAgeworICAg
ICAgICBBU1NFUlQob3Bjb2RlID09IFJldHVybik7CisgICAgfQorCisgICAgLy8gVXNlIHRoaXMg
Zm9yIEp1bXAuCisgICAgQ29udHJvbFZhbHVlKHVuc2lnbmVkIGluZGV4LCBPcGNvZGUgb3Bjb2Rl
LCBPcmlnaW4gb3JpZ2luLCBCYXNpY0Jsb2NrKiB0YXJnZXQpCisgICAgICAgIDogVmFsdWUoaW5k
ZXgsIG9wY29kZSwgVm9pZCwgb3JpZ2luKQorICAgIHsKKyAgICAgICAgQVNTRVJUKG9wY29kZSA9
PSBKdW1wKTsKKyAgICAgICAgbV9zdWNjZXNzb3JzLmFwcGVuZCh0YXJnZXQpOworICAgIH0KKwor
ICAgIC8vIFVzZSB0aGlzIGZvciBCcmFuY2guCisgICAgQ29udHJvbFZhbHVlKAorICAgICAgICB1
bnNpZ25lZCBpbmRleCwgT3Bjb2RlIG9wY29kZSwgT3JpZ2luIG9yaWdpbiwgVmFsdWUqIHByZWRp
Y2F0ZSwKKyAgICAgICAgQmFzaWNCbG9jayogeWVzLCBCYXNpY0Jsb2NrKiBubykKKyAgICAgICAg
OiBWYWx1ZShpbmRleCwgb3Bjb2RlLCBWb2lkLCBvcmlnaW4sIHByZWRpY2F0ZSkKKyAgICB7Cisg
ICAgICAgIEFTU0VSVChvcGNvZGUgPT0gQnJhbmNoKTsKKyAgICAgICAgbV9zdWNjZXNzb3JzLmFw
cGVuZCh5ZXMpOworICAgICAgICBtX3N1Y2Nlc3NvcnMuYXBwZW5kKG5vKTsKKyAgICB9Cit9Owor
Cit9IH0gLy8gbmFtZXNwYWNlIEpTQzo6QjMKKworI2VuZGlmIC8vIEIzQ29udHJvbFZhbHVlX2gK
KwpJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzSW5kZXhTZXQuaAo9PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNJbmRleFNldC5oCShyZXZpc2lvbiAwKQor
KysgU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzSW5kZXhTZXQuaAkod29ya2luZyBjb3B5KQpA
QCAtMCwwICsxLDE0MSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNSBBcHBsZSBJbmMuIEFs
bCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3Vy
Y2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFy
ZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFy
ZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4g
dGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9u
cyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGlu
IGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5v
dGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1l
ciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92
aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9W
SURFRCBCWSBBUFBMRSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJ
RUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1Q
TElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJU
SUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQ
TEUgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5E
SVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJ
QUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVO
VCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IK
KyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5E
IE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RS
SUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVS
V0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRX
QVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLiAK
KyAqLworCisjaWZuZGVmIEIzSW5kZXhTZXRfaAorI2RlZmluZSBCM0luZGV4U2V0X2gKKworI2lu
Y2x1ZGUgPHd0Zi9CaXRWZWN0b3IuaD4KKyNpbmNsdWRlIDx3dGYvQ29tbWFQcmludGVyLmg+CisK
K25hbWVzcGFjZSBKU0MgeyBuYW1lc3BhY2UgQjMgeworCisvLyBUaGlzIGlzIGEgc2V0IGZvciB0
aGluZ3MgdGhhdCBoYXZlIGFuIGluZGV4KCkuIEl0J3Mgc3VwZXIgZWZmaWNpZW50IGZvciBCYXNp
Y0Jsb2Nrcy4gSXQncyBvbmx5CisvLyBlZmZpY2llbnQgZm9yIFZhbHVlcyBpZiB5b3UgZG9uJ3Qg
Y3JlYXRlIHRvbyBtYW55IG9mIHRoZXNlIHNldHMsIHNpbmNlIFZhbHVlcyBjYW4gaGF2ZSB2ZXJ5
IHNwYXJzZQorLy8gaW5kaWNlcyBhbmQgdGhlcmUgYXJlIGEgbG90IG9mIFZhbHVlcy4KKworLy8g
SWYgeW91IHdhbnQgYSBzZXQgb2YgQmFzaWNCbG9ja3MsIHlvdSBkbyBJbmRleFNldDxCYXNpY0Js
b2NrPi4gU28sIFQgPSBCYXNpY0Jsb2NrLgordGVtcGxhdGU8dHlwZW5hbWUgVD4KK2NsYXNzIElu
ZGV4U2V0IHsKK3B1YmxpYzoKKyAgICBJbmRleFNldCgpCisgICAgeworICAgIH0KKworICAgIGJv
b2wgYWRkKFQqIHZhbHVlKQorICAgIHsKKyAgICAgICAgcmV0dXJuICFtX3NldC5zZXQodmFsdWUt
PmluZGV4KCkpOworICAgIH0KKworICAgIGJvb2wgY29udGFpbnMoVCogdmFsdWUpIGNvbnN0Cisg
ICAgeworICAgICAgICBpZiAoIXZhbHVlKQorICAgICAgICAgICAgcmV0dXJuIG51bGxwdHI7Cisg
ICAgICAgIHJldHVybiBtX3NldC5nZXQodmFsdWUtPmluZGV4KCkpOworICAgIH0KKworICAgIHRl
bXBsYXRlPHR5cGVuYW1lIENvbGxlY3Rpb25UeXBlPgorICAgIGNsYXNzIEl0ZXJhYmxlIHsKKyAg
ICBwdWJsaWM6CisgICAgICAgIEl0ZXJhYmxlKGNvbnN0IENvbGxlY3Rpb25UeXBlJiBjb2xsZWN0
aW9uLCBjb25zdCBJbmRleFNldCYgc2V0KQorICAgICAgICAgICAgOiBtX2NvbGxlY3Rpb24oY29s
bGVjdGlvbikKKyAgICAgICAgICAgICwgbV9zZXQoc2V0KQorICAgICAgICB7CisgICAgICAgIH0K
KworICAgICAgICBjbGFzcyBpdGVyYXRvciB7CisgICAgICAgIHB1YmxpYzoKKyAgICAgICAgICAg
IGl0ZXJhdG9yKCkKKyAgICAgICAgICAgICAgICA6IG1fY29sbGVjdGlvbihudWxscHRyKQorICAg
ICAgICAgICAgeworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpdGVyYXRvcihjb25zdCBD
b2xsZWN0aW9uVHlwZSYgY29sbGVjdGlvbiwgQml0VmVjdG9yOjpTZXRCaXRzSXRlcmFibGU6Oml0
ZXJhdG9yIGl0ZXIpCisgICAgICAgICAgICAgICAgOiBtX2NvbGxlY3Rpb24oJmNvbGxlY3Rpb24p
CisgICAgICAgICAgICAgICAgLCBtX2l0ZXIoaXRlcikKKyAgICAgICAgICAgIHsKKyAgICAgICAg
ICAgIH0KKworICAgICAgICAgICAgVCogb3BlcmF0b3IqKCkKKyAgICAgICAgICAgIHsKKyAgICAg
ICAgICAgICAgICByZXR1cm4gbV9jb2xsZWN0aW9uLT5hdCgqbV9pdGVyKTsKKyAgICAgICAgICAg
IH0KKworICAgICAgICAgICAgaXRlcmF0b3ImIG9wZXJhdG9yKysoKQorICAgICAgICAgICAgewor
ICAgICAgICAgICAgICAgIG1faXRlcisrOworICAgICAgICAgICAgICAgIHJldHVybiAqdGhpczsK
KyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgYm9vbCBvcGVyYXRvcj09KGNvbnN0IGl0ZXJh
dG9yJiBvdGhlcikgY29uc3QKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4g
bV9pdGVyID09IG90aGVyLm1faXRlcjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgYm9v
bCBvcGVyYXRvciE9KGNvbnN0IGl0ZXJhdG9yJiBvdGhlcikgY29uc3QKKyAgICAgICAgICAgIHsK
KyAgICAgICAgICAgICAgICByZXR1cm4gISgqdGhpcyA9PSBvdGhlcik7CisgICAgICAgICAgICB9
CisKKyAgICAgICAgcHJpdmF0ZToKKyAgICAgICAgICAgIGNvbnN0IENvbGxlY3Rpb25UeXBlKiBt
X2NvbGxlY3Rpb247CisgICAgICAgICAgICBCaXRWZWN0b3I6OlNldEJpdHNJdGVyYWJsZTo6aXRl
cmF0b3IgbV9pdGVyOworICAgICAgICB9OworCisgICAgICAgIGl0ZXJhdG9yIGJlZ2luKCkgY29u
c3QgeyByZXR1cm4gaXRlcmF0b3IobV9jb2xsZWN0aW9uLCBtX3NldC5iZWdpbigpKTsgfQorICAg
ICAgICBpdGVyYXRvciBlbmQoKSBjb25zdCB7IHJldHVybiBpdGVyYXRvcihtX2NvbGxlY3Rpb24s
IG1fc2V0LmVuZCgpKTsgfQorCisgICAgcHJpdmF0ZToKKyAgICAgICAgY29uc3QgQ29sbGVjdGlv
blR5cGUmIG1fY29sbGVjdGlvbjsKKyAgICAgICAgY29uc3QgSW5kZXhTZXQmIG1fc2V0OworICAg
IH07CisKKyAgICAvLyBGb3IgYmFzaWMgYmxvY2tzLCB5b3UgZG86CisgICAgLy8gaW5kZXhTZXQu
dmFsdWVzKHByb2NlZHVyZSk7CisgICAgLy8KKyAgICAvLyBGb3IgdmFsdWVzLCB5b3UgZG86Cisg
ICAgLy8gaW5kZXhTZXQudmFsdWVzKHByb2NlZHVyZS52YWx1ZXMoKSk7CisgICAgdGVtcGxhdGU8
dHlwZW5hbWUgQ29sbGVjdGlvblR5cGU+CisgICAgSXRlcmFibGU8Q29sbGVjdGlvblR5cGU+IHZh
bHVlcyhjb25zdCBDb2xsZWN0aW9uVHlwZSYgY29sbGVjdGlvbikgY29uc3QKKyAgICB7CisgICAg
ICAgIHJldHVybiBJdGVyYWJsZTxDb2xsZWN0aW9uVHlwZT4oY29sbGVjdGlvbik7CisgICAgfQor
CisgICAgY29uc3QgQml0VmVjdG9yJiBpbmRpY2VzKCkgY29uc3QgeyByZXR1cm4gbV9zZXQ7IH0K
KworICAgIHZvaWQgZHVtcChQcmludFN0cmVhbSYgb3V0KSBjb25zdAorICAgIHsKKyAgICAgICAg
Q29tbWFQcmludGVyIGNvbW1hOworICAgICAgICBmb3IgKHNpemVfdCBpbmRleCA6IGluZGljZXMo
KS5zZXRCaXRzKCkpCisgICAgICAgICAgICBvdXQucHJpbnQoY29tbWEsIFQ6OmR1bXBQcmVmaXgs
IGluZGV4KTsKKyAgICB9CisKK3ByaXZhdGU6CisgICAgQml0VmVjdG9yIG1fc2V0OworfTsKKwor
fSB9IC8vIG5hbWVzcGFjZSBKU0M6OkIzCisKKyNlbmRpZiAvLyBCM0luZGV4U2V0X2gKKwpJbmRl
eDogU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzTG93ZXJpbmdNYXRjaGVyLnBhdHRlcm5zCj09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM0xvd2VyaW5nTWF0Y2hlci5w
YXR0ZXJucwkocmV2aXNpb24gMCkKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM0xvd2Vy
aW5nTWF0Y2hlci5wYXR0ZXJucwkod29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDQyIEBACisjIENv
cHlyaWdodCAoQykgMjAxNSBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisjCisjIFJl
ZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Ig
d2l0aG91dAorIyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUg
Zm9sbG93aW5nIGNvbmRpdGlvbnMKKyMgYXJlIG1ldDoKKyMgMS4gUmVkaXN0cmlidXRpb25zIG9m
IHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyMgICAgbm90aWNl
LCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgor
IyAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFi
b3ZlIGNvcHlyaWdodAorIyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0
aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisjICAgIGRvY3VtZW50YXRpb24gYW5kL29y
IG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisjCisjIFRI
SVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBBTkQgSVRTIENPTlRSSUJVVE9S
UyBgYEFTIElTJycKKyMgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5D
TFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisjIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0Yg
TUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyMgUFVSUE9TRSBB
UkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUiBJVFMgQ09OVFJJ
QlVUT1JTCisjIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUws
IFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKKyMgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJ
TkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKKyMgU1VCU1RJVFVURSBHT09E
UyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNT
CisjIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElB
QklMSVRZLCBXSEVUSEVSIElOCisjIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JU
IChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisjIEFSSVNJTkcgSU4gQU5ZIFdB
WSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YKKyMg
VEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCittYXRjaGVyIExvd2VyaW5nTWF0Y2hl
cgorCisjIFRoZXNlIHJ1bGVzIGFyZSBjb25zaWRlcmVkIGluIGEgY2FzY2FkZSwgc3RhcnRpbmcg
YXQgdGhlIHRvcC4gSXQncyBpbXBsZW5lbnRlZCB1c2luZyBzd2l0Y2gKKyMgc3RhdGVtZW50cyB3
aGVyZXZlciBwb3NzaWJsZS4KKworIyBOb3RlOiBhZGRpbmcgbW9yZSBydWxlcyB0byB0aGlzIG1h
dGNoZXIgaXMgYW4gZXhjZWxsZW50IHdheSBvZiBpbXByb3ZpbmcgcGVyZm9ybWFuY2UhCisKK0xv
YWQgPSBMb2FkKGFkZHJlc3MpCisKK0FkZExvYWQgPSBBZGQoTG9hZChhZGRyZXNzKSwgdmFsdWUp
CitBZGQgPSBBZGQobGVmdCwgcmlnaHQpCisKK1N0b3JlQWRkTG9hZDEgPSBTdG9yZShBZGQoTG9h
ZChhZGRyZXNzKSwgdmFsdWUpLCBhZGRyZXNzKQorU3RvcmVBZGRMb2FkMiA9IFN0b3JlKEFkZCh2
YWx1ZSwgTG9hZChhZGRyZXNzKSksIGFkZHJlc3MpCitTdG9yZUFuZExvYWQgPSBTdG9yZShBbmQo
TG9hZChhZGRyZXNzKSwgdmFsdWUpLCBhZGRyZXNzKQorU3RvcmUgPSBTdG9yZSh2YWx1ZSwgYWRk
cmVzcykKKworUmV0dXJuID0gUmV0dXJuKHZhbHVlKQorCkluZGV4OiBTb3VyY2UvSmF2YVNjcmlw
dENvcmUvYjMvQjNNZW1vcnlWYWx1ZS5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL0phdmFTY3Jp
cHRDb3JlL2IzL0IzTWVtb3J5VmFsdWUuY3BwCShyZXZpc2lvbiAwKQorKysgU291cmNlL0phdmFT
Y3JpcHRDb3JlL2IzL0IzTWVtb3J5VmFsdWUuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEs
NDIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTUgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJl
c2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5h
cnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVk
IHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICog
MS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBj
b3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBm
b2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9y
bSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMg
bGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisg
KiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0
aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQ
TEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJ
RVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFO
VElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICog
UFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IK
KyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJ
REVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMg
KElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJ
VFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRT
OyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhF
T1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJ
VFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJ
TkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJ
RiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKworI2lu
Y2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgIkIzTWVtb3J5VmFsdWUuaCIKKworbmFtZXNwYWNl
IEpTQyB7IG5hbWVzcGFjZSBCMyB7CisKK01lbW9yeVZhbHVlOjp+TWVtb3J5VmFsdWUoKQorewor
fQorCit2b2lkIE1lbW9yeVZhbHVlOjpkdW1wTWV0YShQcmludFN0cmVhbSYgb3V0KSBjb25zdAor
eworICAgIGlmIChtX29mZnNldCkKKyAgICAgICAgb3V0LnByaW50KCJvZmZzZXQgPSAiLCBtX29m
ZnNldCk7Cit9CisKK30gfSAvLyBuYW1lc3BhY2UgSlNDOjpCMworCkluZGV4OiBTb3VyY2UvSmF2
YVNjcmlwdENvcmUvYjMvQjNNZW1vcnlWYWx1ZS5oCj09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZh
U2NyaXB0Q29yZS9iMy9CM01lbW9yeVZhbHVlLmgJKHJldmlzaW9uIDApCisrKyBTb3VyY2UvSmF2
YVNjcmlwdENvcmUvYjMvQjNNZW1vcnlWYWx1ZS5oCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEs
MTQyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE1IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyBy
ZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmlu
YXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRl
ZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAq
IDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUg
Y29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUg
Zm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZv
cm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlz
IGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQor
ICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGgg
dGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQ
UExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5U
SUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJB
TlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAq
IFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9S
CisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5D
SURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VT
IChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNU
SVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklU
UzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRI
RU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklM
SVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklT
SU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4g
SUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisKKyNp
Zm5kZWYgQjNNZW1vcnlWYWx1ZV9oCisjZGVmaW5lIEIzTWVtb3J5VmFsdWVfaAorCisjaW5jbHVk
ZSAiQjNWYWx1ZS5oIgorCituYW1lc3BhY2UgSlNDIHsgbmFtZXNwYWNlIEIzIHsKKworY2xhc3Mg
TWVtb3J5VmFsdWUgOiBwdWJsaWMgVmFsdWUgeworcHVibGljOgorICAgIHN0YXRpYyBib29sIGFj
Y2VwdHMoT3Bjb2RlIG9wY29kZSkKKyAgICB7CisgICAgICAgIHN3aXRjaCAob3Bjb2RlKSB7Cisg
ICAgICAgIGNhc2UgTG9hZDhaOgorICAgICAgICBjYXNlIExvYWQ4UzoKKyAgICAgICAgY2FzZSBM
b2FkMTZaOgorICAgICAgICBjYXNlIExvYWQxNlM6CisgICAgICAgIGNhc2UgTG9hZEZsb2F0Ogor
ICAgICAgICBjYXNlIExvYWQ6CisgICAgICAgIGNhc2UgU3RvcmU4OgorICAgICAgICBjYXNlIFN0
b3JlMTY6CisgICAgICAgIGNhc2UgU3RvcmVGbG9hdDoKKyAgICAgICAgY2FzZSBTdG9yZToKKyAg
ICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0
dXJuIGZhbHNlOworICAgICAgICB9CisgICAgfQorCisgICAgfk1lbW9yeVZhbHVlKCk7CisKKyAg
ICBpbnRwdHJfdCBvZmZzZXQoKSBjb25zdCB7IHJldHVybiBtX29mZnNldDsgfQorCitwcm90ZWN0
ZWQ6CisgICAgdm9pZCBkdW1wTWV0YShQcmludFN0cmVhbSYpIGNvbnN0IG92ZXJyaWRlOworCitw
cml2YXRlOgorICAgIGZyaWVuZCBjbGFzcyBQcm9jZWR1cmU7CisKKyAgICAvLyBVc2UgdGhpcyBm
b3JtIGZvciBMb2FkIChidXQgbm90IExvYWQ4WiwgTG9hZDhTLCBvciBhbnkgb2YgdGhlIExvYWRz
IHRoYXQgaGF2ZSBhIHN1ZmZpeCB0aGF0CisgICAgLy8gZGVzY3JpYmVzIHRoZSByZXR1cm5lZCB0
eXBlKS4KKyAgICBNZW1vcnlWYWx1ZSgKKyAgICAgICAgdW5zaWduZWQgaW5kZXgsIE9wY29kZSBv
cGNvZGUsIFR5cGUgdHlwZSwgT3JpZ2luIG9yaWdpbiwgVmFsdWUqIHBvaW50ZXIsCisgICAgICAg
IGludHB0cl90IG9mZnNldCA9IDApCisgICAgICAgIDogVmFsdWUoaW5kZXgsIG9wY29kZSwgdHlw
ZSwgb3JpZ2luLCBwb2ludGVyKQorICAgICAgICAsIG1fb2Zmc2V0KG9mZnNldCkKKyAgICB7Cisg
ICAgICAgIGlmICghQVNTRVJUX0RJU0FCTEVEKSB7CisgICAgICAgICAgICBzd2l0Y2ggKG9wY29k
ZSkgeworICAgICAgICAgICAgY2FzZSBMb2FkOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAg
ICAgICAgICAgY2FzZSBMb2FkOFo6CisgICAgICAgICAgICBjYXNlIExvYWQ4UzoKKyAgICAgICAg
ICAgIGNhc2UgTG9hZDE2WjoKKyAgICAgICAgICAgIGNhc2UgTG9hZDE2UzoKKyAgICAgICAgICAg
ICAgICBBU1NFUlQodHlwZSA9PSBJbnQzMik7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAg
ICAgICAgICBjYXNlIExvYWRGbG9hdDoKKyAgICAgICAgICAgICAgICBBU1NFUlQodHlwZSA9PSBE
b3VibGUpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBTdG9yZTg6
CisgICAgICAgICAgICBjYXNlIFN0b3JlMTY6CisgICAgICAgICAgICBjYXNlIFN0b3JlRmxvYXQ6
CisgICAgICAgICAgICBjYXNlIFN0b3JlOgorICAgICAgICAgICAgICAgIEFTU0VSVCh0eXBlID09
IFZvaWQpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAg
ICAgICAgICAgICAgICBBU1NFUlRfTk9UX1JFQUNIRUQoKTsKKyAgICAgICAgICAgIH0KKyAgICAg
ICAgfQorICAgIH0KKworICAgIC8vIFVzZSB0aGlzIGZvcm0gZm9yIGxvYWRzIHdoZXJlIHRoZSBy
ZXR1cm4gdHlwZSBpcyBpbXBsaWVkLgorICAgIE1lbW9yeVZhbHVlKHVuc2lnbmVkIGluZGV4LCBP
cGNvZGUgb3Bjb2RlLCBPcmlnaW4gb3JpZ2luLCBWYWx1ZSogcG9pbnRlciwgaW50cHRyX3Qgb2Zm
c2V0ID0gMCkKKyAgICAgICAgOiBWYWx1ZShpbmRleCwgb3Bjb2RlLCBvcGNvZGUgPT0gTG9hZEZs
b2F0ID8gRG91YmxlIDogSW50MzIsIG9yaWdpbiwgcG9pbnRlcikKKyAgICAgICAgLCBtX29mZnNl
dChvZmZzZXQpCisgICAgeworICAgICAgICBpZiAoIUFTU0VSVF9ESVNBQkxFRCkgeworICAgICAg
ICAgICAgc3dpdGNoIChvcGNvZGUpIHsKKyAgICAgICAgICAgIGNhc2UgTG9hZDhaOgorICAgICAg
ICAgICAgY2FzZSBMb2FkOFM6CisgICAgICAgICAgICBjYXNlIExvYWQxNlo6CisgICAgICAgICAg
ICBjYXNlIExvYWQxNlM6CisgICAgICAgICAgICBjYXNlIExvYWRGbG9hdDoKKyAgICAgICAgICAg
ICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgQVNTRVJU
X05PVF9SRUFDSEVEKCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9Cisg
ICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBVc2UgdGhpcyBmb3JtIGZvciBzdG9yZXMuCisgICAg
TWVtb3J5VmFsdWUoCisgICAgICAgIHVuc2lnbmVkIGluZGV4LCBPcGNvZGUgb3Bjb2RlLCBPcmln
aW4gb3JpZ2luLCBWYWx1ZSogdmFsdWUsIFZhbHVlKiBwb2ludGVyLAorICAgICAgICBpbnRwdHJf
dCBvZmZzZXQgPSAwKQorICAgICAgICA6IFZhbHVlKGluZGV4LCBvcGNvZGUsIFZvaWQsIG9yaWdp
biwgdmFsdWUsIHBvaW50ZXIpCisgICAgICAgICwgbV9vZmZzZXQob2Zmc2V0KQorICAgIHsKKyAg
ICAgICAgaWYgKCFBU1NFUlRfRElTQUJMRUQpIHsKKyAgICAgICAgICAgIHN3aXRjaCAob3Bjb2Rl
KSB7CisgICAgICAgICAgICBjYXNlIFN0b3JlODoKKyAgICAgICAgICAgIGNhc2UgU3RvcmUxNjoK
KyAgICAgICAgICAgIGNhc2UgU3RvcmVGbG9hdDoKKyAgICAgICAgICAgIGNhc2UgU3RvcmU6Cisg
ICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAg
ICAgIEFTU0VSVF9OT1RfUkVBQ0hFRCgpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAg
ICAgICAgfQorICAgICAgICB9CisgICAgfQorfTsKKworfSB9IC8vIG5hbWVzcGFjZSBKU0M6OkIz
CisKKyNlbmRpZiAvLyBCM01lbW9yeVZhbHVlX2gKKwpJbmRleDogU291cmNlL0phdmFTY3JpcHRD
b3JlL2IzL0IzT3Bjb2RlLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUv
YjMvQjNPcGNvZGUuY3BwCShyZXZpc2lvbiAwKQorKysgU291cmNlL0phdmFTY3JpcHRDb3JlL2Iz
L0IzT3Bjb2RlLmNwcAkod29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDQ3IEBACisvKgorICogQ29w
eXJpZ2h0IChDKSAyMDE1IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBS
ZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9y
IHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRo
ZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9u
cyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBu
b3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWlt
ZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2Ug
dGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9u
cyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlv
biBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4K
KyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycn
IEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJV
VCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRB
QklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NM
QUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMg
QkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwK
KyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBO
T1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VS
VklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5U
RVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklM
SVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAo
SU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VU
IE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUg
UE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisKKyNpbmNsdWRlICJjb25maWcuaCIK
KyNpbmNsdWRlICJCM09wY29kZS5oIgorCisjaW5jbHVkZSA8d3RmL1ByaW50U3RyZWFtLmg+CisK
K25hbWVzcGFjZSBXVEYgeworCit1c2luZyBuYW1lc3BhY2UgSlNDOjpCMzsKKwordm9pZCBwcmlu
dEludGVybmFsKFByaW50U3RyZWFtJiBvdXQsIE9wY29kZSBvcGNvZGUpCit7CisgICAgc3dpdGNo
IChvcGNvZGUpIHsKKyAgICBjYXNlIElkZW50aXR5OgorICAgICAgICBvdXQucHJpbnQoIklkZW50
aXR5Iik7CisgICAgICAgIHJldHVybjsKKyAgICAgICAgLy8gRklYTUUKKyAgICB9CisgICAgUkVM
RUFTRV9BU1NFUlRfTk9UX1JFQUNIRUQoKTsKK30KKworfSAvLyBuYW1lc3BhY2UgV1RGCisKSW5k
ZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM09wY29kZS5oCj09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNv
dXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM09wY29kZS5oCShyZXZpc2lvbiAwKQorKysgU291cmNl
L0phdmFTY3JpcHRDb3JlL2IzL0IzT3Bjb2RlLmgJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSwy
MDMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTUgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJl
c2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5h
cnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVk
IHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICog
MS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBj
b3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBm
b2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9y
bSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMg
bGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisg
KiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0
aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQ
TEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJ
RVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFO
VElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICog
UFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IK
KyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJ
REVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMg
KElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJ
VFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRT
OyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhF
T1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJ
VFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJ
TkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJ
RiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKworI2lm
bmRlZiBCM09wY29kZV9oCisjZGVmaW5lIEIzT3Bjb2RlX2gKKworI2luY2x1ZGUgPHd0Zi9TdGRM
aWJFeHRyYXMuaD4KKworbmFtZXNwYWNlIEpTQyB7IG5hbWVzcGFjZSBCMyB7CisKK2VudW0gT3Bj
b2RlIDogaW50MTZfdCB7CisgICAgLy8gQSBuby1vcCB0aGF0IHJldHVybnMgVm9pZCwgdXNlZnVs
IGZvciB3aGVuIHlvdSB3YW50IHRvIHJlbW92ZSBhIHZhbHVlLgorICAgIE5vcCwKKyAgICAgCisg
ICAgLy8gUG9seW1vcnBoaWMgaWRlbnRpdHksIHVzYWJsZSB3aXRoIGFueSB2YWx1ZSB0eXBlLgor
ICAgIElkZW50aXR5LAorCisgICAgLy8gQ29uc3RhbnRzLiBVc2UgdGhlIENvbnN0VmFsdWUqIGNs
YXNzZXMuIENvbnN0YW50cyBleGlzdCBpbiB0aGUgY29udHJvbCBmbG93LCBzbyB0aGF0IHdlIGNh
bgorICAgIC8vIHJlYXNvbiBhYm91dCB3aGVyZSB3ZSB3b3VsZCBjb25zdHJ1Y3QgdGhlbS4gTGFy
Z2UgY29uc3RhbnRzIGFyZSBleHBlbnNpdmUgdG8gY3JlYXRlLgorICAgIENvbnN0MzIsCisgICAg
Q29uc3Q2NCwKKyAgICBDb25zdERvdWJsZSwKKworICAgIC8vIFRoZSBtYWdpY2FsIHN0YWNrIHNs
b3QuIFRoaXMgaXMgdmlld2VkIGFzIGV4ZWN1dGluZyBhdCB0aGUgdG9wIG9mIHRoZSBwcm9ncmFt
IHJlZ2FyZGxlc3Mgb2YKKyAgICAvLyB3aGVyZSBpbiBjb250cm9sIGZsb3cgeW91IHB1dCBpdC4g
RWFjaCBpbnN0YW5jZSBvZiBhIFN0YWNrU2xvdCBWYWx1ZSBnZXRzIGEgZGlzam9pbnQgcmFuZ2Ug
b2YKKyAgICAvLyBzdGFjayBtZW1vcnkuIFVzZSB0aGUgU3RhY2tTbG90VmFsdWUgY2xhc3MuCisg
ICAgU3RhY2tTbG90LAorCisgICAgLy8gVGhlIG1hZ2ljYWwgYXJndW1lbnQgcmVnaXN0ZXIuIFRo
aXMgaXMgdmlld2VkIGFzIGV4ZWN1dGluZyBhdCB0aGUgdG9wIG9mIHRoZSBwcm9ncmFtCisgICAg
Ly8gcmVnYXJkbGVzcyBvZiB3aGVyZSBpbiBjb250cm9sIGZsb3cgeW91IHB1dCBpdCwgYW5kIHRo
ZSBjb21waWxlciB0YWtlcyBjYXJlIHRvIGVuc3VyZSB0aGF0IHdlCisgICAgLy8gZG9uJ3QgY2xv
YmJlciB0aGUgdmFsdWUgYnkgcmVnaXN0ZXIgYWxsb2NhdGlvbiBvciBjYWxscyAoZWl0aGVyIGJ5
IHNhdmluZyB0aGUgYXJndW1lbnQgdG8gdGhlCisgICAgLy8gc3RhY2sgb3IgcHJlc2VydmluZyBp
dCBpbiBhIGNhbGxlZS1zYXZlIHJlZ2lzdGVyKS4gVXNlIHRoZSBBcmd1bWVudFJlZ1ZhbHVlIGNs
YXNzLiBUaGUgcmV0dXJuCisgICAgLy8gdHlwZSBpcyBlaXRoZXIgcG9pbnRlcigpIChmb3IgR1BS
cykgb3IgRG91YmxlIChmb3IgRlBScykuCisgICAgQXJndW1lbnRSZWcsCisKKyAgICAvLyBUaGUg
ZnJhbWUgcG9pbnRlci4gWW91IGNhbiBwdXQgdGhpcyBhbnl3aGVyZSBpbiBjb250cm9sIGZsb3cg
YnV0IGl0IHdpbGwgYWx3YXlzIHlpZWxkIHRoZQorICAgIC8vIGZyYW1lIHBvaW50ZXIsIHdpdGgg
YSBjYXZlYXQ6IGlmIG91ciBjb21waWxlciBjaGFuZ2VzIHRoZSBmcmFtZSBwb2ludGVyIHRlbXBv
cmFyaWx5IGZvciBzb21lCisgICAgLy8gc2lsbHkgcmVhc29uLCB0aGUgRnJhbWVQb2ludGVyIGlu
dHJpbnNpYyB3aWxsIHJldHVybiB3aGVyZSB0aGUgZnJhbWUgcG9pbnRlciAqc2hvdWxkKiBiZSBu
b3QKKyAgICAvLyB3aGVyZSBpdCBoYXBwZW5zIHRvIGJlIHJpZ2h0IG5vdy4KKyAgICBGcmFtZVBv
aW50ZXIsCisKKyAgICAvLyBQb2x5bW9ycGhpYyBtYXRoLCB1c2FibGUgd2l0aCBhbnkgdmFsdWUg
dHlwZS4KKyAgICBBZGQsCisgICAgU3ViLAorICAgIE11bCwKKyAgICBEaXYsCisKKyAgICAvLyBJ
bnRlZ2VyIG1hdGguCisgICAgQ2hpbGxEaXYsIC8vIGRvZXNuJ3QgdHJhcCBldmVyLCBiZWhhdmVz
IGxpa2UgSlMgKHgveSl8MC4KKyAgICBNb2QsCisgICAgQml0QW5kLAorICAgIEJpdE9yLAorICAg
IEJpdFhvciwKKyAgICBTaGwsCisgICAgU1NociwKKyAgICBaU2hyLAorCisgICAgLy8gQ2FzdHMg
YW5kIHN1Y2guCisgICAgLy8gVGFrZXMgYW5kIHJldHVybnMgSW50MzI6CisgICAgU0V4dDgsCisg
ICAgU0V4dDE2LAorICAgIC8vIFRha2VzIEludDMyIGFuZCByZXR1cm5zIEludDY0OgorICAgIFNF
eHQzMiwKKyAgICBaRXh0MzIsCisgICAgLy8gVGFrZXMgYW5kIHJldHVybnMgRG91YmxlOgorICAg
IEZSb3VuZCwKKyAgICAvLyBUYWtlcyBpbnRzIGFuZCByZXR1cm5zIERvdWJsZToKKyAgICBJVG9E
LAorICAgIC8vIFRha2VzIERvdWJsZSBhbmQgcmV0dXJucyBJbnQzMjoKKyAgICBEVG9JMzIsCisK
KyAgICAvLyBQb2x5bW9ycGhpYyBjb21wYXJpc29ucywgdXNhYmxlIHdpdGggYW55IHZhbHVlIHR5
cGUuIFJldHVybnMgaW50MzIgMCBvciAxLiBOb3RlIHRoYXQgIk5vdCIKKyAgICAvLyBpcyBqdXN0
IEVxdWFsKHgsIDApLgorICAgIEVxdWFsLAorICAgIE5vdEVxdWFsLAorICAgIExlc3NUaGFuLAor
ICAgIEdyZWF0ZXJUaGFuLAorICAgIExlc3NFcXVhbCwKKyAgICBHcmVhdGVyRXF1YWwsCisKKyAg
ICAvLyBJbnRlZ2VyIGNvbXBhcmlzb25zLiBSZXR1cm5zIGludDMyIDAgb3IgMS4KKyAgICBBYm92
ZSwKKyAgICBCZWxvdywKKyAgICBBYm92ZUVxdWFsCisgICAgQmVsb3dFcXVhbCwKKworICAgIC8v
IE1lbW9yeSBsb2Fkcy4gT3Bjb2RlIGluZGljYXRlcyBob3cgd2UgbG9hZCBhbmQgdGhlIGxvYWRl
ZCB0eXBlLiBUaGVzZSB1c2UgTWVtb3J5VmFsdWUuCisgICAgLy8gVGhlc2UgcmV0dXJuIEludDMy
OgorICAgIExvYWQ4WiwKKyAgICBMb2FkOFMsCisgICAgTG9hZDE2WiwKKyAgICBMb2FkMTZTLAor
ICAgIC8vIFRoaXMgcmV0dXJucyBEb3VibGU6CisgICAgTG9hZEZsb2F0LAorICAgIC8vIFRoaXMg
cmV0dXJuIHdoYXRldmVyIHRoZSByZXR1cm4gdHlwZSBpczoKKyAgICBMb2FkLAorCisgICAgLy8g
TWVtb3J5IHN0b3Jlcy4gT3Bjb2RlIGluZGljYXRlcyBob3cgdGhlIHZhbHVlIGlzIHN0b3JlZC4g
VGhlc2UgdXNlIE1lbW9yeVZhbHVlLgorICAgIC8vIFRoZXNlIHRha2UgYW4gSW50MzIgdmFsdWU6
CisgICAgU3RvcmU4LAorICAgIFN0b3JlMTYsCisgICAgLy8gVGhpcyB0YWtlcyBhIERvdWJsZSB2
YWx1ZToKKyAgICBTdG9yZUZsb2F0LAorICAgIC8vIFRoaXMgaXMgYSBwb2x5bW9ycGhpYyBzdG9y
ZSBmb3IgSW50MzIsIEludDY0LCBhbmQgRG91YmxlOgorICAgIFN0b3JlLAorCisgICAgLy8gVGhp
cyBpcyBhIHJlZ3VsYXIgb3JkaW5hcnkgQyBmdW5jdGlvbiBjYWxsLCB1c2luZyB0aGUgc3lzdGVt
IEMgY2FsbGluZyBjb252ZW50aW9uLiBNYWtlIHN1cmUKKyAgICAvLyB0aGF0IHRoZSBhcmd1bWVu
dHMgYXJlIHBhc3NlZCB1c2luZyB0aGUgcmlnaHQgdHlwZXMuCisgICAgQ0NhbGwsCisKKyAgICAv
LyBUaGlzIGlzIGEgcGF0Y2hwb2ludC4gVXNlIHRoZSBQYXRjaHBvaW50VmFsdWUgY2xhc3MuIFRo
aXMgaXMgdmlld2VkIGFzIGJlaGF2aW5nIGxpa2UgYSBjYWxsLAorICAgIC8vIGJ1dCBvbmx5IGVt
aXRzIGNvZGUgdmlhIGEgY29kZSBnZW5lcmF0aW9uIGNhbGxiYWNrLiBUaGF0IGNhbGxiYWNrIGdl
dHMgdG8gZW1pdCBjb2RlIGlubGluZS4KKyAgICAvLyBZb3UgY2FuIHBhc3MgYSBzdGFja21hcCBh
bG9uZyB3aXRoIGNvbnN0cmFpbnRzIG9uIGhvdyBlYWNoIHN0YWNrbWFwIGFyZ3VtZW50IG11c3Qg
YmUgcGFzc2VkLgorICAgIC8vIEl0J3MgbGVnYWwgdG8gcmVxdWVzdCB0aGF0IGEgc3RhY2ttYXAg
YXJndW1lbnQgaXMgaW4gc29tZSByZWdpc3RlciBhbmQgaXQncyBsZWdhbCB0byByZXF1ZXN0Cisg
ICAgLy8gdGhhdCBhIHN0YWNrbWFwIGFyZ3VtZW50IGlzIGF0IHNvbWUgb2Zmc2V0IGZyb20gdGhl
IHRvcCBvZiB0aGUgYXJndW1lbnQgcGFzc2luZyBhcmVhIG9uIHRoZQorICAgIC8vIHN0YWNrLgor
ICAgIFBhdGNocG9pbnQsCisKKyAgICAvLyBDaGVja2VkIG1hdGguIFVzZSB0aGUgQ2hlY2tWYWx1
ZSBjbGFzcy4gTGlrZSBhIFBhdGNocG9pbnQsIHRoaXMgdGFrZXMgYSBjb2RlIGdlbmVyYXRpb24K
KyAgICAvLyBjYWxsYmFjay4gVGhhdCBjYWxsYmFjayBnZXRzIHRvIGVtaXQgc29tZSBjb2RlIGFm
dGVyIHRoZSBlcGlsb2d1ZSwgYW5kIGdldHMgdG8gbGluayB0aGUganVtcAorICAgIC8vIGZyb20g
dGhlIGNoZWNrLCBhbmQgdGhlIGNob2ljZSBvZiByZWdpc3RlcnMuIFlvdSBhbHNvIGdldCB0byBz
dXBwbHkgYSBzdGFja21hcC4gTm90ZSB0aGF0IHlvdQorICAgIC8vIGFyZSBub3QgYWxsb3dlZCB0
byBqdW1wIGJhY2sgaW50byB0aGUgbWFpbmxpbmUgY29kZSBmcm9tIHlvdXIgc2xvdyBwYXRoLCBz
aW5jZSB0aGUgY29tcGlsZXIKKyAgICAvLyB3aWxsIGFzc3VtZSB0aGF0IHRoZSBleGVjdXRpb24g
b2YgdGhlc2UgaW5zdHJ1Y3Rpb25zIHByb3ZlcyB0aGF0IG92ZXJmbG93IGRpZG4ndCBoYXBwZW4u
IEZvcgorICAgIC8vIGV4YW1wbGUsIGlmIHlvdSBoYXZlIHR3byBDaGVja0FkZCdzOgorICAgIC8v
CisgICAgLy8gYSA9IENoZWNrQWRkKHgsIHkpCisgICAgLy8gYiA9IENoZWNrQWRkKHgsIHkpCisg
ICAgLy8KKyAgICAvLyBUaGVuIGl0J3MgdmFsaWQgdG8gY2hhbmdlIHRoaXMgdG86CisgICAgLy8K
KyAgICAvLyBhID0gQ2hlY2tBZGQoeCwgeSkKKyAgICAvLyBiID0gSWRlbnRpdHkoYSkKKyAgICAv
LworICAgIC8vIFRoaXMgaXMgdmFsaWQgcmVnYXJkbGVzcyBvZiB0aGUgY2FsbGJhY2tzIHVzZWQg
YnkgdGhlIHR3byBDaGVja0FkZHMuIFRoZXkgbWF5IGhhdmUgZGlmZmVyZW50CisgICAgLy8gY2Fs
bGJhY2tzLiBZZXQsIHRoaXMgdHJhbnNmb3JtYXRpb24gaXMgdmFsaWQgZXZlbiBpZiB0aGV5IGFy
ZSBkaWZmZXJlbnQgYmVjYXVzZSB3ZSBrbm93IHRoYXQKKyAgICAvLyBhZnRlciB0aGUgZmlyc3Qg
Q2hlY2tBZGQgZXhlY3V0ZXMsIHRoZSBzZWNvbmQgQ2hlY2tBZGQgY291bGQgbm90IGhhdmUgcG9z
c2libHkgdGFrZW4gc2xvdworICAgIC8vIHBhdGguIFRoZXJlZm9yZSwgdGhlIHNlY29uZCBDaGVj
a0FkZCdzIGNhbGxiYWNrIGlzIGlycmVsZXZhbnQuCisgICAgQ2hlY2tBZGQsCisgICAgQ2hlY2tT
dWIsCisgICAgQ2hlY2tNdWwsCisKKyAgICAvLyBDaGVjayB0aGF0IHNpZGUtZXhpdHMuIFVzZSB0
aGUgQ2hlY2tWYWx1ZSBjbGFzcy4gTGlrZSBDaGVja0FkZCBhbmQgZnJpZW5kcywgdGhpcyBoYXMg
YQorICAgIC8vIHN0YWNrbWFwIHdpdGggYSBnZW5lcmF0aW9uIGNhbGxiYWNrLiBUaGlzIHRha2Vz
IGFuIEludDMyIGFyZ3VtZW50IHRoYXQgdGhpcyBicmFuY2hlcyBvbiwgd2l0aAorICAgIC8vIGZ1
bGwgYnJhbmNoIGZ1c2lvbiBpbiB0aGUgaW5zdHJ1Y3Rpb24gc2VsZWN0b3IuIEEgdHJ1ZSB2YWx1
ZSBqdW1wcyB0byB0aGUgZ2VuZXJhdG9yJ3Mgc2xvdworICAgIC8vIHBhdGguCisgICAgQ2hlY2ss
CisKKyAgICAvLyBTU0Egc3VwcG9ydCwgaW4gdGhlIHN0eWxlIG9mIERGRyBTU0EuCisgICAgVXBz
aWxvbiwgLy8gVGhpcyB1c2VzIHRoZSBVcHNpbG9uVmFsdWUgY2xhc3MuCisgICAgUGhpLAorCisg
ICAgLy8gSnVtcC4gVXNlcyB0aGUgQ29udHJvbFZhbHVlIGNsYXNzLgorICAgIEp1bXAsCisgICAg
CisgICAgLy8gUG9seW1vcnBoaWMgYnJhbmNoLCB1c2FibGUgd2l0aCBhbnkgdmFsdWUgdHlwZS4g
QnJhbmNoZXMgaWYgbm90IGVxdWFsIHRvIHplcm8uIFVzZXMgdGhlCisgICAgLy8gQ29udHJvbFZh
bHVlIGNsYXNzLCB3aXRoIHRoZSAwLWluZGV4IHN1Y2Nlc3NvciBiZWluZyB0aGUgdHJ1ZSBzdWNj
ZXNzb3IuCisgICAgQnJhbmNoLAorCisgICAgLy8gU3dpdGNoLiBTd2l0Y2hlcyBvdmVyIGVpdGhl
ciBJbnQzMiBvciBJbnQ2NC4gVXNlcyB0aGUgU3dpdGNoVmFsdWUgY2xhc3MuCisgICAgU3dpdGNo
LAorCisgICAgLy8gUmV0dXJuLiBOb3RlIHRoYXQgQjMgcHJvY2VkdXJlcyBkb24ndCBrbm93IHRo
ZWlyIHJldHVybiB0eXBlLCBzbyB0aGlzIGNhbiBqdXN0IHJldHVybiBhbnkKKyAgICAvLyB0eXBl
LiBVc2VzIHRoZSBDb250cm9sVmFsdWUgY2xhc3MuCisgICAgUmV0dXJuLAorCisgICAgLy8gVGhp
cyBpcyBhIHRlcm1pbmFsIHRoYXQgaW5kaWNhdGVzIHRoYXQgd2Ugd2lsbCBuZXZlciBnZXQgaGVy
ZS4gVXNlcyB0aGUgQ29udHJvbFZhbHVlIGNsYXNzLgorICAgIE9vcHMKK307CisKK30gfSAvLyBu
YW1lc3BhY2UgSlNDOjpCMworCituYW1lc3BhY2UgV1RGIHsKKworY2xhc3MgUHJpbnRTdHJlYW07
CisKK3ZvaWQgcHJpbnRJbnRlcm5hbChQcmludFN0cmVhbSYsIEpTQzo6QjM6Ok9wY29kZSk7CisK
K30gLy8gbmFtZXNwYWNlIFdURgorCisjZW5kaWYgLy8gQjNPcGNvZGVfaAorCkluZGV4OiBTb3Vy
Y2UvSmF2YVNjcmlwdENvcmUvYjMvQjNPcmlnaW4uY3BwCj09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9K
YXZhU2NyaXB0Q29yZS9iMy9CM09yaWdpbi5jcHAJKHJldmlzaW9uIDApCisrKyBTb3VyY2UvSmF2
YVNjcmlwdENvcmUvYjMvQjNPcmlnaW4uY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsMzcg
QEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTUgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2Vy
dmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkg
Zm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHBy
b3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4g
UmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5
cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xs
b3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBt
dXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlz
dCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAg
ICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUg
ZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUg
SU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMs
IElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElF
UyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVS
UE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IKKyAq
IENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVO
VEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElO
Q0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVU
RSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBP
UiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZ
CisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFks
IE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcg
SU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBB
RFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKworI2luY2x1
ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgIkIzT3JpZ2luLmgiCisKK25hbWVzcGFjZSBKU0MgeyBu
YW1lc3BhY2UgQjMgeworCit2b2lkIE9yaWdpbjo6ZHVtcChQcmludFN0cmVhbSYgb3V0KSBjb25z
dAoreworICAgIG91dC5wcmludCgiT3JpZ2luKCIsIFJhd1BvaW50ZXIobV9kYXRhKSwgIikiKTsK
K30KKworfSB9IC8vIG5hbWVzcGFjZSBKU0M6OkIzCisKSW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0
Q29yZS9iMy9CM09yaWdpbi5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9i
My9CM09yaWdpbi5oCShyZXZpc2lvbiAwKQorKysgU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0Iz
T3JpZ2luLmgJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSw1NSBAQAorLyoKKyAqIENvcHlyaWdo
dCAoQykgMjAxNSBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0
cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRo
b3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9s
bG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Yg
c291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNl
LCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgor
ICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBh
Ym92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5k
IHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5k
L29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgor
ICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIGBgQVMgSVMnJyBBTkQg
QU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9U
IExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElU
WSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVE
LiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJ
QUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBF
WEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJ
TUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VT
OyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQ
VElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwg
V0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xV
RElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBU
SEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJ
QklMSVRZIE9GIFNVQ0ggREFNQUdFLiAKKyAqLworCisjaWZuZGVmIEIzT3JpZ2luX2gKKyNkZWZp
bmUgQjNPcmlnaW5faAorCisjaW5jbHVkZSA8d3RmL1ByaW50U3RyZWFtLmg+CisKK25hbWVzcGFj
ZSBKU0MgeyBuYW1lc3BhY2UgQjMgeworCisvLyBXaG9ldmVyIGdlbmVyYXRlcyBCM0lSIGNhbiBj
aG9vc2UgdG8gcHV0IG9yaWdpbnMgb24gdmFsdWVzLiBXaGVuIHlvdSBkbyB0aGlzLCBCMyB3aWxs
IGJlIGFibGUgdG8KKy8vIGFjY291bnQsIGRvd24gdG8gdGhlIG1hY2hpbmUgY29kZSwgd2hpY2gg
aW5zdHJ1Y3Rpb24gY29ycmVzcG9uZHMgdG8gd2hpY2ggb3JpZ2luLiBCMworLy8gdHJhbnNmb3Jt
YXRpb25zIG11c3QgcHJlc2VydmUgT3JpZ2lucyBjYXJlZnVsbHkuIEl0J3MgYW4gZXJyb3IgdG8g
d3JpdGUgYSB0cmFuc2Zvcm1hdGlvbiB0aGF0CisvLyBlaXRoZXIgZHJvcHMgT3JpZ2lucyBvciBs
aWVzIGFib3V0IHRoZW0uCitjbGFzcyBPcmlnaW4geworcHVibGljOgorICAgIGV4cGxpY2l0IE9y
aWdpbihjb25zdCB2b2lkKiBkYXRhID0gbnVsbHB0cikKKyAgICAgICAgOiBtX2RhdGEoZGF0YSkK
KyAgICB7CisgICAgfQorCisgICAgY29uc3Qgdm9pZCogZGF0YSgpIGNvbnN0IHsgcmV0dXJuIG1f
ZGF0YTsgfQorCisgICAgdm9pZCBkdW1wKFByaW50U3RyZWFtJikgY29uc3Q7CisgICAgCitwcml2
YXRlOgorICAgIGNvbnN0IHZvaWQqIG1fZGF0YTsKK307CisKK30gfSAvLyBuYW1lc3BhY2UgSlND
OjpCMworCisjZW5kaWYgLy8gQjNPcmlnaW5faAorCkluZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENv
cmUvYjMvQjNQYXRjaHBvaW50VmFsdWUuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2Ny
aXB0Q29yZS9iMy9CM1BhdGNocG9pbnRWYWx1ZS5jcHAJKHJldmlzaW9uIDApCisrKyBTb3VyY2Uv
SmF2YVNjcmlwdENvcmUvYjMvQjNQYXRjaHBvaW50VmFsdWUuY3BwCSh3b3JraW5nIGNvcHkpCkBA
IC0wLDAgKzEsNDMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTUgQXBwbGUgSW5jLiBBbGwg
cmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNl
IGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUg
cGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUg
bWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRo
ZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMg
YW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBi
aW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3Rp
Y2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIg
aW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlk
ZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklE
RUQgQlkgQVBQTEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVE
IFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJ
RUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElD
VUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExF
IElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElS
RUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFM
IERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQg
T0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisg
KiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBP
TiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklD
VCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJ
U0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FS
RSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisg
Ki8KKworI2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgIkIzUGF0Y2hwb2ludFZhbHVlLmgi
CisKKyNpbmNsdWRlIDx3dGYvQ29tbWFQcmludGVyLmg+CisKK25hbWVzcGFjZSBKU0MgeyBuYW1l
c3BhY2UgQjMgeworCitQYXRjaHBvaW50VmFsdWU6On5QYXRjaHBvaW50VmFsdWUoKQoreworfQor
Cit2b2lkIFBhdGNocG9pbnRWYWx1ZTo6ZHVtcE1ldGEoUHJpbnRTdHJlYW0mIG91dCkgY29uc3QK
K3sKKyAgICBvdXQucHJpbnQoInN0YWNrbWFwID0gIiwgc3RhY2ttYXApOworfQorCit9IH0gLy8g
bmFtZXNwYWNlIEpTQzo6QjMKKwpJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzUGF0
Y2hwb2ludFZhbHVlLmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0Iz
UGF0Y2hwb2ludFZhbHVlLmgJKHJldmlzaW9uIDApCisrKyBTb3VyY2UvSmF2YVNjcmlwdENvcmUv
YjMvQjNQYXRjaHBvaW50VmFsdWUuaAkod29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDU3IEBACisv
KgorICogQ29weXJpZ2h0IChDKSAyMDE1IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4K
KyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1z
LCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRl
ZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlz
dHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0
CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5n
IGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCBy
ZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2Yg
Y29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9j
dW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3Ry
aWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4g
YGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNM
VURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0Yg
TUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0Ug
QVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SCisgKiBDT05U
UklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwg
U1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJ
TkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09P
RFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVT
SU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICog
T0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBU
T1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFO
WSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNF
RCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisKKyNpZm5kZWYgQjNQ
YXRjaHBvaW50VmFsdWVfaAorI2RlZmluZSBCM1BhdGNocG9pbnRWYWx1ZV9oCisKKyNpbmNsdWRl
ICJCM1ZhbHVlLmgiCisjaW5jbHVkZSAiQjNTdGFja21hcC5oIgorCituYW1lc3BhY2UgSlNDIHsg
bmFtZXNwYWNlIEIzIHsKKworY2xhc3MgUGF0Y2hwb2ludFZhbHVlIDogcHVibGljIFZhbHVlIHsK
K3B1YmxpYzoKKyAgICBzdGF0aWMgYm9vbCBhY2NlcHRzKE9wY29kZSBvcGNvZGUpIHsgcmV0dXJu
IG9wY29kZSA9PSBQYXRjaHBvaW50OyB9CisKKyAgICB+UGF0Y2hwb2ludFZhbHVlKCk7CisKKyAg
ICBTdGFja21hcCBzdGFja21hcDsKKworcHJvdGVjdGVkOgorICAgIHZvaWQgZHVtcE1ldGEoUHJp
bnRTdHJlYW0mKSBjb25zdCBvdmVycmlkZTsKKworcHJpdmF0ZToKKyAgICBmcmllbmQgY2xhc3Mg
UHJvY2VkdXJlOworCisgICAgUGF0Y2hwb2ludFZhbHVlKHVuc2lnbmVkIGluZGV4LCBUeXBlIHR5
cGUsIE9yaWdpbiBvcmlnaW4sIGNvbnN0IEFkamFjZW5jeUxpc3QmIGNoaWxkcmVuKQorICAgICAg
ICA6IFZhbHVlKGluZGV4LCBQYXRjaHBvaW50LCB0eXBlLCBvcmlnaW4sIGNoaWxkcmVuKQorICAg
IHsKKyAgICB9Cit9OworCit9IH0gLy8gbmFtZXNwYWNlIEpTQzo6QjMKKworI2VuZGlmIC8vIEIz
UGF0Y2hwb2ludFZhbHVlX2gKKwpJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzUHJv
Y2VkdXJlLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNQcm9j
ZWR1cmUuY3BwCShyZXZpc2lvbiAwKQorKysgU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzUHJv
Y2VkdXJlLmNwcAkod29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDU2IEBACisvKgorICogQ29weXJp
Z2h0IChDKSAyMDE1IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRp
c3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdp
dGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBm
b2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBv
ZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3Rp
Y2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIu
CisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhl
IGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBh
bmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBh
bmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAq
CisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFO
RCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBO
T1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklM
SVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlN
RUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUg
TElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAq
IEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1Qg
TElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklD
RVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJS
VVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZ
LCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5D
TFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9G
IFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9T
U0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisKKyNpbmNsdWRlICJjb25maWcuaCIKKyNp
bmNsdWRlICJCM1Byb2NlZHVyZS5oIgorCisjaW5jbHVkZSAiQjNCYXNpY0Jsb2NrLmgiCisjaW5j
bHVkZSAiQjNWYWx1ZS5oIgorCituYW1lc3BhY2UgSlNDIHsgbmFtZXNwYWNlIEIzIHsKKworUHJv
Y2VkdXJlOjpQcm9jZWR1cmUoKQoreworfQorCitQcm9jZWR1cmU6On5Qcm9jZWR1cmUoKQorewor
fQorCitCYXNpY0Jsb2NrKiBQcm9jZWR1cmU6OmFkZEJsb2NrKCkKK3sKKyAgICBzdGQ6OnVuaXF1
ZV9wdHI8QmFzaWNCbG9jaz4gYmxvY2sgPSBzdGQ6Om1ha2VfdW5pcXVlPEJhc2ljQmxvY2s+KG1f
YmxvY2tzLnNpemUoKSk7CisgICAgQmFzaWNCbG9jayogcmVzdWx0ID0gYmxvY2suZ2V0KCk7Cisg
ICAgbV9ibG9ja3MuYXBwZW5kKFdURjo6bW92ZShibG9jaykpOworICAgIHJldHVybiByZXN1bHQ7
Cit9CisKK3ZvaWQgUHJvY2VkdXJlOjpkdW1wKFByaW50U3RyZWFtJiBvdXQpIGNvbnN0Cit7Cisg
ICAgZm9yIChCYXNpY0Jsb2NrKiBibG9jayA6ICp0aGlzKQorICAgICAgICBvdXQucHJpbnQoZGVl
cER1bXAoYmxvY2spKTsKK30KKworfSB9IC8vIG5hbWVzcGFjZSBKU0M6OkIzCkluZGV4OiBTb3Vy
Y2UvSmF2YVNjcmlwdENvcmUvYjMvQjNQcm9jZWR1cmUuaAo9PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2Uv
SmF2YVNjcmlwdENvcmUvYjMvQjNQcm9jZWR1cmUuaAkocmV2aXNpb24gMCkKKysrIFNvdXJjZS9K
YXZhU2NyaXB0Q29yZS9iMy9CM1Byb2NlZHVyZS5oCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEs
MTc3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE1IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyBy
ZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmlu
YXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRl
ZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAq
IDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUg
Y29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUg
Zm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZv
cm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlz
IGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQor
ICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGgg
dGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQ
UExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5U
SUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJB
TlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAq
IFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9S
CisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5D
SURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VT
IChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNU
SVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklU
UzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRI
RU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklM
SVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklT
SU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4g
SUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisKKyNp
Zm5kZWYgQjNQcm9jZWR1cmVfaAorI2RlZmluZSBCM1Byb2NlZHVyZV9oCisKKyNpbmNsdWRlIDx3
dGYvQmFnLmg+CisjaW5jbHVkZSA8d3RmL0Zhc3RNYWxsb2MuaD4KKyNpbmNsdWRlIDx3dGYvTm9u
Y29weWFibGUuaD4KKyNpbmNsdWRlIDx3dGYvVmVjdG9yLmg+CisKK25hbWVzcGFjZSBKU0MgeyBu
YW1lc3BhY2UgQjMgeworCitjbGFzcyBCYXNpY0Jsb2NrOworY2xhc3MgVmFsdWU7CisKK2NsYXNz
IFByb2NlZHVyZSB7CisgICAgV1RGX01BS0VfTk9OQ09QWUFCTEUoUHJvY2VkdXJlKTsKKyAgICBX
VEZfTUFLRV9GQVNUX0FMTE9DQVRFRDsKK3B1YmxpYzoKKworICAgIFByb2NlZHVyZSgpOworICAg
IH5Qcm9jZWR1cmUoKTsKKworICAgIEJhc2ljQmxvY2sqIGFkZEJsb2NrKCk7CisgICAgCisgICAg
dGVtcGxhdGU8dHlwZW5hbWUgVmFsdWVUeXBlLCB0eXBlbmFtZS4uLiBBcmd1bWVudHM+CisgICAg
VmFsdWVUeXBlKiBhZGQoQXJndW1lbnRzLi4uKTsKKworICAgIHZvaWQgZHVtcChQcmludFN0cmVh
bSYpIGNvbnN0OworCisgICAgdW5zaWduZWQgc2l6ZSgpIGNvbnN0IHsgcmV0dXJuIG1fYmxvY2tz
LnNpemUoKTsgfQorICAgIEJhc2ljQmxvY2sqIGF0KHVuc2lnbmVkIGluZGV4KSBjb25zdCB7IHJl
dHVybiBtX2Jsb2Nrc1tpbmRleF07IH0KKyAgICBCYXNpY0Jsb2NrKiBvcGVyYXRvcltdKHVuc2ln
bmVkIGluZGV4KSBjb25zdCB7IHJldHVybiBhdChpbmRleCk7IH0KKworICAgIGNsYXNzIGl0ZXJh
dG9yIHsKKyAgICBwdWJsaWM6CisgICAgICAgIGl0ZXJhdG9yKCk6CisgICAgICAgICAgICA6IG1f
cHJvY2VkdXJlKG51bGxwdHIpCisgICAgICAgICAgICAsIG1faW5kZXgoMCkKKyAgICAgICAgewor
ICAgICAgICB9CisKKyAgICAgICAgaXRlcmF0b3IoUHJvY2VkdXJlJiBwcm9jZWR1cmUsIHVuc2ln
bmVkIGluZGV4KQorICAgICAgICAgICAgOiBtX3Byb2NlZHVyZSgmcHJvY2VkdXJlKQorICAgICAg
ICAgICAgLCBtX2luZGV4KGluZGV4KQorICAgICAgICB7CisgICAgICAgIH0KKworICAgICAgICBC
YXNpY0Jsb2NrKiBvcGVyYXRvciooKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gbV9w
cm9jZWR1cmUtPmF0KG1faW5kZXgpOworICAgICAgICB9CisKKyAgICAgICAgaXRlcmF0b3ImIG9w
ZXJhdG9yKysoKQorICAgICAgICB7CisgICAgICAgICAgICBtX2luZGV4ID0gZmluZE5leHQobV9p
bmRleCArIDEpOworICAgICAgICAgICAgcmV0dXJuICp0aGlzOworICAgICAgICB9CisKKyAgICAg
ICAgYm9vbCBvcGVyYXRvcj09KGNvbnN0IGl0ZXJhdG9yJiBvdGhlcikgY29uc3QKKyAgICAgICAg
eworICAgICAgICAgICAgcmV0dXJuIG1faW5kZXggPT0gb3RoZXIubV9pbmRleDsKKyAgICAgICAg
fQorCisgICAgICAgIGJvb2wgb3BlcmF0b3IhPShjb25zdCBpdGVyYXRvciYgb3RoZXIpIGNvbnN0
CisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiAhKCp0aGlzID09IG90aGVyKTsKKyAgICAg
ICAgfQorCisgICAgcHJpdmF0ZToKKyAgICAgICAgdW5zaWduZWQgZmluZE5leHQodW5zaWduZWQg
aW5kZXgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHdoaWxlIChpbmRleCA8IG1fcHJvY2VkdXJl
LT5zaXplKCkgJiYgIW1fcHJvY2VkdXJlLT5hdChpbmRleCkpCisgICAgICAgICAgICAgICAgaW5k
ZXgrKzsKKyAgICAgICAgICAgIHJldHVybiBpbmV4OworICAgICAgICB9CisKKyAgICAgICAgUHJv
Y2VkdXJlKiBtX3Byb2NlZHVyZTsKKyAgICAgICAgdW5zaWduZWQgbV9pbmRleDsKKyAgICB9Owor
CisgICAgaXRlcmF0b3IgYmVnaW4oKSBjb25zdCB7IHJldHVybiBpdGVyYXRvcigqdGhpcywgMCk7
IH0KKyAgICBpdGVyYXRvciBlbmQoKSBjb25zdCB7IHJldHVybiBpdGVyYXRvcigqdGhpcywgbnVt
QmxvY2tzKCkpOyB9CisKKyAgICBjbGFzcyBWYWx1ZXNDb2xsZWN0aW9uIHsKKyAgICBwdWJsaWM6
CisgICAgICAgIFZhbHVlc0NvbGxlY3Rpb24oUHJvY2VkdXJlJiBwcm9jZWR1cmUpCisgICAgICAg
ICAgICA6IG1fcHJvY2VkdXJlKHByb2NlZHVyZSkKKyAgICAgICAgeworICAgICAgICB9CisKKyAg
ICAgICAgY2xhc3MgaXRlcmF0b3IgeworICAgICAgICBwdWJsaWM6CisgICAgICAgICAgICBpdGVy
YXRvcigpOgorICAgICAgICAgICAgICAgIDogbV9wcm9jZWR1cmUobnVsbHB0cikKKyAgICAgICAg
ICAgICAgICAsIG1faW5kZXgoMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKworICAg
ICAgICAgICAgaXRlcmF0b3IoUHJvY2VkdXJlJiBwcm9jZWR1cmUsIHVuc2lnbmVkIGluZGV4KQor
ICAgICAgICAgICAgICAgIDogbV9wcm9jZWR1cmUoJnByb2NlZHVyZSkKKyAgICAgICAgICAgICAg
ICAsIG1faW5kZXgoaW5kZXgpCisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisKKyAgICAg
ICAgICAgIFZhbHVlKiBvcGVyYXRvciooKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAg
IHJldHVybiBtX3Byb2NlZHVyZS0+YmxvY2sobV9pbmRleCk7CisgICAgICAgICAgICB9CisKKyAg
ICAgICAgICAgIGl0ZXJhdG9yJiBvcGVyYXRvcisrKCkKKyAgICAgICAgICAgIHsKKyAgICAgICAg
ICAgICAgICBtX2luZGV4Kys7CisgICAgICAgICAgICAgICAgcmV0dXJuICp0aGlzOworICAgICAg
ICAgICAgfQorCisgICAgICAgICAgICBib29sIG9wZXJhdG9yPT0oY29uc3QgaXRlcmF0b3ImIG90
aGVyKSBjb25zdAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBtX2luZGV4
ID09IG90aGVyLm1faW5kZXg7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGJvb2wgb3Bl
cmF0b3IhPShjb25zdCBpdGVyYXRvciYgb3RoZXIpIGNvbnN0CisgICAgICAgICAgICB7CisgICAg
ICAgICAgICAgICAgcmV0dXJuICEoKnRoaXMgPT0gb3RoZXIpOworICAgICAgICAgICAgfQorCisg
ICAgICAgIHByaXZhdGU6CisKKyAgICAgICAgICAgIFByb2NlZHVyZSogbV9wcm9jZWR1cmU7Cisg
ICAgICAgICAgICB1bnNpZ25lZCBtX2luZGV4OworICAgICAgICB9OworCisgICAgICAgIGl0ZXJh
dG9yIGJlZ2luKCkgY29uc3QgeyByZXR1cm4gaXRlcmF0b3IobV9wcm9jZWR1cmUsIDApOyB9Cisg
ICAgICAgIGl0ZXJhdG9yIGVuZCgpIGNvbnN0IHsgcmV0dXJuIGl0ZXJhdG9yKG1fcHJvY2VkdXJl
LCBtX3Byb2NlZHVyZS5tX3ZhbHVlcy5zaXplKCkpOyB9CisKKyAgICAgICAgdW5zaWduZWQgc2l6
ZSgpIGNvbnN0IHsgcmV0dXJuIG1fcHJvY2VkdXJlLm1fdmFsdWVzLnNpemUoKTsgfQorICAgICAg
ICBWYWx1ZSogYXQodW5zaWduZWQgaW5kZXgpIGNvbnN0IHsgcmV0dXJuIG1fcHJvY2VkdXJlLm1f
dmFsdWVzW2luZGV4XTsgfQorICAgICAgICBWYWx1ZSogb3BlcmF0b3JbXSh1bnNpZ25lZCBpbmRl
eCkgY29uc3QgeyByZXR1cm4gYXQoaW5kZXgpOyB9CisgICAgICAgIAorICAgIHByaXZhdGU6Cisg
ICAgICAgIFByb2NlZHVyZSYgbV9wcm9jZWR1cmU7CisgICAgfTsKKworICAgIFZhbHVlc0NvbGxl
Y3Rpb24gdmFsdWVzKCkgeyByZXR1cm4gVmFsdWVzQ29sbGVjdGlvbigqdGhpcyk7IH0KKworcHJp
dmF0ZToKKyAgICBWZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEJhc2ljQmxvY2s+PiBtX2Jsb2NrczsK
KyAgICBWZWN0b3I8c3RkOjp1bmlxdWVfcHRyPFZhbHVlPj4gbV92YWx1ZXM7Cit9OworCit9IH0g
Ly8gbmFtZXNwYWNlIEpTQzo6QjMKKworI2VuZGlmIC8vIEIzUHJvY2VkdXJlX2gKKwpJbmRleDog
U291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzUHJvY2VkdXJlSW5saW5lcy5oCj09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0K
LS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM1Byb2NlZHVyZUlubGluZXMuaAkocmV2aXNp
b24gMCkKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM1Byb2NlZHVyZUlubGluZXMuaAko
d29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDQ2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE1
IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBh
bmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1v
ZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29u
ZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29k
ZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlz
dCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRp
c3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHly
aWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxv
d2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIg
bWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNP
RlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVY
UFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBU
TywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRO
RVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBF
VkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBB
TlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwg
T1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywK
KyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0Yg
VVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dF
VkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElO
IENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJ
R0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAq
IE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0Yg
U1VDSCBEQU1BR0UuIAorICovCisKKyNpZm5kZWYgQjNQcm9jZWR1cmVJbmxpbmVzX2gKKyNkZWZp
bmUgQjNQcm9jZWR1cmVJbmxpbmVzX2gKKworI2luY2x1ZGUgIkIzQmFzaWNCbG9jay5oIgorI2lu
Y2x1ZGUgIkIzUHJvY2VkdXJlLmgiCisKK25hbWVzcGFjZSBKU0MgeyBuYW1lc3BhY2UgQjMgewor
Cit0ZW1wbGF0ZTx0eXBlbmFtZSBWYWx1ZVR5cGUsIHR5cGVuYW1lLi4uIEFyZ3VtZW50cz4KK1Zh
bHVlVHlwZSogUHJvY2VkdXJlOjphZGQoQXJndWVudHMuLi4gYXJndW1lbnRzKQoreworICAgIHN0
ZDo6dW5pcXVlX3B0cjxWYWx1ZVR5cGU+IHZhbHVlKG5ldyBWYWx1ZVR5cGUobV92YWx1ZXMuc2l6
ZSgpLCBhcmd1bWVudHMuLi4pKTsKKyAgICBWYWx1ZVR5cGUqIHJlc3VsdCA9IHZhbHVlLmdldCgp
OworICAgIG1fdmFsdWVzLmFwcGVuZChXVEY6Om1vdmUodmFsdWUpKTsKKyAgICByZXR1cm4gcmVz
dWx0OworfQorCit9IH0gLy8gbmFtZXNwYWNlIEpTQzo6QjMKKworI2VuZGlmIC8vIEIzUHJvY2Vk
dXJlSW5saW5lc19oCisKSW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM1N0YWNrU2xv
dFZhbHVlLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNTdGFj
a1Nsb3RWYWx1ZS5jcHAJKHJldmlzaW9uIDApCisrKyBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMv
QjNTdGFja1Nsb3RWYWx1ZS5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSw0MSBAQAorLyoK
KyAqIENvcHlyaWdodCAoQykgMjAxNSBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisg
KgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywg
d2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQg
dGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3Ry
aWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAor
ICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBk
aXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVw
cm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNv
bmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3Vt
ZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmli
dXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIGBg
QVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVE
SU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1F
UkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFS
RSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUgorICogQ09OVFJJ
QlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQ
RUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5H
LCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RT
IE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lO
RVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9G
IExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9S
VAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkg
V0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQg
T0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLiAKKyAqLworCisjaW5jbHVkZSAiY29u
ZmlnLmgiCisjaW5jbHVkZSAiQjNTdGFja1Nsb3RWYWx1ZS5oIgorCituYW1lc3BhY2UgSlNDIHsg
bmFtZXNwYWNlIEIzIHsKKworU3RhY2tTbG90VmFsdWU6On5TdGFja1Nsb3RWYWx1ZSgpCit7Cit9
CisKK3ZvaWQgU3RhY2tTbG90VmFsdWU6OmR1bXBNZXRhKFByaW50U3RyZWFtJiBvdXQpIGNvbnN0
Cit7CisgICAgb3V0LnByaW50KCJieXRlU2l6ZSA9ICIsIG1fYnl0ZVNpemUpOworfQorCit9IH0g
Ly8gbmFtZXNwYWNlIEpTQzo6QjMKKwpJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0Iz
U3RhY2tTbG90VmFsdWUuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMv
QjNTdGFja1Nsb3RWYWx1ZS5oCShyZXZpc2lvbiAwKQorKysgU291cmNlL0phdmFTY3JpcHRDb3Jl
L2IzL0IzU3RhY2tTbG90VmFsdWUuaAkod29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDY1IEBACisv
KgorICogQ29weXJpZ2h0IChDKSAyMDE1IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4K
KyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1z
LCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRl
ZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlz
dHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0
CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5n
IGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCBy
ZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2Yg
Y29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9j
dW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3Ry
aWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4g
YGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNM
VURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0Yg
TUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0Ug
QVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SCisgKiBDT05U
UklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwg
U1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJ
TkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09P
RFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVT
SU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICog
T0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBU
T1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFO
WSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNF
RCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisKKyNpZm5kZWYgQjNT
dGFja1Nsb3RWYWx1ZV9oCisjZGVmaW5lIEIzU3RhY2tTbG90VmFsdWVfaAorCisjaW5jbHVkZSAi
QjNWYWx1ZS5oIgorCituYW1lc3BhY2UgSlNDIHsgbmFtZXNwYWNlIEIzIHsKKworY2xhc3MgU3Rh
Y2tTbG90VmFsdWUgOiBwdWJsaWMgVmFsdWUgeworcHVibGljOgorICAgIHN0YXRpYyBib29sIGFj
Y2VwdHMoT3Bjb2RlIG9wY29kZSkgeyByZXR1cm4gb3Bjb2RlID09IFN0YWNrU2xvdDsgfQorCisg
ICAgflN0YWNrU2xvdFZhbHVlKCk7CisKKyAgICB1bnNpZ25lZCBieXRlU2l6ZSgpIGNvbnN0IHsg
cmV0dXJuIG1fYnl0ZVNpemU7IH0KKworICAgIC8vIFRoaXMgZ2V0cyBhc3NpZ25lZCBhdCB0aGUg
ZW5kIG9mIGNvbXBpbGF0aW9uLiBZb3UgY2Fubm90IHJlbHkgb24gaXQgaGF2aW5nIGEgbWVhbmlu
Z2Z1bAorICAgIC8vIHZhbHVlIHdoaWxlIHRoZSBjb21waWxlciBpcyBydW5uaW5nLgorICAgIGlu
dHB0cl90IG9mZnNldEZyb21GUCgpIGNvbnN0IHsgcmV0dXJuIG1fb2Zmc2V0RnJvbUZQOyB9CisK
K3Byb3RlY3RlZDoKKyAgICB2b2lkIGR1bXBNZXRhKFByaW50U3RyZWFtJikgY29uc3Qgb3ZlcnJp
ZGU7CisKK3ByaXZhdGU6CisgICAgZnJpZW5kIGNsYXNzIFByb2NlZHVyZTsKKworICAgIFN0YWNr
U2xvdFZhbHVlKHVuc2lnbmVkIGluZGV4LCBPcmlnaW4gb3JpZ2luLCB1bnNpZ25lZCBieXRlU2l6
ZSkKKyAgICAgICAgOiBWYWx1ZShpbmRleCwgU3RhY2tTbG90LCBwb2ludGVyKCksIG9yaWdpbikK
KyAgICAgICAgLCBtX2J5dGVTaXplKGJ5dGVTaXplKQorICAgICAgICAsIG1fb2Zmc2V0RnJvbUZQ
KDApCisgICAgeworICAgIH0KKworICAgIHVuc2lnbmVkIG1fYnl0ZVNpemU7CisgICAgaW50cHRy
X3QgbV9vZmZzZXRGcm9tRlA7Cit9OworCit9IH0gLy8gbmFtZXNwYWNlIEpTQzo6QjMKKworI2Vu
ZGlmIC8vIEIzU3RhY2tTbG90VmFsdWVfaAorCkluZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUv
YjMvQjNTdGFja21hcC5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRDb3JlL2Iz
L0IzU3RhY2ttYXAuY3BwCShyZXZpc2lvbiAwKQorKysgU291cmNlL0phdmFTY3JpcHRDb3JlL2Iz
L0IzU3RhY2ttYXAuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsNDAgQEAKKy8qCisgKiBD
b3B5cmlnaHQgKEMpIDIwMTUgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAq
IFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGgg
b3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQg
dGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRp
b25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAg
IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xh
aW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVj
ZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRp
b25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0
aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9u
LgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFTIElT
JycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywg
QlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFO
VEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElT
Q0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IKKyAqIENPTlRSSUJVVE9S
UyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFM
LAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVU
IE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBT
RVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJ
TlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFC
SUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAq
IChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBP
VVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRI
RSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKworI2luY2x1ZGUgImNvbmZpZy5o
IgorI2luY2x1ZGUgIkIzU3RhY2ttYXAuaCIKKworbmFtZXNwYWNlIEpTQyB7IG5hbWVzcGFjZSBC
MyB7CisKK3ZvaWQgU3RhY2ttYXA6OmR1bXAoUHJpbnRTdHJlYW0mIG91dCkgY29uc3QKK3sKKyAg
ICBvdXQucHJpbnQoCisgICAgICAgICJ7b3BhcXVlID0gIiwgUmF3UG9pbnRlcihtX29wYXF1ZSks
ICIsIHJlcHMgPSAiLCBsaXN0RHVtcChtX3JlcHMpLAorICAgICAgICAiLCBnZW5lcmF0b3IgPSAi
LCBSYXdQb2ludGVyKG1fZ2VuZXJhdG9yLmdldCgpKSwgIiwgY2xvYmJlcmVkID0gIiwgbV9jbG9i
YmVyZWQsCisgICAgICAgICIsIHVzZWRSZWdpc3RlcnMgPSAiLCBtX3VzZWRSZWdpc3RlcnMsICJ9
Iik7Cit9CisKK30gfSAvLyBuYW1lc3BhY2UgSlNDOjpCMworCkluZGV4OiBTb3VyY2UvSmF2YVNj
cmlwdENvcmUvYjMvQjNTdGFja21hcC5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0
Q29yZS9iMy9CM1N0YWNrbWFwLmgJKHJldmlzaW9uIDApCisrKyBTb3VyY2UvSmF2YVNjcmlwdENv
cmUvYjMvQjNTdGFja21hcC5oCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsMTI2IEBACisvKgor
ICogQ29weXJpZ2h0IChDKSAyMDE1IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAq
CisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3
aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0
aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJp
YnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Cisg
KiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRp
c2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXBy
b2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29u
ZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1l
bnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1
dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gYGBB
UyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJ
TkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVS
Q0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJF
IERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SCisgKiBDT05UUklC
VVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BF
Q0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcs
IEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMg
T1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5F
U1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0Yg
TElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JU
CisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBX
QVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBP
RiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisKKyNpZm5kZWYgQjNTdGFj
a21hcF9oCisjZGVmaW5lIEIzU3RhY2ttYXBfaAorCisjaW5jbHVkZSAiQjNWYWx1ZVJlcC5oIgor
I2luY2x1ZGUgIkNDYWxsSGVscGVycy5oIgorI2luY2x1ZGUgIlJlZ2lzdGVyU2V0LmgiCisjaW5j
bHVkZSA8d3RmL1NoYXJlZFRhc2suaD4KKworbmFtZXNwYWNlIEpTQyB7IG5hbWVzcGFjZSBCMyB7
CisKK2NsYXNzIEIzVmFsdWU7CisKK2NsYXNzIFN0YWNrbWFwIHsKK3B1YmxpYzoKKyAgICBzdHJ1
Y3QgR2VuZXJhdGlvblBhcmFtcyB7CisgICAgICAgIC8vIFRoaXMgaXMgdGhlIFZhbHVlIGNvbnRh
aW5pbmcgdGhlIHN0YWNrbWFwLgorICAgICAgICBWYWx1ZSogdmFsdWU7CisKKyAgICAgICAgLy8g
VGhpcyBpcyB0aGUgc3RhY2ttYXAuCisgICAgICAgIFN0YWNrbWFwKiBzdGFja21hcDsKKworICAg
ICAgICAvLyBUaGlzIGlzIHRoZSBqdW1wIHRvIHRoZSBzbG93IHBhdGgsIGlmIHRoaXMgaXMgYSBz
dGFja21hcCBmb3IgYSBDaGVjayB2YWx1ZS4KKyAgICAgICAgQ0NhbGxIZWxwZXJzOjpKdW1wIGp1
bXA7CisKKyAgICAgICAgLy8gVGhpcyB0ZWxscyB5b3UgdGhlIGFjdHVhbCB2YWx1ZSByZXByZXNl
bnRhdGlvbnMgdGhhdCB3ZXJlIGNob3Nlbi4KKyAgICAgICAgVmVjdG9yPFZhbHVlUmVwPiByZXBz
OworCisgICAgICAgIC8vIFRoaXMgdGVsbHMgeW91IHRoZSByZWdpc3RlcnMgdGhhdCB3ZXJlIHVz
ZWQuCisgICAgICAgIFJlZ2lzdGVyU2V0IHVzZWRSZWdpc3RlcnM7CisgICAgfTsKKyAgICAKKyAg
ICB0eXBlZGVmIHZvaWQgR2VuZXJhdG9yRnVuY3Rpb24oQ0NhbGxIZWxwZXJzJiwgY29uc3QgR2Vu
ZXJhdGlvblBhcmFtcyYpOworICAgIHR5cGVkZWYgU2hhcmVkVGFzazxHZW5lcmF0b3JGdW5jdGlv
bj4gR2VuZXJhdG9yOworICAgIAorICAgIFN0YWNrbWFwKCkKKyAgICB7CisgICAgfQorCisgICAg
Ly8gU2V0IHNvbWUgb3BhcXVlIGRhdGEgdG8gaWRlbnRpZnkgdGhpcyBzdGFja21hcC4gVGhpcyBp
cyB1c2VmdWwgYmVjYXVzZSBhIFN0YWNrbWFwLXVzaW5nIFZhbHVlCisgICAgLy8gY2FuIGJlIGR1
cGxpY2F0ZWQsIGFuZCBlYWNoIGR1cGxpY2F0ZSBtYXkgZW5kIHVwIGhhdmluZyBkaWZmZXJlbnQg
cmVnaXN0ZXIgYWxsb2NhdGlvbi4gVGhpcworICAgIC8vIGFsbG93cyBhbGwgb2YgdGhvc2UgZHVw
bGljYXRlcyB0byBiZSBhYmxlIHRvIHJlZmVyIGJhY2sgdG8gd2hhdGV2ZXIgaGlnaC1sZXZlbCBk
YXRhIHN0cnVjdHVyZXMKKyAgICAvLyB3ZSB3ZXJlIHVzaW5nIHRvIGNyZWF0ZSB0aGUgdmFsdWUu
CisgICAgdm9pZCBzZXRPcGFxdWUodm9pZCogcGFyYW1ldGVyKQorICAgIHsKKyAgICAgICAgbV9v
cGFxdWUgPSBwYXJhbWV0ZXI7CisgICAgfQorICAgIHZvaWQqIG9wYXF1ZSgpIGNvbnN0IHsgcmV0
dXJuIG1fb3BhcXVlOyB9CisKKyAgICAvLyBDb252ZW5pZW5jZSBoZWxwZXJzIHdoZW4gdXNpbmcg
aW5kaWNlcyBpbnN0ZWFkIG9mIHBvaW50ZXJzLgorICAgIHZvaWQgc2V0T3BhcXVlSW5kZXgoc2l6
ZV90IGluZGV4KQorICAgIHsKKyAgICAgICAgc2V0T3BhcXVlKGJpdHdpc2VfY2FzdDx2b2lkKj4o
aW5kZXgpKTsKKyAgICB9CisgICAgc2l6ZV90IG9wYXF1ZUluZGV4KCkgY29uc3QgeyByZXR1cm4g
Yml0d2lzZV9jYXN0PHNpemVfdD4ob3BhcXVlKCkpOyB9CisKKyAgICAvLyBDb25zdHJhaW4gYW4g
YXJndW1lbnQgdG8gdGhlIFZhbHVlIHRoYXQgdXNlcyB0aGlzIFN0YWNrbWFwLiBOb3RlIHRoYXQg
aW5kZXggemVybyByZWZlcnMgdG8gdGhlCisgICAgLy8gZmlyc3QgYXJndW1lbnQgdG8gdGhhdCBW
YWx1ZSwgZXZlbiBpZiB0aGF0IGFyZ3VtZW50IGlzIG5vdCBjb25zdHJhaW5hYmxlLiBGb3IgZXhh
bXBsZSwgaW4gYQorICAgIC8vIENoZWNrQWRkIHZhbHVlLCBpdCB3b3VsZCBiZSBhbiBlcnJvciB0
byBjb25zdHJhaW4gaW5kaWNlcyAwIGFuZCAxLiBJbiBhIENoZWNrIHZhbHVlLCBpdCB3b3VsZAor
ICAgIC8vIGJlIGFuIGVycm9yIHRvIGNvbnN0cmFpbiBpbmRleCAwLiBCdXQsIHdoZW4gdGhlIGdl
bmVyYXRpb24gY2FsbGJhY2sgaXMgY2FsbGVkLCB5b3UgY2FuIGRlcGVuZAorICAgIC8vIG9uIHRo
ZSByZXBzIGZvciB0aG9zZSBpbmRpY2VzIGJlaW5nIGZpbGxlZCBpbi4KKyAgICB2b2lkIGNvbnN0
cmFpbih1bnNpZ25lZCBpbmRleCwgY29uc3QgVmFsdWVSZXAmIHJlcCkKKyAgICB7CisgICAgICAg
IGlmIChpbmRleCArIDEgPCBtX3JlcHMuc2l6ZSgpKQorICAgICAgICAgICAgbV9yZXBzLmdyb3co
aW5kZXggKyAxKTsKKyAgICAgICAgbV9yZXBzW2luZGV4XSA9IHJlcDsKKyAgICB9CisKKyAgICB2
b2lkIGNsb2JiZXIoY29uc3QgUmVnaXN0ZXJTZXQmIHNldCkKKyAgICB7CisgICAgICAgIG1fY2xv
YmJlcmVkLm1lcmdlKHNldCk7CisgICAgfQorCisgICAgY29uc3QgUmVnaXN0ZXJTZXQmIGNsb2Ji
ZXJlZCgpIGNvbnN0IHsgcmV0dXJuIG1fY2xvYmJlcmVkOyB9CisKKyAgICB2b2lkIHNldEdlbmVy
YXRvcihSZWZQdHI8R2VuZXJhdG9yPiBnZW5lcmF0b3IpCisgICAgeworICAgICAgICBtX2dlbmVy
YXRvciA9IGdlbmVyYXRvcjsKKyAgICB9CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBGdW5jdG9y
PgorICAgIHZvaWQgc2V0R2VuZXJhdG9yKGNvbnN0IEZ1bmN0b3ImIGZ1bmN0b3IpCisgICAgewor
ICAgICAgICBtX2dlbmVyYXRvciA9IGNyZWF0ZVNoYXJlZFRhc2s8R2VuZXJhdG9yRnVuY3Rpb24+
KGZ1bmN0b3IpOworICAgIH0KKworICAgIHZvaWQgZHVtcChQcmludFN0cmVhbSYpIGNvbnN0Owor
ICAgIAorcHJpdmF0ZToKKyAgICBmcmllbmQgY2xhc3MgU3RhY2ttYXBTcGVjaWFsOworICAgIAor
ICAgIHZvaWQqIG1fb3BhcXVlIHsgbnVsbHB0ciB9OworICAgIFZlY3RvcjxWYWx1ZVJlcD4gbV9y
ZXBzOworICAgIFJlZlB0cjxHZW5lcmF0b3I+IG1fZ2VuZXJhdG9yOworICAgIFJlZ2lzdGVyU2V0
IG1fY2xvYmJlcmVkOworICAgIFJlZ2lzdGVyU2V0IG1fdXNlZFJlZ2lzdGVyczsgLy8gU3RhY2tt
YXBzIGNvdWxkIGJlIGZ1cnRoZXIgZHVwbGljYXRlZCBieSBBaXIsIGJ1dCB0aGF0J3MgdW5saWtl
bHksIHNvIHdlIGp1c3QgbWVyZ2UgdGhlIHVzZWQgcmVnaXN0ZXJzIHNldHMgaWYgdGhhdCB3ZXJl
IHRvIGhhcHBlbi4KK307CisKK30gfSAvLyBuYW1lc3BhY2UgSlNDOjpCMworCisjZW5kaWYgLy8g
QjNTdGFja21hcF9oCisKSW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM1N0YWNrbWFw
U3BlY2lhbC5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzU3Rh
Y2ttYXBTcGVjaWFsLmNwcAkocmV2aXNpb24gMCkKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9i
My9CM1N0YWNrbWFwU3BlY2lhbC5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSwxNzYgQEAK
Ky8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTUgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVk
LgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9y
bXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3Zp
ZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVk
aXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmln
aHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dp
bmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0
IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBv
ZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBk
b2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlz
dHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5D
LiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElO
Q0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBP
RiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9T
RSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IKKyAqIENP
TlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFM
LCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xV
RElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBH
T09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBC
VVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisg
KiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9S
IFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4g
QU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJ
U0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKworI2luY2x1ZGUg
ImNvbmZpZy5oIgorI2luY2x1ZGUgIkIzU3RhY2ttYXBTcGVjaWFsLmgiCisKK25hbWVzcGFjZSBK
U0MgeyBuYW1lc3BhY2UgQjMgeworCit1c2luZyBuYW1lc3BhY2UgQWlyOworCitTdGFja21hcFNw
ZWNpYWw6OlN0YWNrbWFwU3BlY2lhbChjb25zdCBjaGFyKiBuYW1lKQorICAgIDogU3BlY2lhbChu
YW1lKQoreworfQorCitTdGFja21hcFNwZWNpYWw6On5TdGFja21hcFNwZWNpYWwoKQoreworfQor
Cit2b2lkIFN0YWNrbWFwU3BlY2lhbDo6Zm9yRWFjaEFyZyhJbnN0JiBpbnN0LCBjb25zdCBTY29w
ZWRMYW1iZGE8SW5zdDo6RWFjaEFyZ0NhbGxiYWNrPiYgY2FsbGJhY2spCit7CisgICAgVmFsdWUq
IHZhbHVlID0gaW5zdC5vcmlnaW47CisKKyAgICAvLyBDaGVjayB0aGF0IGluc2FuZSB0aGluZ3Mg
aGF2ZSBub3QgaGFwcGVuZWQuCisgICAgQVNTRVJUKGluc3QuYXJncy5zaXplKCkgPT0gdmFsdWUt
PmNoaWxkcmVuLnNpemUoKSArIDEpOworICAgIAorICAgIGZvciAodW5zaWduZWQgaSA9IDE7IGkg
PCBpbnN0LmFyZ3Muc2l6ZSgpOyArK2kpIHsKKyAgICAgICAgQXJnJiBhcmcgPSBpbnN0LmFyZ3Nb
aV07CisgICAgICAgIFZhbHVlKiBjaGlsZCA9IHZhbHVlLT5jaGlsZChpIC0gMSk7CisKKyAgICAg
ICAgY2FsbGJhY2soYXJnLCBBcmc6OlVzZSwgQXJnOjp0eXBlRm9yQjNUeXBlKGNoaWxkLT50eXBl
KCkpKTsKKyAgICB9Cit9CisKK2Jvb2wgU3RhY2ttYXBTcGVjaWFsOjppc1ZhbGlkKEluc3QmIGlu
c3QpCit7CisgICAgLy8gV2Ugc2hvdWxkIGhhdmUgYWxyZWFkeSB2YWxpZGF0ZWQgdGhhdCBpdCBo
YXMgYXQgbGVhc3Qgb25lIGFyZywgdGhlIFNwZWNpYWwuCisgICAgQVNTRVJUKGluc3QuYXJncy5z
aXplKCkpOworCisgICAgVmFsdWUqIHZhbHVlID0gaW5zdC5vcmlnaW47CisgICAgU3RhY2ttYXAq
IHN0YWNrbWFwID0gdmFsdWUtPnN0YWNrbWFwKCk7CisKKyAgICBBU1NFUlQoc3RhY2ttYXApOwor
CisgICAgLy8gVGhlIG9ubHkga2luZCBvZiBhcmd1bWVudCB0aGF0IGEgc3RhY2ttYXAgd291bGQg
YWx3YXlzIGJlIHVuaGFwcHkgd2l0aCBpcyBhIFNwZWNpYWwuIEJ1dCwgd2UKKyAgICAvLyBleGhh
dXN0aXZlbHkgb3B0IGludG8gZXZlcnl0aGluZyB3ZSBrbm93IHdlIGNhbiBoYW5kbGUuIEl0IG1h
a2VzIHRoaW5ncyBlYXNpZXIgbGF0ZXIuIEFsc28sCisgICAgLy8gdGhpcyBsb29wIHZlcmlmaWVz
IGFyZ3VtZW50IHR5cGUuCisgICAgZm9yICh1bnNpZ25lZCBpID0gMTsgaSA8IGluc3QuYXJncy5z
aXplKCk7ICsraSkgeworICAgICAgICBWYWx1ZSogY2hpbGQgPSB2YWx1ZS0+Y2hpbGQoaSk7Cisg
ICAgICAgIEFyZyYgYXJnID0gaW5zdC5hcmdzW2kgKyAxXTsKKyAgICAgICAgCisgICAgICAgIHN3
aXRjaCAoYXJnLmtpbmQoKSkgeworICAgICAgICBjYXNlIEFyZzo6VG1wOgorICAgICAgICBjYXNl
IEFyZzo6SW1tOgorICAgICAgICBjYXNlIEFyZzo6SW1tUHRyOgorICAgICAgICBjYXNlIEFyZzo6
QWRkcjoKKyAgICAgICAgY2FzZSBBcmc6OlN0YWNrOgorICAgICAgICBjYXNlIEFyZzo6Q2FsbEFy
ZzoKKyAgICAgICAgY2FzZSBBcmc6OkluZGV4OgorICAgICAgICAgICAgYnJlYWs7IC8vIE9LCisg
ICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAg
ICAgICAgCisgICAgICAgIEFyZzo6VHlwZSB0eXBlID0gQXJnOjp0eXBlRm9yQjNUeXBlKGNoaWxk
LT50eXBlKCkpOworCisgICAgICAgIGlmICghYXJnLmlzVHlwZSh0eXBlKSkKKyAgICAgICAgICAg
IHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICAvLyBUaGUgbnVtYmVyIG9mIGNvbnN0cmFpbnRz
IGhhcyB0byBiZSBubyBncmVhdGVyIHRoYW4gdGhlIG51bWJlciBvZiBCMyBjaGlsZHJlbi4KKyAg
ICBBU1NFUlQoc3RhY2ttYXAtPm1fcmVwcy5zaXplKCkgPD0gdmFsdWUtPmNoaWxkcmVuLnNpemUo
KSk7CisKKyAgICAvLyBXZSBtdXN0IGhhdmUgdGhlIHJpZ2h0IG51bWJlciBvZiBvcGVyYW5kcy4K
KyAgICBpZiAoaW5zdC5hcmdzLnNpemUoKSAhPSB2YWx1ZS0+Y2hpbGRyZW4uc2l6ZSgpICsgMSkK
KyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgLy8gVmVyaWZ5IGFueSBleHBsaWNpdGx5IHN1
cHBsaWVkIGNvbnN0cmFpbnRzLgorICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBzdGFja21h
cC0+bV9yZXBzLnNpemUoKTsgKytpKSB7CisgICAgICAgIFZhbHVlKiBjaGlsZCA9IHZhbHVlLT5j
aGlsZChpKTsKKyAgICAgICAgVmFsdWVSZXAmIHJlcCA9IHN0YWNrbWFwLT5tX3JlcHNbaV07Cisg
ICAgICAgIEFyZyYgYXJnID0gaW5zdC5hcmdzW2kgKyAxXTsKKworICAgICAgICBzd2l0Y2ggKHJl
cC5raW5kKCkpIHsKKyAgICAgICAgY2FzZSBWYWx1ZVJlcDo6QW55OgorICAgICAgICAgICAgYnJl
YWs7CisgICAgICAgIGNhc2UgVmFsdWVSZXA6OlNvbWVSZWdpc3RlcjoKKyAgICAgICAgICAgIGlm
ICghYXJnLmlzVG1wKCkpCisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAg
ICAgYnJlYWs7CisgICAgICAgIGNhc2UgVmFsdWVSZXA6OlJlZ2lzdGVyOgorICAgICAgICAgICAg
aWYgKGFyZyAhPSBUbXAocmVwLnJlZygpKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7
CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBWYWx1ZVJlcDo6U3RhY2s6CisgICAg
ICAgICAgICAvLyBUaGlzIGlzIG5vdCBhIHZhbGlkIGlucHV0IHJlcHJlc2VudGF0aW9uLgorICAg
ICAgICAgICAgQVNTRVJUX05PVF9SRUFDSEVEKCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAg
ICAgY2FzZSBWYWx1ZVJlcDo6U3RhY2tBcmd1bWVudDoKKyAgICAgICAgICAgIGlmIChhcmcgIT0g
QXJnOjpjYWxsQXJnKHJlcC5vZmZzZXRGcm9tU1AoKSkpCisgICAgICAgICAgICAgICAgcmV0dXJu
IGZhbHNlOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgVmFsdWVSZXA6OkNvbnN0
YW50OgorICAgICAgICAgICAgLy8gVGhpcyBpcyBub3QgYSB2YWxpZCBpbnB1dCByZXByZXNlbnRh
dGlvbi4KKyAgICAgICAgICAgIEFTU0VSVF9OT1RfUkVBQ0hFRCgpOworICAgICAgICAgICAgYnJl
YWs7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBTdGFj
a21hcFNwZWNpYWw6OmFkbWl0c1N0YWNrKEluc3QmIGluc3QsIHVuc2lnbmVkIGFyZ0luZGV4KQor
eworICAgIFZhbHVlKiB2YWx1ZSA9IGluc3Qub3JpZ2luOworICAgIFN0YWNrbWFwKiBzdGFja21h
cCA9IHZhbHVlLT5zdGFja21hcCgpOworCisgICAgdW5zaWduZWQgc3RhY2ttYXBBcmdJbmRleCA9
IGFyZ0luZGV4IC0gMTsKKworICAgIGlmIChzdGFja21hcEFyZ0luZGV4ID49IHN0YWNrbWFwLT5t
X3JlcHMuc2l6ZSgpKSB7CisgICAgICAgIC8vIFRoaXMgbWVhbnMgdGhhdCB0aGVyZSB3YXMgbm8g
Y29uc3RyYWludC4KKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIAorICAgIC8vIFdl
IG9ubHkgYWRtaXQgc3RhY2sgZm9yIEFueSdzLCBzaW5jZSBTdGFjayBpcyBub3QgYSB2YWxpZCBp
bnB1dCBjb25zdHJhaW50LCBhbmQgU3RhY2tBcmd1bWVudAorICAgIC8vIHRyYW5zbGF0ZXMgdG8g
YSBDYWxsQXJnIGluIEFpci4KKyAgICBpZiAoc3RhY2ttYXAtPm1fcmVwc1tzdGFja21hcEFyZ0lu
ZGV4XS5raW5kKCkgPT0gQW55KQorICAgICAgICByZXR1cm4gdHJ1ZTsKKworICAgIHJldHVybiBm
YWxzZTsKK30KKwordm9pZCBTdGFja21hcFNwZWNpYWw6OnJlcG9ydFVzZWRyZWdpc3RlcnMoSW5z
dCYgaW5zdCwgY29uc3QgUmVnaXN0ZXJTZXQmIHVzZWRSZWdpc3RlcnMpCit7CisgICAgVmFsdWUq
IHZhbHVlID0gaW5zdC5vcmlnaW47CisgICAgU3RhY2ttYXAqIHN0YWNrbWFwID0gdmFsdWUtPnN0
YWNrbWFwKCk7CisKKyAgICAvLyBGSVhNRTogSWYgdGhlIEluc3QgdGhhdCB1c2VzIHRoZSBTdGFj
a21hcFNwZWNpYWwgZ2V0cyBkdXBsaWNhdGVkLCB0aGVuIHdlIGVuZCB1cCBtZXJnaW5nIHVzZWQK
KyAgICAvLyByZWdpc3RlciBzZXRzIGZyb20gbXVsdGlwbGUgcGxhY2VzLiBUaGlzIGN1cnJlbnRs
eSB3b24ndCBoYXBwZW4gc2luY2UgQWlyIGRvZXNuJ3QgaGF2ZSB0YWlsZHVwCisgICAgLy8gb3Ig
dGhpbmdzIGxpa2UgdGhhdC4gQnV0IG1heWJlIGV2ZW50dWFsbHkgaXQgY291bGQgYmUgYSBwcm9i
bGVtLgorICAgIHN0YWNrbWFwLT5tX3VzZWRSZWdpc3RlcnMubWVyZ2UodXNlZFJlZ2lzdGVycyk7
Cit9CisKK2NvbnN0IFJlZ2lzdGVyU2V0JiBTdGFja21hcFNwZWNpYWw6OmV4dHJhQ2xvYmJlcmVk
UmVncyhJbnN0JiBpbnN0KQoreworICAgIFZhbHVlKiB2YWx1ZSA9IGluc3Qub3JpZ2luOworICAg
IFN0YWNrbWFwKiBzdGFja21hcCA9IHZhbHVlLT5zdGFja21hcCgpOworCisgICAgcmV0dXJuIHN0
YWNrbWFwLT5jbG9iYmVyZWQoKTsKK30KKworfSB9IC8vIG5hbWVzcGFjZSBKU0M6OkIzCisKKwpJ
bmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzU3RhY2ttYXBTcGVjaWFsLmgKPT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzU3RhY2ttYXBTcGVjaWFsLmgJKHJl
dmlzaW9uIDApCisrKyBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNTdGFja21hcFNwZWNpYWwu
aAkod29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDU3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAy
MDE1IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlv
biBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAq
IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcg
Y29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2Ug
Y29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMg
bGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBS
ZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNv
cHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZv
bGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3Ro
ZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElT
IFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAq
IEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRF
RCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBG
SVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBO
TyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZP
UiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFS
WSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBU
TywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1Mg
T0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBI
T1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVS
IElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5F
R0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UK
KyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkg
T0YgU1VDSCBEQU1BR0UuIAorICovCisKKyNpZm5kZWYgQjNTdGFja21hcFNwZWNpYWxfaAorI2Rl
ZmluZSBCM1N0YWNrbWFwU3BlY2lhbF9oCisKKyNpbmNsdWRlICJBaXJTcGVjaWFsLmgiCisjaW5j
bHVkZSAiQjNTdGFja21hcC5oIgorCituYW1lc3BhY2UgSlNDIHsgbmFtZXNwYWNlIEIzIHsKKwor
Ly8gVGhpcyBpcyBhIGJhc2UgY2xhc3MgZm9yIHNwZWNpYWxzIHRoYXQgaGF2ZSBzdGFja21hcHMu
IE5vdGUgdGhhdCBpdCBjYW4gZmluZCB0aGUgU3RhY2ttYXAgYnkKKy8vIGFza2luZyBmb3IgdGhl
IEluc3QncyBvcmlnaW4uIEhlbmNlLCB0aGVzZSBvYmplY3RzIGRvbid0IG5lZWQgdG8gZXZlbiBo
b2xkIGEgcmVmZXJlbmNlIHRvIHRoZQorLy8gU3RhY2ttYXAuCisKK2NsYXNzIFN0YWNrbWFwU3Bl
Y2lhbCA6IHB1YmxpYyBBaXI6OlNwZWNpYWwgeworcHVibGljOgorICAgIFN0YWNrbWFwU3BlY2lh
bChjb25zdCBjaGFyKiBuYW1lKTsKKyAgICB2aXJ0dWFsIH5TdGFja21hcFNwZWNpYWwoKTsKKwor
cHJvdGVjdGVkOgorICAgIHZvaWQgZm9yRWFjaEFyZyhBaXI6Okluc3QmLCBjb25zdCBTY29wZWRM
YW1iZGE8QWlyOjpJbnN0OjpFYWNoQXJnQ2FsbGJhY2s+Jikgb3ZlcnJpZGU7CisgICAgYm9vbCBp
c1ZhbGlkKEFpcjo6SW5zdCYpIG92ZXJyaWRlOworICAgIGJvb2wgYWRtaXRzU3RhY2soQWlyOjpJ
bnN0JiwgdW5zaWduZWQgYXJnSW5kZXgpIG92ZXJyaWRlOworICAgIHZvaWQgcmVwb3J0VXNlZFJl
Z2lzdGVycyhBaXI6Okluc3QmLCBjb25zdCBSZWdpc3RlclNldCYpIG92ZXJyaWRlOworICAgIGNv
bnN0IFJlZ2lzdGVyU2V0JiBleHRyYUNsb2JiZXJlZFJlZ3MoQWlyOjpJbnN0Jikgb3ZlcnJpZGU7
ICAgIAorCisgICAgLy8gTm90ZSB0aGF0IHRoaXMgZG9lcyBub3Qgb3ZlcnJpZGUgZ2VuZXJhdGUo
KSBvciBkZWVwRHVtcEltcGwoKS4gV2UgaGF2ZSBtYW55IHNvbWUgc3ViY2xhc3NlcworICAgIC8v
IHRoYXQgaW1wbGVtZW50IHRoYXQuCit9OworCit9IH0gLy8gbmFtZXNwYWNlIEpTQzo6QjMKKwor
I2VuZGlmIC8vIEIzU3RhY2ttYXBTcGVjaWFsX2gKKwpJbmRleDogU291cmNlL0phdmFTY3JpcHRD
b3JlL2IzL0IzU3dpdGNoQ2FzZS5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRD
b3JlL2IzL0IzU3dpdGNoQ2FzZS5jcHAJKHJldmlzaW9uIDApCisrKyBTb3VyY2UvSmF2YVNjcmlw
dENvcmUvYjMvQjNTd2l0Y2hDYXNlLmNwcAkod29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDM5IEBA
CisvKgorICogQ29weXJpZ2h0IChDKSAyMDE1IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZl
ZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZv
cm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92
aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJl
ZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJp
Z2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93
aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVz
dCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qg
b2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAg
ZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRp
c3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElO
Qy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJ
TkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMg
T0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBP
U0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SCisgKiBD
T05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRB
TCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNM
VURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUg
R09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1Ig
QlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQor
ICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBP
UiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElO
IEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURW
SVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisKKyNpbmNsdWRl
ICJjb25maWcuaCIKKyNpbmNsdWRlICJCM1N3aXRjaENhc2UuaCIKKworI2luY2x1ZGUgIkIzQmFz
aWNCbG9jay5oIgorCituYW1lc3BhY2UgSlNDIHsgbmFtZXNwYWNlIEIzIHsKKwordm9pZCBTd2l0
Y2hDYXNlOjpkdW1wKFByaW50U3RyZWFtJiBvdXQpIGNvbnN0Cit7CisgICAgb3V0LnByaW50KG1f
Y2FzZVZhbHVlLCAiLT4iLCBwb2ludGVyRHVtcChtX3RhcmdldCkpOworfQorCit9IH0gLy8gbmFt
ZXNwYWNlIEpTQzo6QjMKKwpJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzU3dpdGNo
Q2FzZS5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM1N3aXRjaENh
c2UuaAkocmV2aXNpb24gMCkKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM1N3aXRjaENh
c2UuaAkod29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDYzIEBACisvKgorICogQ29weXJpZ2h0IChD
KSAyMDE1IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1
dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQK
KyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dp
bmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3Vy
Y2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRo
aXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAy
LiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3Zl
IGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhl
IGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Ig
b3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBU
SElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkK
KyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElN
SVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFO
RCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJ
TiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxF
IEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1Q
TEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRF
RCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExP
U1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9O
KSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVU
SEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5H
IE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBV
U0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJ
VFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisKKyNpZm5kZWYgQjNTd2l0Y2hDYXNlX2gKKyNkZWZp
bmUgQjNTd2l0Y2hDYXNlX2gKKworI2luY2x1ZGUgPHd0Zi9TdGRMaWJFeHRyYXMuaD4KKyNpbmNs
dWRlIDx3dGYvUHJpbnRTdHJlYW0uaD4KKworbmFtZXNwYWNlIEpTQyB7IG5hbWVzcGFjZSBCMyB7
CisKK2NsYXNzIEJhc2ljQmxvY2s7CisKK2NsYXNzIFN3aXRjaENhc2UgeworcHVibGljOgorICAg
IFN3aXRjaENhc2UoKQorICAgIHsKKyAgICB9CisKKyAgICBTd2l0Y2hDYXNlKGludDY0X3QgY2Fz
ZVZhbHVlLCBCYXNpY0Jsb2NrKiB0YXJnZXQpCisgICAgICAgIDogbV9jYXNlVmFsdWUoY2FzZVZh
bHVlKQorICAgICAgICAsIG1fdGFyZ2V0KHRhcmdldCkKKyAgICB7CisgICAgfQorCisgICAgZXhw
bGljaXQgb3BlcmF0b3IgYm9vbCgpIGNvbnN0IHsgcmV0dXJuICEhbV90YXJnZXQ7IH0KKworICAg
IGludDY0X3QgY2FzZVZhbHVlKCkgY29uc3QgeyByZXR1cm4gbV9jYXNlVmFsdWU7IH0KKyAgICBC
YXNpY0Jsb2NrKiB0YXJnZXQoKSBjb25zdCB7IHJldHVybiBtX3RhcmdldDsgfQorCisgICAgdm9p
ZCBkdW1wKFByaW50U3RyZWFtJiBvdXQpIGNvbnN0OworCitwcml2YXRlOgorICAgIGludDY0X3Qg
Y2FzZVZhbHVlOworICAgIEJhc2ljQmxvY2sqIHRhcmdldDsKK307CisKK30gfSAvLyBuYW1lc3Bh
Y2UgSlNDOjpCMworCisjZW5kaWYgLy8gQjNTd2l0Y2hDYXNlX2gKKwpJbmRleDogU291cmNlL0ph
dmFTY3JpcHRDb3JlL2IzL0IzU3dpdGNoVmFsdWUuY3BwCj09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9K
YXZhU2NyaXB0Q29yZS9iMy9CM1N3aXRjaFZhbHVlLmNwcAkocmV2aXNpb24gMCkKKysrIFNvdXJj
ZS9KYXZhU2NyaXB0Q29yZS9iMy9CM1N3aXRjaFZhbHVlLmNwcAkod29ya2luZyBjb3B5KQpAQCAt
MCwwICsxLDYzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE1IEFwcGxlIEluYy4gQWxsIHJp
Z2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBh
bmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBl
cm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1l
dDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUg
YWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFu
ZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmlu
YXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNl
LCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGlu
IHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVk
IHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVE
IEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBX
QVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVE
IFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VM
QVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJ
TkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVD
VCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBE
QU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9G
IFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICog
UFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04g
QU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1Qg
TElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNF
KSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUs
IEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICov
CisKKyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNsZHVlICJCM1N3aXRjaFZhbHVlLmgiCisKK25h
bWVzcGFjZSBKU0MgeyBuYW1lc3BhY2UgQjMgeworCitTd2l0Y2hWYWx1ZTo6flN3aXRjaFZhbHVl
KCkKK3sKK30KKworU3dpdGNoQ2FzZSBTd2l0Y2hWYWx1ZTo6cmVtb3ZlQ2FzZSh1bnNpZ25lZCBp
bmRleCkKK3sKKyAgICBTd2l0Y2hDYXNlIHJlc3VsdCA9IG1fc3VjY2Vzc29yc1tpbmRleF07Cisg
ICAgbV9zdWNjZXNzb3JzW2luZGV4XSA9IG1fc3VjY2Vzc29ycy5sYXN0KCk7CisgICAgbV9zdWNj
ZXNzb3JzLnJlbW92ZUxhc3QoKTsKKyAgICByZXR1cm4gcmVzdWx0OworfQorCit2b2lkIFN3aXRj
aFZhbHVlOjphcHBlbmRDYXNlKGNvbnN0IFN3aXRjaENhc2UmIHN3aXRjaENhc2UpCit7CisgICAg
bV9zdWNjZXNzb3JzLmFwcGVuZChtX3N1Y2Nlc3NvcnMubGFzdCgpKTsKKyAgICBtX3N1Y2Nlc3Nv
cnNbbV9zdWNjZXNzb3JzLnNpemUoKSAtIDJdID0gc3dpdGNoQ2FzZS50YXJnZXQoKTsKKyAgICBt
X3ZhbHVlcy5hcHBlbmQoc3dpdGNoQ2FzZS5jYXNlVmFsdWUoKSk7Cit9CisKK3ZvaWQgU3dpdGNo
VmFsdWU6OmR1bXBNZXRhKFByaW50U3RyZWFtJiBvdXQpIGNvbnN0Cit7CisgICAgLy8gVGhpcyBk
ZXN0cnVjdGl2ZWx5IG92ZXJyaWRlcyBDb250cm9sVmFsdWUncyBkdW1wTWV0YSgpLgorICAgIG91
dC5wcmludChsaXN0RHVtcCgqdGhpcykpOworfQorCitTd2l0Y2hWYWx1ZTo6U3dpdGNoVmFsdWUo
dW5zaWduZWQgaW5kZXgsIE9yaWdpbiBvcmlnaW4sIEJhc2ljQmxvY2sqIGZhbGxUaHJvdWdoKQor
ICAgIDogQ29udHJvbFZhbHVlKGluZGV4LCBTd2l0Y2gsIG9yaWdpbikKK3sKKyAgICBtX3N1Y2Nl
c3NvcnMuYXBwZW5kKGZhbGxUaHJvdWdoKTsKK30KKworfSB9IC8vIG5hbWVzcGFjZSBKU0M6OkIz
CisKSW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM1N3aXRjaFZhbHVlLmgKPT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzU3dpdGNoVmFsdWUuaAkocmV2aXNp
b24gMCkKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM1N3aXRjaFZhbHVlLmgJKHdvcmtp
bmcgY29weSkKQEAgLTAsMCArMSwxMjMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTUgQXBw
bGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1
c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZp
Y2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRp
b25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11
c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9m
IGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJp
YnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0
CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5n
IGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRl
cmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdB
UkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVT
UyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBU
SEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1Mg
Rk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5U
IFNIQUxMIEFQUExFIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBE
SVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBD
T05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICog
UFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0Us
IERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIg
Q0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09O
VFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5D
RSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0Yg
VEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNI
IERBTUFHRS4gCisgKi8KKworI2lmbmRlZiBCM1N3aXRjaFZhbHVlX2gKKyNkZWZpbmUgQjNTd2l0
Y2hWYWx1ZV9oCisKKyNpbmNsdWRlICJCM0NvbnRyb2xWYWx1ZS5oIgorI2luY2x1ZGUgIkIzU3dp
dGNoQ2FzZS5oIgorCituYW1lc3BhY2UgSlNDIHsgbmFtZXNwYWNlIEIzIHsKKworY2xhc3MgU3dp
dGNoVmFsdWUgOiBwdWJsaWMgQ29udHJvbFZhbHVlIHsKK3B1YmxpYzoKKyAgICBzdGF0aWMgYm9v
bCBhY2NlcHRzKE9wY29kZSBvcGNvZGUpIHsgcmV0dXJuIG9wY29kZSA9PSBTd2l0Y2g7IH0KKwor
ICAgIH5Td2l0Y2hWYWx1ZSgpOworCisgICAgLy8gbnVtQ2FzZVZhbHVlcygpICsgMSA9PSBudW1T
dWNjZXNzb3JzKCkuCisgICAgdW5zaWduZWQgbnVtQ2FzZVZhbHVlcygpIGNvbnN0IHsgcmV0dXJu
IG1fdmFsdWVzLnNpemUoKTsgfQorCisgICAgLy8gVGhlIHN1Y2Nlc3NvciBmb3IgdGhpcyBjYXNl
IHZhbHVlIGlzIGF0IHRoZSBzYW1lIGluZGV4LgorICAgIGludDY0X3QgY2FzZVZhbHVlKHVuc2ln
bmVkIGluZGV4KSBjb25zdCB7IHJldHVybiBtX3ZhbHVlc1tpXTsgfQorICAgIAorICAgIGNvbnN0
IFZlY3RvcjxpbnQ2NF90PiYgY2FzZVZhbHVlcygpIGNvbnN0IHsgcmV0dXJuIG1fdmFsdWVzOyB9
CisKKyAgICBCYXNpY0Jsb2NrKiBmYWxsVGhyb3VnaCgpIGNvbnN0IHsgcmV0dXJuIHN1Y2Nlc3Nv
cnMoKS5sYXN0KCk7IH0KKyAgICBCYXNpY0Jsb2NrKiYgZmFsbFRocm91Z2goKSB7IHJldHVybiBz
dWNjZXNzb3JzKCkubGFzdCgpOyB9CisKKyAgICB1bnNpZ25lZCBzaXplKCkgY29uc3QgeyByZXR1
cm4gbnVtQ2FzZVZhbHVlcygpOyB9CisgICAgU3dpdGNoQ2FzZSBhdCh1bnNpZ25lZCBpbmRleCkg
Y29uc3QKKyAgICB7CisgICAgICAgIHJldHVybiBTd2l0Y2hDYXNlKGNhc2VWYWx1ZShpbmRleCks
IHN1Y2Nlc3NvcihpbmRleCkpOworICAgIH0KKyAgICBTd2l0Y2hDYXNlIG9wZXJhdG9yW10odW5z
aWduZWQgaW5kZXgpIGNvbnN0CisgICAgeworICAgICAgICByZXR1cm4gYXQoaW5kZXgpOworICAg
IH0KKworICAgIGNsYXNzIGl0ZXJhdG9yIHsKKyAgICBwdWJsaWM6CisgICAgICAgIGl0ZXJhdG9y
KCkKKyAgICAgICAgICAgIDogbV9zd2l0Y2gobnVsbHB0cikKKyAgICAgICAgICAgICwgbV9pbmRl
eCgwKQorICAgICAgICB7CisgICAgICAgIH0KKworICAgICAgICBpdGVyYXRvcihTd2l0Y2hWYWx1
ZSYgc3dpdGNoVmFsdWUsIHVuc2lnbmVkIGluZGV4KQorICAgICAgICAgICAgOiBtX3N3aXRjaCgm
c3dpdGNoVmFsdWUpCisgICAgICAgICAgICAsIG1faW5kZXgoaW5kZXgpCisgICAgICAgIHsKKyAg
ICAgICAgfQorCisgICAgICAgIFN3aXRjaENhc2Ugb3BlcmF0b3IqKCkKKyAgICAgICAgeworICAg
ICAgICAgICAgcmV0dXJuIG1fc3dpdGNoLT5hdChtX2luZGV4KTsKKyAgICAgICAgfQorCisgICAg
ICAgIGl0ZXJhdG9yJiBvcGVyYXRvcisrKCkKKyAgICAgICAgeworICAgICAgICAgICAgbV9pbmRl
eCsrOworICAgICAgICAgICAgcmV0dXJuICp0aGlzOworICAgICAgICB9CisKKyAgICAgICAgYm9v
bCBvcGVyYXRvcj09KGNvbnN0IGl0ZXJhdG9yJiBvdGhlcikgY29uc3QKKyAgICAgICAgeworICAg
ICAgICAgICAgcmV0dXJuIG1faW5kZXggPT0gb3RoZXIubV9pbmRleDsKKyAgICAgICAgfQorCisg
ICAgICAgIGJvb2wgb3BlcmF0b3IhPShjb25zdCBpdGVyYXRvciYgb3RoZXIpIGNvbnN0CisgICAg
ICAgIHsKKyAgICAgICAgICAgIHJldHVybiAhKCp0aGlzID09IG90aGVyKTsKKyAgICAgICAgfQor
CisgICAgcHJpdmF0ZToKKyAgICAgICAgU3dpdGNoVmFsdWUqIG1fc3dpdGNoOworICAgICAgICB1
bnNpZ25lZCBtX2luZGV4OworICAgIH07CisKKyAgICBpdGVyYXRvciBiZWdpbigpIGNvbnN0IHsg
cmV0dXJuIGl0ZXJhdG9yKCp0aGlzLCAwKTsgfQorICAgIGl0ZXJhdG9yIGVuZCgpIGNvbnN0IHsg
cmV0dXJuIGl0ZXJhdG9yKCp0aGlzLCBzaXplKCkpOyB9CisKKyAgICAvLyBUaGlzIHJlbW92ZXMg
dGhlIGNhc2UgYW5kIHJlb3JkZXJzIHRoaW5ncyBhIGJpdC4gSWYgeW91J3JlIGl0ZXJhdGluZyB0
aGUgY2FzZXMgZnJvbSAwIHRvIE4sCisgICAgLy8gdGhlbiB5b3UgY2FuIGtlZXAgaXRlcmF0aW5n
IGFmdGVyIHRoaXMgc28gbG9uZyBhcyB5b3UgcmV2aXNpdCB0aGlzIHNhbWUgaW5kZXggKHdoaWNo
IHdpbGwgbm93CisgICAgLy8gY29udGFpbiBzb21lIG90aGVyIGNhc2UgdmFsdWUpLiBUaGlzIHJl
bW92ZXMgdGhlIGNhc2UgdGhhdCB3YXMgcmVtb3ZlZC4KKyAgICBTd2l0Y2hDYXNlIHJlbW92ZUNh
c2UodW5zaWduZWQgaW5kZXgpOworCisgICAgdm9pZCBhcHBlbmRDYXNlKGNvbnN0IFN3aXRjaENh
c2UmIHN3aXRjaENhc2UpOworCitwcm90ZWN0ZWQ6CisgICAgdm9pZCBkdW1wTWV0YShQcmludFN0
cmVhbSYpIGNvbnN0IG92ZXJyaWRlOworCitwcml2YXRlOgorICAgIGZyaWVuZCBjbGFzcyBQcm9j
ZWR1cmU7CisKKyAgICBTd2l0Y2hWYWx1ZSh1bnNpZ25lZCBpbmRleCwgT3JpZ2luIG9yaWdpbiwg
QmFzaWNCbG9jayogZmFsbFRocm91Z2gpOworfTsKKworfSB9IC8vIG5hbWVzcGFjZSBKU0M6OkIz
CisKKyNlbmRpZiAvLyBCM1N3aXRjaFZhbHVlX2gKKwpJbmRleDogU291cmNlL0phdmFTY3JpcHRD
b3JlL2IzL0IzVHlwZS5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRDb3JlL2Iz
L0IzVHlwZS5jcHAJKHJldmlzaW9uIDApCisrKyBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNU
eXBlLmNwcAkod29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDU0IEBACisvKgorICogQ29weXJpZ2h0
IChDKSAyMDE1IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3Ry
aWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhv
dXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xs
b3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBz
b3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2Us
IHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisg
KiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFi
b3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQg
dGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQv
b3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisg
KiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBB
TlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1Qg
TElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZ
IEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQu
ICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElB
QkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVY
RU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElN
SVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7
IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBU
SU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBX
SEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVE
SU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRI
RSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lC
SUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisKKyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNs
dWRlICJCM1R5cGUuaCIKKworI2luY2x1ZGUgPHd0Zi9QcmludFN0cmVhbS5oPgorCituYW1lc3Bh
Y2UgV1RGIHsKKwordXNpbmcgbmFtZXNwYWNlIEpTQzo6QjM7CisKK3ZvaWQgcHJpbnRJbnRlcm5h
bChQcmludFN0cmVhbSYgb3V0LCBUeXBlIHR5cGUpCit7CisgICAgc3dpdGNoICh0eXBlKSB7Cisg
ICAgY2FzZSBWb2lkOgorICAgICAgICBvdXQucHJpbnQoIlZvaWQiKTsKKyAgICAgICAgcmV0dXJu
OworICAgIGNhc2UgSW50MzI6CisgICAgICAgIG91dC5wcmludCgiSW50MzIiKTsKKyAgICAgICAg
cmV0dXJuOworICAgIGNhc2UgSW50NjQ6CisgICAgICAgIG91dC5wcmludCgiSW50NjQiKTsKKyAg
ICAgICAgcmV0dXJuOworICAgIGNhc2UgRG91YmxlOgorICAgICAgICBvdXQucHJpbnQoIkRvdWJs
ZSIpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIFJFTEVBU0VfQVNTRVJUX05PVF9SRUFD
SEVEKCk7Cit9CisKK30gLy8gbmFtZXNwYWNlIFdURgpJbmRleDogU291cmNlL0phdmFTY3JpcHRD
b3JlL2IzL0IzVHlwZS5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9C
M1R5cGUuaAkocmV2aXNpb24gMCkKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM1R5cGUu
aAkod29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDY4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAy
MDE1IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlv
biBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAq
IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcg
Y29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2Ug
Y29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMg
bGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBS
ZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNv
cHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZv
bGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3Ro
ZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElT
IFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAq
IEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRF
RCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBG
SVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBO
TyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZP
UiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFS
WSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBU
TywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1Mg
T0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBI
T1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVS
IElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5F
R0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UK
KyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkg
T0YgU1VDSCBEQU1BR0UuIAorICovCisKKyNpZm5kZWYgQjNUeXBlX2gKKyNkZWZpbmUgQjNUeXBl
X2gKKworI2luY2x1ZGUgPHd0Zi9TdGRMaWJFeHRyYXMuaD4KKworbmFtZXNwYWNlIEpTQyB7IG5h
bWVzcGFjZSBCMyB7CisKK2VudW0gVHlwZSB7CisgICAgVm9pZCwKKyAgICBJbnQzMiwKKyAgICBJ
bnQ2NCwKKyAgICBEb3VibGUKK307CisKK2lubGluZSBib29sIGlzSW50KFR5cGUgdHlwZSkKK3sK
KyAgICByZXR1cm4gdHlwZSA9PSBJbnQzMiB8fCB0eXBlID09IEludDY0OworfQorCitpbmxpbmUg
Ym9vbCBpc0Zsb2F0KFR5cGUgdHlwZSkKK3sKKyAgICByZXR1cm4gdHlwZSA9PSBEb3VibGU7Cit9
CisKK2lubGluZSBUeXBlIHBvaW50ZXIoKSBjb25zdAoreworICAgIGlmIChzaXplb2Yodm9pZCop
ID09IDQpCisgICAgICAgIHJldHVybiBJbnQzMjsKKyAgICByZXR1cm4gSW50NjQ7Cit9CisKK30g
fSAvLyBuYW1lc3BhY2UgSlNDOjpCMworCituYW1lc3BhY2UgV1RGIHsKKworY2xhc3MgUHJpbnRT
dHJlYW07CisKK3ZvaWQgcHJpbnRJbnRlcm5hbChQcmludFN0cmVhbSYsIEpTQzo6QjM6OlR5cGUp
OworCit9IC8vIG5hbWVzcGFjZSBXVEYKKworI2VuZGlmIC8vIEIzVHlwZV9oCisKSW5kZXg6IFNv
dXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM1Vwc2lsb25WYWx1ZS5jcHAKPT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0g
U291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzVXBzaWxvblZhbHVlLmNwcAkocmV2aXNpb24gMCkK
KysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM1Vwc2lsb25WYWx1ZS5jcHAJKHdvcmtpbmcg
Y29weSkKQEAgLTAsMCArMSw0MSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNSBBcHBsZSBJ
bmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBp
biBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRp
b24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMK
KyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCBy
ZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29u
ZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRp
b25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAq
ICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlz
Y2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFs
cyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJ
UyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9S
IElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQor
ICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1Ig
QSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hB
TEwgQVBQTEUgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVD
VCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNF
UVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9D
VVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFU
QSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVT
RUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFD
VCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9S
IE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElT
IFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFN
QUdFLiAKKyAqLworCisjaW5jbHVkZSAiY29uZmlnLmgiCisjaW5jbHVkZSAiQjNVcHNpbG9uVmFs
dWUuaCIKKworbmFtZXNwYWNlIEpTQyB7IG5hbWVzcGFjZSBCMyB7CisKK1Vwc2lsb25WYWx1ZTo6
flVwc2lsb25WYWx1ZSgpCit7Cit9CisKK3ZvaWQgVXBzaWxvblZhbHVlOjpkdW1wTWV0YShQcmlu
dFN0cmVhbSYgb3V0KSBjb25zdAoreworICAgIG91dC5wcmludCgiXiIsIG1fcGhpLT5pbmRleCgp
KTsKK30KKworfSB9IC8vIG5hbWVzcGFjZSBKU0M6OkIzCisKSW5kZXg6IFNvdXJjZS9KYXZhU2Ny
aXB0Q29yZS9iMy9CM1Vwc2lsb25WYWx1ZS5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2Ny
aXB0Q29yZS9iMy9CM1Vwc2lsb25WYWx1ZS5oCShyZXZpc2lvbiAwKQorKysgU291cmNlL0phdmFT
Y3JpcHRDb3JlL2IzL0IzVXBzaWxvblZhbHVlLmgJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSw2
MCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNSBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVz
ZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFy
eSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQg
cHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAx
LiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNv
cHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZv
bGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3Jt
IG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBs
aXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAq
ICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRo
ZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBM
RSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElF
UywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5U
SUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQ
VVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUgor
ICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lE
RU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAo
SU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElU
VVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7
IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVP
UlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElU
WSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lO
RyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElG
IEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLiAKKyAqLworCisjaWZu
ZGVmIEIzVXBzaWxvblZhbHVlX2gKKyNkZWZpbmUgQjNVcHNpbG9uVmFsdWVfaAorCisjaW5jbHVk
ZSAiQjNWYWx1ZS5oIgorCituYW1lc3BhY2UgSlNDIHsgbmFtZXNwYWNlIEIzIHsKKworY2xhc3Mg
VXBzaWxvblZhbHVlIDogcHVibGljIFZhbHVlIHsKK3B1YmxpYzoKKyAgICBzdGF0aWMgYm9vbCBh
Y2NlcHRzKE9wY29kZSBvcGNvZGUpIHsgcmV0dXJuIG9wY29kZSA9PSBVcHNpbG9uOyB9CisKKyAg
ICB+VXBzaWxvblZhbHVlKCk7CisKKyAgICBWYWx1ZSogcGhpKCkgY29uc3QgeyByZXR1cm4gbV9w
aGk7IH0KKworcHJvdGVjdGVkOgorICAgIHZvaWQgZHVtcE1ldGEoUHJpbnRTdHJlYW0mKSBjb25z
dCBvdmVycmlkZTsKKworcHJpdmF0ZToKKyAgICBmcmllbmQgY2xhc3MgUHJvY2VkdXJlOworICAg
IAorICAgIFVwc2lsb25WYWx1ZSh1bnNpZ25lZCBpbmRleCwgT3JpZ2luIG9yaWdpbiwgVmFsdWUq
IHZhbHVlLCBWYWx1ZSogcGhpKQorICAgICAgICA6IFZhbHVlKGluZGV4LCBQaGksIFZvaWQsIG9y
aWdpbiwgdmFsdWUpCisgICAgICAgICwgbV9waGkocGhpKQorICAgIHsKKyAgICAgICAgQVNTRVJU
KHZhbHVlLT50eXBlKCkgPT0gcGhpLT50eXBlKCkpOworICAgIH0KKworICAgIFZhbHVlKiBtX3Bo
aTsKK307CisKK30gfSAvLyBuYW1lc3BhY2UgSlNDOjpCMworCisjZW5kaWYgLy8gQjNVcHNpbG9u
VmFsdWVfaAorCkluZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNWYWx1ZS5jcHAKPT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzVmFsdWUuY3BwCShyZXZpc2lv
biAwKQorKysgU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzVmFsdWUuY3BwCSh3b3JraW5nIGNv
cHkpCkBAIC0wLDAgKzEsMTY5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE1IEFwcGxlIElu
Yy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGlu
IHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlv
biwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwor
ICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJl
dGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25k
aXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlv
bnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICog
ICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNj
bGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxz
IHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElT
IFBST1ZJREVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1Ig
SU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisg
KiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBB
IFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFM
TCBBUFBMRSBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNU
LCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VR
VUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NV
UkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRB
LCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNF
RCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNU
LCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1Ig
T1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMg
U09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1B
R0UuIAorICovCisKKyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJCM1ZhbHVlLmgiCisK
K25hbWVzcGFjZSBKU0MgeyBuYW1lc3BhY2UgQjMgeworCitWYWx1ZTo6flZhbHVlKCkKK3sKK30K
Kwordm9pZCBWYWx1ZTo6cmVwbGFjZVdpdGhJZGVudGl0eShWYWx1ZSogdmFsdWUpCit7CisgICAg
Ly8gVGhpcyBpcyBhIGJpdCBjcmF6eS4gSXQgZG9lcyBhbiBpbi1wbGFjZSByZXBsYWNlbWVudCBv
ZiB3aGF0ZXZlciBWYWx1ZSBzdWJjbGFzcyB0aGlzIGlzIHdpdGgKKyAgICAvLyBhIHBsYWluIElk
ZW50aXR5IFZhbHVlLiBXZSBmaXJzdCBjb2xsZWN0IGFsbCBvZiB0aGUgaW5mb3JtYXRpb24gd2Ug
bmVlZCwgdGhlbiB3ZSBkZXN0cnVjdCB0aGUKKyAgICAvLyBwcmV2aW91cyB2YWx1ZSBpbiBwbGFj
ZSwgYW5kIHRoZW4gd2UgY29uc3RydWN0IHRoZSBJZGVudGl0eSBWYWx1ZSBpbiBwbGFjZS4KKwor
ICAgIHVuc2lnbmVkIGluZGV4ID0gbV9pbmRleDsKKyAgICBUeXBlIHR5cGUgPSBtX3R5cGU7Cisg
ICAgT3JpZ2luIG9yaWdpbiA9IG1fb3JpZ2luOworICAgIEJhc2ljQmxvY2sqIG93bmVyID0gdGhp
cy0+b3duZXI7CisgICAgVmFsdWUqIHJlcGxhY2VtZW50ID0gdGhpcy0+cmVwbGFjZW1lbnQ7Cisg
ICAgdm9pZCogbWlzYyA9IHRoaXMtPm1pc2M7CisKKyAgICBSRUxFQVNFX0FTU0VSVCh0eXBlID09
IHZhbHVlLT50eXBlKCkpOworCisgICAgdGhpcy0+VmFsdWU6On5WYWx1ZSgpOworCisgICAgbmV3
ICh0aGlzKSAoaW5kZXgsIElkZW50aWZ5LCB0eXBlLCBvcmlnaW4sIHZhbHVlKTsKKworICAgIHRo
aXMtPm93bmVyID0gb3duZXI7CisgICAgdGhpcy0+cmVwbGFjZW1lbnQgPSByZXBsYWNlbWVudDsK
KyAgICB0aGlzLT5taXNjID0gbWlzYzsKK30KKwordm9pZCBWYWx1ZTo6ZHVtcChQcmludFN0cmVh
bSYgb3V0KSBjb25zdAoreworICAgIG91dC5wcmludChkdW1wUHJlZml4LCBtX2luZGV4KTsKK30K
Kwordm9pZCBWYWx1ZTo6ZGVlcER1bXAoUHJpbnRTdHJlYW0mIG91dCkgY29uc3QKK3sKKyAgICBv
dXQucHJpbnQobV90eXBlLCAiICIsICp0aGlzLCAiID0gIiwgbV9vcGNvZGUpOworCisgICAgb3V0
LnByaW50KCIoIik7CisgICAgQ29tbWFQcmludGVyIGNvbW1hOworICAgIGZvciAoVmFsdWUqIGNo
aWxkIDogY2hpbGRyZW4oKSkKKyAgICAgICAgb3V0LnByaW50KGNvbW1hLCBwb2ludGVyRHVtcChj
aGlsZCkpOworCisgICAgU3RyaW5nUHJpbnRTdHJlYW0gc3RyaW5nT3V0OworICAgIGR1bXBNZXRh
KHN0cmluZ091dCk7CisgICAgQ1N0cmluZyBzdHJpbmcgPSBzdHJpbmdPdXQudG9DU3RyaW5nKCk7
CisgICAgaWYgKHN0cmluZy5sZW5ndGgoKSkKKyAgICAgICAgb3V0LnByaW50KGNvbW1hLCBzdHJp
bmcpOworCisgICAgb3V0LnByaW50KCIpIik7Cit9CisKK2Jvb2wgVmFsdWU6Omhhc0ludDMyKCkg
Y29uc3QKK3sKKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK2ludDMyX3QgVmFsdWU6OmFzSW50MzIo
KSBjb25zdAoreworICAgIFJFTEVBU0VfQVNTRVJUX05PVF9SRUFDSEVEKCk7CisgICAgcmV0dXJu
IDA7Cit9CisKK2Jvb2wgVmFsdWU6Omhhc0ludDY0KCkgY29uc3QKK3sKKyAgICByZXR1cm4gZmFs
c2U7Cit9CisKK2ludDY0X3QgVmFsdWU6OmFzSW50NjQoKSBjb25zdAoreworICAgIFJFTEVBU0Vf
QVNTRVJUX05PVF9SRUFDSEVEKCk7CisgICAgcmV0dXJuIDA7Cit9CisKK2Jvb2wgVmFsdWU6Omhh
c0RvdWJsZSgpIGNvbnN0Cit7CisgICAgcmV0dXJuIGZhbHNlOworfQorCitkb3VibGUgVmFsdWU6
OmFzRG91YmxlKCkgY29uc3QKK3sKKyAgICBSRUxFQVNFX0FTU0VSVF9OT1RfUkVBQ0hFRCgpOwor
ICAgIHJldHVybiAwOworfQorCit2b2lkIFZhbHVlOjpkdW1wTWV0YShQcmludFN0cmVhbSYpIGNv
bnN0Cit7Cit9CisKK1R5cGUgVmFsdWU6OnR5cGVGb3IoT3Bjb2RlIG9wY29kZSwgVmFsdWUqIGZp
cnN0Q2hpbGQpCit7CisgICAgc3dpdGNoIChvcGNvZGUpIHsKKyAgICBjYXNlIElkZW50aXR5Ogor
ICAgIGNhc2UgQWRkOgorICAgIGNhc2UgU3ViOgorICAgIGNhc2UgTXVsOgorICAgIGNhc2UgRGl2
OgorICAgIGNhc2UgQ2hpbGxEaXY6CisgICAgY2FzZSBNb2Q6CisgICAgY2FzZSBCaXRBbmQ6Cisg
ICAgY2FzZSBCaXRPcjoKKyAgICBjYXNlIEJpdFhvcjoKKyAgICBjYXNlIFNobDoKKyAgICBjYXNl
IFNTaHI6CisgICAgY2FzZSBaU2hyOgorICAgIGNhc2UgQ2hlY2tBZGQ6CisgICAgY2FzZSBDaGVj
a1N1YjoKKyAgICBjYXNlIENoZWNrTXVsOgorICAgICAgICByZXR1cm4gZmlyc3RDaGlsZC0+dHlw
ZSgpOworICAgIGNhc2UgRnJhbWVQb2ludGVyOgorICAgICAgICByZXR1cm4gcG9pbnRlcigpOwor
ICAgIGNhc2UgU0V4dDg6CisgICAgY2FzZSBTRXh0MTY6CisgICAgY2FzZSBEVG9JMzI6CisgICAg
Y2FzZSBFcXVhbDoKKyAgICBjYXNlIE5vdEVxdWFsOgorICAgIGNhc2UgTGVzc1RoYW46CisgICAg
Y2FzZSBHcmVhdGVyVGhhbjoKKyAgICBjYXNlIExlc3NFcXVhbDoKKyAgICBjYXNlIEdyZWF0ZXJF
cXVhbDoKKyAgICBjYXNlIEFib3ZlOgorICAgIGNhc2UgQmVsb3c6CisgICAgY2FzZSBBYm92ZUVx
dWFsOgorICAgIGNhc2UgQmVsb3dFcXVhbDoKKyAgICAgICAgcmV0dXJuIEludDMyOworICAgIGNh
c2UgU0V4dDMyOgorICAgIGNhc2UgWkV4dDMyOgorICAgICAgICByZXR1cm4gSW50NjQ7CisgICAg
Y2FzZSBGUm91bmQ6CisgICAgY2FzZSBJVG9EOgorICAgICAgICByZXR1cm4gRG91YmxlOworICAg
IGNhc2UgTm9wOgorICAgICAgICByZXR1cm4gVm9pZDsKKyAgICBkZWZhdWx0OgorICAgICAgICBS
RUxFQVNFX0FTU0VSVF9OT1RfUkVBQ0hFRCgpOworICAgIH0KK30KKworfSB9IC8vIG5hbWVzcGFj
ZSBKU0M6OkIzCisKSW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM1ZhbHVlLmgKPT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzVmFsdWUuaAkocmV2aXNpb24g
MCkKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM1ZhbHVlLmgJKHdvcmtpbmcgY29weSkK
QEAgLTAsMCArMSwxOTYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTUgQXBwbGUgSW5jLiBB
bGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291
cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBh
cmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBh
cmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWlu
IHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlv
bnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBp
biBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBu
b3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWlt
ZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJv
dmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJP
VklERUQgQlkgQVBQTEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBM
SUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElN
UExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFS
VElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQ
UExFIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElO
RElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5U
SUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1F
TlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9S
CisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFO
RCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNU
UklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhF
UldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZU
V0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4g
CisgKi8KKworI2lmbmRlZiBCM1ZhbHVlX2gKKyNkZWZpbmUgQjNWYWx1ZV9oCisKKyNpbmNsdWRl
ICJCM09yaWdpbi5oIgorI2luY2x1ZGUgIkIzVHlwZS5oIgorI2luY2x1ZGUgPHd0Zi9GYXN0TWFs
bG9jLmg+CisjaW5jbHVkZSA8d3RmL05vbmNvcHlhYmxlLmg+CisKK25hbWVzcGFjZSBKU0MgeyBu
YW1lc3BhY2UgQjMgeworCitjbGFzcyBWYWx1ZSB7CisgICAgV1RGX01BS0VfTk9OQ09QWUFCTEUo
VmFsdWUpOworICAgIFdURl9NQUtFX0ZBU1RfQUxMT0NBVEVEOworcHVibGljOgorICAgIHR5cGVk
ZWYgVmVjdG9yPFZhbHVlKiwgMz4gQWRqYWNlbmN5TGlzdDsKKworICAgIHN0YXRpYyBjb25zdCBj
aGFyKiBkdW1wUHJlZml4ID0gIkAiOworCisgICAgc3RhdGljIGJvb2wgYWNjZXB0cyhPcGNvZGUp
IHsgcmV0dXJuIHRydWU7IH0KKworICAgIHZpcnR1YWwgflZhbHVlKCk7CisKKyAgICB1bnNpZ25l
ZCBpbmRleCgpIGNvbnN0IHsgcmV0dXJuIG1faW5kZXg7IH0KKyAgICAKKyAgICAvLyBOb3RlIHRo
YXQgdGhlIG9wY29kZSBpcyBpbW11dGFibGUsIGV4Y2VwdCBmb3IgcmVwbGFjaW5nIHZhbHVlcyB3
aXRoIGlkZW50aXR5LgorICAgIE9wY29kZSBvcGNvZGUoKSBjb25zdCB7IHJldHVybiBtX29wY29k
ZTsgfQorCisgICAgT3JpZ2luIG9yaWdpbigpIGNvbnN0IHsgcmV0dXJuIG1fb3JpZ2luOyB9Cisg
ICAgCisgICAgVmFsdWUqJiBjaGlsZCh1bnNpZ25lZCBpbmRleCkgeyByZXR1cm4gbV9jaGlsZHJl
bltpbmRleF07IH0KKyAgICBWYWx1ZSogY2hpbGQodW5zaWduZWQgaW5kZXgpIGNvbnN0IHsgcmV0
dXJuIG1fY2hpbGRyZW5baW5kZXhdOyB9CisKKyAgICAvLyBUaGlzIGNvbXB1dGVzIHRoZSB0eXBl
IHVzaW5nIHRoZSBvcGNvZGUuCisgICAgVHlwZSB0eXBlKCkgY29uc3QgeyByZXR1cm4gbV90eXBl
OyB9CisKKyAgICBBZGphY2VuY3lMaXN0JiBjaGlsZHJlbigpIHsgcmV0dXJuIG1fY2hpbGRyZW47
IH0gCisgICAgY29uc3QgQWRqYWNlbmN5TGlzdCYgY2hpbGRyZW4oKSBjb25zdCB7IHJldHVybiBt
X2NoaWxkcmVuOyB9CisKKyAgICB2b2lkIHJlcGxhY2VXaXRoSWRlbnRpdHkoVmFsdWUqKTsKKyAg
ICB2b2lkIHJlcGxhY2VXaXRoTm9wKCk7CisKKyAgICB2b2lkIGR1bXAoUHJpbnRTdHJlYW0mKSBj
b25zdDsKKyAgICB2b2lkIGRlZXBEdW1wKFByaW50U3RyZWFtJikgY29uc3Q7CisKKyAgICAvLyBU
aGlzIGlzIGhvdyB5b3UgY2FzdCBWYWx1ZXMuIEZvciBleGFtcGxlLCBpZiB5b3Ugd2FudCB0byBk
byBzb21ldGhpbmcgcHJvdmlkZWQgdGhhdCB3ZSBoYXZlIGEKKyAgICAvLyBBcmd1bWVudFJlZ1Zh
bHVlLCB5b3UgY2FuIGRvOgorICAgIC8vCisgICAgLy8gaWYgKEFyZ3VtZW50UmVnVmFsdWUqIGFy
Z3VtZW50UmVnID0gdmFsdWUtPmFzPEFyZ3VtZW50UmVnVmFsdWU+KCkpIHsKKyAgICAvLyAgICAg
dGhpbmdzCisgICAgLy8gfQorICAgIC8vCisgICAgLy8gVGhpcyB3aWxsIHJldHVybiBudWxsIGlm
IHRoaXMgb3Bjb2RlKCkgIT0gQXJndW1lbnRSZWcuIFRoaXMgd29ya3MgYmVjYXVzZSB0aGlzIHJl
dHVybnMgbnVsbHB0cgorICAgIC8vIGlmIFQ6OmFjY2VwdHMob3Bjb2RlKCkpIHJldHVybnMgZmFs
c2UuCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4KKyAgICBUKiBhcygpOworICAgIHRlbXBsYXRl
PHR5cGVuYW1lIFQ+CisgICAgY29uc3QgVCogYXMoKSBjb25zdDsKKyAgICAKKyAgICBib29sIGhh
c0ludDMyKCkgY29uc3Q7CisgICAgaW50MzJfdCBhc0ludDMyKCkgY29uc3Q7CisgICAgCisgICAg
Ym9vbCBoYXNJbnQ2NCgpIGNvbnN0OworICAgIGludDY0X3QgYXNJbnQ2NCgpIGNvbnN0OworCisg
ICAgYm9vbCBoYXNJbnQoKSBjb25zdDsKKyAgICBpbnQ2NF90IGFzSW50KCkgY29uc3Q7CisgICAg
Ym9vbCBpc0ludChpbnQ2NF90IHZhbHVlKSBjb25zdDsKKworICAgIGJvb2wgaGFzRG91YmxlKCkg
Y29uc3Q7CisgICAgZG91YmxlIGFzRG91YmxlKCkgY29uc3Q7CisKKyAgICBTdGFja21hcCogc3Rh
Y2ttYXAoKTsKKworcHJvdGVjdGVkOgorICAgIHZpcnR1YWwgdm9pZCBkdW1wTWV0YShQcmludFN0
cmVhbSYpIGNvbnN0OworICAgIAorcHJpdmF0ZToKKyAgICBmcmllbmQgY2xhc3MgUHJvY2VkdXJl
OworICAgIAorICAgIC8vIEluc3RhbnRpYXRlIHZhbHVlcyB2aWEgUHJvY2VkdXJlLgorICAgIC8v
IFRoaXMgZm9ybSByZXF1aXJlcyBzcGVjaWZ5aW5nIHRoZSB0eXBlIGV4cGxpY2l0bHk6CisgICAg
dGVtcGxhdGU8dHlwZW5hbWUuLi4gQXJndW1lbnRzPgorICAgIGV4cGxpY2l0IFZhbHVlKHVuc2ln
bmVkIGluZGV4LCBPcGNvZGUgb3Bjb2RlLCBUeXBlIHR5cGUsIE9yaWdpbiBvcmlnaW4sIFZhbHVl
KiBmaXJzdENoaWxkLCBBcmd1bWVudHMuLi4gYXJndW1lbnRzKQorICAgICAgICA6IG1faW5kZXgo
aW5kZXgpCisgICAgICAgICwgbV9vcGNvZGUob3Bjb2RlKQorICAgICAgICAsIG1fdHlwZSh0eXBl
KQorICAgICAgICAsIG1fb3JpZ2luKG9yaWdpbikKKyAgICAgICAgLCBtX2NoaWxkcmVueyBmaXJz
dENoaWxkLCBhcmd1bWVudHMuLi4gfQorICAgIHsKKyAgICB9CisgICAgLy8gVGhpcyBmb3JtIGlz
IGZvciBzcGVjaWZ5aW5nIHRoZSB0eXBlIGV4cGxpY2l0bHkgd2hlbiB0aGUgb3Bjb2RlIGhhcyBu
byBjaGlsZHJlbjoKKyAgICBleHBsaWNpdCBWYWx1ZSh1bnNpZ25lZCBpbmRleCwgT3Bjb2RlIG9w
Y29kZSwgVHlwZSB0eXBlLCBPcmlnaW4gb3JpZ2luKQorICAgICAgICA6IG1faW5kZXgoaW5kZXgp
CisgICAgICAgICwgbV9vcGNvZGUob3Bjb2RlKQorICAgICAgICAsIG1fdHlwZSh0eXBlKQorICAg
ICAgICAsIG1fb3JpZ2luKG9yaWdpbikKKyAgICB7CisgICAgfQorICAgIC8vIFRoaXMgZm9ybSBp
cyBmb3IgdGhvc2Ugb3Bjb2RlcyB0aGF0IGNhbiBpbmZlciB0aGVpciB0eXBlIGZyb20gdGhlIG9w
Y29kZSBhbmQgZmlyc3QgY2hpbGQ6CisgICAgdGVtcGxhdGU8dHlwZW5hbWUuLi4gQXJndW1lbnRz
PgorICAgIGV4cGxpY2l0IFZhbHVlKHVuc2lnbmVkIGluZGV4LCBPcGNvZGUgb3Bjb2RlLCBPcmln
aW4gb3JpZ2luLCBWYWx1ZSogZmlyc3RDaGlsZCwgQXJndW1lbnRzLi4uIGFyZ3VtZW50cykKKyAg
ICAgICAgOiBtX2luZGV4KGluZGV4KQorICAgICAgICAsIG1fb3Bjb2RlKG9wY29kZSkKKyAgICAg
ICAgLCBtX3R5cGUodHlwZUZvcihvcGNvZGUsIGZpcnN0Q2hpbGQpKQorICAgICAgICAsIG1fb3Jp
Z2luKG9yaWdpbikKKyAgICAgICAgLCBtX2NoaWxkcmVueyBmaXJzdENoaWxkLCBhcmd1bWVudHMu
Li4gfQorICAgIHsKKyAgICB9CisgICAgLy8gVGhpcyBmb3JtIGlzIGZvciB0aG9zZSBvcGNvZGVz
IHRoYXQgY2FuIGluZmVyIHRoZWlyIHR5cGUgZnJvbSB0aGUgb3Bjb2RlIGFsb25lLCBhbmQgdGhh
dCBkb24ndAorICAgIC8vIHRha2UgYW55IGFyZ3VtZW50czoKKyAgICBleHBsaWNpdCBWYWx1ZSh1
bnNpZ25lZCBpbmRleCwgT3Bjb2RlIG9wY29kZSwgT3JpZ2luIG9yaWdpbikKKyAgICAgICAgOiBt
X2luZGV4KGluZGV4KQorICAgICAgICAsIG1fb3Bjb2RlKG9wY29kZSkKKyAgICAgICAgLCBtX3R5
cGUodHlwZUZvcihvcGNvZGUsIG51bGxwdHIpKQorICAgICAgICAsIG1fb3JpZ2luKG9yaWdpbikK
KyAgICB7CisgICAgfQorICAgIC8vIFVzZSB0aGlzIGZvcm0gZm9yIHZhcmFyZ3MuCisgICAgZXhw
aWNpdCBWYWx1ZSh1bnNpZ25lZCBpbmRleCwgT3Bjb2RlIG9wY29kZSwgVHlwZSB0eXBlLCBPcmln
aW4gb3JpZ2luLCBjb25zdCBBZGphY2VuY3lMaXN0JiBjaGlsZHJlbikKKyAgICAgICAgOiBtX2lu
ZGV4KGluZGV4KQorICAgICAgICAsIG1fb3Bjb2RlKG9wY29kZSkKKyAgICAgICAgLCBtX3R5cGUo
dHlwZSkKKyAgICAgICAgLCBtX29yaWdpbihvcmlnaW4pCisgICAgICAgICwgbV9jaGlsZHJlbihj
aGlsZHJlbikKKyAgICB7CisgICAgfQorCisgICAgc3RhdGljIFR5cGUgdHlwZUZvcihPcGNvZGUs
IFZhbHVlKiBmaXJzdENoaWxkKTsKKworICAgIC8vIFRoaXMgZ3JvdXAgb2YgZmllbGRzIGlzIGFy
cmFuZ2VkIHRvIGZpdCBpbiA2NCBiaXRzLgorICAgIHVuc2lnbmVkIG1faW5kZXg7CisgICAgT3Bj
b2RlIG1fb3Bjb2RlOworICAgIFR5cGUgbV90eXBlOworICAgIAorICAgIE9yaWdpbiBtX29yaWdp
bjsKKyAgICBBZGphY2VuY3lMaXN0IG1fY2hpbGRyZW47CisKK3B1YmxpYzoKKyAgICBCYXNpY0Js
b2NrKiBvd25lciB7IG51bGxwdHIgfTsgLy8gY29tcHV0ZWQgbGF6aWx5LgorICAgIFZhbHVlKiBy
ZXBsYWNlbWVudCB7IG51bGxwdHIgfTsgLy8gdXNlZCBmb3IgYW5hbHlzZXMgYW5kIHRyYW5zZm9y
bWF0aW9ucy4KKyAgICB2b2lkKiBtaXNjIHsgbnVsbHB0ciB9OworfTsKKworY2xhc3MgRGVlcFZh
bHVlRHVtcCB7CitwdWJsaWM6CisgICAgRGVlcFZhbHVlRHVtcChWYWx1ZSogdmFsdWUpCisgICAg
ICAgIDogbV92YWx1ZSh2YWx1ZSkKKyAgICB7CisgICAgfQorCisgICAgdm9pZCBkdW1wKFByaW50
U3RyZWFtJiBvdXQpIGNvbnN0CisgICAgeworICAgICAgICBpZiAobV92YWx1ZSkKKyAgICAgICAg
ICAgIG1fdmFsdWUtPmRlZXBEdW1wKG91dCk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIG91
dC5wcmludCgiPG51bGw+Iik7CisgICAgfQorCitwcml2YXRlOgorICAgIFZhbHVlKiBtX3ZhbHVl
OworfTsKKworRGVlcFZhbHVlRHVtcCBkZWVwRHVtcChWYWx1ZSogdmFsdWUpCit7CisgICAgcmV0
dXJuIERlZXBWYWx1ZUR1bXAodmFsdWUpOworfQorCit9IH0gLy8gbmFtZXNwYWNlIEpTQzo6QjMK
KworI2VuZGlmIC8vIEIzVmFsdWVfaAorCkluZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMv
QjNWYWx1ZUlubGluZXMuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMv
QjNWYWx1ZUlubGluZXMuaAkocmV2aXNpb24gMCkKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9i
My9CM1ZhbHVlSW5saW5lcy5oCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsMTA5IEBACisvKgor
ICogQ29weXJpZ2h0IChDKSAyMDE1IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAq
CisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3
aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0
aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJp
YnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Cisg
KiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRp
c2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXBy
b2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29u
ZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1l
bnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1
dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gYGBB
UyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJ
TkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVS
Q0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJF
IERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SCisgKiBDT05UUklC
VVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BF
Q0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcs
IEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMg
T1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5F
U1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0Yg
TElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JU
CisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBX
QVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBP
RiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisKKyNpZm5kZWYgQjNWYWx1
ZUlubGluZXNfaAorI2RlZmluZSBCM1ZhbHVlSW5saW5lc19oCisKKyNpbmNsdWRlICJCM0NoZWNr
VmFsdWUuaCIKKyNpbmNsdWRlICJCM0NvbnN0MzJWYWx1ZS5oIgorI2luY2x1ZGUgIkIzQ29uc3Q2
NFZhbHVlLmgiCisjaW5jbHVkZSAiQjNDb25zdERvdWJsZVZhbHVlLmgiCisjaW5jbHVkZSAiQjNQ
YXRjaHBvaW50VmFsdWUuaCIKKyNpbmNsdWRlICJCM1ZhbHVlLmgiCisKK25hbWVzcGFjZSBKU0Mg
eyBuYW1lc3BhY2UgQjMgeworCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorVCogVmFsdWU6OmFzKCkK
K3sKKyAgICBpZiAoVDo6YWNjZXB0cyhvcGNvZGUoKSkpCisgICAgICAgIHJldHVybiBzdGF0aWNf
Y2FzdDxUKj4odGhpcyk7CisgICAgcmV0dXJuIG51bGxwdHI7Cit9CisKK3RlbXBsYXRlPnR5cGVu
YW1lIFQ+Citjb25zdCBUKiBWYWx1ZTo6YXMoKSBjb25zdAoreworICAgIHJldHVybiBjb25zdF9j
YXN0PFZhbHVlKj4odGhpcyktPmFzPFQ+KCk7Cit9CisKK2Jvb2wgVmFsdWU6Omhhc0ludDMyKCkg
Y29uc3QKK3sKKyAgICByZXR1cm4gISFhczxDb25zdDMyVmFsdWU+KCk7Cit9CisKK2ludDMyX3Qg
VmFsdWU6OmFzSW50MzIoKSBjb25zdAoreworICAgIHJldHVybiBhczxDb25zdDMyVmFsdWU+KCkt
PnZhbHVlKCk7Cit9CisKK2Jvb2wgVmFsdWU6Omhhc0ludDY0KCkgY29uc3QKK3sKKyAgICByZXR1
cm4gISFhczxDb25zdDY0VmFsdWU+KCk7Cit9CisKK2ludDY0X3QgVmFsdWU6OmFzSW50NjQoKSBj
b25zdAoreworICAgIHJldHVybiBhczxDb25zdDY0VmFsdWU+KCktPnZhbHVlKCk7Cit9CisKK2Jv
b2wgVmFsdWU6Omhhc0ludCgpIGNvbnN0Cit7CisgICAgcmV0dXJuIGhhc0ludDMyKCkgfHwgaGFz
SW50NjQoKTsKK30KKworaW50NjRfdCBWYWx1ZTo6YXNJbnQoKSBjb25zdAoreworICAgIHJldHVy
biBoYXNJbnQzMigpID8gYXNJbnQzMigpIDogYXNJbnQ2NCgpOworfQorCitib29sIFZhbHVlOjpp
c0ludChpbnQ2NF90IHZhbHVlKSBjb25zdAoreworICAgIHJldHVybiBoYXNJbnQoKSAmJiBhc0lu
dCgpID09IHZhbHVlOworfQorCitib29sIFZhbHVlOjpoYXNEb3VibGUoKSBjb25zdAoreworICAg
IHJldHVybiAhIWFzPENvbnN0RG91YmxlVmFsdWU+KCk7Cit9CisKK2RvdWJsZSBWYWx1ZTo6YXNE
b3VibGUoKSBjb25zdAoreworICAgIHJldHVybiBhczxDb25zdERvdWJsZVZhbHVlPigpLT52YWx1
ZSgpOworfQorCitTdGFja21hcCogVmFsdWU6OnN0YWNrbWFwKCkKK3sKKyAgICBpZiAoQ2hlY2tW
YWx1ZSogY2hlY2sgPSBhczxDaGVja1ZhbHVlPigpKQorICAgICAgICByZXR1cm4gJmNoZWNrLT5z
dGFja21hcDsKKyAgICBpZiAoUGF0Y2hwb2ludFZhbHVlKiBwYXRjaHBvaW50ID0gYXM8UGF0Y2hw
b2ludFZhbHVlPigpKQorICAgICAgICByZXR1cm4gJnBhdGNocG9pbnQtPnN0YWNrbWFwOworICAg
IHJldHVybiBudWxscHRyOworfQorCit9IH0gLy8gbmFtZXNwYWNlIEpTQzo6QjMKKworI2VuZGlm
IC8vIEIzVmFsdWVJbmxpbmVzX2gKKwpJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0Iz
VmFsdWVSZXAuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM1Zh
bHVlUmVwLmNwcAkocmV2aXNpb24gMCkKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM1Zh
bHVlUmVwLmNwcAkod29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDg2IEBACisvKgorICogQ29weXJp
Z2h0IChDKSAyMDE1IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRp
c3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdp
dGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBm
b2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBv
ZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3Rp
Y2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIu
CisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhl
IGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBh
bmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBh
bmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAq
CisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFO
RCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBO
T1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklM
SVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlN
RUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUg
TElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAq
IEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1Qg
TElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklD
RVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJS
VVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZ
LCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5D
TFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9G
IFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9T
U0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisKKyNpbmNsdWRlICJjb25maWcuaCIKKyNp
bmNsdWRlICJCM1ZhbHVlUmVwLmgiCisKK25hbWVzcGFjZSBKU0MgeyBuYW1lc3BhY2UgQjMgewor
Cit2b2lkIFZhbHVlUmVwOjpkdW1wKFByaW50U3RyZWFtJiBvdXQpIGNvbnN0Cit7CisgICAgb3V0
LnByaW50KG1fa2luZCk7CisgICAgc3dpdGNoIChtX2tpbmQpIHsKKyAgICBjYXNlIE5vbmU6Cisg
ICAgY2FzZSBTb21lUmVnaXN0ZXI6CisgICAgICAgIHJldHVybjsKKyAgICBjYXNlIFJlZ2lzdGVy
OgorICAgICAgICBvdXQucHJpbnQoIigiLCByZWcoKSwgIikiKTsKKyAgICAgICAgcmV0dXJuOwor
ICAgIGNhc2UgU3RhY2s6CisgICAgICAgIG91dC5wcmludCgiKCIsIG9mZnNldEZyb21GUCgpLCAi
KSIpOworICAgICAgICByZXR1cm47CisgICAgY2FzZSBTdGFja0FyZ3VtZW50OgorICAgICAgICBv
dXQucHJpbnQoIigiLCBvZmZzZXRGcm9tU1AoKSwgIikiKTsKKyAgICAgICAgcmV0dXJuOworICAg
IGNhc2UgQ29uc3RhbnQ6CisgICAgICAgIG91dC5wcmludCgiKCIsIHZhbHVlKCksICIpIik7Cisg
ICAgICAgIHJldHVybjsKKyAgICB9CisgICAgUkVMRUFTRV9BU1NFUlRfTk9UX1JFQUNIRUQoKTsK
K30KKworfSB9IC8vIG5hbWVzcGFjZSBKU0M6OkIzCisKK25hbWVzcGFjZSBXVEYgeworCit1c2lu
ZyBuYW1lc3BhY2UgSlNDOjpCMzsKKwordm9pZCBwcmludEludGVybmFsKFByaW50U3RyZWFtJiBv
dXQsIFZhbHVlUmVwOjpLaW5kIGtpbmQpCit7CisgICAgc3dpdGNoIChraW5kKSB7CisgICAgY2Fz
ZSBWYWx1ZVJlcDo6QW55OgorICAgICAgICBvdXQucHJpbnQoIkFueSIpOworICAgICAgICByZXR1
cm47CisgICAgY2FzZSBWYWx1ZVJlcDo6U29tZVJlZ2lzdGVyOgorICAgICAgICBvdXQucHJpbnQo
IlNvbWVSZWdpc3RlciIpOworICAgICAgICByZXR1cm47CisgICAgY2FzZSBWYWx1ZVJlcDo6UmVn
aXN0ZXI6CisgICAgICAgIG91dC5wcmludCgiUmVnaXN0ZXIiKTsKKyAgICAgICAgcmV0dXJuOwor
ICAgIGNhc2UgVmFsdWVSZXA6OlN0YWNrOgorICAgICAgICBvdXQucHJpbnQoIlN0YWNrIik7Cisg
ICAgICAgIHJldHVybjsKKyAgICBjYXNlIFZhbHVlUmVwOjpTdGFja0FyZ3VtZW50OgorICAgICAg
ICBvdXQucHJpbnQoIlN0YWNrQXJndW1lbnQiKTsKKyAgICAgICAgcmV0dXJuOworICAgIGNhc2Ug
VmFsdWVSZXA6OkNvbnN0YW50OgorICAgICAgICBvdXQucHJpbnQoIkNvbnN0YW50Iik7CisgICAg
ICAgIHJldHVybjsKKyAgICB9CisgICAgUkVMRUFTRV9BU1NFUlRfTk9UX1JFQUNIRUQoKTsKK30K
KworfSAvLyBuYW1lc3BhY2UgV1RGCisKSW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9C
M1ZhbHVlUmVwLmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzVmFs
dWVSZXAuaAkocmV2aXNpb24gMCkKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM1ZhbHVl
UmVwLmgJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSwxNTYgQEAKKy8qCisgKiBDb3B5cmlnaHQg
KEMpIDIwMTUgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJp
YnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91
dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxv
d2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNv
dXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwg
dGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAq
IDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJv
dmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0
aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9v
ciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAq
IFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFTIElTJycgQU5EIEFO
WQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBM
SU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkg
QU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4g
IElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFC
TEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhF
TVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1J
VEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsg
TE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJ
T04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdI
RVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJ
TkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhF
IFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJ
TElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKworI2lmbmRlZiBCM1ZhbHVlUmVwX2gKKyNkZWZp
bmUgQjNWYWx1ZVJlcF9oCisKKyNpbmNsdWRlICJSZWcuaCIKKyNpbmNsdWRlIDx3dGYvUHJpbnRT
dHJlYW0uaD4KKworbmFtZXNwYWNlIEpTQyB7IG5hbWVzcGFjZSBCMyB7CisKKy8vIFdlIHVzZSB0
aGlzIGNsYXNzIHRvIGRlc2NyaWJlIHZhbHVlIHJlcHJlc2VudGF0aW9ucyBhdCBzdGFja21hcHMu
IEl0J3MgdXNlZCBib3RoIHRvIGZvcmNlIGEKKy8vIHJlcHJlc2VudGF0aW9uIGFuZCB0byBnZXQg
dGhlIHJlcHJlc2VudGF0aW9uLiBXaGVuIHRoZSBCMyBjbGllbnQgZm9yY2VzIGEgcmVwcmVzZW50
YXRpb24sIHdlIHNheQorLy8gdGhhdCBpdCdzIGFuIGlucHV0LiBXaGVuIEIzIHRlbGxzIHRoZSBj
bGllbnQgd2hhdCByZXByZXNlbnRhdGlvbiBpdCBwaWNrZWQsIHdlIHNheSB0aGF0IGl0J3MgYW4K
Ky8vIG91dHB1dC4KKworY2xhc3MgVmFsdWVSZXAgeworcHVibGljOgorICAgIGVudW0gS2luZCB7
CisgICAgICAgIC8vIEFzIGFuIGlucHV0IHJlcHJlc2VudGF0aW9uLCB0aGlzIG1lYW5zIHRoYXQg
QjMgY2FuIHBpY2sgYW55IHJlcHJlc2VudGF0aW9uLgorICAgICAgICBBbnksCisKKyAgICAgICAg
Ly8gQXMgYW4gaW5wdXQgcmVwcmVzZW50YXRpb24sIHRoaXMgbWVhbnMgdGhhdCBCMyBzaG91bGQg
cGljayBzb21lIHJlZ2lzdGVyLiBJdCBjb3VsZCBiZSBhCisgICAgICAgIC8vIHJlZ2lzdGVyIHRo
YXQgdGhpcyBjbGFpbXMgdG8gY2xvYmJlciEKKyAgICAgICAgU29tZVJlZ2lzdGVyLAorCisgICAg
ICAgIC8vIEFzIGFuIGlucHV0IHJlcHJlc2VudGF0aW9uLCB0aGlzIGZvcmNlcyBhIHBhcnRpY3Vs
YXIgcmVnaXN0ZXIuIEFzIGFuIG91dHB1dAorICAgICAgICAvLyByZXByZXNlbnRhdGlvbiwgdGhp
cyB0ZWxscyB1cyB3aGF0IHJlZ2lzdGVyIEIzIHBpY2tlZC4KKyAgICAgICAgUmVnaXN0ZXIsCisK
KyAgICAgICAgLy8gQXMgYW4gb3V0cHV0IHJlcHJlc2VudGF0aW9uLCB0aGlzIHRlbGxzIHVzIHdo
YXQgc3RhY2sgc2xvdCBCMyBwaWNrZWQuIEl0J3Mgbm90IGEgdmFsaWQKKyAgICAgICAgLy8gaW5w
dXQgcmVwcmVzZW50YXRpb24uCisgICAgICAgIFN0YWNrLAorCisgICAgICAgIC8vIEFzIGFuIGlu
cHV0IHJlcHJlc2VudGF0aW9uLCB0aGlzIGZvcmNlcyB0aGUgdmFsdWUgdG8gZW5kIHVwIGluIHRo
ZSBhcmd1bWVudCBhcmVhIGF0IHNvbWUKKyAgICAgICAgLy8gb2Zmc2V0LgorICAgICAgICBTdGFj
a0FyZ3VtZW50LAorCisgICAgICAgIC8vIEFzIGFuIG91dHB1dCByZXByZXNlbnRhdGlvbiwgdGhp
cyB0ZWxscyB1cyB0aGF0IEIzIGNvbnN0YW50LWZvbGRlZCB0aGUgdmFsdWUuCisgICAgICAgIENv
bnN0YW50CisgICAgfTsKKyAgICAKKyAgICBWYWx1ZVJlcCgpCisgICAgICAgIDogbV9raW5kKEFu
eSkKKyAgICB7CisgICAgfQorCisgICAgZXhwbGljaXQgVmFsdWVSZXAoUmVnIHJlZykKKyAgICAg
ICAgOiBtX2tpbmQoUmVnaXN0ZXIpCisgICAgICAgICwgbV92YWx1ZShyZWcuaW5kZXgoKSkKKyAg
ICB7CisgICAgfQorCisgICAgc3RhdGljIFZhbHVlUmVwIHJlZyhSZWcgcmVnKQorICAgIHsKKyAg
ICAgICAgcmV0dXJuIFZhbHVlUmVwKHJlZyk7CisgICAgfQorCisgICAgc3RhdGljIFZhbHVlUmVw
IHN0YWNrKGludHB0cl90IG9mZnNldEZyb21GUCkKKyAgICB7CisgICAgICAgIFZhbHVlUmVwIHJl
c3VsdDsKKyAgICAgICAgcmVzdWx0Lm1fa2luZCA9IFN0YWNrOworICAgICAgICByZXN1bHQubV92
YWx1ZSA9IG9mZnNldEZyb21GUDsKKyAgICB9CisKKyAgICBzdGF0aWMgVmFsdWVSZXAgc3RhY2tB
cmd1bWVudChpbnRwdHJfdCBvZmZzZXRGcm9tU1ApCisgICAgeworICAgICAgICBWYWx1ZVJlcCBy
ZXN1bHQ7CisgICAgICAgIHJlc3VsdC5tX2tpbmQgPSBTdGFja0FyZ3VtZW50OworICAgICAgICBy
ZXN1bHQubV92YWx1ZSA9IG9mZnNldEZyb21TUDsKKyAgICB9CisKKyAgICBzdGF0aWMgVmFsdWVS
ZXAgY29uc3RhbnQoaW50NjRfdCB2YWx1ZSkKKyAgICB7CisgICAgICAgIFZhbHVlUmVwIHJlc3Vs
dDsKKyAgICAgICAgcmVzdWx0Lm1fa2luZCA9IENvbnN0YW50OworICAgICAgICByZXN1bHQubV92
YWx1ZSA9IHZhbHVlOworICAgIH0KKworICAgIHN0YXRpYyBWYWx1ZVJlcCBjb25zdGFudChkb3Vi
bGUgdmFsdWUpCisgICAgeworICAgICAgICByZXR1cm4gVmFsdWVSZXAoYml0d2lzZV9jYXN0PGlu
dDY0X3Q+KHZhbHVlKSk7CisgICAgfQorCisgICAgS2luZCBraW5kKCkgY29uc3QgeyByZXR1cm4g
bV9raW5kOyB9CisKKyAgICBleHBsaWNpdCBvcGVyYXRvciBib29sKCkgY29uc3QgeyByZXR1cm4g
a2luZCgpICE9IEFueTsgfQorCisgICAgUmVnIHJlZygpIGNvbnN0CisgICAgeworICAgICAgICBB
U1NFUlQoa2luZCgpID09IFJlZ2lzdGVyKTsKKyAgICAgICAgcmV0dXJuIFJlZzo6ZnJvbUluZGV4
KG1fdmFsdWUpOworICAgIH0KKworICAgIGludHB0cl90IG9mZnNldEZyb21GUCgpIGNvbnN0Cisg
ICAgeworICAgICAgICBBU1NFUlQoa2luZCgpID09IFN0YWNrKTsKKyAgICAgICAgcmV0dXJuIHN0
YXRpY19jYXN0PGludHB0cl90PihtX3ZhbHVlKTsKKyAgICB9CisKKyAgICBpbnRwdHJfdCBvZmZz
ZXRGcm9tU1AoKSBjb25zdAorICAgIHsKKyAgICAgICAgQVNTRVJUKGtpbmQoKSA9PSBTdGFja0Fy
Z3VtZW50KTsKKyAgICAgICAgcmV0dXJuIHN0YXRpY19jYXN0PGludHB0cl90PihtX3ZhbHVlKTsK
KyAgICB9CisKKyAgICBpbnQ2NF90IHZhbHVlKCkgY29uc3QKKyAgICB7CisgICAgICAgIEFTU0VS
VChraW5kKCkgPT0gQ29uc3RhbnQpOworICAgICAgICByZXR1cm4gbV92YWx1ZTsKKyAgICB9CisK
KyAgICBkb3VibGUgZG91YmxlVmFsdWUoKSBjb25zdAorICAgIHsKKyAgICAgICAgcmV0dXJuIGJp
dHdpc2VfY2FzdDxkb3VibGU+KHZhbHVlKCkpOworICAgIH0KKworICAgIHZvaWQgZHVtcChQcmlu
dFN0cmVhbSYpIGNvbnN0OworCitwcml2YXRlOgorICAgIEtpbmQgbV9raW5kOworICAgIGludDY0
X3QgbV92YWx1ZTsKK307CisKK30gfSAvLyBuYW1lc3BhY2UgSlNDOjpCMworCituYW1lc3BhY2Ug
V1RGIHsKKwordm9pZCBwcmludEludGVybmFsKFByaW50U3RyZWFtJiwgSlNDOjpCMzo6VmFsdWVS
ZXA6OktpbmQpOworCit9IC8vIG5hbWVzcGFjZSBXVEYKKworI2VuZGlmIC8vIEIzVmFsdWVSZXBf
aAorCkluZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvZ2VuZXJhdGVfcGF0dGVybl9tYXRj
aGVyLnJiCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9nZW5lcmF0ZV9w
YXR0ZXJuX21hdGNoZXIucmIJKHJldmlzaW9uIDApCisrKyBTb3VyY2UvSmF2YVNjcmlwdENvcmUv
YjMvZ2VuZXJhdGVfcGF0dGVybl9tYXRjaGVyLnJiCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEs
NDkzIEBACisjIS91c3IvYmluL2VudiBydWJ5CisKKyMgQ29weXJpZ2h0IChDKSAyMDE1IEFwcGxl
IEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyMKKyMgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBp
biBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisjIG1vZGlmaWNhdGlv
biwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwor
IyBhcmUgbWV0OgorIyAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRh
aW4gdGhlIGFib3ZlIGNvcHlyaWdodAorIyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRp
b25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisjIDIuIFJlZGlzdHJpYnV0aW9ucyBp
biBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisjICAgIG5v
dGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1l
ciBpbiB0aGUKKyMgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3Zp
ZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyMKKyMgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURF
RCBCWSBBUFBMRSBJTkMuIEFORCBJVFMgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJworIyBBTkQgQU5Z
IEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRF
RCBUTywKKyMgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJ
VE5FU1MgRk9SIEEgUEFSVElDVUxBUgorIyBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBF
VkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SIElUUyBDT05UUklCVVRPUlMKKyMgQkUgTElBQkxFIEZP
UiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBP
UgorIyBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRP
LCBQUk9DVVJFTUVOVCBPRgorIyBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9G
IFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MKKyMgSU5URVJSVVBUSU9OKSBIT1dF
VkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KKyMg
Q09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNF
IE9SIE9USEVSV0lTRSkKKyMgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRI
SVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRgorIyBUSEUgUE9TU0lCSUxJVFkgT0YgU1VD
SCBEQU1BR0UuCisKK3JlcXVpcmUgInBhdGhuYW1lIgorCiskdmFySW5kZXggPSAwCitkZWYgbmV3
VmFyCisgICAgJHZhckluZGV4ICs9IDEKKyAgICAiX3RtcCN7JHZhckluZGV4fSIKK2VuZAorCitj
bGFzcyBQcm9kdWN0aW9uCisgICAgYXR0cl9yZWFkZXIgOm9yaWdpbiwgOm5hbWUsIDp2YXJOYW1l
LCA6YW5vbnltb3VzLCA6b3Bjb2RlLCA6Y2hpbGRyZW4KKworICAgIGRlZiBpbml0aWFsaXplKG9y
aWdpbiwgbmFtZSwgb3Bjb2RlLCBjaGlsZHJlbikKKyAgICAgICAgQG9yaWdpbiA9IG9yaWdpbgor
ICAgICAgICBAbmFtZSA9IG5hbWUKKyAgICAgICAgQGFub255bW91cyA9IChuYW1lID09IG5pbCBv
ciBuYW1lID1+IC9cQVwkKFswLTldKylcWi8pCisgICAgICAgIEB2YXJOYW1lID0gQGFub255bW91
cyA/IG5ld1ZhciA6IG5hbWUKKyAgICAgICAgQG9wY29kZSA9IG9wY29kZQorICAgICAgICBAY2hp
bGRyZW4gPSBjaGlsZHJlbiA/IGNoaWxkcmVuIDogW10KKyAgICBlbmQKKworICAgIGRlZiBoYXNP
cGNvZGUKKyAgICAgICAgb3Bjb2RlICE9IG5pbAorICAgIGVuZAorCisgICAgZGVmIGVhY2hWYXJp
YWJsZSgmcHJvYykKKyAgICAgICAgY2hpbGRyZW4uZWFjaF93aXRoX2luZGV4IHsKKyAgICAgICAg
ICAgIHwgY2hpbGQsIGluZGV4IHwKKyAgICAgICAgICAgIHlpZWxkIHZhck5hbWUsCisgICAgICAg
ICAgICAgICAgICBjaGlsZC5uYW1lLAorICAgICAgICAgICAgICAgICAgY2hpbGQudmFyTmFtZSwK
KyAgICAgICAgICAgICAgICAgIGNoaWxkLmFub255bW91cyA/IChjaGlsZC5vcGNvZGUgPyA6YW5v
bkludGVybmFsIDogOmFub25PcGVyYW5kKSA6IChjaGlsZC5vcGNvZGUgPyA6aW50ZXJuYWwgOiA6
b3BlcmFuZCksCisgICAgICAgICAgICAgICAgICBpbmRleAorICAgICAgICAgICAgY2hpbGQuZWFj
aFZhcmlhYmxlKCZwcm9jKQorICAgICAgICB9CisgICAgZW5kCitlbmQKKworY2xhc3MgTWF0Y2hl
cgorICAgIGF0dHJfcmVhZGVyIDpuYW1lLCA6cHJvZHVjdGlvbnMKKworICAgIGRlZiBpbml0aWFs
aXplKG5hbWUsIHByb2R1Y3Rpb25zKQorICAgICAgICBAbmFtZSA9IG5hbWUKKyAgICAgICAgQHBy
b2R1Y3Rpb25zID0gcHJvZHVjdGlvbnMKKyAgICBlbmQKK2VuZAorCitjbGFzcyBPcmlnaW4KKyAg
ICBhdHRyX3JlYWRlciA6ZmlsZU5hbWUsIDpsaW5lTnVtYmVyCisgICAgCisgICAgZGVmIGluaXRp
YWxpemUoZmlsZU5hbWUsIGxpbmVOdW1iZXIpCisgICAgICAgIEBmaWxlTmFtZSA9IGZpbGVOYW1l
CisgICAgICAgIEBsaW5lTnVtYmVyID0gbGluZU51bWJlcgorICAgIGVuZAorICAgIAorICAgIGRl
ZiB0b19zCisgICAgICAgICIje2ZpbGVOYW1lfToje2xpbmVOdW1iZXJ9IgorICAgIGVuZAorZW5k
CisKK2NsYXNzIFRva2VuCisgICAgYXR0cl9yZWFkZXIgOm9yaWdpbiwgOnN0cmluZworICAgIAor
ICAgIGRlZiBpbml0aWFsaXplKG9yaWdpbiwgc3RyaW5nKQorICAgICAgICBAb3JpZ2luID0gb3Jp
Z2luCisgICAgICAgIEBzdHJpbmcgPSBzdHJpbmcKKyAgICBlbmQKKyAgICAKKyAgICBkZWYgPT0o
b3RoZXIpCisgICAgICAgIGlmIG90aGVyLmlzX2E/IFRva2VuCisgICAgICAgICAgICBAc3RyaW5n
ID09IG90aGVyLnN0cmluZworICAgICAgICBlbHNlCisgICAgICAgICAgICBAc3RyaW5nID09IG90
aGVyCisgICAgICAgIGVuZAorICAgIGVuZAorICAgIAorICAgIGRlZiA9fihvdGhlcikKKyAgICAg
ICAgQHN0cmluZyA9fiBvdGhlcgorICAgIGVuZAorICAgIAorICAgIGRlZiB0b19zCisgICAgICAg
ICIje0BzdHJpbmcuaW5zcGVjdH0gYXQgI3tvcmlnaW59IgorICAgIGVuZAorICAgIAorICAgIGRl
ZiBwYXJzZUVycm9yKCpjb21tZW50KQorICAgICAgICBpZiBjb21tZW50LmVtcHR5PworICAgICAg
ICAgICAgcmFpc2UgIlBhcnNlIGVycm9yOiAje3RvX3N9IgorICAgICAgICBlbHNlCisgICAgICAg
ICAgICByYWlzZSAiUGFyc2UgZXJyb3I6ICN7dG9fc306ICN7Y29tbWVudFswXX0iCisgICAgICAg
IGVuZAorICAgIGVuZAorZW5kCisKK2RlZiBsZXgoc3RyLCBmaWxlTmFtZSkKKyAgICBmaWxlTmFt
ZSA9IFBhdGhuYW1lLm5ldyhmaWxlTmFtZSkKKyAgICByZXN1bHQgPSBbXQorICAgIGxpbmVOdW1i
ZXIgPSAxCisgICAgd2hpbGUgbm90IHN0ci5lbXB0eT8KKyAgICAgICAgY2FzZSBzdHIKKyAgICAg
ICAgd2hlbiAvXEFcIyhbXlxuXSopLworICAgICAgICAgICAgIyBjb21tZW50LCBpZ25vcmUKKyAg
ICAgICAgd2hlbiAvXEFcbi8KKyAgICAgICAgICAgICMgbmV3bGluZSwgaWdub3JlCisgICAgICAg
ICAgICBsaW5lTnVtYmVyICs9IDEKKyAgICAgICAgd2hlbiAvXEFbYS16QS1aMC05JF0oW2EtekEt
WjAtOV9dKikvCisgICAgICAgICAgICByZXN1bHQgPDwgVG9rZW4ubmV3KE9yaWdpbi5uZXcoZmls
ZU5hbWUsIGxpbmVOdW1iZXIpLCAkJikKKyAgICAgICAgd2hlbiAvXEEoWyBcdFxyXSspLworICAg
ICAgICAgICAgIyB3aGl0ZXNwYWNlLCBpZ25vcmUKKyAgICAgICAgd2hlbiAvXEFbPSgpLF0vCisg
ICAgICAgICAgICByZXN1bHQgPDwgVG9rZW4ubmV3KE9yaWdpbi5uZXcoZmlsZU5hbWUsIGxpbmVO
dW1iZXIpLCAkJikKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcmFpc2UgIkxleGVyIGVycm9y
IGF0ICN7T3JpZ2luLm5ldyhmaWxlTmFtZSwgbGluZU51bWJlcikudG9fc30sIHVuZXhwZWN0ZWQg
c2VxdWVuY2UgI3tzdHJbMC4uMjBdLmluc3BlY3R9IgorICAgICAgICBlbmQKKyAgICAgICAgc3Ry
ID0gJH4ucG9zdF9tYXRjaAorICAgIGVuZAorICAgIHJlc3VsdAorZW5kCisKK2RlZiBpc0tleXdv
cmQodG9rZW4pCisgICAgIyBXZSBjYW4gZXh0ZW5kIHRoaXMgYXMgd2UgYWRkIG1vcmUga2V5d29y
ZHMuIExpa2UsIHdlIG1pZ2h0IHdhbnQgImluY2x1ZGUiIGV2ZW50dWFsbHkuCisgICAgdG9rZW4g
PX4gL1xBKChtYXRjaGVyKSlcWi8KK2VuZAorCitkZWYgaXNJZGVudGlmaWVyKHRva2VuKQorICAg
IHRva2VuID1+IC9cQVthLXpBLVowLTkkXShbYS16QS1aMC05X10qKVxaLyBhbmQgbm90IGlzS2V5
d29yZCh0b2tlbikKK2VuZAorCitjbGFzcyBQYXJzZXIKKyAgICBkZWYgaW5pdGlhbGl6ZShkYXRh
LCBmaWxlTmFtZSkKKyAgICAgICAgQHRva2VucyA9IGxleChkYXRhLCBmaWxlTmFtZSkKKyAgICAg
ICAgQGlkeCA9IDAKKyAgICBlbmQKKworICAgIGRlZiB0b2tlbgorICAgICAgICBAdG9rZW5zW0Bp
ZHhdCisgICAgZW5kCisKKyAgICBkZWYgYWR2YW5jZQorICAgICAgICBAaWR4ICs9IDEKKyAgICBl
bmQKKworICAgIGRlZiBwYXJzZUVycm9yKCpjb21tZW50KQorICAgICAgICBpZiB0b2tlbgorICAg
ICAgICAgICAgdG9rZW4ucGFyc2VFcnJvcigqY29tbWVudCkKKyAgICAgICAgZWxzZQorICAgICAg
ICAgICAgaWYgY29tbWVudC5lbXB0eT8KKyAgICAgICAgICAgICAgICByYWlzZSAiUGFyc2UgZXJy
b3IgYXQgZW5kIG9mIGZpbGUiCisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgcmFp
c2UgIlBhcnNlIGVycm9yIGF0IGVuZCBvZiBmaWxlOiAje2NvbW1lbnRbMF19IgorICAgICAgICAg
ICAgZW5kCisgICAgICAgIGVuZAorICAgIGVuZAorCisgICAgZGVmIGNvbnN1bWUoc3RyaW5nKQor
ICAgICAgICBwYXJzZUVycm9yKCJFeHBlY3RlZCAje3N0cmluZ30iKSB1bmxlc3MgdG9rZW4gPT0g
c3RyaW5nCisgICAgICAgIGFkdmFuY2UKKyAgICBlbmQKKworICAgIGRlZiBjb25zdW1lSWRlbnRp
ZmllcgorICAgICAgICByZXN1bHQgPSB0b2tlbi5zdHJpbmcKKyAgICAgICAgcGFyc2VFcnJvcigi
RXhwZWN0ZWQgaWRlbnRpZmllciIpIHVubGVzcyBpc0lkZW50aWZpZXIocmVzdWx0KQorICAgICAg
ICBhZHZhbmNlCisgICAgICAgIHJlc3VsdAorICAgIGVuZAorCisgICAgZGVmIGFkZFVuaXF1ZShu
YW1lLCBwcm9kdWN0aW9ucywgcHJvZHVjdGlvbikKKyAgICAgICAgaWYgbmFtZSA9PSBwcm9kdWN0
aW9uLnZhck5hbWUKKyAgICAgICAgICAgIHBhcnNlRXJyb3IoIkNoaWxkIHByb2R1Y3Rpb24gaGFz
IHNhbWUgbmFtZSBhcyBwYXJlbnQgcHJvZHVjdGlvbiIpCisgICAgICAgIGVuZAorICAgICAgICBp
ZiBwcm9kdWN0aW9ucy5kZXRlY3QgeyB8IGVudHJ5IHwgZW50cnkubmFtZSA9PSBwcm9kdWN0aW9u
Lm5hbWUgfQorICAgICAgICAgICAgcGFyc2VFcnJvcigiRHVwbGljYXRlIHByb2R1Y3Rpb24iKQor
ICAgICAgICBlbmQKKyAgICAgICAgcHJvZHVjdGlvbnMgPDwgcHJvZHVjdGlvbgorICAgIGVuZAor
CisgICAgZGVmIHBhcnNlCisgICAgICAgIGNvbnN1bWUoIm1hdGNoZXIiKQorCisgICAgICAgIG1h
dGNoZXJOYW1lID0gY29uc3VtZUlkZW50aWZpZXIKKworICAgICAgICBwcm9kdWN0aW9ucyA9IFtd
CisKKyAgICAgICAgbG9vcCB7CisgICAgICAgICAgICBicmVhayBpZiBAaWR4ID49IEB0b2tlbnMu
bGVuZ3RoCisKKyAgICAgICAgICAgICMgV2UgbWlnaHQgd2FudCB0byBzdXBwb3J0ICJpbmNsdWRl
Ii4gSWYgd2UgZGlkIHRoYXQsIGl0IHdvdWxkIGdvIGhlcmUuCisgICAgICAgICAgICBwcm9kdWN0
aW9uID0gcGFyc2VQcm9kdWN0aW9uCisgICAgICAgICAgICAKKyAgICAgICAgICAgIGlmIHByb2R1
Y3Rpb25zLmRldGVjdCB7IHwgZW50cnkgfCBlbnRyeS5uYW1lID09IHByb2R1Y3Rpb24ubmFtZSB9
CisgICAgICAgICAgICAgICAgcGFyc2VFcnJvcigiRHVwbGljYXRlIHByb2R1Y3Rpb24iKQorICAg
ICAgICAgICAgZW5kCisKKyAgICAgICAgICAgIHByb2R1Y3Rpb25zIDw8IHByb2R1Y3Rpb24KKyAg
ICAgICAgfQorCisgICAgICAgIE1hdGNoZXIubmV3KG1hdGNoZXJOYW1lLCBwcm9kdWN0aW9ucykK
KyAgICBlbmQKKworICAgIGRlZiBwYXJzZVByb2R1Y3Rpb24KKyAgICAgICAgb3JpZ2luID0gdG9r
ZW4ub3JpZ2luCisgICAgICAgIG5hbWUgPSBjb25zdW1lSWRlbnRpZmllcgorCisgICAgICAgIGlm
IHRva2VuID09ICI9IgorICAgICAgICAgICAgY29uc3VtZSgiPSIpCisgICAgICAgICAgICBvcGNv
ZGUgPSBjb25zdW1lSWRlbnRpZmllcgorICAgICAgICAgICAgY29uc3VtZSgiKCIpCisgICAgICAg
IGVsc2lmIHRva2VuID09ICIoIgorICAgICAgICAgICAgY29uc3VtZSgiKCIpCisgICAgICAgICAg
ICBvcGNvZGUgPSBuYW1lCisgICAgICAgICAgICBuYW1lID0gbmlsCisgICAgICAgIGVsc2UKKyAg
ICAgICAgICAgIHJldHVybiBQcm9kdWN0aW9uLm5ldyhvcmlnaW4sIG5hbWUsIG5pbCwgbmlsKQor
ICAgICAgICBlbmQKKyAgICAgICAgCisgICAgICAgIHByb2R1Y3Rpb25zID0gW10KKyAgICAgICAg
bG9vcCB7CisgICAgICAgICAgICBicmVhayBpZiB0b2tlbiA9PSAiKSIKKworICAgICAgICAgICAg
YWRkVW5pcXVlKG5hbWUsIHByb2R1Y3Rpb25zLCBwYXJzZVByb2R1Y3Rpb24pCisKKyAgICAgICAg
ICAgIGJyZWFrIGlmIHRva2VuID09ICIpIgorICAgICAgICAgICAgY29uc3VtZSgiLCIpCisgICAg
ICAgIH0KKworICAgICAgICAjIEFkdmFuY2UgYWZ0ZXIgdGhlICIpIgorICAgICAgICBhZHZhbmNl
CisKKyAgICAgICAgUHJvZHVjdGlvbi5uZXcob3JpZ2luLCBuYW1lLCBvcGNvZGUsIHByb2R1Y3Rp
b25zKQorICAgIGVuZAorZW5kCisKK2ZpbGVOYW1lID0gQVJHVlswXQorCitwYXJzZXIgPSBQYXJz
ZXIubmV3KElPOjpyZWFkKGZpbGVOYW1lKSwgZmlsZU5hbWUpCittYXRjaGVyID0gcGFyc2VyLnBh
cnNlCisKK2NsYXNzIFN1Yk1hdGNoCisgICAgYXR0cl9yZWFkZXIgOmluZGV4TWFwLCA6cHJvZHVj
dGlvbnMKKyAgICAKKyAgICBkZWYgaW5pdGlhbGl6ZShpbmRleExpc3QsIHByb2R1Y3Rpb25zKQor
ICAgICAgICBAaW5kZXhNYXAgPSBbXQorICAgICAgICBAcHJvZHVjdGlvbnMgPSBbXQorICAgICAg
ICBpbmRleExpc3QuZWFjaCB7CisgICAgICAgICAgICB8IGluZGV4IHwKKyAgICAgICAgICAgIEBp
bmRleE1hcCA8PCBpbmRleAorICAgICAgICAgICAgQHByb2R1Y3Rpb25zIDw8IHByb2R1Y3Rpb25z
W2luZGV4XQorICAgICAgICB9CisgICAgZW5kCisKKyAgICBkZWYgbWFwSW5kZXhMaXN0KGluZGV4
TGlzdCkKKyAgICAgICAgaW5kZXhMaXN0Lm1hcCB7CisgICAgICAgICAgICB8IGluZGV4IHwKKyAg
ICAgICAgICAgIEBpbmRleE1hcFtpbmRleF0KKyAgICAgICAgfQorICAgIGVuZAorZW5kCisKK0Zp
bGUub3BlbigiQjMiICsgbWF0Y2hlci5uYW1lICsgIi5oIiwgInciKSB7CisgICAgfCBvdXRwIHwK
KworICAgIG91dHAucHV0cyAiLy8gR2VuZXJhdGVkIGJ5IGdlbmVyYXRlX3BhdHRlcm5fbWF0Y2hl
ci5yYiBmcm9tICN7ZmlsZU5hbWV9IC0tIGRvIG5vdCBlZGl0ISIKKworICAgIG91dHAucHV0cyAi
I2lmbmRlZiBCMyN7bWF0Y2hlci5uYW1lfV9oIgorICAgIG91dHAucHV0cyAiI2RlZmluZSBCMyN7
bWF0Y2hlci5uYW1lfV9oIgorICAgIAorICAgIG91dHAucHV0cyAiI2luY2x1ZGUgXCJCM1ZhbHVl
LmhcIiIKKyAgICAKKyAgICBvdXRwLnB1dHMgIm5hbWVzcGFjZSBKU0MgeyBuYW1lc3BhY2UgQjMg
eyIKKworICAgIG91dHAucHV0cyAidGVtcGxhdGU8dHlwZW5hbWUgQWRhcHRvcj4iCisgICAgb3V0
cC5wdXRzICJ2b2lkIHJ1biN7bWF0Y2hlci5uYW1lfShWYWx1ZSogX3ZhbHVlLCBBZGFwdG9yJiBh
ZGFwdG9yKSIKKyAgICBvdXRwLnB1dHMgInsiCisKKyAgICAjIE5vdGUgdGhhdCB0aGlzIGRvZXMg
bm90IGVtaXQgcHJvcGVybHkgaW5kZW50ZWQgY29kZSwgYmVjYXVzZSBpdCdzIGEgcmVjdXJzaXZl
IGVtaXR0ZXIuIElmIHlvdQorICAgICMgd2FudCB0byBzZWUgdGhlIGNvZGUgbmljZWx5IGZvcm1h
dHRlZCwgb3BlbiBpdCBpbiBhIGdvb2QgdGV4dCBlZGl0b3IgYW5kIGFzayBpdCB0byBmb3JtYXQg
aXQKKyAgICAjIGZvciB5b3UuCisKKyAgICAjIEluIG9kZCBzaXR1YXRpb25zLCB3ZSBtYXkgbm90
IHVzZSB0aGUgaW5wdXQgdmFsdWUuIFRlbGwgdGhlIGNvbXBpbGVyIHRvIGNoaWxsIG91dCBhYm91
dCBpdC4KKyAgICBvdXRwLnB1dHMgIlVOVVNFRF9QQVJBTShfdmFsdWUpOyIKKyAgICAgICAgCisg
ICAgIyBUaGlzIGp1c3QgcHJvdGVjdHMgdGhlIGNhbGxlciBmcm9tIGhhdmluZyB0byB3b3JyeSBh
Ym91dCBwcm9kdWN0aW9ucyBoYXZpbmcgZGlmZmVyZW50IGxlbmd0aHMuCisgICAgZGVmIG1hdGNo
TGVuZ3RoKG91dHAsIHZhbHVlTmFtZSwgcHJvZHVjdGlvbnMpCisgICAgICAgIGluZGV4TGlzdHMg
PSBbXQorICAgICAgICBwcm9kdWN0aW9ucy5lYWNoX3dpdGhfaW5kZXggeworICAgICAgICAgICAg
fCBwcm9kdWN0aW9uLCBpbmRleCB8CisgICAgICAgICAgICBpZiBpbmRleExpc3RzWy0xXSBhbmQg
cHJvZHVjdGlvbnNbaW5kZXhMaXN0c1stMV1bMF1dLmNoaWxkcmVuLmxlbmd0aCA9PSBwcm9kdWN0
aW9uLmNoaWxkcmVuLmxlbmd0aAorICAgICAgICAgICAgICAgIGluZGV4TGlzdHNbLTFdIDw8IGlu
ZGV4CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgaW5kZXhMaXN0cyA8PCBbaW5k
ZXhdCisgICAgICAgICAgICBlbmQKKyAgICAgICAgfQorCisgICAgICAgIGluZGV4TGlzdHMuZWFj
aCB7CisgICAgICAgICAgICB8IGluZGV4TGlzdCB8CisgICAgICAgICAgICBsZW5ndGggPSBwcm9k
dWN0aW9uc1tpbmRleExpc3RbMF1dLmNoaWxkcmVuLmxlbmd0aAorICAgICAgICAgICAgaWYgbGVu
Z3RoID4gMAorICAgICAgICAgICAgICAgIG91dHAucHV0cyAiaWYgKCN7dmFsdWVOYW1lfS0+Y2hp
bGRyZW4uc2l6ZSgpID49ICN7bGVuZ3RofSkgeyIKKyAgICAgICAgICAgICAgICB5aWVsZCBpbmRl
eExpc3QKKyAgICAgICAgICAgICAgICBvdXRwLnB1dHMgIn0iCisgICAgICAgICAgICBlbHNlCisg
ICAgICAgICAgICAgICAgeWllbGQgaW5kZXhMaXN0CisgICAgICAgICAgICBlbmQKKyAgICAgICAg
fQorICAgIGVuZAorCisgICAgIyBUaGlzIGVmZmljaWVudGx5IHNlbGVjdHMgZnJvbSB0aGUgZ2l2
ZW4gc2V0IG9mIHByb2R1Y3Rpb25zLiBJdCBhc3N1bWVzIHRoYXQgcHJvZHVjdGlvbnMKKyAgICAj
IGFyZSBub3QgZHVwbGljYXRlZC4gSXQgeWllbGRzIHRoZSBpbmRleCBvZiB0aGUgZm91bmQgcHJv
ZHVjdGlvbiwgYW5kIHRoZSBjb3JvdXRpbmUgaXMKKyAgICAjIHJlc3BvbnNpYmxlIGZvciBlbWl0
dGluZyBzcGVjaWZpYyBjb2RlIGZvciB0aGF0IHByb2R1Y3Rpb24uIFRoZSBjb3JvdXRpbmUgaXMg
Z2l2ZW4gbGlzdHMgb2YKKyAgICAjIGluZGljZXMgb2YgcG9zc2libHktbWF0Y2hpbmcgcHJvZHVj
dGlvbnMuCisgICAgZGVmIG1hdGNoUHJvZHVjdGlvbnMob3V0cCwgdmFsdWVOYW1lLCBwcm9kdWN0
aW9ucykKKyAgICAgICAgIyBGaXJzdCwgc3BsaXQgdGhlIHByb2R1Y3Rpb25zIGxpc3QgaW50byBy
dW5zIG9mIHByb2R1Y3Rpb25zIHdpdGggYW4gb3Bjb2RlIGFuZCBwcm9kdWN0aW9ucworICAgICAg
ICAjIHdpdGhvdXQgb25lLgorICAgICAgICBpbmRleExpc3RzID0gW10KKyAgICAgICAgcHJvZHVj
dGlvbnMuZWFjaF93aXRoX2luZGV4IHsKKyAgICAgICAgICAgIHwgcHJvZHVjdGlvbiwgaW5kZXgg
fAorICAgICAgICAgICAgaWYgaW5kZXhMaXN0c1stMV0gYW5kIHByb2R1Y3Rpb25zW2luZGV4TGlz
dHNbLTFdWzBdXS5oYXNPcGNvZGUgPT0gcHJvZHVjdGlvbi5oYXNPcGNvZGUKKyAgICAgICAgICAg
ICAgICBpbmRleExpc3RzWy0xXSA8PCBpbmRleAorICAgICAgICAgICAgZWxzZQorICAgICAgICAg
ICAgICAgIGluZGV4TGlzdHMgPDwgW2luZGV4XQorICAgICAgICAgICAgZW5kCisgICAgICAgIH0K
KyAgICAgICAgCisgICAgICAgICMgTm93LCBlbWl0IHBhdHRlcm4gbWF0Y2hpbmcgY29kZS4gV2Ug
ZG8gaXQgZGlmZmVyZW50bHkgZm9yIGxpc3RzIHdpdGggYW4gb3Bjb2RlIHRoYW4gZm9yCisgICAg
ICAgICMgbGlzdHMgd2l0aG91dCBvbmUuCisgICAgICAgIGluZGV4TGlzdHMuZWFjaCB7CisgICAg
ICAgICAgICB8IGluZGV4TGlzdCB8CisgICAgICAgICAgICBpZiBwcm9kdWN0aW9uc1tpbmRleExp
c3RbMF1dLmhhc09wY29kZQorICAgICAgICAgICAgICAgICMgTm93LCB3ZSBzcGxpdCB0aGlzIGlu
ZGV4IGxpc3QgaW50byBncm91cHMgZm9yIGVhY2ggb3Bjb2RlLgorICAgICAgICAgICAgICAgIGdy
b3VwcyA9IHt9CisgICAgICAgICAgICAgICAgaW5kZXhMaXN0LmVhY2ggeworICAgICAgICAgICAg
ICAgICAgICB8IGluZGV4IHwKKyAgICAgICAgICAgICAgICAgICAgcHJvZHVjdGlvbiA9IHByb2R1
Y3Rpb25zW2luZGV4XQorICAgICAgICAgICAgICAgICAgICBpZiBncm91cHNbcHJvZHVjdGlvbi5v
cGNvZGVdCisgICAgICAgICAgICAgICAgICAgICAgICBncm91cHNbcHJvZHVjdGlvbi5vcGNvZGVd
IDw8IGluZGV4CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAg
ICAgIGdyb3Vwc1twcm9kdWN0aW9uLm9wY29kZV0gPSBbaW5kZXhdCisgICAgICAgICAgICAgICAg
ICAgIGVuZAorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICMgRW1pdCBhIHN3
aXRjaCBzdGF0ZW1lbnQuCisgICAgICAgICAgICAgICAgb3V0cC5wdXRzICJzd2l0Y2ggKCN7dmFs
dWVOYW1lfS0+b3Bjb2RlKCkpIHsiCisgICAgICAgICAgICAgICAgZ3JvdXBzLmVhY2hfcGFpciB7
CisgICAgICAgICAgICAgICAgICAgIHwgb3Bjb2RlLCBzdWJJbmRleExpc3QgfAorICAgICAgICAg
ICAgICAgICAgICBvdXRwLnB1dHMgImNhc2UgI3tvcGNvZGV9OiIKKyAgICAgICAgICAgICAgICAg
ICAgc3ViTWF0Y2ggPSBTdWJNYXRjaC5uZXcoc3ViSW5kZXhMaXN0LCBwcm9kdWN0aW9ucykKKyAg
ICAgICAgICAgICAgICAgICAgbWF0Y2hMZW5ndGgob3V0cCwgdmFsdWVOYW1lLCBzdWJNYXRjaC5w
cm9kdWN0aW9ucykgeworICAgICAgICAgICAgICAgICAgICAgICAgfCBpbmRleExpc3QgfAorICAg
ICAgICAgICAgICAgICAgICAgICAgeWllbGQgc3ViTWF0Y2gubWFwSW5kZXhMaXN0KGluZGV4TGlz
dCkKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBvdXRwLnB1dHMg
ImJyZWFrOyIKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgb3V0cC5wdXRzICJk
ZWZhdWx0OiIKKyAgICAgICAgICAgICAgICBvdXRwLnB1dHMgImJyZWFrOyIKKyAgICAgICAgICAg
ICAgICBvdXRwLnB1dHMgIn0iCisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgc3Vi
TWF0Y2ggPSBTdWJNYXRjaC5uZXcoaW5kZXhMaXN0LCBwcm9kdWN0aW9ucykKKyAgICAgICAgICAg
ICAgICBtYXRjaExlbmd0aChvdXRwLCB2YWx1ZU5hbWUsIHN1Yk1hdGNoLnByb2R1Y3Rpb25zKSB7
CisgICAgICAgICAgICAgICAgICAgIHwgaW5kZXhMaXN0IHwKKyAgICAgICAgICAgICAgICAgICAg
eWllbGQgc3ViTWF0Y2gubWFwSW5kZXhMaXN0KGluZGV4TGlzdCkKKyAgICAgICAgICAgICAgICB9
CisgICAgICAgICAgICBlbmQKKyAgICAgICAgfQorICAgIGVuZAorCisgICAgIyBUYWtlcyBwcm9k
dWN0aW9ucyB0aGF0IGhhdmUgdGhlIHNhbWUgb3Bjb2RlIGFuZCB0aGUgc2FtZSBsZW5ndGggYW5k
IHNlbGVjdHMgZnJvbSB0aGVtIGJhc2VkIG9uCisgICAgIyB0aGUgcHJvZHVjdGlvbnMgYXQgdGhl
IGdpdmVuIGNvbHVtbi4KKyAgICBkZWYgbWF0Y2hDb2x1bW4ob3V0cCwgdmFsdWVOYW1lLCBwcm9k
dWN0aW9ucywgY29sdW1uSW5kZXgpCisgICAgICAgIGlmIGNvbHVtbkluZGV4ID49IHByb2R1Y3Rp
b25zWzBdLmNoaWxkcmVuLmxlbmd0aAorICAgICAgICAgICAgeWllbGQgKDAuLi4ocHJvZHVjdGlv
bnMuc2l6ZSkpLnRvX2EKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBlbmQKKworICAgICAg
ICBzdWJWYWx1ZSA9IG5ld1ZhcgorICAgICAgICAKKyAgICAgICAgb3V0cC5wdXRzICJ7IgorICAg
ICAgICBvdXRwLnB1dHMgIlZhbHVlKiAje3N1YlZhbHVlfSA9ICN7dmFsdWVOYW1lfS0+Y2hpbGQo
I3tjb2x1bW5JbmRleH0pOyIKKworICAgICAgICAjIFdlIG1heSBub3QgdXNlIHRoaXMgdmFsdWUu
IFRlbGwgdGhlIGNvbXBpbGVyIHRvIGNoaWxsIG91dCBhYm91dCBpdC4KKyAgICAgICAgb3V0cC5w
dXRzICJVTlVTRURfUEFSQU0oI3tzdWJWYWx1ZX0pOyIKKyAgICAgICAgCisgICAgICAgIHN1YlBy
b2R1Y3Rpb25zID0gcHJvZHVjdGlvbnMubWFwIHsKKyAgICAgICAgICAgIHwgcHJvZHVjdGlvbiB8
CisgICAgICAgICAgICBwcm9kdWN0aW9uLmNoaWxkcmVuW2NvbHVtbkluZGV4XQorICAgICAgICB9
CisKKyAgICAgICAgbWF0Y2hSZWN1cnNpdmVseShvdXRwLCBzdWJWYWx1ZSwgc3ViUHJvZHVjdGlv
bnMpIHsKKyAgICAgICAgICAgIHwgaW5kZXhMaXN0IHwKKyAgICAgICAgICAgIHN1Yk1hdGNoID0g
U3ViTWF0Y2gubmV3KGluZGV4TGlzdCwgcHJvZHVjdGlvbnMpCisgICAgICAgICAgICBtYXRjaENv
bHVtbihvdXRwLCB2YWx1ZU5hbWUsIHN1Yk1hdGNoLnByb2R1Y3Rpb25zLCBjb2x1bW5JbmRleCAr
IDEpIHsKKyAgICAgICAgICAgICAgICB8IGluZGV4TGlzdCB8CisgICAgICAgICAgICAgICAgeWll
bGQgc3ViTWF0Y2gubWFwSW5kZXhMaXN0KGluZGV4TGlzdCkKKyAgICAgICAgICAgIH0KKyAgICAg
ICAgfQorCisgICAgICAgIG91dHAucHV0cyAifSIKKyAgICBlbmQKKworICAgIGRlZiBtYXRjaFJl
Y3Vyc2l2ZWx5KG91dHAsIHZhbHVlTmFtZSwgcHJvZHVjdGlvbnMpCisgICAgICAgIG1hdGNoUHJv
ZHVjdGlvbnMob3V0cCwgdmFsdWVOYW1lLCBwcm9kdWN0aW9ucykgeworICAgICAgICAgICAgfCBp
bmRleExpc3QgfAorICAgICAgICAgICAgIyBXZSBhcmUgZ3VhcmFudGVlZCB0aGF0IHRoaXMgaW5k
ZXggbGlzdCBjb250YWlucyBwcm9kdWN0aW9ucyB3aXRoIHRoZSBzYW1lIG9wY29kZSBhbmQKKyAg
ICAgICAgICAgICMgdGhlIHNhbWUgbGVuZ3RoLgorICAgICAgICAgICAgc3ViTWF0Y2ggPSBTdWJN
YXRjaC5uZXcoaW5kZXhMaXN0LCBwcm9kdWN0aW9ucykKKyAgICAgICAgICAgIG1hdGNoQ29sdW1u
KG91dHAsIHZhbHVlTmFtZSwgc3ViTWF0Y2gucHJvZHVjdGlvbnMsIDApIHsKKyAgICAgICAgICAg
ICAgICB8IGluZGV4TGlzdCB8CisgICAgICAgICAgICAgICAgeWllbGQgc3ViTWF0Y2gubWFwSW5k
ZXhMaXN0KGluZGV4TGlzdCkKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIGVuZAorCisg
ICAgbWF0Y2hSZWN1cnNpdmVseShvdXRwLCAiX3ZhbHVlIiwgbWF0Y2hlci5wcm9kdWN0aW9ucykg
eworICAgICAgICB8IGluZGV4TGlzdCB8CisgICAgICAgIGluZGV4TGlzdC5lYWNoIHsKKyAgICAg
ICAgICAgIHwgaW5kZXggfAorICAgICAgICAgICAgcHJvZHVjdGlvbiA9IG1hdGNoZXIucHJvZHVj
dGlvbnNbaW5kZXhdCisgICAgICAgICAgICBvdXRwLnB1dHMgInsiCisgICAgICAgICAgICBvdXRw
LnB1dHMgIlZhbHVlKiAje3Byb2R1Y3Rpb24udmFyTmFtZX0gPSBfdmFsdWU7IgorICAgICAgICAg
ICAgaW50ZXJuYWxBcmd1bWVudHMgPSBbXQorICAgICAgICAgICAgb3BlcmFuZEFyZ3VtZW50cyA9
IFtdCisgICAgICAgICAgICB0cnlBcmd1bWVudHMgPSBbXQorICAgICAgICAgICAgbnVtU2NvcGVz
ID0gMAorICAgICAgICAgICAgc2VlbiA9IHt9CisgICAgICAgICAgICBwcm9kdWN0aW9uLmVhY2hW
YXJpYWJsZSB7CisgICAgICAgICAgICAgICAgfCBwYXJlbnRWYXJOYW1lLCBjaGlsZE5hbWUsIGNo
aWxkVmFyTmFtZSwga2luZCwgaW5kZXggfAorICAgICAgICAgICAgICAgIGxvYWRFeHByID0gIiN7
cGFyZW50VmFyTmFtZX0tPmNoaWxkKCN7aW5kZXh9KSIKKyAgICAgICAgICAgICAgICAKKyAgICAg
ICAgICAgICAgICBpZiBzZWVuW2NoaWxkVmFyTmFtZV0KKyAgICAgICAgICAgICAgICAgICAgdG1w
ID0gbmV3VmFyCisgICAgICAgICAgICAgICAgICAgIG91dHAucHV0cyAiVmFsdWUqICN7dG1wfSA9
ICN7bG9hZEV4cHJ9OyIKKyAgICAgICAgICAgICAgICAgICAgb3V0cC5wdXRzICJpZiAoI3t0bXB9
ID09ICN7Y2hpbGRWYXJOYW1lfSkgeyIKKyAgICAgICAgICAgICAgICAgICAgbnVtU2NvcGVzICs9
IDEKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHNlZW5bY2hpbGRW
YXJOYW1lXSA9IHRydWUKKyAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAg
IG91dHAucHV0cyAiVmFsdWUqICN7Y2hpbGRWYXJOYW1lfSA9ICN7bG9hZEV4cHJ9OyIKKworICAg
ICAgICAgICAgICAgICAgICBpZiBjaGlsZE5hbWUgPX4gL1xBXCQvCisgICAgICAgICAgICAgICAg
ICAgICAgICBpZiBjaGlsZE5hbWUgPX4gL1xBXCQoWzAtOV0rKVxaLworICAgICAgICAgICAgICAg
ICAgICAgICAgICAgIG91dHAucHV0cyAiaWYgKCN7Y2hpbGRWYXJOYW1lfS0+aXNJbnQoI3skMX0p
KSB7IgorICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAg
ICAgICAgIG91dHAucHV0cyAiaWYgKCN7Y2hpbGRWYXJOYW1lfS0+aGFzSW50KCkpIHsiCisgICAg
ICAgICAgICAgICAgICAgICAgICBlbmQKKyAgICAgICAgICAgICAgICAgICAgICAgIG51bVNjb3Bl
cyArPSAxCisgICAgICAgICAgICAgICAgICAgIGVuZAorICAgICAgICAgICAgICAgICAgICAKKyAg
ICAgICAgICAgICAgICAgICAgaW50ZXJuYWxBcmd1bWVudHMgPDwgY2hpbGRWYXJOYW1lIGlmIGtp
bmQgPT0gOmludGVybmFsIG9yIGtpbmQgPT0gOmFub25JbnRlcm5hbAorICAgICAgICAgICAgICAg
ICAgICBvcGVyYW5kQXJndW1lbnRzIDw8IGNoaWxkVmFyTmFtZSBpZiBraW5kID09IDpvcGVyYW5k
IG9yIGtpbmQgPT0gOmFub25PcGVyYW5kCisgICAgICAgICAgICAgICAgICAgIHRyeUFyZ3VtZW50
cyA8PCBjaGlsZFZhck5hbWUgaWYga2luZCA9PSA6aW50ZXJuYWwgb3Iga2luZCA9PSA6b3BlcmFu
ZAorICAgICAgICAgICAgICAgIGVuZAorICAgICAgICAgICAgfQorICAgICAgICAgICAgb3V0cC5w
dXRzICJpZiAoYWRhcHRvci5hY2NlcHRSb290KF92YWx1ZSkiCisgICAgICAgICAgICBvdXRwLnB1
dHMoIiAgICAmJiBhZGFwdG9yLmFjY2VwdEludGVybmFscygiICsgaW50ZXJuYWxBcmd1bWVudHMu
am9pbigiLCAiKSArICIpIikKKyAgICAgICAgICAgIG91dHAucHV0cygiICAgICYmIGFkYXB0b3Iu
YWNjZXB0T3BlcmFuZHMoIiArIG9wZXJhbmRBcmd1bWVudHMuam9pbigiLCAiKSArICIpIikKKyAg
ICAgICAgICAgIG91dHAucHV0cygiICAgICYmIGFkYXB0b3IudHJ5I3twcm9kdWN0aW9uLm5hbWV9
KCIgKyB0cnlBcmd1bWVudHMuam9pbigiLCAiKSArICIpKSIpCisgICAgICAgICAgICBvdXRwLnB1
dHMgIiAgICByZXR1cm47IgorICAgICAgICAgICAgbnVtU2NvcGVzLnRpbWVzIHsKKyAgICAgICAg
ICAgICAgICBvdXRwLnB1dHMgIn0iCisgICAgICAgICAgICB9CisgICAgICAgICAgICBvdXRwLnB1
dHMgIn0iCisgICAgICAgIH0KKyAgICB9CisgICAgCisgICAgb3V0cC5wdXRzICIgICAgUkVMRUFT
RV9BU1NFUlRfTk9UX1JFQUNIRUQoKTsiCisgICAgb3V0cC5wdXRzICJ9IgorICAgIAorICAgIG91
dHAucHV0cyAifSB9IC8vIG5hbWVzcGFjZSBKU0M6OkIzIgorCisgICAgb3V0cC5wdXRzICIjZW5k
aWYgLy8gQjMje21hdGNoZXIubmFtZX1faCIKK30KSW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29y
ZS9iMy9haXIvQWlyQXJnLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUv
YjMvYWlyL0FpckFyZy5jcHAJKHJldmlzaW9uIDApCisrKyBTb3VyY2UvSmF2YVNjcmlwdENvcmUv
YjMvYWlyL0FpckFyZy5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSw3NSBAQAorLyoKKyAq
IENvcHlyaWdodCAoQykgMjAxNSBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgor
ICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0
aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhh
dCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1
dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICog
ICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNj
bGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9k
dWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRp
dGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50
YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRp
b24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIGBgQVMg
SVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5H
LCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNI
QU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBE
SVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUgorICogQ09OVFJJQlVU
T1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJ
QUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBC
VVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9S
IFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNT
IElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJ
QUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAor
ICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZ
IE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0Yg
VEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLiAKKyAqLworCisjaW5jbHVkZSAiY29uZmln
LmgiCisjaW5jbHVkZSAiQWlyQXJnLmgiCisKK25hbWVzcGFjZSBKU0MgeyBuYW1lc3BhY2UgQjMg
eyBuYW1lc3BhY2UgQWlyIHsKKwordm9pZCBBcmc6OmR1bXAoUHJpbnRTdHJlYW0mIG91dCkgY29u
c3QKK3sKKyAgICBzd2l0Y2ggKG1fa2luZCkgeworICAgIGNhc2UgVG1wOgorICAgICAgICBvdXQu
cHJpbnQodG1wKCkpOworICAgICAgICByZXR1cm47CisgICAgY2FzZSBJbW06CisgICAgICAgIG91
dC5wcmludCgiJCIsIG1fb2Zmc2V0KTsKKyAgICAgICAgcmV0dXJuOworICAgIGNhc2UgSW1tUHRy
OgorICAgICAgICBvdXQucHJpbnRmKCIkMHgleCIsIG1fb2Zmc2V0KTsKKyAgICAgICAgcmV0dXJu
OworICAgIGNhc2UgQWRkcjoKKyAgICAgICAgaWYgKG9mZnNldCgpKQorICAgICAgICAgICAgb3V0
LnByaW50KG9mZnNldCgpKTsKKyAgICAgICAgb3V0LnByaW50KCIoIiwgYmFzZSgpLCAiKSIpOwor
ICAgICAgICByZXR1cm47CisgICAgY2FzZSBJbmRleDoKKyAgICAgICAgaWYgKG9mZnNldCgpKQor
ICAgICAgICAgICAgb3V0LnByaW50KG9mZnNldCgpKTsKKyAgICAgICAgb3V0LnByaW50KCIoIiwg
YmFzZSgpLCAiLCIsIGluZGV4KCkpOworICAgICAgICBpZiAoc2NhbGUoKSAhPSAxKQorICAgICAg
ICAgICAgb3V0LnByaW50KCIsIiwgc2NhbGUoKSk7CisgICAgICAgIG91dC5wcmludCgiKSIpOwor
ICAgICAgICByZXR1cm47CisgICAgY2FzZSBTdGFjazoKKyAgICAgICAgaWYgKG9mZnNldCgpKQor
ICAgICAgICAgICAgb3V0LnByaW50KG9mZnNldCk7CisgICAgICAgIG91dC5wcmludCgiKCIsIHBv
aW50ZXJEdW1wKHN0YWNrU2xvdCgpKSwgIikiKTsKKyAgICAgICAgcmV0dXJuOworICAgIGNhc2Ug
Q2FsbEFyZzoKKyAgICAgICAgaWYgKG9mZnNldCgpKQorICAgICAgICAgICAgb3V0LnByaW50KG9m
ZnNldCk7CisgICAgICAgIG91dC5wcmludCgiKGNhbGxBcmcpIik7CisgICAgICAgIHJldHVybjsK
KyAgICBjYXNlIFNwZWNpYWw6CisgICAgICAgIG91dC5wcmludCgiJiIsIHBvaW50ZXJEdW1wKHNw
ZWNpYWwoKSkpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgUkVMRUFTRV9BU1NFUlRf
Tk9UX1JFQUNIRUQoKTsKK30KKworfSB9IH0gLy8gbmFtZXNwYWNlIEpTQzo6QjM6OkFpcgorCklu
ZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvYWlyL0FpckFyZy5oCj09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0t
IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9haXIvQWlyQXJnLmgJKHJldmlzaW9uIDApCisrKyBT
b3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvYWlyL0FpckFyZy5oCSh3b3JraW5nIGNvcHkpCkBAIC0w
LDAgKzEsNTIwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE1IEFwcGxlIEluYy4gQWxsIHJp
Z2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBh
bmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBl
cm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1l
dDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUg
YWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFu
ZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmlu
YXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNl
LCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGlu
IHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVk
IHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVE
IEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBX
QVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVE
IFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VM
QVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJ
TkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVD
VCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBE
QU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9G
IFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICog
UFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04g
QU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1Qg
TElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNF
KSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUs
IEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICov
CisKKyNpZm5kZWYgQWlyQXJnX2gKKyNkZWZpbmUgQWlyQXJnX2gKKworI2luY2x1ZGUgIkFpclRt
cC5oIgorI2luY2x1ZGUgIkIzVHlwZS5oIgorCituYW1lc3BhY2UgSlNDIHsgbmFtZXNwYWNlIEIz
IHsgbmFtZXNwYWNlIEFpciB7CisKK2NsYXNzIFNwZWNpYWw7CitjbGFzcyBTdGFja1Nsb3Q7CisK
Ky8vIFRoaXMgY2xhc3MgbmFtZSBpcyBhbHNvIGludGVudGlvbmFsbHkgdGVyc2UgYmVjYXVzZSB3
ZSB3aWxsIHNheSBpdCBhIGxvdC4gWW91J2xsIHNlZSBjb2RlIGxpa2UKKy8vIEluc3QoLi4uLCBB
cmc6OmltbSg1KSwgQXJnOjphZGRyKHRoaW5nLCBibGFoKSwgLi4uKQorY2xhc3MgQXJnIHsKK3B1
YmxpYzoKKyAgICAvLyBUaGVzZSBlbnVtIG1lbWJlcnMgYXJlIGludGVudGlvbmFsbHkgdGVyc2Ug
YmVjYXVzZSB3ZSBoYXZlIHRvIG1lbnRpb24gdGhlbSBhIGxvdC4KKyAgICBlbnVtIEtpbmQgOiBp
bnQ4X3QgeworICAgICAgICBUbXAsCisgICAgICAgIEltbSwKKyAgICAgICAgSW1tUHRyLAorICAg
ICAgICBBZGRyLAorICAgICAgICBTdGFjaywKKyAgICAgICAgQ2FsbEFyZywKKyAgICAgICAgSW5k
ZXgsCisgICAgICAgIFNwZWNpYWwKKyAgICB9OworCisgICAgZW51bSBSb2xlIDogaW50OF90IHsK
KyAgICAgICAgVXNlLAorICAgICAgICBEZWYsCisgICAgICAgIFVzZURlZgorICAgIH07CisKKyAg
ICBlbnVtIFR5cGUgOiBpbnQ4X3QgeworICAgICAgICBHUCwKKyAgICAgICAgRlAKKyAgICB9Owor
CisgICAgc3RhdGljIGJvb2wgaXNVc2UoUm9sZSByb2xlKQorICAgIHsKKyAgICAgICAgc3dpdGNo
IChyb2xlKSB7CisgICAgICAgIGNhc2UgVXNlOgorICAgICAgICBjYXNlIFVzZURlZjoKKyAgICAg
ICAgICAgIHJldHVybiB0cnVlOworICAgICAgICBjYXNlIERlZjoKKyAgICAgICAgICAgIHJldHVy
biBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHN0YXRpYyBib29sIGlzRGVmKFJvbGUg
cm9sZSkKKyAgICB7CisgICAgICAgIHN3aXRjaCAocm9sZSkgeworICAgICAgICBjYXNlIFVzZToK
KyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgY2FzZSBEZWY6CisgICAgICAgIGNh
c2UgVXNlRGVmOgorICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICB9CisK
KyAgICBzdGF0aWMgVHlwZSB0eXBlRm9yQjNUeXBlKEIzOjpUeXBlIHR5cGUpCisgICAgeworICAg
ICAgICBzd2l0Y2ggKHR5cGUpIHsKKyAgICAgICAgY2FzZSBWb2lkOgorICAgICAgICAgICAgQVNT
RVJUX05PVF9SRUFDSEVEKCk7CisgICAgICAgICAgICByZXR1cm4gR1A7CisgICAgICAgIGNhc2Ug
SW50MzI6CisgICAgICAgIGNhc2UgSW50NjQ6CisgICAgICAgICAgICByZXR1cm4gR1A7CisgICAg
ICAgIGNhc2UgRG91YmxlOgorICAgICAgICAgICAgcmV0dXJuIEZQOworICAgICAgICB9CisgICAg
ICAgIEFTU0VSVF9OT1RfUkVBQ0hFRCgpOworICAgICAgICByZXR1cm4gR1A7CisgICAgfQorCisg
ICAgQXJnKCkKKyAgICB7CisgICAgfQorCisgICAgQXJnKEFpcjo6VG1wIHRtcCkKKyAgICAgICAg
OiBtX2tpbmQoVG1wKQorICAgICAgICAsIG1fYmFzZSh0bXApCisgICAgeworICAgIH0KKworICAg
IHN0YXRpYyBBcmcgaW1tKGludHB0cl90IHZhbHVlKQorICAgIHsKKyAgICAgICAgQXJnIHJlc3Vs
dDsKKyAgICAgICAgcmVzdWx0Lm1fa2luZCA9IEltbTsKKyAgICAgICAgcmVzdWx0Lm1fb2Zmc2V0
ID0gdmFsdWU7CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorCisgICAgc3RhdGljIEFy
ZyBpbW1QdHIoaW50cHRyX3QgdmFsdWUpCisgICAgeworICAgICAgICBBcmcgcmVzdWx0OworICAg
ICAgICByZXN1bHQubV9raW5kID0gSW1tUHRyOworICAgICAgICByZXN1bHQubV9vZmZzZXQgPSB2
YWx1ZTsKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisKKyAgICBzdGF0aWMgQXJnIGFk
ZHJlc3MoQWlyOjpUbXAgYmFzZSwgaW50MzJfdCBvZmZzZXQgPSAwKQorICAgIHsKKyAgICAgICAg
QVNTRVJUKGJhc2UuaXNHUCgpKTsKKyAgICAgICAgQXJnIHJlc3VsdDsKKyAgICAgICAgcmVzdWx0
Lm1fa2luZCA9IEFkZHI7CisgICAgICAgIHJlc3VsdC5tX2Jhc2UgPSBiYXNlOworICAgICAgICBy
ZXN1bHQubV9vZmZzZXQgPSBvZmZzZXQ7CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQor
CisgICAgc3RhdGljIEFyZyBzdGFjayhTdGFja1Nsb3QqIHZhbHVlLCBpbnQzMl90IG9mZnNldCA9
IDApCisgICAgeworICAgICAgICBBcmcgcmVzdWx0OworICAgICAgICByZXN1bHQubV9raW5kID0g
U3RhY2s7CisgICAgICAgIHJlc3VsdC5tX29mZnNldCA9IGJpdHdpc2VfY2FzdDxpbnRwdHJfdD4o
dmFsdWUpOworICAgICAgICByZXN1bHQubV9zY2FsZSA9IG9mZnNldDsgLy8gSSBrbm93LCB5dWNr
LgorICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKworICAgIHN0YXRpYyBBcmcgY2FsbEFy
ZyhpbnQzMl90IG9mZnNldCkKKyAgICB7CisgICAgICAgIEFyZyByZXN1bHQ7CisgICAgICAgIHJl
c3VsdC5tX2tpbmQgPSBDYWxsQXJnOworICAgICAgICByZXN1bHQubV9vZmZzZXQgPSBvZmZzZXQ7
CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorCisgICAgc3RhdGljIGJvb2wgaXNWYWxp
ZFNjYWxlKHVuc2lnbmVkIHNjYWxlKQorICAgIHsKKyAgICAgICAgc3dpdGNoIChzY2FsZSkgewor
ICAgICAgICBjYXNlIDE6CisgICAgICAgIGNhc2UgMjoKKyAgICAgICAgY2FzZSA0OgorICAgICAg
ICBjYXNlIDg6CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgZGVmYXVsdDoKKyAg
ICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHN0YXRpYyB1
bnNpZ25lZCBsb2dTY2FsZSh1bnNpZ25lZCBzY2FsZSkKKyAgICB7CisgICAgICAgIHN3aXRjaCAo
c2NhbGUpIHsKKyAgICAgICAgY2FzZSAxOgorICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAg
IGNhc2UgMjoKKyAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICBjYXNlIDQ6CisgICAgICAg
ICAgICByZXR1cm4gMjsKKyAgICAgICAgY2FzZSA4OgorICAgICAgICAgICAgcmV0dXJuIDM7Cisg
ICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBBU1NFUlRfTk9UX1JFQUNIRUQoKTsKKyAgICAg
ICAgICAgIHJldHVybiAwOworICAgICAgICB9CisgICAgfQorCisgICAgc3RhdGljIEFyZyBpbmRl
eChBaXI6OlRtcCBiYXNlLCBBaXI6OlRtcCBpbmRleCwgdW5zaWduZWQgc2NhbGUgPSAxLCBpbnQz
Ml90IG9mZnNldCA9IDApCisgICAgeworICAgICAgICBBU1NFUlQoYmFzZS5pc0dQKCkpOworICAg
ICAgICBBU1NFUlQoaW5kZXguaXNHUCgpKTsKKyAgICAgICAgQVNTRVJUKGlzVmFsaWRTY2FsZShz
Y2FsZSkpOworICAgICAgICBBcmcgcmVzdWx0OworICAgICAgICByZXN1bHQubV9raW5kID0gSW5k
ZXg7CisgICAgICAgIHJlc3VsdC5tX2Jhc2UgPSBiYXNlOworICAgICAgICByZXN1bHQubV9pbmRl
eCA9IGluZGV4OworICAgICAgICByZXN1bHQubV9zY2FsZSA9IHN0YXRpY19jYXN0PGludDMyX3Q+
KHNjYWxlKTsKKyAgICAgICAgcmVzdWx0Lm1fb2Zmc2V0ID0gb2Zmc2V0OworICAgICAgICByZXR1
cm4gcmVzdWx0OworICAgIH0KKworICAgIHN0YXRpYyBBcmcgc3BlY2lhbChBaXI6OlNwZWNpYWwq
IHNwZWNpYWwpCisgICAgeworICAgICAgICBBcmcgcmVzdWx0OworICAgICAgICByZXN1bHQubV9r
aW5kID0gU3BlY2lhbDsKKyAgICAgICAgcmVzdWx0Lm1fb2Zmc2V0ID0gYml0d2lzZV9jYXN0PGlu
dHB0cl90PihzcGVjaWFsKTsKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisKKyAgICBi
b29sIG9wZXJhdG9yPT0oY29uc3QgQXJnJiBvdGhlcikgY29uc3QKKyAgICB7CisgICAgICAgIHJl
dHVybiBtX29mZnNldCA9PSBvdGhlci5tX29mZnNldAorICAgICAgICAgICAgJiYgbV9raW5kID09
IG90aGVyLm1fa2luZAorICAgICAgICAgICAgJiYgbV9iYXNlID09IG90aGVyLm1fYmFzZQorICAg
ICAgICAgICAgJiYgbV9pbmRleCA9PSBvdGhlci5tX2luZGV4CisgICAgICAgICAgICAmJiBtX3Nj
YWxlID09IG90aGVyLm1fc2NhbGU7CisgICAgfQorCisgICAgYm9vbCBvcGVyYXRvciE9KGNvbnN0
IEFyZyYgb3RoZXIpIGNvbnN0CisgICAgeworICAgICAgICByZXR1cm4gISgqdGhpcyA9PSBvdGhl
cik7CisgICAgfQorCisgICAgZXhwbGljaXQgb3BlcmF0b3IgYm9vbCgpIGNvbnN0IHsgcmV0dXJu
ICp0aGlzICE9IEFyZygpOyB9CisKKyAgICBLaW5kIGtpbmQoKSBjb25zdAorICAgIHsKKyAgICAg
ICAgcmV0dXJuIG1fa2luZDsKKyAgICB9CisKKyAgICBib29sIGlzVG1wKCkgY29uc3QKKyAgICB7
CisgICAgICAgIHJldHVybiBraW5kKCkgPT0gVG1wOworICAgIH0KKworICAgIGJvb2wgaXNJbW0o
KSBjb25zdAorICAgIHsKKyAgICAgICAgcmV0dXJuIGtpbmQoKSA9PSBJbW07CisgICAgfQorCisg
ICAgYm9vbCBpc0ltbVB0cigpIGNvbnN0CisgICAgeworICAgICAgICByZXR1cm4ga2luZCgpID09
IEltbVB0cjsKKyAgICB9CisKKyAgICBib29sIGlzQWRkcigpIGNvbnN0CisgICAgeworICAgICAg
ICByZXR1cm4ga2luZCgpID09IEFkZHI7CisgICAgfQorCisgICAgYm9vbCBpc0luZGV4KCkgY29u
c3QKKyAgICB7CisgICAgICAgIHJldHVybiBraW5kKCkgPT0gSW5kZXg7CisgICAgfQorCisgICAg
Ym9vbCBpc1NwZWNpYWwoKSBjb25zdAorICAgIHsKKyAgICAgICAgcmV0dXJuIGtpbmQoKSA9PSBT
cGVjaWFsOworICAgIH0KKworICAgIEFpcjo6VG1wIHRtcCgpIGNvbnN0CisgICAgeworICAgICAg
ICBBU1NFUlQoa2luZCgpID09IFRtcCk7CisgICAgICAgIHJldHVybiBtX2Jhc2U7CisgICAgfQor
CisgICAgaW50cHRyX3QgdmFsdWUoKSBjb25zdAorICAgIHsKKyAgICAgICAgQVNTRVJUKGtpbmQo
KSA9PSBJbW0gfHwga2luZCgpID09IEltbVB0cik7CisgICAgICAgIHJldHVybiBtX29mZnNldDsK
KyAgICB9CisKKyAgICB2b2lkKiBwb2ludGVyVmFsdWUoKSBjb25zdAorICAgIHsKKyAgICAgICAg
QVNTRVJUKGtpbmQoKSA9PSBJbW1QdHIpOworICAgICAgICByZXR1cm4gYml0d2lzZV9jYXN0PHZv
aWQqPihtX29mZnNldCk7CisgICAgfQorCisgICAgQWlyOjpUbXAgYmFzZSgpIGNvbnN0CisgICAg
eworICAgICAgICBBU1NFUlQoa2luZCgpID09IEFkZHIgfHwga2luZCgpID09IEluZGV4KTsKKyAg
ICAgICAgcmV0dXJuIG1fYmFzZTsKKyAgICB9CisKKyAgICBpbnQzMl90IG9mZnNldCgpIGNvbnN0
CisgICAgeworICAgICAgICBpZiAoa2luZCgpID09IFN0YWNrKQorICAgICAgICAgICAgcmV0dXJu
IHN0YXRpY19jYXN0PGludDMyX3Q+KG1fc2NhbGUpOworICAgICAgICBBU1NFUlQoa2luZCgpID09
IEFkZHIgfHwga2luZCgpID09IENhbGxBcmcgfHwga2luZCgpID09IEluZGV4KTsKKyAgICAgICAg
cmV0dXJuIHN0YXRpY19jYXN0PGludDMyX3Q+KG1fb2Zmc2V0KTsKKyAgICB9CisKKyAgICBTdGFj
a1Nsb3QqIHN0YWNrU2xvdCgpIGNvbnN0CisgICAgeworICAgICAgICBBU1NFUlQoa2luZCgpID09
IFN0YWNrKTsKKyAgICAgICAgcmV0dXJuIGJpdHdpc2VfY2FzdDxTdGFja1Nsb3QqPihtX29mZnNl
dCk7CisgICAgfQorCisgICAgQWlyOjpUbXAgaW5kZXgoKSBjb25zdAorICAgIHsKKyAgICAgICAg
QVNTRVJUKGtpbmQoKSA9PSBJbmRleCk7CisgICAgICAgIHJldHVybiBtX2luZGV4OworICAgIH0K
KworICAgIHVuc2lnbmVkIHNjYWxlKCkgY29uc3QKKyAgICB7CisgICAgICAgIEFTU0VSVChraW5k
KCkgPT0gSW5kZXgpOworICAgICAgICByZXR1cm4gbV9zY2FsZTsKKyAgICB9CisKKyAgICB1bnNp
Z25lZCBsb2dTY2FsZSgpIGNvbnN0CisgICAgeworICAgICAgICByZXR1cm4gbG9nU2NhbGUoc2Nh
bGUoKSk7CisgICAgfQorCisgICAgQWlyOjpTcGVjaWFsKiBzcGVjaWFsKCkgY29uc3QKKyAgICB7
CisgICAgICAgIEFTU0VSVChraW5kKCkgPT0gU3BlY2lhbCk7CisgICAgICAgIHJldHVybiBiaXR3
aXNlX2Nhc3Q8QWlyOjpTcGVjaWFsKj4obV9vZmZzZXQpOworICAgIH0KKworICAgIGJvb2wgaXNH
UFRtcCgpIGNvbnN0CisgICAgeworICAgICAgICByZXR1cm4gaXNUbXAoKSAmJiB0bXAoKS5pc0dQ
KCk7CisgICAgfQorCisgICAgYm9vbCBpc0ZQVG1wKCkgY29uc3QKKyAgICB7CisgICAgICAgIHJl
dHVybiBpc1RtcCgpICYmIHRtcCgpLmlzRlAoKTsKKyAgICB9CisgICAgCisgICAgLy8gVGVsbHMg
dXMgaWYgdGhpcyBBcmcgY2FuIGJlIHVzZWQgaW4gYSBwb3NpdGlvbiB0aGF0IHJlcXVpcmVzIGEg
R1AgdmFsdWUuCisgICAgYm9vbCBpc0dQKCkgY29uc3QKKyAgICB7CisgICAgICAgIHN3aXRjaCAo
a2luZCgpKSB7CisgICAgICAgIGNhc2UgSW1tOgorICAgICAgICBjYXNlIEltbVB0cjoKKyAgICAg
ICAgY2FzZSBBZGRyOgorICAgICAgICBjYXNlIEluZGV4OgorICAgICAgICBjYXNlIFN0YWNrU2xv
dDoKKyAgICAgICAgY2FzZSBDYWxsQXJnOgorICAgICAgICBjYXNlIFNwZWNpYWw6CisgICAgICAg
ICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgY2FzZSBUbXA6CisgICAgICAgICAgICByZXR1cm4g
aXNHUFRtcCgpOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gVGVsbHMgdXMgaWYgdGhpcyBB
cmcgY2FuIGJlIHVzZWQgaW4gYSBwb3NpdGlvbiB0aGF0IHJlcXVpcmVzIGEgRlAgdmFsdWUuCisg
ICAgYm9vbCBpc0ZQKCkgY29uc3QKKyAgICB7CisgICAgICAgIHN3aXRjaCAoa2luZCgpKSB7Cisg
ICAgICAgIGNhc2UgSW1tOgorICAgICAgICBjYXNlIEltbVB0cjoKKyAgICAgICAgY2FzZSBTcGVj
aWFsOgorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICBjYXNlIEFkZHI6CisgICAg
ICAgIGNhc2UgSW5kZXg6CisgICAgICAgIGNhc2UgQmFzZToKKyAgICAgICAgY2FzZSBTdGFja1Ns
b3Q6CisgICAgICAgIGNhc2UgQ2FsbEFyZzoKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAg
ICAgICBjYXNlIFRtcDoKKyAgICAgICAgICAgIHJldHVybiBpc0ZQVG1wKCk7CisgICAgICAgIH0K
KyAgICB9CisKKyAgICBib29sIGhhc1R5cGUoKSBjb25zdAorICAgIHsKKyAgICAgICAgc3dpdGNo
IChraW5kKCkpIHsKKyAgICAgICAgY2FzZSBJbW06CisgICAgICAgIGNhc2UgSW1tUHRyOgorICAg
ICAgICBjYXNlIFNwZWNpYWw6CisgICAgICAgIGNhc2UgVG1wOgorICAgICAgICAgICAgcmV0dXJu
IHRydWU7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAg
ICAgIH0KKyAgICB9CisgICAgCisgICAgLy8gVGhlIHR5cGUgaXMgYW1iaWd1b3VzIGZvciBzb21l
IGFyZyBraW5kcy4gQ2FsbCB3aXRoIGNhcmUuCisgICAgVHlwZSB0eXBlKCkgY29uc3QKKyAgICB7
CisgICAgICAgIHJldHVybiBpc0dQKCkgPyBHUCA6IEZQOworICAgIH0KKworICAgIGJvb2wgaXNU
eXBlKFR5cGUgdHlwZSkgY29uc3QKKyAgICB7CisgICAgICAgIHN3aXRjaCAodHlwZSkgeworICAg
ICAgICBjYXNlIEdQOgorICAgICAgICAgICAgcmV0dXJuIGlzR1AoKTsKKyAgICAgICAgY2FzZSBG
UDoKKyAgICAgICAgICAgIHJldHVybiBpc0ZQKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBi
b29sIGlzR1BSKCkgY29uc3QKKyAgICB7CisgICAgICAgIHJldHVybiBpc1RtcCgpICYmIHRtcCgp
LmlzR1BSKCk7CisgICAgfQorCisgICAgR1BSUmVnIGdwcigpIGNvbnN0CisgICAgeworICAgICAg
ICByZXR1cm4gdG1wKCkuZ3ByKCk7CisgICAgfQorCisgICAgYm9vbCBpc0ZQUigpIGNvbnN0Cisg
ICAgeworICAgICAgICByZXR1cm4gaXNUbXAoKSAmJiB0bXAoKS5pc0ZQUigpOworICAgIH0KKwor
ICAgIEZQUlJlZyBmcHIoKSBjb25zdAorICAgIHsKKyAgICAgICAgcmV0dXJuIHRtcCgpLmZwcigp
OworICAgIH0KKyAgICAKKyAgICBib29sIGlzUmVnKCkgY29uc3QKKyAgICB7CisgICAgICAgIHJl
dHVybiBpc1RtcCgpICYmIHRtcCgpLmlzUmVnKCk7CisgICAgfQorCisgICAgUmVnIHJlZygpIGNv
bnN0CisgICAgeworICAgICAgICByZXR1cm4gdG1wKCkucmVnKCk7CisgICAgfQorCisgICAgdW5z
aWduZWQgZ3BUbXBJbmRleCgpIGNvbnN0CisgICAgeworICAgICAgICByZXR1cm4gdG1wKCkuZ3BU
bXBJbmRleCgpOworICAgIH0KKworICAgIHVuc2lnbmVkIGZwVG1wSW5kZXgoKSBjb25zdAorICAg
IHsKKyAgICAgICAgcmV0dXJuIHRtcCgpLmZwVG1wSW5kZXgoKTsKKyAgICB9CisKKyAgICB1bnNp
Z25lZCB0bXBJbmRleCgpIGNvbnN0CisgICAgeworICAgICAgICByZXR1cm4gdG1wKCkudG1wSW5k
ZXgoKTsKKyAgICB9CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBGdW5jdG9yPgorICAgIHZvaWQg
Zm9yRWFjaFRtcEZhc3QoY29uc3QgRnVuY3RvciYgZnVuY3RvcikKKyAgICB7CisgICAgICAgIHN3
aXRjaCAobV9raW5kKSB7CisgICAgICAgIGNhc2UgVG1wOgorICAgICAgICBjYXNlIEFkZHI6Cisg
ICAgICAgICAgICBmdW5jdG9yKG1fYmFzZSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAg
Y2FzZSBJbmRleDoKKyAgICAgICAgICAgIGZ1bmN0b3IobV9iYXNlKTsKKyAgICAgICAgICAgIGZ1
bmN0b3IobV9pbmRleCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAg
ICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gVGhpcyBpcyBzbWFy
dCBlbm91Z2ggdG8ga25vdyB0aGF0IGFuIGFkZHJlc3MgYXJnIGluIGEgRGVmIG9yIFVzZURlZiBy
dWxlIHdpbGwgdXNlIGl0cworICAgIC8vIHRtcHMgYW5kIG5ldmVyIGRlZiB0aGVtLiBGb3IgZXhh
bXBsZSwgdGhpczoKKyAgICAvLworICAgIC8vIG1vdiAlcmF4LCAoJXJjeCkKKyAgICAvLworICAg
IC8vIFRoaXMgZGVmcyAoJXJjeCkgYnV0IHVzZXMgJXJjeC4KKyAgICB0ZW1wbGF0ZTx0eXBlbmFt
ZSBGdW5jdG9yPgorICAgIHZvaWQgZm9yRWFjaFRtcChSb2xlIGFyZ1JvbGUsIFR5cGUgYXJnVHlw
ZSwgY29uc3QgRnVuY3RvciYgZnVuY3RvcikKKyAgICB7CisgICAgICAgIHN3aXRjaCAobV9raW5k
KSB7CisgICAgICAgIGNhc2UgVG1wOgorICAgICAgICAgICAgZnVuY3RvcihtX2Jhc2UsIGFyZ1Jv
bGUsIGFyZ1R5cGUpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQWRkcjoKKyAg
ICAgICAgICAgIGZ1bmN0b3IobV9iYXNlLCBVc2UsIEdQKTsKKyAgICAgICAgICAgIGJyZWFrOwor
ICAgICAgICBjYXNlIEluZGV4OgorICAgICAgICAgICAgZnVuY3RvcihtX2Jhc2UsIFVzZSwgR1Ap
OworICAgICAgICAgICAgZnVuY3RvcihtX2luZGV4LCBVc2UsIEdQKTsKKyAgICAgICAgICAgIGJy
ZWFrOworICAgICAgICBkZWZhdXQ6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAg
IH0KKworICAgIE1hY3JvQXNzZW1ibGVyOjpUcnVzdGVkSW1tMzIgYXNUcnVzdGVkSW1tMzIoKSBj
b25zdAorICAgIHsKKyAgICAgICAgQVNTRVJUKGlzSW1tKCkpOworICAgICAgICByZXR1cm4gTWFj
cm9Bc3NlbWJsZXI6OlRydXN0ZWRJbW0zMihzdGF0aWNfY2FzdDxpbnQzMl90PihtX29mZnNldCkp
OworICAgIH0KKworICAgIE1hY3JvQXNzZW1ibGVyOjpUcnVzdGVkSW1tMzIgYXNUcnVzdGVkSW1t
UHRyKCkgY29uc3QKKyAgICB7CisgICAgICAgIEFTU0VSVChpc0ltbVB0cigpKTsKKyAgICAgICAg
cmV0dXJuIE1hY3JvQXNzZW1ibGVyOjpUcnVzdGVkSW1tUHRyKHBvaW50ZXJWYWx1ZSgpKTsKKyAg
ICB9CisKKyAgICBNYWNyb0Fzc2VtYmxlcjo6QWRkcmVzcyBhc0FkZHJlc3MoKSBjb25zdAorICAg
IHsKKyAgICAgICAgQVNTRVJUKGlzQWRkcigpKTsKKyAgICAgICAgcmV0dXJuIE1hY3JvQXNzZW1i
bGVyOjpBZGRyZXNzKG1fYmFzZS5ncHIoKSwgc3RhdGljX2Nhc3Q8aW50MzJfdD4obV9vZmZzZXQp
KTsKKyAgICB9CisKKyAgICBNYWNyb0Fzc2VtYmxlcjo6QmFzZUluZGV4IGFzQmFzZUluZGV4KCkg
Y29uc3QKKyAgICB7CisgICAgICAgIEFTU0VSVChpc0luZGV4KCkpOworICAgICAgICByZXR1cm4g
TWFjcm9Bc3NlbWJsZXI6OkJhc2VJbmRleCgKKyAgICAgICAgICAgIG1fYmFzZS5ncHIoKSwgbV9p
bmRleC5ncHIoKSwgc3RhdGljX2Nhc3Q8TWFjcm9Bc3NlbWJsZXI6OlNjYWxlPihsb2dTY2FsZSgp
KSwKKyAgICAgICAgICAgIHN0YXRpY19jYXN0PGludDMyX3Q+KG1fb2Zmc2V0KSk7CisgICAgfQor
CisgICAgdm9pZCBkdW1wKFByaW50U3RyZWFtJikgY29uc3Q7CisKK3ByaXZhdGU6CisgICAgaW50
cHRyX3QgbV9vZmZzZXQgeyAwIH07CisgICAgS2luZCBtX2tpbmQgeyBJbW0gfTsKKyAgICBpbnQz
Ml90IG1fc2NhbGUgeyAxIH07CisgICAgQWlyOjpUbXAgbV9iYXNlOworICAgIEFpcjo6VG1wIG1f
aW5kZXg7Cit9OworCit9IH0gfSAvLyBuYW1lc3BhY2UgSlNDOjpCMzo6QWlyCisKKyNlbmRpZiAv
LyBBaXJBcmdfaAorCkluZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvYWlyL0FpckJhc2lj
QmxvY2suY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9haXIvQWly
QmFzaWNCbG9jay5jcHAJKHJldmlzaW9uIDApCisrKyBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMv
YWlyL0FpckJhc2ljQmxvY2suY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsNDQgQEAKKy8q
CisgKiBDb3B5cmlnaHQgKEMpIDIwMTUgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgor
ICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMs
IHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVk
IHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0
cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQK
KyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcg
ZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJl
cHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBj
b25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1
bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJp
YnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBg
YEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xV
RElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBN
RVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBB
UkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IKKyAqIENPTlRS
SUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBT
UEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElO
RywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09E
UyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJ
TkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBP
RiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRP
UlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5Z
IFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VE
IE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKworI2luY2x1ZGUgImNv
bmZpZy5oIgorI2luY2x1ZGUgIkFpckJhc2ljQmxvY2suaCIKKworbmFtZXNwYWNlIEpTQyB7IG5h
bWVzcGFjZSBCMyB7IG5hbWVzcGFjZSBBaXIgeworCit2b2lkIEJhc2ljQmxvY2s6OmR1bXAoUHJp
bnRTdHJlYW0mIG91dCkgY29uc3QKK3sKKyAgICBvdXQucHJpbnQoZHVtcFByZWZpeCwgbV9pbmRl
eCk7Cit9CisKK3ZvaWQgQmFzaWNCbG9jazo6ZGVlcER1bXAoUHJpbnRTdHJlYW0mIG91dCkgY29u
c3QKK3sKKyAgICBvdXQucHJpbnQoIkJCIiwgKnRoaXMsICI6XG4iKTsKKyAgICBmb3IgKGNvbnN0
IEluc3QmIGluc3QgOiAqdGhpcykKKyAgICAgICAgb3V0LnByaW50KCIgICAgIiwgaW5zdCwgIlxu
Iik7Cit9CisKK30gfSB9IC8vIG5hbWVzcGFjZSBKU0M6OkIzOjpBaXIKKwpJbmRleDogU291cmNl
L0phdmFTY3JpcHRDb3JlL2IzL2Fpci9BaXJCYXNpY0Jsb2NrLmgKPT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291
cmNlL0phdmFTY3JpcHRDb3JlL2IzL2Fpci9BaXJCYXNpY0Jsb2NrLmgJKHJldmlzaW9uIDApCisr
KyBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvYWlyL0FpckJhc2ljQmxvY2suaAkod29ya2luZyBj
b3B5KQpAQCAtMCwwICsxLDEyMSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNSBBcHBsZSBJ
bmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBp
biBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRp
b24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMK
KyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCBy
ZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29u
ZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRp
b25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAq
ICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlz
Y2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFs
cyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJ
UyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9S
IElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQor
ICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1Ig
QSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hB
TEwgQVBQTEUgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVD
VCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNF
UVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9D
VVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFU
QSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVT
RUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFD
VCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9S
IE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElT
IFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFN
QUdFLiAKKyAqLworCisjaWZuZGVmIEFpckJhc2ljQmxvY2tfaAorI2RlZmluZSBBaXJCYXNpY0Js
b2NrX2gKKworI2luY2x1ZGUgIkFpckluc3QuaCIKKyNpbmNsdWRlIDx3dGYvTm9uQ29weWFibGUu
aD4KKyNpbmNsdWRlIDx3dGYvRmFzdE1hbGxvYy5oPgorCituYW1lc3BhY2UgSlNDIHsgbmFtZXNw
YWNlIEIzIHsgbmFtZXNwYWNlIEFpciB7CisKK2NsYXNzIENvZGU7CisKK2NsYXNzIEJhc2ljQmxv
Y2sgeworICAgIFdURl9NQUtFX05PTkNPUFlBQkxFKEJhc2ljQmxvY2spOworICAgIFdURl9NQUtF
X0ZBU1RfQUxMT0NBVEVEOworcHVibGljOgorICAgIHN0YXRpYyBjb25zdCBjaGFyKiBkdW1wUHJl
Zml4ID0gIiMiOworCisgICAgdHlwZWRlZiBWZWN0b3I8SW5zdD4gSW5zdExpc3Q7CisgICAgdHlw
ZWRlZiBWZWN0b3I8QmFzaWNCbG9jayosIDI+IFN1Y2Nlc3Nvckxpc3Q7CisgICAgCisgICAgdW5z
aWduZWQgc2l6ZSgpIGNvbnN0IHsgcmV0dXJuIG1faW5zdHMuc2l6ZSgpOyB9CisgICAgSW5zdExp
c3Q6Oml0ZXJhdG9yIGJlZ2luKCkgeyByZXR1cm4gbV9pbnN0cy5iZWdpbigpOyB9CisgICAgSW5z
dExpc3Q6Oml0ZXJhdG9yIGVuZCgpIHsgcmV0dXJuIG1faW5zdHMuZW5kKCk7IH0KKyAgICBJbnN0
TGlzdDo6Y29uc3RfaXRlcmF0b3IgYmVnaW4oKSBjb25zdCB7IHJldHVybiBtX2luc3RzLmJlZ2lu
KCk7IH0KKyAgICBJbnN0TGlzdDo6Y29uc3RfaXRlcmF0b3IgZW5kKCkgY29uc3QgeyByZXR1cm4g
bV9pbnN0cy5lbmQoKTsgfQorCisgICAgc2l6ZV90IHNpemUoKSBjb25zdCB7IHJldHVybiBtX2lu
c3RzLnNpemUoKTsgfQorICAgIGNvbnN0IEluc3QmIGF0KHNpemVfdCBpbmRleCkgY29uc3QgeyBy
ZXR1cm4gbV9pbnN0c1tpbmRleF07IH0KKyAgICBJbnN0JiBhdChzaXplX3QgaW5kZXgpIHsgcmV0
dXJuIG1faW5zdHNbaW5kZXhdOyB9CisKKyAgICBjb25zdCBJbnN0JiBsYXN0KCkgY29uc3QgeyBy
ZXR1cm4gbV9pbnN0cy5sYXN0KCk7IH0KKyAgICBJbnN0JiBsYXN0KCkgeyByZXR1cm4gbV9pbnN0
cy5sYXN0KCk7IH0KKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIEluc3Q+CisgICAgdm9pZCBhcHBl
bmRJbnN0KEluc3QmJiBpbnN0KQorICAgIHsKKyAgICAgICAgbV9pbnN0cy5hcHBlbmQoc3RkOjpm
b3J3YXJkPEluc3Q+KGluc3QpKTsKKyAgICB9CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZS4uLiBB
cmd1bWVudHM+CisgICAgdm9pZCBhcHBlbmQoQXJndW1lbnRzJiYuLi4gYXJndW1lbnRzKQorICAg
IHsKKyAgICAgICAgbV9pbnN0cy5hcHBlbmQoSW5zdChzdGQ6OmZvcndhcmQ8QXJndW1lbnRzPihh
cmd1bWVudHMpLi4uKSk7CisgICAgfQorCisgICAgLy8gVGhlICIwIiBjYXNlIGlzIHRoZSBjYXNl
IHRvIHdoaWNoIHRoZSBicmFuY2gganVtcHMsIHNvIHRoZSAidGhlbiIgY2FzZS4gVGhlICIxIiBj
YXNlIGlzIHRoZQorICAgIC8vICJlbHNlIiBjYXNlLCBhbmQgaXMgdXNlZCB0byByZXByZXNlbnQg
dGhlIGZhbGwtdGhyb3VnaCBvZiBhIGNvbmRpdGlvbmFsIGJyYW5jaC4KKyAgICB1bnNpZ25lZCBu
dW1TdWNjZXNzb3JzKCkgY29uc3QgeyByZXR1cm4gbV9zdWNjZXNzb3JzLnNpemUoKTsgfQorICAg
IEJhc2ljQmxvY2sqIHN1Y2Nlc3Nvcih1bnNpZ25lZCBpbmRleCkgY29uc3QgeyByZXR1cm4gbV9z
dWNjZXNzb3JzW2luZGV4XTsgfQorICAgIEJhc2ljQmxvY2sqJiBzdWNjZXNzb3IodW5zaWduZWQg
aW5kZXgpIHsgcmV0dXJuIG1fc3VjY2Vzc29yc1tpbmRleF07IH0KKyAgICBjb25zdCBTdWNjZXNz
b3JMaXN0JiBzdWNjZXNzb3JzKCkgY29uc3QgeyByZXR1cm4gbV9zdWNjZXNzb3JzW2luZGV4XTsg
fQorICAgIFN1Y2Nlc3Nvckxpc3QmIHN1Y2Nlc3NvcnMoKSB7IHJldHVybiBtX3N1Y2Nlc3NvcnNb
aW5kZXhdOyB9CisKKyAgICB2b2lkIGR1bXAoUHJpbnRTdHJlYW0mKSBjb25zdDsKKyAgICB2b2lk
IGRlZXBEdW1wKFByaW50U3RyZWFtJikgY29uc3Q7CisKK3ByaXZhdGU6CisgICAgZnJpZW5kIGNs
YXNzIENvZGU7CisgICAgCisgICAgQmFzaWNCbG9jayh1bnNpZ25lZCBpbmRleCkKKyAgICB7Cisg
ICAgfQorCisgICAgdW5zaWduZWQgbV9pbmRleDsKKyAgICBJbnN0TGlzdCBtX2luc3RzOworICAg
IFN1Y2Nlc3Nvckxpc3QgbV9zdWNjZXNzb3JzOworfTsKKworY2xhc3MgRGVlcEJhc2ljQmxvY2tE
dW1wIHsKK3B1YmxpYzoKKyAgICBEZWVwQmFzaWNCbG9ja0R1bXAoQmFzaWNCbG9jayogYmxvY2sp
CisgICAgICAgIDogbV9ibG9jayhibG9jaykKKyAgICB7CisgICAgfQorCisgICAgdm9pZCBkdW1w
KFByaW50U3RyZWFtJiBvdXQpIGNvbnN0CisgICAgeworICAgICAgICBpZiAobV9ibG9jaykKKyAg
ICAgICAgICAgIG1fYmxvY2stPmRlZXBEdW1wKG91dCk7CisgICAgICAgIGVsc2UKKyAgICAgICAg
ICAgIG91dC5wcmludCgiPG51bGw+Iik7CisgICAgfQorCitwcml2YXRlOgorICAgIEJhc2ljQmxv
Y2sqIG1fYmxvY2s7Cit9OworCitEZWVwQmFzaWNCbG9ja0R1bXAgZGVlcER1bXAoQmFzaWNCbG9j
ayogYmxvY2spCit7CisgICAgcmV0dXJuIERlZXBCYXNpY0Jsb2NrRHVtcChibG9jayk7Cit9CisK
K30gfSB9IC8vIG5hbWVzcGFjZSBKU0M6OkIzOjpBaXIKKworI2VuZGlmIC8vIEFpckJhc2ljQmxv
Y2tfaAorCkluZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvYWlyL0FpckNDYWxsU3BlY2lh
bC5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL2Fpci9BaXJDQ2Fs
bFNwZWNpYWwuY3BwCShyZXZpc2lvbiAwKQorKysgU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL2Fp
ci9BaXJDQ2FsbFNwZWNpYWwuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsMTI4IEBACisv
KgorICogQ29weXJpZ2h0IChDKSAyMDE1IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4K
KyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1z
LCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRl
ZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlz
dHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0
CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5n
IGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCBy
ZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2Yg
Y29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9j
dW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3Ry
aWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4g
YGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNM
VURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0Yg
TUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0Ug
QVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SCisgKiBDT05U
UklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwg
U1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJ
TkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09P
RFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVT
SU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICog
T0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBU
T1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFO
WSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNF
RCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisKKyNpbmNsdWRlICJj
b25maWcuaCIKKyNpbmNsdWRlICJBaXJDQ2FsbFNwZWNpYWwuaCIKKworbmFtZXNwYWNlIEpTQyB7
IG5hbWVzcGFjZSBCMyB7IG5hbWVzcGFjZSBBaXIgeworCitDQ2FsbFNwZWNpYWw6OkNDYWxsU3Bl
Y2lhbCgpCisgICAgOiBTcGVjaWFsKCJDQ2FsbCIpOworeworICAgIG1fY2xvYmJlcmVkUmVncyA9
IFJlZ2lzdGVyU2V0OjphbGxSZWdpc3RlcnMoKTsKKyAgICBtX2Nsb2JiZXJlZFJlZ3MuZXhjbHVk
ZShSZWdpc3RlclNldDo6c3RhY2tSZWdpc3RlcnMoKSk7CisgICAgbV9jbG9iYmVyZWRSZWdzLmV4
Y2x1ZGUoUmVnaXN0ZXJTZXQ6OnJlc2VydmVkSGFyZHdhcmVSZWdpc3RlcnMoKSk7CisgICAgbV9j
bG9iYmVyZWRSZWdzLmV4Y2x1ZGUoUmVnaXN0ZXJTZXQ6OmNhbGxlZVNhdmVSZWdpc3RlcnMoKSk7
Cit9CisKK0NDYWxsU3BlY2lhbDo6fkNDYWxsU3BlY2lhbCgpCit7Cit9CisKK3ZvaWQgQ0NhbGxT
cGVjaWFsOjpmb3JFYWNoQXJnKEluc3QmIGluc3QsIGNvbnN0IFNjb3BlZExhbWJkYTxJbnN0OjpF
YWNoQXJnQ2FsbGJhY2s+JiBjYWxsYmFjaykKK3sKKyAgICBjYWxsYmFjayhpbnN0LmFyZ3NbMV0s
IEFyZzo6VXNlLCBBcmc6OkdQKTsKKyAgICAKKyAgICBmb3IgKHVuc2lnbmVkIGkgPSAyOyBpIDwg
aW5zdC5hcmdzLnNpemUoKTsgKytpKSB7CisgICAgICAgIC8vIEZvciB0aGUgdHlwZSwgd2UgY2Fu
IGp1c3QgcXVlcnkgdGhlIGFyZydzIHR5cGUuIFRoZSBhcmcgd2lsbCBoYXZlIGEgdHlwZSwgYmVj
YXVzZSB3ZQorICAgICAgICAvLyByZXF1aXJlIHRoZXNlIGFyZ3MgdG8gYmUgYXJndW1lbnQgcmVn
aXN0ZXJzLgorICAgICAgICBjYWxsYmFjayhpbnN0LmFyZ3NbaV0sIEFyZzo6VXNlLCBpbnN0LmFy
Z3NbaV0udHlwZSgpKTsKKyAgICB9Cit9CisKK2Jvb2wgQ0NhbGxTcGVjaWFsOjppc1ZhbGlkKElu
c3QmIGluc3QpCit7CisgICAgaWYgKGluc3QuYXJncy5zaXplKCkgPCAyKQorICAgICAgICByZXR1
cm4gZmFsc2U7CisKKyAgICBzd2l0Y2ggKGluc3QuYXJnc1sxXS5raW5kKCkpIHsKKyAgICBjYXNl
IEFyZzo6SW1tUHRyOgorICAgIGNhc2UgQXJnOjpUbXA6CisgICAgY2FzZSBBcmc6OkFkZHI6Cisg
ICAgY2FzZSBBcmc6OlN0YWNrOgorICAgIGNhc2UgQXJnOjpDYWxsQXJnOgorICAgICAgICBicmVh
azsKKyAgICBkZWZhdWx0OgorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgaWYg
KCFpbnN0LmFyZ3NbMV0uaXNHUCgpKQorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICBmb3Ig
KHVuc2lnbmVkIGkgPSAyOyBpIDwgaW5zdC5hcmdzLnNpemUoKTsgKytpKSB7CisgICAgICAgIGlm
ICghaW5zdC5hcmdzW2ldLmlzUmVnKCkpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAg
ICAgICAgaWYgKGluc3QuYXJnc1tpXSA9PSBUbXAoc2NyYXRjaFJlZ2lzdGVyKSkKKyAgICAgICAg
ICAgIHJldHVybiAgZmFsc2U7CisgICAgfQorICAgIHJldHVybiB0cnVlOworfQorCitib29sIEND
YWxsU3BlY2lhbDo6YWRtaXRzU3RhY2soSW5zdCYsIHVuc2lnbmVkIGFyZ0luZGV4KQoreworICAg
IC8vIEFyZyAxIGNhbiBiZSBhIHN0YWNrIGFkZHJlc3MgZm9yIHN1cmUuCisgICAgaWYgKGFyZ0lu
ZGV4ID09IDEpCisgICAgICAgIHJldHVybiB0cnVlOworICAgIAorICAgIHJldHVybiBmYWxzZTsK
K30KKwordm9pZCBDQ2FsbFNwZWNpYWw6OnJlcG9ydFVzZWRSZWdpc3RlcnMoSW5zdCYsIGNvbnN0
IFJlZ2lzdGVyU2V0JikKK3sKK30KKworQ0NhbGxIZWxwZXJzOjpKdW1wIENDYWxsU3BlY2lhbDo6
Z2VuZXJhdGUoSW5zdCYgaW5zdCwgQ0NhbGxIZWxwZXJzJiBqaXQpCit7CisgICAgc3dpdGNoIChp
bnN0LmFyZ3NbMV0ua2luZCgpKSB7CisgICAgY2FzZSBBcmc6OkltbVB0cjoKKyAgICAgICAgaml0
Lm1vdmUoQ0NhbGxIZWxwZXJzOjpUcnVzdGVkSW1tUHRyKGluc3QuYXJnc1sxXS5wb2ludGVyVmFs
dWUoKSksIHNjcmF0Y2hSZWdpc3Rlcik7CisgICAgICAgIGppdC5jYWxsKHNjcmF0Y2hSZWdpc3Rl
cik7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQXJnOjpUbXA6CisgICAgICAgIGppdC5jYWxs
KGluc3QuYXJnc1sxXS5ncHIoKSk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQXJnOjpBZGRy
OgorICAgICAgICBqaXQuY2FsbChpbnN0LmFyZ3NbMV0uYXNBZGRyZXNzKCkpOworICAgICAgICBi
cmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICBSRUxFQVNFX0FTU0VSVF9OT1RfUkVBQ0hFRCgp
OworICAgICAgICBicmVhazsKKyAgICB9CisgICAgcmV0dXJuIENDYWxsSGVscGVyczo6SnVtcCgp
OworfQorCitjb25zdCBSZWdpc3RlclNldCYgQ0NhbGxTcGVjaWFsOjpleHRyYUNsb2JiZXJlZFJl
Z3MoKQoreworICAgIHJldHVybiBtX2Nsb2JiZXJlZFJlZ3M7Cit9CisKK3ZvaWQgQ0NhbGxTcGVj
aWFsOjpkZWVwRHVtcEltcGwoUHJpbnRTdHJlYW0mIG91dCkgY29uc3QKK3sKKyAgICBvdXQucHJp
bnQoImZ1bmN0aW9uIGNhbGwgdGhhdCB1c2VzIHRoZSBDIGNhbGxpbmcgY29udmVudGlvbi4iKTsK
K30KKworfSB9IH0gLy8gbmFtZXNwYWNlIEpTQzo6QjM6OkFpcgorCkluZGV4OiBTb3VyY2UvSmF2
YVNjcmlwdENvcmUvYjMvYWlyL0FpckNDYWxsU3BlY2lhbC5oCj09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJj
ZS9KYXZhU2NyaXB0Q29yZS9iMy9haXIvQWlyQ0NhbGxTcGVjaWFsLmgJKHJldmlzaW9uIDApCisr
KyBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvYWlyL0FpckNDYWxsU3BlY2lhbC5oCSh3b3JraW5n
IGNvcHkpCkBAIC0wLDAgKzEsNjcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTUgQXBwbGUg
SW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2Ug
aW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0
aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25z
CisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3Qg
cmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNv
bmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0
aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Cisg
KiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRp
c2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlh
bHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUg
SVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBP
UiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUK
KyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9S
IEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNI
QUxMIEFQUExFIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJF
Q1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05T
RVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJP
Q1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERB
VEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FV
U0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJB
Q1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBP
UiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJ
UyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERB
TUFHRS4gCisgKi8KKworI2lmbmRlZiBBaXJDQ2FsbFNwZWNpYWxfaAorI2RlZmluZSBBaXJDQ2Fs
bFNwZWNpYWxfaAorCituYW1lc3BhY2UgSlNDIHsgbmFtZXNwYWNlIEIzIHsgbmFtZXNwYWNlIEFp
ciB7CisKKy8vIFVzZSB0aGlzIHNwZWNpYWwgZm9yIGNvbnN0cnVjdGluZyBhIEMgY2FsbC4gQXJn
IDAgaXMgb2YgY291cnNlIGEgU3BlY2lhbCBhcmcgdGhhdCByZWZlcnMgdG8gdGhlCisvLyBDQ2Fs
bFNwZWNpYWwgb2JqZWN0LiBBcmcgMSBpcyB0aGUgY2FsbGVlLCBhbmQgaXQgY2FuIGJlIGFuIElt
bVB0ciwgYSByZWdpc3Rlciwgb3IgYW4gYWRkcmVzcy4gVGhlCisvLyByZW1haW5pbmcgYXJncyBh
cmUganVzdCB0aGUgc2V0IG9mIGFyZ3VtZW50IHJlZ2lzdGVycyB1c2VkIGJ5IHRoaXMgY2FsbC4g
Rm9yIGFyZ3VtZW50cyB0aGF0IGdvIHRvCisvLyB0aGUgc3RhY2ssIHlvdSBoYXZlIHRvIGRvIHRo
ZSBncnVudCB3b3JrIG9mIGRvaW5nIHRob3NlIHN0YWNrIHN0b3Jlcy4gSW4gZmFjdCwgdGhlIG9u
bHkgcmVhc29uIHdoeQorLy8gd2Ugc3BlY2lmeSB0aGUgYXJndW1lbnQgcmVnaXN0ZXJzIGFzIGFy
Z3VtZW50cyB0byBhIGNhbGwgaXMgc28gdGhhdCB0aGUgbGl2ZW5lc3MgYW5hbHlzaXMgY2FuIHNl
ZQorLy8gdGhhdCB0aGV5IGdldCB1c2VkIGhlcmUuIEl0IHdvdWxkIGJlIHdyb25nIHRvIGF1dG9t
YWdpY2FsbHkgcmVwb3J0IGFsbCBhcmd1bWVudCByZWdpc3RlcnMgYXMgYmVpbmcKKy8vIHVzZWQg
YmVjYXVzZSBpZiB3ZSBoYWQgYSBjYWxsIHRoYXQgZGlkbid0IHBhc3MgdGhlbSwgdGhlbiB0aGV5
J2QgYXBwZWFyIHRvIGJlIGxpdmUgdW50aWwgc29tZQorLy8gY2xvYmJlciBwb2ludCBvciB0aGUg
cHJvbG9ndWUsIHdoaWNoZXZlciBoYXBwZW5lZCBzb29uZXIuCisKK2NsYXNzIENDYWxsU3BlY2lh
bCA6IHB1YmxpYyBTcGVjaWFsIHsKK3B1YmxpYzoKKyAgICBDQ2FsbFNwZWNpYWwoKTsKKyAgICB+
Q0NhbGxTcGVjaWFsKCk7CisKKyAgICAvLyBZb3UgY2Fubm90IHVzZSB0aGlzIHJlZ2lzdGVyIHRv
IHBhc3MgYXJndW1lbnRzLiBJdCBqdXN0IHNvIGhhcHBlbnMgdGhhdCB0aGlzIHJlZ2lzdGVyIGlz
IG5vdAorICAgIC8vIHVzZWQgZm9yIGFyZ3VtZW50cyBpbiB0aGUgQyBjYWxsaW5nIGNvbnZlbnRp
b24uIEJ5IHRoZSB3YXksIHRoaXMgaXMgdGhlIG9ubHkgdGhpbmcgdGhhdCBjYXVzZXMKKyAgICAv
LyB0aGlzIHNwZWNpYWwgdG8gYmUgc3BlY2lmaWMgdG8gQyBjYWxscy4KKyAgICBzdGF0aWMgY29u
c3QgR1BSUmVnIHNjcmF0Y2hSZWdpc3RlciA9IEdQUkluZm86Om5vbkFyZ0dQUjAuCisKK3Byb3Rl
Y3RlZDoKKyAgICB2b2lkIGZvckVhY2hBcmcoSW5zdCYsIGNvbnN0IFNjb3BlZExhbWJkYTxJbnN0
OjpFYWNoQXJnQ2FsbGJhY2s+Jikgb3ZlcnJpZGU7CisgICAgYm9vbCBpc1ZhbGlkKEluc3QmKSBv
dmVycmlkZTsKKyAgICBib29sIGFkbWl0c1N0YWNrKEluc3QmLCB1bnNpZ25lZCBhcmdJbmRleCkg
b3ZlcnJpZGU7CisgICAgdm9pZCByZXBvcnRVc2VkUmVnaXN0ZXJzKEluc3QmLCBjb25zdCBSZWdp
c3RlclNldCYpIG92ZXJyaWRlOworICAgIENDYWxsSGVscGVyczo6SnVtcCBnZW5lcmF0ZShJbnN0
JiwgQ0NhbGxIZWxwZXJzJikgb3ZlcnJpZGU7CisgICAgY29uc3QgUmVnaXN0ZXJTZXQmIGV4dHJh
Q2xvYmJlcmVkUmVncyhJbnN0Jikgb3ZlcnJpZGU7CisgICAgCisgICAgdm9pZCBkZWVwRHVtcElt
cGwoUHJpbnRTdHJlYW0mKSBjb25zdCBvdmVycmlkZTsKKworcHJpdmF0ZToKKyAgICBSZWdpc3Rl
clNldCBtX2Nsb2JiZXJlZFJlZ3M7Cit9OworCit9IH0gfSAvLyBuYW1lc3BhY2UgSlNDOjpCMzo6
QWlyCisKKyNlbmRpZiAvLyBBaXJDQ2FsbFNwZWNpYWxfaAorCkluZGV4OiBTb3VyY2UvSmF2YVNj
cmlwdENvcmUvYjMvYWlyL0FpckNvZGUuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2Ny
aXB0Q29yZS9iMy9haXIvQWlyQ29kZS5jcHAJKHJldmlzaW9uIDApCisrKyBTb3VyY2UvSmF2YVNj
cmlwdENvcmUvYjMvYWlyL0FpckNvZGUuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsNjQg
QEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTUgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2Vy
dmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkg
Zm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHBy
b3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4g
UmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5
cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xs
b3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBt
dXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlz
dCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAg
ICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUg
ZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUg
SU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMs
IElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElF
UyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVS
UE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IKKyAq
IENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVO
VEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElO
Q0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVU
RSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBP
UiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZ
CisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFks
IE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcg
SU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBB
RFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKworI2luY2x1
ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgIkFpckNvZGUuaCIKKworbmFtZXNwYWNlIEpTQyB7IG5h
bWVzcGFjZSBCMyB7IG5hbWVzcGFjZSBBaXIgeworCitDb2RlOjpDb2RlKCkKK3sKK30KKworQ29k
ZTo6fkNvZGUoKQoreworfQorCitCYXNpY0Jsb2NrKiBDb2RlOjphZGRCbG9jaygpCit7CisgICAg
c3RkOjp1bmlxdWVfcHRyPEJhc2ljQmxvY2s+IGJsb2NrKG5ldyBCYXNpY0Jsb2NrKG1fYmxvY2tz
LnNpemUoKSkpOworICAgIEJhc2ljQmxvY2sqIHJlc3VsdCA9IGJsb2NrLmdldCgpOworICAgIG1f
YmxvY2tzLmFwcGVuZChXVEY6Om1vdmUoYmxvY2spKTsKKyAgICByZXR1cm4gcmVzdWx0OworfQor
Cit2b2lkIENvZGU6OmR1bXAoUHJpbnRTdHJlYW0mIG91dCkgY29uc3QKK3sKKyAgICBmb3IgKEJh
c2ljQmxvY2sqIGJsb2NrIDogKnRoaXMpCisgICAgICAgIG91dC5wcmludChkZWVwRHVtcChibG9j
aykpOworICAgIGlmIChudW1TdGFja1Nsb3RzKCkpIHsKKyAgICAgICAgb3V0LnByaW50KCJTdGFj
ayBzbG90czpcbiIpOworICAgICAgICBmb3IgKFN0YWNrU2xvdCogc2xvdCA6IHN0YWNrU2xvdHMo
KSkKKyAgICAgICAgICAgIG91dC5wcmludCgiICAgICIsIGRlZXBEdW1wKHNsb3QpLCAiXG4iKTsK
KyAgICB9CisgICAgaWYgKG51bVNwZWNpYWxzKCkpIHsKKyAgICAgICAgb3V0LnByaW50KCJTcGVj
aWFsczpcbiIpOworICAgICAgICBmb3IgKFNwZWNpYWwqIHNwZWNpYWwgOiBzcGVjaWFscygpKQor
ICAgICAgICAgICAgb3V0LnByaW50KCIgICAgIiwgZGVlcER1bXAoc3BlY2lhbCksICJcbiIpOwor
ICAgIH0KK30KKworfSB9IH0gLy8gbmFtZXNwYWNlIEpTQzo6QjM6OkFpcgorCkluZGV4OiBTb3Vy
Y2UvSmF2YVNjcmlwdENvcmUvYjMvYWlyL0FpckNvZGUuaAo9PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2Uv
SmF2YVNjcmlwdENvcmUvYjMvYWlyL0FpckNvZGUuaAkocmV2aXNpb24gMCkKKysrIFNvdXJjZS9K
YXZhU2NyaXB0Q29yZS9iMy9haXIvQWlyQ29kZS5oCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEs
MTI1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE1IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyBy
ZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmlu
YXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRl
ZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAq
IDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUg
Y29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUg
Zm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZv
cm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlz
IGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQor
ICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGgg
dGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQ
UExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5U
SUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJB
TlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAq
IFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9S
CisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5D
SURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VT
IChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNU
SVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklU
UzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRI
RU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklM
SVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklT
SU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4g
SUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisKKyNp
Zm5kZWYgQWlyQ29kZV9oCisjZGVmaW5lIEFpckNvZGVfaAorCisjaW5jbHVkZSAiQWlyQmFzaWNC
bG9jay5oIgorI2luY2x1ZGUgIkFpclNwZWNpYWwuaCIKKyNpbmNsdWRlICJBaXJTdGFja1Nsb3Qu
aCIKKworbmFtZXNwYWNlIEpTQyB7IG5hbWVzcGFjZSBCMyB7CisKK2NsYXNzIFByb2NlZHVyZTsK
KworbmFtZXNwYWNlIEFpciB7CisKKy8vIFRoaXMgaXMgYW4gSVIgdGhhdCBpcyB2ZXJ5IGNsb3Nl
IHRvIHRoZSBiYXJlIG1ldGFsLiBJdCByZXF1aXJlcyBhYm91dCA0MHggbW9yZSBieXRlcyB0aGFu
IHRoZQorLy8gZ2VuZXJhdGVkIG1hY2hpbmUgY29kZSAtIGZvciBleGFtcGxlIGlmIHlvdSdyZSBn
ZW5lcmF0aW5nIDFNQiBvZiBtYWNoaW5lIGNvZGUsIHlvdSBuZWVkIGFib3V0CisvLyA0ME1CIG9m
IEFpci4KKworY2xhc3MgQ29kZSB7CisgICAgV1RGX01BS0VfTk9OQ09QWUFCTEUoQ29kZSk7Cisg
ICAgV1RGX01BS0VfRkFTVF9BTExPQ0FURUQ7CitwdWJsaWM6CisgICAgQ29kZSgpOworICAgIH5D
b2RlKCk7CisKKyAgICBCYXNpY0Jsb2NrKiBhZGRCbG9jaygpOworCisgICAgU3RhY2tTbG90KiBh
ZGRTdGFja1Nsb3QoKTsKKworICAgIFNwZWNpYWwqIGFkZFNwZWNpYWwoc3RkOjp1bmlxdWVfcHRy
PFNwZWNpYWw+KTsKKworICAgIC8vIFRoaXMgaXMgdGhlIHNwZWNpYWwgeW91IG5lZWQgdG8gbWFr
ZSBhIEMgY2FsbCEKKyAgICBTcGVjaWFsKiBjQ2FsbFNwZWNpYWwoKTsKKworICAgIHZvaWQgZHVt
cChQcmludFN0cmVhbSYpIGNvbnN0OworCisgICAgdW5zaWduZWQgc2l6ZSgpIGNvbnN0IHsgcmV0
dXJuIG1fYmxvY2tzLnNpemUoKTsgfQorICAgIEJhc2ljQmxvY2sqIGF0KHVuc2lnbmVkIGluZGV4
KSBjb25zdCB7IHJldHVybiBtX2Jsb2Nrc1tpbmRleF07IH0KKyAgICBCYXNpY0Jsb2NrKiBvcGVy
YXRvcltdKHVuc2lnbmVkIGluZGV4KSBjb25zdCB7IHJldHVybiBhdChpbmRleCk7IH0KKworICAg
IGNsYXNzIGl0ZXJhdG9yIHsKKyAgICBwdWJsaWM6CisgICAgICAgIGl0ZXJhdG9yKCk6CisgICAg
ICAgICAgICA6IG1fcHJvY2VkdXJlKG51bGxwdHIpCisgICAgICAgICAgICAsIG1faW5kZXgoMCkK
KyAgICAgICAgeworICAgICAgICB9CisKKyAgICAgICAgaXRlcmF0b3IoUHJvY2VkdXJlJiBwcm9j
ZWR1cmUsIHVuc2lnbmVkIGluZGV4KQorICAgICAgICAgICAgOiBtX3Byb2NlZHVyZSgmcHJvY2Vk
dXJlKQorICAgICAgICAgICAgLCBtX2luZGV4KGluZGV4KQorICAgICAgICB7CisgICAgICAgIH0K
KworICAgICAgICBCYXNpY0Jsb2NrKiBvcGVyYXRvciooKQorICAgICAgICB7CisgICAgICAgICAg
ICByZXR1cm4gbV9wcm9jZWR1cmUtPmF0KG1faW5kZXgpOworICAgICAgICB9CisKKyAgICAgICAg
aXRlcmF0b3ImIG9wZXJhdG9yKysoKQorICAgICAgICB7CisgICAgICAgICAgICBtX2luZGV4ID0g
ZmluZE5leHQobV9pbmRleCArIDEpOworICAgICAgICAgICAgcmV0dXJuICp0aGlzOworICAgICAg
ICB9CisKKyAgICAgICAgYm9vbCBvcGVyYXRvcj09KGNvbnN0IGl0ZXJhdG9yJiBvdGhlcikgY29u
c3QKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIG1faW5kZXggPT0gb3RoZXIubV9pbmRl
eDsKKyAgICAgICAgfQorCisgICAgICAgIGJvb2wgb3BlcmF0b3IhPShjb25zdCBpdGVyYXRvciYg
b3RoZXIpIGNvbnN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiAhKCp0aGlzID09IG90
aGVyKTsKKyAgICAgICAgfQorCisgICAgcHJpdmF0ZToKKyAgICAgICAgdW5zaWduZWQgZmluZE5l
eHQodW5zaWduZWQgaW5kZXgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHdoaWxlIChpbmRleCA8
IG1fcHJvY2VkdXJlLT5zaXplKCkgJiYgIW1fcHJvY2VkdXJlLT5hdChpbmRleCkpCisgICAgICAg
ICAgICAgICAgaW5kZXgrKzsKKyAgICAgICAgICAgIHJldHVybiBpbmV4OworICAgICAgICB9CisK
KyAgICAgICAgUHJvY2VkdXJlKiBtX3Byb2NlZHVyZTsKKyAgICAgICAgdW5zaWduZWQgbV9pbmRl
eDsKKyAgICB9OworCisgICAgaXRlcmF0b3IgYmVnaW4oKSBjb25zdCB7IHJldHVybiBpdGVyYXRv
cigqdGhpcywgMCk7IH0KKyAgICBpdGVyYXRvciBlbmQoKSBjb25zdCB7IHJldHVybiBpdGVyYXRv
cigqdGhpcywgbnVtQmxvY2tzKCkpOyB9CisKK3ByaXZhdGU6CisgICAgVmVjdG9yPHN0ZDo6dW5p
cXVlX3B0cjxTdGFja1Nsb3Q+PiBtX3N0YWNrU2xvdHM7CisgICAgVmVjdG9yPHN0ZDo6dW5pcXVl
X3B0cjxCYXNpY0Jsb2NrPj4gbV9ibG9ja3M7CisgICAgVmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxT
cGVjaWFsPj4gbV9zcGVjaWFsczsKKyAgICBTcGVjaWFsKiBtX2NhbGxTcGVjaWFsOworfTsKKwor
fSB9IH0gLy8gbmFtZXNwYWNlIEpTQzo6QjM6OkFpcgorCisjZW5kaWYgLy8gQWlyQ29kZV9oCisK
SW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9haXIvQWlySW5zdC5jcHAKPT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PQotLS0gU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL2Fpci9BaXJJbnN0LmNwcAkocmV2aXNpb24g
MCkKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9haXIvQWlySW5zdC5jcHAJKHdvcmtpbmcg
Y29weSkKQEAgLTAsMCArMSw0MCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNSBBcHBsZSBJ
bmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBp
biBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRp
b24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMK
KyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCBy
ZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29u
ZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRp
b25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAq
ICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlz
Y2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFs
cyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJ
UyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9S
IElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQor
ICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1Ig
QSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hB
TEwgQVBQTEUgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVD
VCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNF
UVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9D
VVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFU
QSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVT
RUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFD
VCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9S
IE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElT
IFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFN
QUdFLiAKKyAqLworCisjaW5jbHVkZSAiY29uZmlnLmgiCisjaW5jbHVkZSAiQWlySW5zdC5oIgor
CisjaW5jbHVkZSAiQjNWYWx1ZS5oIgorI2luY2x1ZGUgPHd0Zi9MaXN0RHVtcC5oPgorCituYW1l
c3BhY2UgSlNDIHsgbmFtZXNwYWNlIEIzIHsgbmFtZXNwYWNlIEFpciB7CisKK3ZvaWQgSW5zdDo6
ZHVtcChQcmludFN0cmVhbSYgb3V0KSBjb25zdAoreworICAgIG91dC5wcmludChvcGNvZGUsICIg
IiwgbGlzdER1bXAoYXJncyksICIgIDsgIiwgKm9yaWdpbik7Cit9CisKK30gfSB9IC8vIG5hbWVz
cGFjZSBKU0M6OkIzOjpBaXIKKwpJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL2Fpci9B
aXJJbnN0LmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL2Fpci9BaXJJ
bnN0LmgJKHJldmlzaW9uIDApCisrKyBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvYWlyL0Fpcklu
c3QuaAkod29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDE0MyBAQAorLyoKKyAqIENvcHlyaWdodCAo
QykgMjAxNSBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmli
dXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0
CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93
aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291
cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0
aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICog
Mi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92
ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRo
ZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29y
IG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICog
VEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5Z
CisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJ
TUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBB
TkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAg
SU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJM
RSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVN
UExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlU
RUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBM
T1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElP
TikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hF
VEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElO
RyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUg
VVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklM
SVRZIE9GIFNVQ0ggREFNQUdFLiAKKyAqLworCisjaWZuZGVmIEFpckluc3RfaAorI2RlZmluZSBB
aXJJbnN0X2gKKworI2luY2x1ZGUgIkFpckFyZy5oIgorI2luY2x1ZGUgIkFpck9wY29kZS5oIgor
CituYW1lc3BhY2UgSlNDIHsKKworY2xhc3MgQ0NhbGxIZWxwZXJzOworCituYW1lc3BhY2UgQjMg
eworCitjbGFzcyBWYWx1ZTsKKworbmFtZXNwYWNlIEFpciB7CisKK3N0cnVjdCBJbnN0IHsKK3B1
YmxpYzoKKyAgICB0eXBlZGVmIFZlY3RvcjxBcmcsIDM+IEFyZ0xpc3Q7CisKKyAgICBJbnN0KE9w
Y29kZSBvcGNvZGUsIFZhbHVlKiBvcmlnaW4pCisgICAgICAgIDogb3JpZ2luKG9yaWdpbikKKyAg
ICAgICAgLCBvcGNvZGUob3Bjb2RlKQorICAgIHsKKyAgICB9CisgICAgCisgICAgdGVtcGxhdGU8
dHlwZW5hbWUuLi4gQXJndW1lbnRzPgorICAgIEluc3QoT3Bjb2RlIG9wY29kZSwgVmFsdWUqIG9y
aWdpbiwgQXJnIGFyZywgQXJndW1lbnRzLi4uIGFyZ3VtZW50cykKKyAgICAgICAgOiBhcmdzeyBh
cmcsIGFyZ3VtZW50cy4uLiB9CisgICAgICAgICwgb3JpZ2luKG9yaWdpbikKKyAgICAgICAgLCBv
cGNvZGUob3Bjb2RlKQorICAgIHsKKyAgICB9CisKKyAgICBJbnN0KE9wY29kZSBvcGNvZGUsIFZh
bHVlKiBvcmlnaW4sIGNvbnN0IEFyZ0xpc3QmIGFyZ3VtZW50cykKKyAgICAgICAgOiBhcmdzKGFy
Z3VtZW50cykKKyAgICAgICAgLCBvcmlnaW4ob3JpZ2luKQorICAgICAgICAsIG9wY29kZShvcGNv
ZGUpCisgICAgeworICAgIH0KKworICAgIEluc3QoT3Bjb2RlIG9wY29kZSwgVmFsdWUqIG9yaWdp
biwgQXJnTGlzdCYmIGFyZ3VtZW50cykKKyAgICAgICAgOiBhcmdzKFdURjo6bW92ZShhcmd1bWVu
dHMpKQorICAgICAgICAsIG9yaWdpbihvcmlnaW4pCisgICAgICAgICwgb3Bjb2RlKG9wY29kZSkK
KyAgICB7CisgICAgfQorCisgICAgLy8gTm90ZSB0aGF0IHRoZXNlIGZ1bmN0b3JzIGFsbCBhdm9p
ZCB1c2luZyAiY29uc3QiIGJlY2F1c2Ugd2Ugd2FudCB0byB1c2UgdGhlbSBmb3IgdGhpbmdzIHRo
YXQKKyAgICAvLyBlZGl0IElSLiBJUiBpcyBtZWFudCB0byBiZSBlZGl0ZWQ7IGlmIHlvdSdyZSBj
YXJyeWluZyBhcm91bmQgYSAiY29uc3QgSW5zdCYiIHRoZW4geW91J3JlCisgICAgLy8gcHJvYmFi
bHkgZG9pbmcgaXQgd3JvbmcuCisKKyAgICAvLyBUaGlzIG9ubHkgd2Fsa3MgdGhvc2UgVG1wcyB0
aGF0IGFyZSBleHBsaWNpdGx5IG1lbnRpb25lZCwgYW5kIGl0IGRvZXNuJ3QgdGVsbCB5b3UgdGhl
aXIgcm9sZQorICAgIC8vIG9yIHR5cGUuCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgRnVuY3Rvcj4K
KyAgICB2b2lkIGZvckVhY2hUbXBGYXN0KGNvbnN0IEZ1bmN0b3ImIGZ1bmN0b3IpCisgICAgewor
ICAgICAgICBmb3IgKEFyZyBhcmcgOiBhcmdzKQorICAgICAgICAgICAgYXJnLmZvckVhY2hUbXBG
YXN0KGZ1bmN0b3IpOworICAgIH0KKworICAgIHR5cGVkZWYgdm9pZCBFYWNoQXJnQ2FsbGJhY2so
QXJnJiwgQXJnOjpSb2xlLCBBcmc6OlR5cGUpOworICAgIAorICAgIC8vIENhbGxzIHRoZSBmdW5j
dG9yIHdpdGggKGFyZywgcm9sZSwgdHlwZSkuIFRoaXMgZnVuY3Rpb24gaXMgYXV0by1nZW5lcmF0
ZWQgYnkKKyAgICAvLyBvcGNvZGVfZ2VuZXJhdG9yLnJiLgorICAgIHRlbXBsYXRlPHR5cGVuYW1l
IEZ1bmN0b3I+CisgICAgdm9pZCBmb3JFYWNoQXJnKGNvbnN0IEZ1bmN0b3ImIGZ1bmN0b3IpOwor
CisgICAgLy8gQ2FsbHMgdGhlIGZ1bmN0b3Igd2l0aCAodG1wLCByb2xlLCB0eXBlKS4KKyAgICB0
ZW1wbGF0ZTx0eXBlbmFtZSBGdW5jdG9yPgorICAgIHZvaWQgZm9yRWFjaFRtcChjb25zdCBGdW5j
dG9yJiBmdW5jdG9yKQorICAgIHsKKyAgICAgICAgZm9yRWFjaEFyZ1JvbGUoCisgICAgICAgICAg
ICBbJl0gKEFyZyYgYXJnLCBBcmc6OlJvbGUgcm9sZSwgQXJnOjpUeXBlIHR5cGUpIHsKKyAgICAg
ICAgICAgICAgICBhcmcuZm9yRWFjaFRtcChyb2xlLCB0eXBlLCBmdW5jdG9yKTsKKyAgICAgICAg
ICAgIH0pOworICAgIH0KKworICAgIC8vIFJldHVybnMgdHJ1ZSBpZiB0aGlzIGluc3RydWN0aW9u
IGhhcyBhIFNwZWNpYWwqLiBUaGlzIHVubG9ja3Mgc29tZSBleHRyYSBmdW5jdGlvbmFsaXR5Lgor
ICAgIGJvb2wgaGFzU3BlY2lhbCgpIGNvbnN0OworCisgICAgLy8gUmVwb3J0cyBhbnkgYWRkaXRp
b25hbCByZWdpc3RlcnMgY2xvYmJlcmVkIGJ5IHRoaXMgb3BlcmF0aW9uLiBOb3RlIHRoYXQgZm9y
IGVmZmljaWVuY3ksCisgICAgLy8gZXh0cmFDbG9iYmVyZWRSZWdzKCkgb25seSB3b3JrcyBpZiBo
YXNTcGVjaWFsKCkgcmV0dXJucyB0cnVlLgorICAgIGNvbnN0IFJlZ2lzdGVyU2V0JiBleHRyYUNs
b2JiZXJlZFJlZ3MoKTsKKworICAgIC8vIFVzZSB0aGlzIHRvIHJlcG9ydCB3aGljaCByZWdpc3Rl
cnMgYXJlIGxpdmUuIFRoaXMgc2hvdWxkIGJlIGRvbmUganVzdCBiZWZvcmUgY29kZWdlbi4gTm90
ZQorICAgIC8vIHRoYXQgZm9yIGVmZmljaWVuY3ksIHJlcG9ydFVzZWRSZWdpc3RlcnMoKSBvbmx5
IHdvcmtzIGlmIGhhc1NwZWNpYWwoKSByZXR1cm5zIHRydWUuCisgICAgdm9pZCByZXBvcnRVc2Vk
UmVnaXN0ZXJzKGNvbnN0IFJlZ2lzdGVyU2V0Jik7CisKKyAgICAvLyBJcyB0aGlzIGluc3RydWN0
aW9uIGluIG9uZSBvZiB0aGUgdmFsaWQgZm9ybXMgcmlnaHQgbm93PyBUaGlzIGZ1bmN0aW9uIGlz
IGF1dG8tZ2VuZXJhdGVkIGJ5CisgICAgLy8gb3Bjb2RlX2dlbmVyYXRvci5yYi4KKyAgICBib29s
IGlzVmFsaWRGb3JtKCk7CisKKyAgICAvLyBBc3N1bWluZyB0aGlzIGluc3RydWN0aW9uIGlzIGlu
IGEgdmFsaWQgZm9ybSByaWdodCBub3csIHdpbGwgaXQgc3RpbGwgYmUgaW4gb25lIG9mIHRoZSB2
YWxpZAorICAgIC8vIGZvcm1zIGlmIHdlIHB1dCBhbiBBZGRyIHJlZmVyZW5jaW5nIHRoZSBzdGFj
ayAob3IgYSBTdGFja1Nsb3Qgb3IgQ2FsbEFyZywgb2YgY291cnNlKSBpbiB0aGUKKyAgICAvLyBn
aXZlbiBpbmRleD8gU3BpbGxpbmcgdXNlcyB0aGlzOiBpdCB3YWxrcyB0aGUgYXJncyBieSBpbmRl
eCB0byBmaW5kIFRtcHMgdGhhdCBuZWVkIHNwaWxsaW5nOworICAgIC8vIGlmIGl0IGZpbmRzIG9u
ZSwgaXQgY2FsbHMgdGhpcyB0byBzZWUgaWYgaXQgY2FuIHJlcGxhY2UgdGhlIEFyZzo6VG1wIHdp
dGggYW4gQXJnOjpBZGRyLiBJZiBpdAorICAgIC8vIGZpbmRzIGEgbm9uLVRtcCBBcmcsIHRoZW4g
aXQgY2FsbHMgdGhhdCBBcmcncyBmb3JFYWNoVG1wIHRvIGRvIGEgcmVwbGFjZW1lbnQgdGhhdCB3
YXkuCisgICAgLy8KKyAgICAvLyBUaGlzIGZ1bmN0aW9uIGlzIGF1dG8tZ2VuZXJhdGVkIGJ5IG9w
Y29kZV9nZW5lcmF0b3IucmIuCisgICAgYm9vbCBhZG1pdHNTdGFjayh1bnNpZ25lZCBhcmdJbmRl
eCk7CisKKyAgICAvLyBHZW5lcmF0ZSBzb21lIGNvZGUgZm9yIHRoaXMgaW5zdHJ1Y3Rpb24uIFRo
aXMgaXMsIGxpa2UsIGxpdGVyYWxseSBvdXIgYmFja2VuZC4gSWYgdGhpcyBpcyB0aGUKKyAgICAv
LyB0ZXJtaW5hbCwgaXQgcmV0dXJucyB0aGUganVtcCB0aGF0IG5lZWRzIHRvIGJlIGxpbmtlZCBm
b3IgdGhlICJ0aGVuIiBjYXNlLCB3aXRoIHRoZSAiZWxzZSIKKyAgICAvLyBjYXNlIGJlaW5nIGZh
bGwtdGhyb3VnaC4gVGhpcyBmdW5jdGlvbiBpcyBhdXRvLWdlbmVyYXRlZCBieSBvcGNvZGVfZ2Vu
ZXJhdG9yLnJiLgorICAgIENDYWxsSGVscGVyczo6SnVtcCBnZW5lcmF0ZShDQ2FsbEhlbHBlcnMm
KTsKKworICAgIHZvaWQgZHVtcChQcmludFN0cmVhbSYpIGNvbnN0OworCisgICAgQXJnTGlzdCBh
cmdzOworICAgIFZhbHVlKiBvcmlnaW47IC8vIFRoZSBCMzo6VmFsdWUgdGhhdCB0aGlzIG9yaWdp
bmF0ZWQgZnJvbS4KKyAgICBPcGNvZGUgb3Bjb2RlOworfTsKKworfSB9IH0gLy8gbmFtZXNwYWNl
IEpTQzo6QjM6OkFpcgorCisjZW5kaWYgLy8gQWlySW5zdF9oCisKSW5kZXg6IFNvdXJjZS9KYXZh
U2NyaXB0Q29yZS9iMy9haXIvQWlySW5zdElubGluZXMuaAo9PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2Uv
SmF2YVNjcmlwdENvcmUvYjMvYWlyL0Fpckluc3RJbmxpbmVzLmgJKHJldmlzaW9uIDApCisrKyBT
b3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvYWlyL0Fpckluc3RJbmxpbmVzLmgJKHdvcmtpbmcgY29w
eSkKQEAgLTAsMCArMSw2OSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNSBBcHBsZSBJbmMu
IEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBz
b3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24s
IGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAq
IGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRh
aW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0
aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25z
IGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAg
IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xh
aW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBw
cm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQ
Uk9WSURFRCBCWSBBUFBMRSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElN
UExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICog
SU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQ
QVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwg
QVBQTEUgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwg
SU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVF
TlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJF
TUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwg
T1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQg
QU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwg
U1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9U
SEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNP
RlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdF
LiAKKyAqLworCisjaWZuZGVmIEFpckluc3RJbmxpbmVzX2gKKyNkZWZpbmUgQWlySW5zdElubGlu
ZXNfaAorCisjaW5jbHVkZSAiQWlySW5zdC5oIgorI2luY2x1ZGUgIkFpck9wY29kZVV0aWxzLmgi
CisjaW5jbHVkZSAiQWlyU3BlY2lhbHMuaCIKKyNpbmNsdWRlICJCM1N0YWNrbWFwLmgiCisjaW5j
bHVkZSAiQjNWYWx1ZS5oIgorCituYW1lc3BhY2UgSlNDIHsgbmFtZXNwYWNlIEIzIHsgbmFtZXNw
YWNlIEFpciB7CisKK2Jvb2wgSW5zdDo6aGFzU3BlY2lhbCgpIGNvbnN0Cit7CisgICAgcmV0dXJu
IGFyZ3Muc2l6ZSgpICYmIGFyZ3NbMF0uaXNTcGVjaWFsKCk7Cit9CisKK2NvbnN0IFJlZ2lzdGVy
U2V0JiBJbnN0OjpleHRyYUNsb2JiZXJlZFJlZ3MoKQoreworICAgIHJldHVybiBhcmdzWzBdLnNw
ZWNpYWwoKS0+ZXh0cmFDbG9iYmVyZWRSZWdzKCp0aGlzKTsKK30KKwordm9pZCBJbnN0OjpyZXBv
cnRVc2VkUmVnaXN0ZXJzKGNvbnN0IFJlZ2lzdGVyU2V0JiB1c2VkUmVnaXN0ZXJzKQoreworICAg
IGFyZ3NbMF0uc3BlY2lhbCgpLT5yZXBvcnRVc2VkUmVnaXN0ZXJzKCp0aGlzLCB1c2VkUmVnaXN0
ZXJzKTsKK30KKworaW5saW5lIGJvb2wgaXNTaGlmdFZhbGlkKEluc3QmIGluc3QpCit7CisjaWYg
Q1BVKFg4NikKKyAgICByZXR1cm4gaW5zdC5hcmdzWzBdID09IFRtcChYODZSZWdpc3Rlcjo6Y3gp
OworI2Vsc2UKKyAgICByZXR1cm4gdHJ1ZTsKKyNlbmRpZgorfSAgIAorCitpbmxpbmUgYm9vbCBp
c0xzaGlmdDMyVmFsdWUoSW5zdCYgaW5zdCkKK3sKKyAgICByZXR1cm4gaXNTaGlmdFZhbGlkKGlu
c3QpOworfQorCit9IH0gfSAvLyBuYW1lc3BhY2UgSlNDOjpCMzo6QWlyCisKKyNlbmRpZiAvLyBB
aXJJbnN0SW5saW5lc19oCisKSW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9haXIvQWly
T3Bjb2RlLm9wY29kZXMKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL2Fp
ci9BaXJPcGNvZGUub3Bjb2RlcwkocmV2aXNpb24gMCkKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29y
ZS9iMy9haXIvQWlyT3Bjb2RlLm9wY29kZXMJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSwxMDcg
QEAKKyMgQ29weXJpZ2h0IChDKSAyMDE1IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4K
KyMKKyMgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywg
d2l0aCBvciB3aXRob3V0CisjIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0
aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworIyBhcmUgbWV0OgorIyAxLiBSZWRpc3RyaWJ1
dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorIyAg
ICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2Ns
YWltZXIuCisjIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVj
ZSB0aGUgYWJvdmUgY29weXJpZ2h0CisjICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlv
bnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyMgICAgZG9jdW1lbnRhdGlv
biBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4K
KyMKKyMgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIEFORCBJVFMgQ09O
VFJJQlVUT1JTIGBgQVMgSVMnJworIyBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5U
SUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyMgVEhFIElNUExJRUQgV0FSUkFO
VElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorIyBQ
VVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SIElU
UyBDT05UUklCVVRPUlMKKyMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5D
SURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgorIyBDT05TRVFVRU5USUFMIERBTUFHRVMg
KElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgorIyBTVUJTVElU
VVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1Ig
QlVTSU5FU1MKKyMgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9S
WSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KKyMgQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFks
IE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKyMgQVJJU0lORyBJ
TiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNF
RCBPRgorIyBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyMgU3lsbGFidXM6Cisj
CisjIFJvbGVzIGFuZCB0eXBlczoKKyMgVTpHID0+IHVzZSBvZiBhIGdlbmVyYWwtcHVycG9zZSBy
ZWdpc3RlciBvciB2YWx1ZQorIyBEOkcgPT4gZGVmIG9mIGEgZ2VuZXJhbC1wdXJwb3NlIHJlZ2lz
dGVyIG9yIHZhbHVlCisjIFVEOkcgPT4gdXNlIGFuZCBkZWYgb2YgYSBnZW5lcmFsLXB1cnBvc2Ug
cmVnaXN0ZXIgb3IgdmFsdWUKKyMgVTpGID0+IHVzZSBvZiBhIGZsb2F0IHJlZ2lzdGVyIG9yIHZh
bHVlCisjIEQ6RiA9PiBkZWYgb2YgYSBmbG9hdCByZWdpc3RlciBvciB2YWx1ZQorIyBVRDpGID0+
IHVzZSBhbmQgZGVmIG9mIGEgZmxvYXQgcmVnaXN0ZXIgb3IgdmFsdWUKKyMKKyMgQXJndW1lbnQg
a2luZHM6CisjIFRtcCA9PiB0ZW1wb3Jhcnkgb3IgcmVnaXN0ZXIKKyMgSW1tID0+IDMyLWJpdCBp
bW1lZGlhdGUgaW50CisjIEltbVB0ciA9PiBUcnVzdGVkSW1tUHRyCisjIEFkZHIgPT4gYWRkcmVz
cyBhcyB0ZW1wb3JhcnkvcmVnaXN0ZXIrb2Zmc2V0CisjIEluZGV4ID0+IEJhc2VJbmRleCBhZGRy
ZXNzCisjIEFicyA9PiBBYnNvbHV0ZUFkZHJlc3MKKyMKKyMgVGhlIHBhcnNlciB2aWV3cyB0aGVz
ZSB0aGluZ3MgYXMga2V5d29yZHMsIGFuZCB1bmRlcnN0YW5kcyB0aGF0IHRoZXkgZmFsbCBpbnRv
IHR3byBkaXN0aW5jdCBjbGFzc2VzCisjIG9mIHRoaW5ncy4gU28sIGFsdGhvdWdoIHRoaXMgZmls
ZSB1c2VzIGEgcGFydGljdWxhciBpbmRlbnRhdGlvbiBzdHlsZSwgbm9uZSBvZiB0aGUgd2hpdGVz
cGFjZSBvcgorIyBldmVuIG5ld2xpbmVzIGFyZSBtZWFuaW5nZnVsIHRvIHRoZSBwYXJzZXIuIEZv
ciBleGFtcGxlLCB5b3UgY291bGQgd3JpdGU6CisjCisjIEZvbzQyIFU6RywgVUQ6RiBJbW0sIFRt
cCBBZGRyLCBUbXAKKyMKKyMgQW5kIHRoZSBwYXJzZXIgd291bGQga25vdyB0aGF0IHRoaXMgaXMg
dGhlIHNhbWUgYXM6CisjCisjIEZvbzQyIFU6RywgVUQ6RgorIyAgICAgSW1tLCBUbXAKKyMgICAg
IEFkZHIsIFRtcAorIworIyBJLmUuIGEgdHdvLWZvcm0gaW5zdHJ1Y3Rpb24gdGhhdCB1c2VzIGEg
R1BSIG9yIGFuIGludCBpbW1lZGlhdGUgYW5kIHVzZXMrZGVmcyBhIGZsb2F0IHJlZ2lzdGVyLgor
CisjIE5vdGUgdGhhdCB0aGUgb3Bjb2RlcyBoZXJlIGhhdmUgYSBsZWFkaW5nIGNhcGl0YWwgKEFk
ZDMyKSBidXQgbXVzdCBjb3JyZXNwb25kIHRvIE1hY3JvQXNzZW1ibGVyCisjIEFQSSB0aGF0IGhh
cyBhIGxlYWRpbmcgbG93ZXItY2FzZSAoYWRkMzIpLgorCitBZGQzMiBVOkcsIFVEOkcKKyAgICBU
bXAsIFRtcAorICAgIEltbSwgQWRkcgorICAgIEltbSwgVG1wCisgICAgQWRkciwgVG1wCisgICAg
VG1wLCBBZGRyCisKK0FkZDMyIFU6RywgVTpHLCBEOkcKKyAgICBJbW0sIFRtcCwgVG1wCisKK0Fu
ZDMyIFU6RywgVUQ6RworICAgIFRtcCwgVG1wCisgICAgSW1tLCBUbXAKKyAgICBUbXAsIEFkZHIK
KyAgICBBZGRyLCBUbXAKKyAgICBJbW0sIEFkZHIKKworTHNoaWZ0MzIgVTpHLCBVRDpHCisgICAg
VG1wKiwgVG1wCisgICAgSW1tLCBUbXAKKworTXVsMzIgVTpHLCBVRDpHCisgICAgVG1wLCBUbXAK
KyAgICBBZGRyLCBUbXAKKworTW92ZSBVOkcsIEQ6RworICAgIFRtcCwgVG1wCisgICAgSW1tLCBU
bXAKKyAgICBJbW1QdHIsIFRtcAorICAgIEFkZHIsIFRtcCBhcyBsb2FkICMgVGhpcyBtZWFucyB0
aGF0ICJNb3ZlIEFkZHIsIFRtcCIgaXMgY29kZS1nZW5lcmF0ZWQgYXMgImxvYWQiIG5vdCAibW92
ZSIuCisgICAgVG1wLCBBZGRyIGFzIHN0b3JlCisKK01vdmVEb3VibGUgVTpGLCBEOkYKKyAgICBU
bXAsIFRtcAorICAgIEFkZHIsIFRtcCBhcyBsb2FkRG91YmxlCisgICAgVG1wLCBBZGRyIGFzIHN0
b3JlRG91YmxlCisKK01vdmU2NFRvRG91YmxlIFU6RywgRDpGCisgICAgVG1wLCBUbXAKKworTW92
ZURvdWJsZVRvNjQgVTpGLCBEOkcKKyAgICBUbXAsIFRtcAorCitSZXQKKworIyBBaXIgYWxsb3dz
IGZvciBleG90aWMgYmVoYXZpb3IuIEEgUGF0Y2gncyBiZWhhdmlvciBpcyBkZXRlcm1pbmVkIGVu
dGlyZWx5IGJ5IHRoZSBTcGVjaWFsIG9wZXJhbmQsCisjIHdoaWNoIG11c3QgYmUgdGhlIGZpcnN0
IG9wZXJhbmQuCitzcGVjaWFsIFBhdGNoCisKSW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9i
My9haXIvQWlyU3BlY2lhbC5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRDb3Jl
L2IzL2Fpci9BaXJTcGVjaWFsLmNwcAkocmV2aXNpb24gMCkKKysrIFNvdXJjZS9KYXZhU2NyaXB0
Q29yZS9iMy9haXIvQWlyU3BlY2lhbC5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSw1NSBA
QAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNSBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2
ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBm
b3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJv
dmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBS
ZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHly
aWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxv
d2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11
c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0
IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAg
IGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBk
aXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJ
TkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywg
SU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVT
IE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQ
T1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUgorICog
Q09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5U
QUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5D
TFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRF
IEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9S
IEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkK
KyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwg
T1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJ
TiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFE
VklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLiAKKyAqLworCisjaW5jbHVk
ZSAiY29uZmlnLmgiCisjaW5jbHVkZSAiQWlyU3BlY2lhbC5oIgorCituYW1lc3BhY2UgSlNDIHsg
bmFtZXNwYWNlIEIzIHsgbmFtZXNwYWNlIEFpciB7CisKK1NwZWNpYWw6OlNwZWNpYWwoY29uc3Qg
Y2hhciogbmFtZSkKKyAgICA6IG1fbmFtZShuYW1lKQorICAgICwgbV9pbmRleChVSU5UX01BWCkK
K3sKK30KKworU3BlY2lhbDo6flNwZWNpYWwoKQoreworfQorCit2b2lkIFNwZWNpYWw6OmR1bXAo
UHJpbnRTdHJlYW0mIG91dCkgY29uc3QKK3sKKyAgICBvdXQucHJpbnQobV9uYW1lKTsKKyAgICBp
ZiAobV9pbmRleCAhPSBVSU5UX01BWCkKKyAgICAgICAgb3V0LnByaW50KG1faW5kZXgpOworfQor
Cit2b2lkIFNwZWNpYWw6OmRlZXBEdW1wKFByaW50U3RyZWFtJiBvdXQpIGNvbnN0Cit7CisgICAg
b3V0LnByaW50KCp0aGlzLCAiOiAiKTsKKyAgICBkZWVwRHVtcEltcGwob3V0KTsKK30KKworfSB9
IH0gLy8gbmFtZXNwYWNlIEpTQzo6QjM6OkFpcgorCkluZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENv
cmUvYjMvYWlyL0FpclNwZWNpYWwuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENv
cmUvYjMvYWlyL0FpclNwZWNpYWwuaAkocmV2aXNpb24gMCkKKysrIFNvdXJjZS9KYXZhU2NyaXB0
Q29yZS9iMy9haXIvQWlyU3BlY2lhbC5oCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsMTEwIEBA
CisvKgorICogQ29weXJpZ2h0IChDKSAyMDE1IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZl
ZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZv
cm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92
aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJl
ZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJp
Z2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93
aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVz
dCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qg
b2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAg
ZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRp
c3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElO
Qy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJ
TkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMg
T0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBP
U0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SCisgKiBD
T05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRB
TCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNM
VURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUg
R09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1Ig
QlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQor
ICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBP
UiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElO
IEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURW
SVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisKKyNpZm5kZWYg
QWlyU3BlY2lhbF9oCisjZGVmaW5lIEFpclNwZWNpYWxfaAorCisjaW5jbHVkZSAiQWlySW5zdC5o
IgorI2luY2x1ZGUgPHd0Zi9GYXN0TWFsbG9jLmg+CisjaW5jbHVkZSA8d3RmL05vbmNvcHlhYmxl
Lmg+CisjaW5jbHVkZSA8d3RmL1Njb3BlZExhbWJkYS5oPgorCituYW1lc3BhY2UgSlNDIHsgbmFt
ZXNwYWNlIEIzIHsgbmFtZXNwYWNlIEFpciB7CisKK2NsYXNzIFNwZWNpYWwgeworICAgIFdURl9N
QUtFX05PTkNPUFlBQkxFKFNwZWNpYWwpOworICAgIFdURl9NQUtFX0ZBU1RfQUxMT0NBVEVEOwor
cHVibGljOgorICAgIFNwZWNpYWwoY29uc3QgY2hhciogbmFtZSk7CisgICAgdmlydHVhbCB+U3Bl
Y2lhbCgpOworCisgICAgY29uc3QgY2hhciogbmFtZSgpIGNvbnN0IHsgcmV0dXJuIG1fbmFtZTsg
fQorCisgICAgdmlydHVhbCB2b2lkIGZvckVhY2hBcmcoSW5zdCYsIGNvbnN0IFNjb3BlZExhbWJk
YTxJbnN0OjpFYWNoQXJnQ2FsbGJhY2s+JikgPSAwOworICAgIHZpcnR1YWwgYm9vbCBpc1ZhbGlk
KEluc3QmKSA9IDA7CisgICAgdmlydHVhbCBib29sIGFkbWl0c1N0YWNrKEluc3QmLCB1bnNpZ25l
ZCBhcmdJbmRleCkgPSAwOworCisgICAgLy8gVGhpcyBnZXRzIGNhbGxlZCBvbiBmb3IgZWFjaCBJ
bnN0IHRoYXQgdXNlcyB0aGlzIFNwZWNpYWwuIE5vdGUgdGhhdCB0aGVyZSBpcyBubyB3YXkgdG8K
KyAgICAvLyBndWFyYW50ZWUgdGhhdCBhIFNwZWNpYWwgZ2V0cyB1c2VkIGZyb20ganVzdCBvbmUg
SW5zdCwgYmVjYXVzZSBBaXIgbWlnaHQgdGFpbGR1cCBsYXRlLiBTbywKKyAgICAvLyBpZiB5b3Ug
d2FudCB0byBwYXNzIHRoaXMgaW5mb3JtYXRpb24gZG93biB0byBnZW5lcmF0ZSgpLCB0aGVuIHlv
dSBoYXZlIHRvIGVpdGhlcjoKKyAgICAvLworICAgIC8vIDEpIEdlbmVyYXRlIEFpciB0aGF0IHN0
YXJ0cyB3aXRoIGEgc2VwYXJhdGUgU3BlY2lhbCBwZXIgUGF0Y2ggSW5zdCwgYW5kIHRoZW4gbWVy
Z2UKKyAgICAvLyAgICB1c2VkUmVnaXN0ZXIgc2V0cy4gVGhpcyBpcyBwcm9iYWJseSBub3QgZ3Jl
YXQsIGJ1dCBpdCBvcHRpbWl6ZXMgZm9yIHRoZSBjb21tb24gY2FzZSB0aGF0CisgICAgLy8gICAg
QWlyIGRpZG4ndCBkdXBsaWNhdGUgY29kZSBvciB0aGF0IHN1Y2ggZHVwbGljYXRpb24gZGlkbid0
IGNhdXNlIGFueSBpbnRlcmVzdGluZyBjaGFuZ2VzIHRvCisgICAgLy8gICAgcmVnaXN0ZXIgYXNz
aWdubWVudC4KKyAgICAvLworICAgIC8vIDIpIEhhdmUgdGhlIFNwZWNpYWwgbWFpbnRhaW4gYSBI
YXNoTWFwPEluc3QqLCBSZWdpc3RlclNldD4uIFRoaXMgd29ya3MgYmVjYXVzZSB0aGUgYW5hbHlz
aXMKKyAgICAvLyAgICB0aGF0IGZlZWRzIGludG8gdGhpcyBjYWxsIGlzIHBlcmZvcm1lZCBqdXN0
IGJlZm9yZSBjb2RlIGdlbmVyYXRpb24gYW5kIHRoZXJlIGlzIG5vIHdheQorICAgIC8vICAgIGZv
ciB0aGUgVmVjdG9yPD4ncyB0aGF0IGNvbnRhaW4gdGhlIEluc3RzIHRvIGJlIHJlYWxsb2NhdGVk
LiBUaGlzIGFsbG93cyBnZW5lcmF0ZSgpIHRvCisgICAgLy8gICAgY29uc3VsdCB0aGUgSGFzaE1h
cC4KKyAgICAvLworICAgIC8vIDMpIEh5YnJpZDogeW91IGNvdWxkIHVzZSAoMSkgYW5kIGZpcmUg
dXAgYSBIYXNoTWFwIGlmIHlvdSBzZWUgbXVsdGlwbGUgY2FsbHMuCisgICAgdmlydHVhbCB2b2lk
IHJlcG9ydFVzZWRSZWdpc3RlcnMoSW5zdCYsIGNvbnN0IFJlZ2lzdGVyU2V0JikgPSAwOworICAg
IAorICAgIHZpcnR1YWwgQ0NhbGxIZWxwZXJzOjpKdW1wIGdlbmVyYXRlKEluc3QmLCBDQ2FsbEhl
bHBlcnMmKSA9IDA7CisgICAgCisgICAgdmlydHVhbCBjb25zdCBSZWdpc3RlclNldCYgZXh0cmFD
bG9iYmVyZWRSZWdzKEluc3QmKSA9IDA7CisKKyAgICB2b2lkIGR1bXAoUHJpbnRTdHJlYW0mKSBj
b25zdDsKKyAgICB2b2lkIGRlZXBEdW1wKFByaW50U3RyZWFtJikgY29uc3Q7CisKK3Byb3RlY3Rl
ZDoKKyAgICB2aXJ0dWFsIHZvaWQgZGVlcER1bXBJbXBsKFByaW50U3RyZWFtJikgY29uc3QgPSAw
OworCitwcml2YXRlOgorICAgIGZyaWVuZCBjbGFzcyBDb2RlOworCisgICAgY29uc3QgY2hhciog
bV9uYW1lOworICAgIHVuc2lnbmVkIG1faW5kZXg7Cit9OworCitjbGFzcyBEZWVwU3BlY2lhbER1
bXAgeworcHVibGljOgorICAgIERlZXBTcGVjaWFsRGltcChTcGVjaWFsKiBzcGVjaWFsKQorICAg
ICAgICA6IG1fc3BlY2lhbChzcGVjaWFsKQorICAgIHsKKyAgICB9CisKKyAgICB2b2lkIGR1bXAo
UHJpbnRTdHJlYW0mIG91dCkgY29uc3QKKyAgICB7CisgICAgICAgIGlmIChtX3NwZWNpYWwpCisg
ICAgICAgICAgICBtX3NwZWNpYWwtPmRlZXBEdW1wKG91dCk7CisgICAgICAgIGVsc2UKKyAgICAg
ICAgICAgIG91dC5wcmludCgiPG51bGw+Iik7CisgICAgfQorCitwcml2YXRlOgorICAgIFNwZWNp
YWwqIG1fc3BlY2lhbDsKK307CisKK0RlZXBTcGVjaWFsRHVtcCBkZWVwRHVtcChTcGVjaWFsKiBz
cGVjaWFsKQoreworICAgIHJldHVybiBEZWVwU3BlY2lhbER1bXAoc3BlY2lhbCk7Cit9CisKK30g
fSB9IC8vIG5hbWVzcGFjZSBKU0M6OkIzOjpBaXIKKworI2VuZGlmIC8vIEFpclNwZWNpYWxfaAor
CkluZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvYWlyL0FpclN0YWNrU2xvdC5oCj09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9haXIvQWlyU3RhY2tTbG90LmgJKHJl
dmlzaW9uIDApCisrKyBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvYWlyL0FpclN0YWNrU2xvdC5o
CSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsOTIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIw
MTUgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9u
IGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICog
bW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBj
b25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBj
b2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBs
aXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJl
ZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29w
eXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9s
bG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhl
ciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMg
U09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICog
RVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVE
IFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJ
VE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5P
IEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9S
IEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZ
LCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRP
LAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBP
RiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhP
V0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIg
SU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVH
TElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQor
ICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBP
RiBTVUNIIERBTUFHRS4gCisgKi8KKworI2lmbmRlZiBBaXJTdGFja1Nsb3RfaAorI2RlZmluZSBB
aXJTdGFja1Nsb3RfaAorCisjaW5jbHVkZSA8d3RmL05vbkNvcHlhYmxlLmg+CisjaW5jbHVkZSA8
d3RmL0Zhc3RNYWxsb2MuaD4KKworbmFtZXNwYWNlIEpTQyB7IG5hbWVzcGFjZSBCMyB7CisKK2Ns
YXNzIFN0YWNrU2xvdHZhbHVlOworCituYW1lc3BhY2UgQWlyIHsKKworY2xhc3MgU3RhY2tTbG90
IHsKKyAgICBXVEZfTUFLRV9OT05DT1BZQUJMRShTdGFja1Nsb3QpOworICAgIFdURl9NQUtFX0ZB
U1RfQUxMT0NBVEVEOworcHVibGljOgorICAgIHVuc2lnbmVkIGJ5dGVTaXplKCkgY29uc3QgeyBy
ZXR1cm4gbV9ieXRlU2l6ZTsgfQorICAgIHVuc2lnbmVkIGluZGV4KCkgY29uc3QgeyByZXR1cm4g
bV9pbmRleDsgfQorCisgICAgU3RhY2tTbG90VmFsdWUqIHZhbHVlKCkgY29uc3QgeyByZXR1cm4g
bV92YWx1ZTsgfQorCisgICAgdm9pZCBkdW1wKFByaW50U3RyZWFtJikgY29uc3Q7CisgICAgdm9p
ZCBkZWVwRHVtcChQcmludFN0cmVhbSYpIGNvbnN0OworCitwcml2YXRlOgorICAgIGZyaWVuZCBj
bGFzcyBDb2RlOworCisgICAgU3RhY2tTbG90KHVuc2lnbmVkIGJ5dGVTaXplLCB1bnNpZ25lZCBp
bmRleCwgU3RhY2tTbG90VmFsdWUqIHZhbHVlKQorICAgICAgICA6IG1fYnl0ZVNpemUoYnl0ZVNp
emUpCisgICAgICAgICwgbV9pbmRleChpbmRleCkKKyAgICAgICAgLCBtX3ZhbHVlKHZhbHVlKQor
ICAgIHsKKyAgICB9CisgICAgCisgICAgdW5zaWduZWQgbV9ieXRlU2l6ZTsKKyAgICB1bnNpZ25l
ZCBtX2luZGV4OworICAgIFN0YWNrU2xvdFZhbHVlKiBtX3ZhbHVlOworfTsKKworY2xhc3MgRGVl
cFN0YWNrU2xvdER1bXAgeworcHVibGljOgorICAgIERlZXBTdGFja1Nsb3REdW1wKFN0YWNrU2xv
dCogc2xvdCkKKyAgICAgICAgOiBtX3Nsb3Qoc2xvdCkKKyAgICB7CisgICAgfQorCisgICAgdm9p
ZCBkdW1wKFByaW50U3RyZWFtJiBvdXQpIGNvbnN0CisgICAgeworICAgICAgICBpZiAobV9zbG90
KQorICAgICAgICAgICAgbV9zbG90LT5kZWVwRHVtcChvdXQpOworICAgICAgICBlbHNlCisgICAg
ICAgICAgICBvdXQucHJpbnQoIjxudWxsPiIpOworICAgIH0KKworcHJpdmF0ZToKKyAgICBTdGFj
a1Nsb3QqIG1fc2xvdDsKK307CisKK0RlZXBTdGFja1Nsb3REdW1wIGRlZXBEdW1wKFN0YWNrU2xv
dCogc2xvdCkKK3sKKyAgICByZXR1cm4gRGVlcFN0YWNrU2xvdER1bXAoc2xvdCk7Cit9CisKK30g
fSB9IC8vIG5hbWVzcGFjZSBKU0M6OkIzOjpBaXIKKworI2VuZGlmIC8vIEFpclN0YWNrU2xvdF9o
CisKSW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9haXIvQWlyVG1wLmNwcAo9PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvYWlyL0FpclRtcC5jcHAJKHJldmlzaW9u
IDApCisrKyBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvYWlyL0FpclRtcC5jcHAJKHdvcmtpbmcg
Y29weSkKQEAgLTAsMCArMSw1MiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNSBBcHBsZSBJ
bmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBp
biBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRp
b24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMK
KyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCBy
ZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29u
ZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRp
b25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAq
ICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlz
Y2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFs
cyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJ
UyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9S
IElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQor
ICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1Ig
QSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hB
TEwgQVBQTEUgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVD
VCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNF
UVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9D
VVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFU
QSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVT
RUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFD
VCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9S
IE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElT
IFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFN
QUdFLiAKKyAqLworCisjaW5jbHVkZSAiY29uZmlnLmgiCisjaW5jbHVkZSAiQWlyVG1wLmgiCisK
K25hbWVzcGFjZSBKU0MgeyBuYW1lc3BhY2UgQjMgeyBuYW1lc3BhY2UgQWlyIHsKKwordm9pZCBU
bXA6OmR1bXAoUHJpbnRTdHJlYW0mIG91dCkgY29uc3QKK3sKKyAgICBpZiAoISp0aGlzKSB7Cisg
ICAgICAgIG91dC5wcmludCgiPG5vbmU+Iik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAg
ICBpZiAoaXNSZWcoKSkgeworICAgICAgICBvdXQucHJpbnQocmVnKCkpOworICAgICAgICByZXR1
cm47CisgICAgfQorCisgICAgaWYgKGlzR1BUbXAoKSkgeworICAgICAgICBvdXQucHJpbnQoIiV0
bXAiLCBncFRtcEluZGV4KCkpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgb3V0LnBy
aW50KCIlZnRtcCIsIGZwVG1wSW5kZXgoKSk7Cit9CisKK30gfSB9IC8vIG5hbWVzcGFjZSBKU0M6
OkIzOjpBaXIKKwpJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL2Fpci9BaXJUbXAuaAo9
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvYWlyL0FpclRtcC5oCShyZXZp
c2lvbiAwKQorKysgU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL2Fpci9BaXJUbXAuaAkod29ya2lu
ZyBjb3B5KQpAQCAtMCwwICsxLDI0OCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNSBBcHBs
ZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVz
ZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmlj
YXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlv
bnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVz
dCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2Yg
Y29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmli
dXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQK
KyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcg
ZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVy
aWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FS
RSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNT
IE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRI
RQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBG
T1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQg
U0hBTEwgQVBQTEUgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJ
UkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENP
TlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQ
Uk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwg
REFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBD
QVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05U
UkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNF
IE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBU
SElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0gg
REFNQUdFLiAKKyAqLworCisjaWZuZGVmIEFpclRtcF9oCisjZGVmaW5lIEFpclRtcF9oCisKKyNp
bmNsdWRlICJSZWcuaCIKKworbmFtZXNwYWNlIEpTQyB7IG5hbWVzcGFjZSBCMyB7IG5hbWVzcGFj
ZSBBaXIgeworCisvLyBBIFRtcCBpcyBhIGdlbmVyYWxpemF0aW9uIG9mIGEgcmVnaXN0ZXIuIEl0
IGNhbiBiZSB1c2VkIHRvIHJlZmVyIHRvIGFueSBHUFIgb3IgRlBSLiBJdCBjYW4gYWxzbworLy8g
YmUgdXNlZCB0byByZWZlciB0byBhbiB1bmFsbG9jYXRlZCByZWdpc3RlciAoaS5lLiBhIHRlbXBv
cmFyeSkuIExpa2UgbWFueSBBaXIgY2xhc3Nlcywgd2UgdXNlCisvLyBkZWxpYmVyYXRlbHkgdGVy
c2UgbmFtaW5nIHNpbmNlIHdlIHdpbGwgaGF2ZSB0byB1c2UgdGhpcyBuYW1lIGEgbG90LgorCitj
bGFzcyBUbXAgeworcHVibGljOgorICAgIFRtcCgpCisgICAgICAgIDogbV92YWx1ZSgwKQorICAg
IHsKKyAgICB9CisKKyAgICBleHBsaWNpdCBUbXAoUmVnIHJlZykKKyAgICB7CisgICAgICAgIGlm
IChyZWcpIHsKKyAgICAgICAgICAgIGlmIChyZWcuaXNHUFIoKSkKKyAgICAgICAgICAgICAgICBt
X3ZhbHVlID0gZW5jb2RlR1BSKHJlZy5ncHIoKSk7CisgICAgICAgICAgICBlbHNlCisgICAgICAg
ICAgICAgICAgbV92YWx1ZSA9IGVuY29kZUZQUihyZWcuZnByKCkpOworICAgICAgICB9IGVsc2UK
KyAgICAgICAgICAgIG1fdmFsdWUgPSAwOworICAgIH0KKworICAgIHN0YXRpYyBUbXAgZ3BUbXBG
b3JJbmRleCh1bnNpZ25lZCBpbmRleCkKKyAgICB7CisgICAgICAgIFRtcCByZXN1bHQ7CisgICAg
ICAgIHJlc3VsdC5tX3ZhbHVlID0gZW5jb2RlR1BUbXAoaW5kZXgpOworICAgICAgICByZXR1cm4g
cmVzdWx0OworICAgIH0KKworICAgIHN0YXRpYyBUbXAgZnBUbXBGb3JJbmRleCh1bnNpZ25lZCBp
bmRleCkKKyAgICB7CisgICAgICAgIFRtcCByZXN1bHQ7CisgICAgICAgIHJlc3VsdC5tX3ZhbHVl
ID0gZW5jb2RlRlBUbXAoaW5kZXgpOworICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKwor
ICAgIHN0YXRpYyBUbXAgZm9yUmF3VmFsdWUodW5zaWduZWQgaW5kZXgpCisgICAgeworICAgICAg
ICBUbXAgcmVzdWx0OworICAgICAgICByZXN1bHQubV92YWx1ZSA9IGluZGV4OworICAgICAgICBy
ZXR1cm4gcmVzdWx0OworICAgIH0KKworICAgIGV4cGxpY2l0IG9wZXJhdG9yIGJvb2woKSBjb25z
dCB7IHJldHVybiAhIW1fdmFsdWU7IH0KKworICAgIGJvb2wgcmF3VmFsdWUoKSBjb25zdCB7IHJl
dHVybiBtX3ZhbHVlOyB9CisKKyAgICBib29sIGlzR1AoKSBjb25zdAorICAgIHsKKyAgICAgICAg
cmV0dXJuIGlzRW5jb2RlZEdQKG1fdmFsdWUpOworICAgIH0KKworICAgIGJvb2wgaXNGUCgpIGNv
bnN0CisgICAgeworICAgICAgICByZXR1cm4gaXNFbmNvZGVkRlAobV92YWx1ZSk7CisgICAgfQor
CisgICAgYm9vbCBpc0dQUigpIGNvbnN0CisgICAgeworICAgICAgICByZXR1cm4gaXNFbmNvZGVk
R1BSKG1fdmFsdWUpOworICAgIH0KKworICAgIGJvb2wgaXNGUFIoKSBjb25zdAorICAgIHsKKyAg
ICAgICAgcmV0dXJuIGlzRW5jb2RlZEZQUihtX3ZhbHVlKTsKKyAgICB9CisKKyAgICBib29sIGlz
UmVnKCkgY29uc3QKKyAgICB7CisgICAgICAgIHJldHVybiBpc0dQUigpIHx8IGlzRlBSKCk7Cisg
ICAgfQorCisgICAgR1BSUmVnIGdwcigpIGNvbnN0CisgICAgeworICAgICAgICByZXR1cm4gZGVj
b2RlR1BSKG1fdmFsdWUpOworICAgIH0KKworICAgIEZQUlJlZyBmcHIoKSBjb25zdAorICAgIHsK
KyAgICAgICAgcmV0dXJuIGRlY29kZUZQUihtX3ZhbHVlKTsKKyAgICB9CisKKyAgICBSZWcgcmVn
KCkgY29uc3QKKyAgICB7CisgICAgICAgIGlmIChpc0dQKCkpCisgICAgICAgICAgICByZXR1cm4g
Z3ByKCk7CisgICAgICAgIHJldHVybiBmcHIoKTsKKyAgICB9CisKKyAgICB1bnNpZ25lZCBncFRt
cEluZGV4KCkgY29uc3QKKyAgICB7CisgICAgICAgIHJldHVybiBkZWNvZGVHUFRtcChtX3ZhbHVl
KTsKKyAgICB9CisKKyAgICB1bnNpZ25lZCBmcFRtcEluZGV4KCkgY29uc3QKKyAgICB7CisgICAg
ICAgIHJldHVybiBkZWNvZGVGUFRtcChtX3ZhbHVlKTsKKyAgICB9CisKKyAgICB1bnNpZ25lZCB0
bXBJbmRleCgpIGNvbnN0CisgICAgeworICAgICAgICBpZiAoaXNHUCgpKQorICAgICAgICAgICAg
cmV0dXJuIGdwVG1wSW5kZXgoKTsKKyAgICAgICAgcmV0dXJuIGZwVG1wSW5kZXgoKTsKKyAgICB9
CisKKyAgICBib29sIG9wZXJhdG9yPT0oY29uc3QgVG1wJiBvdGhlcikgY29uc3QKKyAgICB7Cisg
ICAgICAgIHJldHVybiBtX3ZhbHVlID09IG90aGVyLm1fdmFsdWU7CisgICAgfQorCisgICAgYm9v
bCBvcGVyYXRvciE9KGNvbnN0IFRtcCYgb3RoZXIpIGNvbnN0CisgICAgeworICAgICAgICByZXR1
cm4gISgqdGhpcyA9PSBvdGhlcik7CisgICAgfQorCisgICAgdm9pZCBkdW1wKFByaW50U3RyZWFt
JiBvdXQpIGNvbnN0OworICAgIAorcHJpdmF0ZToKKyAgICBzdGF0aWMgaW50IGVuY29kZUdQKHVu
c2lnbmVkIGluZGV4KQorICAgIHsKKyAgICAgICAgcmV0dXJuIDEgKyBpbmRleDsKKyAgICB9CisK
KyAgICBzdGF0aWMgaW50IGVuY29kZUZQKHVuc2lnbmVkIGluZGV4KQorICAgIHsKKyAgICAgICAg
cmV0dXJuIC0xIC0gaW5kZXg7CisgICAgfQorCisgICAgc3RhdGljIGludCBlbmNvZGVHUFIoR1BS
UmVnIGdwcikKKyAgICB7CisgICAgICAgIHJldHVybiBlbmNvZGVHUChncHIgLSBNYWNyb0Fzc2Vt
Ymxlcjo6Zmlyc3RSZWdpc3RlcigpKTsKKyAgICB9CisKKyAgICBzdGF0aWMgaW50IGVuY29kZUZQ
UihGUFJSZWcgZnByKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGVuY29kZUZQKGZwciAtIE1hY3Jv
QXNzZW1ibGVyOjpmaXJzdEZQUlJlZ2lzdGVyKCkpOworICAgIH0KKworICAgIHN0YXRpYyBpbnQg
ZW5jb2RlR1BUbXAodW5zaWduZWQgaW5kZXgpCisgICAgeworICAgICAgICByZXR1cm4gZW5jb2Rl
R1BSKE1hY3JvQXNzZW1ibGVyOjpsYXN0UmVnaXN0ZXIoKSkgKyAxICsgaW5kZXg7CisgICAgfQor
CisgICAgc3RhdGljIGludCBlbmNvZGVGUFRtcCh1bnNpZ25lZCBpbmRleCkKKyAgICB7CisgICAg
ICAgIHJldHVybiBlbmNvZGVGUFIoTWFjcm9Bc3NlbWJsZXI6Omxhc3RGUFJlZ2lzdGVyKCkpIC0g
MSAtIGluZGV4OworICAgIH0KKworICAgIHN0YXRpYyBib29sIGlzRW5jb2RlZEdQKGludCB2YWx1
ZSkKKyAgICB7CisgICAgICAgIHJldHVybiB2YWx1ZSA+IDA7CisgICAgfQorCisgICAgc3RhdGlj
IGJvb2wgaXNFbmNvZGVkRlAoaW50IHZhbHVlKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHZhbHVl
IDwgMDsKKyAgICB9CisKKyAgICBzdGF0aWMgYm9vbCBpc0VuY29kZWRHUFIoaW50IHZhbHVlKQor
ICAgIHsKKyAgICAgICAgcmV0dXJuIGlzRW5jb2RlZEdQKHZhbHVlKSAmJiB2YWx1ZSA8PSBlbmNv
ZGVHUFIoTWFjcm9Bc3NlbWJsZXI6Omxhc3RSZWdpc3RlcigpKTsKKyAgICB9CisKKyAgICBzdGF0
aWMgYm9vbCBpc0VuY29kZWRGUFIoaW50IHZhbHVlKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGlz
RW5jb2RlZEZQKHZhbHVlKSAmJiB2YWx1ZSA+PSBlbmNvZGVkRlBSKE1hY3JvQXNzZW1ibGVyOjps
YXN0RlBSZWdpc3RlcigpKTsKKyAgICB9CisKKyAgICBzdGF0aWMgYm9vbCBpc0VuY29kZWRHUFRt
cChpbnQgdmFsdWUpCisgICAgeworICAgICAgICByZXR1cm4gaXNFbmNvZGVkR1AodmFsdWUpICYm
ICFpc0VuY29kZWRHUFIodmFsdWUpOworICAgIH0KKworICAgIHN0YXRpYyBib29sIGlzRW5jb2Rl
ZEZQVG1wKGludCB2YWx1ZSkKKyAgICB7CisgICAgICAgIHJldHVybiBpc0VuY29kZWRGUCh2YWx1
ZSkgJiYgIWlzRW5jb2RlZEZQUih2YWx1ZSk7CisgICAgfQorCisgICAgc3RhdGljIEdQUlJlZyBk
ZWNvZGVHUFIoaW50IHZhbHVlKQorICAgIHsKKyAgICAgICAgQVNTRVJUKGlzRW5jb2RlZEdQUih2
YWx1ZSkpOworICAgICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8R1BSUmVnPigKKyAgICAgICAgICAg
ICh2YWx1ZSAtIGVuY29kZUdQUihNYWNyb0Fzc2VtYmxlcjo6Zmlyc3RSZWdpc3RlcigpKSkgKyBN
YWNyb0Fzc2VtYmxlcjo6Zmlyc3RSZWdpc3RlcigpKTsKKyAgICB9CisKKyAgICBzdGF0aWMgRlBS
UmVnIGRlY29kZUZQUihpbnQgdmFsdWUpCisgICAgeworICAgICAgICBBU1NFUlQoaXNFbmNvZGVk
RlBSKHZhbHVlKSk7CisgICAgICAgIHJldHVybiBzdGF0aWNfY2FzdDxGUFJSZWc+KAorICAgICAg
ICAgICAgKGVuY29kZUZQUihNYWNyb0Fzc2VtYmxlcjo6Zmlyc3RGUFJlZ2lzdGVyKCkpIC0gdmFs
dWUpICsKKyAgICAgICAgICAgIE1hY3JvQXNzZW1ibGVyOjpmaXJzdEZQUmVnaXN0ZXIoKSk7Cisg
ICAgfQorCisgICAgc3RhdGljIHVuc2lnbmVkIGRlY29kZUdQVG1wKGludCB2YWx1ZSkKKyAgICB7
CisgICAgICAgIEFTU0VSVChpc0VuY29kZWRHUFRtcCh2YWx1ZSkpOworICAgICAgICByZXR1cm4g
dmFsdWUgLSAoZW5jb2RlR1BSKE1hY3JvQXNzZW1ibGVyOjpsYXN0UmVnaXN0ZXIoKSkgKyAxKTsK
KyAgICB9CisKKyAgICBzdGF0aWMgdW5zaWduZWQgZGVjb2RlRlBUbXAoaW50IHZhbHVlKQorICAg
IHsKKyAgICAgICAgQVNTRVJUKGlzRW5jb2RlZEZQVG1wKHZhbHVlKSk7CisgICAgICAgIHJldHVy
biAoZW5jb2RlRlBSKE1hY3JvQXNzZW1ibGVyOjpsYXN0RlBSZWdpc3RlcigpKSAtIDEpIC0gdmFs
dWU7CisgICAgfQorCisgICAgLy8gMDogZW1wdHkgVG1wCisgICAgLy8gcG9zaXRpdmU6IEdQUnMg
YW5kIHRoZW4gR1AgdGVtcHMuCisgICAgLy8gbmVnYXRpdmU6IEZQUnMgYW5kIHRoZW4gRlAgdGVt
cHMuCisgICAgaW50IG1fdmFsdWU7Cit9OworCit9IH0gfSAvLyBuYW1lc3BhY2UgSlNDOjpCMzo6
QWlyCisKKyNlbmRpZiAvLyBBaXJUbXBfaAorCkluZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUv
YjMvYWlyL29wY29kZV9nZW5lcmF0b3IucmIKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL0phdmFTY3Jp
cHRDb3JlL2IzL2Fpci9vcGNvZGVfZ2VuZXJhdG9yLnJiCShyZXZpc2lvbiAwKQorKysgU291cmNl
L0phdmFTY3JpcHRDb3JlL2IzL2Fpci9vcGNvZGVfZ2VuZXJhdG9yLnJiCSh3b3JraW5nIGNvcHkp
CkBAIC0wLDAgKzEsNzc0IEBACisjIS91c3IvYmluL2VudiBydWJ5CisKKyMgQ29weXJpZ2h0IChD
KSAyMDE1IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyMKKyMgUmVkaXN0cmlidXRp
b24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Cisj
IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcg
Y29uZGl0aW9ucworIyBhcmUgbWV0OgorIyAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNv
ZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorIyAgICBub3RpY2UsIHRoaXMgbGlz
dCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisjIDIuIFJlZGlz
dHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJp
Z2h0CisjICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dp
bmcgZGlzY2xhaW1lciBpbiB0aGUKKyMgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0
ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyMKKyMgVEhJUyBTT0ZUV0FS
RSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIEFORCBJVFMgQ09OVFJJQlVUT1JTIGBgQVMgSVMn
JworIyBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJV
VCBOT1QgTElNSVRFRCBUTywKKyMgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFC
SUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorIyBQVVJQT1NFIEFSRSBESVNDTEFJ
TUVELiBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SIElUUyBDT05UUklCVVRPUlMKKyMg
QkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwg
RVhFTVBMQVJZLCBPUgorIyBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5P
VCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgorIyBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJ
Q0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MKKyMgSU5URVJS
VVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdI
RVRIRVIgSU4KKyMgQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElO
RyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKyMgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBU
SEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRgorIyBUSEUgUE9TU0lC
SUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKK3JlcXVpcmUgInBhdGhuYW1lIgorCitjbGFzcyBPcGNv
ZGUKKyAgICBhdHRyX3JlYWRlciA6bmFtZSwgOnNwZWNpYWwsIDpvdmVybG9hZHMKKworICAgIGRl
ZiBpbml0aWFsaXplKG5hbWUsIHNwZWNpYWwpCisgICAgICAgIEBuYW1lID0gbmFtZQorICAgICAg
ICBAc3BlY2lhbCA9IHNwZWNpYWwKKyAgICAgICAgdW5sZXNzIHNwZWNpYWwKKyAgICAgICAgICAg
IEBvdmVybG9hZHMgPSBbXQorICAgICAgICBlbmQKKyAgICBlbmQKKworICAgIGRlZiBtYXNtTmFt
ZQorICAgICAgICBuYW1lWzBdLmRvd25jYXNlICsgbmFtZVsxLi4tMV0KKyAgICBlbmQKK2VuZAor
CitjbGFzcyBBcmcKKyAgICBhdHRyX3JlYWRlciA6cm9sZSwgOnR5cGUKKworICAgIGRlZiBpbml0
aWFsaXplKHJvbGUsIHR5cGUpCisgICAgICAgIEByb2xlID0gcm9sZQorICAgICAgICBAdHlwZSA9
IHR5cGUKKyAgICBlbmQKK2VuZAorCitjbGFzcyBPdmVybG9hZAorICAgIGF0dHJfcmVhZGVyIDpz
aWduYXR1cmUsIDpmb3JtcworCisgICAgZGVmIGluaXRpYWxpemUoc2lnbmF0dXJlLCBmb3JtcykK
KyAgICAgICAgQHNpZ25hdHVyZSA9IHNpZ25hdHVyZQorICAgICAgICBAZm9ybXMgPSBmb3Jtcwor
ICAgIGVuZAorZW5kCisKK2NsYXNzIEtpbmQKKyAgICBhdHRyX3JlYWRlciA6bmFtZQorICAgIGF0
dHJfYWNjZXNzb3IgOnNwZWNpYWwKKworICAgIGRlZiBpbml0aWFsaXplKG5hbWUpCisgICAgICAg
IEBuYW1lID0gbmFtZQorICAgICAgICBAc3BlY2lhbCA9IGZhbHNlCisgICAgZW5kCisKKyAgICBk
ZWYgPT0ob3RoZXIpCisgICAgICAgIGlmIG90aGVyLmlzX2E/IFN0cmluZworICAgICAgICAgICAg
QG5hbWUgPT0gb3RoZXIKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgQG5hbWUgPT0gb3RoZXIu
bmFtZSBhbmQgQHNwZWNpYWwgPT0gb3RoZXIuc3BlY2lhbAorICAgICAgICBlbmQKKyAgICBlbmQK
KworICAgIGRlZiBLaW5kLmFyZ0tpbmRzKGtpbmQpCisgICAgICAgIGlmIGtpbmQgPT0gIkFkZHIi
CisgICAgICAgICAgICBbIkFkZHIiLCAiU3RhY2tTbG90IiwgIkNhbGxBcmciXQorICAgICAgICBl
bHNlCisgICAgICAgICAgICBba2luZF0KKyAgICAgICAgZW5kCisgICAgZW5kCisKKyAgICBkZWYg
YXJnS2luZHMKKyAgICAgICAgS2luZC5hcmdLaW5kcyhraW5kKQorICAgIGVuZAorZW5kCisKK2Ns
YXNzIEZvcm0KKyAgICBhdHRyX3JlYWRlciA6a2luZHMsIDphbHROYW1lCisKKyAgICBkZWYgaW5p
dGlhbGl6ZShraW5kcywgYWx0TmFtZSkKKyAgICAgICAgQGtpbmRzID0ga2luZHMKKyAgICAgICAg
QGFsdE5hbWUgPSBhbHROYW1lCisgICAgZW5kCitlbmQKKworY2xhc3MgT3JpZ2luCisgICAgYXR0
cl9yZWFkZXIgOmZpbGVOYW1lLCA6bGluZU51bWJlcgorICAgIAorICAgIGRlZiBpbml0aWFsaXpl
KGZpbGVOYW1lLCBsaW5lTnVtYmVyKQorICAgICAgICBAZmlsZU5hbWUgPSBmaWxlTmFtZQorICAg
ICAgICBAbGluZU51bWJlciA9IGxpbmVOdW1iZXIKKyAgICBlbmQKKyAgICAKKyAgICBkZWYgdG9f
cworICAgICAgICAiI3tmaWxlTmFtZX06I3tsaW5lTnVtYmVyfSIKKyAgICBlbmQKK2VuZAorCitj
bGFzcyBUb2tlbgorICAgIGF0dHJfcmVhZGVyIDpvcmlnaW4sIDpzdHJpbmcKKyAgICAKKyAgICBk
ZWYgaW5pdGlhbGl6ZShvcmlnaW4sIHN0cmluZykKKyAgICAgICAgQG9yaWdpbiA9IG9yaWdpbgor
ICAgICAgICBAc3RyaW5nID0gc3RyaW5nCisgICAgZW5kCisgICAgCisgICAgZGVmID09KG90aGVy
KQorICAgICAgICBpZiBvdGhlci5pc19hPyBUb2tlbgorICAgICAgICAgICAgQHN0cmluZyA9PSBv
dGhlci5zdHJpbmcKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgQHN0cmluZyA9PSBvdGhlcgor
ICAgICAgICBlbmQKKyAgICBlbmQKKyAgICAKKyAgICBkZWYgPX4ob3RoZXIpCisgICAgICAgIEBz
dHJpbmcgPX4gb3RoZXIKKyAgICBlbmQKKyAgICAKKyAgICBkZWYgdG9fcworICAgICAgICAiI3tA
c3RyaW5nLmluc3BlY3R9IGF0ICN7b3JpZ2lufSIKKyAgICBlbmQKKyAgICAKKyAgICBkZWYgcGFy
c2VFcnJvcigqY29tbWVudCkKKyAgICAgICAgaWYgY29tbWVudC5lbXB0eT8KKyAgICAgICAgICAg
IHJhaXNlICJQYXJzZSBlcnJvcjogI3t0b19zfSIKKyAgICAgICAgZWxzZQorICAgICAgICAgICAg
cmFpc2UgIlBhcnNlIGVycm9yOiAje3RvX3N9OiAje2NvbW1lbnRbMF19IgorICAgICAgICBlbmQK
KyAgICBlbmQKK2VuZAorCitkZWYgbGV4KHN0ciwgZmlsZU5hbWUpCisgICAgZmlsZU5hbWUgPSBQ
YXRobmFtZS5uZXcoZmlsZU5hbWUpCisgICAgcmVzdWx0ID0gW10KKyAgICBsaW5lTnVtYmVyID0g
MQorICAgIHdoaWxlIG5vdCBzdHIuZW1wdHk/CisgICAgICAgIGNhc2Ugc3RyCisgICAgICAgIHdo
ZW4gL1xBXCMoW15cbl0qKS8KKyAgICAgICAgICAgICMgY29tbWVudCwgaWdub3JlCisgICAgICAg
IHdoZW4gL1xBXG4vCisgICAgICAgICAgICAjIG5ld2xpbmUsIGlnbm9yZQorICAgICAgICAgICAg
bGluZU51bWJlciArPSAxCisgICAgICAgIHdoZW4gL1xBKFthLXpBLVowLTlfXSspLworICAgICAg
ICAgICAgcmVzdWx0IDw8IFRva2VuLm5ldyhPcmlnaW4ubmV3KGZpbGVOYW1lLCBsaW5lTnVtYmVy
KSwgJCYpCisgICAgICAgIHdoZW4gL1xBKFsgXHRccl0rKS8KKyAgICAgICAgICAgICMgd2hpdGVz
cGFjZSwgaWdub3JlCisgICAgICAgIHdoZW4gL1xBWyw6Kl0vCisgICAgICAgICAgICByZXN1bHQg
PDwgVG9rZW4ubmV3KE9yaWdpbi5uZXcoZmlsZU5hbWUsIGxpbmVOdW1iZXIpLCAkJikKKyAgICAg
ICAgZWxzZQorICAgICAgICAgICAgcmFpc2UgIkxleGVyIGVycm9yIGF0ICN7T3JpZ2luLm5ldyhm
aWxlTmFtZSwgbGluZU51bWJlcikudG9fc30sIHVuZXhwZWN0ZWQgc2VxdWVuY2UgI3tzdHJbMC4u
MjBdLmluc3BlY3R9IgorICAgICAgICBlbmQKKyAgICAgICAgc3RyID0gJH4ucG9zdF9tYXRjaAor
ICAgIGVuZAorICAgIHJlc3VsdAorZW5kCisKK2RlZiBpc1VEKHRva2VuKQorICAgIHRva2VuID1+
IC9cQSgoVSl8KEQpfChVRCkpXFovCitlbmQKKworZGVmIGlzR0YodG9rZW4pCisgICAgdG9rZW4g
PX4gL1xBKChHKXwoRikpXFovCitlbmQKKworZGVmIGlzS2luZCh0b2tlbikKKyAgICB0b2tlbiA9
fiAvXEEoKFRtcCl8KEltbSl8KEltbVB0cil8KEFkZHIpfChJbmRleCkpXFovCitlbmQKKworZGVm
IGlzS2V5d29yZCh0b2tlbikKKyAgICBpc1VEKHRva2VuKSBvciBpc0dGKHRva2VuKSBvciBpc0tp
bmQodG9rZW4pIG9yCisgICAgICAgIHRva2VuID09ICJzcGVjaWFsIiBvciB0b2tlbiA9PSAiYXMi
CitlbmQKKworZGVmIGlzSWRlbnRpZmllcih0b2tlbikKKyAgICB0b2tlbiA9fiAvXEEoW2EtekEt
WjAtOV9dKylcWi8gYW5kIG5vdCBpc0tleXdvcmQodG9rZW4pCitlbmQKKworY2xhc3MgUGFyc2Vy
CisgICAgZGVmIGluaXRpYWxpemUoZGF0YSwgZmlsZU5hbWUpCisgICAgICAgIEB0b2tlbnMgPSBs
ZXgoZGF0YSwgZmlsZU5hbWUpCisgICAgICAgIEBpZHggPSAwCisgICAgZW5kCisKKyAgICBkZWYg
dG9rZW4KKyAgICAgICAgQHRva2Vuc1tAaWR4XQorICAgIGVuZAorCisgICAgZGVmIGFkdmFuY2UK
KyAgICAgICAgQGlkeCArPSAxCisgICAgZW5kCisKKyAgICBkZWYgcGFyc2VFcnJvcigqY29tbWVu
dCkKKyAgICAgICAgaWYgdG9rZW4KKyAgICAgICAgICAgIHRva2VuLnBhcnNlRXJyb3IoKmNvbW1l
bnQpCisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGlmIGNvbW1lbnQuZW1wdHk/CisgICAgICAg
ICAgICAgICAgcmFpc2UgIlBhcnNlIGVycm9yIGF0IGVuZCBvZiBmaWxlIgorICAgICAgICAgICAg
ZWxzZQorICAgICAgICAgICAgICAgIHJhaXNlICJQYXJzZSBlcnJvciBhdCBlbmQgb2YgZmlsZTog
I3tjb21tZW50WzBdfSIKKyAgICAgICAgICAgIGVuZAorICAgICAgICBlbmQKKyAgICBlbmQKKwor
ICAgIGRlZiBjb25zdW1lKHN0cmluZykKKyAgICAgICAgcGFyc2VFcnJvcigiRXhwZWN0ZWQgI3tz
dHJpbmd9IikgdW5sZXNzIHRva2VuID09IHN0cmluZworICAgICAgICBhZHZhbmNlCisgICAgZW5k
CisKKyAgICBkZWYgY29uc3VtZUlkZW50aWZpZXIKKyAgICAgICAgcmVzdWx0ID0gdG9rZW4uc3Ry
aW5nCisgICAgICAgIHBhcnNlRXJyb3IoIkV4cGVjdGVkIGlkZW50aWZpZXIiKSB1bmxlc3MgaXNJ
ZGVudGlmaWVyKHJlc3VsdCkKKyAgICAgICAgYWR2YW5jZQorICAgICAgICByZXN1bHQKKyAgICBl
bmQKKworICAgIGRlZiBjb25zdW1lUm9sZQorICAgICAgICByZXN1bHQgPSB0b2tlbi5zdHJpbmcK
KyAgICAgICAgcGFyc2VFcnJvcigiRXhwZWN0ZWQgcm9sZSAoVSwgRCwgb3IgVUQpIikgdW5sZXNz
IGlzVUQocmVzdWx0KQorICAgICAgICBhZHZhbmNlCisgICAgICAgIHJlc3VsdAorICAgIGVuZAor
CisgICAgZGVmIGNvbnN1bWVUeXBlCisgICAgICAgIHJlc3VsdCA9IHRva2VuLnN0cmluZworICAg
ICAgICBwYXJzZUVycm9yKCJFeHBlY3RlZCB0eXBlIChHIG9yIEYpIikgdW5sZXNzIGlzR0YocmVz
dWx0KQorICAgICAgICBhZHZhbmNlCisgICAgICAgIHJlc3VsdAorICAgIGVuZAorCisgICAgZGVm
IGNvbnN1bWVLaW5kCisgICAgICAgIHJlc3VsdCA9IHRva2VuLnN0cmluZworICAgICAgICBwYXJz
ZUVycm9yKCJFeHBlY3RlZCBraW5kIChJbW0sIEltbVB0ciwgVG1wLCBBZGRyLCBvciBJbmRleCki
KSB1bmxlc3MgaXNLaW5kKHJlc3VsdCkKKyAgICAgICAgYWR2YW5jZQorICAgICAgICByZXN1bHQK
KyAgICBlbmQKKworICAgIGRlZiBwYXJzZQorICAgICAgICByZXN1bHQgPSB7fQorICAgICAgICAK
KyAgICAgICAgbG9vcCB7CisgICAgICAgICAgICBicmVhayBpZiBAaWR4ID49IEB0b2tlbnMubGVu
Z3RoCisKKyAgICAgICAgICAgIGlmIHRva2VuID09ICJzcGVjaWFsIgorICAgICAgICAgICAgICAg
IGNvbnN1bWUoInNwZWNpYWwiKQorICAgICAgICAgICAgICAgIG9wY29kZU5hbWUgPSBjb25zdW1l
SWRlbnRpZmllcgorCisgICAgICAgICAgICAgICAgcGFyc2VFcnJvcigiQ2Fubm90IG92ZXJsb2Fk
IGEgc3BlY2lhbCBvcGNvZGUiKSBpZiByZXN1bHRbb3Bjb2RlTmFtZV0KKworICAgICAgICAgICAg
ICAgIHJlc3VsdFtvcGNvZGVOYW1lXSA9IE9wY29kZS5uZXcob3Bjb2RlTmFtZSwgdHJ1ZSkKKyAg
ICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBvcGNvZGVOYW1lID0gY29uc3VtZUlkZW50
aWZpZXIKKworICAgICAgICAgICAgICAgIGlmIHJlc3VsdFtvcGNvZGVOYW1lXQorICAgICAgICAg
ICAgICAgICAgICBvcGNvZGUgPSByZXN1bHRbb3Bjb2RlTmFtZV0KKyAgICAgICAgICAgICAgICAg
ICAgcGFyc2VFcnJvcigiQ2Fubm90IG92ZXJsb2FkIGEgc3BlY2lhbCBvcGNvZGUiKSBpZiBvcGNv
ZGUuc3BlY2lhbAorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgb3Bj
b2RlID0gT3Bjb2RlLm5ldyhvcGNvZGVOYW1lLCBmYWxzZSkKKyAgICAgICAgICAgICAgICAgICAg
cmVzdWx0W29wY29kZU5hbWVdID0gb3Bjb2RlCisgICAgICAgICAgICAgICAgZW5kCisKKyAgICAg
ICAgICAgICAgICBzaWduYXR1cmUgPSBbXQorICAgICAgICAgICAgICAgIGZvcm1zID0gW10KKyAg
ICAgICAgICAgICAgICBpZiBpc1VEKHRva2VuKQorICAgICAgICAgICAgICAgICAgICBsb29wIHsK
KyAgICAgICAgICAgICAgICAgICAgICAgIHJvbGUgPSBjb25zdW1lUm9sZQorICAgICAgICAgICAg
ICAgICAgICAgICAgY29uc3VtZSgiOiIpCisgICAgICAgICAgICAgICAgICAgICAgICB0eXBlID0g
Y29uc3VtZVR5cGUKKyAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAg
ICAgICAgc2lnbmF0dXJlIDw8IEFyZy5uZXcocm9sZSwgdHlwZSkKKyAgICAgICAgICAgICAgICAg
ICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsgdW5sZXNzIHRva2VuID09ICIs
IgorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3VtZSgiLCIpCisgICAgICAgICAgICAgICAg
ICAgIH0KKworICAgICAgICAgICAgICAgICAgICBsb29wIHsKKyAgICAgICAgICAgICAgICAgICAg
ICAgIGtpbmRzID0gW10KKyAgICAgICAgICAgICAgICAgICAgICAgIGFsdE5hbWUgPSBuaWwKKyAg
ICAgICAgICAgICAgICAgICAgICAgIGxvb3AgeworICAgICAgICAgICAgICAgICAgICAgICAgICAg
IGtpbmRzIDw8IEtpbmQubmV3KGNvbnN1bWVLaW5kKQorCisgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgaWYgdG9rZW4gPT0gIioiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBh
cnNlRXJyb3IoIkNhbiBvbmx5IGFwcGx5ICogdG8gVG1wIikgdW5sZXNzIGtpbmRzWy0xXS5uYW1l
ID09ICJUbXAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtpbmRzWy0xXS5zcGVj
aWFsID0gdHJ1ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdW1lKCIqIikK
KyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmQKKworICAgICAgICAgICAgICAgICAgICAg
ICAgICAgIGJyZWFrIHVubGVzcyB0b2tlbiA9PSAiLCIKKyAgICAgICAgICAgICAgICAgICAgICAg
ICAgICBjb25zdW1lKCIsIikKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAg
ICAgICAgICAgICAgICAgaWYgdG9rZW4gPT0gImFzIgorICAgICAgICAgICAgICAgICAgICAgICAg
ICAgIGNvbnN1bWUoImFzIikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbHROYW1lID0g
Y29uc3VtZUlkZW50aWZpZXIKKyAgICAgICAgICAgICAgICAgICAgICAgIGVuZAorCisgICAgICAg
ICAgICAgICAgICAgICAgICBwYXJzZUVycm9yKCJGb3JtIGhhcyB3cm9uZyBudW1iZXIgb2YgYXJn
dW1lbnRzIGZvciBvdmVybG9hZCIpIHVubGVzcyBraW5kcy5sZW5ndGggPT0gc2lnbmF0dXJlLmxl
bmd0aAorICAgICAgICAgICAgICAgICAgICAgICAga2luZHMuZWFjaF93aXRoX2luZGV4IHsKKyAg
ICAgICAgICAgICAgICAgICAgICAgICAgICB8IGtpbmQsIGluZGV4IHwKKyAgICAgICAgICAgICAg
ICAgICAgICAgICAgICBpZiBraW5kLm5hbWUgPT0gIkltbSIgb3Iga2luZC5uYW1lID09ICJJbW1Q
dHIiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIHNpZ25hdHVyZVtpbmRleF0u
cm9sZSAhPSAiVSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnNlRXJy
b3IoIkZvcm0gaGFzIGFuIGltbWVkaWF0ZSBmb3IgYSBub24tdXNlIGFyZ3VtZW50IikKKyAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5kCisgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgIGlmIHNpZ25hdHVyZVtpbmRleF0udHlwZSAhPSAiRyIKKyAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgIHBhcnNlRXJyb3IoIkZvcm0gaGFzIGFuIGltbWVkaWF0ZSBmb3Ig
YSBub24tZ2VuZXJhbC1wdXJwb3NlIGFyZ3VtZW50IikKKyAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgZW5kCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5kCisgICAgICAgICAg
ICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBmb3JtcyA8PCBGb3JtLm5l
dyhraW5kcywgYWx0TmFtZSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrIHVubGVzcyBp
c0tpbmQodG9rZW4pCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNl
CisgICAgICAgICAgICAgICAgICAgIHNpZ25hdHVyZSA9IFtdCisgICAgICAgICAgICAgICAgICAg
IGZvcm1zID0gW0Zvcm0ubmV3KFtdLCBuaWwpXQorICAgICAgICAgICAgICAgIGVuZAorCisgICAg
ICAgICAgICAgICAgb3Bjb2RlLm92ZXJsb2FkcyA8PCBPdmVybG9hZC5uZXcoc2lnbmF0dXJlLCBm
b3JtcykKKyAgICAgICAgICAgIGVuZAorICAgICAgICB9CisKKyAgICAgICAgcmVzdWx0CisgICAg
ZW5kCitlbmQKKworJGZpbGVOYW1lID0gQVJHVlswXQorCitwYXJzZXIgPSBQYXJzZXIubmV3KElP
OjpyZWFkKCRmaWxlTmFtZSksICRmaWxlTmFtZSkKKyRvcGNvZGVzID0gcGFyc2VyLnBhcnNlCisK
K2RlZiB3cml0ZUgoZmlsZW5hbWUpCisgICAgRmlsZS5vcGVuKCJBaXIje2ZpbGVuYW1lfS5oIiwg
InciKSB7CisgICAgICAgIHwgb3V0cCB8CisgICAgICAgIAorICAgICAgICBvdXRwLnB1dHMgIi8v
IEdlbmVyYXRlZCBieSBvcGNvZGVfZ2VuZXJhdG9yLnJiIGZyb20gI3skZmlsZU5hbWV9IC0tIGRv
IG5vdCBlZGl0ISIKKyAgICAgICAgCisgICAgICAgIG91dHAucHV0cyAiI2lmbmRlZiBBaXIje2Zp
bGVuYW1lfV9oIgorICAgICAgICBvdXRwLnB1dHMgIiNkZWZpbmUgQWlyI3tmaWxlbmFtZX1faCIK
KworICAgICAgICB5aWVsZCBvdXRwCisgICAgICAgIAorICAgICAgICBvdXRwLnB1dHMgIiNlbmRp
ZiAvLyBBaXIje2ZpbGVuYW1lfV9oIgorICAgIH0KK2VuZAorCitkZWYgd3JpdGVDUFAoZmlsZW5h
bWUpCisgICAgRmlsZS5vcGVuKCJBaXIje2ZpbGVuYW1lfS5jcHAiLCAidyIpIHsKKyAgICAgICAg
fCBvdXRwIHwKKyAgICAgICAgCisgICAgICAgIG91dHAucHV0cyAiLy8gR2VuZXJhdGVkIGJ5IG9w
Y29kZV9nZW5lcmF0b3IucmIgZnJvbSAjeyRmaWxlTmFtZX0gLS0gZG8gbm90IGVkaXQhIgorICAg
ICAgICAKKyAgICAgICAgb3V0cC5wdXRzICIjaW5jbHVkZSBcImNvbmZpZy5oXCIiCisgICAgICAg
IG91dHAucHV0cyAiI2luY2x1ZGUgXCJBaXIje2ZpbGVuYW1lfS5oXCIiCisKKyAgICAgICAgeWll
bGQgb3V0cAorICAgIH0KK2VuZAorCit3cml0ZUgoIk9wY29kZSIpIHsKKyAgICB8IG91dHAgfAor
ICAgIG91dHAucHV0cyAibmFtZXNwYWNlIEpTQyB7IG5hbWVzcGFjZSBCMyB7IG5hbWVzcGFjZSBB
aXIgeyIKKyAgICBvdXRwLnB1dHMgImVudW0gT3Bjb2RlIDogaW50MTZfdCB7IgorICAgICRvcGNv
ZGVzLmtleXMuc29ydC5lYWNoIHsKKyAgICAgICAgfCBvcGNvZGUgfAorICAgICAgICBvdXRwLnB1
dHMgIiAgICAje29wY29kZX0sIgorICAgIH0KKyAgICBvdXRwLnB1dHMgIn0iCisKKyAgICBvdXRw
LnB1dHMgInN0YXRpYyBjb25zdCB1bnNpZ25lZCBudW1PcGNvZGVzID0gI3skb3Bjb2Rlcy5rZXlz
LnNpemV9OyIKKyAgICBvdXRwLnB1dHMgIn0gfSB9IC8vIG5hbWVzcGFjZSBKU0M6OkIzOjpBaXIi
CisgICAgCisgICAgb3V0cC5wdXRzICJuYW1lc3BhY2UgV1RGIHsiCisgICAgb3V0cC5wdXRzICJj
bGFzcyBQcmludFN0cmVhbTsiCisgICAgb3V0cC5wdXRzICJ2b2lkIHByaW50SW50ZXJuYWwoUHJp
bnRTdHJlYW0mLCBKU0M6OkIzOjpBaXI6Ok9wY29kZSk7IgorICAgIG91dHAucHV0cyAifSAvLyBu
YW1lc3BhY2UgV1RGIgorfQorCit3cml0ZUNQUCgiT3Bjb2RlIikgeworICAgIHwgb3V0cCB8Cisg
ICAgb3V0cC5wdXRzICIjaW5jbHVkZSBcInd0Zi9QcmludFN0cmVhbS5oXCIiCisgICAgb3V0cC5w
dXRzICJuYW1lc3BhY2UgV1RGIHsiCisgICAgb3V0cC5wdXRzICJ1c2luZyBuYW1lc3BhY2UgSlND
OjpCMzo6QWlyOyIKKyAgICBvdXRwLnB1dHMgInZvaWQgcHJpbnRJbnRlcm5hbChQcmludFN0cmVh
bSYgb3V0LCBPcGNvZGUgb3Bjb2RlKSIKKyAgICBvdXRwLnB1dHMgInsiCisgICAgb3V0cC5wdXRz
ICIgICAgc3dpdGNoIChvcGNvZGUpIHsiCisgICAgJG9wY29kZXMua2V5cy5lYWNoIHsKKyAgICAg
ICAgfCBvcGNvZGUgfAorICAgICAgICBvdXRwLnB1dHMgIiAgICBjYXNlICN7b3Bjb2RlfToiCisg
ICAgICAgIG91dHAucHV0cyAiICAgICAgICBvdXQucHJpbnQoXCIje29wY29kZX1cIik7IgorICAg
ICAgICBvdXRwLnB1dHMgIiAgICAgICAgcmV0dXJuOyIKKyAgICB9CisgICAgb3V0cC5wdXRzICIg
ICAgfSIKKyAgICBvdXRwLnB1dHMgIiAgICBSRUxFQVNFX0FTU0VSVF9OT1RfUkVBQ0hFRCgpOyIK
KyAgICBvdXRwLnB1dHMgIn0iCisgICAgb3V0cC5wdXRzICJ9IC8vIG5hbWVzcGFjZSBXVEYiCit9
CisKKyMgRnJvbSBoZXJlIG9uLCB3ZSBkb24ndCB0cnkgdG8gZW1pdCBwcm9wZXJseSBpbmRlbnRl
ZCBjb2RlLCBzaW5jZSB3ZSdyZSB1c2luZyBhIHJlY3Vyc2l2ZSBwYXR0ZXJuCisjIG1hdGNoZXIu
CisKK2RlZiBtYXRjaEZvcm1zKG91dHAsIHNwZWVkLCBmb3JtcywgY29sdW1uSW5kZXgsIGNvbHVt
bkdldHRlciwgZmlsdGVyLCBjYWxsYmFjaykKKyAgICByZXR1cm4gaWYgZm9ybXMubGVuZ3RoID09
IDAKKworICAgIGlmIGZpbHRlcltmb3Jtc10KKyAgICAgICAgcmV0dXJuCisgICAgZW5kCisKKyAg
ICBpZiBjb2x1bW5JbmRleCA+PSBmb3Jtc1swXS5raW5kcy5sZW5ndGgKKyAgICAgICAgcmFpc2Ug
dW5sZXNzIGZvcm1zLmxlbmd0aCA9PSAxCisgICAgICAgIGNhbGxiYWNrW2Zvcm1zWzBdXQorICAg
ICAgICByZXR1cm4KKyAgICBlbmQKKyAgICAKKyAgICBncm91cHMgPSB7fQorICAgIGZvcm1zLmVh
Y2ggeworICAgICAgICB8IGZvcm0gfAorICAgICAgICBraW5kID0gZm9ybS5raW5kc1tjb2x1bW5J
bmRleF0ubmFtZQorICAgICAgICBpZiBncm91cHNba2luZF0KKyAgICAgICAgICAgIGdyb3Vwc1tr
aW5kXSA8PCBmb3JtCisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGdyb3Vwc1traW5kXSA9IFtm
b3JtXQorICAgICAgICBlbmQKKyAgICB9CisKKyAgICBpZiBzcGVlZCA9PSA6ZmFzdCBhbmQgZ3Jv
dXBzLmxlbmd0aCA9PSAxCisgICAgICAgIG1hdGNoRm9ybXMob3V0cCwgc3BlZWQsIGZvcm1zLCBj
b2x1bW5JbmRleCArIDEsIGNvbHVtbkdldHRlciwgZmlsdGVyLCBjYWxsYmFjaykKKyAgICAgICAg
cmV0dXJuCisgICAgZW5kCisKKyAgICBvdXRwLnB1dHMgInN3aXRjaCAoI3tjb2x1bW5HZXR0ZXJb
Y29sdW1uSW5kZXhdfSkgeyIKKyAgICBncm91cHMuZWFjaF9wYWlyIHsKKyAgICAgICAgfCBrZXks
IHZhbHVlIHwKKyAgICAgICAgS2luZC5hcmdLaW5kcyhrZXkpLmVhY2ggeworICAgICAgICAgICAg
fCBhcmdLaW5kIHwKKyAgICAgICAgICAgIG91dHAucHV0cyAiY2FzZSBBcmc6OiN7YXJnS2luZH06
IgorICAgICAgICB9CisgICAgICAgIG1hdGNoRm9ybXMob3V0cCwgc3BlZWQsIHZhbHVlLCBjb2x1
bW5JbmRleCArIDEsIGNvbHVtbkdldHRlciwgZmlsdGVyLCBjYWxsYmFjaykKKyAgICAgICAgb3V0
cC5wdXRzICJicmVhazsiCisgICAgfQorICAgIG91dHAucHV0cyAiZGVmYXVsdDoiCisgICAgb3V0
cC5wdXRzICJicmVhazsiCisgICAgb3V0cC5wdXRzICJ9IgorZW5kCisKK2RlZiBtYXRjaEluc3RP
dmVybG9hZChvdXRwLCBzcGVlZCwgaW5zdCkKKyAgICBvdXRwLnB1dHMgInN3aXRjaCAoI3tpbnN0
fS0+b3Bjb2RlKSB7IgorICAgICRvcGNvZGVzLnZhbHVlcy5lYWNoIHsKKyAgICAgICAgfCBvcGNv
ZGUgfAorICAgICAgICBvdXRwLnB1dHMgImNhc2UgI3tvcGNvZGUubmFtZX06IgorICAgICAgICBp
ZiBvcGNvZGUuc3BlY2lhbAorICAgICAgICAgICAgeWllbGQgb3Bjb2RlLCBuaWwKKyAgICAgICAg
ZWxzZQorICAgICAgICAgICAgbmVlZE92ZXJsb2FkU3dpdGNoID0gKChvcGNvZGUub3ZlcmxvYWRz
LnNpemUgIT0gMSkgb3Igc3BlZWQgPT0gOnNhZmUpCisgICAgICAgICAgICBvdXRwLnB1dHMgInN3
aXRjaCAoI3tpbnN0fS0+YXJncy5zaXplKCkpIHsiIGlmIG5lZWRPdmVybG9hZFN3aXRjaAorICAg
ICAgICAgICAgb3Bjb2RlLm92ZXJsb2Fkcy5lYWNoIHsKKyAgICAgICAgICAgICAgICB8IG92ZXJs
b2FkIHwKKyAgICAgICAgICAgICAgICBvdXRwLnB1dHMgImNhc2UgI3tvdmVybG9hZC5zaWduYXR1
cmUubGVuZ3RofToiIGlmIG5lZWRPdmVybG9hZFN3aXRjaAorICAgICAgICAgICAgICAgIHlpZWxk
IG9wY29kZSwgb3ZlcmxvYWQKKyAgICAgICAgICAgICAgICBvdXRwLnB1dHMgImJyZWFrOyIgaWYg
bmVlZE92ZXJsb2FkU3dpdGNoCisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiBuZWVkT3Zl
cmxvYWRTd2l0Y2gKKyAgICAgICAgICAgICAgICBvdXRwLnB1dHMgImRlZmF1bHQ6IgorICAgICAg
ICAgICAgICAgIG91dHAucHV0cyAiYnJlYWs7IgorICAgICAgICAgICAgICAgIG91dHAucHV0cyAi
fSIKKyAgICAgICAgICAgIGVuZAorICAgICAgICBlbmQKKyAgICAgICAgb3V0cC5wdXRzICJicmVh
azsiCisgICAgfQorICAgIG91dHAucHV0cyAiZGVmYXVsdDoiCisgICAgb3V0cC5wdXRzICJicmVh
azsiCisgICAgb3V0cC5wdXRzICJ9IgorZW5kCisgICAgCitkZWYgbWF0Y2hJbnN0T3ZlcmxvYWRG
b3JtKG91dHAsIHNwZWVkLCBpbnN0KQorICAgIG1hdGNoSW5zdE92ZXJsb2FkKG91dHAsIHNwZWVk
LCBpbnN0KSB7CisgICAgICAgIHwgb3Bjb2RlLCBvdmVybG9hZCB8CisgICAgICAgIGlmIG9wY29k
ZS5zcGVjaWFsCisgICAgICAgICAgICB5aWVsZCBvcGNvZGUsIG5pbCwgbmlsCisgICAgICAgIGVs
c2UKKyAgICAgICAgICAgIGNvbHVtbkdldHRlciA9IHByb2MgeworICAgICAgICAgICAgICAgIHwg
Y29sdW1uSW5kZXggfAorICAgICAgICAgICAgICAgICIje2luc3R9LT5hcmdzWyN7Y29sdW1uSW5k
ZXh9XS5raW5kKCkiCisgICAgICAgICAgICB9CisgICAgICAgICAgICBmaWx0ZXIgPSBwcm9jIHsg
ZmFsc2UgfQorICAgICAgICAgICAgY2FsbGJhY2sgPSBwcm9jIHsKKyAgICAgICAgICAgICAgICB8
IGZvcm0gfAorICAgICAgICAgICAgICAgIHlpZWxkIG9wY29kZSwgb3ZlcmxvYWQsIGZvcm0KKyAg
ICAgICAgICAgIH0KKyAgICAgICAgICAgIG1hdGNoRm9ybXMob3V0cCwgc3BlZWQsIG92ZXJsb2Fk
LmZvcm1zLCAwLCBjb2x1bW5HZXR0ZXIsIGZpbHRlciwgY2FsbGJhY2spCisgICAgICAgIGVuZAor
ICAgIH0KK2VuZAorCit3cml0ZUgoIk9wY29kZVV0aWxzIikgeworICAgIHwgb3V0cCB8CisgICAg
b3V0cC5wdXRzICIjaW5jbHVkZSBcIkFpckluc3QuaFwiIgorICAgIG91dHAucHV0cyAibmFtZXNw
YWNlIEpTQyB7IG5hbWVzcGFjZSBCMyB7IG5hbWVzcGFjZSBBaXIgeyIKKyAgICAKKyAgICBvdXRw
LnB1dHMgInRlbXBsYXRlPHR5cGVuYW1lIEZ1bmN0b3I+IgorICAgIG91dHAucHV0cyAidm9pZCBJ
bnN0Ojpmb3JFYWNoQXJnKGNvbnN0IEZ1bmN0b3ImIGZ1bmN0b3IpIgorICAgIG91dHAucHV0cyAi
eyIKKyAgICBtYXRjaEluc3RPdmVybG9hZChvdXRwLCA6ZmFzdCwgInRoaXMiKSB7CisgICAgICAg
IHwgb3Bjb2RlLCBvdmVybG9hZCB8CisgICAgICAgIGlmIG9wY29kZS5zcGVjaWFsCisgICAgICAg
ICAgICBvdXRwLnB1dHMgImZ1bmN0b3IoYXJnc1swXSwgQXJnOjpVc2UsIEFyZzo6R1ApOyAvLyBU
aGlzIGlzIGJhc2ljYWxseSBib2d1cywgYnV0IGl0IHdvcmtzIGYgYW5hbHlzZXMgbW9kZWwgU3Bl
Y2lhbCBhcyBhbiBpbW1lZGlhdGUuIgorICAgICAgICAgICAgb3V0cC5wdXRzICJhcmdzWzBdLnNw
ZWNpYWwoKS0+Zm9yRWFjaEFyZygqdGhpcywgc2NvcGVkTGFtYmRhPEVhY2hBcmdDYWxsYmFjaz4o
ZnVuY3RvcikpOyIKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgb3ZlcmxvYWQuc2lnbmF0dXJl
LmVhY2hfd2l0aF9pbmRleCB7CisgICAgICAgICAgICAgICAgfCBhcmcsIGluZGV4IHwKKyAgICAg
ICAgICAgICAgICByb2xlID0gbmlsCisgICAgICAgICAgICAgICAgY2FzZSBhcmcucm9sZQorICAg
ICAgICAgICAgICAgIHdoZW4gIlUiCisgICAgICAgICAgICAgICAgICAgIHJvbGUgPSAiVXNlIgor
ICAgICAgICAgICAgICAgIHdoZW4gIkQiCisgICAgICAgICAgICAgICAgICAgIHJvbGUgPSAiRGVm
IgorICAgICAgICAgICAgICAgIHdoZW4gIlVEIgorICAgICAgICAgICAgICAgICAgICByb2xlID0g
IlVzZURlZiIKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHJhaXNl
CisgICAgICAgICAgICAgICAgZW5kCisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAg
b3V0cC5wdXRzICJmdW5jdG9yKGFyZ3NbI3tpbmRleH1dLCBBcmc6OiN7cm9sZX0sIEFyZzo6I3th
cmcudHlwZX1QKTsiCisgICAgICAgICAgICB9CisgICAgICAgIGVuZAorICAgIH0KKyAgICBvdXRw
LnB1dHMgIn0iCisgICAgCisgICAgb3V0cC5wdXRzICJ9IH0gfSAvLyBuYW1lc3BhY2UgSlNDOjpC
Mzo6QWlyIgorfQorCit3cml0ZUNQUCgiT3Bjb2RlVXRpbHMiKSB7CisgICAgfCBvdXRwIHwKKyAg
ICBvdXRwLnB1dHMgIiNpbmNsdWRlIFwiQWlySW5zdElubGluZXMuaFwiIgorICAgIG91dHAucHV0
cyAibmFtZXNwYWNlIEpTQyB7IG5hbWVzcGFjZSBCMyB7IG5hbWVzcGFjZSBBaXIgeyIKKyAgICBv
dXRwLnB1dHMgImlubGluZSBib29sIGhpZGRlblRydXRoKCkgeyByZXR1cm4gdHJ1ZTsgfSIKKyAg
ICBvdXRwLnB1dHMgIiNkZWZpbmUgUkVUVVJOKHZhbHVlKSBkbyB7XFwiCisgICAgb3V0cC5wdXRz
ICIgICAgaWYgKGhpZGRlblRydXRoKCkpXFwiCisgICAgb3V0cC5wdXRzICIgICAgICAgIHJldHVy
biB2YWx1ZTtcXCIKKyAgICBvdXRwLnB1dHMgIn0iCisgICAgb3V0cC5wdXRzICJib29sIEluc3Q6
OmlzVmFsaWRGb3JtKCkiCisgICAgb3V0cC5wdXRzICJ7IgorICAgIG1hdGNoSW5zdE92ZXJsb2Fk
Rm9ybShvdXRwLCA6c2FmZSwgInRoaXMiKSB7CisgICAgICAgIHwgb3Bjb2RlLCBvdmVybG9hZCwg
Zm9ybSB8CisgICAgICAgIGlmIG9wY29kZS5zcGVjaWFsCisgICAgICAgICAgICBvdXRwLnB1dHMg
ImlmIChhcmdzLnNpemUoKSA8IDEpIgorICAgICAgICAgICAgb3V0cC5wdXRzICJyZXR1cm4gZmFs
c2U7IgorICAgICAgICAgICAgb3V0cC5wdXRzICJpZiAoIWFyZ3NbMF0uaXNTcGVjaWFsKCkpIgor
ICAgICAgICAgICAgb3V0cC5wdXRzICJyZXR1cm4gZmFsc2U7IgorICAgICAgICAgICAgb3V0cC5w
dXRzICJSRVRVUk4oYXJnc1swXS5zcGVjaWFsKCktPmlzVmFsaWQoKnRoaXMpKTsiCisgICAgICAg
IGVsc2UKKyAgICAgICAgICAgIG5lZWRzTW9yZVZhbGlkYXRpb24gPSBmYWxzZQorICAgICAgICAg
ICAgb3ZlcmxvYWQuc2lnbmF0dXJlLmxlbmd0aC50aW1lcyB7CisgICAgICAgICAgICAgICAgfCBp
bmRleCB8CisgICAgICAgICAgICAgICAgcm9sZSA9IG92ZXJsb2FkLnNpZ25hdHVyZVtpbmRleF0u
cm9sZQorICAgICAgICAgICAgICAgIHR5cGUgPSBvdmVybG9hZC5zaWduYXR1cmVbaW5kZXhdLnR5
cGUKKyAgICAgICAgICAgICAgICBraW5kID0gZm9ybS5raW5kc1tpbmRleF0KKyAgICAgICAgICAg
ICAgICBuZWVkc01vcmVWYWxpZGF0aW9uIHw9IGtpbmQuc3BlY2lhbAorICAgICAgICAgICAgICAg
IAorICAgICAgICAgICAgICAgICMgV2UgYWxyZWFkeSBrbm93IHRoYXQgdGhlIGZvcm0gbWF0Y2hl
cy4gV2UgZG9uJ3QgaGF2ZSB0byB2YWxpZGF0ZSB0aGUgcm9sZSwgc2luY2UKKyAgICAgICAgICAg
ICAgICAjIGtpbmQgaW1wbGllcyByb2xlLiBTbywgdGhlIG9ubHkgdGhpbmcgbGVmdCB0byB2YWxp
ZGF0ZSBpcyB0aGUgdHlwZS4gQW5kIHdlIG9ubHkgaGF2ZQorICAgICAgICAgICAgICAgICMgdG8g
dmFsaWRhdGUgdGhlIHR5cGUgaWYgd2UgaGF2ZSBhIFRtcC4KKyAgICAgICAgICAgICAgICBpZiBr
aW5kLm5hbWUgPT0gIlRtcCIKKyAgICAgICAgICAgICAgICAgICAgb3V0cC5wdXRzICJpZiAoIWFy
Z3NbI3tpbmRleH1dLnRtcCgpLmlzI3t0eXBlfVAoKSkiCisgICAgICAgICAgICAgICAgICAgIG91
dHAucHV0cyAiUkVUVVJOKGZhbHNlKTsiCisgICAgICAgICAgICAgICAgZW5kCisgICAgICAgICAg
ICB9CisgICAgICAgICAgICBpZiBuZWVkc01vcmVWYWxpZGF0aW9uCisgICAgICAgICAgICAgICAg
b3V0cC5wdXRzICJpZiAoIWlzI3tvcGNvZGUubmFtZX1WYWxpZCh0aGlzKSkiCisgICAgICAgICAg
ICAgICAgb3V0cC5wdXRzICJSRVRVUk4oZmFsc2UpOyIKKyAgICAgICAgICAgIGVuZAorICAgICAg
ICAgICAgb3V0cC5wdXRzICJSRVRVUk4odHJ1ZSk7IgorICAgICAgICBlbmQKKyAgICB9CisgICAg
b3V0cC5wdXRzICJyZXR1cm4gZmFsc2U7IgorICAgIG91dHAucHV0cyAifSIKKworICAgIG91dHAu
cHV0cyAiYm9vbCBJbnN0OjphZG1pdHNTdGFjayh1bnNpZ25lZCBhcmdJbmRleCkiCisgICAgb3V0
cC5wdXRzICJ7IgorICAgIG91dHAucHV0cyAic3dpdGNoIChvcGNvZGUpIHsiCisgICAgJG9wY29k
ZXMudmFsdWVzLmVhY2ggeworICAgICAgICB8IG9wY29kZSB8CisgICAgICAgIG91dHAucHV0cyAi
Y2FzZSAje29wY29kZS5uYW1lfToiCisKKyAgICAgICAgaWYgb3Bjb2RlLnNwZWNpYWwKKyAgICAg
ICAgICAgIG91dHAucHV0cyAiaWYgKCFhcmdJbmRleCkiCisgICAgICAgICAgICBvdXRwLnB1dHMg
InJldHVybiBmYWxzZTsiCisgICAgICAgICAgICBvdXRwLnB1dHMgIlJFVFVSTihhcmdzWzBdLnNw
ZWNpYWwoKS0+YWRtaXRzU3RhY2soKnRoaXMsIGFyZ0luc3QpKTsiCisgICAgICAgIGVsc2UKKyAg
ICAgICAgICAgICMgU3dpdGNoIG9uIHRoZSBhcmdJbmRleC4KKyAgICAgICAgICAgIG91dHAucHV0
cyAic3dpdGNoIChhcmdJbmRleCkgeyIKKworICAgICAgICAgICAgbnVtQXJncyA9IG9wY29kZS5v
dmVybG9hZHMubWFwIHsKKyAgICAgICAgICAgICAgICB8IG92ZXJsb2FkIHwKKyAgICAgICAgICAg
ICAgICBvdmVybG9hZC5zaWduYXR1cmUubGVuZ3RoCisgICAgICAgICAgICB9Lm1heAorICAgICAg
ICAgICAgCisgICAgICAgICAgICBudW1BcmdzLnRpbWVzIHsKKyAgICAgICAgICAgICAgICB8IGFy
Z0luZGV4IHwKKyAgICAgICAgICAgICAgICBvdXRwLnB1dHMgImNhc2UgI3thcmdJbmRleH06Igor
CisgICAgICAgICAgICAgICAgIyBDaGVjayBpZiBhbGwgb2YgdGhlIGZvcm1zIG9mIGFsbCBvZiB0
aGUgb3ZlcmxvYWRzIGVpdGhlciBkbywgb3IgZG9uJ3QsIGFkbWl0IGFuIGFkZHJlc3MKKyAgICAg
ICAgICAgICAgICAjIGF0IHRoaXMgaW5kZXguIFdlIGV4cGVjdCB0aGlzIHRvIGJlIGEgdmVyeSBj
b21tb24gY2FzZS4KKyAgICAgICAgICAgICAgICBudW1ZZXMgPSAwCisgICAgICAgICAgICAgICAg
bnVtTm8gPSAwCisgICAgICAgICAgICAgICAgb3Bjb2RlLm92ZXJsb2Fkcy5lYWNoIHsKKyAgICAg
ICAgICAgICAgICAgICAgfCBvdmVybG9hZCB8CisgICAgICAgICAgICAgICAgICAgIG92ZXJsb2Fk
LmZvcm1zLmVhY2ggeworICAgICAgICAgICAgICAgICAgICAgICAgfCBmb3JtIHwKKyAgICAgICAg
ICAgICAgICAgICAgICAgIGlmIGZvcm0ua2luZHNbYXJnSW5kZXhdID09ICJBZGRyIgorICAgICAg
ICAgICAgICAgICAgICAgICAgICAgIG51bVllcyArPSAxCisgICAgICAgICAgICAgICAgICAgICAg
ICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtTm8gKz0gMQorICAgICAgICAg
ICAgICAgICAgICAgICAgZW5kCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAg
ICB9CisKKyAgICAgICAgICAgICAgICAjIE5vdGUgdGhhdCB3ZSBkZWxpYmVyYXRlbHkgdGVzdCBu
dW1ZZXMgZmlyc3QgYmVjYXVzZSBpZiB3ZSBlbmQgdXAgd2l0aCBubyBmb3Jtcywgd2Ugd2FudAor
ICAgICAgICAgICAgICAgICMgdG8gc2F5IHRoYXQgQWRkcmVzcyBpcyBpbmFkbWlzc2libGUuCisg
ICAgICAgICAgICAgICAgaWYgbnVtWWVzID09IDAKKyAgICAgICAgICAgICAgICAgICAgb3V0cC5w
dXRzICJSRVRVUk4oZmFsc2UpOyIKKyAgICAgICAgICAgICAgICBlbHNpZiBudW1ObyA9PSAwCisg
ICAgICAgICAgICAgICAgICAgIG91dHAucHV0cyAiUkVUVVJOKHRydWUpOyIKKyAgICAgICAgICAg
ICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICMgTm93IGRvIHRoZSBmdWxsIHRlc3QuCisK
KyAgICAgICAgICAgICAgICAgICAgbmVlZE92ZXJsb2FkU3dpdGNoID0gKG9wY29kZS5vdmVybG9h
ZHMuc2l6ZSAhPSAxKQorCisgICAgICAgICAgICAgICAgICAgIG91dHAucHV0cyAic3dpdGNoIChh
cmdzLnNpemUoKSkgeyIgaWYgbmVlZE92ZXJsb2FkU3dpdGNoCisgICAgICAgICAgICAgICAgICAg
IG9wY29kZS5vdmVybG9hZHMuZWFjaCB7CisgICAgICAgICAgICAgICAgICAgICAgICB8IG92ZXJs
b2FkIHwKKworICAgICAgICAgICAgICAgICAgICAgICAgIyBBZ2FpbiwgY2hlY2sgaWYgYWxsIG9m
IHRoZW0gZG8gd2hhdCB3ZSB3YW50LgorICAgICAgICAgICAgICAgICAgICAgICAgbnVtWWVzID0g
MAorICAgICAgICAgICAgICAgICAgICAgICAgbnVtTm8gPSAwCisgICAgICAgICAgICAgICAgICAg
ICAgICBvdmVybG9hZC5mb3Jtcy5lYWNoIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB8
IGZvcm0gfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIGZvcm0ua2luZHNbYXJnSW5k
ZXhdID09ICJBZGRyIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudW1ZZXMgKz0g
MQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgbnVtTm8gKz0gMQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuZAor
ICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICBpZiBu
dW1ZZXMgPT0gMAorICAgICAgICAgICAgICAgICAgICAgICAgIyBEb24ndCBlbWl0IGFueXRoaW5n
LCBqdXN0IGRyb3AgdG8gZGVmYXVsdC4KKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2lmIG51
bU5vID09IDAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwLnB1dHMgImNhc2UgI3tv
dmVybG9hZC5zaWduYXR1cmUubGVuZ3RofToiIGlmIG5lZWRPdmVybG9hZFN3aXRjaAorICAgICAg
ICAgICAgICAgICAgICAgICAgICAgIG91dHAucHV0cyAiUkVUVVJOKHRydWUpOyIKKyAgICAgICAg
ICAgICAgICAgICAgICAgICAgICBvdXRwLnB1dHMgImJyZWFrOyIgaWYgbmVlZE92ZXJsb2FkU3dp
dGNoCisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgb3V0cC5wdXRzICJjYXNlICN7b3ZlcmxvYWQuc2lnbmF0dXJlLmxlbmd0aH06IiBpZiBu
ZWVkT3ZlcmxvYWRTd2l0Y2gKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgVGhpcyBp
cyBob3cgd2UgdGVzdCB0aGUgaHlwb3RoZXNpcyB0aGF0IGNoYW5naW5nIHRoaXMgYXJndW1lbnQg
dG8gYW4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIGFkZHJlc3MgeWllbGRzIGEgdmFs
aWQgZm9ybS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2x1bW5HZXR0ZXIgPSBwcm9j
IHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBjb2x1bW5JbmRleCB8CisgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIGNvbHVtbkluZGV4ID09IGFyZ0luZGV4Cisg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQXJnOjpBZGRyIgorICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAiYXJnc1sje2NvbHVtbkluZGV4fV0ua2luZCgpIgorICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICBlbmQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgZmlsdGVyID0gcHJvYyB7CisgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgIHwgZm9ybXMgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBu
dW1ZZXMgPSAwCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybXMuZWFjaCB7
CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGZvcm0gfAorICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgZm9ybS5raW5kc1thcmdJbmRleF0gPT0gIkFk
ZHIiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtWWVzICs9IDEK
KyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuZAorICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYg
bnVtWWVzID09IDAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgRHJvcCBk
b3duLCBlbWl0IG5vIGNvZGUsIHNpbmNlIHdlIGNhbm5vdCBtYXRjaC4KKyAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgIHRydWUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBLZWVwIGdvaW5n
LgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UKKyAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgZW5kCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQor
ICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrID0gcHJvYyB7CisgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgIG91dHAucHV0cyAiUkVUVVJOKHRydWUpOyIKKyAgICAgICAg
ICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF0Y2hG
b3JtcyhvdXRwLCA6c2FmZSwgb3ZlcmxvYWQuZm9ybXMsIDAsIGNvbHVtbkdldHRlciwgZmlsdGVy
LCBjYWxsYmFjaykKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHAucHV0cyAiYnJl
YWs7IiBpZiBuZWVkT3ZlcmxvYWRTd2l0Y2gKKyAgICAgICAgICAgICAgICAgICAgICAgIGVuZAor
ICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmIG5lZWRPdmVybG9h
ZFN3aXRjaAorICAgICAgICAgICAgICAgICAgICAgICAgb3V0cC5wdXRzICJkZWZhdWx0OiIKKyAg
ICAgICAgICAgICAgICAgICAgICAgIG91dHAucHV0cyAiYnJlYWs7IgorICAgICAgICAgICAgICAg
ICAgICAgICAgb3V0cC5wdXRzICJ9IgorICAgICAgICAgICAgICAgICAgICBlbmQKKyAgICAgICAg
ICAgICAgICBlbmQKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBvdXRwLnB1dHMg
ImJyZWFrOyIKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIAorICAgICAgICAgICAgb3V0cC5w
dXRzICJkZWZhdWx0OiIKKyAgICAgICAgICAgIG91dHAucHV0cyAiYnJlYWs7IgorICAgICAgICAg
ICAgb3V0cC5wdXRzICJ9IgorICAgICAgICBlbmQKKyAgICAgICAgCisgICAgICAgIG91dHAucHV0
cyAiYnJlYWs7IgorICAgIH0KKyAgICBvdXRwLnB1dHMgImRlZmF1bHQ6IjsKKyAgICBvdXRwLnB1
dHMgImJyZWFrOyIKKyAgICBvdXRwLnB1dHMgIn0iCisgICAgb3V0cC5wdXRzICJyZXR1cm4gZmFs
c2U7IgorICAgIG91dHAucHV0cyAifSIKKworICAgIG91dHAucHV0cyAiQ0NhbGxIZWxwZXJzOjpK
dW1wIEluc3Q6OmdlbmVyYXRlKENDYWxsSGVscGVycyYgaml0KSBjb25zdCIKKyAgICBvdXRwLnB1
dHMgInsiCisgICAgb3V0cC5wdXRzICJDQ2FsbEhlbHBlcnM6Okp1bXAgcmVzdWx0OyIKKyAgICBt
YXRjaEluc3RPdmVybG9hZEZvcm0ob3V0cCwgOmZhc3QsICJ0aGlzIikgeworICAgICAgICB8IG9w
Y29kZSwgb3ZlcmxvYWQsIGZvcm0gfAorICAgICAgICBpZiBvcGNvZGUuc3BlY2lhbAorICAgICAg
ICAgICAgb3V0cC5wdXRzICJSRVRVUk4oYXJnc1swXS5zcGVjaWFsKCktPmdlbmVyYXRlKCp0aGlz
LCBqaXQpKTsiCisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGlmIGZvcm0uYWx0TmFtZQorICAg
ICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSBmb3JtLmFsdE5hbWUKKyAgICAgICAgICAgIGVsc2UK
KyAgICAgICAgICAgICAgICBtZXRob2ROYW1lID0gb3Bjb2RlLm1hc21OYW1lCisgICAgICAgICAg
ICBlbmQKKyAgICAgICAgICAgIG91dHAucHJpbnQgImppdC4je21ldGhvZE5hbWV9KCIKKworICAg
ICAgICAgICAgZm9ybS5raW5kcy5lYWNoX3dpdGhfaW5kZXggeworICAgICAgICAgICAgICAgIHwg
a2luZCwgaW5kZXggfAorICAgICAgICAgICAgICAgIGlmIGluZGV4ICE9IDAKKyAgICAgICAgICAg
ICAgICAgICAgb3V0cC5wcmludCAiLCAiCisgICAgICAgICAgICAgICAgZW5kCisgICAgICAgICAg
ICAgICAgY2FzZSBraW5kLm5hbWUKKyAgICAgICAgICAgICAgICB3aGVuICJUbXAiCisgICAgICAg
ICAgICAgICAgICAgIGlmIG92ZXJsb2FkLnNpZ25hdHVyZVtpbmRleF0udHlwZSA9PSAiRyIKKyAg
ICAgICAgICAgICAgICAgICAgICAgIG91dHAucHJpbnQgImFyZ3NbI3tpbmRleH1dLmdwcigpIgor
ICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICBvdXRwLnBy
aW50ICJhcmdzWyN7aW5kZXh9XS5mcHIoKSIKKyAgICAgICAgICAgICAgICAgICAgZW5kCisgICAg
ICAgICAgICAgICAgd2hlbiAiSW1tIgorICAgICAgICAgICAgICAgICAgICBvdXRwLnByaW50ICJh
cmdzWyN7aW5kZXh9XS5hc1RydXN0ZWRJbW0zMigpIgorICAgICAgICAgICAgICAgIHdoZW4gIklt
bVB0ciIKKyAgICAgICAgICAgICAgICAgICAgb3V0cC5wcmludCAiYXJnc1sje2luZGV4fV0uYXNU
cnVzdGVkSW1tUHRyKCkiCisgICAgICAgICAgICAgICAgd2hlbiAiQWRkciIKKyAgICAgICAgICAg
ICAgICAgICAgb3V0cC5wcmludCAiYXJnc1sje2luZGV4fV0uYXNBZGRyZXNzKCkiCisgICAgICAg
ICAgICAgICAgd2hlbiAiSW5kZXgiCisgICAgICAgICAgICAgICAgICAgIG91dHAucHJpbnQgImFy
Z3NbI3tpbmRleH1dLmFzQmFzZUluZGV4KCkiCisgICAgICAgICAgICAgICAgZW5kCisgICAgICAg
ICAgICB9CisKKyAgICAgICAgICAgIG91dHAucHV0cyAiKTsiCisgICAgICAgICAgICBvdXRwLnB1
dHMgIlJFVFVSTihyZXN1bHQpOyIKKyAgICAgICAgZW5kCisgICAgfQorICAgIG91dHAucHV0cyAi
UkVMRUFTRV9BU1NFUlRfTk9UX1JFQUNIRUQoKTsiCisgICAgb3V0cC5wdXRzICJyZXR1cm4gcmVz
dWx0OyIKKyAgICBvdXRwLnB1dHMgIn0iCisKKyAgICBvdXRwLnB1dHMgIn0gfSB9IC8vIG5hbWVz
cGFjZSBKU0M6OkIzOjpBaXIiCit9CisKSW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9qaXQv
UmVnLmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRDb3JlL2ppdC9SZWcuaAkocmV2
aXNpb24gMTkxMjM5KQorKysgU291cmNlL0phdmFTY3JpcHRDb3JlL2ppdC9SZWcuaAkod29ya2lu
ZyBjb3B5KQpAQCAtMTA1LDcgKzEwNSw2IEBAIHB1YmxpYzoKICAgICB1bnNpZ25lZCBpbmRleCgp
IGNvbnN0IHsgcmV0dXJuIG1faW5kZXg7IH0KICAgICAKICAgICBib29sIGlzU2V0KCkgY29uc3Qg
eyByZXR1cm4gbV9pbmRleCAhPSBpbnZhbGlkKCk7IH0KLSAgICBib29sIG9wZXJhdG9yISgpIGNv
bnN0IHsgcmV0dXJuICFpc1NldCgpOyB9CiAgICAgZXhwbGljaXQgb3BlcmF0b3IgYm9vbCgpIGNv
bnN0IHsgcmV0dXJuIGlzU2V0KCk7IH0KIAogICAgIGJvb2wgaXNIYXNoVGFibGVEZWxldGVkVmFs
dWUoKSBjb25zdCB7IHJldHVybiBtX2luZGV4ID09IGRlbGV0ZWQoKTsgfQpAQCAtMTcwLDYgKzE2
OSw0NiBAQCBwdWJsaWM6CiAgICAgCiAgICAgdm9pZCBkdW1wKFByaW50U3RyZWFtJikgY29uc3Q7
CiAKKyAgICBjbGFzcyBBbGxSZWdzSXRlcmFibGUgeworICAgIHB1YmxpYzoKKworICAgICAgICBj
bGFzcyBpdGVyYXRvciB7CisgICAgICAgIHB1YmxpYzoKKyAgICAgICAgICAgIGl0ZXJhdG9yKCkg
eyB9CisKKyAgICAgICAgICAgIGV4cGxpY2l0IGl0ZXJhdG9yKFJlZyByZWcpCisgICAgICAgICAg
ICAgICAgOiBtX3JlZyhyZWcpCisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisKKyAgICAg
ICAgICAgIFJlZyBvcGVyYXRvciooKSBjb25zdCB7IHJldHVybiBtX3JlZzsgfQorCisgICAgICAg
ICAgICBpdGVyYXRvciYgb3BlcmF0b3IrKygpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAg
ICAgbV9yZWcgPSBtX3JlZy5uZXh0KCk7CisgICAgICAgICAgICAgICAgcmV0dXJuICp0aGlzOwor
ICAgICAgICAgICAgfQorCisgICAgICAgICAgICBib29sIG9wZXJhdG9yPT0oY29uc3QgaXRlcmF0
b3ImIG90aGVyKSBjb25zdAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBt
X3JlZyA9PSBvdGhlci5tX3JlZzsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgYm9vbCBv
cGVyYXRvciE9KGNvbnN0IGl0ZXJhdG9yJiBvdGhlcikgY29uc3QKKyAgICAgICAgICAgIHsKKyAg
ICAgICAgICAgICAgICByZXR1cm4gISgqdGhpcyA9PSBvdGhlcik7CisgICAgICAgICAgICB9CisK
KyAgICAgICAgcHJpdmF0ZToKKyAgICAgICAgICAgIFJlZyBtX3JlZzsKKyAgICAgICAgfTsKKwor
ICAgICAgICBpdGVyYXRvciBiZWdpbigpIGNvbnN0IHsgcmV0dXJuIGl0ZXJhdG9yKFJlZzo6Zmly
c3QoKSk7IH0KKyAgICAgICAgaXRlcmF0b3IgZW5kKCkgY29uc3QgeyByZXR1cm4gaXRlcmF0b3Io
UmVnKCkpOyB9CisgICAgfTsKKworICAgIHN0YXRpYyBBbGxSZWdzSXRlcmFibGUgYWxsKCkgY29u
c3QgeyByZXR1cm4gQWxsUmVnc0l0ZXJhYmxlKCk7IH0KKwogcHJpdmF0ZToKICAgICBzdGF0aWMg
dWludDhfdCBpbnZhbGlkKCkgeyByZXR1cm4gMHhmZjsgfQogCkluZGV4OiBTb3VyY2UvSmF2YVNj
cmlwdENvcmUvaml0L1JlZ2lzdGVyU2V0LmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL0phdmFTY3Jp
cHRDb3JlL2ppdC9SZWdpc3RlclNldC5oCShyZXZpc2lvbiAxOTEyMzkpCisrKyBTb3VyY2UvSmF2
YVNjcmlwdENvcmUvaml0L1JlZ2lzdGVyU2V0LmgJKHdvcmtpbmcgY29weSkKQEAgLTExNyw2ICsx
MTcsMTMgQEAgcHVibGljOgogICAgIAogICAgIGJvb2wgb3BlcmF0b3I9PShjb25zdCBSZWdpc3Rl
clNldCYgb3RoZXIpIGNvbnN0IHsgcmV0dXJuIG1fdmVjdG9yID09IG90aGVyLm1fdmVjdG9yOyB9
CiAgICAgdW5zaWduZWQgaGFzaCgpIGNvbnN0IHsgcmV0dXJuIG1fdmVjdG9yLmhhc2goKTsgfQor
CisgICAgdGVtcGxhdGU8dHlwZW5hbWUgRnVuY3Rvcj4KKyAgICB2b2lkIGZvckVhY2goY29uc3Qg
RnVuY3RvciYgZnVuY3RvcikKKyAgICB7CisgICAgICAgIGZvciAoc2l6ZV90IGluZGV4IDogbV92
ZWN0b3Iuc2V0Qml0cygpKQorICAgICAgICAgICAgZnVuY3RvcihSZWc6OmZyb21JbmRleChpbmRl
eCkpOworICAgIH0KICAgICAKIHByaXZhdGU6CiAgICAgdm9pZCBzZXRBbnkoUmVnIHJlZykgeyBz
ZXQocmVnKTsgfQpJbmRleDogU291cmNlL1dURi93dGYvQml0VmVjdG9yLmgKPT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQot
LS0gU291cmNlL1dURi93dGYvQml0VmVjdG9yLmgJKHJldmlzaW9uIDE5MTIzOSkKKysrIFNvdXJj
ZS9XVEYvd3RmL0JpdFZlY3Rvci5oCSh3b3JraW5nIGNvcHkpCkBAIC0zMjAsNyArMzIwLDcgQEAg
cHVibGljOiAKICAgICB9OwogICAgIAogICAgIFNldEJpdHNJdGVyYWJsZSBzZXRCaXRzKCkgY29u
c3QgeyByZXR1cm4gU2V0Qml0c0l0ZXJhYmxlKCp0aGlzKTsgfQotICAgIAorCiBwcml2YXRlOgog
ICAgIHN0YXRpYyB1bnNpZ25lZCBiaXRzSW5Qb2ludGVyKCkKICAgICB7CkluZGV4OiBTb3VyY2Uv
V1RGL3d0Zi9TY29wZWRMYW1iZGEuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV1RGL3d0Zi9TY29w
ZWRMYW1iZGEuaAkocmV2aXNpb24gMCkKKysrIFNvdXJjZS9XVEYvd3RmL1Njb3BlZExhbWJkYS5o
CSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsMTAyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAy
MDE1IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlv
biBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAq
IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcg
Y29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2Ug
Y29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMg
bGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBS
ZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNv
cHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZv
bGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3Ro
ZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElT
IFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAq
IEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRF
RCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBG
SVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBO
TyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZP
UiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFS
WSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBU
TywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1Mg
T0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBI
T1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVS
IElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5F
R0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UK
KyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkg
T0YgU1VDSCBEQU1BR0UuIAorICovCisKKyNpZm5kZWYgU2NvcGVkTGFtYmRhX2gKKyNkZWZpbmUg
U2NvcGVkTGFtYmRhX2gKKworbmFtZXNwYWNlIFdURiB7CisKKy8vIFlvdSBjYW4gdXNlIFNjb3Bl
ZExhbWJkYSB0byBlZmZpY2llbnRseSBwYXNzIGxhbWJkYXMgd2l0aG91dCBhbGxvY2F0aW5nIG1l
bW9yeSBvciByZXF1aXJpbmcKKy8vIHRlbXBsYXRlIHNwZWNpYWxpemF0aW9uIG9mIHRoZSBjYWxs
ZWUuIFRoZSBjYWxsZWUgc2hvdWxkIGJlIGRlY2xhcmVkIGFzOgorLy8KKy8vIHZvaWQgZm9vKGNv
bnN0IFNjb3BlZExhbWJkYTxNeVRoaW5ncyogKGludCwgU3R1ZmYmKT4mKTsKKy8vCisvLyBUaGUg
Y2FsbGVyIGp1c3QgZG9lczoKKy8vCisvLyB2b2lkIGZvbyhzY29wZWRMYW1iZGE8TXlUaGluZ3Mq
IChpbnQsIFN0dWZmJik+KFsmXSAoaW50IHgsIFN0dWZmJiB5KSAtPiBNeVRoaW5ncyogeyBibGFo
IH0pKTsKKy8vCisvLyBOb3RlIHRoYXQgdGhpcyByZWxpZXMgb24gZm9vKCkgbm90IGVzY2FwaW5n
IHRoZSBsYW1iZGEuIFRoZSBsYW1iZGEgaXMgb25seSB2YWxpZCB3aGlsZSBmb28oKSBpcworLy8g
b24gdGhlIHN0YWNrIC0gaGVuY2UgdGhlIG5hbWUgU2NvcGVkTGFtYmRhLgorCit0ZW1wbGF0ZTx0
eXBlbmFtZSBGdW5jdGlvblR5cGU+IGNsYXNzIFNjb3BlZExhbWJkYTsKK3RlbXBsYXRlPHR5cGVu
YW1lIFJlc3VsdFR5cGUsIHR5cGVuYW1lLi4uIEFyZ3VtZW50VHlwZXM+CitjbGFzcyBTY29wZWRM
YW1iZGE8UmVzdWx0VHlwZSAoQXJndW1lbnRUeXBlcy4uLik+IHsKK3B1YmxpYzoKKyAgICBTY29w
ZWRMYW1iZGEoUmVzdWx0VHlwZSAoKmltcGwpKHZvaWQqIGFyZywgQXJndW1lbnRUeXBlcyYmLi4u
KSA9IG51bGxwdHIsIHZvaWQqIGFyZyA9IG51bGxwdHIpCisgICAgICAgIDogbV9pbXBsKGltcGwp
CisgICAgICAgICwgbV9hcmcoYXJnKQorICAgIHsKKyAgICB9CisgICAgCisgICAgflNjb3BlZExh
bWJkYSgpCisgICAgeworICAgIH0KKworICAgIFJlc3VsdFR5cGUgb3BlcmF0b3IoKShBcmd1bWVu
dFR5cGVzJiYuLi4gYXJndW1lbnRzKQorICAgIHsKKyAgICAgICAgcmV0dXJuIG1faW1wbChtX2Fy
Zywgc3RkOjpmb3J3YXJkPEFyZ3VtZW50VHlwZXM+KGFyZ3VtZW50cykuLi4pOworICAgIH0KKwor
cHJpdmF0ZToKKyAgICBSZXN1bHRUeXBlICgqaW1wbCkodm9pZCogYXJnLCBBcmd1bWVudFR5cGVz
JiYuLi4pIG1faW1wbDsKKyAgICB2b2lkICptX2FyZzsKK307CisKK3RlbXBsYXRlPHR5cGVuYW1l
IEZ1bmN0aW9uVHlwZSwgdHlwZW5hbWUgRnVuY3Rvcj4gU2NvcGVkTGFtYmRhRnVuY3RvcjsKK3Rl
bXBsYXRlPHR5cGVuYW1lIFJlc3VsdFR5cGUsIHR5cGVuYW1lLi4uIEFyZ3VtZW50VHlwZXMsIHR5
cGVuYW1lIEZ1bmN0b3I+CitjbGFzcyBTY29wZWRMYW1iZGFGdW5jdG9yPFJlc3VsdFR5cGUgKEFy
Z3VtZW50VHlwZXMuLi4pLCBGdW5jdG9yPiA6IHB1YmxpYyBTY29wZWRMYW1iZGE8UmVzdWx0VHlw
ZSAoQXJndW1lbnRUeXBlcy4uLik+IHsKK3B1YmxpYzoKKyAgICBTY29wZWRMYW1iZGFGdW5jdG9y
KGNvbnN0IEZ1bmN0b3ImIGZ1bmN0b3IpCisgICAgICAgIDogU2NvcGVkTGFtYmRhKGltcGxGdW5j
dGlvbiwgdGhpcykKKyAgICAgICAgLCBtX2Z1bmN0b3IoZnVuY3RvcikKKyAgICB7CisgICAgfQor
CisgICAgU2NvcGVkTGFtYmRhRnVuY3RvcihGdW5jdG9yJiYgZnVuY3RvcikKKyAgICAgICAgOiBT
Y29wZWRMYW1iZGEoaW1wbEZ1bmN0aW9uLCB0aGlzKQorICAgICAgICAsIG1fZnVuY3RvcihXVEY6
Om1vdmUoZnVuY3RvcikpCisgICAgeworICAgIH0KKworcHJpdmF0ZToKKyAgICBzdGF0aWMgUmVz
dWx0VHlwZSBpbXBsRnVuY3Rpb24odm9pZCogYXJndW1lbnQsIEFyZ3VtZW50VHlwZXMmJi4uLiBh
cmd1bWVudHMpCisgICAgeworICAgICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8U2NvcGVkTGFtYmRh
RnVuY3Rvcio+KGFyZ3VtZW50KS0+bV9mdW5jdG9yKAorICAgICAgICAgICAgc3RkOjpmb3J3YXJk
PEFyZ3VtZW50VHlwZXM+KGFyZ3VtZW50cykuLi4pOworICAgIH0KKworICAgIEZ1bmN0b3IgbV9m
dW5jdG9yOworfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgRnVuY3Rpb25UeXBlLCB0eXBlbmFtZSBG
dW5jdG9yPgorU2NvcGVkTGFtYmRhRnVuY3RvcjxGdW5jdGlvblR5cGUsIEZ1bmN0b3I+IHNjb3Bl
ZExhbWJkYShjb25zdCBGdW5jdG9yJiBmdW5jdG9yKQoreworICAgIHJldHVybiBTY29wZWRMYW1i
ZGFGdW5jdG9yPEZ1bmN0aW9uVHlwZSwgRnVuY3Rvcj4oZnVuY3Rvcik7Cit9CisKK30gLy8gbmFt
ZXNwYWNlIFdURgorCisjZW5kaWYgLy8gU2NvcGVkTGFtYmRhX2gKKwpJbmRleDogU291cmNlL1dU
Ri93dGYvU2hhcmVkVGFzay5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9XVEYvd3RmL1NoYXJlZFRh
c2suaAkocmV2aXNpb24gMTkxMjM5KQorKysgU291cmNlL1dURi93dGYvU2hhcmVkVGFzay5oCSh3
b3JraW5nIGNvcHkpCkBAIC03OSw2ICs3OSwxMSBAQCBwdWJsaWM6CiAgICAgewogICAgIH0KIAor
ICAgIFNoYXJlZFRhc2tGdW5jdG9yKEZ1bmN0b3ImJiBmdW5jdG9yKQorICAgICAgICA6IG1fZnVu
Y3RvcihXVEY6Om1vdmUoZnVuY3RvcikpCisgICAgeworICAgIH0KKwogcHJpdmF0ZToKICAgICBS
ZXN1bHRUeXBlIHJ1bihBcmd1bWVudFR5cGVzJiYuLi4gYXJndW1lbnRzKSBvdmVycmlkZQogICAg
IHsKQEAgLTExMCw2ICsxMTUsMTEgQEAgUmVmPFNoYXJlZFRhc2s8RnVuY3Rpb25UeXBlPj4gY3Jl
YXRlU2hhcgogewogICAgIHJldHVybiBhZG9wdFJlZigqbmV3IFNoYXJlZFRhc2tGdW5jdG9yPEZ1
bmN0aW9uVHlwZSwgRnVuY3Rvcj4oZnVuY3RvcikpOwogfQordGVtcGxhdGU8dHlwZW5hbWUgRnVu
Y3Rpb25UeXBlLCB0eXBlbmFtZSBGdW5jdG9yPgorUmVmPFNoYXJlZFRhc2s8RnVuY3Rpb25UeXBl
Pj4gY3JlYXRlU2hhcmVkVGFzayhGdW5jdG9yJiYgZnVuY3RvcikKK3sKKyAgICByZXR1cm4gYWRv
cHRSZWYoKm5ldyBTaGFyZWRUYXNrRnVuY3RvcjxGdW5jdGlvblR5cGUsIEZ1bmN0b3I+KFdURjo6
bW92ZShmdW5jdG9yKSkpOworfQogCiB9IC8vIG5hbWVzcGFjZSBXVEYKIAo=
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>263633</attachid>
            <date>2015-10-20 16:40:31 -0700</date>
            <delta_ts>2015-10-20 22:58:46 -0700</delta_ts>
            <desc>latest</desc>
            <filename>blah.patch</filename>
            <type>text/plain</type>
            <size>262524</size>
            <attacher name="Filip Pizlo">fpizlo</attacher>
            
              <data encoding="base64">SW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM0FkZHJlc3NNYXRjaGVyLnBhdHRlcm5z
Cj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM0FkZHJlc3NNYXRjaGVy
LnBhdHRlcm5zCShyZXZpc2lvbiAwKQorKysgU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzQWRk
cmVzc01hdGNoZXIucGF0dGVybnMJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSw0MSBAQAorIyBD
b3B5cmlnaHQgKEMpIDIwMTUgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorIworIyBS
ZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9y
IHdpdGhvdXQKKyMgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhl
IGZvbGxvd2luZyBjb25kaXRpb25zCisjIGFyZSBtZXQ6CisjIDEuIFJlZGlzdHJpYnV0aW9ucyBv
ZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisjICAgIG5vdGlj
ZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4K
KyMgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBh
Ym92ZSBjb3B5cmlnaHQKKyMgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQg
dGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorIyAgICBkb2N1bWVudGF0aW9uIGFuZC9v
ciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorIworIyBU
SElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gQU5EIElUUyBDT05UUklCVVRP
UlMgYGBBUyBJUycnCisjIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElO
Q0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorIyBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9G
IE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisjIFBVUlBPU0Ug
QVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IgSVRTIENPTlRS
SUJVVE9SUworIyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFM
LCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCisjIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVE
SU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCisjIFNVQlNUSVRVVEUgR09P
RFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVT
UworIyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJ
QUJJTElUWSwgV0hFVEhFUiBJTgorIyBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9S
VCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorIyBBUklTSU5HIElOIEFOWSBX
QVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GCisj
IFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworbWF0Y2hlciBBZGRyZXNzTWF0Y2hl
cgorCisjIE5vdGUgdGhhdCB0aGlzIHJlbGllcyBvbiBCMyBkb2luZyBhZ2dyZXNzaXZlIHJlYXNz
b2NpYXRpb24gYW5kIGNhbm9uY2FsaXphdGlvbiBvZiBpbnRlZ2VyIGFkZHMuCisjIFdlJ2xsIG5l
dmVyIHNlZSBBZGQoQWRkKHgsIGNvbnN0MSksIGNvbnN0MikgYmVjYXVzZSBpdCB3b3VsZCBoYXZl
IGFscmVhZHkgYmVlbiByZWFzc29jaWF0ZWQgaW50bworIyBBZGQoeCwgY29uc3QxICsgY29uc3Qy
KS4gQWxzbywgd2Ugd2lsbCBuZXZlciBzZWUgQWRkKGNvbnN0LCB4KSwgYmVjYXVzZSB3ZSB3b3Vs
ZCBoYXZlIGNhbm9uaWNhbGl6ZWQKKyMgaXQgdG8gQWRkKHgsIGNvbnN0KS4gVGhhdCBzYWlkLCBp
biB0aGlzIGNvZGUgd2UgbmV2ZXIgbWFrZSBhc3NlcnRpb25zIGFib3V0IHRoZXNlIG9wdGltaXph
dGlvbnMKKyMgaGF2aW5nIGJlZW4gcGVyZm9ybWVkLiBBbHNvLCBzaW5jZSB0aGUgTG9hZC9TdG9y
ZSBpbnN0cnVjdGlvbnMgaW4gQjMgaGF2ZSBhIGJ1aWx0LWluIG9mZnNldCwgd2UKKyMgZG9uJ3Qg
bmVlZCB0byBtYXRjaCBBZGQoeCwgY29uc3QpLiBUaGF0IHdvdWxkIGhhdmUgYmVlbiBmb2xkZWQg
aW50byB0aGUgTG9hZC9TdG9yZSBpbnN0cnVjdGlvbnMKKyMgYWxyZWFkeS4gU28sIHRoZSBvbmx5
IGZhbmN5IG1hdGhpbmcgdGhpcyBjYW4gZG8gaXMganVzdCBCYXNlSW5kZXggZm9ybXMuCisKK0Fk
ZFNoaWZ0MSA9IEFkZChTaGwoaW5kZXgsICRsb2dTY2FsZSksIGJhc2UpCitBZGRTaGlmdDIgPSBB
ZGQoYmFzZSwgU2hsKGluZGV4LCAkbG9nU2NhbGUpKQorCitBZGQgPSBBZGQobGVmdCwgcmlnaHQp
CisKKyRDb25zdAorCitEaXJlY3QKSW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM0Fy
Z3VtZW50UmVnVmFsdWUuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9i
My9CM0FyZ3VtZW50UmVnVmFsdWUuY3BwCShyZXZpc2lvbiAwKQorKysgU291cmNlL0phdmFTY3Jp
cHRDb3JlL2IzL0IzQXJndW1lbnRSZWdWYWx1ZS5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTAsMCAr
MSw0MSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNSBBcHBsZSBJbmMuIEFsbCByaWdodHMg
cmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJp
bmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0
ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6Cisg
KiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3Zl
IGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhl
IGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBm
b3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhp
cyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUK
KyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRo
IHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBB
UFBMRSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFO
VElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJS
QU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisg
KiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBP
UgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElO
Q0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdF
UyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJT
VElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJ
VFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBU
SEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJ
TElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJ
U0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVO
IElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLiAKKyAqLworCisj
aW5jbHVkZSAiY29uZmlnLmgiCisjaW5jbHVkZSAiQjNBcmd1bWVudFJlZ1ZhbHVlLmgiCisKK25h
bWVzcGFjZSBKU0MgeyBuYW1lc3BhY2UgQjMgeworCitBcmd1bWVudFJlZ1ZhbHVlOjp+QXJndW1l
bnRSZWdWYWx1ZSgpCit7Cit9CisKK3ZvaWQgQXJndW1lbnRSZWdWYWx1ZTo6ZHVtcE1ldGEoUHJp
bnRTdHJlYW0mIG91dCkgY29uc3QKK3sKKyAgICBvdXQucHJpbnQobV9yZWcpOworfQorCit9IH0g
Ly8gbmFtZXNwYWNlIEpTQzo6QjMKKwpJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0Iz
QXJndW1lbnRSZWdWYWx1ZS5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9i
My9CM0FyZ3VtZW50UmVnVmFsdWUuaAkocmV2aXNpb24gMCkKKysrIFNvdXJjZS9KYXZhU2NyaXB0
Q29yZS9iMy9CM0FyZ3VtZW50UmVnVmFsdWUuaAkod29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDYw
IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE1IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNl
cnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5
IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBw
cm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEu
IFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29w
eXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9s
bG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0g
bXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxp
c3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICog
ICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhl
IGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExF
IElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVT
LCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJ
RVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBV
UlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SCisg
KiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURF
TlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJ
TkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRV
VEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsg
T1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9S
WQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZ
LCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5H
IElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYg
QURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisKKyNpZm5k
ZWYgQjNBcmd1bWVudFJlZ1ZhbHVlX2gKKyNkZWZpbmUgQjNBcmd1bWVudFJlZ1ZhbHVlX2gKKwor
I2luY2x1ZGUgIkIzVmFsdWUuaCIKKyNpbmNsdWRlICJSZWcuaCIKKworbmFtZXNwYWNlIEpTQyB7
IG5hbWVzcGFjZSBCMyB7CisKK2NsYXNzIEFyZ3VtZW50UmVnVmFsdWUgOiBwdWJsaWMgVmFsdWUg
eworcHVibGljOgorICAgIHN0YXRpYyBib29sIGFjY2VwdHMoT3Bjb2RlIG9wY29kZSkgeyByZXR1
cm4gb3Bjb2RlID09IEFyZ3VtZW50UmVnOyB9CisgICAgCisgICAgfkFyZ3VtZW50UmVnVmFsdWUo
KTsKKworICAgIFJlZyBhcmd1bWVudFJlZygpIGNvbnN0IHsgcmV0dXJuIG1fcmVnOyB9CisKK3By
b3RlY3RlZDoKKyAgICB2b2lkIGR1bXBNZXRhKFByaW50U3RyZWFtJikgY29uc3Qgb3ZlcnJpZGU7
CisKK3ByaXZhdGU6CisgICAgZnJpZW5kIGNsYXNzIFByb2NlZHVyZTsKKworICAgIEFyZ3VtZW50
UmVnVmFsdWUodW5zaWduZWQgaW5kZXgsIE9yaWdpbiBvcmlnaW4sIFJlZyByZWcpCisgICAgICAg
IDogVmFsdWUoaW5kZXgsIEFyZ3VtZW50UmVnLCByZWcuaXNHUFIoKSA/IHBvaW50ZXIoKSA6IERv
dWJsZSwgb3JpZ2luKQorICAgICAgICAsIG1fcmVnKHJlZykKKyAgICB7CisgICAgfQorCisgICAg
UmVnIG1fcmVnOworfTsKKworfSB9IC8vIG5hbWVzcGFjZSBKU0M6OkIzCisKKyNlbmRpZiAvLyBC
M0FyZ3VtZW50UmVnVmFsdWVfaAorCkluZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNC
YXNpY0Jsb2NrLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNC
YXNpY0Jsb2NrLmNwcAkocmV2aXNpb24gMCkKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9C
M0Jhc2ljQmxvY2suY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsNTggQEAKKy8qCisgKiBD
b3B5cmlnaHQgKEMpIDIwMTUgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAq
IFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGgg
b3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQg
dGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRp
b25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAg
IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xh
aW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVj
ZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRp
b25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0
aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9u
LgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFTIElT
JycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywg
QlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFO
VEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElT
Q0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IKKyAqIENPTlRSSUJVVE9S
UyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFM
LAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVU
IE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBT
RVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJ
TlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFC
SUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAq
IChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBP
VVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRI
RSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKworI2luY2x1ZGUgImNvbmZpZy5o
IgorI2luY2x1ZGUgIkIzQmFzaWNCbG9jay5oIgorCituYW1lc3BhY2UgSlNDIHsgbmFtZXNwYWNl
IEIzIHsKKworQmFzaWNCbG9jazo6QmFzaWNCbG9jayh1bnNpZ25lZCBpbmRleCkKKyAgICA6IG1f
aW5kZXgoaW5kZXgpCit7Cit9CisKK0Jhc2ljQmxvY2s6On5CYXNpY0Jsb2NrKCkKK3sKK30KKwor
dm9pZCBCYXNpY0Jsb2NrOjphcHBlbmQoVmFsdWUqIHZhbHVlKQoreworICAgIG1fdmFsdWVzLmFw
cGVuZCh2YWx1ZSk7Cit9CisKK3ZvaWQgQmFzaWNCbG9jazo6ZHVtcChQcmludFN0cmVhbSYgb3V0
KSBjb25zdAoreworICAgIG91dC5wcmludChkdW1wUHJlZml4LCBtX2luZGV4KTsKK30KKwordm9p
ZCBCYXNpY0Jsb2NrOjpkZWVwRHVtcChQcmludFN0cmVhbSYgb3V0KSBjb25zdAoreworICAgIG91
dC5wcmludCgiQkIiLCAqdGhpcywgIjpcbiIpOworICAgIGZvciAoVmFsdWUqIHZhbHVlIDogKnRo
aXMpCisgICAgICAgIG91dC5wcmludCgiICAgICIsIGRlZXBEdW1wKHZhbHVlKSwgIlxuIik7Cit9
CisKK30gfSAvLyBuYW1lc3BhY2UgSlNDOjpCMworCkluZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENv
cmUvYjMvQjNCYXNpY0Jsb2NrLmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRDb3Jl
L2IzL0IzQmFzaWNCbG9jay5oCShyZXZpc2lvbiAwKQorKysgU291cmNlL0phdmFTY3JpcHRDb3Jl
L2IzL0IzQmFzaWNCbG9jay5oCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsMTEyIEBACisvKgor
ICogQ29weXJpZ2h0IChDKSAyMDE1IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAq
CisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3
aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0
aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJp
YnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Cisg
KiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRp
c2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXBy
b2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29u
ZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1l
bnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1
dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gYGBB
UyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJ
TkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVS
Q0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJF
IERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SCisgKiBDT05UUklC
VVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BF
Q0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcs
IEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMg
T1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5F
U1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0Yg
TElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JU
CisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBX
QVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBP
RiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisKKyNpZm5kZWYgQjNCYXNp
Y0Jsb2NrCisjZGVmaW5lIEIzQmFzaWNCbG9jaworCituYW1lc3BhY2UgSlNDIHsgbmFtZXNwYWNl
IEIzIHsKKworY2xhc3MgUHJvY2VkdXJlOworY2xhc3MgVmFsdWU7CisKK2NsYXNzIEJhc2ljQmxv
Y2sgeworICAgIFdURl9NQUtFX05PTkNPUFlBQkxFKEJhc2ljQmxvY2spOworICAgIFdURl9NQUtF
X0ZBU1RfQUxMT0NBVEVEOworcHVibGljOgorICAgIHR5cGVkZWYgVmVjdG9yPFZhbHVlKj4gVmFs
dWVMaXN0OworICAgIHR5cGVkZWYgVmVjdG9yPEJhc2ljQmxvY2sqLCAyPiBTdWNjZXNzb3JMaXN0
OyAvLyBUaGlzIG1hdGNoZXMgQ29udHJvbFZhbHVlJ3MgdHlwZWRlZi4KKworICAgIHN0YXRpYyBj
b25zdCBjaGFyKiBkdW1wUHJlZml4ID0gIiMiOworCisgICAgfkJhc2ljQmxvY2soKTsKKworICAg
IHVuc2lnbmVkIGluZGV4KCkgY29uc3QgeyByZXR1cm4gbV9pbmRleDsgfQorCisgICAgVmFsdWVM
aXN0OjppdGVyYXRvciBiZWdpbigpIHsgcmV0dXJuIG1fdmFsdWVzLmJlZ2luKCk7IH0KKyAgICBW
YWx1ZUxpc3Q6Oml0ZXJhdG9yIGVuZCgpIHsgcmV0dXJuIG1fdmFsdWVzLmVuZCgpOyB9CisgICAg
VmFsdWVMaXN0Ojpjb25zdF9pdGVyYXRvciBiZWdpbigpIGNvbnN0IHsgcmV0dXJuIG1fdmFsdWVz
LmJlZ2luKCk7IH0KKyAgICBWYWx1ZUxpc3Q6OmNvbnN0X2l0ZXJhdG9yIGVuZCgpIGNvbnN0IHsg
cmV0dXJuIG1fdmFsdWVzLmVuZCgpOyB9CisKKyAgICBzaXplX3Qgc2l6ZSgpIGNvbnN0IHsgcmV0
dXJuIG1fdmFsdWVzLnNpemUoKTsgfQorICAgIFZhbHVlKiBhdChzaXplX3QgaW5kZXgpIGNvbnN0
IHsgcmV0dXJuIG1fdmFsdWVzW2luZGV4XTsgfQorICAgIFZhbHVlKiYgYXQoc2l6ZV90IGluZGV4
KSB7IHJldHVybiBtX3ZhbHVlc1tpbmRleF07IH0KKworICAgIFZhbHVlKiBsYXN0KCkgY29uc3Qg
eyByZXR1cm4gbV92YWx1ZXMubGFzdCgpOyB9CisgICAgVmFsdWUqJiBsYXN0KCkgeyByZXR1cm4g
bV92YWx1ZXMubGFzdCgpOyB9CisKKyAgICBjb25zdCBWYWx1ZUxpc3QmIHZhbHVlcygpIGNvbnN0
IHsgcmV0dXJuIG1fdmFsdWVzOyB9CisgICAgVmFsdWVMaXN0JiB2YWx1ZXMoKSB7IHJldHVybiBt
X3ZhbHVlczsgfQorCisgICAgdm9pZCBhcHBlbmQoVmFsdWUqKTsKKworICAgIHRlbXBsYXRlPHR5
cGVuYW1lIFZhbHVlVHlwZSwgdHlwZW5hbWUuLi4gQXJndW1lbnRzPgorICAgIFZhbHVlVHlwZSog
YXBwZW5kTmV3KFByb2NlZHVyZSYsIEFyZ3VtZW50cy4uLik7CisKKyAgICB1bnNpZ25lZCBudW1T
dWNjZXNzb3JzKCkgY29uc3Q7CisgICAgQmFzaWNCbG9jayogc3VjY2Vzc29yKHVuc2lnbmVkIGlu
ZGV4KSBjb25zdDsKKyAgICBCYXNpY0Jsb2NrKiYgc3VjY2Vzc29yKHVuc2lnbmVkIGluZGV4KTsK
KyAgICBjb25zdCBTdWNjZXNzb3JMaXN0JiBzdWNjZXNzb3JzKCkgY29uc3Q7CisKKyAgICB2b2lk
IGR1bXAoUHJpbnRTdHJlYW0mKSBjb25zdDsKKyAgICB2b2lkIGRlZXBEdW1wKFByaW50U3RyZWFt
JikgY29uc3Q7CisKK3ByaXZhdGU6CisgICAgZnJpZW5kIGNsYXNzIFByb2NlZHVyZTsKKyAgICAK
KyAgICAvLyBJbnN0YW50aWF0ZSB2aWEgUHJvY2VkdXJlLgorICAgIEJhc2ljQmxvY2sodW5zaWdu
ZWQgaW5kZXgpOworCisgICAgdW5zaWduZWQgbV9pbmRleDsKKyAgICBWYWx1ZUxpc3QgbV92YWx1
ZXM7Cit9OworCitjbGFzcyBEZWVwQmFzaWNCbG9ja0R1bXAgeworcHVibGljOgorICAgIERlZXBC
YXNpY0Jsb2NrRHVtcChCYXNpY0Jsb2NrKiBibG9jaykKKyAgICAgICAgOiBtX2Jsb2NrKGJsb2Nr
KQorICAgIHsKKyAgICB9CisKKyAgICB2b2lkIGR1bXAoUHJpbnRTdHJlYW0mIG91dCkgY29uc3QK
KyAgICB7CisgICAgICAgIGlmIChtX2Jsb2NrKQorICAgICAgICAgICAgbV9ibG9jay0+ZGVlcER1
bXAob3V0KTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgb3V0LnByaW50KCI8bnVsbD4iKTsK
KyAgICB9CisKK3ByaXZhdGU6CisgICAgQmFzaWNCbG9jayogbV9ibG9jazsKK307CisKK0RlZXBC
YXNpY0Jsb2NrRHVtcCBkZWVwRHVtcChCYXNpY0Jsb2NrKiBibG9jaykKK3sKKyAgICByZXR1cm4g
RGVlcEJhc2ljQmxvY2tEdW1wKGJsb2NrKTsKK30KKworfSB9IC8vIG5hbWVzcGFjZSBKU0M6OkIz
CisKKyNlbmRpZiAvLyBCM0Jhc2ljQmxvY2sKKwpJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3Jl
L2IzL0IzQmFzaWNCbG9ja0lubGluZXMuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlw
dENvcmUvYjMvQjNCYXNpY0Jsb2NrSW5saW5lcy5oCShyZXZpc2lvbiAwKQorKysgU291cmNlL0ph
dmFTY3JpcHRDb3JlL2IzL0IzQmFzaWNCbG9ja0lubGluZXMuaAkod29ya2luZyBjb3B5KQpAQCAt
MCwwICsxLDY2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE1IEFwcGxlIEluYy4gQWxsIHJp
Z2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBh
bmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBl
cm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1l
dDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUg
YWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFu
ZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmlu
YXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNl
LCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGlu
IHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVk
IHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVE
IEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBX
QVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVE
IFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VM
QVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJ
TkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVD
VCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBE
QU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9G
IFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICog
UFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04g
QU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1Qg
TElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNF
KSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUs
IEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICov
CisKKyNpZm5kZWYgQjNCYXNpY0Jsb2NrSW5saW5lc19oCisjZGVmaW5lIEIzQmFzaWNCbG9ja0lu
bGluZXNfaAorCisjaW5jbHVkZSAiQjNCYXNpY0Jsb2NrLmgiCisjaW5jbHVkZSAiQjNDb250cm9s
VmFsdWUuaCIKKyNpbmNsdWRlICJCM1Byb2NlZHVyZUlubGluZXMuaCIKKworbmFtZXNwYWNlIEpT
QyB7IG5hbWVzcGFjZSBCMyB7CisKK3RlbXBsYXRlPHR5cGVuYW1lIFZhbHVlVHlwZSB0eXBlbmFt
ZS4uLiBBcmd1bWVudHM+CitWYWx1ZVR5cGUqIEJhc2ljQmxvY2s6OmFwcGVuZE5ldyhQcm9jZWR1
cmUmIHByb2NlZHVyZSwgQXJndW1lbnRzLi4uIGFyZ3VtZW50cykKK3sKKyAgICBWYWx1ZVR5cGUq
IHJlc3VsdCA9IHByb2NlZHVyZS5hZGQ8VmFsdWVUeXBlPihhcmd1bWVudHMuLi4pOworICAgIGFw
cGVuZChyZXN1bHQpOworICAgIHJldHVybiByZXN1bHQ7Cit9CisKK3Vuc2lnbmVkIEJhc2ljQmxv
Y2s6Om51bVN1Y2Nlc3NvcnMoKSBjb25zdAoreworICAgIHJldHVybiBsYXN0KCktPmFzPENvbnRy
b2xWYWx1ZT4oKS0+bnVtU3VjY2Vzc29ycygpOworfQorCitCYXNpY0Jsb2NrKiBCYXNpY0Jsb2Nr
OjpzdWNjZXNzb3IodW5zaWduZWQgaW5kZXgpIGNvbnN0Cit7CisgICAgcmV0dXJuIGxhc3QoKS0+
YXM8Q29udHJvbFZhbHVlPigpLT5zdWNjZXNzb3IoaW5kZXgpOworfQorCitCYXNpY0Jsb2NrKiYg
QmFzaWNCbG9jazo6c3VjY2Vzc29yKHVuc2lnbmVkIGluZGV4KQoreworICAgIHJldHVybiBsYXN0
KCktPmFzPENvbnRyb2xWYWx1ZT4oKS0+c3VjY2Vzc29yKGluZGV4KTsKK30KKworY29uc3QgQmFz
aWNCbG9jazo6U3VjY2Vzc29yTGlzdCYgQmFzaWNCbG9jazo6c3VjY2Vzc29ycygpIGNvbnN0Cit7
CisgICAgcmV0dXJuIGxhc3QoKS0+YXM8Q29udHJvbFZhbHVlPigpLT5zdWNjZXNzb3JzKCk7Cit9
CisKK30gfSAvLyBuYW1lc3BhY2UgSlNDOjpCMworCisjZW5kaWYgLy8gQjNCYXNpY0Jsb2NrSW5s
aW5lc19oCisKSW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM0NoZWNrU3BlY2lhbC5o
Cj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM0NoZWNrU3BlY2lhbC5o
CShyZXZpc2lvbiAwKQorKysgU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzQ2hlY2tTcGVjaWFs
LmgJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSw2MCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykg
MjAxNSBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRp
b24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Cisg
KiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5n
IGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNl
IGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlz
IGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4g
UmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBj
b3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBm
b2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90
aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJ
UyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisg
KiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlU
RUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQg
RklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4g
Tk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBG
T1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExB
UlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQg
VE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NT
IE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikg
SE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhF
UiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBO
RUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNF
CisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZ
IE9GIFNVQ0ggREFNQUdFLiAKKyAqLworCisjaWZuZGVmIEIzQ2hlY2tTcGVjaWFsX2gKKyNkZWZp
bmUgQjNDaGVja1NwZWNpYWxfaAorCisjaW5jbHVkZSAiQjNTdGFja21hcFNwZWNpYWwuaCIKKwor
bmFtZXNwYWNlIEpTQyB7IG5hbWVzcGFjZSBCMyB7CisKKy8vIFdlIHdhbnQgdG8gbG93ZXIgQ2hl
Y2sgaW5zdHJ1Y3Rpb25zIHRvIGEgYnJhbmNoLCBidXQgdGhlbiB3ZSB3YW50IHRvIHJvdXRlIHRo
YXQgYnJhbmNoIHRvIG91cgorLy8gb3V0LW9mLWxpbmUgY29kZSBpbnN0ZWFkIG9mIGRvaW5nIGFu
eXRoaW5nIGVsc2UuIEZvciB0aGlzIHJlYXNvbiwgYSBDaGVja1NwZWNpYWwgd2lsbCByZW1lbWJl
cgorLy8gd2hpY2ggYnJhbmNoIG9wY29kZSB3ZSBoYXZlIHNlbGVjdGVkIGFsb25nIHdpdGggdGhl
IG51bWJlciBvZiBhcmdzIGluIHRoZSBvdmVybG9hZCB3ZSB3YW50LiBJdAorLy8gd2lsbCBjcmVh
dGUgYW4gSW5zdCB3aXRoIHRoYXQgb3Bjb2RlIHBsdXMgdGhlIGFwcHJvcHJpYXRlIGFyZ3MgZnJv
bSB0aGUgb3duaW5nIEluc3Qgd2hlbmV2ZXIgeW91CisvLyBjYWxsIGFueSBvZiB0aGUgY2FsbGJh
Y2tzLgorCitjbGFzcyBDaGVja1NwZWNpYWwgOiBwdWJsaWMgU3RhY2ttYXBTcGVjaWFsIHsKK3B1
YmxpYzoKKyAgICBDaGVja1NwZWNpYWwoT3Bjb2RlIG9wY29kZSwgdW5zaWduZWQgbnVtQXJncyk7
CisgICAgfkNoZWNrU3BlY2lhbCgpOworCisgICAgLy8gQ29uc3RydWN0cyBhbmQgcmV0dXJucyB0
aGUgSW5zdCByZXByZXNlbnRpbmcgdGhlIGJyYW5jaCB0aGF0IHRoaXMgd2lsbCB1c2UuCisgICAg
SW5zdCBoaWRkZW5CcmFuY2goSW5zdCYpOworCitwcm90ZWN0ZWQ6CisgICAgLy8gRklYTUU6IFdl
IG5lZWQgdG8gZW5zdXJlIHRoYXQgdGhlIHN1cGVyY2xhc3MgZG9lc24ndCBtZXNzIHdpdGggdGhl
IGFyZ3MgdGhhdCBhcmUgYWN0dWFsbHkKKyAgICAvLyBwYXJ0IG9mIG91ciBoaWRkZW4gYnJhbmNo
IGluc3QuIE9uZSBhcHByb2FjaCBpcyB0byBoYXZlIHRoZSBTdGFja21hcFNwZWNpYWwgY2xhc3Mg
aGF2ZSBmb3JtcworICAgIC8vIG9mIHRoZXNlIG1ldGhvZHMgdGhhdCB0YWtlIGFuIGFkZGl0aW9u
YWwgb2Zmc2V0LiBVZ2guCisgICAgdmlydHVhbCBib29sIGZvckVhY2hBcmcoLi4uKTsKKworICAg
IC8vIE5PVEU6IHRoZSBnZW5lcmF0ZSBtZXRob2Qgd2lsbCBnZW5lcmF0ZSB0aGUgaGlkZGVuIGJy
YW5jaCBhbmQgdGhlbiByZWdpc3RlciBhIExhdGVQYXRoIHRoYXQKKyAgICAvLyBnZW5lcmF0ZXMg
dGhlIHN0YWNrbWFwLiBTdXBlciBjcmF6eSBkdWRlIQorfTsKKworfSB9IC8vIG5hbWVzcGFjZSBK
U0M6OkIzCisKKyNlbmRpZiAvLyBCM0NoZWNrU3BlY2lhbF9oCisKSW5kZXg6IFNvdXJjZS9KYXZh
U2NyaXB0Q29yZS9iMy9CM0NoZWNrVmFsdWUuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZh
U2NyaXB0Q29yZS9iMy9CM0NoZWNrVmFsdWUuY3BwCShyZXZpc2lvbiAwKQorKysgU291cmNlL0ph
dmFTY3JpcHRDb3JlL2IzL0IzQ2hlY2tWYWx1ZS5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTAsMCAr
MSw0MSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNSBBcHBsZSBJbmMuIEFsbCByaWdodHMg
cmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJp
bmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0
ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6Cisg
KiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3Zl
IGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhl
IGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBm
b3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhp
cyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUK
KyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRo
IHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBB
UFBMRSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFO
VElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJS
QU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisg
KiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBP
UgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElO
Q0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdF
UyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJT
VElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJ
VFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBU
SEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJ
TElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJ
U0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVO
IElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLiAKKyAqLworCisj
aW5jbHVkZSAiY29uZmlnLmgiCisjaW5jbHVkZSAiQjNDaGVja1ZhbHVlLmgiCisKK25hbWVzcGFj
ZSBKU0MgeyBuYW1lc3BhY2UgQjMgeworCitDaGVja1ZhbHVlOjp+Q2hlY2tWYWx1ZSgpCit7Cit9
CisKK3ZvaWQgQ2hlY2tWYWx1ZTo6ZHVtcE1ldGEoUHJpbnRTdHJlYW0mIG91dCkgY29uc3QKK3sK
KyAgICBvdXQucHJpbnQoInN0YWNrbWFwID0gIiwgc3RhY2ttYXApOworfQorCit9IH0gLy8gbmFt
ZXNwYWNlIEpTQzo6QjMKKwpJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzQ2hlY2tW
YWx1ZS5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM0NoZWNrVmFs
dWUuaAkocmV2aXNpb24gMCkKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM0NoZWNrVmFs
dWUuaAkod29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDgwIEBACisvKgorICogQ29weXJpZ2h0IChD
KSAyMDE1IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1
dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQK
KyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dp
bmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3Vy
Y2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRo
aXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAy
LiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3Zl
IGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhl
IGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Ig
b3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBU
SElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkK
KyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElN
SVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFO
RCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJ
TiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxF
IEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1Q
TEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRF
RCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExP
U1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9O
KSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVU
SEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5H
IE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBV
U0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJ
VFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisKKyNpZm5kZWYgQjNDaGVja1ZhbHVlX2gKKyNkZWZp
bmUgQjNDaGVja1ZhbHVlX2gKKworI2luY2x1ZGUgIkIzVmFsdWUuaCIKKyNpbmNsdWRlICJCM1N0
YWNrbWFwLmgiCisKK25hbWVzcGFjZSBKU0MgeyBuYW1lc3BhY2UgQjMgeworCitjbGFzcyBDaGVj
a1ZhbHVlIDogcHVibGljIENoZWNrIHsKK3B1YmxpYzoKKyAgICBzdGF0aWMgYm9vbCBhY2NlcHRz
KE9wY29kZSBvcGNvZGUpCisgICAgeworICAgICAgICBzd2l0Y2ggKG9wY29kZSkgeworICAgICAg
ICBjYXNlIENoZWNrQWRkOgorICAgICAgICBjYXNlIENoZWNrU3ViOgorICAgICAgICBjYXNlIENo
ZWNrTXVsOgorICAgICAgICBjYXNlIENoZWNrOgorICAgICAgICAgICAgcmV0dXJuIHRydWU7Cisg
ICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAg
ICB9CisKKyAgICB+Q2hlY2tWYWx1ZSgpOworCisgICAgU3RhY2ttYXAgc3RhY2ttYXA7CisKK3By
b3RlY3RlZDoKKyAgICB2b2lkIGR1bXBNZXRhKFByaW50U3RyZWFtJikgY29uc3Qgb3ZlcnJpZGU7
CisKK3ByaXZhdGU6CisgICAgZnJpZW5kIGNsYXNzIFByb2NlZHVyZTsKKworICAgIC8vIFVzZSB0
aGlzIGZvcm0gZm9yIENoZWNrQWRkLCBDaGVja1N1YiwgYW5kIENoZWNrTXVsLgorICAgIENoZWNr
VmFsdWUodW5zaWduZWQgaW5kZXgsIE9wY29kZSBvcGNvZGUsIE9yaWdpbiBvcmlnaW4sIFZhbHVl
KiBsZWZ0LCBWYWx1ZSogcmlnaHQpCisgICAgICAgIDogVmFsdWUoaW5kZXgsIG9wY29kZSwgbGVm
dC0+dHlwZSgpLCBvcmlnaW4sIGxlZnQsIHJpZ2h0KQorICAgIHsKKyAgICAgICAgQVNTRVJUKGlz
SW50KHR5cGUoKSkpOworICAgICAgICBBU1NFUlQobGVmdC0+dHlwZSgpID09IHJpZ2h0LT50eXBl
KCkpOworICAgICAgICBBU1NFUlQob3Bjb2RlID09IENoZWNrQWRkIHx8IG9wY29kZSA9PSBDaGVj
a1N1YiB8fCBvcGNvZGUgPT0gQ2hlY2tNdWwpOworICAgIH0KKworICAgIC8vIFVzZSB0aGlzIGZv
cm0gZm9yIENoZWNrLgorICAgIENoZWNrVmFsdWUodW5zaWduZWQgaW5kZXgsIE9wY29kZSBvcGNv
ZGUsIE9yaWdpbiBvcmlnaW4sIFZhbHVlKiBwcmVkaWNhdGUpCisgICAgICAgIDogVmFsdWUoaW5k
ZXgsIG9wY29kZSwgVm9pZCwgb3JpZ2luLCBwcmVkaWNhdGUpCisgICAgeworICAgICAgICBBU1NF
UlQob3BjZGUgPT0gQ2hlY2spOworICAgIH0KK307CisKK30gfSAvLyBuYW1lc3BhY2UgSlNDOjpC
MworCisjZW5kaWYgLy8gQjNDaGVja1ZhbHVlX2gKKworCkluZGV4OiBTb3VyY2UvSmF2YVNjcmlw
dENvcmUvYjMvQjNDb21wYXJpc29uTWF0Y2hlci5wYXR0ZXJucwo9PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3Vy
Y2UvSmF2YVNjcmlwdENvcmUvYjMvQjNDb21wYXJpc29uTWF0Y2hlci5wYXR0ZXJucwkocmV2aXNp
b24gMCkKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM0NvbXBhcmlzb25NYXRjaGVyLnBh
dHRlcm5zCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsMzggQEAKKyMgQ29weXJpZ2h0IChDKSAy
MDE1IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyMKKyMgUmVkaXN0cmlidXRpb24g
YW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisjIG1v
ZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29u
ZGl0aW9ucworIyBhcmUgbWV0OgorIyAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUg
bXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorIyAgICBub3RpY2UsIHRoaXMgbGlzdCBv
ZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisjIDIuIFJlZGlzdHJp
YnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0
CisjICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcg
ZGlzY2xhaW1lciBpbiB0aGUKKyMgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJp
YWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyMKKyMgVEhJUyBTT0ZUV0FSRSBJ
UyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIEFORCBJVFMgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJwor
IyBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBO
T1QgTElNSVRFRCBUTywKKyMgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJ
VFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorIyBQVVJQT1NFIEFSRSBESVNDTEFJTUVE
LiBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SIElUUyBDT05UUklCVVRPUlMKKyMgQkUg
TElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhF
TVBMQVJZLCBPUgorIyBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBM
SU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgorIyBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VT
OyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MKKyMgSU5URVJSVVBU
SU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRI
RVIgSU4KKyMgQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBO
RUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKyMgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUg
VVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRgorIyBUSEUgUE9TU0lCSUxJ
VFkgT0YgU1VDSCBEQU1BR0UuCisKK21hdGNoZXIgQ29tcGFyaXNvbk1hdGNoZXIKKworVGVzdExv
YWROb3RaZXJvMSA9IEFuZChMb2FkKGFkZHJlc3MpLCByaWdodCkKK1Rlc3RMb2FkTm90WmVybzIg
PSBBbmQobGVmdCwgTG9hZChhZGRyZXNzKSkKK1Rlc3ROb3RaZXJvID0gQW5kKGxlZnQsIHJpZ2h0
KQorCitUZXN0TG9hZFplcm8xID0gRXF1YWwoQW5kKExvYWQoYWRkcmVzcyksIHJpZ2h0KSwgJDAp
CitUZXN0TG9hZFplcm8yID0gRXF1YWwoQW5kKGxlZnQsIExvYWQoYWRkcmVzcykpLCAkMCkKK1Rl
c3RaZXJvID0gRXF1YWwoQW5kKGxlZnQsIHJpZ2h0KSwgJDApCisKK0xvYWRFcXVhbDEgPSBFcXVh
bChMb2FkKGFkZHJlc3MpLCByaWdodCkKK0xvYWRFcXVhbDIgPSBFcXVhbChsZWZ0LCBMb2FkKGFk
ZHJlc3MpKQorTm90ID0gRXF1YWwodmFsdWUsICQwKQorRXF1YWwgPSBFcXVhbChsZWZ0LCByaWdo
dCkKKwpJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzQ29uc3QzMlZhbHVlLmNwcAo9
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNDb25zdDMyVmFsdWUuY3Bw
CShyZXZpc2lvbiAwKQorKysgU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzQ29uc3QzMlZhbHVl
LmNwcAkod29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDQxIEBACisvKgorICogQ29weXJpZ2h0IChD
KSAyMDE1IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1
dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQK
KyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dp
bmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3Vy
Y2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRo
aXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAy
LiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3Zl
IGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhl
IGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Ig
b3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBU
SElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkK
KyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElN
SVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFO
RCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJ
TiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxF
IEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1Q
TEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRF
RCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExP
U1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9O
KSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVU
SEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5H
IE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBV
U0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJ
VFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisKKyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRl
ICJCM0NvbnN0MzJWYWx1ZS5oIgorCituYW1lc3BhY2UgSlNDIHsgbmFtZXNwYWNlIEIzIHsKKwor
Q29uc3QzMlZhbHVlOjp+Q29uc3QzMlZhbHVlKCkKK3sKK30KKwordm9pZCBDb25zdDMyVmFsdWU6
OmR1bXBNZXRhKFByaW50U3RyZWFtJiBvdXQpIGNvbnN0Cit7CisgICAgb3V0LnByaW50KG1fdmFs
dWUpOworfQorCit9IH0gLy8gbmFtZXNwYWNlIEpTQzo6QjMKKwpJbmRleDogU291cmNlL0phdmFT
Y3JpcHRDb3JlL2IzL0IzQ29uc3QzMlZhbHVlLmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL0phdmFT
Y3JpcHRDb3JlL2IzL0IzQ29uc3QzMlZhbHVlLmgJKHJldmlzaW9uIDApCisrKyBTb3VyY2UvSmF2
YVNjcmlwdENvcmUvYjMvQjNDb25zdDMyVmFsdWUuaAkod29ya2luZyBjb3B5KQpAQCAtMCwwICsx
LDU5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE1IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyBy
ZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmlu
YXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRl
ZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAq
IDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUg
Y29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUg
Zm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZv
cm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlz
IGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQor
ICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGgg
dGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQ
UExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5U
SUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJB
TlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAq
IFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9S
CisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5D
SURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VT
IChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNU
SVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklU
UzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRI
RU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklM
SVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklT
SU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4g
SUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisKKyNp
Zm5kZWYgQjNDb25zdDMyVmFsdWVfaAorI2RlZmluZSBCM0NvbnN0MzJWYWx1ZV9oCisKKyNpbmNs
dWRlICJCM1ZhbHVlLmgiCisKK25hbWVzcGFjZSBKU0MgeyBuYW1lc3BhY2UgQjMgeworCitjbGFz
cyBDb25zdDMyVmFsdWUgOiBwdWJsaWMgVmFsdWUgeworcHVibGljOgorICAgIHN0YXRpYyBib29s
IGFjY2VwdHMoT3Bjb2RlIG9wY29kZSkgeyByZXR1cm4gb3Bjb2RlID09IENvbnN0MzI7IH0KKyAg
ICAKKyAgICB+Q29uc3QzMlZhbHVlKCk7CisgICAgCisgICAgaW50MzJfdCB2YWx1ZSgpIGNvbnN0
IHsgcmV0dXJuIG1fdmFsdWU7IH0KKworcHJvdGVjdGVkOgorICAgIHZvaWQgZHVtcE1ldGEoUHJp
bnRTdHJlYW0mKSBjb25zdCBvdmVycmlkZTsKKworcHJpdmF0ZToKKyAgICBmcmllbmQgY2xhc3Mg
UHJvY2VkdXJlOworCisgICAgQ29uc3QzMlZhbHVlKHVuc2lnbmVkIGluZGV4LCBPcmlnaW4gb3Jp
Z2luLCBpbnQzMl90IHZhbHVlKQorICAgICAgICA6IFZhbHVlKGluZGV4LCBDb25zdDMyLCBJbnQz
Miwgb3JpZ2luKQorICAgICAgICAsIG1fdmFsdWUodmFsdWUpCisgICAgeworICAgIH0KKyAgICAK
KyAgICBpbnQzMl90IG1fdmFsdWU7Cit9OworCit9IH0gLy8gbmFtZXNwYWNlIEpTQzo6QjMKKwor
I2VuZGlmIC8vIEIzQ29uc3QzMlZhbHVlX2gKKwpJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3Jl
L2IzL0IzQ29uc3Q2NFZhbHVlLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENv
cmUvYjMvQjNDb25zdDY0VmFsdWUuY3BwCShyZXZpc2lvbiAwKQorKysgU291cmNlL0phdmFTY3Jp
cHRDb3JlL2IzL0IzQ29uc3Q2NFZhbHVlLmNwcAkod29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDQx
IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE1IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNl
cnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5
IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBw
cm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEu
IFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29w
eXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9s
bG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0g
bXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxp
c3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICog
ICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhl
IGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExF
IElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVT
LCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJ
RVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBV
UlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SCisg
KiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURF
TlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJ
TkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRV
VEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsg
T1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9S
WQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZ
LCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5H
IElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYg
QURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisKKyNpbmNs
dWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJCM0NvbnN0NjRWYWx1ZS5oIgorCituYW1lc3BhY2Ug
SlNDIHsgbmFtZXNwYWNlIEIzIHsKKworQ29uc3Q2NFZhbHVlOjp+Q29uc3Q2NFZhbHVlKCkKK3sK
K30KKwordm9pZCBDb25zdDY0VmFsdWU6OmR1bXBNZXRhKFByaW50U3RyZWFtJiBvdXQpIGNvbnN0
Cit7CisgICAgb3V0LnByaW50KG1fdmFsdWUpOworfQorCit9IH0gLy8gbmFtZXNwYWNlIEpTQzo6
QjMKKwpJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzQ29uc3Q2NFZhbHVlLmgKPT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzQ29uc3Q2NFZhbHVlLmgJKHJl
dmlzaW9uIDApCisrKyBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNDb25zdDY0VmFsdWUuaAko
d29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDU5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE1
IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBh
bmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1v
ZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29u
ZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29k
ZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlz
dCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRp
c3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHly
aWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxv
d2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIg
bWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNP
RlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVY
UFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBU
TywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRO
RVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBF
VkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBB
TlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwg
T1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywK
KyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0Yg
VVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dF
VkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElO
IENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJ
R0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAq
IE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0Yg
U1VDSCBEQU1BR0UuIAorICovCisKKyNpZm5kZWYgQjNDb25zdDY0VmFsdWVfaAorI2RlZmluZSBC
M0NvbnN0NjRWYWx1ZV9oCisKKyNpbmNsdWRlICJCM1ZhbHVlLmgiCisKK25hbWVzcGFjZSBKU0Mg
eyBuYW1lc3BhY2UgQjMgeworCitjbGFzcyBDb25zdDY0VmFsdWUgOiBwdWJsaWMgVmFsdWUgewor
cHVibGljOgorICAgIHN0YXRpYyBib29sIGFjY2VwdHMoT3Bjb2RlIG9wY29kZSkgeyByZXR1cm4g
b3Bjb2RlID09IENvbnN0NjQ7IH0KKyAgICAKKyAgICB+Q29uc3Q2NFZhbHVlKCk7CisgICAgCisg
ICAgaW50NjRfdCB2YWx1ZSgpIGNvbnN0IHsgcmV0dXJuIG1fdmFsdWU7IH0KKworcHJvdGVjdGVk
OgorICAgIHZvaWQgZHVtcE1ldGEoUHJpbnRTdHJlYW0mKSBjb25zdCBvdmVycmlkZTsKKworcHJp
dmF0ZToKKyAgICBmcmllbmQgY2xhc3MgUHJvY2VkdXJlOworCisgICAgQ29uc3Q2NFZhbHVlKHVu
c2lnbmVkIGluZGV4LCBPcmlnaW4gb3JpZ2luLCBpbnQ2NF90IHZhbHVlKQorICAgICAgICA6IFZh
bHVlKGluZGV4LCBDb25zdDY0LCBJbnQ2NCwgb3JpZ2luKQorICAgICAgICAsIG1fdmFsdWUodmFs
dWUpCisgICAgeworICAgIH0KKyAgICAKKyAgICBpbnQ2NF90IG1fdmFsdWU7Cit9OworCit9IH0g
Ly8gbmFtZXNwYWNlIEpTQzo6QjMKKworI2VuZGlmIC8vIEIzQ29uc3Q2NFZhbHVlX2gKKwpJbmRl
eDogU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzQ29uc3REb3VibGVWYWx1ZS5jcHAKPT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzQ29uc3REb3VibGVWYWx1ZS5jcHAJ
KHJldmlzaW9uIDApCisrKyBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNDb25zdERvdWJsZVZh
bHVlLmNwcAkod29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDQxIEBACisvKgorICogQ29weXJpZ2h0
IChDKSAyMDE1IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3Ry
aWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhv
dXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xs
b3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBz
b3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2Us
IHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisg
KiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFi
b3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQg
dGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQv
b3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisg
KiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBB
TlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1Qg
TElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZ
IEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQu
ICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElB
QkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVY
RU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElN
SVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7
IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBU
SU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBX
SEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVE
SU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRI
RSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lC
SUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisKKyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNs
dWRlICJCM0NvbnN0RG91YmxlVmFsdWUuaCIKKworbmFtZXNwYWNlIEpTQyB7IG5hbWVzcGFjZSBC
MyB7CisKK0NvbnN0RG91YmxlVmFsdWU6On5Db25zdERvdWJsZVZhbHVlKCkKK3sKK30KKwordm9p
ZCBDb25zdERvdWJsZVZhbHVlOjpkdW1wTWV0YShQcmludFN0cmVhbSYgb3V0KSBjb25zdAorewor
ICAgIG91dC5wcmludGYoIiVsZSIsIG1fdmFsdWUpOworfQorCit9IH0gLy8gbmFtZXNwYWNlIEpT
Qzo6QjMKKwpJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzQ29uc3REb3VibGVWYWx1
ZS5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM0NvbnN0RG91Ymxl
VmFsdWUuaAkocmV2aXNpb24gMCkKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM0NvbnN0
RG91YmxlVmFsdWUuaAkod29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDU5IEBACisvKgorICogQ29w
eXJpZ2h0IChDKSAyMDE1IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBS
ZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9y
IHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRo
ZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9u
cyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBu
b3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWlt
ZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2Ug
dGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9u
cyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlv
biBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4K
KyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycn
IEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJV
VCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRB
QklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NM
QUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMg
QkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwK
KyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBO
T1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VS
VklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5U
RVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklM
SVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAo
SU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VU
IE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUg
UE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisKKyNpZm5kZWYgQjNDb25zdERvdWJs
ZVZhbHVlX2gKKyNkZWZpbmUgQjNDb25zdERvdWJsZVZhbHVlX2gKKworI2luY2x1ZGUgIkIzVmFs
dWUuaCIKKworbmFtZXNwYWNlIEpTQyB7IG5hbWVzcGFjZSBCMyB7CisKK2NsYXNzIENvbnN0RG91
YmxlVmFsdWUgOiBwdWJsaWMgVmFsdWUgeworcHVibGljOgorICAgIHN0YXRpYyBib29sIGFjY2Vw
dHMoT3Bjb2RlIG9wY29kZSkgeyByZXR1cm4gb3Bjb2RlID09IENvbnN0RG91YmxlOyB9CisgICAg
CisgICAgfkNvbnN0RG91YmxlVmFsdWUoKTsKKyAgICAKKyAgICBkb3VibGUgdmFsdWUoKSBjb25z
dCB7IHJldHVybiBtX3ZhbHVlOyB9CisKK3Byb3RlY3RlZDoKKyAgICB2b2lkIGR1bXBNZXRhKFBy
aW50U3RyZWFtJikgY29uc3Qgb3ZlcnJpZGU7CisKK3ByaXZhdGU6CisgICAgZnJpZW5kIGNsYXNz
IFByb2NlZHVyZTsKKworICAgIENvbnN0RG91YmxlVmFsdWUodW5zaWduZWQgaW5kZXgsIE9yaWdp
biBvcmlnaW4sIGRvdWJsZSB2YWx1ZSkKKyAgICAgICAgOiBWYWx1ZShpbmRleCwgQ29uc3REb3Vi
bGUsIERvdWJsZSwgb3JpZ2luKQorICAgICAgICAsIG1fdmFsdWUodmFsdWUpCisgICAgeworICAg
IH0KKyAgICAKKyAgICBkb3VibGUgbV92YWx1ZTsKK307CisKK30gfSAvLyBuYW1lc3BhY2UgSlND
OjpCMworCisjZW5kaWYgLy8gQjNDb25zdERvdWJsZVZhbHVlX2gKKwpJbmRleDogU291cmNlL0ph
dmFTY3JpcHRDb3JlL2IzL0IzQ29udHJvbFZhbHVlLmNwcAo9PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2Uv
SmF2YVNjcmlwdENvcmUvYjMvQjNDb250cm9sVmFsdWUuY3BwCShyZXZpc2lvbiAwKQorKysgU291
cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzQ29udHJvbFZhbHVlLmNwcAkod29ya2luZyBjb3B5KQpA
QCAtMCwwICsxLDQzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE1IEFwcGxlIEluYy4gQWxs
IHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJj
ZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJl
IHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJl
IG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0
aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25z
IGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4g
YmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90
aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVy
IGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3Zp
ZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJ
REVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElF
RCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBM
SUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJ
Q1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBM
RSBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJ
UkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElB
TCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5U
IE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgor
ICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQg
T04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJ
Q1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJX
SVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdB
UkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAor
ICovCisKKyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJCM0NvbnRyb2xWYWx1ZS5oIgor
CituYW1lc3BhY2UgSlNDIHsgbmFtZXNwYWNlIEIzIHsKKworQ29udHJvbFZhbHVlOjp+Q29udHJv
bFZhbHVlKCkKK3sKK30KKwordm9pZCBDb250cm9sVmFsdWU6OmR1bXBNZXRhKFByaW50U3RyZWFt
JiBvdXQpIGNvbnN0Cit7CisgICAgQ29tbWFQcmludGVyIGNvbW1hOworICAgIGZvciAoQmFzaWNC
bG9jayogYmxvY2sgOiBtX3N1Y2Nlc3NvcnMpCisgICAgICAgIG91dC5wcmludChjb21tYSwgcG9p
bnRlckR1bXAoYmxvY2spKTsKK30KKworfSB9IC8vIG5hbWVzcGFjZSBKU0M6OkIzCisKSW5kZXg6
IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM0NvbnRyb2xWYWx1ZS5oCj09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0t
IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM0NvbnRyb2xWYWx1ZS5oCShyZXZpc2lvbiAwKQor
KysgU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzQ29udHJvbFZhbHVlLmgJKHdvcmtpbmcgY29w
eSkKQEAgLTAsMCArMSwxMTcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTUgQXBwbGUgSW5j
LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4g
c291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9u
LCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisg
KiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0
YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRp
dGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9u
cyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAg
ICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2Ns
YWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMg
cHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMg
UFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJ
TVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAq
IElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEg
UEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxM
IEFQUExFIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1Qs
IElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFV
RU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VS
RU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEs
IE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VE
IEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1Qs
IFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBP
VEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBT
T0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFH
RS4gCisgKi8KKworI2lmbmRlZiBCM0NvbnRyb2xWYWx1ZV9oCisjZGVmaW5lIEIzQ29udHJvbFZh
bHVlX2gKKworI2luY2x1ZGUgIkIzVmFsdWUuaCIKKworbmFtZXNwYWNlIEpTQyB7IG5hbWVzcGFj
ZSBCMyB7CisKK2NsYXNzIEJhc2ljQmxvY2s7CisKK2NsYXNzIENvbnRyb2xWYWx1ZSA6IHB1Ymxp
YyBWYWx1ZSB7CitwdWJsaWM6CisgICAgc3RhdGljIGJvb2wgYWNjZXB0cyhPcGNvZGUgb3Bjb2Rl
KQorICAgIHsKKyAgICAgICAgc3dpdGNoIChvcGNvZGUpIHsKKyAgICAgICAgY2FzZSBKdW1wOgor
ICAgICAgICBjYXNlIEJyYW5jaDoKKyAgICAgICAgY2FzZSBSZXR1cm46CisgICAgICAgIGNhc2Ug
T29wczoKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICBjYXNlIFN3aXRjaDogCisg
ICAgICAgICAgICAvLyBUaGlzIGlzIGhlcmUgYmVjYXVzZSBTd2l0Y2hWYWx1ZSBpcyBhIHN1YmNs
YXNzIG9mIENvbnRyb2xWYWx1ZSwgc28gd2Ugd2FudAorICAgICAgICAgICAgLy8gc3d0aWNoVmFs
dWUtPmFzPENvbnRyb2xWYWx1ZT4oKSB0byByZXR1cm4gbm9uLW51bGwuCisgICAgICAgICAgICBy
ZXR1cm4gdHJ1ZTsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsK
KyAgICAgICAgfQorICAgIH0KKworICAgIHR5cGVkZWYgVmVjdG9yPEJhc2ljQmxvY2sqLCAyPiBT
dWNjZXNzb3JMaXN0OworCisgICAgfkNvbnRyb2xWYWx1ZSgpOworCisgICAgdW5zaWduZWQgbnVt
U3VjY2Vzc29ycygpIGNvbnN0IHsgcmV0dXJuIG1fc3VjY2Vzc29ycy5zaXplKCk7IH0KKyAgICBC
YXNpY0Jsb2NrKiBzdWNjZXNzb3IodW5zaWduZWQgaW5kZXgpIGNvbnN0IHsgcmV0dXJuIG1fc3Vj
Y2Vzc29yc1tpXTsgfQorICAgIEJhc2ljQmxvY2sqJiBzdWNjZXNzb3IodW5zaWduZWQgaW5kZXgp
IHsgcmV0dXJuIG1fc3VjY2Vzc29yc1tpXTsgfQorCisgICAgY29uc3QgU3VjY2Vzc29yTGlzdCYg
c3VjY2Vzc29ycygpIGNvbnN0IHsgcmV0dXJuIG1fc3VjY2Vzc29yczsgfQorCitwcm90ZWN0ZWQ6
CisgICAgdm9pZCBkdW1wTWV0YShQcmludFN0cmVhbSYpIGNvbnN0IG92ZXJyaWRlOworCisgICAg
Ly8gVXNlIHRoaXMgZm9yIHN1YmNsYXNzZXMuCisgICAgdGVtcGxhdGU8dHlwZW5hbWUuLi4gQXJn
dW1lbnRzPgorICAgIENvbnRyb2xWYWx1ZSh1bnNpZ25lZCBpbmRleCwgT3Bjb2RlIG9wY29kZSwg
VHlwZSB0eXBlLCBPcmlnaW4gb3JpZ2luLCBBcmd1bWVudHMuLi4gYXJndW1lbnRzKQorICAgICAg
ICA6IFZhbHVlKGluZGV4LCBvcGNvZGUsIHR5cGUsIG9yaWdpbiwgYXJndW1lbnRzLi4uKQorICAg
IHsKKyAgICB9CisKKyAgICAvLyBTdWJjbGFzc2VzIHdpbGwgcG9wdWxhdGUgdGhpcy4KKyAgICBT
dWNjZXNzb3JMaXN0IG1fc3VjY2Vzc29yczsKKworcHJpdmF0ZToKKyAgICBmcmllbmQgY2xhc3Mg
UHJvY2VkdXJlOworCisgICAgLy8gVXNlIHRoaXMgZm9yIE9vcHMuCisgICAgQ29udHJvbFZhbHVl
KHVuc2lnbmVkIGluZGV4LCBPcGNvZGUgb3Bjb2RlLCBPcmlnaW4gb3JpZ2luKQorICAgICAgICA6
IFZhbHVlKGluZGV4LCBvcGNvZGUsIFZvaWQsIG9yaWdpbikKKyAgICB7CisgICAgICAgIEFTU0VS
VChvcGNvZGUgPT0gT29wcyk7CisgICAgfQorCisgICAgLy8gVXNlIHRoaXMgZm9yIFJldHVybi4K
KyAgICBDb250cm9sVmFsdWUodW5zaWduZWQgaW5kZXgsIE9wY29kZSBvcGNvZGUsIE9yaWdpbiBv
cmlnaW4sIFZhbHVlKiByZXN1bHQpCisgICAgICAgIDogVmFsdWUoaW5kZXgsIG9wY29kZSwgVm9p
ZCwgb3JpZ2luLCByZXN1bHQpCisgICAgeworICAgICAgICBBU1NFUlQob3Bjb2RlID09IFJldHVy
bik7CisgICAgfQorCisgICAgLy8gVXNlIHRoaXMgZm9yIEp1bXAuCisgICAgQ29udHJvbFZhbHVl
KHVuc2lnbmVkIGluZGV4LCBPcGNvZGUgb3Bjb2RlLCBPcmlnaW4gb3JpZ2luLCBCYXNpY0Jsb2Nr
KiB0YXJnZXQpCisgICAgICAgIDogVmFsdWUoaW5kZXgsIG9wY29kZSwgVm9pZCwgb3JpZ2luKQor
ICAgIHsKKyAgICAgICAgQVNTRVJUKG9wY29kZSA9PSBKdW1wKTsKKyAgICAgICAgbV9zdWNjZXNz
b3JzLmFwcGVuZCh0YXJnZXQpOworICAgIH0KKworICAgIC8vIFVzZSB0aGlzIGZvciBCcmFuY2gu
CisgICAgQ29udHJvbFZhbHVlKAorICAgICAgICB1bnNpZ25lZCBpbmRleCwgT3Bjb2RlIG9wY29k
ZSwgT3JpZ2luIG9yaWdpbiwgVmFsdWUqIHByZWRpY2F0ZSwKKyAgICAgICAgQmFzaWNCbG9jayog
eWVzLCBCYXNpY0Jsb2NrKiBubykKKyAgICAgICAgOiBWYWx1ZShpbmRleCwgb3Bjb2RlLCBWb2lk
LCBvcmlnaW4sIHByZWRpY2F0ZSkKKyAgICB7CisgICAgICAgIEFTU0VSVChvcGNvZGUgPT0gQnJh
bmNoKTsKKyAgICAgICAgbV9zdWNjZXNzb3JzLmFwcGVuZCh5ZXMpOworICAgICAgICBtX3N1Y2Nl
c3NvcnMuYXBwZW5kKG5vKTsKKyAgICB9Cit9OworCit9IH0gLy8gbmFtZXNwYWNlIEpTQzo6QjMK
KworI2VuZGlmIC8vIEIzQ29udHJvbFZhbHVlX2gKKwpJbmRleDogU291cmNlL0phdmFTY3JpcHRD
b3JlL2IzL0IzSW5kZXhTZXQuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUv
YjMvQjNJbmRleFNldC5oCShyZXZpc2lvbiAwKQorKysgU291cmNlL0phdmFTY3JpcHRDb3JlL2Iz
L0IzSW5kZXhTZXQuaAkod29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDE0MSBAQAorLyoKKyAqIENv
cHlyaWdodCAoQykgMjAxNSBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICog
UmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBv
ciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0
aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlv
bnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAg
bm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFp
bWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNl
IHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlv
bnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRp
b24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24u
CisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIGBgQVMgSVMn
JyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBC
VVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5U
QUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVND
TEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUgorICogQ09OVFJJQlVUT1JT
IEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUws
CisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQg
Tk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNF
UlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElO
VEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJ
TElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICog
KElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9V
VCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhF
IFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLiAKKyAqLworCisjaWZuZGVmIEIzSW5kZXhTZXRf
aAorI2RlZmluZSBCM0luZGV4U2V0X2gKKworI2luY2x1ZGUgPHd0Zi9CaXRWZWN0b3IuaD4KKyNp
bmNsdWRlIDx3dGYvQ29tbWFQcmludGVyLmg+CisKK25hbWVzcGFjZSBKU0MgeyBuYW1lc3BhY2Ug
QjMgeworCisvLyBUaGlzIGlzIGEgc2V0IGZvciB0aGluZ3MgdGhhdCBoYXZlIGFuIGluZGV4KCku
IEl0J3Mgc3VwZXIgZWZmaWNpZW50IGZvciBCYXNpY0Jsb2Nrcy4gSXQncyBvbmx5CisvLyBlZmZp
Y2llbnQgZm9yIFZhbHVlcyBpZiB5b3UgZG9uJ3QgY3JlYXRlIHRvbyBtYW55IG9mIHRoZXNlIHNl
dHMsIHNpbmNlIFZhbHVlcyBjYW4gaGF2ZSB2ZXJ5IHNwYXJzZQorLy8gaW5kaWNlcyBhbmQgdGhl
cmUgYXJlIGEgbG90IG9mIFZhbHVlcy4KKworLy8gSWYgeW91IHdhbnQgYSBzZXQgb2YgQmFzaWNC
bG9ja3MsIHlvdSBkbyBJbmRleFNldDxCYXNpY0Jsb2NrPi4gU28sIFQgPSBCYXNpY0Jsb2NrLgor
dGVtcGxhdGU8dHlwZW5hbWUgVD4KK2NsYXNzIEluZGV4U2V0IHsKK3B1YmxpYzoKKyAgICBJbmRl
eFNldCgpCisgICAgeworICAgIH0KKworICAgIGJvb2wgYWRkKFQqIHZhbHVlKQorICAgIHsKKyAg
ICAgICAgcmV0dXJuICFtX3NldC5zZXQodmFsdWUtPmluZGV4KCkpOworICAgIH0KKworICAgIGJv
b2wgY29udGFpbnMoVCogdmFsdWUpIGNvbnN0CisgICAgeworICAgICAgICBpZiAoIXZhbHVlKQor
ICAgICAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgICAgIHJldHVybiBtX3NldC5nZXQodmFs
dWUtPmluZGV4KCkpOworICAgIH0KKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIENvbGxlY3Rpb25U
eXBlPgorICAgIGNsYXNzIEl0ZXJhYmxlIHsKKyAgICBwdWJsaWM6CisgICAgICAgIEl0ZXJhYmxl
KGNvbnN0IENvbGxlY3Rpb25UeXBlJiBjb2xsZWN0aW9uLCBjb25zdCBJbmRleFNldCYgc2V0KQor
ICAgICAgICAgICAgOiBtX2NvbGxlY3Rpb24oY29sbGVjdGlvbikKKyAgICAgICAgICAgICwgbV9z
ZXQoc2V0KQorICAgICAgICB7CisgICAgICAgIH0KKworICAgICAgICBjbGFzcyBpdGVyYXRvciB7
CisgICAgICAgIHB1YmxpYzoKKyAgICAgICAgICAgIGl0ZXJhdG9yKCkKKyAgICAgICAgICAgICAg
ICA6IG1fY29sbGVjdGlvbihudWxscHRyKQorICAgICAgICAgICAgeworICAgICAgICAgICAgfQor
CisgICAgICAgICAgICBpdGVyYXRvcihjb25zdCBDb2xsZWN0aW9uVHlwZSYgY29sbGVjdGlvbiwg
Qml0VmVjdG9yOjpTZXRCaXRzSXRlcmFibGU6Oml0ZXJhdG9yIGl0ZXIpCisgICAgICAgICAgICAg
ICAgOiBtX2NvbGxlY3Rpb24oJmNvbGxlY3Rpb24pCisgICAgICAgICAgICAgICAgLCBtX2l0ZXIo
aXRlcikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgVCogb3Bl
cmF0b3IqKCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbV9jb2xsZWN0
aW9uLT5hdCgqbV9pdGVyKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaXRlcmF0b3Im
IG9wZXJhdG9yKysoKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1faXRlcisrOwor
ICAgICAgICAgICAgICAgIHJldHVybiAqdGhpczsKKyAgICAgICAgICAgIH0KKworICAgICAgICAg
ICAgYm9vbCBvcGVyYXRvcj09KGNvbnN0IGl0ZXJhdG9yJiBvdGhlcikgY29uc3QKKyAgICAgICAg
ICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbV9pdGVyID09IG90aGVyLm1faXRlcjsKKyAg
ICAgICAgICAgIH0KKworICAgICAgICAgICAgYm9vbCBvcGVyYXRvciE9KGNvbnN0IGl0ZXJhdG9y
JiBvdGhlcikgY29uc3QKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gISgq
dGhpcyA9PSBvdGhlcik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZToKKyAgICAg
ICAgICAgIGNvbnN0IENvbGxlY3Rpb25UeXBlKiBtX2NvbGxlY3Rpb247CisgICAgICAgICAgICBC
aXRWZWN0b3I6OlNldEJpdHNJdGVyYWJsZTo6aXRlcmF0b3IgbV9pdGVyOworICAgICAgICB9Owor
CisgICAgICAgIGl0ZXJhdG9yIGJlZ2luKCkgY29uc3QgeyByZXR1cm4gaXRlcmF0b3IobV9jb2xs
ZWN0aW9uLCBtX3NldC5iZWdpbigpKTsgfQorICAgICAgICBpdGVyYXRvciBlbmQoKSBjb25zdCB7
IHJldHVybiBpdGVyYXRvcihtX2NvbGxlY3Rpb24sIG1fc2V0LmVuZCgpKTsgfQorCisgICAgcHJp
dmF0ZToKKyAgICAgICAgY29uc3QgQ29sbGVjdGlvblR5cGUmIG1fY29sbGVjdGlvbjsKKyAgICAg
ICAgY29uc3QgSW5kZXhTZXQmIG1fc2V0OworICAgIH07CisKKyAgICAvLyBGb3IgYmFzaWMgYmxv
Y2tzLCB5b3UgZG86CisgICAgLy8gaW5kZXhTZXQudmFsdWVzKHByb2NlZHVyZSk7CisgICAgLy8K
KyAgICAvLyBGb3IgdmFsdWVzLCB5b3UgZG86CisgICAgLy8gaW5kZXhTZXQudmFsdWVzKHByb2Nl
ZHVyZS52YWx1ZXMoKSk7CisgICAgdGVtcGxhdGU8dHlwZW5hbWUgQ29sbGVjdGlvblR5cGU+Cisg
ICAgSXRlcmFibGU8Q29sbGVjdGlvblR5cGU+IHZhbHVlcyhjb25zdCBDb2xsZWN0aW9uVHlwZSYg
Y29sbGVjdGlvbikgY29uc3QKKyAgICB7CisgICAgICAgIHJldHVybiBJdGVyYWJsZTxDb2xsZWN0
aW9uVHlwZT4oY29sbGVjdGlvbik7CisgICAgfQorCisgICAgY29uc3QgQml0VmVjdG9yJiBpbmRp
Y2VzKCkgY29uc3QgeyByZXR1cm4gbV9zZXQ7IH0KKworICAgIHZvaWQgZHVtcChQcmludFN0cmVh
bSYgb3V0KSBjb25zdAorICAgIHsKKyAgICAgICAgQ29tbWFQcmludGVyIGNvbW1hOworICAgICAg
ICBmb3IgKHNpemVfdCBpbmRleCA6IGluZGljZXMoKS5zZXRCaXRzKCkpCisgICAgICAgICAgICBv
dXQucHJpbnQoY29tbWEsIFQ6OmR1bXBQcmVmaXgsIGluZGV4KTsKKyAgICB9CisKK3ByaXZhdGU6
CisgICAgQml0VmVjdG9yIG1fc2V0OworfTsKKworfSB9IC8vIG5hbWVzcGFjZSBKU0M6OkIzCisK
KyNlbmRpZiAvLyBCM0luZGV4U2V0X2gKKwpJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL2Iz
L0IzTG93ZXJpbmdNYXRjaGVyLnBhdHRlcm5zCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2Ny
aXB0Q29yZS9iMy9CM0xvd2VyaW5nTWF0Y2hlci5wYXR0ZXJucwkocmV2aXNpb24gMCkKKysrIFNv
dXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM0xvd2VyaW5nTWF0Y2hlci5wYXR0ZXJucwkod29ya2lu
ZyBjb3B5KQpAQCAtMCwwICsxLDQ0IEBACisjIENvcHlyaWdodCAoQykgMjAxNSBBcHBsZSBJbmMu
IEFsbCByaWdodHMgcmVzZXJ2ZWQuCisjCisjIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291
cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorIyBtb2RpZmljYXRpb24sIGFy
ZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyMgYXJl
IG1ldDoKKyMgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRo
ZSBhYm92ZSBjb3B5cmlnaHQKKyMgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBh
bmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorIyAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmlu
YXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorIyAgICBub3RpY2Us
IHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4g
dGhlCisjICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3
aXRoIHRoZSBkaXN0cmlidXRpb24uCisjCisjIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkg
QVBQTEUgSU5DLiBBTkQgSVRTIENPTlRSSUJVVE9SUyBgYEFTIElTJycKKyMgQU5EIEFOWSBFWFBS
RVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8s
CisjIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNT
IEZPUiBBIFBBUlRJQ1VMQVIKKyMgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQg
U0hBTEwgQVBQTEUgSU5DLiBPUiBJVFMgQ09OVFJJQlVUT1JTCisjIEJFIExJQUJMRSBGT1IgQU5Z
IERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKKyMg
Q09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJP
Q1VSRU1FTlQgT0YKKyMgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0Us
IERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTCisjIElOVEVSUlVQVElPTikgSE9XRVZFUiBD
QVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOCisjIENPTlRS
QUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBP
VEhFUldJU0UpCisjIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNP
RlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YKKyMgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFN
QUdFLgorCittYXRjaGVyIExvd2VyaW5nTWF0Y2hlcgorCisjIFRoZXNlIHJ1bGVzIGFyZSBjb25z
aWRlcmVkIGluIGEgY2FzY2FkZSwgc3RhcnRpbmcgYXQgdGhlIHRvcC4gSXQncyBpbXBsZW5lbnRl
ZCB1c2luZyBzd2l0Y2gKKyMgc3RhdGVtZW50cyB3aGVyZXZlciBwb3NzaWJsZS4KKworIyBOb3Rl
OiBhZGRpbmcgbW9yZSBydWxlcyB0byB0aGlzIG1hdGNoZXIgaXMgYW4gZXhjZWxsZW50IHdheSBv
ZiBpbXByb3ZpbmcgcGVyZm9ybWFuY2UhCisKK0xvYWQgPSBMb2FkKGFkZHJlc3MpCisKKyMgV2Ug
cHJvYmFibHkgZG9uJ3QgbmVlZCB0aGVzZSBmb3Jtcy4KK0FkZExvYWQxID0gQWRkKExvYWQoYWRk
cmVzcyksIHZhbHVlKQorQWRkTG9hZDIgPSBBZGQodmFsdWUsIExvYWQoYWRkcmVzcykpCitBZGQg
PSBBZGQobGVmdCwgcmlnaHQpCisKK1N0b3JlQWRkTG9hZDEgPSBTdG9yZShBZGQoTG9hZChhZGRy
ZXNzKSwgdmFsdWUpLCBhZGRyZXNzKQorU3RvcmVBZGRMb2FkMiA9IFN0b3JlKEFkZCh2YWx1ZSwg
TG9hZChhZGRyZXNzKSksIGFkZHJlc3MpCitTdG9yZUFuZExvYWQgPSBTdG9yZShBbmQoTG9hZChh
ZGRyZXNzKSwgdmFsdWUpLCBhZGRyZXNzKQorU3RvcmUgPSBTdG9yZSh2YWx1ZSwgYWRkcmVzcykK
KworUmV0dXJuID0gUmV0dXJuKHZhbHVlKQorCkluZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUv
YjMvQjNNZW1vcnlWYWx1ZS5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRDb3Jl
L2IzL0IzTWVtb3J5VmFsdWUuY3BwCShyZXZpc2lvbiAwKQorKysgU291cmNlL0phdmFTY3JpcHRD
b3JlL2IzL0IzTWVtb3J5VmFsdWUuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsNDIgQEAK
Ky8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTUgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVk
LgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9y
bXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3Zp
ZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVk
aXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmln
aHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dp
bmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0
IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBv
ZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBk
b2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlz
dHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5D
LiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElO
Q0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBP
RiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9T
RSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IKKyAqIENP
TlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFM
LCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xV
RElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBH
T09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBC
VVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisg
KiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9S
IFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4g
QU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJ
U0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKworI2luY2x1ZGUg
ImNvbmZpZy5oIgorI2luY2x1ZGUgIkIzTWVtb3J5VmFsdWUuaCIKKworbmFtZXNwYWNlIEpTQyB7
IG5hbWVzcGFjZSBCMyB7CisKK01lbW9yeVZhbHVlOjp+TWVtb3J5VmFsdWUoKQoreworfQorCit2
b2lkIE1lbW9yeVZhbHVlOjpkdW1wTWV0YShQcmludFN0cmVhbSYgb3V0KSBjb25zdAoreworICAg
IGlmIChtX29mZnNldCkKKyAgICAgICAgb3V0LnByaW50KCJvZmZzZXQgPSAiLCBtX29mZnNldCk7
Cit9CisKK30gfSAvLyBuYW1lc3BhY2UgSlNDOjpCMworCkluZGV4OiBTb3VyY2UvSmF2YVNjcmlw
dENvcmUvYjMvQjNNZW1vcnlWYWx1ZS5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0
Q29yZS9iMy9CM01lbW9yeVZhbHVlLmgJKHJldmlzaW9uIDApCisrKyBTb3VyY2UvSmF2YVNjcmlw
dENvcmUvYjMvQjNNZW1vcnlWYWx1ZS5oCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsMTQyIEBA
CisvKgorICogQ29weXJpZ2h0IChDKSAyMDE1IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZl
ZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZv
cm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92
aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJl
ZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJp
Z2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93
aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVz
dCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qg
b2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAg
ZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRp
c3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElO
Qy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJ
TkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMg
T0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBP
U0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SCisgKiBD
T05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRB
TCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNM
VURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUg
R09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1Ig
QlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQor
ICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBP
UiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElO
IEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURW
SVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisKKyNpZm5kZWYg
QjNNZW1vcnlWYWx1ZV9oCisjZGVmaW5lIEIzTWVtb3J5VmFsdWVfaAorCisjaW5jbHVkZSAiQjNW
YWx1ZS5oIgorCituYW1lc3BhY2UgSlNDIHsgbmFtZXNwYWNlIEIzIHsKKworY2xhc3MgTWVtb3J5
VmFsdWUgOiBwdWJsaWMgVmFsdWUgeworcHVibGljOgorICAgIHN0YXRpYyBib29sIGFjY2VwdHMo
T3Bjb2RlIG9wY29kZSkKKyAgICB7CisgICAgICAgIHN3aXRjaCAob3Bjb2RlKSB7CisgICAgICAg
IGNhc2UgTG9hZDhaOgorICAgICAgICBjYXNlIExvYWQ4UzoKKyAgICAgICAgY2FzZSBMb2FkMTZa
OgorICAgICAgICBjYXNlIExvYWQxNlM6CisgICAgICAgIGNhc2UgTG9hZEZsb2F0OgorICAgICAg
ICBjYXNlIExvYWQ6CisgICAgICAgIGNhc2UgU3RvcmU4OgorICAgICAgICBjYXNlIFN0b3JlMTY6
CisgICAgICAgIGNhc2UgU3RvcmVGbG9hdDoKKyAgICAgICAgY2FzZSBTdG9yZToKKyAgICAgICAg
ICAgIHJldHVybiB0cnVlOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuIGZh
bHNlOworICAgICAgICB9CisgICAgfQorCisgICAgfk1lbW9yeVZhbHVlKCk7CisKKyAgICBpbnRw
dHJfdCBvZmZzZXQoKSBjb25zdCB7IHJldHVybiBtX29mZnNldDsgfQorCitwcm90ZWN0ZWQ6Cisg
ICAgdm9pZCBkdW1wTWV0YShQcmludFN0cmVhbSYpIGNvbnN0IG92ZXJyaWRlOworCitwcml2YXRl
OgorICAgIGZyaWVuZCBjbGFzcyBQcm9jZWR1cmU7CisKKyAgICAvLyBVc2UgdGhpcyBmb3JtIGZv
ciBMb2FkIChidXQgbm90IExvYWQ4WiwgTG9hZDhTLCBvciBhbnkgb2YgdGhlIExvYWRzIHRoYXQg
aGF2ZSBhIHN1ZmZpeCB0aGF0CisgICAgLy8gZGVzY3JpYmVzIHRoZSByZXR1cm5lZCB0eXBlKS4K
KyAgICBNZW1vcnlWYWx1ZSgKKyAgICAgICAgdW5zaWduZWQgaW5kZXgsIE9wY29kZSBvcGNvZGUs
IFR5cGUgdHlwZSwgT3JpZ2luIG9yaWdpbiwgVmFsdWUqIHBvaW50ZXIsCisgICAgICAgIGludHB0
cl90IG9mZnNldCA9IDApCisgICAgICAgIDogVmFsdWUoaW5kZXgsIG9wY29kZSwgdHlwZSwgb3Jp
Z2luLCBwb2ludGVyKQorICAgICAgICAsIG1fb2Zmc2V0KG9mZnNldCkKKyAgICB7CisgICAgICAg
IGlmICghQVNTRVJUX0RJU0FCTEVEKSB7CisgICAgICAgICAgICBzd2l0Y2ggKG9wY29kZSkgewor
ICAgICAgICAgICAgY2FzZSBMb2FkOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAg
ICAgY2FzZSBMb2FkOFo6CisgICAgICAgICAgICBjYXNlIExvYWQ4UzoKKyAgICAgICAgICAgIGNh
c2UgTG9hZDE2WjoKKyAgICAgICAgICAgIGNhc2UgTG9hZDE2UzoKKyAgICAgICAgICAgICAgICBB
U1NFUlQodHlwZSA9PSBJbnQzMik7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAg
ICBjYXNlIExvYWRGbG9hdDoKKyAgICAgICAgICAgICAgICBBU1NFUlQodHlwZSA9PSBEb3VibGUp
OworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBTdG9yZTg6CisgICAg
ICAgICAgICBjYXNlIFN0b3JlMTY6CisgICAgICAgICAgICBjYXNlIFN0b3JlRmxvYXQ6CisgICAg
ICAgICAgICBjYXNlIFN0b3JlOgorICAgICAgICAgICAgICAgIEFTU0VSVCh0eXBlID09IFZvaWQp
OworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAg
ICAgICAgICBBU1NFUlRfTk9UX1JFQUNIRUQoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQor
ICAgIH0KKworICAgIC8vIFVzZSB0aGlzIGZvcm0gZm9yIGxvYWRzIHdoZXJlIHRoZSByZXR1cm4g
dHlwZSBpcyBpbXBsaWVkLgorICAgIE1lbW9yeVZhbHVlKHVuc2lnbmVkIGluZGV4LCBPcGNvZGUg
b3Bjb2RlLCBPcmlnaW4gb3JpZ2luLCBWYWx1ZSogcG9pbnRlciwgaW50cHRyX3Qgb2Zmc2V0ID0g
MCkKKyAgICAgICAgOiBWYWx1ZShpbmRleCwgb3Bjb2RlLCBvcGNvZGUgPT0gTG9hZEZsb2F0ID8g
RG91YmxlIDogSW50MzIsIG9yaWdpbiwgcG9pbnRlcikKKyAgICAgICAgLCBtX29mZnNldChvZmZz
ZXQpCisgICAgeworICAgICAgICBpZiAoIUFTU0VSVF9ESVNBQkxFRCkgeworICAgICAgICAgICAg
c3dpdGNoIChvcGNvZGUpIHsKKyAgICAgICAgICAgIGNhc2UgTG9hZDhaOgorICAgICAgICAgICAg
Y2FzZSBMb2FkOFM6CisgICAgICAgICAgICBjYXNlIExvYWQxNlo6CisgICAgICAgICAgICBjYXNl
IExvYWQxNlM6CisgICAgICAgICAgICBjYXNlIExvYWRGbG9hdDoKKyAgICAgICAgICAgICAgICBi
cmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgQVNTRVJUX05PVF9S
RUFDSEVEKCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAg
IH0KKyAgICB9CisKKyAgICAvLyBVc2UgdGhpcyBmb3JtIGZvciBzdG9yZXMuCisgICAgTWVtb3J5
VmFsdWUoCisgICAgICAgIHVuc2lnbmVkIGluZGV4LCBPcGNvZGUgb3Bjb2RlLCBPcmlnaW4gb3Jp
Z2luLCBWYWx1ZSogdmFsdWUsIFZhbHVlKiBwb2ludGVyLAorICAgICAgICBpbnRwdHJfdCBvZmZz
ZXQgPSAwKQorICAgICAgICA6IFZhbHVlKGluZGV4LCBvcGNvZGUsIFZvaWQsIG9yaWdpbiwgdmFs
dWUsIHBvaW50ZXIpCisgICAgICAgICwgbV9vZmZzZXQob2Zmc2V0KQorICAgIHsKKyAgICAgICAg
aWYgKCFBU1NFUlRfRElTQUJMRUQpIHsKKyAgICAgICAgICAgIHN3aXRjaCAob3Bjb2RlKSB7Cisg
ICAgICAgICAgICBjYXNlIFN0b3JlODoKKyAgICAgICAgICAgIGNhc2UgU3RvcmUxNjoKKyAgICAg
ICAgICAgIGNhc2UgU3RvcmVGbG9hdDoKKyAgICAgICAgICAgIGNhc2UgU3RvcmU6CisgICAgICAg
ICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIEFT
U0VSVF9OT1RfUkVBQ0hFRCgpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAg
fQorICAgICAgICB9CisgICAgfQorfTsKKworfSB9IC8vIG5hbWVzcGFjZSBKU0M6OkIzCisKKyNl
bmRpZiAvLyBCM01lbW9yeVZhbHVlX2gKKwpJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL2Iz
L0IzT3Bjb2RlLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNP
cGNvZGUuY3BwCShyZXZpc2lvbiAwKQorKysgU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzT3Bj
b2RlLmNwcAkod29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDQ3IEBACisvKgorICogQ29weXJpZ2h0
IChDKSAyMDE1IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3Ry
aWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhv
dXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xs
b3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBz
b3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2Us
IHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisg
KiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFi
b3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQg
dGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQv
b3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisg
KiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBB
TlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1Qg
TElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZ
IEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQu
ICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElB
QkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVY
RU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElN
SVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7
IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBU
SU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBX
SEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVE
SU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRI
RSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lC
SUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisKKyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNs
dWRlICJCM09wY29kZS5oIgorCisjaW5jbHVkZSA8d3RmL1ByaW50U3RyZWFtLmg+CisKK25hbWVz
cGFjZSBXVEYgeworCit1c2luZyBuYW1lc3BhY2UgSlNDOjpCMzsKKwordm9pZCBwcmludEludGVy
bmFsKFByaW50U3RyZWFtJiBvdXQsIE9wY29kZSBvcGNvZGUpCit7CisgICAgc3dpdGNoIChvcGNv
ZGUpIHsKKyAgICBjYXNlIElkZW50aXR5OgorICAgICAgICBvdXQucHJpbnQoIklkZW50aXR5Iik7
CisgICAgICAgIHJldHVybjsKKyAgICAgICAgLy8gRklYTUUKKyAgICB9CisgICAgUkVMRUFTRV9B
U1NFUlRfTk9UX1JFQUNIRUQoKTsKK30KKworfSAvLyBuYW1lc3BhY2UgV1RGCisKSW5kZXg6IFNv
dXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM09wY29kZS5oCj09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9K
YXZhU2NyaXB0Q29yZS9iMy9CM09wY29kZS5oCShyZXZpc2lvbiAwKQorKysgU291cmNlL0phdmFT
Y3JpcHRDb3JlL2IzL0IzT3Bjb2RlLmgJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSwyMDMgQEAK
Ky8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTUgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVk
LgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9y
bXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3Zp
ZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVk
aXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmln
aHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dp
bmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0
IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBv
ZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBk
b2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlz
dHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5D
LiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElO
Q0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBP
RiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9T
RSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IKKyAqIENP
TlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFM
LCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xV
RElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBH
T09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBC
VVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisg
KiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9S
IFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4g
QU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJ
U0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKworI2lmbmRlZiBC
M09wY29kZV9oCisjZGVmaW5lIEIzT3Bjb2RlX2gKKworI2luY2x1ZGUgPHd0Zi9TdGRMaWJFeHRy
YXMuaD4KKworbmFtZXNwYWNlIEpTQyB7IG5hbWVzcGFjZSBCMyB7CisKK2VudW0gT3Bjb2RlIDog
aW50MTZfdCB7CisgICAgLy8gQSBuby1vcCB0aGF0IHJldHVybnMgVm9pZCwgdXNlZnVsIGZvciB3
aGVuIHlvdSB3YW50IHRvIHJlbW92ZSBhIHZhbHVlLgorICAgIE5vcCwKKyAgICAgCisgICAgLy8g
UG9seW1vcnBoaWMgaWRlbnRpdHksIHVzYWJsZSB3aXRoIGFueSB2YWx1ZSB0eXBlLgorICAgIElk
ZW50aXR5LAorCisgICAgLy8gQ29uc3RhbnRzLiBVc2UgdGhlIENvbnN0VmFsdWUqIGNsYXNzZXMu
IENvbnN0YW50cyBleGlzdCBpbiB0aGUgY29udHJvbCBmbG93LCBzbyB0aGF0IHdlIGNhbgorICAg
IC8vIHJlYXNvbiBhYm91dCB3aGVyZSB3ZSB3b3VsZCBjb25zdHJ1Y3QgdGhlbS4gTGFyZ2UgY29u
c3RhbnRzIGFyZSBleHBlbnNpdmUgdG8gY3JlYXRlLgorICAgIENvbnN0MzIsCisgICAgQ29uc3Q2
NCwKKyAgICBDb25zdERvdWJsZSwKKworICAgIC8vIFRoZSBtYWdpY2FsIHN0YWNrIHNsb3QuIFRo
aXMgaXMgdmlld2VkIGFzIGV4ZWN1dGluZyBhdCB0aGUgdG9wIG9mIHRoZSBwcm9ncmFtIHJlZ2Fy
ZGxlc3Mgb2YKKyAgICAvLyB3aGVyZSBpbiBjb250cm9sIGZsb3cgeW91IHB1dCBpdC4gRWFjaCBp
bnN0YW5jZSBvZiBhIFN0YWNrU2xvdCBWYWx1ZSBnZXRzIGEgZGlzam9pbnQgcmFuZ2Ugb2YKKyAg
ICAvLyBzdGFjayBtZW1vcnkuIFVzZSB0aGUgU3RhY2tTbG90VmFsdWUgY2xhc3MuCisgICAgU3Rh
Y2tTbG90LAorCisgICAgLy8gVGhlIG1hZ2ljYWwgYXJndW1lbnQgcmVnaXN0ZXIuIFRoaXMgaXMg
dmlld2VkIGFzIGV4ZWN1dGluZyBhdCB0aGUgdG9wIG9mIHRoZSBwcm9ncmFtCisgICAgLy8gcmVn
YXJkbGVzcyBvZiB3aGVyZSBpbiBjb250cm9sIGZsb3cgeW91IHB1dCBpdCwgYW5kIHRoZSBjb21w
aWxlciB0YWtlcyBjYXJlIHRvIGVuc3VyZSB0aGF0IHdlCisgICAgLy8gZG9uJ3QgY2xvYmJlciB0
aGUgdmFsdWUgYnkgcmVnaXN0ZXIgYWxsb2NhdGlvbiBvciBjYWxscyAoZWl0aGVyIGJ5IHNhdmlu
ZyB0aGUgYXJndW1lbnQgdG8gdGhlCisgICAgLy8gc3RhY2sgb3IgcHJlc2VydmluZyBpdCBpbiBh
IGNhbGxlZS1zYXZlIHJlZ2lzdGVyKS4gVXNlIHRoZSBBcmd1bWVudFJlZ1ZhbHVlIGNsYXNzLiBU
aGUgcmV0dXJuCisgICAgLy8gdHlwZSBpcyBlaXRoZXIgcG9pbnRlcigpIChmb3IgR1BScykgb3Ig
RG91YmxlIChmb3IgRlBScykuCisgICAgQXJndW1lbnRSZWcsCisKKyAgICAvLyBUaGUgZnJhbWUg
cG9pbnRlci4gWW91IGNhbiBwdXQgdGhpcyBhbnl3aGVyZSBpbiBjb250cm9sIGZsb3cgYnV0IGl0
IHdpbGwgYWx3YXlzIHlpZWxkIHRoZQorICAgIC8vIGZyYW1lIHBvaW50ZXIsIHdpdGggYSBjYXZl
YXQ6IGlmIG91ciBjb21waWxlciBjaGFuZ2VzIHRoZSBmcmFtZSBwb2ludGVyIHRlbXBvcmFyaWx5
IGZvciBzb21lCisgICAgLy8gc2lsbHkgcmVhc29uLCB0aGUgRnJhbWVQb2ludGVyIGludHJpbnNp
YyB3aWxsIHJldHVybiB3aGVyZSB0aGUgZnJhbWUgcG9pbnRlciAqc2hvdWxkKiBiZSBub3QKKyAg
ICAvLyB3aGVyZSBpdCBoYXBwZW5zIHRvIGJlIHJpZ2h0IG5vdy4KKyAgICBGcmFtZVBvaW50ZXIs
CisKKyAgICAvLyBQb2x5bW9ycGhpYyBtYXRoLCB1c2FibGUgd2l0aCBhbnkgdmFsdWUgdHlwZS4K
KyAgICBBZGQsCisgICAgU3ViLAorICAgIE11bCwKKyAgICBEaXYsCisKKyAgICAvLyBJbnRlZ2Vy
IG1hdGguCisgICAgQ2hpbGxEaXYsIC8vIGRvZXNuJ3QgdHJhcCBldmVyLCBiZWhhdmVzIGxpa2Ug
SlMgKHgveSl8MC4KKyAgICBNb2QsCisgICAgQml0QW5kLAorICAgIEJpdE9yLAorICAgIEJpdFhv
ciwKKyAgICBTaGwsCisgICAgU1NociwKKyAgICBaU2hyLAorCisgICAgLy8gQ2FzdHMgYW5kIHN1
Y2guCisgICAgLy8gVGFrZXMgYW5kIHJldHVybnMgSW50MzI6CisgICAgU0V4dDgsCisgICAgU0V4
dDE2LAorICAgIC8vIFRha2VzIEludDMyIGFuZCByZXR1cm5zIEludDY0OgorICAgIFNFeHQzMiwK
KyAgICBaRXh0MzIsCisgICAgLy8gVGFrZXMgYW5kIHJldHVybnMgRG91YmxlOgorICAgIEZSb3Vu
ZCwKKyAgICAvLyBUYWtlcyBpbnRzIGFuZCByZXR1cm5zIERvdWJsZToKKyAgICBJVG9ELAorICAg
IC8vIFRha2VzIERvdWJsZSBhbmQgcmV0dXJucyBJbnQzMjoKKyAgICBEVG9JMzIsCisKKyAgICAv
LyBQb2x5bW9ycGhpYyBjb21wYXJpc29ucywgdXNhYmxlIHdpdGggYW55IHZhbHVlIHR5cGUuIFJl
dHVybnMgaW50MzIgMCBvciAxLiBOb3RlIHRoYXQgIk5vdCIKKyAgICAvLyBpcyBqdXN0IEVxdWFs
KHgsIDApLgorICAgIEVxdWFsLAorICAgIE5vdEVxdWFsLAorICAgIExlc3NUaGFuLAorICAgIEdy
ZWF0ZXJUaGFuLAorICAgIExlc3NFcXVhbCwKKyAgICBHcmVhdGVyRXF1YWwsCisKKyAgICAvLyBJ
bnRlZ2VyIGNvbXBhcmlzb25zLiBSZXR1cm5zIGludDMyIDAgb3IgMS4KKyAgICBBYm92ZSwKKyAg
ICBCZWxvdywKKyAgICBBYm92ZUVxdWFsCisgICAgQmVsb3dFcXVhbCwKKworICAgIC8vIE1lbW9y
eSBsb2Fkcy4gT3Bjb2RlIGluZGljYXRlcyBob3cgd2UgbG9hZCBhbmQgdGhlIGxvYWRlZCB0eXBl
LiBUaGVzZSB1c2UgTWVtb3J5VmFsdWUuCisgICAgLy8gVGhlc2UgcmV0dXJuIEludDMyOgorICAg
IExvYWQ4WiwKKyAgICBMb2FkOFMsCisgICAgTG9hZDE2WiwKKyAgICBMb2FkMTZTLAorICAgIC8v
IFRoaXMgcmV0dXJucyBEb3VibGU6CisgICAgTG9hZEZsb2F0LAorICAgIC8vIFRoaXMgcmV0dXJu
IHdoYXRldmVyIHRoZSByZXR1cm4gdHlwZSBpczoKKyAgICBMb2FkLAorCisgICAgLy8gTWVtb3J5
IHN0b3Jlcy4gT3Bjb2RlIGluZGljYXRlcyBob3cgdGhlIHZhbHVlIGlzIHN0b3JlZC4gVGhlc2Ug
dXNlIE1lbW9yeVZhbHVlLgorICAgIC8vIFRoZXNlIHRha2UgYW4gSW50MzIgdmFsdWU6CisgICAg
U3RvcmU4LAorICAgIFN0b3JlMTYsCisgICAgLy8gVGhpcyB0YWtlcyBhIERvdWJsZSB2YWx1ZToK
KyAgICBTdG9yZUZsb2F0LAorICAgIC8vIFRoaXMgaXMgYSBwb2x5bW9ycGhpYyBzdG9yZSBmb3Ig
SW50MzIsIEludDY0LCBhbmQgRG91YmxlOgorICAgIFN0b3JlLAorCisgICAgLy8gVGhpcyBpcyBh
IHJlZ3VsYXIgb3JkaW5hcnkgQyBmdW5jdGlvbiBjYWxsLCB1c2luZyB0aGUgc3lzdGVtIEMgY2Fs
bGluZyBjb252ZW50aW9uLiBNYWtlIHN1cmUKKyAgICAvLyB0aGF0IHRoZSBhcmd1bWVudHMgYXJl
IHBhc3NlZCB1c2luZyB0aGUgcmlnaHQgdHlwZXMuCisgICAgQ0NhbGwsCisKKyAgICAvLyBUaGlz
IGlzIGEgcGF0Y2hwb2ludC4gVXNlIHRoZSBQYXRjaHBvaW50VmFsdWUgY2xhc3MuIFRoaXMgaXMg
dmlld2VkIGFzIGJlaGF2aW5nIGxpa2UgYSBjYWxsLAorICAgIC8vIGJ1dCBvbmx5IGVtaXRzIGNv
ZGUgdmlhIGEgY29kZSBnZW5lcmF0aW9uIGNhbGxiYWNrLiBUaGF0IGNhbGxiYWNrIGdldHMgdG8g
ZW1pdCBjb2RlIGlubGluZS4KKyAgICAvLyBZb3UgY2FuIHBhc3MgYSBzdGFja21hcCBhbG9uZyB3
aXRoIGNvbnN0cmFpbnRzIG9uIGhvdyBlYWNoIHN0YWNrbWFwIGFyZ3VtZW50IG11c3QgYmUgcGFz
c2VkLgorICAgIC8vIEl0J3MgbGVnYWwgdG8gcmVxdWVzdCB0aGF0IGEgc3RhY2ttYXAgYXJndW1l
bnQgaXMgaW4gc29tZSByZWdpc3RlciBhbmQgaXQncyBsZWdhbCB0byByZXF1ZXN0CisgICAgLy8g
dGhhdCBhIHN0YWNrbWFwIGFyZ3VtZW50IGlzIGF0IHNvbWUgb2Zmc2V0IGZyb20gdGhlIHRvcCBv
ZiB0aGUgYXJndW1lbnQgcGFzc2luZyBhcmVhIG9uIHRoZQorICAgIC8vIHN0YWNrLgorICAgIFBh
dGNocG9pbnQsCisKKyAgICAvLyBDaGVja2VkIG1hdGguIFVzZSB0aGUgQ2hlY2tWYWx1ZSBjbGFz
cy4gTGlrZSBhIFBhdGNocG9pbnQsIHRoaXMgdGFrZXMgYSBjb2RlIGdlbmVyYXRpb24KKyAgICAv
LyBjYWxsYmFjay4gVGhhdCBjYWxsYmFjayBnZXRzIHRvIGVtaXQgc29tZSBjb2RlIGFmdGVyIHRo
ZSBlcGlsb2d1ZSwgYW5kIGdldHMgdG8gbGluayB0aGUganVtcAorICAgIC8vIGZyb20gdGhlIGNo
ZWNrLCBhbmQgdGhlIGNob2ljZSBvZiByZWdpc3RlcnMuIFlvdSBhbHNvIGdldCB0byBzdXBwbHkg
YSBzdGFja21hcC4gTm90ZSB0aGF0IHlvdQorICAgIC8vIGFyZSBub3QgYWxsb3dlZCB0byBqdW1w
IGJhY2sgaW50byB0aGUgbWFpbmxpbmUgY29kZSBmcm9tIHlvdXIgc2xvdyBwYXRoLCBzaW5jZSB0
aGUgY29tcGlsZXIKKyAgICAvLyB3aWxsIGFzc3VtZSB0aGF0IHRoZSBleGVjdXRpb24gb2YgdGhl
c2UgaW5zdHJ1Y3Rpb25zIHByb3ZlcyB0aGF0IG92ZXJmbG93IGRpZG4ndCBoYXBwZW4uIEZvcgor
ICAgIC8vIGV4YW1wbGUsIGlmIHlvdSBoYXZlIHR3byBDaGVja0FkZCdzOgorICAgIC8vCisgICAg
Ly8gYSA9IENoZWNrQWRkKHgsIHkpCisgICAgLy8gYiA9IENoZWNrQWRkKHgsIHkpCisgICAgLy8K
KyAgICAvLyBUaGVuIGl0J3MgdmFsaWQgdG8gY2hhbmdlIHRoaXMgdG86CisgICAgLy8KKyAgICAv
LyBhID0gQ2hlY2tBZGQoeCwgeSkKKyAgICAvLyBiID0gSWRlbnRpdHkoYSkKKyAgICAvLworICAg
IC8vIFRoaXMgaXMgdmFsaWQgcmVnYXJkbGVzcyBvZiB0aGUgY2FsbGJhY2tzIHVzZWQgYnkgdGhl
IHR3byBDaGVja0FkZHMuIFRoZXkgbWF5IGhhdmUgZGlmZmVyZW50CisgICAgLy8gY2FsbGJhY2tz
LiBZZXQsIHRoaXMgdHJhbnNmb3JtYXRpb24gaXMgdmFsaWQgZXZlbiBpZiB0aGV5IGFyZSBkaWZm
ZXJlbnQgYmVjYXVzZSB3ZSBrbm93IHRoYXQKKyAgICAvLyBhZnRlciB0aGUgZmlyc3QgQ2hlY2tB
ZGQgZXhlY3V0ZXMsIHRoZSBzZWNvbmQgQ2hlY2tBZGQgY291bGQgbm90IGhhdmUgcG9zc2libHkg
dGFrZW4gc2xvdworICAgIC8vIHBhdGguIFRoZXJlZm9yZSwgdGhlIHNlY29uZCBDaGVja0FkZCdz
IGNhbGxiYWNrIGlzIGlycmVsZXZhbnQuCisgICAgQ2hlY2tBZGQsCisgICAgQ2hlY2tTdWIsCisg
ICAgQ2hlY2tNdWwsCisKKyAgICAvLyBDaGVjayB0aGF0IHNpZGUtZXhpdHMuIFVzZSB0aGUgQ2hl
Y2tWYWx1ZSBjbGFzcy4gTGlrZSBDaGVja0FkZCBhbmQgZnJpZW5kcywgdGhpcyBoYXMgYQorICAg
IC8vIHN0YWNrbWFwIHdpdGggYSBnZW5lcmF0aW9uIGNhbGxiYWNrLiBUaGlzIHRha2VzIGFuIElu
dDMyIGFyZ3VtZW50IHRoYXQgdGhpcyBicmFuY2hlcyBvbiwgd2l0aAorICAgIC8vIGZ1bGwgYnJh
bmNoIGZ1c2lvbiBpbiB0aGUgaW5zdHJ1Y3Rpb24gc2VsZWN0b3IuIEEgdHJ1ZSB2YWx1ZSBqdW1w
cyB0byB0aGUgZ2VuZXJhdG9yJ3Mgc2xvdworICAgIC8vIHBhdGguCisgICAgQ2hlY2ssCisKKyAg
ICAvLyBTU0Egc3VwcG9ydCwgaW4gdGhlIHN0eWxlIG9mIERGRyBTU0EuCisgICAgVXBzaWxvbiwg
Ly8gVGhpcyB1c2VzIHRoZSBVcHNpbG9uVmFsdWUgY2xhc3MuCisgICAgUGhpLAorCisgICAgLy8g
SnVtcC4gVXNlcyB0aGUgQ29udHJvbFZhbHVlIGNsYXNzLgorICAgIEp1bXAsCisgICAgCisgICAg
Ly8gUG9seW1vcnBoaWMgYnJhbmNoLCB1c2FibGUgd2l0aCBhbnkgdmFsdWUgdHlwZS4gQnJhbmNo
ZXMgaWYgbm90IGVxdWFsIHRvIHplcm8uIFVzZXMgdGhlCisgICAgLy8gQ29udHJvbFZhbHVlIGNs
YXNzLCB3aXRoIHRoZSAwLWluZGV4IHN1Y2Nlc3NvciBiZWluZyB0aGUgdHJ1ZSBzdWNjZXNzb3Iu
CisgICAgQnJhbmNoLAorCisgICAgLy8gU3dpdGNoLiBTd2l0Y2hlcyBvdmVyIGVpdGhlciBJbnQz
MiBvciBJbnQ2NC4gVXNlcyB0aGUgU3dpdGNoVmFsdWUgY2xhc3MuCisgICAgU3dpdGNoLAorCisg
ICAgLy8gUmV0dXJuLiBOb3RlIHRoYXQgQjMgcHJvY2VkdXJlcyBkb24ndCBrbm93IHRoZWlyIHJl
dHVybiB0eXBlLCBzbyB0aGlzIGNhbiBqdXN0IHJldHVybiBhbnkKKyAgICAvLyB0eXBlLiBVc2Vz
IHRoZSBDb250cm9sVmFsdWUgY2xhc3MuCisgICAgUmV0dXJuLAorCisgICAgLy8gVGhpcyBpcyBh
IHRlcm1pbmFsIHRoYXQgaW5kaWNhdGVzIHRoYXQgd2Ugd2lsbCBuZXZlciBnZXQgaGVyZS4gVXNl
cyB0aGUgQ29udHJvbFZhbHVlIGNsYXNzLgorICAgIE9vcHMKK307CisKK30gfSAvLyBuYW1lc3Bh
Y2UgSlNDOjpCMworCituYW1lc3BhY2UgV1RGIHsKKworY2xhc3MgUHJpbnRTdHJlYW07CisKK3Zv
aWQgcHJpbnRJbnRlcm5hbChQcmludFN0cmVhbSYsIEpTQzo6QjM6Ok9wY29kZSk7CisKK30gLy8g
bmFtZXNwYWNlIFdURgorCisjZW5kaWYgLy8gQjNPcGNvZGVfaAorCkluZGV4OiBTb3VyY2UvSmF2
YVNjcmlwdENvcmUvYjMvQjNPcmlnaW4uY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2Ny
aXB0Q29yZS9iMy9CM09yaWdpbi5jcHAJKHJldmlzaW9uIDApCisrKyBTb3VyY2UvSmF2YVNjcmlw
dENvcmUvYjMvQjNPcmlnaW4uY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsMzcgQEAKKy8q
CisgKiBDb3B5cmlnaHQgKEMpIDIwMTUgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgor
ICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMs
IHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVk
IHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0
cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQK
KyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcg
ZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJl
cHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBj
b25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1
bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJp
YnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBg
YEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xV
RElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBN
RVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBB
UkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IKKyAqIENPTlRS
SUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBT
UEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElO
RywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09E
UyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJ
TkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBP
RiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRP
UlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5Z
IFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VE
IE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKworI2luY2x1ZGUgImNv
bmZpZy5oIgorI2luY2x1ZGUgIkIzT3JpZ2luLmgiCisKK25hbWVzcGFjZSBKU0MgeyBuYW1lc3Bh
Y2UgQjMgeworCit2b2lkIE9yaWdpbjo6ZHVtcChQcmludFN0cmVhbSYgb3V0KSBjb25zdAorewor
ICAgIG91dC5wcmludCgiT3JpZ2luKCIsIFJhd1BvaW50ZXIobV9kYXRhKSwgIikiKTsKK30KKwor
fSB9IC8vIG5hbWVzcGFjZSBKU0M6OkIzCisKSW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9i
My9CM09yaWdpbi5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM09y
aWdpbi5oCShyZXZpc2lvbiAwKQorKysgU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzT3JpZ2lu
LmgJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSw1NSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykg
MjAxNSBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRp
b24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Cisg
KiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5n
IGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNl
IGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlz
IGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4g
UmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBj
b3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBm
b2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90
aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJ
UyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisg
KiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlU
RUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQg
RklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4g
Tk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBG
T1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExB
UlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQg
VE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NT
IE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikg
SE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhF
UiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBO
RUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNF
CisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZ
IE9GIFNVQ0ggREFNQUdFLiAKKyAqLworCisjaWZuZGVmIEIzT3JpZ2luX2gKKyNkZWZpbmUgQjNP
cmlnaW5faAorCisjaW5jbHVkZSA8d3RmL1ByaW50U3RyZWFtLmg+CisKK25hbWVzcGFjZSBKU0Mg
eyBuYW1lc3BhY2UgQjMgeworCisvLyBXaG9ldmVyIGdlbmVyYXRlcyBCM0lSIGNhbiBjaG9vc2Ug
dG8gcHV0IG9yaWdpbnMgb24gdmFsdWVzLiBXaGVuIHlvdSBkbyB0aGlzLCBCMyB3aWxsIGJlIGFi
bGUgdG8KKy8vIGFjY291bnQsIGRvd24gdG8gdGhlIG1hY2hpbmUgY29kZSwgd2hpY2ggaW5zdHJ1
Y3Rpb24gY29ycmVzcG9uZHMgdG8gd2hpY2ggb3JpZ2luLiBCMworLy8gdHJhbnNmb3JtYXRpb25z
IG11c3QgcHJlc2VydmUgT3JpZ2lucyBjYXJlZnVsbHkuIEl0J3MgYW4gZXJyb3IgdG8gd3JpdGUg
YSB0cmFuc2Zvcm1hdGlvbiB0aGF0CisvLyBlaXRoZXIgZHJvcHMgT3JpZ2lucyBvciBsaWVzIGFi
b3V0IHRoZW0uCitjbGFzcyBPcmlnaW4geworcHVibGljOgorICAgIGV4cGxpY2l0IE9yaWdpbihj
b25zdCB2b2lkKiBkYXRhID0gbnVsbHB0cikKKyAgICAgICAgOiBtX2RhdGEoZGF0YSkKKyAgICB7
CisgICAgfQorCisgICAgY29uc3Qgdm9pZCogZGF0YSgpIGNvbnN0IHsgcmV0dXJuIG1fZGF0YTsg
fQorCisgICAgdm9pZCBkdW1wKFByaW50U3RyZWFtJikgY29uc3Q7CisgICAgCitwcml2YXRlOgor
ICAgIGNvbnN0IHZvaWQqIG1fZGF0YTsKK307CisKK30gfSAvLyBuYW1lc3BhY2UgSlNDOjpCMwor
CisjZW5kaWYgLy8gQjNPcmlnaW5faAorCkluZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMv
QjNQYXRjaHBvaW50VmFsdWUuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29y
ZS9iMy9CM1BhdGNocG9pbnRWYWx1ZS5jcHAJKHJldmlzaW9uIDApCisrKyBTb3VyY2UvSmF2YVNj
cmlwdENvcmUvYjMvQjNQYXRjaHBvaW50VmFsdWUuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAg
KzEsNDMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTUgQXBwbGUgSW5jLiBBbGwgcmlnaHRz
IHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBi
aW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0
dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0Ogor
ICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92
ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRo
ZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkg
Zm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRo
aXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhl
CisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0
aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkg
QVBQTEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJB
TlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FS
UkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgor
ICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4g
T1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJ
TkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFH
RVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VC
U1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9G
SVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkg
VEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFC
SUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFS
SVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZF
TiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKwor
I2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgIkIzUGF0Y2hwb2ludFZhbHVlLmgiCisKKyNp
bmNsdWRlIDx3dGYvQ29tbWFQcmludGVyLmg+CisKK25hbWVzcGFjZSBKU0MgeyBuYW1lc3BhY2Ug
QjMgeworCitQYXRjaHBvaW50VmFsdWU6On5QYXRjaHBvaW50VmFsdWUoKQoreworfQorCit2b2lk
IFBhdGNocG9pbnRWYWx1ZTo6ZHVtcE1ldGEoUHJpbnRTdHJlYW0mIG91dCkgY29uc3QKK3sKKyAg
ICBvdXQucHJpbnQoInN0YWNrbWFwID0gIiwgc3RhY2ttYXApOworfQorCit9IH0gLy8gbmFtZXNw
YWNlIEpTQzo6QjMKKwpJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzUGF0Y2hwb2lu
dFZhbHVlLmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzUGF0Y2hw
b2ludFZhbHVlLmgJKHJldmlzaW9uIDApCisrKyBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNQ
YXRjaHBvaW50VmFsdWUuaAkod29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDU3IEBACisvKgorICog
Q29weXJpZ2h0IChDKSAyMDE1IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisg
KiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRo
IG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0
IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0
aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAg
ICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2Ns
YWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1
Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0
aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRh
dGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlv
bi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gYGBBUyBJ
UycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcs
IEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hB
TlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJ
U0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SCisgKiBDT05UUklCVVRP
UlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lB
TCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJV
VCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1Ig
U0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1Mg
SU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElB
QklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisg
KiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkg
T1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBU
SEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisKKyNpZm5kZWYgQjNQYXRjaHBv
aW50VmFsdWVfaAorI2RlZmluZSBCM1BhdGNocG9pbnRWYWx1ZV9oCisKKyNpbmNsdWRlICJCM1Zh
bHVlLmgiCisjaW5jbHVkZSAiQjNTdGFja21hcC5oIgorCituYW1lc3BhY2UgSlNDIHsgbmFtZXNw
YWNlIEIzIHsKKworY2xhc3MgUGF0Y2hwb2ludFZhbHVlIDogcHVibGljIFZhbHVlIHsKK3B1Ymxp
YzoKKyAgICBzdGF0aWMgYm9vbCBhY2NlcHRzKE9wY29kZSBvcGNvZGUpIHsgcmV0dXJuIG9wY29k
ZSA9PSBQYXRjaHBvaW50OyB9CisKKyAgICB+UGF0Y2hwb2ludFZhbHVlKCk7CisKKyAgICBTdGFj
a21hcCBzdGFja21hcDsKKworcHJvdGVjdGVkOgorICAgIHZvaWQgZHVtcE1ldGEoUHJpbnRTdHJl
YW0mKSBjb25zdCBvdmVycmlkZTsKKworcHJpdmF0ZToKKyAgICBmcmllbmQgY2xhc3MgUHJvY2Vk
dXJlOworCisgICAgUGF0Y2hwb2ludFZhbHVlKHVuc2lnbmVkIGluZGV4LCBUeXBlIHR5cGUsIE9y
aWdpbiBvcmlnaW4sIGNvbnN0IEFkamFjZW5jeUxpc3QmIGNoaWxkcmVuKQorICAgICAgICA6IFZh
bHVlKGluZGV4LCBQYXRjaHBvaW50LCB0eXBlLCBvcmlnaW4sIGNoaWxkcmVuKQorICAgIHsKKyAg
ICB9Cit9OworCit9IH0gLy8gbmFtZXNwYWNlIEpTQzo6QjMKKworI2VuZGlmIC8vIEIzUGF0Y2hw
b2ludFZhbHVlX2gKKwpJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzUHJvY2VkdXJl
LmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNQcm9jZWR1cmUu
Y3BwCShyZXZpc2lvbiAwKQorKysgU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzUHJvY2VkdXJl
LmNwcAkod29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDU2IEBACisvKgorICogQ29weXJpZ2h0IChD
KSAyMDE1IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1
dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQK
KyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dp
bmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3Vy
Y2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRo
aXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAy
LiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3Zl
IGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhl
IGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Ig
b3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBU
SElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkK
KyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElN
SVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFO
RCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJ
TiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxF
IEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1Q
TEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRF
RCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExP
U1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9O
KSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVU
SEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5H
IE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBV
U0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJ
VFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisKKyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRl
ICJCM1Byb2NlZHVyZS5oIgorCisjaW5jbHVkZSAiQjNCYXNpY0Jsb2NrLmgiCisjaW5jbHVkZSAi
QjNWYWx1ZS5oIgorCituYW1lc3BhY2UgSlNDIHsgbmFtZXNwYWNlIEIzIHsKKworUHJvY2VkdXJl
OjpQcm9jZWR1cmUoKQoreworfQorCitQcm9jZWR1cmU6On5Qcm9jZWR1cmUoKQoreworfQorCitC
YXNpY0Jsb2NrKiBQcm9jZWR1cmU6OmFkZEJsb2NrKCkKK3sKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8
QmFzaWNCbG9jaz4gYmxvY2sgPSBzdGQ6Om1ha2VfdW5pcXVlPEJhc2ljQmxvY2s+KG1fYmxvY2tz
LnNpemUoKSk7CisgICAgQmFzaWNCbG9jayogcmVzdWx0ID0gYmxvY2suZ2V0KCk7CisgICAgbV9i
bG9ja3MuYXBwZW5kKFdURjo6bW92ZShibG9jaykpOworICAgIHJldHVybiByZXN1bHQ7Cit9CisK
K3ZvaWQgUHJvY2VkdXJlOjpkdW1wKFByaW50U3RyZWFtJiBvdXQpIGNvbnN0Cit7CisgICAgZm9y
IChCYXNpY0Jsb2NrKiBibG9jayA6ICp0aGlzKQorICAgICAgICBvdXQucHJpbnQoZGVlcER1bXAo
YmxvY2spKTsKK30KKworfSB9IC8vIG5hbWVzcGFjZSBKU0M6OkIzCkluZGV4OiBTb3VyY2UvSmF2
YVNjcmlwdENvcmUvYjMvQjNQcm9jZWR1cmUuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNj
cmlwdENvcmUvYjMvQjNQcm9jZWR1cmUuaAkocmV2aXNpb24gMCkKKysrIFNvdXJjZS9KYXZhU2Ny
aXB0Q29yZS9iMy9CM1Byb2NlZHVyZS5oCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsMTc3IEBA
CisvKgorICogQ29weXJpZ2h0IChDKSAyMDE1IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZl
ZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZv
cm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92
aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJl
ZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJp
Z2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93
aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVz
dCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qg
b2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAg
ZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRp
c3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElO
Qy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJ
TkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMg
T0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBP
U0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SCisgKiBD
T05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRB
TCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNM
VURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUg
R09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1Ig
QlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQor
ICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBP
UiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElO
IEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURW
SVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisKKyNpZm5kZWYg
QjNQcm9jZWR1cmVfaAorI2RlZmluZSBCM1Byb2NlZHVyZV9oCisKKyNpbmNsdWRlIDx3dGYvQmFn
Lmg+CisjaW5jbHVkZSA8d3RmL0Zhc3RNYWxsb2MuaD4KKyNpbmNsdWRlIDx3dGYvTm9uY29weWFi
bGUuaD4KKyNpbmNsdWRlIDx3dGYvVmVjdG9yLmg+CisKK25hbWVzcGFjZSBKU0MgeyBuYW1lc3Bh
Y2UgQjMgeworCitjbGFzcyBCYXNpY0Jsb2NrOworY2xhc3MgVmFsdWU7CisKK2NsYXNzIFByb2Nl
ZHVyZSB7CisgICAgV1RGX01BS0VfTk9OQ09QWUFCTEUoUHJvY2VkdXJlKTsKKyAgICBXVEZfTUFL
RV9GQVNUX0FMTE9DQVRFRDsKK3B1YmxpYzoKKworICAgIFByb2NlZHVyZSgpOworICAgIH5Qcm9j
ZWR1cmUoKTsKKworICAgIEJhc2ljQmxvY2sqIGFkZEJsb2NrKCk7CisgICAgCisgICAgdGVtcGxh
dGU8dHlwZW5hbWUgVmFsdWVUeXBlLCB0eXBlbmFtZS4uLiBBcmd1bWVudHM+CisgICAgVmFsdWVU
eXBlKiBhZGQoQXJndW1lbnRzLi4uKTsKKworICAgIHZvaWQgZHVtcChQcmludFN0cmVhbSYpIGNv
bnN0OworCisgICAgdW5zaWduZWQgc2l6ZSgpIGNvbnN0IHsgcmV0dXJuIG1fYmxvY2tzLnNpemUo
KTsgfQorICAgIEJhc2ljQmxvY2sqIGF0KHVuc2lnbmVkIGluZGV4KSBjb25zdCB7IHJldHVybiBt
X2Jsb2Nrc1tpbmRleF07IH0KKyAgICBCYXNpY0Jsb2NrKiBvcGVyYXRvcltdKHVuc2lnbmVkIGlu
ZGV4KSBjb25zdCB7IHJldHVybiBhdChpbmRleCk7IH0KKworICAgIGNsYXNzIGl0ZXJhdG9yIHsK
KyAgICBwdWJsaWM6CisgICAgICAgIGl0ZXJhdG9yKCk6CisgICAgICAgICAgICA6IG1fcHJvY2Vk
dXJlKG51bGxwdHIpCisgICAgICAgICAgICAsIG1faW5kZXgoMCkKKyAgICAgICAgeworICAgICAg
ICB9CisKKyAgICAgICAgaXRlcmF0b3IoUHJvY2VkdXJlJiBwcm9jZWR1cmUsIHVuc2lnbmVkIGlu
ZGV4KQorICAgICAgICAgICAgOiBtX3Byb2NlZHVyZSgmcHJvY2VkdXJlKQorICAgICAgICAgICAg
LCBtX2luZGV4KGluZGV4KQorICAgICAgICB7CisgICAgICAgIH0KKworICAgICAgICBCYXNpY0Js
b2NrKiBvcGVyYXRvciooKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gbV9wcm9jZWR1
cmUtPmF0KG1faW5kZXgpOworICAgICAgICB9CisKKyAgICAgICAgaXRlcmF0b3ImIG9wZXJhdG9y
KysoKQorICAgICAgICB7CisgICAgICAgICAgICBtX2luZGV4ID0gZmluZE5leHQobV9pbmRleCAr
IDEpOworICAgICAgICAgICAgcmV0dXJuICp0aGlzOworICAgICAgICB9CisKKyAgICAgICAgYm9v
bCBvcGVyYXRvcj09KGNvbnN0IGl0ZXJhdG9yJiBvdGhlcikgY29uc3QKKyAgICAgICAgeworICAg
ICAgICAgICAgcmV0dXJuIG1faW5kZXggPT0gb3RoZXIubV9pbmRleDsKKyAgICAgICAgfQorCisg
ICAgICAgIGJvb2wgb3BlcmF0b3IhPShjb25zdCBpdGVyYXRvciYgb3RoZXIpIGNvbnN0CisgICAg
ICAgIHsKKyAgICAgICAgICAgIHJldHVybiAhKCp0aGlzID09IG90aGVyKTsKKyAgICAgICAgfQor
CisgICAgcHJpdmF0ZToKKyAgICAgICAgdW5zaWduZWQgZmluZE5leHQodW5zaWduZWQgaW5kZXgp
CisgICAgICAgIHsKKyAgICAgICAgICAgIHdoaWxlIChpbmRleCA8IG1fcHJvY2VkdXJlLT5zaXpl
KCkgJiYgIW1fcHJvY2VkdXJlLT5hdChpbmRleCkpCisgICAgICAgICAgICAgICAgaW5kZXgrKzsK
KyAgICAgICAgICAgIHJldHVybiBpbmV4OworICAgICAgICB9CisKKyAgICAgICAgUHJvY2VkdXJl
KiBtX3Byb2NlZHVyZTsKKyAgICAgICAgdW5zaWduZWQgbV9pbmRleDsKKyAgICB9OworCisgICAg
aXRlcmF0b3IgYmVnaW4oKSBjb25zdCB7IHJldHVybiBpdGVyYXRvcigqdGhpcywgMCk7IH0KKyAg
ICBpdGVyYXRvciBlbmQoKSBjb25zdCB7IHJldHVybiBpdGVyYXRvcigqdGhpcywgbnVtQmxvY2tz
KCkpOyB9CisKKyAgICBjbGFzcyBWYWx1ZXNDb2xsZWN0aW9uIHsKKyAgICBwdWJsaWM6CisgICAg
ICAgIFZhbHVlc0NvbGxlY3Rpb24oUHJvY2VkdXJlJiBwcm9jZWR1cmUpCisgICAgICAgICAgICA6
IG1fcHJvY2VkdXJlKHByb2NlZHVyZSkKKyAgICAgICAgeworICAgICAgICB9CisKKyAgICAgICAg
Y2xhc3MgaXRlcmF0b3IgeworICAgICAgICBwdWJsaWM6CisgICAgICAgICAgICBpdGVyYXRvcigp
OgorICAgICAgICAgICAgICAgIDogbV9wcm9jZWR1cmUobnVsbHB0cikKKyAgICAgICAgICAgICAg
ICAsIG1faW5kZXgoMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKworICAgICAgICAg
ICAgaXRlcmF0b3IoUHJvY2VkdXJlJiBwcm9jZWR1cmUsIHVuc2lnbmVkIGluZGV4KQorICAgICAg
ICAgICAgICAgIDogbV9wcm9jZWR1cmUoJnByb2NlZHVyZSkKKyAgICAgICAgICAgICAgICAsIG1f
aW5kZXgoaW5kZXgpCisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAg
IFZhbHVlKiBvcGVyYXRvciooKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVy
biBtX3Byb2NlZHVyZS0+YmxvY2sobV9pbmRleCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAg
ICAgIGl0ZXJhdG9yJiBvcGVyYXRvcisrKCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAg
ICBtX2luZGV4Kys7CisgICAgICAgICAgICAgICAgcmV0dXJuICp0aGlzOworICAgICAgICAgICAg
fQorCisgICAgICAgICAgICBib29sIG9wZXJhdG9yPT0oY29uc3QgaXRlcmF0b3ImIG90aGVyKSBj
b25zdAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBtX2luZGV4ID09IG90
aGVyLm1faW5kZXg7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGJvb2wgb3BlcmF0b3Ih
PShjb25zdCBpdGVyYXRvciYgb3RoZXIpIGNvbnN0CisgICAgICAgICAgICB7CisgICAgICAgICAg
ICAgICAgcmV0dXJuICEoKnRoaXMgPT0gb3RoZXIpOworICAgICAgICAgICAgfQorCisgICAgICAg
IHByaXZhdGU6CisKKyAgICAgICAgICAgIFByb2NlZHVyZSogbV9wcm9jZWR1cmU7CisgICAgICAg
ICAgICB1bnNpZ25lZCBtX2luZGV4OworICAgICAgICB9OworCisgICAgICAgIGl0ZXJhdG9yIGJl
Z2luKCkgY29uc3QgeyByZXR1cm4gaXRlcmF0b3IobV9wcm9jZWR1cmUsIDApOyB9CisgICAgICAg
IGl0ZXJhdG9yIGVuZCgpIGNvbnN0IHsgcmV0dXJuIGl0ZXJhdG9yKG1fcHJvY2VkdXJlLCBtX3By
b2NlZHVyZS5tX3ZhbHVlcy5zaXplKCkpOyB9CisKKyAgICAgICAgdW5zaWduZWQgc2l6ZSgpIGNv
bnN0IHsgcmV0dXJuIG1fcHJvY2VkdXJlLm1fdmFsdWVzLnNpemUoKTsgfQorICAgICAgICBWYWx1
ZSogYXQodW5zaWduZWQgaW5kZXgpIGNvbnN0IHsgcmV0dXJuIG1fcHJvY2VkdXJlLm1fdmFsdWVz
W2luZGV4XTsgfQorICAgICAgICBWYWx1ZSogb3BlcmF0b3JbXSh1bnNpZ25lZCBpbmRleCkgY29u
c3QgeyByZXR1cm4gYXQoaW5kZXgpOyB9CisgICAgICAgIAorICAgIHByaXZhdGU6CisgICAgICAg
IFByb2NlZHVyZSYgbV9wcm9jZWR1cmU7CisgICAgfTsKKworICAgIFZhbHVlc0NvbGxlY3Rpb24g
dmFsdWVzKCkgeyByZXR1cm4gVmFsdWVzQ29sbGVjdGlvbigqdGhpcyk7IH0KKworcHJpdmF0ZToK
KyAgICBWZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEJhc2ljQmxvY2s+PiBtX2Jsb2NrczsKKyAgICBW
ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPFZhbHVlPj4gbV92YWx1ZXM7Cit9OworCit9IH0gLy8gbmFt
ZXNwYWNlIEpTQzo6QjMKKworI2VuZGlmIC8vIEIzUHJvY2VkdXJlX2gKKwpJbmRleDogU291cmNl
L0phdmFTY3JpcHRDb3JlL2IzL0IzUHJvY2VkdXJlSW5saW5lcy5oCj09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNv
dXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM1Byb2NlZHVyZUlubGluZXMuaAkocmV2aXNpb24gMCkK
KysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM1Byb2NlZHVyZUlubGluZXMuaAkod29ya2lu
ZyBjb3B5KQpAQCAtMCwwICsxLDQ2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE1IEFwcGxl
IEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNl
IGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNh
dGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9u
cworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0
IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBj
b25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1
dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAor
ICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBk
aXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJp
YWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJF
IElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1Mg
T1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhF
CisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZP
UiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBT
SEFMTCBBUFBMRSBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElS
RUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09O
U0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBS
T0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBE
QVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENB
VVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRS
QUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0Ug
T1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRI
SVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBE
QU1BR0UuIAorICovCisKKyNpZm5kZWYgQjNQcm9jZWR1cmVJbmxpbmVzX2gKKyNkZWZpbmUgQjNQ
cm9jZWR1cmVJbmxpbmVzX2gKKworI2luY2x1ZGUgIkIzQmFzaWNCbG9jay5oIgorI2luY2x1ZGUg
IkIzUHJvY2VkdXJlLmgiCisKK25hbWVzcGFjZSBKU0MgeyBuYW1lc3BhY2UgQjMgeworCit0ZW1w
bGF0ZTx0eXBlbmFtZSBWYWx1ZVR5cGUsIHR5cGVuYW1lLi4uIEFyZ3VtZW50cz4KK1ZhbHVlVHlw
ZSogUHJvY2VkdXJlOjphZGQoQXJndWVudHMuLi4gYXJndW1lbnRzKQoreworICAgIHN0ZDo6dW5p
cXVlX3B0cjxWYWx1ZVR5cGU+IHZhbHVlKG5ldyBWYWx1ZVR5cGUobV92YWx1ZXMuc2l6ZSgpLCBh
cmd1bWVudHMuLi4pKTsKKyAgICBWYWx1ZVR5cGUqIHJlc3VsdCA9IHZhbHVlLmdldCgpOworICAg
IG1fdmFsdWVzLmFwcGVuZChXVEY6Om1vdmUodmFsdWUpKTsKKyAgICByZXR1cm4gcmVzdWx0Owor
fQorCit9IH0gLy8gbmFtZXNwYWNlIEpTQzo6QjMKKworI2VuZGlmIC8vIEIzUHJvY2VkdXJlSW5s
aW5lc19oCisKSW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM1N0YWNrU2xvdFZhbHVl
LmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNTdGFja1Nsb3RW
YWx1ZS5jcHAJKHJldmlzaW9uIDApCisrKyBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNTdGFj
a1Nsb3RWYWx1ZS5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSw0MSBAQAorLyoKKyAqIENv
cHlyaWdodCAoQykgMjAxNSBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICog
UmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBv
ciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0
aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlv
bnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAg
bm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFp
bWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNl
IHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlv
bnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRp
b24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24u
CisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIGBgQVMgSVMn
JyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBC
VVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5U
QUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVND
TEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUgorICogQ09OVFJJQlVUT1JT
IEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUws
CisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQg
Tk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNF
UlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElO
VEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJ
TElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICog
KElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9V
VCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhF
IFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLiAKKyAqLworCisjaW5jbHVkZSAiY29uZmlnLmgi
CisjaW5jbHVkZSAiQjNTdGFja1Nsb3RWYWx1ZS5oIgorCituYW1lc3BhY2UgSlNDIHsgbmFtZXNw
YWNlIEIzIHsKKworU3RhY2tTbG90VmFsdWU6On5TdGFja1Nsb3RWYWx1ZSgpCit7Cit9CisKK3Zv
aWQgU3RhY2tTbG90VmFsdWU6OmR1bXBNZXRhKFByaW50U3RyZWFtJiBvdXQpIGNvbnN0Cit7Cisg
ICAgb3V0LnByaW50KCJieXRlU2l6ZSA9ICIsIG1fYnl0ZVNpemUpOworfQorCit9IH0gLy8gbmFt
ZXNwYWNlIEpTQzo6QjMKKwpJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzU3RhY2tT
bG90VmFsdWUuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNTdGFj
a1Nsb3RWYWx1ZS5oCShyZXZpc2lvbiAwKQorKysgU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0Iz
U3RhY2tTbG90VmFsdWUuaAkod29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDY1IEBACisvKgorICog
Q29weXJpZ2h0IChDKSAyMDE1IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisg
KiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRo
IG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0
IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0
aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAg
ICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2Ns
YWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1
Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0
aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRh
dGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlv
bi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gYGBBUyBJ
UycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcs
IEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hB
TlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJ
U0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SCisgKiBDT05UUklCVVRP
UlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lB
TCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJV
VCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1Ig
U0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1Mg
SU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElB
QklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisg
KiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkg
T1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBU
SEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisKKyNpZm5kZWYgQjNTdGFja1Ns
b3RWYWx1ZV9oCisjZGVmaW5lIEIzU3RhY2tTbG90VmFsdWVfaAorCisjaW5jbHVkZSAiQjNWYWx1
ZS5oIgorCituYW1lc3BhY2UgSlNDIHsgbmFtZXNwYWNlIEIzIHsKKworY2xhc3MgU3RhY2tTbG90
VmFsdWUgOiBwdWJsaWMgVmFsdWUgeworcHVibGljOgorICAgIHN0YXRpYyBib29sIGFjY2VwdHMo
T3Bjb2RlIG9wY29kZSkgeyByZXR1cm4gb3Bjb2RlID09IFN0YWNrU2xvdDsgfQorCisgICAgflN0
YWNrU2xvdFZhbHVlKCk7CisKKyAgICB1bnNpZ25lZCBieXRlU2l6ZSgpIGNvbnN0IHsgcmV0dXJu
IG1fYnl0ZVNpemU7IH0KKworICAgIC8vIFRoaXMgZ2V0cyBhc3NpZ25lZCBhdCB0aGUgZW5kIG9m
IGNvbXBpbGF0aW9uLiBZb3UgY2Fubm90IHJlbHkgb24gaXQgaGF2aW5nIGEgbWVhbmluZ2Z1bAor
ICAgIC8vIHZhbHVlIHdoaWxlIHRoZSBjb21waWxlciBpcyBydW5uaW5nLgorICAgIGludHB0cl90
IG9mZnNldEZyb21GUCgpIGNvbnN0IHsgcmV0dXJuIG1fb2Zmc2V0RnJvbUZQOyB9CisKK3Byb3Rl
Y3RlZDoKKyAgICB2b2lkIGR1bXBNZXRhKFByaW50U3RyZWFtJikgY29uc3Qgb3ZlcnJpZGU7CisK
K3ByaXZhdGU6CisgICAgZnJpZW5kIGNsYXNzIFByb2NlZHVyZTsKKworICAgIFN0YWNrU2xvdFZh
bHVlKHVuc2lnbmVkIGluZGV4LCBPcmlnaW4gb3JpZ2luLCB1bnNpZ25lZCBieXRlU2l6ZSkKKyAg
ICAgICAgOiBWYWx1ZShpbmRleCwgU3RhY2tTbG90LCBwb2ludGVyKCksIG9yaWdpbikKKyAgICAg
ICAgLCBtX2J5dGVTaXplKGJ5dGVTaXplKQorICAgICAgICAsIG1fb2Zmc2V0RnJvbUZQKDApCisg
ICAgeworICAgIH0KKworICAgIHVuc2lnbmVkIG1fYnl0ZVNpemU7CisgICAgaW50cHRyX3QgbV9v
ZmZzZXRGcm9tRlA7Cit9OworCit9IH0gLy8gbmFtZXNwYWNlIEpTQzo6QjMKKworI2VuZGlmIC8v
IEIzU3RhY2tTbG90VmFsdWVfaAorCkluZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNT
dGFja21hcC5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzU3Rh
Y2ttYXAuY3BwCShyZXZpc2lvbiAwKQorKysgU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzU3Rh
Y2ttYXAuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsNDAgQEAKKy8qCisgKiBDb3B5cmln
aHQgKEMpIDIwMTUgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlz
dHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0
aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZv
bGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9m
IHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGlj
ZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4K
KyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUg
YWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFu
ZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFu
ZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoK
KyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFTIElTJycgQU5E
IEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5P
VCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJ
VFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1F
RC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBM
SUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICog
RVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBM
SU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNF
UzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJV
UFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFks
IFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNM
VURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0Yg
VEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NT
SUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKworI2luY2x1ZGUgImNvbmZpZy5oIgorI2lu
Y2x1ZGUgIkIzU3RhY2ttYXAuaCIKKworbmFtZXNwYWNlIEpTQyB7IG5hbWVzcGFjZSBCMyB7CisK
K3ZvaWQgU3RhY2ttYXA6OmR1bXAoUHJpbnRTdHJlYW0mIG91dCkgY29uc3QKK3sKKyAgICBvdXQu
cHJpbnQoCisgICAgICAgICJ7b3BhcXVlID0gIiwgUmF3UG9pbnRlcihtX29wYXF1ZSksICIsIHJl
cHMgPSAiLCBsaXN0RHVtcChtX3JlcHMpLAorICAgICAgICAiLCBnZW5lcmF0b3IgPSAiLCBSYXdQ
b2ludGVyKG1fZ2VuZXJhdG9yLmdldCgpKSwgIiwgY2xvYmJlcmVkID0gIiwgbV9jbG9iYmVyZWQs
CisgICAgICAgICIsIHVzZWRSZWdpc3RlcnMgPSAiLCBtX3VzZWRSZWdpc3RlcnMsICJ9Iik7Cit9
CisKK30gfSAvLyBuYW1lc3BhY2UgSlNDOjpCMworCkluZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENv
cmUvYjMvQjNTdGFja21hcC5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9i
My9CM1N0YWNrbWFwLmgJKHJldmlzaW9uIDApCisrKyBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMv
QjNTdGFja21hcC5oCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsMTI2IEBACisvKgorICogQ29w
eXJpZ2h0IChDKSAyMDE1IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBS
ZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9y
IHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRo
ZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9u
cyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBu
b3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWlt
ZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2Ug
dGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9u
cyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlv
biBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4K
KyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycn
IEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJV
VCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRB
QklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NM
QUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMg
QkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwK
KyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBO
T1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VS
VklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5U
RVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklM
SVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAo
SU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VU
IE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUg
UE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisKKyNpZm5kZWYgQjNTdGFja21hcF9o
CisjZGVmaW5lIEIzU3RhY2ttYXBfaAorCisjaW5jbHVkZSAiQjNWYWx1ZVJlcC5oIgorI2luY2x1
ZGUgIkNDYWxsSGVscGVycy5oIgorI2luY2x1ZGUgIlJlZ2lzdGVyU2V0LmgiCisjaW5jbHVkZSA8
d3RmL1NoYXJlZFRhc2suaD4KKworbmFtZXNwYWNlIEpTQyB7IG5hbWVzcGFjZSBCMyB7CisKK2Ns
YXNzIEIzVmFsdWU7CisKK2NsYXNzIFN0YWNrbWFwIHsKK3B1YmxpYzoKKyAgICBzdHJ1Y3QgR2Vu
ZXJhdGlvblBhcmFtcyB7CisgICAgICAgIC8vIFRoaXMgaXMgdGhlIFZhbHVlIGNvbnRhaW5pbmcg
dGhlIHN0YWNrbWFwLgorICAgICAgICBWYWx1ZSogdmFsdWU7CisKKyAgICAgICAgLy8gVGhpcyBp
cyB0aGUgc3RhY2ttYXAuCisgICAgICAgIFN0YWNrbWFwKiBzdGFja21hcDsKKworICAgICAgICAv
LyBUaGlzIGlzIHRoZSBqdW1wIHRvIHRoZSBzbG93IHBhdGgsIGlmIHRoaXMgaXMgYSBzdGFja21h
cCBmb3IgYSBDaGVjayB2YWx1ZS4KKyAgICAgICAgQ0NhbGxIZWxwZXJzOjpKdW1wIGp1bXA7CisK
KyAgICAgICAgLy8gVGhpcyB0ZWxscyB5b3UgdGhlIGFjdHVhbCB2YWx1ZSByZXByZXNlbnRhdGlv
bnMgdGhhdCB3ZXJlIGNob3Nlbi4KKyAgICAgICAgVmVjdG9yPFZhbHVlUmVwPiByZXBzOworCisg
ICAgICAgIC8vIFRoaXMgdGVsbHMgeW91IHRoZSByZWdpc3RlcnMgdGhhdCB3ZXJlIHVzZWQuCisg
ICAgICAgIFJlZ2lzdGVyU2V0IHVzZWRSZWdpc3RlcnM7CisgICAgfTsKKyAgICAKKyAgICB0eXBl
ZGVmIHZvaWQgR2VuZXJhdG9yRnVuY3Rpb24oQ0NhbGxIZWxwZXJzJiwgY29uc3QgR2VuZXJhdGlv
blBhcmFtcyYpOworICAgIHR5cGVkZWYgU2hhcmVkVGFzazxHZW5lcmF0b3JGdW5jdGlvbj4gR2Vu
ZXJhdG9yOworICAgIAorICAgIFN0YWNrbWFwKCkKKyAgICB7CisgICAgfQorCisgICAgLy8gU2V0
IHNvbWUgb3BhcXVlIGRhdGEgdG8gaWRlbnRpZnkgdGhpcyBzdGFja21hcC4gVGhpcyBpcyB1c2Vm
dWwgYmVjYXVzZSBhIFN0YWNrbWFwLXVzaW5nIFZhbHVlCisgICAgLy8gY2FuIGJlIGR1cGxpY2F0
ZWQsIGFuZCBlYWNoIGR1cGxpY2F0ZSBtYXkgZW5kIHVwIGhhdmluZyBkaWZmZXJlbnQgcmVnaXN0
ZXIgYWxsb2NhdGlvbi4gVGhpcworICAgIC8vIGFsbG93cyBhbGwgb2YgdGhvc2UgZHVwbGljYXRl
cyB0byBiZSBhYmxlIHRvIHJlZmVyIGJhY2sgdG8gd2hhdGV2ZXIgaGlnaC1sZXZlbCBkYXRhIHN0
cnVjdHVyZXMKKyAgICAvLyB3ZSB3ZXJlIHVzaW5nIHRvIGNyZWF0ZSB0aGUgdmFsdWUuCisgICAg
dm9pZCBzZXRPcGFxdWUodm9pZCogcGFyYW1ldGVyKQorICAgIHsKKyAgICAgICAgbV9vcGFxdWUg
PSBwYXJhbWV0ZXI7CisgICAgfQorICAgIHZvaWQqIG9wYXF1ZSgpIGNvbnN0IHsgcmV0dXJuIG1f
b3BhcXVlOyB9CisKKyAgICAvLyBDb252ZW5pZW5jZSBoZWxwZXJzIHdoZW4gdXNpbmcgaW5kaWNl
cyBpbnN0ZWFkIG9mIHBvaW50ZXJzLgorICAgIHZvaWQgc2V0T3BhcXVlSW5kZXgoc2l6ZV90IGlu
ZGV4KQorICAgIHsKKyAgICAgICAgc2V0T3BhcXVlKGJpdHdpc2VfY2FzdDx2b2lkKj4oaW5kZXgp
KTsKKyAgICB9CisgICAgc2l6ZV90IG9wYXF1ZUluZGV4KCkgY29uc3QgeyByZXR1cm4gYml0d2lz
ZV9jYXN0PHNpemVfdD4ob3BhcXVlKCkpOyB9CisKKyAgICAvLyBDb25zdHJhaW4gYW4gYXJndW1l
bnQgdG8gdGhlIFZhbHVlIHRoYXQgdXNlcyB0aGlzIFN0YWNrbWFwLiBOb3RlIHRoYXQgaW5kZXgg
emVybyByZWZlcnMgdG8gdGhlCisgICAgLy8gZmlyc3QgYXJndW1lbnQgdG8gdGhhdCBWYWx1ZSwg
ZXZlbiBpZiB0aGF0IGFyZ3VtZW50IGlzIG5vdCBjb25zdHJhaW5hYmxlLiBGb3IgZXhhbXBsZSwg
aW4gYQorICAgIC8vIENoZWNrQWRkIHZhbHVlLCBpdCB3b3VsZCBiZSBhbiBlcnJvciB0byBjb25z
dHJhaW4gaW5kaWNlcyAwIGFuZCAxLiBJbiBhIENoZWNrIHZhbHVlLCBpdCB3b3VsZAorICAgIC8v
IGJlIGFuIGVycm9yIHRvIGNvbnN0cmFpbiBpbmRleCAwLiBCdXQsIHdoZW4gdGhlIGdlbmVyYXRp
b24gY2FsbGJhY2sgaXMgY2FsbGVkLCB5b3UgY2FuIGRlcGVuZAorICAgIC8vIG9uIHRoZSByZXBz
IGZvciB0aG9zZSBpbmRpY2VzIGJlaW5nIGZpbGxlZCBpbi4KKyAgICB2b2lkIGNvbnN0cmFpbih1
bnNpZ25lZCBpbmRleCwgY29uc3QgVmFsdWVSZXAmIHJlcCkKKyAgICB7CisgICAgICAgIGlmIChp
bmRleCArIDEgPCBtX3JlcHMuc2l6ZSgpKQorICAgICAgICAgICAgbV9yZXBzLmdyb3coaW5kZXgg
KyAxKTsKKyAgICAgICAgbV9yZXBzW2luZGV4XSA9IHJlcDsKKyAgICB9CisKKyAgICB2b2lkIGNs
b2JiZXIoY29uc3QgUmVnaXN0ZXJTZXQmIHNldCkKKyAgICB7CisgICAgICAgIG1fY2xvYmJlcmVk
Lm1lcmdlKHNldCk7CisgICAgfQorCisgICAgY29uc3QgUmVnaXN0ZXJTZXQmIGNsb2JiZXJlZCgp
IGNvbnN0IHsgcmV0dXJuIG1fY2xvYmJlcmVkOyB9CisKKyAgICB2b2lkIHNldEdlbmVyYXRvcihS
ZWZQdHI8R2VuZXJhdG9yPiBnZW5lcmF0b3IpCisgICAgeworICAgICAgICBtX2dlbmVyYXRvciA9
IGdlbmVyYXRvcjsKKyAgICB9CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBGdW5jdG9yPgorICAg
IHZvaWQgc2V0R2VuZXJhdG9yKGNvbnN0IEZ1bmN0b3ImIGZ1bmN0b3IpCisgICAgeworICAgICAg
ICBtX2dlbmVyYXRvciA9IGNyZWF0ZVNoYXJlZFRhc2s8R2VuZXJhdG9yRnVuY3Rpb24+KGZ1bmN0
b3IpOworICAgIH0KKworICAgIHZvaWQgZHVtcChQcmludFN0cmVhbSYpIGNvbnN0OworICAgIAor
cHJpdmF0ZToKKyAgICBmcmllbmQgY2xhc3MgU3RhY2ttYXBTcGVjaWFsOworICAgIAorICAgIHZv
aWQqIG1fb3BhcXVlIHsgbnVsbHB0ciB9OworICAgIFZlY3RvcjxWYWx1ZVJlcD4gbV9yZXBzOwor
ICAgIFJlZlB0cjxHZW5lcmF0b3I+IG1fZ2VuZXJhdG9yOworICAgIFJlZ2lzdGVyU2V0IG1fY2xv
YmJlcmVkOworICAgIFJlZ2lzdGVyU2V0IG1fdXNlZFJlZ2lzdGVyczsgLy8gU3RhY2ttYXBzIGNv
dWxkIGJlIGZ1cnRoZXIgZHVwbGljYXRlZCBieSBBaXIsIGJ1dCB0aGF0J3MgdW5saWtlbHksIHNv
IHdlIGp1c3QgbWVyZ2UgdGhlIHVzZWQgcmVnaXN0ZXJzIHNldHMgaWYgdGhhdCB3ZXJlIHRvIGhh
cHBlbi4KK307CisKK30gfSAvLyBuYW1lc3BhY2UgSlNDOjpCMworCisjZW5kaWYgLy8gQjNTdGFj
a21hcF9oCisKSW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM1N0YWNrbWFwU3BlY2lh
bC5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzU3RhY2ttYXBT
cGVjaWFsLmNwcAkocmV2aXNpb24gMCkKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM1N0
YWNrbWFwU3BlY2lhbC5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSwxNzYgQEAKKy8qCisg
KiBDb3B5cmlnaHQgKEMpIDIwMTUgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoK
KyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdp
dGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRo
YXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmli
dXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAq
ICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlz
Y2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJv
ZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25k
aXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVu
dGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0
aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFT
IElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElO
RywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJD
SEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUg
RElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IKKyAqIENPTlRSSUJV
VE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVD
SUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywg
QlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBP
UiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVT
UyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBM
SUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQK
KyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdB
WSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9G
IFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKworI2luY2x1ZGUgImNvbmZp
Zy5oIgorI2luY2x1ZGUgIkIzU3RhY2ttYXBTcGVjaWFsLmgiCisKK25hbWVzcGFjZSBKU0MgeyBu
YW1lc3BhY2UgQjMgeworCit1c2luZyBuYW1lc3BhY2UgQWlyOworCitTdGFja21hcFNwZWNpYWw6
OlN0YWNrbWFwU3BlY2lhbChjb25zdCBjaGFyKiBuYW1lKQorICAgIDogU3BlY2lhbChuYW1lKQor
eworfQorCitTdGFja21hcFNwZWNpYWw6On5TdGFja21hcFNwZWNpYWwoKQoreworfQorCit2b2lk
IFN0YWNrbWFwU3BlY2lhbDo6Zm9yRWFjaEFyZyhJbnN0JiBpbnN0LCBjb25zdCBTY29wZWRMYW1i
ZGE8SW5zdDo6RWFjaEFyZ0NhbGxiYWNrPiYgY2FsbGJhY2spCit7CisgICAgVmFsdWUqIHZhbHVl
ID0gaW5zdC5vcmlnaW47CisKKyAgICAvLyBDaGVjayB0aGF0IGluc2FuZSB0aGluZ3MgaGF2ZSBu
b3QgaGFwcGVuZWQuCisgICAgQVNTRVJUKGluc3QuYXJncy5zaXplKCkgPT0gdmFsdWUtPmNoaWxk
cmVuLnNpemUoKSArIDEpOworICAgIAorICAgIGZvciAodW5zaWduZWQgaSA9IDE7IGkgPCBpbnN0
LmFyZ3Muc2l6ZSgpOyArK2kpIHsKKyAgICAgICAgQXJnJiBhcmcgPSBpbnN0LmFyZ3NbaV07Cisg
ICAgICAgIFZhbHVlKiBjaGlsZCA9IHZhbHVlLT5jaGlsZChpIC0gMSk7CisKKyAgICAgICAgY2Fs
bGJhY2soYXJnLCBBcmc6OlVzZSwgQXJnOjp0eXBlRm9yQjNUeXBlKGNoaWxkLT50eXBlKCkpKTsK
KyAgICB9Cit9CisKK2Jvb2wgU3RhY2ttYXBTcGVjaWFsOjppc1ZhbGlkKEluc3QmIGluc3QpCit7
CisgICAgLy8gV2Ugc2hvdWxkIGhhdmUgYWxyZWFkeSB2YWxpZGF0ZWQgdGhhdCBpdCBoYXMgYXQg
bGVhc3Qgb25lIGFyZywgdGhlIFNwZWNpYWwuCisgICAgQVNTRVJUKGluc3QuYXJncy5zaXplKCkp
OworCisgICAgVmFsdWUqIHZhbHVlID0gaW5zdC5vcmlnaW47CisgICAgU3RhY2ttYXAqIHN0YWNr
bWFwID0gdmFsdWUtPnN0YWNrbWFwKCk7CisKKyAgICBBU1NFUlQoc3RhY2ttYXApOworCisgICAg
Ly8gVGhlIG9ubHkga2luZCBvZiBhcmd1bWVudCB0aGF0IGEgc3RhY2ttYXAgd291bGQgYWx3YXlz
IGJlIHVuaGFwcHkgd2l0aCBpcyBhIFNwZWNpYWwuIEJ1dCwgd2UKKyAgICAvLyBleGhhdXN0aXZl
bHkgb3B0IGludG8gZXZlcnl0aGluZyB3ZSBrbm93IHdlIGNhbiBoYW5kbGUuIEl0IG1ha2VzIHRo
aW5ncyBlYXNpZXIgbGF0ZXIuIEFsc28sCisgICAgLy8gdGhpcyBsb29wIHZlcmlmaWVzIGFyZ3Vt
ZW50IHR5cGUuCisgICAgZm9yICh1bnNpZ25lZCBpID0gMTsgaSA8IGluc3QuYXJncy5zaXplKCk7
ICsraSkgeworICAgICAgICBWYWx1ZSogY2hpbGQgPSB2YWx1ZS0+Y2hpbGQoaSk7CisgICAgICAg
IEFyZyYgYXJnID0gaW5zdC5hcmdzW2kgKyAxXTsKKyAgICAgICAgCisgICAgICAgIHN3aXRjaCAo
YXJnLmtpbmQoKSkgeworICAgICAgICBjYXNlIEFyZzo6VG1wOgorICAgICAgICBjYXNlIEFyZzo6
SW1tOgorICAgICAgICBjYXNlIEFyZzo6SW1tUHRyOgorICAgICAgICBjYXNlIEFyZzo6QWRkcjoK
KyAgICAgICAgY2FzZSBBcmc6OlN0YWNrOgorICAgICAgICBjYXNlIEFyZzo6Q2FsbEFyZzoKKyAg
ICAgICAgY2FzZSBBcmc6OkluZGV4OgorICAgICAgICAgICAgYnJlYWs7IC8vIE9LCisgICAgICAg
IGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAg
CisgICAgICAgIEFyZzo6VHlwZSB0eXBlID0gQXJnOjp0eXBlRm9yQjNUeXBlKGNoaWxkLT50eXBl
KCkpOworCisgICAgICAgIGlmICghYXJnLmlzVHlwZSh0eXBlKSkKKyAgICAgICAgICAgIHJldHVy
biBmYWxzZTsKKyAgICB9CisKKyAgICAvLyBUaGUgbnVtYmVyIG9mIGNvbnN0cmFpbnRzIGhhcyB0
byBiZSBubyBncmVhdGVyIHRoYW4gdGhlIG51bWJlciBvZiBCMyBjaGlsZHJlbi4KKyAgICBBU1NF
UlQoc3RhY2ttYXAtPm1fcmVwcy5zaXplKCkgPD0gdmFsdWUtPmNoaWxkcmVuLnNpemUoKSk7CisK
KyAgICAvLyBXZSBtdXN0IGhhdmUgdGhlIHJpZ2h0IG51bWJlciBvZiBvcGVyYW5kcy4KKyAgICBp
ZiAoaW5zdC5hcmdzLnNpemUoKSAhPSB2YWx1ZS0+Y2hpbGRyZW4uc2l6ZSgpICsgMSkKKyAgICAg
ICAgcmV0dXJuIGZhbHNlOworCisgICAgLy8gVmVyaWZ5IGFueSBleHBsaWNpdGx5IHN1cHBsaWVk
IGNvbnN0cmFpbnRzLgorICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBzdGFja21hcC0+bV9y
ZXBzLnNpemUoKTsgKytpKSB7CisgICAgICAgIFZhbHVlKiBjaGlsZCA9IHZhbHVlLT5jaGlsZChp
KTsKKyAgICAgICAgVmFsdWVSZXAmIHJlcCA9IHN0YWNrbWFwLT5tX3JlcHNbaV07CisgICAgICAg
IEFyZyYgYXJnID0gaW5zdC5hcmdzW2kgKyAxXTsKKworICAgICAgICBzd2l0Y2ggKHJlcC5raW5k
KCkpIHsKKyAgICAgICAgY2FzZSBWYWx1ZVJlcDo6QW55OgorICAgICAgICAgICAgYnJlYWs7Cisg
ICAgICAgIGNhc2UgVmFsdWVSZXA6OlNvbWVSZWdpc3RlcjoKKyAgICAgICAgICAgIGlmICghYXJn
LmlzVG1wKCkpCisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgYnJl
YWs7CisgICAgICAgIGNhc2UgVmFsdWVSZXA6OlJlZ2lzdGVyOgorICAgICAgICAgICAgaWYgKGFy
ZyAhPSBUbXAocmVwLnJlZygpKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAg
ICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBWYWx1ZVJlcDo6U3RhY2s6CisgICAgICAgICAg
ICAvLyBUaGlzIGlzIG5vdCBhIHZhbGlkIGlucHV0IHJlcHJlc2VudGF0aW9uLgorICAgICAgICAg
ICAgQVNTRVJUX05PVF9SRUFDSEVEKCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2Fz
ZSBWYWx1ZVJlcDo6U3RhY2tBcmd1bWVudDoKKyAgICAgICAgICAgIGlmIChhcmcgIT0gQXJnOjpj
YWxsQXJnKHJlcC5vZmZzZXRGcm9tU1AoKSkpCisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNl
OworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgVmFsdWVSZXA6OkNvbnN0YW50Ogor
ICAgICAgICAgICAgLy8gVGhpcyBpcyBub3QgYSB2YWxpZCBpbnB1dCByZXByZXNlbnRhdGlvbi4K
KyAgICAgICAgICAgIEFTU0VSVF9OT1RfUkVBQ0hFRCgpOworICAgICAgICAgICAgYnJlYWs7Cisg
ICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBTdGFja21hcFNw
ZWNpYWw6OmFkbWl0c1N0YWNrKEluc3QmIGluc3QsIHVuc2lnbmVkIGFyZ0luZGV4KQoreworICAg
IFZhbHVlKiB2YWx1ZSA9IGluc3Qub3JpZ2luOworICAgIFN0YWNrbWFwKiBzdGFja21hcCA9IHZh
bHVlLT5zdGFja21hcCgpOworCisgICAgdW5zaWduZWQgc3RhY2ttYXBBcmdJbmRleCA9IGFyZ0lu
ZGV4IC0gMTsKKworICAgIGlmIChzdGFja21hcEFyZ0luZGV4ID49IHN0YWNrbWFwLT5tX3JlcHMu
c2l6ZSgpKSB7CisgICAgICAgIC8vIFRoaXMgbWVhbnMgdGhhdCB0aGVyZSB3YXMgbm8gY29uc3Ry
YWludC4KKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIAorICAgIC8vIFdlIG9ubHkg
YWRtaXQgc3RhY2sgZm9yIEFueSdzLCBzaW5jZSBTdGFjayBpcyBub3QgYSB2YWxpZCBpbnB1dCBj
b25zdHJhaW50LCBhbmQgU3RhY2tBcmd1bWVudAorICAgIC8vIHRyYW5zbGF0ZXMgdG8gYSBDYWxs
QXJnIGluIEFpci4KKyAgICBpZiAoc3RhY2ttYXAtPm1fcmVwc1tzdGFja21hcEFyZ0luZGV4XS5r
aW5kKCkgPT0gQW55KQorICAgICAgICByZXR1cm4gdHJ1ZTsKKworICAgIHJldHVybiBmYWxzZTsK
K30KKwordm9pZCBTdGFja21hcFNwZWNpYWw6OnJlcG9ydFVzZWRyZWdpc3RlcnMoSW5zdCYgaW5z
dCwgY29uc3QgUmVnaXN0ZXJTZXQmIHVzZWRSZWdpc3RlcnMpCit7CisgICAgVmFsdWUqIHZhbHVl
ID0gaW5zdC5vcmlnaW47CisgICAgU3RhY2ttYXAqIHN0YWNrbWFwID0gdmFsdWUtPnN0YWNrbWFw
KCk7CisKKyAgICAvLyBGSVhNRTogSWYgdGhlIEluc3QgdGhhdCB1c2VzIHRoZSBTdGFja21hcFNw
ZWNpYWwgZ2V0cyBkdXBsaWNhdGVkLCB0aGVuIHdlIGVuZCB1cCBtZXJnaW5nIHVzZWQKKyAgICAv
LyByZWdpc3RlciBzZXRzIGZyb20gbXVsdGlwbGUgcGxhY2VzLiBUaGlzIGN1cnJlbnRseSB3b24n
dCBoYXBwZW4gc2luY2UgQWlyIGRvZXNuJ3QgaGF2ZSB0YWlsZHVwCisgICAgLy8gb3IgdGhpbmdz
IGxpa2UgdGhhdC4gQnV0IG1heWJlIGV2ZW50dWFsbHkgaXQgY291bGQgYmUgYSBwcm9ibGVtLgor
ICAgIHN0YWNrbWFwLT5tX3VzZWRSZWdpc3RlcnMubWVyZ2UodXNlZFJlZ2lzdGVycyk7Cit9CisK
K2NvbnN0IFJlZ2lzdGVyU2V0JiBTdGFja21hcFNwZWNpYWw6OmV4dHJhQ2xvYmJlcmVkUmVncyhJ
bnN0JiBpbnN0KQoreworICAgIFZhbHVlKiB2YWx1ZSA9IGluc3Qub3JpZ2luOworICAgIFN0YWNr
bWFwKiBzdGFja21hcCA9IHZhbHVlLT5zdGFja21hcCgpOworCisgICAgcmV0dXJuIHN0YWNrbWFw
LT5jbG9iYmVyZWQoKTsKK30KKworfSB9IC8vIG5hbWVzcGFjZSBKU0M6OkIzCisKKwpJbmRleDog
U291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzU3RhY2ttYXBTcGVjaWFsLmgKPT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQot
LS0gU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzU3RhY2ttYXBTcGVjaWFsLmgJKHJldmlzaW9u
IDApCisrKyBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNTdGFja21hcFNwZWNpYWwuaAkod29y
a2luZyBjb3B5KQpAQCAtMCwwICsxLDU3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE1IEFw
cGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQg
dXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlm
aWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0
aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBt
dXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBv
ZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3Ry
aWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdo
dAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2lu
ZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0
ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRX
QVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJF
U1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywg
VEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNT
IEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVO
VCBTSEFMTCBBUFBMRSBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkg
RElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1Ig
Q09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAq
IFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNF
LCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVS
IENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENP
TlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VO
Q0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9G
IFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VD
SCBEQU1BR0UuIAorICovCisKKyNpZm5kZWYgQjNTdGFja21hcFNwZWNpYWxfaAorI2RlZmluZSBC
M1N0YWNrbWFwU3BlY2lhbF9oCisKKyNpbmNsdWRlICJBaXJTcGVjaWFsLmgiCisjaW5jbHVkZSAi
QjNTdGFja21hcC5oIgorCituYW1lc3BhY2UgSlNDIHsgbmFtZXNwYWNlIEIzIHsKKworLy8gVGhp
cyBpcyBhIGJhc2UgY2xhc3MgZm9yIHNwZWNpYWxzIHRoYXQgaGF2ZSBzdGFja21hcHMuIE5vdGUg
dGhhdCBpdCBjYW4gZmluZCB0aGUgU3RhY2ttYXAgYnkKKy8vIGFza2luZyBmb3IgdGhlIEluc3Qn
cyBvcmlnaW4uIEhlbmNlLCB0aGVzZSBvYmplY3RzIGRvbid0IG5lZWQgdG8gZXZlbiBob2xkIGEg
cmVmZXJlbmNlIHRvIHRoZQorLy8gU3RhY2ttYXAuCisKK2NsYXNzIFN0YWNrbWFwU3BlY2lhbCA6
IHB1YmxpYyBBaXI6OlNwZWNpYWwgeworcHVibGljOgorICAgIFN0YWNrbWFwU3BlY2lhbChjb25z
dCBjaGFyKiBuYW1lKTsKKyAgICB2aXJ0dWFsIH5TdGFja21hcFNwZWNpYWwoKTsKKworcHJvdGVj
dGVkOgorICAgIHZvaWQgZm9yRWFjaEFyZyhBaXI6Okluc3QmLCBjb25zdCBTY29wZWRMYW1iZGE8
QWlyOjpJbnN0OjpFYWNoQXJnQ2FsbGJhY2s+Jikgb3ZlcnJpZGU7CisgICAgYm9vbCBpc1ZhbGlk
KEFpcjo6SW5zdCYpIG92ZXJyaWRlOworICAgIGJvb2wgYWRtaXRzU3RhY2soQWlyOjpJbnN0Jiwg
dW5zaWduZWQgYXJnSW5kZXgpIG92ZXJyaWRlOworICAgIHZvaWQgcmVwb3J0VXNlZFJlZ2lzdGVy
cyhBaXI6Okluc3QmLCBjb25zdCBSZWdpc3RlclNldCYpIG92ZXJyaWRlOworICAgIGNvbnN0IFJl
Z2lzdGVyU2V0JiBleHRyYUNsb2JiZXJlZFJlZ3MoQWlyOjpJbnN0Jikgb3ZlcnJpZGU7CisKKyAg
ICAvLyBOb3RlIHRoYXQgdGhpcyBkb2VzIG5vdCBvdmVycmlkZSBnZW5lcmF0ZSgpIG9yIGRlZXBE
dW1wSW1wbCgpLiBXZSBoYXZlIG1hbnkgc29tZSBzdWJjbGFzc2VzCisgICAgLy8gdGhhdCBpbXBs
ZW1lbnQgdGhhdC4KK307CisKK30gfSAvLyBuYW1lc3BhY2UgSlNDOjpCMworCisjZW5kaWYgLy8g
QjNTdGFja21hcFNwZWNpYWxfaAorCkluZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNT
d2l0Y2hDYXNlLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNT
d2l0Y2hDYXNlLmNwcAkocmV2aXNpb24gMCkKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9C
M1N3aXRjaENhc2UuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsMzkgQEAKKy8qCisgKiBD
b3B5cmlnaHQgKEMpIDIwMTUgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAq
IFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGgg
b3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQg
dGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRp
b25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAg
IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xh
aW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVj
ZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRp
b25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0
aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9u
LgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFTIElT
JycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywg
QlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFO
VEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElT
Q0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IKKyAqIENPTlRSSUJVVE9S
UyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFM
LAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVU
IE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBT
RVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJ
TlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFC
SUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAq
IChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBP
VVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRI
RSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKworI2luY2x1ZGUgImNvbmZpZy5o
IgorI2luY2x1ZGUgIkIzU3dpdGNoQ2FzZS5oIgorCisjaW5jbHVkZSAiQjNCYXNpY0Jsb2NrLmgi
CisKK25hbWVzcGFjZSBKU0MgeyBuYW1lc3BhY2UgQjMgeworCit2b2lkIFN3aXRjaENhc2U6OmR1
bXAoUHJpbnRTdHJlYW0mIG91dCkgY29uc3QKK3sKKyAgICBvdXQucHJpbnQobV9jYXNlVmFsdWUs
ICItPiIsIHBvaW50ZXJEdW1wKG1fdGFyZ2V0KSk7Cit9CisKK30gfSAvLyBuYW1lc3BhY2UgSlND
OjpCMworCkluZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNTd2l0Y2hDYXNlLmgKPT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzU3dpdGNoQ2FzZS5oCShyZXZp
c2lvbiAwKQorKysgU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzU3dpdGNoQ2FzZS5oCSh3b3Jr
aW5nIGNvcHkpCkBAIC0wLDAgKzEsNjMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTUgQXBw
bGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1
c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZp
Y2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRp
b25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11
c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9m
IGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJp
YnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0
CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5n
IGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRl
cmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdB
UkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVT
UyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBU
SEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1Mg
Rk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5U
IFNIQUxMIEFQUExFIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBE
SVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBD
T05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICog
UFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0Us
IERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIg
Q0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09O
VFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5D
RSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0Yg
VEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNI
IERBTUFHRS4gCisgKi8KKworI2lmbmRlZiBCM1N3aXRjaENhc2VfaAorI2RlZmluZSBCM1N3aXRj
aENhc2VfaAorCisjaW5jbHVkZSA8d3RmL1N0ZExpYkV4dHJhcy5oPgorI2luY2x1ZGUgPHd0Zi9Q
cmludFN0cmVhbS5oPgorCituYW1lc3BhY2UgSlNDIHsgbmFtZXNwYWNlIEIzIHsKKworY2xhc3Mg
QmFzaWNCbG9jazsKKworY2xhc3MgU3dpdGNoQ2FzZSB7CitwdWJsaWM6CisgICAgU3dpdGNoQ2Fz
ZSgpCisgICAgeworICAgIH0KKworICAgIFN3aXRjaENhc2UoaW50NjRfdCBjYXNlVmFsdWUsIEJh
c2ljQmxvY2sqIHRhcmdldCkKKyAgICAgICAgOiBtX2Nhc2VWYWx1ZShjYXNlVmFsdWUpCisgICAg
ICAgICwgbV90YXJnZXQodGFyZ2V0KQorICAgIHsKKyAgICB9CisKKyAgICBleHBsaWNpdCBvcGVy
YXRvciBib29sKCkgY29uc3QgeyByZXR1cm4gISFtX3RhcmdldDsgfQorCisgICAgaW50NjRfdCBj
YXNlVmFsdWUoKSBjb25zdCB7IHJldHVybiBtX2Nhc2VWYWx1ZTsgfQorICAgIEJhc2ljQmxvY2sq
IHRhcmdldCgpIGNvbnN0IHsgcmV0dXJuIG1fdGFyZ2V0OyB9CisKKyAgICB2b2lkIGR1bXAoUHJp
bnRTdHJlYW0mIG91dCkgY29uc3Q7CisKK3ByaXZhdGU6CisgICAgaW50NjRfdCBjYXNlVmFsdWU7
CisgICAgQmFzaWNCbG9jayogdGFyZ2V0OworfTsKKworfSB9IC8vIG5hbWVzcGFjZSBKU0M6OkIz
CisKKyNlbmRpZiAvLyBCM1N3aXRjaENhc2VfaAorCkluZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENv
cmUvYjMvQjNTd2l0Y2hWYWx1ZS5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRD
b3JlL2IzL0IzU3dpdGNoVmFsdWUuY3BwCShyZXZpc2lvbiAwKQorKysgU291cmNlL0phdmFTY3Jp
cHRDb3JlL2IzL0IzU3dpdGNoVmFsdWUuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsNjMg
QEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTUgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2Vy
dmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkg
Zm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHBy
b3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4g
UmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5
cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xs
b3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBt
dXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlz
dCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAg
ICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUg
ZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUg
SU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMs
IElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElF
UyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVS
UE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IKKyAq
IENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVO
VEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElO
Q0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVU
RSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBP
UiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZ
CisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFks
IE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcg
SU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBB
RFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKworI2luY2x1
ZGUgImNvbmZpZy5oIgorI2luY2xkdWUgIkIzU3dpdGNoVmFsdWUuaCIKKworbmFtZXNwYWNlIEpT
QyB7IG5hbWVzcGFjZSBCMyB7CisKK1N3aXRjaFZhbHVlOjp+U3dpdGNoVmFsdWUoKQoreworfQor
CitTd2l0Y2hDYXNlIFN3aXRjaFZhbHVlOjpyZW1vdmVDYXNlKHVuc2lnbmVkIGluZGV4KQorewor
ICAgIFN3aXRjaENhc2UgcmVzdWx0ID0gbV9zdWNjZXNzb3JzW2luZGV4XTsKKyAgICBtX3N1Y2Nl
c3NvcnNbaW5kZXhdID0gbV9zdWNjZXNzb3JzLmxhc3QoKTsKKyAgICBtX3N1Y2Nlc3NvcnMucmVt
b3ZlTGFzdCgpOworICAgIHJldHVybiByZXN1bHQ7Cit9CisKK3ZvaWQgU3dpdGNoVmFsdWU6OmFw
cGVuZENhc2UoY29uc3QgU3dpdGNoQ2FzZSYgc3dpdGNoQ2FzZSkKK3sKKyAgICBtX3N1Y2Nlc3Nv
cnMuYXBwZW5kKG1fc3VjY2Vzc29ycy5sYXN0KCkpOworICAgIG1fc3VjY2Vzc29yc1ttX3N1Y2Nl
c3NvcnMuc2l6ZSgpIC0gMl0gPSBzd2l0Y2hDYXNlLnRhcmdldCgpOworICAgIG1fdmFsdWVzLmFw
cGVuZChzd2l0Y2hDYXNlLmNhc2VWYWx1ZSgpKTsKK30KKwordm9pZCBTd2l0Y2hWYWx1ZTo6ZHVt
cE1ldGEoUHJpbnRTdHJlYW0mIG91dCkgY29uc3QKK3sKKyAgICAvLyBUaGlzIGRlc3RydWN0aXZl
bHkgb3ZlcnJpZGVzIENvbnRyb2xWYWx1ZSdzIGR1bXBNZXRhKCkuCisgICAgb3V0LnByaW50KGxp
c3REdW1wKCp0aGlzKSk7Cit9CisKK1N3aXRjaFZhbHVlOjpTd2l0Y2hWYWx1ZSh1bnNpZ25lZCBp
bmRleCwgT3JpZ2luIG9yaWdpbiwgQmFzaWNCbG9jayogZmFsbFRocm91Z2gpCisgICAgOiBDb250
cm9sVmFsdWUoaW5kZXgsIFN3aXRjaCwgb3JpZ2luKQoreworICAgIG1fc3VjY2Vzc29ycy5hcHBl
bmQoZmFsbFRocm91Z2gpOworfQorCit9IH0gLy8gbmFtZXNwYWNlIEpTQzo6QjMKKwpJbmRleDog
U291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzU3dpdGNoVmFsdWUuaAo9PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBT
b3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNTd2l0Y2hWYWx1ZS5oCShyZXZpc2lvbiAwKQorKysg
U291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzU3dpdGNoVmFsdWUuaAkod29ya2luZyBjb3B5KQpA
QCAtMCwwICsxLDEyMyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNSBBcHBsZSBJbmMuIEFs
bCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3Vy
Y2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFy
ZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFy
ZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4g
dGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9u
cyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGlu
IGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5v
dGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1l
ciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92
aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9W
SURFRCBCWSBBUFBMRSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJ
RUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1Q
TElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJU
SUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQ
TEUgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5E
SVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJ
QUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVO
VCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IK
KyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5E
IE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RS
SUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVS
V0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRX
QVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLiAK
KyAqLworCisjaWZuZGVmIEIzU3dpdGNoVmFsdWVfaAorI2RlZmluZSBCM1N3aXRjaFZhbHVlX2gK
KworI2luY2x1ZGUgIkIzQ29udHJvbFZhbHVlLmgiCisjaW5jbHVkZSAiQjNTd2l0Y2hDYXNlLmgi
CisKK25hbWVzcGFjZSBKU0MgeyBuYW1lc3BhY2UgQjMgeworCitjbGFzcyBTd2l0Y2hWYWx1ZSA6
IHB1YmxpYyBDb250cm9sVmFsdWUgeworcHVibGljOgorICAgIHN0YXRpYyBib29sIGFjY2VwdHMo
T3Bjb2RlIG9wY29kZSkgeyByZXR1cm4gb3Bjb2RlID09IFN3aXRjaDsgfQorCisgICAgflN3aXRj
aFZhbHVlKCk7CisKKyAgICAvLyBudW1DYXNlVmFsdWVzKCkgKyAxID09IG51bVN1Y2Nlc3NvcnMo
KS4KKyAgICB1bnNpZ25lZCBudW1DYXNlVmFsdWVzKCkgY29uc3QgeyByZXR1cm4gbV92YWx1ZXMu
c2l6ZSgpOyB9CisKKyAgICAvLyBUaGUgc3VjY2Vzc29yIGZvciB0aGlzIGNhc2UgdmFsdWUgaXMg
YXQgdGhlIHNhbWUgaW5kZXguCisgICAgaW50NjRfdCBjYXNlVmFsdWUodW5zaWduZWQgaW5kZXgp
IGNvbnN0IHsgcmV0dXJuIG1fdmFsdWVzW2ldOyB9CisgICAgCisgICAgY29uc3QgVmVjdG9yPGlu
dDY0X3Q+JiBjYXNlVmFsdWVzKCkgY29uc3QgeyByZXR1cm4gbV92YWx1ZXM7IH0KKworICAgIEJh
c2ljQmxvY2sqIGZhbGxUaHJvdWdoKCkgY29uc3QgeyByZXR1cm4gc3VjY2Vzc29ycygpLmxhc3Qo
KTsgfQorICAgIEJhc2ljQmxvY2sqJiBmYWxsVGhyb3VnaCgpIHsgcmV0dXJuIHN1Y2Nlc3NvcnMo
KS5sYXN0KCk7IH0KKworICAgIHVuc2lnbmVkIHNpemUoKSBjb25zdCB7IHJldHVybiBudW1DYXNl
VmFsdWVzKCk7IH0KKyAgICBTd2l0Y2hDYXNlIGF0KHVuc2lnbmVkIGluZGV4KSBjb25zdAorICAg
IHsKKyAgICAgICAgcmV0dXJuIFN3aXRjaENhc2UoY2FzZVZhbHVlKGluZGV4KSwgc3VjY2Vzc29y
KGluZGV4KSk7CisgICAgfQorICAgIFN3aXRjaENhc2Ugb3BlcmF0b3JbXSh1bnNpZ25lZCBpbmRl
eCkgY29uc3QKKyAgICB7CisgICAgICAgIHJldHVybiBhdChpbmRleCk7CisgICAgfQorCisgICAg
Y2xhc3MgaXRlcmF0b3IgeworICAgIHB1YmxpYzoKKyAgICAgICAgaXRlcmF0b3IoKQorICAgICAg
ICAgICAgOiBtX3N3aXRjaChudWxscHRyKQorICAgICAgICAgICAgLCBtX2luZGV4KDApCisgICAg
ICAgIHsKKyAgICAgICAgfQorCisgICAgICAgIGl0ZXJhdG9yKFN3aXRjaFZhbHVlJiBzd2l0Y2hW
YWx1ZSwgdW5zaWduZWQgaW5kZXgpCisgICAgICAgICAgICA6IG1fc3dpdGNoKCZzd2l0Y2hWYWx1
ZSkKKyAgICAgICAgICAgICwgbV9pbmRleChpbmRleCkKKyAgICAgICAgeworICAgICAgICB9CisK
KyAgICAgICAgU3dpdGNoQ2FzZSBvcGVyYXRvciooKQorICAgICAgICB7CisgICAgICAgICAgICBy
ZXR1cm4gbV9zd2l0Y2gtPmF0KG1faW5kZXgpOworICAgICAgICB9CisKKyAgICAgICAgaXRlcmF0
b3ImIG9wZXJhdG9yKysoKQorICAgICAgICB7CisgICAgICAgICAgICBtX2luZGV4Kys7CisgICAg
ICAgICAgICByZXR1cm4gKnRoaXM7CisgICAgICAgIH0KKworICAgICAgICBib29sIG9wZXJhdG9y
PT0oY29uc3QgaXRlcmF0b3ImIG90aGVyKSBjb25zdAorICAgICAgICB7CisgICAgICAgICAgICBy
ZXR1cm4gbV9pbmRleCA9PSBvdGhlci5tX2luZGV4OworICAgICAgICB9CisKKyAgICAgICAgYm9v
bCBvcGVyYXRvciE9KGNvbnN0IGl0ZXJhdG9yJiBvdGhlcikgY29uc3QKKyAgICAgICAgeworICAg
ICAgICAgICAgcmV0dXJuICEoKnRoaXMgPT0gb3RoZXIpOworICAgICAgICB9CisKKyAgICBwcml2
YXRlOgorICAgICAgICBTd2l0Y2hWYWx1ZSogbV9zd2l0Y2g7CisgICAgICAgIHVuc2lnbmVkIG1f
aW5kZXg7CisgICAgfTsKKworICAgIGl0ZXJhdG9yIGJlZ2luKCkgY29uc3QgeyByZXR1cm4gaXRl
cmF0b3IoKnRoaXMsIDApOyB9CisgICAgaXRlcmF0b3IgZW5kKCkgY29uc3QgeyByZXR1cm4gaXRl
cmF0b3IoKnRoaXMsIHNpemUoKSk7IH0KKworICAgIC8vIFRoaXMgcmVtb3ZlcyB0aGUgY2FzZSBh
bmQgcmVvcmRlcnMgdGhpbmdzIGEgYml0LiBJZiB5b3UncmUgaXRlcmF0aW5nIHRoZSBjYXNlcyBm
cm9tIDAgdG8gTiwKKyAgICAvLyB0aGVuIHlvdSBjYW4ga2VlcCBpdGVyYXRpbmcgYWZ0ZXIgdGhp
cyBzbyBsb25nIGFzIHlvdSByZXZpc2l0IHRoaXMgc2FtZSBpbmRleCAod2hpY2ggd2lsbCBub3cK
KyAgICAvLyBjb250YWluIHNvbWUgb3RoZXIgY2FzZSB2YWx1ZSkuIFRoaXMgcmVtb3ZlcyB0aGUg
Y2FzZSB0aGF0IHdhcyByZW1vdmVkLgorICAgIFN3aXRjaENhc2UgcmVtb3ZlQ2FzZSh1bnNpZ25l
ZCBpbmRleCk7CisKKyAgICB2b2lkIGFwcGVuZENhc2UoY29uc3QgU3dpdGNoQ2FzZSYgc3dpdGNo
Q2FzZSk7CisKK3Byb3RlY3RlZDoKKyAgICB2b2lkIGR1bXBNZXRhKFByaW50U3RyZWFtJikgY29u
c3Qgb3ZlcnJpZGU7CisKK3ByaXZhdGU6CisgICAgZnJpZW5kIGNsYXNzIFByb2NlZHVyZTsKKwor
ICAgIFN3aXRjaFZhbHVlKHVuc2lnbmVkIGluZGV4LCBPcmlnaW4gb3JpZ2luLCBCYXNpY0Jsb2Nr
KiBmYWxsVGhyb3VnaCk7Cit9OworCit9IH0gLy8gbmFtZXNwYWNlIEpTQzo6QjMKKworI2VuZGlm
IC8vIEIzU3dpdGNoVmFsdWVfaAorCkluZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNU
eXBlLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNUeXBlLmNw
cAkocmV2aXNpb24gMCkKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM1R5cGUuY3BwCSh3
b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsNTQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTUg
QXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFu
ZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9k
aWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25k
aXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2Rl
IG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0
IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlz
dHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJp
Z2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93
aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBt
YXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09G
VFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQ
UkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRP
LCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5F
U1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVW
RU5UIFNIQUxMIEFQUExFIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFO
WSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBP
UiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAor
ICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBV
U0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VW
RVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4g
Q09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElH
RU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICog
T0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBT
VUNIIERBTUFHRS4gCisgKi8KKworI2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgIkIzVHlw
ZS5oIgorCisjaW5jbHVkZSA8d3RmL1ByaW50U3RyZWFtLmg+CisKK25hbWVzcGFjZSBXVEYgewor
Cit1c2luZyBuYW1lc3BhY2UgSlNDOjpCMzsKKwordm9pZCBwcmludEludGVybmFsKFByaW50U3Ry
ZWFtJiBvdXQsIFR5cGUgdHlwZSkKK3sKKyAgICBzd2l0Y2ggKHR5cGUpIHsKKyAgICBjYXNlIFZv
aWQ6CisgICAgICAgIG91dC5wcmludCgiVm9pZCIpOworICAgICAgICByZXR1cm47CisgICAgY2Fz
ZSBJbnQzMjoKKyAgICAgICAgb3V0LnByaW50KCJJbnQzMiIpOworICAgICAgICByZXR1cm47Cisg
ICAgY2FzZSBJbnQ2NDoKKyAgICAgICAgb3V0LnByaW50KCJJbnQ2NCIpOworICAgICAgICByZXR1
cm47CisgICAgY2FzZSBEb3VibGU6CisgICAgICAgIG91dC5wcmludCgiRG91YmxlIik7CisgICAg
ICAgIHJldHVybjsKKyAgICB9CisgICAgUkVMRUFTRV9BU1NFUlRfTk9UX1JFQUNIRUQoKTsKK30K
KworfSAvLyBuYW1lc3BhY2UgV1RGCkluZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNU
eXBlLmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzVHlwZS5oCShy
ZXZpc2lvbiAwKQorKysgU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzVHlwZS5oCSh3b3JraW5n
IGNvcHkpCkBAIC0wLDAgKzEsNjggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTUgQXBwbGUg
SW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2Ug
aW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0
aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25z
CisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3Qg
cmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNv
bmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0
aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Cisg
KiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRp
c2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlh
bHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUg
SVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBP
UiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUK
KyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9S
IEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNI
QUxMIEFQUExFIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJF
Q1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05T
RVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJP
Q1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERB
VEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FV
U0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJB
Q1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBP
UiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJ
UyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERB
TUFHRS4gCisgKi8KKworI2lmbmRlZiBCM1R5cGVfaAorI2RlZmluZSBCM1R5cGVfaAorCisjaW5j
bHVkZSA8d3RmL1N0ZExpYkV4dHJhcy5oPgorCituYW1lc3BhY2UgSlNDIHsgbmFtZXNwYWNlIEIz
IHsKKworZW51bSBUeXBlIHsKKyAgICBWb2lkLAorICAgIEludDMyLAorICAgIEludDY0LAorICAg
IERvdWJsZQorfTsKKworaW5saW5lIGJvb2wgaXNJbnQoVHlwZSB0eXBlKQoreworICAgIHJldHVy
biB0eXBlID09IEludDMyIHx8IHR5cGUgPT0gSW50NjQ7Cit9CisKK2lubGluZSBib29sIGlzRmxv
YXQoVHlwZSB0eXBlKQoreworICAgIHJldHVybiB0eXBlID09IERvdWJsZTsKK30KKworaW5saW5l
IFR5cGUgcG9pbnRlcigpIGNvbnN0Cit7CisgICAgaWYgKHNpemVvZih2b2lkKikgPT0gNCkKKyAg
ICAgICAgcmV0dXJuIEludDMyOworICAgIHJldHVybiBJbnQ2NDsKK30KKworfSB9IC8vIG5hbWVz
cGFjZSBKU0M6OkIzCisKK25hbWVzcGFjZSBXVEYgeworCitjbGFzcyBQcmludFN0cmVhbTsKKwor
dm9pZCBwcmludEludGVybmFsKFByaW50U3RyZWFtJiwgSlNDOjpCMzo6VHlwZSk7CisKK30gLy8g
bmFtZXNwYWNlIFdURgorCisjZW5kaWYgLy8gQjNUeXBlX2gKKwpJbmRleDogU291cmNlL0phdmFT
Y3JpcHRDb3JlL2IzL0IzVXBzaWxvblZhbHVlLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2
YVNjcmlwdENvcmUvYjMvQjNVcHNpbG9uVmFsdWUuY3BwCShyZXZpc2lvbiAwKQorKysgU291cmNl
L0phdmFTY3JpcHRDb3JlL2IzL0IzVXBzaWxvblZhbHVlLmNwcAkod29ya2luZyBjb3B5KQpAQCAt
MCwwICsxLDQxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE1IEFwcGxlIEluYy4gQWxsIHJp
Z2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBh
bmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBl
cm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1l
dDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUg
YWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFu
ZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmlu
YXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNl
LCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGlu
IHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVk
IHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVE
IEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBX
QVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVE
IFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VM
QVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJ
TkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVD
VCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBE
QU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9G
IFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICog
UFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04g
QU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1Qg
TElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNF
KSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUs
IEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICov
CisKKyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJCM1Vwc2lsb25WYWx1ZS5oIgorCitu
YW1lc3BhY2UgSlNDIHsgbmFtZXNwYWNlIEIzIHsKKworVXBzaWxvblZhbHVlOjp+VXBzaWxvblZh
bHVlKCkKK3sKK30KKwordm9pZCBVcHNpbG9uVmFsdWU6OmR1bXBNZXRhKFByaW50U3RyZWFtJiBv
dXQpIGNvbnN0Cit7CisgICAgb3V0LnByaW50KCJeIiwgbV9waGktPmluZGV4KCkpOworfQorCit9
IH0gLy8gbmFtZXNwYWNlIEpTQzo6QjMKKwpJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL2Iz
L0IzVXBzaWxvblZhbHVlLmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRDb3JlL2Iz
L0IzVXBzaWxvblZhbHVlLmgJKHJldmlzaW9uIDApCisrKyBTb3VyY2UvSmF2YVNjcmlwdENvcmUv
YjMvQjNVcHNpbG9uVmFsdWUuaAkod29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDYwIEBACisvKgor
ICogQ29weXJpZ2h0IChDKSAyMDE1IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAq
CisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3
aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0
aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJp
YnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Cisg
KiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRp
c2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXBy
b2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29u
ZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1l
bnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1
dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gYGBB
UyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJ
TkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVS
Q0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJF
IERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SCisgKiBDT05UUklC
VVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BF
Q0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcs
IEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMg
T1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5F
U1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0Yg
TElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JU
CisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBX
QVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBP
RiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisKKyNpZm5kZWYgQjNVcHNp
bG9uVmFsdWVfaAorI2RlZmluZSBCM1Vwc2lsb25WYWx1ZV9oCisKKyNpbmNsdWRlICJCM1ZhbHVl
LmgiCisKK25hbWVzcGFjZSBKU0MgeyBuYW1lc3BhY2UgQjMgeworCitjbGFzcyBVcHNpbG9uVmFs
dWUgOiBwdWJsaWMgVmFsdWUgeworcHVibGljOgorICAgIHN0YXRpYyBib29sIGFjY2VwdHMoT3Bj
b2RlIG9wY29kZSkgeyByZXR1cm4gb3Bjb2RlID09IFVwc2lsb247IH0KKworICAgIH5VcHNpbG9u
VmFsdWUoKTsKKworICAgIFZhbHVlKiBwaGkoKSBjb25zdCB7IHJldHVybiBtX3BoaTsgfQorCitw
cm90ZWN0ZWQ6CisgICAgdm9pZCBkdW1wTWV0YShQcmludFN0cmVhbSYpIGNvbnN0IG92ZXJyaWRl
OworCitwcml2YXRlOgorICAgIGZyaWVuZCBjbGFzcyBQcm9jZWR1cmU7CisgICAgCisgICAgVXBz
aWxvblZhbHVlKHVuc2lnbmVkIGluZGV4LCBPcmlnaW4gb3JpZ2luLCBWYWx1ZSogdmFsdWUsIFZh
bHVlKiBwaGkpCisgICAgICAgIDogVmFsdWUoaW5kZXgsIFBoaSwgVm9pZCwgb3JpZ2luLCB2YWx1
ZSkKKyAgICAgICAgLCBtX3BoaShwaGkpCisgICAgeworICAgICAgICBBU1NFUlQodmFsdWUtPnR5
cGUoKSA9PSBwaGktPnR5cGUoKSk7CisgICAgfQorCisgICAgVmFsdWUqIG1fcGhpOworfTsKKwor
fSB9IC8vIG5hbWVzcGFjZSBKU0M6OkIzCisKKyNlbmRpZiAvLyBCM1Vwc2lsb25WYWx1ZV9oCisK
SW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM1ZhbHVlLmNwcAo9PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0t
LSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNWYWx1ZS5jcHAJKHJldmlzaW9uIDApCisrKyBT
b3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNWYWx1ZS5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTAs
MCArMSwxNjkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTUgQXBwbGUgSW5jLiBBbGwgcmln
aHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFu
ZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVy
bWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0
OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBh
Ym92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5k
IHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5h
cnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2Us
IHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4g
dGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQg
d2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQg
QlkgQVBQTEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdB
UlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQg
V0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxB
UgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElO
Qy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNU
LCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERB
TUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0Yg
U1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQ
Uk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBB
TlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBM
SUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0Up
IEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwg
RVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8K
KworI2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgIkIzVmFsdWUuaCIKKworbmFtZXNwYWNl
IEpTQyB7IG5hbWVzcGFjZSBCMyB7CisKK1ZhbHVlOjp+VmFsdWUoKQoreworfQorCit2b2lkIFZh
bHVlOjpyZXBsYWNlV2l0aElkZW50aXR5KFZhbHVlKiB2YWx1ZSkKK3sKKyAgICAvLyBUaGlzIGlz
IGEgYml0IGNyYXp5LiBJdCBkb2VzIGFuIGluLXBsYWNlIHJlcGxhY2VtZW50IG9mIHdoYXRldmVy
IFZhbHVlIHN1YmNsYXNzIHRoaXMgaXMgd2l0aAorICAgIC8vIGEgcGxhaW4gSWRlbnRpdHkgVmFs
dWUuIFdlIGZpcnN0IGNvbGxlY3QgYWxsIG9mIHRoZSBpbmZvcm1hdGlvbiB3ZSBuZWVkLCB0aGVu
IHdlIGRlc3RydWN0IHRoZQorICAgIC8vIHByZXZpb3VzIHZhbHVlIGluIHBsYWNlLCBhbmQgdGhl
biB3ZSBjb25zdHJ1Y3QgdGhlIElkZW50aXR5IFZhbHVlIGluIHBsYWNlLgorCisgICAgdW5zaWdu
ZWQgaW5kZXggPSBtX2luZGV4OworICAgIFR5cGUgdHlwZSA9IG1fdHlwZTsKKyAgICBPcmlnaW4g
b3JpZ2luID0gbV9vcmlnaW47CisgICAgQmFzaWNCbG9jayogb3duZXIgPSB0aGlzLT5vd25lcjsK
KyAgICBWYWx1ZSogcmVwbGFjZW1lbnQgPSB0aGlzLT5yZXBsYWNlbWVudDsKKyAgICB2b2lkKiBt
aXNjID0gdGhpcy0+bWlzYzsKKworICAgIFJFTEVBU0VfQVNTRVJUKHR5cGUgPT0gdmFsdWUtPnR5
cGUoKSk7CisKKyAgICB0aGlzLT5WYWx1ZTo6flZhbHVlKCk7CisKKyAgICBuZXcgKHRoaXMpIChp
bmRleCwgSWRlbnRpZnksIHR5cGUsIG9yaWdpbiwgdmFsdWUpOworCisgICAgdGhpcy0+b3duZXIg
PSBvd25lcjsKKyAgICB0aGlzLT5yZXBsYWNlbWVudCA9IHJlcGxhY2VtZW50OworICAgIHRoaXMt
Pm1pc2MgPSBtaXNjOworfQorCit2b2lkIFZhbHVlOjpkdW1wKFByaW50U3RyZWFtJiBvdXQpIGNv
bnN0Cit7CisgICAgb3V0LnByaW50KGR1bXBQcmVmaXgsIG1faW5kZXgpOworfQorCit2b2lkIFZh
bHVlOjpkZWVwRHVtcChQcmludFN0cmVhbSYgb3V0KSBjb25zdAoreworICAgIG91dC5wcmludCht
X3R5cGUsICIgIiwgKnRoaXMsICIgPSAiLCBtX29wY29kZSk7CisKKyAgICBvdXQucHJpbnQoIigi
KTsKKyAgICBDb21tYVByaW50ZXIgY29tbWE7CisgICAgZm9yIChWYWx1ZSogY2hpbGQgOiBjaGls
ZHJlbigpKQorICAgICAgICBvdXQucHJpbnQoY29tbWEsIHBvaW50ZXJEdW1wKGNoaWxkKSk7CisK
KyAgICBTdHJpbmdQcmludFN0cmVhbSBzdHJpbmdPdXQ7CisgICAgZHVtcE1ldGEoc3RyaW5nT3V0
KTsKKyAgICBDU3RyaW5nIHN0cmluZyA9IHN0cmluZ091dC50b0NTdHJpbmcoKTsKKyAgICBpZiAo
c3RyaW5nLmxlbmd0aCgpKQorICAgICAgICBvdXQucHJpbnQoY29tbWEsIHN0cmluZyk7CisKKyAg
ICBvdXQucHJpbnQoIikiKTsKK30KKworYm9vbCBWYWx1ZTo6aGFzSW50MzIoKSBjb25zdAorewor
ICAgIHJldHVybiBmYWxzZTsKK30KKworaW50MzJfdCBWYWx1ZTo6YXNJbnQzMigpIGNvbnN0Cit7
CisgICAgUkVMRUFTRV9BU1NFUlRfTk9UX1JFQUNIRUQoKTsKKyAgICByZXR1cm4gMDsKK30KKwor
Ym9vbCBWYWx1ZTo6aGFzSW50NjQoKSBjb25zdAoreworICAgIHJldHVybiBmYWxzZTsKK30KKwor
aW50NjRfdCBWYWx1ZTo6YXNJbnQ2NCgpIGNvbnN0Cit7CisgICAgUkVMRUFTRV9BU1NFUlRfTk9U
X1JFQUNIRUQoKTsKKyAgICByZXR1cm4gMDsKK30KKworYm9vbCBWYWx1ZTo6aGFzRG91YmxlKCkg
Y29uc3QKK3sKKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK2RvdWJsZSBWYWx1ZTo6YXNEb3VibGUo
KSBjb25zdAoreworICAgIFJFTEVBU0VfQVNTRVJUX05PVF9SRUFDSEVEKCk7CisgICAgcmV0dXJu
IDA7Cit9CisKK3ZvaWQgVmFsdWU6OmR1bXBNZXRhKFByaW50U3RyZWFtJikgY29uc3QKK3sKK30K
KworVHlwZSBWYWx1ZTo6dHlwZUZvcihPcGNvZGUgb3Bjb2RlLCBWYWx1ZSogZmlyc3RDaGlsZCkK
K3sKKyAgICBzd2l0Y2ggKG9wY29kZSkgeworICAgIGNhc2UgSWRlbnRpdHk6CisgICAgY2FzZSBB
ZGQ6CisgICAgY2FzZSBTdWI6CisgICAgY2FzZSBNdWw6CisgICAgY2FzZSBEaXY6CisgICAgY2Fz
ZSBDaGlsbERpdjoKKyAgICBjYXNlIE1vZDoKKyAgICBjYXNlIEJpdEFuZDoKKyAgICBjYXNlIEJp
dE9yOgorICAgIGNhc2UgQml0WG9yOgorICAgIGNhc2UgU2hsOgorICAgIGNhc2UgU1NocjoKKyAg
ICBjYXNlIFpTaHI6CisgICAgY2FzZSBDaGVja0FkZDoKKyAgICBjYXNlIENoZWNrU3ViOgorICAg
IGNhc2UgQ2hlY2tNdWw6CisgICAgICAgIHJldHVybiBmaXJzdENoaWxkLT50eXBlKCk7CisgICAg
Y2FzZSBGcmFtZVBvaW50ZXI6CisgICAgICAgIHJldHVybiBwb2ludGVyKCk7CisgICAgY2FzZSBT
RXh0ODoKKyAgICBjYXNlIFNFeHQxNjoKKyAgICBjYXNlIERUb0kzMjoKKyAgICBjYXNlIEVxdWFs
OgorICAgIGNhc2UgTm90RXF1YWw6CisgICAgY2FzZSBMZXNzVGhhbjoKKyAgICBjYXNlIEdyZWF0
ZXJUaGFuOgorICAgIGNhc2UgTGVzc0VxdWFsOgorICAgIGNhc2UgR3JlYXRlckVxdWFsOgorICAg
IGNhc2UgQWJvdmU6CisgICAgY2FzZSBCZWxvdzoKKyAgICBjYXNlIEFib3ZlRXF1YWw6CisgICAg
Y2FzZSBCZWxvd0VxdWFsOgorICAgICAgICByZXR1cm4gSW50MzI7CisgICAgY2FzZSBTRXh0MzI6
CisgICAgY2FzZSBaRXh0MzI6CisgICAgICAgIHJldHVybiBJbnQ2NDsKKyAgICBjYXNlIEZSb3Vu
ZDoKKyAgICBjYXNlIElUb0Q6CisgICAgICAgIHJldHVybiBEb3VibGU7CisgICAgY2FzZSBOb3A6
CisgICAgICAgIHJldHVybiBWb2lkOworICAgIGRlZmF1bHQ6CisgICAgICAgIFJFTEVBU0VfQVNT
RVJUX05PVF9SRUFDSEVEKCk7CisgICAgfQorfQorCit9IH0gLy8gbmFtZXNwYWNlIEpTQzo6QjMK
KwpJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzVmFsdWUuaAo9PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0t
LSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNWYWx1ZS5oCShyZXZpc2lvbiAwKQorKysgU291
cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzVmFsdWUuaAkod29ya2luZyBjb3B5KQpAQCAtMCwwICsx
LDE5NiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNSBBcHBsZSBJbmMuIEFsbCByaWdodHMg
cmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJp
bmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0
ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6Cisg
KiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3Zl
IGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhl
IGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBm
b3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhp
cyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUK
KyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRo
IHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBB
UFBMRSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFO
VElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJS
QU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisg
KiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBP
UgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElO
Q0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdF
UyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJT
VElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJ
VFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBU
SEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJ
TElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJ
U0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVO
IElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLiAKKyAqLworCisj
aWZuZGVmIEIzVmFsdWVfaAorI2RlZmluZSBCM1ZhbHVlX2gKKworI2luY2x1ZGUgIkIzT3JpZ2lu
LmgiCisjaW5jbHVkZSAiQjNUeXBlLmgiCisjaW5jbHVkZSA8d3RmL0Zhc3RNYWxsb2MuaD4KKyNp
bmNsdWRlIDx3dGYvTm9uY29weWFibGUuaD4KKworbmFtZXNwYWNlIEpTQyB7IG5hbWVzcGFjZSBC
MyB7CisKK2NsYXNzIFZhbHVlIHsKKyAgICBXVEZfTUFLRV9OT05DT1BZQUJMRShWYWx1ZSk7Cisg
ICAgV1RGX01BS0VfRkFTVF9BTExPQ0FURUQ7CitwdWJsaWM6CisgICAgdHlwZWRlZiBWZWN0b3I8
VmFsdWUqLCAzPiBBZGphY2VuY3lMaXN0OworCisgICAgc3RhdGljIGNvbnN0IGNoYXIqIGR1bXBQ
cmVmaXggPSAiQCI7CisKKyAgICBzdGF0aWMgYm9vbCBhY2NlcHRzKE9wY29kZSkgeyByZXR1cm4g
dHJ1ZTsgfQorCisgICAgdmlydHVhbCB+VmFsdWUoKTsKKworICAgIHVuc2lnbmVkIGluZGV4KCkg
Y29uc3QgeyByZXR1cm4gbV9pbmRleDsgfQorICAgIAorICAgIC8vIE5vdGUgdGhhdCB0aGUgb3Bj
b2RlIGlzIGltbXV0YWJsZSwgZXhjZXB0IGZvciByZXBsYWNpbmcgdmFsdWVzIHdpdGggaWRlbnRp
dHkuCisgICAgT3Bjb2RlIG9wY29kZSgpIGNvbnN0IHsgcmV0dXJuIG1fb3Bjb2RlOyB9CisKKyAg
ICBPcmlnaW4gb3JpZ2luKCkgY29uc3QgeyByZXR1cm4gbV9vcmlnaW47IH0KKyAgICAKKyAgICBW
YWx1ZSomIGNoaWxkKHVuc2lnbmVkIGluZGV4KSB7IHJldHVybiBtX2NoaWxkcmVuW2luZGV4XTsg
fQorICAgIFZhbHVlKiBjaGlsZCh1bnNpZ25lZCBpbmRleCkgY29uc3QgeyByZXR1cm4gbV9jaGls
ZHJlbltpbmRleF07IH0KKworICAgIC8vIFRoaXMgY29tcHV0ZXMgdGhlIHR5cGUgdXNpbmcgdGhl
IG9wY29kZS4KKyAgICBUeXBlIHR5cGUoKSBjb25zdCB7IHJldHVybiBtX3R5cGU7IH0KKworICAg
IEFkamFjZW5jeUxpc3QmIGNoaWxkcmVuKCkgeyByZXR1cm4gbV9jaGlsZHJlbjsgfSAKKyAgICBj
b25zdCBBZGphY2VuY3lMaXN0JiBjaGlsZHJlbigpIGNvbnN0IHsgcmV0dXJuIG1fY2hpbGRyZW47
IH0KKworICAgIHZvaWQgcmVwbGFjZVdpdGhJZGVudGl0eShWYWx1ZSopOworICAgIHZvaWQgcmVw
bGFjZVdpdGhOb3AoKTsKKworICAgIHZvaWQgZHVtcChQcmludFN0cmVhbSYpIGNvbnN0OworICAg
IHZvaWQgZGVlcER1bXAoUHJpbnRTdHJlYW0mKSBjb25zdDsKKworICAgIC8vIFRoaXMgaXMgaG93
IHlvdSBjYXN0IFZhbHVlcy4gRm9yIGV4YW1wbGUsIGlmIHlvdSB3YW50IHRvIGRvIHNvbWV0aGlu
ZyBwcm92aWRlZCB0aGF0IHdlIGhhdmUgYQorICAgIC8vIEFyZ3VtZW50UmVnVmFsdWUsIHlvdSBj
YW4gZG86CisgICAgLy8KKyAgICAvLyBpZiAoQXJndW1lbnRSZWdWYWx1ZSogYXJndW1lbnRSZWcg
PSB2YWx1ZS0+YXM8QXJndW1lbnRSZWdWYWx1ZT4oKSkgeworICAgIC8vICAgICB0aGluZ3MKKyAg
ICAvLyB9CisgICAgLy8KKyAgICAvLyBUaGlzIHdpbGwgcmV0dXJuIG51bGwgaWYgdGhpcyBvcGNv
ZGUoKSAhPSBBcmd1bWVudFJlZy4gVGhpcyB3b3JrcyBiZWNhdXNlIHRoaXMgcmV0dXJucyBudWxs
cHRyCisgICAgLy8gaWYgVDo6YWNjZXB0cyhvcGNvZGUoKSkgcmV0dXJucyBmYWxzZS4KKyAgICB0
ZW1wbGF0ZTx0eXBlbmFtZSBUPgorICAgIFQqIGFzKCk7CisgICAgdGVtcGxhdGU8dHlwZW5hbWUg
VD4KKyAgICBjb25zdCBUKiBhcygpIGNvbnN0OworICAgIAorICAgIGJvb2wgaGFzSW50MzIoKSBj
b25zdDsKKyAgICBpbnQzMl90IGFzSW50MzIoKSBjb25zdDsKKyAgICAKKyAgICBib29sIGhhc0lu
dDY0KCkgY29uc3Q7CisgICAgaW50NjRfdCBhc0ludDY0KCkgY29uc3Q7CisKKyAgICBib29sIGhh
c0ludCgpIGNvbnN0OworICAgIGludDY0X3QgYXNJbnQoKSBjb25zdDsKKyAgICBib29sIGlzSW50
KGludDY0X3QgdmFsdWUpIGNvbnN0OworCisgICAgYm9vbCBoYXNEb3VibGUoKSBjb25zdDsKKyAg
ICBkb3VibGUgYXNEb3VibGUoKSBjb25zdDsKKworICAgIFN0YWNrbWFwKiBzdGFja21hcCgpOwor
Citwcm90ZWN0ZWQ6CisgICAgdmlydHVhbCB2b2lkIGR1bXBNZXRhKFByaW50U3RyZWFtJikgY29u
c3Q7CisgICAgCitwcml2YXRlOgorICAgIGZyaWVuZCBjbGFzcyBQcm9jZWR1cmU7CisgICAgCisg
ICAgLy8gSW5zdGFudGlhdGUgdmFsdWVzIHZpYSBQcm9jZWR1cmUuCisgICAgLy8gVGhpcyBmb3Jt
IHJlcXVpcmVzIHNwZWNpZnlpbmcgdGhlIHR5cGUgZXhwbGljaXRseToKKyAgICB0ZW1wbGF0ZTx0
eXBlbmFtZS4uLiBBcmd1bWVudHM+CisgICAgZXhwbGljaXQgVmFsdWUodW5zaWduZWQgaW5kZXgs
IE9wY29kZSBvcGNvZGUsIFR5cGUgdHlwZSwgT3JpZ2luIG9yaWdpbiwgVmFsdWUqIGZpcnN0Q2hp
bGQsIEFyZ3VtZW50cy4uLiBhcmd1bWVudHMpCisgICAgICAgIDogbV9pbmRleChpbmRleCkKKyAg
ICAgICAgLCBtX29wY29kZShvcGNvZGUpCisgICAgICAgICwgbV90eXBlKHR5cGUpCisgICAgICAg
ICwgbV9vcmlnaW4ob3JpZ2luKQorICAgICAgICAsIG1fY2hpbGRyZW57IGZpcnN0Q2hpbGQsIGFy
Z3VtZW50cy4uLiB9CisgICAgeworICAgIH0KKyAgICAvLyBUaGlzIGZvcm0gaXMgZm9yIHNwZWNp
ZnlpbmcgdGhlIHR5cGUgZXhwbGljaXRseSB3aGVuIHRoZSBvcGNvZGUgaGFzIG5vIGNoaWxkcmVu
OgorICAgIGV4cGxpY2l0IFZhbHVlKHVuc2lnbmVkIGluZGV4LCBPcGNvZGUgb3Bjb2RlLCBUeXBl
IHR5cGUsIE9yaWdpbiBvcmlnaW4pCisgICAgICAgIDogbV9pbmRleChpbmRleCkKKyAgICAgICAg
LCBtX29wY29kZShvcGNvZGUpCisgICAgICAgICwgbV90eXBlKHR5cGUpCisgICAgICAgICwgbV9v
cmlnaW4ob3JpZ2luKQorICAgIHsKKyAgICB9CisgICAgLy8gVGhpcyBmb3JtIGlzIGZvciB0aG9z
ZSBvcGNvZGVzIHRoYXQgY2FuIGluZmVyIHRoZWlyIHR5cGUgZnJvbSB0aGUgb3Bjb2RlIGFuZCBm
aXJzdCBjaGlsZDoKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZS4uLiBBcmd1bWVudHM+CisgICAgZXhw
bGljaXQgVmFsdWUodW5zaWduZWQgaW5kZXgsIE9wY29kZSBvcGNvZGUsIE9yaWdpbiBvcmlnaW4s
IFZhbHVlKiBmaXJzdENoaWxkLCBBcmd1bWVudHMuLi4gYXJndW1lbnRzKQorICAgICAgICA6IG1f
aW5kZXgoaW5kZXgpCisgICAgICAgICwgbV9vcGNvZGUob3Bjb2RlKQorICAgICAgICAsIG1fdHlw
ZSh0eXBlRm9yKG9wY29kZSwgZmlyc3RDaGlsZCkpCisgICAgICAgICwgbV9vcmlnaW4ob3JpZ2lu
KQorICAgICAgICAsIG1fY2hpbGRyZW57IGZpcnN0Q2hpbGQsIGFyZ3VtZW50cy4uLiB9CisgICAg
eworICAgIH0KKyAgICAvLyBUaGlzIGZvcm0gaXMgZm9yIHRob3NlIG9wY29kZXMgdGhhdCBjYW4g
aW5mZXIgdGhlaXIgdHlwZSBmcm9tIHRoZSBvcGNvZGUgYWxvbmUsIGFuZCB0aGF0IGRvbid0Cisg
ICAgLy8gdGFrZSBhbnkgYXJndW1lbnRzOgorICAgIGV4cGxpY2l0IFZhbHVlKHVuc2lnbmVkIGlu
ZGV4LCBPcGNvZGUgb3Bjb2RlLCBPcmlnaW4gb3JpZ2luKQorICAgICAgICA6IG1faW5kZXgoaW5k
ZXgpCisgICAgICAgICwgbV9vcGNvZGUob3Bjb2RlKQorICAgICAgICAsIG1fdHlwZSh0eXBlRm9y
KG9wY29kZSwgbnVsbHB0cikpCisgICAgICAgICwgbV9vcmlnaW4ob3JpZ2luKQorICAgIHsKKyAg
ICB9CisgICAgLy8gVXNlIHRoaXMgZm9ybSBmb3IgdmFyYXJncy4KKyAgICBleHBpY2l0IFZhbHVl
KHVuc2lnbmVkIGluZGV4LCBPcGNvZGUgb3Bjb2RlLCBUeXBlIHR5cGUsIE9yaWdpbiBvcmlnaW4s
IGNvbnN0IEFkamFjZW5jeUxpc3QmIGNoaWxkcmVuKQorICAgICAgICA6IG1faW5kZXgoaW5kZXgp
CisgICAgICAgICwgbV9vcGNvZGUob3Bjb2RlKQorICAgICAgICAsIG1fdHlwZSh0eXBlKQorICAg
ICAgICAsIG1fb3JpZ2luKG9yaWdpbikKKyAgICAgICAgLCBtX2NoaWxkcmVuKGNoaWxkcmVuKQor
ICAgIHsKKyAgICB9CisKKyAgICBzdGF0aWMgVHlwZSB0eXBlRm9yKE9wY29kZSwgVmFsdWUqIGZp
cnN0Q2hpbGQpOworCisgICAgLy8gVGhpcyBncm91cCBvZiBmaWVsZHMgaXMgYXJyYW5nZWQgdG8g
Zml0IGluIDY0IGJpdHMuCisgICAgdW5zaWduZWQgbV9pbmRleDsKKyAgICBPcGNvZGUgbV9vcGNv
ZGU7CisgICAgVHlwZSBtX3R5cGU7CisgICAgCisgICAgT3JpZ2luIG1fb3JpZ2luOworICAgIEFk
amFjZW5jeUxpc3QgbV9jaGlsZHJlbjsKKworcHVibGljOgorICAgIEJhc2ljQmxvY2sqIG93bmVy
IHsgbnVsbHB0ciB9OyAvLyBjb21wdXRlZCBsYXppbHkuCisgICAgVmFsdWUqIHJlcGxhY2VtZW50
IHsgbnVsbHB0ciB9OyAvLyB1c2VkIGZvciBhbmFseXNlcyBhbmQgdHJhbnNmb3JtYXRpb25zLgor
ICAgIHZvaWQqIG1pc2MgeyBudWxscHRyIH07Cit9OworCitjbGFzcyBEZWVwVmFsdWVEdW1wIHsK
K3B1YmxpYzoKKyAgICBEZWVwVmFsdWVEdW1wKFZhbHVlKiB2YWx1ZSkKKyAgICAgICAgOiBtX3Zh
bHVlKHZhbHVlKQorICAgIHsKKyAgICB9CisKKyAgICB2b2lkIGR1bXAoUHJpbnRTdHJlYW0mIG91
dCkgY29uc3QKKyAgICB7CisgICAgICAgIGlmIChtX3ZhbHVlKQorICAgICAgICAgICAgbV92YWx1
ZS0+ZGVlcER1bXAob3V0KTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgb3V0LnByaW50KCI8
bnVsbD4iKTsKKyAgICB9CisKK3ByaXZhdGU6CisgICAgVmFsdWUqIG1fdmFsdWU7Cit9OworCitE
ZWVwVmFsdWVEdW1wIGRlZXBEdW1wKFZhbHVlKiB2YWx1ZSkKK3sKKyAgICByZXR1cm4gRGVlcFZh
bHVlRHVtcCh2YWx1ZSk7Cit9CisKK30gfSAvLyBuYW1lc3BhY2UgSlNDOjpCMworCisjZW5kaWYg
Ly8gQjNWYWx1ZV9oCisKSW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM1ZhbHVlSW5s
aW5lcy5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM1ZhbHVlSW5s
aW5lcy5oCShyZXZpc2lvbiAwKQorKysgU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzVmFsdWVJ
bmxpbmVzLmgJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSwxMDkgQEAKKy8qCisgKiBDb3B5cmln
aHQgKEMpIDIwMTUgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlz
dHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0
aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZv
bGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9m
IHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGlj
ZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4K
KyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUg
YWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFu
ZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFu
ZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoK
KyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFTIElTJycgQU5E
IEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5P
VCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJ
VFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1F
RC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBM
SUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICog
RVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBM
SU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNF
UzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJV
UFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFks
IFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNM
VURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0Yg
VEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NT
SUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKworI2lmbmRlZiBCM1ZhbHVlSW5saW5lc19o
CisjZGVmaW5lIEIzVmFsdWVJbmxpbmVzX2gKKworI2luY2x1ZGUgIkIzQ2hlY2tWYWx1ZS5oIgor
I2luY2x1ZGUgIkIzQ29uc3QzMlZhbHVlLmgiCisjaW5jbHVkZSAiQjNDb25zdDY0VmFsdWUuaCIK
KyNpbmNsdWRlICJCM0NvbnN0RG91YmxlVmFsdWUuaCIKKyNpbmNsdWRlICJCM1BhdGNocG9pbnRW
YWx1ZS5oIgorI2luY2x1ZGUgIkIzVmFsdWUuaCIKKworbmFtZXNwYWNlIEpTQyB7IG5hbWVzcGFj
ZSBCMyB7CisKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+CitUKiBWYWx1ZTo6YXMoKQoreworICAgIGlm
IChUOjphY2NlcHRzKG9wY29kZSgpKSkKKyAgICAgICAgcmV0dXJuIHN0YXRpY19jYXN0PFQqPih0
aGlzKTsKKyAgICByZXR1cm4gbnVsbHB0cjsKK30KKwordGVtcGxhdGU+dHlwZW5hbWUgVD4KK2Nv
bnN0IFQqIFZhbHVlOjphcygpIGNvbnN0Cit7CisgICAgcmV0dXJuIGNvbnN0X2Nhc3Q8VmFsdWUq
Pih0aGlzKS0+YXM8VD4oKTsKK30KKworYm9vbCBWYWx1ZTo6aGFzSW50MzIoKSBjb25zdAorewor
ICAgIHJldHVybiAhIWFzPENvbnN0MzJWYWx1ZT4oKTsKK30KKworaW50MzJfdCBWYWx1ZTo6YXNJ
bnQzMigpIGNvbnN0Cit7CisgICAgcmV0dXJuIGFzPENvbnN0MzJWYWx1ZT4oKS0+dmFsdWUoKTsK
K30KKworYm9vbCBWYWx1ZTo6aGFzSW50NjQoKSBjb25zdAoreworICAgIHJldHVybiAhIWFzPENv
bnN0NjRWYWx1ZT4oKTsKK30KKworaW50NjRfdCBWYWx1ZTo6YXNJbnQ2NCgpIGNvbnN0Cit7Cisg
ICAgcmV0dXJuIGFzPENvbnN0NjRWYWx1ZT4oKS0+dmFsdWUoKTsKK30KKworYm9vbCBWYWx1ZTo6
aGFzSW50KCkgY29uc3QKK3sKKyAgICByZXR1cm4gaGFzSW50MzIoKSB8fCBoYXNJbnQ2NCgpOwor
fQorCitpbnQ2NF90IFZhbHVlOjphc0ludCgpIGNvbnN0Cit7CisgICAgcmV0dXJuIGhhc0ludDMy
KCkgPyBhc0ludDMyKCkgOiBhc0ludDY0KCk7Cit9CisKK2Jvb2wgVmFsdWU6OmlzSW50KGludDY0
X3QgdmFsdWUpIGNvbnN0Cit7CisgICAgcmV0dXJuIGhhc0ludCgpICYmIGFzSW50KCkgPT0gdmFs
dWU7Cit9CisKK2Jvb2wgVmFsdWU6Omhhc0RvdWJsZSgpIGNvbnN0Cit7CisgICAgcmV0dXJuICEh
YXM8Q29uc3REb3VibGVWYWx1ZT4oKTsKK30KKworZG91YmxlIFZhbHVlOjphc0RvdWJsZSgpIGNv
bnN0Cit7CisgICAgcmV0dXJuIGFzPENvbnN0RG91YmxlVmFsdWU+KCktPnZhbHVlKCk7Cit9CisK
K1N0YWNrbWFwKiBWYWx1ZTo6c3RhY2ttYXAoKQoreworICAgIGlmIChDaGVja1ZhbHVlKiBjaGVj
ayA9IGFzPENoZWNrVmFsdWU+KCkpCisgICAgICAgIHJldHVybiAmY2hlY2stPnN0YWNrbWFwOwor
ICAgIGlmIChQYXRjaHBvaW50VmFsdWUqIHBhdGNocG9pbnQgPSBhczxQYXRjaHBvaW50VmFsdWU+
KCkpCisgICAgICAgIHJldHVybiAmcGF0Y2hwb2ludC0+c3RhY2ttYXA7CisgICAgcmV0dXJuIG51
bGxwdHI7Cit9CisKK30gfSAvLyBuYW1lc3BhY2UgSlNDOjpCMworCisjZW5kaWYgLy8gQjNWYWx1
ZUlubGluZXNfaAorCkluZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNWYWx1ZVJlcC5j
cHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzVmFsdWVSZXAuY3Bw
CShyZXZpc2lvbiAwKQorKysgU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzVmFsdWVSZXAuY3Bw
CSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsODYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIw
MTUgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9u
IGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICog
bW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBj
b25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBj
b2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBs
aXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJl
ZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29w
eXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9s
bG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhl
ciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMg
U09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICog
RVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVE
IFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJ
VE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5P
IEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9S
IEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZ
LCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRP
LAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBP
RiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhP
V0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIg
SU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVH
TElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQor
ICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBP
RiBTVUNIIERBTUFHRS4gCisgKi8KKworI2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgIkIz
VmFsdWVSZXAuaCIKKworbmFtZXNwYWNlIEpTQyB7IG5hbWVzcGFjZSBCMyB7CisKK3ZvaWQgVmFs
dWVSZXA6OmR1bXAoUHJpbnRTdHJlYW0mIG91dCkgY29uc3QKK3sKKyAgICBvdXQucHJpbnQobV9r
aW5kKTsKKyAgICBzd2l0Y2ggKG1fa2luZCkgeworICAgIGNhc2UgTm9uZToKKyAgICBjYXNlIFNv
bWVSZWdpc3RlcjoKKyAgICAgICAgcmV0dXJuOworICAgIGNhc2UgUmVnaXN0ZXI6CisgICAgICAg
IG91dC5wcmludCgiKCIsIHJlZygpLCAiKSIpOworICAgICAgICByZXR1cm47CisgICAgY2FzZSBT
dGFjazoKKyAgICAgICAgb3V0LnByaW50KCIoIiwgb2Zmc2V0RnJvbUZQKCksICIpIik7CisgICAg
ICAgIHJldHVybjsKKyAgICBjYXNlIFN0YWNrQXJndW1lbnQ6CisgICAgICAgIG91dC5wcmludCgi
KCIsIG9mZnNldEZyb21TUCgpLCAiKSIpOworICAgICAgICByZXR1cm47CisgICAgY2FzZSBDb25z
dGFudDoKKyAgICAgICAgb3V0LnByaW50KCIoIiwgdmFsdWUoKSwgIikiKTsKKyAgICAgICAgcmV0
dXJuOworICAgIH0KKyAgICBSRUxFQVNFX0FTU0VSVF9OT1RfUkVBQ0hFRCgpOworfQorCit9IH0g
Ly8gbmFtZXNwYWNlIEpTQzo6QjMKKworbmFtZXNwYWNlIFdURiB7CisKK3VzaW5nIG5hbWVzcGFj
ZSBKU0M6OkIzOworCit2b2lkIHByaW50SW50ZXJuYWwoUHJpbnRTdHJlYW0mIG91dCwgVmFsdWVS
ZXA6OktpbmQga2luZCkKK3sKKyAgICBzd2l0Y2ggKGtpbmQpIHsKKyAgICBjYXNlIFZhbHVlUmVw
OjpBbnk6CisgICAgICAgIG91dC5wcmludCgiQW55Iik7CisgICAgICAgIHJldHVybjsKKyAgICBj
YXNlIFZhbHVlUmVwOjpTb21lUmVnaXN0ZXI6CisgICAgICAgIG91dC5wcmludCgiU29tZVJlZ2lz
dGVyIik7CisgICAgICAgIHJldHVybjsKKyAgICBjYXNlIFZhbHVlUmVwOjpSZWdpc3RlcjoKKyAg
ICAgICAgb3V0LnByaW50KCJSZWdpc3RlciIpOworICAgICAgICByZXR1cm47CisgICAgY2FzZSBW
YWx1ZVJlcDo6U3RhY2s6CisgICAgICAgIG91dC5wcmludCgiU3RhY2siKTsKKyAgICAgICAgcmV0
dXJuOworICAgIGNhc2UgVmFsdWVSZXA6OlN0YWNrQXJndW1lbnQ6CisgICAgICAgIG91dC5wcmlu
dCgiU3RhY2tBcmd1bWVudCIpOworICAgICAgICByZXR1cm47CisgICAgY2FzZSBWYWx1ZVJlcDo6
Q29uc3RhbnQ6CisgICAgICAgIG91dC5wcmludCgiQ29uc3RhbnQiKTsKKyAgICAgICAgcmV0dXJu
OworICAgIH0KKyAgICBSRUxFQVNFX0FTU0VSVF9OT1RfUkVBQ0hFRCgpOworfQorCit9IC8vIG5h
bWVzcGFjZSBXVEYKKwpJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzVmFsdWVSZXAu
aAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNWYWx1ZVJlcC5oCShy
ZXZpc2lvbiAwKQorKysgU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzVmFsdWVSZXAuaAkod29y
a2luZyBjb3B5KQpAQCAtMCwwICsxLDE1NiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNSBB
cHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5k
IHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2Rp
ZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRp
dGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUg
bXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qg
b2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0
cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmln
aHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dp
bmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1h
dGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZU
V0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBS
RVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8s
IFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVT
UyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZF
TlQgU0hBTEwgQVBQTEUgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5Z
IERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9S
IENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisg
KiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVT
RSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZF
UiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBD
T05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdF
TkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBP
RiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNV
Q0ggREFNQUdFLiAKKyAqLworCisjaWZuZGVmIEIzVmFsdWVSZXBfaAorI2RlZmluZSBCM1ZhbHVl
UmVwX2gKKworI2luY2x1ZGUgIlJlZy5oIgorI2luY2x1ZGUgPHd0Zi9QcmludFN0cmVhbS5oPgor
CituYW1lc3BhY2UgSlNDIHsgbmFtZXNwYWNlIEIzIHsKKworLy8gV2UgdXNlIHRoaXMgY2xhc3Mg
dG8gZGVzY3JpYmUgdmFsdWUgcmVwcmVzZW50YXRpb25zIGF0IHN0YWNrbWFwcy4gSXQncyB1c2Vk
IGJvdGggdG8gZm9yY2UgYQorLy8gcmVwcmVzZW50YXRpb24gYW5kIHRvIGdldCB0aGUgcmVwcmVz
ZW50YXRpb24uIFdoZW4gdGhlIEIzIGNsaWVudCBmb3JjZXMgYSByZXByZXNlbnRhdGlvbiwgd2Ug
c2F5CisvLyB0aGF0IGl0J3MgYW4gaW5wdXQuIFdoZW4gQjMgdGVsbHMgdGhlIGNsaWVudCB3aGF0
IHJlcHJlc2VudGF0aW9uIGl0IHBpY2tlZCwgd2Ugc2F5IHRoYXQgaXQncyBhbgorLy8gb3V0cHV0
LgorCitjbGFzcyBWYWx1ZVJlcCB7CitwdWJsaWM6CisgICAgZW51bSBLaW5kIHsKKyAgICAgICAg
Ly8gQXMgYW4gaW5wdXQgcmVwcmVzZW50YXRpb24sIHRoaXMgbWVhbnMgdGhhdCBCMyBjYW4gcGlj
ayBhbnkgcmVwcmVzZW50YXRpb24uCisgICAgICAgIEFueSwKKworICAgICAgICAvLyBBcyBhbiBp
bnB1dCByZXByZXNlbnRhdGlvbiwgdGhpcyBtZWFucyB0aGF0IEIzIHNob3VsZCBwaWNrIHNvbWUg
cmVnaXN0ZXIuIEl0IGNvdWxkIGJlIGEKKyAgICAgICAgLy8gcmVnaXN0ZXIgdGhhdCB0aGlzIGNs
YWltcyB0byBjbG9iYmVyIQorICAgICAgICBTb21lUmVnaXN0ZXIsCisKKyAgICAgICAgLy8gQXMg
YW4gaW5wdXQgcmVwcmVzZW50YXRpb24sIHRoaXMgZm9yY2VzIGEgcGFydGljdWxhciByZWdpc3Rl
ci4gQXMgYW4gb3V0cHV0CisgICAgICAgIC8vIHJlcHJlc2VudGF0aW9uLCB0aGlzIHRlbGxzIHVz
IHdoYXQgcmVnaXN0ZXIgQjMgcGlja2VkLgorICAgICAgICBSZWdpc3RlciwKKworICAgICAgICAv
LyBBcyBhbiBvdXRwdXQgcmVwcmVzZW50YXRpb24sIHRoaXMgdGVsbHMgdXMgd2hhdCBzdGFjayBz
bG90IEIzIHBpY2tlZC4gSXQncyBub3QgYSB2YWxpZAorICAgICAgICAvLyBpbnB1dCByZXByZXNl
bnRhdGlvbi4KKyAgICAgICAgU3RhY2ssCisKKyAgICAgICAgLy8gQXMgYW4gaW5wdXQgcmVwcmVz
ZW50YXRpb24sIHRoaXMgZm9yY2VzIHRoZSB2YWx1ZSB0byBlbmQgdXAgaW4gdGhlIGFyZ3VtZW50
IGFyZWEgYXQgc29tZQorICAgICAgICAvLyBvZmZzZXQuCisgICAgICAgIFN0YWNrQXJndW1lbnQs
CisKKyAgICAgICAgLy8gQXMgYW4gb3V0cHV0IHJlcHJlc2VudGF0aW9uLCB0aGlzIHRlbGxzIHVz
IHRoYXQgQjMgY29uc3RhbnQtZm9sZGVkIHRoZSB2YWx1ZS4KKyAgICAgICAgQ29uc3RhbnQKKyAg
ICB9OworICAgIAorICAgIFZhbHVlUmVwKCkKKyAgICAgICAgOiBtX2tpbmQoQW55KQorICAgIHsK
KyAgICB9CisKKyAgICBleHBsaWNpdCBWYWx1ZVJlcChSZWcgcmVnKQorICAgICAgICA6IG1fa2lu
ZChSZWdpc3RlcikKKyAgICAgICAgLCBtX3ZhbHVlKHJlZy5pbmRleCgpKQorICAgIHsKKyAgICB9
CisKKyAgICBzdGF0aWMgVmFsdWVSZXAgcmVnKFJlZyByZWcpCisgICAgeworICAgICAgICByZXR1
cm4gVmFsdWVSZXAocmVnKTsKKyAgICB9CisKKyAgICBzdGF0aWMgVmFsdWVSZXAgc3RhY2soaW50
cHRyX3Qgb2Zmc2V0RnJvbUZQKQorICAgIHsKKyAgICAgICAgVmFsdWVSZXAgcmVzdWx0OworICAg
ICAgICByZXN1bHQubV9raW5kID0gU3RhY2s7CisgICAgICAgIHJlc3VsdC5tX3ZhbHVlID0gb2Zm
c2V0RnJvbUZQOworICAgIH0KKworICAgIHN0YXRpYyBWYWx1ZVJlcCBzdGFja0FyZ3VtZW50KGlu
dHB0cl90IG9mZnNldEZyb21TUCkKKyAgICB7CisgICAgICAgIFZhbHVlUmVwIHJlc3VsdDsKKyAg
ICAgICAgcmVzdWx0Lm1fa2luZCA9IFN0YWNrQXJndW1lbnQ7CisgICAgICAgIHJlc3VsdC5tX3Zh
bHVlID0gb2Zmc2V0RnJvbVNQOworICAgIH0KKworICAgIHN0YXRpYyBWYWx1ZVJlcCBjb25zdGFu
dChpbnQ2NF90IHZhbHVlKQorICAgIHsKKyAgICAgICAgVmFsdWVSZXAgcmVzdWx0OworICAgICAg
ICByZXN1bHQubV9raW5kID0gQ29uc3RhbnQ7CisgICAgICAgIHJlc3VsdC5tX3ZhbHVlID0gdmFs
dWU7CisgICAgfQorCisgICAgc3RhdGljIFZhbHVlUmVwIGNvbnN0YW50KGRvdWJsZSB2YWx1ZSkK
KyAgICB7CisgICAgICAgIHJldHVybiBWYWx1ZVJlcChiaXR3aXNlX2Nhc3Q8aW50NjRfdD4odmFs
dWUpKTsKKyAgICB9CisKKyAgICBLaW5kIGtpbmQoKSBjb25zdCB7IHJldHVybiBtX2tpbmQ7IH0K
KworICAgIGV4cGxpY2l0IG9wZXJhdG9yIGJvb2woKSBjb25zdCB7IHJldHVybiBraW5kKCkgIT0g
QW55OyB9CisKKyAgICBSZWcgcmVnKCkgY29uc3QKKyAgICB7CisgICAgICAgIEFTU0VSVChraW5k
KCkgPT0gUmVnaXN0ZXIpOworICAgICAgICByZXR1cm4gUmVnOjpmcm9tSW5kZXgobV92YWx1ZSk7
CisgICAgfQorCisgICAgaW50cHRyX3Qgb2Zmc2V0RnJvbUZQKCkgY29uc3QKKyAgICB7CisgICAg
ICAgIEFTU0VSVChraW5kKCkgPT0gU3RhY2spOworICAgICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8
aW50cHRyX3Q+KG1fdmFsdWUpOworICAgIH0KKworICAgIGludHB0cl90IG9mZnNldEZyb21TUCgp
IGNvbnN0CisgICAgeworICAgICAgICBBU1NFUlQoa2luZCgpID09IFN0YWNrQXJndW1lbnQpOwor
ICAgICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8aW50cHRyX3Q+KG1fdmFsdWUpOworICAgIH0KKwor
ICAgIGludDY0X3QgdmFsdWUoKSBjb25zdAorICAgIHsKKyAgICAgICAgQVNTRVJUKGtpbmQoKSA9
PSBDb25zdGFudCk7CisgICAgICAgIHJldHVybiBtX3ZhbHVlOworICAgIH0KKworICAgIGRvdWJs
ZSBkb3VibGVWYWx1ZSgpIGNvbnN0CisgICAgeworICAgICAgICByZXR1cm4gYml0d2lzZV9jYXN0
PGRvdWJsZT4odmFsdWUoKSk7CisgICAgfQorCisgICAgdm9pZCBkdW1wKFByaW50U3RyZWFtJikg
Y29uc3Q7CisKK3ByaXZhdGU6CisgICAgS2luZCBtX2tpbmQ7CisgICAgaW50NjRfdCBtX3ZhbHVl
OworfTsKKworfSB9IC8vIG5hbWVzcGFjZSBKU0M6OkIzCisKK25hbWVzcGFjZSBXVEYgeworCit2
b2lkIHByaW50SW50ZXJuYWwoUHJpbnRTdHJlYW0mLCBKU0M6OkIzOjpWYWx1ZVJlcDo6S2luZCk7
CisKK30gLy8gbmFtZXNwYWNlIFdURgorCisjZW5kaWYgLy8gQjNWYWx1ZVJlcF9oCisKSW5kZXg6
IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9nZW5lcmF0ZV9wYXR0ZXJuX21hdGNoZXIucmIKPT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL2dlbmVyYXRlX3BhdHRlcm5fbWF0
Y2hlci5yYgkocmV2aXNpb24gMCkKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9nZW5lcmF0
ZV9wYXR0ZXJuX21hdGNoZXIucmIJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSw0OTMgQEAKKyMh
L3Vzci9iaW4vZW52IHJ1YnkKKworIyBDb3B5cmlnaHQgKEMpIDIwMTUgQXBwbGUgSW5jLiBBbGwg
cmlnaHRzIHJlc2VydmVkLgorIworIyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBh
bmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyMgbW9kaWZpY2F0aW9uLCBhcmUgcGVy
bWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisjIGFyZSBtZXQ6
CisjIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJv
dmUgY29weXJpZ2h0CisjICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRo
ZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyMgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBm
b3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyMgICAgbm90aWNlLCB0aGlz
IGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQor
IyAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0
aGUgZGlzdHJpYnV0aW9uLgorIworIyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExF
IElOQy4gQU5EIElUUyBDT05UUklCVVRPUlMgYGBBUyBJUycnCisjIEFORCBBTlkgRVhQUkVTUyBP
UiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorIyBU
SEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1Ig
QSBQQVJUSUNVTEFSCisjIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxM
IEFQUExFIElOQy4gT1IgSVRTIENPTlRSSUJVVE9SUworIyBCRSBMSUFCTEUgRk9SIEFOWSBESVJF
Q1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCisjIENPTlNF
UVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVN
RU5UIE9GCisjIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRB
LCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUworIyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VE
IEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTgorIyBDT05UUkFDVCwg
U1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJX
SVNFKQorIyBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FS
RSwgRVZFTiBJRiBBRFZJU0VEIE9GCisjIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4K
KworcmVxdWlyZSAicGF0aG5hbWUiCisKKyR2YXJJbmRleCA9IDAKK2RlZiBuZXdWYXIKKyAgICAk
dmFySW5kZXggKz0gMQorICAgICJfdG1wI3skdmFySW5kZXh9IgorZW5kCisKK2NsYXNzIFByb2R1
Y3Rpb24KKyAgICBhdHRyX3JlYWRlciA6b3JpZ2luLCA6bmFtZSwgOnZhck5hbWUsIDphbm9ueW1v
dXMsIDpvcGNvZGUsIDpjaGlsZHJlbgorCisgICAgZGVmIGluaXRpYWxpemUob3JpZ2luLCBuYW1l
LCBvcGNvZGUsIGNoaWxkcmVuKQorICAgICAgICBAb3JpZ2luID0gb3JpZ2luCisgICAgICAgIEBu
YW1lID0gbmFtZQorICAgICAgICBAYW5vbnltb3VzID0gKG5hbWUgPT0gbmlsIG9yIG5hbWUgPX4g
L1xBXCQoWzAtOV0rKVxaLykKKyAgICAgICAgQHZhck5hbWUgPSBAYW5vbnltb3VzID8gbmV3VmFy
IDogbmFtZQorICAgICAgICBAb3Bjb2RlID0gb3Bjb2RlCisgICAgICAgIEBjaGlsZHJlbiA9IGNo
aWxkcmVuID8gY2hpbGRyZW4gOiBbXQorICAgIGVuZAorCisgICAgZGVmIGhhc09wY29kZQorICAg
ICAgICBvcGNvZGUgIT0gbmlsCisgICAgZW5kCisKKyAgICBkZWYgZWFjaFZhcmlhYmxlKCZwcm9j
KQorICAgICAgICBjaGlsZHJlbi5lYWNoX3dpdGhfaW5kZXggeworICAgICAgICAgICAgfCBjaGls
ZCwgaW5kZXggfAorICAgICAgICAgICAgeWllbGQgdmFyTmFtZSwKKyAgICAgICAgICAgICAgICAg
IGNoaWxkLm5hbWUsCisgICAgICAgICAgICAgICAgICBjaGlsZC52YXJOYW1lLAorICAgICAgICAg
ICAgICAgICAgY2hpbGQuYW5vbnltb3VzID8gKGNoaWxkLm9wY29kZSA/IDphbm9uSW50ZXJuYWwg
OiA6YW5vbk9wZXJhbmQpIDogKGNoaWxkLm9wY29kZSA/IDppbnRlcm5hbCA6IDpvcGVyYW5kKSwK
KyAgICAgICAgICAgICAgICAgIGluZGV4CisgICAgICAgICAgICBjaGlsZC5lYWNoVmFyaWFibGUo
JnByb2MpCisgICAgICAgIH0KKyAgICBlbmQKK2VuZAorCitjbGFzcyBNYXRjaGVyCisgICAgYXR0
cl9yZWFkZXIgOm5hbWUsIDpwcm9kdWN0aW9ucworCisgICAgZGVmIGluaXRpYWxpemUobmFtZSwg
cHJvZHVjdGlvbnMpCisgICAgICAgIEBuYW1lID0gbmFtZQorICAgICAgICBAcHJvZHVjdGlvbnMg
PSBwcm9kdWN0aW9ucworICAgIGVuZAorZW5kCisKK2NsYXNzIE9yaWdpbgorICAgIGF0dHJfcmVh
ZGVyIDpmaWxlTmFtZSwgOmxpbmVOdW1iZXIKKyAgICAKKyAgICBkZWYgaW5pdGlhbGl6ZShmaWxl
TmFtZSwgbGluZU51bWJlcikKKyAgICAgICAgQGZpbGVOYW1lID0gZmlsZU5hbWUKKyAgICAgICAg
QGxpbmVOdW1iZXIgPSBsaW5lTnVtYmVyCisgICAgZW5kCisgICAgCisgICAgZGVmIHRvX3MKKyAg
ICAgICAgIiN7ZmlsZU5hbWV9OiN7bGluZU51bWJlcn0iCisgICAgZW5kCitlbmQKKworY2xhc3Mg
VG9rZW4KKyAgICBhdHRyX3JlYWRlciA6b3JpZ2luLCA6c3RyaW5nCisgICAgCisgICAgZGVmIGlu
aXRpYWxpemUob3JpZ2luLCBzdHJpbmcpCisgICAgICAgIEBvcmlnaW4gPSBvcmlnaW4KKyAgICAg
ICAgQHN0cmluZyA9IHN0cmluZworICAgIGVuZAorICAgIAorICAgIGRlZiA9PShvdGhlcikKKyAg
ICAgICAgaWYgb3RoZXIuaXNfYT8gVG9rZW4KKyAgICAgICAgICAgIEBzdHJpbmcgPT0gb3RoZXIu
c3RyaW5nCisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIEBzdHJpbmcgPT0gb3RoZXIKKyAgICAg
ICAgZW5kCisgICAgZW5kCisgICAgCisgICAgZGVmID1+KG90aGVyKQorICAgICAgICBAc3RyaW5n
ID1+IG90aGVyCisgICAgZW5kCisgICAgCisgICAgZGVmIHRvX3MKKyAgICAgICAgIiN7QHN0cmlu
Zy5pbnNwZWN0fSBhdCAje29yaWdpbn0iCisgICAgZW5kCisgICAgCisgICAgZGVmIHBhcnNlRXJy
b3IoKmNvbW1lbnQpCisgICAgICAgIGlmIGNvbW1lbnQuZW1wdHk/CisgICAgICAgICAgICByYWlz
ZSAiUGFyc2UgZXJyb3I6ICN7dG9fc30iCisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHJhaXNl
ICJQYXJzZSBlcnJvcjogI3t0b19zfTogI3tjb21tZW50WzBdfSIKKyAgICAgICAgZW5kCisgICAg
ZW5kCitlbmQKKworZGVmIGxleChzdHIsIGZpbGVOYW1lKQorICAgIGZpbGVOYW1lID0gUGF0aG5h
bWUubmV3KGZpbGVOYW1lKQorICAgIHJlc3VsdCA9IFtdCisgICAgbGluZU51bWJlciA9IDEKKyAg
ICB3aGlsZSBub3Qgc3RyLmVtcHR5PworICAgICAgICBjYXNlIHN0cgorICAgICAgICB3aGVuIC9c
QVwjKFteXG5dKikvCisgICAgICAgICAgICAjIGNvbW1lbnQsIGlnbm9yZQorICAgICAgICB3aGVu
IC9cQVxuLworICAgICAgICAgICAgIyBuZXdsaW5lLCBpZ25vcmUKKyAgICAgICAgICAgIGxpbmVO
dW1iZXIgKz0gMQorICAgICAgICB3aGVuIC9cQVthLXpBLVowLTkkXShbYS16QS1aMC05X10qKS8K
KyAgICAgICAgICAgIHJlc3VsdCA8PCBUb2tlbi5uZXcoT3JpZ2luLm5ldyhmaWxlTmFtZSwgbGlu
ZU51bWJlciksICQmKQorICAgICAgICB3aGVuIC9cQShbIFx0XHJdKykvCisgICAgICAgICAgICAj
IHdoaXRlc3BhY2UsIGlnbm9yZQorICAgICAgICB3aGVuIC9cQVs9KCksXS8KKyAgICAgICAgICAg
IHJlc3VsdCA8PCBUb2tlbi5uZXcoT3JpZ2luLm5ldyhmaWxlTmFtZSwgbGluZU51bWJlciksICQm
KQorICAgICAgICBlbHNlCisgICAgICAgICAgICByYWlzZSAiTGV4ZXIgZXJyb3IgYXQgI3tPcmln
aW4ubmV3KGZpbGVOYW1lLCBsaW5lTnVtYmVyKS50b19zfSwgdW5leHBlY3RlZCBzZXF1ZW5jZSAj
e3N0clswLi4yMF0uaW5zcGVjdH0iCisgICAgICAgIGVuZAorICAgICAgICBzdHIgPSAkfi5wb3N0
X21hdGNoCisgICAgZW5kCisgICAgcmVzdWx0CitlbmQKKworZGVmIGlzS2V5d29yZCh0b2tlbikK
KyAgICAjIFdlIGNhbiBleHRlbmQgdGhpcyBhcyB3ZSBhZGQgbW9yZSBrZXl3b3Jkcy4gTGlrZSwg
d2UgbWlnaHQgd2FudCAiaW5jbHVkZSIgZXZlbnR1YWxseS4KKyAgICB0b2tlbiA9fiAvXEEoKG1h
dGNoZXIpKVxaLworZW5kCisKK2RlZiBpc0lkZW50aWZpZXIodG9rZW4pCisgICAgdG9rZW4gPX4g
L1xBW2EtekEtWjAtOSRdKFthLXpBLVowLTlfXSopXFovIGFuZCBub3QgaXNLZXl3b3JkKHRva2Vu
KQorZW5kCisKK2NsYXNzIFBhcnNlcgorICAgIGRlZiBpbml0aWFsaXplKGRhdGEsIGZpbGVOYW1l
KQorICAgICAgICBAdG9rZW5zID0gbGV4KGRhdGEsIGZpbGVOYW1lKQorICAgICAgICBAaWR4ID0g
MAorICAgIGVuZAorCisgICAgZGVmIHRva2VuCisgICAgICAgIEB0b2tlbnNbQGlkeF0KKyAgICBl
bmQKKworICAgIGRlZiBhZHZhbmNlCisgICAgICAgIEBpZHggKz0gMQorICAgIGVuZAorCisgICAg
ZGVmIHBhcnNlRXJyb3IoKmNvbW1lbnQpCisgICAgICAgIGlmIHRva2VuCisgICAgICAgICAgICB0
b2tlbi5wYXJzZUVycm9yKCpjb21tZW50KQorICAgICAgICBlbHNlCisgICAgICAgICAgICBpZiBj
b21tZW50LmVtcHR5PworICAgICAgICAgICAgICAgIHJhaXNlICJQYXJzZSBlcnJvciBhdCBlbmQg
b2YgZmlsZSIKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICByYWlzZSAiUGFyc2Ug
ZXJyb3IgYXQgZW5kIG9mIGZpbGU6ICN7Y29tbWVudFswXX0iCisgICAgICAgICAgICBlbmQKKyAg
ICAgICAgZW5kCisgICAgZW5kCisKKyAgICBkZWYgY29uc3VtZShzdHJpbmcpCisgICAgICAgIHBh
cnNlRXJyb3IoIkV4cGVjdGVkICN7c3RyaW5nfSIpIHVubGVzcyB0b2tlbiA9PSBzdHJpbmcKKyAg
ICAgICAgYWR2YW5jZQorICAgIGVuZAorCisgICAgZGVmIGNvbnN1bWVJZGVudGlmaWVyCisgICAg
ICAgIHJlc3VsdCA9IHRva2VuLnN0cmluZworICAgICAgICBwYXJzZUVycm9yKCJFeHBlY3RlZCBp
ZGVudGlmaWVyIikgdW5sZXNzIGlzSWRlbnRpZmllcihyZXN1bHQpCisgICAgICAgIGFkdmFuY2UK
KyAgICAgICAgcmVzdWx0CisgICAgZW5kCisKKyAgICBkZWYgYWRkVW5pcXVlKG5hbWUsIHByb2R1
Y3Rpb25zLCBwcm9kdWN0aW9uKQorICAgICAgICBpZiBuYW1lID09IHByb2R1Y3Rpb24udmFyTmFt
ZQorICAgICAgICAgICAgcGFyc2VFcnJvcigiQ2hpbGQgcHJvZHVjdGlvbiBoYXMgc2FtZSBuYW1l
IGFzIHBhcmVudCBwcm9kdWN0aW9uIikKKyAgICAgICAgZW5kCisgICAgICAgIGlmIHByb2R1Y3Rp
b25zLmRldGVjdCB7IHwgZW50cnkgfCBlbnRyeS5uYW1lID09IHByb2R1Y3Rpb24ubmFtZSB9Cisg
ICAgICAgICAgICBwYXJzZUVycm9yKCJEdXBsaWNhdGUgcHJvZHVjdGlvbiIpCisgICAgICAgIGVu
ZAorICAgICAgICBwcm9kdWN0aW9ucyA8PCBwcm9kdWN0aW9uCisgICAgZW5kCisKKyAgICBkZWYg
cGFyc2UKKyAgICAgICAgY29uc3VtZSgibWF0Y2hlciIpCisKKyAgICAgICAgbWF0Y2hlck5hbWUg
PSBjb25zdW1lSWRlbnRpZmllcgorCisgICAgICAgIHByb2R1Y3Rpb25zID0gW10KKworICAgICAg
ICBsb29wIHsKKyAgICAgICAgICAgIGJyZWFrIGlmIEBpZHggPj0gQHRva2Vucy5sZW5ndGgKKwor
ICAgICAgICAgICAgIyBXZSBtaWdodCB3YW50IHRvIHN1cHBvcnQgImluY2x1ZGUiLiBJZiB3ZSBk
aWQgdGhhdCwgaXQgd291bGQgZ28gaGVyZS4KKyAgICAgICAgICAgIHByb2R1Y3Rpb24gPSBwYXJz
ZVByb2R1Y3Rpb24KKyAgICAgICAgICAgIAorICAgICAgICAgICAgaWYgcHJvZHVjdGlvbnMuZGV0
ZWN0IHsgfCBlbnRyeSB8IGVudHJ5Lm5hbWUgPT0gcHJvZHVjdGlvbi5uYW1lIH0KKyAgICAgICAg
ICAgICAgICBwYXJzZUVycm9yKCJEdXBsaWNhdGUgcHJvZHVjdGlvbiIpCisgICAgICAgICAgICBl
bmQKKworICAgICAgICAgICAgcHJvZHVjdGlvbnMgPDwgcHJvZHVjdGlvbgorICAgICAgICB9CisK
KyAgICAgICAgTWF0Y2hlci5uZXcobWF0Y2hlck5hbWUsIHByb2R1Y3Rpb25zKQorICAgIGVuZAor
CisgICAgZGVmIHBhcnNlUHJvZHVjdGlvbgorICAgICAgICBvcmlnaW4gPSB0b2tlbi5vcmlnaW4K
KyAgICAgICAgbmFtZSA9IGNvbnN1bWVJZGVudGlmaWVyCisKKyAgICAgICAgaWYgdG9rZW4gPT0g
Ij0iCisgICAgICAgICAgICBjb25zdW1lKCI9IikKKyAgICAgICAgICAgIG9wY29kZSA9IGNvbnN1
bWVJZGVudGlmaWVyCisgICAgICAgICAgICBjb25zdW1lKCIoIikKKyAgICAgICAgZWxzaWYgdG9r
ZW4gPT0gIigiCisgICAgICAgICAgICBjb25zdW1lKCIoIikKKyAgICAgICAgICAgIG9wY29kZSA9
IG5hbWUKKyAgICAgICAgICAgIG5hbWUgPSBuaWwKKyAgICAgICAgZWxzZQorICAgICAgICAgICAg
cmV0dXJuIFByb2R1Y3Rpb24ubmV3KG9yaWdpbiwgbmFtZSwgbmlsLCBuaWwpCisgICAgICAgIGVu
ZAorICAgICAgICAKKyAgICAgICAgcHJvZHVjdGlvbnMgPSBbXQorICAgICAgICBsb29wIHsKKyAg
ICAgICAgICAgIGJyZWFrIGlmIHRva2VuID09ICIpIgorCisgICAgICAgICAgICBhZGRVbmlxdWUo
bmFtZSwgcHJvZHVjdGlvbnMsIHBhcnNlUHJvZHVjdGlvbikKKworICAgICAgICAgICAgYnJlYWsg
aWYgdG9rZW4gPT0gIikiCisgICAgICAgICAgICBjb25zdW1lKCIsIikKKyAgICAgICAgfQorCisg
ICAgICAgICMgQWR2YW5jZSBhZnRlciB0aGUgIikiCisgICAgICAgIGFkdmFuY2UKKworICAgICAg
ICBQcm9kdWN0aW9uLm5ldyhvcmlnaW4sIG5hbWUsIG9wY29kZSwgcHJvZHVjdGlvbnMpCisgICAg
ZW5kCitlbmQKKworZmlsZU5hbWUgPSBBUkdWWzBdCisKK3BhcnNlciA9IFBhcnNlci5uZXcoSU86
OnJlYWQoZmlsZU5hbWUpLCBmaWxlTmFtZSkKK21hdGNoZXIgPSBwYXJzZXIucGFyc2UKKworY2xh
c3MgU3ViTWF0Y2gKKyAgICBhdHRyX3JlYWRlciA6aW5kZXhNYXAsIDpwcm9kdWN0aW9ucworICAg
IAorICAgIGRlZiBpbml0aWFsaXplKGluZGV4TGlzdCwgcHJvZHVjdGlvbnMpCisgICAgICAgIEBp
bmRleE1hcCA9IFtdCisgICAgICAgIEBwcm9kdWN0aW9ucyA9IFtdCisgICAgICAgIGluZGV4TGlz
dC5lYWNoIHsKKyAgICAgICAgICAgIHwgaW5kZXggfAorICAgICAgICAgICAgQGluZGV4TWFwIDw8
IGluZGV4CisgICAgICAgICAgICBAcHJvZHVjdGlvbnMgPDwgcHJvZHVjdGlvbnNbaW5kZXhdCisg
ICAgICAgIH0KKyAgICBlbmQKKworICAgIGRlZiBtYXBJbmRleExpc3QoaW5kZXhMaXN0KQorICAg
ICAgICBpbmRleExpc3QubWFwIHsKKyAgICAgICAgICAgIHwgaW5kZXggfAorICAgICAgICAgICAg
QGluZGV4TWFwW2luZGV4XQorICAgICAgICB9CisgICAgZW5kCitlbmQKKworRmlsZS5vcGVuKCJC
MyIgKyBtYXRjaGVyLm5hbWUgKyAiLmgiLCAidyIpIHsKKyAgICB8IG91dHAgfAorCisgICAgb3V0
cC5wdXRzICIvLyBHZW5lcmF0ZWQgYnkgZ2VuZXJhdGVfcGF0dGVybl9tYXRjaGVyLnJiIGZyb20g
I3tmaWxlTmFtZX0gLS0gZG8gbm90IGVkaXQhIgorCisgICAgb3V0cC5wdXRzICIjaWZuZGVmIEIz
I3ttYXRjaGVyLm5hbWV9X2giCisgICAgb3V0cC5wdXRzICIjZGVmaW5lIEIzI3ttYXRjaGVyLm5h
bWV9X2giCisgICAgCisgICAgb3V0cC5wdXRzICIjaW5jbHVkZSBcIkIzVmFsdWUuaFwiIgorICAg
IAorICAgIG91dHAucHV0cyAibmFtZXNwYWNlIEpTQyB7IG5hbWVzcGFjZSBCMyB7IgorCisgICAg
b3V0cC5wdXRzICJ0ZW1wbGF0ZTx0eXBlbmFtZSBBZGFwdG9yPiIKKyAgICBvdXRwLnB1dHMgInZv
aWQgcnVuI3ttYXRjaGVyLm5hbWV9KFZhbHVlKiBfdmFsdWUsIEFkYXB0b3ImIGFkYXB0b3IpIgor
ICAgIG91dHAucHV0cyAieyIKKworICAgICMgTm90ZSB0aGF0IHRoaXMgZG9lcyBub3QgZW1pdCBw
cm9wZXJseSBpbmRlbnRlZCBjb2RlLCBiZWNhdXNlIGl0J3MgYSByZWN1cnNpdmUgZW1pdHRlci4g
SWYgeW91CisgICAgIyB3YW50IHRvIHNlZSB0aGUgY29kZSBuaWNlbHkgZm9ybWF0dGVkLCBvcGVu
IGl0IGluIGEgZ29vZCB0ZXh0IGVkaXRvciBhbmQgYXNrIGl0IHRvIGZvcm1hdCBpdAorICAgICMg
Zm9yIHlvdS4KKworICAgICMgSW4gb2RkIHNpdHVhdGlvbnMsIHdlIG1heSBub3QgdXNlIHRoZSBp
bnB1dCB2YWx1ZS4gVGVsbCB0aGUgY29tcGlsZXIgdG8gY2hpbGwgb3V0IGFib3V0IGl0LgorICAg
IG91dHAucHV0cyAiVU5VU0VEX1BBUkFNKF92YWx1ZSk7IgorICAgICAgICAKKyAgICAjIFRoaXMg
anVzdCBwcm90ZWN0cyB0aGUgY2FsbGVyIGZyb20gaGF2aW5nIHRvIHdvcnJ5IGFib3V0IHByb2R1
Y3Rpb25zIGhhdmluZyBkaWZmZXJlbnQgbGVuZ3Rocy4KKyAgICBkZWYgbWF0Y2hMZW5ndGgob3V0
cCwgdmFsdWVOYW1lLCBwcm9kdWN0aW9ucykKKyAgICAgICAgaW5kZXhMaXN0cyA9IFtdCisgICAg
ICAgIHByb2R1Y3Rpb25zLmVhY2hfd2l0aF9pbmRleCB7CisgICAgICAgICAgICB8IHByb2R1Y3Rp
b24sIGluZGV4IHwKKyAgICAgICAgICAgIGlmIGluZGV4TGlzdHNbLTFdIGFuZCBwcm9kdWN0aW9u
c1tpbmRleExpc3RzWy0xXVswXV0uY2hpbGRyZW4ubGVuZ3RoID09IHByb2R1Y3Rpb24uY2hpbGRy
ZW4ubGVuZ3RoCisgICAgICAgICAgICAgICAgaW5kZXhMaXN0c1stMV0gPDwgaW5kZXgKKyAgICAg
ICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBpbmRleExpc3RzIDw8IFtpbmRleF0KKyAgICAg
ICAgICAgIGVuZAorICAgICAgICB9CisKKyAgICAgICAgaW5kZXhMaXN0cy5lYWNoIHsKKyAgICAg
ICAgICAgIHwgaW5kZXhMaXN0IHwKKyAgICAgICAgICAgIGxlbmd0aCA9IHByb2R1Y3Rpb25zW2lu
ZGV4TGlzdFswXV0uY2hpbGRyZW4ubGVuZ3RoCisgICAgICAgICAgICBpZiBsZW5ndGggPiAwCisg
ICAgICAgICAgICAgICAgb3V0cC5wdXRzICJpZiAoI3t2YWx1ZU5hbWV9LT5jaGlsZHJlbi5zaXpl
KCkgPj0gI3tsZW5ndGh9KSB7IgorICAgICAgICAgICAgICAgIHlpZWxkIGluZGV4TGlzdAorICAg
ICAgICAgICAgICAgIG91dHAucHV0cyAifSIKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAg
ICAgICB5aWVsZCBpbmRleExpc3QKKyAgICAgICAgICAgIGVuZAorICAgICAgICB9CisgICAgZW5k
CisKKyAgICAjIFRoaXMgZWZmaWNpZW50bHkgc2VsZWN0cyBmcm9tIHRoZSBnaXZlbiBzZXQgb2Yg
cHJvZHVjdGlvbnMuIEl0IGFzc3VtZXMgdGhhdCBwcm9kdWN0aW9ucworICAgICMgYXJlIG5vdCBk
dXBsaWNhdGVkLiBJdCB5aWVsZHMgdGhlIGluZGV4IG9mIHRoZSBmb3VuZCBwcm9kdWN0aW9uLCBh
bmQgdGhlIGNvcm91dGluZSBpcworICAgICMgcmVzcG9uc2libGUgZm9yIGVtaXR0aW5nIHNwZWNp
ZmljIGNvZGUgZm9yIHRoYXQgcHJvZHVjdGlvbi4gVGhlIGNvcm91dGluZSBpcyBnaXZlbiBsaXN0
cyBvZgorICAgICMgaW5kaWNlcyBvZiBwb3NzaWJseS1tYXRjaGluZyBwcm9kdWN0aW9ucy4KKyAg
ICBkZWYgbWF0Y2hQcm9kdWN0aW9ucyhvdXRwLCB2YWx1ZU5hbWUsIHByb2R1Y3Rpb25zKQorICAg
ICAgICAjIEZpcnN0LCBzcGxpdCB0aGUgcHJvZHVjdGlvbnMgbGlzdCBpbnRvIHJ1bnMgb2YgcHJv
ZHVjdGlvbnMgd2l0aCBhbiBvcGNvZGUgYW5kIHByb2R1Y3Rpb25zCisgICAgICAgICMgd2l0aG91
dCBvbmUuCisgICAgICAgIGluZGV4TGlzdHMgPSBbXQorICAgICAgICBwcm9kdWN0aW9ucy5lYWNo
X3dpdGhfaW5kZXggeworICAgICAgICAgICAgfCBwcm9kdWN0aW9uLCBpbmRleCB8CisgICAgICAg
ICAgICBpZiBpbmRleExpc3RzWy0xXSBhbmQgcHJvZHVjdGlvbnNbaW5kZXhMaXN0c1stMV1bMF1d
Lmhhc09wY29kZSA9PSBwcm9kdWN0aW9uLmhhc09wY29kZQorICAgICAgICAgICAgICAgIGluZGV4
TGlzdHNbLTFdIDw8IGluZGV4CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgaW5k
ZXhMaXN0cyA8PCBbaW5kZXhdCisgICAgICAgICAgICBlbmQKKyAgICAgICAgfQorICAgICAgICAK
KyAgICAgICAgIyBOb3csIGVtaXQgcGF0dGVybiBtYXRjaGluZyBjb2RlLiBXZSBkbyBpdCBkaWZm
ZXJlbnRseSBmb3IgbGlzdHMgd2l0aCBhbiBvcGNvZGUgdGhhbiBmb3IKKyAgICAgICAgIyBsaXN0
cyB3aXRob3V0IG9uZS4KKyAgICAgICAgaW5kZXhMaXN0cy5lYWNoIHsKKyAgICAgICAgICAgIHwg
aW5kZXhMaXN0IHwKKyAgICAgICAgICAgIGlmIHByb2R1Y3Rpb25zW2luZGV4TGlzdFswXV0uaGFz
T3Bjb2RlCisgICAgICAgICAgICAgICAgIyBOb3csIHdlIHNwbGl0IHRoaXMgaW5kZXggbGlzdCBp
bnRvIGdyb3VwcyBmb3IgZWFjaCBvcGNvZGUuCisgICAgICAgICAgICAgICAgZ3JvdXBzID0ge30K
KyAgICAgICAgICAgICAgICBpbmRleExpc3QuZWFjaCB7CisgICAgICAgICAgICAgICAgICAgIHwg
aW5kZXggfAorICAgICAgICAgICAgICAgICAgICBwcm9kdWN0aW9uID0gcHJvZHVjdGlvbnNbaW5k
ZXhdCisgICAgICAgICAgICAgICAgICAgIGlmIGdyb3Vwc1twcm9kdWN0aW9uLm9wY29kZV0KKyAg
ICAgICAgICAgICAgICAgICAgICAgIGdyb3Vwc1twcm9kdWN0aW9uLm9wY29kZV0gPDwgaW5kZXgK
KyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgZ3JvdXBz
W3Byb2R1Y3Rpb24ub3Bjb2RlXSA9IFtpbmRleF0KKyAgICAgICAgICAgICAgICAgICAgZW5kCisg
ICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgIyBFbWl0IGEgc3dpdGNoIHN0YXRl
bWVudC4KKyAgICAgICAgICAgICAgICBvdXRwLnB1dHMgInN3aXRjaCAoI3t2YWx1ZU5hbWV9LT5v
cGNvZGUoKSkgeyIKKyAgICAgICAgICAgICAgICBncm91cHMuZWFjaF9wYWlyIHsKKyAgICAgICAg
ICAgICAgICAgICAgfCBvcGNvZGUsIHN1YkluZGV4TGlzdCB8CisgICAgICAgICAgICAgICAgICAg
IG91dHAucHV0cyAiY2FzZSAje29wY29kZX06IgorICAgICAgICAgICAgICAgICAgICBzdWJNYXRj
aCA9IFN1Yk1hdGNoLm5ldyhzdWJJbmRleExpc3QsIHByb2R1Y3Rpb25zKQorICAgICAgICAgICAg
ICAgICAgICBtYXRjaExlbmd0aChvdXRwLCB2YWx1ZU5hbWUsIHN1Yk1hdGNoLnByb2R1Y3Rpb25z
KSB7CisgICAgICAgICAgICAgICAgICAgICAgICB8IGluZGV4TGlzdCB8CisgICAgICAgICAgICAg
ICAgICAgICAgICB5aWVsZCBzdWJNYXRjaC5tYXBJbmRleExpc3QoaW5kZXhMaXN0KQorICAgICAg
ICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIG91dHAucHV0cyAiYnJlYWs7Igor
ICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBvdXRwLnB1dHMgImRlZmF1bHQ6Igor
ICAgICAgICAgICAgICAgIG91dHAucHV0cyAiYnJlYWs7IgorICAgICAgICAgICAgICAgIG91dHAu
cHV0cyAifSIKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBzdWJNYXRjaCA9IFN1
Yk1hdGNoLm5ldyhpbmRleExpc3QsIHByb2R1Y3Rpb25zKQorICAgICAgICAgICAgICAgIG1hdGNo
TGVuZ3RoKG91dHAsIHZhbHVlTmFtZSwgc3ViTWF0Y2gucHJvZHVjdGlvbnMpIHsKKyAgICAgICAg
ICAgICAgICAgICAgfCBpbmRleExpc3QgfAorICAgICAgICAgICAgICAgICAgICB5aWVsZCBzdWJN
YXRjaC5tYXBJbmRleExpc3QoaW5kZXhMaXN0KQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAg
ICAgIGVuZAorICAgICAgICB9CisgICAgZW5kCisKKyAgICAjIFRha2VzIHByb2R1Y3Rpb25zIHRo
YXQgaGF2ZSB0aGUgc2FtZSBvcGNvZGUgYW5kIHRoZSBzYW1lIGxlbmd0aCBhbmQgc2VsZWN0cyBm
cm9tIHRoZW0gYmFzZWQgb24KKyAgICAjIHRoZSBwcm9kdWN0aW9ucyBhdCB0aGUgZ2l2ZW4gY29s
dW1uLgorICAgIGRlZiBtYXRjaENvbHVtbihvdXRwLCB2YWx1ZU5hbWUsIHByb2R1Y3Rpb25zLCBj
b2x1bW5JbmRleCkKKyAgICAgICAgaWYgY29sdW1uSW5kZXggPj0gcHJvZHVjdGlvbnNbMF0uY2hp
bGRyZW4ubGVuZ3RoCisgICAgICAgICAgICB5aWVsZCAoMC4uLihwcm9kdWN0aW9ucy5zaXplKSku
dG9fYQorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIGVuZAorCisgICAgICAgIHN1YlZhbHVl
ID0gbmV3VmFyCisgICAgICAgIAorICAgICAgICBvdXRwLnB1dHMgInsiCisgICAgICAgIG91dHAu
cHV0cyAiVmFsdWUqICN7c3ViVmFsdWV9ID0gI3t2YWx1ZU5hbWV9LT5jaGlsZCgje2NvbHVtbklu
ZGV4fSk7IgorCisgICAgICAgICMgV2UgbWF5IG5vdCB1c2UgdGhpcyB2YWx1ZS4gVGVsbCB0aGUg
Y29tcGlsZXIgdG8gY2hpbGwgb3V0IGFib3V0IGl0LgorICAgICAgICBvdXRwLnB1dHMgIlVOVVNF
RF9QQVJBTSgje3N1YlZhbHVlfSk7IgorICAgICAgICAKKyAgICAgICAgc3ViUHJvZHVjdGlvbnMg
PSBwcm9kdWN0aW9ucy5tYXAgeworICAgICAgICAgICAgfCBwcm9kdWN0aW9uIHwKKyAgICAgICAg
ICAgIHByb2R1Y3Rpb24uY2hpbGRyZW5bY29sdW1uSW5kZXhdCisgICAgICAgIH0KKworICAgICAg
ICBtYXRjaFJlY3Vyc2l2ZWx5KG91dHAsIHN1YlZhbHVlLCBzdWJQcm9kdWN0aW9ucykgeworICAg
ICAgICAgICAgfCBpbmRleExpc3QgfAorICAgICAgICAgICAgc3ViTWF0Y2ggPSBTdWJNYXRjaC5u
ZXcoaW5kZXhMaXN0LCBwcm9kdWN0aW9ucykKKyAgICAgICAgICAgIG1hdGNoQ29sdW1uKG91dHAs
IHZhbHVlTmFtZSwgc3ViTWF0Y2gucHJvZHVjdGlvbnMsIGNvbHVtbkluZGV4ICsgMSkgeworICAg
ICAgICAgICAgICAgIHwgaW5kZXhMaXN0IHwKKyAgICAgICAgICAgICAgICB5aWVsZCBzdWJNYXRj
aC5tYXBJbmRleExpc3QoaW5kZXhMaXN0KQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAg
ICAgICAgb3V0cC5wdXRzICJ9IgorICAgIGVuZAorCisgICAgZGVmIG1hdGNoUmVjdXJzaXZlbHko
b3V0cCwgdmFsdWVOYW1lLCBwcm9kdWN0aW9ucykKKyAgICAgICAgbWF0Y2hQcm9kdWN0aW9ucyhv
dXRwLCB2YWx1ZU5hbWUsIHByb2R1Y3Rpb25zKSB7CisgICAgICAgICAgICB8IGluZGV4TGlzdCB8
CisgICAgICAgICAgICAjIFdlIGFyZSBndWFyYW50ZWVkIHRoYXQgdGhpcyBpbmRleCBsaXN0IGNv
bnRhaW5zIHByb2R1Y3Rpb25zIHdpdGggdGhlIHNhbWUgb3Bjb2RlIGFuZAorICAgICAgICAgICAg
IyB0aGUgc2FtZSBsZW5ndGguCisgICAgICAgICAgICBzdWJNYXRjaCA9IFN1Yk1hdGNoLm5ldyhp
bmRleExpc3QsIHByb2R1Y3Rpb25zKQorICAgICAgICAgICAgbWF0Y2hDb2x1bW4ob3V0cCwgdmFs
dWVOYW1lLCBzdWJNYXRjaC5wcm9kdWN0aW9ucywgMCkgeworICAgICAgICAgICAgICAgIHwgaW5k
ZXhMaXN0IHwKKyAgICAgICAgICAgICAgICB5aWVsZCBzdWJNYXRjaC5tYXBJbmRleExpc3QoaW5k
ZXhMaXN0KQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgZW5kCisKKyAgICBtYXRjaFJl
Y3Vyc2l2ZWx5KG91dHAsICJfdmFsdWUiLCBtYXRjaGVyLnByb2R1Y3Rpb25zKSB7CisgICAgICAg
IHwgaW5kZXhMaXN0IHwKKyAgICAgICAgaW5kZXhMaXN0LmVhY2ggeworICAgICAgICAgICAgfCBp
bmRleCB8CisgICAgICAgICAgICBwcm9kdWN0aW9uID0gbWF0Y2hlci5wcm9kdWN0aW9uc1tpbmRl
eF0KKyAgICAgICAgICAgIG91dHAucHV0cyAieyIKKyAgICAgICAgICAgIG91dHAucHV0cyAiVmFs
dWUqICN7cHJvZHVjdGlvbi52YXJOYW1lfSA9IF92YWx1ZTsiCisgICAgICAgICAgICBpbnRlcm5h
bEFyZ3VtZW50cyA9IFtdCisgICAgICAgICAgICBvcGVyYW5kQXJndW1lbnRzID0gW10KKyAgICAg
ICAgICAgIHRyeUFyZ3VtZW50cyA9IFtdCisgICAgICAgICAgICBudW1TY29wZXMgPSAwCisgICAg
ICAgICAgICBzZWVuID0ge30KKyAgICAgICAgICAgIHByb2R1Y3Rpb24uZWFjaFZhcmlhYmxlIHsK
KyAgICAgICAgICAgICAgICB8IHBhcmVudFZhck5hbWUsIGNoaWxkTmFtZSwgY2hpbGRWYXJOYW1l
LCBraW5kLCBpbmRleCB8CisgICAgICAgICAgICAgICAgbG9hZEV4cHIgPSAiI3twYXJlbnRWYXJO
YW1lfS0+Y2hpbGQoI3tpbmRleH0pIgorICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAg
IGlmIHNlZW5bY2hpbGRWYXJOYW1lXQorICAgICAgICAgICAgICAgICAgICB0bXAgPSBuZXdWYXIK
KyAgICAgICAgICAgICAgICAgICAgb3V0cC5wdXRzICJWYWx1ZSogI3t0bXB9ID0gI3tsb2FkRXhw
cn07IgorICAgICAgICAgICAgICAgICAgICBvdXRwLnB1dHMgImlmICgje3RtcH0gPT0gI3tjaGls
ZFZhck5hbWV9KSB7IgorICAgICAgICAgICAgICAgICAgICBudW1TY29wZXMgKz0gMQorICAgICAg
ICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgc2VlbltjaGlsZFZhck5hbWVdID0g
dHJ1ZQorICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgb3V0cC5wdXRz
ICJWYWx1ZSogI3tjaGlsZFZhck5hbWV9ID0gI3tsb2FkRXhwcn07IgorCisgICAgICAgICAgICAg
ICAgICAgIGlmIGNoaWxkTmFtZSA9fiAvXEFcJC8KKyAgICAgICAgICAgICAgICAgICAgICAgIGlm
IGNoaWxkTmFtZSA9fiAvXEFcJChbMC05XSspXFovCisgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgb3V0cC5wdXRzICJpZiAoI3tjaGlsZFZhck5hbWV9LT5pc0ludCgjeyQxfSkpIHsiCisgICAg
ICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0
cC5wdXRzICJpZiAoI3tjaGlsZFZhck5hbWV9LT5oYXNJbnQoKSkgeyIKKyAgICAgICAgICAgICAg
ICAgICAgICAgIGVuZAorICAgICAgICAgICAgICAgICAgICAgICAgbnVtU2NvcGVzICs9IDEKKyAg
ICAgICAgICAgICAgICAgICAgZW5kCisgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAg
ICAgICAgICBpbnRlcm5hbEFyZ3VtZW50cyA8PCBjaGlsZFZhck5hbWUgaWYga2luZCA9PSA6aW50
ZXJuYWwgb3Iga2luZCA9PSA6YW5vbkludGVybmFsCisgICAgICAgICAgICAgICAgICAgIG9wZXJh
bmRBcmd1bWVudHMgPDwgY2hpbGRWYXJOYW1lIGlmIGtpbmQgPT0gOm9wZXJhbmQgb3Iga2luZCA9
PSA6YW5vbk9wZXJhbmQKKyAgICAgICAgICAgICAgICAgICAgdHJ5QXJndW1lbnRzIDw8IGNoaWxk
VmFyTmFtZSBpZiBraW5kID09IDppbnRlcm5hbCBvciBraW5kID09IDpvcGVyYW5kCisgICAgICAg
ICAgICAgICAgZW5kCisgICAgICAgICAgICB9CisgICAgICAgICAgICBvdXRwLnB1dHMgImlmIChh
ZGFwdG9yLmFjY2VwdFJvb3QoX3ZhbHVlKSIKKyAgICAgICAgICAgIG91dHAucHV0cygiICAgICYm
IGFkYXB0b3IuYWNjZXB0SW50ZXJuYWxzKCIgKyBpbnRlcm5hbEFyZ3VtZW50cy5qb2luKCIsICIp
ICsgIikiKQorICAgICAgICAgICAgb3V0cC5wdXRzKCIgICAgJiYgYWRhcHRvci5hY2NlcHRPcGVy
YW5kcygiICsgb3BlcmFuZEFyZ3VtZW50cy5qb2luKCIsICIpICsgIikiKQorICAgICAgICAgICAg
b3V0cC5wdXRzKCIgICAgJiYgYWRhcHRvci50cnkje3Byb2R1Y3Rpb24ubmFtZX0oIiArIHRyeUFy
Z3VtZW50cy5qb2luKCIsICIpICsgIikpIikKKyAgICAgICAgICAgIG91dHAucHV0cyAiICAgIHJl
dHVybjsiCisgICAgICAgICAgICBudW1TY29wZXMudGltZXMgeworICAgICAgICAgICAgICAgIG91
dHAucHV0cyAifSIKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG91dHAucHV0cyAifSIKKyAg
ICAgICAgfQorICAgIH0KKyAgICAKKyAgICBvdXRwLnB1dHMgIiAgICBSRUxFQVNFX0FTU0VSVF9O
T1RfUkVBQ0hFRCgpOyIKKyAgICBvdXRwLnB1dHMgIn0iCisgICAgCisgICAgb3V0cC5wdXRzICJ9
IH0gLy8gbmFtZXNwYWNlIEpTQzo6QjMiCisKKyAgICBvdXRwLnB1dHMgIiNlbmRpZiAvLyBCMyN7
bWF0Y2hlci5uYW1lfV9oIgorfQpJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL2Fpci9B
aXJBcmcuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9haXIvQWly
QXJnLmNwcAkocmV2aXNpb24gMCkKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9haXIvQWly
QXJnLmNwcAkod29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDc1IEBACisvKgorICogQ29weXJpZ2h0
IChDKSAyMDE1IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3Ry
aWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhv
dXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xs
b3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBz
b3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2Us
IHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisg
KiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFi
b3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQg
dGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQv
b3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisg
KiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBB
TlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1Qg
TElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZ
IEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQu
ICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElB
QkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVY
RU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElN
SVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7
IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBU
SU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBX
SEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVE
SU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRI
RSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lC
SUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisKKyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNs
dWRlICJBaXJBcmcuaCIKKworbmFtZXNwYWNlIEpTQyB7IG5hbWVzcGFjZSBCMyB7IG5hbWVzcGFj
ZSBBaXIgeworCit2b2lkIEFyZzo6ZHVtcChQcmludFN0cmVhbSYgb3V0KSBjb25zdAoreworICAg
IHN3aXRjaCAobV9raW5kKSB7CisgICAgY2FzZSBUbXA6CisgICAgICAgIG91dC5wcmludCh0bXAo
KSk7CisgICAgICAgIHJldHVybjsKKyAgICBjYXNlIEltbToKKyAgICAgICAgb3V0LnByaW50KCIk
IiwgbV9vZmZzZXQpOworICAgICAgICByZXR1cm47CisgICAgY2FzZSBJbW1QdHI6CisgICAgICAg
IG91dC5wcmludGYoIiQweCV4IiwgbV9vZmZzZXQpOworICAgICAgICByZXR1cm47CisgICAgY2Fz
ZSBBZGRyOgorICAgICAgICBpZiAob2Zmc2V0KCkpCisgICAgICAgICAgICBvdXQucHJpbnQob2Zm
c2V0KCkpOworICAgICAgICBvdXQucHJpbnQoIigiLCBiYXNlKCksICIpIik7CisgICAgICAgIHJl
dHVybjsKKyAgICBjYXNlIEluZGV4OgorICAgICAgICBpZiAob2Zmc2V0KCkpCisgICAgICAgICAg
ICBvdXQucHJpbnQob2Zmc2V0KCkpOworICAgICAgICBvdXQucHJpbnQoIigiLCBiYXNlKCksICIs
IiwgaW5kZXgoKSk7CisgICAgICAgIGlmIChzY2FsZSgpICE9IDEpCisgICAgICAgICAgICBvdXQu
cHJpbnQoIiwiLCBzY2FsZSgpKTsKKyAgICAgICAgb3V0LnByaW50KCIpIik7CisgICAgICAgIHJl
dHVybjsKKyAgICBjYXNlIFN0YWNrOgorICAgICAgICBpZiAob2Zmc2V0KCkpCisgICAgICAgICAg
ICBvdXQucHJpbnQob2Zmc2V0KTsKKyAgICAgICAgb3V0LnByaW50KCIoIiwgcG9pbnRlckR1bXAo
c3RhY2tTbG90KCkpLCAiKSIpOworICAgICAgICByZXR1cm47CisgICAgY2FzZSBDYWxsQXJnOgor
ICAgICAgICBpZiAob2Zmc2V0KCkpCisgICAgICAgICAgICBvdXQucHJpbnQob2Zmc2V0KTsKKyAg
ICAgICAgb3V0LnByaW50KCIoY2FsbEFyZykiKTsKKyAgICAgICAgcmV0dXJuOworICAgIGNhc2Ug
U3BlY2lhbDoKKyAgICAgICAgb3V0LnByaW50KCImIiwgcG9pbnRlckR1bXAoc3BlY2lhbCgpKSk7
CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBSRUxFQVNFX0FTU0VSVF9OT1RfUkVBQ0hF
RCgpOworfQorCit9IH0gfSAvLyBuYW1lc3BhY2UgSlNDOjpCMzo6QWlyCisKSW5kZXg6IFNvdXJj
ZS9KYXZhU2NyaXB0Q29yZS9iMy9haXIvQWlyQXJnLmgKPT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL0ph
dmFTY3JpcHRDb3JlL2IzL2Fpci9BaXJBcmcuaAkocmV2aXNpb24gMCkKKysrIFNvdXJjZS9KYXZh
U2NyaXB0Q29yZS9iMy9haXIvQWlyQXJnLmgJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSw1MjAg
QEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTUgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2Vy
dmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkg
Zm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHBy
b3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4g
UmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5
cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xs
b3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBt
dXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlz
dCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAg
ICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUg
ZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUg
SU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMs
IElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElF
UyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVS
UE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IKKyAq
IENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVO
VEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElO
Q0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVU
RSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBP
UiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZ
CisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFks
IE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcg
SU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBB
RFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKworI2lmbmRl
ZiBBaXJBcmdfaAorI2RlZmluZSBBaXJBcmdfaAorCisjaW5jbHVkZSAiQWlyVG1wLmgiCisjaW5j
bHVkZSAiQjNUeXBlLmgiCisKK25hbWVzcGFjZSBKU0MgeyBuYW1lc3BhY2UgQjMgeyBuYW1lc3Bh
Y2UgQWlyIHsKKworY2xhc3MgU3BlY2lhbDsKK2NsYXNzIFN0YWNrU2xvdDsKKworLy8gVGhpcyBj
bGFzcyBuYW1lIGlzIGFsc28gaW50ZW50aW9uYWxseSB0ZXJzZSBiZWNhdXNlIHdlIHdpbGwgc2F5
IGl0IGEgbG90LiBZb3UnbGwgc2VlIGNvZGUgbGlrZQorLy8gSW5zdCguLi4sIEFyZzo6aW1tKDUp
LCBBcmc6OmFkZHIodGhpbmcsIGJsYWgpLCAuLi4pCitjbGFzcyBBcmcgeworcHVibGljOgorICAg
IC8vIFRoZXNlIGVudW0gbWVtYmVycyBhcmUgaW50ZW50aW9uYWxseSB0ZXJzZSBiZWNhdXNlIHdl
IGhhdmUgdG8gbWVudGlvbiB0aGVtIGEgbG90LgorICAgIGVudW0gS2luZCA6IGludDhfdCB7Cisg
ICAgICAgIFRtcCwKKyAgICAgICAgSW1tLAorICAgICAgICBJbW1QdHIsCisgICAgICAgIEFkZHIs
CisgICAgICAgIFN0YWNrLAorICAgICAgICBDYWxsQXJnLAorICAgICAgICBJbmRleCwKKyAgICAg
ICAgU3BlY2lhbAorICAgIH07CisKKyAgICBlbnVtIFJvbGUgOiBpbnQ4X3QgeworICAgICAgICBV
c2UsCisgICAgICAgIERlZiwKKyAgICAgICAgVXNlRGVmCisgICAgfTsKKworICAgIGVudW0gVHlw
ZSA6IGludDhfdCB7CisgICAgICAgIEdQLAorICAgICAgICBGUAorICAgIH07CisKKyAgICBzdGF0
aWMgYm9vbCBpc1VzZShSb2xlIHJvbGUpCisgICAgeworICAgICAgICBzd2l0Y2ggKHJvbGUpIHsK
KyAgICAgICAgY2FzZSBVc2U6CisgICAgICAgIGNhc2UgVXNlRGVmOgorICAgICAgICAgICAgcmV0
dXJuIHRydWU7CisgICAgICAgIGNhc2UgRGVmOgorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwor
ICAgICAgICB9CisgICAgfQorCisgICAgc3RhdGljIGJvb2wgaXNEZWYoUm9sZSByb2xlKQorICAg
IHsKKyAgICAgICAgc3dpdGNoIChyb2xlKSB7CisgICAgICAgIGNhc2UgVXNlOgorICAgICAgICAg
ICAgcmV0dXJuIGZhbHNlOworICAgICAgICBjYXNlIERlZjoKKyAgICAgICAgY2FzZSBVc2VEZWY6
CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHN0YXRp
YyBUeXBlIHR5cGVGb3JCM1R5cGUoQjM6OlR5cGUgdHlwZSkKKyAgICB7CisgICAgICAgIHN3aXRj
aCAodHlwZSkgeworICAgICAgICBjYXNlIFZvaWQ6CisgICAgICAgICAgICBBU1NFUlRfTk9UX1JF
QUNIRUQoKTsKKyAgICAgICAgICAgIHJldHVybiBHUDsKKyAgICAgICAgY2FzZSBJbnQzMjoKKyAg
ICAgICAgY2FzZSBJbnQ2NDoKKyAgICAgICAgICAgIHJldHVybiBHUDsKKyAgICAgICAgY2FzZSBE
b3VibGU6CisgICAgICAgICAgICByZXR1cm4gRlA7CisgICAgICAgIH0KKyAgICAgICAgQVNTRVJU
X05PVF9SRUFDSEVEKCk7CisgICAgICAgIHJldHVybiBHUDsKKyAgICB9CisKKyAgICBBcmcoKQor
ICAgIHsKKyAgICB9CisKKyAgICBBcmcoQWlyOjpUbXAgdG1wKQorICAgICAgICA6IG1fa2luZChU
bXApCisgICAgICAgICwgbV9iYXNlKHRtcCkKKyAgICB7CisgICAgfQorCisgICAgc3RhdGljIEFy
ZyBpbW0oaW50MzJfdCB2YWx1ZSkKKyAgICB7CisgICAgICAgIEFyZyByZXN1bHQ7CisgICAgICAg
IHJlc3VsdC5tX2tpbmQgPSBJbW07CisgICAgICAgIHJlc3VsdC5tX29mZnNldCA9IHZhbHVlOwor
ICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKworICAgIHN0YXRpYyBBcmcgaW1tUHRyKGlu
dHB0cl90IHZhbHVlKQorICAgIHsKKyAgICAgICAgQXJnIHJlc3VsdDsKKyAgICAgICAgcmVzdWx0
Lm1fa2luZCA9IEltbVB0cjsKKyAgICAgICAgcmVzdWx0Lm1fb2Zmc2V0ID0gdmFsdWU7CisgICAg
ICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorCisgICAgc3RhdGljIEFyZyBhZGRyZXNzKEFpcjo6
VG1wIGJhc2UsIGludDMyX3Qgb2Zmc2V0ID0gMCkKKyAgICB7CisgICAgICAgIEFTU0VSVChiYXNl
LmlzR1AoKSk7CisgICAgICAgIEFyZyByZXN1bHQ7CisgICAgICAgIHJlc3VsdC5tX2tpbmQgPSBB
ZGRyOworICAgICAgICByZXN1bHQubV9iYXNlID0gYmFzZTsKKyAgICAgICAgcmVzdWx0Lm1fb2Zm
c2V0ID0gb2Zmc2V0OworICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKworICAgIHN0YXRp
YyBBcmcgc3RhY2soU3RhY2tTbG90KiB2YWx1ZSwgaW50MzJfdCBvZmZzZXQgPSAwKQorICAgIHsK
KyAgICAgICAgQXJnIHJlc3VsdDsKKyAgICAgICAgcmVzdWx0Lm1fa2luZCA9IFN0YWNrOworICAg
ICAgICByZXN1bHQubV9vZmZzZXQgPSBiaXR3aXNlX2Nhc3Q8aW50cHRyX3Q+KHZhbHVlKTsKKyAg
ICAgICAgcmVzdWx0Lm1fc2NhbGUgPSBvZmZzZXQ7IC8vIEkga25vdywgeXVjay4KKyAgICAgICAg
cmV0dXJuIHJlc3VsdDsKKyAgICB9CisKKyAgICBzdGF0aWMgQXJnIGNhbGxBcmcoaW50MzJfdCBv
ZmZzZXQpCisgICAgeworICAgICAgICBBcmcgcmVzdWx0OworICAgICAgICByZXN1bHQubV9raW5k
ID0gQ2FsbEFyZzsKKyAgICAgICAgcmVzdWx0Lm1fb2Zmc2V0ID0gb2Zmc2V0OworICAgICAgICBy
ZXR1cm4gcmVzdWx0OworICAgIH0KKworICAgIHN0YXRpYyBib29sIGlzVmFsaWRTY2FsZSh1bnNp
Z25lZCBzY2FsZSkKKyAgICB7CisgICAgICAgIHN3aXRjaCAoc2NhbGUpIHsKKyAgICAgICAgY2Fz
ZSAxOgorICAgICAgICBjYXNlIDI6CisgICAgICAgIGNhc2UgNDoKKyAgICAgICAgY2FzZSA4Ogor
ICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBy
ZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBzdGF0aWMgdW5zaWduZWQgbG9n
U2NhbGUodW5zaWduZWQgc2NhbGUpCisgICAgeworICAgICAgICBzd2l0Y2ggKHNjYWxlKSB7Cisg
ICAgICAgIGNhc2UgMToKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICBjYXNlIDI6Cisg
ICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgY2FzZSA0OgorICAgICAgICAgICAgcmV0dXJu
IDI7CisgICAgICAgIGNhc2UgODoKKyAgICAgICAgICAgIHJldHVybiAzOworICAgICAgICBkZWZh
dWx0OgorICAgICAgICAgICAgQVNTRVJUX05PVF9SRUFDSEVEKCk7CisgICAgICAgICAgICByZXR1
cm4gMDsKKyAgICAgICAgfQorICAgIH0KKworICAgIHN0YXRpYyBBcmcgaW5kZXgoQWlyOjpUbXAg
YmFzZSwgQWlyOjpUbXAgaW5kZXgsIHVuc2lnbmVkIHNjYWxlID0gMSwgaW50MzJfdCBvZmZzZXQg
PSAwKQorICAgIHsKKyAgICAgICAgQVNTRVJUKGJhc2UuaXNHUCgpKTsKKyAgICAgICAgQVNTRVJU
KGluZGV4LmlzR1AoKSk7CisgICAgICAgIEFTU0VSVChpc1ZhbGlkU2NhbGUoc2NhbGUpKTsKKyAg
ICAgICAgQXJnIHJlc3VsdDsKKyAgICAgICAgcmVzdWx0Lm1fa2luZCA9IEluZGV4OworICAgICAg
ICByZXN1bHQubV9iYXNlID0gYmFzZTsKKyAgICAgICAgcmVzdWx0Lm1faW5kZXggPSBpbmRleDsK
KyAgICAgICAgcmVzdWx0Lm1fc2NhbGUgPSBzdGF0aWNfY2FzdDxpbnQzMl90PihzY2FsZSk7Cisg
ICAgICAgIHJlc3VsdC5tX29mZnNldCA9IG9mZnNldDsKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsK
KyAgICB9CisKKyAgICBzdGF0aWMgQXJnIHNwZWNpYWwoQWlyOjpTcGVjaWFsKiBzcGVjaWFsKQor
ICAgIHsKKyAgICAgICAgQXJnIHJlc3VsdDsKKyAgICAgICAgcmVzdWx0Lm1fa2luZCA9IFNwZWNp
YWw7CisgICAgICAgIHJlc3VsdC5tX29mZnNldCA9IGJpdHdpc2VfY2FzdDxpbnRwdHJfdD4oc3Bl
Y2lhbCk7CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorCisgICAgYm9vbCBvcGVyYXRv
cj09KGNvbnN0IEFyZyYgb3RoZXIpIGNvbnN0CisgICAgeworICAgICAgICByZXR1cm4gbV9vZmZz
ZXQgPT0gb3RoZXIubV9vZmZzZXQKKyAgICAgICAgICAgICYmIG1fa2luZCA9PSBvdGhlci5tX2tp
bmQKKyAgICAgICAgICAgICYmIG1fYmFzZSA9PSBvdGhlci5tX2Jhc2UKKyAgICAgICAgICAgICYm
IG1faW5kZXggPT0gb3RoZXIubV9pbmRleAorICAgICAgICAgICAgJiYgbV9zY2FsZSA9PSBvdGhl
ci5tX3NjYWxlOworICAgIH0KKworICAgIGJvb2wgb3BlcmF0b3IhPShjb25zdCBBcmcmIG90aGVy
KSBjb25zdAorICAgIHsKKyAgICAgICAgcmV0dXJuICEoKnRoaXMgPT0gb3RoZXIpOworICAgIH0K
KworICAgIGV4cGxpY2l0IG9wZXJhdG9yIGJvb2woKSBjb25zdCB7IHJldHVybiAqdGhpcyAhPSBB
cmcoKTsgfQorCisgICAgS2luZCBraW5kKCkgY29uc3QKKyAgICB7CisgICAgICAgIHJldHVybiBt
X2tpbmQ7CisgICAgfQorCisgICAgYm9vbCBpc1RtcCgpIGNvbnN0CisgICAgeworICAgICAgICBy
ZXR1cm4ga2luZCgpID09IFRtcDsKKyAgICB9CisKKyAgICBib29sIGlzSW1tKCkgY29uc3QKKyAg
ICB7CisgICAgICAgIHJldHVybiBraW5kKCkgPT0gSW1tOworICAgIH0KKworICAgIGJvb2wgaXNJ
bW1QdHIoKSBjb25zdAorICAgIHsKKyAgICAgICAgcmV0dXJuIGtpbmQoKSA9PSBJbW1QdHI7Cisg
ICAgfQorCisgICAgYm9vbCBpc0FkZHIoKSBjb25zdAorICAgIHsKKyAgICAgICAgcmV0dXJuIGtp
bmQoKSA9PSBBZGRyOworICAgIH0KKworICAgIGJvb2wgaXNJbmRleCgpIGNvbnN0CisgICAgewor
ICAgICAgICByZXR1cm4ga2luZCgpID09IEluZGV4OworICAgIH0KKworICAgIGJvb2wgaXNTcGVj
aWFsKCkgY29uc3QKKyAgICB7CisgICAgICAgIHJldHVybiBraW5kKCkgPT0gU3BlY2lhbDsKKyAg
ICB9CisKKyAgICBBaXI6OlRtcCB0bXAoKSBjb25zdAorICAgIHsKKyAgICAgICAgQVNTRVJUKGtp
bmQoKSA9PSBUbXApOworICAgICAgICByZXR1cm4gbV9iYXNlOworICAgIH0KKworICAgIGludHB0
cl90IHZhbHVlKCkgY29uc3QKKyAgICB7CisgICAgICAgIEFTU0VSVChraW5kKCkgPT0gSW1tIHx8
IGtpbmQoKSA9PSBJbW1QdHIpOworICAgICAgICByZXR1cm4gbV9vZmZzZXQ7CisgICAgfQorCisg
ICAgdm9pZCogcG9pbnRlclZhbHVlKCkgY29uc3QKKyAgICB7CisgICAgICAgIEFTU0VSVChraW5k
KCkgPT0gSW1tUHRyKTsKKyAgICAgICAgcmV0dXJuIGJpdHdpc2VfY2FzdDx2b2lkKj4obV9vZmZz
ZXQpOworICAgIH0KKworICAgIEFpcjo6VG1wIGJhc2UoKSBjb25zdAorICAgIHsKKyAgICAgICAg
QVNTRVJUKGtpbmQoKSA9PSBBZGRyIHx8IGtpbmQoKSA9PSBJbmRleCk7CisgICAgICAgIHJldHVy
biBtX2Jhc2U7CisgICAgfQorCisgICAgaW50MzJfdCBvZmZzZXQoKSBjb25zdAorICAgIHsKKyAg
ICAgICAgaWYgKGtpbmQoKSA9PSBTdGFjaykKKyAgICAgICAgICAgIHJldHVybiBzdGF0aWNfY2Fz
dDxpbnQzMl90PihtX3NjYWxlKTsKKyAgICAgICAgQVNTRVJUKGtpbmQoKSA9PSBBZGRyIHx8IGtp
bmQoKSA9PSBDYWxsQXJnIHx8IGtpbmQoKSA9PSBJbmRleCk7CisgICAgICAgIHJldHVybiBzdGF0
aWNfY2FzdDxpbnQzMl90PihtX29mZnNldCk7CisgICAgfQorCisgICAgU3RhY2tTbG90KiBzdGFj
a1Nsb3QoKSBjb25zdAorICAgIHsKKyAgICAgICAgQVNTRVJUKGtpbmQoKSA9PSBTdGFjayk7Cisg
ICAgICAgIHJldHVybiBiaXR3aXNlX2Nhc3Q8U3RhY2tTbG90Kj4obV9vZmZzZXQpOworICAgIH0K
KworICAgIEFpcjo6VG1wIGluZGV4KCkgY29uc3QKKyAgICB7CisgICAgICAgIEFTU0VSVChraW5k
KCkgPT0gSW5kZXgpOworICAgICAgICByZXR1cm4gbV9pbmRleDsKKyAgICB9CisKKyAgICB1bnNp
Z25lZCBzY2FsZSgpIGNvbnN0CisgICAgeworICAgICAgICBBU1NFUlQoa2luZCgpID09IEluZGV4
KTsKKyAgICAgICAgcmV0dXJuIG1fc2NhbGU7CisgICAgfQorCisgICAgdW5zaWduZWQgbG9nU2Nh
bGUoKSBjb25zdAorICAgIHsKKyAgICAgICAgcmV0dXJuIGxvZ1NjYWxlKHNjYWxlKCkpOworICAg
IH0KKworICAgIEFpcjo6U3BlY2lhbCogc3BlY2lhbCgpIGNvbnN0CisgICAgeworICAgICAgICBB
U1NFUlQoa2luZCgpID09IFNwZWNpYWwpOworICAgICAgICByZXR1cm4gYml0d2lzZV9jYXN0PEFp
cjo6U3BlY2lhbCo+KG1fb2Zmc2V0KTsKKyAgICB9CisKKyAgICBib29sIGlzR1BUbXAoKSBjb25z
dAorICAgIHsKKyAgICAgICAgcmV0dXJuIGlzVG1wKCkgJiYgdG1wKCkuaXNHUCgpOworICAgIH0K
KworICAgIGJvb2wgaXNGUFRtcCgpIGNvbnN0CisgICAgeworICAgICAgICByZXR1cm4gaXNUbXAo
KSAmJiB0bXAoKS5pc0ZQKCk7CisgICAgfQorICAgIAorICAgIC8vIFRlbGxzIHVzIGlmIHRoaXMg
QXJnIGNhbiBiZSB1c2VkIGluIGEgcG9zaXRpb24gdGhhdCByZXF1aXJlcyBhIEdQIHZhbHVlLgor
ICAgIGJvb2wgaXNHUCgpIGNvbnN0CisgICAgeworICAgICAgICBzd2l0Y2ggKGtpbmQoKSkgewor
ICAgICAgICBjYXNlIEltbToKKyAgICAgICAgY2FzZSBJbW1QdHI6CisgICAgICAgIGNhc2UgQWRk
cjoKKyAgICAgICAgY2FzZSBJbmRleDoKKyAgICAgICAgY2FzZSBTdGFja1Nsb3Q6CisgICAgICAg
IGNhc2UgQ2FsbEFyZzoKKyAgICAgICAgY2FzZSBTcGVjaWFsOgorICAgICAgICAgICAgcmV0dXJu
IHRydWU7CisgICAgICAgIGNhc2UgVG1wOgorICAgICAgICAgICAgcmV0dXJuIGlzR1BUbXAoKTsK
KyAgICAgICAgfQorICAgIH0KKworICAgIC8vIFRlbGxzIHVzIGlmIHRoaXMgQXJnIGNhbiBiZSB1
c2VkIGluIGEgcG9zaXRpb24gdGhhdCByZXF1aXJlcyBhIEZQIHZhbHVlLgorICAgIGJvb2wgaXNG
UCgpIGNvbnN0CisgICAgeworICAgICAgICBzd2l0Y2ggKGtpbmQoKSkgeworICAgICAgICBjYXNl
IEltbToKKyAgICAgICAgY2FzZSBJbW1QdHI6CisgICAgICAgIGNhc2UgU3BlY2lhbDoKKyAgICAg
ICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgY2FzZSBBZGRyOgorICAgICAgICBjYXNlIElu
ZGV4OgorICAgICAgICBjYXNlIEJhc2U6CisgICAgICAgIGNhc2UgU3RhY2tTbG90OgorICAgICAg
ICBjYXNlIENhbGxBcmc6CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgY2FzZSBU
bXA6CisgICAgICAgICAgICByZXR1cm4gaXNGUFRtcCgpOworICAgICAgICB9CisgICAgfQorCisg
ICAgYm9vbCBoYXNUeXBlKCkgY29uc3QKKyAgICB7CisgICAgICAgIHN3aXRjaCAoa2luZCgpKSB7
CisgICAgICAgIGNhc2UgSW1tOgorICAgICAgICBjYXNlIEltbVB0cjoKKyAgICAgICAgY2FzZSBT
cGVjaWFsOgorICAgICAgICBjYXNlIFRtcDoKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAg
ICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAg
fQorICAgIAorICAgIC8vIFRoZSB0eXBlIGlzIGFtYmlndW91cyBmb3Igc29tZSBhcmcga2luZHMu
IENhbGwgd2l0aCBjYXJlLgorICAgIFR5cGUgdHlwZSgpIGNvbnN0CisgICAgeworICAgICAgICBy
ZXR1cm4gaXNHUCgpID8gR1AgOiBGUDsKKyAgICB9CisKKyAgICBib29sIGlzVHlwZShUeXBlIHR5
cGUpIGNvbnN0CisgICAgeworICAgICAgICBzd2l0Y2ggKHR5cGUpIHsKKyAgICAgICAgY2FzZSBH
UDoKKyAgICAgICAgICAgIHJldHVybiBpc0dQKCk7CisgICAgICAgIGNhc2UgRlA6CisgICAgICAg
ICAgICByZXR1cm4gaXNGUCgpOworICAgICAgICB9CisgICAgfQorCisgICAgYm9vbCBpc0dQUigp
IGNvbnN0CisgICAgeworICAgICAgICByZXR1cm4gaXNUbXAoKSAmJiB0bXAoKS5pc0dQUigpOwor
ICAgIH0KKworICAgIEdQUlJlZyBncHIoKSBjb25zdAorICAgIHsKKyAgICAgICAgcmV0dXJuIHRt
cCgpLmdwcigpOworICAgIH0KKworICAgIGJvb2wgaXNGUFIoKSBjb25zdAorICAgIHsKKyAgICAg
ICAgcmV0dXJuIGlzVG1wKCkgJiYgdG1wKCkuaXNGUFIoKTsKKyAgICB9CisKKyAgICBGUFJSZWcg
ZnByKCkgY29uc3QKKyAgICB7CisgICAgICAgIHJldHVybiB0bXAoKS5mcHIoKTsKKyAgICB9Cisg
ICAgCisgICAgYm9vbCBpc1JlZygpIGNvbnN0CisgICAgeworICAgICAgICByZXR1cm4gaXNUbXAo
KSAmJiB0bXAoKS5pc1JlZygpOworICAgIH0KKworICAgIFJlZyByZWcoKSBjb25zdAorICAgIHsK
KyAgICAgICAgcmV0dXJuIHRtcCgpLnJlZygpOworICAgIH0KKworICAgIHVuc2lnbmVkIGdwVG1w
SW5kZXgoKSBjb25zdAorICAgIHsKKyAgICAgICAgcmV0dXJuIHRtcCgpLmdwVG1wSW5kZXgoKTsK
KyAgICB9CisKKyAgICB1bnNpZ25lZCBmcFRtcEluZGV4KCkgY29uc3QKKyAgICB7CisgICAgICAg
IHJldHVybiB0bXAoKS5mcFRtcEluZGV4KCk7CisgICAgfQorCisgICAgdW5zaWduZWQgdG1wSW5k
ZXgoKSBjb25zdAorICAgIHsKKyAgICAgICAgcmV0dXJuIHRtcCgpLnRtcEluZGV4KCk7CisgICAg
fQorCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgRnVuY3Rvcj4KKyAgICB2b2lkIGZvckVhY2hUbXBG
YXN0KGNvbnN0IEZ1bmN0b3ImIGZ1bmN0b3IpCisgICAgeworICAgICAgICBzd2l0Y2ggKG1fa2lu
ZCkgeworICAgICAgICBjYXNlIFRtcDoKKyAgICAgICAgY2FzZSBBZGRyOgorICAgICAgICAgICAg
ZnVuY3RvcihtX2Jhc2UpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgSW5kZXg6
CisgICAgICAgICAgICBmdW5jdG9yKG1fYmFzZSk7CisgICAgICAgICAgICBmdW5jdG9yKG1faW5k
ZXgpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBi
cmVhazsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIFRoaXMgaXMgc21hcnQgZW5vdWdoIHRv
IGtub3cgdGhhdCBhbiBhZGRyZXNzIGFyZyBpbiBhIERlZiBvciBVc2VEZWYgcnVsZSB3aWxsIHVz
ZSBpdHMKKyAgICAvLyB0bXBzIGFuZCBuZXZlciBkZWYgdGhlbS4gRm9yIGV4YW1wbGUsIHRoaXM6
CisgICAgLy8KKyAgICAvLyBtb3YgJXJheCwgKCVyY3gpCisgICAgLy8KKyAgICAvLyBUaGlzIGRl
ZnMgKCVyY3gpIGJ1dCB1c2VzICVyY3guCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgRnVuY3Rvcj4K
KyAgICB2b2lkIGZvckVhY2hUbXAoUm9sZSBhcmdSb2xlLCBUeXBlIGFyZ1R5cGUsIGNvbnN0IEZ1
bmN0b3ImIGZ1bmN0b3IpCisgICAgeworICAgICAgICBzd2l0Y2ggKG1fa2luZCkgeworICAgICAg
ICBjYXNlIFRtcDoKKyAgICAgICAgICAgIGZ1bmN0b3IobV9iYXNlLCBhcmdSb2xlLCBhcmdUeXBl
KTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEFkZHI6CisgICAgICAgICAgICBm
dW5jdG9yKG1fYmFzZSwgVXNlLCBHUCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2Fz
ZSBJbmRleDoKKyAgICAgICAgICAgIGZ1bmN0b3IobV9iYXNlLCBVc2UsIEdQKTsKKyAgICAgICAg
ICAgIGZ1bmN0b3IobV9pbmRleCwgVXNlLCBHUCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAg
ICAgZGVmYXV0OgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBN
YWNyb0Fzc2VtYmxlcjo6VHJ1c3RlZEltbTMyIGFzVHJ1c3RlZEltbTMyKCkgY29uc3QKKyAgICB7
CisgICAgICAgIEFTU0VSVChpc0ltbSgpKTsKKyAgICAgICAgcmV0dXJuIE1hY3JvQXNzZW1ibGVy
OjpUcnVzdGVkSW1tMzIoc3RhdGljX2Nhc3Q8aW50MzJfdD4obV9vZmZzZXQpKTsKKyAgICB9CisK
KyAgICBNYWNyb0Fzc2VtYmxlcjo6VHJ1c3RlZEltbTMyIGFzVHJ1c3RlZEltbVB0cigpIGNvbnN0
CisgICAgeworICAgICAgICBBU1NFUlQoaXNJbW1QdHIoKSk7CisgICAgICAgIHJldHVybiBNYWNy
b0Fzc2VtYmxlcjo6VHJ1c3RlZEltbVB0cihwb2ludGVyVmFsdWUoKSk7CisgICAgfQorCisgICAg
TWFjcm9Bc3NlbWJsZXI6OkFkZHJlc3MgYXNBZGRyZXNzKCkgY29uc3QKKyAgICB7CisgICAgICAg
IEFTU0VSVChpc0FkZHIoKSk7CisgICAgICAgIHJldHVybiBNYWNyb0Fzc2VtYmxlcjo6QWRkcmVz
cyhtX2Jhc2UuZ3ByKCksIHN0YXRpY19jYXN0PGludDMyX3Q+KG1fb2Zmc2V0KSk7CisgICAgfQor
CisgICAgTWFjcm9Bc3NlbWJsZXI6OkJhc2VJbmRleCBhc0Jhc2VJbmRleCgpIGNvbnN0CisgICAg
eworICAgICAgICBBU1NFUlQoaXNJbmRleCgpKTsKKyAgICAgICAgcmV0dXJuIE1hY3JvQXNzZW1i
bGVyOjpCYXNlSW5kZXgoCisgICAgICAgICAgICBtX2Jhc2UuZ3ByKCksIG1faW5kZXguZ3ByKCks
IHN0YXRpY19jYXN0PE1hY3JvQXNzZW1ibGVyOjpTY2FsZT4obG9nU2NhbGUoKSksCisgICAgICAg
ICAgICBzdGF0aWNfY2FzdDxpbnQzMl90PihtX29mZnNldCkpOworICAgIH0KKworICAgIHZvaWQg
ZHVtcChQcmludFN0cmVhbSYpIGNvbnN0OworCitwcml2YXRlOgorICAgIGludHB0cl90IG1fb2Zm
c2V0IHsgMCB9OworICAgIEtpbmQgbV9raW5kIHsgSW1tIH07CisgICAgaW50MzJfdCBtX3NjYWxl
IHsgMSB9OworICAgIEFpcjo6VG1wIG1fYmFzZTsKKyAgICBBaXI6OlRtcCBtX2luZGV4OworfTsK
KworfSB9IH0gLy8gbmFtZXNwYWNlIEpTQzo6QjM6OkFpcgorCisjZW5kaWYgLy8gQWlyQXJnX2gK
KwpJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL2Fpci9BaXJCYXNpY0Jsb2NrLmNwcAo9
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvYWlyL0FpckJhc2ljQmxvY2su
Y3BwCShyZXZpc2lvbiAwKQorKysgU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL2Fpci9BaXJCYXNp
Y0Jsb2NrLmNwcAkod29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDQ0IEBACisvKgorICogQ29weXJp
Z2h0IChDKSAyMDE1IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRp
c3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdp
dGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBm
b2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBv
ZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3Rp
Y2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIu
CisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhl
IGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBh
bmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBh
bmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAq
CisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFO
RCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBO
T1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklM
SVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlN
RUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUg
TElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAq
IEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1Qg
TElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklD
RVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJS
VVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZ
LCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5D
TFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9G
IFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9T
U0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisKKyNpbmNsdWRlICJjb25maWcuaCIKKyNp
bmNsdWRlICJBaXJCYXNpY0Jsb2NrLmgiCisKK25hbWVzcGFjZSBKU0MgeyBuYW1lc3BhY2UgQjMg
eyBuYW1lc3BhY2UgQWlyIHsKKwordm9pZCBCYXNpY0Jsb2NrOjpkdW1wKFByaW50U3RyZWFtJiBv
dXQpIGNvbnN0Cit7CisgICAgb3V0LnByaW50KGR1bXBQcmVmaXgsIG1faW5kZXgpOworfQorCit2
b2lkIEJhc2ljQmxvY2s6OmRlZXBEdW1wKFByaW50U3RyZWFtJiBvdXQpIGNvbnN0Cit7CisgICAg
b3V0LnByaW50KCJCQiIsICp0aGlzLCAiOlxuIik7CisgICAgZm9yIChjb25zdCBJbnN0JiBpbnN0
IDogKnRoaXMpCisgICAgICAgIG91dC5wcmludCgiICAgICIsIGluc3QsICJcbiIpOworfQorCit9
IH0gfSAvLyBuYW1lc3BhY2UgSlNDOjpCMzo6QWlyCisKSW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0
Q29yZS9iMy9haXIvQWlyQmFzaWNCbG9jay5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2Ny
aXB0Q29yZS9iMy9haXIvQWlyQmFzaWNCbG9jay5oCShyZXZpc2lvbiAwKQorKysgU291cmNlL0ph
dmFTY3JpcHRDb3JlL2IzL2Fpci9BaXJCYXNpY0Jsb2NrLmgJKHdvcmtpbmcgY29weSkKQEAgLTAs
MCArMSwxMjEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTUgQXBwbGUgSW5jLiBBbGwgcmln
aHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFu
ZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVy
bWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0
OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBh
Ym92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5k
IHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5h
cnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2Us
IHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4g
dGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQg
d2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQg
QlkgQVBQTEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdB
UlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQg
V0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxB
UgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElO
Qy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNU
LCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERB
TUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0Yg
U1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQ
Uk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBB
TlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBM
SUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0Up
IEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwg
RVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8K
KworI2lmbmRlZiBBaXJCYXNpY0Jsb2NrX2gKKyNkZWZpbmUgQWlyQmFzaWNCbG9ja19oCisKKyNp
bmNsdWRlICJBaXJJbnN0LmgiCisjaW5jbHVkZSA8d3RmL05vbkNvcHlhYmxlLmg+CisjaW5jbHVk
ZSA8d3RmL0Zhc3RNYWxsb2MuaD4KKworbmFtZXNwYWNlIEpTQyB7IG5hbWVzcGFjZSBCMyB7IG5h
bWVzcGFjZSBBaXIgeworCitjbGFzcyBDb2RlOworCitjbGFzcyBCYXNpY0Jsb2NrIHsKKyAgICBX
VEZfTUFLRV9OT05DT1BZQUJMRShCYXNpY0Jsb2NrKTsKKyAgICBXVEZfTUFLRV9GQVNUX0FMTE9D
QVRFRDsKK3B1YmxpYzoKKyAgICBzdGF0aWMgY29uc3QgY2hhciogZHVtcFByZWZpeCA9ICIjIjsK
KworICAgIHR5cGVkZWYgVmVjdG9yPEluc3Q+IEluc3RMaXN0OworICAgIHR5cGVkZWYgVmVjdG9y
PEJhc2ljQmxvY2sqLCAyPiBTdWNjZXNzb3JMaXN0OworICAgIAorICAgIHVuc2lnbmVkIHNpemUo
KSBjb25zdCB7IHJldHVybiBtX2luc3RzLnNpemUoKTsgfQorICAgIEluc3RMaXN0OjppdGVyYXRv
ciBiZWdpbigpIHsgcmV0dXJuIG1faW5zdHMuYmVnaW4oKTsgfQorICAgIEluc3RMaXN0OjppdGVy
YXRvciBlbmQoKSB7IHJldHVybiBtX2luc3RzLmVuZCgpOyB9CisgICAgSW5zdExpc3Q6OmNvbnN0
X2l0ZXJhdG9yIGJlZ2luKCkgY29uc3QgeyByZXR1cm4gbV9pbnN0cy5iZWdpbigpOyB9CisgICAg
SW5zdExpc3Q6OmNvbnN0X2l0ZXJhdG9yIGVuZCgpIGNvbnN0IHsgcmV0dXJuIG1faW5zdHMuZW5k
KCk7IH0KKworICAgIHNpemVfdCBzaXplKCkgY29uc3QgeyByZXR1cm4gbV9pbnN0cy5zaXplKCk7
IH0KKyAgICBjb25zdCBJbnN0JiBhdChzaXplX3QgaW5kZXgpIGNvbnN0IHsgcmV0dXJuIG1faW5z
dHNbaW5kZXhdOyB9CisgICAgSW5zdCYgYXQoc2l6ZV90IGluZGV4KSB7IHJldHVybiBtX2luc3Rz
W2luZGV4XTsgfQorCisgICAgY29uc3QgSW5zdCYgbGFzdCgpIGNvbnN0IHsgcmV0dXJuIG1faW5z
dHMubGFzdCgpOyB9CisgICAgSW5zdCYgbGFzdCgpIHsgcmV0dXJuIG1faW5zdHMubGFzdCgpOyB9
CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBJbnN0PgorICAgIHZvaWQgYXBwZW5kSW5zdChJbnN0
JiYgaW5zdCkKKyAgICB7CisgICAgICAgIG1faW5zdHMuYXBwZW5kKHN0ZDo6Zm9yd2FyZDxJbnN0
PihpbnN0KSk7CisgICAgfQorCisgICAgdGVtcGxhdGU8dHlwZW5hbWUuLi4gQXJndW1lbnRzPgor
ICAgIHZvaWQgYXBwZW5kKEFyZ3VtZW50cyYmLi4uIGFyZ3VtZW50cykKKyAgICB7CisgICAgICAg
IG1faW5zdHMuYXBwZW5kKEluc3Qoc3RkOjpmb3J3YXJkPEFyZ3VtZW50cz4oYXJndW1lbnRzKS4u
LikpOworICAgIH0KKworICAgIC8vIFRoZSAiMCIgY2FzZSBpcyB0aGUgY2FzZSB0byB3aGljaCB0
aGUgYnJhbmNoIGp1bXBzLCBzbyB0aGUgInRoZW4iIGNhc2UuIFRoZSAiMSIgY2FzZSBpcyB0aGUK
KyAgICAvLyAiZWxzZSIgY2FzZSwgYW5kIGlzIHVzZWQgdG8gcmVwcmVzZW50IHRoZSBmYWxsLXRo
cm91Z2ggb2YgYSBjb25kaXRpb25hbCBicmFuY2guCisgICAgdW5zaWduZWQgbnVtU3VjY2Vzc29y
cygpIGNvbnN0IHsgcmV0dXJuIG1fc3VjY2Vzc29ycy5zaXplKCk7IH0KKyAgICBCYXNpY0Jsb2Nr
KiBzdWNjZXNzb3IodW5zaWduZWQgaW5kZXgpIGNvbnN0IHsgcmV0dXJuIG1fc3VjY2Vzc29yc1tp
bmRleF07IH0KKyAgICBCYXNpY0Jsb2NrKiYgc3VjY2Vzc29yKHVuc2lnbmVkIGluZGV4KSB7IHJl
dHVybiBtX3N1Y2Nlc3NvcnNbaW5kZXhdOyB9CisgICAgY29uc3QgU3VjY2Vzc29yTGlzdCYgc3Vj
Y2Vzc29ycygpIGNvbnN0IHsgcmV0dXJuIG1fc3VjY2Vzc29yc1tpbmRleF07IH0KKyAgICBTdWNj
ZXNzb3JMaXN0JiBzdWNjZXNzb3JzKCkgeyByZXR1cm4gbV9zdWNjZXNzb3JzW2luZGV4XTsgfQor
CisgICAgdm9pZCBkdW1wKFByaW50U3RyZWFtJikgY29uc3Q7CisgICAgdm9pZCBkZWVwRHVtcChQ
cmludFN0cmVhbSYpIGNvbnN0OworCitwcml2YXRlOgorICAgIGZyaWVuZCBjbGFzcyBDb2RlOwor
ICAgIAorICAgIEJhc2ljQmxvY2sodW5zaWduZWQgaW5kZXgpCisgICAgeworICAgIH0KKworICAg
IHVuc2lnbmVkIG1faW5kZXg7CisgICAgSW5zdExpc3QgbV9pbnN0czsKKyAgICBTdWNjZXNzb3JM
aXN0IG1fc3VjY2Vzc29yczsKK307CisKK2NsYXNzIERlZXBCYXNpY0Jsb2NrRHVtcCB7CitwdWJs
aWM6CisgICAgRGVlcEJhc2ljQmxvY2tEdW1wKEJhc2ljQmxvY2sqIGJsb2NrKQorICAgICAgICA6
IG1fYmxvY2soYmxvY2spCisgICAgeworICAgIH0KKworICAgIHZvaWQgZHVtcChQcmludFN0cmVh
bSYgb3V0KSBjb25zdAorICAgIHsKKyAgICAgICAgaWYgKG1fYmxvY2spCisgICAgICAgICAgICBt
X2Jsb2NrLT5kZWVwRHVtcChvdXQpOworICAgICAgICBlbHNlCisgICAgICAgICAgICBvdXQucHJp
bnQoIjxudWxsPiIpOworICAgIH0KKworcHJpdmF0ZToKKyAgICBCYXNpY0Jsb2NrKiBtX2Jsb2Nr
OworfTsKKworRGVlcEJhc2ljQmxvY2tEdW1wIGRlZXBEdW1wKEJhc2ljQmxvY2sqIGJsb2NrKQor
eworICAgIHJldHVybiBEZWVwQmFzaWNCbG9ja0R1bXAoYmxvY2spOworfQorCit9IH0gfSAvLyBu
YW1lc3BhY2UgSlNDOjpCMzo6QWlyCisKKyNlbmRpZiAvLyBBaXJCYXNpY0Jsb2NrX2gKKwpJbmRl
eDogU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL2Fpci9BaXJDQ2FsbFNwZWNpYWwuY3BwCj09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9haXIvQWlyQ0NhbGxTcGVjaWFsLmNw
cAkocmV2aXNpb24gMCkKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9haXIvQWlyQ0NhbGxT
cGVjaWFsLmNwcAkod29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDEyOCBAQAorLyoKKyAqIENvcHly
aWdodCAoQykgMjAxNSBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVk
aXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3
aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUg
Zm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMg
b2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90
aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVy
LgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRo
ZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMg
YW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24g
YW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisg
KgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIGBgQVMgSVMnJyBB
TkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQg
Tk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJ
TElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJ
TUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJF
IExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisg
KiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9U
IExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJ
Q0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVS
UlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElU
WSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElO
Q0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBP
RiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBP
U1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLiAKKyAqLworCisjaW5jbHVkZSAiY29uZmlnLmgiCisj
aW5jbHVkZSAiQWlyQ0NhbGxTcGVjaWFsLmgiCisKK25hbWVzcGFjZSBKU0MgeyBuYW1lc3BhY2Ug
QjMgeyBuYW1lc3BhY2UgQWlyIHsKKworQ0NhbGxTcGVjaWFsOjpDQ2FsbFNwZWNpYWwoKQorICAg
IDogU3BlY2lhbCgiQ0NhbGwiKTsKK3sKKyAgICBtX2Nsb2JiZXJlZFJlZ3MgPSBSZWdpc3RlclNl
dDo6YWxsUmVnaXN0ZXJzKCk7CisgICAgbV9jbG9iYmVyZWRSZWdzLmV4Y2x1ZGUoUmVnaXN0ZXJT
ZXQ6OnN0YWNrUmVnaXN0ZXJzKCkpOworICAgIG1fY2xvYmJlcmVkUmVncy5leGNsdWRlKFJlZ2lz
dGVyU2V0OjpyZXNlcnZlZEhhcmR3YXJlUmVnaXN0ZXJzKCkpOworICAgIG1fY2xvYmJlcmVkUmVn
cy5leGNsdWRlKFJlZ2lzdGVyU2V0OjpjYWxsZWVTYXZlUmVnaXN0ZXJzKCkpOworfQorCitDQ2Fs
bFNwZWNpYWw6On5DQ2FsbFNwZWNpYWwoKQoreworfQorCit2b2lkIENDYWxsU3BlY2lhbDo6Zm9y
RWFjaEFyZyhJbnN0JiBpbnN0LCBjb25zdCBTY29wZWRMYW1iZGE8SW5zdDo6RWFjaEFyZ0NhbGxi
YWNrPiYgY2FsbGJhY2spCit7CisgICAgY2FsbGJhY2soaW5zdC5hcmdzWzFdLCBBcmc6OlVzZSwg
QXJnOjpHUCk7CisgICAgCisgICAgZm9yICh1bnNpZ25lZCBpID0gMjsgaSA8IGluc3QuYXJncy5z
aXplKCk7ICsraSkgeworICAgICAgICAvLyBGb3IgdGhlIHR5cGUsIHdlIGNhbiBqdXN0IHF1ZXJ5
IHRoZSBhcmcncyB0eXBlLiBUaGUgYXJnIHdpbGwgaGF2ZSBhIHR5cGUsIGJlY2F1c2Ugd2UKKyAg
ICAgICAgLy8gcmVxdWlyZSB0aGVzZSBhcmdzIHRvIGJlIGFyZ3VtZW50IHJlZ2lzdGVycy4KKyAg
ICAgICAgY2FsbGJhY2soaW5zdC5hcmdzW2ldLCBBcmc6OlVzZSwgaW5zdC5hcmdzW2ldLnR5cGUo
KSk7CisgICAgfQorfQorCitib29sIENDYWxsU3BlY2lhbDo6aXNWYWxpZChJbnN0JiBpbnN0KQor
eworICAgIGlmIChpbnN0LmFyZ3Muc2l6ZSgpIDwgMikKKyAgICAgICAgcmV0dXJuIGZhbHNlOwor
CisgICAgc3dpdGNoIChpbnN0LmFyZ3NbMV0ua2luZCgpKSB7CisgICAgY2FzZSBBcmc6OkltbVB0
cjoKKyAgICBjYXNlIEFyZzo6VG1wOgorICAgIGNhc2UgQXJnOjpBZGRyOgorICAgIGNhc2UgQXJn
OjpTdGFjazoKKyAgICBjYXNlIEFyZzo6Q2FsbEFyZzoKKyAgICAgICAgYnJlYWs7CisgICAgZGVm
YXVsdDoKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGlmICghaW5zdC5hcmdz
WzFdLmlzR1AoKSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgZm9yICh1bnNpZ25lZCBp
ID0gMjsgaSA8IGluc3QuYXJncy5zaXplKCk7ICsraSkgeworICAgICAgICBpZiAoIWluc3QuYXJn
c1tpXS5pc1JlZygpKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgICAgIGlmIChp
bnN0LmFyZ3NbaV0gPT0gVG1wKHNjcmF0Y2hSZWdpc3RlcikpCisgICAgICAgICAgICByZXR1cm4g
IGZhbHNlOworICAgIH0KKyAgICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBDQ2FsbFNwZWNpYWw6
OmFkbWl0c1N0YWNrKEluc3QmLCB1bnNpZ25lZCBhcmdJbmRleCkKK3sKKyAgICAvLyBBcmcgMSBj
YW4gYmUgYSBzdGFjayBhZGRyZXNzIGZvciBzdXJlLgorICAgIGlmIChhcmdJbmRleCA9PSAxKQor
ICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAKKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK3ZvaWQg
Q0NhbGxTcGVjaWFsOjpyZXBvcnRVc2VkUmVnaXN0ZXJzKEluc3QmLCBjb25zdCBSZWdpc3RlclNl
dCYpCit7Cit9CisKK0NDYWxsSGVscGVyczo6SnVtcCBDQ2FsbFNwZWNpYWw6OmdlbmVyYXRlKElu
c3QmIGluc3QsIENDYWxsSGVscGVycyYgaml0LCBHZW5lcmF0aW9uQ29udGV4dCYpCit7CisgICAg
c3dpdGNoIChpbnN0LmFyZ3NbMV0ua2luZCgpKSB7CisgICAgY2FzZSBBcmc6OkltbVB0cjoKKyAg
ICAgICAgaml0Lm1vdmUoQ0NhbGxIZWxwZXJzOjpUcnVzdGVkSW1tUHRyKGluc3QuYXJnc1sxXS5w
b2ludGVyVmFsdWUoKSksIHNjcmF0Y2hSZWdpc3Rlcik7CisgICAgICAgIGppdC5jYWxsKHNjcmF0
Y2hSZWdpc3Rlcik7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQXJnOjpUbXA6CisgICAgICAg
IGppdC5jYWxsKGluc3QuYXJnc1sxXS5ncHIoKSk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2Ug
QXJnOjpBZGRyOgorICAgICAgICBqaXQuY2FsbChpbnN0LmFyZ3NbMV0uYXNBZGRyZXNzKCkpOwor
ICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICBSRUxFQVNFX0FTU0VSVF9OT1Rf
UkVBQ0hFRCgpOworICAgICAgICBicmVhazsKKyAgICB9CisgICAgcmV0dXJuIENDYWxsSGVscGVy
czo6SnVtcCgpOworfQorCitjb25zdCBSZWdpc3RlclNldCYgQ0NhbGxTcGVjaWFsOjpleHRyYUNs
b2JiZXJlZFJlZ3MoKQoreworICAgIHJldHVybiBtX2Nsb2JiZXJlZFJlZ3M7Cit9CisKK3ZvaWQg
Q0NhbGxTcGVjaWFsOjpkZWVwRHVtcEltcGwoUHJpbnRTdHJlYW0mIG91dCkgY29uc3QKK3sKKyAg
ICBvdXQucHJpbnQoImZ1bmN0aW9uIGNhbGwgdGhhdCB1c2VzIHRoZSBDIGNhbGxpbmcgY29udmVu
dGlvbi4iKTsKK30KKworfSB9IH0gLy8gbmFtZXNwYWNlIEpTQzo6QjM6OkFpcgorCkluZGV4OiBT
b3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvYWlyL0FpckNDYWxsU3BlY2lhbC5oCj09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0K
LS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9haXIvQWlyQ0NhbGxTcGVjaWFsLmgJKHJldmlz
aW9uIDApCisrKyBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvYWlyL0FpckNDYWxsU3BlY2lhbC5o
CSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsNjcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIw
MTUgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9u
IGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICog
bW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBj
b25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBj
b2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBs
aXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJl
ZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29w
eXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9s
bG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhl
ciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMg
U09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICog
RVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVE
IFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJ
VE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5P
IEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9S
IEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZ
LCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRP
LAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBP
RiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhP
V0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIg
SU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVH
TElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQor
ICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBP
RiBTVUNIIERBTUFHRS4gCisgKi8KKworI2lmbmRlZiBBaXJDQ2FsbFNwZWNpYWxfaAorI2RlZmlu
ZSBBaXJDQ2FsbFNwZWNpYWxfaAorCituYW1lc3BhY2UgSlNDIHsgbmFtZXNwYWNlIEIzIHsgbmFt
ZXNwYWNlIEFpciB7CisKKy8vIFVzZSB0aGlzIHNwZWNpYWwgZm9yIGNvbnN0cnVjdGluZyBhIEMg
Y2FsbC4gQXJnIDAgaXMgb2YgY291cnNlIGEgU3BlY2lhbCBhcmcgdGhhdCByZWZlcnMgdG8gdGhl
CisvLyBDQ2FsbFNwZWNpYWwgb2JqZWN0LiBBcmcgMSBpcyB0aGUgY2FsbGVlLCBhbmQgaXQgY2Fu
IGJlIGFuIEltbVB0ciwgYSByZWdpc3Rlciwgb3IgYW4gYWRkcmVzcy4gVGhlCisvLyByZW1haW5p
bmcgYXJncyBhcmUganVzdCB0aGUgc2V0IG9mIGFyZ3VtZW50IHJlZ2lzdGVycyB1c2VkIGJ5IHRo
aXMgY2FsbC4gRm9yIGFyZ3VtZW50cyB0aGF0IGdvIHRvCisvLyB0aGUgc3RhY2ssIHlvdSBoYXZl
IHRvIGRvIHRoZSBncnVudCB3b3JrIG9mIGRvaW5nIHRob3NlIHN0YWNrIHN0b3Jlcy4gSW4gZmFj
dCwgdGhlIG9ubHkgcmVhc29uIHdoeQorLy8gd2Ugc3BlY2lmeSB0aGUgYXJndW1lbnQgcmVnaXN0
ZXJzIGFzIGFyZ3VtZW50cyB0byBhIGNhbGwgaXMgc28gdGhhdCB0aGUgbGl2ZW5lc3MgYW5hbHlz
aXMgY2FuIHNlZQorLy8gdGhhdCB0aGV5IGdldCB1c2VkIGhlcmUuIEl0IHdvdWxkIGJlIHdyb25n
IHRvIGF1dG9tYWdpY2FsbHkgcmVwb3J0IGFsbCBhcmd1bWVudCByZWdpc3RlcnMgYXMgYmVpbmcK
Ky8vIHVzZWQgYmVjYXVzZSBpZiB3ZSBoYWQgYSBjYWxsIHRoYXQgZGlkbid0IHBhc3MgdGhlbSwg
dGhlbiB0aGV5J2QgYXBwZWFyIHRvIGJlIGxpdmUgdW50aWwgc29tZQorLy8gY2xvYmJlciBwb2lu
dCBvciB0aGUgcHJvbG9ndWUsIHdoaWNoZXZlciBoYXBwZW5lZCBzb29uZXIuCisKK2NsYXNzIEND
YWxsU3BlY2lhbCA6IHB1YmxpYyBTcGVjaWFsIHsKK3B1YmxpYzoKKyAgICBDQ2FsbFNwZWNpYWwo
KTsKKyAgICB+Q0NhbGxTcGVjaWFsKCk7CisKKyAgICAvLyBZb3UgY2Fubm90IHVzZSB0aGlzIHJl
Z2lzdGVyIHRvIHBhc3MgYXJndW1lbnRzLiBJdCBqdXN0IHNvIGhhcHBlbnMgdGhhdCB0aGlzIHJl
Z2lzdGVyIGlzIG5vdAorICAgIC8vIHVzZWQgZm9yIGFyZ3VtZW50cyBpbiB0aGUgQyBjYWxsaW5n
IGNvbnZlbnRpb24uIEJ5IHRoZSB3YXksIHRoaXMgaXMgdGhlIG9ubHkgdGhpbmcgdGhhdCBjYXVz
ZXMKKyAgICAvLyB0aGlzIHNwZWNpYWwgdG8gYmUgc3BlY2lmaWMgdG8gQyBjYWxscy4KKyAgICBz
dGF0aWMgY29uc3QgR1BSUmVnIHNjcmF0Y2hSZWdpc3RlciA9IEdQUkluZm86Om5vbkFyZ0dQUjAu
CisKK3Byb3RlY3RlZDoKKyAgICB2b2lkIGZvckVhY2hBcmcoSW5zdCYsIGNvbnN0IFNjb3BlZExh
bWJkYTxJbnN0OjpFYWNoQXJnQ2FsbGJhY2s+Jikgb3ZlcnJpZGU7CisgICAgYm9vbCBpc1ZhbGlk
KEluc3QmKSBvdmVycmlkZTsKKyAgICBib29sIGFkbWl0c1N0YWNrKEluc3QmLCB1bnNpZ25lZCBh
cmdJbmRleCkgb3ZlcnJpZGU7CisgICAgdm9pZCByZXBvcnRVc2VkUmVnaXN0ZXJzKEluc3QmLCBj
b25zdCBSZWdpc3RlclNldCYpIG92ZXJyaWRlOworICAgIENDYWxsSGVscGVyczo6SnVtcCBnZW5l
cmF0ZShJbnN0JiwgQ0NhbGxIZWxwZXJzJiwgR2VuZXJhdGlvbkNvbnRleHQmKSBvdmVycmlkZTsK
KyAgICBjb25zdCBSZWdpc3RlclNldCYgZXh0cmFDbG9iYmVyZWRSZWdzKEluc3QmKSBvdmVycmlk
ZTsKKyAgICAKKyAgICB2b2lkIGRlZXBEdW1wSW1wbChQcmludFN0cmVhbSYpIGNvbnN0IG92ZXJy
aWRlOworCitwcml2YXRlOgorICAgIFJlZ2lzdGVyU2V0IG1fY2xvYmJlcmVkUmVnczsKK307CisK
K30gfSB9IC8vIG5hbWVzcGFjZSBKU0M6OkIzOjpBaXIKKworI2VuZGlmIC8vIEFpckNDYWxsU3Bl
Y2lhbF9oCisKSW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9haXIvQWlyQ29kZS5jcHAK
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL2Fpci9BaXJDb2RlLmNwcAko
cmV2aXNpb24gMCkKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9haXIvQWlyQ29kZS5jcHAJ
KHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSw2NCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAx
NSBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24g
YW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBt
b2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNv
bmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNv
ZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxp
c3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVk
aXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5
cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xs
b3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVy
IG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBT
T0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBF
WFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQg
VE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklU
TkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8g
RVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1Ig
QU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlks
IE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8s
CisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9G
IFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9X
RVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJ
TiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdM
SUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisg
KiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9G
IFNVQ0ggREFNQUdFLiAKKyAqLworCisjaW5jbHVkZSAiY29uZmlnLmgiCisjaW5jbHVkZSAiQWly
Q29kZS5oIgorCituYW1lc3BhY2UgSlNDIHsgbmFtZXNwYWNlIEIzIHsgbmFtZXNwYWNlIEFpciB7
CisKK0NvZGU6OkNvZGUoKQoreworfQorCitDb2RlOjp+Q29kZSgpCit7Cit9CisKK0Jhc2ljQmxv
Y2sqIENvZGU6OmFkZEJsb2NrKCkKK3sKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8QmFzaWNCbG9jaz4g
YmxvY2sobmV3IEJhc2ljQmxvY2sobV9ibG9ja3Muc2l6ZSgpKSk7CisgICAgQmFzaWNCbG9jayog
cmVzdWx0ID0gYmxvY2suZ2V0KCk7CisgICAgbV9ibG9ja3MuYXBwZW5kKFdURjo6bW92ZShibG9j
aykpOworICAgIHJldHVybiByZXN1bHQ7Cit9CisKK3ZvaWQgQ29kZTo6ZHVtcChQcmludFN0cmVh
bSYgb3V0KSBjb25zdAoreworICAgIGZvciAoQmFzaWNCbG9jayogYmxvY2sgOiAqdGhpcykKKyAg
ICAgICAgb3V0LnByaW50KGRlZXBEdW1wKGJsb2NrKSk7CisgICAgaWYgKG51bVN0YWNrU2xvdHMo
KSkgeworICAgICAgICBvdXQucHJpbnQoIlN0YWNrIHNsb3RzOlxuIik7CisgICAgICAgIGZvciAo
U3RhY2tTbG90KiBzbG90IDogc3RhY2tTbG90cygpKQorICAgICAgICAgICAgb3V0LnByaW50KCIg
ICAgIiwgZGVlcER1bXAoc2xvdCksICJcbiIpOworICAgIH0KKyAgICBpZiAobnVtU3BlY2lhbHMo
KSkgeworICAgICAgICBvdXQucHJpbnQoIlNwZWNpYWxzOlxuIik7CisgICAgICAgIGZvciAoU3Bl
Y2lhbCogc3BlY2lhbCA6IHNwZWNpYWxzKCkpCisgICAgICAgICAgICBvdXQucHJpbnQoIiAgICAi
LCBkZWVwRHVtcChzcGVjaWFsKSwgIlxuIik7CisgICAgfQorfQorCit9IH0gfSAvLyBuYW1lc3Bh
Y2UgSlNDOjpCMzo6QWlyCisKSW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9haXIvQWly
Q29kZS5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9haXIvQWlyQ29k
ZS5oCShyZXZpc2lvbiAwKQorKysgU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL2Fpci9BaXJDb2Rl
LmgJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSwxMjUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMp
IDIwMTUgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0
aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAor
ICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2lu
ZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJj
ZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhp
cyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIu
IFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUg
Y29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUg
Zm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBv
dGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRI
SVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQor
ICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1J
VEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5E
IEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElO
IE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUg
Rk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBM
QVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVE
IFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9T
UyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04p
IEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRI
RVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcg
TkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVT
RQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElU
WSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKworI2lmbmRlZiBBaXJDb2RlX2gKKyNkZWZpbmUgQWly
Q29kZV9oCisKKyNpbmNsdWRlICJBaXJCYXNpY0Jsb2NrLmgiCisjaW5jbHVkZSAiQWlyU3BlY2lh
bC5oIgorI2luY2x1ZGUgIkFpclN0YWNrU2xvdC5oIgorCituYW1lc3BhY2UgSlNDIHsgbmFtZXNw
YWNlIEIzIHsKKworY2xhc3MgUHJvY2VkdXJlOworCituYW1lc3BhY2UgQWlyIHsKKworLy8gVGhp
cyBpcyBhbiBJUiB0aGF0IGlzIHZlcnkgY2xvc2UgdG8gdGhlIGJhcmUgbWV0YWwuIEl0IHJlcXVp
cmVzIGFib3V0IDQweCBtb3JlIGJ5dGVzIHRoYW4gdGhlCisvLyBnZW5lcmF0ZWQgbWFjaGluZSBj
b2RlIC0gZm9yIGV4YW1wbGUgaWYgeW91J3JlIGdlbmVyYXRpbmcgMU1CIG9mIG1hY2hpbmUgY29k
ZSwgeW91IG5lZWQgYWJvdXQKKy8vIDQwTUIgb2YgQWlyLgorCitjbGFzcyBDb2RlIHsKKyAgICBX
VEZfTUFLRV9OT05DT1BZQUJMRShDb2RlKTsKKyAgICBXVEZfTUFLRV9GQVNUX0FMTE9DQVRFRDsK
K3B1YmxpYzoKKyAgICBDb2RlKCk7CisgICAgfkNvZGUoKTsKKworICAgIEJhc2ljQmxvY2sqIGFk
ZEJsb2NrKCk7CisKKyAgICBTdGFja1Nsb3QqIGFkZFN0YWNrU2xvdCgpOworCisgICAgU3BlY2lh
bCogYWRkU3BlY2lhbChzdGQ6OnVuaXF1ZV9wdHI8U3BlY2lhbD4pOworCisgICAgLy8gVGhpcyBp
cyB0aGUgc3BlY2lhbCB5b3UgbmVlZCB0byBtYWtlIGEgQyBjYWxsIQorICAgIFNwZWNpYWwqIGND
YWxsU3BlY2lhbCgpOworCisgICAgdm9pZCBkdW1wKFByaW50U3RyZWFtJikgY29uc3Q7CisKKyAg
ICB1bnNpZ25lZCBzaXplKCkgY29uc3QgeyByZXR1cm4gbV9ibG9ja3Muc2l6ZSgpOyB9CisgICAg
QmFzaWNCbG9jayogYXQodW5zaWduZWQgaW5kZXgpIGNvbnN0IHsgcmV0dXJuIG1fYmxvY2tzW2lu
ZGV4XTsgfQorICAgIEJhc2ljQmxvY2sqIG9wZXJhdG9yW10odW5zaWduZWQgaW5kZXgpIGNvbnN0
IHsgcmV0dXJuIGF0KGluZGV4KTsgfQorCisgICAgY2xhc3MgaXRlcmF0b3IgeworICAgIHB1Ymxp
YzoKKyAgICAgICAgaXRlcmF0b3IoKToKKyAgICAgICAgICAgIDogbV9wcm9jZWR1cmUobnVsbHB0
cikKKyAgICAgICAgICAgICwgbV9pbmRleCgwKQorICAgICAgICB7CisgICAgICAgIH0KKworICAg
ICAgICBpdGVyYXRvcihQcm9jZWR1cmUmIHByb2NlZHVyZSwgdW5zaWduZWQgaW5kZXgpCisgICAg
ICAgICAgICA6IG1fcHJvY2VkdXJlKCZwcm9jZWR1cmUpCisgICAgICAgICAgICAsIG1faW5kZXgo
aW5kZXgpCisgICAgICAgIHsKKyAgICAgICAgfQorCisgICAgICAgIEJhc2ljQmxvY2sqIG9wZXJh
dG9yKigpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBtX3Byb2NlZHVyZS0+YXQobV9p
bmRleCk7CisgICAgICAgIH0KKworICAgICAgICBpdGVyYXRvciYgb3BlcmF0b3IrKygpCisgICAg
ICAgIHsKKyAgICAgICAgICAgIG1faW5kZXggPSBmaW5kTmV4dChtX2luZGV4ICsgMSk7CisgICAg
ICAgICAgICByZXR1cm4gKnRoaXM7CisgICAgICAgIH0KKworICAgICAgICBib29sIG9wZXJhdG9y
PT0oY29uc3QgaXRlcmF0b3ImIG90aGVyKSBjb25zdAorICAgICAgICB7CisgICAgICAgICAgICBy
ZXR1cm4gbV9pbmRleCA9PSBvdGhlci5tX2luZGV4OworICAgICAgICB9CisKKyAgICAgICAgYm9v
bCBvcGVyYXRvciE9KGNvbnN0IGl0ZXJhdG9yJiBvdGhlcikgY29uc3QKKyAgICAgICAgeworICAg
ICAgICAgICAgcmV0dXJuICEoKnRoaXMgPT0gb3RoZXIpOworICAgICAgICB9CisKKyAgICBwcml2
YXRlOgorICAgICAgICB1bnNpZ25lZCBmaW5kTmV4dCh1bnNpZ25lZCBpbmRleCkKKyAgICAgICAg
eworICAgICAgICAgICAgd2hpbGUgKGluZGV4IDwgbV9wcm9jZWR1cmUtPnNpemUoKSAmJiAhbV9w
cm9jZWR1cmUtPmF0KGluZGV4KSkKKyAgICAgICAgICAgICAgICBpbmRleCsrOworICAgICAgICAg
ICAgcmV0dXJuIGluZXg7CisgICAgICAgIH0KKworICAgICAgICBQcm9jZWR1cmUqIG1fcHJvY2Vk
dXJlOworICAgICAgICB1bnNpZ25lZCBtX2luZGV4OworICAgIH07CisKKyAgICBpdGVyYXRvciBi
ZWdpbigpIGNvbnN0IHsgcmV0dXJuIGl0ZXJhdG9yKCp0aGlzLCAwKTsgfQorICAgIGl0ZXJhdG9y
IGVuZCgpIGNvbnN0IHsgcmV0dXJuIGl0ZXJhdG9yKCp0aGlzLCBudW1CbG9ja3MoKSk7IH0KKwor
cHJpdmF0ZToKKyAgICBWZWN0b3I8c3RkOjp1bmlxdWVfcHRyPFN0YWNrU2xvdD4+IG1fc3RhY2tT
bG90czsKKyAgICBWZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEJhc2ljQmxvY2s+PiBtX2Jsb2NrczsK
KyAgICBWZWN0b3I8c3RkOjp1bmlxdWVfcHRyPFNwZWNpYWw+PiBtX3NwZWNpYWxzOworICAgIFNw
ZWNpYWwqIG1fY2FsbFNwZWNpYWw7Cit9OworCit9IH0gfSAvLyBuYW1lc3BhY2UgSlNDOjpCMzo6
QWlyCisKKyNlbmRpZiAvLyBBaXJDb2RlX2gKKwpJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3Jl
L2IzL2Fpci9BaXJHZW5lcmF0aW9uQ29udGV4dC5oCj09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZh
U2NyaXB0Q29yZS9iMy9haXIvQWlyR2VuZXJhdGlvbkNvbnRleHQuaAkocmV2aXNpb24gMCkKKysr
IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9haXIvQWlyR2VuZXJhdGlvbkNvbnRleHQuaAkod29y
a2luZyBjb3B5KQpAQCAtMCwwICsxLDQzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE1IEFw
cGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQg
dXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlm
aWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0
aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBt
dXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBv
ZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3Ry
aWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdo
dAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2lu
ZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0
ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRX
QVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJF
U1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywg
VEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNT
IEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVO
VCBTSEFMTCBBUFBMRSBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkg
RElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1Ig
Q09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAq
IFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNF
LCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVS
IENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENP
TlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VO
Q0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9G
IFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VD
SCBEQU1BR0UuIAorICovCisKKyNpZm5kZWYgQWlyR2VuZXJhdGlvbkNvbnRleHRfaAorI2RlZmlu
ZSBBaXJHZW5lcmF0aW9uQ29udGV4dF9oCisKKyNpbmNsdWRlIDx3dGYvU2hhcmVkVGFzay5oPgor
CituYW1lc3BhY2UgSlNDIHsgbmFtZXNwYWNlIEIzIHsgbmFtZXNwYWNlIEFpciB7CisKK3N0cnVj
dCBHZW5lcmF0aW9uQ29udGV4dCB7CisgICAgdHlwZWRlZiB2b2lkIExhdGVQYXRoRnVuY3Rpb24o
Q0NhbGxIZWxwZXJzJiwgR2VuZXJhdGlvbkNvbnRleHQmKTsKKyAgICB0eXBlZGVmIFNoYXJlZFRh
c2s8TGF0ZVBhdGhGdW5jdGlvbj4gTGF0ZVBhdGg7CisKKyAgICBWZWN0b3I8UmVmUHRyPExhdGVQ
YXRoPj4gbGF0ZVBhdGhzOworfTsKKworfSB9IH0gLy8gbmFtZXNwYWNlIEpTQzo6QjM6OkFpcgor
CisjZW5kaWYgLy8gQWlyR2VuZXJhdGlvbkNvbnRleHRfaAorCkluZGV4OiBTb3VyY2UvSmF2YVNj
cmlwdENvcmUvYjMvYWlyL0Fpckluc3QuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2Ny
aXB0Q29yZS9iMy9haXIvQWlySW5zdC5jcHAJKHJldmlzaW9uIDApCisrKyBTb3VyY2UvSmF2YVNj
cmlwdENvcmUvYjMvYWlyL0Fpckluc3QuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsNDAg
QEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTUgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2Vy
dmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkg
Zm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHBy
b3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4g
UmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5
cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xs
b3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBt
dXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlz
dCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAg
ICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUg
ZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUg
SU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMs
IElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElF
UyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVS
UE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IKKyAq
IENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVO
VEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElO
Q0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVU
RSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBP
UiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZ
CisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFks
IE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcg
SU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBB
RFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKworI2luY2x1
ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgIkFpckluc3QuaCIKKworI2luY2x1ZGUgIkIzVmFsdWUu
aCIKKyNpbmNsdWRlIDx3dGYvTGlzdER1bXAuaD4KKworbmFtZXNwYWNlIEpTQyB7IG5hbWVzcGFj
ZSBCMyB7IG5hbWVzcGFjZSBBaXIgeworCit2b2lkIEluc3Q6OmR1bXAoUHJpbnRTdHJlYW0mIG91
dCkgY29uc3QKK3sKKyAgICBvdXQucHJpbnQob3Bjb2RlLCAiICIsIGxpc3REdW1wKGFyZ3MpLCAi
ICA7ICIsICpvcmlnaW4pOworfQorCit9IH0gfSAvLyBuYW1lc3BhY2UgSlNDOjpCMzo6QWlyCisK
SW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9haXIvQWlySW5zdC5oCj09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0K
LS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9haXIvQWlySW5zdC5oCShyZXZpc2lvbiAwKQor
KysgU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL2Fpci9BaXJJbnN0LmgJKHdvcmtpbmcgY29weSkK
QEAgLTAsMCArMSwxNDUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTUgQXBwbGUgSW5jLiBB
bGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291
cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBh
cmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBh
cmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWlu
IHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlv
bnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBp
biBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBu
b3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWlt
ZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJv
dmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJP
VklERUQgQlkgQVBQTEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBM
SUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElN
UExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFS
VElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQ
UExFIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElO
RElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5U
SUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1F
TlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9S
CisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFO
RCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNU
UklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhF
UldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZU
V0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4g
CisgKi8KKworI2lmbmRlZiBBaXJJbnN0X2gKKyNkZWZpbmUgQWlySW5zdF9oCisKKyNpbmNsdWRl
ICJBaXJBcmcuaCIKKyNpbmNsdWRlICJBaXJPcGNvZGUuaCIKKworbmFtZXNwYWNlIEpTQyB7CisK
K2NsYXNzIENDYWxsSGVscGVyczsKKworbmFtZXNwYWNlIEIzIHsKKworY2xhc3MgVmFsdWU7CisK
K25hbWVzcGFjZSBBaXIgeworCitzdHJ1Y3QgR2VuZXJhdGlvbkNvbnRleHQ7CisKK3N0cnVjdCBJ
bnN0IHsKK3B1YmxpYzoKKyAgICB0eXBlZGVmIFZlY3RvcjxBcmcsIDM+IEFyZ0xpc3Q7CisKKyAg
ICBJbnN0KE9wY29kZSBvcGNvZGUsIFZhbHVlKiBvcmlnaW4pCisgICAgICAgIDogb3JpZ2luKG9y
aWdpbikKKyAgICAgICAgLCBvcGNvZGUob3Bjb2RlKQorICAgIHsKKyAgICB9CisgICAgCisgICAg
dGVtcGxhdGU8dHlwZW5hbWUuLi4gQXJndW1lbnRzPgorICAgIEluc3QoT3Bjb2RlIG9wY29kZSwg
VmFsdWUqIG9yaWdpbiwgQXJnIGFyZywgQXJndW1lbnRzLi4uIGFyZ3VtZW50cykKKyAgICAgICAg
OiBhcmdzeyBhcmcsIGFyZ3VtZW50cy4uLiB9CisgICAgICAgICwgb3JpZ2luKG9yaWdpbikKKyAg
ICAgICAgLCBvcGNvZGUob3Bjb2RlKQorICAgIHsKKyAgICB9CisKKyAgICBJbnN0KE9wY29kZSBv
cGNvZGUsIFZhbHVlKiBvcmlnaW4sIGNvbnN0IEFyZ0xpc3QmIGFyZ3VtZW50cykKKyAgICAgICAg
OiBhcmdzKGFyZ3VtZW50cykKKyAgICAgICAgLCBvcmlnaW4ob3JpZ2luKQorICAgICAgICAsIG9w
Y29kZShvcGNvZGUpCisgICAgeworICAgIH0KKworICAgIEluc3QoT3Bjb2RlIG9wY29kZSwgVmFs
dWUqIG9yaWdpbiwgQXJnTGlzdCYmIGFyZ3VtZW50cykKKyAgICAgICAgOiBhcmdzKFdURjo6bW92
ZShhcmd1bWVudHMpKQorICAgICAgICAsIG9yaWdpbihvcmlnaW4pCisgICAgICAgICwgb3Bjb2Rl
KG9wY29kZSkKKyAgICB7CisgICAgfQorCisgICAgLy8gTm90ZSB0aGF0IHRoZXNlIGZ1bmN0b3Jz
IGFsbCBhdm9pZCB1c2luZyAiY29uc3QiIGJlY2F1c2Ugd2Ugd2FudCB0byB1c2UgdGhlbSBmb3Ig
dGhpbmdzIHRoYXQKKyAgICAvLyBlZGl0IElSLiBJUiBpcyBtZWFudCB0byBiZSBlZGl0ZWQ7IGlm
IHlvdSdyZSBjYXJyeWluZyBhcm91bmQgYSAiY29uc3QgSW5zdCYiIHRoZW4geW91J3JlCisgICAg
Ly8gcHJvYmFibHkgZG9pbmcgaXQgd3JvbmcuCisKKyAgICAvLyBUaGlzIG9ubHkgd2Fsa3MgdGhv
c2UgVG1wcyB0aGF0IGFyZSBleHBsaWNpdGx5IG1lbnRpb25lZCwgYW5kIGl0IGRvZXNuJ3QgdGVs
bCB5b3UgdGhlaXIgcm9sZQorICAgIC8vIG9yIHR5cGUuCisgICAgdGVtcGxhdGU8dHlwZW5hbWUg
RnVuY3Rvcj4KKyAgICB2b2lkIGZvckVhY2hUbXBGYXN0KGNvbnN0IEZ1bmN0b3ImIGZ1bmN0b3Ip
CisgICAgeworICAgICAgICBmb3IgKEFyZyBhcmcgOiBhcmdzKQorICAgICAgICAgICAgYXJnLmZv
ckVhY2hUbXBGYXN0KGZ1bmN0b3IpOworICAgIH0KKworICAgIHR5cGVkZWYgdm9pZCBFYWNoQXJn
Q2FsbGJhY2soQXJnJiwgQXJnOjpSb2xlLCBBcmc6OlR5cGUpOworICAgIAorICAgIC8vIENhbGxz
IHRoZSBmdW5jdG9yIHdpdGggKGFyZywgcm9sZSwgdHlwZSkuIFRoaXMgZnVuY3Rpb24gaXMgYXV0
by1nZW5lcmF0ZWQgYnkKKyAgICAvLyBvcGNvZGVfZ2VuZXJhdG9yLnJiLgorICAgIHRlbXBsYXRl
PHR5cGVuYW1lIEZ1bmN0b3I+CisgICAgdm9pZCBmb3JFYWNoQXJnKGNvbnN0IEZ1bmN0b3ImIGZ1
bmN0b3IpOworCisgICAgLy8gQ2FsbHMgdGhlIGZ1bmN0b3Igd2l0aCAodG1wLCByb2xlLCB0eXBl
KS4KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBGdW5jdG9yPgorICAgIHZvaWQgZm9yRWFjaFRtcChj
b25zdCBGdW5jdG9yJiBmdW5jdG9yKQorICAgIHsKKyAgICAgICAgZm9yRWFjaEFyZ1JvbGUoCisg
ICAgICAgICAgICBbJl0gKEFyZyYgYXJnLCBBcmc6OlJvbGUgcm9sZSwgQXJnOjpUeXBlIHR5cGUp
IHsKKyAgICAgICAgICAgICAgICBhcmcuZm9yRWFjaFRtcChyb2xlLCB0eXBlLCBmdW5jdG9yKTsK
KyAgICAgICAgICAgIH0pOworICAgIH0KKworICAgIC8vIFJldHVybnMgdHJ1ZSBpZiB0aGlzIGlu
c3RydWN0aW9uIGhhcyBhIFNwZWNpYWwqLiBUaGlzIHVubG9ja3Mgc29tZSBleHRyYSBmdW5jdGlv
bmFsaXR5LgorICAgIGJvb2wgaGFzU3BlY2lhbCgpIGNvbnN0OworCisgICAgLy8gUmVwb3J0cyBh
bnkgYWRkaXRpb25hbCByZWdpc3RlcnMgY2xvYmJlcmVkIGJ5IHRoaXMgb3BlcmF0aW9uLiBOb3Rl
IHRoYXQgZm9yIGVmZmljaWVuY3ksCisgICAgLy8gZXh0cmFDbG9iYmVyZWRSZWdzKCkgb25seSB3
b3JrcyBpZiBoYXNTcGVjaWFsKCkgcmV0dXJucyB0cnVlLgorICAgIGNvbnN0IFJlZ2lzdGVyU2V0
JiBleHRyYUNsb2JiZXJlZFJlZ3MoKTsKKworICAgIC8vIFVzZSB0aGlzIHRvIHJlcG9ydCB3aGlj
aCByZWdpc3RlcnMgYXJlIGxpdmUuIFRoaXMgc2hvdWxkIGJlIGRvbmUganVzdCBiZWZvcmUgY29k
ZWdlbi4gTm90ZQorICAgIC8vIHRoYXQgZm9yIGVmZmljaWVuY3ksIHJlcG9ydFVzZWRSZWdpc3Rl
cnMoKSBvbmx5IHdvcmtzIGlmIGhhc1NwZWNpYWwoKSByZXR1cm5zIHRydWUuCisgICAgdm9pZCBy
ZXBvcnRVc2VkUmVnaXN0ZXJzKGNvbnN0IFJlZ2lzdGVyU2V0Jik7CisKKyAgICAvLyBJcyB0aGlz
IGluc3RydWN0aW9uIGluIG9uZSBvZiB0aGUgdmFsaWQgZm9ybXMgcmlnaHQgbm93PyBUaGlzIGZ1
bmN0aW9uIGlzIGF1dG8tZ2VuZXJhdGVkIGJ5CisgICAgLy8gb3Bjb2RlX2dlbmVyYXRvci5yYi4K
KyAgICBib29sIGlzVmFsaWRGb3JtKCk7CisKKyAgICAvLyBBc3N1bWluZyB0aGlzIGluc3RydWN0
aW9uIGlzIGluIGEgdmFsaWQgZm9ybSByaWdodCBub3csIHdpbGwgaXQgc3RpbGwgYmUgaW4gb25l
IG9mIHRoZSB2YWxpZAorICAgIC8vIGZvcm1zIGlmIHdlIHB1dCBhbiBBZGRyIHJlZmVyZW5jaW5n
IHRoZSBzdGFjayAob3IgYSBTdGFja1Nsb3Qgb3IgQ2FsbEFyZywgb2YgY291cnNlKSBpbiB0aGUK
KyAgICAvLyBnaXZlbiBpbmRleD8gU3BpbGxpbmcgdXNlcyB0aGlzOiBpdCB3YWxrcyB0aGUgYXJn
cyBieSBpbmRleCB0byBmaW5kIFRtcHMgdGhhdCBuZWVkIHNwaWxsaW5nOworICAgIC8vIGlmIGl0
IGZpbmRzIG9uZSwgaXQgY2FsbHMgdGhpcyB0byBzZWUgaWYgaXQgY2FuIHJlcGxhY2UgdGhlIEFy
Zzo6VG1wIHdpdGggYW4gQXJnOjpBZGRyLiBJZiBpdAorICAgIC8vIGZpbmRzIGEgbm9uLVRtcCBB
cmcsIHRoZW4gaXQgY2FsbHMgdGhhdCBBcmcncyBmb3JFYWNoVG1wIHRvIGRvIGEgcmVwbGFjZW1l
bnQgdGhhdCB3YXkuCisgICAgLy8KKyAgICAvLyBUaGlzIGZ1bmN0aW9uIGlzIGF1dG8tZ2VuZXJh
dGVkIGJ5IG9wY29kZV9nZW5lcmF0b3IucmIuCisgICAgYm9vbCBhZG1pdHNTdGFjayh1bnNpZ25l
ZCBhcmdJbmRleCk7CisKKyAgICAvLyBHZW5lcmF0ZSBzb21lIGNvZGUgZm9yIHRoaXMgaW5zdHJ1
Y3Rpb24uIFRoaXMgaXMsIGxpa2UsIGxpdGVyYWxseSBvdXIgYmFja2VuZC4gSWYgdGhpcyBpcyB0
aGUKKyAgICAvLyB0ZXJtaW5hbCwgaXQgcmV0dXJucyB0aGUganVtcCB0aGF0IG5lZWRzIHRvIGJl
IGxpbmtlZCBmb3IgdGhlICJ0aGVuIiBjYXNlLCB3aXRoIHRoZSAiZWxzZSIKKyAgICAvLyBjYXNl
IGJlaW5nIGZhbGwtdGhyb3VnaC4gVGhpcyBmdW5jdGlvbiBpcyBhdXRvLWdlbmVyYXRlZCBieSBv
cGNvZGVfZ2VuZXJhdG9yLnJiLgorICAgIENDYWxsSGVscGVyczo6SnVtcCBnZW5lcmF0ZShDQ2Fs
bEhlbHBlcnMmLCBHZW5lcmF0aW9uQ29udGV4dCYpOworCisgICAgdm9pZCBkdW1wKFByaW50U3Ry
ZWFtJikgY29uc3Q7CisKKyAgICBBcmdMaXN0IGFyZ3M7CisgICAgVmFsdWUqIG9yaWdpbjsgLy8g
VGhlIEIzOjpWYWx1ZSB0aGF0IHRoaXMgb3JpZ2luYXRlZCBmcm9tLgorICAgIE9wY29kZSBvcGNv
ZGU7Cit9OworCit9IH0gfSAvLyBuYW1lc3BhY2UgSlNDOjpCMzo6QWlyCisKKyNlbmRpZiAvLyBB
aXJJbnN0X2gKKwpJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL2Fpci9BaXJJbnN0SW5s
aW5lcy5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9haXIvQWlySW5z
dElubGluZXMuaAkocmV2aXNpb24gMCkKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9haXIv
QWlySW5zdElubGluZXMuaAkod29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDY5IEBACisvKgorICog
Q29weXJpZ2h0IChDKSAyMDE1IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisg
KiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRo
IG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0
IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0
aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAg
ICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2Ns
YWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1
Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0
aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRh
dGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlv
bi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gYGBBUyBJ
UycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcs
IEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hB
TlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJ
U0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SCisgKiBDT05UUklCVVRP
UlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lB
TCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJV
VCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1Ig
U0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1Mg
SU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElB
QklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisg
KiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkg
T1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBU
SEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisKKyNpZm5kZWYgQWlySW5zdElu
bGluZXNfaAorI2RlZmluZSBBaXJJbnN0SW5saW5lc19oCisKKyNpbmNsdWRlICJBaXJJbnN0Lmgi
CisjaW5jbHVkZSAiQWlyT3Bjb2RlVXRpbHMuaCIKKyNpbmNsdWRlICJBaXJTcGVjaWFscy5oIgor
I2luY2x1ZGUgIkIzU3RhY2ttYXAuaCIKKyNpbmNsdWRlICJCM1ZhbHVlLmgiCisKK25hbWVzcGFj
ZSBKU0MgeyBuYW1lc3BhY2UgQjMgeyBuYW1lc3BhY2UgQWlyIHsKKworYm9vbCBJbnN0OjpoYXNT
cGVjaWFsKCkgY29uc3QKK3sKKyAgICByZXR1cm4gYXJncy5zaXplKCkgJiYgYXJnc1swXS5pc1Nw
ZWNpYWwoKTsKK30KKworY29uc3QgUmVnaXN0ZXJTZXQmIEluc3Q6OmV4dHJhQ2xvYmJlcmVkUmVn
cygpCit7CisgICAgcmV0dXJuIGFyZ3NbMF0uc3BlY2lhbCgpLT5leHRyYUNsb2JiZXJlZFJlZ3Mo
KnRoaXMpOworfQorCit2b2lkIEluc3Q6OnJlcG9ydFVzZWRSZWdpc3RlcnMoY29uc3QgUmVnaXN0
ZXJTZXQmIHVzZWRSZWdpc3RlcnMpCit7CisgICAgYXJnc1swXS5zcGVjaWFsKCktPnJlcG9ydFVz
ZWRSZWdpc3RlcnMoKnRoaXMsIHVzZWRSZWdpc3RlcnMpOworfQorCitpbmxpbmUgYm9vbCBpc1No
aWZ0VmFsaWQoSW5zdCYgaW5zdCkKK3sKKyNpZiBDUFUoWDg2KQorICAgIHJldHVybiBpbnN0LmFy
Z3NbMF0gPT0gVG1wKFg4NlJlZ2lzdGVyOjpjeCk7CisjZWxzZQorICAgIHJldHVybiB0cnVlOwor
I2VuZGlmCit9ICAgCisKK2lubGluZSBib29sIGlzTHNoaWZ0MzJWYWx1ZShJbnN0JiBpbnN0KQor
eworICAgIHJldHVybiBpc1NoaWZ0VmFsaWQoaW5zdCk7Cit9CisKK30gfSB9IC8vIG5hbWVzcGFj
ZSBKU0M6OkIzOjpBaXIKKworI2VuZGlmIC8vIEFpckluc3RJbmxpbmVzX2gKKwpJbmRleDogU291
cmNlL0phdmFTY3JpcHRDb3JlL2IzL2Fpci9BaXJPcGNvZGUub3Bjb2Rlcwo9PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0t
LSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvYWlyL0Fpck9wY29kZS5vcGNvZGVzCShyZXZpc2lv
biAwKQorKysgU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL2Fpci9BaXJPcGNvZGUub3Bjb2Rlcwko
d29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDEwNyBAQAorIyBDb3B5cmlnaHQgKEMpIDIwMTUgQXBw
bGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorIworIyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNl
IGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyMgbW9kaWZpY2F0
aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25z
CisjIGFyZSBtZXQ6CisjIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJl
dGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisjICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRp
dGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyMgMi4gUmVkaXN0cmlidXRpb25z
IGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyMgICAg
bm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFp
bWVyIGluIHRoZQorIyAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJv
dmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorIworIyBUSElTIFNPRlRXQVJFIElTIFBST1ZJ
REVEIEJZIEFQUExFIElOQy4gQU5EIElUUyBDT05UUklCVVRPUlMgYGBBUyBJUycnCisjIEFORCBB
TlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1J
VEVEIFRPLAorIyBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQg
RklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisjIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5P
IEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IgSVRTIENPTlRSSUJVVE9SUworIyBCRSBMSUFCTEUg
Rk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlks
IE9SCisjIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQg
VE8sIFBST0NVUkVNRU5UIE9GCisjIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1Mg
T0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUworIyBJTlRFUlJVUFRJT04pIEhP
V0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTgor
IyBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VO
Q0UgT1IgT1RIRVJXSVNFKQorIyBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0Yg
VEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GCisjIFRIRSBQT1NTSUJJTElUWSBPRiBT
VUNIIERBTUFHRS4KKworIyBTeWxsYWJ1czoKKyMKKyMgUm9sZXMgYW5kIHR5cGVzOgorIyBVOkcg
PT4gdXNlIG9mIGEgZ2VuZXJhbC1wdXJwb3NlIHJlZ2lzdGVyIG9yIHZhbHVlCisjIEQ6RyA9PiBk
ZWYgb2YgYSBnZW5lcmFsLXB1cnBvc2UgcmVnaXN0ZXIgb3IgdmFsdWUKKyMgVUQ6RyA9PiB1c2Ug
YW5kIGRlZiBvZiBhIGdlbmVyYWwtcHVycG9zZSByZWdpc3RlciBvciB2YWx1ZQorIyBVOkYgPT4g
dXNlIG9mIGEgZmxvYXQgcmVnaXN0ZXIgb3IgdmFsdWUKKyMgRDpGID0+IGRlZiBvZiBhIGZsb2F0
IHJlZ2lzdGVyIG9yIHZhbHVlCisjIFVEOkYgPT4gdXNlIGFuZCBkZWYgb2YgYSBmbG9hdCByZWdp
c3RlciBvciB2YWx1ZQorIworIyBBcmd1bWVudCBraW5kczoKKyMgVG1wID0+IHRlbXBvcmFyeSBv
ciByZWdpc3RlcgorIyBJbW0gPT4gMzItYml0IGltbWVkaWF0ZSBpbnQKKyMgSW1tUHRyID0+IFRy
dXN0ZWRJbW1QdHIKKyMgQWRkciA9PiBhZGRyZXNzIGFzIHRlbXBvcmFyeS9yZWdpc3RlcitvZmZz
ZXQKKyMgSW5kZXggPT4gQmFzZUluZGV4IGFkZHJlc3MKKyMgQWJzID0+IEFic29sdXRlQWRkcmVz
cworIworIyBUaGUgcGFyc2VyIHZpZXdzIHRoZXNlIHRoaW5ncyBhcyBrZXl3b3JkcywgYW5kIHVu
ZGVyc3RhbmRzIHRoYXQgdGhleSBmYWxsIGludG8gdHdvIGRpc3RpbmN0IGNsYXNzZXMKKyMgb2Yg
dGhpbmdzLiBTbywgYWx0aG91Z2ggdGhpcyBmaWxlIHVzZXMgYSBwYXJ0aWN1bGFyIGluZGVudGF0
aW9uIHN0eWxlLCBub25lIG9mIHRoZSB3aGl0ZXNwYWNlIG9yCisjIGV2ZW4gbmV3bGluZXMgYXJl
IG1lYW5pbmdmdWwgdG8gdGhlIHBhcnNlci4gRm9yIGV4YW1wbGUsIHlvdSBjb3VsZCB3cml0ZToK
KyMKKyMgRm9vNDIgVTpHLCBVRDpGIEltbSwgVG1wIEFkZHIsIFRtcAorIworIyBBbmQgdGhlIHBh
cnNlciB3b3VsZCBrbm93IHRoYXQgdGhpcyBpcyB0aGUgc2FtZSBhczoKKyMKKyMgRm9vNDIgVTpH
LCBVRDpGCisjICAgICBJbW0sIFRtcAorIyAgICAgQWRkciwgVG1wCisjCisjIEkuZS4gYSB0d28t
Zm9ybSBpbnN0cnVjdGlvbiB0aGF0IHVzZXMgYSBHUFIgb3IgYW4gaW50IGltbWVkaWF0ZSBhbmQg
dXNlcytkZWZzIGEgZmxvYXQgcmVnaXN0ZXIuCisKKyMgTm90ZSB0aGF0IHRoZSBvcGNvZGVzIGhl
cmUgaGF2ZSBhIGxlYWRpbmcgY2FwaXRhbCAoQWRkMzIpIGJ1dCBtdXN0IGNvcnJlc3BvbmQgdG8g
TWFjcm9Bc3NlbWJsZXIKKyMgQVBJIHRoYXQgaGFzIGEgbGVhZGluZyBsb3dlci1jYXNlIChhZGQz
MikuCisKK0FkZDMyIFU6RywgVUQ6RworICAgIFRtcCwgVG1wCisgICAgSW1tLCBBZGRyCisgICAg
SW1tLCBUbXAKKyAgICBBZGRyLCBUbXAKKyAgICBUbXAsIEFkZHIKKworQWRkMzIgVTpHLCBVOkcs
IEQ6RworICAgIEltbSwgVG1wLCBUbXAKKworQW5kMzIgVTpHLCBVRDpHCisgICAgVG1wLCBUbXAK
KyAgICBJbW0sIFRtcAorICAgIFRtcCwgQWRkcgorICAgIEFkZHIsIFRtcAorICAgIEltbSwgQWRk
cgorCitMc2hpZnQzMiBVOkcsIFVEOkcKKyAgICBUbXAqLCBUbXAKKyAgICBJbW0sIFRtcAorCitN
dWwzMiBVOkcsIFVEOkcKKyAgICBUbXAsIFRtcAorICAgIEFkZHIsIFRtcAorCitNb3ZlIFU6Rywg
RDpHCisgICAgVG1wLCBUbXAKKyAgICBJbW0sIFRtcAorICAgIEltbVB0ciwgVG1wCisgICAgQWRk
ciwgVG1wIGFzIGxvYWQgIyBUaGlzIG1lYW5zIHRoYXQgIk1vdmUgQWRkciwgVG1wIiBpcyBjb2Rl
LWdlbmVyYXRlZCBhcyAibG9hZCIgbm90ICJtb3ZlIi4KKyAgICBUbXAsIEFkZHIgYXMgc3RvcmUK
KworTW92ZURvdWJsZSBVOkYsIEQ6RgorICAgIFRtcCwgVG1wCisgICAgQWRkciwgVG1wIGFzIGxv
YWREb3VibGUKKyAgICBUbXAsIEFkZHIgYXMgc3RvcmVEb3VibGUKKworTW92ZTY0VG9Eb3VibGUg
VTpHLCBEOkYKKyAgICBUbXAsIFRtcAorCitNb3ZlRG91YmxlVG82NCBVOkYsIEQ6RworICAgIFRt
cCwgVG1wCisKK1JldAorCisjIEFpciBhbGxvd3MgZm9yIGV4b3RpYyBiZWhhdmlvci4gQSBQYXRj
aCdzIGJlaGF2aW9yIGlzIGRldGVybWluZWQgZW50aXJlbHkgYnkgdGhlIFNwZWNpYWwgb3BlcmFu
ZCwKKyMgd2hpY2ggbXVzdCBiZSB0aGUgZmlyc3Qgb3BlcmFuZC4KK3NwZWNpYWwgUGF0Y2gKKwpJ
bmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL2Fpci9BaXJTcGVjaWFsLmNwcAo9PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvYWlyL0FpclNwZWNpYWwuY3BwCShyZXZp
c2lvbiAwKQorKysgU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL2Fpci9BaXJTcGVjaWFsLmNwcAko
d29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDU1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE1
IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBh
bmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1v
ZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29u
ZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29k
ZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlz
dCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRp
c3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHly
aWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxv
d2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIg
bWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNP
RlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVY
UFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBU
TywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRO
RVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBF
VkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBB
TlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwg
T1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywK
KyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0Yg
VVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dF
VkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElO
IENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJ
R0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAq
IE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0Yg
U1VDSCBEQU1BR0UuIAorICovCisKKyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJBaXJT
cGVjaWFsLmgiCisKK25hbWVzcGFjZSBKU0MgeyBuYW1lc3BhY2UgQjMgeyBuYW1lc3BhY2UgQWly
IHsKKworU3BlY2lhbDo6U3BlY2lhbChjb25zdCBjaGFyKiBuYW1lKQorICAgIDogbV9uYW1lKG5h
bWUpCisgICAgLCBtX2luZGV4KFVJTlRfTUFYKQoreworfQorCitTcGVjaWFsOjp+U3BlY2lhbCgp
Cit7Cit9CisKK3ZvaWQgU3BlY2lhbDo6ZHVtcChQcmludFN0cmVhbSYgb3V0KSBjb25zdAorewor
ICAgIG91dC5wcmludChtX25hbWUpOworICAgIGlmIChtX2luZGV4ICE9IFVJTlRfTUFYKQorICAg
ICAgICBvdXQucHJpbnQobV9pbmRleCk7Cit9CisKK3ZvaWQgU3BlY2lhbDo6ZGVlcER1bXAoUHJp
bnRTdHJlYW0mIG91dCkgY29uc3QKK3sKKyAgICBvdXQucHJpbnQoKnRoaXMsICI6ICIpOworICAg
IGRlZXBEdW1wSW1wbChvdXQpOworfQorCit9IH0gfSAvLyBuYW1lc3BhY2UgSlNDOjpCMzo6QWly
CisKSW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9haXIvQWlyU3BlY2lhbC5oCj09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9haXIvQWlyU3BlY2lhbC5oCShyZXZp
c2lvbiAwKQorKysgU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL2Fpci9BaXJTcGVjaWFsLmgJKHdv
cmtpbmcgY29weSkKQEAgLTAsMCArMSwxMjAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTUg
QXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFu
ZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9k
aWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25k
aXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2Rl
IG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0
IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlz
dHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJp
Z2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93
aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBt
YXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09G
VFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQ
UkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRP
LCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5F
U1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVW
RU5UIFNIQUxMIEFQUExFIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFO
WSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBP
UiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAor
ICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBV
U0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VW
RVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4g
Q09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElH
RU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICog
T0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBT
VUNIIERBTUFHRS4gCisgKi8KKworI2lmbmRlZiBBaXJTcGVjaWFsX2gKKyNkZWZpbmUgQWlyU3Bl
Y2lhbF9oCisKKyNpbmNsdWRlICJBaXJJbnN0LmgiCisjaW5jbHVkZSA8d3RmL0Zhc3RNYWxsb2Mu
aD4KKyNpbmNsdWRlIDx3dGYvTm9uY29weWFibGUuaD4KKyNpbmNsdWRlIDx3dGYvU2NvcGVkTGFt
YmRhLmg+CisKK25hbWVzcGFjZSBKU0MgeyBuYW1lc3BhY2UgQjMgeyBuYW1lc3BhY2UgQWlyIHsK
KworY2xhc3MgR2VuZXJhdGlvbkNvbnRleHQ7CisKK2NsYXNzIFNwZWNpYWwgeworICAgIFdURl9N
QUtFX05PTkNPUFlBQkxFKFNwZWNpYWwpOworICAgIFdURl9NQUtFX0ZBU1RfQUxMT0NBVEVEOwor
cHVibGljOgorICAgIFNwZWNpYWwoY29uc3QgY2hhciogbmFtZSk7CisgICAgdmlydHVhbCB+U3Bl
Y2lhbCgpOworCisgICAgY29uc3QgY2hhciogbmFtZSgpIGNvbnN0IHsgcmV0dXJuIG1fbmFtZTsg
fQorCisgICAgdmlydHVhbCB2b2lkIGZvckVhY2hBcmcoSW5zdCYsIGNvbnN0IFNjb3BlZExhbWJk
YTxJbnN0OjpFYWNoQXJnQ2FsbGJhY2s+JikgPSAwOworICAgIHZpcnR1YWwgYm9vbCBpc1ZhbGlk
KEluc3QmKSA9IDA7CisgICAgdmlydHVhbCBib29sIGFkbWl0c1N0YWNrKEluc3QmLCB1bnNpZ25l
ZCBhcmdJbmRleCkgPSAwOworCisgICAgLy8gVGhpcyBnZXRzIGNhbGxlZCBvbiBmb3IgZWFjaCBJ
bnN0IHRoYXQgdXNlcyB0aGlzIFNwZWNpYWwuIE5vdGUgdGhhdCB0aGVyZSBpcyBubyB3YXkgdG8K
KyAgICAvLyBndWFyYW50ZWUgdGhhdCBhIFNwZWNpYWwgZ2V0cyB1c2VkIGZyb20ganVzdCBvbmUg
SW5zdCwgYmVjYXVzZSBBaXIgbWlnaHQgdGFpbGR1cCBsYXRlLiBTbywKKyAgICAvLyBpZiB5b3Ug
d2FudCB0byBwYXNzIHRoaXMgaW5mb3JtYXRpb24gZG93biB0byBnZW5lcmF0ZSgpLCB0aGVuIHlv
dSBoYXZlIHRvIGVpdGhlcjoKKyAgICAvLworICAgIC8vIDEpIEdlbmVyYXRlIEFpciB0aGF0IHN0
YXJ0cyB3aXRoIGEgc2VwYXJhdGUgU3BlY2lhbCBwZXIgUGF0Y2ggSW5zdCwgYW5kIHRoZW4gbWVy
Z2UKKyAgICAvLyAgICB1c2VkUmVnaXN0ZXIgc2V0cy4gVGhpcyBpcyBwcm9iYWJseSBub3QgZ3Jl
YXQsIGJ1dCBpdCBvcHRpbWl6ZXMgZm9yIHRoZSBjb21tb24gY2FzZSB0aGF0CisgICAgLy8gICAg
QWlyIGRpZG4ndCBkdXBsaWNhdGUgY29kZSBvciB0aGF0IHN1Y2ggZHVwbGljYXRpb24gZGlkbid0
IGNhdXNlIGFueSBpbnRlcmVzdGluZyBjaGFuZ2VzIHRvCisgICAgLy8gICAgcmVnaXN0ZXIgYXNz
aWdubWVudC4KKyAgICAvLworICAgIC8vIDIpIEhhdmUgdGhlIFNwZWNpYWwgbWFpbnRhaW4gYSBI
YXNoTWFwPEluc3QqLCBSZWdpc3RlclNldD4uIFRoaXMgd29ya3MgYmVjYXVzZSB0aGUgYW5hbHlz
aXMKKyAgICAvLyAgICB0aGF0IGZlZWRzIGludG8gdGhpcyBjYWxsIGlzIHBlcmZvcm1lZCBqdXN0
IGJlZm9yZSBjb2RlIGdlbmVyYXRpb24gYW5kIHRoZXJlIGlzIG5vIHdheQorICAgIC8vICAgIGZv
ciB0aGUgVmVjdG9yPD4ncyB0aGF0IGNvbnRhaW4gdGhlIEluc3RzIHRvIGJlIHJlYWxsb2NhdGVk
LiBUaGlzIGFsbG93cyBnZW5lcmF0ZSgpIHRvCisgICAgLy8gICAgY29uc3VsdCB0aGUgSGFzaE1h
cC4KKyAgICAvLworICAgIC8vIDMpIEh5YnJpZDogeW91IGNvdWxkIHVzZSAoMSkgYW5kIGZpcmUg
dXAgYSBIYXNoTWFwIGlmIHlvdSBzZWUgbXVsdGlwbGUgY2FsbHMuCisgICAgLy8KKyAgICAvLyBO
b3RlIHRoYXQgaXQncyBub3QgcG9zc2libGUgdG8gcmVseSBvbiByZXBvcnRVc2VkUmVnaXN0ZXJz
KCkgYmVpbmcgY2FsbGVkIGluIHRoZSBzYW1lIG9yZGVyCisgICAgLy8gYXMgZ2VuZXJhdGUoKS4g
SWYgd2UgY291bGQgcmVseSBvbiB0aGF0LCB0aGVuIHdlIGNvdWxkIGp1c3QgaGF2ZSBlYWNoIFNw
ZWNpYWwgaW5zdGFuY2UKKyAgICAvLyBtYWludGFpbiBhIFZlY3RvciBvZiBSZWdpc3RlclNldCdz
IGFuZCB0aGVuIHByb2Nlc3MgdGhhdCB2ZWN0b3IgaW4gdGhlIHJpZ2h0IG9yZGVyIGluCisgICAg
Ly8gZ2VuZXJhdGUoKS4gQnV0LCB0aGUgb3JkZXJpbmcgZGlmZmVyZW5jZSBpcyB1bmxpa2VseSB0
byBjaGFuZ2Ugc2luY2UgaXQgd291bGQgaGFybSB0aGUKKyAgICAvLyBwZXJmb3JtYW5jZSBvZiB0
aGUgbGl2ZW5lc3MgYW5hbHlzaXMuCisgICAgLy8KKyAgICAvLyBDdXJyZW50bHksIHdlIGRvICgx
KSBmb3IgQjMgc3RhY2ttYXBzLgorICAgIHZpcnR1YWwgdm9pZCByZXBvcnRVc2VkUmVnaXN0ZXJz
KEluc3QmLCBjb25zdCBSZWdpc3RlclNldCYpID0gMDsKKyAgICAKKyAgICB2aXJ0dWFsIENDYWxs
SGVscGVyczo6SnVtcCBnZW5lcmF0ZShJbnN0JiwgQ0NhbGxIZWxwZXJzJiwgR2VuZXJhdGlvbkNv
bnRleHQmKSA9IDA7CisKKyAgICB2aXJ0dWFsIGNvbnN0IFJlZ2lzdGVyU2V0JiBleHRyYUNsb2Ji
ZXJlZFJlZ3MoSW5zdCYpID0gMDsKKworICAgIHZvaWQgZHVtcChQcmludFN0cmVhbSYpIGNvbnN0
OworICAgIHZvaWQgZGVlcER1bXAoUHJpbnRTdHJlYW0mKSBjb25zdDsKKworcHJvdGVjdGVkOgor
ICAgIHZpcnR1YWwgdm9pZCBkZWVwRHVtcEltcGwoUHJpbnRTdHJlYW0mKSBjb25zdCA9IDA7CisK
K3ByaXZhdGU6CisgICAgZnJpZW5kIGNsYXNzIENvZGU7CisKKyAgICBjb25zdCBjaGFyKiBtX25h
bWU7CisgICAgdW5zaWduZWQgbV9pbmRleDsKK307CisKK2NsYXNzIERlZXBTcGVjaWFsRHVtcCB7
CitwdWJsaWM6CisgICAgRGVlcFNwZWNpYWxEaW1wKFNwZWNpYWwqIHNwZWNpYWwpCisgICAgICAg
IDogbV9zcGVjaWFsKHNwZWNpYWwpCisgICAgeworICAgIH0KKworICAgIHZvaWQgZHVtcChQcmlu
dFN0cmVhbSYgb3V0KSBjb25zdAorICAgIHsKKyAgICAgICAgaWYgKG1fc3BlY2lhbCkKKyAgICAg
ICAgICAgIG1fc3BlY2lhbC0+ZGVlcER1bXAob3V0KTsKKyAgICAgICAgZWxzZQorICAgICAgICAg
ICAgb3V0LnByaW50KCI8bnVsbD4iKTsKKyAgICB9CisKK3ByaXZhdGU6CisgICAgU3BlY2lhbCog
bV9zcGVjaWFsOworfTsKKworRGVlcFNwZWNpYWxEdW1wIGRlZXBEdW1wKFNwZWNpYWwqIHNwZWNp
YWwpCit7CisgICAgcmV0dXJuIERlZXBTcGVjaWFsRHVtcChzcGVjaWFsKTsKK30KKworfSB9IH0g
Ly8gbmFtZXNwYWNlIEpTQzo6QjM6OkFpcgorCisjZW5kaWYgLy8gQWlyU3BlY2lhbF9oCisKSW5k
ZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9haXIvQWlyU3RhY2tTbG90LmgKPT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PQotLS0gU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL2Fpci9BaXJTdGFja1Nsb3QuaAkocmV2aXNp
b24gMCkKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9haXIvQWlyU3RhY2tTbG90LmgJKHdv
cmtpbmcgY29weSkKQEAgLTAsMCArMSw5MiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNSBB
cHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5k
IHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2Rp
ZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRp
dGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUg
bXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qg
b2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0
cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmln
aHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dp
bmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1h
dGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZU
V0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBS
RVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8s
IFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVT
UyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZF
TlQgU0hBTEwgQVBQTEUgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5Z
IERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9S
IENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisg
KiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVT
RSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZF
UiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBD
T05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdF
TkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBP
RiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNV
Q0ggREFNQUdFLiAKKyAqLworCisjaWZuZGVmIEFpclN0YWNrU2xvdF9oCisjZGVmaW5lIEFpclN0
YWNrU2xvdF9oCisKKyNpbmNsdWRlIDx3dGYvTm9uQ29weWFibGUuaD4KKyNpbmNsdWRlIDx3dGYv
RmFzdE1hbGxvYy5oPgorCituYW1lc3BhY2UgSlNDIHsgbmFtZXNwYWNlIEIzIHsKKworY2xhc3Mg
U3RhY2tTbG90dmFsdWU7CisKK25hbWVzcGFjZSBBaXIgeworCitjbGFzcyBTdGFja1Nsb3Qgewor
ICAgIFdURl9NQUtFX05PTkNPUFlBQkxFKFN0YWNrU2xvdCk7CisgICAgV1RGX01BS0VfRkFTVF9B
TExPQ0FURUQ7CitwdWJsaWM6CisgICAgdW5zaWduZWQgYnl0ZVNpemUoKSBjb25zdCB7IHJldHVy
biBtX2J5dGVTaXplOyB9CisgICAgdW5zaWduZWQgaW5kZXgoKSBjb25zdCB7IHJldHVybiBtX2lu
ZGV4OyB9CisKKyAgICBTdGFja1Nsb3RWYWx1ZSogdmFsdWUoKSBjb25zdCB7IHJldHVybiBtX3Zh
bHVlOyB9CisKKyAgICB2b2lkIGR1bXAoUHJpbnRTdHJlYW0mKSBjb25zdDsKKyAgICB2b2lkIGRl
ZXBEdW1wKFByaW50U3RyZWFtJikgY29uc3Q7CisKK3ByaXZhdGU6CisgICAgZnJpZW5kIGNsYXNz
IENvZGU7CisKKyAgICBTdGFja1Nsb3QodW5zaWduZWQgYnl0ZVNpemUsIHVuc2lnbmVkIGluZGV4
LCBTdGFja1Nsb3RWYWx1ZSogdmFsdWUpCisgICAgICAgIDogbV9ieXRlU2l6ZShieXRlU2l6ZSkK
KyAgICAgICAgLCBtX2luZGV4KGluZGV4KQorICAgICAgICAsIG1fdmFsdWUodmFsdWUpCisgICAg
eworICAgIH0KKyAgICAKKyAgICB1bnNpZ25lZCBtX2J5dGVTaXplOworICAgIHVuc2lnbmVkIG1f
aW5kZXg7CisgICAgU3RhY2tTbG90VmFsdWUqIG1fdmFsdWU7Cit9OworCitjbGFzcyBEZWVwU3Rh
Y2tTbG90RHVtcCB7CitwdWJsaWM6CisgICAgRGVlcFN0YWNrU2xvdER1bXAoU3RhY2tTbG90KiBz
bG90KQorICAgICAgICA6IG1fc2xvdChzbG90KQorICAgIHsKKyAgICB9CisKKyAgICB2b2lkIGR1
bXAoUHJpbnRTdHJlYW0mIG91dCkgY29uc3QKKyAgICB7CisgICAgICAgIGlmIChtX3Nsb3QpCisg
ICAgICAgICAgICBtX3Nsb3QtPmRlZXBEdW1wKG91dCk7CisgICAgICAgIGVsc2UKKyAgICAgICAg
ICAgIG91dC5wcmludCgiPG51bGw+Iik7CisgICAgfQorCitwcml2YXRlOgorICAgIFN0YWNrU2xv
dCogbV9zbG90OworfTsKKworRGVlcFN0YWNrU2xvdER1bXAgZGVlcER1bXAoU3RhY2tTbG90KiBz
bG90KQoreworICAgIHJldHVybiBEZWVwU3RhY2tTbG90RHVtcChzbG90KTsKK30KKworfSB9IH0g
Ly8gbmFtZXNwYWNlIEpTQzo6QjM6OkFpcgorCisjZW5kaWYgLy8gQWlyU3RhY2tTbG90X2gKKwpJ
bmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL2Fpci9BaXJUbXAuY3BwCj09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0K
LS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9haXIvQWlyVG1wLmNwcAkocmV2aXNpb24gMCkK
KysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9haXIvQWlyVG1wLmNwcAkod29ya2luZyBjb3B5
KQpAQCAtMCwwICsxLDUyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE1IEFwcGxlIEluYy4g
QWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNv
dXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwg
YXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICog
YXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFp
biB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRp
b25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMg
aW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAg
bm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFp
bWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHBy
b3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBS
T1ZJREVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1Q
TElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJ
TVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBB
UlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBB
UFBMRSBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJ
TkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVO
VElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVN
RU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBP
UgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBB
TkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBT
VFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RI
RVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09G
VFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0Uu
IAorICovCisKKyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJBaXJUbXAuaCIKKworbmFt
ZXNwYWNlIEpTQyB7IG5hbWVzcGFjZSBCMyB7IG5hbWVzcGFjZSBBaXIgeworCit2b2lkIFRtcDo6
ZHVtcChQcmludFN0cmVhbSYgb3V0KSBjb25zdAoreworICAgIGlmICghKnRoaXMpIHsKKyAgICAg
ICAgb3V0LnByaW50KCI8bm9uZT4iKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGlm
IChpc1JlZygpKSB7CisgICAgICAgIG91dC5wcmludChyZWcoKSk7CisgICAgICAgIHJldHVybjsK
KyAgICB9CisKKyAgICBpZiAoaXNHUFRtcCgpKSB7CisgICAgICAgIG91dC5wcmludCgiJXRtcCIs
IGdwVG1wSW5kZXgoKSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBvdXQucHJpbnQo
IiVmdG1wIiwgZnBUbXBJbmRleCgpKTsKK30KKworfSB9IH0gLy8gbmFtZXNwYWNlIEpTQzo6QjM6
OkFpcgorCkluZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvYWlyL0FpclRtcC5oCj09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9haXIvQWlyVG1wLmgJKHJldmlzaW9u
IDApCisrKyBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvYWlyL0FpclRtcC5oCSh3b3JraW5nIGNv
cHkpCkBAIC0wLDAgKzEsMjQ4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE1IEFwcGxlIElu
Yy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGlu
IHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlv
biwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwor
ICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJl
dGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25k
aXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlv
bnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICog
ICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNj
bGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxz
IHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElT
IFBST1ZJREVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1Ig
SU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisg
KiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBB
IFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFM
TCBBUFBMRSBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNU
LCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VR
VUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NV
UkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRB
LCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNF
RCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNU
LCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1Ig
T1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMg
U09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1B
R0UuIAorICovCisKKyNpZm5kZWYgQWlyVG1wX2gKKyNkZWZpbmUgQWlyVG1wX2gKKworI2luY2x1
ZGUgIlJlZy5oIgorCituYW1lc3BhY2UgSlNDIHsgbmFtZXNwYWNlIEIzIHsgbmFtZXNwYWNlIEFp
ciB7CisKKy8vIEEgVG1wIGlzIGEgZ2VuZXJhbGl6YXRpb24gb2YgYSByZWdpc3Rlci4gSXQgY2Fu
IGJlIHVzZWQgdG8gcmVmZXIgdG8gYW55IEdQUiBvciBGUFIuIEl0IGNhbiBhbHNvCisvLyBiZSB1
c2VkIHRvIHJlZmVyIHRvIGFuIHVuYWxsb2NhdGVkIHJlZ2lzdGVyIChpLmUuIGEgdGVtcG9yYXJ5
KS4gTGlrZSBtYW55IEFpciBjbGFzc2VzLCB3ZSB1c2UKKy8vIGRlbGliZXJhdGVseSB0ZXJzZSBu
YW1pbmcgc2luY2Ugd2Ugd2lsbCBoYXZlIHRvIHVzZSB0aGlzIG5hbWUgYSBsb3QuCisKK2NsYXNz
IFRtcCB7CitwdWJsaWM6CisgICAgVG1wKCkKKyAgICAgICAgOiBtX3ZhbHVlKDApCisgICAgewor
ICAgIH0KKworICAgIGV4cGxpY2l0IFRtcChSZWcgcmVnKQorICAgIHsKKyAgICAgICAgaWYgKHJl
ZykgeworICAgICAgICAgICAgaWYgKHJlZy5pc0dQUigpKQorICAgICAgICAgICAgICAgIG1fdmFs
dWUgPSBlbmNvZGVHUFIocmVnLmdwcigpKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAg
ICAgICBtX3ZhbHVlID0gZW5jb2RlRlBSKHJlZy5mcHIoKSk7CisgICAgICAgIH0gZWxzZQorICAg
ICAgICAgICAgbV92YWx1ZSA9IDA7CisgICAgfQorCisgICAgc3RhdGljIFRtcCBncFRtcEZvcklu
ZGV4KHVuc2lnbmVkIGluZGV4KQorICAgIHsKKyAgICAgICAgVG1wIHJlc3VsdDsKKyAgICAgICAg
cmVzdWx0Lm1fdmFsdWUgPSBlbmNvZGVHUFRtcChpbmRleCk7CisgICAgICAgIHJldHVybiByZXN1
bHQ7CisgICAgfQorCisgICAgc3RhdGljIFRtcCBmcFRtcEZvckluZGV4KHVuc2lnbmVkIGluZGV4
KQorICAgIHsKKyAgICAgICAgVG1wIHJlc3VsdDsKKyAgICAgICAgcmVzdWx0Lm1fdmFsdWUgPSBl
bmNvZGVGUFRtcChpbmRleCk7CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorCisgICAg
c3RhdGljIFRtcCBmb3JSYXdWYWx1ZSh1bnNpZ25lZCBpbmRleCkKKyAgICB7CisgICAgICAgIFRt
cCByZXN1bHQ7CisgICAgICAgIHJlc3VsdC5tX3ZhbHVlID0gaW5kZXg7CisgICAgICAgIHJldHVy
biByZXN1bHQ7CisgICAgfQorCisgICAgZXhwbGljaXQgb3BlcmF0b3IgYm9vbCgpIGNvbnN0IHsg
cmV0dXJuICEhbV92YWx1ZTsgfQorCisgICAgYm9vbCByYXdWYWx1ZSgpIGNvbnN0IHsgcmV0dXJu
IG1fdmFsdWU7IH0KKworICAgIGJvb2wgaXNHUCgpIGNvbnN0CisgICAgeworICAgICAgICByZXR1
cm4gaXNFbmNvZGVkR1AobV92YWx1ZSk7CisgICAgfQorCisgICAgYm9vbCBpc0ZQKCkgY29uc3QK
KyAgICB7CisgICAgICAgIHJldHVybiBpc0VuY29kZWRGUChtX3ZhbHVlKTsKKyAgICB9CisKKyAg
ICBib29sIGlzR1BSKCkgY29uc3QKKyAgICB7CisgICAgICAgIHJldHVybiBpc0VuY29kZWRHUFIo
bV92YWx1ZSk7CisgICAgfQorCisgICAgYm9vbCBpc0ZQUigpIGNvbnN0CisgICAgeworICAgICAg
ICByZXR1cm4gaXNFbmNvZGVkRlBSKG1fdmFsdWUpOworICAgIH0KKworICAgIGJvb2wgaXNSZWco
KSBjb25zdAorICAgIHsKKyAgICAgICAgcmV0dXJuIGlzR1BSKCkgfHwgaXNGUFIoKTsKKyAgICB9
CisKKyAgICBHUFJSZWcgZ3ByKCkgY29uc3QKKyAgICB7CisgICAgICAgIHJldHVybiBkZWNvZGVH
UFIobV92YWx1ZSk7CisgICAgfQorCisgICAgRlBSUmVnIGZwcigpIGNvbnN0CisgICAgeworICAg
ICAgICByZXR1cm4gZGVjb2RlRlBSKG1fdmFsdWUpOworICAgIH0KKworICAgIFJlZyByZWcoKSBj
b25zdAorICAgIHsKKyAgICAgICAgaWYgKGlzR1AoKSkKKyAgICAgICAgICAgIHJldHVybiBncHIo
KTsKKyAgICAgICAgcmV0dXJuIGZwcigpOworICAgIH0KKworICAgIHVuc2lnbmVkIGdwVG1wSW5k
ZXgoKSBjb25zdAorICAgIHsKKyAgICAgICAgcmV0dXJuIGRlY29kZUdQVG1wKG1fdmFsdWUpOwor
ICAgIH0KKworICAgIHVuc2lnbmVkIGZwVG1wSW5kZXgoKSBjb25zdAorICAgIHsKKyAgICAgICAg
cmV0dXJuIGRlY29kZUZQVG1wKG1fdmFsdWUpOworICAgIH0KKworICAgIHVuc2lnbmVkIHRtcElu
ZGV4KCkgY29uc3QKKyAgICB7CisgICAgICAgIGlmIChpc0dQKCkpCisgICAgICAgICAgICByZXR1
cm4gZ3BUbXBJbmRleCgpOworICAgICAgICByZXR1cm4gZnBUbXBJbmRleCgpOworICAgIH0KKwor
ICAgIGJvb2wgb3BlcmF0b3I9PShjb25zdCBUbXAmIG90aGVyKSBjb25zdAorICAgIHsKKyAgICAg
ICAgcmV0dXJuIG1fdmFsdWUgPT0gb3RoZXIubV92YWx1ZTsKKyAgICB9CisKKyAgICBib29sIG9w
ZXJhdG9yIT0oY29uc3QgVG1wJiBvdGhlcikgY29uc3QKKyAgICB7CisgICAgICAgIHJldHVybiAh
KCp0aGlzID09IG90aGVyKTsKKyAgICB9CisKKyAgICB2b2lkIGR1bXAoUHJpbnRTdHJlYW0mIG91
dCkgY29uc3Q7CisgICAgCitwcml2YXRlOgorICAgIHN0YXRpYyBpbnQgZW5jb2RlR1AodW5zaWdu
ZWQgaW5kZXgpCisgICAgeworICAgICAgICByZXR1cm4gMSArIGluZGV4OworICAgIH0KKworICAg
IHN0YXRpYyBpbnQgZW5jb2RlRlAodW5zaWduZWQgaW5kZXgpCisgICAgeworICAgICAgICByZXR1
cm4gLTEgLSBpbmRleDsKKyAgICB9CisKKyAgICBzdGF0aWMgaW50IGVuY29kZUdQUihHUFJSZWcg
Z3ByKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGVuY29kZUdQKGdwciAtIE1hY3JvQXNzZW1ibGVy
OjpmaXJzdFJlZ2lzdGVyKCkpOworICAgIH0KKworICAgIHN0YXRpYyBpbnQgZW5jb2RlRlBSKEZQ
UlJlZyBmcHIpCisgICAgeworICAgICAgICByZXR1cm4gZW5jb2RlRlAoZnByIC0gTWFjcm9Bc3Nl
bWJsZXI6OmZpcnN0RlBSUmVnaXN0ZXIoKSk7CisgICAgfQorCisgICAgc3RhdGljIGludCBlbmNv
ZGVHUFRtcCh1bnNpZ25lZCBpbmRleCkKKyAgICB7CisgICAgICAgIHJldHVybiBlbmNvZGVHUFIo
TWFjcm9Bc3NlbWJsZXI6Omxhc3RSZWdpc3RlcigpKSArIDEgKyBpbmRleDsKKyAgICB9CisKKyAg
ICBzdGF0aWMgaW50IGVuY29kZUZQVG1wKHVuc2lnbmVkIGluZGV4KQorICAgIHsKKyAgICAgICAg
cmV0dXJuIGVuY29kZUZQUihNYWNyb0Fzc2VtYmxlcjo6bGFzdEZQUmVnaXN0ZXIoKSkgLSAxIC0g
aW5kZXg7CisgICAgfQorCisgICAgc3RhdGljIGJvb2wgaXNFbmNvZGVkR1AoaW50IHZhbHVlKQor
ICAgIHsKKyAgICAgICAgcmV0dXJuIHZhbHVlID4gMDsKKyAgICB9CisKKyAgICBzdGF0aWMgYm9v
bCBpc0VuY29kZWRGUChpbnQgdmFsdWUpCisgICAgeworICAgICAgICByZXR1cm4gdmFsdWUgPCAw
OworICAgIH0KKworICAgIHN0YXRpYyBib29sIGlzRW5jb2RlZEdQUihpbnQgdmFsdWUpCisgICAg
eworICAgICAgICByZXR1cm4gaXNFbmNvZGVkR1AodmFsdWUpICYmIHZhbHVlIDw9IGVuY29kZUdQ
UihNYWNyb0Fzc2VtYmxlcjo6bGFzdFJlZ2lzdGVyKCkpOworICAgIH0KKworICAgIHN0YXRpYyBi
b29sIGlzRW5jb2RlZEZQUihpbnQgdmFsdWUpCisgICAgeworICAgICAgICByZXR1cm4gaXNFbmNv
ZGVkRlAodmFsdWUpICYmIHZhbHVlID49IGVuY29kZWRGUFIoTWFjcm9Bc3NlbWJsZXI6Omxhc3RG
UFJlZ2lzdGVyKCkpOworICAgIH0KKworICAgIHN0YXRpYyBib29sIGlzRW5jb2RlZEdQVG1wKGlu
dCB2YWx1ZSkKKyAgICB7CisgICAgICAgIHJldHVybiBpc0VuY29kZWRHUCh2YWx1ZSkgJiYgIWlz
RW5jb2RlZEdQUih2YWx1ZSk7CisgICAgfQorCisgICAgc3RhdGljIGJvb2wgaXNFbmNvZGVkRlBU
bXAoaW50IHZhbHVlKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGlzRW5jb2RlZEZQKHZhbHVlKSAm
JiAhaXNFbmNvZGVkRlBSKHZhbHVlKTsKKyAgICB9CisKKyAgICBzdGF0aWMgR1BSUmVnIGRlY29k
ZUdQUihpbnQgdmFsdWUpCisgICAgeworICAgICAgICBBU1NFUlQoaXNFbmNvZGVkR1BSKHZhbHVl
KSk7CisgICAgICAgIHJldHVybiBzdGF0aWNfY2FzdDxHUFJSZWc+KAorICAgICAgICAgICAgKHZh
bHVlIC0gZW5jb2RlR1BSKE1hY3JvQXNzZW1ibGVyOjpmaXJzdFJlZ2lzdGVyKCkpKSArIE1hY3Jv
QXNzZW1ibGVyOjpmaXJzdFJlZ2lzdGVyKCkpOworICAgIH0KKworICAgIHN0YXRpYyBGUFJSZWcg
ZGVjb2RlRlBSKGludCB2YWx1ZSkKKyAgICB7CisgICAgICAgIEFTU0VSVChpc0VuY29kZWRGUFIo
dmFsdWUpKTsKKyAgICAgICAgcmV0dXJuIHN0YXRpY19jYXN0PEZQUlJlZz4oCisgICAgICAgICAg
ICAoZW5jb2RlRlBSKE1hY3JvQXNzZW1ibGVyOjpmaXJzdEZQUmVnaXN0ZXIoKSkgLSB2YWx1ZSkg
KworICAgICAgICAgICAgTWFjcm9Bc3NlbWJsZXI6OmZpcnN0RlBSZWdpc3RlcigpKTsKKyAgICB9
CisKKyAgICBzdGF0aWMgdW5zaWduZWQgZGVjb2RlR1BUbXAoaW50IHZhbHVlKQorICAgIHsKKyAg
ICAgICAgQVNTRVJUKGlzRW5jb2RlZEdQVG1wKHZhbHVlKSk7CisgICAgICAgIHJldHVybiB2YWx1
ZSAtIChlbmNvZGVHUFIoTWFjcm9Bc3NlbWJsZXI6Omxhc3RSZWdpc3RlcigpKSArIDEpOworICAg
IH0KKworICAgIHN0YXRpYyB1bnNpZ25lZCBkZWNvZGVGUFRtcChpbnQgdmFsdWUpCisgICAgewor
ICAgICAgICBBU1NFUlQoaXNFbmNvZGVkRlBUbXAodmFsdWUpKTsKKyAgICAgICAgcmV0dXJuIChl
bmNvZGVGUFIoTWFjcm9Bc3NlbWJsZXI6Omxhc3RGUFJlZ2lzdGVyKCkpIC0gMSkgLSB2YWx1ZTsK
KyAgICB9CisKKyAgICAvLyAwOiBlbXB0eSBUbXAKKyAgICAvLyBwb3NpdGl2ZTogR1BScyBhbmQg
dGhlbiBHUCB0ZW1wcy4KKyAgICAvLyBuZWdhdGl2ZTogRlBScyBhbmQgdGhlbiBGUCB0ZW1wcy4K
KyAgICBpbnQgbV92YWx1ZTsKK307CisKK30gfSB9IC8vIG5hbWVzcGFjZSBKU0M6OkIzOjpBaXIK
KworI2VuZGlmIC8vIEFpclRtcF9oCisKSW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9h
aXIvb3Bjb2RlX2dlbmVyYXRvci5yYgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENv
cmUvYjMvYWlyL29wY29kZV9nZW5lcmF0b3IucmIJKHJldmlzaW9uIDApCisrKyBTb3VyY2UvSmF2
YVNjcmlwdENvcmUvYjMvYWlyL29wY29kZV9nZW5lcmF0b3IucmIJKHdvcmtpbmcgY29weSkKQEAg
LTAsMCArMSw3NzYgQEAKKyMhL3Vzci9iaW4vZW52IHJ1YnkKKworIyBDb3B5cmlnaHQgKEMpIDIw
MTUgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorIworIyBSZWRpc3RyaWJ1dGlvbiBh
bmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyMgbW9k
aWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25k
aXRpb25zCisjIGFyZSBtZXQ6CisjIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBt
dXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisjICAgIG5vdGljZSwgdGhpcyBsaXN0IG9m
IGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyMgMi4gUmVkaXN0cmli
dXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQK
KyMgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBk
aXNjbGFpbWVyIGluIHRoZQorIyAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlh
bHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorIworIyBUSElTIFNPRlRXQVJFIElT
IFBST1ZJREVEIEJZIEFQUExFIElOQy4gQU5EIElUUyBDT05UUklCVVRPUlMgYGBBUyBJUycnCisj
IEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5P
VCBMSU1JVEVEIFRPLAorIyBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElU
WSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisjIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQu
IElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IgSVRTIENPTlRSSUJVVE9SUworIyBCRSBM
SUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVN
UExBUlksIE9SCisjIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJ
TUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCisjIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7
IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUworIyBJTlRFUlJVUFRJ
T04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhF
UiBJTgorIyBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5F
R0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorIyBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBV
U0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GCisjIFRIRSBQT1NTSUJJTElU
WSBPRiBTVUNIIERBTUFHRS4KKworcmVxdWlyZSAicGF0aG5hbWUiCisKK2NsYXNzIE9wY29kZQor
ICAgIGF0dHJfcmVhZGVyIDpuYW1lLCA6c3BlY2lhbCwgOm92ZXJsb2FkcworCisgICAgZGVmIGlu
aXRpYWxpemUobmFtZSwgc3BlY2lhbCkKKyAgICAgICAgQG5hbWUgPSBuYW1lCisgICAgICAgIEBz
cGVjaWFsID0gc3BlY2lhbAorICAgICAgICB1bmxlc3Mgc3BlY2lhbAorICAgICAgICAgICAgQG92
ZXJsb2FkcyA9IFtdCisgICAgICAgIGVuZAorICAgIGVuZAorCisgICAgZGVmIG1hc21OYW1lCisg
ICAgICAgIG5hbWVbMF0uZG93bmNhc2UgKyBuYW1lWzEuLi0xXQorICAgIGVuZAorZW5kCisKK2Ns
YXNzIEFyZworICAgIGF0dHJfcmVhZGVyIDpyb2xlLCA6dHlwZQorCisgICAgZGVmIGluaXRpYWxp
emUocm9sZSwgdHlwZSkKKyAgICAgICAgQHJvbGUgPSByb2xlCisgICAgICAgIEB0eXBlID0gdHlw
ZQorICAgIGVuZAorZW5kCisKK2NsYXNzIE92ZXJsb2FkCisgICAgYXR0cl9yZWFkZXIgOnNpZ25h
dHVyZSwgOmZvcm1zCisKKyAgICBkZWYgaW5pdGlhbGl6ZShzaWduYXR1cmUsIGZvcm1zKQorICAg
ICAgICBAc2lnbmF0dXJlID0gc2lnbmF0dXJlCisgICAgICAgIEBmb3JtcyA9IGZvcm1zCisgICAg
ZW5kCitlbmQKKworY2xhc3MgS2luZAorICAgIGF0dHJfcmVhZGVyIDpuYW1lCisgICAgYXR0cl9h
Y2Nlc3NvciA6c3BlY2lhbAorCisgICAgZGVmIGluaXRpYWxpemUobmFtZSkKKyAgICAgICAgQG5h
bWUgPSBuYW1lCisgICAgICAgIEBzcGVjaWFsID0gZmFsc2UKKyAgICBlbmQKKworICAgIGRlZiA9
PShvdGhlcikKKyAgICAgICAgaWYgb3RoZXIuaXNfYT8gU3RyaW5nCisgICAgICAgICAgICBAbmFt
ZSA9PSBvdGhlcgorICAgICAgICBlbHNlCisgICAgICAgICAgICBAbmFtZSA9PSBvdGhlci5uYW1l
IGFuZCBAc3BlY2lhbCA9PSBvdGhlci5zcGVjaWFsCisgICAgICAgIGVuZAorICAgIGVuZAorCisg
ICAgZGVmIEtpbmQuYXJnS2luZHMoa2luZCkKKyAgICAgICAgaWYga2luZCA9PSAiQWRkciIKKyAg
ICAgICAgICAgIFsiQWRkciIsICJTdGFja1Nsb3QiLCAiQ2FsbEFyZyJdCisgICAgICAgIGVsc2UK
KyAgICAgICAgICAgIFtraW5kXQorICAgICAgICBlbmQKKyAgICBlbmQKKworICAgIGRlZiBhcmdL
aW5kcworICAgICAgICBLaW5kLmFyZ0tpbmRzKGtpbmQpCisgICAgZW5kCitlbmQKKworY2xhc3Mg
Rm9ybQorICAgIGF0dHJfcmVhZGVyIDpraW5kcywgOmFsdE5hbWUKKworICAgIGRlZiBpbml0aWFs
aXplKGtpbmRzLCBhbHROYW1lKQorICAgICAgICBAa2luZHMgPSBraW5kcworICAgICAgICBAYWx0
TmFtZSA9IGFsdE5hbWUKKyAgICBlbmQKK2VuZAorCitjbGFzcyBPcmlnaW4KKyAgICBhdHRyX3Jl
YWRlciA6ZmlsZU5hbWUsIDpsaW5lTnVtYmVyCisgICAgCisgICAgZGVmIGluaXRpYWxpemUoZmls
ZU5hbWUsIGxpbmVOdW1iZXIpCisgICAgICAgIEBmaWxlTmFtZSA9IGZpbGVOYW1lCisgICAgICAg
IEBsaW5lTnVtYmVyID0gbGluZU51bWJlcgorICAgIGVuZAorICAgIAorICAgIGRlZiB0b19zCisg
ICAgICAgICIje2ZpbGVOYW1lfToje2xpbmVOdW1iZXJ9IgorICAgIGVuZAorZW5kCisKK2NsYXNz
IFRva2VuCisgICAgYXR0cl9yZWFkZXIgOm9yaWdpbiwgOnN0cmluZworICAgIAorICAgIGRlZiBp
bml0aWFsaXplKG9yaWdpbiwgc3RyaW5nKQorICAgICAgICBAb3JpZ2luID0gb3JpZ2luCisgICAg
ICAgIEBzdHJpbmcgPSBzdHJpbmcKKyAgICBlbmQKKyAgICAKKyAgICBkZWYgPT0ob3RoZXIpCisg
ICAgICAgIGlmIG90aGVyLmlzX2E/IFRva2VuCisgICAgICAgICAgICBAc3RyaW5nID09IG90aGVy
LnN0cmluZworICAgICAgICBlbHNlCisgICAgICAgICAgICBAc3RyaW5nID09IG90aGVyCisgICAg
ICAgIGVuZAorICAgIGVuZAorICAgIAorICAgIGRlZiA9fihvdGhlcikKKyAgICAgICAgQHN0cmlu
ZyA9fiBvdGhlcgorICAgIGVuZAorICAgIAorICAgIGRlZiB0b19zCisgICAgICAgICIje0BzdHJp
bmcuaW5zcGVjdH0gYXQgI3tvcmlnaW59IgorICAgIGVuZAorICAgIAorICAgIGRlZiBwYXJzZUVy
cm9yKCpjb21tZW50KQorICAgICAgICBpZiBjb21tZW50LmVtcHR5PworICAgICAgICAgICAgcmFp
c2UgIlBhcnNlIGVycm9yOiAje3RvX3N9IgorICAgICAgICBlbHNlCisgICAgICAgICAgICByYWlz
ZSAiUGFyc2UgZXJyb3I6ICN7dG9fc306ICN7Y29tbWVudFswXX0iCisgICAgICAgIGVuZAorICAg
IGVuZAorZW5kCisKK2RlZiBsZXgoc3RyLCBmaWxlTmFtZSkKKyAgICBmaWxlTmFtZSA9IFBhdGhu
YW1lLm5ldyhmaWxlTmFtZSkKKyAgICByZXN1bHQgPSBbXQorICAgIGxpbmVOdW1iZXIgPSAxCisg
ICAgd2hpbGUgbm90IHN0ci5lbXB0eT8KKyAgICAgICAgY2FzZSBzdHIKKyAgICAgICAgd2hlbiAv
XEFcIyhbXlxuXSopLworICAgICAgICAgICAgIyBjb21tZW50LCBpZ25vcmUKKyAgICAgICAgd2hl
biAvXEFcbi8KKyAgICAgICAgICAgICMgbmV3bGluZSwgaWdub3JlCisgICAgICAgICAgICBsaW5l
TnVtYmVyICs9IDEKKyAgICAgICAgd2hlbiAvXEEoW2EtekEtWjAtOV9dKykvCisgICAgICAgICAg
ICByZXN1bHQgPDwgVG9rZW4ubmV3KE9yaWdpbi5uZXcoZmlsZU5hbWUsIGxpbmVOdW1iZXIpLCAk
JikKKyAgICAgICAgd2hlbiAvXEEoWyBcdFxyXSspLworICAgICAgICAgICAgIyB3aGl0ZXNwYWNl
LCBpZ25vcmUKKyAgICAgICAgd2hlbiAvXEFbLDoqXS8KKyAgICAgICAgICAgIHJlc3VsdCA8PCBU
b2tlbi5uZXcoT3JpZ2luLm5ldyhmaWxlTmFtZSwgbGluZU51bWJlciksICQmKQorICAgICAgICBl
bHNlCisgICAgICAgICAgICByYWlzZSAiTGV4ZXIgZXJyb3IgYXQgI3tPcmlnaW4ubmV3KGZpbGVO
YW1lLCBsaW5lTnVtYmVyKS50b19zfSwgdW5leHBlY3RlZCBzZXF1ZW5jZSAje3N0clswLi4yMF0u
aW5zcGVjdH0iCisgICAgICAgIGVuZAorICAgICAgICBzdHIgPSAkfi5wb3N0X21hdGNoCisgICAg
ZW5kCisgICAgcmVzdWx0CitlbmQKKworZGVmIGlzVUQodG9rZW4pCisgICAgdG9rZW4gPX4gL1xB
KChVKXwoRCl8KFVEKSlcWi8KK2VuZAorCitkZWYgaXNHRih0b2tlbikKKyAgICB0b2tlbiA9fiAv
XEEoKEcpfChGKSlcWi8KK2VuZAorCitkZWYgaXNLaW5kKHRva2VuKQorICAgIHRva2VuID1+IC9c
QSgoVG1wKXwoSW1tKXwoSW1tUHRyKXwoQWRkcil8KEluZGV4KSlcWi8KK2VuZAorCitkZWYgaXNL
ZXl3b3JkKHRva2VuKQorICAgIGlzVUQodG9rZW4pIG9yIGlzR0YodG9rZW4pIG9yIGlzS2luZCh0
b2tlbikgb3IKKyAgICAgICAgdG9rZW4gPT0gInNwZWNpYWwiIG9yIHRva2VuID09ICJhcyIKK2Vu
ZAorCitkZWYgaXNJZGVudGlmaWVyKHRva2VuKQorICAgIHRva2VuID1+IC9cQShbYS16QS1aMC05
X10rKVxaLyBhbmQgbm90IGlzS2V5d29yZCh0b2tlbikKK2VuZAorCitjbGFzcyBQYXJzZXIKKyAg
ICBkZWYgaW5pdGlhbGl6ZShkYXRhLCBmaWxlTmFtZSkKKyAgICAgICAgQHRva2VucyA9IGxleChk
YXRhLCBmaWxlTmFtZSkKKyAgICAgICAgQGlkeCA9IDAKKyAgICBlbmQKKworICAgIGRlZiB0b2tl
bgorICAgICAgICBAdG9rZW5zW0BpZHhdCisgICAgZW5kCisKKyAgICBkZWYgYWR2YW5jZQorICAg
ICAgICBAaWR4ICs9IDEKKyAgICBlbmQKKworICAgIGRlZiBwYXJzZUVycm9yKCpjb21tZW50KQor
ICAgICAgICBpZiB0b2tlbgorICAgICAgICAgICAgdG9rZW4ucGFyc2VFcnJvcigqY29tbWVudCkK
KyAgICAgICAgZWxzZQorICAgICAgICAgICAgaWYgY29tbWVudC5lbXB0eT8KKyAgICAgICAgICAg
ICAgICByYWlzZSAiUGFyc2UgZXJyb3IgYXQgZW5kIG9mIGZpbGUiCisgICAgICAgICAgICBlbHNl
CisgICAgICAgICAgICAgICAgcmFpc2UgIlBhcnNlIGVycm9yIGF0IGVuZCBvZiBmaWxlOiAje2Nv
bW1lbnRbMF19IgorICAgICAgICAgICAgZW5kCisgICAgICAgIGVuZAorICAgIGVuZAorCisgICAg
ZGVmIGNvbnN1bWUoc3RyaW5nKQorICAgICAgICBwYXJzZUVycm9yKCJFeHBlY3RlZCAje3N0cmlu
Z30iKSB1bmxlc3MgdG9rZW4gPT0gc3RyaW5nCisgICAgICAgIGFkdmFuY2UKKyAgICBlbmQKKwor
ICAgIGRlZiBjb25zdW1lSWRlbnRpZmllcgorICAgICAgICByZXN1bHQgPSB0b2tlbi5zdHJpbmcK
KyAgICAgICAgcGFyc2VFcnJvcigiRXhwZWN0ZWQgaWRlbnRpZmllciIpIHVubGVzcyBpc0lkZW50
aWZpZXIocmVzdWx0KQorICAgICAgICBhZHZhbmNlCisgICAgICAgIHJlc3VsdAorICAgIGVuZAor
CisgICAgZGVmIGNvbnN1bWVSb2xlCisgICAgICAgIHJlc3VsdCA9IHRva2VuLnN0cmluZworICAg
ICAgICBwYXJzZUVycm9yKCJFeHBlY3RlZCByb2xlIChVLCBELCBvciBVRCkiKSB1bmxlc3MgaXNV
RChyZXN1bHQpCisgICAgICAgIGFkdmFuY2UKKyAgICAgICAgcmVzdWx0CisgICAgZW5kCisKKyAg
ICBkZWYgY29uc3VtZVR5cGUKKyAgICAgICAgcmVzdWx0ID0gdG9rZW4uc3RyaW5nCisgICAgICAg
IHBhcnNlRXJyb3IoIkV4cGVjdGVkIHR5cGUgKEcgb3IgRikiKSB1bmxlc3MgaXNHRihyZXN1bHQp
CisgICAgICAgIGFkdmFuY2UKKyAgICAgICAgcmVzdWx0CisgICAgZW5kCisKKyAgICBkZWYgY29u
c3VtZUtpbmQKKyAgICAgICAgcmVzdWx0ID0gdG9rZW4uc3RyaW5nCisgICAgICAgIHBhcnNlRXJy
b3IoIkV4cGVjdGVkIGtpbmQgKEltbSwgSW1tUHRyLCBUbXAsIEFkZHIsIG9yIEluZGV4KSIpIHVu
bGVzcyBpc0tpbmQocmVzdWx0KQorICAgICAgICBhZHZhbmNlCisgICAgICAgIHJlc3VsdAorICAg
IGVuZAorCisgICAgZGVmIHBhcnNlCisgICAgICAgIHJlc3VsdCA9IHt9CisgICAgICAgIAorICAg
ICAgICBsb29wIHsKKyAgICAgICAgICAgIGJyZWFrIGlmIEBpZHggPj0gQHRva2Vucy5sZW5ndGgK
KworICAgICAgICAgICAgaWYgdG9rZW4gPT0gInNwZWNpYWwiCisgICAgICAgICAgICAgICAgY29u
c3VtZSgic3BlY2lhbCIpCisgICAgICAgICAgICAgICAgb3Bjb2RlTmFtZSA9IGNvbnN1bWVJZGVu
dGlmaWVyCisKKyAgICAgICAgICAgICAgICBwYXJzZUVycm9yKCJDYW5ub3Qgb3ZlcmxvYWQgYSBz
cGVjaWFsIG9wY29kZSIpIGlmIHJlc3VsdFtvcGNvZGVOYW1lXQorCisgICAgICAgICAgICAgICAg
cmVzdWx0W29wY29kZU5hbWVdID0gT3Bjb2RlLm5ldyhvcGNvZGVOYW1lLCB0cnVlKQorICAgICAg
ICAgICAgZWxzZQorICAgICAgICAgICAgICAgIG9wY29kZU5hbWUgPSBjb25zdW1lSWRlbnRpZmll
cgorCisgICAgICAgICAgICAgICAgaWYgcmVzdWx0W29wY29kZU5hbWVdCisgICAgICAgICAgICAg
ICAgICAgIG9wY29kZSA9IHJlc3VsdFtvcGNvZGVOYW1lXQorICAgICAgICAgICAgICAgICAgICBw
YXJzZUVycm9yKCJDYW5ub3Qgb3ZlcmxvYWQgYSBzcGVjaWFsIG9wY29kZSIpIGlmIG9wY29kZS5z
cGVjaWFsCisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICBvcGNvZGUg
PSBPcGNvZGUubmV3KG9wY29kZU5hbWUsIGZhbHNlKQorICAgICAgICAgICAgICAgICAgICByZXN1
bHRbb3Bjb2RlTmFtZV0gPSBvcGNvZGUKKyAgICAgICAgICAgICAgICBlbmQKKworICAgICAgICAg
ICAgICAgIHNpZ25hdHVyZSA9IFtdCisgICAgICAgICAgICAgICAgZm9ybXMgPSBbXQorICAgICAg
ICAgICAgICAgIGlmIGlzVUQodG9rZW4pCisgICAgICAgICAgICAgICAgICAgIGxvb3AgeworICAg
ICAgICAgICAgICAgICAgICAgICAgcm9sZSA9IGNvbnN1bWVSb2xlCisgICAgICAgICAgICAgICAg
ICAgICAgICBjb25zdW1lKCI6IikKKyAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUgPSBjb25z
dW1lVHlwZQorICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAg
ICBzaWduYXR1cmUgPDwgQXJnLm5ldyhyb2xlLCB0eXBlKQorICAgICAgICAgICAgICAgICAgICAg
ICAgCisgICAgICAgICAgICAgICAgICAgICAgICBicmVhayB1bmxlc3MgdG9rZW4gPT0gIiwiCisg
ICAgICAgICAgICAgICAgICAgICAgICBjb25zdW1lKCIsIikKKyAgICAgICAgICAgICAgICAgICAg
fQorCisgICAgICAgICAgICAgICAgICAgIGxvb3AgeworICAgICAgICAgICAgICAgICAgICAgICAg
a2luZHMgPSBbXQorICAgICAgICAgICAgICAgICAgICAgICAgYWx0TmFtZSA9IG5pbAorICAgICAg
ICAgICAgICAgICAgICAgICAgbG9vcCB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAga2lu
ZHMgPDwgS2luZC5uZXcoY29uc3VtZUtpbmQpCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAg
ICBpZiB0b2tlbiA9PSAiKiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyc2VF
cnJvcigiQ2FuIG9ubHkgYXBwbHkgKiB0byBUbXAiKSB1bmxlc3Mga2luZHNbLTFdLm5hbWUgPT0g
IlRtcCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2luZHNbLTFdLnNwZWNpYWwg
PSB0cnVlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN1bWUoIioiKQorICAg
ICAgICAgICAgICAgICAgICAgICAgICAgIGVuZAorCisgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgYnJlYWsgdW5sZXNzIHRva2VuID09ICIsIgorICAgICAgICAgICAgICAgICAgICAgICAgICAg
IGNvbnN1bWUoIiwiKQorICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAg
ICAgICAgICAgICBpZiB0b2tlbiA9PSAiYXMiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAg
Y29uc3VtZSgiYXMiKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsdE5hbWUgPSBjb25z
dW1lSWRlbnRpZmllcgorICAgICAgICAgICAgICAgICAgICAgICAgZW5kCisKKyAgICAgICAgICAg
ICAgICAgICAgICAgIHBhcnNlRXJyb3IoIkZvcm0gaGFzIHdyb25nIG51bWJlciBvZiBhcmd1bWVu
dHMgZm9yIG92ZXJsb2FkIikgdW5sZXNzIGtpbmRzLmxlbmd0aCA9PSBzaWduYXR1cmUubGVuZ3Ro
CisgICAgICAgICAgICAgICAgICAgICAgICBraW5kcy5lYWNoX3dpdGhfaW5kZXggeworICAgICAg
ICAgICAgICAgICAgICAgICAgICAgIHwga2luZCwgaW5kZXggfAorICAgICAgICAgICAgICAgICAg
ICAgICAgICAgIGlmIGtpbmQubmFtZSA9PSAiSW1tIiBvciBraW5kLm5hbWUgPT0gIkltbVB0ciIK
KyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgc2lnbmF0dXJlW2luZGV4XS5yb2xl
ICE9ICJVIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyc2VFcnJvcigi
Rm9ybSBoYXMgYW4gaW1tZWRpYXRlIGZvciBhIG5vbi11c2UgYXJndW1lbnQiKQorICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICBlbmQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgaWYgc2lnbmF0dXJlW2luZGV4XS50eXBlICE9ICJHIgorICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgcGFyc2VFcnJvcigiRm9ybSBoYXMgYW4gaW1tZWRpYXRlIGZvciBhIG5v
bi1nZW5lcmFsLXB1cnBvc2UgYXJndW1lbnQiKQorICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICBlbmQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmQKKyAgICAgICAgICAgICAg
ICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1zIDw8IEZvcm0ubmV3KGtp
bmRzLCBhbHROYW1lKQorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsgdW5sZXNzIGlzS2lu
ZCh0b2tlbikKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAg
ICAgICAgICAgICAgICAgICAgc2lnbmF0dXJlID0gW10KKyAgICAgICAgICAgICAgICAgICAgZm9y
bXMgPSBbRm9ybS5uZXcoW10sIG5pbCldCisgICAgICAgICAgICAgICAgZW5kCisKKyAgICAgICAg
ICAgICAgICBvcGNvZGUub3ZlcmxvYWRzIDw8IE92ZXJsb2FkLm5ldyhzaWduYXR1cmUsIGZvcm1z
KQorICAgICAgICAgICAgZW5kCisgICAgICAgIH0KKworICAgICAgICByZXN1bHQKKyAgICBlbmQK
K2VuZAorCiskZmlsZU5hbWUgPSBBUkdWWzBdCisKK3BhcnNlciA9IFBhcnNlci5uZXcoSU86OnJl
YWQoJGZpbGVOYW1lKSwgJGZpbGVOYW1lKQorJG9wY29kZXMgPSBwYXJzZXIucGFyc2UKKworZGVm
IHdyaXRlSChmaWxlbmFtZSkKKyAgICBGaWxlLm9wZW4oIkFpciN7ZmlsZW5hbWV9LmgiLCAidyIp
IHsKKyAgICAgICAgfCBvdXRwIHwKKyAgICAgICAgCisgICAgICAgIG91dHAucHV0cyAiLy8gR2Vu
ZXJhdGVkIGJ5IG9wY29kZV9nZW5lcmF0b3IucmIgZnJvbSAjeyRmaWxlTmFtZX0gLS0gZG8gbm90
IGVkaXQhIgorICAgICAgICAKKyAgICAgICAgb3V0cC5wdXRzICIjaWZuZGVmIEFpciN7ZmlsZW5h
bWV9X2giCisgICAgICAgIG91dHAucHV0cyAiI2RlZmluZSBBaXIje2ZpbGVuYW1lfV9oIgorCisg
ICAgICAgIHlpZWxkIG91dHAKKyAgICAgICAgCisgICAgICAgIG91dHAucHV0cyAiI2VuZGlmIC8v
IEFpciN7ZmlsZW5hbWV9X2giCisgICAgfQorZW5kCisKK2RlZiB3cml0ZUNQUChmaWxlbmFtZSkK
KyAgICBGaWxlLm9wZW4oIkFpciN7ZmlsZW5hbWV9LmNwcCIsICJ3IikgeworICAgICAgICB8IG91
dHAgfAorICAgICAgICAKKyAgICAgICAgb3V0cC5wdXRzICIvLyBHZW5lcmF0ZWQgYnkgb3Bjb2Rl
X2dlbmVyYXRvci5yYiBmcm9tICN7JGZpbGVOYW1lfSAtLSBkbyBub3QgZWRpdCEiCisgICAgICAg
IAorICAgICAgICBvdXRwLnB1dHMgIiNpbmNsdWRlIFwiY29uZmlnLmhcIiIKKyAgICAgICAgb3V0
cC5wdXRzICIjaW5jbHVkZSBcIkFpciN7ZmlsZW5hbWV9LmhcIiIKKworICAgICAgICB5aWVsZCBv
dXRwCisgICAgfQorZW5kCisKK3dyaXRlSCgiT3Bjb2RlIikgeworICAgIHwgb3V0cCB8CisgICAg
b3V0cC5wdXRzICJuYW1lc3BhY2UgSlNDIHsgbmFtZXNwYWNlIEIzIHsgbmFtZXNwYWNlIEFpciB7
IgorICAgIG91dHAucHV0cyAiZW51bSBPcGNvZGUgOiBpbnQxNl90IHsiCisgICAgJG9wY29kZXMu
a2V5cy5zb3J0LmVhY2ggeworICAgICAgICB8IG9wY29kZSB8CisgICAgICAgIG91dHAucHV0cyAi
ICAgICN7b3Bjb2RlfSwiCisgICAgfQorICAgIG91dHAucHV0cyAifSIKKworICAgIG91dHAucHV0
cyAic3RhdGljIGNvbnN0IHVuc2lnbmVkIG51bU9wY29kZXMgPSAjeyRvcGNvZGVzLmtleXMuc2l6
ZX07IgorICAgIG91dHAucHV0cyAifSB9IH0gLy8gbmFtZXNwYWNlIEpTQzo6QjM6OkFpciIKKyAg
ICAKKyAgICBvdXRwLnB1dHMgIm5hbWVzcGFjZSBXVEYgeyIKKyAgICBvdXRwLnB1dHMgImNsYXNz
IFByaW50U3RyZWFtOyIKKyAgICBvdXRwLnB1dHMgInZvaWQgcHJpbnRJbnRlcm5hbChQcmludFN0
cmVhbSYsIEpTQzo6QjM6OkFpcjo6T3Bjb2RlKTsiCisgICAgb3V0cC5wdXRzICJ9IC8vIG5hbWVz
cGFjZSBXVEYiCit9CisKK3dyaXRlQ1BQKCJPcGNvZGUiKSB7CisgICAgfCBvdXRwIHwKKyAgICBv
dXRwLnB1dHMgIiNpbmNsdWRlIFwid3RmL1ByaW50U3RyZWFtLmhcIiIKKyAgICBvdXRwLnB1dHMg
Im5hbWVzcGFjZSBXVEYgeyIKKyAgICBvdXRwLnB1dHMgInVzaW5nIG5hbWVzcGFjZSBKU0M6OkIz
OjpBaXI7IgorICAgIG91dHAucHV0cyAidm9pZCBwcmludEludGVybmFsKFByaW50U3RyZWFtJiBv
dXQsIE9wY29kZSBvcGNvZGUpIgorICAgIG91dHAucHV0cyAieyIKKyAgICBvdXRwLnB1dHMgIiAg
ICBzd2l0Y2ggKG9wY29kZSkgeyIKKyAgICAkb3Bjb2Rlcy5rZXlzLmVhY2ggeworICAgICAgICB8
IG9wY29kZSB8CisgICAgICAgIG91dHAucHV0cyAiICAgIGNhc2UgI3tvcGNvZGV9OiIKKyAgICAg
ICAgb3V0cC5wdXRzICIgICAgICAgIG91dC5wcmludChcIiN7b3Bjb2RlfVwiKTsiCisgICAgICAg
IG91dHAucHV0cyAiICAgICAgICByZXR1cm47IgorICAgIH0KKyAgICBvdXRwLnB1dHMgIiAgICB9
IgorICAgIG91dHAucHV0cyAiICAgIFJFTEVBU0VfQVNTRVJUX05PVF9SRUFDSEVEKCk7IgorICAg
IG91dHAucHV0cyAifSIKKyAgICBvdXRwLnB1dHMgIn0gLy8gbmFtZXNwYWNlIFdURiIKK30KKwor
IyBGcm9tIGhlcmUgb24sIHdlIGRvbid0IHRyeSB0byBlbWl0IHByb3Blcmx5IGluZGVudGVkIGNv
ZGUsIHNpbmNlIHdlJ3JlIHVzaW5nIGEgcmVjdXJzaXZlIHBhdHRlcm4KKyMgbWF0Y2hlci4KKwor
ZGVmIG1hdGNoRm9ybXMob3V0cCwgc3BlZWQsIGZvcm1zLCBjb2x1bW5JbmRleCwgY29sdW1uR2V0
dGVyLCBmaWx0ZXIsIGNhbGxiYWNrKQorICAgIHJldHVybiBpZiBmb3Jtcy5sZW5ndGggPT0gMAor
CisgICAgaWYgZmlsdGVyW2Zvcm1zXQorICAgICAgICByZXR1cm4KKyAgICBlbmQKKworICAgIGlm
IGNvbHVtbkluZGV4ID49IGZvcm1zWzBdLmtpbmRzLmxlbmd0aAorICAgICAgICByYWlzZSB1bmxl
c3MgZm9ybXMubGVuZ3RoID09IDEKKyAgICAgICAgY2FsbGJhY2tbZm9ybXNbMF1dCisgICAgICAg
IHJldHVybgorICAgIGVuZAorICAgIAorICAgIGdyb3VwcyA9IHt9CisgICAgZm9ybXMuZWFjaCB7
CisgICAgICAgIHwgZm9ybSB8CisgICAgICAgIGtpbmQgPSBmb3JtLmtpbmRzW2NvbHVtbkluZGV4
XS5uYW1lCisgICAgICAgIGlmIGdyb3Vwc1traW5kXQorICAgICAgICAgICAgZ3JvdXBzW2tpbmRd
IDw8IGZvcm0KKyAgICAgICAgZWxzZQorICAgICAgICAgICAgZ3JvdXBzW2tpbmRdID0gW2Zvcm1d
CisgICAgICAgIGVuZAorICAgIH0KKworICAgIGlmIHNwZWVkID09IDpmYXN0IGFuZCBncm91cHMu
bGVuZ3RoID09IDEKKyAgICAgICAgbWF0Y2hGb3JtcyhvdXRwLCBzcGVlZCwgZm9ybXMsIGNvbHVt
bkluZGV4ICsgMSwgY29sdW1uR2V0dGVyLCBmaWx0ZXIsIGNhbGxiYWNrKQorICAgICAgICByZXR1
cm4KKyAgICBlbmQKKworICAgIG91dHAucHV0cyAic3dpdGNoICgje2NvbHVtbkdldHRlcltjb2x1
bW5JbmRleF19KSB7IgorICAgIGdyb3Vwcy5lYWNoX3BhaXIgeworICAgICAgICB8IGtleSwgdmFs
dWUgfAorICAgICAgICBLaW5kLmFyZ0tpbmRzKGtleSkuZWFjaCB7CisgICAgICAgICAgICB8IGFy
Z0tpbmQgfAorICAgICAgICAgICAgb3V0cC5wdXRzICJjYXNlIEFyZzo6I3thcmdLaW5kfToiCisg
ICAgICAgIH0KKyAgICAgICAgbWF0Y2hGb3JtcyhvdXRwLCBzcGVlZCwgdmFsdWUsIGNvbHVtbklu
ZGV4ICsgMSwgY29sdW1uR2V0dGVyLCBmaWx0ZXIsIGNhbGxiYWNrKQorICAgICAgICBvdXRwLnB1
dHMgImJyZWFrOyIKKyAgICB9CisgICAgb3V0cC5wdXRzICJkZWZhdWx0OiIKKyAgICBvdXRwLnB1
dHMgImJyZWFrOyIKKyAgICBvdXRwLnB1dHMgIn0iCitlbmQKKworZGVmIG1hdGNoSW5zdE92ZXJs
b2FkKG91dHAsIHNwZWVkLCBpbnN0KQorICAgIG91dHAucHV0cyAic3dpdGNoICgje2luc3R9LT5v
cGNvZGUpIHsiCisgICAgJG9wY29kZXMudmFsdWVzLmVhY2ggeworICAgICAgICB8IG9wY29kZSB8
CisgICAgICAgIG91dHAucHV0cyAiY2FzZSAje29wY29kZS5uYW1lfToiCisgICAgICAgIGlmIG9w
Y29kZS5zcGVjaWFsCisgICAgICAgICAgICB5aWVsZCBvcGNvZGUsIG5pbAorICAgICAgICBlbHNl
CisgICAgICAgICAgICBuZWVkT3ZlcmxvYWRTd2l0Y2ggPSAoKG9wY29kZS5vdmVybG9hZHMuc2l6
ZSAhPSAxKSBvciBzcGVlZCA9PSA6c2FmZSkKKyAgICAgICAgICAgIG91dHAucHV0cyAic3dpdGNo
ICgje2luc3R9LT5hcmdzLnNpemUoKSkgeyIgaWYgbmVlZE92ZXJsb2FkU3dpdGNoCisgICAgICAg
ICAgICBvcGNvZGUub3ZlcmxvYWRzLmVhY2ggeworICAgICAgICAgICAgICAgIHwgb3ZlcmxvYWQg
fAorICAgICAgICAgICAgICAgIG91dHAucHV0cyAiY2FzZSAje292ZXJsb2FkLnNpZ25hdHVyZS5s
ZW5ndGh9OiIgaWYgbmVlZE92ZXJsb2FkU3dpdGNoCisgICAgICAgICAgICAgICAgeWllbGQgb3Bj
b2RlLCBvdmVybG9hZAorICAgICAgICAgICAgICAgIG91dHAucHV0cyAiYnJlYWs7IiBpZiBuZWVk
T3ZlcmxvYWRTd2l0Y2gKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIG5lZWRPdmVybG9h
ZFN3aXRjaAorICAgICAgICAgICAgICAgIG91dHAucHV0cyAiZGVmYXVsdDoiCisgICAgICAgICAg
ICAgICAgb3V0cC5wdXRzICJicmVhazsiCisgICAgICAgICAgICAgICAgb3V0cC5wdXRzICJ9Igor
ICAgICAgICAgICAgZW5kCisgICAgICAgIGVuZAorICAgICAgICBvdXRwLnB1dHMgImJyZWFrOyIK
KyAgICB9CisgICAgb3V0cC5wdXRzICJkZWZhdWx0OiIKKyAgICBvdXRwLnB1dHMgImJyZWFrOyIK
KyAgICBvdXRwLnB1dHMgIn0iCitlbmQKKyAgICAKK2RlZiBtYXRjaEluc3RPdmVybG9hZEZvcm0o
b3V0cCwgc3BlZWQsIGluc3QpCisgICAgbWF0Y2hJbnN0T3ZlcmxvYWQob3V0cCwgc3BlZWQsIGlu
c3QpIHsKKyAgICAgICAgfCBvcGNvZGUsIG92ZXJsb2FkIHwKKyAgICAgICAgaWYgb3Bjb2RlLnNw
ZWNpYWwKKyAgICAgICAgICAgIHlpZWxkIG9wY29kZSwgbmlsLCBuaWwKKyAgICAgICAgZWxzZQor
ICAgICAgICAgICAgY29sdW1uR2V0dGVyID0gcHJvYyB7CisgICAgICAgICAgICAgICAgfCBjb2x1
bW5JbmRleCB8CisgICAgICAgICAgICAgICAgIiN7aW5zdH0tPmFyZ3NbI3tjb2x1bW5JbmRleH1d
LmtpbmQoKSIKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZpbHRlciA9IHByb2MgeyBmYWxz
ZSB9CisgICAgICAgICAgICBjYWxsYmFjayA9IHByb2MgeworICAgICAgICAgICAgICAgIHwgZm9y
bSB8CisgICAgICAgICAgICAgICAgeWllbGQgb3Bjb2RlLCBvdmVybG9hZCwgZm9ybQorICAgICAg
ICAgICAgfQorICAgICAgICAgICAgbWF0Y2hGb3JtcyhvdXRwLCBzcGVlZCwgb3ZlcmxvYWQuZm9y
bXMsIDAsIGNvbHVtbkdldHRlciwgZmlsdGVyLCBjYWxsYmFjaykKKyAgICAgICAgZW5kCisgICAg
fQorZW5kCisKK3dyaXRlSCgiT3Bjb2RlVXRpbHMiKSB7CisgICAgfCBvdXRwIHwKKyAgICBvdXRw
LnB1dHMgIiNpbmNsdWRlIFwiQWlySW5zdC5oXCIiCisgICAgb3V0cC5wdXRzICJuYW1lc3BhY2Ug
SlNDIHsgbmFtZXNwYWNlIEIzIHsgbmFtZXNwYWNlIEFpciB7IgorICAgIAorICAgIG91dHAucHV0
cyAidGVtcGxhdGU8dHlwZW5hbWUgRnVuY3Rvcj4iCisgICAgb3V0cC5wdXRzICJ2b2lkIEluc3Q6
OmZvckVhY2hBcmcoY29uc3QgRnVuY3RvciYgZnVuY3RvcikiCisgICAgb3V0cC5wdXRzICJ7Igor
ICAgIG1hdGNoSW5zdE92ZXJsb2FkKG91dHAsIDpmYXN0LCAidGhpcyIpIHsKKyAgICAgICAgfCBv
cGNvZGUsIG92ZXJsb2FkIHwKKyAgICAgICAgaWYgb3Bjb2RlLnNwZWNpYWwKKyAgICAgICAgICAg
IG91dHAucHV0cyAiZnVuY3RvcihhcmdzWzBdLCBBcmc6OlVzZSwgQXJnOjpHUCk7IC8vIFRoaXMg
aXMgYmFzaWNhbGx5IGJvZ3VzLCBidXQgaXQgd29ya3MgZiBhbmFseXNlcyBtb2RlbCBTcGVjaWFs
IGFzIGFuIGltbWVkaWF0ZS4iCisgICAgICAgICAgICBvdXRwLnB1dHMgImFyZ3NbMF0uc3BlY2lh
bCgpLT5mb3JFYWNoQXJnKCp0aGlzLCBzY29wZWRMYW1iZGE8RWFjaEFyZ0NhbGxiYWNrPihmdW5j
dG9yKSk7IgorICAgICAgICBlbHNlCisgICAgICAgICAgICBvdmVybG9hZC5zaWduYXR1cmUuZWFj
aF93aXRoX2luZGV4IHsKKyAgICAgICAgICAgICAgICB8IGFyZywgaW5kZXggfAorICAgICAgICAg
ICAgICAgIHJvbGUgPSBuaWwKKyAgICAgICAgICAgICAgICBjYXNlIGFyZy5yb2xlCisgICAgICAg
ICAgICAgICAgd2hlbiAiVSIKKyAgICAgICAgICAgICAgICAgICAgcm9sZSA9ICJVc2UiCisgICAg
ICAgICAgICAgICAgd2hlbiAiRCIKKyAgICAgICAgICAgICAgICAgICAgcm9sZSA9ICJEZWYiCisg
ICAgICAgICAgICAgICAgd2hlbiAiVUQiCisgICAgICAgICAgICAgICAgICAgIHJvbGUgPSAiVXNl
RGVmIgorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgcmFpc2UKKyAg
ICAgICAgICAgICAgICBlbmQKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBvdXRw
LnB1dHMgImZ1bmN0b3IoYXJnc1sje2luZGV4fV0sIEFyZzo6I3tyb2xlfSwgQXJnOjoje2FyZy50
eXBlfVApOyIKKyAgICAgICAgICAgIH0KKyAgICAgICAgZW5kCisgICAgfQorICAgIG91dHAucHV0
cyAifSIKKyAgICAKKyAgICBvdXRwLnB1dHMgIn0gfSB9IC8vIG5hbWVzcGFjZSBKU0M6OkIzOjpB
aXIiCit9CisKK3dyaXRlQ1BQKCJPcGNvZGVVdGlscyIpIHsKKyAgICB8IG91dHAgfAorICAgIG91
dHAucHV0cyAiI2luY2x1ZGUgXCJBaXJJbnN0SW5saW5lcy5oXCIiCisgICAgb3V0cC5wdXRzICJu
YW1lc3BhY2UgSlNDIHsgbmFtZXNwYWNlIEIzIHsgbmFtZXNwYWNlIEFpciB7IgorICAgIG91dHAu
cHV0cyAiaW5saW5lIGJvb2wgaGlkZGVuVHJ1dGgoKSB7IHJldHVybiB0cnVlOyB9IgorICAgIG91
dHAucHV0cyAiI2RlZmluZSBSRVRVUk4odmFsdWUpIGRvIHtcXCIKKyAgICBvdXRwLnB1dHMgIiAg
ICBpZiAoaGlkZGVuVHJ1dGgoKSlcXCIKKyAgICBvdXRwLnB1dHMgIiAgICAgICAgcmV0dXJuIHZh
bHVlO1xcIgorICAgIG91dHAucHV0cyAifSIKKyAgICBvdXRwLnB1dHMgImJvb2wgSW5zdDo6aXNW
YWxpZEZvcm0oKSIKKyAgICBvdXRwLnB1dHMgInsiCisgICAgbWF0Y2hJbnN0T3ZlcmxvYWRGb3Jt
KG91dHAsIDpzYWZlLCAidGhpcyIpIHsKKyAgICAgICAgfCBvcGNvZGUsIG92ZXJsb2FkLCBmb3Jt
IHwKKyAgICAgICAgaWYgb3Bjb2RlLnNwZWNpYWwKKyAgICAgICAgICAgIG91dHAucHV0cyAiaWYg
KGFyZ3Muc2l6ZSgpIDwgMSkiCisgICAgICAgICAgICBvdXRwLnB1dHMgInJldHVybiBmYWxzZTsi
CisgICAgICAgICAgICBvdXRwLnB1dHMgImlmICghYXJnc1swXS5pc1NwZWNpYWwoKSkiCisgICAg
ICAgICAgICBvdXRwLnB1dHMgInJldHVybiBmYWxzZTsiCisgICAgICAgICAgICBvdXRwLnB1dHMg
IlJFVFVSTihhcmdzWzBdLnNwZWNpYWwoKS0+aXNWYWxpZCgqdGhpcykpOyIKKyAgICAgICAgZWxz
ZQorICAgICAgICAgICAgbmVlZHNNb3JlVmFsaWRhdGlvbiA9IGZhbHNlCisgICAgICAgICAgICBv
dmVybG9hZC5zaWduYXR1cmUubGVuZ3RoLnRpbWVzIHsKKyAgICAgICAgICAgICAgICB8IGluZGV4
IHwKKyAgICAgICAgICAgICAgICByb2xlID0gb3ZlcmxvYWQuc2lnbmF0dXJlW2luZGV4XS5yb2xl
CisgICAgICAgICAgICAgICAgdHlwZSA9IG92ZXJsb2FkLnNpZ25hdHVyZVtpbmRleF0udHlwZQor
ICAgICAgICAgICAgICAgIGtpbmQgPSBmb3JtLmtpbmRzW2luZGV4XQorICAgICAgICAgICAgICAg
IG5lZWRzTW9yZVZhbGlkYXRpb24gfD0ga2luZC5zcGVjaWFsCisgICAgICAgICAgICAgICAgCisg
ICAgICAgICAgICAgICAgIyBXZSBhbHJlYWR5IGtub3cgdGhhdCB0aGUgZm9ybSBtYXRjaGVzLiBX
ZSBkb24ndCBoYXZlIHRvIHZhbGlkYXRlIHRoZSByb2xlLCBzaW5jZQorICAgICAgICAgICAgICAg
ICMga2luZCBpbXBsaWVzIHJvbGUuIFNvLCB0aGUgb25seSB0aGluZyBsZWZ0IHRvIHZhbGlkYXRl
IGlzIHRoZSB0eXBlLiBBbmQgd2Ugb25seSBoYXZlCisgICAgICAgICAgICAgICAgIyB0byB2YWxp
ZGF0ZSB0aGUgdHlwZSBpZiB3ZSBoYXZlIGEgVG1wLgorICAgICAgICAgICAgICAgIGlmIGtpbmQu
bmFtZSA9PSAiVG1wIgorICAgICAgICAgICAgICAgICAgICBvdXRwLnB1dHMgImlmICghYXJnc1sj
e2luZGV4fV0udG1wKCkuaXMje3R5cGV9UCgpKSIKKyAgICAgICAgICAgICAgICAgICAgb3V0cC5w
dXRzICJSRVRVUk4oZmFsc2UpOyIKKyAgICAgICAgICAgICAgICBlbmQKKyAgICAgICAgICAgIH0K
KyAgICAgICAgICAgIGlmIG5lZWRzTW9yZVZhbGlkYXRpb24KKyAgICAgICAgICAgICAgICBvdXRw
LnB1dHMgImlmICghaXMje29wY29kZS5uYW1lfVZhbGlkKHRoaXMpKSIKKyAgICAgICAgICAgICAg
ICBvdXRwLnB1dHMgIlJFVFVSTihmYWxzZSk7IgorICAgICAgICAgICAgZW5kCisgICAgICAgICAg
ICBvdXRwLnB1dHMgIlJFVFVSTih0cnVlKTsiCisgICAgICAgIGVuZAorICAgIH0KKyAgICBvdXRw
LnB1dHMgInJldHVybiBmYWxzZTsiCisgICAgb3V0cC5wdXRzICJ9IgorCisgICAgb3V0cC5wdXRz
ICJib29sIEluc3Q6OmFkbWl0c1N0YWNrKHVuc2lnbmVkIGFyZ0luZGV4KSIKKyAgICBvdXRwLnB1
dHMgInsiCisgICAgb3V0cC5wdXRzICJzd2l0Y2ggKG9wY29kZSkgeyIKKyAgICAkb3Bjb2Rlcy52
YWx1ZXMuZWFjaCB7CisgICAgICAgIHwgb3Bjb2RlIHwKKyAgICAgICAgb3V0cC5wdXRzICJjYXNl
ICN7b3Bjb2RlLm5hbWV9OiIKKworICAgICAgICBpZiBvcGNvZGUuc3BlY2lhbAorICAgICAgICAg
ICAgb3V0cC5wdXRzICJpZiAoIWFyZ0luZGV4KSIKKyAgICAgICAgICAgIG91dHAucHV0cyAicmV0
dXJuIGZhbHNlOyIKKyAgICAgICAgICAgIG91dHAucHV0cyAiUkVUVVJOKGFyZ3NbMF0uc3BlY2lh
bCgpLT5hZG1pdHNTdGFjaygqdGhpcywgYXJnSW5zdCkpOyIKKyAgICAgICAgZWxzZQorICAgICAg
ICAgICAgIyBTd2l0Y2ggb24gdGhlIGFyZ0luZGV4LgorICAgICAgICAgICAgb3V0cC5wdXRzICJz
d2l0Y2ggKGFyZ0luZGV4KSB7IgorCisgICAgICAgICAgICBudW1BcmdzID0gb3Bjb2RlLm92ZXJs
b2Fkcy5tYXAgeworICAgICAgICAgICAgICAgIHwgb3ZlcmxvYWQgfAorICAgICAgICAgICAgICAg
IG92ZXJsb2FkLnNpZ25hdHVyZS5sZW5ndGgKKyAgICAgICAgICAgIH0ubWF4CisgICAgICAgICAg
ICAKKyAgICAgICAgICAgIG51bUFyZ3MudGltZXMgeworICAgICAgICAgICAgICAgIHwgYXJnSW5k
ZXggfAorICAgICAgICAgICAgICAgIG91dHAucHV0cyAiY2FzZSAje2FyZ0luZGV4fToiCisKKyAg
ICAgICAgICAgICAgICAjIENoZWNrIGlmIGFsbCBvZiB0aGUgZm9ybXMgb2YgYWxsIG9mIHRoZSBv
dmVybG9hZHMgZWl0aGVyIGRvLCBvciBkb24ndCwgYWRtaXQgYW4gYWRkcmVzcworICAgICAgICAg
ICAgICAgICMgYXQgdGhpcyBpbmRleC4gV2UgZXhwZWN0IHRoaXMgdG8gYmUgYSB2ZXJ5IGNvbW1v
biBjYXNlLgorICAgICAgICAgICAgICAgIG51bVllcyA9IDAKKyAgICAgICAgICAgICAgICBudW1O
byA9IDAKKyAgICAgICAgICAgICAgICBvcGNvZGUub3ZlcmxvYWRzLmVhY2ggeworICAgICAgICAg
ICAgICAgICAgICB8IG92ZXJsb2FkIHwKKyAgICAgICAgICAgICAgICAgICAgb3ZlcmxvYWQuZm9y
bXMuZWFjaCB7CisgICAgICAgICAgICAgICAgICAgICAgICB8IGZvcm0gfAorICAgICAgICAgICAg
ICAgICAgICAgICAgaWYgZm9ybS5raW5kc1thcmdJbmRleF0gPT0gIkFkZHIiCisgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgbnVtWWVzICs9IDEKKyAgICAgICAgICAgICAgICAgICAgICAgIGVs
c2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBudW1ObyArPSAxCisgICAgICAgICAgICAg
ICAgICAgICAgICBlbmQKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0K
KworICAgICAgICAgICAgICAgICMgTm90ZSB0aGF0IHdlIGRlbGliZXJhdGVseSB0ZXN0IG51bVll
cyBmaXJzdCBiZWNhdXNlIGlmIHdlIGVuZCB1cCB3aXRoIG5vIGZvcm1zLCB3ZSB3YW50CisgICAg
ICAgICAgICAgICAgIyB0byBzYXkgdGhhdCBBZGRyZXNzIGlzIGluYWRtaXNzaWJsZS4KKyAgICAg
ICAgICAgICAgICBpZiBudW1ZZXMgPT0gMAorICAgICAgICAgICAgICAgICAgICBvdXRwLnB1dHMg
IlJFVFVSTihmYWxzZSk7IgorICAgICAgICAgICAgICAgIGVsc2lmIG51bU5vID09IDAKKyAgICAg
ICAgICAgICAgICAgICAgb3V0cC5wdXRzICJSRVRVUk4odHJ1ZSk7IgorICAgICAgICAgICAgICAg
IGVsc2UKKyAgICAgICAgICAgICAgICAgICAgIyBOb3cgZG8gdGhlIGZ1bGwgdGVzdC4KKworICAg
ICAgICAgICAgICAgICAgICBuZWVkT3ZlcmxvYWRTd2l0Y2ggPSAob3Bjb2RlLm92ZXJsb2Fkcy5z
aXplICE9IDEpCisKKyAgICAgICAgICAgICAgICAgICAgb3V0cC5wdXRzICJzd2l0Y2ggKGFyZ3Mu
c2l6ZSgpKSB7IiBpZiBuZWVkT3ZlcmxvYWRTd2l0Y2gKKyAgICAgICAgICAgICAgICAgICAgb3Bj
b2RlLm92ZXJsb2Fkcy5lYWNoIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHwgb3ZlcmxvYWQg
fAorCisgICAgICAgICAgICAgICAgICAgICAgICAjIEFnYWluLCBjaGVjayBpZiBhbGwgb2YgdGhl
bSBkbyB3aGF0IHdlIHdhbnQuCisgICAgICAgICAgICAgICAgICAgICAgICBudW1ZZXMgPSAwCisg
ICAgICAgICAgICAgICAgICAgICAgICBudW1ObyA9IDAKKyAgICAgICAgICAgICAgICAgICAgICAg
IG92ZXJsb2FkLmZvcm1zLmVhY2ggeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgZm9y
bSB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgZm9ybS5raW5kc1thcmdJbmRleF0g
PT0gIkFkZHIiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bVllcyArPSAxCisg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICBudW1ObyArPSAxCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5kCisgICAg
ICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIG51bVll
cyA9PSAwCisgICAgICAgICAgICAgICAgICAgICAgICAjIERvbid0IGVtaXQgYW55dGhpbmcsIGp1
c3QgZHJvcCB0byBkZWZhdWx0LgorICAgICAgICAgICAgICAgICAgICAgICAgZWxzaWYgbnVtTm8g
PT0gMAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHAucHV0cyAiY2FzZSAje292ZXJs
b2FkLnNpZ25hdHVyZS5sZW5ndGh9OiIgaWYgbmVlZE92ZXJsb2FkU3dpdGNoCisgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgb3V0cC5wdXRzICJSRVRVUk4odHJ1ZSk7IgorICAgICAgICAgICAg
ICAgICAgICAgICAgICAgIG91dHAucHV0cyAiYnJlYWs7IiBpZiBuZWVkT3ZlcmxvYWRTd2l0Y2gK
KyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAg
ICBvdXRwLnB1dHMgImNhc2UgI3tvdmVybG9hZC5zaWduYXR1cmUubGVuZ3RofToiIGlmIG5lZWRP
dmVybG9hZFN3aXRjaAorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBUaGlzIGlzIGhv
dyB3ZSB0ZXN0IHRoZSBoeXBvdGhlc2lzIHRoYXQgY2hhbmdpbmcgdGhpcyBhcmd1bWVudCB0byBh
bgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgYWRkcmVzcyB5aWVsZHMgYSB2YWxpZCBm
b3JtLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbHVtbkdldHRlciA9IHByb2Mgewor
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGNvbHVtbkluZGV4IHwKKyAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgaWYgY29sdW1uSW5kZXggPT0gYXJnSW5kZXgKKyAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJBcmc6OkFkZHIiCisgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICJhcmdzWyN7Y29sdW1uSW5kZXh9XS5raW5kKCkiCisgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgIGVuZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAg
ICAgICAgICAgICAgICAgICBmaWx0ZXIgPSBwcm9jIHsKKyAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgfCBmb3JtcyB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bVll
cyA9IDAKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3Jtcy5lYWNoIHsKKyAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgZm9ybSB8CisgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICBpZiBmb3JtLmtpbmRzW2FyZ0luZGV4XSA9PSAiQWRkciIK
KyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudW1ZZXMgKz0gMQorICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5kCisgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiBudW1Z
ZXMgPT0gMAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBEcm9wIGRvd24s
IGVtaXQgbm8gY29kZSwgc2luY2Ugd2UgY2Fubm90IG1hdGNoLgorICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgdHJ1ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBl
bHNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIEtlZXAgZ29pbmcuCisg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZQorICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICBlbmQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2sgPSBwcm9jIHsKKyAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgb3V0cC5wdXRzICJSRVRVUk4odHJ1ZSk7IgorICAgICAgICAgICAg
ICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXRjaEZvcm1z
KG91dHAsIDpzYWZlLCBvdmVybG9hZC5mb3JtcywgMCwgY29sdW1uR2V0dGVyLCBmaWx0ZXIsIGNh
bGxiYWNrKQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cC5wdXRzICJicmVhazsi
IGlmIG5lZWRPdmVybG9hZFN3aXRjaAorICAgICAgICAgICAgICAgICAgICAgICAgZW5kCisgICAg
ICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgbmVlZE92ZXJsb2FkU3dp
dGNoCisgICAgICAgICAgICAgICAgICAgICAgICBvdXRwLnB1dHMgImRlZmF1bHQ6IgorICAgICAg
ICAgICAgICAgICAgICAgICAgb3V0cC5wdXRzICJicmVhazsiCisgICAgICAgICAgICAgICAgICAg
ICAgICBvdXRwLnB1dHMgIn0iCisgICAgICAgICAgICAgICAgICAgIGVuZAorICAgICAgICAgICAg
ICAgIGVuZAorICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIG91dHAucHV0cyAiYnJl
YWs7IgorICAgICAgICAgICAgfQorICAgICAgICAgICAgCisgICAgICAgICAgICBvdXRwLnB1dHMg
ImRlZmF1bHQ6IgorICAgICAgICAgICAgb3V0cC5wdXRzICJicmVhazsiCisgICAgICAgICAgICBv
dXRwLnB1dHMgIn0iCisgICAgICAgIGVuZAorICAgICAgICAKKyAgICAgICAgb3V0cC5wdXRzICJi
cmVhazsiCisgICAgfQorICAgIG91dHAucHV0cyAiZGVmYXVsdDoiOworICAgIG91dHAucHV0cyAi
YnJlYWs7IgorICAgIG91dHAucHV0cyAifSIKKyAgICBvdXRwLnB1dHMgInJldHVybiBmYWxzZTsi
CisgICAgb3V0cC5wdXRzICJ9IgorCisgICAgb3V0cC5wdXRzICJDQ2FsbEhlbHBlcnM6Okp1bXAg
SW5zdDo6Z2VuZXJhdGUoQ0NhbGxIZWxwZXJzJiBqaXQsIEdlbmVyYXRpb25Db250ZXh0JiBjb250
ZXh0KSBjb25zdCIKKyAgICBvdXRwLnB1dHMgInsiCisgICAgb3V0cC5wdXRzICJVTlVTRURfUEFS
QU0oaml0KTsiCisgICAgb3V0cC5wdXRzICJVTlVTRURfUEFSQU0oY29udGV4dCk7IgorICAgIG91
dHAucHV0cyAiQ0NhbGxIZWxwZXJzOjpKdW1wIHJlc3VsdDsiCisgICAgbWF0Y2hJbnN0T3Zlcmxv
YWRGb3JtKG91dHAsIDpmYXN0LCAidGhpcyIpIHsKKyAgICAgICAgfCBvcGNvZGUsIG92ZXJsb2Fk
LCBmb3JtIHwKKyAgICAgICAgaWYgb3Bjb2RlLnNwZWNpYWwKKyAgICAgICAgICAgIG91dHAucHV0
cyAiUkVUVVJOKGFyZ3NbMF0uc3BlY2lhbCgpLT5nZW5lcmF0ZSgqdGhpcywgaml0LCBjb250ZXh0
KSk7IgorICAgICAgICBlbHNlCisgICAgICAgICAgICBpZiBmb3JtLmFsdE5hbWUKKyAgICAgICAg
ICAgICAgICBtZXRob2ROYW1lID0gZm9ybS5hbHROYW1lCisgICAgICAgICAgICBlbHNlCisgICAg
ICAgICAgICAgICAgbWV0aG9kTmFtZSA9IG9wY29kZS5tYXNtTmFtZQorICAgICAgICAgICAgZW5k
CisgICAgICAgICAgICBvdXRwLnByaW50ICJqaXQuI3ttZXRob2ROYW1lfSgiCisKKyAgICAgICAg
ICAgIGZvcm0ua2luZHMuZWFjaF93aXRoX2luZGV4IHsKKyAgICAgICAgICAgICAgICB8IGtpbmQs
IGluZGV4IHwKKyAgICAgICAgICAgICAgICBpZiBpbmRleCAhPSAwCisgICAgICAgICAgICAgICAg
ICAgIG91dHAucHJpbnQgIiwgIgorICAgICAgICAgICAgICAgIGVuZAorICAgICAgICAgICAgICAg
IGNhc2Uga2luZC5uYW1lCisgICAgICAgICAgICAgICAgd2hlbiAiVG1wIgorICAgICAgICAgICAg
ICAgICAgICBpZiBvdmVybG9hZC5zaWduYXR1cmVbaW5kZXhdLnR5cGUgPT0gIkciCisgICAgICAg
ICAgICAgICAgICAgICAgICBvdXRwLnByaW50ICJhcmdzWyN7aW5kZXh9XS5ncHIoKSIKKyAgICAg
ICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgb3V0cC5wcmludCAi
YXJnc1sje2luZGV4fV0uZnByKCkiCisgICAgICAgICAgICAgICAgICAgIGVuZAorICAgICAgICAg
ICAgICAgIHdoZW4gIkltbSIKKyAgICAgICAgICAgICAgICAgICAgb3V0cC5wcmludCAiYXJnc1sj
e2luZGV4fV0uYXNUcnVzdGVkSW1tMzIoKSIKKyAgICAgICAgICAgICAgICB3aGVuICJJbW1QdHIi
CisgICAgICAgICAgICAgICAgICAgIG91dHAucHJpbnQgImFyZ3NbI3tpbmRleH1dLmFzVHJ1c3Rl
ZEltbVB0cigpIgorICAgICAgICAgICAgICAgIHdoZW4gIkFkZHIiCisgICAgICAgICAgICAgICAg
ICAgIG91dHAucHJpbnQgImFyZ3NbI3tpbmRleH1dLmFzQWRkcmVzcygpIgorICAgICAgICAgICAg
ICAgIHdoZW4gIkluZGV4IgorICAgICAgICAgICAgICAgICAgICBvdXRwLnByaW50ICJhcmdzWyN7
aW5kZXh9XS5hc0Jhc2VJbmRleCgpIgorICAgICAgICAgICAgICAgIGVuZAorICAgICAgICAgICAg
fQorCisgICAgICAgICAgICBvdXRwLnB1dHMgIik7IgorICAgICAgICAgICAgb3V0cC5wdXRzICJS
RVRVUk4ocmVzdWx0KTsiCisgICAgICAgIGVuZAorICAgIH0KKyAgICBvdXRwLnB1dHMgIlJFTEVB
U0VfQVNTRVJUX05PVF9SRUFDSEVEKCk7IgorICAgIG91dHAucHV0cyAicmV0dXJuIHJlc3VsdDsi
CisgICAgb3V0cC5wdXRzICJ9IgorCisgICAgb3V0cC5wdXRzICJ9IH0gfSAvLyBuYW1lc3BhY2Ug
SlNDOjpCMzo6QWlyIgorfQorCkluZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUvaml0L1JlZy5o
Cj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9qaXQvUmVnLmgJKHJldmlzaW9u
IDE5MTIzOSkKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9qaXQvUmVnLmgJKHdvcmtpbmcgY29w
eSkKQEAgLTEwNSw3ICsxMDUsNiBAQCBwdWJsaWM6CiAgICAgdW5zaWduZWQgaW5kZXgoKSBjb25z
dCB7IHJldHVybiBtX2luZGV4OyB9CiAgICAgCiAgICAgYm9vbCBpc1NldCgpIGNvbnN0IHsgcmV0
dXJuIG1faW5kZXggIT0gaW52YWxpZCgpOyB9Ci0gICAgYm9vbCBvcGVyYXRvciEoKSBjb25zdCB7
IHJldHVybiAhaXNTZXQoKTsgfQogICAgIGV4cGxpY2l0IG9wZXJhdG9yIGJvb2woKSBjb25zdCB7
IHJldHVybiBpc1NldCgpOyB9CiAKICAgICBib29sIGlzSGFzaFRhYmxlRGVsZXRlZFZhbHVlKCkg
Y29uc3QgeyByZXR1cm4gbV9pbmRleCA9PSBkZWxldGVkKCk7IH0KQEAgLTE3MCw2ICsxNjksNDYg
QEAgcHVibGljOgogICAgIAogICAgIHZvaWQgZHVtcChQcmludFN0cmVhbSYpIGNvbnN0OwogCisg
ICAgY2xhc3MgQWxsUmVnc0l0ZXJhYmxlIHsKKyAgICBwdWJsaWM6CisKKyAgICAgICAgY2xhc3Mg
aXRlcmF0b3IgeworICAgICAgICBwdWJsaWM6CisgICAgICAgICAgICBpdGVyYXRvcigpIHsgfQor
CisgICAgICAgICAgICBleHBsaWNpdCBpdGVyYXRvcihSZWcgcmVnKQorICAgICAgICAgICAgICAg
IDogbV9yZWcocmVnKQorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorCisgICAgICAgICAg
ICBSZWcgb3BlcmF0b3IqKCkgY29uc3QgeyByZXR1cm4gbV9yZWc7IH0KKworICAgICAgICAgICAg
aXRlcmF0b3ImIG9wZXJhdG9yKysoKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1f
cmVnID0gbV9yZWcubmV4dCgpOworICAgICAgICAgICAgICAgIHJldHVybiAqdGhpczsKKyAgICAg
ICAgICAgIH0KKworICAgICAgICAgICAgYm9vbCBvcGVyYXRvcj09KGNvbnN0IGl0ZXJhdG9yJiBv
dGhlcikgY29uc3QKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbV9yZWcg
PT0gb3RoZXIubV9yZWc7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGJvb2wgb3BlcmF0
b3IhPShjb25zdCBpdGVyYXRvciYgb3RoZXIpIGNvbnN0CisgICAgICAgICAgICB7CisgICAgICAg
ICAgICAgICAgcmV0dXJuICEoKnRoaXMgPT0gb3RoZXIpOworICAgICAgICAgICAgfQorCisgICAg
ICAgIHByaXZhdGU6CisgICAgICAgICAgICBSZWcgbV9yZWc7CisgICAgICAgIH07CisKKyAgICAg
ICAgaXRlcmF0b3IgYmVnaW4oKSBjb25zdCB7IHJldHVybiBpdGVyYXRvcihSZWc6OmZpcnN0KCkp
OyB9CisgICAgICAgIGl0ZXJhdG9yIGVuZCgpIGNvbnN0IHsgcmV0dXJuIGl0ZXJhdG9yKFJlZygp
KTsgfQorICAgIH07CisKKyAgICBzdGF0aWMgQWxsUmVnc0l0ZXJhYmxlIGFsbCgpIGNvbnN0IHsg
cmV0dXJuIEFsbFJlZ3NJdGVyYWJsZSgpOyB9CisKIHByaXZhdGU6CiAgICAgc3RhdGljIHVpbnQ4
X3QgaW52YWxpZCgpIHsgcmV0dXJuIDB4ZmY7IH0KIApJbmRleDogU291cmNlL0phdmFTY3JpcHRD
b3JlL2ppdC9SZWdpc3RlclNldC5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29y
ZS9qaXQvUmVnaXN0ZXJTZXQuaAkocmV2aXNpb24gMTkxMjM5KQorKysgU291cmNlL0phdmFTY3Jp
cHRDb3JlL2ppdC9SZWdpc3RlclNldC5oCSh3b3JraW5nIGNvcHkpCkBAIC0xMTcsNiArMTE3LDEz
IEBAIHB1YmxpYzoKICAgICAKICAgICBib29sIG9wZXJhdG9yPT0oY29uc3QgUmVnaXN0ZXJTZXQm
IG90aGVyKSBjb25zdCB7IHJldHVybiBtX3ZlY3RvciA9PSBvdGhlci5tX3ZlY3RvcjsgfQogICAg
IHVuc2lnbmVkIGhhc2goKSBjb25zdCB7IHJldHVybiBtX3ZlY3Rvci5oYXNoKCk7IH0KKworICAg
IHRlbXBsYXRlPHR5cGVuYW1lIEZ1bmN0b3I+CisgICAgdm9pZCBmb3JFYWNoKGNvbnN0IEZ1bmN0
b3ImIGZ1bmN0b3IpCisgICAgeworICAgICAgICBmb3IgKHNpemVfdCBpbmRleCA6IG1fdmVjdG9y
LnNldEJpdHMoKSkKKyAgICAgICAgICAgIGZ1bmN0b3IoUmVnOjpmcm9tSW5kZXgoaW5kZXgpKTsK
KyAgICB9CiAgICAgCiBwcml2YXRlOgogICAgIHZvaWQgc2V0QW55KFJlZyByZWcpIHsgc2V0KHJl
Zyk7IH0KSW5kZXg6IFNvdXJjZS9XVEYvd3RmL0JpdFZlY3Rvci5oCj09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNv
dXJjZS9XVEYvd3RmL0JpdFZlY3Rvci5oCShyZXZpc2lvbiAxOTEyMzkpCisrKyBTb3VyY2UvV1RG
L3d0Zi9CaXRWZWN0b3IuaAkod29ya2luZyBjb3B5KQpAQCAtMzIwLDcgKzMyMCw3IEBAIHB1Ymxp
YzogCiAgICAgfTsKICAgICAKICAgICBTZXRCaXRzSXRlcmFibGUgc2V0Qml0cygpIGNvbnN0IHsg
cmV0dXJuIFNldEJpdHNJdGVyYWJsZSgqdGhpcyk7IH0KLSAgICAKKwogcHJpdmF0ZToKICAgICBz
dGF0aWMgdW5zaWduZWQgYml0c0luUG9pbnRlcigpCiAgICAgewpJbmRleDogU291cmNlL1dURi93
dGYvU2NvcGVkTGFtYmRhLmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL1dURi93dGYvU2NvcGVkTGFt
YmRhLmgJKHJldmlzaW9uIDApCisrKyBTb3VyY2UvV1RGL3d0Zi9TY29wZWRMYW1iZGEuaAkod29y
a2luZyBjb3B5KQpAQCAtMCwwICsxLDEwMiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNSBB
cHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5k
IHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2Rp
ZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRp
dGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUg
bXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qg
b2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0
cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmln
aHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dp
bmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1h
dGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZU
V0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBS
RVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8s
IFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVT
UyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZF
TlQgU0hBTEwgQVBQTEUgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5Z
IERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9S
IENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisg
KiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVT
RSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZF
UiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBD
T05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdF
TkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBP
RiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNV
Q0ggREFNQUdFLiAKKyAqLworCisjaWZuZGVmIFNjb3BlZExhbWJkYV9oCisjZGVmaW5lIFNjb3Bl
ZExhbWJkYV9oCisKK25hbWVzcGFjZSBXVEYgeworCisvLyBZb3UgY2FuIHVzZSBTY29wZWRMYW1i
ZGEgdG8gZWZmaWNpZW50bHkgcGFzcyBsYW1iZGFzIHdpdGhvdXQgYWxsb2NhdGluZyBtZW1vcnkg
b3IgcmVxdWlyaW5nCisvLyB0ZW1wbGF0ZSBzcGVjaWFsaXphdGlvbiBvZiB0aGUgY2FsbGVlLiBU
aGUgY2FsbGVlIHNob3VsZCBiZSBkZWNsYXJlZCBhczoKKy8vCisvLyB2b2lkIGZvbyhjb25zdCBT
Y29wZWRMYW1iZGE8TXlUaGluZ3MqIChpbnQsIFN0dWZmJik+Jik7CisvLworLy8gVGhlIGNhbGxl
ciBqdXN0IGRvZXM6CisvLworLy8gdm9pZCBmb28oc2NvcGVkTGFtYmRhPE15VGhpbmdzKiAoaW50
LCBTdHVmZiYpPihbJl0gKGludCB4LCBTdHVmZiYgeSkgLT4gTXlUaGluZ3MqIHsgYmxhaCB9KSk7
CisvLworLy8gTm90ZSB0aGF0IHRoaXMgcmVsaWVzIG9uIGZvbygpIG5vdCBlc2NhcGluZyB0aGUg
bGFtYmRhLiBUaGUgbGFtYmRhIGlzIG9ubHkgdmFsaWQgd2hpbGUgZm9vKCkgaXMKKy8vIG9uIHRo
ZSBzdGFjayAtIGhlbmNlIHRoZSBuYW1lIFNjb3BlZExhbWJkYS4KKwordGVtcGxhdGU8dHlwZW5h
bWUgRnVuY3Rpb25UeXBlPiBjbGFzcyBTY29wZWRMYW1iZGE7Cit0ZW1wbGF0ZTx0eXBlbmFtZSBS
ZXN1bHRUeXBlLCB0eXBlbmFtZS4uLiBBcmd1bWVudFR5cGVzPgorY2xhc3MgU2NvcGVkTGFtYmRh
PFJlc3VsdFR5cGUgKEFyZ3VtZW50VHlwZXMuLi4pPiB7CitwdWJsaWM6CisgICAgU2NvcGVkTGFt
YmRhKFJlc3VsdFR5cGUgKCppbXBsKSh2b2lkKiBhcmcsIEFyZ3VtZW50VHlwZXMmJi4uLikgPSBu
dWxscHRyLCB2b2lkKiBhcmcgPSBudWxscHRyKQorICAgICAgICA6IG1faW1wbChpbXBsKQorICAg
ICAgICAsIG1fYXJnKGFyZykKKyAgICB7CisgICAgfQorICAgIAorICAgIH5TY29wZWRMYW1iZGEo
KQorICAgIHsKKyAgICB9CisKKyAgICBSZXN1bHRUeXBlIG9wZXJhdG9yKCkoQXJndW1lbnRUeXBl
cyYmLi4uIGFyZ3VtZW50cykKKyAgICB7CisgICAgICAgIHJldHVybiBtX2ltcGwobV9hcmcsIHN0
ZDo6Zm9yd2FyZDxBcmd1bWVudFR5cGVzPihhcmd1bWVudHMpLi4uKTsKKyAgICB9CisKK3ByaXZh
dGU6CisgICAgUmVzdWx0VHlwZSAoKmltcGwpKHZvaWQqIGFyZywgQXJndW1lbnRUeXBlcyYmLi4u
KSBtX2ltcGw7CisgICAgdm9pZCAqbV9hcmc7Cit9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBGdW5j
dGlvblR5cGUsIHR5cGVuYW1lIEZ1bmN0b3I+IFNjb3BlZExhbWJkYUZ1bmN0b3I7Cit0ZW1wbGF0
ZTx0eXBlbmFtZSBSZXN1bHRUeXBlLCB0eXBlbmFtZS4uLiBBcmd1bWVudFR5cGVzLCB0eXBlbmFt
ZSBGdW5jdG9yPgorY2xhc3MgU2NvcGVkTGFtYmRhRnVuY3RvcjxSZXN1bHRUeXBlIChBcmd1bWVu
dFR5cGVzLi4uKSwgRnVuY3Rvcj4gOiBwdWJsaWMgU2NvcGVkTGFtYmRhPFJlc3VsdFR5cGUgKEFy
Z3VtZW50VHlwZXMuLi4pPiB7CitwdWJsaWM6CisgICAgU2NvcGVkTGFtYmRhRnVuY3Rvcihjb25z
dCBGdW5jdG9yJiBmdW5jdG9yKQorICAgICAgICA6IFNjb3BlZExhbWJkYShpbXBsRnVuY3Rpb24s
IHRoaXMpCisgICAgICAgICwgbV9mdW5jdG9yKGZ1bmN0b3IpCisgICAgeworICAgIH0KKworICAg
IFNjb3BlZExhbWJkYUZ1bmN0b3IoRnVuY3RvciYmIGZ1bmN0b3IpCisgICAgICAgIDogU2NvcGVk
TGFtYmRhKGltcGxGdW5jdGlvbiwgdGhpcykKKyAgICAgICAgLCBtX2Z1bmN0b3IoV1RGOjptb3Zl
KGZ1bmN0b3IpKQorICAgIHsKKyAgICB9CisKK3ByaXZhdGU6CisgICAgc3RhdGljIFJlc3VsdFR5
cGUgaW1wbEZ1bmN0aW9uKHZvaWQqIGFyZ3VtZW50LCBBcmd1bWVudFR5cGVzJiYuLi4gYXJndW1l
bnRzKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHN0YXRpY19jYXN0PFNjb3BlZExhbWJkYUZ1bmN0
b3IqPihhcmd1bWVudCktPm1fZnVuY3RvcigKKyAgICAgICAgICAgIHN0ZDo6Zm9yd2FyZDxBcmd1
bWVudFR5cGVzPihhcmd1bWVudHMpLi4uKTsKKyAgICB9CisKKyAgICBGdW5jdG9yIG1fZnVuY3Rv
cjsKK307CisKK3RlbXBsYXRlPHR5cGVuYW1lIEZ1bmN0aW9uVHlwZSwgdHlwZW5hbWUgRnVuY3Rv
cj4KK1Njb3BlZExhbWJkYUZ1bmN0b3I8RnVuY3Rpb25UeXBlLCBGdW5jdG9yPiBzY29wZWRMYW1i
ZGEoY29uc3QgRnVuY3RvciYgZnVuY3RvcikKK3sKKyAgICByZXR1cm4gU2NvcGVkTGFtYmRhRnVu
Y3RvcjxGdW5jdGlvblR5cGUsIEZ1bmN0b3I+KGZ1bmN0b3IpOworfQorCit9IC8vIG5hbWVzcGFj
ZSBXVEYKKworI2VuZGlmIC8vIFNjb3BlZExhbWJkYV9oCisKSW5kZXg6IFNvdXJjZS9XVEYvd3Rm
L1NoYXJlZFRhc2suaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV1RGL3d0Zi9TaGFyZWRUYXNrLmgJ
KHJldmlzaW9uIDE5MTIzOSkKKysrIFNvdXJjZS9XVEYvd3RmL1NoYXJlZFRhc2suaAkod29ya2lu
ZyBjb3B5KQpAQCAtNzksNiArNzksMTEgQEAgcHVibGljOgogICAgIHsKICAgICB9CiAKKyAgICBT
aGFyZWRUYXNrRnVuY3RvcihGdW5jdG9yJiYgZnVuY3RvcikKKyAgICAgICAgOiBtX2Z1bmN0b3Io
V1RGOjptb3ZlKGZ1bmN0b3IpKQorICAgIHsKKyAgICB9CisKIHByaXZhdGU6CiAgICAgUmVzdWx0
VHlwZSBydW4oQXJndW1lbnRUeXBlcyYmLi4uIGFyZ3VtZW50cykgb3ZlcnJpZGUKICAgICB7CkBA
IC0xMTAsNiArMTE1LDExIEBAIFJlZjxTaGFyZWRUYXNrPEZ1bmN0aW9uVHlwZT4+IGNyZWF0ZVNo
YXIKIHsKICAgICByZXR1cm4gYWRvcHRSZWYoKm5ldyBTaGFyZWRUYXNrRnVuY3RvcjxGdW5jdGlv
blR5cGUsIEZ1bmN0b3I+KGZ1bmN0b3IpKTsKIH0KK3RlbXBsYXRlPHR5cGVuYW1lIEZ1bmN0aW9u
VHlwZSwgdHlwZW5hbWUgRnVuY3Rvcj4KK1JlZjxTaGFyZWRUYXNrPEZ1bmN0aW9uVHlwZT4+IGNy
ZWF0ZVNoYXJlZFRhc2soRnVuY3RvciYmIGZ1bmN0b3IpCit7CisgICAgcmV0dXJuIGFkb3B0UmVm
KCpuZXcgU2hhcmVkVGFza0Z1bmN0b3I8RnVuY3Rpb25UeXBlLCBGdW5jdG9yPihXVEY6Om1vdmUo
ZnVuY3RvcikpKTsKK30KIAogfSAvLyBuYW1lc3BhY2UgV1RGCiAK
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>263661</attachid>
            <date>2015-10-20 22:58:46 -0700</date>
            <delta_ts>2015-10-21 14:29:38 -0700</delta_ts>
            <desc>some more</desc>
            <filename>blah.patch</filename>
            <type>text/plain</type>
            <size>276370</size>
            <attacher name="Filip Pizlo">fpizlo</attacher>
            
              <data encoding="base64">SW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM0FkZHJlc3NNYXRjaGVyLnBhdHRlcm5z
Cj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM0FkZHJlc3NNYXRjaGVy
LnBhdHRlcm5zCShyZXZpc2lvbiAwKQorKysgU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzQWRk
cmVzc01hdGNoZXIucGF0dGVybnMJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSw0MSBAQAorIyBD
b3B5cmlnaHQgKEMpIDIwMTUgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorIworIyBS
ZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9y
IHdpdGhvdXQKKyMgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhl
IGZvbGxvd2luZyBjb25kaXRpb25zCisjIGFyZSBtZXQ6CisjIDEuIFJlZGlzdHJpYnV0aW9ucyBv
ZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisjICAgIG5vdGlj
ZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4K
KyMgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBh
Ym92ZSBjb3B5cmlnaHQKKyMgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQg
dGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorIyAgICBkb2N1bWVudGF0aW9uIGFuZC9v
ciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorIworIyBU
SElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gQU5EIElUUyBDT05UUklCVVRP
UlMgYGBBUyBJUycnCisjIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElO
Q0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorIyBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9G
IE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisjIFBVUlBPU0Ug
QVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IgSVRTIENPTlRS
SUJVVE9SUworIyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFM
LCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCisjIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVE
SU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCisjIFNVQlNUSVRVVEUgR09P
RFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVT
UworIyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJ
QUJJTElUWSwgV0hFVEhFUiBJTgorIyBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9S
VCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorIyBBUklTSU5HIElOIEFOWSBX
QVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GCisj
IFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworbWF0Y2hlciBBZGRyZXNzTWF0Y2hl
cgorCisjIE5vdGUgdGhhdCB0aGlzIHJlbGllcyBvbiBCMyBkb2luZyBhZ2dyZXNzaXZlIHJlYXNz
b2NpYXRpb24gYW5kIGNhbm9uY2FsaXphdGlvbiBvZiBpbnRlZ2VyIGFkZHMuCisjIFdlJ2xsIG5l
dmVyIHNlZSBBZGQoQWRkKHgsIGNvbnN0MSksIGNvbnN0MikgYmVjYXVzZSBpdCB3b3VsZCBoYXZl
IGFscmVhZHkgYmVlbiByZWFzc29jaWF0ZWQgaW50bworIyBBZGQoeCwgY29uc3QxICsgY29uc3Qy
KS4gQWxzbywgd2Ugd2lsbCBuZXZlciBzZWUgQWRkKGNvbnN0LCB4KSwgYmVjYXVzZSB3ZSB3b3Vs
ZCBoYXZlIGNhbm9uaWNhbGl6ZWQKKyMgaXQgdG8gQWRkKHgsIGNvbnN0KS4gVGhhdCBzYWlkLCBp
biB0aGlzIGNvZGUgd2UgbmV2ZXIgbWFrZSBhc3NlcnRpb25zIGFib3V0IHRoZXNlIG9wdGltaXph
dGlvbnMKKyMgaGF2aW5nIGJlZW4gcGVyZm9ybWVkLiBBbHNvLCBzaW5jZSB0aGUgTG9hZC9TdG9y
ZSBpbnN0cnVjdGlvbnMgaW4gQjMgaGF2ZSBhIGJ1aWx0LWluIG9mZnNldCwgd2UKKyMgZG9uJ3Qg
bmVlZCB0byBtYXRjaCBBZGQoeCwgY29uc3QpLiBUaGF0IHdvdWxkIGhhdmUgYmVlbiBmb2xkZWQg
aW50byB0aGUgTG9hZC9TdG9yZSBpbnN0cnVjdGlvbnMKKyMgYWxyZWFkeS4gU28sIHRoZSBvbmx5
IGZhbmN5IG1hdGhpbmcgdGhpcyBjYW4gZG8gaXMganVzdCBCYXNlSW5kZXggZm9ybXMuCisKK0Fk
ZFNoaWZ0MSA9IEFkZChTaGwoaW5kZXgsICRsb2dTY2FsZSksIGJhc2UpCitBZGRTaGlmdDIgPSBB
ZGQoYmFzZSwgU2hsKGluZGV4LCAkbG9nU2NhbGUpKQorCitBZGQgPSBBZGQobGVmdCwgcmlnaHQp
CisKKyRDb25zdAorCitEaXJlY3QKSW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM0Fy
Z3VtZW50UmVnVmFsdWUuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9i
My9CM0FyZ3VtZW50UmVnVmFsdWUuY3BwCShyZXZpc2lvbiAwKQorKysgU291cmNlL0phdmFTY3Jp
cHRDb3JlL2IzL0IzQXJndW1lbnRSZWdWYWx1ZS5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTAsMCAr
MSw0MSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNSBBcHBsZSBJbmMuIEFsbCByaWdodHMg
cmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJp
bmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0
ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6Cisg
KiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3Zl
IGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhl
IGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBm
b3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhp
cyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUK
KyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRo
IHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBB
UFBMRSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFO
VElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJS
QU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisg
KiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBP
UgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElO
Q0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdF
UyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJT
VElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJ
VFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBU
SEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJ
TElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJ
U0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVO
IElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLiAKKyAqLworCisj
aW5jbHVkZSAiY29uZmlnLmgiCisjaW5jbHVkZSAiQjNBcmd1bWVudFJlZ1ZhbHVlLmgiCisKK25h
bWVzcGFjZSBKU0MgeyBuYW1lc3BhY2UgQjMgeworCitBcmd1bWVudFJlZ1ZhbHVlOjp+QXJndW1l
bnRSZWdWYWx1ZSgpCit7Cit9CisKK3ZvaWQgQXJndW1lbnRSZWdWYWx1ZTo6ZHVtcE1ldGEoUHJp
bnRTdHJlYW0mIG91dCkgY29uc3QKK3sKKyAgICBvdXQucHJpbnQobV9yZWcpOworfQorCit9IH0g
Ly8gbmFtZXNwYWNlIEpTQzo6QjMKKwpJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0Iz
QXJndW1lbnRSZWdWYWx1ZS5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9i
My9CM0FyZ3VtZW50UmVnVmFsdWUuaAkocmV2aXNpb24gMCkKKysrIFNvdXJjZS9KYXZhU2NyaXB0
Q29yZS9iMy9CM0FyZ3VtZW50UmVnVmFsdWUuaAkod29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDYw
IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE1IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNl
cnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5
IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBw
cm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEu
IFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29w
eXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9s
bG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0g
bXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxp
c3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICog
ICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhl
IGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExF
IElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVT
LCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJ
RVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBV
UlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SCisg
KiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURF
TlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJ
TkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRV
VEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsg
T1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9S
WQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZ
LCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5H
IElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYg
QURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisKKyNpZm5k
ZWYgQjNBcmd1bWVudFJlZ1ZhbHVlX2gKKyNkZWZpbmUgQjNBcmd1bWVudFJlZ1ZhbHVlX2gKKwor
I2luY2x1ZGUgIkIzVmFsdWUuaCIKKyNpbmNsdWRlICJSZWcuaCIKKworbmFtZXNwYWNlIEpTQyB7
IG5hbWVzcGFjZSBCMyB7CisKK2NsYXNzIEFyZ3VtZW50UmVnVmFsdWUgOiBwdWJsaWMgVmFsdWUg
eworcHVibGljOgorICAgIHN0YXRpYyBib29sIGFjY2VwdHMoT3Bjb2RlIG9wY29kZSkgeyByZXR1
cm4gb3Bjb2RlID09IEFyZ3VtZW50UmVnOyB9CisgICAgCisgICAgfkFyZ3VtZW50UmVnVmFsdWUo
KTsKKworICAgIFJlZyBhcmd1bWVudFJlZygpIGNvbnN0IHsgcmV0dXJuIG1fcmVnOyB9CisKK3By
b3RlY3RlZDoKKyAgICB2b2lkIGR1bXBNZXRhKFByaW50U3RyZWFtJikgY29uc3Qgb3ZlcnJpZGU7
CisKK3ByaXZhdGU6CisgICAgZnJpZW5kIGNsYXNzIFByb2NlZHVyZTsKKworICAgIEFyZ3VtZW50
UmVnVmFsdWUodW5zaWduZWQgaW5kZXgsIE9yaWdpbiBvcmlnaW4sIFJlZyByZWcpCisgICAgICAg
IDogVmFsdWUoaW5kZXgsIEFyZ3VtZW50UmVnLCByZWcuaXNHUFIoKSA/IHBvaW50ZXIoKSA6IERv
dWJsZSwgb3JpZ2luKQorICAgICAgICAsIG1fcmVnKHJlZykKKyAgICB7CisgICAgfQorCisgICAg
UmVnIG1fcmVnOworfTsKKworfSB9IC8vIG5hbWVzcGFjZSBKU0M6OkIzCisKKyNlbmRpZiAvLyBC
M0FyZ3VtZW50UmVnVmFsdWVfaAorCkluZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNC
YXNpY0Jsb2NrLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNC
YXNpY0Jsb2NrLmNwcAkocmV2aXNpb24gMCkKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9C
M0Jhc2ljQmxvY2suY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsNTggQEAKKy8qCisgKiBD
b3B5cmlnaHQgKEMpIDIwMTUgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAq
IFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGgg
b3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQg
dGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRp
b25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAg
IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xh
aW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVj
ZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRp
b25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0
aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9u
LgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFTIElT
JycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywg
QlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFO
VEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElT
Q0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IKKyAqIENPTlRSSUJVVE9S
UyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFM
LAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVU
IE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBT
RVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJ
TlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFC
SUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAq
IChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBP
VVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRI
RSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKworI2luY2x1ZGUgImNvbmZpZy5o
IgorI2luY2x1ZGUgIkIzQmFzaWNCbG9jay5oIgorCituYW1lc3BhY2UgSlNDIHsgbmFtZXNwYWNl
IEIzIHsKKworQmFzaWNCbG9jazo6QmFzaWNCbG9jayh1bnNpZ25lZCBpbmRleCkKKyAgICA6IG1f
aW5kZXgoaW5kZXgpCit7Cit9CisKK0Jhc2ljQmxvY2s6On5CYXNpY0Jsb2NrKCkKK3sKK30KKwor
dm9pZCBCYXNpY0Jsb2NrOjphcHBlbmQoVmFsdWUqIHZhbHVlKQoreworICAgIG1fdmFsdWVzLmFw
cGVuZCh2YWx1ZSk7Cit9CisKK3ZvaWQgQmFzaWNCbG9jazo6ZHVtcChQcmludFN0cmVhbSYgb3V0
KSBjb25zdAoreworICAgIG91dC5wcmludChkdW1wUHJlZml4LCBtX2luZGV4KTsKK30KKwordm9p
ZCBCYXNpY0Jsb2NrOjpkZWVwRHVtcChQcmludFN0cmVhbSYgb3V0KSBjb25zdAoreworICAgIG91
dC5wcmludCgiQkIiLCAqdGhpcywgIjpcbiIpOworICAgIGZvciAoVmFsdWUqIHZhbHVlIDogKnRo
aXMpCisgICAgICAgIG91dC5wcmludCgiICAgICIsIGRlZXBEdW1wKHZhbHVlKSwgIlxuIik7Cit9
CisKK30gfSAvLyBuYW1lc3BhY2UgSlNDOjpCMworCkluZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENv
cmUvYjMvQjNCYXNpY0Jsb2NrLmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRDb3Jl
L2IzL0IzQmFzaWNCbG9jay5oCShyZXZpc2lvbiAwKQorKysgU291cmNlL0phdmFTY3JpcHRDb3Jl
L2IzL0IzQmFzaWNCbG9jay5oCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsMTEyIEBACisvKgor
ICogQ29weXJpZ2h0IChDKSAyMDE1IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAq
CisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3
aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0
aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJp
YnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Cisg
KiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRp
c2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXBy
b2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29u
ZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1l
bnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1
dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gYGBB
UyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJ
TkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVS
Q0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJF
IERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SCisgKiBDT05UUklC
VVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BF
Q0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcs
IEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMg
T1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5F
U1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0Yg
TElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JU
CisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBX
QVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBP
RiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisKKyNpZm5kZWYgQjNCYXNp
Y0Jsb2NrCisjZGVmaW5lIEIzQmFzaWNCbG9jaworCituYW1lc3BhY2UgSlNDIHsgbmFtZXNwYWNl
IEIzIHsKKworY2xhc3MgUHJvY2VkdXJlOworY2xhc3MgVmFsdWU7CisKK2NsYXNzIEJhc2ljQmxv
Y2sgeworICAgIFdURl9NQUtFX05PTkNPUFlBQkxFKEJhc2ljQmxvY2spOworICAgIFdURl9NQUtF
X0ZBU1RfQUxMT0NBVEVEOworcHVibGljOgorICAgIHR5cGVkZWYgVmVjdG9yPFZhbHVlKj4gVmFs
dWVMaXN0OworICAgIHR5cGVkZWYgVmVjdG9yPEJhc2ljQmxvY2sqLCAyPiBTdWNjZXNzb3JMaXN0
OyAvLyBUaGlzIG1hdGNoZXMgQ29udHJvbFZhbHVlJ3MgdHlwZWRlZi4KKworICAgIHN0YXRpYyBj
b25zdCBjaGFyKiBkdW1wUHJlZml4ID0gIiMiOworCisgICAgfkJhc2ljQmxvY2soKTsKKworICAg
IHVuc2lnbmVkIGluZGV4KCkgY29uc3QgeyByZXR1cm4gbV9pbmRleDsgfQorCisgICAgVmFsdWVM
aXN0OjppdGVyYXRvciBiZWdpbigpIHsgcmV0dXJuIG1fdmFsdWVzLmJlZ2luKCk7IH0KKyAgICBW
YWx1ZUxpc3Q6Oml0ZXJhdG9yIGVuZCgpIHsgcmV0dXJuIG1fdmFsdWVzLmVuZCgpOyB9CisgICAg
VmFsdWVMaXN0Ojpjb25zdF9pdGVyYXRvciBiZWdpbigpIGNvbnN0IHsgcmV0dXJuIG1fdmFsdWVz
LmJlZ2luKCk7IH0KKyAgICBWYWx1ZUxpc3Q6OmNvbnN0X2l0ZXJhdG9yIGVuZCgpIGNvbnN0IHsg
cmV0dXJuIG1fdmFsdWVzLmVuZCgpOyB9CisKKyAgICBzaXplX3Qgc2l6ZSgpIGNvbnN0IHsgcmV0
dXJuIG1fdmFsdWVzLnNpemUoKTsgfQorICAgIFZhbHVlKiBhdChzaXplX3QgaW5kZXgpIGNvbnN0
IHsgcmV0dXJuIG1fdmFsdWVzW2luZGV4XTsgfQorICAgIFZhbHVlKiYgYXQoc2l6ZV90IGluZGV4
KSB7IHJldHVybiBtX3ZhbHVlc1tpbmRleF07IH0KKworICAgIFZhbHVlKiBsYXN0KCkgY29uc3Qg
eyByZXR1cm4gbV92YWx1ZXMubGFzdCgpOyB9CisgICAgVmFsdWUqJiBsYXN0KCkgeyByZXR1cm4g
bV92YWx1ZXMubGFzdCgpOyB9CisKKyAgICBjb25zdCBWYWx1ZUxpc3QmIHZhbHVlcygpIGNvbnN0
IHsgcmV0dXJuIG1fdmFsdWVzOyB9CisgICAgVmFsdWVMaXN0JiB2YWx1ZXMoKSB7IHJldHVybiBt
X3ZhbHVlczsgfQorCisgICAgdm9pZCBhcHBlbmQoVmFsdWUqKTsKKworICAgIHRlbXBsYXRlPHR5
cGVuYW1lIFZhbHVlVHlwZSwgdHlwZW5hbWUuLi4gQXJndW1lbnRzPgorICAgIFZhbHVlVHlwZSog
YXBwZW5kTmV3KFByb2NlZHVyZSYsIEFyZ3VtZW50cy4uLik7CisKKyAgICB1bnNpZ25lZCBudW1T
dWNjZXNzb3JzKCkgY29uc3Q7CisgICAgQmFzaWNCbG9jayogc3VjY2Vzc29yKHVuc2lnbmVkIGlu
ZGV4KSBjb25zdDsKKyAgICBCYXNpY0Jsb2NrKiYgc3VjY2Vzc29yKHVuc2lnbmVkIGluZGV4KTsK
KyAgICBjb25zdCBTdWNjZXNzb3JMaXN0JiBzdWNjZXNzb3JzKCkgY29uc3Q7CisKKyAgICB2b2lk
IGR1bXAoUHJpbnRTdHJlYW0mKSBjb25zdDsKKyAgICB2b2lkIGRlZXBEdW1wKFByaW50U3RyZWFt
JikgY29uc3Q7CisKK3ByaXZhdGU6CisgICAgZnJpZW5kIGNsYXNzIFByb2NlZHVyZTsKKyAgICAK
KyAgICAvLyBJbnN0YW50aWF0ZSB2aWEgUHJvY2VkdXJlLgorICAgIEJhc2ljQmxvY2sodW5zaWdu
ZWQgaW5kZXgpOworCisgICAgdW5zaWduZWQgbV9pbmRleDsKKyAgICBWYWx1ZUxpc3QgbV92YWx1
ZXM7Cit9OworCitjbGFzcyBEZWVwQmFzaWNCbG9ja0R1bXAgeworcHVibGljOgorICAgIERlZXBC
YXNpY0Jsb2NrRHVtcChCYXNpY0Jsb2NrKiBibG9jaykKKyAgICAgICAgOiBtX2Jsb2NrKGJsb2Nr
KQorICAgIHsKKyAgICB9CisKKyAgICB2b2lkIGR1bXAoUHJpbnRTdHJlYW0mIG91dCkgY29uc3QK
KyAgICB7CisgICAgICAgIGlmIChtX2Jsb2NrKQorICAgICAgICAgICAgbV9ibG9jay0+ZGVlcER1
bXAob3V0KTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgb3V0LnByaW50KCI8bnVsbD4iKTsK
KyAgICB9CisKK3ByaXZhdGU6CisgICAgQmFzaWNCbG9jayogbV9ibG9jazsKK307CisKK0RlZXBC
YXNpY0Jsb2NrRHVtcCBkZWVwRHVtcChCYXNpY0Jsb2NrKiBibG9jaykKK3sKKyAgICByZXR1cm4g
RGVlcEJhc2ljQmxvY2tEdW1wKGJsb2NrKTsKK30KKworfSB9IC8vIG5hbWVzcGFjZSBKU0M6OkIz
CisKKyNlbmRpZiAvLyBCM0Jhc2ljQmxvY2sKKwpJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3Jl
L2IzL0IzQmFzaWNCbG9ja0lubGluZXMuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlw
dENvcmUvYjMvQjNCYXNpY0Jsb2NrSW5saW5lcy5oCShyZXZpc2lvbiAwKQorKysgU291cmNlL0ph
dmFTY3JpcHRDb3JlL2IzL0IzQmFzaWNCbG9ja0lubGluZXMuaAkod29ya2luZyBjb3B5KQpAQCAt
MCwwICsxLDY2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE1IEFwcGxlIEluYy4gQWxsIHJp
Z2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBh
bmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBl
cm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1l
dDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUg
YWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFu
ZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmlu
YXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNl
LCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGlu
IHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVk
IHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVE
IEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBX
QVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVE
IFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VM
QVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJ
TkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVD
VCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBE
QU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9G
IFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICog
UFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04g
QU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1Qg
TElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNF
KSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUs
IEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICov
CisKKyNpZm5kZWYgQjNCYXNpY0Jsb2NrSW5saW5lc19oCisjZGVmaW5lIEIzQmFzaWNCbG9ja0lu
bGluZXNfaAorCisjaW5jbHVkZSAiQjNCYXNpY0Jsb2NrLmgiCisjaW5jbHVkZSAiQjNDb250cm9s
VmFsdWUuaCIKKyNpbmNsdWRlICJCM1Byb2NlZHVyZUlubGluZXMuaCIKKworbmFtZXNwYWNlIEpT
QyB7IG5hbWVzcGFjZSBCMyB7CisKK3RlbXBsYXRlPHR5cGVuYW1lIFZhbHVlVHlwZSB0eXBlbmFt
ZS4uLiBBcmd1bWVudHM+CitWYWx1ZVR5cGUqIEJhc2ljQmxvY2s6OmFwcGVuZE5ldyhQcm9jZWR1
cmUmIHByb2NlZHVyZSwgQXJndW1lbnRzLi4uIGFyZ3VtZW50cykKK3sKKyAgICBWYWx1ZVR5cGUq
IHJlc3VsdCA9IHByb2NlZHVyZS5hZGQ8VmFsdWVUeXBlPihhcmd1bWVudHMuLi4pOworICAgIGFw
cGVuZChyZXN1bHQpOworICAgIHJldHVybiByZXN1bHQ7Cit9CisKK3Vuc2lnbmVkIEJhc2ljQmxv
Y2s6Om51bVN1Y2Nlc3NvcnMoKSBjb25zdAoreworICAgIHJldHVybiBsYXN0KCktPmFzPENvbnRy
b2xWYWx1ZT4oKS0+bnVtU3VjY2Vzc29ycygpOworfQorCitCYXNpY0Jsb2NrKiBCYXNpY0Jsb2Nr
OjpzdWNjZXNzb3IodW5zaWduZWQgaW5kZXgpIGNvbnN0Cit7CisgICAgcmV0dXJuIGxhc3QoKS0+
YXM8Q29udHJvbFZhbHVlPigpLT5zdWNjZXNzb3IoaW5kZXgpOworfQorCitCYXNpY0Jsb2NrKiYg
QmFzaWNCbG9jazo6c3VjY2Vzc29yKHVuc2lnbmVkIGluZGV4KQoreworICAgIHJldHVybiBsYXN0
KCktPmFzPENvbnRyb2xWYWx1ZT4oKS0+c3VjY2Vzc29yKGluZGV4KTsKK30KKworY29uc3QgQmFz
aWNCbG9jazo6U3VjY2Vzc29yTGlzdCYgQmFzaWNCbG9jazo6c3VjY2Vzc29ycygpIGNvbnN0Cit7
CisgICAgcmV0dXJuIGxhc3QoKS0+YXM8Q29udHJvbFZhbHVlPigpLT5zdWNjZXNzb3JzKCk7Cit9
CisKK30gfSAvLyBuYW1lc3BhY2UgSlNDOjpCMworCisjZW5kaWYgLy8gQjNCYXNpY0Jsb2NrSW5s
aW5lc19oCisKSW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM0NoZWNrU3BlY2lhbC5j
cHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzQ2hlY2tTcGVjaWFs
LmNwcAkocmV2aXNpb24gMCkKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM0NoZWNrU3Bl
Y2lhbC5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSwxMzIgQEAKKy8qCisgKiBDb3B5cmln
aHQgKEMpIDIwMTUgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlz
dHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0
aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZv
bGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9m
IHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGlj
ZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4K
KyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUg
YWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFu
ZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFu
ZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoK
KyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFTIElTJycgQU5E
IEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5P
VCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJ
VFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1F
RC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBM
SUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICog
RVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBM
SU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNF
UzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJV
UFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFks
IFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNM
VURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0Yg
VEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NT
SUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKworI2luY2x1ZGUgImNvbmZpZy5oIgorI2lu
Y2x1ZGUgIkIzQ2hlY2tTcGVjaWFsLmgiCisKK25hbWVzcGFjZSBKU0MgeyBuYW1lc3BhY2UgQjMg
eworCit1c2luZyBuYW1lc3BhY2UgQWlyOworCituYW1lc3BhY2UgeworCit1bnNpZ25lZCBudW1C
M0FyZ3MoSW5zdCYgaW5zdCkKK3sKKyAgICBzd2l0Y2ggKGluc3Qub3JpZ2luLT5vcGNvZGUoKSkg
eworICAgIGNhc2UgQ2hlY2tBZGQ6CisgICAgY2FzZSBDaGVja1N1YjoKKyAgICBjYXNlIENoZWNr
TXVsOgorICAgICAgICByZXR1cm4gMjsKKyAgICBjYXNlIENoZWNrOgorICAgICAgICByZXR1cm4g
MTsKKyAgICBkZWZhdWx0OgorICAgICAgICBSRUxFQVNFX0FTU0VSVF9OT1RfUkVBQ0hFRCgpOwor
ICAgICAgICByZXR1cm4gMDsKKyAgICB9Cit9CisKK30gLy8gYW5vbnltb3VzIG5hbWVzcGFjZQor
CitDaGVja1NwZWNpYWw6OkNoZWNrU3BlY2lhbChBaXI6Ok9wY29kZSBvcGNvZGUsIHVuc2lnbmVk
IG51bUFyZ3MpCisgICAgOiBtX2NoZWNrT3Bjb2RlKG9wY29kZSkKKyAgICAsIG1fbnVtQ2hlY2tB
cmdzKG51bUFyZ3MpCit7Cit9CisKK0NoZWNrU3BlY2lhbDo6fkNoZWNrU3BlY2lhbCgpCit7Cit9
CisKK0luc3QgQ2hlY2tTcGVjaWFsOjpoaWRkZW5CcmFuY2goY29uc3QgSW5zdCYgaW5zdCkgY29u
c3QKK3sKKyAgICBJbnN0IGhpZGRlbkJyYW5jaChtX2NoZWNrT3Bjb2RlLCBpbnN0Lm9yaWdpbik7
CisgICAgaGlkZGVuQnJhbmNoLmFyZ3MucmVzaXplKG1fbnVtQ2hlY2tBcmdzKTsKKyAgICBmb3Ig
KHVuc2lnbmVkIGkgPSBtX251bUNoZWNrQXJnczsgaS0tOykKKyAgICAgICAgaGlkZGVuQnJhbmNo
LmFyZ3NbaV0gPSBpbnN0LmFyZ3NbaSArIDFdOworICAgIHJldHVybiBoaWRkZW5CcmFuY2g7Cit9
CisKK3ZvaWQgQ2hlY2tTcGVjaWFsOjpmb3JFYWNoQXJnKEluc3QmIGluc3QsIGNvbnN0IFNjb3Bl
ZExhbWJkYTxJbnN0OjpFYWNoQXJnQ2FsbGJhY2s+JiBjYWxsYmFjaykKK3sKKyAgICBoaWRkZW5C
cmFuY2goaW5zdCkuZm9yRWFjaEFyZyhjYWxsYmFjayk7CisgICAgZm9yRWFjaEFyZ0ltcGwobnVt
QjNBcmdzKGluc3QpLCBtX251bUNoZWNrQXJncyArIDEsIGluc3QsIGNhbGxiYWNrKTsKK30KKwor
Ym9vbCBDaGVja1NwZWNpYWw6OmlzVmFsaWQoSW5zdCYgaW5zdCkKK3sKKyAgICByZXR1cm4gaGlk
ZGVuQnJhbmNoKGluc3QpLmlzVmFsaWQoKQorICAgICAgICAmJiBpc1ZhbGlkSW1wbChudW1CM0Fy
Z3MoaW5zdCksIG1fbnVtQ2hlY2tBcmdzICsgMSwgaW5zdCk7Cit9CisKK2Jvb2wgQ2hlY2tTcGVj
aWFsOjphZG1pdHNTdGFjayhJbnN0JiBpbnN0LCB1bnNpZ25lZCBhcmdJbmRleCkKK3sKKyAgICBp
ZiAoYXJnSW5kZXggPj0gMSAmJiBhcmdJbmRleCA8IDEgKyBtX251bUNoZWNrQXJncykKKyAgICAg
ICAgcmV0dXJuIGhpZGRlbkJyYW5jaChpbnN0KS5hZG1pdHNTdGFjayhhcmdJbmRleCAtIDEpOwor
ICAgIHJldHVybiBhZG1pdHNTdGFja0ltcGwobnVtQjNBcmdzKGluc3QpLCBtX251bUNoZWNrQXJn
cyArIDEsIGluc3QsIGFyZ0luZGV4KTsKK30KKworQ0NhbGxIZWxwZXJzOjpKdW1wIENoZWNrU3Bl
Y2lhbDo6Z2VuZXJhdGUoSW5zdCYgaW5zdCwgQ0NhbGxIZWxwZXJzJiBqaXQsIEdlbmVyYXRpb25D
b250ZXh0JiBjb250ZXh0KQoreworICAgIENDYWxsSGVscGVyczo6SnVtcCBmYWlsID0gaGlkZGVu
QnJhbmNoKGluc3QpLmdlbmVyYXRlKGppdCwgY29udGV4dCk7CisgICAgQVNTRVJUKGZhaWwuaXNT
ZXQoKSk7CisKKyAgICBWYWx1ZSogdmFsdWUgPSBpbnN0Lm9yaWdpbjsKKworICAgIFZlY3RvcjxW
YWx1ZVJlcD4gcmVwczsKKyAgICBpZiAoaXNDaGVja01hdGgodmFsdWUtPm9wY29kZSgpKSkgewor
ICAgICAgICBpZiAodmFsdWUtPm9wY29kZSgpID09IENoZWNrTXVsKQorICAgICAgICAgICAgcmVw
cy5hcHBlbmQoVmFsdWVSZXAoKSk7CisgICAgICAgIGVsc2UgaWYgKHZhbHVlLT5vcGNvZGUoKSA9
PSBDaGVja1N1YiAmJiB2YWx1ZS0+YXJnc1swXS0+aXNJbnQoMCkpCisgICAgICAgICAgICByZXBz
LmFwcGVuZChWYWx1ZVJlcDo6Y29uc3RhbnQoMCkpOworICAgICAgICBlbHNlCisgICAgICAgICAg
ICByZXBzLmFwcGVuZChyZXBGb3JBcmcoY29udGV4dC5jb2RlLCBpbnN0LmFyZ3NbMl0pKTsKKyAg
ICAgICAgcmVwcy5hcHBlbmQocmVwRm9yQXJnKGNvbnRleHQuY29kZSwgaW5zdC5hcmdzWzFdKSk7
CisgICAgfSBlbHNlIHsKKyAgICAgICAgQVNTRVJUKHZhbHVlLT5vcGNvZGUoKSA9PSBDaGVjayk7
CisgICAgICAgIHJlcHMuYXBwZW5kKFZhbHVlUmVwOjpjb25zdGFudCgxKSk7CisgICAgfQorCisg
ICAgYXBwZW5kUmVwc0ltcGwoY29udGV4dCwgbV9udW1DaGVja0FyZ3MgKyAxLCBpbnN0LCByZXBz
KTsKKyAgICAKKyAgICBjb250ZXh0LmxhdGVQYXRocy5hcHBlbmQoCisgICAgICAgIGNyZWF0ZVNo
YXJlZFRhc2s8R2VuZXJhdGlvbkNvbnRleHQ6OkxhdGVQYXRoRnVuY3Rpb24+KAorICAgICAgICAg
ICAgWz1dIChDQ2FsbEhlbHBlcnMmIGppdCwgR2VuZXJhdGlvbkNvbnRleHQmIGNvbnRleHQpIHsK
KyAgICAgICAgICAgICAgICBmYWlsLmxpbmsoJmppdCk7CisgICAgICAgICAgICAgICAgCisgICAg
ICAgICAgICAgICAgU3RhY2ttYXAqIHN0YWNrbWFwID0gdmFsdWUtPnN0YWNrbWFwKCk7CisgICAg
ICAgICAgICAgICAgQVNTRVJUKHN0YWNrbWFwKTsKKworICAgICAgICAgICAgICAgIFN0YWNrbWFw
OjpHZW5lcmF0aW9uUGFyYW1zIHBhcmFtczsKKyAgICAgICAgICAgICAgICBwYXJhbXMudmFsdWUg
PSB2YWx1ZTsKKyAgICAgICAgICAgICAgICBwYXJhbXMuc3RhY2ttYXAgPSBzdGFja21hcDsKKyAg
ICAgICAgICAgICAgICBwYXJhbXMucmVwcyA9IHJlcHM7CisgICAgICAgICAgICAgICAgcGFyYW1z
LnVzZWRSZWdpc3RlcnMgPSBzdGFja21hcC0+bV91c2VkUmVnaXN0ZXJzOworCisgICAgICAgICAg
ICAgICAgc3RhY2ttYXAtPm1fZ2VuZXJhdG9yLT5ydW4oaml0LCBwYXJhbXMpOworICAgICAgICAg
ICAgfSkpOworfQorCit9IH0gLy8gbmFtZXNwYWNlIEpTQzo6QjMKKwpJbmRleDogU291cmNlL0ph
dmFTY3JpcHRDb3JlL2IzL0IzQ2hlY2tTcGVjaWFsLmgKPT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL0ph
dmFTY3JpcHRDb3JlL2IzL0IzQ2hlY2tTcGVjaWFsLmgJKHJldmlzaW9uIDApCisrKyBTb3VyY2Uv
SmF2YVNjcmlwdENvcmUvYjMvQjNDaGVja1NwZWNpYWwuaAkod29ya2luZyBjb3B5KQpAQCAtMCww
ICsxLDczIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE1IEFwcGxlIEluYy4gQWxsIHJpZ2h0
cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQg
YmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1p
dHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoK
KyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJv
dmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0
aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5
IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0
aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRo
ZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdp
dGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZ
IEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJS
QU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdB
UlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIK
KyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMu
IE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwg
SU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1B
R0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNV
QlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJP
RklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5Z
IFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElB
QklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBB
UklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVW
RU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisK
KyNpZm5kZWYgQjNDaGVja1NwZWNpYWxfaAorI2RlZmluZSBCM0NoZWNrU3BlY2lhbF9oCisKKyNp
bmNsdWRlICJBaXJPcGNvZGUuaCIKKyNpbmNsdWRlICJCM1N0YWNrbWFwU3BlY2lhbC5oIgorCitu
YW1lc3BhY2UgSlNDIHsgbmFtZXNwYWNlIEIzIHsKKworLy8gV2Ugd2FudCB0byBsb3dlciBDaGVj
ayBpbnN0cnVjdGlvbnMgdG8gYSBicmFuY2gsIGJ1dCB0aGVuIHdlIHdhbnQgdG8gcm91dGUgdGhh
dCBicmFuY2ggdG8gb3VyCisvLyBvdXQtb2YtbGluZSBjb2RlIGluc3RlYWQgb2YgZG9pbmcgYW55
dGhpbmcgZWxzZS4gRm9yIHRoaXMgcmVhc29uLCBhIENoZWNrU3BlY2lhbCB3aWxsIHJlbWVtYmVy
CisvLyB3aGljaCBicmFuY2ggb3Bjb2RlIHdlIGhhdmUgc2VsZWN0ZWQgYWxvbmcgd2l0aCB0aGUg
bnVtYmVyIG9mIGFyZ3MgaW4gdGhlIG92ZXJsb2FkIHdlIHdhbnQuIEl0CisvLyB3aWxsIGNyZWF0
ZSBhbiBJbnN0IHdpdGggdGhhdCBvcGNvZGUgcGx1cyB0aGUgYXBwcm9wcmlhdGUgYXJncyBmcm9t
IHRoZSBvd25pbmcgSW5zdCB3aGVuZXZlciB5b3UKKy8vIGNhbGwgYW55IG9mIHRoZSBjYWxsYmFj
a3MuCisvLworLy8gTm90ZSB0aGF0IGZvciBDaGVja0FkZCwgQ2hlY2tTdWIsIGFuZCBDaGVja011
bCB3ZSBleHBlY3QgdGhhdCB0aGUgQjMgYXJndW1lbnRzIGFyZSB0aGUgcmV2ZXJzZQorLy8gb2Yg
dGhlIEFpciBhcmd1bWVudHMgKEFkZChhLCBiKSA9PiBBZGQzMiBiLCBhKS4gRXhjZXB0OgorLy8g
LSBDaGVja1N1YigwLCB4KSwgd2hpY2ggdHVybnMgaW50byBCcmFuY2hOZWczMiB4LgorLy8gLSBD
aGVja011bChhLCBiKSwgd2hpY2ggdHVybnMgaW50byBNdWwzMiBiLCBhIGJ1dCB3ZSBwYXNzIEFu
eSBmb3IgYSdzIFZhbHVlUmVwLgorCitjbGFzcyBDaGVja1NwZWNpYWwgOiBwdWJsaWMgU3RhY2tt
YXBTcGVjaWFsIHsKK3B1YmxpYzoKKyAgICBDaGVja1NwZWNpYWwoQWlyOjpPcGNvZGUgb3Bjb2Rl
LCB1bnNpZ25lZCBudW1BcmdzKTsKKyAgICB+Q2hlY2tTcGVjaWFsKCk7CisKKyAgICAvLyBDb25z
dHJ1Y3RzIGFuZCByZXR1cm5zIHRoZSBJbnN0IHJlcHJlc2VudGluZyB0aGUgYnJhbmNoIHRoYXQg
dGhpcyB3aWxsIHVzZS4KKyAgICBJbnN0IGhpZGRlbkJyYW5jaChjb25zdCBJbnN0JikgY29uc3Q7
CisKK3Byb3RlY3RlZDoKKyAgICB2b2lkIGZvckVhY2hBcmcoQWlyOjpJbnN0JiwgY29uc3QgU2Nv
cGVkTGFtYmRhPEFpcjo6SW5zdDo6RWFjaEFyZ0NhbGxiYWNrPiYpIG92ZXJyaWRlOworICAgIGJv
b2wgaXNWYWxpZChBaXI6Okluc3QmKSBvdmVycmlkZTsKKyAgICBib29sIGFkbWl0c1N0YWNrKEFp
cjo6SW5zdCYsIHVuc2lnbmVkIGFyZ0luZGV4KSBvdmVycmlkZTsKKworICAgIC8vIE5PVEU6IHRo
ZSBnZW5lcmF0ZSBtZXRob2Qgd2lsbCBnZW5lcmF0ZSB0aGUgaGlkZGVuIGJyYW5jaCBhbmQgdGhl
biByZWdpc3RlciBhIExhdGVQYXRoIHRoYXQKKyAgICAvLyBnZW5lcmF0ZXMgdGhlIHN0YWNrbWFw
LiBTdXBlciBjcmF6eSBkdWRlIQorCisgICAgQ0NhbGxIZWxwZXJzOjpKdW1wIGdlbmVyYXRlKElu
c3QmLCBDQ2FsbEhlbGVwcnMmLCBHZW5lcmF0aW9uQ29udGV4dCYpIG92ZXJyaWRlOworCisgICAg
dm9pZCBkZWVwRHVtcEltcGwoUHJpbnRTdHJlYW0mKSBjb25zdCBvdmVycmlkZTsKKworcHJpdmF0
ZToKKyAgICBBaXI6Ok9wY29kZSBtX2NoZWNrT3Bjb2RlOworICAgIHVuc2lnbmVkIG1fbnVtQ2hl
Y2tBcmdzOworfTsKKworfSB9IC8vIG5hbWVzcGFjZSBKU0M6OkIzCisKKyNlbmRpZiAvLyBCM0No
ZWNrU3BlY2lhbF9oCisKSW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM0NoZWNrVmFs
dWUuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM0NoZWNrVmFs
dWUuY3BwCShyZXZpc2lvbiAwKQorKysgU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzQ2hlY2tW
YWx1ZS5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSw0MSBAQAorLyoKKyAqIENvcHlyaWdo
dCAoQykgMjAxNSBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0
cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRo
b3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9s
bG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Yg
c291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNl
LCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgor
ICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBh
Ym92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5k
IHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5k
L29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgor
ICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIGBgQVMgSVMnJyBBTkQg
QU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9U
IExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElU
WSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVE
LiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJ
QUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBF
WEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJ
TUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VT
OyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQ
VElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwg
V0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xV
RElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBU
SEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJ
QklMSVRZIE9GIFNVQ0ggREFNQUdFLiAKKyAqLworCisjaW5jbHVkZSAiY29uZmlnLmgiCisjaW5j
bHVkZSAiQjNDaGVja1ZhbHVlLmgiCisKK25hbWVzcGFjZSBKU0MgeyBuYW1lc3BhY2UgQjMgewor
CitDaGVja1ZhbHVlOjp+Q2hlY2tWYWx1ZSgpCit7Cit9CisKK3ZvaWQgQ2hlY2tWYWx1ZTo6ZHVt
cE1ldGEoUHJpbnRTdHJlYW0mIG91dCkgY29uc3QKK3sKKyAgICBvdXQucHJpbnQoInN0YWNrbWFw
ID0gIiwgc3RhY2ttYXApOworfQorCit9IH0gLy8gbmFtZXNwYWNlIEpTQzo6QjMKKwpJbmRleDog
U291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzQ2hlY2tWYWx1ZS5oCj09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNv
dXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM0NoZWNrVmFsdWUuaAkocmV2aXNpb24gMCkKKysrIFNv
dXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM0NoZWNrVmFsdWUuaAkod29ya2luZyBjb3B5KQpAQCAt
MCwwICsxLDgwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE1IEFwcGxlIEluYy4gQWxsIHJp
Z2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBh
bmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBl
cm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1l
dDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUg
YWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFu
ZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmlu
YXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNl
LCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGlu
IHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVk
IHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVE
IEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBX
QVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVE
IFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VM
QVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJ
TkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVD
VCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBE
QU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9G
IFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICog
UFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04g
QU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1Qg
TElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNF
KSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUs
IEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICov
CisKKyNpZm5kZWYgQjNDaGVja1ZhbHVlX2gKKyNkZWZpbmUgQjNDaGVja1ZhbHVlX2gKKworI2lu
Y2x1ZGUgIkIzVmFsdWUuaCIKKyNpbmNsdWRlICJCM1N0YWNrbWFwLmgiCisKK25hbWVzcGFjZSBK
U0MgeyBuYW1lc3BhY2UgQjMgeworCitjbGFzcyBDaGVja1ZhbHVlIDogcHVibGljIENoZWNrIHsK
K3B1YmxpYzoKKyAgICBzdGF0aWMgYm9vbCBhY2NlcHRzKE9wY29kZSBvcGNvZGUpCisgICAgewor
ICAgICAgICBzd2l0Y2ggKG9wY29kZSkgeworICAgICAgICBjYXNlIENoZWNrQWRkOgorICAgICAg
ICBjYXNlIENoZWNrU3ViOgorICAgICAgICBjYXNlIENoZWNrTXVsOgorICAgICAgICBjYXNlIENo
ZWNrOgorICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAg
ICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICB+Q2hlY2tWYWx1ZSgp
OworCisgICAgU3RhY2ttYXAgc3RhY2ttYXA7CisKK3Byb3RlY3RlZDoKKyAgICB2b2lkIGR1bXBN
ZXRhKFByaW50U3RyZWFtJikgY29uc3Qgb3ZlcnJpZGU7CisKK3ByaXZhdGU6CisgICAgZnJpZW5k
IGNsYXNzIFByb2NlZHVyZTsKKworICAgIC8vIFVzZSB0aGlzIGZvcm0gZm9yIENoZWNrQWRkLCBD
aGVja1N1YiwgYW5kIENoZWNrTXVsLgorICAgIENoZWNrVmFsdWUodW5zaWduZWQgaW5kZXgsIE9w
Y29kZSBvcGNvZGUsIE9yaWdpbiBvcmlnaW4sIFZhbHVlKiBsZWZ0LCBWYWx1ZSogcmlnaHQpCisg
ICAgICAgIDogVmFsdWUoaW5kZXgsIG9wY29kZSwgbGVmdC0+dHlwZSgpLCBvcmlnaW4sIGxlZnQs
IHJpZ2h0KQorICAgIHsKKyAgICAgICAgQVNTRVJUKGlzSW50KHR5cGUoKSkpOworICAgICAgICBB
U1NFUlQobGVmdC0+dHlwZSgpID09IHJpZ2h0LT50eXBlKCkpOworICAgICAgICBBU1NFUlQob3Bj
b2RlID09IENoZWNrQWRkIHx8IG9wY29kZSA9PSBDaGVja1N1YiB8fCBvcGNvZGUgPT0gQ2hlY2tN
dWwpOworICAgIH0KKworICAgIC8vIFVzZSB0aGlzIGZvcm0gZm9yIENoZWNrLgorICAgIENoZWNr
VmFsdWUodW5zaWduZWQgaW5kZXgsIE9wY29kZSBvcGNvZGUsIE9yaWdpbiBvcmlnaW4sIFZhbHVl
KiBwcmVkaWNhdGUpCisgICAgICAgIDogVmFsdWUoaW5kZXgsIG9wY29kZSwgVm9pZCwgb3JpZ2lu
LCBwcmVkaWNhdGUpCisgICAgeworICAgICAgICBBU1NFUlQob3BjZGUgPT0gQ2hlY2spOworICAg
IH0KK307CisKK30gfSAvLyBuYW1lc3BhY2UgSlNDOjpCMworCisjZW5kaWYgLy8gQjNDaGVja1Zh
bHVlX2gKKworCkluZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNDb21wYXJpc29uTWF0
Y2hlci5wYXR0ZXJucwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjND
b21wYXJpc29uTWF0Y2hlci5wYXR0ZXJucwkocmV2aXNpb24gMCkKKysrIFNvdXJjZS9KYXZhU2Ny
aXB0Q29yZS9iMy9CM0NvbXBhcmlzb25NYXRjaGVyLnBhdHRlcm5zCSh3b3JraW5nIGNvcHkpCkBA
IC0wLDAgKzEsMzggQEAKKyMgQ29weXJpZ2h0IChDKSAyMDE1IEFwcGxlIEluYy4gQWxsIHJpZ2h0
cyByZXNlcnZlZC4KKyMKKyMgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJp
bmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisjIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRl
ZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworIyBhcmUgbWV0OgorIyAx
LiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNv
cHlyaWdodAorIyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9s
bG93aW5nIGRpc2NsYWltZXIuCisjIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBt
dXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisjICAgIG5vdGljZSwgdGhpcyBsaXN0
IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyMgICAg
ZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRp
c3RyaWJ1dGlvbi4KKyMKKyMgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMu
IEFORCBJVFMgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJworIyBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1Q
TElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyMgVEhFIElN
UExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFS
VElDVUxBUgorIyBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBBUFBM
RSBJTkMuIE9SIElUUyBDT05UUklCVVRPUlMKKyMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJ
TkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgorIyBDT05TRVFVRU5U
SUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBP
RgorIyBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1Ig
UFJPRklUUzsgT1IgQlVTSU5FU1MKKyMgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQg
T04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KKyMgQ09OVFJBQ1QsIFNUUklD
VCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkK
KyMgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVW
RU4gSUYgQURWSVNFRCBPRgorIyBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKK21h
dGNoZXIgQ29tcGFyaXNvbk1hdGNoZXIKKworVGVzdExvYWROb3RaZXJvMSA9IEFuZChMb2FkKGFk
ZHJlc3MpLCByaWdodCkKK1Rlc3RMb2FkTm90WmVybzIgPSBBbmQobGVmdCwgTG9hZChhZGRyZXNz
KSkKK1Rlc3ROb3RaZXJvID0gQW5kKGxlZnQsIHJpZ2h0KQorCitUZXN0TG9hZFplcm8xID0gRXF1
YWwoQW5kKExvYWQoYWRkcmVzcyksIHJpZ2h0KSwgJDApCitUZXN0TG9hZFplcm8yID0gRXF1YWwo
QW5kKGxlZnQsIExvYWQoYWRkcmVzcykpLCAkMCkKK1Rlc3RaZXJvID0gRXF1YWwoQW5kKGxlZnQs
IHJpZ2h0KSwgJDApCisKK0xvYWRFcXVhbDEgPSBFcXVhbChMb2FkKGFkZHJlc3MpLCByaWdodCkK
K0xvYWRFcXVhbDIgPSBFcXVhbChsZWZ0LCBMb2FkKGFkZHJlc3MpKQorTm90ID0gRXF1YWwodmFs
dWUsICQwKQorRXF1YWwgPSBFcXVhbChsZWZ0LCByaWdodCkKKwpJbmRleDogU291cmNlL0phdmFT
Y3JpcHRDb3JlL2IzL0IzQ29uc3QzMlZhbHVlLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2
YVNjcmlwdENvcmUvYjMvQjNDb25zdDMyVmFsdWUuY3BwCShyZXZpc2lvbiAwKQorKysgU291cmNl
L0phdmFTY3JpcHRDb3JlL2IzL0IzQ29uc3QzMlZhbHVlLmNwcAkod29ya2luZyBjb3B5KQpAQCAt
MCwwICsxLDQxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE1IEFwcGxlIEluYy4gQWxsIHJp
Z2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBh
bmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBl
cm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1l
dDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUg
YWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFu
ZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmlu
YXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNl
LCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGlu
IHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVk
IHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVE
IEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBX
QVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVE
IFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VM
QVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJ
TkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVD
VCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBE
QU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9G
IFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICog
UFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04g
QU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1Qg
TElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNF
KSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUs
IEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICov
CisKKyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJCM0NvbnN0MzJWYWx1ZS5oIgorCitu
YW1lc3BhY2UgSlNDIHsgbmFtZXNwYWNlIEIzIHsKKworQ29uc3QzMlZhbHVlOjp+Q29uc3QzMlZh
bHVlKCkKK3sKK30KKwordm9pZCBDb25zdDMyVmFsdWU6OmR1bXBNZXRhKFByaW50U3RyZWFtJiBv
dXQpIGNvbnN0Cit7CisgICAgb3V0LnByaW50KG1fdmFsdWUpOworfQorCit9IH0gLy8gbmFtZXNw
YWNlIEpTQzo6QjMKKwpJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzQ29uc3QzMlZh
bHVlLmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzQ29uc3QzMlZh
bHVlLmgJKHJldmlzaW9uIDApCisrKyBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNDb25zdDMy
VmFsdWUuaAkod29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDU5IEBACisvKgorICogQ29weXJpZ2h0
IChDKSAyMDE1IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3Ry
aWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhv
dXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xs
b3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBz
b3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2Us
IHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisg
KiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFi
b3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQg
dGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQv
b3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisg
KiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBB
TlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1Qg
TElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZ
IEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQu
ICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElB
QkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVY
RU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElN
SVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7
IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBU
SU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBX
SEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVE
SU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRI
RSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lC
SUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisKKyNpZm5kZWYgQjNDb25zdDMyVmFsdWVfaAor
I2RlZmluZSBCM0NvbnN0MzJWYWx1ZV9oCisKKyNpbmNsdWRlICJCM1ZhbHVlLmgiCisKK25hbWVz
cGFjZSBKU0MgeyBuYW1lc3BhY2UgQjMgeworCitjbGFzcyBDb25zdDMyVmFsdWUgOiBwdWJsaWMg
VmFsdWUgeworcHVibGljOgorICAgIHN0YXRpYyBib29sIGFjY2VwdHMoT3Bjb2RlIG9wY29kZSkg
eyByZXR1cm4gb3Bjb2RlID09IENvbnN0MzI7IH0KKyAgICAKKyAgICB+Q29uc3QzMlZhbHVlKCk7
CisgICAgCisgICAgaW50MzJfdCB2YWx1ZSgpIGNvbnN0IHsgcmV0dXJuIG1fdmFsdWU7IH0KKwor
cHJvdGVjdGVkOgorICAgIHZvaWQgZHVtcE1ldGEoUHJpbnRTdHJlYW0mKSBjb25zdCBvdmVycmlk
ZTsKKworcHJpdmF0ZToKKyAgICBmcmllbmQgY2xhc3MgUHJvY2VkdXJlOworCisgICAgQ29uc3Qz
MlZhbHVlKHVuc2lnbmVkIGluZGV4LCBPcmlnaW4gb3JpZ2luLCBpbnQzMl90IHZhbHVlKQorICAg
ICAgICA6IFZhbHVlKGluZGV4LCBDb25zdDMyLCBJbnQzMiwgb3JpZ2luKQorICAgICAgICAsIG1f
dmFsdWUodmFsdWUpCisgICAgeworICAgIH0KKyAgICAKKyAgICBpbnQzMl90IG1fdmFsdWU7Cit9
OworCit9IH0gLy8gbmFtZXNwYWNlIEpTQzo6QjMKKworI2VuZGlmIC8vIEIzQ29uc3QzMlZhbHVl
X2gKKwpJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzQ29uc3Q2NFZhbHVlLmNwcAo9
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNDb25zdDY0VmFsdWUuY3Bw
CShyZXZpc2lvbiAwKQorKysgU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzQ29uc3Q2NFZhbHVl
LmNwcAkod29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDQxIEBACisvKgorICogQ29weXJpZ2h0IChD
KSAyMDE1IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1
dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQK
KyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dp
bmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3Vy
Y2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRo
aXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAy
LiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3Zl
IGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhl
IGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Ig
b3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBU
SElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkK
KyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElN
SVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFO
RCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJ
TiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxF
IEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1Q
TEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRF
RCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExP
U1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9O
KSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVU
SEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5H
IE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBV
U0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJ
VFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisKKyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRl
ICJCM0NvbnN0NjRWYWx1ZS5oIgorCituYW1lc3BhY2UgSlNDIHsgbmFtZXNwYWNlIEIzIHsKKwor
Q29uc3Q2NFZhbHVlOjp+Q29uc3Q2NFZhbHVlKCkKK3sKK30KKwordm9pZCBDb25zdDY0VmFsdWU6
OmR1bXBNZXRhKFByaW50U3RyZWFtJiBvdXQpIGNvbnN0Cit7CisgICAgb3V0LnByaW50KG1fdmFs
dWUpOworfQorCit9IH0gLy8gbmFtZXNwYWNlIEpTQzo6QjMKKwpJbmRleDogU291cmNlL0phdmFT
Y3JpcHRDb3JlL2IzL0IzQ29uc3Q2NFZhbHVlLmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL0phdmFT
Y3JpcHRDb3JlL2IzL0IzQ29uc3Q2NFZhbHVlLmgJKHJldmlzaW9uIDApCisrKyBTb3VyY2UvSmF2
YVNjcmlwdENvcmUvYjMvQjNDb25zdDY0VmFsdWUuaAkod29ya2luZyBjb3B5KQpAQCAtMCwwICsx
LDU5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE1IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyBy
ZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmlu
YXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRl
ZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAq
IDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUg
Y29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUg
Zm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZv
cm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlz
IGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQor
ICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGgg
dGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQ
UExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5U
SUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJB
TlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAq
IFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9S
CisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5D
SURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VT
IChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNU
SVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklU
UzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRI
RU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklM
SVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklT
SU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4g
SUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisKKyNp
Zm5kZWYgQjNDb25zdDY0VmFsdWVfaAorI2RlZmluZSBCM0NvbnN0NjRWYWx1ZV9oCisKKyNpbmNs
dWRlICJCM1ZhbHVlLmgiCisKK25hbWVzcGFjZSBKU0MgeyBuYW1lc3BhY2UgQjMgeworCitjbGFz
cyBDb25zdDY0VmFsdWUgOiBwdWJsaWMgVmFsdWUgeworcHVibGljOgorICAgIHN0YXRpYyBib29s
IGFjY2VwdHMoT3Bjb2RlIG9wY29kZSkgeyByZXR1cm4gb3Bjb2RlID09IENvbnN0NjQ7IH0KKyAg
ICAKKyAgICB+Q29uc3Q2NFZhbHVlKCk7CisgICAgCisgICAgaW50NjRfdCB2YWx1ZSgpIGNvbnN0
IHsgcmV0dXJuIG1fdmFsdWU7IH0KKworcHJvdGVjdGVkOgorICAgIHZvaWQgZHVtcE1ldGEoUHJp
bnRTdHJlYW0mKSBjb25zdCBvdmVycmlkZTsKKworcHJpdmF0ZToKKyAgICBmcmllbmQgY2xhc3Mg
UHJvY2VkdXJlOworCisgICAgQ29uc3Q2NFZhbHVlKHVuc2lnbmVkIGluZGV4LCBPcmlnaW4gb3Jp
Z2luLCBpbnQ2NF90IHZhbHVlKQorICAgICAgICA6IFZhbHVlKGluZGV4LCBDb25zdDY0LCBJbnQ2
NCwgb3JpZ2luKQorICAgICAgICAsIG1fdmFsdWUodmFsdWUpCisgICAgeworICAgIH0KKyAgICAK
KyAgICBpbnQ2NF90IG1fdmFsdWU7Cit9OworCit9IH0gLy8gbmFtZXNwYWNlIEpTQzo6QjMKKwor
I2VuZGlmIC8vIEIzQ29uc3Q2NFZhbHVlX2gKKwpJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3Jl
L2IzL0IzQ29uc3REb3VibGVWYWx1ZS5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL0phdmFTY3Jp
cHRDb3JlL2IzL0IzQ29uc3REb3VibGVWYWx1ZS5jcHAJKHJldmlzaW9uIDApCisrKyBTb3VyY2Uv
SmF2YVNjcmlwdENvcmUvYjMvQjNDb25zdERvdWJsZVZhbHVlLmNwcAkod29ya2luZyBjb3B5KQpA
QCAtMCwwICsxLDQxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE1IEFwcGxlIEluYy4gQWxs
IHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJj
ZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJl
IHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJl
IG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0
aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25z
IGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4g
YmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90
aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVy
IGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3Zp
ZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJ
REVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElF
RCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBM
SUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJ
Q1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBM
RSBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJ
UkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElB
TCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5U
IE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgor
ICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQg
T04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJ
Q1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJX
SVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdB
UkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAor
ICovCisKKyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJCM0NvbnN0RG91YmxlVmFsdWUu
aCIKKworbmFtZXNwYWNlIEpTQyB7IG5hbWVzcGFjZSBCMyB7CisKK0NvbnN0RG91YmxlVmFsdWU6
On5Db25zdERvdWJsZVZhbHVlKCkKK3sKK30KKwordm9pZCBDb25zdERvdWJsZVZhbHVlOjpkdW1w
TWV0YShQcmludFN0cmVhbSYgb3V0KSBjb25zdAoreworICAgIG91dC5wcmludGYoIiVsZSIsIG1f
dmFsdWUpOworfQorCit9IH0gLy8gbmFtZXNwYWNlIEpTQzo6QjMKKwpJbmRleDogU291cmNlL0ph
dmFTY3JpcHRDb3JlL2IzL0IzQ29uc3REb3VibGVWYWx1ZS5oCj09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJj
ZS9KYXZhU2NyaXB0Q29yZS9iMy9CM0NvbnN0RG91YmxlVmFsdWUuaAkocmV2aXNpb24gMCkKKysr
IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM0NvbnN0RG91YmxlVmFsdWUuaAkod29ya2luZyBj
b3B5KQpAQCAtMCwwICsxLDU5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE1IEFwcGxlIElu
Yy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGlu
IHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlv
biwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwor
ICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJl
dGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25k
aXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlv
bnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICog
ICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNj
bGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxz
IHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElT
IFBST1ZJREVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1Ig
SU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisg
KiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBB
IFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFM
TCBBUFBMRSBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNU
LCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VR
VUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NV
UkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRB
LCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNF
RCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNU
LCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1Ig
T1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMg
U09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1B
R0UuIAorICovCisKKyNpZm5kZWYgQjNDb25zdERvdWJsZVZhbHVlX2gKKyNkZWZpbmUgQjNDb25z
dERvdWJsZVZhbHVlX2gKKworI2luY2x1ZGUgIkIzVmFsdWUuaCIKKworbmFtZXNwYWNlIEpTQyB7
IG5hbWVzcGFjZSBCMyB7CisKK2NsYXNzIENvbnN0RG91YmxlVmFsdWUgOiBwdWJsaWMgVmFsdWUg
eworcHVibGljOgorICAgIHN0YXRpYyBib29sIGFjY2VwdHMoT3Bjb2RlIG9wY29kZSkgeyByZXR1
cm4gb3Bjb2RlID09IENvbnN0RG91YmxlOyB9CisgICAgCisgICAgfkNvbnN0RG91YmxlVmFsdWUo
KTsKKyAgICAKKyAgICBkb3VibGUgdmFsdWUoKSBjb25zdCB7IHJldHVybiBtX3ZhbHVlOyB9CisK
K3Byb3RlY3RlZDoKKyAgICB2b2lkIGR1bXBNZXRhKFByaW50U3RyZWFtJikgY29uc3Qgb3ZlcnJp
ZGU7CisKK3ByaXZhdGU6CisgICAgZnJpZW5kIGNsYXNzIFByb2NlZHVyZTsKKworICAgIENvbnN0
RG91YmxlVmFsdWUodW5zaWduZWQgaW5kZXgsIE9yaWdpbiBvcmlnaW4sIGRvdWJsZSB2YWx1ZSkK
KyAgICAgICAgOiBWYWx1ZShpbmRleCwgQ29uc3REb3VibGUsIERvdWJsZSwgb3JpZ2luKQorICAg
ICAgICAsIG1fdmFsdWUodmFsdWUpCisgICAgeworICAgIH0KKyAgICAKKyAgICBkb3VibGUgbV92
YWx1ZTsKK307CisKK30gfSAvLyBuYW1lc3BhY2UgSlNDOjpCMworCisjZW5kaWYgLy8gQjNDb25z
dERvdWJsZVZhbHVlX2gKKwpJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzQ29udHJv
bFZhbHVlLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNDb250
cm9sVmFsdWUuY3BwCShyZXZpc2lvbiAwKQorKysgU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0Iz
Q29udHJvbFZhbHVlLmNwcAkod29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDQzIEBACisvKgorICog
Q29weXJpZ2h0IChDKSAyMDE1IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisg
KiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRo
IG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0
IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0
aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAg
ICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2Ns
YWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1
Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0
aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRh
dGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlv
bi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gYGBBUyBJ
UycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcs
IEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hB
TlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJ
U0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SCisgKiBDT05UUklCVVRP
UlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lB
TCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJV
VCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1Ig
U0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1Mg
SU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElB
QklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisg
KiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkg
T1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBU
SEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisKKyNpbmNsdWRlICJjb25maWcu
aCIKKyNpbmNsdWRlICJCM0NvbnRyb2xWYWx1ZS5oIgorCituYW1lc3BhY2UgSlNDIHsgbmFtZXNw
YWNlIEIzIHsKKworQ29udHJvbFZhbHVlOjp+Q29udHJvbFZhbHVlKCkKK3sKK30KKwordm9pZCBD
b250cm9sVmFsdWU6OmR1bXBNZXRhKFByaW50U3RyZWFtJiBvdXQpIGNvbnN0Cit7CisgICAgQ29t
bWFQcmludGVyIGNvbW1hOworICAgIGZvciAoQmFzaWNCbG9jayogYmxvY2sgOiBtX3N1Y2Nlc3Nv
cnMpCisgICAgICAgIG91dC5wcmludChjb21tYSwgcG9pbnRlckR1bXAoYmxvY2spKTsKK30KKwor
fSB9IC8vIG5hbWVzcGFjZSBKU0M6OkIzCisKSW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9i
My9CM0NvbnRyb2xWYWx1ZS5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9i
My9CM0NvbnRyb2xWYWx1ZS5oCShyZXZpc2lvbiAwKQorKysgU291cmNlL0phdmFTY3JpcHRDb3Jl
L2IzL0IzQ29udHJvbFZhbHVlLmgJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSwxMTcgQEAKKy8q
CisgKiBDb3B5cmlnaHQgKEMpIDIwMTUgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgor
ICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMs
IHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVk
IHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0
cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQK
KyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcg
ZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJl
cHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBj
b25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1
bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJp
YnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBg
YEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xV
RElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBN
RVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBB
UkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IKKyAqIENPTlRS
SUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBT
UEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElO
RywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09E
UyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJ
TkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBP
RiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRP
UlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5Z
IFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VE
IE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKworI2lmbmRlZiBCM0Nv
bnRyb2xWYWx1ZV9oCisjZGVmaW5lIEIzQ29udHJvbFZhbHVlX2gKKworI2luY2x1ZGUgIkIzVmFs
dWUuaCIKKworbmFtZXNwYWNlIEpTQyB7IG5hbWVzcGFjZSBCMyB7CisKK2NsYXNzIEJhc2ljQmxv
Y2s7CisKK2NsYXNzIENvbnRyb2xWYWx1ZSA6IHB1YmxpYyBWYWx1ZSB7CitwdWJsaWM6CisgICAg
c3RhdGljIGJvb2wgYWNjZXB0cyhPcGNvZGUgb3Bjb2RlKQorICAgIHsKKyAgICAgICAgc3dpdGNo
IChvcGNvZGUpIHsKKyAgICAgICAgY2FzZSBKdW1wOgorICAgICAgICBjYXNlIEJyYW5jaDoKKyAg
ICAgICAgY2FzZSBSZXR1cm46CisgICAgICAgIGNhc2UgT29wczoKKyAgICAgICAgICAgIHJldHVy
biB0cnVlOworICAgICAgICBjYXNlIFN3aXRjaDogCisgICAgICAgICAgICAvLyBUaGlzIGlzIGhl
cmUgYmVjYXVzZSBTd2l0Y2hWYWx1ZSBpcyBhIHN1YmNsYXNzIG9mIENvbnRyb2xWYWx1ZSwgc28g
d2Ugd2FudAorICAgICAgICAgICAgLy8gc3d0aWNoVmFsdWUtPmFzPENvbnRyb2xWYWx1ZT4oKSB0
byByZXR1cm4gbm9uLW51bGwuCisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgZGVm
YXVsdDoKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KKworICAg
IHR5cGVkZWYgVmVjdG9yPEJhc2ljQmxvY2sqLCAyPiBTdWNjZXNzb3JMaXN0OworCisgICAgfkNv
bnRyb2xWYWx1ZSgpOworCisgICAgdW5zaWduZWQgbnVtU3VjY2Vzc29ycygpIGNvbnN0IHsgcmV0
dXJuIG1fc3VjY2Vzc29ycy5zaXplKCk7IH0KKyAgICBCYXNpY0Jsb2NrKiBzdWNjZXNzb3IodW5z
aWduZWQgaW5kZXgpIGNvbnN0IHsgcmV0dXJuIG1fc3VjY2Vzc29yc1tpXTsgfQorICAgIEJhc2lj
QmxvY2sqJiBzdWNjZXNzb3IodW5zaWduZWQgaW5kZXgpIHsgcmV0dXJuIG1fc3VjY2Vzc29yc1tp
XTsgfQorCisgICAgY29uc3QgU3VjY2Vzc29yTGlzdCYgc3VjY2Vzc29ycygpIGNvbnN0IHsgcmV0
dXJuIG1fc3VjY2Vzc29yczsgfQorCitwcm90ZWN0ZWQ6CisgICAgdm9pZCBkdW1wTWV0YShQcmlu
dFN0cmVhbSYpIGNvbnN0IG92ZXJyaWRlOworCisgICAgLy8gVXNlIHRoaXMgZm9yIHN1YmNsYXNz
ZXMuCisgICAgdGVtcGxhdGU8dHlwZW5hbWUuLi4gQXJndW1lbnRzPgorICAgIENvbnRyb2xWYWx1
ZSh1bnNpZ25lZCBpbmRleCwgT3Bjb2RlIG9wY29kZSwgVHlwZSB0eXBlLCBPcmlnaW4gb3JpZ2lu
LCBBcmd1bWVudHMuLi4gYXJndW1lbnRzKQorICAgICAgICA6IFZhbHVlKGluZGV4LCBvcGNvZGUs
IHR5cGUsIG9yaWdpbiwgYXJndW1lbnRzLi4uKQorICAgIHsKKyAgICB9CisKKyAgICAvLyBTdWJj
bGFzc2VzIHdpbGwgcG9wdWxhdGUgdGhpcy4KKyAgICBTdWNjZXNzb3JMaXN0IG1fc3VjY2Vzc29y
czsKKworcHJpdmF0ZToKKyAgICBmcmllbmQgY2xhc3MgUHJvY2VkdXJlOworCisgICAgLy8gVXNl
IHRoaXMgZm9yIE9vcHMuCisgICAgQ29udHJvbFZhbHVlKHVuc2lnbmVkIGluZGV4LCBPcGNvZGUg
b3Bjb2RlLCBPcmlnaW4gb3JpZ2luKQorICAgICAgICA6IFZhbHVlKGluZGV4LCBvcGNvZGUsIFZv
aWQsIG9yaWdpbikKKyAgICB7CisgICAgICAgIEFTU0VSVChvcGNvZGUgPT0gT29wcyk7CisgICAg
fQorCisgICAgLy8gVXNlIHRoaXMgZm9yIFJldHVybi4KKyAgICBDb250cm9sVmFsdWUodW5zaWdu
ZWQgaW5kZXgsIE9wY29kZSBvcGNvZGUsIE9yaWdpbiBvcmlnaW4sIFZhbHVlKiByZXN1bHQpCisg
ICAgICAgIDogVmFsdWUoaW5kZXgsIG9wY29kZSwgVm9pZCwgb3JpZ2luLCByZXN1bHQpCisgICAg
eworICAgICAgICBBU1NFUlQob3Bjb2RlID09IFJldHVybik7CisgICAgfQorCisgICAgLy8gVXNl
IHRoaXMgZm9yIEp1bXAuCisgICAgQ29udHJvbFZhbHVlKHVuc2lnbmVkIGluZGV4LCBPcGNvZGUg
b3Bjb2RlLCBPcmlnaW4gb3JpZ2luLCBCYXNpY0Jsb2NrKiB0YXJnZXQpCisgICAgICAgIDogVmFs
dWUoaW5kZXgsIG9wY29kZSwgVm9pZCwgb3JpZ2luKQorICAgIHsKKyAgICAgICAgQVNTRVJUKG9w
Y29kZSA9PSBKdW1wKTsKKyAgICAgICAgbV9zdWNjZXNzb3JzLmFwcGVuZCh0YXJnZXQpOworICAg
IH0KKworICAgIC8vIFVzZSB0aGlzIGZvciBCcmFuY2guCisgICAgQ29udHJvbFZhbHVlKAorICAg
ICAgICB1bnNpZ25lZCBpbmRleCwgT3Bjb2RlIG9wY29kZSwgT3JpZ2luIG9yaWdpbiwgVmFsdWUq
IHByZWRpY2F0ZSwKKyAgICAgICAgQmFzaWNCbG9jayogeWVzLCBCYXNpY0Jsb2NrKiBubykKKyAg
ICAgICAgOiBWYWx1ZShpbmRleCwgb3Bjb2RlLCBWb2lkLCBvcmlnaW4sIHByZWRpY2F0ZSkKKyAg
ICB7CisgICAgICAgIEFTU0VSVChvcGNvZGUgPT0gQnJhbmNoKTsKKyAgICAgICAgbV9zdWNjZXNz
b3JzLmFwcGVuZCh5ZXMpOworICAgICAgICBtX3N1Y2Nlc3NvcnMuYXBwZW5kKG5vKTsKKyAgICB9
Cit9OworCit9IH0gLy8gbmFtZXNwYWNlIEpTQzo6QjMKKworI2VuZGlmIC8vIEIzQ29udHJvbFZh
bHVlX2gKKwpJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzSW5kZXhTZXQuaAo9PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNJbmRleFNldC5oCShyZXZpc2lv
biAwKQorKysgU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzSW5kZXhTZXQuaAkod29ya2luZyBj
b3B5KQpAQCAtMCwwICsxLDE0MSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNSBBcHBsZSBJ
bmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBp
biBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRp
b24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMK
KyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCBy
ZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29u
ZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRp
b25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAq
ICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlz
Y2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFs
cyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJ
UyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9S
IElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQor
ICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1Ig
QSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hB
TEwgQVBQTEUgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVD
VCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNF
UVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9D
VVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFU
QSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVT
RUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFD
VCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9S
IE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElT
IFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFN
QUdFLiAKKyAqLworCisjaWZuZGVmIEIzSW5kZXhTZXRfaAorI2RlZmluZSBCM0luZGV4U2V0X2gK
KworI2luY2x1ZGUgPHd0Zi9CaXRWZWN0b3IuaD4KKyNpbmNsdWRlIDx3dGYvQ29tbWFQcmludGVy
Lmg+CisKK25hbWVzcGFjZSBKU0MgeyBuYW1lc3BhY2UgQjMgeworCisvLyBUaGlzIGlzIGEgc2V0
IGZvciB0aGluZ3MgdGhhdCBoYXZlIGFuIGluZGV4KCkuIEl0J3Mgc3VwZXIgZWZmaWNpZW50IGZv
ciBCYXNpY0Jsb2Nrcy4gSXQncyBvbmx5CisvLyBlZmZpY2llbnQgZm9yIFZhbHVlcyBpZiB5b3Ug
ZG9uJ3QgY3JlYXRlIHRvbyBtYW55IG9mIHRoZXNlIHNldHMsIHNpbmNlIFZhbHVlcyBjYW4gaGF2
ZSB2ZXJ5IHNwYXJzZQorLy8gaW5kaWNlcyBhbmQgdGhlcmUgYXJlIGEgbG90IG9mIFZhbHVlcy4K
KworLy8gSWYgeW91IHdhbnQgYSBzZXQgb2YgQmFzaWNCbG9ja3MsIHlvdSBkbyBJbmRleFNldDxC
YXNpY0Jsb2NrPi4gU28sIFQgPSBCYXNpY0Jsb2NrLgordGVtcGxhdGU8dHlwZW5hbWUgVD4KK2Ns
YXNzIEluZGV4U2V0IHsKK3B1YmxpYzoKKyAgICBJbmRleFNldCgpCisgICAgeworICAgIH0KKwor
ICAgIGJvb2wgYWRkKFQqIHZhbHVlKQorICAgIHsKKyAgICAgICAgcmV0dXJuICFtX3NldC5zZXQo
dmFsdWUtPmluZGV4KCkpOworICAgIH0KKworICAgIGJvb2wgY29udGFpbnMoVCogdmFsdWUpIGNv
bnN0CisgICAgeworICAgICAgICBpZiAoIXZhbHVlKQorICAgICAgICAgICAgcmV0dXJuIG51bGxw
dHI7CisgICAgICAgIHJldHVybiBtX3NldC5nZXQodmFsdWUtPmluZGV4KCkpOworICAgIH0KKwor
ICAgIHRlbXBsYXRlPHR5cGVuYW1lIENvbGxlY3Rpb25UeXBlPgorICAgIGNsYXNzIEl0ZXJhYmxl
IHsKKyAgICBwdWJsaWM6CisgICAgICAgIEl0ZXJhYmxlKGNvbnN0IENvbGxlY3Rpb25UeXBlJiBj
b2xsZWN0aW9uLCBjb25zdCBJbmRleFNldCYgc2V0KQorICAgICAgICAgICAgOiBtX2NvbGxlY3Rp
b24oY29sbGVjdGlvbikKKyAgICAgICAgICAgICwgbV9zZXQoc2V0KQorICAgICAgICB7CisgICAg
ICAgIH0KKworICAgICAgICBjbGFzcyBpdGVyYXRvciB7CisgICAgICAgIHB1YmxpYzoKKyAgICAg
ICAgICAgIGl0ZXJhdG9yKCkKKyAgICAgICAgICAgICAgICA6IG1fY29sbGVjdGlvbihudWxscHRy
KQorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpdGVyYXRvcihj
b25zdCBDb2xsZWN0aW9uVHlwZSYgY29sbGVjdGlvbiwgQml0VmVjdG9yOjpTZXRCaXRzSXRlcmFi
bGU6Oml0ZXJhdG9yIGl0ZXIpCisgICAgICAgICAgICAgICAgOiBtX2NvbGxlY3Rpb24oJmNvbGxl
Y3Rpb24pCisgICAgICAgICAgICAgICAgLCBtX2l0ZXIoaXRlcikKKyAgICAgICAgICAgIHsKKyAg
ICAgICAgICAgIH0KKworICAgICAgICAgICAgVCogb3BlcmF0b3IqKCkKKyAgICAgICAgICAgIHsK
KyAgICAgICAgICAgICAgICByZXR1cm4gbV9jb2xsZWN0aW9uLT5hdCgqbV9pdGVyKTsKKyAgICAg
ICAgICAgIH0KKworICAgICAgICAgICAgaXRlcmF0b3ImIG9wZXJhdG9yKysoKQorICAgICAgICAg
ICAgeworICAgICAgICAgICAgICAgIG1faXRlcisrOworICAgICAgICAgICAgICAgIHJldHVybiAq
dGhpczsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgYm9vbCBvcGVyYXRvcj09KGNvbnN0
IGl0ZXJhdG9yJiBvdGhlcikgY29uc3QKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBy
ZXR1cm4gbV9pdGVyID09IG90aGVyLm1faXRlcjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAg
ICAgYm9vbCBvcGVyYXRvciE9KGNvbnN0IGl0ZXJhdG9yJiBvdGhlcikgY29uc3QKKyAgICAgICAg
ICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gISgqdGhpcyA9PSBvdGhlcik7CisgICAgICAg
ICAgICB9CisKKyAgICAgICAgcHJpdmF0ZToKKyAgICAgICAgICAgIGNvbnN0IENvbGxlY3Rpb25U
eXBlKiBtX2NvbGxlY3Rpb247CisgICAgICAgICAgICBCaXRWZWN0b3I6OlNldEJpdHNJdGVyYWJs
ZTo6aXRlcmF0b3IgbV9pdGVyOworICAgICAgICB9OworCisgICAgICAgIGl0ZXJhdG9yIGJlZ2lu
KCkgY29uc3QgeyByZXR1cm4gaXRlcmF0b3IobV9jb2xsZWN0aW9uLCBtX3NldC5iZWdpbigpKTsg
fQorICAgICAgICBpdGVyYXRvciBlbmQoKSBjb25zdCB7IHJldHVybiBpdGVyYXRvcihtX2NvbGxl
Y3Rpb24sIG1fc2V0LmVuZCgpKTsgfQorCisgICAgcHJpdmF0ZToKKyAgICAgICAgY29uc3QgQ29s
bGVjdGlvblR5cGUmIG1fY29sbGVjdGlvbjsKKyAgICAgICAgY29uc3QgSW5kZXhTZXQmIG1fc2V0
OworICAgIH07CisKKyAgICAvLyBGb3IgYmFzaWMgYmxvY2tzLCB5b3UgZG86CisgICAgLy8gaW5k
ZXhTZXQudmFsdWVzKHByb2NlZHVyZSk7CisgICAgLy8KKyAgICAvLyBGb3IgdmFsdWVzLCB5b3Ug
ZG86CisgICAgLy8gaW5kZXhTZXQudmFsdWVzKHByb2NlZHVyZS52YWx1ZXMoKSk7CisgICAgdGVt
cGxhdGU8dHlwZW5hbWUgQ29sbGVjdGlvblR5cGU+CisgICAgSXRlcmFibGU8Q29sbGVjdGlvblR5
cGU+IHZhbHVlcyhjb25zdCBDb2xsZWN0aW9uVHlwZSYgY29sbGVjdGlvbikgY29uc3QKKyAgICB7
CisgICAgICAgIHJldHVybiBJdGVyYWJsZTxDb2xsZWN0aW9uVHlwZT4oY29sbGVjdGlvbik7Cisg
ICAgfQorCisgICAgY29uc3QgQml0VmVjdG9yJiBpbmRpY2VzKCkgY29uc3QgeyByZXR1cm4gbV9z
ZXQ7IH0KKworICAgIHZvaWQgZHVtcChQcmludFN0cmVhbSYgb3V0KSBjb25zdAorICAgIHsKKyAg
ICAgICAgQ29tbWFQcmludGVyIGNvbW1hOworICAgICAgICBmb3IgKHNpemVfdCBpbmRleCA6IGlu
ZGljZXMoKS5zZXRCaXRzKCkpCisgICAgICAgICAgICBvdXQucHJpbnQoY29tbWEsIFQ6OmR1bXBQ
cmVmaXgsIGluZGV4KTsKKyAgICB9CisKK3ByaXZhdGU6CisgICAgQml0VmVjdG9yIG1fc2V0Owor
fTsKKworfSB9IC8vIG5hbWVzcGFjZSBKU0M6OkIzCisKKyNlbmRpZiAvLyBCM0luZGV4U2V0X2gK
KwpJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzTG93ZXJpbmdNYXRjaGVyLnBhdHRl
cm5zCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM0xvd2VyaW5nTWF0
Y2hlci5wYXR0ZXJucwkocmV2aXNpb24gMCkKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9C
M0xvd2VyaW5nTWF0Y2hlci5wYXR0ZXJucwkod29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDQ0IEBA
CisjIENvcHlyaWdodCAoQykgMjAxNSBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisj
CisjIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdp
dGggb3Igd2l0aG91dAorIyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhh
dCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyMgYXJlIG1ldDoKKyMgMS4gUmVkaXN0cmlidXRp
b25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyMgICAg
bm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFp
bWVyLgorIyAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2Ug
dGhlIGFib3ZlIGNvcHlyaWdodAorIyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25z
IGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisjICAgIGRvY3VtZW50YXRpb24g
YW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisj
CisjIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBBTkQgSVRTIENPTlRS
SUJVVE9SUyBgYEFTIElTJycKKyMgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElF
UywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisjIFRIRSBJTVBMSUVEIFdBUlJBTlRJ
RVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyMgUFVS
UE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUiBJVFMg
Q09OVFJJQlVUT1JTCisjIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lE
RU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKKyMgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJ
TkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKKyMgU1VCU1RJVFVU
RSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJV
U0lORVNTCisjIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkg
T0YgTElBQklMSVRZLCBXSEVUSEVSIElOCisjIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBP
UiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisjIEFSSVNJTkcgSU4g
QU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQg
T0YKKyMgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCittYXRjaGVyIExvd2VyaW5n
TWF0Y2hlcgorCisjIFRoZXNlIHJ1bGVzIGFyZSBjb25zaWRlcmVkIGluIGEgY2FzY2FkZSwgc3Rh
cnRpbmcgYXQgdGhlIHRvcC4gSXQncyBpbXBsZW5lbnRlZCB1c2luZyBzd2l0Y2gKKyMgc3RhdGVt
ZW50cyB3aGVyZXZlciBwb3NzaWJsZS4KKworIyBOb3RlOiBhZGRpbmcgbW9yZSBydWxlcyB0byB0
aGlzIG1hdGNoZXIgaXMgYW4gZXhjZWxsZW50IHdheSBvZiBpbXByb3ZpbmcgcGVyZm9ybWFuY2Uh
CisKK0xvYWQgPSBMb2FkKGFkZHJlc3MpCisKKyMgV2UgcHJvYmFibHkgZG9uJ3QgbmVlZCB0aGVz
ZSBmb3Jtcy4KK0FkZExvYWQxID0gQWRkKExvYWQoYWRkcmVzcyksIHZhbHVlKQorQWRkTG9hZDIg
PSBBZGQodmFsdWUsIExvYWQoYWRkcmVzcykpCitBZGQgPSBBZGQobGVmdCwgcmlnaHQpCisKK1N0
b3JlQWRkTG9hZDEgPSBTdG9yZShBZGQoTG9hZChhZGRyZXNzKSwgdmFsdWUpLCBhZGRyZXNzKQor
U3RvcmVBZGRMb2FkMiA9IFN0b3JlKEFkZCh2YWx1ZSwgTG9hZChhZGRyZXNzKSksIGFkZHJlc3Mp
CitTdG9yZUFuZExvYWQgPSBTdG9yZShBbmQoTG9hZChhZGRyZXNzKSwgdmFsdWUpLCBhZGRyZXNz
KQorU3RvcmUgPSBTdG9yZSh2YWx1ZSwgYWRkcmVzcykKKworUmV0dXJuID0gUmV0dXJuKHZhbHVl
KQorCkluZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNNZW1vcnlWYWx1ZS5jcHAKPT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzTWVtb3J5VmFsdWUuY3BwCShy
ZXZpc2lvbiAwKQorKysgU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzTWVtb3J5VmFsdWUuY3Bw
CSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsNDIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIw
MTUgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9u
IGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICog
bW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBj
b25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBj
b2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBs
aXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJl
ZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29w
eXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9s
bG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhl
ciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMg
U09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICog
RVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVE
IFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJ
VE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5P
IEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9S
IEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZ
LCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRP
LAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBP
RiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhP
V0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIg
SU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVH
TElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQor
ICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBP
RiBTVUNIIERBTUFHRS4gCisgKi8KKworI2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgIkIz
TWVtb3J5VmFsdWUuaCIKKworbmFtZXNwYWNlIEpTQyB7IG5hbWVzcGFjZSBCMyB7CisKK01lbW9y
eVZhbHVlOjp+TWVtb3J5VmFsdWUoKQoreworfQorCit2b2lkIE1lbW9yeVZhbHVlOjpkdW1wTWV0
YShQcmludFN0cmVhbSYgb3V0KSBjb25zdAoreworICAgIGlmIChtX29mZnNldCkKKyAgICAgICAg
b3V0LnByaW50KCJvZmZzZXQgPSAiLCBtX29mZnNldCk7Cit9CisKK30gfSAvLyBuYW1lc3BhY2Ug
SlNDOjpCMworCkluZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNNZW1vcnlWYWx1ZS5o
Cj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM01lbW9yeVZhbHVlLmgJ
KHJldmlzaW9uIDApCisrKyBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNNZW1vcnlWYWx1ZS5o
CSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsMTQyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAy
MDE1IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlv
biBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAq
IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcg
Y29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2Ug
Y29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMg
bGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBS
ZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNv
cHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZv
bGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3Ro
ZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElT
IFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAq
IEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRF
RCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBG
SVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBO
TyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZP
UiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFS
WSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBU
TywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1Mg
T0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBI
T1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVS
IElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5F
R0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UK
KyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkg
T0YgU1VDSCBEQU1BR0UuIAorICovCisKKyNpZm5kZWYgQjNNZW1vcnlWYWx1ZV9oCisjZGVmaW5l
IEIzTWVtb3J5VmFsdWVfaAorCisjaW5jbHVkZSAiQjNWYWx1ZS5oIgorCituYW1lc3BhY2UgSlND
IHsgbmFtZXNwYWNlIEIzIHsKKworY2xhc3MgTWVtb3J5VmFsdWUgOiBwdWJsaWMgVmFsdWUgewor
cHVibGljOgorICAgIHN0YXRpYyBib29sIGFjY2VwdHMoT3Bjb2RlIG9wY29kZSkKKyAgICB7Cisg
ICAgICAgIHN3aXRjaCAob3Bjb2RlKSB7CisgICAgICAgIGNhc2UgTG9hZDhaOgorICAgICAgICBj
YXNlIExvYWQ4UzoKKyAgICAgICAgY2FzZSBMb2FkMTZaOgorICAgICAgICBjYXNlIExvYWQxNlM6
CisgICAgICAgIGNhc2UgTG9hZEZsb2F0OgorICAgICAgICBjYXNlIExvYWQ6CisgICAgICAgIGNh
c2UgU3RvcmU4OgorICAgICAgICBjYXNlIFN0b3JlMTY6CisgICAgICAgIGNhc2UgU3RvcmVGbG9h
dDoKKyAgICAgICAgY2FzZSBTdG9yZToKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAg
ICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgfQor
CisgICAgfk1lbW9yeVZhbHVlKCk7CisKKyAgICBpbnRwdHJfdCBvZmZzZXQoKSBjb25zdCB7IHJl
dHVybiBtX29mZnNldDsgfQorCitwcm90ZWN0ZWQ6CisgICAgdm9pZCBkdW1wTWV0YShQcmludFN0
cmVhbSYpIGNvbnN0IG92ZXJyaWRlOworCitwcml2YXRlOgorICAgIGZyaWVuZCBjbGFzcyBQcm9j
ZWR1cmU7CisKKyAgICAvLyBVc2UgdGhpcyBmb3JtIGZvciBMb2FkIChidXQgbm90IExvYWQ4Wiwg
TG9hZDhTLCBvciBhbnkgb2YgdGhlIExvYWRzIHRoYXQgaGF2ZSBhIHN1ZmZpeCB0aGF0CisgICAg
Ly8gZGVzY3JpYmVzIHRoZSByZXR1cm5lZCB0eXBlKS4KKyAgICBNZW1vcnlWYWx1ZSgKKyAgICAg
ICAgdW5zaWduZWQgaW5kZXgsIE9wY29kZSBvcGNvZGUsIFR5cGUgdHlwZSwgT3JpZ2luIG9yaWdp
biwgVmFsdWUqIHBvaW50ZXIsCisgICAgICAgIGludHB0cl90IG9mZnNldCA9IDApCisgICAgICAg
IDogVmFsdWUoaW5kZXgsIG9wY29kZSwgdHlwZSwgb3JpZ2luLCBwb2ludGVyKQorICAgICAgICAs
IG1fb2Zmc2V0KG9mZnNldCkKKyAgICB7CisgICAgICAgIGlmICghQVNTRVJUX0RJU0FCTEVEKSB7
CisgICAgICAgICAgICBzd2l0Y2ggKG9wY29kZSkgeworICAgICAgICAgICAgY2FzZSBMb2FkOgor
ICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBMb2FkOFo6CisgICAgICAg
ICAgICBjYXNlIExvYWQ4UzoKKyAgICAgICAgICAgIGNhc2UgTG9hZDE2WjoKKyAgICAgICAgICAg
IGNhc2UgTG9hZDE2UzoKKyAgICAgICAgICAgICAgICBBU1NFUlQodHlwZSA9PSBJbnQzMik7Cisg
ICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIExvYWRGbG9hdDoKKyAgICAg
ICAgICAgICAgICBBU1NFUlQodHlwZSA9PSBEb3VibGUpOworICAgICAgICAgICAgICAgIGJyZWFr
OworICAgICAgICAgICAgY2FzZSBTdG9yZTg6CisgICAgICAgICAgICBjYXNlIFN0b3JlMTY6Cisg
ICAgICAgICAgICBjYXNlIFN0b3JlRmxvYXQ6CisgICAgICAgICAgICBjYXNlIFN0b3JlOgorICAg
ICAgICAgICAgICAgIEFTU0VSVCh0eXBlID09IFZvaWQpOworICAgICAgICAgICAgICAgIGJyZWFr
OworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBBU1NFUlRfTk9UX1JFQUNI
RUQoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIFVzZSB0aGlz
IGZvcm0gZm9yIGxvYWRzIHdoZXJlIHRoZSByZXR1cm4gdHlwZSBpcyBpbXBsaWVkLgorICAgIE1l
bW9yeVZhbHVlKHVuc2lnbmVkIGluZGV4LCBPcGNvZGUgb3Bjb2RlLCBPcmlnaW4gb3JpZ2luLCBW
YWx1ZSogcG9pbnRlciwgaW50cHRyX3Qgb2Zmc2V0ID0gMCkKKyAgICAgICAgOiBWYWx1ZShpbmRl
eCwgb3Bjb2RlLCBvcGNvZGUgPT0gTG9hZEZsb2F0ID8gRG91YmxlIDogSW50MzIsIG9yaWdpbiwg
cG9pbnRlcikKKyAgICAgICAgLCBtX29mZnNldChvZmZzZXQpCisgICAgeworICAgICAgICBpZiAo
IUFTU0VSVF9ESVNBQkxFRCkgeworICAgICAgICAgICAgc3dpdGNoIChvcGNvZGUpIHsKKyAgICAg
ICAgICAgIGNhc2UgTG9hZDhaOgorICAgICAgICAgICAgY2FzZSBMb2FkOFM6CisgICAgICAgICAg
ICBjYXNlIExvYWQxNlo6CisgICAgICAgICAgICBjYXNlIExvYWQxNlM6CisgICAgICAgICAgICBj
YXNlIExvYWRGbG9hdDoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1
bHQ6CisgICAgICAgICAgICAgICAgQVNTRVJUX05PVF9SRUFDSEVEKCk7CisgICAgICAgICAgICAg
ICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBVc2Ug
dGhpcyBmb3JtIGZvciBzdG9yZXMuCisgICAgTWVtb3J5VmFsdWUoCisgICAgICAgIHVuc2lnbmVk
IGluZGV4LCBPcGNvZGUgb3Bjb2RlLCBPcmlnaW4gb3JpZ2luLCBWYWx1ZSogdmFsdWUsIFZhbHVl
KiBwb2ludGVyLAorICAgICAgICBpbnRwdHJfdCBvZmZzZXQgPSAwKQorICAgICAgICA6IFZhbHVl
KGluZGV4LCBvcGNvZGUsIFZvaWQsIG9yaWdpbiwgdmFsdWUsIHBvaW50ZXIpCisgICAgICAgICwg
bV9vZmZzZXQob2Zmc2V0KQorICAgIHsKKyAgICAgICAgaWYgKCFBU1NFUlRfRElTQUJMRUQpIHsK
KyAgICAgICAgICAgIHN3aXRjaCAob3Bjb2RlKSB7CisgICAgICAgICAgICBjYXNlIFN0b3JlODoK
KyAgICAgICAgICAgIGNhc2UgU3RvcmUxNjoKKyAgICAgICAgICAgIGNhc2UgU3RvcmVGbG9hdDoK
KyAgICAgICAgICAgIGNhc2UgU3RvcmU6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAg
ICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIEFTU0VSVF9OT1RfUkVBQ0hFRCgpOworICAg
ICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfTsK
KworfSB9IC8vIG5hbWVzcGFjZSBKU0M6OkIzCisKKyNlbmRpZiAvLyBCM01lbW9yeVZhbHVlX2gK
KwpJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzT3Bjb2RlLmNwcAo9PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNPcGNvZGUuY3BwCShyZXZpc2lvbiAwKQor
KysgU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzT3Bjb2RlLmNwcAkod29ya2luZyBjb3B5KQpA
QCAtMCwwICsxLDQ3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE1IEFwcGxlIEluYy4gQWxs
IHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJj
ZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJl
IHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJl
IG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0
aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25z
IGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4g
YmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90
aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVy
IGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3Zp
ZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJ
REVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElF
RCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBM
SUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJ
Q1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBM
RSBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJ
UkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElB
TCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5U
IE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgor
ICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQg
T04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJ
Q1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJX
SVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdB
UkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAor
ICovCisKKyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJCM09wY29kZS5oIgorCisjaW5j
bHVkZSA8d3RmL1ByaW50U3RyZWFtLmg+CisKK25hbWVzcGFjZSBXVEYgeworCit1c2luZyBuYW1l
c3BhY2UgSlNDOjpCMzsKKwordm9pZCBwcmludEludGVybmFsKFByaW50U3RyZWFtJiBvdXQsIE9w
Y29kZSBvcGNvZGUpCit7CisgICAgc3dpdGNoIChvcGNvZGUpIHsKKyAgICBjYXNlIElkZW50aXR5
OgorICAgICAgICBvdXQucHJpbnQoIklkZW50aXR5Iik7CisgICAgICAgIHJldHVybjsKKyAgICAg
ICAgLy8gRklYTUUKKyAgICB9CisgICAgUkVMRUFTRV9BU1NFUlRfTk9UX1JFQUNIRUQoKTsKK30K
KworfSAvLyBuYW1lc3BhY2UgV1RGCisKSW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9C
M09wY29kZS5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM09wY29k
ZS5oCShyZXZpc2lvbiAwKQorKysgU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzT3Bjb2RlLmgJ
KHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSwyMTUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIw
MTUgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9u
IGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICog
bW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBj
b25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBj
b2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBs
aXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJl
ZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29w
eXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9s
bG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhl
ciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMg
U09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICog
RVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVE
IFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJ
VE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5P
IEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9S
IEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZ
LCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRP
LAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBP
RiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhP
V0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIg
SU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVH
TElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQor
ICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBP
RiBTVUNIIERBTUFHRS4gCisgKi8KKworI2lmbmRlZiBCM09wY29kZV9oCisjZGVmaW5lIEIzT3Bj
b2RlX2gKKworI2luY2x1ZGUgPHd0Zi9TdGRMaWJFeHRyYXMuaD4KKworbmFtZXNwYWNlIEpTQyB7
IG5hbWVzcGFjZSBCMyB7CisKK2VudW0gT3Bjb2RlIDogaW50MTZfdCB7CisgICAgLy8gQSBuby1v
cCB0aGF0IHJldHVybnMgVm9pZCwgdXNlZnVsIGZvciB3aGVuIHlvdSB3YW50IHRvIHJlbW92ZSBh
IHZhbHVlLgorICAgIE5vcCwKKyAgICAgCisgICAgLy8gUG9seW1vcnBoaWMgaWRlbnRpdHksIHVz
YWJsZSB3aXRoIGFueSB2YWx1ZSB0eXBlLgorICAgIElkZW50aXR5LAorCisgICAgLy8gQ29uc3Rh
bnRzLiBVc2UgdGhlIENvbnN0VmFsdWUqIGNsYXNzZXMuIENvbnN0YW50cyBleGlzdCBpbiB0aGUg
Y29udHJvbCBmbG93LCBzbyB0aGF0IHdlIGNhbgorICAgIC8vIHJlYXNvbiBhYm91dCB3aGVyZSB3
ZSB3b3VsZCBjb25zdHJ1Y3QgdGhlbS4gTGFyZ2UgY29uc3RhbnRzIGFyZSBleHBlbnNpdmUgdG8g
Y3JlYXRlLgorICAgIENvbnN0MzIsCisgICAgQ29uc3Q2NCwKKyAgICBDb25zdERvdWJsZSwKKwor
ICAgIC8vIFRoZSBtYWdpY2FsIHN0YWNrIHNsb3QuIFRoaXMgaXMgdmlld2VkIGFzIGV4ZWN1dGlu
ZyBhdCB0aGUgdG9wIG9mIHRoZSBwcm9ncmFtIHJlZ2FyZGxlc3Mgb2YKKyAgICAvLyB3aGVyZSBp
biBjb250cm9sIGZsb3cgeW91IHB1dCBpdC4gRWFjaCBpbnN0YW5jZSBvZiBhIFN0YWNrU2xvdCBW
YWx1ZSBnZXRzIGEgZGlzam9pbnQgcmFuZ2Ugb2YKKyAgICAvLyBzdGFjayBtZW1vcnkuIFVzZSB0
aGUgU3RhY2tTbG90VmFsdWUgY2xhc3MuCisgICAgU3RhY2tTbG90LAorCisgICAgLy8gVGhlIG1h
Z2ljYWwgYXJndW1lbnQgcmVnaXN0ZXIuIFRoaXMgaXMgdmlld2VkIGFzIGV4ZWN1dGluZyBhdCB0
aGUgdG9wIG9mIHRoZSBwcm9ncmFtCisgICAgLy8gcmVnYXJkbGVzcyBvZiB3aGVyZSBpbiBjb250
cm9sIGZsb3cgeW91IHB1dCBpdCwgYW5kIHRoZSBjb21waWxlciB0YWtlcyBjYXJlIHRvIGVuc3Vy
ZSB0aGF0IHdlCisgICAgLy8gZG9uJ3QgY2xvYmJlciB0aGUgdmFsdWUgYnkgcmVnaXN0ZXIgYWxs
b2NhdGlvbiBvciBjYWxscyAoZWl0aGVyIGJ5IHNhdmluZyB0aGUgYXJndW1lbnQgdG8gdGhlCisg
ICAgLy8gc3RhY2sgb3IgcHJlc2VydmluZyBpdCBpbiBhIGNhbGxlZS1zYXZlIHJlZ2lzdGVyKS4g
VXNlIHRoZSBBcmd1bWVudFJlZ1ZhbHVlIGNsYXNzLiBUaGUgcmV0dXJuCisgICAgLy8gdHlwZSBp
cyBlaXRoZXIgcG9pbnRlcigpIChmb3IgR1BScykgb3IgRG91YmxlIChmb3IgRlBScykuCisgICAg
QXJndW1lbnRSZWcsCisKKyAgICAvLyBUaGUgZnJhbWUgcG9pbnRlci4gWW91IGNhbiBwdXQgdGhp
cyBhbnl3aGVyZSBpbiBjb250cm9sIGZsb3cgYnV0IGl0IHdpbGwgYWx3YXlzIHlpZWxkIHRoZQor
ICAgIC8vIGZyYW1lIHBvaW50ZXIsIHdpdGggYSBjYXZlYXQ6IGlmIG91ciBjb21waWxlciBjaGFu
Z2VzIHRoZSBmcmFtZSBwb2ludGVyIHRlbXBvcmFyaWx5IGZvciBzb21lCisgICAgLy8gc2lsbHkg
cmVhc29uLCB0aGUgRnJhbWVQb2ludGVyIGludHJpbnNpYyB3aWxsIHJldHVybiB3aGVyZSB0aGUg
ZnJhbWUgcG9pbnRlciAqc2hvdWxkKiBiZSBub3QKKyAgICAvLyB3aGVyZSBpdCBoYXBwZW5zIHRv
IGJlIHJpZ2h0IG5vdy4KKyAgICBGcmFtZVBvaW50ZXIsCisKKyAgICAvLyBQb2x5bW9ycGhpYyBt
YXRoLCB1c2FibGUgd2l0aCBhbnkgdmFsdWUgdHlwZS4KKyAgICBBZGQsCisgICAgU3ViLAorICAg
IE11bCwKKyAgICBEaXYsCisKKyAgICAvLyBJbnRlZ2VyIG1hdGguCisgICAgQ2hpbGxEaXYsIC8v
IGRvZXNuJ3QgdHJhcCBldmVyLCBiZWhhdmVzIGxpa2UgSlMgKHgveSl8MC4KKyAgICBNb2QsCisg
ICAgQml0QW5kLAorICAgIEJpdE9yLAorICAgIEJpdFhvciwKKyAgICBTaGwsCisgICAgU1NociwK
KyAgICBaU2hyLAorCisgICAgLy8gQ2FzdHMgYW5kIHN1Y2guCisgICAgLy8gVGFrZXMgYW5kIHJl
dHVybnMgSW50MzI6CisgICAgU0V4dDgsCisgICAgU0V4dDE2LAorICAgIC8vIFRha2VzIEludDMy
IGFuZCByZXR1cm5zIEludDY0OgorICAgIFNFeHQzMiwKKyAgICBaRXh0MzIsCisgICAgLy8gVGFr
ZXMgYW5kIHJldHVybnMgRG91YmxlOgorICAgIEZSb3VuZCwKKyAgICAvLyBUYWtlcyBpbnRzIGFu
ZCByZXR1cm5zIERvdWJsZToKKyAgICBJVG9ELAorICAgIC8vIFRha2VzIERvdWJsZSBhbmQgcmV0
dXJucyBJbnQzMjoKKyAgICBEVG9JMzIsCisKKyAgICAvLyBQb2x5bW9ycGhpYyBjb21wYXJpc29u
cywgdXNhYmxlIHdpdGggYW55IHZhbHVlIHR5cGUuIFJldHVybnMgaW50MzIgMCBvciAxLiBOb3Rl
IHRoYXQgIk5vdCIKKyAgICAvLyBpcyBqdXN0IEVxdWFsKHgsIDApLgorICAgIEVxdWFsLAorICAg
IE5vdEVxdWFsLAorICAgIExlc3NUaGFuLAorICAgIEdyZWF0ZXJUaGFuLAorICAgIExlc3NFcXVh
bCwKKyAgICBHcmVhdGVyRXF1YWwsCisKKyAgICAvLyBJbnRlZ2VyIGNvbXBhcmlzb25zLiBSZXR1
cm5zIGludDMyIDAgb3IgMS4KKyAgICBBYm92ZSwKKyAgICBCZWxvdywKKyAgICBBYm92ZUVxdWFs
CisgICAgQmVsb3dFcXVhbCwKKworICAgIC8vIE1lbW9yeSBsb2Fkcy4gT3Bjb2RlIGluZGljYXRl
cyBob3cgd2UgbG9hZCBhbmQgdGhlIGxvYWRlZCB0eXBlLiBUaGVzZSB1c2UgTWVtb3J5VmFsdWUu
CisgICAgLy8gVGhlc2UgcmV0dXJuIEludDMyOgorICAgIExvYWQ4WiwKKyAgICBMb2FkOFMsCisg
ICAgTG9hZDE2WiwKKyAgICBMb2FkMTZTLAorICAgIC8vIFRoaXMgcmV0dXJucyBEb3VibGU6Cisg
ICAgTG9hZEZsb2F0LAorICAgIC8vIFRoaXMgcmV0dXJuIHdoYXRldmVyIHRoZSByZXR1cm4gdHlw
ZSBpczoKKyAgICBMb2FkLAorCisgICAgLy8gTWVtb3J5IHN0b3Jlcy4gT3Bjb2RlIGluZGljYXRl
cyBob3cgdGhlIHZhbHVlIGlzIHN0b3JlZC4gVGhlc2UgdXNlIE1lbW9yeVZhbHVlLgorICAgIC8v
IFRoZXNlIHRha2UgYW4gSW50MzIgdmFsdWU6CisgICAgU3RvcmU4LAorICAgIFN0b3JlMTYsCisg
ICAgLy8gVGhpcyB0YWtlcyBhIERvdWJsZSB2YWx1ZToKKyAgICBTdG9yZUZsb2F0LAorICAgIC8v
IFRoaXMgaXMgYSBwb2x5bW9ycGhpYyBzdG9yZSBmb3IgSW50MzIsIEludDY0LCBhbmQgRG91Ymxl
OgorICAgIFN0b3JlLAorCisgICAgLy8gVGhpcyBpcyBhIHJlZ3VsYXIgb3JkaW5hcnkgQyBmdW5j
dGlvbiBjYWxsLCB1c2luZyB0aGUgc3lzdGVtIEMgY2FsbGluZyBjb252ZW50aW9uLiBNYWtlIHN1
cmUKKyAgICAvLyB0aGF0IHRoZSBhcmd1bWVudHMgYXJlIHBhc3NlZCB1c2luZyB0aGUgcmlnaHQg
dHlwZXMuCisgICAgQ0NhbGwsCisKKyAgICAvLyBUaGlzIGlzIGEgcGF0Y2hwb2ludC4gVXNlIHRo
ZSBQYXRjaHBvaW50VmFsdWUgY2xhc3MuIFRoaXMgaXMgdmlld2VkIGFzIGJlaGF2aW5nIGxpa2Ug
YSBjYWxsLAorICAgIC8vIGJ1dCBvbmx5IGVtaXRzIGNvZGUgdmlhIGEgY29kZSBnZW5lcmF0aW9u
IGNhbGxiYWNrLiBUaGF0IGNhbGxiYWNrIGdldHMgdG8gZW1pdCBjb2RlIGlubGluZS4KKyAgICAv
LyBZb3UgY2FuIHBhc3MgYSBzdGFja21hcCBhbG9uZyB3aXRoIGNvbnN0cmFpbnRzIG9uIGhvdyBl
YWNoIHN0YWNrbWFwIGFyZ3VtZW50IG11c3QgYmUgcGFzc2VkLgorICAgIC8vIEl0J3MgbGVnYWwg
dG8gcmVxdWVzdCB0aGF0IGEgc3RhY2ttYXAgYXJndW1lbnQgaXMgaW4gc29tZSByZWdpc3RlciBh
bmQgaXQncyBsZWdhbCB0byByZXF1ZXN0CisgICAgLy8gdGhhdCBhIHN0YWNrbWFwIGFyZ3VtZW50
IGlzIGF0IHNvbWUgb2Zmc2V0IGZyb20gdGhlIHRvcCBvZiB0aGUgYXJndW1lbnQgcGFzc2luZyBh
cmVhIG9uIHRoZQorICAgIC8vIHN0YWNrLgorICAgIFBhdGNocG9pbnQsCisKKyAgICAvLyBDaGVj
a2VkIG1hdGguIFVzZSB0aGUgQ2hlY2tWYWx1ZSBjbGFzcy4gTGlrZSBhIFBhdGNocG9pbnQsIHRo
aXMgdGFrZXMgYSBjb2RlIGdlbmVyYXRpb24KKyAgICAvLyBjYWxsYmFjay4gVGhhdCBjYWxsYmFj
ayBnZXRzIHRvIGVtaXQgc29tZSBjb2RlIGFmdGVyIHRoZSBlcGlsb2d1ZSwgYW5kIGdldHMgdG8g
bGluayB0aGUganVtcAorICAgIC8vIGZyb20gdGhlIGNoZWNrLCBhbmQgdGhlIGNob2ljZSBvZiBy
ZWdpc3RlcnMuIFlvdSBhbHNvIGdldCB0byBzdXBwbHkgYSBzdGFja21hcC4gTm90ZSB0aGF0IHlv
dQorICAgIC8vIGFyZSBub3QgYWxsb3dlZCB0byBqdW1wIGJhY2sgaW50byB0aGUgbWFpbmxpbmUg
Y29kZSBmcm9tIHlvdXIgc2xvdyBwYXRoLCBzaW5jZSB0aGUgY29tcGlsZXIKKyAgICAvLyB3aWxs
IGFzc3VtZSB0aGF0IHRoZSBleGVjdXRpb24gb2YgdGhlc2UgaW5zdHJ1Y3Rpb25zIHByb3ZlcyB0
aGF0IG92ZXJmbG93IGRpZG4ndCBoYXBwZW4uIEZvcgorICAgIC8vIGV4YW1wbGUsIGlmIHlvdSBo
YXZlIHR3byBDaGVja0FkZCdzOgorICAgIC8vCisgICAgLy8gYSA9IENoZWNrQWRkKHgsIHkpCisg
ICAgLy8gYiA9IENoZWNrQWRkKHgsIHkpCisgICAgLy8KKyAgICAvLyBUaGVuIGl0J3MgdmFsaWQg
dG8gY2hhbmdlIHRoaXMgdG86CisgICAgLy8KKyAgICAvLyBhID0gQ2hlY2tBZGQoeCwgeSkKKyAg
ICAvLyBiID0gSWRlbnRpdHkoYSkKKyAgICAvLworICAgIC8vIFRoaXMgaXMgdmFsaWQgcmVnYXJk
bGVzcyBvZiB0aGUgY2FsbGJhY2tzIHVzZWQgYnkgdGhlIHR3byBDaGVja0FkZHMuIFRoZXkgbWF5
IGhhdmUgZGlmZmVyZW50CisgICAgLy8gY2FsbGJhY2tzLiBZZXQsIHRoaXMgdHJhbnNmb3JtYXRp
b24gaXMgdmFsaWQgZXZlbiBpZiB0aGV5IGFyZSBkaWZmZXJlbnQgYmVjYXVzZSB3ZSBrbm93IHRo
YXQKKyAgICAvLyBhZnRlciB0aGUgZmlyc3QgQ2hlY2tBZGQgZXhlY3V0ZXMsIHRoZSBzZWNvbmQg
Q2hlY2tBZGQgY291bGQgbm90IGhhdmUgcG9zc2libHkgdGFrZW4gc2xvdworICAgIC8vIHBhdGgu
IFRoZXJlZm9yZSwgdGhlIHNlY29uZCBDaGVja0FkZCdzIGNhbGxiYWNrIGlzIGlycmVsZXZhbnQu
CisgICAgQ2hlY2tBZGQsCisgICAgQ2hlY2tTdWIsCisgICAgQ2hlY2tNdWwsCisKKyAgICAvLyBD
aGVjayB0aGF0IHNpZGUtZXhpdHMuIFVzZSB0aGUgQ2hlY2tWYWx1ZSBjbGFzcy4gTGlrZSBDaGVj
a0FkZCBhbmQgZnJpZW5kcywgdGhpcyBoYXMgYQorICAgIC8vIHN0YWNrbWFwIHdpdGggYSBnZW5l
cmF0aW9uIGNhbGxiYWNrLiBUaGlzIHRha2VzIGFuIEludDMyIGFyZ3VtZW50IHRoYXQgdGhpcyBi
cmFuY2hlcyBvbiwgd2l0aAorICAgIC8vIGZ1bGwgYnJhbmNoIGZ1c2lvbiBpbiB0aGUgaW5zdHJ1
Y3Rpb24gc2VsZWN0b3IuIEEgdHJ1ZSB2YWx1ZSBqdW1wcyB0byB0aGUgZ2VuZXJhdG9yJ3Mgc2xv
dworICAgIC8vIHBhdGguCisgICAgQ2hlY2ssCisKKyAgICAvLyBTU0Egc3VwcG9ydCwgaW4gdGhl
IHN0eWxlIG9mIERGRyBTU0EuCisgICAgVXBzaWxvbiwgLy8gVGhpcyB1c2VzIHRoZSBVcHNpbG9u
VmFsdWUgY2xhc3MuCisgICAgUGhpLAorCisgICAgLy8gSnVtcC4gVXNlcyB0aGUgQ29udHJvbFZh
bHVlIGNsYXNzLgorICAgIEp1bXAsCisgICAgCisgICAgLy8gUG9seW1vcnBoaWMgYnJhbmNoLCB1
c2FibGUgd2l0aCBhbnkgdmFsdWUgdHlwZS4gQnJhbmNoZXMgaWYgbm90IGVxdWFsIHRvIHplcm8u
IFVzZXMgdGhlCisgICAgLy8gQ29udHJvbFZhbHVlIGNsYXNzLCB3aXRoIHRoZSAwLWluZGV4IHN1
Y2Nlc3NvciBiZWluZyB0aGUgdHJ1ZSBzdWNjZXNzb3IuCisgICAgQnJhbmNoLAorCisgICAgLy8g
U3dpdGNoLiBTd2l0Y2hlcyBvdmVyIGVpdGhlciBJbnQzMiBvciBJbnQ2NC4gVXNlcyB0aGUgU3dp
dGNoVmFsdWUgY2xhc3MuCisgICAgU3dpdGNoLAorCisgICAgLy8gUmV0dXJuLiBOb3RlIHRoYXQg
QjMgcHJvY2VkdXJlcyBkb24ndCBrbm93IHRoZWlyIHJldHVybiB0eXBlLCBzbyB0aGlzIGNhbiBq
dXN0IHJldHVybiBhbnkKKyAgICAvLyB0eXBlLiBVc2VzIHRoZSBDb250cm9sVmFsdWUgY2xhc3Mu
CisgICAgUmV0dXJuLAorCisgICAgLy8gVGhpcyBpcyBhIHRlcm1pbmFsIHRoYXQgaW5kaWNhdGVz
IHRoYXQgd2Ugd2lsbCBuZXZlciBnZXQgaGVyZS4gVXNlcyB0aGUgQ29udHJvbFZhbHVlIGNsYXNz
LgorICAgIE9vcHMKK307CisKK2lubGluZSBib29sIGlzQ2hlY2tNYXRoKE9wY29kZSBvcGNvZGUp
Cit7CisgICAgc3dpdGNoIChvcGNvZGUpIHsKKyAgICBjYXNlIENoZWNrQWRkOgorICAgIGNhc2Ug
Q2hlY2tTdWI6CisgICAgY2FzZSBDaGVja011bDoKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAg
ZGVmYXVsdDoKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KK30KKworfSB9IC8vIG5hbWVz
cGFjZSBKU0M6OkIzCisKK25hbWVzcGFjZSBXVEYgeworCitjbGFzcyBQcmludFN0cmVhbTsKKwor
dm9pZCBwcmludEludGVybmFsKFByaW50U3RyZWFtJiwgSlNDOjpCMzo6T3Bjb2RlKTsKKworfSAv
LyBuYW1lc3BhY2UgV1RGCisKKyNlbmRpZiAvLyBCM09wY29kZV9oCisKSW5kZXg6IFNvdXJjZS9K
YXZhU2NyaXB0Q29yZS9iMy9CM09yaWdpbi5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL0phdmFT
Y3JpcHRDb3JlL2IzL0IzT3JpZ2luLmNwcAkocmV2aXNpb24gMCkKKysrIFNvdXJjZS9KYXZhU2Ny
aXB0Q29yZS9iMy9CM09yaWdpbi5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSwzNyBAQAor
LyoKKyAqIENvcHlyaWdodCAoQykgMjAxNSBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQu
CisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jt
cywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlk
ZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRp
c3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdo
dAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2lu
ZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3Qg
cmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9m
IGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRv
Y3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0
cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMu
IGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5D
TFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9G
IE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NF
IEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUgorICogQ09O
VFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUws
IFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVE
SU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdP
T0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJV
U0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAq
IE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1Ig
VE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBB
TlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklT
RUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLiAKKyAqLworCisjaW5jbHVkZSAi
Y29uZmlnLmgiCisjaW5jbHVkZSAiQjNPcmlnaW4uaCIKKworbmFtZXNwYWNlIEpTQyB7IG5hbWVz
cGFjZSBCMyB7CisKK3ZvaWQgT3JpZ2luOjpkdW1wKFByaW50U3RyZWFtJiBvdXQpIGNvbnN0Cit7
CisgICAgb3V0LnByaW50KCJPcmlnaW4oIiwgUmF3UG9pbnRlcihtX2RhdGEpLCAiKSIpOworfQor
Cit9IH0gLy8gbmFtZXNwYWNlIEpTQzo6QjMKKwpJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3Jl
L2IzL0IzT3JpZ2luLmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0Iz
T3JpZ2luLmgJKHJldmlzaW9uIDApCisrKyBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNPcmln
aW4uaAkod29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDU1IEBACisvKgorICogQ29weXJpZ2h0IChD
KSAyMDE1IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1
dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQK
KyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dp
bmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3Vy
Y2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRo
aXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAy
LiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3Zl
IGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhl
IGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Ig
b3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBU
SElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkK
KyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElN
SVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFO
RCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJ
TiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxF
IEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1Q
TEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRF
RCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExP
U1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9O
KSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVU
SEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5H
IE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBV
U0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJ
VFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisKKyNpZm5kZWYgQjNPcmlnaW5faAorI2RlZmluZSBC
M09yaWdpbl9oCisKKyNpbmNsdWRlIDx3dGYvUHJpbnRTdHJlYW0uaD4KKworbmFtZXNwYWNlIEpT
QyB7IG5hbWVzcGFjZSBCMyB7CisKKy8vIFdob2V2ZXIgZ2VuZXJhdGVzIEIzSVIgY2FuIGNob29z
ZSB0byBwdXQgb3JpZ2lucyBvbiB2YWx1ZXMuIFdoZW4geW91IGRvIHRoaXMsIEIzIHdpbGwgYmUg
YWJsZSB0bworLy8gYWNjb3VudCwgZG93biB0byB0aGUgbWFjaGluZSBjb2RlLCB3aGljaCBpbnN0
cnVjdGlvbiBjb3JyZXNwb25kcyB0byB3aGljaCBvcmlnaW4uIEIzCisvLyB0cmFuc2Zvcm1hdGlv
bnMgbXVzdCBwcmVzZXJ2ZSBPcmlnaW5zIGNhcmVmdWxseS4gSXQncyBhbiBlcnJvciB0byB3cml0
ZSBhIHRyYW5zZm9ybWF0aW9uIHRoYXQKKy8vIGVpdGhlciBkcm9wcyBPcmlnaW5zIG9yIGxpZXMg
YWJvdXQgdGhlbS4KK2NsYXNzIE9yaWdpbiB7CitwdWJsaWM6CisgICAgZXhwbGljaXQgT3JpZ2lu
KGNvbnN0IHZvaWQqIGRhdGEgPSBudWxscHRyKQorICAgICAgICA6IG1fZGF0YShkYXRhKQorICAg
IHsKKyAgICB9CisKKyAgICBjb25zdCB2b2lkKiBkYXRhKCkgY29uc3QgeyByZXR1cm4gbV9kYXRh
OyB9CisKKyAgICB2b2lkIGR1bXAoUHJpbnRTdHJlYW0mKSBjb25zdDsKKyAgICAKK3ByaXZhdGU6
CisgICAgY29uc3Qgdm9pZCogbV9kYXRhOworfTsKKworfSB9IC8vIG5hbWVzcGFjZSBKU0M6OkIz
CisKKyNlbmRpZiAvLyBCM09yaWdpbl9oCisKSW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9i
My9CM1BhdGNocG9pbnRWYWx1ZS5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRD
b3JlL2IzL0IzUGF0Y2hwb2ludFZhbHVlLmNwcAkocmV2aXNpb24gMCkKKysrIFNvdXJjZS9KYXZh
U2NyaXB0Q29yZS9iMy9CM1BhdGNocG9pbnRWYWx1ZS5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTAs
MCArMSw0MyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNSBBcHBsZSBJbmMuIEFsbCByaWdo
dHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5k
IGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJt
aXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6
CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFi
b3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQg
dGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFy
eSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwg
dGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0
aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3
aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBC
WSBBUFBMRSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FS
UkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBX
QVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFS
CisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5D
LiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1Qs
IElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFN
QUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBT
VUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBS
T0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFO
WSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJ
QUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkg
QVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBF
VkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLiAKKyAqLwor
CisjaW5jbHVkZSAiY29uZmlnLmgiCisjaW5jbHVkZSAiQjNQYXRjaHBvaW50VmFsdWUuaCIKKwor
I2luY2x1ZGUgPHd0Zi9Db21tYVByaW50ZXIuaD4KKworbmFtZXNwYWNlIEpTQyB7IG5hbWVzcGFj
ZSBCMyB7CisKK1BhdGNocG9pbnRWYWx1ZTo6flBhdGNocG9pbnRWYWx1ZSgpCit7Cit9CisKK3Zv
aWQgUGF0Y2hwb2ludFZhbHVlOjpkdW1wTWV0YShQcmludFN0cmVhbSYgb3V0KSBjb25zdAorewor
ICAgIG91dC5wcmludCgic3RhY2ttYXAgPSAiLCBzdGFja21hcCk7Cit9CisKK30gfSAvLyBuYW1l
c3BhY2UgSlNDOjpCMworCkluZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNQYXRjaHBv
aW50VmFsdWUuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNQYXRj
aHBvaW50VmFsdWUuaAkocmV2aXNpb24gMCkKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9C
M1BhdGNocG9pbnRWYWx1ZS5oCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsNTcgQEAKKy8qCisg
KiBDb3B5cmlnaHQgKEMpIDIwMTUgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoK
KyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdp
dGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRo
YXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmli
dXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAq
ICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlz
Y2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJv
ZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25k
aXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVu
dGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0
aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFT
IElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElO
RywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJD
SEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUg
RElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IKKyAqIENPTlRSSUJV
VE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVD
SUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywg
QlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBP
UiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVT
UyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBM
SUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQK
KyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdB
WSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9G
IFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKworI2lmbmRlZiBCM1BhdGNo
cG9pbnRWYWx1ZV9oCisjZGVmaW5lIEIzUGF0Y2hwb2ludFZhbHVlX2gKKworI2luY2x1ZGUgIkIz
VmFsdWUuaCIKKyNpbmNsdWRlICJCM1N0YWNrbWFwLmgiCisKK25hbWVzcGFjZSBKU0MgeyBuYW1l
c3BhY2UgQjMgeworCitjbGFzcyBQYXRjaHBvaW50VmFsdWUgOiBwdWJsaWMgVmFsdWUgeworcHVi
bGljOgorICAgIHN0YXRpYyBib29sIGFjY2VwdHMoT3Bjb2RlIG9wY29kZSkgeyByZXR1cm4gb3Bj
b2RlID09IFBhdGNocG9pbnQ7IH0KKworICAgIH5QYXRjaHBvaW50VmFsdWUoKTsKKworICAgIFN0
YWNrbWFwIHN0YWNrbWFwOworCitwcm90ZWN0ZWQ6CisgICAgdm9pZCBkdW1wTWV0YShQcmludFN0
cmVhbSYpIGNvbnN0IG92ZXJyaWRlOworCitwcml2YXRlOgorICAgIGZyaWVuZCBjbGFzcyBQcm9j
ZWR1cmU7CisKKyAgICBQYXRjaHBvaW50VmFsdWUodW5zaWduZWQgaW5kZXgsIFR5cGUgdHlwZSwg
T3JpZ2luIG9yaWdpbiwgY29uc3QgQWRqYWNlbmN5TGlzdCYgY2hpbGRyZW4pCisgICAgICAgIDog
VmFsdWUoaW5kZXgsIFBhdGNocG9pbnQsIHR5cGUsIG9yaWdpbiwgY2hpbGRyZW4pCisgICAgewor
ICAgIH0KK307CisKK30gfSAvLyBuYW1lc3BhY2UgSlNDOjpCMworCisjZW5kaWYgLy8gQjNQYXRj
aHBvaW50VmFsdWVfaAorCkluZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNQcm9jZWR1
cmUuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM1Byb2NlZHVy
ZS5jcHAJKHJldmlzaW9uIDApCisrKyBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNQcm9jZWR1
cmUuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsNTYgQEAKKy8qCisgKiBDb3B5cmlnaHQg
KEMpIDIwMTUgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJp
YnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91
dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxv
d2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNv
dXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwg
dGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAq
IDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJv
dmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0
aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9v
ciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAq
IFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFTIElTJycgQU5EIEFO
WQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBM
SU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkg
QU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4g
IElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFC
TEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhF
TVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1J
VEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsg
TE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJ
T04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdI
RVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJ
TkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhF
IFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJ
TElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKworI2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1
ZGUgIkIzUHJvY2VkdXJlLmgiCisKKyNpbmNsdWRlICJCM0Jhc2ljQmxvY2suaCIKKyNpbmNsdWRl
ICJCM1ZhbHVlLmgiCisKK25hbWVzcGFjZSBKU0MgeyBuYW1lc3BhY2UgQjMgeworCitQcm9jZWR1
cmU6OlByb2NlZHVyZSgpCit7Cit9CisKK1Byb2NlZHVyZTo6flByb2NlZHVyZSgpCit7Cit9CisK
K0Jhc2ljQmxvY2sqIFByb2NlZHVyZTo6YWRkQmxvY2soKQoreworICAgIHN0ZDo6dW5pcXVlX3B0
cjxCYXNpY0Jsb2NrPiBibG9jayA9IHN0ZDo6bWFrZV91bmlxdWU8QmFzaWNCbG9jaz4obV9ibG9j
a3Muc2l6ZSgpKTsKKyAgICBCYXNpY0Jsb2NrKiByZXN1bHQgPSBibG9jay5nZXQoKTsKKyAgICBt
X2Jsb2Nrcy5hcHBlbmQoV1RGOjptb3ZlKGJsb2NrKSk7CisgICAgcmV0dXJuIHJlc3VsdDsKK30K
Kwordm9pZCBQcm9jZWR1cmU6OmR1bXAoUHJpbnRTdHJlYW0mIG91dCkgY29uc3QKK3sKKyAgICBm
b3IgKEJhc2ljQmxvY2sqIGJsb2NrIDogKnRoaXMpCisgICAgICAgIG91dC5wcmludChkZWVwRHVt
cChibG9jaykpOworfQorCit9IH0gLy8gbmFtZXNwYWNlIEpTQzo6QjMKSW5kZXg6IFNvdXJjZS9K
YXZhU2NyaXB0Q29yZS9iMy9CM1Byb2NlZHVyZS5oCj09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZh
U2NyaXB0Q29yZS9iMy9CM1Byb2NlZHVyZS5oCShyZXZpc2lvbiAwKQorKysgU291cmNlL0phdmFT
Y3JpcHRDb3JlL2IzL0IzUHJvY2VkdXJlLmgJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSwxNzcg
QEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTUgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2Vy
dmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkg
Zm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHBy
b3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4g
UmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5
cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xs
b3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBt
dXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlz
dCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAg
ICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUg
ZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUg
SU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMs
IElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElF
UyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVS
UE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IKKyAq
IENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVO
VEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElO
Q0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVU
RSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBP
UiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZ
CisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFks
IE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcg
SU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBB
RFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKworI2lmbmRl
ZiBCM1Byb2NlZHVyZV9oCisjZGVmaW5lIEIzUHJvY2VkdXJlX2gKKworI2luY2x1ZGUgPHd0Zi9C
YWcuaD4KKyNpbmNsdWRlIDx3dGYvRmFzdE1hbGxvYy5oPgorI2luY2x1ZGUgPHd0Zi9Ob25jb3B5
YWJsZS5oPgorI2luY2x1ZGUgPHd0Zi9WZWN0b3IuaD4KKworbmFtZXNwYWNlIEpTQyB7IG5hbWVz
cGFjZSBCMyB7CisKK2NsYXNzIEJhc2ljQmxvY2s7CitjbGFzcyBWYWx1ZTsKKworY2xhc3MgUHJv
Y2VkdXJlIHsKKyAgICBXVEZfTUFLRV9OT05DT1BZQUJMRShQcm9jZWR1cmUpOworICAgIFdURl9N
QUtFX0ZBU1RfQUxMT0NBVEVEOworcHVibGljOgorCisgICAgUHJvY2VkdXJlKCk7CisgICAgflBy
b2NlZHVyZSgpOworCisgICAgQmFzaWNCbG9jayogYWRkQmxvY2soKTsKKyAgICAKKyAgICB0ZW1w
bGF0ZTx0eXBlbmFtZSBWYWx1ZVR5cGUsIHR5cGVuYW1lLi4uIEFyZ3VtZW50cz4KKyAgICBWYWx1
ZVR5cGUqIGFkZChBcmd1bWVudHMuLi4pOworCisgICAgdm9pZCBkdW1wKFByaW50U3RyZWFtJikg
Y29uc3Q7CisKKyAgICB1bnNpZ25lZCBzaXplKCkgY29uc3QgeyByZXR1cm4gbV9ibG9ja3Muc2l6
ZSgpOyB9CisgICAgQmFzaWNCbG9jayogYXQodW5zaWduZWQgaW5kZXgpIGNvbnN0IHsgcmV0dXJu
IG1fYmxvY2tzW2luZGV4XTsgfQorICAgIEJhc2ljQmxvY2sqIG9wZXJhdG9yW10odW5zaWduZWQg
aW5kZXgpIGNvbnN0IHsgcmV0dXJuIGF0KGluZGV4KTsgfQorCisgICAgY2xhc3MgaXRlcmF0b3Ig
eworICAgIHB1YmxpYzoKKyAgICAgICAgaXRlcmF0b3IoKToKKyAgICAgICAgICAgIDogbV9wcm9j
ZWR1cmUobnVsbHB0cikKKyAgICAgICAgICAgICwgbV9pbmRleCgwKQorICAgICAgICB7CisgICAg
ICAgIH0KKworICAgICAgICBpdGVyYXRvcihQcm9jZWR1cmUmIHByb2NlZHVyZSwgdW5zaWduZWQg
aW5kZXgpCisgICAgICAgICAgICA6IG1fcHJvY2VkdXJlKCZwcm9jZWR1cmUpCisgICAgICAgICAg
ICAsIG1faW5kZXgoaW5kZXgpCisgICAgICAgIHsKKyAgICAgICAgfQorCisgICAgICAgIEJhc2lj
QmxvY2sqIG9wZXJhdG9yKigpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBtX3Byb2Nl
ZHVyZS0+YXQobV9pbmRleCk7CisgICAgICAgIH0KKworICAgICAgICBpdGVyYXRvciYgb3BlcmF0
b3IrKygpCisgICAgICAgIHsKKyAgICAgICAgICAgIG1faW5kZXggPSBmaW5kTmV4dChtX2luZGV4
ICsgMSk7CisgICAgICAgICAgICByZXR1cm4gKnRoaXM7CisgICAgICAgIH0KKworICAgICAgICBi
b29sIG9wZXJhdG9yPT0oY29uc3QgaXRlcmF0b3ImIG90aGVyKSBjb25zdAorICAgICAgICB7Cisg
ICAgICAgICAgICByZXR1cm4gbV9pbmRleCA9PSBvdGhlci5tX2luZGV4OworICAgICAgICB9CisK
KyAgICAgICAgYm9vbCBvcGVyYXRvciE9KGNvbnN0IGl0ZXJhdG9yJiBvdGhlcikgY29uc3QKKyAg
ICAgICAgeworICAgICAgICAgICAgcmV0dXJuICEoKnRoaXMgPT0gb3RoZXIpOworICAgICAgICB9
CisKKyAgICBwcml2YXRlOgorICAgICAgICB1bnNpZ25lZCBmaW5kTmV4dCh1bnNpZ25lZCBpbmRl
eCkKKyAgICAgICAgeworICAgICAgICAgICAgd2hpbGUgKGluZGV4IDwgbV9wcm9jZWR1cmUtPnNp
emUoKSAmJiAhbV9wcm9jZWR1cmUtPmF0KGluZGV4KSkKKyAgICAgICAgICAgICAgICBpbmRleCsr
OworICAgICAgICAgICAgcmV0dXJuIGluZXg7CisgICAgICAgIH0KKworICAgICAgICBQcm9jZWR1
cmUqIG1fcHJvY2VkdXJlOworICAgICAgICB1bnNpZ25lZCBtX2luZGV4OworICAgIH07CisKKyAg
ICBpdGVyYXRvciBiZWdpbigpIGNvbnN0IHsgcmV0dXJuIGl0ZXJhdG9yKCp0aGlzLCAwKTsgfQor
ICAgIGl0ZXJhdG9yIGVuZCgpIGNvbnN0IHsgcmV0dXJuIGl0ZXJhdG9yKCp0aGlzLCBudW1CbG9j
a3MoKSk7IH0KKworICAgIGNsYXNzIFZhbHVlc0NvbGxlY3Rpb24geworICAgIHB1YmxpYzoKKyAg
ICAgICAgVmFsdWVzQ29sbGVjdGlvbihQcm9jZWR1cmUmIHByb2NlZHVyZSkKKyAgICAgICAgICAg
IDogbV9wcm9jZWR1cmUocHJvY2VkdXJlKQorICAgICAgICB7CisgICAgICAgIH0KKworICAgICAg
ICBjbGFzcyBpdGVyYXRvciB7CisgICAgICAgIHB1YmxpYzoKKyAgICAgICAgICAgIGl0ZXJhdG9y
KCk6CisgICAgICAgICAgICAgICAgOiBtX3Byb2NlZHVyZShudWxscHRyKQorICAgICAgICAgICAg
ICAgICwgbV9pbmRleCgwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorCisgICAgICAg
ICAgICBpdGVyYXRvcihQcm9jZWR1cmUmIHByb2NlZHVyZSwgdW5zaWduZWQgaW5kZXgpCisgICAg
ICAgICAgICAgICAgOiBtX3Byb2NlZHVyZSgmcHJvY2VkdXJlKQorICAgICAgICAgICAgICAgICwg
bV9pbmRleChpbmRleCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKworICAgICAgICAg
ICAgVmFsdWUqIG9wZXJhdG9yKigpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0
dXJuIG1fcHJvY2VkdXJlLT5ibG9jayhtX2luZGV4KTsKKyAgICAgICAgICAgIH0KKworICAgICAg
ICAgICAgaXRlcmF0b3ImIG9wZXJhdG9yKysoKQorICAgICAgICAgICAgeworICAgICAgICAgICAg
ICAgIG1faW5kZXgrKzsKKyAgICAgICAgICAgICAgICByZXR1cm4gKnRoaXM7CisgICAgICAgICAg
ICB9CisKKyAgICAgICAgICAgIGJvb2wgb3BlcmF0b3I9PShjb25zdCBpdGVyYXRvciYgb3RoZXIp
IGNvbnN0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG1faW5kZXggPT0g
b3RoZXIubV9pbmRleDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgYm9vbCBvcGVyYXRv
ciE9KGNvbnN0IGl0ZXJhdG9yJiBvdGhlcikgY29uc3QKKyAgICAgICAgICAgIHsKKyAgICAgICAg
ICAgICAgICByZXR1cm4gISgqdGhpcyA9PSBvdGhlcik7CisgICAgICAgICAgICB9CisKKyAgICAg
ICAgcHJpdmF0ZToKKworICAgICAgICAgICAgUHJvY2VkdXJlKiBtX3Byb2NlZHVyZTsKKyAgICAg
ICAgICAgIHVuc2lnbmVkIG1faW5kZXg7CisgICAgICAgIH07CisKKyAgICAgICAgaXRlcmF0b3Ig
YmVnaW4oKSBjb25zdCB7IHJldHVybiBpdGVyYXRvcihtX3Byb2NlZHVyZSwgMCk7IH0KKyAgICAg
ICAgaXRlcmF0b3IgZW5kKCkgY29uc3QgeyByZXR1cm4gaXRlcmF0b3IobV9wcm9jZWR1cmUsIG1f
cHJvY2VkdXJlLm1fdmFsdWVzLnNpemUoKSk7IH0KKworICAgICAgICB1bnNpZ25lZCBzaXplKCkg
Y29uc3QgeyByZXR1cm4gbV9wcm9jZWR1cmUubV92YWx1ZXMuc2l6ZSgpOyB9CisgICAgICAgIFZh
bHVlKiBhdCh1bnNpZ25lZCBpbmRleCkgY29uc3QgeyByZXR1cm4gbV9wcm9jZWR1cmUubV92YWx1
ZXNbaW5kZXhdOyB9CisgICAgICAgIFZhbHVlKiBvcGVyYXRvcltdKHVuc2lnbmVkIGluZGV4KSBj
b25zdCB7IHJldHVybiBhdChpbmRleCk7IH0KKyAgICAgICAgCisgICAgcHJpdmF0ZToKKyAgICAg
ICAgUHJvY2VkdXJlJiBtX3Byb2NlZHVyZTsKKyAgICB9OworCisgICAgVmFsdWVzQ29sbGVjdGlv
biB2YWx1ZXMoKSB7IHJldHVybiBWYWx1ZXNDb2xsZWN0aW9uKCp0aGlzKTsgfQorCitwcml2YXRl
OgorICAgIFZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QmFzaWNCbG9jaz4+IG1fYmxvY2tzOworICAg
IFZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8VmFsdWU+PiBtX3ZhbHVlczsKK307CisKK30gfSAvLyBu
YW1lc3BhY2UgSlNDOjpCMworCisjZW5kaWYgLy8gQjNQcm9jZWR1cmVfaAorCkluZGV4OiBTb3Vy
Y2UvSmF2YVNjcmlwdENvcmUvYjMvQjNQcm9jZWR1cmVJbmxpbmVzLmgKPT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0g
U291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzUHJvY2VkdXJlSW5saW5lcy5oCShyZXZpc2lvbiAw
KQorKysgU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzUHJvY2VkdXJlSW5saW5lcy5oCSh3b3Jr
aW5nIGNvcHkpCkBAIC0wLDAgKzEsNDYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTUgQXBw
bGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1
c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZp
Y2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRp
b25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11
c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9m
IGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJp
YnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0
CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5n
IGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRl
cmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdB
UkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVT
UyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBU
SEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1Mg
Rk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5U
IFNIQUxMIEFQUExFIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBE
SVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBD
T05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICog
UFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0Us
IERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIg
Q0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09O
VFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5D
RSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0Yg
VEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNI
IERBTUFHRS4gCisgKi8KKworI2lmbmRlZiBCM1Byb2NlZHVyZUlubGluZXNfaAorI2RlZmluZSBC
M1Byb2NlZHVyZUlubGluZXNfaAorCisjaW5jbHVkZSAiQjNCYXNpY0Jsb2NrLmgiCisjaW5jbHVk
ZSAiQjNQcm9jZWR1cmUuaCIKKworbmFtZXNwYWNlIEpTQyB7IG5hbWVzcGFjZSBCMyB7CisKK3Rl
bXBsYXRlPHR5cGVuYW1lIFZhbHVlVHlwZSwgdHlwZW5hbWUuLi4gQXJndW1lbnRzPgorVmFsdWVU
eXBlKiBQcm9jZWR1cmU6OmFkZChBcmd1ZW50cy4uLiBhcmd1bWVudHMpCit7CisgICAgc3RkOjp1
bmlxdWVfcHRyPFZhbHVlVHlwZT4gdmFsdWUobmV3IFZhbHVlVHlwZShtX3ZhbHVlcy5zaXplKCks
IGFyZ3VtZW50cy4uLikpOworICAgIFZhbHVlVHlwZSogcmVzdWx0ID0gdmFsdWUuZ2V0KCk7Cisg
ICAgbV92YWx1ZXMuYXBwZW5kKFdURjo6bW92ZSh2YWx1ZSkpOworICAgIHJldHVybiByZXN1bHQ7
Cit9CisKK30gfSAvLyBuYW1lc3BhY2UgSlNDOjpCMworCisjZW5kaWYgLy8gQjNQcm9jZWR1cmVJ
bmxpbmVzX2gKKwpJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzU3RhY2tTbG90VmFs
dWUuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM1N0YWNrU2xv
dFZhbHVlLmNwcAkocmV2aXNpb24gMCkKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM1N0
YWNrU2xvdFZhbHVlLmNwcAkod29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDQxIEBACisvKgorICog
Q29weXJpZ2h0IChDKSAyMDE1IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisg
KiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRo
IG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0
IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0
aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAg
ICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2Ns
YWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1
Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0
aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRh
dGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlv
bi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gYGBBUyBJ
UycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcs
IEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hB
TlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJ
U0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SCisgKiBDT05UUklCVVRP
UlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lB
TCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJV
VCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1Ig
U0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1Mg
SU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElB
QklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisg
KiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkg
T1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBU
SEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisKKyNpbmNsdWRlICJjb25maWcu
aCIKKyNpbmNsdWRlICJCM1N0YWNrU2xvdFZhbHVlLmgiCisKK25hbWVzcGFjZSBKU0MgeyBuYW1l
c3BhY2UgQjMgeworCitTdGFja1Nsb3RWYWx1ZTo6flN0YWNrU2xvdFZhbHVlKCkKK3sKK30KKwor
dm9pZCBTdGFja1Nsb3RWYWx1ZTo6ZHVtcE1ldGEoUHJpbnRTdHJlYW0mIG91dCkgY29uc3QKK3sK
KyAgICBvdXQucHJpbnQoImJ5dGVTaXplID0gIiwgbV9ieXRlU2l6ZSk7Cit9CisKK30gfSAvLyBu
YW1lc3BhY2UgSlNDOjpCMworCkluZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNTdGFj
a1Nsb3RWYWx1ZS5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM1N0
YWNrU2xvdFZhbHVlLmgJKHJldmlzaW9uIDApCisrKyBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMv
QjNTdGFja1Nsb3RWYWx1ZS5oCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsNjUgQEAKKy8qCisg
KiBDb3B5cmlnaHQgKEMpIDIwMTUgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoK
KyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdp
dGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRo
YXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmli
dXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAq
ICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlz
Y2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJv
ZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25k
aXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVu
dGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0
aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFT
IElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElO
RywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJD
SEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUg
RElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IKKyAqIENPTlRSSUJV
VE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVD
SUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywg
QlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBP
UiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVT
UyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBM
SUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQK
KyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdB
WSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9G
IFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKworI2lmbmRlZiBCM1N0YWNr
U2xvdFZhbHVlX2gKKyNkZWZpbmUgQjNTdGFja1Nsb3RWYWx1ZV9oCisKKyNpbmNsdWRlICJCM1Zh
bHVlLmgiCisKK25hbWVzcGFjZSBKU0MgeyBuYW1lc3BhY2UgQjMgeworCitjbGFzcyBTdGFja1Ns
b3RWYWx1ZSA6IHB1YmxpYyBWYWx1ZSB7CitwdWJsaWM6CisgICAgc3RhdGljIGJvb2wgYWNjZXB0
cyhPcGNvZGUgb3Bjb2RlKSB7IHJldHVybiBvcGNvZGUgPT0gU3RhY2tTbG90OyB9CisKKyAgICB+
U3RhY2tTbG90VmFsdWUoKTsKKworICAgIHVuc2lnbmVkIGJ5dGVTaXplKCkgY29uc3QgeyByZXR1
cm4gbV9ieXRlU2l6ZTsgfQorCisgICAgLy8gVGhpcyBnZXRzIGFzc2lnbmVkIGF0IHRoZSBlbmQg
b2YgY29tcGlsYXRpb24uIFlvdSBjYW5ub3QgcmVseSBvbiBpdCBoYXZpbmcgYSBtZWFuaW5nZnVs
CisgICAgLy8gdmFsdWUgd2hpbGUgdGhlIGNvbXBpbGVyIGlzIHJ1bm5pbmcuCisgICAgaW50cHRy
X3Qgb2Zmc2V0RnJvbUZQKCkgY29uc3QgeyByZXR1cm4gbV9vZmZzZXRGcm9tRlA7IH0KKworcHJv
dGVjdGVkOgorICAgIHZvaWQgZHVtcE1ldGEoUHJpbnRTdHJlYW0mKSBjb25zdCBvdmVycmlkZTsK
KworcHJpdmF0ZToKKyAgICBmcmllbmQgY2xhc3MgUHJvY2VkdXJlOworCisgICAgU3RhY2tTbG90
VmFsdWUodW5zaWduZWQgaW5kZXgsIE9yaWdpbiBvcmlnaW4sIHVuc2lnbmVkIGJ5dGVTaXplKQor
ICAgICAgICA6IFZhbHVlKGluZGV4LCBTdGFja1Nsb3QsIHBvaW50ZXIoKSwgb3JpZ2luKQorICAg
ICAgICAsIG1fYnl0ZVNpemUoYnl0ZVNpemUpCisgICAgICAgICwgbV9vZmZzZXRGcm9tRlAoMCkK
KyAgICB7CisgICAgfQorCisgICAgdW5zaWduZWQgbV9ieXRlU2l6ZTsKKyAgICBpbnRwdHJfdCBt
X29mZnNldEZyb21GUDsKK307CisKK30gfSAvLyBuYW1lc3BhY2UgSlNDOjpCMworCisjZW5kaWYg
Ly8gQjNTdGFja1Nsb3RWYWx1ZV9oCisKSW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9C
M1N0YWNrbWFwLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNT
dGFja21hcC5jcHAJKHJldmlzaW9uIDApCisrKyBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNT
dGFja21hcC5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSw0MCBAQAorLyoKKyAqIENvcHly
aWdodCAoQykgMjAxNSBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVk
aXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3
aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUg
Zm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMg
b2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90
aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVy
LgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRo
ZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMg
YW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24g
YW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisg
KgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIGBgQVMgSVMnJyBB
TkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQg
Tk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJ
TElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJ
TUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJF
IExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisg
KiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9U
IExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJ
Q0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVS
UlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElU
WSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElO
Q0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBP
RiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBP
U1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLiAKKyAqLworCisjaW5jbHVkZSAiY29uZmlnLmgiCisj
aW5jbHVkZSAiQjNTdGFja21hcC5oIgorCituYW1lc3BhY2UgSlNDIHsgbmFtZXNwYWNlIEIzIHsK
Kwordm9pZCBTdGFja21hcDo6ZHVtcChQcmludFN0cmVhbSYgb3V0KSBjb25zdAoreworICAgIG91
dC5wcmludCgKKyAgICAgICAgIntvcGFxdWUgPSAiLCBSYXdQb2ludGVyKG1fb3BhcXVlKSwgIiwg
cmVwcyA9ICIsIGxpc3REdW1wKG1fcmVwcyksCisgICAgICAgICIsIGdlbmVyYXRvciA9ICIsIFJh
d1BvaW50ZXIobV9nZW5lcmF0b3IuZ2V0KCkpLCAiLCBjbG9iYmVyZWQgPSAiLCBtX2Nsb2JiZXJl
ZCwKKyAgICAgICAgIiwgdXNlZFJlZ2lzdGVycyA9ICIsIG1fdXNlZFJlZ2lzdGVycywgIn0iKTsK
K30KKworfSB9IC8vIG5hbWVzcGFjZSBKU0M6OkIzCisKSW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0
Q29yZS9iMy9CM1N0YWNrbWFwLmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRDb3Jl
L2IzL0IzU3RhY2ttYXAuaAkocmV2aXNpb24gMCkKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9i
My9CM1N0YWNrbWFwLmgJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSwxMjYgQEAKKy8qCisgKiBD
b3B5cmlnaHQgKEMpIDIwMTUgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAq
IFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGgg
b3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQg
dGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRp
b25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAg
IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xh
aW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVj
ZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRp
b25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0
aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9u
LgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFTIElT
JycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywg
QlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFO
VEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElT
Q0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IKKyAqIENPTlRSSUJVVE9S
UyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFM
LAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVU
IE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBT
RVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJ
TlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFC
SUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAq
IChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBP
VVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRI
RSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKworI2lmbmRlZiBCM1N0YWNrbWFw
X2gKKyNkZWZpbmUgQjNTdGFja21hcF9oCisKKyNpbmNsdWRlICJCM1ZhbHVlUmVwLmgiCisjaW5j
bHVkZSAiQ0NhbGxIZWxwZXJzLmgiCisjaW5jbHVkZSAiUmVnaXN0ZXJTZXQuaCIKKyNpbmNsdWRl
IDx3dGYvU2hhcmVkVGFzay5oPgorCituYW1lc3BhY2UgSlNDIHsgbmFtZXNwYWNlIEIzIHsKKwor
Y2xhc3MgQ2hlY2tTcGVjaWFsOworY2xhc3MgU3RhY2ttYXBTcGVjaWFsOworY2xhc3MgVmFsdWU7
CisKK2NsYXNzIFN0YWNrbWFwIHsKK3B1YmxpYzoKKyAgICBzdHJ1Y3QgR2VuZXJhdGlvblBhcmFt
cyB7CisgICAgICAgIC8vIFRoaXMgaXMgdGhlIFZhbHVlIGNvbnRhaW5pbmcgdGhlIHN0YWNrbWFw
LgorICAgICAgICBWYWx1ZSogdmFsdWU7CisKKyAgICAgICAgLy8gVGhpcyBpcyB0aGUgc3RhY2tt
YXAuCisgICAgICAgIFN0YWNrbWFwKiBzdGFja21hcDsKKworICAgICAgICAvLyBUaGlzIHRlbGxz
IHlvdSB0aGUgYWN0dWFsIHZhbHVlIHJlcHJlc2VudGF0aW9ucyB0aGF0IHdlcmUgY2hvc2VuLgor
ICAgICAgICBWZWN0b3I8VmFsdWVSZXA+IHJlcHM7CisKKyAgICAgICAgLy8gVGhpcyB0ZWxscyB5
b3UgdGhlIHJlZ2lzdGVycyB0aGF0IHdlcmUgdXNlZC4KKyAgICAgICAgUmVnaXN0ZXJTZXQgdXNl
ZFJlZ2lzdGVyczsKKyAgICB9OworICAgIAorICAgIHR5cGVkZWYgdm9pZCBHZW5lcmF0b3JGdW5j
dGlvbihDQ2FsbEhlbHBlcnMmLCBjb25zdCBHZW5lcmF0aW9uUGFyYW1zJik7CisgICAgdHlwZWRl
ZiBTaGFyZWRUYXNrPEdlbmVyYXRvckZ1bmN0aW9uPiBHZW5lcmF0b3I7CisgICAgCisgICAgU3Rh
Y2ttYXAoKQorICAgIHsKKyAgICB9CisKKyAgICAvLyBTZXQgc29tZSBvcGFxdWUgZGF0YSB0byBp
ZGVudGlmeSB0aGlzIHN0YWNrbWFwLiBUaGlzIGlzIHVzZWZ1bCBiZWNhdXNlIGEgU3RhY2ttYXAt
dXNpbmcgVmFsdWUKKyAgICAvLyBjYW4gYmUgZHVwbGljYXRlZCwgYW5kIGVhY2ggZHVwbGljYXRl
IG1heSBlbmQgdXAgaGF2aW5nIGRpZmZlcmVudCByZWdpc3RlciBhbGxvY2F0aW9uLiBUaGlzCisg
ICAgLy8gYWxsb3dzIGFsbCBvZiB0aG9zZSBkdXBsaWNhdGVzIHRvIGJlIGFibGUgdG8gcmVmZXIg
YmFjayB0byB3aGF0ZXZlciBoaWdoLWxldmVsIGRhdGEgc3RydWN0dXJlcworICAgIC8vIHdlIHdl
cmUgdXNpbmcgdG8gY3JlYXRlIHRoZSB2YWx1ZS4KKyAgICB2b2lkIHNldE9wYXF1ZSh2b2lkKiBw
YXJhbWV0ZXIpCisgICAgeworICAgICAgICBtX29wYXF1ZSA9IHBhcmFtZXRlcjsKKyAgICB9Cisg
ICAgdm9pZCogb3BhcXVlKCkgY29uc3QgeyByZXR1cm4gbV9vcGFxdWU7IH0KKworICAgIC8vIENv
bnZlbmllbmNlIGhlbHBlcnMgd2hlbiB1c2luZyBpbmRpY2VzIGluc3RlYWQgb2YgcG9pbnRlcnMu
CisgICAgdm9pZCBzZXRPcGFxdWVJbmRleChzaXplX3QgaW5kZXgpCisgICAgeworICAgICAgICBz
ZXRPcGFxdWUoYml0d2lzZV9jYXN0PHZvaWQqPihpbmRleCkpOworICAgIH0KKyAgICBzaXplX3Qg
b3BhcXVlSW5kZXgoKSBjb25zdCB7IHJldHVybiBiaXR3aXNlX2Nhc3Q8c2l6ZV90PihvcGFxdWUo
KSk7IH0KKworICAgIC8vIENvbnN0cmFpbiBhbiBhcmd1bWVudCB0byB0aGUgVmFsdWUgdGhhdCB1
c2VzIHRoaXMgU3RhY2ttYXAuIE5vdGUgdGhhdCBpbmRleCB6ZXJvIHJlZmVycyB0byB0aGUKKyAg
ICAvLyBmaXJzdCBhcmd1bWVudCB0byB0aGF0IFZhbHVlLCBldmVuIGlmIHRoYXQgYXJndW1lbnQg
aXMgbm90IGNvbnN0cmFpbmFibGUuIEZvciBleGFtcGxlLCBpbiBhCisgICAgLy8gQ2hlY2tBZGQg
dmFsdWUsIGl0IHdvdWxkIGJlIGFuIGVycm9yIHRvIGNvbnN0cmFpbiBpbmRpY2VzIDAgYW5kIDEu
IEluIGEgQ2hlY2sgdmFsdWUsIGl0IHdvdWxkCisgICAgLy8gYmUgYW4gZXJyb3IgdG8gY29uc3Ry
YWluIGluZGV4IDAuIEJ1dCwgd2hlbiB0aGUgZ2VuZXJhdGlvbiBjYWxsYmFjayBpcyBjYWxsZWQs
IHlvdSBjYW4gZGVwZW5kCisgICAgLy8gb24gdGhlIHJlcHMgZm9yIHRob3NlIGluZGljZXMgYmVp
bmcgZmlsbGVkIGluLgorICAgIHZvaWQgY29uc3RyYWluKHVuc2lnbmVkIGluZGV4LCBjb25zdCBW
YWx1ZVJlcCYgcmVwKQorICAgIHsKKyAgICAgICAgaWYgKGluZGV4ICsgMSA8IG1fcmVwcy5zaXpl
KCkpCisgICAgICAgICAgICBtX3JlcHMuZ3JvdyhpbmRleCArIDEpOworICAgICAgICBtX3JlcHNb
aW5kZXhdID0gcmVwOworICAgIH0KKworICAgIHZvaWQgY2xvYmJlcihjb25zdCBSZWdpc3RlclNl
dCYgc2V0KQorICAgIHsKKyAgICAgICAgbV9jbG9iYmVyZWQubWVyZ2Uoc2V0KTsKKyAgICB9CisK
KyAgICBjb25zdCBSZWdpc3RlclNldCYgY2xvYmJlcmVkKCkgY29uc3QgeyByZXR1cm4gbV9jbG9i
YmVyZWQ7IH0KKworICAgIHZvaWQgc2V0R2VuZXJhdG9yKFJlZlB0cjxHZW5lcmF0b3I+IGdlbmVy
YXRvcikKKyAgICB7CisgICAgICAgIG1fZ2VuZXJhdG9yID0gZ2VuZXJhdG9yOworICAgIH0KKwor
ICAgIHRlbXBsYXRlPHR5cGVuYW1lIEZ1bmN0b3I+CisgICAgdm9pZCBzZXRHZW5lcmF0b3IoY29u
c3QgRnVuY3RvciYgZnVuY3RvcikKKyAgICB7CisgICAgICAgIG1fZ2VuZXJhdG9yID0gY3JlYXRl
U2hhcmVkVGFzazxHZW5lcmF0b3JGdW5jdGlvbj4oZnVuY3Rvcik7CisgICAgfQorCisgICAgdm9p
ZCBkdW1wKFByaW50U3RyZWFtJikgY29uc3Q7CisgICAgCitwcml2YXRlOgorICAgIGZyaWVuZCBj
bGFzcyBDaGVja1NwZWNpYWw7CisgICAgZnJpZW5kIGNsYXNzIFN0YWNrbWFwU3BlY2lhbDsKKyAg
ICAKKyAgICB2b2lkKiBtX29wYXF1ZSB7IG51bGxwdHIgfTsKKyAgICBWZWN0b3I8VmFsdWVSZXA+
IG1fcmVwczsKKyAgICBSZWZQdHI8R2VuZXJhdG9yPiBtX2dlbmVyYXRvcjsKKyAgICBSZWdpc3Rl
clNldCBtX2Nsb2JiZXJlZDsKKyAgICBSZWdpc3RlclNldCBtX3VzZWRSZWdpc3RlcnM7IC8vIFN0
YWNrbWFwcyBjb3VsZCBiZSBmdXJ0aGVyIGR1cGxpY2F0ZWQgYnkgQWlyLCBidXQgdGhhdCdzIHVu
bGlrZWx5LCBzbyB3ZSBqdXN0IG1lcmdlIHRoZSB1c2VkIHJlZ2lzdGVycyBzZXRzIGlmIHRoYXQg
d2VyZSB0byBoYXBwZW4uCit9OworCit9IH0gLy8gbmFtZXNwYWNlIEpTQzo6QjMKKworI2VuZGlm
IC8vIEIzU3RhY2ttYXBfaAorCkluZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNTdGFj
a21hcFNwZWNpYWwuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9C
M1N0YWNrbWFwU3BlY2lhbC5jcHAJKHJldmlzaW9uIDApCisrKyBTb3VyY2UvSmF2YVNjcmlwdENv
cmUvYjMvQjNTdGFja21hcFNwZWNpYWwuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsMjQy
IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE1IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNl
cnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5
IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBw
cm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEu
IFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29w
eXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9s
bG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0g
bXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxp
c3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICog
ICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhl
IGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExF
IElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVT
LCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJ
RVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBV
UlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SCisg
KiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURF
TlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJ
TkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRV
VEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsg
T1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9S
WQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZ
LCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5H
IElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYg
QURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisKKyNpbmNs
dWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJCM1N0YWNrbWFwU3BlY2lhbC5oIgorCituYW1lc3Bh
Y2UgSlNDIHsgbmFtZXNwYWNlIEIzIHsKKwordXNpbmcgbmFtZXNwYWNlIEFpcjsKKworU3RhY2tt
YXBTcGVjaWFsOjpTdGFja21hcFNwZWNpYWwoY29uc3QgY2hhciogbmFtZSkKKyAgICA6IFNwZWNp
YWwobmFtZSkKK3sKK30KKworU3RhY2ttYXBTcGVjaWFsOjp+U3RhY2ttYXBTcGVjaWFsKCkKK3sK
K30KKwordm9pZCBTdGFja21hcFNwZWNpYWw6OmZvckVhY2hBcmcoSW5zdCYgaW5zdCwgY29uc3Qg
U2NvcGVkTGFtYmRhPEluc3Q6OkVhY2hBcmdDYWxsYmFjaz4mIGNhbGxiYWNrKQoreworICAgIHJl
dHVybiBmb3JFYWNoQXJnSW1wbCgwLCAxLCBpbnN0LCBjYWxsYmFjayk7Cit9CisKK2Jvb2wgU3Rh
Y2ttYXBTcGVjaWFsOjppc1ZhbGlkKEluc3QmIGluc3QpCit7CisgICAgcmV0dXJuIGlzVmFsaWRJ
bXBsKDAsIDEsIGluc3QpOworfQorCitib29sIFN0YWNrbWFwU3BlY2lhbDo6YWRtaXRzU3RhY2so
SW5zdCYgaW5zdCwgdW5zaWduZWQgYXJnSW5kZXgpCit7CisgICAgcmV0dXJuIGFkbWl0c1N0YWNr
KDAsIDEsIGluc3QsIGFyZ0luZGV4KTsKK30KKwordm9pZCBTdGFja21hcFNwZWNpYWw6OnJlcG9y
dFVzZWRSZWdpc3RlcnMoSW5zdCYgaW5zdCwgY29uc3QgUmVnaXN0ZXJTZXQmIHVzZWRSZWdpc3Rl
cnMpCit7CisgICAgVmFsdWUqIHZhbHVlID0gaW5zdC5vcmlnaW47CisgICAgU3RhY2ttYXAqIHN0
YWNrbWFwID0gdmFsdWUtPnN0YWNrbWFwKCk7CisKKyAgICAvLyBGSVhNRTogSWYgdGhlIEluc3Qg
dGhhdCB1c2VzIHRoZSBTdGFja21hcFNwZWNpYWwgZ2V0cyBkdXBsaWNhdGVkLCB0aGVuIHdlIGVu
ZCB1cCBtZXJnaW5nIHVzZWQKKyAgICAvLyByZWdpc3RlciBzZXRzIGZyb20gbXVsdGlwbGUgcGxh
Y2VzLiBUaGlzIGN1cnJlbnRseSB3b24ndCBoYXBwZW4gc2luY2UgQWlyIGRvZXNuJ3QgaGF2ZSB0
YWlsZHVwCisgICAgLy8gb3IgdGhpbmdzIGxpa2UgdGhhdC4gQnV0IG1heWJlIGV2ZW50dWFsbHkg
aXQgY291bGQgYmUgYSBwcm9ibGVtLgorICAgIHN0YWNrbWFwLT5tX3VzZWRSZWdpc3RlcnMubWVy
Z2UodXNlZFJlZ2lzdGVycyk7Cit9CisKK2NvbnN0IFJlZ2lzdGVyU2V0JiBTdGFja21hcFNwZWNp
YWw6OmV4dHJhQ2xvYmJlcmVkUmVncyhJbnN0JiBpbnN0KQoreworICAgIFZhbHVlKiB2YWx1ZSA9
IGluc3Qub3JpZ2luOworICAgIFN0YWNrbWFwKiBzdGFja21hcCA9IHZhbHVlLT5zdGFja21hcCgp
OworCisgICAgcmV0dXJuIHN0YWNrbWFwLT5jbG9iYmVyZWQoKTsKK30KKwordm9pZCBTdGFja21h
cFNwZWNpYWw6OmZvckVhY2hBcmdJbXBsKAorICAgIHVuc2lnbmVkIG51bUlnbm9yZWRCM0FyZ3Ms
IHVuc2lnbmVkIG51bUlnbm9yZWRBaXJBcmdzLAorICAgIEluc3QmIGluc3QsIGNvbnN0IFNjb3Bl
ZExhbWJkYTxJbnN0OjpFYWNoQXJnQ2FsbGJhY2s+JiBjYWxsYmFjaykKK3sKKyAgICBWYWx1ZSog
dmFsdWUgPSBpbnN0Lm9yaWdpbjsKKworICAgIC8vIENoZWNrIHRoYXQgaW5zYW5lIHRoaW5ncyBo
YXZlIG5vdCBoYXBwZW5lZC4KKyAgICBBU1NFUlQoaW5zdC5hcmdzLnNpemUoKSA+PSBudW1JZ25v
cmVkQWlyQXJncyk7CisgICAgQVNTRVJUKHZhbHVlLT5jaGlsZHJlbi5zaXplKCkgPj0gbnVtSWdu
b3JlZEIzQXJncyk7CisgICAgQVNTRVJUKGluc3QuYXJncy5zaXplKCkgLSBudW1JZ25vcmVkQWly
QXJncyA9PSB2YWx1ZS0+Y2hpbGRyZW4uc2l6ZSgpIC0gbnVtSWdub3JlZEIzQXJncyk7CisgICAg
CisgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IGluc3QuYXJncy5zaXplKCkgLSBudW1JZ25v
cmVkQjNBcmdzOyArK2kpIHsKKyAgICAgICAgQXJnJiBhcmcgPSBpbnN0LmFyZ3NbaSArIG51bUln
bm9yZWRCM0FyZ3NdOworICAgICAgICBWYWx1ZSogY2hpbGQgPSB2YWx1ZS0+Y2hpbGQoaSArIG51
bUlnbm9yZWRBaXJBcmdzKTsKKworICAgICAgICBjYWxsYmFjayhhcmcsIEFyZzo6VXNlLCBBcmc6
OnR5cGVGb3JCM1R5cGUoY2hpbGQtPnR5cGUoKSkpOworICAgIH0KK30KKworYm9vbCBTdGFja21h
cFNwZWNpYWw6OmlzVmFsaWRJbXBsKAorICAgIHVuc2lnbmVkIG51bUlnbm9yZWRCM0FyZ3MsIHVu
c2lnbmVkIG51bUlnbm9yZWRBcmdBcmdzLAorICAgIEluc3QmIGluc3QpCit7CisgICAgVmFsdWUq
IHZhbHVlID0gaW5zdC5vcmlnaW47CisKKyAgICAvLyBDaGVjayB0aGF0IGluc2FuZSB0aGluZ3Mg
aGF2ZSBub3QgaGFwcGVuZWQuCisgICAgQVNTRVJUKGluc3QuYXJncy5zaXplKCkgPj0gbnVtSWdu
b3JlZEFpckFyZ3MpOworICAgIEFTU0VSVCh2YWx1ZS0+Y2hpbGRyZW4uc2l6ZSgpID49IG51bUln
bm9yZWRCM0FyZ3MpOworCisgICAgU3RhY2ttYXAqIHN0YWNrbWFwID0gdmFsdWUtPnN0YWNrbWFw
KCk7CisKKyAgICBBU1NFUlQoc3RhY2ttYXApOworCisgICAgLy8gRm9yIHRoZSBJbnN0IHRvIGJl
IHZhbGlkLCBpdCBuZWVkcyB0byBoYXZlIHRoZSByaWdodCBudW1iZXIgb2YgYXJndW1lbnRzLgor
ICAgIGlmIChpbnN0LmFyZ3Muc2l6ZSgpIC0gbnVtSWdub3JlZEFpckFyZ3MgIT0gdmFsdWUtPmNo
aWxkcmVuLnNpemUoKSAtIG51bUlnbm9yZWRCM0FyZ3MpCisgICAgICAgIHJldHVybiBmYWxzZTsK
KworICAgIC8vIFJlZ2FyZGxlc3Mgb2YgY29uc3RyYWludHMsIHN0YWNrbWFwcyBoYXZlIHNvbWUg
YmFzaWMgcmVxdWlyZW1lbnRzIGZvciB0aGVpciBhcmd1bWVudHMuIEZvcgorICAgIC8vIGV4YW1w
bGUsIHlvdSBjYW4ndCBoYXZlIGEgbm9uLUZQLW9mZnNldCBhZGRyZXNzLiBUaGlzIHZlcmlmaWVz
IHRob3NlIGNvbmRpdGlvbnMgYXMgd2VsbCBhcyB0aGUKKyAgICAvLyBhcmd1bWVudCB0eXBlcy4K
KyAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgaW5zdC5hcmdzLnNpemUoKSAtIG51bUlnbm9y
ZWRCM0FyZ3M7ICsraSkgeworICAgICAgICBWYWx1ZSogY2hpbGQgPSB2YWx1ZS0+Y2hpbGQoaSAr
IG51bUlnbm9yZWRCM0FyZ3MpOworICAgICAgICBBcmcmIGFyZyA9IGluc3QuYXJnc1tpICsgbnVt
SWdub3JlZEFpckFyZ3NdOworICAgICAgICAKKyAgICAgICAgc3dpdGNoIChhcmcua2luZCgpKSB7
CisgICAgICAgIGNhc2UgQXJnOjpUbXA6CisgICAgICAgIGNhc2UgQXJnOjpJbW06CisgICAgICAg
IGNhc2UgQXJnOjpJbW02NDoKKyAgICAgICAgY2FzZSBBcmc6OlN0YWNrOgorICAgICAgICBjYXNl
IEFyZzo6Q2FsbEFyZzoKKyAgICAgICAgICAgIGJyZWFrOyAvLyBPSworICAgICAgICBjYXNlIEFy
Zzo6QWRkcjoKKyAgICAgICAgICAgIGlmIChhcmcuYmFzZSgpICE9IFRtcChHUFJJbmZvOjpjYWxs
RnJhbWVSZWdpc3RlcikgJiYKKyAgICAgICAgICAgICAgICBhcmcuYmFzZSgpICE9IFRtcChNYWNy
b0Fzc2VtYmxlcjo6c3RhY2tQb2ludGVyUmVnaXN0ZXIpKQorICAgICAgICAgICAgICAgIHJldHVy
biBmYWxzZTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAg
ICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICBBcmc6OlR5cGUg
dHlwZSA9IEFyZzo6dHlwZUZvckIzVHlwZShjaGlsZC0+dHlwZSgpKTsKKworICAgICAgICBpZiAo
IWFyZy5pc1R5cGUodHlwZSkpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisg
ICAgLy8gVGhlIG51bWJlciBvZiBjb25zdHJhaW50cyBoYXMgdG8gYmUgbm8gZ3JlYXRlciB0aGFu
IHRoZSBudW1iZXIgb2YgQjMgY2hpbGRyZW4uCisgICAgQVNTRVJUKHN0YWNrbWFwLT5tX3JlcHMu
c2l6ZSgpIDw9IHZhbHVlLT5jaGlsZHJlbi5zaXplKCkpOworCisgICAgLy8gVmVyaWZ5IGFueSBl
eHBsaWNpdGx5IHN1cHBsaWVkIGNvbnN0cmFpbnRzLgorICAgIGZvciAodW5zaWduZWQgaSA9IG51
bUlnbm9yZWRCM0FyZ3M7IGkgPCBzdGFja21hcC0+bV9yZXBzLnNpemUoKTsgKytpKSB7CisgICAg
ICAgIFZhbHVlKiBjaGlsZCA9IHZhbHVlLT5jaGlsZChpKTsKKyAgICAgICAgVmFsdWVSZXAmIHJl
cCA9IHN0YWNrbWFwLT5tX3JlcHNbaV07CisgICAgICAgIEFyZyYgYXJnID0gaW5zdC5hcmdzW2kg
LSBudW1JZ25vcmVkQjNBcmdzICsgbnVtSWdub3JlZEFpckFyZ3NdOworCisgICAgICAgIHN3aXRj
aCAocmVwLmtpbmQoKSkgeworICAgICAgICBjYXNlIFZhbHVlUmVwOjpBbnk6CisgICAgICAgICAg
ICAvLyBXZSBhbHJlYWR5IHZlcmlmaWVkIHRoaXMgYWJvdmUuCisgICAgICAgICAgICBicmVhazsK
KyAgICAgICAgY2FzZSBWYWx1ZVJlcDo6U29tZVJlZ2lzdGVyOgorICAgICAgICAgICAgaWYgKCFh
cmcuaXNUbXAoKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICBi
cmVhazsKKyAgICAgICAgY2FzZSBWYWx1ZVJlcDo6UmVnaXN0ZXI6CisgICAgICAgICAgICBpZiAo
YXJnICE9IFRtcChyZXAucmVnKCkpKQorICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAg
ICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFZhbHVlUmVwOjpTdGFjazoKKyAgICAgICAg
ICAgIC8vIFRoaXMgaXMgbm90IGEgdmFsaWQgaW5wdXQgcmVwcmVzZW50YXRpb24uCisgICAgICAg
ICAgICBBU1NFUlRfTk9UX1JFQUNIRUQoKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBj
YXNlIFZhbHVlUmVwOjpTdGFja0FyZ3VtZW50OgorICAgICAgICAgICAgaWYgKGFyZyAhPSBBcmc6
OmNhbGxBcmcocmVwLm9mZnNldEZyb21TUCgpKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFs
c2U7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBWYWx1ZVJlcDo6Q29uc3RhbnQ6
CisgICAgICAgICAgICAvLyBUaGlzIGlzIG5vdCBhIHZhbGlkIGlucHV0IHJlcHJlc2VudGF0aW9u
LgorICAgICAgICAgICAgQVNTRVJUX05PVF9SRUFDSEVEKCk7CisgICAgICAgICAgICBicmVhazsK
KyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiB0cnVlOworfQorCitib29sIFN0YWNrbWFw
U3BlY2lhbDo6YWRtaXRzU3RhY2tJbXBsKAorICAgIHVuc2lnbmVkIG51bUlnbm9yZWRCM0FyZ3Ms
IHVuc2lnbmVkIG51bUlnbm9yZWRBaXJBcmdzLAorICAgIEluc3QmIGluc3QsIHVuc2lnbmVkIGFy
Z0luZGV4KQoreworICAgIFZhbHVlKiB2YWx1ZSA9IGluc3Qub3JpZ2luOworICAgIFN0YWNrbWFw
KiBzdGFja21hcCA9IHZhbHVlLT5zdGFja21hcCgpOworCisgICAgdW5zaWduZWQgc3RhY2ttYXBB
cmdJbmRleCA9IGFyZ0luZGV4IC0gbnVtSWdub3JlZEFpckFyZ3MgKyBudW1JZ25vcmVkQjNBcmdz
OworCisgICAgaWYgKHN0YWNrbWFwQXJnSW5kZXggPj0gc3RhY2ttYXAtPm1fcmVwcy5zaXplKCkp
IHsKKyAgICAgICAgLy8gVGhpcyBtZWFucyB0aGF0IHRoZXJlIHdhcyBubyBjb25zdHJhaW50Lgor
ICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgCisgICAgLy8gV2Ugb25seSBhZG1pdCBz
dGFjayBmb3IgQW55J3MsIHNpbmNlIFN0YWNrIGlzIG5vdCBhIHZhbGlkIGlucHV0IGNvbnN0cmFp
bnQsIGFuZCBTdGFja0FyZ3VtZW50CisgICAgLy8gdHJhbnNsYXRlcyB0byBhIENhbGxBcmcgaW4g
QWlyLgorICAgIGlmIChzdGFja21hcC0+bV9yZXBzW3N0YWNrbWFwQXJnSW5kZXhdLmtpbmQoKSA9
PSBBbnkpCisgICAgICAgIHJldHVybiB0cnVlOworCisgICAgcmV0dXJuIGZhbHNlOworfQorCitW
ZWN0b3I8VmFsdWVSZXA+IFN0YWNrbWFwU3BlY2lhbDo6cmVwcyhHZW5lcmF0aW9uQ29udGV4dCYg
Y29udGV4dCwgSW5zdCYgaW5zdCkKK3sKKyAgICBWZWN0b3I8VmFsdWVSZXA+IHJlc3VsdDsKKyAg
ICBhcHBlbmRSZXBzSW1wbChjb250ZXh0LCAxLCBpbnN0LCByZXN1bHQpOworICAgIHJldHVybiBy
ZXN1bHQ7Cit9CisKK3ZvaWQgU3RhY2ttYXBTcGVjaWFsOjphcHBlbmRSZXBzSW1wbCgKKyAgICBH
ZW5lcmF0aW9uQ29udGV4dCYgY29udGV4dCwgdW5zaWduZWQgbnVtSWdub3JlZEFyZ3MsIEluc3Qm
IGluc3QsIFZlY3RvcjxWYWx1ZVJlcD4mIHJlc3VsdCkKK3sKKyAgICBmb3IgKHVuc2lnbmVkIGkg
PSBudW1JZ25vcmVkQXJnczsgaSA8IGluc3QuYXJncy5zaXplKCk7ICsraSkKKyAgICAgICAgcmVz
dWx0LmFwcGVuZChyZXBGb3JBcmcoY29udGV4dC5jb2RlLCBhcmcpKTsKKyAgICAgICAgQXJnJiBh
cmcgPSBpbnN0LmFyZ3NbaV07CisgICAgfQorfQorCitWYWx1ZVJlcCBTdGFja21hcFNwZWNpYWw6
OnJlcEZvckFyZyhDb2RlJiBjb2RlLCBjb25zdCBBcmcmIGFyZykKK3sKKyAgICBzd2l0Y2ggKGFy
Zy5raW5kKCkpIHsKKyAgICBjYXNlIFRtcDoKKyAgICAgICAgcmV0dXJuIFZhbHVlUmVwOjpyZWco
YXJnLnJlZygpKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBJbW06CisgICAgY2FzZSBJbW02
NDoKKyAgICAgICAgcmV0dXJuIFZhbHVlUmVwOjpjb25zdGFudChhcmcudmFsdWUoKSk7CisgICAg
ICAgIGJyZWFrOworICAgIGNhc2UgQWRkcjoKKyAgICAgICAgaWYgKGFyZy5iYXNlKCkgPT0gR1BS
SW5mbzo6Y2FsbEZyYW1lUmVnaXN0ZXIpCisgICAgICAgICAgICByZXR1cm4gVmFsdWVSZXA6OnN0
YWNrKGFyZy5vZmZzZXQoKSk7CisgICAgICAgIEFTU0VSVChhcmcuYmFzZSgpID09IE1hY3JvQXNz
ZW1ibGVyOjpzdGFja1BvaW50ZXJSZWdpc3Rlcik7CisgICAgICAgIHJldHVybiBWYWx1ZVJlcDo6
c3RhY2soYXJnLm9mZnNldCgpIC0gY29kZS5mcmFtZU9mZnNldCk7CisgICAgZGVmYXVsdDoKKyAg
ICAgICAgQVNTRVJUX05PVF9SRUFDSEVEKCk7CisgICAgICAgIHJldHVybiBWYWx1ZVJlcCgpOwor
ICAgIH0KK30KKworfSB9IC8vIG5hbWVzcGFjZSBKU0M6OkIzCisKKwpJbmRleDogU291cmNlL0ph
dmFTY3JpcHRDb3JlL2IzL0IzU3RhY2ttYXBTcGVjaWFsLmgKPT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNl
L0phdmFTY3JpcHRDb3JlL2IzL0IzU3RhY2ttYXBTcGVjaWFsLmgJKHJldmlzaW9uIDApCisrKyBT
b3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNTdGFja21hcFNwZWNpYWwuaAkod29ya2luZyBjb3B5
KQpAQCAtMCwwICsxLDc1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE1IEFwcGxlIEluYy4g
QWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNv
dXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwg
YXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICog
YXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFp
biB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRp
b25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMg
aW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAg
bm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFp
bWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHBy
b3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBS
T1ZJREVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1Q
TElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJ
TVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBB
UlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBB
UFBMRSBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJ
TkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVO
VElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVN
RU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBP
UgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBB
TkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBT
VFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RI
RVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09G
VFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0Uu
IAorICovCisKKyNpZm5kZWYgQjNTdGFja21hcFNwZWNpYWxfaAorI2RlZmluZSBCM1N0YWNrbWFw
U3BlY2lhbF9oCisKKyNpbmNsdWRlICJBaXJTcGVjaWFsLmgiCisjaW5jbHVkZSAiQjNTdGFja21h
cC5oIgorCituYW1lc3BhY2UgSlNDIHsgbmFtZXNwYWNlIEIzIHsKKworLy8gVGhpcyBpcyBhIGJh
c2UgY2xhc3MgZm9yIHNwZWNpYWxzIHRoYXQgaGF2ZSBzdGFja21hcHMuIE5vdGUgdGhhdCBpdCBj
YW4gZmluZCB0aGUgU3RhY2ttYXAgYnkKKy8vIGFza2luZyBmb3IgdGhlIEluc3QncyBvcmlnaW4u
IEhlbmNlLCB0aGVzZSBvYmplY3RzIGRvbid0IG5lZWQgdG8gZXZlbiBob2xkIGEgcmVmZXJlbmNl
IHRvIHRoZQorLy8gU3RhY2ttYXAuCisKK2NsYXNzIFN0YWNrbWFwU3BlY2lhbCA6IHB1YmxpYyBB
aXI6OlNwZWNpYWwgeworcHVibGljOgorICAgIFN0YWNrbWFwU3BlY2lhbChjb25zdCBjaGFyKiBu
YW1lKTsKKyAgICB2aXJ0dWFsIH5TdGFja21hcFNwZWNpYWwoKTsKKworcHJvdGVjdGVkOgorICAg
IHZvaWQgZm9yRWFjaEFyZyhBaXI6Okluc3QmLCBjb25zdCBTY29wZWRMYW1iZGE8QWlyOjpJbnN0
OjpFYWNoQXJnQ2FsbGJhY2s+Jikgb3ZlcnJpZGU7CisgICAgYm9vbCBpc1ZhbGlkKEFpcjo6SW5z
dCYpIG92ZXJyaWRlOworICAgIGJvb2wgYWRtaXRzU3RhY2soQWlyOjpJbnN0JiwgdW5zaWduZWQg
YXJnSW5kZXgpIG92ZXJyaWRlOworICAgIHZvaWQgcmVwb3J0VXNlZFJlZ2lzdGVycyhBaXI6Oklu
c3QmLCBjb25zdCBSZWdpc3RlclNldCYpIG92ZXJyaWRlOworICAgIGNvbnN0IFJlZ2lzdGVyU2V0
JiBleHRyYUNsb2JiZXJlZFJlZ3MoQWlyOjpJbnN0Jikgb3ZlcnJpZGU7CisKKyAgICAvLyBOb3Rl
IHRoYXQgdGhpcyBkb2VzIG5vdCBvdmVycmlkZSBnZW5lcmF0ZSgpIG9yIGRlZXBEdW1wSW1wbCgp
LiBXZSBoYXZlIG1hbnkgc29tZSBzdWJjbGFzc2VzCisgICAgLy8gdGhhdCBpbXBsZW1lbnQgdGhh
dC4KKworICAgIHZvaWQgZm9yRWFjaEFyZ0ltcGwoCisgICAgICAgIHVuc2lnbmVkIG51bUlnbm9y
ZWRCM0FyZ3MsIHVuc2lnbmVkIG51bUlnbm9yZWRBaXJBcmdzLAorICAgICAgICBBaXI6Okluc3Qm
LCBjb25zdCBTY29wZWRMYW1iZGE8QWlyOjpJbnN0OjpFYWNoQXJnQ2FsbGJhY2s+Jik7CisgICAg
Ym9vbCBpc1ZhbGlkSW1wbCgKKyAgICAgICAgdW5zaWduZWQgbnVtSWdub3JlZEIzQXJncywgdW5z
aWduZWQgbnVtSWdub3JlZEFpckFyZ3MsCisgICAgICAgIEFpcjo6SW5zdCYpOworICAgIGJvb2wg
YWRtaXRzU3RhY2tJbXBsKAorICAgICAgICB1bnNpZ25lZCBudW1JZ25vcmVkQjNBcmdzLCB1bnNp
Z25lZCBudW1JZ25vcmVkQWlyQXJncywKKyAgICAgICAgQWlyOjpJbnN0Jik7CisKKyAgICAvLyBH
ZXRzIHRoZSByZXBzIGFycmF5IHRoZSB3YXkgdGhhdCB0aGUgc3RhY2ttYXAgZ2VuZXJhdG9yIGNh
bGxiYWNrIHdvdWxkIHdhbnQuCisgICAgVmVjdG9yPFZhbHVlUmVwPiByZXBzKEFpcjo6R2VuZXJh
dGlvbkNvbnRleHQmLCBBaXI6Okluc3QmKTsKKworICAgIC8vIEFwcGVuZHMgdGhlIHJlcHMgZm9y
IHRoZSBJbnN0J3MgYXJncywgc3RhcnRpbmcgd2l0aCBudW1JZ25vcmVkQXJncywgdG8gdGhlIGdp
dmVuIHZlY3Rvci4KKyAgICB2b2lkIGFwcGVuZFJlcHNJbXBsKEFpcjo6R2VuZXJhdGlvbkNvbnRl
eHQmLCB1bnNpZ25lZCBudW1JZ25vcmVkQXJncywgQWlyOjpJbnN0JiwgVmVjdG9yPFZhbHVlUmVw
PiYpOworCisgICAgc3RhdGljIFZhbHVlUmVwIHJlcEZvckFyZyhBaXI6OkNvZGUmLCBjb25zdCBB
aXI6OkFyZyYpOworfTsKKworfSB9IC8vIG5hbWVzcGFjZSBKU0M6OkIzCisKKyNlbmRpZiAvLyBC
M1N0YWNrbWFwU3BlY2lhbF9oCisKSW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM1N3
aXRjaENhc2UuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM1N3
aXRjaENhc2UuY3BwCShyZXZpc2lvbiAwKQorKysgU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0Iz
U3dpdGNoQ2FzZS5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSwzOSBAQAorLyoKKyAqIENv
cHlyaWdodCAoQykgMjAxNSBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICog
UmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBv
ciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0
aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlv
bnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAg
bm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFp
bWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNl
IHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlv
bnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRp
b24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24u
CisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIGBgQVMgSVMn
JyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBC
VVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5U
QUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVND
TEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUgorICogQ09OVFJJQlVUT1JT
IEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUws
CisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQg
Tk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNF
UlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElO
VEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJ
TElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICog
KElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9V
VCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhF
IFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLiAKKyAqLworCisjaW5jbHVkZSAiY29uZmlnLmgi
CisjaW5jbHVkZSAiQjNTd2l0Y2hDYXNlLmgiCisKKyNpbmNsdWRlICJCM0Jhc2ljQmxvY2suaCIK
KworbmFtZXNwYWNlIEpTQyB7IG5hbWVzcGFjZSBCMyB7CisKK3ZvaWQgU3dpdGNoQ2FzZTo6ZHVt
cChQcmludFN0cmVhbSYgb3V0KSBjb25zdAoreworICAgIG91dC5wcmludChtX2Nhc2VWYWx1ZSwg
Ii0+IiwgcG9pbnRlckR1bXAobV90YXJnZXQpKTsKK30KKworfSB9IC8vIG5hbWVzcGFjZSBKU0M6
OkIzCisKSW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM1N3aXRjaENhc2UuaAo9PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNTd2l0Y2hDYXNlLmgJKHJldmlz
aW9uIDApCisrKyBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNTd2l0Y2hDYXNlLmgJKHdvcmtp
bmcgY29weSkKQEAgLTAsMCArMSw2MyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNSBBcHBs
ZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVz
ZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmlj
YXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlv
bnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVz
dCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2Yg
Y29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmli
dXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQK
KyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcg
ZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVy
aWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FS
RSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNT
IE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRI
RQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBG
T1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQg
U0hBTEwgQVBQTEUgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJ
UkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENP
TlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQ
Uk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwg
REFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBD
QVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05U
UkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNF
IE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBU
SElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0gg
REFNQUdFLiAKKyAqLworCisjaWZuZGVmIEIzU3dpdGNoQ2FzZV9oCisjZGVmaW5lIEIzU3dpdGNo
Q2FzZV9oCisKKyNpbmNsdWRlIDx3dGYvU3RkTGliRXh0cmFzLmg+CisjaW5jbHVkZSA8d3RmL1By
aW50U3RyZWFtLmg+CisKK25hbWVzcGFjZSBKU0MgeyBuYW1lc3BhY2UgQjMgeworCitjbGFzcyBC
YXNpY0Jsb2NrOworCitjbGFzcyBTd2l0Y2hDYXNlIHsKK3B1YmxpYzoKKyAgICBTd2l0Y2hDYXNl
KCkKKyAgICB7CisgICAgfQorCisgICAgU3dpdGNoQ2FzZShpbnQ2NF90IGNhc2VWYWx1ZSwgQmFz
aWNCbG9jayogdGFyZ2V0KQorICAgICAgICA6IG1fY2FzZVZhbHVlKGNhc2VWYWx1ZSkKKyAgICAg
ICAgLCBtX3RhcmdldCh0YXJnZXQpCisgICAgeworICAgIH0KKworICAgIGV4cGxpY2l0IG9wZXJh
dG9yIGJvb2woKSBjb25zdCB7IHJldHVybiAhIW1fdGFyZ2V0OyB9CisKKyAgICBpbnQ2NF90IGNh
c2VWYWx1ZSgpIGNvbnN0IHsgcmV0dXJuIG1fY2FzZVZhbHVlOyB9CisgICAgQmFzaWNCbG9jayog
dGFyZ2V0KCkgY29uc3QgeyByZXR1cm4gbV90YXJnZXQ7IH0KKworICAgIHZvaWQgZHVtcChQcmlu
dFN0cmVhbSYgb3V0KSBjb25zdDsKKworcHJpdmF0ZToKKyAgICBpbnQ2NF90IGNhc2VWYWx1ZTsK
KyAgICBCYXNpY0Jsb2NrKiB0YXJnZXQ7Cit9OworCit9IH0gLy8gbmFtZXNwYWNlIEpTQzo6QjMK
KworI2VuZGlmIC8vIEIzU3dpdGNoQ2FzZV9oCisKSW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29y
ZS9iMy9CM1N3aXRjaFZhbHVlLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENv
cmUvYjMvQjNTd2l0Y2hWYWx1ZS5jcHAJKHJldmlzaW9uIDApCisrKyBTb3VyY2UvSmF2YVNjcmlw
dENvcmUvYjMvQjNTd2l0Y2hWYWx1ZS5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSw2MyBA
QAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNSBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2
ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBm
b3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJv
dmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBS
ZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHly
aWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxv
d2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11
c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0
IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAg
IGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBk
aXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJ
TkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywg
SU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVT
IE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQ
T1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUgorICog
Q09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5U
QUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5D
TFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRF
IEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9S
IEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkK
KyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwg
T1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJ
TiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFE
VklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLiAKKyAqLworCisjaW5jbHVk
ZSAiY29uZmlnLmgiCisjaW5jbGR1ZSAiQjNTd2l0Y2hWYWx1ZS5oIgorCituYW1lc3BhY2UgSlND
IHsgbmFtZXNwYWNlIEIzIHsKKworU3dpdGNoVmFsdWU6On5Td2l0Y2hWYWx1ZSgpCit7Cit9CisK
K1N3aXRjaENhc2UgU3dpdGNoVmFsdWU6OnJlbW92ZUNhc2UodW5zaWduZWQgaW5kZXgpCit7Cisg
ICAgU3dpdGNoQ2FzZSByZXN1bHQgPSBtX3N1Y2Nlc3NvcnNbaW5kZXhdOworICAgIG1fc3VjY2Vz
c29yc1tpbmRleF0gPSBtX3N1Y2Nlc3NvcnMubGFzdCgpOworICAgIG1fc3VjY2Vzc29ycy5yZW1v
dmVMYXN0KCk7CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKwordm9pZCBTd2l0Y2hWYWx1ZTo6YXBw
ZW5kQ2FzZShjb25zdCBTd2l0Y2hDYXNlJiBzd2l0Y2hDYXNlKQoreworICAgIG1fc3VjY2Vzc29y
cy5hcHBlbmQobV9zdWNjZXNzb3JzLmxhc3QoKSk7CisgICAgbV9zdWNjZXNzb3JzW21fc3VjY2Vz
c29ycy5zaXplKCkgLSAyXSA9IHN3aXRjaENhc2UudGFyZ2V0KCk7CisgICAgbV92YWx1ZXMuYXBw
ZW5kKHN3aXRjaENhc2UuY2FzZVZhbHVlKCkpOworfQorCit2b2lkIFN3aXRjaFZhbHVlOjpkdW1w
TWV0YShQcmludFN0cmVhbSYgb3V0KSBjb25zdAoreworICAgIC8vIFRoaXMgZGVzdHJ1Y3RpdmVs
eSBvdmVycmlkZXMgQ29udHJvbFZhbHVlJ3MgZHVtcE1ldGEoKS4KKyAgICBvdXQucHJpbnQobGlz
dER1bXAoKnRoaXMpKTsKK30KKworU3dpdGNoVmFsdWU6OlN3aXRjaFZhbHVlKHVuc2lnbmVkIGlu
ZGV4LCBPcmlnaW4gb3JpZ2luLCBCYXNpY0Jsb2NrKiBmYWxsVGhyb3VnaCkKKyAgICA6IENvbnRy
b2xWYWx1ZShpbmRleCwgU3dpdGNoLCBvcmlnaW4pCit7CisgICAgbV9zdWNjZXNzb3JzLmFwcGVu
ZChmYWxsVGhyb3VnaCk7Cit9CisKK30gfSAvLyBuYW1lc3BhY2UgSlNDOjpCMworCkluZGV4OiBT
b3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNTd2l0Y2hWYWx1ZS5oCj09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNv
dXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM1N3aXRjaFZhbHVlLmgJKHJldmlzaW9uIDApCisrKyBT
b3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNTd2l0Y2hWYWx1ZS5oCSh3b3JraW5nIGNvcHkpCkBA
IC0wLDAgKzEsMTIzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE1IEFwcGxlIEluYy4gQWxs
IHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJj
ZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJl
IHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJl
IG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0
aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25z
IGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4g
YmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90
aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVy
IGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3Zp
ZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJ
REVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElF
RCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBM
SUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJ
Q1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBM
RSBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJ
UkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElB
TCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5U
IE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgor
ICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQg
T04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJ
Q1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJX
SVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdB
UkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAor
ICovCisKKyNpZm5kZWYgQjNTd2l0Y2hWYWx1ZV9oCisjZGVmaW5lIEIzU3dpdGNoVmFsdWVfaAor
CisjaW5jbHVkZSAiQjNDb250cm9sVmFsdWUuaCIKKyNpbmNsdWRlICJCM1N3aXRjaENhc2UuaCIK
KworbmFtZXNwYWNlIEpTQyB7IG5hbWVzcGFjZSBCMyB7CisKK2NsYXNzIFN3aXRjaFZhbHVlIDog
cHVibGljIENvbnRyb2xWYWx1ZSB7CitwdWJsaWM6CisgICAgc3RhdGljIGJvb2wgYWNjZXB0cyhP
cGNvZGUgb3Bjb2RlKSB7IHJldHVybiBvcGNvZGUgPT0gU3dpdGNoOyB9CisKKyAgICB+U3dpdGNo
VmFsdWUoKTsKKworICAgIC8vIG51bUNhc2VWYWx1ZXMoKSArIDEgPT0gbnVtU3VjY2Vzc29ycygp
LgorICAgIHVuc2lnbmVkIG51bUNhc2VWYWx1ZXMoKSBjb25zdCB7IHJldHVybiBtX3ZhbHVlcy5z
aXplKCk7IH0KKworICAgIC8vIFRoZSBzdWNjZXNzb3IgZm9yIHRoaXMgY2FzZSB2YWx1ZSBpcyBh
dCB0aGUgc2FtZSBpbmRleC4KKyAgICBpbnQ2NF90IGNhc2VWYWx1ZSh1bnNpZ25lZCBpbmRleCkg
Y29uc3QgeyByZXR1cm4gbV92YWx1ZXNbaV07IH0KKyAgICAKKyAgICBjb25zdCBWZWN0b3I8aW50
NjRfdD4mIGNhc2VWYWx1ZXMoKSBjb25zdCB7IHJldHVybiBtX3ZhbHVlczsgfQorCisgICAgQmFz
aWNCbG9jayogZmFsbFRocm91Z2goKSBjb25zdCB7IHJldHVybiBzdWNjZXNzb3JzKCkubGFzdCgp
OyB9CisgICAgQmFzaWNCbG9jayomIGZhbGxUaHJvdWdoKCkgeyByZXR1cm4gc3VjY2Vzc29ycygp
Lmxhc3QoKTsgfQorCisgICAgdW5zaWduZWQgc2l6ZSgpIGNvbnN0IHsgcmV0dXJuIG51bUNhc2VW
YWx1ZXMoKTsgfQorICAgIFN3aXRjaENhc2UgYXQodW5zaWduZWQgaW5kZXgpIGNvbnN0CisgICAg
eworICAgICAgICByZXR1cm4gU3dpdGNoQ2FzZShjYXNlVmFsdWUoaW5kZXgpLCBzdWNjZXNzb3Io
aW5kZXgpKTsKKyAgICB9CisgICAgU3dpdGNoQ2FzZSBvcGVyYXRvcltdKHVuc2lnbmVkIGluZGV4
KSBjb25zdAorICAgIHsKKyAgICAgICAgcmV0dXJuIGF0KGluZGV4KTsKKyAgICB9CisKKyAgICBj
bGFzcyBpdGVyYXRvciB7CisgICAgcHVibGljOgorICAgICAgICBpdGVyYXRvcigpCisgICAgICAg
ICAgICA6IG1fc3dpdGNoKG51bGxwdHIpCisgICAgICAgICAgICAsIG1faW5kZXgoMCkKKyAgICAg
ICAgeworICAgICAgICB9CisKKyAgICAgICAgaXRlcmF0b3IoU3dpdGNoVmFsdWUmIHN3aXRjaFZh
bHVlLCB1bnNpZ25lZCBpbmRleCkKKyAgICAgICAgICAgIDogbV9zd2l0Y2goJnN3aXRjaFZhbHVl
KQorICAgICAgICAgICAgLCBtX2luZGV4KGluZGV4KQorICAgICAgICB7CisgICAgICAgIH0KKwor
ICAgICAgICBTd2l0Y2hDYXNlIG9wZXJhdG9yKigpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJl
dHVybiBtX3N3aXRjaC0+YXQobV9pbmRleCk7CisgICAgICAgIH0KKworICAgICAgICBpdGVyYXRv
ciYgb3BlcmF0b3IrKygpCisgICAgICAgIHsKKyAgICAgICAgICAgIG1faW5kZXgrKzsKKyAgICAg
ICAgICAgIHJldHVybiAqdGhpczsKKyAgICAgICAgfQorCisgICAgICAgIGJvb2wgb3BlcmF0b3I9
PShjb25zdCBpdGVyYXRvciYgb3RoZXIpIGNvbnN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHJl
dHVybiBtX2luZGV4ID09IG90aGVyLm1faW5kZXg7CisgICAgICAgIH0KKworICAgICAgICBib29s
IG9wZXJhdG9yIT0oY29uc3QgaXRlcmF0b3ImIG90aGVyKSBjb25zdAorICAgICAgICB7CisgICAg
ICAgICAgICByZXR1cm4gISgqdGhpcyA9PSBvdGhlcik7CisgICAgICAgIH0KKworICAgIHByaXZh
dGU6CisgICAgICAgIFN3aXRjaFZhbHVlKiBtX3N3aXRjaDsKKyAgICAgICAgdW5zaWduZWQgbV9p
bmRleDsKKyAgICB9OworCisgICAgaXRlcmF0b3IgYmVnaW4oKSBjb25zdCB7IHJldHVybiBpdGVy
YXRvcigqdGhpcywgMCk7IH0KKyAgICBpdGVyYXRvciBlbmQoKSBjb25zdCB7IHJldHVybiBpdGVy
YXRvcigqdGhpcywgc2l6ZSgpKTsgfQorCisgICAgLy8gVGhpcyByZW1vdmVzIHRoZSBjYXNlIGFu
ZCByZW9yZGVycyB0aGluZ3MgYSBiaXQuIElmIHlvdSdyZSBpdGVyYXRpbmcgdGhlIGNhc2VzIGZy
b20gMCB0byBOLAorICAgIC8vIHRoZW4geW91IGNhbiBrZWVwIGl0ZXJhdGluZyBhZnRlciB0aGlz
IHNvIGxvbmcgYXMgeW91IHJldmlzaXQgdGhpcyBzYW1lIGluZGV4ICh3aGljaCB3aWxsIG5vdwor
ICAgIC8vIGNvbnRhaW4gc29tZSBvdGhlciBjYXNlIHZhbHVlKS4gVGhpcyByZW1vdmVzIHRoZSBj
YXNlIHRoYXQgd2FzIHJlbW92ZWQuCisgICAgU3dpdGNoQ2FzZSByZW1vdmVDYXNlKHVuc2lnbmVk
IGluZGV4KTsKKworICAgIHZvaWQgYXBwZW5kQ2FzZShjb25zdCBTd2l0Y2hDYXNlJiBzd2l0Y2hD
YXNlKTsKKworcHJvdGVjdGVkOgorICAgIHZvaWQgZHVtcE1ldGEoUHJpbnRTdHJlYW0mKSBjb25z
dCBvdmVycmlkZTsKKworcHJpdmF0ZToKKyAgICBmcmllbmQgY2xhc3MgUHJvY2VkdXJlOworCisg
ICAgU3dpdGNoVmFsdWUodW5zaWduZWQgaW5kZXgsIE9yaWdpbiBvcmlnaW4sIEJhc2ljQmxvY2sq
IGZhbGxUaHJvdWdoKTsKK307CisKK30gfSAvLyBuYW1lc3BhY2UgSlNDOjpCMworCisjZW5kaWYg
Ly8gQjNTd2l0Y2hWYWx1ZV9oCisKSW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM1R5
cGUuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM1R5cGUuY3Bw
CShyZXZpc2lvbiAwKQorKysgU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzVHlwZS5jcHAJKHdv
cmtpbmcgY29weSkKQEAgLTAsMCArMSw1NCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNSBB
cHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5k
IHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2Rp
ZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRp
dGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUg
bXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qg
b2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0
cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmln
aHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dp
bmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1h
dGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZU
V0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBS
RVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8s
IFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVT
UyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZF
TlQgU0hBTEwgQVBQTEUgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5Z
IERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9S
IENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisg
KiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVT
RSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZF
UiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBD
T05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdF
TkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBP
RiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNV
Q0ggREFNQUdFLiAKKyAqLworCisjaW5jbHVkZSAiY29uZmlnLmgiCisjaW5jbHVkZSAiQjNUeXBl
LmgiCisKKyNpbmNsdWRlIDx3dGYvUHJpbnRTdHJlYW0uaD4KKworbmFtZXNwYWNlIFdURiB7CisK
K3VzaW5nIG5hbWVzcGFjZSBKU0M6OkIzOworCit2b2lkIHByaW50SW50ZXJuYWwoUHJpbnRTdHJl
YW0mIG91dCwgVHlwZSB0eXBlKQoreworICAgIHN3aXRjaCAodHlwZSkgeworICAgIGNhc2UgVm9p
ZDoKKyAgICAgICAgb3V0LnByaW50KCJWb2lkIik7CisgICAgICAgIHJldHVybjsKKyAgICBjYXNl
IEludDMyOgorICAgICAgICBvdXQucHJpbnQoIkludDMyIik7CisgICAgICAgIHJldHVybjsKKyAg
ICBjYXNlIEludDY0OgorICAgICAgICBvdXQucHJpbnQoIkludDY0Iik7CisgICAgICAgIHJldHVy
bjsKKyAgICBjYXNlIERvdWJsZToKKyAgICAgICAgb3V0LnByaW50KCJEb3VibGUiKTsKKyAgICAg
ICAgcmV0dXJuOworICAgIH0KKyAgICBSRUxFQVNFX0FTU0VSVF9OT1RfUkVBQ0hFRCgpOworfQor
Cit9IC8vIG5hbWVzcGFjZSBXVEYKSW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM1R5
cGUuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNUeXBlLmgJKHJl
dmlzaW9uIDApCisrKyBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNUeXBlLmgJKHdvcmtpbmcg
Y29weSkKQEAgLTAsMCArMSw2OCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNSBBcHBsZSBJ
bmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBp
biBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRp
b24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMK
KyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCBy
ZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29u
ZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRp
b25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAq
ICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlz
Y2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFs
cyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJ
UyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9S
IElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQor
ICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1Ig
QSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hB
TEwgQVBQTEUgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVD
VCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNF
UVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9D
VVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFU
QSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVT
RUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFD
VCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9S
IE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElT
IFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFN
QUdFLiAKKyAqLworCisjaWZuZGVmIEIzVHlwZV9oCisjZGVmaW5lIEIzVHlwZV9oCisKKyNpbmNs
dWRlIDx3dGYvU3RkTGliRXh0cmFzLmg+CisKK25hbWVzcGFjZSBKU0MgeyBuYW1lc3BhY2UgQjMg
eworCitlbnVtIFR5cGUgeworICAgIFZvaWQsCisgICAgSW50MzIsCisgICAgSW50NjQsCisgICAg
RG91YmxlCit9OworCitpbmxpbmUgYm9vbCBpc0ludChUeXBlIHR5cGUpCit7CisgICAgcmV0dXJu
IHR5cGUgPT0gSW50MzIgfHwgdHlwZSA9PSBJbnQ2NDsKK30KKworaW5saW5lIGJvb2wgaXNGbG9h
dChUeXBlIHR5cGUpCit7CisgICAgcmV0dXJuIHR5cGUgPT0gRG91YmxlOworfQorCitpbmxpbmUg
VHlwZSBwb2ludGVyKCkgY29uc3QKK3sKKyAgICBpZiAoc2l6ZW9mKHZvaWQqKSA9PSA0KQorICAg
ICAgICByZXR1cm4gSW50MzI7CisgICAgcmV0dXJuIEludDY0OworfQorCit9IH0gLy8gbmFtZXNw
YWNlIEpTQzo6QjMKKworbmFtZXNwYWNlIFdURiB7CisKK2NsYXNzIFByaW50U3RyZWFtOworCit2
b2lkIHByaW50SW50ZXJuYWwoUHJpbnRTdHJlYW0mLCBKU0M6OkIzOjpUeXBlKTsKKworfSAvLyBu
YW1lc3BhY2UgV1RGCisKKyNlbmRpZiAvLyBCM1R5cGVfaAorCkluZGV4OiBTb3VyY2UvSmF2YVNj
cmlwdENvcmUvYjMvQjNVcHNpbG9uVmFsdWUuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZh
U2NyaXB0Q29yZS9iMy9CM1Vwc2lsb25WYWx1ZS5jcHAJKHJldmlzaW9uIDApCisrKyBTb3VyY2Uv
SmF2YVNjcmlwdENvcmUvYjMvQjNVcHNpbG9uVmFsdWUuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0w
LDAgKzEsNDEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTUgQXBwbGUgSW5jLiBBbGwgcmln
aHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFu
ZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVy
bWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0
OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBh
Ym92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5k
IHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5h
cnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2Us
IHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4g
dGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQg
d2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQg
QlkgQVBQTEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdB
UlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQg
V0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxB
UgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElO
Qy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNU
LCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERB
TUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0Yg
U1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQ
Uk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBB
TlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBM
SUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0Up
IEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwg
RVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8K
KworI2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgIkIzVXBzaWxvblZhbHVlLmgiCisKK25h
bWVzcGFjZSBKU0MgeyBuYW1lc3BhY2UgQjMgeworCitVcHNpbG9uVmFsdWU6On5VcHNpbG9uVmFs
dWUoKQoreworfQorCit2b2lkIFVwc2lsb25WYWx1ZTo6ZHVtcE1ldGEoUHJpbnRTdHJlYW0mIG91
dCkgY29uc3QKK3sKKyAgICBvdXQucHJpbnQoIl4iLCBtX3BoaS0+aW5kZXgoKSk7Cit9CisKK30g
fSAvLyBuYW1lc3BhY2UgSlNDOjpCMworCkluZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMv
QjNVcHNpbG9uVmFsdWUuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMv
QjNVcHNpbG9uVmFsdWUuaAkocmV2aXNpb24gMCkKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9i
My9CM1Vwc2lsb25WYWx1ZS5oCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsNjAgQEAKKy8qCisg
KiBDb3B5cmlnaHQgKEMpIDIwMTUgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoK
KyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdp
dGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRo
YXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmli
dXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAq
ICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlz
Y2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJv
ZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25k
aXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVu
dGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0
aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFT
IElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElO
RywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJD
SEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUg
RElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IKKyAqIENPTlRSSUJV
VE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVD
SUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywg
QlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBP
UiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVT
UyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBM
SUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQK
KyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdB
WSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9G
IFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKworI2lmbmRlZiBCM1Vwc2ls
b25WYWx1ZV9oCisjZGVmaW5lIEIzVXBzaWxvblZhbHVlX2gKKworI2luY2x1ZGUgIkIzVmFsdWUu
aCIKKworbmFtZXNwYWNlIEpTQyB7IG5hbWVzcGFjZSBCMyB7CisKK2NsYXNzIFVwc2lsb25WYWx1
ZSA6IHB1YmxpYyBWYWx1ZSB7CitwdWJsaWM6CisgICAgc3RhdGljIGJvb2wgYWNjZXB0cyhPcGNv
ZGUgb3Bjb2RlKSB7IHJldHVybiBvcGNvZGUgPT0gVXBzaWxvbjsgfQorCisgICAgflVwc2lsb25W
YWx1ZSgpOworCisgICAgVmFsdWUqIHBoaSgpIGNvbnN0IHsgcmV0dXJuIG1fcGhpOyB9CisKK3By
b3RlY3RlZDoKKyAgICB2b2lkIGR1bXBNZXRhKFByaW50U3RyZWFtJikgY29uc3Qgb3ZlcnJpZGU7
CisKK3ByaXZhdGU6CisgICAgZnJpZW5kIGNsYXNzIFByb2NlZHVyZTsKKyAgICAKKyAgICBVcHNp
bG9uVmFsdWUodW5zaWduZWQgaW5kZXgsIE9yaWdpbiBvcmlnaW4sIFZhbHVlKiB2YWx1ZSwgVmFs
dWUqIHBoaSkKKyAgICAgICAgOiBWYWx1ZShpbmRleCwgUGhpLCBWb2lkLCBvcmlnaW4sIHZhbHVl
KQorICAgICAgICAsIG1fcGhpKHBoaSkKKyAgICB7CisgICAgICAgIEFTU0VSVCh2YWx1ZS0+dHlw
ZSgpID09IHBoaS0+dHlwZSgpKTsKKyAgICB9CisKKyAgICBWYWx1ZSogbV9waGk7Cit9OworCit9
IH0gLy8gbmFtZXNwYWNlIEpTQzo6QjMKKworI2VuZGlmIC8vIEIzVXBzaWxvblZhbHVlX2gKKwpJ
bmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzVmFsdWUuY3BwCj09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0t
IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM1ZhbHVlLmNwcAkocmV2aXNpb24gMCkKKysrIFNv
dXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM1ZhbHVlLmNwcAkod29ya2luZyBjb3B5KQpAQCAtMCww
ICsxLDE2OSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNSBBcHBsZSBJbmMuIEFsbCByaWdo
dHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5k
IGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJt
aXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6
CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFi
b3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQg
dGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFy
eSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwg
dGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0
aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3
aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBC
WSBBUFBMRSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FS
UkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBX
QVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFS
CisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5D
LiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1Qs
IElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFN
QUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBT
VUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBS
T0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFO
WSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJ
QUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkg
QVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBF
VkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLiAKKyAqLwor
CisjaW5jbHVkZSAiY29uZmlnLmgiCisjaW5jbHVkZSAiQjNWYWx1ZS5oIgorCituYW1lc3BhY2Ug
SlNDIHsgbmFtZXNwYWNlIEIzIHsKKworVmFsdWU6On5WYWx1ZSgpCit7Cit9CisKK3ZvaWQgVmFs
dWU6OnJlcGxhY2VXaXRoSWRlbnRpdHkoVmFsdWUqIHZhbHVlKQoreworICAgIC8vIFRoaXMgaXMg
YSBiaXQgY3JhenkuIEl0IGRvZXMgYW4gaW4tcGxhY2UgcmVwbGFjZW1lbnQgb2Ygd2hhdGV2ZXIg
VmFsdWUgc3ViY2xhc3MgdGhpcyBpcyB3aXRoCisgICAgLy8gYSBwbGFpbiBJZGVudGl0eSBWYWx1
ZS4gV2UgZmlyc3QgY29sbGVjdCBhbGwgb2YgdGhlIGluZm9ybWF0aW9uIHdlIG5lZWQsIHRoZW4g
d2UgZGVzdHJ1Y3QgdGhlCisgICAgLy8gcHJldmlvdXMgdmFsdWUgaW4gcGxhY2UsIGFuZCB0aGVu
IHdlIGNvbnN0cnVjdCB0aGUgSWRlbnRpdHkgVmFsdWUgaW4gcGxhY2UuCisKKyAgICB1bnNpZ25l
ZCBpbmRleCA9IG1faW5kZXg7CisgICAgVHlwZSB0eXBlID0gbV90eXBlOworICAgIE9yaWdpbiBv
cmlnaW4gPSBtX29yaWdpbjsKKyAgICBCYXNpY0Jsb2NrKiBvd25lciA9IHRoaXMtPm93bmVyOwor
ICAgIFZhbHVlKiByZXBsYWNlbWVudCA9IHRoaXMtPnJlcGxhY2VtZW50OworICAgIHZvaWQqIG1p
c2MgPSB0aGlzLT5taXNjOworCisgICAgUkVMRUFTRV9BU1NFUlQodHlwZSA9PSB2YWx1ZS0+dHlw
ZSgpKTsKKworICAgIHRoaXMtPlZhbHVlOjp+VmFsdWUoKTsKKworICAgIG5ldyAodGhpcykgKGlu
ZGV4LCBJZGVudGlmeSwgdHlwZSwgb3JpZ2luLCB2YWx1ZSk7CisKKyAgICB0aGlzLT5vd25lciA9
IG93bmVyOworICAgIHRoaXMtPnJlcGxhY2VtZW50ID0gcmVwbGFjZW1lbnQ7CisgICAgdGhpcy0+
bWlzYyA9IG1pc2M7Cit9CisKK3ZvaWQgVmFsdWU6OmR1bXAoUHJpbnRTdHJlYW0mIG91dCkgY29u
c3QKK3sKKyAgICBvdXQucHJpbnQoZHVtcFByZWZpeCwgbV9pbmRleCk7Cit9CisKK3ZvaWQgVmFs
dWU6OmRlZXBEdW1wKFByaW50U3RyZWFtJiBvdXQpIGNvbnN0Cit7CisgICAgb3V0LnByaW50KG1f
dHlwZSwgIiAiLCAqdGhpcywgIiA9ICIsIG1fb3Bjb2RlKTsKKworICAgIG91dC5wcmludCgiKCIp
OworICAgIENvbW1hUHJpbnRlciBjb21tYTsKKyAgICBmb3IgKFZhbHVlKiBjaGlsZCA6IGNoaWxk
cmVuKCkpCisgICAgICAgIG91dC5wcmludChjb21tYSwgcG9pbnRlckR1bXAoY2hpbGQpKTsKKwor
ICAgIFN0cmluZ1ByaW50U3RyZWFtIHN0cmluZ091dDsKKyAgICBkdW1wTWV0YShzdHJpbmdPdXQp
OworICAgIENTdHJpbmcgc3RyaW5nID0gc3RyaW5nT3V0LnRvQ1N0cmluZygpOworICAgIGlmIChz
dHJpbmcubGVuZ3RoKCkpCisgICAgICAgIG91dC5wcmludChjb21tYSwgc3RyaW5nKTsKKworICAg
IG91dC5wcmludCgiKSIpOworfQorCitib29sIFZhbHVlOjpoYXNJbnQzMigpIGNvbnN0Cit7Cisg
ICAgcmV0dXJuIGZhbHNlOworfQorCitpbnQzMl90IFZhbHVlOjphc0ludDMyKCkgY29uc3QKK3sK
KyAgICBSRUxFQVNFX0FTU0VSVF9OT1RfUkVBQ0hFRCgpOworICAgIHJldHVybiAwOworfQorCiti
b29sIFZhbHVlOjpoYXNJbnQ2NCgpIGNvbnN0Cit7CisgICAgcmV0dXJuIGZhbHNlOworfQorCitp
bnQ2NF90IFZhbHVlOjphc0ludDY0KCkgY29uc3QKK3sKKyAgICBSRUxFQVNFX0FTU0VSVF9OT1Rf
UkVBQ0hFRCgpOworICAgIHJldHVybiAwOworfQorCitib29sIFZhbHVlOjpoYXNEb3VibGUoKSBj
b25zdAoreworICAgIHJldHVybiBmYWxzZTsKK30KKworZG91YmxlIFZhbHVlOjphc0RvdWJsZSgp
IGNvbnN0Cit7CisgICAgUkVMRUFTRV9BU1NFUlRfTk9UX1JFQUNIRUQoKTsKKyAgICByZXR1cm4g
MDsKK30KKwordm9pZCBWYWx1ZTo6ZHVtcE1ldGEoUHJpbnRTdHJlYW0mKSBjb25zdAoreworfQor
CitUeXBlIFZhbHVlOjp0eXBlRm9yKE9wY29kZSBvcGNvZGUsIFZhbHVlKiBmaXJzdENoaWxkKQor
eworICAgIHN3aXRjaCAob3Bjb2RlKSB7CisgICAgY2FzZSBJZGVudGl0eToKKyAgICBjYXNlIEFk
ZDoKKyAgICBjYXNlIFN1YjoKKyAgICBjYXNlIE11bDoKKyAgICBjYXNlIERpdjoKKyAgICBjYXNl
IENoaWxsRGl2OgorICAgIGNhc2UgTW9kOgorICAgIGNhc2UgQml0QW5kOgorICAgIGNhc2UgQml0
T3I6CisgICAgY2FzZSBCaXRYb3I6CisgICAgY2FzZSBTaGw6CisgICAgY2FzZSBTU2hyOgorICAg
IGNhc2UgWlNocjoKKyAgICBjYXNlIENoZWNrQWRkOgorICAgIGNhc2UgQ2hlY2tTdWI6CisgICAg
Y2FzZSBDaGVja011bDoKKyAgICAgICAgcmV0dXJuIGZpcnN0Q2hpbGQtPnR5cGUoKTsKKyAgICBj
YXNlIEZyYW1lUG9pbnRlcjoKKyAgICAgICAgcmV0dXJuIHBvaW50ZXIoKTsKKyAgICBjYXNlIFNF
eHQ4OgorICAgIGNhc2UgU0V4dDE2OgorICAgIGNhc2UgRFRvSTMyOgorICAgIGNhc2UgRXF1YWw6
CisgICAgY2FzZSBOb3RFcXVhbDoKKyAgICBjYXNlIExlc3NUaGFuOgorICAgIGNhc2UgR3JlYXRl
clRoYW46CisgICAgY2FzZSBMZXNzRXF1YWw6CisgICAgY2FzZSBHcmVhdGVyRXF1YWw6CisgICAg
Y2FzZSBBYm92ZToKKyAgICBjYXNlIEJlbG93OgorICAgIGNhc2UgQWJvdmVFcXVhbDoKKyAgICBj
YXNlIEJlbG93RXF1YWw6CisgICAgICAgIHJldHVybiBJbnQzMjsKKyAgICBjYXNlIFNFeHQzMjoK
KyAgICBjYXNlIFpFeHQzMjoKKyAgICAgICAgcmV0dXJuIEludDY0OworICAgIGNhc2UgRlJvdW5k
OgorICAgIGNhc2UgSVRvRDoKKyAgICAgICAgcmV0dXJuIERvdWJsZTsKKyAgICBjYXNlIE5vcDoK
KyAgICAgICAgcmV0dXJuIFZvaWQ7CisgICAgZGVmYXVsdDoKKyAgICAgICAgUkVMRUFTRV9BU1NF
UlRfTk9UX1JFQUNIRUQoKTsKKyAgICB9Cit9CisKK30gfSAvLyBuYW1lc3BhY2UgSlNDOjpCMwor
CkluZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNWYWx1ZS5oCj09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0t
IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM1ZhbHVlLmgJKHJldmlzaW9uIDApCisrKyBTb3Vy
Y2UvSmF2YVNjcmlwdENvcmUvYjMvQjNWYWx1ZS5oCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEs
MTk2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE1IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyBy
ZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmlu
YXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRl
ZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAq
IDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUg
Y29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUg
Zm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZv
cm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlz
IGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQor
ICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGgg
dGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQ
UExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5U
SUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJB
TlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAq
IFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9S
CisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5D
SURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VT
IChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNU
SVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklU
UzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRI
RU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklM
SVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklT
SU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4g
SUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisKKyNp
Zm5kZWYgQjNWYWx1ZV9oCisjZGVmaW5lIEIzVmFsdWVfaAorCisjaW5jbHVkZSAiQjNPcmlnaW4u
aCIKKyNpbmNsdWRlICJCM1R5cGUuaCIKKyNpbmNsdWRlIDx3dGYvRmFzdE1hbGxvYy5oPgorI2lu
Y2x1ZGUgPHd0Zi9Ob25jb3B5YWJsZS5oPgorCituYW1lc3BhY2UgSlNDIHsgbmFtZXNwYWNlIEIz
IHsKKworY2xhc3MgVmFsdWUgeworICAgIFdURl9NQUtFX05PTkNPUFlBQkxFKFZhbHVlKTsKKyAg
ICBXVEZfTUFLRV9GQVNUX0FMTE9DQVRFRDsKK3B1YmxpYzoKKyAgICB0eXBlZGVmIFZlY3RvcjxW
YWx1ZSosIDM+IEFkamFjZW5jeUxpc3Q7CisKKyAgICBzdGF0aWMgY29uc3QgY2hhciogZHVtcFBy
ZWZpeCA9ICJAIjsKKworICAgIHN0YXRpYyBib29sIGFjY2VwdHMoT3Bjb2RlKSB7IHJldHVybiB0
cnVlOyB9CisKKyAgICB2aXJ0dWFsIH5WYWx1ZSgpOworCisgICAgdW5zaWduZWQgaW5kZXgoKSBj
b25zdCB7IHJldHVybiBtX2luZGV4OyB9CisgICAgCisgICAgLy8gTm90ZSB0aGF0IHRoZSBvcGNv
ZGUgaXMgaW1tdXRhYmxlLCBleGNlcHQgZm9yIHJlcGxhY2luZyB2YWx1ZXMgd2l0aCBpZGVudGl0
eS4KKyAgICBPcGNvZGUgb3Bjb2RlKCkgY29uc3QgeyByZXR1cm4gbV9vcGNvZGU7IH0KKworICAg
IE9yaWdpbiBvcmlnaW4oKSBjb25zdCB7IHJldHVybiBtX29yaWdpbjsgfQorICAgIAorICAgIFZh
bHVlKiYgY2hpbGQodW5zaWduZWQgaW5kZXgpIHsgcmV0dXJuIG1fY2hpbGRyZW5baW5kZXhdOyB9
CisgICAgVmFsdWUqIGNoaWxkKHVuc2lnbmVkIGluZGV4KSBjb25zdCB7IHJldHVybiBtX2NoaWxk
cmVuW2luZGV4XTsgfQorCisgICAgLy8gVGhpcyBjb21wdXRlcyB0aGUgdHlwZSB1c2luZyB0aGUg
b3Bjb2RlLgorICAgIFR5cGUgdHlwZSgpIGNvbnN0IHsgcmV0dXJuIG1fdHlwZTsgfQorCisgICAg
QWRqYWNlbmN5TGlzdCYgY2hpbGRyZW4oKSB7IHJldHVybiBtX2NoaWxkcmVuOyB9IAorICAgIGNv
bnN0IEFkamFjZW5jeUxpc3QmIGNoaWxkcmVuKCkgY29uc3QgeyByZXR1cm4gbV9jaGlsZHJlbjsg
fQorCisgICAgdm9pZCByZXBsYWNlV2l0aElkZW50aXR5KFZhbHVlKik7CisgICAgdm9pZCByZXBs
YWNlV2l0aE5vcCgpOworCisgICAgdm9pZCBkdW1wKFByaW50U3RyZWFtJikgY29uc3Q7CisgICAg
dm9pZCBkZWVwRHVtcChQcmludFN0cmVhbSYpIGNvbnN0OworCisgICAgLy8gVGhpcyBpcyBob3cg
eW91IGNhc3QgVmFsdWVzLiBGb3IgZXhhbXBsZSwgaWYgeW91IHdhbnQgdG8gZG8gc29tZXRoaW5n
IHByb3ZpZGVkIHRoYXQgd2UgaGF2ZSBhCisgICAgLy8gQXJndW1lbnRSZWdWYWx1ZSwgeW91IGNh
biBkbzoKKyAgICAvLworICAgIC8vIGlmIChBcmd1bWVudFJlZ1ZhbHVlKiBhcmd1bWVudFJlZyA9
IHZhbHVlLT5hczxBcmd1bWVudFJlZ1ZhbHVlPigpKSB7CisgICAgLy8gICAgIHRoaW5ncworICAg
IC8vIH0KKyAgICAvLworICAgIC8vIFRoaXMgd2lsbCByZXR1cm4gbnVsbCBpZiB0aGlzIG9wY29k
ZSgpICE9IEFyZ3VtZW50UmVnLiBUaGlzIHdvcmtzIGJlY2F1c2UgdGhpcyByZXR1cm5zIG51bGxw
dHIKKyAgICAvLyBpZiBUOjphY2NlcHRzKG9wY29kZSgpKSByZXR1cm5zIGZhbHNlLgorICAgIHRl
bXBsYXRlPHR5cGVuYW1lIFQ+CisgICAgVCogYXMoKTsKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBU
PgorICAgIGNvbnN0IFQqIGFzKCkgY29uc3Q7CisgICAgCisgICAgYm9vbCBoYXNJbnQzMigpIGNv
bnN0OworICAgIGludDMyX3QgYXNJbnQzMigpIGNvbnN0OworICAgIAorICAgIGJvb2wgaGFzSW50
NjQoKSBjb25zdDsKKyAgICBpbnQ2NF90IGFzSW50NjQoKSBjb25zdDsKKworICAgIGJvb2wgaGFz
SW50KCkgY29uc3Q7CisgICAgaW50NjRfdCBhc0ludCgpIGNvbnN0OworICAgIGJvb2wgaXNJbnQo
aW50NjRfdCB2YWx1ZSkgY29uc3Q7CisKKyAgICBib29sIGhhc0RvdWJsZSgpIGNvbnN0OworICAg
IGRvdWJsZSBhc0RvdWJsZSgpIGNvbnN0OworCisgICAgU3RhY2ttYXAqIHN0YWNrbWFwKCk7CisK
K3Byb3RlY3RlZDoKKyAgICB2aXJ0dWFsIHZvaWQgZHVtcE1ldGEoUHJpbnRTdHJlYW0mKSBjb25z
dDsKKyAgICAKK3ByaXZhdGU6CisgICAgZnJpZW5kIGNsYXNzIFByb2NlZHVyZTsKKyAgICAKKyAg
ICAvLyBJbnN0YW50aWF0ZSB2YWx1ZXMgdmlhIFByb2NlZHVyZS4KKyAgICAvLyBUaGlzIGZvcm0g
cmVxdWlyZXMgc3BlY2lmeWluZyB0aGUgdHlwZSBleHBsaWNpdGx5OgorICAgIHRlbXBsYXRlPHR5
cGVuYW1lLi4uIEFyZ3VtZW50cz4KKyAgICBleHBsaWNpdCBWYWx1ZSh1bnNpZ25lZCBpbmRleCwg
T3Bjb2RlIG9wY29kZSwgVHlwZSB0eXBlLCBPcmlnaW4gb3JpZ2luLCBWYWx1ZSogZmlyc3RDaGls
ZCwgQXJndW1lbnRzLi4uIGFyZ3VtZW50cykKKyAgICAgICAgOiBtX2luZGV4KGluZGV4KQorICAg
ICAgICAsIG1fb3Bjb2RlKG9wY29kZSkKKyAgICAgICAgLCBtX3R5cGUodHlwZSkKKyAgICAgICAg
LCBtX29yaWdpbihvcmlnaW4pCisgICAgICAgICwgbV9jaGlsZHJlbnsgZmlyc3RDaGlsZCwgYXJn
dW1lbnRzLi4uIH0KKyAgICB7CisgICAgfQorICAgIC8vIFRoaXMgZm9ybSBpcyBmb3Igc3BlY2lm
eWluZyB0aGUgdHlwZSBleHBsaWNpdGx5IHdoZW4gdGhlIG9wY29kZSBoYXMgbm8gY2hpbGRyZW46
CisgICAgZXhwbGljaXQgVmFsdWUodW5zaWduZWQgaW5kZXgsIE9wY29kZSBvcGNvZGUsIFR5cGUg
dHlwZSwgT3JpZ2luIG9yaWdpbikKKyAgICAgICAgOiBtX2luZGV4KGluZGV4KQorICAgICAgICAs
IG1fb3Bjb2RlKG9wY29kZSkKKyAgICAgICAgLCBtX3R5cGUodHlwZSkKKyAgICAgICAgLCBtX29y
aWdpbihvcmlnaW4pCisgICAgeworICAgIH0KKyAgICAvLyBUaGlzIGZvcm0gaXMgZm9yIHRob3Nl
IG9wY29kZXMgdGhhdCBjYW4gaW5mZXIgdGhlaXIgdHlwZSBmcm9tIHRoZSBvcGNvZGUgYW5kIGZp
cnN0IGNoaWxkOgorICAgIHRlbXBsYXRlPHR5cGVuYW1lLi4uIEFyZ3VtZW50cz4KKyAgICBleHBs
aWNpdCBWYWx1ZSh1bnNpZ25lZCBpbmRleCwgT3Bjb2RlIG9wY29kZSwgT3JpZ2luIG9yaWdpbiwg
VmFsdWUqIGZpcnN0Q2hpbGQsIEFyZ3VtZW50cy4uLiBhcmd1bWVudHMpCisgICAgICAgIDogbV9p
bmRleChpbmRleCkKKyAgICAgICAgLCBtX29wY29kZShvcGNvZGUpCisgICAgICAgICwgbV90eXBl
KHR5cGVGb3Iob3Bjb2RlLCBmaXJzdENoaWxkKSkKKyAgICAgICAgLCBtX29yaWdpbihvcmlnaW4p
CisgICAgICAgICwgbV9jaGlsZHJlbnsgZmlyc3RDaGlsZCwgYXJndW1lbnRzLi4uIH0KKyAgICB7
CisgICAgfQorICAgIC8vIFRoaXMgZm9ybSBpcyBmb3IgdGhvc2Ugb3Bjb2RlcyB0aGF0IGNhbiBp
bmZlciB0aGVpciB0eXBlIGZyb20gdGhlIG9wY29kZSBhbG9uZSwgYW5kIHRoYXQgZG9uJ3QKKyAg
ICAvLyB0YWtlIGFueSBhcmd1bWVudHM6CisgICAgZXhwbGljaXQgVmFsdWUodW5zaWduZWQgaW5k
ZXgsIE9wY29kZSBvcGNvZGUsIE9yaWdpbiBvcmlnaW4pCisgICAgICAgIDogbV9pbmRleChpbmRl
eCkKKyAgICAgICAgLCBtX29wY29kZShvcGNvZGUpCisgICAgICAgICwgbV90eXBlKHR5cGVGb3Io
b3Bjb2RlLCBudWxscHRyKSkKKyAgICAgICAgLCBtX29yaWdpbihvcmlnaW4pCisgICAgeworICAg
IH0KKyAgICAvLyBVc2UgdGhpcyBmb3JtIGZvciB2YXJhcmdzLgorICAgIGV4cGljaXQgVmFsdWUo
dW5zaWduZWQgaW5kZXgsIE9wY29kZSBvcGNvZGUsIFR5cGUgdHlwZSwgT3JpZ2luIG9yaWdpbiwg
Y29uc3QgQWRqYWNlbmN5TGlzdCYgY2hpbGRyZW4pCisgICAgICAgIDogbV9pbmRleChpbmRleCkK
KyAgICAgICAgLCBtX29wY29kZShvcGNvZGUpCisgICAgICAgICwgbV90eXBlKHR5cGUpCisgICAg
ICAgICwgbV9vcmlnaW4ob3JpZ2luKQorICAgICAgICAsIG1fY2hpbGRyZW4oY2hpbGRyZW4pCisg
ICAgeworICAgIH0KKworICAgIHN0YXRpYyBUeXBlIHR5cGVGb3IoT3Bjb2RlLCBWYWx1ZSogZmly
c3RDaGlsZCk7CisKKyAgICAvLyBUaGlzIGdyb3VwIG9mIGZpZWxkcyBpcyBhcnJhbmdlZCB0byBm
aXQgaW4gNjQgYml0cy4KKyAgICB1bnNpZ25lZCBtX2luZGV4OworICAgIE9wY29kZSBtX29wY29k
ZTsKKyAgICBUeXBlIG1fdHlwZTsKKyAgICAKKyAgICBPcmlnaW4gbV9vcmlnaW47CisgICAgQWRq
YWNlbmN5TGlzdCBtX2NoaWxkcmVuOworCitwdWJsaWM6CisgICAgQmFzaWNCbG9jayogb3duZXIg
eyBudWxscHRyIH07IC8vIGNvbXB1dGVkIGxhemlseS4KKyAgICBWYWx1ZSogcmVwbGFjZW1lbnQg
eyBudWxscHRyIH07IC8vIHVzZWQgZm9yIGFuYWx5c2VzIGFuZCB0cmFuc2Zvcm1hdGlvbnMuCisg
ICAgdm9pZCogbWlzYyB7IG51bGxwdHIgfTsKK307CisKK2NsYXNzIERlZXBWYWx1ZUR1bXAgewor
cHVibGljOgorICAgIERlZXBWYWx1ZUR1bXAoVmFsdWUqIHZhbHVlKQorICAgICAgICA6IG1fdmFs
dWUodmFsdWUpCisgICAgeworICAgIH0KKworICAgIHZvaWQgZHVtcChQcmludFN0cmVhbSYgb3V0
KSBjb25zdAorICAgIHsKKyAgICAgICAgaWYgKG1fdmFsdWUpCisgICAgICAgICAgICBtX3ZhbHVl
LT5kZWVwRHVtcChvdXQpOworICAgICAgICBlbHNlCisgICAgICAgICAgICBvdXQucHJpbnQoIjxu
dWxsPiIpOworICAgIH0KKworcHJpdmF0ZToKKyAgICBWYWx1ZSogbV92YWx1ZTsKK307CisKK0Rl
ZXBWYWx1ZUR1bXAgZGVlcER1bXAoVmFsdWUqIHZhbHVlKQoreworICAgIHJldHVybiBEZWVwVmFs
dWVEdW1wKHZhbHVlKTsKK30KKworfSB9IC8vIG5hbWVzcGFjZSBKU0M6OkIzCisKKyNlbmRpZiAv
LyBCM1ZhbHVlX2gKKwpJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzVmFsdWVJbmxp
bmVzLmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzVmFsdWVJbmxp
bmVzLmgJKHJldmlzaW9uIDApCisrKyBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNWYWx1ZUlu
bGluZXMuaAkod29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDEwOSBAQAorLyoKKyAqIENvcHlyaWdo
dCAoQykgMjAxNSBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0
cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRo
b3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9s
bG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Yg
c291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNl
LCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgor
ICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBh
Ym92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5k
IHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5k
L29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgor
ICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIGBgQVMgSVMnJyBBTkQg
QU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9U
IExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElU
WSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVE
LiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJ
QUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBF
WEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJ
TUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VT
OyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQ
VElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwg
V0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xV
RElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBU
SEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJ
QklMSVRZIE9GIFNVQ0ggREFNQUdFLiAKKyAqLworCisjaWZuZGVmIEIzVmFsdWVJbmxpbmVzX2gK
KyNkZWZpbmUgQjNWYWx1ZUlubGluZXNfaAorCisjaW5jbHVkZSAiQjNDaGVja1ZhbHVlLmgiCisj
aW5jbHVkZSAiQjNDb25zdDMyVmFsdWUuaCIKKyNpbmNsdWRlICJCM0NvbnN0NjRWYWx1ZS5oIgor
I2luY2x1ZGUgIkIzQ29uc3REb3VibGVWYWx1ZS5oIgorI2luY2x1ZGUgIkIzUGF0Y2hwb2ludFZh
bHVlLmgiCisjaW5jbHVkZSAiQjNWYWx1ZS5oIgorCituYW1lc3BhY2UgSlNDIHsgbmFtZXNwYWNl
IEIzIHsKKwordGVtcGxhdGU8dHlwZW5hbWUgVD4KK1QqIFZhbHVlOjphcygpCit7CisgICAgaWYg
KFQ6OmFjY2VwdHMob3Bjb2RlKCkpKQorICAgICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8VCo+KHRo
aXMpOworICAgIHJldHVybiBudWxscHRyOworfQorCit0ZW1wbGF0ZT50eXBlbmFtZSBUPgorY29u
c3QgVCogVmFsdWU6OmFzKCkgY29uc3QKK3sKKyAgICByZXR1cm4gY29uc3RfY2FzdDxWYWx1ZSo+
KHRoaXMpLT5hczxUPigpOworfQorCitib29sIFZhbHVlOjpoYXNJbnQzMigpIGNvbnN0Cit7Cisg
ICAgcmV0dXJuICEhYXM8Q29uc3QzMlZhbHVlPigpOworfQorCitpbnQzMl90IFZhbHVlOjphc0lu
dDMyKCkgY29uc3QKK3sKKyAgICByZXR1cm4gYXM8Q29uc3QzMlZhbHVlPigpLT52YWx1ZSgpOwor
fQorCitib29sIFZhbHVlOjpoYXNJbnQ2NCgpIGNvbnN0Cit7CisgICAgcmV0dXJuICEhYXM8Q29u
c3Q2NFZhbHVlPigpOworfQorCitpbnQ2NF90IFZhbHVlOjphc0ludDY0KCkgY29uc3QKK3sKKyAg
ICByZXR1cm4gYXM8Q29uc3Q2NFZhbHVlPigpLT52YWx1ZSgpOworfQorCitib29sIFZhbHVlOjpo
YXNJbnQoKSBjb25zdAoreworICAgIHJldHVybiBoYXNJbnQzMigpIHx8IGhhc0ludDY0KCk7Cit9
CisKK2ludDY0X3QgVmFsdWU6OmFzSW50KCkgY29uc3QKK3sKKyAgICByZXR1cm4gaGFzSW50MzIo
KSA/IGFzSW50MzIoKSA6IGFzSW50NjQoKTsKK30KKworYm9vbCBWYWx1ZTo6aXNJbnQoaW50NjRf
dCB2YWx1ZSkgY29uc3QKK3sKKyAgICByZXR1cm4gaGFzSW50KCkgJiYgYXNJbnQoKSA9PSB2YWx1
ZTsKK30KKworYm9vbCBWYWx1ZTo6aGFzRG91YmxlKCkgY29uc3QKK3sKKyAgICByZXR1cm4gISFh
czxDb25zdERvdWJsZVZhbHVlPigpOworfQorCitkb3VibGUgVmFsdWU6OmFzRG91YmxlKCkgY29u
c3QKK3sKKyAgICByZXR1cm4gYXM8Q29uc3REb3VibGVWYWx1ZT4oKS0+dmFsdWUoKTsKK30KKwor
U3RhY2ttYXAqIFZhbHVlOjpzdGFja21hcCgpCit7CisgICAgaWYgKENoZWNrVmFsdWUqIGNoZWNr
ID0gYXM8Q2hlY2tWYWx1ZT4oKSkKKyAgICAgICAgcmV0dXJuICZjaGVjay0+c3RhY2ttYXA7Cisg
ICAgaWYgKFBhdGNocG9pbnRWYWx1ZSogcGF0Y2hwb2ludCA9IGFzPFBhdGNocG9pbnRWYWx1ZT4o
KSkKKyAgICAgICAgcmV0dXJuICZwYXRjaHBvaW50LT5zdGFja21hcDsKKyAgICByZXR1cm4gbnVs
bHB0cjsKK30KKworfSB9IC8vIG5hbWVzcGFjZSBKU0M6OkIzCisKKyNlbmRpZiAvLyBCM1ZhbHVl
SW5saW5lc19oCisKSW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM1ZhbHVlUmVwLmNw
cAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNWYWx1ZVJlcC5jcHAJ
KHJldmlzaW9uIDApCisrKyBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNWYWx1ZVJlcC5jcHAJ
KHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSw4NiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAx
NSBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24g
YW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBt
b2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNv
bmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNv
ZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxp
c3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVk
aXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5
cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xs
b3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVy
IG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBT
T0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBF
WFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQg
VE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklU
TkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8g
RVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1Ig
QU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlks
IE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8s
CisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9G
IFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9X
RVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJ
TiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdM
SUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisg
KiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9G
IFNVQ0ggREFNQUdFLiAKKyAqLworCisjaW5jbHVkZSAiY29uZmlnLmgiCisjaW5jbHVkZSAiQjNW
YWx1ZVJlcC5oIgorCituYW1lc3BhY2UgSlNDIHsgbmFtZXNwYWNlIEIzIHsKKwordm9pZCBWYWx1
ZVJlcDo6ZHVtcChQcmludFN0cmVhbSYgb3V0KSBjb25zdAoreworICAgIG91dC5wcmludChtX2tp
bmQpOworICAgIHN3aXRjaCAobV9raW5kKSB7CisgICAgY2FzZSBOb25lOgorICAgIGNhc2UgU29t
ZVJlZ2lzdGVyOgorICAgICAgICByZXR1cm47CisgICAgY2FzZSBSZWdpc3RlcjoKKyAgICAgICAg
b3V0LnByaW50KCIoIiwgcmVnKCksICIpIik7CisgICAgICAgIHJldHVybjsKKyAgICBjYXNlIFN0
YWNrOgorICAgICAgICBvdXQucHJpbnQoIigiLCBvZmZzZXRGcm9tRlAoKSwgIikiKTsKKyAgICAg
ICAgcmV0dXJuOworICAgIGNhc2UgU3RhY2tBcmd1bWVudDoKKyAgICAgICAgb3V0LnByaW50KCIo
Iiwgb2Zmc2V0RnJvbVNQKCksICIpIik7CisgICAgICAgIHJldHVybjsKKyAgICBjYXNlIENvbnN0
YW50OgorICAgICAgICBvdXQucHJpbnQoIigiLCB2YWx1ZSgpLCAiKSIpOworICAgICAgICByZXR1
cm47CisgICAgfQorICAgIFJFTEVBU0VfQVNTRVJUX05PVF9SRUFDSEVEKCk7Cit9CisKK30gfSAv
LyBuYW1lc3BhY2UgSlNDOjpCMworCituYW1lc3BhY2UgV1RGIHsKKwordXNpbmcgbmFtZXNwYWNl
IEpTQzo6QjM7CisKK3ZvaWQgcHJpbnRJbnRlcm5hbChQcmludFN0cmVhbSYgb3V0LCBWYWx1ZVJl
cDo6S2luZCBraW5kKQoreworICAgIHN3aXRjaCAoa2luZCkgeworICAgIGNhc2UgVmFsdWVSZXA6
OkFueToKKyAgICAgICAgb3V0LnByaW50KCJBbnkiKTsKKyAgICAgICAgcmV0dXJuOworICAgIGNh
c2UgVmFsdWVSZXA6OlNvbWVSZWdpc3RlcjoKKyAgICAgICAgb3V0LnByaW50KCJTb21lUmVnaXN0
ZXIiKTsKKyAgICAgICAgcmV0dXJuOworICAgIGNhc2UgVmFsdWVSZXA6OlJlZ2lzdGVyOgorICAg
ICAgICBvdXQucHJpbnQoIlJlZ2lzdGVyIik7CisgICAgICAgIHJldHVybjsKKyAgICBjYXNlIFZh
bHVlUmVwOjpTdGFjazoKKyAgICAgICAgb3V0LnByaW50KCJTdGFjayIpOworICAgICAgICByZXR1
cm47CisgICAgY2FzZSBWYWx1ZVJlcDo6U3RhY2tBcmd1bWVudDoKKyAgICAgICAgb3V0LnByaW50
KCJTdGFja0FyZ3VtZW50Iik7CisgICAgICAgIHJldHVybjsKKyAgICBjYXNlIFZhbHVlUmVwOjpD
b25zdGFudDoKKyAgICAgICAgb3V0LnByaW50KCJDb25zdGFudCIpOworICAgICAgICByZXR1cm47
CisgICAgfQorICAgIFJFTEVBU0VfQVNTRVJUX05PVF9SRUFDSEVEKCk7Cit9CisKK30gLy8gbmFt
ZXNwYWNlIFdURgorCkluZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNWYWx1ZVJlcC5o
Cj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM1ZhbHVlUmVwLmgJKHJl
dmlzaW9uIDApCisrKyBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNWYWx1ZVJlcC5oCSh3b3Jr
aW5nIGNvcHkpCkBAIC0wLDAgKzEsMTU4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE1IEFw
cGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQg
dXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlm
aWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0
aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBt
dXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBv
ZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3Ry
aWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdo
dAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2lu
ZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0
ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRX
QVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJF
U1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywg
VEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNT
IEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVO
VCBTSEFMTCBBUFBMRSBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkg
RElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1Ig
Q09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAq
IFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNF
LCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVS
IENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENP
TlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VO
Q0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9G
IFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VD
SCBEQU1BR0UuIAorICovCisKKyNpZm5kZWYgQjNWYWx1ZVJlcF9oCisjZGVmaW5lIEIzVmFsdWVS
ZXBfaAorCisjaW5jbHVkZSAiUmVnLmgiCisjaW5jbHVkZSA8d3RmL1ByaW50U3RyZWFtLmg+CisK
K25hbWVzcGFjZSBKU0MgeyBuYW1lc3BhY2UgQjMgeworCisvLyBXZSB1c2UgdGhpcyBjbGFzcyB0
byBkZXNjcmliZSB2YWx1ZSByZXByZXNlbnRhdGlvbnMgYXQgc3RhY2ttYXBzLiBJdCdzIHVzZWQg
Ym90aCB0byBmb3JjZSBhCisvLyByZXByZXNlbnRhdGlvbiBhbmQgdG8gZ2V0IHRoZSByZXByZXNl
bnRhdGlvbi4gV2hlbiB0aGUgQjMgY2xpZW50IGZvcmNlcyBhIHJlcHJlc2VudGF0aW9uLCB3ZSBz
YXkKKy8vIHRoYXQgaXQncyBhbiBpbnB1dC4gV2hlbiBCMyB0ZWxscyB0aGUgY2xpZW50IHdoYXQg
cmVwcmVzZW50YXRpb24gaXQgcGlja2VkLCB3ZSBzYXkgdGhhdCBpdCdzIGFuCisvLyBvdXRwdXQu
CisKK2NsYXNzIFZhbHVlUmVwIHsKK3B1YmxpYzoKKyAgICBlbnVtIEtpbmQgeworICAgICAgICAv
LyBBcyBhbiBpbnB1dCByZXByZXNlbnRhdGlvbiwgdGhpcyBtZWFucyB0aGF0IEIzIGNhbiBwaWNr
IGFueSByZXByZXNlbnRhdGlvbi4gQXMgYW4KKyAgICAgICAgLy8gb3V0cHV0IHJlcHJlc2VudGF0
aW9uLCB0aGlzIG1lYW5zIHRoYXQgd2UgZG9uJ3Qga25vdy4gVGhpcyB3aWxsIG9ubHkgYXJpc2Ug
Zm9yIHRoZQorICAgICAgICAvLyByaWdodCBvcGVyYW5kIChpLmUuIGNoaWxkKDEpKSBvZiBhIENo
ZWNrTXVsLgorICAgICAgICBBbnksCisKKyAgICAgICAgLy8gQXMgYW4gaW5wdXQgcmVwcmVzZW50
YXRpb24sIHRoaXMgbWVhbnMgdGhhdCBCMyBzaG91bGQgcGljayBzb21lIHJlZ2lzdGVyLiBJdCBj
b3VsZCBiZSBhCisgICAgICAgIC8vIHJlZ2lzdGVyIHRoYXQgdGhpcyBjbGFpbXMgdG8gY2xvYmJl
ciEKKyAgICAgICAgU29tZVJlZ2lzdGVyLAorCisgICAgICAgIC8vIEFzIGFuIGlucHV0IHJlcHJl
c2VudGF0aW9uLCB0aGlzIGZvcmNlcyBhIHBhcnRpY3VsYXIgcmVnaXN0ZXIuIEFzIGFuIG91dHB1
dAorICAgICAgICAvLyByZXByZXNlbnRhdGlvbiwgdGhpcyB0ZWxscyB1cyB3aGF0IHJlZ2lzdGVy
IEIzIHBpY2tlZC4KKyAgICAgICAgUmVnaXN0ZXIsCisKKyAgICAgICAgLy8gQXMgYW4gb3V0cHV0
IHJlcHJlc2VudGF0aW9uLCB0aGlzIHRlbGxzIHVzIHdoYXQgc3RhY2sgc2xvdCBCMyBwaWNrZWQu
IEl0J3Mgbm90IGEgdmFsaWQKKyAgICAgICAgLy8gaW5wdXQgcmVwcmVzZW50YXRpb24uCisgICAg
ICAgIFN0YWNrLAorCisgICAgICAgIC8vIEFzIGFuIGlucHV0IHJlcHJlc2VudGF0aW9uLCB0aGlz
IGZvcmNlcyB0aGUgdmFsdWUgdG8gZW5kIHVwIGluIHRoZSBhcmd1bWVudCBhcmVhIGF0IHNvbWUK
KyAgICAgICAgLy8gb2Zmc2V0LgorICAgICAgICBTdGFja0FyZ3VtZW50LAorCisgICAgICAgIC8v
IEFzIGFuIG91dHB1dCByZXByZXNlbnRhdGlvbiwgdGhpcyB0ZWxscyB1cyB0aGF0IEIzIGNvbnN0
YW50LWZvbGRlZCB0aGUgdmFsdWUuCisgICAgICAgIENvbnN0YW50CisgICAgfTsKKyAgICAKKyAg
ICBWYWx1ZVJlcCgpCisgICAgICAgIDogbV9raW5kKEFueSkKKyAgICB7CisgICAgfQorCisgICAg
ZXhwbGljaXQgVmFsdWVSZXAoUmVnIHJlZykKKyAgICAgICAgOiBtX2tpbmQoUmVnaXN0ZXIpCisg
ICAgICAgICwgbV92YWx1ZShyZWcuaW5kZXgoKSkKKyAgICB7CisgICAgfQorCisgICAgc3RhdGlj
IFZhbHVlUmVwIHJlZyhSZWcgcmVnKQorICAgIHsKKyAgICAgICAgcmV0dXJuIFZhbHVlUmVwKHJl
Zyk7CisgICAgfQorCisgICAgc3RhdGljIFZhbHVlUmVwIHN0YWNrKGludHB0cl90IG9mZnNldEZy
b21GUCkKKyAgICB7CisgICAgICAgIFZhbHVlUmVwIHJlc3VsdDsKKyAgICAgICAgcmVzdWx0Lm1f
a2luZCA9IFN0YWNrOworICAgICAgICByZXN1bHQubV92YWx1ZSA9IG9mZnNldEZyb21GUDsKKyAg
ICB9CisKKyAgICBzdGF0aWMgVmFsdWVSZXAgc3RhY2tBcmd1bWVudChpbnRwdHJfdCBvZmZzZXRG
cm9tU1ApCisgICAgeworICAgICAgICBWYWx1ZVJlcCByZXN1bHQ7CisgICAgICAgIHJlc3VsdC5t
X2tpbmQgPSBTdGFja0FyZ3VtZW50OworICAgICAgICByZXN1bHQubV92YWx1ZSA9IG9mZnNldEZy
b21TUDsKKyAgICB9CisKKyAgICBzdGF0aWMgVmFsdWVSZXAgY29uc3RhbnQoaW50NjRfdCB2YWx1
ZSkKKyAgICB7CisgICAgICAgIFZhbHVlUmVwIHJlc3VsdDsKKyAgICAgICAgcmVzdWx0Lm1fa2lu
ZCA9IENvbnN0YW50OworICAgICAgICByZXN1bHQubV92YWx1ZSA9IHZhbHVlOworICAgIH0KKwor
ICAgIHN0YXRpYyBWYWx1ZVJlcCBjb25zdGFudERvdWJsZShkb3VibGUgdmFsdWUpCisgICAgewor
ICAgICAgICByZXR1cm4gVmFsdWVSZXAoYml0d2lzZV9jYXN0PGludDY0X3Q+KHZhbHVlKSk7Cisg
ICAgfQorCisgICAgS2luZCBraW5kKCkgY29uc3QgeyByZXR1cm4gbV9raW5kOyB9CisKKyAgICBl
eHBsaWNpdCBvcGVyYXRvciBib29sKCkgY29uc3QgeyByZXR1cm4ga2luZCgpICE9IEFueTsgfQor
CisgICAgUmVnIHJlZygpIGNvbnN0CisgICAgeworICAgICAgICBBU1NFUlQoa2luZCgpID09IFJl
Z2lzdGVyKTsKKyAgICAgICAgcmV0dXJuIFJlZzo6ZnJvbUluZGV4KG1fdmFsdWUpOworICAgIH0K
KworICAgIGludHB0cl90IG9mZnNldEZyb21GUCgpIGNvbnN0CisgICAgeworICAgICAgICBBU1NF
UlQoa2luZCgpID09IFN0YWNrKTsKKyAgICAgICAgcmV0dXJuIHN0YXRpY19jYXN0PGludHB0cl90
PihtX3ZhbHVlKTsKKyAgICB9CisKKyAgICBpbnRwdHJfdCBvZmZzZXRGcm9tU1AoKSBjb25zdAor
ICAgIHsKKyAgICAgICAgQVNTRVJUKGtpbmQoKSA9PSBTdGFja0FyZ3VtZW50KTsKKyAgICAgICAg
cmV0dXJuIHN0YXRpY19jYXN0PGludHB0cl90PihtX3ZhbHVlKTsKKyAgICB9CisKKyAgICBpbnQ2
NF90IHZhbHVlKCkgY29uc3QKKyAgICB7CisgICAgICAgIEFTU0VSVChraW5kKCkgPT0gQ29uc3Rh
bnQpOworICAgICAgICByZXR1cm4gbV92YWx1ZTsKKyAgICB9CisKKyAgICBkb3VibGUgZG91Ymxl
VmFsdWUoKSBjb25zdAorICAgIHsKKyAgICAgICAgcmV0dXJuIGJpdHdpc2VfY2FzdDxkb3VibGU+
KHZhbHVlKCkpOworICAgIH0KKworICAgIHZvaWQgZHVtcChQcmludFN0cmVhbSYpIGNvbnN0Owor
Citwcml2YXRlOgorICAgIEtpbmQgbV9raW5kOworICAgIGludDY0X3QgbV92YWx1ZTsKK307CisK
K30gfSAvLyBuYW1lc3BhY2UgSlNDOjpCMworCituYW1lc3BhY2UgV1RGIHsKKwordm9pZCBwcmlu
dEludGVybmFsKFByaW50U3RyZWFtJiwgSlNDOjpCMzo6VmFsdWVSZXA6OktpbmQpOworCit9IC8v
IG5hbWVzcGFjZSBXVEYKKworI2VuZGlmIC8vIEIzVmFsdWVSZXBfaAorCkluZGV4OiBTb3VyY2Uv
SmF2YVNjcmlwdENvcmUvYjMvZ2VuZXJhdGVfcGF0dGVybl9tYXRjaGVyLnJiCj09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0K
LS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9nZW5lcmF0ZV9wYXR0ZXJuX21hdGNoZXIucmIJ
KHJldmlzaW9uIDApCisrKyBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvZ2VuZXJhdGVfcGF0dGVy
bl9tYXRjaGVyLnJiCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsNDkzIEBACisjIS91c3IvYmlu
L2VudiBydWJ5CisKKyMgQ29weXJpZ2h0IChDKSAyMDE1IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyBy
ZXNlcnZlZC4KKyMKKyMgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFy
eSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisjIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBw
cm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworIyBhcmUgbWV0OgorIyAxLiBS
ZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHly
aWdodAorIyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93
aW5nIGRpc2NsYWltZXIuCisjIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0
IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisjICAgIG5vdGljZSwgdGhpcyBsaXN0IG9m
IGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyMgICAgZG9j
dW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3Ry
aWJ1dGlvbi4KKyMKKyMgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIEFO
RCBJVFMgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJworIyBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElF
RCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyMgVEhFIElNUExJ
RUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElD
VUxBUgorIyBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJ
TkMuIE9SIElUUyBDT05UUklCVVRPUlMKKyMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJ
UkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgorIyBDT05TRVFVRU5USUFM
IERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgor
IyBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJP
RklUUzsgT1IgQlVTSU5FU1MKKyMgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04g
QU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KKyMgQ09OVFJBQ1QsIFNUUklDVCBM
SUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKyMg
QVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4g
SUYgQURWSVNFRCBPRgorIyBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKK3JlcXVp
cmUgInBhdGhuYW1lIgorCiskdmFySW5kZXggPSAwCitkZWYgbmV3VmFyCisgICAgJHZhckluZGV4
ICs9IDEKKyAgICAiX3RtcCN7JHZhckluZGV4fSIKK2VuZAorCitjbGFzcyBQcm9kdWN0aW9uCisg
ICAgYXR0cl9yZWFkZXIgOm9yaWdpbiwgOm5hbWUsIDp2YXJOYW1lLCA6YW5vbnltb3VzLCA6b3Bj
b2RlLCA6Y2hpbGRyZW4KKworICAgIGRlZiBpbml0aWFsaXplKG9yaWdpbiwgbmFtZSwgb3Bjb2Rl
LCBjaGlsZHJlbikKKyAgICAgICAgQG9yaWdpbiA9IG9yaWdpbgorICAgICAgICBAbmFtZSA9IG5h
bWUKKyAgICAgICAgQGFub255bW91cyA9IChuYW1lID09IG5pbCBvciBuYW1lID1+IC9cQVwkKFsw
LTldKylcWi8pCisgICAgICAgIEB2YXJOYW1lID0gQGFub255bW91cyA/IG5ld1ZhciA6IG5hbWUK
KyAgICAgICAgQG9wY29kZSA9IG9wY29kZQorICAgICAgICBAY2hpbGRyZW4gPSBjaGlsZHJlbiA/
IGNoaWxkcmVuIDogW10KKyAgICBlbmQKKworICAgIGRlZiBoYXNPcGNvZGUKKyAgICAgICAgb3Bj
b2RlICE9IG5pbAorICAgIGVuZAorCisgICAgZGVmIGVhY2hWYXJpYWJsZSgmcHJvYykKKyAgICAg
ICAgY2hpbGRyZW4uZWFjaF93aXRoX2luZGV4IHsKKyAgICAgICAgICAgIHwgY2hpbGQsIGluZGV4
IHwKKyAgICAgICAgICAgIHlpZWxkIHZhck5hbWUsCisgICAgICAgICAgICAgICAgICBjaGlsZC5u
YW1lLAorICAgICAgICAgICAgICAgICAgY2hpbGQudmFyTmFtZSwKKyAgICAgICAgICAgICAgICAg
IGNoaWxkLmFub255bW91cyA/IChjaGlsZC5vcGNvZGUgPyA6YW5vbkludGVybmFsIDogOmFub25P
cGVyYW5kKSA6IChjaGlsZC5vcGNvZGUgPyA6aW50ZXJuYWwgOiA6b3BlcmFuZCksCisgICAgICAg
ICAgICAgICAgICBpbmRleAorICAgICAgICAgICAgY2hpbGQuZWFjaFZhcmlhYmxlKCZwcm9jKQor
ICAgICAgICB9CisgICAgZW5kCitlbmQKKworY2xhc3MgTWF0Y2hlcgorICAgIGF0dHJfcmVhZGVy
IDpuYW1lLCA6cHJvZHVjdGlvbnMKKworICAgIGRlZiBpbml0aWFsaXplKG5hbWUsIHByb2R1Y3Rp
b25zKQorICAgICAgICBAbmFtZSA9IG5hbWUKKyAgICAgICAgQHByb2R1Y3Rpb25zID0gcHJvZHVj
dGlvbnMKKyAgICBlbmQKK2VuZAorCitjbGFzcyBPcmlnaW4KKyAgICBhdHRyX3JlYWRlciA6Zmls
ZU5hbWUsIDpsaW5lTnVtYmVyCisgICAgCisgICAgZGVmIGluaXRpYWxpemUoZmlsZU5hbWUsIGxp
bmVOdW1iZXIpCisgICAgICAgIEBmaWxlTmFtZSA9IGZpbGVOYW1lCisgICAgICAgIEBsaW5lTnVt
YmVyID0gbGluZU51bWJlcgorICAgIGVuZAorICAgIAorICAgIGRlZiB0b19zCisgICAgICAgICIj
e2ZpbGVOYW1lfToje2xpbmVOdW1iZXJ9IgorICAgIGVuZAorZW5kCisKK2NsYXNzIFRva2VuCisg
ICAgYXR0cl9yZWFkZXIgOm9yaWdpbiwgOnN0cmluZworICAgIAorICAgIGRlZiBpbml0aWFsaXpl
KG9yaWdpbiwgc3RyaW5nKQorICAgICAgICBAb3JpZ2luID0gb3JpZ2luCisgICAgICAgIEBzdHJp
bmcgPSBzdHJpbmcKKyAgICBlbmQKKyAgICAKKyAgICBkZWYgPT0ob3RoZXIpCisgICAgICAgIGlm
IG90aGVyLmlzX2E/IFRva2VuCisgICAgICAgICAgICBAc3RyaW5nID09IG90aGVyLnN0cmluZwor
ICAgICAgICBlbHNlCisgICAgICAgICAgICBAc3RyaW5nID09IG90aGVyCisgICAgICAgIGVuZAor
ICAgIGVuZAorICAgIAorICAgIGRlZiA9fihvdGhlcikKKyAgICAgICAgQHN0cmluZyA9fiBvdGhl
cgorICAgIGVuZAorICAgIAorICAgIGRlZiB0b19zCisgICAgICAgICIje0BzdHJpbmcuaW5zcGVj
dH0gYXQgI3tvcmlnaW59IgorICAgIGVuZAorICAgIAorICAgIGRlZiBwYXJzZUVycm9yKCpjb21t
ZW50KQorICAgICAgICBpZiBjb21tZW50LmVtcHR5PworICAgICAgICAgICAgcmFpc2UgIlBhcnNl
IGVycm9yOiAje3RvX3N9IgorICAgICAgICBlbHNlCisgICAgICAgICAgICByYWlzZSAiUGFyc2Ug
ZXJyb3I6ICN7dG9fc306ICN7Y29tbWVudFswXX0iCisgICAgICAgIGVuZAorICAgIGVuZAorZW5k
CisKK2RlZiBsZXgoc3RyLCBmaWxlTmFtZSkKKyAgICBmaWxlTmFtZSA9IFBhdGhuYW1lLm5ldyhm
aWxlTmFtZSkKKyAgICByZXN1bHQgPSBbXQorICAgIGxpbmVOdW1iZXIgPSAxCisgICAgd2hpbGUg
bm90IHN0ci5lbXB0eT8KKyAgICAgICAgY2FzZSBzdHIKKyAgICAgICAgd2hlbiAvXEFcIyhbXlxu
XSopLworICAgICAgICAgICAgIyBjb21tZW50LCBpZ25vcmUKKyAgICAgICAgd2hlbiAvXEFcbi8K
KyAgICAgICAgICAgICMgbmV3bGluZSwgaWdub3JlCisgICAgICAgICAgICBsaW5lTnVtYmVyICs9
IDEKKyAgICAgICAgd2hlbiAvXEFbYS16QS1aMC05JF0oW2EtekEtWjAtOV9dKikvCisgICAgICAg
ICAgICByZXN1bHQgPDwgVG9rZW4ubmV3KE9yaWdpbi5uZXcoZmlsZU5hbWUsIGxpbmVOdW1iZXIp
LCAkJikKKyAgICAgICAgd2hlbiAvXEEoWyBcdFxyXSspLworICAgICAgICAgICAgIyB3aGl0ZXNw
YWNlLCBpZ25vcmUKKyAgICAgICAgd2hlbiAvXEFbPSgpLF0vCisgICAgICAgICAgICByZXN1bHQg
PDwgVG9rZW4ubmV3KE9yaWdpbi5uZXcoZmlsZU5hbWUsIGxpbmVOdW1iZXIpLCAkJikKKyAgICAg
ICAgZWxzZQorICAgICAgICAgICAgcmFpc2UgIkxleGVyIGVycm9yIGF0ICN7T3JpZ2luLm5ldyhm
aWxlTmFtZSwgbGluZU51bWJlcikudG9fc30sIHVuZXhwZWN0ZWQgc2VxdWVuY2UgI3tzdHJbMC4u
MjBdLmluc3BlY3R9IgorICAgICAgICBlbmQKKyAgICAgICAgc3RyID0gJH4ucG9zdF9tYXRjaAor
ICAgIGVuZAorICAgIHJlc3VsdAorZW5kCisKK2RlZiBpc0tleXdvcmQodG9rZW4pCisgICAgIyBX
ZSBjYW4gZXh0ZW5kIHRoaXMgYXMgd2UgYWRkIG1vcmUga2V5d29yZHMuIExpa2UsIHdlIG1pZ2h0
IHdhbnQgImluY2x1ZGUiIGV2ZW50dWFsbHkuCisgICAgdG9rZW4gPX4gL1xBKChtYXRjaGVyKSlc
Wi8KK2VuZAorCitkZWYgaXNJZGVudGlmaWVyKHRva2VuKQorICAgIHRva2VuID1+IC9cQVthLXpB
LVowLTkkXShbYS16QS1aMC05X10qKVxaLyBhbmQgbm90IGlzS2V5d29yZCh0b2tlbikKK2VuZAor
CitjbGFzcyBQYXJzZXIKKyAgICBkZWYgaW5pdGlhbGl6ZShkYXRhLCBmaWxlTmFtZSkKKyAgICAg
ICAgQHRva2VucyA9IGxleChkYXRhLCBmaWxlTmFtZSkKKyAgICAgICAgQGlkeCA9IDAKKyAgICBl
bmQKKworICAgIGRlZiB0b2tlbgorICAgICAgICBAdG9rZW5zW0BpZHhdCisgICAgZW5kCisKKyAg
ICBkZWYgYWR2YW5jZQorICAgICAgICBAaWR4ICs9IDEKKyAgICBlbmQKKworICAgIGRlZiBwYXJz
ZUVycm9yKCpjb21tZW50KQorICAgICAgICBpZiB0b2tlbgorICAgICAgICAgICAgdG9rZW4ucGFy
c2VFcnJvcigqY29tbWVudCkKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgaWYgY29tbWVudC5l
bXB0eT8KKyAgICAgICAgICAgICAgICByYWlzZSAiUGFyc2UgZXJyb3IgYXQgZW5kIG9mIGZpbGUi
CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgcmFpc2UgIlBhcnNlIGVycm9yIGF0
IGVuZCBvZiBmaWxlOiAje2NvbW1lbnRbMF19IgorICAgICAgICAgICAgZW5kCisgICAgICAgIGVu
ZAorICAgIGVuZAorCisgICAgZGVmIGNvbnN1bWUoc3RyaW5nKQorICAgICAgICBwYXJzZUVycm9y
KCJFeHBlY3RlZCAje3N0cmluZ30iKSB1bmxlc3MgdG9rZW4gPT0gc3RyaW5nCisgICAgICAgIGFk
dmFuY2UKKyAgICBlbmQKKworICAgIGRlZiBjb25zdW1lSWRlbnRpZmllcgorICAgICAgICByZXN1
bHQgPSB0b2tlbi5zdHJpbmcKKyAgICAgICAgcGFyc2VFcnJvcigiRXhwZWN0ZWQgaWRlbnRpZmll
ciIpIHVubGVzcyBpc0lkZW50aWZpZXIocmVzdWx0KQorICAgICAgICBhZHZhbmNlCisgICAgICAg
IHJlc3VsdAorICAgIGVuZAorCisgICAgZGVmIGFkZFVuaXF1ZShuYW1lLCBwcm9kdWN0aW9ucywg
cHJvZHVjdGlvbikKKyAgICAgICAgaWYgbmFtZSA9PSBwcm9kdWN0aW9uLnZhck5hbWUKKyAgICAg
ICAgICAgIHBhcnNlRXJyb3IoIkNoaWxkIHByb2R1Y3Rpb24gaGFzIHNhbWUgbmFtZSBhcyBwYXJl
bnQgcHJvZHVjdGlvbiIpCisgICAgICAgIGVuZAorICAgICAgICBpZiBwcm9kdWN0aW9ucy5kZXRl
Y3QgeyB8IGVudHJ5IHwgZW50cnkubmFtZSA9PSBwcm9kdWN0aW9uLm5hbWUgfQorICAgICAgICAg
ICAgcGFyc2VFcnJvcigiRHVwbGljYXRlIHByb2R1Y3Rpb24iKQorICAgICAgICBlbmQKKyAgICAg
ICAgcHJvZHVjdGlvbnMgPDwgcHJvZHVjdGlvbgorICAgIGVuZAorCisgICAgZGVmIHBhcnNlCisg
ICAgICAgIGNvbnN1bWUoIm1hdGNoZXIiKQorCisgICAgICAgIG1hdGNoZXJOYW1lID0gY29uc3Vt
ZUlkZW50aWZpZXIKKworICAgICAgICBwcm9kdWN0aW9ucyA9IFtdCisKKyAgICAgICAgbG9vcCB7
CisgICAgICAgICAgICBicmVhayBpZiBAaWR4ID49IEB0b2tlbnMubGVuZ3RoCisKKyAgICAgICAg
ICAgICMgV2UgbWlnaHQgd2FudCB0byBzdXBwb3J0ICJpbmNsdWRlIi4gSWYgd2UgZGlkIHRoYXQs
IGl0IHdvdWxkIGdvIGhlcmUuCisgICAgICAgICAgICBwcm9kdWN0aW9uID0gcGFyc2VQcm9kdWN0
aW9uCisgICAgICAgICAgICAKKyAgICAgICAgICAgIGlmIHByb2R1Y3Rpb25zLmRldGVjdCB7IHwg
ZW50cnkgfCBlbnRyeS5uYW1lID09IHByb2R1Y3Rpb24ubmFtZSB9CisgICAgICAgICAgICAgICAg
cGFyc2VFcnJvcigiRHVwbGljYXRlIHByb2R1Y3Rpb24iKQorICAgICAgICAgICAgZW5kCisKKyAg
ICAgICAgICAgIHByb2R1Y3Rpb25zIDw8IHByb2R1Y3Rpb24KKyAgICAgICAgfQorCisgICAgICAg
IE1hdGNoZXIubmV3KG1hdGNoZXJOYW1lLCBwcm9kdWN0aW9ucykKKyAgICBlbmQKKworICAgIGRl
ZiBwYXJzZVByb2R1Y3Rpb24KKyAgICAgICAgb3JpZ2luID0gdG9rZW4ub3JpZ2luCisgICAgICAg
IG5hbWUgPSBjb25zdW1lSWRlbnRpZmllcgorCisgICAgICAgIGlmIHRva2VuID09ICI9IgorICAg
ICAgICAgICAgY29uc3VtZSgiPSIpCisgICAgICAgICAgICBvcGNvZGUgPSBjb25zdW1lSWRlbnRp
ZmllcgorICAgICAgICAgICAgY29uc3VtZSgiKCIpCisgICAgICAgIGVsc2lmIHRva2VuID09ICIo
IgorICAgICAgICAgICAgY29uc3VtZSgiKCIpCisgICAgICAgICAgICBvcGNvZGUgPSBuYW1lCisg
ICAgICAgICAgICBuYW1lID0gbmlsCisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHJldHVybiBQ
cm9kdWN0aW9uLm5ldyhvcmlnaW4sIG5hbWUsIG5pbCwgbmlsKQorICAgICAgICBlbmQKKyAgICAg
ICAgCisgICAgICAgIHByb2R1Y3Rpb25zID0gW10KKyAgICAgICAgbG9vcCB7CisgICAgICAgICAg
ICBicmVhayBpZiB0b2tlbiA9PSAiKSIKKworICAgICAgICAgICAgYWRkVW5pcXVlKG5hbWUsIHBy
b2R1Y3Rpb25zLCBwYXJzZVByb2R1Y3Rpb24pCisKKyAgICAgICAgICAgIGJyZWFrIGlmIHRva2Vu
ID09ICIpIgorICAgICAgICAgICAgY29uc3VtZSgiLCIpCisgICAgICAgIH0KKworICAgICAgICAj
IEFkdmFuY2UgYWZ0ZXIgdGhlICIpIgorICAgICAgICBhZHZhbmNlCisKKyAgICAgICAgUHJvZHVj
dGlvbi5uZXcob3JpZ2luLCBuYW1lLCBvcGNvZGUsIHByb2R1Y3Rpb25zKQorICAgIGVuZAorZW5k
CisKK2ZpbGVOYW1lID0gQVJHVlswXQorCitwYXJzZXIgPSBQYXJzZXIubmV3KElPOjpyZWFkKGZp
bGVOYW1lKSwgZmlsZU5hbWUpCittYXRjaGVyID0gcGFyc2VyLnBhcnNlCisKK2NsYXNzIFN1Yk1h
dGNoCisgICAgYXR0cl9yZWFkZXIgOmluZGV4TWFwLCA6cHJvZHVjdGlvbnMKKyAgICAKKyAgICBk
ZWYgaW5pdGlhbGl6ZShpbmRleExpc3QsIHByb2R1Y3Rpb25zKQorICAgICAgICBAaW5kZXhNYXAg
PSBbXQorICAgICAgICBAcHJvZHVjdGlvbnMgPSBbXQorICAgICAgICBpbmRleExpc3QuZWFjaCB7
CisgICAgICAgICAgICB8IGluZGV4IHwKKyAgICAgICAgICAgIEBpbmRleE1hcCA8PCBpbmRleAor
ICAgICAgICAgICAgQHByb2R1Y3Rpb25zIDw8IHByb2R1Y3Rpb25zW2luZGV4XQorICAgICAgICB9
CisgICAgZW5kCisKKyAgICBkZWYgbWFwSW5kZXhMaXN0KGluZGV4TGlzdCkKKyAgICAgICAgaW5k
ZXhMaXN0Lm1hcCB7CisgICAgICAgICAgICB8IGluZGV4IHwKKyAgICAgICAgICAgIEBpbmRleE1h
cFtpbmRleF0KKyAgICAgICAgfQorICAgIGVuZAorZW5kCisKK0ZpbGUub3BlbigiQjMiICsgbWF0
Y2hlci5uYW1lICsgIi5oIiwgInciKSB7CisgICAgfCBvdXRwIHwKKworICAgIG91dHAucHV0cyAi
Ly8gR2VuZXJhdGVkIGJ5IGdlbmVyYXRlX3BhdHRlcm5fbWF0Y2hlci5yYiBmcm9tICN7ZmlsZU5h
bWV9IC0tIGRvIG5vdCBlZGl0ISIKKworICAgIG91dHAucHV0cyAiI2lmbmRlZiBCMyN7bWF0Y2hl
ci5uYW1lfV9oIgorICAgIG91dHAucHV0cyAiI2RlZmluZSBCMyN7bWF0Y2hlci5uYW1lfV9oIgor
ICAgIAorICAgIG91dHAucHV0cyAiI2luY2x1ZGUgXCJCM1ZhbHVlLmhcIiIKKyAgICAKKyAgICBv
dXRwLnB1dHMgIm5hbWVzcGFjZSBKU0MgeyBuYW1lc3BhY2UgQjMgeyIKKworICAgIG91dHAucHV0
cyAidGVtcGxhdGU8dHlwZW5hbWUgQWRhcHRvcj4iCisgICAgb3V0cC5wdXRzICJ2b2lkIHJ1biN7
bWF0Y2hlci5uYW1lfShWYWx1ZSogX3ZhbHVlLCBBZGFwdG9yJiBhZGFwdG9yKSIKKyAgICBvdXRw
LnB1dHMgInsiCisKKyAgICAjIE5vdGUgdGhhdCB0aGlzIGRvZXMgbm90IGVtaXQgcHJvcGVybHkg
aW5kZW50ZWQgY29kZSwgYmVjYXVzZSBpdCdzIGEgcmVjdXJzaXZlIGVtaXR0ZXIuIElmIHlvdQor
ICAgICMgd2FudCB0byBzZWUgdGhlIGNvZGUgbmljZWx5IGZvcm1hdHRlZCwgb3BlbiBpdCBpbiBh
IGdvb2QgdGV4dCBlZGl0b3IgYW5kIGFzayBpdCB0byBmb3JtYXQgaXQKKyAgICAjIGZvciB5b3Uu
CisKKyAgICAjIEluIG9kZCBzaXR1YXRpb25zLCB3ZSBtYXkgbm90IHVzZSB0aGUgaW5wdXQgdmFs
dWUuIFRlbGwgdGhlIGNvbXBpbGVyIHRvIGNoaWxsIG91dCBhYm91dCBpdC4KKyAgICBvdXRwLnB1
dHMgIlVOVVNFRF9QQVJBTShfdmFsdWUpOyIKKyAgICAgICAgCisgICAgIyBUaGlzIGp1c3QgcHJv
dGVjdHMgdGhlIGNhbGxlciBmcm9tIGhhdmluZyB0byB3b3JyeSBhYm91dCBwcm9kdWN0aW9ucyBo
YXZpbmcgZGlmZmVyZW50IGxlbmd0aHMuCisgICAgZGVmIG1hdGNoTGVuZ3RoKG91dHAsIHZhbHVl
TmFtZSwgcHJvZHVjdGlvbnMpCisgICAgICAgIGluZGV4TGlzdHMgPSBbXQorICAgICAgICBwcm9k
dWN0aW9ucy5lYWNoX3dpdGhfaW5kZXggeworICAgICAgICAgICAgfCBwcm9kdWN0aW9uLCBpbmRl
eCB8CisgICAgICAgICAgICBpZiBpbmRleExpc3RzWy0xXSBhbmQgcHJvZHVjdGlvbnNbaW5kZXhM
aXN0c1stMV1bMF1dLmNoaWxkcmVuLmxlbmd0aCA9PSBwcm9kdWN0aW9uLmNoaWxkcmVuLmxlbmd0
aAorICAgICAgICAgICAgICAgIGluZGV4TGlzdHNbLTFdIDw8IGluZGV4CisgICAgICAgICAgICBl
bHNlCisgICAgICAgICAgICAgICAgaW5kZXhMaXN0cyA8PCBbaW5kZXhdCisgICAgICAgICAgICBl
bmQKKyAgICAgICAgfQorCisgICAgICAgIGluZGV4TGlzdHMuZWFjaCB7CisgICAgICAgICAgICB8
IGluZGV4TGlzdCB8CisgICAgICAgICAgICBsZW5ndGggPSBwcm9kdWN0aW9uc1tpbmRleExpc3Rb
MF1dLmNoaWxkcmVuLmxlbmd0aAorICAgICAgICAgICAgaWYgbGVuZ3RoID4gMAorICAgICAgICAg
ICAgICAgIG91dHAucHV0cyAiaWYgKCN7dmFsdWVOYW1lfS0+Y2hpbGRyZW4uc2l6ZSgpID49ICN7
bGVuZ3RofSkgeyIKKyAgICAgICAgICAgICAgICB5aWVsZCBpbmRleExpc3QKKyAgICAgICAgICAg
ICAgICBvdXRwLnB1dHMgIn0iCisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeWll
bGQgaW5kZXhMaXN0CisgICAgICAgICAgICBlbmQKKyAgICAgICAgfQorICAgIGVuZAorCisgICAg
IyBUaGlzIGVmZmljaWVudGx5IHNlbGVjdHMgZnJvbSB0aGUgZ2l2ZW4gc2V0IG9mIHByb2R1Y3Rp
b25zLiBJdCBhc3N1bWVzIHRoYXQgcHJvZHVjdGlvbnMKKyAgICAjIGFyZSBub3QgZHVwbGljYXRl
ZC4gSXQgeWllbGRzIHRoZSBpbmRleCBvZiB0aGUgZm91bmQgcHJvZHVjdGlvbiwgYW5kIHRoZSBj
b3JvdXRpbmUgaXMKKyAgICAjIHJlc3BvbnNpYmxlIGZvciBlbWl0dGluZyBzcGVjaWZpYyBjb2Rl
IGZvciB0aGF0IHByb2R1Y3Rpb24uIFRoZSBjb3JvdXRpbmUgaXMgZ2l2ZW4gbGlzdHMgb2YKKyAg
ICAjIGluZGljZXMgb2YgcG9zc2libHktbWF0Y2hpbmcgcHJvZHVjdGlvbnMuCisgICAgZGVmIG1h
dGNoUHJvZHVjdGlvbnMob3V0cCwgdmFsdWVOYW1lLCBwcm9kdWN0aW9ucykKKyAgICAgICAgIyBG
aXJzdCwgc3BsaXQgdGhlIHByb2R1Y3Rpb25zIGxpc3QgaW50byBydW5zIG9mIHByb2R1Y3Rpb25z
IHdpdGggYW4gb3Bjb2RlIGFuZCBwcm9kdWN0aW9ucworICAgICAgICAjIHdpdGhvdXQgb25lLgor
ICAgICAgICBpbmRleExpc3RzID0gW10KKyAgICAgICAgcHJvZHVjdGlvbnMuZWFjaF93aXRoX2lu
ZGV4IHsKKyAgICAgICAgICAgIHwgcHJvZHVjdGlvbiwgaW5kZXggfAorICAgICAgICAgICAgaWYg
aW5kZXhMaXN0c1stMV0gYW5kIHByb2R1Y3Rpb25zW2luZGV4TGlzdHNbLTFdWzBdXS5oYXNPcGNv
ZGUgPT0gcHJvZHVjdGlvbi5oYXNPcGNvZGUKKyAgICAgICAgICAgICAgICBpbmRleExpc3RzWy0x
XSA8PCBpbmRleAorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIGluZGV4TGlzdHMg
PDwgW2luZGV4XQorICAgICAgICAgICAgZW5kCisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAg
ICMgTm93LCBlbWl0IHBhdHRlcm4gbWF0Y2hpbmcgY29kZS4gV2UgZG8gaXQgZGlmZmVyZW50bHkg
Zm9yIGxpc3RzIHdpdGggYW4gb3Bjb2RlIHRoYW4gZm9yCisgICAgICAgICMgbGlzdHMgd2l0aG91
dCBvbmUuCisgICAgICAgIGluZGV4TGlzdHMuZWFjaCB7CisgICAgICAgICAgICB8IGluZGV4TGlz
dCB8CisgICAgICAgICAgICBpZiBwcm9kdWN0aW9uc1tpbmRleExpc3RbMF1dLmhhc09wY29kZQor
ICAgICAgICAgICAgICAgICMgTm93LCB3ZSBzcGxpdCB0aGlzIGluZGV4IGxpc3QgaW50byBncm91
cHMgZm9yIGVhY2ggb3Bjb2RlLgorICAgICAgICAgICAgICAgIGdyb3VwcyA9IHt9CisgICAgICAg
ICAgICAgICAgaW5kZXhMaXN0LmVhY2ggeworICAgICAgICAgICAgICAgICAgICB8IGluZGV4IHwK
KyAgICAgICAgICAgICAgICAgICAgcHJvZHVjdGlvbiA9IHByb2R1Y3Rpb25zW2luZGV4XQorICAg
ICAgICAgICAgICAgICAgICBpZiBncm91cHNbcHJvZHVjdGlvbi5vcGNvZGVdCisgICAgICAgICAg
ICAgICAgICAgICAgICBncm91cHNbcHJvZHVjdGlvbi5vcGNvZGVdIDw8IGluZGV4CisgICAgICAg
ICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgIGdyb3Vwc1twcm9kdWN0
aW9uLm9wY29kZV0gPSBbaW5kZXhdCisgICAgICAgICAgICAgICAgICAgIGVuZAorICAgICAgICAg
ICAgICAgIH0KKworICAgICAgICAgICAgICAgICMgRW1pdCBhIHN3aXRjaCBzdGF0ZW1lbnQuCisg
ICAgICAgICAgICAgICAgb3V0cC5wdXRzICJzd2l0Y2ggKCN7dmFsdWVOYW1lfS0+b3Bjb2RlKCkp
IHsiCisgICAgICAgICAgICAgICAgZ3JvdXBzLmVhY2hfcGFpciB7CisgICAgICAgICAgICAgICAg
ICAgIHwgb3Bjb2RlLCBzdWJJbmRleExpc3QgfAorICAgICAgICAgICAgICAgICAgICBvdXRwLnB1
dHMgImNhc2UgI3tvcGNvZGV9OiIKKyAgICAgICAgICAgICAgICAgICAgc3ViTWF0Y2ggPSBTdWJN
YXRjaC5uZXcoc3ViSW5kZXhMaXN0LCBwcm9kdWN0aW9ucykKKyAgICAgICAgICAgICAgICAgICAg
bWF0Y2hMZW5ndGgob3V0cCwgdmFsdWVOYW1lLCBzdWJNYXRjaC5wcm9kdWN0aW9ucykgeworICAg
ICAgICAgICAgICAgICAgICAgICAgfCBpbmRleExpc3QgfAorICAgICAgICAgICAgICAgICAgICAg
ICAgeWllbGQgc3ViTWF0Y2gubWFwSW5kZXhMaXN0KGluZGV4TGlzdCkKKyAgICAgICAgICAgICAg
ICAgICAgfQorICAgICAgICAgICAgICAgICAgICBvdXRwLnB1dHMgImJyZWFrOyIKKyAgICAgICAg
ICAgICAgICB9CisgICAgICAgICAgICAgICAgb3V0cC5wdXRzICJkZWZhdWx0OiIKKyAgICAgICAg
ICAgICAgICBvdXRwLnB1dHMgImJyZWFrOyIKKyAgICAgICAgICAgICAgICBvdXRwLnB1dHMgIn0i
CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgc3ViTWF0Y2ggPSBTdWJNYXRjaC5u
ZXcoaW5kZXhMaXN0LCBwcm9kdWN0aW9ucykKKyAgICAgICAgICAgICAgICBtYXRjaExlbmd0aChv
dXRwLCB2YWx1ZU5hbWUsIHN1Yk1hdGNoLnByb2R1Y3Rpb25zKSB7CisgICAgICAgICAgICAgICAg
ICAgIHwgaW5kZXhMaXN0IHwKKyAgICAgICAgICAgICAgICAgICAgeWllbGQgc3ViTWF0Y2gubWFw
SW5kZXhMaXN0KGluZGV4TGlzdCkKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICBlbmQK
KyAgICAgICAgfQorICAgIGVuZAorCisgICAgIyBUYWtlcyBwcm9kdWN0aW9ucyB0aGF0IGhhdmUg
dGhlIHNhbWUgb3Bjb2RlIGFuZCB0aGUgc2FtZSBsZW5ndGggYW5kIHNlbGVjdHMgZnJvbSB0aGVt
IGJhc2VkIG9uCisgICAgIyB0aGUgcHJvZHVjdGlvbnMgYXQgdGhlIGdpdmVuIGNvbHVtbi4KKyAg
ICBkZWYgbWF0Y2hDb2x1bW4ob3V0cCwgdmFsdWVOYW1lLCBwcm9kdWN0aW9ucywgY29sdW1uSW5k
ZXgpCisgICAgICAgIGlmIGNvbHVtbkluZGV4ID49IHByb2R1Y3Rpb25zWzBdLmNoaWxkcmVuLmxl
bmd0aAorICAgICAgICAgICAgeWllbGQgKDAuLi4ocHJvZHVjdGlvbnMuc2l6ZSkpLnRvX2EKKyAg
ICAgICAgICAgIHJldHVybgorICAgICAgICBlbmQKKworICAgICAgICBzdWJWYWx1ZSA9IG5ld1Zh
cgorICAgICAgICAKKyAgICAgICAgb3V0cC5wdXRzICJ7IgorICAgICAgICBvdXRwLnB1dHMgIlZh
bHVlKiAje3N1YlZhbHVlfSA9ICN7dmFsdWVOYW1lfS0+Y2hpbGQoI3tjb2x1bW5JbmRleH0pOyIK
KworICAgICAgICAjIFdlIG1heSBub3QgdXNlIHRoaXMgdmFsdWUuIFRlbGwgdGhlIGNvbXBpbGVy
IHRvIGNoaWxsIG91dCBhYm91dCBpdC4KKyAgICAgICAgb3V0cC5wdXRzICJVTlVTRURfUEFSQU0o
I3tzdWJWYWx1ZX0pOyIKKyAgICAgICAgCisgICAgICAgIHN1YlByb2R1Y3Rpb25zID0gcHJvZHVj
dGlvbnMubWFwIHsKKyAgICAgICAgICAgIHwgcHJvZHVjdGlvbiB8CisgICAgICAgICAgICBwcm9k
dWN0aW9uLmNoaWxkcmVuW2NvbHVtbkluZGV4XQorICAgICAgICB9CisKKyAgICAgICAgbWF0Y2hS
ZWN1cnNpdmVseShvdXRwLCBzdWJWYWx1ZSwgc3ViUHJvZHVjdGlvbnMpIHsKKyAgICAgICAgICAg
IHwgaW5kZXhMaXN0IHwKKyAgICAgICAgICAgIHN1Yk1hdGNoID0gU3ViTWF0Y2gubmV3KGluZGV4
TGlzdCwgcHJvZHVjdGlvbnMpCisgICAgICAgICAgICBtYXRjaENvbHVtbihvdXRwLCB2YWx1ZU5h
bWUsIHN1Yk1hdGNoLnByb2R1Y3Rpb25zLCBjb2x1bW5JbmRleCArIDEpIHsKKyAgICAgICAgICAg
ICAgICB8IGluZGV4TGlzdCB8CisgICAgICAgICAgICAgICAgeWllbGQgc3ViTWF0Y2gubWFwSW5k
ZXhMaXN0KGluZGV4TGlzdCkKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIG91
dHAucHV0cyAifSIKKyAgICBlbmQKKworICAgIGRlZiBtYXRjaFJlY3Vyc2l2ZWx5KG91dHAsIHZh
bHVlTmFtZSwgcHJvZHVjdGlvbnMpCisgICAgICAgIG1hdGNoUHJvZHVjdGlvbnMob3V0cCwgdmFs
dWVOYW1lLCBwcm9kdWN0aW9ucykgeworICAgICAgICAgICAgfCBpbmRleExpc3QgfAorICAgICAg
ICAgICAgIyBXZSBhcmUgZ3VhcmFudGVlZCB0aGF0IHRoaXMgaW5kZXggbGlzdCBjb250YWlucyBw
cm9kdWN0aW9ucyB3aXRoIHRoZSBzYW1lIG9wY29kZSBhbmQKKyAgICAgICAgICAgICMgdGhlIHNh
bWUgbGVuZ3RoLgorICAgICAgICAgICAgc3ViTWF0Y2ggPSBTdWJNYXRjaC5uZXcoaW5kZXhMaXN0
LCBwcm9kdWN0aW9ucykKKyAgICAgICAgICAgIG1hdGNoQ29sdW1uKG91dHAsIHZhbHVlTmFtZSwg
c3ViTWF0Y2gucHJvZHVjdGlvbnMsIDApIHsKKyAgICAgICAgICAgICAgICB8IGluZGV4TGlzdCB8
CisgICAgICAgICAgICAgICAgeWllbGQgc3ViTWF0Y2gubWFwSW5kZXhMaXN0KGluZGV4TGlzdCkK
KyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIGVuZAorCisgICAgbWF0Y2hSZWN1cnNpdmVs
eShvdXRwLCAiX3ZhbHVlIiwgbWF0Y2hlci5wcm9kdWN0aW9ucykgeworICAgICAgICB8IGluZGV4
TGlzdCB8CisgICAgICAgIGluZGV4TGlzdC5lYWNoIHsKKyAgICAgICAgICAgIHwgaW5kZXggfAor
ICAgICAgICAgICAgcHJvZHVjdGlvbiA9IG1hdGNoZXIucHJvZHVjdGlvbnNbaW5kZXhdCisgICAg
ICAgICAgICBvdXRwLnB1dHMgInsiCisgICAgICAgICAgICBvdXRwLnB1dHMgIlZhbHVlKiAje3By
b2R1Y3Rpb24udmFyTmFtZX0gPSBfdmFsdWU7IgorICAgICAgICAgICAgaW50ZXJuYWxBcmd1bWVu
dHMgPSBbXQorICAgICAgICAgICAgb3BlcmFuZEFyZ3VtZW50cyA9IFtdCisgICAgICAgICAgICB0
cnlBcmd1bWVudHMgPSBbXQorICAgICAgICAgICAgbnVtU2NvcGVzID0gMAorICAgICAgICAgICAg
c2VlbiA9IHt9CisgICAgICAgICAgICBwcm9kdWN0aW9uLmVhY2hWYXJpYWJsZSB7CisgICAgICAg
ICAgICAgICAgfCBwYXJlbnRWYXJOYW1lLCBjaGlsZE5hbWUsIGNoaWxkVmFyTmFtZSwga2luZCwg
aW5kZXggfAorICAgICAgICAgICAgICAgIGxvYWRFeHByID0gIiN7cGFyZW50VmFyTmFtZX0tPmNo
aWxkKCN7aW5kZXh9KSIKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBpZiBzZWVu
W2NoaWxkVmFyTmFtZV0KKyAgICAgICAgICAgICAgICAgICAgdG1wID0gbmV3VmFyCisgICAgICAg
ICAgICAgICAgICAgIG91dHAucHV0cyAiVmFsdWUqICN7dG1wfSA9ICN7bG9hZEV4cHJ9OyIKKyAg
ICAgICAgICAgICAgICAgICAgb3V0cC5wdXRzICJpZiAoI3t0bXB9ID09ICN7Y2hpbGRWYXJOYW1l
fSkgeyIKKyAgICAgICAgICAgICAgICAgICAgbnVtU2NvcGVzICs9IDEKKyAgICAgICAgICAgICAg
ICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHNlZW5bY2hpbGRWYXJOYW1lXSA9IHRydWUKKyAg
ICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgIG91dHAucHV0cyAiVmFsdWUq
ICN7Y2hpbGRWYXJOYW1lfSA9ICN7bG9hZEV4cHJ9OyIKKworICAgICAgICAgICAgICAgICAgICBp
ZiBjaGlsZE5hbWUgPX4gL1xBXCQvCisgICAgICAgICAgICAgICAgICAgICAgICBpZiBjaGlsZE5h
bWUgPX4gL1xBXCQoWzAtOV0rKVxaLworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHAu
cHV0cyAiaWYgKCN7Y2hpbGRWYXJOYW1lfS0+aXNJbnQoI3skMX0pKSB7IgorICAgICAgICAgICAg
ICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHAucHV0cyAi
aWYgKCN7Y2hpbGRWYXJOYW1lfS0+aGFzSW50KCkpIHsiCisgICAgICAgICAgICAgICAgICAgICAg
ICBlbmQKKyAgICAgICAgICAgICAgICAgICAgICAgIG51bVNjb3BlcyArPSAxCisgICAgICAgICAg
ICAgICAgICAgIGVuZAorICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAg
aW50ZXJuYWxBcmd1bWVudHMgPDwgY2hpbGRWYXJOYW1lIGlmIGtpbmQgPT0gOmludGVybmFsIG9y
IGtpbmQgPT0gOmFub25JbnRlcm5hbAorICAgICAgICAgICAgICAgICAgICBvcGVyYW5kQXJndW1l
bnRzIDw8IGNoaWxkVmFyTmFtZSBpZiBraW5kID09IDpvcGVyYW5kIG9yIGtpbmQgPT0gOmFub25P
cGVyYW5kCisgICAgICAgICAgICAgICAgICAgIHRyeUFyZ3VtZW50cyA8PCBjaGlsZFZhck5hbWUg
aWYga2luZCA9PSA6aW50ZXJuYWwgb3Iga2luZCA9PSA6b3BlcmFuZAorICAgICAgICAgICAgICAg
IGVuZAorICAgICAgICAgICAgfQorICAgICAgICAgICAgb3V0cC5wdXRzICJpZiAoYWRhcHRvci5h
Y2NlcHRSb290KF92YWx1ZSkiCisgICAgICAgICAgICBvdXRwLnB1dHMoIiAgICAmJiBhZGFwdG9y
LmFjY2VwdEludGVybmFscygiICsgaW50ZXJuYWxBcmd1bWVudHMuam9pbigiLCAiKSArICIpIikK
KyAgICAgICAgICAgIG91dHAucHV0cygiICAgICYmIGFkYXB0b3IuYWNjZXB0T3BlcmFuZHMoIiAr
IG9wZXJhbmRBcmd1bWVudHMuam9pbigiLCAiKSArICIpIikKKyAgICAgICAgICAgIG91dHAucHV0
cygiICAgICYmIGFkYXB0b3IudHJ5I3twcm9kdWN0aW9uLm5hbWV9KCIgKyB0cnlBcmd1bWVudHMu
am9pbigiLCAiKSArICIpKSIpCisgICAgICAgICAgICBvdXRwLnB1dHMgIiAgICByZXR1cm47Igor
ICAgICAgICAgICAgbnVtU2NvcGVzLnRpbWVzIHsKKyAgICAgICAgICAgICAgICBvdXRwLnB1dHMg
In0iCisgICAgICAgICAgICB9CisgICAgICAgICAgICBvdXRwLnB1dHMgIn0iCisgICAgICAgIH0K
KyAgICB9CisgICAgCisgICAgb3V0cC5wdXRzICIgICAgUkVMRUFTRV9BU1NFUlRfTk9UX1JFQUNI
RUQoKTsiCisgICAgb3V0cC5wdXRzICJ9IgorICAgIAorICAgIG91dHAucHV0cyAifSB9IC8vIG5h
bWVzcGFjZSBKU0M6OkIzIgorCisgICAgb3V0cC5wdXRzICIjZW5kaWYgLy8gQjMje21hdGNoZXIu
bmFtZX1faCIKK30KSW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9haXIvQWlyQXJnLmNw
cAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvYWlyL0FpckFyZy5jcHAJ
KHJldmlzaW9uIDApCisrKyBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvYWlyL0FpckFyZy5jcHAJ
KHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSw4MSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAx
NSBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24g
YW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBt
b2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNv
bmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNv
ZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxp
c3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVk
aXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5
cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xs
b3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVy
IG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBT
T0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBF
WFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQg
VE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklU
TkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8g
RVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1Ig
QU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlks
IE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8s
CisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9G
IFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9X
RVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJ
TiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdM
SUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisg
KiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9G
IFNVQ0ggREFNQUdFLiAKKyAqLworCisjaW5jbHVkZSAiY29uZmlnLmgiCisjaW5jbHVkZSAiQWly
QXJnLmgiCisKK25hbWVzcGFjZSBKU0MgeyBuYW1lc3BhY2UgQjMgeyBuYW1lc3BhY2UgQWlyIHsK
Kwordm9pZCBBcmc6OmR1bXAoUHJpbnRTdHJlYW0mIG91dCkgY29uc3QKK3sKKyAgICBzd2l0Y2gg
KG1fa2luZCkgeworICAgIGNhc2UgVG1wOgorICAgICAgICBvdXQucHJpbnQodG1wKCkpOworICAg
ICAgICByZXR1cm47CisgICAgY2FzZSBJbW06CisgICAgICAgIG91dC5wcmludCgiJCIsIG1fb2Zm
c2V0KTsKKyAgICAgICAgcmV0dXJuOworICAgIGNhc2UgSW1tNjQ6CisgICAgICAgIG91dC5wcmlu
dGYoIiQweCVsbHgiLCBtX29mZnNldCk7CisgICAgICAgIHJldHVybjsKKyAgICBjYXNlIEFkZHI6
CisgICAgICAgIGlmIChvZmZzZXQoKSkKKyAgICAgICAgICAgIG91dC5wcmludChvZmZzZXQoKSk7
CisgICAgICAgIG91dC5wcmludCgiKCIsIGJhc2UoKSwgIikiKTsKKyAgICAgICAgcmV0dXJuOwor
ICAgIGNhc2UgSW5kZXg6CisgICAgICAgIGlmIChvZmZzZXQoKSkKKyAgICAgICAgICAgIG91dC5w
cmludChvZmZzZXQoKSk7CisgICAgICAgIG91dC5wcmludCgiKCIsIGJhc2UoKSwgIiwiLCBpbmRl
eCgpKTsKKyAgICAgICAgaWYgKHNjYWxlKCkgIT0gMSkKKyAgICAgICAgICAgIG91dC5wcmludCgi
LCIsIHNjYWxlKCkpOworICAgICAgICBvdXQucHJpbnQoIikiKTsKKyAgICAgICAgcmV0dXJuOwor
ICAgIGNhc2UgU3RhY2s6CisgICAgICAgIGlmIChvZmZzZXQoKSkKKyAgICAgICAgICAgIG91dC5w
cmludChvZmZzZXQpOworICAgICAgICBvdXQucHJpbnQoIigiLCBwb2ludGVyRHVtcChzdGFja1Ns
b3QoKSksICIpIik7CisgICAgICAgIHJldHVybjsKKyAgICBjYXNlIENhbGxBcmc6CisgICAgICAg
IGlmIChvZmZzZXQoKSkKKyAgICAgICAgICAgIG91dC5wcmludChvZmZzZXQpOworICAgICAgICBv
dXQucHJpbnQoIihjYWxsQXJnKSIpOworICAgICAgICByZXR1cm47CisgICAgY2FzZSBSZWxDb25k
OgorICAgICAgICBvdXQucHJpbnQoYXNSZWxhdGlvbmFsQ29uZGl0aW9uKCkpOworICAgICAgICBy
ZXR1cm47CisgICAgY2FzZSBSZXNDb25kOgorICAgICAgICBvdXQucHJpbnQoYXNSZXN1bHRDb25k
aXRpb24oKSk7CisgICAgICAgIHJldHVybjsKKyAgICBjYXNlIFNwZWNpYWw6CisgICAgICAgIG91
dC5wcmludCgiJiIsIHBvaW50ZXJEdW1wKHNwZWNpYWwoKSkpOworICAgICAgICByZXR1cm47Cisg
ICAgfQorCisgICAgUkVMRUFTRV9BU1NFUlRfTk9UX1JFQUNIRUQoKTsKK30KKworfSB9IH0gLy8g
bmFtZXNwYWNlIEpTQzo6QjM6OkFpcgorCkluZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMv
YWlyL0FpckFyZy5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9haXIv
QWlyQXJnLmgJKHJldmlzaW9uIDApCisrKyBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvYWlyL0Fp
ckFyZy5oCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsNTY1IEBACisvKgorICogQ29weXJpZ2h0
IChDKSAyMDE1IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3Ry
aWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhv
dXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xs
b3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBz
b3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2Us
IHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisg
KiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFi
b3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQg
dGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQv
b3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisg
KiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBB
TlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1Qg
TElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZ
IEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQu
ICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElB
QkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVY
RU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElN
SVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7
IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBU
SU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBX
SEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVE
SU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRI
RSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lC
SUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisKKyNpZm5kZWYgQWlyQXJnX2gKKyNkZWZpbmUg
QWlyQXJnX2gKKworI2luY2x1ZGUgIkFpclRtcC5oIgorI2luY2x1ZGUgIkIzVHlwZS5oIgorCitu
YW1lc3BhY2UgSlNDIHsgbmFtZXNwYWNlIEIzIHsgbmFtZXNwYWNlIEFpciB7CisKK2NsYXNzIFNw
ZWNpYWw7CitjbGFzcyBTdGFja1Nsb3Q7CisKKy8vIFRoaXMgY2xhc3MgbmFtZSBpcyBhbHNvIGlu
dGVudGlvbmFsbHkgdGVyc2UgYmVjYXVzZSB3ZSB3aWxsIHNheSBpdCBhIGxvdC4gWW91J2xsIHNl
ZSBjb2RlIGxpa2UKKy8vIEluc3QoLi4uLCBBcmc6OmltbSg1KSwgQXJnOjphZGRyKHRoaW5nLCBi
bGFoKSwgLi4uKQorY2xhc3MgQXJnIHsKK3B1YmxpYzoKKyAgICAvLyBUaGVzZSBlbnVtIG1lbWJl
cnMgYXJlIGludGVudGlvbmFsbHkgdGVyc2UgYmVjYXVzZSB3ZSBoYXZlIHRvIG1lbnRpb24gdGhl
bSBhIGxvdC4KKyAgICBlbnVtIEtpbmQgOiBpbnQ4X3QgeworICAgICAgICBUbXAsCisgICAgICAg
IEltbSwKKyAgICAgICAgSW1tNjQsCisgICAgICAgIEFkZHIsCisgICAgICAgIFN0YWNrLAorICAg
ICAgICBDYWxsQXJnLAorICAgICAgICBJbmRleCwKKyAgICAgICAgUmVsQ29uZCwKKyAgICAgICAg
UmVzQ29uZCwKKyAgICAgICAgU3BlY2lhbAorICAgIH07CisKKyAgICBlbnVtIFJvbGUgOiBpbnQ4
X3QgeworICAgICAgICBVc2UsCisgICAgICAgIERlZiwKKyAgICAgICAgVXNlRGVmCisgICAgfTsK
KworICAgIGVudW0gVHlwZSA6IGludDhfdCB7CisgICAgICAgIEdQLAorICAgICAgICBGUAorICAg
IH07CisKKyAgICBzdGF0aWMgYm9vbCBpc1VzZShSb2xlIHJvbGUpCisgICAgeworICAgICAgICBz
d2l0Y2ggKHJvbGUpIHsKKyAgICAgICAgY2FzZSBVc2U6CisgICAgICAgIGNhc2UgVXNlRGVmOgor
ICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIGNhc2UgRGVmOgorICAgICAgICAgICAg
cmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgfQorCisgICAgc3RhdGljIGJvb2wgaXNEZWYo
Um9sZSByb2xlKQorICAgIHsKKyAgICAgICAgc3dpdGNoIChyb2xlKSB7CisgICAgICAgIGNhc2Ug
VXNlOgorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICBjYXNlIERlZjoKKyAgICAg
ICAgY2FzZSBVc2VEZWY6CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAg
IH0KKworICAgIHN0YXRpYyBUeXBlIHR5cGVGb3JCM1R5cGUoQjM6OlR5cGUgdHlwZSkKKyAgICB7
CisgICAgICAgIHN3aXRjaCAodHlwZSkgeworICAgICAgICBjYXNlIFZvaWQ6CisgICAgICAgICAg
ICBBU1NFUlRfTk9UX1JFQUNIRUQoKTsKKyAgICAgICAgICAgIHJldHVybiBHUDsKKyAgICAgICAg
Y2FzZSBJbnQzMjoKKyAgICAgICAgY2FzZSBJbnQ2NDoKKyAgICAgICAgICAgIHJldHVybiBHUDsK
KyAgICAgICAgY2FzZSBEb3VibGU6CisgICAgICAgICAgICByZXR1cm4gRlA7CisgICAgICAgIH0K
KyAgICAgICAgQVNTRVJUX05PVF9SRUFDSEVEKCk7CisgICAgICAgIHJldHVybiBHUDsKKyAgICB9
CisKKyAgICBBcmcoKQorICAgIHsKKyAgICB9CisKKyAgICBBcmcoQWlyOjpUbXAgdG1wKQorICAg
ICAgICA6IG1fa2luZChUbXApCisgICAgICAgICwgbV9iYXNlKHRtcCkKKyAgICB7CisgICAgfQor
CisgICAgc3RhdGljIEFyZyBpbW0oaW50MzJfdCB2YWx1ZSkKKyAgICB7CisgICAgICAgIEFyZyBy
ZXN1bHQ7CisgICAgICAgIHJlc3VsdC5tX2tpbmQgPSBJbW07CisgICAgICAgIHJlc3VsdC5tX29m
ZnNldCA9IHZhbHVlOworICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKworICAgIHN0YXRp
YyBBcmcgaW1tNjQoaW50cHRyX3QgdmFsdWUpCisgICAgeworICAgICAgICBBcmcgcmVzdWx0Owor
ICAgICAgICByZXN1bHQubV9raW5kID0gSW1tNjQ7CisgICAgICAgIHJlc3VsdC5tX29mZnNldCA9
IHZhbHVlOworICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKworICAgIHN0YXRpYyBBcmcg
YWRkcmVzcyhBaXI6OlRtcCBiYXNlLCBpbnQzMl90IG9mZnNldCA9IDApCisgICAgeworICAgICAg
ICBBU1NFUlQoYmFzZS5pc0dQKCkpOworICAgICAgICBBcmcgcmVzdWx0OworICAgICAgICByZXN1
bHQubV9raW5kID0gQWRkcjsKKyAgICAgICAgcmVzdWx0Lm1fYmFzZSA9IGJhc2U7CisgICAgICAg
IHJlc3VsdC5tX29mZnNldCA9IG9mZnNldDsKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9
CisKKyAgICBzdGF0aWMgQXJnIHN0YWNrKFN0YWNrU2xvdCogdmFsdWUsIGludDMyX3Qgb2Zmc2V0
ID0gMCkKKyAgICB7CisgICAgICAgIEFyZyByZXN1bHQ7CisgICAgICAgIHJlc3VsdC5tX2tpbmQg
PSBTdGFjazsKKyAgICAgICAgcmVzdWx0Lm1fb2Zmc2V0ID0gYml0d2lzZV9jYXN0PGludHB0cl90
Pih2YWx1ZSk7CisgICAgICAgIHJlc3VsdC5tX3NjYWxlID0gb2Zmc2V0OyAvLyBJIGtub3csIHl1
Y2suCisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorCisgICAgc3RhdGljIEFyZyBjYWxs
QXJnKGludDMyX3Qgb2Zmc2V0KQorICAgIHsKKyAgICAgICAgQXJnIHJlc3VsdDsKKyAgICAgICAg
cmVzdWx0Lm1fa2luZCA9IENhbGxBcmc7CisgICAgICAgIHJlc3VsdC5tX29mZnNldCA9IG9mZnNl
dDsKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisKKyAgICBzdGF0aWMgYm9vbCBpc1Zh
bGlkU2NhbGUodW5zaWduZWQgc2NhbGUpCisgICAgeworICAgICAgICBzd2l0Y2ggKHNjYWxlKSB7
CisgICAgICAgIGNhc2UgMToKKyAgICAgICAgY2FzZSAyOgorICAgICAgICBjYXNlIDQ6CisgICAg
ICAgIGNhc2UgODoKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICBkZWZhdWx0Ogor
ICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgfQorCisgICAgc3RhdGlj
IHVuc2lnbmVkIGxvZ1NjYWxlKHVuc2lnbmVkIHNjYWxlKQorICAgIHsKKyAgICAgICAgc3dpdGNo
IChzY2FsZSkgeworICAgICAgICBjYXNlIDE6CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAg
ICAgY2FzZSAyOgorICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgIGNhc2UgNDoKKyAgICAg
ICAgICAgIHJldHVybiAyOworICAgICAgICBjYXNlIDg6CisgICAgICAgICAgICByZXR1cm4gMzsK
KyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIEFTU0VSVF9OT1RfUkVBQ0hFRCgpOworICAg
ICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBzdGF0aWMgQXJnIGlu
ZGV4KEFpcjo6VG1wIGJhc2UsIEFpcjo6VG1wIGluZGV4LCB1bnNpZ25lZCBzY2FsZSA9IDEsIGlu
dDMyX3Qgb2Zmc2V0ID0gMCkKKyAgICB7CisgICAgICAgIEFTU0VSVChiYXNlLmlzR1AoKSk7Cisg
ICAgICAgIEFTU0VSVChpbmRleC5pc0dQKCkpOworICAgICAgICBBU1NFUlQoaXNWYWxpZFNjYWxl
KHNjYWxlKSk7CisgICAgICAgIEFyZyByZXN1bHQ7CisgICAgICAgIHJlc3VsdC5tX2tpbmQgPSBJ
bmRleDsKKyAgICAgICAgcmVzdWx0Lm1fYmFzZSA9IGJhc2U7CisgICAgICAgIHJlc3VsdC5tX2lu
ZGV4ID0gaW5kZXg7CisgICAgICAgIHJlc3VsdC5tX3NjYWxlID0gc3RhdGljX2Nhc3Q8aW50MzJf
dD4oc2NhbGUpOworICAgICAgICByZXN1bHQubV9vZmZzZXQgPSBvZmZzZXQ7CisgICAgICAgIHJl
dHVybiByZXN1bHQ7CisgICAgfQorCisgICAgc3RhdGljIEFyZyByZWxDb25kKE1hY3JvQXNzZW1i
bGVyOjpSZWxhdGlvbmFsQ29uZGl0aW9uIGNvbmRpdGlvbikKKyAgICB7CisgICAgICAgIEFyZyBy
ZXN1bHQ7CisgICAgICAgIHJlc3VsdC5tX2tpbmQgPSBSZWxDb25kOworICAgICAgICByZXN1bHQu
bV9vZmZzZXQgPSBjb25kaXRpb247CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorCisg
ICAgc3RhdGljIEFyZyByZXNDb25kKE1hY3JvQXNzZW1ibGVyOjpSZXN1bHRDb25kaXRpb24gY29u
ZGl0aW9uKQorICAgIHsKKyAgICAgICAgQXJnIHJlc3VsdDsKKyAgICAgICAgcmVzdWx0Lm1fa2lu
ZCA9IFJlc0NvbmQ7CisgICAgICAgIHJlc3VsdC5tX29mZnNldCA9IGNvbmRpdGlvbjsKKyAgICAg
ICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisKKyAgICBzdGF0aWMgQXJnIHNwZWNpYWwoQWlyOjpT
cGVjaWFsKiBzcGVjaWFsKQorICAgIHsKKyAgICAgICAgQXJnIHJlc3VsdDsKKyAgICAgICAgcmVz
dWx0Lm1fa2luZCA9IFNwZWNpYWw7CisgICAgICAgIHJlc3VsdC5tX29mZnNldCA9IGJpdHdpc2Vf
Y2FzdDxpbnRwdHJfdD4oc3BlY2lhbCk7CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQor
CisgICAgYm9vbCBvcGVyYXRvcj09KGNvbnN0IEFyZyYgb3RoZXIpIGNvbnN0CisgICAgeworICAg
ICAgICByZXR1cm4gbV9vZmZzZXQgPT0gb3RoZXIubV9vZmZzZXQKKyAgICAgICAgICAgICYmIG1f
a2luZCA9PSBvdGhlci5tX2tpbmQKKyAgICAgICAgICAgICYmIG1fYmFzZSA9PSBvdGhlci5tX2Jh
c2UKKyAgICAgICAgICAgICYmIG1faW5kZXggPT0gb3RoZXIubV9pbmRleAorICAgICAgICAgICAg
JiYgbV9zY2FsZSA9PSBvdGhlci5tX3NjYWxlOworICAgIH0KKworICAgIGJvb2wgb3BlcmF0b3Ih
PShjb25zdCBBcmcmIG90aGVyKSBjb25zdAorICAgIHsKKyAgICAgICAgcmV0dXJuICEoKnRoaXMg
PT0gb3RoZXIpOworICAgIH0KKworICAgIGV4cGxpY2l0IG9wZXJhdG9yIGJvb2woKSBjb25zdCB7
IHJldHVybiAqdGhpcyAhPSBBcmcoKTsgfQorCisgICAgS2luZCBraW5kKCkgY29uc3QKKyAgICB7
CisgICAgICAgIHJldHVybiBtX2tpbmQ7CisgICAgfQorCisgICAgYm9vbCBpc1RtcCgpIGNvbnN0
CisgICAgeworICAgICAgICByZXR1cm4ga2luZCgpID09IFRtcDsKKyAgICB9CisKKyAgICBib29s
IGlzSW1tKCkgY29uc3QKKyAgICB7CisgICAgICAgIHJldHVybiBraW5kKCkgPT0gSW1tOworICAg
IH0KKworICAgIGJvb2wgaXNJbW02NCgpIGNvbnN0CisgICAgeworICAgICAgICByZXR1cm4ga2lu
ZCgpID09IEltbTY0OworICAgIH0KKworICAgIGJvb2wgaXNBZGRyKCkgY29uc3QKKyAgICB7Cisg
ICAgICAgIHJldHVybiBraW5kKCkgPT0gQWRkcjsKKyAgICB9CisKKyAgICBib29sIGlzSW5kZXgo
KSBjb25zdAorICAgIHsKKyAgICAgICAgcmV0dXJuIGtpbmQoKSA9PSBJbmRleDsKKyAgICB9CisK
KyAgICBib29sIGlzUmVsQ29uZCgpIGNvbnN0CisgICAgeworICAgICAgICByZXR1cm4ga2luZCgp
ID09IFJlbENvbmQ7CisgICAgfQorCisgICAgYm9vbCBpc1Jlc0NvbmQoKSBjb25zdAorICAgIHsK
KyAgICAgICAgcmV0dXJuIGtpbmQoKSA9PSBSZXNDb25kOworICAgIH0KKworICAgIGJvb2wgaXNT
cGVjaWFsKCkgY29uc3QKKyAgICB7CisgICAgICAgIHJldHVybiBraW5kKCkgPT0gU3BlY2lhbDsK
KyAgICB9CisKKyAgICBBaXI6OlRtcCB0bXAoKSBjb25zdAorICAgIHsKKyAgICAgICAgQVNTRVJU
KGtpbmQoKSA9PSBUbXApOworICAgICAgICByZXR1cm4gbV9iYXNlOworICAgIH0KKworICAgIGlu
dDY0X3QgdmFsdWUoKSBjb25zdAorICAgIHsKKyAgICAgICAgQVNTRVJUKGtpbmQoKSA9PSBJbW0g
fHwga2luZCgpID09IEltbTY0KTsKKyAgICAgICAgcmV0dXJuIG1fb2Zmc2V0OworICAgIH0KKwor
ICAgIHZvaWQqIHBvaW50ZXJWYWx1ZSgpIGNvbnN0CisgICAgeworICAgICAgICBBU1NFUlQoa2lu
ZCgpID09IEltbTY0KTsKKyAgICAgICAgcmV0dXJuIGJpdHdpc2VfY2FzdDx2b2lkKj4oc3RhdGlj
X2Nhc3Q8aW50cHRyX3Q+KG1fb2Zmc2V0KSk7CisgICAgfQorCisgICAgQWlyOjpUbXAgYmFzZSgp
IGNvbnN0CisgICAgeworICAgICAgICBBU1NFUlQoa2luZCgpID09IEFkZHIgfHwga2luZCgpID09
IEluZGV4KTsKKyAgICAgICAgcmV0dXJuIG1fYmFzZTsKKyAgICB9CisKKyAgICBpbnQzMl90IG9m
ZnNldCgpIGNvbnN0CisgICAgeworICAgICAgICBpZiAoa2luZCgpID09IFN0YWNrKQorICAgICAg
ICAgICAgcmV0dXJuIHN0YXRpY19jYXN0PGludDMyX3Q+KG1fc2NhbGUpOworICAgICAgICBBU1NF
UlQoa2luZCgpID09IEFkZHIgfHwga2luZCgpID09IENhbGxBcmcgfHwga2luZCgpID09IEluZGV4
KTsKKyAgICAgICAgcmV0dXJuIHN0YXRpY19jYXN0PGludDMyX3Q+KG1fb2Zmc2V0KTsKKyAgICB9
CisKKyAgICBTdGFja1Nsb3QqIHN0YWNrU2xvdCgpIGNvbnN0CisgICAgeworICAgICAgICBBU1NF
UlQoa2luZCgpID09IFN0YWNrKTsKKyAgICAgICAgcmV0dXJuIGJpdHdpc2VfY2FzdDxTdGFja1Ns
b3QqPihtX29mZnNldCk7CisgICAgfQorCisgICAgQWlyOjpUbXAgaW5kZXgoKSBjb25zdAorICAg
IHsKKyAgICAgICAgQVNTRVJUKGtpbmQoKSA9PSBJbmRleCk7CisgICAgICAgIHJldHVybiBtX2lu
ZGV4OworICAgIH0KKworICAgIHVuc2lnbmVkIHNjYWxlKCkgY29uc3QKKyAgICB7CisgICAgICAg
IEFTU0VSVChraW5kKCkgPT0gSW5kZXgpOworICAgICAgICByZXR1cm4gbV9zY2FsZTsKKyAgICB9
CisKKyAgICB1bnNpZ25lZCBsb2dTY2FsZSgpIGNvbnN0CisgICAgeworICAgICAgICByZXR1cm4g
bG9nU2NhbGUoc2NhbGUoKSk7CisgICAgfQorCisgICAgQWlyOjpTcGVjaWFsKiBzcGVjaWFsKCkg
Y29uc3QKKyAgICB7CisgICAgICAgIEFTU0VSVChraW5kKCkgPT0gU3BlY2lhbCk7CisgICAgICAg
IHJldHVybiBiaXR3aXNlX2Nhc3Q8QWlyOjpTcGVjaWFsKj4obV9vZmZzZXQpOworICAgIH0KKwor
ICAgIGJvb2wgaXNHUFRtcCgpIGNvbnN0CisgICAgeworICAgICAgICByZXR1cm4gaXNUbXAoKSAm
JiB0bXAoKS5pc0dQKCk7CisgICAgfQorCisgICAgYm9vbCBpc0ZQVG1wKCkgY29uc3QKKyAgICB7
CisgICAgICAgIHJldHVybiBpc1RtcCgpICYmIHRtcCgpLmlzRlAoKTsKKyAgICB9CisgICAgCisg
ICAgLy8gVGVsbHMgdXMgaWYgdGhpcyBBcmcgY2FuIGJlIHVzZWQgaW4gYSBwb3NpdGlvbiB0aGF0
IHJlcXVpcmVzIGEgR1AgdmFsdWUuCisgICAgYm9vbCBpc0dQKCkgY29uc3QKKyAgICB7CisgICAg
ICAgIHN3aXRjaCAoa2luZCgpKSB7CisgICAgICAgIGNhc2UgSW1tOgorICAgICAgICBjYXNlIElt
bTY0OgorICAgICAgICBjYXNlIEFkZHI6CisgICAgICAgIGNhc2UgSW5kZXg6CisgICAgICAgIGNh
c2UgU3RhY2tTbG90OgorICAgICAgICBjYXNlIENhbGxBcmc6CisgICAgICAgIGNhc2UgUmVsQ29u
ZDoKKyAgICAgICAgY2FzZSBSZXNDb25kOgorICAgICAgICBjYXNlIFNwZWNpYWw6CisgICAgICAg
ICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgY2FzZSBUbXA6CisgICAgICAgICAgICByZXR1cm4g
aXNHUFRtcCgpOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gVGVsbHMgdXMgaWYgdGhpcyBB
cmcgY2FuIGJlIHVzZWQgaW4gYSBwb3NpdGlvbiB0aGF0IHJlcXVpcmVzIGEgRlAgdmFsdWUuCisg
ICAgYm9vbCBpc0ZQKCkgY29uc3QKKyAgICB7CisgICAgICAgIHN3aXRjaCAoa2luZCgpKSB7Cisg
ICAgICAgIGNhc2UgSW1tOgorICAgICAgICBjYXNlIFJlbENvbmQ6CisgICAgICAgIGNhc2UgUmVz
Q29uZDoKKyAgICAgICAgY2FzZSBTcGVjaWFsOgorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwor
ICAgICAgICBjYXNlIEFkZHI6CisgICAgICAgIGNhc2UgSW5kZXg6CisgICAgICAgIGNhc2UgQmFz
ZToKKyAgICAgICAgY2FzZSBTdGFja1Nsb3Q6CisgICAgICAgIGNhc2UgQ2FsbEFyZzoKKyAgICAg
ICAgY2FzZSBJbW02NDogLy8gWWVzLCB3ZSBhbGxvdyBJbW02NCBhcyBhIGRvdWJsZSBpbW1lZGlh
dGUuIFdlIHVzZSB0aGlzIGZvciBpbXBsZW1lbnRpbmcgc3RhY2ttYXBzLgorICAgICAgICAgICAg
cmV0dXJuIHRydWU7CisgICAgICAgIGNhc2UgVG1wOgorICAgICAgICAgICAgcmV0dXJuIGlzRlBU
bXAoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGJvb2wgaGFzVHlwZSgpIGNvbnN0CisgICAg
eworICAgICAgICBzd2l0Y2ggKGtpbmQoKSkgeworICAgICAgICBjYXNlIEltbToKKyAgICAgICAg
Y2FzZSBTcGVjaWFsOgorICAgICAgICBjYXNlIFRtcDoKKyAgICAgICAgICAgIHJldHVybiB0cnVl
OworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9
CisgICAgfQorICAgIAorICAgIC8vIFRoZSB0eXBlIGlzIGFtYmlndW91cyBmb3Igc29tZSBhcmcg
a2luZHMuIENhbGwgd2l0aCBjYXJlLgorICAgIFR5cGUgdHlwZSgpIGNvbnN0CisgICAgeworICAg
ICAgICByZXR1cm4gaXNHUCgpID8gR1AgOiBGUDsKKyAgICB9CisKKyAgICBib29sIGlzVHlwZShU
eXBlIHR5cGUpIGNvbnN0CisgICAgeworICAgICAgICBzd2l0Y2ggKHR5cGUpIHsKKyAgICAgICAg
Y2FzZSBHUDoKKyAgICAgICAgICAgIHJldHVybiBpc0dQKCk7CisgICAgICAgIGNhc2UgRlA6Cisg
ICAgICAgICAgICByZXR1cm4gaXNGUCgpOworICAgICAgICB9CisgICAgfQorCisgICAgYm9vbCBp
c0dQUigpIGNvbnN0CisgICAgeworICAgICAgICByZXR1cm4gaXNUbXAoKSAmJiB0bXAoKS5pc0dQ
UigpOworICAgIH0KKworICAgIEdQUlJlZyBncHIoKSBjb25zdAorICAgIHsKKyAgICAgICAgcmV0
dXJuIHRtcCgpLmdwcigpOworICAgIH0KKworICAgIGJvb2wgaXNGUFIoKSBjb25zdAorICAgIHsK
KyAgICAgICAgcmV0dXJuIGlzVG1wKCkgJiYgdG1wKCkuaXNGUFIoKTsKKyAgICB9CisKKyAgICBG
UFJSZWcgZnByKCkgY29uc3QKKyAgICB7CisgICAgICAgIHJldHVybiB0bXAoKS5mcHIoKTsKKyAg
ICB9CisgICAgCisgICAgYm9vbCBpc1JlZygpIGNvbnN0CisgICAgeworICAgICAgICByZXR1cm4g
aXNUbXAoKSAmJiB0bXAoKS5pc1JlZygpOworICAgIH0KKworICAgIFJlZyByZWcoKSBjb25zdAor
ICAgIHsKKyAgICAgICAgcmV0dXJuIHRtcCgpLnJlZygpOworICAgIH0KKworICAgIHVuc2lnbmVk
IGdwVG1wSW5kZXgoKSBjb25zdAorICAgIHsKKyAgICAgICAgcmV0dXJuIHRtcCgpLmdwVG1wSW5k
ZXgoKTsKKyAgICB9CisKKyAgICB1bnNpZ25lZCBmcFRtcEluZGV4KCkgY29uc3QKKyAgICB7Cisg
ICAgICAgIHJldHVybiB0bXAoKS5mcFRtcEluZGV4KCk7CisgICAgfQorCisgICAgdW5zaWduZWQg
dG1wSW5kZXgoKSBjb25zdAorICAgIHsKKyAgICAgICAgcmV0dXJuIHRtcCgpLnRtcEluZGV4KCk7
CisgICAgfQorCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgRnVuY3Rvcj4KKyAgICB2b2lkIGZvckVh
Y2hUbXBGYXN0KGNvbnN0IEZ1bmN0b3ImIGZ1bmN0b3IpCisgICAgeworICAgICAgICBzd2l0Y2gg
KG1fa2luZCkgeworICAgICAgICBjYXNlIFRtcDoKKyAgICAgICAgY2FzZSBBZGRyOgorICAgICAg
ICAgICAgZnVuY3RvcihtX2Jhc2UpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2Ug
SW5kZXg6CisgICAgICAgICAgICBmdW5jdG9yKG1fYmFzZSk7CisgICAgICAgICAgICBmdW5jdG9y
KG1faW5kZXgpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAg
ICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIFRoaXMgaXMgc21hcnQgZW5v
dWdoIHRvIGtub3cgdGhhdCBhbiBhZGRyZXNzIGFyZyBpbiBhIERlZiBvciBVc2VEZWYgcnVsZSB3
aWxsIHVzZSBpdHMKKyAgICAvLyB0bXBzIGFuZCBuZXZlciBkZWYgdGhlbS4gRm9yIGV4YW1wbGUs
IHRoaXM6CisgICAgLy8KKyAgICAvLyBtb3YgJXJheCwgKCVyY3gpCisgICAgLy8KKyAgICAvLyBU
aGlzIGRlZnMgKCVyY3gpIGJ1dCB1c2VzICVyY3guCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgRnVu
Y3Rvcj4KKyAgICB2b2lkIGZvckVhY2hUbXAoUm9sZSBhcmdSb2xlLCBUeXBlIGFyZ1R5cGUsIGNv
bnN0IEZ1bmN0b3ImIGZ1bmN0b3IpCisgICAgeworICAgICAgICBzd2l0Y2ggKG1fa2luZCkgewor
ICAgICAgICBjYXNlIFRtcDoKKyAgICAgICAgICAgIGZ1bmN0b3IobV9iYXNlLCBhcmdSb2xlLCBh
cmdUeXBlKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEFkZHI6CisgICAgICAg
ICAgICBmdW5jdG9yKG1fYmFzZSwgVXNlLCBHUCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAg
ICAgY2FzZSBJbmRleDoKKyAgICAgICAgICAgIGZ1bmN0b3IobV9iYXNlLCBVc2UsIEdQKTsKKyAg
ICAgICAgICAgIGZ1bmN0b3IobV9pbmRleCwgVXNlLCBHUCk7CisgICAgICAgICAgICBicmVhazsK
KyAgICAgICAgZGVmYXV0OgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisK
KyAgICBNYWNyb0Fzc2VtYmxlcjo6VHJ1c3RlZEltbTMyIGFzVHJ1c3RlZEltbTMyKCkgY29uc3QK
KyAgICB7CisgICAgICAgIEFTU0VSVChpc0ltbSgpKTsKKyAgICAgICAgcmV0dXJuIE1hY3JvQXNz
ZW1ibGVyOjpUcnVzdGVkSW1tMzIoc3RhdGljX2Nhc3Q8aW50MzJfdD4obV9vZmZzZXQpKTsKKyAg
ICB9CisKKyNpZiBVU0UoSlNWQUxVRTY0KQorICAgIE1hY3JvQXNzZW1ibGVyOjpUcnVzdGVkSW1t
NjQgYXNUcnVzdGVkSW1tNjQoKSBjb25zdAorICAgIHsKKyAgICAgICAgQVNTRVJUKGlzSW1tNjQo
KSk7CisgICAgICAgIHJldHVybiBNYWNyb0Fzc2VtYmxlcjo6VHJ1c3RlZEltbTY0KHBvaW50ZXJW
YWx1ZSgpKTsKKyAgICB9CisjZW5kaWYKKworICAgIE1hY3JvQXNzZW1ibGVyOjpBZGRyZXNzIGFz
QWRkcmVzcygpIGNvbnN0CisgICAgeworICAgICAgICBBU1NFUlQoaXNBZGRyKCkpOworICAgICAg
ICByZXR1cm4gTWFjcm9Bc3NlbWJsZXI6OkFkZHJlc3MobV9iYXNlLmdwcigpLCBzdGF0aWNfY2Fz
dDxpbnQzMl90PihtX29mZnNldCkpOworICAgIH0KKworICAgIE1hY3JvQXNzZW1ibGVyOjpCYXNl
SW5kZXggYXNCYXNlSW5kZXgoKSBjb25zdAorICAgIHsKKyAgICAgICAgQVNTRVJUKGlzSW5kZXgo
KSk7CisgICAgICAgIHJldHVybiBNYWNyb0Fzc2VtYmxlcjo6QmFzZUluZGV4KAorICAgICAgICAg
ICAgbV9iYXNlLmdwcigpLCBtX2luZGV4LmdwcigpLCBzdGF0aWNfY2FzdDxNYWNyb0Fzc2VtYmxl
cjo6U2NhbGU+KGxvZ1NjYWxlKCkpLAorICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50MzJfdD4o
bV9vZmZzZXQpKTsKKyAgICB9CisKKyAgICBNYWNyb0Fzc2VtYmxlcjo6UmVsYXRpb25hbENvbmRp
dGlvbiBhc1JlbGF0aW9uYWxDb25kaXRpb24oKSBjb25zdAorICAgIHsKKyAgICAgICAgQVNTRVJU
KGlzUmVsQ29uZCgpKTsKKyAgICAgICAgcmV0dXJuIHN0YXRpY19jYXN0PE1hY3JvQXNzZW1ibGVy
OjpSZWxhdGlvbmFsQ29uZGl0aW9uPihtX29mZnNldCk7CisgICAgfQorCisgICAgTWFjcm9Bc3Nl
bWJsZXI6OlJlc3VsdENvbmRpdGlvbiBhc1Jlc3VsdENvbmRpdGlvbigpIGNvbnN0CisgICAgewor
ICAgICAgICBBU1NFUlQoaXNSZXNDb25kKCkpOworICAgICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8
TWFjcm9Bc3NlbWJsZXI6OlJlc3VsdENvbmRpdGlvbj4obV9vZmZzZXQpOworICAgIH0KKworICAg
IHZvaWQgZHVtcChQcmludFN0cmVhbSYpIGNvbnN0OworCitwcml2YXRlOgorICAgIGludDY0X3Qg
bV9vZmZzZXQgeyAwIH07CisgICAgS2luZCBtX2tpbmQgeyBJbW0gfTsKKyAgICBpbnQzMl90IG1f
c2NhbGUgeyAxIH07CisgICAgQWlyOjpUbXAgbV9iYXNlOworICAgIEFpcjo6VG1wIG1faW5kZXg7
Cit9OworCit9IH0gfSAvLyBuYW1lc3BhY2UgSlNDOjpCMzo6QWlyCisKKyNlbmRpZiAvLyBBaXJB
cmdfaAorCkluZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvYWlyL0FpckJhc2ljQmxvY2su
Y3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9haXIvQWlyQmFzaWNC
bG9jay5jcHAJKHJldmlzaW9uIDApCisrKyBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvYWlyL0Fp
ckJhc2ljQmxvY2suY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsNDQgQEAKKy8qCisgKiBD
b3B5cmlnaHQgKEMpIDIwMTUgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAq
IFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGgg
b3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQg
dGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRp
b25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAg
IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xh
aW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVj
ZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRp
b25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0
aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9u
LgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFTIElT
JycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywg
QlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFO
VEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElT
Q0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IKKyAqIENPTlRSSUJVVE9S
UyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFM
LAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVU
IE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBT
RVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJ
TlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFC
SUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAq
IChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBP
VVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRI
RSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKworI2luY2x1ZGUgImNvbmZpZy5o
IgorI2luY2x1ZGUgIkFpckJhc2ljQmxvY2suaCIKKworbmFtZXNwYWNlIEpTQyB7IG5hbWVzcGFj
ZSBCMyB7IG5hbWVzcGFjZSBBaXIgeworCit2b2lkIEJhc2ljQmxvY2s6OmR1bXAoUHJpbnRTdHJl
YW0mIG91dCkgY29uc3QKK3sKKyAgICBvdXQucHJpbnQoZHVtcFByZWZpeCwgbV9pbmRleCk7Cit9
CisKK3ZvaWQgQmFzaWNCbG9jazo6ZGVlcER1bXAoUHJpbnRTdHJlYW0mIG91dCkgY29uc3QKK3sK
KyAgICBvdXQucHJpbnQoIkJCIiwgKnRoaXMsICI6XG4iKTsKKyAgICBmb3IgKGNvbnN0IEluc3Qm
IGluc3QgOiAqdGhpcykKKyAgICAgICAgb3V0LnByaW50KCIgICAgIiwgaW5zdCwgIlxuIik7Cit9
CisKK30gfSB9IC8vIG5hbWVzcGFjZSBKU0M6OkIzOjpBaXIKKwpJbmRleDogU291cmNlL0phdmFT
Y3JpcHRDb3JlL2IzL2Fpci9BaXJCYXNpY0Jsb2NrLmgKPT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL0ph
dmFTY3JpcHRDb3JlL2IzL2Fpci9BaXJCYXNpY0Jsb2NrLmgJKHJldmlzaW9uIDApCisrKyBTb3Vy
Y2UvSmF2YVNjcmlwdENvcmUvYjMvYWlyL0FpckJhc2ljQmxvY2suaAkod29ya2luZyBjb3B5KQpA
QCAtMCwwICsxLDEyMSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNSBBcHBsZSBJbmMuIEFs
bCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3Vy
Y2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFy
ZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFy
ZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4g
dGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9u
cyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGlu
IGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5v
dGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1l
ciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92
aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9W
SURFRCBCWSBBUFBMRSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJ
RUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1Q
TElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJU
SUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQ
TEUgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5E
SVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJ
QUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVO
VCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IK
KyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5E
IE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RS
SUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVS
V0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRX
QVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLiAK
KyAqLworCisjaWZuZGVmIEFpckJhc2ljQmxvY2tfaAorI2RlZmluZSBBaXJCYXNpY0Jsb2NrX2gK
KworI2luY2x1ZGUgIkFpckluc3QuaCIKKyNpbmNsdWRlIDx3dGYvTm9uQ29weWFibGUuaD4KKyNp
bmNsdWRlIDx3dGYvRmFzdE1hbGxvYy5oPgorCituYW1lc3BhY2UgSlNDIHsgbmFtZXNwYWNlIEIz
IHsgbmFtZXNwYWNlIEFpciB7CisKK2NsYXNzIENvZGU7CisKK2NsYXNzIEJhc2ljQmxvY2sgewor
ICAgIFdURl9NQUtFX05PTkNPUFlBQkxFKEJhc2ljQmxvY2spOworICAgIFdURl9NQUtFX0ZBU1Rf
QUxMT0NBVEVEOworcHVibGljOgorICAgIHN0YXRpYyBjb25zdCBjaGFyKiBkdW1wUHJlZml4ID0g
IiMiOworCisgICAgdHlwZWRlZiBWZWN0b3I8SW5zdD4gSW5zdExpc3Q7CisgICAgdHlwZWRlZiBW
ZWN0b3I8QmFzaWNCbG9jayosIDI+IFN1Y2Nlc3Nvckxpc3Q7CisgICAgCisgICAgdW5zaWduZWQg
c2l6ZSgpIGNvbnN0IHsgcmV0dXJuIG1faW5zdHMuc2l6ZSgpOyB9CisgICAgSW5zdExpc3Q6Oml0
ZXJhdG9yIGJlZ2luKCkgeyByZXR1cm4gbV9pbnN0cy5iZWdpbigpOyB9CisgICAgSW5zdExpc3Q6
Oml0ZXJhdG9yIGVuZCgpIHsgcmV0dXJuIG1faW5zdHMuZW5kKCk7IH0KKyAgICBJbnN0TGlzdDo6
Y29uc3RfaXRlcmF0b3IgYmVnaW4oKSBjb25zdCB7IHJldHVybiBtX2luc3RzLmJlZ2luKCk7IH0K
KyAgICBJbnN0TGlzdDo6Y29uc3RfaXRlcmF0b3IgZW5kKCkgY29uc3QgeyByZXR1cm4gbV9pbnN0
cy5lbmQoKTsgfQorCisgICAgc2l6ZV90IHNpemUoKSBjb25zdCB7IHJldHVybiBtX2luc3RzLnNp
emUoKTsgfQorICAgIGNvbnN0IEluc3QmIGF0KHNpemVfdCBpbmRleCkgY29uc3QgeyByZXR1cm4g
bV9pbnN0c1tpbmRleF07IH0KKyAgICBJbnN0JiBhdChzaXplX3QgaW5kZXgpIHsgcmV0dXJuIG1f
aW5zdHNbaW5kZXhdOyB9CisKKyAgICBjb25zdCBJbnN0JiBsYXN0KCkgY29uc3QgeyByZXR1cm4g
bV9pbnN0cy5sYXN0KCk7IH0KKyAgICBJbnN0JiBsYXN0KCkgeyByZXR1cm4gbV9pbnN0cy5sYXN0
KCk7IH0KKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIEluc3Q+CisgICAgdm9pZCBhcHBlbmRJbnN0
KEluc3QmJiBpbnN0KQorICAgIHsKKyAgICAgICAgbV9pbnN0cy5hcHBlbmQoc3RkOjpmb3J3YXJk
PEluc3Q+KGluc3QpKTsKKyAgICB9CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZS4uLiBBcmd1bWVu
dHM+CisgICAgdm9pZCBhcHBlbmQoQXJndW1lbnRzJiYuLi4gYXJndW1lbnRzKQorICAgIHsKKyAg
ICAgICAgbV9pbnN0cy5hcHBlbmQoSW5zdChzdGQ6OmZvcndhcmQ8QXJndW1lbnRzPihhcmd1bWVu
dHMpLi4uKSk7CisgICAgfQorCisgICAgLy8gVGhlICIwIiBjYXNlIGlzIHRoZSBjYXNlIHRvIHdo
aWNoIHRoZSBicmFuY2gganVtcHMsIHNvIHRoZSAidGhlbiIgY2FzZS4gVGhlICIxIiBjYXNlIGlz
IHRoZQorICAgIC8vICJlbHNlIiBjYXNlLCBhbmQgaXMgdXNlZCB0byByZXByZXNlbnQgdGhlIGZh
bGwtdGhyb3VnaCBvZiBhIGNvbmRpdGlvbmFsIGJyYW5jaC4KKyAgICB1bnNpZ25lZCBudW1TdWNj
ZXNzb3JzKCkgY29uc3QgeyByZXR1cm4gbV9zdWNjZXNzb3JzLnNpemUoKTsgfQorICAgIEJhc2lj
QmxvY2sqIHN1Y2Nlc3Nvcih1bnNpZ25lZCBpbmRleCkgY29uc3QgeyByZXR1cm4gbV9zdWNjZXNz
b3JzW2luZGV4XTsgfQorICAgIEJhc2ljQmxvY2sqJiBzdWNjZXNzb3IodW5zaWduZWQgaW5kZXgp
IHsgcmV0dXJuIG1fc3VjY2Vzc29yc1tpbmRleF07IH0KKyAgICBjb25zdCBTdWNjZXNzb3JMaXN0
JiBzdWNjZXNzb3JzKCkgY29uc3QgeyByZXR1cm4gbV9zdWNjZXNzb3JzW2luZGV4XTsgfQorICAg
IFN1Y2Nlc3Nvckxpc3QmIHN1Y2Nlc3NvcnMoKSB7IHJldHVybiBtX3N1Y2Nlc3NvcnNbaW5kZXhd
OyB9CisKKyAgICB2b2lkIGR1bXAoUHJpbnRTdHJlYW0mKSBjb25zdDsKKyAgICB2b2lkIGRlZXBE
dW1wKFByaW50U3RyZWFtJikgY29uc3Q7CisKK3ByaXZhdGU6CisgICAgZnJpZW5kIGNsYXNzIENv
ZGU7CisgICAgCisgICAgQmFzaWNCbG9jayh1bnNpZ25lZCBpbmRleCkKKyAgICB7CisgICAgfQor
CisgICAgdW5zaWduZWQgbV9pbmRleDsKKyAgICBJbnN0TGlzdCBtX2luc3RzOworICAgIFN1Y2Nl
c3Nvckxpc3QgbV9zdWNjZXNzb3JzOworfTsKKworY2xhc3MgRGVlcEJhc2ljQmxvY2tEdW1wIHsK
K3B1YmxpYzoKKyAgICBEZWVwQmFzaWNCbG9ja0R1bXAoQmFzaWNCbG9jayogYmxvY2spCisgICAg
ICAgIDogbV9ibG9jayhibG9jaykKKyAgICB7CisgICAgfQorCisgICAgdm9pZCBkdW1wKFByaW50
U3RyZWFtJiBvdXQpIGNvbnN0CisgICAgeworICAgICAgICBpZiAobV9ibG9jaykKKyAgICAgICAg
ICAgIG1fYmxvY2stPmRlZXBEdW1wKG91dCk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIG91
dC5wcmludCgiPG51bGw+Iik7CisgICAgfQorCitwcml2YXRlOgorICAgIEJhc2ljQmxvY2sqIG1f
YmxvY2s7Cit9OworCitEZWVwQmFzaWNCbG9ja0R1bXAgZGVlcER1bXAoQmFzaWNCbG9jayogYmxv
Y2spCit7CisgICAgcmV0dXJuIERlZXBCYXNpY0Jsb2NrRHVtcChibG9jayk7Cit9CisKK30gfSB9
IC8vIG5hbWVzcGFjZSBKU0M6OkIzOjpBaXIKKworI2VuZGlmIC8vIEFpckJhc2ljQmxvY2tfaAor
CkluZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvYWlyL0FpckNDYWxsU3BlY2lhbC5jcHAK
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL2Fpci9BaXJDQ2FsbFNwZWNp
YWwuY3BwCShyZXZpc2lvbiAwKQorKysgU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL2Fpci9BaXJD
Q2FsbFNwZWNpYWwuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsMTM2IEBACisvKgorICog
Q29weXJpZ2h0IChDKSAyMDE1IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisg
KiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRo
IG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0
IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0
aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAg
ICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2Ns
YWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1
Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0
aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRh
dGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlv
bi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gYGBBUyBJ
UycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcs
IEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hB
TlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJ
U0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SCisgKiBDT05UUklCVVRP
UlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lB
TCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJV
VCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1Ig
U0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1Mg
SU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElB
QklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisg
KiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkg
T1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBU
SEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisKKyNpbmNsdWRlICJjb25maWcu
aCIKKyNpbmNsdWRlICJBaXJDQ2FsbFNwZWNpYWwuaCIKKworbmFtZXNwYWNlIEpTQyB7IG5hbWVz
cGFjZSBCMyB7IG5hbWVzcGFjZSBBaXIgeworCitDQ2FsbFNwZWNpYWw6OkNDYWxsU3BlY2lhbCgp
CisgICAgOiBTcGVjaWFsKCJDQ2FsbCIpOworeworICAgIG1fY2xvYmJlcmVkUmVncyA9IFJlZ2lz
dGVyU2V0OjphbGxSZWdpc3RlcnMoKTsKKyAgICBtX2Nsb2JiZXJlZFJlZ3MuZXhjbHVkZShSZWdp
c3RlclNldDo6c3RhY2tSZWdpc3RlcnMoKSk7CisgICAgbV9jbG9iYmVyZWRSZWdzLmV4Y2x1ZGUo
UmVnaXN0ZXJTZXQ6OnJlc2VydmVkSGFyZHdhcmVSZWdpc3RlcnMoKSk7CisgICAgbV9jbG9iYmVy
ZWRSZWdzLmV4Y2x1ZGUoUmVnaXN0ZXJTZXQ6OmNhbGxlZVNhdmVSZWdpc3RlcnMoKSk7Cit9CisK
K0NDYWxsU3BlY2lhbDo6fkNDYWxsU3BlY2lhbCgpCit7Cit9CisKK3ZvaWQgQ0NhbGxTcGVjaWFs
Ojpmb3JFYWNoQXJnKEluc3QmIGluc3QsIGNvbnN0IFNjb3BlZExhbWJkYTxJbnN0OjpFYWNoQXJn
Q2FsbGJhY2s+JiBjYWxsYmFjaykKK3sKKyAgICBjYWxsYmFjayhpbnN0LmFyZ3NbMV0sIEFyZzo6
VXNlLCBBcmc6OkdQKTsKKyAgICAKKyAgICBmb3IgKHVuc2lnbmVkIGkgPSAyOyBpIDwgaW5zdC5h
cmdzLnNpemUoKTsgKytpKSB7CisgICAgICAgIC8vIEZvciB0aGUgdHlwZSwgd2UgY2FuIGp1c3Qg
cXVlcnkgdGhlIGFyZydzIHR5cGUuIFRoZSBhcmcgd2lsbCBoYXZlIGEgdHlwZSwgYmVjYXVzZSB3
ZQorICAgICAgICAvLyByZXF1aXJlIHRoZXNlIGFyZ3MgdG8gYmUgYXJndW1lbnQgcmVnaXN0ZXJz
LgorICAgICAgICBjYWxsYmFjayhpbnN0LmFyZ3NbaV0sIEFyZzo6VXNlLCBpbnN0LmFyZ3NbaV0u
dHlwZSgpKTsKKyAgICB9Cit9CisKK2Jvb2wgQ0NhbGxTcGVjaWFsOjppc1ZhbGlkKEluc3QmIGlu
c3QpCit7CisgICAgaWYgKGluc3QuYXJncy5zaXplKCkgPCAyKQorICAgICAgICByZXR1cm4gZmFs
c2U7CisKKyAgICBzd2l0Y2ggKGluc3QuYXJnc1sxXS5raW5kKCkpIHsKKyAgICBjYXNlIEFyZzo6
SW1tOgorICAgICAgICBpZiAoc2l6ZW9mKHZvaWQqKSA9PSA0KQorICAgICAgICAgICAgYnJlYWs7
CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICBjYXNlIEFyZzo6SW1tNjQ6CisgICAgICAgIGlm
IChzaXplb2Yodm9pZCopID09IDgpCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgcmV0dXJu
IGZhbHNlOworICAgIGNhc2UgQXJnOjpUbXA6CisgICAgY2FzZSBBcmc6OkFkZHI6CisgICAgY2Fz
ZSBBcmc6OlN0YWNrOgorICAgIGNhc2UgQXJnOjpDYWxsQXJnOgorICAgICAgICBicmVhazsKKyAg
ICBkZWZhdWx0OgorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgaWYgKCFpbnN0
LmFyZ3NbMV0uaXNHUCgpKQorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICBmb3IgKHVuc2ln
bmVkIGkgPSAyOyBpIDwgaW5zdC5hcmdzLnNpemUoKTsgKytpKSB7CisgICAgICAgIGlmICghaW5z
dC5hcmdzW2ldLmlzUmVnKCkpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICAgICAg
aWYgKGluc3QuYXJnc1tpXSA9PSBUbXAoc2NyYXRjaFJlZ2lzdGVyKSkKKyAgICAgICAgICAgIHJl
dHVybiAgZmFsc2U7CisgICAgfQorICAgIHJldHVybiB0cnVlOworfQorCitib29sIENDYWxsU3Bl
Y2lhbDo6YWRtaXRzU3RhY2soSW5zdCYsIHVuc2lnbmVkIGFyZ0luZGV4KQoreworICAgIC8vIEFy
ZyAxIGNhbiBiZSBhIHN0YWNrIGFkZHJlc3MgZm9yIHN1cmUuCisgICAgaWYgKGFyZ0luZGV4ID09
IDEpCisgICAgICAgIHJldHVybiB0cnVlOworICAgIAorICAgIHJldHVybiBmYWxzZTsKK30KKwor
dm9pZCBDQ2FsbFNwZWNpYWw6OnJlcG9ydFVzZWRSZWdpc3RlcnMoSW5zdCYsIGNvbnN0IFJlZ2lz
dGVyU2V0JikKK3sKK30KKworQ0NhbGxIZWxwZXJzOjpKdW1wIENDYWxsU3BlY2lhbDo6Z2VuZXJh
dGUoSW5zdCYgaW5zdCwgQ0NhbGxIZWxwZXJzJiBqaXQsIEdlbmVyYXRpb25Db250ZXh0JikKK3sK
KyAgICBzd2l0Y2ggKGluc3QuYXJnc1sxXS5raW5kKCkpIHsKKyAgICBjYXNlIEFyZzo6SW1tOgor
ICAgIGNhc2UgQXJnOjpJbW1QdHI6CisgICAgICAgIGppdC5tb3ZlKENDYWxsSGVscGVyczo6VHJ1
c3RlZEltbVB0cihpbnN0LmFyZ3NbMV0ucG9pbnRlclZhbHVlKCkpLCBzY3JhdGNoUmVnaXN0ZXIp
OworICAgICAgICBqaXQuY2FsbChzY3JhdGNoUmVnaXN0ZXIpOworICAgICAgICBicmVhazsKKyAg
ICBjYXNlIEFyZzo6VG1wOgorICAgICAgICBqaXQuY2FsbChpbnN0LmFyZ3NbMV0uZ3ByKCkpOwor
ICAgICAgICBicmVhazsKKyAgICBjYXNlIEFyZzo6QWRkcjoKKyAgICAgICAgaml0LmNhbGwoaW5z
dC5hcmdzWzFdLmFzQWRkcmVzcygpKTsKKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAg
ICAgICAgUkVMRUFTRV9BU1NFUlRfTk9UX1JFQUNIRUQoKTsKKyAgICAgICAgYnJlYWs7CisgICAg
fQorICAgIHJldHVybiBDQ2FsbEhlbHBlcnM6Okp1bXAoKTsKK30KKworY29uc3QgUmVnaXN0ZXJT
ZXQmIENDYWxsU3BlY2lhbDo6ZXh0cmFDbG9iYmVyZWRSZWdzKCkKK3sKKyAgICByZXR1cm4gbV9j
bG9iYmVyZWRSZWdzOworfQorCit2b2lkIENDYWxsU3BlY2lhbDo6ZGVlcER1bXBJbXBsKFByaW50
U3RyZWFtJiBvdXQpIGNvbnN0Cit7CisgICAgb3V0LnByaW50KCJmdW5jdGlvbiBjYWxsIHRoYXQg
dXNlcyB0aGUgQyBjYWxsaW5nIGNvbnZlbnRpb24uIik7Cit9CisKK30gfSB9IC8vIG5hbWVzcGFj
ZSBKU0M6OkIzOjpBaXIKKwpJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL2Fpci9BaXJD
Q2FsbFNwZWNpYWwuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvYWly
L0FpckNDYWxsU3BlY2lhbC5oCShyZXZpc2lvbiAwKQorKysgU291cmNlL0phdmFTY3JpcHRDb3Jl
L2IzL2Fpci9BaXJDQ2FsbFNwZWNpYWwuaAkod29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDY3IEBA
CisvKgorICogQ29weXJpZ2h0IChDKSAyMDE1IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZl
ZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZv
cm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92
aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJl
ZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJp
Z2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93
aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVz
dCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qg
b2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAg
ZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRp
c3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElO
Qy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJ
TkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMg
T0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBP
U0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SCisgKiBD
T05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRB
TCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNM
VURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUg
R09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1Ig
QlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQor
ICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBP
UiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElO
IEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURW
SVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisKKyNpZm5kZWYg
QWlyQ0NhbGxTcGVjaWFsX2gKKyNkZWZpbmUgQWlyQ0NhbGxTcGVjaWFsX2gKKworbmFtZXNwYWNl
IEpTQyB7IG5hbWVzcGFjZSBCMyB7IG5hbWVzcGFjZSBBaXIgeworCisvLyBVc2UgdGhpcyBzcGVj
aWFsIGZvciBjb25zdHJ1Y3RpbmcgYSBDIGNhbGwuIEFyZyAwIGlzIG9mIGNvdXJzZSBhIFNwZWNp
YWwgYXJnIHRoYXQgcmVmZXJzIHRvIHRoZQorLy8gQ0NhbGxTcGVjaWFsIG9iamVjdC4gQXJnIDEg
aXMgdGhlIGNhbGxlZSwgYW5kIGl0IGNhbiBiZSBhbiBJbW1QdHIsIGEgcmVnaXN0ZXIsIG9yIGFu
IGFkZHJlc3MuIFRoZQorLy8gcmVtYWluaW5nIGFyZ3MgYXJlIGp1c3QgdGhlIHNldCBvZiBhcmd1
bWVudCByZWdpc3RlcnMgdXNlZCBieSB0aGlzIGNhbGwuIEZvciBhcmd1bWVudHMgdGhhdCBnbyB0
bworLy8gdGhlIHN0YWNrLCB5b3UgaGF2ZSB0byBkbyB0aGUgZ3J1bnQgd29yayBvZiBkb2luZyB0
aG9zZSBzdGFjayBzdG9yZXMuIEluIGZhY3QsIHRoZSBvbmx5IHJlYXNvbiB3aHkKKy8vIHdlIHNw
ZWNpZnkgdGhlIGFyZ3VtZW50IHJlZ2lzdGVycyBhcyBhcmd1bWVudHMgdG8gYSBjYWxsIGlzIHNv
IHRoYXQgdGhlIGxpdmVuZXNzIGFuYWx5c2lzIGNhbiBzZWUKKy8vIHRoYXQgdGhleSBnZXQgdXNl
ZCBoZXJlLiBJdCB3b3VsZCBiZSB3cm9uZyB0byBhdXRvbWFnaWNhbGx5IHJlcG9ydCBhbGwgYXJn
dW1lbnQgcmVnaXN0ZXJzIGFzIGJlaW5nCisvLyB1c2VkIGJlY2F1c2UgaWYgd2UgaGFkIGEgY2Fs
bCB0aGF0IGRpZG4ndCBwYXNzIHRoZW0sIHRoZW4gdGhleSdkIGFwcGVhciB0byBiZSBsaXZlIHVu
dGlsIHNvbWUKKy8vIGNsb2JiZXIgcG9pbnQgb3IgdGhlIHByb2xvZ3VlLCB3aGljaGV2ZXIgaGFw
cGVuZWQgc29vbmVyLgorCitjbGFzcyBDQ2FsbFNwZWNpYWwgOiBwdWJsaWMgU3BlY2lhbCB7Citw
dWJsaWM6CisgICAgQ0NhbGxTcGVjaWFsKCk7CisgICAgfkNDYWxsU3BlY2lhbCgpOworCisgICAg
Ly8gWW91IGNhbm5vdCB1c2UgdGhpcyByZWdpc3RlciB0byBwYXNzIGFyZ3VtZW50cy4gSXQganVz
dCBzbyBoYXBwZW5zIHRoYXQgdGhpcyByZWdpc3RlciBpcyBub3QKKyAgICAvLyB1c2VkIGZvciBh
cmd1bWVudHMgaW4gdGhlIEMgY2FsbGluZyBjb252ZW50aW9uLiBCeSB0aGUgd2F5LCB0aGlzIGlz
IHRoZSBvbmx5IHRoaW5nIHRoYXQgY2F1c2VzCisgICAgLy8gdGhpcyBzcGVjaWFsIHRvIGJlIHNw
ZWNpZmljIHRvIEMgY2FsbHMuCisgICAgc3RhdGljIGNvbnN0IEdQUlJlZyBzY3JhdGNoUmVnaXN0
ZXIgPSBHUFJJbmZvOjpub25BcmdHUFIwLgorCitwcm90ZWN0ZWQ6CisgICAgdm9pZCBmb3JFYWNo
QXJnKEluc3QmLCBjb25zdCBTY29wZWRMYW1iZGE8SW5zdDo6RWFjaEFyZ0NhbGxiYWNrPiYpIG92
ZXJyaWRlOworICAgIGJvb2wgaXNWYWxpZChJbnN0Jikgb3ZlcnJpZGU7CisgICAgYm9vbCBhZG1p
dHNTdGFjayhJbnN0JiwgdW5zaWduZWQgYXJnSW5kZXgpIG92ZXJyaWRlOworICAgIHZvaWQgcmVw
b3J0VXNlZFJlZ2lzdGVycyhJbnN0JiwgY29uc3QgUmVnaXN0ZXJTZXQmKSBvdmVycmlkZTsKKyAg
ICBDQ2FsbEhlbHBlcnM6Okp1bXAgZ2VuZXJhdGUoSW5zdCYsIENDYWxsSGVscGVycyYsIEdlbmVy
YXRpb25Db250ZXh0Jikgb3ZlcnJpZGU7CisgICAgY29uc3QgUmVnaXN0ZXJTZXQmIGV4dHJhQ2xv
YmJlcmVkUmVncyhJbnN0Jikgb3ZlcnJpZGU7CisgICAgCisgICAgdm9pZCBkZWVwRHVtcEltcGwo
UHJpbnRTdHJlYW0mKSBjb25zdCBvdmVycmlkZTsKKworcHJpdmF0ZToKKyAgICBSZWdpc3RlclNl
dCBtX2Nsb2JiZXJlZFJlZ3M7Cit9OworCit9IH0gfSAvLyBuYW1lc3BhY2UgSlNDOjpCMzo6QWly
CisKKyNlbmRpZiAvLyBBaXJDQ2FsbFNwZWNpYWxfaAorCkluZGV4OiBTb3VyY2UvSmF2YVNjcmlw
dENvcmUvYjMvYWlyL0FpckNvZGUuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0
Q29yZS9iMy9haXIvQWlyQ29kZS5jcHAJKHJldmlzaW9uIDApCisrKyBTb3VyY2UvSmF2YVNjcmlw
dENvcmUvYjMvYWlyL0FpckNvZGUuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsNjQgQEAK
Ky8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTUgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVk
LgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9y
bXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3Zp
ZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVk
aXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmln
aHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dp
bmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0
IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBv
ZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBk
b2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlz
dHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5D
LiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElO
Q0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBP
RiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9T
RSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IKKyAqIENP
TlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFM
LCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xV
RElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBH
T09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBC
VVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisg
KiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9S
IFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4g
QU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJ
U0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKworI2luY2x1ZGUg
ImNvbmZpZy5oIgorI2luY2x1ZGUgIkFpckNvZGUuaCIKKworbmFtZXNwYWNlIEpTQyB7IG5hbWVz
cGFjZSBCMyB7IG5hbWVzcGFjZSBBaXIgeworCitDb2RlOjpDb2RlKCkKK3sKK30KKworQ29kZTo6
fkNvZGUoKQoreworfQorCitCYXNpY0Jsb2NrKiBDb2RlOjphZGRCbG9jaygpCit7CisgICAgc3Rk
Ojp1bmlxdWVfcHRyPEJhc2ljQmxvY2s+IGJsb2NrKG5ldyBCYXNpY0Jsb2NrKG1fYmxvY2tzLnNp
emUoKSkpOworICAgIEJhc2ljQmxvY2sqIHJlc3VsdCA9IGJsb2NrLmdldCgpOworICAgIG1fYmxv
Y2tzLmFwcGVuZChXVEY6Om1vdmUoYmxvY2spKTsKKyAgICByZXR1cm4gcmVzdWx0OworfQorCit2
b2lkIENvZGU6OmR1bXAoUHJpbnRTdHJlYW0mIG91dCkgY29uc3QKK3sKKyAgICBmb3IgKEJhc2lj
QmxvY2sqIGJsb2NrIDogKnRoaXMpCisgICAgICAgIG91dC5wcmludChkZWVwRHVtcChibG9jaykp
OworICAgIGlmIChudW1TdGFja1Nsb3RzKCkpIHsKKyAgICAgICAgb3V0LnByaW50KCJTdGFjayBz
bG90czpcbiIpOworICAgICAgICBmb3IgKFN0YWNrU2xvdCogc2xvdCA6IHN0YWNrU2xvdHMoKSkK
KyAgICAgICAgICAgIG91dC5wcmludCgiICAgICIsIGRlZXBEdW1wKHNsb3QpLCAiXG4iKTsKKyAg
ICB9CisgICAgaWYgKG51bVNwZWNpYWxzKCkpIHsKKyAgICAgICAgb3V0LnByaW50KCJTcGVjaWFs
czpcbiIpOworICAgICAgICBmb3IgKFNwZWNpYWwqIHNwZWNpYWwgOiBzcGVjaWFscygpKQorICAg
ICAgICAgICAgb3V0LnByaW50KCIgICAgIiwgZGVlcER1bXAoc3BlY2lhbCksICJcbiIpOworICAg
IH0KK30KKworfSB9IH0gLy8gbmFtZXNwYWNlIEpTQzo6QjM6OkFpcgorCkluZGV4OiBTb3VyY2Uv
SmF2YVNjcmlwdENvcmUvYjMvYWlyL0FpckNvZGUuaAo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2
YVNjcmlwdENvcmUvYjMvYWlyL0FpckNvZGUuaAkocmV2aXNpb24gMCkKKysrIFNvdXJjZS9KYXZh
U2NyaXB0Q29yZS9iMy9haXIvQWlyQ29kZS5oCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsMTI3
IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE1IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNl
cnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5
IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBw
cm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEu
IFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29w
eXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9s
bG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0g
bXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxp
c3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICog
ICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhl
IGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExF
IElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVT
LCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJ
RVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBV
UlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SCisg
KiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURF
TlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJ
TkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRV
VEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsg
T1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9S
WQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZ
LCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5H
IElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYg
QURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisKKyNpZm5k
ZWYgQWlyQ29kZV9oCisjZGVmaW5lIEFpckNvZGVfaAorCisjaW5jbHVkZSAiQWlyQmFzaWNCbG9j
ay5oIgorI2luY2x1ZGUgIkFpclNwZWNpYWwuaCIKKyNpbmNsdWRlICJBaXJTdGFja1Nsb3QuaCIK
KworbmFtZXNwYWNlIEpTQyB7IG5hbWVzcGFjZSBCMyB7CisKK2NsYXNzIFByb2NlZHVyZTsKKwor
bmFtZXNwYWNlIEFpciB7CisKKy8vIFRoaXMgaXMgYW4gSVIgdGhhdCBpcyB2ZXJ5IGNsb3NlIHRv
IHRoZSBiYXJlIG1ldGFsLiBJdCByZXF1aXJlcyBhYm91dCA0MHggbW9yZSBieXRlcyB0aGFuIHRo
ZQorLy8gZ2VuZXJhdGVkIG1hY2hpbmUgY29kZSAtIGZvciBleGFtcGxlIGlmIHlvdSdyZSBnZW5l
cmF0aW5nIDFNQiBvZiBtYWNoaW5lIGNvZGUsIHlvdSBuZWVkIGFib3V0CisvLyA0ME1CIG9mIEFp
ci4KKworY2xhc3MgQ29kZSB7CisgICAgV1RGX01BS0VfTk9OQ09QWUFCTEUoQ29kZSk7CisgICAg
V1RGX01BS0VfRkFTVF9BTExPQ0FURUQ7CitwdWJsaWM6CisgICAgQ29kZSgpOworICAgIH5Db2Rl
KCk7CisKKyAgICBCYXNpY0Jsb2NrKiBhZGRCbG9jaygpOworCisgICAgU3RhY2tTbG90KiBhZGRT
dGFja1Nsb3QoKTsKKworICAgIFNwZWNpYWwqIGFkZFNwZWNpYWwoc3RkOjp1bmlxdWVfcHRyPFNw
ZWNpYWw+KTsKKworICAgIC8vIFRoaXMgaXMgdGhlIHNwZWNpYWwgeW91IG5lZWQgdG8gbWFrZSBh
IEMgY2FsbCEKKyAgICBTcGVjaWFsKiBjQ2FsbFNwZWNpYWwoKTsKKworICAgIHZvaWQgZHVtcChQ
cmludFN0cmVhbSYpIGNvbnN0OworCisgICAgdW5zaWduZWQgc2l6ZSgpIGNvbnN0IHsgcmV0dXJu
IG1fYmxvY2tzLnNpemUoKTsgfQorICAgIEJhc2ljQmxvY2sqIGF0KHVuc2lnbmVkIGluZGV4KSBj
b25zdCB7IHJldHVybiBtX2Jsb2Nrc1tpbmRleF07IH0KKyAgICBCYXNpY0Jsb2NrKiBvcGVyYXRv
cltdKHVuc2lnbmVkIGluZGV4KSBjb25zdCB7IHJldHVybiBhdChpbmRleCk7IH0KKworICAgIGNs
YXNzIGl0ZXJhdG9yIHsKKyAgICBwdWJsaWM6CisgICAgICAgIGl0ZXJhdG9yKCk6CisgICAgICAg
ICAgICA6IG1fcHJvY2VkdXJlKG51bGxwdHIpCisgICAgICAgICAgICAsIG1faW5kZXgoMCkKKyAg
ICAgICAgeworICAgICAgICB9CisKKyAgICAgICAgaXRlcmF0b3IoUHJvY2VkdXJlJiBwcm9jZWR1
cmUsIHVuc2lnbmVkIGluZGV4KQorICAgICAgICAgICAgOiBtX3Byb2NlZHVyZSgmcHJvY2VkdXJl
KQorICAgICAgICAgICAgLCBtX2luZGV4KGluZGV4KQorICAgICAgICB7CisgICAgICAgIH0KKwor
ICAgICAgICBCYXNpY0Jsb2NrKiBvcGVyYXRvciooKQorICAgICAgICB7CisgICAgICAgICAgICBy
ZXR1cm4gbV9wcm9jZWR1cmUtPmF0KG1faW5kZXgpOworICAgICAgICB9CisKKyAgICAgICAgaXRl
cmF0b3ImIG9wZXJhdG9yKysoKQorICAgICAgICB7CisgICAgICAgICAgICBtX2luZGV4ID0gZmlu
ZE5leHQobV9pbmRleCArIDEpOworICAgICAgICAgICAgcmV0dXJuICp0aGlzOworICAgICAgICB9
CisKKyAgICAgICAgYm9vbCBvcGVyYXRvcj09KGNvbnN0IGl0ZXJhdG9yJiBvdGhlcikgY29uc3QK
KyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIG1faW5kZXggPT0gb3RoZXIubV9pbmRleDsK
KyAgICAgICAgfQorCisgICAgICAgIGJvb2wgb3BlcmF0b3IhPShjb25zdCBpdGVyYXRvciYgb3Ro
ZXIpIGNvbnN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiAhKCp0aGlzID09IG90aGVy
KTsKKyAgICAgICAgfQorCisgICAgcHJpdmF0ZToKKyAgICAgICAgdW5zaWduZWQgZmluZE5leHQo
dW5zaWduZWQgaW5kZXgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHdoaWxlIChpbmRleCA8IG1f
cHJvY2VkdXJlLT5zaXplKCkgJiYgIW1fcHJvY2VkdXJlLT5hdChpbmRleCkpCisgICAgICAgICAg
ICAgICAgaW5kZXgrKzsKKyAgICAgICAgICAgIHJldHVybiBpbmV4OworICAgICAgICB9CisKKyAg
ICAgICAgUHJvY2VkdXJlKiBtX3Byb2NlZHVyZTsKKyAgICAgICAgdW5zaWduZWQgbV9pbmRleDsK
KyAgICB9OworCisgICAgaXRlcmF0b3IgYmVnaW4oKSBjb25zdCB7IHJldHVybiBpdGVyYXRvcigq
dGhpcywgMCk7IH0KKyAgICBpdGVyYXRvciBlbmQoKSBjb25zdCB7IHJldHVybiBpdGVyYXRvcigq
dGhpcywgbnVtQmxvY2tzKCkpOyB9CisKK3ByaXZhdGU6CisgICAgVmVjdG9yPHN0ZDo6dW5pcXVl
X3B0cjxTdGFja1Nsb3Q+PiBtX3N0YWNrU2xvdHM7CisgICAgVmVjdG9yPHN0ZDo6dW5pcXVlX3B0
cjxCYXNpY0Jsb2NrPj4gbV9ibG9ja3M7CisgICAgVmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxTcGVj
aWFsPj4gbV9zcGVjaWFsczsKKyAgICBTcGVjaWFsKiBtX2NhbGxTcGVjaWFsOworcHVibGljOgor
ICAgIHVuc2lnbmVkIGZyYW1lU2l6ZTsKK307CisKK30gfSB9IC8vIG5hbWVzcGFjZSBKU0M6OkIz
OjpBaXIKKworI2VuZGlmIC8vIEFpckNvZGVfaAorCkluZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENv
cmUvYjMvYWlyL0FpckdlbmVyYXRpb25Db250ZXh0LmgKPT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL0ph
dmFTY3JpcHRDb3JlL2IzL2Fpci9BaXJHZW5lcmF0aW9uQ29udGV4dC5oCShyZXZpc2lvbiAwKQor
KysgU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL2Fpci9BaXJHZW5lcmF0aW9uQ29udGV4dC5oCSh3
b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsNDMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTUg
QXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFu
ZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9k
aWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25k
aXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2Rl
IG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0
IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlz
dHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJp
Z2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93
aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBt
YXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09G
VFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQ
UkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRP
LCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5F
U1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVW
RU5UIFNIQUxMIEFQUExFIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFO
WSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBP
UiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAor
ICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBV
U0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VW
RVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4g
Q09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElH
RU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICog
T0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBT
VUNIIERBTUFHRS4gCisgKi8KKworI2lmbmRlZiBBaXJHZW5lcmF0aW9uQ29udGV4dF9oCisjZGVm
aW5lIEFpckdlbmVyYXRpb25Db250ZXh0X2gKKworI2luY2x1ZGUgPHd0Zi9TaGFyZWRUYXNrLmg+
CisKK25hbWVzcGFjZSBKU0MgeyBuYW1lc3BhY2UgQjMgeyBuYW1lc3BhY2UgQWlyIHsKKworc3Ry
dWN0IEdlbmVyYXRpb25Db250ZXh0IHsKKyAgICB0eXBlZGVmIHZvaWQgTGF0ZVBhdGhGdW5jdGlv
bihDQ2FsbEhlbHBlcnMmLCBHZW5lcmF0aW9uQ29udGV4dCYpOworICAgIHR5cGVkZWYgU2hhcmVk
VGFzazxMYXRlUGF0aEZ1bmN0aW9uPiBMYXRlUGF0aDsKKworICAgIFZlY3RvcjxSZWZQdHI8TGF0
ZVBhdGg+PiBsYXRlUGF0aHM7Cit9OworCit9IH0gfSAvLyBuYW1lc3BhY2UgSlNDOjpCMzo6QWly
CisKKyNlbmRpZiAvLyBBaXJHZW5lcmF0aW9uQ29udGV4dF9oCisKSW5kZXg6IFNvdXJjZS9KYXZh
U2NyaXB0Q29yZS9iMy9haXIvQWlySW5zdC5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL0phdmFT
Y3JpcHRDb3JlL2IzL2Fpci9BaXJJbnN0LmNwcAkocmV2aXNpb24gMCkKKysrIFNvdXJjZS9KYXZh
U2NyaXB0Q29yZS9iMy9haXIvQWlySW5zdC5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSw0
MCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNSBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVz
ZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFy
eSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQg
cHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAx
LiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNv
cHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZv
bGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3Jt
IG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBs
aXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAq
ICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRo
ZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBM
RSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElF
UywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5U
SUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQ
VVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUgor
ICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lE
RU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAo
SU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElU
VVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7
IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVP
UlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElU
WSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lO
RyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElG
IEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLiAKKyAqLworCisjaW5j
bHVkZSAiY29uZmlnLmgiCisjaW5jbHVkZSAiQWlySW5zdC5oIgorCisjaW5jbHVkZSAiQjNWYWx1
ZS5oIgorI2luY2x1ZGUgPHd0Zi9MaXN0RHVtcC5oPgorCituYW1lc3BhY2UgSlNDIHsgbmFtZXNw
YWNlIEIzIHsgbmFtZXNwYWNlIEFpciB7CisKK3ZvaWQgSW5zdDo6ZHVtcChQcmludFN0cmVhbSYg
b3V0KSBjb25zdAoreworICAgIG91dC5wcmludChvcGNvZGUsICIgIiwgbGlzdER1bXAoYXJncyks
ICIgIDsgIiwgKm9yaWdpbik7Cit9CisKK30gfSB9IC8vIG5hbWVzcGFjZSBKU0M6OkIzOjpBaXIK
KwpJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL2Fpci9BaXJJbnN0LmgKPT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PQotLS0gU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL2Fpci9BaXJJbnN0LmgJKHJldmlzaW9uIDAp
CisrKyBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvYWlyL0Fpckluc3QuaAkod29ya2luZyBjb3B5
KQpAQCAtMCwwICsxLDE0NSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNSBBcHBsZSBJbmMu
IEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBz
b3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24s
IGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAq
IGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRh
aW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0
aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25z
IGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAg
IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xh
aW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBw
cm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQ
Uk9WSURFRCBCWSBBUFBMRSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElN
UExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICog
SU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQ
QVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwg
QVBQTEUgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwg
SU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVF
TlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJF
TUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwg
T1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQg
QU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwg
U1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9U
SEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNP
RlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdF
LiAKKyAqLworCisjaWZuZGVmIEFpckluc3RfaAorI2RlZmluZSBBaXJJbnN0X2gKKworI2luY2x1
ZGUgIkFpckFyZy5oIgorI2luY2x1ZGUgIkFpck9wY29kZS5oIgorCituYW1lc3BhY2UgSlNDIHsK
KworY2xhc3MgQ0NhbGxIZWxwZXJzOworCituYW1lc3BhY2UgQjMgeworCitjbGFzcyBWYWx1ZTsK
KworbmFtZXNwYWNlIEFpciB7CisKK3N0cnVjdCBHZW5lcmF0aW9uQ29udGV4dDsKKworc3RydWN0
IEluc3QgeworcHVibGljOgorICAgIHR5cGVkZWYgVmVjdG9yPEFyZywgMz4gQXJnTGlzdDsKKwor
ICAgIEluc3QoT3Bjb2RlIG9wY29kZSwgVmFsdWUqIG9yaWdpbikKKyAgICAgICAgOiBvcmlnaW4o
b3JpZ2luKQorICAgICAgICAsIG9wY29kZShvcGNvZGUpCisgICAgeworICAgIH0KKyAgICAKKyAg
ICB0ZW1wbGF0ZTx0eXBlbmFtZS4uLiBBcmd1bWVudHM+CisgICAgSW5zdChPcGNvZGUgb3Bjb2Rl
LCBWYWx1ZSogb3JpZ2luLCBBcmcgYXJnLCBBcmd1bWVudHMuLi4gYXJndW1lbnRzKQorICAgICAg
ICA6IGFyZ3N7IGFyZywgYXJndW1lbnRzLi4uIH0KKyAgICAgICAgLCBvcmlnaW4ob3JpZ2luKQor
ICAgICAgICAsIG9wY29kZShvcGNvZGUpCisgICAgeworICAgIH0KKworICAgIEluc3QoT3Bjb2Rl
IG9wY29kZSwgVmFsdWUqIG9yaWdpbiwgY29uc3QgQXJnTGlzdCYgYXJndW1lbnRzKQorICAgICAg
ICA6IGFyZ3MoYXJndW1lbnRzKQorICAgICAgICAsIG9yaWdpbihvcmlnaW4pCisgICAgICAgICwg
b3Bjb2RlKG9wY29kZSkKKyAgICB7CisgICAgfQorCisgICAgSW5zdChPcGNvZGUgb3Bjb2RlLCBW
YWx1ZSogb3JpZ2luLCBBcmdMaXN0JiYgYXJndW1lbnRzKQorICAgICAgICA6IGFyZ3MoV1RGOjpt
b3ZlKGFyZ3VtZW50cykpCisgICAgICAgICwgb3JpZ2luKG9yaWdpbikKKyAgICAgICAgLCBvcGNv
ZGUob3Bjb2RlKQorICAgIHsKKyAgICB9CisKKyAgICAvLyBOb3RlIHRoYXQgdGhlc2UgZnVuY3Rv
cnMgYWxsIGF2b2lkIHVzaW5nICJjb25zdCIgYmVjYXVzZSB3ZSB3YW50IHRvIHVzZSB0aGVtIGZv
ciB0aGluZ3MgdGhhdAorICAgIC8vIGVkaXQgSVIuIElSIGlzIG1lYW50IHRvIGJlIGVkaXRlZDsg
aWYgeW91J3JlIGNhcnJ5aW5nIGFyb3VuZCBhICJjb25zdCBJbnN0JiIgdGhlbiB5b3UncmUKKyAg
ICAvLyBwcm9iYWJseSBkb2luZyBpdCB3cm9uZy4KKworICAgIC8vIFRoaXMgb25seSB3YWxrcyB0
aG9zZSBUbXBzIHRoYXQgYXJlIGV4cGxpY2l0bHkgbWVudGlvbmVkLCBhbmQgaXQgZG9lc24ndCB0
ZWxsIHlvdSB0aGVpciByb2xlCisgICAgLy8gb3IgdHlwZS4KKyAgICB0ZW1wbGF0ZTx0eXBlbmFt
ZSBGdW5jdG9yPgorICAgIHZvaWQgZm9yRWFjaFRtcEZhc3QoY29uc3QgRnVuY3RvciYgZnVuY3Rv
cikKKyAgICB7CisgICAgICAgIGZvciAoQXJnIGFyZyA6IGFyZ3MpCisgICAgICAgICAgICBhcmcu
Zm9yRWFjaFRtcEZhc3QoZnVuY3Rvcik7CisgICAgfQorCisgICAgdHlwZWRlZiB2b2lkIEVhY2hB
cmdDYWxsYmFjayhBcmcmLCBBcmc6OlJvbGUsIEFyZzo6VHlwZSk7CisgICAgCisgICAgLy8gQ2Fs
bHMgdGhlIGZ1bmN0b3Igd2l0aCAoYXJnLCByb2xlLCB0eXBlKS4gVGhpcyBmdW5jdGlvbiBpcyBh
dXRvLWdlbmVyYXRlZCBieQorICAgIC8vIG9wY29kZV9nZW5lcmF0b3IucmIuCisgICAgdGVtcGxh
dGU8dHlwZW5hbWUgRnVuY3Rvcj4KKyAgICB2b2lkIGZvckVhY2hBcmcoY29uc3QgRnVuY3RvciYg
ZnVuY3Rvcik7CisKKyAgICAvLyBDYWxscyB0aGUgZnVuY3RvciB3aXRoICh0bXAsIHJvbGUsIHR5
cGUpLgorICAgIHRlbXBsYXRlPHR5cGVuYW1lIEZ1bmN0b3I+CisgICAgdm9pZCBmb3JFYWNoVG1w
KGNvbnN0IEZ1bmN0b3ImIGZ1bmN0b3IpCisgICAgeworICAgICAgICBmb3JFYWNoQXJnUm9sZSgK
KyAgICAgICAgICAgIFsmXSAoQXJnJiBhcmcsIEFyZzo6Um9sZSByb2xlLCBBcmc6OlR5cGUgdHlw
ZSkgeworICAgICAgICAgICAgICAgIGFyZy5mb3JFYWNoVG1wKHJvbGUsIHR5cGUsIGZ1bmN0b3Ip
OworICAgICAgICAgICAgfSk7CisgICAgfQorCisgICAgLy8gUmV0dXJucyB0cnVlIGlmIHRoaXMg
aW5zdHJ1Y3Rpb24gaGFzIGEgU3BlY2lhbCouIFRoaXMgdW5sb2NrcyBzb21lIGV4dHJhIGZ1bmN0
aW9uYWxpdHkuCisgICAgYm9vbCBoYXNTcGVjaWFsKCkgY29uc3Q7CisKKyAgICAvLyBSZXBvcnRz
IGFueSBhZGRpdGlvbmFsIHJlZ2lzdGVycyBjbG9iYmVyZWQgYnkgdGhpcyBvcGVyYXRpb24uIE5v
dGUgdGhhdCBmb3IgZWZmaWNpZW5jeSwKKyAgICAvLyBleHRyYUNsb2JiZXJlZFJlZ3MoKSBvbmx5
IHdvcmtzIGlmIGhhc1NwZWNpYWwoKSByZXR1cm5zIHRydWUuCisgICAgY29uc3QgUmVnaXN0ZXJT
ZXQmIGV4dHJhQ2xvYmJlcmVkUmVncygpOworCisgICAgLy8gVXNlIHRoaXMgdG8gcmVwb3J0IHdo
aWNoIHJlZ2lzdGVycyBhcmUgbGl2ZS4gVGhpcyBzaG91bGQgYmUgZG9uZSBqdXN0IGJlZm9yZSBj
b2RlZ2VuLiBOb3RlCisgICAgLy8gdGhhdCBmb3IgZWZmaWNpZW5jeSwgcmVwb3J0VXNlZFJlZ2lz
dGVycygpIG9ubHkgd29ya3MgaWYgaGFzU3BlY2lhbCgpIHJldHVybnMgdHJ1ZS4KKyAgICB2b2lk
IHJlcG9ydFVzZWRSZWdpc3RlcnMoY29uc3QgUmVnaXN0ZXJTZXQmKTsKKworICAgIC8vIElzIHRo
aXMgaW5zdHJ1Y3Rpb24gaW4gb25lIG9mIHRoZSB2YWxpZCBmb3JtcyByaWdodCBub3c/IFRoaXMg
ZnVuY3Rpb24gaXMgYXV0by1nZW5lcmF0ZWQgYnkKKyAgICAvLyBvcGNvZGVfZ2VuZXJhdG9yLnJi
LgorICAgIGJvb2wgaXNWYWxpZEZvcm0oKTsKKworICAgIC8vIEFzc3VtaW5nIHRoaXMgaW5zdHJ1
Y3Rpb24gaXMgaW4gYSB2YWxpZCBmb3JtIHJpZ2h0IG5vdywgd2lsbCBpdCBzdGlsbCBiZSBpbiBv
bmUgb2YgdGhlIHZhbGlkCisgICAgLy8gZm9ybXMgaWYgd2UgcHV0IGFuIEFkZHIgcmVmZXJlbmNp
bmcgdGhlIHN0YWNrIChvciBhIFN0YWNrU2xvdCBvciBDYWxsQXJnLCBvZiBjb3Vyc2UpIGluIHRo
ZQorICAgIC8vIGdpdmVuIGluZGV4PyBTcGlsbGluZyB1c2VzIHRoaXM6IGl0IHdhbGtzIHRoZSBh
cmdzIGJ5IGluZGV4IHRvIGZpbmQgVG1wcyB0aGF0IG5lZWQgc3BpbGxpbmc7CisgICAgLy8gaWYg
aXQgZmluZHMgb25lLCBpdCBjYWxscyB0aGlzIHRvIHNlZSBpZiBpdCBjYW4gcmVwbGFjZSB0aGUg
QXJnOjpUbXAgd2l0aCBhbiBBcmc6OkFkZHIuIElmIGl0CisgICAgLy8gZmluZHMgYSBub24tVG1w
IEFyZywgdGhlbiBpdCBjYWxscyB0aGF0IEFyZydzIGZvckVhY2hUbXAgdG8gZG8gYSByZXBsYWNl
bWVudCB0aGF0IHdheS4KKyAgICAvLworICAgIC8vIFRoaXMgZnVuY3Rpb24gaXMgYXV0by1nZW5l
cmF0ZWQgYnkgb3Bjb2RlX2dlbmVyYXRvci5yYi4KKyAgICBib29sIGFkbWl0c1N0YWNrKHVuc2ln
bmVkIGFyZ0luZGV4KTsKKworICAgIC8vIEdlbmVyYXRlIHNvbWUgY29kZSBmb3IgdGhpcyBpbnN0
cnVjdGlvbi4gVGhpcyBpcywgbGlrZSwgbGl0ZXJhbGx5IG91ciBiYWNrZW5kLiBJZiB0aGlzIGlz
IHRoZQorICAgIC8vIHRlcm1pbmFsLCBpdCByZXR1cm5zIHRoZSBqdW1wIHRoYXQgbmVlZHMgdG8g
YmUgbGlua2VkIGZvciB0aGUgInRoZW4iIGNhc2UsIHdpdGggdGhlICJlbHNlIgorICAgIC8vIGNh
c2UgYmVpbmcgZmFsbC10aHJvdWdoLiBUaGlzIGZ1bmN0aW9uIGlzIGF1dG8tZ2VuZXJhdGVkIGJ5
IG9wY29kZV9nZW5lcmF0b3IucmIuCisgICAgQ0NhbGxIZWxwZXJzOjpKdW1wIGdlbmVyYXRlKEND
YWxsSGVscGVycyYsIEdlbmVyYXRpb25Db250ZXh0Jik7CisKKyAgICB2b2lkIGR1bXAoUHJpbnRT
dHJlYW0mKSBjb25zdDsKKworICAgIEFyZ0xpc3QgYXJnczsKKyAgICBWYWx1ZSogb3JpZ2luOyAv
LyBUaGUgQjM6OlZhbHVlIHRoYXQgdGhpcyBvcmlnaW5hdGVkIGZyb20uCisgICAgT3Bjb2RlIG9w
Y29kZTsKK307CisKK30gfSB9IC8vIG5hbWVzcGFjZSBKU0M6OkIzOjpBaXIKKworI2VuZGlmIC8v
IEFpckluc3RfaAorCkluZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvYWlyL0Fpckluc3RJ
bmxpbmVzLmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL2Fpci9BaXJJ
bnN0SW5saW5lcy5oCShyZXZpc2lvbiAwKQorKysgU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL2Fp
ci9BaXJJbnN0SW5saW5lcy5oCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsNjkgQEAKKy8qCisg
KiBDb3B5cmlnaHQgKEMpIDIwMTUgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoK
KyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdp
dGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRo
YXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmli
dXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAq
ICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlz
Y2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJv
ZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25k
aXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVu
dGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0
aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFT
IElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElO
RywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJD
SEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUg
RElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IKKyAqIENPTlRSSUJV
VE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVD
SUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywg
QlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBP
UiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVT
UyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBM
SUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQK
KyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdB
WSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9G
IFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKworI2lmbmRlZiBBaXJJbnN0
SW5saW5lc19oCisjZGVmaW5lIEFpckluc3RJbmxpbmVzX2gKKworI2luY2x1ZGUgIkFpckluc3Qu
aCIKKyNpbmNsdWRlICJBaXJPcGNvZGVVdGlscy5oIgorI2luY2x1ZGUgIkFpclNwZWNpYWxzLmgi
CisjaW5jbHVkZSAiQjNTdGFja21hcC5oIgorI2luY2x1ZGUgIkIzVmFsdWUuaCIKKworbmFtZXNw
YWNlIEpTQyB7IG5hbWVzcGFjZSBCMyB7IG5hbWVzcGFjZSBBaXIgeworCitib29sIEluc3Q6Omhh
c1NwZWNpYWwoKSBjb25zdAoreworICAgIHJldHVybiBhcmdzLnNpemUoKSAmJiBhcmdzWzBdLmlz
U3BlY2lhbCgpOworfQorCitjb25zdCBSZWdpc3RlclNldCYgSW5zdDo6ZXh0cmFDbG9iYmVyZWRS
ZWdzKCkKK3sKKyAgICByZXR1cm4gYXJnc1swXS5zcGVjaWFsKCktPmV4dHJhQ2xvYmJlcmVkUmVn
cygqdGhpcyk7Cit9CisKK3ZvaWQgSW5zdDo6cmVwb3J0VXNlZFJlZ2lzdGVycyhjb25zdCBSZWdp
c3RlclNldCYgdXNlZFJlZ2lzdGVycykKK3sKKyAgICBhcmdzWzBdLnNwZWNpYWwoKS0+cmVwb3J0
VXNlZFJlZ2lzdGVycygqdGhpcywgdXNlZFJlZ2lzdGVycyk7Cit9CisKK2lubGluZSBib29sIGlz
U2hpZnRWYWxpZChJbnN0JiBpbnN0KQoreworI2lmIENQVShYODYpCisgICAgcmV0dXJuIGluc3Qu
YXJnc1swXSA9PSBUbXAoWDg2UmVnaXN0ZXI6OmN4KTsKKyNlbHNlCisgICAgcmV0dXJuIHRydWU7
CisjZW5kaWYKK30gICAKKworaW5saW5lIGJvb2wgaXNMc2hpZnQzMlZhbHVlKEluc3QmIGluc3Qp
Cit7CisgICAgcmV0dXJuIGlzU2hpZnRWYWxpZChpbnN0KTsKK30KKworfSB9IH0gLy8gbmFtZXNw
YWNlIEpTQzo6QjM6OkFpcgorCisjZW5kaWYgLy8gQWlySW5zdElubGluZXNfaAorCkluZGV4OiBT
b3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvYWlyL0Fpck9wY29kZS5vcGNvZGVzCj09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0K
LS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9haXIvQWlyT3Bjb2RlLm9wY29kZXMJKHJldmlz
aW9uIDApCisrKyBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvYWlyL0Fpck9wY29kZS5vcGNvZGVz
CSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsMTMyIEBACisjIENvcHlyaWdodCAoQykgMjAxNSBB
cHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisjCisjIFJlZGlzdHJpYnV0aW9uIGFuZCB1
c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorIyBtb2RpZmlj
YXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlv
bnMKKyMgYXJlIG1ldDoKKyMgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3Qg
cmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyMgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29u
ZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorIyAyLiBSZWRpc3RyaWJ1dGlv
bnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorIyAg
ICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2Ns
YWltZXIgaW4gdGhlCisjICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBw
cm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisjCisjIFRISVMgU09GVFdBUkUgSVMgUFJP
VklERUQgQlkgQVBQTEUgSU5DLiBBTkQgSVRTIENPTlRSSUJVVE9SUyBgYEFTIElTJycKKyMgQU5E
IEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJ
TUlURUQgVE8sCisjIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFO
RCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyMgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4g
Tk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUiBJVFMgQ09OVFJJQlVUT1JTCisjIEJFIExJQUJM
RSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFS
WSwgT1IKKyMgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRF
RCBUTywgUFJPQ1VSRU1FTlQgT0YKKyMgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9T
UyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTCisjIElOVEVSUlVQVElPTikg
SE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElO
CisjIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElH
RU5DRSBPUiBPVEhFUldJU0UpCisjIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBP
RiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YKKyMgVEhFIFBPU1NJQklMSVRZIE9G
IFNVQ0ggREFNQUdFLgorCisjIFN5bGxhYnVzOgorIworIyBSb2xlcyBhbmQgdHlwZXM6CisjIFU6
RyA9PiB1c2Ugb2YgYSBnZW5lcmFsLXB1cnBvc2UgcmVnaXN0ZXIgb3IgdmFsdWUKKyMgRDpHID0+
IGRlZiBvZiBhIGdlbmVyYWwtcHVycG9zZSByZWdpc3RlciBvciB2YWx1ZQorIyBVRDpHID0+IHVz
ZSBhbmQgZGVmIG9mIGEgZ2VuZXJhbC1wdXJwb3NlIHJlZ2lzdGVyIG9yIHZhbHVlCisjIFU6RiA9
PiB1c2Ugb2YgYSBmbG9hdCByZWdpc3RlciBvciB2YWx1ZQorIyBEOkYgPT4gZGVmIG9mIGEgZmxv
YXQgcmVnaXN0ZXIgb3IgdmFsdWUKKyMgVUQ6RiA9PiB1c2UgYW5kIGRlZiBvZiBhIGZsb2F0IHJl
Z2lzdGVyIG9yIHZhbHVlCisjCisjIEFyZ3VtZW50IGtpbmRzOgorIyBUbXAgPT4gdGVtcG9yYXJ5
IG9yIHJlZ2lzdGVyCisjIEltbSA9PiAzMi1iaXQgaW1tZWRpYXRlIGludAorIyBJbW02NCA9PiBU
cnVzdGVkSW1tNjQKKyMgQWRkciA9PiBhZGRyZXNzIGFzIHRlbXBvcmFyeS9yZWdpc3RlcitvZmZz
ZXQKKyMgSW5kZXggPT4gQmFzZUluZGV4IGFkZHJlc3MKKyMgQWJzID0+IEFic29sdXRlQWRkcmVz
cworIworIyBUaGUgcGFyc2VyIHZpZXdzIHRoZXNlIHRoaW5ncyBhcyBrZXl3b3JkcywgYW5kIHVu
ZGVyc3RhbmRzIHRoYXQgdGhleSBmYWxsIGludG8gdHdvIGRpc3RpbmN0IGNsYXNzZXMKKyMgb2Yg
dGhpbmdzLiBTbywgYWx0aG91Z2ggdGhpcyBmaWxlIHVzZXMgYSBwYXJ0aWN1bGFyIGluZGVudGF0
aW9uIHN0eWxlLCBub25lIG9mIHRoZSB3aGl0ZXNwYWNlIG9yCisjIGV2ZW4gbmV3bGluZXMgYXJl
IG1lYW5pbmdmdWwgdG8gdGhlIHBhcnNlci4gRm9yIGV4YW1wbGUsIHlvdSBjb3VsZCB3cml0ZToK
KyMKKyMgRm9vNDIgVTpHLCBVRDpGIEltbSwgVG1wIEFkZHIsIFRtcAorIworIyBBbmQgdGhlIHBh
cnNlciB3b3VsZCBrbm93IHRoYXQgdGhpcyBpcyB0aGUgc2FtZSBhczoKKyMKKyMgRm9vNDIgVTpH
LCBVRDpGCisjICAgICBJbW0sIFRtcAorIyAgICAgQWRkciwgVG1wCisjCisjIEkuZS4gYSB0d28t
Zm9ybSBpbnN0cnVjdGlvbiB0aGF0IHVzZXMgYSBHUFIgb3IgYW4gaW50IGltbWVkaWF0ZSBhbmQg
dXNlcytkZWZzIGEgZmxvYXQgcmVnaXN0ZXIuCisKKyMgTm90ZSB0aGF0IHRoZSBvcGNvZGVzIGhl
cmUgaGF2ZSBhIGxlYWRpbmcgY2FwaXRhbCAoQWRkMzIpIGJ1dCBtdXN0IGNvcnJlc3BvbmQgdG8g
TWFjcm9Bc3NlbWJsZXIKKyMgQVBJIHRoYXQgaGFzIGEgbGVhZGluZyBsb3dlci1jYXNlIChhZGQz
MikuCisKK05vcAorCitBZGQzMiBVOkcsIFVEOkcKKyAgICBUbXAsIFRtcAorICAgIEltbSwgQWRk
cgorICAgIEltbSwgVG1wCisgICAgQWRkciwgVG1wCisgICAgVG1wLCBBZGRyCisKK0FkZDMyIFU6
RywgVTpHLCBEOkcKKyAgICBJbW0sIFRtcCwgVG1wCisKK0FuZDMyIFU6RywgVUQ6RworICAgIFRt
cCwgVG1wCisgICAgSW1tLCBUbXAKKyAgICBUbXAsIEFkZHIKKyAgICBBZGRyLCBUbXAKKyAgICBJ
bW0sIEFkZHIKKworTHNoaWZ0MzIgVTpHLCBVRDpHCisgICAgVG1wKiwgVG1wCisgICAgSW1tLCBU
bXAKKworTXVsMzIgVTpHLCBVRDpHCisgICAgVG1wLCBUbXAKKyAgICBBZGRyLCBUbXAKKworTW92
ZSBVOkcsIEQ6RworICAgIFRtcCwgVG1wCisgICAgSW1tLCBUbXAKKyAgICBJbW02NCwgVG1wCisg
ICAgQWRkciwgVG1wIGFzIGxvYWQgIyBUaGlzIG1lYW5zIHRoYXQgIk1vdmUgQWRkciwgVG1wIiBp
cyBjb2RlLWdlbmVyYXRlZCBhcyAibG9hZCIgbm90ICJtb3ZlIi4KKyAgICBUbXAsIEFkZHIgYXMg
c3RvcmUKKworTW92ZURvdWJsZSBVOkYsIEQ6RgorICAgIFRtcCwgVG1wCisgICAgQWRkciwgVG1w
IGFzIGxvYWREb3VibGUKKyAgICBUbXAsIEFkZHIgYXMgc3RvcmVEb3VibGUKKworTW92ZTY0VG9E
b3VibGUgVTpHLCBEOkYKKyAgICBUbXAsIFRtcAorCitNb3ZlRG91YmxlVG82NCBVOkYsIEQ6Rwor
ICAgIFRtcCwgVG1wCisKK0JyYW5jaEFkZDMyIFU6RywgVTpHLCBVRDpHIC9icmFuY2gKKyAgICBS
ZXNDb25kLCBUbXAsIFRtcAorICAgIFJlc0NvbmQsIEltbSwgVG1wCisgICAgUmVzQ29uZCwgSW1t
LCBBZGRyCisgICAgUmVzQ29uZCwgVG1wLCBBZGRyCisgICAgUmVzQ29uZCwgQWRkciwgVG1wCisK
K0JyYW5jaE11bDMyIFU6RywgVTpHLCBVRDpHIC9icmFuY2gKKyAgICBSZXNDb25kLCBUbXAsIFRt
cAorICAgIFJlc0NvbmQsIEFkZHIsIFRtcAorCitCcmFuY2hTdWIzMiBVOkcsIFU6RywgVUQ6RyAv
YnJhbmNoCisgICAgUmVzQ29uZCwgVG1wLCBUbXAKKyAgICBSZXNDb25kLCBJbW0sIFRtcAorICAg
IFJlc0NvbmQsIEltbSwgQWRkcgorICAgIFJlc0NvbmQsIFRtcCwgQWRkcgorICAgIFJlc0NvbmQs
IEFkZHIsIFRtcAorCitCcmFuY2hOZWczMiBVOkcsIFVEOkcgL2JyYW5jaAorICAgIFJlc0NvbmQs
IFRtcAorCitKdW1wIC9icmFuY2gKKworUmV0CisKKyMgQWlyIGFsbG93cyBmb3IgZXhvdGljIGJl
aGF2aW9yLiBBIFBhdGNoJ3MgYmVoYXZpb3IgaXMgZGV0ZXJtaW5lZCBlbnRpcmVseSBieSB0aGUg
U3BlY2lhbCBvcGVyYW5kLAorIyB3aGljaCBtdXN0IGJlIHRoZSBmaXJzdCBvcGVyYW5kLgorc3Bl
Y2lhbCBQYXRjaAorCkluZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvYWlyL0FpclNwZWNp
YWwuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9haXIvQWlyU3Bl
Y2lhbC5jcHAJKHJldmlzaW9uIDApCisrKyBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvYWlyL0Fp
clNwZWNpYWwuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsNTUgQEAKKy8qCisgKiBDb3B5
cmlnaHQgKEMpIDIwMTUgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJl
ZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Ig
d2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhl
IGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25z
IG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5v
dGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1l
ci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0
aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25z
IGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9u
IGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgor
ICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFTIElTJycg
QU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVU
IE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFC
SUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xB
SU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBC
RSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAor
ICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5P
VCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJW
SUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRF
UlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJ
VFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJ
TkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQg
T0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQ
T1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKworI2luY2x1ZGUgImNvbmZpZy5oIgor
I2luY2x1ZGUgIkFpclNwZWNpYWwuaCIKKworbmFtZXNwYWNlIEpTQyB7IG5hbWVzcGFjZSBCMyB7
IG5hbWVzcGFjZSBBaXIgeworCitTcGVjaWFsOjpTcGVjaWFsKGNvbnN0IGNoYXIqIG5hbWUpCisg
ICAgOiBtX25hbWUobmFtZSkKKyAgICAsIG1faW5kZXgoVUlOVF9NQVgpCit7Cit9CisKK1NwZWNp
YWw6On5TcGVjaWFsKCkKK3sKK30KKwordm9pZCBTcGVjaWFsOjpkdW1wKFByaW50U3RyZWFtJiBv
dXQpIGNvbnN0Cit7CisgICAgb3V0LnByaW50KG1fbmFtZSk7CisgICAgaWYgKG1faW5kZXggIT0g
VUlOVF9NQVgpCisgICAgICAgIG91dC5wcmludChtX2luZGV4KTsKK30KKwordm9pZCBTcGVjaWFs
OjpkZWVwRHVtcChQcmludFN0cmVhbSYgb3V0KSBjb25zdAoreworICAgIG91dC5wcmludCgqdGhp
cywgIjogIik7CisgICAgZGVlcER1bXBJbXBsKG91dCk7Cit9CisKK30gfSB9IC8vIG5hbWVzcGFj
ZSBKU0M6OkIzOjpBaXIKKwpJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL2Fpci9BaXJT
cGVjaWFsLmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL2Fpci9BaXJT
cGVjaWFsLmgJKHJldmlzaW9uIDApCisrKyBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvYWlyL0Fp
clNwZWNpYWwuaAkod29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDEyMCBAQAorLyoKKyAqIENvcHly
aWdodCAoQykgMjAxNSBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVk
aXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3
aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUg
Zm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMg
b2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90
aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVy
LgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRo
ZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMg
YW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24g
YW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisg
KgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIGBgQVMgSVMnJyBB
TkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQg
Tk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJ
TElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJ
TUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJF
IExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisg
KiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9U
IExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJ
Q0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVS
UlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElU
WSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElO
Q0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBP
RiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBP
U1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLiAKKyAqLworCisjaWZuZGVmIEFpclNwZWNpYWxfaAor
I2RlZmluZSBBaXJTcGVjaWFsX2gKKworI2luY2x1ZGUgIkFpckluc3QuaCIKKyNpbmNsdWRlIDx3
dGYvRmFzdE1hbGxvYy5oPgorI2luY2x1ZGUgPHd0Zi9Ob25jb3B5YWJsZS5oPgorI2luY2x1ZGUg
PHd0Zi9TY29wZWRMYW1iZGEuaD4KKworbmFtZXNwYWNlIEpTQyB7IG5hbWVzcGFjZSBCMyB7IG5h
bWVzcGFjZSBBaXIgeworCitjbGFzcyBHZW5lcmF0aW9uQ29udGV4dDsKKworY2xhc3MgU3BlY2lh
bCB7CisgICAgV1RGX01BS0VfTk9OQ09QWUFCTEUoU3BlY2lhbCk7CisgICAgV1RGX01BS0VfRkFT
VF9BTExPQ0FURUQ7CitwdWJsaWM6CisgICAgU3BlY2lhbChjb25zdCBjaGFyKiBuYW1lKTsKKyAg
ICB2aXJ0dWFsIH5TcGVjaWFsKCk7CisKKyAgICBjb25zdCBjaGFyKiBuYW1lKCkgY29uc3QgeyBy
ZXR1cm4gbV9uYW1lOyB9CisKKyAgICB2aXJ0dWFsIHZvaWQgZm9yRWFjaEFyZyhJbnN0JiwgY29u
c3QgU2NvcGVkTGFtYmRhPEluc3Q6OkVhY2hBcmdDYWxsYmFjaz4mKSA9IDA7CisgICAgdmlydHVh
bCBib29sIGlzVmFsaWQoSW5zdCYpID0gMDsKKyAgICB2aXJ0dWFsIGJvb2wgYWRtaXRzU3RhY2so
SW5zdCYsIHVuc2lnbmVkIGFyZ0luZGV4KSA9IDA7CisKKyAgICAvLyBUaGlzIGdldHMgY2FsbGVk
IG9uIGZvciBlYWNoIEluc3QgdGhhdCB1c2VzIHRoaXMgU3BlY2lhbC4gTm90ZSB0aGF0IHRoZXJl
IGlzIG5vIHdheSB0bworICAgIC8vIGd1YXJhbnRlZSB0aGF0IGEgU3BlY2lhbCBnZXRzIHVzZWQg
ZnJvbSBqdXN0IG9uZSBJbnN0LCBiZWNhdXNlIEFpciBtaWdodCB0YWlsZHVwIGxhdGUuIFNvLAor
ICAgIC8vIGlmIHlvdSB3YW50IHRvIHBhc3MgdGhpcyBpbmZvcm1hdGlvbiBkb3duIHRvIGdlbmVy
YXRlKCksIHRoZW4geW91IGhhdmUgdG8gZWl0aGVyOgorICAgIC8vCisgICAgLy8gMSkgR2VuZXJh
dGUgQWlyIHRoYXQgc3RhcnRzIHdpdGggYSBzZXBhcmF0ZSBTcGVjaWFsIHBlciBQYXRjaCBJbnN0
LCBhbmQgdGhlbiBtZXJnZQorICAgIC8vICAgIHVzZWRSZWdpc3RlciBzZXRzLiBUaGlzIGlzIHBy
b2JhYmx5IG5vdCBncmVhdCwgYnV0IGl0IG9wdGltaXplcyBmb3IgdGhlIGNvbW1vbiBjYXNlIHRo
YXQKKyAgICAvLyAgICBBaXIgZGlkbid0IGR1cGxpY2F0ZSBjb2RlIG9yIHRoYXQgc3VjaCBkdXBs
aWNhdGlvbiBkaWRuJ3QgY2F1c2UgYW55IGludGVyZXN0aW5nIGNoYW5nZXMgdG8KKyAgICAvLyAg
ICByZWdpc3RlciBhc3NpZ25tZW50LgorICAgIC8vCisgICAgLy8gMikgSGF2ZSB0aGUgU3BlY2lh
bCBtYWludGFpbiBhIEhhc2hNYXA8SW5zdCosIFJlZ2lzdGVyU2V0Pi4gVGhpcyB3b3JrcyBiZWNh
dXNlIHRoZSBhbmFseXNpcworICAgIC8vICAgIHRoYXQgZmVlZHMgaW50byB0aGlzIGNhbGwgaXMg
cGVyZm9ybWVkIGp1c3QgYmVmb3JlIGNvZGUgZ2VuZXJhdGlvbiBhbmQgdGhlcmUgaXMgbm8gd2F5
CisgICAgLy8gICAgZm9yIHRoZSBWZWN0b3I8PidzIHRoYXQgY29udGFpbiB0aGUgSW5zdHMgdG8g
YmUgcmVhbGxvY2F0ZWQuIFRoaXMgYWxsb3dzIGdlbmVyYXRlKCkgdG8KKyAgICAvLyAgICBjb25z
dWx0IHRoZSBIYXNoTWFwLgorICAgIC8vCisgICAgLy8gMykgSHlicmlkOiB5b3UgY291bGQgdXNl
ICgxKSBhbmQgZmlyZSB1cCBhIEhhc2hNYXAgaWYgeW91IHNlZSBtdWx0aXBsZSBjYWxscy4KKyAg
ICAvLworICAgIC8vIE5vdGUgdGhhdCBpdCdzIG5vdCBwb3NzaWJsZSB0byByZWx5IG9uIHJlcG9y
dFVzZWRSZWdpc3RlcnMoKSBiZWluZyBjYWxsZWQgaW4gdGhlIHNhbWUgb3JkZXIKKyAgICAvLyBh
cyBnZW5lcmF0ZSgpLiBJZiB3ZSBjb3VsZCByZWx5IG9uIHRoYXQsIHRoZW4gd2UgY291bGQganVz
dCBoYXZlIGVhY2ggU3BlY2lhbCBpbnN0YW5jZQorICAgIC8vIG1haW50YWluIGEgVmVjdG9yIG9m
IFJlZ2lzdGVyU2V0J3MgYW5kIHRoZW4gcHJvY2VzcyB0aGF0IHZlY3RvciBpbiB0aGUgcmlnaHQg
b3JkZXIgaW4KKyAgICAvLyBnZW5lcmF0ZSgpLiBCdXQsIHRoZSBvcmRlcmluZyBkaWZmZXJlbmNl
IGlzIHVubGlrZWx5IHRvIGNoYW5nZSBzaW5jZSBpdCB3b3VsZCBoYXJtIHRoZQorICAgIC8vIHBl
cmZvcm1hbmNlIG9mIHRoZSBsaXZlbmVzcyBhbmFseXNpcy4KKyAgICAvLworICAgIC8vIEN1cnJl
bnRseSwgd2UgZG8gKDEpIGZvciBCMyBzdGFja21hcHMuCisgICAgdmlydHVhbCB2b2lkIHJlcG9y
dFVzZWRSZWdpc3RlcnMoSW5zdCYsIGNvbnN0IFJlZ2lzdGVyU2V0JikgPSAwOworICAgIAorICAg
IHZpcnR1YWwgQ0NhbGxIZWxwZXJzOjpKdW1wIGdlbmVyYXRlKEluc3QmLCBDQ2FsbEhlbHBlcnMm
LCBHZW5lcmF0aW9uQ29udGV4dCYpID0gMDsKKworICAgIHZpcnR1YWwgY29uc3QgUmVnaXN0ZXJT
ZXQmIGV4dHJhQ2xvYmJlcmVkUmVncyhJbnN0JikgPSAwOworCisgICAgdm9pZCBkdW1wKFByaW50
U3RyZWFtJikgY29uc3Q7CisgICAgdm9pZCBkZWVwRHVtcChQcmludFN0cmVhbSYpIGNvbnN0Owor
Citwcm90ZWN0ZWQ6CisgICAgdmlydHVhbCB2b2lkIGRlZXBEdW1wSW1wbChQcmludFN0cmVhbSYp
IGNvbnN0ID0gMDsKKworcHJpdmF0ZToKKyAgICBmcmllbmQgY2xhc3MgQ29kZTsKKworICAgIGNv
bnN0IGNoYXIqIG1fbmFtZTsKKyAgICB1bnNpZ25lZCBtX2luZGV4OworfTsKKworY2xhc3MgRGVl
cFNwZWNpYWxEdW1wIHsKK3B1YmxpYzoKKyAgICBEZWVwU3BlY2lhbERpbXAoU3BlY2lhbCogc3Bl
Y2lhbCkKKyAgICAgICAgOiBtX3NwZWNpYWwoc3BlY2lhbCkKKyAgICB7CisgICAgfQorCisgICAg
dm9pZCBkdW1wKFByaW50U3RyZWFtJiBvdXQpIGNvbnN0CisgICAgeworICAgICAgICBpZiAobV9z
cGVjaWFsKQorICAgICAgICAgICAgbV9zcGVjaWFsLT5kZWVwRHVtcChvdXQpOworICAgICAgICBl
bHNlCisgICAgICAgICAgICBvdXQucHJpbnQoIjxudWxsPiIpOworICAgIH0KKworcHJpdmF0ZToK
KyAgICBTcGVjaWFsKiBtX3NwZWNpYWw7Cit9OworCitEZWVwU3BlY2lhbER1bXAgZGVlcER1bXAo
U3BlY2lhbCogc3BlY2lhbCkKK3sKKyAgICByZXR1cm4gRGVlcFNwZWNpYWxEdW1wKHNwZWNpYWwp
OworfQorCit9IH0gfSAvLyBuYW1lc3BhY2UgSlNDOjpCMzo6QWlyCisKKyNlbmRpZiAvLyBBaXJT
cGVjaWFsX2gKKwpJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL2Fpci9BaXJTdGFja1Ns
b3QuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvYWlyL0FpclN0YWNr
U2xvdC5oCShyZXZpc2lvbiAwKQorKysgU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL2Fpci9BaXJT
dGFja1Nsb3QuaAkod29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDkyIEBACisvKgorICogQ29weXJp
Z2h0IChDKSAyMDE1IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRp
c3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdp
dGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBm
b2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBv
ZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3Rp
Y2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIu
CisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhl
IGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBh
bmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBh
bmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAq
CisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFO
RCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBO
T1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklM
SVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlN
RUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUg
TElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAq
IEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1Qg
TElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklD
RVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJS
VVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZ
LCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5D
TFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9G
IFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9T
U0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisKKyNpZm5kZWYgQWlyU3RhY2tTbG90X2gK
KyNkZWZpbmUgQWlyU3RhY2tTbG90X2gKKworI2luY2x1ZGUgPHd0Zi9Ob25Db3B5YWJsZS5oPgor
I2luY2x1ZGUgPHd0Zi9GYXN0TWFsbG9jLmg+CisKK25hbWVzcGFjZSBKU0MgeyBuYW1lc3BhY2Ug
QjMgeworCitjbGFzcyBTdGFja1Nsb3R2YWx1ZTsKKworbmFtZXNwYWNlIEFpciB7CisKK2NsYXNz
IFN0YWNrU2xvdCB7CisgICAgV1RGX01BS0VfTk9OQ09QWUFCTEUoU3RhY2tTbG90KTsKKyAgICBX
VEZfTUFLRV9GQVNUX0FMTE9DQVRFRDsKK3B1YmxpYzoKKyAgICB1bnNpZ25lZCBieXRlU2l6ZSgp
IGNvbnN0IHsgcmV0dXJuIG1fYnl0ZVNpemU7IH0KKyAgICB1bnNpZ25lZCBpbmRleCgpIGNvbnN0
IHsgcmV0dXJuIG1faW5kZXg7IH0KKworICAgIFN0YWNrU2xvdFZhbHVlKiB2YWx1ZSgpIGNvbnN0
IHsgcmV0dXJuIG1fdmFsdWU7IH0KKworICAgIHZvaWQgZHVtcChQcmludFN0cmVhbSYpIGNvbnN0
OworICAgIHZvaWQgZGVlcER1bXAoUHJpbnRTdHJlYW0mKSBjb25zdDsKKworcHJpdmF0ZToKKyAg
ICBmcmllbmQgY2xhc3MgQ29kZTsKKworICAgIFN0YWNrU2xvdCh1bnNpZ25lZCBieXRlU2l6ZSwg
dW5zaWduZWQgaW5kZXgsIFN0YWNrU2xvdFZhbHVlKiB2YWx1ZSkKKyAgICAgICAgOiBtX2J5dGVT
aXplKGJ5dGVTaXplKQorICAgICAgICAsIG1faW5kZXgoaW5kZXgpCisgICAgICAgICwgbV92YWx1
ZSh2YWx1ZSkKKyAgICB7CisgICAgfQorICAgIAorICAgIHVuc2lnbmVkIG1fYnl0ZVNpemU7Cisg
ICAgdW5zaWduZWQgbV9pbmRleDsKKyAgICBTdGFja1Nsb3RWYWx1ZSogbV92YWx1ZTsKK307CisK
K2NsYXNzIERlZXBTdGFja1Nsb3REdW1wIHsKK3B1YmxpYzoKKyAgICBEZWVwU3RhY2tTbG90RHVt
cChTdGFja1Nsb3QqIHNsb3QpCisgICAgICAgIDogbV9zbG90KHNsb3QpCisgICAgeworICAgIH0K
KworICAgIHZvaWQgZHVtcChQcmludFN0cmVhbSYgb3V0KSBjb25zdAorICAgIHsKKyAgICAgICAg
aWYgKG1fc2xvdCkKKyAgICAgICAgICAgIG1fc2xvdC0+ZGVlcER1bXAob3V0KTsKKyAgICAgICAg
ZWxzZQorICAgICAgICAgICAgb3V0LnByaW50KCI8bnVsbD4iKTsKKyAgICB9CisKK3ByaXZhdGU6
CisgICAgU3RhY2tTbG90KiBtX3Nsb3Q7Cit9OworCitEZWVwU3RhY2tTbG90RHVtcCBkZWVwRHVt
cChTdGFja1Nsb3QqIHNsb3QpCit7CisgICAgcmV0dXJuIERlZXBTdGFja1Nsb3REdW1wKHNsb3Qp
OworfQorCit9IH0gfSAvLyBuYW1lc3BhY2UgSlNDOjpCMzo6QWlyCisKKyNlbmRpZiAvLyBBaXJT
dGFja1Nsb3RfaAorCkluZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvYWlyL0FpclRtcC5j
cHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL2Fpci9BaXJUbXAuY3Bw
CShyZXZpc2lvbiAwKQorKysgU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL2Fpci9BaXJUbXAuY3Bw
CSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsNTIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIw
MTUgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9u
IGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICog
bW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBj
b25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBj
b2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBs
aXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJl
ZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29w
eXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9s
bG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhl
ciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMg
U09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICog
RVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVE
IFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJ
VE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5P
IEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9S
IEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZ
LCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRP
LAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBP
RiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhP
V0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIg
SU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVH
TElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQor
ICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBP
RiBTVUNIIERBTUFHRS4gCisgKi8KKworI2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgIkFp
clRtcC5oIgorCituYW1lc3BhY2UgSlNDIHsgbmFtZXNwYWNlIEIzIHsgbmFtZXNwYWNlIEFpciB7
CisKK3ZvaWQgVG1wOjpkdW1wKFByaW50U3RyZWFtJiBvdXQpIGNvbnN0Cit7CisgICAgaWYgKCEq
dGhpcykgeworICAgICAgICBvdXQucHJpbnQoIjxub25lPiIpOworICAgICAgICByZXR1cm47Cisg
ICAgfQorCisgICAgaWYgKGlzUmVnKCkpIHsKKyAgICAgICAgb3V0LnByaW50KHJlZygpKTsKKyAg
ICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGlmIChpc0dQVG1wKCkpIHsKKyAgICAgICAgb3V0
LnByaW50KCIldG1wIiwgZ3BUbXBJbmRleCgpKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKwor
ICAgIG91dC5wcmludCgiJWZ0bXAiLCBmcFRtcEluZGV4KCkpOworfQorCit9IH0gfSAvLyBuYW1l
c3BhY2UgSlNDOjpCMzo6QWlyCisKSW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9haXIv
QWlyVG1wLmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL2Fpci9BaXJU
bXAuaAkocmV2aXNpb24gMCkKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9haXIvQWlyVG1w
LmgJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSwyNDggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMp
IDIwMTUgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0
aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAor
ICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2lu
ZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJj
ZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhp
cyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIu
IFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUg
Y29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUg
Zm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBv
dGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRI
SVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQor
ICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1J
VEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5E
IEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElO
IE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUg
Rk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBM
QVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVE
IFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9T
UyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04p
IEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRI
RVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcg
TkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVT
RQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElU
WSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKworI2lmbmRlZiBBaXJUbXBfaAorI2RlZmluZSBBaXJU
bXBfaAorCisjaW5jbHVkZSAiUmVnLmgiCisKK25hbWVzcGFjZSBKU0MgeyBuYW1lc3BhY2UgQjMg
eyBuYW1lc3BhY2UgQWlyIHsKKworLy8gQSBUbXAgaXMgYSBnZW5lcmFsaXphdGlvbiBvZiBhIHJl
Z2lzdGVyLiBJdCBjYW4gYmUgdXNlZCB0byByZWZlciB0byBhbnkgR1BSIG9yIEZQUi4gSXQgY2Fu
IGFsc28KKy8vIGJlIHVzZWQgdG8gcmVmZXIgdG8gYW4gdW5hbGxvY2F0ZWQgcmVnaXN0ZXIgKGku
ZS4gYSB0ZW1wb3JhcnkpLiBMaWtlIG1hbnkgQWlyIGNsYXNzZXMsIHdlIHVzZQorLy8gZGVsaWJl
cmF0ZWx5IHRlcnNlIG5hbWluZyBzaW5jZSB3ZSB3aWxsIGhhdmUgdG8gdXNlIHRoaXMgbmFtZSBh
IGxvdC4KKworY2xhc3MgVG1wIHsKK3B1YmxpYzoKKyAgICBUbXAoKQorICAgICAgICA6IG1fdmFs
dWUoMCkKKyAgICB7CisgICAgfQorCisgICAgZXhwbGljaXQgVG1wKFJlZyByZWcpCisgICAgewor
ICAgICAgICBpZiAocmVnKSB7CisgICAgICAgICAgICBpZiAocmVnLmlzR1BSKCkpCisgICAgICAg
ICAgICAgICAgbV92YWx1ZSA9IGVuY29kZUdQUihyZWcuZ3ByKCkpOworICAgICAgICAgICAgZWxz
ZQorICAgICAgICAgICAgICAgIG1fdmFsdWUgPSBlbmNvZGVGUFIocmVnLmZwcigpKTsKKyAgICAg
ICAgfSBlbHNlCisgICAgICAgICAgICBtX3ZhbHVlID0gMDsKKyAgICB9CisKKyAgICBzdGF0aWMg
VG1wIGdwVG1wRm9ySW5kZXgodW5zaWduZWQgaW5kZXgpCisgICAgeworICAgICAgICBUbXAgcmVz
dWx0OworICAgICAgICByZXN1bHQubV92YWx1ZSA9IGVuY29kZUdQVG1wKGluZGV4KTsKKyAgICAg
ICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisKKyAgICBzdGF0aWMgVG1wIGZwVG1wRm9ySW5kZXgo
dW5zaWduZWQgaW5kZXgpCisgICAgeworICAgICAgICBUbXAgcmVzdWx0OworICAgICAgICByZXN1
bHQubV92YWx1ZSA9IGVuY29kZUZQVG1wKGluZGV4KTsKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsK
KyAgICB9CisKKyAgICBzdGF0aWMgVG1wIGZvclJhd1ZhbHVlKHVuc2lnbmVkIGluZGV4KQorICAg
IHsKKyAgICAgICAgVG1wIHJlc3VsdDsKKyAgICAgICAgcmVzdWx0Lm1fdmFsdWUgPSBpbmRleDsK
KyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisKKyAgICBleHBsaWNpdCBvcGVyYXRvciBi
b29sKCkgY29uc3QgeyByZXR1cm4gISFtX3ZhbHVlOyB9CisKKyAgICBib29sIHJhd1ZhbHVlKCkg
Y29uc3QgeyByZXR1cm4gbV92YWx1ZTsgfQorCisgICAgYm9vbCBpc0dQKCkgY29uc3QKKyAgICB7
CisgICAgICAgIHJldHVybiBpc0VuY29kZWRHUChtX3ZhbHVlKTsKKyAgICB9CisKKyAgICBib29s
IGlzRlAoKSBjb25zdAorICAgIHsKKyAgICAgICAgcmV0dXJuIGlzRW5jb2RlZEZQKG1fdmFsdWUp
OworICAgIH0KKworICAgIGJvb2wgaXNHUFIoKSBjb25zdAorICAgIHsKKyAgICAgICAgcmV0dXJu
IGlzRW5jb2RlZEdQUihtX3ZhbHVlKTsKKyAgICB9CisKKyAgICBib29sIGlzRlBSKCkgY29uc3QK
KyAgICB7CisgICAgICAgIHJldHVybiBpc0VuY29kZWRGUFIobV92YWx1ZSk7CisgICAgfQorCisg
ICAgYm9vbCBpc1JlZygpIGNvbnN0CisgICAgeworICAgICAgICByZXR1cm4gaXNHUFIoKSB8fCBp
c0ZQUigpOworICAgIH0KKworICAgIEdQUlJlZyBncHIoKSBjb25zdAorICAgIHsKKyAgICAgICAg
cmV0dXJuIGRlY29kZUdQUihtX3ZhbHVlKTsKKyAgICB9CisKKyAgICBGUFJSZWcgZnByKCkgY29u
c3QKKyAgICB7CisgICAgICAgIHJldHVybiBkZWNvZGVGUFIobV92YWx1ZSk7CisgICAgfQorCisg
ICAgUmVnIHJlZygpIGNvbnN0CisgICAgeworICAgICAgICBpZiAoaXNHUCgpKQorICAgICAgICAg
ICAgcmV0dXJuIGdwcigpOworICAgICAgICByZXR1cm4gZnByKCk7CisgICAgfQorCisgICAgdW5z
aWduZWQgZ3BUbXBJbmRleCgpIGNvbnN0CisgICAgeworICAgICAgICByZXR1cm4gZGVjb2RlR1BU
bXAobV92YWx1ZSk7CisgICAgfQorCisgICAgdW5zaWduZWQgZnBUbXBJbmRleCgpIGNvbnN0Cisg
ICAgeworICAgICAgICByZXR1cm4gZGVjb2RlRlBUbXAobV92YWx1ZSk7CisgICAgfQorCisgICAg
dW5zaWduZWQgdG1wSW5kZXgoKSBjb25zdAorICAgIHsKKyAgICAgICAgaWYgKGlzR1AoKSkKKyAg
ICAgICAgICAgIHJldHVybiBncFRtcEluZGV4KCk7CisgICAgICAgIHJldHVybiBmcFRtcEluZGV4
KCk7CisgICAgfQorCisgICAgYm9vbCBvcGVyYXRvcj09KGNvbnN0IFRtcCYgb3RoZXIpIGNvbnN0
CisgICAgeworICAgICAgICByZXR1cm4gbV92YWx1ZSA9PSBvdGhlci5tX3ZhbHVlOworICAgIH0K
KworICAgIGJvb2wgb3BlcmF0b3IhPShjb25zdCBUbXAmIG90aGVyKSBjb25zdAorICAgIHsKKyAg
ICAgICAgcmV0dXJuICEoKnRoaXMgPT0gb3RoZXIpOworICAgIH0KKworICAgIHZvaWQgZHVtcChQ
cmludFN0cmVhbSYgb3V0KSBjb25zdDsKKyAgICAKK3ByaXZhdGU6CisgICAgc3RhdGljIGludCBl
bmNvZGVHUCh1bnNpZ25lZCBpbmRleCkKKyAgICB7CisgICAgICAgIHJldHVybiAxICsgaW5kZXg7
CisgICAgfQorCisgICAgc3RhdGljIGludCBlbmNvZGVGUCh1bnNpZ25lZCBpbmRleCkKKyAgICB7
CisgICAgICAgIHJldHVybiAtMSAtIGluZGV4OworICAgIH0KKworICAgIHN0YXRpYyBpbnQgZW5j
b2RlR1BSKEdQUlJlZyBncHIpCisgICAgeworICAgICAgICByZXR1cm4gZW5jb2RlR1AoZ3ByIC0g
TWFjcm9Bc3NlbWJsZXI6OmZpcnN0UmVnaXN0ZXIoKSk7CisgICAgfQorCisgICAgc3RhdGljIGlu
dCBlbmNvZGVGUFIoRlBSUmVnIGZwcikKKyAgICB7CisgICAgICAgIHJldHVybiBlbmNvZGVGUChm
cHIgLSBNYWNyb0Fzc2VtYmxlcjo6Zmlyc3RGUFJSZWdpc3RlcigpKTsKKyAgICB9CisKKyAgICBz
dGF0aWMgaW50IGVuY29kZUdQVG1wKHVuc2lnbmVkIGluZGV4KQorICAgIHsKKyAgICAgICAgcmV0
dXJuIGVuY29kZUdQUihNYWNyb0Fzc2VtYmxlcjo6bGFzdFJlZ2lzdGVyKCkpICsgMSArIGluZGV4
OworICAgIH0KKworICAgIHN0YXRpYyBpbnQgZW5jb2RlRlBUbXAodW5zaWduZWQgaW5kZXgpCisg
ICAgeworICAgICAgICByZXR1cm4gZW5jb2RlRlBSKE1hY3JvQXNzZW1ibGVyOjpsYXN0RlBSZWdp
c3RlcigpKSAtIDEgLSBpbmRleDsKKyAgICB9CisKKyAgICBzdGF0aWMgYm9vbCBpc0VuY29kZWRH
UChpbnQgdmFsdWUpCisgICAgeworICAgICAgICByZXR1cm4gdmFsdWUgPiAwOworICAgIH0KKwor
ICAgIHN0YXRpYyBib29sIGlzRW5jb2RlZEZQKGludCB2YWx1ZSkKKyAgICB7CisgICAgICAgIHJl
dHVybiB2YWx1ZSA8IDA7CisgICAgfQorCisgICAgc3RhdGljIGJvb2wgaXNFbmNvZGVkR1BSKGlu
dCB2YWx1ZSkKKyAgICB7CisgICAgICAgIHJldHVybiBpc0VuY29kZWRHUCh2YWx1ZSkgJiYgdmFs
dWUgPD0gZW5jb2RlR1BSKE1hY3JvQXNzZW1ibGVyOjpsYXN0UmVnaXN0ZXIoKSk7CisgICAgfQor
CisgICAgc3RhdGljIGJvb2wgaXNFbmNvZGVkRlBSKGludCB2YWx1ZSkKKyAgICB7CisgICAgICAg
IHJldHVybiBpc0VuY29kZWRGUCh2YWx1ZSkgJiYgdmFsdWUgPj0gZW5jb2RlZEZQUihNYWNyb0Fz
c2VtYmxlcjo6bGFzdEZQUmVnaXN0ZXIoKSk7CisgICAgfQorCisgICAgc3RhdGljIGJvb2wgaXNF
bmNvZGVkR1BUbXAoaW50IHZhbHVlKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGlzRW5jb2RlZEdQ
KHZhbHVlKSAmJiAhaXNFbmNvZGVkR1BSKHZhbHVlKTsKKyAgICB9CisKKyAgICBzdGF0aWMgYm9v
bCBpc0VuY29kZWRGUFRtcChpbnQgdmFsdWUpCisgICAgeworICAgICAgICByZXR1cm4gaXNFbmNv
ZGVkRlAodmFsdWUpICYmICFpc0VuY29kZWRGUFIodmFsdWUpOworICAgIH0KKworICAgIHN0YXRp
YyBHUFJSZWcgZGVjb2RlR1BSKGludCB2YWx1ZSkKKyAgICB7CisgICAgICAgIEFTU0VSVChpc0Vu
Y29kZWRHUFIodmFsdWUpKTsKKyAgICAgICAgcmV0dXJuIHN0YXRpY19jYXN0PEdQUlJlZz4oCisg
ICAgICAgICAgICAodmFsdWUgLSBlbmNvZGVHUFIoTWFjcm9Bc3NlbWJsZXI6OmZpcnN0UmVnaXN0
ZXIoKSkpICsgTWFjcm9Bc3NlbWJsZXI6OmZpcnN0UmVnaXN0ZXIoKSk7CisgICAgfQorCisgICAg
c3RhdGljIEZQUlJlZyBkZWNvZGVGUFIoaW50IHZhbHVlKQorICAgIHsKKyAgICAgICAgQVNTRVJU
KGlzRW5jb2RlZEZQUih2YWx1ZSkpOworICAgICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8RlBSUmVn
PigKKyAgICAgICAgICAgIChlbmNvZGVGUFIoTWFjcm9Bc3NlbWJsZXI6OmZpcnN0RlBSZWdpc3Rl
cigpKSAtIHZhbHVlKSArCisgICAgICAgICAgICBNYWNyb0Fzc2VtYmxlcjo6Zmlyc3RGUFJlZ2lz
dGVyKCkpOworICAgIH0KKworICAgIHN0YXRpYyB1bnNpZ25lZCBkZWNvZGVHUFRtcChpbnQgdmFs
dWUpCisgICAgeworICAgICAgICBBU1NFUlQoaXNFbmNvZGVkR1BUbXAodmFsdWUpKTsKKyAgICAg
ICAgcmV0dXJuIHZhbHVlIC0gKGVuY29kZUdQUihNYWNyb0Fzc2VtYmxlcjo6bGFzdFJlZ2lzdGVy
KCkpICsgMSk7CisgICAgfQorCisgICAgc3RhdGljIHVuc2lnbmVkIGRlY29kZUZQVG1wKGludCB2
YWx1ZSkKKyAgICB7CisgICAgICAgIEFTU0VSVChpc0VuY29kZWRGUFRtcCh2YWx1ZSkpOworICAg
ICAgICByZXR1cm4gKGVuY29kZUZQUihNYWNyb0Fzc2VtYmxlcjo6bGFzdEZQUmVnaXN0ZXIoKSkg
LSAxKSAtIHZhbHVlOworICAgIH0KKworICAgIC8vIDA6IGVtcHR5IFRtcAorICAgIC8vIHBvc2l0
aXZlOiBHUFJzIGFuZCB0aGVuIEdQIHRlbXBzLgorICAgIC8vIG5lZ2F0aXZlOiBGUFJzIGFuZCB0
aGVuIEZQIHRlbXBzLgorICAgIGludCBtX3ZhbHVlOworfTsKKworfSB9IH0gLy8gbmFtZXNwYWNl
IEpTQzo6QjM6OkFpcgorCisjZW5kaWYgLy8gQWlyVG1wX2gKKwpJbmRleDogU291cmNlL0phdmFT
Y3JpcHRDb3JlL2IzL2Fpci9vcGNvZGVfZ2VuZXJhdG9yLnJiCj09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJj
ZS9KYXZhU2NyaXB0Q29yZS9iMy9haXIvb3Bjb2RlX2dlbmVyYXRvci5yYgkocmV2aXNpb24gMCkK
KysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9haXIvb3Bjb2RlX2dlbmVyYXRvci5yYgkod29y
a2luZyBjb3B5KQpAQCAtMCwwICsxLDg2MyBAQAorIyEvdXNyL2Jpbi9lbnYgcnVieQorCisjIENv
cHlyaWdodCAoQykgMjAxNSBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisjCisjIFJl
ZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Ig
d2l0aG91dAorIyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUg
Zm9sbG93aW5nIGNvbmRpdGlvbnMKKyMgYXJlIG1ldDoKKyMgMS4gUmVkaXN0cmlidXRpb25zIG9m
IHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyMgICAgbm90aWNl
LCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgor
IyAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFi
b3ZlIGNvcHlyaWdodAorIyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0
aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisjICAgIGRvY3VtZW50YXRpb24gYW5kL29y
IG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisjCisjIFRI
SVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBBTkQgSVRTIENPTlRSSUJVVE9S
UyBgYEFTIElTJycKKyMgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5D
TFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisjIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0Yg
TUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyMgUFVSUE9TRSBB
UkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUiBJVFMgQ09OVFJJ
QlVUT1JTCisjIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUws
IFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKKyMgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJ
TkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKKyMgU1VCU1RJVFVURSBHT09E
UyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNT
CisjIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElB
QklMSVRZLCBXSEVUSEVSIElOCisjIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JU
IChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisjIEFSSVNJTkcgSU4gQU5ZIFdB
WSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YKKyMg
VEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCityZXF1aXJlICJwYXRobmFtZSIKKwor
Y2xhc3MgT3Bjb2RlCisgICAgYXR0cl9yZWFkZXIgOm5hbWUsIDpzcGVjaWFsLCA6b3ZlcmxvYWRz
CisgICAgYXR0cl9hY2Nlc3NvciA6YnJhbmNoCisKKyAgICBkZWYgaW5pdGlhbGl6ZShuYW1lLCBz
cGVjaWFsKQorICAgICAgICBAbmFtZSA9IG5hbWUKKyAgICAgICAgQHNwZWNpYWwgPSBzcGVjaWFs
CisgICAgICAgIEBicmFuY2ggPSBmYWxzZQorICAgICAgICB1bmxlc3Mgc3BlY2lhbAorICAgICAg
ICAgICAgQG92ZXJsb2FkcyA9IFtdCisgICAgICAgIGVuZAorICAgIGVuZAorCisgICAgZGVmIG1h
c21OYW1lCisgICAgICAgIG5hbWVbMF0uZG93bmNhc2UgKyBuYW1lWzEuLi0xXQorICAgIGVuZAor
ZW5kCisKK2NsYXNzIEFyZworICAgIGF0dHJfcmVhZGVyIDpyb2xlLCA6dHlwZQorCisgICAgZGVm
IGluaXRpYWxpemUocm9sZSwgdHlwZSkKKyAgICAgICAgQHJvbGUgPSByb2xlCisgICAgICAgIEB0
eXBlID0gdHlwZQorICAgIGVuZAorZW5kCisKK2NsYXNzIE92ZXJsb2FkCisgICAgYXR0cl9yZWFk
ZXIgOnNpZ25hdHVyZSwgOmZvcm1zCisKKyAgICBkZWYgaW5pdGlhbGl6ZShzaWduYXR1cmUsIGZv
cm1zKQorICAgICAgICBAc2lnbmF0dXJlID0gc2lnbmF0dXJlCisgICAgICAgIEBmb3JtcyA9IGZv
cm1zCisgICAgZW5kCitlbmQKKworY2xhc3MgS2luZAorICAgIGF0dHJfcmVhZGVyIDpuYW1lCisg
ICAgYXR0cl9hY2Nlc3NvciA6c3BlY2lhbAorCisgICAgZGVmIGluaXRpYWxpemUobmFtZSkKKyAg
ICAgICAgQG5hbWUgPSBuYW1lCisgICAgICAgIEBzcGVjaWFsID0gZmFsc2UKKyAgICBlbmQKKwor
ICAgIGRlZiA9PShvdGhlcikKKyAgICAgICAgaWYgb3RoZXIuaXNfYT8gU3RyaW5nCisgICAgICAg
ICAgICBAbmFtZSA9PSBvdGhlcgorICAgICAgICBlbHNlCisgICAgICAgICAgICBAbmFtZSA9PSBv
dGhlci5uYW1lIGFuZCBAc3BlY2lhbCA9PSBvdGhlci5zcGVjaWFsCisgICAgICAgIGVuZAorICAg
IGVuZAorCisgICAgZGVmIEtpbmQuYXJnS2luZHMoa2luZCkKKyAgICAgICAgaWYga2luZCA9PSAi
QWRkciIKKyAgICAgICAgICAgIFsiQWRkciIsICJTdGFja1Nsb3QiLCAiQ2FsbEFyZyJdCisgICAg
ICAgIGVsc2UKKyAgICAgICAgICAgIFtraW5kXQorICAgICAgICBlbmQKKyAgICBlbmQKKworICAg
IGRlZiBhcmdLaW5kcworICAgICAgICBLaW5kLmFyZ0tpbmRzKGtpbmQpCisgICAgZW5kCitlbmQK
KworY2xhc3MgRm9ybQorICAgIGF0dHJfcmVhZGVyIDpraW5kcywgOmFsdE5hbWUKKworICAgIGRl
ZiBpbml0aWFsaXplKGtpbmRzLCBhbHROYW1lKQorICAgICAgICBAa2luZHMgPSBraW5kcworICAg
ICAgICBAYWx0TmFtZSA9IGFsdE5hbWUKKyAgICBlbmQKK2VuZAorCitjbGFzcyBPcmlnaW4KKyAg
ICBhdHRyX3JlYWRlciA6ZmlsZU5hbWUsIDpsaW5lTnVtYmVyCisgICAgCisgICAgZGVmIGluaXRp
YWxpemUoZmlsZU5hbWUsIGxpbmVOdW1iZXIpCisgICAgICAgIEBmaWxlTmFtZSA9IGZpbGVOYW1l
CisgICAgICAgIEBsaW5lTnVtYmVyID0gbGluZU51bWJlcgorICAgIGVuZAorICAgIAorICAgIGRl
ZiB0b19zCisgICAgICAgICIje2ZpbGVOYW1lfToje2xpbmVOdW1iZXJ9IgorICAgIGVuZAorZW5k
CisKK2NsYXNzIFRva2VuCisgICAgYXR0cl9yZWFkZXIgOm9yaWdpbiwgOnN0cmluZworICAgIAor
ICAgIGRlZiBpbml0aWFsaXplKG9yaWdpbiwgc3RyaW5nKQorICAgICAgICBAb3JpZ2luID0gb3Jp
Z2luCisgICAgICAgIEBzdHJpbmcgPSBzdHJpbmcKKyAgICBlbmQKKyAgICAKKyAgICBkZWYgPT0o
b3RoZXIpCisgICAgICAgIGlmIG90aGVyLmlzX2E/IFRva2VuCisgICAgICAgICAgICBAc3RyaW5n
ID09IG90aGVyLnN0cmluZworICAgICAgICBlbHNlCisgICAgICAgICAgICBAc3RyaW5nID09IG90
aGVyCisgICAgICAgIGVuZAorICAgIGVuZAorICAgIAorICAgIGRlZiA9fihvdGhlcikKKyAgICAg
ICAgQHN0cmluZyA9fiBvdGhlcgorICAgIGVuZAorICAgIAorICAgIGRlZiB0b19zCisgICAgICAg
ICIje0BzdHJpbmcuaW5zcGVjdH0gYXQgI3tvcmlnaW59IgorICAgIGVuZAorICAgIAorICAgIGRl
ZiBwYXJzZUVycm9yKCpjb21tZW50KQorICAgICAgICBpZiBjb21tZW50LmVtcHR5PworICAgICAg
ICAgICAgcmFpc2UgIlBhcnNlIGVycm9yOiAje3RvX3N9IgorICAgICAgICBlbHNlCisgICAgICAg
ICAgICByYWlzZSAiUGFyc2UgZXJyb3I6ICN7dG9fc306ICN7Y29tbWVudFswXX0iCisgICAgICAg
IGVuZAorICAgIGVuZAorZW5kCisKK2RlZiBsZXgoc3RyLCBmaWxlTmFtZSkKKyAgICBmaWxlTmFt
ZSA9IFBhdGhuYW1lLm5ldyhmaWxlTmFtZSkKKyAgICByZXN1bHQgPSBbXQorICAgIGxpbmVOdW1i
ZXIgPSAxCisgICAgd2hpbGUgbm90IHN0ci5lbXB0eT8KKyAgICAgICAgY2FzZSBzdHIKKyAgICAg
ICAgd2hlbiAvXEFcIyhbXlxuXSopLworICAgICAgICAgICAgIyBjb21tZW50LCBpZ25vcmUKKyAg
ICAgICAgd2hlbiAvXEFcbi8KKyAgICAgICAgICAgICMgbmV3bGluZSwgaWdub3JlCisgICAgICAg
ICAgICBsaW5lTnVtYmVyICs9IDEKKyAgICAgICAgd2hlbiAvXEEoW2EtekEtWjAtOV9dKykvCisg
ICAgICAgICAgICByZXN1bHQgPDwgVG9rZW4ubmV3KE9yaWdpbi5uZXcoZmlsZU5hbWUsIGxpbmVO
dW1iZXIpLCAkJikKKyAgICAgICAgd2hlbiAvXEEoWyBcdFxyXSspLworICAgICAgICAgICAgIyB3
aGl0ZXNwYWNlLCBpZ25vcmUKKyAgICAgICAgd2hlbiAvXEFbLDoqXC9dLworICAgICAgICAgICAg
cmVzdWx0IDw8IFRva2VuLm5ldyhPcmlnaW4ubmV3KGZpbGVOYW1lLCBsaW5lTnVtYmVyKSwgJCYp
CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHJhaXNlICJMZXhlciBlcnJvciBhdCAje09yaWdp
bi5uZXcoZmlsZU5hbWUsIGxpbmVOdW1iZXIpLnRvX3N9LCB1bmV4cGVjdGVkIHNlcXVlbmNlICN7
c3RyWzAuLjIwXS5pbnNwZWN0fSIKKyAgICAgICAgZW5kCisgICAgICAgIHN0ciA9ICR+LnBvc3Rf
bWF0Y2gKKyAgICBlbmQKKyAgICByZXN1bHQKK2VuZAorCitkZWYgaXNVRCh0b2tlbikKKyAgICB0
b2tlbiA9fiAvXEEoKFUpfChEKXwoVUQpKVxaLworZW5kCisKK2RlZiBpc0dGKHRva2VuKQorICAg
IHRva2VuID1+IC9cQSgoRyl8KEYpKVxaLworZW5kCisKK2RlZiBpc0tpbmQodG9rZW4pCisgICAg
dG9rZW4gPX4gL1xBKChUbXApfChJbW0pfChJbW02NCl8KEFkZHIpfChJbmRleCl8KFJlbENvbmQp
fChSZXNDb25kKSlcWi8KK2VuZAorCitkZWYgaXNLZXl3b3JkKHRva2VuKQorICAgIGlzVUQodG9r
ZW4pIG9yIGlzR0YodG9rZW4pIG9yIGlzS2luZCh0b2tlbikgb3IKKyAgICAgICAgdG9rZW4gPT0g
InNwZWNpYWwiIG9yIHRva2VuID09ICJhcyIKK2VuZAorCitkZWYgaXNJZGVudGlmaWVyKHRva2Vu
KQorICAgIHRva2VuID1+IC9cQShbYS16QS1aMC05X10rKVxaLyBhbmQgbm90IGlzS2V5d29yZCh0
b2tlbikKK2VuZAorCitjbGFzcyBQYXJzZXIKKyAgICBkZWYgaW5pdGlhbGl6ZShkYXRhLCBmaWxl
TmFtZSkKKyAgICAgICAgQHRva2VucyA9IGxleChkYXRhLCBmaWxlTmFtZSkKKyAgICAgICAgQGlk
eCA9IDAKKyAgICBlbmQKKworICAgIGRlZiB0b2tlbgorICAgICAgICBAdG9rZW5zW0BpZHhdCisg
ICAgZW5kCisKKyAgICBkZWYgYWR2YW5jZQorICAgICAgICBAaWR4ICs9IDEKKyAgICBlbmQKKwor
ICAgIGRlZiBwYXJzZUVycm9yKCpjb21tZW50KQorICAgICAgICBpZiB0b2tlbgorICAgICAgICAg
ICAgdG9rZW4ucGFyc2VFcnJvcigqY29tbWVudCkKKyAgICAgICAgZWxzZQorICAgICAgICAgICAg
aWYgY29tbWVudC5lbXB0eT8KKyAgICAgICAgICAgICAgICByYWlzZSAiUGFyc2UgZXJyb3IgYXQg
ZW5kIG9mIGZpbGUiCisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgcmFpc2UgIlBh
cnNlIGVycm9yIGF0IGVuZCBvZiBmaWxlOiAje2NvbW1lbnRbMF19IgorICAgICAgICAgICAgZW5k
CisgICAgICAgIGVuZAorICAgIGVuZAorCisgICAgZGVmIGNvbnN1bWUoc3RyaW5nKQorICAgICAg
ICBwYXJzZUVycm9yKCJFeHBlY3RlZCAje3N0cmluZ30iKSB1bmxlc3MgdG9rZW4gPT0gc3RyaW5n
CisgICAgICAgIGFkdmFuY2UKKyAgICBlbmQKKworICAgIGRlZiBjb25zdW1lSWRlbnRpZmllcgor
ICAgICAgICByZXN1bHQgPSB0b2tlbi5zdHJpbmcKKyAgICAgICAgcGFyc2VFcnJvcigiRXhwZWN0
ZWQgaWRlbnRpZmllciIpIHVubGVzcyBpc0lkZW50aWZpZXIocmVzdWx0KQorICAgICAgICBhZHZh
bmNlCisgICAgICAgIHJlc3VsdAorICAgIGVuZAorCisgICAgZGVmIGNvbnN1bWVSb2xlCisgICAg
ICAgIHJlc3VsdCA9IHRva2VuLnN0cmluZworICAgICAgICBwYXJzZUVycm9yKCJFeHBlY3RlZCBy
b2xlIChVLCBELCBvciBVRCkiKSB1bmxlc3MgaXNVRChyZXN1bHQpCisgICAgICAgIGFkdmFuY2UK
KyAgICAgICAgcmVzdWx0CisgICAgZW5kCisKKyAgICBkZWYgY29uc3VtZVR5cGUKKyAgICAgICAg
cmVzdWx0ID0gdG9rZW4uc3RyaW5nCisgICAgICAgIHBhcnNlRXJyb3IoIkV4cGVjdGVkIHR5cGUg
KEcgb3IgRikiKSB1bmxlc3MgaXNHRihyZXN1bHQpCisgICAgICAgIGFkdmFuY2UKKyAgICAgICAg
cmVzdWx0CisgICAgZW5kCisKKyAgICBkZWYgY29uc3VtZUtpbmQKKyAgICAgICAgcmVzdWx0ID0g
dG9rZW4uc3RyaW5nCisgICAgICAgIHBhcnNlRXJyb3IoIkV4cGVjdGVkIGtpbmQgKEltbSwgSW1t
NjQsIFRtcCwgQWRkciwgSW5kZXgsIFJlbENvbmQsIG9yIFJlc0NvbmQpIikgdW5sZXNzIGlzS2lu
ZChyZXN1bHQpCisgICAgICAgIGFkdmFuY2UKKyAgICAgICAgcmVzdWx0CisgICAgZW5kCisKKyAg
ICBkZWYgcGFyc2UKKyAgICAgICAgcmVzdWx0ID0ge30KKyAgICAgICAgCisgICAgICAgIGxvb3Ag
eworICAgICAgICAgICAgYnJlYWsgaWYgQGlkeCA+PSBAdG9rZW5zLmxlbmd0aAorCisgICAgICAg
ICAgICBpZiB0b2tlbiA9PSAic3BlY2lhbCIKKyAgICAgICAgICAgICAgICBjb25zdW1lKCJzcGVj
aWFsIikKKyAgICAgICAgICAgICAgICBvcGNvZGVOYW1lID0gY29uc3VtZUlkZW50aWZpZXIKKwor
ICAgICAgICAgICAgICAgIHBhcnNlRXJyb3IoIkNhbm5vdCBvdmVybG9hZCBhIHNwZWNpYWwgb3Bj
b2RlIikgaWYgcmVzdWx0W29wY29kZU5hbWVdCisKKyAgICAgICAgICAgICAgICByZXN1bHRbb3Bj
b2RlTmFtZV0gPSBPcGNvZGUubmV3KG9wY29kZU5hbWUsIHRydWUpCisgICAgICAgICAgICBlbHNl
CisgICAgICAgICAgICAgICAgb3Bjb2RlTmFtZSA9IGNvbnN1bWVJZGVudGlmaWVyCisKKyAgICAg
ICAgICAgICAgICBpZiByZXN1bHRbb3Bjb2RlTmFtZV0KKyAgICAgICAgICAgICAgICAgICAgb3Bj
b2RlID0gcmVzdWx0W29wY29kZU5hbWVdCisgICAgICAgICAgICAgICAgICAgIHBhcnNlRXJyb3Io
IkNhbm5vdCBvdmVybG9hZCBhIHNwZWNpYWwgb3Bjb2RlIikgaWYgb3Bjb2RlLnNwZWNpYWwKKyAg
ICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIG9wY29kZSA9IE9wY29kZS5u
ZXcob3Bjb2RlTmFtZSwgZmFsc2UpCisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtvcGNvZGVO
YW1lXSA9IG9wY29kZQorICAgICAgICAgICAgICAgIGVuZAorCisgICAgICAgICAgICAgICAgc2ln
bmF0dXJlID0gW10KKyAgICAgICAgICAgICAgICBmb3JtcyA9IFtdCisgICAgICAgICAgICAgICAg
CisgICAgICAgICAgICAgICAgaWYgaXNVRCh0b2tlbikKKyAgICAgICAgICAgICAgICAgICAgbG9v
cCB7CisgICAgICAgICAgICAgICAgICAgICAgICByb2xlID0gY29uc3VtZVJvbGUKKyAgICAgICAg
ICAgICAgICAgICAgICAgIGNvbnN1bWUoIjoiKQorICAgICAgICAgICAgICAgICAgICAgICAgdHlw
ZSA9IGNvbnN1bWVUeXBlCisgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAg
ICAgICAgICAgIHNpZ25hdHVyZSA8PCBBcmcubmV3KHJvbGUsIHR5cGUpCisgICAgICAgICAgICAg
ICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrIHVubGVzcyB0b2tlbiA9
PSAiLCIKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN1bWUoIiwiKQorICAgICAgICAgICAg
ICAgICAgICB9CisgICAgICAgICAgICAgICAgZW5kCisKKyAgICAgICAgICAgICAgICBpZiB0b2tl
biA9PSAiLyIKKyAgICAgICAgICAgICAgICAgICAgY29uc3VtZSgiLyIpCisgICAgICAgICAgICAg
ICAgICAgIGNvbnN1bWUoImJyYW5jaCIpCisgICAgICAgICAgICAgICAgICAgIG9wY29kZS5icmFu
Y2ggPSB0cnVlCisgICAgICAgICAgICAgICAgZW5kCisKKyAgICAgICAgICAgICAgICBpZiBpc0tp
bmQodG9rZW4pCisgICAgICAgICAgICAgICAgICAgIGxvb3AgeworICAgICAgICAgICAgICAgICAg
ICAgICAga2luZHMgPSBbXQorICAgICAgICAgICAgICAgICAgICAgICAgYWx0TmFtZSA9IG5pbAor
ICAgICAgICAgICAgICAgICAgICAgICAgbG9vcCB7CisgICAgICAgICAgICAgICAgICAgICAgICAg
ICAga2luZHMgPDwgS2luZC5uZXcoY29uc3VtZUtpbmQpCisKKyAgICAgICAgICAgICAgICAgICAg
ICAgICAgICBpZiB0b2tlbiA9PSAiKiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
cGFyc2VFcnJvcigiQ2FuIG9ubHkgYXBwbHkgKiB0byBUbXAiKSB1bmxlc3Mga2luZHNbLTFdLm5h
bWUgPT0gIlRtcCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2luZHNbLTFdLnNw
ZWNpYWwgPSB0cnVlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN1bWUoIioi
KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuZAorCisgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgYnJlYWsgdW5sZXNzIHRva2VuID09ICIsIgorICAgICAgICAgICAgICAgICAgICAg
ICAgICAgIGNvbnN1bWUoIiwiKQorICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAg
ICAgICAgICAgICAgICAgICBpZiB0b2tlbiA9PSAiYXMiCisgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgY29uc3VtZSgiYXMiKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsdE5hbWUg
PSBjb25zdW1lSWRlbnRpZmllcgorICAgICAgICAgICAgICAgICAgICAgICAgZW5kCisKKyAgICAg
ICAgICAgICAgICAgICAgICAgIHBhcnNlRXJyb3IoIkZvcm0gaGFzIHdyb25nIG51bWJlciBvZiBh
cmd1bWVudHMgZm9yIG92ZXJsb2FkIikgdW5sZXNzIGtpbmRzLmxlbmd0aCA9PSBzaWduYXR1cmUu
bGVuZ3RoCisgICAgICAgICAgICAgICAgICAgICAgICBraW5kcy5lYWNoX3dpdGhfaW5kZXggewor
ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwga2luZCwgaW5kZXggfAorICAgICAgICAgICAg
ICAgICAgICAgICAgICAgIGlmIGtpbmQubmFtZSA9PSAiSW1tIiBvciBraW5kLm5hbWUgPT0gIklt
bTY0IgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiBzaWduYXR1cmVbaW5kZXhd
LnJvbGUgIT0gIlUiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJzZUVy
cm9yKCJGb3JtIGhhcyBhbiBpbW1lZGlhdGUgZm9yIGEgbm9uLXVzZSBhcmd1bWVudCIpCisgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuZAorICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICBpZiBzaWduYXR1cmVbaW5kZXhdLnR5cGUgIT0gIkciCisgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICBwYXJzZUVycm9yKCJGb3JtIGhhcyBhbiBpbW1lZGlhdGUgZm9y
IGEgbm9uLWdlbmVyYWwtcHVycG9zZSBhcmd1bWVudCIpCisgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgIGVuZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuZAorICAgICAgICAg
ICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgZm9ybXMgPDwgRm9ybS5u
ZXcoa2luZHMsIGFsdE5hbWUpCisgICAgICAgICAgICAgICAgICAgICAgICBicmVhayB1bmxlc3Mg
aXNLaW5kKHRva2VuKQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZW5k
CisKKyAgICAgICAgICAgICAgICBpZiBzaWduYXR1cmUubGVuZ3RoID09IDAKKyAgICAgICAgICAg
ICAgICAgICAgcmFpc2UgdW5sZXNzIGZvcm1zLmxlbmd0aCA9PSAwCisgICAgICAgICAgICAgICAg
ICAgIGZvcm1zIDw8IEZvcm0ubmV3KFtdLCBuaWwpCisgICAgICAgICAgICAgICAgZW5kCisKKyAg
ICAgICAgICAgICAgICBvcGNvZGUub3ZlcmxvYWRzIDw8IE92ZXJsb2FkLm5ldyhzaWduYXR1cmUs
IGZvcm1zKQorICAgICAgICAgICAgZW5kCisgICAgICAgIH0KKworICAgICAgICByZXN1bHQKKyAg
ICBlbmQKK2VuZAorCiskZmlsZU5hbWUgPSBBUkdWWzBdCisKK3BhcnNlciA9IFBhcnNlci5uZXco
SU86OnJlYWQoJGZpbGVOYW1lKSwgJGZpbGVOYW1lKQorJG9wY29kZXMgPSBwYXJzZXIucGFyc2UK
KworZGVmIHdyaXRlSChmaWxlbmFtZSkKKyAgICBGaWxlLm9wZW4oIkFpciN7ZmlsZW5hbWV9Lmgi
LCAidyIpIHsKKyAgICAgICAgfCBvdXRwIHwKKyAgICAgICAgCisgICAgICAgIG91dHAucHV0cyAi
Ly8gR2VuZXJhdGVkIGJ5IG9wY29kZV9nZW5lcmF0b3IucmIgZnJvbSAjeyRmaWxlTmFtZX0gLS0g
ZG8gbm90IGVkaXQhIgorICAgICAgICAKKyAgICAgICAgb3V0cC5wdXRzICIjaWZuZGVmIEFpciN7
ZmlsZW5hbWV9X2giCisgICAgICAgIG91dHAucHV0cyAiI2RlZmluZSBBaXIje2ZpbGVuYW1lfV9o
IgorCisgICAgICAgIHlpZWxkIG91dHAKKyAgICAgICAgCisgICAgICAgIG91dHAucHV0cyAiI2Vu
ZGlmIC8vIEFpciN7ZmlsZW5hbWV9X2giCisgICAgfQorZW5kCisKK2RlZiB3cml0ZUNQUChmaWxl
bmFtZSkKKyAgICBGaWxlLm9wZW4oIkFpciN7ZmlsZW5hbWV9LmNwcCIsICJ3IikgeworICAgICAg
ICB8IG91dHAgfAorICAgICAgICAKKyAgICAgICAgb3V0cC5wdXRzICIvLyBHZW5lcmF0ZWQgYnkg
b3Bjb2RlX2dlbmVyYXRvci5yYiBmcm9tICN7JGZpbGVOYW1lfSAtLSBkbyBub3QgZWRpdCEiCisg
ICAgICAgIAorICAgICAgICBvdXRwLnB1dHMgIiNpbmNsdWRlIFwiY29uZmlnLmhcIiIKKyAgICAg
ICAgb3V0cC5wdXRzICIjaW5jbHVkZSBcIkFpciN7ZmlsZW5hbWV9LmhcIiIKKworICAgICAgICB5
aWVsZCBvdXRwCisgICAgfQorZW5kCisKK3dyaXRlSCgiT3Bjb2RlIikgeworICAgIHwgb3V0cCB8
CisgICAgb3V0cC5wdXRzICJuYW1lc3BhY2UgSlNDIHsgbmFtZXNwYWNlIEIzIHsgbmFtZXNwYWNl
IEFpciB7IgorICAgIG91dHAucHV0cyAiZW51bSBPcGNvZGUgOiBpbnQxNl90IHsiCisgICAgJG9w
Y29kZXMua2V5cy5zb3J0LmVhY2ggeworICAgICAgICB8IG9wY29kZSB8CisgICAgICAgIG91dHAu
cHV0cyAiICAgICN7b3Bjb2RlfSwiCisgICAgfQorICAgIG91dHAucHV0cyAifSIKKworICAgIG91
dHAucHV0cyAic3RhdGljIGNvbnN0IHVuc2lnbmVkIG51bU9wY29kZXMgPSAjeyRvcGNvZGVzLmtl
eXMuc2l6ZX07IgorICAgIG91dHAucHV0cyAifSB9IH0gLy8gbmFtZXNwYWNlIEpTQzo6QjM6OkFp
ciIKKyAgICAKKyAgICBvdXRwLnB1dHMgIm5hbWVzcGFjZSBXVEYgeyIKKyAgICBvdXRwLnB1dHMg
ImNsYXNzIFByaW50U3RyZWFtOyIKKyAgICBvdXRwLnB1dHMgInZvaWQgcHJpbnRJbnRlcm5hbChQ
cmludFN0cmVhbSYsIEpTQzo6QjM6OkFpcjo6T3Bjb2RlKTsiCisgICAgb3V0cC5wdXRzICJ9IC8v
IG5hbWVzcGFjZSBXVEYiCit9CisKK3dyaXRlQ1BQKCJPcGNvZGUiKSB7CisgICAgfCBvdXRwIHwK
KyAgICBvdXRwLnB1dHMgIiNpbmNsdWRlIFwid3RmL1ByaW50U3RyZWFtLmhcIiIKKyAgICBvdXRw
LnB1dHMgIm5hbWVzcGFjZSBXVEYgeyIKKyAgICBvdXRwLnB1dHMgInVzaW5nIG5hbWVzcGFjZSBK
U0M6OkIzOjpBaXI7IgorICAgIG91dHAucHV0cyAidm9pZCBwcmludEludGVybmFsKFByaW50U3Ry
ZWFtJiBvdXQsIE9wY29kZSBvcGNvZGUpIgorICAgIG91dHAucHV0cyAieyIKKyAgICBvdXRwLnB1
dHMgIiAgICBzd2l0Y2ggKG9wY29kZSkgeyIKKyAgICAkb3Bjb2Rlcy5rZXlzLmVhY2ggeworICAg
ICAgICB8IG9wY29kZSB8CisgICAgICAgIG91dHAucHV0cyAiICAgIGNhc2UgI3tvcGNvZGV9OiIK
KyAgICAgICAgb3V0cC5wdXRzICIgICAgICAgIG91dC5wcmludChcIiN7b3Bjb2RlfVwiKTsiCisg
ICAgICAgIG91dHAucHV0cyAiICAgICAgICByZXR1cm47IgorICAgIH0KKyAgICBvdXRwLnB1dHMg
IiAgICB9IgorICAgIG91dHAucHV0cyAiICAgIFJFTEVBU0VfQVNTRVJUX05PVF9SRUFDSEVEKCk7
IgorICAgIG91dHAucHV0cyAifSIKKyAgICBvdXRwLnB1dHMgIn0gLy8gbmFtZXNwYWNlIFdURiIK
K30KKworIyBGcm9tIGhlcmUgb24sIHdlIGRvbid0IHRyeSB0byBlbWl0IHByb3Blcmx5IGluZGVu
dGVkIGNvZGUsIHNpbmNlIHdlJ3JlIHVzaW5nIGEgcmVjdXJzaXZlIHBhdHRlcm4KKyMgbWF0Y2hl
ci4KKworZGVmIG1hdGNoRm9ybXMob3V0cCwgc3BlZWQsIGZvcm1zLCBjb2x1bW5JbmRleCwgY29s
dW1uR2V0dGVyLCBmaWx0ZXIsIGNhbGxiYWNrKQorICAgIHJldHVybiBpZiBmb3Jtcy5sZW5ndGgg
PT0gMAorCisgICAgaWYgZmlsdGVyW2Zvcm1zXQorICAgICAgICByZXR1cm4KKyAgICBlbmQKKwor
ICAgIGlmIGNvbHVtbkluZGV4ID49IGZvcm1zWzBdLmtpbmRzLmxlbmd0aAorICAgICAgICByYWlz
ZSB1bmxlc3MgZm9ybXMubGVuZ3RoID09IDEKKyAgICAgICAgY2FsbGJhY2tbZm9ybXNbMF1dCisg
ICAgICAgIHJldHVybgorICAgIGVuZAorICAgIAorICAgIGdyb3VwcyA9IHt9CisgICAgZm9ybXMu
ZWFjaCB7CisgICAgICAgIHwgZm9ybSB8CisgICAgICAgIGtpbmQgPSBmb3JtLmtpbmRzW2NvbHVt
bkluZGV4XS5uYW1lCisgICAgICAgIGlmIGdyb3Vwc1traW5kXQorICAgICAgICAgICAgZ3JvdXBz
W2tpbmRdIDw8IGZvcm0KKyAgICAgICAgZWxzZQorICAgICAgICAgICAgZ3JvdXBzW2tpbmRdID0g
W2Zvcm1dCisgICAgICAgIGVuZAorICAgIH0KKworICAgIGlmIHNwZWVkID09IDpmYXN0IGFuZCBn
cm91cHMubGVuZ3RoID09IDEKKyAgICAgICAgbWF0Y2hGb3JtcyhvdXRwLCBzcGVlZCwgZm9ybXMs
IGNvbHVtbkluZGV4ICsgMSwgY29sdW1uR2V0dGVyLCBmaWx0ZXIsIGNhbGxiYWNrKQorICAgICAg
ICByZXR1cm4KKyAgICBlbmQKKworICAgIG91dHAucHV0cyAic3dpdGNoICgje2NvbHVtbkdldHRl
cltjb2x1bW5JbmRleF19KSB7IgorICAgIGdyb3Vwcy5lYWNoX3BhaXIgeworICAgICAgICB8IGtl
eSwgdmFsdWUgfAorICAgICAgICBvdXRwLnB1dHMgIiNpZiBVU0UoSlNWQUxVRTY0KSIgaWYga2V5
ID09ICJJbW02NCIKKyAgICAgICAgS2luZC5hcmdLaW5kcyhrZXkpLmVhY2ggeworICAgICAgICAg
ICAgfCBhcmdLaW5kIHwKKyAgICAgICAgICAgIG91dHAucHV0cyAiY2FzZSBBcmc6OiN7YXJnS2lu
ZH06IgorICAgICAgICB9CisgICAgICAgIG1hdGNoRm9ybXMob3V0cCwgc3BlZWQsIHZhbHVlLCBj
b2x1bW5JbmRleCArIDEsIGNvbHVtbkdldHRlciwgZmlsdGVyLCBjYWxsYmFjaykKKyAgICAgICAg
b3V0cC5wdXRzICJicmVhazsiCisgICAgICAgIG91dHAucHV0cyAiI2VuZGlmIC8vIFVTRShKU1ZB
TFVFNjQpIiBpZiBrZXkgPT0gIkltbTY0IgorICAgIH0KKyAgICBvdXRwLnB1dHMgImRlZmF1bHQ6
IgorICAgIG91dHAucHV0cyAiYnJlYWs7IgorICAgIG91dHAucHV0cyAifSIKK2VuZAorCitkZWYg
bWF0Y2hJbnN0T3ZlcmxvYWQob3V0cCwgc3BlZWQsIGluc3QpCisgICAgb3V0cC5wdXRzICJzd2l0
Y2ggKCN7aW5zdH0tPm9wY29kZSkgeyIKKyAgICAkb3Bjb2Rlcy52YWx1ZXMuZWFjaCB7CisgICAg
ICAgIHwgb3Bjb2RlIHwKKyAgICAgICAgb3V0cC5wdXRzICJjYXNlICN7b3Bjb2RlLm5hbWV9OiIK
KyAgICAgICAgaWYgb3Bjb2RlLnNwZWNpYWwKKyAgICAgICAgICAgIHlpZWxkIG9wY29kZSwgbmls
CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIG5lZWRPdmVybG9hZFN3aXRjaCA9ICgob3Bjb2Rl
Lm92ZXJsb2Fkcy5zaXplICE9IDEpIG9yIHNwZWVkID09IDpzYWZlKQorICAgICAgICAgICAgb3V0
cC5wdXRzICJzd2l0Y2ggKCN7aW5zdH0tPmFyZ3Muc2l6ZSgpKSB7IiBpZiBuZWVkT3ZlcmxvYWRT
d2l0Y2gKKyAgICAgICAgICAgIG9wY29kZS5vdmVybG9hZHMuZWFjaCB7CisgICAgICAgICAgICAg
ICAgfCBvdmVybG9hZCB8CisgICAgICAgICAgICAgICAgb3V0cC5wdXRzICJjYXNlICN7b3Zlcmxv
YWQuc2lnbmF0dXJlLmxlbmd0aH06IiBpZiBuZWVkT3ZlcmxvYWRTd2l0Y2gKKyAgICAgICAgICAg
ICAgICB5aWVsZCBvcGNvZGUsIG92ZXJsb2FkCisgICAgICAgICAgICAgICAgb3V0cC5wdXRzICJi
cmVhazsiIGlmIG5lZWRPdmVybG9hZFN3aXRjaAorICAgICAgICAgICAgfQorICAgICAgICAgICAg
aWYgbmVlZE92ZXJsb2FkU3dpdGNoCisgICAgICAgICAgICAgICAgb3V0cC5wdXRzICJkZWZhdWx0
OiIKKyAgICAgICAgICAgICAgICBvdXRwLnB1dHMgImJyZWFrOyIKKyAgICAgICAgICAgICAgICBv
dXRwLnB1dHMgIn0iCisgICAgICAgICAgICBlbmQKKyAgICAgICAgZW5kCisgICAgICAgIG91dHAu
cHV0cyAiYnJlYWs7IgorICAgIH0KKyAgICBvdXRwLnB1dHMgImRlZmF1bHQ6IgorICAgIG91dHAu
cHV0cyAiYnJlYWs7IgorICAgIG91dHAucHV0cyAifSIKK2VuZAorICAgIAorZGVmIG1hdGNoSW5z
dE92ZXJsb2FkRm9ybShvdXRwLCBzcGVlZCwgaW5zdCkKKyAgICBtYXRjaEluc3RPdmVybG9hZChv
dXRwLCBzcGVlZCwgaW5zdCkgeworICAgICAgICB8IG9wY29kZSwgb3ZlcmxvYWQgfAorICAgICAg
ICBpZiBvcGNvZGUuc3BlY2lhbAorICAgICAgICAgICAgeWllbGQgb3Bjb2RlLCBuaWwsIG5pbAor
ICAgICAgICBlbHNlCisgICAgICAgICAgICBjb2x1bW5HZXR0ZXIgPSBwcm9jIHsKKyAgICAgICAg
ICAgICAgICB8IGNvbHVtbkluZGV4IHwKKyAgICAgICAgICAgICAgICAiI3tpbnN0fS0+YXJnc1sj
e2NvbHVtbkluZGV4fV0ua2luZCgpIgorICAgICAgICAgICAgfQorICAgICAgICAgICAgZmlsdGVy
ID0gcHJvYyB7IGZhbHNlIH0KKyAgICAgICAgICAgIGNhbGxiYWNrID0gcHJvYyB7CisgICAgICAg
ICAgICAgICAgfCBmb3JtIHwKKyAgICAgICAgICAgICAgICB5aWVsZCBvcGNvZGUsIG92ZXJsb2Fk
LCBmb3JtCisgICAgICAgICAgICB9CisgICAgICAgICAgICBtYXRjaEZvcm1zKG91dHAsIHNwZWVk
LCBvdmVybG9hZC5mb3JtcywgMCwgY29sdW1uR2V0dGVyLCBmaWx0ZXIsIGNhbGxiYWNrKQorICAg
ICAgICBlbmQKKyAgICB9CitlbmQKKword3JpdGVIKCJPcGNvZGVVdGlscyIpIHsKKyAgICB8IG91
dHAgfAorICAgIG91dHAucHV0cyAiI2luY2x1ZGUgXCJBaXJJbnN0LmhcIiIKKyAgICBvdXRwLnB1
dHMgIm5hbWVzcGFjZSBKU0MgeyBuYW1lc3BhY2UgQjMgeyBuYW1lc3BhY2UgQWlyIHsiCisgICAg
CisgICAgb3V0cC5wdXRzICJpbmxpbmUgYm9vbCBvcGdlbkhpZGRlblRydXRoKCkgeyByZXR1cm4g
dHJ1ZTsgfSIKKyAgICBvdXRwLnB1dHMgIiNkZWZpbmUgT1BHRU5fUkVUVVJOKHZhbHVlKSBkbyB7
XFwiCisgICAgb3V0cC5wdXRzICIgICAgaWYgKG9wZ2VuSGlkZGVuVHJ1dGgoKSlcXCIKKyAgICBv
dXRwLnB1dHMgIiAgICAgICAgcmV0dXJuIHZhbHVlO1xcIgorICAgIG91dHAucHV0cyAifSIKKwor
ICAgIG91dHAucHV0cyAidGVtcGxhdGU8dHlwZW5hbWUgRnVuY3Rvcj4iCisgICAgb3V0cC5wdXRz
ICJ2b2lkIEluc3Q6OmZvckVhY2hBcmcoY29uc3QgRnVuY3RvciYgZnVuY3RvcikiCisgICAgb3V0
cC5wdXRzICJ7IgorICAgIG1hdGNoSW5zdE92ZXJsb2FkKG91dHAsIDpmYXN0LCAidGhpcyIpIHsK
KyAgICAgICAgfCBvcGNvZGUsIG92ZXJsb2FkIHwKKyAgICAgICAgaWYgb3Bjb2RlLnNwZWNpYWwK
KyAgICAgICAgICAgIG91dHAucHV0cyAiZnVuY3RvcihhcmdzWzBdLCBBcmc6OlVzZSwgQXJnOjpH
UCk7IC8vIFRoaXMgaXMgYmFzaWNhbGx5IGJvZ3VzLCBidXQgaXQgd29ya3MgZiBhbmFseXNlcyBt
b2RlbCBTcGVjaWFsIGFzIGFuIGltbWVkaWF0ZS4iCisgICAgICAgICAgICBvdXRwLnB1dHMgImFy
Z3NbMF0uc3BlY2lhbCgpLT5mb3JFYWNoQXJnKCp0aGlzLCBzY29wZWRMYW1iZGE8RWFjaEFyZ0Nh
bGxiYWNrPihmdW5jdG9yKSk7IgorICAgICAgICBlbHNlCisgICAgICAgICAgICBvdmVybG9hZC5z
aWduYXR1cmUuZWFjaF93aXRoX2luZGV4IHsKKyAgICAgICAgICAgICAgICB8IGFyZywgaW5kZXgg
fAorICAgICAgICAgICAgICAgIHJvbGUgPSBuaWwKKyAgICAgICAgICAgICAgICBjYXNlIGFyZy5y
b2xlCisgICAgICAgICAgICAgICAgd2hlbiAiVSIKKyAgICAgICAgICAgICAgICAgICAgcm9sZSA9
ICJVc2UiCisgICAgICAgICAgICAgICAgd2hlbiAiRCIKKyAgICAgICAgICAgICAgICAgICAgcm9s
ZSA9ICJEZWYiCisgICAgICAgICAgICAgICAgd2hlbiAiVUQiCisgICAgICAgICAgICAgICAgICAg
IHJvbGUgPSAiVXNlRGVmIgorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAg
ICAgcmFpc2UKKyAgICAgICAgICAgICAgICBlbmQKKyAgICAgICAgICAgICAgICAKKyAgICAgICAg
ICAgICAgICBvdXRwLnB1dHMgImZ1bmN0b3IoYXJnc1sje2luZGV4fV0sIEFyZzo6I3tyb2xlfSwg
QXJnOjoje2FyZy50eXBlfVApOyIKKyAgICAgICAgICAgIH0KKyAgICAgICAgZW5kCisgICAgfQor
ICAgIG91dHAucHV0cyAifSIKKworICAgICRvcGNvZGVzLnZhbHVlcy5lYWNoIHsKKyAgICAgICAg
fCBvcGNvZGUgfAorICAgICAgICB1bmxlc3Mgb3Bjb2RlLnNwZWNpYWwKKyAgICAgICAgICAgIG9w
Y29kZS5vdmVybG9hZHMuZWFjaCB7CisgICAgICAgICAgICAgICAgfCBvdmVybG9hZCB8CisgICAg
ICAgICAgICAgICAgb3V0cC5wcmludCAiQUxXQVlTX0lOTElORSBib29sIGlzVmFsaWQje29wY29k
ZS5uYW1lfUZvcm0oIgorICAgICAgICAgICAgICAgIG92ZXJsb2FkLnNpZ25hdHVyZS5sZW5ndGgu
dGltZXMgeworICAgICAgICAgICAgICAgICAgICB8IGluZGV4IHwKKyAgICAgICAgICAgICAgICAg
ICAgaWYgaW5kZXggIT0gMAorICAgICAgICAgICAgICAgICAgICAgICAgb3V0cC5wcmludCAiLCAi
CisgICAgICAgICAgICAgICAgICAgIGVuZAorICAgICAgICAgICAgICAgICAgICBvdXRwLnByaW50
ICJBcmc6OktpbmQga2luZCN7aW5kZXh9IgorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAg
ICAgICBvdXRwLnB1dHMgIikiCisgICAgICAgICAgICAgICAgb3V0cC5wdXRzICJ7IgorICAgICAg
ICAgICAgICAgIGNvbHVtbkdldHRlciA9IHByb2MgeyB8IGNvbHVtbkluZGV4IHwgImtpbmQje2Nv
bHVtbkluZGV4fSIgfQorICAgICAgICAgICAgICAgIGZpbHRlciA9IHByb2MgeyBmYWxzZSB9Cisg
ICAgICAgICAgICAgICAgY2FsbGJhY2sgPSBwcm9jIHsKKyAgICAgICAgICAgICAgICAgICAgfCBm
b3JtIHwKKyAgICAgICAgICAgICAgICAgICAgc3BlY2lhbCA9IChub3QgZm9ybS5raW5kcy5kZXRl
Y3QgeyB8IGtpbmQgfCBraW5kLnNwZWNpYWwgfSkKKyAgICAgICAgICAgICAgICAgICAgb3V0cC5w
dXRzICJPUEdFTl9SRVRVUk4oI3tzcGVjaWFsfSk7IgorICAgICAgICAgICAgICAgIH0KKyAgICAg
ICAgICAgICAgICBtYXRjaEZvcm1zKG91dHAsIDpzYWZlLCBvdmVybG9hZC5mb3JtcywgMCwgY29s
dW1uR2V0dGVyLCBmaWx0ZXIsIGNhbGxiYWNrKQorICAgICAgICAgICAgICAgIG91dHAucHV0cyAi
cmV0dXJuIGZhbHNlOyIKKyAgICAgICAgICAgICAgICBvdXRwLnB1dHMgIn0iCisgICAgICAgICAg
ICB9CisgICAgICAgIGVuZAorICAgIH0KKworICAgIG91dHAucHV0cyAidGVtcGxhdGU8dHlwZW5h
bWUuLi4gQXJndW1lbnRzPiIKKyAgICBvdXRwLnB1dHMgIkFMV0FZU19JTkxJTkUgYm9vbCBpc1Zh
bGlkRm9ybShPcGNvZGUgb3Bjb2RlLCBBcmd1bWVudHMuLi4gYXJndW1lbnRzKSIKKyAgICBvdXRw
LnB1dHMgInsiCisgICAgb3V0cC5wdXRzICJBcmc6OktpbmQga2luZHNbc2l6ZW9mLi4uKEFyZ3Vt
ZW50cyldID0geyBhcmd1bWVudHMuLi4gfTsiCisgICAgb3V0cC5wdXRzICJzd2l0Y2ggKG9wY29k
ZSkgeyIKKyAgICAkb3Bjb2Rlcy52YWx1ZXMuZWFjaCB7CisgICAgICAgIHwgb3Bjb2RlIHwKKyAg
ICAgICAgb3V0cC5wdXRzICJjYXNlICN7b3Bjb2RlLm5hbWV9OiIKKyAgICAgICAgb3V0cC5wdXRz
ICJzd2l0Y2ggKHNpemVvZi4uLihBcmd1bWVudHMpKSB7IgorICAgICAgICB1bmxlc3Mgb3Bjb2Rl
LnNwZWNpYWwKKyAgICAgICAgICAgIG9wY29kZS5vdmVybG9hZHMuZWFjaCB7CisgICAgICAgICAg
ICAgICAgfCBvdmVybG9hZCB8CisgICAgICAgICAgICAgICAgb3V0cC5wdXRzICJjYXNlICN7b3Zl
cmxvYWQuc2lnbmF0dXJlLmxlbmd0aH06IgorICAgICAgICAgICAgICAgIGNvbHVtbkdldHRlciA9
IHByb2MgeyB8IGNvbHVtbkluZGV4IHwgImtpbmRzWyN7Y29sdW1uSW5kZXh9XSIgfQorICAgICAg
ICAgICAgICAgIGZpbHRlciA9IHByb2MgeyBmYWxzZSB9CisgICAgICAgICAgICAgICAgY2FsbGJh
Y2sgPSBwcm9jIHsKKyAgICAgICAgICAgICAgICAgICAgfCBmb3JtIHwKKyAgICAgICAgICAgICAg
ICAgICAgc3BlY2lhbCA9IChub3QgZm9ybS5raW5kcy5kZXRlY3QgeyB8IGtpbmQgfCBraW5kLnNw
ZWNpYWwgfSkKKyAgICAgICAgICAgICAgICAgICAgb3V0cC5wdXRzICJPUEdFTl9SRVRVUk4oI3tz
cGVjaWFsfSk7IgorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBtYXRjaEZvcm1z
KG91dHAsIDpzYWZlLCBvdmVybG9hZC5mb3JtcywgMCwgY29sdW1uR2V0dGVyLCBmaWx0ZXIsIGNh
bGxiYWNrKQorICAgICAgICAgICAgICAgIG91dHAucHV0cyAiYnJlYWs7IgorICAgICAgICAgICAg
fQorICAgICAgICBlbmQKKyAgICAgICAgb3V0cC5wdXRzICJkZWZhdWx0OiIKKyAgICAgICAgb3V0
cC5wdXRzICJicmVhazsiCisgICAgICAgIG91dHAucHV0cyAifSIKKyAgICAgICAgb3V0cC5wdXRz
ICJicmVhazsiCisgICAgfQorICAgIG91dHAucHV0cyAiZGVmYXVsdDoiCisgICAgb3V0cC5wdXRz
ICJicmVhazsiCisgICAgb3V0cC5wdXRzICJ9IgorICAgIG91dHAucHV0cyAicmV0dXJuIGZhbHNl
OyAiCisgICAgb3V0cC5wdXRzICJ9IgorICAgIAorICAgIG91dHAucHV0cyAifSB9IH0gLy8gbmFt
ZXNwYWNlIEpTQzo6QjM6OkFpciIKK30KKword3JpdGVDUFAoIk9wY29kZVV0aWxzIikgeworICAg
IHwgb3V0cCB8CisgICAgb3V0cC5wdXRzICIjaW5jbHVkZSBcIkFpckluc3RJbmxpbmVzLmhcIiIK
KyAgICBvdXRwLnB1dHMgIm5hbWVzcGFjZSBKU0MgeyBuYW1lc3BhY2UgQjMgeyBuYW1lc3BhY2Ug
QWlyIHsiCisgICAgb3V0cC5wdXRzICJib29sIEluc3Q6OmlzVmFsaWRGb3JtKCkiCisgICAgb3V0
cC5wdXRzICJ7IgorICAgIG1hdGNoSW5zdE92ZXJsb2FkRm9ybShvdXRwLCA6c2FmZSwgInRoaXMi
KSB7CisgICAgICAgIHwgb3Bjb2RlLCBvdmVybG9hZCwgZm9ybSB8CisgICAgICAgIGlmIG9wY29k
ZS5zcGVjaWFsCisgICAgICAgICAgICBvdXRwLnB1dHMgImlmIChhcmdzLnNpemUoKSA8IDEpIgor
ICAgICAgICAgICAgb3V0cC5wdXRzICJyZXR1cm4gZmFsc2U7IgorICAgICAgICAgICAgb3V0cC5w
dXRzICJpZiAoIWFyZ3NbMF0uaXNTcGVjaWFsKCkpIgorICAgICAgICAgICAgb3V0cC5wdXRzICJy
ZXR1cm4gZmFsc2U7IgorICAgICAgICAgICAgb3V0cC5wdXRzICJPUEdFTl9SRVRVUk4oYXJnc1sw
XS5zcGVjaWFsKCktPmlzVmFsaWQoKnRoaXMpKTsiCisgICAgICAgIGVsc2UKKyAgICAgICAgICAg
IG5lZWRzTW9yZVZhbGlkYXRpb24gPSBmYWxzZQorICAgICAgICAgICAgb3ZlcmxvYWQuc2lnbmF0
dXJlLmxlbmd0aC50aW1lcyB7CisgICAgICAgICAgICAgICAgfCBpbmRleCB8CisgICAgICAgICAg
ICAgICAgcm9sZSA9IG92ZXJsb2FkLnNpZ25hdHVyZVtpbmRleF0ucm9sZQorICAgICAgICAgICAg
ICAgIHR5cGUgPSBvdmVybG9hZC5zaWduYXR1cmVbaW5kZXhdLnR5cGUKKyAgICAgICAgICAgICAg
ICBraW5kID0gZm9ybS5raW5kc1tpbmRleF0KKyAgICAgICAgICAgICAgICBuZWVkc01vcmVWYWxp
ZGF0aW9uIHw9IGtpbmQuc3BlY2lhbAorICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAg
ICMgV2UgYWxyZWFkeSBrbm93IHRoYXQgdGhlIGZvcm0gbWF0Y2hlcy4gV2UgZG9uJ3QgaGF2ZSB0
byB2YWxpZGF0ZSB0aGUgcm9sZSwgc2luY2UKKyAgICAgICAgICAgICAgICAjIGtpbmQgaW1wbGll
cyByb2xlLiBTbywgdGhlIG9ubHkgdGhpbmcgbGVmdCB0byB2YWxpZGF0ZSBpcyB0aGUgdHlwZS4g
QW5kIHdlIG9ubHkgaGF2ZQorICAgICAgICAgICAgICAgICMgdG8gdmFsaWRhdGUgdGhlIHR5cGUg
aWYgd2UgaGF2ZSBhIFRtcC4KKyAgICAgICAgICAgICAgICBpZiBraW5kLm5hbWUgPT0gIlRtcCIK
KyAgICAgICAgICAgICAgICAgICAgb3V0cC5wdXRzICJpZiAoIWFyZ3NbI3tpbmRleH1dLnRtcCgp
LmlzI3t0eXBlfVAoKSkiCisgICAgICAgICAgICAgICAgICAgIG91dHAucHV0cyAiT1BHRU5fUkVU
VVJOKGZhbHNlKTsiCisgICAgICAgICAgICAgICAgZW5kCisgICAgICAgICAgICB9CisgICAgICAg
ICAgICBpZiBuZWVkc01vcmVWYWxpZGF0aW9uCisgICAgICAgICAgICAgICAgb3V0cC5wdXRzICJp
ZiAoIWlzI3tvcGNvZGUubmFtZX1WYWxpZCh0aGlzKSkiCisgICAgICAgICAgICAgICAgb3V0cC5w
dXRzICJPUEdFTl9SRVRVUk4oZmFsc2UpOyIKKyAgICAgICAgICAgIGVuZAorICAgICAgICAgICAg
b3V0cC5wdXRzICJPUEdFTl9SRVRVUk4odHJ1ZSk7IgorICAgICAgICBlbmQKKyAgICB9CisgICAg
b3V0cC5wdXRzICJyZXR1cm4gZmFsc2U7IgorICAgIG91dHAucHV0cyAifSIKKworICAgIG91dHAu
cHV0cyAiYm9vbCBJbnN0OjphZG1pdHNTdGFjayh1bnNpZ25lZCBhcmdJbmRleCkiCisgICAgb3V0
cC5wdXRzICJ7IgorICAgIG91dHAucHV0cyAic3dpdGNoIChvcGNvZGUpIHsiCisgICAgJG9wY29k
ZXMudmFsdWVzLmVhY2ggeworICAgICAgICB8IG9wY29kZSB8CisgICAgICAgIG91dHAucHV0cyAi
Y2FzZSAje29wY29kZS5uYW1lfToiCisKKyAgICAgICAgaWYgb3Bjb2RlLnNwZWNpYWwKKyAgICAg
ICAgICAgIG91dHAucHV0cyAiaWYgKCFhcmdJbmRleCkiCisgICAgICAgICAgICBvdXRwLnB1dHMg
InJldHVybiBmYWxzZTsiCisgICAgICAgICAgICBvdXRwLnB1dHMgIk9QR0VOX1JFVFVSTihhcmdz
WzBdLnNwZWNpYWwoKS0+YWRtaXRzU3RhY2soKnRoaXMsIGFyZ0luc3QpKTsiCisgICAgICAgIGVs
c2UKKyAgICAgICAgICAgICMgU3dpdGNoIG9uIHRoZSBhcmdJbmRleC4KKyAgICAgICAgICAgIG91
dHAucHV0cyAic3dpdGNoIChhcmdJbmRleCkgeyIKKworICAgICAgICAgICAgbnVtQXJncyA9IG9w
Y29kZS5vdmVybG9hZHMubWFwIHsKKyAgICAgICAgICAgICAgICB8IG92ZXJsb2FkIHwKKyAgICAg
ICAgICAgICAgICBvdmVybG9hZC5zaWduYXR1cmUubGVuZ3RoCisgICAgICAgICAgICB9Lm1heAor
ICAgICAgICAgICAgCisgICAgICAgICAgICBudW1BcmdzLnRpbWVzIHsKKyAgICAgICAgICAgICAg
ICB8IGFyZ0luZGV4IHwKKyAgICAgICAgICAgICAgICBvdXRwLnB1dHMgImNhc2UgI3thcmdJbmRl
eH06IgorCisgICAgICAgICAgICAgICAgIyBDaGVjayBpZiBhbGwgb2YgdGhlIGZvcm1zIG9mIGFs
bCBvZiB0aGUgb3ZlcmxvYWRzIGVpdGhlciBkbywgb3IgZG9uJ3QsIGFkbWl0IGFuIGFkZHJlc3MK
KyAgICAgICAgICAgICAgICAjIGF0IHRoaXMgaW5kZXguIFdlIGV4cGVjdCB0aGlzIHRvIGJlIGEg
dmVyeSBjb21tb24gY2FzZS4KKyAgICAgICAgICAgICAgICBudW1ZZXMgPSAwCisgICAgICAgICAg
ICAgICAgbnVtTm8gPSAwCisgICAgICAgICAgICAgICAgb3Bjb2RlLm92ZXJsb2Fkcy5lYWNoIHsK
KyAgICAgICAgICAgICAgICAgICAgfCBvdmVybG9hZCB8CisgICAgICAgICAgICAgICAgICAgIG92
ZXJsb2FkLmZvcm1zLmVhY2ggeworICAgICAgICAgICAgICAgICAgICAgICAgfCBmb3JtIHwKKyAg
ICAgICAgICAgICAgICAgICAgICAgIGlmIGZvcm0ua2luZHNbYXJnSW5kZXhdID09ICJBZGRyIgor
ICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bVllcyArPSAxCisgICAgICAgICAgICAgICAg
ICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtTm8gKz0gMQorICAg
ICAgICAgICAgICAgICAgICAgICAgZW5kCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAg
ICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAjIE5vdGUgdGhhdCB3ZSBkZWxpYmVyYXRlbHkg
dGVzdCBudW1ZZXMgZmlyc3QgYmVjYXVzZSBpZiB3ZSBlbmQgdXAgd2l0aCBubyBmb3Jtcywgd2Ug
d2FudAorICAgICAgICAgICAgICAgICMgdG8gc2F5IHRoYXQgQWRkcmVzcyBpcyBpbmFkbWlzc2li
bGUuCisgICAgICAgICAgICAgICAgaWYgbnVtWWVzID09IDAKKyAgICAgICAgICAgICAgICAgICAg
b3V0cC5wdXRzICJPUEdFTl9SRVRVUk4oZmFsc2UpOyIKKyAgICAgICAgICAgICAgICBlbHNpZiBu
dW1ObyA9PSAwCisgICAgICAgICAgICAgICAgICAgIG91dHAucHV0cyAiT1BHRU5fUkVUVVJOKHRy
dWUpOyIKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICMgTm93IGRv
IHRoZSBmdWxsIHRlc3QuCisKKyAgICAgICAgICAgICAgICAgICAgbmVlZE92ZXJsb2FkU3dpdGNo
ID0gKG9wY29kZS5vdmVybG9hZHMuc2l6ZSAhPSAxKQorCisgICAgICAgICAgICAgICAgICAgIG91
dHAucHV0cyAic3dpdGNoIChhcmdzLnNpemUoKSkgeyIgaWYgbmVlZE92ZXJsb2FkU3dpdGNoCisg
ICAgICAgICAgICAgICAgICAgIG9wY29kZS5vdmVybG9hZHMuZWFjaCB7CisgICAgICAgICAgICAg
ICAgICAgICAgICB8IG92ZXJsb2FkIHwKKworICAgICAgICAgICAgICAgICAgICAgICAgIyBBZ2Fp
biwgY2hlY2sgaWYgYWxsIG9mIHRoZW0gZG8gd2hhdCB3ZSB3YW50LgorICAgICAgICAgICAgICAg
ICAgICAgICAgbnVtWWVzID0gMAorICAgICAgICAgICAgICAgICAgICAgICAgbnVtTm8gPSAwCisg
ICAgICAgICAgICAgICAgICAgICAgICBvdmVybG9hZC5mb3Jtcy5lYWNoIHsKKyAgICAgICAgICAg
ICAgICAgICAgICAgICAgICB8IGZvcm0gfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlm
IGZvcm0ua2luZHNbYXJnSW5kZXhdID09ICJBZGRyIgorICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICBudW1ZZXMgKz0gMQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtTm8gKz0gMQorICAgICAgICAgICAgICAg
ICAgICAgICAgICAgIGVuZAorICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAg
ICAgICAgICAgICAgICBpZiBudW1ZZXMgPT0gMAorICAgICAgICAgICAgICAgICAgICAgICAgIyBE
b24ndCBlbWl0IGFueXRoaW5nLCBqdXN0IGRyb3AgdG8gZGVmYXVsdC4KKyAgICAgICAgICAgICAg
ICAgICAgICAgIGVsc2lmIG51bU5vID09IDAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBv
dXRwLnB1dHMgImNhc2UgI3tvdmVybG9hZC5zaWduYXR1cmUubGVuZ3RofToiIGlmIG5lZWRPdmVy
bG9hZFN3aXRjaAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHAucHV0cyAiT1BHRU5f
UkVUVVJOKHRydWUpOyIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwLnB1dHMgImJy
ZWFrOyIgaWYgbmVlZE92ZXJsb2FkU3dpdGNoCisgICAgICAgICAgICAgICAgICAgICAgICBlbHNl
CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cC5wdXRzICJjYXNlICN7b3ZlcmxvYWQu
c2lnbmF0dXJlLmxlbmd0aH06IiBpZiBuZWVkT3ZlcmxvYWRTd2l0Y2gKKworICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICMgVGhpcyBpcyBob3cgd2UgdGVzdCB0aGUgaHlwb3RoZXNpcyB0aGF0
IGNoYW5naW5nIHRoaXMgYXJndW1lbnQgdG8gYW4KKyAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAjIGFkZHJlc3MgeWllbGRzIGEgdmFsaWQgZm9ybS4KKyAgICAgICAgICAgICAgICAgICAgICAg
ICAgICBjb2x1bW5HZXR0ZXIgPSBwcm9jIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgfCBjb2x1bW5JbmRleCB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIGNv
bHVtbkluZGV4ID09IGFyZ0luZGV4CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAiQXJnOjpBZGRyIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYXJnc1sje2NvbHVtbkluZGV4fV0ua2lu
ZCgpIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmQKKyAgICAgICAgICAgICAg
ICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyID0gcHJv
YyB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgZm9ybXMgfAorICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICBudW1ZZXMgPSAwCisKKyAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgZm9ybXMuZWFjaCB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICB8IGZvcm0gfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgZm9y
bS5raW5kc1thcmdJbmRleF0gPT0gIkFkZHIiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgbnVtWWVzICs9IDEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgIGVuZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgaWYgbnVtWWVzID09IDAKKyAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICMgRHJvcCBkb3duLCBlbWl0IG5vIGNvZGUsIHNpbmNlIHdlIGNhbm5v
dCBtYXRjaC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRydWUKKyAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgIyBLZWVwIGdvaW5nLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgZmFsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5kCisgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxi
YWNrID0gcHJvYyB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHAucHV0cyAi
T1BHRU5fUkVUVVJOKHRydWUpOyIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgbWF0Y2hGb3JtcyhvdXRwLCA6c2FmZSwgb3ZlcmxvYWQu
Zm9ybXMsIDAsIGNvbHVtbkdldHRlciwgZmlsdGVyLCBjYWxsYmFjaykKKworICAgICAgICAgICAg
ICAgICAgICAgICAgICAgIG91dHAucHV0cyAiYnJlYWs7IiBpZiBuZWVkT3ZlcmxvYWRTd2l0Y2gK
KyAgICAgICAgICAgICAgICAgICAgICAgIGVuZAorICAgICAgICAgICAgICAgICAgICB9CisgICAg
ICAgICAgICAgICAgICAgIGlmIG5lZWRPdmVybG9hZFN3aXRjaAorICAgICAgICAgICAgICAgICAg
ICAgICAgb3V0cC5wdXRzICJkZWZhdWx0OiIKKyAgICAgICAgICAgICAgICAgICAgICAgIG91dHAu
cHV0cyAiYnJlYWs7IgorICAgICAgICAgICAgICAgICAgICAgICAgb3V0cC5wdXRzICJ9IgorICAg
ICAgICAgICAgICAgICAgICBlbmQKKyAgICAgICAgICAgICAgICBlbmQKKyAgICAgICAgICAgICAg
ICAKKyAgICAgICAgICAgICAgICBvdXRwLnB1dHMgImJyZWFrOyIKKyAgICAgICAgICAgIH0KKyAg
ICAgICAgICAgIAorICAgICAgICAgICAgb3V0cC5wdXRzICJkZWZhdWx0OiIKKyAgICAgICAgICAg
IG91dHAucHV0cyAiYnJlYWs7IgorICAgICAgICAgICAgb3V0cC5wdXRzICJ9IgorICAgICAgICBl
bmQKKyAgICAgICAgCisgICAgICAgIG91dHAucHV0cyAiYnJlYWs7IgorICAgIH0KKyAgICBvdXRw
LnB1dHMgImRlZmF1bHQ6IjsKKyAgICBvdXRwLnB1dHMgImJyZWFrOyIKKyAgICBvdXRwLnB1dHMg
In0iCisgICAgb3V0cC5wdXRzICJyZXR1cm4gZmFsc2U7IgorICAgIG91dHAucHV0cyAifSIKKwor
ICAgIG91dHAucHV0cyAiQ0NhbGxIZWxwZXJzOjpKdW1wIEluc3Q6OmdlbmVyYXRlKENDYWxsSGVs
cGVycyYgaml0LCBHZW5lcmF0aW9uQ29udGV4dCYgY29udGV4dCkgY29uc3QiCisgICAgb3V0cC5w
dXRzICJ7IgorICAgIG91dHAucHV0cyAiVU5VU0VEX1BBUkFNKGppdCk7IgorICAgIG91dHAucHV0
cyAiVU5VU0VEX1BBUkFNKGNvbnRleHQpOyIKKyAgICBvdXRwLnB1dHMgIkNDYWxsSGVscGVyczo6
SnVtcCByZXN1bHQ7IgorICAgIG1hdGNoSW5zdE92ZXJsb2FkRm9ybShvdXRwLCA6ZmFzdCwgInRo
aXMiKSB7CisgICAgICAgIHwgb3Bjb2RlLCBvdmVybG9hZCwgZm9ybSB8CisgICAgICAgIGlmIG9w
Y29kZS5zcGVjaWFsCisgICAgICAgICAgICBvdXRwLnB1dHMgIk9QR0VOX1JFVFVSTihhcmdzWzBd
LnNwZWNpYWwoKS0+Z2VuZXJhdGUoKnRoaXMsIGppdCwgY29udGV4dCkpOyIKKyAgICAgICAgZWxz
ZQorICAgICAgICAgICAgaWYgZm9ybS5hbHROYW1lCisgICAgICAgICAgICAgICAgbWV0aG9kTmFt
ZSA9IGZvcm0uYWx0TmFtZQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIG1ldGhv
ZE5hbWUgPSBvcGNvZGUubWFzbU5hbWUKKyAgICAgICAgICAgIGVuZAorICAgICAgICAgICAgaWYg
b3Bjb2RlLmJyYW5jaAorICAgICAgICAgICAgICAgIG91dHAucHJpbnQgInJlc3VsdCA9ICIKKyAg
ICAgICAgICAgIGVuZAorICAgICAgICAgICAgb3V0cC5wcmludCAiaml0LiN7bWV0aG9kTmFtZX0o
IgorCisgICAgICAgICAgICBmb3JtLmtpbmRzLmVhY2hfd2l0aF9pbmRleCB7CisgICAgICAgICAg
ICAgICAgfCBraW5kLCBpbmRleCB8CisgICAgICAgICAgICAgICAgaWYgaW5kZXggIT0gMAorICAg
ICAgICAgICAgICAgICAgICBvdXRwLnByaW50ICIsICIKKyAgICAgICAgICAgICAgICBlbmQKKyAg
ICAgICAgICAgICAgICBjYXNlIGtpbmQubmFtZQorICAgICAgICAgICAgICAgIHdoZW4gIlRtcCIK
KyAgICAgICAgICAgICAgICAgICAgaWYgb3ZlcmxvYWQuc2lnbmF0dXJlW2luZGV4XS50eXBlID09
ICJHIgorICAgICAgICAgICAgICAgICAgICAgICAgb3V0cC5wcmludCAiYXJnc1sje2luZGV4fV0u
Z3ByKCkiCisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAg
IG91dHAucHJpbnQgImFyZ3NbI3tpbmRleH1dLmZwcigpIgorICAgICAgICAgICAgICAgICAgICBl
bmQKKyAgICAgICAgICAgICAgICB3aGVuICJJbW0iCisgICAgICAgICAgICAgICAgICAgIG91dHAu
cHJpbnQgImFyZ3NbI3tpbmRleH1dLmFzVHJ1c3RlZEltbTMyKCkiCisgICAgICAgICAgICAgICAg
d2hlbiAiSW1tNjQiCisgICAgICAgICAgICAgICAgICAgIG91dHAucHJpbnQgImFyZ3NbI3tpbmRl
eH1dLmFzVHJ1c3RlZEltbTY0KCkiCisgICAgICAgICAgICAgICAgd2hlbiAiQWRkciIKKyAgICAg
ICAgICAgICAgICAgICAgb3V0cC5wcmludCAiYXJnc1sje2luZGV4fV0uYXNBZGRyZXNzKCkiCisg
ICAgICAgICAgICAgICAgd2hlbiAiSW5kZXgiCisgICAgICAgICAgICAgICAgICAgIG91dHAucHJp
bnQgImFyZ3NbI3tpbmRleH1dLmFzQmFzZUluZGV4KCkiCisgICAgICAgICAgICAgICAgd2hlbiAi
UmVsQ29uZCIKKyAgICAgICAgICAgICAgICAgICAgb3V0cC5wcmludCAiYXJnc1sje2luZGV4fV0u
YXNSZWxhdGlvbmFsQ29uZGl0aW9uKCkiCisgICAgICAgICAgICAgICAgd2hlbiAiUmVzQ29uZCIK
KyAgICAgICAgICAgICAgICAgICAgb3V0cC5wcmludCAiYXJnc1sje2luZGV4fV0uYXNSZXN1bHRD
b25kaXRpb24oKSIKKyAgICAgICAgICAgICAgICBlbmQKKyAgICAgICAgICAgIH0KKworICAgICAg
ICAgICAgb3V0cC5wdXRzICIpOyIKKyAgICAgICAgICAgIG91dHAucHV0cyAiT1BHRU5fUkVUVVJO
KHJlc3VsdCk7IgorICAgICAgICBlbmQKKyAgICB9CisgICAgb3V0cC5wdXRzICJSRUxFQVNFX0FT
U0VSVF9OT1RfUkVBQ0hFRCgpOyIKKyAgICBvdXRwLnB1dHMgInJldHVybiByZXN1bHQ7IgorICAg
IG91dHAucHV0cyAifSIKKworICAgIG91dHAucHV0cyAifSB9IH0gLy8gbmFtZXNwYWNlIEpTQzo6
QjM6OkFpciIKK30KKwpJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL2ppdC9SZWcuaAo9PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvaml0L1JlZy5oCShyZXZpc2lvbiAxOTEy
MzkpCisrKyBTb3VyY2UvSmF2YVNjcmlwdENvcmUvaml0L1JlZy5oCSh3b3JraW5nIGNvcHkpCkBA
IC0xMDUsNyArMTA1LDYgQEAgcHVibGljOgogICAgIHVuc2lnbmVkIGluZGV4KCkgY29uc3QgeyBy
ZXR1cm4gbV9pbmRleDsgfQogICAgIAogICAgIGJvb2wgaXNTZXQoKSBjb25zdCB7IHJldHVybiBt
X2luZGV4ICE9IGludmFsaWQoKTsgfQotICAgIGJvb2wgb3BlcmF0b3IhKCkgY29uc3QgeyByZXR1
cm4gIWlzU2V0KCk7IH0KICAgICBleHBsaWNpdCBvcGVyYXRvciBib29sKCkgY29uc3QgeyByZXR1
cm4gaXNTZXQoKTsgfQogCiAgICAgYm9vbCBpc0hhc2hUYWJsZURlbGV0ZWRWYWx1ZSgpIGNvbnN0
IHsgcmV0dXJuIG1faW5kZXggPT0gZGVsZXRlZCgpOyB9CkBAIC0xNzAsNiArMTY5LDQ2IEBAIHB1
YmxpYzoKICAgICAKICAgICB2b2lkIGR1bXAoUHJpbnRTdHJlYW0mKSBjb25zdDsKIAorICAgIGNs
YXNzIEFsbFJlZ3NJdGVyYWJsZSB7CisgICAgcHVibGljOgorCisgICAgICAgIGNsYXNzIGl0ZXJh
dG9yIHsKKyAgICAgICAgcHVibGljOgorICAgICAgICAgICAgaXRlcmF0b3IoKSB7IH0KKworICAg
ICAgICAgICAgZXhwbGljaXQgaXRlcmF0b3IoUmVnIHJlZykKKyAgICAgICAgICAgICAgICA6IG1f
cmVnKHJlZykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgUmVn
IG9wZXJhdG9yKigpIGNvbnN0IHsgcmV0dXJuIG1fcmVnOyB9CisKKyAgICAgICAgICAgIGl0ZXJh
dG9yJiBvcGVyYXRvcisrKCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtX3JlZyA9
IG1fcmVnLm5leHQoKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gKnRoaXM7CisgICAgICAgICAg
ICB9CisKKyAgICAgICAgICAgIGJvb2wgb3BlcmF0b3I9PShjb25zdCBpdGVyYXRvciYgb3RoZXIp
IGNvbnN0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG1fcmVnID09IG90
aGVyLm1fcmVnOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBib29sIG9wZXJhdG9yIT0o
Y29uc3QgaXRlcmF0b3ImIG90aGVyKSBjb25zdAorICAgICAgICAgICAgeworICAgICAgICAgICAg
ICAgIHJldHVybiAhKCp0aGlzID09IG90aGVyKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICBw
cml2YXRlOgorICAgICAgICAgICAgUmVnIG1fcmVnOworICAgICAgICB9OworCisgICAgICAgIGl0
ZXJhdG9yIGJlZ2luKCkgY29uc3QgeyByZXR1cm4gaXRlcmF0b3IoUmVnOjpmaXJzdCgpKTsgfQor
ICAgICAgICBpdGVyYXRvciBlbmQoKSBjb25zdCB7IHJldHVybiBpdGVyYXRvcihSZWcoKSk7IH0K
KyAgICB9OworCisgICAgc3RhdGljIEFsbFJlZ3NJdGVyYWJsZSBhbGwoKSBjb25zdCB7IHJldHVy
biBBbGxSZWdzSXRlcmFibGUoKTsgfQorCiBwcml2YXRlOgogICAgIHN0YXRpYyB1aW50OF90IGlu
dmFsaWQoKSB7IHJldHVybiAweGZmOyB9CiAKSW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9q
aXQvUmVnaXN0ZXJTZXQuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvaml0
L1JlZ2lzdGVyU2V0LmgJKHJldmlzaW9uIDE5MTIzOSkKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29y
ZS9qaXQvUmVnaXN0ZXJTZXQuaAkod29ya2luZyBjb3B5KQpAQCAtMTE3LDYgKzExNywxMyBAQCBw
dWJsaWM6CiAgICAgCiAgICAgYm9vbCBvcGVyYXRvcj09KGNvbnN0IFJlZ2lzdGVyU2V0JiBvdGhl
cikgY29uc3QgeyByZXR1cm4gbV92ZWN0b3IgPT0gb3RoZXIubV92ZWN0b3I7IH0KICAgICB1bnNp
Z25lZCBoYXNoKCkgY29uc3QgeyByZXR1cm4gbV92ZWN0b3IuaGFzaCgpOyB9CisKKyAgICB0ZW1w
bGF0ZTx0eXBlbmFtZSBGdW5jdG9yPgorICAgIHZvaWQgZm9yRWFjaChjb25zdCBGdW5jdG9yJiBm
dW5jdG9yKQorICAgIHsKKyAgICAgICAgZm9yIChzaXplX3QgaW5kZXggOiBtX3ZlY3Rvci5zZXRC
aXRzKCkpCisgICAgICAgICAgICBmdW5jdG9yKFJlZzo6ZnJvbUluZGV4KGluZGV4KSk7CisgICAg
fQogICAgIAogcHJpdmF0ZToKICAgICB2b2lkIHNldEFueShSZWcgcmVnKSB7IHNldChyZWcpOyB9
CkluZGV4OiBTb3VyY2UvV1RGL3d0Zi9CaXRWZWN0b3IuaAo9PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2Uv
V1RGL3d0Zi9CaXRWZWN0b3IuaAkocmV2aXNpb24gMTkxMjM5KQorKysgU291cmNlL1dURi93dGYv
Qml0VmVjdG9yLmgJKHdvcmtpbmcgY29weSkKQEAgLTMyMCw3ICszMjAsNyBAQCBwdWJsaWM6IAog
ICAgIH07CiAgICAgCiAgICAgU2V0Qml0c0l0ZXJhYmxlIHNldEJpdHMoKSBjb25zdCB7IHJldHVy
biBTZXRCaXRzSXRlcmFibGUoKnRoaXMpOyB9Ci0gICAgCisKIHByaXZhdGU6CiAgICAgc3RhdGlj
IHVuc2lnbmVkIGJpdHNJblBvaW50ZXIoKQogICAgIHsKSW5kZXg6IFNvdXJjZS9XVEYvd3RmL1Nj
b3BlZExhbWJkYS5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9XVEYvd3RmL1Njb3BlZExhbWJkYS5o
CShyZXZpc2lvbiAwKQorKysgU291cmNlL1dURi93dGYvU2NvcGVkTGFtYmRhLmgJKHdvcmtpbmcg
Y29weSkKQEAgLTAsMCArMSwxMDIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTUgQXBwbGUg
SW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2Ug
aW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0
aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25z
CisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3Qg
cmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNv
bmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0
aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Cisg
KiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRp
c2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlh
bHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUg
SVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBP
UiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUK
KyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9S
IEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNI
QUxMIEFQUExFIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJF
Q1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05T
RVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJP
Q1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERB
VEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FV
U0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJB
Q1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBP
UiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJ
UyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERB
TUFHRS4gCisgKi8KKworI2lmbmRlZiBTY29wZWRMYW1iZGFfaAorI2RlZmluZSBTY29wZWRMYW1i
ZGFfaAorCituYW1lc3BhY2UgV1RGIHsKKworLy8gWW91IGNhbiB1c2UgU2NvcGVkTGFtYmRhIHRv
IGVmZmljaWVudGx5IHBhc3MgbGFtYmRhcyB3aXRob3V0IGFsbG9jYXRpbmcgbWVtb3J5IG9yIHJl
cXVpcmluZworLy8gdGVtcGxhdGUgc3BlY2lhbGl6YXRpb24gb2YgdGhlIGNhbGxlZS4gVGhlIGNh
bGxlZSBzaG91bGQgYmUgZGVjbGFyZWQgYXM6CisvLworLy8gdm9pZCBmb28oY29uc3QgU2NvcGVk
TGFtYmRhPE15VGhpbmdzKiAoaW50LCBTdHVmZiYpPiYpOworLy8KKy8vIFRoZSBjYWxsZXIganVz
dCBkb2VzOgorLy8KKy8vIHZvaWQgZm9vKHNjb3BlZExhbWJkYTxNeVRoaW5ncyogKGludCwgU3R1
ZmYmKT4oWyZdIChpbnQgeCwgU3R1ZmYmIHkpIC0+IE15VGhpbmdzKiB7IGJsYWggfSkpOworLy8K
Ky8vIE5vdGUgdGhhdCB0aGlzIHJlbGllcyBvbiBmb28oKSBub3QgZXNjYXBpbmcgdGhlIGxhbWJk
YS4gVGhlIGxhbWJkYSBpcyBvbmx5IHZhbGlkIHdoaWxlIGZvbygpIGlzCisvLyBvbiB0aGUgc3Rh
Y2sgLSBoZW5jZSB0aGUgbmFtZSBTY29wZWRMYW1iZGEuCisKK3RlbXBsYXRlPHR5cGVuYW1lIEZ1
bmN0aW9uVHlwZT4gY2xhc3MgU2NvcGVkTGFtYmRhOwordGVtcGxhdGU8dHlwZW5hbWUgUmVzdWx0
VHlwZSwgdHlwZW5hbWUuLi4gQXJndW1lbnRUeXBlcz4KK2NsYXNzIFNjb3BlZExhbWJkYTxSZXN1
bHRUeXBlIChBcmd1bWVudFR5cGVzLi4uKT4geworcHVibGljOgorICAgIFNjb3BlZExhbWJkYShS
ZXN1bHRUeXBlICgqaW1wbCkodm9pZCogYXJnLCBBcmd1bWVudFR5cGVzJiYuLi4pID0gbnVsbHB0
ciwgdm9pZCogYXJnID0gbnVsbHB0cikKKyAgICAgICAgOiBtX2ltcGwoaW1wbCkKKyAgICAgICAg
LCBtX2FyZyhhcmcpCisgICAgeworICAgIH0KKyAgICAKKyAgICB+U2NvcGVkTGFtYmRhKCkKKyAg
ICB7CisgICAgfQorCisgICAgUmVzdWx0VHlwZSBvcGVyYXRvcigpKEFyZ3VtZW50VHlwZXMmJi4u
LiBhcmd1bWVudHMpCisgICAgeworICAgICAgICByZXR1cm4gbV9pbXBsKG1fYXJnLCBzdGQ6OmZv
cndhcmQ8QXJndW1lbnRUeXBlcz4oYXJndW1lbnRzKS4uLik7CisgICAgfQorCitwcml2YXRlOgor
ICAgIFJlc3VsdFR5cGUgKCppbXBsKSh2b2lkKiBhcmcsIEFyZ3VtZW50VHlwZXMmJi4uLikgbV9p
bXBsOworICAgIHZvaWQgKm1fYXJnOworfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgRnVuY3Rpb25U
eXBlLCB0eXBlbmFtZSBGdW5jdG9yPiBTY29wZWRMYW1iZGFGdW5jdG9yOwordGVtcGxhdGU8dHlw
ZW5hbWUgUmVzdWx0VHlwZSwgdHlwZW5hbWUuLi4gQXJndW1lbnRUeXBlcywgdHlwZW5hbWUgRnVu
Y3Rvcj4KK2NsYXNzIFNjb3BlZExhbWJkYUZ1bmN0b3I8UmVzdWx0VHlwZSAoQXJndW1lbnRUeXBl
cy4uLiksIEZ1bmN0b3I+IDogcHVibGljIFNjb3BlZExhbWJkYTxSZXN1bHRUeXBlIChBcmd1bWVu
dFR5cGVzLi4uKT4geworcHVibGljOgorICAgIFNjb3BlZExhbWJkYUZ1bmN0b3IoY29uc3QgRnVu
Y3RvciYgZnVuY3RvcikKKyAgICAgICAgOiBTY29wZWRMYW1iZGEoaW1wbEZ1bmN0aW9uLCB0aGlz
KQorICAgICAgICAsIG1fZnVuY3RvcihmdW5jdG9yKQorICAgIHsKKyAgICB9CisKKyAgICBTY29w
ZWRMYW1iZGFGdW5jdG9yKEZ1bmN0b3ImJiBmdW5jdG9yKQorICAgICAgICA6IFNjb3BlZExhbWJk
YShpbXBsRnVuY3Rpb24sIHRoaXMpCisgICAgICAgICwgbV9mdW5jdG9yKFdURjo6bW92ZShmdW5j
dG9yKSkKKyAgICB7CisgICAgfQorCitwcml2YXRlOgorICAgIHN0YXRpYyBSZXN1bHRUeXBlIGlt
cGxGdW5jdGlvbih2b2lkKiBhcmd1bWVudCwgQXJndW1lbnRUeXBlcyYmLi4uIGFyZ3VtZW50cykK
KyAgICB7CisgICAgICAgIHJldHVybiBzdGF0aWNfY2FzdDxTY29wZWRMYW1iZGFGdW5jdG9yKj4o
YXJndW1lbnQpLT5tX2Z1bmN0b3IoCisgICAgICAgICAgICBzdGQ6OmZvcndhcmQ8QXJndW1lbnRU
eXBlcz4oYXJndW1lbnRzKS4uLik7CisgICAgfQorCisgICAgRnVuY3RvciBtX2Z1bmN0b3I7Cit9
OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBGdW5jdGlvblR5cGUsIHR5cGVuYW1lIEZ1bmN0b3I+CitT
Y29wZWRMYW1iZGFGdW5jdG9yPEZ1bmN0aW9uVHlwZSwgRnVuY3Rvcj4gc2NvcGVkTGFtYmRhKGNv
bnN0IEZ1bmN0b3ImIGZ1bmN0b3IpCit7CisgICAgcmV0dXJuIFNjb3BlZExhbWJkYUZ1bmN0b3I8
RnVuY3Rpb25UeXBlLCBGdW5jdG9yPihmdW5jdG9yKTsKK30KKworfSAvLyBuYW1lc3BhY2UgV1RG
CisKKyNlbmRpZiAvLyBTY29wZWRMYW1iZGFfaAorCkluZGV4OiBTb3VyY2UvV1RGL3d0Zi9TaGFy
ZWRUYXNrLmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL1dURi93dGYvU2hhcmVkVGFzay5oCShyZXZp
c2lvbiAxOTEyMzkpCisrKyBTb3VyY2UvV1RGL3d0Zi9TaGFyZWRUYXNrLmgJKHdvcmtpbmcgY29w
eSkKQEAgLTc5LDYgKzc5LDExIEBAIHB1YmxpYzoKICAgICB7CiAgICAgfQogCisgICAgU2hhcmVk
VGFza0Z1bmN0b3IoRnVuY3RvciYmIGZ1bmN0b3IpCisgICAgICAgIDogbV9mdW5jdG9yKFdURjo6
bW92ZShmdW5jdG9yKSkKKyAgICB7CisgICAgfQorCiBwcml2YXRlOgogICAgIFJlc3VsdFR5cGUg
cnVuKEFyZ3VtZW50VHlwZXMmJi4uLiBhcmd1bWVudHMpIG92ZXJyaWRlCiAgICAgewpAQCAtMTEw
LDYgKzExNSwxMSBAQCBSZWY8U2hhcmVkVGFzazxGdW5jdGlvblR5cGU+PiBjcmVhdGVTaGFyCiB7
CiAgICAgcmV0dXJuIGFkb3B0UmVmKCpuZXcgU2hhcmVkVGFza0Z1bmN0b3I8RnVuY3Rpb25UeXBl
LCBGdW5jdG9yPihmdW5jdG9yKSk7CiB9Cit0ZW1wbGF0ZTx0eXBlbmFtZSBGdW5jdGlvblR5cGUs
IHR5cGVuYW1lIEZ1bmN0b3I+CitSZWY8U2hhcmVkVGFzazxGdW5jdGlvblR5cGU+PiBjcmVhdGVT
aGFyZWRUYXNrKEZ1bmN0b3ImJiBmdW5jdG9yKQoreworICAgIHJldHVybiBhZG9wdFJlZigqbmV3
IFNoYXJlZFRhc2tGdW5jdG9yPEZ1bmN0aW9uVHlwZSwgRnVuY3Rvcj4oV1RGOjptb3ZlKGZ1bmN0
b3IpKSk7Cit9CiAKIH0gLy8gbmFtZXNwYWNlIFdURgogCg==
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>263739</attachid>
            <date>2015-10-21 14:29:38 -0700</date>
            <delta_ts>2015-10-21 15:17:45 -0700</delta_ts>
            <desc>even more</desc>
            <filename>blah.patch</filename>
            <type>text/plain</type>
            <size>318829</size>
            <attacher name="Filip Pizlo">fpizlo</attacher>
            
              <data encoding="base64">SW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM0FkZHJlc3NNYXRjaGVyLnBhdHRlcm5z
Cj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM0FkZHJlc3NNYXRjaGVy
LnBhdHRlcm5zCShyZXZpc2lvbiAwKQorKysgU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzQWRk
cmVzc01hdGNoZXIucGF0dGVybnMJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSw0MSBAQAorIyBD
b3B5cmlnaHQgKEMpIDIwMTUgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorIworIyBS
ZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9y
IHdpdGhvdXQKKyMgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhl
IGZvbGxvd2luZyBjb25kaXRpb25zCisjIGFyZSBtZXQ6CisjIDEuIFJlZGlzdHJpYnV0aW9ucyBv
ZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisjICAgIG5vdGlj
ZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4K
KyMgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBh
Ym92ZSBjb3B5cmlnaHQKKyMgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQg
dGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorIyAgICBkb2N1bWVudGF0aW9uIGFuZC9v
ciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorIworIyBU
SElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gQU5EIElUUyBDT05UUklCVVRP
UlMgYGBBUyBJUycnCisjIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElO
Q0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorIyBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9G
IE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisjIFBVUlBPU0Ug
QVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IgSVRTIENPTlRS
SUJVVE9SUworIyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFM
LCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCisjIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVE
SU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCisjIFNVQlNUSVRVVEUgR09P
RFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVT
UworIyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJ
QUJJTElUWSwgV0hFVEhFUiBJTgorIyBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9S
VCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorIyBBUklTSU5HIElOIEFOWSBX
QVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GCisj
IFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworbWF0Y2hlciBBZGRyZXNzTWF0Y2hl
cgorCisjIE5vdGUgdGhhdCB0aGlzIHJlbGllcyBvbiBCMyBkb2luZyBhZ2dyZXNzaXZlIHJlYXNz
b2NpYXRpb24gYW5kIGNhbm9uY2FsaXphdGlvbiBvZiBpbnRlZ2VyIGFkZHMuCisjIFdlJ2xsIG5l
dmVyIHNlZSBBZGQoQWRkKHgsIGNvbnN0MSksIGNvbnN0MikgYmVjYXVzZSBpdCB3b3VsZCBoYXZl
IGFscmVhZHkgYmVlbiByZWFzc29jaWF0ZWQgaW50bworIyBBZGQoeCwgY29uc3QxICsgY29uc3Qy
KS4gQWxzbywgd2Ugd2lsbCBuZXZlciBzZWUgQWRkKGNvbnN0LCB4KSwgYmVjYXVzZSB3ZSB3b3Vs
ZCBoYXZlIGNhbm9uaWNhbGl6ZWQKKyMgaXQgdG8gQWRkKHgsIGNvbnN0KS4gVGhhdCBzYWlkLCBp
biB0aGlzIGNvZGUgd2UgbmV2ZXIgbWFrZSBhc3NlcnRpb25zIGFib3V0IHRoZXNlIG9wdGltaXph
dGlvbnMKKyMgaGF2aW5nIGJlZW4gcGVyZm9ybWVkLiBBbHNvLCBzaW5jZSB0aGUgTG9hZC9TdG9y
ZSBpbnN0cnVjdGlvbnMgaW4gQjMgaGF2ZSBhIGJ1aWx0LWluIG9mZnNldCwgd2UKKyMgZG9uJ3Qg
bmVlZCB0byBtYXRjaCBBZGQoeCwgY29uc3QpLiBUaGF0IHdvdWxkIGhhdmUgYmVlbiBmb2xkZWQg
aW50byB0aGUgTG9hZC9TdG9yZSBpbnN0cnVjdGlvbnMKKyMgYWxyZWFkeS4gU28sIHRoZSBvbmx5
IGZhbmN5IG1hdGhpbmcgdGhpcyBjYW4gZG8gaXMganVzdCBCYXNlSW5kZXggZm9ybXMuCisKK0Fk
ZFNoaWZ0MSA9IEFkZChTaGwoaW5kZXgsICRsb2dTY2FsZSksIGJhc2UpCitBZGRTaGlmdDIgPSBB
ZGQoYmFzZSwgU2hsKGluZGV4LCAkbG9nU2NhbGUpKQorCitBZGQgPSBBZGQobGVmdCwgcmlnaHQp
CisKKyRDb25zdAorCitEaXJlY3QKSW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM0Fy
Z3VtZW50UmVnVmFsdWUuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9i
My9CM0FyZ3VtZW50UmVnVmFsdWUuY3BwCShyZXZpc2lvbiAwKQorKysgU291cmNlL0phdmFTY3Jp
cHRDb3JlL2IzL0IzQXJndW1lbnRSZWdWYWx1ZS5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTAsMCAr
MSw0MSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNSBBcHBsZSBJbmMuIEFsbCByaWdodHMg
cmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJp
bmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0
ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6Cisg
KiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3Zl
IGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhl
IGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBm
b3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhp
cyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUK
KyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRo
IHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBB
UFBMRSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFO
VElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJS
QU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisg
KiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBP
UgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElO
Q0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdF
UyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJT
VElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJ
VFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBU
SEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJ
TElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJ
U0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVO
IElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLiAKKyAqLworCisj
aW5jbHVkZSAiY29uZmlnLmgiCisjaW5jbHVkZSAiQjNBcmd1bWVudFJlZ1ZhbHVlLmgiCisKK25h
bWVzcGFjZSBKU0MgeyBuYW1lc3BhY2UgQjMgeworCitBcmd1bWVudFJlZ1ZhbHVlOjp+QXJndW1l
bnRSZWdWYWx1ZSgpCit7Cit9CisKK3ZvaWQgQXJndW1lbnRSZWdWYWx1ZTo6ZHVtcE1ldGEoUHJp
bnRTdHJlYW0mIG91dCkgY29uc3QKK3sKKyAgICBvdXQucHJpbnQobV9yZWcpOworfQorCit9IH0g
Ly8gbmFtZXNwYWNlIEpTQzo6QjMKKwpJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0Iz
QXJndW1lbnRSZWdWYWx1ZS5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9i
My9CM0FyZ3VtZW50UmVnVmFsdWUuaAkocmV2aXNpb24gMCkKKysrIFNvdXJjZS9KYXZhU2NyaXB0
Q29yZS9iMy9CM0FyZ3VtZW50UmVnVmFsdWUuaAkod29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDYw
IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE1IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNl
cnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5
IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBw
cm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEu
IFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29w
eXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9s
bG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0g
bXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxp
c3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICog
ICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhl
IGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExF
IElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVT
LCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJ
RVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBV
UlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SCisg
KiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURF
TlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJ
TkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRV
VEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsg
T1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9S
WQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZ
LCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5H
IElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYg
QURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisKKyNpZm5k
ZWYgQjNBcmd1bWVudFJlZ1ZhbHVlX2gKKyNkZWZpbmUgQjNBcmd1bWVudFJlZ1ZhbHVlX2gKKwor
I2luY2x1ZGUgIkIzVmFsdWUuaCIKKyNpbmNsdWRlICJSZWcuaCIKKworbmFtZXNwYWNlIEpTQyB7
IG5hbWVzcGFjZSBCMyB7CisKK2NsYXNzIEFyZ3VtZW50UmVnVmFsdWUgOiBwdWJsaWMgVmFsdWUg
eworcHVibGljOgorICAgIHN0YXRpYyBib29sIGFjY2VwdHMoT3Bjb2RlIG9wY29kZSkgeyByZXR1
cm4gb3Bjb2RlID09IEFyZ3VtZW50UmVnOyB9CisgICAgCisgICAgfkFyZ3VtZW50UmVnVmFsdWUo
KTsKKworICAgIFJlZyBhcmd1bWVudFJlZygpIGNvbnN0IHsgcmV0dXJuIG1fcmVnOyB9CisKK3By
b3RlY3RlZDoKKyAgICB2b2lkIGR1bXBNZXRhKFByaW50U3RyZWFtJikgY29uc3Qgb3ZlcnJpZGU7
CisKK3ByaXZhdGU6CisgICAgZnJpZW5kIGNsYXNzIFByb2NlZHVyZTsKKworICAgIEFyZ3VtZW50
UmVnVmFsdWUodW5zaWduZWQgaW5kZXgsIE9yaWdpbiBvcmlnaW4sIFJlZyByZWcpCisgICAgICAg
IDogVmFsdWUoaW5kZXgsIEFyZ3VtZW50UmVnLCByZWcuaXNHUFIoKSA/IHBvaW50ZXIoKSA6IERv
dWJsZSwgb3JpZ2luKQorICAgICAgICAsIG1fcmVnKHJlZykKKyAgICB7CisgICAgfQorCisgICAg
UmVnIG1fcmVnOworfTsKKworfSB9IC8vIG5hbWVzcGFjZSBKU0M6OkIzCisKKyNlbmRpZiAvLyBC
M0FyZ3VtZW50UmVnVmFsdWVfaAorCkluZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNC
YXNpY0Jsb2NrLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNC
YXNpY0Jsb2NrLmNwcAkocmV2aXNpb24gMCkKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9C
M0Jhc2ljQmxvY2suY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsNzUgQEAKKy8qCisgKiBD
b3B5cmlnaHQgKEMpIDIwMTUgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAq
IFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGgg
b3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQg
dGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRp
b25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAg
IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xh
aW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVj
ZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRp
b25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0
aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9u
LgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFTIElT
JycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywg
QlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFO
VEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElT
Q0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IKKyAqIENPTlRSSUJVVE9S
UyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFM
LAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVU
IE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBT
RVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJ
TlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFC
SUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAq
IChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBP
VVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRI
RSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKworI2luY2x1ZGUgImNvbmZpZy5o
IgorI2luY2x1ZGUgIkIzQmFzaWNCbG9jay5oIgorCisjaW5jbHVkZSAiQjNCYXNpY0Jsb2NrVXRp
bHMuaCIKKworbmFtZXNwYWNlIEpTQyB7IG5hbWVzcGFjZSBCMyB7CisKK0Jhc2ljQmxvY2s6OkJh
c2ljQmxvY2sodW5zaWduZWQgaW5kZXgpCisgICAgOiBtX2luZGV4KGluZGV4KQoreworfQorCitC
YXNpY0Jsb2NrOjp+QmFzaWNCbG9jaygpCit7Cit9CisKK3ZvaWQgQmFzaWNCbG9jazo6YXBwZW5k
KFZhbHVlKiB2YWx1ZSkKK3sKKyAgICBtX3ZhbHVlcy5hcHBlbmQodmFsdWUpOworfQorCit2b2lk
IEJhc2ljQmxvY2s6OmFkZFByZWRlY2Vzc29yKEJhc2ljQmxvY2sqIGJsb2NrKQoreworICAgIEIz
OjphZGRQcmVkZWNlc3Nvcih0aGlzLCBibG9jayk7Cit9CisKK3ZvaWQgQmFzaWNCbG9jazo6cmVt
b3ZlUHJlZGVjZXNzb3IoQmFzaWNCbG9jayogYmxvY2spCit7CisgICAgQjM6OnJlbW92ZVByZWRl
Y2Vzc29yKHRoaXMsIGJsb2NrKTsKK30KKwordm9pZCBCYXNpY0Jsb2NrOjpyZXBsYWNlUHJlZGVj
ZXNzb3IoQmFzaWNCbG9jayogZnJvbSwgQmFzaWNCbG9jayogdG8pCit7CisgICAgQjM6OnJlcGxh
Y2VQcmVkZWNlc3Nvcih0aGlzLCBmcm9tLCB0byk7Cit9CisKK3ZvaWQgQmFzaWNCbG9jazo6ZHVt
cChQcmludFN0cmVhbSYgb3V0KSBjb25zdAoreworICAgIG91dC5wcmludChkdW1wUHJlZml4LCBt
X2luZGV4KTsKK30KKwordm9pZCBCYXNpY0Jsb2NrOjpkZWVwRHVtcChQcmludFN0cmVhbSYgb3V0
KSBjb25zdAoreworICAgIG91dC5wcmludCgiQkIiLCAqdGhpcywgIjpcbiIpOworICAgIGZvciAo
VmFsdWUqIHZhbHVlIDogKnRoaXMpCisgICAgICAgIG91dC5wcmludCgiICAgICIsIGRlZXBEdW1w
KHZhbHVlKSwgIlxuIik7Cit9CisKK30gfSAvLyBuYW1lc3BhY2UgSlNDOjpCMworCkluZGV4OiBT
b3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNCYXNpY0Jsb2NrLmgKPT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291
cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzQmFzaWNCbG9jay5oCShyZXZpc2lvbiAwKQorKysgU291
cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzQmFzaWNCbG9jay5oCSh3b3JraW5nIGNvcHkpCkBAIC0w
LDAgKzEsMTIzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE1IEFwcGxlIEluYy4gQWxsIHJp
Z2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBh
bmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBl
cm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1l
dDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUg
YWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFu
ZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmlu
YXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNl
LCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGlu
IHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVk
IHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVE
IEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBX
QVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVE
IFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VM
QVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJ
TkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVD
VCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBE
QU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9G
IFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICog
UFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04g
QU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1Qg
TElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNF
KSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUs
IEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICov
CisKKyNpZm5kZWYgQjNCYXNpY0Jsb2NrCisjZGVmaW5lIEIzQmFzaWNCbG9jaworCituYW1lc3Bh
Y2UgSlNDIHsgbmFtZXNwYWNlIEIzIHsKKworY2xhc3MgUHJvY2VkdXJlOworY2xhc3MgVmFsdWU7
CisKK2NsYXNzIEJhc2ljQmxvY2sgeworICAgIFdURl9NQUtFX05PTkNPUFlBQkxFKEJhc2ljQmxv
Y2spOworICAgIFdURl9NQUtFX0ZBU1RfQUxMT0NBVEVEOworcHVibGljOgorICAgIHR5cGVkZWYg
VmVjdG9yPFZhbHVlKj4gVmFsdWVMaXN0OworICAgIHR5cGVkZWYgVmVjdG9yPEJhc2ljQmxvY2sq
LCAyPiBBZGphY2VuY3lMaXN0OyAvLyBUaGlzIG1hdGNoZXMgQ29udHJvbFZhbHVlOjpTdWNjZXNz
b3JMaXN0CisKKyAgICBzdGF0aWMgY29uc3QgY2hhciogZHVtcFByZWZpeCA9ICIjIjsKKworICAg
IH5CYXNpY0Jsb2NrKCk7CisKKyAgICB1bnNpZ25lZCBpbmRleCgpIGNvbnN0IHsgcmV0dXJuIG1f
aW5kZXg7IH0KKworICAgIFZhbHVlTGlzdDo6aXRlcmF0b3IgYmVnaW4oKSB7IHJldHVybiBtX3Zh
bHVlcy5iZWdpbigpOyB9CisgICAgVmFsdWVMaXN0OjppdGVyYXRvciBlbmQoKSB7IHJldHVybiBt
X3ZhbHVlcy5lbmQoKTsgfQorICAgIFZhbHVlTGlzdDo6Y29uc3RfaXRlcmF0b3IgYmVnaW4oKSBj
b25zdCB7IHJldHVybiBtX3ZhbHVlcy5iZWdpbigpOyB9CisgICAgVmFsdWVMaXN0Ojpjb25zdF9p
dGVyYXRvciBlbmQoKSBjb25zdCB7IHJldHVybiBtX3ZhbHVlcy5lbmQoKTsgfQorCisgICAgc2l6
ZV90IHNpemUoKSBjb25zdCB7IHJldHVybiBtX3ZhbHVlcy5zaXplKCk7IH0KKyAgICBWYWx1ZSog
YXQoc2l6ZV90IGluZGV4KSBjb25zdCB7IHJldHVybiBtX3ZhbHVlc1tpbmRleF07IH0KKyAgICBW
YWx1ZSomIGF0KHNpemVfdCBpbmRleCkgeyByZXR1cm4gbV92YWx1ZXNbaW5kZXhdOyB9CisKKyAg
ICBWYWx1ZSogbGFzdCgpIGNvbnN0IHsgcmV0dXJuIG1fdmFsdWVzLmxhc3QoKTsgfQorICAgIFZh
bHVlKiYgbGFzdCgpIHsgcmV0dXJuIG1fdmFsdWVzLmxhc3QoKTsgfQorCisgICAgY29uc3QgVmFs
dWVMaXN0JiB2YWx1ZXMoKSBjb25zdCB7IHJldHVybiBtX3ZhbHVlczsgfQorICAgIFZhbHVlTGlz
dCYgdmFsdWVzKCkgeyByZXR1cm4gbV92YWx1ZXM7IH0KKworICAgIHZvaWQgYXBwZW5kKFZhbHVl
Kik7CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBWYWx1ZVR5cGUsIHR5cGVuYW1lLi4uIEFyZ3Vt
ZW50cz4KKyAgICBWYWx1ZVR5cGUqIGFwcGVuZE5ldyhQcm9jZWR1cmUmLCBBcmd1bWVudHMuLi4p
OworCisgICAgdW5zaWduZWQgbnVtU3VjY2Vzc29ycygpIGNvbnN0OworICAgIEJhc2ljQmxvY2sq
IHN1Y2Nlc3Nvcih1bnNpZ25lZCBpbmRleCkgY29uc3Q7CisgICAgQmFzaWNCbG9jayomIHN1Y2Nl
c3Nvcih1bnNpZ25lZCBpbmRleCk7CisgICAgY29uc3QgQWRqYWNlbmN5TGlzdCYgc3VjY2Vzc29y
cygpIGNvbnN0OworCisgICAgdW5zaWduZWQgbnVtUHJlZGVjZXNzb3JzKCkgY29uc3QgeyByZXR1
cm4gbV9wcmVkZWNlc3NvcnMuc2l6ZSgpOyB9CisgICAgQmFzaWNCbG9jayogcHJlZGVjZXNzb3Io
dW5zaWduZWQgaW5kZXgpIGNvbnN0IHsgcmV0dXJuIG1fcHJlZGVjZXNzb3JzW2luZGV4XTsgfQor
ICAgIEJhc2ljQmxvY2sqJiBwcmVkZWNlc3Nvcih1bnNpZ25lZCBpbmRleCkgeyByZXR1cm4gbV9w
cmVkZWNlc3NvcnNbaW5kZXhdOyB9CisgICAgY29uc3QgQWRqYWNlbmN5TGlzdCYgcHJlZGVjZXNz
b3JzKCkgY29uc3QgeyByZXR1cm4gbV9wcmVkZWNlc3NvcnNbaW5kZXhdOyB9CisgICAgQWRqYWNl
bmN5TGlzdCYgcHJlZGVjZXNzb3JzKCkgeyByZXR1cm4gbV9wcmVkZWNlc3NvcnNbaW5kZXhdOyB9
CisKKyAgICBib29sIGFkZFByZWRlY2Vzc29yKEJhc2ljQmxvY2sqKTsKKyAgICBib29sIHJlbW92
ZVByZWRlY2Vzc29yKEJhc2ljQmxvY2sqKTsKKyAgICBib29sIHJlcGxhY2VQcmVkZWNlc3NvcihC
YXNpY0Jsb2NrKiBmcm9tLCBCYXNpY0Jsb2NrKiB0byk7CisKKyAgICB2b2lkIGR1bXAoUHJpbnRT
dHJlYW0mKSBjb25zdDsKKyAgICB2b2lkIGRlZXBEdW1wKFByaW50U3RyZWFtJikgY29uc3Q7CisK
K3ByaXZhdGU6CisgICAgZnJpZW5kIGNsYXNzIFByb2NlZHVyZTsKKyAgICAKKyAgICAvLyBJbnN0
YW50aWF0ZSB2aWEgUHJvY2VkdXJlLgorICAgIEJhc2ljQmxvY2sodW5zaWduZWQgaW5kZXgpOwor
CisgICAgdW5zaWduZWQgbV9pbmRleDsKKyAgICBWYWx1ZUxpc3QgbV92YWx1ZXM7CisgICAgQWRq
YWNlbmN5TGlzdCBtX3N1Y2Nlc3NvcnM7Cit9OworCitjbGFzcyBEZWVwQmFzaWNCbG9ja0R1bXAg
eworcHVibGljOgorICAgIERlZXBCYXNpY0Jsb2NrRHVtcChCYXNpY0Jsb2NrKiBibG9jaykKKyAg
ICAgICAgOiBtX2Jsb2NrKGJsb2NrKQorICAgIHsKKyAgICB9CisKKyAgICB2b2lkIGR1bXAoUHJp
bnRTdHJlYW0mIG91dCkgY29uc3QKKyAgICB7CisgICAgICAgIGlmIChtX2Jsb2NrKQorICAgICAg
ICAgICAgbV9ibG9jay0+ZGVlcER1bXAob3V0KTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAg
b3V0LnByaW50KCI8bnVsbD4iKTsKKyAgICB9CisKK3ByaXZhdGU6CisgICAgQmFzaWNCbG9jayog
bV9ibG9jazsKK307CisKK0RlZXBCYXNpY0Jsb2NrRHVtcCBkZWVwRHVtcChCYXNpY0Jsb2NrKiBi
bG9jaykKK3sKKyAgICByZXR1cm4gRGVlcEJhc2ljQmxvY2tEdW1wKGJsb2NrKTsKK30KKworfSB9
IC8vIG5hbWVzcGFjZSBKU0M6OkIzCisKKyNlbmRpZiAvLyBCM0Jhc2ljQmxvY2sKKwpJbmRleDog
U291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzQmFzaWNCbG9ja0lubGluZXMuaAo9PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNCYXNpY0Jsb2NrSW5saW5lcy5oCShyZXZp
c2lvbiAwKQorKysgU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzQmFzaWNCbG9ja0lubGluZXMu
aAkod29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDY2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAy
MDE1IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlv
biBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAq
IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcg
Y29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2Ug
Y29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMg
bGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBS
ZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNv
cHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZv
bGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3Ro
ZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElT
IFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAq
IEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRF
RCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBG
SVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBO
TyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZP
UiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFS
WSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBU
TywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1Mg
T0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBI
T1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVS
IElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5F
R0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UK
KyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkg
T0YgU1VDSCBEQU1BR0UuIAorICovCisKKyNpZm5kZWYgQjNCYXNpY0Jsb2NrSW5saW5lc19oCisj
ZGVmaW5lIEIzQmFzaWNCbG9ja0lubGluZXNfaAorCisjaW5jbHVkZSAiQjNCYXNpY0Jsb2NrLmgi
CisjaW5jbHVkZSAiQjNDb250cm9sVmFsdWUuaCIKKyNpbmNsdWRlICJCM1Byb2NlZHVyZUlubGlu
ZXMuaCIKKworbmFtZXNwYWNlIEpTQyB7IG5hbWVzcGFjZSBCMyB7CisKK3RlbXBsYXRlPHR5cGVu
YW1lIFZhbHVlVHlwZSB0eXBlbmFtZS4uLiBBcmd1bWVudHM+CitWYWx1ZVR5cGUqIEJhc2ljQmxv
Y2s6OmFwcGVuZE5ldyhQcm9jZWR1cmUmIHByb2NlZHVyZSwgQXJndW1lbnRzLi4uIGFyZ3VtZW50
cykKK3sKKyAgICBWYWx1ZVR5cGUqIHJlc3VsdCA9IHByb2NlZHVyZS5hZGQ8VmFsdWVUeXBlPihh
cmd1bWVudHMuLi4pOworICAgIGFwcGVuZChyZXN1bHQpOworICAgIHJldHVybiByZXN1bHQ7Cit9
CisKK3Vuc2lnbmVkIEJhc2ljQmxvY2s6Om51bVN1Y2Nlc3NvcnMoKSBjb25zdAoreworICAgIHJl
dHVybiBsYXN0KCktPmFzPENvbnRyb2xWYWx1ZT4oKS0+bnVtU3VjY2Vzc29ycygpOworfQorCitC
YXNpY0Jsb2NrKiBCYXNpY0Jsb2NrOjpzdWNjZXNzb3IodW5zaWduZWQgaW5kZXgpIGNvbnN0Cit7
CisgICAgcmV0dXJuIGxhc3QoKS0+YXM8Q29udHJvbFZhbHVlPigpLT5zdWNjZXNzb3IoaW5kZXgp
OworfQorCitCYXNpY0Jsb2NrKiYgQmFzaWNCbG9jazo6c3VjY2Vzc29yKHVuc2lnbmVkIGluZGV4
KQoreworICAgIHJldHVybiBsYXN0KCktPmFzPENvbnRyb2xWYWx1ZT4oKS0+c3VjY2Vzc29yKGlu
ZGV4KTsKK30KKworY29uc3QgQmFzaWNCbG9jazo6U3VjY2Vzc29yTGlzdCYgQmFzaWNCbG9jazo6
c3VjY2Vzc29ycygpIGNvbnN0Cit7CisgICAgcmV0dXJuIGxhc3QoKS0+YXM8Q29udHJvbFZhbHVl
PigpLT5zdWNjZXNzb3JzKCk7Cit9CisKK30gfSAvLyBuYW1lc3BhY2UgSlNDOjpCMworCisjZW5k
aWYgLy8gQjNCYXNpY0Jsb2NrSW5saW5lc19oCisKSW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29y
ZS9iMy9CM0Jhc2ljQmxvY2tVdGlscy5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0
Q29yZS9iMy9CM0Jhc2ljQmxvY2tVdGlscy5oCShyZXZpc2lvbiAwKQorKysgU291cmNlL0phdmFT
Y3JpcHRDb3JlL2IzL0IzQmFzaWNCbG9ja1V0aWxzLmgJKHdvcmtpbmcgY29weSkKQEAgLTAsMCAr
MSwxMDMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTUgQXBwbGUgSW5jLiBBbGwgcmlnaHRz
IHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBi
aW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0
dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0Ogor
ICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92
ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRo
ZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkg
Zm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRo
aXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhl
CisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0
aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkg
QVBQTEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJB
TlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FS
UkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgor
ICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4g
T1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJ
TkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFH
RVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VC
U1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9G
SVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkg
VEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFC
SUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFS
SVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZF
TiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKwor
I2lmbmRlZiBCM0Jhc2ljQmxvY2tVdGlsc19oCisjZGVmaW5lIEIzQmFzaWNCbG9ja1V0aWxzX2gK
KworI2luY2x1ZGUgIkIzSW5kZXhTZXQuaCIKKyNpbmNsdWRlIDx3dGYvR3JhcGhOb2RlV29ya2xp
c3QuaD4KKyNpbmNsdWRlIDx3dGYvVmVjdG9yLmg+CisKK25hbWVzcGFjZSBKU0MgeyBuYW1lc3Bh
Y2UgQjMgeworCit0ZW1wbGF0ZTx0eXBlbmFtZSBCYXNpY0Jsb2NrPgorYm9vbCBhZGRQcmVkZWNl
c3NvcihCYXNpY0Jsb2NrKiBibG9jaywgQmFzaWNCbG9jayogcHJlZGVjZXNzb3IpCit7CisgICAg
QmFzaWNCbG9jazo6QWRqYWNlbmN5TGlzdCYgcHJlZGVjZXNzb3JzID0gYmxvY2stPnByZWRlY2Vz
c29ycygpOworCisgICAgaWYgKHByZWRlY2Vzc29ycy5jb250YWlucyhwcmVkZWNlc3NvcikpCisg
ICAgICAgIHJldHVybiBmYWxzZTsKKworICAgIHByZWRlY2Vzc29ycy5hcHBlbmQocHJlZGVjZXNz
b3IpOworICAgIHJldHVybiB0cnVlOworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBCYXNpY0Jsb2Nr
PgorYm9vbCByZW1vdmVQcmVkZWNlc3NvcihCYXNpY0Jsb2NrKiBibG9jaywgQmFzaWNCbG9jayAq
cHJlZGVjZXNzb3IpCit7CisgICAgQmFzaWNCbG9jazo6QWRqYWNlbmN5TGlzdCYgcHJlZGVjZXNz
b3JzID0gYmxvY2stPnByZWRlY2Vzc29ycygpOworICAgIGJvb2wgcmVzdWx0ID0gZmFsc2U7Cisg
ICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IHByZWRlY2Vzc29ycy5zaXplKCk7ICsraSkgewor
ICAgICAgICBpZiAocHJlZGVjZXNzb3JzW2ldID09IHByZWRlY2Vzc29yKSB7CisgICAgICAgICAg
ICBwcmVkZWNlc3NvcnNbaS0tXSA9IHByZWRlY2Vzc29ycy5sYXN0KCk7CisgICAgICAgICAgICBw
cmVkZWNlc3NvcnMucmVtb3ZlTGFzdCgpOworICAgICAgICAgICAgcmVzdWx0ID0gdHJ1ZTsKKyAg
ICAgICAgICAgIC8vIE91dCBvZiBjYXV0aW9uLCB3ZSBrZWVwIGdvaW5nIGV2ZW4gdGhvdWdoIHRo
ZSBwcmVkZWNlc3NvciBsaXN0IGNhbm5vdCBoYXZlCisgICAgICAgICAgICAvLyBkdXBsaWNhdGVz
LgorICAgICAgICB9CisgICAgfQorICAgIHJldHVybiByZXN1bHQ7Cit9CisKK3RlbXBsYXRlPHR5
cGVuYW1lIEJhc2ljQmxvY2s+Citib29sIHJlcGxhY2VQcmVkZWNlc3NvcihCYXNpY0Jsb2NrKiBi
bG9jaywgQmFzaWNCbG9jayogZnJvbSwgQmFzaWNCbG9jayogdG8pCit7CisgICAgQmFzaWNCbG9j
azo6QWRqYWNlbmN5TGlzdCYgcHJlZGVjZXNzb3JzID0gYmxvY2stPnByZWRlY2Vzc29ycygpOwor
ICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBwcmVkZWNlc3NvcnMuc2l6ZSgpOyArK2kpIHsK
KyAgICAgICAgaWYgKHByZWRlY2Vzc29yc1tpXSA9PSBmcm9tKSB7CisgICAgICAgICAgICBwcmVk
ZWNlc3NvcnNbaV0gPSB0bzsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9Cisg
ICAgfQorICAgIHJldHVybiBmYWxzZTsKK30KKworLy8gVGhpcyByZWNvbXB1dGVzIHByZWRlY2Vz
c29ycyBhbmQgcmVtb3ZlcyBibG9ja3MgdGhhdCBhcmVuJ3QgcmVhY2hhYmxlLgordGVtcGxhdGU8
dHlwZW5hbWUgQmFzaWNCbG9jaz4KK3ZvaWQgcmVzZXRSZWFjaGFiaWxpdHkoVmVjdG9yPHN0ZDo6
dW5pcXVlX3B0cjxCYXNpY0Jsb2NrPj4mIGJsb2NrcykKK3sKKyAgICAvLyBDbGVhciBhbGwgcHJl
ZGVjZXNzb3IgbGlzdHMgZmlyc3QuCisgICAgZm9yIChCYXNpY0Jsb2NrKiBibG9jayA6IGJsb2Nr
cykKKyAgICAgICAgYmxvY2stPnByZWRlY2Vzc29ycygpLnJlc2l6ZSgwKTsKKworICAgIEdyYXBo
Tm9kZVdvcmtsaXN0PEJhc2ljQm9jayosIEluZGV4U2V0PEJhc2ljQmxvY2s+PiB3b3JrbGlzdDsK
KyAgICB3b3JrbGlzdC5ub2RlKGJsb2Nrc1swXSk7CisgICAgd2hpbGUgKEJhc2ljQmxvY2sqIGJs
b2NrID0gd29ya2xpc3QucG9wKCkpIHsKKyAgICAgICAgZm9yIChCYXNpY0Jsb2NrKiBzdWNjZXNz
b3IgOiBibG9jay0+c3VjY2Vzc29ycygpKSB7CisgICAgICAgICAgICBpZiAod29ya2xpc3QuYWRk
KHN1Y2Nlc3NvcikpCisgICAgICAgICAgICAgICAgc3VjY2Vzc29yLT5wcmVkZWNlc3NvcnMoKS5h
cHBlbmQoYmxvY2spOworICAgICAgICB9CisgICAgfQorCisgICAgZm9yICh1bnNpZ25lZCBpID0g
MTsgaSA8IGJsb2Nrcy5zaXplKCk7ICsraSkgeworICAgICAgICBpZiAoYmxvY2tzW2ldLnByZWRl
Y2Vzc29ycy5pc0VtcHR5KCkpCisgICAgICAgICAgICBibG9ja3NbaV0gPSBudWxscHRyOworICAg
IH0KK30KKworfSB9IC8vIG5hbWVzcGFjZSBKU0M6OkIzCisKKyNlbmRpZiAvLyBCM0Jhc2ljQmxv
Y2tVdGlsc19oCisKSW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM0Jsb2NrV29ya2xp
c3QuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNCbG9ja1dvcmts
aXN0LmgJKHJldmlzaW9uIDApCisrKyBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNCbG9ja1dv
cmtsaXN0LmgJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSw1OCBAQAorLyoKKyAqIENvcHlyaWdo
dCAoQykgMjAxNSBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0
cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRo
b3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9s
bG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Yg
c291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNl
LCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgor
ICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBh
Ym92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5k
IHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5k
L29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgor
ICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIGBgQVMgSVMnJyBBTkQg
QU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9U
IExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElU
WSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVE
LiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJ
QUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBF
WEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJ
TUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VT
OyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQ
VElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwg
V0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xV
RElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBU
SEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJ
QklMSVRZIE9GIFNVQ0ggREFNQUdFLiAKKyAqLworCisjaWZuZGVmIEIzQmxvY2tXb3JrbGlzdF9o
CisjZGVmaW5lIEIzQmxvY2tXb3JrbGlzdF9oCisKKyNpbmNsdWRlICJCM0Jhc2ljQmxvY2suaCIK
KyNpbmNsdWRlICJCM0luZGV4U2V0LmgiCisjaW5jbHVkZSA8d3RmL0dyYXBoTm9kZVdvcmtsaXN0
Lmg+CisjaW5jbHVkZSA8d3RmL1ZlY3Rvci5oPgorCituYW1lc3BhY2UgSlNDIHsgbmFtZXNwYWNl
IEIzIHsKKworc3RydWN0IEJhc2ljQmxvY2s7CisKK3R5cGVkZWYgR3JhcGhOb2RlV29ya2xpc3Q8
QmFzaWNCbG9jayosIEluZGV4U2V0PEJhc2ljQmxvY2s+PiBCbG9ja1dvcmtsaXN0OworCisvLyBX
aGVuIHlvdSBzYXkgQmxvY2tXaXRoPGludD4geW91IHNob3VsZCByZWFkIGl0IGFzICJibG9jayB3
aXRoIGFuIGludCIuCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPiB1c2luZyBCbG9ja1dpdGggPSBHcmFw
aE5vZGVXaXRoPEJhc2ljQmxvY2sqLCBUPjsKKworLy8gRXh0ZW5kZWQgYmxvY2sgd29ya2xpc3Qg
aXMgdXNlZnVsIGZvciBlbnF1ZXVlaW5nIHNvbWUgbWV0YS1kYXRhIGFsb25nIHdpdGggdGhlIGJs
b2NrLiBJdCBhbHNvCisvLyBwZXJtaXRzIGZvcmNpYmx5IGVucXVldWVpbmcgdGhpbmdzIGV2ZW4g
aWYgdGhlIGJsb2NrIGhhcyBhbHJlYWR5IGJlZW4gc2Vlbi4gSXQncyB1c2VmdWwgZm9yCisvLyB0
aGluZ3MgbGlrZSBidWlsZGluZyBhIHNwYW5uaW5nIHRyZWUsIGluIHdoaWNoIGNhc2UgVCAodGhl
IGF1eGlsaWFyeSBwYXlsb2FkKSB3b3VsZCBiZSB0aGUKKy8vIHN1Y2Nlc3NvciBpbmRleC4KK3Rl
bXBsYXRlPHR5cGVuYW1lIFQ+IHVzaW5nIEV4dGVuZGVkQmxvY2tXb3JrbGlzdCA9IEV4dGVuZGVk
R3JhcGhOb2RlV29ya2xpc3Q8QmFzaWNCbG9jayosIFQsIEluZGV4U2V0PEJhc2ljQmxvY2s+PjsK
KwordHlwZWRlZiBHcmFwaFZpc2l0T3JkZXIgVmlzaXRPcmRlcjsKKwordHlwZWRlZiBHcmFwaE5v
ZGVXaXRoT3JkZXI8QmFzaWNCbG9jayo+IEJsb2NrV2l0aE9yZGVyOworCit0eXBlZGVmIFBvc3RP
cmRlckdyYXBoTm9kZVdvcmtsaXN0PEJhc2ljQmxvY2sqLCBJbmRleFNldDxCYXNpY0Jsb2NrPj4g
UG9zdE9yZGVyQmxvY2tXb3JrbGlzdDsKKworfSB9IC8vIG5hbWVzcGFjZSBKU0M6OkIzCisKKyNl
bmRpZiAvLyBCM0Jsb2NrV29ya2xpc3RfaAorCkluZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUv
YjMvQjNDaGVja1NwZWNpYWwuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29y
ZS9iMy9CM0NoZWNrU3BlY2lhbC5jcHAJKHJldmlzaW9uIDApCisrKyBTb3VyY2UvSmF2YVNjcmlw
dENvcmUvYjMvQjNDaGVja1NwZWNpYWwuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsMTQy
IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE1IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNl
cnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5
IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBw
cm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEu
IFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29w
eXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9s
bG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0g
bXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxp
c3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICog
ICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhl
IGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExF
IElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVT
LCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJ
RVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBV
UlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SCisg
KiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURF
TlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJ
TkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRV
VEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsg
T1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9S
WQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZ
LCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5H
IElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYg
QURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisKKyNpbmNs
dWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJCM0NoZWNrU3BlY2lhbC5oIgorCituYW1lc3BhY2Ug
SlNDIHsgbmFtZXNwYWNlIEIzIHsKKwordXNpbmcgbmFtZXNwYWNlIEFpcjsKKworbmFtZXNwYWNl
IHsKKwordW5zaWduZWQgbnVtQjNBcmdzKEluc3QmIGluc3QpCit7CisgICAgc3dpdGNoIChpbnN0
Lm9yaWdpbi0+b3Bjb2RlKCkpIHsKKyAgICBjYXNlIENoZWNrQWRkOgorICAgIGNhc2UgQ2hlY2tT
dWI6CisgICAgY2FzZSBDaGVja011bDoKKyAgICAgICAgcmV0dXJuIDI7CisgICAgY2FzZSBDaGVj
azoKKyAgICAgICAgcmV0dXJuIDE7CisgICAgZGVmYXVsdDoKKyAgICAgICAgUkVMRUFTRV9BU1NF
UlRfTk9UX1JFQUNIRUQoKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorfQorCit9IC8vIGFu
b255bW91cyBuYW1lc3BhY2UKKworQ2hlY2tTcGVjaWFsOjpDaGVja1NwZWNpYWwoQWlyOjpPcGNv
ZGUgb3Bjb2RlLCB1bnNpZ25lZCBudW1BcmdzKQorICAgIDogbV9jaGVja09wY29kZShvcGNvZGUp
CisgICAgLCBtX251bUNoZWNrQXJncyhudW1BcmdzKQoreworfQorCitDaGVja1NwZWNpYWw6On5D
aGVja1NwZWNpYWwoKQoreworfQorCitJbnN0IENoZWNrU3BlY2lhbDo6aGlkZGVuQnJhbmNoKGNv
bnN0IEluc3QmIGluc3QpIGNvbnN0Cit7CisgICAgSW5zdCBoaWRkZW5CcmFuY2gobV9jaGVja09w
Y29kZSwgaW5zdC5vcmlnaW4pOworICAgIGhpZGRlbkJyYW5jaC5hcmdzLnJlc2l6ZShtX251bUNo
ZWNrQXJncyk7CisgICAgZm9yICh1bnNpZ25lZCBpID0gbV9udW1DaGVja0FyZ3M7IGktLTspCisg
ICAgICAgIGhpZGRlbkJyYW5jaC5hcmdzW2ldID0gaW5zdC5hcmdzW2kgKyAxXTsKKyAgICByZXR1
cm4gaGlkZGVuQnJhbmNoOworfQorCit2b2lkIENoZWNrU3BlY2lhbDo6Zm9yRWFjaEFyZyhJbnN0
JiBpbnN0LCBjb25zdCBTY29wZWRMYW1iZGE8SW5zdDo6RWFjaEFyZ0NhbGxiYWNrPiYgY2FsbGJh
Y2spCit7CisgICAgaGlkZGVuQnJhbmNoKGluc3QpLmZvckVhY2hBcmcoY2FsbGJhY2spOworICAg
IGZvckVhY2hBcmdJbXBsKG51bUIzQXJncyhpbnN0KSwgbV9udW1DaGVja0FyZ3MgKyAxLCBpbnN0
LCBjYWxsYmFjayk7Cit9CisKK2Jvb2wgQ2hlY2tTcGVjaWFsOjppc1ZhbGlkKEluc3QmIGluc3Qp
Cit7CisgICAgcmV0dXJuIGhpZGRlbkJyYW5jaChpbnN0KS5pc1ZhbGlkKCkKKyAgICAgICAgJiYg
aXNWYWxpZEltcGwobnVtQjNBcmdzKGluc3QpLCBtX251bUNoZWNrQXJncyArIDEsIGluc3QpOwor
fQorCitib29sIENoZWNrU3BlY2lhbDo6YWRtaXRzU3RhY2soSW5zdCYgaW5zdCwgdW5zaWduZWQg
YXJnSW5kZXgpCit7CisgICAgaWYgKGFyZ0luZGV4ID49IDEgJiYgYXJnSW5kZXggPCAxICsgbV9u
dW1DaGVja0FyZ3MpCisgICAgICAgIHJldHVybiBoaWRkZW5CcmFuY2goaW5zdCkuYWRtaXRzU3Rh
Y2soYXJnSW5kZXggLSAxKTsKKyAgICByZXR1cm4gYWRtaXRzU3RhY2tJbXBsKG51bUIzQXJncyhp
bnN0KSwgbV9udW1DaGVja0FyZ3MgKyAxLCBpbnN0LCBhcmdJbmRleCk7Cit9CisKK0NDYWxsSGVs
cGVyczo6SnVtcCBDaGVja1NwZWNpYWw6OmdlbmVyYXRlKEluc3QmIGluc3QsIENDYWxsSGVscGVy
cyYgaml0LCBHZW5lcmF0aW9uQ29udGV4dCYgY29udGV4dCkKK3sKKyAgICBDQ2FsbEhlbHBlcnM6
Okp1bXAgZmFpbCA9IGhpZGRlbkJyYW5jaChpbnN0KS5nZW5lcmF0ZShqaXQsIGNvbnRleHQpOwor
ICAgIEFTU0VSVChmYWlsLmlzU2V0KCkpOworCisgICAgVmFsdWUqIHZhbHVlID0gaW5zdC5vcmln
aW47CisKKyAgICBWZWN0b3I8VmFsdWVSZXA+IHJlcHM7CisgICAgaWYgKGlzQ2hlY2tNYXRoKHZh
bHVlLT5vcGNvZGUoKSkpIHsKKyAgICAgICAgaWYgKHZhbHVlLT5vcGNvZGUoKSA9PSBDaGVja011
bCkKKyAgICAgICAgICAgIHJlcHMuYXBwZW5kKFZhbHVlUmVwKCkpOworICAgICAgICBlbHNlIGlm
ICh2YWx1ZS0+b3Bjb2RlKCkgPT0gQ2hlY2tTdWIgJiYgdmFsdWUtPmFyZ3NbMF0tPmlzSW50KDAp
KQorICAgICAgICAgICAgcmVwcy5hcHBlbmQoVmFsdWVSZXA6OmNvbnN0YW50KDApKTsKKyAgICAg
ICAgZWxzZQorICAgICAgICAgICAgcmVwcy5hcHBlbmQocmVwRm9yQXJnKGNvbnRleHQuY29kZSwg
aW5zdC5hcmdzWzJdKSk7CisgICAgICAgIHJlcHMuYXBwZW5kKHJlcEZvckFyZyhjb250ZXh0LmNv
ZGUsIGluc3QuYXJnc1sxXSkpOworICAgIH0gZWxzZSB7CisgICAgICAgIEFTU0VSVCh2YWx1ZS0+
b3Bjb2RlKCkgPT0gQ2hlY2spOworICAgICAgICByZXBzLmFwcGVuZChWYWx1ZVJlcDo6Y29uc3Rh
bnQoMSkpOworICAgIH0KKworICAgIGFwcGVuZFJlcHNJbXBsKGNvbnRleHQsIG1fbnVtQ2hlY2tB
cmdzICsgMSwgaW5zdCwgcmVwcyk7CisgICAgCisgICAgY29udGV4dC5sYXRlUGF0aHMuYXBwZW5k
KAorICAgICAgICBjcmVhdGVTaGFyZWRUYXNrPEdlbmVyYXRpb25Db250ZXh0OjpMYXRlUGF0aEZ1
bmN0aW9uPigKKyAgICAgICAgICAgIFs9XSAoQ0NhbGxIZWxwZXJzJiBqaXQsIEdlbmVyYXRpb25D
b250ZXh0JiBjb250ZXh0KSB7CisgICAgICAgICAgICAgICAgZmFpbC5saW5rKCZqaXQpOworICAg
ICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIFN0YWNrbWFwKiBzdGFja21hcCA9IHZhbHVl
LT5zdGFja21hcCgpOworICAgICAgICAgICAgICAgIEFTU0VSVChzdGFja21hcCk7CisKKyAgICAg
ICAgICAgICAgICBTdGFja21hcDo6R2VuZXJhdGlvblBhcmFtcyBwYXJhbXM7CisgICAgICAgICAg
ICAgICAgcGFyYW1zLnZhbHVlID0gdmFsdWU7CisgICAgICAgICAgICAgICAgcGFyYW1zLnN0YWNr
bWFwID0gc3RhY2ttYXA7CisgICAgICAgICAgICAgICAgcGFyYW1zLnJlcHMgPSByZXBzOworICAg
ICAgICAgICAgICAgIHBhcmFtcy51c2VkUmVnaXN0ZXJzID0gc3RhY2ttYXAtPm1fdXNlZFJlZ2lz
dGVyczsKKworICAgICAgICAgICAgICAgIHN0YWNrbWFwLT5tX2dlbmVyYXRvci0+cnVuKGppdCwg
cGFyYW1zKTsKKyAgICAgICAgICAgIH0pKTsKK30KKwordm9pZCBDaGVja1NwZWNpYWw6OmR1bXBJ
bXBsKFByaW50U3RyZWFtJiBvdXQpIGNvbnN0Cit7CisgICAgb3V0LnByaW50KG1fY2hlY2tPcGNv
ZGUsICIoIiwgbV9udW1DaGVja0FyZ3MsICIpIik7Cit9CisKK3ZvaWQgQ2hlY2tTcGVjaWFsOjpk
ZWVwRHVtcEltcGwoUHJpbnRTdHJlYW0mIG91dCkgY29uc3QKK3sKKyAgICBvdXQucHJpbnQoIkIz
OjpDaGVja1ZhbHVlIGxvd2VyZWQgdG8gIiwgbV9jaGVja09wY29kZSwgIiB3aXRoICIsIG1fbnVt
Q2hlY2tBcmdzLCAiIGFyZ3MuIik7Cit9CisKK30gfSAvLyBuYW1lc3BhY2UgSlNDOjpCMworCklu
ZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNDaGVja1NwZWNpYWwuaAo9PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNDaGVja1NwZWNpYWwuaAkocmV2aXNpb24g
MCkKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM0NoZWNrU3BlY2lhbC5oCSh3b3JraW5n
IGNvcHkpCkBAIC0wLDAgKzEsNzQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTUgQXBwbGUg
SW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2Ug
aW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0
aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25z
CisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3Qg
cmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNv
bmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0
aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Cisg
KiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRp
c2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlh
bHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUg
SVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBP
UiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUK
KyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9S
IEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNI
QUxMIEFQUExFIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJF
Q1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05T
RVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJP
Q1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERB
VEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FV
U0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJB
Q1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBP
UiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJ
UyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERB
TUFHRS4gCisgKi8KKworI2lmbmRlZiBCM0NoZWNrU3BlY2lhbF9oCisjZGVmaW5lIEIzQ2hlY2tT
cGVjaWFsX2gKKworI2luY2x1ZGUgIkFpck9wY29kZS5oIgorI2luY2x1ZGUgIkIzU3RhY2ttYXBT
cGVjaWFsLmgiCisKK25hbWVzcGFjZSBKU0MgeyBuYW1lc3BhY2UgQjMgeworCisvLyBXZSB3YW50
IHRvIGxvd2VyIENoZWNrIGluc3RydWN0aW9ucyB0byBhIGJyYW5jaCwgYnV0IHRoZW4gd2Ugd2Fu
dCB0byByb3V0ZSB0aGF0IGJyYW5jaCB0byBvdXIKKy8vIG91dC1vZi1saW5lIGNvZGUgaW5zdGVh
ZCBvZiBkb2luZyBhbnl0aGluZyBlbHNlLiBGb3IgdGhpcyByZWFzb24sIGEgQ2hlY2tTcGVjaWFs
IHdpbGwgcmVtZW1iZXIKKy8vIHdoaWNoIGJyYW5jaCBvcGNvZGUgd2UgaGF2ZSBzZWxlY3RlZCBh
bG9uZyB3aXRoIHRoZSBudW1iZXIgb2YgYXJncyBpbiB0aGUgb3ZlcmxvYWQgd2Ugd2FudC4gSXQK
Ky8vIHdpbGwgY3JlYXRlIGFuIEluc3Qgd2l0aCB0aGF0IG9wY29kZSBwbHVzIHRoZSBhcHByb3By
aWF0ZSBhcmdzIGZyb20gdGhlIG93bmluZyBJbnN0IHdoZW5ldmVyIHlvdQorLy8gY2FsbCBhbnkg
b2YgdGhlIGNhbGxiYWNrcy4KKy8vCisvLyBOb3RlIHRoYXQgZm9yIENoZWNrQWRkLCBDaGVja1N1
YiwgYW5kIENoZWNrTXVsIHdlIGV4cGVjdCB0aGF0IHRoZSBCMyBhcmd1bWVudHMgYXJlIHRoZSBy
ZXZlcnNlCisvLyBvZiB0aGUgQWlyIGFyZ3VtZW50cyAoQWRkKGEsIGIpID0+IEFkZDMyIGIsIGEp
LiBFeGNlcHQ6CisvLyAtIENoZWNrU3ViKDAsIHgpLCB3aGljaCB0dXJucyBpbnRvIEJyYW5jaE5l
ZzMyIHguCisvLyAtIENoZWNrTXVsKGEsIGIpLCB3aGljaCB0dXJucyBpbnRvIE11bDMyIGIsIGEg
YnV0IHdlIHBhc3MgQW55IGZvciBhJ3MgVmFsdWVSZXAuCisKK2NsYXNzIENoZWNrU3BlY2lhbCA6
IHB1YmxpYyBTdGFja21hcFNwZWNpYWwgeworcHVibGljOgorICAgIENoZWNrU3BlY2lhbChBaXI6
Ok9wY29kZSBvcGNvZGUsIHVuc2lnbmVkIG51bUFyZ3MpOworICAgIH5DaGVja1NwZWNpYWwoKTsK
KworICAgIC8vIENvbnN0cnVjdHMgYW5kIHJldHVybnMgdGhlIEluc3QgcmVwcmVzZW50aW5nIHRo
ZSBicmFuY2ggdGhhdCB0aGlzIHdpbGwgdXNlLgorICAgIEluc3QgaGlkZGVuQnJhbmNoKGNvbnN0
IEluc3QmKSBjb25zdDsKKworcHJvdGVjdGVkOgorICAgIHZvaWQgZm9yRWFjaEFyZyhBaXI6Oklu
c3QmLCBjb25zdCBTY29wZWRMYW1iZGE8QWlyOjpJbnN0OjpFYWNoQXJnQ2FsbGJhY2s+Jikgb3Zl
cnJpZGU7CisgICAgYm9vbCBpc1ZhbGlkKEFpcjo6SW5zdCYpIG92ZXJyaWRlOworICAgIGJvb2wg
YWRtaXRzU3RhY2soQWlyOjpJbnN0JiwgdW5zaWduZWQgYXJnSW5kZXgpIG92ZXJyaWRlOworCisg
ICAgLy8gTk9URTogdGhlIGdlbmVyYXRlIG1ldGhvZCB3aWxsIGdlbmVyYXRlIHRoZSBoaWRkZW4g
YnJhbmNoIGFuZCB0aGVuIHJlZ2lzdGVyIGEgTGF0ZVBhdGggdGhhdAorICAgIC8vIGdlbmVyYXRl
cyB0aGUgc3RhY2ttYXAuIFN1cGVyIGNyYXp5IGR1ZGUhCisKKyAgICBDQ2FsbEhlbHBlcnM6Okp1
bXAgZ2VuZXJhdGUoSW5zdCYsIENDYWxsSGVsZXBycyYsIEdlbmVyYXRpb25Db250ZXh0Jikgb3Zl
cnJpZGU7CisKKyAgICB2b2lkIGR1bXBJbXBsKFByaW50U3RyZWFtJikgY29uc3Qgb3ZlcnJpZGU7
CisgICAgdm9pZCBkZWVwRHVtcEltcGwoUHJpbnRTdHJlYW0mKSBjb25zdCBvdmVycmlkZTsKKwor
cHJpdmF0ZToKKyAgICBBaXI6Ok9wY29kZSBtX2NoZWNrT3Bjb2RlOworICAgIHVuc2lnbmVkIG1f
bnVtQ2hlY2tBcmdzOworfTsKKworfSB9IC8vIG5hbWVzcGFjZSBKU0M6OkIzCisKKyNlbmRpZiAv
LyBCM0NoZWNrU3BlY2lhbF9oCisKSW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM0No
ZWNrVmFsdWUuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM0No
ZWNrVmFsdWUuY3BwCShyZXZpc2lvbiAwKQorKysgU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0Iz
Q2hlY2tWYWx1ZS5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSw0MSBAQAorLyoKKyAqIENv
cHlyaWdodCAoQykgMjAxNSBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICog
UmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBv
ciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0
aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlv
bnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAg
bm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFp
bWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNl
IHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlv
bnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRp
b24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24u
CisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIGBgQVMgSVMn
JyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBC
VVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5U
QUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVND
TEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUgorICogQ09OVFJJQlVUT1JT
IEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUws
CisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQg
Tk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNF
UlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElO
VEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJ
TElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICog
KElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9V
VCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhF
IFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLiAKKyAqLworCisjaW5jbHVkZSAiY29uZmlnLmgi
CisjaW5jbHVkZSAiQjNDaGVja1ZhbHVlLmgiCisKK25hbWVzcGFjZSBKU0MgeyBuYW1lc3BhY2Ug
QjMgeworCitDaGVja1ZhbHVlOjp+Q2hlY2tWYWx1ZSgpCit7Cit9CisKK3ZvaWQgQ2hlY2tWYWx1
ZTo6ZHVtcE1ldGEoUHJpbnRTdHJlYW0mIG91dCkgY29uc3QKK3sKKyAgICBvdXQucHJpbnQoInN0
YWNrbWFwID0gIiwgc3RhY2ttYXApOworfQorCit9IH0gLy8gbmFtZXNwYWNlIEpTQzo6QjMKKwpJ
bmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzQ2hlY2tWYWx1ZS5oCj09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0K
LS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM0NoZWNrVmFsdWUuaAkocmV2aXNpb24gMCkK
KysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM0NoZWNrVmFsdWUuaAkod29ya2luZyBjb3B5
KQpAQCAtMCwwICsxLDgwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE1IEFwcGxlIEluYy4g
QWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNv
dXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwg
YXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICog
YXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFp
biB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRp
b25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMg
aW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAg
bm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFp
bWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHBy
b3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBS
T1ZJREVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1Q
TElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJ
TVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBB
UlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBB
UFBMRSBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJ
TkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVO
VElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVN
RU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBP
UgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBB
TkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBT
VFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RI
RVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09G
VFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0Uu
IAorICovCisKKyNpZm5kZWYgQjNDaGVja1ZhbHVlX2gKKyNkZWZpbmUgQjNDaGVja1ZhbHVlX2gK
KworI2luY2x1ZGUgIkIzVmFsdWUuaCIKKyNpbmNsdWRlICJCM1N0YWNrbWFwLmgiCisKK25hbWVz
cGFjZSBKU0MgeyBuYW1lc3BhY2UgQjMgeworCitjbGFzcyBDaGVja1ZhbHVlIDogcHVibGljIENo
ZWNrIHsKK3B1YmxpYzoKKyAgICBzdGF0aWMgYm9vbCBhY2NlcHRzKE9wY29kZSBvcGNvZGUpCisg
ICAgeworICAgICAgICBzd2l0Y2ggKG9wY29kZSkgeworICAgICAgICBjYXNlIENoZWNrQWRkOgor
ICAgICAgICBjYXNlIENoZWNrU3ViOgorICAgICAgICBjYXNlIENoZWNrTXVsOgorICAgICAgICBj
YXNlIENoZWNrOgorICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIGRlZmF1bHQ6Cisg
ICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICB+Q2hlY2tW
YWx1ZSgpOworCisgICAgU3RhY2ttYXAgc3RhY2ttYXA7CisKK3Byb3RlY3RlZDoKKyAgICB2b2lk
IGR1bXBNZXRhKFByaW50U3RyZWFtJikgY29uc3Qgb3ZlcnJpZGU7CisKK3ByaXZhdGU6CisgICAg
ZnJpZW5kIGNsYXNzIFByb2NlZHVyZTsKKworICAgIC8vIFVzZSB0aGlzIGZvcm0gZm9yIENoZWNr
QWRkLCBDaGVja1N1YiwgYW5kIENoZWNrTXVsLgorICAgIENoZWNrVmFsdWUodW5zaWduZWQgaW5k
ZXgsIE9wY29kZSBvcGNvZGUsIE9yaWdpbiBvcmlnaW4sIFZhbHVlKiBsZWZ0LCBWYWx1ZSogcmln
aHQpCisgICAgICAgIDogVmFsdWUoaW5kZXgsIG9wY29kZSwgbGVmdC0+dHlwZSgpLCBvcmlnaW4s
IGxlZnQsIHJpZ2h0KQorICAgIHsKKyAgICAgICAgQVNTRVJUKGlzSW50KHR5cGUoKSkpOworICAg
ICAgICBBU1NFUlQobGVmdC0+dHlwZSgpID09IHJpZ2h0LT50eXBlKCkpOworICAgICAgICBBU1NF
UlQob3Bjb2RlID09IENoZWNrQWRkIHx8IG9wY29kZSA9PSBDaGVja1N1YiB8fCBvcGNvZGUgPT0g
Q2hlY2tNdWwpOworICAgIH0KKworICAgIC8vIFVzZSB0aGlzIGZvcm0gZm9yIENoZWNrLgorICAg
IENoZWNrVmFsdWUodW5zaWduZWQgaW5kZXgsIE9wY29kZSBvcGNvZGUsIE9yaWdpbiBvcmlnaW4s
IFZhbHVlKiBwcmVkaWNhdGUpCisgICAgICAgIDogVmFsdWUoaW5kZXgsIG9wY29kZSwgVm9pZCwg
b3JpZ2luLCBwcmVkaWNhdGUpCisgICAgeworICAgICAgICBBU1NFUlQob3BjZGUgPT0gQ2hlY2sp
OworICAgIH0KK307CisKK30gfSAvLyBuYW1lc3BhY2UgSlNDOjpCMworCisjZW5kaWYgLy8gQjND
aGVja1ZhbHVlX2gKKworCkluZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNDb21tb24u
Y3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM0NvbW1vbi5jcHAJ
KHJldmlzaW9uIDApCisrKyBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNDb21tb24uY3BwCSh3
b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsNjEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTUg
QXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFu
ZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9k
aWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25k
aXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2Rl
IG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0
IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlz
dHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJp
Z2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93
aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBt
YXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09G
VFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQ
UkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRP
LCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5F
U1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVW
RU5UIFNIQUxMIEFQUExFIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFO
WSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBP
UiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAor
ICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBV
U0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VW
RVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4g
Q09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElH
RU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICog
T0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBT
VUNIIERBTUFHRS4gCisgKi8KKworI2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgIkIzQ29t
bW9uLmgiCisKKyNpbmNsdWRlICJERkdDb21tb24uaCIKKyNpbmNsdWRlICJGVExTdGF0ZS5oIgor
I2luY2x1ZGUgIk9wdGlvbnMuaCIKKworbmFtZXNwYWNlIEpTQyB7IG5hbWVzcGFjZSBCMyB7CisK
K2Jvb2wgc2hvdWxkRHVtcElSKCkKK3sKKyAgICByZXR1cm4gRlRMOjp2ZXJib3NlQ29tcGlsYXRp
b25FbmFibGVkKCkgfHwgRlRMOjpzaG91bGREdW1wRGlzYXNzZW1ibHkoKSB8fCBzaG91bGREdW1w
SVJBdEVhY2hQaGFzZSgpOworfQorCitib29sIHNob3VsZER1bXBJUkF0RWFjaFBoYXNlKCkKK3sK
KyAgICByZXR1cm4gT3B0aW9uczo6ZHVtcEdyYXBoQXRFYWNoUGhhc2UoKTsKK30KKworYm9vbCBz
aG91bGRWYWxpZGF0ZUlSKCkKK3sKKyAgICByZXR1cm4gREZHOjp2YWxpZGF0aW9uRW5hYmxlZCgp
IHx8IHNob3VsZFZhbGlkYXRlSVJBdEVhY2hQaGFzZSgpOworfQorCitib29sIHNob3VsZFZhbGlk
YXRlSVJBdEVhY2hQaGFzZSgpCit7CisgICAgcmV0dXJuIE9wdGlvbnM6OnZhbGlkYXRlR3JhcGhB
dEVhY2hQaGFzZSgpOworfQorCitib29sIHNob3VsZFNhdmVJUkJlZm9yZVBoYXNlKCkKK3sKKyAg
ICByZXR1cm4gT3B0aW9uczo6dmVyYm9zZVZhbGlkYXRpb25GYWlsdXJlKCk7Cit9CisKK30gfSAv
LyBuYW1lc3BhY2UgSlNDOjpCMworCkluZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjND
b21tb24uaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNDb21tb24u
aAkocmV2aXNpb24gMCkKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM0NvbW1vbi5oCSh3
b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsNDAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTUg
QXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFu
ZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9k
aWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25k
aXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2Rl
IG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0
IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlz
dHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJp
Z2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93
aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBt
YXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09G
VFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQ
UkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRP
LCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5F
U1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVW
RU5UIFNIQUxMIEFQUExFIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFO
WSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBP
UiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAor
ICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBV
U0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VW
RVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4g
Q09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElH
RU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICog
T0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBT
VUNIIERBTUFHRS4gCisgKi8KKworI2lmbmRlZiBCM0NvbW1vbl9oCisjZGVmaW5lIEIzQ29tbW9u
X2gKKworbmFtZXNwYWNlIEpTQyB7IG5hbWVzcGFjZSBCMyB7CisKK2Jvb2wgc2hvdWxkRHVtcElS
KCk7Citib29sIHNob3VsZER1bXBJUkF0RWFjaFBoYXNlKCk7Citib29sIHNob3VsZFZhbGlkYXRl
SVIoKTsKK2Jvb2wgc2hvdWxkVmFsaWRhdGVJUkF0RWFjaFBoYXNlKCk7Citib29sIHNob3VsZFNh
dmVJUkJlZm9yZVBoYXNlKCk7CisKK30gfSAvLyBuYW1lc3BhY2UgSlNDOjpCMworCisjZW5kaWYg
Ly8gQjNDb21tb25faAorCkluZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNDb21wYXJp
c29uTWF0Y2hlci5wYXR0ZXJucwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUv
YjMvQjNDb21wYXJpc29uTWF0Y2hlci5wYXR0ZXJucwkocmV2aXNpb24gMCkKKysrIFNvdXJjZS9K
YXZhU2NyaXB0Q29yZS9iMy9CM0NvbXBhcmlzb25NYXRjaGVyLnBhdHRlcm5zCSh3b3JraW5nIGNv
cHkpCkBAIC0wLDAgKzEsMzggQEAKKyMgQ29weXJpZ2h0IChDKSAyMDE1IEFwcGxlIEluYy4gQWxs
IHJpZ2h0cyByZXNlcnZlZC4KKyMKKyMgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2Ug
YW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisjIG1vZGlmaWNhdGlvbiwgYXJlIHBl
cm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworIyBhcmUgbWV0
OgorIyAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFi
b3ZlIGNvcHlyaWdodAorIyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0
aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisjIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkg
Zm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisjICAgIG5vdGljZSwgdGhp
cyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUK
KyMgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGgg
dGhlIGRpc3RyaWJ1dGlvbi4KKyMKKyMgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBM
RSBJTkMuIEFORCBJVFMgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJworIyBBTkQgQU5ZIEVYUFJFU1Mg
T1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyMg
VEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9S
IEEgUEFSVElDVUxBUgorIyBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFM
TCBBUFBMRSBJTkMuIE9SIElUUyBDT05UUklCVVRPUlMKKyMgQkUgTElBQkxFIEZPUiBBTlkgRElS
RUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgorIyBDT05T
RVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJF
TUVOVCBPRgorIyBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFU
QSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MKKyMgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNF
RCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KKyMgQ09OVFJBQ1Qs
IFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVS
V0lTRSkKKyMgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdB
UkUsIEVWRU4gSUYgQURWSVNFRCBPRgorIyBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0Uu
CisKK21hdGNoZXIgQ29tcGFyaXNvbk1hdGNoZXIKKworVGVzdExvYWROb3RaZXJvMSA9IEFuZChM
b2FkKGFkZHJlc3MpLCByaWdodCkKK1Rlc3RMb2FkTm90WmVybzIgPSBBbmQobGVmdCwgTG9hZChh
ZGRyZXNzKSkKK1Rlc3ROb3RaZXJvID0gQW5kKGxlZnQsIHJpZ2h0KQorCitUZXN0TG9hZFplcm8x
ID0gRXF1YWwoQW5kKExvYWQoYWRkcmVzcyksIHJpZ2h0KSwgJDApCitUZXN0TG9hZFplcm8yID0g
RXF1YWwoQW5kKGxlZnQsIExvYWQoYWRkcmVzcykpLCAkMCkKK1Rlc3RaZXJvID0gRXF1YWwoQW5k
KGxlZnQsIHJpZ2h0KSwgJDApCisKK0xvYWRFcXVhbDEgPSBFcXVhbChMb2FkKGFkZHJlc3MpLCBy
aWdodCkKK0xvYWRFcXVhbDIgPSBFcXVhbChsZWZ0LCBMb2FkKGFkZHJlc3MpKQorTm90ID0gRXF1
YWwodmFsdWUsICQwKQorRXF1YWwgPSBFcXVhbChsZWZ0LCByaWdodCkKKwpJbmRleDogU291cmNl
L0phdmFTY3JpcHRDb3JlL2IzL0IzQ29uc3QzMlZhbHVlLmNwcAo9PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3Vy
Y2UvSmF2YVNjcmlwdENvcmUvYjMvQjNDb25zdDMyVmFsdWUuY3BwCShyZXZpc2lvbiAwKQorKysg
U291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzQ29uc3QzMlZhbHVlLmNwcAkod29ya2luZyBjb3B5
KQpAQCAtMCwwICsxLDQxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE1IEFwcGxlIEluYy4g
QWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNv
dXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwg
YXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICog
YXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFp
biB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRp
b25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMg
aW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAg
bm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFp
bWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHBy
b3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBS
T1ZJREVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1Q
TElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJ
TVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBB
UlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBB
UFBMRSBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJ
TkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVO
VElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVN
RU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBP
UgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBB
TkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBT
VFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RI
RVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09G
VFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0Uu
IAorICovCisKKyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJCM0NvbnN0MzJWYWx1ZS5o
IgorCituYW1lc3BhY2UgSlNDIHsgbmFtZXNwYWNlIEIzIHsKKworQ29uc3QzMlZhbHVlOjp+Q29u
c3QzMlZhbHVlKCkKK3sKK30KKwordm9pZCBDb25zdDMyVmFsdWU6OmR1bXBNZXRhKFByaW50U3Ry
ZWFtJiBvdXQpIGNvbnN0Cit7CisgICAgb3V0LnByaW50KG1fdmFsdWUpOworfQorCit9IH0gLy8g
bmFtZXNwYWNlIEpTQzo6QjMKKwpJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzQ29u
c3QzMlZhbHVlLmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzQ29u
c3QzMlZhbHVlLmgJKHJldmlzaW9uIDApCisrKyBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjND
b25zdDMyVmFsdWUuaAkod29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDU5IEBACisvKgorICogQ29w
eXJpZ2h0IChDKSAyMDE1IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBS
ZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9y
IHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRo
ZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9u
cyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBu
b3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWlt
ZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2Ug
dGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9u
cyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlv
biBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4K
KyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycn
IEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJV
VCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRB
QklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NM
QUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMg
QkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwK
KyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBO
T1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VS
VklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5U
RVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklM
SVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAo
SU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VU
IE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUg
UE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisKKyNpZm5kZWYgQjNDb25zdDMyVmFs
dWVfaAorI2RlZmluZSBCM0NvbnN0MzJWYWx1ZV9oCisKKyNpbmNsdWRlICJCM1ZhbHVlLmgiCisK
K25hbWVzcGFjZSBKU0MgeyBuYW1lc3BhY2UgQjMgeworCitjbGFzcyBDb25zdDMyVmFsdWUgOiBw
dWJsaWMgVmFsdWUgeworcHVibGljOgorICAgIHN0YXRpYyBib29sIGFjY2VwdHMoT3Bjb2RlIG9w
Y29kZSkgeyByZXR1cm4gb3Bjb2RlID09IENvbnN0MzI7IH0KKyAgICAKKyAgICB+Q29uc3QzMlZh
bHVlKCk7CisgICAgCisgICAgaW50MzJfdCB2YWx1ZSgpIGNvbnN0IHsgcmV0dXJuIG1fdmFsdWU7
IH0KKworcHJvdGVjdGVkOgorICAgIHZvaWQgZHVtcE1ldGEoUHJpbnRTdHJlYW0mKSBjb25zdCBv
dmVycmlkZTsKKworcHJpdmF0ZToKKyAgICBmcmllbmQgY2xhc3MgUHJvY2VkdXJlOworCisgICAg
Q29uc3QzMlZhbHVlKHVuc2lnbmVkIGluZGV4LCBPcmlnaW4gb3JpZ2luLCBpbnQzMl90IHZhbHVl
KQorICAgICAgICA6IFZhbHVlKGluZGV4LCBDb25zdDMyLCBJbnQzMiwgb3JpZ2luKQorICAgICAg
ICAsIG1fdmFsdWUodmFsdWUpCisgICAgeworICAgIH0KKyAgICAKKyAgICBpbnQzMl90IG1fdmFs
dWU7Cit9OworCit9IH0gLy8gbmFtZXNwYWNlIEpTQzo6QjMKKworI2VuZGlmIC8vIEIzQ29uc3Qz
MlZhbHVlX2gKKwpJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzQ29uc3Q2NFZhbHVl
LmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNDb25zdDY0VmFs
dWUuY3BwCShyZXZpc2lvbiAwKQorKysgU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzQ29uc3Q2
NFZhbHVlLmNwcAkod29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDQxIEBACisvKgorICogQ29weXJp
Z2h0IChDKSAyMDE1IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRp
c3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdp
dGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBm
b2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBv
ZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3Rp
Y2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIu
CisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhl
IGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBh
bmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBh
bmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAq
CisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFO
RCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBO
T1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklM
SVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlN
RUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUg
TElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAq
IEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1Qg
TElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklD
RVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJS
VVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZ
LCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5D
TFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9G
IFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9T
U0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisKKyNpbmNsdWRlICJjb25maWcuaCIKKyNp
bmNsdWRlICJCM0NvbnN0NjRWYWx1ZS5oIgorCituYW1lc3BhY2UgSlNDIHsgbmFtZXNwYWNlIEIz
IHsKKworQ29uc3Q2NFZhbHVlOjp+Q29uc3Q2NFZhbHVlKCkKK3sKK30KKwordm9pZCBDb25zdDY0
VmFsdWU6OmR1bXBNZXRhKFByaW50U3RyZWFtJiBvdXQpIGNvbnN0Cit7CisgICAgb3V0LnByaW50
KG1fdmFsdWUpOworfQorCit9IH0gLy8gbmFtZXNwYWNlIEpTQzo6QjMKKwpJbmRleDogU291cmNl
L0phdmFTY3JpcHRDb3JlL2IzL0IzQ29uc3Q2NFZhbHVlLmgKPT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNl
L0phdmFTY3JpcHRDb3JlL2IzL0IzQ29uc3Q2NFZhbHVlLmgJKHJldmlzaW9uIDApCisrKyBTb3Vy
Y2UvSmF2YVNjcmlwdENvcmUvYjMvQjNDb25zdDY0VmFsdWUuaAkod29ya2luZyBjb3B5KQpAQCAt
MCwwICsxLDU5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE1IEFwcGxlIEluYy4gQWxsIHJp
Z2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBh
bmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBl
cm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1l
dDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUg
YWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFu
ZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmlu
YXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNl
LCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGlu
IHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVk
IHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVE
IEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBX
QVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVE
IFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VM
QVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJ
TkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVD
VCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBE
QU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9G
IFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICog
UFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04g
QU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1Qg
TElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNF
KSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUs
IEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICov
CisKKyNpZm5kZWYgQjNDb25zdDY0VmFsdWVfaAorI2RlZmluZSBCM0NvbnN0NjRWYWx1ZV9oCisK
KyNpbmNsdWRlICJCM1ZhbHVlLmgiCisKK25hbWVzcGFjZSBKU0MgeyBuYW1lc3BhY2UgQjMgewor
CitjbGFzcyBDb25zdDY0VmFsdWUgOiBwdWJsaWMgVmFsdWUgeworcHVibGljOgorICAgIHN0YXRp
YyBib29sIGFjY2VwdHMoT3Bjb2RlIG9wY29kZSkgeyByZXR1cm4gb3Bjb2RlID09IENvbnN0NjQ7
IH0KKyAgICAKKyAgICB+Q29uc3Q2NFZhbHVlKCk7CisgICAgCisgICAgaW50NjRfdCB2YWx1ZSgp
IGNvbnN0IHsgcmV0dXJuIG1fdmFsdWU7IH0KKworcHJvdGVjdGVkOgorICAgIHZvaWQgZHVtcE1l
dGEoUHJpbnRTdHJlYW0mKSBjb25zdCBvdmVycmlkZTsKKworcHJpdmF0ZToKKyAgICBmcmllbmQg
Y2xhc3MgUHJvY2VkdXJlOworCisgICAgQ29uc3Q2NFZhbHVlKHVuc2lnbmVkIGluZGV4LCBPcmln
aW4gb3JpZ2luLCBpbnQ2NF90IHZhbHVlKQorICAgICAgICA6IFZhbHVlKGluZGV4LCBDb25zdDY0
LCBJbnQ2NCwgb3JpZ2luKQorICAgICAgICAsIG1fdmFsdWUodmFsdWUpCisgICAgeworICAgIH0K
KyAgICAKKyAgICBpbnQ2NF90IG1fdmFsdWU7Cit9OworCit9IH0gLy8gbmFtZXNwYWNlIEpTQzo6
QjMKKworI2VuZGlmIC8vIEIzQ29uc3Q2NFZhbHVlX2gKKwpJbmRleDogU291cmNlL0phdmFTY3Jp
cHRDb3JlL2IzL0IzQ29uc3REb3VibGVWYWx1ZS5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL0ph
dmFTY3JpcHRDb3JlL2IzL0IzQ29uc3REb3VibGVWYWx1ZS5jcHAJKHJldmlzaW9uIDApCisrKyBT
b3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNDb25zdERvdWJsZVZhbHVlLmNwcAkod29ya2luZyBj
b3B5KQpAQCAtMCwwICsxLDQxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE1IEFwcGxlIElu
Yy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGlu
IHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlv
biwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwor
ICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJl
dGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25k
aXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlv
bnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICog
ICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNj
bGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxz
IHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElT
IFBST1ZJREVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1Ig
SU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisg
KiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBB
IFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFM
TCBBUFBMRSBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNU
LCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VR
VUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NV
UkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRB
LCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNF
RCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNU
LCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1Ig
T1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMg
U09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1B
R0UuIAorICovCisKKyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJCM0NvbnN0RG91Ymxl
VmFsdWUuaCIKKworbmFtZXNwYWNlIEpTQyB7IG5hbWVzcGFjZSBCMyB7CisKK0NvbnN0RG91Ymxl
VmFsdWU6On5Db25zdERvdWJsZVZhbHVlKCkKK3sKK30KKwordm9pZCBDb25zdERvdWJsZVZhbHVl
OjpkdW1wTWV0YShQcmludFN0cmVhbSYgb3V0KSBjb25zdAoreworICAgIG91dC5wcmludGYoIiVs
ZSIsIG1fdmFsdWUpOworfQorCit9IH0gLy8gbmFtZXNwYWNlIEpTQzo6QjMKKwpJbmRleDogU291
cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzQ29uc3REb3VibGVWYWx1ZS5oCj09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0t
IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM0NvbnN0RG91YmxlVmFsdWUuaAkocmV2aXNpb24g
MCkKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM0NvbnN0RG91YmxlVmFsdWUuaAkod29y
a2luZyBjb3B5KQpAQCAtMCwwICsxLDU5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE1IEFw
cGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQg
dXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlm
aWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0
aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBt
dXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBv
ZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3Ry
aWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdo
dAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2lu
ZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0
ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRX
QVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJF
U1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywg
VEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNT
IEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVO
VCBTSEFMTCBBUFBMRSBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkg
RElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1Ig
Q09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAq
IFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNF
LCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVS
IENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENP
TlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VO
Q0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9G
IFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VD
SCBEQU1BR0UuIAorICovCisKKyNpZm5kZWYgQjNDb25zdERvdWJsZVZhbHVlX2gKKyNkZWZpbmUg
QjNDb25zdERvdWJsZVZhbHVlX2gKKworI2luY2x1ZGUgIkIzVmFsdWUuaCIKKworbmFtZXNwYWNl
IEpTQyB7IG5hbWVzcGFjZSBCMyB7CisKK2NsYXNzIENvbnN0RG91YmxlVmFsdWUgOiBwdWJsaWMg
VmFsdWUgeworcHVibGljOgorICAgIHN0YXRpYyBib29sIGFjY2VwdHMoT3Bjb2RlIG9wY29kZSkg
eyByZXR1cm4gb3Bjb2RlID09IENvbnN0RG91YmxlOyB9CisgICAgCisgICAgfkNvbnN0RG91Ymxl
VmFsdWUoKTsKKyAgICAKKyAgICBkb3VibGUgdmFsdWUoKSBjb25zdCB7IHJldHVybiBtX3ZhbHVl
OyB9CisKK3Byb3RlY3RlZDoKKyAgICB2b2lkIGR1bXBNZXRhKFByaW50U3RyZWFtJikgY29uc3Qg
b3ZlcnJpZGU7CisKK3ByaXZhdGU6CisgICAgZnJpZW5kIGNsYXNzIFByb2NlZHVyZTsKKworICAg
IENvbnN0RG91YmxlVmFsdWUodW5zaWduZWQgaW5kZXgsIE9yaWdpbiBvcmlnaW4sIGRvdWJsZSB2
YWx1ZSkKKyAgICAgICAgOiBWYWx1ZShpbmRleCwgQ29uc3REb3VibGUsIERvdWJsZSwgb3JpZ2lu
KQorICAgICAgICAsIG1fdmFsdWUodmFsdWUpCisgICAgeworICAgIH0KKyAgICAKKyAgICBkb3Vi
bGUgbV92YWx1ZTsKK307CisKK30gfSAvLyBuYW1lc3BhY2UgSlNDOjpCMworCisjZW5kaWYgLy8g
QjNDb25zdERvdWJsZVZhbHVlX2gKKwpJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0Iz
Q29udHJvbFZhbHVlLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMv
QjNDb250cm9sVmFsdWUuY3BwCShyZXZpc2lvbiAwKQorKysgU291cmNlL0phdmFTY3JpcHRDb3Jl
L2IzL0IzQ29udHJvbFZhbHVlLmNwcAkod29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDQzIEBACisv
KgorICogQ29weXJpZ2h0IChDKSAyMDE1IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4K
KyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1z
LCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRl
ZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlz
dHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0
CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5n
IGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCBy
ZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2Yg
Y29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9j
dW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3Ry
aWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4g
YGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNM
VURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0Yg
TUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0Ug
QVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SCisgKiBDT05U
UklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwg
U1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJ
TkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09P
RFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVT
SU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICog
T0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBU
T1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFO
WSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNF
RCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisKKyNpbmNsdWRlICJj
b25maWcuaCIKKyNpbmNsdWRlICJCM0NvbnRyb2xWYWx1ZS5oIgorCituYW1lc3BhY2UgSlNDIHsg
bmFtZXNwYWNlIEIzIHsKKworQ29udHJvbFZhbHVlOjp+Q29udHJvbFZhbHVlKCkKK3sKK30KKwor
dm9pZCBDb250cm9sVmFsdWU6OmR1bXBNZXRhKFByaW50U3RyZWFtJiBvdXQpIGNvbnN0Cit7Cisg
ICAgQ29tbWFQcmludGVyIGNvbW1hOworICAgIGZvciAoQmFzaWNCbG9jayogYmxvY2sgOiBtX3N1
Y2Nlc3NvcnMpCisgICAgICAgIG91dC5wcmludChjb21tYSwgcG9pbnRlckR1bXAoYmxvY2spKTsK
K30KKworfSB9IC8vIG5hbWVzcGFjZSBKU0M6OkIzCisKSW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0
Q29yZS9iMy9CM0NvbnRyb2xWYWx1ZS5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0
Q29yZS9iMy9CM0NvbnRyb2xWYWx1ZS5oCShyZXZpc2lvbiAwKQorKysgU291cmNlL0phdmFTY3Jp
cHRDb3JlL2IzL0IzQ29udHJvbFZhbHVlLmgJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSwxMTcg
QEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTUgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2Vy
dmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkg
Zm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHBy
b3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4g
UmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5
cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xs
b3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBt
dXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlz
dCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAg
ICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUg
ZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUg
SU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMs
IElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElF
UyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVS
UE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IKKyAq
IENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVO
VEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElO
Q0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVU
RSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBP
UiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZ
CisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFks
IE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcg
SU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBB
RFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKworI2lmbmRl
ZiBCM0NvbnRyb2xWYWx1ZV9oCisjZGVmaW5lIEIzQ29udHJvbFZhbHVlX2gKKworI2luY2x1ZGUg
IkIzVmFsdWUuaCIKKworbmFtZXNwYWNlIEpTQyB7IG5hbWVzcGFjZSBCMyB7CisKK2NsYXNzIEJh
c2ljQmxvY2s7CisKK2NsYXNzIENvbnRyb2xWYWx1ZSA6IHB1YmxpYyBWYWx1ZSB7CitwdWJsaWM6
CisgICAgc3RhdGljIGJvb2wgYWNjZXB0cyhPcGNvZGUgb3Bjb2RlKQorICAgIHsKKyAgICAgICAg
c3dpdGNoIChvcGNvZGUpIHsKKyAgICAgICAgY2FzZSBKdW1wOgorICAgICAgICBjYXNlIEJyYW5j
aDoKKyAgICAgICAgY2FzZSBSZXR1cm46CisgICAgICAgIGNhc2UgT29wczoKKyAgICAgICAgICAg
IHJldHVybiB0cnVlOworICAgICAgICBjYXNlIFN3aXRjaDogCisgICAgICAgICAgICAvLyBUaGlz
IGlzIGhlcmUgYmVjYXVzZSBTd2l0Y2hWYWx1ZSBpcyBhIHN1YmNsYXNzIG9mIENvbnRyb2xWYWx1
ZSwgc28gd2Ugd2FudAorICAgICAgICAgICAgLy8gc3d0aWNoVmFsdWUtPmFzPENvbnRyb2xWYWx1
ZT4oKSB0byByZXR1cm4gbm9uLW51bGwuCisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAg
ICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgIH0K
KworICAgIHR5cGVkZWYgVmVjdG9yPEJhc2ljQmxvY2sqLCAyPiBTdWNjZXNzb3JMaXN0OworCisg
ICAgfkNvbnRyb2xWYWx1ZSgpOworCisgICAgdW5zaWduZWQgbnVtU3VjY2Vzc29ycygpIGNvbnN0
IHsgcmV0dXJuIG1fc3VjY2Vzc29ycy5zaXplKCk7IH0KKyAgICBCYXNpY0Jsb2NrKiBzdWNjZXNz
b3IodW5zaWduZWQgaW5kZXgpIGNvbnN0IHsgcmV0dXJuIG1fc3VjY2Vzc29yc1tpXTsgfQorICAg
IEJhc2ljQmxvY2sqJiBzdWNjZXNzb3IodW5zaWduZWQgaW5kZXgpIHsgcmV0dXJuIG1fc3VjY2Vz
c29yc1tpXTsgfQorCisgICAgY29uc3QgU3VjY2Vzc29yTGlzdCYgc3VjY2Vzc29ycygpIGNvbnN0
IHsgcmV0dXJuIG1fc3VjY2Vzc29yczsgfQorCitwcm90ZWN0ZWQ6CisgICAgdm9pZCBkdW1wTWV0
YShQcmludFN0cmVhbSYpIGNvbnN0IG92ZXJyaWRlOworCisgICAgLy8gVXNlIHRoaXMgZm9yIHN1
YmNsYXNzZXMuCisgICAgdGVtcGxhdGU8dHlwZW5hbWUuLi4gQXJndW1lbnRzPgorICAgIENvbnRy
b2xWYWx1ZSh1bnNpZ25lZCBpbmRleCwgT3Bjb2RlIG9wY29kZSwgVHlwZSB0eXBlLCBPcmlnaW4g
b3JpZ2luLCBBcmd1bWVudHMuLi4gYXJndW1lbnRzKQorICAgICAgICA6IFZhbHVlKGluZGV4LCBv
cGNvZGUsIHR5cGUsIG9yaWdpbiwgYXJndW1lbnRzLi4uKQorICAgIHsKKyAgICB9CisKKyAgICAv
LyBTdWJjbGFzc2VzIHdpbGwgcG9wdWxhdGUgdGhpcy4KKyAgICBTdWNjZXNzb3JMaXN0IG1fc3Vj
Y2Vzc29yczsKKworcHJpdmF0ZToKKyAgICBmcmllbmQgY2xhc3MgUHJvY2VkdXJlOworCisgICAg
Ly8gVXNlIHRoaXMgZm9yIE9vcHMuCisgICAgQ29udHJvbFZhbHVlKHVuc2lnbmVkIGluZGV4LCBP
cGNvZGUgb3Bjb2RlLCBPcmlnaW4gb3JpZ2luKQorICAgICAgICA6IFZhbHVlKGluZGV4LCBvcGNv
ZGUsIFZvaWQsIG9yaWdpbikKKyAgICB7CisgICAgICAgIEFTU0VSVChvcGNvZGUgPT0gT29wcyk7
CisgICAgfQorCisgICAgLy8gVXNlIHRoaXMgZm9yIFJldHVybi4KKyAgICBDb250cm9sVmFsdWUo
dW5zaWduZWQgaW5kZXgsIE9wY29kZSBvcGNvZGUsIE9yaWdpbiBvcmlnaW4sIFZhbHVlKiByZXN1
bHQpCisgICAgICAgIDogVmFsdWUoaW5kZXgsIG9wY29kZSwgVm9pZCwgb3JpZ2luLCByZXN1bHQp
CisgICAgeworICAgICAgICBBU1NFUlQob3Bjb2RlID09IFJldHVybik7CisgICAgfQorCisgICAg
Ly8gVXNlIHRoaXMgZm9yIEp1bXAuCisgICAgQ29udHJvbFZhbHVlKHVuc2lnbmVkIGluZGV4LCBP
cGNvZGUgb3Bjb2RlLCBPcmlnaW4gb3JpZ2luLCBCYXNpY0Jsb2NrKiB0YXJnZXQpCisgICAgICAg
IDogVmFsdWUoaW5kZXgsIG9wY29kZSwgVm9pZCwgb3JpZ2luKQorICAgIHsKKyAgICAgICAgQVNT
RVJUKG9wY29kZSA9PSBKdW1wKTsKKyAgICAgICAgbV9zdWNjZXNzb3JzLmFwcGVuZCh0YXJnZXQp
OworICAgIH0KKworICAgIC8vIFVzZSB0aGlzIGZvciBCcmFuY2guCisgICAgQ29udHJvbFZhbHVl
KAorICAgICAgICB1bnNpZ25lZCBpbmRleCwgT3Bjb2RlIG9wY29kZSwgT3JpZ2luIG9yaWdpbiwg
VmFsdWUqIHByZWRpY2F0ZSwKKyAgICAgICAgQmFzaWNCbG9jayogeWVzLCBCYXNpY0Jsb2NrKiBu
bykKKyAgICAgICAgOiBWYWx1ZShpbmRleCwgb3Bjb2RlLCBWb2lkLCBvcmlnaW4sIHByZWRpY2F0
ZSkKKyAgICB7CisgICAgICAgIEFTU0VSVChvcGNvZGUgPT0gQnJhbmNoKTsKKyAgICAgICAgbV9z
dWNjZXNzb3JzLmFwcGVuZCh5ZXMpOworICAgICAgICBtX3N1Y2Nlc3NvcnMuYXBwZW5kKG5vKTsK
KyAgICB9Cit9OworCit9IH0gLy8gbmFtZXNwYWNlIEpTQzo6QjMKKworI2VuZGlmIC8vIEIzQ29u
dHJvbFZhbHVlX2gKKwpJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzSW5kZXhNYXAu
aAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNJbmRleE1hcC5oCShy
ZXZpc2lvbiAwKQorKysgU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzSW5kZXhNYXAuaAkod29y
a2luZyBjb3B5KQpAQCAtMCwwICsxLDYzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE1IEFw
cGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQg
dXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlm
aWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0
aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBt
dXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBv
ZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3Ry
aWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdo
dAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2lu
ZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0
ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRX
QVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJF
U1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywg
VEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNT
IEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVO
VCBTSEFMTCBBUFBMRSBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkg
RElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1Ig
Q09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAq
IFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNF
LCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVS
IENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENP
TlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VO
Q0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9G
IFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VD
SCBEQU1BR0UuIAorICovCisKKyNpZm5kZWYgQjNJbmRleE1hcF9oCisjZGVmaW5lIEIzSW5kZXhN
YXBfaAorCituYW1lc3BhY2UgSlNDIHsgbmFtZXNwYWNlIEIzIHsKKworLy8gVGhpcyBpcyBhIG1h
cCBmb3Iga2V5cyB0aGF0IGhhdmUgYW4gaW5kZXgoKS4gSXQncyBzdXBlciBlZmZpY2llbnQgZm9y
IEJhc2ljQmxvY2tzLiBJdCdzIG9ubHkKKy8vIGVmZmljaWVudCBmb3IgVmFsdWVzIGlmIHlvdSBk
b24ndCBjcmVhdGUgdG9vIG1hbnkgb2YgdGhlc2UgbWFwcywgc2luY2UgVmFsdWVzIGNhbiBoYXZl
IHZlcnkKKy8vIHNwYXJzZSBpbmRpY2VzIGFuZCB0aGVyZSBhcmUgYSBsb3Qgb2YgVmFsdWVzLgor
Cit0ZW1wbGF0ZTx0eXBlbmFtZSBLZXksIHR5cGVuYW1lIFZhbHVlPgorY2xhc3MgSW5kZXhNYXAg
eworcHVibGljOgorICAgIGV4cGxpY2l0IEluZGV4TWFwKHNpemVfdCBzaXplID0gMCkKKyAgICB7
CisgICAgICAgIG1fdmVjdG9yLnJlc2l6ZShzaXplKTsKKyAgICB9CisKKyAgICB2b2lkIHJlc2l6
ZShzaXplX3Qgc2l6ZSkKKyAgICB7CisgICAgICAgIG1fdmVjdG9yLnJlc2l6ZShzaXplKTsKKyAg
ICB9CisKKyAgICBWYWx1ZSYgb3BlcmF0b3JbXShzaXplX3QgaW5kZXgpCisgICAgeworICAgICAg
ICByZXR1cm4gbV92ZWN0b3JbaW5kZXhdOworICAgIH0KKyAgICAKKyAgICBjb25zdCBWYWx1ZSYg
b3BlcmF0b3JbXShzaXplX3QgaW5kZXgpIGNvbnN0CisgICAgeworICAgICAgICByZXR1cm4gbV92
ZWN0b3JbaW5kZXhdOworICAgIH0KKyAgICAKK3ByaXZhdGU6CisgICAgVmVjdG9yPFZhbHVlPiBt
X3ZlY3RvcjsKK307CisKK30gfSAvLyBuYW1lc3BhY2UgSlNDOjpCMworCkluZGV4OiBTb3VyY2Uv
SmF2YVNjcmlwdENvcmUvYjMvQjNJbmRleFNldC5oCj09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZh
U2NyaXB0Q29yZS9iMy9CM0luZGV4U2V0LmgJKHJldmlzaW9uIDApCisrKyBTb3VyY2UvSmF2YVNj
cmlwdENvcmUvYjMvQjNJbmRleFNldC5oCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsMTQxIEBA
CisvKgorICogQ29weXJpZ2h0IChDKSAyMDE1IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZl
ZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZv
cm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92
aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJl
ZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJp
Z2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93
aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVz
dCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qg
b2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAg
ZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRp
c3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElO
Qy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJ
TkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMg
T0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBP
U0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SCisgKiBD
T05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRB
TCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNM
VURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUg
R09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1Ig
QlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQor
ICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBP
UiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElO
IEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURW
SVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisKKyNpZm5kZWYg
QjNJbmRleFNldF9oCisjZGVmaW5lIEIzSW5kZXhTZXRfaAorCisjaW5jbHVkZSA8d3RmL0JpdFZl
Y3Rvci5oPgorI2luY2x1ZGUgPHd0Zi9Db21tYVByaW50ZXIuaD4KKworbmFtZXNwYWNlIEpTQyB7
IG5hbWVzcGFjZSBCMyB7CisKKy8vIFRoaXMgaXMgYSBzZXQgZm9yIHRoaW5ncyB0aGF0IGhhdmUg
YW4gaW5kZXgoKS4gSXQncyBzdXBlciBlZmZpY2llbnQgZm9yIEJhc2ljQmxvY2tzLiBJdCdzIG9u
bHkKKy8vIGVmZmljaWVudCBmb3IgVmFsdWVzIGlmIHlvdSBkb24ndCBjcmVhdGUgdG9vIG1hbnkg
b2YgdGhlc2Ugc2V0cywgc2luY2UgVmFsdWVzIGNhbiBoYXZlIHZlcnkgc3BhcnNlCisvLyBpbmRp
Y2VzIGFuZCB0aGVyZSBhcmUgYSBsb3Qgb2YgVmFsdWVzLgorCisvLyBJZiB5b3Ugd2FudCBhIHNl
dCBvZiBCYXNpY0Jsb2NrcywgeW91IGRvIEluZGV4U2V0PEJhc2ljQmxvY2s+LiBTbywgVCA9IEJh
c2ljQmxvY2suCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorY2xhc3MgSW5kZXhTZXQgeworcHVibGlj
OgorICAgIEluZGV4U2V0KCkKKyAgICB7CisgICAgfQorCisgICAgYm9vbCBhZGQoVCogdmFsdWUp
CisgICAgeworICAgICAgICByZXR1cm4gIW1fc2V0LnNldCh2YWx1ZS0+aW5kZXgoKSk7CisgICAg
fQorCisgICAgYm9vbCBjb250YWlucyhUKiB2YWx1ZSkgY29uc3QKKyAgICB7CisgICAgICAgIGlm
ICghdmFsdWUpCisgICAgICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICAgICAgcmV0dXJuIG1f
c2V0LmdldCh2YWx1ZS0+aW5kZXgoKSk7CisgICAgfQorCisgICAgdGVtcGxhdGU8dHlwZW5hbWUg
Q29sbGVjdGlvblR5cGU+CisgICAgY2xhc3MgSXRlcmFibGUgeworICAgIHB1YmxpYzoKKyAgICAg
ICAgSXRlcmFibGUoY29uc3QgQ29sbGVjdGlvblR5cGUmIGNvbGxlY3Rpb24sIGNvbnN0IEluZGV4
U2V0JiBzZXQpCisgICAgICAgICAgICA6IG1fY29sbGVjdGlvbihjb2xsZWN0aW9uKQorICAgICAg
ICAgICAgLCBtX3NldChzZXQpCisgICAgICAgIHsKKyAgICAgICAgfQorCisgICAgICAgIGNsYXNz
IGl0ZXJhdG9yIHsKKyAgICAgICAgcHVibGljOgorICAgICAgICAgICAgaXRlcmF0b3IoKQorICAg
ICAgICAgICAgICAgIDogbV9jb2xsZWN0aW9uKG51bGxwdHIpCisgICAgICAgICAgICB7CisgICAg
ICAgICAgICB9CisKKyAgICAgICAgICAgIGl0ZXJhdG9yKGNvbnN0IENvbGxlY3Rpb25UeXBlJiBj
b2xsZWN0aW9uLCBCaXRWZWN0b3I6OlNldEJpdHNJdGVyYWJsZTo6aXRlcmF0b3IgaXRlcikKKyAg
ICAgICAgICAgICAgICA6IG1fY29sbGVjdGlvbigmY29sbGVjdGlvbikKKyAgICAgICAgICAgICAg
ICAsIG1faXRlcihpdGVyKQorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorCisgICAgICAg
ICAgICBUKiBvcGVyYXRvciooKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVy
biBtX2NvbGxlY3Rpb24tPmF0KCptX2l0ZXIpOworICAgICAgICAgICAgfQorCisgICAgICAgICAg
ICBpdGVyYXRvciYgb3BlcmF0b3IrKygpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAg
bV9pdGVyKys7CisgICAgICAgICAgICAgICAgcmV0dXJuICp0aGlzOworICAgICAgICAgICAgfQor
CisgICAgICAgICAgICBib29sIG9wZXJhdG9yPT0oY29uc3QgaXRlcmF0b3ImIG90aGVyKSBjb25z
dAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBtX2l0ZXIgPT0gb3RoZXIu
bV9pdGVyOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBib29sIG9wZXJhdG9yIT0oY29u
c3QgaXRlcmF0b3ImIG90aGVyKSBjb25zdAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAg
IHJldHVybiAhKCp0aGlzID09IG90aGVyKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICBwcml2
YXRlOgorICAgICAgICAgICAgY29uc3QgQ29sbGVjdGlvblR5cGUqIG1fY29sbGVjdGlvbjsKKyAg
ICAgICAgICAgIEJpdFZlY3Rvcjo6U2V0Qml0c0l0ZXJhYmxlOjppdGVyYXRvciBtX2l0ZXI7Cisg
ICAgICAgIH07CisKKyAgICAgICAgaXRlcmF0b3IgYmVnaW4oKSBjb25zdCB7IHJldHVybiBpdGVy
YXRvcihtX2NvbGxlY3Rpb24sIG1fc2V0LmJlZ2luKCkpOyB9CisgICAgICAgIGl0ZXJhdG9yIGVu
ZCgpIGNvbnN0IHsgcmV0dXJuIGl0ZXJhdG9yKG1fY29sbGVjdGlvbiwgbV9zZXQuZW5kKCkpOyB9
CisKKyAgICBwcml2YXRlOgorICAgICAgICBjb25zdCBDb2xsZWN0aW9uVHlwZSYgbV9jb2xsZWN0
aW9uOworICAgICAgICBjb25zdCBJbmRleFNldCYgbV9zZXQ7CisgICAgfTsKKworICAgIC8vIEZv
ciBiYXNpYyBibG9ja3MsIHlvdSBkbzoKKyAgICAvLyBpbmRleFNldC52YWx1ZXMocHJvY2VkdXJl
KTsKKyAgICAvLworICAgIC8vIEZvciB2YWx1ZXMsIHlvdSBkbzoKKyAgICAvLyBpbmRleFNldC52
YWx1ZXMocHJvY2VkdXJlLnZhbHVlcygpKTsKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBDb2xsZWN0
aW9uVHlwZT4KKyAgICBJdGVyYWJsZTxDb2xsZWN0aW9uVHlwZT4gdmFsdWVzKGNvbnN0IENvbGxl
Y3Rpb25UeXBlJiBjb2xsZWN0aW9uKSBjb25zdAorICAgIHsKKyAgICAgICAgcmV0dXJuIEl0ZXJh
YmxlPENvbGxlY3Rpb25UeXBlPihjb2xsZWN0aW9uKTsKKyAgICB9CisKKyAgICBjb25zdCBCaXRW
ZWN0b3ImIGluZGljZXMoKSBjb25zdCB7IHJldHVybiBtX3NldDsgfQorCisgICAgdm9pZCBkdW1w
KFByaW50U3RyZWFtJiBvdXQpIGNvbnN0CisgICAgeworICAgICAgICBDb21tYVByaW50ZXIgY29t
bWE7CisgICAgICAgIGZvciAoc2l6ZV90IGluZGV4IDogaW5kaWNlcygpLnNldEJpdHMoKSkKKyAg
ICAgICAgICAgIG91dC5wcmludChjb21tYSwgVDo6ZHVtcFByZWZpeCwgaW5kZXgpOworICAgIH0K
KworcHJpdmF0ZToKKyAgICBCaXRWZWN0b3IgbV9zZXQ7Cit9OworCit9IH0gLy8gbmFtZXNwYWNl
IEpTQzo6QjMKKworI2VuZGlmIC8vIEIzSW5kZXhTZXRfaAorCkluZGV4OiBTb3VyY2UvSmF2YVNj
cmlwdENvcmUvYjMvQjNMb3dlcmluZ01hdGNoZXIucGF0dGVybnMKPT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291
cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzTG93ZXJpbmdNYXRjaGVyLnBhdHRlcm5zCShyZXZpc2lv
biAwKQorKysgU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzTG93ZXJpbmdNYXRjaGVyLnBhdHRl
cm5zCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsNDQgQEAKKyMgQ29weXJpZ2h0IChDKSAyMDE1
IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyMKKyMgUmVkaXN0cmlidXRpb24gYW5k
IHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisjIG1vZGlm
aWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0
aW9ucworIyBhcmUgbWV0OgorIyAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVz
dCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorIyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBj
b25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisjIDIuIFJlZGlzdHJpYnV0
aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Cisj
ICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlz
Y2xhaW1lciBpbiB0aGUKKyMgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxz
IHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyMKKyMgVEhJUyBTT0ZUV0FSRSBJUyBQ
Uk9WSURFRCBCWSBBUFBMRSBJTkMuIEFORCBJVFMgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJworIyBB
TkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1Qg
TElNSVRFRCBUTywKKyMgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkg
QU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorIyBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJ
TiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SIElUUyBDT05UUklCVVRPUlMKKyMgQkUgTElB
QkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBM
QVJZLCBPUgorIyBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1J
VEVEIFRPLCBQUk9DVVJFTUVOVCBPRgorIyBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBM
T1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MKKyMgSU5URVJSVVBUSU9O
KSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIg
SU4KKyMgQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdM
SUdFTkNFIE9SIE9USEVSV0lTRSkKKyMgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNF
IE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRgorIyBUSEUgUE9TU0lCSUxJVFkg
T0YgU1VDSCBEQU1BR0UuCisKK21hdGNoZXIgTG93ZXJpbmdNYXRjaGVyCisKKyMgVGhlc2UgcnVs
ZXMgYXJlIGNvbnNpZGVyZWQgaW4gYSBjYXNjYWRlLCBzdGFydGluZyBhdCB0aGUgdG9wLiBJdCdz
IGltcGxlbmVudGVkIHVzaW5nIHN3aXRjaAorIyBzdGF0ZW1lbnRzIHdoZXJldmVyIHBvc3NpYmxl
LgorCisjIE5vdGU6IGFkZGluZyBtb3JlIHJ1bGVzIHRvIHRoaXMgbWF0Y2hlciBpcyBhbiBleGNl
bGxlbnQgd2F5IG9mIGltcHJvdmluZyBwZXJmb3JtYW5jZSEKKworTG9hZCA9IExvYWQoYWRkcmVz
cykKKworIyBXZSBwcm9iYWJseSBkb24ndCBuZWVkIHRoZXNlIGZvcm1zLgorQWRkTG9hZDEgPSBB
ZGQoTG9hZChhZGRyZXNzKSwgdmFsdWUpCitBZGRMb2FkMiA9IEFkZCh2YWx1ZSwgTG9hZChhZGRy
ZXNzKSkKK0FkZCA9IEFkZChsZWZ0LCByaWdodCkKKworU3RvcmVBZGRMb2FkMSA9IFN0b3JlKEFk
ZChMb2FkKGFkZHJlc3MpLCB2YWx1ZSksIGFkZHJlc3MpCitTdG9yZUFkZExvYWQyID0gU3RvcmUo
QWRkKHZhbHVlLCBMb2FkKGFkZHJlc3MpKSwgYWRkcmVzcykKK1N0b3JlQW5kTG9hZCA9IFN0b3Jl
KEFuZChMb2FkKGFkZHJlc3MpLCB2YWx1ZSksIGFkZHJlc3MpCitTdG9yZSA9IFN0b3JlKHZhbHVl
LCBhZGRyZXNzKQorCitSZXR1cm4gPSBSZXR1cm4odmFsdWUpCisKSW5kZXg6IFNvdXJjZS9KYXZh
U2NyaXB0Q29yZS9iMy9CM01lbW9yeVZhbHVlLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2
YVNjcmlwdENvcmUvYjMvQjNNZW1vcnlWYWx1ZS5jcHAJKHJldmlzaW9uIDApCisrKyBTb3VyY2Uv
SmF2YVNjcmlwdENvcmUvYjMvQjNNZW1vcnlWYWx1ZS5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTAs
MCArMSw0MiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNSBBcHBsZSBJbmMuIEFsbCByaWdo
dHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5k
IGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJt
aXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6
CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFi
b3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQg
dGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFy
eSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwg
dGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0
aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3
aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBC
WSBBUFBMRSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FS
UkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBX
QVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFS
CisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5D
LiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1Qs
IElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFN
QUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBT
VUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBS
T0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFO
WSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJ
QUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkg
QVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBF
VkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLiAKKyAqLwor
CisjaW5jbHVkZSAiY29uZmlnLmgiCisjaW5jbHVkZSAiQjNNZW1vcnlWYWx1ZS5oIgorCituYW1l
c3BhY2UgSlNDIHsgbmFtZXNwYWNlIEIzIHsKKworTWVtb3J5VmFsdWU6On5NZW1vcnlWYWx1ZSgp
Cit7Cit9CisKK3ZvaWQgTWVtb3J5VmFsdWU6OmR1bXBNZXRhKFByaW50U3RyZWFtJiBvdXQpIGNv
bnN0Cit7CisgICAgaWYgKG1fb2Zmc2V0KQorICAgICAgICBvdXQucHJpbnQoIm9mZnNldCA9ICIs
IG1fb2Zmc2V0KTsKK30KKworfSB9IC8vIG5hbWVzcGFjZSBKU0M6OkIzCisKSW5kZXg6IFNvdXJj
ZS9KYXZhU2NyaXB0Q29yZS9iMy9CM01lbW9yeVZhbHVlLmgKPT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNl
L0phdmFTY3JpcHRDb3JlL2IzL0IzTWVtb3J5VmFsdWUuaAkocmV2aXNpb24gMCkKKysrIFNvdXJj
ZS9KYXZhU2NyaXB0Q29yZS9iMy9CM01lbW9yeVZhbHVlLmgJKHdvcmtpbmcgY29weSkKQEAgLTAs
MCArMSwxNDIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTUgQXBwbGUgSW5jLiBBbGwgcmln
aHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFu
ZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVy
bWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0
OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBh
Ym92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5k
IHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5h
cnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2Us
IHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4g
dGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQg
d2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQg
QlkgQVBQTEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdB
UlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQg
V0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxB
UgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElO
Qy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNU
LCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERB
TUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0Yg
U1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQ
Uk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBB
TlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBM
SUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0Up
IEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwg
RVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8K
KworI2lmbmRlZiBCM01lbW9yeVZhbHVlX2gKKyNkZWZpbmUgQjNNZW1vcnlWYWx1ZV9oCisKKyNp
bmNsdWRlICJCM1ZhbHVlLmgiCisKK25hbWVzcGFjZSBKU0MgeyBuYW1lc3BhY2UgQjMgeworCitj
bGFzcyBNZW1vcnlWYWx1ZSA6IHB1YmxpYyBWYWx1ZSB7CitwdWJsaWM6CisgICAgc3RhdGljIGJv
b2wgYWNjZXB0cyhPcGNvZGUgb3Bjb2RlKQorICAgIHsKKyAgICAgICAgc3dpdGNoIChvcGNvZGUp
IHsKKyAgICAgICAgY2FzZSBMb2FkOFo6CisgICAgICAgIGNhc2UgTG9hZDhTOgorICAgICAgICBj
YXNlIExvYWQxNlo6CisgICAgICAgIGNhc2UgTG9hZDE2UzoKKyAgICAgICAgY2FzZSBMb2FkRmxv
YXQ6CisgICAgICAgIGNhc2UgTG9hZDoKKyAgICAgICAgY2FzZSBTdG9yZTg6CisgICAgICAgIGNh
c2UgU3RvcmUxNjoKKyAgICAgICAgY2FzZSBTdG9yZUZsb2F0OgorICAgICAgICBjYXNlIFN0b3Jl
OgorICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAg
ICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICB+TWVtb3J5VmFsdWUoKTsK
KworICAgIGludHB0cl90IG9mZnNldCgpIGNvbnN0IHsgcmV0dXJuIG1fb2Zmc2V0OyB9CisKK3By
b3RlY3RlZDoKKyAgICB2b2lkIGR1bXBNZXRhKFByaW50U3RyZWFtJikgY29uc3Qgb3ZlcnJpZGU7
CisKK3ByaXZhdGU6CisgICAgZnJpZW5kIGNsYXNzIFByb2NlZHVyZTsKKworICAgIC8vIFVzZSB0
aGlzIGZvcm0gZm9yIExvYWQgKGJ1dCBub3QgTG9hZDhaLCBMb2FkOFMsIG9yIGFueSBvZiB0aGUg
TG9hZHMgdGhhdCBoYXZlIGEgc3VmZml4IHRoYXQKKyAgICAvLyBkZXNjcmliZXMgdGhlIHJldHVy
bmVkIHR5cGUpLgorICAgIE1lbW9yeVZhbHVlKAorICAgICAgICB1bnNpZ25lZCBpbmRleCwgT3Bj
b2RlIG9wY29kZSwgVHlwZSB0eXBlLCBPcmlnaW4gb3JpZ2luLCBWYWx1ZSogcG9pbnRlciwKKyAg
ICAgICAgaW50cHRyX3Qgb2Zmc2V0ID0gMCkKKyAgICAgICAgOiBWYWx1ZShpbmRleCwgb3Bjb2Rl
LCB0eXBlLCBvcmlnaW4sIHBvaW50ZXIpCisgICAgICAgICwgbV9vZmZzZXQob2Zmc2V0KQorICAg
IHsKKyAgICAgICAgaWYgKCFBU1NFUlRfRElTQUJMRUQpIHsKKyAgICAgICAgICAgIHN3aXRjaCAo
b3Bjb2RlKSB7CisgICAgICAgICAgICBjYXNlIExvYWQ6CisgICAgICAgICAgICAgICAgYnJlYWs7
CisgICAgICAgICAgICBjYXNlIExvYWQ4WjoKKyAgICAgICAgICAgIGNhc2UgTG9hZDhTOgorICAg
ICAgICAgICAgY2FzZSBMb2FkMTZaOgorICAgICAgICAgICAgY2FzZSBMb2FkMTZTOgorICAgICAg
ICAgICAgICAgIEFTU0VSVCh0eXBlID09IEludDMyKTsKKyAgICAgICAgICAgICAgICBicmVhazsK
KyAgICAgICAgICAgIGNhc2UgTG9hZEZsb2F0OgorICAgICAgICAgICAgICAgIEFTU0VSVCh0eXBl
ID09IERvdWJsZSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIFN0
b3JlODoKKyAgICAgICAgICAgIGNhc2UgU3RvcmUxNjoKKyAgICAgICAgICAgIGNhc2UgU3RvcmVG
bG9hdDoKKyAgICAgICAgICAgIGNhc2UgU3RvcmU6CisgICAgICAgICAgICAgICAgQVNTRVJUKHR5
cGUgPT0gVm9pZCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0
OgorICAgICAgICAgICAgICAgIEFTU0VSVF9OT1RfUkVBQ0hFRCgpOworICAgICAgICAgICAgfQor
ICAgICAgICB9CisgICAgfQorCisgICAgLy8gVXNlIHRoaXMgZm9ybSBmb3IgbG9hZHMgd2hlcmUg
dGhlIHJldHVybiB0eXBlIGlzIGltcGxpZWQuCisgICAgTWVtb3J5VmFsdWUodW5zaWduZWQgaW5k
ZXgsIE9wY29kZSBvcGNvZGUsIE9yaWdpbiBvcmlnaW4sIFZhbHVlKiBwb2ludGVyLCBpbnRwdHJf
dCBvZmZzZXQgPSAwKQorICAgICAgICA6IFZhbHVlKGluZGV4LCBvcGNvZGUsIG9wY29kZSA9PSBM
b2FkRmxvYXQgPyBEb3VibGUgOiBJbnQzMiwgb3JpZ2luLCBwb2ludGVyKQorICAgICAgICAsIG1f
b2Zmc2V0KG9mZnNldCkKKyAgICB7CisgICAgICAgIGlmICghQVNTRVJUX0RJU0FCTEVEKSB7Cisg
ICAgICAgICAgICBzd2l0Y2ggKG9wY29kZSkgeworICAgICAgICAgICAgY2FzZSBMb2FkOFo6Cisg
ICAgICAgICAgICBjYXNlIExvYWQ4UzoKKyAgICAgICAgICAgIGNhc2UgTG9hZDE2WjoKKyAgICAg
ICAgICAgIGNhc2UgTG9hZDE2UzoKKyAgICAgICAgICAgIGNhc2UgTG9hZEZsb2F0OgorICAgICAg
ICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBB
U1NFUlRfTk9UX1JFQUNIRUQoKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAg
IH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIFVzZSB0aGlzIGZvcm0gZm9yIHN0b3Jlcy4K
KyAgICBNZW1vcnlWYWx1ZSgKKyAgICAgICAgdW5zaWduZWQgaW5kZXgsIE9wY29kZSBvcGNvZGUs
IE9yaWdpbiBvcmlnaW4sIFZhbHVlKiB2YWx1ZSwgVmFsdWUqIHBvaW50ZXIsCisgICAgICAgIGlu
dHB0cl90IG9mZnNldCA9IDApCisgICAgICAgIDogVmFsdWUoaW5kZXgsIG9wY29kZSwgVm9pZCwg
b3JpZ2luLCB2YWx1ZSwgcG9pbnRlcikKKyAgICAgICAgLCBtX29mZnNldChvZmZzZXQpCisgICAg
eworICAgICAgICBpZiAoIUFTU0VSVF9ESVNBQkxFRCkgeworICAgICAgICAgICAgc3dpdGNoIChv
cGNvZGUpIHsKKyAgICAgICAgICAgIGNhc2UgU3RvcmU4OgorICAgICAgICAgICAgY2FzZSBTdG9y
ZTE2OgorICAgICAgICAgICAgY2FzZSBTdG9yZUZsb2F0OgorICAgICAgICAgICAgY2FzZSBTdG9y
ZToKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAg
ICAgICAgICAgQVNTRVJUX05PVF9SRUFDSEVEKCk7CisgICAgICAgICAgICAgICAgYnJlYWs7Cisg
ICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9OworCit9IH0gLy8gbmFtZXNwYWNlIEpT
Qzo6QjMKKworI2VuZGlmIC8vIEIzTWVtb3J5VmFsdWVfaAorCkluZGV4OiBTb3VyY2UvSmF2YVNj
cmlwdENvcmUvYjMvQjNPcGNvZGUuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0
Q29yZS9iMy9CM09wY29kZS5jcHAJKHJldmlzaW9uIDApCisrKyBTb3VyY2UvSmF2YVNjcmlwdENv
cmUvYjMvQjNPcGNvZGUuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsNDcgQEAKKy8qCisg
KiBDb3B5cmlnaHQgKEMpIDIwMTUgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoK
KyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdp
dGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRo
YXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmli
dXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAq
ICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlz
Y2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJv
ZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25k
aXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVu
dGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0
aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFT
IElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElO
RywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJD
SEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUg
RElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IKKyAqIENPTlRSSUJV
VE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVD
SUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywg
QlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBP
UiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVT
UyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBM
SUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQK
KyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdB
WSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9G
IFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKworI2luY2x1ZGUgImNvbmZp
Zy5oIgorI2luY2x1ZGUgIkIzT3Bjb2RlLmgiCisKKyNpbmNsdWRlIDx3dGYvUHJpbnRTdHJlYW0u
aD4KKworbmFtZXNwYWNlIFdURiB7CisKK3VzaW5nIG5hbWVzcGFjZSBKU0M6OkIzOworCit2b2lk
IHByaW50SW50ZXJuYWwoUHJpbnRTdHJlYW0mIG91dCwgT3Bjb2RlIG9wY29kZSkKK3sKKyAgICBz
d2l0Y2ggKG9wY29kZSkgeworICAgIGNhc2UgSWRlbnRpdHk6CisgICAgICAgIG91dC5wcmludCgi
SWRlbnRpdHkiKTsKKyAgICAgICAgcmV0dXJuOworICAgICAgICAvLyBGSVhNRQorICAgIH0KKyAg
ICBSRUxFQVNFX0FTU0VSVF9OT1RfUkVBQ0hFRCgpOworfQorCit9IC8vIG5hbWVzcGFjZSBXVEYK
KwpJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzT3Bjb2RlLmgKPT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQot
LS0gU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzT3Bjb2RlLmgJKHJldmlzaW9uIDApCisrKyBT
b3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNPcGNvZGUuaAkod29ya2luZyBjb3B5KQpAQCAtMCww
ICsxLDIxNSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNSBBcHBsZSBJbmMuIEFsbCByaWdo
dHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5k
IGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJt
aXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6
CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFi
b3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQg
dGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFy
eSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwg
dGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0
aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3
aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBC
WSBBUFBMRSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FS
UkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBX
QVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFS
CisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5D
LiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1Qs
IElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFN
QUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBT
VUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBS
T0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFO
WSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJ
QUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkg
QVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBF
VkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLiAKKyAqLwor
CisjaWZuZGVmIEIzT3Bjb2RlX2gKKyNkZWZpbmUgQjNPcGNvZGVfaAorCisjaW5jbHVkZSA8d3Rm
L1N0ZExpYkV4dHJhcy5oPgorCituYW1lc3BhY2UgSlNDIHsgbmFtZXNwYWNlIEIzIHsKKworZW51
bSBPcGNvZGUgOiBpbnQxNl90IHsKKyAgICAvLyBBIG5vLW9wIHRoYXQgcmV0dXJucyBWb2lkLCB1
c2VmdWwgZm9yIHdoZW4geW91IHdhbnQgdG8gcmVtb3ZlIGEgdmFsdWUuCisgICAgTm9wLAorICAg
ICAKKyAgICAvLyBQb2x5bW9ycGhpYyBpZGVudGl0eSwgdXNhYmxlIHdpdGggYW55IHZhbHVlIHR5
cGUuCisgICAgSWRlbnRpdHksCisKKyAgICAvLyBDb25zdGFudHMuIFVzZSB0aGUgQ29uc3RWYWx1
ZSogY2xhc3Nlcy4gQ29uc3RhbnRzIGV4aXN0IGluIHRoZSBjb250cm9sIGZsb3csIHNvIHRoYXQg
d2UgY2FuCisgICAgLy8gcmVhc29uIGFib3V0IHdoZXJlIHdlIHdvdWxkIGNvbnN0cnVjdCB0aGVt
LiBMYXJnZSBjb25zdGFudHMgYXJlIGV4cGVuc2l2ZSB0byBjcmVhdGUuCisgICAgQ29uc3QzMiwK
KyAgICBDb25zdDY0LAorICAgIENvbnN0RG91YmxlLAorCisgICAgLy8gVGhlIG1hZ2ljYWwgc3Rh
Y2sgc2xvdC4gVGhpcyBpcyB2aWV3ZWQgYXMgZXhlY3V0aW5nIGF0IHRoZSB0b3Agb2YgdGhlIHBy
b2dyYW0gcmVnYXJkbGVzcyBvZgorICAgIC8vIHdoZXJlIGluIGNvbnRyb2wgZmxvdyB5b3UgcHV0
IGl0LiBFYWNoIGluc3RhbmNlIG9mIGEgU3RhY2tTbG90IFZhbHVlIGdldHMgYSBkaXNqb2ludCBy
YW5nZSBvZgorICAgIC8vIHN0YWNrIG1lbW9yeS4gVXNlIHRoZSBTdGFja1Nsb3RWYWx1ZSBjbGFz
cy4KKyAgICBTdGFja1Nsb3QsCisKKyAgICAvLyBUaGUgbWFnaWNhbCBhcmd1bWVudCByZWdpc3Rl
ci4gVGhpcyBpcyB2aWV3ZWQgYXMgZXhlY3V0aW5nIGF0IHRoZSB0b3Agb2YgdGhlIHByb2dyYW0K
KyAgICAvLyByZWdhcmRsZXNzIG9mIHdoZXJlIGluIGNvbnRyb2wgZmxvdyB5b3UgcHV0IGl0LCBh
bmQgdGhlIGNvbXBpbGVyIHRha2VzIGNhcmUgdG8gZW5zdXJlIHRoYXQgd2UKKyAgICAvLyBkb24n
dCBjbG9iYmVyIHRoZSB2YWx1ZSBieSByZWdpc3RlciBhbGxvY2F0aW9uIG9yIGNhbGxzIChlaXRo
ZXIgYnkgc2F2aW5nIHRoZSBhcmd1bWVudCB0byB0aGUKKyAgICAvLyBzdGFjayBvciBwcmVzZXJ2
aW5nIGl0IGluIGEgY2FsbGVlLXNhdmUgcmVnaXN0ZXIpLiBVc2UgdGhlIEFyZ3VtZW50UmVnVmFs
dWUgY2xhc3MuIFRoZSByZXR1cm4KKyAgICAvLyB0eXBlIGlzIGVpdGhlciBwb2ludGVyKCkgKGZv
ciBHUFJzKSBvciBEb3VibGUgKGZvciBGUFJzKS4KKyAgICBBcmd1bWVudFJlZywKKworICAgIC8v
IFRoZSBmcmFtZSBwb2ludGVyLiBZb3UgY2FuIHB1dCB0aGlzIGFueXdoZXJlIGluIGNvbnRyb2wg
ZmxvdyBidXQgaXQgd2lsbCBhbHdheXMgeWllbGQgdGhlCisgICAgLy8gZnJhbWUgcG9pbnRlciwg
d2l0aCBhIGNhdmVhdDogaWYgb3VyIGNvbXBpbGVyIGNoYW5nZXMgdGhlIGZyYW1lIHBvaW50ZXIg
dGVtcG9yYXJpbHkgZm9yIHNvbWUKKyAgICAvLyBzaWxseSByZWFzb24sIHRoZSBGcmFtZVBvaW50
ZXIgaW50cmluc2ljIHdpbGwgcmV0dXJuIHdoZXJlIHRoZSBmcmFtZSBwb2ludGVyICpzaG91bGQq
IGJlIG5vdAorICAgIC8vIHdoZXJlIGl0IGhhcHBlbnMgdG8gYmUgcmlnaHQgbm93LgorICAgIEZy
YW1lUG9pbnRlciwKKworICAgIC8vIFBvbHltb3JwaGljIG1hdGgsIHVzYWJsZSB3aXRoIGFueSB2
YWx1ZSB0eXBlLgorICAgIEFkZCwKKyAgICBTdWIsCisgICAgTXVsLAorICAgIERpdiwKKworICAg
IC8vIEludGVnZXIgbWF0aC4KKyAgICBDaGlsbERpdiwgLy8gZG9lc24ndCB0cmFwIGV2ZXIsIGJl
aGF2ZXMgbGlrZSBKUyAoeC95KXwwLgorICAgIE1vZCwKKyAgICBCaXRBbmQsCisgICAgQml0T3Is
CisgICAgQml0WG9yLAorICAgIFNobCwKKyAgICBTU2hyLAorICAgIFpTaHIsCisKKyAgICAvLyBD
YXN0cyBhbmQgc3VjaC4KKyAgICAvLyBUYWtlcyBhbmQgcmV0dXJucyBJbnQzMjoKKyAgICBTRXh0
OCwKKyAgICBTRXh0MTYsCisgICAgLy8gVGFrZXMgSW50MzIgYW5kIHJldHVybnMgSW50NjQ6Cisg
ICAgU0V4dDMyLAorICAgIFpFeHQzMiwKKyAgICAvLyBUYWtlcyBhbmQgcmV0dXJucyBEb3VibGU6
CisgICAgRlJvdW5kLAorICAgIC8vIFRha2VzIGludHMgYW5kIHJldHVybnMgRG91YmxlOgorICAg
IElUb0QsCisgICAgLy8gVGFrZXMgRG91YmxlIGFuZCByZXR1cm5zIEludDMyOgorICAgIERUb0kz
MiwKKworICAgIC8vIFBvbHltb3JwaGljIGNvbXBhcmlzb25zLCB1c2FibGUgd2l0aCBhbnkgdmFs
dWUgdHlwZS4gUmV0dXJucyBpbnQzMiAwIG9yIDEuIE5vdGUgdGhhdCAiTm90IgorICAgIC8vIGlz
IGp1c3QgRXF1YWwoeCwgMCkuCisgICAgRXF1YWwsCisgICAgTm90RXF1YWwsCisgICAgTGVzc1Ro
YW4sCisgICAgR3JlYXRlclRoYW4sCisgICAgTGVzc0VxdWFsLAorICAgIEdyZWF0ZXJFcXVhbCwK
KworICAgIC8vIEludGVnZXIgY29tcGFyaXNvbnMuIFJldHVybnMgaW50MzIgMCBvciAxLgorICAg
IEFib3ZlLAorICAgIEJlbG93LAorICAgIEFib3ZlRXF1YWwKKyAgICBCZWxvd0VxdWFsLAorCisg
ICAgLy8gTWVtb3J5IGxvYWRzLiBPcGNvZGUgaW5kaWNhdGVzIGhvdyB3ZSBsb2FkIGFuZCB0aGUg
bG9hZGVkIHR5cGUuIFRoZXNlIHVzZSBNZW1vcnlWYWx1ZS4KKyAgICAvLyBUaGVzZSByZXR1cm4g
SW50MzI6CisgICAgTG9hZDhaLAorICAgIExvYWQ4UywKKyAgICBMb2FkMTZaLAorICAgIExvYWQx
NlMsCisgICAgLy8gVGhpcyByZXR1cm5zIERvdWJsZToKKyAgICBMb2FkRmxvYXQsCisgICAgLy8g
VGhpcyByZXR1cm4gd2hhdGV2ZXIgdGhlIHJldHVybiB0eXBlIGlzOgorICAgIExvYWQsCisKKyAg
ICAvLyBNZW1vcnkgc3RvcmVzLiBPcGNvZGUgaW5kaWNhdGVzIGhvdyB0aGUgdmFsdWUgaXMgc3Rv
cmVkLiBUaGVzZSB1c2UgTWVtb3J5VmFsdWUuCisgICAgLy8gVGhlc2UgdGFrZSBhbiBJbnQzMiB2
YWx1ZToKKyAgICBTdG9yZTgsCisgICAgU3RvcmUxNiwKKyAgICAvLyBUaGlzIHRha2VzIGEgRG91
YmxlIHZhbHVlOgorICAgIFN0b3JlRmxvYXQsCisgICAgLy8gVGhpcyBpcyBhIHBvbHltb3JwaGlj
IHN0b3JlIGZvciBJbnQzMiwgSW50NjQsIGFuZCBEb3VibGU6CisgICAgU3RvcmUsCisKKyAgICAv
LyBUaGlzIGlzIGEgcmVndWxhciBvcmRpbmFyeSBDIGZ1bmN0aW9uIGNhbGwsIHVzaW5nIHRoZSBz
eXN0ZW0gQyBjYWxsaW5nIGNvbnZlbnRpb24uIE1ha2Ugc3VyZQorICAgIC8vIHRoYXQgdGhlIGFy
Z3VtZW50cyBhcmUgcGFzc2VkIHVzaW5nIHRoZSByaWdodCB0eXBlcy4KKyAgICBDQ2FsbCwKKwor
ICAgIC8vIFRoaXMgaXMgYSBwYXRjaHBvaW50LiBVc2UgdGhlIFBhdGNocG9pbnRWYWx1ZSBjbGFz
cy4gVGhpcyBpcyB2aWV3ZWQgYXMgYmVoYXZpbmcgbGlrZSBhIGNhbGwsCisgICAgLy8gYnV0IG9u
bHkgZW1pdHMgY29kZSB2aWEgYSBjb2RlIGdlbmVyYXRpb24gY2FsbGJhY2suIFRoYXQgY2FsbGJh
Y2sgZ2V0cyB0byBlbWl0IGNvZGUgaW5saW5lLgorICAgIC8vIFlvdSBjYW4gcGFzcyBhIHN0YWNr
bWFwIGFsb25nIHdpdGggY29uc3RyYWludHMgb24gaG93IGVhY2ggc3RhY2ttYXAgYXJndW1lbnQg
bXVzdCBiZSBwYXNzZWQuCisgICAgLy8gSXQncyBsZWdhbCB0byByZXF1ZXN0IHRoYXQgYSBzdGFj
a21hcCBhcmd1bWVudCBpcyBpbiBzb21lIHJlZ2lzdGVyIGFuZCBpdCdzIGxlZ2FsIHRvIHJlcXVl
c3QKKyAgICAvLyB0aGF0IGEgc3RhY2ttYXAgYXJndW1lbnQgaXMgYXQgc29tZSBvZmZzZXQgZnJv
bSB0aGUgdG9wIG9mIHRoZSBhcmd1bWVudCBwYXNzaW5nIGFyZWEgb24gdGhlCisgICAgLy8gc3Rh
Y2suCisgICAgUGF0Y2hwb2ludCwKKworICAgIC8vIENoZWNrZWQgbWF0aC4gVXNlIHRoZSBDaGVj
a1ZhbHVlIGNsYXNzLiBMaWtlIGEgUGF0Y2hwb2ludCwgdGhpcyB0YWtlcyBhIGNvZGUgZ2VuZXJh
dGlvbgorICAgIC8vIGNhbGxiYWNrLiBUaGF0IGNhbGxiYWNrIGdldHMgdG8gZW1pdCBzb21lIGNv
ZGUgYWZ0ZXIgdGhlIGVwaWxvZ3VlLCBhbmQgZ2V0cyB0byBsaW5rIHRoZSBqdW1wCisgICAgLy8g
ZnJvbSB0aGUgY2hlY2ssIGFuZCB0aGUgY2hvaWNlIG9mIHJlZ2lzdGVycy4gWW91IGFsc28gZ2V0
IHRvIHN1cHBseSBhIHN0YWNrbWFwLiBOb3RlIHRoYXQgeW91CisgICAgLy8gYXJlIG5vdCBhbGxv
d2VkIHRvIGp1bXAgYmFjayBpbnRvIHRoZSBtYWlubGluZSBjb2RlIGZyb20geW91ciBzbG93IHBh
dGgsIHNpbmNlIHRoZSBjb21waWxlcgorICAgIC8vIHdpbGwgYXNzdW1lIHRoYXQgdGhlIGV4ZWN1
dGlvbiBvZiB0aGVzZSBpbnN0cnVjdGlvbnMgcHJvdmVzIHRoYXQgb3ZlcmZsb3cgZGlkbid0IGhh
cHBlbi4gRm9yCisgICAgLy8gZXhhbXBsZSwgaWYgeW91IGhhdmUgdHdvIENoZWNrQWRkJ3M6Cisg
ICAgLy8KKyAgICAvLyBhID0gQ2hlY2tBZGQoeCwgeSkKKyAgICAvLyBiID0gQ2hlY2tBZGQoeCwg
eSkKKyAgICAvLworICAgIC8vIFRoZW4gaXQncyB2YWxpZCB0byBjaGFuZ2UgdGhpcyB0bzoKKyAg
ICAvLworICAgIC8vIGEgPSBDaGVja0FkZCh4LCB5KQorICAgIC8vIGIgPSBJZGVudGl0eShhKQor
ICAgIC8vCisgICAgLy8gVGhpcyBpcyB2YWxpZCByZWdhcmRsZXNzIG9mIHRoZSBjYWxsYmFja3Mg
dXNlZCBieSB0aGUgdHdvIENoZWNrQWRkcy4gVGhleSBtYXkgaGF2ZSBkaWZmZXJlbnQKKyAgICAv
LyBjYWxsYmFja3MuIFlldCwgdGhpcyB0cmFuc2Zvcm1hdGlvbiBpcyB2YWxpZCBldmVuIGlmIHRo
ZXkgYXJlIGRpZmZlcmVudCBiZWNhdXNlIHdlIGtub3cgdGhhdAorICAgIC8vIGFmdGVyIHRoZSBm
aXJzdCBDaGVja0FkZCBleGVjdXRlcywgdGhlIHNlY29uZCBDaGVja0FkZCBjb3VsZCBub3QgaGF2
ZSBwb3NzaWJseSB0YWtlbiBzbG93CisgICAgLy8gcGF0aC4gVGhlcmVmb3JlLCB0aGUgc2Vjb25k
IENoZWNrQWRkJ3MgY2FsbGJhY2sgaXMgaXJyZWxldmFudC4KKyAgICBDaGVja0FkZCwKKyAgICBD
aGVja1N1YiwKKyAgICBDaGVja011bCwKKworICAgIC8vIENoZWNrIHRoYXQgc2lkZS1leGl0cy4g
VXNlIHRoZSBDaGVja1ZhbHVlIGNsYXNzLiBMaWtlIENoZWNrQWRkIGFuZCBmcmllbmRzLCB0aGlz
IGhhcyBhCisgICAgLy8gc3RhY2ttYXAgd2l0aCBhIGdlbmVyYXRpb24gY2FsbGJhY2suIFRoaXMg
dGFrZXMgYW4gSW50MzIgYXJndW1lbnQgdGhhdCB0aGlzIGJyYW5jaGVzIG9uLCB3aXRoCisgICAg
Ly8gZnVsbCBicmFuY2ggZnVzaW9uIGluIHRoZSBpbnN0cnVjdGlvbiBzZWxlY3Rvci4gQSB0cnVl
IHZhbHVlIGp1bXBzIHRvIHRoZSBnZW5lcmF0b3IncyBzbG93CisgICAgLy8gcGF0aC4KKyAgICBD
aGVjaywKKworICAgIC8vIFNTQSBzdXBwb3J0LCBpbiB0aGUgc3R5bGUgb2YgREZHIFNTQS4KKyAg
ICBVcHNpbG9uLCAvLyBUaGlzIHVzZXMgdGhlIFVwc2lsb25WYWx1ZSBjbGFzcy4KKyAgICBQaGks
CisKKyAgICAvLyBKdW1wLiBVc2VzIHRoZSBDb250cm9sVmFsdWUgY2xhc3MuCisgICAgSnVtcCwK
KyAgICAKKyAgICAvLyBQb2x5bW9ycGhpYyBicmFuY2gsIHVzYWJsZSB3aXRoIGFueSB2YWx1ZSB0
eXBlLiBCcmFuY2hlcyBpZiBub3QgZXF1YWwgdG8gemVyby4gVXNlcyB0aGUKKyAgICAvLyBDb250
cm9sVmFsdWUgY2xhc3MsIHdpdGggdGhlIDAtaW5kZXggc3VjY2Vzc29yIGJlaW5nIHRoZSB0cnVl
IHN1Y2Nlc3Nvci4KKyAgICBCcmFuY2gsCisKKyAgICAvLyBTd2l0Y2guIFN3aXRjaGVzIG92ZXIg
ZWl0aGVyIEludDMyIG9yIEludDY0LiBVc2VzIHRoZSBTd2l0Y2hWYWx1ZSBjbGFzcy4KKyAgICBT
d2l0Y2gsCisKKyAgICAvLyBSZXR1cm4uIE5vdGUgdGhhdCBCMyBwcm9jZWR1cmVzIGRvbid0IGtu
b3cgdGhlaXIgcmV0dXJuIHR5cGUsIHNvIHRoaXMgY2FuIGp1c3QgcmV0dXJuIGFueQorICAgIC8v
IHR5cGUuIFVzZXMgdGhlIENvbnRyb2xWYWx1ZSBjbGFzcy4KKyAgICBSZXR1cm4sCisKKyAgICAv
LyBUaGlzIGlzIGEgdGVybWluYWwgdGhhdCBpbmRpY2F0ZXMgdGhhdCB3ZSB3aWxsIG5ldmVyIGdl
dCBoZXJlLiBVc2VzIHRoZSBDb250cm9sVmFsdWUgY2xhc3MuCisgICAgT29wcworfTsKKworaW5s
aW5lIGJvb2wgaXNDaGVja01hdGgoT3Bjb2RlIG9wY29kZSkKK3sKKyAgICBzd2l0Y2ggKG9wY29k
ZSkgeworICAgIGNhc2UgQ2hlY2tBZGQ6CisgICAgY2FzZSBDaGVja1N1YjoKKyAgICBjYXNlIENo
ZWNrTXVsOgorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICBkZWZhdWx0OgorICAgICAgICByZXR1
cm4gZmFsc2U7CisgICAgfQorfQorCit9IH0gLy8gbmFtZXNwYWNlIEpTQzo6QjMKKworbmFtZXNw
YWNlIFdURiB7CisKK2NsYXNzIFByaW50U3RyZWFtOworCit2b2lkIHByaW50SW50ZXJuYWwoUHJp
bnRTdHJlYW0mLCBKU0M6OkIzOjpPcGNvZGUpOworCit9IC8vIG5hbWVzcGFjZSBXVEYKKworI2Vu
ZGlmIC8vIEIzT3Bjb2RlX2gKKwpJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzT3Jp
Z2luLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNPcmlnaW4u
Y3BwCShyZXZpc2lvbiAwKQorKysgU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzT3JpZ2luLmNw
cAkod29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDM3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAy
MDE1IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlv
biBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAq
IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcg
Y29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2Ug
Y29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMg
bGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBS
ZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNv
cHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZv
bGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3Ro
ZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElT
IFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAq
IEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRF
RCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBG
SVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBO
TyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZP
UiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFS
WSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBU
TywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1Mg
T0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBI
T1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVS
IElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5F
R0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UK
KyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkg
T0YgU1VDSCBEQU1BR0UuIAorICovCisKKyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJC
M09yaWdpbi5oIgorCituYW1lc3BhY2UgSlNDIHsgbmFtZXNwYWNlIEIzIHsKKwordm9pZCBPcmln
aW46OmR1bXAoUHJpbnRTdHJlYW0mIG91dCkgY29uc3QKK3sKKyAgICBvdXQucHJpbnQoIk9yaWdp
bigiLCBSYXdQb2ludGVyKG1fZGF0YSksICIpIik7Cit9CisKK30gfSAvLyBuYW1lc3BhY2UgSlND
OjpCMworCkluZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNPcmlnaW4uaAo9PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNPcmlnaW4uaAkocmV2aXNpb24gMCkK
KysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM09yaWdpbi5oCSh3b3JraW5nIGNvcHkpCkBA
IC0wLDAgKzEsNTUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTUgQXBwbGUgSW5jLiBBbGwg
cmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNl
IGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUg
cGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUg
bWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRo
ZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMg
YW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBi
aW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3Rp
Y2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIg
aW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlk
ZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklE
RUQgQlkgQVBQTEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVE
IFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJ
RUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElD
VUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExF
IElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElS
RUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFM
IERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQg
T0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisg
KiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBP
TiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklD
VCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJ
U0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FS
RSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisg
Ki8KKworI2lmbmRlZiBCM09yaWdpbl9oCisjZGVmaW5lIEIzT3JpZ2luX2gKKworI2luY2x1ZGUg
PHd0Zi9QcmludFN0cmVhbS5oPgorCituYW1lc3BhY2UgSlNDIHsgbmFtZXNwYWNlIEIzIHsKKwor
Ly8gV2hvZXZlciBnZW5lcmF0ZXMgQjNJUiBjYW4gY2hvb3NlIHRvIHB1dCBvcmlnaW5zIG9uIHZh
bHVlcy4gV2hlbiB5b3UgZG8gdGhpcywgQjMgd2lsbCBiZSBhYmxlIHRvCisvLyBhY2NvdW50LCBk
b3duIHRvIHRoZSBtYWNoaW5lIGNvZGUsIHdoaWNoIGluc3RydWN0aW9uIGNvcnJlc3BvbmRzIHRv
IHdoaWNoIG9yaWdpbi4gQjMKKy8vIHRyYW5zZm9ybWF0aW9ucyBtdXN0IHByZXNlcnZlIE9yaWdp
bnMgY2FyZWZ1bGx5LiBJdCdzIGFuIGVycm9yIHRvIHdyaXRlIGEgdHJhbnNmb3JtYXRpb24gdGhh
dAorLy8gZWl0aGVyIGRyb3BzIE9yaWdpbnMgb3IgbGllcyBhYm91dCB0aGVtLgorY2xhc3MgT3Jp
Z2luIHsKK3B1YmxpYzoKKyAgICBleHBsaWNpdCBPcmlnaW4oY29uc3Qgdm9pZCogZGF0YSA9IG51
bGxwdHIpCisgICAgICAgIDogbV9kYXRhKGRhdGEpCisgICAgeworICAgIH0KKworICAgIGNvbnN0
IHZvaWQqIGRhdGEoKSBjb25zdCB7IHJldHVybiBtX2RhdGE7IH0KKworICAgIHZvaWQgZHVtcChQ
cmludFN0cmVhbSYpIGNvbnN0OworICAgIAorcHJpdmF0ZToKKyAgICBjb25zdCB2b2lkKiBtX2Rh
dGE7Cit9OworCit9IH0gLy8gbmFtZXNwYWNlIEpTQzo6QjMKKworI2VuZGlmIC8vIEIzT3JpZ2lu
X2gKKwpJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzUGF0Y2hwb2ludFZhbHVlLmNw
cAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNQYXRjaHBvaW50VmFs
dWUuY3BwCShyZXZpc2lvbiAwKQorKysgU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzUGF0Y2hw
b2ludFZhbHVlLmNwcAkod29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDQzIEBACisvKgorICogQ29w
eXJpZ2h0IChDKSAyMDE1IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBS
ZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9y
IHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRo
ZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9u
cyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBu
b3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWlt
ZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2Ug
dGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9u
cyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlv
biBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4K
KyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycn
IEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJV
VCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRB
QklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NM
QUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMg
QkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwK
KyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBO
T1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VS
VklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5U
RVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklM
SVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAo
SU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VU
IE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUg
UE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisKKyNpbmNsdWRlICJjb25maWcuaCIK
KyNpbmNsdWRlICJCM1BhdGNocG9pbnRWYWx1ZS5oIgorCisjaW5jbHVkZSA8d3RmL0NvbW1hUHJp
bnRlci5oPgorCituYW1lc3BhY2UgSlNDIHsgbmFtZXNwYWNlIEIzIHsKKworUGF0Y2hwb2ludFZh
bHVlOjp+UGF0Y2hwb2ludFZhbHVlKCkKK3sKK30KKwordm9pZCBQYXRjaHBvaW50VmFsdWU6OmR1
bXBNZXRhKFByaW50U3RyZWFtJiBvdXQpIGNvbnN0Cit7CisgICAgb3V0LnByaW50KCJzdGFja21h
cCA9ICIsIHN0YWNrbWFwKTsKK30KKworfSB9IC8vIG5hbWVzcGFjZSBKU0M6OkIzCisKSW5kZXg6
IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM1BhdGNocG9pbnRWYWx1ZS5oCj09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0K
LS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM1BhdGNocG9pbnRWYWx1ZS5oCShyZXZpc2lv
biAwKQorKysgU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzUGF0Y2hwb2ludFZhbHVlLmgJKHdv
cmtpbmcgY29weSkKQEAgLTAsMCArMSw1NyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNSBB
cHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5k
IHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2Rp
ZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRp
dGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUg
bXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qg
b2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0
cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmln
aHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dp
bmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1h
dGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZU
V0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBS
RVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8s
IFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVT
UyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZF
TlQgU0hBTEwgQVBQTEUgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5Z
IERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9S
IENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisg
KiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVT
RSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZF
UiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBD
T05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdF
TkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBP
RiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNV
Q0ggREFNQUdFLiAKKyAqLworCisjaWZuZGVmIEIzUGF0Y2hwb2ludFZhbHVlX2gKKyNkZWZpbmUg
QjNQYXRjaHBvaW50VmFsdWVfaAorCisjaW5jbHVkZSAiQjNWYWx1ZS5oIgorI2luY2x1ZGUgIkIz
U3RhY2ttYXAuaCIKKworbmFtZXNwYWNlIEpTQyB7IG5hbWVzcGFjZSBCMyB7CisKK2NsYXNzIFBh
dGNocG9pbnRWYWx1ZSA6IHB1YmxpYyBWYWx1ZSB7CitwdWJsaWM6CisgICAgc3RhdGljIGJvb2wg
YWNjZXB0cyhPcGNvZGUgb3Bjb2RlKSB7IHJldHVybiBvcGNvZGUgPT0gUGF0Y2hwb2ludDsgfQor
CisgICAgflBhdGNocG9pbnRWYWx1ZSgpOworCisgICAgU3RhY2ttYXAgc3RhY2ttYXA7CisKK3By
b3RlY3RlZDoKKyAgICB2b2lkIGR1bXBNZXRhKFByaW50U3RyZWFtJikgY29uc3Qgb3ZlcnJpZGU7
CisKK3ByaXZhdGU6CisgICAgZnJpZW5kIGNsYXNzIFByb2NlZHVyZTsKKworICAgIFBhdGNocG9p
bnRWYWx1ZSh1bnNpZ25lZCBpbmRleCwgVHlwZSB0eXBlLCBPcmlnaW4gb3JpZ2luLCBjb25zdCBB
ZGphY2VuY3lMaXN0JiBjaGlsZHJlbikKKyAgICAgICAgOiBWYWx1ZShpbmRleCwgUGF0Y2hwb2lu
dCwgdHlwZSwgb3JpZ2luLCBjaGlsZHJlbikKKyAgICB7CisgICAgfQorfTsKKworfSB9IC8vIG5h
bWVzcGFjZSBKU0M6OkIzCisKKyNlbmRpZiAvLyBCM1BhdGNocG9pbnRWYWx1ZV9oCisKSW5kZXg6
IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM1Byb2NlZHVyZS5jcHAKPT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0g
U291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzUHJvY2VkdXJlLmNwcAkocmV2aXNpb24gMCkKKysr
IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM1Byb2NlZHVyZS5jcHAJKHdvcmtpbmcgY29weSkK
QEAgLTAsMCArMSw1NiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNSBBcHBsZSBJbmMuIEFs
bCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3Vy
Y2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFy
ZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFy
ZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4g
dGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9u
cyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGlu
IGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5v
dGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1l
ciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92
aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9W
SURFRCBCWSBBUFBMRSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJ
RUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1Q
TElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJU
SUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQ
TEUgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5E
SVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJ
QUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVO
VCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IK
KyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5E
IE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RS
SUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVS
V0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRX
QVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLiAK
KyAqLworCisjaW5jbHVkZSAiY29uZmlnLmgiCisjaW5jbHVkZSAiQjNQcm9jZWR1cmUuaCIKKwor
I2luY2x1ZGUgIkIzQmFzaWNCbG9jay5oIgorI2luY2x1ZGUgIkIzVmFsdWUuaCIKKworbmFtZXNw
YWNlIEpTQyB7IG5hbWVzcGFjZSBCMyB7CisKK1Byb2NlZHVyZTo6UHJvY2VkdXJlKCkKK3sKK30K
KworUHJvY2VkdXJlOjp+UHJvY2VkdXJlKCkKK3sKK30KKworQmFzaWNCbG9jayogUHJvY2VkdXJl
OjphZGRCbG9jaygpCit7CisgICAgc3RkOjp1bmlxdWVfcHRyPEJhc2ljQmxvY2s+IGJsb2NrID0g
c3RkOjptYWtlX3VuaXF1ZTxCYXNpY0Jsb2NrPihtX2Jsb2Nrcy5zaXplKCkpOworICAgIEJhc2lj
QmxvY2sqIHJlc3VsdCA9IGJsb2NrLmdldCgpOworICAgIG1fYmxvY2tzLmFwcGVuZChXVEY6Om1v
dmUoYmxvY2spKTsKKyAgICByZXR1cm4gcmVzdWx0OworfQorCit2b2lkIFByb2NlZHVyZTo6ZHVt
cChQcmludFN0cmVhbSYgb3V0KSBjb25zdAoreworICAgIGZvciAoQmFzaWNCbG9jayogYmxvY2sg
OiAqdGhpcykKKyAgICAgICAgb3V0LnByaW50KGRlZXBEdW1wKGJsb2NrKSk7Cit9CisKK30gfSAv
LyBuYW1lc3BhY2UgSlNDOjpCMwpJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzUHJv
Y2VkdXJlLmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzUHJvY2Vk
dXJlLmgJKHJldmlzaW9uIDApCisrKyBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNQcm9jZWR1
cmUuaAkod29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDE3NyBAQAorLyoKKyAqIENvcHlyaWdodCAo
QykgMjAxNSBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmli
dXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0
CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93
aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291
cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0
aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICog
Mi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92
ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRo
ZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29y
IG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICog
VEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5Z
CisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJ
TUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBB
TkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAg
SU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJM
RSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVN
UExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlU
RUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBM
T1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElP
TikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hF
VEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElO
RyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUg
VVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklM
SVRZIE9GIFNVQ0ggREFNQUdFLiAKKyAqLworCisjaWZuZGVmIEIzUHJvY2VkdXJlX2gKKyNkZWZp
bmUgQjNQcm9jZWR1cmVfaAorCisjaW5jbHVkZSA8d3RmL0JhZy5oPgorI2luY2x1ZGUgPHd0Zi9G
YXN0TWFsbG9jLmg+CisjaW5jbHVkZSA8d3RmL05vbmNvcHlhYmxlLmg+CisjaW5jbHVkZSA8d3Rm
L1ZlY3Rvci5oPgorCituYW1lc3BhY2UgSlNDIHsgbmFtZXNwYWNlIEIzIHsKKworY2xhc3MgQmFz
aWNCbG9jazsKK2NsYXNzIFZhbHVlOworCitjbGFzcyBQcm9jZWR1cmUgeworICAgIFdURl9NQUtF
X05PTkNPUFlBQkxFKFByb2NlZHVyZSk7CisgICAgV1RGX01BS0VfRkFTVF9BTExPQ0FURUQ7Citw
dWJsaWM6CisKKyAgICBQcm9jZWR1cmUoKTsKKyAgICB+UHJvY2VkdXJlKCk7CisKKyAgICBCYXNp
Y0Jsb2NrKiBhZGRCbG9jaygpOworICAgIAorICAgIHRlbXBsYXRlPHR5cGVuYW1lIFZhbHVlVHlw
ZSwgdHlwZW5hbWUuLi4gQXJndW1lbnRzPgorICAgIFZhbHVlVHlwZSogYWRkKEFyZ3VtZW50cy4u
Lik7CisKKyAgICB2b2lkIGR1bXAoUHJpbnRTdHJlYW0mKSBjb25zdDsKKworICAgIHVuc2lnbmVk
IHNpemUoKSBjb25zdCB7IHJldHVybiBtX2Jsb2Nrcy5zaXplKCk7IH0KKyAgICBCYXNpY0Jsb2Nr
KiBhdCh1bnNpZ25lZCBpbmRleCkgY29uc3QgeyByZXR1cm4gbV9ibG9ja3NbaW5kZXhdOyB9Cisg
ICAgQmFzaWNCbG9jayogb3BlcmF0b3JbXSh1bnNpZ25lZCBpbmRleCkgY29uc3QgeyByZXR1cm4g
YXQoaW5kZXgpOyB9CisKKyAgICBjbGFzcyBpdGVyYXRvciB7CisgICAgcHVibGljOgorICAgICAg
ICBpdGVyYXRvcigpOgorICAgICAgICAgICAgOiBtX3Byb2NlZHVyZShudWxscHRyKQorICAgICAg
ICAgICAgLCBtX2luZGV4KDApCisgICAgICAgIHsKKyAgICAgICAgfQorCisgICAgICAgIGl0ZXJh
dG9yKFByb2NlZHVyZSYgcHJvY2VkdXJlLCB1bnNpZ25lZCBpbmRleCkKKyAgICAgICAgICAgIDog
bV9wcm9jZWR1cmUoJnByb2NlZHVyZSkKKyAgICAgICAgICAgICwgbV9pbmRleChpbmRleCkKKyAg
ICAgICAgeworICAgICAgICB9CisKKyAgICAgICAgQmFzaWNCbG9jayogb3BlcmF0b3IqKCkKKyAg
ICAgICAgeworICAgICAgICAgICAgcmV0dXJuIG1fcHJvY2VkdXJlLT5hdChtX2luZGV4KTsKKyAg
ICAgICAgfQorCisgICAgICAgIGl0ZXJhdG9yJiBvcGVyYXRvcisrKCkKKyAgICAgICAgeworICAg
ICAgICAgICAgbV9pbmRleCA9IGZpbmROZXh0KG1faW5kZXggKyAxKTsKKyAgICAgICAgICAgIHJl
dHVybiAqdGhpczsKKyAgICAgICAgfQorCisgICAgICAgIGJvb2wgb3BlcmF0b3I9PShjb25zdCBp
dGVyYXRvciYgb3RoZXIpIGNvbnN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBtX2lu
ZGV4ID09IG90aGVyLm1faW5kZXg7CisgICAgICAgIH0KKworICAgICAgICBib29sIG9wZXJhdG9y
IT0oY29uc3QgaXRlcmF0b3ImIG90aGVyKSBjb25zdAorICAgICAgICB7CisgICAgICAgICAgICBy
ZXR1cm4gISgqdGhpcyA9PSBvdGhlcik7CisgICAgICAgIH0KKworICAgIHByaXZhdGU6CisgICAg
ICAgIHVuc2lnbmVkIGZpbmROZXh0KHVuc2lnbmVkIGluZGV4KQorICAgICAgICB7CisgICAgICAg
ICAgICB3aGlsZSAoaW5kZXggPCBtX3Byb2NlZHVyZS0+c2l6ZSgpICYmICFtX3Byb2NlZHVyZS0+
YXQoaW5kZXgpKQorICAgICAgICAgICAgICAgIGluZGV4Kys7CisgICAgICAgICAgICByZXR1cm4g
aW5leDsKKyAgICAgICAgfQorCisgICAgICAgIFByb2NlZHVyZSogbV9wcm9jZWR1cmU7CisgICAg
ICAgIHVuc2lnbmVkIG1faW5kZXg7CisgICAgfTsKKworICAgIGl0ZXJhdG9yIGJlZ2luKCkgY29u
c3QgeyByZXR1cm4gaXRlcmF0b3IoKnRoaXMsIDApOyB9CisgICAgaXRlcmF0b3IgZW5kKCkgY29u
c3QgeyByZXR1cm4gaXRlcmF0b3IoKnRoaXMsIG51bUJsb2NrcygpKTsgfQorCisgICAgY2xhc3Mg
VmFsdWVzQ29sbGVjdGlvbiB7CisgICAgcHVibGljOgorICAgICAgICBWYWx1ZXNDb2xsZWN0aW9u
KFByb2NlZHVyZSYgcHJvY2VkdXJlKQorICAgICAgICAgICAgOiBtX3Byb2NlZHVyZShwcm9jZWR1
cmUpCisgICAgICAgIHsKKyAgICAgICAgfQorCisgICAgICAgIGNsYXNzIGl0ZXJhdG9yIHsKKyAg
ICAgICAgcHVibGljOgorICAgICAgICAgICAgaXRlcmF0b3IoKToKKyAgICAgICAgICAgICAgICA6
IG1fcHJvY2VkdXJlKG51bGxwdHIpCisgICAgICAgICAgICAgICAgLCBtX2luZGV4KDApCisgICAg
ICAgICAgICB7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGl0ZXJhdG9yKFByb2NlZHVy
ZSYgcHJvY2VkdXJlLCB1bnNpZ25lZCBpbmRleCkKKyAgICAgICAgICAgICAgICA6IG1fcHJvY2Vk
dXJlKCZwcm9jZWR1cmUpCisgICAgICAgICAgICAgICAgLCBtX2luZGV4KGluZGV4KQorICAgICAg
ICAgICAgeworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBWYWx1ZSogb3BlcmF0b3IqKCkK
KyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbV9wcm9jZWR1cmUtPmJsb2Nr
KG1faW5kZXgpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpdGVyYXRvciYgb3BlcmF0
b3IrKygpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbV9pbmRleCsrOworICAgICAg
ICAgICAgICAgIHJldHVybiAqdGhpczsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgYm9v
bCBvcGVyYXRvcj09KGNvbnN0IGl0ZXJhdG9yJiBvdGhlcikgY29uc3QKKyAgICAgICAgICAgIHsK
KyAgICAgICAgICAgICAgICByZXR1cm4gbV9pbmRleCA9PSBvdGhlci5tX2luZGV4OworICAgICAg
ICAgICAgfQorCisgICAgICAgICAgICBib29sIG9wZXJhdG9yIT0oY29uc3QgaXRlcmF0b3ImIG90
aGVyKSBjb25zdAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiAhKCp0aGlz
ID09IG90aGVyKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICBwcml2YXRlOgorCisgICAgICAg
ICAgICBQcm9jZWR1cmUqIG1fcHJvY2VkdXJlOworICAgICAgICAgICAgdW5zaWduZWQgbV9pbmRl
eDsKKyAgICAgICAgfTsKKworICAgICAgICBpdGVyYXRvciBiZWdpbigpIGNvbnN0IHsgcmV0dXJu
IGl0ZXJhdG9yKG1fcHJvY2VkdXJlLCAwKTsgfQorICAgICAgICBpdGVyYXRvciBlbmQoKSBjb25z
dCB7IHJldHVybiBpdGVyYXRvcihtX3Byb2NlZHVyZSwgbV9wcm9jZWR1cmUubV92YWx1ZXMuc2l6
ZSgpKTsgfQorCisgICAgICAgIHVuc2lnbmVkIHNpemUoKSBjb25zdCB7IHJldHVybiBtX3Byb2Nl
ZHVyZS5tX3ZhbHVlcy5zaXplKCk7IH0KKyAgICAgICAgVmFsdWUqIGF0KHVuc2lnbmVkIGluZGV4
KSBjb25zdCB7IHJldHVybiBtX3Byb2NlZHVyZS5tX3ZhbHVlc1tpbmRleF07IH0KKyAgICAgICAg
VmFsdWUqIG9wZXJhdG9yW10odW5zaWduZWQgaW5kZXgpIGNvbnN0IHsgcmV0dXJuIGF0KGluZGV4
KTsgfQorICAgICAgICAKKyAgICBwcml2YXRlOgorICAgICAgICBQcm9jZWR1cmUmIG1fcHJvY2Vk
dXJlOworICAgIH07CisKKyAgICBWYWx1ZXNDb2xsZWN0aW9uIHZhbHVlcygpIHsgcmV0dXJuIFZh
bHVlc0NvbGxlY3Rpb24oKnRoaXMpOyB9CisKK3ByaXZhdGU6CisgICAgVmVjdG9yPHN0ZDo6dW5p
cXVlX3B0cjxCYXNpY0Jsb2NrPj4gbV9ibG9ja3M7CisgICAgVmVjdG9yPHN0ZDo6dW5pcXVlX3B0
cjxWYWx1ZT4+IG1fdmFsdWVzOworfTsKKworfSB9IC8vIG5hbWVzcGFjZSBKU0M6OkIzCisKKyNl
bmRpZiAvLyBCM1Byb2NlZHVyZV9oCisKSW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9C
M1Byb2NlZHVyZUlubGluZXMuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUv
YjMvQjNQcm9jZWR1cmVJbmxpbmVzLmgJKHJldmlzaW9uIDApCisrKyBTb3VyY2UvSmF2YVNjcmlw
dENvcmUvYjMvQjNQcm9jZWR1cmVJbmxpbmVzLmgJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSw0
NiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNSBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVz
ZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFy
eSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQg
cHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAx
LiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNv
cHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZv
bGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3Jt
IG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBs
aXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAq
ICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRo
ZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBM
RSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElF
UywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5U
SUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQ
VVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUgor
ICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lE
RU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAo
SU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElU
VVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7
IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVP
UlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElU
WSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lO
RyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElG
IEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLiAKKyAqLworCisjaWZu
ZGVmIEIzUHJvY2VkdXJlSW5saW5lc19oCisjZGVmaW5lIEIzUHJvY2VkdXJlSW5saW5lc19oCisK
KyNpbmNsdWRlICJCM0Jhc2ljQmxvY2suaCIKKyNpbmNsdWRlICJCM1Byb2NlZHVyZS5oIgorCitu
YW1lc3BhY2UgSlNDIHsgbmFtZXNwYWNlIEIzIHsKKwordGVtcGxhdGU8dHlwZW5hbWUgVmFsdWVU
eXBlLCB0eXBlbmFtZS4uLiBBcmd1bWVudHM+CitWYWx1ZVR5cGUqIFByb2NlZHVyZTo6YWRkKEFy
Z3VlbnRzLi4uIGFyZ3VtZW50cykKK3sKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8VmFsdWVUeXBlPiB2
YWx1ZShuZXcgVmFsdWVUeXBlKG1fdmFsdWVzLnNpemUoKSwgYXJndW1lbnRzLi4uKSk7CisgICAg
VmFsdWVUeXBlKiByZXN1bHQgPSB2YWx1ZS5nZXQoKTsKKyAgICBtX3ZhbHVlcy5hcHBlbmQoV1RG
Ojptb3ZlKHZhbHVlKSk7CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworfSB9IC8vIG5hbWVzcGFj
ZSBKU0M6OkIzCisKKyNlbmRpZiAvLyBCM1Byb2NlZHVyZUlubGluZXNfaAorCkluZGV4OiBTb3Vy
Y2UvSmF2YVNjcmlwdENvcmUvYjMvQjNTdGFja1Nsb3RWYWx1ZS5jcHAKPT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0g
U291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzU3RhY2tTbG90VmFsdWUuY3BwCShyZXZpc2lvbiAw
KQorKysgU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzU3RhY2tTbG90VmFsdWUuY3BwCSh3b3Jr
aW5nIGNvcHkpCkBAIC0wLDAgKzEsNDEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTUgQXBw
bGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1
c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZp
Y2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRp
b25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11
c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9m
IGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJp
YnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0
CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5n
IGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRl
cmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdB
UkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVT
UyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBU
SEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1Mg
Rk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5U
IFNIQUxMIEFQUExFIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBE
SVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBD
T05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICog
UFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0Us
IERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIg
Q0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09O
VFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5D
RSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0Yg
VEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNI
IERBTUFHRS4gCisgKi8KKworI2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgIkIzU3RhY2tT
bG90VmFsdWUuaCIKKworbmFtZXNwYWNlIEpTQyB7IG5hbWVzcGFjZSBCMyB7CisKK1N0YWNrU2xv
dFZhbHVlOjp+U3RhY2tTbG90VmFsdWUoKQoreworfQorCit2b2lkIFN0YWNrU2xvdFZhbHVlOjpk
dW1wTWV0YShQcmludFN0cmVhbSYgb3V0KSBjb25zdAoreworICAgIG91dC5wcmludCgiYnl0ZVNp
emUgPSAiLCBtX2J5dGVTaXplKTsKK30KKworfSB9IC8vIG5hbWVzcGFjZSBKU0M6OkIzCisKSW5k
ZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM1N0YWNrU2xvdFZhbHVlLmgKPT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PQotLS0gU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzU3RhY2tTbG90VmFsdWUuaAkocmV2aXNp
b24gMCkKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM1N0YWNrU2xvdFZhbHVlLmgJKHdv
cmtpbmcgY29weSkKQEAgLTAsMCArMSw2NSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNSBB
cHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5k
IHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2Rp
ZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRp
dGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUg
bXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qg
b2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0
cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmln
aHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dp
bmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1h
dGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZU
V0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBS
RVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8s
IFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVT
UyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZF
TlQgU0hBTEwgQVBQTEUgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5Z
IERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9S
IENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisg
KiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVT
RSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZF
UiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBD
T05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdF
TkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBP
RiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNV
Q0ggREFNQUdFLiAKKyAqLworCisjaWZuZGVmIEIzU3RhY2tTbG90VmFsdWVfaAorI2RlZmluZSBC
M1N0YWNrU2xvdFZhbHVlX2gKKworI2luY2x1ZGUgIkIzVmFsdWUuaCIKKworbmFtZXNwYWNlIEpT
QyB7IG5hbWVzcGFjZSBCMyB7CisKK2NsYXNzIFN0YWNrU2xvdFZhbHVlIDogcHVibGljIFZhbHVl
IHsKK3B1YmxpYzoKKyAgICBzdGF0aWMgYm9vbCBhY2NlcHRzKE9wY29kZSBvcGNvZGUpIHsgcmV0
dXJuIG9wY29kZSA9PSBTdGFja1Nsb3Q7IH0KKworICAgIH5TdGFja1Nsb3RWYWx1ZSgpOworCisg
ICAgdW5zaWduZWQgYnl0ZVNpemUoKSBjb25zdCB7IHJldHVybiBtX2J5dGVTaXplOyB9CisKKyAg
ICAvLyBUaGlzIGdldHMgYXNzaWduZWQgYXQgdGhlIGVuZCBvZiBjb21waWxhdGlvbi4gWW91IGNh
bm5vdCByZWx5IG9uIGl0IGhhdmluZyBhIG1lYW5pbmdmdWwKKyAgICAvLyB2YWx1ZSB3aGlsZSB0
aGUgY29tcGlsZXIgaXMgcnVubmluZy4KKyAgICBpbnRwdHJfdCBvZmZzZXRGcm9tRlAoKSBjb25z
dCB7IHJldHVybiBtX29mZnNldEZyb21GUDsgfQorCitwcm90ZWN0ZWQ6CisgICAgdm9pZCBkdW1w
TWV0YShQcmludFN0cmVhbSYpIGNvbnN0IG92ZXJyaWRlOworCitwcml2YXRlOgorICAgIGZyaWVu
ZCBjbGFzcyBQcm9jZWR1cmU7CisKKyAgICBTdGFja1Nsb3RWYWx1ZSh1bnNpZ25lZCBpbmRleCwg
T3JpZ2luIG9yaWdpbiwgdW5zaWduZWQgYnl0ZVNpemUpCisgICAgICAgIDogVmFsdWUoaW5kZXgs
IFN0YWNrU2xvdCwgcG9pbnRlcigpLCBvcmlnaW4pCisgICAgICAgICwgbV9ieXRlU2l6ZShieXRl
U2l6ZSkKKyAgICAgICAgLCBtX29mZnNldEZyb21GUCgwKQorICAgIHsKKyAgICB9CisKKyAgICB1
bnNpZ25lZCBtX2J5dGVTaXplOworICAgIGludHB0cl90IG1fb2Zmc2V0RnJvbUZQOworfTsKKwor
fSB9IC8vIG5hbWVzcGFjZSBKU0M6OkIzCisKKyNlbmRpZiAvLyBCM1N0YWNrU2xvdFZhbHVlX2gK
KwpJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzU3RhY2ttYXAuY3BwCj09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM1N0YWNrbWFwLmNwcAkocmV2aXNpb24g
MCkKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM1N0YWNrbWFwLmNwcAkod29ya2luZyBj
b3B5KQpAQCAtMCwwICsxLDQwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE1IEFwcGxlIElu
Yy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGlu
IHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlv
biwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwor
ICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJl
dGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25k
aXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlv
bnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICog
ICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNj
bGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxz
IHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElT
IFBST1ZJREVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1Ig
SU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisg
KiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBB
IFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFM
TCBBUFBMRSBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNU
LCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VR
VUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NV
UkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRB
LCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNF
RCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNU
LCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1Ig
T1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMg
U09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1B
R0UuIAorICovCisKKyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJCM1N0YWNrbWFwLmgi
CisKK25hbWVzcGFjZSBKU0MgeyBuYW1lc3BhY2UgQjMgeworCit2b2lkIFN0YWNrbWFwOjpkdW1w
KFByaW50U3RyZWFtJiBvdXQpIGNvbnN0Cit7CisgICAgb3V0LnByaW50KAorICAgICAgICAie29w
YXF1ZSA9ICIsIFJhd1BvaW50ZXIobV9vcGFxdWUpLCAiLCByZXBzID0gIiwgbGlzdER1bXAobV9y
ZXBzKSwKKyAgICAgICAgIiwgZ2VuZXJhdG9yID0gIiwgUmF3UG9pbnRlcihtX2dlbmVyYXRvci5n
ZXQoKSksICIsIGNsb2JiZXJlZCA9ICIsIG1fY2xvYmJlcmVkLAorICAgICAgICAiLCB1c2VkUmVn
aXN0ZXJzID0gIiwgbV91c2VkUmVnaXN0ZXJzLCAifSIpOworfQorCit9IH0gLy8gbmFtZXNwYWNl
IEpTQzo6QjMKKwpJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzU3RhY2ttYXAuaAo9
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNTdGFja21hcC5oCShyZXZp
c2lvbiAwKQorKysgU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzU3RhY2ttYXAuaAkod29ya2lu
ZyBjb3B5KQpAQCAtMCwwICsxLDEyNiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNSBBcHBs
ZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVz
ZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmlj
YXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlv
bnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVz
dCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2Yg
Y29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmli
dXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQK
KyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcg
ZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVy
aWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FS
RSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNT
IE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRI
RQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBG
T1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQg
U0hBTEwgQVBQTEUgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJ
UkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENP
TlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQ
Uk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwg
REFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBD
QVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05U
UkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNF
IE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBU
SElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0gg
REFNQUdFLiAKKyAqLworCisjaWZuZGVmIEIzU3RhY2ttYXBfaAorI2RlZmluZSBCM1N0YWNrbWFw
X2gKKworI2luY2x1ZGUgIkIzVmFsdWVSZXAuaCIKKyNpbmNsdWRlICJDQ2FsbEhlbHBlcnMuaCIK
KyNpbmNsdWRlICJSZWdpc3RlclNldC5oIgorI2luY2x1ZGUgPHd0Zi9TaGFyZWRUYXNrLmg+CisK
K25hbWVzcGFjZSBKU0MgeyBuYW1lc3BhY2UgQjMgeworCitjbGFzcyBDaGVja1NwZWNpYWw7Citj
bGFzcyBTdGFja21hcFNwZWNpYWw7CitjbGFzcyBWYWx1ZTsKKworY2xhc3MgU3RhY2ttYXAgewor
cHVibGljOgorICAgIHN0cnVjdCBHZW5lcmF0aW9uUGFyYW1zIHsKKyAgICAgICAgLy8gVGhpcyBp
cyB0aGUgVmFsdWUgY29udGFpbmluZyB0aGUgc3RhY2ttYXAuCisgICAgICAgIFZhbHVlKiB2YWx1
ZTsKKworICAgICAgICAvLyBUaGlzIGlzIHRoZSBzdGFja21hcC4KKyAgICAgICAgU3RhY2ttYXAq
IHN0YWNrbWFwOworCisgICAgICAgIC8vIFRoaXMgdGVsbHMgeW91IHRoZSBhY3R1YWwgdmFsdWUg
cmVwcmVzZW50YXRpb25zIHRoYXQgd2VyZSBjaG9zZW4uCisgICAgICAgIFZlY3RvcjxWYWx1ZVJl
cD4gcmVwczsKKworICAgICAgICAvLyBUaGlzIHRlbGxzIHlvdSB0aGUgcmVnaXN0ZXJzIHRoYXQg
d2VyZSB1c2VkLgorICAgICAgICBSZWdpc3RlclNldCB1c2VkUmVnaXN0ZXJzOworICAgIH07Cisg
ICAgCisgICAgdHlwZWRlZiB2b2lkIEdlbmVyYXRvckZ1bmN0aW9uKENDYWxsSGVscGVycyYsIGNv
bnN0IEdlbmVyYXRpb25QYXJhbXMmKTsKKyAgICB0eXBlZGVmIFNoYXJlZFRhc2s8R2VuZXJhdG9y
RnVuY3Rpb24+IEdlbmVyYXRvcjsKKyAgICAKKyAgICBTdGFja21hcCgpCisgICAgeworICAgIH0K
KworICAgIC8vIFNldCBzb21lIG9wYXF1ZSBkYXRhIHRvIGlkZW50aWZ5IHRoaXMgc3RhY2ttYXAu
IFRoaXMgaXMgdXNlZnVsIGJlY2F1c2UgYSBTdGFja21hcC11c2luZyBWYWx1ZQorICAgIC8vIGNh
biBiZSBkdXBsaWNhdGVkLCBhbmQgZWFjaCBkdXBsaWNhdGUgbWF5IGVuZCB1cCBoYXZpbmcgZGlm
ZmVyZW50IHJlZ2lzdGVyIGFsbG9jYXRpb24uIFRoaXMKKyAgICAvLyBhbGxvd3MgYWxsIG9mIHRo
b3NlIGR1cGxpY2F0ZXMgdG8gYmUgYWJsZSB0byByZWZlciBiYWNrIHRvIHdoYXRldmVyIGhpZ2gt
bGV2ZWwgZGF0YSBzdHJ1Y3R1cmVzCisgICAgLy8gd2Ugd2VyZSB1c2luZyB0byBjcmVhdGUgdGhl
IHZhbHVlLgorICAgIHZvaWQgc2V0T3BhcXVlKHZvaWQqIHBhcmFtZXRlcikKKyAgICB7CisgICAg
ICAgIG1fb3BhcXVlID0gcGFyYW1ldGVyOworICAgIH0KKyAgICB2b2lkKiBvcGFxdWUoKSBjb25z
dCB7IHJldHVybiBtX29wYXF1ZTsgfQorCisgICAgLy8gQ29udmVuaWVuY2UgaGVscGVycyB3aGVu
IHVzaW5nIGluZGljZXMgaW5zdGVhZCBvZiBwb2ludGVycy4KKyAgICB2b2lkIHNldE9wYXF1ZUlu
ZGV4KHNpemVfdCBpbmRleCkKKyAgICB7CisgICAgICAgIHNldE9wYXF1ZShiaXR3aXNlX2Nhc3Q8
dm9pZCo+KGluZGV4KSk7CisgICAgfQorICAgIHNpemVfdCBvcGFxdWVJbmRleCgpIGNvbnN0IHsg
cmV0dXJuIGJpdHdpc2VfY2FzdDxzaXplX3Q+KG9wYXF1ZSgpKTsgfQorCisgICAgLy8gQ29uc3Ry
YWluIGFuIGFyZ3VtZW50IHRvIHRoZSBWYWx1ZSB0aGF0IHVzZXMgdGhpcyBTdGFja21hcC4gTm90
ZSB0aGF0IGluZGV4IHplcm8gcmVmZXJzIHRvIHRoZQorICAgIC8vIGZpcnN0IGFyZ3VtZW50IHRv
IHRoYXQgVmFsdWUsIGV2ZW4gaWYgdGhhdCBhcmd1bWVudCBpcyBub3QgY29uc3RyYWluYWJsZS4g
Rm9yIGV4YW1wbGUsIGluIGEKKyAgICAvLyBDaGVja0FkZCB2YWx1ZSwgaXQgd291bGQgYmUgYW4g
ZXJyb3IgdG8gY29uc3RyYWluIGluZGljZXMgMCBhbmQgMS4gSW4gYSBDaGVjayB2YWx1ZSwgaXQg
d291bGQKKyAgICAvLyBiZSBhbiBlcnJvciB0byBjb25zdHJhaW4gaW5kZXggMC4gQnV0LCB3aGVu
IHRoZSBnZW5lcmF0aW9uIGNhbGxiYWNrIGlzIGNhbGxlZCwgeW91IGNhbiBkZXBlbmQKKyAgICAv
LyBvbiB0aGUgcmVwcyBmb3IgdGhvc2UgaW5kaWNlcyBiZWluZyBmaWxsZWQgaW4uCisgICAgdm9p
ZCBjb25zdHJhaW4odW5zaWduZWQgaW5kZXgsIGNvbnN0IFZhbHVlUmVwJiByZXApCisgICAgewor
ICAgICAgICBpZiAoaW5kZXggKyAxIDwgbV9yZXBzLnNpemUoKSkKKyAgICAgICAgICAgIG1fcmVw
cy5ncm93KGluZGV4ICsgMSk7CisgICAgICAgIG1fcmVwc1tpbmRleF0gPSByZXA7CisgICAgfQor
CisgICAgdm9pZCBjbG9iYmVyKGNvbnN0IFJlZ2lzdGVyU2V0JiBzZXQpCisgICAgeworICAgICAg
ICBtX2Nsb2JiZXJlZC5tZXJnZShzZXQpOworICAgIH0KKworICAgIGNvbnN0IFJlZ2lzdGVyU2V0
JiBjbG9iYmVyZWQoKSBjb25zdCB7IHJldHVybiBtX2Nsb2JiZXJlZDsgfQorCisgICAgdm9pZCBz
ZXRHZW5lcmF0b3IoUmVmUHRyPEdlbmVyYXRvcj4gZ2VuZXJhdG9yKQorICAgIHsKKyAgICAgICAg
bV9nZW5lcmF0b3IgPSBnZW5lcmF0b3I7CisgICAgfQorCisgICAgdGVtcGxhdGU8dHlwZW5hbWUg
RnVuY3Rvcj4KKyAgICB2b2lkIHNldEdlbmVyYXRvcihjb25zdCBGdW5jdG9yJiBmdW5jdG9yKQor
ICAgIHsKKyAgICAgICAgbV9nZW5lcmF0b3IgPSBjcmVhdGVTaGFyZWRUYXNrPEdlbmVyYXRvckZ1
bmN0aW9uPihmdW5jdG9yKTsKKyAgICB9CisKKyAgICB2b2lkIGR1bXAoUHJpbnRTdHJlYW0mKSBj
b25zdDsKKyAgICAKK3ByaXZhdGU6CisgICAgZnJpZW5kIGNsYXNzIENoZWNrU3BlY2lhbDsKKyAg
ICBmcmllbmQgY2xhc3MgU3RhY2ttYXBTcGVjaWFsOworICAgIAorICAgIHZvaWQqIG1fb3BhcXVl
IHsgbnVsbHB0ciB9OworICAgIFZlY3RvcjxWYWx1ZVJlcD4gbV9yZXBzOworICAgIFJlZlB0cjxH
ZW5lcmF0b3I+IG1fZ2VuZXJhdG9yOworICAgIFJlZ2lzdGVyU2V0IG1fY2xvYmJlcmVkOworICAg
IFJlZ2lzdGVyU2V0IG1fdXNlZFJlZ2lzdGVyczsgLy8gU3RhY2ttYXBzIGNvdWxkIGJlIGZ1cnRo
ZXIgZHVwbGljYXRlZCBieSBBaXIsIGJ1dCB0aGF0J3MgdW5saWtlbHksIHNvIHdlIGp1c3QgbWVy
Z2UgdGhlIHVzZWQgcmVnaXN0ZXJzIHNldHMgaWYgdGhhdCB3ZXJlIHRvIGhhcHBlbi4KK307CisK
K30gfSAvLyBuYW1lc3BhY2UgSlNDOjpCMworCisjZW5kaWYgLy8gQjNTdGFja21hcF9oCisKSW5k
ZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM1N0YWNrbWFwU3BlY2lhbC5jcHAKPT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzU3RhY2ttYXBTcGVjaWFsLmNwcAko
cmV2aXNpb24gMCkKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM1N0YWNrbWFwU3BlY2lh
bC5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSwyNDIgQEAKKy8qCisgKiBDb3B5cmlnaHQg
KEMpIDIwMTUgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJp
YnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91
dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxv
d2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNv
dXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwg
dGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAq
IDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJv
dmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0
aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9v
ciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAq
IFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFTIElTJycgQU5EIEFO
WQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBM
SU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkg
QU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4g
IElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFC
TEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhF
TVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1J
VEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsg
TE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJ
T04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdI
RVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJ
TkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhF
IFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJ
TElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKworI2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1
ZGUgIkIzU3RhY2ttYXBTcGVjaWFsLmgiCisKK25hbWVzcGFjZSBKU0MgeyBuYW1lc3BhY2UgQjMg
eworCit1c2luZyBuYW1lc3BhY2UgQWlyOworCitTdGFja21hcFNwZWNpYWw6OlN0YWNrbWFwU3Bl
Y2lhbChjb25zdCBjaGFyKiBuYW1lKQorICAgIDogU3BlY2lhbChuYW1lKQoreworfQorCitTdGFj
a21hcFNwZWNpYWw6On5TdGFja21hcFNwZWNpYWwoKQoreworfQorCit2b2lkIFN0YWNrbWFwU3Bl
Y2lhbDo6Zm9yRWFjaEFyZyhJbnN0JiBpbnN0LCBjb25zdCBTY29wZWRMYW1iZGE8SW5zdDo6RWFj
aEFyZ0NhbGxiYWNrPiYgY2FsbGJhY2spCit7CisgICAgcmV0dXJuIGZvckVhY2hBcmdJbXBsKDAs
IDEsIGluc3QsIGNhbGxiYWNrKTsKK30KKworYm9vbCBTdGFja21hcFNwZWNpYWw6OmlzVmFsaWQo
SW5zdCYgaW5zdCkKK3sKKyAgICByZXR1cm4gaXNWYWxpZEltcGwoMCwgMSwgaW5zdCk7Cit9CisK
K2Jvb2wgU3RhY2ttYXBTcGVjaWFsOjphZG1pdHNTdGFjayhJbnN0JiBpbnN0LCB1bnNpZ25lZCBh
cmdJbmRleCkKK3sKKyAgICByZXR1cm4gYWRtaXRzU3RhY2soMCwgMSwgaW5zdCwgYXJnSW5kZXgp
OworfQorCit2b2lkIFN0YWNrbWFwU3BlY2lhbDo6cmVwb3J0VXNlZFJlZ2lzdGVycyhJbnN0JiBp
bnN0LCBjb25zdCBSZWdpc3RlclNldCYgdXNlZFJlZ2lzdGVycykKK3sKKyAgICBWYWx1ZSogdmFs
dWUgPSBpbnN0Lm9yaWdpbjsKKyAgICBTdGFja21hcCogc3RhY2ttYXAgPSB2YWx1ZS0+c3RhY2tt
YXAoKTsKKworICAgIC8vIEZJWE1FOiBJZiB0aGUgSW5zdCB0aGF0IHVzZXMgdGhlIFN0YWNrbWFw
U3BlY2lhbCBnZXRzIGR1cGxpY2F0ZWQsIHRoZW4gd2UgZW5kIHVwIG1lcmdpbmcgdXNlZAorICAg
IC8vIHJlZ2lzdGVyIHNldHMgZnJvbSBtdWx0aXBsZSBwbGFjZXMuIFRoaXMgY3VycmVudGx5IHdv
bid0IGhhcHBlbiBzaW5jZSBBaXIgZG9lc24ndCBoYXZlIHRhaWxkdXAKKyAgICAvLyBvciB0aGlu
Z3MgbGlrZSB0aGF0LiBCdXQgbWF5YmUgZXZlbnR1YWxseSBpdCBjb3VsZCBiZSBhIHByb2JsZW0u
CisgICAgc3RhY2ttYXAtPm1fdXNlZFJlZ2lzdGVycy5tZXJnZSh1c2VkUmVnaXN0ZXJzKTsKK30K
KworY29uc3QgUmVnaXN0ZXJTZXQmIFN0YWNrbWFwU3BlY2lhbDo6ZXh0cmFDbG9iYmVyZWRSZWdz
KEluc3QmIGluc3QpCit7CisgICAgVmFsdWUqIHZhbHVlID0gaW5zdC5vcmlnaW47CisgICAgU3Rh
Y2ttYXAqIHN0YWNrbWFwID0gdmFsdWUtPnN0YWNrbWFwKCk7CisKKyAgICByZXR1cm4gc3RhY2tt
YXAtPmNsb2JiZXJlZCgpOworfQorCit2b2lkIFN0YWNrbWFwU3BlY2lhbDo6Zm9yRWFjaEFyZ0lt
cGwoCisgICAgdW5zaWduZWQgbnVtSWdub3JlZEIzQXJncywgdW5zaWduZWQgbnVtSWdub3JlZEFp
ckFyZ3MsCisgICAgSW5zdCYgaW5zdCwgY29uc3QgU2NvcGVkTGFtYmRhPEluc3Q6OkVhY2hBcmdD
YWxsYmFjaz4mIGNhbGxiYWNrKQoreworICAgIFZhbHVlKiB2YWx1ZSA9IGluc3Qub3JpZ2luOwor
CisgICAgLy8gQ2hlY2sgdGhhdCBpbnNhbmUgdGhpbmdzIGhhdmUgbm90IGhhcHBlbmVkLgorICAg
IEFTU0VSVChpbnN0LmFyZ3Muc2l6ZSgpID49IG51bUlnbm9yZWRBaXJBcmdzKTsKKyAgICBBU1NF
UlQodmFsdWUtPmNoaWxkcmVuLnNpemUoKSA+PSBudW1JZ25vcmVkQjNBcmdzKTsKKyAgICBBU1NF
UlQoaW5zdC5hcmdzLnNpemUoKSAtIG51bUlnbm9yZWRBaXJBcmdzID09IHZhbHVlLT5jaGlsZHJl
bi5zaXplKCkgLSBudW1JZ25vcmVkQjNBcmdzKTsKKyAgICAKKyAgICBmb3IgKHVuc2lnbmVkIGkg
PSAwOyBpIDwgaW5zdC5hcmdzLnNpemUoKSAtIG51bUlnbm9yZWRCM0FyZ3M7ICsraSkgeworICAg
ICAgICBBcmcmIGFyZyA9IGluc3QuYXJnc1tpICsgbnVtSWdub3JlZEIzQXJnc107CisgICAgICAg
IFZhbHVlKiBjaGlsZCA9IHZhbHVlLT5jaGlsZChpICsgbnVtSWdub3JlZEFpckFyZ3MpOworCisg
ICAgICAgIGNhbGxiYWNrKGFyZywgQXJnOjpVc2UsIEFyZzo6dHlwZUZvckIzVHlwZShjaGlsZC0+
dHlwZSgpKSk7CisgICAgfQorfQorCitib29sIFN0YWNrbWFwU3BlY2lhbDo6aXNWYWxpZEltcGwo
CisgICAgdW5zaWduZWQgbnVtSWdub3JlZEIzQXJncywgdW5zaWduZWQgbnVtSWdub3JlZEFyZ0Fy
Z3MsCisgICAgSW5zdCYgaW5zdCkKK3sKKyAgICBWYWx1ZSogdmFsdWUgPSBpbnN0Lm9yaWdpbjsK
KworICAgIC8vIENoZWNrIHRoYXQgaW5zYW5lIHRoaW5ncyBoYXZlIG5vdCBoYXBwZW5lZC4KKyAg
ICBBU1NFUlQoaW5zdC5hcmdzLnNpemUoKSA+PSBudW1JZ25vcmVkQWlyQXJncyk7CisgICAgQVNT
RVJUKHZhbHVlLT5jaGlsZHJlbi5zaXplKCkgPj0gbnVtSWdub3JlZEIzQXJncyk7CisKKyAgICBT
dGFja21hcCogc3RhY2ttYXAgPSB2YWx1ZS0+c3RhY2ttYXAoKTsKKworICAgIEFTU0VSVChzdGFj
a21hcCk7CisKKyAgICAvLyBGb3IgdGhlIEluc3QgdG8gYmUgdmFsaWQsIGl0IG5lZWRzIHRvIGhh
dmUgdGhlIHJpZ2h0IG51bWJlciBvZiBhcmd1bWVudHMuCisgICAgaWYgKGluc3QuYXJncy5zaXpl
KCkgLSBudW1JZ25vcmVkQWlyQXJncyAhPSB2YWx1ZS0+Y2hpbGRyZW4uc2l6ZSgpIC0gbnVtSWdu
b3JlZEIzQXJncykKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgLy8gUmVnYXJkbGVzcyBv
ZiBjb25zdHJhaW50cywgc3RhY2ttYXBzIGhhdmUgc29tZSBiYXNpYyByZXF1aXJlbWVudHMgZm9y
IHRoZWlyIGFyZ3VtZW50cy4gRm9yCisgICAgLy8gZXhhbXBsZSwgeW91IGNhbid0IGhhdmUgYSBu
b24tRlAtb2Zmc2V0IGFkZHJlc3MuIFRoaXMgdmVyaWZpZXMgdGhvc2UgY29uZGl0aW9ucyBhcyB3
ZWxsIGFzIHRoZQorICAgIC8vIGFyZ3VtZW50IHR5cGVzLgorICAgIGZvciAodW5zaWduZWQgaSA9
IDA7IGkgPCBpbnN0LmFyZ3Muc2l6ZSgpIC0gbnVtSWdub3JlZEIzQXJnczsgKytpKSB7CisgICAg
ICAgIFZhbHVlKiBjaGlsZCA9IHZhbHVlLT5jaGlsZChpICsgbnVtSWdub3JlZEIzQXJncyk7Cisg
ICAgICAgIEFyZyYgYXJnID0gaW5zdC5hcmdzW2kgKyBudW1JZ25vcmVkQWlyQXJnc107CisgICAg
ICAgIAorICAgICAgICBzd2l0Y2ggKGFyZy5raW5kKCkpIHsKKyAgICAgICAgY2FzZSBBcmc6OlRt
cDoKKyAgICAgICAgY2FzZSBBcmc6OkltbToKKyAgICAgICAgY2FzZSBBcmc6OkltbTY0OgorICAg
ICAgICBjYXNlIEFyZzo6U3RhY2s6CisgICAgICAgIGNhc2UgQXJnOjpDYWxsQXJnOgorICAgICAg
ICAgICAgYnJlYWs7IC8vIE9LCisgICAgICAgIGNhc2UgQXJnOjpBZGRyOgorICAgICAgICAgICAg
aWYgKGFyZy5iYXNlKCkgIT0gVG1wKEdQUkluZm86OmNhbGxGcmFtZVJlZ2lzdGVyKSAmJgorICAg
ICAgICAgICAgICAgIGFyZy5iYXNlKCkgIT0gVG1wKE1hY3JvQXNzZW1ibGVyOjpzdGFja1BvaW50
ZXJSZWdpc3RlcikpCisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAg
YnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAg
ICAgIH0KKyAgICAgICAgCisgICAgICAgIEFyZzo6VHlwZSB0eXBlID0gQXJnOjp0eXBlRm9yQjNU
eXBlKGNoaWxkLT50eXBlKCkpOworCisgICAgICAgIGlmICghYXJnLmlzVHlwZSh0eXBlKSkKKyAg
ICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICAvLyBUaGUgbnVtYmVyIG9mIGNv
bnN0cmFpbnRzIGhhcyB0byBiZSBubyBncmVhdGVyIHRoYW4gdGhlIG51bWJlciBvZiBCMyBjaGls
ZHJlbi4KKyAgICBBU1NFUlQoc3RhY2ttYXAtPm1fcmVwcy5zaXplKCkgPD0gdmFsdWUtPmNoaWxk
cmVuLnNpemUoKSk7CisKKyAgICAvLyBWZXJpZnkgYW55IGV4cGxpY2l0bHkgc3VwcGxpZWQgY29u
c3RyYWludHMuCisgICAgZm9yICh1bnNpZ25lZCBpID0gbnVtSWdub3JlZEIzQXJnczsgaSA8IHN0
YWNrbWFwLT5tX3JlcHMuc2l6ZSgpOyArK2kpIHsKKyAgICAgICAgVmFsdWUqIGNoaWxkID0gdmFs
dWUtPmNoaWxkKGkpOworICAgICAgICBWYWx1ZVJlcCYgcmVwID0gc3RhY2ttYXAtPm1fcmVwc1tp
XTsKKyAgICAgICAgQXJnJiBhcmcgPSBpbnN0LmFyZ3NbaSAtIG51bUlnbm9yZWRCM0FyZ3MgKyBu
dW1JZ25vcmVkQWlyQXJnc107CisKKyAgICAgICAgc3dpdGNoIChyZXAua2luZCgpKSB7CisgICAg
ICAgIGNhc2UgVmFsdWVSZXA6OkFueToKKyAgICAgICAgICAgIC8vIFdlIGFscmVhZHkgdmVyaWZp
ZWQgdGhpcyBhYm92ZS4KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFZhbHVlUmVw
OjpTb21lUmVnaXN0ZXI6CisgICAgICAgICAgICBpZiAoIWFyZy5pc1RtcCgpKQorICAgICAgICAg
ICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFZh
bHVlUmVwOjpSZWdpc3RlcjoKKyAgICAgICAgICAgIGlmIChhcmcgIT0gVG1wKHJlcC5yZWcoKSkp
CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgYnJlYWs7CisgICAg
ICAgIGNhc2UgVmFsdWVSZXA6OlN0YWNrOgorICAgICAgICAgICAgLy8gVGhpcyBpcyBub3QgYSB2
YWxpZCBpbnB1dCByZXByZXNlbnRhdGlvbi4KKyAgICAgICAgICAgIEFTU0VSVF9OT1RfUkVBQ0hF
RCgpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgVmFsdWVSZXA6OlN0YWNrQXJn
dW1lbnQ6CisgICAgICAgICAgICBpZiAoYXJnICE9IEFyZzo6Y2FsbEFyZyhyZXAub2Zmc2V0RnJv
bVNQKCkpKQorICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIGJyZWFr
OworICAgICAgICBjYXNlIFZhbHVlUmVwOjpDb25zdGFudDoKKyAgICAgICAgICAgIC8vIFRoaXMg
aXMgbm90IGEgdmFsaWQgaW5wdXQgcmVwcmVzZW50YXRpb24uCisgICAgICAgICAgICBBU1NFUlRf
Tk9UX1JFQUNIRUQoKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorCisg
ICAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgU3RhY2ttYXBTcGVjaWFsOjphZG1pdHNTdGFja0lt
cGwoCisgICAgdW5zaWduZWQgbnVtSWdub3JlZEIzQXJncywgdW5zaWduZWQgbnVtSWdub3JlZEFp
ckFyZ3MsCisgICAgSW5zdCYgaW5zdCwgdW5zaWduZWQgYXJnSW5kZXgpCit7CisgICAgVmFsdWUq
IHZhbHVlID0gaW5zdC5vcmlnaW47CisgICAgU3RhY2ttYXAqIHN0YWNrbWFwID0gdmFsdWUtPnN0
YWNrbWFwKCk7CisKKyAgICB1bnNpZ25lZCBzdGFja21hcEFyZ0luZGV4ID0gYXJnSW5kZXggLSBu
dW1JZ25vcmVkQWlyQXJncyArIG51bUlnbm9yZWRCM0FyZ3M7CisKKyAgICBpZiAoc3RhY2ttYXBB
cmdJbmRleCA+PSBzdGFja21hcC0+bV9yZXBzLnNpemUoKSkgeworICAgICAgICAvLyBUaGlzIG1l
YW5zIHRoYXQgdGhlcmUgd2FzIG5vIGNvbnN0cmFpbnQuCisgICAgICAgIHJldHVybiB0cnVlOwor
ICAgIH0KKyAgICAKKyAgICAvLyBXZSBvbmx5IGFkbWl0IHN0YWNrIGZvciBBbnkncywgc2luY2Ug
U3RhY2sgaXMgbm90IGEgdmFsaWQgaW5wdXQgY29uc3RyYWludCwgYW5kIFN0YWNrQXJndW1lbnQK
KyAgICAvLyB0cmFuc2xhdGVzIHRvIGEgQ2FsbEFyZyBpbiBBaXIuCisgICAgaWYgKHN0YWNrbWFw
LT5tX3JlcHNbc3RhY2ttYXBBcmdJbmRleF0ua2luZCgpID09IEFueSkKKyAgICAgICAgcmV0dXJu
IHRydWU7CisKKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK1ZlY3RvcjxWYWx1ZVJlcD4gU3RhY2tt
YXBTcGVjaWFsOjpyZXBzKEdlbmVyYXRpb25Db250ZXh0JiBjb250ZXh0LCBJbnN0JiBpbnN0KQor
eworICAgIFZlY3RvcjxWYWx1ZVJlcD4gcmVzdWx0OworICAgIGFwcGVuZFJlcHNJbXBsKGNvbnRl
eHQsIDEsIGluc3QsIHJlc3VsdCk7CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKwordm9pZCBTdGFj
a21hcFNwZWNpYWw6OmFwcGVuZFJlcHNJbXBsKAorICAgIEdlbmVyYXRpb25Db250ZXh0JiBjb250
ZXh0LCB1bnNpZ25lZCBudW1JZ25vcmVkQXJncywgSW5zdCYgaW5zdCwgVmVjdG9yPFZhbHVlUmVw
PiYgcmVzdWx0KQoreworICAgIGZvciAodW5zaWduZWQgaSA9IG51bUlnbm9yZWRBcmdzOyBpIDwg
aW5zdC5hcmdzLnNpemUoKTsgKytpKQorICAgICAgICByZXN1bHQuYXBwZW5kKHJlcEZvckFyZyhj
b250ZXh0LmNvZGUsIGFyZykpOworICAgICAgICBBcmcmIGFyZyA9IGluc3QuYXJnc1tpXTsKKyAg
ICB9Cit9CisKK1ZhbHVlUmVwIFN0YWNrbWFwU3BlY2lhbDo6cmVwRm9yQXJnKENvZGUmIGNvZGUs
IGNvbnN0IEFyZyYgYXJnKQoreworICAgIHN3aXRjaCAoYXJnLmtpbmQoKSkgeworICAgIGNhc2Ug
VG1wOgorICAgICAgICByZXR1cm4gVmFsdWVSZXA6OnJlZyhhcmcucmVnKCkpOworICAgICAgICBi
cmVhazsKKyAgICBjYXNlIEltbToKKyAgICBjYXNlIEltbTY0OgorICAgICAgICByZXR1cm4gVmFs
dWVSZXA6OmNvbnN0YW50KGFyZy52YWx1ZSgpKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBB
ZGRyOgorICAgICAgICBpZiAoYXJnLmJhc2UoKSA9PSBHUFJJbmZvOjpjYWxsRnJhbWVSZWdpc3Rl
cikKKyAgICAgICAgICAgIHJldHVybiBWYWx1ZVJlcDo6c3RhY2soYXJnLm9mZnNldCgpKTsKKyAg
ICAgICAgQVNTRVJUKGFyZy5iYXNlKCkgPT0gTWFjcm9Bc3NlbWJsZXI6OnN0YWNrUG9pbnRlclJl
Z2lzdGVyKTsKKyAgICAgICAgcmV0dXJuIFZhbHVlUmVwOjpzdGFjayhhcmcub2Zmc2V0KCkgLSBj
b2RlLmZyYW1lT2Zmc2V0KTsKKyAgICBkZWZhdWx0OgorICAgICAgICBBU1NFUlRfTk9UX1JFQUNI
RUQoKTsKKyAgICAgICAgcmV0dXJuIFZhbHVlUmVwKCk7CisgICAgfQorfQorCit9IH0gLy8gbmFt
ZXNwYWNlIEpTQzo6QjMKKworCkluZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNTdGFj
a21hcFNwZWNpYWwuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNT
dGFja21hcFNwZWNpYWwuaAkocmV2aXNpb24gMCkKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9i
My9CM1N0YWNrbWFwU3BlY2lhbC5oCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsNzUgQEAKKy8q
CisgKiBDb3B5cmlnaHQgKEMpIDIwMTUgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgor
ICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMs
IHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVk
IHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0
cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQK
KyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcg
ZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJl
cHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBj
b25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1
bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJp
YnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBg
YEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xV
RElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBN
RVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBB
UkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IKKyAqIENPTlRS
SUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBT
UEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElO
RywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09E
UyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJ
TkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBP
RiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRP
UlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5Z
IFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VE
IE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKworI2lmbmRlZiBCM1N0
YWNrbWFwU3BlY2lhbF9oCisjZGVmaW5lIEIzU3RhY2ttYXBTcGVjaWFsX2gKKworI2luY2x1ZGUg
IkFpclNwZWNpYWwuaCIKKyNpbmNsdWRlICJCM1N0YWNrbWFwLmgiCisKK25hbWVzcGFjZSBKU0Mg
eyBuYW1lc3BhY2UgQjMgeworCisvLyBUaGlzIGlzIGEgYmFzZSBjbGFzcyBmb3Igc3BlY2lhbHMg
dGhhdCBoYXZlIHN0YWNrbWFwcy4gTm90ZSB0aGF0IGl0IGNhbiBmaW5kIHRoZSBTdGFja21hcCBi
eQorLy8gYXNraW5nIGZvciB0aGUgSW5zdCdzIG9yaWdpbi4gSGVuY2UsIHRoZXNlIG9iamVjdHMg
ZG9uJ3QgbmVlZCB0byBldmVuIGhvbGQgYSByZWZlcmVuY2UgdG8gdGhlCisvLyBTdGFja21hcC4K
KworY2xhc3MgU3RhY2ttYXBTcGVjaWFsIDogcHVibGljIEFpcjo6U3BlY2lhbCB7CitwdWJsaWM6
CisgICAgU3RhY2ttYXBTcGVjaWFsKCk7CisgICAgdmlydHVhbCB+U3RhY2ttYXBTcGVjaWFsKCk7
CisKK3Byb3RlY3RlZDoKKyAgICB2b2lkIGZvckVhY2hBcmcoQWlyOjpJbnN0JiwgY29uc3QgU2Nv
cGVkTGFtYmRhPEFpcjo6SW5zdDo6RWFjaEFyZ0NhbGxiYWNrPiYpIG92ZXJyaWRlOworICAgIGJv
b2wgaXNWYWxpZChBaXI6Okluc3QmKSBvdmVycmlkZTsKKyAgICBib29sIGFkbWl0c1N0YWNrKEFp
cjo6SW5zdCYsIHVuc2lnbmVkIGFyZ0luZGV4KSBvdmVycmlkZTsKKyAgICB2b2lkIHJlcG9ydFVz
ZWRSZWdpc3RlcnMoQWlyOjpJbnN0JiwgY29uc3QgUmVnaXN0ZXJTZXQmKSBvdmVycmlkZTsKKyAg
ICBjb25zdCBSZWdpc3RlclNldCYgZXh0cmFDbG9iYmVyZWRSZWdzKEFpcjo6SW5zdCYpIG92ZXJy
aWRlOworCisgICAgLy8gTm90ZSB0aGF0IHRoaXMgZG9lcyBub3Qgb3ZlcnJpZGUgZ2VuZXJhdGUo
KSBvciBkdW1wSW1wbCgpL2RlZXBEdW1wSW1wbCgpLiBXZSBoYXZlIG1hbnkgc29tZQorICAgIC8v
IHN1YmNsYXNzZXMgdGhhdCBpbXBsZW1lbnQgdGhhdC4KKworICAgIHZvaWQgZm9yRWFjaEFyZ0lt
cGwoCisgICAgICAgIHVuc2lnbmVkIG51bUlnbm9yZWRCM0FyZ3MsIHVuc2lnbmVkIG51bUlnbm9y
ZWRBaXJBcmdzLAorICAgICAgICBBaXI6Okluc3QmLCBjb25zdCBTY29wZWRMYW1iZGE8QWlyOjpJ
bnN0OjpFYWNoQXJnQ2FsbGJhY2s+Jik7CisgICAgYm9vbCBpc1ZhbGlkSW1wbCgKKyAgICAgICAg
dW5zaWduZWQgbnVtSWdub3JlZEIzQXJncywgdW5zaWduZWQgbnVtSWdub3JlZEFpckFyZ3MsCisg
ICAgICAgIEFpcjo6SW5zdCYpOworICAgIGJvb2wgYWRtaXRzU3RhY2tJbXBsKAorICAgICAgICB1
bnNpZ25lZCBudW1JZ25vcmVkQjNBcmdzLCB1bnNpZ25lZCBudW1JZ25vcmVkQWlyQXJncywKKyAg
ICAgICAgQWlyOjpJbnN0Jik7CisKKyAgICAvLyBHZXRzIHRoZSByZXBzIGFycmF5IHRoZSB3YXkg
dGhhdCB0aGUgc3RhY2ttYXAgZ2VuZXJhdG9yIGNhbGxiYWNrIHdvdWxkIHdhbnQuCisgICAgVmVj
dG9yPFZhbHVlUmVwPiByZXBzKEFpcjo6R2VuZXJhdGlvbkNvbnRleHQmLCBBaXI6Okluc3QmKTsK
KworICAgIC8vIEFwcGVuZHMgdGhlIHJlcHMgZm9yIHRoZSBJbnN0J3MgYXJncywgc3RhcnRpbmcg
d2l0aCBudW1JZ25vcmVkQXJncywgdG8gdGhlIGdpdmVuIHZlY3Rvci4KKyAgICB2b2lkIGFwcGVu
ZFJlcHNJbXBsKEFpcjo6R2VuZXJhdGlvbkNvbnRleHQmLCB1bnNpZ25lZCBudW1JZ25vcmVkQXJn
cywgQWlyOjpJbnN0JiwgVmVjdG9yPFZhbHVlUmVwPiYpOworCisgICAgc3RhdGljIFZhbHVlUmVw
IHJlcEZvckFyZyhBaXI6OkNvZGUmLCBjb25zdCBBaXI6OkFyZyYpOworfTsKKworfSB9IC8vIG5h
bWVzcGFjZSBKU0M6OkIzCisKKyNlbmRpZiAvLyBCM1N0YWNrbWFwU3BlY2lhbF9oCisKSW5kZXg6
IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM1N3aXRjaENhc2UuY3BwCj09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0t
IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM1N3aXRjaENhc2UuY3BwCShyZXZpc2lvbiAwKQor
KysgU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzU3dpdGNoQ2FzZS5jcHAJKHdvcmtpbmcgY29w
eSkKQEAgLTAsMCArMSwzOSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNSBBcHBsZSBJbmMu
IEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBz
b3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24s
IGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAq
IGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRh
aW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0
aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25z
IGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAg
IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xh
aW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBw
cm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQ
Uk9WSURFRCBCWSBBUFBMRSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElN
UExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICog
SU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQ
QVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwg
QVBQTEUgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwg
SU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVF
TlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJF
TUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwg
T1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQg
QU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwg
U1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9U
SEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNP
RlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdF
LiAKKyAqLworCisjaW5jbHVkZSAiY29uZmlnLmgiCisjaW5jbHVkZSAiQjNTd2l0Y2hDYXNlLmgi
CisKKyNpbmNsdWRlICJCM0Jhc2ljQmxvY2suaCIKKworbmFtZXNwYWNlIEpTQyB7IG5hbWVzcGFj
ZSBCMyB7CisKK3ZvaWQgU3dpdGNoQ2FzZTo6ZHVtcChQcmludFN0cmVhbSYgb3V0KSBjb25zdAor
eworICAgIG91dC5wcmludChtX2Nhc2VWYWx1ZSwgIi0+IiwgcG9pbnRlckR1bXAobV90YXJnZXQp
KTsKK30KKworfSB9IC8vIG5hbWVzcGFjZSBKU0M6OkIzCisKSW5kZXg6IFNvdXJjZS9KYXZhU2Ny
aXB0Q29yZS9iMy9CM1N3aXRjaENhc2UuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlw
dENvcmUvYjMvQjNTd2l0Y2hDYXNlLmgJKHJldmlzaW9uIDApCisrKyBTb3VyY2UvSmF2YVNjcmlw
dENvcmUvYjMvQjNTd2l0Y2hDYXNlLmgJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSw2MyBAQAor
LyoKKyAqIENvcHlyaWdodCAoQykgMjAxNSBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQu
CisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jt
cywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlk
ZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRp
c3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdo
dAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2lu
ZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3Qg
cmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9m
IGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRv
Y3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0
cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMu
IGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5D
TFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9G
IE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NF
IEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUgorICogQ09O
VFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUws
IFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVE
SU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdP
T0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJV
U0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAq
IE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1Ig
VE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBB
TlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklT
RUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLiAKKyAqLworCisjaWZuZGVmIEIz
U3dpdGNoQ2FzZV9oCisjZGVmaW5lIEIzU3dpdGNoQ2FzZV9oCisKKyNpbmNsdWRlIDx3dGYvU3Rk
TGliRXh0cmFzLmg+CisjaW5jbHVkZSA8d3RmL1ByaW50U3RyZWFtLmg+CisKK25hbWVzcGFjZSBK
U0MgeyBuYW1lc3BhY2UgQjMgeworCitjbGFzcyBCYXNpY0Jsb2NrOworCitjbGFzcyBTd2l0Y2hD
YXNlIHsKK3B1YmxpYzoKKyAgICBTd2l0Y2hDYXNlKCkKKyAgICB7CisgICAgfQorCisgICAgU3dp
dGNoQ2FzZShpbnQ2NF90IGNhc2VWYWx1ZSwgQmFzaWNCbG9jayogdGFyZ2V0KQorICAgICAgICA6
IG1fY2FzZVZhbHVlKGNhc2VWYWx1ZSkKKyAgICAgICAgLCBtX3RhcmdldCh0YXJnZXQpCisgICAg
eworICAgIH0KKworICAgIGV4cGxpY2l0IG9wZXJhdG9yIGJvb2woKSBjb25zdCB7IHJldHVybiAh
IW1fdGFyZ2V0OyB9CisKKyAgICBpbnQ2NF90IGNhc2VWYWx1ZSgpIGNvbnN0IHsgcmV0dXJuIG1f
Y2FzZVZhbHVlOyB9CisgICAgQmFzaWNCbG9jayogdGFyZ2V0KCkgY29uc3QgeyByZXR1cm4gbV90
YXJnZXQ7IH0KKworICAgIHZvaWQgZHVtcChQcmludFN0cmVhbSYgb3V0KSBjb25zdDsKKworcHJp
dmF0ZToKKyAgICBpbnQ2NF90IGNhc2VWYWx1ZTsKKyAgICBCYXNpY0Jsb2NrKiB0YXJnZXQ7Cit9
OworCit9IH0gLy8gbmFtZXNwYWNlIEpTQzo6QjMKKworI2VuZGlmIC8vIEIzU3dpdGNoQ2FzZV9o
CisKSW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM1N3aXRjaFZhbHVlLmNwcAo9PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNTd2l0Y2hWYWx1ZS5jcHAJKHJl
dmlzaW9uIDApCisrKyBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNTd2l0Y2hWYWx1ZS5jcHAJ
KHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSw2MyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAx
NSBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24g
YW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBt
b2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNv
bmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNv
ZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxp
c3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVk
aXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5
cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xs
b3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVy
IG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBT
T0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBF
WFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQg
VE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklU
TkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8g
RVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1Ig
QU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlks
IE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8s
CisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9G
IFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9X
RVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJ
TiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdM
SUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisg
KiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9G
IFNVQ0ggREFNQUdFLiAKKyAqLworCisjaW5jbHVkZSAiY29uZmlnLmgiCisjaW5jbGR1ZSAiQjNT
d2l0Y2hWYWx1ZS5oIgorCituYW1lc3BhY2UgSlNDIHsgbmFtZXNwYWNlIEIzIHsKKworU3dpdGNo
VmFsdWU6On5Td2l0Y2hWYWx1ZSgpCit7Cit9CisKK1N3aXRjaENhc2UgU3dpdGNoVmFsdWU6OnJl
bW92ZUNhc2UodW5zaWduZWQgaW5kZXgpCit7CisgICAgU3dpdGNoQ2FzZSByZXN1bHQgPSBtX3N1
Y2Nlc3NvcnNbaW5kZXhdOworICAgIG1fc3VjY2Vzc29yc1tpbmRleF0gPSBtX3N1Y2Nlc3NvcnMu
bGFzdCgpOworICAgIG1fc3VjY2Vzc29ycy5yZW1vdmVMYXN0KCk7CisgICAgcmV0dXJuIHJlc3Vs
dDsKK30KKwordm9pZCBTd2l0Y2hWYWx1ZTo6YXBwZW5kQ2FzZShjb25zdCBTd2l0Y2hDYXNlJiBz
d2l0Y2hDYXNlKQoreworICAgIG1fc3VjY2Vzc29ycy5hcHBlbmQobV9zdWNjZXNzb3JzLmxhc3Qo
KSk7CisgICAgbV9zdWNjZXNzb3JzW21fc3VjY2Vzc29ycy5zaXplKCkgLSAyXSA9IHN3aXRjaENh
c2UudGFyZ2V0KCk7CisgICAgbV92YWx1ZXMuYXBwZW5kKHN3aXRjaENhc2UuY2FzZVZhbHVlKCkp
OworfQorCit2b2lkIFN3aXRjaFZhbHVlOjpkdW1wTWV0YShQcmludFN0cmVhbSYgb3V0KSBjb25z
dAoreworICAgIC8vIFRoaXMgZGVzdHJ1Y3RpdmVseSBvdmVycmlkZXMgQ29udHJvbFZhbHVlJ3Mg
ZHVtcE1ldGEoKS4KKyAgICBvdXQucHJpbnQobGlzdER1bXAoKnRoaXMpKTsKK30KKworU3dpdGNo
VmFsdWU6OlN3aXRjaFZhbHVlKHVuc2lnbmVkIGluZGV4LCBPcmlnaW4gb3JpZ2luLCBCYXNpY0Js
b2NrKiBmYWxsVGhyb3VnaCkKKyAgICA6IENvbnRyb2xWYWx1ZShpbmRleCwgU3dpdGNoLCBvcmln
aW4pCit7CisgICAgbV9zdWNjZXNzb3JzLmFwcGVuZChmYWxsVGhyb3VnaCk7Cit9CisKK30gfSAv
LyBuYW1lc3BhY2UgSlNDOjpCMworCkluZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNT
d2l0Y2hWYWx1ZS5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM1N3
aXRjaFZhbHVlLmgJKHJldmlzaW9uIDApCisrKyBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNT
d2l0Y2hWYWx1ZS5oCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsMTIzIEBACisvKgorICogQ29w
eXJpZ2h0IChDKSAyMDE1IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBS
ZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9y
IHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRo
ZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9u
cyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBu
b3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWlt
ZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2Ug
dGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9u
cyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlv
biBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4K
KyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycn
IEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJV
VCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRB
QklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NM
QUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMg
QkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwK
KyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBO
T1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VS
VklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5U
RVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklM
SVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAo
SU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VU
IE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUg
UE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisKKyNpZm5kZWYgQjNTd2l0Y2hWYWx1
ZV9oCisjZGVmaW5lIEIzU3dpdGNoVmFsdWVfaAorCisjaW5jbHVkZSAiQjNDb250cm9sVmFsdWUu
aCIKKyNpbmNsdWRlICJCM1N3aXRjaENhc2UuaCIKKworbmFtZXNwYWNlIEpTQyB7IG5hbWVzcGFj
ZSBCMyB7CisKK2NsYXNzIFN3aXRjaFZhbHVlIDogcHVibGljIENvbnRyb2xWYWx1ZSB7CitwdWJs
aWM6CisgICAgc3RhdGljIGJvb2wgYWNjZXB0cyhPcGNvZGUgb3Bjb2RlKSB7IHJldHVybiBvcGNv
ZGUgPT0gU3dpdGNoOyB9CisKKyAgICB+U3dpdGNoVmFsdWUoKTsKKworICAgIC8vIG51bUNhc2VW
YWx1ZXMoKSArIDEgPT0gbnVtU3VjY2Vzc29ycygpLgorICAgIHVuc2lnbmVkIG51bUNhc2VWYWx1
ZXMoKSBjb25zdCB7IHJldHVybiBtX3ZhbHVlcy5zaXplKCk7IH0KKworICAgIC8vIFRoZSBzdWNj
ZXNzb3IgZm9yIHRoaXMgY2FzZSB2YWx1ZSBpcyBhdCB0aGUgc2FtZSBpbmRleC4KKyAgICBpbnQ2
NF90IGNhc2VWYWx1ZSh1bnNpZ25lZCBpbmRleCkgY29uc3QgeyByZXR1cm4gbV92YWx1ZXNbaV07
IH0KKyAgICAKKyAgICBjb25zdCBWZWN0b3I8aW50NjRfdD4mIGNhc2VWYWx1ZXMoKSBjb25zdCB7
IHJldHVybiBtX3ZhbHVlczsgfQorCisgICAgQmFzaWNCbG9jayogZmFsbFRocm91Z2goKSBjb25z
dCB7IHJldHVybiBzdWNjZXNzb3JzKCkubGFzdCgpOyB9CisgICAgQmFzaWNCbG9jayomIGZhbGxU
aHJvdWdoKCkgeyByZXR1cm4gc3VjY2Vzc29ycygpLmxhc3QoKTsgfQorCisgICAgdW5zaWduZWQg
c2l6ZSgpIGNvbnN0IHsgcmV0dXJuIG51bUNhc2VWYWx1ZXMoKTsgfQorICAgIFN3aXRjaENhc2Ug
YXQodW5zaWduZWQgaW5kZXgpIGNvbnN0CisgICAgeworICAgICAgICByZXR1cm4gU3dpdGNoQ2Fz
ZShjYXNlVmFsdWUoaW5kZXgpLCBzdWNjZXNzb3IoaW5kZXgpKTsKKyAgICB9CisgICAgU3dpdGNo
Q2FzZSBvcGVyYXRvcltdKHVuc2lnbmVkIGluZGV4KSBjb25zdAorICAgIHsKKyAgICAgICAgcmV0
dXJuIGF0KGluZGV4KTsKKyAgICB9CisKKyAgICBjbGFzcyBpdGVyYXRvciB7CisgICAgcHVibGlj
OgorICAgICAgICBpdGVyYXRvcigpCisgICAgICAgICAgICA6IG1fc3dpdGNoKG51bGxwdHIpCisg
ICAgICAgICAgICAsIG1faW5kZXgoMCkKKyAgICAgICAgeworICAgICAgICB9CisKKyAgICAgICAg
aXRlcmF0b3IoU3dpdGNoVmFsdWUmIHN3aXRjaFZhbHVlLCB1bnNpZ25lZCBpbmRleCkKKyAgICAg
ICAgICAgIDogbV9zd2l0Y2goJnN3aXRjaFZhbHVlKQorICAgICAgICAgICAgLCBtX2luZGV4KGlu
ZGV4KQorICAgICAgICB7CisgICAgICAgIH0KKworICAgICAgICBTd2l0Y2hDYXNlIG9wZXJhdG9y
KigpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBtX3N3aXRjaC0+YXQobV9pbmRleCk7
CisgICAgICAgIH0KKworICAgICAgICBpdGVyYXRvciYgb3BlcmF0b3IrKygpCisgICAgICAgIHsK
KyAgICAgICAgICAgIG1faW5kZXgrKzsKKyAgICAgICAgICAgIHJldHVybiAqdGhpczsKKyAgICAg
ICAgfQorCisgICAgICAgIGJvb2wgb3BlcmF0b3I9PShjb25zdCBpdGVyYXRvciYgb3RoZXIpIGNv
bnN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBtX2luZGV4ID09IG90aGVyLm1faW5k
ZXg7CisgICAgICAgIH0KKworICAgICAgICBib29sIG9wZXJhdG9yIT0oY29uc3QgaXRlcmF0b3Im
IG90aGVyKSBjb25zdAorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gISgqdGhpcyA9PSBv
dGhlcik7CisgICAgICAgIH0KKworICAgIHByaXZhdGU6CisgICAgICAgIFN3aXRjaFZhbHVlKiBt
X3N3aXRjaDsKKyAgICAgICAgdW5zaWduZWQgbV9pbmRleDsKKyAgICB9OworCisgICAgaXRlcmF0
b3IgYmVnaW4oKSBjb25zdCB7IHJldHVybiBpdGVyYXRvcigqdGhpcywgMCk7IH0KKyAgICBpdGVy
YXRvciBlbmQoKSBjb25zdCB7IHJldHVybiBpdGVyYXRvcigqdGhpcywgc2l6ZSgpKTsgfQorCisg
ICAgLy8gVGhpcyByZW1vdmVzIHRoZSBjYXNlIGFuZCByZW9yZGVycyB0aGluZ3MgYSBiaXQuIElm
IHlvdSdyZSBpdGVyYXRpbmcgdGhlIGNhc2VzIGZyb20gMCB0byBOLAorICAgIC8vIHRoZW4geW91
IGNhbiBrZWVwIGl0ZXJhdGluZyBhZnRlciB0aGlzIHNvIGxvbmcgYXMgeW91IHJldmlzaXQgdGhp
cyBzYW1lIGluZGV4ICh3aGljaCB3aWxsIG5vdworICAgIC8vIGNvbnRhaW4gc29tZSBvdGhlciBj
YXNlIHZhbHVlKS4gVGhpcyByZW1vdmVzIHRoZSBjYXNlIHRoYXQgd2FzIHJlbW92ZWQuCisgICAg
U3dpdGNoQ2FzZSByZW1vdmVDYXNlKHVuc2lnbmVkIGluZGV4KTsKKworICAgIHZvaWQgYXBwZW5k
Q2FzZShjb25zdCBTd2l0Y2hDYXNlJiBzd2l0Y2hDYXNlKTsKKworcHJvdGVjdGVkOgorICAgIHZv
aWQgZHVtcE1ldGEoUHJpbnRTdHJlYW0mKSBjb25zdCBvdmVycmlkZTsKKworcHJpdmF0ZToKKyAg
ICBmcmllbmQgY2xhc3MgUHJvY2VkdXJlOworCisgICAgU3dpdGNoVmFsdWUodW5zaWduZWQgaW5k
ZXgsIE9yaWdpbiBvcmlnaW4sIEJhc2ljQmxvY2sqIGZhbGxUaHJvdWdoKTsKK307CisKK30gfSAv
LyBuYW1lc3BhY2UgSlNDOjpCMworCisjZW5kaWYgLy8gQjNTd2l0Y2hWYWx1ZV9oCisKSW5kZXg6
IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM1R5cGUuY3BwCj09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJj
ZS9KYXZhU2NyaXB0Q29yZS9iMy9CM1R5cGUuY3BwCShyZXZpc2lvbiAwKQorKysgU291cmNlL0ph
dmFTY3JpcHRDb3JlL2IzL0IzVHlwZS5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSw1NCBA
QAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNSBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2
ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBm
b3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJv
dmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBS
ZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHly
aWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxv
d2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11
c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0
IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAg
IGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBk
aXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJ
TkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywg
SU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVT
IE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQ
T1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUgorICog
Q09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5U
QUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5D
TFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRF
IEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9S
IEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkK
KyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwg
T1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJ
TiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFE
VklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLiAKKyAqLworCisjaW5jbHVk
ZSAiY29uZmlnLmgiCisjaW5jbHVkZSAiQjNUeXBlLmgiCisKKyNpbmNsdWRlIDx3dGYvUHJpbnRT
dHJlYW0uaD4KKworbmFtZXNwYWNlIFdURiB7CisKK3VzaW5nIG5hbWVzcGFjZSBKU0M6OkIzOwor
Cit2b2lkIHByaW50SW50ZXJuYWwoUHJpbnRTdHJlYW0mIG91dCwgVHlwZSB0eXBlKQoreworICAg
IHN3aXRjaCAodHlwZSkgeworICAgIGNhc2UgVm9pZDoKKyAgICAgICAgb3V0LnByaW50KCJWb2lk
Iik7CisgICAgICAgIHJldHVybjsKKyAgICBjYXNlIEludDMyOgorICAgICAgICBvdXQucHJpbnQo
IkludDMyIik7CisgICAgICAgIHJldHVybjsKKyAgICBjYXNlIEludDY0OgorICAgICAgICBvdXQu
cHJpbnQoIkludDY0Iik7CisgICAgICAgIHJldHVybjsKKyAgICBjYXNlIERvdWJsZToKKyAgICAg
ICAgb3V0LnByaW50KCJEb3VibGUiKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBSRUxF
QVNFX0FTU0VSVF9OT1RfUkVBQ0hFRCgpOworfQorCit9IC8vIG5hbWVzcGFjZSBXVEYKSW5kZXg6
IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM1R5cGUuaAo9PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2Uv
SmF2YVNjcmlwdENvcmUvYjMvQjNUeXBlLmgJKHJldmlzaW9uIDApCisrKyBTb3VyY2UvSmF2YVNj
cmlwdENvcmUvYjMvQjNUeXBlLmgJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSw2OCBAQAorLyoK
KyAqIENvcHlyaWdodCAoQykgMjAxNSBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisg
KgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywg
d2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQg
dGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3Ry
aWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAor
ICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBk
aXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVw
cm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNv
bmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3Vt
ZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmli
dXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIGBg
QVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVE
SU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1F
UkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFS
RSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUgorICogQ09OVFJJ
QlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQ
RUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5H
LCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RT
IE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lO
RVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9G
IExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9S
VAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkg
V0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQg
T0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLiAKKyAqLworCisjaWZuZGVmIEIzVHlw
ZV9oCisjZGVmaW5lIEIzVHlwZV9oCisKKyNpbmNsdWRlIDx3dGYvU3RkTGliRXh0cmFzLmg+CisK
K25hbWVzcGFjZSBKU0MgeyBuYW1lc3BhY2UgQjMgeworCitlbnVtIFR5cGUgeworICAgIFZvaWQs
CisgICAgSW50MzIsCisgICAgSW50NjQsCisgICAgRG91YmxlCit9OworCitpbmxpbmUgYm9vbCBp
c0ludChUeXBlIHR5cGUpCit7CisgICAgcmV0dXJuIHR5cGUgPT0gSW50MzIgfHwgdHlwZSA9PSBJ
bnQ2NDsKK30KKworaW5saW5lIGJvb2wgaXNGbG9hdChUeXBlIHR5cGUpCit7CisgICAgcmV0dXJu
IHR5cGUgPT0gRG91YmxlOworfQorCitpbmxpbmUgVHlwZSBwb2ludGVyKCkgY29uc3QKK3sKKyAg
ICBpZiAoc2l6ZW9mKHZvaWQqKSA9PSA0KQorICAgICAgICByZXR1cm4gSW50MzI7CisgICAgcmV0
dXJuIEludDY0OworfQorCit9IH0gLy8gbmFtZXNwYWNlIEpTQzo6QjMKKworbmFtZXNwYWNlIFdU
RiB7CisKK2NsYXNzIFByaW50U3RyZWFtOworCit2b2lkIHByaW50SW50ZXJuYWwoUHJpbnRTdHJl
YW0mLCBKU0M6OkIzOjpUeXBlKTsKKworfSAvLyBuYW1lc3BhY2UgV1RGCisKKyNlbmRpZiAvLyBC
M1R5cGVfaAorCkluZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNVcHNpbG9uVmFsdWUu
Y3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM1Vwc2lsb25WYWx1
ZS5jcHAJKHJldmlzaW9uIDApCisrKyBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNVcHNpbG9u
VmFsdWUuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsNDEgQEAKKy8qCisgKiBDb3B5cmln
aHQgKEMpIDIwMTUgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlz
dHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0
aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZv
bGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9m
IHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGlj
ZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4K
KyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUg
YWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFu
ZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFu
ZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoK
KyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFTIElTJycgQU5E
IEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5P
VCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJ
VFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1F
RC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBM
SUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICog
RVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBM
SU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNF
UzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJV
UFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFks
IFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNM
VURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0Yg
VEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NT
SUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKworI2luY2x1ZGUgImNvbmZpZy5oIgorI2lu
Y2x1ZGUgIkIzVXBzaWxvblZhbHVlLmgiCisKK25hbWVzcGFjZSBKU0MgeyBuYW1lc3BhY2UgQjMg
eworCitVcHNpbG9uVmFsdWU6On5VcHNpbG9uVmFsdWUoKQoreworfQorCit2b2lkIFVwc2lsb25W
YWx1ZTo6ZHVtcE1ldGEoUHJpbnRTdHJlYW0mIG91dCkgY29uc3QKK3sKKyAgICBvdXQucHJpbnQo
Il4iLCBtX3BoaS0+aW5kZXgoKSk7Cit9CisKK30gfSAvLyBuYW1lc3BhY2UgSlNDOjpCMworCklu
ZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNVcHNpbG9uVmFsdWUuaAo9PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNVcHNpbG9uVmFsdWUuaAkocmV2aXNpb24g
MCkKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM1Vwc2lsb25WYWx1ZS5oCSh3b3JraW5n
IGNvcHkpCkBAIC0wLDAgKzEsNjAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTUgQXBwbGUg
SW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2Ug
aW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0
aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25z
CisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3Qg
cmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNv
bmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0
aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Cisg
KiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRp
c2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlh
bHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUg
SVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBP
UiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUK
KyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9S
IEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNI
QUxMIEFQUExFIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJF
Q1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05T
RVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJP
Q1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERB
VEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FV
U0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJB
Q1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBP
UiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJ
UyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERB
TUFHRS4gCisgKi8KKworI2lmbmRlZiBCM1Vwc2lsb25WYWx1ZV9oCisjZGVmaW5lIEIzVXBzaWxv
blZhbHVlX2gKKworI2luY2x1ZGUgIkIzVmFsdWUuaCIKKworbmFtZXNwYWNlIEpTQyB7IG5hbWVz
cGFjZSBCMyB7CisKK2NsYXNzIFVwc2lsb25WYWx1ZSA6IHB1YmxpYyBWYWx1ZSB7CitwdWJsaWM6
CisgICAgc3RhdGljIGJvb2wgYWNjZXB0cyhPcGNvZGUgb3Bjb2RlKSB7IHJldHVybiBvcGNvZGUg
PT0gVXBzaWxvbjsgfQorCisgICAgflVwc2lsb25WYWx1ZSgpOworCisgICAgVmFsdWUqIHBoaSgp
IGNvbnN0IHsgcmV0dXJuIG1fcGhpOyB9CisKK3Byb3RlY3RlZDoKKyAgICB2b2lkIGR1bXBNZXRh
KFByaW50U3RyZWFtJikgY29uc3Qgb3ZlcnJpZGU7CisKK3ByaXZhdGU6CisgICAgZnJpZW5kIGNs
YXNzIFByb2NlZHVyZTsKKyAgICAKKyAgICBVcHNpbG9uVmFsdWUodW5zaWduZWQgaW5kZXgsIE9y
aWdpbiBvcmlnaW4sIFZhbHVlKiB2YWx1ZSwgVmFsdWUqIHBoaSkKKyAgICAgICAgOiBWYWx1ZShp
bmRleCwgUGhpLCBWb2lkLCBvcmlnaW4sIHZhbHVlKQorICAgICAgICAsIG1fcGhpKHBoaSkKKyAg
ICB7CisgICAgICAgIEFTU0VSVCh2YWx1ZS0+dHlwZSgpID09IHBoaS0+dHlwZSgpKTsKKyAgICB9
CisKKyAgICBWYWx1ZSogbV9waGk7Cit9OworCit9IH0gLy8gbmFtZXNwYWNlIEpTQzo6QjMKKwor
I2VuZGlmIC8vIEIzVXBzaWxvblZhbHVlX2gKKwpJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3Jl
L2IzL0IzVmFsdWUuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9C
M1ZhbHVlLmNwcAkocmV2aXNpb24gMCkKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM1Zh
bHVlLmNwcAkod29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDE2OSBAQAorLyoKKyAqIENvcHlyaWdo
dCAoQykgMjAxNSBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0
cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRo
b3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9s
bG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Yg
c291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNl
LCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgor
ICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBh
Ym92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5k
IHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5k
L29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgor
ICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIGBgQVMgSVMnJyBBTkQg
QU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9U
IExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElU
WSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVE
LiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJ
QUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBF
WEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJ
TUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VT
OyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQ
VElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwg
V0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xV
RElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBU
SEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJ
QklMSVRZIE9GIFNVQ0ggREFNQUdFLiAKKyAqLworCisjaW5jbHVkZSAiY29uZmlnLmgiCisjaW5j
bHVkZSAiQjNWYWx1ZS5oIgorCituYW1lc3BhY2UgSlNDIHsgbmFtZXNwYWNlIEIzIHsKKworVmFs
dWU6On5WYWx1ZSgpCit7Cit9CisKK3ZvaWQgVmFsdWU6OnJlcGxhY2VXaXRoSWRlbnRpdHkoVmFs
dWUqIHZhbHVlKQoreworICAgIC8vIFRoaXMgaXMgYSBiaXQgY3JhenkuIEl0IGRvZXMgYW4gaW4t
cGxhY2UgcmVwbGFjZW1lbnQgb2Ygd2hhdGV2ZXIgVmFsdWUgc3ViY2xhc3MgdGhpcyBpcyB3aXRo
CisgICAgLy8gYSBwbGFpbiBJZGVudGl0eSBWYWx1ZS4gV2UgZmlyc3QgY29sbGVjdCBhbGwgb2Yg
dGhlIGluZm9ybWF0aW9uIHdlIG5lZWQsIHRoZW4gd2UgZGVzdHJ1Y3QgdGhlCisgICAgLy8gcHJl
dmlvdXMgdmFsdWUgaW4gcGxhY2UsIGFuZCB0aGVuIHdlIGNvbnN0cnVjdCB0aGUgSWRlbnRpdHkg
VmFsdWUgaW4gcGxhY2UuCisKKyAgICB1bnNpZ25lZCBpbmRleCA9IG1faW5kZXg7CisgICAgVHlw
ZSB0eXBlID0gbV90eXBlOworICAgIE9yaWdpbiBvcmlnaW4gPSBtX29yaWdpbjsKKyAgICBCYXNp
Y0Jsb2NrKiBvd25lciA9IHRoaXMtPm93bmVyOworICAgIFZhbHVlKiByZXBsYWNlbWVudCA9IHRo
aXMtPnJlcGxhY2VtZW50OworICAgIHZvaWQqIG1pc2MgPSB0aGlzLT5taXNjOworCisgICAgUkVM
RUFTRV9BU1NFUlQodHlwZSA9PSB2YWx1ZS0+dHlwZSgpKTsKKworICAgIHRoaXMtPlZhbHVlOjp+
VmFsdWUoKTsKKworICAgIG5ldyAodGhpcykgKGluZGV4LCBJZGVudGlmeSwgdHlwZSwgb3JpZ2lu
LCB2YWx1ZSk7CisKKyAgICB0aGlzLT5vd25lciA9IG93bmVyOworICAgIHRoaXMtPnJlcGxhY2Vt
ZW50ID0gcmVwbGFjZW1lbnQ7CisgICAgdGhpcy0+bWlzYyA9IG1pc2M7Cit9CisKK3ZvaWQgVmFs
dWU6OmR1bXAoUHJpbnRTdHJlYW0mIG91dCkgY29uc3QKK3sKKyAgICBvdXQucHJpbnQoZHVtcFBy
ZWZpeCwgbV9pbmRleCk7Cit9CisKK3ZvaWQgVmFsdWU6OmRlZXBEdW1wKFByaW50U3RyZWFtJiBv
dXQpIGNvbnN0Cit7CisgICAgb3V0LnByaW50KG1fdHlwZSwgIiAiLCAqdGhpcywgIiA9ICIsIG1f
b3Bjb2RlKTsKKworICAgIG91dC5wcmludCgiKCIpOworICAgIENvbW1hUHJpbnRlciBjb21tYTsK
KyAgICBmb3IgKFZhbHVlKiBjaGlsZCA6IGNoaWxkcmVuKCkpCisgICAgICAgIG91dC5wcmludChj
b21tYSwgcG9pbnRlckR1bXAoY2hpbGQpKTsKKworICAgIFN0cmluZ1ByaW50U3RyZWFtIHN0cmlu
Z091dDsKKyAgICBkdW1wTWV0YShzdHJpbmdPdXQpOworICAgIENTdHJpbmcgc3RyaW5nID0gc3Ry
aW5nT3V0LnRvQ1N0cmluZygpOworICAgIGlmIChzdHJpbmcubGVuZ3RoKCkpCisgICAgICAgIG91
dC5wcmludChjb21tYSwgc3RyaW5nKTsKKworICAgIG91dC5wcmludCgiKSIpOworfQorCitib29s
IFZhbHVlOjpoYXNJbnQzMigpIGNvbnN0Cit7CisgICAgcmV0dXJuIGZhbHNlOworfQorCitpbnQz
Ml90IFZhbHVlOjphc0ludDMyKCkgY29uc3QKK3sKKyAgICBSRUxFQVNFX0FTU0VSVF9OT1RfUkVB
Q0hFRCgpOworICAgIHJldHVybiAwOworfQorCitib29sIFZhbHVlOjpoYXNJbnQ2NCgpIGNvbnN0
Cit7CisgICAgcmV0dXJuIGZhbHNlOworfQorCitpbnQ2NF90IFZhbHVlOjphc0ludDY0KCkgY29u
c3QKK3sKKyAgICBSRUxFQVNFX0FTU0VSVF9OT1RfUkVBQ0hFRCgpOworICAgIHJldHVybiAwOwor
fQorCitib29sIFZhbHVlOjpoYXNEb3VibGUoKSBjb25zdAoreworICAgIHJldHVybiBmYWxzZTsK
K30KKworZG91YmxlIFZhbHVlOjphc0RvdWJsZSgpIGNvbnN0Cit7CisgICAgUkVMRUFTRV9BU1NF
UlRfTk9UX1JFQUNIRUQoKTsKKyAgICByZXR1cm4gMDsKK30KKwordm9pZCBWYWx1ZTo6ZHVtcE1l
dGEoUHJpbnRTdHJlYW0mKSBjb25zdAoreworfQorCitUeXBlIFZhbHVlOjp0eXBlRm9yKE9wY29k
ZSBvcGNvZGUsIFZhbHVlKiBmaXJzdENoaWxkKQoreworICAgIHN3aXRjaCAob3Bjb2RlKSB7Cisg
ICAgY2FzZSBJZGVudGl0eToKKyAgICBjYXNlIEFkZDoKKyAgICBjYXNlIFN1YjoKKyAgICBjYXNl
IE11bDoKKyAgICBjYXNlIERpdjoKKyAgICBjYXNlIENoaWxsRGl2OgorICAgIGNhc2UgTW9kOgor
ICAgIGNhc2UgQml0QW5kOgorICAgIGNhc2UgQml0T3I6CisgICAgY2FzZSBCaXRYb3I6CisgICAg
Y2FzZSBTaGw6CisgICAgY2FzZSBTU2hyOgorICAgIGNhc2UgWlNocjoKKyAgICBjYXNlIENoZWNr
QWRkOgorICAgIGNhc2UgQ2hlY2tTdWI6CisgICAgY2FzZSBDaGVja011bDoKKyAgICAgICAgcmV0
dXJuIGZpcnN0Q2hpbGQtPnR5cGUoKTsKKyAgICBjYXNlIEZyYW1lUG9pbnRlcjoKKyAgICAgICAg
cmV0dXJuIHBvaW50ZXIoKTsKKyAgICBjYXNlIFNFeHQ4OgorICAgIGNhc2UgU0V4dDE2OgorICAg
IGNhc2UgRFRvSTMyOgorICAgIGNhc2UgRXF1YWw6CisgICAgY2FzZSBOb3RFcXVhbDoKKyAgICBj
YXNlIExlc3NUaGFuOgorICAgIGNhc2UgR3JlYXRlclRoYW46CisgICAgY2FzZSBMZXNzRXF1YWw6
CisgICAgY2FzZSBHcmVhdGVyRXF1YWw6CisgICAgY2FzZSBBYm92ZToKKyAgICBjYXNlIEJlbG93
OgorICAgIGNhc2UgQWJvdmVFcXVhbDoKKyAgICBjYXNlIEJlbG93RXF1YWw6CisgICAgICAgIHJl
dHVybiBJbnQzMjsKKyAgICBjYXNlIFNFeHQzMjoKKyAgICBjYXNlIFpFeHQzMjoKKyAgICAgICAg
cmV0dXJuIEludDY0OworICAgIGNhc2UgRlJvdW5kOgorICAgIGNhc2UgSVRvRDoKKyAgICAgICAg
cmV0dXJuIERvdWJsZTsKKyAgICBjYXNlIE5vcDoKKyAgICAgICAgcmV0dXJuIFZvaWQ7CisgICAg
ZGVmYXVsdDoKKyAgICAgICAgUkVMRUFTRV9BU1NFUlRfTk9UX1JFQUNIRUQoKTsKKyAgICB9Cit9
CisKK30gfSAvLyBuYW1lc3BhY2UgSlNDOjpCMworCkluZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENv
cmUvYjMvQjNWYWx1ZS5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9C
M1ZhbHVlLmgJKHJldmlzaW9uIDApCisrKyBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNWYWx1
ZS5oCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsMTk1IEBACisvKgorICogQ29weXJpZ2h0IChD
KSAyMDE1IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1
dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQK
KyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dp
bmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3Vy
Y2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRo
aXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAy
LiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3Zl
IGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhl
IGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Ig
b3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBU
SElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkK
KyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElN
SVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFO
RCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJ
TiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxF
IEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1Q
TEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRF
RCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExP
U1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9O
KSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVU
SEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5H
IE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBV
U0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJ
VFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisKKyNpZm5kZWYgQjNWYWx1ZV9oCisjZGVmaW5lIEIz
VmFsdWVfaAorCisjaW5jbHVkZSAiQjNPcmlnaW4uaCIKKyNpbmNsdWRlICJCM1R5cGUuaCIKKyNp
bmNsdWRlIDx3dGYvRmFzdE1hbGxvYy5oPgorI2luY2x1ZGUgPHd0Zi9Ob25jb3B5YWJsZS5oPgor
CituYW1lc3BhY2UgSlNDIHsgbmFtZXNwYWNlIEIzIHsKKworY2xhc3MgVmFsdWUgeworICAgIFdU
Rl9NQUtFX05PTkNPUFlBQkxFKFZhbHVlKTsKKyAgICBXVEZfTUFLRV9GQVNUX0FMTE9DQVRFRDsK
K3B1YmxpYzoKKyAgICB0eXBlZGVmIFZlY3RvcjxWYWx1ZSosIDM+IEFkamFjZW5jeUxpc3Q7CisK
KyAgICBzdGF0aWMgY29uc3QgY2hhciogZHVtcFByZWZpeCA9ICJAIjsKKworICAgIHN0YXRpYyBi
b29sIGFjY2VwdHMoT3Bjb2RlKSB7IHJldHVybiB0cnVlOyB9CisKKyAgICB2aXJ0dWFsIH5WYWx1
ZSgpOworCisgICAgdW5zaWduZWQgaW5kZXgoKSBjb25zdCB7IHJldHVybiBtX2luZGV4OyB9Cisg
ICAgCisgICAgLy8gTm90ZSB0aGF0IHRoZSBvcGNvZGUgaXMgaW1tdXRhYmxlLCBleGNlcHQgZm9y
IHJlcGxhY2luZyB2YWx1ZXMgd2l0aCBpZGVudGl0eS4KKyAgICBPcGNvZGUgb3Bjb2RlKCkgY29u
c3QgeyByZXR1cm4gbV9vcGNvZGU7IH0KKworICAgIE9yaWdpbiBvcmlnaW4oKSBjb25zdCB7IHJl
dHVybiBtX29yaWdpbjsgfQorICAgIAorICAgIFZhbHVlKiYgY2hpbGQodW5zaWduZWQgaW5kZXgp
IHsgcmV0dXJuIG1fY2hpbGRyZW5baW5kZXhdOyB9CisgICAgVmFsdWUqIGNoaWxkKHVuc2lnbmVk
IGluZGV4KSBjb25zdCB7IHJldHVybiBtX2NoaWxkcmVuW2luZGV4XTsgfQorCisgICAgLy8gVGhp
cyBjb21wdXRlcyB0aGUgdHlwZSB1c2luZyB0aGUgb3Bjb2RlLgorICAgIFR5cGUgdHlwZSgpIGNv
bnN0IHsgcmV0dXJuIG1fdHlwZTsgfQorCisgICAgQWRqYWNlbmN5TGlzdCYgY2hpbGRyZW4oKSB7
IHJldHVybiBtX2NoaWxkcmVuOyB9IAorICAgIGNvbnN0IEFkamFjZW5jeUxpc3QmIGNoaWxkcmVu
KCkgY29uc3QgeyByZXR1cm4gbV9jaGlsZHJlbjsgfQorCisgICAgdm9pZCByZXBsYWNlV2l0aElk
ZW50aXR5KFZhbHVlKik7CisgICAgdm9pZCByZXBsYWNlV2l0aE5vcCgpOworCisgICAgdm9pZCBk
dW1wKFByaW50U3RyZWFtJikgY29uc3Q7CisgICAgdm9pZCBkZWVwRHVtcChQcmludFN0cmVhbSYp
IGNvbnN0OworCisgICAgLy8gVGhpcyBpcyBob3cgeW91IGNhc3QgVmFsdWVzLiBGb3IgZXhhbXBs
ZSwgaWYgeW91IHdhbnQgdG8gZG8gc29tZXRoaW5nIHByb3ZpZGVkIHRoYXQgd2UgaGF2ZSBhCisg
ICAgLy8gQXJndW1lbnRSZWdWYWx1ZSwgeW91IGNhbiBkbzoKKyAgICAvLworICAgIC8vIGlmIChB
cmd1bWVudFJlZ1ZhbHVlKiBhcmd1bWVudFJlZyA9IHZhbHVlLT5hczxBcmd1bWVudFJlZ1ZhbHVl
PigpKSB7CisgICAgLy8gICAgIHRoaW5ncworICAgIC8vIH0KKyAgICAvLworICAgIC8vIFRoaXMg
d2lsbCByZXR1cm4gbnVsbCBpZiB0aGlzIG9wY29kZSgpICE9IEFyZ3VtZW50UmVnLiBUaGlzIHdv
cmtzIGJlY2F1c2UgdGhpcyByZXR1cm5zIG51bGxwdHIKKyAgICAvLyBpZiBUOjphY2NlcHRzKG9w
Y29kZSgpKSByZXR1cm5zIGZhbHNlLgorICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+CisgICAgVCog
YXMoKTsKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorICAgIGNvbnN0IFQqIGFzKCkgY29uc3Q7
CisgICAgCisgICAgYm9vbCBoYXNJbnQzMigpIGNvbnN0OworICAgIGludDMyX3QgYXNJbnQzMigp
IGNvbnN0OworICAgIAorICAgIGJvb2wgaGFzSW50NjQoKSBjb25zdDsKKyAgICBpbnQ2NF90IGFz
SW50NjQoKSBjb25zdDsKKworICAgIGJvb2wgaGFzSW50KCkgY29uc3Q7CisgICAgaW50NjRfdCBh
c0ludCgpIGNvbnN0OworICAgIGJvb2wgaXNJbnQoaW50NjRfdCB2YWx1ZSkgY29uc3Q7CisKKyAg
ICBib29sIGhhc0RvdWJsZSgpIGNvbnN0OworICAgIGRvdWJsZSBhc0RvdWJsZSgpIGNvbnN0Owor
CisgICAgU3RhY2ttYXAqIHN0YWNrbWFwKCk7CisKK3Byb3RlY3RlZDoKKyAgICB2aXJ0dWFsIHZv
aWQgZHVtcE1ldGEoUHJpbnRTdHJlYW0mKSBjb25zdDsKKyAgICAKK3ByaXZhdGU6CisgICAgZnJp
ZW5kIGNsYXNzIFByb2NlZHVyZTsKKyAgICAKKyAgICAvLyBJbnN0YW50aWF0ZSB2YWx1ZXMgdmlh
IFByb2NlZHVyZS4KKyAgICAvLyBUaGlzIGZvcm0gcmVxdWlyZXMgc3BlY2lmeWluZyB0aGUgdHlw
ZSBleHBsaWNpdGx5OgorICAgIHRlbXBsYXRlPHR5cGVuYW1lLi4uIEFyZ3VtZW50cz4KKyAgICBl
eHBsaWNpdCBWYWx1ZSh1bnNpZ25lZCBpbmRleCwgT3Bjb2RlIG9wY29kZSwgVHlwZSB0eXBlLCBP
cmlnaW4gb3JpZ2luLCBWYWx1ZSogZmlyc3RDaGlsZCwgQXJndW1lbnRzLi4uIGFyZ3VtZW50cykK
KyAgICAgICAgOiBtX2luZGV4KGluZGV4KQorICAgICAgICAsIG1fb3Bjb2RlKG9wY29kZSkKKyAg
ICAgICAgLCBtX3R5cGUodHlwZSkKKyAgICAgICAgLCBtX29yaWdpbihvcmlnaW4pCisgICAgICAg
ICwgbV9jaGlsZHJlbnsgZmlyc3RDaGlsZCwgYXJndW1lbnRzLi4uIH0KKyAgICB7CisgICAgfQor
ICAgIC8vIFRoaXMgZm9ybSBpcyBmb3Igc3BlY2lmeWluZyB0aGUgdHlwZSBleHBsaWNpdGx5IHdo
ZW4gdGhlIG9wY29kZSBoYXMgbm8gY2hpbGRyZW46CisgICAgZXhwbGljaXQgVmFsdWUodW5zaWdu
ZWQgaW5kZXgsIE9wY29kZSBvcGNvZGUsIFR5cGUgdHlwZSwgT3JpZ2luIG9yaWdpbikKKyAgICAg
ICAgOiBtX2luZGV4KGluZGV4KQorICAgICAgICAsIG1fb3Bjb2RlKG9wY29kZSkKKyAgICAgICAg
LCBtX3R5cGUodHlwZSkKKyAgICAgICAgLCBtX29yaWdpbihvcmlnaW4pCisgICAgeworICAgIH0K
KyAgICAvLyBUaGlzIGZvcm0gaXMgZm9yIHRob3NlIG9wY29kZXMgdGhhdCBjYW4gaW5mZXIgdGhl
aXIgdHlwZSBmcm9tIHRoZSBvcGNvZGUgYW5kIGZpcnN0IGNoaWxkOgorICAgIHRlbXBsYXRlPHR5
cGVuYW1lLi4uIEFyZ3VtZW50cz4KKyAgICBleHBsaWNpdCBWYWx1ZSh1bnNpZ25lZCBpbmRleCwg
T3Bjb2RlIG9wY29kZSwgT3JpZ2luIG9yaWdpbiwgVmFsdWUqIGZpcnN0Q2hpbGQsIEFyZ3VtZW50
cy4uLiBhcmd1bWVudHMpCisgICAgICAgIDogbV9pbmRleChpbmRleCkKKyAgICAgICAgLCBtX29w
Y29kZShvcGNvZGUpCisgICAgICAgICwgbV90eXBlKHR5cGVGb3Iob3Bjb2RlLCBmaXJzdENoaWxk
KSkKKyAgICAgICAgLCBtX29yaWdpbihvcmlnaW4pCisgICAgICAgICwgbV9jaGlsZHJlbnsgZmly
c3RDaGlsZCwgYXJndW1lbnRzLi4uIH0KKyAgICB7CisgICAgfQorICAgIC8vIFRoaXMgZm9ybSBp
cyBmb3IgdGhvc2Ugb3Bjb2RlcyB0aGF0IGNhbiBpbmZlciB0aGVpciB0eXBlIGZyb20gdGhlIG9w
Y29kZSBhbG9uZSwgYW5kIHRoYXQgZG9uJ3QKKyAgICAvLyB0YWtlIGFueSBhcmd1bWVudHM6Cisg
ICAgZXhwbGljaXQgVmFsdWUodW5zaWduZWQgaW5kZXgsIE9wY29kZSBvcGNvZGUsIE9yaWdpbiBv
cmlnaW4pCisgICAgICAgIDogbV9pbmRleChpbmRleCkKKyAgICAgICAgLCBtX29wY29kZShvcGNv
ZGUpCisgICAgICAgICwgbV90eXBlKHR5cGVGb3Iob3Bjb2RlLCBudWxscHRyKSkKKyAgICAgICAg
LCBtX29yaWdpbihvcmlnaW4pCisgICAgeworICAgIH0KKyAgICAvLyBVc2UgdGhpcyBmb3JtIGZv
ciB2YXJhcmdzLgorICAgIGV4cGljaXQgVmFsdWUodW5zaWduZWQgaW5kZXgsIE9wY29kZSBvcGNv
ZGUsIFR5cGUgdHlwZSwgT3JpZ2luIG9yaWdpbiwgY29uc3QgQWRqYWNlbmN5TGlzdCYgY2hpbGRy
ZW4pCisgICAgICAgIDogbV9pbmRleChpbmRleCkKKyAgICAgICAgLCBtX29wY29kZShvcGNvZGUp
CisgICAgICAgICwgbV90eXBlKHR5cGUpCisgICAgICAgICwgbV9vcmlnaW4ob3JpZ2luKQorICAg
ICAgICAsIG1fY2hpbGRyZW4oY2hpbGRyZW4pCisgICAgeworICAgIH0KKworICAgIHN0YXRpYyBU
eXBlIHR5cGVGb3IoT3Bjb2RlLCBWYWx1ZSogZmlyc3RDaGlsZCk7CisKKyAgICAvLyBUaGlzIGdy
b3VwIG9mIGZpZWxkcyBpcyBhcnJhbmdlZCB0byBmaXQgaW4gNjQgYml0cy4KKyAgICB1bnNpZ25l
ZCBtX2luZGV4OworICAgIE9wY29kZSBtX29wY29kZTsKKyAgICBUeXBlIG1fdHlwZTsKKyAgICAK
KyAgICBPcmlnaW4gbV9vcmlnaW47CisgICAgQWRqYWNlbmN5TGlzdCBtX2NoaWxkcmVuOworCitw
dWJsaWM6CisgICAgQmFzaWNCbG9jayogb3duZXIgeyBudWxscHRyIH07IC8vIGNvbXB1dGVkIGxh
emlseS4KKyAgICBWYWx1ZSogcmVwbGFjZW1lbnQgeyBudWxscHRyIH07IC8vIHVzZWQgZm9yIGFu
YWx5c2VzIGFuZCB0cmFuc2Zvcm1hdGlvbnMuCit9OworCitjbGFzcyBEZWVwVmFsdWVEdW1wIHsK
K3B1YmxpYzoKKyAgICBEZWVwVmFsdWVEdW1wKFZhbHVlKiB2YWx1ZSkKKyAgICAgICAgOiBtX3Zh
bHVlKHZhbHVlKQorICAgIHsKKyAgICB9CisKKyAgICB2b2lkIGR1bXAoUHJpbnRTdHJlYW0mIG91
dCkgY29uc3QKKyAgICB7CisgICAgICAgIGlmIChtX3ZhbHVlKQorICAgICAgICAgICAgbV92YWx1
ZS0+ZGVlcER1bXAob3V0KTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgb3V0LnByaW50KCI8
bnVsbD4iKTsKKyAgICB9CisKK3ByaXZhdGU6CisgICAgVmFsdWUqIG1fdmFsdWU7Cit9OworCitE
ZWVwVmFsdWVEdW1wIGRlZXBEdW1wKFZhbHVlKiB2YWx1ZSkKK3sKKyAgICByZXR1cm4gRGVlcFZh
bHVlRHVtcCh2YWx1ZSk7Cit9CisKK30gfSAvLyBuYW1lc3BhY2UgSlNDOjpCMworCisjZW5kaWYg
Ly8gQjNWYWx1ZV9oCisKSW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM1ZhbHVlSW5s
aW5lcy5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM1ZhbHVlSW5s
aW5lcy5oCShyZXZpc2lvbiAwKQorKysgU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzVmFsdWVJ
bmxpbmVzLmgJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSwxMDkgQEAKKy8qCisgKiBDb3B5cmln
aHQgKEMpIDIwMTUgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlz
dHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0
aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZv
bGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9m
IHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGlj
ZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4K
KyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUg
YWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFu
ZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFu
ZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoK
KyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFTIElTJycgQU5E
IEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5P
VCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJ
VFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1F
RC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBM
SUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICog
RVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBM
SU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNF
UzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJV
UFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFks
IFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNM
VURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0Yg
VEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NT
SUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKworI2lmbmRlZiBCM1ZhbHVlSW5saW5lc19o
CisjZGVmaW5lIEIzVmFsdWVJbmxpbmVzX2gKKworI2luY2x1ZGUgIkIzQ2hlY2tWYWx1ZS5oIgor
I2luY2x1ZGUgIkIzQ29uc3QzMlZhbHVlLmgiCisjaW5jbHVkZSAiQjNDb25zdDY0VmFsdWUuaCIK
KyNpbmNsdWRlICJCM0NvbnN0RG91YmxlVmFsdWUuaCIKKyNpbmNsdWRlICJCM1BhdGNocG9pbnRW
YWx1ZS5oIgorI2luY2x1ZGUgIkIzVmFsdWUuaCIKKworbmFtZXNwYWNlIEpTQyB7IG5hbWVzcGFj
ZSBCMyB7CisKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+CitUKiBWYWx1ZTo6YXMoKQoreworICAgIGlm
IChUOjphY2NlcHRzKG9wY29kZSgpKSkKKyAgICAgICAgcmV0dXJuIHN0YXRpY19jYXN0PFQqPih0
aGlzKTsKKyAgICByZXR1cm4gbnVsbHB0cjsKK30KKwordGVtcGxhdGU+dHlwZW5hbWUgVD4KK2Nv
bnN0IFQqIFZhbHVlOjphcygpIGNvbnN0Cit7CisgICAgcmV0dXJuIGNvbnN0X2Nhc3Q8VmFsdWUq
Pih0aGlzKS0+YXM8VD4oKTsKK30KKworYm9vbCBWYWx1ZTo6aGFzSW50MzIoKSBjb25zdAorewor
ICAgIHJldHVybiAhIWFzPENvbnN0MzJWYWx1ZT4oKTsKK30KKworaW50MzJfdCBWYWx1ZTo6YXNJ
bnQzMigpIGNvbnN0Cit7CisgICAgcmV0dXJuIGFzPENvbnN0MzJWYWx1ZT4oKS0+dmFsdWUoKTsK
K30KKworYm9vbCBWYWx1ZTo6aGFzSW50NjQoKSBjb25zdAoreworICAgIHJldHVybiAhIWFzPENv
bnN0NjRWYWx1ZT4oKTsKK30KKworaW50NjRfdCBWYWx1ZTo6YXNJbnQ2NCgpIGNvbnN0Cit7Cisg
ICAgcmV0dXJuIGFzPENvbnN0NjRWYWx1ZT4oKS0+dmFsdWUoKTsKK30KKworYm9vbCBWYWx1ZTo6
aGFzSW50KCkgY29uc3QKK3sKKyAgICByZXR1cm4gaGFzSW50MzIoKSB8fCBoYXNJbnQ2NCgpOwor
fQorCitpbnQ2NF90IFZhbHVlOjphc0ludCgpIGNvbnN0Cit7CisgICAgcmV0dXJuIGhhc0ludDMy
KCkgPyBhc0ludDMyKCkgOiBhc0ludDY0KCk7Cit9CisKK2Jvb2wgVmFsdWU6OmlzSW50KGludDY0
X3QgdmFsdWUpIGNvbnN0Cit7CisgICAgcmV0dXJuIGhhc0ludCgpICYmIGFzSW50KCkgPT0gdmFs
dWU7Cit9CisKK2Jvb2wgVmFsdWU6Omhhc0RvdWJsZSgpIGNvbnN0Cit7CisgICAgcmV0dXJuICEh
YXM8Q29uc3REb3VibGVWYWx1ZT4oKTsKK30KKworZG91YmxlIFZhbHVlOjphc0RvdWJsZSgpIGNv
bnN0Cit7CisgICAgcmV0dXJuIGFzPENvbnN0RG91YmxlVmFsdWU+KCktPnZhbHVlKCk7Cit9CisK
K1N0YWNrbWFwKiBWYWx1ZTo6c3RhY2ttYXAoKQoreworICAgIGlmIChDaGVja1ZhbHVlKiBjaGVj
ayA9IGFzPENoZWNrVmFsdWU+KCkpCisgICAgICAgIHJldHVybiAmY2hlY2stPnN0YWNrbWFwOwor
ICAgIGlmIChQYXRjaHBvaW50VmFsdWUqIHBhdGNocG9pbnQgPSBhczxQYXRjaHBvaW50VmFsdWU+
KCkpCisgICAgICAgIHJldHVybiAmcGF0Y2hwb2ludC0+c3RhY2ttYXA7CisgICAgcmV0dXJuIG51
bGxwdHI7Cit9CisKK30gfSAvLyBuYW1lc3BhY2UgSlNDOjpCMworCisjZW5kaWYgLy8gQjNWYWx1
ZUlubGluZXNfaAorCkluZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNWYWx1ZVJlcC5j
cHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzVmFsdWVSZXAuY3Bw
CShyZXZpc2lvbiAwKQorKysgU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzVmFsdWVSZXAuY3Bw
CSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsODYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIw
MTUgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9u
IGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICog
bW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBj
b25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBj
b2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBs
aXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJl
ZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29w
eXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9s
bG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhl
ciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMg
U09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICog
RVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVE
IFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJ
VE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5P
IEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9S
IEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZ
LCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRP
LAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBP
RiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhP
V0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIg
SU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVH
TElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQor
ICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBP
RiBTVUNIIERBTUFHRS4gCisgKi8KKworI2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgIkIz
VmFsdWVSZXAuaCIKKworbmFtZXNwYWNlIEpTQyB7IG5hbWVzcGFjZSBCMyB7CisKK3ZvaWQgVmFs
dWVSZXA6OmR1bXAoUHJpbnRTdHJlYW0mIG91dCkgY29uc3QKK3sKKyAgICBvdXQucHJpbnQobV9r
aW5kKTsKKyAgICBzd2l0Y2ggKG1fa2luZCkgeworICAgIGNhc2UgTm9uZToKKyAgICBjYXNlIFNv
bWVSZWdpc3RlcjoKKyAgICAgICAgcmV0dXJuOworICAgIGNhc2UgUmVnaXN0ZXI6CisgICAgICAg
IG91dC5wcmludCgiKCIsIHJlZygpLCAiKSIpOworICAgICAgICByZXR1cm47CisgICAgY2FzZSBT
dGFjazoKKyAgICAgICAgb3V0LnByaW50KCIoIiwgb2Zmc2V0RnJvbUZQKCksICIpIik7CisgICAg
ICAgIHJldHVybjsKKyAgICBjYXNlIFN0YWNrQXJndW1lbnQ6CisgICAgICAgIG91dC5wcmludCgi
KCIsIG9mZnNldEZyb21TUCgpLCAiKSIpOworICAgICAgICByZXR1cm47CisgICAgY2FzZSBDb25z
dGFudDoKKyAgICAgICAgb3V0LnByaW50KCIoIiwgdmFsdWUoKSwgIikiKTsKKyAgICAgICAgcmV0
dXJuOworICAgIH0KKyAgICBSRUxFQVNFX0FTU0VSVF9OT1RfUkVBQ0hFRCgpOworfQorCit9IH0g
Ly8gbmFtZXNwYWNlIEpTQzo6QjMKKworbmFtZXNwYWNlIFdURiB7CisKK3VzaW5nIG5hbWVzcGFj
ZSBKU0M6OkIzOworCit2b2lkIHByaW50SW50ZXJuYWwoUHJpbnRTdHJlYW0mIG91dCwgVmFsdWVS
ZXA6OktpbmQga2luZCkKK3sKKyAgICBzd2l0Y2ggKGtpbmQpIHsKKyAgICBjYXNlIFZhbHVlUmVw
OjpBbnk6CisgICAgICAgIG91dC5wcmludCgiQW55Iik7CisgICAgICAgIHJldHVybjsKKyAgICBj
YXNlIFZhbHVlUmVwOjpTb21lUmVnaXN0ZXI6CisgICAgICAgIG91dC5wcmludCgiU29tZVJlZ2lz
dGVyIik7CisgICAgICAgIHJldHVybjsKKyAgICBjYXNlIFZhbHVlUmVwOjpSZWdpc3RlcjoKKyAg
ICAgICAgb3V0LnByaW50KCJSZWdpc3RlciIpOworICAgICAgICByZXR1cm47CisgICAgY2FzZSBW
YWx1ZVJlcDo6U3RhY2s6CisgICAgICAgIG91dC5wcmludCgiU3RhY2siKTsKKyAgICAgICAgcmV0
dXJuOworICAgIGNhc2UgVmFsdWVSZXA6OlN0YWNrQXJndW1lbnQ6CisgICAgICAgIG91dC5wcmlu
dCgiU3RhY2tBcmd1bWVudCIpOworICAgICAgICByZXR1cm47CisgICAgY2FzZSBWYWx1ZVJlcDo6
Q29uc3RhbnQ6CisgICAgICAgIG91dC5wcmludCgiQ29uc3RhbnQiKTsKKyAgICAgICAgcmV0dXJu
OworICAgIH0KKyAgICBSRUxFQVNFX0FTU0VSVF9OT1RfUkVBQ0hFRCgpOworfQorCit9IC8vIG5h
bWVzcGFjZSBXVEYKKwpJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzVmFsdWVSZXAu
aAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNWYWx1ZVJlcC5oCShy
ZXZpc2lvbiAwKQorKysgU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzVmFsdWVSZXAuaAkod29y
a2luZyBjb3B5KQpAQCAtMCwwICsxLDE1OCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNSBB
cHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5k
IHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2Rp
ZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRp
dGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUg
bXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qg
b2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0
cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmln
aHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dp
bmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1h
dGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZU
V0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBS
RVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8s
IFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVT
UyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZF
TlQgU0hBTEwgQVBQTEUgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5Z
IERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9S
IENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisg
KiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVT
RSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZF
UiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBD
T05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdF
TkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBP
RiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNV
Q0ggREFNQUdFLiAKKyAqLworCisjaWZuZGVmIEIzVmFsdWVSZXBfaAorI2RlZmluZSBCM1ZhbHVl
UmVwX2gKKworI2luY2x1ZGUgIlJlZy5oIgorI2luY2x1ZGUgPHd0Zi9QcmludFN0cmVhbS5oPgor
CituYW1lc3BhY2UgSlNDIHsgbmFtZXNwYWNlIEIzIHsKKworLy8gV2UgdXNlIHRoaXMgY2xhc3Mg
dG8gZGVzY3JpYmUgdmFsdWUgcmVwcmVzZW50YXRpb25zIGF0IHN0YWNrbWFwcy4gSXQncyB1c2Vk
IGJvdGggdG8gZm9yY2UgYQorLy8gcmVwcmVzZW50YXRpb24gYW5kIHRvIGdldCB0aGUgcmVwcmVz
ZW50YXRpb24uIFdoZW4gdGhlIEIzIGNsaWVudCBmb3JjZXMgYSByZXByZXNlbnRhdGlvbiwgd2Ug
c2F5CisvLyB0aGF0IGl0J3MgYW4gaW5wdXQuIFdoZW4gQjMgdGVsbHMgdGhlIGNsaWVudCB3aGF0
IHJlcHJlc2VudGF0aW9uIGl0IHBpY2tlZCwgd2Ugc2F5IHRoYXQgaXQncyBhbgorLy8gb3V0cHV0
LgorCitjbGFzcyBWYWx1ZVJlcCB7CitwdWJsaWM6CisgICAgZW51bSBLaW5kIHsKKyAgICAgICAg
Ly8gQXMgYW4gaW5wdXQgcmVwcmVzZW50YXRpb24sIHRoaXMgbWVhbnMgdGhhdCBCMyBjYW4gcGlj
ayBhbnkgcmVwcmVzZW50YXRpb24uIEFzIGFuCisgICAgICAgIC8vIG91dHB1dCByZXByZXNlbnRh
dGlvbiwgdGhpcyBtZWFucyB0aGF0IHdlIGRvbid0IGtub3cuIFRoaXMgd2lsbCBvbmx5IGFyaXNl
IGZvciB0aGUKKyAgICAgICAgLy8gcmlnaHQgb3BlcmFuZCAoaS5lLiBjaGlsZCgxKSkgb2YgYSBD
aGVja011bC4KKyAgICAgICAgQW55LAorCisgICAgICAgIC8vIEFzIGFuIGlucHV0IHJlcHJlc2Vu
dGF0aW9uLCB0aGlzIG1lYW5zIHRoYXQgQjMgc2hvdWxkIHBpY2sgc29tZSByZWdpc3Rlci4gSXQg
Y291bGQgYmUgYQorICAgICAgICAvLyByZWdpc3RlciB0aGF0IHRoaXMgY2xhaW1zIHRvIGNsb2Ji
ZXIhCisgICAgICAgIFNvbWVSZWdpc3RlciwKKworICAgICAgICAvLyBBcyBhbiBpbnB1dCByZXBy
ZXNlbnRhdGlvbiwgdGhpcyBmb3JjZXMgYSBwYXJ0aWN1bGFyIHJlZ2lzdGVyLiBBcyBhbiBvdXRw
dXQKKyAgICAgICAgLy8gcmVwcmVzZW50YXRpb24sIHRoaXMgdGVsbHMgdXMgd2hhdCByZWdpc3Rl
ciBCMyBwaWNrZWQuCisgICAgICAgIFJlZ2lzdGVyLAorCisgICAgICAgIC8vIEFzIGFuIG91dHB1
dCByZXByZXNlbnRhdGlvbiwgdGhpcyB0ZWxscyB1cyB3aGF0IHN0YWNrIHNsb3QgQjMgcGlja2Vk
LiBJdCdzIG5vdCBhIHZhbGlkCisgICAgICAgIC8vIGlucHV0IHJlcHJlc2VudGF0aW9uLgorICAg
ICAgICBTdGFjaywKKworICAgICAgICAvLyBBcyBhbiBpbnB1dCByZXByZXNlbnRhdGlvbiwgdGhp
cyBmb3JjZXMgdGhlIHZhbHVlIHRvIGVuZCB1cCBpbiB0aGUgYXJndW1lbnQgYXJlYSBhdCBzb21l
CisgICAgICAgIC8vIG9mZnNldC4KKyAgICAgICAgU3RhY2tBcmd1bWVudCwKKworICAgICAgICAv
LyBBcyBhbiBvdXRwdXQgcmVwcmVzZW50YXRpb24sIHRoaXMgdGVsbHMgdXMgdGhhdCBCMyBjb25z
dGFudC1mb2xkZWQgdGhlIHZhbHVlLgorICAgICAgICBDb25zdGFudAorICAgIH07CisgICAgCisg
ICAgVmFsdWVSZXAoKQorICAgICAgICA6IG1fa2luZChBbnkpCisgICAgeworICAgIH0KKworICAg
IGV4cGxpY2l0IFZhbHVlUmVwKFJlZyByZWcpCisgICAgICAgIDogbV9raW5kKFJlZ2lzdGVyKQor
ICAgICAgICAsIG1fdmFsdWUocmVnLmluZGV4KCkpCisgICAgeworICAgIH0KKworICAgIHN0YXRp
YyBWYWx1ZVJlcCByZWcoUmVnIHJlZykKKyAgICB7CisgICAgICAgIHJldHVybiBWYWx1ZVJlcChy
ZWcpOworICAgIH0KKworICAgIHN0YXRpYyBWYWx1ZVJlcCBzdGFjayhpbnRwdHJfdCBvZmZzZXRG
cm9tRlApCisgICAgeworICAgICAgICBWYWx1ZVJlcCByZXN1bHQ7CisgICAgICAgIHJlc3VsdC5t
X2tpbmQgPSBTdGFjazsKKyAgICAgICAgcmVzdWx0Lm1fdmFsdWUgPSBvZmZzZXRGcm9tRlA7Cisg
ICAgfQorCisgICAgc3RhdGljIFZhbHVlUmVwIHN0YWNrQXJndW1lbnQoaW50cHRyX3Qgb2Zmc2V0
RnJvbVNQKQorICAgIHsKKyAgICAgICAgVmFsdWVSZXAgcmVzdWx0OworICAgICAgICByZXN1bHQu
bV9raW5kID0gU3RhY2tBcmd1bWVudDsKKyAgICAgICAgcmVzdWx0Lm1fdmFsdWUgPSBvZmZzZXRG
cm9tU1A7CisgICAgfQorCisgICAgc3RhdGljIFZhbHVlUmVwIGNvbnN0YW50KGludDY0X3QgdmFs
dWUpCisgICAgeworICAgICAgICBWYWx1ZVJlcCByZXN1bHQ7CisgICAgICAgIHJlc3VsdC5tX2tp
bmQgPSBDb25zdGFudDsKKyAgICAgICAgcmVzdWx0Lm1fdmFsdWUgPSB2YWx1ZTsKKyAgICB9CisK
KyAgICBzdGF0aWMgVmFsdWVSZXAgY29uc3RhbnREb3VibGUoZG91YmxlIHZhbHVlKQorICAgIHsK
KyAgICAgICAgcmV0dXJuIFZhbHVlUmVwKGJpdHdpc2VfY2FzdDxpbnQ2NF90Pih2YWx1ZSkpOwor
ICAgIH0KKworICAgIEtpbmQga2luZCgpIGNvbnN0IHsgcmV0dXJuIG1fa2luZDsgfQorCisgICAg
ZXhwbGljaXQgb3BlcmF0b3IgYm9vbCgpIGNvbnN0IHsgcmV0dXJuIGtpbmQoKSAhPSBBbnk7IH0K
KworICAgIFJlZyByZWcoKSBjb25zdAorICAgIHsKKyAgICAgICAgQVNTRVJUKGtpbmQoKSA9PSBS
ZWdpc3Rlcik7CisgICAgICAgIHJldHVybiBSZWc6OmZyb21JbmRleChtX3ZhbHVlKTsKKyAgICB9
CisKKyAgICBpbnRwdHJfdCBvZmZzZXRGcm9tRlAoKSBjb25zdAorICAgIHsKKyAgICAgICAgQVNT
RVJUKGtpbmQoKSA9PSBTdGFjayk7CisgICAgICAgIHJldHVybiBzdGF0aWNfY2FzdDxpbnRwdHJf
dD4obV92YWx1ZSk7CisgICAgfQorCisgICAgaW50cHRyX3Qgb2Zmc2V0RnJvbVNQKCkgY29uc3QK
KyAgICB7CisgICAgICAgIEFTU0VSVChraW5kKCkgPT0gU3RhY2tBcmd1bWVudCk7CisgICAgICAg
IHJldHVybiBzdGF0aWNfY2FzdDxpbnRwdHJfdD4obV92YWx1ZSk7CisgICAgfQorCisgICAgaW50
NjRfdCB2YWx1ZSgpIGNvbnN0CisgICAgeworICAgICAgICBBU1NFUlQoa2luZCgpID09IENvbnN0
YW50KTsKKyAgICAgICAgcmV0dXJuIG1fdmFsdWU7CisgICAgfQorCisgICAgZG91YmxlIGRvdWJs
ZVZhbHVlKCkgY29uc3QKKyAgICB7CisgICAgICAgIHJldHVybiBiaXR3aXNlX2Nhc3Q8ZG91Ymxl
Pih2YWx1ZSgpKTsKKyAgICB9CisKKyAgICB2b2lkIGR1bXAoUHJpbnRTdHJlYW0mKSBjb25zdDsK
KworcHJpdmF0ZToKKyAgICBLaW5kIG1fa2luZDsKKyAgICBpbnQ2NF90IG1fdmFsdWU7Cit9Owor
Cit9IH0gLy8gbmFtZXNwYWNlIEpTQzo6QjMKKworbmFtZXNwYWNlIFdURiB7CisKK3ZvaWQgcHJp
bnRJbnRlcm5hbChQcmludFN0cmVhbSYsIEpTQzo6QjM6OlZhbHVlUmVwOjpLaW5kKTsKKworfSAv
LyBuYW1lc3BhY2UgV1RGCisKKyNlbmRpZiAvLyBCM1ZhbHVlUmVwX2gKKwpJbmRleDogU291cmNl
L0phdmFTY3JpcHRDb3JlL2IzL2dlbmVyYXRlX3BhdHRlcm5fbWF0Y2hlci5yYgo9PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvZ2VuZXJhdGVfcGF0dGVybl9tYXRjaGVyLnJi
CShyZXZpc2lvbiAwKQorKysgU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL2dlbmVyYXRlX3BhdHRl
cm5fbWF0Y2hlci5yYgkod29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDQ5MyBAQAorIyEvdXNyL2Jp
bi9lbnYgcnVieQorCisjIENvcHlyaWdodCAoQykgMjAxNSBBcHBsZSBJbmMuIEFsbCByaWdodHMg
cmVzZXJ2ZWQuCisjCisjIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5h
cnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorIyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQg
cHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyMgYXJlIG1ldDoKKyMgMS4g
UmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5
cmlnaHQKKyMgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxv
d2luZyBkaXNjbGFpbWVyLgorIyAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVz
dCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorIyAgICBub3RpY2UsIHRoaXMgbGlzdCBv
ZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisjICAgIGRv
Y3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0
cmlidXRpb24uCisjCisjIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBB
TkQgSVRTIENPTlRSSUJVVE9SUyBgYEFTIElTJycKKyMgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJ
RUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisjIFRIRSBJTVBM
SUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJ
Q1VMQVIKKyMgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUg
SU5DLiBPUiBJVFMgQ09OVFJJQlVUT1JTCisjIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5E
SVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKKyMgQ09OU0VRVUVOVElB
TCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YK
KyMgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBS
T0ZJVFM7IE9SIEJVU0lORVNTCisjIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9O
IEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOCisjIENPTlRSQUNULCBTVFJJQ1Qg
TElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisj
IEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVO
IElGIEFEVklTRUQgT0YKKyMgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCityZXF1
aXJlICJwYXRobmFtZSIKKworJHZhckluZGV4ID0gMAorZGVmIG5ld1ZhcgorICAgICR2YXJJbmRl
eCArPSAxCisgICAgIl90bXAjeyR2YXJJbmRleH0iCitlbmQKKworY2xhc3MgUHJvZHVjdGlvbgor
ICAgIGF0dHJfcmVhZGVyIDpvcmlnaW4sIDpuYW1lLCA6dmFyTmFtZSwgOmFub255bW91cywgOm9w
Y29kZSwgOmNoaWxkcmVuCisKKyAgICBkZWYgaW5pdGlhbGl6ZShvcmlnaW4sIG5hbWUsIG9wY29k
ZSwgY2hpbGRyZW4pCisgICAgICAgIEBvcmlnaW4gPSBvcmlnaW4KKyAgICAgICAgQG5hbWUgPSBu
YW1lCisgICAgICAgIEBhbm9ueW1vdXMgPSAobmFtZSA9PSBuaWwgb3IgbmFtZSA9fiAvXEFcJChb
MC05XSspXFovKQorICAgICAgICBAdmFyTmFtZSA9IEBhbm9ueW1vdXMgPyBuZXdWYXIgOiBuYW1l
CisgICAgICAgIEBvcGNvZGUgPSBvcGNvZGUKKyAgICAgICAgQGNoaWxkcmVuID0gY2hpbGRyZW4g
PyBjaGlsZHJlbiA6IFtdCisgICAgZW5kCisKKyAgICBkZWYgaGFzT3Bjb2RlCisgICAgICAgIG9w
Y29kZSAhPSBuaWwKKyAgICBlbmQKKworICAgIGRlZiBlYWNoVmFyaWFibGUoJnByb2MpCisgICAg
ICAgIGNoaWxkcmVuLmVhY2hfd2l0aF9pbmRleCB7CisgICAgICAgICAgICB8IGNoaWxkLCBpbmRl
eCB8CisgICAgICAgICAgICB5aWVsZCB2YXJOYW1lLAorICAgICAgICAgICAgICAgICAgY2hpbGQu
bmFtZSwKKyAgICAgICAgICAgICAgICAgIGNoaWxkLnZhck5hbWUsCisgICAgICAgICAgICAgICAg
ICBjaGlsZC5hbm9ueW1vdXMgPyAoY2hpbGQub3Bjb2RlID8gOmFub25JbnRlcm5hbCA6IDphbm9u
T3BlcmFuZCkgOiAoY2hpbGQub3Bjb2RlID8gOmludGVybmFsIDogOm9wZXJhbmQpLAorICAgICAg
ICAgICAgICAgICAgaW5kZXgKKyAgICAgICAgICAgIGNoaWxkLmVhY2hWYXJpYWJsZSgmcHJvYykK
KyAgICAgICAgfQorICAgIGVuZAorZW5kCisKK2NsYXNzIE1hdGNoZXIKKyAgICBhdHRyX3JlYWRl
ciA6bmFtZSwgOnByb2R1Y3Rpb25zCisKKyAgICBkZWYgaW5pdGlhbGl6ZShuYW1lLCBwcm9kdWN0
aW9ucykKKyAgICAgICAgQG5hbWUgPSBuYW1lCisgICAgICAgIEBwcm9kdWN0aW9ucyA9IHByb2R1
Y3Rpb25zCisgICAgZW5kCitlbmQKKworY2xhc3MgT3JpZ2luCisgICAgYXR0cl9yZWFkZXIgOmZp
bGVOYW1lLCA6bGluZU51bWJlcgorICAgIAorICAgIGRlZiBpbml0aWFsaXplKGZpbGVOYW1lLCBs
aW5lTnVtYmVyKQorICAgICAgICBAZmlsZU5hbWUgPSBmaWxlTmFtZQorICAgICAgICBAbGluZU51
bWJlciA9IGxpbmVOdW1iZXIKKyAgICBlbmQKKyAgICAKKyAgICBkZWYgdG9fcworICAgICAgICAi
I3tmaWxlTmFtZX06I3tsaW5lTnVtYmVyfSIKKyAgICBlbmQKK2VuZAorCitjbGFzcyBUb2tlbgor
ICAgIGF0dHJfcmVhZGVyIDpvcmlnaW4sIDpzdHJpbmcKKyAgICAKKyAgICBkZWYgaW5pdGlhbGl6
ZShvcmlnaW4sIHN0cmluZykKKyAgICAgICAgQG9yaWdpbiA9IG9yaWdpbgorICAgICAgICBAc3Ry
aW5nID0gc3RyaW5nCisgICAgZW5kCisgICAgCisgICAgZGVmID09KG90aGVyKQorICAgICAgICBp
ZiBvdGhlci5pc19hPyBUb2tlbgorICAgICAgICAgICAgQHN0cmluZyA9PSBvdGhlci5zdHJpbmcK
KyAgICAgICAgZWxzZQorICAgICAgICAgICAgQHN0cmluZyA9PSBvdGhlcgorICAgICAgICBlbmQK
KyAgICBlbmQKKyAgICAKKyAgICBkZWYgPX4ob3RoZXIpCisgICAgICAgIEBzdHJpbmcgPX4gb3Ro
ZXIKKyAgICBlbmQKKyAgICAKKyAgICBkZWYgdG9fcworICAgICAgICAiI3tAc3RyaW5nLmluc3Bl
Y3R9IGF0ICN7b3JpZ2lufSIKKyAgICBlbmQKKyAgICAKKyAgICBkZWYgcGFyc2VFcnJvcigqY29t
bWVudCkKKyAgICAgICAgaWYgY29tbWVudC5lbXB0eT8KKyAgICAgICAgICAgIHJhaXNlICJQYXJz
ZSBlcnJvcjogI3t0b19zfSIKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcmFpc2UgIlBhcnNl
IGVycm9yOiAje3RvX3N9OiAje2NvbW1lbnRbMF19IgorICAgICAgICBlbmQKKyAgICBlbmQKK2Vu
ZAorCitkZWYgbGV4KHN0ciwgZmlsZU5hbWUpCisgICAgZmlsZU5hbWUgPSBQYXRobmFtZS5uZXco
ZmlsZU5hbWUpCisgICAgcmVzdWx0ID0gW10KKyAgICBsaW5lTnVtYmVyID0gMQorICAgIHdoaWxl
IG5vdCBzdHIuZW1wdHk/CisgICAgICAgIGNhc2Ugc3RyCisgICAgICAgIHdoZW4gL1xBXCMoW15c
bl0qKS8KKyAgICAgICAgICAgICMgY29tbWVudCwgaWdub3JlCisgICAgICAgIHdoZW4gL1xBXG4v
CisgICAgICAgICAgICAjIG5ld2xpbmUsIGlnbm9yZQorICAgICAgICAgICAgbGluZU51bWJlciAr
PSAxCisgICAgICAgIHdoZW4gL1xBW2EtekEtWjAtOSRdKFthLXpBLVowLTlfXSopLworICAgICAg
ICAgICAgcmVzdWx0IDw8IFRva2VuLm5ldyhPcmlnaW4ubmV3KGZpbGVOYW1lLCBsaW5lTnVtYmVy
KSwgJCYpCisgICAgICAgIHdoZW4gL1xBKFsgXHRccl0rKS8KKyAgICAgICAgICAgICMgd2hpdGVz
cGFjZSwgaWdub3JlCisgICAgICAgIHdoZW4gL1xBWz0oKSxdLworICAgICAgICAgICAgcmVzdWx0
IDw8IFRva2VuLm5ldyhPcmlnaW4ubmV3KGZpbGVOYW1lLCBsaW5lTnVtYmVyKSwgJCYpCisgICAg
ICAgIGVsc2UKKyAgICAgICAgICAgIHJhaXNlICJMZXhlciBlcnJvciBhdCAje09yaWdpbi5uZXco
ZmlsZU5hbWUsIGxpbmVOdW1iZXIpLnRvX3N9LCB1bmV4cGVjdGVkIHNlcXVlbmNlICN7c3RyWzAu
LjIwXS5pbnNwZWN0fSIKKyAgICAgICAgZW5kCisgICAgICAgIHN0ciA9ICR+LnBvc3RfbWF0Y2gK
KyAgICBlbmQKKyAgICByZXN1bHQKK2VuZAorCitkZWYgaXNLZXl3b3JkKHRva2VuKQorICAgICMg
V2UgY2FuIGV4dGVuZCB0aGlzIGFzIHdlIGFkZCBtb3JlIGtleXdvcmRzLiBMaWtlLCB3ZSBtaWdo
dCB3YW50ICJpbmNsdWRlIiBldmVudHVhbGx5LgorICAgIHRva2VuID1+IC9cQSgobWF0Y2hlcikp
XFovCitlbmQKKworZGVmIGlzSWRlbnRpZmllcih0b2tlbikKKyAgICB0b2tlbiA9fiAvXEFbYS16
QS1aMC05JF0oW2EtekEtWjAtOV9dKilcWi8gYW5kIG5vdCBpc0tleXdvcmQodG9rZW4pCitlbmQK
KworY2xhc3MgUGFyc2VyCisgICAgZGVmIGluaXRpYWxpemUoZGF0YSwgZmlsZU5hbWUpCisgICAg
ICAgIEB0b2tlbnMgPSBsZXgoZGF0YSwgZmlsZU5hbWUpCisgICAgICAgIEBpZHggPSAwCisgICAg
ZW5kCisKKyAgICBkZWYgdG9rZW4KKyAgICAgICAgQHRva2Vuc1tAaWR4XQorICAgIGVuZAorCisg
ICAgZGVmIGFkdmFuY2UKKyAgICAgICAgQGlkeCArPSAxCisgICAgZW5kCisKKyAgICBkZWYgcGFy
c2VFcnJvcigqY29tbWVudCkKKyAgICAgICAgaWYgdG9rZW4KKyAgICAgICAgICAgIHRva2VuLnBh
cnNlRXJyb3IoKmNvbW1lbnQpCisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGlmIGNvbW1lbnQu
ZW1wdHk/CisgICAgICAgICAgICAgICAgcmFpc2UgIlBhcnNlIGVycm9yIGF0IGVuZCBvZiBmaWxl
IgorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHJhaXNlICJQYXJzZSBlcnJvciBh
dCBlbmQgb2YgZmlsZTogI3tjb21tZW50WzBdfSIKKyAgICAgICAgICAgIGVuZAorICAgICAgICBl
bmQKKyAgICBlbmQKKworICAgIGRlZiBjb25zdW1lKHN0cmluZykKKyAgICAgICAgcGFyc2VFcnJv
cigiRXhwZWN0ZWQgI3tzdHJpbmd9IikgdW5sZXNzIHRva2VuID09IHN0cmluZworICAgICAgICBh
ZHZhbmNlCisgICAgZW5kCisKKyAgICBkZWYgY29uc3VtZUlkZW50aWZpZXIKKyAgICAgICAgcmVz
dWx0ID0gdG9rZW4uc3RyaW5nCisgICAgICAgIHBhcnNlRXJyb3IoIkV4cGVjdGVkIGlkZW50aWZp
ZXIiKSB1bmxlc3MgaXNJZGVudGlmaWVyKHJlc3VsdCkKKyAgICAgICAgYWR2YW5jZQorICAgICAg
ICByZXN1bHQKKyAgICBlbmQKKworICAgIGRlZiBhZGRVbmlxdWUobmFtZSwgcHJvZHVjdGlvbnMs
IHByb2R1Y3Rpb24pCisgICAgICAgIGlmIG5hbWUgPT0gcHJvZHVjdGlvbi52YXJOYW1lCisgICAg
ICAgICAgICBwYXJzZUVycm9yKCJDaGlsZCBwcm9kdWN0aW9uIGhhcyBzYW1lIG5hbWUgYXMgcGFy
ZW50IHByb2R1Y3Rpb24iKQorICAgICAgICBlbmQKKyAgICAgICAgaWYgcHJvZHVjdGlvbnMuZGV0
ZWN0IHsgfCBlbnRyeSB8IGVudHJ5Lm5hbWUgPT0gcHJvZHVjdGlvbi5uYW1lIH0KKyAgICAgICAg
ICAgIHBhcnNlRXJyb3IoIkR1cGxpY2F0ZSBwcm9kdWN0aW9uIikKKyAgICAgICAgZW5kCisgICAg
ICAgIHByb2R1Y3Rpb25zIDw8IHByb2R1Y3Rpb24KKyAgICBlbmQKKworICAgIGRlZiBwYXJzZQor
ICAgICAgICBjb25zdW1lKCJtYXRjaGVyIikKKworICAgICAgICBtYXRjaGVyTmFtZSA9IGNvbnN1
bWVJZGVudGlmaWVyCisKKyAgICAgICAgcHJvZHVjdGlvbnMgPSBbXQorCisgICAgICAgIGxvb3Ag
eworICAgICAgICAgICAgYnJlYWsgaWYgQGlkeCA+PSBAdG9rZW5zLmxlbmd0aAorCisgICAgICAg
ICAgICAjIFdlIG1pZ2h0IHdhbnQgdG8gc3VwcG9ydCAiaW5jbHVkZSIuIElmIHdlIGRpZCB0aGF0
LCBpdCB3b3VsZCBnbyBoZXJlLgorICAgICAgICAgICAgcHJvZHVjdGlvbiA9IHBhcnNlUHJvZHVj
dGlvbgorICAgICAgICAgICAgCisgICAgICAgICAgICBpZiBwcm9kdWN0aW9ucy5kZXRlY3QgeyB8
IGVudHJ5IHwgZW50cnkubmFtZSA9PSBwcm9kdWN0aW9uLm5hbWUgfQorICAgICAgICAgICAgICAg
IHBhcnNlRXJyb3IoIkR1cGxpY2F0ZSBwcm9kdWN0aW9uIikKKyAgICAgICAgICAgIGVuZAorCisg
ICAgICAgICAgICBwcm9kdWN0aW9ucyA8PCBwcm9kdWN0aW9uCisgICAgICAgIH0KKworICAgICAg
ICBNYXRjaGVyLm5ldyhtYXRjaGVyTmFtZSwgcHJvZHVjdGlvbnMpCisgICAgZW5kCisKKyAgICBk
ZWYgcGFyc2VQcm9kdWN0aW9uCisgICAgICAgIG9yaWdpbiA9IHRva2VuLm9yaWdpbgorICAgICAg
ICBuYW1lID0gY29uc3VtZUlkZW50aWZpZXIKKworICAgICAgICBpZiB0b2tlbiA9PSAiPSIKKyAg
ICAgICAgICAgIGNvbnN1bWUoIj0iKQorICAgICAgICAgICAgb3Bjb2RlID0gY29uc3VtZUlkZW50
aWZpZXIKKyAgICAgICAgICAgIGNvbnN1bWUoIigiKQorICAgICAgICBlbHNpZiB0b2tlbiA9PSAi
KCIKKyAgICAgICAgICAgIGNvbnN1bWUoIigiKQorICAgICAgICAgICAgb3Bjb2RlID0gbmFtZQor
ICAgICAgICAgICAgbmFtZSA9IG5pbAorICAgICAgICBlbHNlCisgICAgICAgICAgICByZXR1cm4g
UHJvZHVjdGlvbi5uZXcob3JpZ2luLCBuYW1lLCBuaWwsIG5pbCkKKyAgICAgICAgZW5kCisgICAg
ICAgIAorICAgICAgICBwcm9kdWN0aW9ucyA9IFtdCisgICAgICAgIGxvb3AgeworICAgICAgICAg
ICAgYnJlYWsgaWYgdG9rZW4gPT0gIikiCisKKyAgICAgICAgICAgIGFkZFVuaXF1ZShuYW1lLCBw
cm9kdWN0aW9ucywgcGFyc2VQcm9kdWN0aW9uKQorCisgICAgICAgICAgICBicmVhayBpZiB0b2tl
biA9PSAiKSIKKyAgICAgICAgICAgIGNvbnN1bWUoIiwiKQorICAgICAgICB9CisKKyAgICAgICAg
IyBBZHZhbmNlIGFmdGVyIHRoZSAiKSIKKyAgICAgICAgYWR2YW5jZQorCisgICAgICAgIFByb2R1
Y3Rpb24ubmV3KG9yaWdpbiwgbmFtZSwgb3Bjb2RlLCBwcm9kdWN0aW9ucykKKyAgICBlbmQKK2Vu
ZAorCitmaWxlTmFtZSA9IEFSR1ZbMF0KKworcGFyc2VyID0gUGFyc2VyLm5ldyhJTzo6cmVhZChm
aWxlTmFtZSksIGZpbGVOYW1lKQorbWF0Y2hlciA9IHBhcnNlci5wYXJzZQorCitjbGFzcyBTdWJN
YXRjaAorICAgIGF0dHJfcmVhZGVyIDppbmRleE1hcCwgOnByb2R1Y3Rpb25zCisgICAgCisgICAg
ZGVmIGluaXRpYWxpemUoaW5kZXhMaXN0LCBwcm9kdWN0aW9ucykKKyAgICAgICAgQGluZGV4TWFw
ID0gW10KKyAgICAgICAgQHByb2R1Y3Rpb25zID0gW10KKyAgICAgICAgaW5kZXhMaXN0LmVhY2gg
eworICAgICAgICAgICAgfCBpbmRleCB8CisgICAgICAgICAgICBAaW5kZXhNYXAgPDwgaW5kZXgK
KyAgICAgICAgICAgIEBwcm9kdWN0aW9ucyA8PCBwcm9kdWN0aW9uc1tpbmRleF0KKyAgICAgICAg
fQorICAgIGVuZAorCisgICAgZGVmIG1hcEluZGV4TGlzdChpbmRleExpc3QpCisgICAgICAgIGlu
ZGV4TGlzdC5tYXAgeworICAgICAgICAgICAgfCBpbmRleCB8CisgICAgICAgICAgICBAaW5kZXhN
YXBbaW5kZXhdCisgICAgICAgIH0KKyAgICBlbmQKK2VuZAorCitGaWxlLm9wZW4oIkIzIiArIG1h
dGNoZXIubmFtZSArICIuaCIsICJ3IikgeworICAgIHwgb3V0cCB8CisKKyAgICBvdXRwLnB1dHMg
Ii8vIEdlbmVyYXRlZCBieSBnZW5lcmF0ZV9wYXR0ZXJuX21hdGNoZXIucmIgZnJvbSAje2ZpbGVO
YW1lfSAtLSBkbyBub3QgZWRpdCEiCisKKyAgICBvdXRwLnB1dHMgIiNpZm5kZWYgQjMje21hdGNo
ZXIubmFtZX1faCIKKyAgICBvdXRwLnB1dHMgIiNkZWZpbmUgQjMje21hdGNoZXIubmFtZX1faCIK
KyAgICAKKyAgICBvdXRwLnB1dHMgIiNpbmNsdWRlIFwiQjNWYWx1ZS5oXCIiCisgICAgCisgICAg
b3V0cC5wdXRzICJuYW1lc3BhY2UgSlNDIHsgbmFtZXNwYWNlIEIzIHsiCisKKyAgICBvdXRwLnB1
dHMgInRlbXBsYXRlPHR5cGVuYW1lIEFkYXB0b3I+IgorICAgIG91dHAucHV0cyAidm9pZCBydW4j
e21hdGNoZXIubmFtZX0oVmFsdWUqIF92YWx1ZSwgQWRhcHRvciYgYWRhcHRvcikiCisgICAgb3V0
cC5wdXRzICJ7IgorCisgICAgIyBOb3RlIHRoYXQgdGhpcyBkb2VzIG5vdCBlbWl0IHByb3Blcmx5
IGluZGVudGVkIGNvZGUsIGJlY2F1c2UgaXQncyBhIHJlY3Vyc2l2ZSBlbWl0dGVyLiBJZiB5b3UK
KyAgICAjIHdhbnQgdG8gc2VlIHRoZSBjb2RlIG5pY2VseSBmb3JtYXR0ZWQsIG9wZW4gaXQgaW4g
YSBnb29kIHRleHQgZWRpdG9yIGFuZCBhc2sgaXQgdG8gZm9ybWF0IGl0CisgICAgIyBmb3IgeW91
LgorCisgICAgIyBJbiBvZGQgc2l0dWF0aW9ucywgd2UgbWF5IG5vdCB1c2UgdGhlIGlucHV0IHZh
bHVlLiBUZWxsIHRoZSBjb21waWxlciB0byBjaGlsbCBvdXQgYWJvdXQgaXQuCisgICAgb3V0cC5w
dXRzICJVTlVTRURfUEFSQU0oX3ZhbHVlKTsiCisgICAgICAgIAorICAgICMgVGhpcyBqdXN0IHBy
b3RlY3RzIHRoZSBjYWxsZXIgZnJvbSBoYXZpbmcgdG8gd29ycnkgYWJvdXQgcHJvZHVjdGlvbnMg
aGF2aW5nIGRpZmZlcmVudCBsZW5ndGhzLgorICAgIGRlZiBtYXRjaExlbmd0aChvdXRwLCB2YWx1
ZU5hbWUsIHByb2R1Y3Rpb25zKQorICAgICAgICBpbmRleExpc3RzID0gW10KKyAgICAgICAgcHJv
ZHVjdGlvbnMuZWFjaF93aXRoX2luZGV4IHsKKyAgICAgICAgICAgIHwgcHJvZHVjdGlvbiwgaW5k
ZXggfAorICAgICAgICAgICAgaWYgaW5kZXhMaXN0c1stMV0gYW5kIHByb2R1Y3Rpb25zW2luZGV4
TGlzdHNbLTFdWzBdXS5jaGlsZHJlbi5sZW5ndGggPT0gcHJvZHVjdGlvbi5jaGlsZHJlbi5sZW5n
dGgKKyAgICAgICAgICAgICAgICBpbmRleExpc3RzWy0xXSA8PCBpbmRleAorICAgICAgICAgICAg
ZWxzZQorICAgICAgICAgICAgICAgIGluZGV4TGlzdHMgPDwgW2luZGV4XQorICAgICAgICAgICAg
ZW5kCisgICAgICAgIH0KKworICAgICAgICBpbmRleExpc3RzLmVhY2ggeworICAgICAgICAgICAg
fCBpbmRleExpc3QgfAorICAgICAgICAgICAgbGVuZ3RoID0gcHJvZHVjdGlvbnNbaW5kZXhMaXN0
WzBdXS5jaGlsZHJlbi5sZW5ndGgKKyAgICAgICAgICAgIGlmIGxlbmd0aCA+IDAKKyAgICAgICAg
ICAgICAgICBvdXRwLnB1dHMgImlmICgje3ZhbHVlTmFtZX0tPmNoaWxkcmVuLnNpemUoKSA+PSAj
e2xlbmd0aH0pIHsiCisgICAgICAgICAgICAgICAgeWllbGQgaW5kZXhMaXN0CisgICAgICAgICAg
ICAgICAgb3V0cC5wdXRzICJ9IgorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHlp
ZWxkIGluZGV4TGlzdAorICAgICAgICAgICAgZW5kCisgICAgICAgIH0KKyAgICBlbmQKKworICAg
ICMgVGhpcyBlZmZpY2llbnRseSBzZWxlY3RzIGZyb20gdGhlIGdpdmVuIHNldCBvZiBwcm9kdWN0
aW9ucy4gSXQgYXNzdW1lcyB0aGF0IHByb2R1Y3Rpb25zCisgICAgIyBhcmUgbm90IGR1cGxpY2F0
ZWQuIEl0IHlpZWxkcyB0aGUgaW5kZXggb2YgdGhlIGZvdW5kIHByb2R1Y3Rpb24sIGFuZCB0aGUg
Y29yb3V0aW5lIGlzCisgICAgIyByZXNwb25zaWJsZSBmb3IgZW1pdHRpbmcgc3BlY2lmaWMgY29k
ZSBmb3IgdGhhdCBwcm9kdWN0aW9uLiBUaGUgY29yb3V0aW5lIGlzIGdpdmVuIGxpc3RzIG9mCisg
ICAgIyBpbmRpY2VzIG9mIHBvc3NpYmx5LW1hdGNoaW5nIHByb2R1Y3Rpb25zLgorICAgIGRlZiBt
YXRjaFByb2R1Y3Rpb25zKG91dHAsIHZhbHVlTmFtZSwgcHJvZHVjdGlvbnMpCisgICAgICAgICMg
Rmlyc3QsIHNwbGl0IHRoZSBwcm9kdWN0aW9ucyBsaXN0IGludG8gcnVucyBvZiBwcm9kdWN0aW9u
cyB3aXRoIGFuIG9wY29kZSBhbmQgcHJvZHVjdGlvbnMKKyAgICAgICAgIyB3aXRob3V0IG9uZS4K
KyAgICAgICAgaW5kZXhMaXN0cyA9IFtdCisgICAgICAgIHByb2R1Y3Rpb25zLmVhY2hfd2l0aF9p
bmRleCB7CisgICAgICAgICAgICB8IHByb2R1Y3Rpb24sIGluZGV4IHwKKyAgICAgICAgICAgIGlm
IGluZGV4TGlzdHNbLTFdIGFuZCBwcm9kdWN0aW9uc1tpbmRleExpc3RzWy0xXVswXV0uaGFzT3Bj
b2RlID09IHByb2R1Y3Rpb24uaGFzT3Bjb2RlCisgICAgICAgICAgICAgICAgaW5kZXhMaXN0c1st
MV0gPDwgaW5kZXgKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBpbmRleExpc3Rz
IDw8IFtpbmRleF0KKyAgICAgICAgICAgIGVuZAorICAgICAgICB9CisgICAgICAgIAorICAgICAg
ICAjIE5vdywgZW1pdCBwYXR0ZXJuIG1hdGNoaW5nIGNvZGUuIFdlIGRvIGl0IGRpZmZlcmVudGx5
IGZvciBsaXN0cyB3aXRoIGFuIG9wY29kZSB0aGFuIGZvcgorICAgICAgICAjIGxpc3RzIHdpdGhv
dXQgb25lLgorICAgICAgICBpbmRleExpc3RzLmVhY2ggeworICAgICAgICAgICAgfCBpbmRleExp
c3QgfAorICAgICAgICAgICAgaWYgcHJvZHVjdGlvbnNbaW5kZXhMaXN0WzBdXS5oYXNPcGNvZGUK
KyAgICAgICAgICAgICAgICAjIE5vdywgd2Ugc3BsaXQgdGhpcyBpbmRleCBsaXN0IGludG8gZ3Jv
dXBzIGZvciBlYWNoIG9wY29kZS4KKyAgICAgICAgICAgICAgICBncm91cHMgPSB7fQorICAgICAg
ICAgICAgICAgIGluZGV4TGlzdC5lYWNoIHsKKyAgICAgICAgICAgICAgICAgICAgfCBpbmRleCB8
CisgICAgICAgICAgICAgICAgICAgIHByb2R1Y3Rpb24gPSBwcm9kdWN0aW9uc1tpbmRleF0KKyAg
ICAgICAgICAgICAgICAgICAgaWYgZ3JvdXBzW3Byb2R1Y3Rpb24ub3Bjb2RlXQorICAgICAgICAg
ICAgICAgICAgICAgICAgZ3JvdXBzW3Byb2R1Y3Rpb24ub3Bjb2RlXSA8PCBpbmRleAorICAgICAg
ICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICBncm91cHNbcHJvZHVj
dGlvbi5vcGNvZGVdID0gW2luZGV4XQorICAgICAgICAgICAgICAgICAgICBlbmQKKyAgICAgICAg
ICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAjIEVtaXQgYSBzd2l0Y2ggc3RhdGVtZW50Lgor
ICAgICAgICAgICAgICAgIG91dHAucHV0cyAic3dpdGNoICgje3ZhbHVlTmFtZX0tPm9wY29kZSgp
KSB7IgorICAgICAgICAgICAgICAgIGdyb3Vwcy5lYWNoX3BhaXIgeworICAgICAgICAgICAgICAg
ICAgICB8IG9wY29kZSwgc3ViSW5kZXhMaXN0IHwKKyAgICAgICAgICAgICAgICAgICAgb3V0cC5w
dXRzICJjYXNlICN7b3Bjb2RlfToiCisgICAgICAgICAgICAgICAgICAgIHN1Yk1hdGNoID0gU3Vi
TWF0Y2gubmV3KHN1YkluZGV4TGlzdCwgcHJvZHVjdGlvbnMpCisgICAgICAgICAgICAgICAgICAg
IG1hdGNoTGVuZ3RoKG91dHAsIHZhbHVlTmFtZSwgc3ViTWF0Y2gucHJvZHVjdGlvbnMpIHsKKyAg
ICAgICAgICAgICAgICAgICAgICAgIHwgaW5kZXhMaXN0IHwKKyAgICAgICAgICAgICAgICAgICAg
ICAgIHlpZWxkIHN1Yk1hdGNoLm1hcEluZGV4TGlzdChpbmRleExpc3QpCisgICAgICAgICAgICAg
ICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgb3V0cC5wdXRzICJicmVhazsiCisgICAgICAg
ICAgICAgICAgfQorICAgICAgICAgICAgICAgIG91dHAucHV0cyAiZGVmYXVsdDoiCisgICAgICAg
ICAgICAgICAgb3V0cC5wdXRzICJicmVhazsiCisgICAgICAgICAgICAgICAgb3V0cC5wdXRzICJ9
IgorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHN1Yk1hdGNoID0gU3ViTWF0Y2gu
bmV3KGluZGV4TGlzdCwgcHJvZHVjdGlvbnMpCisgICAgICAgICAgICAgICAgbWF0Y2hMZW5ndGgo
b3V0cCwgdmFsdWVOYW1lLCBzdWJNYXRjaC5wcm9kdWN0aW9ucykgeworICAgICAgICAgICAgICAg
ICAgICB8IGluZGV4TGlzdCB8CisgICAgICAgICAgICAgICAgICAgIHlpZWxkIHN1Yk1hdGNoLm1h
cEluZGV4TGlzdChpbmRleExpc3QpCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgZW5k
CisgICAgICAgIH0KKyAgICBlbmQKKworICAgICMgVGFrZXMgcHJvZHVjdGlvbnMgdGhhdCBoYXZl
IHRoZSBzYW1lIG9wY29kZSBhbmQgdGhlIHNhbWUgbGVuZ3RoIGFuZCBzZWxlY3RzIGZyb20gdGhl
bSBiYXNlZCBvbgorICAgICMgdGhlIHByb2R1Y3Rpb25zIGF0IHRoZSBnaXZlbiBjb2x1bW4uCisg
ICAgZGVmIG1hdGNoQ29sdW1uKG91dHAsIHZhbHVlTmFtZSwgcHJvZHVjdGlvbnMsIGNvbHVtbklu
ZGV4KQorICAgICAgICBpZiBjb2x1bW5JbmRleCA+PSBwcm9kdWN0aW9uc1swXS5jaGlsZHJlbi5s
ZW5ndGgKKyAgICAgICAgICAgIHlpZWxkICgwLi4uKHByb2R1Y3Rpb25zLnNpemUpKS50b19hCisg
ICAgICAgICAgICByZXR1cm4KKyAgICAgICAgZW5kCisKKyAgICAgICAgc3ViVmFsdWUgPSBuZXdW
YXIKKyAgICAgICAgCisgICAgICAgIG91dHAucHV0cyAieyIKKyAgICAgICAgb3V0cC5wdXRzICJW
YWx1ZSogI3tzdWJWYWx1ZX0gPSAje3ZhbHVlTmFtZX0tPmNoaWxkKCN7Y29sdW1uSW5kZXh9KTsi
CisKKyAgICAgICAgIyBXZSBtYXkgbm90IHVzZSB0aGlzIHZhbHVlLiBUZWxsIHRoZSBjb21waWxl
ciB0byBjaGlsbCBvdXQgYWJvdXQgaXQuCisgICAgICAgIG91dHAucHV0cyAiVU5VU0VEX1BBUkFN
KCN7c3ViVmFsdWV9KTsiCisgICAgICAgIAorICAgICAgICBzdWJQcm9kdWN0aW9ucyA9IHByb2R1
Y3Rpb25zLm1hcCB7CisgICAgICAgICAgICB8IHByb2R1Y3Rpb24gfAorICAgICAgICAgICAgcHJv
ZHVjdGlvbi5jaGlsZHJlbltjb2x1bW5JbmRleF0KKyAgICAgICAgfQorCisgICAgICAgIG1hdGNo
UmVjdXJzaXZlbHkob3V0cCwgc3ViVmFsdWUsIHN1YlByb2R1Y3Rpb25zKSB7CisgICAgICAgICAg
ICB8IGluZGV4TGlzdCB8CisgICAgICAgICAgICBzdWJNYXRjaCA9IFN1Yk1hdGNoLm5ldyhpbmRl
eExpc3QsIHByb2R1Y3Rpb25zKQorICAgICAgICAgICAgbWF0Y2hDb2x1bW4ob3V0cCwgdmFsdWVO
YW1lLCBzdWJNYXRjaC5wcm9kdWN0aW9ucywgY29sdW1uSW5kZXggKyAxKSB7CisgICAgICAgICAg
ICAgICAgfCBpbmRleExpc3QgfAorICAgICAgICAgICAgICAgIHlpZWxkIHN1Yk1hdGNoLm1hcElu
ZGV4TGlzdChpbmRleExpc3QpCisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBv
dXRwLnB1dHMgIn0iCisgICAgZW5kCisKKyAgICBkZWYgbWF0Y2hSZWN1cnNpdmVseShvdXRwLCB2
YWx1ZU5hbWUsIHByb2R1Y3Rpb25zKQorICAgICAgICBtYXRjaFByb2R1Y3Rpb25zKG91dHAsIHZh
bHVlTmFtZSwgcHJvZHVjdGlvbnMpIHsKKyAgICAgICAgICAgIHwgaW5kZXhMaXN0IHwKKyAgICAg
ICAgICAgICMgV2UgYXJlIGd1YXJhbnRlZWQgdGhhdCB0aGlzIGluZGV4IGxpc3QgY29udGFpbnMg
cHJvZHVjdGlvbnMgd2l0aCB0aGUgc2FtZSBvcGNvZGUgYW5kCisgICAgICAgICAgICAjIHRoZSBz
YW1lIGxlbmd0aC4KKyAgICAgICAgICAgIHN1Yk1hdGNoID0gU3ViTWF0Y2gubmV3KGluZGV4TGlz
dCwgcHJvZHVjdGlvbnMpCisgICAgICAgICAgICBtYXRjaENvbHVtbihvdXRwLCB2YWx1ZU5hbWUs
IHN1Yk1hdGNoLnByb2R1Y3Rpb25zLCAwKSB7CisgICAgICAgICAgICAgICAgfCBpbmRleExpc3Qg
fAorICAgICAgICAgICAgICAgIHlpZWxkIHN1Yk1hdGNoLm1hcEluZGV4TGlzdChpbmRleExpc3Qp
CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICBlbmQKKworICAgIG1hdGNoUmVjdXJzaXZl
bHkob3V0cCwgIl92YWx1ZSIsIG1hdGNoZXIucHJvZHVjdGlvbnMpIHsKKyAgICAgICAgfCBpbmRl
eExpc3QgfAorICAgICAgICBpbmRleExpc3QuZWFjaCB7CisgICAgICAgICAgICB8IGluZGV4IHwK
KyAgICAgICAgICAgIHByb2R1Y3Rpb24gPSBtYXRjaGVyLnByb2R1Y3Rpb25zW2luZGV4XQorICAg
ICAgICAgICAgb3V0cC5wdXRzICJ7IgorICAgICAgICAgICAgb3V0cC5wdXRzICJWYWx1ZSogI3tw
cm9kdWN0aW9uLnZhck5hbWV9ID0gX3ZhbHVlOyIKKyAgICAgICAgICAgIGludGVybmFsQXJndW1l
bnRzID0gW10KKyAgICAgICAgICAgIG9wZXJhbmRBcmd1bWVudHMgPSBbXQorICAgICAgICAgICAg
dHJ5QXJndW1lbnRzID0gW10KKyAgICAgICAgICAgIG51bVNjb3BlcyA9IDAKKyAgICAgICAgICAg
IHNlZW4gPSB7fQorICAgICAgICAgICAgcHJvZHVjdGlvbi5lYWNoVmFyaWFibGUgeworICAgICAg
ICAgICAgICAgIHwgcGFyZW50VmFyTmFtZSwgY2hpbGROYW1lLCBjaGlsZFZhck5hbWUsIGtpbmQs
IGluZGV4IHwKKyAgICAgICAgICAgICAgICBsb2FkRXhwciA9ICIje3BhcmVudFZhck5hbWV9LT5j
aGlsZCgje2luZGV4fSkiCisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgaWYgc2Vl
bltjaGlsZFZhck5hbWVdCisgICAgICAgICAgICAgICAgICAgIHRtcCA9IG5ld1ZhcgorICAgICAg
ICAgICAgICAgICAgICBvdXRwLnB1dHMgIlZhbHVlKiAje3RtcH0gPSAje2xvYWRFeHByfTsiCisg
ICAgICAgICAgICAgICAgICAgIG91dHAucHV0cyAiaWYgKCN7dG1wfSA9PSAje2NoaWxkVmFyTmFt
ZX0pIHsiCisgICAgICAgICAgICAgICAgICAgIG51bVNjb3BlcyArPSAxCisgICAgICAgICAgICAg
ICAgZWxzZQorICAgICAgICAgICAgICAgICAgICBzZWVuW2NoaWxkVmFyTmFtZV0gPSB0cnVlCisg
ICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICBvdXRwLnB1dHMgIlZhbHVl
KiAje2NoaWxkVmFyTmFtZX0gPSAje2xvYWRFeHByfTsiCisKKyAgICAgICAgICAgICAgICAgICAg
aWYgY2hpbGROYW1lID1+IC9cQVwkLworICAgICAgICAgICAgICAgICAgICAgICAgaWYgY2hpbGRO
YW1lID1+IC9cQVwkKFswLTldKylcWi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRw
LnB1dHMgImlmICgje2NoaWxkVmFyTmFtZX0tPmlzSW50KCN7JDF9KSkgeyIKKyAgICAgICAgICAg
ICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwLnB1dHMg
ImlmICgje2NoaWxkVmFyTmFtZX0tPmhhc0ludCgpKSB7IgorICAgICAgICAgICAgICAgICAgICAg
ICAgZW5kCisgICAgICAgICAgICAgICAgICAgICAgICBudW1TY29wZXMgKz0gMQorICAgICAgICAg
ICAgICAgICAgICBlbmQKKyAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAg
IGludGVybmFsQXJndW1lbnRzIDw8IGNoaWxkVmFyTmFtZSBpZiBraW5kID09IDppbnRlcm5hbCBv
ciBraW5kID09IDphbm9uSW50ZXJuYWwKKyAgICAgICAgICAgICAgICAgICAgb3BlcmFuZEFyZ3Vt
ZW50cyA8PCBjaGlsZFZhck5hbWUgaWYga2luZCA9PSA6b3BlcmFuZCBvciBraW5kID09IDphbm9u
T3BlcmFuZAorICAgICAgICAgICAgICAgICAgICB0cnlBcmd1bWVudHMgPDwgY2hpbGRWYXJOYW1l
IGlmIGtpbmQgPT0gOmludGVybmFsIG9yIGtpbmQgPT0gOm9wZXJhbmQKKyAgICAgICAgICAgICAg
ICBlbmQKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG91dHAucHV0cyAiaWYgKGFkYXB0b3Iu
YWNjZXB0Um9vdChfdmFsdWUpIgorICAgICAgICAgICAgb3V0cC5wdXRzKCIgICAgJiYgYWRhcHRv
ci5hY2NlcHRJbnRlcm5hbHMoIiArIGludGVybmFsQXJndW1lbnRzLmpvaW4oIiwgIikgKyAiKSIp
CisgICAgICAgICAgICBvdXRwLnB1dHMoIiAgICAmJiBhZGFwdG9yLmFjY2VwdE9wZXJhbmRzKCIg
KyBvcGVyYW5kQXJndW1lbnRzLmpvaW4oIiwgIikgKyAiKSIpCisgICAgICAgICAgICBvdXRwLnB1
dHMoIiAgICAmJiBhZGFwdG9yLnRyeSN7cHJvZHVjdGlvbi5uYW1lfSgiICsgdHJ5QXJndW1lbnRz
LmpvaW4oIiwgIikgKyAiKSkiKQorICAgICAgICAgICAgb3V0cC5wdXRzICIgICAgcmV0dXJuOyIK
KyAgICAgICAgICAgIG51bVNjb3Blcy50aW1lcyB7CisgICAgICAgICAgICAgICAgb3V0cC5wdXRz
ICJ9IgorICAgICAgICAgICAgfQorICAgICAgICAgICAgb3V0cC5wdXRzICJ9IgorICAgICAgICB9
CisgICAgfQorICAgIAorICAgIG91dHAucHV0cyAiICAgIFJFTEVBU0VfQVNTRVJUX05PVF9SRUFD
SEVEKCk7IgorICAgIG91dHAucHV0cyAifSIKKyAgICAKKyAgICBvdXRwLnB1dHMgIn0gfSAvLyBu
YW1lc3BhY2UgSlNDOjpCMyIKKworICAgIG91dHAucHV0cyAiI2VuZGlmIC8vIEIzI3ttYXRjaGVy
Lm5hbWV9X2giCit9CkluZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvYWlyL0FpckFyZy5j
cHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL2Fpci9BaXJBcmcuY3Bw
CShyZXZpc2lvbiAwKQorKysgU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL2Fpci9BaXJBcmcuY3Bw
CSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsODEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIw
MTUgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9u
IGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICog
bW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBj
b25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBj
b2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBs
aXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJl
ZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29w
eXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9s
bG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhl
ciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMg
U09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICog
RVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVE
IFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJ
VE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5P
IEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9S
IEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZ
LCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRP
LAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBP
RiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhP
V0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIg
SU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVH
TElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQor
ICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBP
RiBTVUNIIERBTUFHRS4gCisgKi8KKworI2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgIkFp
ckFyZy5oIgorCituYW1lc3BhY2UgSlNDIHsgbmFtZXNwYWNlIEIzIHsgbmFtZXNwYWNlIEFpciB7
CisKK3ZvaWQgQXJnOjpkdW1wKFByaW50U3RyZWFtJiBvdXQpIGNvbnN0Cit7CisgICAgc3dpdGNo
IChtX2tpbmQpIHsKKyAgICBjYXNlIFRtcDoKKyAgICAgICAgb3V0LnByaW50KHRtcCgpKTsKKyAg
ICAgICAgcmV0dXJuOworICAgIGNhc2UgSW1tOgorICAgICAgICBvdXQucHJpbnQoIiQiLCBtX29m
ZnNldCk7CisgICAgICAgIHJldHVybjsKKyAgICBjYXNlIEltbTY0OgorICAgICAgICBvdXQucHJp
bnRmKCIkMHglbGx4IiwgbV9vZmZzZXQpOworICAgICAgICByZXR1cm47CisgICAgY2FzZSBBZGRy
OgorICAgICAgICBpZiAob2Zmc2V0KCkpCisgICAgICAgICAgICBvdXQucHJpbnQob2Zmc2V0KCkp
OworICAgICAgICBvdXQucHJpbnQoIigiLCBiYXNlKCksICIpIik7CisgICAgICAgIHJldHVybjsK
KyAgICBjYXNlIEluZGV4OgorICAgICAgICBpZiAob2Zmc2V0KCkpCisgICAgICAgICAgICBvdXQu
cHJpbnQob2Zmc2V0KCkpOworICAgICAgICBvdXQucHJpbnQoIigiLCBiYXNlKCksICIsIiwgaW5k
ZXgoKSk7CisgICAgICAgIGlmIChzY2FsZSgpICE9IDEpCisgICAgICAgICAgICBvdXQucHJpbnQo
IiwiLCBzY2FsZSgpKTsKKyAgICAgICAgb3V0LnByaW50KCIpIik7CisgICAgICAgIHJldHVybjsK
KyAgICBjYXNlIFN0YWNrOgorICAgICAgICBpZiAob2Zmc2V0KCkpCisgICAgICAgICAgICBvdXQu
cHJpbnQob2Zmc2V0KTsKKyAgICAgICAgb3V0LnByaW50KCIoIiwgcG9pbnRlckR1bXAoc3RhY2tT
bG90KCkpLCAiKSIpOworICAgICAgICByZXR1cm47CisgICAgY2FzZSBDYWxsQXJnOgorICAgICAg
ICBpZiAob2Zmc2V0KCkpCisgICAgICAgICAgICBvdXQucHJpbnQob2Zmc2V0KTsKKyAgICAgICAg
b3V0LnByaW50KCIoY2FsbEFyZykiKTsKKyAgICAgICAgcmV0dXJuOworICAgIGNhc2UgUmVsQ29u
ZDoKKyAgICAgICAgb3V0LnByaW50KGFzUmVsYXRpb25hbENvbmRpdGlvbigpKTsKKyAgICAgICAg
cmV0dXJuOworICAgIGNhc2UgUmVzQ29uZDoKKyAgICAgICAgb3V0LnByaW50KGFzUmVzdWx0Q29u
ZGl0aW9uKCkpOworICAgICAgICByZXR1cm47CisgICAgY2FzZSBTcGVjaWFsOgorICAgICAgICBv
dXQucHJpbnQocG9pbnRlckR1bXAoc3BlY2lhbCgpKSk7CisgICAgICAgIHJldHVybjsKKyAgICB9
CisKKyAgICBSRUxFQVNFX0FTU0VSVF9OT1RfUkVBQ0hFRCgpOworfQorCit9IH0gfSAvLyBuYW1l
c3BhY2UgSlNDOjpCMzo6QWlyCisKSW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9haXIv
QWlyQXJnLmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL2Fpci9BaXJB
cmcuaAkocmV2aXNpb24gMCkKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9haXIvQWlyQXJn
LmgJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSw1ODAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMp
IDIwMTUgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0
aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAor
ICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2lu
ZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJj
ZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhp
cyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIu
IFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUg
Y29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUg
Zm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBv
dGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRI
SVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQor
ICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1J
VEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5E
IEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElO
IE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUg
Rk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBM
QVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVE
IFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9T
UyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04p
IEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRI
RVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcg
TkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVT
RQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElU
WSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKworI2lmbmRlZiBBaXJBcmdfaAorI2RlZmluZSBBaXJB
cmdfaAorCisjaW5jbHVkZSAiQWlyVG1wLmgiCisjaW5jbHVkZSAiQjNUeXBlLmgiCisKK25hbWVz
cGFjZSBKU0MgeyBuYW1lc3BhY2UgQjMgeyBuYW1lc3BhY2UgQWlyIHsKKworY2xhc3MgU3BlY2lh
bDsKK2NsYXNzIFN0YWNrU2xvdDsKKworLy8gVGhpcyBjbGFzcyBuYW1lIGlzIGFsc28gaW50ZW50
aW9uYWxseSB0ZXJzZSBiZWNhdXNlIHdlIHdpbGwgc2F5IGl0IGEgbG90LiBZb3UnbGwgc2VlIGNv
ZGUgbGlrZQorLy8gSW5zdCguLi4sIEFyZzo6aW1tKDUpLCBBcmc6OmFkZHIodGhpbmcsIGJsYWgp
LCAuLi4pCitjbGFzcyBBcmcgeworcHVibGljOgorICAgIC8vIFRoZXNlIGVudW0gbWVtYmVycyBh
cmUgaW50ZW50aW9uYWxseSB0ZXJzZSBiZWNhdXNlIHdlIGhhdmUgdG8gbWVudGlvbiB0aGVtIGEg
bG90LgorICAgIGVudW0gS2luZCA6IGludDhfdCB7CisgICAgICAgIFRtcCwKKyAgICAgICAgSW1t
LAorICAgICAgICBJbW02NCwKKyAgICAgICAgQWRkciwKKyAgICAgICAgU3RhY2ssCisgICAgICAg
IENhbGxBcmcsCisgICAgICAgIEluZGV4LAorICAgICAgICBSZWxDb25kLAorICAgICAgICBSZXND
b25kLAorICAgICAgICBTcGVjaWFsCisgICAgfTsKKworICAgIGVudW0gUm9sZSA6IGludDhfdCB7
CisgICAgICAgIFVzZSwKKyAgICAgICAgRGVmLAorICAgICAgICBVc2VEZWYKKyAgICB9OworCisg
ICAgZW51bSBUeXBlIDogaW50OF90IHsKKyAgICAgICAgR1AsCisgICAgICAgIEZQCisgICAgfTsK
KworICAgIHN0YXRpYyBib29sIGlzVXNlKFJvbGUgcm9sZSkKKyAgICB7CisgICAgICAgIHN3aXRj
aCAocm9sZSkgeworICAgICAgICBjYXNlIFVzZToKKyAgICAgICAgY2FzZSBVc2VEZWY6CisgICAg
ICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgY2FzZSBEZWY6CisgICAgICAgICAgICByZXR1
cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBzdGF0aWMgYm9vbCBpc0RlZihSb2xl
IHJvbGUpCisgICAgeworICAgICAgICBzd2l0Y2ggKHJvbGUpIHsKKyAgICAgICAgY2FzZSBVc2U6
CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIGNhc2UgRGVmOgorICAgICAgICBj
YXNlIFVzZURlZjoKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgfQor
CisgICAgc3RhdGljIFR5cGUgdHlwZUZvckIzVHlwZShCMzo6VHlwZSB0eXBlKQorICAgIHsKKyAg
ICAgICAgc3dpdGNoICh0eXBlKSB7CisgICAgICAgIGNhc2UgVm9pZDoKKyAgICAgICAgICAgIEFT
U0VSVF9OT1RfUkVBQ0hFRCgpOworICAgICAgICAgICAgcmV0dXJuIEdQOworICAgICAgICBjYXNl
IEludDMyOgorICAgICAgICBjYXNlIEludDY0OgorICAgICAgICAgICAgcmV0dXJuIEdQOworICAg
ICAgICBjYXNlIERvdWJsZToKKyAgICAgICAgICAgIHJldHVybiBGUDsKKyAgICAgICAgfQorICAg
ICAgICBBU1NFUlRfTk9UX1JFQUNIRUQoKTsKKyAgICAgICAgcmV0dXJuIEdQOworICAgIH0KKwor
ICAgIEFyZygpCisgICAgeworICAgIH0KKworICAgIEFyZyhBaXI6OlRtcCB0bXApCisgICAgICAg
IDogbV9raW5kKFRtcCkKKyAgICAgICAgLCBtX2Jhc2UodG1wKQorICAgIHsKKyAgICB9CisKKyAg
ICBzdGF0aWMgQXJnIGltbShpbnQzMl90IHZhbHVlKQorICAgIHsKKyAgICAgICAgQXJnIHJlc3Vs
dDsKKyAgICAgICAgcmVzdWx0Lm1fa2luZCA9IEltbTsKKyAgICAgICAgcmVzdWx0Lm1fb2Zmc2V0
ID0gdmFsdWU7CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorCisgICAgc3RhdGljIEFy
ZyBpbW02NChpbnRwdHJfdCB2YWx1ZSkKKyAgICB7CisgICAgICAgIEFyZyByZXN1bHQ7CisgICAg
ICAgIHJlc3VsdC5tX2tpbmQgPSBJbW02NDsKKyAgICAgICAgcmVzdWx0Lm1fb2Zmc2V0ID0gdmFs
dWU7CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorCisgICAgc3RhdGljIEFyZyBhZGRy
ZXNzKEFpcjo6VG1wIGJhc2UsIGludDMyX3Qgb2Zmc2V0ID0gMCkKKyAgICB7CisgICAgICAgIEFT
U0VSVChiYXNlLmlzR1AoKSk7CisgICAgICAgIEFyZyByZXN1bHQ7CisgICAgICAgIHJlc3VsdC5t
X2tpbmQgPSBBZGRyOworICAgICAgICByZXN1bHQubV9iYXNlID0gYmFzZTsKKyAgICAgICAgcmVz
dWx0Lm1fb2Zmc2V0ID0gb2Zmc2V0OworICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKwor
ICAgIHN0YXRpYyBBcmcgc3RhY2soU3RhY2tTbG90KiB2YWx1ZSwgaW50MzJfdCBvZmZzZXQgPSAw
KQorICAgIHsKKyAgICAgICAgQXJnIHJlc3VsdDsKKyAgICAgICAgcmVzdWx0Lm1fa2luZCA9IFN0
YWNrOworICAgICAgICByZXN1bHQubV9vZmZzZXQgPSBiaXR3aXNlX2Nhc3Q8aW50cHRyX3Q+KHZh
bHVlKTsKKyAgICAgICAgcmVzdWx0Lm1fc2NhbGUgPSBvZmZzZXQ7IC8vIEkga25vdywgeXVjay4K
KyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisKKyAgICBzdGF0aWMgQXJnIGNhbGxBcmco
aW50MzJfdCBvZmZzZXQpCisgICAgeworICAgICAgICBBcmcgcmVzdWx0OworICAgICAgICByZXN1
bHQubV9raW5kID0gQ2FsbEFyZzsKKyAgICAgICAgcmVzdWx0Lm1fb2Zmc2V0ID0gb2Zmc2V0Owor
ICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKworICAgIHN0YXRpYyBib29sIGlzVmFsaWRT
Y2FsZSh1bnNpZ25lZCBzY2FsZSkKKyAgICB7CisgICAgICAgIHN3aXRjaCAoc2NhbGUpIHsKKyAg
ICAgICAgY2FzZSAxOgorICAgICAgICBjYXNlIDI6CisgICAgICAgIGNhc2UgNDoKKyAgICAgICAg
Y2FzZSA4OgorICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIGRlZmF1bHQ6CisgICAg
ICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBzdGF0aWMgdW5z
aWduZWQgbG9nU2NhbGUodW5zaWduZWQgc2NhbGUpCisgICAgeworICAgICAgICBzd2l0Y2ggKHNj
YWxlKSB7CisgICAgICAgIGNhc2UgMToKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICBj
YXNlIDI6CisgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgY2FzZSA0OgorICAgICAgICAg
ICAgcmV0dXJuIDI7CisgICAgICAgIGNhc2UgODoKKyAgICAgICAgICAgIHJldHVybiAzOworICAg
ICAgICBkZWZhdWx0OgorICAgICAgICAgICAgQVNTRVJUX05PVF9SRUFDSEVEKCk7CisgICAgICAg
ICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorICAgIH0KKworICAgIHN0YXRpYyBBcmcgaW5kZXgo
QWlyOjpUbXAgYmFzZSwgQWlyOjpUbXAgaW5kZXgsIHVuc2lnbmVkIHNjYWxlID0gMSwgaW50MzJf
dCBvZmZzZXQgPSAwKQorICAgIHsKKyAgICAgICAgQVNTRVJUKGJhc2UuaXNHUCgpKTsKKyAgICAg
ICAgQVNTRVJUKGluZGV4LmlzR1AoKSk7CisgICAgICAgIEFTU0VSVChpc1ZhbGlkU2NhbGUoc2Nh
bGUpKTsKKyAgICAgICAgQXJnIHJlc3VsdDsKKyAgICAgICAgcmVzdWx0Lm1fa2luZCA9IEluZGV4
OworICAgICAgICByZXN1bHQubV9iYXNlID0gYmFzZTsKKyAgICAgICAgcmVzdWx0Lm1faW5kZXgg
PSBpbmRleDsKKyAgICAgICAgcmVzdWx0Lm1fc2NhbGUgPSBzdGF0aWNfY2FzdDxpbnQzMl90Pihz
Y2FsZSk7CisgICAgICAgIHJlc3VsdC5tX29mZnNldCA9IG9mZnNldDsKKyAgICAgICAgcmV0dXJu
IHJlc3VsdDsKKyAgICB9CisKKyAgICBzdGF0aWMgQXJnIHJlbENvbmQoTWFjcm9Bc3NlbWJsZXI6
OlJlbGF0aW9uYWxDb25kaXRpb24gY29uZGl0aW9uKQorICAgIHsKKyAgICAgICAgQXJnIHJlc3Vs
dDsKKyAgICAgICAgcmVzdWx0Lm1fa2luZCA9IFJlbENvbmQ7CisgICAgICAgIHJlc3VsdC5tX29m
ZnNldCA9IGNvbmRpdGlvbjsKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisKKyAgICBz
dGF0aWMgQXJnIHJlc0NvbmQoTWFjcm9Bc3NlbWJsZXI6OlJlc3VsdENvbmRpdGlvbiBjb25kaXRp
b24pCisgICAgeworICAgICAgICBBcmcgcmVzdWx0OworICAgICAgICByZXN1bHQubV9raW5kID0g
UmVzQ29uZDsKKyAgICAgICAgcmVzdWx0Lm1fb2Zmc2V0ID0gY29uZGl0aW9uOworICAgICAgICBy
ZXR1cm4gcmVzdWx0OworICAgIH0KKworICAgIHN0YXRpYyBBcmcgc3BlY2lhbChBaXI6OlNwZWNp
YWwqIHNwZWNpYWwpCisgICAgeworICAgICAgICBBcmcgcmVzdWx0OworICAgICAgICByZXN1bHQu
bV9raW5kID0gU3BlY2lhbDsKKyAgICAgICAgcmVzdWx0Lm1fb2Zmc2V0ID0gYml0d2lzZV9jYXN0
PGludHB0cl90PihzcGVjaWFsKTsKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisKKyAg
ICBib29sIG9wZXJhdG9yPT0oY29uc3QgQXJnJiBvdGhlcikgY29uc3QKKyAgICB7CisgICAgICAg
IHJldHVybiBtX29mZnNldCA9PSBvdGhlci5tX29mZnNldAorICAgICAgICAgICAgJiYgbV9raW5k
ID09IG90aGVyLm1fa2luZAorICAgICAgICAgICAgJiYgbV9iYXNlID09IG90aGVyLm1fYmFzZQor
ICAgICAgICAgICAgJiYgbV9pbmRleCA9PSBvdGhlci5tX2luZGV4CisgICAgICAgICAgICAmJiBt
X3NjYWxlID09IG90aGVyLm1fc2NhbGU7CisgICAgfQorCisgICAgYm9vbCBvcGVyYXRvciE9KGNv
bnN0IEFyZyYgb3RoZXIpIGNvbnN0CisgICAgeworICAgICAgICByZXR1cm4gISgqdGhpcyA9PSBv
dGhlcik7CisgICAgfQorCisgICAgZXhwbGljaXQgb3BlcmF0b3IgYm9vbCgpIGNvbnN0IHsgcmV0
dXJuICp0aGlzICE9IEFyZygpOyB9CisKKyAgICBLaW5kIGtpbmQoKSBjb25zdAorICAgIHsKKyAg
ICAgICAgcmV0dXJuIG1fa2luZDsKKyAgICB9CisKKyAgICBib29sIGlzVG1wKCkgY29uc3QKKyAg
ICB7CisgICAgICAgIHJldHVybiBraW5kKCkgPT0gVG1wOworICAgIH0KKworICAgIGJvb2wgaXNJ
bW0oKSBjb25zdAorICAgIHsKKyAgICAgICAgcmV0dXJuIGtpbmQoKSA9PSBJbW07CisgICAgfQor
CisgICAgYm9vbCBpc0ltbTY0KCkgY29uc3QKKyAgICB7CisgICAgICAgIHJldHVybiBraW5kKCkg
PT0gSW1tNjQ7CisgICAgfQorCisgICAgYm9vbCBpc0FkZHIoKSBjb25zdAorICAgIHsKKyAgICAg
ICAgcmV0dXJuIGtpbmQoKSA9PSBBZGRyOworICAgIH0KKworICAgIGJvb2wgaXNTdGFjaygpIGNv
bnN0CisgICAgeworICAgICAgICByZXR1cm4ga2luZCgpID09IFN0YWNrOworICAgIH0KKworICAg
IGJvb2wgaXNDYWxsQXJnKCkgY29uc3QKKyAgICB7CisgICAgICAgIHJldHVybiBraW5kKCkgPT0g
Q2FsbEFyZzsKKyAgICB9CisKKyAgICBib29sIGlzSW5kZXgoKSBjb25zdAorICAgIHsKKyAgICAg
ICAgcmV0dXJuIGtpbmQoKSA9PSBJbmRleDsKKyAgICB9CisKKyAgICBib29sIGlzUmVsQ29uZCgp
IGNvbnN0CisgICAgeworICAgICAgICByZXR1cm4ga2luZCgpID09IFJlbENvbmQ7CisgICAgfQor
CisgICAgYm9vbCBpc1Jlc0NvbmQoKSBjb25zdAorICAgIHsKKyAgICAgICAgcmV0dXJuIGtpbmQo
KSA9PSBSZXNDb25kOworICAgIH0KKworICAgIGJvb2wgaXNTcGVjaWFsKCkgY29uc3QKKyAgICB7
CisgICAgICAgIHJldHVybiBraW5kKCkgPT0gU3BlY2lhbDsKKyAgICB9CisKKyAgICBib29sIGlz
QWxpdmUoKSBjb25zdAorICAgIHsKKyAgICAgICAgcmV0dXJuIGlzVG1wKCkgfHwgaXNTdGFjaygp
OworICAgIH0KKworICAgIEFpcjo6VG1wIHRtcCgpIGNvbnN0CisgICAgeworICAgICAgICBBU1NF
UlQoa2luZCgpID09IFRtcCk7CisgICAgICAgIHJldHVybiBtX2Jhc2U7CisgICAgfQorCisgICAg
aW50NjRfdCB2YWx1ZSgpIGNvbnN0CisgICAgeworICAgICAgICBBU1NFUlQoa2luZCgpID09IElt
bSB8fCBraW5kKCkgPT0gSW1tNjQpOworICAgICAgICByZXR1cm4gbV9vZmZzZXQ7CisgICAgfQor
CisgICAgdm9pZCogcG9pbnRlclZhbHVlKCkgY29uc3QKKyAgICB7CisgICAgICAgIEFTU0VSVChr
aW5kKCkgPT0gSW1tNjQpOworICAgICAgICByZXR1cm4gYml0d2lzZV9jYXN0PHZvaWQqPihzdGF0
aWNfY2FzdDxpbnRwdHJfdD4obV9vZmZzZXQpKTsKKyAgICB9CisKKyAgICBBaXI6OlRtcCBiYXNl
KCkgY29uc3QKKyAgICB7CisgICAgICAgIEFTU0VSVChraW5kKCkgPT0gQWRkciB8fCBraW5kKCkg
PT0gSW5kZXgpOworICAgICAgICByZXR1cm4gbV9iYXNlOworICAgIH0KKworICAgIGludDMyX3Qg
b2Zmc2V0KCkgY29uc3QKKyAgICB7CisgICAgICAgIGlmIChraW5kKCkgPT0gU3RhY2spCisgICAg
ICAgICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8aW50MzJfdD4obV9zY2FsZSk7CisgICAgICAgIEFT
U0VSVChraW5kKCkgPT0gQWRkciB8fCBraW5kKCkgPT0gQ2FsbEFyZyB8fCBraW5kKCkgPT0gSW5k
ZXgpOworICAgICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8aW50MzJfdD4obV9vZmZzZXQpOworICAg
IH0KKworICAgIFN0YWNrU2xvdCogc3RhY2tTbG90KCkgY29uc3QKKyAgICB7CisgICAgICAgIEFT
U0VSVChraW5kKCkgPT0gU3RhY2spOworICAgICAgICByZXR1cm4gYml0d2lzZV9jYXN0PFN0YWNr
U2xvdCo+KG1fb2Zmc2V0KTsKKyAgICB9CisKKyAgICBBaXI6OlRtcCBpbmRleCgpIGNvbnN0Cisg
ICAgeworICAgICAgICBBU1NFUlQoa2luZCgpID09IEluZGV4KTsKKyAgICAgICAgcmV0dXJuIG1f
aW5kZXg7CisgICAgfQorCisgICAgdW5zaWduZWQgc2NhbGUoKSBjb25zdAorICAgIHsKKyAgICAg
ICAgQVNTRVJUKGtpbmQoKSA9PSBJbmRleCk7CisgICAgICAgIHJldHVybiBtX3NjYWxlOworICAg
IH0KKworICAgIHVuc2lnbmVkIGxvZ1NjYWxlKCkgY29uc3QKKyAgICB7CisgICAgICAgIHJldHVy
biBsb2dTY2FsZShzY2FsZSgpKTsKKyAgICB9CisKKyAgICBBaXI6OlNwZWNpYWwqIHNwZWNpYWwo
KSBjb25zdAorICAgIHsKKyAgICAgICAgQVNTRVJUKGtpbmQoKSA9PSBTcGVjaWFsKTsKKyAgICAg
ICAgcmV0dXJuIGJpdHdpc2VfY2FzdDxBaXI6OlNwZWNpYWwqPihtX29mZnNldCk7CisgICAgfQor
CisgICAgYm9vbCBpc0dQVG1wKCkgY29uc3QKKyAgICB7CisgICAgICAgIHJldHVybiBpc1RtcCgp
ICYmIHRtcCgpLmlzR1AoKTsKKyAgICB9CisKKyAgICBib29sIGlzRlBUbXAoKSBjb25zdAorICAg
IHsKKyAgICAgICAgcmV0dXJuIGlzVG1wKCkgJiYgdG1wKCkuaXNGUCgpOworICAgIH0KKyAgICAK
KyAgICAvLyBUZWxscyB1cyBpZiB0aGlzIEFyZyBjYW4gYmUgdXNlZCBpbiBhIHBvc2l0aW9uIHRo
YXQgcmVxdWlyZXMgYSBHUCB2YWx1ZS4KKyAgICBib29sIGlzR1AoKSBjb25zdAorICAgIHsKKyAg
ICAgICAgc3dpdGNoIChraW5kKCkpIHsKKyAgICAgICAgY2FzZSBJbW06CisgICAgICAgIGNhc2Ug
SW1tNjQ6CisgICAgICAgIGNhc2UgQWRkcjoKKyAgICAgICAgY2FzZSBJbmRleDoKKyAgICAgICAg
Y2FzZSBTdGFja1Nsb3Q6CisgICAgICAgIGNhc2UgQ2FsbEFyZzoKKyAgICAgICAgY2FzZSBSZWxD
b25kOgorICAgICAgICBjYXNlIFJlc0NvbmQ6CisgICAgICAgIGNhc2UgU3BlY2lhbDoKKyAgICAg
ICAgICAgIHJldHVybiB0cnVlOworICAgICAgICBjYXNlIFRtcDoKKyAgICAgICAgICAgIHJldHVy
biBpc0dQVG1wKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBUZWxscyB1cyBpZiB0aGlz
IEFyZyBjYW4gYmUgdXNlZCBpbiBhIHBvc2l0aW9uIHRoYXQgcmVxdWlyZXMgYSBGUCB2YWx1ZS4K
KyAgICBib29sIGlzRlAoKSBjb25zdAorICAgIHsKKyAgICAgICAgc3dpdGNoIChraW5kKCkpIHsK
KyAgICAgICAgY2FzZSBJbW06CisgICAgICAgIGNhc2UgUmVsQ29uZDoKKyAgICAgICAgY2FzZSBS
ZXNDb25kOgorICAgICAgICBjYXNlIFNwZWNpYWw6CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7
CisgICAgICAgIGNhc2UgQWRkcjoKKyAgICAgICAgY2FzZSBJbmRleDoKKyAgICAgICAgY2FzZSBC
YXNlOgorICAgICAgICBjYXNlIFN0YWNrU2xvdDoKKyAgICAgICAgY2FzZSBDYWxsQXJnOgorICAg
ICAgICBjYXNlIEltbTY0OiAvLyBZZXMsIHdlIGFsbG93IEltbTY0IGFzIGEgZG91YmxlIGltbWVk
aWF0ZS4gV2UgdXNlIHRoaXMgZm9yIGltcGxlbWVudGluZyBzdGFja21hcHMuCisgICAgICAgICAg
ICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgY2FzZSBUbXA6CisgICAgICAgICAgICByZXR1cm4gaXNG
UFRtcCgpOworICAgICAgICB9CisgICAgfQorCisgICAgYm9vbCBoYXNUeXBlKCkgY29uc3QKKyAg
ICB7CisgICAgICAgIHN3aXRjaCAoa2luZCgpKSB7CisgICAgICAgIGNhc2UgSW1tOgorICAgICAg
ICBjYXNlIFNwZWNpYWw6CisgICAgICAgIGNhc2UgVG1wOgorICAgICAgICAgICAgcmV0dXJuIHRy
dWU7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAg
IH0KKyAgICB9CisgICAgCisgICAgLy8gVGhlIHR5cGUgaXMgYW1iaWd1b3VzIGZvciBzb21lIGFy
ZyBraW5kcy4gQ2FsbCB3aXRoIGNhcmUuCisgICAgVHlwZSB0eXBlKCkgY29uc3QKKyAgICB7Cisg
ICAgICAgIHJldHVybiBpc0dQKCkgPyBHUCA6IEZQOworICAgIH0KKworICAgIGJvb2wgaXNUeXBl
KFR5cGUgdHlwZSkgY29uc3QKKyAgICB7CisgICAgICAgIHN3aXRjaCAodHlwZSkgeworICAgICAg
ICBjYXNlIEdQOgorICAgICAgICAgICAgcmV0dXJuIGlzR1AoKTsKKyAgICAgICAgY2FzZSBGUDoK
KyAgICAgICAgICAgIHJldHVybiBpc0ZQKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBib29s
IGlzR1BSKCkgY29uc3QKKyAgICB7CisgICAgICAgIHJldHVybiBpc1RtcCgpICYmIHRtcCgpLmlz
R1BSKCk7CisgICAgfQorCisgICAgR1BSUmVnIGdwcigpIGNvbnN0CisgICAgeworICAgICAgICBy
ZXR1cm4gdG1wKCkuZ3ByKCk7CisgICAgfQorCisgICAgYm9vbCBpc0ZQUigpIGNvbnN0CisgICAg
eworICAgICAgICByZXR1cm4gaXNUbXAoKSAmJiB0bXAoKS5pc0ZQUigpOworICAgIH0KKworICAg
IEZQUlJlZyBmcHIoKSBjb25zdAorICAgIHsKKyAgICAgICAgcmV0dXJuIHRtcCgpLmZwcigpOwor
ICAgIH0KKyAgICAKKyAgICBib29sIGlzUmVnKCkgY29uc3QKKyAgICB7CisgICAgICAgIHJldHVy
biBpc1RtcCgpICYmIHRtcCgpLmlzUmVnKCk7CisgICAgfQorCisgICAgUmVnIHJlZygpIGNvbnN0
CisgICAgeworICAgICAgICByZXR1cm4gdG1wKCkucmVnKCk7CisgICAgfQorCisgICAgdW5zaWdu
ZWQgZ3BUbXBJbmRleCgpIGNvbnN0CisgICAgeworICAgICAgICByZXR1cm4gdG1wKCkuZ3BUbXBJ
bmRleCgpOworICAgIH0KKworICAgIHVuc2lnbmVkIGZwVG1wSW5kZXgoKSBjb25zdAorICAgIHsK
KyAgICAgICAgcmV0dXJuIHRtcCgpLmZwVG1wSW5kZXgoKTsKKyAgICB9CisKKyAgICB1bnNpZ25l
ZCB0bXBJbmRleCgpIGNvbnN0CisgICAgeworICAgICAgICByZXR1cm4gdG1wKCkudG1wSW5kZXgo
KTsKKyAgICB9CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBGdW5jdG9yPgorICAgIHZvaWQgZm9y
RWFjaFRtcEZhc3QoY29uc3QgRnVuY3RvciYgZnVuY3RvcikKKyAgICB7CisgICAgICAgIHN3aXRj
aCAobV9raW5kKSB7CisgICAgICAgIGNhc2UgVG1wOgorICAgICAgICBjYXNlIEFkZHI6CisgICAg
ICAgICAgICBmdW5jdG9yKG1fYmFzZSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2Fz
ZSBJbmRleDoKKyAgICAgICAgICAgIGZ1bmN0b3IobV9iYXNlKTsKKyAgICAgICAgICAgIGZ1bmN0
b3IobV9pbmRleCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAg
ICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gVGhpcyBpcyBzbWFydCBl
bm91Z2ggdG8ga25vdyB0aGF0IGFuIGFkZHJlc3MgYXJnIGluIGEgRGVmIG9yIFVzZURlZiBydWxl
IHdpbGwgdXNlIGl0cworICAgIC8vIHRtcHMgYW5kIG5ldmVyIGRlZiB0aGVtLiBGb3IgZXhhbXBs
ZSwgdGhpczoKKyAgICAvLworICAgIC8vIG1vdiAlcmF4LCAoJXJjeCkKKyAgICAvLworICAgIC8v
IFRoaXMgZGVmcyAoJXJjeCkgYnV0IHVzZXMgJXJjeC4KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBG
dW5jdG9yPgorICAgIHZvaWQgZm9yRWFjaFRtcChSb2xlIGFyZ1JvbGUsIFR5cGUgYXJnVHlwZSwg
Y29uc3QgRnVuY3RvciYgZnVuY3RvcikKKyAgICB7CisgICAgICAgIHN3aXRjaCAobV9raW5kKSB7
CisgICAgICAgIGNhc2UgVG1wOgorICAgICAgICAgICAgZnVuY3RvcihtX2Jhc2UsIGFyZ1JvbGUs
IGFyZ1R5cGUpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQWRkcjoKKyAgICAg
ICAgICAgIGZ1bmN0b3IobV9iYXNlLCBVc2UsIEdQKTsKKyAgICAgICAgICAgIGJyZWFrOworICAg
ICAgICBjYXNlIEluZGV4OgorICAgICAgICAgICAgZnVuY3RvcihtX2Jhc2UsIFVzZSwgR1ApOwor
ICAgICAgICAgICAgZnVuY3RvcihtX2luZGV4LCBVc2UsIEdQKTsKKyAgICAgICAgICAgIGJyZWFr
OworICAgICAgICBkZWZhdXQ6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0K
KworICAgIE1hY3JvQXNzZW1ibGVyOjpUcnVzdGVkSW1tMzIgYXNUcnVzdGVkSW1tMzIoKSBjb25z
dAorICAgIHsKKyAgICAgICAgQVNTRVJUKGlzSW1tKCkpOworICAgICAgICByZXR1cm4gTWFjcm9B
c3NlbWJsZXI6OlRydXN0ZWRJbW0zMihzdGF0aWNfY2FzdDxpbnQzMl90PihtX29mZnNldCkpOwor
ICAgIH0KKworI2lmIFVTRShKU1ZBTFVFNjQpCisgICAgTWFjcm9Bc3NlbWJsZXI6OlRydXN0ZWRJ
bW02NCBhc1RydXN0ZWRJbW02NCgpIGNvbnN0CisgICAgeworICAgICAgICBBU1NFUlQoaXNJbW02
NCgpKTsKKyAgICAgICAgcmV0dXJuIE1hY3JvQXNzZW1ibGVyOjpUcnVzdGVkSW1tNjQocG9pbnRl
clZhbHVlKCkpOworICAgIH0KKyNlbmRpZgorCisgICAgTWFjcm9Bc3NlbWJsZXI6OkFkZHJlc3Mg
YXNBZGRyZXNzKCkgY29uc3QKKyAgICB7CisgICAgICAgIEFTU0VSVChpc0FkZHIoKSk7CisgICAg
ICAgIHJldHVybiBNYWNyb0Fzc2VtYmxlcjo6QWRkcmVzcyhtX2Jhc2UuZ3ByKCksIHN0YXRpY19j
YXN0PGludDMyX3Q+KG1fb2Zmc2V0KSk7CisgICAgfQorCisgICAgTWFjcm9Bc3NlbWJsZXI6OkJh
c2VJbmRleCBhc0Jhc2VJbmRleCgpIGNvbnN0CisgICAgeworICAgICAgICBBU1NFUlQoaXNJbmRl
eCgpKTsKKyAgICAgICAgcmV0dXJuIE1hY3JvQXNzZW1ibGVyOjpCYXNlSW5kZXgoCisgICAgICAg
ICAgICBtX2Jhc2UuZ3ByKCksIG1faW5kZXguZ3ByKCksIHN0YXRpY19jYXN0PE1hY3JvQXNzZW1i
bGVyOjpTY2FsZT4obG9nU2NhbGUoKSksCisgICAgICAgICAgICBzdGF0aWNfY2FzdDxpbnQzMl90
PihtX29mZnNldCkpOworICAgIH0KKworICAgIE1hY3JvQXNzZW1ibGVyOjpSZWxhdGlvbmFsQ29u
ZGl0aW9uIGFzUmVsYXRpb25hbENvbmRpdGlvbigpIGNvbnN0CisgICAgeworICAgICAgICBBU1NF
UlQoaXNSZWxDb25kKCkpOworICAgICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8TWFjcm9Bc3NlbWJs
ZXI6OlJlbGF0aW9uYWxDb25kaXRpb24+KG1fb2Zmc2V0KTsKKyAgICB9CisKKyAgICBNYWNyb0Fz
c2VtYmxlcjo6UmVzdWx0Q29uZGl0aW9uIGFzUmVzdWx0Q29uZGl0aW9uKCkgY29uc3QKKyAgICB7
CisgICAgICAgIEFTU0VSVChpc1Jlc0NvbmQoKSk7CisgICAgICAgIHJldHVybiBzdGF0aWNfY2Fz
dDxNYWNyb0Fzc2VtYmxlcjo6UmVzdWx0Q29uZGl0aW9uPihtX29mZnNldCk7CisgICAgfQorCisg
ICAgdm9pZCBkdW1wKFByaW50U3RyZWFtJikgY29uc3Q7CisKK3ByaXZhdGU6CisgICAgaW50NjRf
dCBtX29mZnNldCB7IDAgfTsKKyAgICBLaW5kIG1fa2luZCB7IEltbSB9OworICAgIGludDMyX3Qg
bV9zY2FsZSB7IDEgfTsKKyAgICBBaXI6OlRtcCBtX2Jhc2U7CisgICAgQWlyOjpUbXAgbV9pbmRl
eDsKK307CisKK30gfSB9IC8vIG5hbWVzcGFjZSBKU0M6OkIzOjpBaXIKKworI2VuZGlmIC8vIEFp
ckFyZ19oCisKSW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9haXIvQWlyQmFzaWNCbG9j
ay5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL2Fpci9BaXJCYXNp
Y0Jsb2NrLmNwcAkocmV2aXNpb24gMCkKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9haXIv
QWlyQmFzaWNCbG9jay5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSw2MSBAQAorLyoKKyAq
IENvcHlyaWdodCAoQykgMjAxNSBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgor
ICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0
aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhh
dCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1
dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICog
ICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNj
bGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9k
dWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRp
dGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50
YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRp
b24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIGBgQVMg
SVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5H
LCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNI
QU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBE
SVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUgorICogQ09OVFJJQlVU
T1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJ
QUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBC
VVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9S
IFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNT
IElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJ
QUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAor
ICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZ
IE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0Yg
VEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLiAKKyAqLworCisjaW5jbHVkZSAiY29uZmln
LmgiCisjaW5jbHVkZSAiQWlyQmFzaWNCbG9jay5oIgorCisjaW5jbHVkZSAiQjNCYXNpY0Jsb2Nr
VXRpbHMuaCIKKworbmFtZXNwYWNlIEpTQyB7IG5hbWVzcGFjZSBCMyB7IG5hbWVzcGFjZSBBaXIg
eworCit2b2lkIEJhc2ljQmxvY2s6OmFkZFByZWRlY2Vzc29yKEJhc2ljQmxvY2sqIGJsb2NrKQor
eworICAgIEIzOjphZGRQcmVkZWNlc3Nvcih0aGlzLCBibG9jayk7Cit9CisKK3ZvaWQgQmFzaWNC
bG9jazo6cmVtb3ZlUHJlZGVjZXNzb3IoQmFzaWNCbG9jayogYmxvY2spCit7CisgICAgQjM6OnJl
bW92ZVByZWRlY2Vzc29yKHRoaXMsIGJsb2NrKTsKK30KKwordm9pZCBCYXNpY0Jsb2NrOjpyZXBs
YWNlUHJlZGVjZXNzb3IoQmFzaWNCbG9jayogZnJvbSwgQmFzaWNCbG9jayogdG8pCit7CisgICAg
QjM6OnJlcGxhY2VQcmVkZWNlc3Nvcih0aGlzLCBmcm9tLCB0byk7Cit9CisKK3ZvaWQgQmFzaWNC
bG9jazo6ZHVtcChQcmludFN0cmVhbSYgb3V0KSBjb25zdAoreworICAgIG91dC5wcmludChkdW1w
UHJlZml4LCBtX2luZGV4KTsKK30KKwordm9pZCBCYXNpY0Jsb2NrOjpkZWVwRHVtcChQcmludFN0
cmVhbSYgb3V0KSBjb25zdAoreworICAgIG91dC5wcmludCgiQkIiLCAqdGhpcywgIjpcbiIpOwor
ICAgIGZvciAoY29uc3QgSW5zdCYgaW5zdCA6ICp0aGlzKQorICAgICAgICBvdXQucHJpbnQoIiAg
ICAiLCBpbnN0LCAiXG4iKTsKK30KKworfSB9IH0gLy8gbmFtZXNwYWNlIEpTQzo6QjM6OkFpcgor
CkluZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvYWlyL0FpckJhc2ljQmxvY2suaAo9PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvYWlyL0FpckJhc2ljQmxvY2suaAko
cmV2aXNpb24gMCkKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9haXIvQWlyQmFzaWNCbG9j
ay5oCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsMTM0IEBACisvKgorICogQ29weXJpZ2h0IChD
KSAyMDE1IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1
dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQK
KyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dp
bmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3Vy
Y2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRo
aXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAy
LiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3Zl
IGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhl
IGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Ig
b3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBU
SElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkK
KyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElN
SVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFO
RCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJ
TiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxF
IEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1Q
TEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRF
RCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExP
U1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9O
KSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVU
SEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5H
IE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBV
U0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJ
VFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisKKyNpZm5kZWYgQWlyQmFzaWNCbG9ja19oCisjZGVm
aW5lIEFpckJhc2ljQmxvY2tfaAorCisjaW5jbHVkZSAiQWlySW5zdC5oIgorI2luY2x1ZGUgPHd0
Zi9Ob25Db3B5YWJsZS5oPgorI2luY2x1ZGUgPHd0Zi9GYXN0TWFsbG9jLmg+CisKK25hbWVzcGFj
ZSBKU0MgeyBuYW1lc3BhY2UgQjMgeyBuYW1lc3BhY2UgQWlyIHsKKworY2xhc3MgQ29kZTsKK2Ns
YXNzIEluc2VydGlvblNldDsKKworY2xhc3MgQmFzaWNCbG9jayB7CisgICAgV1RGX01BS0VfTk9O
Q09QWUFCTEUoQmFzaWNCbG9jayk7CisgICAgV1RGX01BS0VfRkFTVF9BTExPQ0FURUQ7CitwdWJs
aWM6CisgICAgc3RhdGljIGNvbnN0IGNoYXIqIGR1bXBQcmVmaXggPSAiIyI7CisKKyAgICB0eXBl
ZGVmIFZlY3RvcjxJbnN0PiBJbnN0TGlzdDsKKyAgICB0eXBlZGVmIFZlY3RvcjxCYXNpY0Jsb2Nr
KiwgMj4gQWRqYWNlbmN5TGlzdDsKKyAgICAKKyAgICB1bnNpZ25lZCBzaXplKCkgY29uc3QgeyBy
ZXR1cm4gbV9pbnN0cy5zaXplKCk7IH0KKyAgICBJbnN0TGlzdDo6aXRlcmF0b3IgYmVnaW4oKSB7
IHJldHVybiBtX2luc3RzLmJlZ2luKCk7IH0KKyAgICBJbnN0TGlzdDo6aXRlcmF0b3IgZW5kKCkg
eyByZXR1cm4gbV9pbnN0cy5lbmQoKTsgfQorICAgIEluc3RMaXN0Ojpjb25zdF9pdGVyYXRvciBi
ZWdpbigpIGNvbnN0IHsgcmV0dXJuIG1faW5zdHMuYmVnaW4oKTsgfQorICAgIEluc3RMaXN0Ojpj
b25zdF9pdGVyYXRvciBlbmQoKSBjb25zdCB7IHJldHVybiBtX2luc3RzLmVuZCgpOyB9CisKKyAg
ICBzaXplX3Qgc2l6ZSgpIGNvbnN0IHsgcmV0dXJuIG1faW5zdHMuc2l6ZSgpOyB9CisgICAgY29u
c3QgSW5zdCYgYXQoc2l6ZV90IGluZGV4KSBjb25zdCB7IHJldHVybiBtX2luc3RzW2luZGV4XTsg
fQorICAgIEluc3QmIGF0KHNpemVfdCBpbmRleCkgeyByZXR1cm4gbV9pbnN0c1tpbmRleF07IH0K
KworICAgIGNvbnN0IEluc3QmIGxhc3QoKSBjb25zdCB7IHJldHVybiBtX2luc3RzLmxhc3QoKTsg
fQorICAgIEluc3QmIGxhc3QoKSB7IHJldHVybiBtX2luc3RzLmxhc3QoKTsgfQorCisgICAgdGVt
cGxhdGU8dHlwZW5hbWUgSW5zdD4KKyAgICB2b2lkIGFwcGVuZEluc3QoSW5zdCYmIGluc3QpCisg
ICAgeworICAgICAgICBtX2luc3RzLmFwcGVuZChzdGQ6OmZvcndhcmQ8SW5zdD4oaW5zdCkpOwor
ICAgIH0KKworICAgIHRlbXBsYXRlPHR5cGVuYW1lLi4uIEFyZ3VtZW50cz4KKyAgICB2b2lkIGFw
cGVuZChBcmd1bWVudHMmJi4uLiBhcmd1bWVudHMpCisgICAgeworICAgICAgICBtX2luc3RzLmFw
cGVuZChJbnN0KHN0ZDo6Zm9yd2FyZDxBcmd1bWVudHM+KGFyZ3VtZW50cykuLi4pKTsKKyAgICB9
CisKKyAgICAvLyBUaGUgIjAiIGNhc2UgaXMgdGhlIGNhc2UgdG8gd2hpY2ggdGhlIGJyYW5jaCBq
dW1wcywgc28gdGhlICJ0aGVuIiBjYXNlLiBUaGUgIjEiIGNhc2UgaXMgdGhlCisgICAgLy8gImVs
c2UiIGNhc2UsIGFuZCBpcyB1c2VkIHRvIHJlcHJlc2VudCB0aGUgZmFsbC10aHJvdWdoIG9mIGEg
Y29uZGl0aW9uYWwgYnJhbmNoLgorICAgIHVuc2lnbmVkIG51bVN1Y2Nlc3NvcnMoKSBjb25zdCB7
IHJldHVybiBtX3N1Y2Nlc3NvcnMuc2l6ZSgpOyB9CisgICAgQmFzaWNCbG9jayogc3VjY2Vzc29y
KHVuc2lnbmVkIGluZGV4KSBjb25zdCB7IHJldHVybiBtX3N1Y2Nlc3NvcnNbaW5kZXhdOyB9Cisg
ICAgQmFzaWNCbG9jayomIHN1Y2Nlc3Nvcih1bnNpZ25lZCBpbmRleCkgeyByZXR1cm4gbV9zdWNj
ZXNzb3JzW2luZGV4XTsgfQorICAgIGNvbnN0IEFkamFjZW5jeUxpc3QmIHN1Y2Nlc3NvcnMoKSBj
b25zdCB7IHJldHVybiBtX3N1Y2Nlc3NvcnNbaW5kZXhdOyB9CisgICAgQWRqYWNlbmN5TGlzdCYg
c3VjY2Vzc29ycygpIHsgcmV0dXJuIG1fc3VjY2Vzc29yc1tpbmRleF07IH0KKworICAgIHVuc2ln
bmVkIG51bVByZWRlY2Vzc29ycygpIGNvbnN0IHsgcmV0dXJuIG1fcHJlZGVjZXNzb3JzLnNpemUo
KTsgfQorICAgIEJhc2ljQmxvY2sqIHByZWRlY2Vzc29yKHVuc2lnbmVkIGluZGV4KSBjb25zdCB7
IHJldHVybiBtX3ByZWRlY2Vzc29yc1tpbmRleF07IH0KKyAgICBCYXNpY0Jsb2NrKiYgcHJlZGVj
ZXNzb3IodW5zaWduZWQgaW5kZXgpIHsgcmV0dXJuIG1fcHJlZGVjZXNzb3JzW2luZGV4XTsgfQor
ICAgIGNvbnN0IEFkamFjZW5jeUxpc3QmIHByZWRlY2Vzc29ycygpIGNvbnN0IHsgcmV0dXJuIG1f
cHJlZGVjZXNzb3JzW2luZGV4XTsgfQorICAgIEFkamFjZW5jeUxpc3QmIHByZWRlY2Vzc29ycygp
IHsgcmV0dXJuIG1fcHJlZGVjZXNzb3JzW2luZGV4XTsgfQorCisgICAgdm9pZCBhZGRQcmVkZWNl
c3NvcihCYXNpY0Jsb2NrKik7CisgICAgdm9pZCByZW1vdmVQcmVkZWNlc3NvcihCYXNpY0Jsb2Nr
Kik7CisgICAgdm9pZCByZXBsYWNlUHJlZGVjZXNzb3IoQmFzaWNCbG9jayogZnJvbSwgQmFzaWNC
bG9jayogdG8pOworCisgICAgdm9pZCBkdW1wKFByaW50U3RyZWFtJikgY29uc3Q7CisgICAgdm9p
ZCBkZWVwRHVtcChQcmludFN0cmVhbSYpIGNvbnN0OworCitwcml2YXRlOgorICAgIGZyaWVuZCBj
bGFzcyBDb2RlOworICAgIGZyaWVuZCBjbGFzcyBJbnNlcnRpb25TZXQ7CisgICAgCisgICAgQmFz
aWNCbG9jayh1bnNpZ25lZCBpbmRleCkKKyAgICB7CisgICAgfQorCisgICAgdW5zaWduZWQgbV9p
bmRleDsKKyAgICBJbnN0TGlzdCBtX2luc3RzOworICAgIEFkamFjZW5jeUxpc3QgbV9zdWNjZXNz
b3JzOworICAgIEFkamFjZW5jeUxpc3QgbV9wcmVkZWNlc3NvcnM7Cit9OworCitjbGFzcyBEZWVw
QmFzaWNCbG9ja0R1bXAgeworcHVibGljOgorICAgIERlZXBCYXNpY0Jsb2NrRHVtcChCYXNpY0Js
b2NrKiBibG9jaykKKyAgICAgICAgOiBtX2Jsb2NrKGJsb2NrKQorICAgIHsKKyAgICB9CisKKyAg
ICB2b2lkIGR1bXAoUHJpbnRTdHJlYW0mIG91dCkgY29uc3QKKyAgICB7CisgICAgICAgIGlmICht
X2Jsb2NrKQorICAgICAgICAgICAgbV9ibG9jay0+ZGVlcER1bXAob3V0KTsKKyAgICAgICAgZWxz
ZQorICAgICAgICAgICAgb3V0LnByaW50KCI8bnVsbD4iKTsKKyAgICB9CisKK3ByaXZhdGU6Cisg
ICAgQmFzaWNCbG9jayogbV9ibG9jazsKK307CisKK0RlZXBCYXNpY0Jsb2NrRHVtcCBkZWVwRHVt
cChCYXNpY0Jsb2NrKiBibG9jaykKK3sKKyAgICByZXR1cm4gRGVlcEJhc2ljQmxvY2tEdW1wKGJs
b2NrKTsKK30KKworfSB9IH0gLy8gbmFtZXNwYWNlIEpTQzo6QjM6OkFpcgorCisjZW5kaWYgLy8g
QWlyQmFzaWNCbG9ja19oCisKSW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9haXIvQWly
Q0NhbGxTcGVjaWFsLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMv
YWlyL0FpckNDYWxsU3BlY2lhbC5jcHAJKHJldmlzaW9uIDApCisrKyBTb3VyY2UvSmF2YVNjcmlw
dENvcmUvYjMvYWlyL0FpckNDYWxsU3BlY2lhbC5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTAsMCAr
MSwxNDAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTUgQXBwbGUgSW5jLiBBbGwgcmlnaHRz
IHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBi
aW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0
dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0Ogor
ICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92
ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRo
ZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkg
Zm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRo
aXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhl
CisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0
aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkg
QVBQTEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJB
TlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FS
UkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgor
ICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4g
T1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJ
TkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFH
RVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VC
U1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9G
SVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkg
VEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFC
SUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFS
SVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZF
TiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKwor
I2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgIkFpckNDYWxsU3BlY2lhbC5oIgorCituYW1l
c3BhY2UgSlNDIHsgbmFtZXNwYWNlIEIzIHsgbmFtZXNwYWNlIEFpciB7CisKK0NDYWxsU3BlY2lh
bDo6Q0NhbGxTcGVjaWFsKCkKK3sKKyAgICBtX2Nsb2JiZXJlZFJlZ3MgPSBSZWdpc3RlclNldDo6
YWxsUmVnaXN0ZXJzKCk7CisgICAgbV9jbG9iYmVyZWRSZWdzLmV4Y2x1ZGUoUmVnaXN0ZXJTZXQ6
OnN0YWNrUmVnaXN0ZXJzKCkpOworICAgIG1fY2xvYmJlcmVkUmVncy5leGNsdWRlKFJlZ2lzdGVy
U2V0OjpyZXNlcnZlZEhhcmR3YXJlUmVnaXN0ZXJzKCkpOworICAgIG1fY2xvYmJlcmVkUmVncy5l
eGNsdWRlKFJlZ2lzdGVyU2V0OjpjYWxsZWVTYXZlUmVnaXN0ZXJzKCkpOworfQorCitDQ2FsbFNw
ZWNpYWw6On5DQ2FsbFNwZWNpYWwoKQoreworfQorCit2b2lkIENDYWxsU3BlY2lhbDo6Zm9yRWFj
aEFyZyhJbnN0JiBpbnN0LCBjb25zdCBTY29wZWRMYW1iZGE8SW5zdDo6RWFjaEFyZ0NhbGxiYWNr
PiYgY2FsbGJhY2spCit7CisgICAgY2FsbGJhY2soaW5zdC5hcmdzWzFdLCBBcmc6OlVzZSwgQXJn
OjpHUCk7CisgICAgCisgICAgZm9yICh1bnNpZ25lZCBpID0gMjsgaSA8IGluc3QuYXJncy5zaXpl
KCk7ICsraSkgeworICAgICAgICAvLyBGb3IgdGhlIHR5cGUsIHdlIGNhbiBqdXN0IHF1ZXJ5IHRo
ZSBhcmcncyB0eXBlLiBUaGUgYXJnIHdpbGwgaGF2ZSBhIHR5cGUsIGJlY2F1c2Ugd2UKKyAgICAg
ICAgLy8gcmVxdWlyZSB0aGVzZSBhcmdzIHRvIGJlIGFyZ3VtZW50IHJlZ2lzdGVycy4KKyAgICAg
ICAgY2FsbGJhY2soaW5zdC5hcmdzW2ldLCBBcmc6OlVzZSwgaW5zdC5hcmdzW2ldLnR5cGUoKSk7
CisgICAgfQorfQorCitib29sIENDYWxsU3BlY2lhbDo6aXNWYWxpZChJbnN0JiBpbnN0KQorewor
ICAgIGlmIChpbnN0LmFyZ3Muc2l6ZSgpIDwgMikKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisg
ICAgc3dpdGNoIChpbnN0LmFyZ3NbMV0ua2luZCgpKSB7CisgICAgY2FzZSBBcmc6OkltbToKKyAg
ICAgICAgaWYgKHNpemVvZih2b2lkKikgPT0gNCkKKyAgICAgICAgICAgIGJyZWFrOworICAgICAg
ICByZXR1cm4gZmFsc2U7CisgICAgY2FzZSBBcmc6OkltbTY0OgorICAgICAgICBpZiAoc2l6ZW9m
KHZvaWQqKSA9PSA4KQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIHJldHVybiBmYWxzZTsK
KyAgICBjYXNlIEFyZzo6VG1wOgorICAgIGNhc2UgQXJnOjpBZGRyOgorICAgIGNhc2UgQXJnOjpT
dGFjazoKKyAgICBjYXNlIEFyZzo6Q2FsbEFyZzoKKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVs
dDoKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGlmICghaW5zdC5hcmdzWzFd
LmlzR1AoKSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgZm9yICh1bnNpZ25lZCBpID0g
MjsgaSA8IGluc3QuYXJncy5zaXplKCk7ICsraSkgeworICAgICAgICBpZiAoIWluc3QuYXJnc1tp
XS5pc1JlZygpKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgICAgIGlmIChpbnN0
LmFyZ3NbaV0gPT0gVG1wKHNjcmF0Y2hSZWdpc3RlcikpCisgICAgICAgICAgICByZXR1cm4gIGZh
bHNlOworICAgIH0KKyAgICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBDQ2FsbFNwZWNpYWw6OmFk
bWl0c1N0YWNrKEluc3QmLCB1bnNpZ25lZCBhcmdJbmRleCkKK3sKKyAgICAvLyBBcmcgMSBjYW4g
YmUgYSBzdGFjayBhZGRyZXNzIGZvciBzdXJlLgorICAgIGlmIChhcmdJbmRleCA9PSAxKQorICAg
ICAgICByZXR1cm4gdHJ1ZTsKKyAgICAKKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK3ZvaWQgQ0Nh
bGxTcGVjaWFsOjpyZXBvcnRVc2VkUmVnaXN0ZXJzKEluc3QmLCBjb25zdCBSZWdpc3RlclNldCYp
Cit7Cit9CisKK0NDYWxsSGVscGVyczo6SnVtcCBDQ2FsbFNwZWNpYWw6OmdlbmVyYXRlKEluc3Qm
IGluc3QsIENDYWxsSGVscGVycyYgaml0LCBHZW5lcmF0aW9uQ29udGV4dCYpCit7CisgICAgc3dp
dGNoIChpbnN0LmFyZ3NbMV0ua2luZCgpKSB7CisgICAgY2FzZSBBcmc6OkltbToKKyAgICBjYXNl
IEFyZzo6SW1tUHRyOgorICAgICAgICBqaXQubW92ZShDQ2FsbEhlbHBlcnM6OlRydXN0ZWRJbW1Q
dHIoaW5zdC5hcmdzWzFdLnBvaW50ZXJWYWx1ZSgpKSwgc2NyYXRjaFJlZ2lzdGVyKTsKKyAgICAg
ICAgaml0LmNhbGwoc2NyYXRjaFJlZ2lzdGVyKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBB
cmc6OlRtcDoKKyAgICAgICAgaml0LmNhbGwoaW5zdC5hcmdzWzFdLmdwcigpKTsKKyAgICAgICAg
YnJlYWs7CisgICAgY2FzZSBBcmc6OkFkZHI6CisgICAgICAgIGppdC5jYWxsKGluc3QuYXJnc1sx
XS5hc0FkZHJlc3MoKSk7CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIFJF
TEVBU0VfQVNTRVJUX05PVF9SRUFDSEVEKCk7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBy
ZXR1cm4gQ0NhbGxIZWxwZXJzOjpKdW1wKCk7Cit9CisKK2NvbnN0IFJlZ2lzdGVyU2V0JiBDQ2Fs
bFNwZWNpYWw6OmV4dHJhQ2xvYmJlcmVkUmVncygpCit7CisgICAgcmV0dXJuIG1fY2xvYmJlcmVk
UmVnczsKK30KKwordm9pZCBDQ2FsbFNwZWNpYWw6OmR1bXBJbXBsKFByaW50U3RyZWFtJiBvdXQp
IGNvbnN0Cit7CisgICAgb3V0LnByaW50KCJDQ2FsbCIpOworfQorCit2b2lkIENDYWxsU3BlY2lh
bDo6ZGVlcER1bXBJbXBsKFByaW50U3RyZWFtJiBvdXQpIGNvbnN0Cit7CisgICAgb3V0LnByaW50
KCJmdW5jdGlvbiBjYWxsIHRoYXQgdXNlcyB0aGUgQyBjYWxsaW5nIGNvbnZlbnRpb24uIik7Cit9
CisKK30gfSB9IC8vIG5hbWVzcGFjZSBKU0M6OkIzOjpBaXIKKwpJbmRleDogU291cmNlL0phdmFT
Y3JpcHRDb3JlL2IzL2Fpci9BaXJDQ2FsbFNwZWNpYWwuaAo9PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2Uv
SmF2YVNjcmlwdENvcmUvYjMvYWlyL0FpckNDYWxsU3BlY2lhbC5oCShyZXZpc2lvbiAwKQorKysg
U291cmNlL0phdmFTY3JpcHRDb3JlL2IzL2Fpci9BaXJDQ2FsbFNwZWNpYWwuaAkod29ya2luZyBj
b3B5KQpAQCAtMCwwICsxLDY4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE1IEFwcGxlIElu
Yy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGlu
IHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlv
biwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwor
ICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJl
dGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25k
aXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlv
bnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICog
ICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNj
bGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxz
IHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElT
IFBST1ZJREVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1Ig
SU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisg
KiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBB
IFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFM
TCBBUFBMRSBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNU
LCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VR
VUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NV
UkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRB
LCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNF
RCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNU
LCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1Ig
T1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMg
U09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1B
R0UuIAorICovCisKKyNpZm5kZWYgQWlyQ0NhbGxTcGVjaWFsX2gKKyNkZWZpbmUgQWlyQ0NhbGxT
cGVjaWFsX2gKKworbmFtZXNwYWNlIEpTQyB7IG5hbWVzcGFjZSBCMyB7IG5hbWVzcGFjZSBBaXIg
eworCisvLyBVc2UgdGhpcyBzcGVjaWFsIGZvciBjb25zdHJ1Y3RpbmcgYSBDIGNhbGwuIEFyZyAw
IGlzIG9mIGNvdXJzZSBhIFNwZWNpYWwgYXJnIHRoYXQgcmVmZXJzIHRvIHRoZQorLy8gQ0NhbGxT
cGVjaWFsIG9iamVjdC4gQXJnIDEgaXMgdGhlIGNhbGxlZSwgYW5kIGl0IGNhbiBiZSBhbiBJbW1Q
dHIsIGEgcmVnaXN0ZXIsIG9yIGFuIGFkZHJlc3MuIFRoZQorLy8gcmVtYWluaW5nIGFyZ3MgYXJl
IGp1c3QgdGhlIHNldCBvZiBhcmd1bWVudCByZWdpc3RlcnMgdXNlZCBieSB0aGlzIGNhbGwuIEZv
ciBhcmd1bWVudHMgdGhhdCBnbyB0bworLy8gdGhlIHN0YWNrLCB5b3UgaGF2ZSB0byBkbyB0aGUg
Z3J1bnQgd29yayBvZiBkb2luZyB0aG9zZSBzdGFjayBzdG9yZXMuIEluIGZhY3QsIHRoZSBvbmx5
IHJlYXNvbiB3aHkKKy8vIHdlIHNwZWNpZnkgdGhlIGFyZ3VtZW50IHJlZ2lzdGVycyBhcyBhcmd1
bWVudHMgdG8gYSBjYWxsIGlzIHNvIHRoYXQgdGhlIGxpdmVuZXNzIGFuYWx5c2lzIGNhbiBzZWUK
Ky8vIHRoYXQgdGhleSBnZXQgdXNlZCBoZXJlLiBJdCB3b3VsZCBiZSB3cm9uZyB0byBhdXRvbWFn
aWNhbGx5IHJlcG9ydCBhbGwgYXJndW1lbnQgcmVnaXN0ZXJzIGFzIGJlaW5nCisvLyB1c2VkIGJl
Y2F1c2UgaWYgd2UgaGFkIGEgY2FsbCB0aGF0IGRpZG4ndCBwYXNzIHRoZW0sIHRoZW4gdGhleSdk
IGFwcGVhciB0byBiZSBsaXZlIHVudGlsIHNvbWUKKy8vIGNsb2JiZXIgcG9pbnQgb3IgdGhlIHBy
b2xvZ3VlLCB3aGljaGV2ZXIgaGFwcGVuZWQgc29vbmVyLgorCitjbGFzcyBDQ2FsbFNwZWNpYWwg
OiBwdWJsaWMgU3BlY2lhbCB7CitwdWJsaWM6CisgICAgQ0NhbGxTcGVjaWFsKCk7CisgICAgfkND
YWxsU3BlY2lhbCgpOworCisgICAgLy8gWW91IGNhbm5vdCB1c2UgdGhpcyByZWdpc3RlciB0byBw
YXNzIGFyZ3VtZW50cy4gSXQganVzdCBzbyBoYXBwZW5zIHRoYXQgdGhpcyByZWdpc3RlciBpcyBu
b3QKKyAgICAvLyB1c2VkIGZvciBhcmd1bWVudHMgaW4gdGhlIEMgY2FsbGluZyBjb252ZW50aW9u
LiBCeSB0aGUgd2F5LCB0aGlzIGlzIHRoZSBvbmx5IHRoaW5nIHRoYXQgY2F1c2VzCisgICAgLy8g
dGhpcyBzcGVjaWFsIHRvIGJlIHNwZWNpZmljIHRvIEMgY2FsbHMuCisgICAgc3RhdGljIGNvbnN0
IEdQUlJlZyBzY3JhdGNoUmVnaXN0ZXIgPSBHUFJJbmZvOjpub25BcmdHUFIwLgorCitwcm90ZWN0
ZWQ6CisgICAgdm9pZCBmb3JFYWNoQXJnKEluc3QmLCBjb25zdCBTY29wZWRMYW1iZGE8SW5zdDo6
RWFjaEFyZ0NhbGxiYWNrPiYpIG92ZXJyaWRlOworICAgIGJvb2wgaXNWYWxpZChJbnN0Jikgb3Zl
cnJpZGU7CisgICAgYm9vbCBhZG1pdHNTdGFjayhJbnN0JiwgdW5zaWduZWQgYXJnSW5kZXgpIG92
ZXJyaWRlOworICAgIHZvaWQgcmVwb3J0VXNlZFJlZ2lzdGVycyhJbnN0JiwgY29uc3QgUmVnaXN0
ZXJTZXQmKSBvdmVycmlkZTsKKyAgICBDQ2FsbEhlbHBlcnM6Okp1bXAgZ2VuZXJhdGUoSW5zdCYs
IENDYWxsSGVscGVycyYsIEdlbmVyYXRpb25Db250ZXh0Jikgb3ZlcnJpZGU7CisgICAgY29uc3Qg
UmVnaXN0ZXJTZXQmIGV4dHJhQ2xvYmJlcmVkUmVncyhJbnN0Jikgb3ZlcnJpZGU7CisKKyAgICB2
b2lkIGR1bXBJbXBsKFByaW50U3RyZWFtJikgY29uc3Qgb3ZlcnJpZGU7CisgICAgdm9pZCBkZWVw
RHVtcEltcGwoUHJpbnRTdHJlYW0mKSBjb25zdCBvdmVycmlkZTsKKworcHJpdmF0ZToKKyAgICBS
ZWdpc3RlclNldCBtX2Nsb2JiZXJlZFJlZ3M7Cit9OworCit9IH0gfSAvLyBuYW1lc3BhY2UgSlND
OjpCMzo6QWlyCisKKyNlbmRpZiAvLyBBaXJDQ2FsbFNwZWNpYWxfaAorCkluZGV4OiBTb3VyY2Uv
SmF2YVNjcmlwdENvcmUvYjMvYWlyL0FpckNvZGUuY3BwCj09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9K
YXZhU2NyaXB0Q29yZS9iMy9haXIvQWlyQ29kZS5jcHAJKHJldmlzaW9uIDApCisrKyBTb3VyY2Uv
SmF2YVNjcmlwdENvcmUvYjMvYWlyL0FpckNvZGUuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAg
KzEsNjQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTUgQXBwbGUgSW5jLiBBbGwgcmlnaHRz
IHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBi
aW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0
dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0Ogor
ICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92
ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRo
ZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkg
Zm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRo
aXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhl
CisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0
aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkg
QVBQTEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJB
TlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FS
UkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgor
ICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4g
T1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJ
TkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFH
RVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VC
U1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9G
SVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkg
VEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFC
SUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFS
SVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZF
TiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKwor
I2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgIkFpckNvZGUuaCIKKworbmFtZXNwYWNlIEpT
QyB7IG5hbWVzcGFjZSBCMyB7IG5hbWVzcGFjZSBBaXIgeworCitDb2RlOjpDb2RlKCkKK3sKK30K
KworQ29kZTo6fkNvZGUoKQoreworfQorCitCYXNpY0Jsb2NrKiBDb2RlOjphZGRCbG9jaygpCit7
CisgICAgc3RkOjp1bmlxdWVfcHRyPEJhc2ljQmxvY2s+IGJsb2NrKG5ldyBCYXNpY0Jsb2NrKG1f
YmxvY2tzLnNpemUoKSkpOworICAgIEJhc2ljQmxvY2sqIHJlc3VsdCA9IGJsb2NrLmdldCgpOwor
ICAgIG1fYmxvY2tzLmFwcGVuZChXVEY6Om1vdmUoYmxvY2spKTsKKyAgICByZXR1cm4gcmVzdWx0
OworfQorCit2b2lkIENvZGU6OmR1bXAoUHJpbnRTdHJlYW0mIG91dCkgY29uc3QKK3sKKyAgICBm
b3IgKEJhc2ljQmxvY2sqIGJsb2NrIDogKnRoaXMpCisgICAgICAgIG91dC5wcmludChkZWVwRHVt
cChibG9jaykpOworICAgIGlmIChudW1TdGFja1Nsb3RzKCkpIHsKKyAgICAgICAgb3V0LnByaW50
KCJTdGFjayBzbG90czpcbiIpOworICAgICAgICBmb3IgKFN0YWNrU2xvdCogc2xvdCA6IHN0YWNr
U2xvdHMoKSkKKyAgICAgICAgICAgIG91dC5wcmludCgiICAgICIsIGRlZXBEdW1wKHNsb3QpLCAi
XG4iKTsKKyAgICB9CisgICAgaWYgKG51bVNwZWNpYWxzKCkpIHsKKyAgICAgICAgb3V0LnByaW50
KCJTcGVjaWFsczpcbiIpOworICAgICAgICBmb3IgKFNwZWNpYWwqIHNwZWNpYWwgOiBzcGVjaWFs
cygpKQorICAgICAgICAgICAgb3V0LnByaW50KCIgICAgIiwgZGVlcER1bXAoc3BlY2lhbCksICJc
biIpOworICAgIH0KK30KKworfSB9IH0gLy8gbmFtZXNwYWNlIEpTQzo6QjM6OkFpcgorCkluZGV4
OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvYWlyL0FpckNvZGUuaAo9PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBT
b3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvYWlyL0FpckNvZGUuaAkocmV2aXNpb24gMCkKKysrIFNv
dXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9haXIvQWlyQ29kZS5oCSh3b3JraW5nIGNvcHkpCkBAIC0w
LDAgKzEsMTI3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE1IEFwcGxlIEluYy4gQWxsIHJp
Z2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBh
bmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBl
cm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1l
dDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUg
YWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFu
ZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmlu
YXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNl
LCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGlu
IHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVk
IHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVE
IEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBX
QVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVE
IFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VM
QVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJ
TkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVD
VCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBE
QU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9G
IFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICog
UFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04g
QU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1Qg
TElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNF
KSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUs
IEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICov
CisKKyNpZm5kZWYgQWlyQ29kZV9oCisjZGVmaW5lIEFpckNvZGVfaAorCisjaW5jbHVkZSAiQWly
QmFzaWNCbG9jay5oIgorI2luY2x1ZGUgIkFpclNwZWNpYWwuaCIKKyNpbmNsdWRlICJBaXJTdGFj
a1Nsb3QuaCIKKworbmFtZXNwYWNlIEpTQyB7IG5hbWVzcGFjZSBCMyB7CisKK2NsYXNzIFByb2Nl
ZHVyZTsKKworbmFtZXNwYWNlIEFpciB7CisKKy8vIFRoaXMgaXMgYW4gSVIgdGhhdCBpcyB2ZXJ5
IGNsb3NlIHRvIHRoZSBiYXJlIG1ldGFsLiBJdCByZXF1aXJlcyBhYm91dCA0MHggbW9yZSBieXRl
cyB0aGFuIHRoZQorLy8gZ2VuZXJhdGVkIG1hY2hpbmUgY29kZSAtIGZvciBleGFtcGxlIGlmIHlv
dSdyZSBnZW5lcmF0aW5nIDFNQiBvZiBtYWNoaW5lIGNvZGUsIHlvdSBuZWVkIGFib3V0CisvLyA0
ME1CIG9mIEFpci4KKworY2xhc3MgQ29kZSB7CisgICAgV1RGX01BS0VfTk9OQ09QWUFCTEUoQ29k
ZSk7CisgICAgV1RGX01BS0VfRkFTVF9BTExPQ0FURUQ7CitwdWJsaWM6CisgICAgQ29kZSgpOwor
ICAgIH5Db2RlKCk7CisKKyAgICBCYXNpY0Jsb2NrKiBhZGRCbG9jaygpOworCisgICAgU3RhY2tT
bG90KiBhZGRTdGFja1Nsb3QoKTsKKworICAgIFNwZWNpYWwqIGFkZFNwZWNpYWwoc3RkOjp1bmlx
dWVfcHRyPFNwZWNpYWw+KTsKKworICAgIC8vIFRoaXMgaXMgdGhlIHNwZWNpYWwgeW91IG5lZWQg
dG8gbWFrZSBhIEMgY2FsbCEKKyAgICBTcGVjaWFsKiBjQ2FsbFNwZWNpYWwoKTsKKworICAgIHZv
aWQgZHVtcChQcmludFN0cmVhbSYpIGNvbnN0OworCisgICAgdW5zaWduZWQgc2l6ZSgpIGNvbnN0
IHsgcmV0dXJuIG1fYmxvY2tzLnNpemUoKTsgfQorICAgIEJhc2ljQmxvY2sqIGF0KHVuc2lnbmVk
IGluZGV4KSBjb25zdCB7IHJldHVybiBtX2Jsb2Nrc1tpbmRleF07IH0KKyAgICBCYXNpY0Jsb2Nr
KiBvcGVyYXRvcltdKHVuc2lnbmVkIGluZGV4KSBjb25zdCB7IHJldHVybiBhdChpbmRleCk7IH0K
KworICAgIGNsYXNzIGl0ZXJhdG9yIHsKKyAgICBwdWJsaWM6CisgICAgICAgIGl0ZXJhdG9yKCk6
CisgICAgICAgICAgICA6IG1fcHJvY2VkdXJlKG51bGxwdHIpCisgICAgICAgICAgICAsIG1faW5k
ZXgoMCkKKyAgICAgICAgeworICAgICAgICB9CisKKyAgICAgICAgaXRlcmF0b3IoUHJvY2VkdXJl
JiBwcm9jZWR1cmUsIHVuc2lnbmVkIGluZGV4KQorICAgICAgICAgICAgOiBtX3Byb2NlZHVyZSgm
cHJvY2VkdXJlKQorICAgICAgICAgICAgLCBtX2luZGV4KGluZGV4KQorICAgICAgICB7CisgICAg
ICAgIH0KKworICAgICAgICBCYXNpY0Jsb2NrKiBvcGVyYXRvciooKQorICAgICAgICB7CisgICAg
ICAgICAgICByZXR1cm4gbV9wcm9jZWR1cmUtPmF0KG1faW5kZXgpOworICAgICAgICB9CisKKyAg
ICAgICAgaXRlcmF0b3ImIG9wZXJhdG9yKysoKQorICAgICAgICB7CisgICAgICAgICAgICBtX2lu
ZGV4ID0gZmluZE5leHQobV9pbmRleCArIDEpOworICAgICAgICAgICAgcmV0dXJuICp0aGlzOwor
ICAgICAgICB9CisKKyAgICAgICAgYm9vbCBvcGVyYXRvcj09KGNvbnN0IGl0ZXJhdG9yJiBvdGhl
cikgY29uc3QKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIG1faW5kZXggPT0gb3RoZXIu
bV9pbmRleDsKKyAgICAgICAgfQorCisgICAgICAgIGJvb2wgb3BlcmF0b3IhPShjb25zdCBpdGVy
YXRvciYgb3RoZXIpIGNvbnN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiAhKCp0aGlz
ID09IG90aGVyKTsKKyAgICAgICAgfQorCisgICAgcHJpdmF0ZToKKyAgICAgICAgdW5zaWduZWQg
ZmluZE5leHQodW5zaWduZWQgaW5kZXgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHdoaWxlIChp
bmRleCA8IG1fcHJvY2VkdXJlLT5zaXplKCkgJiYgIW1fcHJvY2VkdXJlLT5hdChpbmRleCkpCisg
ICAgICAgICAgICAgICAgaW5kZXgrKzsKKyAgICAgICAgICAgIHJldHVybiBpbmV4OworICAgICAg
ICB9CisKKyAgICAgICAgUHJvY2VkdXJlKiBtX3Byb2NlZHVyZTsKKyAgICAgICAgdW5zaWduZWQg
bV9pbmRleDsKKyAgICB9OworCisgICAgaXRlcmF0b3IgYmVnaW4oKSBjb25zdCB7IHJldHVybiBp
dGVyYXRvcigqdGhpcywgMCk7IH0KKyAgICBpdGVyYXRvciBlbmQoKSBjb25zdCB7IHJldHVybiBp
dGVyYXRvcigqdGhpcywgbnVtQmxvY2tzKCkpOyB9CisKK3ByaXZhdGU6CisgICAgVmVjdG9yPHN0
ZDo6dW5pcXVlX3B0cjxTdGFja1Nsb3Q+PiBtX3N0YWNrU2xvdHM7CisgICAgVmVjdG9yPHN0ZDo6
dW5pcXVlX3B0cjxCYXNpY0Jsb2NrPj4gbV9ibG9ja3M7CisgICAgVmVjdG9yPHN0ZDo6dW5pcXVl
X3B0cjxTcGVjaWFsPj4gbV9zcGVjaWFsczsKKyAgICBTcGVjaWFsKiBtX2NhbGxTcGVjaWFsOwor
cHVibGljOgorICAgIHVuc2lnbmVkIGZyYW1lU2l6ZTsKK307CisKK30gfSB9IC8vIG5hbWVzcGFj
ZSBKU0M6OkIzOjpBaXIKKworI2VuZGlmIC8vIEFpckNvZGVfaAorCkluZGV4OiBTb3VyY2UvSmF2
YVNjcmlwdENvcmUvYjMvYWlyL0FpckdlbmVyYXRpb25Db250ZXh0LmgKPT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0g
U291cmNlL0phdmFTY3JpcHRDb3JlL2IzL2Fpci9BaXJHZW5lcmF0aW9uQ29udGV4dC5oCShyZXZp
c2lvbiAwKQorKysgU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL2Fpci9BaXJHZW5lcmF0aW9uQ29u
dGV4dC5oCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsNDMgQEAKKy8qCisgKiBDb3B5cmlnaHQg
KEMpIDIwMTUgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJp
YnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91
dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxv
d2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNv
dXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwg
dGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAq
IDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJv
dmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0
aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9v
ciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAq
IFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFTIElTJycgQU5EIEFO
WQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBM
SU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkg
QU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4g
IElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFC
TEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhF
TVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1J
VEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsg
TE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJ
T04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdI
RVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJ
TkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhF
IFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJ
TElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKworI2lmbmRlZiBBaXJHZW5lcmF0aW9uQ29udGV4
dF9oCisjZGVmaW5lIEFpckdlbmVyYXRpb25Db250ZXh0X2gKKworI2luY2x1ZGUgPHd0Zi9TaGFy
ZWRUYXNrLmg+CisKK25hbWVzcGFjZSBKU0MgeyBuYW1lc3BhY2UgQjMgeyBuYW1lc3BhY2UgQWly
IHsKKworc3RydWN0IEdlbmVyYXRpb25Db250ZXh0IHsKKyAgICB0eXBlZGVmIHZvaWQgTGF0ZVBh
dGhGdW5jdGlvbihDQ2FsbEhlbHBlcnMmLCBHZW5lcmF0aW9uQ29udGV4dCYpOworICAgIHR5cGVk
ZWYgU2hhcmVkVGFzazxMYXRlUGF0aEZ1bmN0aW9uPiBMYXRlUGF0aDsKKworICAgIFZlY3RvcjxS
ZWZQdHI8TGF0ZVBhdGg+PiBsYXRlUGF0aHM7Cit9OworCit9IH0gfSAvLyBuYW1lc3BhY2UgSlND
OjpCMzo6QWlyCisKKyNlbmRpZiAvLyBBaXJHZW5lcmF0aW9uQ29udGV4dF9oCisKSW5kZXg6IFNv
dXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9haXIvQWlySW5zZXJ0aW9uU2V0LmNwcAo9PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvYWlyL0Fpckluc2VydGlvblNldC5jcHAJKHJl
dmlzaW9uIDApCisrKyBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvYWlyL0Fpckluc2VydGlvblNl
dC5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSwzOSBAQAorLyoKKyAqIENvcHlyaWdodCAo
QykgMjAxNSBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmli
dXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0
CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93
aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291
cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0
aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICog
Mi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92
ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRo
ZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29y
IG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICog
VEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5Z
CisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJ
TUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBB
TkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAg
SU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJM
RSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVN
UExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlU
RUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBM
T1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElP
TikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hF
VEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElO
RyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUg
VVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklM
SVRZIE9GIFNVQ0ggREFNQUdFLiAKKyAqLworCisjaW5jbHVkZSAiY29uZmlnLmgiCisjaW5jbHVk
ZSAiQWlySW5zZXJ0aW9uU2V0LmgiCisKKyNpbmNsdWRlICJBaXJCYXNpY0Jsb2NrLmgiCisKK25h
bWVzcGFjZSBKU0MgeyBuYW1lc3BhY2UgQjMgeyBuYW1lc3BhY2UgQWlyIHsKKwordm9pZCBJbnNl
cnRpb25TZXQ6OmV4ZWN1dGUoQmFzaWNCbG9jayogYmxvY2spCit7CisgICAgZXhlY3V0ZUluc2Vy
dGlvbnMoYmxvY2stPm1faW5zdHMsIG1faW5zZXJ0aW9ucyk7Cit9CisKK30gfSB9IC8vIG5hbWVz
cGFjZSBKU0M6OkIzOjpBaXIKKwpJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL2Fpci9B
aXJJbnNlcnRpb25TZXQuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMv
YWlyL0Fpckluc2VydGlvblNldC5oCShyZXZpc2lvbiAwKQorKysgU291cmNlL0phdmFTY3JpcHRD
b3JlL2IzL2Fpci9BaXJJbnNlcnRpb25TZXQuaAkod29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDc3
IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE1IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNl
cnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5
IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBw
cm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEu
IFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29w
eXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9s
bG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0g
bXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxp
c3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICog
ICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhl
IGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExF
IElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVT
LCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJ
RVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBV
UlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SCisg
KiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURF
TlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJ
TkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRV
VEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsg
T1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9S
WQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZ
LCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5H
IElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYg
QURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisKKyNpZm5k
ZWYgQWlySW5zZXJ0aW9uU2V0X2gKKyNkZWZpbmUgQWlySW5zZXJ0aW9uU2V0X2gKKworI2luY2x1
ZGUgIkFpckluc3QuaCIKKyNpbmNsdWRlIDx3dGYvSW5zZXJ0aW9uLmg+CisjaW5jbHVkZSA8d3Rm
L1ZlY3Rvci5oPgorCituYW1lc3BhY2UgSlNDIHsgbmFtZXNwYWNlIEIzIHsgbmFtZXNwYWNlIEFp
ciB7CisKK2NsYXNzIEJhc2ljQmxvY2s7CitjbGFzcyBDb2RlOworCit0eXBlZGVmIFdURjo6SW5z
ZXJ0aW9uPEluc3Q+IEluc2VydGlvbjsKKworY2xhc3MgSW5zZXJ0aW9uU2V0IHsKK3B1YmxpYzoK
KyAgICBJbnNlcnRpb25TZXQoQ29kZSYgY29kZSkKKyAgICAgICAgOiBtX2NvZGUoY29kZSkKKyAg
ICB7CisgICAgfQorCisgICAgQ29kZSYgY29kZSgpIHsgcmV0dXJuIG1fY29kZTsgfQorCisgICAg
dGVtcGxhdGU8dHlwZW5hbWUgVD4KKyAgICB2b2lkIGFwcGVuZEluc2VydGlvbihUJiYgaW5zZXJ0
aW9uKQorICAgIHsKKyAgICAgICAgbV9pbnNlcnRpb25zLmFwcGVuZChzdGQ6OmZvcndhcmQ8VD4o
aW5zZXJ0aW9uKSk7CisgICAgfQorCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgSW5zdD4KKyAgICB2
b2lkIGluc2VydEluc3Qoc2l6ZV90IGluZGV4LCBJbnN0JiYgaW5zdCkKKyAgICB7CisgICAgICAg
IGFwcGVuZEluc2VydGlvbihJbnNlcnRpb24oaW5kZXgsIHN0ZDo6Zm9yd2FyZDxJbnN0PihpbnN0
KSkpOworICAgIH0KKyAgICAKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZS4uLiBBcmd1bWVudHM+Cisg
ICAgdm9pZCBpbnNlcnQoc2l6ZV90IGluZGV4LCBBcmd1bWVudHMmJi4uLiBhcmd1bWVudHMpCisg
ICAgeworICAgICAgICBpbnNlcnRJbnN0KGluZGV4LCBJbnN0KHN0ZDo6Zm9yd2FyZDxBcmd1bWVu
dHM+KGFyZ3VtZW50cykuLi4pKTsKKyAgICB9CisKKyAgICB2b2lkIGV4ZWN1dGUoQmFzaWNCbG9j
ayopOworCitwcml2YXRlOgorICAgIENvZGUmIG1fY29kZTsKKyAgICBWZWN0b3I8SW5zZXJ0aW9u
LCA4PiBtX2luc2VydGlvbnM7Cit9OworCit9IH0gfSAvLyBuYW1lc3BhY2UgSlNDOjpCMzo6QWly
CisKKyNlbmRpZiAvLyBBaXJJbnNlcnRpb25TZXRfaAorCkluZGV4OiBTb3VyY2UvSmF2YVNjcmlw
dENvcmUvYjMvYWlyL0Fpckluc3QuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0
Q29yZS9iMy9haXIvQWlySW5zdC5jcHAJKHJldmlzaW9uIDApCisrKyBTb3VyY2UvSmF2YVNjcmlw
dENvcmUvYjMvYWlyL0Fpckluc3QuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsNDAgQEAK
Ky8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTUgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVk
LgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9y
bXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3Zp
ZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVk
aXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmln
aHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dp
bmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0
IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBv
ZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBk
b2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlz
dHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5D
LiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElO
Q0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBP
RiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9T
RSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IKKyAqIENP
TlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFM
LCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xV
RElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBH
T09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBC
VVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisg
KiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9S
IFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4g
QU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJ
U0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKworI2luY2x1ZGUg
ImNvbmZpZy5oIgorI2luY2x1ZGUgIkFpckluc3QuaCIKKworI2luY2x1ZGUgIkIzVmFsdWUuaCIK
KyNpbmNsdWRlIDx3dGYvTGlzdER1bXAuaD4KKworbmFtZXNwYWNlIEpTQyB7IG5hbWVzcGFjZSBC
MyB7IG5hbWVzcGFjZSBBaXIgeworCit2b2lkIEluc3Q6OmR1bXAoUHJpbnRTdHJlYW0mIG91dCkg
Y29uc3QKK3sKKyAgICBvdXQucHJpbnQob3Bjb2RlLCAiICIsIGxpc3REdW1wKGFyZ3MpLCAiICA7
ICIsICpvcmlnaW4pOworfQorCit9IH0gfSAvLyBuYW1lc3BhY2UgSlNDOjpCMzo6QWlyCisKSW5k
ZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9haXIvQWlySW5zdC5oCj09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0t
IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9haXIvQWlySW5zdC5oCShyZXZpc2lvbiAwKQorKysg
U291cmNlL0phdmFTY3JpcHRDb3JlL2IzL2Fpci9BaXJJbnN0LmgJKHdvcmtpbmcgY29weSkKQEAg
LTAsMCArMSwxNDkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTUgQXBwbGUgSW5jLiBBbGwg
cmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNl
IGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUg
cGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUg
bWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRo
ZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMg
YW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBi
aW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3Rp
Y2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIg
aW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlk
ZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklE
RUQgQlkgQVBQTEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVE
IFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJ
RUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElD
VUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExF
IElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElS
RUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFM
IERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQg
T0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisg
KiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBP
TiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklD
VCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJ
U0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FS
RSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisg
Ki8KKworI2lmbmRlZiBBaXJJbnN0X2gKKyNkZWZpbmUgQWlySW5zdF9oCisKKyNpbmNsdWRlICJB
aXJBcmcuaCIKKyNpbmNsdWRlICJBaXJPcGNvZGUuaCIKKworbmFtZXNwYWNlIEpTQyB7CisKK2Ns
YXNzIENDYWxsSGVscGVyczsKKworbmFtZXNwYWNlIEIzIHsKKworY2xhc3MgVmFsdWU7CisKK25h
bWVzcGFjZSBBaXIgeworCitzdHJ1Y3QgR2VuZXJhdGlvbkNvbnRleHQ7CisKK3N0cnVjdCBJbnN0
IHsKK3B1YmxpYzoKKyAgICB0eXBlZGVmIFZlY3RvcjxBcmcsIDM+IEFyZ0xpc3Q7CisKKyAgICBJ
bnN0KE9wY29kZSBvcGNvZGUsIFZhbHVlKiBvcmlnaW4pCisgICAgICAgIDogb3JpZ2luKG9yaWdp
bikKKyAgICAgICAgLCBvcGNvZGUob3Bjb2RlKQorICAgIHsKKyAgICB9CisgICAgCisgICAgdGVt
cGxhdGU8dHlwZW5hbWUuLi4gQXJndW1lbnRzPgorICAgIEluc3QoT3Bjb2RlIG9wY29kZSwgVmFs
dWUqIG9yaWdpbiwgQXJnIGFyZywgQXJndW1lbnRzLi4uIGFyZ3VtZW50cykKKyAgICAgICAgOiBh
cmdzeyBhcmcsIGFyZ3VtZW50cy4uLiB9CisgICAgICAgICwgb3JpZ2luKG9yaWdpbikKKyAgICAg
ICAgLCBvcGNvZGUob3Bjb2RlKQorICAgIHsKKyAgICB9CisKKyAgICBJbnN0KE9wY29kZSBvcGNv
ZGUsIFZhbHVlKiBvcmlnaW4sIGNvbnN0IEFyZ0xpc3QmIGFyZ3VtZW50cykKKyAgICAgICAgOiBh
cmdzKGFyZ3VtZW50cykKKyAgICAgICAgLCBvcmlnaW4ob3JpZ2luKQorICAgICAgICAsIG9wY29k
ZShvcGNvZGUpCisgICAgeworICAgIH0KKworICAgIEluc3QoT3Bjb2RlIG9wY29kZSwgVmFsdWUq
IG9yaWdpbiwgQXJnTGlzdCYmIGFyZ3VtZW50cykKKyAgICAgICAgOiBhcmdzKFdURjo6bW92ZShh
cmd1bWVudHMpKQorICAgICAgICAsIG9yaWdpbihvcmlnaW4pCisgICAgICAgICwgb3Bjb2RlKG9w
Y29kZSkKKyAgICB7CisgICAgfQorCisgICAgLy8gTm90ZSB0aGF0IHRoZXNlIGZ1bmN0b3JzIGFs
bCBhdm9pZCB1c2luZyAiY29uc3QiIGJlY2F1c2Ugd2Ugd2FudCB0byB1c2UgdGhlbSBmb3IgdGhp
bmdzIHRoYXQKKyAgICAvLyBlZGl0IElSLiBJUiBpcyBtZWFudCB0byBiZSBlZGl0ZWQ7IGlmIHlv
dSdyZSBjYXJyeWluZyBhcm91bmQgYSAiY29uc3QgSW5zdCYiIHRoZW4geW91J3JlCisgICAgLy8g
cHJvYmFibHkgZG9pbmcgaXQgd3JvbmcuCisKKyAgICAvLyBUaGlzIG9ubHkgd2Fsa3MgdGhvc2Ug
VG1wcyB0aGF0IGFyZSBleHBsaWNpdGx5IG1lbnRpb25lZCwgYW5kIGl0IGRvZXNuJ3QgdGVsbCB5
b3UgdGhlaXIgcm9sZQorICAgIC8vIG9yIHR5cGUuCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgRnVu
Y3Rvcj4KKyAgICB2b2lkIGZvckVhY2hUbXBGYXN0KGNvbnN0IEZ1bmN0b3ImIGZ1bmN0b3IpCisg
ICAgeworICAgICAgICBmb3IgKEFyZyBhcmcgOiBhcmdzKQorICAgICAgICAgICAgYXJnLmZvckVh
Y2hUbXBGYXN0KGZ1bmN0b3IpOworICAgIH0KKworICAgIHR5cGVkZWYgdm9pZCBFYWNoQXJnQ2Fs
bGJhY2soQXJnJiwgQXJnOjpSb2xlLCBBcmc6OlR5cGUpOworICAgIAorICAgIC8vIENhbGxzIHRo
ZSBmdW5jdG9yIHdpdGggKGFyZywgcm9sZSwgdHlwZSkuIFRoaXMgZnVuY3Rpb24gaXMgYXV0by1n
ZW5lcmF0ZWQgYnkKKyAgICAvLyBvcGNvZGVfZ2VuZXJhdG9yLnJiLgorICAgIHRlbXBsYXRlPHR5
cGVuYW1lIEZ1bmN0b3I+CisgICAgdm9pZCBmb3JFYWNoQXJnKGNvbnN0IEZ1bmN0b3ImIGZ1bmN0
b3IpOworCisgICAgLy8gQ2FsbHMgdGhlIGZ1bmN0b3Igd2l0aCAodG1wLCByb2xlLCB0eXBlKS4K
KyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBGdW5jdG9yPgorICAgIHZvaWQgZm9yRWFjaFRtcChjb25z
dCBGdW5jdG9yJiBmdW5jdG9yKQorICAgIHsKKyAgICAgICAgZm9yRWFjaEFyZ1JvbGUoCisgICAg
ICAgICAgICBbJl0gKEFyZyYgYXJnLCBBcmc6OlJvbGUgcm9sZSwgQXJnOjpUeXBlIHR5cGUpIHsK
KyAgICAgICAgICAgICAgICBhcmcuZm9yRWFjaFRtcChyb2xlLCB0eXBlLCBmdW5jdG9yKTsKKyAg
ICAgICAgICAgIH0pOworICAgIH0KKworICAgIC8vIFRoaW5nIGNhbiBiZSBlaXRoZXIgQXJnIG9y
IFRtcC4KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUaGluZywgdHlwZW5hbWUgRnVuY3Rvcj4KKyAg
ICB2b2lkIGZvckVhY2goY29uc3QgRnVuY3RvciYgZnVuY3Rvcik7CisKKyAgICAvLyBSZXR1cm5z
IHRydWUgaWYgdGhpcyBpbnN0cnVjdGlvbiBoYXMgYSBTcGVjaWFsKi4gVGhpcyB1bmxvY2tzIHNv
bWUgZXh0cmEgZnVuY3Rpb25hbGl0eS4KKyAgICBib29sIGhhc1NwZWNpYWwoKSBjb25zdDsKKwor
ICAgIC8vIFJlcG9ydHMgYW55IGFkZGl0aW9uYWwgcmVnaXN0ZXJzIGNsb2JiZXJlZCBieSB0aGlz
IG9wZXJhdGlvbi4gTm90ZSB0aGF0IGZvciBlZmZpY2llbmN5LAorICAgIC8vIGV4dHJhQ2xvYmJl
cmVkUmVncygpIG9ubHkgd29ya3MgaWYgaGFzU3BlY2lhbCgpIHJldHVybnMgdHJ1ZS4KKyAgICBj
b25zdCBSZWdpc3RlclNldCYgZXh0cmFDbG9iYmVyZWRSZWdzKCk7CisKKyAgICAvLyBVc2UgdGhp
cyB0byByZXBvcnQgd2hpY2ggcmVnaXN0ZXJzIGFyZSBsaXZlLiBUaGlzIHNob3VsZCBiZSBkb25l
IGp1c3QgYmVmb3JlIGNvZGVnZW4uIE5vdGUKKyAgICAvLyB0aGF0IGZvciBlZmZpY2llbmN5LCBy
ZXBvcnRVc2VkUmVnaXN0ZXJzKCkgb25seSB3b3JrcyBpZiBoYXNTcGVjaWFsKCkgcmV0dXJucyB0
cnVlLgorICAgIHZvaWQgcmVwb3J0VXNlZFJlZ2lzdGVycyhjb25zdCBSZWdpc3RlclNldCYpOwor
CisgICAgLy8gSXMgdGhpcyBpbnN0cnVjdGlvbiBpbiBvbmUgb2YgdGhlIHZhbGlkIGZvcm1zIHJp
Z2h0IG5vdz8gVGhpcyBmdW5jdGlvbiBpcyBhdXRvLWdlbmVyYXRlZCBieQorICAgIC8vIG9wY29k
ZV9nZW5lcmF0b3IucmIuCisgICAgYm9vbCBpc1ZhbGlkRm9ybSgpOworCisgICAgLy8gQXNzdW1p
bmcgdGhpcyBpbnN0cnVjdGlvbiBpcyBpbiBhIHZhbGlkIGZvcm0gcmlnaHQgbm93LCB3aWxsIGl0
IHN0aWxsIGJlIGluIG9uZSBvZiB0aGUgdmFsaWQKKyAgICAvLyBmb3JtcyBpZiB3ZSBwdXQgYW4g
QWRkciByZWZlcmVuY2luZyB0aGUgc3RhY2sgKG9yIGEgU3RhY2tTbG90IG9yIENhbGxBcmcsIG9m
IGNvdXJzZSkgaW4gdGhlCisgICAgLy8gZ2l2ZW4gaW5kZXg/IFNwaWxsaW5nIHVzZXMgdGhpczog
aXQgd2Fsa3MgdGhlIGFyZ3MgYnkgaW5kZXggdG8gZmluZCBUbXBzIHRoYXQgbmVlZCBzcGlsbGlu
ZzsKKyAgICAvLyBpZiBpdCBmaW5kcyBvbmUsIGl0IGNhbGxzIHRoaXMgdG8gc2VlIGlmIGl0IGNh
biByZXBsYWNlIHRoZSBBcmc6OlRtcCB3aXRoIGFuIEFyZzo6QWRkci4gSWYgaXQKKyAgICAvLyBm
aW5kcyBhIG5vbi1UbXAgQXJnLCB0aGVuIGl0IGNhbGxzIHRoYXQgQXJnJ3MgZm9yRWFjaFRtcCB0
byBkbyBhIHJlcGxhY2VtZW50IHRoYXQgd2F5LgorICAgIC8vCisgICAgLy8gVGhpcyBmdW5jdGlv
biBpcyBhdXRvLWdlbmVyYXRlZCBieSBvcGNvZGVfZ2VuZXJhdG9yLnJiLgorICAgIGJvb2wgYWRt
aXRzU3RhY2sodW5zaWduZWQgYXJnSW5kZXgpOworCisgICAgLy8gR2VuZXJhdGUgc29tZSBjb2Rl
IGZvciB0aGlzIGluc3RydWN0aW9uLiBUaGlzIGlzLCBsaWtlLCBsaXRlcmFsbHkgb3VyIGJhY2tl
bmQuIElmIHRoaXMgaXMgdGhlCisgICAgLy8gdGVybWluYWwsIGl0IHJldHVybnMgdGhlIGp1bXAg
dGhhdCBuZWVkcyB0byBiZSBsaW5rZWQgZm9yIHRoZSAidGhlbiIgY2FzZSwgd2l0aCB0aGUgImVs
c2UiCisgICAgLy8gY2FzZSBiZWluZyBmYWxsLXRocm91Z2guIFRoaXMgZnVuY3Rpb24gaXMgYXV0
by1nZW5lcmF0ZWQgYnkgb3Bjb2RlX2dlbmVyYXRvci5yYi4KKyAgICBDQ2FsbEhlbHBlcnM6Okp1
bXAgZ2VuZXJhdGUoQ0NhbGxIZWxwZXJzJiwgR2VuZXJhdGlvbkNvbnRleHQmKTsKKworICAgIHZv
aWQgZHVtcChQcmludFN0cmVhbSYpIGNvbnN0OworCisgICAgQXJnTGlzdCBhcmdzOworICAgIFZh
bHVlKiBvcmlnaW47IC8vIFRoZSBCMzo6VmFsdWUgdGhhdCB0aGlzIG9yaWdpbmF0ZWQgZnJvbS4K
KyAgICBPcGNvZGUgb3Bjb2RlOworfTsKKworfSB9IH0gLy8gbmFtZXNwYWNlIEpTQzo6QjM6OkFp
cgorCisjZW5kaWYgLy8gQWlySW5zdF9oCisKSW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9i
My9haXIvQWlySW5zdElubGluZXMuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENv
cmUvYjMvYWlyL0Fpckluc3RJbmxpbmVzLmgJKHJldmlzaW9uIDApCisrKyBTb3VyY2UvSmF2YVNj
cmlwdENvcmUvYjMvYWlyL0Fpckluc3RJbmxpbmVzLmgJKHdvcmtpbmcgY29weSkKQEAgLTAsMCAr
MSw5MSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNSBBcHBsZSBJbmMuIEFsbCByaWdodHMg
cmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJp
bmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0
ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6Cisg
KiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3Zl
IGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhl
IGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBm
b3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhp
cyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUK
KyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRo
IHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBB
UFBMRSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFO
VElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJS
QU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisg
KiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBP
UgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElO
Q0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdF
UyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJT
VElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJ
VFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBU
SEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJ
TElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJ
U0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVO
IElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLiAKKyAqLworCisj
aWZuZGVmIEFpckluc3RJbmxpbmVzX2gKKyNkZWZpbmUgQWlySW5zdElubGluZXNfaAorCisjaW5j
bHVkZSAiQWlySW5zdC5oIgorI2luY2x1ZGUgIkFpck9wY29kZVV0aWxzLmgiCisjaW5jbHVkZSAi
QWlyU3BlY2lhbHMuaCIKKyNpbmNsdWRlICJCM1N0YWNrbWFwLmgiCisjaW5jbHVkZSAiQjNWYWx1
ZS5oIgorCituYW1lc3BhY2UgSlNDIHsgbmFtZXNwYWNlIEIzIHsgbmFtZXNwYWNlIEFpciB7CisK
K3RlbXBsYXRlPHR5cGVuYW1lIFQ+IHN0cnVjdCBGb3JFYWNoOwordGVtcGxhdGU8PiBzdHJ1Y3Qg
Rm9yRWFjaDxUbXA+IHsKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBGdW5jdG9yPgorICAgIHZvaWQg
Zm9yRWFjaChJbnN0JiBpbnN0LCBjb25zdCBGdW5jdG9yJiBmdW5jdG9yKQorICAgIHsKKyAgICAg
ICAgaW5zdC5mb3JFYWNoVG1wKGZ1bmN0b3IpOworICAgIH0KK307Cit0ZW1wbGF0ZTw+IHN0cnVj
dCBGb3JFYWNoPEFyZz4geworICAgIHRlbXBsYXRlPHR5cGVuYW1lIEZ1bmN0b3I+CisgICAgdm9p
ZCBmb3JFYWNoKEluc3QmIGluc3QsIGNvbnN0IEZ1bmN0b3ImIGZ1bmN0b3IpCisgICAgeworICAg
ICAgICBpbnN0LmZvckVhY2hBcmcoZnVuY3Rvcik7CisgICAgfQorfTsKKwordGVtcGxhdGU8dHlw
ZW5hbWUgVGhpbmcsIHR5cGVuYW1lIEZ1bmN0b3I+Cit2b2lkIGZvckVhY2goY29uc3QgRnVuY3Rv
ciYgZnVuY3RvcikKK3sKKyAgICBGb3JFYWNoPFRoaW5nPjo6Zm9yRWFjaCgqdGhpcywgZnVuY3Rv
cik7Cit9CisKK2Jvb2wgSW5zdDo6aGFzU3BlY2lhbCgpIGNvbnN0Cit7CisgICAgcmV0dXJuIGFy
Z3Muc2l6ZSgpICYmIGFyZ3NbMF0uaXNTcGVjaWFsKCk7Cit9CisKK2NvbnN0IFJlZ2lzdGVyU2V0
JiBJbnN0OjpleHRyYUNsb2JiZXJlZFJlZ3MoKQoreworICAgIHJldHVybiBhcmdzWzBdLnNwZWNp
YWwoKS0+ZXh0cmFDbG9iYmVyZWRSZWdzKCp0aGlzKTsKK30KKwordm9pZCBJbnN0OjpyZXBvcnRV
c2VkUmVnaXN0ZXJzKGNvbnN0IFJlZ2lzdGVyU2V0JiB1c2VkUmVnaXN0ZXJzKQoreworICAgIGFy
Z3NbMF0uc3BlY2lhbCgpLT5yZXBvcnRVc2VkUmVnaXN0ZXJzKCp0aGlzLCB1c2VkUmVnaXN0ZXJz
KTsKK30KKworaW5saW5lIGJvb2wgaXNTaGlmdFZhbGlkKEluc3QmIGluc3QpCit7CisjaWYgQ1BV
KFg4NikKKyAgICByZXR1cm4gaW5zdC5hcmdzWzBdID09IFRtcChYODZSZWdpc3Rlcjo6Y3gpOwor
I2Vsc2UKKyAgICByZXR1cm4gdHJ1ZTsKKyNlbmRpZgorfSAgIAorCitpbmxpbmUgYm9vbCBpc0xz
aGlmdDMyVmFsdWUoSW5zdCYgaW5zdCkKK3sKKyAgICByZXR1cm4gaXNTaGlmdFZhbGlkKGluc3Qp
OworfQorCit9IH0gfSAvLyBuYW1lc3BhY2UgSlNDOjpCMzo6QWlyCisKKyNlbmRpZiAvLyBBaXJJ
bnN0SW5saW5lc19oCisKSW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9haXIvQWlyTGl2
ZW5lc3MuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvYWlyL0Fpckxp
dmVuZXNzLmgJKHJldmlzaW9uIDApCisrKyBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvYWlyL0Fp
ckxpdmVuZXNzLmgJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSwxMjIgQEAKKy8qCisgKiBDb3B5
cmlnaHQgKEMpIDIwMTUgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJl
ZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Ig
d2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhl
IGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25z
IG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5v
dGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1l
ci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0
aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25z
IGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9u
IGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgor
ICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFTIElTJycg
QU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVU
IE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFC
SUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xB
SU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBC
RSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAor
ICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5P
VCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJW
SUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRF
UlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJ
VFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJ
TkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQg
T0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQ
T1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKworI2lmbmRlZiBBaXJMaXZlbmVzc19o
CisjZGVmaW5lIEFpckxpdmVuZXNzX2gKKworI2luY2x1ZGUgIkFpckJhc2ljQmxvY2suaCIKKyNp
bmNsdWRlICJCM0luZGV4TWFwLmgiCisKK25hbWVzcGFjZSBKU0MgeyBuYW1lc3BhY2UgQjMgeyBu
YW1lc3BhY2UgQWlyIHsKKworLy8gWW91IGNhbiBjb21wdXRlIGxpdmVuZXNzIG92ZXIgVG1wJ3Mg
b3Igb3ZlciBBcmcncy4gSWYgeW91IGNvbXB1dGUgb3ZlciBBcmcncywgeW91IGdldCBib3RoCisv
LyBzdGFjayBsaXZlbmVzcyBhbmQgdG1wIGxpdmVuZXNzLgordGVtcGxhdGU8dHlwZW5hbWUgVGhp
bmc+CitjbGFzcyBMaXZlbmVzcyB7CitwdWJsaWM6CisgICAgTGl2ZW5lc3MoQ29kZSYgY29kZSkK
KyAgICB7CisgICAgICAgIG1fbGl2ZUF0SGVhZC5yZXNpemUoY29kZS5zaXplKCkpOworICAgICAg
ICBtX2xpdmVBdFRhaWwucmVzaXplKGNvZGUuc2l6ZSgpKTsKKworICAgICAgICBJbmRleFNldDxC
YXNpY0Jsb2NrPiBzZWVuOworCisgICAgICAgIGJvb2wgY2hhbmdlZCA9IHRydWU7CisgICAgICAg
IHdoaWxlIChjaGFuZ2VkKSB7CisgICAgICAgICAgICBjaGFuZ2VkID0gZmFsc2U7CisKKyAgICAg
ICAgICAgIGZvciAoc2l6ZV90IGJsb2NrSW5kZXggPSBjb2RlLnNpemUoKTsgYmxvY2tJbmRleC0t
OykgeworICAgICAgICAgICAgICAgIEJhc2ljQmxvY2sqIGJsb2NrID0gY29kZS5hdChibG9ja0lu
ZGV4KTsKKyAgICAgICAgICAgICAgICBMb2NhbENhbGMgbG9jYWxDYWxjKCp0aGlzLCBibG9jayk7
CisgICAgICAgICAgICAgICAgZm9yIChzaXplX3QgaW5zdEluZGV4ID0gYmxvY2stPnNpemUoKTsg
aW5zdEluZGV4LS07KQorICAgICAgICAgICAgICAgICAgICBsb2NhbENhbGMuZXhlY3V0ZShibG9j
ay0+YXQoaW5zdEluZGV4KSk7CisgICAgICAgICAgICAgICAgYm9vbCBmaXJzdFRpbWUgPSBzZWVu
LmFkZChibG9jayk7CisgICAgICAgICAgICAgICAgaWYgKCFmaXJzdFRpbWUgJiYgbG9jYWxDYWxj
LmxpdmUoKSA9PSBtX2xpdmVBdEhlYWRbYmxvY2tdKQorICAgICAgICAgICAgICAgICAgICBjb250
aW51ZTsKKyAgICAgICAgICAgICAgICBjaGFuZ2VkID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBt
X2xpdmVBdEhlYWRbYmxvY2tdID0gbG9jYWxDYWxjLnRha2VMaXZlKCk7CisgICAgICAgICAgICB9
CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjb25zdCBIYXNoU2V0PFRoaW5nPiYgbGl2ZUF0SGVh
ZChCYXNpY0Jsb2NrKiBibG9jaykgY29uc3QKKyAgICB7CisgICAgICAgIHJldHVybiBtX2xpdmVB
dEhlYWRbYmxvY2tdOworICAgIH0KKworICAgIGNvbnN0IEhhc2hTZXQ8VGhpbmc+JiBsaXZlQXRU
YWlsKEJhc2ljQmxvY2sqIGJsb2NrKSBjb25zdAorICAgIHsKKyAgICAgICAgcmV0dXJuIG1fbGl2
ZUF0VGFpbFtibG9ja107CisgICAgfQorCisgICAgLy8gVGhpcyBjYWxjdWxhdG9yIGhhcyB0byBi
ZSBydW4gaW4gcmV2ZXJzZS4KKyAgICBjbGFzcyBMb2NhbENhbGMgeworICAgIHB1YmxpYzoKKyAg
ICAgICAgTG9jYWxDYWxjKExpdmVuZXNzJiBsaXZlbmVzcywgQmFzaWNCbG9jayogYmxvY2spCisg
ICAgICAgICAgICA6IG1fbGl2ZShsaXZlbmVzcy0+bGl2ZUF0VGFpbChibG9jaykpCisgICAgICAg
IHsKKyAgICAgICAgfQorCisgICAgICAgIGNvbnN0IEhhc2hTZXQ8VGhpbmc+JiBsaXZlKCkgY29u
c3QgeyByZXR1cm4gbV9saXZlOyB9CisgICAgICAgIEhhc2hTZXQ8VGhpbmc+JiYgdGFrZUxpdmUo
KSB7IHJldHVybiBXVEY6Om1vdmUobV9saXZlKTsgfQorCisgICAgICAgIHZvaWQgZXhlY3V0ZShJ
bnN0JiBpbnN0KQorICAgICAgICB7CisgICAgICAgICAgICAvLyBGaXJzdCBoYW5kbGUgZGVmJ3Mu
CisgICAgICAgICAgICBpbnN0LmZvckVhY2g8VGhpbmc+KAorICAgICAgICAgICAgICAgIFt0aGlz
XSAoVGhpbmcmIGFyZywgQXJnOjpSb2xlIHJvbGUsIEFyZzo6VHlwZSkgeworICAgICAgICAgICAg
ICAgICAgICBpZiAoQXJnOjppc0RlZihyb2xlKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIG1f
bGl2ZS5yZW1vdmUoYXJnKTsKKyAgICAgICAgICAgICAgICB9KTsKKworICAgICAgICAgICAgLy8g
TmV4dCBoYW5kbGUgY2xvYmJlcmVkIHJlZ2lzdGVycy4KKyAgICAgICAgICAgIGlmIChpbnN0Lmhh
c1NwZWNpYWwoKSkgeworICAgICAgICAgICAgICAgIGluc3QuZXh0cmFDbG9iYmVyZWRSZWdzKCku
Zm9yRWFjaCgKKyAgICAgICAgICAgICAgICAgICAgW3RoaXNdIChSZWcgcmVnKSB7CisgICAgICAg
ICAgICAgICAgICAgICAgICBtX2xpdmUucmVtb3ZlKFRoaW5nKHJlZykpOworICAgICAgICAgICAg
ICAgICAgICB9KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgCisgICAgICAg
ICAgICAvLyBGaW5hbGx5IGhhbmRsZSB1c2Uncy4KKyAgICAgICAgICAgIGluc3QuZm9yRWFjaDxU
aGluZz4oCisgICAgICAgICAgICAgICAgW3RoaXNdIChUaGluZyYgYXJnLCBBcmc6OlJvbGUgcm9s
ZSwgQXJnOjpUeXBlKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChBcmc6OmlzVXNlKHJvbGUp
KQorICAgICAgICAgICAgICAgICAgICAgICAgbV9saXZlLmFkZChhcmcpOworICAgICAgICAgICAg
ICAgIH0pOworICAgICAgICB9CisKKyAgICBwcml2YXRlOgorICAgICAgICBIYXNoU2V0PFRoaW5n
PiBtX2xpdmU7CisgICAgfTsKKyAgICAKK3ByaXZhdGU6CisgICAgSW5kZXhNYXA8QmFzaWNCbG9j
aywgSGFzaFNldDxUaGluZz4+IG1fbGl2ZUF0SGVhZDsKKyAgICBJbmRleE1hcDxCYXNpY0Jsb2Nr
LCBIYXNoU2V0PFRoaW5nPj4gbV9saXZlQXRUYWlsOworfTsKKworfSB9IH0gLy8gbmFtZXNwYWNl
IEpTQzo6QjM6OkFpcgorCisjZW5kaWYgLy8gQWlyTGl2ZW5lc3NfaAorCkluZGV4OiBTb3VyY2Uv
SmF2YVNjcmlwdENvcmUvYjMvYWlyL0Fpck9wY29kZS5vcGNvZGVzCj09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNv
dXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9haXIvQWlyT3Bjb2RlLm9wY29kZXMJKHJldmlzaW9uIDAp
CisrKyBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvYWlyL0Fpck9wY29kZS5vcGNvZGVzCSh3b3Jr
aW5nIGNvcHkpCkBAIC0wLDAgKzEsMTMyIEBACisjIENvcHlyaWdodCAoQykgMjAxNSBBcHBsZSBJ
bmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisjCisjIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4g
c291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorIyBtb2RpZmljYXRpb24s
IGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyMg
YXJlIG1ldDoKKyMgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWlu
IHRoZSBhYm92ZSBjb3B5cmlnaHQKKyMgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9u
cyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorIyAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4g
YmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorIyAgICBub3Rp
Y2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIg
aW4gdGhlCisjICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRl
ZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisjCisjIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQg
QlkgQVBQTEUgSU5DLiBBTkQgSVRTIENPTlRSSUJVVE9SUyBgYEFTIElTJycKKyMgQU5EIEFOWSBF
WFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQg
VE8sCisjIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRO
RVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyMgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZF
TlQgU0hBTEwgQVBQTEUgSU5DLiBPUiBJVFMgQ09OVFJJQlVUT1JTCisjIEJFIExJQUJMRSBGT1Ig
QU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IK
KyMgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywg
UFJPQ1VSRU1FTlQgT0YKKyMgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBV
U0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTCisjIElOVEVSUlVQVElPTikgSE9XRVZF
UiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOCisjIENP
TlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBP
UiBPVEhFUldJU0UpCisjIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElT
IFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YKKyMgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0gg
REFNQUdFLgorCisjIFN5bGxhYnVzOgorIworIyBSb2xlcyBhbmQgdHlwZXM6CisjIFU6RyA9PiB1
c2Ugb2YgYSBnZW5lcmFsLXB1cnBvc2UgcmVnaXN0ZXIgb3IgdmFsdWUKKyMgRDpHID0+IGRlZiBv
ZiBhIGdlbmVyYWwtcHVycG9zZSByZWdpc3RlciBvciB2YWx1ZQorIyBVRDpHID0+IHVzZSBhbmQg
ZGVmIG9mIGEgZ2VuZXJhbC1wdXJwb3NlIHJlZ2lzdGVyIG9yIHZhbHVlCisjIFU6RiA9PiB1c2Ug
b2YgYSBmbG9hdCByZWdpc3RlciBvciB2YWx1ZQorIyBEOkYgPT4gZGVmIG9mIGEgZmxvYXQgcmVn
aXN0ZXIgb3IgdmFsdWUKKyMgVUQ6RiA9PiB1c2UgYW5kIGRlZiBvZiBhIGZsb2F0IHJlZ2lzdGVy
IG9yIHZhbHVlCisjCisjIEFyZ3VtZW50IGtpbmRzOgorIyBUbXAgPT4gdGVtcG9yYXJ5IG9yIHJl
Z2lzdGVyCisjIEltbSA9PiAzMi1iaXQgaW1tZWRpYXRlIGludAorIyBJbW02NCA9PiBUcnVzdGVk
SW1tNjQKKyMgQWRkciA9PiBhZGRyZXNzIGFzIHRlbXBvcmFyeS9yZWdpc3RlcitvZmZzZXQKKyMg
SW5kZXggPT4gQmFzZUluZGV4IGFkZHJlc3MKKyMgQWJzID0+IEFic29sdXRlQWRkcmVzcworIwor
IyBUaGUgcGFyc2VyIHZpZXdzIHRoZXNlIHRoaW5ncyBhcyBrZXl3b3JkcywgYW5kIHVuZGVyc3Rh
bmRzIHRoYXQgdGhleSBmYWxsIGludG8gdHdvIGRpc3RpbmN0IGNsYXNzZXMKKyMgb2YgdGhpbmdz
LiBTbywgYWx0aG91Z2ggdGhpcyBmaWxlIHVzZXMgYSBwYXJ0aWN1bGFyIGluZGVudGF0aW9uIHN0
eWxlLCBub25lIG9mIHRoZSB3aGl0ZXNwYWNlIG9yCisjIGV2ZW4gbmV3bGluZXMgYXJlIG1lYW5p
bmdmdWwgdG8gdGhlIHBhcnNlci4gRm9yIGV4YW1wbGUsIHlvdSBjb3VsZCB3cml0ZToKKyMKKyMg
Rm9vNDIgVTpHLCBVRDpGIEltbSwgVG1wIEFkZHIsIFRtcAorIworIyBBbmQgdGhlIHBhcnNlciB3
b3VsZCBrbm93IHRoYXQgdGhpcyBpcyB0aGUgc2FtZSBhczoKKyMKKyMgRm9vNDIgVTpHLCBVRDpG
CisjICAgICBJbW0sIFRtcAorIyAgICAgQWRkciwgVG1wCisjCisjIEkuZS4gYSB0d28tZm9ybSBp
bnN0cnVjdGlvbiB0aGF0IHVzZXMgYSBHUFIgb3IgYW4gaW50IGltbWVkaWF0ZSBhbmQgdXNlcytk
ZWZzIGEgZmxvYXQgcmVnaXN0ZXIuCisKKyMgTm90ZSB0aGF0IHRoZSBvcGNvZGVzIGhlcmUgaGF2
ZSBhIGxlYWRpbmcgY2FwaXRhbCAoQWRkMzIpIGJ1dCBtdXN0IGNvcnJlc3BvbmQgdG8gTWFjcm9B
c3NlbWJsZXIKKyMgQVBJIHRoYXQgaGFzIGEgbGVhZGluZyBsb3dlci1jYXNlIChhZGQzMikuCisK
K05vcAorCitBZGQzMiBVOkcsIFVEOkcKKyAgICBUbXAsIFRtcAorICAgIEltbSwgQWRkcgorICAg
IEltbSwgVG1wCisgICAgQWRkciwgVG1wCisgICAgVG1wLCBBZGRyCisKK0FkZDMyIFU6RywgVTpH
LCBEOkcKKyAgICBJbW0sIFRtcCwgVG1wCisKK0FuZDMyIFU6RywgVUQ6RworICAgIFRtcCwgVG1w
CisgICAgSW1tLCBUbXAKKyAgICBUbXAsIEFkZHIKKyAgICBBZGRyLCBUbXAKKyAgICBJbW0sIEFk
ZHIKKworTHNoaWZ0MzIgVTpHLCBVRDpHCisgICAgVG1wKiwgVG1wCisgICAgSW1tLCBUbXAKKwor
TXVsMzIgVTpHLCBVRDpHCisgICAgVG1wLCBUbXAKKyAgICBBZGRyLCBUbXAKKworTW92ZSBVOkcs
IEQ6RworICAgIFRtcCwgVG1wCisgICAgSW1tLCBUbXAKKyAgICBJbW02NCwgVG1wCisgICAgQWRk
ciwgVG1wIGFzIGxvYWQgIyBUaGlzIG1lYW5zIHRoYXQgIk1vdmUgQWRkciwgVG1wIiBpcyBjb2Rl
LWdlbmVyYXRlZCBhcyAibG9hZCIgbm90ICJtb3ZlIi4KKyAgICBUbXAsIEFkZHIgYXMgc3RvcmUK
KworTW92ZURvdWJsZSBVOkYsIEQ6RgorICAgIFRtcCwgVG1wCisgICAgQWRkciwgVG1wIGFzIGxv
YWREb3VibGUKKyAgICBUbXAsIEFkZHIgYXMgc3RvcmVEb3VibGUKKworTW92ZTY0VG9Eb3VibGUg
VTpHLCBEOkYKKyAgICBUbXAsIFRtcAorCitNb3ZlRG91YmxlVG82NCBVOkYsIEQ6RworICAgIFRt
cCwgVG1wCisKK0JyYW5jaEFkZDMyIFU6RywgVTpHLCBVRDpHIC9icmFuY2gKKyAgICBSZXNDb25k
LCBUbXAsIFRtcAorICAgIFJlc0NvbmQsIEltbSwgVG1wCisgICAgUmVzQ29uZCwgSW1tLCBBZGRy
CisgICAgUmVzQ29uZCwgVG1wLCBBZGRyCisgICAgUmVzQ29uZCwgQWRkciwgVG1wCisKK0JyYW5j
aE11bDMyIFU6RywgVTpHLCBVRDpHIC9icmFuY2gKKyAgICBSZXNDb25kLCBUbXAsIFRtcAorICAg
IFJlc0NvbmQsIEFkZHIsIFRtcAorCitCcmFuY2hTdWIzMiBVOkcsIFU6RywgVUQ6RyAvYnJhbmNo
CisgICAgUmVzQ29uZCwgVG1wLCBUbXAKKyAgICBSZXNDb25kLCBJbW0sIFRtcAorICAgIFJlc0Nv
bmQsIEltbSwgQWRkcgorICAgIFJlc0NvbmQsIFRtcCwgQWRkcgorICAgIFJlc0NvbmQsIEFkZHIs
IFRtcAorCitCcmFuY2hOZWczMiBVOkcsIFVEOkcgL2JyYW5jaAorICAgIFJlc0NvbmQsIFRtcAor
CitKdW1wIC9icmFuY2gKKworUmV0CisKKyMgQWlyIGFsbG93cyBmb3IgZXhvdGljIGJlaGF2aW9y
LiBBIFBhdGNoJ3MgYmVoYXZpb3IgaXMgZGV0ZXJtaW5lZCBlbnRpcmVseSBieSB0aGUgU3BlY2lh
bCBvcGVyYW5kLAorIyB3aGljaCBtdXN0IGJlIHRoZSBmaXJzdCBvcGVyYW5kLgorc3BlY2lhbCBQ
YXRjaAorCkluZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvYWlyL0FpclBoYXNlU2NvcGUu
Y3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9haXIvQWlyUGhhc2VT
Y29wZS5jcHAJKHJldmlzaW9uIDApCisrKyBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvYWlyL0Fp
clBoYXNlU2NvcGUuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsNTUgQEAKKy8qCisgKiBD
b3B5cmlnaHQgKEMpIDIwMTUgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAq
IFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGgg
b3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQg
dGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRp
b25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAg
IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xh
aW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVj
ZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRp
b25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0
aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9u
LgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFTIElT
JycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywg
QlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFO
VEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElT
Q0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IKKyAqIENPTlRSSUJVVE9S
UyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFM
LAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVU
IE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBT
RVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJ
TlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFC
SUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAq
IChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBP
VVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRI
RSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKworI2luY2x1ZGUgImNvbmZpZy5o
IgorI2luY2x1ZGUgIkFpclBoYXNlU2NvcGUuaCIKKworI2luY2x1ZGUgIkFpckNvZGUuaCIKKyNp
bmNsdWRlICJBaXJWYWxpZGF0ZS5oIgorI2luY2x1ZGUgIkIzQ29tbW9uLmgiCisKK25hbWVzcGFj
ZSBKU0MgeyBuYW1lc3BhY2UgQjMgeyBuYW1lc3BhY2UgQWlyIHsKKworUGhhc2VTY29wZTo6UGhh
c2VTY29wZShDb2RlJiBjb2RlLCBjb25zdCBjaGFyKiBuYW1lKQorICAgIDogbV9jb2RlKGNvZGUp
CisgICAgLCBtX25hbWUobmFtZSkKK3sKKyAgICBpZiAoc2hvdWxkRHVtcElSQXRFYWNoUGhhc2Uo
KSkgeworICAgICAgICBvdXQucHJpbnQoIkFpciBiZWZvcmUgIiwgbmFtZSwgIjoiKTsKKyAgICAg
ICAgb3V0LnByaW50KGNvZGUpOworICAgIH0KKworICAgIGlmIChzaG91bGRTYXZlSVJCZWZvcmVQ
aGFzZSgpKQorICAgICAgICBtX2R1bXBCZWZvcmUgPSB0b0NTdHJpbmcoY29kZSk7Cit9CisKK1Bo
YXNlU2NvcGU6On5QaGFzZVNjb3BlKCkKK3sKKyAgICBpZiAoc2hvdWxkVmFsaWRhdGVJUkF0RWFj
aFBoYXNlKCkpCisgICAgICAgIHZhbGlkYXRlKGNvZGUsIG1fbmFtZSwgbV9kdW1wQmVmb3JlLmRh
dGEoKSk7Cit9CisKK30gfSB9IC8vIG5hbWVzcGFjZSBKU0M6OkIzOjpBaXIKKwpJbmRleDogU291
cmNlL0phdmFTY3JpcHRDb3JlL2IzL2Fpci9BaXJQaGFzZVNjb3BlLmgKPT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0g
U291cmNlL0phdmFTY3JpcHRDb3JlL2IzL2Fpci9BaXJQaGFzZVNjb3BlLmgJKHJldmlzaW9uIDAp
CisrKyBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvYWlyL0FpclBoYXNlU2NvcGUuaAkod29ya2lu
ZyBjb3B5KQpAQCAtMCwwICsxLDUwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE1IEFwcGxl
IEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNl
IGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNh
dGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9u
cworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0
IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBj
b25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1
dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAor
ICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBk
aXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJp
YWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJF
IElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1Mg
T1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhF
CisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZP
UiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBT
SEFMTCBBUFBMRSBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElS
RUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09O
U0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBS
T0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBE
QVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENB
VVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRS
QUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0Ug
T1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRI
SVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBE
QU1BR0UuIAorICovCisKKyNpZm5kZWYgQWlyUGhhc2VTY29wZV9oCisjZGVmaW5lIEFpclBoYXNl
U2NvcGVfaAorCisjaW5jbHVkZSA8d3RmL05vbmNvcHlhYmxlLmg+CisKK25hbWVzcGFjZSBKU0Mg
eyBuYW1lc3BhY2UgQjMgeyBuYW1lc3BhY2UgQWlyIHsKKworY2xhc3MgQ29kZTsKKworY2xhc3Mg
UGhhc2VTY29wZSB7CisgICAgV1RGX01BS0VfTk9OQ09QWUFCTEUoUGhhc2VTY29wZSk7CitwdWJs
aWM6CisgICAgUGhhc2VTY29wZShDb2RlJiwgY29uc3QgY2hhciogbmFtZSk7CisgICAgflBoYXNl
U2NvcGUoKTsgLy8gdGhpcyBzaG91bGQgZG8gdmFsaWRhdGlvbgorCitwcml2YXRlOgorICAgIENv
ZGUmIG1fY29kZTsKKyAgICBjb25zdCBjaGFyKiBtX25hbWU7CisgICAgQ1N0cmluZyBtX2R1bXBC
ZWZvcmU7Cit9OworCit9IH0gfSAvLyBuYW1lc3BhY2UgSlNDOjpCMzo6QWlyCisKKyNlbmRpZiAv
LyBBaXJQaGFzZVNjb3BlX2gKKwpJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL2Fpci9B
aXJTcGVjaWFsLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvYWly
L0FpclNwZWNpYWwuY3BwCShyZXZpc2lvbiAwKQorKysgU291cmNlL0phdmFTY3JpcHRDb3JlL2Iz
L2Fpci9BaXJTcGVjaWFsLmNwcAkod29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDY1IEBACisvKgor
ICogQ29weXJpZ2h0IChDKSAyMDE1IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAq
CisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3
aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0
aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJp
YnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Cisg
KiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRp
c2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXBy
b2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29u
ZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1l
bnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1
dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gYGBB
UyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJ
TkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVS
Q0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJF
IERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SCisgKiBDT05UUklC
VVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BF
Q0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcs
IEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMg
T1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5F
U1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0Yg
TElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JU
CisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBX
QVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBP
RiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisKKyNpbmNsdWRlICJjb25m
aWcuaCIKKyNpbmNsdWRlICJBaXJTcGVjaWFsLmgiCisKKyNpbmNsdWRlIDx3dGYvU3RyaW5nUHJp
bnRTdHJlYW0uaD4KKworbmFtZXNwYWNlIEpTQyB7IG5hbWVzcGFjZSBCMyB7IG5hbWVzcGFjZSBB
aXIgeworCitTcGVjaWFsOjpTcGVjaWFsKGNvbnN0IGNoYXIqIG5hbWUpCisgICAgOiBtX25hbWUo
bmFtZSkKKyAgICAsIG1faW5kZXgoVUlOVF9NQVgpCit7Cit9CisKK1NwZWNpYWw6On5TcGVjaWFs
KCkKK3sKK30KKworQ1N0cmluZyBTcGVjaWFsOjpuYW1lKCkgY29uc3QKK3sKKyAgICBTdHJpbmdQ
cmludFN0cmVhbSBvdXQ7CisgICAgZHVtcEltcGwob3V0KTsKKyAgICByZXR1cm4gb3V0LnRvQ1N0
cmluZygpOworfQorCit2b2lkIFNwZWNpYWw6OmR1bXAoUHJpbnRTdHJlYW0mIG91dCkgY29uc3QK
K3sKKyAgICBvdXQucHJpbnQoZHVtcFByZWZpeCk7CisgICAgZHVtcEltcGwob3V0KTsKKyAgICBp
ZiAobV9pbmRleCAhPSBVSU5UX01BWCkKKyAgICAgICAgb3V0LnByaW50KG1faW5kZXgpOworfQor
Cit2b2lkIFNwZWNpYWw6OmRlZXBEdW1wKFByaW50U3RyZWFtJiBvdXQpIGNvbnN0Cit7CisgICAg
b3V0LnByaW50KCp0aGlzLCAiOiAiKTsKKyAgICBkZWVwRHVtcEltcGwob3V0KTsKK30KKworfSB9
IH0gLy8gbmFtZXNwYWNlIEpTQzo6QjM6OkFpcgorCkluZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENv
cmUvYjMvYWlyL0FpclNwZWNpYWwuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENv
cmUvYjMvYWlyL0FpclNwZWNpYWwuaAkocmV2aXNpb24gMCkKKysrIFNvdXJjZS9KYXZhU2NyaXB0
Q29yZS9iMy9haXIvQWlyU3BlY2lhbC5oCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsMTI0IEBA
CisvKgorICogQ29weXJpZ2h0IChDKSAyMDE1IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZl
ZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZv
cm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92
aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJl
ZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJp
Z2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93
aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVz
dCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qg
b2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAg
ZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRp
c3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElO
Qy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJ
TkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMg
T0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBP
U0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SCisgKiBD
T05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRB
TCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNM
VURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUg
R09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1Ig
QlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQor
ICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBP
UiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElO
IEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURW
SVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisKKyNpZm5kZWYg
QWlyU3BlY2lhbF9oCisjZGVmaW5lIEFpclNwZWNpYWxfaAorCisjaW5jbHVkZSAiQWlySW5zdC5o
IgorI2luY2x1ZGUgPHd0Zi9GYXN0TWFsbG9jLmg+CisjaW5jbHVkZSA8d3RmL05vbmNvcHlhYmxl
Lmg+CisjaW5jbHVkZSA8d3RmL1Njb3BlZExhbWJkYS5oPgorI2luY2x1ZGUgPHd0Zi90ZXh0L0NT
dHJpbmcuaD4KKworbmFtZXNwYWNlIEpTQyB7IG5hbWVzcGFjZSBCMyB7IG5hbWVzcGFjZSBBaXIg
eworCitjbGFzcyBHZW5lcmF0aW9uQ29udGV4dDsKKworY2xhc3MgU3BlY2lhbCB7CisgICAgV1RG
X01BS0VfTk9OQ09QWUFCTEUoU3BlY2lhbCk7CisgICAgV1RGX01BS0VfRkFTVF9BTExPQ0FURUQ7
CitwdWJsaWM6CisgICAgc3RhdGljIGNvbnN0IGNoYXIqIGR1bXBQcmVmaXggPSAiJiI7CisgICAg
CisgICAgU3BlY2lhbCgpOworICAgIHZpcnR1YWwgflNwZWNpYWwoKTsKKworICAgIENTdHJpbmcg
bmFtZSgpIGNvbnN0OworCisgICAgdmlydHVhbCB2b2lkIGZvckVhY2hBcmcoSW5zdCYsIGNvbnN0
IFNjb3BlZExhbWJkYTxJbnN0OjpFYWNoQXJnQ2FsbGJhY2s+JikgPSAwOworICAgIHZpcnR1YWwg
Ym9vbCBpc1ZhbGlkKEluc3QmKSA9IDA7CisgICAgdmlydHVhbCBib29sIGFkbWl0c1N0YWNrKElu
c3QmLCB1bnNpZ25lZCBhcmdJbmRleCkgPSAwOworCisgICAgLy8gVGhpcyBnZXRzIGNhbGxlZCBv
biBmb3IgZWFjaCBJbnN0IHRoYXQgdXNlcyB0aGlzIFNwZWNpYWwuIE5vdGUgdGhhdCB0aGVyZSBp
cyBubyB3YXkgdG8KKyAgICAvLyBndWFyYW50ZWUgdGhhdCBhIFNwZWNpYWwgZ2V0cyB1c2VkIGZy
b20ganVzdCBvbmUgSW5zdCwgYmVjYXVzZSBBaXIgbWlnaHQgdGFpbGR1cCBsYXRlLiBTbywKKyAg
ICAvLyBpZiB5b3Ugd2FudCB0byBwYXNzIHRoaXMgaW5mb3JtYXRpb24gZG93biB0byBnZW5lcmF0
ZSgpLCB0aGVuIHlvdSBoYXZlIHRvIGVpdGhlcjoKKyAgICAvLworICAgIC8vIDEpIEdlbmVyYXRl
IEFpciB0aGF0IHN0YXJ0cyB3aXRoIGEgc2VwYXJhdGUgU3BlY2lhbCBwZXIgUGF0Y2ggSW5zdCwg
YW5kIHRoZW4gbWVyZ2UKKyAgICAvLyAgICB1c2VkUmVnaXN0ZXIgc2V0cy4gVGhpcyBpcyBwcm9i
YWJseSBub3QgZ3JlYXQsIGJ1dCBpdCBvcHRpbWl6ZXMgZm9yIHRoZSBjb21tb24gY2FzZSB0aGF0
CisgICAgLy8gICAgQWlyIGRpZG4ndCBkdXBsaWNhdGUgY29kZSBvciB0aGF0IHN1Y2ggZHVwbGlj
YXRpb24gZGlkbid0IGNhdXNlIGFueSBpbnRlcmVzdGluZyBjaGFuZ2VzIHRvCisgICAgLy8gICAg
cmVnaXN0ZXIgYXNzaWdubWVudC4KKyAgICAvLworICAgIC8vIDIpIEhhdmUgdGhlIFNwZWNpYWwg
bWFpbnRhaW4gYSBIYXNoTWFwPEluc3QqLCBSZWdpc3RlclNldD4uIFRoaXMgd29ya3MgYmVjYXVz
ZSB0aGUgYW5hbHlzaXMKKyAgICAvLyAgICB0aGF0IGZlZWRzIGludG8gdGhpcyBjYWxsIGlzIHBl
cmZvcm1lZCBqdXN0IGJlZm9yZSBjb2RlIGdlbmVyYXRpb24gYW5kIHRoZXJlIGlzIG5vIHdheQor
ICAgIC8vICAgIGZvciB0aGUgVmVjdG9yPD4ncyB0aGF0IGNvbnRhaW4gdGhlIEluc3RzIHRvIGJl
IHJlYWxsb2NhdGVkLiBUaGlzIGFsbG93cyBnZW5lcmF0ZSgpIHRvCisgICAgLy8gICAgY29uc3Vs
dCB0aGUgSGFzaE1hcC4KKyAgICAvLworICAgIC8vIDMpIEh5YnJpZDogeW91IGNvdWxkIHVzZSAo
MSkgYW5kIGZpcmUgdXAgYSBIYXNoTWFwIGlmIHlvdSBzZWUgbXVsdGlwbGUgY2FsbHMuCisgICAg
Ly8KKyAgICAvLyBOb3RlIHRoYXQgaXQncyBub3QgcG9zc2libGUgdG8gcmVseSBvbiByZXBvcnRV
c2VkUmVnaXN0ZXJzKCkgYmVpbmcgY2FsbGVkIGluIHRoZSBzYW1lIG9yZGVyCisgICAgLy8gYXMg
Z2VuZXJhdGUoKS4gSWYgd2UgY291bGQgcmVseSBvbiB0aGF0LCB0aGVuIHdlIGNvdWxkIGp1c3Qg
aGF2ZSBlYWNoIFNwZWNpYWwgaW5zdGFuY2UKKyAgICAvLyBtYWludGFpbiBhIFZlY3RvciBvZiBS
ZWdpc3RlclNldCdzIGFuZCB0aGVuIHByb2Nlc3MgdGhhdCB2ZWN0b3IgaW4gdGhlIHJpZ2h0IG9y
ZGVyIGluCisgICAgLy8gZ2VuZXJhdGUoKS4gQnV0LCB0aGUgb3JkZXJpbmcgZGlmZmVyZW5jZSBp
cyB1bmxpa2VseSB0byBjaGFuZ2Ugc2luY2UgaXQgd291bGQgaGFybSB0aGUKKyAgICAvLyBwZXJm
b3JtYW5jZSBvZiB0aGUgbGl2ZW5lc3MgYW5hbHlzaXMuCisgICAgLy8KKyAgICAvLyBDdXJyZW50
bHksIHdlIGRvICgxKSBmb3IgQjMgc3RhY2ttYXBzLgorICAgIHZpcnR1YWwgdm9pZCByZXBvcnRV
c2VkUmVnaXN0ZXJzKEluc3QmLCBjb25zdCBSZWdpc3RlclNldCYpID0gMDsKKyAgICAKKyAgICB2
aXJ0dWFsIENDYWxsSGVscGVyczo6SnVtcCBnZW5lcmF0ZShJbnN0JiwgQ0NhbGxIZWxwZXJzJiwg
R2VuZXJhdGlvbkNvbnRleHQmKSA9IDA7CisKKyAgICB2aXJ0dWFsIGNvbnN0IFJlZ2lzdGVyU2V0
JiBleHRyYUNsb2JiZXJlZFJlZ3MoSW5zdCYpID0gMDsKKworICAgIHZvaWQgZHVtcChQcmludFN0
cmVhbSYpIGNvbnN0OworICAgIHZvaWQgZGVlcER1bXAoUHJpbnRTdHJlYW0mKSBjb25zdDsKKwor
cHJvdGVjdGVkOgorICAgIHZpcnR1YWwgdm9pZCBkdW1wSW1wbChQcmludFN0cmVhbSYpIGNvbnN0
ID0gMDsKKyAgICB2aXJ0dWFsIHZvaWQgZGVlcER1bXBJbXBsKFByaW50U3RyZWFtJikgY29uc3Qg
PSAwOworCitwcml2YXRlOgorICAgIGZyaWVuZCBjbGFzcyBDb2RlOworCisgICAgY29uc3QgY2hh
ciogbV9uYW1lOworICAgIHVuc2lnbmVkIG1faW5kZXg7Cit9OworCitjbGFzcyBEZWVwU3BlY2lh
bER1bXAgeworcHVibGljOgorICAgIERlZXBTcGVjaWFsRGltcChTcGVjaWFsKiBzcGVjaWFsKQor
ICAgICAgICA6IG1fc3BlY2lhbChzcGVjaWFsKQorICAgIHsKKyAgICB9CisKKyAgICB2b2lkIGR1
bXAoUHJpbnRTdHJlYW0mIG91dCkgY29uc3QKKyAgICB7CisgICAgICAgIGlmIChtX3NwZWNpYWwp
CisgICAgICAgICAgICBtX3NwZWNpYWwtPmRlZXBEdW1wKG91dCk7CisgICAgICAgIGVsc2UKKyAg
ICAgICAgICAgIG91dC5wcmludCgiPG51bGw+Iik7CisgICAgfQorCitwcml2YXRlOgorICAgIFNw
ZWNpYWwqIG1fc3BlY2lhbDsKK307CisKK0RlZXBTcGVjaWFsRHVtcCBkZWVwRHVtcChTcGVjaWFs
KiBzcGVjaWFsKQoreworICAgIHJldHVybiBEZWVwU3BlY2lhbER1bXAoc3BlY2lhbCk7Cit9CisK
K30gfSB9IC8vIG5hbWVzcGFjZSBKU0M6OkIzOjpBaXIKKworI2VuZGlmIC8vIEFpclNwZWNpYWxf
aAorCkluZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvYWlyL0FpclNwaWxsRXZlcnl0aGlu
Zy5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL2Fpci9BaXJTcGls
bEV2ZXJ5dGhpbmcuY3BwCShyZXZpc2lvbiAwKQorKysgU291cmNlL0phdmFTY3JpcHRDb3JlL2Iz
L2Fpci9BaXJTcGlsbEV2ZXJ5dGhpbmcuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsNDkg
QEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTUgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2Vy
dmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkg
Zm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHBy
b3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4g
UmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5
cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xs
b3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBt
dXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlz
dCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAg
ICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUg
ZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUg
SU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMs
IElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElF
UyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVS
UE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IKKyAq
IENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVO
VEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElO
Q0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVU
RSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBP
UiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZ
CisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFks
IE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcg
SU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBB
RFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKworI2luY2x1
ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgIkFpclNwaWxsRXZlcnl0aGluZy5oIgorCisjaW5jbHVk
ZSAiQWlyQ29kZS5oIgorI2luY2x1ZGUgIkFpckluc2VydGlvblNldC5oIgorI2luY2x1ZGUgIkFp
clBoYXNlU2NvcGUuaCIKKworbmFtZXNwYWNlIEpTQyB7IG5hbWVzcGFjZSBCMyB7IG5hbWVzcGFj
ZSBBaXIgeworCit2b2lkIHNwaWxsRXZlcnl0aGluZyhDb2RlJiBjb2RlKQoreworICAgIFBoYXNl
U2NvcGUgcGhhc2VTY29wZShjb2RlLCAic3BpbGxFdmVyeXRoaW5nIik7CisKKyAgICBJbnNlcnRp
b25TZXQgaW5zZXJ0aW9uU2V0KGNvZGUpOworICAgIGZvciAoQmFzaWNCbG9jayogYmxvY2sgOiBj
b2RlKSB7CisgICAgICAgIGZvciAodW5zaWduZWQgaW5zdEluZGV4ID0gMDsgaW5zdEluZGV4IDwg
YmxvY2stPnNpemUoKTsgKytpbnN0SW5kZXgpIHsKKyAgICAgICAgICAgIAorICAgICAgICB9Cisg
ICAgICAgIGluc2VydGlvblNldC5leGVjdXRlKGJsb2NrKTsKKyAgICB9Cit9CisKK30gfSB9IC8v
IG5hbWVzcGFjZSBKU0M6OkIzOjpBaXIKKwpJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL2Iz
L2Fpci9BaXJTcGlsbEV2ZXJ5dGhpbmcuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlw
dENvcmUvYjMvYWlyL0FpclNwaWxsRXZlcnl0aGluZy5oCShyZXZpc2lvbiAwKQorKysgU291cmNl
L0phdmFTY3JpcHRDb3JlL2IzL2Fpci9BaXJTcGlsbEV2ZXJ5dGhpbmcuaAkod29ya2luZyBjb3B5
KQpAQCAtMCwwICsxLDQ5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE1IEFwcGxlIEluYy4g
QWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNv
dXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwg
YXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICog
YXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFp
biB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRp
b25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMg
aW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAg
bm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFp
bWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHBy
b3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBS
T1ZJREVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1Q
TElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJ
TVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBB
UlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBB
UFBMRSBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJ
TkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVO
VElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVN
RU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBP
UgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBB
TkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBT
VFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RI
RVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09G
VFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0Uu
IAorICovCisKKyNpZm5kZWYgQWlyU3BpbGxFdmVyeXRoaW5nX2gKKyNkZWZpbmUgQWlyU3BpbGxF
dmVyeXRoaW5nX2gKKworbmFtZXNwYWNlIEpTQyB7IG5hbWVzcGFjZSBCMyB7IG5hbWVzcGFjZSBB
aXIgeworCitjbGFzcyBDb2RlOworCisvLyBUaGlzIGlzIGEgcGhhc2UgZm9yIHRlc3RpbmcuIEl0
IGJlaGF2ZXMgbGlrZSBhIHJlZ2lzdGVyIGFsbG9jYXRvciBpbiB0aGUgc2Vuc2UgdGhhdCBpdAor
Ly8gZWxpbWluYXRlcyB0ZW1wb3JhcmllcyBmcm9tIHRoZSBwcm9ncmFtLiBJdCBhY2NvbXBsaXNo
ZXMgdGhpcyBieSBhbHdheXMgc3BpbGxpbmcgYWxsCisvLyB0ZW1wb3Jhcmllcy4gVGhlIHJlc3Vs
dGluZyBjb2RlIGlzIGdvaW5nIHRvIGJlIHZlcnkgaW5lZmZpY2llbnQuIFRoaXMgcGhhc2UgaXMg
Z3JlYXQgaWYgeW91CisvLyB0aGluayB0aGF0IHRoZXJlIGlzIGEgYnVnIGluIHRoZSByZWdpc3Rl
ciBhbGxvY2F0b3IuIFlvdSBjYW4gY29uZmlybSB0aGlzIGJ5IHJ1bm5pbmcgdGhpcworLy8gcGhh
c2UgaW5zdGVhZCBvZiB0aGUgcmVnaXN0ZXIgYWxsb2NhdG9yLgorLy8KKy8vIE5vdGUgdGhhdCBl
dmVuIHRob3VnaCB0aGlzIHBoYXNlIGRvZXMgdGhlIGNoZWFwZXN0IHRoaW5nIHBvc3NpYmxlLCBp
dCdzIG5vdCBldmVuIHdyaXR0ZW4gaW4gYQorLy8gcGFydGljdWxhcmx5IGVmZmljaWVudCB3YXku
IFNvLCBkb24ndCBnZXQgYW55IGlkZWFzIGFib3V0IHVzaW5nIHRoaXMgcGhhc2UgdG8gcmVkdWNl
IGNvbXBpbGVyCisvLyBsYXRlbmN5LiBJZiB5b3Ugd2FudGVkIHRvIGRvIHRoYXQsIHlvdSBzaG91
bGQgY29tZSB1cCB3aXRoIGEgY2xldmVyIGFsZ29yaXRobSBpbnN0ZWFkIG9mIHVzaW5nCisvLyB0
aGlzIHNpbGx5IHRoaW5nLgorCit2b2lkIHNwaWxsRXZlcnl0aGluZyhDb2RlJik7CisKK30gfSB9
IC8vIG5hbWVzcGFjZSBKU0M6OkIzOjpBaXIKKworI2VuZGlmIC8vIEFpclNwaWxsRXZlcnl0aGlu
Z19oCisKSW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9haXIvQWlyU3RhY2tTbG90LmgK
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL2Fpci9BaXJTdGFja1Nsb3Qu
aAkocmV2aXNpb24gMCkKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9haXIvQWlyU3RhY2tT
bG90LmgJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSw5MiBAQAorLyoKKyAqIENvcHlyaWdodCAo
QykgMjAxNSBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmli
dXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0
CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93
aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291
cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0
aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICog
Mi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92
ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRo
ZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29y
IG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICog
VEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5Z
CisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJ
TUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBB
TkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAg
SU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJM
RSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVN
UExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlU
RUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBM
T1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElP
TikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hF
VEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElO
RyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUg
VVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklM
SVRZIE9GIFNVQ0ggREFNQUdFLiAKKyAqLworCisjaWZuZGVmIEFpclN0YWNrU2xvdF9oCisjZGVm
aW5lIEFpclN0YWNrU2xvdF9oCisKKyNpbmNsdWRlIDx3dGYvTm9uQ29weWFibGUuaD4KKyNpbmNs
dWRlIDx3dGYvRmFzdE1hbGxvYy5oPgorCituYW1lc3BhY2UgSlNDIHsgbmFtZXNwYWNlIEIzIHsK
KworY2xhc3MgU3RhY2tTbG90dmFsdWU7CisKK25hbWVzcGFjZSBBaXIgeworCitjbGFzcyBTdGFj
a1Nsb3QgeworICAgIFdURl9NQUtFX05PTkNPUFlBQkxFKFN0YWNrU2xvdCk7CisgICAgV1RGX01B
S0VfRkFTVF9BTExPQ0FURUQ7CitwdWJsaWM6CisgICAgdW5zaWduZWQgYnl0ZVNpemUoKSBjb25z
dCB7IHJldHVybiBtX2J5dGVTaXplOyB9CisgICAgdW5zaWduZWQgaW5kZXgoKSBjb25zdCB7IHJl
dHVybiBtX2luZGV4OyB9CisKKyAgICBTdGFja1Nsb3RWYWx1ZSogdmFsdWUoKSBjb25zdCB7IHJl
dHVybiBtX3ZhbHVlOyB9CisKKyAgICB2b2lkIGR1bXAoUHJpbnRTdHJlYW0mKSBjb25zdDsKKyAg
ICB2b2lkIGRlZXBEdW1wKFByaW50U3RyZWFtJikgY29uc3Q7CisKK3ByaXZhdGU6CisgICAgZnJp
ZW5kIGNsYXNzIENvZGU7CisKKyAgICBTdGFja1Nsb3QodW5zaWduZWQgYnl0ZVNpemUsIHVuc2ln
bmVkIGluZGV4LCBTdGFja1Nsb3RWYWx1ZSogdmFsdWUpCisgICAgICAgIDogbV9ieXRlU2l6ZShi
eXRlU2l6ZSkKKyAgICAgICAgLCBtX2luZGV4KGluZGV4KQorICAgICAgICAsIG1fdmFsdWUodmFs
dWUpCisgICAgeworICAgIH0KKyAgICAKKyAgICB1bnNpZ25lZCBtX2J5dGVTaXplOworICAgIHVu
c2lnbmVkIG1faW5kZXg7CisgICAgU3RhY2tTbG90VmFsdWUqIG1fdmFsdWU7Cit9OworCitjbGFz
cyBEZWVwU3RhY2tTbG90RHVtcCB7CitwdWJsaWM6CisgICAgRGVlcFN0YWNrU2xvdER1bXAoU3Rh
Y2tTbG90KiBzbG90KQorICAgICAgICA6IG1fc2xvdChzbG90KQorICAgIHsKKyAgICB9CisKKyAg
ICB2b2lkIGR1bXAoUHJpbnRTdHJlYW0mIG91dCkgY29uc3QKKyAgICB7CisgICAgICAgIGlmICht
X3Nsb3QpCisgICAgICAgICAgICBtX3Nsb3QtPmRlZXBEdW1wKG91dCk7CisgICAgICAgIGVsc2UK
KyAgICAgICAgICAgIG91dC5wcmludCgiPG51bGw+Iik7CisgICAgfQorCitwcml2YXRlOgorICAg
IFN0YWNrU2xvdCogbV9zbG90OworfTsKKworRGVlcFN0YWNrU2xvdER1bXAgZGVlcER1bXAoU3Rh
Y2tTbG90KiBzbG90KQoreworICAgIHJldHVybiBEZWVwU3RhY2tTbG90RHVtcChzbG90KTsKK30K
KworfSB9IH0gLy8gbmFtZXNwYWNlIEpTQzo6QjM6OkFpcgorCisjZW5kaWYgLy8gQWlyU3RhY2tT
bG90X2gKKwpJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL2Fpci9BaXJUbXAuY3BwCj09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9haXIvQWlyVG1wLmNwcAkocmV2
aXNpb24gMCkKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9haXIvQWlyVG1wLmNwcAkod29y
a2luZyBjb3B5KQpAQCAtMCwwICsxLDUyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE1IEFw
cGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQg
dXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlm
aWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0
aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBt
dXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBv
ZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3Ry
aWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdo
dAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2lu
ZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0
ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRX
QVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJF
U1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywg
VEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNT
IEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVO
VCBTSEFMTCBBUFBMRSBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkg
RElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1Ig
Q09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAq
IFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNF
LCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVS
IENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENP
TlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VO
Q0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9G
IFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VD
SCBEQU1BR0UuIAorICovCisKKyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJBaXJUbXAu
aCIKKworbmFtZXNwYWNlIEpTQyB7IG5hbWVzcGFjZSBCMyB7IG5hbWVzcGFjZSBBaXIgeworCit2
b2lkIFRtcDo6ZHVtcChQcmludFN0cmVhbSYgb3V0KSBjb25zdAoreworICAgIGlmICghKnRoaXMp
IHsKKyAgICAgICAgb3V0LnByaW50KCI8bm9uZT4iKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0K
KworICAgIGlmIChpc1JlZygpKSB7CisgICAgICAgIG91dC5wcmludChyZWcoKSk7CisgICAgICAg
IHJldHVybjsKKyAgICB9CisKKyAgICBpZiAoaXNHUFRtcCgpKSB7CisgICAgICAgIG91dC5wcmlu
dCgiJXRtcCIsIGdwVG1wSW5kZXgoKSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBv
dXQucHJpbnQoIiVmdG1wIiwgZnBUbXBJbmRleCgpKTsKK30KKworfSB9IH0gLy8gbmFtZXNwYWNl
IEpTQzo6QjM6OkFpcgorCkluZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvYWlyL0FpclRt
cC5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9haXIvQWlyVG1wLmgJ
KHJldmlzaW9uIDApCisrKyBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvYWlyL0FpclRtcC5oCSh3
b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsMjU1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE1
IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBh
bmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1v
ZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29u
ZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29k
ZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlz
dCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRp
c3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHly
aWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxv
d2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIg
bWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNP
RlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVY
UFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBU
TywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRO
RVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBF
VkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBB
TlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwg
T1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywK
KyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0Yg
VVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dF
VkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElO
IENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJ
R0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAq
IE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0Yg
U1VDSCBEQU1BR0UuIAorICovCisKKyNpZm5kZWYgQWlyVG1wX2gKKyNkZWZpbmUgQWlyVG1wX2gK
KworI2luY2x1ZGUgIlJlZy5oIgorCituYW1lc3BhY2UgSlNDIHsgbmFtZXNwYWNlIEIzIHsgbmFt
ZXNwYWNlIEFpciB7CisKKy8vIEEgVG1wIGlzIGEgZ2VuZXJhbGl6YXRpb24gb2YgYSByZWdpc3Rl
ci4gSXQgY2FuIGJlIHVzZWQgdG8gcmVmZXIgdG8gYW55IEdQUiBvciBGUFIuIEl0IGNhbiBhbHNv
CisvLyBiZSB1c2VkIHRvIHJlZmVyIHRvIGFuIHVuYWxsb2NhdGVkIHJlZ2lzdGVyIChpLmUuIGEg
dGVtcG9yYXJ5KS4gTGlrZSBtYW55IEFpciBjbGFzc2VzLCB3ZSB1c2UKKy8vIGRlbGliZXJhdGVs
eSB0ZXJzZSBuYW1pbmcgc2luY2Ugd2Ugd2lsbCBoYXZlIHRvIHVzZSB0aGlzIG5hbWUgYSBsb3Qu
CisKK2NsYXNzIFRtcCB7CitwdWJsaWM6CisgICAgVG1wKCkKKyAgICAgICAgOiBtX3ZhbHVlKDAp
CisgICAgeworICAgIH0KKworICAgIGV4cGxpY2l0IFRtcChSZWcgcmVnKQorICAgIHsKKyAgICAg
ICAgaWYgKHJlZykgeworICAgICAgICAgICAgaWYgKHJlZy5pc0dQUigpKQorICAgICAgICAgICAg
ICAgIG1fdmFsdWUgPSBlbmNvZGVHUFIocmVnLmdwcigpKTsKKyAgICAgICAgICAgIGVsc2UKKyAg
ICAgICAgICAgICAgICBtX3ZhbHVlID0gZW5jb2RlRlBSKHJlZy5mcHIoKSk7CisgICAgICAgIH0g
ZWxzZQorICAgICAgICAgICAgbV92YWx1ZSA9IDA7CisgICAgfQorCisgICAgZXhwbGljaXQgVG1w
KGNvbnN0IEFyZyYpOworCisgICAgc3RhdGljIFRtcCBncFRtcEZvckluZGV4KHVuc2lnbmVkIGlu
ZGV4KQorICAgIHsKKyAgICAgICAgVG1wIHJlc3VsdDsKKyAgICAgICAgcmVzdWx0Lm1fdmFsdWUg
PSBlbmNvZGVHUFRtcChpbmRleCk7CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorCisg
ICAgc3RhdGljIFRtcCBmcFRtcEZvckluZGV4KHVuc2lnbmVkIGluZGV4KQorICAgIHsKKyAgICAg
ICAgVG1wIHJlc3VsdDsKKyAgICAgICAgcmVzdWx0Lm1fdmFsdWUgPSBlbmNvZGVGUFRtcChpbmRl
eCk7CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorCisgICAgc3RhdGljIFRtcCBmb3JS
YXdWYWx1ZSh1bnNpZ25lZCBpbmRleCkKKyAgICB7CisgICAgICAgIFRtcCByZXN1bHQ7CisgICAg
ICAgIHJlc3VsdC5tX3ZhbHVlID0gaW5kZXg7CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAg
fQorCisgICAgZXhwbGljaXQgb3BlcmF0b3IgYm9vbCgpIGNvbnN0IHsgcmV0dXJuICEhbV92YWx1
ZTsgfQorCisgICAgYm9vbCByYXdWYWx1ZSgpIGNvbnN0IHsgcmV0dXJuIG1fdmFsdWU7IH0KKwor
ICAgIGJvb2wgaXNHUCgpIGNvbnN0CisgICAgeworICAgICAgICByZXR1cm4gaXNFbmNvZGVkR1Ao
bV92YWx1ZSk7CisgICAgfQorCisgICAgYm9vbCBpc0ZQKCkgY29uc3QKKyAgICB7CisgICAgICAg
IHJldHVybiBpc0VuY29kZWRGUChtX3ZhbHVlKTsKKyAgICB9CisKKyAgICBib29sIGlzR1BSKCkg
Y29uc3QKKyAgICB7CisgICAgICAgIHJldHVybiBpc0VuY29kZWRHUFIobV92YWx1ZSk7CisgICAg
fQorCisgICAgYm9vbCBpc0ZQUigpIGNvbnN0CisgICAgeworICAgICAgICByZXR1cm4gaXNFbmNv
ZGVkRlBSKG1fdmFsdWUpOworICAgIH0KKworICAgIGJvb2wgaXNSZWcoKSBjb25zdAorICAgIHsK
KyAgICAgICAgcmV0dXJuIGlzR1BSKCkgfHwgaXNGUFIoKTsKKyAgICB9CisKKyAgICBHUFJSZWcg
Z3ByKCkgY29uc3QKKyAgICB7CisgICAgICAgIHJldHVybiBkZWNvZGVHUFIobV92YWx1ZSk7Cisg
ICAgfQorCisgICAgRlBSUmVnIGZwcigpIGNvbnN0CisgICAgeworICAgICAgICByZXR1cm4gZGVj
b2RlRlBSKG1fdmFsdWUpOworICAgIH0KKworICAgIFJlZyByZWcoKSBjb25zdAorICAgIHsKKyAg
ICAgICAgaWYgKGlzR1AoKSkKKyAgICAgICAgICAgIHJldHVybiBncHIoKTsKKyAgICAgICAgcmV0
dXJuIGZwcigpOworICAgIH0KKworICAgIHVuc2lnbmVkIGdwVG1wSW5kZXgoKSBjb25zdAorICAg
IHsKKyAgICAgICAgcmV0dXJuIGRlY29kZUdQVG1wKG1fdmFsdWUpOworICAgIH0KKworICAgIHVu
c2lnbmVkIGZwVG1wSW5kZXgoKSBjb25zdAorICAgIHsKKyAgICAgICAgcmV0dXJuIGRlY29kZUZQ
VG1wKG1fdmFsdWUpOworICAgIH0KKworICAgIHVuc2lnbmVkIHRtcEluZGV4KCkgY29uc3QKKyAg
ICB7CisgICAgICAgIGlmIChpc0dQKCkpCisgICAgICAgICAgICByZXR1cm4gZ3BUbXBJbmRleCgp
OworICAgICAgICByZXR1cm4gZnBUbXBJbmRleCgpOworICAgIH0KKworICAgIGJvb2wgaXNBbGl2
ZSgpIGNvbnN0CisgICAgeworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBib29s
IG9wZXJhdG9yPT0oY29uc3QgVG1wJiBvdGhlcikgY29uc3QKKyAgICB7CisgICAgICAgIHJldHVy
biBtX3ZhbHVlID09IG90aGVyLm1fdmFsdWU7CisgICAgfQorCisgICAgYm9vbCBvcGVyYXRvciE9
KGNvbnN0IFRtcCYgb3RoZXIpIGNvbnN0CisgICAgeworICAgICAgICByZXR1cm4gISgqdGhpcyA9
PSBvdGhlcik7CisgICAgfQorCisgICAgdm9pZCBkdW1wKFByaW50U3RyZWFtJiBvdXQpIGNvbnN0
OworICAgIAorcHJpdmF0ZToKKyAgICBzdGF0aWMgaW50IGVuY29kZUdQKHVuc2lnbmVkIGluZGV4
KQorICAgIHsKKyAgICAgICAgcmV0dXJuIDEgKyBpbmRleDsKKyAgICB9CisKKyAgICBzdGF0aWMg
aW50IGVuY29kZUZQKHVuc2lnbmVkIGluZGV4KQorICAgIHsKKyAgICAgICAgcmV0dXJuIC0xIC0g
aW5kZXg7CisgICAgfQorCisgICAgc3RhdGljIGludCBlbmNvZGVHUFIoR1BSUmVnIGdwcikKKyAg
ICB7CisgICAgICAgIHJldHVybiBlbmNvZGVHUChncHIgLSBNYWNyb0Fzc2VtYmxlcjo6Zmlyc3RS
ZWdpc3RlcigpKTsKKyAgICB9CisKKyAgICBzdGF0aWMgaW50IGVuY29kZUZQUihGUFJSZWcgZnBy
KQorICAgIHsKKyAgICAgICAgcmV0dXJuIGVuY29kZUZQKGZwciAtIE1hY3JvQXNzZW1ibGVyOjpm
aXJzdEZQUlJlZ2lzdGVyKCkpOworICAgIH0KKworICAgIHN0YXRpYyBpbnQgZW5jb2RlR1BUbXAo
dW5zaWduZWQgaW5kZXgpCisgICAgeworICAgICAgICByZXR1cm4gZW5jb2RlR1BSKE1hY3JvQXNz
ZW1ibGVyOjpsYXN0UmVnaXN0ZXIoKSkgKyAxICsgaW5kZXg7CisgICAgfQorCisgICAgc3RhdGlj
IGludCBlbmNvZGVGUFRtcCh1bnNpZ25lZCBpbmRleCkKKyAgICB7CisgICAgICAgIHJldHVybiBl
bmNvZGVGUFIoTWFjcm9Bc3NlbWJsZXI6Omxhc3RGUFJlZ2lzdGVyKCkpIC0gMSAtIGluZGV4Owor
ICAgIH0KKworICAgIHN0YXRpYyBib29sIGlzRW5jb2RlZEdQKGludCB2YWx1ZSkKKyAgICB7Cisg
ICAgICAgIHJldHVybiB2YWx1ZSA+IDA7CisgICAgfQorCisgICAgc3RhdGljIGJvb2wgaXNFbmNv
ZGVkRlAoaW50IHZhbHVlKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHZhbHVlIDwgMDsKKyAgICB9
CisKKyAgICBzdGF0aWMgYm9vbCBpc0VuY29kZWRHUFIoaW50IHZhbHVlKQorICAgIHsKKyAgICAg
ICAgcmV0dXJuIGlzRW5jb2RlZEdQKHZhbHVlKSAmJiB2YWx1ZSA8PSBlbmNvZGVHUFIoTWFjcm9B
c3NlbWJsZXI6Omxhc3RSZWdpc3RlcigpKTsKKyAgICB9CisKKyAgICBzdGF0aWMgYm9vbCBpc0Vu
Y29kZWRGUFIoaW50IHZhbHVlKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGlzRW5jb2RlZEZQKHZh
bHVlKSAmJiB2YWx1ZSA+PSBlbmNvZGVkRlBSKE1hY3JvQXNzZW1ibGVyOjpsYXN0RlBSZWdpc3Rl
cigpKTsKKyAgICB9CisKKyAgICBzdGF0aWMgYm9vbCBpc0VuY29kZWRHUFRtcChpbnQgdmFsdWUp
CisgICAgeworICAgICAgICByZXR1cm4gaXNFbmNvZGVkR1AodmFsdWUpICYmICFpc0VuY29kZWRH
UFIodmFsdWUpOworICAgIH0KKworICAgIHN0YXRpYyBib29sIGlzRW5jb2RlZEZQVG1wKGludCB2
YWx1ZSkKKyAgICB7CisgICAgICAgIHJldHVybiBpc0VuY29kZWRGUCh2YWx1ZSkgJiYgIWlzRW5j
b2RlZEZQUih2YWx1ZSk7CisgICAgfQorCisgICAgc3RhdGljIEdQUlJlZyBkZWNvZGVHUFIoaW50
IHZhbHVlKQorICAgIHsKKyAgICAgICAgQVNTRVJUKGlzRW5jb2RlZEdQUih2YWx1ZSkpOworICAg
ICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8R1BSUmVnPigKKyAgICAgICAgICAgICh2YWx1ZSAtIGVu
Y29kZUdQUihNYWNyb0Fzc2VtYmxlcjo6Zmlyc3RSZWdpc3RlcigpKSkgKyBNYWNyb0Fzc2VtYmxl
cjo6Zmlyc3RSZWdpc3RlcigpKTsKKyAgICB9CisKKyAgICBzdGF0aWMgRlBSUmVnIGRlY29kZUZQ
UihpbnQgdmFsdWUpCisgICAgeworICAgICAgICBBU1NFUlQoaXNFbmNvZGVkRlBSKHZhbHVlKSk7
CisgICAgICAgIHJldHVybiBzdGF0aWNfY2FzdDxGUFJSZWc+KAorICAgICAgICAgICAgKGVuY29k
ZUZQUihNYWNyb0Fzc2VtYmxlcjo6Zmlyc3RGUFJlZ2lzdGVyKCkpIC0gdmFsdWUpICsKKyAgICAg
ICAgICAgIE1hY3JvQXNzZW1ibGVyOjpmaXJzdEZQUmVnaXN0ZXIoKSk7CisgICAgfQorCisgICAg
c3RhdGljIHVuc2lnbmVkIGRlY29kZUdQVG1wKGludCB2YWx1ZSkKKyAgICB7CisgICAgICAgIEFT
U0VSVChpc0VuY29kZWRHUFRtcCh2YWx1ZSkpOworICAgICAgICByZXR1cm4gdmFsdWUgLSAoZW5j
b2RlR1BSKE1hY3JvQXNzZW1ibGVyOjpsYXN0UmVnaXN0ZXIoKSkgKyAxKTsKKyAgICB9CisKKyAg
ICBzdGF0aWMgdW5zaWduZWQgZGVjb2RlRlBUbXAoaW50IHZhbHVlKQorICAgIHsKKyAgICAgICAg
QVNTRVJUKGlzRW5jb2RlZEZQVG1wKHZhbHVlKSk7CisgICAgICAgIHJldHVybiAoZW5jb2RlRlBS
KE1hY3JvQXNzZW1ibGVyOjpsYXN0RlBSZWdpc3RlcigpKSAtIDEpIC0gdmFsdWU7CisgICAgfQor
CisgICAgLy8gMDogZW1wdHkgVG1wCisgICAgLy8gcG9zaXRpdmU6IEdQUnMgYW5kIHRoZW4gR1Ag
dGVtcHMuCisgICAgLy8gbmVnYXRpdmU6IEZQUnMgYW5kIHRoZW4gRlAgdGVtcHMuCisgICAgaW50
IG1fdmFsdWU7Cit9OworCit9IH0gfSAvLyBuYW1lc3BhY2UgSlNDOjpCMzo6QWlyCisKKyNlbmRp
ZiAvLyBBaXJUbXBfaAorCkluZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvYWlyL0FpclRt
cElubGluZXMuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvYWlyL0Fp
clRtcElubGluZXMuaAkocmV2aXNpb24gMCkKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9h
aXIvQWlyVG1wSW5saW5lcy5oCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsNDIgQEAKKy8qCisg
KiBDb3B5cmlnaHQgKEMpIDIwMTUgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoK
KyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdp
dGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRo
YXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmli
dXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAq
ICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlz
Y2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJv
ZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25k
aXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVu
dGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0
aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFT
IElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElO
RywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJD
SEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUg
RElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IKKyAqIENPTlRSSUJV
VE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVD
SUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywg
QlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBP
UiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVT
UyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBM
SUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQK
KyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdB
WSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9G
IFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKworI2lmbmRlZiBBaXJUbXBJ
bmxpbmVzX2gKKyNkZWZpbmUgQWlyVG1wSW5saW5lc19oCisKKyNpbmNsdWRlICJBaXJBcmcuaCIK
KyNpbmNsdWRlICJBaXJUbXAuaCIKKworbmFtZXNwYWNlIEpTQyB7IG5hbWVzcGFjZSBCMyB7IG5h
bWVzcGFjZSBBaXIgeworCitpbmxpbmUgVG1wOjpUbXAoY29uc3QgQXJnJiBhcmcpCit7CisgICAg
KnRoaXMgPSBhcmcudG1wKCk7Cit9CisKK30gfSB9IC8vIG5hbWVzcGFjZSBKU0M6OkIzOjpBaXIK
KworI2VuZGlmIC8vIEFpclRtcElubGluZXNfaAorCkluZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENv
cmUvYjMvYWlyL0FpclZhbGlkYXRlLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlw
dENvcmUvYjMvYWlyL0FpclZhbGlkYXRlLmNwcAkocmV2aXNpb24gMCkKKysrIFNvdXJjZS9KYXZh
U2NyaXB0Q29yZS9iMy9haXIvQWlyVmFsaWRhdGUuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAg
KzEsMTI1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE1IEFwcGxlIEluYy4gQWxsIHJpZ2h0
cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQg
YmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1p
dHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoK
KyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJv
dmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0
aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5
IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0
aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRo
ZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdp
dGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZ
IEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJS
QU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdB
UlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIK
KyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMu
IE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwg
SU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1B
R0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNV
QlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJP
RklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5Z
IFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElB
QklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBB
UklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVW
RU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisK
KyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJBaXJWYWxpZGF0ZS5oIgorCisjaW5jbHVk
ZSAiQWlyQ29kZS5oIgorCituYW1lc3BhY2UgSlNDIHsgbmFtZXNwYWNlIEIzIHsgbmFtZXNwYWNl
IEFpciB7CisKK25hbWVzcGFjZSB7CisKK2NsYXNzIFZhbGlkYXRlciB7CitwdWJsaWM6CisgICAg
VmFsaWRhdGVyKENvZGUmIGNvZGUsIGNvbnN0IGNoYXIqIHdoZW4sIGNvbnN0IGNoYXIqIGR1bXBC
ZWZvcmUpCisgICAgICAgIDogbV9jb2RlKGNvZGUpCisgICAgICAgICwgbV93aGVuKHdoZW4pCisg
ICAgICAgICwgbV9kdW1wQmVmb3JlKGR1bXBCZWZvcmUpCisgICAgeworICAgIH0KKworI2RlZmlu
ZSBWQUxJREFURShjb25kaXRpb24sIG1lc3NhZ2UpIGRvIHsgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgXAorICAgICAgICBpZiAoY29uZGl0aW9uKSAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgYnJlYWs7ICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBm
YWlsKF9fRklMRV9fLCBfX0xJTkVfXywgV1RGX1BSRVRUWV9GVU5DVElPTiwgI2NvbmRpdGlvbiwg
dG9DU3RyaW5nIG1lc3NhZ2UpOyBcCisgICAgfSB3aGlsZSAoZmFsc2UpCisgICAgCisgICAgdm9p
ZCBydW4oKQorICAgIHsKKyAgICAgICAgSGFzaFNldDxTdGFja1Nsb3QqPiB2YWxpZFNsb3RzOwor
ICAgICAgICBIYXNoU2V0PEJhc2ljQmxvY2sqPiB2YWxpZEJsb2NrczsKKyAgICAgICAgSGFzaFNl
dDxTcGVjaWFsKj4gdmFsaWRTcGVjaWFsczsKKworICAgICAgICBmb3IgKEJhc2ljQmxvY2sqIGJs
b2NrIDogbV9jb2RlKQorICAgICAgICAgICAgdmFsaWRCbG9ja3MuYWRkKGJsb2NrKTsKKyAgICAg
ICAgZm9yIChTdGFja1Nsb3QqIHNsb3QgOiBtX2NvZGUuc3RhY2tTbG90cygpKQorICAgICAgICAg
ICAgdmFsaWRTbG90cy5hZGQoc2xvdCk7CisgICAgICAgIGZvciAoU3BlY2lhbCogc3BlY2lhbCA6
IG1fY29kZS5zcGVjaWFscygpKQorICAgICAgICAgICAgdmFsaWRTcGVjaWFscy5hZGQoc3BlY2lh
bCk7CisKKyAgICAgICAgZm9yIChCYXNpY0Jsb2NrKiBibG9jayA6IG1fY29kZSkgeworICAgICAg
ICAgICAgZm9yIChJbnN0JiBpbnN0IDogKmJsb2NrKSB7CisgICAgICAgICAgICAgICAgZm9yIChB
cmcmIGFyZyA6IGluc3QuYXJncykgeworICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKGFyZy5r
aW5kKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBTdGFjazoKKyAgICAgICAgICAgICAg
ICAgICAgICAgIFZBTElEQVRFKHZhbGlkU2xvdHMuY29udGFpbnMoYXJnLnN0YWNrU2xvdCgpKSwg
KCJBdCAiLCBpbnN0KSk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAg
ICAgICAgICAgICAgY2FzZSBTcGVjaWFsOgorICAgICAgICAgICAgICAgICAgICAgICAgVkFMSURB
VEUodmFsaWRTcGVjaWFscy5jb250YWlucyhhcmcuc3BlY2lhbCgpKSwgKCJBdCAiLCBpbnN0KSk7
CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgZGVm
YXVsdDoKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAg
ICAgICAgICBWQUxJREFURShpbnN0LmlzVmFsaWRGb3JtKCksICgiQXQgIiwgaW5zdCkpOworICAg
ICAgICAgICAgfQorICAgICAgICAgICAgZm9yIChCYXNpY0Jsb2NrKiBzdWNjZXNzb3IgOiBibG9j
ay0+c3VjY2Vzc29ycygpKQorICAgICAgICAgICAgICAgIFZBTElEQVRFKHZhbGlkQmxvY2tzLmNv
bnRhaW5zKHN1Y2Nlc3NvciksICgiQXQgIiwgKmJsb2NrKSk7CisgICAgICAgIH0KKyAgICB9CisK
K3ByaXZhdGU6CisgICAgdm9pZCBmYWlsKAorICAgICAgICBjb25zdCBjaGFyKiBmaWxlbmFtZSwg
aW50IGxpbmVOdW1iZXIsIGNvbnN0IGNoYXIqIGZ1bmN0aW9uLCBjb25zdCBjaGFyKiBjb25kaXRp
b24sCisgICAgICAgIENTdHJpbmcgbWVzc2FnZSkKKyAgICB7CisgICAgICAgIENTdHJpbmcgZmFp
bHVyZU1lc3NhZ2U7CisgICAgICAgIHsKKyAgICAgICAgICAgIFN0cmluZ1ByaW50U3RyZWFtIG91
dDsKKyAgICAgICAgICAgIG91dC5wcmludCgiQUlSIFZBTElEQVRJT04gRkFJTFVSRVxuIik7Cisg
ICAgICAgICAgICBvdXQucHJpbnQoIiAgICAiLCBjb25kaXRpb24sICIgKCIsIGZpbGVuYW1lLCAi
OiIsIGxpbmVOdW1iZXIsICIpXG4iKTsKKyAgICAgICAgICAgIG91dC5wcmludCgiICAgICIsIG1l
c3NhZ2UsICJcbiIpOworICAgICAgICAgICAgaWYgKG1fd2hlbikKKyAgICAgICAgICAgICAgICBv
dXQucHJpbnQoIiAgICBEdXJpbmcgIiwgbV93aGVuLCAiXG4iKTsKKyAgICAgICAgICAgIGZhaWx1
cmVNZXNzYWdlID0gb3V0LnRvQ1N0cmluZygpOworICAgICAgICB9CisKKyAgICAgICAgb3V0LnBy
aW50KGZhaWx1cmVNZXNzYWdlKTsKKyAgICAgICAgaWYgKG1fZHVtcEJlZm9yZSkgeworICAgICAg
ICAgICAgb3V0LnByaW50KCJCZWZvcmUgIiwgd2hlbiwgIjpcbiIpOworICAgICAgICAgICAgb3V0
LnByaW50KG1fZHVtcEJlZm9yZSk7CisgICAgICAgIH0KKyAgICAgICAgb3V0LnByaW50KCJBdCB0
aW1lIG9mIGZhaWx1cmU6XG4iKTsKKyAgICAgICAgb3V0LnByaW50KG1fY29kZSk7CisKKyAgICAg
ICAgb3V0LnByaW50KGZhaWx1cmVNZXNzYWdlKTsKKyAgICAgICAgV1RGUmVwb3J0QXNzZXJ0aW9u
RmFpbHVyZShmaWxlbmFtZSwgbGluZU51bWJlciwgZnVuY3Rpb24sIGNvbmRpdGlvbik7CisgICAg
ICAgIENSQVNIKCk7CisgICAgfQorICAgIAorICAgIENvZGUmIG1fY29kZTsKKyAgICBjb25zdCBj
aGFyKiBtX2R1bXBCZWZvcmU7Cit9OworCit9IC8vIGFub255bW91cyBuYW1lc3BhY2UKKwordm9p
ZCB2YWxpZGF0ZShDb2RlJiBjb2RlLCBjb25zdCBjaGFyKiB3aGVuLCBjb25zdCBjaGFyKiBkdW1w
QmVmb3JlKQoreworICAgIFZhbGlkYXRlciB2YWxpZGF0ZXIoY29kZSwgd2hlbiwgZHVtcEJlZm9y
ZSk7CisgICAgdmFsaWRhdGVyLnJ1bigpOworfQorCit9IH0gfSAvLyBuYW1lc3BhY2UgSlNDOjpC
Mzo6QWlyCisKSW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9haXIvQWlyVmFsaWRhdGUu
aAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvYWlyL0FpclZhbGlkYXRl
LmgJKHJldmlzaW9uIDApCisrKyBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvYWlyL0FpclZhbGlk
YXRlLmgJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSw0MCBAQAorLyoKKyAqIENvcHlyaWdodCAo
QykgMjAxNSBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmli
dXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0
CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93
aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291
cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0
aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICog
Mi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92
ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRo
ZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29y
IG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICog
VEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5Z
CisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJ
TUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBB
TkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAg
SU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJM
RSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVN
UExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlU
RUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBM
T1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElP
TikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hF
VEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElO
RyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUg
VVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklM
SVRZIE9GIFNVQ0ggREFNQUdFLiAKKyAqLworCisjaWZuZGVmIEFpclZhbGlkYXRlX2gKKyNkZWZp
bmUgQWlyVmFsaWRhdGVfaAorCisjaW5jbHVkZSA8d3RmL3RleHQvQ1N0cmluZy5oPgorCituYW1l
c3BhY2UgSlNDIHsgbmFtZXNwYWNlIEIzIHsgbmFtZXNwYWNlIEFpciB7CisKK2NsYXNzIENvZGU7
CisKK3ZvaWQgdmFsaWRhdGUoQ29kZSYsIGNvbnN0IGNoYXIqIHdoZW4gPSBudWxscHRyLCBjb25z
dCBjaGFyKiBkdW1wQmVmb3JlID0gbnVsbHB0cik7CisKK30gfSB9IC8vIG5hbWVzcGFjZSBKU0M6
OkIzOjpBaXIKKworI2VuZGlmIC8vIEFpclZhbGlkYXRlX2gKKwpJbmRleDogU291cmNlL0phdmFT
Y3JpcHRDb3JlL2IzL2Fpci9vcGNvZGVfZ2VuZXJhdG9yLnJiCj09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJj
ZS9KYXZhU2NyaXB0Q29yZS9iMy9haXIvb3Bjb2RlX2dlbmVyYXRvci5yYgkocmV2aXNpb24gMCkK
KysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9haXIvb3Bjb2RlX2dlbmVyYXRvci5yYgkod29y
a2luZyBjb3B5KQpAQCAtMCwwICsxLDgzNCBAQAorIyEvdXNyL2Jpbi9lbnYgcnVieQorCisjIENv
cHlyaWdodCAoQykgMjAxNSBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisjCisjIFJl
ZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Ig
d2l0aG91dAorIyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUg
Zm9sbG93aW5nIGNvbmRpdGlvbnMKKyMgYXJlIG1ldDoKKyMgMS4gUmVkaXN0cmlidXRpb25zIG9m
IHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyMgICAgbm90aWNl
LCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgor
IyAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFi
b3ZlIGNvcHlyaWdodAorIyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0
aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisjICAgIGRvY3VtZW50YXRpb24gYW5kL29y
IG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisjCisjIFRI
SVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBBTkQgSVRTIENPTlRSSUJVVE9S
UyBgYEFTIElTJycKKyMgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5D
TFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisjIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0Yg
TUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyMgUFVSUE9TRSBB
UkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUiBJVFMgQ09OVFJJ
QlVUT1JTCisjIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUws
IFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKKyMgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJ
TkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKKyMgU1VCU1RJVFVURSBHT09E
UyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNT
CisjIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElB
QklMSVRZLCBXSEVUSEVSIElOCisjIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JU
IChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisjIEFSSVNJTkcgSU4gQU5ZIFdB
WSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YKKyMg
VEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCityZXF1aXJlICJwYXRobmFtZSIKKwor
Y2xhc3MgT3Bjb2RlCisgICAgYXR0cl9yZWFkZXIgOm5hbWUsIDpzcGVjaWFsLCA6b3ZlcmxvYWRz
CisgICAgYXR0cl9hY2Nlc3NvciA6YnJhbmNoCisKKyAgICBkZWYgaW5pdGlhbGl6ZShuYW1lLCBz
cGVjaWFsKQorICAgICAgICBAbmFtZSA9IG5hbWUKKyAgICAgICAgQHNwZWNpYWwgPSBzcGVjaWFs
CisgICAgICAgIEBicmFuY2ggPSBmYWxzZQorICAgICAgICB1bmxlc3Mgc3BlY2lhbAorICAgICAg
ICAgICAgQG92ZXJsb2FkcyA9IFtdCisgICAgICAgIGVuZAorICAgIGVuZAorCisgICAgZGVmIG1h
c21OYW1lCisgICAgICAgIG5hbWVbMF0uZG93bmNhc2UgKyBuYW1lWzEuLi0xXQorICAgIGVuZAor
ZW5kCisKK2NsYXNzIEFyZworICAgIGF0dHJfcmVhZGVyIDpyb2xlLCA6dHlwZQorCisgICAgZGVm
IGluaXRpYWxpemUocm9sZSwgdHlwZSkKKyAgICAgICAgQHJvbGUgPSByb2xlCisgICAgICAgIEB0
eXBlID0gdHlwZQorICAgIGVuZAorZW5kCisKK2NsYXNzIE92ZXJsb2FkCisgICAgYXR0cl9yZWFk
ZXIgOnNpZ25hdHVyZSwgOmZvcm1zCisKKyAgICBkZWYgaW5pdGlhbGl6ZShzaWduYXR1cmUsIGZv
cm1zKQorICAgICAgICBAc2lnbmF0dXJlID0gc2lnbmF0dXJlCisgICAgICAgIEBmb3JtcyA9IGZv
cm1zCisgICAgZW5kCitlbmQKKworY2xhc3MgS2luZAorICAgIGF0dHJfcmVhZGVyIDpuYW1lCisg
ICAgYXR0cl9hY2Nlc3NvciA6c3BlY2lhbAorCisgICAgZGVmIGluaXRpYWxpemUobmFtZSkKKyAg
ICAgICAgQG5hbWUgPSBuYW1lCisgICAgICAgIEBzcGVjaWFsID0gZmFsc2UKKyAgICBlbmQKKwor
ICAgIGRlZiA9PShvdGhlcikKKyAgICAgICAgaWYgb3RoZXIuaXNfYT8gU3RyaW5nCisgICAgICAg
ICAgICBAbmFtZSA9PSBvdGhlcgorICAgICAgICBlbHNlCisgICAgICAgICAgICBAbmFtZSA9PSBv
dGhlci5uYW1lIGFuZCBAc3BlY2lhbCA9PSBvdGhlci5zcGVjaWFsCisgICAgICAgIGVuZAorICAg
IGVuZAorCisgICAgZGVmIEtpbmQuYXJnS2luZHMoa2luZCkKKyAgICAgICAgaWYga2luZCA9PSAi
QWRkciIKKyAgICAgICAgICAgIFsiQWRkciIsICJTdGFja1Nsb3QiLCAiQ2FsbEFyZyJdCisgICAg
ICAgIGVsc2UKKyAgICAgICAgICAgIFtraW5kXQorICAgICAgICBlbmQKKyAgICBlbmQKKworICAg
IGRlZiBhcmdLaW5kcworICAgICAgICBLaW5kLmFyZ0tpbmRzKGtpbmQpCisgICAgZW5kCitlbmQK
KworY2xhc3MgRm9ybQorICAgIGF0dHJfcmVhZGVyIDpraW5kcywgOmFsdE5hbWUKKworICAgIGRl
ZiBpbml0aWFsaXplKGtpbmRzLCBhbHROYW1lKQorICAgICAgICBAa2luZHMgPSBraW5kcworICAg
ICAgICBAYWx0TmFtZSA9IGFsdE5hbWUKKyAgICBlbmQKK2VuZAorCitjbGFzcyBPcmlnaW4KKyAg
ICBhdHRyX3JlYWRlciA6ZmlsZU5hbWUsIDpsaW5lTnVtYmVyCisgICAgCisgICAgZGVmIGluaXRp
YWxpemUoZmlsZU5hbWUsIGxpbmVOdW1iZXIpCisgICAgICAgIEBmaWxlTmFtZSA9IGZpbGVOYW1l
CisgICAgICAgIEBsaW5lTnVtYmVyID0gbGluZU51bWJlcgorICAgIGVuZAorICAgIAorICAgIGRl
ZiB0b19zCisgICAgICAgICIje2ZpbGVOYW1lfToje2xpbmVOdW1iZXJ9IgorICAgIGVuZAorZW5k
CisKK2NsYXNzIFRva2VuCisgICAgYXR0cl9yZWFkZXIgOm9yaWdpbiwgOnN0cmluZworICAgIAor
ICAgIGRlZiBpbml0aWFsaXplKG9yaWdpbiwgc3RyaW5nKQorICAgICAgICBAb3JpZ2luID0gb3Jp
Z2luCisgICAgICAgIEBzdHJpbmcgPSBzdHJpbmcKKyAgICBlbmQKKyAgICAKKyAgICBkZWYgPT0o
b3RoZXIpCisgICAgICAgIGlmIG90aGVyLmlzX2E/IFRva2VuCisgICAgICAgICAgICBAc3RyaW5n
ID09IG90aGVyLnN0cmluZworICAgICAgICBlbHNlCisgICAgICAgICAgICBAc3RyaW5nID09IG90
aGVyCisgICAgICAgIGVuZAorICAgIGVuZAorICAgIAorICAgIGRlZiA9fihvdGhlcikKKyAgICAg
ICAgQHN0cmluZyA9fiBvdGhlcgorICAgIGVuZAorICAgIAorICAgIGRlZiB0b19zCisgICAgICAg
ICIje0BzdHJpbmcuaW5zcGVjdH0gYXQgI3tvcmlnaW59IgorICAgIGVuZAorICAgIAorICAgIGRl
ZiBwYXJzZUVycm9yKCpjb21tZW50KQorICAgICAgICBpZiBjb21tZW50LmVtcHR5PworICAgICAg
ICAgICAgcmFpc2UgIlBhcnNlIGVycm9yOiAje3RvX3N9IgorICAgICAgICBlbHNlCisgICAgICAg
ICAgICByYWlzZSAiUGFyc2UgZXJyb3I6ICN7dG9fc306ICN7Y29tbWVudFswXX0iCisgICAgICAg
IGVuZAorICAgIGVuZAorZW5kCisKK2RlZiBsZXgoc3RyLCBmaWxlTmFtZSkKKyAgICBmaWxlTmFt
ZSA9IFBhdGhuYW1lLm5ldyhmaWxlTmFtZSkKKyAgICByZXN1bHQgPSBbXQorICAgIGxpbmVOdW1i
ZXIgPSAxCisgICAgd2hpbGUgbm90IHN0ci5lbXB0eT8KKyAgICAgICAgY2FzZSBzdHIKKyAgICAg
ICAgd2hlbiAvXEFcIyhbXlxuXSopLworICAgICAgICAgICAgIyBjb21tZW50LCBpZ25vcmUKKyAg
ICAgICAgd2hlbiAvXEFcbi8KKyAgICAgICAgICAgICMgbmV3bGluZSwgaWdub3JlCisgICAgICAg
ICAgICBsaW5lTnVtYmVyICs9IDEKKyAgICAgICAgd2hlbiAvXEEoW2EtekEtWjAtOV9dKykvCisg
ICAgICAgICAgICByZXN1bHQgPDwgVG9rZW4ubmV3KE9yaWdpbi5uZXcoZmlsZU5hbWUsIGxpbmVO
dW1iZXIpLCAkJikKKyAgICAgICAgd2hlbiAvXEEoWyBcdFxyXSspLworICAgICAgICAgICAgIyB3
aGl0ZXNwYWNlLCBpZ25vcmUKKyAgICAgICAgd2hlbiAvXEFbLDoqXC9dLworICAgICAgICAgICAg
cmVzdWx0IDw8IFRva2VuLm5ldyhPcmlnaW4ubmV3KGZpbGVOYW1lLCBsaW5lTnVtYmVyKSwgJCYp
CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHJhaXNlICJMZXhlciBlcnJvciBhdCAje09yaWdp
bi5uZXcoZmlsZU5hbWUsIGxpbmVOdW1iZXIpLnRvX3N9LCB1bmV4cGVjdGVkIHNlcXVlbmNlICN7
c3RyWzAuLjIwXS5pbnNwZWN0fSIKKyAgICAgICAgZW5kCisgICAgICAgIHN0ciA9ICR+LnBvc3Rf
bWF0Y2gKKyAgICBlbmQKKyAgICByZXN1bHQKK2VuZAorCitkZWYgaXNVRCh0b2tlbikKKyAgICB0
b2tlbiA9fiAvXEEoKFUpfChEKXwoVUQpKVxaLworZW5kCisKK2RlZiBpc0dGKHRva2VuKQorICAg
IHRva2VuID1+IC9cQSgoRyl8KEYpKVxaLworZW5kCisKK2RlZiBpc0tpbmQodG9rZW4pCisgICAg
dG9rZW4gPX4gL1xBKChUbXApfChJbW0pfChJbW02NCl8KEFkZHIpfChJbmRleCl8KFJlbENvbmQp
fChSZXNDb25kKSlcWi8KK2VuZAorCitkZWYgaXNLZXl3b3JkKHRva2VuKQorICAgIGlzVUQodG9r
ZW4pIG9yIGlzR0YodG9rZW4pIG9yIGlzS2luZCh0b2tlbikgb3IKKyAgICAgICAgdG9rZW4gPT0g
InNwZWNpYWwiIG9yIHRva2VuID09ICJhcyIKK2VuZAorCitkZWYgaXNJZGVudGlmaWVyKHRva2Vu
KQorICAgIHRva2VuID1+IC9cQShbYS16QS1aMC05X10rKVxaLyBhbmQgbm90IGlzS2V5d29yZCh0
b2tlbikKK2VuZAorCitjbGFzcyBQYXJzZXIKKyAgICBkZWYgaW5pdGlhbGl6ZShkYXRhLCBmaWxl
TmFtZSkKKyAgICAgICAgQHRva2VucyA9IGxleChkYXRhLCBmaWxlTmFtZSkKKyAgICAgICAgQGlk
eCA9IDAKKyAgICBlbmQKKworICAgIGRlZiB0b2tlbgorICAgICAgICBAdG9rZW5zW0BpZHhdCisg
ICAgZW5kCisKKyAgICBkZWYgYWR2YW5jZQorICAgICAgICBAaWR4ICs9IDEKKyAgICBlbmQKKwor
ICAgIGRlZiBwYXJzZUVycm9yKCpjb21tZW50KQorICAgICAgICBpZiB0b2tlbgorICAgICAgICAg
ICAgdG9rZW4ucGFyc2VFcnJvcigqY29tbWVudCkKKyAgICAgICAgZWxzZQorICAgICAgICAgICAg
aWYgY29tbWVudC5lbXB0eT8KKyAgICAgICAgICAgICAgICByYWlzZSAiUGFyc2UgZXJyb3IgYXQg
ZW5kIG9mIGZpbGUiCisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgcmFpc2UgIlBh
cnNlIGVycm9yIGF0IGVuZCBvZiBmaWxlOiAje2NvbW1lbnRbMF19IgorICAgICAgICAgICAgZW5k
CisgICAgICAgIGVuZAorICAgIGVuZAorCisgICAgZGVmIGNvbnN1bWUoc3RyaW5nKQorICAgICAg
ICBwYXJzZUVycm9yKCJFeHBlY3RlZCAje3N0cmluZ30iKSB1bmxlc3MgdG9rZW4gPT0gc3RyaW5n
CisgICAgICAgIGFkdmFuY2UKKyAgICBlbmQKKworICAgIGRlZiBjb25zdW1lSWRlbnRpZmllcgor
ICAgICAgICByZXN1bHQgPSB0b2tlbi5zdHJpbmcKKyAgICAgICAgcGFyc2VFcnJvcigiRXhwZWN0
ZWQgaWRlbnRpZmllciIpIHVubGVzcyBpc0lkZW50aWZpZXIocmVzdWx0KQorICAgICAgICBhZHZh
bmNlCisgICAgICAgIHJlc3VsdAorICAgIGVuZAorCisgICAgZGVmIGNvbnN1bWVSb2xlCisgICAg
ICAgIHJlc3VsdCA9IHRva2VuLnN0cmluZworICAgICAgICBwYXJzZUVycm9yKCJFeHBlY3RlZCBy
b2xlIChVLCBELCBvciBVRCkiKSB1bmxlc3MgaXNVRChyZXN1bHQpCisgICAgICAgIGFkdmFuY2UK
KyAgICAgICAgcmVzdWx0CisgICAgZW5kCisKKyAgICBkZWYgY29uc3VtZVR5cGUKKyAgICAgICAg
cmVzdWx0ID0gdG9rZW4uc3RyaW5nCisgICAgICAgIHBhcnNlRXJyb3IoIkV4cGVjdGVkIHR5cGUg
KEcgb3IgRikiKSB1bmxlc3MgaXNHRihyZXN1bHQpCisgICAgICAgIGFkdmFuY2UKKyAgICAgICAg
cmVzdWx0CisgICAgZW5kCisKKyAgICBkZWYgY29uc3VtZUtpbmQKKyAgICAgICAgcmVzdWx0ID0g
dG9rZW4uc3RyaW5nCisgICAgICAgIHBhcnNlRXJyb3IoIkV4cGVjdGVkIGtpbmQgKEltbSwgSW1t
NjQsIFRtcCwgQWRkciwgSW5kZXgsIFJlbENvbmQsIG9yIFJlc0NvbmQpIikgdW5sZXNzIGlzS2lu
ZChyZXN1bHQpCisgICAgICAgIGFkdmFuY2UKKyAgICAgICAgcmVzdWx0CisgICAgZW5kCisKKyAg
ICBkZWYgcGFyc2UKKyAgICAgICAgcmVzdWx0ID0ge30KKyAgICAgICAgCisgICAgICAgIGxvb3Ag
eworICAgICAgICAgICAgYnJlYWsgaWYgQGlkeCA+PSBAdG9rZW5zLmxlbmd0aAorCisgICAgICAg
ICAgICBpZiB0b2tlbiA9PSAic3BlY2lhbCIKKyAgICAgICAgICAgICAgICBjb25zdW1lKCJzcGVj
aWFsIikKKyAgICAgICAgICAgICAgICBvcGNvZGVOYW1lID0gY29uc3VtZUlkZW50aWZpZXIKKwor
ICAgICAgICAgICAgICAgIHBhcnNlRXJyb3IoIkNhbm5vdCBvdmVybG9hZCBhIHNwZWNpYWwgb3Bj
b2RlIikgaWYgcmVzdWx0W29wY29kZU5hbWVdCisKKyAgICAgICAgICAgICAgICByZXN1bHRbb3Bj
b2RlTmFtZV0gPSBPcGNvZGUubmV3KG9wY29kZU5hbWUsIHRydWUpCisgICAgICAgICAgICBlbHNl
CisgICAgICAgICAgICAgICAgb3Bjb2RlTmFtZSA9IGNvbnN1bWVJZGVudGlmaWVyCisKKyAgICAg
ICAgICAgICAgICBpZiByZXN1bHRbb3Bjb2RlTmFtZV0KKyAgICAgICAgICAgICAgICAgICAgb3Bj
b2RlID0gcmVzdWx0W29wY29kZU5hbWVdCisgICAgICAgICAgICAgICAgICAgIHBhcnNlRXJyb3Io
IkNhbm5vdCBvdmVybG9hZCBhIHNwZWNpYWwgb3Bjb2RlIikgaWYgb3Bjb2RlLnNwZWNpYWwKKyAg
ICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIG9wY29kZSA9IE9wY29kZS5u
ZXcob3Bjb2RlTmFtZSwgZmFsc2UpCisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtvcGNvZGVO
YW1lXSA9IG9wY29kZQorICAgICAgICAgICAgICAgIGVuZAorCisgICAgICAgICAgICAgICAgc2ln
bmF0dXJlID0gW10KKyAgICAgICAgICAgICAgICBmb3JtcyA9IFtdCisgICAgICAgICAgICAgICAg
CisgICAgICAgICAgICAgICAgaWYgaXNVRCh0b2tlbikKKyAgICAgICAgICAgICAgICAgICAgbG9v
cCB7CisgICAgICAgICAgICAgICAgICAgICAgICByb2xlID0gY29uc3VtZVJvbGUKKyAgICAgICAg
ICAgICAgICAgICAgICAgIGNvbnN1bWUoIjoiKQorICAgICAgICAgICAgICAgICAgICAgICAgdHlw
ZSA9IGNvbnN1bWVUeXBlCisgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAg
ICAgICAgICAgIHNpZ25hdHVyZSA8PCBBcmcubmV3KHJvbGUsIHR5cGUpCisgICAgICAgICAgICAg
ICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrIHVubGVzcyB0b2tlbiA9
PSAiLCIKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN1bWUoIiwiKQorICAgICAgICAgICAg
ICAgICAgICB9CisgICAgICAgICAgICAgICAgZW5kCisKKyAgICAgICAgICAgICAgICBpZiB0b2tl
biA9PSAiLyIKKyAgICAgICAgICAgICAgICAgICAgY29uc3VtZSgiLyIpCisgICAgICAgICAgICAg
ICAgICAgIGNvbnN1bWUoImJyYW5jaCIpCisgICAgICAgICAgICAgICAgICAgIG9wY29kZS5icmFu
Y2ggPSB0cnVlCisgICAgICAgICAgICAgICAgZW5kCisKKyAgICAgICAgICAgICAgICBpZiBpc0tp
bmQodG9rZW4pCisgICAgICAgICAgICAgICAgICAgIGxvb3AgeworICAgICAgICAgICAgICAgICAg
ICAgICAga2luZHMgPSBbXQorICAgICAgICAgICAgICAgICAgICAgICAgYWx0TmFtZSA9IG5pbAor
ICAgICAgICAgICAgICAgICAgICAgICAgbG9vcCB7CisgICAgICAgICAgICAgICAgICAgICAgICAg
ICAga2luZHMgPDwgS2luZC5uZXcoY29uc3VtZUtpbmQpCisKKyAgICAgICAgICAgICAgICAgICAg
ICAgICAgICBpZiB0b2tlbiA9PSAiKiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
cGFyc2VFcnJvcigiQ2FuIG9ubHkgYXBwbHkgKiB0byBUbXAiKSB1bmxlc3Mga2luZHNbLTFdLm5h
bWUgPT0gIlRtcCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2luZHNbLTFdLnNw
ZWNpYWwgPSB0cnVlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN1bWUoIioi
KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuZAorCisgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgYnJlYWsgdW5sZXNzIHRva2VuID09ICIsIgorICAgICAgICAgICAgICAgICAgICAg
ICAgICAgIGNvbnN1bWUoIiwiKQorICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAg
ICAgICAgICAgICAgICAgICBpZiB0b2tlbiA9PSAiYXMiCisgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgY29uc3VtZSgiYXMiKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsdE5hbWUg
PSBjb25zdW1lSWRlbnRpZmllcgorICAgICAgICAgICAgICAgICAgICAgICAgZW5kCisKKyAgICAg
ICAgICAgICAgICAgICAgICAgIHBhcnNlRXJyb3IoIkZvcm0gaGFzIHdyb25nIG51bWJlciBvZiBh
cmd1bWVudHMgZm9yIG92ZXJsb2FkIikgdW5sZXNzIGtpbmRzLmxlbmd0aCA9PSBzaWduYXR1cmUu
bGVuZ3RoCisgICAgICAgICAgICAgICAgICAgICAgICBraW5kcy5lYWNoX3dpdGhfaW5kZXggewor
ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwga2luZCwgaW5kZXggfAorICAgICAgICAgICAg
ICAgICAgICAgICAgICAgIGlmIGtpbmQubmFtZSA9PSAiSW1tIiBvciBraW5kLm5hbWUgPT0gIklt
bTY0IgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiBzaWduYXR1cmVbaW5kZXhd
LnJvbGUgIT0gIlUiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJzZUVy
cm9yKCJGb3JtIGhhcyBhbiBpbW1lZGlhdGUgZm9yIGEgbm9uLXVzZSBhcmd1bWVudCIpCisgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuZAorICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICBpZiBzaWduYXR1cmVbaW5kZXhdLnR5cGUgIT0gIkciCisgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICBwYXJzZUVycm9yKCJGb3JtIGhhcyBhbiBpbW1lZGlhdGUgZm9y
IGEgbm9uLWdlbmVyYWwtcHVycG9zZSBhcmd1bWVudCIpCisgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgIGVuZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuZAorICAgICAgICAg
ICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgZm9ybXMgPDwgRm9ybS5u
ZXcoa2luZHMsIGFsdE5hbWUpCisgICAgICAgICAgICAgICAgICAgICAgICBicmVhayB1bmxlc3Mg
aXNLaW5kKHRva2VuKQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZW5k
CisKKyAgICAgICAgICAgICAgICBpZiBzaWduYXR1cmUubGVuZ3RoID09IDAKKyAgICAgICAgICAg
ICAgICAgICAgcmFpc2UgdW5sZXNzIGZvcm1zLmxlbmd0aCA9PSAwCisgICAgICAgICAgICAgICAg
ICAgIGZvcm1zIDw8IEZvcm0ubmV3KFtdLCBuaWwpCisgICAgICAgICAgICAgICAgZW5kCisKKyAg
ICAgICAgICAgICAgICBvcGNvZGUub3ZlcmxvYWRzIDw8IE92ZXJsb2FkLm5ldyhzaWduYXR1cmUs
IGZvcm1zKQorICAgICAgICAgICAgZW5kCisgICAgICAgIH0KKworICAgICAgICByZXN1bHQKKyAg
ICBlbmQKK2VuZAorCiskZmlsZU5hbWUgPSBBUkdWWzBdCisKK3BhcnNlciA9IFBhcnNlci5uZXco
SU86OnJlYWQoJGZpbGVOYW1lKSwgJGZpbGVOYW1lKQorJG9wY29kZXMgPSBwYXJzZXIucGFyc2UK
KworZGVmIHdyaXRlSChmaWxlbmFtZSkKKyAgICBGaWxlLm9wZW4oIkFpciN7ZmlsZW5hbWV9Lmgi
LCAidyIpIHsKKyAgICAgICAgfCBvdXRwIHwKKyAgICAgICAgCisgICAgICAgIG91dHAucHV0cyAi
Ly8gR2VuZXJhdGVkIGJ5IG9wY29kZV9nZW5lcmF0b3IucmIgZnJvbSAjeyRmaWxlTmFtZX0gLS0g
ZG8gbm90IGVkaXQhIgorICAgICAgICAKKyAgICAgICAgb3V0cC5wdXRzICIjaWZuZGVmIEFpciN7
ZmlsZW5hbWV9X2giCisgICAgICAgIG91dHAucHV0cyAiI2RlZmluZSBBaXIje2ZpbGVuYW1lfV9o
IgorCisgICAgICAgIHlpZWxkIG91dHAKKyAgICAgICAgCisgICAgICAgIG91dHAucHV0cyAiI2Vu
ZGlmIC8vIEFpciN7ZmlsZW5hbWV9X2giCisgICAgfQorZW5kCisKK2RlZiB3cml0ZUNQUChmaWxl
bmFtZSkKKyAgICBGaWxlLm9wZW4oIkFpciN7ZmlsZW5hbWV9LmNwcCIsICJ3IikgeworICAgICAg
ICB8IG91dHAgfAorICAgICAgICAKKyAgICAgICAgb3V0cC5wdXRzICIvLyBHZW5lcmF0ZWQgYnkg
b3Bjb2RlX2dlbmVyYXRvci5yYiBmcm9tICN7JGZpbGVOYW1lfSAtLSBkbyBub3QgZWRpdCEiCisg
ICAgICAgIAorICAgICAgICBvdXRwLnB1dHMgIiNpbmNsdWRlIFwiY29uZmlnLmhcIiIKKyAgICAg
ICAgb3V0cC5wdXRzICIjaW5jbHVkZSBcIkFpciN7ZmlsZW5hbWV9LmhcIiIKKworICAgICAgICB5
aWVsZCBvdXRwCisgICAgfQorZW5kCisKK3dyaXRlSCgiT3Bjb2RlIikgeworICAgIHwgb3V0cCB8
CisgICAgb3V0cC5wdXRzICJuYW1lc3BhY2UgSlNDIHsgbmFtZXNwYWNlIEIzIHsgbmFtZXNwYWNl
IEFpciB7IgorICAgIG91dHAucHV0cyAiZW51bSBPcGNvZGUgOiBpbnQxNl90IHsiCisgICAgJG9w
Y29kZXMua2V5cy5zb3J0LmVhY2ggeworICAgICAgICB8IG9wY29kZSB8CisgICAgICAgIG91dHAu
cHV0cyAiICAgICN7b3Bjb2RlfSwiCisgICAgfQorICAgIG91dHAucHV0cyAifSIKKworICAgIG91
dHAucHV0cyAic3RhdGljIGNvbnN0IHVuc2lnbmVkIG51bU9wY29kZXMgPSAjeyRvcGNvZGVzLmtl
eXMuc2l6ZX07IgorICAgIG91dHAucHV0cyAifSB9IH0gLy8gbmFtZXNwYWNlIEpTQzo6QjM6OkFp
ciIKKyAgICAKKyAgICBvdXRwLnB1dHMgIm5hbWVzcGFjZSBXVEYgeyIKKyAgICBvdXRwLnB1dHMg
ImNsYXNzIFByaW50U3RyZWFtOyIKKyAgICBvdXRwLnB1dHMgInZvaWQgcHJpbnRJbnRlcm5hbChQ
cmludFN0cmVhbSYsIEpTQzo6QjM6OkFpcjo6T3Bjb2RlKTsiCisgICAgb3V0cC5wdXRzICJ9IC8v
IG5hbWVzcGFjZSBXVEYiCit9CisKK3dyaXRlQ1BQKCJPcGNvZGUiKSB7CisgICAgfCBvdXRwIHwK
KyAgICBvdXRwLnB1dHMgIiNpbmNsdWRlIFwid3RmL1ByaW50U3RyZWFtLmhcIiIKKyAgICBvdXRw
LnB1dHMgIm5hbWVzcGFjZSBXVEYgeyIKKyAgICBvdXRwLnB1dHMgInVzaW5nIG5hbWVzcGFjZSBK
U0M6OkIzOjpBaXI7IgorICAgIG91dHAucHV0cyAidm9pZCBwcmludEludGVybmFsKFByaW50U3Ry
ZWFtJiBvdXQsIE9wY29kZSBvcGNvZGUpIgorICAgIG91dHAucHV0cyAieyIKKyAgICBvdXRwLnB1
dHMgIiAgICBzd2l0Y2ggKG9wY29kZSkgeyIKKyAgICAkb3Bjb2Rlcy5rZXlzLmVhY2ggeworICAg
ICAgICB8IG9wY29kZSB8CisgICAgICAgIG91dHAucHV0cyAiICAgIGNhc2UgI3tvcGNvZGV9OiIK
KyAgICAgICAgb3V0cC5wdXRzICIgICAgICAgIG91dC5wcmludChcIiN7b3Bjb2RlfVwiKTsiCisg
ICAgICAgIG91dHAucHV0cyAiICAgICAgICByZXR1cm47IgorICAgIH0KKyAgICBvdXRwLnB1dHMg
IiAgICB9IgorICAgIG91dHAucHV0cyAiICAgIFJFTEVBU0VfQVNTRVJUX05PVF9SRUFDSEVEKCk7
IgorICAgIG91dHAucHV0cyAifSIKKyAgICBvdXRwLnB1dHMgIn0gLy8gbmFtZXNwYWNlIFdURiIK
K30KKworIyBGcm9tIGhlcmUgb24sIHdlIGRvbid0IHRyeSB0byBlbWl0IHByb3Blcmx5IGluZGVu
dGVkIGNvZGUsIHNpbmNlIHdlJ3JlIHVzaW5nIGEgcmVjdXJzaXZlIHBhdHRlcm4KKyMgbWF0Y2hl
ci4KKworZGVmIG1hdGNoRm9ybXMob3V0cCwgc3BlZWQsIGZvcm1zLCBjb2x1bW5JbmRleCwgY29s
dW1uR2V0dGVyLCBmaWx0ZXIsIGNhbGxiYWNrKQorICAgIHJldHVybiBpZiBmb3Jtcy5sZW5ndGgg
PT0gMAorCisgICAgaWYgZmlsdGVyW2Zvcm1zXQorICAgICAgICByZXR1cm4KKyAgICBlbmQKKwor
ICAgIGlmIGNvbHVtbkluZGV4ID49IGZvcm1zWzBdLmtpbmRzLmxlbmd0aAorICAgICAgICByYWlz
ZSB1bmxlc3MgZm9ybXMubGVuZ3RoID09IDEKKyAgICAgICAgY2FsbGJhY2tbZm9ybXNbMF1dCisg
ICAgICAgIHJldHVybgorICAgIGVuZAorICAgIAorICAgIGdyb3VwcyA9IHt9CisgICAgZm9ybXMu
ZWFjaCB7CisgICAgICAgIHwgZm9ybSB8CisgICAgICAgIGtpbmQgPSBmb3JtLmtpbmRzW2NvbHVt
bkluZGV4XS5uYW1lCisgICAgICAgIGlmIGdyb3Vwc1traW5kXQorICAgICAgICAgICAgZ3JvdXBz
W2tpbmRdIDw8IGZvcm0KKyAgICAgICAgZWxzZQorICAgICAgICAgICAgZ3JvdXBzW2tpbmRdID0g
W2Zvcm1dCisgICAgICAgIGVuZAorICAgIH0KKworICAgIGlmIHNwZWVkID09IDpmYXN0IGFuZCBn
cm91cHMubGVuZ3RoID09IDEKKyAgICAgICAgbWF0Y2hGb3JtcyhvdXRwLCBzcGVlZCwgZm9ybXMs
IGNvbHVtbkluZGV4ICsgMSwgY29sdW1uR2V0dGVyLCBmaWx0ZXIsIGNhbGxiYWNrKQorICAgICAg
ICByZXR1cm4KKyAgICBlbmQKKworICAgIG91dHAucHV0cyAic3dpdGNoICgje2NvbHVtbkdldHRl
cltjb2x1bW5JbmRleF19KSB7IgorICAgIGdyb3Vwcy5lYWNoX3BhaXIgeworICAgICAgICB8IGtl
eSwgdmFsdWUgfAorICAgICAgICBvdXRwLnB1dHMgIiNpZiBVU0UoSlNWQUxVRTY0KSIgaWYga2V5
ID09ICJJbW02NCIKKyAgICAgICAgS2luZC5hcmdLaW5kcyhrZXkpLmVhY2ggeworICAgICAgICAg
ICAgfCBhcmdLaW5kIHwKKyAgICAgICAgICAgIG91dHAucHV0cyAiY2FzZSBBcmc6OiN7YXJnS2lu
ZH06IgorICAgICAgICB9CisgICAgICAgIG1hdGNoRm9ybXMob3V0cCwgc3BlZWQsIHZhbHVlLCBj
b2x1bW5JbmRleCArIDEsIGNvbHVtbkdldHRlciwgZmlsdGVyLCBjYWxsYmFjaykKKyAgICAgICAg
b3V0cC5wdXRzICJicmVhazsiCisgICAgICAgIG91dHAucHV0cyAiI2VuZGlmIC8vIFVTRShKU1ZB
TFVFNjQpIiBpZiBrZXkgPT0gIkltbTY0IgorICAgIH0KKyAgICBvdXRwLnB1dHMgImRlZmF1bHQ6
IgorICAgIG91dHAucHV0cyAiYnJlYWs7IgorICAgIG91dHAucHV0cyAifSIKK2VuZAorCitkZWYg
bWF0Y2hJbnN0T3ZlcmxvYWQob3V0cCwgc3BlZWQsIGluc3QpCisgICAgb3V0cC5wdXRzICJzd2l0
Y2ggKCN7aW5zdH0tPm9wY29kZSkgeyIKKyAgICAkb3Bjb2Rlcy52YWx1ZXMuZWFjaCB7CisgICAg
ICAgIHwgb3Bjb2RlIHwKKyAgICAgICAgb3V0cC5wdXRzICJjYXNlICN7b3Bjb2RlLm5hbWV9OiIK
KyAgICAgICAgaWYgb3Bjb2RlLnNwZWNpYWwKKyAgICAgICAgICAgIHlpZWxkIG9wY29kZSwgbmls
CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIG5lZWRPdmVybG9hZFN3aXRjaCA9ICgob3Bjb2Rl
Lm92ZXJsb2Fkcy5zaXplICE9IDEpIG9yIHNwZWVkID09IDpzYWZlKQorICAgICAgICAgICAgb3V0
cC5wdXRzICJzd2l0Y2ggKCN7aW5zdH0tPmFyZ3Muc2l6ZSgpKSB7IiBpZiBuZWVkT3ZlcmxvYWRT
d2l0Y2gKKyAgICAgICAgICAgIG9wY29kZS5vdmVybG9hZHMuZWFjaCB7CisgICAgICAgICAgICAg
ICAgfCBvdmVybG9hZCB8CisgICAgICAgICAgICAgICAgb3V0cC5wdXRzICJjYXNlICN7b3Zlcmxv
YWQuc2lnbmF0dXJlLmxlbmd0aH06IiBpZiBuZWVkT3ZlcmxvYWRTd2l0Y2gKKyAgICAgICAgICAg
ICAgICB5aWVsZCBvcGNvZGUsIG92ZXJsb2FkCisgICAgICAgICAgICAgICAgb3V0cC5wdXRzICJi
cmVhazsiIGlmIG5lZWRPdmVybG9hZFN3aXRjaAorICAgICAgICAgICAgfQorICAgICAgICAgICAg
aWYgbmVlZE92ZXJsb2FkU3dpdGNoCisgICAgICAgICAgICAgICAgb3V0cC5wdXRzICJkZWZhdWx0
OiIKKyAgICAgICAgICAgICAgICBvdXRwLnB1dHMgImJyZWFrOyIKKyAgICAgICAgICAgICAgICBv
dXRwLnB1dHMgIn0iCisgICAgICAgICAgICBlbmQKKyAgICAgICAgZW5kCisgICAgICAgIG91dHAu
cHV0cyAiYnJlYWs7IgorICAgIH0KKyAgICBvdXRwLnB1dHMgImRlZmF1bHQ6IgorICAgIG91dHAu
cHV0cyAiYnJlYWs7IgorICAgIG91dHAucHV0cyAifSIKK2VuZAorICAgIAorZGVmIG1hdGNoSW5z
dE92ZXJsb2FkRm9ybShvdXRwLCBzcGVlZCwgaW5zdCkKKyAgICBtYXRjaEluc3RPdmVybG9hZChv
dXRwLCBzcGVlZCwgaW5zdCkgeworICAgICAgICB8IG9wY29kZSwgb3ZlcmxvYWQgfAorICAgICAg
ICBpZiBvcGNvZGUuc3BlY2lhbAorICAgICAgICAgICAgeWllbGQgb3Bjb2RlLCBuaWwsIG5pbAor
ICAgICAgICBlbHNlCisgICAgICAgICAgICBjb2x1bW5HZXR0ZXIgPSBwcm9jIHsKKyAgICAgICAg
ICAgICAgICB8IGNvbHVtbkluZGV4IHwKKyAgICAgICAgICAgICAgICAiI3tpbnN0fS0+YXJnc1sj
e2NvbHVtbkluZGV4fV0ua2luZCgpIgorICAgICAgICAgICAgfQorICAgICAgICAgICAgZmlsdGVy
ID0gcHJvYyB7IGZhbHNlIH0KKyAgICAgICAgICAgIGNhbGxiYWNrID0gcHJvYyB7CisgICAgICAg
ICAgICAgICAgfCBmb3JtIHwKKyAgICAgICAgICAgICAgICB5aWVsZCBvcGNvZGUsIG92ZXJsb2Fk
LCBmb3JtCisgICAgICAgICAgICB9CisgICAgICAgICAgICBtYXRjaEZvcm1zKG91dHAsIHNwZWVk
LCBvdmVybG9hZC5mb3JtcywgMCwgY29sdW1uR2V0dGVyLCBmaWx0ZXIsIGNhbGxiYWNrKQorICAg
ICAgICBlbmQKKyAgICB9CitlbmQKKword3JpdGVIKCJPcGNvZGVVdGlscyIpIHsKKyAgICB8IG91
dHAgfAorICAgIG91dHAucHV0cyAiI2luY2x1ZGUgXCJBaXJJbnN0LmhcIiIKKyAgICBvdXRwLnB1
dHMgIm5hbWVzcGFjZSBKU0MgeyBuYW1lc3BhY2UgQjMgeyBuYW1lc3BhY2UgQWlyIHsiCisgICAg
CisgICAgb3V0cC5wdXRzICJpbmxpbmUgYm9vbCBvcGdlbkhpZGRlblRydXRoKCkgeyByZXR1cm4g
dHJ1ZTsgfSIKKyAgICBvdXRwLnB1dHMgIiNkZWZpbmUgT1BHRU5fUkVUVVJOKHZhbHVlKSBkbyB7
XFwiCisgICAgb3V0cC5wdXRzICIgICAgaWYgKG9wZ2VuSGlkZGVuVHJ1dGgoKSlcXCIKKyAgICBv
dXRwLnB1dHMgIiAgICAgICAgcmV0dXJuIHZhbHVlO1xcIgorICAgIG91dHAucHV0cyAifSIKKwor
ICAgIG91dHAucHV0cyAidGVtcGxhdGU8dHlwZW5hbWUgRnVuY3Rvcj4iCisgICAgb3V0cC5wdXRz
ICJ2b2lkIEluc3Q6OmZvckVhY2hBcmcoY29uc3QgRnVuY3RvciYgZnVuY3RvcikiCisgICAgb3V0
cC5wdXRzICJ7IgorICAgIG1hdGNoSW5zdE92ZXJsb2FkKG91dHAsIDpmYXN0LCAidGhpcyIpIHsK
KyAgICAgICAgfCBvcGNvZGUsIG92ZXJsb2FkIHwKKyAgICAgICAgaWYgb3Bjb2RlLnNwZWNpYWwK
KyAgICAgICAgICAgIG91dHAucHV0cyAiZnVuY3RvcihhcmdzWzBdLCBBcmc6OlVzZSwgQXJnOjpH
UCk7IC8vIFRoaXMgaXMgYmFzaWNhbGx5IGJvZ3VzLCBidXQgaXQgd29ya3MgZiBhbmFseXNlcyBt
b2RlbCBTcGVjaWFsIGFzIGFuIGltbWVkaWF0ZS4iCisgICAgICAgICAgICBvdXRwLnB1dHMgImFy
Z3NbMF0uc3BlY2lhbCgpLT5mb3JFYWNoQXJnKCp0aGlzLCBzY29wZWRMYW1iZGE8RWFjaEFyZ0Nh
bGxiYWNrPihmdW5jdG9yKSk7IgorICAgICAgICBlbHNlCisgICAgICAgICAgICBvdmVybG9hZC5z
aWduYXR1cmUuZWFjaF93aXRoX2luZGV4IHsKKyAgICAgICAgICAgICAgICB8IGFyZywgaW5kZXgg
fAorICAgICAgICAgICAgICAgIHJvbGUgPSBuaWwKKyAgICAgICAgICAgICAgICBjYXNlIGFyZy5y
b2xlCisgICAgICAgICAgICAgICAgd2hlbiAiVSIKKyAgICAgICAgICAgICAgICAgICAgcm9sZSA9
ICJVc2UiCisgICAgICAgICAgICAgICAgd2hlbiAiRCIKKyAgICAgICAgICAgICAgICAgICAgcm9s
ZSA9ICJEZWYiCisgICAgICAgICAgICAgICAgd2hlbiAiVUQiCisgICAgICAgICAgICAgICAgICAg
IHJvbGUgPSAiVXNlRGVmIgorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAg
ICAgcmFpc2UKKyAgICAgICAgICAgICAgICBlbmQKKyAgICAgICAgICAgICAgICAKKyAgICAgICAg
ICAgICAgICBvdXRwLnB1dHMgImZ1bmN0b3IoYXJnc1sje2luZGV4fV0sIEFyZzo6I3tyb2xlfSwg
QXJnOjoje2FyZy50eXBlfVApOyIKKyAgICAgICAgICAgIH0KKyAgICAgICAgZW5kCisgICAgfQor
ICAgIG91dHAucHV0cyAifSIKKworICAgIG91dHAucHV0cyAidGVtcGxhdGU8dHlwZW5hbWUuLi4g
QXJndW1lbnRzPiIKKyAgICBvdXRwLnB1dHMgIkFMV0FZU19JTkxJTkUgYm9vbCBpc1ZhbGlkRm9y
bShPcGNvZGUgb3Bjb2RlLCBBcmd1bWVudHMuLi4gYXJndW1lbnRzKSIKKyAgICBvdXRwLnB1dHMg
InsiCisgICAgb3V0cC5wdXRzICJBcmc6OktpbmQga2luZHNbc2l6ZW9mLi4uKEFyZ3VtZW50cyld
ID0geyBhcmd1bWVudHMuLi4gfTsiCisgICAgb3V0cC5wdXRzICJzd2l0Y2ggKG9wY29kZSkgeyIK
KyAgICAkb3Bjb2Rlcy52YWx1ZXMuZWFjaCB7CisgICAgICAgIHwgb3Bjb2RlIHwKKyAgICAgICAg
b3V0cC5wdXRzICJjYXNlICN7b3Bjb2RlLm5hbWV9OiIKKyAgICAgICAgb3V0cC5wdXRzICJzd2l0
Y2ggKHNpemVvZi4uLihBcmd1bWVudHMpKSB7IgorICAgICAgICB1bmxlc3Mgb3Bjb2RlLnNwZWNp
YWwKKyAgICAgICAgICAgIG9wY29kZS5vdmVybG9hZHMuZWFjaCB7CisgICAgICAgICAgICAgICAg
fCBvdmVybG9hZCB8CisgICAgICAgICAgICAgICAgb3V0cC5wdXRzICJjYXNlICN7b3ZlcmxvYWQu
c2lnbmF0dXJlLmxlbmd0aH06IgorICAgICAgICAgICAgICAgIGNvbHVtbkdldHRlciA9IHByb2Mg
eyB8IGNvbHVtbkluZGV4IHwgImtpbmRzWyN7Y29sdW1uSW5kZXh9XSIgfQorICAgICAgICAgICAg
ICAgIGZpbHRlciA9IHByb2MgeyBmYWxzZSB9CisgICAgICAgICAgICAgICAgY2FsbGJhY2sgPSBw
cm9jIHsKKyAgICAgICAgICAgICAgICAgICAgfCBmb3JtIHwKKyAgICAgICAgICAgICAgICAgICAg
c3BlY2lhbCA9IChub3QgZm9ybS5raW5kcy5kZXRlY3QgeyB8IGtpbmQgfCBraW5kLnNwZWNpYWwg
fSkKKyAgICAgICAgICAgICAgICAgICAgb3V0cC5wdXRzICJPUEdFTl9SRVRVUk4oI3tzcGVjaWFs
fSk7IgorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBtYXRjaEZvcm1zKG91dHAs
IDpzYWZlLCBvdmVybG9hZC5mb3JtcywgMCwgY29sdW1uR2V0dGVyLCBmaWx0ZXIsIGNhbGxiYWNr
KQorICAgICAgICAgICAgICAgIG91dHAucHV0cyAiYnJlYWs7IgorICAgICAgICAgICAgfQorICAg
ICAgICBlbmQKKyAgICAgICAgb3V0cC5wdXRzICJkZWZhdWx0OiIKKyAgICAgICAgb3V0cC5wdXRz
ICJicmVhazsiCisgICAgICAgIG91dHAucHV0cyAifSIKKyAgICAgICAgb3V0cC5wdXRzICJicmVh
azsiCisgICAgfQorICAgIG91dHAucHV0cyAiZGVmYXVsdDoiCisgICAgb3V0cC5wdXRzICJicmVh
azsiCisgICAgb3V0cC5wdXRzICJ9IgorICAgIG91dHAucHV0cyAicmV0dXJuIGZhbHNlOyAiCisg
ICAgb3V0cC5wdXRzICJ9IgorICAgIAorICAgIG91dHAucHV0cyAifSB9IH0gLy8gbmFtZXNwYWNl
IEpTQzo6QjM6OkFpciIKK30KKword3JpdGVDUFAoIk9wY29kZVV0aWxzIikgeworICAgIHwgb3V0
cCB8CisgICAgb3V0cC5wdXRzICIjaW5jbHVkZSBcIkFpckluc3RJbmxpbmVzLmhcIiIKKyAgICBv
dXRwLnB1dHMgIm5hbWVzcGFjZSBKU0MgeyBuYW1lc3BhY2UgQjMgeyBuYW1lc3BhY2UgQWlyIHsi
CisgICAgb3V0cC5wdXRzICJib29sIEluc3Q6OmlzVmFsaWRGb3JtKCkiCisgICAgb3V0cC5wdXRz
ICJ7IgorICAgIG1hdGNoSW5zdE92ZXJsb2FkRm9ybShvdXRwLCA6c2FmZSwgInRoaXMiKSB7Cisg
ICAgICAgIHwgb3Bjb2RlLCBvdmVybG9hZCwgZm9ybSB8CisgICAgICAgIGlmIG9wY29kZS5zcGVj
aWFsCisgICAgICAgICAgICBvdXRwLnB1dHMgImlmIChhcmdzLnNpemUoKSA8IDEpIgorICAgICAg
ICAgICAgb3V0cC5wdXRzICJyZXR1cm4gZmFsc2U7IgorICAgICAgICAgICAgb3V0cC5wdXRzICJp
ZiAoIWFyZ3NbMF0uaXNTcGVjaWFsKCkpIgorICAgICAgICAgICAgb3V0cC5wdXRzICJyZXR1cm4g
ZmFsc2U7IgorICAgICAgICAgICAgb3V0cC5wdXRzICJPUEdFTl9SRVRVUk4oYXJnc1swXS5zcGVj
aWFsKCktPmlzVmFsaWQoKnRoaXMpKTsiCisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIG5lZWRz
TW9yZVZhbGlkYXRpb24gPSBmYWxzZQorICAgICAgICAgICAgb3ZlcmxvYWQuc2lnbmF0dXJlLmxl
bmd0aC50aW1lcyB7CisgICAgICAgICAgICAgICAgfCBpbmRleCB8CisgICAgICAgICAgICAgICAg
cm9sZSA9IG92ZXJsb2FkLnNpZ25hdHVyZVtpbmRleF0ucm9sZQorICAgICAgICAgICAgICAgIHR5
cGUgPSBvdmVybG9hZC5zaWduYXR1cmVbaW5kZXhdLnR5cGUKKyAgICAgICAgICAgICAgICBraW5k
ID0gZm9ybS5raW5kc1tpbmRleF0KKyAgICAgICAgICAgICAgICBuZWVkc01vcmVWYWxpZGF0aW9u
IHw9IGtpbmQuc3BlY2lhbAorICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICMgV2Ug
YWxyZWFkeSBrbm93IHRoYXQgdGhlIGZvcm0gbWF0Y2hlcy4gV2UgZG9uJ3QgaGF2ZSB0byB2YWxp
ZGF0ZSB0aGUgcm9sZSwgc2luY2UKKyAgICAgICAgICAgICAgICAjIGtpbmQgaW1wbGllcyByb2xl
LiBTbywgdGhlIG9ubHkgdGhpbmcgbGVmdCB0byB2YWxpZGF0ZSBpcyB0aGUgdHlwZS4gQW5kIHdl
IG9ubHkgaGF2ZQorICAgICAgICAgICAgICAgICMgdG8gdmFsaWRhdGUgdGhlIHR5cGUgaWYgd2Ug
aGF2ZSBhIFRtcC4KKyAgICAgICAgICAgICAgICBpZiBraW5kLm5hbWUgPT0gIlRtcCIKKyAgICAg
ICAgICAgICAgICAgICAgb3V0cC5wdXRzICJpZiAoIWFyZ3NbI3tpbmRleH1dLnRtcCgpLmlzI3t0
eXBlfVAoKSkiCisgICAgICAgICAgICAgICAgICAgIG91dHAucHV0cyAiT1BHRU5fUkVUVVJOKGZh
bHNlKTsiCisgICAgICAgICAgICAgICAgZW5kCisgICAgICAgICAgICB9CisgICAgICAgICAgICBp
ZiBuZWVkc01vcmVWYWxpZGF0aW9uCisgICAgICAgICAgICAgICAgb3V0cC5wdXRzICJpZiAoIWlz
I3tvcGNvZGUubmFtZX1WYWxpZCh0aGlzKSkiCisgICAgICAgICAgICAgICAgb3V0cC5wdXRzICJP
UEdFTl9SRVRVUk4oZmFsc2UpOyIKKyAgICAgICAgICAgIGVuZAorICAgICAgICAgICAgb3V0cC5w
dXRzICJPUEdFTl9SRVRVUk4odHJ1ZSk7IgorICAgICAgICBlbmQKKyAgICB9CisgICAgb3V0cC5w
dXRzICJyZXR1cm4gZmFsc2U7IgorICAgIG91dHAucHV0cyAifSIKKworICAgIG91dHAucHV0cyAi
Ym9vbCBJbnN0OjphZG1pdHNTdGFjayh1bnNpZ25lZCBhcmdJbmRleCkiCisgICAgb3V0cC5wdXRz
ICJ7IgorICAgIG91dHAucHV0cyAic3dpdGNoIChvcGNvZGUpIHsiCisgICAgJG9wY29kZXMudmFs
dWVzLmVhY2ggeworICAgICAgICB8IG9wY29kZSB8CisgICAgICAgIG91dHAucHV0cyAiY2FzZSAj
e29wY29kZS5uYW1lfToiCisKKyAgICAgICAgaWYgb3Bjb2RlLnNwZWNpYWwKKyAgICAgICAgICAg
IG91dHAucHV0cyAiaWYgKCFhcmdJbmRleCkiCisgICAgICAgICAgICBvdXRwLnB1dHMgInJldHVy
biBmYWxzZTsiCisgICAgICAgICAgICBvdXRwLnB1dHMgIk9QR0VOX1JFVFVSTihhcmdzWzBdLnNw
ZWNpYWwoKS0+YWRtaXRzU3RhY2soKnRoaXMsIGFyZ0luc3QpKTsiCisgICAgICAgIGVsc2UKKyAg
ICAgICAgICAgICMgU3dpdGNoIG9uIHRoZSBhcmdJbmRleC4KKyAgICAgICAgICAgIG91dHAucHV0
cyAic3dpdGNoIChhcmdJbmRleCkgeyIKKworICAgICAgICAgICAgbnVtQXJncyA9IG9wY29kZS5v
dmVybG9hZHMubWFwIHsKKyAgICAgICAgICAgICAgICB8IG92ZXJsb2FkIHwKKyAgICAgICAgICAg
ICAgICBvdmVybG9hZC5zaWduYXR1cmUubGVuZ3RoCisgICAgICAgICAgICB9Lm1heAorICAgICAg
ICAgICAgCisgICAgICAgICAgICBudW1BcmdzLnRpbWVzIHsKKyAgICAgICAgICAgICAgICB8IGFy
Z0luZGV4IHwKKyAgICAgICAgICAgICAgICBvdXRwLnB1dHMgImNhc2UgI3thcmdJbmRleH06Igor
CisgICAgICAgICAgICAgICAgIyBDaGVjayBpZiBhbGwgb2YgdGhlIGZvcm1zIG9mIGFsbCBvZiB0
aGUgb3ZlcmxvYWRzIGVpdGhlciBkbywgb3IgZG9uJ3QsIGFkbWl0IGFuIGFkZHJlc3MKKyAgICAg
ICAgICAgICAgICAjIGF0IHRoaXMgaW5kZXguIFdlIGV4cGVjdCB0aGlzIHRvIGJlIGEgdmVyeSBj
b21tb24gY2FzZS4KKyAgICAgICAgICAgICAgICBudW1ZZXMgPSAwCisgICAgICAgICAgICAgICAg
bnVtTm8gPSAwCisgICAgICAgICAgICAgICAgb3Bjb2RlLm92ZXJsb2Fkcy5lYWNoIHsKKyAgICAg
ICAgICAgICAgICAgICAgfCBvdmVybG9hZCB8CisgICAgICAgICAgICAgICAgICAgIG92ZXJsb2Fk
LmZvcm1zLmVhY2ggeworICAgICAgICAgICAgICAgICAgICAgICAgfCBmb3JtIHwKKyAgICAgICAg
ICAgICAgICAgICAgICAgIGlmIGZvcm0ua2luZHNbYXJnSW5kZXhdID09ICJBZGRyIgorICAgICAg
ICAgICAgICAgICAgICAgICAgICAgIG51bVllcyArPSAxCisgICAgICAgICAgICAgICAgICAgICAg
ICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtTm8gKz0gMQorICAgICAgICAg
ICAgICAgICAgICAgICAgZW5kCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAg
ICB9CisKKyAgICAgICAgICAgICAgICAjIE5vdGUgdGhhdCB3ZSBkZWxpYmVyYXRlbHkgdGVzdCBu
dW1ZZXMgZmlyc3QgYmVjYXVzZSBpZiB3ZSBlbmQgdXAgd2l0aCBubyBmb3Jtcywgd2Ugd2FudAor
ICAgICAgICAgICAgICAgICMgdG8gc2F5IHRoYXQgQWRkcmVzcyBpcyBpbmFkbWlzc2libGUuCisg
ICAgICAgICAgICAgICAgaWYgbnVtWWVzID09IDAKKyAgICAgICAgICAgICAgICAgICAgb3V0cC5w
dXRzICJPUEdFTl9SRVRVUk4oZmFsc2UpOyIKKyAgICAgICAgICAgICAgICBlbHNpZiBudW1ObyA9
PSAwCisgICAgICAgICAgICAgICAgICAgIG91dHAucHV0cyAiT1BHRU5fUkVUVVJOKHRydWUpOyIK
KyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICMgTm93IGRvIHRoZSBm
dWxsIHRlc3QuCisKKyAgICAgICAgICAgICAgICAgICAgbmVlZE92ZXJsb2FkU3dpdGNoID0gKG9w
Y29kZS5vdmVybG9hZHMuc2l6ZSAhPSAxKQorCisgICAgICAgICAgICAgICAgICAgIG91dHAucHV0
cyAic3dpdGNoIChhcmdzLnNpemUoKSkgeyIgaWYgbmVlZE92ZXJsb2FkU3dpdGNoCisgICAgICAg
ICAgICAgICAgICAgIG9wY29kZS5vdmVybG9hZHMuZWFjaCB7CisgICAgICAgICAgICAgICAgICAg
ICAgICB8IG92ZXJsb2FkIHwKKworICAgICAgICAgICAgICAgICAgICAgICAgIyBBZ2FpbiwgY2hl
Y2sgaWYgYWxsIG9mIHRoZW0gZG8gd2hhdCB3ZSB3YW50LgorICAgICAgICAgICAgICAgICAgICAg
ICAgbnVtWWVzID0gMAorICAgICAgICAgICAgICAgICAgICAgICAgbnVtTm8gPSAwCisgICAgICAg
ICAgICAgICAgICAgICAgICBvdmVybG9hZC5mb3Jtcy5lYWNoIHsKKyAgICAgICAgICAgICAgICAg
ICAgICAgICAgICB8IGZvcm0gfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIGZvcm0u
a2luZHNbYXJnSW5kZXhdID09ICJBZGRyIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICBudW1ZZXMgKz0gMQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgbnVtTm8gKz0gMQorICAgICAgICAgICAgICAgICAgICAg
ICAgICAgIGVuZAorICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAg
ICAgICAgICBpZiBudW1ZZXMgPT0gMAorICAgICAgICAgICAgICAgICAgICAgICAgIyBEb24ndCBl
bWl0IGFueXRoaW5nLCBqdXN0IGRyb3AgdG8gZGVmYXVsdC4KKyAgICAgICAgICAgICAgICAgICAg
ICAgIGVsc2lmIG51bU5vID09IDAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwLnB1
dHMgImNhc2UgI3tvdmVybG9hZC5zaWduYXR1cmUubGVuZ3RofToiIGlmIG5lZWRPdmVybG9hZFN3
aXRjaAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHAucHV0cyAiT1BHRU5fUkVUVVJO
KHRydWUpOyIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwLnB1dHMgImJyZWFrOyIg
aWYgbmVlZE92ZXJsb2FkU3dpdGNoCisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgb3V0cC5wdXRzICJjYXNlICN7b3ZlcmxvYWQuc2lnbmF0
dXJlLmxlbmd0aH06IiBpZiBuZWVkT3ZlcmxvYWRTd2l0Y2gKKworICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICMgVGhpcyBpcyBob3cgd2UgdGVzdCB0aGUgaHlwb3RoZXNpcyB0aGF0IGNoYW5n
aW5nIHRoaXMgYXJndW1lbnQgdG8gYW4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIGFk
ZHJlc3MgeWllbGRzIGEgdmFsaWQgZm9ybS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBj
b2x1bW5HZXR0ZXIgPSBwcm9jIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBj
b2x1bW5JbmRleCB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIGNvbHVtbklu
ZGV4ID09IGFyZ0luZGV4CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQXJn
OjpBZGRyIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAiYXJnc1sje2NvbHVtbkluZGV4fV0ua2luZCgpIgor
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmQKKyAgICAgICAgICAgICAgICAgICAg
ICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyID0gcHJvYyB7Cisg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgZm9ybXMgfAorICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICBudW1ZZXMgPSAwCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgZm9ybXMuZWFjaCB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8
IGZvcm0gfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgZm9ybS5raW5k
c1thcmdJbmRleF0gPT0gIkFkZHIiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgbnVtWWVzICs9IDEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVu
ZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgaWYgbnVtWWVzID09IDAKKyAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICMgRHJvcCBkb3duLCBlbWl0IG5vIGNvZGUsIHNpbmNlIHdlIGNhbm5vdCBtYXRj
aC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRydWUKKyAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgIyBLZWVwIGdvaW5nLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ZmFsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5kCisgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrID0g
cHJvYyB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHAucHV0cyAiT1BHRU5f
UkVUVVJOKHRydWUpOyIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgbWF0Y2hGb3JtcyhvdXRwLCA6c2FmZSwgb3ZlcmxvYWQuZm9ybXMs
IDAsIGNvbHVtbkdldHRlciwgZmlsdGVyLCBjYWxsYmFjaykKKworICAgICAgICAgICAgICAgICAg
ICAgICAgICAgIG91dHAucHV0cyAiYnJlYWs7IiBpZiBuZWVkT3ZlcmxvYWRTd2l0Y2gKKyAgICAg
ICAgICAgICAgICAgICAgICAgIGVuZAorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAg
ICAgICAgICAgIGlmIG5lZWRPdmVybG9hZFN3aXRjaAorICAgICAgICAgICAgICAgICAgICAgICAg
b3V0cC5wdXRzICJkZWZhdWx0OiIKKyAgICAgICAgICAgICAgICAgICAgICAgIG91dHAucHV0cyAi
YnJlYWs7IgorICAgICAgICAgICAgICAgICAgICAgICAgb3V0cC5wdXRzICJ9IgorICAgICAgICAg
ICAgICAgICAgICBlbmQKKyAgICAgICAgICAgICAgICBlbmQKKyAgICAgICAgICAgICAgICAKKyAg
ICAgICAgICAgICAgICBvdXRwLnB1dHMgImJyZWFrOyIKKyAgICAgICAgICAgIH0KKyAgICAgICAg
ICAgIAorICAgICAgICAgICAgb3V0cC5wdXRzICJkZWZhdWx0OiIKKyAgICAgICAgICAgIG91dHAu
cHV0cyAiYnJlYWs7IgorICAgICAgICAgICAgb3V0cC5wdXRzICJ9IgorICAgICAgICBlbmQKKyAg
ICAgICAgCisgICAgICAgIG91dHAucHV0cyAiYnJlYWs7IgorICAgIH0KKyAgICBvdXRwLnB1dHMg
ImRlZmF1bHQ6IjsKKyAgICBvdXRwLnB1dHMgImJyZWFrOyIKKyAgICBvdXRwLnB1dHMgIn0iCisg
ICAgb3V0cC5wdXRzICJyZXR1cm4gZmFsc2U7IgorICAgIG91dHAucHV0cyAifSIKKworICAgIG91
dHAucHV0cyAiQ0NhbGxIZWxwZXJzOjpKdW1wIEluc3Q6OmdlbmVyYXRlKENDYWxsSGVscGVycyYg
aml0LCBHZW5lcmF0aW9uQ29udGV4dCYgY29udGV4dCkgY29uc3QiCisgICAgb3V0cC5wdXRzICJ7
IgorICAgIG91dHAucHV0cyAiVU5VU0VEX1BBUkFNKGppdCk7IgorICAgIG91dHAucHV0cyAiVU5V
U0VEX1BBUkFNKGNvbnRleHQpOyIKKyAgICBvdXRwLnB1dHMgIkNDYWxsSGVscGVyczo6SnVtcCBy
ZXN1bHQ7IgorICAgIG1hdGNoSW5zdE92ZXJsb2FkRm9ybShvdXRwLCA6ZmFzdCwgInRoaXMiKSB7
CisgICAgICAgIHwgb3Bjb2RlLCBvdmVybG9hZCwgZm9ybSB8CisgICAgICAgIGlmIG9wY29kZS5z
cGVjaWFsCisgICAgICAgICAgICBvdXRwLnB1dHMgIk9QR0VOX1JFVFVSTihhcmdzWzBdLnNwZWNp
YWwoKS0+Z2VuZXJhdGUoKnRoaXMsIGppdCwgY29udGV4dCkpOyIKKyAgICAgICAgZWxzZQorICAg
ICAgICAgICAgaWYgZm9ybS5hbHROYW1lCisgICAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9IGZv
cm0uYWx0TmFtZQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIG1ldGhvZE5hbWUg
PSBvcGNvZGUubWFzbU5hbWUKKyAgICAgICAgICAgIGVuZAorICAgICAgICAgICAgaWYgb3Bjb2Rl
LmJyYW5jaAorICAgICAgICAgICAgICAgIG91dHAucHJpbnQgInJlc3VsdCA9ICIKKyAgICAgICAg
ICAgIGVuZAorICAgICAgICAgICAgb3V0cC5wcmludCAiaml0LiN7bWV0aG9kTmFtZX0oIgorCisg
ICAgICAgICAgICBmb3JtLmtpbmRzLmVhY2hfd2l0aF9pbmRleCB7CisgICAgICAgICAgICAgICAg
fCBraW5kLCBpbmRleCB8CisgICAgICAgICAgICAgICAgaWYgaW5kZXggIT0gMAorICAgICAgICAg
ICAgICAgICAgICBvdXRwLnByaW50ICIsICIKKyAgICAgICAgICAgICAgICBlbmQKKyAgICAgICAg
ICAgICAgICBjYXNlIGtpbmQubmFtZQorICAgICAgICAgICAgICAgIHdoZW4gIlRtcCIKKyAgICAg
ICAgICAgICAgICAgICAgaWYgb3ZlcmxvYWQuc2lnbmF0dXJlW2luZGV4XS50eXBlID09ICJHIgor
ICAgICAgICAgICAgICAgICAgICAgICAgb3V0cC5wcmludCAiYXJnc1sje2luZGV4fV0uZ3ByKCki
CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgIG91dHAu
cHJpbnQgImFyZ3NbI3tpbmRleH1dLmZwcigpIgorICAgICAgICAgICAgICAgICAgICBlbmQKKyAg
ICAgICAgICAgICAgICB3aGVuICJJbW0iCisgICAgICAgICAgICAgICAgICAgIG91dHAucHJpbnQg
ImFyZ3NbI3tpbmRleH1dLmFzVHJ1c3RlZEltbTMyKCkiCisgICAgICAgICAgICAgICAgd2hlbiAi
SW1tNjQiCisgICAgICAgICAgICAgICAgICAgIG91dHAucHJpbnQgImFyZ3NbI3tpbmRleH1dLmFz
VHJ1c3RlZEltbTY0KCkiCisgICAgICAgICAgICAgICAgd2hlbiAiQWRkciIKKyAgICAgICAgICAg
ICAgICAgICAgb3V0cC5wcmludCAiYXJnc1sje2luZGV4fV0uYXNBZGRyZXNzKCkiCisgICAgICAg
ICAgICAgICAgd2hlbiAiSW5kZXgiCisgICAgICAgICAgICAgICAgICAgIG91dHAucHJpbnQgImFy
Z3NbI3tpbmRleH1dLmFzQmFzZUluZGV4KCkiCisgICAgICAgICAgICAgICAgd2hlbiAiUmVsQ29u
ZCIKKyAgICAgICAgICAgICAgICAgICAgb3V0cC5wcmludCAiYXJnc1sje2luZGV4fV0uYXNSZWxh
dGlvbmFsQ29uZGl0aW9uKCkiCisgICAgICAgICAgICAgICAgd2hlbiAiUmVzQ29uZCIKKyAgICAg
ICAgICAgICAgICAgICAgb3V0cC5wcmludCAiYXJnc1sje2luZGV4fV0uYXNSZXN1bHRDb25kaXRp
b24oKSIKKyAgICAgICAgICAgICAgICBlbmQKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAg
b3V0cC5wdXRzICIpOyIKKyAgICAgICAgICAgIG91dHAucHV0cyAiT1BHRU5fUkVUVVJOKHJlc3Vs
dCk7IgorICAgICAgICBlbmQKKyAgICB9CisgICAgb3V0cC5wdXRzICJSRUxFQVNFX0FTU0VSVF9O
T1RfUkVBQ0hFRCgpOyIKKyAgICBvdXRwLnB1dHMgInJldHVybiByZXN1bHQ7IgorICAgIG91dHAu
cHV0cyAifSIKKworICAgIG91dHAucHV0cyAifSB9IH0gLy8gbmFtZXNwYWNlIEpTQzo6QjM6OkFp
ciIKK30KKwpJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL2ppdC9SZWcuaAo9PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvaml0L1JlZy5oCShyZXZpc2lvbiAxOTEyMzkpCisr
KyBTb3VyY2UvSmF2YVNjcmlwdENvcmUvaml0L1JlZy5oCSh3b3JraW5nIGNvcHkpCkBAIC0xMDUs
NyArMTA1LDYgQEAgcHVibGljOgogICAgIHVuc2lnbmVkIGluZGV4KCkgY29uc3QgeyByZXR1cm4g
bV9pbmRleDsgfQogICAgIAogICAgIGJvb2wgaXNTZXQoKSBjb25zdCB7IHJldHVybiBtX2luZGV4
ICE9IGludmFsaWQoKTsgfQotICAgIGJvb2wgb3BlcmF0b3IhKCkgY29uc3QgeyByZXR1cm4gIWlz
U2V0KCk7IH0KICAgICBleHBsaWNpdCBvcGVyYXRvciBib29sKCkgY29uc3QgeyByZXR1cm4gaXNT
ZXQoKTsgfQogCiAgICAgYm9vbCBpc0hhc2hUYWJsZURlbGV0ZWRWYWx1ZSgpIGNvbnN0IHsgcmV0
dXJuIG1faW5kZXggPT0gZGVsZXRlZCgpOyB9CkBAIC0xNzAsNiArMTY5LDQ2IEBAIHB1YmxpYzoK
ICAgICAKICAgICB2b2lkIGR1bXAoUHJpbnRTdHJlYW0mKSBjb25zdDsKIAorICAgIGNsYXNzIEFs
bFJlZ3NJdGVyYWJsZSB7CisgICAgcHVibGljOgorCisgICAgICAgIGNsYXNzIGl0ZXJhdG9yIHsK
KyAgICAgICAgcHVibGljOgorICAgICAgICAgICAgaXRlcmF0b3IoKSB7IH0KKworICAgICAgICAg
ICAgZXhwbGljaXQgaXRlcmF0b3IoUmVnIHJlZykKKyAgICAgICAgICAgICAgICA6IG1fcmVnKHJl
ZykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgUmVnIG9wZXJh
dG9yKigpIGNvbnN0IHsgcmV0dXJuIG1fcmVnOyB9CisKKyAgICAgICAgICAgIGl0ZXJhdG9yJiBv
cGVyYXRvcisrKCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtX3JlZyA9IG1fcmVn
Lm5leHQoKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gKnRoaXM7CisgICAgICAgICAgICB9CisK
KyAgICAgICAgICAgIGJvb2wgb3BlcmF0b3I9PShjb25zdCBpdGVyYXRvciYgb3RoZXIpIGNvbnN0
CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG1fcmVnID09IG90aGVyLm1f
cmVnOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBib29sIG9wZXJhdG9yIT0oY29uc3Qg
aXRlcmF0b3ImIG90aGVyKSBjb25zdAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJl
dHVybiAhKCp0aGlzID09IG90aGVyKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICBwcml2YXRl
OgorICAgICAgICAgICAgUmVnIG1fcmVnOworICAgICAgICB9OworCisgICAgICAgIGl0ZXJhdG9y
IGJlZ2luKCkgY29uc3QgeyByZXR1cm4gaXRlcmF0b3IoUmVnOjpmaXJzdCgpKTsgfQorICAgICAg
ICBpdGVyYXRvciBlbmQoKSBjb25zdCB7IHJldHVybiBpdGVyYXRvcihSZWcoKSk7IH0KKyAgICB9
OworCisgICAgc3RhdGljIEFsbFJlZ3NJdGVyYWJsZSBhbGwoKSBjb25zdCB7IHJldHVybiBBbGxS
ZWdzSXRlcmFibGUoKTsgfQorCiBwcml2YXRlOgogICAgIHN0YXRpYyB1aW50OF90IGludmFsaWQo
KSB7IHJldHVybiAweGZmOyB9CiAKSW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9qaXQvUmVn
aXN0ZXJTZXQuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvaml0L1JlZ2lz
dGVyU2V0LmgJKHJldmlzaW9uIDE5MTIzOSkKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9qaXQv
UmVnaXN0ZXJTZXQuaAkod29ya2luZyBjb3B5KQpAQCAtMTE3LDYgKzExNywxMyBAQCBwdWJsaWM6
CiAgICAgCiAgICAgYm9vbCBvcGVyYXRvcj09KGNvbnN0IFJlZ2lzdGVyU2V0JiBvdGhlcikgY29u
c3QgeyByZXR1cm4gbV92ZWN0b3IgPT0gb3RoZXIubV92ZWN0b3I7IH0KICAgICB1bnNpZ25lZCBo
YXNoKCkgY29uc3QgeyByZXR1cm4gbV92ZWN0b3IuaGFzaCgpOyB9CisKKyAgICB0ZW1wbGF0ZTx0
eXBlbmFtZSBGdW5jdG9yPgorICAgIHZvaWQgZm9yRWFjaChjb25zdCBGdW5jdG9yJiBmdW5jdG9y
KQorICAgIHsKKyAgICAgICAgZm9yIChzaXplX3QgaW5kZXggOiBtX3ZlY3Rvci5zZXRCaXRzKCkp
CisgICAgICAgICAgICBmdW5jdG9yKFJlZzo6ZnJvbUluZGV4KGluZGV4KSk7CisgICAgfQogICAg
IAogcHJpdmF0ZToKICAgICB2b2lkIHNldEFueShSZWcgcmVnKSB7IHNldChyZWcpOyB9CkluZGV4
OiBTb3VyY2UvV1RGL3d0Zi9CaXRWZWN0b3IuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV1RGL3d0
Zi9CaXRWZWN0b3IuaAkocmV2aXNpb24gMTkxMjM5KQorKysgU291cmNlL1dURi93dGYvQml0VmVj
dG9yLmgJKHdvcmtpbmcgY29weSkKQEAgLTMyMCw3ICszMjAsNyBAQCBwdWJsaWM6IAogICAgIH07
CiAgICAgCiAgICAgU2V0Qml0c0l0ZXJhYmxlIHNldEJpdHMoKSBjb25zdCB7IHJldHVybiBTZXRC
aXRzSXRlcmFibGUoKnRoaXMpOyB9Ci0gICAgCisKIHByaXZhdGU6CiAgICAgc3RhdGljIHVuc2ln
bmVkIGJpdHNJblBvaW50ZXIoKQogICAgIHsKSW5kZXg6IFNvdXJjZS9XVEYvd3RmL1Njb3BlZExh
bWJkYS5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9XVEYvd3RmL1Njb3BlZExhbWJkYS5oCShyZXZp
c2lvbiAwKQorKysgU291cmNlL1dURi93dGYvU2NvcGVkTGFtYmRhLmgJKHdvcmtpbmcgY29weSkK
QEAgLTAsMCArMSwxMDIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTUgQXBwbGUgSW5jLiBB
bGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291
cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBh
cmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBh
cmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWlu
IHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlv
bnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBp
biBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBu
b3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWlt
ZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJv
dmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJP
VklERUQgQlkgQVBQTEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBM
SUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElN
UExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFS
VElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQ
UExFIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElO
RElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5U
SUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1F
TlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9S
CisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFO
RCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNU
UklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhF
UldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZU
V0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4g
CisgKi8KKworI2lmbmRlZiBTY29wZWRMYW1iZGFfaAorI2RlZmluZSBTY29wZWRMYW1iZGFfaAor
CituYW1lc3BhY2UgV1RGIHsKKworLy8gWW91IGNhbiB1c2UgU2NvcGVkTGFtYmRhIHRvIGVmZmlj
aWVudGx5IHBhc3MgbGFtYmRhcyB3aXRob3V0IGFsbG9jYXRpbmcgbWVtb3J5IG9yIHJlcXVpcmlu
ZworLy8gdGVtcGxhdGUgc3BlY2lhbGl6YXRpb24gb2YgdGhlIGNhbGxlZS4gVGhlIGNhbGxlZSBz
aG91bGQgYmUgZGVjbGFyZWQgYXM6CisvLworLy8gdm9pZCBmb28oY29uc3QgU2NvcGVkTGFtYmRh
PE15VGhpbmdzKiAoaW50LCBTdHVmZiYpPiYpOworLy8KKy8vIFRoZSBjYWxsZXIganVzdCBkb2Vz
OgorLy8KKy8vIHZvaWQgZm9vKHNjb3BlZExhbWJkYTxNeVRoaW5ncyogKGludCwgU3R1ZmYmKT4o
WyZdIChpbnQgeCwgU3R1ZmYmIHkpIC0+IE15VGhpbmdzKiB7IGJsYWggfSkpOworLy8KKy8vIE5v
dGUgdGhhdCB0aGlzIHJlbGllcyBvbiBmb28oKSBub3QgZXNjYXBpbmcgdGhlIGxhbWJkYS4gVGhl
IGxhbWJkYSBpcyBvbmx5IHZhbGlkIHdoaWxlIGZvbygpIGlzCisvLyBvbiB0aGUgc3RhY2sgLSBo
ZW5jZSB0aGUgbmFtZSBTY29wZWRMYW1iZGEuCisKK3RlbXBsYXRlPHR5cGVuYW1lIEZ1bmN0aW9u
VHlwZT4gY2xhc3MgU2NvcGVkTGFtYmRhOwordGVtcGxhdGU8dHlwZW5hbWUgUmVzdWx0VHlwZSwg
dHlwZW5hbWUuLi4gQXJndW1lbnRUeXBlcz4KK2NsYXNzIFNjb3BlZExhbWJkYTxSZXN1bHRUeXBl
IChBcmd1bWVudFR5cGVzLi4uKT4geworcHVibGljOgorICAgIFNjb3BlZExhbWJkYShSZXN1bHRU
eXBlICgqaW1wbCkodm9pZCogYXJnLCBBcmd1bWVudFR5cGVzJiYuLi4pID0gbnVsbHB0ciwgdm9p
ZCogYXJnID0gbnVsbHB0cikKKyAgICAgICAgOiBtX2ltcGwoaW1wbCkKKyAgICAgICAgLCBtX2Fy
ZyhhcmcpCisgICAgeworICAgIH0KKyAgICAKKyAgICB+U2NvcGVkTGFtYmRhKCkKKyAgICB7Cisg
ICAgfQorCisgICAgUmVzdWx0VHlwZSBvcGVyYXRvcigpKEFyZ3VtZW50VHlwZXMmJi4uLiBhcmd1
bWVudHMpCisgICAgeworICAgICAgICByZXR1cm4gbV9pbXBsKG1fYXJnLCBzdGQ6OmZvcndhcmQ8
QXJndW1lbnRUeXBlcz4oYXJndW1lbnRzKS4uLik7CisgICAgfQorCitwcml2YXRlOgorICAgIFJl
c3VsdFR5cGUgKCppbXBsKSh2b2lkKiBhcmcsIEFyZ3VtZW50VHlwZXMmJi4uLikgbV9pbXBsOwor
ICAgIHZvaWQgKm1fYXJnOworfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgRnVuY3Rpb25UeXBlLCB0
eXBlbmFtZSBGdW5jdG9yPiBTY29wZWRMYW1iZGFGdW5jdG9yOwordGVtcGxhdGU8dHlwZW5hbWUg
UmVzdWx0VHlwZSwgdHlwZW5hbWUuLi4gQXJndW1lbnRUeXBlcywgdHlwZW5hbWUgRnVuY3Rvcj4K
K2NsYXNzIFNjb3BlZExhbWJkYUZ1bmN0b3I8UmVzdWx0VHlwZSAoQXJndW1lbnRUeXBlcy4uLiks
IEZ1bmN0b3I+IDogcHVibGljIFNjb3BlZExhbWJkYTxSZXN1bHRUeXBlIChBcmd1bWVudFR5cGVz
Li4uKT4geworcHVibGljOgorICAgIFNjb3BlZExhbWJkYUZ1bmN0b3IoY29uc3QgRnVuY3RvciYg
ZnVuY3RvcikKKyAgICAgICAgOiBTY29wZWRMYW1iZGEoaW1wbEZ1bmN0aW9uLCB0aGlzKQorICAg
ICAgICAsIG1fZnVuY3RvcihmdW5jdG9yKQorICAgIHsKKyAgICB9CisKKyAgICBTY29wZWRMYW1i
ZGFGdW5jdG9yKEZ1bmN0b3ImJiBmdW5jdG9yKQorICAgICAgICA6IFNjb3BlZExhbWJkYShpbXBs
RnVuY3Rpb24sIHRoaXMpCisgICAgICAgICwgbV9mdW5jdG9yKFdURjo6bW92ZShmdW5jdG9yKSkK
KyAgICB7CisgICAgfQorCitwcml2YXRlOgorICAgIHN0YXRpYyBSZXN1bHRUeXBlIGltcGxGdW5j
dGlvbih2b2lkKiBhcmd1bWVudCwgQXJndW1lbnRUeXBlcyYmLi4uIGFyZ3VtZW50cykKKyAgICB7
CisgICAgICAgIHJldHVybiBzdGF0aWNfY2FzdDxTY29wZWRMYW1iZGFGdW5jdG9yKj4oYXJndW1l
bnQpLT5tX2Z1bmN0b3IoCisgICAgICAgICAgICBzdGQ6OmZvcndhcmQ8QXJndW1lbnRUeXBlcz4o
YXJndW1lbnRzKS4uLik7CisgICAgfQorCisgICAgRnVuY3RvciBtX2Z1bmN0b3I7Cit9OworCit0
ZW1wbGF0ZTx0eXBlbmFtZSBGdW5jdGlvblR5cGUsIHR5cGVuYW1lIEZ1bmN0b3I+CitTY29wZWRM
YW1iZGFGdW5jdG9yPEZ1bmN0aW9uVHlwZSwgRnVuY3Rvcj4gc2NvcGVkTGFtYmRhKGNvbnN0IEZ1
bmN0b3ImIGZ1bmN0b3IpCit7CisgICAgcmV0dXJuIFNjb3BlZExhbWJkYUZ1bmN0b3I8RnVuY3Rp
b25UeXBlLCBGdW5jdG9yPihmdW5jdG9yKTsKK30KKworfSAvLyBuYW1lc3BhY2UgV1RGCisKKyNl
bmRpZiAvLyBTY29wZWRMYW1iZGFfaAorCkluZGV4OiBTb3VyY2UvV1RGL3d0Zi9TaGFyZWRUYXNr
LmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PQotLS0gU291cmNlL1dURi93dGYvU2hhcmVkVGFzay5oCShyZXZpc2lvbiAx
OTEyMzkpCisrKyBTb3VyY2UvV1RGL3d0Zi9TaGFyZWRUYXNrLmgJKHdvcmtpbmcgY29weSkKQEAg
LTc5LDYgKzc5LDExIEBAIHB1YmxpYzoKICAgICB7CiAgICAgfQogCisgICAgU2hhcmVkVGFza0Z1
bmN0b3IoRnVuY3RvciYmIGZ1bmN0b3IpCisgICAgICAgIDogbV9mdW5jdG9yKFdURjo6bW92ZShm
dW5jdG9yKSkKKyAgICB7CisgICAgfQorCiBwcml2YXRlOgogICAgIFJlc3VsdFR5cGUgcnVuKEFy
Z3VtZW50VHlwZXMmJi4uLiBhcmd1bWVudHMpIG92ZXJyaWRlCiAgICAgewpAQCAtMTEwLDYgKzEx
NSwxMSBAQCBSZWY8U2hhcmVkVGFzazxGdW5jdGlvblR5cGU+PiBjcmVhdGVTaGFyCiB7CiAgICAg
cmV0dXJuIGFkb3B0UmVmKCpuZXcgU2hhcmVkVGFza0Z1bmN0b3I8RnVuY3Rpb25UeXBlLCBGdW5j
dG9yPihmdW5jdG9yKSk7CiB9Cit0ZW1wbGF0ZTx0eXBlbmFtZSBGdW5jdGlvblR5cGUsIHR5cGVu
YW1lIEZ1bmN0b3I+CitSZWY8U2hhcmVkVGFzazxGdW5jdGlvblR5cGU+PiBjcmVhdGVTaGFyZWRU
YXNrKEZ1bmN0b3ImJiBmdW5jdG9yKQoreworICAgIHJldHVybiBhZG9wdFJlZigqbmV3IFNoYXJl
ZFRhc2tGdW5jdG9yPEZ1bmN0aW9uVHlwZSwgRnVuY3Rvcj4oV1RGOjptb3ZlKGZ1bmN0b3IpKSk7
Cit9CiAKIH0gLy8gbmFtZXNwYWNlIFdURgogCg==
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>263746</attachid>
            <date>2015-10-21 15:17:45 -0700</date>
            <delta_ts>2015-10-21 18:26:05 -0700</delta_ts>
            <desc>and now, with a maximal spiller</desc>
            <filename>blah.patch</filename>
            <type>text/plain</type>
            <size>334436</size>
            <attacher name="Filip Pizlo">fpizlo</attacher>
            
              <data encoding="base64">SW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM0FkZHJlc3NNYXRjaGVyLnBhdHRlcm5z
Cj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM0FkZHJlc3NNYXRjaGVy
LnBhdHRlcm5zCShyZXZpc2lvbiAwKQorKysgU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzQWRk
cmVzc01hdGNoZXIucGF0dGVybnMJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSw0MSBAQAorIyBD
b3B5cmlnaHQgKEMpIDIwMTUgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorIworIyBS
ZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9y
IHdpdGhvdXQKKyMgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhl
IGZvbGxvd2luZyBjb25kaXRpb25zCisjIGFyZSBtZXQ6CisjIDEuIFJlZGlzdHJpYnV0aW9ucyBv
ZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisjICAgIG5vdGlj
ZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4K
KyMgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBh
Ym92ZSBjb3B5cmlnaHQKKyMgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQg
dGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorIyAgICBkb2N1bWVudGF0aW9uIGFuZC9v
ciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorIworIyBU
SElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gQU5EIElUUyBDT05UUklCVVRP
UlMgYGBBUyBJUycnCisjIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElO
Q0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorIyBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9G
IE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisjIFBVUlBPU0Ug
QVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IgSVRTIENPTlRS
SUJVVE9SUworIyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFM
LCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCisjIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVE
SU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCisjIFNVQlNUSVRVVEUgR09P
RFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVT
UworIyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJ
QUJJTElUWSwgV0hFVEhFUiBJTgorIyBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9S
VCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorIyBBUklTSU5HIElOIEFOWSBX
QVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GCisj
IFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworbWF0Y2hlciBBZGRyZXNzTWF0Y2hl
cgorCisjIE5vdGUgdGhhdCB0aGlzIHJlbGllcyBvbiBCMyBkb2luZyBhZ2dyZXNzaXZlIHJlYXNz
b2NpYXRpb24gYW5kIGNhbm9uY2FsaXphdGlvbiBvZiBpbnRlZ2VyIGFkZHMuCisjIFdlJ2xsIG5l
dmVyIHNlZSBBZGQoQWRkKHgsIGNvbnN0MSksIGNvbnN0MikgYmVjYXVzZSBpdCB3b3VsZCBoYXZl
IGFscmVhZHkgYmVlbiByZWFzc29jaWF0ZWQgaW50bworIyBBZGQoeCwgY29uc3QxICsgY29uc3Qy
KS4gQWxzbywgd2Ugd2lsbCBuZXZlciBzZWUgQWRkKGNvbnN0LCB4KSwgYmVjYXVzZSB3ZSB3b3Vs
ZCBoYXZlIGNhbm9uaWNhbGl6ZWQKKyMgaXQgdG8gQWRkKHgsIGNvbnN0KS4gVGhhdCBzYWlkLCBp
biB0aGlzIGNvZGUgd2UgbmV2ZXIgbWFrZSBhc3NlcnRpb25zIGFib3V0IHRoZXNlIG9wdGltaXph
dGlvbnMKKyMgaGF2aW5nIGJlZW4gcGVyZm9ybWVkLiBBbHNvLCBzaW5jZSB0aGUgTG9hZC9TdG9y
ZSBpbnN0cnVjdGlvbnMgaW4gQjMgaGF2ZSBhIGJ1aWx0LWluIG9mZnNldCwgd2UKKyMgZG9uJ3Qg
bmVlZCB0byBtYXRjaCBBZGQoeCwgY29uc3QpLiBUaGF0IHdvdWxkIGhhdmUgYmVlbiBmb2xkZWQg
aW50byB0aGUgTG9hZC9TdG9yZSBpbnN0cnVjdGlvbnMKKyMgYWxyZWFkeS4gU28sIHRoZSBvbmx5
IGZhbmN5IG1hdGhpbmcgdGhpcyBjYW4gZG8gaXMganVzdCBCYXNlSW5kZXggZm9ybXMuCisKK0Fk
ZFNoaWZ0MSA9IEFkZChTaGwoaW5kZXgsICRsb2dTY2FsZSksIGJhc2UpCitBZGRTaGlmdDIgPSBB
ZGQoYmFzZSwgU2hsKGluZGV4LCAkbG9nU2NhbGUpKQorCitBZGQgPSBBZGQobGVmdCwgcmlnaHQp
CisKKyRDb25zdAorCitEaXJlY3QKSW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM0Fy
Z3VtZW50UmVnVmFsdWUuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9i
My9CM0FyZ3VtZW50UmVnVmFsdWUuY3BwCShyZXZpc2lvbiAwKQorKysgU291cmNlL0phdmFTY3Jp
cHRDb3JlL2IzL0IzQXJndW1lbnRSZWdWYWx1ZS5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTAsMCAr
MSw0MSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNSBBcHBsZSBJbmMuIEFsbCByaWdodHMg
cmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJp
bmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0
ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6Cisg
KiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3Zl
IGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhl
IGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBm
b3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhp
cyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUK
KyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRo
IHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBB
UFBMRSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFO
VElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJS
QU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisg
KiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBP
UgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElO
Q0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdF
UyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJT
VElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJ
VFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBU
SEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJ
TElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJ
U0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVO
IElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLiAKKyAqLworCisj
aW5jbHVkZSAiY29uZmlnLmgiCisjaW5jbHVkZSAiQjNBcmd1bWVudFJlZ1ZhbHVlLmgiCisKK25h
bWVzcGFjZSBKU0MgeyBuYW1lc3BhY2UgQjMgeworCitBcmd1bWVudFJlZ1ZhbHVlOjp+QXJndW1l
bnRSZWdWYWx1ZSgpCit7Cit9CisKK3ZvaWQgQXJndW1lbnRSZWdWYWx1ZTo6ZHVtcE1ldGEoUHJp
bnRTdHJlYW0mIG91dCkgY29uc3QKK3sKKyAgICBvdXQucHJpbnQobV9yZWcpOworfQorCit9IH0g
Ly8gbmFtZXNwYWNlIEpTQzo6QjMKKwpJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0Iz
QXJndW1lbnRSZWdWYWx1ZS5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9i
My9CM0FyZ3VtZW50UmVnVmFsdWUuaAkocmV2aXNpb24gMCkKKysrIFNvdXJjZS9KYXZhU2NyaXB0
Q29yZS9iMy9CM0FyZ3VtZW50UmVnVmFsdWUuaAkod29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDYw
IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE1IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNl
cnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5
IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBw
cm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEu
IFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29w
eXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9s
bG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0g
bXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxp
c3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICog
ICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhl
IGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExF
IElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVT
LCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJ
RVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBV
UlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SCisg
KiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURF
TlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJ
TkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRV
VEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsg
T1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9S
WQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZ
LCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5H
IElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYg
QURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisKKyNpZm5k
ZWYgQjNBcmd1bWVudFJlZ1ZhbHVlX2gKKyNkZWZpbmUgQjNBcmd1bWVudFJlZ1ZhbHVlX2gKKwor
I2luY2x1ZGUgIkIzVmFsdWUuaCIKKyNpbmNsdWRlICJSZWcuaCIKKworbmFtZXNwYWNlIEpTQyB7
IG5hbWVzcGFjZSBCMyB7CisKK2NsYXNzIEFyZ3VtZW50UmVnVmFsdWUgOiBwdWJsaWMgVmFsdWUg
eworcHVibGljOgorICAgIHN0YXRpYyBib29sIGFjY2VwdHMoT3Bjb2RlIG9wY29kZSkgeyByZXR1
cm4gb3Bjb2RlID09IEFyZ3VtZW50UmVnOyB9CisgICAgCisgICAgfkFyZ3VtZW50UmVnVmFsdWUo
KTsKKworICAgIFJlZyBhcmd1bWVudFJlZygpIGNvbnN0IHsgcmV0dXJuIG1fcmVnOyB9CisKK3By
b3RlY3RlZDoKKyAgICB2b2lkIGR1bXBNZXRhKFByaW50U3RyZWFtJikgY29uc3Qgb3ZlcnJpZGU7
CisKK3ByaXZhdGU6CisgICAgZnJpZW5kIGNsYXNzIFByb2NlZHVyZTsKKworICAgIEFyZ3VtZW50
UmVnVmFsdWUodW5zaWduZWQgaW5kZXgsIE9yaWdpbiBvcmlnaW4sIFJlZyByZWcpCisgICAgICAg
IDogVmFsdWUoaW5kZXgsIEFyZ3VtZW50UmVnLCByZWcuaXNHUFIoKSA/IHBvaW50ZXIoKSA6IERv
dWJsZSwgb3JpZ2luKQorICAgICAgICAsIG1fcmVnKHJlZykKKyAgICB7CisgICAgfQorCisgICAg
UmVnIG1fcmVnOworfTsKKworfSB9IC8vIG5hbWVzcGFjZSBKU0M6OkIzCisKKyNlbmRpZiAvLyBC
M0FyZ3VtZW50UmVnVmFsdWVfaAorCkluZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNC
YXNpY0Jsb2NrLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNC
YXNpY0Jsb2NrLmNwcAkocmV2aXNpb24gMCkKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9C
M0Jhc2ljQmxvY2suY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsNzUgQEAKKy8qCisgKiBD
b3B5cmlnaHQgKEMpIDIwMTUgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAq
IFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGgg
b3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQg
dGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRp
b25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAg
IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xh
aW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVj
ZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRp
b25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0
aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9u
LgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFTIElT
JycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywg
QlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFO
VEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElT
Q0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IKKyAqIENPTlRSSUJVVE9S
UyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFM
LAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVU
IE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBT
RVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJ
TlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFC
SUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAq
IChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBP
VVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRI
RSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKworI2luY2x1ZGUgImNvbmZpZy5o
IgorI2luY2x1ZGUgIkIzQmFzaWNCbG9jay5oIgorCisjaW5jbHVkZSAiQjNCYXNpY0Jsb2NrVXRp
bHMuaCIKKworbmFtZXNwYWNlIEpTQyB7IG5hbWVzcGFjZSBCMyB7CisKK0Jhc2ljQmxvY2s6OkJh
c2ljQmxvY2sodW5zaWduZWQgaW5kZXgpCisgICAgOiBtX2luZGV4KGluZGV4KQoreworfQorCitC
YXNpY0Jsb2NrOjp+QmFzaWNCbG9jaygpCit7Cit9CisKK3ZvaWQgQmFzaWNCbG9jazo6YXBwZW5k
KFZhbHVlKiB2YWx1ZSkKK3sKKyAgICBtX3ZhbHVlcy5hcHBlbmQodmFsdWUpOworfQorCit2b2lk
IEJhc2ljQmxvY2s6OmFkZFByZWRlY2Vzc29yKEJhc2ljQmxvY2sqIGJsb2NrKQoreworICAgIEIz
OjphZGRQcmVkZWNlc3Nvcih0aGlzLCBibG9jayk7Cit9CisKK3ZvaWQgQmFzaWNCbG9jazo6cmVt
b3ZlUHJlZGVjZXNzb3IoQmFzaWNCbG9jayogYmxvY2spCit7CisgICAgQjM6OnJlbW92ZVByZWRl
Y2Vzc29yKHRoaXMsIGJsb2NrKTsKK30KKwordm9pZCBCYXNpY0Jsb2NrOjpyZXBsYWNlUHJlZGVj
ZXNzb3IoQmFzaWNCbG9jayogZnJvbSwgQmFzaWNCbG9jayogdG8pCit7CisgICAgQjM6OnJlcGxh
Y2VQcmVkZWNlc3Nvcih0aGlzLCBmcm9tLCB0byk7Cit9CisKK3ZvaWQgQmFzaWNCbG9jazo6ZHVt
cChQcmludFN0cmVhbSYgb3V0KSBjb25zdAoreworICAgIG91dC5wcmludChkdW1wUHJlZml4LCBt
X2luZGV4KTsKK30KKwordm9pZCBCYXNpY0Jsb2NrOjpkZWVwRHVtcChQcmludFN0cmVhbSYgb3V0
KSBjb25zdAoreworICAgIG91dC5wcmludCgiQkIiLCAqdGhpcywgIjpcbiIpOworICAgIGZvciAo
VmFsdWUqIHZhbHVlIDogKnRoaXMpCisgICAgICAgIG91dC5wcmludCgiICAgICIsIGRlZXBEdW1w
KHZhbHVlKSwgIlxuIik7Cit9CisKK30gfSAvLyBuYW1lc3BhY2UgSlNDOjpCMworCkluZGV4OiBT
b3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNCYXNpY0Jsb2NrLmgKPT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291
cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzQmFzaWNCbG9jay5oCShyZXZpc2lvbiAwKQorKysgU291
cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzQmFzaWNCbG9jay5oCSh3b3JraW5nIGNvcHkpCkBAIC0w
LDAgKzEsMTIzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE1IEFwcGxlIEluYy4gQWxsIHJp
Z2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBh
bmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBl
cm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1l
dDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUg
YWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFu
ZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmlu
YXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNl
LCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGlu
IHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVk
IHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVE
IEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBX
QVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVE
IFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VM
QVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJ
TkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVD
VCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBE
QU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9G
IFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICog
UFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04g
QU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1Qg
TElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNF
KSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUs
IEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICov
CisKKyNpZm5kZWYgQjNCYXNpY0Jsb2NrCisjZGVmaW5lIEIzQmFzaWNCbG9jaworCituYW1lc3Bh
Y2UgSlNDIHsgbmFtZXNwYWNlIEIzIHsKKworY2xhc3MgUHJvY2VkdXJlOworY2xhc3MgVmFsdWU7
CisKK2NsYXNzIEJhc2ljQmxvY2sgeworICAgIFdURl9NQUtFX05PTkNPUFlBQkxFKEJhc2ljQmxv
Y2spOworICAgIFdURl9NQUtFX0ZBU1RfQUxMT0NBVEVEOworcHVibGljOgorICAgIHR5cGVkZWYg
VmVjdG9yPFZhbHVlKj4gVmFsdWVMaXN0OworICAgIHR5cGVkZWYgVmVjdG9yPEJhc2ljQmxvY2sq
LCAyPiBBZGphY2VuY3lMaXN0OyAvLyBUaGlzIG1hdGNoZXMgQ29udHJvbFZhbHVlOjpTdWNjZXNz
b3JMaXN0CisKKyAgICBzdGF0aWMgY29uc3QgY2hhciogZHVtcFByZWZpeCA9ICIjIjsKKworICAg
IH5CYXNpY0Jsb2NrKCk7CisKKyAgICB1bnNpZ25lZCBpbmRleCgpIGNvbnN0IHsgcmV0dXJuIG1f
aW5kZXg7IH0KKworICAgIFZhbHVlTGlzdDo6aXRlcmF0b3IgYmVnaW4oKSB7IHJldHVybiBtX3Zh
bHVlcy5iZWdpbigpOyB9CisgICAgVmFsdWVMaXN0OjppdGVyYXRvciBlbmQoKSB7IHJldHVybiBt
X3ZhbHVlcy5lbmQoKTsgfQorICAgIFZhbHVlTGlzdDo6Y29uc3RfaXRlcmF0b3IgYmVnaW4oKSBj
b25zdCB7IHJldHVybiBtX3ZhbHVlcy5iZWdpbigpOyB9CisgICAgVmFsdWVMaXN0Ojpjb25zdF9p
dGVyYXRvciBlbmQoKSBjb25zdCB7IHJldHVybiBtX3ZhbHVlcy5lbmQoKTsgfQorCisgICAgc2l6
ZV90IHNpemUoKSBjb25zdCB7IHJldHVybiBtX3ZhbHVlcy5zaXplKCk7IH0KKyAgICBWYWx1ZSog
YXQoc2l6ZV90IGluZGV4KSBjb25zdCB7IHJldHVybiBtX3ZhbHVlc1tpbmRleF07IH0KKyAgICBW
YWx1ZSomIGF0KHNpemVfdCBpbmRleCkgeyByZXR1cm4gbV92YWx1ZXNbaW5kZXhdOyB9CisKKyAg
ICBWYWx1ZSogbGFzdCgpIGNvbnN0IHsgcmV0dXJuIG1fdmFsdWVzLmxhc3QoKTsgfQorICAgIFZh
bHVlKiYgbGFzdCgpIHsgcmV0dXJuIG1fdmFsdWVzLmxhc3QoKTsgfQorCisgICAgY29uc3QgVmFs
dWVMaXN0JiB2YWx1ZXMoKSBjb25zdCB7IHJldHVybiBtX3ZhbHVlczsgfQorICAgIFZhbHVlTGlz
dCYgdmFsdWVzKCkgeyByZXR1cm4gbV92YWx1ZXM7IH0KKworICAgIHZvaWQgYXBwZW5kKFZhbHVl
Kik7CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBWYWx1ZVR5cGUsIHR5cGVuYW1lLi4uIEFyZ3Vt
ZW50cz4KKyAgICBWYWx1ZVR5cGUqIGFwcGVuZE5ldyhQcm9jZWR1cmUmLCBBcmd1bWVudHMuLi4p
OworCisgICAgdW5zaWduZWQgbnVtU3VjY2Vzc29ycygpIGNvbnN0OworICAgIEJhc2ljQmxvY2sq
IHN1Y2Nlc3Nvcih1bnNpZ25lZCBpbmRleCkgY29uc3Q7CisgICAgQmFzaWNCbG9jayomIHN1Y2Nl
c3Nvcih1bnNpZ25lZCBpbmRleCk7CisgICAgY29uc3QgQWRqYWNlbmN5TGlzdCYgc3VjY2Vzc29y
cygpIGNvbnN0OworCisgICAgdW5zaWduZWQgbnVtUHJlZGVjZXNzb3JzKCkgY29uc3QgeyByZXR1
cm4gbV9wcmVkZWNlc3NvcnMuc2l6ZSgpOyB9CisgICAgQmFzaWNCbG9jayogcHJlZGVjZXNzb3Io
dW5zaWduZWQgaW5kZXgpIGNvbnN0IHsgcmV0dXJuIG1fcHJlZGVjZXNzb3JzW2luZGV4XTsgfQor
ICAgIEJhc2ljQmxvY2sqJiBwcmVkZWNlc3Nvcih1bnNpZ25lZCBpbmRleCkgeyByZXR1cm4gbV9w
cmVkZWNlc3NvcnNbaW5kZXhdOyB9CisgICAgY29uc3QgQWRqYWNlbmN5TGlzdCYgcHJlZGVjZXNz
b3JzKCkgY29uc3QgeyByZXR1cm4gbV9wcmVkZWNlc3NvcnNbaW5kZXhdOyB9CisgICAgQWRqYWNl
bmN5TGlzdCYgcHJlZGVjZXNzb3JzKCkgeyByZXR1cm4gbV9wcmVkZWNlc3NvcnNbaW5kZXhdOyB9
CisKKyAgICBib29sIGFkZFByZWRlY2Vzc29yKEJhc2ljQmxvY2sqKTsKKyAgICBib29sIHJlbW92
ZVByZWRlY2Vzc29yKEJhc2ljQmxvY2sqKTsKKyAgICBib29sIHJlcGxhY2VQcmVkZWNlc3NvcihC
YXNpY0Jsb2NrKiBmcm9tLCBCYXNpY0Jsb2NrKiB0byk7CisKKyAgICB2b2lkIGR1bXAoUHJpbnRT
dHJlYW0mKSBjb25zdDsKKyAgICB2b2lkIGRlZXBEdW1wKFByaW50U3RyZWFtJikgY29uc3Q7CisK
K3ByaXZhdGU6CisgICAgZnJpZW5kIGNsYXNzIFByb2NlZHVyZTsKKyAgICAKKyAgICAvLyBJbnN0
YW50aWF0ZSB2aWEgUHJvY2VkdXJlLgorICAgIEJhc2ljQmxvY2sodW5zaWduZWQgaW5kZXgpOwor
CisgICAgdW5zaWduZWQgbV9pbmRleDsKKyAgICBWYWx1ZUxpc3QgbV92YWx1ZXM7CisgICAgQWRq
YWNlbmN5TGlzdCBtX3N1Y2Nlc3NvcnM7Cit9OworCitjbGFzcyBEZWVwQmFzaWNCbG9ja0R1bXAg
eworcHVibGljOgorICAgIERlZXBCYXNpY0Jsb2NrRHVtcChCYXNpY0Jsb2NrKiBibG9jaykKKyAg
ICAgICAgOiBtX2Jsb2NrKGJsb2NrKQorICAgIHsKKyAgICB9CisKKyAgICB2b2lkIGR1bXAoUHJp
bnRTdHJlYW0mIG91dCkgY29uc3QKKyAgICB7CisgICAgICAgIGlmIChtX2Jsb2NrKQorICAgICAg
ICAgICAgbV9ibG9jay0+ZGVlcER1bXAob3V0KTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAg
b3V0LnByaW50KCI8bnVsbD4iKTsKKyAgICB9CisKK3ByaXZhdGU6CisgICAgQmFzaWNCbG9jayog
bV9ibG9jazsKK307CisKK0RlZXBCYXNpY0Jsb2NrRHVtcCBkZWVwRHVtcChCYXNpY0Jsb2NrKiBi
bG9jaykKK3sKKyAgICByZXR1cm4gRGVlcEJhc2ljQmxvY2tEdW1wKGJsb2NrKTsKK30KKworfSB9
IC8vIG5hbWVzcGFjZSBKU0M6OkIzCisKKyNlbmRpZiAvLyBCM0Jhc2ljQmxvY2sKKwpJbmRleDog
U291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzQmFzaWNCbG9ja0lubGluZXMuaAo9PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNCYXNpY0Jsb2NrSW5saW5lcy5oCShyZXZp
c2lvbiAwKQorKysgU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzQmFzaWNCbG9ja0lubGluZXMu
aAkod29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDY2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAy
MDE1IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlv
biBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAq
IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcg
Y29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2Ug
Y29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMg
bGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBS
ZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNv
cHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZv
bGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3Ro
ZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElT
IFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAq
IEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRF
RCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBG
SVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBO
TyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZP
UiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFS
WSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBU
TywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1Mg
T0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBI
T1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVS
IElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5F
R0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UK
KyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkg
T0YgU1VDSCBEQU1BR0UuIAorICovCisKKyNpZm5kZWYgQjNCYXNpY0Jsb2NrSW5saW5lc19oCisj
ZGVmaW5lIEIzQmFzaWNCbG9ja0lubGluZXNfaAorCisjaW5jbHVkZSAiQjNCYXNpY0Jsb2NrLmgi
CisjaW5jbHVkZSAiQjNDb250cm9sVmFsdWUuaCIKKyNpbmNsdWRlICJCM1Byb2NlZHVyZUlubGlu
ZXMuaCIKKworbmFtZXNwYWNlIEpTQyB7IG5hbWVzcGFjZSBCMyB7CisKK3RlbXBsYXRlPHR5cGVu
YW1lIFZhbHVlVHlwZSB0eXBlbmFtZS4uLiBBcmd1bWVudHM+CitWYWx1ZVR5cGUqIEJhc2ljQmxv
Y2s6OmFwcGVuZE5ldyhQcm9jZWR1cmUmIHByb2NlZHVyZSwgQXJndW1lbnRzLi4uIGFyZ3VtZW50
cykKK3sKKyAgICBWYWx1ZVR5cGUqIHJlc3VsdCA9IHByb2NlZHVyZS5hZGQ8VmFsdWVUeXBlPihh
cmd1bWVudHMuLi4pOworICAgIGFwcGVuZChyZXN1bHQpOworICAgIHJldHVybiByZXN1bHQ7Cit9
CisKK3Vuc2lnbmVkIEJhc2ljQmxvY2s6Om51bVN1Y2Nlc3NvcnMoKSBjb25zdAoreworICAgIHJl
dHVybiBsYXN0KCktPmFzPENvbnRyb2xWYWx1ZT4oKS0+bnVtU3VjY2Vzc29ycygpOworfQorCitC
YXNpY0Jsb2NrKiBCYXNpY0Jsb2NrOjpzdWNjZXNzb3IodW5zaWduZWQgaW5kZXgpIGNvbnN0Cit7
CisgICAgcmV0dXJuIGxhc3QoKS0+YXM8Q29udHJvbFZhbHVlPigpLT5zdWNjZXNzb3IoaW5kZXgp
OworfQorCitCYXNpY0Jsb2NrKiYgQmFzaWNCbG9jazo6c3VjY2Vzc29yKHVuc2lnbmVkIGluZGV4
KQoreworICAgIHJldHVybiBsYXN0KCktPmFzPENvbnRyb2xWYWx1ZT4oKS0+c3VjY2Vzc29yKGlu
ZGV4KTsKK30KKworY29uc3QgQmFzaWNCbG9jazo6U3VjY2Vzc29yTGlzdCYgQmFzaWNCbG9jazo6
c3VjY2Vzc29ycygpIGNvbnN0Cit7CisgICAgcmV0dXJuIGxhc3QoKS0+YXM8Q29udHJvbFZhbHVl
PigpLT5zdWNjZXNzb3JzKCk7Cit9CisKK30gfSAvLyBuYW1lc3BhY2UgSlNDOjpCMworCisjZW5k
aWYgLy8gQjNCYXNpY0Jsb2NrSW5saW5lc19oCisKSW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29y
ZS9iMy9CM0Jhc2ljQmxvY2tVdGlscy5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0
Q29yZS9iMy9CM0Jhc2ljQmxvY2tVdGlscy5oCShyZXZpc2lvbiAwKQorKysgU291cmNlL0phdmFT
Y3JpcHRDb3JlL2IzL0IzQmFzaWNCbG9ja1V0aWxzLmgJKHdvcmtpbmcgY29weSkKQEAgLTAsMCAr
MSwxMDMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTUgQXBwbGUgSW5jLiBBbGwgcmlnaHRz
IHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBi
aW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0
dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0Ogor
ICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92
ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRo
ZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkg
Zm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRo
aXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhl
CisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0
aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkg
QVBQTEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJB
TlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FS
UkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgor
ICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4g
T1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJ
TkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFH
RVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VC
U1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9G
SVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkg
VEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFC
SUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFS
SVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZF
TiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKwor
I2lmbmRlZiBCM0Jhc2ljQmxvY2tVdGlsc19oCisjZGVmaW5lIEIzQmFzaWNCbG9ja1V0aWxzX2gK
KworI2luY2x1ZGUgIkIzSW5kZXhTZXQuaCIKKyNpbmNsdWRlIDx3dGYvR3JhcGhOb2RlV29ya2xp
c3QuaD4KKyNpbmNsdWRlIDx3dGYvVmVjdG9yLmg+CisKK25hbWVzcGFjZSBKU0MgeyBuYW1lc3Bh
Y2UgQjMgeworCit0ZW1wbGF0ZTx0eXBlbmFtZSBCYXNpY0Jsb2NrPgorYm9vbCBhZGRQcmVkZWNl
c3NvcihCYXNpY0Jsb2NrKiBibG9jaywgQmFzaWNCbG9jayogcHJlZGVjZXNzb3IpCit7CisgICAg
QmFzaWNCbG9jazo6QWRqYWNlbmN5TGlzdCYgcHJlZGVjZXNzb3JzID0gYmxvY2stPnByZWRlY2Vz
c29ycygpOworCisgICAgaWYgKHByZWRlY2Vzc29ycy5jb250YWlucyhwcmVkZWNlc3NvcikpCisg
ICAgICAgIHJldHVybiBmYWxzZTsKKworICAgIHByZWRlY2Vzc29ycy5hcHBlbmQocHJlZGVjZXNz
b3IpOworICAgIHJldHVybiB0cnVlOworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBCYXNpY0Jsb2Nr
PgorYm9vbCByZW1vdmVQcmVkZWNlc3NvcihCYXNpY0Jsb2NrKiBibG9jaywgQmFzaWNCbG9jayAq
cHJlZGVjZXNzb3IpCit7CisgICAgQmFzaWNCbG9jazo6QWRqYWNlbmN5TGlzdCYgcHJlZGVjZXNz
b3JzID0gYmxvY2stPnByZWRlY2Vzc29ycygpOworICAgIGJvb2wgcmVzdWx0ID0gZmFsc2U7Cisg
ICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IHByZWRlY2Vzc29ycy5zaXplKCk7ICsraSkgewor
ICAgICAgICBpZiAocHJlZGVjZXNzb3JzW2ldID09IHByZWRlY2Vzc29yKSB7CisgICAgICAgICAg
ICBwcmVkZWNlc3NvcnNbaS0tXSA9IHByZWRlY2Vzc29ycy5sYXN0KCk7CisgICAgICAgICAgICBw
cmVkZWNlc3NvcnMucmVtb3ZlTGFzdCgpOworICAgICAgICAgICAgcmVzdWx0ID0gdHJ1ZTsKKyAg
ICAgICAgICAgIC8vIE91dCBvZiBjYXV0aW9uLCB3ZSBrZWVwIGdvaW5nIGV2ZW4gdGhvdWdoIHRo
ZSBwcmVkZWNlc3NvciBsaXN0IGNhbm5vdCBoYXZlCisgICAgICAgICAgICAvLyBkdXBsaWNhdGVz
LgorICAgICAgICB9CisgICAgfQorICAgIHJldHVybiByZXN1bHQ7Cit9CisKK3RlbXBsYXRlPHR5
cGVuYW1lIEJhc2ljQmxvY2s+Citib29sIHJlcGxhY2VQcmVkZWNlc3NvcihCYXNpY0Jsb2NrKiBi
bG9jaywgQmFzaWNCbG9jayogZnJvbSwgQmFzaWNCbG9jayogdG8pCit7CisgICAgQmFzaWNCbG9j
azo6QWRqYWNlbmN5TGlzdCYgcHJlZGVjZXNzb3JzID0gYmxvY2stPnByZWRlY2Vzc29ycygpOwor
ICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBwcmVkZWNlc3NvcnMuc2l6ZSgpOyArK2kpIHsK
KyAgICAgICAgaWYgKHByZWRlY2Vzc29yc1tpXSA9PSBmcm9tKSB7CisgICAgICAgICAgICBwcmVk
ZWNlc3NvcnNbaV0gPSB0bzsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9Cisg
ICAgfQorICAgIHJldHVybiBmYWxzZTsKK30KKworLy8gVGhpcyByZWNvbXB1dGVzIHByZWRlY2Vz
c29ycyBhbmQgcmVtb3ZlcyBibG9ja3MgdGhhdCBhcmVuJ3QgcmVhY2hhYmxlLgordGVtcGxhdGU8
dHlwZW5hbWUgQmFzaWNCbG9jaz4KK3ZvaWQgcmVzZXRSZWFjaGFiaWxpdHkoVmVjdG9yPHN0ZDo6
dW5pcXVlX3B0cjxCYXNpY0Jsb2NrPj4mIGJsb2NrcykKK3sKKyAgICAvLyBDbGVhciBhbGwgcHJl
ZGVjZXNzb3IgbGlzdHMgZmlyc3QuCisgICAgZm9yIChCYXNpY0Jsb2NrKiBibG9jayA6IGJsb2Nr
cykKKyAgICAgICAgYmxvY2stPnByZWRlY2Vzc29ycygpLnJlc2l6ZSgwKTsKKworICAgIEdyYXBo
Tm9kZVdvcmtsaXN0PEJhc2ljQm9jayosIEluZGV4U2V0PEJhc2ljQmxvY2s+PiB3b3JrbGlzdDsK
KyAgICB3b3JrbGlzdC5ub2RlKGJsb2Nrc1swXSk7CisgICAgd2hpbGUgKEJhc2ljQmxvY2sqIGJs
b2NrID0gd29ya2xpc3QucG9wKCkpIHsKKyAgICAgICAgZm9yIChCYXNpY0Jsb2NrKiBzdWNjZXNz
b3IgOiBibG9jay0+c3VjY2Vzc29ycygpKSB7CisgICAgICAgICAgICBpZiAod29ya2xpc3QuYWRk
KHN1Y2Nlc3NvcikpCisgICAgICAgICAgICAgICAgc3VjY2Vzc29yLT5wcmVkZWNlc3NvcnMoKS5h
cHBlbmQoYmxvY2spOworICAgICAgICB9CisgICAgfQorCisgICAgZm9yICh1bnNpZ25lZCBpID0g
MTsgaSA8IGJsb2Nrcy5zaXplKCk7ICsraSkgeworICAgICAgICBpZiAoYmxvY2tzW2ldLnByZWRl
Y2Vzc29ycy5pc0VtcHR5KCkpCisgICAgICAgICAgICBibG9ja3NbaV0gPSBudWxscHRyOworICAg
IH0KK30KKworfSB9IC8vIG5hbWVzcGFjZSBKU0M6OkIzCisKKyNlbmRpZiAvLyBCM0Jhc2ljQmxv
Y2tVdGlsc19oCisKSW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM0Jsb2NrV29ya2xp
c3QuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNCbG9ja1dvcmts
aXN0LmgJKHJldmlzaW9uIDApCisrKyBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNCbG9ja1dv
cmtsaXN0LmgJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSw1OCBAQAorLyoKKyAqIENvcHlyaWdo
dCAoQykgMjAxNSBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0
cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRo
b3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9s
bG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Yg
c291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNl
LCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgor
ICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBh
Ym92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5k
IHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5k
L29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgor
ICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIGBgQVMgSVMnJyBBTkQg
QU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9U
IExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElU
WSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVE
LiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJ
QUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBF
WEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJ
TUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VT
OyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQ
VElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwg
V0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xV
RElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBU
SEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJ
QklMSVRZIE9GIFNVQ0ggREFNQUdFLiAKKyAqLworCisjaWZuZGVmIEIzQmxvY2tXb3JrbGlzdF9o
CisjZGVmaW5lIEIzQmxvY2tXb3JrbGlzdF9oCisKKyNpbmNsdWRlICJCM0Jhc2ljQmxvY2suaCIK
KyNpbmNsdWRlICJCM0luZGV4U2V0LmgiCisjaW5jbHVkZSA8d3RmL0dyYXBoTm9kZVdvcmtsaXN0
Lmg+CisjaW5jbHVkZSA8d3RmL1ZlY3Rvci5oPgorCituYW1lc3BhY2UgSlNDIHsgbmFtZXNwYWNl
IEIzIHsKKworc3RydWN0IEJhc2ljQmxvY2s7CisKK3R5cGVkZWYgR3JhcGhOb2RlV29ya2xpc3Q8
QmFzaWNCbG9jayosIEluZGV4U2V0PEJhc2ljQmxvY2s+PiBCbG9ja1dvcmtsaXN0OworCisvLyBX
aGVuIHlvdSBzYXkgQmxvY2tXaXRoPGludD4geW91IHNob3VsZCByZWFkIGl0IGFzICJibG9jayB3
aXRoIGFuIGludCIuCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPiB1c2luZyBCbG9ja1dpdGggPSBHcmFw
aE5vZGVXaXRoPEJhc2ljQmxvY2sqLCBUPjsKKworLy8gRXh0ZW5kZWQgYmxvY2sgd29ya2xpc3Qg
aXMgdXNlZnVsIGZvciBlbnF1ZXVlaW5nIHNvbWUgbWV0YS1kYXRhIGFsb25nIHdpdGggdGhlIGJs
b2NrLiBJdCBhbHNvCisvLyBwZXJtaXRzIGZvcmNpYmx5IGVucXVldWVpbmcgdGhpbmdzIGV2ZW4g
aWYgdGhlIGJsb2NrIGhhcyBhbHJlYWR5IGJlZW4gc2Vlbi4gSXQncyB1c2VmdWwgZm9yCisvLyB0
aGluZ3MgbGlrZSBidWlsZGluZyBhIHNwYW5uaW5nIHRyZWUsIGluIHdoaWNoIGNhc2UgVCAodGhl
IGF1eGlsaWFyeSBwYXlsb2FkKSB3b3VsZCBiZSB0aGUKKy8vIHN1Y2Nlc3NvciBpbmRleC4KK3Rl
bXBsYXRlPHR5cGVuYW1lIFQ+IHVzaW5nIEV4dGVuZGVkQmxvY2tXb3JrbGlzdCA9IEV4dGVuZGVk
R3JhcGhOb2RlV29ya2xpc3Q8QmFzaWNCbG9jayosIFQsIEluZGV4U2V0PEJhc2ljQmxvY2s+PjsK
KwordHlwZWRlZiBHcmFwaFZpc2l0T3JkZXIgVmlzaXRPcmRlcjsKKwordHlwZWRlZiBHcmFwaE5v
ZGVXaXRoT3JkZXI8QmFzaWNCbG9jayo+IEJsb2NrV2l0aE9yZGVyOworCit0eXBlZGVmIFBvc3RP
cmRlckdyYXBoTm9kZVdvcmtsaXN0PEJhc2ljQmxvY2sqLCBJbmRleFNldDxCYXNpY0Jsb2NrPj4g
UG9zdE9yZGVyQmxvY2tXb3JrbGlzdDsKKworfSB9IC8vIG5hbWVzcGFjZSBKU0M6OkIzCisKKyNl
bmRpZiAvLyBCM0Jsb2NrV29ya2xpc3RfaAorCkluZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUv
YjMvQjNDaGVja1NwZWNpYWwuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29y
ZS9iMy9CM0NoZWNrU3BlY2lhbC5jcHAJKHJldmlzaW9uIDApCisrKyBTb3VyY2UvSmF2YVNjcmlw
dENvcmUvYjMvQjNDaGVja1NwZWNpYWwuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsMTQy
IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE1IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNl
cnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5
IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBw
cm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEu
IFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29w
eXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9s
bG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0g
bXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxp
c3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICog
ICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhl
IGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExF
IElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVT
LCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJ
RVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBV
UlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SCisg
KiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURF
TlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJ
TkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRV
VEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsg
T1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9S
WQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZ
LCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5H
IElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYg
QURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisKKyNpbmNs
dWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJCM0NoZWNrU3BlY2lhbC5oIgorCituYW1lc3BhY2Ug
SlNDIHsgbmFtZXNwYWNlIEIzIHsKKwordXNpbmcgbmFtZXNwYWNlIEFpcjsKKworbmFtZXNwYWNl
IHsKKwordW5zaWduZWQgbnVtQjNBcmdzKEluc3QmIGluc3QpCit7CisgICAgc3dpdGNoIChpbnN0
Lm9yaWdpbi0+b3Bjb2RlKCkpIHsKKyAgICBjYXNlIENoZWNrQWRkOgorICAgIGNhc2UgQ2hlY2tT
dWI6CisgICAgY2FzZSBDaGVja011bDoKKyAgICAgICAgcmV0dXJuIDI7CisgICAgY2FzZSBDaGVj
azoKKyAgICAgICAgcmV0dXJuIDE7CisgICAgZGVmYXVsdDoKKyAgICAgICAgUkVMRUFTRV9BU1NF
UlRfTk9UX1JFQUNIRUQoKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorfQorCit9IC8vIGFu
b255bW91cyBuYW1lc3BhY2UKKworQ2hlY2tTcGVjaWFsOjpDaGVja1NwZWNpYWwoQWlyOjpPcGNv
ZGUgb3Bjb2RlLCB1bnNpZ25lZCBudW1BcmdzKQorICAgIDogbV9jaGVja09wY29kZShvcGNvZGUp
CisgICAgLCBtX251bUNoZWNrQXJncyhudW1BcmdzKQoreworfQorCitDaGVja1NwZWNpYWw6On5D
aGVja1NwZWNpYWwoKQoreworfQorCitJbnN0IENoZWNrU3BlY2lhbDo6aGlkZGVuQnJhbmNoKGNv
bnN0IEluc3QmIGluc3QpIGNvbnN0Cit7CisgICAgSW5zdCBoaWRkZW5CcmFuY2gobV9jaGVja09w
Y29kZSwgaW5zdC5vcmlnaW4pOworICAgIGhpZGRlbkJyYW5jaC5hcmdzLnJlc2l6ZShtX251bUNo
ZWNrQXJncyk7CisgICAgZm9yICh1bnNpZ25lZCBpID0gbV9udW1DaGVja0FyZ3M7IGktLTspCisg
ICAgICAgIGhpZGRlbkJyYW5jaC5hcmdzW2ldID0gaW5zdC5hcmdzW2kgKyAxXTsKKyAgICByZXR1
cm4gaGlkZGVuQnJhbmNoOworfQorCit2b2lkIENoZWNrU3BlY2lhbDo6Zm9yRWFjaEFyZyhJbnN0
JiBpbnN0LCBjb25zdCBTY29wZWRMYW1iZGE8SW5zdDo6RWFjaEFyZ0NhbGxiYWNrPiYgY2FsbGJh
Y2spCit7CisgICAgaGlkZGVuQnJhbmNoKGluc3QpLmZvckVhY2hBcmcoY2FsbGJhY2spOworICAg
IGZvckVhY2hBcmdJbXBsKG51bUIzQXJncyhpbnN0KSwgbV9udW1DaGVja0FyZ3MgKyAxLCBpbnN0
LCBjYWxsYmFjayk7Cit9CisKK2Jvb2wgQ2hlY2tTcGVjaWFsOjppc1ZhbGlkKEluc3QmIGluc3Qp
Cit7CisgICAgcmV0dXJuIGhpZGRlbkJyYW5jaChpbnN0KS5pc1ZhbGlkKCkKKyAgICAgICAgJiYg
aXNWYWxpZEltcGwobnVtQjNBcmdzKGluc3QpLCBtX251bUNoZWNrQXJncyArIDEsIGluc3QpOwor
fQorCitib29sIENoZWNrU3BlY2lhbDo6YWRtaXRzU3RhY2soSW5zdCYgaW5zdCwgdW5zaWduZWQg
YXJnSW5kZXgpCit7CisgICAgaWYgKGFyZ0luZGV4ID49IDEgJiYgYXJnSW5kZXggPCAxICsgbV9u
dW1DaGVja0FyZ3MpCisgICAgICAgIHJldHVybiBoaWRkZW5CcmFuY2goaW5zdCkuYWRtaXRzU3Rh
Y2soYXJnSW5kZXggLSAxKTsKKyAgICByZXR1cm4gYWRtaXRzU3RhY2tJbXBsKG51bUIzQXJncyhp
bnN0KSwgbV9udW1DaGVja0FyZ3MgKyAxLCBpbnN0LCBhcmdJbmRleCk7Cit9CisKK0NDYWxsSGVs
cGVyczo6SnVtcCBDaGVja1NwZWNpYWw6OmdlbmVyYXRlKEluc3QmIGluc3QsIENDYWxsSGVscGVy
cyYgaml0LCBHZW5lcmF0aW9uQ29udGV4dCYgY29udGV4dCkKK3sKKyAgICBDQ2FsbEhlbHBlcnM6
Okp1bXAgZmFpbCA9IGhpZGRlbkJyYW5jaChpbnN0KS5nZW5lcmF0ZShqaXQsIGNvbnRleHQpOwor
ICAgIEFTU0VSVChmYWlsLmlzU2V0KCkpOworCisgICAgVmFsdWUqIHZhbHVlID0gaW5zdC5vcmln
aW47CisKKyAgICBWZWN0b3I8VmFsdWVSZXA+IHJlcHM7CisgICAgaWYgKGlzQ2hlY2tNYXRoKHZh
bHVlLT5vcGNvZGUoKSkpIHsKKyAgICAgICAgaWYgKHZhbHVlLT5vcGNvZGUoKSA9PSBDaGVja011
bCkKKyAgICAgICAgICAgIHJlcHMuYXBwZW5kKFZhbHVlUmVwKCkpOworICAgICAgICBlbHNlIGlm
ICh2YWx1ZS0+b3Bjb2RlKCkgPT0gQ2hlY2tTdWIgJiYgdmFsdWUtPmFyZ3NbMF0tPmlzSW50KDAp
KQorICAgICAgICAgICAgcmVwcy5hcHBlbmQoVmFsdWVSZXA6OmNvbnN0YW50KDApKTsKKyAgICAg
ICAgZWxzZQorICAgICAgICAgICAgcmVwcy5hcHBlbmQocmVwRm9yQXJnKGNvbnRleHQuY29kZSwg
aW5zdC5hcmdzWzJdKSk7CisgICAgICAgIHJlcHMuYXBwZW5kKHJlcEZvckFyZyhjb250ZXh0LmNv
ZGUsIGluc3QuYXJnc1sxXSkpOworICAgIH0gZWxzZSB7CisgICAgICAgIEFTU0VSVCh2YWx1ZS0+
b3Bjb2RlKCkgPT0gQ2hlY2spOworICAgICAgICByZXBzLmFwcGVuZChWYWx1ZVJlcDo6Y29uc3Rh
bnQoMSkpOworICAgIH0KKworICAgIGFwcGVuZFJlcHNJbXBsKGNvbnRleHQsIG1fbnVtQ2hlY2tB
cmdzICsgMSwgaW5zdCwgcmVwcyk7CisgICAgCisgICAgY29udGV4dC5sYXRlUGF0aHMuYXBwZW5k
KAorICAgICAgICBjcmVhdGVTaGFyZWRUYXNrPEdlbmVyYXRpb25Db250ZXh0OjpMYXRlUGF0aEZ1
bmN0aW9uPigKKyAgICAgICAgICAgIFs9XSAoQ0NhbGxIZWxwZXJzJiBqaXQsIEdlbmVyYXRpb25D
b250ZXh0JiBjb250ZXh0KSB7CisgICAgICAgICAgICAgICAgZmFpbC5saW5rKCZqaXQpOworICAg
ICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIFN0YWNrbWFwKiBzdGFja21hcCA9IHZhbHVl
LT5zdGFja21hcCgpOworICAgICAgICAgICAgICAgIEFTU0VSVChzdGFja21hcCk7CisKKyAgICAg
ICAgICAgICAgICBTdGFja21hcDo6R2VuZXJhdGlvblBhcmFtcyBwYXJhbXM7CisgICAgICAgICAg
ICAgICAgcGFyYW1zLnZhbHVlID0gdmFsdWU7CisgICAgICAgICAgICAgICAgcGFyYW1zLnN0YWNr
bWFwID0gc3RhY2ttYXA7CisgICAgICAgICAgICAgICAgcGFyYW1zLnJlcHMgPSByZXBzOworICAg
ICAgICAgICAgICAgIHBhcmFtcy51c2VkUmVnaXN0ZXJzID0gc3RhY2ttYXAtPm1fdXNlZFJlZ2lz
dGVyczsKKworICAgICAgICAgICAgICAgIHN0YWNrbWFwLT5tX2dlbmVyYXRvci0+cnVuKGppdCwg
cGFyYW1zKTsKKyAgICAgICAgICAgIH0pKTsKK30KKwordm9pZCBDaGVja1NwZWNpYWw6OmR1bXBJ
bXBsKFByaW50U3RyZWFtJiBvdXQpIGNvbnN0Cit7CisgICAgb3V0LnByaW50KG1fY2hlY2tPcGNv
ZGUsICIoIiwgbV9udW1DaGVja0FyZ3MsICIpIik7Cit9CisKK3ZvaWQgQ2hlY2tTcGVjaWFsOjpk
ZWVwRHVtcEltcGwoUHJpbnRTdHJlYW0mIG91dCkgY29uc3QKK3sKKyAgICBvdXQucHJpbnQoIkIz
OjpDaGVja1ZhbHVlIGxvd2VyZWQgdG8gIiwgbV9jaGVja09wY29kZSwgIiB3aXRoICIsIG1fbnVt
Q2hlY2tBcmdzLCAiIGFyZ3MuIik7Cit9CisKK30gfSAvLyBuYW1lc3BhY2UgSlNDOjpCMworCklu
ZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNDaGVja1NwZWNpYWwuaAo9PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNDaGVja1NwZWNpYWwuaAkocmV2aXNpb24g
MCkKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM0NoZWNrU3BlY2lhbC5oCSh3b3JraW5n
IGNvcHkpCkBAIC0wLDAgKzEsNzQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTUgQXBwbGUg
SW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2Ug
aW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0
aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25z
CisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3Qg
cmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNv
bmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0
aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Cisg
KiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRp
c2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlh
bHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUg
SVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBP
UiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUK
KyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9S
IEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNI
QUxMIEFQUExFIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJF
Q1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05T
RVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJP
Q1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERB
VEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FV
U0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJB
Q1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBP
UiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJ
UyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERB
TUFHRS4gCisgKi8KKworI2lmbmRlZiBCM0NoZWNrU3BlY2lhbF9oCisjZGVmaW5lIEIzQ2hlY2tT
cGVjaWFsX2gKKworI2luY2x1ZGUgIkFpck9wY29kZS5oIgorI2luY2x1ZGUgIkIzU3RhY2ttYXBT
cGVjaWFsLmgiCisKK25hbWVzcGFjZSBKU0MgeyBuYW1lc3BhY2UgQjMgeworCisvLyBXZSB3YW50
IHRvIGxvd2VyIENoZWNrIGluc3RydWN0aW9ucyB0byBhIGJyYW5jaCwgYnV0IHRoZW4gd2Ugd2Fu
dCB0byByb3V0ZSB0aGF0IGJyYW5jaCB0byBvdXIKKy8vIG91dC1vZi1saW5lIGNvZGUgaW5zdGVh
ZCBvZiBkb2luZyBhbnl0aGluZyBlbHNlLiBGb3IgdGhpcyByZWFzb24sIGEgQ2hlY2tTcGVjaWFs
IHdpbGwgcmVtZW1iZXIKKy8vIHdoaWNoIGJyYW5jaCBvcGNvZGUgd2UgaGF2ZSBzZWxlY3RlZCBh
bG9uZyB3aXRoIHRoZSBudW1iZXIgb2YgYXJncyBpbiB0aGUgb3ZlcmxvYWQgd2Ugd2FudC4gSXQK
Ky8vIHdpbGwgY3JlYXRlIGFuIEluc3Qgd2l0aCB0aGF0IG9wY29kZSBwbHVzIHRoZSBhcHByb3By
aWF0ZSBhcmdzIGZyb20gdGhlIG93bmluZyBJbnN0IHdoZW5ldmVyIHlvdQorLy8gY2FsbCBhbnkg
b2YgdGhlIGNhbGxiYWNrcy4KKy8vCisvLyBOb3RlIHRoYXQgZm9yIENoZWNrQWRkLCBDaGVja1N1
YiwgYW5kIENoZWNrTXVsIHdlIGV4cGVjdCB0aGF0IHRoZSBCMyBhcmd1bWVudHMgYXJlIHRoZSBy
ZXZlcnNlCisvLyBvZiB0aGUgQWlyIGFyZ3VtZW50cyAoQWRkKGEsIGIpID0+IEFkZDMyIGIsIGEp
LiBFeGNlcHQ6CisvLyAtIENoZWNrU3ViKDAsIHgpLCB3aGljaCB0dXJucyBpbnRvIEJyYW5jaE5l
ZzMyIHguCisvLyAtIENoZWNrTXVsKGEsIGIpLCB3aGljaCB0dXJucyBpbnRvIE11bDMyIGIsIGEg
YnV0IHdlIHBhc3MgQW55IGZvciBhJ3MgVmFsdWVSZXAuCisKK2NsYXNzIENoZWNrU3BlY2lhbCA6
IHB1YmxpYyBTdGFja21hcFNwZWNpYWwgeworcHVibGljOgorICAgIENoZWNrU3BlY2lhbChBaXI6
Ok9wY29kZSBvcGNvZGUsIHVuc2lnbmVkIG51bUFyZ3MpOworICAgIH5DaGVja1NwZWNpYWwoKTsK
KworICAgIC8vIENvbnN0cnVjdHMgYW5kIHJldHVybnMgdGhlIEluc3QgcmVwcmVzZW50aW5nIHRo
ZSBicmFuY2ggdGhhdCB0aGlzIHdpbGwgdXNlLgorICAgIEluc3QgaGlkZGVuQnJhbmNoKGNvbnN0
IEluc3QmKSBjb25zdDsKKworcHJvdGVjdGVkOgorICAgIHZvaWQgZm9yRWFjaEFyZyhBaXI6Oklu
c3QmLCBjb25zdCBTY29wZWRMYW1iZGE8QWlyOjpJbnN0OjpFYWNoQXJnQ2FsbGJhY2s+Jikgb3Zl
cnJpZGU7CisgICAgYm9vbCBpc1ZhbGlkKEFpcjo6SW5zdCYpIG92ZXJyaWRlOworICAgIGJvb2wg
YWRtaXRzU3RhY2soQWlyOjpJbnN0JiwgdW5zaWduZWQgYXJnSW5kZXgpIG92ZXJyaWRlOworCisg
ICAgLy8gTk9URTogdGhlIGdlbmVyYXRlIG1ldGhvZCB3aWxsIGdlbmVyYXRlIHRoZSBoaWRkZW4g
YnJhbmNoIGFuZCB0aGVuIHJlZ2lzdGVyIGEgTGF0ZVBhdGggdGhhdAorICAgIC8vIGdlbmVyYXRl
cyB0aGUgc3RhY2ttYXAuIFN1cGVyIGNyYXp5IGR1ZGUhCisKKyAgICBDQ2FsbEhlbHBlcnM6Okp1
bXAgZ2VuZXJhdGUoSW5zdCYsIENDYWxsSGVsZXBycyYsIEdlbmVyYXRpb25Db250ZXh0Jikgb3Zl
cnJpZGU7CisKKyAgICB2b2lkIGR1bXBJbXBsKFByaW50U3RyZWFtJikgY29uc3Qgb3ZlcnJpZGU7
CisgICAgdm9pZCBkZWVwRHVtcEltcGwoUHJpbnRTdHJlYW0mKSBjb25zdCBvdmVycmlkZTsKKwor
cHJpdmF0ZToKKyAgICBBaXI6Ok9wY29kZSBtX2NoZWNrT3Bjb2RlOworICAgIHVuc2lnbmVkIG1f
bnVtQ2hlY2tBcmdzOworfTsKKworfSB9IC8vIG5hbWVzcGFjZSBKU0M6OkIzCisKKyNlbmRpZiAv
LyBCM0NoZWNrU3BlY2lhbF9oCisKSW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM0No
ZWNrVmFsdWUuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM0No
ZWNrVmFsdWUuY3BwCShyZXZpc2lvbiAwKQorKysgU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0Iz
Q2hlY2tWYWx1ZS5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSw0MSBAQAorLyoKKyAqIENv
cHlyaWdodCAoQykgMjAxNSBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICog
UmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBv
ciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0
aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlv
bnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAg
bm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFp
bWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNl
IHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlv
bnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRp
b24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24u
CisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIGBgQVMgSVMn
JyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBC
VVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5U
QUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVND
TEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUgorICogQ09OVFJJQlVUT1JT
IEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUws
CisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQg
Tk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNF
UlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElO
VEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJ
TElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICog
KElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9V
VCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhF
IFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLiAKKyAqLworCisjaW5jbHVkZSAiY29uZmlnLmgi
CisjaW5jbHVkZSAiQjNDaGVja1ZhbHVlLmgiCisKK25hbWVzcGFjZSBKU0MgeyBuYW1lc3BhY2Ug
QjMgeworCitDaGVja1ZhbHVlOjp+Q2hlY2tWYWx1ZSgpCit7Cit9CisKK3ZvaWQgQ2hlY2tWYWx1
ZTo6ZHVtcE1ldGEoUHJpbnRTdHJlYW0mIG91dCkgY29uc3QKK3sKKyAgICBvdXQucHJpbnQoInN0
YWNrbWFwID0gIiwgc3RhY2ttYXApOworfQorCit9IH0gLy8gbmFtZXNwYWNlIEpTQzo6QjMKKwpJ
bmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzQ2hlY2tWYWx1ZS5oCj09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0K
LS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM0NoZWNrVmFsdWUuaAkocmV2aXNpb24gMCkK
KysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM0NoZWNrVmFsdWUuaAkod29ya2luZyBjb3B5
KQpAQCAtMCwwICsxLDgwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE1IEFwcGxlIEluYy4g
QWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNv
dXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwg
YXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICog
YXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFp
biB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRp
b25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMg
aW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAg
bm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFp
bWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHBy
b3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBS
T1ZJREVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1Q
TElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJ
TVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBB
UlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBB
UFBMRSBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJ
TkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVO
VElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVN
RU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBP
UgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBB
TkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBT
VFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RI
RVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09G
VFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0Uu
IAorICovCisKKyNpZm5kZWYgQjNDaGVja1ZhbHVlX2gKKyNkZWZpbmUgQjNDaGVja1ZhbHVlX2gK
KworI2luY2x1ZGUgIkIzVmFsdWUuaCIKKyNpbmNsdWRlICJCM1N0YWNrbWFwLmgiCisKK25hbWVz
cGFjZSBKU0MgeyBuYW1lc3BhY2UgQjMgeworCitjbGFzcyBDaGVja1ZhbHVlIDogcHVibGljIENo
ZWNrIHsKK3B1YmxpYzoKKyAgICBzdGF0aWMgYm9vbCBhY2NlcHRzKE9wY29kZSBvcGNvZGUpCisg
ICAgeworICAgICAgICBzd2l0Y2ggKG9wY29kZSkgeworICAgICAgICBjYXNlIENoZWNrQWRkOgor
ICAgICAgICBjYXNlIENoZWNrU3ViOgorICAgICAgICBjYXNlIENoZWNrTXVsOgorICAgICAgICBj
YXNlIENoZWNrOgorICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIGRlZmF1bHQ6Cisg
ICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICB+Q2hlY2tW
YWx1ZSgpOworCisgICAgU3RhY2ttYXAgc3RhY2ttYXA7CisKK3Byb3RlY3RlZDoKKyAgICB2b2lk
IGR1bXBNZXRhKFByaW50U3RyZWFtJikgY29uc3Qgb3ZlcnJpZGU7CisKK3ByaXZhdGU6CisgICAg
ZnJpZW5kIGNsYXNzIFByb2NlZHVyZTsKKworICAgIC8vIFVzZSB0aGlzIGZvcm0gZm9yIENoZWNr
QWRkLCBDaGVja1N1YiwgYW5kIENoZWNrTXVsLgorICAgIENoZWNrVmFsdWUodW5zaWduZWQgaW5k
ZXgsIE9wY29kZSBvcGNvZGUsIE9yaWdpbiBvcmlnaW4sIFZhbHVlKiBsZWZ0LCBWYWx1ZSogcmln
aHQpCisgICAgICAgIDogVmFsdWUoaW5kZXgsIG9wY29kZSwgbGVmdC0+dHlwZSgpLCBvcmlnaW4s
IGxlZnQsIHJpZ2h0KQorICAgIHsKKyAgICAgICAgQVNTRVJUKGlzSW50KHR5cGUoKSkpOworICAg
ICAgICBBU1NFUlQobGVmdC0+dHlwZSgpID09IHJpZ2h0LT50eXBlKCkpOworICAgICAgICBBU1NF
UlQob3Bjb2RlID09IENoZWNrQWRkIHx8IG9wY29kZSA9PSBDaGVja1N1YiB8fCBvcGNvZGUgPT0g
Q2hlY2tNdWwpOworICAgIH0KKworICAgIC8vIFVzZSB0aGlzIGZvcm0gZm9yIENoZWNrLgorICAg
IENoZWNrVmFsdWUodW5zaWduZWQgaW5kZXgsIE9wY29kZSBvcGNvZGUsIE9yaWdpbiBvcmlnaW4s
IFZhbHVlKiBwcmVkaWNhdGUpCisgICAgICAgIDogVmFsdWUoaW5kZXgsIG9wY29kZSwgVm9pZCwg
b3JpZ2luLCBwcmVkaWNhdGUpCisgICAgeworICAgICAgICBBU1NFUlQob3BjZGUgPT0gQ2hlY2sp
OworICAgIH0KK307CisKK30gfSAvLyBuYW1lc3BhY2UgSlNDOjpCMworCisjZW5kaWYgLy8gQjND
aGVja1ZhbHVlX2gKKworCkluZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNDb21tb24u
Y3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM0NvbW1vbi5jcHAJ
KHJldmlzaW9uIDApCisrKyBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNDb21tb24uY3BwCSh3
b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsNjEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTUg
QXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFu
ZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9k
aWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25k
aXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2Rl
IG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0
IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlz
dHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJp
Z2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93
aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBt
YXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09G
VFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQ
UkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRP
LCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5F
U1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVW
RU5UIFNIQUxMIEFQUExFIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFO
WSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBP
UiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAor
ICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBV
U0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VW
RVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4g
Q09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElH
RU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICog
T0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBT
VUNIIERBTUFHRS4gCisgKi8KKworI2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgIkIzQ29t
bW9uLmgiCisKKyNpbmNsdWRlICJERkdDb21tb24uaCIKKyNpbmNsdWRlICJGVExTdGF0ZS5oIgor
I2luY2x1ZGUgIk9wdGlvbnMuaCIKKworbmFtZXNwYWNlIEpTQyB7IG5hbWVzcGFjZSBCMyB7CisK
K2Jvb2wgc2hvdWxkRHVtcElSKCkKK3sKKyAgICByZXR1cm4gRlRMOjp2ZXJib3NlQ29tcGlsYXRp
b25FbmFibGVkKCkgfHwgRlRMOjpzaG91bGREdW1wRGlzYXNzZW1ibHkoKSB8fCBzaG91bGREdW1w
SVJBdEVhY2hQaGFzZSgpOworfQorCitib29sIHNob3VsZER1bXBJUkF0RWFjaFBoYXNlKCkKK3sK
KyAgICByZXR1cm4gT3B0aW9uczo6ZHVtcEdyYXBoQXRFYWNoUGhhc2UoKTsKK30KKworYm9vbCBz
aG91bGRWYWxpZGF0ZUlSKCkKK3sKKyAgICByZXR1cm4gREZHOjp2YWxpZGF0aW9uRW5hYmxlZCgp
IHx8IHNob3VsZFZhbGlkYXRlSVJBdEVhY2hQaGFzZSgpOworfQorCitib29sIHNob3VsZFZhbGlk
YXRlSVJBdEVhY2hQaGFzZSgpCit7CisgICAgcmV0dXJuIE9wdGlvbnM6OnZhbGlkYXRlR3JhcGhB
dEVhY2hQaGFzZSgpOworfQorCitib29sIHNob3VsZFNhdmVJUkJlZm9yZVBoYXNlKCkKK3sKKyAg
ICByZXR1cm4gT3B0aW9uczo6dmVyYm9zZVZhbGlkYXRpb25GYWlsdXJlKCk7Cit9CisKK30gfSAv
LyBuYW1lc3BhY2UgSlNDOjpCMworCkluZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjND
b21tb24uaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNDb21tb24u
aAkocmV2aXNpb24gMCkKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM0NvbW1vbi5oCSh3
b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsNDAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTUg
QXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFu
ZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9k
aWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25k
aXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2Rl
IG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0
IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlz
dHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJp
Z2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93
aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBt
YXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09G
VFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQ
UkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRP
LCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5F
U1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVW
RU5UIFNIQUxMIEFQUExFIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFO
WSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBP
UiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAor
ICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBV
U0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VW
RVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4g
Q09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElH
RU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICog
T0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBT
VUNIIERBTUFHRS4gCisgKi8KKworI2lmbmRlZiBCM0NvbW1vbl9oCisjZGVmaW5lIEIzQ29tbW9u
X2gKKworbmFtZXNwYWNlIEpTQyB7IG5hbWVzcGFjZSBCMyB7CisKK2Jvb2wgc2hvdWxkRHVtcElS
KCk7Citib29sIHNob3VsZER1bXBJUkF0RWFjaFBoYXNlKCk7Citib29sIHNob3VsZFZhbGlkYXRl
SVIoKTsKK2Jvb2wgc2hvdWxkVmFsaWRhdGVJUkF0RWFjaFBoYXNlKCk7Citib29sIHNob3VsZFNh
dmVJUkJlZm9yZVBoYXNlKCk7CisKK30gfSAvLyBuYW1lc3BhY2UgSlNDOjpCMworCisjZW5kaWYg
Ly8gQjNDb21tb25faAorCkluZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNDb21wYXJp
c29uTWF0Y2hlci5wYXR0ZXJucwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUv
YjMvQjNDb21wYXJpc29uTWF0Y2hlci5wYXR0ZXJucwkocmV2aXNpb24gMCkKKysrIFNvdXJjZS9K
YXZhU2NyaXB0Q29yZS9iMy9CM0NvbXBhcmlzb25NYXRjaGVyLnBhdHRlcm5zCSh3b3JraW5nIGNv
cHkpCkBAIC0wLDAgKzEsMzggQEAKKyMgQ29weXJpZ2h0IChDKSAyMDE1IEFwcGxlIEluYy4gQWxs
IHJpZ2h0cyByZXNlcnZlZC4KKyMKKyMgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2Ug
YW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisjIG1vZGlmaWNhdGlvbiwgYXJlIHBl
cm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworIyBhcmUgbWV0
OgorIyAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFi
b3ZlIGNvcHlyaWdodAorIyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0
aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisjIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkg
Zm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisjICAgIG5vdGljZSwgdGhp
cyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUK
KyMgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGgg
dGhlIGRpc3RyaWJ1dGlvbi4KKyMKKyMgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBM
RSBJTkMuIEFORCBJVFMgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJworIyBBTkQgQU5ZIEVYUFJFU1Mg
T1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyMg
VEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9S
IEEgUEFSVElDVUxBUgorIyBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFM
TCBBUFBMRSBJTkMuIE9SIElUUyBDT05UUklCVVRPUlMKKyMgQkUgTElBQkxFIEZPUiBBTlkgRElS
RUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgorIyBDT05T
RVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJF
TUVOVCBPRgorIyBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFU
QSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MKKyMgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNF
RCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KKyMgQ09OVFJBQ1Qs
IFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVS
V0lTRSkKKyMgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdB
UkUsIEVWRU4gSUYgQURWSVNFRCBPRgorIyBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0Uu
CisKK21hdGNoZXIgQ29tcGFyaXNvbk1hdGNoZXIKKworVGVzdExvYWROb3RaZXJvMSA9IEFuZChM
b2FkKGFkZHJlc3MpLCByaWdodCkKK1Rlc3RMb2FkTm90WmVybzIgPSBBbmQobGVmdCwgTG9hZChh
ZGRyZXNzKSkKK1Rlc3ROb3RaZXJvID0gQW5kKGxlZnQsIHJpZ2h0KQorCitUZXN0TG9hZFplcm8x
ID0gRXF1YWwoQW5kKExvYWQoYWRkcmVzcyksIHJpZ2h0KSwgJDApCitUZXN0TG9hZFplcm8yID0g
RXF1YWwoQW5kKGxlZnQsIExvYWQoYWRkcmVzcykpLCAkMCkKK1Rlc3RaZXJvID0gRXF1YWwoQW5k
KGxlZnQsIHJpZ2h0KSwgJDApCisKK0xvYWRFcXVhbDEgPSBFcXVhbChMb2FkKGFkZHJlc3MpLCBy
aWdodCkKK0xvYWRFcXVhbDIgPSBFcXVhbChsZWZ0LCBMb2FkKGFkZHJlc3MpKQorTm90ID0gRXF1
YWwodmFsdWUsICQwKQorRXF1YWwgPSBFcXVhbChsZWZ0LCByaWdodCkKKwpJbmRleDogU291cmNl
L0phdmFTY3JpcHRDb3JlL2IzL0IzQ29uc3QzMlZhbHVlLmNwcAo9PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3Vy
Y2UvSmF2YVNjcmlwdENvcmUvYjMvQjNDb25zdDMyVmFsdWUuY3BwCShyZXZpc2lvbiAwKQorKysg
U291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzQ29uc3QzMlZhbHVlLmNwcAkod29ya2luZyBjb3B5
KQpAQCAtMCwwICsxLDQxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE1IEFwcGxlIEluYy4g
QWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNv
dXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwg
YXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICog
YXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFp
biB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRp
b25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMg
aW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAg
bm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFp
bWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHBy
b3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBS
T1ZJREVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1Q
TElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJ
TVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBB
UlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBB
UFBMRSBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJ
TkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVO
VElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVN
RU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBP
UgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBB
TkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBT
VFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RI
RVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09G
VFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0Uu
IAorICovCisKKyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJCM0NvbnN0MzJWYWx1ZS5o
IgorCituYW1lc3BhY2UgSlNDIHsgbmFtZXNwYWNlIEIzIHsKKworQ29uc3QzMlZhbHVlOjp+Q29u
c3QzMlZhbHVlKCkKK3sKK30KKwordm9pZCBDb25zdDMyVmFsdWU6OmR1bXBNZXRhKFByaW50U3Ry
ZWFtJiBvdXQpIGNvbnN0Cit7CisgICAgb3V0LnByaW50KG1fdmFsdWUpOworfQorCit9IH0gLy8g
bmFtZXNwYWNlIEpTQzo6QjMKKwpJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzQ29u
c3QzMlZhbHVlLmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzQ29u
c3QzMlZhbHVlLmgJKHJldmlzaW9uIDApCisrKyBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjND
b25zdDMyVmFsdWUuaAkod29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDU5IEBACisvKgorICogQ29w
eXJpZ2h0IChDKSAyMDE1IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBS
ZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9y
IHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRo
ZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9u
cyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBu
b3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWlt
ZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2Ug
dGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9u
cyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlv
biBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4K
KyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycn
IEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJV
VCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRB
QklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NM
QUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMg
QkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwK
KyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBO
T1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VS
VklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5U
RVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklM
SVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAo
SU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VU
IE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUg
UE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisKKyNpZm5kZWYgQjNDb25zdDMyVmFs
dWVfaAorI2RlZmluZSBCM0NvbnN0MzJWYWx1ZV9oCisKKyNpbmNsdWRlICJCM1ZhbHVlLmgiCisK
K25hbWVzcGFjZSBKU0MgeyBuYW1lc3BhY2UgQjMgeworCitjbGFzcyBDb25zdDMyVmFsdWUgOiBw
dWJsaWMgVmFsdWUgeworcHVibGljOgorICAgIHN0YXRpYyBib29sIGFjY2VwdHMoT3Bjb2RlIG9w
Y29kZSkgeyByZXR1cm4gb3Bjb2RlID09IENvbnN0MzI7IH0KKyAgICAKKyAgICB+Q29uc3QzMlZh
bHVlKCk7CisgICAgCisgICAgaW50MzJfdCB2YWx1ZSgpIGNvbnN0IHsgcmV0dXJuIG1fdmFsdWU7
IH0KKworcHJvdGVjdGVkOgorICAgIHZvaWQgZHVtcE1ldGEoUHJpbnRTdHJlYW0mKSBjb25zdCBv
dmVycmlkZTsKKworcHJpdmF0ZToKKyAgICBmcmllbmQgY2xhc3MgUHJvY2VkdXJlOworCisgICAg
Q29uc3QzMlZhbHVlKHVuc2lnbmVkIGluZGV4LCBPcmlnaW4gb3JpZ2luLCBpbnQzMl90IHZhbHVl
KQorICAgICAgICA6IFZhbHVlKGluZGV4LCBDb25zdDMyLCBJbnQzMiwgb3JpZ2luKQorICAgICAg
ICAsIG1fdmFsdWUodmFsdWUpCisgICAgeworICAgIH0KKyAgICAKKyAgICBpbnQzMl90IG1fdmFs
dWU7Cit9OworCit9IH0gLy8gbmFtZXNwYWNlIEpTQzo6QjMKKworI2VuZGlmIC8vIEIzQ29uc3Qz
MlZhbHVlX2gKKwpJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzQ29uc3Q2NFZhbHVl
LmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNDb25zdDY0VmFs
dWUuY3BwCShyZXZpc2lvbiAwKQorKysgU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzQ29uc3Q2
NFZhbHVlLmNwcAkod29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDQxIEBACisvKgorICogQ29weXJp
Z2h0IChDKSAyMDE1IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRp
c3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdp
dGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBm
b2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBv
ZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3Rp
Y2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIu
CisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhl
IGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBh
bmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBh
bmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAq
CisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFO
RCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBO
T1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklM
SVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlN
RUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUg
TElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAq
IEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1Qg
TElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklD
RVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJS
VVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZ
LCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5D
TFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9G
IFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9T
U0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisKKyNpbmNsdWRlICJjb25maWcuaCIKKyNp
bmNsdWRlICJCM0NvbnN0NjRWYWx1ZS5oIgorCituYW1lc3BhY2UgSlNDIHsgbmFtZXNwYWNlIEIz
IHsKKworQ29uc3Q2NFZhbHVlOjp+Q29uc3Q2NFZhbHVlKCkKK3sKK30KKwordm9pZCBDb25zdDY0
VmFsdWU6OmR1bXBNZXRhKFByaW50U3RyZWFtJiBvdXQpIGNvbnN0Cit7CisgICAgb3V0LnByaW50
KG1fdmFsdWUpOworfQorCit9IH0gLy8gbmFtZXNwYWNlIEpTQzo6QjMKKwpJbmRleDogU291cmNl
L0phdmFTY3JpcHRDb3JlL2IzL0IzQ29uc3Q2NFZhbHVlLmgKPT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNl
L0phdmFTY3JpcHRDb3JlL2IzL0IzQ29uc3Q2NFZhbHVlLmgJKHJldmlzaW9uIDApCisrKyBTb3Vy
Y2UvSmF2YVNjcmlwdENvcmUvYjMvQjNDb25zdDY0VmFsdWUuaAkod29ya2luZyBjb3B5KQpAQCAt
MCwwICsxLDU5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE1IEFwcGxlIEluYy4gQWxsIHJp
Z2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBh
bmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBl
cm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1l
dDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUg
YWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFu
ZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmlu
YXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNl
LCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGlu
IHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVk
IHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVE
IEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBX
QVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVE
IFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VM
QVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJ
TkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVD
VCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBE
QU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9G
IFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICog
UFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04g
QU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1Qg
TElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNF
KSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUs
IEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICov
CisKKyNpZm5kZWYgQjNDb25zdDY0VmFsdWVfaAorI2RlZmluZSBCM0NvbnN0NjRWYWx1ZV9oCisK
KyNpbmNsdWRlICJCM1ZhbHVlLmgiCisKK25hbWVzcGFjZSBKU0MgeyBuYW1lc3BhY2UgQjMgewor
CitjbGFzcyBDb25zdDY0VmFsdWUgOiBwdWJsaWMgVmFsdWUgeworcHVibGljOgorICAgIHN0YXRp
YyBib29sIGFjY2VwdHMoT3Bjb2RlIG9wY29kZSkgeyByZXR1cm4gb3Bjb2RlID09IENvbnN0NjQ7
IH0KKyAgICAKKyAgICB+Q29uc3Q2NFZhbHVlKCk7CisgICAgCisgICAgaW50NjRfdCB2YWx1ZSgp
IGNvbnN0IHsgcmV0dXJuIG1fdmFsdWU7IH0KKworcHJvdGVjdGVkOgorICAgIHZvaWQgZHVtcE1l
dGEoUHJpbnRTdHJlYW0mKSBjb25zdCBvdmVycmlkZTsKKworcHJpdmF0ZToKKyAgICBmcmllbmQg
Y2xhc3MgUHJvY2VkdXJlOworCisgICAgQ29uc3Q2NFZhbHVlKHVuc2lnbmVkIGluZGV4LCBPcmln
aW4gb3JpZ2luLCBpbnQ2NF90IHZhbHVlKQorICAgICAgICA6IFZhbHVlKGluZGV4LCBDb25zdDY0
LCBJbnQ2NCwgb3JpZ2luKQorICAgICAgICAsIG1fdmFsdWUodmFsdWUpCisgICAgeworICAgIH0K
KyAgICAKKyAgICBpbnQ2NF90IG1fdmFsdWU7Cit9OworCit9IH0gLy8gbmFtZXNwYWNlIEpTQzo6
QjMKKworI2VuZGlmIC8vIEIzQ29uc3Q2NFZhbHVlX2gKKwpJbmRleDogU291cmNlL0phdmFTY3Jp
cHRDb3JlL2IzL0IzQ29uc3REb3VibGVWYWx1ZS5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL0ph
dmFTY3JpcHRDb3JlL2IzL0IzQ29uc3REb3VibGVWYWx1ZS5jcHAJKHJldmlzaW9uIDApCisrKyBT
b3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNDb25zdERvdWJsZVZhbHVlLmNwcAkod29ya2luZyBj
b3B5KQpAQCAtMCwwICsxLDQxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE1IEFwcGxlIElu
Yy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGlu
IHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlv
biwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwor
ICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJl
dGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25k
aXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlv
bnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICog
ICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNj
bGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxz
IHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElT
IFBST1ZJREVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1Ig
SU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisg
KiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBB
IFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFM
TCBBUFBMRSBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNU
LCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VR
VUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NV
UkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRB
LCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNF
RCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNU
LCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1Ig
T1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMg
U09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1B
R0UuIAorICovCisKKyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJCM0NvbnN0RG91Ymxl
VmFsdWUuaCIKKworbmFtZXNwYWNlIEpTQyB7IG5hbWVzcGFjZSBCMyB7CisKK0NvbnN0RG91Ymxl
VmFsdWU6On5Db25zdERvdWJsZVZhbHVlKCkKK3sKK30KKwordm9pZCBDb25zdERvdWJsZVZhbHVl
OjpkdW1wTWV0YShQcmludFN0cmVhbSYgb3V0KSBjb25zdAoreworICAgIG91dC5wcmludGYoIiVs
ZSIsIG1fdmFsdWUpOworfQorCit9IH0gLy8gbmFtZXNwYWNlIEpTQzo6QjMKKwpJbmRleDogU291
cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzQ29uc3REb3VibGVWYWx1ZS5oCj09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0t
IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM0NvbnN0RG91YmxlVmFsdWUuaAkocmV2aXNpb24g
MCkKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM0NvbnN0RG91YmxlVmFsdWUuaAkod29y
a2luZyBjb3B5KQpAQCAtMCwwICsxLDU5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE1IEFw
cGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQg
dXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlm
aWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0
aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBt
dXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBv
ZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3Ry
aWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdo
dAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2lu
ZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0
ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRX
QVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJF
U1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywg
VEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNT
IEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVO
VCBTSEFMTCBBUFBMRSBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkg
RElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1Ig
Q09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAq
IFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNF
LCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVS
IENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENP
TlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VO
Q0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9G
IFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VD
SCBEQU1BR0UuIAorICovCisKKyNpZm5kZWYgQjNDb25zdERvdWJsZVZhbHVlX2gKKyNkZWZpbmUg
QjNDb25zdERvdWJsZVZhbHVlX2gKKworI2luY2x1ZGUgIkIzVmFsdWUuaCIKKworbmFtZXNwYWNl
IEpTQyB7IG5hbWVzcGFjZSBCMyB7CisKK2NsYXNzIENvbnN0RG91YmxlVmFsdWUgOiBwdWJsaWMg
VmFsdWUgeworcHVibGljOgorICAgIHN0YXRpYyBib29sIGFjY2VwdHMoT3Bjb2RlIG9wY29kZSkg
eyByZXR1cm4gb3Bjb2RlID09IENvbnN0RG91YmxlOyB9CisgICAgCisgICAgfkNvbnN0RG91Ymxl
VmFsdWUoKTsKKyAgICAKKyAgICBkb3VibGUgdmFsdWUoKSBjb25zdCB7IHJldHVybiBtX3ZhbHVl
OyB9CisKK3Byb3RlY3RlZDoKKyAgICB2b2lkIGR1bXBNZXRhKFByaW50U3RyZWFtJikgY29uc3Qg
b3ZlcnJpZGU7CisKK3ByaXZhdGU6CisgICAgZnJpZW5kIGNsYXNzIFByb2NlZHVyZTsKKworICAg
IENvbnN0RG91YmxlVmFsdWUodW5zaWduZWQgaW5kZXgsIE9yaWdpbiBvcmlnaW4sIGRvdWJsZSB2
YWx1ZSkKKyAgICAgICAgOiBWYWx1ZShpbmRleCwgQ29uc3REb3VibGUsIERvdWJsZSwgb3JpZ2lu
KQorICAgICAgICAsIG1fdmFsdWUodmFsdWUpCisgICAgeworICAgIH0KKyAgICAKKyAgICBkb3Vi
bGUgbV92YWx1ZTsKK307CisKK30gfSAvLyBuYW1lc3BhY2UgSlNDOjpCMworCisjZW5kaWYgLy8g
QjNDb25zdERvdWJsZVZhbHVlX2gKKwpJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0Iz
Q29udHJvbFZhbHVlLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMv
QjNDb250cm9sVmFsdWUuY3BwCShyZXZpc2lvbiAwKQorKysgU291cmNlL0phdmFTY3JpcHRDb3Jl
L2IzL0IzQ29udHJvbFZhbHVlLmNwcAkod29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDQzIEBACisv
KgorICogQ29weXJpZ2h0IChDKSAyMDE1IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4K
KyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1z
LCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRl
ZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlz
dHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0
CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5n
IGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCBy
ZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2Yg
Y29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9j
dW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3Ry
aWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4g
YGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNM
VURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0Yg
TUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0Ug
QVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SCisgKiBDT05U
UklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwg
U1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJ
TkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09P
RFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVT
SU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICog
T0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBU
T1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFO
WSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNF
RCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisKKyNpbmNsdWRlICJj
b25maWcuaCIKKyNpbmNsdWRlICJCM0NvbnRyb2xWYWx1ZS5oIgorCituYW1lc3BhY2UgSlNDIHsg
bmFtZXNwYWNlIEIzIHsKKworQ29udHJvbFZhbHVlOjp+Q29udHJvbFZhbHVlKCkKK3sKK30KKwor
dm9pZCBDb250cm9sVmFsdWU6OmR1bXBNZXRhKFByaW50U3RyZWFtJiBvdXQpIGNvbnN0Cit7Cisg
ICAgQ29tbWFQcmludGVyIGNvbW1hOworICAgIGZvciAoQmFzaWNCbG9jayogYmxvY2sgOiBtX3N1
Y2Nlc3NvcnMpCisgICAgICAgIG91dC5wcmludChjb21tYSwgcG9pbnRlckR1bXAoYmxvY2spKTsK
K30KKworfSB9IC8vIG5hbWVzcGFjZSBKU0M6OkIzCisKSW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0
Q29yZS9iMy9CM0NvbnRyb2xWYWx1ZS5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0
Q29yZS9iMy9CM0NvbnRyb2xWYWx1ZS5oCShyZXZpc2lvbiAwKQorKysgU291cmNlL0phdmFTY3Jp
cHRDb3JlL2IzL0IzQ29udHJvbFZhbHVlLmgJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSwxMTcg
QEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTUgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2Vy
dmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkg
Zm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHBy
b3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4g
UmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5
cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xs
b3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBt
dXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlz
dCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAg
ICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUg
ZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUg
SU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMs
IElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElF
UyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVS
UE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IKKyAq
IENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVO
VEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElO
Q0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVU
RSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBP
UiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZ
CisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFks
IE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcg
SU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBB
RFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKworI2lmbmRl
ZiBCM0NvbnRyb2xWYWx1ZV9oCisjZGVmaW5lIEIzQ29udHJvbFZhbHVlX2gKKworI2luY2x1ZGUg
IkIzVmFsdWUuaCIKKworbmFtZXNwYWNlIEpTQyB7IG5hbWVzcGFjZSBCMyB7CisKK2NsYXNzIEJh
c2ljQmxvY2s7CisKK2NsYXNzIENvbnRyb2xWYWx1ZSA6IHB1YmxpYyBWYWx1ZSB7CitwdWJsaWM6
CisgICAgc3RhdGljIGJvb2wgYWNjZXB0cyhPcGNvZGUgb3Bjb2RlKQorICAgIHsKKyAgICAgICAg
c3dpdGNoIChvcGNvZGUpIHsKKyAgICAgICAgY2FzZSBKdW1wOgorICAgICAgICBjYXNlIEJyYW5j
aDoKKyAgICAgICAgY2FzZSBSZXR1cm46CisgICAgICAgIGNhc2UgT29wczoKKyAgICAgICAgICAg
IHJldHVybiB0cnVlOworICAgICAgICBjYXNlIFN3aXRjaDogCisgICAgICAgICAgICAvLyBUaGlz
IGlzIGhlcmUgYmVjYXVzZSBTd2l0Y2hWYWx1ZSBpcyBhIHN1YmNsYXNzIG9mIENvbnRyb2xWYWx1
ZSwgc28gd2Ugd2FudAorICAgICAgICAgICAgLy8gc3d0aWNoVmFsdWUtPmFzPENvbnRyb2xWYWx1
ZT4oKSB0byByZXR1cm4gbm9uLW51bGwuCisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAg
ICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgIH0K
KworICAgIHR5cGVkZWYgVmVjdG9yPEJhc2ljQmxvY2sqLCAyPiBTdWNjZXNzb3JMaXN0OworCisg
ICAgfkNvbnRyb2xWYWx1ZSgpOworCisgICAgdW5zaWduZWQgbnVtU3VjY2Vzc29ycygpIGNvbnN0
IHsgcmV0dXJuIG1fc3VjY2Vzc29ycy5zaXplKCk7IH0KKyAgICBCYXNpY0Jsb2NrKiBzdWNjZXNz
b3IodW5zaWduZWQgaW5kZXgpIGNvbnN0IHsgcmV0dXJuIG1fc3VjY2Vzc29yc1tpXTsgfQorICAg
IEJhc2ljQmxvY2sqJiBzdWNjZXNzb3IodW5zaWduZWQgaW5kZXgpIHsgcmV0dXJuIG1fc3VjY2Vz
c29yc1tpXTsgfQorCisgICAgY29uc3QgU3VjY2Vzc29yTGlzdCYgc3VjY2Vzc29ycygpIGNvbnN0
IHsgcmV0dXJuIG1fc3VjY2Vzc29yczsgfQorCitwcm90ZWN0ZWQ6CisgICAgdm9pZCBkdW1wTWV0
YShQcmludFN0cmVhbSYpIGNvbnN0IG92ZXJyaWRlOworCisgICAgLy8gVXNlIHRoaXMgZm9yIHN1
YmNsYXNzZXMuCisgICAgdGVtcGxhdGU8dHlwZW5hbWUuLi4gQXJndW1lbnRzPgorICAgIENvbnRy
b2xWYWx1ZSh1bnNpZ25lZCBpbmRleCwgT3Bjb2RlIG9wY29kZSwgVHlwZSB0eXBlLCBPcmlnaW4g
b3JpZ2luLCBBcmd1bWVudHMuLi4gYXJndW1lbnRzKQorICAgICAgICA6IFZhbHVlKGluZGV4LCBv
cGNvZGUsIHR5cGUsIG9yaWdpbiwgYXJndW1lbnRzLi4uKQorICAgIHsKKyAgICB9CisKKyAgICAv
LyBTdWJjbGFzc2VzIHdpbGwgcG9wdWxhdGUgdGhpcy4KKyAgICBTdWNjZXNzb3JMaXN0IG1fc3Vj
Y2Vzc29yczsKKworcHJpdmF0ZToKKyAgICBmcmllbmQgY2xhc3MgUHJvY2VkdXJlOworCisgICAg
Ly8gVXNlIHRoaXMgZm9yIE9vcHMuCisgICAgQ29udHJvbFZhbHVlKHVuc2lnbmVkIGluZGV4LCBP
cGNvZGUgb3Bjb2RlLCBPcmlnaW4gb3JpZ2luKQorICAgICAgICA6IFZhbHVlKGluZGV4LCBvcGNv
ZGUsIFZvaWQsIG9yaWdpbikKKyAgICB7CisgICAgICAgIEFTU0VSVChvcGNvZGUgPT0gT29wcyk7
CisgICAgfQorCisgICAgLy8gVXNlIHRoaXMgZm9yIFJldHVybi4KKyAgICBDb250cm9sVmFsdWUo
dW5zaWduZWQgaW5kZXgsIE9wY29kZSBvcGNvZGUsIE9yaWdpbiBvcmlnaW4sIFZhbHVlKiByZXN1
bHQpCisgICAgICAgIDogVmFsdWUoaW5kZXgsIG9wY29kZSwgVm9pZCwgb3JpZ2luLCByZXN1bHQp
CisgICAgeworICAgICAgICBBU1NFUlQob3Bjb2RlID09IFJldHVybik7CisgICAgfQorCisgICAg
Ly8gVXNlIHRoaXMgZm9yIEp1bXAuCisgICAgQ29udHJvbFZhbHVlKHVuc2lnbmVkIGluZGV4LCBP
cGNvZGUgb3Bjb2RlLCBPcmlnaW4gb3JpZ2luLCBCYXNpY0Jsb2NrKiB0YXJnZXQpCisgICAgICAg
IDogVmFsdWUoaW5kZXgsIG9wY29kZSwgVm9pZCwgb3JpZ2luKQorICAgIHsKKyAgICAgICAgQVNT
RVJUKG9wY29kZSA9PSBKdW1wKTsKKyAgICAgICAgbV9zdWNjZXNzb3JzLmFwcGVuZCh0YXJnZXQp
OworICAgIH0KKworICAgIC8vIFVzZSB0aGlzIGZvciBCcmFuY2guCisgICAgQ29udHJvbFZhbHVl
KAorICAgICAgICB1bnNpZ25lZCBpbmRleCwgT3Bjb2RlIG9wY29kZSwgT3JpZ2luIG9yaWdpbiwg
VmFsdWUqIHByZWRpY2F0ZSwKKyAgICAgICAgQmFzaWNCbG9jayogeWVzLCBCYXNpY0Jsb2NrKiBu
bykKKyAgICAgICAgOiBWYWx1ZShpbmRleCwgb3Bjb2RlLCBWb2lkLCBvcmlnaW4sIHByZWRpY2F0
ZSkKKyAgICB7CisgICAgICAgIEFTU0VSVChvcGNvZGUgPT0gQnJhbmNoKTsKKyAgICAgICAgbV9z
dWNjZXNzb3JzLmFwcGVuZCh5ZXMpOworICAgICAgICBtX3N1Y2Nlc3NvcnMuYXBwZW5kKG5vKTsK
KyAgICB9Cit9OworCit9IH0gLy8gbmFtZXNwYWNlIEpTQzo6QjMKKworI2VuZGlmIC8vIEIzQ29u
dHJvbFZhbHVlX2gKKwpJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzSW5kZXhNYXAu
aAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNJbmRleE1hcC5oCShy
ZXZpc2lvbiAwKQorKysgU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzSW5kZXhNYXAuaAkod29y
a2luZyBjb3B5KQpAQCAtMCwwICsxLDYzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE1IEFw
cGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQg
dXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlm
aWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0
aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBt
dXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBv
ZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3Ry
aWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdo
dAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2lu
ZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0
ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRX
QVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJF
U1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywg
VEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNT
IEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVO
VCBTSEFMTCBBUFBMRSBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkg
RElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1Ig
Q09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAq
IFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNF
LCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVS
IENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENP
TlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VO
Q0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9G
IFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VD
SCBEQU1BR0UuIAorICovCisKKyNpZm5kZWYgQjNJbmRleE1hcF9oCisjZGVmaW5lIEIzSW5kZXhN
YXBfaAorCituYW1lc3BhY2UgSlNDIHsgbmFtZXNwYWNlIEIzIHsKKworLy8gVGhpcyBpcyBhIG1h
cCBmb3Iga2V5cyB0aGF0IGhhdmUgYW4gaW5kZXgoKS4gSXQncyBzdXBlciBlZmZpY2llbnQgZm9y
IEJhc2ljQmxvY2tzLiBJdCdzIG9ubHkKKy8vIGVmZmljaWVudCBmb3IgVmFsdWVzIGlmIHlvdSBk
b24ndCBjcmVhdGUgdG9vIG1hbnkgb2YgdGhlc2UgbWFwcywgc2luY2UgVmFsdWVzIGNhbiBoYXZl
IHZlcnkKKy8vIHNwYXJzZSBpbmRpY2VzIGFuZCB0aGVyZSBhcmUgYSBsb3Qgb2YgVmFsdWVzLgor
Cit0ZW1wbGF0ZTx0eXBlbmFtZSBLZXksIHR5cGVuYW1lIFZhbHVlPgorY2xhc3MgSW5kZXhNYXAg
eworcHVibGljOgorICAgIGV4cGxpY2l0IEluZGV4TWFwKHNpemVfdCBzaXplID0gMCkKKyAgICB7
CisgICAgICAgIG1fdmVjdG9yLnJlc2l6ZShzaXplKTsKKyAgICB9CisKKyAgICB2b2lkIHJlc2l6
ZShzaXplX3Qgc2l6ZSkKKyAgICB7CisgICAgICAgIG1fdmVjdG9yLnJlc2l6ZShzaXplKTsKKyAg
ICB9CisKKyAgICBWYWx1ZSYgb3BlcmF0b3JbXShzaXplX3QgaW5kZXgpCisgICAgeworICAgICAg
ICByZXR1cm4gbV92ZWN0b3JbaW5kZXhdOworICAgIH0KKyAgICAKKyAgICBjb25zdCBWYWx1ZSYg
b3BlcmF0b3JbXShzaXplX3QgaW5kZXgpIGNvbnN0CisgICAgeworICAgICAgICByZXR1cm4gbV92
ZWN0b3JbaW5kZXhdOworICAgIH0KKyAgICAKK3ByaXZhdGU6CisgICAgVmVjdG9yPFZhbHVlPiBt
X3ZlY3RvcjsKK307CisKK30gfSAvLyBuYW1lc3BhY2UgSlNDOjpCMworCkluZGV4OiBTb3VyY2Uv
SmF2YVNjcmlwdENvcmUvYjMvQjNJbmRleFNldC5oCj09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZh
U2NyaXB0Q29yZS9iMy9CM0luZGV4U2V0LmgJKHJldmlzaW9uIDApCisrKyBTb3VyY2UvSmF2YVNj
cmlwdENvcmUvYjMvQjNJbmRleFNldC5oCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsMTQxIEBA
CisvKgorICogQ29weXJpZ2h0IChDKSAyMDE1IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZl
ZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZv
cm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92
aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJl
ZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJp
Z2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93
aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVz
dCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qg
b2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAg
ZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRp
c3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElO
Qy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJ
TkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMg
T0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBP
U0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SCisgKiBD
T05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRB
TCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNM
VURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUg
R09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1Ig
QlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQor
ICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBP
UiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElO
IEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURW
SVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisKKyNpZm5kZWYg
QjNJbmRleFNldF9oCisjZGVmaW5lIEIzSW5kZXhTZXRfaAorCisjaW5jbHVkZSA8d3RmL0JpdFZl
Y3Rvci5oPgorI2luY2x1ZGUgPHd0Zi9Db21tYVByaW50ZXIuaD4KKworbmFtZXNwYWNlIEpTQyB7
IG5hbWVzcGFjZSBCMyB7CisKKy8vIFRoaXMgaXMgYSBzZXQgZm9yIHRoaW5ncyB0aGF0IGhhdmUg
YW4gaW5kZXgoKS4gSXQncyBzdXBlciBlZmZpY2llbnQgZm9yIEJhc2ljQmxvY2tzLiBJdCdzIG9u
bHkKKy8vIGVmZmljaWVudCBmb3IgVmFsdWVzIGlmIHlvdSBkb24ndCBjcmVhdGUgdG9vIG1hbnkg
b2YgdGhlc2Ugc2V0cywgc2luY2UgVmFsdWVzIGNhbiBoYXZlIHZlcnkgc3BhcnNlCisvLyBpbmRp
Y2VzIGFuZCB0aGVyZSBhcmUgYSBsb3Qgb2YgVmFsdWVzLgorCisvLyBJZiB5b3Ugd2FudCBhIHNl
dCBvZiBCYXNpY0Jsb2NrcywgeW91IGRvIEluZGV4U2V0PEJhc2ljQmxvY2s+LiBTbywgVCA9IEJh
c2ljQmxvY2suCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorY2xhc3MgSW5kZXhTZXQgeworcHVibGlj
OgorICAgIEluZGV4U2V0KCkKKyAgICB7CisgICAgfQorCisgICAgYm9vbCBhZGQoVCogdmFsdWUp
CisgICAgeworICAgICAgICByZXR1cm4gIW1fc2V0LnNldCh2YWx1ZS0+aW5kZXgoKSk7CisgICAg
fQorCisgICAgYm9vbCBjb250YWlucyhUKiB2YWx1ZSkgY29uc3QKKyAgICB7CisgICAgICAgIGlm
ICghdmFsdWUpCisgICAgICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICAgICAgcmV0dXJuIG1f
c2V0LmdldCh2YWx1ZS0+aW5kZXgoKSk7CisgICAgfQorCisgICAgdGVtcGxhdGU8dHlwZW5hbWUg
Q29sbGVjdGlvblR5cGU+CisgICAgY2xhc3MgSXRlcmFibGUgeworICAgIHB1YmxpYzoKKyAgICAg
ICAgSXRlcmFibGUoY29uc3QgQ29sbGVjdGlvblR5cGUmIGNvbGxlY3Rpb24sIGNvbnN0IEluZGV4
U2V0JiBzZXQpCisgICAgICAgICAgICA6IG1fY29sbGVjdGlvbihjb2xsZWN0aW9uKQorICAgICAg
ICAgICAgLCBtX3NldChzZXQpCisgICAgICAgIHsKKyAgICAgICAgfQorCisgICAgICAgIGNsYXNz
IGl0ZXJhdG9yIHsKKyAgICAgICAgcHVibGljOgorICAgICAgICAgICAgaXRlcmF0b3IoKQorICAg
ICAgICAgICAgICAgIDogbV9jb2xsZWN0aW9uKG51bGxwdHIpCisgICAgICAgICAgICB7CisgICAg
ICAgICAgICB9CisKKyAgICAgICAgICAgIGl0ZXJhdG9yKGNvbnN0IENvbGxlY3Rpb25UeXBlJiBj
b2xsZWN0aW9uLCBCaXRWZWN0b3I6OlNldEJpdHNJdGVyYWJsZTo6aXRlcmF0b3IgaXRlcikKKyAg
ICAgICAgICAgICAgICA6IG1fY29sbGVjdGlvbigmY29sbGVjdGlvbikKKyAgICAgICAgICAgICAg
ICAsIG1faXRlcihpdGVyKQorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorCisgICAgICAg
ICAgICBUKiBvcGVyYXRvciooKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVy
biBtX2NvbGxlY3Rpb24tPmF0KCptX2l0ZXIpOworICAgICAgICAgICAgfQorCisgICAgICAgICAg
ICBpdGVyYXRvciYgb3BlcmF0b3IrKygpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAg
bV9pdGVyKys7CisgICAgICAgICAgICAgICAgcmV0dXJuICp0aGlzOworICAgICAgICAgICAgfQor
CisgICAgICAgICAgICBib29sIG9wZXJhdG9yPT0oY29uc3QgaXRlcmF0b3ImIG90aGVyKSBjb25z
dAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBtX2l0ZXIgPT0gb3RoZXIu
bV9pdGVyOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBib29sIG9wZXJhdG9yIT0oY29u
c3QgaXRlcmF0b3ImIG90aGVyKSBjb25zdAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAg
IHJldHVybiAhKCp0aGlzID09IG90aGVyKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICBwcml2
YXRlOgorICAgICAgICAgICAgY29uc3QgQ29sbGVjdGlvblR5cGUqIG1fY29sbGVjdGlvbjsKKyAg
ICAgICAgICAgIEJpdFZlY3Rvcjo6U2V0Qml0c0l0ZXJhYmxlOjppdGVyYXRvciBtX2l0ZXI7Cisg
ICAgICAgIH07CisKKyAgICAgICAgaXRlcmF0b3IgYmVnaW4oKSBjb25zdCB7IHJldHVybiBpdGVy
YXRvcihtX2NvbGxlY3Rpb24sIG1fc2V0LmJlZ2luKCkpOyB9CisgICAgICAgIGl0ZXJhdG9yIGVu
ZCgpIGNvbnN0IHsgcmV0dXJuIGl0ZXJhdG9yKG1fY29sbGVjdGlvbiwgbV9zZXQuZW5kKCkpOyB9
CisKKyAgICBwcml2YXRlOgorICAgICAgICBjb25zdCBDb2xsZWN0aW9uVHlwZSYgbV9jb2xsZWN0
aW9uOworICAgICAgICBjb25zdCBJbmRleFNldCYgbV9zZXQ7CisgICAgfTsKKworICAgIC8vIEZv
ciBiYXNpYyBibG9ja3MsIHlvdSBkbzoKKyAgICAvLyBpbmRleFNldC52YWx1ZXMocHJvY2VkdXJl
KTsKKyAgICAvLworICAgIC8vIEZvciB2YWx1ZXMsIHlvdSBkbzoKKyAgICAvLyBpbmRleFNldC52
YWx1ZXMocHJvY2VkdXJlLnZhbHVlcygpKTsKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBDb2xsZWN0
aW9uVHlwZT4KKyAgICBJdGVyYWJsZTxDb2xsZWN0aW9uVHlwZT4gdmFsdWVzKGNvbnN0IENvbGxl
Y3Rpb25UeXBlJiBjb2xsZWN0aW9uKSBjb25zdAorICAgIHsKKyAgICAgICAgcmV0dXJuIEl0ZXJh
YmxlPENvbGxlY3Rpb25UeXBlPihjb2xsZWN0aW9uKTsKKyAgICB9CisKKyAgICBjb25zdCBCaXRW
ZWN0b3ImIGluZGljZXMoKSBjb25zdCB7IHJldHVybiBtX3NldDsgfQorCisgICAgdm9pZCBkdW1w
KFByaW50U3RyZWFtJiBvdXQpIGNvbnN0CisgICAgeworICAgICAgICBDb21tYVByaW50ZXIgY29t
bWE7CisgICAgICAgIGZvciAoc2l6ZV90IGluZGV4IDogaW5kaWNlcygpLnNldEJpdHMoKSkKKyAg
ICAgICAgICAgIG91dC5wcmludChjb21tYSwgVDo6ZHVtcFByZWZpeCwgaW5kZXgpOworICAgIH0K
KworcHJpdmF0ZToKKyAgICBCaXRWZWN0b3IgbV9zZXQ7Cit9OworCit9IH0gLy8gbmFtZXNwYWNl
IEpTQzo6QjMKKworI2VuZGlmIC8vIEIzSW5kZXhTZXRfaAorCkluZGV4OiBTb3VyY2UvSmF2YVNj
cmlwdENvcmUvYjMvQjNMb3dlcmluZ01hdGNoZXIucGF0dGVybnMKPT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291
cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzTG93ZXJpbmdNYXRjaGVyLnBhdHRlcm5zCShyZXZpc2lv
biAwKQorKysgU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzTG93ZXJpbmdNYXRjaGVyLnBhdHRl
cm5zCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsNDQgQEAKKyMgQ29weXJpZ2h0IChDKSAyMDE1
IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyMKKyMgUmVkaXN0cmlidXRpb24gYW5k
IHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisjIG1vZGlm
aWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0
aW9ucworIyBhcmUgbWV0OgorIyAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVz
dCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorIyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBj
b25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisjIDIuIFJlZGlzdHJpYnV0
aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Cisj
ICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlz
Y2xhaW1lciBpbiB0aGUKKyMgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxz
IHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyMKKyMgVEhJUyBTT0ZUV0FSRSBJUyBQ
Uk9WSURFRCBCWSBBUFBMRSBJTkMuIEFORCBJVFMgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJworIyBB
TkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1Qg
TElNSVRFRCBUTywKKyMgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkg
QU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorIyBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJ
TiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SIElUUyBDT05UUklCVVRPUlMKKyMgQkUgTElB
QkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBM
QVJZLCBPUgorIyBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1J
VEVEIFRPLCBQUk9DVVJFTUVOVCBPRgorIyBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBM
T1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MKKyMgSU5URVJSVVBUSU9O
KSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIg
SU4KKyMgQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdM
SUdFTkNFIE9SIE9USEVSV0lTRSkKKyMgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNF
IE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRgorIyBUSEUgUE9TU0lCSUxJVFkg
T0YgU1VDSCBEQU1BR0UuCisKK21hdGNoZXIgTG93ZXJpbmdNYXRjaGVyCisKKyMgVGhlc2UgcnVs
ZXMgYXJlIGNvbnNpZGVyZWQgaW4gYSBjYXNjYWRlLCBzdGFydGluZyBhdCB0aGUgdG9wLiBJdCdz
IGltcGxlbmVudGVkIHVzaW5nIHN3aXRjaAorIyBzdGF0ZW1lbnRzIHdoZXJldmVyIHBvc3NpYmxl
LgorCisjIE5vdGU6IGFkZGluZyBtb3JlIHJ1bGVzIHRvIHRoaXMgbWF0Y2hlciBpcyBhbiBleGNl
bGxlbnQgd2F5IG9mIGltcHJvdmluZyBwZXJmb3JtYW5jZSEKKworTG9hZCA9IExvYWQoYWRkcmVz
cykKKworIyBXZSBwcm9iYWJseSBkb24ndCBuZWVkIHRoZXNlIGZvcm1zLgorQWRkTG9hZDEgPSBB
ZGQoTG9hZChhZGRyZXNzKSwgdmFsdWUpCitBZGRMb2FkMiA9IEFkZCh2YWx1ZSwgTG9hZChhZGRy
ZXNzKSkKK0FkZCA9IEFkZChsZWZ0LCByaWdodCkKKworU3RvcmVBZGRMb2FkMSA9IFN0b3JlKEFk
ZChMb2FkKGFkZHJlc3MpLCB2YWx1ZSksIGFkZHJlc3MpCitTdG9yZUFkZExvYWQyID0gU3RvcmUo
QWRkKHZhbHVlLCBMb2FkKGFkZHJlc3MpKSwgYWRkcmVzcykKK1N0b3JlQW5kTG9hZCA9IFN0b3Jl
KEFuZChMb2FkKGFkZHJlc3MpLCB2YWx1ZSksIGFkZHJlc3MpCitTdG9yZSA9IFN0b3JlKHZhbHVl
LCBhZGRyZXNzKQorCitSZXR1cm4gPSBSZXR1cm4odmFsdWUpCisKSW5kZXg6IFNvdXJjZS9KYXZh
U2NyaXB0Q29yZS9iMy9CM01lbW9yeVZhbHVlLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2
YVNjcmlwdENvcmUvYjMvQjNNZW1vcnlWYWx1ZS5jcHAJKHJldmlzaW9uIDApCisrKyBTb3VyY2Uv
SmF2YVNjcmlwdENvcmUvYjMvQjNNZW1vcnlWYWx1ZS5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTAs
MCArMSw0MiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNSBBcHBsZSBJbmMuIEFsbCByaWdo
dHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5k
IGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJt
aXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6
CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFi
b3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQg
dGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFy
eSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwg
dGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0
aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3
aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBC
WSBBUFBMRSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FS
UkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBX
QVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFS
CisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5D
LiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1Qs
IElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFN
QUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBT
VUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBS
T0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFO
WSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJ
QUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkg
QVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBF
VkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLiAKKyAqLwor
CisjaW5jbHVkZSAiY29uZmlnLmgiCisjaW5jbHVkZSAiQjNNZW1vcnlWYWx1ZS5oIgorCituYW1l
c3BhY2UgSlNDIHsgbmFtZXNwYWNlIEIzIHsKKworTWVtb3J5VmFsdWU6On5NZW1vcnlWYWx1ZSgp
Cit7Cit9CisKK3ZvaWQgTWVtb3J5VmFsdWU6OmR1bXBNZXRhKFByaW50U3RyZWFtJiBvdXQpIGNv
bnN0Cit7CisgICAgaWYgKG1fb2Zmc2V0KQorICAgICAgICBvdXQucHJpbnQoIm9mZnNldCA9ICIs
IG1fb2Zmc2V0KTsKK30KKworfSB9IC8vIG5hbWVzcGFjZSBKU0M6OkIzCisKSW5kZXg6IFNvdXJj
ZS9KYXZhU2NyaXB0Q29yZS9iMy9CM01lbW9yeVZhbHVlLmgKPT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNl
L0phdmFTY3JpcHRDb3JlL2IzL0IzTWVtb3J5VmFsdWUuaAkocmV2aXNpb24gMCkKKysrIFNvdXJj
ZS9KYXZhU2NyaXB0Q29yZS9iMy9CM01lbW9yeVZhbHVlLmgJKHdvcmtpbmcgY29weSkKQEAgLTAs
MCArMSwxNDIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTUgQXBwbGUgSW5jLiBBbGwgcmln
aHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFu
ZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVy
bWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0
OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBh
Ym92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5k
IHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5h
cnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2Us
IHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4g
dGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQg
d2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQg
QlkgQVBQTEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdB
UlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQg
V0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxB
UgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElO
Qy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNU
LCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERB
TUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0Yg
U1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQ
Uk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBB
TlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBM
SUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0Up
IEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwg
RVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8K
KworI2lmbmRlZiBCM01lbW9yeVZhbHVlX2gKKyNkZWZpbmUgQjNNZW1vcnlWYWx1ZV9oCisKKyNp
bmNsdWRlICJCM1ZhbHVlLmgiCisKK25hbWVzcGFjZSBKU0MgeyBuYW1lc3BhY2UgQjMgeworCitj
bGFzcyBNZW1vcnlWYWx1ZSA6IHB1YmxpYyBWYWx1ZSB7CitwdWJsaWM6CisgICAgc3RhdGljIGJv
b2wgYWNjZXB0cyhPcGNvZGUgb3Bjb2RlKQorICAgIHsKKyAgICAgICAgc3dpdGNoIChvcGNvZGUp
IHsKKyAgICAgICAgY2FzZSBMb2FkOFo6CisgICAgICAgIGNhc2UgTG9hZDhTOgorICAgICAgICBj
YXNlIExvYWQxNlo6CisgICAgICAgIGNhc2UgTG9hZDE2UzoKKyAgICAgICAgY2FzZSBMb2FkRmxv
YXQ6CisgICAgICAgIGNhc2UgTG9hZDoKKyAgICAgICAgY2FzZSBTdG9yZTg6CisgICAgICAgIGNh
c2UgU3RvcmUxNjoKKyAgICAgICAgY2FzZSBTdG9yZUZsb2F0OgorICAgICAgICBjYXNlIFN0b3Jl
OgorICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAg
ICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICB+TWVtb3J5VmFsdWUoKTsK
KworICAgIGludHB0cl90IG9mZnNldCgpIGNvbnN0IHsgcmV0dXJuIG1fb2Zmc2V0OyB9CisKK3By
b3RlY3RlZDoKKyAgICB2b2lkIGR1bXBNZXRhKFByaW50U3RyZWFtJikgY29uc3Qgb3ZlcnJpZGU7
CisKK3ByaXZhdGU6CisgICAgZnJpZW5kIGNsYXNzIFByb2NlZHVyZTsKKworICAgIC8vIFVzZSB0
aGlzIGZvcm0gZm9yIExvYWQgKGJ1dCBub3QgTG9hZDhaLCBMb2FkOFMsIG9yIGFueSBvZiB0aGUg
TG9hZHMgdGhhdCBoYXZlIGEgc3VmZml4IHRoYXQKKyAgICAvLyBkZXNjcmliZXMgdGhlIHJldHVy
bmVkIHR5cGUpLgorICAgIE1lbW9yeVZhbHVlKAorICAgICAgICB1bnNpZ25lZCBpbmRleCwgT3Bj
b2RlIG9wY29kZSwgVHlwZSB0eXBlLCBPcmlnaW4gb3JpZ2luLCBWYWx1ZSogcG9pbnRlciwKKyAg
ICAgICAgaW50cHRyX3Qgb2Zmc2V0ID0gMCkKKyAgICAgICAgOiBWYWx1ZShpbmRleCwgb3Bjb2Rl
LCB0eXBlLCBvcmlnaW4sIHBvaW50ZXIpCisgICAgICAgICwgbV9vZmZzZXQob2Zmc2V0KQorICAg
IHsKKyAgICAgICAgaWYgKCFBU1NFUlRfRElTQUJMRUQpIHsKKyAgICAgICAgICAgIHN3aXRjaCAo
b3Bjb2RlKSB7CisgICAgICAgICAgICBjYXNlIExvYWQ6CisgICAgICAgICAgICAgICAgYnJlYWs7
CisgICAgICAgICAgICBjYXNlIExvYWQ4WjoKKyAgICAgICAgICAgIGNhc2UgTG9hZDhTOgorICAg
ICAgICAgICAgY2FzZSBMb2FkMTZaOgorICAgICAgICAgICAgY2FzZSBMb2FkMTZTOgorICAgICAg
ICAgICAgICAgIEFTU0VSVCh0eXBlID09IEludDMyKTsKKyAgICAgICAgICAgICAgICBicmVhazsK
KyAgICAgICAgICAgIGNhc2UgTG9hZEZsb2F0OgorICAgICAgICAgICAgICAgIEFTU0VSVCh0eXBl
ID09IERvdWJsZSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIFN0
b3JlODoKKyAgICAgICAgICAgIGNhc2UgU3RvcmUxNjoKKyAgICAgICAgICAgIGNhc2UgU3RvcmVG
bG9hdDoKKyAgICAgICAgICAgIGNhc2UgU3RvcmU6CisgICAgICAgICAgICAgICAgQVNTRVJUKHR5
cGUgPT0gVm9pZCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0
OgorICAgICAgICAgICAgICAgIEFTU0VSVF9OT1RfUkVBQ0hFRCgpOworICAgICAgICAgICAgfQor
ICAgICAgICB9CisgICAgfQorCisgICAgLy8gVXNlIHRoaXMgZm9ybSBmb3IgbG9hZHMgd2hlcmUg
dGhlIHJldHVybiB0eXBlIGlzIGltcGxpZWQuCisgICAgTWVtb3J5VmFsdWUodW5zaWduZWQgaW5k
ZXgsIE9wY29kZSBvcGNvZGUsIE9yaWdpbiBvcmlnaW4sIFZhbHVlKiBwb2ludGVyLCBpbnRwdHJf
dCBvZmZzZXQgPSAwKQorICAgICAgICA6IFZhbHVlKGluZGV4LCBvcGNvZGUsIG9wY29kZSA9PSBM
b2FkRmxvYXQgPyBEb3VibGUgOiBJbnQzMiwgb3JpZ2luLCBwb2ludGVyKQorICAgICAgICAsIG1f
b2Zmc2V0KG9mZnNldCkKKyAgICB7CisgICAgICAgIGlmICghQVNTRVJUX0RJU0FCTEVEKSB7Cisg
ICAgICAgICAgICBzd2l0Y2ggKG9wY29kZSkgeworICAgICAgICAgICAgY2FzZSBMb2FkOFo6Cisg
ICAgICAgICAgICBjYXNlIExvYWQ4UzoKKyAgICAgICAgICAgIGNhc2UgTG9hZDE2WjoKKyAgICAg
ICAgICAgIGNhc2UgTG9hZDE2UzoKKyAgICAgICAgICAgIGNhc2UgTG9hZEZsb2F0OgorICAgICAg
ICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBB
U1NFUlRfTk9UX1JFQUNIRUQoKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAg
IH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIFVzZSB0aGlzIGZvcm0gZm9yIHN0b3Jlcy4K
KyAgICBNZW1vcnlWYWx1ZSgKKyAgICAgICAgdW5zaWduZWQgaW5kZXgsIE9wY29kZSBvcGNvZGUs
IE9yaWdpbiBvcmlnaW4sIFZhbHVlKiB2YWx1ZSwgVmFsdWUqIHBvaW50ZXIsCisgICAgICAgIGlu
dHB0cl90IG9mZnNldCA9IDApCisgICAgICAgIDogVmFsdWUoaW5kZXgsIG9wY29kZSwgVm9pZCwg
b3JpZ2luLCB2YWx1ZSwgcG9pbnRlcikKKyAgICAgICAgLCBtX29mZnNldChvZmZzZXQpCisgICAg
eworICAgICAgICBpZiAoIUFTU0VSVF9ESVNBQkxFRCkgeworICAgICAgICAgICAgc3dpdGNoIChv
cGNvZGUpIHsKKyAgICAgICAgICAgIGNhc2UgU3RvcmU4OgorICAgICAgICAgICAgY2FzZSBTdG9y
ZTE2OgorICAgICAgICAgICAgY2FzZSBTdG9yZUZsb2F0OgorICAgICAgICAgICAgY2FzZSBTdG9y
ZToKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAg
ICAgICAgICAgQVNTRVJUX05PVF9SRUFDSEVEKCk7CisgICAgICAgICAgICAgICAgYnJlYWs7Cisg
ICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9OworCit9IH0gLy8gbmFtZXNwYWNlIEpT
Qzo6QjMKKworI2VuZGlmIC8vIEIzTWVtb3J5VmFsdWVfaAorCkluZGV4OiBTb3VyY2UvSmF2YVNj
cmlwdENvcmUvYjMvQjNPcGNvZGUuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0
Q29yZS9iMy9CM09wY29kZS5jcHAJKHJldmlzaW9uIDApCisrKyBTb3VyY2UvSmF2YVNjcmlwdENv
cmUvYjMvQjNPcGNvZGUuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsNDcgQEAKKy8qCisg
KiBDb3B5cmlnaHQgKEMpIDIwMTUgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoK
KyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdp
dGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRo
YXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmli
dXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAq
ICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlz
Y2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJv
ZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25k
aXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVu
dGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0
aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFT
IElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElO
RywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJD
SEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUg
RElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IKKyAqIENPTlRSSUJV
VE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVD
SUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywg
QlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBP
UiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVT
UyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBM
SUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQK
KyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdB
WSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9G
IFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKworI2luY2x1ZGUgImNvbmZp
Zy5oIgorI2luY2x1ZGUgIkIzT3Bjb2RlLmgiCisKKyNpbmNsdWRlIDx3dGYvUHJpbnRTdHJlYW0u
aD4KKworbmFtZXNwYWNlIFdURiB7CisKK3VzaW5nIG5hbWVzcGFjZSBKU0M6OkIzOworCit2b2lk
IHByaW50SW50ZXJuYWwoUHJpbnRTdHJlYW0mIG91dCwgT3Bjb2RlIG9wY29kZSkKK3sKKyAgICBz
d2l0Y2ggKG9wY29kZSkgeworICAgIGNhc2UgSWRlbnRpdHk6CisgICAgICAgIG91dC5wcmludCgi
SWRlbnRpdHkiKTsKKyAgICAgICAgcmV0dXJuOworICAgICAgICAvLyBGSVhNRQorICAgIH0KKyAg
ICBSRUxFQVNFX0FTU0VSVF9OT1RfUkVBQ0hFRCgpOworfQorCit9IC8vIG5hbWVzcGFjZSBXVEYK
KwpJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzT3Bjb2RlLmgKPT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQot
LS0gU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzT3Bjb2RlLmgJKHJldmlzaW9uIDApCisrKyBT
b3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNPcGNvZGUuaAkod29ya2luZyBjb3B5KQpAQCAtMCww
ICsxLDIxNSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNSBBcHBsZSBJbmMuIEFsbCByaWdo
dHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5k
IGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJt
aXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6
CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFi
b3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQg
dGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFy
eSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwg
dGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0
aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3
aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBC
WSBBUFBMRSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FS
UkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBX
QVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFS
CisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5D
LiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1Qs
IElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFN
QUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBT
VUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBS
T0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFO
WSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJ
QUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkg
QVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBF
VkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLiAKKyAqLwor
CisjaWZuZGVmIEIzT3Bjb2RlX2gKKyNkZWZpbmUgQjNPcGNvZGVfaAorCisjaW5jbHVkZSA8d3Rm
L1N0ZExpYkV4dHJhcy5oPgorCituYW1lc3BhY2UgSlNDIHsgbmFtZXNwYWNlIEIzIHsKKworZW51
bSBPcGNvZGUgOiBpbnQxNl90IHsKKyAgICAvLyBBIG5vLW9wIHRoYXQgcmV0dXJucyBWb2lkLCB1
c2VmdWwgZm9yIHdoZW4geW91IHdhbnQgdG8gcmVtb3ZlIGEgdmFsdWUuCisgICAgTm9wLAorICAg
ICAKKyAgICAvLyBQb2x5bW9ycGhpYyBpZGVudGl0eSwgdXNhYmxlIHdpdGggYW55IHZhbHVlIHR5
cGUuCisgICAgSWRlbnRpdHksCisKKyAgICAvLyBDb25zdGFudHMuIFVzZSB0aGUgQ29uc3RWYWx1
ZSogY2xhc3Nlcy4gQ29uc3RhbnRzIGV4aXN0IGluIHRoZSBjb250cm9sIGZsb3csIHNvIHRoYXQg
d2UgY2FuCisgICAgLy8gcmVhc29uIGFib3V0IHdoZXJlIHdlIHdvdWxkIGNvbnN0cnVjdCB0aGVt
LiBMYXJnZSBjb25zdGFudHMgYXJlIGV4cGVuc2l2ZSB0byBjcmVhdGUuCisgICAgQ29uc3QzMiwK
KyAgICBDb25zdDY0LAorICAgIENvbnN0RG91YmxlLAorCisgICAgLy8gVGhlIG1hZ2ljYWwgc3Rh
Y2sgc2xvdC4gVGhpcyBpcyB2aWV3ZWQgYXMgZXhlY3V0aW5nIGF0IHRoZSB0b3Agb2YgdGhlIHBy
b2dyYW0gcmVnYXJkbGVzcyBvZgorICAgIC8vIHdoZXJlIGluIGNvbnRyb2wgZmxvdyB5b3UgcHV0
IGl0LiBFYWNoIGluc3RhbmNlIG9mIGEgU3RhY2tTbG90IFZhbHVlIGdldHMgYSBkaXNqb2ludCBy
YW5nZSBvZgorICAgIC8vIHN0YWNrIG1lbW9yeS4gVXNlIHRoZSBTdGFja1Nsb3RWYWx1ZSBjbGFz
cy4KKyAgICBTdGFja1Nsb3QsCisKKyAgICAvLyBUaGUgbWFnaWNhbCBhcmd1bWVudCByZWdpc3Rl
ci4gVGhpcyBpcyB2aWV3ZWQgYXMgZXhlY3V0aW5nIGF0IHRoZSB0b3Agb2YgdGhlIHByb2dyYW0K
KyAgICAvLyByZWdhcmRsZXNzIG9mIHdoZXJlIGluIGNvbnRyb2wgZmxvdyB5b3UgcHV0IGl0LCBh
bmQgdGhlIGNvbXBpbGVyIHRha2VzIGNhcmUgdG8gZW5zdXJlIHRoYXQgd2UKKyAgICAvLyBkb24n
dCBjbG9iYmVyIHRoZSB2YWx1ZSBieSByZWdpc3RlciBhbGxvY2F0aW9uIG9yIGNhbGxzIChlaXRo
ZXIgYnkgc2F2aW5nIHRoZSBhcmd1bWVudCB0byB0aGUKKyAgICAvLyBzdGFjayBvciBwcmVzZXJ2
aW5nIGl0IGluIGEgY2FsbGVlLXNhdmUgcmVnaXN0ZXIpLiBVc2UgdGhlIEFyZ3VtZW50UmVnVmFs
dWUgY2xhc3MuIFRoZSByZXR1cm4KKyAgICAvLyB0eXBlIGlzIGVpdGhlciBwb2ludGVyKCkgKGZv
ciBHUFJzKSBvciBEb3VibGUgKGZvciBGUFJzKS4KKyAgICBBcmd1bWVudFJlZywKKworICAgIC8v
IFRoZSBmcmFtZSBwb2ludGVyLiBZb3UgY2FuIHB1dCB0aGlzIGFueXdoZXJlIGluIGNvbnRyb2wg
ZmxvdyBidXQgaXQgd2lsbCBhbHdheXMgeWllbGQgdGhlCisgICAgLy8gZnJhbWUgcG9pbnRlciwg
d2l0aCBhIGNhdmVhdDogaWYgb3VyIGNvbXBpbGVyIGNoYW5nZXMgdGhlIGZyYW1lIHBvaW50ZXIg
dGVtcG9yYXJpbHkgZm9yIHNvbWUKKyAgICAvLyBzaWxseSByZWFzb24sIHRoZSBGcmFtZVBvaW50
ZXIgaW50cmluc2ljIHdpbGwgcmV0dXJuIHdoZXJlIHRoZSBmcmFtZSBwb2ludGVyICpzaG91bGQq
IGJlIG5vdAorICAgIC8vIHdoZXJlIGl0IGhhcHBlbnMgdG8gYmUgcmlnaHQgbm93LgorICAgIEZy
YW1lUG9pbnRlciwKKworICAgIC8vIFBvbHltb3JwaGljIG1hdGgsIHVzYWJsZSB3aXRoIGFueSB2
YWx1ZSB0eXBlLgorICAgIEFkZCwKKyAgICBTdWIsCisgICAgTXVsLAorICAgIERpdiwKKworICAg
IC8vIEludGVnZXIgbWF0aC4KKyAgICBDaGlsbERpdiwgLy8gZG9lc24ndCB0cmFwIGV2ZXIsIGJl
aGF2ZXMgbGlrZSBKUyAoeC95KXwwLgorICAgIE1vZCwKKyAgICBCaXRBbmQsCisgICAgQml0T3Is
CisgICAgQml0WG9yLAorICAgIFNobCwKKyAgICBTU2hyLAorICAgIFpTaHIsCisKKyAgICAvLyBD
YXN0cyBhbmQgc3VjaC4KKyAgICAvLyBUYWtlcyBhbmQgcmV0dXJucyBJbnQzMjoKKyAgICBTRXh0
OCwKKyAgICBTRXh0MTYsCisgICAgLy8gVGFrZXMgSW50MzIgYW5kIHJldHVybnMgSW50NjQ6Cisg
ICAgU0V4dDMyLAorICAgIFpFeHQzMiwKKyAgICAvLyBUYWtlcyBhbmQgcmV0dXJucyBEb3VibGU6
CisgICAgRlJvdW5kLAorICAgIC8vIFRha2VzIGludHMgYW5kIHJldHVybnMgRG91YmxlOgorICAg
IElUb0QsCisgICAgLy8gVGFrZXMgRG91YmxlIGFuZCByZXR1cm5zIEludDMyOgorICAgIERUb0kz
MiwKKworICAgIC8vIFBvbHltb3JwaGljIGNvbXBhcmlzb25zLCB1c2FibGUgd2l0aCBhbnkgdmFs
dWUgdHlwZS4gUmV0dXJucyBpbnQzMiAwIG9yIDEuIE5vdGUgdGhhdCAiTm90IgorICAgIC8vIGlz
IGp1c3QgRXF1YWwoeCwgMCkuCisgICAgRXF1YWwsCisgICAgTm90RXF1YWwsCisgICAgTGVzc1Ro
YW4sCisgICAgR3JlYXRlclRoYW4sCisgICAgTGVzc0VxdWFsLAorICAgIEdyZWF0ZXJFcXVhbCwK
KworICAgIC8vIEludGVnZXIgY29tcGFyaXNvbnMuIFJldHVybnMgaW50MzIgMCBvciAxLgorICAg
IEFib3ZlLAorICAgIEJlbG93LAorICAgIEFib3ZlRXF1YWwKKyAgICBCZWxvd0VxdWFsLAorCisg
ICAgLy8gTWVtb3J5IGxvYWRzLiBPcGNvZGUgaW5kaWNhdGVzIGhvdyB3ZSBsb2FkIGFuZCB0aGUg
bG9hZGVkIHR5cGUuIFRoZXNlIHVzZSBNZW1vcnlWYWx1ZS4KKyAgICAvLyBUaGVzZSByZXR1cm4g
SW50MzI6CisgICAgTG9hZDhaLAorICAgIExvYWQ4UywKKyAgICBMb2FkMTZaLAorICAgIExvYWQx
NlMsCisgICAgLy8gVGhpcyByZXR1cm5zIERvdWJsZToKKyAgICBMb2FkRmxvYXQsCisgICAgLy8g
VGhpcyByZXR1cm4gd2hhdGV2ZXIgdGhlIHJldHVybiB0eXBlIGlzOgorICAgIExvYWQsCisKKyAg
ICAvLyBNZW1vcnkgc3RvcmVzLiBPcGNvZGUgaW5kaWNhdGVzIGhvdyB0aGUgdmFsdWUgaXMgc3Rv
cmVkLiBUaGVzZSB1c2UgTWVtb3J5VmFsdWUuCisgICAgLy8gVGhlc2UgdGFrZSBhbiBJbnQzMiB2
YWx1ZToKKyAgICBTdG9yZTgsCisgICAgU3RvcmUxNiwKKyAgICAvLyBUaGlzIHRha2VzIGEgRG91
YmxlIHZhbHVlOgorICAgIFN0b3JlRmxvYXQsCisgICAgLy8gVGhpcyBpcyBhIHBvbHltb3JwaGlj
IHN0b3JlIGZvciBJbnQzMiwgSW50NjQsIGFuZCBEb3VibGU6CisgICAgU3RvcmUsCisKKyAgICAv
LyBUaGlzIGlzIGEgcmVndWxhciBvcmRpbmFyeSBDIGZ1bmN0aW9uIGNhbGwsIHVzaW5nIHRoZSBz
eXN0ZW0gQyBjYWxsaW5nIGNvbnZlbnRpb24uIE1ha2Ugc3VyZQorICAgIC8vIHRoYXQgdGhlIGFy
Z3VtZW50cyBhcmUgcGFzc2VkIHVzaW5nIHRoZSByaWdodCB0eXBlcy4KKyAgICBDQ2FsbCwKKwor
ICAgIC8vIFRoaXMgaXMgYSBwYXRjaHBvaW50LiBVc2UgdGhlIFBhdGNocG9pbnRWYWx1ZSBjbGFz
cy4gVGhpcyBpcyB2aWV3ZWQgYXMgYmVoYXZpbmcgbGlrZSBhIGNhbGwsCisgICAgLy8gYnV0IG9u
bHkgZW1pdHMgY29kZSB2aWEgYSBjb2RlIGdlbmVyYXRpb24gY2FsbGJhY2suIFRoYXQgY2FsbGJh
Y2sgZ2V0cyB0byBlbWl0IGNvZGUgaW5saW5lLgorICAgIC8vIFlvdSBjYW4gcGFzcyBhIHN0YWNr
bWFwIGFsb25nIHdpdGggY29uc3RyYWludHMgb24gaG93IGVhY2ggc3RhY2ttYXAgYXJndW1lbnQg
bXVzdCBiZSBwYXNzZWQuCisgICAgLy8gSXQncyBsZWdhbCB0byByZXF1ZXN0IHRoYXQgYSBzdGFj
a21hcCBhcmd1bWVudCBpcyBpbiBzb21lIHJlZ2lzdGVyIGFuZCBpdCdzIGxlZ2FsIHRvIHJlcXVl
c3QKKyAgICAvLyB0aGF0IGEgc3RhY2ttYXAgYXJndW1lbnQgaXMgYXQgc29tZSBvZmZzZXQgZnJv
bSB0aGUgdG9wIG9mIHRoZSBhcmd1bWVudCBwYXNzaW5nIGFyZWEgb24gdGhlCisgICAgLy8gc3Rh
Y2suCisgICAgUGF0Y2hwb2ludCwKKworICAgIC8vIENoZWNrZWQgbWF0aC4gVXNlIHRoZSBDaGVj
a1ZhbHVlIGNsYXNzLiBMaWtlIGEgUGF0Y2hwb2ludCwgdGhpcyB0YWtlcyBhIGNvZGUgZ2VuZXJh
dGlvbgorICAgIC8vIGNhbGxiYWNrLiBUaGF0IGNhbGxiYWNrIGdldHMgdG8gZW1pdCBzb21lIGNv
ZGUgYWZ0ZXIgdGhlIGVwaWxvZ3VlLCBhbmQgZ2V0cyB0byBsaW5rIHRoZSBqdW1wCisgICAgLy8g
ZnJvbSB0aGUgY2hlY2ssIGFuZCB0aGUgY2hvaWNlIG9mIHJlZ2lzdGVycy4gWW91IGFsc28gZ2V0
IHRvIHN1cHBseSBhIHN0YWNrbWFwLiBOb3RlIHRoYXQgeW91CisgICAgLy8gYXJlIG5vdCBhbGxv
d2VkIHRvIGp1bXAgYmFjayBpbnRvIHRoZSBtYWlubGluZSBjb2RlIGZyb20geW91ciBzbG93IHBh
dGgsIHNpbmNlIHRoZSBjb21waWxlcgorICAgIC8vIHdpbGwgYXNzdW1lIHRoYXQgdGhlIGV4ZWN1
dGlvbiBvZiB0aGVzZSBpbnN0cnVjdGlvbnMgcHJvdmVzIHRoYXQgb3ZlcmZsb3cgZGlkbid0IGhh
cHBlbi4gRm9yCisgICAgLy8gZXhhbXBsZSwgaWYgeW91IGhhdmUgdHdvIENoZWNrQWRkJ3M6Cisg
ICAgLy8KKyAgICAvLyBhID0gQ2hlY2tBZGQoeCwgeSkKKyAgICAvLyBiID0gQ2hlY2tBZGQoeCwg
eSkKKyAgICAvLworICAgIC8vIFRoZW4gaXQncyB2YWxpZCB0byBjaGFuZ2UgdGhpcyB0bzoKKyAg
ICAvLworICAgIC8vIGEgPSBDaGVja0FkZCh4LCB5KQorICAgIC8vIGIgPSBJZGVudGl0eShhKQor
ICAgIC8vCisgICAgLy8gVGhpcyBpcyB2YWxpZCByZWdhcmRsZXNzIG9mIHRoZSBjYWxsYmFja3Mg
dXNlZCBieSB0aGUgdHdvIENoZWNrQWRkcy4gVGhleSBtYXkgaGF2ZSBkaWZmZXJlbnQKKyAgICAv
LyBjYWxsYmFja3MuIFlldCwgdGhpcyB0cmFuc2Zvcm1hdGlvbiBpcyB2YWxpZCBldmVuIGlmIHRo
ZXkgYXJlIGRpZmZlcmVudCBiZWNhdXNlIHdlIGtub3cgdGhhdAorICAgIC8vIGFmdGVyIHRoZSBm
aXJzdCBDaGVja0FkZCBleGVjdXRlcywgdGhlIHNlY29uZCBDaGVja0FkZCBjb3VsZCBub3QgaGF2
ZSBwb3NzaWJseSB0YWtlbiBzbG93CisgICAgLy8gcGF0aC4gVGhlcmVmb3JlLCB0aGUgc2Vjb25k
IENoZWNrQWRkJ3MgY2FsbGJhY2sgaXMgaXJyZWxldmFudC4KKyAgICBDaGVja0FkZCwKKyAgICBD
aGVja1N1YiwKKyAgICBDaGVja011bCwKKworICAgIC8vIENoZWNrIHRoYXQgc2lkZS1leGl0cy4g
VXNlIHRoZSBDaGVja1ZhbHVlIGNsYXNzLiBMaWtlIENoZWNrQWRkIGFuZCBmcmllbmRzLCB0aGlz
IGhhcyBhCisgICAgLy8gc3RhY2ttYXAgd2l0aCBhIGdlbmVyYXRpb24gY2FsbGJhY2suIFRoaXMg
dGFrZXMgYW4gSW50MzIgYXJndW1lbnQgdGhhdCB0aGlzIGJyYW5jaGVzIG9uLCB3aXRoCisgICAg
Ly8gZnVsbCBicmFuY2ggZnVzaW9uIGluIHRoZSBpbnN0cnVjdGlvbiBzZWxlY3Rvci4gQSB0cnVl
IHZhbHVlIGp1bXBzIHRvIHRoZSBnZW5lcmF0b3IncyBzbG93CisgICAgLy8gcGF0aC4KKyAgICBD
aGVjaywKKworICAgIC8vIFNTQSBzdXBwb3J0LCBpbiB0aGUgc3R5bGUgb2YgREZHIFNTQS4KKyAg
ICBVcHNpbG9uLCAvLyBUaGlzIHVzZXMgdGhlIFVwc2lsb25WYWx1ZSBjbGFzcy4KKyAgICBQaGks
CisKKyAgICAvLyBKdW1wLiBVc2VzIHRoZSBDb250cm9sVmFsdWUgY2xhc3MuCisgICAgSnVtcCwK
KyAgICAKKyAgICAvLyBQb2x5bW9ycGhpYyBicmFuY2gsIHVzYWJsZSB3aXRoIGFueSB2YWx1ZSB0
eXBlLiBCcmFuY2hlcyBpZiBub3QgZXF1YWwgdG8gemVyby4gVXNlcyB0aGUKKyAgICAvLyBDb250
cm9sVmFsdWUgY2xhc3MsIHdpdGggdGhlIDAtaW5kZXggc3VjY2Vzc29yIGJlaW5nIHRoZSB0cnVl
IHN1Y2Nlc3Nvci4KKyAgICBCcmFuY2gsCisKKyAgICAvLyBTd2l0Y2guIFN3aXRjaGVzIG92ZXIg
ZWl0aGVyIEludDMyIG9yIEludDY0LiBVc2VzIHRoZSBTd2l0Y2hWYWx1ZSBjbGFzcy4KKyAgICBT
d2l0Y2gsCisKKyAgICAvLyBSZXR1cm4uIE5vdGUgdGhhdCBCMyBwcm9jZWR1cmVzIGRvbid0IGtu
b3cgdGhlaXIgcmV0dXJuIHR5cGUsIHNvIHRoaXMgY2FuIGp1c3QgcmV0dXJuIGFueQorICAgIC8v
IHR5cGUuIFVzZXMgdGhlIENvbnRyb2xWYWx1ZSBjbGFzcy4KKyAgICBSZXR1cm4sCisKKyAgICAv
LyBUaGlzIGlzIGEgdGVybWluYWwgdGhhdCBpbmRpY2F0ZXMgdGhhdCB3ZSB3aWxsIG5ldmVyIGdl
dCBoZXJlLiBVc2VzIHRoZSBDb250cm9sVmFsdWUgY2xhc3MuCisgICAgT29wcworfTsKKworaW5s
aW5lIGJvb2wgaXNDaGVja01hdGgoT3Bjb2RlIG9wY29kZSkKK3sKKyAgICBzd2l0Y2ggKG9wY29k
ZSkgeworICAgIGNhc2UgQ2hlY2tBZGQ6CisgICAgY2FzZSBDaGVja1N1YjoKKyAgICBjYXNlIENo
ZWNrTXVsOgorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICBkZWZhdWx0OgorICAgICAgICByZXR1
cm4gZmFsc2U7CisgICAgfQorfQorCit9IH0gLy8gbmFtZXNwYWNlIEpTQzo6QjMKKworbmFtZXNw
YWNlIFdURiB7CisKK2NsYXNzIFByaW50U3RyZWFtOworCit2b2lkIHByaW50SW50ZXJuYWwoUHJp
bnRTdHJlYW0mLCBKU0M6OkIzOjpPcGNvZGUpOworCit9IC8vIG5hbWVzcGFjZSBXVEYKKworI2Vu
ZGlmIC8vIEIzT3Bjb2RlX2gKKwpJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzT3Jp
Z2luLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNPcmlnaW4u
Y3BwCShyZXZpc2lvbiAwKQorKysgU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzT3JpZ2luLmNw
cAkod29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDM3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAy
MDE1IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlv
biBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAq
IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcg
Y29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2Ug
Y29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMg
bGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBS
ZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNv
cHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZv
bGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3Ro
ZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElT
IFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAq
IEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRF
RCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBG
SVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBO
TyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZP
UiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFS
WSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBU
TywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1Mg
T0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBI
T1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVS
IElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5F
R0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UK
KyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkg
T0YgU1VDSCBEQU1BR0UuIAorICovCisKKyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJC
M09yaWdpbi5oIgorCituYW1lc3BhY2UgSlNDIHsgbmFtZXNwYWNlIEIzIHsKKwordm9pZCBPcmln
aW46OmR1bXAoUHJpbnRTdHJlYW0mIG91dCkgY29uc3QKK3sKKyAgICBvdXQucHJpbnQoIk9yaWdp
bigiLCBSYXdQb2ludGVyKG1fZGF0YSksICIpIik7Cit9CisKK30gfSAvLyBuYW1lc3BhY2UgSlND
OjpCMworCkluZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNPcmlnaW4uaAo9PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNPcmlnaW4uaAkocmV2aXNpb24gMCkK
KysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM09yaWdpbi5oCSh3b3JraW5nIGNvcHkpCkBA
IC0wLDAgKzEsNTUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTUgQXBwbGUgSW5jLiBBbGwg
cmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNl
IGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUg
cGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUg
bWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRo
ZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMg
YW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBi
aW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3Rp
Y2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIg
aW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlk
ZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklE
RUQgQlkgQVBQTEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVE
IFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJ
RUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElD
VUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExF
IElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElS
RUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFM
IERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQg
T0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisg
KiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBP
TiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklD
VCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJ
U0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FS
RSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisg
Ki8KKworI2lmbmRlZiBCM09yaWdpbl9oCisjZGVmaW5lIEIzT3JpZ2luX2gKKworI2luY2x1ZGUg
PHd0Zi9QcmludFN0cmVhbS5oPgorCituYW1lc3BhY2UgSlNDIHsgbmFtZXNwYWNlIEIzIHsKKwor
Ly8gV2hvZXZlciBnZW5lcmF0ZXMgQjNJUiBjYW4gY2hvb3NlIHRvIHB1dCBvcmlnaW5zIG9uIHZh
bHVlcy4gV2hlbiB5b3UgZG8gdGhpcywgQjMgd2lsbCBiZSBhYmxlIHRvCisvLyBhY2NvdW50LCBk
b3duIHRvIHRoZSBtYWNoaW5lIGNvZGUsIHdoaWNoIGluc3RydWN0aW9uIGNvcnJlc3BvbmRzIHRv
IHdoaWNoIG9yaWdpbi4gQjMKKy8vIHRyYW5zZm9ybWF0aW9ucyBtdXN0IHByZXNlcnZlIE9yaWdp
bnMgY2FyZWZ1bGx5LiBJdCdzIGFuIGVycm9yIHRvIHdyaXRlIGEgdHJhbnNmb3JtYXRpb24gdGhh
dAorLy8gZWl0aGVyIGRyb3BzIE9yaWdpbnMgb3IgbGllcyBhYm91dCB0aGVtLgorY2xhc3MgT3Jp
Z2luIHsKK3B1YmxpYzoKKyAgICBleHBsaWNpdCBPcmlnaW4oY29uc3Qgdm9pZCogZGF0YSA9IG51
bGxwdHIpCisgICAgICAgIDogbV9kYXRhKGRhdGEpCisgICAgeworICAgIH0KKworICAgIGNvbnN0
IHZvaWQqIGRhdGEoKSBjb25zdCB7IHJldHVybiBtX2RhdGE7IH0KKworICAgIHZvaWQgZHVtcChQ
cmludFN0cmVhbSYpIGNvbnN0OworICAgIAorcHJpdmF0ZToKKyAgICBjb25zdCB2b2lkKiBtX2Rh
dGE7Cit9OworCit9IH0gLy8gbmFtZXNwYWNlIEpTQzo6QjMKKworI2VuZGlmIC8vIEIzT3JpZ2lu
X2gKKwpJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzUGF0Y2hwb2ludFZhbHVlLmNw
cAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNQYXRjaHBvaW50VmFs
dWUuY3BwCShyZXZpc2lvbiAwKQorKysgU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzUGF0Y2hw
b2ludFZhbHVlLmNwcAkod29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDQzIEBACisvKgorICogQ29w
eXJpZ2h0IChDKSAyMDE1IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBS
ZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9y
IHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRo
ZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9u
cyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBu
b3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWlt
ZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2Ug
dGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9u
cyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlv
biBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4K
KyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycn
IEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJV
VCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRB
QklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NM
QUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMg
QkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwK
KyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBO
T1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VS
VklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5U
RVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklM
SVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAo
SU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VU
IE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUg
UE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisKKyNpbmNsdWRlICJjb25maWcuaCIK
KyNpbmNsdWRlICJCM1BhdGNocG9pbnRWYWx1ZS5oIgorCisjaW5jbHVkZSA8d3RmL0NvbW1hUHJp
bnRlci5oPgorCituYW1lc3BhY2UgSlNDIHsgbmFtZXNwYWNlIEIzIHsKKworUGF0Y2hwb2ludFZh
bHVlOjp+UGF0Y2hwb2ludFZhbHVlKCkKK3sKK30KKwordm9pZCBQYXRjaHBvaW50VmFsdWU6OmR1
bXBNZXRhKFByaW50U3RyZWFtJiBvdXQpIGNvbnN0Cit7CisgICAgb3V0LnByaW50KCJzdGFja21h
cCA9ICIsIHN0YWNrbWFwKTsKK30KKworfSB9IC8vIG5hbWVzcGFjZSBKU0M6OkIzCisKSW5kZXg6
IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM1BhdGNocG9pbnRWYWx1ZS5oCj09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0K
LS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM1BhdGNocG9pbnRWYWx1ZS5oCShyZXZpc2lv
biAwKQorKysgU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzUGF0Y2hwb2ludFZhbHVlLmgJKHdv
cmtpbmcgY29weSkKQEAgLTAsMCArMSw1NyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNSBB
cHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5k
IHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2Rp
ZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRp
dGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUg
bXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qg
b2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0
cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmln
aHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dp
bmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1h
dGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZU
V0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBS
RVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8s
IFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVT
UyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZF
TlQgU0hBTEwgQVBQTEUgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5Z
IERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9S
IENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisg
KiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVT
RSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZF
UiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBD
T05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdF
TkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBP
RiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNV
Q0ggREFNQUdFLiAKKyAqLworCisjaWZuZGVmIEIzUGF0Y2hwb2ludFZhbHVlX2gKKyNkZWZpbmUg
QjNQYXRjaHBvaW50VmFsdWVfaAorCisjaW5jbHVkZSAiQjNWYWx1ZS5oIgorI2luY2x1ZGUgIkIz
U3RhY2ttYXAuaCIKKworbmFtZXNwYWNlIEpTQyB7IG5hbWVzcGFjZSBCMyB7CisKK2NsYXNzIFBh
dGNocG9pbnRWYWx1ZSA6IHB1YmxpYyBWYWx1ZSB7CitwdWJsaWM6CisgICAgc3RhdGljIGJvb2wg
YWNjZXB0cyhPcGNvZGUgb3Bjb2RlKSB7IHJldHVybiBvcGNvZGUgPT0gUGF0Y2hwb2ludDsgfQor
CisgICAgflBhdGNocG9pbnRWYWx1ZSgpOworCisgICAgU3RhY2ttYXAgc3RhY2ttYXA7CisKK3By
b3RlY3RlZDoKKyAgICB2b2lkIGR1bXBNZXRhKFByaW50U3RyZWFtJikgY29uc3Qgb3ZlcnJpZGU7
CisKK3ByaXZhdGU6CisgICAgZnJpZW5kIGNsYXNzIFByb2NlZHVyZTsKKworICAgIFBhdGNocG9p
bnRWYWx1ZSh1bnNpZ25lZCBpbmRleCwgVHlwZSB0eXBlLCBPcmlnaW4gb3JpZ2luLCBjb25zdCBB
ZGphY2VuY3lMaXN0JiBjaGlsZHJlbikKKyAgICAgICAgOiBWYWx1ZShpbmRleCwgUGF0Y2hwb2lu
dCwgdHlwZSwgb3JpZ2luLCBjaGlsZHJlbikKKyAgICB7CisgICAgfQorfTsKKworfSB9IC8vIG5h
bWVzcGFjZSBKU0M6OkIzCisKKyNlbmRpZiAvLyBCM1BhdGNocG9pbnRWYWx1ZV9oCisKSW5kZXg6
IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM1Byb2NlZHVyZS5jcHAKPT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0g
U291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzUHJvY2VkdXJlLmNwcAkocmV2aXNpb24gMCkKKysr
IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM1Byb2NlZHVyZS5jcHAJKHdvcmtpbmcgY29weSkK
QEAgLTAsMCArMSw1NiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNSBBcHBsZSBJbmMuIEFs
bCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3Vy
Y2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFy
ZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFy
ZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4g
dGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9u
cyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGlu
IGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5v
dGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1l
ciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92
aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9W
SURFRCBCWSBBUFBMRSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJ
RUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1Q
TElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJU
SUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQ
TEUgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5E
SVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJ
QUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVO
VCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IK
KyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5E
IE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RS
SUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVS
V0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRX
QVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLiAK
KyAqLworCisjaW5jbHVkZSAiY29uZmlnLmgiCisjaW5jbHVkZSAiQjNQcm9jZWR1cmUuaCIKKwor
I2luY2x1ZGUgIkIzQmFzaWNCbG9jay5oIgorI2luY2x1ZGUgIkIzVmFsdWUuaCIKKworbmFtZXNw
YWNlIEpTQyB7IG5hbWVzcGFjZSBCMyB7CisKK1Byb2NlZHVyZTo6UHJvY2VkdXJlKCkKK3sKK30K
KworUHJvY2VkdXJlOjp+UHJvY2VkdXJlKCkKK3sKK30KKworQmFzaWNCbG9jayogUHJvY2VkdXJl
OjphZGRCbG9jaygpCit7CisgICAgc3RkOjp1bmlxdWVfcHRyPEJhc2ljQmxvY2s+IGJsb2NrID0g
c3RkOjptYWtlX3VuaXF1ZTxCYXNpY0Jsb2NrPihtX2Jsb2Nrcy5zaXplKCkpOworICAgIEJhc2lj
QmxvY2sqIHJlc3VsdCA9IGJsb2NrLmdldCgpOworICAgIG1fYmxvY2tzLmFwcGVuZChXVEY6Om1v
dmUoYmxvY2spKTsKKyAgICByZXR1cm4gcmVzdWx0OworfQorCit2b2lkIFByb2NlZHVyZTo6ZHVt
cChQcmludFN0cmVhbSYgb3V0KSBjb25zdAoreworICAgIGZvciAoQmFzaWNCbG9jayogYmxvY2sg
OiAqdGhpcykKKyAgICAgICAgb3V0LnByaW50KGRlZXBEdW1wKGJsb2NrKSk7Cit9CisKK30gfSAv
LyBuYW1lc3BhY2UgSlNDOjpCMwpJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzUHJv
Y2VkdXJlLmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzUHJvY2Vk
dXJlLmgJKHJldmlzaW9uIDApCisrKyBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNQcm9jZWR1
cmUuaAkod29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDE3NyBAQAorLyoKKyAqIENvcHlyaWdodCAo
QykgMjAxNSBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmli
dXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0
CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93
aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291
cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0
aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICog
Mi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92
ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRo
ZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29y
IG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICog
VEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5Z
CisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJ
TUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBB
TkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAg
SU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJM
RSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVN
UExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlU
RUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBM
T1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElP
TikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hF
VEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElO
RyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUg
VVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklM
SVRZIE9GIFNVQ0ggREFNQUdFLiAKKyAqLworCisjaWZuZGVmIEIzUHJvY2VkdXJlX2gKKyNkZWZp
bmUgQjNQcm9jZWR1cmVfaAorCisjaW5jbHVkZSA8d3RmL0JhZy5oPgorI2luY2x1ZGUgPHd0Zi9G
YXN0TWFsbG9jLmg+CisjaW5jbHVkZSA8d3RmL05vbmNvcHlhYmxlLmg+CisjaW5jbHVkZSA8d3Rm
L1ZlY3Rvci5oPgorCituYW1lc3BhY2UgSlNDIHsgbmFtZXNwYWNlIEIzIHsKKworY2xhc3MgQmFz
aWNCbG9jazsKK2NsYXNzIFZhbHVlOworCitjbGFzcyBQcm9jZWR1cmUgeworICAgIFdURl9NQUtF
X05PTkNPUFlBQkxFKFByb2NlZHVyZSk7CisgICAgV1RGX01BS0VfRkFTVF9BTExPQ0FURUQ7Citw
dWJsaWM6CisKKyAgICBQcm9jZWR1cmUoKTsKKyAgICB+UHJvY2VkdXJlKCk7CisKKyAgICBCYXNp
Y0Jsb2NrKiBhZGRCbG9jaygpOworICAgIAorICAgIHRlbXBsYXRlPHR5cGVuYW1lIFZhbHVlVHlw
ZSwgdHlwZW5hbWUuLi4gQXJndW1lbnRzPgorICAgIFZhbHVlVHlwZSogYWRkKEFyZ3VtZW50cy4u
Lik7CisKKyAgICB2b2lkIGR1bXAoUHJpbnRTdHJlYW0mKSBjb25zdDsKKworICAgIHVuc2lnbmVk
IHNpemUoKSBjb25zdCB7IHJldHVybiBtX2Jsb2Nrcy5zaXplKCk7IH0KKyAgICBCYXNpY0Jsb2Nr
KiBhdCh1bnNpZ25lZCBpbmRleCkgY29uc3QgeyByZXR1cm4gbV9ibG9ja3NbaW5kZXhdOyB9Cisg
ICAgQmFzaWNCbG9jayogb3BlcmF0b3JbXSh1bnNpZ25lZCBpbmRleCkgY29uc3QgeyByZXR1cm4g
YXQoaW5kZXgpOyB9CisKKyAgICBjbGFzcyBpdGVyYXRvciB7CisgICAgcHVibGljOgorICAgICAg
ICBpdGVyYXRvcigpOgorICAgICAgICAgICAgOiBtX3Byb2NlZHVyZShudWxscHRyKQorICAgICAg
ICAgICAgLCBtX2luZGV4KDApCisgICAgICAgIHsKKyAgICAgICAgfQorCisgICAgICAgIGl0ZXJh
dG9yKFByb2NlZHVyZSYgcHJvY2VkdXJlLCB1bnNpZ25lZCBpbmRleCkKKyAgICAgICAgICAgIDog
bV9wcm9jZWR1cmUoJnByb2NlZHVyZSkKKyAgICAgICAgICAgICwgbV9pbmRleChpbmRleCkKKyAg
ICAgICAgeworICAgICAgICB9CisKKyAgICAgICAgQmFzaWNCbG9jayogb3BlcmF0b3IqKCkKKyAg
ICAgICAgeworICAgICAgICAgICAgcmV0dXJuIG1fcHJvY2VkdXJlLT5hdChtX2luZGV4KTsKKyAg
ICAgICAgfQorCisgICAgICAgIGl0ZXJhdG9yJiBvcGVyYXRvcisrKCkKKyAgICAgICAgeworICAg
ICAgICAgICAgbV9pbmRleCA9IGZpbmROZXh0KG1faW5kZXggKyAxKTsKKyAgICAgICAgICAgIHJl
dHVybiAqdGhpczsKKyAgICAgICAgfQorCisgICAgICAgIGJvb2wgb3BlcmF0b3I9PShjb25zdCBp
dGVyYXRvciYgb3RoZXIpIGNvbnN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBtX2lu
ZGV4ID09IG90aGVyLm1faW5kZXg7CisgICAgICAgIH0KKworICAgICAgICBib29sIG9wZXJhdG9y
IT0oY29uc3QgaXRlcmF0b3ImIG90aGVyKSBjb25zdAorICAgICAgICB7CisgICAgICAgICAgICBy
ZXR1cm4gISgqdGhpcyA9PSBvdGhlcik7CisgICAgICAgIH0KKworICAgIHByaXZhdGU6CisgICAg
ICAgIHVuc2lnbmVkIGZpbmROZXh0KHVuc2lnbmVkIGluZGV4KQorICAgICAgICB7CisgICAgICAg
ICAgICB3aGlsZSAoaW5kZXggPCBtX3Byb2NlZHVyZS0+c2l6ZSgpICYmICFtX3Byb2NlZHVyZS0+
YXQoaW5kZXgpKQorICAgICAgICAgICAgICAgIGluZGV4Kys7CisgICAgICAgICAgICByZXR1cm4g
aW5leDsKKyAgICAgICAgfQorCisgICAgICAgIFByb2NlZHVyZSogbV9wcm9jZWR1cmU7CisgICAg
ICAgIHVuc2lnbmVkIG1faW5kZXg7CisgICAgfTsKKworICAgIGl0ZXJhdG9yIGJlZ2luKCkgY29u
c3QgeyByZXR1cm4gaXRlcmF0b3IoKnRoaXMsIDApOyB9CisgICAgaXRlcmF0b3IgZW5kKCkgY29u
c3QgeyByZXR1cm4gaXRlcmF0b3IoKnRoaXMsIG51bUJsb2NrcygpKTsgfQorCisgICAgY2xhc3Mg
VmFsdWVzQ29sbGVjdGlvbiB7CisgICAgcHVibGljOgorICAgICAgICBWYWx1ZXNDb2xsZWN0aW9u
KFByb2NlZHVyZSYgcHJvY2VkdXJlKQorICAgICAgICAgICAgOiBtX3Byb2NlZHVyZShwcm9jZWR1
cmUpCisgICAgICAgIHsKKyAgICAgICAgfQorCisgICAgICAgIGNsYXNzIGl0ZXJhdG9yIHsKKyAg
ICAgICAgcHVibGljOgorICAgICAgICAgICAgaXRlcmF0b3IoKToKKyAgICAgICAgICAgICAgICA6
IG1fcHJvY2VkdXJlKG51bGxwdHIpCisgICAgICAgICAgICAgICAgLCBtX2luZGV4KDApCisgICAg
ICAgICAgICB7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGl0ZXJhdG9yKFByb2NlZHVy
ZSYgcHJvY2VkdXJlLCB1bnNpZ25lZCBpbmRleCkKKyAgICAgICAgICAgICAgICA6IG1fcHJvY2Vk
dXJlKCZwcm9jZWR1cmUpCisgICAgICAgICAgICAgICAgLCBtX2luZGV4KGluZGV4KQorICAgICAg
ICAgICAgeworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBWYWx1ZSogb3BlcmF0b3IqKCkK
KyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbV9wcm9jZWR1cmUtPmJsb2Nr
KG1faW5kZXgpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpdGVyYXRvciYgb3BlcmF0
b3IrKygpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbV9pbmRleCsrOworICAgICAg
ICAgICAgICAgIHJldHVybiAqdGhpczsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgYm9v
bCBvcGVyYXRvcj09KGNvbnN0IGl0ZXJhdG9yJiBvdGhlcikgY29uc3QKKyAgICAgICAgICAgIHsK
KyAgICAgICAgICAgICAgICByZXR1cm4gbV9pbmRleCA9PSBvdGhlci5tX2luZGV4OworICAgICAg
ICAgICAgfQorCisgICAgICAgICAgICBib29sIG9wZXJhdG9yIT0oY29uc3QgaXRlcmF0b3ImIG90
aGVyKSBjb25zdAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiAhKCp0aGlz
ID09IG90aGVyKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICBwcml2YXRlOgorCisgICAgICAg
ICAgICBQcm9jZWR1cmUqIG1fcHJvY2VkdXJlOworICAgICAgICAgICAgdW5zaWduZWQgbV9pbmRl
eDsKKyAgICAgICAgfTsKKworICAgICAgICBpdGVyYXRvciBiZWdpbigpIGNvbnN0IHsgcmV0dXJu
IGl0ZXJhdG9yKG1fcHJvY2VkdXJlLCAwKTsgfQorICAgICAgICBpdGVyYXRvciBlbmQoKSBjb25z
dCB7IHJldHVybiBpdGVyYXRvcihtX3Byb2NlZHVyZSwgbV9wcm9jZWR1cmUubV92YWx1ZXMuc2l6
ZSgpKTsgfQorCisgICAgICAgIHVuc2lnbmVkIHNpemUoKSBjb25zdCB7IHJldHVybiBtX3Byb2Nl
ZHVyZS5tX3ZhbHVlcy5zaXplKCk7IH0KKyAgICAgICAgVmFsdWUqIGF0KHVuc2lnbmVkIGluZGV4
KSBjb25zdCB7IHJldHVybiBtX3Byb2NlZHVyZS5tX3ZhbHVlc1tpbmRleF07IH0KKyAgICAgICAg
VmFsdWUqIG9wZXJhdG9yW10odW5zaWduZWQgaW5kZXgpIGNvbnN0IHsgcmV0dXJuIGF0KGluZGV4
KTsgfQorICAgICAgICAKKyAgICBwcml2YXRlOgorICAgICAgICBQcm9jZWR1cmUmIG1fcHJvY2Vk
dXJlOworICAgIH07CisKKyAgICBWYWx1ZXNDb2xsZWN0aW9uIHZhbHVlcygpIHsgcmV0dXJuIFZh
bHVlc0NvbGxlY3Rpb24oKnRoaXMpOyB9CisKK3ByaXZhdGU6CisgICAgVmVjdG9yPHN0ZDo6dW5p
cXVlX3B0cjxCYXNpY0Jsb2NrPj4gbV9ibG9ja3M7CisgICAgVmVjdG9yPHN0ZDo6dW5pcXVlX3B0
cjxWYWx1ZT4+IG1fdmFsdWVzOworfTsKKworfSB9IC8vIG5hbWVzcGFjZSBKU0M6OkIzCisKKyNl
bmRpZiAvLyBCM1Byb2NlZHVyZV9oCisKSW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9C
M1Byb2NlZHVyZUlubGluZXMuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUv
YjMvQjNQcm9jZWR1cmVJbmxpbmVzLmgJKHJldmlzaW9uIDApCisrKyBTb3VyY2UvSmF2YVNjcmlw
dENvcmUvYjMvQjNQcm9jZWR1cmVJbmxpbmVzLmgJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSw0
NiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNSBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVz
ZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFy
eSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQg
cHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAx
LiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNv
cHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZv
bGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3Jt
IG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBs
aXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAq
ICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRo
ZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBM
RSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElF
UywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5U
SUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQ
VVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUgor
ICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lE
RU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAo
SU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElU
VVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7
IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVP
UlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElU
WSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lO
RyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElG
IEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLiAKKyAqLworCisjaWZu
ZGVmIEIzUHJvY2VkdXJlSW5saW5lc19oCisjZGVmaW5lIEIzUHJvY2VkdXJlSW5saW5lc19oCisK
KyNpbmNsdWRlICJCM0Jhc2ljQmxvY2suaCIKKyNpbmNsdWRlICJCM1Byb2NlZHVyZS5oIgorCitu
YW1lc3BhY2UgSlNDIHsgbmFtZXNwYWNlIEIzIHsKKwordGVtcGxhdGU8dHlwZW5hbWUgVmFsdWVU
eXBlLCB0eXBlbmFtZS4uLiBBcmd1bWVudHM+CitWYWx1ZVR5cGUqIFByb2NlZHVyZTo6YWRkKEFy
Z3VlbnRzLi4uIGFyZ3VtZW50cykKK3sKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8VmFsdWVUeXBlPiB2
YWx1ZShuZXcgVmFsdWVUeXBlKG1fdmFsdWVzLnNpemUoKSwgYXJndW1lbnRzLi4uKSk7CisgICAg
VmFsdWVUeXBlKiByZXN1bHQgPSB2YWx1ZS5nZXQoKTsKKyAgICBtX3ZhbHVlcy5hcHBlbmQoV1RG
Ojptb3ZlKHZhbHVlKSk7CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworfSB9IC8vIG5hbWVzcGFj
ZSBKU0M6OkIzCisKKyNlbmRpZiAvLyBCM1Byb2NlZHVyZUlubGluZXNfaAorCkluZGV4OiBTb3Vy
Y2UvSmF2YVNjcmlwdENvcmUvYjMvQjNTdGFja1Nsb3RLaW5kLmNwcAo9PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBT
b3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNTdGFja1Nsb3RLaW5kLmNwcAkocmV2aXNpb24gMCkK
KysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM1N0YWNrU2xvdEtpbmQuY3BwCSh3b3JraW5n
IGNvcHkpCkBAIC0wLDAgKzEsNTEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTUgQXBwbGUg
SW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2Ug
aW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0
aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25z
CisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3Qg
cmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNv
bmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0
aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Cisg
KiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRp
c2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlh
bHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUg
SVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBP
UiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUK
KyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9S
IEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNI
QUxMIEFQUExFIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJF
Q1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05T
RVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJP
Q1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERB
VEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FV
U0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJB
Q1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBP
UiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJ
UyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERB
TUFHRS4gCisgKi8KKworI2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgIlN0YWNrU2xvdEtp
bmQuaCIKKworI2luY2x1ZGUgPHd0Zi9QcmludFN0cmVhbS5oPgorCituYW1lc3BhY2UgV1RGIHsK
KwordXNpbmcgbmFtZXNwYWNlIEpTQzo6QjM7CisKK3ZvaWQgcHJpbnRJbnRlcm5hbChQcmludFN0
cmVhbSYgb3V0LCBTdGFja1Nsb3RLaW5kIGtpbmQpCit7CisgICAgc3dpdGNoIChraW5kKSB7Cisg
ICAgY2FzZSBTdGFja1Nsb3RLaW5kOjpMb2NrZWQ6CisgICAgICAgIG91dC5wcmludCgiTG9ja2Vk
Iik7CisgICAgICAgIHJldHVybjsKKyAgICBjYXNlIFN0YWNrU2xvdEtpbmQ6OkFub255bW91czoK
KyAgICAgICAgb3V0LnByaW50KCJBbm9ueW1vdXMiKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0K
KyAgICBSRUxFQVNFX0FTU0VSVF9OT1RfUkVBQ0hFRCgpOworfQorCit9IC8vIG5hbWVzcGFjZSBX
VEYKKworCisKSW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM1N0YWNrU2xvdEtpbmQu
aAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNTdGFja1Nsb3RLaW5k
LmgJKHJldmlzaW9uIDApCisrKyBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNTdGFja1Nsb3RL
aW5kLmgJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSw1NCBAQAorLyoKKyAqIENvcHlyaWdodCAo
QykgMjAxNSBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmli
dXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0
CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93
aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291
cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0
aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICog
Mi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92
ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRo
ZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29y
IG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICog
VEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5Z
CisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJ
TUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBB
TkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAg
SU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJM
RSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVN
UExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlU
RUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBM
T1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElP
TikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hF
VEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElO
RyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUg
VVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklM
SVRZIE9GIFNVQ0ggREFNQUdFLiAKKyAqLworCisjaWZuZGVmIEIzU3RhY2tTbG90S2luZF9oCisj
ZGVmaW5lIEIzU3RhY2tTbG90S2luZF9oCisKK25hbWVzcGFjZSBKU0MgeyBuYW1lc3BhY2UgQjMg
eworCitlbnVtIGNsYXNzIFN0YWNrU2xvdEtpbmQgOiB1aW50OF90IHsKKyAgICAvLyBBIGxvY2tl
ZCBzdGFjayBzbG90IG5lZWRzIHRvIGJlIGtlZXAgZGlzam9pbnQgZnJvbSBhbGwgb3RoZXJzIGJl
Y2F1c2Ugd2UgaW50ZW5kIHRvIGVzY2FwZQorICAgIC8vIGl0IGV2ZW4gaWYgdGhhdCdzIG5vdCBv
YnZpb3VzLiBUaGlzIGhhcHBlbnMgd2hlbiB0aGUgcnVudGltZSB0YWtlcyB0aGUgYWRkcmVzcyBv
ZiBhIHN0YWNrCisgICAgLy8gc2xvdC4KKyAgICBMb2NrZWQsCisKKyAgICAvLyBUaGVzZSBzdGFj
ayBzbG90cyBjb3VsZCBzaGFyZSBzcGFjZSB3aXRoIG90aGVyIHN0YWNrIHNsb3RzLCBwcm92aWRl
ZCB0aGF0IHRoZXkgYXJlbid0IGxpdmUKKyAgICAvLyBhdCB0aGUgc2FtZSB0aW1lLiBUaGUgY29t
cGlsZXIgc3RpbGwgaGFzIHRvIGRvIGVzY2FwZSBhbmFseXNpcywgc2luY2UgdGhlc2UgY2FuIGJl
IGVzY2FwZWQKKyAgICAvLyBleHBsaWNpdGx5IGluIElSLgorICAgIEFub255bW91cworfTsKKwor
fSB9IC8vIG5hbWVzcGFjZSBKU0M6OkIzCisKK25hbWVzcGFjZSBXVEYgeworCitjbGFzcyBQcmlu
dFN0cmVhbTsKKwordm9pZCBwcmludEludGVybmFsKFByaW50U3RyZWFtJiwgSlNDOjpCMzo6U3Rh
Y2tTbG90S2luZCk7CisKK30gLy8gbmFtZXNwYWNlIFdURgorCisjZW5kaWYgLy8gQjNTdGFja1Ns
b3RLaW5kX2gKKwpJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzU3RhY2tTbG90VmFs
dWUuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM1N0YWNrU2xv
dFZhbHVlLmNwcAkocmV2aXNpb24gMCkKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM1N0
YWNrU2xvdFZhbHVlLmNwcAkod29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDQxIEBACisvKgorICog
Q29weXJpZ2h0IChDKSAyMDE1IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisg
KiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRo
IG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0
IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0
aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAg
ICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2Ns
YWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1
Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0
aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRh
dGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlv
bi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gYGBBUyBJ
UycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcs
IEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hB
TlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJ
U0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SCisgKiBDT05UUklCVVRP
UlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lB
TCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJV
VCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1Ig
U0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1Mg
SU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElB
QklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisg
KiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkg
T1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBU
SEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisKKyNpbmNsdWRlICJjb25maWcu
aCIKKyNpbmNsdWRlICJCM1N0YWNrU2xvdFZhbHVlLmgiCisKK25hbWVzcGFjZSBKU0MgeyBuYW1l
c3BhY2UgQjMgeworCitTdGFja1Nsb3RWYWx1ZTo6flN0YWNrU2xvdFZhbHVlKCkKK3sKK30KKwor
dm9pZCBTdGFja1Nsb3RWYWx1ZTo6ZHVtcE1ldGEoUHJpbnRTdHJlYW0mIG91dCkgY29uc3QKK3sK
KyAgICBvdXQucHJpbnQoImJ5dGVTaXplID0gIiwgbV9ieXRlU2l6ZSwgIiwga2luZCA9ICIsIG1f
a2luZCk7Cit9CisKK30gfSAvLyBuYW1lc3BhY2UgSlNDOjpCMworCkluZGV4OiBTb3VyY2UvSmF2
YVNjcmlwdENvcmUvYjMvQjNTdGFja1Nsb3RWYWx1ZS5oCj09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9K
YXZhU2NyaXB0Q29yZS9iMy9CM1N0YWNrU2xvdFZhbHVlLmgJKHJldmlzaW9uIDApCisrKyBTb3Vy
Y2UvSmF2YVNjcmlwdENvcmUvYjMvQjNTdGFja1Nsb3RWYWx1ZS5oCSh3b3JraW5nIGNvcHkpCkBA
IC0wLDAgKzEsNjkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTUgQXBwbGUgSW5jLiBBbGwg
cmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNl
IGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUg
cGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUg
bWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRo
ZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMg
YW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBi
aW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3Rp
Y2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIg
aW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlk
ZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklE
RUQgQlkgQVBQTEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVE
IFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJ
RUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElD
VUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExF
IElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElS
RUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFM
IERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQg
T0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisg
KiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBP
TiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklD
VCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJ
U0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FS
RSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisg
Ki8KKworI2lmbmRlZiBCM1N0YWNrU2xvdFZhbHVlX2gKKyNkZWZpbmUgQjNTdGFja1Nsb3RWYWx1
ZV9oCisKKyNpbmNsdWRlICJCM1ZhbHVlLmgiCisjaW5jbHVkZSAiQjNTdGFja1Nsb3RLaW5kLmgi
CisKK25hbWVzcGFjZSBKU0MgeyBuYW1lc3BhY2UgQjMgeworCitjbGFzcyBTdGFja1Nsb3RWYWx1
ZSA6IHB1YmxpYyBWYWx1ZSB7CitwdWJsaWM6CisgICAgc3RhdGljIGJvb2wgYWNjZXB0cyhPcGNv
ZGUgb3Bjb2RlKSB7IHJldHVybiBvcGNvZGUgPT0gU3RhY2tTbG90OyB9CisKKyAgICB+U3RhY2tT
bG90VmFsdWUoKTsKKworICAgIHVuc2lnbmVkIGJ5dGVTaXplKCkgY29uc3QgeyByZXR1cm4gbV9i
eXRlU2l6ZTsgfQorICAgIFN0YWNrU2xvdEtpbmQga2luZCgpIGNvbnN0IHsgcmV0dXJuIG1fa2lu
ZDsgfQorCisgICAgLy8gVGhpcyBnZXRzIGFzc2lnbmVkIGF0IHRoZSBlbmQgb2YgY29tcGlsYXRp
b24uIFlvdSBjYW5ub3QgcmVseSBvbiBpdCBoYXZpbmcgYSBtZWFuaW5nZnVsCisgICAgLy8gdmFs
dWUgd2hpbGUgdGhlIGNvbXBpbGVyIGlzIHJ1bm5pbmcuCisgICAgaW50cHRyX3Qgb2Zmc2V0RnJv
bUZQKCkgY29uc3QgeyByZXR1cm4gbV9vZmZzZXRGcm9tRlA7IH0KKworcHJvdGVjdGVkOgorICAg
IHZvaWQgZHVtcE1ldGEoUHJpbnRTdHJlYW0mKSBjb25zdCBvdmVycmlkZTsKKworcHJpdmF0ZToK
KyAgICBmcmllbmQgY2xhc3MgUHJvY2VkdXJlOworCisgICAgU3RhY2tTbG90VmFsdWUodW5zaWdu
ZWQgaW5kZXgsIE9yaWdpbiBvcmlnaW4sIHVuc2lnbmVkIGJ5dGVTaXplLCBTdGFja1Nsb3RLaW5k
IGtpbmQpCisgICAgICAgIDogVmFsdWUoaW5kZXgsIFN0YWNrU2xvdCwgcG9pbnRlcigpLCBvcmln
aW4pCisgICAgICAgICwgbV9ieXRlU2l6ZShieXRlU2l6ZSkKKyAgICAgICAgLCBtX2tpbmQoa2lu
ZCkKKyAgICAgICAgLCBtX29mZnNldEZyb21GUCgwKQorICAgIHsKKyAgICB9CisKKyAgICB1bnNp
Z25lZCBtX2J5dGVTaXplOworICAgIFN0YWNrU2xvdEtpbmQgbV9raW5kOworICAgIGludHB0cl90
IG1fb2Zmc2V0RnJvbUZQOworfTsKKworfSB9IC8vIG5hbWVzcGFjZSBKU0M6OkIzCisKKyNlbmRp
ZiAvLyBCM1N0YWNrU2xvdFZhbHVlX2gKKwpJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL2Iz
L0IzU3RhY2ttYXAuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9C
M1N0YWNrbWFwLmNwcAkocmV2aXNpb24gMCkKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9C
M1N0YWNrbWFwLmNwcAkod29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDQwIEBACisvKgorICogQ29w
eXJpZ2h0IChDKSAyMDE1IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBS
ZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9y
IHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRo
ZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9u
cyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBu
b3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWlt
ZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2Ug
dGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9u
cyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlv
biBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4K
KyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycn
IEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJV
VCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRB
QklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NM
QUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMg
QkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwK
KyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBO
T1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VS
VklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5U
RVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklM
SVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAo
SU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VU
IE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUg
UE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisKKyNpbmNsdWRlICJjb25maWcuaCIK
KyNpbmNsdWRlICJCM1N0YWNrbWFwLmgiCisKK25hbWVzcGFjZSBKU0MgeyBuYW1lc3BhY2UgQjMg
eworCit2b2lkIFN0YWNrbWFwOjpkdW1wKFByaW50U3RyZWFtJiBvdXQpIGNvbnN0Cit7CisgICAg
b3V0LnByaW50KAorICAgICAgICAie29wYXF1ZSA9ICIsIFJhd1BvaW50ZXIobV9vcGFxdWUpLCAi
LCByZXBzID0gIiwgbGlzdER1bXAobV9yZXBzKSwKKyAgICAgICAgIiwgZ2VuZXJhdG9yID0gIiwg
UmF3UG9pbnRlcihtX2dlbmVyYXRvci5nZXQoKSksICIsIGNsb2JiZXJlZCA9ICIsIG1fY2xvYmJl
cmVkLAorICAgICAgICAiLCB1c2VkUmVnaXN0ZXJzID0gIiwgbV91c2VkUmVnaXN0ZXJzLCAifSIp
OworfQorCit9IH0gLy8gbmFtZXNwYWNlIEpTQzo6QjMKKwpJbmRleDogU291cmNlL0phdmFTY3Jp
cHRDb3JlL2IzL0IzU3RhY2ttYXAuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENv
cmUvYjMvQjNTdGFja21hcC5oCShyZXZpc2lvbiAwKQorKysgU291cmNlL0phdmFTY3JpcHRDb3Jl
L2IzL0IzU3RhY2ttYXAuaAkod29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDEyNiBAQAorLyoKKyAq
IENvcHlyaWdodCAoQykgMjAxNSBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgor
ICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0
aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhh
dCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1
dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICog
ICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNj
bGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9k
dWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRp
dGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50
YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRp
b24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIGBgQVMg
SVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5H
LCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNI
QU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBE
SVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUgorICogQ09OVFJJQlVU
T1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJ
QUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBC
VVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9S
IFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNT
IElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJ
QUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAor
ICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZ
IE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0Yg
VEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLiAKKyAqLworCisjaWZuZGVmIEIzU3RhY2tt
YXBfaAorI2RlZmluZSBCM1N0YWNrbWFwX2gKKworI2luY2x1ZGUgIkIzVmFsdWVSZXAuaCIKKyNp
bmNsdWRlICJDQ2FsbEhlbHBlcnMuaCIKKyNpbmNsdWRlICJSZWdpc3RlclNldC5oIgorI2luY2x1
ZGUgPHd0Zi9TaGFyZWRUYXNrLmg+CisKK25hbWVzcGFjZSBKU0MgeyBuYW1lc3BhY2UgQjMgewor
CitjbGFzcyBDaGVja1NwZWNpYWw7CitjbGFzcyBTdGFja21hcFNwZWNpYWw7CitjbGFzcyBWYWx1
ZTsKKworY2xhc3MgU3RhY2ttYXAgeworcHVibGljOgorICAgIHN0cnVjdCBHZW5lcmF0aW9uUGFy
YW1zIHsKKyAgICAgICAgLy8gVGhpcyBpcyB0aGUgVmFsdWUgY29udGFpbmluZyB0aGUgc3RhY2tt
YXAuCisgICAgICAgIFZhbHVlKiB2YWx1ZTsKKworICAgICAgICAvLyBUaGlzIGlzIHRoZSBzdGFj
a21hcC4KKyAgICAgICAgU3RhY2ttYXAqIHN0YWNrbWFwOworCisgICAgICAgIC8vIFRoaXMgdGVs
bHMgeW91IHRoZSBhY3R1YWwgdmFsdWUgcmVwcmVzZW50YXRpb25zIHRoYXQgd2VyZSBjaG9zZW4u
CisgICAgICAgIFZlY3RvcjxWYWx1ZVJlcD4gcmVwczsKKworICAgICAgICAvLyBUaGlzIHRlbGxz
IHlvdSB0aGUgcmVnaXN0ZXJzIHRoYXQgd2VyZSB1c2VkLgorICAgICAgICBSZWdpc3RlclNldCB1
c2VkUmVnaXN0ZXJzOworICAgIH07CisgICAgCisgICAgdHlwZWRlZiB2b2lkIEdlbmVyYXRvckZ1
bmN0aW9uKENDYWxsSGVscGVycyYsIGNvbnN0IEdlbmVyYXRpb25QYXJhbXMmKTsKKyAgICB0eXBl
ZGVmIFNoYXJlZFRhc2s8R2VuZXJhdG9yRnVuY3Rpb24+IEdlbmVyYXRvcjsKKyAgICAKKyAgICBT
dGFja21hcCgpCisgICAgeworICAgIH0KKworICAgIC8vIFNldCBzb21lIG9wYXF1ZSBkYXRhIHRv
IGlkZW50aWZ5IHRoaXMgc3RhY2ttYXAuIFRoaXMgaXMgdXNlZnVsIGJlY2F1c2UgYSBTdGFja21h
cC11c2luZyBWYWx1ZQorICAgIC8vIGNhbiBiZSBkdXBsaWNhdGVkLCBhbmQgZWFjaCBkdXBsaWNh
dGUgbWF5IGVuZCB1cCBoYXZpbmcgZGlmZmVyZW50IHJlZ2lzdGVyIGFsbG9jYXRpb24uIFRoaXMK
KyAgICAvLyBhbGxvd3MgYWxsIG9mIHRob3NlIGR1cGxpY2F0ZXMgdG8gYmUgYWJsZSB0byByZWZl
ciBiYWNrIHRvIHdoYXRldmVyIGhpZ2gtbGV2ZWwgZGF0YSBzdHJ1Y3R1cmVzCisgICAgLy8gd2Ug
d2VyZSB1c2luZyB0byBjcmVhdGUgdGhlIHZhbHVlLgorICAgIHZvaWQgc2V0T3BhcXVlKHZvaWQq
IHBhcmFtZXRlcikKKyAgICB7CisgICAgICAgIG1fb3BhcXVlID0gcGFyYW1ldGVyOworICAgIH0K
KyAgICB2b2lkKiBvcGFxdWUoKSBjb25zdCB7IHJldHVybiBtX29wYXF1ZTsgfQorCisgICAgLy8g
Q29udmVuaWVuY2UgaGVscGVycyB3aGVuIHVzaW5nIGluZGljZXMgaW5zdGVhZCBvZiBwb2ludGVy
cy4KKyAgICB2b2lkIHNldE9wYXF1ZUluZGV4KHNpemVfdCBpbmRleCkKKyAgICB7CisgICAgICAg
IHNldE9wYXF1ZShiaXR3aXNlX2Nhc3Q8dm9pZCo+KGluZGV4KSk7CisgICAgfQorICAgIHNpemVf
dCBvcGFxdWVJbmRleCgpIGNvbnN0IHsgcmV0dXJuIGJpdHdpc2VfY2FzdDxzaXplX3Q+KG9wYXF1
ZSgpKTsgfQorCisgICAgLy8gQ29uc3RyYWluIGFuIGFyZ3VtZW50IHRvIHRoZSBWYWx1ZSB0aGF0
IHVzZXMgdGhpcyBTdGFja21hcC4gTm90ZSB0aGF0IGluZGV4IHplcm8gcmVmZXJzIHRvIHRoZQor
ICAgIC8vIGZpcnN0IGFyZ3VtZW50IHRvIHRoYXQgVmFsdWUsIGV2ZW4gaWYgdGhhdCBhcmd1bWVu
dCBpcyBub3QgY29uc3RyYWluYWJsZS4gRm9yIGV4YW1wbGUsIGluIGEKKyAgICAvLyBDaGVja0Fk
ZCB2YWx1ZSwgaXQgd291bGQgYmUgYW4gZXJyb3IgdG8gY29uc3RyYWluIGluZGljZXMgMCBhbmQg
MS4gSW4gYSBDaGVjayB2YWx1ZSwgaXQgd291bGQKKyAgICAvLyBiZSBhbiBlcnJvciB0byBjb25z
dHJhaW4gaW5kZXggMC4gQnV0LCB3aGVuIHRoZSBnZW5lcmF0aW9uIGNhbGxiYWNrIGlzIGNhbGxl
ZCwgeW91IGNhbiBkZXBlbmQKKyAgICAvLyBvbiB0aGUgcmVwcyBmb3IgdGhvc2UgaW5kaWNlcyBi
ZWluZyBmaWxsZWQgaW4uCisgICAgdm9pZCBjb25zdHJhaW4odW5zaWduZWQgaW5kZXgsIGNvbnN0
IFZhbHVlUmVwJiByZXApCisgICAgeworICAgICAgICBpZiAoaW5kZXggKyAxIDwgbV9yZXBzLnNp
emUoKSkKKyAgICAgICAgICAgIG1fcmVwcy5ncm93KGluZGV4ICsgMSk7CisgICAgICAgIG1fcmVw
c1tpbmRleF0gPSByZXA7CisgICAgfQorCisgICAgdm9pZCBjbG9iYmVyKGNvbnN0IFJlZ2lzdGVy
U2V0JiBzZXQpCisgICAgeworICAgICAgICBtX2Nsb2JiZXJlZC5tZXJnZShzZXQpOworICAgIH0K
KworICAgIGNvbnN0IFJlZ2lzdGVyU2V0JiBjbG9iYmVyZWQoKSBjb25zdCB7IHJldHVybiBtX2Ns
b2JiZXJlZDsgfQorCisgICAgdm9pZCBzZXRHZW5lcmF0b3IoUmVmUHRyPEdlbmVyYXRvcj4gZ2Vu
ZXJhdG9yKQorICAgIHsKKyAgICAgICAgbV9nZW5lcmF0b3IgPSBnZW5lcmF0b3I7CisgICAgfQor
CisgICAgdGVtcGxhdGU8dHlwZW5hbWUgRnVuY3Rvcj4KKyAgICB2b2lkIHNldEdlbmVyYXRvcihj
b25zdCBGdW5jdG9yJiBmdW5jdG9yKQorICAgIHsKKyAgICAgICAgbV9nZW5lcmF0b3IgPSBjcmVh
dGVTaGFyZWRUYXNrPEdlbmVyYXRvckZ1bmN0aW9uPihmdW5jdG9yKTsKKyAgICB9CisKKyAgICB2
b2lkIGR1bXAoUHJpbnRTdHJlYW0mKSBjb25zdDsKKyAgICAKK3ByaXZhdGU6CisgICAgZnJpZW5k
IGNsYXNzIENoZWNrU3BlY2lhbDsKKyAgICBmcmllbmQgY2xhc3MgU3RhY2ttYXBTcGVjaWFsOwor
ICAgIAorICAgIHZvaWQqIG1fb3BhcXVlIHsgbnVsbHB0ciB9OworICAgIFZlY3RvcjxWYWx1ZVJl
cD4gbV9yZXBzOworICAgIFJlZlB0cjxHZW5lcmF0b3I+IG1fZ2VuZXJhdG9yOworICAgIFJlZ2lz
dGVyU2V0IG1fY2xvYmJlcmVkOworICAgIFJlZ2lzdGVyU2V0IG1fdXNlZFJlZ2lzdGVyczsgLy8g
U3RhY2ttYXBzIGNvdWxkIGJlIGZ1cnRoZXIgZHVwbGljYXRlZCBieSBBaXIsIGJ1dCB0aGF0J3Mg
dW5saWtlbHksIHNvIHdlIGp1c3QgbWVyZ2UgdGhlIHVzZWQgcmVnaXN0ZXJzIHNldHMgaWYgdGhh
dCB3ZXJlIHRvIGhhcHBlbi4KK307CisKK30gfSAvLyBuYW1lc3BhY2UgSlNDOjpCMworCisjZW5k
aWYgLy8gQjNTdGFja21hcF9oCisKSW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM1N0
YWNrbWFwU3BlY2lhbC5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRDb3JlL2Iz
L0IzU3RhY2ttYXBTcGVjaWFsLmNwcAkocmV2aXNpb24gMCkKKysrIFNvdXJjZS9KYXZhU2NyaXB0
Q29yZS9iMy9CM1N0YWNrbWFwU3BlY2lhbC5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSwy
NDIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTUgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJl
c2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5h
cnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVk
IHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICog
MS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBj
b3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBm
b2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9y
bSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMg
bGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisg
KiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0
aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQ
TEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJ
RVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFO
VElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICog
UFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IK
KyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJ
REVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMg
KElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJ
VFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRT
OyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhF
T1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJ
VFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJ
TkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJ
RiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKworI2lu
Y2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgIkIzU3RhY2ttYXBTcGVjaWFsLmgiCisKK25hbWVz
cGFjZSBKU0MgeyBuYW1lc3BhY2UgQjMgeworCit1c2luZyBuYW1lc3BhY2UgQWlyOworCitTdGFj
a21hcFNwZWNpYWw6OlN0YWNrbWFwU3BlY2lhbChjb25zdCBjaGFyKiBuYW1lKQorICAgIDogU3Bl
Y2lhbChuYW1lKQoreworfQorCitTdGFja21hcFNwZWNpYWw6On5TdGFja21hcFNwZWNpYWwoKQor
eworfQorCit2b2lkIFN0YWNrbWFwU3BlY2lhbDo6Zm9yRWFjaEFyZyhJbnN0JiBpbnN0LCBjb25z
dCBTY29wZWRMYW1iZGE8SW5zdDo6RWFjaEFyZ0NhbGxiYWNrPiYgY2FsbGJhY2spCit7CisgICAg
cmV0dXJuIGZvckVhY2hBcmdJbXBsKDAsIDEsIGluc3QsIGNhbGxiYWNrKTsKK30KKworYm9vbCBT
dGFja21hcFNwZWNpYWw6OmlzVmFsaWQoSW5zdCYgaW5zdCkKK3sKKyAgICByZXR1cm4gaXNWYWxp
ZEltcGwoMCwgMSwgaW5zdCk7Cit9CisKK2Jvb2wgU3RhY2ttYXBTcGVjaWFsOjphZG1pdHNTdGFj
ayhJbnN0JiBpbnN0LCB1bnNpZ25lZCBhcmdJbmRleCkKK3sKKyAgICByZXR1cm4gYWRtaXRzU3Rh
Y2soMCwgMSwgaW5zdCwgYXJnSW5kZXgpOworfQorCit2b2lkIFN0YWNrbWFwU3BlY2lhbDo6cmVw
b3J0VXNlZFJlZ2lzdGVycyhJbnN0JiBpbnN0LCBjb25zdCBSZWdpc3RlclNldCYgdXNlZFJlZ2lz
dGVycykKK3sKKyAgICBWYWx1ZSogdmFsdWUgPSBpbnN0Lm9yaWdpbjsKKyAgICBTdGFja21hcCog
c3RhY2ttYXAgPSB2YWx1ZS0+c3RhY2ttYXAoKTsKKworICAgIC8vIEZJWE1FOiBJZiB0aGUgSW5z
dCB0aGF0IHVzZXMgdGhlIFN0YWNrbWFwU3BlY2lhbCBnZXRzIGR1cGxpY2F0ZWQsIHRoZW4gd2Ug
ZW5kIHVwIG1lcmdpbmcgdXNlZAorICAgIC8vIHJlZ2lzdGVyIHNldHMgZnJvbSBtdWx0aXBsZSBw
bGFjZXMuIFRoaXMgY3VycmVudGx5IHdvbid0IGhhcHBlbiBzaW5jZSBBaXIgZG9lc24ndCBoYXZl
IHRhaWxkdXAKKyAgICAvLyBvciB0aGluZ3MgbGlrZSB0aGF0LiBCdXQgbWF5YmUgZXZlbnR1YWxs
eSBpdCBjb3VsZCBiZSBhIHByb2JsZW0uCisgICAgc3RhY2ttYXAtPm1fdXNlZFJlZ2lzdGVycy5t
ZXJnZSh1c2VkUmVnaXN0ZXJzKTsKK30KKworY29uc3QgUmVnaXN0ZXJTZXQmIFN0YWNrbWFwU3Bl
Y2lhbDo6ZXh0cmFDbG9iYmVyZWRSZWdzKEluc3QmIGluc3QpCit7CisgICAgVmFsdWUqIHZhbHVl
ID0gaW5zdC5vcmlnaW47CisgICAgU3RhY2ttYXAqIHN0YWNrbWFwID0gdmFsdWUtPnN0YWNrbWFw
KCk7CisKKyAgICByZXR1cm4gc3RhY2ttYXAtPmNsb2JiZXJlZCgpOworfQorCit2b2lkIFN0YWNr
bWFwU3BlY2lhbDo6Zm9yRWFjaEFyZ0ltcGwoCisgICAgdW5zaWduZWQgbnVtSWdub3JlZEIzQXJn
cywgdW5zaWduZWQgbnVtSWdub3JlZEFpckFyZ3MsCisgICAgSW5zdCYgaW5zdCwgY29uc3QgU2Nv
cGVkTGFtYmRhPEluc3Q6OkVhY2hBcmdDYWxsYmFjaz4mIGNhbGxiYWNrKQoreworICAgIFZhbHVl
KiB2YWx1ZSA9IGluc3Qub3JpZ2luOworCisgICAgLy8gQ2hlY2sgdGhhdCBpbnNhbmUgdGhpbmdz
IGhhdmUgbm90IGhhcHBlbmVkLgorICAgIEFTU0VSVChpbnN0LmFyZ3Muc2l6ZSgpID49IG51bUln
bm9yZWRBaXJBcmdzKTsKKyAgICBBU1NFUlQodmFsdWUtPmNoaWxkcmVuLnNpemUoKSA+PSBudW1J
Z25vcmVkQjNBcmdzKTsKKyAgICBBU1NFUlQoaW5zdC5hcmdzLnNpemUoKSAtIG51bUlnbm9yZWRB
aXJBcmdzID09IHZhbHVlLT5jaGlsZHJlbi5zaXplKCkgLSBudW1JZ25vcmVkQjNBcmdzKTsKKyAg
ICAKKyAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgaW5zdC5hcmdzLnNpemUoKSAtIG51bUln
bm9yZWRCM0FyZ3M7ICsraSkgeworICAgICAgICBBcmcmIGFyZyA9IGluc3QuYXJnc1tpICsgbnVt
SWdub3JlZEIzQXJnc107CisgICAgICAgIFZhbHVlKiBjaGlsZCA9IHZhbHVlLT5jaGlsZChpICsg
bnVtSWdub3JlZEFpckFyZ3MpOworCisgICAgICAgIGNhbGxiYWNrKGFyZywgQXJnOjpVc2UsIEFy
Zzo6dHlwZUZvckIzVHlwZShjaGlsZC0+dHlwZSgpKSk7CisgICAgfQorfQorCitib29sIFN0YWNr
bWFwU3BlY2lhbDo6aXNWYWxpZEltcGwoCisgICAgdW5zaWduZWQgbnVtSWdub3JlZEIzQXJncywg
dW5zaWduZWQgbnVtSWdub3JlZEFyZ0FyZ3MsCisgICAgSW5zdCYgaW5zdCkKK3sKKyAgICBWYWx1
ZSogdmFsdWUgPSBpbnN0Lm9yaWdpbjsKKworICAgIC8vIENoZWNrIHRoYXQgaW5zYW5lIHRoaW5n
cyBoYXZlIG5vdCBoYXBwZW5lZC4KKyAgICBBU1NFUlQoaW5zdC5hcmdzLnNpemUoKSA+PSBudW1J
Z25vcmVkQWlyQXJncyk7CisgICAgQVNTRVJUKHZhbHVlLT5jaGlsZHJlbi5zaXplKCkgPj0gbnVt
SWdub3JlZEIzQXJncyk7CisKKyAgICBTdGFja21hcCogc3RhY2ttYXAgPSB2YWx1ZS0+c3RhY2tt
YXAoKTsKKworICAgIEFTU0VSVChzdGFja21hcCk7CisKKyAgICAvLyBGb3IgdGhlIEluc3QgdG8g
YmUgdmFsaWQsIGl0IG5lZWRzIHRvIGhhdmUgdGhlIHJpZ2h0IG51bWJlciBvZiBhcmd1bWVudHMu
CisgICAgaWYgKGluc3QuYXJncy5zaXplKCkgLSBudW1JZ25vcmVkQWlyQXJncyAhPSB2YWx1ZS0+
Y2hpbGRyZW4uc2l6ZSgpIC0gbnVtSWdub3JlZEIzQXJncykKKyAgICAgICAgcmV0dXJuIGZhbHNl
OworCisgICAgLy8gUmVnYXJkbGVzcyBvZiBjb25zdHJhaW50cywgc3RhY2ttYXBzIGhhdmUgc29t
ZSBiYXNpYyByZXF1aXJlbWVudHMgZm9yIHRoZWlyIGFyZ3VtZW50cy4gRm9yCisgICAgLy8gZXhh
bXBsZSwgeW91IGNhbid0IGhhdmUgYSBub24tRlAtb2Zmc2V0IGFkZHJlc3MuIFRoaXMgdmVyaWZp
ZXMgdGhvc2UgY29uZGl0aW9ucyBhcyB3ZWxsIGFzIHRoZQorICAgIC8vIGFyZ3VtZW50IHR5cGVz
LgorICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBpbnN0LmFyZ3Muc2l6ZSgpIC0gbnVtSWdu
b3JlZEIzQXJnczsgKytpKSB7CisgICAgICAgIFZhbHVlKiBjaGlsZCA9IHZhbHVlLT5jaGlsZChp
ICsgbnVtSWdub3JlZEIzQXJncyk7CisgICAgICAgIEFyZyYgYXJnID0gaW5zdC5hcmdzW2kgKyBu
dW1JZ25vcmVkQWlyQXJnc107CisgICAgICAgIAorICAgICAgICBzd2l0Y2ggKGFyZy5raW5kKCkp
IHsKKyAgICAgICAgY2FzZSBBcmc6OlRtcDoKKyAgICAgICAgY2FzZSBBcmc6OkltbToKKyAgICAg
ICAgY2FzZSBBcmc6OkltbTY0OgorICAgICAgICBjYXNlIEFyZzo6U3RhY2s6CisgICAgICAgIGNh
c2UgQXJnOjpDYWxsQXJnOgorICAgICAgICAgICAgYnJlYWs7IC8vIE9LCisgICAgICAgIGNhc2Ug
QXJnOjpBZGRyOgorICAgICAgICAgICAgaWYgKGFyZy5iYXNlKCkgIT0gVG1wKEdQUkluZm86OmNh
bGxGcmFtZVJlZ2lzdGVyKSAmJgorICAgICAgICAgICAgICAgIGFyZy5iYXNlKCkgIT0gVG1wKE1h
Y3JvQXNzZW1ibGVyOjpzdGFja1BvaW50ZXJSZWdpc3RlcikpCisgICAgICAgICAgICAgICAgcmV0
dXJuIGZhbHNlOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAg
ICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIEFyZzo6VHlw
ZSB0eXBlID0gQXJnOjp0eXBlRm9yQjNUeXBlKGNoaWxkLT50eXBlKCkpOworCisgICAgICAgIGlm
ICghYXJnLmlzVHlwZSh0eXBlKSkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisK
KyAgICAvLyBUaGUgbnVtYmVyIG9mIGNvbnN0cmFpbnRzIGhhcyB0byBiZSBubyBncmVhdGVyIHRo
YW4gdGhlIG51bWJlciBvZiBCMyBjaGlsZHJlbi4KKyAgICBBU1NFUlQoc3RhY2ttYXAtPm1fcmVw
cy5zaXplKCkgPD0gdmFsdWUtPmNoaWxkcmVuLnNpemUoKSk7CisKKyAgICAvLyBWZXJpZnkgYW55
IGV4cGxpY2l0bHkgc3VwcGxpZWQgY29uc3RyYWludHMuCisgICAgZm9yICh1bnNpZ25lZCBpID0g
bnVtSWdub3JlZEIzQXJnczsgaSA8IHN0YWNrbWFwLT5tX3JlcHMuc2l6ZSgpOyArK2kpIHsKKyAg
ICAgICAgVmFsdWUqIGNoaWxkID0gdmFsdWUtPmNoaWxkKGkpOworICAgICAgICBWYWx1ZVJlcCYg
cmVwID0gc3RhY2ttYXAtPm1fcmVwc1tpXTsKKyAgICAgICAgQXJnJiBhcmcgPSBpbnN0LmFyZ3Nb
aSAtIG51bUlnbm9yZWRCM0FyZ3MgKyBudW1JZ25vcmVkQWlyQXJnc107CisKKyAgICAgICAgc3dp
dGNoIChyZXAua2luZCgpKSB7CisgICAgICAgIGNhc2UgVmFsdWVSZXA6OkFueToKKyAgICAgICAg
ICAgIC8vIFdlIGFscmVhZHkgdmVyaWZpZWQgdGhpcyBhYm92ZS4KKyAgICAgICAgICAgIGJyZWFr
OworICAgICAgICBjYXNlIFZhbHVlUmVwOjpTb21lUmVnaXN0ZXI6CisgICAgICAgICAgICBpZiAo
IWFyZy5pc1RtcCgpKQorICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAg
IGJyZWFrOworICAgICAgICBjYXNlIFZhbHVlUmVwOjpSZWdpc3RlcjoKKyAgICAgICAgICAgIGlm
IChhcmcgIT0gVG1wKHJlcC5yZWcoKSkpCisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwor
ICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgVmFsdWVSZXA6OlN0YWNrOgorICAgICAg
ICAgICAgLy8gVGhpcyBpcyBub3QgYSB2YWxpZCBpbnB1dCByZXByZXNlbnRhdGlvbi4KKyAgICAg
ICAgICAgIEFTU0VSVF9OT1RfUkVBQ0hFRCgpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAg
IGNhc2UgVmFsdWVSZXA6OlN0YWNrQXJndW1lbnQ6CisgICAgICAgICAgICBpZiAoYXJnICE9IEFy
Zzo6Y2FsbEFyZyhyZXAub2Zmc2V0RnJvbVNQKCkpKQorICAgICAgICAgICAgICAgIHJldHVybiBm
YWxzZTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFZhbHVlUmVwOjpDb25zdGFu
dDoKKyAgICAgICAgICAgIC8vIFRoaXMgaXMgbm90IGEgdmFsaWQgaW5wdXQgcmVwcmVzZW50YXRp
b24uCisgICAgICAgICAgICBBU1NFUlRfTk9UX1JFQUNIRUQoKTsKKyAgICAgICAgICAgIGJyZWFr
OworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgU3RhY2tt
YXBTcGVjaWFsOjphZG1pdHNTdGFja0ltcGwoCisgICAgdW5zaWduZWQgbnVtSWdub3JlZEIzQXJn
cywgdW5zaWduZWQgbnVtSWdub3JlZEFpckFyZ3MsCisgICAgSW5zdCYgaW5zdCwgdW5zaWduZWQg
YXJnSW5kZXgpCit7CisgICAgVmFsdWUqIHZhbHVlID0gaW5zdC5vcmlnaW47CisgICAgU3RhY2tt
YXAqIHN0YWNrbWFwID0gdmFsdWUtPnN0YWNrbWFwKCk7CisKKyAgICB1bnNpZ25lZCBzdGFja21h
cEFyZ0luZGV4ID0gYXJnSW5kZXggLSBudW1JZ25vcmVkQWlyQXJncyArIG51bUlnbm9yZWRCM0Fy
Z3M7CisKKyAgICBpZiAoc3RhY2ttYXBBcmdJbmRleCA+PSBzdGFja21hcC0+bV9yZXBzLnNpemUo
KSkgeworICAgICAgICAvLyBUaGlzIG1lYW5zIHRoYXQgdGhlcmUgd2FzIG5vIGNvbnN0cmFpbnQu
CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICAKKyAgICAvLyBXZSBvbmx5IGFkbWl0
IHN0YWNrIGZvciBBbnkncywgc2luY2UgU3RhY2sgaXMgbm90IGEgdmFsaWQgaW5wdXQgY29uc3Ry
YWludCwgYW5kIFN0YWNrQXJndW1lbnQKKyAgICAvLyB0cmFuc2xhdGVzIHRvIGEgQ2FsbEFyZyBp
biBBaXIuCisgICAgaWYgKHN0YWNrbWFwLT5tX3JlcHNbc3RhY2ttYXBBcmdJbmRleF0ua2luZCgp
ID09IEFueSkKKyAgICAgICAgcmV0dXJuIHRydWU7CisKKyAgICByZXR1cm4gZmFsc2U7Cit9CisK
K1ZlY3RvcjxWYWx1ZVJlcD4gU3RhY2ttYXBTcGVjaWFsOjpyZXBzKEdlbmVyYXRpb25Db250ZXh0
JiBjb250ZXh0LCBJbnN0JiBpbnN0KQoreworICAgIFZlY3RvcjxWYWx1ZVJlcD4gcmVzdWx0Owor
ICAgIGFwcGVuZFJlcHNJbXBsKGNvbnRleHQsIDEsIGluc3QsIHJlc3VsdCk7CisgICAgcmV0dXJu
IHJlc3VsdDsKK30KKwordm9pZCBTdGFja21hcFNwZWNpYWw6OmFwcGVuZFJlcHNJbXBsKAorICAg
IEdlbmVyYXRpb25Db250ZXh0JiBjb250ZXh0LCB1bnNpZ25lZCBudW1JZ25vcmVkQXJncywgSW5z
dCYgaW5zdCwgVmVjdG9yPFZhbHVlUmVwPiYgcmVzdWx0KQoreworICAgIGZvciAodW5zaWduZWQg
aSA9IG51bUlnbm9yZWRBcmdzOyBpIDwgaW5zdC5hcmdzLnNpemUoKTsgKytpKQorICAgICAgICBy
ZXN1bHQuYXBwZW5kKHJlcEZvckFyZyhjb250ZXh0LmNvZGUsIGFyZykpOworICAgICAgICBBcmcm
IGFyZyA9IGluc3QuYXJnc1tpXTsKKyAgICB9Cit9CisKK1ZhbHVlUmVwIFN0YWNrbWFwU3BlY2lh
bDo6cmVwRm9yQXJnKENvZGUmIGNvZGUsIGNvbnN0IEFyZyYgYXJnKQoreworICAgIHN3aXRjaCAo
YXJnLmtpbmQoKSkgeworICAgIGNhc2UgVG1wOgorICAgICAgICByZXR1cm4gVmFsdWVSZXA6OnJl
ZyhhcmcucmVnKCkpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEltbToKKyAgICBjYXNlIElt
bTY0OgorICAgICAgICByZXR1cm4gVmFsdWVSZXA6OmNvbnN0YW50KGFyZy52YWx1ZSgpKTsKKyAg
ICAgICAgYnJlYWs7CisgICAgY2FzZSBBZGRyOgorICAgICAgICBpZiAoYXJnLmJhc2UoKSA9PSBH
UFJJbmZvOjpjYWxsRnJhbWVSZWdpc3RlcikKKyAgICAgICAgICAgIHJldHVybiBWYWx1ZVJlcDo6
c3RhY2soYXJnLm9mZnNldCgpKTsKKyAgICAgICAgQVNTRVJUKGFyZy5iYXNlKCkgPT0gTWFjcm9B
c3NlbWJsZXI6OnN0YWNrUG9pbnRlclJlZ2lzdGVyKTsKKyAgICAgICAgcmV0dXJuIFZhbHVlUmVw
OjpzdGFjayhhcmcub2Zmc2V0KCkgLSBjb2RlLmZyYW1lT2Zmc2V0KTsKKyAgICBkZWZhdWx0Ogor
ICAgICAgICBBU1NFUlRfTk9UX1JFQUNIRUQoKTsKKyAgICAgICAgcmV0dXJuIFZhbHVlUmVwKCk7
CisgICAgfQorfQorCit9IH0gLy8gbmFtZXNwYWNlIEpTQzo6QjMKKworCkluZGV4OiBTb3VyY2Uv
SmF2YVNjcmlwdENvcmUvYjMvQjNTdGFja21hcFNwZWNpYWwuaAo9PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3Vy
Y2UvSmF2YVNjcmlwdENvcmUvYjMvQjNTdGFja21hcFNwZWNpYWwuaAkocmV2aXNpb24gMCkKKysr
IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM1N0YWNrbWFwU3BlY2lhbC5oCSh3b3JraW5nIGNv
cHkpCkBAIC0wLDAgKzEsNzUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTUgQXBwbGUgSW5j
LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4g
c291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9u
LCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisg
KiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0
YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRp
dGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9u
cyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAg
ICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2Ns
YWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMg
cHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMg
UFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJ
TVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAq
IElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEg
UEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxM
IEFQUExFIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1Qs
IElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFV
RU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VS
RU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEs
IE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VE
IEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1Qs
IFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBP
VEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBT
T0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFH
RS4gCisgKi8KKworI2lmbmRlZiBCM1N0YWNrbWFwU3BlY2lhbF9oCisjZGVmaW5lIEIzU3RhY2tt
YXBTcGVjaWFsX2gKKworI2luY2x1ZGUgIkFpclNwZWNpYWwuaCIKKyNpbmNsdWRlICJCM1N0YWNr
bWFwLmgiCisKK25hbWVzcGFjZSBKU0MgeyBuYW1lc3BhY2UgQjMgeworCisvLyBUaGlzIGlzIGEg
YmFzZSBjbGFzcyBmb3Igc3BlY2lhbHMgdGhhdCBoYXZlIHN0YWNrbWFwcy4gTm90ZSB0aGF0IGl0
IGNhbiBmaW5kIHRoZSBTdGFja21hcCBieQorLy8gYXNraW5nIGZvciB0aGUgSW5zdCdzIG9yaWdp
bi4gSGVuY2UsIHRoZXNlIG9iamVjdHMgZG9uJ3QgbmVlZCB0byBldmVuIGhvbGQgYSByZWZlcmVu
Y2UgdG8gdGhlCisvLyBTdGFja21hcC4KKworY2xhc3MgU3RhY2ttYXBTcGVjaWFsIDogcHVibGlj
IEFpcjo6U3BlY2lhbCB7CitwdWJsaWM6CisgICAgU3RhY2ttYXBTcGVjaWFsKCk7CisgICAgdmly
dHVhbCB+U3RhY2ttYXBTcGVjaWFsKCk7CisKK3Byb3RlY3RlZDoKKyAgICB2b2lkIGZvckVhY2hB
cmcoQWlyOjpJbnN0JiwgY29uc3QgU2NvcGVkTGFtYmRhPEFpcjo6SW5zdDo6RWFjaEFyZ0NhbGxi
YWNrPiYpIG92ZXJyaWRlOworICAgIGJvb2wgaXNWYWxpZChBaXI6Okluc3QmKSBvdmVycmlkZTsK
KyAgICBib29sIGFkbWl0c1N0YWNrKEFpcjo6SW5zdCYsIHVuc2lnbmVkIGFyZ0luZGV4KSBvdmVy
cmlkZTsKKyAgICB2b2lkIHJlcG9ydFVzZWRSZWdpc3RlcnMoQWlyOjpJbnN0JiwgY29uc3QgUmVn
aXN0ZXJTZXQmKSBvdmVycmlkZTsKKyAgICBjb25zdCBSZWdpc3RlclNldCYgZXh0cmFDbG9iYmVy
ZWRSZWdzKEFpcjo6SW5zdCYpIG92ZXJyaWRlOworCisgICAgLy8gTm90ZSB0aGF0IHRoaXMgZG9l
cyBub3Qgb3ZlcnJpZGUgZ2VuZXJhdGUoKSBvciBkdW1wSW1wbCgpL2RlZXBEdW1wSW1wbCgpLiBX
ZSBoYXZlIG1hbnkgc29tZQorICAgIC8vIHN1YmNsYXNzZXMgdGhhdCBpbXBsZW1lbnQgdGhhdC4K
KworICAgIHZvaWQgZm9yRWFjaEFyZ0ltcGwoCisgICAgICAgIHVuc2lnbmVkIG51bUlnbm9yZWRC
M0FyZ3MsIHVuc2lnbmVkIG51bUlnbm9yZWRBaXJBcmdzLAorICAgICAgICBBaXI6Okluc3QmLCBj
b25zdCBTY29wZWRMYW1iZGE8QWlyOjpJbnN0OjpFYWNoQXJnQ2FsbGJhY2s+Jik7CisgICAgYm9v
bCBpc1ZhbGlkSW1wbCgKKyAgICAgICAgdW5zaWduZWQgbnVtSWdub3JlZEIzQXJncywgdW5zaWdu
ZWQgbnVtSWdub3JlZEFpckFyZ3MsCisgICAgICAgIEFpcjo6SW5zdCYpOworICAgIGJvb2wgYWRt
aXRzU3RhY2tJbXBsKAorICAgICAgICB1bnNpZ25lZCBudW1JZ25vcmVkQjNBcmdzLCB1bnNpZ25l
ZCBudW1JZ25vcmVkQWlyQXJncywKKyAgICAgICAgQWlyOjpJbnN0Jik7CisKKyAgICAvLyBHZXRz
IHRoZSByZXBzIGFycmF5IHRoZSB3YXkgdGhhdCB0aGUgc3RhY2ttYXAgZ2VuZXJhdG9yIGNhbGxi
YWNrIHdvdWxkIHdhbnQuCisgICAgVmVjdG9yPFZhbHVlUmVwPiByZXBzKEFpcjo6R2VuZXJhdGlv
bkNvbnRleHQmLCBBaXI6Okluc3QmKTsKKworICAgIC8vIEFwcGVuZHMgdGhlIHJlcHMgZm9yIHRo
ZSBJbnN0J3MgYXJncywgc3RhcnRpbmcgd2l0aCBudW1JZ25vcmVkQXJncywgdG8gdGhlIGdpdmVu
IHZlY3Rvci4KKyAgICB2b2lkIGFwcGVuZFJlcHNJbXBsKEFpcjo6R2VuZXJhdGlvbkNvbnRleHQm
LCB1bnNpZ25lZCBudW1JZ25vcmVkQXJncywgQWlyOjpJbnN0JiwgVmVjdG9yPFZhbHVlUmVwPiYp
OworCisgICAgc3RhdGljIFZhbHVlUmVwIHJlcEZvckFyZyhBaXI6OkNvZGUmLCBjb25zdCBBaXI6
OkFyZyYpOworfTsKKworfSB9IC8vIG5hbWVzcGFjZSBKU0M6OkIzCisKKyNlbmRpZiAvLyBCM1N0
YWNrbWFwU3BlY2lhbF9oCisKSW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM1N3aXRj
aENhc2UuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM1N3aXRj
aENhc2UuY3BwCShyZXZpc2lvbiAwKQorKysgU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzU3dp
dGNoQ2FzZS5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSwzOSBAQAorLyoKKyAqIENvcHly
aWdodCAoQykgMjAxNSBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVk
aXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3
aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUg
Zm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMg
b2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90
aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVy
LgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRo
ZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMg
YW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24g
YW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisg
KgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIGBgQVMgSVMnJyBB
TkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQg
Tk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJ
TElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJ
TUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJF
IExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisg
KiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9U
IExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJ
Q0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVS
UlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElU
WSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElO
Q0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBP
RiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBP
U1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLiAKKyAqLworCisjaW5jbHVkZSAiY29uZmlnLmgiCisj
aW5jbHVkZSAiQjNTd2l0Y2hDYXNlLmgiCisKKyNpbmNsdWRlICJCM0Jhc2ljQmxvY2suaCIKKwor
bmFtZXNwYWNlIEpTQyB7IG5hbWVzcGFjZSBCMyB7CisKK3ZvaWQgU3dpdGNoQ2FzZTo6ZHVtcChQ
cmludFN0cmVhbSYgb3V0KSBjb25zdAoreworICAgIG91dC5wcmludChtX2Nhc2VWYWx1ZSwgIi0+
IiwgcG9pbnRlckR1bXAobV90YXJnZXQpKTsKK30KKworfSB9IC8vIG5hbWVzcGFjZSBKU0M6OkIz
CisKSW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM1N3aXRjaENhc2UuaAo9PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNTd2l0Y2hDYXNlLmgJKHJldmlzaW9u
IDApCisrKyBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNTd2l0Y2hDYXNlLmgJKHdvcmtpbmcg
Y29weSkKQEAgLTAsMCArMSw2MyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNSBBcHBsZSBJ
bmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBp
biBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRp
b24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMK
KyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCBy
ZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29u
ZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRp
b25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAq
ICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlz
Y2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFs
cyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJ
UyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9S
IElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQor
ICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1Ig
QSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hB
TEwgQVBQTEUgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVD
VCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNF
UVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9D
VVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFU
QSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVT
RUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFD
VCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9S
IE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElT
IFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFN
QUdFLiAKKyAqLworCisjaWZuZGVmIEIzU3dpdGNoQ2FzZV9oCisjZGVmaW5lIEIzU3dpdGNoQ2Fz
ZV9oCisKKyNpbmNsdWRlIDx3dGYvU3RkTGliRXh0cmFzLmg+CisjaW5jbHVkZSA8d3RmL1ByaW50
U3RyZWFtLmg+CisKK25hbWVzcGFjZSBKU0MgeyBuYW1lc3BhY2UgQjMgeworCitjbGFzcyBCYXNp
Y0Jsb2NrOworCitjbGFzcyBTd2l0Y2hDYXNlIHsKK3B1YmxpYzoKKyAgICBTd2l0Y2hDYXNlKCkK
KyAgICB7CisgICAgfQorCisgICAgU3dpdGNoQ2FzZShpbnQ2NF90IGNhc2VWYWx1ZSwgQmFzaWNC
bG9jayogdGFyZ2V0KQorICAgICAgICA6IG1fY2FzZVZhbHVlKGNhc2VWYWx1ZSkKKyAgICAgICAg
LCBtX3RhcmdldCh0YXJnZXQpCisgICAgeworICAgIH0KKworICAgIGV4cGxpY2l0IG9wZXJhdG9y
IGJvb2woKSBjb25zdCB7IHJldHVybiAhIW1fdGFyZ2V0OyB9CisKKyAgICBpbnQ2NF90IGNhc2VW
YWx1ZSgpIGNvbnN0IHsgcmV0dXJuIG1fY2FzZVZhbHVlOyB9CisgICAgQmFzaWNCbG9jayogdGFy
Z2V0KCkgY29uc3QgeyByZXR1cm4gbV90YXJnZXQ7IH0KKworICAgIHZvaWQgZHVtcChQcmludFN0
cmVhbSYgb3V0KSBjb25zdDsKKworcHJpdmF0ZToKKyAgICBpbnQ2NF90IGNhc2VWYWx1ZTsKKyAg
ICBCYXNpY0Jsb2NrKiB0YXJnZXQ7Cit9OworCit9IH0gLy8gbmFtZXNwYWNlIEpTQzo6QjMKKwor
I2VuZGlmIC8vIEIzU3dpdGNoQ2FzZV9oCisKSW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9i
My9CM1N3aXRjaFZhbHVlLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUv
YjMvQjNTd2l0Y2hWYWx1ZS5jcHAJKHJldmlzaW9uIDApCisrKyBTb3VyY2UvSmF2YVNjcmlwdENv
cmUvYjMvQjNTd2l0Y2hWYWx1ZS5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSw2MyBAQAor
LyoKKyAqIENvcHlyaWdodCAoQykgMjAxNSBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQu
CisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jt
cywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlk
ZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRp
c3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdo
dAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2lu
ZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3Qg
cmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9m
IGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRv
Y3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0
cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMu
IGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5D
TFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9G
IE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NF
IEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUgorICogQ09O
VFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUws
IFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVE
SU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdP
T0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJV
U0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAq
IE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1Ig
VE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBB
TlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklT
RUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLiAKKyAqLworCisjaW5jbHVkZSAi
Y29uZmlnLmgiCisjaW5jbGR1ZSAiQjNTd2l0Y2hWYWx1ZS5oIgorCituYW1lc3BhY2UgSlNDIHsg
bmFtZXNwYWNlIEIzIHsKKworU3dpdGNoVmFsdWU6On5Td2l0Y2hWYWx1ZSgpCit7Cit9CisKK1N3
aXRjaENhc2UgU3dpdGNoVmFsdWU6OnJlbW92ZUNhc2UodW5zaWduZWQgaW5kZXgpCit7CisgICAg
U3dpdGNoQ2FzZSByZXN1bHQgPSBtX3N1Y2Nlc3NvcnNbaW5kZXhdOworICAgIG1fc3VjY2Vzc29y
c1tpbmRleF0gPSBtX3N1Y2Nlc3NvcnMubGFzdCgpOworICAgIG1fc3VjY2Vzc29ycy5yZW1vdmVM
YXN0KCk7CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKwordm9pZCBTd2l0Y2hWYWx1ZTo6YXBwZW5k
Q2FzZShjb25zdCBTd2l0Y2hDYXNlJiBzd2l0Y2hDYXNlKQoreworICAgIG1fc3VjY2Vzc29ycy5h
cHBlbmQobV9zdWNjZXNzb3JzLmxhc3QoKSk7CisgICAgbV9zdWNjZXNzb3JzW21fc3VjY2Vzc29y
cy5zaXplKCkgLSAyXSA9IHN3aXRjaENhc2UudGFyZ2V0KCk7CisgICAgbV92YWx1ZXMuYXBwZW5k
KHN3aXRjaENhc2UuY2FzZVZhbHVlKCkpOworfQorCit2b2lkIFN3aXRjaFZhbHVlOjpkdW1wTWV0
YShQcmludFN0cmVhbSYgb3V0KSBjb25zdAoreworICAgIC8vIFRoaXMgZGVzdHJ1Y3RpdmVseSBv
dmVycmlkZXMgQ29udHJvbFZhbHVlJ3MgZHVtcE1ldGEoKS4KKyAgICBvdXQucHJpbnQobGlzdER1
bXAoKnRoaXMpKTsKK30KKworU3dpdGNoVmFsdWU6OlN3aXRjaFZhbHVlKHVuc2lnbmVkIGluZGV4
LCBPcmlnaW4gb3JpZ2luLCBCYXNpY0Jsb2NrKiBmYWxsVGhyb3VnaCkKKyAgICA6IENvbnRyb2xW
YWx1ZShpbmRleCwgU3dpdGNoLCBvcmlnaW4pCit7CisgICAgbV9zdWNjZXNzb3JzLmFwcGVuZChm
YWxsVGhyb3VnaCk7Cit9CisKK30gfSAvLyBuYW1lc3BhY2UgSlNDOjpCMworCkluZGV4OiBTb3Vy
Y2UvSmF2YVNjcmlwdENvcmUvYjMvQjNTd2l0Y2hWYWx1ZS5oCj09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJj
ZS9KYXZhU2NyaXB0Q29yZS9iMy9CM1N3aXRjaFZhbHVlLmgJKHJldmlzaW9uIDApCisrKyBTb3Vy
Y2UvSmF2YVNjcmlwdENvcmUvYjMvQjNTd2l0Y2hWYWx1ZS5oCSh3b3JraW5nIGNvcHkpCkBAIC0w
LDAgKzEsMTIzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE1IEFwcGxlIEluYy4gQWxsIHJp
Z2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBh
bmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBl
cm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1l
dDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUg
YWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFu
ZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmlu
YXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNl
LCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGlu
IHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVk
IHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVE
IEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBX
QVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVE
IFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VM
QVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJ
TkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVD
VCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBE
QU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9G
IFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICog
UFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04g
QU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1Qg
TElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNF
KSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUs
IEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICov
CisKKyNpZm5kZWYgQjNTd2l0Y2hWYWx1ZV9oCisjZGVmaW5lIEIzU3dpdGNoVmFsdWVfaAorCisj
aW5jbHVkZSAiQjNDb250cm9sVmFsdWUuaCIKKyNpbmNsdWRlICJCM1N3aXRjaENhc2UuaCIKKwor
bmFtZXNwYWNlIEpTQyB7IG5hbWVzcGFjZSBCMyB7CisKK2NsYXNzIFN3aXRjaFZhbHVlIDogcHVi
bGljIENvbnRyb2xWYWx1ZSB7CitwdWJsaWM6CisgICAgc3RhdGljIGJvb2wgYWNjZXB0cyhPcGNv
ZGUgb3Bjb2RlKSB7IHJldHVybiBvcGNvZGUgPT0gU3dpdGNoOyB9CisKKyAgICB+U3dpdGNoVmFs
dWUoKTsKKworICAgIC8vIG51bUNhc2VWYWx1ZXMoKSArIDEgPT0gbnVtU3VjY2Vzc29ycygpLgor
ICAgIHVuc2lnbmVkIG51bUNhc2VWYWx1ZXMoKSBjb25zdCB7IHJldHVybiBtX3ZhbHVlcy5zaXpl
KCk7IH0KKworICAgIC8vIFRoZSBzdWNjZXNzb3IgZm9yIHRoaXMgY2FzZSB2YWx1ZSBpcyBhdCB0
aGUgc2FtZSBpbmRleC4KKyAgICBpbnQ2NF90IGNhc2VWYWx1ZSh1bnNpZ25lZCBpbmRleCkgY29u
c3QgeyByZXR1cm4gbV92YWx1ZXNbaV07IH0KKyAgICAKKyAgICBjb25zdCBWZWN0b3I8aW50NjRf
dD4mIGNhc2VWYWx1ZXMoKSBjb25zdCB7IHJldHVybiBtX3ZhbHVlczsgfQorCisgICAgQmFzaWNC
bG9jayogZmFsbFRocm91Z2goKSBjb25zdCB7IHJldHVybiBzdWNjZXNzb3JzKCkubGFzdCgpOyB9
CisgICAgQmFzaWNCbG9jayomIGZhbGxUaHJvdWdoKCkgeyByZXR1cm4gc3VjY2Vzc29ycygpLmxh
c3QoKTsgfQorCisgICAgdW5zaWduZWQgc2l6ZSgpIGNvbnN0IHsgcmV0dXJuIG51bUNhc2VWYWx1
ZXMoKTsgfQorICAgIFN3aXRjaENhc2UgYXQodW5zaWduZWQgaW5kZXgpIGNvbnN0CisgICAgewor
ICAgICAgICByZXR1cm4gU3dpdGNoQ2FzZShjYXNlVmFsdWUoaW5kZXgpLCBzdWNjZXNzb3IoaW5k
ZXgpKTsKKyAgICB9CisgICAgU3dpdGNoQ2FzZSBvcGVyYXRvcltdKHVuc2lnbmVkIGluZGV4KSBj
b25zdAorICAgIHsKKyAgICAgICAgcmV0dXJuIGF0KGluZGV4KTsKKyAgICB9CisKKyAgICBjbGFz
cyBpdGVyYXRvciB7CisgICAgcHVibGljOgorICAgICAgICBpdGVyYXRvcigpCisgICAgICAgICAg
ICA6IG1fc3dpdGNoKG51bGxwdHIpCisgICAgICAgICAgICAsIG1faW5kZXgoMCkKKyAgICAgICAg
eworICAgICAgICB9CisKKyAgICAgICAgaXRlcmF0b3IoU3dpdGNoVmFsdWUmIHN3aXRjaFZhbHVl
LCB1bnNpZ25lZCBpbmRleCkKKyAgICAgICAgICAgIDogbV9zd2l0Y2goJnN3aXRjaFZhbHVlKQor
ICAgICAgICAgICAgLCBtX2luZGV4KGluZGV4KQorICAgICAgICB7CisgICAgICAgIH0KKworICAg
ICAgICBTd2l0Y2hDYXNlIG9wZXJhdG9yKigpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVy
biBtX3N3aXRjaC0+YXQobV9pbmRleCk7CisgICAgICAgIH0KKworICAgICAgICBpdGVyYXRvciYg
b3BlcmF0b3IrKygpCisgICAgICAgIHsKKyAgICAgICAgICAgIG1faW5kZXgrKzsKKyAgICAgICAg
ICAgIHJldHVybiAqdGhpczsKKyAgICAgICAgfQorCisgICAgICAgIGJvb2wgb3BlcmF0b3I9PShj
b25zdCBpdGVyYXRvciYgb3RoZXIpIGNvbnN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVy
biBtX2luZGV4ID09IG90aGVyLm1faW5kZXg7CisgICAgICAgIH0KKworICAgICAgICBib29sIG9w
ZXJhdG9yIT0oY29uc3QgaXRlcmF0b3ImIG90aGVyKSBjb25zdAorICAgICAgICB7CisgICAgICAg
ICAgICByZXR1cm4gISgqdGhpcyA9PSBvdGhlcik7CisgICAgICAgIH0KKworICAgIHByaXZhdGU6
CisgICAgICAgIFN3aXRjaFZhbHVlKiBtX3N3aXRjaDsKKyAgICAgICAgdW5zaWduZWQgbV9pbmRl
eDsKKyAgICB9OworCisgICAgaXRlcmF0b3IgYmVnaW4oKSBjb25zdCB7IHJldHVybiBpdGVyYXRv
cigqdGhpcywgMCk7IH0KKyAgICBpdGVyYXRvciBlbmQoKSBjb25zdCB7IHJldHVybiBpdGVyYXRv
cigqdGhpcywgc2l6ZSgpKTsgfQorCisgICAgLy8gVGhpcyByZW1vdmVzIHRoZSBjYXNlIGFuZCBy
ZW9yZGVycyB0aGluZ3MgYSBiaXQuIElmIHlvdSdyZSBpdGVyYXRpbmcgdGhlIGNhc2VzIGZyb20g
MCB0byBOLAorICAgIC8vIHRoZW4geW91IGNhbiBrZWVwIGl0ZXJhdGluZyBhZnRlciB0aGlzIHNv
IGxvbmcgYXMgeW91IHJldmlzaXQgdGhpcyBzYW1lIGluZGV4ICh3aGljaCB3aWxsIG5vdworICAg
IC8vIGNvbnRhaW4gc29tZSBvdGhlciBjYXNlIHZhbHVlKS4gVGhpcyByZW1vdmVzIHRoZSBjYXNl
IHRoYXQgd2FzIHJlbW92ZWQuCisgICAgU3dpdGNoQ2FzZSByZW1vdmVDYXNlKHVuc2lnbmVkIGlu
ZGV4KTsKKworICAgIHZvaWQgYXBwZW5kQ2FzZShjb25zdCBTd2l0Y2hDYXNlJiBzd2l0Y2hDYXNl
KTsKKworcHJvdGVjdGVkOgorICAgIHZvaWQgZHVtcE1ldGEoUHJpbnRTdHJlYW0mKSBjb25zdCBv
dmVycmlkZTsKKworcHJpdmF0ZToKKyAgICBmcmllbmQgY2xhc3MgUHJvY2VkdXJlOworCisgICAg
U3dpdGNoVmFsdWUodW5zaWduZWQgaW5kZXgsIE9yaWdpbiBvcmlnaW4sIEJhc2ljQmxvY2sqIGZh
bGxUaHJvdWdoKTsKK307CisKK30gfSAvLyBuYW1lc3BhY2UgSlNDOjpCMworCisjZW5kaWYgLy8g
QjNTd2l0Y2hWYWx1ZV9oCisKSW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM1R5cGUu
Y3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM1R5cGUuY3BwCShy
ZXZpc2lvbiAwKQorKysgU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzVHlwZS5jcHAJKHdvcmtp
bmcgY29weSkKQEAgLTAsMCArMSw1NCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNSBBcHBs
ZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVz
ZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmlj
YXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlv
bnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVz
dCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2Yg
Y29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmli
dXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQK
KyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcg
ZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVy
aWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FS
RSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNT
IE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRI
RQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBG
T1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQg
U0hBTEwgQVBQTEUgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJ
UkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENP
TlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQ
Uk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwg
REFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBD
QVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05U
UkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNF
IE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBU
SElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0gg
REFNQUdFLiAKKyAqLworCisjaW5jbHVkZSAiY29uZmlnLmgiCisjaW5jbHVkZSAiQjNUeXBlLmgi
CisKKyNpbmNsdWRlIDx3dGYvUHJpbnRTdHJlYW0uaD4KKworbmFtZXNwYWNlIFdURiB7CisKK3Vz
aW5nIG5hbWVzcGFjZSBKU0M6OkIzOworCit2b2lkIHByaW50SW50ZXJuYWwoUHJpbnRTdHJlYW0m
IG91dCwgVHlwZSB0eXBlKQoreworICAgIHN3aXRjaCAodHlwZSkgeworICAgIGNhc2UgVm9pZDoK
KyAgICAgICAgb3V0LnByaW50KCJWb2lkIik7CisgICAgICAgIHJldHVybjsKKyAgICBjYXNlIElu
dDMyOgorICAgICAgICBvdXQucHJpbnQoIkludDMyIik7CisgICAgICAgIHJldHVybjsKKyAgICBj
YXNlIEludDY0OgorICAgICAgICBvdXQucHJpbnQoIkludDY0Iik7CisgICAgICAgIHJldHVybjsK
KyAgICBjYXNlIERvdWJsZToKKyAgICAgICAgb3V0LnByaW50KCJEb3VibGUiKTsKKyAgICAgICAg
cmV0dXJuOworICAgIH0KKyAgICBSRUxFQVNFX0FTU0VSVF9OT1RfUkVBQ0hFRCgpOworfQorCit9
IC8vIG5hbWVzcGFjZSBXVEYKSW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM1R5cGUu
aAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNUeXBlLmgJKHJldmlz
aW9uIDApCisrKyBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNUeXBlLmgJKHdvcmtpbmcgY29w
eSkKQEAgLTAsMCArMSw2OCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNSBBcHBsZSBJbmMu
IEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBz
b3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24s
IGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAq
IGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRh
aW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0
aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25z
IGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAg
IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xh
aW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBw
cm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQ
Uk9WSURFRCBCWSBBUFBMRSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElN
UExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICog
SU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQ
QVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwg
QVBQTEUgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwg
SU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVF
TlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJF
TUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwg
T1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQg
QU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwg
U1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9U
SEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNP
RlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdF
LiAKKyAqLworCisjaWZuZGVmIEIzVHlwZV9oCisjZGVmaW5lIEIzVHlwZV9oCisKKyNpbmNsdWRl
IDx3dGYvU3RkTGliRXh0cmFzLmg+CisKK25hbWVzcGFjZSBKU0MgeyBuYW1lc3BhY2UgQjMgewor
CitlbnVtIFR5cGUgeworICAgIFZvaWQsCisgICAgSW50MzIsCisgICAgSW50NjQsCisgICAgRG91
YmxlCit9OworCitpbmxpbmUgYm9vbCBpc0ludChUeXBlIHR5cGUpCit7CisgICAgcmV0dXJuIHR5
cGUgPT0gSW50MzIgfHwgdHlwZSA9PSBJbnQ2NDsKK30KKworaW5saW5lIGJvb2wgaXNGbG9hdChU
eXBlIHR5cGUpCit7CisgICAgcmV0dXJuIHR5cGUgPT0gRG91YmxlOworfQorCitpbmxpbmUgVHlw
ZSBwb2ludGVyKCkgY29uc3QKK3sKKyAgICBpZiAoc2l6ZW9mKHZvaWQqKSA9PSA0KQorICAgICAg
ICByZXR1cm4gSW50MzI7CisgICAgcmV0dXJuIEludDY0OworfQorCit9IH0gLy8gbmFtZXNwYWNl
IEpTQzo6QjMKKworbmFtZXNwYWNlIFdURiB7CisKK2NsYXNzIFByaW50U3RyZWFtOworCit2b2lk
IHByaW50SW50ZXJuYWwoUHJpbnRTdHJlYW0mLCBKU0M6OkIzOjpUeXBlKTsKKworfSAvLyBuYW1l
c3BhY2UgV1RGCisKKyNlbmRpZiAvLyBCM1R5cGVfaAorCkluZGV4OiBTb3VyY2UvSmF2YVNjcmlw
dENvcmUvYjMvQjNVcHNpbG9uVmFsdWUuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2Ny
aXB0Q29yZS9iMy9CM1Vwc2lsb25WYWx1ZS5jcHAJKHJldmlzaW9uIDApCisrKyBTb3VyY2UvSmF2
YVNjcmlwdENvcmUvYjMvQjNVcHNpbG9uVmFsdWUuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAg
KzEsNDEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTUgQXBwbGUgSW5jLiBBbGwgcmlnaHRz
IHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBi
aW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0
dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0Ogor
ICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92
ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRo
ZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkg
Zm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRo
aXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhl
CisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0
aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkg
QVBQTEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJB
TlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FS
UkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgor
ICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4g
T1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJ
TkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFH
RVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VC
U1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9G
SVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkg
VEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFC
SUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFS
SVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZF
TiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKwor
I2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgIkIzVXBzaWxvblZhbHVlLmgiCisKK25hbWVz
cGFjZSBKU0MgeyBuYW1lc3BhY2UgQjMgeworCitVcHNpbG9uVmFsdWU6On5VcHNpbG9uVmFsdWUo
KQoreworfQorCit2b2lkIFVwc2lsb25WYWx1ZTo6ZHVtcE1ldGEoUHJpbnRTdHJlYW0mIG91dCkg
Y29uc3QKK3sKKyAgICBvdXQucHJpbnQoIl4iLCBtX3BoaS0+aW5kZXgoKSk7Cit9CisKK30gfSAv
LyBuYW1lc3BhY2UgSlNDOjpCMworCkluZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNV
cHNpbG9uVmFsdWUuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNV
cHNpbG9uVmFsdWUuaAkocmV2aXNpb24gMCkKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9C
M1Vwc2lsb25WYWx1ZS5oCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsNjAgQEAKKy8qCisgKiBD
b3B5cmlnaHQgKEMpIDIwMTUgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAq
IFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGgg
b3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQg
dGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRp
b25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAg
IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xh
aW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVj
ZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRp
b25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0
aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9u
LgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFTIElT
JycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywg
QlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFO
VEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElT
Q0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IKKyAqIENPTlRSSUJVVE9S
UyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFM
LAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVU
IE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBT
RVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJ
TlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFC
SUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAq
IChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBP
VVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRI
RSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKworI2lmbmRlZiBCM1Vwc2lsb25W
YWx1ZV9oCisjZGVmaW5lIEIzVXBzaWxvblZhbHVlX2gKKworI2luY2x1ZGUgIkIzVmFsdWUuaCIK
KworbmFtZXNwYWNlIEpTQyB7IG5hbWVzcGFjZSBCMyB7CisKK2NsYXNzIFVwc2lsb25WYWx1ZSA6
IHB1YmxpYyBWYWx1ZSB7CitwdWJsaWM6CisgICAgc3RhdGljIGJvb2wgYWNjZXB0cyhPcGNvZGUg
b3Bjb2RlKSB7IHJldHVybiBvcGNvZGUgPT0gVXBzaWxvbjsgfQorCisgICAgflVwc2lsb25WYWx1
ZSgpOworCisgICAgVmFsdWUqIHBoaSgpIGNvbnN0IHsgcmV0dXJuIG1fcGhpOyB9CisKK3Byb3Rl
Y3RlZDoKKyAgICB2b2lkIGR1bXBNZXRhKFByaW50U3RyZWFtJikgY29uc3Qgb3ZlcnJpZGU7CisK
K3ByaXZhdGU6CisgICAgZnJpZW5kIGNsYXNzIFByb2NlZHVyZTsKKyAgICAKKyAgICBVcHNpbG9u
VmFsdWUodW5zaWduZWQgaW5kZXgsIE9yaWdpbiBvcmlnaW4sIFZhbHVlKiB2YWx1ZSwgVmFsdWUq
IHBoaSkKKyAgICAgICAgOiBWYWx1ZShpbmRleCwgUGhpLCBWb2lkLCBvcmlnaW4sIHZhbHVlKQor
ICAgICAgICAsIG1fcGhpKHBoaSkKKyAgICB7CisgICAgICAgIEFTU0VSVCh2YWx1ZS0+dHlwZSgp
ID09IHBoaS0+dHlwZSgpKTsKKyAgICB9CisKKyAgICBWYWx1ZSogbV9waGk7Cit9OworCit9IH0g
Ly8gbmFtZXNwYWNlIEpTQzo6QjMKKworI2VuZGlmIC8vIEIzVXBzaWxvblZhbHVlX2gKKwpJbmRl
eDogU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzVmFsdWUuY3BwCj09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNv
dXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM1ZhbHVlLmNwcAkocmV2aXNpb24gMCkKKysrIFNvdXJj
ZS9KYXZhU2NyaXB0Q29yZS9iMy9CM1ZhbHVlLmNwcAkod29ya2luZyBjb3B5KQpAQCAtMCwwICsx
LDE2OSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNSBBcHBsZSBJbmMuIEFsbCByaWdodHMg
cmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJp
bmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0
ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6Cisg
KiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3Zl
IGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhl
IGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBm
b3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhp
cyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUK
KyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRo
IHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBB
UFBMRSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFO
VElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJS
QU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisg
KiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBP
UgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElO
Q0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdF
UyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJT
VElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJ
VFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBU
SEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJ
TElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJ
U0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVO
IElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLiAKKyAqLworCisj
aW5jbHVkZSAiY29uZmlnLmgiCisjaW5jbHVkZSAiQjNWYWx1ZS5oIgorCituYW1lc3BhY2UgSlND
IHsgbmFtZXNwYWNlIEIzIHsKKworVmFsdWU6On5WYWx1ZSgpCit7Cit9CisKK3ZvaWQgVmFsdWU6
OnJlcGxhY2VXaXRoSWRlbnRpdHkoVmFsdWUqIHZhbHVlKQoreworICAgIC8vIFRoaXMgaXMgYSBi
aXQgY3JhenkuIEl0IGRvZXMgYW4gaW4tcGxhY2UgcmVwbGFjZW1lbnQgb2Ygd2hhdGV2ZXIgVmFs
dWUgc3ViY2xhc3MgdGhpcyBpcyB3aXRoCisgICAgLy8gYSBwbGFpbiBJZGVudGl0eSBWYWx1ZS4g
V2UgZmlyc3QgY29sbGVjdCBhbGwgb2YgdGhlIGluZm9ybWF0aW9uIHdlIG5lZWQsIHRoZW4gd2Ug
ZGVzdHJ1Y3QgdGhlCisgICAgLy8gcHJldmlvdXMgdmFsdWUgaW4gcGxhY2UsIGFuZCB0aGVuIHdl
IGNvbnN0cnVjdCB0aGUgSWRlbnRpdHkgVmFsdWUgaW4gcGxhY2UuCisKKyAgICB1bnNpZ25lZCBp
bmRleCA9IG1faW5kZXg7CisgICAgVHlwZSB0eXBlID0gbV90eXBlOworICAgIE9yaWdpbiBvcmln
aW4gPSBtX29yaWdpbjsKKyAgICBCYXNpY0Jsb2NrKiBvd25lciA9IHRoaXMtPm93bmVyOworICAg
IFZhbHVlKiByZXBsYWNlbWVudCA9IHRoaXMtPnJlcGxhY2VtZW50OworICAgIHZvaWQqIG1pc2Mg
PSB0aGlzLT5taXNjOworCisgICAgUkVMRUFTRV9BU1NFUlQodHlwZSA9PSB2YWx1ZS0+dHlwZSgp
KTsKKworICAgIHRoaXMtPlZhbHVlOjp+VmFsdWUoKTsKKworICAgIG5ldyAodGhpcykgKGluZGV4
LCBJZGVudGlmeSwgdHlwZSwgb3JpZ2luLCB2YWx1ZSk7CisKKyAgICB0aGlzLT5vd25lciA9IG93
bmVyOworICAgIHRoaXMtPnJlcGxhY2VtZW50ID0gcmVwbGFjZW1lbnQ7CisgICAgdGhpcy0+bWlz
YyA9IG1pc2M7Cit9CisKK3ZvaWQgVmFsdWU6OmR1bXAoUHJpbnRTdHJlYW0mIG91dCkgY29uc3QK
K3sKKyAgICBvdXQucHJpbnQoZHVtcFByZWZpeCwgbV9pbmRleCk7Cit9CisKK3ZvaWQgVmFsdWU6
OmRlZXBEdW1wKFByaW50U3RyZWFtJiBvdXQpIGNvbnN0Cit7CisgICAgb3V0LnByaW50KG1fdHlw
ZSwgIiAiLCAqdGhpcywgIiA9ICIsIG1fb3Bjb2RlKTsKKworICAgIG91dC5wcmludCgiKCIpOwor
ICAgIENvbW1hUHJpbnRlciBjb21tYTsKKyAgICBmb3IgKFZhbHVlKiBjaGlsZCA6IGNoaWxkcmVu
KCkpCisgICAgICAgIG91dC5wcmludChjb21tYSwgcG9pbnRlckR1bXAoY2hpbGQpKTsKKworICAg
IFN0cmluZ1ByaW50U3RyZWFtIHN0cmluZ091dDsKKyAgICBkdW1wTWV0YShzdHJpbmdPdXQpOwor
ICAgIENTdHJpbmcgc3RyaW5nID0gc3RyaW5nT3V0LnRvQ1N0cmluZygpOworICAgIGlmIChzdHJp
bmcubGVuZ3RoKCkpCisgICAgICAgIG91dC5wcmludChjb21tYSwgc3RyaW5nKTsKKworICAgIG91
dC5wcmludCgiKSIpOworfQorCitib29sIFZhbHVlOjpoYXNJbnQzMigpIGNvbnN0Cit7CisgICAg
cmV0dXJuIGZhbHNlOworfQorCitpbnQzMl90IFZhbHVlOjphc0ludDMyKCkgY29uc3QKK3sKKyAg
ICBSRUxFQVNFX0FTU0VSVF9OT1RfUkVBQ0hFRCgpOworICAgIHJldHVybiAwOworfQorCitib29s
IFZhbHVlOjpoYXNJbnQ2NCgpIGNvbnN0Cit7CisgICAgcmV0dXJuIGZhbHNlOworfQorCitpbnQ2
NF90IFZhbHVlOjphc0ludDY0KCkgY29uc3QKK3sKKyAgICBSRUxFQVNFX0FTU0VSVF9OT1RfUkVB
Q0hFRCgpOworICAgIHJldHVybiAwOworfQorCitib29sIFZhbHVlOjpoYXNEb3VibGUoKSBjb25z
dAoreworICAgIHJldHVybiBmYWxzZTsKK30KKworZG91YmxlIFZhbHVlOjphc0RvdWJsZSgpIGNv
bnN0Cit7CisgICAgUkVMRUFTRV9BU1NFUlRfTk9UX1JFQUNIRUQoKTsKKyAgICByZXR1cm4gMDsK
K30KKwordm9pZCBWYWx1ZTo6ZHVtcE1ldGEoUHJpbnRTdHJlYW0mKSBjb25zdAoreworfQorCitU
eXBlIFZhbHVlOjp0eXBlRm9yKE9wY29kZSBvcGNvZGUsIFZhbHVlKiBmaXJzdENoaWxkKQorewor
ICAgIHN3aXRjaCAob3Bjb2RlKSB7CisgICAgY2FzZSBJZGVudGl0eToKKyAgICBjYXNlIEFkZDoK
KyAgICBjYXNlIFN1YjoKKyAgICBjYXNlIE11bDoKKyAgICBjYXNlIERpdjoKKyAgICBjYXNlIENo
aWxsRGl2OgorICAgIGNhc2UgTW9kOgorICAgIGNhc2UgQml0QW5kOgorICAgIGNhc2UgQml0T3I6
CisgICAgY2FzZSBCaXRYb3I6CisgICAgY2FzZSBTaGw6CisgICAgY2FzZSBTU2hyOgorICAgIGNh
c2UgWlNocjoKKyAgICBjYXNlIENoZWNrQWRkOgorICAgIGNhc2UgQ2hlY2tTdWI6CisgICAgY2Fz
ZSBDaGVja011bDoKKyAgICAgICAgcmV0dXJuIGZpcnN0Q2hpbGQtPnR5cGUoKTsKKyAgICBjYXNl
IEZyYW1lUG9pbnRlcjoKKyAgICAgICAgcmV0dXJuIHBvaW50ZXIoKTsKKyAgICBjYXNlIFNFeHQ4
OgorICAgIGNhc2UgU0V4dDE2OgorICAgIGNhc2UgRFRvSTMyOgorICAgIGNhc2UgRXF1YWw6Cisg
ICAgY2FzZSBOb3RFcXVhbDoKKyAgICBjYXNlIExlc3NUaGFuOgorICAgIGNhc2UgR3JlYXRlclRo
YW46CisgICAgY2FzZSBMZXNzRXF1YWw6CisgICAgY2FzZSBHcmVhdGVyRXF1YWw6CisgICAgY2Fz
ZSBBYm92ZToKKyAgICBjYXNlIEJlbG93OgorICAgIGNhc2UgQWJvdmVFcXVhbDoKKyAgICBjYXNl
IEJlbG93RXF1YWw6CisgICAgICAgIHJldHVybiBJbnQzMjsKKyAgICBjYXNlIFNFeHQzMjoKKyAg
ICBjYXNlIFpFeHQzMjoKKyAgICAgICAgcmV0dXJuIEludDY0OworICAgIGNhc2UgRlJvdW5kOgor
ICAgIGNhc2UgSVRvRDoKKyAgICAgICAgcmV0dXJuIERvdWJsZTsKKyAgICBjYXNlIE5vcDoKKyAg
ICAgICAgcmV0dXJuIFZvaWQ7CisgICAgZGVmYXVsdDoKKyAgICAgICAgUkVMRUFTRV9BU1NFUlRf
Tk9UX1JFQUNIRUQoKTsKKyAgICB9Cit9CisKK30gfSAvLyBuYW1lc3BhY2UgSlNDOjpCMworCklu
ZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNWYWx1ZS5oCj09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNv
dXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM1ZhbHVlLmgJKHJldmlzaW9uIDApCisrKyBTb3VyY2Uv
SmF2YVNjcmlwdENvcmUvYjMvQjNWYWx1ZS5oCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsMTk1
IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE1IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNl
cnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5
IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBw
cm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEu
IFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29w
eXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9s
bG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0g
bXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxp
c3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICog
ICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhl
IGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExF
IElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVT
LCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJ
RVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBV
UlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SCisg
KiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURF
TlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJ
TkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRV
VEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsg
T1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9S
WQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZ
LCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5H
IElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYg
QURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisKKyNpZm5k
ZWYgQjNWYWx1ZV9oCisjZGVmaW5lIEIzVmFsdWVfaAorCisjaW5jbHVkZSAiQjNPcmlnaW4uaCIK
KyNpbmNsdWRlICJCM1R5cGUuaCIKKyNpbmNsdWRlIDx3dGYvRmFzdE1hbGxvYy5oPgorI2luY2x1
ZGUgPHd0Zi9Ob25jb3B5YWJsZS5oPgorCituYW1lc3BhY2UgSlNDIHsgbmFtZXNwYWNlIEIzIHsK
KworY2xhc3MgVmFsdWUgeworICAgIFdURl9NQUtFX05PTkNPUFlBQkxFKFZhbHVlKTsKKyAgICBX
VEZfTUFLRV9GQVNUX0FMTE9DQVRFRDsKK3B1YmxpYzoKKyAgICB0eXBlZGVmIFZlY3RvcjxWYWx1
ZSosIDM+IEFkamFjZW5jeUxpc3Q7CisKKyAgICBzdGF0aWMgY29uc3QgY2hhciogZHVtcFByZWZp
eCA9ICJAIjsKKworICAgIHN0YXRpYyBib29sIGFjY2VwdHMoT3Bjb2RlKSB7IHJldHVybiB0cnVl
OyB9CisKKyAgICB2aXJ0dWFsIH5WYWx1ZSgpOworCisgICAgdW5zaWduZWQgaW5kZXgoKSBjb25z
dCB7IHJldHVybiBtX2luZGV4OyB9CisgICAgCisgICAgLy8gTm90ZSB0aGF0IHRoZSBvcGNvZGUg
aXMgaW1tdXRhYmxlLCBleGNlcHQgZm9yIHJlcGxhY2luZyB2YWx1ZXMgd2l0aCBpZGVudGl0eS4K
KyAgICBPcGNvZGUgb3Bjb2RlKCkgY29uc3QgeyByZXR1cm4gbV9vcGNvZGU7IH0KKworICAgIE9y
aWdpbiBvcmlnaW4oKSBjb25zdCB7IHJldHVybiBtX29yaWdpbjsgfQorICAgIAorICAgIFZhbHVl
KiYgY2hpbGQodW5zaWduZWQgaW5kZXgpIHsgcmV0dXJuIG1fY2hpbGRyZW5baW5kZXhdOyB9Cisg
ICAgVmFsdWUqIGNoaWxkKHVuc2lnbmVkIGluZGV4KSBjb25zdCB7IHJldHVybiBtX2NoaWxkcmVu
W2luZGV4XTsgfQorCisgICAgLy8gVGhpcyBjb21wdXRlcyB0aGUgdHlwZSB1c2luZyB0aGUgb3Bj
b2RlLgorICAgIFR5cGUgdHlwZSgpIGNvbnN0IHsgcmV0dXJuIG1fdHlwZTsgfQorCisgICAgQWRq
YWNlbmN5TGlzdCYgY2hpbGRyZW4oKSB7IHJldHVybiBtX2NoaWxkcmVuOyB9IAorICAgIGNvbnN0
IEFkamFjZW5jeUxpc3QmIGNoaWxkcmVuKCkgY29uc3QgeyByZXR1cm4gbV9jaGlsZHJlbjsgfQor
CisgICAgdm9pZCByZXBsYWNlV2l0aElkZW50aXR5KFZhbHVlKik7CisgICAgdm9pZCByZXBsYWNl
V2l0aE5vcCgpOworCisgICAgdm9pZCBkdW1wKFByaW50U3RyZWFtJikgY29uc3Q7CisgICAgdm9p
ZCBkZWVwRHVtcChQcmludFN0cmVhbSYpIGNvbnN0OworCisgICAgLy8gVGhpcyBpcyBob3cgeW91
IGNhc3QgVmFsdWVzLiBGb3IgZXhhbXBsZSwgaWYgeW91IHdhbnQgdG8gZG8gc29tZXRoaW5nIHBy
b3ZpZGVkIHRoYXQgd2UgaGF2ZSBhCisgICAgLy8gQXJndW1lbnRSZWdWYWx1ZSwgeW91IGNhbiBk
bzoKKyAgICAvLworICAgIC8vIGlmIChBcmd1bWVudFJlZ1ZhbHVlKiBhcmd1bWVudFJlZyA9IHZh
bHVlLT5hczxBcmd1bWVudFJlZ1ZhbHVlPigpKSB7CisgICAgLy8gICAgIHRoaW5ncworICAgIC8v
IH0KKyAgICAvLworICAgIC8vIFRoaXMgd2lsbCByZXR1cm4gbnVsbCBpZiB0aGlzIG9wY29kZSgp
ICE9IEFyZ3VtZW50UmVnLiBUaGlzIHdvcmtzIGJlY2F1c2UgdGhpcyByZXR1cm5zIG51bGxwdHIK
KyAgICAvLyBpZiBUOjphY2NlcHRzKG9wY29kZSgpKSByZXR1cm5zIGZhbHNlLgorICAgIHRlbXBs
YXRlPHR5cGVuYW1lIFQ+CisgICAgVCogYXMoKTsKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgor
ICAgIGNvbnN0IFQqIGFzKCkgY29uc3Q7CisgICAgCisgICAgYm9vbCBoYXNJbnQzMigpIGNvbnN0
OworICAgIGludDMyX3QgYXNJbnQzMigpIGNvbnN0OworICAgIAorICAgIGJvb2wgaGFzSW50NjQo
KSBjb25zdDsKKyAgICBpbnQ2NF90IGFzSW50NjQoKSBjb25zdDsKKworICAgIGJvb2wgaGFzSW50
KCkgY29uc3Q7CisgICAgaW50NjRfdCBhc0ludCgpIGNvbnN0OworICAgIGJvb2wgaXNJbnQoaW50
NjRfdCB2YWx1ZSkgY29uc3Q7CisKKyAgICBib29sIGhhc0RvdWJsZSgpIGNvbnN0OworICAgIGRv
dWJsZSBhc0RvdWJsZSgpIGNvbnN0OworCisgICAgU3RhY2ttYXAqIHN0YWNrbWFwKCk7CisKK3By
b3RlY3RlZDoKKyAgICB2aXJ0dWFsIHZvaWQgZHVtcE1ldGEoUHJpbnRTdHJlYW0mKSBjb25zdDsK
KyAgICAKK3ByaXZhdGU6CisgICAgZnJpZW5kIGNsYXNzIFByb2NlZHVyZTsKKyAgICAKKyAgICAv
LyBJbnN0YW50aWF0ZSB2YWx1ZXMgdmlhIFByb2NlZHVyZS4KKyAgICAvLyBUaGlzIGZvcm0gcmVx
dWlyZXMgc3BlY2lmeWluZyB0aGUgdHlwZSBleHBsaWNpdGx5OgorICAgIHRlbXBsYXRlPHR5cGVu
YW1lLi4uIEFyZ3VtZW50cz4KKyAgICBleHBsaWNpdCBWYWx1ZSh1bnNpZ25lZCBpbmRleCwgT3Bj
b2RlIG9wY29kZSwgVHlwZSB0eXBlLCBPcmlnaW4gb3JpZ2luLCBWYWx1ZSogZmlyc3RDaGlsZCwg
QXJndW1lbnRzLi4uIGFyZ3VtZW50cykKKyAgICAgICAgOiBtX2luZGV4KGluZGV4KQorICAgICAg
ICAsIG1fb3Bjb2RlKG9wY29kZSkKKyAgICAgICAgLCBtX3R5cGUodHlwZSkKKyAgICAgICAgLCBt
X29yaWdpbihvcmlnaW4pCisgICAgICAgICwgbV9jaGlsZHJlbnsgZmlyc3RDaGlsZCwgYXJndW1l
bnRzLi4uIH0KKyAgICB7CisgICAgfQorICAgIC8vIFRoaXMgZm9ybSBpcyBmb3Igc3BlY2lmeWlu
ZyB0aGUgdHlwZSBleHBsaWNpdGx5IHdoZW4gdGhlIG9wY29kZSBoYXMgbm8gY2hpbGRyZW46Cisg
ICAgZXhwbGljaXQgVmFsdWUodW5zaWduZWQgaW5kZXgsIE9wY29kZSBvcGNvZGUsIFR5cGUgdHlw
ZSwgT3JpZ2luIG9yaWdpbikKKyAgICAgICAgOiBtX2luZGV4KGluZGV4KQorICAgICAgICAsIG1f
b3Bjb2RlKG9wY29kZSkKKyAgICAgICAgLCBtX3R5cGUodHlwZSkKKyAgICAgICAgLCBtX29yaWdp
bihvcmlnaW4pCisgICAgeworICAgIH0KKyAgICAvLyBUaGlzIGZvcm0gaXMgZm9yIHRob3NlIG9w
Y29kZXMgdGhhdCBjYW4gaW5mZXIgdGhlaXIgdHlwZSBmcm9tIHRoZSBvcGNvZGUgYW5kIGZpcnN0
IGNoaWxkOgorICAgIHRlbXBsYXRlPHR5cGVuYW1lLi4uIEFyZ3VtZW50cz4KKyAgICBleHBsaWNp
dCBWYWx1ZSh1bnNpZ25lZCBpbmRleCwgT3Bjb2RlIG9wY29kZSwgT3JpZ2luIG9yaWdpbiwgVmFs
dWUqIGZpcnN0Q2hpbGQsIEFyZ3VtZW50cy4uLiBhcmd1bWVudHMpCisgICAgICAgIDogbV9pbmRl
eChpbmRleCkKKyAgICAgICAgLCBtX29wY29kZShvcGNvZGUpCisgICAgICAgICwgbV90eXBlKHR5
cGVGb3Iob3Bjb2RlLCBmaXJzdENoaWxkKSkKKyAgICAgICAgLCBtX29yaWdpbihvcmlnaW4pCisg
ICAgICAgICwgbV9jaGlsZHJlbnsgZmlyc3RDaGlsZCwgYXJndW1lbnRzLi4uIH0KKyAgICB7Cisg
ICAgfQorICAgIC8vIFRoaXMgZm9ybSBpcyBmb3IgdGhvc2Ugb3Bjb2RlcyB0aGF0IGNhbiBpbmZl
ciB0aGVpciB0eXBlIGZyb20gdGhlIG9wY29kZSBhbG9uZSwgYW5kIHRoYXQgZG9uJ3QKKyAgICAv
LyB0YWtlIGFueSBhcmd1bWVudHM6CisgICAgZXhwbGljaXQgVmFsdWUodW5zaWduZWQgaW5kZXgs
IE9wY29kZSBvcGNvZGUsIE9yaWdpbiBvcmlnaW4pCisgICAgICAgIDogbV9pbmRleChpbmRleCkK
KyAgICAgICAgLCBtX29wY29kZShvcGNvZGUpCisgICAgICAgICwgbV90eXBlKHR5cGVGb3Iob3Bj
b2RlLCBudWxscHRyKSkKKyAgICAgICAgLCBtX29yaWdpbihvcmlnaW4pCisgICAgeworICAgIH0K
KyAgICAvLyBVc2UgdGhpcyBmb3JtIGZvciB2YXJhcmdzLgorICAgIGV4cGljaXQgVmFsdWUodW5z
aWduZWQgaW5kZXgsIE9wY29kZSBvcGNvZGUsIFR5cGUgdHlwZSwgT3JpZ2luIG9yaWdpbiwgY29u
c3QgQWRqYWNlbmN5TGlzdCYgY2hpbGRyZW4pCisgICAgICAgIDogbV9pbmRleChpbmRleCkKKyAg
ICAgICAgLCBtX29wY29kZShvcGNvZGUpCisgICAgICAgICwgbV90eXBlKHR5cGUpCisgICAgICAg
ICwgbV9vcmlnaW4ob3JpZ2luKQorICAgICAgICAsIG1fY2hpbGRyZW4oY2hpbGRyZW4pCisgICAg
eworICAgIH0KKworICAgIHN0YXRpYyBUeXBlIHR5cGVGb3IoT3Bjb2RlLCBWYWx1ZSogZmlyc3RD
aGlsZCk7CisKKyAgICAvLyBUaGlzIGdyb3VwIG9mIGZpZWxkcyBpcyBhcnJhbmdlZCB0byBmaXQg
aW4gNjQgYml0cy4KKyAgICB1bnNpZ25lZCBtX2luZGV4OworICAgIE9wY29kZSBtX29wY29kZTsK
KyAgICBUeXBlIG1fdHlwZTsKKyAgICAKKyAgICBPcmlnaW4gbV9vcmlnaW47CisgICAgQWRqYWNl
bmN5TGlzdCBtX2NoaWxkcmVuOworCitwdWJsaWM6CisgICAgQmFzaWNCbG9jayogb3duZXIgeyBu
dWxscHRyIH07IC8vIGNvbXB1dGVkIGxhemlseS4KKyAgICBWYWx1ZSogcmVwbGFjZW1lbnQgeyBu
dWxscHRyIH07IC8vIHVzZWQgZm9yIGFuYWx5c2VzIGFuZCB0cmFuc2Zvcm1hdGlvbnMuCit9Owor
CitjbGFzcyBEZWVwVmFsdWVEdW1wIHsKK3B1YmxpYzoKKyAgICBEZWVwVmFsdWVEdW1wKFZhbHVl
KiB2YWx1ZSkKKyAgICAgICAgOiBtX3ZhbHVlKHZhbHVlKQorICAgIHsKKyAgICB9CisKKyAgICB2
b2lkIGR1bXAoUHJpbnRTdHJlYW0mIG91dCkgY29uc3QKKyAgICB7CisgICAgICAgIGlmIChtX3Zh
bHVlKQorICAgICAgICAgICAgbV92YWx1ZS0+ZGVlcER1bXAob3V0KTsKKyAgICAgICAgZWxzZQor
ICAgICAgICAgICAgb3V0LnByaW50KCI8bnVsbD4iKTsKKyAgICB9CisKK3ByaXZhdGU6CisgICAg
VmFsdWUqIG1fdmFsdWU7Cit9OworCitEZWVwVmFsdWVEdW1wIGRlZXBEdW1wKFZhbHVlKiB2YWx1
ZSkKK3sKKyAgICByZXR1cm4gRGVlcFZhbHVlRHVtcCh2YWx1ZSk7Cit9CisKK30gfSAvLyBuYW1l
c3BhY2UgSlNDOjpCMworCisjZW5kaWYgLy8gQjNWYWx1ZV9oCisKSW5kZXg6IFNvdXJjZS9KYXZh
U2NyaXB0Q29yZS9iMy9CM1ZhbHVlSW5saW5lcy5oCj09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZh
U2NyaXB0Q29yZS9iMy9CM1ZhbHVlSW5saW5lcy5oCShyZXZpc2lvbiAwKQorKysgU291cmNlL0ph
dmFTY3JpcHRDb3JlL2IzL0IzVmFsdWVJbmxpbmVzLmgJKHdvcmtpbmcgY29weSkKQEAgLTAsMCAr
MSwxMDkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTUgQXBwbGUgSW5jLiBBbGwgcmlnaHRz
IHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBi
aW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0
dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0Ogor
ICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92
ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRo
ZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkg
Zm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRo
aXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhl
CisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0
aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkg
QVBQTEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJB
TlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FS
UkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgor
ICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4g
T1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJ
TkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFH
RVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VC
U1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9G
SVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkg
VEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFC
SUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFS
SVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZF
TiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKwor
I2lmbmRlZiBCM1ZhbHVlSW5saW5lc19oCisjZGVmaW5lIEIzVmFsdWVJbmxpbmVzX2gKKworI2lu
Y2x1ZGUgIkIzQ2hlY2tWYWx1ZS5oIgorI2luY2x1ZGUgIkIzQ29uc3QzMlZhbHVlLmgiCisjaW5j
bHVkZSAiQjNDb25zdDY0VmFsdWUuaCIKKyNpbmNsdWRlICJCM0NvbnN0RG91YmxlVmFsdWUuaCIK
KyNpbmNsdWRlICJCM1BhdGNocG9pbnRWYWx1ZS5oIgorI2luY2x1ZGUgIkIzVmFsdWUuaCIKKwor
bmFtZXNwYWNlIEpTQyB7IG5hbWVzcGFjZSBCMyB7CisKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+CitU
KiBWYWx1ZTo6YXMoKQoreworICAgIGlmIChUOjphY2NlcHRzKG9wY29kZSgpKSkKKyAgICAgICAg
cmV0dXJuIHN0YXRpY19jYXN0PFQqPih0aGlzKTsKKyAgICByZXR1cm4gbnVsbHB0cjsKK30KKwor
dGVtcGxhdGU+dHlwZW5hbWUgVD4KK2NvbnN0IFQqIFZhbHVlOjphcygpIGNvbnN0Cit7CisgICAg
cmV0dXJuIGNvbnN0X2Nhc3Q8VmFsdWUqPih0aGlzKS0+YXM8VD4oKTsKK30KKworYm9vbCBWYWx1
ZTo6aGFzSW50MzIoKSBjb25zdAoreworICAgIHJldHVybiAhIWFzPENvbnN0MzJWYWx1ZT4oKTsK
K30KKworaW50MzJfdCBWYWx1ZTo6YXNJbnQzMigpIGNvbnN0Cit7CisgICAgcmV0dXJuIGFzPENv
bnN0MzJWYWx1ZT4oKS0+dmFsdWUoKTsKK30KKworYm9vbCBWYWx1ZTo6aGFzSW50NjQoKSBjb25z
dAoreworICAgIHJldHVybiAhIWFzPENvbnN0NjRWYWx1ZT4oKTsKK30KKworaW50NjRfdCBWYWx1
ZTo6YXNJbnQ2NCgpIGNvbnN0Cit7CisgICAgcmV0dXJuIGFzPENvbnN0NjRWYWx1ZT4oKS0+dmFs
dWUoKTsKK30KKworYm9vbCBWYWx1ZTo6aGFzSW50KCkgY29uc3QKK3sKKyAgICByZXR1cm4gaGFz
SW50MzIoKSB8fCBoYXNJbnQ2NCgpOworfQorCitpbnQ2NF90IFZhbHVlOjphc0ludCgpIGNvbnN0
Cit7CisgICAgcmV0dXJuIGhhc0ludDMyKCkgPyBhc0ludDMyKCkgOiBhc0ludDY0KCk7Cit9CisK
K2Jvb2wgVmFsdWU6OmlzSW50KGludDY0X3QgdmFsdWUpIGNvbnN0Cit7CisgICAgcmV0dXJuIGhh
c0ludCgpICYmIGFzSW50KCkgPT0gdmFsdWU7Cit9CisKK2Jvb2wgVmFsdWU6Omhhc0RvdWJsZSgp
IGNvbnN0Cit7CisgICAgcmV0dXJuICEhYXM8Q29uc3REb3VibGVWYWx1ZT4oKTsKK30KKworZG91
YmxlIFZhbHVlOjphc0RvdWJsZSgpIGNvbnN0Cit7CisgICAgcmV0dXJuIGFzPENvbnN0RG91Ymxl
VmFsdWU+KCktPnZhbHVlKCk7Cit9CisKK1N0YWNrbWFwKiBWYWx1ZTo6c3RhY2ttYXAoKQorewor
ICAgIGlmIChDaGVja1ZhbHVlKiBjaGVjayA9IGFzPENoZWNrVmFsdWU+KCkpCisgICAgICAgIHJl
dHVybiAmY2hlY2stPnN0YWNrbWFwOworICAgIGlmIChQYXRjaHBvaW50VmFsdWUqIHBhdGNocG9p
bnQgPSBhczxQYXRjaHBvaW50VmFsdWU+KCkpCisgICAgICAgIHJldHVybiAmcGF0Y2hwb2ludC0+
c3RhY2ttYXA7CisgICAgcmV0dXJuIG51bGxwdHI7Cit9CisKK30gfSAvLyBuYW1lc3BhY2UgSlND
OjpCMworCisjZW5kaWYgLy8gQjNWYWx1ZUlubGluZXNfaAorCkluZGV4OiBTb3VyY2UvSmF2YVNj
cmlwdENvcmUvYjMvQjNWYWx1ZVJlcC5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL0phdmFTY3Jp
cHRDb3JlL2IzL0IzVmFsdWVSZXAuY3BwCShyZXZpc2lvbiAwKQorKysgU291cmNlL0phdmFTY3Jp
cHRDb3JlL2IzL0IzVmFsdWVSZXAuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsODYgQEAK
Ky8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTUgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVk
LgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9y
bXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3Zp
ZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVk
aXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmln
aHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dp
bmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0
IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBv
ZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBk
b2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlz
dHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5D
LiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElO
Q0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBP
RiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9T
RSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IKKyAqIENP
TlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFM
LCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xV
RElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBH
T09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBC
VVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisg
KiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9S
IFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4g
QU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJ
U0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKworI2luY2x1ZGUg
ImNvbmZpZy5oIgorI2luY2x1ZGUgIkIzVmFsdWVSZXAuaCIKKworbmFtZXNwYWNlIEpTQyB7IG5h
bWVzcGFjZSBCMyB7CisKK3ZvaWQgVmFsdWVSZXA6OmR1bXAoUHJpbnRTdHJlYW0mIG91dCkgY29u
c3QKK3sKKyAgICBvdXQucHJpbnQobV9raW5kKTsKKyAgICBzd2l0Y2ggKG1fa2luZCkgeworICAg
IGNhc2UgTm9uZToKKyAgICBjYXNlIFNvbWVSZWdpc3RlcjoKKyAgICAgICAgcmV0dXJuOworICAg
IGNhc2UgUmVnaXN0ZXI6CisgICAgICAgIG91dC5wcmludCgiKCIsIHJlZygpLCAiKSIpOworICAg
ICAgICByZXR1cm47CisgICAgY2FzZSBTdGFjazoKKyAgICAgICAgb3V0LnByaW50KCIoIiwgb2Zm
c2V0RnJvbUZQKCksICIpIik7CisgICAgICAgIHJldHVybjsKKyAgICBjYXNlIFN0YWNrQXJndW1l
bnQ6CisgICAgICAgIG91dC5wcmludCgiKCIsIG9mZnNldEZyb21TUCgpLCAiKSIpOworICAgICAg
ICByZXR1cm47CisgICAgY2FzZSBDb25zdGFudDoKKyAgICAgICAgb3V0LnByaW50KCIoIiwgdmFs
dWUoKSwgIikiKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBSRUxFQVNFX0FTU0VSVF9O
T1RfUkVBQ0hFRCgpOworfQorCit9IH0gLy8gbmFtZXNwYWNlIEpTQzo6QjMKKworbmFtZXNwYWNl
IFdURiB7CisKK3VzaW5nIG5hbWVzcGFjZSBKU0M6OkIzOworCit2b2lkIHByaW50SW50ZXJuYWwo
UHJpbnRTdHJlYW0mIG91dCwgVmFsdWVSZXA6OktpbmQga2luZCkKK3sKKyAgICBzd2l0Y2ggKGtp
bmQpIHsKKyAgICBjYXNlIFZhbHVlUmVwOjpBbnk6CisgICAgICAgIG91dC5wcmludCgiQW55Iik7
CisgICAgICAgIHJldHVybjsKKyAgICBjYXNlIFZhbHVlUmVwOjpTb21lUmVnaXN0ZXI6CisgICAg
ICAgIG91dC5wcmludCgiU29tZVJlZ2lzdGVyIik7CisgICAgICAgIHJldHVybjsKKyAgICBjYXNl
IFZhbHVlUmVwOjpSZWdpc3RlcjoKKyAgICAgICAgb3V0LnByaW50KCJSZWdpc3RlciIpOworICAg
ICAgICByZXR1cm47CisgICAgY2FzZSBWYWx1ZVJlcDo6U3RhY2s6CisgICAgICAgIG91dC5wcmlu
dCgiU3RhY2siKTsKKyAgICAgICAgcmV0dXJuOworICAgIGNhc2UgVmFsdWVSZXA6OlN0YWNrQXJn
dW1lbnQ6CisgICAgICAgIG91dC5wcmludCgiU3RhY2tBcmd1bWVudCIpOworICAgICAgICByZXR1
cm47CisgICAgY2FzZSBWYWx1ZVJlcDo6Q29uc3RhbnQ6CisgICAgICAgIG91dC5wcmludCgiQ29u
c3RhbnQiKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBSRUxFQVNFX0FTU0VSVF9OT1Rf
UkVBQ0hFRCgpOworfQorCit9IC8vIG5hbWVzcGFjZSBXVEYKKwpJbmRleDogU291cmNlL0phdmFT
Y3JpcHRDb3JlL2IzL0IzVmFsdWVSZXAuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlw
dENvcmUvYjMvQjNWYWx1ZVJlcC5oCShyZXZpc2lvbiAwKQorKysgU291cmNlL0phdmFTY3JpcHRD
b3JlL2IzL0IzVmFsdWVSZXAuaAkod29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDE1OCBAQAorLyoK
KyAqIENvcHlyaWdodCAoQykgMjAxNSBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisg
KgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywg
d2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQg
dGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3Ry
aWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAor
ICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBk
aXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVw
cm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNv
bmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3Vt
ZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmli
dXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIGBg
QVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVE
SU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1F
UkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFS
RSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUgorICogQ09OVFJJ
QlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQ
RUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5H
LCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RT
IE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lO
RVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9G
IExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9S
VAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkg
V0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQg
T0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLiAKKyAqLworCisjaWZuZGVmIEIzVmFs
dWVSZXBfaAorI2RlZmluZSBCM1ZhbHVlUmVwX2gKKworI2luY2x1ZGUgIlJlZy5oIgorI2luY2x1
ZGUgPHd0Zi9QcmludFN0cmVhbS5oPgorCituYW1lc3BhY2UgSlNDIHsgbmFtZXNwYWNlIEIzIHsK
KworLy8gV2UgdXNlIHRoaXMgY2xhc3MgdG8gZGVzY3JpYmUgdmFsdWUgcmVwcmVzZW50YXRpb25z
IGF0IHN0YWNrbWFwcy4gSXQncyB1c2VkIGJvdGggdG8gZm9yY2UgYQorLy8gcmVwcmVzZW50YXRp
b24gYW5kIHRvIGdldCB0aGUgcmVwcmVzZW50YXRpb24uIFdoZW4gdGhlIEIzIGNsaWVudCBmb3Jj
ZXMgYSByZXByZXNlbnRhdGlvbiwgd2Ugc2F5CisvLyB0aGF0IGl0J3MgYW4gaW5wdXQuIFdoZW4g
QjMgdGVsbHMgdGhlIGNsaWVudCB3aGF0IHJlcHJlc2VudGF0aW9uIGl0IHBpY2tlZCwgd2Ugc2F5
IHRoYXQgaXQncyBhbgorLy8gb3V0cHV0LgorCitjbGFzcyBWYWx1ZVJlcCB7CitwdWJsaWM6Cisg
ICAgZW51bSBLaW5kIHsKKyAgICAgICAgLy8gQXMgYW4gaW5wdXQgcmVwcmVzZW50YXRpb24sIHRo
aXMgbWVhbnMgdGhhdCBCMyBjYW4gcGljayBhbnkgcmVwcmVzZW50YXRpb24uIEFzIGFuCisgICAg
ICAgIC8vIG91dHB1dCByZXByZXNlbnRhdGlvbiwgdGhpcyBtZWFucyB0aGF0IHdlIGRvbid0IGtu
b3cuIFRoaXMgd2lsbCBvbmx5IGFyaXNlIGZvciB0aGUKKyAgICAgICAgLy8gcmlnaHQgb3BlcmFu
ZCAoaS5lLiBjaGlsZCgxKSkgb2YgYSBDaGVja011bC4KKyAgICAgICAgQW55LAorCisgICAgICAg
IC8vIEFzIGFuIGlucHV0IHJlcHJlc2VudGF0aW9uLCB0aGlzIG1lYW5zIHRoYXQgQjMgc2hvdWxk
IHBpY2sgc29tZSByZWdpc3Rlci4gSXQgY291bGQgYmUgYQorICAgICAgICAvLyByZWdpc3RlciB0
aGF0IHRoaXMgY2xhaW1zIHRvIGNsb2JiZXIhCisgICAgICAgIFNvbWVSZWdpc3RlciwKKworICAg
ICAgICAvLyBBcyBhbiBpbnB1dCByZXByZXNlbnRhdGlvbiwgdGhpcyBmb3JjZXMgYSBwYXJ0aWN1
bGFyIHJlZ2lzdGVyLiBBcyBhbiBvdXRwdXQKKyAgICAgICAgLy8gcmVwcmVzZW50YXRpb24sIHRo
aXMgdGVsbHMgdXMgd2hhdCByZWdpc3RlciBCMyBwaWNrZWQuCisgICAgICAgIFJlZ2lzdGVyLAor
CisgICAgICAgIC8vIEFzIGFuIG91dHB1dCByZXByZXNlbnRhdGlvbiwgdGhpcyB0ZWxscyB1cyB3
aGF0IHN0YWNrIHNsb3QgQjMgcGlja2VkLiBJdCdzIG5vdCBhIHZhbGlkCisgICAgICAgIC8vIGlu
cHV0IHJlcHJlc2VudGF0aW9uLgorICAgICAgICBTdGFjaywKKworICAgICAgICAvLyBBcyBhbiBp
bnB1dCByZXByZXNlbnRhdGlvbiwgdGhpcyBmb3JjZXMgdGhlIHZhbHVlIHRvIGVuZCB1cCBpbiB0
aGUgYXJndW1lbnQgYXJlYSBhdCBzb21lCisgICAgICAgIC8vIG9mZnNldC4KKyAgICAgICAgU3Rh
Y2tBcmd1bWVudCwKKworICAgICAgICAvLyBBcyBhbiBvdXRwdXQgcmVwcmVzZW50YXRpb24sIHRo
aXMgdGVsbHMgdXMgdGhhdCBCMyBjb25zdGFudC1mb2xkZWQgdGhlIHZhbHVlLgorICAgICAgICBD
b25zdGFudAorICAgIH07CisgICAgCisgICAgVmFsdWVSZXAoKQorICAgICAgICA6IG1fa2luZChB
bnkpCisgICAgeworICAgIH0KKworICAgIGV4cGxpY2l0IFZhbHVlUmVwKFJlZyByZWcpCisgICAg
ICAgIDogbV9raW5kKFJlZ2lzdGVyKQorICAgICAgICAsIG1fdmFsdWUocmVnLmluZGV4KCkpCisg
ICAgeworICAgIH0KKworICAgIHN0YXRpYyBWYWx1ZVJlcCByZWcoUmVnIHJlZykKKyAgICB7Cisg
ICAgICAgIHJldHVybiBWYWx1ZVJlcChyZWcpOworICAgIH0KKworICAgIHN0YXRpYyBWYWx1ZVJl
cCBzdGFjayhpbnRwdHJfdCBvZmZzZXRGcm9tRlApCisgICAgeworICAgICAgICBWYWx1ZVJlcCBy
ZXN1bHQ7CisgICAgICAgIHJlc3VsdC5tX2tpbmQgPSBTdGFjazsKKyAgICAgICAgcmVzdWx0Lm1f
dmFsdWUgPSBvZmZzZXRGcm9tRlA7CisgICAgfQorCisgICAgc3RhdGljIFZhbHVlUmVwIHN0YWNr
QXJndW1lbnQoaW50cHRyX3Qgb2Zmc2V0RnJvbVNQKQorICAgIHsKKyAgICAgICAgVmFsdWVSZXAg
cmVzdWx0OworICAgICAgICByZXN1bHQubV9raW5kID0gU3RhY2tBcmd1bWVudDsKKyAgICAgICAg
cmVzdWx0Lm1fdmFsdWUgPSBvZmZzZXRGcm9tU1A7CisgICAgfQorCisgICAgc3RhdGljIFZhbHVl
UmVwIGNvbnN0YW50KGludDY0X3QgdmFsdWUpCisgICAgeworICAgICAgICBWYWx1ZVJlcCByZXN1
bHQ7CisgICAgICAgIHJlc3VsdC5tX2tpbmQgPSBDb25zdGFudDsKKyAgICAgICAgcmVzdWx0Lm1f
dmFsdWUgPSB2YWx1ZTsKKyAgICB9CisKKyAgICBzdGF0aWMgVmFsdWVSZXAgY29uc3RhbnREb3Vi
bGUoZG91YmxlIHZhbHVlKQorICAgIHsKKyAgICAgICAgcmV0dXJuIFZhbHVlUmVwKGJpdHdpc2Vf
Y2FzdDxpbnQ2NF90Pih2YWx1ZSkpOworICAgIH0KKworICAgIEtpbmQga2luZCgpIGNvbnN0IHsg
cmV0dXJuIG1fa2luZDsgfQorCisgICAgZXhwbGljaXQgb3BlcmF0b3IgYm9vbCgpIGNvbnN0IHsg
cmV0dXJuIGtpbmQoKSAhPSBBbnk7IH0KKworICAgIFJlZyByZWcoKSBjb25zdAorICAgIHsKKyAg
ICAgICAgQVNTRVJUKGtpbmQoKSA9PSBSZWdpc3Rlcik7CisgICAgICAgIHJldHVybiBSZWc6OmZy
b21JbmRleChtX3ZhbHVlKTsKKyAgICB9CisKKyAgICBpbnRwdHJfdCBvZmZzZXRGcm9tRlAoKSBj
b25zdAorICAgIHsKKyAgICAgICAgQVNTRVJUKGtpbmQoKSA9PSBTdGFjayk7CisgICAgICAgIHJl
dHVybiBzdGF0aWNfY2FzdDxpbnRwdHJfdD4obV92YWx1ZSk7CisgICAgfQorCisgICAgaW50cHRy
X3Qgb2Zmc2V0RnJvbVNQKCkgY29uc3QKKyAgICB7CisgICAgICAgIEFTU0VSVChraW5kKCkgPT0g
U3RhY2tBcmd1bWVudCk7CisgICAgICAgIHJldHVybiBzdGF0aWNfY2FzdDxpbnRwdHJfdD4obV92
YWx1ZSk7CisgICAgfQorCisgICAgaW50NjRfdCB2YWx1ZSgpIGNvbnN0CisgICAgeworICAgICAg
ICBBU1NFUlQoa2luZCgpID09IENvbnN0YW50KTsKKyAgICAgICAgcmV0dXJuIG1fdmFsdWU7Cisg
ICAgfQorCisgICAgZG91YmxlIGRvdWJsZVZhbHVlKCkgY29uc3QKKyAgICB7CisgICAgICAgIHJl
dHVybiBiaXR3aXNlX2Nhc3Q8ZG91YmxlPih2YWx1ZSgpKTsKKyAgICB9CisKKyAgICB2b2lkIGR1
bXAoUHJpbnRTdHJlYW0mKSBjb25zdDsKKworcHJpdmF0ZToKKyAgICBLaW5kIG1fa2luZDsKKyAg
ICBpbnQ2NF90IG1fdmFsdWU7Cit9OworCit9IH0gLy8gbmFtZXNwYWNlIEpTQzo6QjMKKworbmFt
ZXNwYWNlIFdURiB7CisKK3ZvaWQgcHJpbnRJbnRlcm5hbChQcmludFN0cmVhbSYsIEpTQzo6QjM6
OlZhbHVlUmVwOjpLaW5kKTsKKworfSAvLyBuYW1lc3BhY2UgV1RGCisKKyNlbmRpZiAvLyBCM1Zh
bHVlUmVwX2gKKwpJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL2dlbmVyYXRlX3BhdHRl
cm5fbWF0Y2hlci5yYgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvZ2Vu
ZXJhdGVfcGF0dGVybl9tYXRjaGVyLnJiCShyZXZpc2lvbiAwKQorKysgU291cmNlL0phdmFTY3Jp
cHRDb3JlL2IzL2dlbmVyYXRlX3BhdHRlcm5fbWF0Y2hlci5yYgkod29ya2luZyBjb3B5KQpAQCAt
MCwwICsxLDQ5MyBAQAorIyEvdXNyL2Jpbi9lbnYgcnVieQorCisjIENvcHlyaWdodCAoQykgMjAx
NSBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisjCisjIFJlZGlzdHJpYnV0aW9uIGFu
ZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorIyBtb2Rp
ZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRp
dGlvbnMKKyMgYXJlIG1ldDoKKyMgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11
c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyMgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2Yg
Y29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorIyAyLiBSZWRpc3RyaWJ1
dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAor
IyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRp
c2NsYWltZXIgaW4gdGhlCisjICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFs
cyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisjCisjIFRISVMgU09GVFdBUkUgSVMg
UFJPVklERUQgQlkgQVBQTEUgSU5DLiBBTkQgSVRTIENPTlRSSUJVVE9SUyBgYEFTIElTJycKKyMg
QU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9U
IExJTUlURUQgVE8sCisjIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZ
IEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyMgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4g
SU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUiBJVFMgQ09OVFJJQlVUT1JTCisjIEJFIExJ
QUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1Q
TEFSWSwgT1IKKyMgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElN
SVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKKyMgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsg
TE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTCisjIElOVEVSUlVQVElP
TikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVS
IElOCisjIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVH
TElHRU5DRSBPUiBPVEhFUldJU0UpCisjIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVT
RSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YKKyMgVEhFIFBPU1NJQklMSVRZ
IE9GIFNVQ0ggREFNQUdFLgorCityZXF1aXJlICJwYXRobmFtZSIKKworJHZhckluZGV4ID0gMAor
ZGVmIG5ld1ZhcgorICAgICR2YXJJbmRleCArPSAxCisgICAgIl90bXAjeyR2YXJJbmRleH0iCitl
bmQKKworY2xhc3MgUHJvZHVjdGlvbgorICAgIGF0dHJfcmVhZGVyIDpvcmlnaW4sIDpuYW1lLCA6
dmFyTmFtZSwgOmFub255bW91cywgOm9wY29kZSwgOmNoaWxkcmVuCisKKyAgICBkZWYgaW5pdGlh
bGl6ZShvcmlnaW4sIG5hbWUsIG9wY29kZSwgY2hpbGRyZW4pCisgICAgICAgIEBvcmlnaW4gPSBv
cmlnaW4KKyAgICAgICAgQG5hbWUgPSBuYW1lCisgICAgICAgIEBhbm9ueW1vdXMgPSAobmFtZSA9
PSBuaWwgb3IgbmFtZSA9fiAvXEFcJChbMC05XSspXFovKQorICAgICAgICBAdmFyTmFtZSA9IEBh
bm9ueW1vdXMgPyBuZXdWYXIgOiBuYW1lCisgICAgICAgIEBvcGNvZGUgPSBvcGNvZGUKKyAgICAg
ICAgQGNoaWxkcmVuID0gY2hpbGRyZW4gPyBjaGlsZHJlbiA6IFtdCisgICAgZW5kCisKKyAgICBk
ZWYgaGFzT3Bjb2RlCisgICAgICAgIG9wY29kZSAhPSBuaWwKKyAgICBlbmQKKworICAgIGRlZiBl
YWNoVmFyaWFibGUoJnByb2MpCisgICAgICAgIGNoaWxkcmVuLmVhY2hfd2l0aF9pbmRleCB7Cisg
ICAgICAgICAgICB8IGNoaWxkLCBpbmRleCB8CisgICAgICAgICAgICB5aWVsZCB2YXJOYW1lLAor
ICAgICAgICAgICAgICAgICAgY2hpbGQubmFtZSwKKyAgICAgICAgICAgICAgICAgIGNoaWxkLnZh
ck5hbWUsCisgICAgICAgICAgICAgICAgICBjaGlsZC5hbm9ueW1vdXMgPyAoY2hpbGQub3Bjb2Rl
ID8gOmFub25JbnRlcm5hbCA6IDphbm9uT3BlcmFuZCkgOiAoY2hpbGQub3Bjb2RlID8gOmludGVy
bmFsIDogOm9wZXJhbmQpLAorICAgICAgICAgICAgICAgICAgaW5kZXgKKyAgICAgICAgICAgIGNo
aWxkLmVhY2hWYXJpYWJsZSgmcHJvYykKKyAgICAgICAgfQorICAgIGVuZAorZW5kCisKK2NsYXNz
IE1hdGNoZXIKKyAgICBhdHRyX3JlYWRlciA6bmFtZSwgOnByb2R1Y3Rpb25zCisKKyAgICBkZWYg
aW5pdGlhbGl6ZShuYW1lLCBwcm9kdWN0aW9ucykKKyAgICAgICAgQG5hbWUgPSBuYW1lCisgICAg
ICAgIEBwcm9kdWN0aW9ucyA9IHByb2R1Y3Rpb25zCisgICAgZW5kCitlbmQKKworY2xhc3MgT3Jp
Z2luCisgICAgYXR0cl9yZWFkZXIgOmZpbGVOYW1lLCA6bGluZU51bWJlcgorICAgIAorICAgIGRl
ZiBpbml0aWFsaXplKGZpbGVOYW1lLCBsaW5lTnVtYmVyKQorICAgICAgICBAZmlsZU5hbWUgPSBm
aWxlTmFtZQorICAgICAgICBAbGluZU51bWJlciA9IGxpbmVOdW1iZXIKKyAgICBlbmQKKyAgICAK
KyAgICBkZWYgdG9fcworICAgICAgICAiI3tmaWxlTmFtZX06I3tsaW5lTnVtYmVyfSIKKyAgICBl
bmQKK2VuZAorCitjbGFzcyBUb2tlbgorICAgIGF0dHJfcmVhZGVyIDpvcmlnaW4sIDpzdHJpbmcK
KyAgICAKKyAgICBkZWYgaW5pdGlhbGl6ZShvcmlnaW4sIHN0cmluZykKKyAgICAgICAgQG9yaWdp
biA9IG9yaWdpbgorICAgICAgICBAc3RyaW5nID0gc3RyaW5nCisgICAgZW5kCisgICAgCisgICAg
ZGVmID09KG90aGVyKQorICAgICAgICBpZiBvdGhlci5pc19hPyBUb2tlbgorICAgICAgICAgICAg
QHN0cmluZyA9PSBvdGhlci5zdHJpbmcKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgQHN0cmlu
ZyA9PSBvdGhlcgorICAgICAgICBlbmQKKyAgICBlbmQKKyAgICAKKyAgICBkZWYgPX4ob3RoZXIp
CisgICAgICAgIEBzdHJpbmcgPX4gb3RoZXIKKyAgICBlbmQKKyAgICAKKyAgICBkZWYgdG9fcwor
ICAgICAgICAiI3tAc3RyaW5nLmluc3BlY3R9IGF0ICN7b3JpZ2lufSIKKyAgICBlbmQKKyAgICAK
KyAgICBkZWYgcGFyc2VFcnJvcigqY29tbWVudCkKKyAgICAgICAgaWYgY29tbWVudC5lbXB0eT8K
KyAgICAgICAgICAgIHJhaXNlICJQYXJzZSBlcnJvcjogI3t0b19zfSIKKyAgICAgICAgZWxzZQor
ICAgICAgICAgICAgcmFpc2UgIlBhcnNlIGVycm9yOiAje3RvX3N9OiAje2NvbW1lbnRbMF19Igor
ICAgICAgICBlbmQKKyAgICBlbmQKK2VuZAorCitkZWYgbGV4KHN0ciwgZmlsZU5hbWUpCisgICAg
ZmlsZU5hbWUgPSBQYXRobmFtZS5uZXcoZmlsZU5hbWUpCisgICAgcmVzdWx0ID0gW10KKyAgICBs
aW5lTnVtYmVyID0gMQorICAgIHdoaWxlIG5vdCBzdHIuZW1wdHk/CisgICAgICAgIGNhc2Ugc3Ry
CisgICAgICAgIHdoZW4gL1xBXCMoW15cbl0qKS8KKyAgICAgICAgICAgICMgY29tbWVudCwgaWdu
b3JlCisgICAgICAgIHdoZW4gL1xBXG4vCisgICAgICAgICAgICAjIG5ld2xpbmUsIGlnbm9yZQor
ICAgICAgICAgICAgbGluZU51bWJlciArPSAxCisgICAgICAgIHdoZW4gL1xBW2EtekEtWjAtOSRd
KFthLXpBLVowLTlfXSopLworICAgICAgICAgICAgcmVzdWx0IDw8IFRva2VuLm5ldyhPcmlnaW4u
bmV3KGZpbGVOYW1lLCBsaW5lTnVtYmVyKSwgJCYpCisgICAgICAgIHdoZW4gL1xBKFsgXHRccl0r
KS8KKyAgICAgICAgICAgICMgd2hpdGVzcGFjZSwgaWdub3JlCisgICAgICAgIHdoZW4gL1xBWz0o
KSxdLworICAgICAgICAgICAgcmVzdWx0IDw8IFRva2VuLm5ldyhPcmlnaW4ubmV3KGZpbGVOYW1l
LCBsaW5lTnVtYmVyKSwgJCYpCisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHJhaXNlICJMZXhl
ciBlcnJvciBhdCAje09yaWdpbi5uZXcoZmlsZU5hbWUsIGxpbmVOdW1iZXIpLnRvX3N9LCB1bmV4
cGVjdGVkIHNlcXVlbmNlICN7c3RyWzAuLjIwXS5pbnNwZWN0fSIKKyAgICAgICAgZW5kCisgICAg
ICAgIHN0ciA9ICR+LnBvc3RfbWF0Y2gKKyAgICBlbmQKKyAgICByZXN1bHQKK2VuZAorCitkZWYg
aXNLZXl3b3JkKHRva2VuKQorICAgICMgV2UgY2FuIGV4dGVuZCB0aGlzIGFzIHdlIGFkZCBtb3Jl
IGtleXdvcmRzLiBMaWtlLCB3ZSBtaWdodCB3YW50ICJpbmNsdWRlIiBldmVudHVhbGx5LgorICAg
IHRva2VuID1+IC9cQSgobWF0Y2hlcikpXFovCitlbmQKKworZGVmIGlzSWRlbnRpZmllcih0b2tl
bikKKyAgICB0b2tlbiA9fiAvXEFbYS16QS1aMC05JF0oW2EtekEtWjAtOV9dKilcWi8gYW5kIG5v
dCBpc0tleXdvcmQodG9rZW4pCitlbmQKKworY2xhc3MgUGFyc2VyCisgICAgZGVmIGluaXRpYWxp
emUoZGF0YSwgZmlsZU5hbWUpCisgICAgICAgIEB0b2tlbnMgPSBsZXgoZGF0YSwgZmlsZU5hbWUp
CisgICAgICAgIEBpZHggPSAwCisgICAgZW5kCisKKyAgICBkZWYgdG9rZW4KKyAgICAgICAgQHRv
a2Vuc1tAaWR4XQorICAgIGVuZAorCisgICAgZGVmIGFkdmFuY2UKKyAgICAgICAgQGlkeCArPSAx
CisgICAgZW5kCisKKyAgICBkZWYgcGFyc2VFcnJvcigqY29tbWVudCkKKyAgICAgICAgaWYgdG9r
ZW4KKyAgICAgICAgICAgIHRva2VuLnBhcnNlRXJyb3IoKmNvbW1lbnQpCisgICAgICAgIGVsc2UK
KyAgICAgICAgICAgIGlmIGNvbW1lbnQuZW1wdHk/CisgICAgICAgICAgICAgICAgcmFpc2UgIlBh
cnNlIGVycm9yIGF0IGVuZCBvZiBmaWxlIgorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAg
ICAgIHJhaXNlICJQYXJzZSBlcnJvciBhdCBlbmQgb2YgZmlsZTogI3tjb21tZW50WzBdfSIKKyAg
ICAgICAgICAgIGVuZAorICAgICAgICBlbmQKKyAgICBlbmQKKworICAgIGRlZiBjb25zdW1lKHN0
cmluZykKKyAgICAgICAgcGFyc2VFcnJvcigiRXhwZWN0ZWQgI3tzdHJpbmd9IikgdW5sZXNzIHRv
a2VuID09IHN0cmluZworICAgICAgICBhZHZhbmNlCisgICAgZW5kCisKKyAgICBkZWYgY29uc3Vt
ZUlkZW50aWZpZXIKKyAgICAgICAgcmVzdWx0ID0gdG9rZW4uc3RyaW5nCisgICAgICAgIHBhcnNl
RXJyb3IoIkV4cGVjdGVkIGlkZW50aWZpZXIiKSB1bmxlc3MgaXNJZGVudGlmaWVyKHJlc3VsdCkK
KyAgICAgICAgYWR2YW5jZQorICAgICAgICByZXN1bHQKKyAgICBlbmQKKworICAgIGRlZiBhZGRV
bmlxdWUobmFtZSwgcHJvZHVjdGlvbnMsIHByb2R1Y3Rpb24pCisgICAgICAgIGlmIG5hbWUgPT0g
cHJvZHVjdGlvbi52YXJOYW1lCisgICAgICAgICAgICBwYXJzZUVycm9yKCJDaGlsZCBwcm9kdWN0
aW9uIGhhcyBzYW1lIG5hbWUgYXMgcGFyZW50IHByb2R1Y3Rpb24iKQorICAgICAgICBlbmQKKyAg
ICAgICAgaWYgcHJvZHVjdGlvbnMuZGV0ZWN0IHsgfCBlbnRyeSB8IGVudHJ5Lm5hbWUgPT0gcHJv
ZHVjdGlvbi5uYW1lIH0KKyAgICAgICAgICAgIHBhcnNlRXJyb3IoIkR1cGxpY2F0ZSBwcm9kdWN0
aW9uIikKKyAgICAgICAgZW5kCisgICAgICAgIHByb2R1Y3Rpb25zIDw8IHByb2R1Y3Rpb24KKyAg
ICBlbmQKKworICAgIGRlZiBwYXJzZQorICAgICAgICBjb25zdW1lKCJtYXRjaGVyIikKKworICAg
ICAgICBtYXRjaGVyTmFtZSA9IGNvbnN1bWVJZGVudGlmaWVyCisKKyAgICAgICAgcHJvZHVjdGlv
bnMgPSBbXQorCisgICAgICAgIGxvb3AgeworICAgICAgICAgICAgYnJlYWsgaWYgQGlkeCA+PSBA
dG9rZW5zLmxlbmd0aAorCisgICAgICAgICAgICAjIFdlIG1pZ2h0IHdhbnQgdG8gc3VwcG9ydCAi
aW5jbHVkZSIuIElmIHdlIGRpZCB0aGF0LCBpdCB3b3VsZCBnbyBoZXJlLgorICAgICAgICAgICAg
cHJvZHVjdGlvbiA9IHBhcnNlUHJvZHVjdGlvbgorICAgICAgICAgICAgCisgICAgICAgICAgICBp
ZiBwcm9kdWN0aW9ucy5kZXRlY3QgeyB8IGVudHJ5IHwgZW50cnkubmFtZSA9PSBwcm9kdWN0aW9u
Lm5hbWUgfQorICAgICAgICAgICAgICAgIHBhcnNlRXJyb3IoIkR1cGxpY2F0ZSBwcm9kdWN0aW9u
IikKKyAgICAgICAgICAgIGVuZAorCisgICAgICAgICAgICBwcm9kdWN0aW9ucyA8PCBwcm9kdWN0
aW9uCisgICAgICAgIH0KKworICAgICAgICBNYXRjaGVyLm5ldyhtYXRjaGVyTmFtZSwgcHJvZHVj
dGlvbnMpCisgICAgZW5kCisKKyAgICBkZWYgcGFyc2VQcm9kdWN0aW9uCisgICAgICAgIG9yaWdp
biA9IHRva2VuLm9yaWdpbgorICAgICAgICBuYW1lID0gY29uc3VtZUlkZW50aWZpZXIKKworICAg
ICAgICBpZiB0b2tlbiA9PSAiPSIKKyAgICAgICAgICAgIGNvbnN1bWUoIj0iKQorICAgICAgICAg
ICAgb3Bjb2RlID0gY29uc3VtZUlkZW50aWZpZXIKKyAgICAgICAgICAgIGNvbnN1bWUoIigiKQor
ICAgICAgICBlbHNpZiB0b2tlbiA9PSAiKCIKKyAgICAgICAgICAgIGNvbnN1bWUoIigiKQorICAg
ICAgICAgICAgb3Bjb2RlID0gbmFtZQorICAgICAgICAgICAgbmFtZSA9IG5pbAorICAgICAgICBl
bHNlCisgICAgICAgICAgICByZXR1cm4gUHJvZHVjdGlvbi5uZXcob3JpZ2luLCBuYW1lLCBuaWws
IG5pbCkKKyAgICAgICAgZW5kCisgICAgICAgIAorICAgICAgICBwcm9kdWN0aW9ucyA9IFtdCisg
ICAgICAgIGxvb3AgeworICAgICAgICAgICAgYnJlYWsgaWYgdG9rZW4gPT0gIikiCisKKyAgICAg
ICAgICAgIGFkZFVuaXF1ZShuYW1lLCBwcm9kdWN0aW9ucywgcGFyc2VQcm9kdWN0aW9uKQorCisg
ICAgICAgICAgICBicmVhayBpZiB0b2tlbiA9PSAiKSIKKyAgICAgICAgICAgIGNvbnN1bWUoIiwi
KQorICAgICAgICB9CisKKyAgICAgICAgIyBBZHZhbmNlIGFmdGVyIHRoZSAiKSIKKyAgICAgICAg
YWR2YW5jZQorCisgICAgICAgIFByb2R1Y3Rpb24ubmV3KG9yaWdpbiwgbmFtZSwgb3Bjb2RlLCBw
cm9kdWN0aW9ucykKKyAgICBlbmQKK2VuZAorCitmaWxlTmFtZSA9IEFSR1ZbMF0KKworcGFyc2Vy
ID0gUGFyc2VyLm5ldyhJTzo6cmVhZChmaWxlTmFtZSksIGZpbGVOYW1lKQorbWF0Y2hlciA9IHBh
cnNlci5wYXJzZQorCitjbGFzcyBTdWJNYXRjaAorICAgIGF0dHJfcmVhZGVyIDppbmRleE1hcCwg
OnByb2R1Y3Rpb25zCisgICAgCisgICAgZGVmIGluaXRpYWxpemUoaW5kZXhMaXN0LCBwcm9kdWN0
aW9ucykKKyAgICAgICAgQGluZGV4TWFwID0gW10KKyAgICAgICAgQHByb2R1Y3Rpb25zID0gW10K
KyAgICAgICAgaW5kZXhMaXN0LmVhY2ggeworICAgICAgICAgICAgfCBpbmRleCB8CisgICAgICAg
ICAgICBAaW5kZXhNYXAgPDwgaW5kZXgKKyAgICAgICAgICAgIEBwcm9kdWN0aW9ucyA8PCBwcm9k
dWN0aW9uc1tpbmRleF0KKyAgICAgICAgfQorICAgIGVuZAorCisgICAgZGVmIG1hcEluZGV4TGlz
dChpbmRleExpc3QpCisgICAgICAgIGluZGV4TGlzdC5tYXAgeworICAgICAgICAgICAgfCBpbmRl
eCB8CisgICAgICAgICAgICBAaW5kZXhNYXBbaW5kZXhdCisgICAgICAgIH0KKyAgICBlbmQKK2Vu
ZAorCitGaWxlLm9wZW4oIkIzIiArIG1hdGNoZXIubmFtZSArICIuaCIsICJ3IikgeworICAgIHwg
b3V0cCB8CisKKyAgICBvdXRwLnB1dHMgIi8vIEdlbmVyYXRlZCBieSBnZW5lcmF0ZV9wYXR0ZXJu
X21hdGNoZXIucmIgZnJvbSAje2ZpbGVOYW1lfSAtLSBkbyBub3QgZWRpdCEiCisKKyAgICBvdXRw
LnB1dHMgIiNpZm5kZWYgQjMje21hdGNoZXIubmFtZX1faCIKKyAgICBvdXRwLnB1dHMgIiNkZWZp
bmUgQjMje21hdGNoZXIubmFtZX1faCIKKyAgICAKKyAgICBvdXRwLnB1dHMgIiNpbmNsdWRlIFwi
QjNWYWx1ZS5oXCIiCisgICAgCisgICAgb3V0cC5wdXRzICJuYW1lc3BhY2UgSlNDIHsgbmFtZXNw
YWNlIEIzIHsiCisKKyAgICBvdXRwLnB1dHMgInRlbXBsYXRlPHR5cGVuYW1lIEFkYXB0b3I+Igor
ICAgIG91dHAucHV0cyAidm9pZCBydW4je21hdGNoZXIubmFtZX0oVmFsdWUqIF92YWx1ZSwgQWRh
cHRvciYgYWRhcHRvcikiCisgICAgb3V0cC5wdXRzICJ7IgorCisgICAgIyBOb3RlIHRoYXQgdGhp
cyBkb2VzIG5vdCBlbWl0IHByb3Blcmx5IGluZGVudGVkIGNvZGUsIGJlY2F1c2UgaXQncyBhIHJl
Y3Vyc2l2ZSBlbWl0dGVyLiBJZiB5b3UKKyAgICAjIHdhbnQgdG8gc2VlIHRoZSBjb2RlIG5pY2Vs
eSBmb3JtYXR0ZWQsIG9wZW4gaXQgaW4gYSBnb29kIHRleHQgZWRpdG9yIGFuZCBhc2sgaXQgdG8g
Zm9ybWF0IGl0CisgICAgIyBmb3IgeW91LgorCisgICAgIyBJbiBvZGQgc2l0dWF0aW9ucywgd2Ug
bWF5IG5vdCB1c2UgdGhlIGlucHV0IHZhbHVlLiBUZWxsIHRoZSBjb21waWxlciB0byBjaGlsbCBv
dXQgYWJvdXQgaXQuCisgICAgb3V0cC5wdXRzICJVTlVTRURfUEFSQU0oX3ZhbHVlKTsiCisgICAg
ICAgIAorICAgICMgVGhpcyBqdXN0IHByb3RlY3RzIHRoZSBjYWxsZXIgZnJvbSBoYXZpbmcgdG8g
d29ycnkgYWJvdXQgcHJvZHVjdGlvbnMgaGF2aW5nIGRpZmZlcmVudCBsZW5ndGhzLgorICAgIGRl
ZiBtYXRjaExlbmd0aChvdXRwLCB2YWx1ZU5hbWUsIHByb2R1Y3Rpb25zKQorICAgICAgICBpbmRl
eExpc3RzID0gW10KKyAgICAgICAgcHJvZHVjdGlvbnMuZWFjaF93aXRoX2luZGV4IHsKKyAgICAg
ICAgICAgIHwgcHJvZHVjdGlvbiwgaW5kZXggfAorICAgICAgICAgICAgaWYgaW5kZXhMaXN0c1st
MV0gYW5kIHByb2R1Y3Rpb25zW2luZGV4TGlzdHNbLTFdWzBdXS5jaGlsZHJlbi5sZW5ndGggPT0g
cHJvZHVjdGlvbi5jaGlsZHJlbi5sZW5ndGgKKyAgICAgICAgICAgICAgICBpbmRleExpc3RzWy0x
XSA8PCBpbmRleAorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIGluZGV4TGlzdHMg
PDwgW2luZGV4XQorICAgICAgICAgICAgZW5kCisgICAgICAgIH0KKworICAgICAgICBpbmRleExp
c3RzLmVhY2ggeworICAgICAgICAgICAgfCBpbmRleExpc3QgfAorICAgICAgICAgICAgbGVuZ3Ro
ID0gcHJvZHVjdGlvbnNbaW5kZXhMaXN0WzBdXS5jaGlsZHJlbi5sZW5ndGgKKyAgICAgICAgICAg
IGlmIGxlbmd0aCA+IDAKKyAgICAgICAgICAgICAgICBvdXRwLnB1dHMgImlmICgje3ZhbHVlTmFt
ZX0tPmNoaWxkcmVuLnNpemUoKSA+PSAje2xlbmd0aH0pIHsiCisgICAgICAgICAgICAgICAgeWll
bGQgaW5kZXhMaXN0CisgICAgICAgICAgICAgICAgb3V0cC5wdXRzICJ9IgorICAgICAgICAgICAg
ZWxzZQorICAgICAgICAgICAgICAgIHlpZWxkIGluZGV4TGlzdAorICAgICAgICAgICAgZW5kCisg
ICAgICAgIH0KKyAgICBlbmQKKworICAgICMgVGhpcyBlZmZpY2llbnRseSBzZWxlY3RzIGZyb20g
dGhlIGdpdmVuIHNldCBvZiBwcm9kdWN0aW9ucy4gSXQgYXNzdW1lcyB0aGF0IHByb2R1Y3Rpb25z
CisgICAgIyBhcmUgbm90IGR1cGxpY2F0ZWQuIEl0IHlpZWxkcyB0aGUgaW5kZXggb2YgdGhlIGZv
dW5kIHByb2R1Y3Rpb24sIGFuZCB0aGUgY29yb3V0aW5lIGlzCisgICAgIyByZXNwb25zaWJsZSBm
b3IgZW1pdHRpbmcgc3BlY2lmaWMgY29kZSBmb3IgdGhhdCBwcm9kdWN0aW9uLiBUaGUgY29yb3V0
aW5lIGlzIGdpdmVuIGxpc3RzIG9mCisgICAgIyBpbmRpY2VzIG9mIHBvc3NpYmx5LW1hdGNoaW5n
IHByb2R1Y3Rpb25zLgorICAgIGRlZiBtYXRjaFByb2R1Y3Rpb25zKG91dHAsIHZhbHVlTmFtZSwg
cHJvZHVjdGlvbnMpCisgICAgICAgICMgRmlyc3QsIHNwbGl0IHRoZSBwcm9kdWN0aW9ucyBsaXN0
IGludG8gcnVucyBvZiBwcm9kdWN0aW9ucyB3aXRoIGFuIG9wY29kZSBhbmQgcHJvZHVjdGlvbnMK
KyAgICAgICAgIyB3aXRob3V0IG9uZS4KKyAgICAgICAgaW5kZXhMaXN0cyA9IFtdCisgICAgICAg
IHByb2R1Y3Rpb25zLmVhY2hfd2l0aF9pbmRleCB7CisgICAgICAgICAgICB8IHByb2R1Y3Rpb24s
IGluZGV4IHwKKyAgICAgICAgICAgIGlmIGluZGV4TGlzdHNbLTFdIGFuZCBwcm9kdWN0aW9uc1tp
bmRleExpc3RzWy0xXVswXV0uaGFzT3Bjb2RlID09IHByb2R1Y3Rpb24uaGFzT3Bjb2RlCisgICAg
ICAgICAgICAgICAgaW5kZXhMaXN0c1stMV0gPDwgaW5kZXgKKyAgICAgICAgICAgIGVsc2UKKyAg
ICAgICAgICAgICAgICBpbmRleExpc3RzIDw8IFtpbmRleF0KKyAgICAgICAgICAgIGVuZAorICAg
ICAgICB9CisgICAgICAgIAorICAgICAgICAjIE5vdywgZW1pdCBwYXR0ZXJuIG1hdGNoaW5nIGNv
ZGUuIFdlIGRvIGl0IGRpZmZlcmVudGx5IGZvciBsaXN0cyB3aXRoIGFuIG9wY29kZSB0aGFuIGZv
cgorICAgICAgICAjIGxpc3RzIHdpdGhvdXQgb25lLgorICAgICAgICBpbmRleExpc3RzLmVhY2gg
eworICAgICAgICAgICAgfCBpbmRleExpc3QgfAorICAgICAgICAgICAgaWYgcHJvZHVjdGlvbnNb
aW5kZXhMaXN0WzBdXS5oYXNPcGNvZGUKKyAgICAgICAgICAgICAgICAjIE5vdywgd2Ugc3BsaXQg
dGhpcyBpbmRleCBsaXN0IGludG8gZ3JvdXBzIGZvciBlYWNoIG9wY29kZS4KKyAgICAgICAgICAg
ICAgICBncm91cHMgPSB7fQorICAgICAgICAgICAgICAgIGluZGV4TGlzdC5lYWNoIHsKKyAgICAg
ICAgICAgICAgICAgICAgfCBpbmRleCB8CisgICAgICAgICAgICAgICAgICAgIHByb2R1Y3Rpb24g
PSBwcm9kdWN0aW9uc1tpbmRleF0KKyAgICAgICAgICAgICAgICAgICAgaWYgZ3JvdXBzW3Byb2R1
Y3Rpb24ub3Bjb2RlXQorICAgICAgICAgICAgICAgICAgICAgICAgZ3JvdXBzW3Byb2R1Y3Rpb24u
b3Bjb2RlXSA8PCBpbmRleAorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAg
ICAgICAgICAgICBncm91cHNbcHJvZHVjdGlvbi5vcGNvZGVdID0gW2luZGV4XQorICAgICAgICAg
ICAgICAgICAgICBlbmQKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAjIEVt
aXQgYSBzd2l0Y2ggc3RhdGVtZW50LgorICAgICAgICAgICAgICAgIG91dHAucHV0cyAic3dpdGNo
ICgje3ZhbHVlTmFtZX0tPm9wY29kZSgpKSB7IgorICAgICAgICAgICAgICAgIGdyb3Vwcy5lYWNo
X3BhaXIgeworICAgICAgICAgICAgICAgICAgICB8IG9wY29kZSwgc3ViSW5kZXhMaXN0IHwKKyAg
ICAgICAgICAgICAgICAgICAgb3V0cC5wdXRzICJjYXNlICN7b3Bjb2RlfToiCisgICAgICAgICAg
ICAgICAgICAgIHN1Yk1hdGNoID0gU3ViTWF0Y2gubmV3KHN1YkluZGV4TGlzdCwgcHJvZHVjdGlv
bnMpCisgICAgICAgICAgICAgICAgICAgIG1hdGNoTGVuZ3RoKG91dHAsIHZhbHVlTmFtZSwgc3Vi
TWF0Y2gucHJvZHVjdGlvbnMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHwgaW5kZXhMaXN0
IHwKKyAgICAgICAgICAgICAgICAgICAgICAgIHlpZWxkIHN1Yk1hdGNoLm1hcEluZGV4TGlzdChp
bmRleExpc3QpCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgb3V0
cC5wdXRzICJicmVhazsiCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIG91dHAu
cHV0cyAiZGVmYXVsdDoiCisgICAgICAgICAgICAgICAgb3V0cC5wdXRzICJicmVhazsiCisgICAg
ICAgICAgICAgICAgb3V0cC5wdXRzICJ9IgorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAg
ICAgIHN1Yk1hdGNoID0gU3ViTWF0Y2gubmV3KGluZGV4TGlzdCwgcHJvZHVjdGlvbnMpCisgICAg
ICAgICAgICAgICAgbWF0Y2hMZW5ndGgob3V0cCwgdmFsdWVOYW1lLCBzdWJNYXRjaC5wcm9kdWN0
aW9ucykgeworICAgICAgICAgICAgICAgICAgICB8IGluZGV4TGlzdCB8CisgICAgICAgICAgICAg
ICAgICAgIHlpZWxkIHN1Yk1hdGNoLm1hcEluZGV4TGlzdChpbmRleExpc3QpCisgICAgICAgICAg
ICAgICAgfQorICAgICAgICAgICAgZW5kCisgICAgICAgIH0KKyAgICBlbmQKKworICAgICMgVGFr
ZXMgcHJvZHVjdGlvbnMgdGhhdCBoYXZlIHRoZSBzYW1lIG9wY29kZSBhbmQgdGhlIHNhbWUgbGVu
Z3RoIGFuZCBzZWxlY3RzIGZyb20gdGhlbSBiYXNlZCBvbgorICAgICMgdGhlIHByb2R1Y3Rpb25z
IGF0IHRoZSBnaXZlbiBjb2x1bW4uCisgICAgZGVmIG1hdGNoQ29sdW1uKG91dHAsIHZhbHVlTmFt
ZSwgcHJvZHVjdGlvbnMsIGNvbHVtbkluZGV4KQorICAgICAgICBpZiBjb2x1bW5JbmRleCA+PSBw
cm9kdWN0aW9uc1swXS5jaGlsZHJlbi5sZW5ndGgKKyAgICAgICAgICAgIHlpZWxkICgwLi4uKHBy
b2R1Y3Rpb25zLnNpemUpKS50b19hCisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgZW5kCisK
KyAgICAgICAgc3ViVmFsdWUgPSBuZXdWYXIKKyAgICAgICAgCisgICAgICAgIG91dHAucHV0cyAi
eyIKKyAgICAgICAgb3V0cC5wdXRzICJWYWx1ZSogI3tzdWJWYWx1ZX0gPSAje3ZhbHVlTmFtZX0t
PmNoaWxkKCN7Y29sdW1uSW5kZXh9KTsiCisKKyAgICAgICAgIyBXZSBtYXkgbm90IHVzZSB0aGlz
IHZhbHVlLiBUZWxsIHRoZSBjb21waWxlciB0byBjaGlsbCBvdXQgYWJvdXQgaXQuCisgICAgICAg
IG91dHAucHV0cyAiVU5VU0VEX1BBUkFNKCN7c3ViVmFsdWV9KTsiCisgICAgICAgIAorICAgICAg
ICBzdWJQcm9kdWN0aW9ucyA9IHByb2R1Y3Rpb25zLm1hcCB7CisgICAgICAgICAgICB8IHByb2R1
Y3Rpb24gfAorICAgICAgICAgICAgcHJvZHVjdGlvbi5jaGlsZHJlbltjb2x1bW5JbmRleF0KKyAg
ICAgICAgfQorCisgICAgICAgIG1hdGNoUmVjdXJzaXZlbHkob3V0cCwgc3ViVmFsdWUsIHN1YlBy
b2R1Y3Rpb25zKSB7CisgICAgICAgICAgICB8IGluZGV4TGlzdCB8CisgICAgICAgICAgICBzdWJN
YXRjaCA9IFN1Yk1hdGNoLm5ldyhpbmRleExpc3QsIHByb2R1Y3Rpb25zKQorICAgICAgICAgICAg
bWF0Y2hDb2x1bW4ob3V0cCwgdmFsdWVOYW1lLCBzdWJNYXRjaC5wcm9kdWN0aW9ucywgY29sdW1u
SW5kZXggKyAxKSB7CisgICAgICAgICAgICAgICAgfCBpbmRleExpc3QgfAorICAgICAgICAgICAg
ICAgIHlpZWxkIHN1Yk1hdGNoLm1hcEluZGV4TGlzdChpbmRleExpc3QpCisgICAgICAgICAgICB9
CisgICAgICAgIH0KKworICAgICAgICBvdXRwLnB1dHMgIn0iCisgICAgZW5kCisKKyAgICBkZWYg
bWF0Y2hSZWN1cnNpdmVseShvdXRwLCB2YWx1ZU5hbWUsIHByb2R1Y3Rpb25zKQorICAgICAgICBt
YXRjaFByb2R1Y3Rpb25zKG91dHAsIHZhbHVlTmFtZSwgcHJvZHVjdGlvbnMpIHsKKyAgICAgICAg
ICAgIHwgaW5kZXhMaXN0IHwKKyAgICAgICAgICAgICMgV2UgYXJlIGd1YXJhbnRlZWQgdGhhdCB0
aGlzIGluZGV4IGxpc3QgY29udGFpbnMgcHJvZHVjdGlvbnMgd2l0aCB0aGUgc2FtZSBvcGNvZGUg
YW5kCisgICAgICAgICAgICAjIHRoZSBzYW1lIGxlbmd0aC4KKyAgICAgICAgICAgIHN1Yk1hdGNo
ID0gU3ViTWF0Y2gubmV3KGluZGV4TGlzdCwgcHJvZHVjdGlvbnMpCisgICAgICAgICAgICBtYXRj
aENvbHVtbihvdXRwLCB2YWx1ZU5hbWUsIHN1Yk1hdGNoLnByb2R1Y3Rpb25zLCAwKSB7CisgICAg
ICAgICAgICAgICAgfCBpbmRleExpc3QgfAorICAgICAgICAgICAgICAgIHlpZWxkIHN1Yk1hdGNo
Lm1hcEluZGV4TGlzdChpbmRleExpc3QpCisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICBl
bmQKKworICAgIG1hdGNoUmVjdXJzaXZlbHkob3V0cCwgIl92YWx1ZSIsIG1hdGNoZXIucHJvZHVj
dGlvbnMpIHsKKyAgICAgICAgfCBpbmRleExpc3QgfAorICAgICAgICBpbmRleExpc3QuZWFjaCB7
CisgICAgICAgICAgICB8IGluZGV4IHwKKyAgICAgICAgICAgIHByb2R1Y3Rpb24gPSBtYXRjaGVy
LnByb2R1Y3Rpb25zW2luZGV4XQorICAgICAgICAgICAgb3V0cC5wdXRzICJ7IgorICAgICAgICAg
ICAgb3V0cC5wdXRzICJWYWx1ZSogI3twcm9kdWN0aW9uLnZhck5hbWV9ID0gX3ZhbHVlOyIKKyAg
ICAgICAgICAgIGludGVybmFsQXJndW1lbnRzID0gW10KKyAgICAgICAgICAgIG9wZXJhbmRBcmd1
bWVudHMgPSBbXQorICAgICAgICAgICAgdHJ5QXJndW1lbnRzID0gW10KKyAgICAgICAgICAgIG51
bVNjb3BlcyA9IDAKKyAgICAgICAgICAgIHNlZW4gPSB7fQorICAgICAgICAgICAgcHJvZHVjdGlv
bi5lYWNoVmFyaWFibGUgeworICAgICAgICAgICAgICAgIHwgcGFyZW50VmFyTmFtZSwgY2hpbGRO
YW1lLCBjaGlsZFZhck5hbWUsIGtpbmQsIGluZGV4IHwKKyAgICAgICAgICAgICAgICBsb2FkRXhw
ciA9ICIje3BhcmVudFZhck5hbWV9LT5jaGlsZCgje2luZGV4fSkiCisgICAgICAgICAgICAgICAg
CisgICAgICAgICAgICAgICAgaWYgc2VlbltjaGlsZFZhck5hbWVdCisgICAgICAgICAgICAgICAg
ICAgIHRtcCA9IG5ld1ZhcgorICAgICAgICAgICAgICAgICAgICBvdXRwLnB1dHMgIlZhbHVlKiAj
e3RtcH0gPSAje2xvYWRFeHByfTsiCisgICAgICAgICAgICAgICAgICAgIG91dHAucHV0cyAiaWYg
KCN7dG1wfSA9PSAje2NoaWxkVmFyTmFtZX0pIHsiCisgICAgICAgICAgICAgICAgICAgIG51bVNj
b3BlcyArPSAxCisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICBzZWVu
W2NoaWxkVmFyTmFtZV0gPSB0cnVlCisgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAg
ICAgICAgICBvdXRwLnB1dHMgIlZhbHVlKiAje2NoaWxkVmFyTmFtZX0gPSAje2xvYWRFeHByfTsi
CisKKyAgICAgICAgICAgICAgICAgICAgaWYgY2hpbGROYW1lID1+IC9cQVwkLworICAgICAgICAg
ICAgICAgICAgICAgICAgaWYgY2hpbGROYW1lID1+IC9cQVwkKFswLTldKylcWi8KKyAgICAgICAg
ICAgICAgICAgICAgICAgICAgICBvdXRwLnB1dHMgImlmICgje2NoaWxkVmFyTmFtZX0tPmlzSW50
KCN7JDF9KSkgeyIKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAg
ICAgICAgICAgICAgICBvdXRwLnB1dHMgImlmICgje2NoaWxkVmFyTmFtZX0tPmhhc0ludCgpKSB7
IgorICAgICAgICAgICAgICAgICAgICAgICAgZW5kCisgICAgICAgICAgICAgICAgICAgICAgICBu
dW1TY29wZXMgKz0gMQorICAgICAgICAgICAgICAgICAgICBlbmQKKyAgICAgICAgICAgICAgICAg
ICAgCisgICAgICAgICAgICAgICAgICAgIGludGVybmFsQXJndW1lbnRzIDw8IGNoaWxkVmFyTmFt
ZSBpZiBraW5kID09IDppbnRlcm5hbCBvciBraW5kID09IDphbm9uSW50ZXJuYWwKKyAgICAgICAg
ICAgICAgICAgICAgb3BlcmFuZEFyZ3VtZW50cyA8PCBjaGlsZFZhck5hbWUgaWYga2luZCA9PSA6
b3BlcmFuZCBvciBraW5kID09IDphbm9uT3BlcmFuZAorICAgICAgICAgICAgICAgICAgICB0cnlB
cmd1bWVudHMgPDwgY2hpbGRWYXJOYW1lIGlmIGtpbmQgPT0gOmludGVybmFsIG9yIGtpbmQgPT0g
Om9wZXJhbmQKKyAgICAgICAgICAgICAgICBlbmQKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAg
IG91dHAucHV0cyAiaWYgKGFkYXB0b3IuYWNjZXB0Um9vdChfdmFsdWUpIgorICAgICAgICAgICAg
b3V0cC5wdXRzKCIgICAgJiYgYWRhcHRvci5hY2NlcHRJbnRlcm5hbHMoIiArIGludGVybmFsQXJn
dW1lbnRzLmpvaW4oIiwgIikgKyAiKSIpCisgICAgICAgICAgICBvdXRwLnB1dHMoIiAgICAmJiBh
ZGFwdG9yLmFjY2VwdE9wZXJhbmRzKCIgKyBvcGVyYW5kQXJndW1lbnRzLmpvaW4oIiwgIikgKyAi
KSIpCisgICAgICAgICAgICBvdXRwLnB1dHMoIiAgICAmJiBhZGFwdG9yLnRyeSN7cHJvZHVjdGlv
bi5uYW1lfSgiICsgdHJ5QXJndW1lbnRzLmpvaW4oIiwgIikgKyAiKSkiKQorICAgICAgICAgICAg
b3V0cC5wdXRzICIgICAgcmV0dXJuOyIKKyAgICAgICAgICAgIG51bVNjb3Blcy50aW1lcyB7Cisg
ICAgICAgICAgICAgICAgb3V0cC5wdXRzICJ9IgorICAgICAgICAgICAgfQorICAgICAgICAgICAg
b3V0cC5wdXRzICJ9IgorICAgICAgICB9CisgICAgfQorICAgIAorICAgIG91dHAucHV0cyAiICAg
IFJFTEVBU0VfQVNTRVJUX05PVF9SRUFDSEVEKCk7IgorICAgIG91dHAucHV0cyAifSIKKyAgICAK
KyAgICBvdXRwLnB1dHMgIn0gfSAvLyBuYW1lc3BhY2UgSlNDOjpCMyIKKworICAgIG91dHAucHV0
cyAiI2VuZGlmIC8vIEIzI3ttYXRjaGVyLm5hbWV9X2giCit9CkluZGV4OiBTb3VyY2UvSmF2YVNj
cmlwdENvcmUvYjMvYWlyL0FpckFyZy5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL0phdmFTY3Jp
cHRDb3JlL2IzL2Fpci9BaXJBcmcuY3BwCShyZXZpc2lvbiAwKQorKysgU291cmNlL0phdmFTY3Jp
cHRDb3JlL2IzL2Fpci9BaXJBcmcuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsODEgQEAK
Ky8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTUgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVk
LgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9y
bXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3Zp
ZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVk
aXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmln
aHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dp
bmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0
IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBv
ZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBk
b2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlz
dHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5D
LiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElO
Q0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBP
RiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9T
RSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IKKyAqIENP
TlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFM
LCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xV
RElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBH
T09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBC
VVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisg
KiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9S
IFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4g
QU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJ
U0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKworI2luY2x1ZGUg
ImNvbmZpZy5oIgorI2luY2x1ZGUgIkFpckFyZy5oIgorCituYW1lc3BhY2UgSlNDIHsgbmFtZXNw
YWNlIEIzIHsgbmFtZXNwYWNlIEFpciB7CisKK3ZvaWQgQXJnOjpkdW1wKFByaW50U3RyZWFtJiBv
dXQpIGNvbnN0Cit7CisgICAgc3dpdGNoIChtX2tpbmQpIHsKKyAgICBjYXNlIFRtcDoKKyAgICAg
ICAgb3V0LnByaW50KHRtcCgpKTsKKyAgICAgICAgcmV0dXJuOworICAgIGNhc2UgSW1tOgorICAg
ICAgICBvdXQucHJpbnQoIiQiLCBtX29mZnNldCk7CisgICAgICAgIHJldHVybjsKKyAgICBjYXNl
IEltbTY0OgorICAgICAgICBvdXQucHJpbnRmKCIkMHglbGx4IiwgbV9vZmZzZXQpOworICAgICAg
ICByZXR1cm47CisgICAgY2FzZSBBZGRyOgorICAgICAgICBpZiAob2Zmc2V0KCkpCisgICAgICAg
ICAgICBvdXQucHJpbnQob2Zmc2V0KCkpOworICAgICAgICBvdXQucHJpbnQoIigiLCBiYXNlKCks
ICIpIik7CisgICAgICAgIHJldHVybjsKKyAgICBjYXNlIEluZGV4OgorICAgICAgICBpZiAob2Zm
c2V0KCkpCisgICAgICAgICAgICBvdXQucHJpbnQob2Zmc2V0KCkpOworICAgICAgICBvdXQucHJp
bnQoIigiLCBiYXNlKCksICIsIiwgaW5kZXgoKSk7CisgICAgICAgIGlmIChzY2FsZSgpICE9IDEp
CisgICAgICAgICAgICBvdXQucHJpbnQoIiwiLCBzY2FsZSgpKTsKKyAgICAgICAgb3V0LnByaW50
KCIpIik7CisgICAgICAgIHJldHVybjsKKyAgICBjYXNlIFN0YWNrOgorICAgICAgICBpZiAob2Zm
c2V0KCkpCisgICAgICAgICAgICBvdXQucHJpbnQob2Zmc2V0KTsKKyAgICAgICAgb3V0LnByaW50
KCIoIiwgcG9pbnRlckR1bXAoc3RhY2tTbG90KCkpLCAiKSIpOworICAgICAgICByZXR1cm47Cisg
ICAgY2FzZSBDYWxsQXJnOgorICAgICAgICBpZiAob2Zmc2V0KCkpCisgICAgICAgICAgICBvdXQu
cHJpbnQob2Zmc2V0KTsKKyAgICAgICAgb3V0LnByaW50KCIoY2FsbEFyZykiKTsKKyAgICAgICAg
cmV0dXJuOworICAgIGNhc2UgUmVsQ29uZDoKKyAgICAgICAgb3V0LnByaW50KGFzUmVsYXRpb25h
bENvbmRpdGlvbigpKTsKKyAgICAgICAgcmV0dXJuOworICAgIGNhc2UgUmVzQ29uZDoKKyAgICAg
ICAgb3V0LnByaW50KGFzUmVzdWx0Q29uZGl0aW9uKCkpOworICAgICAgICByZXR1cm47CisgICAg
Y2FzZSBTcGVjaWFsOgorICAgICAgICBvdXQucHJpbnQocG9pbnRlckR1bXAoc3BlY2lhbCgpKSk7
CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBSRUxFQVNFX0FTU0VSVF9OT1RfUkVBQ0hF
RCgpOworfQorCit9IH0gfSAvLyBuYW1lc3BhY2UgSlNDOjpCMzo6QWlyCisKSW5kZXg6IFNvdXJj
ZS9KYXZhU2NyaXB0Q29yZS9iMy9haXIvQWlyQXJnLmgKPT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL0ph
dmFTY3JpcHRDb3JlL2IzL2Fpci9BaXJBcmcuaAkocmV2aXNpb24gMCkKKysrIFNvdXJjZS9KYXZh
U2NyaXB0Q29yZS9iMy9haXIvQWlyQXJnLmgJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSw1ODIg
QEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTUgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2Vy
dmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkg
Zm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHBy
b3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4g
UmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5
cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xs
b3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBt
dXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlz
dCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAg
ICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUg
ZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUg
SU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMs
IElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElF
UyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVS
UE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IKKyAq
IENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVO
VEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElO
Q0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVU
RSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBP
UiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZ
CisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFks
IE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcg
SU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBB
RFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKworI2lmbmRl
ZiBBaXJBcmdfaAorI2RlZmluZSBBaXJBcmdfaAorCisjaW5jbHVkZSAiQWlyVG1wLmgiCisjaW5j
bHVkZSAiQjNUeXBlLmgiCisKK25hbWVzcGFjZSBKU0MgeyBuYW1lc3BhY2UgQjMgeyBuYW1lc3Bh
Y2UgQWlyIHsKKworY2xhc3MgU3BlY2lhbDsKK2NsYXNzIFN0YWNrU2xvdDsKKworLy8gVGhpcyBj
bGFzcyBuYW1lIGlzIGFsc28gaW50ZW50aW9uYWxseSB0ZXJzZSBiZWNhdXNlIHdlIHdpbGwgc2F5
IGl0IGEgbG90LiBZb3UnbGwgc2VlIGNvZGUgbGlrZQorLy8gSW5zdCguLi4sIEFyZzo6aW1tKDUp
LCBBcmc6OmFkZHIodGhpbmcsIGJsYWgpLCAuLi4pCitjbGFzcyBBcmcgeworcHVibGljOgorICAg
IC8vIFRoZXNlIGVudW0gbWVtYmVycyBhcmUgaW50ZW50aW9uYWxseSB0ZXJzZSBiZWNhdXNlIHdl
IGhhdmUgdG8gbWVudGlvbiB0aGVtIGEgbG90LgorICAgIGVudW0gS2luZCA6IGludDhfdCB7Cisg
ICAgICAgIFRtcCwKKyAgICAgICAgSW1tLAorICAgICAgICBJbW02NCwKKyAgICAgICAgQWRkciwK
KyAgICAgICAgU3RhY2ssCisgICAgICAgIENhbGxBcmcsCisgICAgICAgIEluZGV4LAorICAgICAg
ICBSZWxDb25kLAorICAgICAgICBSZXNDb25kLAorICAgICAgICBTcGVjaWFsCisgICAgfTsKKwor
ICAgIGVudW0gUm9sZSA6IGludDhfdCB7CisgICAgICAgIFVzZSwKKyAgICAgICAgRGVmLAorICAg
ICAgICBVc2VEZWYKKyAgICB9OworCisgICAgZW51bSBUeXBlIDogaW50OF90IHsKKyAgICAgICAg
R1AsCisgICAgICAgIEZQCisgICAgfTsKKworICAgIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBudW1U
eXBlcyA9IDI7CisKKyAgICBzdGF0aWMgYm9vbCBpc1VzZShSb2xlIHJvbGUpCisgICAgeworICAg
ICAgICBzd2l0Y2ggKHJvbGUpIHsKKyAgICAgICAgY2FzZSBVc2U6CisgICAgICAgIGNhc2UgVXNl
RGVmOgorICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIGNhc2UgRGVmOgorICAgICAg
ICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgfQorCisgICAgc3RhdGljIGJvb2wg
aXNEZWYoUm9sZSByb2xlKQorICAgIHsKKyAgICAgICAgc3dpdGNoIChyb2xlKSB7CisgICAgICAg
IGNhc2UgVXNlOgorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICBjYXNlIERlZjoK
KyAgICAgICAgY2FzZSBVc2VEZWY6CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAg
fQorICAgIH0KKworICAgIHN0YXRpYyBUeXBlIHR5cGVGb3JCM1R5cGUoQjM6OlR5cGUgdHlwZSkK
KyAgICB7CisgICAgICAgIHN3aXRjaCAodHlwZSkgeworICAgICAgICBjYXNlIFZvaWQ6CisgICAg
ICAgICAgICBBU1NFUlRfTk9UX1JFQUNIRUQoKTsKKyAgICAgICAgICAgIHJldHVybiBHUDsKKyAg
ICAgICAgY2FzZSBJbnQzMjoKKyAgICAgICAgY2FzZSBJbnQ2NDoKKyAgICAgICAgICAgIHJldHVy
biBHUDsKKyAgICAgICAgY2FzZSBEb3VibGU6CisgICAgICAgICAgICByZXR1cm4gRlA7CisgICAg
ICAgIH0KKyAgICAgICAgQVNTRVJUX05PVF9SRUFDSEVEKCk7CisgICAgICAgIHJldHVybiBHUDsK
KyAgICB9CisKKyAgICBBcmcoKQorICAgIHsKKyAgICB9CisKKyAgICBBcmcoQWlyOjpUbXAgdG1w
KQorICAgICAgICA6IG1fa2luZChUbXApCisgICAgICAgICwgbV9iYXNlKHRtcCkKKyAgICB7Cisg
ICAgfQorCisgICAgc3RhdGljIEFyZyBpbW0oaW50MzJfdCB2YWx1ZSkKKyAgICB7CisgICAgICAg
IEFyZyByZXN1bHQ7CisgICAgICAgIHJlc3VsdC5tX2tpbmQgPSBJbW07CisgICAgICAgIHJlc3Vs
dC5tX29mZnNldCA9IHZhbHVlOworICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKworICAg
IHN0YXRpYyBBcmcgaW1tNjQoaW50cHRyX3QgdmFsdWUpCisgICAgeworICAgICAgICBBcmcgcmVz
dWx0OworICAgICAgICByZXN1bHQubV9raW5kID0gSW1tNjQ7CisgICAgICAgIHJlc3VsdC5tX29m
ZnNldCA9IHZhbHVlOworICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKworICAgIHN0YXRp
YyBBcmcgYWRkcmVzcyhBaXI6OlRtcCBiYXNlLCBpbnQzMl90IG9mZnNldCA9IDApCisgICAgewor
ICAgICAgICBBU1NFUlQoYmFzZS5pc0dQKCkpOworICAgICAgICBBcmcgcmVzdWx0OworICAgICAg
ICByZXN1bHQubV9raW5kID0gQWRkcjsKKyAgICAgICAgcmVzdWx0Lm1fYmFzZSA9IGJhc2U7Cisg
ICAgICAgIHJlc3VsdC5tX29mZnNldCA9IG9mZnNldDsKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsK
KyAgICB9CisKKyAgICBzdGF0aWMgQXJnIHN0YWNrKFN0YWNrU2xvdCogdmFsdWUsIGludDMyX3Qg
b2Zmc2V0ID0gMCkKKyAgICB7CisgICAgICAgIEFyZyByZXN1bHQ7CisgICAgICAgIHJlc3VsdC5t
X2tpbmQgPSBTdGFjazsKKyAgICAgICAgcmVzdWx0Lm1fb2Zmc2V0ID0gYml0d2lzZV9jYXN0PGlu
dHB0cl90Pih2YWx1ZSk7CisgICAgICAgIHJlc3VsdC5tX3NjYWxlID0gb2Zmc2V0OyAvLyBJIGtu
b3csIHl1Y2suCisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorCisgICAgc3RhdGljIEFy
ZyBjYWxsQXJnKGludDMyX3Qgb2Zmc2V0KQorICAgIHsKKyAgICAgICAgQXJnIHJlc3VsdDsKKyAg
ICAgICAgcmVzdWx0Lm1fa2luZCA9IENhbGxBcmc7CisgICAgICAgIHJlc3VsdC5tX29mZnNldCA9
IG9mZnNldDsKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisKKyAgICBzdGF0aWMgYm9v
bCBpc1ZhbGlkU2NhbGUodW5zaWduZWQgc2NhbGUpCisgICAgeworICAgICAgICBzd2l0Y2ggKHNj
YWxlKSB7CisgICAgICAgIGNhc2UgMToKKyAgICAgICAgY2FzZSAyOgorICAgICAgICBjYXNlIDQ6
CisgICAgICAgIGNhc2UgODoKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICBkZWZh
dWx0OgorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgfQorCisgICAg
c3RhdGljIHVuc2lnbmVkIGxvZ1NjYWxlKHVuc2lnbmVkIHNjYWxlKQorICAgIHsKKyAgICAgICAg
c3dpdGNoIChzY2FsZSkgeworICAgICAgICBjYXNlIDE6CisgICAgICAgICAgICByZXR1cm4gMDsK
KyAgICAgICAgY2FzZSAyOgorICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgIGNhc2UgNDoK
KyAgICAgICAgICAgIHJldHVybiAyOworICAgICAgICBjYXNlIDg6CisgICAgICAgICAgICByZXR1
cm4gMzsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIEFTU0VSVF9OT1RfUkVBQ0hFRCgp
OworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBzdGF0aWMg
QXJnIGluZGV4KEFpcjo6VG1wIGJhc2UsIEFpcjo6VG1wIGluZGV4LCB1bnNpZ25lZCBzY2FsZSA9
IDEsIGludDMyX3Qgb2Zmc2V0ID0gMCkKKyAgICB7CisgICAgICAgIEFTU0VSVChiYXNlLmlzR1Ao
KSk7CisgICAgICAgIEFTU0VSVChpbmRleC5pc0dQKCkpOworICAgICAgICBBU1NFUlQoaXNWYWxp
ZFNjYWxlKHNjYWxlKSk7CisgICAgICAgIEFyZyByZXN1bHQ7CisgICAgICAgIHJlc3VsdC5tX2tp
bmQgPSBJbmRleDsKKyAgICAgICAgcmVzdWx0Lm1fYmFzZSA9IGJhc2U7CisgICAgICAgIHJlc3Vs
dC5tX2luZGV4ID0gaW5kZXg7CisgICAgICAgIHJlc3VsdC5tX3NjYWxlID0gc3RhdGljX2Nhc3Q8
aW50MzJfdD4oc2NhbGUpOworICAgICAgICByZXN1bHQubV9vZmZzZXQgPSBvZmZzZXQ7CisgICAg
ICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorCisgICAgc3RhdGljIEFyZyByZWxDb25kKE1hY3Jv
QXNzZW1ibGVyOjpSZWxhdGlvbmFsQ29uZGl0aW9uIGNvbmRpdGlvbikKKyAgICB7CisgICAgICAg
IEFyZyByZXN1bHQ7CisgICAgICAgIHJlc3VsdC5tX2tpbmQgPSBSZWxDb25kOworICAgICAgICBy
ZXN1bHQubV9vZmZzZXQgPSBjb25kaXRpb247CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAg
fQorCisgICAgc3RhdGljIEFyZyByZXNDb25kKE1hY3JvQXNzZW1ibGVyOjpSZXN1bHRDb25kaXRp
b24gY29uZGl0aW9uKQorICAgIHsKKyAgICAgICAgQXJnIHJlc3VsdDsKKyAgICAgICAgcmVzdWx0
Lm1fa2luZCA9IFJlc0NvbmQ7CisgICAgICAgIHJlc3VsdC5tX29mZnNldCA9IGNvbmRpdGlvbjsK
KyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisKKyAgICBzdGF0aWMgQXJnIHNwZWNpYWwo
QWlyOjpTcGVjaWFsKiBzcGVjaWFsKQorICAgIHsKKyAgICAgICAgQXJnIHJlc3VsdDsKKyAgICAg
ICAgcmVzdWx0Lm1fa2luZCA9IFNwZWNpYWw7CisgICAgICAgIHJlc3VsdC5tX29mZnNldCA9IGJp
dHdpc2VfY2FzdDxpbnRwdHJfdD4oc3BlY2lhbCk7CisgICAgICAgIHJldHVybiByZXN1bHQ7Cisg
ICAgfQorCisgICAgYm9vbCBvcGVyYXRvcj09KGNvbnN0IEFyZyYgb3RoZXIpIGNvbnN0CisgICAg
eworICAgICAgICByZXR1cm4gbV9vZmZzZXQgPT0gb3RoZXIubV9vZmZzZXQKKyAgICAgICAgICAg
ICYmIG1fa2luZCA9PSBvdGhlci5tX2tpbmQKKyAgICAgICAgICAgICYmIG1fYmFzZSA9PSBvdGhl
ci5tX2Jhc2UKKyAgICAgICAgICAgICYmIG1faW5kZXggPT0gb3RoZXIubV9pbmRleAorICAgICAg
ICAgICAgJiYgbV9zY2FsZSA9PSBvdGhlci5tX3NjYWxlOworICAgIH0KKworICAgIGJvb2wgb3Bl
cmF0b3IhPShjb25zdCBBcmcmIG90aGVyKSBjb25zdAorICAgIHsKKyAgICAgICAgcmV0dXJuICEo
KnRoaXMgPT0gb3RoZXIpOworICAgIH0KKworICAgIGV4cGxpY2l0IG9wZXJhdG9yIGJvb2woKSBj
b25zdCB7IHJldHVybiAqdGhpcyAhPSBBcmcoKTsgfQorCisgICAgS2luZCBraW5kKCkgY29uc3QK
KyAgICB7CisgICAgICAgIHJldHVybiBtX2tpbmQ7CisgICAgfQorCisgICAgYm9vbCBpc1RtcCgp
IGNvbnN0CisgICAgeworICAgICAgICByZXR1cm4ga2luZCgpID09IFRtcDsKKyAgICB9CisKKyAg
ICBib29sIGlzSW1tKCkgY29uc3QKKyAgICB7CisgICAgICAgIHJldHVybiBraW5kKCkgPT0gSW1t
OworICAgIH0KKworICAgIGJvb2wgaXNJbW02NCgpIGNvbnN0CisgICAgeworICAgICAgICByZXR1
cm4ga2luZCgpID09IEltbTY0OworICAgIH0KKworICAgIGJvb2wgaXNBZGRyKCkgY29uc3QKKyAg
ICB7CisgICAgICAgIHJldHVybiBraW5kKCkgPT0gQWRkcjsKKyAgICB9CisKKyAgICBib29sIGlz
U3RhY2soKSBjb25zdAorICAgIHsKKyAgICAgICAgcmV0dXJuIGtpbmQoKSA9PSBTdGFjazsKKyAg
ICB9CisKKyAgICBib29sIGlzQ2FsbEFyZygpIGNvbnN0CisgICAgeworICAgICAgICByZXR1cm4g
a2luZCgpID09IENhbGxBcmc7CisgICAgfQorCisgICAgYm9vbCBpc0luZGV4KCkgY29uc3QKKyAg
ICB7CisgICAgICAgIHJldHVybiBraW5kKCkgPT0gSW5kZXg7CisgICAgfQorCisgICAgYm9vbCBp
c1JlbENvbmQoKSBjb25zdAorICAgIHsKKyAgICAgICAgcmV0dXJuIGtpbmQoKSA9PSBSZWxDb25k
OworICAgIH0KKworICAgIGJvb2wgaXNSZXNDb25kKCkgY29uc3QKKyAgICB7CisgICAgICAgIHJl
dHVybiBraW5kKCkgPT0gUmVzQ29uZDsKKyAgICB9CisKKyAgICBib29sIGlzU3BlY2lhbCgpIGNv
bnN0CisgICAgeworICAgICAgICByZXR1cm4ga2luZCgpID09IFNwZWNpYWw7CisgICAgfQorCisg
ICAgYm9vbCBpc0FsaXZlKCkgY29uc3QKKyAgICB7CisgICAgICAgIHJldHVybiBpc1RtcCgpIHx8
IGlzU3RhY2soKTsKKyAgICB9CisKKyAgICBBaXI6OlRtcCB0bXAoKSBjb25zdAorICAgIHsKKyAg
ICAgICAgQVNTRVJUKGtpbmQoKSA9PSBUbXApOworICAgICAgICByZXR1cm4gbV9iYXNlOworICAg
IH0KKworICAgIGludDY0X3QgdmFsdWUoKSBjb25zdAorICAgIHsKKyAgICAgICAgQVNTRVJUKGtp
bmQoKSA9PSBJbW0gfHwga2luZCgpID09IEltbTY0KTsKKyAgICAgICAgcmV0dXJuIG1fb2Zmc2V0
OworICAgIH0KKworICAgIHZvaWQqIHBvaW50ZXJWYWx1ZSgpIGNvbnN0CisgICAgeworICAgICAg
ICBBU1NFUlQoa2luZCgpID09IEltbTY0KTsKKyAgICAgICAgcmV0dXJuIGJpdHdpc2VfY2FzdDx2
b2lkKj4oc3RhdGljX2Nhc3Q8aW50cHRyX3Q+KG1fb2Zmc2V0KSk7CisgICAgfQorCisgICAgQWly
OjpUbXAgYmFzZSgpIGNvbnN0CisgICAgeworICAgICAgICBBU1NFUlQoa2luZCgpID09IEFkZHIg
fHwga2luZCgpID09IEluZGV4KTsKKyAgICAgICAgcmV0dXJuIG1fYmFzZTsKKyAgICB9CisKKyAg
ICBpbnQzMl90IG9mZnNldCgpIGNvbnN0CisgICAgeworICAgICAgICBpZiAoa2luZCgpID09IFN0
YWNrKQorICAgICAgICAgICAgcmV0dXJuIHN0YXRpY19jYXN0PGludDMyX3Q+KG1fc2NhbGUpOwor
ICAgICAgICBBU1NFUlQoa2luZCgpID09IEFkZHIgfHwga2luZCgpID09IENhbGxBcmcgfHwga2lu
ZCgpID09IEluZGV4KTsKKyAgICAgICAgcmV0dXJuIHN0YXRpY19jYXN0PGludDMyX3Q+KG1fb2Zm
c2V0KTsKKyAgICB9CisKKyAgICBTdGFja1Nsb3QqIHN0YWNrU2xvdCgpIGNvbnN0CisgICAgewor
ICAgICAgICBBU1NFUlQoa2luZCgpID09IFN0YWNrKTsKKyAgICAgICAgcmV0dXJuIGJpdHdpc2Vf
Y2FzdDxTdGFja1Nsb3QqPihtX29mZnNldCk7CisgICAgfQorCisgICAgQWlyOjpUbXAgaW5kZXgo
KSBjb25zdAorICAgIHsKKyAgICAgICAgQVNTRVJUKGtpbmQoKSA9PSBJbmRleCk7CisgICAgICAg
IHJldHVybiBtX2luZGV4OworICAgIH0KKworICAgIHVuc2lnbmVkIHNjYWxlKCkgY29uc3QKKyAg
ICB7CisgICAgICAgIEFTU0VSVChraW5kKCkgPT0gSW5kZXgpOworICAgICAgICByZXR1cm4gbV9z
Y2FsZTsKKyAgICB9CisKKyAgICB1bnNpZ25lZCBsb2dTY2FsZSgpIGNvbnN0CisgICAgeworICAg
ICAgICByZXR1cm4gbG9nU2NhbGUoc2NhbGUoKSk7CisgICAgfQorCisgICAgQWlyOjpTcGVjaWFs
KiBzcGVjaWFsKCkgY29uc3QKKyAgICB7CisgICAgICAgIEFTU0VSVChraW5kKCkgPT0gU3BlY2lh
bCk7CisgICAgICAgIHJldHVybiBiaXR3aXNlX2Nhc3Q8QWlyOjpTcGVjaWFsKj4obV9vZmZzZXQp
OworICAgIH0KKworICAgIGJvb2wgaXNHUFRtcCgpIGNvbnN0CisgICAgeworICAgICAgICByZXR1
cm4gaXNUbXAoKSAmJiB0bXAoKS5pc0dQKCk7CisgICAgfQorCisgICAgYm9vbCBpc0ZQVG1wKCkg
Y29uc3QKKyAgICB7CisgICAgICAgIHJldHVybiBpc1RtcCgpICYmIHRtcCgpLmlzRlAoKTsKKyAg
ICB9CisgICAgCisgICAgLy8gVGVsbHMgdXMgaWYgdGhpcyBBcmcgY2FuIGJlIHVzZWQgaW4gYSBw
b3NpdGlvbiB0aGF0IHJlcXVpcmVzIGEgR1AgdmFsdWUuCisgICAgYm9vbCBpc0dQKCkgY29uc3QK
KyAgICB7CisgICAgICAgIHN3aXRjaCAoa2luZCgpKSB7CisgICAgICAgIGNhc2UgSW1tOgorICAg
ICAgICBjYXNlIEltbTY0OgorICAgICAgICBjYXNlIEFkZHI6CisgICAgICAgIGNhc2UgSW5kZXg6
CisgICAgICAgIGNhc2UgU3RhY2tTbG90OgorICAgICAgICBjYXNlIENhbGxBcmc6CisgICAgICAg
IGNhc2UgUmVsQ29uZDoKKyAgICAgICAgY2FzZSBSZXNDb25kOgorICAgICAgICBjYXNlIFNwZWNp
YWw6CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgY2FzZSBUbXA6CisgICAgICAg
ICAgICByZXR1cm4gaXNHUFRtcCgpOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gVGVsbHMg
dXMgaWYgdGhpcyBBcmcgY2FuIGJlIHVzZWQgaW4gYSBwb3NpdGlvbiB0aGF0IHJlcXVpcmVzIGEg
RlAgdmFsdWUuCisgICAgYm9vbCBpc0ZQKCkgY29uc3QKKyAgICB7CisgICAgICAgIHN3aXRjaCAo
a2luZCgpKSB7CisgICAgICAgIGNhc2UgSW1tOgorICAgICAgICBjYXNlIFJlbENvbmQ6CisgICAg
ICAgIGNhc2UgUmVzQ29uZDoKKyAgICAgICAgY2FzZSBTcGVjaWFsOgorICAgICAgICAgICAgcmV0
dXJuIGZhbHNlOworICAgICAgICBjYXNlIEFkZHI6CisgICAgICAgIGNhc2UgSW5kZXg6CisgICAg
ICAgIGNhc2UgQmFzZToKKyAgICAgICAgY2FzZSBTdGFja1Nsb3Q6CisgICAgICAgIGNhc2UgQ2Fs
bEFyZzoKKyAgICAgICAgY2FzZSBJbW02NDogLy8gWWVzLCB3ZSBhbGxvdyBJbW02NCBhcyBhIGRv
dWJsZSBpbW1lZGlhdGUuIFdlIHVzZSB0aGlzIGZvciBpbXBsZW1lbnRpbmcgc3RhY2ttYXBzLgor
ICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIGNhc2UgVG1wOgorICAgICAgICAgICAg
cmV0dXJuIGlzRlBUbXAoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGJvb2wgaGFzVHlwZSgp
IGNvbnN0CisgICAgeworICAgICAgICBzd2l0Y2ggKGtpbmQoKSkgeworICAgICAgICBjYXNlIElt
bToKKyAgICAgICAgY2FzZSBTcGVjaWFsOgorICAgICAgICBjYXNlIFRtcDoKKyAgICAgICAgICAg
IHJldHVybiB0cnVlOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuIGZhbHNl
OworICAgICAgICB9CisgICAgfQorICAgIAorICAgIC8vIFRoZSB0eXBlIGlzIGFtYmlndW91cyBm
b3Igc29tZSBhcmcga2luZHMuIENhbGwgd2l0aCBjYXJlLgorICAgIFR5cGUgdHlwZSgpIGNvbnN0
CisgICAgeworICAgICAgICByZXR1cm4gaXNHUCgpID8gR1AgOiBGUDsKKyAgICB9CisKKyAgICBi
b29sIGlzVHlwZShUeXBlIHR5cGUpIGNvbnN0CisgICAgeworICAgICAgICBzd2l0Y2ggKHR5cGUp
IHsKKyAgICAgICAgY2FzZSBHUDoKKyAgICAgICAgICAgIHJldHVybiBpc0dQKCk7CisgICAgICAg
IGNhc2UgRlA6CisgICAgICAgICAgICByZXR1cm4gaXNGUCgpOworICAgICAgICB9CisgICAgfQor
CisgICAgYm9vbCBpc0dQUigpIGNvbnN0CisgICAgeworICAgICAgICByZXR1cm4gaXNUbXAoKSAm
JiB0bXAoKS5pc0dQUigpOworICAgIH0KKworICAgIEdQUlJlZyBncHIoKSBjb25zdAorICAgIHsK
KyAgICAgICAgcmV0dXJuIHRtcCgpLmdwcigpOworICAgIH0KKworICAgIGJvb2wgaXNGUFIoKSBj
b25zdAorICAgIHsKKyAgICAgICAgcmV0dXJuIGlzVG1wKCkgJiYgdG1wKCkuaXNGUFIoKTsKKyAg
ICB9CisKKyAgICBGUFJSZWcgZnByKCkgY29uc3QKKyAgICB7CisgICAgICAgIHJldHVybiB0bXAo
KS5mcHIoKTsKKyAgICB9CisgICAgCisgICAgYm9vbCBpc1JlZygpIGNvbnN0CisgICAgeworICAg
ICAgICByZXR1cm4gaXNUbXAoKSAmJiB0bXAoKS5pc1JlZygpOworICAgIH0KKworICAgIFJlZyBy
ZWcoKSBjb25zdAorICAgIHsKKyAgICAgICAgcmV0dXJuIHRtcCgpLnJlZygpOworICAgIH0KKwor
ICAgIHVuc2lnbmVkIGdwVG1wSW5kZXgoKSBjb25zdAorICAgIHsKKyAgICAgICAgcmV0dXJuIHRt
cCgpLmdwVG1wSW5kZXgoKTsKKyAgICB9CisKKyAgICB1bnNpZ25lZCBmcFRtcEluZGV4KCkgY29u
c3QKKyAgICB7CisgICAgICAgIHJldHVybiB0bXAoKS5mcFRtcEluZGV4KCk7CisgICAgfQorCisg
ICAgdW5zaWduZWQgdG1wSW5kZXgoKSBjb25zdAorICAgIHsKKyAgICAgICAgcmV0dXJuIHRtcCgp
LnRtcEluZGV4KCk7CisgICAgfQorCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgRnVuY3Rvcj4KKyAg
ICB2b2lkIGZvckVhY2hUbXBGYXN0KGNvbnN0IEZ1bmN0b3ImIGZ1bmN0b3IpCisgICAgeworICAg
ICAgICBzd2l0Y2ggKG1fa2luZCkgeworICAgICAgICBjYXNlIFRtcDoKKyAgICAgICAgY2FzZSBB
ZGRyOgorICAgICAgICAgICAgZnVuY3RvcihtX2Jhc2UpOworICAgICAgICAgICAgYnJlYWs7Cisg
ICAgICAgIGNhc2UgSW5kZXg6CisgICAgICAgICAgICBmdW5jdG9yKG1fYmFzZSk7CisgICAgICAg
ICAgICBmdW5jdG9yKG1faW5kZXgpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1
bHQ6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIFRoaXMg
aXMgc21hcnQgZW5vdWdoIHRvIGtub3cgdGhhdCBhbiBhZGRyZXNzIGFyZyBpbiBhIERlZiBvciBV
c2VEZWYgcnVsZSB3aWxsIHVzZSBpdHMKKyAgICAvLyB0bXBzIGFuZCBuZXZlciBkZWYgdGhlbS4g
Rm9yIGV4YW1wbGUsIHRoaXM6CisgICAgLy8KKyAgICAvLyBtb3YgJXJheCwgKCVyY3gpCisgICAg
Ly8KKyAgICAvLyBUaGlzIGRlZnMgKCVyY3gpIGJ1dCB1c2VzICVyY3guCisgICAgdGVtcGxhdGU8
dHlwZW5hbWUgRnVuY3Rvcj4KKyAgICB2b2lkIGZvckVhY2hUbXAoUm9sZSBhcmdSb2xlLCBUeXBl
IGFyZ1R5cGUsIGNvbnN0IEZ1bmN0b3ImIGZ1bmN0b3IpCisgICAgeworICAgICAgICBzd2l0Y2gg
KG1fa2luZCkgeworICAgICAgICBjYXNlIFRtcDoKKyAgICAgICAgICAgIGZ1bmN0b3IobV9iYXNl
LCBhcmdSb2xlLCBhcmdUeXBlKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEFk
ZHI6CisgICAgICAgICAgICBmdW5jdG9yKG1fYmFzZSwgVXNlLCBHUCk7CisgICAgICAgICAgICBi
cmVhazsKKyAgICAgICAgY2FzZSBJbmRleDoKKyAgICAgICAgICAgIGZ1bmN0b3IobV9iYXNlLCBV
c2UsIEdQKTsKKyAgICAgICAgICAgIGZ1bmN0b3IobV9pbmRleCwgVXNlLCBHUCk7CisgICAgICAg
ICAgICBicmVhazsKKyAgICAgICAgZGVmYXV0OgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAg
IH0KKyAgICB9CisKKyAgICBNYWNyb0Fzc2VtYmxlcjo6VHJ1c3RlZEltbTMyIGFzVHJ1c3RlZElt
bTMyKCkgY29uc3QKKyAgICB7CisgICAgICAgIEFTU0VSVChpc0ltbSgpKTsKKyAgICAgICAgcmV0
dXJuIE1hY3JvQXNzZW1ibGVyOjpUcnVzdGVkSW1tMzIoc3RhdGljX2Nhc3Q8aW50MzJfdD4obV9v
ZmZzZXQpKTsKKyAgICB9CisKKyNpZiBVU0UoSlNWQUxVRTY0KQorICAgIE1hY3JvQXNzZW1ibGVy
OjpUcnVzdGVkSW1tNjQgYXNUcnVzdGVkSW1tNjQoKSBjb25zdAorICAgIHsKKyAgICAgICAgQVNT
RVJUKGlzSW1tNjQoKSk7CisgICAgICAgIHJldHVybiBNYWNyb0Fzc2VtYmxlcjo6VHJ1c3RlZElt
bTY0KHBvaW50ZXJWYWx1ZSgpKTsKKyAgICB9CisjZW5kaWYKKworICAgIE1hY3JvQXNzZW1ibGVy
OjpBZGRyZXNzIGFzQWRkcmVzcygpIGNvbnN0CisgICAgeworICAgICAgICBBU1NFUlQoaXNBZGRy
KCkpOworICAgICAgICByZXR1cm4gTWFjcm9Bc3NlbWJsZXI6OkFkZHJlc3MobV9iYXNlLmdwcigp
LCBzdGF0aWNfY2FzdDxpbnQzMl90PihtX29mZnNldCkpOworICAgIH0KKworICAgIE1hY3JvQXNz
ZW1ibGVyOjpCYXNlSW5kZXggYXNCYXNlSW5kZXgoKSBjb25zdAorICAgIHsKKyAgICAgICAgQVNT
RVJUKGlzSW5kZXgoKSk7CisgICAgICAgIHJldHVybiBNYWNyb0Fzc2VtYmxlcjo6QmFzZUluZGV4
KAorICAgICAgICAgICAgbV9iYXNlLmdwcigpLCBtX2luZGV4LmdwcigpLCBzdGF0aWNfY2FzdDxN
YWNyb0Fzc2VtYmxlcjo6U2NhbGU+KGxvZ1NjYWxlKCkpLAorICAgICAgICAgICAgc3RhdGljX2Nh
c3Q8aW50MzJfdD4obV9vZmZzZXQpKTsKKyAgICB9CisKKyAgICBNYWNyb0Fzc2VtYmxlcjo6UmVs
YXRpb25hbENvbmRpdGlvbiBhc1JlbGF0aW9uYWxDb25kaXRpb24oKSBjb25zdAorICAgIHsKKyAg
ICAgICAgQVNTRVJUKGlzUmVsQ29uZCgpKTsKKyAgICAgICAgcmV0dXJuIHN0YXRpY19jYXN0PE1h
Y3JvQXNzZW1ibGVyOjpSZWxhdGlvbmFsQ29uZGl0aW9uPihtX29mZnNldCk7CisgICAgfQorCisg
ICAgTWFjcm9Bc3NlbWJsZXI6OlJlc3VsdENvbmRpdGlvbiBhc1Jlc3VsdENvbmRpdGlvbigpIGNv
bnN0CisgICAgeworICAgICAgICBBU1NFUlQoaXNSZXNDb25kKCkpOworICAgICAgICByZXR1cm4g
c3RhdGljX2Nhc3Q8TWFjcm9Bc3NlbWJsZXI6OlJlc3VsdENvbmRpdGlvbj4obV9vZmZzZXQpOwor
ICAgIH0KKworICAgIHZvaWQgZHVtcChQcmludFN0cmVhbSYpIGNvbnN0OworCitwcml2YXRlOgor
ICAgIGludDY0X3QgbV9vZmZzZXQgeyAwIH07CisgICAgS2luZCBtX2tpbmQgeyBJbW0gfTsKKyAg
ICBpbnQzMl90IG1fc2NhbGUgeyAxIH07CisgICAgQWlyOjpUbXAgbV9iYXNlOworICAgIEFpcjo6
VG1wIG1faW5kZXg7Cit9OworCit9IH0gfSAvLyBuYW1lc3BhY2UgSlNDOjpCMzo6QWlyCisKKyNl
bmRpZiAvLyBBaXJBcmdfaAorCkluZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvYWlyL0Fp
ckJhc2ljQmxvY2suY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9h
aXIvQWlyQmFzaWNCbG9jay5jcHAJKHJldmlzaW9uIDApCisrKyBTb3VyY2UvSmF2YVNjcmlwdENv
cmUvYjMvYWlyL0FpckJhc2ljQmxvY2suY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsNjEg
QEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTUgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2Vy
dmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkg
Zm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHBy
b3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4g
UmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5
cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xs
b3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBt
dXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlz
dCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAg
ICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUg
ZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUg
SU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMs
IElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElF
UyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVS
UE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IKKyAq
IENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVO
VEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElO
Q0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVU
RSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBP
UiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZ
CisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFks
IE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcg
SU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBB
RFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKworI2luY2x1
ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgIkFpckJhc2ljQmxvY2suaCIKKworI2luY2x1ZGUgIkIz
QmFzaWNCbG9ja1V0aWxzLmgiCisKK25hbWVzcGFjZSBKU0MgeyBuYW1lc3BhY2UgQjMgeyBuYW1l
c3BhY2UgQWlyIHsKKwordm9pZCBCYXNpY0Jsb2NrOjphZGRQcmVkZWNlc3NvcihCYXNpY0Jsb2Nr
KiBibG9jaykKK3sKKyAgICBCMzo6YWRkUHJlZGVjZXNzb3IodGhpcywgYmxvY2spOworfQorCit2
b2lkIEJhc2ljQmxvY2s6OnJlbW92ZVByZWRlY2Vzc29yKEJhc2ljQmxvY2sqIGJsb2NrKQorewor
ICAgIEIzOjpyZW1vdmVQcmVkZWNlc3Nvcih0aGlzLCBibG9jayk7Cit9CisKK3ZvaWQgQmFzaWNC
bG9jazo6cmVwbGFjZVByZWRlY2Vzc29yKEJhc2ljQmxvY2sqIGZyb20sIEJhc2ljQmxvY2sqIHRv
KQoreworICAgIEIzOjpyZXBsYWNlUHJlZGVjZXNzb3IodGhpcywgZnJvbSwgdG8pOworfQorCit2
b2lkIEJhc2ljQmxvY2s6OmR1bXAoUHJpbnRTdHJlYW0mIG91dCkgY29uc3QKK3sKKyAgICBvdXQu
cHJpbnQoZHVtcFByZWZpeCwgbV9pbmRleCk7Cit9CisKK3ZvaWQgQmFzaWNCbG9jazo6ZGVlcER1
bXAoUHJpbnRTdHJlYW0mIG91dCkgY29uc3QKK3sKKyAgICBvdXQucHJpbnQoIkJCIiwgKnRoaXMs
ICI6XG4iKTsKKyAgICBmb3IgKGNvbnN0IEluc3QmIGluc3QgOiAqdGhpcykKKyAgICAgICAgb3V0
LnByaW50KCIgICAgIiwgaW5zdCwgIlxuIik7Cit9CisKK30gfSB9IC8vIG5hbWVzcGFjZSBKU0M6
OkIzOjpBaXIKKwpJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL2Fpci9BaXJCYXNpY0Js
b2NrLmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL2Fpci9BaXJCYXNp
Y0Jsb2NrLmgJKHJldmlzaW9uIDApCisrKyBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvYWlyL0Fp
ckJhc2ljQmxvY2suaAkod29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDEzNCBAQAorLyoKKyAqIENv
cHlyaWdodCAoQykgMjAxNSBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICog
UmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBv
ciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0
aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlv
bnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAg
bm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFp
bWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNl
IHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlv
bnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRp
b24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24u
CisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIGBgQVMgSVMn
JyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBC
VVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5U
QUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVND
TEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUgorICogQ09OVFJJQlVUT1JT
IEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUws
CisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQg
Tk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNF
UlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElO
VEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJ
TElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICog
KElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9V
VCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhF
IFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLiAKKyAqLworCisjaWZuZGVmIEFpckJhc2ljQmxv
Y2tfaAorI2RlZmluZSBBaXJCYXNpY0Jsb2NrX2gKKworI2luY2x1ZGUgIkFpckluc3QuaCIKKyNp
bmNsdWRlIDx3dGYvTm9uQ29weWFibGUuaD4KKyNpbmNsdWRlIDx3dGYvRmFzdE1hbGxvYy5oPgor
CituYW1lc3BhY2UgSlNDIHsgbmFtZXNwYWNlIEIzIHsgbmFtZXNwYWNlIEFpciB7CisKK2NsYXNz
IENvZGU7CitjbGFzcyBJbnNlcnRpb25TZXQ7CisKK2NsYXNzIEJhc2ljQmxvY2sgeworICAgIFdU
Rl9NQUtFX05PTkNPUFlBQkxFKEJhc2ljQmxvY2spOworICAgIFdURl9NQUtFX0ZBU1RfQUxMT0NB
VEVEOworcHVibGljOgorICAgIHN0YXRpYyBjb25zdCBjaGFyKiBkdW1wUHJlZml4ID0gIiMiOwor
CisgICAgdHlwZWRlZiBWZWN0b3I8SW5zdD4gSW5zdExpc3Q7CisgICAgdHlwZWRlZiBWZWN0b3I8
QmFzaWNCbG9jayosIDI+IEFkamFjZW5jeUxpc3Q7CisgICAgCisgICAgdW5zaWduZWQgc2l6ZSgp
IGNvbnN0IHsgcmV0dXJuIG1faW5zdHMuc2l6ZSgpOyB9CisgICAgSW5zdExpc3Q6Oml0ZXJhdG9y
IGJlZ2luKCkgeyByZXR1cm4gbV9pbnN0cy5iZWdpbigpOyB9CisgICAgSW5zdExpc3Q6Oml0ZXJh
dG9yIGVuZCgpIHsgcmV0dXJuIG1faW5zdHMuZW5kKCk7IH0KKyAgICBJbnN0TGlzdDo6Y29uc3Rf
aXRlcmF0b3IgYmVnaW4oKSBjb25zdCB7IHJldHVybiBtX2luc3RzLmJlZ2luKCk7IH0KKyAgICBJ
bnN0TGlzdDo6Y29uc3RfaXRlcmF0b3IgZW5kKCkgY29uc3QgeyByZXR1cm4gbV9pbnN0cy5lbmQo
KTsgfQorCisgICAgc2l6ZV90IHNpemUoKSBjb25zdCB7IHJldHVybiBtX2luc3RzLnNpemUoKTsg
fQorICAgIGNvbnN0IEluc3QmIGF0KHNpemVfdCBpbmRleCkgY29uc3QgeyByZXR1cm4gbV9pbnN0
c1tpbmRleF07IH0KKyAgICBJbnN0JiBhdChzaXplX3QgaW5kZXgpIHsgcmV0dXJuIG1faW5zdHNb
aW5kZXhdOyB9CisKKyAgICBjb25zdCBJbnN0JiBsYXN0KCkgY29uc3QgeyByZXR1cm4gbV9pbnN0
cy5sYXN0KCk7IH0KKyAgICBJbnN0JiBsYXN0KCkgeyByZXR1cm4gbV9pbnN0cy5sYXN0KCk7IH0K
KworICAgIHRlbXBsYXRlPHR5cGVuYW1lIEluc3Q+CisgICAgdm9pZCBhcHBlbmRJbnN0KEluc3Qm
JiBpbnN0KQorICAgIHsKKyAgICAgICAgbV9pbnN0cy5hcHBlbmQoc3RkOjpmb3J3YXJkPEluc3Q+
KGluc3QpKTsKKyAgICB9CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZS4uLiBBcmd1bWVudHM+Cisg
ICAgdm9pZCBhcHBlbmQoQXJndW1lbnRzJiYuLi4gYXJndW1lbnRzKQorICAgIHsKKyAgICAgICAg
bV9pbnN0cy5hcHBlbmQoSW5zdChzdGQ6OmZvcndhcmQ8QXJndW1lbnRzPihhcmd1bWVudHMpLi4u
KSk7CisgICAgfQorCisgICAgLy8gVGhlICIwIiBjYXNlIGlzIHRoZSBjYXNlIHRvIHdoaWNoIHRo
ZSBicmFuY2gganVtcHMsIHNvIHRoZSAidGhlbiIgY2FzZS4gVGhlICIxIiBjYXNlIGlzIHRoZQor
ICAgIC8vICJlbHNlIiBjYXNlLCBhbmQgaXMgdXNlZCB0byByZXByZXNlbnQgdGhlIGZhbGwtdGhy
b3VnaCBvZiBhIGNvbmRpdGlvbmFsIGJyYW5jaC4KKyAgICB1bnNpZ25lZCBudW1TdWNjZXNzb3Jz
KCkgY29uc3QgeyByZXR1cm4gbV9zdWNjZXNzb3JzLnNpemUoKTsgfQorICAgIEJhc2ljQmxvY2sq
IHN1Y2Nlc3Nvcih1bnNpZ25lZCBpbmRleCkgY29uc3QgeyByZXR1cm4gbV9zdWNjZXNzb3JzW2lu
ZGV4XTsgfQorICAgIEJhc2ljQmxvY2sqJiBzdWNjZXNzb3IodW5zaWduZWQgaW5kZXgpIHsgcmV0
dXJuIG1fc3VjY2Vzc29yc1tpbmRleF07IH0KKyAgICBjb25zdCBBZGphY2VuY3lMaXN0JiBzdWNj
ZXNzb3JzKCkgY29uc3QgeyByZXR1cm4gbV9zdWNjZXNzb3JzW2luZGV4XTsgfQorICAgIEFkamFj
ZW5jeUxpc3QmIHN1Y2Nlc3NvcnMoKSB7IHJldHVybiBtX3N1Y2Nlc3NvcnNbaW5kZXhdOyB9CisK
KyAgICB1bnNpZ25lZCBudW1QcmVkZWNlc3NvcnMoKSBjb25zdCB7IHJldHVybiBtX3ByZWRlY2Vz
c29ycy5zaXplKCk7IH0KKyAgICBCYXNpY0Jsb2NrKiBwcmVkZWNlc3Nvcih1bnNpZ25lZCBpbmRl
eCkgY29uc3QgeyByZXR1cm4gbV9wcmVkZWNlc3NvcnNbaW5kZXhdOyB9CisgICAgQmFzaWNCbG9j
ayomIHByZWRlY2Vzc29yKHVuc2lnbmVkIGluZGV4KSB7IHJldHVybiBtX3ByZWRlY2Vzc29yc1tp
bmRleF07IH0KKyAgICBjb25zdCBBZGphY2VuY3lMaXN0JiBwcmVkZWNlc3NvcnMoKSBjb25zdCB7
IHJldHVybiBtX3ByZWRlY2Vzc29yc1tpbmRleF07IH0KKyAgICBBZGphY2VuY3lMaXN0JiBwcmVk
ZWNlc3NvcnMoKSB7IHJldHVybiBtX3ByZWRlY2Vzc29yc1tpbmRleF07IH0KKworICAgIHZvaWQg
YWRkUHJlZGVjZXNzb3IoQmFzaWNCbG9jayopOworICAgIHZvaWQgcmVtb3ZlUHJlZGVjZXNzb3Io
QmFzaWNCbG9jayopOworICAgIHZvaWQgcmVwbGFjZVByZWRlY2Vzc29yKEJhc2ljQmxvY2sqIGZy
b20sIEJhc2ljQmxvY2sqIHRvKTsKKworICAgIHZvaWQgZHVtcChQcmludFN0cmVhbSYpIGNvbnN0
OworICAgIHZvaWQgZGVlcER1bXAoUHJpbnRTdHJlYW0mKSBjb25zdDsKKworcHJpdmF0ZToKKyAg
ICBmcmllbmQgY2xhc3MgQ29kZTsKKyAgICBmcmllbmQgY2xhc3MgSW5zZXJ0aW9uU2V0OworICAg
IAorICAgIEJhc2ljQmxvY2sodW5zaWduZWQgaW5kZXgpCisgICAgeworICAgIH0KKworICAgIHVu
c2lnbmVkIG1faW5kZXg7CisgICAgSW5zdExpc3QgbV9pbnN0czsKKyAgICBBZGphY2VuY3lMaXN0
IG1fc3VjY2Vzc29yczsKKyAgICBBZGphY2VuY3lMaXN0IG1fcHJlZGVjZXNzb3JzOworfTsKKwor
Y2xhc3MgRGVlcEJhc2ljQmxvY2tEdW1wIHsKK3B1YmxpYzoKKyAgICBEZWVwQmFzaWNCbG9ja0R1
bXAoQmFzaWNCbG9jayogYmxvY2spCisgICAgICAgIDogbV9ibG9jayhibG9jaykKKyAgICB7Cisg
ICAgfQorCisgICAgdm9pZCBkdW1wKFByaW50U3RyZWFtJiBvdXQpIGNvbnN0CisgICAgeworICAg
ICAgICBpZiAobV9ibG9jaykKKyAgICAgICAgICAgIG1fYmxvY2stPmRlZXBEdW1wKG91dCk7Cisg
ICAgICAgIGVsc2UKKyAgICAgICAgICAgIG91dC5wcmludCgiPG51bGw+Iik7CisgICAgfQorCitw
cml2YXRlOgorICAgIEJhc2ljQmxvY2sqIG1fYmxvY2s7Cit9OworCitEZWVwQmFzaWNCbG9ja0R1
bXAgZGVlcER1bXAoQmFzaWNCbG9jayogYmxvY2spCit7CisgICAgcmV0dXJuIERlZXBCYXNpY0Js
b2NrRHVtcChibG9jayk7Cit9CisKK30gfSB9IC8vIG5hbWVzcGFjZSBKU0M6OkIzOjpBaXIKKwor
I2VuZGlmIC8vIEFpckJhc2ljQmxvY2tfaAorCkluZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUv
YjMvYWlyL0FpckNDYWxsU3BlY2lhbC5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL0phdmFTY3Jp
cHRDb3JlL2IzL2Fpci9BaXJDQ2FsbFNwZWNpYWwuY3BwCShyZXZpc2lvbiAwKQorKysgU291cmNl
L0phdmFTY3JpcHRDb3JlL2IzL2Fpci9BaXJDQ2FsbFNwZWNpYWwuY3BwCSh3b3JraW5nIGNvcHkp
CkBAIC0wLDAgKzEsMTQwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE1IEFwcGxlIEluYy4g
QWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNv
dXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwg
YXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICog
YXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFp
biB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRp
b25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMg
aW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAg
bm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFp
bWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHBy
b3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBS
T1ZJREVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1Q
TElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJ
TVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBB
UlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBB
UFBMRSBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJ
TkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVO
VElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVN
RU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBP
UgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBB
TkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBT
VFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RI
RVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09G
VFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0Uu
IAorICovCisKKyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJBaXJDQ2FsbFNwZWNpYWwu
aCIKKworbmFtZXNwYWNlIEpTQyB7IG5hbWVzcGFjZSBCMyB7IG5hbWVzcGFjZSBBaXIgeworCitD
Q2FsbFNwZWNpYWw6OkNDYWxsU3BlY2lhbCgpCit7CisgICAgbV9jbG9iYmVyZWRSZWdzID0gUmVn
aXN0ZXJTZXQ6OmFsbFJlZ2lzdGVycygpOworICAgIG1fY2xvYmJlcmVkUmVncy5leGNsdWRlKFJl
Z2lzdGVyU2V0OjpzdGFja1JlZ2lzdGVycygpKTsKKyAgICBtX2Nsb2JiZXJlZFJlZ3MuZXhjbHVk
ZShSZWdpc3RlclNldDo6cmVzZXJ2ZWRIYXJkd2FyZVJlZ2lzdGVycygpKTsKKyAgICBtX2Nsb2Ji
ZXJlZFJlZ3MuZXhjbHVkZShSZWdpc3RlclNldDo6Y2FsbGVlU2F2ZVJlZ2lzdGVycygpKTsKK30K
KworQ0NhbGxTcGVjaWFsOjp+Q0NhbGxTcGVjaWFsKCkKK3sKK30KKwordm9pZCBDQ2FsbFNwZWNp
YWw6OmZvckVhY2hBcmcoSW5zdCYgaW5zdCwgY29uc3QgU2NvcGVkTGFtYmRhPEluc3Q6OkVhY2hB
cmdDYWxsYmFjaz4mIGNhbGxiYWNrKQoreworICAgIGNhbGxiYWNrKGluc3QuYXJnc1sxXSwgQXJn
OjpVc2UsIEFyZzo6R1ApOworICAgIAorICAgIGZvciAodW5zaWduZWQgaSA9IDI7IGkgPCBpbnN0
LmFyZ3Muc2l6ZSgpOyArK2kpIHsKKyAgICAgICAgLy8gRm9yIHRoZSB0eXBlLCB3ZSBjYW4ganVz
dCBxdWVyeSB0aGUgYXJnJ3MgdHlwZS4gVGhlIGFyZyB3aWxsIGhhdmUgYSB0eXBlLCBiZWNhdXNl
IHdlCisgICAgICAgIC8vIHJlcXVpcmUgdGhlc2UgYXJncyB0byBiZSBhcmd1bWVudCByZWdpc3Rl
cnMuCisgICAgICAgIGNhbGxiYWNrKGluc3QuYXJnc1tpXSwgQXJnOjpVc2UsIGluc3QuYXJnc1tp
XS50eXBlKCkpOworICAgIH0KK30KKworYm9vbCBDQ2FsbFNwZWNpYWw6OmlzVmFsaWQoSW5zdCYg
aW5zdCkKK3sKKyAgICBpZiAoaW5zdC5hcmdzLnNpemUoKSA8IDIpCisgICAgICAgIHJldHVybiBm
YWxzZTsKKworICAgIHN3aXRjaCAoaW5zdC5hcmdzWzFdLmtpbmQoKSkgeworICAgIGNhc2UgQXJn
OjpJbW06CisgICAgICAgIGlmIChzaXplb2Yodm9pZCopID09IDQpCisgICAgICAgICAgICBicmVh
azsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIGNhc2UgQXJnOjpJbW02NDoKKyAgICAgICAg
aWYgKHNpemVvZih2b2lkKikgPT0gOCkKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICByZXR1
cm4gZmFsc2U7CisgICAgY2FzZSBBcmc6OlRtcDoKKyAgICBjYXNlIEFyZzo6QWRkcjoKKyAgICBj
YXNlIEFyZzo6U3RhY2s6CisgICAgY2FzZSBBcmc6OkNhbGxBcmc6CisgICAgICAgIGJyZWFrOwor
ICAgIGRlZmF1bHQ6CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBpZiAoIWlu
c3QuYXJnc1sxXS5pc0dQKCkpCisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgIGZvciAodW5z
aWduZWQgaSA9IDI7IGkgPCBpbnN0LmFyZ3Muc2l6ZSgpOyArK2kpIHsKKyAgICAgICAgaWYgKCFp
bnN0LmFyZ3NbaV0uaXNSZWcoKSkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgICAg
ICBpZiAoaW5zdC5hcmdzW2ldID09IFRtcChzY3JhdGNoUmVnaXN0ZXIpKQorICAgICAgICAgICAg
cmV0dXJuICBmYWxzZTsKKyAgICB9CisgICAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgQ0NhbGxT
cGVjaWFsOjphZG1pdHNTdGFjayhJbnN0JiwgdW5zaWduZWQgYXJnSW5kZXgpCit7CisgICAgLy8g
QXJnIDEgY2FuIGJlIGEgc3RhY2sgYWRkcmVzcyBmb3Igc3VyZS4KKyAgICBpZiAoYXJnSW5kZXgg
PT0gMSkKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgCisgICAgcmV0dXJuIGZhbHNlOworfQor
Cit2b2lkIENDYWxsU3BlY2lhbDo6cmVwb3J0VXNlZFJlZ2lzdGVycyhJbnN0JiwgY29uc3QgUmVn
aXN0ZXJTZXQmKQoreworfQorCitDQ2FsbEhlbHBlcnM6Okp1bXAgQ0NhbGxTcGVjaWFsOjpnZW5l
cmF0ZShJbnN0JiBpbnN0LCBDQ2FsbEhlbHBlcnMmIGppdCwgR2VuZXJhdGlvbkNvbnRleHQmKQor
eworICAgIHN3aXRjaCAoaW5zdC5hcmdzWzFdLmtpbmQoKSkgeworICAgIGNhc2UgQXJnOjpJbW06
CisgICAgY2FzZSBBcmc6OkltbVB0cjoKKyAgICAgICAgaml0Lm1vdmUoQ0NhbGxIZWxwZXJzOjpU
cnVzdGVkSW1tUHRyKGluc3QuYXJnc1sxXS5wb2ludGVyVmFsdWUoKSksIHNjcmF0Y2hSZWdpc3Rl
cik7CisgICAgICAgIGppdC5jYWxsKHNjcmF0Y2hSZWdpc3Rlcik7CisgICAgICAgIGJyZWFrOwor
ICAgIGNhc2UgQXJnOjpUbXA6CisgICAgICAgIGppdC5jYWxsKGluc3QuYXJnc1sxXS5ncHIoKSk7
CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQXJnOjpBZGRyOgorICAgICAgICBqaXQuY2FsbChp
bnN0LmFyZ3NbMV0uYXNBZGRyZXNzKCkpOworICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0Ogor
ICAgICAgICBSRUxFQVNFX0FTU0VSVF9OT1RfUkVBQ0hFRCgpOworICAgICAgICBicmVhazsKKyAg
ICB9CisgICAgcmV0dXJuIENDYWxsSGVscGVyczo6SnVtcCgpOworfQorCitjb25zdCBSZWdpc3Rl
clNldCYgQ0NhbGxTcGVjaWFsOjpleHRyYUNsb2JiZXJlZFJlZ3MoKQoreworICAgIHJldHVybiBt
X2Nsb2JiZXJlZFJlZ3M7Cit9CisKK3ZvaWQgQ0NhbGxTcGVjaWFsOjpkdW1wSW1wbChQcmludFN0
cmVhbSYgb3V0KSBjb25zdAoreworICAgIG91dC5wcmludCgiQ0NhbGwiKTsKK30KKwordm9pZCBD
Q2FsbFNwZWNpYWw6OmRlZXBEdW1wSW1wbChQcmludFN0cmVhbSYgb3V0KSBjb25zdAoreworICAg
IG91dC5wcmludCgiZnVuY3Rpb24gY2FsbCB0aGF0IHVzZXMgdGhlIEMgY2FsbGluZyBjb252ZW50
aW9uLiIpOworfQorCit9IH0gfSAvLyBuYW1lc3BhY2UgSlNDOjpCMzo6QWlyCisKSW5kZXg6IFNv
dXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9haXIvQWlyQ0NhbGxTcGVjaWFsLmgKPT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQot
LS0gU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL2Fpci9BaXJDQ2FsbFNwZWNpYWwuaAkocmV2aXNp
b24gMCkKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9haXIvQWlyQ0NhbGxTcGVjaWFsLmgJ
KHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSw2OCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAx
NSBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24g
YW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBt
b2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNv
bmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNv
ZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxp
c3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVk
aXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5
cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xs
b3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVy
IG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBT
T0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBF
WFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQg
VE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklU
TkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8g
RVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1Ig
QU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlks
IE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8s
CisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9G
IFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9X
RVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJ
TiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdM
SUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisg
KiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9G
IFNVQ0ggREFNQUdFLiAKKyAqLworCisjaWZuZGVmIEFpckNDYWxsU3BlY2lhbF9oCisjZGVmaW5l
IEFpckNDYWxsU3BlY2lhbF9oCisKK25hbWVzcGFjZSBKU0MgeyBuYW1lc3BhY2UgQjMgeyBuYW1l
c3BhY2UgQWlyIHsKKworLy8gVXNlIHRoaXMgc3BlY2lhbCBmb3IgY29uc3RydWN0aW5nIGEgQyBj
YWxsLiBBcmcgMCBpcyBvZiBjb3Vyc2UgYSBTcGVjaWFsIGFyZyB0aGF0IHJlZmVycyB0byB0aGUK
Ky8vIENDYWxsU3BlY2lhbCBvYmplY3QuIEFyZyAxIGlzIHRoZSBjYWxsZWUsIGFuZCBpdCBjYW4g
YmUgYW4gSW1tUHRyLCBhIHJlZ2lzdGVyLCBvciBhbiBhZGRyZXNzLiBUaGUKKy8vIHJlbWFpbmlu
ZyBhcmdzIGFyZSBqdXN0IHRoZSBzZXQgb2YgYXJndW1lbnQgcmVnaXN0ZXJzIHVzZWQgYnkgdGhp
cyBjYWxsLiBGb3IgYXJndW1lbnRzIHRoYXQgZ28gdG8KKy8vIHRoZSBzdGFjaywgeW91IGhhdmUg
dG8gZG8gdGhlIGdydW50IHdvcmsgb2YgZG9pbmcgdGhvc2Ugc3RhY2sgc3RvcmVzLiBJbiBmYWN0
LCB0aGUgb25seSByZWFzb24gd2h5CisvLyB3ZSBzcGVjaWZ5IHRoZSBhcmd1bWVudCByZWdpc3Rl
cnMgYXMgYXJndW1lbnRzIHRvIGEgY2FsbCBpcyBzbyB0aGF0IHRoZSBsaXZlbmVzcyBhbmFseXNp
cyBjYW4gc2VlCisvLyB0aGF0IHRoZXkgZ2V0IHVzZWQgaGVyZS4gSXQgd291bGQgYmUgd3Jvbmcg
dG8gYXV0b21hZ2ljYWxseSByZXBvcnQgYWxsIGFyZ3VtZW50IHJlZ2lzdGVycyBhcyBiZWluZwor
Ly8gdXNlZCBiZWNhdXNlIGlmIHdlIGhhZCBhIGNhbGwgdGhhdCBkaWRuJ3QgcGFzcyB0aGVtLCB0
aGVuIHRoZXknZCBhcHBlYXIgdG8gYmUgbGl2ZSB1bnRpbCBzb21lCisvLyBjbG9iYmVyIHBvaW50
IG9yIHRoZSBwcm9sb2d1ZSwgd2hpY2hldmVyIGhhcHBlbmVkIHNvb25lci4KKworY2xhc3MgQ0Nh
bGxTcGVjaWFsIDogcHVibGljIFNwZWNpYWwgeworcHVibGljOgorICAgIENDYWxsU3BlY2lhbCgp
OworICAgIH5DQ2FsbFNwZWNpYWwoKTsKKworICAgIC8vIFlvdSBjYW5ub3QgdXNlIHRoaXMgcmVn
aXN0ZXIgdG8gcGFzcyBhcmd1bWVudHMuIEl0IGp1c3Qgc28gaGFwcGVucyB0aGF0IHRoaXMgcmVn
aXN0ZXIgaXMgbm90CisgICAgLy8gdXNlZCBmb3IgYXJndW1lbnRzIGluIHRoZSBDIGNhbGxpbmcg
Y29udmVudGlvbi4gQnkgdGhlIHdheSwgdGhpcyBpcyB0aGUgb25seSB0aGluZyB0aGF0IGNhdXNl
cworICAgIC8vIHRoaXMgc3BlY2lhbCB0byBiZSBzcGVjaWZpYyB0byBDIGNhbGxzLgorICAgIHN0
YXRpYyBjb25zdCBHUFJSZWcgc2NyYXRjaFJlZ2lzdGVyID0gR1BSSW5mbzo6bm9uQXJnR1BSMC4K
KworcHJvdGVjdGVkOgorICAgIHZvaWQgZm9yRWFjaEFyZyhJbnN0JiwgY29uc3QgU2NvcGVkTGFt
YmRhPEluc3Q6OkVhY2hBcmdDYWxsYmFjaz4mKSBvdmVycmlkZTsKKyAgICBib29sIGlzVmFsaWQo
SW5zdCYpIG92ZXJyaWRlOworICAgIGJvb2wgYWRtaXRzU3RhY2soSW5zdCYsIHVuc2lnbmVkIGFy
Z0luZGV4KSBvdmVycmlkZTsKKyAgICB2b2lkIHJlcG9ydFVzZWRSZWdpc3RlcnMoSW5zdCYsIGNv
bnN0IFJlZ2lzdGVyU2V0Jikgb3ZlcnJpZGU7CisgICAgQ0NhbGxIZWxwZXJzOjpKdW1wIGdlbmVy
YXRlKEluc3QmLCBDQ2FsbEhlbHBlcnMmLCBHZW5lcmF0aW9uQ29udGV4dCYpIG92ZXJyaWRlOwor
ICAgIGNvbnN0IFJlZ2lzdGVyU2V0JiBleHRyYUNsb2JiZXJlZFJlZ3MoSW5zdCYpIG92ZXJyaWRl
OworCisgICAgdm9pZCBkdW1wSW1wbChQcmludFN0cmVhbSYpIGNvbnN0IG92ZXJyaWRlOworICAg
IHZvaWQgZGVlcER1bXBJbXBsKFByaW50U3RyZWFtJikgY29uc3Qgb3ZlcnJpZGU7CisKK3ByaXZh
dGU6CisgICAgUmVnaXN0ZXJTZXQgbV9jbG9iYmVyZWRSZWdzOworfTsKKworfSB9IH0gLy8gbmFt
ZXNwYWNlIEpTQzo6QjM6OkFpcgorCisjZW5kaWYgLy8gQWlyQ0NhbGxTcGVjaWFsX2gKKwpJbmRl
eDogU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL2Fpci9BaXJDb2RlLmNwcAo9PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0t
LSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvYWlyL0FpckNvZGUuY3BwCShyZXZpc2lvbiAwKQor
KysgU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL2Fpci9BaXJDb2RlLmNwcAkod29ya2luZyBjb3B5
KQpAQCAtMCwwICsxLDY0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE1IEFwcGxlIEluYy4g
QWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNv
dXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwg
YXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICog
YXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFp
biB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRp
b25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMg
aW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAg
bm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFp
bWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHBy
b3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBS
T1ZJREVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1Q
TElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJ
TVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBB
UlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBB
UFBMRSBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJ
TkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVO
VElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVN
RU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBP
UgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBB
TkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBT
VFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RI
RVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09G
VFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0Uu
IAorICovCisKKyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJBaXJDb2RlLmgiCisKK25h
bWVzcGFjZSBKU0MgeyBuYW1lc3BhY2UgQjMgeyBuYW1lc3BhY2UgQWlyIHsKKworQ29kZTo6Q29k
ZSgpCit7Cit9CisKK0NvZGU6On5Db2RlKCkKK3sKK30KKworQmFzaWNCbG9jayogQ29kZTo6YWRk
QmxvY2soKQoreworICAgIHN0ZDo6dW5pcXVlX3B0cjxCYXNpY0Jsb2NrPiBibG9jayhuZXcgQmFz
aWNCbG9jayhtX2Jsb2Nrcy5zaXplKCkpKTsKKyAgICBCYXNpY0Jsb2NrKiByZXN1bHQgPSBibG9j
ay5nZXQoKTsKKyAgICBtX2Jsb2Nrcy5hcHBlbmQoV1RGOjptb3ZlKGJsb2NrKSk7CisgICAgcmV0
dXJuIHJlc3VsdDsKK30KKwordm9pZCBDb2RlOjpkdW1wKFByaW50U3RyZWFtJiBvdXQpIGNvbnN0
Cit7CisgICAgZm9yIChCYXNpY0Jsb2NrKiBibG9jayA6ICp0aGlzKQorICAgICAgICBvdXQucHJp
bnQoZGVlcER1bXAoYmxvY2spKTsKKyAgICBpZiAobnVtU3RhY2tTbG90cygpKSB7CisgICAgICAg
IG91dC5wcmludCgiU3RhY2sgc2xvdHM6XG4iKTsKKyAgICAgICAgZm9yIChTdGFja1Nsb3QqIHNs
b3QgOiBzdGFja1Nsb3RzKCkpCisgICAgICAgICAgICBvdXQucHJpbnQoIiAgICAiLCBkZWVwRHVt
cChzbG90KSwgIlxuIik7CisgICAgfQorICAgIGlmIChudW1TcGVjaWFscygpKSB7CisgICAgICAg
IG91dC5wcmludCgiU3BlY2lhbHM6XG4iKTsKKyAgICAgICAgZm9yIChTcGVjaWFsKiBzcGVjaWFs
IDogc3BlY2lhbHMoKSkKKyAgICAgICAgICAgIG91dC5wcmludCgiICAgICIsIGRlZXBEdW1wKHNw
ZWNpYWwpLCAiXG4iKTsKKyAgICB9Cit9CisKK30gfSB9IC8vIG5hbWVzcGFjZSBKU0M6OkIzOjpB
aXIKKwpJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL2Fpci9BaXJDb2RlLmgKPT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL2Fpci9BaXJDb2RlLmgJKHJldmlzaW9u
IDApCisrKyBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvYWlyL0FpckNvZGUuaAkod29ya2luZyBj
b3B5KQpAQCAtMCwwICsxLDE0OSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNSBBcHBsZSBJ
bmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBp
biBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRp
b24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMK
KyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCBy
ZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29u
ZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRp
b25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAq
ICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlz
Y2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFs
cyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJ
UyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9S
IElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQor
ICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1Ig
QSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hB
TEwgQVBQTEUgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVD
VCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNF
UVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9D
VVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFU
QSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVT
RUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFD
VCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9S
IE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElT
IFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFN
QUdFLiAKKyAqLworCisjaWZuZGVmIEFpckNvZGVfaAorI2RlZmluZSBBaXJDb2RlX2gKKworI2lu
Y2x1ZGUgIkFpckJhc2ljQmxvY2suaCIKKyNpbmNsdWRlICJBaXJTcGVjaWFsLmgiCisjaW5jbHVk
ZSAiQWlyU3RhY2tTbG90LmgiCisKK25hbWVzcGFjZSBKU0MgeyBuYW1lc3BhY2UgQjMgeworCitj
bGFzcyBQcm9jZWR1cmU7CisKK25hbWVzcGFjZSBBaXIgeworCisvLyBUaGlzIGlzIGFuIElSIHRo
YXQgaXMgdmVyeSBjbG9zZSB0byB0aGUgYmFyZSBtZXRhbC4gSXQgcmVxdWlyZXMgYWJvdXQgNDB4
IG1vcmUgYnl0ZXMgdGhhbiB0aGUKKy8vIGdlbmVyYXRlZCBtYWNoaW5lIGNvZGUgLSBmb3IgZXhh
bXBsZSBpZiB5b3UncmUgZ2VuZXJhdGluZyAxTUIgb2YgbWFjaGluZSBjb2RlLCB5b3UgbmVlZCBh
Ym91dAorLy8gNDBNQiBvZiBBaXIuCisKK2NsYXNzIENvZGUgeworICAgIFdURl9NQUtFX05PTkNP
UFlBQkxFKENvZGUpOworICAgIFdURl9NQUtFX0ZBU1RfQUxMT0NBVEVEOworcHVibGljOgorICAg
IENvZGUoKTsKKyAgICB+Q29kZSgpOworCisgICAgQmFzaWNCbG9jayogYWRkQmxvY2soKTsKKwor
ICAgIFN0YWNrU2xvdCogYWRkU3RhY2tTbG90KHVuc2lnbmVkIGJ5dGVTaXplLCBTdGFja1Nsb3RL
aW5kLCBTdGFja1Nsb3RWYWx1ZSogPSBudWxscHRyKTsKKworICAgIFNwZWNpYWwqIGFkZFNwZWNp
YWwoc3RkOjp1bmlxdWVfcHRyPFNwZWNpYWw+KTsKKworICAgIC8vIFRoaXMgaXMgdGhlIHNwZWNp
YWwgeW91IG5lZWQgdG8gbWFrZSBhIEMgY2FsbCEKKyAgICBTcGVjaWFsKiBjQ2FsbFNwZWNpYWwo
KTsKKworICAgIFRtcCBuZXdUbXAoQXJnOjpUeXBlIHR5cGUpCisgICAgeworICAgICAgICBzd2l0
Y2ggKHR5cGUpIHsKKyAgICAgICAgY2FzZSBBcmc6OkdQOgorICAgICAgICAgICAgcmV0dXJuIFRt
cDo6Z3BUbXBGb3JJbmRleChtX251bUdQVG1wcysrKTsKKyAgICAgICAgY2FzZSBBcmc6OkZQOgor
ICAgICAgICAgICAgcmV0dXJuIFRtcDo6ZnBUbXBGb3JJbmRleChtX251bUZQVG1wcysrKTsKKyAg
ICAgICAgfQorICAgIH0KKworICAgIHVuc2lnbmVkIG51bVRtcHMoQXJnOjpUeXBlIHR5cGUpCisg
ICAgeworICAgICAgICBzd2l0Y2ggKHR5cGUpIHsKKyAgICAgICAgY2FzZSBBcmc6OkdQOgorICAg
ICAgICAgICAgcmV0dXJuIG1fbnVtR1BUbXBzOworICAgICAgICBjYXNlIEFyZzo6RlA6CisgICAg
ICAgICAgICByZXR1cm4gbV9udW1GUFRtcHM7CisgICAgICAgIH0KKyAgICB9CisKKyAgICB2b2lk
IGR1bXAoUHJpbnRTdHJlYW0mKSBjb25zdDsKKworICAgIHVuc2lnbmVkIHNpemUoKSBjb25zdCB7
IHJldHVybiBtX2Jsb2Nrcy5zaXplKCk7IH0KKyAgICBCYXNpY0Jsb2NrKiBhdCh1bnNpZ25lZCBp
bmRleCkgY29uc3QgeyByZXR1cm4gbV9ibG9ja3NbaW5kZXhdOyB9CisgICAgQmFzaWNCbG9jayog
b3BlcmF0b3JbXSh1bnNpZ25lZCBpbmRleCkgY29uc3QgeyByZXR1cm4gYXQoaW5kZXgpOyB9CisK
KyAgICBjbGFzcyBpdGVyYXRvciB7CisgICAgcHVibGljOgorICAgICAgICBpdGVyYXRvcigpOgor
ICAgICAgICAgICAgOiBtX3Byb2NlZHVyZShudWxscHRyKQorICAgICAgICAgICAgLCBtX2luZGV4
KDApCisgICAgICAgIHsKKyAgICAgICAgfQorCisgICAgICAgIGl0ZXJhdG9yKFByb2NlZHVyZSYg
cHJvY2VkdXJlLCB1bnNpZ25lZCBpbmRleCkKKyAgICAgICAgICAgIDogbV9wcm9jZWR1cmUoJnBy
b2NlZHVyZSkKKyAgICAgICAgICAgICwgbV9pbmRleChpbmRleCkKKyAgICAgICAgeworICAgICAg
ICB9CisKKyAgICAgICAgQmFzaWNCbG9jayogb3BlcmF0b3IqKCkKKyAgICAgICAgeworICAgICAg
ICAgICAgcmV0dXJuIG1fcHJvY2VkdXJlLT5hdChtX2luZGV4KTsKKyAgICAgICAgfQorCisgICAg
ICAgIGl0ZXJhdG9yJiBvcGVyYXRvcisrKCkKKyAgICAgICAgeworICAgICAgICAgICAgbV9pbmRl
eCA9IGZpbmROZXh0KG1faW5kZXggKyAxKTsKKyAgICAgICAgICAgIHJldHVybiAqdGhpczsKKyAg
ICAgICAgfQorCisgICAgICAgIGJvb2wgb3BlcmF0b3I9PShjb25zdCBpdGVyYXRvciYgb3RoZXIp
IGNvbnN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBtX2luZGV4ID09IG90aGVyLm1f
aW5kZXg7CisgICAgICAgIH0KKworICAgICAgICBib29sIG9wZXJhdG9yIT0oY29uc3QgaXRlcmF0
b3ImIG90aGVyKSBjb25zdAorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gISgqdGhpcyA9
PSBvdGhlcik7CisgICAgICAgIH0KKworICAgIHByaXZhdGU6CisgICAgICAgIHVuc2lnbmVkIGZp
bmROZXh0KHVuc2lnbmVkIGluZGV4KQorICAgICAgICB7CisgICAgICAgICAgICB3aGlsZSAoaW5k
ZXggPCBtX3Byb2NlZHVyZS0+c2l6ZSgpICYmICFtX3Byb2NlZHVyZS0+YXQoaW5kZXgpKQorICAg
ICAgICAgICAgICAgIGluZGV4Kys7CisgICAgICAgICAgICByZXR1cm4gaW5leDsKKyAgICAgICAg
fQorCisgICAgICAgIFByb2NlZHVyZSogbV9wcm9jZWR1cmU7CisgICAgICAgIHVuc2lnbmVkIG1f
aW5kZXg7CisgICAgfTsKKworICAgIGl0ZXJhdG9yIGJlZ2luKCkgY29uc3QgeyByZXR1cm4gaXRl
cmF0b3IoKnRoaXMsIDApOyB9CisgICAgaXRlcmF0b3IgZW5kKCkgY29uc3QgeyByZXR1cm4gaXRl
cmF0b3IoKnRoaXMsIG51bUJsb2NrcygpKTsgfQorCitwcml2YXRlOgorICAgIFZlY3RvcjxzdGQ6
OnVuaXF1ZV9wdHI8U3RhY2tTbG90Pj4gbV9zdGFja1Nsb3RzOworICAgIFZlY3RvcjxzdGQ6OnVu
aXF1ZV9wdHI8QmFzaWNCbG9jaz4+IG1fYmxvY2tzOworICAgIFZlY3RvcjxzdGQ6OnVuaXF1ZV9w
dHI8U3BlY2lhbD4+IG1fc3BlY2lhbHM7CisgICAgU3BlY2lhbCogbV9jYWxsU3BlY2lhbCB7IG51
bGxwdHIgfTsKKyAgICB1bnNpZ25lZCBtX251bUdQVG1wcyB7IDAgfTsKKyAgICB1bnNpZ25lZCBt
X251bUZQVG1wcyB7IDAgfTsKK3B1YmxpYzoKKyAgICB1bnNpZ25lZCBmcmFtZVNpemU7Cit9Owor
Cit9IH0gfSAvLyBuYW1lc3BhY2UgSlNDOjpCMzo6QWlyCisKKyNlbmRpZiAvLyBBaXJDb2RlX2gK
KwpJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL2Fpci9BaXJHZW5lcmF0aW9uQ29udGV4
dC5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9haXIvQWlyR2VuZXJh
dGlvbkNvbnRleHQuaAkocmV2aXNpb24gMCkKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9h
aXIvQWlyR2VuZXJhdGlvbkNvbnRleHQuaAkod29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDQzIEBA
CisvKgorICogQ29weXJpZ2h0IChDKSAyMDE1IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZl
ZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZv
cm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92
aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJl
ZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJp
Z2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93
aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVz
dCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qg
b2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAg
ZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRp
c3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElO
Qy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJ
TkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMg
T0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBP
U0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SCisgKiBD
T05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRB
TCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNM
VURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUg
R09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1Ig
QlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQor
ICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBP
UiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElO
IEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURW
SVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisKKyNpZm5kZWYg
QWlyR2VuZXJhdGlvbkNvbnRleHRfaAorI2RlZmluZSBBaXJHZW5lcmF0aW9uQ29udGV4dF9oCisK
KyNpbmNsdWRlIDx3dGYvU2hhcmVkVGFzay5oPgorCituYW1lc3BhY2UgSlNDIHsgbmFtZXNwYWNl
IEIzIHsgbmFtZXNwYWNlIEFpciB7CisKK3N0cnVjdCBHZW5lcmF0aW9uQ29udGV4dCB7CisgICAg
dHlwZWRlZiB2b2lkIExhdGVQYXRoRnVuY3Rpb24oQ0NhbGxIZWxwZXJzJiwgR2VuZXJhdGlvbkNv
bnRleHQmKTsKKyAgICB0eXBlZGVmIFNoYXJlZFRhc2s8TGF0ZVBhdGhGdW5jdGlvbj4gTGF0ZVBh
dGg7CisKKyAgICBWZWN0b3I8UmVmUHRyPExhdGVQYXRoPj4gbGF0ZVBhdGhzOworfTsKKworfSB9
IH0gLy8gbmFtZXNwYWNlIEpTQzo6QjM6OkFpcgorCisjZW5kaWYgLy8gQWlyR2VuZXJhdGlvbkNv
bnRleHRfaAorCkluZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvYWlyL0Fpckluc2VydGlv
blNldC5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL2Fpci9BaXJJ
bnNlcnRpb25TZXQuY3BwCShyZXZpc2lvbiAwKQorKysgU291cmNlL0phdmFTY3JpcHRDb3JlL2Iz
L2Fpci9BaXJJbnNlcnRpb25TZXQuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsMzkgQEAK
Ky8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTUgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVk
LgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9y
bXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3Zp
ZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVk
aXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmln
aHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dp
bmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0
IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBv
ZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBk
b2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlz
dHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5D
LiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElO
Q0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBP
RiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9T
RSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IKKyAqIENP
TlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFM
LCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xV
RElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBH
T09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBC
VVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisg
KiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9S
IFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4g
QU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJ
U0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKworI2luY2x1ZGUg
ImNvbmZpZy5oIgorI2luY2x1ZGUgIkFpckluc2VydGlvblNldC5oIgorCisjaW5jbHVkZSAiQWly
QmFzaWNCbG9jay5oIgorCituYW1lc3BhY2UgSlNDIHsgbmFtZXNwYWNlIEIzIHsgbmFtZXNwYWNl
IEFpciB7CisKK3ZvaWQgSW5zZXJ0aW9uU2V0OjpleGVjdXRlKEJhc2ljQmxvY2sqIGJsb2NrKQor
eworICAgIGV4ZWN1dGVJbnNlcnRpb25zKGJsb2NrLT5tX2luc3RzLCBtX2luc2VydGlvbnMpOwor
fQorCit9IH0gfSAvLyBuYW1lc3BhY2UgSlNDOjpCMzo6QWlyCisKSW5kZXg6IFNvdXJjZS9KYXZh
U2NyaXB0Q29yZS9iMy9haXIvQWlySW5zZXJ0aW9uU2V0LmgKPT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNl
L0phdmFTY3JpcHRDb3JlL2IzL2Fpci9BaXJJbnNlcnRpb25TZXQuaAkocmV2aXNpb24gMCkKKysr
IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9haXIvQWlySW5zZXJ0aW9uU2V0LmgJKHdvcmtpbmcg
Y29weSkKQEAgLTAsMCArMSw3NyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNSBBcHBsZSBJ
bmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBp
biBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRp
b24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMK
KyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCBy
ZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29u
ZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRp
b25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAq
ICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlz
Y2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFs
cyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJ
UyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9S
IElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQor
ICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1Ig
QSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hB
TEwgQVBQTEUgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVD
VCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNF
UVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9D
VVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFU
QSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVT
RUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFD
VCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9S
IE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElT
IFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFN
QUdFLiAKKyAqLworCisjaWZuZGVmIEFpckluc2VydGlvblNldF9oCisjZGVmaW5lIEFpckluc2Vy
dGlvblNldF9oCisKKyNpbmNsdWRlICJBaXJJbnN0LmgiCisjaW5jbHVkZSA8d3RmL0luc2VydGlv
bi5oPgorI2luY2x1ZGUgPHd0Zi9WZWN0b3IuaD4KKworbmFtZXNwYWNlIEpTQyB7IG5hbWVzcGFj
ZSBCMyB7IG5hbWVzcGFjZSBBaXIgeworCitjbGFzcyBCYXNpY0Jsb2NrOworY2xhc3MgQ29kZTsK
KwordHlwZWRlZiBXVEY6Okluc2VydGlvbjxJbnN0PiBJbnNlcnRpb247CisKK2NsYXNzIEluc2Vy
dGlvblNldCB7CitwdWJsaWM6CisgICAgSW5zZXJ0aW9uU2V0KENvZGUmIGNvZGUpCisgICAgICAg
IDogbV9jb2RlKGNvZGUpCisgICAgeworICAgIH0KKworICAgIENvZGUmIGNvZGUoKSB7IHJldHVy
biBtX2NvZGU7IH0KKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+CisgICAgdm9pZCBhcHBlbmRJ
bnNlcnRpb24oVCYmIGluc2VydGlvbikKKyAgICB7CisgICAgICAgIG1faW5zZXJ0aW9ucy5hcHBl
bmQoc3RkOjpmb3J3YXJkPFQ+KGluc2VydGlvbikpOworICAgIH0KKworICAgIHRlbXBsYXRlPHR5
cGVuYW1lIEluc3Q+CisgICAgdm9pZCBpbnNlcnRJbnN0KHNpemVfdCBpbmRleCwgSW5zdCYmIGlu
c3QpCisgICAgeworICAgICAgICBhcHBlbmRJbnNlcnRpb24oSW5zZXJ0aW9uKGluZGV4LCBzdGQ6
OmZvcndhcmQ8SW5zdD4oaW5zdCkpKTsKKyAgICB9CisgICAgCisgICAgdGVtcGxhdGU8dHlwZW5h
bWUuLi4gQXJndW1lbnRzPgorICAgIHZvaWQgaW5zZXJ0KHNpemVfdCBpbmRleCwgQXJndW1lbnRz
JiYuLi4gYXJndW1lbnRzKQorICAgIHsKKyAgICAgICAgaW5zZXJ0SW5zdChpbmRleCwgSW5zdChz
dGQ6OmZvcndhcmQ8QXJndW1lbnRzPihhcmd1bWVudHMpLi4uKSk7CisgICAgfQorCisgICAgdm9p
ZCBleGVjdXRlKEJhc2ljQmxvY2sqKTsKKworcHJpdmF0ZToKKyAgICBDb2RlJiBtX2NvZGU7Cisg
ICAgVmVjdG9yPEluc2VydGlvbiwgOD4gbV9pbnNlcnRpb25zOworfTsKKworfSB9IH0gLy8gbmFt
ZXNwYWNlIEpTQzo6QjM6OkFpcgorCisjZW5kaWYgLy8gQWlySW5zZXJ0aW9uU2V0X2gKKwpJbmRl
eDogU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL2Fpci9BaXJJbnN0LmNwcAo9PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0t
LSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvYWlyL0Fpckluc3QuY3BwCShyZXZpc2lvbiAwKQor
KysgU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL2Fpci9BaXJJbnN0LmNwcAkod29ya2luZyBjb3B5
KQpAQCAtMCwwICsxLDQwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE1IEFwcGxlIEluYy4g
QWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNv
dXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwg
YXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICog
YXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFp
biB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRp
b25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMg
aW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAg
bm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFp
bWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHBy
b3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBS
T1ZJREVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1Q
TElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJ
TVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBB
UlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBB
UFBMRSBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJ
TkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVO
VElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVN
RU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBP
UgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBB
TkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBT
VFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RI
RVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09G
VFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0Uu
IAorICovCisKKyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJBaXJJbnN0LmgiCisKKyNp
bmNsdWRlICJCM1ZhbHVlLmgiCisjaW5jbHVkZSA8d3RmL0xpc3REdW1wLmg+CisKK25hbWVzcGFj
ZSBKU0MgeyBuYW1lc3BhY2UgQjMgeyBuYW1lc3BhY2UgQWlyIHsKKwordm9pZCBJbnN0OjpkdW1w
KFByaW50U3RyZWFtJiBvdXQpIGNvbnN0Cit7CisgICAgb3V0LnByaW50KG9wY29kZSwgIiAiLCBs
aXN0RHVtcChhcmdzKSwgIiAgOyAiLCAqb3JpZ2luKTsKK30KKworfSB9IH0gLy8gbmFtZXNwYWNl
IEpTQzo6QjM6OkFpcgorCkluZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvYWlyL0Fpcklu
c3QuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvYWlyL0Fpckluc3Qu
aAkocmV2aXNpb24gMCkKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9haXIvQWlySW5zdC5o
CSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsMTQ5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAy
MDE1IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlv
biBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAq
IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcg
Y29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2Ug
Y29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMg
bGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBS
ZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNv
cHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZv
bGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3Ro
ZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElT
IFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAq
IEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRF
RCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBG
SVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBO
TyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZP
UiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFS
WSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBU
TywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1Mg
T0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBI
T1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVS
IElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5F
R0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UK
KyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkg
T0YgU1VDSCBEQU1BR0UuIAorICovCisKKyNpZm5kZWYgQWlySW5zdF9oCisjZGVmaW5lIEFpcklu
c3RfaAorCisjaW5jbHVkZSAiQWlyQXJnLmgiCisjaW5jbHVkZSAiQWlyT3Bjb2RlLmgiCisKK25h
bWVzcGFjZSBKU0MgeworCitjbGFzcyBDQ2FsbEhlbHBlcnM7CisKK25hbWVzcGFjZSBCMyB7CisK
K2NsYXNzIFZhbHVlOworCituYW1lc3BhY2UgQWlyIHsKKworc3RydWN0IEdlbmVyYXRpb25Db250
ZXh0OworCitzdHJ1Y3QgSW5zdCB7CitwdWJsaWM6CisgICAgdHlwZWRlZiBWZWN0b3I8QXJnLCAz
PiBBcmdMaXN0OworCisgICAgSW5zdChPcGNvZGUgb3Bjb2RlLCBWYWx1ZSogb3JpZ2luKQorICAg
ICAgICA6IG9yaWdpbihvcmlnaW4pCisgICAgICAgICwgb3Bjb2RlKG9wY29kZSkKKyAgICB7Cisg
ICAgfQorICAgIAorICAgIHRlbXBsYXRlPHR5cGVuYW1lLi4uIEFyZ3VtZW50cz4KKyAgICBJbnN0
KE9wY29kZSBvcGNvZGUsIFZhbHVlKiBvcmlnaW4sIEFyZyBhcmcsIEFyZ3VtZW50cy4uLiBhcmd1
bWVudHMpCisgICAgICAgIDogYXJnc3sgYXJnLCBhcmd1bWVudHMuLi4gfQorICAgICAgICAsIG9y
aWdpbihvcmlnaW4pCisgICAgICAgICwgb3Bjb2RlKG9wY29kZSkKKyAgICB7CisgICAgfQorCisg
ICAgSW5zdChPcGNvZGUgb3Bjb2RlLCBWYWx1ZSogb3JpZ2luLCBjb25zdCBBcmdMaXN0JiBhcmd1
bWVudHMpCisgICAgICAgIDogYXJncyhhcmd1bWVudHMpCisgICAgICAgICwgb3JpZ2luKG9yaWdp
bikKKyAgICAgICAgLCBvcGNvZGUob3Bjb2RlKQorICAgIHsKKyAgICB9CisKKyAgICBJbnN0KE9w
Y29kZSBvcGNvZGUsIFZhbHVlKiBvcmlnaW4sIEFyZ0xpc3QmJiBhcmd1bWVudHMpCisgICAgICAg
IDogYXJncyhXVEY6Om1vdmUoYXJndW1lbnRzKSkKKyAgICAgICAgLCBvcmlnaW4ob3JpZ2luKQor
ICAgICAgICAsIG9wY29kZShvcGNvZGUpCisgICAgeworICAgIH0KKworICAgIC8vIE5vdGUgdGhh
dCB0aGVzZSBmdW5jdG9ycyBhbGwgYXZvaWQgdXNpbmcgImNvbnN0IiBiZWNhdXNlIHdlIHdhbnQg
dG8gdXNlIHRoZW0gZm9yIHRoaW5ncyB0aGF0CisgICAgLy8gZWRpdCBJUi4gSVIgaXMgbWVhbnQg
dG8gYmUgZWRpdGVkOyBpZiB5b3UncmUgY2FycnlpbmcgYXJvdW5kIGEgImNvbnN0IEluc3QmIiB0
aGVuIHlvdSdyZQorICAgIC8vIHByb2JhYmx5IGRvaW5nIGl0IHdyb25nLgorCisgICAgLy8gVGhp
cyBvbmx5IHdhbGtzIHRob3NlIFRtcHMgdGhhdCBhcmUgZXhwbGljaXRseSBtZW50aW9uZWQsIGFu
ZCBpdCBkb2Vzbid0IHRlbGwgeW91IHRoZWlyIHJvbGUKKyAgICAvLyBvciB0eXBlLgorICAgIHRl
bXBsYXRlPHR5cGVuYW1lIEZ1bmN0b3I+CisgICAgdm9pZCBmb3JFYWNoVG1wRmFzdChjb25zdCBG
dW5jdG9yJiBmdW5jdG9yKQorICAgIHsKKyAgICAgICAgZm9yIChBcmcgYXJnIDogYXJncykKKyAg
ICAgICAgICAgIGFyZy5mb3JFYWNoVG1wRmFzdChmdW5jdG9yKTsKKyAgICB9CisKKyAgICB0eXBl
ZGVmIHZvaWQgRWFjaEFyZ0NhbGxiYWNrKEFyZyYsIEFyZzo6Um9sZSwgQXJnOjpUeXBlKTsKKyAg
ICAKKyAgICAvLyBDYWxscyB0aGUgZnVuY3RvciB3aXRoIChhcmcsIHJvbGUsIHR5cGUpLiBUaGlz
IGZ1bmN0aW9uIGlzIGF1dG8tZ2VuZXJhdGVkIGJ5CisgICAgLy8gb3Bjb2RlX2dlbmVyYXRvci5y
Yi4KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBGdW5jdG9yPgorICAgIHZvaWQgZm9yRWFjaEFyZyhj
b25zdCBGdW5jdG9yJiBmdW5jdG9yKTsKKworICAgIC8vIENhbGxzIHRoZSBmdW5jdG9yIHdpdGgg
KHRtcCwgcm9sZSwgdHlwZSkuCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgRnVuY3Rvcj4KKyAgICB2
b2lkIGZvckVhY2hUbXAoY29uc3QgRnVuY3RvciYgZnVuY3RvcikKKyAgICB7CisgICAgICAgIGZv
ckVhY2hBcmdSb2xlKAorICAgICAgICAgICAgWyZdIChBcmcmIGFyZywgQXJnOjpSb2xlIHJvbGUs
IEFyZzo6VHlwZSB0eXBlKSB7CisgICAgICAgICAgICAgICAgYXJnLmZvckVhY2hUbXAocm9sZSwg
dHlwZSwgZnVuY3Rvcik7CisgICAgICAgICAgICB9KTsKKyAgICB9CisKKyAgICAvLyBUaGluZyBj
YW4gYmUgZWl0aGVyIEFyZyBvciBUbXAuCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVGhpbmcsIHR5
cGVuYW1lIEZ1bmN0b3I+CisgICAgdm9pZCBmb3JFYWNoKGNvbnN0IEZ1bmN0b3ImIGZ1bmN0b3Ip
OworCisgICAgLy8gUmV0dXJucyB0cnVlIGlmIHRoaXMgaW5zdHJ1Y3Rpb24gaGFzIGEgU3BlY2lh
bCouIFRoaXMgdW5sb2NrcyBzb21lIGV4dHJhIGZ1bmN0aW9uYWxpdHkuCisgICAgYm9vbCBoYXNT
cGVjaWFsKCkgY29uc3Q7CisKKyAgICAvLyBSZXBvcnRzIGFueSBhZGRpdGlvbmFsIHJlZ2lzdGVy
cyBjbG9iYmVyZWQgYnkgdGhpcyBvcGVyYXRpb24uIE5vdGUgdGhhdCBmb3IgZWZmaWNpZW5jeSwK
KyAgICAvLyBleHRyYUNsb2JiZXJlZFJlZ3MoKSBvbmx5IHdvcmtzIGlmIGhhc1NwZWNpYWwoKSBy
ZXR1cm5zIHRydWUuCisgICAgY29uc3QgUmVnaXN0ZXJTZXQmIGV4dHJhQ2xvYmJlcmVkUmVncygp
OworCisgICAgLy8gVXNlIHRoaXMgdG8gcmVwb3J0IHdoaWNoIHJlZ2lzdGVycyBhcmUgbGl2ZS4g
VGhpcyBzaG91bGQgYmUgZG9uZSBqdXN0IGJlZm9yZSBjb2RlZ2VuLiBOb3RlCisgICAgLy8gdGhh
dCBmb3IgZWZmaWNpZW5jeSwgcmVwb3J0VXNlZFJlZ2lzdGVycygpIG9ubHkgd29ya3MgaWYgaGFz
U3BlY2lhbCgpIHJldHVybnMgdHJ1ZS4KKyAgICB2b2lkIHJlcG9ydFVzZWRSZWdpc3RlcnMoY29u
c3QgUmVnaXN0ZXJTZXQmKTsKKworICAgIC8vIElzIHRoaXMgaW5zdHJ1Y3Rpb24gaW4gb25lIG9m
IHRoZSB2YWxpZCBmb3JtcyByaWdodCBub3c/IFRoaXMgZnVuY3Rpb24gaXMgYXV0by1nZW5lcmF0
ZWQgYnkKKyAgICAvLyBvcGNvZGVfZ2VuZXJhdG9yLnJiLgorICAgIGJvb2wgaXNWYWxpZEZvcm0o
KTsKKworICAgIC8vIEFzc3VtaW5nIHRoaXMgaW5zdHJ1Y3Rpb24gaXMgaW4gYSB2YWxpZCBmb3Jt
IHJpZ2h0IG5vdywgd2lsbCBpdCBzdGlsbCBiZSBpbiBvbmUgb2YgdGhlIHZhbGlkCisgICAgLy8g
Zm9ybXMgaWYgd2UgcHV0IGFuIEFkZHIgcmVmZXJlbmNpbmcgdGhlIHN0YWNrIChvciBhIFN0YWNr
U2xvdCBvciBDYWxsQXJnLCBvZiBjb3Vyc2UpIGluIHRoZQorICAgIC8vIGdpdmVuIGluZGV4PyBT
cGlsbGluZyB1c2VzIHRoaXM6IGl0IHdhbGtzIHRoZSBhcmdzIGJ5IGluZGV4IHRvIGZpbmQgVG1w
cyB0aGF0IG5lZWQgc3BpbGxpbmc7CisgICAgLy8gaWYgaXQgZmluZHMgb25lLCBpdCBjYWxscyB0
aGlzIHRvIHNlZSBpZiBpdCBjYW4gcmVwbGFjZSB0aGUgQXJnOjpUbXAgd2l0aCBhbiBBcmc6OkFk
ZHIuIElmIGl0CisgICAgLy8gZmluZHMgYSBub24tVG1wIEFyZywgdGhlbiBpdCBjYWxscyB0aGF0
IEFyZydzIGZvckVhY2hUbXAgdG8gZG8gYSByZXBsYWNlbWVudCB0aGF0IHdheS4KKyAgICAvLwor
ICAgIC8vIFRoaXMgZnVuY3Rpb24gaXMgYXV0by1nZW5lcmF0ZWQgYnkgb3Bjb2RlX2dlbmVyYXRv
ci5yYi4KKyAgICBib29sIGFkbWl0c1N0YWNrKHVuc2lnbmVkIGFyZ0luZGV4KTsKKworICAgIC8v
IEdlbmVyYXRlIHNvbWUgY29kZSBmb3IgdGhpcyBpbnN0cnVjdGlvbi4gVGhpcyBpcywgbGlrZSwg
bGl0ZXJhbGx5IG91ciBiYWNrZW5kLiBJZiB0aGlzIGlzIHRoZQorICAgIC8vIHRlcm1pbmFsLCBp
dCByZXR1cm5zIHRoZSBqdW1wIHRoYXQgbmVlZHMgdG8gYmUgbGlua2VkIGZvciB0aGUgInRoZW4i
IGNhc2UsIHdpdGggdGhlICJlbHNlIgorICAgIC8vIGNhc2UgYmVpbmcgZmFsbC10aHJvdWdoLiBU
aGlzIGZ1bmN0aW9uIGlzIGF1dG8tZ2VuZXJhdGVkIGJ5IG9wY29kZV9nZW5lcmF0b3IucmIuCisg
ICAgQ0NhbGxIZWxwZXJzOjpKdW1wIGdlbmVyYXRlKENDYWxsSGVscGVycyYsIEdlbmVyYXRpb25D
b250ZXh0Jik7CisKKyAgICB2b2lkIGR1bXAoUHJpbnRTdHJlYW0mKSBjb25zdDsKKworICAgIEFy
Z0xpc3QgYXJnczsKKyAgICBWYWx1ZSogb3JpZ2luOyAvLyBUaGUgQjM6OlZhbHVlIHRoYXQgdGhp
cyBvcmlnaW5hdGVkIGZyb20uCisgICAgT3Bjb2RlIG9wY29kZTsKK307CisKK30gfSB9IC8vIG5h
bWVzcGFjZSBKU0M6OkIzOjpBaXIKKworI2VuZGlmIC8vIEFpckluc3RfaAorCkluZGV4OiBTb3Vy
Y2UvSmF2YVNjcmlwdENvcmUvYjMvYWlyL0Fpckluc3RJbmxpbmVzLmgKPT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0g
U291cmNlL0phdmFTY3JpcHRDb3JlL2IzL2Fpci9BaXJJbnN0SW5saW5lcy5oCShyZXZpc2lvbiAw
KQorKysgU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL2Fpci9BaXJJbnN0SW5saW5lcy5oCSh3b3Jr
aW5nIGNvcHkpCkBAIC0wLDAgKzEsOTEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTUgQXBw
bGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1
c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZp
Y2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRp
b25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11
c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9m
IGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJp
YnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0
CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5n
IGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRl
cmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdB
UkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVT
UyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBU
SEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1Mg
Rk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5U
IFNIQUxMIEFQUExFIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBE
SVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBD
T05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICog
UFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0Us
IERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIg
Q0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09O
VFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5D
RSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0Yg
VEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNI
IERBTUFHRS4gCisgKi8KKworI2lmbmRlZiBBaXJJbnN0SW5saW5lc19oCisjZGVmaW5lIEFpcklu
c3RJbmxpbmVzX2gKKworI2luY2x1ZGUgIkFpckluc3QuaCIKKyNpbmNsdWRlICJBaXJPcGNvZGVV
dGlscy5oIgorI2luY2x1ZGUgIkFpclNwZWNpYWxzLmgiCisjaW5jbHVkZSAiQjNTdGFja21hcC5o
IgorI2luY2x1ZGUgIkIzVmFsdWUuaCIKKworbmFtZXNwYWNlIEpTQyB7IG5hbWVzcGFjZSBCMyB7
IG5hbWVzcGFjZSBBaXIgeworCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPiBzdHJ1Y3QgRm9yRWFjaDsK
K3RlbXBsYXRlPD4gc3RydWN0IEZvckVhY2g8VG1wPiB7CisgICAgdGVtcGxhdGU8dHlwZW5hbWUg
RnVuY3Rvcj4KKyAgICB2b2lkIGZvckVhY2goSW5zdCYgaW5zdCwgY29uc3QgRnVuY3RvciYgZnVu
Y3RvcikKKyAgICB7CisgICAgICAgIGluc3QuZm9yRWFjaFRtcChmdW5jdG9yKTsKKyAgICB9Cit9
OwordGVtcGxhdGU8PiBzdHJ1Y3QgRm9yRWFjaDxBcmc+IHsKKyAgICB0ZW1wbGF0ZTx0eXBlbmFt
ZSBGdW5jdG9yPgorICAgIHZvaWQgZm9yRWFjaChJbnN0JiBpbnN0LCBjb25zdCBGdW5jdG9yJiBm
dW5jdG9yKQorICAgIHsKKyAgICAgICAgaW5zdC5mb3JFYWNoQXJnKGZ1bmN0b3IpOworICAgIH0K
K307CisKK3RlbXBsYXRlPHR5cGVuYW1lIFRoaW5nLCB0eXBlbmFtZSBGdW5jdG9yPgordm9pZCBm
b3JFYWNoKGNvbnN0IEZ1bmN0b3ImIGZ1bmN0b3IpCit7CisgICAgRm9yRWFjaDxUaGluZz46OmZv
ckVhY2goKnRoaXMsIGZ1bmN0b3IpOworfQorCitib29sIEluc3Q6Omhhc1NwZWNpYWwoKSBjb25z
dAoreworICAgIHJldHVybiBhcmdzLnNpemUoKSAmJiBhcmdzWzBdLmlzU3BlY2lhbCgpOworfQor
Citjb25zdCBSZWdpc3RlclNldCYgSW5zdDo6ZXh0cmFDbG9iYmVyZWRSZWdzKCkKK3sKKyAgICBy
ZXR1cm4gYXJnc1swXS5zcGVjaWFsKCktPmV4dHJhQ2xvYmJlcmVkUmVncygqdGhpcyk7Cit9CisK
K3ZvaWQgSW5zdDo6cmVwb3J0VXNlZFJlZ2lzdGVycyhjb25zdCBSZWdpc3RlclNldCYgdXNlZFJl
Z2lzdGVycykKK3sKKyAgICBhcmdzWzBdLnNwZWNpYWwoKS0+cmVwb3J0VXNlZFJlZ2lzdGVycygq
dGhpcywgdXNlZFJlZ2lzdGVycyk7Cit9CisKK2lubGluZSBib29sIGlzU2hpZnRWYWxpZChJbnN0
JiBpbnN0KQoreworI2lmIENQVShYODYpCisgICAgcmV0dXJuIGluc3QuYXJnc1swXSA9PSBUbXAo
WDg2UmVnaXN0ZXI6OmN4KTsKKyNlbHNlCisgICAgcmV0dXJuIHRydWU7CisjZW5kaWYKK30gICAK
KworaW5saW5lIGJvb2wgaXNMc2hpZnQzMlZhbHVlKEluc3QmIGluc3QpCit7CisgICAgcmV0dXJu
IGlzU2hpZnRWYWxpZChpbnN0KTsKK30KKworfSB9IH0gLy8gbmFtZXNwYWNlIEpTQzo6QjM6OkFp
cgorCisjZW5kaWYgLy8gQWlySW5zdElubGluZXNfaAorCkluZGV4OiBTb3VyY2UvSmF2YVNjcmlw
dENvcmUvYjMvYWlyL0FpckxpdmVuZXNzLmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL0phdmFTY3Jp
cHRDb3JlL2IzL2Fpci9BaXJMaXZlbmVzcy5oCShyZXZpc2lvbiAwKQorKysgU291cmNlL0phdmFT
Y3JpcHRDb3JlL2IzL2Fpci9BaXJMaXZlbmVzcy5oCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEs
MTIyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE1IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyBy
ZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmlu
YXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRl
ZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAq
IDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUg
Y29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUg
Zm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZv
cm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlz
IGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQor
ICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGgg
dGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQ
UExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5U
SUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJB
TlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAq
IFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9S
CisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5D
SURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VT
IChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNU
SVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklU
UzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRI
RU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklM
SVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklT
SU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4g
SUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisKKyNp
Zm5kZWYgQWlyTGl2ZW5lc3NfaAorI2RlZmluZSBBaXJMaXZlbmVzc19oCisKKyNpbmNsdWRlICJB
aXJCYXNpY0Jsb2NrLmgiCisjaW5jbHVkZSAiQjNJbmRleE1hcC5oIgorCituYW1lc3BhY2UgSlND
IHsgbmFtZXNwYWNlIEIzIHsgbmFtZXNwYWNlIEFpciB7CisKKy8vIFlvdSBjYW4gY29tcHV0ZSBs
aXZlbmVzcyBvdmVyIFRtcCdzIG9yIG92ZXIgQXJnJ3MuIElmIHlvdSBjb21wdXRlIG92ZXIgQXJn
J3MsIHlvdSBnZXQgYm90aAorLy8gc3RhY2sgbGl2ZW5lc3MgYW5kIHRtcCBsaXZlbmVzcy4KK3Rl
bXBsYXRlPHR5cGVuYW1lIFRoaW5nPgorY2xhc3MgTGl2ZW5lc3MgeworcHVibGljOgorICAgIExp
dmVuZXNzKENvZGUmIGNvZGUpCisgICAgeworICAgICAgICBtX2xpdmVBdEhlYWQucmVzaXplKGNv
ZGUuc2l6ZSgpKTsKKyAgICAgICAgbV9saXZlQXRUYWlsLnJlc2l6ZShjb2RlLnNpemUoKSk7CisK
KyAgICAgICAgSW5kZXhTZXQ8QmFzaWNCbG9jaz4gc2VlbjsKKworICAgICAgICBib29sIGNoYW5n
ZWQgPSB0cnVlOworICAgICAgICB3aGlsZSAoY2hhbmdlZCkgeworICAgICAgICAgICAgY2hhbmdl
ZCA9IGZhbHNlOworCisgICAgICAgICAgICBmb3IgKHNpemVfdCBibG9ja0luZGV4ID0gY29kZS5z
aXplKCk7IGJsb2NrSW5kZXgtLTspIHsKKyAgICAgICAgICAgICAgICBCYXNpY0Jsb2NrKiBibG9j
ayA9IGNvZGUuYXQoYmxvY2tJbmRleCk7CisgICAgICAgICAgICAgICAgTG9jYWxDYWxjIGxvY2Fs
Q2FsYygqdGhpcywgYmxvY2spOworICAgICAgICAgICAgICAgIGZvciAoc2l6ZV90IGluc3RJbmRl
eCA9IGJsb2NrLT5zaXplKCk7IGluc3RJbmRleC0tOykKKyAgICAgICAgICAgICAgICAgICAgbG9j
YWxDYWxjLmV4ZWN1dGUoYmxvY2stPmF0KGluc3RJbmRleCkpOworICAgICAgICAgICAgICAgIGJv
b2wgZmlyc3RUaW1lID0gc2Vlbi5hZGQoYmxvY2spOworICAgICAgICAgICAgICAgIGlmICghZmly
c3RUaW1lICYmIGxvY2FsQ2FsYy5saXZlKCkgPT0gbV9saXZlQXRIZWFkW2Jsb2NrXSkKKyAgICAg
ICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgY2hhbmdlZCA9IHRydWU7
CisgICAgICAgICAgICAgICAgbV9saXZlQXRIZWFkW2Jsb2NrXSA9IGxvY2FsQ2FsYy50YWtlTGl2
ZSgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgY29uc3QgSGFzaFNl
dDxUaGluZz4mIGxpdmVBdEhlYWQoQmFzaWNCbG9jayogYmxvY2spIGNvbnN0CisgICAgeworICAg
ICAgICByZXR1cm4gbV9saXZlQXRIZWFkW2Jsb2NrXTsKKyAgICB9CisKKyAgICBjb25zdCBIYXNo
U2V0PFRoaW5nPiYgbGl2ZUF0VGFpbChCYXNpY0Jsb2NrKiBibG9jaykgY29uc3QKKyAgICB7Cisg
ICAgICAgIHJldHVybiBtX2xpdmVBdFRhaWxbYmxvY2tdOworICAgIH0KKworICAgIC8vIFRoaXMg
Y2FsY3VsYXRvciBoYXMgdG8gYmUgcnVuIGluIHJldmVyc2UuCisgICAgY2xhc3MgTG9jYWxDYWxj
IHsKKyAgICBwdWJsaWM6CisgICAgICAgIExvY2FsQ2FsYyhMaXZlbmVzcyYgbGl2ZW5lc3MsIEJh
c2ljQmxvY2sqIGJsb2NrKQorICAgICAgICAgICAgOiBtX2xpdmUobGl2ZW5lc3MtPmxpdmVBdFRh
aWwoYmxvY2spKQorICAgICAgICB7CisgICAgICAgIH0KKworICAgICAgICBjb25zdCBIYXNoU2V0
PFRoaW5nPiYgbGl2ZSgpIGNvbnN0IHsgcmV0dXJuIG1fbGl2ZTsgfQorICAgICAgICBIYXNoU2V0
PFRoaW5nPiYmIHRha2VMaXZlKCkgeyByZXR1cm4gV1RGOjptb3ZlKG1fbGl2ZSk7IH0KKworICAg
ICAgICB2b2lkIGV4ZWN1dGUoSW5zdCYgaW5zdCkKKyAgICAgICAgeworICAgICAgICAgICAgLy8g
Rmlyc3QgaGFuZGxlIGRlZidzLgorICAgICAgICAgICAgaW5zdC5mb3JFYWNoPFRoaW5nPigKKyAg
ICAgICAgICAgICAgICBbdGhpc10gKFRoaW5nJiBhcmcsIEFyZzo6Um9sZSByb2xlLCBBcmc6OlR5
cGUpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKEFyZzo6aXNEZWYocm9sZSkpCisgICAgICAg
ICAgICAgICAgICAgICAgICBtX2xpdmUucmVtb3ZlKGFyZyk7CisgICAgICAgICAgICAgICAgfSk7
CisKKyAgICAgICAgICAgIC8vIE5leHQgaGFuZGxlIGNsb2JiZXJlZCByZWdpc3RlcnMuCisgICAg
ICAgICAgICBpZiAoaW5zdC5oYXNTcGVjaWFsKCkpIHsKKyAgICAgICAgICAgICAgICBpbnN0LmV4
dHJhQ2xvYmJlcmVkUmVncygpLmZvckVhY2goCisgICAgICAgICAgICAgICAgICAgIFt0aGlzXSAo
UmVnIHJlZykgeworICAgICAgICAgICAgICAgICAgICAgICAgbV9saXZlLnJlbW92ZShUaGluZyhy
ZWcpKTsKKyAgICAgICAgICAgICAgICAgICAgfSk7CisgICAgICAgICAgICB9CisgICAgICAgICAg
ICAgICAgICAgIAorICAgICAgICAgICAgLy8gRmluYWxseSBoYW5kbGUgdXNlJ3MuCisgICAgICAg
ICAgICBpbnN0LmZvckVhY2g8VGhpbmc+KAorICAgICAgICAgICAgICAgIFt0aGlzXSAoVGhpbmcm
IGFyZywgQXJnOjpSb2xlIHJvbGUsIEFyZzo6VHlwZSkgeworICAgICAgICAgICAgICAgICAgICBp
ZiAoQXJnOjppc1VzZShyb2xlKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIG1fbGl2ZS5hZGQo
YXJnKTsKKyAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgfQorCisgICAgcHJpdmF0ZToKKyAg
ICAgICAgSGFzaFNldDxUaGluZz4gbV9saXZlOworICAgIH07CisgICAgCitwcml2YXRlOgorICAg
IEluZGV4TWFwPEJhc2ljQmxvY2ssIEhhc2hTZXQ8VGhpbmc+PiBtX2xpdmVBdEhlYWQ7CisgICAg
SW5kZXhNYXA8QmFzaWNCbG9jaywgSGFzaFNldDxUaGluZz4+IG1fbGl2ZUF0VGFpbDsKK307CisK
K30gfSB9IC8vIG5hbWVzcGFjZSBKU0M6OkIzOjpBaXIKKworI2VuZGlmIC8vIEFpckxpdmVuZXNz
X2gKKwpJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL2Fpci9BaXJPcGNvZGUub3Bjb2Rl
cwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvYWlyL0Fpck9wY29kZS5v
cGNvZGVzCShyZXZpc2lvbiAwKQorKysgU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL2Fpci9BaXJP
cGNvZGUub3Bjb2Rlcwkod29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDEzMiBAQAorIyBDb3B5cmln
aHQgKEMpIDIwMTUgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorIworIyBSZWRpc3Ry
aWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhv
dXQKKyMgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxv
d2luZyBjb25kaXRpb25zCisjIGFyZSBtZXQ6CisjIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3Vy
Y2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisjICAgIG5vdGljZSwgdGhp
cyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyMgMi4g
UmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBj
b3B5cmlnaHQKKyMgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZv
bGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorIyAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhl
ciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorIworIyBUSElTIFNP
RlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gQU5EIElUUyBDT05UUklCVVRPUlMgYGBB
UyBJUycnCisjIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElO
RywgQlVUIE5PVCBMSU1JVEVEIFRPLAorIyBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNI
QU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisjIFBVUlBPU0UgQVJFIERJ
U0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IgSVRTIENPTlRSSUJVVE9S
UworIyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVD
SUFMLCBFWEVNUExBUlksIE9SCisjIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBC
VVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCisjIFNVQlNUSVRVVEUgR09PRFMgT1Ig
U0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUworIyBJ
TlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElU
WSwgV0hFVEhFUiBJTgorIyBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5D
TFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorIyBBUklTSU5HIElOIEFOWSBXQVkgT1VU
IE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GCisjIFRIRSBQ
T1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworIyBTeWxsYWJ1czoKKyMKKyMgUm9sZXMgYW5k
IHR5cGVzOgorIyBVOkcgPT4gdXNlIG9mIGEgZ2VuZXJhbC1wdXJwb3NlIHJlZ2lzdGVyIG9yIHZh
bHVlCisjIEQ6RyA9PiBkZWYgb2YgYSBnZW5lcmFsLXB1cnBvc2UgcmVnaXN0ZXIgb3IgdmFsdWUK
KyMgVUQ6RyA9PiB1c2UgYW5kIGRlZiBvZiBhIGdlbmVyYWwtcHVycG9zZSByZWdpc3RlciBvciB2
YWx1ZQorIyBVOkYgPT4gdXNlIG9mIGEgZmxvYXQgcmVnaXN0ZXIgb3IgdmFsdWUKKyMgRDpGID0+
IGRlZiBvZiBhIGZsb2F0IHJlZ2lzdGVyIG9yIHZhbHVlCisjIFVEOkYgPT4gdXNlIGFuZCBkZWYg
b2YgYSBmbG9hdCByZWdpc3RlciBvciB2YWx1ZQorIworIyBBcmd1bWVudCBraW5kczoKKyMgVG1w
ID0+IHRlbXBvcmFyeSBvciByZWdpc3RlcgorIyBJbW0gPT4gMzItYml0IGltbWVkaWF0ZSBpbnQK
KyMgSW1tNjQgPT4gVHJ1c3RlZEltbTY0CisjIEFkZHIgPT4gYWRkcmVzcyBhcyB0ZW1wb3Jhcnkv
cmVnaXN0ZXIrb2Zmc2V0CisjIEluZGV4ID0+IEJhc2VJbmRleCBhZGRyZXNzCisjIEFicyA9PiBB
YnNvbHV0ZUFkZHJlc3MKKyMKKyMgVGhlIHBhcnNlciB2aWV3cyB0aGVzZSB0aGluZ3MgYXMga2V5
d29yZHMsIGFuZCB1bmRlcnN0YW5kcyB0aGF0IHRoZXkgZmFsbCBpbnRvIHR3byBkaXN0aW5jdCBj
bGFzc2VzCisjIG9mIHRoaW5ncy4gU28sIGFsdGhvdWdoIHRoaXMgZmlsZSB1c2VzIGEgcGFydGlj
dWxhciBpbmRlbnRhdGlvbiBzdHlsZSwgbm9uZSBvZiB0aGUgd2hpdGVzcGFjZSBvcgorIyBldmVu
IG5ld2xpbmVzIGFyZSBtZWFuaW5nZnVsIHRvIHRoZSBwYXJzZXIuIEZvciBleGFtcGxlLCB5b3Ug
Y291bGQgd3JpdGU6CisjCisjIEZvbzQyIFU6RywgVUQ6RiBJbW0sIFRtcCBBZGRyLCBUbXAKKyMK
KyMgQW5kIHRoZSBwYXJzZXIgd291bGQga25vdyB0aGF0IHRoaXMgaXMgdGhlIHNhbWUgYXM6Cisj
CisjIEZvbzQyIFU6RywgVUQ6RgorIyAgICAgSW1tLCBUbXAKKyMgICAgIEFkZHIsIFRtcAorIwor
IyBJLmUuIGEgdHdvLWZvcm0gaW5zdHJ1Y3Rpb24gdGhhdCB1c2VzIGEgR1BSIG9yIGFuIGludCBp
bW1lZGlhdGUgYW5kIHVzZXMrZGVmcyBhIGZsb2F0IHJlZ2lzdGVyLgorCisjIE5vdGUgdGhhdCB0
aGUgb3Bjb2RlcyBoZXJlIGhhdmUgYSBsZWFkaW5nIGNhcGl0YWwgKEFkZDMyKSBidXQgbXVzdCBj
b3JyZXNwb25kIHRvIE1hY3JvQXNzZW1ibGVyCisjIEFQSSB0aGF0IGhhcyBhIGxlYWRpbmcgbG93
ZXItY2FzZSAoYWRkMzIpLgorCitOb3AKKworQWRkMzIgVTpHLCBVRDpHCisgICAgVG1wLCBUbXAK
KyAgICBJbW0sIEFkZHIKKyAgICBJbW0sIFRtcAorICAgIEFkZHIsIFRtcAorICAgIFRtcCwgQWRk
cgorCitBZGQzMiBVOkcsIFU6RywgRDpHCisgICAgSW1tLCBUbXAsIFRtcAorCitBbmQzMiBVOkcs
IFVEOkcKKyAgICBUbXAsIFRtcAorICAgIEltbSwgVG1wCisgICAgVG1wLCBBZGRyCisgICAgQWRk
ciwgVG1wCisgICAgSW1tLCBBZGRyCisKK0xzaGlmdDMyIFU6RywgVUQ6RworICAgIFRtcCosIFRt
cAorICAgIEltbSwgVG1wCisKK011bDMyIFU6RywgVUQ6RworICAgIFRtcCwgVG1wCisgICAgQWRk
ciwgVG1wCisKK01vdmUgVTpHLCBEOkcKKyAgICBUbXAsIFRtcAorICAgIEltbSwgVG1wCisgICAg
SW1tNjQsIFRtcAorICAgIEFkZHIsIFRtcCBhcyBsb2FkICMgVGhpcyBtZWFucyB0aGF0ICJNb3Zl
IEFkZHIsIFRtcCIgaXMgY29kZS1nZW5lcmF0ZWQgYXMgImxvYWQiIG5vdCAibW92ZSIuCisgICAg
VG1wLCBBZGRyIGFzIHN0b3JlCisKK01vdmVEb3VibGUgVTpGLCBEOkYKKyAgICBUbXAsIFRtcAor
ICAgIEFkZHIsIFRtcCBhcyBsb2FkRG91YmxlCisgICAgVG1wLCBBZGRyIGFzIHN0b3JlRG91Ymxl
CisKK01vdmU2NFRvRG91YmxlIFU6RywgRDpGCisgICAgVG1wLCBUbXAKKworTW92ZURvdWJsZVRv
NjQgVTpGLCBEOkcKKyAgICBUbXAsIFRtcAorCitCcmFuY2hBZGQzMiBVOkcsIFU6RywgVUQ6RyAv
YnJhbmNoCisgICAgUmVzQ29uZCwgVG1wLCBUbXAKKyAgICBSZXNDb25kLCBJbW0sIFRtcAorICAg
IFJlc0NvbmQsIEltbSwgQWRkcgorICAgIFJlc0NvbmQsIFRtcCwgQWRkcgorICAgIFJlc0NvbmQs
IEFkZHIsIFRtcAorCitCcmFuY2hNdWwzMiBVOkcsIFU6RywgVUQ6RyAvYnJhbmNoCisgICAgUmVz
Q29uZCwgVG1wLCBUbXAKKyAgICBSZXNDb25kLCBBZGRyLCBUbXAKKworQnJhbmNoU3ViMzIgVTpH
LCBVOkcsIFVEOkcgL2JyYW5jaAorICAgIFJlc0NvbmQsIFRtcCwgVG1wCisgICAgUmVzQ29uZCwg
SW1tLCBUbXAKKyAgICBSZXNDb25kLCBJbW0sIEFkZHIKKyAgICBSZXNDb25kLCBUbXAsIEFkZHIK
KyAgICBSZXNDb25kLCBBZGRyLCBUbXAKKworQnJhbmNoTmVnMzIgVTpHLCBVRDpHIC9icmFuY2gK
KyAgICBSZXNDb25kLCBUbXAKKworSnVtcCAvYnJhbmNoCisKK1JldAorCisjIEFpciBhbGxvd3Mg
Zm9yIGV4b3RpYyBiZWhhdmlvci4gQSBQYXRjaCdzIGJlaGF2aW9yIGlzIGRldGVybWluZWQgZW50
aXJlbHkgYnkgdGhlIFNwZWNpYWwgb3BlcmFuZCwKKyMgd2hpY2ggbXVzdCBiZSB0aGUgZmlyc3Qg
b3BlcmFuZC4KK3NwZWNpYWwgUGF0Y2gKKwpJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL2Iz
L2Fpci9BaXJQaGFzZVNjb3BlLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENv
cmUvYjMvYWlyL0FpclBoYXNlU2NvcGUuY3BwCShyZXZpc2lvbiAwKQorKysgU291cmNlL0phdmFT
Y3JpcHRDb3JlL2IzL2Fpci9BaXJQaGFzZVNjb3BlLmNwcAkod29ya2luZyBjb3B5KQpAQCAtMCww
ICsxLDU1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE1IEFwcGxlIEluYy4gQWxsIHJpZ2h0
cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQg
YmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1p
dHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoK
KyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJv
dmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0
aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5
IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0
aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRo
ZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdp
dGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZ
IEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJS
QU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdB
UlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIK
KyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMu
IE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwg
SU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1B
R0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNV
QlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJP
RklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5Z
IFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElB
QklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBB
UklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVW
RU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisK
KyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJBaXJQaGFzZVNjb3BlLmgiCisKKyNpbmNs
dWRlICJBaXJDb2RlLmgiCisjaW5jbHVkZSAiQWlyVmFsaWRhdGUuaCIKKyNpbmNsdWRlICJCM0Nv
bW1vbi5oIgorCituYW1lc3BhY2UgSlNDIHsgbmFtZXNwYWNlIEIzIHsgbmFtZXNwYWNlIEFpciB7
CisKK1BoYXNlU2NvcGU6OlBoYXNlU2NvcGUoQ29kZSYgY29kZSwgY29uc3QgY2hhciogbmFtZSkK
KyAgICA6IG1fY29kZShjb2RlKQorICAgICwgbV9uYW1lKG5hbWUpCit7CisgICAgaWYgKHNob3Vs
ZER1bXBJUkF0RWFjaFBoYXNlKCkpIHsKKyAgICAgICAgb3V0LnByaW50KCJBaXIgYmVmb3JlICIs
IG5hbWUsICI6Iik7CisgICAgICAgIG91dC5wcmludChjb2RlKTsKKyAgICB9CisKKyAgICBpZiAo
c2hvdWxkU2F2ZUlSQmVmb3JlUGhhc2UoKSkKKyAgICAgICAgbV9kdW1wQmVmb3JlID0gdG9DU3Ry
aW5nKGNvZGUpOworfQorCitQaGFzZVNjb3BlOjp+UGhhc2VTY29wZSgpCit7CisgICAgaWYgKHNo
b3VsZFZhbGlkYXRlSVJBdEVhY2hQaGFzZSgpKQorICAgICAgICB2YWxpZGF0ZShjb2RlLCBtX25h
bWUsIG1fZHVtcEJlZm9yZS5kYXRhKCkpOworfQorCit9IH0gfSAvLyBuYW1lc3BhY2UgSlNDOjpC
Mzo6QWlyCisKSW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9haXIvQWlyUGhhc2VTY29w
ZS5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9haXIvQWlyUGhhc2VT
Y29wZS5oCShyZXZpc2lvbiAwKQorKysgU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL2Fpci9BaXJQ
aGFzZVNjb3BlLmgJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSw1MCBAQAorLyoKKyAqIENvcHly
aWdodCAoQykgMjAxNSBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVk
aXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3
aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUg
Zm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMg
b2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90
aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVy
LgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRo
ZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMg
YW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24g
YW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisg
KgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIGBgQVMgSVMnJyBB
TkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQg
Tk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJ
TElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJ
TUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJF
IExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisg
KiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9U
IExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJ
Q0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVS
UlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElU
WSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElO
Q0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBP
RiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBP
U1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLiAKKyAqLworCisjaWZuZGVmIEFpclBoYXNlU2NvcGVf
aAorI2RlZmluZSBBaXJQaGFzZVNjb3BlX2gKKworI2luY2x1ZGUgPHd0Zi9Ob25jb3B5YWJsZS5o
PgorCituYW1lc3BhY2UgSlNDIHsgbmFtZXNwYWNlIEIzIHsgbmFtZXNwYWNlIEFpciB7CisKK2Ns
YXNzIENvZGU7CisKK2NsYXNzIFBoYXNlU2NvcGUgeworICAgIFdURl9NQUtFX05PTkNPUFlBQkxF
KFBoYXNlU2NvcGUpOworcHVibGljOgorICAgIFBoYXNlU2NvcGUoQ29kZSYsIGNvbnN0IGNoYXIq
IG5hbWUpOworICAgIH5QaGFzZVNjb3BlKCk7IC8vIHRoaXMgc2hvdWxkIGRvIHZhbGlkYXRpb24K
KworcHJpdmF0ZToKKyAgICBDb2RlJiBtX2NvZGU7CisgICAgY29uc3QgY2hhciogbV9uYW1lOwor
ICAgIENTdHJpbmcgbV9kdW1wQmVmb3JlOworfTsKKworfSB9IH0gLy8gbmFtZXNwYWNlIEpTQzo6
QjM6OkFpcgorCisjZW5kaWYgLy8gQWlyUGhhc2VTY29wZV9oCisKSW5kZXg6IFNvdXJjZS9KYXZh
U2NyaXB0Q29yZS9iMy9haXIvQWlyUmVnaXN0ZXJQcmlvcml0eS5jcHAKPT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0g
U291cmNlL0phdmFTY3JpcHRDb3JlL2IzL2Fpci9BaXJSZWdpc3RlclByaW9yaXR5LmNwcAkocmV2
aXNpb24gMCkKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9haXIvQWlyUmVnaXN0ZXJQcmlv
cml0eS5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSw5NiBAQAorLyoKKyAqIENvcHlyaWdo
dCAoQykgMjAxNSBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0
cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRo
b3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9s
bG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Yg
c291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNl
LCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgor
ICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBh
Ym92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5k
IHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5k
L29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgor
ICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIGBgQVMgSVMnJyBBTkQg
QU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9U
IExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElU
WSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVE
LiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJ
QUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBF
WEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJ
TUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VT
OyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQ
VElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwg
V0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xV
RElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBU
SEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJ
QklMSVRZIE9GIFNVQ0ggREFNQUdFLiAKKyAqLworCisjaW5jbHVkZSAiY29uZmlnLmgiCisjaW5j
bHVkZSAiQWlyUmVnaXN0ZXJQcmlvcml0eS5oIgorCituYW1lc3BhY2UgSlNDIHsgbmFtZXNwYWNl
IEIzIHsgbmFtZXNwYWNlIEFpciB7CisKK2NvbnN0IFZlY3RvcjxHUFJSZWc+JiBncHNJblByaW9y
aXR5T3JkZXIoKQoreworICAgIHN0YXRpYyBWZWN0b3I8R1BSUmVnPiogcmVzdWx0OworICAgIHN0
YXRpYyBzdGQ6Om9uY2VfZmxhZyBvbmNlOworICAgIHN0ZDo6Y2FsbF9vbmNlKAorICAgICAgICBv
bmNlLAorICAgICAgICBbXSB7CisgICAgICAgICAgICByZXN1bHQgPSBuZXcgVmVjdG9yPEdQUlJl
Zz4oKTsKKyAgICAgICAgICAgIFJlZ2lzdGVyU2V0IGFsbCA9IFJlZzo6YWxsR1BScygpOworICAg
ICAgICAgICAgYWxsLmV4Y2x1ZGUoUmVnaXN0ZXJTZXQ6OnN0YWNrUmVnaXN0ZXJzKCkpOworICAg
ICAgICAgICAgYWxsLmV4Y2x1ZGUoUmVnaXN0ZXJTZXQ6OnJlc2VydmVkSGFyZHdhcmVSZWdpc3Rl
cnMoKSk7CisgICAgICAgICAgICBSZWdpc3RlclNldCBjYWxsZWVTYXZlID0gUmVnaXN0ZXJTZXQ6
OmNhbGxlZVNhdmVSZWdpc3RlcnMoKTsKKyAgICAgICAgICAgIGZvciAoUmVnIHJlZyA6IGFsbCkg
eworICAgICAgICAgICAgICAgIGlmICghY2FsbGVlU2F2ZS5nZXQocmVnKSkKKyAgICAgICAgICAg
ICAgICAgICAgcmVzdWx0LT5hcHBlbmQocmVnLmdwcigpKTsKKyAgICAgICAgICAgIH0KKyAgICAg
ICAgICAgIGZvciAoUmVnIHJlZyA6IGFsbCkgeworICAgICAgICAgICAgICAgIGlmIChjYWxsZWVT
YXZlLmdldChyZWcpKQorICAgICAgICAgICAgICAgICAgICByZXN1bHQtPmFwcGVuZChyZWcuZ3By
KCkpOworICAgICAgICAgICAgfQorICAgICAgICB9KTsKKyAgICByZXR1cm4gKnJlc3VsdDsKK30K
KworY29uc3QgVmVjdG9yPEZQUlJlZz4mIGZwc0luUHJpb3JpdHlPcmRlcigpCit7CisgICAgc3Rh
dGljIFZlY3RvcjxGUFJSZWc+KiByZXN1bHQ7CisgICAgc3RhdGljIHN0ZDo6b25jZV9mbGFnIG9u
Y2U7CisgICAgc3RkOjpjYWxsX29uY2UoCisgICAgICAgIG9uY2UsCisgICAgICAgIFtdIHsKKyAg
ICAgICAgICAgIHJlc3VsdCA9IG5ldyBWZWN0b3I8RlBSUmVnPigpOworICAgICAgICAgICAgUmVn
aXN0ZXJTZXQgYWxsID0gUmVnOjphbGxGUFJzKCk7CisgICAgICAgICAgICBSZWdpc3RlclNldCBj
YWxsZWVTYXZlID0gUmVnaXN0ZXJTZXQ6OmNhbGxlZVNhdmVSZWdpc3RlcnMoKTsKKyAgICAgICAg
ICAgIGZvciAoUmVnIHJlZyA6IGFsbCkgeworICAgICAgICAgICAgICAgIGlmICghY2FsbGVlU2F2
ZS5nZXQocmVnKSkKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0LT5hcHBlbmQocmVnLmdwcigp
KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZvciAoUmVnIHJlZyA6IGFsbCkgeworICAg
ICAgICAgICAgICAgIGlmIChjYWxsZWVTYXZlLmdldChyZWcpKQorICAgICAgICAgICAgICAgICAg
ICByZXN1bHQtPmFwcGVuZChyZWcuZ3ByKCkpOworICAgICAgICAgICAgfQorICAgICAgICB9KTsK
KyAgICByZXR1cm4gKnJlc3VsdDsKK30KKworY29uc3QgVmVjdG9yPFJlZz4mIHJlZ3NJblByaW9y
aXR5T3JkZXIoQXJnOjpUeXBlIHR5cGUpCit7CisgICAgc3RhdGljIFZlY3RvcjxSZWc+KiByZXN1
bHRbQXJnOjpudW1UeXBlc107CisgICAgc3RhdGljIHN0ZDo6b25jZV9mbGFnIG9uY2U7CisgICAg
c3RkOjpjYWxsX29uY2UoCisgICAgICAgIG9uY2UsCisgICAgICAgIFtdIHsKKyAgICAgICAgICAg
IHJlc3VsdFtBcmc6OkdQXSA9IG5ldyBWZWN0b3I8UmVnPigpOworICAgICAgICAgICAgZm9yIChH
UFJSZWcgcmVnIDogZ3Byc0luUHJpb3JpdHlPcmRlcigpKQorICAgICAgICAgICAgICAgIHJlc3Vs
dFtBcmc6OkdQXS0+YXBwZW5kKFJlZyhyZWcpKTsKKyAgICAgICAgICAgIHJlc3VsdFtBcmc6OkZQ
XSA9IG5ldyBWZWN0b3I8UmVnPigpOworICAgICAgICAgICAgZm9yIChGUFJSZWcgcmVnIDogZnBy
c0luUHJpb3JpdHlPcmRlcigpKQorICAgICAgICAgICAgICAgIHJlc3VsdFtBcmc6OkZQXS0+YXBw
ZW5kKFJlZyhyZWcpKTsKKyAgICAgICAgfSk7CisgICAgcmV0dXJuICpyZXN1bHRbdHlwZV07Cit9
CisKK30gfSB9IC8vIG5hbWVzcGFjZSBKU0M6OkIzOjpBaXIKKworCkluZGV4OiBTb3VyY2UvSmF2
YVNjcmlwdENvcmUvYjMvYWlyL0FpclJlZ2lzdGVyUHJpb3JpdHkuaAo9PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBT
b3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvYWlyL0FpclJlZ2lzdGVyUHJpb3JpdHkuaAkocmV2aXNp
b24gMCkKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9haXIvQWlyUmVnaXN0ZXJQcmlvcml0
eS5oCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsNTggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMp
IDIwMTUgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0
aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAor
ICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2lu
ZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJj
ZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhp
cyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIu
IFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUg
Y29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUg
Zm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBv
dGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRI
SVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQor
ICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1J
VEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5E
IEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElO
IE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUg
Rk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBM
QVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVE
IFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9T
UyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04p
IEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRI
RVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcg
TkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVT
RQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElU
WSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKworI2lmbmRlZiBBaXJSZWdpc3RlclByaW9yaXR5X2gK
KyNkZWZpbmUgQWlyUmVnaXN0ZXJQcmlvcml0eV9oCisKKyNpbmNsdWRlICJBaXJBcmcuaCIKKyNp
bmNsdWRlICJGUFJJbmZvLmgiCisjaW5jbHVkZSAiR1BSSW5mby5oIgorI2luY2x1ZGUgPHd0Zi9W
ZWN0b3IuaD4KKworbmFtZXNwYWNlIEpTQyB7IG5hbWVzcGFjZSBCMyB7IG5hbWVzcGFjZSBBaXIg
eworCitjb25zdCBWZWN0b3I8R1BSUmVnPiYgZ3Byc0luUHJpb3JpdHlPcmRlcigpOworY29uc3Qg
VmVjdG9yPEZQUlJlZz4mIGZwcnNJblByaW9yaXR5T3JkZXIoKTsKKwordGVtcGxhdGU8dHlwZW5h
bWUgQmFuaz4gc3RydWN0IFJlZ2lzdGVyc0luUHJpb3JpdHlPcmRlcjsKK3RlbXBsYXRlPD4gc3Ry
dWN0IFJlZ2lzdGVyc0luUHJpb3JpdHlPcmRlcjxHUFJJbmZvPiB7CisgICAgY29uc3QgVmVjdG9y
PEdQUlJlZz4mIGluUHJpb3JpdHlPcmRlcigpIHsgcmV0dXJuIGdwc0luUHJpb3JpdHlPcmRlcigp
OyB9Cit9OwordGVtcGxhdGU8PiBzdHJ1Y3QgUmVnaXN0ZXJzSW5Qcmlvcml0eU9yZGVyPEZQUklu
Zm8+IHsKKyAgICBjb25zdCBWZWN0b3I8RlBSUmVnPiYgaW5Qcmlvcml0eU9yZGVyKCkgeyByZXR1
cm4gZnBzSW5Qcmlvcml0eU9yZGVyKCk7IH0KK307CisKK3RlbXBsYXRlPHR5cGVuYW1lIEJhbms+
Citjb25zdCBWZWN0b3I8QmFuazo6UmVnaXN0ZXJUeXBlPiYgcmVnc0luUHJpb3JpdHlPcmRlcigp
Cit7CisgICAgcmV0dXJuIFJlZ2lzdGVyc0luUHJpb3JpdHlPcmRlcjxCYW5rPjo6aW5Qcmlvcml0
eU9yZGVyKCk7Cit9CisKK2NvbnN0IFZlY3RvcjxSZWc+JiByZWdzSW5Qcmlvcml0eU9yZGVyKEFy
Zzo6VHlwZSk7CisKK30gfSB9IC8vIG5hbWVzcGFjZSBKU0M6OkIzOjpBaXIKKworI2VuZGlmIC8v
IEFpclJlZ2lzdGVyUHJpb3JpdHlfaAorCkluZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMv
YWlyL0FpclNwZWNpYWwuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9i
My9haXIvQWlyU3BlY2lhbC5jcHAJKHJldmlzaW9uIDApCisrKyBTb3VyY2UvSmF2YVNjcmlwdENv
cmUvYjMvYWlyL0FpclNwZWNpYWwuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsNjUgQEAK
Ky8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTUgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVk
LgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9y
bXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3Zp
ZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVk
aXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmln
aHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dp
bmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0
IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBv
ZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBk
b2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlz
dHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5D
LiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElO
Q0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBP
RiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9T
RSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IKKyAqIENP
TlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFM
LCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xV
RElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBH
T09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBC
VVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisg
KiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9S
IFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4g
QU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJ
U0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKworI2luY2x1ZGUg
ImNvbmZpZy5oIgorI2luY2x1ZGUgIkFpclNwZWNpYWwuaCIKKworI2luY2x1ZGUgPHd0Zi9TdHJp
bmdQcmludFN0cmVhbS5oPgorCituYW1lc3BhY2UgSlNDIHsgbmFtZXNwYWNlIEIzIHsgbmFtZXNw
YWNlIEFpciB7CisKK1NwZWNpYWw6OlNwZWNpYWwoY29uc3QgY2hhciogbmFtZSkKKyAgICA6IG1f
bmFtZShuYW1lKQorICAgICwgbV9pbmRleChVSU5UX01BWCkKK3sKK30KKworU3BlY2lhbDo6flNw
ZWNpYWwoKQoreworfQorCitDU3RyaW5nIFNwZWNpYWw6Om5hbWUoKSBjb25zdAoreworICAgIFN0
cmluZ1ByaW50U3RyZWFtIG91dDsKKyAgICBkdW1wSW1wbChvdXQpOworICAgIHJldHVybiBvdXQu
dG9DU3RyaW5nKCk7Cit9CisKK3ZvaWQgU3BlY2lhbDo6ZHVtcChQcmludFN0cmVhbSYgb3V0KSBj
b25zdAoreworICAgIG91dC5wcmludChkdW1wUHJlZml4KTsKKyAgICBkdW1wSW1wbChvdXQpOwor
ICAgIGlmIChtX2luZGV4ICE9IFVJTlRfTUFYKQorICAgICAgICBvdXQucHJpbnQobV9pbmRleCk7
Cit9CisKK3ZvaWQgU3BlY2lhbDo6ZGVlcER1bXAoUHJpbnRTdHJlYW0mIG91dCkgY29uc3QKK3sK
KyAgICBvdXQucHJpbnQoKnRoaXMsICI6ICIpOworICAgIGRlZXBEdW1wSW1wbChvdXQpOworfQor
Cit9IH0gfSAvLyBuYW1lc3BhY2UgSlNDOjpCMzo6QWlyCisKSW5kZXg6IFNvdXJjZS9KYXZhU2Ny
aXB0Q29yZS9iMy9haXIvQWlyU3BlY2lhbC5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2Ny
aXB0Q29yZS9iMy9haXIvQWlyU3BlY2lhbC5oCShyZXZpc2lvbiAwKQorKysgU291cmNlL0phdmFT
Y3JpcHRDb3JlL2IzL2Fpci9BaXJTcGVjaWFsLmgJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSwx
MjQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTUgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJl
c2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5h
cnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVk
IHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICog
MS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBj
b3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBm
b2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9y
bSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMg
bGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisg
KiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0
aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQ
TEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJ
RVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFO
VElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICog
UFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IK
KyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJ
REVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMg
KElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJ
VFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRT
OyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhF
T1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJ
VFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJ
TkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJ
RiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKworI2lm
bmRlZiBBaXJTcGVjaWFsX2gKKyNkZWZpbmUgQWlyU3BlY2lhbF9oCisKKyNpbmNsdWRlICJBaXJJ
bnN0LmgiCisjaW5jbHVkZSA8d3RmL0Zhc3RNYWxsb2MuaD4KKyNpbmNsdWRlIDx3dGYvTm9uY29w
eWFibGUuaD4KKyNpbmNsdWRlIDx3dGYvU2NvcGVkTGFtYmRhLmg+CisjaW5jbHVkZSA8d3RmL3Rl
eHQvQ1N0cmluZy5oPgorCituYW1lc3BhY2UgSlNDIHsgbmFtZXNwYWNlIEIzIHsgbmFtZXNwYWNl
IEFpciB7CisKK2NsYXNzIEdlbmVyYXRpb25Db250ZXh0OworCitjbGFzcyBTcGVjaWFsIHsKKyAg
ICBXVEZfTUFLRV9OT05DT1BZQUJMRShTcGVjaWFsKTsKKyAgICBXVEZfTUFLRV9GQVNUX0FMTE9D
QVRFRDsKK3B1YmxpYzoKKyAgICBzdGF0aWMgY29uc3QgY2hhciogZHVtcFByZWZpeCA9ICImIjsK
KyAgICAKKyAgICBTcGVjaWFsKCk7CisgICAgdmlydHVhbCB+U3BlY2lhbCgpOworCisgICAgQ1N0
cmluZyBuYW1lKCkgY29uc3Q7CisKKyAgICB2aXJ0dWFsIHZvaWQgZm9yRWFjaEFyZyhJbnN0Jiwg
Y29uc3QgU2NvcGVkTGFtYmRhPEluc3Q6OkVhY2hBcmdDYWxsYmFjaz4mKSA9IDA7CisgICAgdmly
dHVhbCBib29sIGlzVmFsaWQoSW5zdCYpID0gMDsKKyAgICB2aXJ0dWFsIGJvb2wgYWRtaXRzU3Rh
Y2soSW5zdCYsIHVuc2lnbmVkIGFyZ0luZGV4KSA9IDA7CisKKyAgICAvLyBUaGlzIGdldHMgY2Fs
bGVkIG9uIGZvciBlYWNoIEluc3QgdGhhdCB1c2VzIHRoaXMgU3BlY2lhbC4gTm90ZSB0aGF0IHRo
ZXJlIGlzIG5vIHdheSB0bworICAgIC8vIGd1YXJhbnRlZSB0aGF0IGEgU3BlY2lhbCBnZXRzIHVz
ZWQgZnJvbSBqdXN0IG9uZSBJbnN0LCBiZWNhdXNlIEFpciBtaWdodCB0YWlsZHVwIGxhdGUuIFNv
LAorICAgIC8vIGlmIHlvdSB3YW50IHRvIHBhc3MgdGhpcyBpbmZvcm1hdGlvbiBkb3duIHRvIGdl
bmVyYXRlKCksIHRoZW4geW91IGhhdmUgdG8gZWl0aGVyOgorICAgIC8vCisgICAgLy8gMSkgR2Vu
ZXJhdGUgQWlyIHRoYXQgc3RhcnRzIHdpdGggYSBzZXBhcmF0ZSBTcGVjaWFsIHBlciBQYXRjaCBJ
bnN0LCBhbmQgdGhlbiBtZXJnZQorICAgIC8vICAgIHVzZWRSZWdpc3RlciBzZXRzLiBUaGlzIGlz
IHByb2JhYmx5IG5vdCBncmVhdCwgYnV0IGl0IG9wdGltaXplcyBmb3IgdGhlIGNvbW1vbiBjYXNl
IHRoYXQKKyAgICAvLyAgICBBaXIgZGlkbid0IGR1cGxpY2F0ZSBjb2RlIG9yIHRoYXQgc3VjaCBk
dXBsaWNhdGlvbiBkaWRuJ3QgY2F1c2UgYW55IGludGVyZXN0aW5nIGNoYW5nZXMgdG8KKyAgICAv
LyAgICByZWdpc3RlciBhc3NpZ25tZW50LgorICAgIC8vCisgICAgLy8gMikgSGF2ZSB0aGUgU3Bl
Y2lhbCBtYWludGFpbiBhIEhhc2hNYXA8SW5zdCosIFJlZ2lzdGVyU2V0Pi4gVGhpcyB3b3JrcyBi
ZWNhdXNlIHRoZSBhbmFseXNpcworICAgIC8vICAgIHRoYXQgZmVlZHMgaW50byB0aGlzIGNhbGwg
aXMgcGVyZm9ybWVkIGp1c3QgYmVmb3JlIGNvZGUgZ2VuZXJhdGlvbiBhbmQgdGhlcmUgaXMgbm8g
d2F5CisgICAgLy8gICAgZm9yIHRoZSBWZWN0b3I8PidzIHRoYXQgY29udGFpbiB0aGUgSW5zdHMg
dG8gYmUgcmVhbGxvY2F0ZWQuIFRoaXMgYWxsb3dzIGdlbmVyYXRlKCkgdG8KKyAgICAvLyAgICBj
b25zdWx0IHRoZSBIYXNoTWFwLgorICAgIC8vCisgICAgLy8gMykgSHlicmlkOiB5b3UgY291bGQg
dXNlICgxKSBhbmQgZmlyZSB1cCBhIEhhc2hNYXAgaWYgeW91IHNlZSBtdWx0aXBsZSBjYWxscy4K
KyAgICAvLworICAgIC8vIE5vdGUgdGhhdCBpdCdzIG5vdCBwb3NzaWJsZSB0byByZWx5IG9uIHJl
cG9ydFVzZWRSZWdpc3RlcnMoKSBiZWluZyBjYWxsZWQgaW4gdGhlIHNhbWUgb3JkZXIKKyAgICAv
LyBhcyBnZW5lcmF0ZSgpLiBJZiB3ZSBjb3VsZCByZWx5IG9uIHRoYXQsIHRoZW4gd2UgY291bGQg
anVzdCBoYXZlIGVhY2ggU3BlY2lhbCBpbnN0YW5jZQorICAgIC8vIG1haW50YWluIGEgVmVjdG9y
IG9mIFJlZ2lzdGVyU2V0J3MgYW5kIHRoZW4gcHJvY2VzcyB0aGF0IHZlY3RvciBpbiB0aGUgcmln
aHQgb3JkZXIgaW4KKyAgICAvLyBnZW5lcmF0ZSgpLiBCdXQsIHRoZSBvcmRlcmluZyBkaWZmZXJl
bmNlIGlzIHVubGlrZWx5IHRvIGNoYW5nZSBzaW5jZSBpdCB3b3VsZCBoYXJtIHRoZQorICAgIC8v
IHBlcmZvcm1hbmNlIG9mIHRoZSBsaXZlbmVzcyBhbmFseXNpcy4KKyAgICAvLworICAgIC8vIEN1
cnJlbnRseSwgd2UgZG8gKDEpIGZvciBCMyBzdGFja21hcHMuCisgICAgdmlydHVhbCB2b2lkIHJl
cG9ydFVzZWRSZWdpc3RlcnMoSW5zdCYsIGNvbnN0IFJlZ2lzdGVyU2V0JikgPSAwOworICAgIAor
ICAgIHZpcnR1YWwgQ0NhbGxIZWxwZXJzOjpKdW1wIGdlbmVyYXRlKEluc3QmLCBDQ2FsbEhlbHBl
cnMmLCBHZW5lcmF0aW9uQ29udGV4dCYpID0gMDsKKworICAgIHZpcnR1YWwgY29uc3QgUmVnaXN0
ZXJTZXQmIGV4dHJhQ2xvYmJlcmVkUmVncyhJbnN0JikgPSAwOworCisgICAgdm9pZCBkdW1wKFBy
aW50U3RyZWFtJikgY29uc3Q7CisgICAgdm9pZCBkZWVwRHVtcChQcmludFN0cmVhbSYpIGNvbnN0
OworCitwcm90ZWN0ZWQ6CisgICAgdmlydHVhbCB2b2lkIGR1bXBJbXBsKFByaW50U3RyZWFtJikg
Y29uc3QgPSAwOworICAgIHZpcnR1YWwgdm9pZCBkZWVwRHVtcEltcGwoUHJpbnRTdHJlYW0mKSBj
b25zdCA9IDA7CisKK3ByaXZhdGU6CisgICAgZnJpZW5kIGNsYXNzIENvZGU7CisKKyAgICBjb25z
dCBjaGFyKiBtX25hbWU7CisgICAgdW5zaWduZWQgbV9pbmRleDsKK307CisKK2NsYXNzIERlZXBT
cGVjaWFsRHVtcCB7CitwdWJsaWM6CisgICAgRGVlcFNwZWNpYWxEaW1wKFNwZWNpYWwqIHNwZWNp
YWwpCisgICAgICAgIDogbV9zcGVjaWFsKHNwZWNpYWwpCisgICAgeworICAgIH0KKworICAgIHZv
aWQgZHVtcChQcmludFN0cmVhbSYgb3V0KSBjb25zdAorICAgIHsKKyAgICAgICAgaWYgKG1fc3Bl
Y2lhbCkKKyAgICAgICAgICAgIG1fc3BlY2lhbC0+ZGVlcER1bXAob3V0KTsKKyAgICAgICAgZWxz
ZQorICAgICAgICAgICAgb3V0LnByaW50KCI8bnVsbD4iKTsKKyAgICB9CisKK3ByaXZhdGU6Cisg
ICAgU3BlY2lhbCogbV9zcGVjaWFsOworfTsKKworRGVlcFNwZWNpYWxEdW1wIGRlZXBEdW1wKFNw
ZWNpYWwqIHNwZWNpYWwpCit7CisgICAgcmV0dXJuIERlZXBTcGVjaWFsRHVtcChzcGVjaWFsKTsK
K30KKworfSB9IH0gLy8gbmFtZXNwYWNlIEpTQzo6QjM6OkFpcgorCisjZW5kaWYgLy8gQWlyU3Bl
Y2lhbF9oCisKSW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9haXIvQWlyU3BpbGxFdmVy
eXRoaW5nLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvYWlyL0Fp
clNwaWxsRXZlcnl0aGluZy5jcHAJKHJldmlzaW9uIDApCisrKyBTb3VyY2UvSmF2YVNjcmlwdENv
cmUvYjMvYWlyL0FpclNwaWxsRXZlcnl0aGluZy5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTAsMCAr
MSwxMzkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTUgQXBwbGUgSW5jLiBBbGwgcmlnaHRz
IHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBi
aW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0
dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0Ogor
ICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92
ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRo
ZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkg
Zm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRo
aXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhl
CisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0
aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkg
QVBQTEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJB
TlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FS
UkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgor
ICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4g
T1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJ
TkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFH
RVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VC
U1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9G
SVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkg
VEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFC
SUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFS
SVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZF
TiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKwor
I2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgIkFpclNwaWxsRXZlcnl0aGluZy5oIgorCisj
aW5jbHVkZSAiQWlyQ29kZS5oIgorI2luY2x1ZGUgIkFpckluc2VydGlvblNldC5oIgorI2luY2x1
ZGUgIkFpclBoYXNlU2NvcGUuaCIKKworbmFtZXNwYWNlIEpTQyB7IG5hbWVzcGFjZSBCMyB7IG5h
bWVzcGFjZSBBaXIgeworCit2b2lkIHNwaWxsRXZlcnl0aGluZyhDb2RlJiBjb2RlKQoreworICAg
IFBoYXNlU2NvcGUgcGhhc2VTY29wZShjb2RlLCAic3BpbGxFdmVyeXRoaW5nIik7CisKKyAgICAv
LyBXZSB3YW50IHRvIGtub3cgdGhlIHNldCBvZiByZWdpc3RlcnMgdXNlZCBhdCBldmVyeSBwb2lu
dCBpbiBldmVyeSBiYXNpYyBibG9jay4KKyAgICBJbmRleE1hcDxCYXNpY0Jsb2NrLCBWZWN0b3I8
UmVnaXN0ZXJTZXQ+PiB1c2VkUmVnaXN0ZXJzKGNvZGUuc2l6ZSgpKTsKKyAgICBMaXZlbmVzczxU
bXA+IGxpdmVuZXNzKGNvZGUpOworICAgIGZvciAoQmFzaWNCbG9jayogYmxvY2sgOiBjb2RlKSB7
CisgICAgICAgIExpdmVuZXNzPFRtcD46OkxvY2FsQ2FsYyBsb2NhbENhbGMobGl2ZW5lc3MsIGJs
b2NrKTsKKyAgICAgICAgdXNlZFJlZ2lzdGVyc1tibG9ja10ucmVzaXplKGJsb2NrLT5zaXplKCkg
KyAxKTsKKworICAgICAgICBhdXRvIHNldFVzZWRSZWdpc3RlcnMgPSBbJl0gKHVuc2lnbmVkIGlu
ZGV4KSB7CisgICAgICAgICAgICBSZWdpc3RlclNldCYgc2V0ID0gdXNlZFJlZ2lzdGVyc1tibG9j
a11baW5kZXhdOworICAgICAgICAgICAgZm9yIChUbXAgdG1wIDogbG9jYWxDYWxjLmxpdmUoKSkg
eworICAgICAgICAgICAgICAgIGlmICh0bXAuaXNSZWcoKSkKKyAgICAgICAgICAgICAgICAgICAg
c2V0LnNldCh0bXAucmVnKCkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAg
c2V0VXNlZFJlZ2lzdGVycyhibG9jay0+c2l6ZSgpKTsKKyAgICAgICAgCisgICAgICAgIGZvciAo
dW5zaWduZWQgaW5zdEluZGV4ID0gYmxvY2stPnNpemUoKTsgaW5zdEluZGV4LS07KSB7CisgICAg
ICAgICAgICBsb2NhbENhbGMuZXhlY3V0ZShibG9jay0+YXQoaW5zdEluZGV4KSk7CisgICAgICAg
ICAgICBzZXRVc2VkcmVnaXN0ZXJzKGluc3RJbmRleCk7CisgICAgICAgIH0KKyAgICB9CisKKyAg
ICAvLyBBbGxvY2F0ZSBhIHN0YWNrIHNsb3QgZm9yIGVhY2ggdG1wLgorICAgIFZlY3RvcjxTdGFj
a1Nsb3QqPiBhbGxTdGFja1Nsb3RzW0FyZzo6bnVtVHlwZXNdOworICAgIGZvciAodW5zaWduZWQg
dHlwZUluZGV4ID0gMDsgdHlwZUluZGV4IDwgQXJnOjpudW1UeXBlczsgKyt0eXBlSW5kZXgpIHsK
KyAgICAgICAgVmVjdG9yPFN0YWNrU2xvdCo+JiBzdGFja1Nsb3RzID0gYWxsU3RhY2tTbG90c1t0
eXBlSW5kZXhdOworICAgICAgICBBcmc6OlR5cGUgdHlwZSA9IHN0YXRpY19jYXN0PEFyZzo6VHlw
ZT4odHlwZUluZGV4KTsKKyAgICAgICAgc3RhY2tTbG90cy5yZXNpemUoY29kZS5udW1UbXBzKHR5
cGUpKTsKKyAgICAgICAgZm9yICh1bnNpZ25lZCB0bXBJbmRleCA9IGNvZGUubnVtVG1wcyh0eXBl
KTsgdG1wSW5kZXgtLTspCisgICAgICAgICAgICBzdGFja1Nsb3RzW3RtcEluZGV4XSA9IGNvZGUu
YWRkU3RhY2tTbG90KDgsIFN0YWNrU2xvdEtpbmQ6OkFub255bW91cyk7CisgICAgfQorCisgICAg
SW5zZXJ0aW9uU2V0IGluc2VydGlvblNldChjb2RlKTsKKyAgICBmb3IgKEJhc2ljQmxvY2sqIGJs
b2NrIDogY29kZSkgeworICAgICAgICBmb3IgKHVuc2lnbmVkIGluc3RJbmRleCA9IDA7IGluc3RJ
bmRleCA8IGJsb2NrLT5zaXplKCk7ICsraW5zdEluZGV4KSB7CisgICAgICAgICAgICBSZWdpc3Rl
clNldCYgc2V0QmVmb3JlID0gdXNlZFJlZ2lzdGVyc1tibG9ja11baW5zdEluZGV4XTsKKyAgICAg
ICAgICAgIFJlZ2lzdGVyU2V0JiBzZXRBZnRlciA9IHVzZWRSZWdpc3RlcnNbYmxvY2tdW2luc3RJ
bmRleCArIDFdOworICAgICAgICAgICAgSW5zdCYgaW5zdCA9IGJsb2NrLT5hdChpbnN0SW5kZXgp
OworICAgICAgICAgICAgaW5zdC5mb3JFYWNoVG1wKAorICAgICAgICAgICAgICAgIFsmXSAoVG1w
JiB0bXAsIEFyZzo6Um9sZSByb2xlLCBBcmc6OlR5cGUgdHlwZSkgeworICAgICAgICAgICAgICAg
ICAgICBpZiAodG1wLmlzUmVnKCkpCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CisK
KyAgICAgICAgICAgICAgICAgICAgU3RhY2tTbG90KiBzdGFja1Nsb3QgPSBhbGxTdGFja1Nsb3Rz
W3R5cGVdW3RtcC50bXBJbmRleCgpXTsKKyAgICAgICAgICAgICAgICAgICAgQXJnIGFyZyA9IEFy
Zzo6c3RhY2soc3RhY2tTbG90KTsKKworICAgICAgICAgICAgICAgICAgICAvLyBOZWVkIHRvIGZp
Z3VyZSBvdXQgYSByZWdpc3RlciB0byB1c2UuIEhvdyB3ZSBkbyB0aGF0IGRlcGVuZHMgb24gdGhl
IHJvbGUuCisgICAgICAgICAgICAgICAgICAgIFJlZyBjaG9zZW5SZWc7CisgICAgICAgICAgICAg
ICAgICAgIHN3aXRjaCAocm9sZSkgeworICAgICAgICAgICAgICAgICAgICBjYXNlIEFyZzo6VXNl
OgorICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChSZWcgcmVnIDogcmVnc0luUHJpb3JpdHlP
cmRlcih0eXBlKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghc2V0QmVmb3Jl
LmdldChyZWcpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldEJlZm9yZS5z
ZXQocmVnKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hvc2VuUmVnID0gcmVn
OworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAg
ICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAg
ICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBBcmc6OkRlZjoKKyAg
ICAgICAgICAgICAgICAgICAgICAgIGZvciAoUmVnIHJlZyA6IHJlZ3NJblByaW9yaXR5T3JkZXIo
dHlwZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXNldEFmdGVyLmdldChy
ZWcpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldEFmdGVyLnNldChyZWcp
OworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaG9zZW5SZWcgPSByZWc7CisgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAg
ICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAg
ICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIEFyZzo6VXNlRGVmOgorICAgICAg
ICAgICAgICAgICAgICAgICAgZm9yIChSZWcgcmVnIDogcmVnc0luUHJpb3JpdHlPcmRlcih0eXBl
KSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghc2V0QmVmb3JlLmdldChyZWcp
ICYmICFzZXRBZnRlci5nZXQocmVnKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICBzZXRBZnRlci5zZXQocmVnKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0
QmVmb3JlLnNldChyZWcpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaG9zZW5S
ZWcgPSByZWc7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAg
ICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAg
ICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAg
ICAgICAgICAgICAgIFJFTEVBU0VfQVNTRVJUX05PVF9SRUFDSEVEKGNob3NlblJlZyk7CisKKyAg
ICAgICAgICAgICAgICAgICAgdG1wID0gVG1wKGNob3NlblJlZyk7CisKKyAgICAgICAgICAgICAg
ICAgICAgT3Bjb2RlIG1vdmUgPSB0eXBlID09IEFyZzo6R1AgPyBNb3ZlIDogTW92ZURvdWJsZQor
CisgICAgICAgICAgICAgICAgICAgIGlmIChBcmc6OmlzVXNlKHJvbGUpKSB7CisgICAgICAgICAg
ICAgICAgICAgICAgICBpbnNlcnRpb25TZXQuaW5zZXJ0KAorICAgICAgICAgICAgICAgICAgICAg
ICAgICAgIGluc3RJbmRleCwgbW92ZSwgaW5zdC5vcmlnaW4sIGFyZywgdG1wKTsKKyAgICAgICAg
ICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAoQXJnOjppc0RlZihyb2xlKSkg
eworICAgICAgICAgICAgICAgICAgICAgICAgaW5zZXJ0aW9uU2V0Lmluc2VydCgKKyAgICAgICAg
ICAgICAgICAgICAgICAgICAgICBpbnN0SW5kZXggKyAxLCBtb3ZlLCBpbnN0Lm9yaWdpbiwgdG1w
LCBhcmcpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSk7CisgICAg
ICAgIH0KKyAgICAgICAgaW5zZXJ0aW9uU2V0LmV4ZWN1dGUoYmxvY2spOworICAgIH0KK30KKwor
fSB9IH0gLy8gbmFtZXNwYWNlIEpTQzo6QjM6OkFpcgorCkluZGV4OiBTb3VyY2UvSmF2YVNjcmlw
dENvcmUvYjMvYWlyL0FpclNwaWxsRXZlcnl0aGluZy5oCj09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9K
YXZhU2NyaXB0Q29yZS9iMy9haXIvQWlyU3BpbGxFdmVyeXRoaW5nLmgJKHJldmlzaW9uIDApCisr
KyBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvYWlyL0FpclNwaWxsRXZlcnl0aGluZy5oCSh3b3Jr
aW5nIGNvcHkpCkBAIC0wLDAgKzEsNDkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTUgQXBw
bGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1
c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZp
Y2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRp
b25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11
c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9m
IGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJp
YnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0
CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5n
IGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRl
cmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdB
UkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVT
UyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBU
SEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1Mg
Rk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5U
IFNIQUxMIEFQUExFIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBE
SVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBD
T05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICog
UFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0Us
IERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIg
Q0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09O
VFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5D
RSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0Yg
VEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNI
IERBTUFHRS4gCisgKi8KKworI2lmbmRlZiBBaXJTcGlsbEV2ZXJ5dGhpbmdfaAorI2RlZmluZSBB
aXJTcGlsbEV2ZXJ5dGhpbmdfaAorCituYW1lc3BhY2UgSlNDIHsgbmFtZXNwYWNlIEIzIHsgbmFt
ZXNwYWNlIEFpciB7CisKK2NsYXNzIENvZGU7CisKKy8vIFRoaXMgaXMgYSBwaGFzZSBmb3IgdGVz
dGluZy4gSXQgYmVoYXZlcyBsaWtlIGEgcmVnaXN0ZXIgYWxsb2NhdG9yIGluIHRoZSBzZW5zZSB0
aGF0IGl0CisvLyBlbGltaW5hdGVzIHRlbXBvcmFyaWVzIGZyb20gdGhlIHByb2dyYW0uIEl0IGFj
Y29tcGxpc2hlcyB0aGlzIGJ5IGFsd2F5cyBzcGlsbGluZyBhbGwKKy8vIHRlbXBvcmFyaWVzLiBU
aGUgcmVzdWx0aW5nIGNvZGUgaXMgZ29pbmcgdG8gYmUgdmVyeSBpbmVmZmljaWVudC4gVGhpcyBw
aGFzZSBpcyBncmVhdCBpZiB5b3UKKy8vIHRoaW5rIHRoYXQgdGhlcmUgaXMgYSBidWcgaW4gdGhl
IHJlZ2lzdGVyIGFsbG9jYXRvci4gWW91IGNhbiBjb25maXJtIHRoaXMgYnkgcnVubmluZyB0aGlz
CisvLyBwaGFzZSBpbnN0ZWFkIG9mIHRoZSByZWdpc3RlciBhbGxvY2F0b3IuCisvLworLy8gTm90
ZSB0aGF0IGV2ZW4gdGhvdWdoIHRoaXMgcGhhc2UgZG9lcyB0aGUgY2hlYXBlc3QgdGhpbmcgcG9z
c2libGUsIGl0J3Mgbm90IGV2ZW4gd3JpdHRlbiBpbiBhCisvLyBwYXJ0aWN1bGFybHkgZWZmaWNp
ZW50IHdheS4gU28sIGRvbid0IGdldCBhbnkgaWRlYXMgYWJvdXQgdXNpbmcgdGhpcyBwaGFzZSB0
byByZWR1Y2UgY29tcGlsZXIKKy8vIGxhdGVuY3kuIElmIHlvdSB3YW50ZWQgdG8gZG8gdGhhdCwg
eW91IHNob3VsZCBjb21lIHVwIHdpdGggYSBjbGV2ZXIgYWxnb3JpdGhtIGluc3RlYWQgb2YgdXNp
bmcKKy8vIHRoaXMgc2lsbHkgdGhpbmcuCisKK3ZvaWQgc3BpbGxFdmVyeXRoaW5nKENvZGUmKTsK
KworfSB9IH0gLy8gbmFtZXNwYWNlIEpTQzo6QjM6OkFpcgorCisjZW5kaWYgLy8gQWlyU3BpbGxF
dmVyeXRoaW5nX2gKKwpJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL2Fpci9BaXJTdGFj
a1Nsb3QuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvYWlyL0FpclN0
YWNrU2xvdC5oCShyZXZpc2lvbiAwKQorKysgU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL2Fpci9B
aXJTdGFja1Nsb3QuaAkod29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDk2IEBACisvKgorICogQ29w
eXJpZ2h0IChDKSAyMDE1IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBS
ZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9y
IHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRo
ZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9u
cyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBu
b3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWlt
ZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2Ug
dGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9u
cyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlv
biBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4K
KyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycn
IEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJV
VCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRB
QklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NM
QUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMg
QkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwK
KyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBO
T1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VS
VklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5U
RVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklM
SVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAo
SU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VU
IE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUg
UE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisKKyNpZm5kZWYgQWlyU3RhY2tTbG90
X2gKKyNkZWZpbmUgQWlyU3RhY2tTbG90X2gKKworI2luY2x1ZGUgIkIzU3RhY2tTbG90S2luZC5o
IgorI2luY2x1ZGUgPHd0Zi9Ob25Db3B5YWJsZS5oPgorI2luY2x1ZGUgPHd0Zi9GYXN0TWFsbG9j
Lmg+CisKK25hbWVzcGFjZSBKU0MgeyBuYW1lc3BhY2UgQjMgeworCitjbGFzcyBTdGFja1Nsb3R2
YWx1ZTsKKworbmFtZXNwYWNlIEFpciB7CisKK2NsYXNzIFN0YWNrU2xvdCB7CisgICAgV1RGX01B
S0VfTk9OQ09QWUFCTEUoU3RhY2tTbG90KTsKKyAgICBXVEZfTUFLRV9GQVNUX0FMTE9DQVRFRDsK
K3B1YmxpYzoKKyAgICB1bnNpZ25lZCBieXRlU2l6ZSgpIGNvbnN0IHsgcmV0dXJuIG1fYnl0ZVNp
emU7IH0KKyAgICBTdGFja1Nsb3RLaW5kIGtpbmQoKSBjb25zdCB7IHJldXRybiBtX2tpbmQ7IH0K
KyAgICB1bnNpZ25lZCBpbmRleCgpIGNvbnN0IHsgcmV0dXJuIG1faW5kZXg7IH0KKworICAgIFN0
YWNrU2xvdFZhbHVlKiB2YWx1ZSgpIGNvbnN0IHsgcmV0dXJuIG1fdmFsdWU7IH0KKworICAgIHZv
aWQgZHVtcChQcmludFN0cmVhbSYpIGNvbnN0OworICAgIHZvaWQgZGVlcER1bXAoUHJpbnRTdHJl
YW0mKSBjb25zdDsKKworcHJpdmF0ZToKKyAgICBmcmllbmQgY2xhc3MgQ29kZTsKKworICAgIFN0
YWNrU2xvdCh1bnNpZ25lZCBieXRlU2l6ZSwgdW5zaWduZWQgaW5kZXgsIFN0YWNrU2xvdEtpbmQg
a2luZCwgU3RhY2tTbG90VmFsdWUqIHZhbHVlKQorICAgICAgICA6IG1fYnl0ZVNpemUoYnl0ZVNp
emUpCisgICAgICAgICwgbV9pbmRleChpbmRleCkKKyAgICAgICAgLCBtX2tpbmQoa2luZCkKKyAg
ICAgICAgLCBtX3ZhbHVlKHZhbHVlKQorICAgIHsKKyAgICB9CisgICAgCisgICAgdW5zaWduZWQg
bV9ieXRlU2l6ZTsKKyAgICB1bnNpZ25lZCBtX2luZGV4OworICAgIFN0YWNrU2xvdEtpbmQgbV9r
aW5kOworICAgIFN0YWNrU2xvdFZhbHVlKiBtX3ZhbHVlOworfTsKKworY2xhc3MgRGVlcFN0YWNr
U2xvdER1bXAgeworcHVibGljOgorICAgIERlZXBTdGFja1Nsb3REdW1wKFN0YWNrU2xvdCogc2xv
dCkKKyAgICAgICAgOiBtX3Nsb3Qoc2xvdCkKKyAgICB7CisgICAgfQorCisgICAgdm9pZCBkdW1w
KFByaW50U3RyZWFtJiBvdXQpIGNvbnN0CisgICAgeworICAgICAgICBpZiAobV9zbG90KQorICAg
ICAgICAgICAgbV9zbG90LT5kZWVwRHVtcChvdXQpOworICAgICAgICBlbHNlCisgICAgICAgICAg
ICBvdXQucHJpbnQoIjxudWxsPiIpOworICAgIH0KKworcHJpdmF0ZToKKyAgICBTdGFja1Nsb3Qq
IG1fc2xvdDsKK307CisKK0RlZXBTdGFja1Nsb3REdW1wIGRlZXBEdW1wKFN0YWNrU2xvdCogc2xv
dCkKK3sKKyAgICByZXR1cm4gRGVlcFN0YWNrU2xvdER1bXAoc2xvdCk7Cit9CisKK30gfSB9IC8v
IG5hbWVzcGFjZSBKU0M6OkIzOjpBaXIKKworI2VuZGlmIC8vIEFpclN0YWNrU2xvdF9oCisKSW5k
ZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9haXIvQWlyVG1wLmNwcAo9PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0t
LSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvYWlyL0FpclRtcC5jcHAJKHJldmlzaW9uIDApCisr
KyBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvYWlyL0FpclRtcC5jcHAJKHdvcmtpbmcgY29weSkK
QEAgLTAsMCArMSw1MiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNSBBcHBsZSBJbmMuIEFs
bCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3Vy
Y2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFy
ZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFy
ZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4g
dGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9u
cyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGlu
IGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5v
dGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1l
ciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92
aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9W
SURFRCBCWSBBUFBMRSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJ
RUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1Q
TElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJU
SUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQ
TEUgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5E
SVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJ
QUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVO
VCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IK
KyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5E
IE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RS
SUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVS
V0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRX
QVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLiAK
KyAqLworCisjaW5jbHVkZSAiY29uZmlnLmgiCisjaW5jbHVkZSAiQWlyVG1wLmgiCisKK25hbWVz
cGFjZSBKU0MgeyBuYW1lc3BhY2UgQjMgeyBuYW1lc3BhY2UgQWlyIHsKKwordm9pZCBUbXA6OmR1
bXAoUHJpbnRTdHJlYW0mIG91dCkgY29uc3QKK3sKKyAgICBpZiAoISp0aGlzKSB7CisgICAgICAg
IG91dC5wcmludCgiPG5vbmU+Iik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpZiAo
aXNSZWcoKSkgeworICAgICAgICBvdXQucHJpbnQocmVnKCkpOworICAgICAgICByZXR1cm47Cisg
ICAgfQorCisgICAgaWYgKGlzR1BUbXAoKSkgeworICAgICAgICBvdXQucHJpbnQoIiV0bXAiLCBn
cFRtcEluZGV4KCkpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgb3V0LnByaW50KCIl
ZnRtcCIsIGZwVG1wSW5kZXgoKSk7Cit9CisKK30gfSB9IC8vIG5hbWVzcGFjZSBKU0M6OkIzOjpB
aXIKKwpJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL2Fpci9BaXJUbXAuaAo9PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvYWlyL0FpclRtcC5oCShyZXZpc2lvbiAw
KQorKysgU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL2Fpci9BaXJUbXAuaAkod29ya2luZyBjb3B5
KQpAQCAtMCwwICsxLDI1NSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNSBBcHBsZSBJbmMu
IEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBz
b3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24s
IGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAq
IGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRh
aW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0
aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25z
IGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAg
IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xh
aW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBw
cm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQ
Uk9WSURFRCBCWSBBUFBMRSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElN
UExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICog
SU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQ
QVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwg
QVBQTEUgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwg
SU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVF
TlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJF
TUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwg
T1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQg
QU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwg
U1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9U
SEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNP
RlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdF
LiAKKyAqLworCisjaWZuZGVmIEFpclRtcF9oCisjZGVmaW5lIEFpclRtcF9oCisKKyNpbmNsdWRl
ICJSZWcuaCIKKworbmFtZXNwYWNlIEpTQyB7IG5hbWVzcGFjZSBCMyB7IG5hbWVzcGFjZSBBaXIg
eworCisvLyBBIFRtcCBpcyBhIGdlbmVyYWxpemF0aW9uIG9mIGEgcmVnaXN0ZXIuIEl0IGNhbiBi
ZSB1c2VkIHRvIHJlZmVyIHRvIGFueSBHUFIgb3IgRlBSLiBJdCBjYW4gYWxzbworLy8gYmUgdXNl
ZCB0byByZWZlciB0byBhbiB1bmFsbG9jYXRlZCByZWdpc3RlciAoaS5lLiBhIHRlbXBvcmFyeSku
IExpa2UgbWFueSBBaXIgY2xhc3Nlcywgd2UgdXNlCisvLyBkZWxpYmVyYXRlbHkgdGVyc2UgbmFt
aW5nIHNpbmNlIHdlIHdpbGwgaGF2ZSB0byB1c2UgdGhpcyBuYW1lIGEgbG90LgorCitjbGFzcyBU
bXAgeworcHVibGljOgorICAgIFRtcCgpCisgICAgICAgIDogbV92YWx1ZSgwKQorICAgIHsKKyAg
ICB9CisKKyAgICBleHBsaWNpdCBUbXAoUmVnIHJlZykKKyAgICB7CisgICAgICAgIGlmIChyZWcp
IHsKKyAgICAgICAgICAgIGlmIChyZWcuaXNHUFIoKSkKKyAgICAgICAgICAgICAgICBtX3ZhbHVl
ID0gZW5jb2RlR1BSKHJlZy5ncHIoKSk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAg
ICAgbV92YWx1ZSA9IGVuY29kZUZQUihyZWcuZnByKCkpOworICAgICAgICB9IGVsc2UKKyAgICAg
ICAgICAgIG1fdmFsdWUgPSAwOworICAgIH0KKworICAgIGV4cGxpY2l0IFRtcChjb25zdCBBcmcm
KTsKKworICAgIHN0YXRpYyBUbXAgZ3BUbXBGb3JJbmRleCh1bnNpZ25lZCBpbmRleCkKKyAgICB7
CisgICAgICAgIFRtcCByZXN1bHQ7CisgICAgICAgIHJlc3VsdC5tX3ZhbHVlID0gZW5jb2RlR1BU
bXAoaW5kZXgpOworICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKworICAgIHN0YXRpYyBU
bXAgZnBUbXBGb3JJbmRleCh1bnNpZ25lZCBpbmRleCkKKyAgICB7CisgICAgICAgIFRtcCByZXN1
bHQ7CisgICAgICAgIHJlc3VsdC5tX3ZhbHVlID0gZW5jb2RlRlBUbXAoaW5kZXgpOworICAgICAg
ICByZXR1cm4gcmVzdWx0OworICAgIH0KKworICAgIHN0YXRpYyBUbXAgZm9yUmF3VmFsdWUodW5z
aWduZWQgaW5kZXgpCisgICAgeworICAgICAgICBUbXAgcmVzdWx0OworICAgICAgICByZXN1bHQu
bV92YWx1ZSA9IGluZGV4OworICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKworICAgIGV4
cGxpY2l0IG9wZXJhdG9yIGJvb2woKSBjb25zdCB7IHJldHVybiAhIW1fdmFsdWU7IH0KKworICAg
IGJvb2wgcmF3VmFsdWUoKSBjb25zdCB7IHJldHVybiBtX3ZhbHVlOyB9CisKKyAgICBib29sIGlz
R1AoKSBjb25zdAorICAgIHsKKyAgICAgICAgcmV0dXJuIGlzRW5jb2RlZEdQKG1fdmFsdWUpOwor
ICAgIH0KKworICAgIGJvb2wgaXNGUCgpIGNvbnN0CisgICAgeworICAgICAgICByZXR1cm4gaXNF
bmNvZGVkRlAobV92YWx1ZSk7CisgICAgfQorCisgICAgYm9vbCBpc0dQUigpIGNvbnN0CisgICAg
eworICAgICAgICByZXR1cm4gaXNFbmNvZGVkR1BSKG1fdmFsdWUpOworICAgIH0KKworICAgIGJv
b2wgaXNGUFIoKSBjb25zdAorICAgIHsKKyAgICAgICAgcmV0dXJuIGlzRW5jb2RlZEZQUihtX3Zh
bHVlKTsKKyAgICB9CisKKyAgICBib29sIGlzUmVnKCkgY29uc3QKKyAgICB7CisgICAgICAgIHJl
dHVybiBpc0dQUigpIHx8IGlzRlBSKCk7CisgICAgfQorCisgICAgR1BSUmVnIGdwcigpIGNvbnN0
CisgICAgeworICAgICAgICByZXR1cm4gZGVjb2RlR1BSKG1fdmFsdWUpOworICAgIH0KKworICAg
IEZQUlJlZyBmcHIoKSBjb25zdAorICAgIHsKKyAgICAgICAgcmV0dXJuIGRlY29kZUZQUihtX3Zh
bHVlKTsKKyAgICB9CisKKyAgICBSZWcgcmVnKCkgY29uc3QKKyAgICB7CisgICAgICAgIGlmIChp
c0dQKCkpCisgICAgICAgICAgICByZXR1cm4gZ3ByKCk7CisgICAgICAgIHJldHVybiBmcHIoKTsK
KyAgICB9CisKKyAgICB1bnNpZ25lZCBncFRtcEluZGV4KCkgY29uc3QKKyAgICB7CisgICAgICAg
IHJldHVybiBkZWNvZGVHUFRtcChtX3ZhbHVlKTsKKyAgICB9CisKKyAgICB1bnNpZ25lZCBmcFRt
cEluZGV4KCkgY29uc3QKKyAgICB7CisgICAgICAgIHJldHVybiBkZWNvZGVGUFRtcChtX3ZhbHVl
KTsKKyAgICB9CisKKyAgICB1bnNpZ25lZCB0bXBJbmRleCgpIGNvbnN0CisgICAgeworICAgICAg
ICBpZiAoaXNHUCgpKQorICAgICAgICAgICAgcmV0dXJuIGdwVG1wSW5kZXgoKTsKKyAgICAgICAg
cmV0dXJuIGZwVG1wSW5kZXgoKTsKKyAgICB9CisKKyAgICBib29sIGlzQWxpdmUoKSBjb25zdAor
ICAgIHsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgYm9vbCBvcGVyYXRvcj09
KGNvbnN0IFRtcCYgb3RoZXIpIGNvbnN0CisgICAgeworICAgICAgICByZXR1cm4gbV92YWx1ZSA9
PSBvdGhlci5tX3ZhbHVlOworICAgIH0KKworICAgIGJvb2wgb3BlcmF0b3IhPShjb25zdCBUbXAm
IG90aGVyKSBjb25zdAorICAgIHsKKyAgICAgICAgcmV0dXJuICEoKnRoaXMgPT0gb3RoZXIpOwor
ICAgIH0KKworICAgIHZvaWQgZHVtcChQcmludFN0cmVhbSYgb3V0KSBjb25zdDsKKyAgICAKK3By
aXZhdGU6CisgICAgc3RhdGljIGludCBlbmNvZGVHUCh1bnNpZ25lZCBpbmRleCkKKyAgICB7Cisg
ICAgICAgIHJldHVybiAxICsgaW5kZXg7CisgICAgfQorCisgICAgc3RhdGljIGludCBlbmNvZGVG
UCh1bnNpZ25lZCBpbmRleCkKKyAgICB7CisgICAgICAgIHJldHVybiAtMSAtIGluZGV4OworICAg
IH0KKworICAgIHN0YXRpYyBpbnQgZW5jb2RlR1BSKEdQUlJlZyBncHIpCisgICAgeworICAgICAg
ICByZXR1cm4gZW5jb2RlR1AoZ3ByIC0gTWFjcm9Bc3NlbWJsZXI6OmZpcnN0UmVnaXN0ZXIoKSk7
CisgICAgfQorCisgICAgc3RhdGljIGludCBlbmNvZGVGUFIoRlBSUmVnIGZwcikKKyAgICB7Cisg
ICAgICAgIHJldHVybiBlbmNvZGVGUChmcHIgLSBNYWNyb0Fzc2VtYmxlcjo6Zmlyc3RGUFJSZWdp
c3RlcigpKTsKKyAgICB9CisKKyAgICBzdGF0aWMgaW50IGVuY29kZUdQVG1wKHVuc2lnbmVkIGlu
ZGV4KQorICAgIHsKKyAgICAgICAgcmV0dXJuIGVuY29kZUdQUihNYWNyb0Fzc2VtYmxlcjo6bGFz
dFJlZ2lzdGVyKCkpICsgMSArIGluZGV4OworICAgIH0KKworICAgIHN0YXRpYyBpbnQgZW5jb2Rl
RlBUbXAodW5zaWduZWQgaW5kZXgpCisgICAgeworICAgICAgICByZXR1cm4gZW5jb2RlRlBSKE1h
Y3JvQXNzZW1ibGVyOjpsYXN0RlBSZWdpc3RlcigpKSAtIDEgLSBpbmRleDsKKyAgICB9CisKKyAg
ICBzdGF0aWMgYm9vbCBpc0VuY29kZWRHUChpbnQgdmFsdWUpCisgICAgeworICAgICAgICByZXR1
cm4gdmFsdWUgPiAwOworICAgIH0KKworICAgIHN0YXRpYyBib29sIGlzRW5jb2RlZEZQKGludCB2
YWx1ZSkKKyAgICB7CisgICAgICAgIHJldHVybiB2YWx1ZSA8IDA7CisgICAgfQorCisgICAgc3Rh
dGljIGJvb2wgaXNFbmNvZGVkR1BSKGludCB2YWx1ZSkKKyAgICB7CisgICAgICAgIHJldHVybiBp
c0VuY29kZWRHUCh2YWx1ZSkgJiYgdmFsdWUgPD0gZW5jb2RlR1BSKE1hY3JvQXNzZW1ibGVyOjps
YXN0UmVnaXN0ZXIoKSk7CisgICAgfQorCisgICAgc3RhdGljIGJvb2wgaXNFbmNvZGVkRlBSKGlu
dCB2YWx1ZSkKKyAgICB7CisgICAgICAgIHJldHVybiBpc0VuY29kZWRGUCh2YWx1ZSkgJiYgdmFs
dWUgPj0gZW5jb2RlZEZQUihNYWNyb0Fzc2VtYmxlcjo6bGFzdEZQUmVnaXN0ZXIoKSk7CisgICAg
fQorCisgICAgc3RhdGljIGJvb2wgaXNFbmNvZGVkR1BUbXAoaW50IHZhbHVlKQorICAgIHsKKyAg
ICAgICAgcmV0dXJuIGlzRW5jb2RlZEdQKHZhbHVlKSAmJiAhaXNFbmNvZGVkR1BSKHZhbHVlKTsK
KyAgICB9CisKKyAgICBzdGF0aWMgYm9vbCBpc0VuY29kZWRGUFRtcChpbnQgdmFsdWUpCisgICAg
eworICAgICAgICByZXR1cm4gaXNFbmNvZGVkRlAodmFsdWUpICYmICFpc0VuY29kZWRGUFIodmFs
dWUpOworICAgIH0KKworICAgIHN0YXRpYyBHUFJSZWcgZGVjb2RlR1BSKGludCB2YWx1ZSkKKyAg
ICB7CisgICAgICAgIEFTU0VSVChpc0VuY29kZWRHUFIodmFsdWUpKTsKKyAgICAgICAgcmV0dXJu
IHN0YXRpY19jYXN0PEdQUlJlZz4oCisgICAgICAgICAgICAodmFsdWUgLSBlbmNvZGVHUFIoTWFj
cm9Bc3NlbWJsZXI6OmZpcnN0UmVnaXN0ZXIoKSkpICsgTWFjcm9Bc3NlbWJsZXI6OmZpcnN0UmVn
aXN0ZXIoKSk7CisgICAgfQorCisgICAgc3RhdGljIEZQUlJlZyBkZWNvZGVGUFIoaW50IHZhbHVl
KQorICAgIHsKKyAgICAgICAgQVNTRVJUKGlzRW5jb2RlZEZQUih2YWx1ZSkpOworICAgICAgICBy
ZXR1cm4gc3RhdGljX2Nhc3Q8RlBSUmVnPigKKyAgICAgICAgICAgIChlbmNvZGVGUFIoTWFjcm9B
c3NlbWJsZXI6OmZpcnN0RlBSZWdpc3RlcigpKSAtIHZhbHVlKSArCisgICAgICAgICAgICBNYWNy
b0Fzc2VtYmxlcjo6Zmlyc3RGUFJlZ2lzdGVyKCkpOworICAgIH0KKworICAgIHN0YXRpYyB1bnNp
Z25lZCBkZWNvZGVHUFRtcChpbnQgdmFsdWUpCisgICAgeworICAgICAgICBBU1NFUlQoaXNFbmNv
ZGVkR1BUbXAodmFsdWUpKTsKKyAgICAgICAgcmV0dXJuIHZhbHVlIC0gKGVuY29kZUdQUihNYWNy
b0Fzc2VtYmxlcjo6bGFzdFJlZ2lzdGVyKCkpICsgMSk7CisgICAgfQorCisgICAgc3RhdGljIHVu
c2lnbmVkIGRlY29kZUZQVG1wKGludCB2YWx1ZSkKKyAgICB7CisgICAgICAgIEFTU0VSVChpc0Vu
Y29kZWRGUFRtcCh2YWx1ZSkpOworICAgICAgICByZXR1cm4gKGVuY29kZUZQUihNYWNyb0Fzc2Vt
Ymxlcjo6bGFzdEZQUmVnaXN0ZXIoKSkgLSAxKSAtIHZhbHVlOworICAgIH0KKworICAgIC8vIDA6
IGVtcHR5IFRtcAorICAgIC8vIHBvc2l0aXZlOiBHUFJzIGFuZCB0aGVuIEdQIHRlbXBzLgorICAg
IC8vIG5lZ2F0aXZlOiBGUFJzIGFuZCB0aGVuIEZQIHRlbXBzLgorICAgIGludCBtX3ZhbHVlOwor
fTsKKworfSB9IH0gLy8gbmFtZXNwYWNlIEpTQzo6QjM6OkFpcgorCisjZW5kaWYgLy8gQWlyVG1w
X2gKKwpJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL2Fpci9BaXJUbXBJbmxpbmVzLmgK
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL2Fpci9BaXJUbXBJbmxpbmVz
LmgJKHJldmlzaW9uIDApCisrKyBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvYWlyL0FpclRtcElu
bGluZXMuaAkod29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDQyIEBACisvKgorICogQ29weXJpZ2h0
IChDKSAyMDE1IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3Ry
aWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhv
dXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xs
b3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBz
b3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2Us
IHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisg
KiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFi
b3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQg
dGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQv
b3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisg
KiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBB
TlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1Qg
TElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZ
IEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQu
ICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElB
QkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVY
RU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElN
SVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7
IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBU
SU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBX
SEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVE
SU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRI
RSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lC
SUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisKKyNpZm5kZWYgQWlyVG1wSW5saW5lc19oCisj
ZGVmaW5lIEFpclRtcElubGluZXNfaAorCisjaW5jbHVkZSAiQWlyQXJnLmgiCisjaW5jbHVkZSAi
QWlyVG1wLmgiCisKK25hbWVzcGFjZSBKU0MgeyBuYW1lc3BhY2UgQjMgeyBuYW1lc3BhY2UgQWly
IHsKKworaW5saW5lIFRtcDo6VG1wKGNvbnN0IEFyZyYgYXJnKQoreworICAgICp0aGlzID0gYXJn
LnRtcCgpOworfQorCit9IH0gfSAvLyBuYW1lc3BhY2UgSlNDOjpCMzo6QWlyCisKKyNlbmRpZiAv
LyBBaXJUbXBJbmxpbmVzX2gKKwpJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL2Fpci9B
aXJWYWxpZGF0ZS5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL2Fp
ci9BaXJWYWxpZGF0ZS5jcHAJKHJldmlzaW9uIDApCisrKyBTb3VyY2UvSmF2YVNjcmlwdENvcmUv
YjMvYWlyL0FpclZhbGlkYXRlLmNwcAkod29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDEyNSBAQAor
LyoKKyAqIENvcHlyaWdodCAoQykgMjAxNSBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQu
CisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jt
cywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlk
ZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRp
c3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdo
dAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2lu
ZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3Qg
cmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9m
IGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRv
Y3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0
cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMu
IGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5D
TFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9G
IE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NF
IEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUgorICogQ09O
VFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUws
IFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVE
SU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdP
T0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJV
U0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAq
IE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1Ig
VE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBB
TlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklT
RUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLiAKKyAqLworCisjaW5jbHVkZSAi
Y29uZmlnLmgiCisjaW5jbHVkZSAiQWlyVmFsaWRhdGUuaCIKKworI2luY2x1ZGUgIkFpckNvZGUu
aCIKKworbmFtZXNwYWNlIEpTQyB7IG5hbWVzcGFjZSBCMyB7IG5hbWVzcGFjZSBBaXIgeworCitu
YW1lc3BhY2UgeworCitjbGFzcyBWYWxpZGF0ZXIgeworcHVibGljOgorICAgIFZhbGlkYXRlcihD
b2RlJiBjb2RlLCBjb25zdCBjaGFyKiB3aGVuLCBjb25zdCBjaGFyKiBkdW1wQmVmb3JlKQorICAg
ICAgICA6IG1fY29kZShjb2RlKQorICAgICAgICAsIG1fd2hlbih3aGVuKQorICAgICAgICAsIG1f
ZHVtcEJlZm9yZShkdW1wQmVmb3JlKQorICAgIHsKKyAgICB9CisKKyNkZWZpbmUgVkFMSURBVEUo
Y29uZGl0aW9uLCBtZXNzYWdlKSBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwK
KyAgICAgICAgaWYgKGNvbmRpdGlvbikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgZmFpbChfX0ZJTEVf
XywgX19MSU5FX18sIFdURl9QUkVUVFlfRlVOQ1RJT04sICNjb25kaXRpb24sIHRvQ1N0cmluZyBt
ZXNzYWdlKTsgXAorICAgIH0gd2hpbGUgKGZhbHNlKQorICAgIAorICAgIHZvaWQgcnVuKCkKKyAg
ICB7CisgICAgICAgIEhhc2hTZXQ8U3RhY2tTbG90Kj4gdmFsaWRTbG90czsKKyAgICAgICAgSGFz
aFNldDxCYXNpY0Jsb2NrKj4gdmFsaWRCbG9ja3M7CisgICAgICAgIEhhc2hTZXQ8U3BlY2lhbCo+
IHZhbGlkU3BlY2lhbHM7CisKKyAgICAgICAgZm9yIChCYXNpY0Jsb2NrKiBibG9jayA6IG1fY29k
ZSkKKyAgICAgICAgICAgIHZhbGlkQmxvY2tzLmFkZChibG9jayk7CisgICAgICAgIGZvciAoU3Rh
Y2tTbG90KiBzbG90IDogbV9jb2RlLnN0YWNrU2xvdHMoKSkKKyAgICAgICAgICAgIHZhbGlkU2xv
dHMuYWRkKHNsb3QpOworICAgICAgICBmb3IgKFNwZWNpYWwqIHNwZWNpYWwgOiBtX2NvZGUuc3Bl
Y2lhbHMoKSkKKyAgICAgICAgICAgIHZhbGlkU3BlY2lhbHMuYWRkKHNwZWNpYWwpOworCisgICAg
ICAgIGZvciAoQmFzaWNCbG9jayogYmxvY2sgOiBtX2NvZGUpIHsKKyAgICAgICAgICAgIGZvciAo
SW5zdCYgaW5zdCA6ICpibG9jaykgeworICAgICAgICAgICAgICAgIGZvciAoQXJnJiBhcmcgOiBp
bnN0LmFyZ3MpIHsKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChhcmcua2luZCgpKSB7Cisg
ICAgICAgICAgICAgICAgICAgIGNhc2UgU3RhY2s6CisgICAgICAgICAgICAgICAgICAgICAgICBW
QUxJREFURSh2YWxpZFNsb3RzLmNvbnRhaW5zKGFyZy5zdGFja1Nsb3QoKSksICgiQXQgIiwgaW5z
dCkpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAg
IGNhc2UgU3BlY2lhbDoKKyAgICAgICAgICAgICAgICAgICAgICAgIFZBTElEQVRFKHZhbGlkU3Bl
Y2lhbHMuY29udGFpbnMoYXJnLnNwZWNpYWwoKSksICgiQXQgIiwgaW5zdCkpOworICAgICAgICAg
ICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAg
ICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgVkFM
SURBVEUoaW5zdC5pc1ZhbGlkRm9ybSgpLCAoIkF0ICIsIGluc3QpKTsKKyAgICAgICAgICAgIH0K
KyAgICAgICAgICAgIGZvciAoQmFzaWNCbG9jayogc3VjY2Vzc29yIDogYmxvY2stPnN1Y2Nlc3Nv
cnMoKSkKKyAgICAgICAgICAgICAgICBWQUxJREFURSh2YWxpZEJsb2Nrcy5jb250YWlucyhzdWNj
ZXNzb3IpLCAoIkF0ICIsICpibG9jaykpOworICAgICAgICB9CisgICAgfQorCitwcml2YXRlOgor
ICAgIHZvaWQgZmFpbCgKKyAgICAgICAgY29uc3QgY2hhciogZmlsZW5hbWUsIGludCBsaW5lTnVt
YmVyLCBjb25zdCBjaGFyKiBmdW5jdGlvbiwgY29uc3QgY2hhciogY29uZGl0aW9uLAorICAgICAg
ICBDU3RyaW5nIG1lc3NhZ2UpCisgICAgeworICAgICAgICBDU3RyaW5nIGZhaWx1cmVNZXNzYWdl
OworICAgICAgICB7CisgICAgICAgICAgICBTdHJpbmdQcmludFN0cmVhbSBvdXQ7CisgICAgICAg
ICAgICBvdXQucHJpbnQoIkFJUiBWQUxJREFUSU9OIEZBSUxVUkVcbiIpOworICAgICAgICAgICAg
b3V0LnByaW50KCIgICAgIiwgY29uZGl0aW9uLCAiICgiLCBmaWxlbmFtZSwgIjoiLCBsaW5lTnVt
YmVyLCAiKVxuIik7CisgICAgICAgICAgICBvdXQucHJpbnQoIiAgICAiLCBtZXNzYWdlLCAiXG4i
KTsKKyAgICAgICAgICAgIGlmIChtX3doZW4pCisgICAgICAgICAgICAgICAgb3V0LnByaW50KCIg
ICAgRHVyaW5nICIsIG1fd2hlbiwgIlxuIik7CisgICAgICAgICAgICBmYWlsdXJlTWVzc2FnZSA9
IG91dC50b0NTdHJpbmcoKTsKKyAgICAgICAgfQorCisgICAgICAgIG91dC5wcmludChmYWlsdXJl
TWVzc2FnZSk7CisgICAgICAgIGlmIChtX2R1bXBCZWZvcmUpIHsKKyAgICAgICAgICAgIG91dC5w
cmludCgiQmVmb3JlICIsIHdoZW4sICI6XG4iKTsKKyAgICAgICAgICAgIG91dC5wcmludChtX2R1
bXBCZWZvcmUpOworICAgICAgICB9CisgICAgICAgIG91dC5wcmludCgiQXQgdGltZSBvZiBmYWls
dXJlOlxuIik7CisgICAgICAgIG91dC5wcmludChtX2NvZGUpOworCisgICAgICAgIG91dC5wcmlu
dChmYWlsdXJlTWVzc2FnZSk7CisgICAgICAgIFdURlJlcG9ydEFzc2VydGlvbkZhaWx1cmUoZmls
ZW5hbWUsIGxpbmVOdW1iZXIsIGZ1bmN0aW9uLCBjb25kaXRpb24pOworICAgICAgICBDUkFTSCgp
OworICAgIH0KKyAgICAKKyAgICBDb2RlJiBtX2NvZGU7CisgICAgY29uc3QgY2hhciogbV9kdW1w
QmVmb3JlOworfTsKKworfSAvLyBhbm9ueW1vdXMgbmFtZXNwYWNlCisKK3ZvaWQgdmFsaWRhdGUo
Q29kZSYgY29kZSwgY29uc3QgY2hhciogd2hlbiwgY29uc3QgY2hhciogZHVtcEJlZm9yZSkKK3sK
KyAgICBWYWxpZGF0ZXIgdmFsaWRhdGVyKGNvZGUsIHdoZW4sIGR1bXBCZWZvcmUpOworICAgIHZh
bGlkYXRlci5ydW4oKTsKK30KKworfSB9IH0gLy8gbmFtZXNwYWNlIEpTQzo6QjM6OkFpcgorCklu
ZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvYWlyL0FpclZhbGlkYXRlLmgKPT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PQotLS0gU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL2Fpci9BaXJWYWxpZGF0ZS5oCShyZXZpc2lv
biAwKQorKysgU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL2Fpci9BaXJWYWxpZGF0ZS5oCSh3b3Jr
aW5nIGNvcHkpCkBAIC0wLDAgKzEsNDAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTUgQXBw
bGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1
c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZp
Y2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRp
b25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11
c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9m
IGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJp
YnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0
CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5n
IGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRl
cmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdB
UkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVT
UyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBU
SEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1Mg
Rk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5U
IFNIQUxMIEFQUExFIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBE
SVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBD
T05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICog
UFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0Us
IERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIg
Q0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09O
VFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5D
RSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0Yg
VEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNI
IERBTUFHRS4gCisgKi8KKworI2lmbmRlZiBBaXJWYWxpZGF0ZV9oCisjZGVmaW5lIEFpclZhbGlk
YXRlX2gKKworI2luY2x1ZGUgPHd0Zi90ZXh0L0NTdHJpbmcuaD4KKworbmFtZXNwYWNlIEpTQyB7
IG5hbWVzcGFjZSBCMyB7IG5hbWVzcGFjZSBBaXIgeworCitjbGFzcyBDb2RlOworCit2b2lkIHZh
bGlkYXRlKENvZGUmLCBjb25zdCBjaGFyKiB3aGVuID0gbnVsbHB0ciwgY29uc3QgY2hhciogZHVt
cEJlZm9yZSA9IG51bGxwdHIpOworCit9IH0gfSAvLyBuYW1lc3BhY2UgSlNDOjpCMzo6QWlyCisK
KyNlbmRpZiAvLyBBaXJWYWxpZGF0ZV9oCisKSW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9i
My9haXIvb3Bjb2RlX2dlbmVyYXRvci5yYgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlw
dENvcmUvYjMvYWlyL29wY29kZV9nZW5lcmF0b3IucmIJKHJldmlzaW9uIDApCisrKyBTb3VyY2Uv
SmF2YVNjcmlwdENvcmUvYjMvYWlyL29wY29kZV9nZW5lcmF0b3IucmIJKHdvcmtpbmcgY29weSkK
QEAgLTAsMCArMSw4MzQgQEAKKyMhL3Vzci9iaW4vZW52IHJ1YnkKKworIyBDb3B5cmlnaHQgKEMp
IDIwMTUgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorIworIyBSZWRpc3RyaWJ1dGlv
biBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyMg
bW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBj
b25kaXRpb25zCisjIGFyZSBtZXQ6CisjIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29k
ZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisjICAgIG5vdGljZSwgdGhpcyBsaXN0
IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyMgMi4gUmVkaXN0
cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmln
aHQKKyMgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2lu
ZyBkaXNjbGFpbWVyIGluIHRoZQorIyAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRl
cmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorIworIyBUSElTIFNPRlRXQVJF
IElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gQU5EIElUUyBDT05UUklCVVRPUlMgYGBBUyBJUycn
CisjIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVU
IE5PVCBMSU1JVEVEIFRPLAorIyBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJ
TElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisjIFBVUlBPU0UgQVJFIERJU0NMQUlN
RUQuIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IgSVRTIENPTlRSSUJVVE9SUworIyBC
RSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBF
WEVNUExBUlksIE9SCisjIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9U
IExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCisjIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklD
RVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUworIyBJTlRFUlJV
UFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hF
VEhFUiBJTgorIyBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5H
IE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorIyBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRI
RSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GCisjIFRIRSBQT1NTSUJJ
TElUWSBPRiBTVUNIIERBTUFHRS4KKworcmVxdWlyZSAicGF0aG5hbWUiCisKK2NsYXNzIE9wY29k
ZQorICAgIGF0dHJfcmVhZGVyIDpuYW1lLCA6c3BlY2lhbCwgOm92ZXJsb2FkcworICAgIGF0dHJf
YWNjZXNzb3IgOmJyYW5jaAorCisgICAgZGVmIGluaXRpYWxpemUobmFtZSwgc3BlY2lhbCkKKyAg
ICAgICAgQG5hbWUgPSBuYW1lCisgICAgICAgIEBzcGVjaWFsID0gc3BlY2lhbAorICAgICAgICBA
YnJhbmNoID0gZmFsc2UKKyAgICAgICAgdW5sZXNzIHNwZWNpYWwKKyAgICAgICAgICAgIEBvdmVy
bG9hZHMgPSBbXQorICAgICAgICBlbmQKKyAgICBlbmQKKworICAgIGRlZiBtYXNtTmFtZQorICAg
ICAgICBuYW1lWzBdLmRvd25jYXNlICsgbmFtZVsxLi4tMV0KKyAgICBlbmQKK2VuZAorCitjbGFz
cyBBcmcKKyAgICBhdHRyX3JlYWRlciA6cm9sZSwgOnR5cGUKKworICAgIGRlZiBpbml0aWFsaXpl
KHJvbGUsIHR5cGUpCisgICAgICAgIEByb2xlID0gcm9sZQorICAgICAgICBAdHlwZSA9IHR5cGUK
KyAgICBlbmQKK2VuZAorCitjbGFzcyBPdmVybG9hZAorICAgIGF0dHJfcmVhZGVyIDpzaWduYXR1
cmUsIDpmb3JtcworCisgICAgZGVmIGluaXRpYWxpemUoc2lnbmF0dXJlLCBmb3JtcykKKyAgICAg
ICAgQHNpZ25hdHVyZSA9IHNpZ25hdHVyZQorICAgICAgICBAZm9ybXMgPSBmb3JtcworICAgIGVu
ZAorZW5kCisKK2NsYXNzIEtpbmQKKyAgICBhdHRyX3JlYWRlciA6bmFtZQorICAgIGF0dHJfYWNj
ZXNzb3IgOnNwZWNpYWwKKworICAgIGRlZiBpbml0aWFsaXplKG5hbWUpCisgICAgICAgIEBuYW1l
ID0gbmFtZQorICAgICAgICBAc3BlY2lhbCA9IGZhbHNlCisgICAgZW5kCisKKyAgICBkZWYgPT0o
b3RoZXIpCisgICAgICAgIGlmIG90aGVyLmlzX2E/IFN0cmluZworICAgICAgICAgICAgQG5hbWUg
PT0gb3RoZXIKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgQG5hbWUgPT0gb3RoZXIubmFtZSBh
bmQgQHNwZWNpYWwgPT0gb3RoZXIuc3BlY2lhbAorICAgICAgICBlbmQKKyAgICBlbmQKKworICAg
IGRlZiBLaW5kLmFyZ0tpbmRzKGtpbmQpCisgICAgICAgIGlmIGtpbmQgPT0gIkFkZHIiCisgICAg
ICAgICAgICBbIkFkZHIiLCAiU3RhY2tTbG90IiwgIkNhbGxBcmciXQorICAgICAgICBlbHNlCisg
ICAgICAgICAgICBba2luZF0KKyAgICAgICAgZW5kCisgICAgZW5kCisKKyAgICBkZWYgYXJnS2lu
ZHMKKyAgICAgICAgS2luZC5hcmdLaW5kcyhraW5kKQorICAgIGVuZAorZW5kCisKK2NsYXNzIEZv
cm0KKyAgICBhdHRyX3JlYWRlciA6a2luZHMsIDphbHROYW1lCisKKyAgICBkZWYgaW5pdGlhbGl6
ZShraW5kcywgYWx0TmFtZSkKKyAgICAgICAgQGtpbmRzID0ga2luZHMKKyAgICAgICAgQGFsdE5h
bWUgPSBhbHROYW1lCisgICAgZW5kCitlbmQKKworY2xhc3MgT3JpZ2luCisgICAgYXR0cl9yZWFk
ZXIgOmZpbGVOYW1lLCA6bGluZU51bWJlcgorICAgIAorICAgIGRlZiBpbml0aWFsaXplKGZpbGVO
YW1lLCBsaW5lTnVtYmVyKQorICAgICAgICBAZmlsZU5hbWUgPSBmaWxlTmFtZQorICAgICAgICBA
bGluZU51bWJlciA9IGxpbmVOdW1iZXIKKyAgICBlbmQKKyAgICAKKyAgICBkZWYgdG9fcworICAg
ICAgICAiI3tmaWxlTmFtZX06I3tsaW5lTnVtYmVyfSIKKyAgICBlbmQKK2VuZAorCitjbGFzcyBU
b2tlbgorICAgIGF0dHJfcmVhZGVyIDpvcmlnaW4sIDpzdHJpbmcKKyAgICAKKyAgICBkZWYgaW5p
dGlhbGl6ZShvcmlnaW4sIHN0cmluZykKKyAgICAgICAgQG9yaWdpbiA9IG9yaWdpbgorICAgICAg
ICBAc3RyaW5nID0gc3RyaW5nCisgICAgZW5kCisgICAgCisgICAgZGVmID09KG90aGVyKQorICAg
ICAgICBpZiBvdGhlci5pc19hPyBUb2tlbgorICAgICAgICAgICAgQHN0cmluZyA9PSBvdGhlci5z
dHJpbmcKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgQHN0cmluZyA9PSBvdGhlcgorICAgICAg
ICBlbmQKKyAgICBlbmQKKyAgICAKKyAgICBkZWYgPX4ob3RoZXIpCisgICAgICAgIEBzdHJpbmcg
PX4gb3RoZXIKKyAgICBlbmQKKyAgICAKKyAgICBkZWYgdG9fcworICAgICAgICAiI3tAc3RyaW5n
Lmluc3BlY3R9IGF0ICN7b3JpZ2lufSIKKyAgICBlbmQKKyAgICAKKyAgICBkZWYgcGFyc2VFcnJv
cigqY29tbWVudCkKKyAgICAgICAgaWYgY29tbWVudC5lbXB0eT8KKyAgICAgICAgICAgIHJhaXNl
ICJQYXJzZSBlcnJvcjogI3t0b19zfSIKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcmFpc2Ug
IlBhcnNlIGVycm9yOiAje3RvX3N9OiAje2NvbW1lbnRbMF19IgorICAgICAgICBlbmQKKyAgICBl
bmQKK2VuZAorCitkZWYgbGV4KHN0ciwgZmlsZU5hbWUpCisgICAgZmlsZU5hbWUgPSBQYXRobmFt
ZS5uZXcoZmlsZU5hbWUpCisgICAgcmVzdWx0ID0gW10KKyAgICBsaW5lTnVtYmVyID0gMQorICAg
IHdoaWxlIG5vdCBzdHIuZW1wdHk/CisgICAgICAgIGNhc2Ugc3RyCisgICAgICAgIHdoZW4gL1xB
XCMoW15cbl0qKS8KKyAgICAgICAgICAgICMgY29tbWVudCwgaWdub3JlCisgICAgICAgIHdoZW4g
L1xBXG4vCisgICAgICAgICAgICAjIG5ld2xpbmUsIGlnbm9yZQorICAgICAgICAgICAgbGluZU51
bWJlciArPSAxCisgICAgICAgIHdoZW4gL1xBKFthLXpBLVowLTlfXSspLworICAgICAgICAgICAg
cmVzdWx0IDw8IFRva2VuLm5ldyhPcmlnaW4ubmV3KGZpbGVOYW1lLCBsaW5lTnVtYmVyKSwgJCYp
CisgICAgICAgIHdoZW4gL1xBKFsgXHRccl0rKS8KKyAgICAgICAgICAgICMgd2hpdGVzcGFjZSwg
aWdub3JlCisgICAgICAgIHdoZW4gL1xBWyw6KlwvXS8KKyAgICAgICAgICAgIHJlc3VsdCA8PCBU
b2tlbi5uZXcoT3JpZ2luLm5ldyhmaWxlTmFtZSwgbGluZU51bWJlciksICQmKQorICAgICAgICBl
bHNlCisgICAgICAgICAgICByYWlzZSAiTGV4ZXIgZXJyb3IgYXQgI3tPcmlnaW4ubmV3KGZpbGVO
YW1lLCBsaW5lTnVtYmVyKS50b19zfSwgdW5leHBlY3RlZCBzZXF1ZW5jZSAje3N0clswLi4yMF0u
aW5zcGVjdH0iCisgICAgICAgIGVuZAorICAgICAgICBzdHIgPSAkfi5wb3N0X21hdGNoCisgICAg
ZW5kCisgICAgcmVzdWx0CitlbmQKKworZGVmIGlzVUQodG9rZW4pCisgICAgdG9rZW4gPX4gL1xB
KChVKXwoRCl8KFVEKSlcWi8KK2VuZAorCitkZWYgaXNHRih0b2tlbikKKyAgICB0b2tlbiA9fiAv
XEEoKEcpfChGKSlcWi8KK2VuZAorCitkZWYgaXNLaW5kKHRva2VuKQorICAgIHRva2VuID1+IC9c
QSgoVG1wKXwoSW1tKXwoSW1tNjQpfChBZGRyKXwoSW5kZXgpfChSZWxDb25kKXwoUmVzQ29uZCkp
XFovCitlbmQKKworZGVmIGlzS2V5d29yZCh0b2tlbikKKyAgICBpc1VEKHRva2VuKSBvciBpc0dG
KHRva2VuKSBvciBpc0tpbmQodG9rZW4pIG9yCisgICAgICAgIHRva2VuID09ICJzcGVjaWFsIiBv
ciB0b2tlbiA9PSAiYXMiCitlbmQKKworZGVmIGlzSWRlbnRpZmllcih0b2tlbikKKyAgICB0b2tl
biA9fiAvXEEoW2EtekEtWjAtOV9dKylcWi8gYW5kIG5vdCBpc0tleXdvcmQodG9rZW4pCitlbmQK
KworY2xhc3MgUGFyc2VyCisgICAgZGVmIGluaXRpYWxpemUoZGF0YSwgZmlsZU5hbWUpCisgICAg
ICAgIEB0b2tlbnMgPSBsZXgoZGF0YSwgZmlsZU5hbWUpCisgICAgICAgIEBpZHggPSAwCisgICAg
ZW5kCisKKyAgICBkZWYgdG9rZW4KKyAgICAgICAgQHRva2Vuc1tAaWR4XQorICAgIGVuZAorCisg
ICAgZGVmIGFkdmFuY2UKKyAgICAgICAgQGlkeCArPSAxCisgICAgZW5kCisKKyAgICBkZWYgcGFy
c2VFcnJvcigqY29tbWVudCkKKyAgICAgICAgaWYgdG9rZW4KKyAgICAgICAgICAgIHRva2VuLnBh
cnNlRXJyb3IoKmNvbW1lbnQpCisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGlmIGNvbW1lbnQu
ZW1wdHk/CisgICAgICAgICAgICAgICAgcmFpc2UgIlBhcnNlIGVycm9yIGF0IGVuZCBvZiBmaWxl
IgorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHJhaXNlICJQYXJzZSBlcnJvciBh
dCBlbmQgb2YgZmlsZTogI3tjb21tZW50WzBdfSIKKyAgICAgICAgICAgIGVuZAorICAgICAgICBl
bmQKKyAgICBlbmQKKworICAgIGRlZiBjb25zdW1lKHN0cmluZykKKyAgICAgICAgcGFyc2VFcnJv
cigiRXhwZWN0ZWQgI3tzdHJpbmd9IikgdW5sZXNzIHRva2VuID09IHN0cmluZworICAgICAgICBh
ZHZhbmNlCisgICAgZW5kCisKKyAgICBkZWYgY29uc3VtZUlkZW50aWZpZXIKKyAgICAgICAgcmVz
dWx0ID0gdG9rZW4uc3RyaW5nCisgICAgICAgIHBhcnNlRXJyb3IoIkV4cGVjdGVkIGlkZW50aWZp
ZXIiKSB1bmxlc3MgaXNJZGVudGlmaWVyKHJlc3VsdCkKKyAgICAgICAgYWR2YW5jZQorICAgICAg
ICByZXN1bHQKKyAgICBlbmQKKworICAgIGRlZiBjb25zdW1lUm9sZQorICAgICAgICByZXN1bHQg
PSB0b2tlbi5zdHJpbmcKKyAgICAgICAgcGFyc2VFcnJvcigiRXhwZWN0ZWQgcm9sZSAoVSwgRCwg
b3IgVUQpIikgdW5sZXNzIGlzVUQocmVzdWx0KQorICAgICAgICBhZHZhbmNlCisgICAgICAgIHJl
c3VsdAorICAgIGVuZAorCisgICAgZGVmIGNvbnN1bWVUeXBlCisgICAgICAgIHJlc3VsdCA9IHRv
a2VuLnN0cmluZworICAgICAgICBwYXJzZUVycm9yKCJFeHBlY3RlZCB0eXBlIChHIG9yIEYpIikg
dW5sZXNzIGlzR0YocmVzdWx0KQorICAgICAgICBhZHZhbmNlCisgICAgICAgIHJlc3VsdAorICAg
IGVuZAorCisgICAgZGVmIGNvbnN1bWVLaW5kCisgICAgICAgIHJlc3VsdCA9IHRva2VuLnN0cmlu
ZworICAgICAgICBwYXJzZUVycm9yKCJFeHBlY3RlZCBraW5kIChJbW0sIEltbTY0LCBUbXAsIEFk
ZHIsIEluZGV4LCBSZWxDb25kLCBvciBSZXNDb25kKSIpIHVubGVzcyBpc0tpbmQocmVzdWx0KQor
ICAgICAgICBhZHZhbmNlCisgICAgICAgIHJlc3VsdAorICAgIGVuZAorCisgICAgZGVmIHBhcnNl
CisgICAgICAgIHJlc3VsdCA9IHt9CisgICAgICAgIAorICAgICAgICBsb29wIHsKKyAgICAgICAg
ICAgIGJyZWFrIGlmIEBpZHggPj0gQHRva2Vucy5sZW5ndGgKKworICAgICAgICAgICAgaWYgdG9r
ZW4gPT0gInNwZWNpYWwiCisgICAgICAgICAgICAgICAgY29uc3VtZSgic3BlY2lhbCIpCisgICAg
ICAgICAgICAgICAgb3Bjb2RlTmFtZSA9IGNvbnN1bWVJZGVudGlmaWVyCisKKyAgICAgICAgICAg
ICAgICBwYXJzZUVycm9yKCJDYW5ub3Qgb3ZlcmxvYWQgYSBzcGVjaWFsIG9wY29kZSIpIGlmIHJl
c3VsdFtvcGNvZGVOYW1lXQorCisgICAgICAgICAgICAgICAgcmVzdWx0W29wY29kZU5hbWVdID0g
T3Bjb2RlLm5ldyhvcGNvZGVOYW1lLCB0cnVlKQorICAgICAgICAgICAgZWxzZQorICAgICAgICAg
ICAgICAgIG9wY29kZU5hbWUgPSBjb25zdW1lSWRlbnRpZmllcgorCisgICAgICAgICAgICAgICAg
aWYgcmVzdWx0W29wY29kZU5hbWVdCisgICAgICAgICAgICAgICAgICAgIG9wY29kZSA9IHJlc3Vs
dFtvcGNvZGVOYW1lXQorICAgICAgICAgICAgICAgICAgICBwYXJzZUVycm9yKCJDYW5ub3Qgb3Zl
cmxvYWQgYSBzcGVjaWFsIG9wY29kZSIpIGlmIG9wY29kZS5zcGVjaWFsCisgICAgICAgICAgICAg
ICAgZWxzZQorICAgICAgICAgICAgICAgICAgICBvcGNvZGUgPSBPcGNvZGUubmV3KG9wY29kZU5h
bWUsIGZhbHNlKQorICAgICAgICAgICAgICAgICAgICByZXN1bHRbb3Bjb2RlTmFtZV0gPSBvcGNv
ZGUKKyAgICAgICAgICAgICAgICBlbmQKKworICAgICAgICAgICAgICAgIHNpZ25hdHVyZSA9IFtd
CisgICAgICAgICAgICAgICAgZm9ybXMgPSBbXQorICAgICAgICAgICAgICAgIAorICAgICAgICAg
ICAgICAgIGlmIGlzVUQodG9rZW4pCisgICAgICAgICAgICAgICAgICAgIGxvb3AgeworICAgICAg
ICAgICAgICAgICAgICAgICAgcm9sZSA9IGNvbnN1bWVSb2xlCisgICAgICAgICAgICAgICAgICAg
ICAgICBjb25zdW1lKCI6IikKKyAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUgPSBjb25zdW1l
VHlwZQorICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICBz
aWduYXR1cmUgPDwgQXJnLm5ldyhyb2xlLCB0eXBlKQorICAgICAgICAgICAgICAgICAgICAgICAg
CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhayB1bmxlc3MgdG9rZW4gPT0gIiwiCisgICAg
ICAgICAgICAgICAgICAgICAgICBjb25zdW1lKCIsIikKKyAgICAgICAgICAgICAgICAgICAgfQor
ICAgICAgICAgICAgICAgIGVuZAorCisgICAgICAgICAgICAgICAgaWYgdG9rZW4gPT0gIi8iCisg
ICAgICAgICAgICAgICAgICAgIGNvbnN1bWUoIi8iKQorICAgICAgICAgICAgICAgICAgICBjb25z
dW1lKCJicmFuY2giKQorICAgICAgICAgICAgICAgICAgICBvcGNvZGUuYnJhbmNoID0gdHJ1ZQor
ICAgICAgICAgICAgICAgIGVuZAorCisgICAgICAgICAgICAgICAgaWYgaXNLaW5kKHRva2VuKQor
ICAgICAgICAgICAgICAgICAgICBsb29wIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGtpbmRz
ID0gW10KKyAgICAgICAgICAgICAgICAgICAgICAgIGFsdE5hbWUgPSBuaWwKKyAgICAgICAgICAg
ICAgICAgICAgICAgIGxvb3AgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtpbmRzIDw8
IEtpbmQubmV3KGNvbnN1bWVLaW5kKQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYg
dG9rZW4gPT0gIioiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnNlRXJyb3Io
IkNhbiBvbmx5IGFwcGx5ICogdG8gVG1wIikgdW5sZXNzIGtpbmRzWy0xXS5uYW1lID09ICJUbXAi
CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtpbmRzWy0xXS5zcGVjaWFsID0gdHJ1
ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdW1lKCIqIikKKyAgICAgICAg
ICAgICAgICAgICAgICAgICAgICBlbmQKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJy
ZWFrIHVubGVzcyB0b2tlbiA9PSAiLCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25z
dW1lKCIsIikKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAg
ICAgICAgaWYgdG9rZW4gPT0gImFzIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN1
bWUoImFzIikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbHROYW1lID0gY29uc3VtZUlk
ZW50aWZpZXIKKyAgICAgICAgICAgICAgICAgICAgICAgIGVuZAorCisgICAgICAgICAgICAgICAg
ICAgICAgICBwYXJzZUVycm9yKCJGb3JtIGhhcyB3cm9uZyBudW1iZXIgb2YgYXJndW1lbnRzIGZv
ciBvdmVybG9hZCIpIHVubGVzcyBraW5kcy5sZW5ndGggPT0gc2lnbmF0dXJlLmxlbmd0aAorICAg
ICAgICAgICAgICAgICAgICAgICAga2luZHMuZWFjaF93aXRoX2luZGV4IHsKKyAgICAgICAgICAg
ICAgICAgICAgICAgICAgICB8IGtpbmQsIGluZGV4IHwKKyAgICAgICAgICAgICAgICAgICAgICAg
ICAgICBpZiBraW5kLm5hbWUgPT0gIkltbSIgb3Iga2luZC5uYW1lID09ICJJbW02NCIKKyAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgc2lnbmF0dXJlW2luZGV4XS5yb2xlICE9ICJV
IgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyc2VFcnJvcigiRm9ybSBo
YXMgYW4gaW1tZWRpYXRlIGZvciBhIG5vbi11c2UgYXJndW1lbnQiKQorICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICBlbmQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYg
c2lnbmF0dXJlW2luZGV4XS50eXBlICE9ICJHIgorICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgcGFyc2VFcnJvcigiRm9ybSBoYXMgYW4gaW1tZWRpYXRlIGZvciBhIG5vbi1nZW5l
cmFsLXB1cnBvc2UgYXJndW1lbnQiKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBl
bmQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmQKKyAgICAgICAgICAgICAgICAgICAg
ICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1zIDw8IEZvcm0ubmV3KGtpbmRzLCBh
bHROYW1lKQorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsgdW5sZXNzIGlzS2luZCh0b2tl
bikKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVuZAorCisgICAgICAg
ICAgICAgICAgaWYgc2lnbmF0dXJlLmxlbmd0aCA9PSAwCisgICAgICAgICAgICAgICAgICAgIHJh
aXNlIHVubGVzcyBmb3Jtcy5sZW5ndGggPT0gMAorICAgICAgICAgICAgICAgICAgICBmb3JtcyA8
PCBGb3JtLm5ldyhbXSwgbmlsKQorICAgICAgICAgICAgICAgIGVuZAorCisgICAgICAgICAgICAg
ICAgb3Bjb2RlLm92ZXJsb2FkcyA8PCBPdmVybG9hZC5uZXcoc2lnbmF0dXJlLCBmb3JtcykKKyAg
ICAgICAgICAgIGVuZAorICAgICAgICB9CisKKyAgICAgICAgcmVzdWx0CisgICAgZW5kCitlbmQK
KworJGZpbGVOYW1lID0gQVJHVlswXQorCitwYXJzZXIgPSBQYXJzZXIubmV3KElPOjpyZWFkKCRm
aWxlTmFtZSksICRmaWxlTmFtZSkKKyRvcGNvZGVzID0gcGFyc2VyLnBhcnNlCisKK2RlZiB3cml0
ZUgoZmlsZW5hbWUpCisgICAgRmlsZS5vcGVuKCJBaXIje2ZpbGVuYW1lfS5oIiwgInciKSB7Cisg
ICAgICAgIHwgb3V0cCB8CisgICAgICAgIAorICAgICAgICBvdXRwLnB1dHMgIi8vIEdlbmVyYXRl
ZCBieSBvcGNvZGVfZ2VuZXJhdG9yLnJiIGZyb20gI3skZmlsZU5hbWV9IC0tIGRvIG5vdCBlZGl0
ISIKKyAgICAgICAgCisgICAgICAgIG91dHAucHV0cyAiI2lmbmRlZiBBaXIje2ZpbGVuYW1lfV9o
IgorICAgICAgICBvdXRwLnB1dHMgIiNkZWZpbmUgQWlyI3tmaWxlbmFtZX1faCIKKworICAgICAg
ICB5aWVsZCBvdXRwCisgICAgICAgIAorICAgICAgICBvdXRwLnB1dHMgIiNlbmRpZiAvLyBBaXIj
e2ZpbGVuYW1lfV9oIgorICAgIH0KK2VuZAorCitkZWYgd3JpdGVDUFAoZmlsZW5hbWUpCisgICAg
RmlsZS5vcGVuKCJBaXIje2ZpbGVuYW1lfS5jcHAiLCAidyIpIHsKKyAgICAgICAgfCBvdXRwIHwK
KyAgICAgICAgCisgICAgICAgIG91dHAucHV0cyAiLy8gR2VuZXJhdGVkIGJ5IG9wY29kZV9nZW5l
cmF0b3IucmIgZnJvbSAjeyRmaWxlTmFtZX0gLS0gZG8gbm90IGVkaXQhIgorICAgICAgICAKKyAg
ICAgICAgb3V0cC5wdXRzICIjaW5jbHVkZSBcImNvbmZpZy5oXCIiCisgICAgICAgIG91dHAucHV0
cyAiI2luY2x1ZGUgXCJBaXIje2ZpbGVuYW1lfS5oXCIiCisKKyAgICAgICAgeWllbGQgb3V0cAor
ICAgIH0KK2VuZAorCit3cml0ZUgoIk9wY29kZSIpIHsKKyAgICB8IG91dHAgfAorICAgIG91dHAu
cHV0cyAibmFtZXNwYWNlIEpTQyB7IG5hbWVzcGFjZSBCMyB7IG5hbWVzcGFjZSBBaXIgeyIKKyAg
ICBvdXRwLnB1dHMgImVudW0gT3Bjb2RlIDogaW50MTZfdCB7IgorICAgICRvcGNvZGVzLmtleXMu
c29ydC5lYWNoIHsKKyAgICAgICAgfCBvcGNvZGUgfAorICAgICAgICBvdXRwLnB1dHMgIiAgICAj
e29wY29kZX0sIgorICAgIH0KKyAgICBvdXRwLnB1dHMgIn0iCisKKyAgICBvdXRwLnB1dHMgInN0
YXRpYyBjb25zdCB1bnNpZ25lZCBudW1PcGNvZGVzID0gI3skb3Bjb2Rlcy5rZXlzLnNpemV9OyIK
KyAgICBvdXRwLnB1dHMgIn0gfSB9IC8vIG5hbWVzcGFjZSBKU0M6OkIzOjpBaXIiCisgICAgCisg
ICAgb3V0cC5wdXRzICJuYW1lc3BhY2UgV1RGIHsiCisgICAgb3V0cC5wdXRzICJjbGFzcyBQcmlu
dFN0cmVhbTsiCisgICAgb3V0cC5wdXRzICJ2b2lkIHByaW50SW50ZXJuYWwoUHJpbnRTdHJlYW0m
LCBKU0M6OkIzOjpBaXI6Ok9wY29kZSk7IgorICAgIG91dHAucHV0cyAifSAvLyBuYW1lc3BhY2Ug
V1RGIgorfQorCit3cml0ZUNQUCgiT3Bjb2RlIikgeworICAgIHwgb3V0cCB8CisgICAgb3V0cC5w
dXRzICIjaW5jbHVkZSBcInd0Zi9QcmludFN0cmVhbS5oXCIiCisgICAgb3V0cC5wdXRzICJuYW1l
c3BhY2UgV1RGIHsiCisgICAgb3V0cC5wdXRzICJ1c2luZyBuYW1lc3BhY2UgSlNDOjpCMzo6QWly
OyIKKyAgICBvdXRwLnB1dHMgInZvaWQgcHJpbnRJbnRlcm5hbChQcmludFN0cmVhbSYgb3V0LCBP
cGNvZGUgb3Bjb2RlKSIKKyAgICBvdXRwLnB1dHMgInsiCisgICAgb3V0cC5wdXRzICIgICAgc3dp
dGNoIChvcGNvZGUpIHsiCisgICAgJG9wY29kZXMua2V5cy5lYWNoIHsKKyAgICAgICAgfCBvcGNv
ZGUgfAorICAgICAgICBvdXRwLnB1dHMgIiAgICBjYXNlICN7b3Bjb2RlfToiCisgICAgICAgIG91
dHAucHV0cyAiICAgICAgICBvdXQucHJpbnQoXCIje29wY29kZX1cIik7IgorICAgICAgICBvdXRw
LnB1dHMgIiAgICAgICAgcmV0dXJuOyIKKyAgICB9CisgICAgb3V0cC5wdXRzICIgICAgfSIKKyAg
ICBvdXRwLnB1dHMgIiAgICBSRUxFQVNFX0FTU0VSVF9OT1RfUkVBQ0hFRCgpOyIKKyAgICBvdXRw
LnB1dHMgIn0iCisgICAgb3V0cC5wdXRzICJ9IC8vIG5hbWVzcGFjZSBXVEYiCit9CisKKyMgRnJv
bSBoZXJlIG9uLCB3ZSBkb24ndCB0cnkgdG8gZW1pdCBwcm9wZXJseSBpbmRlbnRlZCBjb2RlLCBz
aW5jZSB3ZSdyZSB1c2luZyBhIHJlY3Vyc2l2ZSBwYXR0ZXJuCisjIG1hdGNoZXIuCisKK2RlZiBt
YXRjaEZvcm1zKG91dHAsIHNwZWVkLCBmb3JtcywgY29sdW1uSW5kZXgsIGNvbHVtbkdldHRlciwg
ZmlsdGVyLCBjYWxsYmFjaykKKyAgICByZXR1cm4gaWYgZm9ybXMubGVuZ3RoID09IDAKKworICAg
IGlmIGZpbHRlcltmb3Jtc10KKyAgICAgICAgcmV0dXJuCisgICAgZW5kCisKKyAgICBpZiBjb2x1
bW5JbmRleCA+PSBmb3Jtc1swXS5raW5kcy5sZW5ndGgKKyAgICAgICAgcmFpc2UgdW5sZXNzIGZv
cm1zLmxlbmd0aCA9PSAxCisgICAgICAgIGNhbGxiYWNrW2Zvcm1zWzBdXQorICAgICAgICByZXR1
cm4KKyAgICBlbmQKKyAgICAKKyAgICBncm91cHMgPSB7fQorICAgIGZvcm1zLmVhY2ggeworICAg
ICAgICB8IGZvcm0gfAorICAgICAgICBraW5kID0gZm9ybS5raW5kc1tjb2x1bW5JbmRleF0ubmFt
ZQorICAgICAgICBpZiBncm91cHNba2luZF0KKyAgICAgICAgICAgIGdyb3Vwc1traW5kXSA8PCBm
b3JtCisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGdyb3Vwc1traW5kXSA9IFtmb3JtXQorICAg
ICAgICBlbmQKKyAgICB9CisKKyAgICBpZiBzcGVlZCA9PSA6ZmFzdCBhbmQgZ3JvdXBzLmxlbmd0
aCA9PSAxCisgICAgICAgIG1hdGNoRm9ybXMob3V0cCwgc3BlZWQsIGZvcm1zLCBjb2x1bW5JbmRl
eCArIDEsIGNvbHVtbkdldHRlciwgZmlsdGVyLCBjYWxsYmFjaykKKyAgICAgICAgcmV0dXJuCisg
ICAgZW5kCisKKyAgICBvdXRwLnB1dHMgInN3aXRjaCAoI3tjb2x1bW5HZXR0ZXJbY29sdW1uSW5k
ZXhdfSkgeyIKKyAgICBncm91cHMuZWFjaF9wYWlyIHsKKyAgICAgICAgfCBrZXksIHZhbHVlIHwK
KyAgICAgICAgb3V0cC5wdXRzICIjaWYgVVNFKEpTVkFMVUU2NCkiIGlmIGtleSA9PSAiSW1tNjQi
CisgICAgICAgIEtpbmQuYXJnS2luZHMoa2V5KS5lYWNoIHsKKyAgICAgICAgICAgIHwgYXJnS2lu
ZCB8CisgICAgICAgICAgICBvdXRwLnB1dHMgImNhc2UgQXJnOjoje2FyZ0tpbmR9OiIKKyAgICAg
ICAgfQorICAgICAgICBtYXRjaEZvcm1zKG91dHAsIHNwZWVkLCB2YWx1ZSwgY29sdW1uSW5kZXgg
KyAxLCBjb2x1bW5HZXR0ZXIsIGZpbHRlciwgY2FsbGJhY2spCisgICAgICAgIG91dHAucHV0cyAi
YnJlYWs7IgorICAgICAgICBvdXRwLnB1dHMgIiNlbmRpZiAvLyBVU0UoSlNWQUxVRTY0KSIgaWYg
a2V5ID09ICJJbW02NCIKKyAgICB9CisgICAgb3V0cC5wdXRzICJkZWZhdWx0OiIKKyAgICBvdXRw
LnB1dHMgImJyZWFrOyIKKyAgICBvdXRwLnB1dHMgIn0iCitlbmQKKworZGVmIG1hdGNoSW5zdE92
ZXJsb2FkKG91dHAsIHNwZWVkLCBpbnN0KQorICAgIG91dHAucHV0cyAic3dpdGNoICgje2luc3R9
LT5vcGNvZGUpIHsiCisgICAgJG9wY29kZXMudmFsdWVzLmVhY2ggeworICAgICAgICB8IG9wY29k
ZSB8CisgICAgICAgIG91dHAucHV0cyAiY2FzZSAje29wY29kZS5uYW1lfToiCisgICAgICAgIGlm
IG9wY29kZS5zcGVjaWFsCisgICAgICAgICAgICB5aWVsZCBvcGNvZGUsIG5pbAorICAgICAgICBl
bHNlCisgICAgICAgICAgICBuZWVkT3ZlcmxvYWRTd2l0Y2ggPSAoKG9wY29kZS5vdmVybG9hZHMu
c2l6ZSAhPSAxKSBvciBzcGVlZCA9PSA6c2FmZSkKKyAgICAgICAgICAgIG91dHAucHV0cyAic3dp
dGNoICgje2luc3R9LT5hcmdzLnNpemUoKSkgeyIgaWYgbmVlZE92ZXJsb2FkU3dpdGNoCisgICAg
ICAgICAgICBvcGNvZGUub3ZlcmxvYWRzLmVhY2ggeworICAgICAgICAgICAgICAgIHwgb3Zlcmxv
YWQgfAorICAgICAgICAgICAgICAgIG91dHAucHV0cyAiY2FzZSAje292ZXJsb2FkLnNpZ25hdHVy
ZS5sZW5ndGh9OiIgaWYgbmVlZE92ZXJsb2FkU3dpdGNoCisgICAgICAgICAgICAgICAgeWllbGQg
b3Bjb2RlLCBvdmVybG9hZAorICAgICAgICAgICAgICAgIG91dHAucHV0cyAiYnJlYWs7IiBpZiBu
ZWVkT3ZlcmxvYWRTd2l0Y2gKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIG5lZWRPdmVy
bG9hZFN3aXRjaAorICAgICAgICAgICAgICAgIG91dHAucHV0cyAiZGVmYXVsdDoiCisgICAgICAg
ICAgICAgICAgb3V0cC5wdXRzICJicmVhazsiCisgICAgICAgICAgICAgICAgb3V0cC5wdXRzICJ9
IgorICAgICAgICAgICAgZW5kCisgICAgICAgIGVuZAorICAgICAgICBvdXRwLnB1dHMgImJyZWFr
OyIKKyAgICB9CisgICAgb3V0cC5wdXRzICJkZWZhdWx0OiIKKyAgICBvdXRwLnB1dHMgImJyZWFr
OyIKKyAgICBvdXRwLnB1dHMgIn0iCitlbmQKKyAgICAKK2RlZiBtYXRjaEluc3RPdmVybG9hZEZv
cm0ob3V0cCwgc3BlZWQsIGluc3QpCisgICAgbWF0Y2hJbnN0T3ZlcmxvYWQob3V0cCwgc3BlZWQs
IGluc3QpIHsKKyAgICAgICAgfCBvcGNvZGUsIG92ZXJsb2FkIHwKKyAgICAgICAgaWYgb3Bjb2Rl
LnNwZWNpYWwKKyAgICAgICAgICAgIHlpZWxkIG9wY29kZSwgbmlsLCBuaWwKKyAgICAgICAgZWxz
ZQorICAgICAgICAgICAgY29sdW1uR2V0dGVyID0gcHJvYyB7CisgICAgICAgICAgICAgICAgfCBj
b2x1bW5JbmRleCB8CisgICAgICAgICAgICAgICAgIiN7aW5zdH0tPmFyZ3NbI3tjb2x1bW5JbmRl
eH1dLmtpbmQoKSIKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZpbHRlciA9IHByb2MgeyBm
YWxzZSB9CisgICAgICAgICAgICBjYWxsYmFjayA9IHByb2MgeworICAgICAgICAgICAgICAgIHwg
Zm9ybSB8CisgICAgICAgICAgICAgICAgeWllbGQgb3Bjb2RlLCBvdmVybG9hZCwgZm9ybQorICAg
ICAgICAgICAgfQorICAgICAgICAgICAgbWF0Y2hGb3JtcyhvdXRwLCBzcGVlZCwgb3ZlcmxvYWQu
Zm9ybXMsIDAsIGNvbHVtbkdldHRlciwgZmlsdGVyLCBjYWxsYmFjaykKKyAgICAgICAgZW5kCisg
ICAgfQorZW5kCisKK3dyaXRlSCgiT3Bjb2RlVXRpbHMiKSB7CisgICAgfCBvdXRwIHwKKyAgICBv
dXRwLnB1dHMgIiNpbmNsdWRlIFwiQWlySW5zdC5oXCIiCisgICAgb3V0cC5wdXRzICJuYW1lc3Bh
Y2UgSlNDIHsgbmFtZXNwYWNlIEIzIHsgbmFtZXNwYWNlIEFpciB7IgorICAgIAorICAgIG91dHAu
cHV0cyAiaW5saW5lIGJvb2wgb3BnZW5IaWRkZW5UcnV0aCgpIHsgcmV0dXJuIHRydWU7IH0iCisg
ICAgb3V0cC5wdXRzICIjZGVmaW5lIE9QR0VOX1JFVFVSTih2YWx1ZSkgZG8ge1xcIgorICAgIG91
dHAucHV0cyAiICAgIGlmIChvcGdlbkhpZGRlblRydXRoKCkpXFwiCisgICAgb3V0cC5wdXRzICIg
ICAgICAgIHJldHVybiB2YWx1ZTtcXCIKKyAgICBvdXRwLnB1dHMgIn0iCisKKyAgICBvdXRwLnB1
dHMgInRlbXBsYXRlPHR5cGVuYW1lIEZ1bmN0b3I+IgorICAgIG91dHAucHV0cyAidm9pZCBJbnN0
Ojpmb3JFYWNoQXJnKGNvbnN0IEZ1bmN0b3ImIGZ1bmN0b3IpIgorICAgIG91dHAucHV0cyAieyIK
KyAgICBtYXRjaEluc3RPdmVybG9hZChvdXRwLCA6ZmFzdCwgInRoaXMiKSB7CisgICAgICAgIHwg
b3Bjb2RlLCBvdmVybG9hZCB8CisgICAgICAgIGlmIG9wY29kZS5zcGVjaWFsCisgICAgICAgICAg
ICBvdXRwLnB1dHMgImZ1bmN0b3IoYXJnc1swXSwgQXJnOjpVc2UsIEFyZzo6R1ApOyAvLyBUaGlz
IGlzIGJhc2ljYWxseSBib2d1cywgYnV0IGl0IHdvcmtzIGYgYW5hbHlzZXMgbW9kZWwgU3BlY2lh
bCBhcyBhbiBpbW1lZGlhdGUuIgorICAgICAgICAgICAgb3V0cC5wdXRzICJhcmdzWzBdLnNwZWNp
YWwoKS0+Zm9yRWFjaEFyZygqdGhpcywgc2NvcGVkTGFtYmRhPEVhY2hBcmdDYWxsYmFjaz4oZnVu
Y3RvcikpOyIKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgb3ZlcmxvYWQuc2lnbmF0dXJlLmVh
Y2hfd2l0aF9pbmRleCB7CisgICAgICAgICAgICAgICAgfCBhcmcsIGluZGV4IHwKKyAgICAgICAg
ICAgICAgICByb2xlID0gbmlsCisgICAgICAgICAgICAgICAgY2FzZSBhcmcucm9sZQorICAgICAg
ICAgICAgICAgIHdoZW4gIlUiCisgICAgICAgICAgICAgICAgICAgIHJvbGUgPSAiVXNlIgorICAg
ICAgICAgICAgICAgIHdoZW4gIkQiCisgICAgICAgICAgICAgICAgICAgIHJvbGUgPSAiRGVmIgor
ICAgICAgICAgICAgICAgIHdoZW4gIlVEIgorICAgICAgICAgICAgICAgICAgICByb2xlID0gIlVz
ZURlZiIKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHJhaXNlCisg
ICAgICAgICAgICAgICAgZW5kCisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgb3V0
cC5wdXRzICJmdW5jdG9yKGFyZ3NbI3tpbmRleH1dLCBBcmc6OiN7cm9sZX0sIEFyZzo6I3thcmcu
dHlwZX1QKTsiCisgICAgICAgICAgICB9CisgICAgICAgIGVuZAorICAgIH0KKyAgICBvdXRwLnB1
dHMgIn0iCisKKyAgICBvdXRwLnB1dHMgInRlbXBsYXRlPHR5cGVuYW1lLi4uIEFyZ3VtZW50cz4i
CisgICAgb3V0cC5wdXRzICJBTFdBWVNfSU5MSU5FIGJvb2wgaXNWYWxpZEZvcm0oT3Bjb2RlIG9w
Y29kZSwgQXJndW1lbnRzLi4uIGFyZ3VtZW50cykiCisgICAgb3V0cC5wdXRzICJ7IgorICAgIG91
dHAucHV0cyAiQXJnOjpLaW5kIGtpbmRzW3NpemVvZi4uLihBcmd1bWVudHMpXSA9IHsgYXJndW1l
bnRzLi4uIH07IgorICAgIG91dHAucHV0cyAic3dpdGNoIChvcGNvZGUpIHsiCisgICAgJG9wY29k
ZXMudmFsdWVzLmVhY2ggeworICAgICAgICB8IG9wY29kZSB8CisgICAgICAgIG91dHAucHV0cyAi
Y2FzZSAje29wY29kZS5uYW1lfToiCisgICAgICAgIG91dHAucHV0cyAic3dpdGNoIChzaXplb2Yu
Li4oQXJndW1lbnRzKSkgeyIKKyAgICAgICAgdW5sZXNzIG9wY29kZS5zcGVjaWFsCisgICAgICAg
ICAgICBvcGNvZGUub3ZlcmxvYWRzLmVhY2ggeworICAgICAgICAgICAgICAgIHwgb3ZlcmxvYWQg
fAorICAgICAgICAgICAgICAgIG91dHAucHV0cyAiY2FzZSAje292ZXJsb2FkLnNpZ25hdHVyZS5s
ZW5ndGh9OiIKKyAgICAgICAgICAgICAgICBjb2x1bW5HZXR0ZXIgPSBwcm9jIHsgfCBjb2x1bW5J
bmRleCB8ICJraW5kc1sje2NvbHVtbkluZGV4fV0iIH0KKyAgICAgICAgICAgICAgICBmaWx0ZXIg
PSBwcm9jIHsgZmFsc2UgfQorICAgICAgICAgICAgICAgIGNhbGxiYWNrID0gcHJvYyB7CisgICAg
ICAgICAgICAgICAgICAgIHwgZm9ybSB8CisgICAgICAgICAgICAgICAgICAgIHNwZWNpYWwgPSAo
bm90IGZvcm0ua2luZHMuZGV0ZWN0IHsgfCBraW5kIHwga2luZC5zcGVjaWFsIH0pCisgICAgICAg
ICAgICAgICAgICAgIG91dHAucHV0cyAiT1BHRU5fUkVUVVJOKCN7c3BlY2lhbH0pOyIKKyAgICAg
ICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgbWF0Y2hGb3JtcyhvdXRwLCA6c2FmZSwgb3Zl
cmxvYWQuZm9ybXMsIDAsIGNvbHVtbkdldHRlciwgZmlsdGVyLCBjYWxsYmFjaykKKyAgICAgICAg
ICAgICAgICBvdXRwLnB1dHMgImJyZWFrOyIKKyAgICAgICAgICAgIH0KKyAgICAgICAgZW5kCisg
ICAgICAgIG91dHAucHV0cyAiZGVmYXVsdDoiCisgICAgICAgIG91dHAucHV0cyAiYnJlYWs7Igor
ICAgICAgICBvdXRwLnB1dHMgIn0iCisgICAgICAgIG91dHAucHV0cyAiYnJlYWs7IgorICAgIH0K
KyAgICBvdXRwLnB1dHMgImRlZmF1bHQ6IgorICAgIG91dHAucHV0cyAiYnJlYWs7IgorICAgIG91
dHAucHV0cyAifSIKKyAgICBvdXRwLnB1dHMgInJldHVybiBmYWxzZTsgIgorICAgIG91dHAucHV0
cyAifSIKKyAgICAKKyAgICBvdXRwLnB1dHMgIn0gfSB9IC8vIG5hbWVzcGFjZSBKU0M6OkIzOjpB
aXIiCit9CisKK3dyaXRlQ1BQKCJPcGNvZGVVdGlscyIpIHsKKyAgICB8IG91dHAgfAorICAgIG91
dHAucHV0cyAiI2luY2x1ZGUgXCJBaXJJbnN0SW5saW5lcy5oXCIiCisgICAgb3V0cC5wdXRzICJu
YW1lc3BhY2UgSlNDIHsgbmFtZXNwYWNlIEIzIHsgbmFtZXNwYWNlIEFpciB7IgorICAgIG91dHAu
cHV0cyAiYm9vbCBJbnN0Ojppc1ZhbGlkRm9ybSgpIgorICAgIG91dHAucHV0cyAieyIKKyAgICBt
YXRjaEluc3RPdmVybG9hZEZvcm0ob3V0cCwgOnNhZmUsICJ0aGlzIikgeworICAgICAgICB8IG9w
Y29kZSwgb3ZlcmxvYWQsIGZvcm0gfAorICAgICAgICBpZiBvcGNvZGUuc3BlY2lhbAorICAgICAg
ICAgICAgb3V0cC5wdXRzICJpZiAoYXJncy5zaXplKCkgPCAxKSIKKyAgICAgICAgICAgIG91dHAu
cHV0cyAicmV0dXJuIGZhbHNlOyIKKyAgICAgICAgICAgIG91dHAucHV0cyAiaWYgKCFhcmdzWzBd
LmlzU3BlY2lhbCgpKSIKKyAgICAgICAgICAgIG91dHAucHV0cyAicmV0dXJuIGZhbHNlOyIKKyAg
ICAgICAgICAgIG91dHAucHV0cyAiT1BHRU5fUkVUVVJOKGFyZ3NbMF0uc3BlY2lhbCgpLT5pc1Zh
bGlkKCp0aGlzKSk7IgorICAgICAgICBlbHNlCisgICAgICAgICAgICBuZWVkc01vcmVWYWxpZGF0
aW9uID0gZmFsc2UKKyAgICAgICAgICAgIG92ZXJsb2FkLnNpZ25hdHVyZS5sZW5ndGgudGltZXMg
eworICAgICAgICAgICAgICAgIHwgaW5kZXggfAorICAgICAgICAgICAgICAgIHJvbGUgPSBvdmVy
bG9hZC5zaWduYXR1cmVbaW5kZXhdLnJvbGUKKyAgICAgICAgICAgICAgICB0eXBlID0gb3Zlcmxv
YWQuc2lnbmF0dXJlW2luZGV4XS50eXBlCisgICAgICAgICAgICAgICAga2luZCA9IGZvcm0ua2lu
ZHNbaW5kZXhdCisgICAgICAgICAgICAgICAgbmVlZHNNb3JlVmFsaWRhdGlvbiB8PSBraW5kLnNw
ZWNpYWwKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAjIFdlIGFscmVhZHkga25v
dyB0aGF0IHRoZSBmb3JtIG1hdGNoZXMuIFdlIGRvbid0IGhhdmUgdG8gdmFsaWRhdGUgdGhlIHJv
bGUsIHNpbmNlCisgICAgICAgICAgICAgICAgIyBraW5kIGltcGxpZXMgcm9sZS4gU28sIHRoZSBv
bmx5IHRoaW5nIGxlZnQgdG8gdmFsaWRhdGUgaXMgdGhlIHR5cGUuIEFuZCB3ZSBvbmx5IGhhdmUK
KyAgICAgICAgICAgICAgICAjIHRvIHZhbGlkYXRlIHRoZSB0eXBlIGlmIHdlIGhhdmUgYSBUbXAu
CisgICAgICAgICAgICAgICAgaWYga2luZC5uYW1lID09ICJUbXAiCisgICAgICAgICAgICAgICAg
ICAgIG91dHAucHV0cyAiaWYgKCFhcmdzWyN7aW5kZXh9XS50bXAoKS5pcyN7dHlwZX1QKCkpIgor
ICAgICAgICAgICAgICAgICAgICBvdXRwLnB1dHMgIk9QR0VOX1JFVFVSTihmYWxzZSk7IgorICAg
ICAgICAgICAgICAgIGVuZAorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgbmVlZHNNb3Jl
VmFsaWRhdGlvbgorICAgICAgICAgICAgICAgIG91dHAucHV0cyAiaWYgKCFpcyN7b3Bjb2RlLm5h
bWV9VmFsaWQodGhpcykpIgorICAgICAgICAgICAgICAgIG91dHAucHV0cyAiT1BHRU5fUkVUVVJO
KGZhbHNlKTsiCisgICAgICAgICAgICBlbmQKKyAgICAgICAgICAgIG91dHAucHV0cyAiT1BHRU5f
UkVUVVJOKHRydWUpOyIKKyAgICAgICAgZW5kCisgICAgfQorICAgIG91dHAucHV0cyAicmV0dXJu
IGZhbHNlOyIKKyAgICBvdXRwLnB1dHMgIn0iCisKKyAgICBvdXRwLnB1dHMgImJvb2wgSW5zdDo6
YWRtaXRzU3RhY2sodW5zaWduZWQgYXJnSW5kZXgpIgorICAgIG91dHAucHV0cyAieyIKKyAgICBv
dXRwLnB1dHMgInN3aXRjaCAob3Bjb2RlKSB7IgorICAgICRvcGNvZGVzLnZhbHVlcy5lYWNoIHsK
KyAgICAgICAgfCBvcGNvZGUgfAorICAgICAgICBvdXRwLnB1dHMgImNhc2UgI3tvcGNvZGUubmFt
ZX06IgorCisgICAgICAgIGlmIG9wY29kZS5zcGVjaWFsCisgICAgICAgICAgICBvdXRwLnB1dHMg
ImlmICghYXJnSW5kZXgpIgorICAgICAgICAgICAgb3V0cC5wdXRzICJyZXR1cm4gZmFsc2U7Igor
ICAgICAgICAgICAgb3V0cC5wdXRzICJPUEdFTl9SRVRVUk4oYXJnc1swXS5zcGVjaWFsKCktPmFk
bWl0c1N0YWNrKCp0aGlzLCBhcmdJbnN0KSk7IgorICAgICAgICBlbHNlCisgICAgICAgICAgICAj
IFN3aXRjaCBvbiB0aGUgYXJnSW5kZXguCisgICAgICAgICAgICBvdXRwLnB1dHMgInN3aXRjaCAo
YXJnSW5kZXgpIHsiCisKKyAgICAgICAgICAgIG51bUFyZ3MgPSBvcGNvZGUub3ZlcmxvYWRzLm1h
cCB7CisgICAgICAgICAgICAgICAgfCBvdmVybG9hZCB8CisgICAgICAgICAgICAgICAgb3Zlcmxv
YWQuc2lnbmF0dXJlLmxlbmd0aAorICAgICAgICAgICAgfS5tYXgKKyAgICAgICAgICAgIAorICAg
ICAgICAgICAgbnVtQXJncy50aW1lcyB7CisgICAgICAgICAgICAgICAgfCBhcmdJbmRleCB8Cisg
ICAgICAgICAgICAgICAgb3V0cC5wdXRzICJjYXNlICN7YXJnSW5kZXh9OiIKKworICAgICAgICAg
ICAgICAgICMgQ2hlY2sgaWYgYWxsIG9mIHRoZSBmb3JtcyBvZiBhbGwgb2YgdGhlIG92ZXJsb2Fk
cyBlaXRoZXIgZG8sIG9yIGRvbid0LCBhZG1pdCBhbiBhZGRyZXNzCisgICAgICAgICAgICAgICAg
IyBhdCB0aGlzIGluZGV4LiBXZSBleHBlY3QgdGhpcyB0byBiZSBhIHZlcnkgY29tbW9uIGNhc2Uu
CisgICAgICAgICAgICAgICAgbnVtWWVzID0gMAorICAgICAgICAgICAgICAgIG51bU5vID0gMAor
ICAgICAgICAgICAgICAgIG9wY29kZS5vdmVybG9hZHMuZWFjaCB7CisgICAgICAgICAgICAgICAg
ICAgIHwgb3ZlcmxvYWQgfAorICAgICAgICAgICAgICAgICAgICBvdmVybG9hZC5mb3Jtcy5lYWNo
IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHwgZm9ybSB8CisgICAgICAgICAgICAgICAgICAg
ICAgICBpZiBmb3JtLmtpbmRzW2FyZ0luZGV4XSA9PSAiQWRkciIKKyAgICAgICAgICAgICAgICAg
ICAgICAgICAgICBudW1ZZXMgKz0gMQorICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAg
ICAgICAgICAgICAgICAgICAgICAgICAgIG51bU5vICs9IDEKKyAgICAgICAgICAgICAgICAgICAg
ICAgIGVuZAorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAg
ICAgICAgICAgICAgIyBOb3RlIHRoYXQgd2UgZGVsaWJlcmF0ZWx5IHRlc3QgbnVtWWVzIGZpcnN0
IGJlY2F1c2UgaWYgd2UgZW5kIHVwIHdpdGggbm8gZm9ybXMsIHdlIHdhbnQKKyAgICAgICAgICAg
ICAgICAjIHRvIHNheSB0aGF0IEFkZHJlc3MgaXMgaW5hZG1pc3NpYmxlLgorICAgICAgICAgICAg
ICAgIGlmIG51bVllcyA9PSAwCisgICAgICAgICAgICAgICAgICAgIG91dHAucHV0cyAiT1BHRU5f
UkVUVVJOKGZhbHNlKTsiCisgICAgICAgICAgICAgICAgZWxzaWYgbnVtTm8gPT0gMAorICAgICAg
ICAgICAgICAgICAgICBvdXRwLnB1dHMgIk9QR0VOX1JFVFVSTih0cnVlKTsiCisgICAgICAgICAg
ICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAjIE5vdyBkbyB0aGUgZnVsbCB0ZXN0Lgor
CisgICAgICAgICAgICAgICAgICAgIG5lZWRPdmVybG9hZFN3aXRjaCA9IChvcGNvZGUub3Zlcmxv
YWRzLnNpemUgIT0gMSkKKworICAgICAgICAgICAgICAgICAgICBvdXRwLnB1dHMgInN3aXRjaCAo
YXJncy5zaXplKCkpIHsiIGlmIG5lZWRPdmVybG9hZFN3aXRjaAorICAgICAgICAgICAgICAgICAg
ICBvcGNvZGUub3ZlcmxvYWRzLmVhY2ggeworICAgICAgICAgICAgICAgICAgICAgICAgfCBvdmVy
bG9hZCB8CisKKyAgICAgICAgICAgICAgICAgICAgICAgICMgQWdhaW4sIGNoZWNrIGlmIGFsbCBv
ZiB0aGVtIGRvIHdoYXQgd2Ugd2FudC4KKyAgICAgICAgICAgICAgICAgICAgICAgIG51bVllcyA9
IDAKKyAgICAgICAgICAgICAgICAgICAgICAgIG51bU5vID0gMAorICAgICAgICAgICAgICAgICAg
ICAgICAgb3ZlcmxvYWQuZm9ybXMuZWFjaCB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAg
fCBmb3JtIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiBmb3JtLmtpbmRzW2FyZ0lu
ZGV4XSA9PSAiQWRkciIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtWWVzICs9
IDEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgIG51bU5vICs9IDEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmQK
KyAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgaWYg
bnVtWWVzID09IDAKKyAgICAgICAgICAgICAgICAgICAgICAgICMgRG9uJ3QgZW1pdCBhbnl0aGlu
ZywganVzdCBkcm9wIHRvIGRlZmF1bHQuCisgICAgICAgICAgICAgICAgICAgICAgICBlbHNpZiBu
dW1ObyA9PSAwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cC5wdXRzICJjYXNlICN7
b3ZlcmxvYWQuc2lnbmF0dXJlLmxlbmd0aH06IiBpZiBuZWVkT3ZlcmxvYWRTd2l0Y2gKKyAgICAg
ICAgICAgICAgICAgICAgICAgICAgICBvdXRwLnB1dHMgIk9QR0VOX1JFVFVSTih0cnVlKTsiCisg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cC5wdXRzICJicmVhazsiIGlmIG5lZWRPdmVy
bG9hZFN3aXRjaAorICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAg
ICAgICAgICAgICAgIG91dHAucHV0cyAiY2FzZSAje292ZXJsb2FkLnNpZ25hdHVyZS5sZW5ndGh9
OiIgaWYgbmVlZE92ZXJsb2FkU3dpdGNoCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAj
IFRoaXMgaXMgaG93IHdlIHRlc3QgdGhlIGh5cG90aGVzaXMgdGhhdCBjaGFuZ2luZyB0aGlzIGFy
Z3VtZW50IHRvIGFuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBhZGRyZXNzIHlpZWxk
cyBhIHZhbGlkIGZvcm0uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sdW1uR2V0dGVy
ID0gcHJvYyB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgY29sdW1uSW5kZXgg
fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiBjb2x1bW5JbmRleCA9PSBhcmdJ
bmRleAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkFyZzo6QWRkciIKKyAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgImFyZ3NbI3tjb2x1bW5JbmRleH1dLmtpbmQoKSIKKyAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgZW5kCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQor
ICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHRlciA9IHByb2MgeworICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICB8IGZvcm1zIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgbnVtWWVzID0gMAorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1z
LmVhY2ggeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBmb3JtIHwKKyAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIGZvcm0ua2luZHNbYXJnSW5kZXhd
ID09ICJBZGRyIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bVll
cyArPSAxCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmQKKyAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgIGlmIG51bVllcyA9PSAwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAj
IERyb3AgZG93biwgZW1pdCBubyBjb2RlLCBzaW5jZSB3ZSBjYW5ub3QgbWF0Y2guCisgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnVlCisgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgS2Vl
cCBnb2luZy4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlCisgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuZAorICAgICAgICAgICAgICAgICAgICAgICAg
ICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayA9IHByb2MgeworICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwLnB1dHMgIk9QR0VOX1JFVFVSTih0cnVl
KTsiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAg
ICAgICAgIG1hdGNoRm9ybXMob3V0cCwgOnNhZmUsIG92ZXJsb2FkLmZvcm1zLCAwLCBjb2x1bW5H
ZXR0ZXIsIGZpbHRlciwgY2FsbGJhY2spCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBv
dXRwLnB1dHMgImJyZWFrOyIgaWYgbmVlZE92ZXJsb2FkU3dpdGNoCisgICAgICAgICAgICAgICAg
ICAgICAgICBlbmQKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBp
ZiBuZWVkT3ZlcmxvYWRTd2l0Y2gKKyAgICAgICAgICAgICAgICAgICAgICAgIG91dHAucHV0cyAi
ZGVmYXVsdDoiCisgICAgICAgICAgICAgICAgICAgICAgICBvdXRwLnB1dHMgImJyZWFrOyIKKyAg
ICAgICAgICAgICAgICAgICAgICAgIG91dHAucHV0cyAifSIKKyAgICAgICAgICAgICAgICAgICAg
ZW5kCisgICAgICAgICAgICAgICAgZW5kCisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAg
ICAgb3V0cC5wdXRzICJicmVhazsiCisgICAgICAgICAgICB9CisgICAgICAgICAgICAKKyAgICAg
ICAgICAgIG91dHAucHV0cyAiZGVmYXVsdDoiCisgICAgICAgICAgICBvdXRwLnB1dHMgImJyZWFr
OyIKKyAgICAgICAgICAgIG91dHAucHV0cyAifSIKKyAgICAgICAgZW5kCisgICAgICAgIAorICAg
ICAgICBvdXRwLnB1dHMgImJyZWFrOyIKKyAgICB9CisgICAgb3V0cC5wdXRzICJkZWZhdWx0OiI7
CisgICAgb3V0cC5wdXRzICJicmVhazsiCisgICAgb3V0cC5wdXRzICJ9IgorICAgIG91dHAucHV0
cyAicmV0dXJuIGZhbHNlOyIKKyAgICBvdXRwLnB1dHMgIn0iCisKKyAgICBvdXRwLnB1dHMgIkND
YWxsSGVscGVyczo6SnVtcCBJbnN0OjpnZW5lcmF0ZShDQ2FsbEhlbHBlcnMmIGppdCwgR2VuZXJh
dGlvbkNvbnRleHQmIGNvbnRleHQpIGNvbnN0IgorICAgIG91dHAucHV0cyAieyIKKyAgICBvdXRw
LnB1dHMgIlVOVVNFRF9QQVJBTShqaXQpOyIKKyAgICBvdXRwLnB1dHMgIlVOVVNFRF9QQVJBTShj
b250ZXh0KTsiCisgICAgb3V0cC5wdXRzICJDQ2FsbEhlbHBlcnM6Okp1bXAgcmVzdWx0OyIKKyAg
ICBtYXRjaEluc3RPdmVybG9hZEZvcm0ob3V0cCwgOmZhc3QsICJ0aGlzIikgeworICAgICAgICB8
IG9wY29kZSwgb3ZlcmxvYWQsIGZvcm0gfAorICAgICAgICBpZiBvcGNvZGUuc3BlY2lhbAorICAg
ICAgICAgICAgb3V0cC5wdXRzICJPUEdFTl9SRVRVUk4oYXJnc1swXS5zcGVjaWFsKCktPmdlbmVy
YXRlKCp0aGlzLCBqaXQsIGNvbnRleHQpKTsiCisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGlm
IGZvcm0uYWx0TmFtZQorICAgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSBmb3JtLmFsdE5hbWUK
KyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBtZXRob2ROYW1lID0gb3Bjb2RlLm1h
c21OYW1lCisgICAgICAgICAgICBlbmQKKyAgICAgICAgICAgIGlmIG9wY29kZS5icmFuY2gKKyAg
ICAgICAgICAgICAgICBvdXRwLnByaW50ICJyZXN1bHQgPSAiCisgICAgICAgICAgICBlbmQKKyAg
ICAgICAgICAgIG91dHAucHJpbnQgImppdC4je21ldGhvZE5hbWV9KCIKKworICAgICAgICAgICAg
Zm9ybS5raW5kcy5lYWNoX3dpdGhfaW5kZXggeworICAgICAgICAgICAgICAgIHwga2luZCwgaW5k
ZXggfAorICAgICAgICAgICAgICAgIGlmIGluZGV4ICE9IDAKKyAgICAgICAgICAgICAgICAgICAg
b3V0cC5wcmludCAiLCAiCisgICAgICAgICAgICAgICAgZW5kCisgICAgICAgICAgICAgICAgY2Fz
ZSBraW5kLm5hbWUKKyAgICAgICAgICAgICAgICB3aGVuICJUbXAiCisgICAgICAgICAgICAgICAg
ICAgIGlmIG92ZXJsb2FkLnNpZ25hdHVyZVtpbmRleF0udHlwZSA9PSAiRyIKKyAgICAgICAgICAg
ICAgICAgICAgICAgIG91dHAucHJpbnQgImFyZ3NbI3tpbmRleH1dLmdwcigpIgorICAgICAgICAg
ICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICBvdXRwLnByaW50ICJhcmdz
WyN7aW5kZXh9XS5mcHIoKSIKKyAgICAgICAgICAgICAgICAgICAgZW5kCisgICAgICAgICAgICAg
ICAgd2hlbiAiSW1tIgorICAgICAgICAgICAgICAgICAgICBvdXRwLnByaW50ICJhcmdzWyN7aW5k
ZXh9XS5hc1RydXN0ZWRJbW0zMigpIgorICAgICAgICAgICAgICAgIHdoZW4gIkltbTY0IgorICAg
ICAgICAgICAgICAgICAgICBvdXRwLnByaW50ICJhcmdzWyN7aW5kZXh9XS5hc1RydXN0ZWRJbW02
NCgpIgorICAgICAgICAgICAgICAgIHdoZW4gIkFkZHIiCisgICAgICAgICAgICAgICAgICAgIG91
dHAucHJpbnQgImFyZ3NbI3tpbmRleH1dLmFzQWRkcmVzcygpIgorICAgICAgICAgICAgICAgIHdo
ZW4gIkluZGV4IgorICAgICAgICAgICAgICAgICAgICBvdXRwLnByaW50ICJhcmdzWyN7aW5kZXh9
XS5hc0Jhc2VJbmRleCgpIgorICAgICAgICAgICAgICAgIHdoZW4gIlJlbENvbmQiCisgICAgICAg
ICAgICAgICAgICAgIG91dHAucHJpbnQgImFyZ3NbI3tpbmRleH1dLmFzUmVsYXRpb25hbENvbmRp
dGlvbigpIgorICAgICAgICAgICAgICAgIHdoZW4gIlJlc0NvbmQiCisgICAgICAgICAgICAgICAg
ICAgIG91dHAucHJpbnQgImFyZ3NbI3tpbmRleH1dLmFzUmVzdWx0Q29uZGl0aW9uKCkiCisgICAg
ICAgICAgICAgICAgZW5kCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIG91dHAucHV0cyAi
KTsiCisgICAgICAgICAgICBvdXRwLnB1dHMgIk9QR0VOX1JFVFVSTihyZXN1bHQpOyIKKyAgICAg
ICAgZW5kCisgICAgfQorICAgIG91dHAucHV0cyAiUkVMRUFTRV9BU1NFUlRfTk9UX1JFQUNIRUQo
KTsiCisgICAgb3V0cC5wdXRzICJyZXR1cm4gcmVzdWx0OyIKKyAgICBvdXRwLnB1dHMgIn0iCisK
KyAgICBvdXRwLnB1dHMgIn0gfSB9IC8vIG5hbWVzcGFjZSBKU0M6OkIzOjpBaXIiCit9CisKSW5k
ZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9qaXQvUmVnLmgKPT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNl
L0phdmFTY3JpcHRDb3JlL2ppdC9SZWcuaAkocmV2aXNpb24gMTkxMjM5KQorKysgU291cmNlL0ph
dmFTY3JpcHRDb3JlL2ppdC9SZWcuaAkod29ya2luZyBjb3B5KQpAQCAtMTA1LDcgKzEwNSw2IEBA
IHB1YmxpYzoKICAgICB1bnNpZ25lZCBpbmRleCgpIGNvbnN0IHsgcmV0dXJuIG1faW5kZXg7IH0K
ICAgICAKICAgICBib29sIGlzU2V0KCkgY29uc3QgeyByZXR1cm4gbV9pbmRleCAhPSBpbnZhbGlk
KCk7IH0KLSAgICBib29sIG9wZXJhdG9yISgpIGNvbnN0IHsgcmV0dXJuICFpc1NldCgpOyB9CiAg
ICAgZXhwbGljaXQgb3BlcmF0b3IgYm9vbCgpIGNvbnN0IHsgcmV0dXJuIGlzU2V0KCk7IH0KIAog
ICAgIGJvb2wgaXNIYXNoVGFibGVEZWxldGVkVmFsdWUoKSBjb25zdCB7IHJldHVybiBtX2luZGV4
ID09IGRlbGV0ZWQoKTsgfQpAQCAtMTcwLDYgKzE2OSw0NiBAQCBwdWJsaWM6CiAgICAgCiAgICAg
dm9pZCBkdW1wKFByaW50U3RyZWFtJikgY29uc3Q7CiAKKyAgICBjbGFzcyBBbGxSZWdzSXRlcmFi
bGUgeworICAgIHB1YmxpYzoKKworICAgICAgICBjbGFzcyBpdGVyYXRvciB7CisgICAgICAgIHB1
YmxpYzoKKyAgICAgICAgICAgIGl0ZXJhdG9yKCkgeyB9CisKKyAgICAgICAgICAgIGV4cGxpY2l0
IGl0ZXJhdG9yKFJlZyByZWcpCisgICAgICAgICAgICAgICAgOiBtX3JlZyhyZWcpCisgICAgICAg
ICAgICB7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIFJlZyBvcGVyYXRvciooKSBjb25z
dCB7IHJldHVybiBtX3JlZzsgfQorCisgICAgICAgICAgICBpdGVyYXRvciYgb3BlcmF0b3IrKygp
CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbV9yZWcgPSBtX3JlZy5uZXh0KCk7Cisg
ICAgICAgICAgICAgICAgcmV0dXJuICp0aGlzOworICAgICAgICAgICAgfQorCisgICAgICAgICAg
ICBib29sIG9wZXJhdG9yPT0oY29uc3QgaXRlcmF0b3ImIG90aGVyKSBjb25zdAorICAgICAgICAg
ICAgeworICAgICAgICAgICAgICAgIHJldHVybiBtX3JlZyA9PSBvdGhlci5tX3JlZzsKKyAgICAg
ICAgICAgIH0KKworICAgICAgICAgICAgYm9vbCBvcGVyYXRvciE9KGNvbnN0IGl0ZXJhdG9yJiBv
dGhlcikgY29uc3QKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gISgqdGhp
cyA9PSBvdGhlcik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZToKKyAgICAgICAg
ICAgIFJlZyBtX3JlZzsKKyAgICAgICAgfTsKKworICAgICAgICBpdGVyYXRvciBiZWdpbigpIGNv
bnN0IHsgcmV0dXJuIGl0ZXJhdG9yKFJlZzo6Zmlyc3QoKSk7IH0KKyAgICAgICAgaXRlcmF0b3Ig
ZW5kKCkgY29uc3QgeyByZXR1cm4gaXRlcmF0b3IoUmVnKCkpOyB9CisgICAgfTsKKworICAgIHN0
YXRpYyBBbGxSZWdzSXRlcmFibGUgYWxsKCkgY29uc3QgeyByZXR1cm4gQWxsUmVnc0l0ZXJhYmxl
KCk7IH0KKwogcHJpdmF0ZToKICAgICBzdGF0aWMgdWludDhfdCBpbnZhbGlkKCkgeyByZXR1cm4g
MHhmZjsgfQogCkluZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUvaml0L1JlZ2lzdGVyU2V0LmgK
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRDb3JlL2ppdC9SZWdpc3RlclNldC5oCShy
ZXZpc2lvbiAxOTEyMzkpCisrKyBTb3VyY2UvSmF2YVNjcmlwdENvcmUvaml0L1JlZ2lzdGVyU2V0
LmgJKHdvcmtpbmcgY29weSkKQEAgLTExNyw2ICsxMTcsMTMgQEAgcHVibGljOgogICAgIAogICAg
IGJvb2wgb3BlcmF0b3I9PShjb25zdCBSZWdpc3RlclNldCYgb3RoZXIpIGNvbnN0IHsgcmV0dXJu
IG1fdmVjdG9yID09IG90aGVyLm1fdmVjdG9yOyB9CiAgICAgdW5zaWduZWQgaGFzaCgpIGNvbnN0
IHsgcmV0dXJuIG1fdmVjdG9yLmhhc2goKTsgfQorCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgRnVu
Y3Rvcj4KKyAgICB2b2lkIGZvckVhY2goY29uc3QgRnVuY3RvciYgZnVuY3RvcikKKyAgICB7Cisg
ICAgICAgIGZvciAoc2l6ZV90IGluZGV4IDogbV92ZWN0b3Iuc2V0Qml0cygpKQorICAgICAgICAg
ICAgZnVuY3RvcihSZWc6OmZyb21JbmRleChpbmRleCkpOworICAgIH0KICAgICAKIHByaXZhdGU6
CiAgICAgdm9pZCBzZXRBbnkoUmVnIHJlZykgeyBzZXQocmVnKTsgfQpJbmRleDogU291cmNlL1dU
Ri93dGYvQml0VmVjdG9yLmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL1dURi93dGYvQml0VmVjdG9y
LmgJKHJldmlzaW9uIDE5MTIzOSkKKysrIFNvdXJjZS9XVEYvd3RmL0JpdFZlY3Rvci5oCSh3b3Jr
aW5nIGNvcHkpCkBAIC0zMjAsNyArMzIwLDcgQEAgcHVibGljOiAKICAgICB9OwogICAgIAogICAg
IFNldEJpdHNJdGVyYWJsZSBzZXRCaXRzKCkgY29uc3QgeyByZXR1cm4gU2V0Qml0c0l0ZXJhYmxl
KCp0aGlzKTsgfQotICAgIAorCiBwcml2YXRlOgogICAgIHN0YXRpYyB1bnNpZ25lZCBiaXRzSW5Q
b2ludGVyKCkKICAgICB7CkluZGV4OiBTb3VyY2UvV1RGL3d0Zi9TY29wZWRMYW1iZGEuaAo9PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09Ci0tLSBTb3VyY2UvV1RGL3d0Zi9TY29wZWRMYW1iZGEuaAkocmV2aXNpb24gMCkKKysr
IFNvdXJjZS9XVEYvd3RmL1Njb3BlZExhbWJkYS5oCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEs
MTAyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE1IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyBy
ZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmlu
YXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRl
ZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAq
IDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUg
Y29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUg
Zm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZv
cm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlz
IGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQor
ICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGgg
dGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQ
UExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5U
SUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJB
TlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAq
IFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9S
CisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5D
SURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VT
IChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNU
SVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklU
UzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRI
RU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklM
SVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklT
SU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4g
SUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisKKyNp
Zm5kZWYgU2NvcGVkTGFtYmRhX2gKKyNkZWZpbmUgU2NvcGVkTGFtYmRhX2gKKworbmFtZXNwYWNl
IFdURiB7CisKKy8vIFlvdSBjYW4gdXNlIFNjb3BlZExhbWJkYSB0byBlZmZpY2llbnRseSBwYXNz
IGxhbWJkYXMgd2l0aG91dCBhbGxvY2F0aW5nIG1lbW9yeSBvciByZXF1aXJpbmcKKy8vIHRlbXBs
YXRlIHNwZWNpYWxpemF0aW9uIG9mIHRoZSBjYWxsZWUuIFRoZSBjYWxsZWUgc2hvdWxkIGJlIGRl
Y2xhcmVkIGFzOgorLy8KKy8vIHZvaWQgZm9vKGNvbnN0IFNjb3BlZExhbWJkYTxNeVRoaW5ncyog
KGludCwgU3R1ZmYmKT4mKTsKKy8vCisvLyBUaGUgY2FsbGVyIGp1c3QgZG9lczoKKy8vCisvLyB2
b2lkIGZvbyhzY29wZWRMYW1iZGE8TXlUaGluZ3MqIChpbnQsIFN0dWZmJik+KFsmXSAoaW50IHgs
IFN0dWZmJiB5KSAtPiBNeVRoaW5ncyogeyBibGFoIH0pKTsKKy8vCisvLyBOb3RlIHRoYXQgdGhp
cyByZWxpZXMgb24gZm9vKCkgbm90IGVzY2FwaW5nIHRoZSBsYW1iZGEuIFRoZSBsYW1iZGEgaXMg
b25seSB2YWxpZCB3aGlsZSBmb28oKSBpcworLy8gb24gdGhlIHN0YWNrIC0gaGVuY2UgdGhlIG5h
bWUgU2NvcGVkTGFtYmRhLgorCit0ZW1wbGF0ZTx0eXBlbmFtZSBGdW5jdGlvblR5cGU+IGNsYXNz
IFNjb3BlZExhbWJkYTsKK3RlbXBsYXRlPHR5cGVuYW1lIFJlc3VsdFR5cGUsIHR5cGVuYW1lLi4u
IEFyZ3VtZW50VHlwZXM+CitjbGFzcyBTY29wZWRMYW1iZGE8UmVzdWx0VHlwZSAoQXJndW1lbnRU
eXBlcy4uLik+IHsKK3B1YmxpYzoKKyAgICBTY29wZWRMYW1iZGEoUmVzdWx0VHlwZSAoKmltcGwp
KHZvaWQqIGFyZywgQXJndW1lbnRUeXBlcyYmLi4uKSA9IG51bGxwdHIsIHZvaWQqIGFyZyA9IG51
bGxwdHIpCisgICAgICAgIDogbV9pbXBsKGltcGwpCisgICAgICAgICwgbV9hcmcoYXJnKQorICAg
IHsKKyAgICB9CisgICAgCisgICAgflNjb3BlZExhbWJkYSgpCisgICAgeworICAgIH0KKworICAg
IFJlc3VsdFR5cGUgb3BlcmF0b3IoKShBcmd1bWVudFR5cGVzJiYuLi4gYXJndW1lbnRzKQorICAg
IHsKKyAgICAgICAgcmV0dXJuIG1faW1wbChtX2FyZywgc3RkOjpmb3J3YXJkPEFyZ3VtZW50VHlw
ZXM+KGFyZ3VtZW50cykuLi4pOworICAgIH0KKworcHJpdmF0ZToKKyAgICBSZXN1bHRUeXBlICgq
aW1wbCkodm9pZCogYXJnLCBBcmd1bWVudFR5cGVzJiYuLi4pIG1faW1wbDsKKyAgICB2b2lkICpt
X2FyZzsKK307CisKK3RlbXBsYXRlPHR5cGVuYW1lIEZ1bmN0aW9uVHlwZSwgdHlwZW5hbWUgRnVu
Y3Rvcj4gU2NvcGVkTGFtYmRhRnVuY3RvcjsKK3RlbXBsYXRlPHR5cGVuYW1lIFJlc3VsdFR5cGUs
IHR5cGVuYW1lLi4uIEFyZ3VtZW50VHlwZXMsIHR5cGVuYW1lIEZ1bmN0b3I+CitjbGFzcyBTY29w
ZWRMYW1iZGFGdW5jdG9yPFJlc3VsdFR5cGUgKEFyZ3VtZW50VHlwZXMuLi4pLCBGdW5jdG9yPiA6
IHB1YmxpYyBTY29wZWRMYW1iZGE8UmVzdWx0VHlwZSAoQXJndW1lbnRUeXBlcy4uLik+IHsKK3B1
YmxpYzoKKyAgICBTY29wZWRMYW1iZGFGdW5jdG9yKGNvbnN0IEZ1bmN0b3ImIGZ1bmN0b3IpCisg
ICAgICAgIDogU2NvcGVkTGFtYmRhKGltcGxGdW5jdGlvbiwgdGhpcykKKyAgICAgICAgLCBtX2Z1
bmN0b3IoZnVuY3RvcikKKyAgICB7CisgICAgfQorCisgICAgU2NvcGVkTGFtYmRhRnVuY3RvcihG
dW5jdG9yJiYgZnVuY3RvcikKKyAgICAgICAgOiBTY29wZWRMYW1iZGEoaW1wbEZ1bmN0aW9uLCB0
aGlzKQorICAgICAgICAsIG1fZnVuY3RvcihXVEY6Om1vdmUoZnVuY3RvcikpCisgICAgeworICAg
IH0KKworcHJpdmF0ZToKKyAgICBzdGF0aWMgUmVzdWx0VHlwZSBpbXBsRnVuY3Rpb24odm9pZCog
YXJndW1lbnQsIEFyZ3VtZW50VHlwZXMmJi4uLiBhcmd1bWVudHMpCisgICAgeworICAgICAgICBy
ZXR1cm4gc3RhdGljX2Nhc3Q8U2NvcGVkTGFtYmRhRnVuY3Rvcio+KGFyZ3VtZW50KS0+bV9mdW5j
dG9yKAorICAgICAgICAgICAgc3RkOjpmb3J3YXJkPEFyZ3VtZW50VHlwZXM+KGFyZ3VtZW50cyku
Li4pOworICAgIH0KKworICAgIEZ1bmN0b3IgbV9mdW5jdG9yOworfTsKKwordGVtcGxhdGU8dHlw
ZW5hbWUgRnVuY3Rpb25UeXBlLCB0eXBlbmFtZSBGdW5jdG9yPgorU2NvcGVkTGFtYmRhRnVuY3Rv
cjxGdW5jdGlvblR5cGUsIEZ1bmN0b3I+IHNjb3BlZExhbWJkYShjb25zdCBGdW5jdG9yJiBmdW5j
dG9yKQoreworICAgIHJldHVybiBTY29wZWRMYW1iZGFGdW5jdG9yPEZ1bmN0aW9uVHlwZSwgRnVu
Y3Rvcj4oZnVuY3Rvcik7Cit9CisKK30gLy8gbmFtZXNwYWNlIFdURgorCisjZW5kaWYgLy8gU2Nv
cGVkTGFtYmRhX2gKKwpJbmRleDogU291cmNlL1dURi93dGYvU2hhcmVkVGFzay5oCj09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT0KLS0tIFNvdXJjZS9XVEYvd3RmL1NoYXJlZFRhc2suaAkocmV2aXNpb24gMTkxMjM5KQorKysg
U291cmNlL1dURi93dGYvU2hhcmVkVGFzay5oCSh3b3JraW5nIGNvcHkpCkBAIC03OSw2ICs3OSwx
MSBAQCBwdWJsaWM6CiAgICAgewogICAgIH0KIAorICAgIFNoYXJlZFRhc2tGdW5jdG9yKEZ1bmN0
b3ImJiBmdW5jdG9yKQorICAgICAgICA6IG1fZnVuY3RvcihXVEY6Om1vdmUoZnVuY3RvcikpCisg
ICAgeworICAgIH0KKwogcHJpdmF0ZToKICAgICBSZXN1bHRUeXBlIHJ1bihBcmd1bWVudFR5cGVz
JiYuLi4gYXJndW1lbnRzKSBvdmVycmlkZQogICAgIHsKQEAgLTExMCw2ICsxMTUsMTEgQEAgUmVm
PFNoYXJlZFRhc2s8RnVuY3Rpb25UeXBlPj4gY3JlYXRlU2hhcgogewogICAgIHJldHVybiBhZG9w
dFJlZigqbmV3IFNoYXJlZFRhc2tGdW5jdG9yPEZ1bmN0aW9uVHlwZSwgRnVuY3Rvcj4oZnVuY3Rv
cikpOwogfQordGVtcGxhdGU8dHlwZW5hbWUgRnVuY3Rpb25UeXBlLCB0eXBlbmFtZSBGdW5jdG9y
PgorUmVmPFNoYXJlZFRhc2s8RnVuY3Rpb25UeXBlPj4gY3JlYXRlU2hhcmVkVGFzayhGdW5jdG9y
JiYgZnVuY3RvcikKK3sKKyAgICByZXR1cm4gYWRvcHRSZWYoKm5ldyBTaGFyZWRUYXNrRnVuY3Rv
cjxGdW5jdGlvblR5cGUsIEZ1bmN0b3I+KFdURjo6bW92ZShmdW5jdG9yKSkpOworfQogCiB9IC8v
IG5hbWVzcGFjZSBXVEYKIAo=
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>263778</attachid>
            <date>2015-10-21 18:26:05 -0700</date>
            <delta_ts>2015-10-22 12:41:02 -0700</delta_ts>
            <desc>and now, with a stack allocator</desc>
            <filename>blah.patch</filename>
            <type>text/plain</type>
            <size>344078</size>
            <attacher name="Filip Pizlo">fpizlo</attacher>
            
              <data encoding="base64">SW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM0FkZHJlc3NNYXRjaGVyLnBhdHRlcm5z
Cj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM0FkZHJlc3NNYXRjaGVy
LnBhdHRlcm5zCShyZXZpc2lvbiAwKQorKysgU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzQWRk
cmVzc01hdGNoZXIucGF0dGVybnMJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSw0MSBAQAorIyBD
b3B5cmlnaHQgKEMpIDIwMTUgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorIworIyBS
ZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9y
IHdpdGhvdXQKKyMgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhl
IGZvbGxvd2luZyBjb25kaXRpb25zCisjIGFyZSBtZXQ6CisjIDEuIFJlZGlzdHJpYnV0aW9ucyBv
ZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisjICAgIG5vdGlj
ZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4K
KyMgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBh
Ym92ZSBjb3B5cmlnaHQKKyMgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQg
dGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorIyAgICBkb2N1bWVudGF0aW9uIGFuZC9v
ciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorIworIyBU
SElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gQU5EIElUUyBDT05UUklCVVRP
UlMgYGBBUyBJUycnCisjIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElO
Q0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorIyBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9G
IE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisjIFBVUlBPU0Ug
QVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IgSVRTIENPTlRS
SUJVVE9SUworIyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFM
LCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCisjIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVE
SU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCisjIFNVQlNUSVRVVEUgR09P
RFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVT
UworIyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJ
QUJJTElUWSwgV0hFVEhFUiBJTgorIyBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9S
VCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorIyBBUklTSU5HIElOIEFOWSBX
QVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GCisj
IFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworbWF0Y2hlciBBZGRyZXNzTWF0Y2hl
cgorCisjIE5vdGUgdGhhdCB0aGlzIHJlbGllcyBvbiBCMyBkb2luZyBhZ2dyZXNzaXZlIHJlYXNz
b2NpYXRpb24gYW5kIGNhbm9uY2FsaXphdGlvbiBvZiBpbnRlZ2VyIGFkZHMuCisjIFdlJ2xsIG5l
dmVyIHNlZSBBZGQoQWRkKHgsIGNvbnN0MSksIGNvbnN0MikgYmVjYXVzZSBpdCB3b3VsZCBoYXZl
IGFscmVhZHkgYmVlbiByZWFzc29jaWF0ZWQgaW50bworIyBBZGQoeCwgY29uc3QxICsgY29uc3Qy
KS4gQWxzbywgd2Ugd2lsbCBuZXZlciBzZWUgQWRkKGNvbnN0LCB4KSwgYmVjYXVzZSB3ZSB3b3Vs
ZCBoYXZlIGNhbm9uaWNhbGl6ZWQKKyMgaXQgdG8gQWRkKHgsIGNvbnN0KS4gVGhhdCBzYWlkLCBp
biB0aGlzIGNvZGUgd2UgbmV2ZXIgbWFrZSBhc3NlcnRpb25zIGFib3V0IHRoZXNlIG9wdGltaXph
dGlvbnMKKyMgaGF2aW5nIGJlZW4gcGVyZm9ybWVkLiBBbHNvLCBzaW5jZSB0aGUgTG9hZC9TdG9y
ZSBpbnN0cnVjdGlvbnMgaW4gQjMgaGF2ZSBhIGJ1aWx0LWluIG9mZnNldCwgd2UKKyMgZG9uJ3Qg
bmVlZCB0byBtYXRjaCBBZGQoeCwgY29uc3QpLiBUaGF0IHdvdWxkIGhhdmUgYmVlbiBmb2xkZWQg
aW50byB0aGUgTG9hZC9TdG9yZSBpbnN0cnVjdGlvbnMKKyMgYWxyZWFkeS4gU28sIHRoZSBvbmx5
IGZhbmN5IG1hdGhpbmcgdGhpcyBjYW4gZG8gaXMganVzdCBCYXNlSW5kZXggZm9ybXMuCisKK0Fk
ZFNoaWZ0MSA9IEFkZChTaGwoaW5kZXgsICRsb2dTY2FsZSksIGJhc2UpCitBZGRTaGlmdDIgPSBB
ZGQoYmFzZSwgU2hsKGluZGV4LCAkbG9nU2NhbGUpKQorCitBZGQgPSBBZGQobGVmdCwgcmlnaHQp
CisKKyRDb25zdAorCitEaXJlY3QKSW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM0Fy
Z3VtZW50UmVnVmFsdWUuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9i
My9CM0FyZ3VtZW50UmVnVmFsdWUuY3BwCShyZXZpc2lvbiAwKQorKysgU291cmNlL0phdmFTY3Jp
cHRDb3JlL2IzL0IzQXJndW1lbnRSZWdWYWx1ZS5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTAsMCAr
MSw0MSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNSBBcHBsZSBJbmMuIEFsbCByaWdodHMg
cmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJp
bmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0
ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6Cisg
KiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3Zl
IGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhl
IGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBm
b3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhp
cyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUK
KyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRo
IHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBB
UFBMRSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFO
VElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJS
QU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisg
KiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBP
UgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElO
Q0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdF
UyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJT
VElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJ
VFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBU
SEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJ
TElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJ
U0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVO
IElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLiAKKyAqLworCisj
aW5jbHVkZSAiY29uZmlnLmgiCisjaW5jbHVkZSAiQjNBcmd1bWVudFJlZ1ZhbHVlLmgiCisKK25h
bWVzcGFjZSBKU0MgeyBuYW1lc3BhY2UgQjMgeworCitBcmd1bWVudFJlZ1ZhbHVlOjp+QXJndW1l
bnRSZWdWYWx1ZSgpCit7Cit9CisKK3ZvaWQgQXJndW1lbnRSZWdWYWx1ZTo6ZHVtcE1ldGEoUHJp
bnRTdHJlYW0mIG91dCkgY29uc3QKK3sKKyAgICBvdXQucHJpbnQobV9yZWcpOworfQorCit9IH0g
Ly8gbmFtZXNwYWNlIEpTQzo6QjMKKwpJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0Iz
QXJndW1lbnRSZWdWYWx1ZS5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9i
My9CM0FyZ3VtZW50UmVnVmFsdWUuaAkocmV2aXNpb24gMCkKKysrIFNvdXJjZS9KYXZhU2NyaXB0
Q29yZS9iMy9CM0FyZ3VtZW50UmVnVmFsdWUuaAkod29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDYw
IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE1IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNl
cnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5
IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBw
cm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEu
IFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29w
eXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9s
bG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0g
bXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxp
c3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICog
ICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhl
IGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExF
IElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVT
LCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJ
RVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBV
UlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SCisg
KiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURF
TlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJ
TkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRV
VEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsg
T1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9S
WQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZ
LCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5H
IElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYg
QURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisKKyNpZm5k
ZWYgQjNBcmd1bWVudFJlZ1ZhbHVlX2gKKyNkZWZpbmUgQjNBcmd1bWVudFJlZ1ZhbHVlX2gKKwor
I2luY2x1ZGUgIkIzVmFsdWUuaCIKKyNpbmNsdWRlICJSZWcuaCIKKworbmFtZXNwYWNlIEpTQyB7
IG5hbWVzcGFjZSBCMyB7CisKK2NsYXNzIEFyZ3VtZW50UmVnVmFsdWUgOiBwdWJsaWMgVmFsdWUg
eworcHVibGljOgorICAgIHN0YXRpYyBib29sIGFjY2VwdHMoT3Bjb2RlIG9wY29kZSkgeyByZXR1
cm4gb3Bjb2RlID09IEFyZ3VtZW50UmVnOyB9CisgICAgCisgICAgfkFyZ3VtZW50UmVnVmFsdWUo
KTsKKworICAgIFJlZyBhcmd1bWVudFJlZygpIGNvbnN0IHsgcmV0dXJuIG1fcmVnOyB9CisKK3By
b3RlY3RlZDoKKyAgICB2b2lkIGR1bXBNZXRhKFByaW50U3RyZWFtJikgY29uc3Qgb3ZlcnJpZGU7
CisKK3ByaXZhdGU6CisgICAgZnJpZW5kIGNsYXNzIFByb2NlZHVyZTsKKworICAgIEFyZ3VtZW50
UmVnVmFsdWUodW5zaWduZWQgaW5kZXgsIE9yaWdpbiBvcmlnaW4sIFJlZyByZWcpCisgICAgICAg
IDogVmFsdWUoaW5kZXgsIEFyZ3VtZW50UmVnLCByZWcuaXNHUFIoKSA/IHBvaW50ZXIoKSA6IERv
dWJsZSwgb3JpZ2luKQorICAgICAgICAsIG1fcmVnKHJlZykKKyAgICB7CisgICAgfQorCisgICAg
UmVnIG1fcmVnOworfTsKKworfSB9IC8vIG5hbWVzcGFjZSBKU0M6OkIzCisKKyNlbmRpZiAvLyBC
M0FyZ3VtZW50UmVnVmFsdWVfaAorCkluZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNC
YXNpY0Jsb2NrLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNC
YXNpY0Jsb2NrLmNwcAkocmV2aXNpb24gMCkKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9C
M0Jhc2ljQmxvY2suY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsNzUgQEAKKy8qCisgKiBD
b3B5cmlnaHQgKEMpIDIwMTUgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAq
IFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGgg
b3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQg
dGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRp
b25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAg
IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xh
aW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVj
ZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRp
b25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0
aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9u
LgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFTIElT
JycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywg
QlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFO
VEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElT
Q0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IKKyAqIENPTlRSSUJVVE9S
UyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFM
LAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVU
IE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBT
RVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJ
TlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFC
SUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAq
IChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBP
VVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRI
RSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKworI2luY2x1ZGUgImNvbmZpZy5o
IgorI2luY2x1ZGUgIkIzQmFzaWNCbG9jay5oIgorCisjaW5jbHVkZSAiQjNCYXNpY0Jsb2NrVXRp
bHMuaCIKKworbmFtZXNwYWNlIEpTQyB7IG5hbWVzcGFjZSBCMyB7CisKK0Jhc2ljQmxvY2s6OkJh
c2ljQmxvY2sodW5zaWduZWQgaW5kZXgpCisgICAgOiBtX2luZGV4KGluZGV4KQoreworfQorCitC
YXNpY0Jsb2NrOjp+QmFzaWNCbG9jaygpCit7Cit9CisKK3ZvaWQgQmFzaWNCbG9jazo6YXBwZW5k
KFZhbHVlKiB2YWx1ZSkKK3sKKyAgICBtX3ZhbHVlcy5hcHBlbmQodmFsdWUpOworfQorCit2b2lk
IEJhc2ljQmxvY2s6OmFkZFByZWRlY2Vzc29yKEJhc2ljQmxvY2sqIGJsb2NrKQoreworICAgIEIz
OjphZGRQcmVkZWNlc3Nvcih0aGlzLCBibG9jayk7Cit9CisKK3ZvaWQgQmFzaWNCbG9jazo6cmVt
b3ZlUHJlZGVjZXNzb3IoQmFzaWNCbG9jayogYmxvY2spCit7CisgICAgQjM6OnJlbW92ZVByZWRl
Y2Vzc29yKHRoaXMsIGJsb2NrKTsKK30KKwordm9pZCBCYXNpY0Jsb2NrOjpyZXBsYWNlUHJlZGVj
ZXNzb3IoQmFzaWNCbG9jayogZnJvbSwgQmFzaWNCbG9jayogdG8pCit7CisgICAgQjM6OnJlcGxh
Y2VQcmVkZWNlc3Nvcih0aGlzLCBmcm9tLCB0byk7Cit9CisKK3ZvaWQgQmFzaWNCbG9jazo6ZHVt
cChQcmludFN0cmVhbSYgb3V0KSBjb25zdAoreworICAgIG91dC5wcmludChkdW1wUHJlZml4LCBt
X2luZGV4KTsKK30KKwordm9pZCBCYXNpY0Jsb2NrOjpkZWVwRHVtcChQcmludFN0cmVhbSYgb3V0
KSBjb25zdAoreworICAgIG91dC5wcmludCgiQkIiLCAqdGhpcywgIjpcbiIpOworICAgIGZvciAo
VmFsdWUqIHZhbHVlIDogKnRoaXMpCisgICAgICAgIG91dC5wcmludCgiICAgICIsIGRlZXBEdW1w
KHZhbHVlKSwgIlxuIik7Cit9CisKK30gfSAvLyBuYW1lc3BhY2UgSlNDOjpCMworCkluZGV4OiBT
b3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNCYXNpY0Jsb2NrLmgKPT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291
cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzQmFzaWNCbG9jay5oCShyZXZpc2lvbiAwKQorKysgU291
cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzQmFzaWNCbG9jay5oCSh3b3JraW5nIGNvcHkpCkBAIC0w
LDAgKzEsMTIzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE1IEFwcGxlIEluYy4gQWxsIHJp
Z2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBh
bmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBl
cm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1l
dDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUg
YWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFu
ZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmlu
YXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNl
LCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGlu
IHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVk
IHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVE
IEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBX
QVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVE
IFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VM
QVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJ
TkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVD
VCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBE
QU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9G
IFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICog
UFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04g
QU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1Qg
TElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNF
KSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUs
IEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICov
CisKKyNpZm5kZWYgQjNCYXNpY0Jsb2NrCisjZGVmaW5lIEIzQmFzaWNCbG9jaworCituYW1lc3Bh
Y2UgSlNDIHsgbmFtZXNwYWNlIEIzIHsKKworY2xhc3MgUHJvY2VkdXJlOworY2xhc3MgVmFsdWU7
CisKK2NsYXNzIEJhc2ljQmxvY2sgeworICAgIFdURl9NQUtFX05PTkNPUFlBQkxFKEJhc2ljQmxv
Y2spOworICAgIFdURl9NQUtFX0ZBU1RfQUxMT0NBVEVEOworcHVibGljOgorICAgIHR5cGVkZWYg
VmVjdG9yPFZhbHVlKj4gVmFsdWVMaXN0OworICAgIHR5cGVkZWYgVmVjdG9yPEJhc2ljQmxvY2sq
LCAyPiBBZGphY2VuY3lMaXN0OyAvLyBUaGlzIG1hdGNoZXMgQ29udHJvbFZhbHVlOjpTdWNjZXNz
b3JMaXN0CisKKyAgICBzdGF0aWMgY29uc3QgY2hhciogZHVtcFByZWZpeCA9ICIjIjsKKworICAg
IH5CYXNpY0Jsb2NrKCk7CisKKyAgICB1bnNpZ25lZCBpbmRleCgpIGNvbnN0IHsgcmV0dXJuIG1f
aW5kZXg7IH0KKworICAgIFZhbHVlTGlzdDo6aXRlcmF0b3IgYmVnaW4oKSB7IHJldHVybiBtX3Zh
bHVlcy5iZWdpbigpOyB9CisgICAgVmFsdWVMaXN0OjppdGVyYXRvciBlbmQoKSB7IHJldHVybiBt
X3ZhbHVlcy5lbmQoKTsgfQorICAgIFZhbHVlTGlzdDo6Y29uc3RfaXRlcmF0b3IgYmVnaW4oKSBj
b25zdCB7IHJldHVybiBtX3ZhbHVlcy5iZWdpbigpOyB9CisgICAgVmFsdWVMaXN0Ojpjb25zdF9p
dGVyYXRvciBlbmQoKSBjb25zdCB7IHJldHVybiBtX3ZhbHVlcy5lbmQoKTsgfQorCisgICAgc2l6
ZV90IHNpemUoKSBjb25zdCB7IHJldHVybiBtX3ZhbHVlcy5zaXplKCk7IH0KKyAgICBWYWx1ZSog
YXQoc2l6ZV90IGluZGV4KSBjb25zdCB7IHJldHVybiBtX3ZhbHVlc1tpbmRleF07IH0KKyAgICBW
YWx1ZSomIGF0KHNpemVfdCBpbmRleCkgeyByZXR1cm4gbV92YWx1ZXNbaW5kZXhdOyB9CisKKyAg
ICBWYWx1ZSogbGFzdCgpIGNvbnN0IHsgcmV0dXJuIG1fdmFsdWVzLmxhc3QoKTsgfQorICAgIFZh
bHVlKiYgbGFzdCgpIHsgcmV0dXJuIG1fdmFsdWVzLmxhc3QoKTsgfQorCisgICAgY29uc3QgVmFs
dWVMaXN0JiB2YWx1ZXMoKSBjb25zdCB7IHJldHVybiBtX3ZhbHVlczsgfQorICAgIFZhbHVlTGlz
dCYgdmFsdWVzKCkgeyByZXR1cm4gbV92YWx1ZXM7IH0KKworICAgIHZvaWQgYXBwZW5kKFZhbHVl
Kik7CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBWYWx1ZVR5cGUsIHR5cGVuYW1lLi4uIEFyZ3Vt
ZW50cz4KKyAgICBWYWx1ZVR5cGUqIGFwcGVuZE5ldyhQcm9jZWR1cmUmLCBBcmd1bWVudHMuLi4p
OworCisgICAgdW5zaWduZWQgbnVtU3VjY2Vzc29ycygpIGNvbnN0OworICAgIEJhc2ljQmxvY2sq
IHN1Y2Nlc3Nvcih1bnNpZ25lZCBpbmRleCkgY29uc3Q7CisgICAgQmFzaWNCbG9jayomIHN1Y2Nl
c3Nvcih1bnNpZ25lZCBpbmRleCk7CisgICAgY29uc3QgQWRqYWNlbmN5TGlzdCYgc3VjY2Vzc29y
cygpIGNvbnN0OworCisgICAgdW5zaWduZWQgbnVtUHJlZGVjZXNzb3JzKCkgY29uc3QgeyByZXR1
cm4gbV9wcmVkZWNlc3NvcnMuc2l6ZSgpOyB9CisgICAgQmFzaWNCbG9jayogcHJlZGVjZXNzb3Io
dW5zaWduZWQgaW5kZXgpIGNvbnN0IHsgcmV0dXJuIG1fcHJlZGVjZXNzb3JzW2luZGV4XTsgfQor
ICAgIEJhc2ljQmxvY2sqJiBwcmVkZWNlc3Nvcih1bnNpZ25lZCBpbmRleCkgeyByZXR1cm4gbV9w
cmVkZWNlc3NvcnNbaW5kZXhdOyB9CisgICAgY29uc3QgQWRqYWNlbmN5TGlzdCYgcHJlZGVjZXNz
b3JzKCkgY29uc3QgeyByZXR1cm4gbV9wcmVkZWNlc3NvcnNbaW5kZXhdOyB9CisgICAgQWRqYWNl
bmN5TGlzdCYgcHJlZGVjZXNzb3JzKCkgeyByZXR1cm4gbV9wcmVkZWNlc3NvcnNbaW5kZXhdOyB9
CisKKyAgICBib29sIGFkZFByZWRlY2Vzc29yKEJhc2ljQmxvY2sqKTsKKyAgICBib29sIHJlbW92
ZVByZWRlY2Vzc29yKEJhc2ljQmxvY2sqKTsKKyAgICBib29sIHJlcGxhY2VQcmVkZWNlc3NvcihC
YXNpY0Jsb2NrKiBmcm9tLCBCYXNpY0Jsb2NrKiB0byk7CisKKyAgICB2b2lkIGR1bXAoUHJpbnRT
dHJlYW0mKSBjb25zdDsKKyAgICB2b2lkIGRlZXBEdW1wKFByaW50U3RyZWFtJikgY29uc3Q7CisK
K3ByaXZhdGU6CisgICAgZnJpZW5kIGNsYXNzIFByb2NlZHVyZTsKKyAgICAKKyAgICAvLyBJbnN0
YW50aWF0ZSB2aWEgUHJvY2VkdXJlLgorICAgIEJhc2ljQmxvY2sodW5zaWduZWQgaW5kZXgpOwor
CisgICAgdW5zaWduZWQgbV9pbmRleDsKKyAgICBWYWx1ZUxpc3QgbV92YWx1ZXM7CisgICAgQWRq
YWNlbmN5TGlzdCBtX3N1Y2Nlc3NvcnM7Cit9OworCitjbGFzcyBEZWVwQmFzaWNCbG9ja0R1bXAg
eworcHVibGljOgorICAgIERlZXBCYXNpY0Jsb2NrRHVtcChCYXNpY0Jsb2NrKiBibG9jaykKKyAg
ICAgICAgOiBtX2Jsb2NrKGJsb2NrKQorICAgIHsKKyAgICB9CisKKyAgICB2b2lkIGR1bXAoUHJp
bnRTdHJlYW0mIG91dCkgY29uc3QKKyAgICB7CisgICAgICAgIGlmIChtX2Jsb2NrKQorICAgICAg
ICAgICAgbV9ibG9jay0+ZGVlcER1bXAob3V0KTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAg
b3V0LnByaW50KCI8bnVsbD4iKTsKKyAgICB9CisKK3ByaXZhdGU6CisgICAgQmFzaWNCbG9jayog
bV9ibG9jazsKK307CisKK0RlZXBCYXNpY0Jsb2NrRHVtcCBkZWVwRHVtcChCYXNpY0Jsb2NrKiBi
bG9jaykKK3sKKyAgICByZXR1cm4gRGVlcEJhc2ljQmxvY2tEdW1wKGJsb2NrKTsKK30KKworfSB9
IC8vIG5hbWVzcGFjZSBKU0M6OkIzCisKKyNlbmRpZiAvLyBCM0Jhc2ljQmxvY2sKKwpJbmRleDog
U291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzQmFzaWNCbG9ja0lubGluZXMuaAo9PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNCYXNpY0Jsb2NrSW5saW5lcy5oCShyZXZp
c2lvbiAwKQorKysgU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzQmFzaWNCbG9ja0lubGluZXMu
aAkod29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDY2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAy
MDE1IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlv
biBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAq
IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcg
Y29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2Ug
Y29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMg
bGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBS
ZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNv
cHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZv
bGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3Ro
ZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElT
IFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAq
IEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRF
RCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBG
SVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBO
TyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZP
UiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFS
WSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBU
TywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1Mg
T0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBI
T1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVS
IElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5F
R0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UK
KyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkg
T0YgU1VDSCBEQU1BR0UuIAorICovCisKKyNpZm5kZWYgQjNCYXNpY0Jsb2NrSW5saW5lc19oCisj
ZGVmaW5lIEIzQmFzaWNCbG9ja0lubGluZXNfaAorCisjaW5jbHVkZSAiQjNCYXNpY0Jsb2NrLmgi
CisjaW5jbHVkZSAiQjNDb250cm9sVmFsdWUuaCIKKyNpbmNsdWRlICJCM1Byb2NlZHVyZUlubGlu
ZXMuaCIKKworbmFtZXNwYWNlIEpTQyB7IG5hbWVzcGFjZSBCMyB7CisKK3RlbXBsYXRlPHR5cGVu
YW1lIFZhbHVlVHlwZSB0eXBlbmFtZS4uLiBBcmd1bWVudHM+CitWYWx1ZVR5cGUqIEJhc2ljQmxv
Y2s6OmFwcGVuZE5ldyhQcm9jZWR1cmUmIHByb2NlZHVyZSwgQXJndW1lbnRzLi4uIGFyZ3VtZW50
cykKK3sKKyAgICBWYWx1ZVR5cGUqIHJlc3VsdCA9IHByb2NlZHVyZS5hZGQ8VmFsdWVUeXBlPihh
cmd1bWVudHMuLi4pOworICAgIGFwcGVuZChyZXN1bHQpOworICAgIHJldHVybiByZXN1bHQ7Cit9
CisKK3Vuc2lnbmVkIEJhc2ljQmxvY2s6Om51bVN1Y2Nlc3NvcnMoKSBjb25zdAoreworICAgIHJl
dHVybiBsYXN0KCktPmFzPENvbnRyb2xWYWx1ZT4oKS0+bnVtU3VjY2Vzc29ycygpOworfQorCitC
YXNpY0Jsb2NrKiBCYXNpY0Jsb2NrOjpzdWNjZXNzb3IodW5zaWduZWQgaW5kZXgpIGNvbnN0Cit7
CisgICAgcmV0dXJuIGxhc3QoKS0+YXM8Q29udHJvbFZhbHVlPigpLT5zdWNjZXNzb3IoaW5kZXgp
OworfQorCitCYXNpY0Jsb2NrKiYgQmFzaWNCbG9jazo6c3VjY2Vzc29yKHVuc2lnbmVkIGluZGV4
KQoreworICAgIHJldHVybiBsYXN0KCktPmFzPENvbnRyb2xWYWx1ZT4oKS0+c3VjY2Vzc29yKGlu
ZGV4KTsKK30KKworY29uc3QgQmFzaWNCbG9jazo6U3VjY2Vzc29yTGlzdCYgQmFzaWNCbG9jazo6
c3VjY2Vzc29ycygpIGNvbnN0Cit7CisgICAgcmV0dXJuIGxhc3QoKS0+YXM8Q29udHJvbFZhbHVl
PigpLT5zdWNjZXNzb3JzKCk7Cit9CisKK30gfSAvLyBuYW1lc3BhY2UgSlNDOjpCMworCisjZW5k
aWYgLy8gQjNCYXNpY0Jsb2NrSW5saW5lc19oCisKSW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29y
ZS9iMy9CM0Jhc2ljQmxvY2tVdGlscy5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0
Q29yZS9iMy9CM0Jhc2ljQmxvY2tVdGlscy5oCShyZXZpc2lvbiAwKQorKysgU291cmNlL0phdmFT
Y3JpcHRDb3JlL2IzL0IzQmFzaWNCbG9ja1V0aWxzLmgJKHdvcmtpbmcgY29weSkKQEAgLTAsMCAr
MSwxMDMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTUgQXBwbGUgSW5jLiBBbGwgcmlnaHRz
IHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBi
aW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0
dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0Ogor
ICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92
ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRo
ZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkg
Zm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRo
aXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhl
CisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0
aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkg
QVBQTEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJB
TlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FS
UkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgor
ICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4g
T1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJ
TkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFH
RVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VC
U1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9G
SVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkg
VEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFC
SUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFS
SVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZF
TiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKwor
I2lmbmRlZiBCM0Jhc2ljQmxvY2tVdGlsc19oCisjZGVmaW5lIEIzQmFzaWNCbG9ja1V0aWxzX2gK
KworI2luY2x1ZGUgIkIzSW5kZXhTZXQuaCIKKyNpbmNsdWRlIDx3dGYvR3JhcGhOb2RlV29ya2xp
c3QuaD4KKyNpbmNsdWRlIDx3dGYvVmVjdG9yLmg+CisKK25hbWVzcGFjZSBKU0MgeyBuYW1lc3Bh
Y2UgQjMgeworCit0ZW1wbGF0ZTx0eXBlbmFtZSBCYXNpY0Jsb2NrPgorYm9vbCBhZGRQcmVkZWNl
c3NvcihCYXNpY0Jsb2NrKiBibG9jaywgQmFzaWNCbG9jayogcHJlZGVjZXNzb3IpCit7CisgICAg
QmFzaWNCbG9jazo6QWRqYWNlbmN5TGlzdCYgcHJlZGVjZXNzb3JzID0gYmxvY2stPnByZWRlY2Vz
c29ycygpOworCisgICAgaWYgKHByZWRlY2Vzc29ycy5jb250YWlucyhwcmVkZWNlc3NvcikpCisg
ICAgICAgIHJldHVybiBmYWxzZTsKKworICAgIHByZWRlY2Vzc29ycy5hcHBlbmQocHJlZGVjZXNz
b3IpOworICAgIHJldHVybiB0cnVlOworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBCYXNpY0Jsb2Nr
PgorYm9vbCByZW1vdmVQcmVkZWNlc3NvcihCYXNpY0Jsb2NrKiBibG9jaywgQmFzaWNCbG9jayAq
cHJlZGVjZXNzb3IpCit7CisgICAgQmFzaWNCbG9jazo6QWRqYWNlbmN5TGlzdCYgcHJlZGVjZXNz
b3JzID0gYmxvY2stPnByZWRlY2Vzc29ycygpOworICAgIGJvb2wgcmVzdWx0ID0gZmFsc2U7Cisg
ICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IHByZWRlY2Vzc29ycy5zaXplKCk7ICsraSkgewor
ICAgICAgICBpZiAocHJlZGVjZXNzb3JzW2ldID09IHByZWRlY2Vzc29yKSB7CisgICAgICAgICAg
ICBwcmVkZWNlc3NvcnNbaS0tXSA9IHByZWRlY2Vzc29ycy5sYXN0KCk7CisgICAgICAgICAgICBw
cmVkZWNlc3NvcnMucmVtb3ZlTGFzdCgpOworICAgICAgICAgICAgcmVzdWx0ID0gdHJ1ZTsKKyAg
ICAgICAgICAgIC8vIE91dCBvZiBjYXV0aW9uLCB3ZSBrZWVwIGdvaW5nIGV2ZW4gdGhvdWdoIHRo
ZSBwcmVkZWNlc3NvciBsaXN0IGNhbm5vdCBoYXZlCisgICAgICAgICAgICAvLyBkdXBsaWNhdGVz
LgorICAgICAgICB9CisgICAgfQorICAgIHJldHVybiByZXN1bHQ7Cit9CisKK3RlbXBsYXRlPHR5
cGVuYW1lIEJhc2ljQmxvY2s+Citib29sIHJlcGxhY2VQcmVkZWNlc3NvcihCYXNpY0Jsb2NrKiBi
bG9jaywgQmFzaWNCbG9jayogZnJvbSwgQmFzaWNCbG9jayogdG8pCit7CisgICAgQmFzaWNCbG9j
azo6QWRqYWNlbmN5TGlzdCYgcHJlZGVjZXNzb3JzID0gYmxvY2stPnByZWRlY2Vzc29ycygpOwor
ICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBwcmVkZWNlc3NvcnMuc2l6ZSgpOyArK2kpIHsK
KyAgICAgICAgaWYgKHByZWRlY2Vzc29yc1tpXSA9PSBmcm9tKSB7CisgICAgICAgICAgICBwcmVk
ZWNlc3NvcnNbaV0gPSB0bzsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9Cisg
ICAgfQorICAgIHJldHVybiBmYWxzZTsKK30KKworLy8gVGhpcyByZWNvbXB1dGVzIHByZWRlY2Vz
c29ycyBhbmQgcmVtb3ZlcyBibG9ja3MgdGhhdCBhcmVuJ3QgcmVhY2hhYmxlLgordGVtcGxhdGU8
dHlwZW5hbWUgQmFzaWNCbG9jaz4KK3ZvaWQgcmVzZXRSZWFjaGFiaWxpdHkoVmVjdG9yPHN0ZDo6
dW5pcXVlX3B0cjxCYXNpY0Jsb2NrPj4mIGJsb2NrcykKK3sKKyAgICAvLyBDbGVhciBhbGwgcHJl
ZGVjZXNzb3IgbGlzdHMgZmlyc3QuCisgICAgZm9yIChCYXNpY0Jsb2NrKiBibG9jayA6IGJsb2Nr
cykKKyAgICAgICAgYmxvY2stPnByZWRlY2Vzc29ycygpLnJlc2l6ZSgwKTsKKworICAgIEdyYXBo
Tm9kZVdvcmtsaXN0PEJhc2ljQm9jayosIEluZGV4U2V0PEJhc2ljQmxvY2s+PiB3b3JrbGlzdDsK
KyAgICB3b3JrbGlzdC5ub2RlKGJsb2Nrc1swXSk7CisgICAgd2hpbGUgKEJhc2ljQmxvY2sqIGJs
b2NrID0gd29ya2xpc3QucG9wKCkpIHsKKyAgICAgICAgZm9yIChCYXNpY0Jsb2NrKiBzdWNjZXNz
b3IgOiBibG9jay0+c3VjY2Vzc29ycygpKSB7CisgICAgICAgICAgICBpZiAod29ya2xpc3QuYWRk
KHN1Y2Nlc3NvcikpCisgICAgICAgICAgICAgICAgc3VjY2Vzc29yLT5wcmVkZWNlc3NvcnMoKS5h
cHBlbmQoYmxvY2spOworICAgICAgICB9CisgICAgfQorCisgICAgZm9yICh1bnNpZ25lZCBpID0g
MTsgaSA8IGJsb2Nrcy5zaXplKCk7ICsraSkgeworICAgICAgICBpZiAoYmxvY2tzW2ldLnByZWRl
Y2Vzc29ycy5pc0VtcHR5KCkpCisgICAgICAgICAgICBibG9ja3NbaV0gPSBudWxscHRyOworICAg
IH0KK30KKworfSB9IC8vIG5hbWVzcGFjZSBKU0M6OkIzCisKKyNlbmRpZiAvLyBCM0Jhc2ljQmxv
Y2tVdGlsc19oCisKSW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM0Jsb2NrV29ya2xp
c3QuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNCbG9ja1dvcmts
aXN0LmgJKHJldmlzaW9uIDApCisrKyBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNCbG9ja1dv
cmtsaXN0LmgJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSw1OCBAQAorLyoKKyAqIENvcHlyaWdo
dCAoQykgMjAxNSBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0
cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRo
b3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9s
bG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Yg
c291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNl
LCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgor
ICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBh
Ym92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5k
IHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5k
L29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgor
ICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIGBgQVMgSVMnJyBBTkQg
QU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9U
IExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElU
WSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVE
LiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJ
QUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBF
WEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJ
TUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VT
OyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQ
VElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwg
V0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xV
RElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBU
SEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJ
QklMSVRZIE9GIFNVQ0ggREFNQUdFLiAKKyAqLworCisjaWZuZGVmIEIzQmxvY2tXb3JrbGlzdF9o
CisjZGVmaW5lIEIzQmxvY2tXb3JrbGlzdF9oCisKKyNpbmNsdWRlICJCM0Jhc2ljQmxvY2suaCIK
KyNpbmNsdWRlICJCM0luZGV4U2V0LmgiCisjaW5jbHVkZSA8d3RmL0dyYXBoTm9kZVdvcmtsaXN0
Lmg+CisjaW5jbHVkZSA8d3RmL1ZlY3Rvci5oPgorCituYW1lc3BhY2UgSlNDIHsgbmFtZXNwYWNl
IEIzIHsKKworc3RydWN0IEJhc2ljQmxvY2s7CisKK3R5cGVkZWYgR3JhcGhOb2RlV29ya2xpc3Q8
QmFzaWNCbG9jayosIEluZGV4U2V0PEJhc2ljQmxvY2s+PiBCbG9ja1dvcmtsaXN0OworCisvLyBX
aGVuIHlvdSBzYXkgQmxvY2tXaXRoPGludD4geW91IHNob3VsZCByZWFkIGl0IGFzICJibG9jayB3
aXRoIGFuIGludCIuCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPiB1c2luZyBCbG9ja1dpdGggPSBHcmFw
aE5vZGVXaXRoPEJhc2ljQmxvY2sqLCBUPjsKKworLy8gRXh0ZW5kZWQgYmxvY2sgd29ya2xpc3Qg
aXMgdXNlZnVsIGZvciBlbnF1ZXVlaW5nIHNvbWUgbWV0YS1kYXRhIGFsb25nIHdpdGggdGhlIGJs
b2NrLiBJdCBhbHNvCisvLyBwZXJtaXRzIGZvcmNpYmx5IGVucXVldWVpbmcgdGhpbmdzIGV2ZW4g
aWYgdGhlIGJsb2NrIGhhcyBhbHJlYWR5IGJlZW4gc2Vlbi4gSXQncyB1c2VmdWwgZm9yCisvLyB0
aGluZ3MgbGlrZSBidWlsZGluZyBhIHNwYW5uaW5nIHRyZWUsIGluIHdoaWNoIGNhc2UgVCAodGhl
IGF1eGlsaWFyeSBwYXlsb2FkKSB3b3VsZCBiZSB0aGUKKy8vIHN1Y2Nlc3NvciBpbmRleC4KK3Rl
bXBsYXRlPHR5cGVuYW1lIFQ+IHVzaW5nIEV4dGVuZGVkQmxvY2tXb3JrbGlzdCA9IEV4dGVuZGVk
R3JhcGhOb2RlV29ya2xpc3Q8QmFzaWNCbG9jayosIFQsIEluZGV4U2V0PEJhc2ljQmxvY2s+PjsK
KwordHlwZWRlZiBHcmFwaFZpc2l0T3JkZXIgVmlzaXRPcmRlcjsKKwordHlwZWRlZiBHcmFwaE5v
ZGVXaXRoT3JkZXI8QmFzaWNCbG9jayo+IEJsb2NrV2l0aE9yZGVyOworCit0eXBlZGVmIFBvc3RP
cmRlckdyYXBoTm9kZVdvcmtsaXN0PEJhc2ljQmxvY2sqLCBJbmRleFNldDxCYXNpY0Jsb2NrPj4g
UG9zdE9yZGVyQmxvY2tXb3JrbGlzdDsKKworfSB9IC8vIG5hbWVzcGFjZSBKU0M6OkIzCisKKyNl
bmRpZiAvLyBCM0Jsb2NrV29ya2xpc3RfaAorCkluZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUv
YjMvQjNDaGVja1NwZWNpYWwuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29y
ZS9iMy9CM0NoZWNrU3BlY2lhbC5jcHAJKHJldmlzaW9uIDApCisrKyBTb3VyY2UvSmF2YVNjcmlw
dENvcmUvYjMvQjNDaGVja1NwZWNpYWwuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsMTQy
IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE1IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNl
cnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5
IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBw
cm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEu
IFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29w
eXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9s
bG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0g
bXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxp
c3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICog
ICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhl
IGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExF
IElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVT
LCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJ
RVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBV
UlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SCisg
KiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURF
TlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJ
TkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRV
VEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsg
T1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9S
WQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZ
LCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5H
IElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYg
QURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisKKyNpbmNs
dWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJCM0NoZWNrU3BlY2lhbC5oIgorCituYW1lc3BhY2Ug
SlNDIHsgbmFtZXNwYWNlIEIzIHsKKwordXNpbmcgbmFtZXNwYWNlIEFpcjsKKworbmFtZXNwYWNl
IHsKKwordW5zaWduZWQgbnVtQjNBcmdzKEluc3QmIGluc3QpCit7CisgICAgc3dpdGNoIChpbnN0
Lm9yaWdpbi0+b3Bjb2RlKCkpIHsKKyAgICBjYXNlIENoZWNrQWRkOgorICAgIGNhc2UgQ2hlY2tT
dWI6CisgICAgY2FzZSBDaGVja011bDoKKyAgICAgICAgcmV0dXJuIDI7CisgICAgY2FzZSBDaGVj
azoKKyAgICAgICAgcmV0dXJuIDE7CisgICAgZGVmYXVsdDoKKyAgICAgICAgUkVMRUFTRV9BU1NF
UlRfTk9UX1JFQUNIRUQoKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorfQorCit9IC8vIGFu
b255bW91cyBuYW1lc3BhY2UKKworQ2hlY2tTcGVjaWFsOjpDaGVja1NwZWNpYWwoQWlyOjpPcGNv
ZGUgb3Bjb2RlLCB1bnNpZ25lZCBudW1BcmdzKQorICAgIDogbV9jaGVja09wY29kZShvcGNvZGUp
CisgICAgLCBtX251bUNoZWNrQXJncyhudW1BcmdzKQoreworfQorCitDaGVja1NwZWNpYWw6On5D
aGVja1NwZWNpYWwoKQoreworfQorCitJbnN0IENoZWNrU3BlY2lhbDo6aGlkZGVuQnJhbmNoKGNv
bnN0IEluc3QmIGluc3QpIGNvbnN0Cit7CisgICAgSW5zdCBoaWRkZW5CcmFuY2gobV9jaGVja09w
Y29kZSwgaW5zdC5vcmlnaW4pOworICAgIGhpZGRlbkJyYW5jaC5hcmdzLnJlc2l6ZShtX251bUNo
ZWNrQXJncyk7CisgICAgZm9yICh1bnNpZ25lZCBpID0gbV9udW1DaGVja0FyZ3M7IGktLTspCisg
ICAgICAgIGhpZGRlbkJyYW5jaC5hcmdzW2ldID0gaW5zdC5hcmdzW2kgKyAxXTsKKyAgICByZXR1
cm4gaGlkZGVuQnJhbmNoOworfQorCit2b2lkIENoZWNrU3BlY2lhbDo6Zm9yRWFjaEFyZyhJbnN0
JiBpbnN0LCBjb25zdCBTY29wZWRMYW1iZGE8SW5zdDo6RWFjaEFyZ0NhbGxiYWNrPiYgY2FsbGJh
Y2spCit7CisgICAgaGlkZGVuQnJhbmNoKGluc3QpLmZvckVhY2hBcmcoY2FsbGJhY2spOworICAg
IGZvckVhY2hBcmdJbXBsKG51bUIzQXJncyhpbnN0KSwgbV9udW1DaGVja0FyZ3MgKyAxLCBpbnN0
LCBjYWxsYmFjayk7Cit9CisKK2Jvb2wgQ2hlY2tTcGVjaWFsOjppc1ZhbGlkKEluc3QmIGluc3Qp
Cit7CisgICAgcmV0dXJuIGhpZGRlbkJyYW5jaChpbnN0KS5pc1ZhbGlkKCkKKyAgICAgICAgJiYg
aXNWYWxpZEltcGwobnVtQjNBcmdzKGluc3QpLCBtX251bUNoZWNrQXJncyArIDEsIGluc3QpOwor
fQorCitib29sIENoZWNrU3BlY2lhbDo6YWRtaXRzU3RhY2soSW5zdCYgaW5zdCwgdW5zaWduZWQg
YXJnSW5kZXgpCit7CisgICAgaWYgKGFyZ0luZGV4ID49IDEgJiYgYXJnSW5kZXggPCAxICsgbV9u
dW1DaGVja0FyZ3MpCisgICAgICAgIHJldHVybiBoaWRkZW5CcmFuY2goaW5zdCkuYWRtaXRzU3Rh
Y2soYXJnSW5kZXggLSAxKTsKKyAgICByZXR1cm4gYWRtaXRzU3RhY2tJbXBsKG51bUIzQXJncyhp
bnN0KSwgbV9udW1DaGVja0FyZ3MgKyAxLCBpbnN0LCBhcmdJbmRleCk7Cit9CisKK0NDYWxsSGVs
cGVyczo6SnVtcCBDaGVja1NwZWNpYWw6OmdlbmVyYXRlKEluc3QmIGluc3QsIENDYWxsSGVscGVy
cyYgaml0LCBHZW5lcmF0aW9uQ29udGV4dCYgY29udGV4dCkKK3sKKyAgICBDQ2FsbEhlbHBlcnM6
Okp1bXAgZmFpbCA9IGhpZGRlbkJyYW5jaChpbnN0KS5nZW5lcmF0ZShqaXQsIGNvbnRleHQpOwor
ICAgIEFTU0VSVChmYWlsLmlzU2V0KCkpOworCisgICAgVmFsdWUqIHZhbHVlID0gaW5zdC5vcmln
aW47CisKKyAgICBWZWN0b3I8VmFsdWVSZXA+IHJlcHM7CisgICAgaWYgKGlzQ2hlY2tNYXRoKHZh
bHVlLT5vcGNvZGUoKSkpIHsKKyAgICAgICAgaWYgKHZhbHVlLT5vcGNvZGUoKSA9PSBDaGVja011
bCkKKyAgICAgICAgICAgIHJlcHMuYXBwZW5kKFZhbHVlUmVwKCkpOworICAgICAgICBlbHNlIGlm
ICh2YWx1ZS0+b3Bjb2RlKCkgPT0gQ2hlY2tTdWIgJiYgdmFsdWUtPmFyZ3NbMF0tPmlzSW50KDAp
KQorICAgICAgICAgICAgcmVwcy5hcHBlbmQoVmFsdWVSZXA6OmNvbnN0YW50KDApKTsKKyAgICAg
ICAgZWxzZQorICAgICAgICAgICAgcmVwcy5hcHBlbmQocmVwRm9yQXJnKGNvbnRleHQuY29kZSwg
aW5zdC5hcmdzWzJdKSk7CisgICAgICAgIHJlcHMuYXBwZW5kKHJlcEZvckFyZyhjb250ZXh0LmNv
ZGUsIGluc3QuYXJnc1sxXSkpOworICAgIH0gZWxzZSB7CisgICAgICAgIEFTU0VSVCh2YWx1ZS0+
b3Bjb2RlKCkgPT0gQ2hlY2spOworICAgICAgICByZXBzLmFwcGVuZChWYWx1ZVJlcDo6Y29uc3Rh
bnQoMSkpOworICAgIH0KKworICAgIGFwcGVuZFJlcHNJbXBsKGNvbnRleHQsIG1fbnVtQ2hlY2tB
cmdzICsgMSwgaW5zdCwgcmVwcyk7CisgICAgCisgICAgY29udGV4dC5sYXRlUGF0aHMuYXBwZW5k
KAorICAgICAgICBjcmVhdGVTaGFyZWRUYXNrPEdlbmVyYXRpb25Db250ZXh0OjpMYXRlUGF0aEZ1
bmN0aW9uPigKKyAgICAgICAgICAgIFs9XSAoQ0NhbGxIZWxwZXJzJiBqaXQsIEdlbmVyYXRpb25D
b250ZXh0JiBjb250ZXh0KSB7CisgICAgICAgICAgICAgICAgZmFpbC5saW5rKCZqaXQpOworICAg
ICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIFN0YWNrbWFwKiBzdGFja21hcCA9IHZhbHVl
LT5zdGFja21hcCgpOworICAgICAgICAgICAgICAgIEFTU0VSVChzdGFja21hcCk7CisKKyAgICAg
ICAgICAgICAgICBTdGFja21hcDo6R2VuZXJhdGlvblBhcmFtcyBwYXJhbXM7CisgICAgICAgICAg
ICAgICAgcGFyYW1zLnZhbHVlID0gdmFsdWU7CisgICAgICAgICAgICAgICAgcGFyYW1zLnN0YWNr
bWFwID0gc3RhY2ttYXA7CisgICAgICAgICAgICAgICAgcGFyYW1zLnJlcHMgPSByZXBzOworICAg
ICAgICAgICAgICAgIHBhcmFtcy51c2VkUmVnaXN0ZXJzID0gc3RhY2ttYXAtPm1fdXNlZFJlZ2lz
dGVyczsKKworICAgICAgICAgICAgICAgIHN0YWNrbWFwLT5tX2dlbmVyYXRvci0+cnVuKGppdCwg
cGFyYW1zKTsKKyAgICAgICAgICAgIH0pKTsKK30KKwordm9pZCBDaGVja1NwZWNpYWw6OmR1bXBJ
bXBsKFByaW50U3RyZWFtJiBvdXQpIGNvbnN0Cit7CisgICAgb3V0LnByaW50KG1fY2hlY2tPcGNv
ZGUsICIoIiwgbV9udW1DaGVja0FyZ3MsICIpIik7Cit9CisKK3ZvaWQgQ2hlY2tTcGVjaWFsOjpk
ZWVwRHVtcEltcGwoUHJpbnRTdHJlYW0mIG91dCkgY29uc3QKK3sKKyAgICBvdXQucHJpbnQoIkIz
OjpDaGVja1ZhbHVlIGxvd2VyZWQgdG8gIiwgbV9jaGVja09wY29kZSwgIiB3aXRoICIsIG1fbnVt
Q2hlY2tBcmdzLCAiIGFyZ3MuIik7Cit9CisKK30gfSAvLyBuYW1lc3BhY2UgSlNDOjpCMworCklu
ZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNDaGVja1NwZWNpYWwuaAo9PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNDaGVja1NwZWNpYWwuaAkocmV2aXNpb24g
MCkKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM0NoZWNrU3BlY2lhbC5oCSh3b3JraW5n
IGNvcHkpCkBAIC0wLDAgKzEsNzQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTUgQXBwbGUg
SW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2Ug
aW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0
aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25z
CisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3Qg
cmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNv
bmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0
aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Cisg
KiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRp
c2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlh
bHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUg
SVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBP
UiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUK
KyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9S
IEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNI
QUxMIEFQUExFIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJF
Q1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05T
RVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJP
Q1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERB
VEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FV
U0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJB
Q1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBP
UiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJ
UyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERB
TUFHRS4gCisgKi8KKworI2lmbmRlZiBCM0NoZWNrU3BlY2lhbF9oCisjZGVmaW5lIEIzQ2hlY2tT
cGVjaWFsX2gKKworI2luY2x1ZGUgIkFpck9wY29kZS5oIgorI2luY2x1ZGUgIkIzU3RhY2ttYXBT
cGVjaWFsLmgiCisKK25hbWVzcGFjZSBKU0MgeyBuYW1lc3BhY2UgQjMgeworCisvLyBXZSB3YW50
IHRvIGxvd2VyIENoZWNrIGluc3RydWN0aW9ucyB0byBhIGJyYW5jaCwgYnV0IHRoZW4gd2Ugd2Fu
dCB0byByb3V0ZSB0aGF0IGJyYW5jaCB0byBvdXIKKy8vIG91dC1vZi1saW5lIGNvZGUgaW5zdGVh
ZCBvZiBkb2luZyBhbnl0aGluZyBlbHNlLiBGb3IgdGhpcyByZWFzb24sIGEgQ2hlY2tTcGVjaWFs
IHdpbGwgcmVtZW1iZXIKKy8vIHdoaWNoIGJyYW5jaCBvcGNvZGUgd2UgaGF2ZSBzZWxlY3RlZCBh
bG9uZyB3aXRoIHRoZSBudW1iZXIgb2YgYXJncyBpbiB0aGUgb3ZlcmxvYWQgd2Ugd2FudC4gSXQK
Ky8vIHdpbGwgY3JlYXRlIGFuIEluc3Qgd2l0aCB0aGF0IG9wY29kZSBwbHVzIHRoZSBhcHByb3By
aWF0ZSBhcmdzIGZyb20gdGhlIG93bmluZyBJbnN0IHdoZW5ldmVyIHlvdQorLy8gY2FsbCBhbnkg
b2YgdGhlIGNhbGxiYWNrcy4KKy8vCisvLyBOb3RlIHRoYXQgZm9yIENoZWNrQWRkLCBDaGVja1N1
YiwgYW5kIENoZWNrTXVsIHdlIGV4cGVjdCB0aGF0IHRoZSBCMyBhcmd1bWVudHMgYXJlIHRoZSBy
ZXZlcnNlCisvLyBvZiB0aGUgQWlyIGFyZ3VtZW50cyAoQWRkKGEsIGIpID0+IEFkZDMyIGIsIGEp
LiBFeGNlcHQ6CisvLyAtIENoZWNrU3ViKDAsIHgpLCB3aGljaCB0dXJucyBpbnRvIEJyYW5jaE5l
ZzMyIHguCisvLyAtIENoZWNrTXVsKGEsIGIpLCB3aGljaCB0dXJucyBpbnRvIE11bDMyIGIsIGEg
YnV0IHdlIHBhc3MgQW55IGZvciBhJ3MgVmFsdWVSZXAuCisKK2NsYXNzIENoZWNrU3BlY2lhbCA6
IHB1YmxpYyBTdGFja21hcFNwZWNpYWwgeworcHVibGljOgorICAgIENoZWNrU3BlY2lhbChBaXI6
Ok9wY29kZSBvcGNvZGUsIHVuc2lnbmVkIG51bUFyZ3MpOworICAgIH5DaGVja1NwZWNpYWwoKTsK
KworICAgIC8vIENvbnN0cnVjdHMgYW5kIHJldHVybnMgdGhlIEluc3QgcmVwcmVzZW50aW5nIHRo
ZSBicmFuY2ggdGhhdCB0aGlzIHdpbGwgdXNlLgorICAgIEluc3QgaGlkZGVuQnJhbmNoKGNvbnN0
IEluc3QmKSBjb25zdDsKKworcHJvdGVjdGVkOgorICAgIHZvaWQgZm9yRWFjaEFyZyhBaXI6Oklu
c3QmLCBjb25zdCBTY29wZWRMYW1iZGE8QWlyOjpJbnN0OjpFYWNoQXJnQ2FsbGJhY2s+Jikgb3Zl
cnJpZGU7CisgICAgYm9vbCBpc1ZhbGlkKEFpcjo6SW5zdCYpIG92ZXJyaWRlOworICAgIGJvb2wg
YWRtaXRzU3RhY2soQWlyOjpJbnN0JiwgdW5zaWduZWQgYXJnSW5kZXgpIG92ZXJyaWRlOworCisg
ICAgLy8gTk9URTogdGhlIGdlbmVyYXRlIG1ldGhvZCB3aWxsIGdlbmVyYXRlIHRoZSBoaWRkZW4g
YnJhbmNoIGFuZCB0aGVuIHJlZ2lzdGVyIGEgTGF0ZVBhdGggdGhhdAorICAgIC8vIGdlbmVyYXRl
cyB0aGUgc3RhY2ttYXAuIFN1cGVyIGNyYXp5IGR1ZGUhCisKKyAgICBDQ2FsbEhlbHBlcnM6Okp1
bXAgZ2VuZXJhdGUoSW5zdCYsIENDYWxsSGVsZXBycyYsIEdlbmVyYXRpb25Db250ZXh0Jikgb3Zl
cnJpZGU7CisKKyAgICB2b2lkIGR1bXBJbXBsKFByaW50U3RyZWFtJikgY29uc3Qgb3ZlcnJpZGU7
CisgICAgdm9pZCBkZWVwRHVtcEltcGwoUHJpbnRTdHJlYW0mKSBjb25zdCBvdmVycmlkZTsKKwor
cHJpdmF0ZToKKyAgICBBaXI6Ok9wY29kZSBtX2NoZWNrT3Bjb2RlOworICAgIHVuc2lnbmVkIG1f
bnVtQ2hlY2tBcmdzOworfTsKKworfSB9IC8vIG5hbWVzcGFjZSBKU0M6OkIzCisKKyNlbmRpZiAv
LyBCM0NoZWNrU3BlY2lhbF9oCisKSW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM0No
ZWNrVmFsdWUuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM0No
ZWNrVmFsdWUuY3BwCShyZXZpc2lvbiAwKQorKysgU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0Iz
Q2hlY2tWYWx1ZS5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSw0MSBAQAorLyoKKyAqIENv
cHlyaWdodCAoQykgMjAxNSBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICog
UmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBv
ciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0
aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlv
bnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAg
bm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFp
bWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNl
IHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlv
bnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRp
b24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24u
CisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIGBgQVMgSVMn
JyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBC
VVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5U
QUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVND
TEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUgorICogQ09OVFJJQlVUT1JT
IEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUws
CisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQg
Tk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNF
UlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElO
VEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJ
TElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICog
KElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9V
VCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhF
IFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLiAKKyAqLworCisjaW5jbHVkZSAiY29uZmlnLmgi
CisjaW5jbHVkZSAiQjNDaGVja1ZhbHVlLmgiCisKK25hbWVzcGFjZSBKU0MgeyBuYW1lc3BhY2Ug
QjMgeworCitDaGVja1ZhbHVlOjp+Q2hlY2tWYWx1ZSgpCit7Cit9CisKK3ZvaWQgQ2hlY2tWYWx1
ZTo6ZHVtcE1ldGEoUHJpbnRTdHJlYW0mIG91dCkgY29uc3QKK3sKKyAgICBvdXQucHJpbnQoInN0
YWNrbWFwID0gIiwgc3RhY2ttYXApOworfQorCit9IH0gLy8gbmFtZXNwYWNlIEpTQzo6QjMKKwpJ
bmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzQ2hlY2tWYWx1ZS5oCj09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0K
LS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM0NoZWNrVmFsdWUuaAkocmV2aXNpb24gMCkK
KysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM0NoZWNrVmFsdWUuaAkod29ya2luZyBjb3B5
KQpAQCAtMCwwICsxLDgwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE1IEFwcGxlIEluYy4g
QWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNv
dXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwg
YXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICog
YXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFp
biB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRp
b25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMg
aW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAg
bm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFp
bWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHBy
b3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBS
T1ZJREVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1Q
TElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJ
TVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBB
UlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBB
UFBMRSBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJ
TkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVO
VElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVN
RU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBP
UgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBB
TkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBT
VFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RI
RVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09G
VFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0Uu
IAorICovCisKKyNpZm5kZWYgQjNDaGVja1ZhbHVlX2gKKyNkZWZpbmUgQjNDaGVja1ZhbHVlX2gK
KworI2luY2x1ZGUgIkIzVmFsdWUuaCIKKyNpbmNsdWRlICJCM1N0YWNrbWFwLmgiCisKK25hbWVz
cGFjZSBKU0MgeyBuYW1lc3BhY2UgQjMgeworCitjbGFzcyBDaGVja1ZhbHVlIDogcHVibGljIENo
ZWNrIHsKK3B1YmxpYzoKKyAgICBzdGF0aWMgYm9vbCBhY2NlcHRzKE9wY29kZSBvcGNvZGUpCisg
ICAgeworICAgICAgICBzd2l0Y2ggKG9wY29kZSkgeworICAgICAgICBjYXNlIENoZWNrQWRkOgor
ICAgICAgICBjYXNlIENoZWNrU3ViOgorICAgICAgICBjYXNlIENoZWNrTXVsOgorICAgICAgICBj
YXNlIENoZWNrOgorICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIGRlZmF1bHQ6Cisg
ICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICB+Q2hlY2tW
YWx1ZSgpOworCisgICAgU3RhY2ttYXAgc3RhY2ttYXA7CisKK3Byb3RlY3RlZDoKKyAgICB2b2lk
IGR1bXBNZXRhKFByaW50U3RyZWFtJikgY29uc3Qgb3ZlcnJpZGU7CisKK3ByaXZhdGU6CisgICAg
ZnJpZW5kIGNsYXNzIFByb2NlZHVyZTsKKworICAgIC8vIFVzZSB0aGlzIGZvcm0gZm9yIENoZWNr
QWRkLCBDaGVja1N1YiwgYW5kIENoZWNrTXVsLgorICAgIENoZWNrVmFsdWUodW5zaWduZWQgaW5k
ZXgsIE9wY29kZSBvcGNvZGUsIE9yaWdpbiBvcmlnaW4sIFZhbHVlKiBsZWZ0LCBWYWx1ZSogcmln
aHQpCisgICAgICAgIDogVmFsdWUoaW5kZXgsIG9wY29kZSwgbGVmdC0+dHlwZSgpLCBvcmlnaW4s
IGxlZnQsIHJpZ2h0KQorICAgIHsKKyAgICAgICAgQVNTRVJUKGlzSW50KHR5cGUoKSkpOworICAg
ICAgICBBU1NFUlQobGVmdC0+dHlwZSgpID09IHJpZ2h0LT50eXBlKCkpOworICAgICAgICBBU1NF
UlQob3Bjb2RlID09IENoZWNrQWRkIHx8IG9wY29kZSA9PSBDaGVja1N1YiB8fCBvcGNvZGUgPT0g
Q2hlY2tNdWwpOworICAgIH0KKworICAgIC8vIFVzZSB0aGlzIGZvcm0gZm9yIENoZWNrLgorICAg
IENoZWNrVmFsdWUodW5zaWduZWQgaW5kZXgsIE9wY29kZSBvcGNvZGUsIE9yaWdpbiBvcmlnaW4s
IFZhbHVlKiBwcmVkaWNhdGUpCisgICAgICAgIDogVmFsdWUoaW5kZXgsIG9wY29kZSwgVm9pZCwg
b3JpZ2luLCBwcmVkaWNhdGUpCisgICAgeworICAgICAgICBBU1NFUlQob3BjZGUgPT0gQ2hlY2sp
OworICAgIH0KK307CisKK30gfSAvLyBuYW1lc3BhY2UgSlNDOjpCMworCisjZW5kaWYgLy8gQjND
aGVja1ZhbHVlX2gKKworCkluZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNDb21tb24u
Y3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM0NvbW1vbi5jcHAJ
KHJldmlzaW9uIDApCisrKyBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNDb21tb24uY3BwCSh3
b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsNjEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTUg
QXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFu
ZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9k
aWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25k
aXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2Rl
IG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0
IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlz
dHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJp
Z2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93
aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBt
YXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09G
VFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQ
UkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRP
LCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5F
U1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVW
RU5UIFNIQUxMIEFQUExFIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFO
WSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBP
UiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAor
ICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBV
U0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VW
RVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4g
Q09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElH
RU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICog
T0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBT
VUNIIERBTUFHRS4gCisgKi8KKworI2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgIkIzQ29t
bW9uLmgiCisKKyNpbmNsdWRlICJERkdDb21tb24uaCIKKyNpbmNsdWRlICJGVExTdGF0ZS5oIgor
I2luY2x1ZGUgIk9wdGlvbnMuaCIKKworbmFtZXNwYWNlIEpTQyB7IG5hbWVzcGFjZSBCMyB7CisK
K2Jvb2wgc2hvdWxkRHVtcElSKCkKK3sKKyAgICByZXR1cm4gRlRMOjp2ZXJib3NlQ29tcGlsYXRp
b25FbmFibGVkKCkgfHwgRlRMOjpzaG91bGREdW1wRGlzYXNzZW1ibHkoKSB8fCBzaG91bGREdW1w
SVJBdEVhY2hQaGFzZSgpOworfQorCitib29sIHNob3VsZER1bXBJUkF0RWFjaFBoYXNlKCkKK3sK
KyAgICByZXR1cm4gT3B0aW9uczo6ZHVtcEdyYXBoQXRFYWNoUGhhc2UoKTsKK30KKworYm9vbCBz
aG91bGRWYWxpZGF0ZUlSKCkKK3sKKyAgICByZXR1cm4gREZHOjp2YWxpZGF0aW9uRW5hYmxlZCgp
IHx8IHNob3VsZFZhbGlkYXRlSVJBdEVhY2hQaGFzZSgpOworfQorCitib29sIHNob3VsZFZhbGlk
YXRlSVJBdEVhY2hQaGFzZSgpCit7CisgICAgcmV0dXJuIE9wdGlvbnM6OnZhbGlkYXRlR3JhcGhB
dEVhY2hQaGFzZSgpOworfQorCitib29sIHNob3VsZFNhdmVJUkJlZm9yZVBoYXNlKCkKK3sKKyAg
ICByZXR1cm4gT3B0aW9uczo6dmVyYm9zZVZhbGlkYXRpb25GYWlsdXJlKCk7Cit9CisKK30gfSAv
LyBuYW1lc3BhY2UgSlNDOjpCMworCkluZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjND
b21tb24uaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNDb21tb24u
aAkocmV2aXNpb24gMCkKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM0NvbW1vbi5oCSh3
b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsNDAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTUg
QXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFu
ZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9k
aWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25k
aXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2Rl
IG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0
IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlz
dHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJp
Z2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93
aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBt
YXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09G
VFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQ
UkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRP
LCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5F
U1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVW
RU5UIFNIQUxMIEFQUExFIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFO
WSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBP
UiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAor
ICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBV
U0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VW
RVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4g
Q09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElH
RU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICog
T0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBT
VUNIIERBTUFHRS4gCisgKi8KKworI2lmbmRlZiBCM0NvbW1vbl9oCisjZGVmaW5lIEIzQ29tbW9u
X2gKKworbmFtZXNwYWNlIEpTQyB7IG5hbWVzcGFjZSBCMyB7CisKK2Jvb2wgc2hvdWxkRHVtcElS
KCk7Citib29sIHNob3VsZER1bXBJUkF0RWFjaFBoYXNlKCk7Citib29sIHNob3VsZFZhbGlkYXRl
SVIoKTsKK2Jvb2wgc2hvdWxkVmFsaWRhdGVJUkF0RWFjaFBoYXNlKCk7Citib29sIHNob3VsZFNh
dmVJUkJlZm9yZVBoYXNlKCk7CisKK30gfSAvLyBuYW1lc3BhY2UgSlNDOjpCMworCisjZW5kaWYg
Ly8gQjNDb21tb25faAorCkluZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNDb21wYXJp
c29uTWF0Y2hlci5wYXR0ZXJucwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUv
YjMvQjNDb21wYXJpc29uTWF0Y2hlci5wYXR0ZXJucwkocmV2aXNpb24gMCkKKysrIFNvdXJjZS9K
YXZhU2NyaXB0Q29yZS9iMy9CM0NvbXBhcmlzb25NYXRjaGVyLnBhdHRlcm5zCSh3b3JraW5nIGNv
cHkpCkBAIC0wLDAgKzEsMzggQEAKKyMgQ29weXJpZ2h0IChDKSAyMDE1IEFwcGxlIEluYy4gQWxs
IHJpZ2h0cyByZXNlcnZlZC4KKyMKKyMgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2Ug
YW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisjIG1vZGlmaWNhdGlvbiwgYXJlIHBl
cm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworIyBhcmUgbWV0
OgorIyAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFi
b3ZlIGNvcHlyaWdodAorIyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0
aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisjIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkg
Zm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisjICAgIG5vdGljZSwgdGhp
cyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUK
KyMgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGgg
dGhlIGRpc3RyaWJ1dGlvbi4KKyMKKyMgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBM
RSBJTkMuIEFORCBJVFMgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJworIyBBTkQgQU5ZIEVYUFJFU1Mg
T1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyMg
VEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9S
IEEgUEFSVElDVUxBUgorIyBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFM
TCBBUFBMRSBJTkMuIE9SIElUUyBDT05UUklCVVRPUlMKKyMgQkUgTElBQkxFIEZPUiBBTlkgRElS
RUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgorIyBDT05T
RVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJF
TUVOVCBPRgorIyBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFU
QSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MKKyMgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNF
RCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KKyMgQ09OVFJBQ1Qs
IFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVS
V0lTRSkKKyMgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdB
UkUsIEVWRU4gSUYgQURWSVNFRCBPRgorIyBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0Uu
CisKK21hdGNoZXIgQ29tcGFyaXNvbk1hdGNoZXIKKworVGVzdExvYWROb3RaZXJvMSA9IEFuZChM
b2FkKGFkZHJlc3MpLCByaWdodCkKK1Rlc3RMb2FkTm90WmVybzIgPSBBbmQobGVmdCwgTG9hZChh
ZGRyZXNzKSkKK1Rlc3ROb3RaZXJvID0gQW5kKGxlZnQsIHJpZ2h0KQorCitUZXN0TG9hZFplcm8x
ID0gRXF1YWwoQW5kKExvYWQoYWRkcmVzcyksIHJpZ2h0KSwgJDApCitUZXN0TG9hZFplcm8yID0g
RXF1YWwoQW5kKGxlZnQsIExvYWQoYWRkcmVzcykpLCAkMCkKK1Rlc3RaZXJvID0gRXF1YWwoQW5k
KGxlZnQsIHJpZ2h0KSwgJDApCisKK0xvYWRFcXVhbDEgPSBFcXVhbChMb2FkKGFkZHJlc3MpLCBy
aWdodCkKK0xvYWRFcXVhbDIgPSBFcXVhbChsZWZ0LCBMb2FkKGFkZHJlc3MpKQorTm90ID0gRXF1
YWwodmFsdWUsICQwKQorRXF1YWwgPSBFcXVhbChsZWZ0LCByaWdodCkKKwpJbmRleDogU291cmNl
L0phdmFTY3JpcHRDb3JlL2IzL0IzQ29uc3QzMlZhbHVlLmNwcAo9PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3Vy
Y2UvSmF2YVNjcmlwdENvcmUvYjMvQjNDb25zdDMyVmFsdWUuY3BwCShyZXZpc2lvbiAwKQorKysg
U291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzQ29uc3QzMlZhbHVlLmNwcAkod29ya2luZyBjb3B5
KQpAQCAtMCwwICsxLDQxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE1IEFwcGxlIEluYy4g
QWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNv
dXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwg
YXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICog
YXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFp
biB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRp
b25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMg
aW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAg
bm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFp
bWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHBy
b3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBS
T1ZJREVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1Q
TElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJ
TVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBB
UlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBB
UFBMRSBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJ
TkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVO
VElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVN
RU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBP
UgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBB
TkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBT
VFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RI
RVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09G
VFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0Uu
IAorICovCisKKyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJCM0NvbnN0MzJWYWx1ZS5o
IgorCituYW1lc3BhY2UgSlNDIHsgbmFtZXNwYWNlIEIzIHsKKworQ29uc3QzMlZhbHVlOjp+Q29u
c3QzMlZhbHVlKCkKK3sKK30KKwordm9pZCBDb25zdDMyVmFsdWU6OmR1bXBNZXRhKFByaW50U3Ry
ZWFtJiBvdXQpIGNvbnN0Cit7CisgICAgb3V0LnByaW50KG1fdmFsdWUpOworfQorCit9IH0gLy8g
bmFtZXNwYWNlIEpTQzo6QjMKKwpJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzQ29u
c3QzMlZhbHVlLmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzQ29u
c3QzMlZhbHVlLmgJKHJldmlzaW9uIDApCisrKyBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjND
b25zdDMyVmFsdWUuaAkod29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDU5IEBACisvKgorICogQ29w
eXJpZ2h0IChDKSAyMDE1IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBS
ZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9y
IHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRo
ZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9u
cyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBu
b3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWlt
ZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2Ug
dGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9u
cyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlv
biBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4K
KyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycn
IEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJV
VCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRB
QklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NM
QUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMg
QkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwK
KyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBO
T1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VS
VklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5U
RVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklM
SVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAo
SU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VU
IE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUg
UE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisKKyNpZm5kZWYgQjNDb25zdDMyVmFs
dWVfaAorI2RlZmluZSBCM0NvbnN0MzJWYWx1ZV9oCisKKyNpbmNsdWRlICJCM1ZhbHVlLmgiCisK
K25hbWVzcGFjZSBKU0MgeyBuYW1lc3BhY2UgQjMgeworCitjbGFzcyBDb25zdDMyVmFsdWUgOiBw
dWJsaWMgVmFsdWUgeworcHVibGljOgorICAgIHN0YXRpYyBib29sIGFjY2VwdHMoT3Bjb2RlIG9w
Y29kZSkgeyByZXR1cm4gb3Bjb2RlID09IENvbnN0MzI7IH0KKyAgICAKKyAgICB+Q29uc3QzMlZh
bHVlKCk7CisgICAgCisgICAgaW50MzJfdCB2YWx1ZSgpIGNvbnN0IHsgcmV0dXJuIG1fdmFsdWU7
IH0KKworcHJvdGVjdGVkOgorICAgIHZvaWQgZHVtcE1ldGEoUHJpbnRTdHJlYW0mKSBjb25zdCBv
dmVycmlkZTsKKworcHJpdmF0ZToKKyAgICBmcmllbmQgY2xhc3MgUHJvY2VkdXJlOworCisgICAg
Q29uc3QzMlZhbHVlKHVuc2lnbmVkIGluZGV4LCBPcmlnaW4gb3JpZ2luLCBpbnQzMl90IHZhbHVl
KQorICAgICAgICA6IFZhbHVlKGluZGV4LCBDb25zdDMyLCBJbnQzMiwgb3JpZ2luKQorICAgICAg
ICAsIG1fdmFsdWUodmFsdWUpCisgICAgeworICAgIH0KKyAgICAKKyAgICBpbnQzMl90IG1fdmFs
dWU7Cit9OworCit9IH0gLy8gbmFtZXNwYWNlIEpTQzo6QjMKKworI2VuZGlmIC8vIEIzQ29uc3Qz
MlZhbHVlX2gKKwpJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzQ29uc3Q2NFZhbHVl
LmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNDb25zdDY0VmFs
dWUuY3BwCShyZXZpc2lvbiAwKQorKysgU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzQ29uc3Q2
NFZhbHVlLmNwcAkod29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDQxIEBACisvKgorICogQ29weXJp
Z2h0IChDKSAyMDE1IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRp
c3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdp
dGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBm
b2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBv
ZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3Rp
Y2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIu
CisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhl
IGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBh
bmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBh
bmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAq
CisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFO
RCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBO
T1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklM
SVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlN
RUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUg
TElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAq
IEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1Qg
TElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklD
RVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJS
VVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZ
LCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5D
TFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9G
IFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9T
U0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisKKyNpbmNsdWRlICJjb25maWcuaCIKKyNp
bmNsdWRlICJCM0NvbnN0NjRWYWx1ZS5oIgorCituYW1lc3BhY2UgSlNDIHsgbmFtZXNwYWNlIEIz
IHsKKworQ29uc3Q2NFZhbHVlOjp+Q29uc3Q2NFZhbHVlKCkKK3sKK30KKwordm9pZCBDb25zdDY0
VmFsdWU6OmR1bXBNZXRhKFByaW50U3RyZWFtJiBvdXQpIGNvbnN0Cit7CisgICAgb3V0LnByaW50
KG1fdmFsdWUpOworfQorCit9IH0gLy8gbmFtZXNwYWNlIEpTQzo6QjMKKwpJbmRleDogU291cmNl
L0phdmFTY3JpcHRDb3JlL2IzL0IzQ29uc3Q2NFZhbHVlLmgKPT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNl
L0phdmFTY3JpcHRDb3JlL2IzL0IzQ29uc3Q2NFZhbHVlLmgJKHJldmlzaW9uIDApCisrKyBTb3Vy
Y2UvSmF2YVNjcmlwdENvcmUvYjMvQjNDb25zdDY0VmFsdWUuaAkod29ya2luZyBjb3B5KQpAQCAt
MCwwICsxLDU5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE1IEFwcGxlIEluYy4gQWxsIHJp
Z2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBh
bmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBl
cm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1l
dDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUg
YWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFu
ZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmlu
YXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNl
LCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGlu
IHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVk
IHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVE
IEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBX
QVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVE
IFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VM
QVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJ
TkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVD
VCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBE
QU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9G
IFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICog
UFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04g
QU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1Qg
TElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNF
KSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUs
IEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICov
CisKKyNpZm5kZWYgQjNDb25zdDY0VmFsdWVfaAorI2RlZmluZSBCM0NvbnN0NjRWYWx1ZV9oCisK
KyNpbmNsdWRlICJCM1ZhbHVlLmgiCisKK25hbWVzcGFjZSBKU0MgeyBuYW1lc3BhY2UgQjMgewor
CitjbGFzcyBDb25zdDY0VmFsdWUgOiBwdWJsaWMgVmFsdWUgeworcHVibGljOgorICAgIHN0YXRp
YyBib29sIGFjY2VwdHMoT3Bjb2RlIG9wY29kZSkgeyByZXR1cm4gb3Bjb2RlID09IENvbnN0NjQ7
IH0KKyAgICAKKyAgICB+Q29uc3Q2NFZhbHVlKCk7CisgICAgCisgICAgaW50NjRfdCB2YWx1ZSgp
IGNvbnN0IHsgcmV0dXJuIG1fdmFsdWU7IH0KKworcHJvdGVjdGVkOgorICAgIHZvaWQgZHVtcE1l
dGEoUHJpbnRTdHJlYW0mKSBjb25zdCBvdmVycmlkZTsKKworcHJpdmF0ZToKKyAgICBmcmllbmQg
Y2xhc3MgUHJvY2VkdXJlOworCisgICAgQ29uc3Q2NFZhbHVlKHVuc2lnbmVkIGluZGV4LCBPcmln
aW4gb3JpZ2luLCBpbnQ2NF90IHZhbHVlKQorICAgICAgICA6IFZhbHVlKGluZGV4LCBDb25zdDY0
LCBJbnQ2NCwgb3JpZ2luKQorICAgICAgICAsIG1fdmFsdWUodmFsdWUpCisgICAgeworICAgIH0K
KyAgICAKKyAgICBpbnQ2NF90IG1fdmFsdWU7Cit9OworCit9IH0gLy8gbmFtZXNwYWNlIEpTQzo6
QjMKKworI2VuZGlmIC8vIEIzQ29uc3Q2NFZhbHVlX2gKKwpJbmRleDogU291cmNlL0phdmFTY3Jp
cHRDb3JlL2IzL0IzQ29uc3REb3VibGVWYWx1ZS5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL0ph
dmFTY3JpcHRDb3JlL2IzL0IzQ29uc3REb3VibGVWYWx1ZS5jcHAJKHJldmlzaW9uIDApCisrKyBT
b3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNDb25zdERvdWJsZVZhbHVlLmNwcAkod29ya2luZyBj
b3B5KQpAQCAtMCwwICsxLDQxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE1IEFwcGxlIElu
Yy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGlu
IHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlv
biwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwor
ICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJl
dGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25k
aXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlv
bnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICog
ICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNj
bGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxz
IHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElT
IFBST1ZJREVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1Ig
SU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisg
KiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBB
IFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFM
TCBBUFBMRSBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNU
LCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VR
VUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NV
UkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRB
LCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNF
RCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNU
LCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1Ig
T1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMg
U09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1B
R0UuIAorICovCisKKyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJCM0NvbnN0RG91Ymxl
VmFsdWUuaCIKKworbmFtZXNwYWNlIEpTQyB7IG5hbWVzcGFjZSBCMyB7CisKK0NvbnN0RG91Ymxl
VmFsdWU6On5Db25zdERvdWJsZVZhbHVlKCkKK3sKK30KKwordm9pZCBDb25zdERvdWJsZVZhbHVl
OjpkdW1wTWV0YShQcmludFN0cmVhbSYgb3V0KSBjb25zdAoreworICAgIG91dC5wcmludGYoIiVs
ZSIsIG1fdmFsdWUpOworfQorCit9IH0gLy8gbmFtZXNwYWNlIEpTQzo6QjMKKwpJbmRleDogU291
cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzQ29uc3REb3VibGVWYWx1ZS5oCj09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0t
IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM0NvbnN0RG91YmxlVmFsdWUuaAkocmV2aXNpb24g
MCkKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM0NvbnN0RG91YmxlVmFsdWUuaAkod29y
a2luZyBjb3B5KQpAQCAtMCwwICsxLDU5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE1IEFw
cGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQg
dXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlm
aWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0
aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBt
dXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBv
ZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3Ry
aWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdo
dAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2lu
ZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0
ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRX
QVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJF
U1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywg
VEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNT
IEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVO
VCBTSEFMTCBBUFBMRSBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkg
RElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1Ig
Q09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAq
IFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNF
LCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVS
IENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENP
TlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VO
Q0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9G
IFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VD
SCBEQU1BR0UuIAorICovCisKKyNpZm5kZWYgQjNDb25zdERvdWJsZVZhbHVlX2gKKyNkZWZpbmUg
QjNDb25zdERvdWJsZVZhbHVlX2gKKworI2luY2x1ZGUgIkIzVmFsdWUuaCIKKworbmFtZXNwYWNl
IEpTQyB7IG5hbWVzcGFjZSBCMyB7CisKK2NsYXNzIENvbnN0RG91YmxlVmFsdWUgOiBwdWJsaWMg
VmFsdWUgeworcHVibGljOgorICAgIHN0YXRpYyBib29sIGFjY2VwdHMoT3Bjb2RlIG9wY29kZSkg
eyByZXR1cm4gb3Bjb2RlID09IENvbnN0RG91YmxlOyB9CisgICAgCisgICAgfkNvbnN0RG91Ymxl
VmFsdWUoKTsKKyAgICAKKyAgICBkb3VibGUgdmFsdWUoKSBjb25zdCB7IHJldHVybiBtX3ZhbHVl
OyB9CisKK3Byb3RlY3RlZDoKKyAgICB2b2lkIGR1bXBNZXRhKFByaW50U3RyZWFtJikgY29uc3Qg
b3ZlcnJpZGU7CisKK3ByaXZhdGU6CisgICAgZnJpZW5kIGNsYXNzIFByb2NlZHVyZTsKKworICAg
IENvbnN0RG91YmxlVmFsdWUodW5zaWduZWQgaW5kZXgsIE9yaWdpbiBvcmlnaW4sIGRvdWJsZSB2
YWx1ZSkKKyAgICAgICAgOiBWYWx1ZShpbmRleCwgQ29uc3REb3VibGUsIERvdWJsZSwgb3JpZ2lu
KQorICAgICAgICAsIG1fdmFsdWUodmFsdWUpCisgICAgeworICAgIH0KKyAgICAKKyAgICBkb3Vi
bGUgbV92YWx1ZTsKK307CisKK30gfSAvLyBuYW1lc3BhY2UgSlNDOjpCMworCisjZW5kaWYgLy8g
QjNDb25zdERvdWJsZVZhbHVlX2gKKwpJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0Iz
Q29udHJvbFZhbHVlLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMv
QjNDb250cm9sVmFsdWUuY3BwCShyZXZpc2lvbiAwKQorKysgU291cmNlL0phdmFTY3JpcHRDb3Jl
L2IzL0IzQ29udHJvbFZhbHVlLmNwcAkod29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDQzIEBACisv
KgorICogQ29weXJpZ2h0IChDKSAyMDE1IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4K
KyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1z
LCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRl
ZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlz
dHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0
CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5n
IGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCBy
ZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2Yg
Y29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9j
dW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3Ry
aWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4g
YGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNM
VURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0Yg
TUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0Ug
QVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SCisgKiBDT05U
UklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwg
U1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJ
TkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09P
RFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVT
SU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICog
T0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBU
T1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFO
WSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNF
RCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisKKyNpbmNsdWRlICJj
b25maWcuaCIKKyNpbmNsdWRlICJCM0NvbnRyb2xWYWx1ZS5oIgorCituYW1lc3BhY2UgSlNDIHsg
bmFtZXNwYWNlIEIzIHsKKworQ29udHJvbFZhbHVlOjp+Q29udHJvbFZhbHVlKCkKK3sKK30KKwor
dm9pZCBDb250cm9sVmFsdWU6OmR1bXBNZXRhKFByaW50U3RyZWFtJiBvdXQpIGNvbnN0Cit7Cisg
ICAgQ29tbWFQcmludGVyIGNvbW1hOworICAgIGZvciAoQmFzaWNCbG9jayogYmxvY2sgOiBtX3N1
Y2Nlc3NvcnMpCisgICAgICAgIG91dC5wcmludChjb21tYSwgcG9pbnRlckR1bXAoYmxvY2spKTsK
K30KKworfSB9IC8vIG5hbWVzcGFjZSBKU0M6OkIzCisKSW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0
Q29yZS9iMy9CM0NvbnRyb2xWYWx1ZS5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0
Q29yZS9iMy9CM0NvbnRyb2xWYWx1ZS5oCShyZXZpc2lvbiAwKQorKysgU291cmNlL0phdmFTY3Jp
cHRDb3JlL2IzL0IzQ29udHJvbFZhbHVlLmgJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSwxMTcg
QEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTUgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2Vy
dmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkg
Zm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHBy
b3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4g
UmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5
cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xs
b3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBt
dXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlz
dCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAg
ICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUg
ZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUg
SU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMs
IElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElF
UyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVS
UE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IKKyAq
IENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVO
VEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElO
Q0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVU
RSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBP
UiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZ
CisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFks
IE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcg
SU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBB
RFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKworI2lmbmRl
ZiBCM0NvbnRyb2xWYWx1ZV9oCisjZGVmaW5lIEIzQ29udHJvbFZhbHVlX2gKKworI2luY2x1ZGUg
IkIzVmFsdWUuaCIKKworbmFtZXNwYWNlIEpTQyB7IG5hbWVzcGFjZSBCMyB7CisKK2NsYXNzIEJh
c2ljQmxvY2s7CisKK2NsYXNzIENvbnRyb2xWYWx1ZSA6IHB1YmxpYyBWYWx1ZSB7CitwdWJsaWM6
CisgICAgc3RhdGljIGJvb2wgYWNjZXB0cyhPcGNvZGUgb3Bjb2RlKQorICAgIHsKKyAgICAgICAg
c3dpdGNoIChvcGNvZGUpIHsKKyAgICAgICAgY2FzZSBKdW1wOgorICAgICAgICBjYXNlIEJyYW5j
aDoKKyAgICAgICAgY2FzZSBSZXR1cm46CisgICAgICAgIGNhc2UgT29wczoKKyAgICAgICAgICAg
IHJldHVybiB0cnVlOworICAgICAgICBjYXNlIFN3aXRjaDogCisgICAgICAgICAgICAvLyBUaGlz
IGlzIGhlcmUgYmVjYXVzZSBTd2l0Y2hWYWx1ZSBpcyBhIHN1YmNsYXNzIG9mIENvbnRyb2xWYWx1
ZSwgc28gd2Ugd2FudAorICAgICAgICAgICAgLy8gc3d0aWNoVmFsdWUtPmFzPENvbnRyb2xWYWx1
ZT4oKSB0byByZXR1cm4gbm9uLW51bGwuCisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAg
ICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgIH0K
KworICAgIHR5cGVkZWYgVmVjdG9yPEJhc2ljQmxvY2sqLCAyPiBTdWNjZXNzb3JMaXN0OworCisg
ICAgfkNvbnRyb2xWYWx1ZSgpOworCisgICAgdW5zaWduZWQgbnVtU3VjY2Vzc29ycygpIGNvbnN0
IHsgcmV0dXJuIG1fc3VjY2Vzc29ycy5zaXplKCk7IH0KKyAgICBCYXNpY0Jsb2NrKiBzdWNjZXNz
b3IodW5zaWduZWQgaW5kZXgpIGNvbnN0IHsgcmV0dXJuIG1fc3VjY2Vzc29yc1tpXTsgfQorICAg
IEJhc2ljQmxvY2sqJiBzdWNjZXNzb3IodW5zaWduZWQgaW5kZXgpIHsgcmV0dXJuIG1fc3VjY2Vz
c29yc1tpXTsgfQorCisgICAgY29uc3QgU3VjY2Vzc29yTGlzdCYgc3VjY2Vzc29ycygpIGNvbnN0
IHsgcmV0dXJuIG1fc3VjY2Vzc29yczsgfQorCitwcm90ZWN0ZWQ6CisgICAgdm9pZCBkdW1wTWV0
YShQcmludFN0cmVhbSYpIGNvbnN0IG92ZXJyaWRlOworCisgICAgLy8gVXNlIHRoaXMgZm9yIHN1
YmNsYXNzZXMuCisgICAgdGVtcGxhdGU8dHlwZW5hbWUuLi4gQXJndW1lbnRzPgorICAgIENvbnRy
b2xWYWx1ZSh1bnNpZ25lZCBpbmRleCwgT3Bjb2RlIG9wY29kZSwgVHlwZSB0eXBlLCBPcmlnaW4g
b3JpZ2luLCBBcmd1bWVudHMuLi4gYXJndW1lbnRzKQorICAgICAgICA6IFZhbHVlKGluZGV4LCBv
cGNvZGUsIHR5cGUsIG9yaWdpbiwgYXJndW1lbnRzLi4uKQorICAgIHsKKyAgICB9CisKKyAgICAv
LyBTdWJjbGFzc2VzIHdpbGwgcG9wdWxhdGUgdGhpcy4KKyAgICBTdWNjZXNzb3JMaXN0IG1fc3Vj
Y2Vzc29yczsKKworcHJpdmF0ZToKKyAgICBmcmllbmQgY2xhc3MgUHJvY2VkdXJlOworCisgICAg
Ly8gVXNlIHRoaXMgZm9yIE9vcHMuCisgICAgQ29udHJvbFZhbHVlKHVuc2lnbmVkIGluZGV4LCBP
cGNvZGUgb3Bjb2RlLCBPcmlnaW4gb3JpZ2luKQorICAgICAgICA6IFZhbHVlKGluZGV4LCBvcGNv
ZGUsIFZvaWQsIG9yaWdpbikKKyAgICB7CisgICAgICAgIEFTU0VSVChvcGNvZGUgPT0gT29wcyk7
CisgICAgfQorCisgICAgLy8gVXNlIHRoaXMgZm9yIFJldHVybi4KKyAgICBDb250cm9sVmFsdWUo
dW5zaWduZWQgaW5kZXgsIE9wY29kZSBvcGNvZGUsIE9yaWdpbiBvcmlnaW4sIFZhbHVlKiByZXN1
bHQpCisgICAgICAgIDogVmFsdWUoaW5kZXgsIG9wY29kZSwgVm9pZCwgb3JpZ2luLCByZXN1bHQp
CisgICAgeworICAgICAgICBBU1NFUlQob3Bjb2RlID09IFJldHVybik7CisgICAgfQorCisgICAg
Ly8gVXNlIHRoaXMgZm9yIEp1bXAuCisgICAgQ29udHJvbFZhbHVlKHVuc2lnbmVkIGluZGV4LCBP
cGNvZGUgb3Bjb2RlLCBPcmlnaW4gb3JpZ2luLCBCYXNpY0Jsb2NrKiB0YXJnZXQpCisgICAgICAg
IDogVmFsdWUoaW5kZXgsIG9wY29kZSwgVm9pZCwgb3JpZ2luKQorICAgIHsKKyAgICAgICAgQVNT
RVJUKG9wY29kZSA9PSBKdW1wKTsKKyAgICAgICAgbV9zdWNjZXNzb3JzLmFwcGVuZCh0YXJnZXQp
OworICAgIH0KKworICAgIC8vIFVzZSB0aGlzIGZvciBCcmFuY2guCisgICAgQ29udHJvbFZhbHVl
KAorICAgICAgICB1bnNpZ25lZCBpbmRleCwgT3Bjb2RlIG9wY29kZSwgT3JpZ2luIG9yaWdpbiwg
VmFsdWUqIHByZWRpY2F0ZSwKKyAgICAgICAgQmFzaWNCbG9jayogeWVzLCBCYXNpY0Jsb2NrKiBu
bykKKyAgICAgICAgOiBWYWx1ZShpbmRleCwgb3Bjb2RlLCBWb2lkLCBvcmlnaW4sIHByZWRpY2F0
ZSkKKyAgICB7CisgICAgICAgIEFTU0VSVChvcGNvZGUgPT0gQnJhbmNoKTsKKyAgICAgICAgbV9z
dWNjZXNzb3JzLmFwcGVuZCh5ZXMpOworICAgICAgICBtX3N1Y2Nlc3NvcnMuYXBwZW5kKG5vKTsK
KyAgICB9Cit9OworCit9IH0gLy8gbmFtZXNwYWNlIEpTQzo6QjMKKworI2VuZGlmIC8vIEIzQ29u
dHJvbFZhbHVlX2gKKwpJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzSW5kZXhNYXAu
aAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNJbmRleE1hcC5oCShy
ZXZpc2lvbiAwKQorKysgU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzSW5kZXhNYXAuaAkod29y
a2luZyBjb3B5KQpAQCAtMCwwICsxLDYzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE1IEFw
cGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQg
dXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlm
aWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0
aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBt
dXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBv
ZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3Ry
aWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdo
dAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2lu
ZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0
ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRX
QVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJF
U1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywg
VEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNT
IEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVO
VCBTSEFMTCBBUFBMRSBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkg
RElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1Ig
Q09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAq
IFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNF
LCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVS
IENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENP
TlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VO
Q0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9G
IFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VD
SCBEQU1BR0UuIAorICovCisKKyNpZm5kZWYgQjNJbmRleE1hcF9oCisjZGVmaW5lIEIzSW5kZXhN
YXBfaAorCituYW1lc3BhY2UgSlNDIHsgbmFtZXNwYWNlIEIzIHsKKworLy8gVGhpcyBpcyBhIG1h
cCBmb3Iga2V5cyB0aGF0IGhhdmUgYW4gaW5kZXgoKS4gSXQncyBzdXBlciBlZmZpY2llbnQgZm9y
IEJhc2ljQmxvY2tzLiBJdCdzIG9ubHkKKy8vIGVmZmljaWVudCBmb3IgVmFsdWVzIGlmIHlvdSBk
b24ndCBjcmVhdGUgdG9vIG1hbnkgb2YgdGhlc2UgbWFwcywgc2luY2UgVmFsdWVzIGNhbiBoYXZl
IHZlcnkKKy8vIHNwYXJzZSBpbmRpY2VzIGFuZCB0aGVyZSBhcmUgYSBsb3Qgb2YgVmFsdWVzLgor
Cit0ZW1wbGF0ZTx0eXBlbmFtZSBLZXksIHR5cGVuYW1lIFZhbHVlPgorY2xhc3MgSW5kZXhNYXAg
eworcHVibGljOgorICAgIGV4cGxpY2l0IEluZGV4TWFwKHNpemVfdCBzaXplID0gMCkKKyAgICB7
CisgICAgICAgIG1fdmVjdG9yLnJlc2l6ZShzaXplKTsKKyAgICB9CisKKyAgICB2b2lkIHJlc2l6
ZShzaXplX3Qgc2l6ZSkKKyAgICB7CisgICAgICAgIG1fdmVjdG9yLnJlc2l6ZShzaXplKTsKKyAg
ICB9CisKKyAgICBWYWx1ZSYgb3BlcmF0b3JbXShzaXplX3QgaW5kZXgpCisgICAgeworICAgICAg
ICByZXR1cm4gbV92ZWN0b3JbaW5kZXhdOworICAgIH0KKyAgICAKKyAgICBjb25zdCBWYWx1ZSYg
b3BlcmF0b3JbXShzaXplX3QgaW5kZXgpIGNvbnN0CisgICAgeworICAgICAgICByZXR1cm4gbV92
ZWN0b3JbaW5kZXhdOworICAgIH0KKyAgICAKK3ByaXZhdGU6CisgICAgVmVjdG9yPFZhbHVlPiBt
X3ZlY3RvcjsKK307CisKK30gfSAvLyBuYW1lc3BhY2UgSlNDOjpCMworCkluZGV4OiBTb3VyY2Uv
SmF2YVNjcmlwdENvcmUvYjMvQjNJbmRleFNldC5oCj09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZh
U2NyaXB0Q29yZS9iMy9CM0luZGV4U2V0LmgJKHJldmlzaW9uIDApCisrKyBTb3VyY2UvSmF2YVNj
cmlwdENvcmUvYjMvQjNJbmRleFNldC5oCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsMTQxIEBA
CisvKgorICogQ29weXJpZ2h0IChDKSAyMDE1IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZl
ZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZv
cm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92
aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJl
ZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJp
Z2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93
aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVz
dCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qg
b2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAg
ZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRp
c3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElO
Qy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJ
TkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMg
T0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBP
U0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SCisgKiBD
T05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRB
TCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNM
VURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUg
R09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1Ig
QlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQor
ICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBP
UiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElO
IEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURW
SVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisKKyNpZm5kZWYg
QjNJbmRleFNldF9oCisjZGVmaW5lIEIzSW5kZXhTZXRfaAorCisjaW5jbHVkZSA8d3RmL0JpdFZl
Y3Rvci5oPgorI2luY2x1ZGUgPHd0Zi9Db21tYVByaW50ZXIuaD4KKworbmFtZXNwYWNlIEpTQyB7
IG5hbWVzcGFjZSBCMyB7CisKKy8vIFRoaXMgaXMgYSBzZXQgZm9yIHRoaW5ncyB0aGF0IGhhdmUg
YW4gaW5kZXgoKS4gSXQncyBzdXBlciBlZmZpY2llbnQgZm9yIEJhc2ljQmxvY2tzLiBJdCdzIG9u
bHkKKy8vIGVmZmljaWVudCBmb3IgVmFsdWVzIGlmIHlvdSBkb24ndCBjcmVhdGUgdG9vIG1hbnkg
b2YgdGhlc2Ugc2V0cywgc2luY2UgVmFsdWVzIGNhbiBoYXZlIHZlcnkgc3BhcnNlCisvLyBpbmRp
Y2VzIGFuZCB0aGVyZSBhcmUgYSBsb3Qgb2YgVmFsdWVzLgorCisvLyBJZiB5b3Ugd2FudCBhIHNl
dCBvZiBCYXNpY0Jsb2NrcywgeW91IGRvIEluZGV4U2V0PEJhc2ljQmxvY2s+LiBTbywgVCA9IEJh
c2ljQmxvY2suCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorY2xhc3MgSW5kZXhTZXQgeworcHVibGlj
OgorICAgIEluZGV4U2V0KCkKKyAgICB7CisgICAgfQorCisgICAgYm9vbCBhZGQoVCogdmFsdWUp
CisgICAgeworICAgICAgICByZXR1cm4gIW1fc2V0LnNldCh2YWx1ZS0+aW5kZXgoKSk7CisgICAg
fQorCisgICAgYm9vbCBjb250YWlucyhUKiB2YWx1ZSkgY29uc3QKKyAgICB7CisgICAgICAgIGlm
ICghdmFsdWUpCisgICAgICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICAgICAgcmV0dXJuIG1f
c2V0LmdldCh2YWx1ZS0+aW5kZXgoKSk7CisgICAgfQorCisgICAgdGVtcGxhdGU8dHlwZW5hbWUg
Q29sbGVjdGlvblR5cGU+CisgICAgY2xhc3MgSXRlcmFibGUgeworICAgIHB1YmxpYzoKKyAgICAg
ICAgSXRlcmFibGUoY29uc3QgQ29sbGVjdGlvblR5cGUmIGNvbGxlY3Rpb24sIGNvbnN0IEluZGV4
U2V0JiBzZXQpCisgICAgICAgICAgICA6IG1fY29sbGVjdGlvbihjb2xsZWN0aW9uKQorICAgICAg
ICAgICAgLCBtX3NldChzZXQpCisgICAgICAgIHsKKyAgICAgICAgfQorCisgICAgICAgIGNsYXNz
IGl0ZXJhdG9yIHsKKyAgICAgICAgcHVibGljOgorICAgICAgICAgICAgaXRlcmF0b3IoKQorICAg
ICAgICAgICAgICAgIDogbV9jb2xsZWN0aW9uKG51bGxwdHIpCisgICAgICAgICAgICB7CisgICAg
ICAgICAgICB9CisKKyAgICAgICAgICAgIGl0ZXJhdG9yKGNvbnN0IENvbGxlY3Rpb25UeXBlJiBj
b2xsZWN0aW9uLCBCaXRWZWN0b3I6OlNldEJpdHNJdGVyYWJsZTo6aXRlcmF0b3IgaXRlcikKKyAg
ICAgICAgICAgICAgICA6IG1fY29sbGVjdGlvbigmY29sbGVjdGlvbikKKyAgICAgICAgICAgICAg
ICAsIG1faXRlcihpdGVyKQorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorCisgICAgICAg
ICAgICBUKiBvcGVyYXRvciooKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVy
biBtX2NvbGxlY3Rpb24tPmF0KCptX2l0ZXIpOworICAgICAgICAgICAgfQorCisgICAgICAgICAg
ICBpdGVyYXRvciYgb3BlcmF0b3IrKygpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAg
bV9pdGVyKys7CisgICAgICAgICAgICAgICAgcmV0dXJuICp0aGlzOworICAgICAgICAgICAgfQor
CisgICAgICAgICAgICBib29sIG9wZXJhdG9yPT0oY29uc3QgaXRlcmF0b3ImIG90aGVyKSBjb25z
dAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBtX2l0ZXIgPT0gb3RoZXIu
bV9pdGVyOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBib29sIG9wZXJhdG9yIT0oY29u
c3QgaXRlcmF0b3ImIG90aGVyKSBjb25zdAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAg
IHJldHVybiAhKCp0aGlzID09IG90aGVyKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICBwcml2
YXRlOgorICAgICAgICAgICAgY29uc3QgQ29sbGVjdGlvblR5cGUqIG1fY29sbGVjdGlvbjsKKyAg
ICAgICAgICAgIEJpdFZlY3Rvcjo6U2V0Qml0c0l0ZXJhYmxlOjppdGVyYXRvciBtX2l0ZXI7Cisg
ICAgICAgIH07CisKKyAgICAgICAgaXRlcmF0b3IgYmVnaW4oKSBjb25zdCB7IHJldHVybiBpdGVy
YXRvcihtX2NvbGxlY3Rpb24sIG1fc2V0LmJlZ2luKCkpOyB9CisgICAgICAgIGl0ZXJhdG9yIGVu
ZCgpIGNvbnN0IHsgcmV0dXJuIGl0ZXJhdG9yKG1fY29sbGVjdGlvbiwgbV9zZXQuZW5kKCkpOyB9
CisKKyAgICBwcml2YXRlOgorICAgICAgICBjb25zdCBDb2xsZWN0aW9uVHlwZSYgbV9jb2xsZWN0
aW9uOworICAgICAgICBjb25zdCBJbmRleFNldCYgbV9zZXQ7CisgICAgfTsKKworICAgIC8vIEZv
ciBiYXNpYyBibG9ja3MsIHlvdSBkbzoKKyAgICAvLyBpbmRleFNldC52YWx1ZXMocHJvY2VkdXJl
KTsKKyAgICAvLworICAgIC8vIEZvciB2YWx1ZXMsIHlvdSBkbzoKKyAgICAvLyBpbmRleFNldC52
YWx1ZXMocHJvY2VkdXJlLnZhbHVlcygpKTsKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBDb2xsZWN0
aW9uVHlwZT4KKyAgICBJdGVyYWJsZTxDb2xsZWN0aW9uVHlwZT4gdmFsdWVzKGNvbnN0IENvbGxl
Y3Rpb25UeXBlJiBjb2xsZWN0aW9uKSBjb25zdAorICAgIHsKKyAgICAgICAgcmV0dXJuIEl0ZXJh
YmxlPENvbGxlY3Rpb25UeXBlPihjb2xsZWN0aW9uKTsKKyAgICB9CisKKyAgICBjb25zdCBCaXRW
ZWN0b3ImIGluZGljZXMoKSBjb25zdCB7IHJldHVybiBtX3NldDsgfQorCisgICAgdm9pZCBkdW1w
KFByaW50U3RyZWFtJiBvdXQpIGNvbnN0CisgICAgeworICAgICAgICBDb21tYVByaW50ZXIgY29t
bWE7CisgICAgICAgIGZvciAoc2l6ZV90IGluZGV4IDogaW5kaWNlcygpLnNldEJpdHMoKSkKKyAg
ICAgICAgICAgIG91dC5wcmludChjb21tYSwgVDo6ZHVtcFByZWZpeCwgaW5kZXgpOworICAgIH0K
KworcHJpdmF0ZToKKyAgICBCaXRWZWN0b3IgbV9zZXQ7Cit9OworCit9IH0gLy8gbmFtZXNwYWNl
IEpTQzo6QjMKKworI2VuZGlmIC8vIEIzSW5kZXhTZXRfaAorCkluZGV4OiBTb3VyY2UvSmF2YVNj
cmlwdENvcmUvYjMvQjNMb3dlcmluZ01hdGNoZXIucGF0dGVybnMKPT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291
cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzTG93ZXJpbmdNYXRjaGVyLnBhdHRlcm5zCShyZXZpc2lv
biAwKQorKysgU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzTG93ZXJpbmdNYXRjaGVyLnBhdHRl
cm5zCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsNDQgQEAKKyMgQ29weXJpZ2h0IChDKSAyMDE1
IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyMKKyMgUmVkaXN0cmlidXRpb24gYW5k
IHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisjIG1vZGlm
aWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0
aW9ucworIyBhcmUgbWV0OgorIyAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVz
dCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorIyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBj
b25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisjIDIuIFJlZGlzdHJpYnV0
aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Cisj
ICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlz
Y2xhaW1lciBpbiB0aGUKKyMgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxz
IHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyMKKyMgVEhJUyBTT0ZUV0FSRSBJUyBQ
Uk9WSURFRCBCWSBBUFBMRSBJTkMuIEFORCBJVFMgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJworIyBB
TkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1Qg
TElNSVRFRCBUTywKKyMgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkg
QU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorIyBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJ
TiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SIElUUyBDT05UUklCVVRPUlMKKyMgQkUgTElB
QkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBM
QVJZLCBPUgorIyBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1J
VEVEIFRPLCBQUk9DVVJFTUVOVCBPRgorIyBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBM
T1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MKKyMgSU5URVJSVVBUSU9O
KSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIg
SU4KKyMgQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdM
SUdFTkNFIE9SIE9USEVSV0lTRSkKKyMgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNF
IE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRgorIyBUSEUgUE9TU0lCSUxJVFkg
T0YgU1VDSCBEQU1BR0UuCisKK21hdGNoZXIgTG93ZXJpbmdNYXRjaGVyCisKKyMgVGhlc2UgcnVs
ZXMgYXJlIGNvbnNpZGVyZWQgaW4gYSBjYXNjYWRlLCBzdGFydGluZyBhdCB0aGUgdG9wLiBJdCdz
IGltcGxlbmVudGVkIHVzaW5nIHN3aXRjaAorIyBzdGF0ZW1lbnRzIHdoZXJldmVyIHBvc3NpYmxl
LgorCisjIE5vdGU6IGFkZGluZyBtb3JlIHJ1bGVzIHRvIHRoaXMgbWF0Y2hlciBpcyBhbiBleGNl
bGxlbnQgd2F5IG9mIGltcHJvdmluZyBwZXJmb3JtYW5jZSEKKworTG9hZCA9IExvYWQoYWRkcmVz
cykKKworIyBXZSBwcm9iYWJseSBkb24ndCBuZWVkIHRoZXNlIGZvcm1zLgorQWRkTG9hZDEgPSBB
ZGQoTG9hZChhZGRyZXNzKSwgdmFsdWUpCitBZGRMb2FkMiA9IEFkZCh2YWx1ZSwgTG9hZChhZGRy
ZXNzKSkKK0FkZCA9IEFkZChsZWZ0LCByaWdodCkKKworU3RvcmVBZGRMb2FkMSA9IFN0b3JlKEFk
ZChMb2FkKGFkZHJlc3MpLCB2YWx1ZSksIGFkZHJlc3MpCitTdG9yZUFkZExvYWQyID0gU3RvcmUo
QWRkKHZhbHVlLCBMb2FkKGFkZHJlc3MpKSwgYWRkcmVzcykKK1N0b3JlQW5kTG9hZCA9IFN0b3Jl
KEFuZChMb2FkKGFkZHJlc3MpLCB2YWx1ZSksIGFkZHJlc3MpCitTdG9yZSA9IFN0b3JlKHZhbHVl
LCBhZGRyZXNzKQorCitSZXR1cm4gPSBSZXR1cm4odmFsdWUpCisKSW5kZXg6IFNvdXJjZS9KYXZh
U2NyaXB0Q29yZS9iMy9CM01lbW9yeVZhbHVlLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2
YVNjcmlwdENvcmUvYjMvQjNNZW1vcnlWYWx1ZS5jcHAJKHJldmlzaW9uIDApCisrKyBTb3VyY2Uv
SmF2YVNjcmlwdENvcmUvYjMvQjNNZW1vcnlWYWx1ZS5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTAs
MCArMSw0MiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNSBBcHBsZSBJbmMuIEFsbCByaWdo
dHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5k
IGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJt
aXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6
CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFi
b3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQg
dGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFy
eSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwg
dGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0
aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3
aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBC
WSBBUFBMRSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FS
UkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBX
QVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFS
CisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5D
LiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1Qs
IElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFN
QUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBT
VUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBS
T0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFO
WSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJ
QUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkg
QVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBF
VkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLiAKKyAqLwor
CisjaW5jbHVkZSAiY29uZmlnLmgiCisjaW5jbHVkZSAiQjNNZW1vcnlWYWx1ZS5oIgorCituYW1l
c3BhY2UgSlNDIHsgbmFtZXNwYWNlIEIzIHsKKworTWVtb3J5VmFsdWU6On5NZW1vcnlWYWx1ZSgp
Cit7Cit9CisKK3ZvaWQgTWVtb3J5VmFsdWU6OmR1bXBNZXRhKFByaW50U3RyZWFtJiBvdXQpIGNv
bnN0Cit7CisgICAgaWYgKG1fb2Zmc2V0KQorICAgICAgICBvdXQucHJpbnQoIm9mZnNldCA9ICIs
IG1fb2Zmc2V0KTsKK30KKworfSB9IC8vIG5hbWVzcGFjZSBKU0M6OkIzCisKSW5kZXg6IFNvdXJj
ZS9KYXZhU2NyaXB0Q29yZS9iMy9CM01lbW9yeVZhbHVlLmgKPT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNl
L0phdmFTY3JpcHRDb3JlL2IzL0IzTWVtb3J5VmFsdWUuaAkocmV2aXNpb24gMCkKKysrIFNvdXJj
ZS9KYXZhU2NyaXB0Q29yZS9iMy9CM01lbW9yeVZhbHVlLmgJKHdvcmtpbmcgY29weSkKQEAgLTAs
MCArMSwxNDIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTUgQXBwbGUgSW5jLiBBbGwgcmln
aHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFu
ZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVy
bWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0
OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBh
Ym92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5k
IHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5h
cnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2Us
IHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4g
dGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQg
d2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQg
QlkgQVBQTEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdB
UlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQg
V0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxB
UgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElO
Qy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNU
LCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERB
TUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0Yg
U1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQ
Uk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBB
TlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBM
SUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0Up
IEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwg
RVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8K
KworI2lmbmRlZiBCM01lbW9yeVZhbHVlX2gKKyNkZWZpbmUgQjNNZW1vcnlWYWx1ZV9oCisKKyNp
bmNsdWRlICJCM1ZhbHVlLmgiCisKK25hbWVzcGFjZSBKU0MgeyBuYW1lc3BhY2UgQjMgeworCitj
bGFzcyBNZW1vcnlWYWx1ZSA6IHB1YmxpYyBWYWx1ZSB7CitwdWJsaWM6CisgICAgc3RhdGljIGJv
b2wgYWNjZXB0cyhPcGNvZGUgb3Bjb2RlKQorICAgIHsKKyAgICAgICAgc3dpdGNoIChvcGNvZGUp
IHsKKyAgICAgICAgY2FzZSBMb2FkOFo6CisgICAgICAgIGNhc2UgTG9hZDhTOgorICAgICAgICBj
YXNlIExvYWQxNlo6CisgICAgICAgIGNhc2UgTG9hZDE2UzoKKyAgICAgICAgY2FzZSBMb2FkRmxv
YXQ6CisgICAgICAgIGNhc2UgTG9hZDoKKyAgICAgICAgY2FzZSBTdG9yZTg6CisgICAgICAgIGNh
c2UgU3RvcmUxNjoKKyAgICAgICAgY2FzZSBTdG9yZUZsb2F0OgorICAgICAgICBjYXNlIFN0b3Jl
OgorICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAg
ICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICB+TWVtb3J5VmFsdWUoKTsK
KworICAgIGludHB0cl90IG9mZnNldCgpIGNvbnN0IHsgcmV0dXJuIG1fb2Zmc2V0OyB9CisKK3By
b3RlY3RlZDoKKyAgICB2b2lkIGR1bXBNZXRhKFByaW50U3RyZWFtJikgY29uc3Qgb3ZlcnJpZGU7
CisKK3ByaXZhdGU6CisgICAgZnJpZW5kIGNsYXNzIFByb2NlZHVyZTsKKworICAgIC8vIFVzZSB0
aGlzIGZvcm0gZm9yIExvYWQgKGJ1dCBub3QgTG9hZDhaLCBMb2FkOFMsIG9yIGFueSBvZiB0aGUg
TG9hZHMgdGhhdCBoYXZlIGEgc3VmZml4IHRoYXQKKyAgICAvLyBkZXNjcmliZXMgdGhlIHJldHVy
bmVkIHR5cGUpLgorICAgIE1lbW9yeVZhbHVlKAorICAgICAgICB1bnNpZ25lZCBpbmRleCwgT3Bj
b2RlIG9wY29kZSwgVHlwZSB0eXBlLCBPcmlnaW4gb3JpZ2luLCBWYWx1ZSogcG9pbnRlciwKKyAg
ICAgICAgaW50cHRyX3Qgb2Zmc2V0ID0gMCkKKyAgICAgICAgOiBWYWx1ZShpbmRleCwgb3Bjb2Rl
LCB0eXBlLCBvcmlnaW4sIHBvaW50ZXIpCisgICAgICAgICwgbV9vZmZzZXQob2Zmc2V0KQorICAg
IHsKKyAgICAgICAgaWYgKCFBU1NFUlRfRElTQUJMRUQpIHsKKyAgICAgICAgICAgIHN3aXRjaCAo
b3Bjb2RlKSB7CisgICAgICAgICAgICBjYXNlIExvYWQ6CisgICAgICAgICAgICAgICAgYnJlYWs7
CisgICAgICAgICAgICBjYXNlIExvYWQ4WjoKKyAgICAgICAgICAgIGNhc2UgTG9hZDhTOgorICAg
ICAgICAgICAgY2FzZSBMb2FkMTZaOgorICAgICAgICAgICAgY2FzZSBMb2FkMTZTOgorICAgICAg
ICAgICAgICAgIEFTU0VSVCh0eXBlID09IEludDMyKTsKKyAgICAgICAgICAgICAgICBicmVhazsK
KyAgICAgICAgICAgIGNhc2UgTG9hZEZsb2F0OgorICAgICAgICAgICAgICAgIEFTU0VSVCh0eXBl
ID09IERvdWJsZSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIFN0
b3JlODoKKyAgICAgICAgICAgIGNhc2UgU3RvcmUxNjoKKyAgICAgICAgICAgIGNhc2UgU3RvcmVG
bG9hdDoKKyAgICAgICAgICAgIGNhc2UgU3RvcmU6CisgICAgICAgICAgICAgICAgQVNTRVJUKHR5
cGUgPT0gVm9pZCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0
OgorICAgICAgICAgICAgICAgIEFTU0VSVF9OT1RfUkVBQ0hFRCgpOworICAgICAgICAgICAgfQor
ICAgICAgICB9CisgICAgfQorCisgICAgLy8gVXNlIHRoaXMgZm9ybSBmb3IgbG9hZHMgd2hlcmUg
dGhlIHJldHVybiB0eXBlIGlzIGltcGxpZWQuCisgICAgTWVtb3J5VmFsdWUodW5zaWduZWQgaW5k
ZXgsIE9wY29kZSBvcGNvZGUsIE9yaWdpbiBvcmlnaW4sIFZhbHVlKiBwb2ludGVyLCBpbnRwdHJf
dCBvZmZzZXQgPSAwKQorICAgICAgICA6IFZhbHVlKGluZGV4LCBvcGNvZGUsIG9wY29kZSA9PSBM
b2FkRmxvYXQgPyBEb3VibGUgOiBJbnQzMiwgb3JpZ2luLCBwb2ludGVyKQorICAgICAgICAsIG1f
b2Zmc2V0KG9mZnNldCkKKyAgICB7CisgICAgICAgIGlmICghQVNTRVJUX0RJU0FCTEVEKSB7Cisg
ICAgICAgICAgICBzd2l0Y2ggKG9wY29kZSkgeworICAgICAgICAgICAgY2FzZSBMb2FkOFo6Cisg
ICAgICAgICAgICBjYXNlIExvYWQ4UzoKKyAgICAgICAgICAgIGNhc2UgTG9hZDE2WjoKKyAgICAg
ICAgICAgIGNhc2UgTG9hZDE2UzoKKyAgICAgICAgICAgIGNhc2UgTG9hZEZsb2F0OgorICAgICAg
ICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBB
U1NFUlRfTk9UX1JFQUNIRUQoKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAg
IH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIFVzZSB0aGlzIGZvcm0gZm9yIHN0b3Jlcy4K
KyAgICBNZW1vcnlWYWx1ZSgKKyAgICAgICAgdW5zaWduZWQgaW5kZXgsIE9wY29kZSBvcGNvZGUs
IE9yaWdpbiBvcmlnaW4sIFZhbHVlKiB2YWx1ZSwgVmFsdWUqIHBvaW50ZXIsCisgICAgICAgIGlu
dHB0cl90IG9mZnNldCA9IDApCisgICAgICAgIDogVmFsdWUoaW5kZXgsIG9wY29kZSwgVm9pZCwg
b3JpZ2luLCB2YWx1ZSwgcG9pbnRlcikKKyAgICAgICAgLCBtX29mZnNldChvZmZzZXQpCisgICAg
eworICAgICAgICBpZiAoIUFTU0VSVF9ESVNBQkxFRCkgeworICAgICAgICAgICAgc3dpdGNoIChv
cGNvZGUpIHsKKyAgICAgICAgICAgIGNhc2UgU3RvcmU4OgorICAgICAgICAgICAgY2FzZSBTdG9y
ZTE2OgorICAgICAgICAgICAgY2FzZSBTdG9yZUZsb2F0OgorICAgICAgICAgICAgY2FzZSBTdG9y
ZToKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAg
ICAgICAgICAgQVNTRVJUX05PVF9SRUFDSEVEKCk7CisgICAgICAgICAgICAgICAgYnJlYWs7Cisg
ICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9OworCit9IH0gLy8gbmFtZXNwYWNlIEpT
Qzo6QjMKKworI2VuZGlmIC8vIEIzTWVtb3J5VmFsdWVfaAorCkluZGV4OiBTb3VyY2UvSmF2YVNj
cmlwdENvcmUvYjMvQjNPcGNvZGUuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0
Q29yZS9iMy9CM09wY29kZS5jcHAJKHJldmlzaW9uIDApCisrKyBTb3VyY2UvSmF2YVNjcmlwdENv
cmUvYjMvQjNPcGNvZGUuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsNDcgQEAKKy8qCisg
KiBDb3B5cmlnaHQgKEMpIDIwMTUgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoK
KyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdp
dGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRo
YXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmli
dXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAq
ICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlz
Y2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJv
ZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25k
aXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVu
dGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0
aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFT
IElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElO
RywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJD
SEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUg
RElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IKKyAqIENPTlRSSUJV
VE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVD
SUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywg
QlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBP
UiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVT
UyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBM
SUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQK
KyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdB
WSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9G
IFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKworI2luY2x1ZGUgImNvbmZp
Zy5oIgorI2luY2x1ZGUgIkIzT3Bjb2RlLmgiCisKKyNpbmNsdWRlIDx3dGYvUHJpbnRTdHJlYW0u
aD4KKworbmFtZXNwYWNlIFdURiB7CisKK3VzaW5nIG5hbWVzcGFjZSBKU0M6OkIzOworCit2b2lk
IHByaW50SW50ZXJuYWwoUHJpbnRTdHJlYW0mIG91dCwgT3Bjb2RlIG9wY29kZSkKK3sKKyAgICBz
d2l0Y2ggKG9wY29kZSkgeworICAgIGNhc2UgSWRlbnRpdHk6CisgICAgICAgIG91dC5wcmludCgi
SWRlbnRpdHkiKTsKKyAgICAgICAgcmV0dXJuOworICAgICAgICAvLyBGSVhNRQorICAgIH0KKyAg
ICBSRUxFQVNFX0FTU0VSVF9OT1RfUkVBQ0hFRCgpOworfQorCit9IC8vIG5hbWVzcGFjZSBXVEYK
KwpJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzT3Bjb2RlLmgKPT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQot
LS0gU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzT3Bjb2RlLmgJKHJldmlzaW9uIDApCisrKyBT
b3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNPcGNvZGUuaAkod29ya2luZyBjb3B5KQpAQCAtMCww
ICsxLDIxNSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNSBBcHBsZSBJbmMuIEFsbCByaWdo
dHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5k
IGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJt
aXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6
CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFi
b3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQg
dGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFy
eSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwg
dGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0
aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3
aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBC
WSBBUFBMRSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FS
UkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBX
QVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFS
CisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5D
LiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1Qs
IElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFN
QUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBT
VUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBS
T0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFO
WSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJ
QUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkg
QVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBF
VkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLiAKKyAqLwor
CisjaWZuZGVmIEIzT3Bjb2RlX2gKKyNkZWZpbmUgQjNPcGNvZGVfaAorCisjaW5jbHVkZSA8d3Rm
L1N0ZExpYkV4dHJhcy5oPgorCituYW1lc3BhY2UgSlNDIHsgbmFtZXNwYWNlIEIzIHsKKworZW51
bSBPcGNvZGUgOiBpbnQxNl90IHsKKyAgICAvLyBBIG5vLW9wIHRoYXQgcmV0dXJucyBWb2lkLCB1
c2VmdWwgZm9yIHdoZW4geW91IHdhbnQgdG8gcmVtb3ZlIGEgdmFsdWUuCisgICAgTm9wLAorICAg
ICAKKyAgICAvLyBQb2x5bW9ycGhpYyBpZGVudGl0eSwgdXNhYmxlIHdpdGggYW55IHZhbHVlIHR5
cGUuCisgICAgSWRlbnRpdHksCisKKyAgICAvLyBDb25zdGFudHMuIFVzZSB0aGUgQ29uc3RWYWx1
ZSogY2xhc3Nlcy4gQ29uc3RhbnRzIGV4aXN0IGluIHRoZSBjb250cm9sIGZsb3csIHNvIHRoYXQg
d2UgY2FuCisgICAgLy8gcmVhc29uIGFib3V0IHdoZXJlIHdlIHdvdWxkIGNvbnN0cnVjdCB0aGVt
LiBMYXJnZSBjb25zdGFudHMgYXJlIGV4cGVuc2l2ZSB0byBjcmVhdGUuCisgICAgQ29uc3QzMiwK
KyAgICBDb25zdDY0LAorICAgIENvbnN0RG91YmxlLAorCisgICAgLy8gVGhlIG1hZ2ljYWwgc3Rh
Y2sgc2xvdC4gVGhpcyBpcyB2aWV3ZWQgYXMgZXhlY3V0aW5nIGF0IHRoZSB0b3Agb2YgdGhlIHBy
b2dyYW0gcmVnYXJkbGVzcyBvZgorICAgIC8vIHdoZXJlIGluIGNvbnRyb2wgZmxvdyB5b3UgcHV0
IGl0LiBFYWNoIGluc3RhbmNlIG9mIGEgU3RhY2tTbG90IFZhbHVlIGdldHMgYSBkaXNqb2ludCBy
YW5nZSBvZgorICAgIC8vIHN0YWNrIG1lbW9yeS4gVXNlIHRoZSBTdGFja1Nsb3RWYWx1ZSBjbGFz
cy4KKyAgICBTdGFja1Nsb3QsCisKKyAgICAvLyBUaGUgbWFnaWNhbCBhcmd1bWVudCByZWdpc3Rl
ci4gVGhpcyBpcyB2aWV3ZWQgYXMgZXhlY3V0aW5nIGF0IHRoZSB0b3Agb2YgdGhlIHByb2dyYW0K
KyAgICAvLyByZWdhcmRsZXNzIG9mIHdoZXJlIGluIGNvbnRyb2wgZmxvdyB5b3UgcHV0IGl0LCBh
bmQgdGhlIGNvbXBpbGVyIHRha2VzIGNhcmUgdG8gZW5zdXJlIHRoYXQgd2UKKyAgICAvLyBkb24n
dCBjbG9iYmVyIHRoZSB2YWx1ZSBieSByZWdpc3RlciBhbGxvY2F0aW9uIG9yIGNhbGxzIChlaXRo
ZXIgYnkgc2F2aW5nIHRoZSBhcmd1bWVudCB0byB0aGUKKyAgICAvLyBzdGFjayBvciBwcmVzZXJ2
aW5nIGl0IGluIGEgY2FsbGVlLXNhdmUgcmVnaXN0ZXIpLiBVc2UgdGhlIEFyZ3VtZW50UmVnVmFs
dWUgY2xhc3MuIFRoZSByZXR1cm4KKyAgICAvLyB0eXBlIGlzIGVpdGhlciBwb2ludGVyKCkgKGZv
ciBHUFJzKSBvciBEb3VibGUgKGZvciBGUFJzKS4KKyAgICBBcmd1bWVudFJlZywKKworICAgIC8v
IFRoZSBmcmFtZSBwb2ludGVyLiBZb3UgY2FuIHB1dCB0aGlzIGFueXdoZXJlIGluIGNvbnRyb2wg
ZmxvdyBidXQgaXQgd2lsbCBhbHdheXMgeWllbGQgdGhlCisgICAgLy8gZnJhbWUgcG9pbnRlciwg
d2l0aCBhIGNhdmVhdDogaWYgb3VyIGNvbXBpbGVyIGNoYW5nZXMgdGhlIGZyYW1lIHBvaW50ZXIg
dGVtcG9yYXJpbHkgZm9yIHNvbWUKKyAgICAvLyBzaWxseSByZWFzb24sIHRoZSBGcmFtZVBvaW50
ZXIgaW50cmluc2ljIHdpbGwgcmV0dXJuIHdoZXJlIHRoZSBmcmFtZSBwb2ludGVyICpzaG91bGQq
IGJlIG5vdAorICAgIC8vIHdoZXJlIGl0IGhhcHBlbnMgdG8gYmUgcmlnaHQgbm93LgorICAgIEZy
YW1lUG9pbnRlciwKKworICAgIC8vIFBvbHltb3JwaGljIG1hdGgsIHVzYWJsZSB3aXRoIGFueSB2
YWx1ZSB0eXBlLgorICAgIEFkZCwKKyAgICBTdWIsCisgICAgTXVsLAorICAgIERpdiwKKworICAg
IC8vIEludGVnZXIgbWF0aC4KKyAgICBDaGlsbERpdiwgLy8gZG9lc24ndCB0cmFwIGV2ZXIsIGJl
aGF2ZXMgbGlrZSBKUyAoeC95KXwwLgorICAgIE1vZCwKKyAgICBCaXRBbmQsCisgICAgQml0T3Is
CisgICAgQml0WG9yLAorICAgIFNobCwKKyAgICBTU2hyLAorICAgIFpTaHIsCisKKyAgICAvLyBD
YXN0cyBhbmQgc3VjaC4KKyAgICAvLyBUYWtlcyBhbmQgcmV0dXJucyBJbnQzMjoKKyAgICBTRXh0
OCwKKyAgICBTRXh0MTYsCisgICAgLy8gVGFrZXMgSW50MzIgYW5kIHJldHVybnMgSW50NjQ6Cisg
ICAgU0V4dDMyLAorICAgIFpFeHQzMiwKKyAgICAvLyBUYWtlcyBhbmQgcmV0dXJucyBEb3VibGU6
CisgICAgRlJvdW5kLAorICAgIC8vIFRha2VzIGludHMgYW5kIHJldHVybnMgRG91YmxlOgorICAg
IElUb0QsCisgICAgLy8gVGFrZXMgRG91YmxlIGFuZCByZXR1cm5zIEludDMyOgorICAgIERUb0kz
MiwKKworICAgIC8vIFBvbHltb3JwaGljIGNvbXBhcmlzb25zLCB1c2FibGUgd2l0aCBhbnkgdmFs
dWUgdHlwZS4gUmV0dXJucyBpbnQzMiAwIG9yIDEuIE5vdGUgdGhhdCAiTm90IgorICAgIC8vIGlz
IGp1c3QgRXF1YWwoeCwgMCkuCisgICAgRXF1YWwsCisgICAgTm90RXF1YWwsCisgICAgTGVzc1Ro
YW4sCisgICAgR3JlYXRlclRoYW4sCisgICAgTGVzc0VxdWFsLAorICAgIEdyZWF0ZXJFcXVhbCwK
KworICAgIC8vIEludGVnZXIgY29tcGFyaXNvbnMuIFJldHVybnMgaW50MzIgMCBvciAxLgorICAg
IEFib3ZlLAorICAgIEJlbG93LAorICAgIEFib3ZlRXF1YWwKKyAgICBCZWxvd0VxdWFsLAorCisg
ICAgLy8gTWVtb3J5IGxvYWRzLiBPcGNvZGUgaW5kaWNhdGVzIGhvdyB3ZSBsb2FkIGFuZCB0aGUg
bG9hZGVkIHR5cGUuIFRoZXNlIHVzZSBNZW1vcnlWYWx1ZS4KKyAgICAvLyBUaGVzZSByZXR1cm4g
SW50MzI6CisgICAgTG9hZDhaLAorICAgIExvYWQ4UywKKyAgICBMb2FkMTZaLAorICAgIExvYWQx
NlMsCisgICAgLy8gVGhpcyByZXR1cm5zIERvdWJsZToKKyAgICBMb2FkRmxvYXQsCisgICAgLy8g
VGhpcyByZXR1cm4gd2hhdGV2ZXIgdGhlIHJldHVybiB0eXBlIGlzOgorICAgIExvYWQsCisKKyAg
ICAvLyBNZW1vcnkgc3RvcmVzLiBPcGNvZGUgaW5kaWNhdGVzIGhvdyB0aGUgdmFsdWUgaXMgc3Rv
cmVkLiBUaGVzZSB1c2UgTWVtb3J5VmFsdWUuCisgICAgLy8gVGhlc2UgdGFrZSBhbiBJbnQzMiB2
YWx1ZToKKyAgICBTdG9yZTgsCisgICAgU3RvcmUxNiwKKyAgICAvLyBUaGlzIHRha2VzIGEgRG91
YmxlIHZhbHVlOgorICAgIFN0b3JlRmxvYXQsCisgICAgLy8gVGhpcyBpcyBhIHBvbHltb3JwaGlj
IHN0b3JlIGZvciBJbnQzMiwgSW50NjQsIGFuZCBEb3VibGU6CisgICAgU3RvcmUsCisKKyAgICAv
LyBUaGlzIGlzIGEgcmVndWxhciBvcmRpbmFyeSBDIGZ1bmN0aW9uIGNhbGwsIHVzaW5nIHRoZSBz
eXN0ZW0gQyBjYWxsaW5nIGNvbnZlbnRpb24uIE1ha2Ugc3VyZQorICAgIC8vIHRoYXQgdGhlIGFy
Z3VtZW50cyBhcmUgcGFzc2VkIHVzaW5nIHRoZSByaWdodCB0eXBlcy4KKyAgICBDQ2FsbCwKKwor
ICAgIC8vIFRoaXMgaXMgYSBwYXRjaHBvaW50LiBVc2UgdGhlIFBhdGNocG9pbnRWYWx1ZSBjbGFz
cy4gVGhpcyBpcyB2aWV3ZWQgYXMgYmVoYXZpbmcgbGlrZSBhIGNhbGwsCisgICAgLy8gYnV0IG9u
bHkgZW1pdHMgY29kZSB2aWEgYSBjb2RlIGdlbmVyYXRpb24gY2FsbGJhY2suIFRoYXQgY2FsbGJh
Y2sgZ2V0cyB0byBlbWl0IGNvZGUgaW5saW5lLgorICAgIC8vIFlvdSBjYW4gcGFzcyBhIHN0YWNr
bWFwIGFsb25nIHdpdGggY29uc3RyYWludHMgb24gaG93IGVhY2ggc3RhY2ttYXAgYXJndW1lbnQg
bXVzdCBiZSBwYXNzZWQuCisgICAgLy8gSXQncyBsZWdhbCB0byByZXF1ZXN0IHRoYXQgYSBzdGFj
a21hcCBhcmd1bWVudCBpcyBpbiBzb21lIHJlZ2lzdGVyIGFuZCBpdCdzIGxlZ2FsIHRvIHJlcXVl
c3QKKyAgICAvLyB0aGF0IGEgc3RhY2ttYXAgYXJndW1lbnQgaXMgYXQgc29tZSBvZmZzZXQgZnJv
bSB0aGUgdG9wIG9mIHRoZSBhcmd1bWVudCBwYXNzaW5nIGFyZWEgb24gdGhlCisgICAgLy8gc3Rh
Y2suCisgICAgUGF0Y2hwb2ludCwKKworICAgIC8vIENoZWNrZWQgbWF0aC4gVXNlIHRoZSBDaGVj
a1ZhbHVlIGNsYXNzLiBMaWtlIGEgUGF0Y2hwb2ludCwgdGhpcyB0YWtlcyBhIGNvZGUgZ2VuZXJh
dGlvbgorICAgIC8vIGNhbGxiYWNrLiBUaGF0IGNhbGxiYWNrIGdldHMgdG8gZW1pdCBzb21lIGNv
ZGUgYWZ0ZXIgdGhlIGVwaWxvZ3VlLCBhbmQgZ2V0cyB0byBsaW5rIHRoZSBqdW1wCisgICAgLy8g
ZnJvbSB0aGUgY2hlY2ssIGFuZCB0aGUgY2hvaWNlIG9mIHJlZ2lzdGVycy4gWW91IGFsc28gZ2V0
IHRvIHN1cHBseSBhIHN0YWNrbWFwLiBOb3RlIHRoYXQgeW91CisgICAgLy8gYXJlIG5vdCBhbGxv
d2VkIHRvIGp1bXAgYmFjayBpbnRvIHRoZSBtYWlubGluZSBjb2RlIGZyb20geW91ciBzbG93IHBh
dGgsIHNpbmNlIHRoZSBjb21waWxlcgorICAgIC8vIHdpbGwgYXNzdW1lIHRoYXQgdGhlIGV4ZWN1
dGlvbiBvZiB0aGVzZSBpbnN0cnVjdGlvbnMgcHJvdmVzIHRoYXQgb3ZlcmZsb3cgZGlkbid0IGhh
cHBlbi4gRm9yCisgICAgLy8gZXhhbXBsZSwgaWYgeW91IGhhdmUgdHdvIENoZWNrQWRkJ3M6Cisg
ICAgLy8KKyAgICAvLyBhID0gQ2hlY2tBZGQoeCwgeSkKKyAgICAvLyBiID0gQ2hlY2tBZGQoeCwg
eSkKKyAgICAvLworICAgIC8vIFRoZW4gaXQncyB2YWxpZCB0byBjaGFuZ2UgdGhpcyB0bzoKKyAg
ICAvLworICAgIC8vIGEgPSBDaGVja0FkZCh4LCB5KQorICAgIC8vIGIgPSBJZGVudGl0eShhKQor
ICAgIC8vCisgICAgLy8gVGhpcyBpcyB2YWxpZCByZWdhcmRsZXNzIG9mIHRoZSBjYWxsYmFja3Mg
dXNlZCBieSB0aGUgdHdvIENoZWNrQWRkcy4gVGhleSBtYXkgaGF2ZSBkaWZmZXJlbnQKKyAgICAv
LyBjYWxsYmFja3MuIFlldCwgdGhpcyB0cmFuc2Zvcm1hdGlvbiBpcyB2YWxpZCBldmVuIGlmIHRo
ZXkgYXJlIGRpZmZlcmVudCBiZWNhdXNlIHdlIGtub3cgdGhhdAorICAgIC8vIGFmdGVyIHRoZSBm
aXJzdCBDaGVja0FkZCBleGVjdXRlcywgdGhlIHNlY29uZCBDaGVja0FkZCBjb3VsZCBub3QgaGF2
ZSBwb3NzaWJseSB0YWtlbiBzbG93CisgICAgLy8gcGF0aC4gVGhlcmVmb3JlLCB0aGUgc2Vjb25k
IENoZWNrQWRkJ3MgY2FsbGJhY2sgaXMgaXJyZWxldmFudC4KKyAgICBDaGVja0FkZCwKKyAgICBD
aGVja1N1YiwKKyAgICBDaGVja011bCwKKworICAgIC8vIENoZWNrIHRoYXQgc2lkZS1leGl0cy4g
VXNlIHRoZSBDaGVja1ZhbHVlIGNsYXNzLiBMaWtlIENoZWNrQWRkIGFuZCBmcmllbmRzLCB0aGlz
IGhhcyBhCisgICAgLy8gc3RhY2ttYXAgd2l0aCBhIGdlbmVyYXRpb24gY2FsbGJhY2suIFRoaXMg
dGFrZXMgYW4gSW50MzIgYXJndW1lbnQgdGhhdCB0aGlzIGJyYW5jaGVzIG9uLCB3aXRoCisgICAg
Ly8gZnVsbCBicmFuY2ggZnVzaW9uIGluIHRoZSBpbnN0cnVjdGlvbiBzZWxlY3Rvci4gQSB0cnVl
IHZhbHVlIGp1bXBzIHRvIHRoZSBnZW5lcmF0b3IncyBzbG93CisgICAgLy8gcGF0aC4KKyAgICBD
aGVjaywKKworICAgIC8vIFNTQSBzdXBwb3J0LCBpbiB0aGUgc3R5bGUgb2YgREZHIFNTQS4KKyAg
ICBVcHNpbG9uLCAvLyBUaGlzIHVzZXMgdGhlIFVwc2lsb25WYWx1ZSBjbGFzcy4KKyAgICBQaGks
CisKKyAgICAvLyBKdW1wLiBVc2VzIHRoZSBDb250cm9sVmFsdWUgY2xhc3MuCisgICAgSnVtcCwK
KyAgICAKKyAgICAvLyBQb2x5bW9ycGhpYyBicmFuY2gsIHVzYWJsZSB3aXRoIGFueSB2YWx1ZSB0
eXBlLiBCcmFuY2hlcyBpZiBub3QgZXF1YWwgdG8gemVyby4gVXNlcyB0aGUKKyAgICAvLyBDb250
cm9sVmFsdWUgY2xhc3MsIHdpdGggdGhlIDAtaW5kZXggc3VjY2Vzc29yIGJlaW5nIHRoZSB0cnVl
IHN1Y2Nlc3Nvci4KKyAgICBCcmFuY2gsCisKKyAgICAvLyBTd2l0Y2guIFN3aXRjaGVzIG92ZXIg
ZWl0aGVyIEludDMyIG9yIEludDY0LiBVc2VzIHRoZSBTd2l0Y2hWYWx1ZSBjbGFzcy4KKyAgICBT
d2l0Y2gsCisKKyAgICAvLyBSZXR1cm4uIE5vdGUgdGhhdCBCMyBwcm9jZWR1cmVzIGRvbid0IGtu
b3cgdGhlaXIgcmV0dXJuIHR5cGUsIHNvIHRoaXMgY2FuIGp1c3QgcmV0dXJuIGFueQorICAgIC8v
IHR5cGUuIFVzZXMgdGhlIENvbnRyb2xWYWx1ZSBjbGFzcy4KKyAgICBSZXR1cm4sCisKKyAgICAv
LyBUaGlzIGlzIGEgdGVybWluYWwgdGhhdCBpbmRpY2F0ZXMgdGhhdCB3ZSB3aWxsIG5ldmVyIGdl
dCBoZXJlLiBVc2VzIHRoZSBDb250cm9sVmFsdWUgY2xhc3MuCisgICAgT29wcworfTsKKworaW5s
aW5lIGJvb2wgaXNDaGVja01hdGgoT3Bjb2RlIG9wY29kZSkKK3sKKyAgICBzd2l0Y2ggKG9wY29k
ZSkgeworICAgIGNhc2UgQ2hlY2tBZGQ6CisgICAgY2FzZSBDaGVja1N1YjoKKyAgICBjYXNlIENo
ZWNrTXVsOgorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICBkZWZhdWx0OgorICAgICAgICByZXR1
cm4gZmFsc2U7CisgICAgfQorfQorCit9IH0gLy8gbmFtZXNwYWNlIEpTQzo6QjMKKworbmFtZXNw
YWNlIFdURiB7CisKK2NsYXNzIFByaW50U3RyZWFtOworCit2b2lkIHByaW50SW50ZXJuYWwoUHJp
bnRTdHJlYW0mLCBKU0M6OkIzOjpPcGNvZGUpOworCit9IC8vIG5hbWVzcGFjZSBXVEYKKworI2Vu
ZGlmIC8vIEIzT3Bjb2RlX2gKKwpJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzT3Jp
Z2luLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNPcmlnaW4u
Y3BwCShyZXZpc2lvbiAwKQorKysgU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzT3JpZ2luLmNw
cAkod29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDM3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAy
MDE1IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlv
biBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAq
IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcg
Y29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2Ug
Y29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMg
bGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBS
ZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNv
cHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZv
bGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3Ro
ZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElT
IFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAq
IEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRF
RCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBG
SVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBO
TyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZP
UiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFS
WSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBU
TywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1Mg
T0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBI
T1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVS
IElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5F
R0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UK
KyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkg
T0YgU1VDSCBEQU1BR0UuIAorICovCisKKyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJC
M09yaWdpbi5oIgorCituYW1lc3BhY2UgSlNDIHsgbmFtZXNwYWNlIEIzIHsKKwordm9pZCBPcmln
aW46OmR1bXAoUHJpbnRTdHJlYW0mIG91dCkgY29uc3QKK3sKKyAgICBvdXQucHJpbnQoIk9yaWdp
bigiLCBSYXdQb2ludGVyKG1fZGF0YSksICIpIik7Cit9CisKK30gfSAvLyBuYW1lc3BhY2UgSlND
OjpCMworCkluZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNPcmlnaW4uaAo9PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNPcmlnaW4uaAkocmV2aXNpb24gMCkK
KysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM09yaWdpbi5oCSh3b3JraW5nIGNvcHkpCkBA
IC0wLDAgKzEsNTUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTUgQXBwbGUgSW5jLiBBbGwg
cmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNl
IGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUg
cGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUg
bWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRo
ZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMg
YW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBi
aW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3Rp
Y2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIg
aW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlk
ZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklE
RUQgQlkgQVBQTEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVE
IFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJ
RUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElD
VUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExF
IElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElS
RUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFM
IERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQg
T0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisg
KiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBP
TiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklD
VCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJ
U0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FS
RSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisg
Ki8KKworI2lmbmRlZiBCM09yaWdpbl9oCisjZGVmaW5lIEIzT3JpZ2luX2gKKworI2luY2x1ZGUg
PHd0Zi9QcmludFN0cmVhbS5oPgorCituYW1lc3BhY2UgSlNDIHsgbmFtZXNwYWNlIEIzIHsKKwor
Ly8gV2hvZXZlciBnZW5lcmF0ZXMgQjNJUiBjYW4gY2hvb3NlIHRvIHB1dCBvcmlnaW5zIG9uIHZh
bHVlcy4gV2hlbiB5b3UgZG8gdGhpcywgQjMgd2lsbCBiZSBhYmxlIHRvCisvLyBhY2NvdW50LCBk
b3duIHRvIHRoZSBtYWNoaW5lIGNvZGUsIHdoaWNoIGluc3RydWN0aW9uIGNvcnJlc3BvbmRzIHRv
IHdoaWNoIG9yaWdpbi4gQjMKKy8vIHRyYW5zZm9ybWF0aW9ucyBtdXN0IHByZXNlcnZlIE9yaWdp
bnMgY2FyZWZ1bGx5LiBJdCdzIGFuIGVycm9yIHRvIHdyaXRlIGEgdHJhbnNmb3JtYXRpb24gdGhh
dAorLy8gZWl0aGVyIGRyb3BzIE9yaWdpbnMgb3IgbGllcyBhYm91dCB0aGVtLgorY2xhc3MgT3Jp
Z2luIHsKK3B1YmxpYzoKKyAgICBleHBsaWNpdCBPcmlnaW4oY29uc3Qgdm9pZCogZGF0YSA9IG51
bGxwdHIpCisgICAgICAgIDogbV9kYXRhKGRhdGEpCisgICAgeworICAgIH0KKworICAgIGNvbnN0
IHZvaWQqIGRhdGEoKSBjb25zdCB7IHJldHVybiBtX2RhdGE7IH0KKworICAgIHZvaWQgZHVtcChQ
cmludFN0cmVhbSYpIGNvbnN0OworICAgIAorcHJpdmF0ZToKKyAgICBjb25zdCB2b2lkKiBtX2Rh
dGE7Cit9OworCit9IH0gLy8gbmFtZXNwYWNlIEpTQzo6QjMKKworI2VuZGlmIC8vIEIzT3JpZ2lu
X2gKKwpJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzUGF0Y2hwb2ludFZhbHVlLmNw
cAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNQYXRjaHBvaW50VmFs
dWUuY3BwCShyZXZpc2lvbiAwKQorKysgU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzUGF0Y2hw
b2ludFZhbHVlLmNwcAkod29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDQzIEBACisvKgorICogQ29w
eXJpZ2h0IChDKSAyMDE1IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBS
ZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9y
IHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRo
ZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9u
cyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBu
b3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWlt
ZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2Ug
dGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9u
cyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlv
biBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4K
KyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycn
IEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJV
VCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRB
QklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NM
QUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMg
QkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwK
KyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBO
T1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VS
VklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5U
RVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklM
SVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAo
SU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VU
IE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUg
UE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisKKyNpbmNsdWRlICJjb25maWcuaCIK
KyNpbmNsdWRlICJCM1BhdGNocG9pbnRWYWx1ZS5oIgorCisjaW5jbHVkZSA8d3RmL0NvbW1hUHJp
bnRlci5oPgorCituYW1lc3BhY2UgSlNDIHsgbmFtZXNwYWNlIEIzIHsKKworUGF0Y2hwb2ludFZh
bHVlOjp+UGF0Y2hwb2ludFZhbHVlKCkKK3sKK30KKwordm9pZCBQYXRjaHBvaW50VmFsdWU6OmR1
bXBNZXRhKFByaW50U3RyZWFtJiBvdXQpIGNvbnN0Cit7CisgICAgb3V0LnByaW50KCJzdGFja21h
cCA9ICIsIHN0YWNrbWFwKTsKK30KKworfSB9IC8vIG5hbWVzcGFjZSBKU0M6OkIzCisKSW5kZXg6
IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM1BhdGNocG9pbnRWYWx1ZS5oCj09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0K
LS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM1BhdGNocG9pbnRWYWx1ZS5oCShyZXZpc2lv
biAwKQorKysgU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzUGF0Y2hwb2ludFZhbHVlLmgJKHdv
cmtpbmcgY29weSkKQEAgLTAsMCArMSw1NyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNSBB
cHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5k
IHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2Rp
ZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRp
dGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUg
bXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qg
b2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0
cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmln
aHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dp
bmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1h
dGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZU
V0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBS
RVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8s
IFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVT
UyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZF
TlQgU0hBTEwgQVBQTEUgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5Z
IERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9S
IENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisg
KiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVT
RSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZF
UiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBD
T05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdF
TkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBP
RiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNV
Q0ggREFNQUdFLiAKKyAqLworCisjaWZuZGVmIEIzUGF0Y2hwb2ludFZhbHVlX2gKKyNkZWZpbmUg
QjNQYXRjaHBvaW50VmFsdWVfaAorCisjaW5jbHVkZSAiQjNWYWx1ZS5oIgorI2luY2x1ZGUgIkIz
U3RhY2ttYXAuaCIKKworbmFtZXNwYWNlIEpTQyB7IG5hbWVzcGFjZSBCMyB7CisKK2NsYXNzIFBh
dGNocG9pbnRWYWx1ZSA6IHB1YmxpYyBWYWx1ZSB7CitwdWJsaWM6CisgICAgc3RhdGljIGJvb2wg
YWNjZXB0cyhPcGNvZGUgb3Bjb2RlKSB7IHJldHVybiBvcGNvZGUgPT0gUGF0Y2hwb2ludDsgfQor
CisgICAgflBhdGNocG9pbnRWYWx1ZSgpOworCisgICAgU3RhY2ttYXAgc3RhY2ttYXA7CisKK3By
b3RlY3RlZDoKKyAgICB2b2lkIGR1bXBNZXRhKFByaW50U3RyZWFtJikgY29uc3Qgb3ZlcnJpZGU7
CisKK3ByaXZhdGU6CisgICAgZnJpZW5kIGNsYXNzIFByb2NlZHVyZTsKKworICAgIFBhdGNocG9p
bnRWYWx1ZSh1bnNpZ25lZCBpbmRleCwgVHlwZSB0eXBlLCBPcmlnaW4gb3JpZ2luLCBjb25zdCBB
ZGphY2VuY3lMaXN0JiBjaGlsZHJlbikKKyAgICAgICAgOiBWYWx1ZShpbmRleCwgUGF0Y2hwb2lu
dCwgdHlwZSwgb3JpZ2luLCBjaGlsZHJlbikKKyAgICB7CisgICAgfQorfTsKKworfSB9IC8vIG5h
bWVzcGFjZSBKU0M6OkIzCisKKyNlbmRpZiAvLyBCM1BhdGNocG9pbnRWYWx1ZV9oCisKSW5kZXg6
IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM1Byb2NlZHVyZS5jcHAKPT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0g
U291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzUHJvY2VkdXJlLmNwcAkocmV2aXNpb24gMCkKKysr
IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM1Byb2NlZHVyZS5jcHAJKHdvcmtpbmcgY29weSkK
QEAgLTAsMCArMSw1NiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNSBBcHBsZSBJbmMuIEFs
bCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3Vy
Y2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFy
ZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFy
ZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4g
dGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9u
cyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGlu
IGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5v
dGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1l
ciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92
aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9W
SURFRCBCWSBBUFBMRSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJ
RUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1Q
TElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJU
SUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQ
TEUgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5E
SVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJ
QUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVO
VCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IK
KyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5E
IE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RS
SUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVS
V0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRX
QVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLiAK
KyAqLworCisjaW5jbHVkZSAiY29uZmlnLmgiCisjaW5jbHVkZSAiQjNQcm9jZWR1cmUuaCIKKwor
I2luY2x1ZGUgIkIzQmFzaWNCbG9jay5oIgorI2luY2x1ZGUgIkIzVmFsdWUuaCIKKworbmFtZXNw
YWNlIEpTQyB7IG5hbWVzcGFjZSBCMyB7CisKK1Byb2NlZHVyZTo6UHJvY2VkdXJlKCkKK3sKK30K
KworUHJvY2VkdXJlOjp+UHJvY2VkdXJlKCkKK3sKK30KKworQmFzaWNCbG9jayogUHJvY2VkdXJl
OjphZGRCbG9jaygpCit7CisgICAgc3RkOjp1bmlxdWVfcHRyPEJhc2ljQmxvY2s+IGJsb2NrID0g
c3RkOjptYWtlX3VuaXF1ZTxCYXNpY0Jsb2NrPihtX2Jsb2Nrcy5zaXplKCkpOworICAgIEJhc2lj
QmxvY2sqIHJlc3VsdCA9IGJsb2NrLmdldCgpOworICAgIG1fYmxvY2tzLmFwcGVuZChXVEY6Om1v
dmUoYmxvY2spKTsKKyAgICByZXR1cm4gcmVzdWx0OworfQorCit2b2lkIFByb2NlZHVyZTo6ZHVt
cChQcmludFN0cmVhbSYgb3V0KSBjb25zdAoreworICAgIGZvciAoQmFzaWNCbG9jayogYmxvY2sg
OiAqdGhpcykKKyAgICAgICAgb3V0LnByaW50KGRlZXBEdW1wKGJsb2NrKSk7Cit9CisKK30gfSAv
LyBuYW1lc3BhY2UgSlNDOjpCMwpJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzUHJv
Y2VkdXJlLmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzUHJvY2Vk
dXJlLmgJKHJldmlzaW9uIDApCisrKyBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNQcm9jZWR1
cmUuaAkod29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDE3NyBAQAorLyoKKyAqIENvcHlyaWdodCAo
QykgMjAxNSBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmli
dXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0
CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93
aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291
cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0
aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICog
Mi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92
ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRo
ZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29y
IG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICog
VEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5Z
CisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJ
TUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBB
TkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAg
SU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJM
RSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVN
UExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlU
RUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBM
T1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElP
TikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hF
VEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElO
RyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUg
VVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklM
SVRZIE9GIFNVQ0ggREFNQUdFLiAKKyAqLworCisjaWZuZGVmIEIzUHJvY2VkdXJlX2gKKyNkZWZp
bmUgQjNQcm9jZWR1cmVfaAorCisjaW5jbHVkZSA8d3RmL0JhZy5oPgorI2luY2x1ZGUgPHd0Zi9G
YXN0TWFsbG9jLmg+CisjaW5jbHVkZSA8d3RmL05vbmNvcHlhYmxlLmg+CisjaW5jbHVkZSA8d3Rm
L1ZlY3Rvci5oPgorCituYW1lc3BhY2UgSlNDIHsgbmFtZXNwYWNlIEIzIHsKKworY2xhc3MgQmFz
aWNCbG9jazsKK2NsYXNzIFZhbHVlOworCitjbGFzcyBQcm9jZWR1cmUgeworICAgIFdURl9NQUtF
X05PTkNPUFlBQkxFKFByb2NlZHVyZSk7CisgICAgV1RGX01BS0VfRkFTVF9BTExPQ0FURUQ7Citw
dWJsaWM6CisKKyAgICBQcm9jZWR1cmUoKTsKKyAgICB+UHJvY2VkdXJlKCk7CisKKyAgICBCYXNp
Y0Jsb2NrKiBhZGRCbG9jaygpOworICAgIAorICAgIHRlbXBsYXRlPHR5cGVuYW1lIFZhbHVlVHlw
ZSwgdHlwZW5hbWUuLi4gQXJndW1lbnRzPgorICAgIFZhbHVlVHlwZSogYWRkKEFyZ3VtZW50cy4u
Lik7CisKKyAgICB2b2lkIGR1bXAoUHJpbnRTdHJlYW0mKSBjb25zdDsKKworICAgIHVuc2lnbmVk
IHNpemUoKSBjb25zdCB7IHJldHVybiBtX2Jsb2Nrcy5zaXplKCk7IH0KKyAgICBCYXNpY0Jsb2Nr
KiBhdCh1bnNpZ25lZCBpbmRleCkgY29uc3QgeyByZXR1cm4gbV9ibG9ja3NbaW5kZXhdOyB9Cisg
ICAgQmFzaWNCbG9jayogb3BlcmF0b3JbXSh1bnNpZ25lZCBpbmRleCkgY29uc3QgeyByZXR1cm4g
YXQoaW5kZXgpOyB9CisKKyAgICBjbGFzcyBpdGVyYXRvciB7CisgICAgcHVibGljOgorICAgICAg
ICBpdGVyYXRvcigpOgorICAgICAgICAgICAgOiBtX3Byb2NlZHVyZShudWxscHRyKQorICAgICAg
ICAgICAgLCBtX2luZGV4KDApCisgICAgICAgIHsKKyAgICAgICAgfQorCisgICAgICAgIGl0ZXJh
dG9yKFByb2NlZHVyZSYgcHJvY2VkdXJlLCB1bnNpZ25lZCBpbmRleCkKKyAgICAgICAgICAgIDog
bV9wcm9jZWR1cmUoJnByb2NlZHVyZSkKKyAgICAgICAgICAgICwgbV9pbmRleChpbmRleCkKKyAg
ICAgICAgeworICAgICAgICB9CisKKyAgICAgICAgQmFzaWNCbG9jayogb3BlcmF0b3IqKCkKKyAg
ICAgICAgeworICAgICAgICAgICAgcmV0dXJuIG1fcHJvY2VkdXJlLT5hdChtX2luZGV4KTsKKyAg
ICAgICAgfQorCisgICAgICAgIGl0ZXJhdG9yJiBvcGVyYXRvcisrKCkKKyAgICAgICAgeworICAg
ICAgICAgICAgbV9pbmRleCA9IGZpbmROZXh0KG1faW5kZXggKyAxKTsKKyAgICAgICAgICAgIHJl
dHVybiAqdGhpczsKKyAgICAgICAgfQorCisgICAgICAgIGJvb2wgb3BlcmF0b3I9PShjb25zdCBp
dGVyYXRvciYgb3RoZXIpIGNvbnN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBtX2lu
ZGV4ID09IG90aGVyLm1faW5kZXg7CisgICAgICAgIH0KKworICAgICAgICBib29sIG9wZXJhdG9y
IT0oY29uc3QgaXRlcmF0b3ImIG90aGVyKSBjb25zdAorICAgICAgICB7CisgICAgICAgICAgICBy
ZXR1cm4gISgqdGhpcyA9PSBvdGhlcik7CisgICAgICAgIH0KKworICAgIHByaXZhdGU6CisgICAg
ICAgIHVuc2lnbmVkIGZpbmROZXh0KHVuc2lnbmVkIGluZGV4KQorICAgICAgICB7CisgICAgICAg
ICAgICB3aGlsZSAoaW5kZXggPCBtX3Byb2NlZHVyZS0+c2l6ZSgpICYmICFtX3Byb2NlZHVyZS0+
YXQoaW5kZXgpKQorICAgICAgICAgICAgICAgIGluZGV4Kys7CisgICAgICAgICAgICByZXR1cm4g
aW5leDsKKyAgICAgICAgfQorCisgICAgICAgIFByb2NlZHVyZSogbV9wcm9jZWR1cmU7CisgICAg
ICAgIHVuc2lnbmVkIG1faW5kZXg7CisgICAgfTsKKworICAgIGl0ZXJhdG9yIGJlZ2luKCkgY29u
c3QgeyByZXR1cm4gaXRlcmF0b3IoKnRoaXMsIDApOyB9CisgICAgaXRlcmF0b3IgZW5kKCkgY29u
c3QgeyByZXR1cm4gaXRlcmF0b3IoKnRoaXMsIG51bUJsb2NrcygpKTsgfQorCisgICAgY2xhc3Mg
VmFsdWVzQ29sbGVjdGlvbiB7CisgICAgcHVibGljOgorICAgICAgICBWYWx1ZXNDb2xsZWN0aW9u
KFByb2NlZHVyZSYgcHJvY2VkdXJlKQorICAgICAgICAgICAgOiBtX3Byb2NlZHVyZShwcm9jZWR1
cmUpCisgICAgICAgIHsKKyAgICAgICAgfQorCisgICAgICAgIGNsYXNzIGl0ZXJhdG9yIHsKKyAg
ICAgICAgcHVibGljOgorICAgICAgICAgICAgaXRlcmF0b3IoKToKKyAgICAgICAgICAgICAgICA6
IG1fcHJvY2VkdXJlKG51bGxwdHIpCisgICAgICAgICAgICAgICAgLCBtX2luZGV4KDApCisgICAg
ICAgICAgICB7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGl0ZXJhdG9yKFByb2NlZHVy
ZSYgcHJvY2VkdXJlLCB1bnNpZ25lZCBpbmRleCkKKyAgICAgICAgICAgICAgICA6IG1fcHJvY2Vk
dXJlKCZwcm9jZWR1cmUpCisgICAgICAgICAgICAgICAgLCBtX2luZGV4KGluZGV4KQorICAgICAg
ICAgICAgeworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBWYWx1ZSogb3BlcmF0b3IqKCkK
KyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbV9wcm9jZWR1cmUtPmJsb2Nr
KG1faW5kZXgpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpdGVyYXRvciYgb3BlcmF0
b3IrKygpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbV9pbmRleCsrOworICAgICAg
ICAgICAgICAgIHJldHVybiAqdGhpczsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgYm9v
bCBvcGVyYXRvcj09KGNvbnN0IGl0ZXJhdG9yJiBvdGhlcikgY29uc3QKKyAgICAgICAgICAgIHsK
KyAgICAgICAgICAgICAgICByZXR1cm4gbV9pbmRleCA9PSBvdGhlci5tX2luZGV4OworICAgICAg
ICAgICAgfQorCisgICAgICAgICAgICBib29sIG9wZXJhdG9yIT0oY29uc3QgaXRlcmF0b3ImIG90
aGVyKSBjb25zdAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiAhKCp0aGlz
ID09IG90aGVyKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICBwcml2YXRlOgorCisgICAgICAg
ICAgICBQcm9jZWR1cmUqIG1fcHJvY2VkdXJlOworICAgICAgICAgICAgdW5zaWduZWQgbV9pbmRl
eDsKKyAgICAgICAgfTsKKworICAgICAgICBpdGVyYXRvciBiZWdpbigpIGNvbnN0IHsgcmV0dXJu
IGl0ZXJhdG9yKG1fcHJvY2VkdXJlLCAwKTsgfQorICAgICAgICBpdGVyYXRvciBlbmQoKSBjb25z
dCB7IHJldHVybiBpdGVyYXRvcihtX3Byb2NlZHVyZSwgbV9wcm9jZWR1cmUubV92YWx1ZXMuc2l6
ZSgpKTsgfQorCisgICAgICAgIHVuc2lnbmVkIHNpemUoKSBjb25zdCB7IHJldHVybiBtX3Byb2Nl
ZHVyZS5tX3ZhbHVlcy5zaXplKCk7IH0KKyAgICAgICAgVmFsdWUqIGF0KHVuc2lnbmVkIGluZGV4
KSBjb25zdCB7IHJldHVybiBtX3Byb2NlZHVyZS5tX3ZhbHVlc1tpbmRleF07IH0KKyAgICAgICAg
VmFsdWUqIG9wZXJhdG9yW10odW5zaWduZWQgaW5kZXgpIGNvbnN0IHsgcmV0dXJuIGF0KGluZGV4
KTsgfQorICAgICAgICAKKyAgICBwcml2YXRlOgorICAgICAgICBQcm9jZWR1cmUmIG1fcHJvY2Vk
dXJlOworICAgIH07CisKKyAgICBWYWx1ZXNDb2xsZWN0aW9uIHZhbHVlcygpIHsgcmV0dXJuIFZh
bHVlc0NvbGxlY3Rpb24oKnRoaXMpOyB9CisKK3ByaXZhdGU6CisgICAgVmVjdG9yPHN0ZDo6dW5p
cXVlX3B0cjxCYXNpY0Jsb2NrPj4gbV9ibG9ja3M7CisgICAgVmVjdG9yPHN0ZDo6dW5pcXVlX3B0
cjxWYWx1ZT4+IG1fdmFsdWVzOworfTsKKworfSB9IC8vIG5hbWVzcGFjZSBKU0M6OkIzCisKKyNl
bmRpZiAvLyBCM1Byb2NlZHVyZV9oCisKSW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9C
M1Byb2NlZHVyZUlubGluZXMuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUv
YjMvQjNQcm9jZWR1cmVJbmxpbmVzLmgJKHJldmlzaW9uIDApCisrKyBTb3VyY2UvSmF2YVNjcmlw
dENvcmUvYjMvQjNQcm9jZWR1cmVJbmxpbmVzLmgJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSw0
NiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNSBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVz
ZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFy
eSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQg
cHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAx
LiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNv
cHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZv
bGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3Jt
IG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBs
aXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAq
ICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRo
ZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBM
RSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElF
UywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5U
SUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQ
VVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUgor
ICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lE
RU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAo
SU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElU
VVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7
IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVP
UlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElU
WSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lO
RyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElG
IEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLiAKKyAqLworCisjaWZu
ZGVmIEIzUHJvY2VkdXJlSW5saW5lc19oCisjZGVmaW5lIEIzUHJvY2VkdXJlSW5saW5lc19oCisK
KyNpbmNsdWRlICJCM0Jhc2ljQmxvY2suaCIKKyNpbmNsdWRlICJCM1Byb2NlZHVyZS5oIgorCitu
YW1lc3BhY2UgSlNDIHsgbmFtZXNwYWNlIEIzIHsKKwordGVtcGxhdGU8dHlwZW5hbWUgVmFsdWVU
eXBlLCB0eXBlbmFtZS4uLiBBcmd1bWVudHM+CitWYWx1ZVR5cGUqIFByb2NlZHVyZTo6YWRkKEFy
Z3VlbnRzLi4uIGFyZ3VtZW50cykKK3sKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8VmFsdWVUeXBlPiB2
YWx1ZShuZXcgVmFsdWVUeXBlKG1fdmFsdWVzLnNpemUoKSwgYXJndW1lbnRzLi4uKSk7CisgICAg
VmFsdWVUeXBlKiByZXN1bHQgPSB2YWx1ZS5nZXQoKTsKKyAgICBtX3ZhbHVlcy5hcHBlbmQoV1RG
Ojptb3ZlKHZhbHVlKSk7CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworfSB9IC8vIG5hbWVzcGFj
ZSBKU0M6OkIzCisKKyNlbmRpZiAvLyBCM1Byb2NlZHVyZUlubGluZXNfaAorCkluZGV4OiBTb3Vy
Y2UvSmF2YVNjcmlwdENvcmUvYjMvQjNTdGFja1Nsb3RLaW5kLmNwcAo9PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBT
b3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNTdGFja1Nsb3RLaW5kLmNwcAkocmV2aXNpb24gMCkK
KysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM1N0YWNrU2xvdEtpbmQuY3BwCSh3b3JraW5n
IGNvcHkpCkBAIC0wLDAgKzEsNTEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTUgQXBwbGUg
SW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2Ug
aW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0
aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25z
CisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3Qg
cmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNv
bmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0
aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Cisg
KiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRp
c2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlh
bHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUg
SVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBP
UiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUK
KyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9S
IEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNI
QUxMIEFQUExFIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJF
Q1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05T
RVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJP
Q1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERB
VEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FV
U0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJB
Q1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBP
UiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJ
UyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERB
TUFHRS4gCisgKi8KKworI2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgIlN0YWNrU2xvdEtp
bmQuaCIKKworI2luY2x1ZGUgPHd0Zi9QcmludFN0cmVhbS5oPgorCituYW1lc3BhY2UgV1RGIHsK
KwordXNpbmcgbmFtZXNwYWNlIEpTQzo6QjM7CisKK3ZvaWQgcHJpbnRJbnRlcm5hbChQcmludFN0
cmVhbSYgb3V0LCBTdGFja1Nsb3RLaW5kIGtpbmQpCit7CisgICAgc3dpdGNoIChraW5kKSB7Cisg
ICAgY2FzZSBTdGFja1Nsb3RLaW5kOjpMb2NrZWQ6CisgICAgICAgIG91dC5wcmludCgiTG9ja2Vk
Iik7CisgICAgICAgIHJldHVybjsKKyAgICBjYXNlIFN0YWNrU2xvdEtpbmQ6OkFub255bW91czoK
KyAgICAgICAgb3V0LnByaW50KCJBbm9ueW1vdXMiKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0K
KyAgICBSRUxFQVNFX0FTU0VSVF9OT1RfUkVBQ0hFRCgpOworfQorCit9IC8vIG5hbWVzcGFjZSBX
VEYKKworCisKSW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM1N0YWNrU2xvdEtpbmQu
aAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNTdGFja1Nsb3RLaW5k
LmgJKHJldmlzaW9uIDApCisrKyBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNTdGFja1Nsb3RL
aW5kLmgJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSw1NCBAQAorLyoKKyAqIENvcHlyaWdodCAo
QykgMjAxNSBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmli
dXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0
CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93
aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291
cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0
aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICog
Mi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92
ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRo
ZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29y
IG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICog
VEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5Z
CisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJ
TUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBB
TkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAg
SU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJM
RSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVN
UExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlU
RUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBM
T1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElP
TikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hF
VEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElO
RyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUg
VVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklM
SVRZIE9GIFNVQ0ggREFNQUdFLiAKKyAqLworCisjaWZuZGVmIEIzU3RhY2tTbG90S2luZF9oCisj
ZGVmaW5lIEIzU3RhY2tTbG90S2luZF9oCisKK25hbWVzcGFjZSBKU0MgeyBuYW1lc3BhY2UgQjMg
eworCitlbnVtIGNsYXNzIFN0YWNrU2xvdEtpbmQgOiB1aW50OF90IHsKKyAgICAvLyBBIGxvY2tl
ZCBzdGFjayBzbG90IG5lZWRzIHRvIGJlIGtlZXAgZGlzam9pbnQgZnJvbSBhbGwgb3RoZXJzIGJl
Y2F1c2Ugd2UgaW50ZW5kIHRvIGVzY2FwZQorICAgIC8vIGl0IGV2ZW4gaWYgdGhhdCdzIG5vdCBv
YnZpb3VzLiBUaGlzIGhhcHBlbnMgd2hlbiB0aGUgcnVudGltZSB0YWtlcyB0aGUgYWRkcmVzcyBv
ZiBhIHN0YWNrCisgICAgLy8gc2xvdC4KKyAgICBMb2NrZWQsCisKKyAgICAvLyBUaGVzZSBzdGFj
ayBzbG90cyBjb3VsZCBzaGFyZSBzcGFjZSB3aXRoIG90aGVyIHN0YWNrIHNsb3RzLCBwcm92aWRl
ZCB0aGF0IHRoZXkgYXJlbid0IGxpdmUKKyAgICAvLyBhdCB0aGUgc2FtZSB0aW1lLiBUaGUgY29t
cGlsZXIgc3RpbGwgaGFzIHRvIGRvIGVzY2FwZSBhbmFseXNpcywgc2luY2UgdGhlc2UgY2FuIGJl
IGVzY2FwZWQKKyAgICAvLyBleHBsaWNpdGx5IGluIElSLgorICAgIEFub255bW91cworfTsKKwor
fSB9IC8vIG5hbWVzcGFjZSBKU0M6OkIzCisKK25hbWVzcGFjZSBXVEYgeworCitjbGFzcyBQcmlu
dFN0cmVhbTsKKwordm9pZCBwcmludEludGVybmFsKFByaW50U3RyZWFtJiwgSlNDOjpCMzo6U3Rh
Y2tTbG90S2luZCk7CisKK30gLy8gbmFtZXNwYWNlIFdURgorCisjZW5kaWYgLy8gQjNTdGFja1Ns
b3RLaW5kX2gKKwpJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzU3RhY2tTbG90VmFs
dWUuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM1N0YWNrU2xv
dFZhbHVlLmNwcAkocmV2aXNpb24gMCkKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM1N0
YWNrU2xvdFZhbHVlLmNwcAkod29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDQxIEBACisvKgorICog
Q29weXJpZ2h0IChDKSAyMDE1IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisg
KiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRo
IG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0
IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0
aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAg
ICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2Ns
YWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1
Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0
aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRh
dGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlv
bi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gYGBBUyBJ
UycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcs
IEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hB
TlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJ
U0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SCisgKiBDT05UUklCVVRP
UlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lB
TCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJV
VCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1Ig
U0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1Mg
SU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElB
QklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisg
KiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkg
T1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBU
SEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisKKyNpbmNsdWRlICJjb25maWcu
aCIKKyNpbmNsdWRlICJCM1N0YWNrU2xvdFZhbHVlLmgiCisKK25hbWVzcGFjZSBKU0MgeyBuYW1l
c3BhY2UgQjMgeworCitTdGFja1Nsb3RWYWx1ZTo6flN0YWNrU2xvdFZhbHVlKCkKK3sKK30KKwor
dm9pZCBTdGFja1Nsb3RWYWx1ZTo6ZHVtcE1ldGEoUHJpbnRTdHJlYW0mIG91dCkgY29uc3QKK3sK
KyAgICBvdXQucHJpbnQoImJ5dGVTaXplID0gIiwgbV9ieXRlU2l6ZSwgIiwga2luZCA9ICIsIG1f
a2luZCk7Cit9CisKK30gfSAvLyBuYW1lc3BhY2UgSlNDOjpCMworCkluZGV4OiBTb3VyY2UvSmF2
YVNjcmlwdENvcmUvYjMvQjNTdGFja1Nsb3RWYWx1ZS5oCj09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9K
YXZhU2NyaXB0Q29yZS9iMy9CM1N0YWNrU2xvdFZhbHVlLmgJKHJldmlzaW9uIDApCisrKyBTb3Vy
Y2UvSmF2YVNjcmlwdENvcmUvYjMvQjNTdGFja1Nsb3RWYWx1ZS5oCSh3b3JraW5nIGNvcHkpCkBA
IC0wLDAgKzEsNzQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTUgQXBwbGUgSW5jLiBBbGwg
cmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNl
IGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUg
cGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUg
bWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRo
ZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMg
YW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBi
aW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3Rp
Y2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIg
aW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlk
ZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklE
RUQgQlkgQVBQTEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVE
IFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJ
RUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElD
VUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExF
IElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElS
RUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFM
IERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQg
T0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisg
KiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBP
TiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklD
VCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJ
U0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FS
RSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisg
Ki8KKworI2lmbmRlZiBCM1N0YWNrU2xvdFZhbHVlX2gKKyNkZWZpbmUgQjNTdGFja1Nsb3RWYWx1
ZV9oCisKKyNpbmNsdWRlICJCM1ZhbHVlLmgiCisjaW5jbHVkZSAiQjNTdGFja1Nsb3RLaW5kLmgi
CisKK25hbWVzcGFjZSBKU0MgeyBuYW1lc3BhY2UgQjMgeworCituYW1lc3BhY2UgQWlyIHsKK2Ns
YXNzIFN0YWNrU2xvdDsKK30gLy8gbmFtZXNwYWNlIEFpcgorCitjbGFzcyBTdGFja1Nsb3RWYWx1
ZSA6IHB1YmxpYyBWYWx1ZSB7CitwdWJsaWM6CisgICAgc3RhdGljIGJvb2wgYWNjZXB0cyhPcGNv
ZGUgb3Bjb2RlKSB7IHJldHVybiBvcGNvZGUgPT0gU3RhY2tTbG90OyB9CisKKyAgICB+U3RhY2tT
bG90VmFsdWUoKTsKKworICAgIHVuc2lnbmVkIGJ5dGVTaXplKCkgY29uc3QgeyByZXR1cm4gbV9i
eXRlU2l6ZTsgfQorICAgIFN0YWNrU2xvdEtpbmQga2luZCgpIGNvbnN0IHsgcmV0dXJuIG1fa2lu
ZDsgfQorCisgICAgLy8gVGhpcyBnZXRzIGFzc2lnbmVkIGF0IHRoZSBlbmQgb2YgY29tcGlsYXRp
b24uIFlvdSBjYW5ub3QgcmVseSBvbiBpdCBoYXZpbmcgYSBtZWFuaW5nZnVsCisgICAgLy8gdmFs
dWUgd2hpbGUgdGhlIGNvbXBpbGVyIGlzIHJ1bm5pbmcuCisgICAgaW50cHRyX3Qgb2Zmc2V0RnJv
bUZQKCkgY29uc3QgeyByZXR1cm4gbV9vZmZzZXRGcm9tRlA7IH0KKworcHJvdGVjdGVkOgorICAg
IHZvaWQgZHVtcE1ldGEoUHJpbnRTdHJlYW0mKSBjb25zdCBvdmVycmlkZTsKKworcHJpdmF0ZToK
KyAgICBmcmllbmQgY2xhc3MgUHJvY2VkdXJlOworICAgIGZyaWVuZCBjbGFzcyBBaXI6OlN0YWNr
U2xvdDsKKworICAgIFN0YWNrU2xvdFZhbHVlKHVuc2lnbmVkIGluZGV4LCBPcmlnaW4gb3JpZ2lu
LCB1bnNpZ25lZCBieXRlU2l6ZSwgU3RhY2tTbG90S2luZCBraW5kKQorICAgICAgICA6IFZhbHVl
KGluZGV4LCBTdGFja1Nsb3QsIHBvaW50ZXIoKSwgb3JpZ2luKQorICAgICAgICAsIG1fYnl0ZVNp
emUoYnl0ZVNpemUpCisgICAgICAgICwgbV9raW5kKGtpbmQpCisgICAgICAgICwgbV9vZmZzZXRG
cm9tRlAoMCkKKyAgICB7CisgICAgfQorCisgICAgdW5zaWduZWQgbV9ieXRlU2l6ZTsKKyAgICBT
dGFja1Nsb3RLaW5kIG1fa2luZDsKKyAgICBpbnRwdHJfdCBtX29mZnNldEZyb21GUDsKK307CisK
K30gfSAvLyBuYW1lc3BhY2UgSlNDOjpCMworCisjZW5kaWYgLy8gQjNTdGFja1Nsb3RWYWx1ZV9o
CisKSW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM1N0YWNrbWFwLmNwcAo9PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNTdGFja21hcC5jcHAJKHJldmlzaW9u
IDApCisrKyBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNTdGFja21hcC5jcHAJKHdvcmtpbmcg
Y29weSkKQEAgLTAsMCArMSw0MCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNSBBcHBsZSBJ
bmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBp
biBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRp
b24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMK
KyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCBy
ZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29u
ZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRp
b25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAq
ICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlz
Y2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFs
cyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJ
UyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9S
IElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQor
ICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1Ig
QSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hB
TEwgQVBQTEUgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVD
VCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNF
UVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9D
VVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFU
QSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVT
RUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFD
VCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9S
IE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElT
IFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFN
QUdFLiAKKyAqLworCisjaW5jbHVkZSAiY29uZmlnLmgiCisjaW5jbHVkZSAiQjNTdGFja21hcC5o
IgorCituYW1lc3BhY2UgSlNDIHsgbmFtZXNwYWNlIEIzIHsKKwordm9pZCBTdGFja21hcDo6ZHVt
cChQcmludFN0cmVhbSYgb3V0KSBjb25zdAoreworICAgIG91dC5wcmludCgKKyAgICAgICAgIntv
cGFxdWUgPSAiLCBSYXdQb2ludGVyKG1fb3BhcXVlKSwgIiwgcmVwcyA9ICIsIGxpc3REdW1wKG1f
cmVwcyksCisgICAgICAgICIsIGdlbmVyYXRvciA9ICIsIFJhd1BvaW50ZXIobV9nZW5lcmF0b3Iu
Z2V0KCkpLCAiLCBjbG9iYmVyZWQgPSAiLCBtX2Nsb2JiZXJlZCwKKyAgICAgICAgIiwgdXNlZFJl
Z2lzdGVycyA9ICIsIG1fdXNlZFJlZ2lzdGVycywgIn0iKTsKK30KKworfSB9IC8vIG5hbWVzcGFj
ZSBKU0M6OkIzCisKSW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM1N0YWNrbWFwLmgK
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzU3RhY2ttYXAuaAkocmV2
aXNpb24gMCkKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM1N0YWNrbWFwLmgJKHdvcmtp
bmcgY29weSkKQEAgLTAsMCArMSwxMjYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTUgQXBw
bGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1
c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZp
Y2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRp
b25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11
c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9m
IGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJp
YnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0
CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5n
IGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRl
cmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdB
UkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVT
UyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBU
SEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1Mg
Rk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5U
IFNIQUxMIEFQUExFIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBE
SVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBD
T05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICog
UFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0Us
IERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIg
Q0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09O
VFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5D
RSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0Yg
VEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNI
IERBTUFHRS4gCisgKi8KKworI2lmbmRlZiBCM1N0YWNrbWFwX2gKKyNkZWZpbmUgQjNTdGFja21h
cF9oCisKKyNpbmNsdWRlICJCM1ZhbHVlUmVwLmgiCisjaW5jbHVkZSAiQ0NhbGxIZWxwZXJzLmgi
CisjaW5jbHVkZSAiUmVnaXN0ZXJTZXQuaCIKKyNpbmNsdWRlIDx3dGYvU2hhcmVkVGFzay5oPgor
CituYW1lc3BhY2UgSlNDIHsgbmFtZXNwYWNlIEIzIHsKKworY2xhc3MgQ2hlY2tTcGVjaWFsOwor
Y2xhc3MgU3RhY2ttYXBTcGVjaWFsOworY2xhc3MgVmFsdWU7CisKK2NsYXNzIFN0YWNrbWFwIHsK
K3B1YmxpYzoKKyAgICBzdHJ1Y3QgR2VuZXJhdGlvblBhcmFtcyB7CisgICAgICAgIC8vIFRoaXMg
aXMgdGhlIFZhbHVlIGNvbnRhaW5pbmcgdGhlIHN0YWNrbWFwLgorICAgICAgICBWYWx1ZSogdmFs
dWU7CisKKyAgICAgICAgLy8gVGhpcyBpcyB0aGUgc3RhY2ttYXAuCisgICAgICAgIFN0YWNrbWFw
KiBzdGFja21hcDsKKworICAgICAgICAvLyBUaGlzIHRlbGxzIHlvdSB0aGUgYWN0dWFsIHZhbHVl
IHJlcHJlc2VudGF0aW9ucyB0aGF0IHdlcmUgY2hvc2VuLgorICAgICAgICBWZWN0b3I8VmFsdWVS
ZXA+IHJlcHM7CisKKyAgICAgICAgLy8gVGhpcyB0ZWxscyB5b3UgdGhlIHJlZ2lzdGVycyB0aGF0
IHdlcmUgdXNlZC4KKyAgICAgICAgUmVnaXN0ZXJTZXQgdXNlZFJlZ2lzdGVyczsKKyAgICB9Owor
ICAgIAorICAgIHR5cGVkZWYgdm9pZCBHZW5lcmF0b3JGdW5jdGlvbihDQ2FsbEhlbHBlcnMmLCBj
b25zdCBHZW5lcmF0aW9uUGFyYW1zJik7CisgICAgdHlwZWRlZiBTaGFyZWRUYXNrPEdlbmVyYXRv
ckZ1bmN0aW9uPiBHZW5lcmF0b3I7CisgICAgCisgICAgU3RhY2ttYXAoKQorICAgIHsKKyAgICB9
CisKKyAgICAvLyBTZXQgc29tZSBvcGFxdWUgZGF0YSB0byBpZGVudGlmeSB0aGlzIHN0YWNrbWFw
LiBUaGlzIGlzIHVzZWZ1bCBiZWNhdXNlIGEgU3RhY2ttYXAtdXNpbmcgVmFsdWUKKyAgICAvLyBj
YW4gYmUgZHVwbGljYXRlZCwgYW5kIGVhY2ggZHVwbGljYXRlIG1heSBlbmQgdXAgaGF2aW5nIGRp
ZmZlcmVudCByZWdpc3RlciBhbGxvY2F0aW9uLiBUaGlzCisgICAgLy8gYWxsb3dzIGFsbCBvZiB0
aG9zZSBkdXBsaWNhdGVzIHRvIGJlIGFibGUgdG8gcmVmZXIgYmFjayB0byB3aGF0ZXZlciBoaWdo
LWxldmVsIGRhdGEgc3RydWN0dXJlcworICAgIC8vIHdlIHdlcmUgdXNpbmcgdG8gY3JlYXRlIHRo
ZSB2YWx1ZS4KKyAgICB2b2lkIHNldE9wYXF1ZSh2b2lkKiBwYXJhbWV0ZXIpCisgICAgeworICAg
ICAgICBtX29wYXF1ZSA9IHBhcmFtZXRlcjsKKyAgICB9CisgICAgdm9pZCogb3BhcXVlKCkgY29u
c3QgeyByZXR1cm4gbV9vcGFxdWU7IH0KKworICAgIC8vIENvbnZlbmllbmNlIGhlbHBlcnMgd2hl
biB1c2luZyBpbmRpY2VzIGluc3RlYWQgb2YgcG9pbnRlcnMuCisgICAgdm9pZCBzZXRPcGFxdWVJ
bmRleChzaXplX3QgaW5kZXgpCisgICAgeworICAgICAgICBzZXRPcGFxdWUoYml0d2lzZV9jYXN0
PHZvaWQqPihpbmRleCkpOworICAgIH0KKyAgICBzaXplX3Qgb3BhcXVlSW5kZXgoKSBjb25zdCB7
IHJldHVybiBiaXR3aXNlX2Nhc3Q8c2l6ZV90PihvcGFxdWUoKSk7IH0KKworICAgIC8vIENvbnN0
cmFpbiBhbiBhcmd1bWVudCB0byB0aGUgVmFsdWUgdGhhdCB1c2VzIHRoaXMgU3RhY2ttYXAuIE5v
dGUgdGhhdCBpbmRleCB6ZXJvIHJlZmVycyB0byB0aGUKKyAgICAvLyBmaXJzdCBhcmd1bWVudCB0
byB0aGF0IFZhbHVlLCBldmVuIGlmIHRoYXQgYXJndW1lbnQgaXMgbm90IGNvbnN0cmFpbmFibGUu
IEZvciBleGFtcGxlLCBpbiBhCisgICAgLy8gQ2hlY2tBZGQgdmFsdWUsIGl0IHdvdWxkIGJlIGFu
IGVycm9yIHRvIGNvbnN0cmFpbiBpbmRpY2VzIDAgYW5kIDEuIEluIGEgQ2hlY2sgdmFsdWUsIGl0
IHdvdWxkCisgICAgLy8gYmUgYW4gZXJyb3IgdG8gY29uc3RyYWluIGluZGV4IDAuIEJ1dCwgd2hl
biB0aGUgZ2VuZXJhdGlvbiBjYWxsYmFjayBpcyBjYWxsZWQsIHlvdSBjYW4gZGVwZW5kCisgICAg
Ly8gb24gdGhlIHJlcHMgZm9yIHRob3NlIGluZGljZXMgYmVpbmcgZmlsbGVkIGluLgorICAgIHZv
aWQgY29uc3RyYWluKHVuc2lnbmVkIGluZGV4LCBjb25zdCBWYWx1ZVJlcCYgcmVwKQorICAgIHsK
KyAgICAgICAgaWYgKGluZGV4ICsgMSA8IG1fcmVwcy5zaXplKCkpCisgICAgICAgICAgICBtX3Jl
cHMuZ3JvdyhpbmRleCArIDEpOworICAgICAgICBtX3JlcHNbaW5kZXhdID0gcmVwOworICAgIH0K
KworICAgIHZvaWQgY2xvYmJlcihjb25zdCBSZWdpc3RlclNldCYgc2V0KQorICAgIHsKKyAgICAg
ICAgbV9jbG9iYmVyZWQubWVyZ2Uoc2V0KTsKKyAgICB9CisKKyAgICBjb25zdCBSZWdpc3RlclNl
dCYgY2xvYmJlcmVkKCkgY29uc3QgeyByZXR1cm4gbV9jbG9iYmVyZWQ7IH0KKworICAgIHZvaWQg
c2V0R2VuZXJhdG9yKFJlZlB0cjxHZW5lcmF0b3I+IGdlbmVyYXRvcikKKyAgICB7CisgICAgICAg
IG1fZ2VuZXJhdG9yID0gZ2VuZXJhdG9yOworICAgIH0KKworICAgIHRlbXBsYXRlPHR5cGVuYW1l
IEZ1bmN0b3I+CisgICAgdm9pZCBzZXRHZW5lcmF0b3IoY29uc3QgRnVuY3RvciYgZnVuY3RvcikK
KyAgICB7CisgICAgICAgIG1fZ2VuZXJhdG9yID0gY3JlYXRlU2hhcmVkVGFzazxHZW5lcmF0b3JG
dW5jdGlvbj4oZnVuY3Rvcik7CisgICAgfQorCisgICAgdm9pZCBkdW1wKFByaW50U3RyZWFtJikg
Y29uc3Q7CisgICAgCitwcml2YXRlOgorICAgIGZyaWVuZCBjbGFzcyBDaGVja1NwZWNpYWw7Cisg
ICAgZnJpZW5kIGNsYXNzIFN0YWNrbWFwU3BlY2lhbDsKKyAgICAKKyAgICB2b2lkKiBtX29wYXF1
ZSB7IG51bGxwdHIgfTsKKyAgICBWZWN0b3I8VmFsdWVSZXA+IG1fcmVwczsKKyAgICBSZWZQdHI8
R2VuZXJhdG9yPiBtX2dlbmVyYXRvcjsKKyAgICBSZWdpc3RlclNldCBtX2Nsb2JiZXJlZDsKKyAg
ICBSZWdpc3RlclNldCBtX3VzZWRSZWdpc3RlcnM7IC8vIFN0YWNrbWFwcyBjb3VsZCBiZSBmdXJ0
aGVyIGR1cGxpY2F0ZWQgYnkgQWlyLCBidXQgdGhhdCdzIHVubGlrZWx5LCBzbyB3ZSBqdXN0IG1l
cmdlIHRoZSB1c2VkIHJlZ2lzdGVycyBzZXRzIGlmIHRoYXQgd2VyZSB0byBoYXBwZW4uCit9Owor
Cit9IH0gLy8gbmFtZXNwYWNlIEpTQzo6QjMKKworI2VuZGlmIC8vIEIzU3RhY2ttYXBfaAorCklu
ZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNTdGFja21hcFNwZWNpYWwuY3BwCj09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM1N0YWNrbWFwU3BlY2lhbC5jcHAJ
KHJldmlzaW9uIDApCisrKyBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNTdGFja21hcFNwZWNp
YWwuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsMjQyIEBACisvKgorICogQ29weXJpZ2h0
IChDKSAyMDE1IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3Ry
aWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhv
dXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xs
b3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBz
b3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2Us
IHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisg
KiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFi
b3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQg
dGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQv
b3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisg
KiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBB
TlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1Qg
TElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZ
IEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQu
ICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElB
QkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVY
RU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElN
SVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7
IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBU
SU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBX
SEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVE
SU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRI
RSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lC
SUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisKKyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNs
dWRlICJCM1N0YWNrbWFwU3BlY2lhbC5oIgorCituYW1lc3BhY2UgSlNDIHsgbmFtZXNwYWNlIEIz
IHsKKwordXNpbmcgbmFtZXNwYWNlIEFpcjsKKworU3RhY2ttYXBTcGVjaWFsOjpTdGFja21hcFNw
ZWNpYWwoY29uc3QgY2hhciogbmFtZSkKKyAgICA6IFNwZWNpYWwobmFtZSkKK3sKK30KKworU3Rh
Y2ttYXBTcGVjaWFsOjp+U3RhY2ttYXBTcGVjaWFsKCkKK3sKK30KKwordm9pZCBTdGFja21hcFNw
ZWNpYWw6OmZvckVhY2hBcmcoSW5zdCYgaW5zdCwgY29uc3QgU2NvcGVkTGFtYmRhPEluc3Q6OkVh
Y2hBcmdDYWxsYmFjaz4mIGNhbGxiYWNrKQoreworICAgIHJldHVybiBmb3JFYWNoQXJnSW1wbCgw
LCAxLCBpbnN0LCBjYWxsYmFjayk7Cit9CisKK2Jvb2wgU3RhY2ttYXBTcGVjaWFsOjppc1ZhbGlk
KEluc3QmIGluc3QpCit7CisgICAgcmV0dXJuIGlzVmFsaWRJbXBsKDAsIDEsIGluc3QpOworfQor
Citib29sIFN0YWNrbWFwU3BlY2lhbDo6YWRtaXRzU3RhY2soSW5zdCYgaW5zdCwgdW5zaWduZWQg
YXJnSW5kZXgpCit7CisgICAgcmV0dXJuIGFkbWl0c1N0YWNrKDAsIDEsIGluc3QsIGFyZ0luZGV4
KTsKK30KKwordm9pZCBTdGFja21hcFNwZWNpYWw6OnJlcG9ydFVzZWRSZWdpc3RlcnMoSW5zdCYg
aW5zdCwgY29uc3QgUmVnaXN0ZXJTZXQmIHVzZWRSZWdpc3RlcnMpCit7CisgICAgVmFsdWUqIHZh
bHVlID0gaW5zdC5vcmlnaW47CisgICAgU3RhY2ttYXAqIHN0YWNrbWFwID0gdmFsdWUtPnN0YWNr
bWFwKCk7CisKKyAgICAvLyBGSVhNRTogSWYgdGhlIEluc3QgdGhhdCB1c2VzIHRoZSBTdGFja21h
cFNwZWNpYWwgZ2V0cyBkdXBsaWNhdGVkLCB0aGVuIHdlIGVuZCB1cCBtZXJnaW5nIHVzZWQKKyAg
ICAvLyByZWdpc3RlciBzZXRzIGZyb20gbXVsdGlwbGUgcGxhY2VzLiBUaGlzIGN1cnJlbnRseSB3
b24ndCBoYXBwZW4gc2luY2UgQWlyIGRvZXNuJ3QgaGF2ZSB0YWlsZHVwCisgICAgLy8gb3IgdGhp
bmdzIGxpa2UgdGhhdC4gQnV0IG1heWJlIGV2ZW50dWFsbHkgaXQgY291bGQgYmUgYSBwcm9ibGVt
LgorICAgIHN0YWNrbWFwLT5tX3VzZWRSZWdpc3RlcnMubWVyZ2UodXNlZFJlZ2lzdGVycyk7Cit9
CisKK2NvbnN0IFJlZ2lzdGVyU2V0JiBTdGFja21hcFNwZWNpYWw6OmV4dHJhQ2xvYmJlcmVkUmVn
cyhJbnN0JiBpbnN0KQoreworICAgIFZhbHVlKiB2YWx1ZSA9IGluc3Qub3JpZ2luOworICAgIFN0
YWNrbWFwKiBzdGFja21hcCA9IHZhbHVlLT5zdGFja21hcCgpOworCisgICAgcmV0dXJuIHN0YWNr
bWFwLT5jbG9iYmVyZWQoKTsKK30KKwordm9pZCBTdGFja21hcFNwZWNpYWw6OmZvckVhY2hBcmdJ
bXBsKAorICAgIHVuc2lnbmVkIG51bUlnbm9yZWRCM0FyZ3MsIHVuc2lnbmVkIG51bUlnbm9yZWRB
aXJBcmdzLAorICAgIEluc3QmIGluc3QsIGNvbnN0IFNjb3BlZExhbWJkYTxJbnN0OjpFYWNoQXJn
Q2FsbGJhY2s+JiBjYWxsYmFjaykKK3sKKyAgICBWYWx1ZSogdmFsdWUgPSBpbnN0Lm9yaWdpbjsK
KworICAgIC8vIENoZWNrIHRoYXQgaW5zYW5lIHRoaW5ncyBoYXZlIG5vdCBoYXBwZW5lZC4KKyAg
ICBBU1NFUlQoaW5zdC5hcmdzLnNpemUoKSA+PSBudW1JZ25vcmVkQWlyQXJncyk7CisgICAgQVNT
RVJUKHZhbHVlLT5jaGlsZHJlbi5zaXplKCkgPj0gbnVtSWdub3JlZEIzQXJncyk7CisgICAgQVNT
RVJUKGluc3QuYXJncy5zaXplKCkgLSBudW1JZ25vcmVkQWlyQXJncyA9PSB2YWx1ZS0+Y2hpbGRy
ZW4uc2l6ZSgpIC0gbnVtSWdub3JlZEIzQXJncyk7CisgICAgCisgICAgZm9yICh1bnNpZ25lZCBp
ID0gMDsgaSA8IGluc3QuYXJncy5zaXplKCkgLSBudW1JZ25vcmVkQjNBcmdzOyArK2kpIHsKKyAg
ICAgICAgQXJnJiBhcmcgPSBpbnN0LmFyZ3NbaSArIG51bUlnbm9yZWRCM0FyZ3NdOworICAgICAg
ICBWYWx1ZSogY2hpbGQgPSB2YWx1ZS0+Y2hpbGQoaSArIG51bUlnbm9yZWRBaXJBcmdzKTsKKwor
ICAgICAgICBjYWxsYmFjayhhcmcsIEFyZzo6VXNlLCBBcmc6OnR5cGVGb3JCM1R5cGUoY2hpbGQt
PnR5cGUoKSkpOworICAgIH0KK30KKworYm9vbCBTdGFja21hcFNwZWNpYWw6OmlzVmFsaWRJbXBs
KAorICAgIHVuc2lnbmVkIG51bUlnbm9yZWRCM0FyZ3MsIHVuc2lnbmVkIG51bUlnbm9yZWRBcmdB
cmdzLAorICAgIEluc3QmIGluc3QpCit7CisgICAgVmFsdWUqIHZhbHVlID0gaW5zdC5vcmlnaW47
CisKKyAgICAvLyBDaGVjayB0aGF0IGluc2FuZSB0aGluZ3MgaGF2ZSBub3QgaGFwcGVuZWQuCisg
ICAgQVNTRVJUKGluc3QuYXJncy5zaXplKCkgPj0gbnVtSWdub3JlZEFpckFyZ3MpOworICAgIEFT
U0VSVCh2YWx1ZS0+Y2hpbGRyZW4uc2l6ZSgpID49IG51bUlnbm9yZWRCM0FyZ3MpOworCisgICAg
U3RhY2ttYXAqIHN0YWNrbWFwID0gdmFsdWUtPnN0YWNrbWFwKCk7CisKKyAgICBBU1NFUlQoc3Rh
Y2ttYXApOworCisgICAgLy8gRm9yIHRoZSBJbnN0IHRvIGJlIHZhbGlkLCBpdCBuZWVkcyB0byBo
YXZlIHRoZSByaWdodCBudW1iZXIgb2YgYXJndW1lbnRzLgorICAgIGlmIChpbnN0LmFyZ3Muc2l6
ZSgpIC0gbnVtSWdub3JlZEFpckFyZ3MgIT0gdmFsdWUtPmNoaWxkcmVuLnNpemUoKSAtIG51bUln
bm9yZWRCM0FyZ3MpCisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgIC8vIFJlZ2FyZGxlc3Mg
b2YgY29uc3RyYWludHMsIHN0YWNrbWFwcyBoYXZlIHNvbWUgYmFzaWMgcmVxdWlyZW1lbnRzIGZv
ciB0aGVpciBhcmd1bWVudHMuIEZvcgorICAgIC8vIGV4YW1wbGUsIHlvdSBjYW4ndCBoYXZlIGEg
bm9uLUZQLW9mZnNldCBhZGRyZXNzLiBUaGlzIHZlcmlmaWVzIHRob3NlIGNvbmRpdGlvbnMgYXMg
d2VsbCBhcyB0aGUKKyAgICAvLyBhcmd1bWVudCB0eXBlcy4KKyAgICBmb3IgKHVuc2lnbmVkIGkg
PSAwOyBpIDwgaW5zdC5hcmdzLnNpemUoKSAtIG51bUlnbm9yZWRCM0FyZ3M7ICsraSkgeworICAg
ICAgICBWYWx1ZSogY2hpbGQgPSB2YWx1ZS0+Y2hpbGQoaSArIG51bUlnbm9yZWRCM0FyZ3MpOwor
ICAgICAgICBBcmcmIGFyZyA9IGluc3QuYXJnc1tpICsgbnVtSWdub3JlZEFpckFyZ3NdOworICAg
ICAgICAKKyAgICAgICAgc3dpdGNoIChhcmcua2luZCgpKSB7CisgICAgICAgIGNhc2UgQXJnOjpU
bXA6CisgICAgICAgIGNhc2UgQXJnOjpJbW06CisgICAgICAgIGNhc2UgQXJnOjpJbW02NDoKKyAg
ICAgICAgY2FzZSBBcmc6OlN0YWNrOgorICAgICAgICBjYXNlIEFyZzo6Q2FsbEFyZzoKKyAgICAg
ICAgICAgIGJyZWFrOyAvLyBPSworICAgICAgICBjYXNlIEFyZzo6QWRkcjoKKyAgICAgICAgICAg
IGlmIChhcmcuYmFzZSgpICE9IFRtcChHUFJJbmZvOjpjYWxsRnJhbWVSZWdpc3RlcikgJiYKKyAg
ICAgICAgICAgICAgICBhcmcuYmFzZSgpICE9IFRtcChNYWNyb0Fzc2VtYmxlcjo6c3RhY2tQb2lu
dGVyUmVnaXN0ZXIpKQorICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAg
IGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAg
ICAgICB9CisgICAgICAgIAorICAgICAgICBBcmc6OlR5cGUgdHlwZSA9IEFyZzo6dHlwZUZvckIz
VHlwZShjaGlsZC0+dHlwZSgpKTsKKworICAgICAgICBpZiAoIWFyZy5pc1R5cGUodHlwZSkpCisg
ICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgLy8gVGhlIG51bWJlciBvZiBj
b25zdHJhaW50cyBoYXMgdG8gYmUgbm8gZ3JlYXRlciB0aGFuIHRoZSBudW1iZXIgb2YgQjMgY2hp
bGRyZW4uCisgICAgQVNTRVJUKHN0YWNrbWFwLT5tX3JlcHMuc2l6ZSgpIDw9IHZhbHVlLT5jaGls
ZHJlbi5zaXplKCkpOworCisgICAgLy8gVmVyaWZ5IGFueSBleHBsaWNpdGx5IHN1cHBsaWVkIGNv
bnN0cmFpbnRzLgorICAgIGZvciAodW5zaWduZWQgaSA9IG51bUlnbm9yZWRCM0FyZ3M7IGkgPCBz
dGFja21hcC0+bV9yZXBzLnNpemUoKTsgKytpKSB7CisgICAgICAgIFZhbHVlKiBjaGlsZCA9IHZh
bHVlLT5jaGlsZChpKTsKKyAgICAgICAgVmFsdWVSZXAmIHJlcCA9IHN0YWNrbWFwLT5tX3JlcHNb
aV07CisgICAgICAgIEFyZyYgYXJnID0gaW5zdC5hcmdzW2kgLSBudW1JZ25vcmVkQjNBcmdzICsg
bnVtSWdub3JlZEFpckFyZ3NdOworCisgICAgICAgIHN3aXRjaCAocmVwLmtpbmQoKSkgeworICAg
ICAgICBjYXNlIFZhbHVlUmVwOjpBbnk6CisgICAgICAgICAgICAvLyBXZSBhbHJlYWR5IHZlcmlm
aWVkIHRoaXMgYWJvdmUuCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBWYWx1ZVJl
cDo6U29tZVJlZ2lzdGVyOgorICAgICAgICAgICAgaWYgKCFhcmcuaXNUbXAoKSkKKyAgICAgICAg
ICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBW
YWx1ZVJlcDo6UmVnaXN0ZXI6CisgICAgICAgICAgICBpZiAoYXJnICE9IFRtcChyZXAucmVnKCkp
KQorICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIGJyZWFrOworICAg
ICAgICBjYXNlIFZhbHVlUmVwOjpTdGFjazoKKyAgICAgICAgICAgIC8vIFRoaXMgaXMgbm90IGEg
dmFsaWQgaW5wdXQgcmVwcmVzZW50YXRpb24uCisgICAgICAgICAgICBBU1NFUlRfTk9UX1JFQUNI
RUQoKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFZhbHVlUmVwOjpTdGFja0Fy
Z3VtZW50OgorICAgICAgICAgICAgaWYgKGFyZyAhPSBBcmc6OmNhbGxBcmcocmVwLm9mZnNldEZy
b21TUCgpKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICBicmVh
azsKKyAgICAgICAgY2FzZSBWYWx1ZVJlcDo6Q29uc3RhbnQ6CisgICAgICAgICAgICAvLyBUaGlz
IGlzIG5vdCBhIHZhbGlkIGlucHV0IHJlcHJlc2VudGF0aW9uLgorICAgICAgICAgICAgQVNTRVJU
X05PVF9SRUFDSEVEKCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKwor
ICAgIHJldHVybiB0cnVlOworfQorCitib29sIFN0YWNrbWFwU3BlY2lhbDo6YWRtaXRzU3RhY2tJ
bXBsKAorICAgIHVuc2lnbmVkIG51bUlnbm9yZWRCM0FyZ3MsIHVuc2lnbmVkIG51bUlnbm9yZWRB
aXJBcmdzLAorICAgIEluc3QmIGluc3QsIHVuc2lnbmVkIGFyZ0luZGV4KQoreworICAgIFZhbHVl
KiB2YWx1ZSA9IGluc3Qub3JpZ2luOworICAgIFN0YWNrbWFwKiBzdGFja21hcCA9IHZhbHVlLT5z
dGFja21hcCgpOworCisgICAgdW5zaWduZWQgc3RhY2ttYXBBcmdJbmRleCA9IGFyZ0luZGV4IC0g
bnVtSWdub3JlZEFpckFyZ3MgKyBudW1JZ25vcmVkQjNBcmdzOworCisgICAgaWYgKHN0YWNrbWFw
QXJnSW5kZXggPj0gc3RhY2ttYXAtPm1fcmVwcy5zaXplKCkpIHsKKyAgICAgICAgLy8gVGhpcyBt
ZWFucyB0aGF0IHRoZXJlIHdhcyBubyBjb25zdHJhaW50LgorICAgICAgICByZXR1cm4gdHJ1ZTsK
KyAgICB9CisgICAgCisgICAgLy8gV2Ugb25seSBhZG1pdCBzdGFjayBmb3IgQW55J3MsIHNpbmNl
IFN0YWNrIGlzIG5vdCBhIHZhbGlkIGlucHV0IGNvbnN0cmFpbnQsIGFuZCBTdGFja0FyZ3VtZW50
CisgICAgLy8gdHJhbnNsYXRlcyB0byBhIENhbGxBcmcgaW4gQWlyLgorICAgIGlmIChzdGFja21h
cC0+bV9yZXBzW3N0YWNrbWFwQXJnSW5kZXhdLmtpbmQoKSA9PSBBbnkpCisgICAgICAgIHJldHVy
biB0cnVlOworCisgICAgcmV0dXJuIGZhbHNlOworfQorCitWZWN0b3I8VmFsdWVSZXA+IFN0YWNr
bWFwU3BlY2lhbDo6cmVwcyhHZW5lcmF0aW9uQ29udGV4dCYgY29udGV4dCwgSW5zdCYgaW5zdCkK
K3sKKyAgICBWZWN0b3I8VmFsdWVSZXA+IHJlc3VsdDsKKyAgICBhcHBlbmRSZXBzSW1wbChjb250
ZXh0LCAxLCBpbnN0LCByZXN1bHQpOworICAgIHJldHVybiByZXN1bHQ7Cit9CisKK3ZvaWQgU3Rh
Y2ttYXBTcGVjaWFsOjphcHBlbmRSZXBzSW1wbCgKKyAgICBHZW5lcmF0aW9uQ29udGV4dCYgY29u
dGV4dCwgdW5zaWduZWQgbnVtSWdub3JlZEFyZ3MsIEluc3QmIGluc3QsIFZlY3RvcjxWYWx1ZVJl
cD4mIHJlc3VsdCkKK3sKKyAgICBmb3IgKHVuc2lnbmVkIGkgPSBudW1JZ25vcmVkQXJnczsgaSA8
IGluc3QuYXJncy5zaXplKCk7ICsraSkKKyAgICAgICAgcmVzdWx0LmFwcGVuZChyZXBGb3JBcmco
Y29udGV4dC5jb2RlLCBhcmcpKTsKKyAgICAgICAgQXJnJiBhcmcgPSBpbnN0LmFyZ3NbaV07Cisg
ICAgfQorfQorCitWYWx1ZVJlcCBTdGFja21hcFNwZWNpYWw6OnJlcEZvckFyZyhDb2RlJiBjb2Rl
LCBjb25zdCBBcmcmIGFyZykKK3sKKyAgICBzd2l0Y2ggKGFyZy5raW5kKCkpIHsKKyAgICBjYXNl
IFRtcDoKKyAgICAgICAgcmV0dXJuIFZhbHVlUmVwOjpyZWcoYXJnLnJlZygpKTsKKyAgICAgICAg
YnJlYWs7CisgICAgY2FzZSBJbW06CisgICAgY2FzZSBJbW02NDoKKyAgICAgICAgcmV0dXJuIFZh
bHVlUmVwOjpjb25zdGFudChhcmcudmFsdWUoKSk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2Ug
QWRkcjoKKyAgICAgICAgaWYgKGFyZy5iYXNlKCkgPT0gR1BSSW5mbzo6Y2FsbEZyYW1lUmVnaXN0
ZXIpCisgICAgICAgICAgICByZXR1cm4gVmFsdWVSZXA6OnN0YWNrKGFyZy5vZmZzZXQoKSk7Cisg
ICAgICAgIEFTU0VSVChhcmcuYmFzZSgpID09IE1hY3JvQXNzZW1ibGVyOjpzdGFja1BvaW50ZXJS
ZWdpc3Rlcik7CisgICAgICAgIHJldHVybiBWYWx1ZVJlcDo6c3RhY2soYXJnLm9mZnNldCgpIC0g
Y29kZS5mcmFtZVNpemUoKSk7CisgICAgZGVmYXVsdDoKKyAgICAgICAgQVNTRVJUX05PVF9SRUFD
SEVEKCk7CisgICAgICAgIHJldHVybiBWYWx1ZVJlcCgpOworICAgIH0KK30KKworfSB9IC8vIG5h
bWVzcGFjZSBKU0M6OkIzCisKKwpJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzU3Rh
Y2ttYXBTcGVjaWFsLmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0Iz
U3RhY2ttYXBTcGVjaWFsLmgJKHJldmlzaW9uIDApCisrKyBTb3VyY2UvSmF2YVNjcmlwdENvcmUv
YjMvQjNTdGFja21hcFNwZWNpYWwuaAkod29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDc1IEBACisv
KgorICogQ29weXJpZ2h0IChDKSAyMDE1IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4K
KyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1z
LCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRl
ZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlz
dHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0
CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5n
IGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCBy
ZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2Yg
Y29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9j
dW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3Ry
aWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4g
YGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNM
VURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0Yg
TUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0Ug
QVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SCisgKiBDT05U
UklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwg
U1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJ
TkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09P
RFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVT
SU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICog
T0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBU
T1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFO
WSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNF
RCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisKKyNpZm5kZWYgQjNT
dGFja21hcFNwZWNpYWxfaAorI2RlZmluZSBCM1N0YWNrbWFwU3BlY2lhbF9oCisKKyNpbmNsdWRl
ICJBaXJTcGVjaWFsLmgiCisjaW5jbHVkZSAiQjNTdGFja21hcC5oIgorCituYW1lc3BhY2UgSlND
IHsgbmFtZXNwYWNlIEIzIHsKKworLy8gVGhpcyBpcyBhIGJhc2UgY2xhc3MgZm9yIHNwZWNpYWxz
IHRoYXQgaGF2ZSBzdGFja21hcHMuIE5vdGUgdGhhdCBpdCBjYW4gZmluZCB0aGUgU3RhY2ttYXAg
YnkKKy8vIGFza2luZyBmb3IgdGhlIEluc3QncyBvcmlnaW4uIEhlbmNlLCB0aGVzZSBvYmplY3Rz
IGRvbid0IG5lZWQgdG8gZXZlbiBob2xkIGEgcmVmZXJlbmNlIHRvIHRoZQorLy8gU3RhY2ttYXAu
CisKK2NsYXNzIFN0YWNrbWFwU3BlY2lhbCA6IHB1YmxpYyBBaXI6OlNwZWNpYWwgeworcHVibGlj
OgorICAgIFN0YWNrbWFwU3BlY2lhbCgpOworICAgIHZpcnR1YWwgflN0YWNrbWFwU3BlY2lhbCgp
OworCitwcm90ZWN0ZWQ6CisgICAgdm9pZCBmb3JFYWNoQXJnKEFpcjo6SW5zdCYsIGNvbnN0IFNj
b3BlZExhbWJkYTxBaXI6Okluc3Q6OkVhY2hBcmdDYWxsYmFjaz4mKSBvdmVycmlkZTsKKyAgICBi
b29sIGlzVmFsaWQoQWlyOjpJbnN0Jikgb3ZlcnJpZGU7CisgICAgYm9vbCBhZG1pdHNTdGFjayhB
aXI6Okluc3QmLCB1bnNpZ25lZCBhcmdJbmRleCkgb3ZlcnJpZGU7CisgICAgdm9pZCByZXBvcnRV
c2VkUmVnaXN0ZXJzKEFpcjo6SW5zdCYsIGNvbnN0IFJlZ2lzdGVyU2V0Jikgb3ZlcnJpZGU7Cisg
ICAgY29uc3QgUmVnaXN0ZXJTZXQmIGV4dHJhQ2xvYmJlcmVkUmVncyhBaXI6Okluc3QmKSBvdmVy
cmlkZTsKKworICAgIC8vIE5vdGUgdGhhdCB0aGlzIGRvZXMgbm90IG92ZXJyaWRlIGdlbmVyYXRl
KCkgb3IgZHVtcEltcGwoKS9kZWVwRHVtcEltcGwoKS4gV2UgaGF2ZSBtYW55IHNvbWUKKyAgICAv
LyBzdWJjbGFzc2VzIHRoYXQgaW1wbGVtZW50IHRoYXQuCisKKyAgICB2b2lkIGZvckVhY2hBcmdJ
bXBsKAorICAgICAgICB1bnNpZ25lZCBudW1JZ25vcmVkQjNBcmdzLCB1bnNpZ25lZCBudW1JZ25v
cmVkQWlyQXJncywKKyAgICAgICAgQWlyOjpJbnN0JiwgY29uc3QgU2NvcGVkTGFtYmRhPEFpcjo6
SW5zdDo6RWFjaEFyZ0NhbGxiYWNrPiYpOworICAgIGJvb2wgaXNWYWxpZEltcGwoCisgICAgICAg
IHVuc2lnbmVkIG51bUlnbm9yZWRCM0FyZ3MsIHVuc2lnbmVkIG51bUlnbm9yZWRBaXJBcmdzLAor
ICAgICAgICBBaXI6Okluc3QmKTsKKyAgICBib29sIGFkbWl0c1N0YWNrSW1wbCgKKyAgICAgICAg
dW5zaWduZWQgbnVtSWdub3JlZEIzQXJncywgdW5zaWduZWQgbnVtSWdub3JlZEFpckFyZ3MsCisg
ICAgICAgIEFpcjo6SW5zdCYpOworCisgICAgLy8gR2V0cyB0aGUgcmVwcyBhcnJheSB0aGUgd2F5
IHRoYXQgdGhlIHN0YWNrbWFwIGdlbmVyYXRvciBjYWxsYmFjayB3b3VsZCB3YW50LgorICAgIFZl
Y3RvcjxWYWx1ZVJlcD4gcmVwcyhBaXI6OkdlbmVyYXRpb25Db250ZXh0JiwgQWlyOjpJbnN0Jik7
CisKKyAgICAvLyBBcHBlbmRzIHRoZSByZXBzIGZvciB0aGUgSW5zdCdzIGFyZ3MsIHN0YXJ0aW5n
IHdpdGggbnVtSWdub3JlZEFyZ3MsIHRvIHRoZSBnaXZlbiB2ZWN0b3IuCisgICAgdm9pZCBhcHBl
bmRSZXBzSW1wbChBaXI6OkdlbmVyYXRpb25Db250ZXh0JiwgdW5zaWduZWQgbnVtSWdub3JlZEFy
Z3MsIEFpcjo6SW5zdCYsIFZlY3RvcjxWYWx1ZVJlcD4mKTsKKworICAgIHN0YXRpYyBWYWx1ZVJl
cCByZXBGb3JBcmcoQWlyOjpDb2RlJiwgY29uc3QgQWlyOjpBcmcmKTsKK307CisKK30gfSAvLyBu
YW1lc3BhY2UgSlNDOjpCMworCisjZW5kaWYgLy8gQjNTdGFja21hcFNwZWNpYWxfaAorCkluZGV4
OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNTd2l0Y2hDYXNlLmNwcAo9PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0t
LSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNTd2l0Y2hDYXNlLmNwcAkocmV2aXNpb24gMCkK
KysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM1N3aXRjaENhc2UuY3BwCSh3b3JraW5nIGNv
cHkpCkBAIC0wLDAgKzEsMzkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTUgQXBwbGUgSW5j
LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4g
c291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9u
LCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisg
KiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0
YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRp
dGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9u
cyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAg
ICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2Ns
YWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMg
cHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMg
UFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJ
TVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAq
IElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEg
UEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxM
IEFQUExFIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1Qs
IElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFV
RU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VS
RU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEs
IE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VE
IEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1Qs
IFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBP
VEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBT
T0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFH
RS4gCisgKi8KKworI2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgIkIzU3dpdGNoQ2FzZS5o
IgorCisjaW5jbHVkZSAiQjNCYXNpY0Jsb2NrLmgiCisKK25hbWVzcGFjZSBKU0MgeyBuYW1lc3Bh
Y2UgQjMgeworCit2b2lkIFN3aXRjaENhc2U6OmR1bXAoUHJpbnRTdHJlYW0mIG91dCkgY29uc3QK
K3sKKyAgICBvdXQucHJpbnQobV9jYXNlVmFsdWUsICItPiIsIHBvaW50ZXJEdW1wKG1fdGFyZ2V0
KSk7Cit9CisKK30gfSAvLyBuYW1lc3BhY2UgSlNDOjpCMworCkluZGV4OiBTb3VyY2UvSmF2YVNj
cmlwdENvcmUvYjMvQjNTd2l0Y2hDYXNlLmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL0phdmFTY3Jp
cHRDb3JlL2IzL0IzU3dpdGNoQ2FzZS5oCShyZXZpc2lvbiAwKQorKysgU291cmNlL0phdmFTY3Jp
cHRDb3JlL2IzL0IzU3dpdGNoQ2FzZS5oCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsNjMgQEAK
Ky8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTUgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVk
LgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9y
bXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3Zp
ZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVk
aXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmln
aHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dp
bmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0
IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBv
ZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBk
b2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlz
dHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5D
LiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElO
Q0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBP
RiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9T
RSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IKKyAqIENP
TlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFM
LCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xV
RElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBH
T09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBC
VVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisg
KiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9S
IFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4g
QU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJ
U0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKworI2lmbmRlZiBC
M1N3aXRjaENhc2VfaAorI2RlZmluZSBCM1N3aXRjaENhc2VfaAorCisjaW5jbHVkZSA8d3RmL1N0
ZExpYkV4dHJhcy5oPgorI2luY2x1ZGUgPHd0Zi9QcmludFN0cmVhbS5oPgorCituYW1lc3BhY2Ug
SlNDIHsgbmFtZXNwYWNlIEIzIHsKKworY2xhc3MgQmFzaWNCbG9jazsKKworY2xhc3MgU3dpdGNo
Q2FzZSB7CitwdWJsaWM6CisgICAgU3dpdGNoQ2FzZSgpCisgICAgeworICAgIH0KKworICAgIFN3
aXRjaENhc2UoaW50NjRfdCBjYXNlVmFsdWUsIEJhc2ljQmxvY2sqIHRhcmdldCkKKyAgICAgICAg
OiBtX2Nhc2VWYWx1ZShjYXNlVmFsdWUpCisgICAgICAgICwgbV90YXJnZXQodGFyZ2V0KQorICAg
IHsKKyAgICB9CisKKyAgICBleHBsaWNpdCBvcGVyYXRvciBib29sKCkgY29uc3QgeyByZXR1cm4g
ISFtX3RhcmdldDsgfQorCisgICAgaW50NjRfdCBjYXNlVmFsdWUoKSBjb25zdCB7IHJldHVybiBt
X2Nhc2VWYWx1ZTsgfQorICAgIEJhc2ljQmxvY2sqIHRhcmdldCgpIGNvbnN0IHsgcmV0dXJuIG1f
dGFyZ2V0OyB9CisKKyAgICB2b2lkIGR1bXAoUHJpbnRTdHJlYW0mIG91dCkgY29uc3Q7CisKK3By
aXZhdGU6CisgICAgaW50NjRfdCBjYXNlVmFsdWU7CisgICAgQmFzaWNCbG9jayogdGFyZ2V0Owor
fTsKKworfSB9IC8vIG5hbWVzcGFjZSBKU0M6OkIzCisKKyNlbmRpZiAvLyBCM1N3aXRjaENhc2Vf
aAorCkluZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNTd2l0Y2hWYWx1ZS5jcHAKPT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzU3dpdGNoVmFsdWUuY3BwCShy
ZXZpc2lvbiAwKQorKysgU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzU3dpdGNoVmFsdWUuY3Bw
CSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsNjMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIw
MTUgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9u
IGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICog
bW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBj
b25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBj
b2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBs
aXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJl
ZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29w
eXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9s
bG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhl
ciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMg
U09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICog
RVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVE
IFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJ
VE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5P
IEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9S
IEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZ
LCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRP
LAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBP
RiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhP
V0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIg
SU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVH
TElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQor
ICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBP
RiBTVUNIIERBTUFHRS4gCisgKi8KKworI2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2xkdWUgIkIz
U3dpdGNoVmFsdWUuaCIKKworbmFtZXNwYWNlIEpTQyB7IG5hbWVzcGFjZSBCMyB7CisKK1N3aXRj
aFZhbHVlOjp+U3dpdGNoVmFsdWUoKQoreworfQorCitTd2l0Y2hDYXNlIFN3aXRjaFZhbHVlOjpy
ZW1vdmVDYXNlKHVuc2lnbmVkIGluZGV4KQoreworICAgIFN3aXRjaENhc2UgcmVzdWx0ID0gbV9z
dWNjZXNzb3JzW2luZGV4XTsKKyAgICBtX3N1Y2Nlc3NvcnNbaW5kZXhdID0gbV9zdWNjZXNzb3Jz
Lmxhc3QoKTsKKyAgICBtX3N1Y2Nlc3NvcnMucmVtb3ZlTGFzdCgpOworICAgIHJldHVybiByZXN1
bHQ7Cit9CisKK3ZvaWQgU3dpdGNoVmFsdWU6OmFwcGVuZENhc2UoY29uc3QgU3dpdGNoQ2FzZSYg
c3dpdGNoQ2FzZSkKK3sKKyAgICBtX3N1Y2Nlc3NvcnMuYXBwZW5kKG1fc3VjY2Vzc29ycy5sYXN0
KCkpOworICAgIG1fc3VjY2Vzc29yc1ttX3N1Y2Nlc3NvcnMuc2l6ZSgpIC0gMl0gPSBzd2l0Y2hD
YXNlLnRhcmdldCgpOworICAgIG1fdmFsdWVzLmFwcGVuZChzd2l0Y2hDYXNlLmNhc2VWYWx1ZSgp
KTsKK30KKwordm9pZCBTd2l0Y2hWYWx1ZTo6ZHVtcE1ldGEoUHJpbnRTdHJlYW0mIG91dCkgY29u
c3QKK3sKKyAgICAvLyBUaGlzIGRlc3RydWN0aXZlbHkgb3ZlcnJpZGVzIENvbnRyb2xWYWx1ZSdz
IGR1bXBNZXRhKCkuCisgICAgb3V0LnByaW50KGxpc3REdW1wKCp0aGlzKSk7Cit9CisKK1N3aXRj
aFZhbHVlOjpTd2l0Y2hWYWx1ZSh1bnNpZ25lZCBpbmRleCwgT3JpZ2luIG9yaWdpbiwgQmFzaWNC
bG9jayogZmFsbFRocm91Z2gpCisgICAgOiBDb250cm9sVmFsdWUoaW5kZXgsIFN3aXRjaCwgb3Jp
Z2luKQoreworICAgIG1fc3VjY2Vzc29ycy5hcHBlbmQoZmFsbFRocm91Z2gpOworfQorCit9IH0g
Ly8gbmFtZXNwYWNlIEpTQzo6QjMKKwpJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0Iz
U3dpdGNoVmFsdWUuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNT
d2l0Y2hWYWx1ZS5oCShyZXZpc2lvbiAwKQorKysgU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0Iz
U3dpdGNoVmFsdWUuaAkod29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDEyMyBAQAorLyoKKyAqIENv
cHlyaWdodCAoQykgMjAxNSBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICog
UmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBv
ciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0
aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlv
bnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAg
bm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFp
bWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNl
IHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlv
bnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRp
b24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24u
CisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIGBgQVMgSVMn
JyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBC
VVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5U
QUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVND
TEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUgorICogQ09OVFJJQlVUT1JT
IEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUws
CisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQg
Tk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNF
UlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElO
VEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJ
TElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICog
KElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9V
VCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhF
IFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLiAKKyAqLworCisjaWZuZGVmIEIzU3dpdGNoVmFs
dWVfaAorI2RlZmluZSBCM1N3aXRjaFZhbHVlX2gKKworI2luY2x1ZGUgIkIzQ29udHJvbFZhbHVl
LmgiCisjaW5jbHVkZSAiQjNTd2l0Y2hDYXNlLmgiCisKK25hbWVzcGFjZSBKU0MgeyBuYW1lc3Bh
Y2UgQjMgeworCitjbGFzcyBTd2l0Y2hWYWx1ZSA6IHB1YmxpYyBDb250cm9sVmFsdWUgeworcHVi
bGljOgorICAgIHN0YXRpYyBib29sIGFjY2VwdHMoT3Bjb2RlIG9wY29kZSkgeyByZXR1cm4gb3Bj
b2RlID09IFN3aXRjaDsgfQorCisgICAgflN3aXRjaFZhbHVlKCk7CisKKyAgICAvLyBudW1DYXNl
VmFsdWVzKCkgKyAxID09IG51bVN1Y2Nlc3NvcnMoKS4KKyAgICB1bnNpZ25lZCBudW1DYXNlVmFs
dWVzKCkgY29uc3QgeyByZXR1cm4gbV92YWx1ZXMuc2l6ZSgpOyB9CisKKyAgICAvLyBUaGUgc3Vj
Y2Vzc29yIGZvciB0aGlzIGNhc2UgdmFsdWUgaXMgYXQgdGhlIHNhbWUgaW5kZXguCisgICAgaW50
NjRfdCBjYXNlVmFsdWUodW5zaWduZWQgaW5kZXgpIGNvbnN0IHsgcmV0dXJuIG1fdmFsdWVzW2ld
OyB9CisgICAgCisgICAgY29uc3QgVmVjdG9yPGludDY0X3Q+JiBjYXNlVmFsdWVzKCkgY29uc3Qg
eyByZXR1cm4gbV92YWx1ZXM7IH0KKworICAgIEJhc2ljQmxvY2sqIGZhbGxUaHJvdWdoKCkgY29u
c3QgeyByZXR1cm4gc3VjY2Vzc29ycygpLmxhc3QoKTsgfQorICAgIEJhc2ljQmxvY2sqJiBmYWxs
VGhyb3VnaCgpIHsgcmV0dXJuIHN1Y2Nlc3NvcnMoKS5sYXN0KCk7IH0KKworICAgIHVuc2lnbmVk
IHNpemUoKSBjb25zdCB7IHJldHVybiBudW1DYXNlVmFsdWVzKCk7IH0KKyAgICBTd2l0Y2hDYXNl
IGF0KHVuc2lnbmVkIGluZGV4KSBjb25zdAorICAgIHsKKyAgICAgICAgcmV0dXJuIFN3aXRjaENh
c2UoY2FzZVZhbHVlKGluZGV4KSwgc3VjY2Vzc29yKGluZGV4KSk7CisgICAgfQorICAgIFN3aXRj
aENhc2Ugb3BlcmF0b3JbXSh1bnNpZ25lZCBpbmRleCkgY29uc3QKKyAgICB7CisgICAgICAgIHJl
dHVybiBhdChpbmRleCk7CisgICAgfQorCisgICAgY2xhc3MgaXRlcmF0b3IgeworICAgIHB1Ymxp
YzoKKyAgICAgICAgaXRlcmF0b3IoKQorICAgICAgICAgICAgOiBtX3N3aXRjaChudWxscHRyKQor
ICAgICAgICAgICAgLCBtX2luZGV4KDApCisgICAgICAgIHsKKyAgICAgICAgfQorCisgICAgICAg
IGl0ZXJhdG9yKFN3aXRjaFZhbHVlJiBzd2l0Y2hWYWx1ZSwgdW5zaWduZWQgaW5kZXgpCisgICAg
ICAgICAgICA6IG1fc3dpdGNoKCZzd2l0Y2hWYWx1ZSkKKyAgICAgICAgICAgICwgbV9pbmRleChp
bmRleCkKKyAgICAgICAgeworICAgICAgICB9CisKKyAgICAgICAgU3dpdGNoQ2FzZSBvcGVyYXRv
ciooKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gbV9zd2l0Y2gtPmF0KG1faW5kZXgp
OworICAgICAgICB9CisKKyAgICAgICAgaXRlcmF0b3ImIG9wZXJhdG9yKysoKQorICAgICAgICB7
CisgICAgICAgICAgICBtX2luZGV4Kys7CisgICAgICAgICAgICByZXR1cm4gKnRoaXM7CisgICAg
ICAgIH0KKworICAgICAgICBib29sIG9wZXJhdG9yPT0oY29uc3QgaXRlcmF0b3ImIG90aGVyKSBj
b25zdAorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gbV9pbmRleCA9PSBvdGhlci5tX2lu
ZGV4OworICAgICAgICB9CisKKyAgICAgICAgYm9vbCBvcGVyYXRvciE9KGNvbnN0IGl0ZXJhdG9y
JiBvdGhlcikgY29uc3QKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuICEoKnRoaXMgPT0g
b3RoZXIpOworICAgICAgICB9CisKKyAgICBwcml2YXRlOgorICAgICAgICBTd2l0Y2hWYWx1ZSog
bV9zd2l0Y2g7CisgICAgICAgIHVuc2lnbmVkIG1faW5kZXg7CisgICAgfTsKKworICAgIGl0ZXJh
dG9yIGJlZ2luKCkgY29uc3QgeyByZXR1cm4gaXRlcmF0b3IoKnRoaXMsIDApOyB9CisgICAgaXRl
cmF0b3IgZW5kKCkgY29uc3QgeyByZXR1cm4gaXRlcmF0b3IoKnRoaXMsIHNpemUoKSk7IH0KKwor
ICAgIC8vIFRoaXMgcmVtb3ZlcyB0aGUgY2FzZSBhbmQgcmVvcmRlcnMgdGhpbmdzIGEgYml0LiBJ
ZiB5b3UncmUgaXRlcmF0aW5nIHRoZSBjYXNlcyBmcm9tIDAgdG8gTiwKKyAgICAvLyB0aGVuIHlv
dSBjYW4ga2VlcCBpdGVyYXRpbmcgYWZ0ZXIgdGhpcyBzbyBsb25nIGFzIHlvdSByZXZpc2l0IHRo
aXMgc2FtZSBpbmRleCAod2hpY2ggd2lsbCBub3cKKyAgICAvLyBjb250YWluIHNvbWUgb3RoZXIg
Y2FzZSB2YWx1ZSkuIFRoaXMgcmVtb3ZlcyB0aGUgY2FzZSB0aGF0IHdhcyByZW1vdmVkLgorICAg
IFN3aXRjaENhc2UgcmVtb3ZlQ2FzZSh1bnNpZ25lZCBpbmRleCk7CisKKyAgICB2b2lkIGFwcGVu
ZENhc2UoY29uc3QgU3dpdGNoQ2FzZSYgc3dpdGNoQ2FzZSk7CisKK3Byb3RlY3RlZDoKKyAgICB2
b2lkIGR1bXBNZXRhKFByaW50U3RyZWFtJikgY29uc3Qgb3ZlcnJpZGU7CisKK3ByaXZhdGU6Cisg
ICAgZnJpZW5kIGNsYXNzIFByb2NlZHVyZTsKKworICAgIFN3aXRjaFZhbHVlKHVuc2lnbmVkIGlu
ZGV4LCBPcmlnaW4gb3JpZ2luLCBCYXNpY0Jsb2NrKiBmYWxsVGhyb3VnaCk7Cit9OworCit9IH0g
Ly8gbmFtZXNwYWNlIEpTQzo6QjMKKworI2VuZGlmIC8vIEIzU3dpdGNoVmFsdWVfaAorCkluZGV4
OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNUeXBlLmNwcAo9PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3Vy
Y2UvSmF2YVNjcmlwdENvcmUvYjMvQjNUeXBlLmNwcAkocmV2aXNpb24gMCkKKysrIFNvdXJjZS9K
YXZhU2NyaXB0Q29yZS9iMy9CM1R5cGUuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsNTQg
QEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTUgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2Vy
dmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkg
Zm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHBy
b3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4g
UmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5
cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xs
b3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBt
dXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlz
dCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAg
ICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUg
ZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUg
SU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMs
IElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElF
UyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVS
UE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IKKyAq
IENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVO
VEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElO
Q0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVU
RSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBP
UiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZ
CisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFks
IE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcg
SU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBB
RFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKworI2luY2x1
ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgIkIzVHlwZS5oIgorCisjaW5jbHVkZSA8d3RmL1ByaW50
U3RyZWFtLmg+CisKK25hbWVzcGFjZSBXVEYgeworCit1c2luZyBuYW1lc3BhY2UgSlNDOjpCMzsK
Kwordm9pZCBwcmludEludGVybmFsKFByaW50U3RyZWFtJiBvdXQsIFR5cGUgdHlwZSkKK3sKKyAg
ICBzd2l0Y2ggKHR5cGUpIHsKKyAgICBjYXNlIFZvaWQ6CisgICAgICAgIG91dC5wcmludCgiVm9p
ZCIpOworICAgICAgICByZXR1cm47CisgICAgY2FzZSBJbnQzMjoKKyAgICAgICAgb3V0LnByaW50
KCJJbnQzMiIpOworICAgICAgICByZXR1cm47CisgICAgY2FzZSBJbnQ2NDoKKyAgICAgICAgb3V0
LnByaW50KCJJbnQ2NCIpOworICAgICAgICByZXR1cm47CisgICAgY2FzZSBEb3VibGU6CisgICAg
ICAgIG91dC5wcmludCgiRG91YmxlIik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgUkVM
RUFTRV9BU1NFUlRfTk9UX1JFQUNIRUQoKTsKK30KKworfSAvLyBuYW1lc3BhY2UgV1RGCkluZGV4
OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNUeXBlLmgKPT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNl
L0phdmFTY3JpcHRDb3JlL2IzL0IzVHlwZS5oCShyZXZpc2lvbiAwKQorKysgU291cmNlL0phdmFT
Y3JpcHRDb3JlL2IzL0IzVHlwZS5oCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsNjggQEAKKy8q
CisgKiBDb3B5cmlnaHQgKEMpIDIwMTUgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgor
ICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMs
IHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVk
IHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0
cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQK
KyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcg
ZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJl
cHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBj
b25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1
bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJp
YnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBg
YEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xV
RElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBN
RVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBB
UkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IKKyAqIENPTlRS
SUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBT
UEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElO
RywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09E
UyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJ
TkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBP
RiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRP
UlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5Z
IFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VE
IE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKworI2lmbmRlZiBCM1R5
cGVfaAorI2RlZmluZSBCM1R5cGVfaAorCisjaW5jbHVkZSA8d3RmL1N0ZExpYkV4dHJhcy5oPgor
CituYW1lc3BhY2UgSlNDIHsgbmFtZXNwYWNlIEIzIHsKKworZW51bSBUeXBlIHsKKyAgICBWb2lk
LAorICAgIEludDMyLAorICAgIEludDY0LAorICAgIERvdWJsZQorfTsKKworaW5saW5lIGJvb2wg
aXNJbnQoVHlwZSB0eXBlKQoreworICAgIHJldHVybiB0eXBlID09IEludDMyIHx8IHR5cGUgPT0g
SW50NjQ7Cit9CisKK2lubGluZSBib29sIGlzRmxvYXQoVHlwZSB0eXBlKQoreworICAgIHJldHVy
biB0eXBlID09IERvdWJsZTsKK30KKworaW5saW5lIFR5cGUgcG9pbnRlcigpIGNvbnN0Cit7Cisg
ICAgaWYgKHNpemVvZih2b2lkKikgPT0gNCkKKyAgICAgICAgcmV0dXJuIEludDMyOworICAgIHJl
dHVybiBJbnQ2NDsKK30KKworfSB9IC8vIG5hbWVzcGFjZSBKU0M6OkIzCisKK25hbWVzcGFjZSBX
VEYgeworCitjbGFzcyBQcmludFN0cmVhbTsKKwordm9pZCBwcmludEludGVybmFsKFByaW50U3Ry
ZWFtJiwgSlNDOjpCMzo6VHlwZSk7CisKK30gLy8gbmFtZXNwYWNlIFdURgorCisjZW5kaWYgLy8g
QjNUeXBlX2gKKwpJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzVXBzaWxvblZhbHVl
LmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNVcHNpbG9uVmFs
dWUuY3BwCShyZXZpc2lvbiAwKQorKysgU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzVXBzaWxv
blZhbHVlLmNwcAkod29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDQxIEBACisvKgorICogQ29weXJp
Z2h0IChDKSAyMDE1IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRp
c3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdp
dGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBm
b2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBv
ZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3Rp
Y2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIu
CisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhl
IGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBh
bmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBh
bmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAq
CisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFO
RCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBO
T1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklM
SVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlN
RUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUg
TElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAq
IEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1Qg
TElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklD
RVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJS
VVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZ
LCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5D
TFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9G
IFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9T
U0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisKKyNpbmNsdWRlICJjb25maWcuaCIKKyNp
bmNsdWRlICJCM1Vwc2lsb25WYWx1ZS5oIgorCituYW1lc3BhY2UgSlNDIHsgbmFtZXNwYWNlIEIz
IHsKKworVXBzaWxvblZhbHVlOjp+VXBzaWxvblZhbHVlKCkKK3sKK30KKwordm9pZCBVcHNpbG9u
VmFsdWU6OmR1bXBNZXRhKFByaW50U3RyZWFtJiBvdXQpIGNvbnN0Cit7CisgICAgb3V0LnByaW50
KCJeIiwgbV9waGktPmluZGV4KCkpOworfQorCit9IH0gLy8gbmFtZXNwYWNlIEpTQzo6QjMKKwpJ
bmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzVXBzaWxvblZhbHVlLmgKPT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PQotLS0gU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzVXBzaWxvblZhbHVlLmgJKHJldmlzaW9u
IDApCisrKyBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNVcHNpbG9uVmFsdWUuaAkod29ya2lu
ZyBjb3B5KQpAQCAtMCwwICsxLDYwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE1IEFwcGxl
IEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNl
IGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNh
dGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9u
cworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0
IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBj
b25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1
dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAor
ICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBk
aXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJp
YWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJF
IElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1Mg
T1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhF
CisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZP
UiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBT
SEFMTCBBUFBMRSBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElS
RUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09O
U0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBS
T0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBE
QVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENB
VVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRS
QUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0Ug
T1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRI
SVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBE
QU1BR0UuIAorICovCisKKyNpZm5kZWYgQjNVcHNpbG9uVmFsdWVfaAorI2RlZmluZSBCM1Vwc2ls
b25WYWx1ZV9oCisKKyNpbmNsdWRlICJCM1ZhbHVlLmgiCisKK25hbWVzcGFjZSBKU0MgeyBuYW1l
c3BhY2UgQjMgeworCitjbGFzcyBVcHNpbG9uVmFsdWUgOiBwdWJsaWMgVmFsdWUgeworcHVibGlj
OgorICAgIHN0YXRpYyBib29sIGFjY2VwdHMoT3Bjb2RlIG9wY29kZSkgeyByZXR1cm4gb3Bjb2Rl
ID09IFVwc2lsb247IH0KKworICAgIH5VcHNpbG9uVmFsdWUoKTsKKworICAgIFZhbHVlKiBwaGko
KSBjb25zdCB7IHJldHVybiBtX3BoaTsgfQorCitwcm90ZWN0ZWQ6CisgICAgdm9pZCBkdW1wTWV0
YShQcmludFN0cmVhbSYpIGNvbnN0IG92ZXJyaWRlOworCitwcml2YXRlOgorICAgIGZyaWVuZCBj
bGFzcyBQcm9jZWR1cmU7CisgICAgCisgICAgVXBzaWxvblZhbHVlKHVuc2lnbmVkIGluZGV4LCBP
cmlnaW4gb3JpZ2luLCBWYWx1ZSogdmFsdWUsIFZhbHVlKiBwaGkpCisgICAgICAgIDogVmFsdWUo
aW5kZXgsIFBoaSwgVm9pZCwgb3JpZ2luLCB2YWx1ZSkKKyAgICAgICAgLCBtX3BoaShwaGkpCisg
ICAgeworICAgICAgICBBU1NFUlQodmFsdWUtPnR5cGUoKSA9PSBwaGktPnR5cGUoKSk7CisgICAg
fQorCisgICAgVmFsdWUqIG1fcGhpOworfTsKKworfSB9IC8vIG5hbWVzcGFjZSBKU0M6OkIzCisK
KyNlbmRpZiAvLyBCM1Vwc2lsb25WYWx1ZV9oCisKSW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29y
ZS9iMy9CM1ZhbHVlLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMv
QjNWYWx1ZS5jcHAJKHJldmlzaW9uIDApCisrKyBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNW
YWx1ZS5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSwxNjkgQEAKKy8qCisgKiBDb3B5cmln
aHQgKEMpIDIwMTUgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlz
dHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0
aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZv
bGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9m
IHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGlj
ZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4K
KyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUg
YWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFu
ZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFu
ZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoK
KyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFTIElTJycgQU5E
IEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5P
VCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJ
VFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1F
RC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBM
SUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICog
RVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBM
SU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNF
UzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJV
UFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFks
IFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNM
VURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0Yg
VEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NT
SUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKworI2luY2x1ZGUgImNvbmZpZy5oIgorI2lu
Y2x1ZGUgIkIzVmFsdWUuaCIKKworbmFtZXNwYWNlIEpTQyB7IG5hbWVzcGFjZSBCMyB7CisKK1Zh
bHVlOjp+VmFsdWUoKQoreworfQorCit2b2lkIFZhbHVlOjpyZXBsYWNlV2l0aElkZW50aXR5KFZh
bHVlKiB2YWx1ZSkKK3sKKyAgICAvLyBUaGlzIGlzIGEgYml0IGNyYXp5LiBJdCBkb2VzIGFuIGlu
LXBsYWNlIHJlcGxhY2VtZW50IG9mIHdoYXRldmVyIFZhbHVlIHN1YmNsYXNzIHRoaXMgaXMgd2l0
aAorICAgIC8vIGEgcGxhaW4gSWRlbnRpdHkgVmFsdWUuIFdlIGZpcnN0IGNvbGxlY3QgYWxsIG9m
IHRoZSBpbmZvcm1hdGlvbiB3ZSBuZWVkLCB0aGVuIHdlIGRlc3RydWN0IHRoZQorICAgIC8vIHBy
ZXZpb3VzIHZhbHVlIGluIHBsYWNlLCBhbmQgdGhlbiB3ZSBjb25zdHJ1Y3QgdGhlIElkZW50aXR5
IFZhbHVlIGluIHBsYWNlLgorCisgICAgdW5zaWduZWQgaW5kZXggPSBtX2luZGV4OworICAgIFR5
cGUgdHlwZSA9IG1fdHlwZTsKKyAgICBPcmlnaW4gb3JpZ2luID0gbV9vcmlnaW47CisgICAgQmFz
aWNCbG9jayogb3duZXIgPSB0aGlzLT5vd25lcjsKKyAgICBWYWx1ZSogcmVwbGFjZW1lbnQgPSB0
aGlzLT5yZXBsYWNlbWVudDsKKyAgICB2b2lkKiBtaXNjID0gdGhpcy0+bWlzYzsKKworICAgIFJF
TEVBU0VfQVNTRVJUKHR5cGUgPT0gdmFsdWUtPnR5cGUoKSk7CisKKyAgICB0aGlzLT5WYWx1ZTo6
flZhbHVlKCk7CisKKyAgICBuZXcgKHRoaXMpIChpbmRleCwgSWRlbnRpZnksIHR5cGUsIG9yaWdp
biwgdmFsdWUpOworCisgICAgdGhpcy0+b3duZXIgPSBvd25lcjsKKyAgICB0aGlzLT5yZXBsYWNl
bWVudCA9IHJlcGxhY2VtZW50OworICAgIHRoaXMtPm1pc2MgPSBtaXNjOworfQorCit2b2lkIFZh
bHVlOjpkdW1wKFByaW50U3RyZWFtJiBvdXQpIGNvbnN0Cit7CisgICAgb3V0LnByaW50KGR1bXBQ
cmVmaXgsIG1faW5kZXgpOworfQorCit2b2lkIFZhbHVlOjpkZWVwRHVtcChQcmludFN0cmVhbSYg
b3V0KSBjb25zdAoreworICAgIG91dC5wcmludChtX3R5cGUsICIgIiwgKnRoaXMsICIgPSAiLCBt
X29wY29kZSk7CisKKyAgICBvdXQucHJpbnQoIigiKTsKKyAgICBDb21tYVByaW50ZXIgY29tbWE7
CisgICAgZm9yIChWYWx1ZSogY2hpbGQgOiBjaGlsZHJlbigpKQorICAgICAgICBvdXQucHJpbnQo
Y29tbWEsIHBvaW50ZXJEdW1wKGNoaWxkKSk7CisKKyAgICBTdHJpbmdQcmludFN0cmVhbSBzdHJp
bmdPdXQ7CisgICAgZHVtcE1ldGEoc3RyaW5nT3V0KTsKKyAgICBDU3RyaW5nIHN0cmluZyA9IHN0
cmluZ091dC50b0NTdHJpbmcoKTsKKyAgICBpZiAoc3RyaW5nLmxlbmd0aCgpKQorICAgICAgICBv
dXQucHJpbnQoY29tbWEsIHN0cmluZyk7CisKKyAgICBvdXQucHJpbnQoIikiKTsKK30KKworYm9v
bCBWYWx1ZTo6aGFzSW50MzIoKSBjb25zdAoreworICAgIHJldHVybiBmYWxzZTsKK30KKworaW50
MzJfdCBWYWx1ZTo6YXNJbnQzMigpIGNvbnN0Cit7CisgICAgUkVMRUFTRV9BU1NFUlRfTk9UX1JF
QUNIRUQoKTsKKyAgICByZXR1cm4gMDsKK30KKworYm9vbCBWYWx1ZTo6aGFzSW50NjQoKSBjb25z
dAoreworICAgIHJldHVybiBmYWxzZTsKK30KKworaW50NjRfdCBWYWx1ZTo6YXNJbnQ2NCgpIGNv
bnN0Cit7CisgICAgUkVMRUFTRV9BU1NFUlRfTk9UX1JFQUNIRUQoKTsKKyAgICByZXR1cm4gMDsK
K30KKworYm9vbCBWYWx1ZTo6aGFzRG91YmxlKCkgY29uc3QKK3sKKyAgICByZXR1cm4gZmFsc2U7
Cit9CisKK2RvdWJsZSBWYWx1ZTo6YXNEb3VibGUoKSBjb25zdAoreworICAgIFJFTEVBU0VfQVNT
RVJUX05PVF9SRUFDSEVEKCk7CisgICAgcmV0dXJuIDA7Cit9CisKK3ZvaWQgVmFsdWU6OmR1bXBN
ZXRhKFByaW50U3RyZWFtJikgY29uc3QKK3sKK30KKworVHlwZSBWYWx1ZTo6dHlwZUZvcihPcGNv
ZGUgb3Bjb2RlLCBWYWx1ZSogZmlyc3RDaGlsZCkKK3sKKyAgICBzd2l0Y2ggKG9wY29kZSkgewor
ICAgIGNhc2UgSWRlbnRpdHk6CisgICAgY2FzZSBBZGQ6CisgICAgY2FzZSBTdWI6CisgICAgY2Fz
ZSBNdWw6CisgICAgY2FzZSBEaXY6CisgICAgY2FzZSBDaGlsbERpdjoKKyAgICBjYXNlIE1vZDoK
KyAgICBjYXNlIEJpdEFuZDoKKyAgICBjYXNlIEJpdE9yOgorICAgIGNhc2UgQml0WG9yOgorICAg
IGNhc2UgU2hsOgorICAgIGNhc2UgU1NocjoKKyAgICBjYXNlIFpTaHI6CisgICAgY2FzZSBDaGVj
a0FkZDoKKyAgICBjYXNlIENoZWNrU3ViOgorICAgIGNhc2UgQ2hlY2tNdWw6CisgICAgICAgIHJl
dHVybiBmaXJzdENoaWxkLT50eXBlKCk7CisgICAgY2FzZSBGcmFtZVBvaW50ZXI6CisgICAgICAg
IHJldHVybiBwb2ludGVyKCk7CisgICAgY2FzZSBTRXh0ODoKKyAgICBjYXNlIFNFeHQxNjoKKyAg
ICBjYXNlIERUb0kzMjoKKyAgICBjYXNlIEVxdWFsOgorICAgIGNhc2UgTm90RXF1YWw6CisgICAg
Y2FzZSBMZXNzVGhhbjoKKyAgICBjYXNlIEdyZWF0ZXJUaGFuOgorICAgIGNhc2UgTGVzc0VxdWFs
OgorICAgIGNhc2UgR3JlYXRlckVxdWFsOgorICAgIGNhc2UgQWJvdmU6CisgICAgY2FzZSBCZWxv
dzoKKyAgICBjYXNlIEFib3ZlRXF1YWw6CisgICAgY2FzZSBCZWxvd0VxdWFsOgorICAgICAgICBy
ZXR1cm4gSW50MzI7CisgICAgY2FzZSBTRXh0MzI6CisgICAgY2FzZSBaRXh0MzI6CisgICAgICAg
IHJldHVybiBJbnQ2NDsKKyAgICBjYXNlIEZSb3VuZDoKKyAgICBjYXNlIElUb0Q6CisgICAgICAg
IHJldHVybiBEb3VibGU7CisgICAgY2FzZSBOb3A6CisgICAgICAgIHJldHVybiBWb2lkOworICAg
IGRlZmF1bHQ6CisgICAgICAgIFJFTEVBU0VfQVNTRVJUX05PVF9SRUFDSEVEKCk7CisgICAgfQor
fQorCit9IH0gLy8gbmFtZXNwYWNlIEpTQzo6QjMKKwpJbmRleDogU291cmNlL0phdmFTY3JpcHRD
b3JlL2IzL0IzVmFsdWUuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMv
QjNWYWx1ZS5oCShyZXZpc2lvbiAwKQorKysgU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzVmFs
dWUuaAkod29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDE5NSBAQAorLyoKKyAqIENvcHlyaWdodCAo
QykgMjAxNSBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmli
dXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0
CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93
aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291
cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0
aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICog
Mi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92
ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRo
ZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29y
IG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICog
VEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5Z
CisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJ
TUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBB
TkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAg
SU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJM
RSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVN
UExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlU
RUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBM
T1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElP
TikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hF
VEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElO
RyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUg
VVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklM
SVRZIE9GIFNVQ0ggREFNQUdFLiAKKyAqLworCisjaWZuZGVmIEIzVmFsdWVfaAorI2RlZmluZSBC
M1ZhbHVlX2gKKworI2luY2x1ZGUgIkIzT3JpZ2luLmgiCisjaW5jbHVkZSAiQjNUeXBlLmgiCisj
aW5jbHVkZSA8d3RmL0Zhc3RNYWxsb2MuaD4KKyNpbmNsdWRlIDx3dGYvTm9uY29weWFibGUuaD4K
KworbmFtZXNwYWNlIEpTQyB7IG5hbWVzcGFjZSBCMyB7CisKK2NsYXNzIFZhbHVlIHsKKyAgICBX
VEZfTUFLRV9OT05DT1BZQUJMRShWYWx1ZSk7CisgICAgV1RGX01BS0VfRkFTVF9BTExPQ0FURUQ7
CitwdWJsaWM6CisgICAgdHlwZWRlZiBWZWN0b3I8VmFsdWUqLCAzPiBBZGphY2VuY3lMaXN0Owor
CisgICAgc3RhdGljIGNvbnN0IGNoYXIqIGR1bXBQcmVmaXggPSAiQCI7CisKKyAgICBzdGF0aWMg
Ym9vbCBhY2NlcHRzKE9wY29kZSkgeyByZXR1cm4gdHJ1ZTsgfQorCisgICAgdmlydHVhbCB+VmFs
dWUoKTsKKworICAgIHVuc2lnbmVkIGluZGV4KCkgY29uc3QgeyByZXR1cm4gbV9pbmRleDsgfQor
ICAgIAorICAgIC8vIE5vdGUgdGhhdCB0aGUgb3Bjb2RlIGlzIGltbXV0YWJsZSwgZXhjZXB0IGZv
ciByZXBsYWNpbmcgdmFsdWVzIHdpdGggaWRlbnRpdHkuCisgICAgT3Bjb2RlIG9wY29kZSgpIGNv
bnN0IHsgcmV0dXJuIG1fb3Bjb2RlOyB9CisKKyAgICBPcmlnaW4gb3JpZ2luKCkgY29uc3QgeyBy
ZXR1cm4gbV9vcmlnaW47IH0KKyAgICAKKyAgICBWYWx1ZSomIGNoaWxkKHVuc2lnbmVkIGluZGV4
KSB7IHJldHVybiBtX2NoaWxkcmVuW2luZGV4XTsgfQorICAgIFZhbHVlKiBjaGlsZCh1bnNpZ25l
ZCBpbmRleCkgY29uc3QgeyByZXR1cm4gbV9jaGlsZHJlbltpbmRleF07IH0KKworICAgIC8vIFRo
aXMgY29tcHV0ZXMgdGhlIHR5cGUgdXNpbmcgdGhlIG9wY29kZS4KKyAgICBUeXBlIHR5cGUoKSBj
b25zdCB7IHJldHVybiBtX3R5cGU7IH0KKworICAgIEFkamFjZW5jeUxpc3QmIGNoaWxkcmVuKCkg
eyByZXR1cm4gbV9jaGlsZHJlbjsgfSAKKyAgICBjb25zdCBBZGphY2VuY3lMaXN0JiBjaGlsZHJl
bigpIGNvbnN0IHsgcmV0dXJuIG1fY2hpbGRyZW47IH0KKworICAgIHZvaWQgcmVwbGFjZVdpdGhJ
ZGVudGl0eShWYWx1ZSopOworICAgIHZvaWQgcmVwbGFjZVdpdGhOb3AoKTsKKworICAgIHZvaWQg
ZHVtcChQcmludFN0cmVhbSYpIGNvbnN0OworICAgIHZvaWQgZGVlcER1bXAoUHJpbnRTdHJlYW0m
KSBjb25zdDsKKworICAgIC8vIFRoaXMgaXMgaG93IHlvdSBjYXN0IFZhbHVlcy4gRm9yIGV4YW1w
bGUsIGlmIHlvdSB3YW50IHRvIGRvIHNvbWV0aGluZyBwcm92aWRlZCB0aGF0IHdlIGhhdmUgYQor
ICAgIC8vIEFyZ3VtZW50UmVnVmFsdWUsIHlvdSBjYW4gZG86CisgICAgLy8KKyAgICAvLyBpZiAo
QXJndW1lbnRSZWdWYWx1ZSogYXJndW1lbnRSZWcgPSB2YWx1ZS0+YXM8QXJndW1lbnRSZWdWYWx1
ZT4oKSkgeworICAgIC8vICAgICB0aGluZ3MKKyAgICAvLyB9CisgICAgLy8KKyAgICAvLyBUaGlz
IHdpbGwgcmV0dXJuIG51bGwgaWYgdGhpcyBvcGNvZGUoKSAhPSBBcmd1bWVudFJlZy4gVGhpcyB3
b3JrcyBiZWNhdXNlIHRoaXMgcmV0dXJucyBudWxscHRyCisgICAgLy8gaWYgVDo6YWNjZXB0cyhv
cGNvZGUoKSkgcmV0dXJucyBmYWxzZS4KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorICAgIFQq
IGFzKCk7CisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4KKyAgICBjb25zdCBUKiBhcygpIGNvbnN0
OworICAgIAorICAgIGJvb2wgaGFzSW50MzIoKSBjb25zdDsKKyAgICBpbnQzMl90IGFzSW50MzIo
KSBjb25zdDsKKyAgICAKKyAgICBib29sIGhhc0ludDY0KCkgY29uc3Q7CisgICAgaW50NjRfdCBh
c0ludDY0KCkgY29uc3Q7CisKKyAgICBib29sIGhhc0ludCgpIGNvbnN0OworICAgIGludDY0X3Qg
YXNJbnQoKSBjb25zdDsKKyAgICBib29sIGlzSW50KGludDY0X3QgdmFsdWUpIGNvbnN0OworCisg
ICAgYm9vbCBoYXNEb3VibGUoKSBjb25zdDsKKyAgICBkb3VibGUgYXNEb3VibGUoKSBjb25zdDsK
KworICAgIFN0YWNrbWFwKiBzdGFja21hcCgpOworCitwcm90ZWN0ZWQ6CisgICAgdmlydHVhbCB2
b2lkIGR1bXBNZXRhKFByaW50U3RyZWFtJikgY29uc3Q7CisgICAgCitwcml2YXRlOgorICAgIGZy
aWVuZCBjbGFzcyBQcm9jZWR1cmU7CisgICAgCisgICAgLy8gSW5zdGFudGlhdGUgdmFsdWVzIHZp
YSBQcm9jZWR1cmUuCisgICAgLy8gVGhpcyBmb3JtIHJlcXVpcmVzIHNwZWNpZnlpbmcgdGhlIHR5
cGUgZXhwbGljaXRseToKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZS4uLiBBcmd1bWVudHM+CisgICAg
ZXhwbGljaXQgVmFsdWUodW5zaWduZWQgaW5kZXgsIE9wY29kZSBvcGNvZGUsIFR5cGUgdHlwZSwg
T3JpZ2luIG9yaWdpbiwgVmFsdWUqIGZpcnN0Q2hpbGQsIEFyZ3VtZW50cy4uLiBhcmd1bWVudHMp
CisgICAgICAgIDogbV9pbmRleChpbmRleCkKKyAgICAgICAgLCBtX29wY29kZShvcGNvZGUpCisg
ICAgICAgICwgbV90eXBlKHR5cGUpCisgICAgICAgICwgbV9vcmlnaW4ob3JpZ2luKQorICAgICAg
ICAsIG1fY2hpbGRyZW57IGZpcnN0Q2hpbGQsIGFyZ3VtZW50cy4uLiB9CisgICAgeworICAgIH0K
KyAgICAvLyBUaGlzIGZvcm0gaXMgZm9yIHNwZWNpZnlpbmcgdGhlIHR5cGUgZXhwbGljaXRseSB3
aGVuIHRoZSBvcGNvZGUgaGFzIG5vIGNoaWxkcmVuOgorICAgIGV4cGxpY2l0IFZhbHVlKHVuc2ln
bmVkIGluZGV4LCBPcGNvZGUgb3Bjb2RlLCBUeXBlIHR5cGUsIE9yaWdpbiBvcmlnaW4pCisgICAg
ICAgIDogbV9pbmRleChpbmRleCkKKyAgICAgICAgLCBtX29wY29kZShvcGNvZGUpCisgICAgICAg
ICwgbV90eXBlKHR5cGUpCisgICAgICAgICwgbV9vcmlnaW4ob3JpZ2luKQorICAgIHsKKyAgICB9
CisgICAgLy8gVGhpcyBmb3JtIGlzIGZvciB0aG9zZSBvcGNvZGVzIHRoYXQgY2FuIGluZmVyIHRo
ZWlyIHR5cGUgZnJvbSB0aGUgb3Bjb2RlIGFuZCBmaXJzdCBjaGlsZDoKKyAgICB0ZW1wbGF0ZTx0
eXBlbmFtZS4uLiBBcmd1bWVudHM+CisgICAgZXhwbGljaXQgVmFsdWUodW5zaWduZWQgaW5kZXgs
IE9wY29kZSBvcGNvZGUsIE9yaWdpbiBvcmlnaW4sIFZhbHVlKiBmaXJzdENoaWxkLCBBcmd1bWVu
dHMuLi4gYXJndW1lbnRzKQorICAgICAgICA6IG1faW5kZXgoaW5kZXgpCisgICAgICAgICwgbV9v
cGNvZGUob3Bjb2RlKQorICAgICAgICAsIG1fdHlwZSh0eXBlRm9yKG9wY29kZSwgZmlyc3RDaGls
ZCkpCisgICAgICAgICwgbV9vcmlnaW4ob3JpZ2luKQorICAgICAgICAsIG1fY2hpbGRyZW57IGZp
cnN0Q2hpbGQsIGFyZ3VtZW50cy4uLiB9CisgICAgeworICAgIH0KKyAgICAvLyBUaGlzIGZvcm0g
aXMgZm9yIHRob3NlIG9wY29kZXMgdGhhdCBjYW4gaW5mZXIgdGhlaXIgdHlwZSBmcm9tIHRoZSBv
cGNvZGUgYWxvbmUsIGFuZCB0aGF0IGRvbid0CisgICAgLy8gdGFrZSBhbnkgYXJndW1lbnRzOgor
ICAgIGV4cGxpY2l0IFZhbHVlKHVuc2lnbmVkIGluZGV4LCBPcGNvZGUgb3Bjb2RlLCBPcmlnaW4g
b3JpZ2luKQorICAgICAgICA6IG1faW5kZXgoaW5kZXgpCisgICAgICAgICwgbV9vcGNvZGUob3Bj
b2RlKQorICAgICAgICAsIG1fdHlwZSh0eXBlRm9yKG9wY29kZSwgbnVsbHB0cikpCisgICAgICAg
ICwgbV9vcmlnaW4ob3JpZ2luKQorICAgIHsKKyAgICB9CisgICAgLy8gVXNlIHRoaXMgZm9ybSBm
b3IgdmFyYXJncy4KKyAgICBleHBpY2l0IFZhbHVlKHVuc2lnbmVkIGluZGV4LCBPcGNvZGUgb3Bj
b2RlLCBUeXBlIHR5cGUsIE9yaWdpbiBvcmlnaW4sIGNvbnN0IEFkamFjZW5jeUxpc3QmIGNoaWxk
cmVuKQorICAgICAgICA6IG1faW5kZXgoaW5kZXgpCisgICAgICAgICwgbV9vcGNvZGUob3Bjb2Rl
KQorICAgICAgICAsIG1fdHlwZSh0eXBlKQorICAgICAgICAsIG1fb3JpZ2luKG9yaWdpbikKKyAg
ICAgICAgLCBtX2NoaWxkcmVuKGNoaWxkcmVuKQorICAgIHsKKyAgICB9CisKKyAgICBzdGF0aWMg
VHlwZSB0eXBlRm9yKE9wY29kZSwgVmFsdWUqIGZpcnN0Q2hpbGQpOworCisgICAgLy8gVGhpcyBn
cm91cCBvZiBmaWVsZHMgaXMgYXJyYW5nZWQgdG8gZml0IGluIDY0IGJpdHMuCisgICAgdW5zaWdu
ZWQgbV9pbmRleDsKKyAgICBPcGNvZGUgbV9vcGNvZGU7CisgICAgVHlwZSBtX3R5cGU7CisgICAg
CisgICAgT3JpZ2luIG1fb3JpZ2luOworICAgIEFkamFjZW5jeUxpc3QgbV9jaGlsZHJlbjsKKwor
cHVibGljOgorICAgIEJhc2ljQmxvY2sqIG93bmVyIHsgbnVsbHB0ciB9OyAvLyBjb21wdXRlZCBs
YXppbHkuCisgICAgVmFsdWUqIHJlcGxhY2VtZW50IHsgbnVsbHB0ciB9OyAvLyB1c2VkIGZvciBh
bmFseXNlcyBhbmQgdHJhbnNmb3JtYXRpb25zLgorfTsKKworY2xhc3MgRGVlcFZhbHVlRHVtcCB7
CitwdWJsaWM6CisgICAgRGVlcFZhbHVlRHVtcChWYWx1ZSogdmFsdWUpCisgICAgICAgIDogbV92
YWx1ZSh2YWx1ZSkKKyAgICB7CisgICAgfQorCisgICAgdm9pZCBkdW1wKFByaW50U3RyZWFtJiBv
dXQpIGNvbnN0CisgICAgeworICAgICAgICBpZiAobV92YWx1ZSkKKyAgICAgICAgICAgIG1fdmFs
dWUtPmRlZXBEdW1wKG91dCk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIG91dC5wcmludCgi
PG51bGw+Iik7CisgICAgfQorCitwcml2YXRlOgorICAgIFZhbHVlKiBtX3ZhbHVlOworfTsKKwor
RGVlcFZhbHVlRHVtcCBkZWVwRHVtcChWYWx1ZSogdmFsdWUpCit7CisgICAgcmV0dXJuIERlZXBW
YWx1ZUR1bXAodmFsdWUpOworfQorCit9IH0gLy8gbmFtZXNwYWNlIEpTQzo6QjMKKworI2VuZGlm
IC8vIEIzVmFsdWVfaAorCkluZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNWYWx1ZUlu
bGluZXMuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNWYWx1ZUlu
bGluZXMuaAkocmV2aXNpb24gMCkKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM1ZhbHVl
SW5saW5lcy5oCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsMTA5IEBACisvKgorICogQ29weXJp
Z2h0IChDKSAyMDE1IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRp
c3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdp
dGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBm
b2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBv
ZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3Rp
Y2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIu
CisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhl
IGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBh
bmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBh
bmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAq
CisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFO
RCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBO
T1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklM
SVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlN
RUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUg
TElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAq
IEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1Qg
TElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklD
RVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJS
VVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZ
LCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5D
TFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9G
IFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9T
U0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisKKyNpZm5kZWYgQjNWYWx1ZUlubGluZXNf
aAorI2RlZmluZSBCM1ZhbHVlSW5saW5lc19oCisKKyNpbmNsdWRlICJCM0NoZWNrVmFsdWUuaCIK
KyNpbmNsdWRlICJCM0NvbnN0MzJWYWx1ZS5oIgorI2luY2x1ZGUgIkIzQ29uc3Q2NFZhbHVlLmgi
CisjaW5jbHVkZSAiQjNDb25zdERvdWJsZVZhbHVlLmgiCisjaW5jbHVkZSAiQjNQYXRjaHBvaW50
VmFsdWUuaCIKKyNpbmNsdWRlICJCM1ZhbHVlLmgiCisKK25hbWVzcGFjZSBKU0MgeyBuYW1lc3Bh
Y2UgQjMgeworCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorVCogVmFsdWU6OmFzKCkKK3sKKyAgICBp
ZiAoVDo6YWNjZXB0cyhvcGNvZGUoKSkpCisgICAgICAgIHJldHVybiBzdGF0aWNfY2FzdDxUKj4o
dGhpcyk7CisgICAgcmV0dXJuIG51bGxwdHI7Cit9CisKK3RlbXBsYXRlPnR5cGVuYW1lIFQ+Citj
b25zdCBUKiBWYWx1ZTo6YXMoKSBjb25zdAoreworICAgIHJldHVybiBjb25zdF9jYXN0PFZhbHVl
Kj4odGhpcyktPmFzPFQ+KCk7Cit9CisKK2Jvb2wgVmFsdWU6Omhhc0ludDMyKCkgY29uc3QKK3sK
KyAgICByZXR1cm4gISFhczxDb25zdDMyVmFsdWU+KCk7Cit9CisKK2ludDMyX3QgVmFsdWU6OmFz
SW50MzIoKSBjb25zdAoreworICAgIHJldHVybiBhczxDb25zdDMyVmFsdWU+KCktPnZhbHVlKCk7
Cit9CisKK2Jvb2wgVmFsdWU6Omhhc0ludDY0KCkgY29uc3QKK3sKKyAgICByZXR1cm4gISFhczxD
b25zdDY0VmFsdWU+KCk7Cit9CisKK2ludDY0X3QgVmFsdWU6OmFzSW50NjQoKSBjb25zdAorewor
ICAgIHJldHVybiBhczxDb25zdDY0VmFsdWU+KCktPnZhbHVlKCk7Cit9CisKK2Jvb2wgVmFsdWU6
Omhhc0ludCgpIGNvbnN0Cit7CisgICAgcmV0dXJuIGhhc0ludDMyKCkgfHwgaGFzSW50NjQoKTsK
K30KKworaW50NjRfdCBWYWx1ZTo6YXNJbnQoKSBjb25zdAoreworICAgIHJldHVybiBoYXNJbnQz
MigpID8gYXNJbnQzMigpIDogYXNJbnQ2NCgpOworfQorCitib29sIFZhbHVlOjppc0ludChpbnQ2
NF90IHZhbHVlKSBjb25zdAoreworICAgIHJldHVybiBoYXNJbnQoKSAmJiBhc0ludCgpID09IHZh
bHVlOworfQorCitib29sIFZhbHVlOjpoYXNEb3VibGUoKSBjb25zdAoreworICAgIHJldHVybiAh
IWFzPENvbnN0RG91YmxlVmFsdWU+KCk7Cit9CisKK2RvdWJsZSBWYWx1ZTo6YXNEb3VibGUoKSBj
b25zdAoreworICAgIHJldHVybiBhczxDb25zdERvdWJsZVZhbHVlPigpLT52YWx1ZSgpOworfQor
CitTdGFja21hcCogVmFsdWU6OnN0YWNrbWFwKCkKK3sKKyAgICBpZiAoQ2hlY2tWYWx1ZSogY2hl
Y2sgPSBhczxDaGVja1ZhbHVlPigpKQorICAgICAgICByZXR1cm4gJmNoZWNrLT5zdGFja21hcDsK
KyAgICBpZiAoUGF0Y2hwb2ludFZhbHVlKiBwYXRjaHBvaW50ID0gYXM8UGF0Y2hwb2ludFZhbHVl
PigpKQorICAgICAgICByZXR1cm4gJnBhdGNocG9pbnQtPnN0YWNrbWFwOworICAgIHJldHVybiBu
dWxscHRyOworfQorCit9IH0gLy8gbmFtZXNwYWNlIEpTQzo6QjMKKworI2VuZGlmIC8vIEIzVmFs
dWVJbmxpbmVzX2gKKwpJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzVmFsdWVSZXAu
Y3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM1ZhbHVlUmVwLmNw
cAkocmV2aXNpb24gMCkKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM1ZhbHVlUmVwLmNw
cAkod29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDg2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAy
MDE1IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlv
biBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAq
IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcg
Y29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2Ug
Y29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMg
bGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBS
ZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNv
cHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZv
bGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3Ro
ZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElT
IFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAq
IEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRF
RCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBG
SVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBO
TyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZP
UiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFS
WSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBU
TywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1Mg
T0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBI
T1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVS
IElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5F
R0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UK
KyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkg
T0YgU1VDSCBEQU1BR0UuIAorICovCisKKyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJC
M1ZhbHVlUmVwLmgiCisKK25hbWVzcGFjZSBKU0MgeyBuYW1lc3BhY2UgQjMgeworCit2b2lkIFZh
bHVlUmVwOjpkdW1wKFByaW50U3RyZWFtJiBvdXQpIGNvbnN0Cit7CisgICAgb3V0LnByaW50KG1f
a2luZCk7CisgICAgc3dpdGNoIChtX2tpbmQpIHsKKyAgICBjYXNlIE5vbmU6CisgICAgY2FzZSBT
b21lUmVnaXN0ZXI6CisgICAgICAgIHJldHVybjsKKyAgICBjYXNlIFJlZ2lzdGVyOgorICAgICAg
ICBvdXQucHJpbnQoIigiLCByZWcoKSwgIikiKTsKKyAgICAgICAgcmV0dXJuOworICAgIGNhc2Ug
U3RhY2s6CisgICAgICAgIG91dC5wcmludCgiKCIsIG9mZnNldEZyb21GUCgpLCAiKSIpOworICAg
ICAgICByZXR1cm47CisgICAgY2FzZSBTdGFja0FyZ3VtZW50OgorICAgICAgICBvdXQucHJpbnQo
IigiLCBvZmZzZXRGcm9tU1AoKSwgIikiKTsKKyAgICAgICAgcmV0dXJuOworICAgIGNhc2UgQ29u
c3RhbnQ6CisgICAgICAgIG91dC5wcmludCgiKCIsIHZhbHVlKCksICIpIik7CisgICAgICAgIHJl
dHVybjsKKyAgICB9CisgICAgUkVMRUFTRV9BU1NFUlRfTk9UX1JFQUNIRUQoKTsKK30KKworfSB9
IC8vIG5hbWVzcGFjZSBKU0M6OkIzCisKK25hbWVzcGFjZSBXVEYgeworCit1c2luZyBuYW1lc3Bh
Y2UgSlNDOjpCMzsKKwordm9pZCBwcmludEludGVybmFsKFByaW50U3RyZWFtJiBvdXQsIFZhbHVl
UmVwOjpLaW5kIGtpbmQpCit7CisgICAgc3dpdGNoIChraW5kKSB7CisgICAgY2FzZSBWYWx1ZVJl
cDo6QW55OgorICAgICAgICBvdXQucHJpbnQoIkFueSIpOworICAgICAgICByZXR1cm47CisgICAg
Y2FzZSBWYWx1ZVJlcDo6U29tZVJlZ2lzdGVyOgorICAgICAgICBvdXQucHJpbnQoIlNvbWVSZWdp
c3RlciIpOworICAgICAgICByZXR1cm47CisgICAgY2FzZSBWYWx1ZVJlcDo6UmVnaXN0ZXI6Cisg
ICAgICAgIG91dC5wcmludCgiUmVnaXN0ZXIiKTsKKyAgICAgICAgcmV0dXJuOworICAgIGNhc2Ug
VmFsdWVSZXA6OlN0YWNrOgorICAgICAgICBvdXQucHJpbnQoIlN0YWNrIik7CisgICAgICAgIHJl
dHVybjsKKyAgICBjYXNlIFZhbHVlUmVwOjpTdGFja0FyZ3VtZW50OgorICAgICAgICBvdXQucHJp
bnQoIlN0YWNrQXJndW1lbnQiKTsKKyAgICAgICAgcmV0dXJuOworICAgIGNhc2UgVmFsdWVSZXA6
OkNvbnN0YW50OgorICAgICAgICBvdXQucHJpbnQoIkNvbnN0YW50Iik7CisgICAgICAgIHJldHVy
bjsKKyAgICB9CisgICAgUkVMRUFTRV9BU1NFUlRfTk9UX1JFQUNIRUQoKTsKK30KKworfSAvLyBu
YW1lc3BhY2UgV1RGCisKSW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM1ZhbHVlUmVw
LmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzVmFsdWVSZXAuaAko
cmV2aXNpb24gMCkKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM1ZhbHVlUmVwLmgJKHdv
cmtpbmcgY29weSkKQEAgLTAsMCArMSwxNTggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTUg
QXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFu
ZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9k
aWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25k
aXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2Rl
IG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0
IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlz
dHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJp
Z2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93
aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBt
YXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09G
VFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQ
UkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRP
LCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5F
U1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVW
RU5UIFNIQUxMIEFQUExFIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFO
WSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBP
UiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAor
ICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBV
U0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VW
RVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4g
Q09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElH
RU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICog
T0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBT
VUNIIERBTUFHRS4gCisgKi8KKworI2lmbmRlZiBCM1ZhbHVlUmVwX2gKKyNkZWZpbmUgQjNWYWx1
ZVJlcF9oCisKKyNpbmNsdWRlICJSZWcuaCIKKyNpbmNsdWRlIDx3dGYvUHJpbnRTdHJlYW0uaD4K
KworbmFtZXNwYWNlIEpTQyB7IG5hbWVzcGFjZSBCMyB7CisKKy8vIFdlIHVzZSB0aGlzIGNsYXNz
IHRvIGRlc2NyaWJlIHZhbHVlIHJlcHJlc2VudGF0aW9ucyBhdCBzdGFja21hcHMuIEl0J3MgdXNl
ZCBib3RoIHRvIGZvcmNlIGEKKy8vIHJlcHJlc2VudGF0aW9uIGFuZCB0byBnZXQgdGhlIHJlcHJl
c2VudGF0aW9uLiBXaGVuIHRoZSBCMyBjbGllbnQgZm9yY2VzIGEgcmVwcmVzZW50YXRpb24sIHdl
IHNheQorLy8gdGhhdCBpdCdzIGFuIGlucHV0LiBXaGVuIEIzIHRlbGxzIHRoZSBjbGllbnQgd2hh
dCByZXByZXNlbnRhdGlvbiBpdCBwaWNrZWQsIHdlIHNheSB0aGF0IGl0J3MgYW4KKy8vIG91dHB1
dC4KKworY2xhc3MgVmFsdWVSZXAgeworcHVibGljOgorICAgIGVudW0gS2luZCB7CisgICAgICAg
IC8vIEFzIGFuIGlucHV0IHJlcHJlc2VudGF0aW9uLCB0aGlzIG1lYW5zIHRoYXQgQjMgY2FuIHBp
Y2sgYW55IHJlcHJlc2VudGF0aW9uLiBBcyBhbgorICAgICAgICAvLyBvdXRwdXQgcmVwcmVzZW50
YXRpb24sIHRoaXMgbWVhbnMgdGhhdCB3ZSBkb24ndCBrbm93LiBUaGlzIHdpbGwgb25seSBhcmlz
ZSBmb3IgdGhlCisgICAgICAgIC8vIHJpZ2h0IG9wZXJhbmQgKGkuZS4gY2hpbGQoMSkpIG9mIGEg
Q2hlY2tNdWwuCisgICAgICAgIEFueSwKKworICAgICAgICAvLyBBcyBhbiBpbnB1dCByZXByZXNl
bnRhdGlvbiwgdGhpcyBtZWFucyB0aGF0IEIzIHNob3VsZCBwaWNrIHNvbWUgcmVnaXN0ZXIuIEl0
IGNvdWxkIGJlIGEKKyAgICAgICAgLy8gcmVnaXN0ZXIgdGhhdCB0aGlzIGNsYWltcyB0byBjbG9i
YmVyIQorICAgICAgICBTb21lUmVnaXN0ZXIsCisKKyAgICAgICAgLy8gQXMgYW4gaW5wdXQgcmVw
cmVzZW50YXRpb24sIHRoaXMgZm9yY2VzIGEgcGFydGljdWxhciByZWdpc3Rlci4gQXMgYW4gb3V0
cHV0CisgICAgICAgIC8vIHJlcHJlc2VudGF0aW9uLCB0aGlzIHRlbGxzIHVzIHdoYXQgcmVnaXN0
ZXIgQjMgcGlja2VkLgorICAgICAgICBSZWdpc3RlciwKKworICAgICAgICAvLyBBcyBhbiBvdXRw
dXQgcmVwcmVzZW50YXRpb24sIHRoaXMgdGVsbHMgdXMgd2hhdCBzdGFjayBzbG90IEIzIHBpY2tl
ZC4gSXQncyBub3QgYSB2YWxpZAorICAgICAgICAvLyBpbnB1dCByZXByZXNlbnRhdGlvbi4KKyAg
ICAgICAgU3RhY2ssCisKKyAgICAgICAgLy8gQXMgYW4gaW5wdXQgcmVwcmVzZW50YXRpb24sIHRo
aXMgZm9yY2VzIHRoZSB2YWx1ZSB0byBlbmQgdXAgaW4gdGhlIGFyZ3VtZW50IGFyZWEgYXQgc29t
ZQorICAgICAgICAvLyBvZmZzZXQuCisgICAgICAgIFN0YWNrQXJndW1lbnQsCisKKyAgICAgICAg
Ly8gQXMgYW4gb3V0cHV0IHJlcHJlc2VudGF0aW9uLCB0aGlzIHRlbGxzIHVzIHRoYXQgQjMgY29u
c3RhbnQtZm9sZGVkIHRoZSB2YWx1ZS4KKyAgICAgICAgQ29uc3RhbnQKKyAgICB9OworICAgIAor
ICAgIFZhbHVlUmVwKCkKKyAgICAgICAgOiBtX2tpbmQoQW55KQorICAgIHsKKyAgICB9CisKKyAg
ICBleHBsaWNpdCBWYWx1ZVJlcChSZWcgcmVnKQorICAgICAgICA6IG1fa2luZChSZWdpc3RlcikK
KyAgICAgICAgLCBtX3ZhbHVlKHJlZy5pbmRleCgpKQorICAgIHsKKyAgICB9CisKKyAgICBzdGF0
aWMgVmFsdWVSZXAgcmVnKFJlZyByZWcpCisgICAgeworICAgICAgICByZXR1cm4gVmFsdWVSZXAo
cmVnKTsKKyAgICB9CisKKyAgICBzdGF0aWMgVmFsdWVSZXAgc3RhY2soaW50cHRyX3Qgb2Zmc2V0
RnJvbUZQKQorICAgIHsKKyAgICAgICAgVmFsdWVSZXAgcmVzdWx0OworICAgICAgICByZXN1bHQu
bV9raW5kID0gU3RhY2s7CisgICAgICAgIHJlc3VsdC5tX3ZhbHVlID0gb2Zmc2V0RnJvbUZQOwor
ICAgIH0KKworICAgIHN0YXRpYyBWYWx1ZVJlcCBzdGFja0FyZ3VtZW50KGludHB0cl90IG9mZnNl
dEZyb21TUCkKKyAgICB7CisgICAgICAgIFZhbHVlUmVwIHJlc3VsdDsKKyAgICAgICAgcmVzdWx0
Lm1fa2luZCA9IFN0YWNrQXJndW1lbnQ7CisgICAgICAgIHJlc3VsdC5tX3ZhbHVlID0gb2Zmc2V0
RnJvbVNQOworICAgIH0KKworICAgIHN0YXRpYyBWYWx1ZVJlcCBjb25zdGFudChpbnQ2NF90IHZh
bHVlKQorICAgIHsKKyAgICAgICAgVmFsdWVSZXAgcmVzdWx0OworICAgICAgICByZXN1bHQubV9r
aW5kID0gQ29uc3RhbnQ7CisgICAgICAgIHJlc3VsdC5tX3ZhbHVlID0gdmFsdWU7CisgICAgfQor
CisgICAgc3RhdGljIFZhbHVlUmVwIGNvbnN0YW50RG91YmxlKGRvdWJsZSB2YWx1ZSkKKyAgICB7
CisgICAgICAgIHJldHVybiBWYWx1ZVJlcChiaXR3aXNlX2Nhc3Q8aW50NjRfdD4odmFsdWUpKTsK
KyAgICB9CisKKyAgICBLaW5kIGtpbmQoKSBjb25zdCB7IHJldHVybiBtX2tpbmQ7IH0KKworICAg
IGV4cGxpY2l0IG9wZXJhdG9yIGJvb2woKSBjb25zdCB7IHJldHVybiBraW5kKCkgIT0gQW55OyB9
CisKKyAgICBSZWcgcmVnKCkgY29uc3QKKyAgICB7CisgICAgICAgIEFTU0VSVChraW5kKCkgPT0g
UmVnaXN0ZXIpOworICAgICAgICByZXR1cm4gUmVnOjpmcm9tSW5kZXgobV92YWx1ZSk7CisgICAg
fQorCisgICAgaW50cHRyX3Qgb2Zmc2V0RnJvbUZQKCkgY29uc3QKKyAgICB7CisgICAgICAgIEFT
U0VSVChraW5kKCkgPT0gU3RhY2spOworICAgICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8aW50cHRy
X3Q+KG1fdmFsdWUpOworICAgIH0KKworICAgIGludHB0cl90IG9mZnNldEZyb21TUCgpIGNvbnN0
CisgICAgeworICAgICAgICBBU1NFUlQoa2luZCgpID09IFN0YWNrQXJndW1lbnQpOworICAgICAg
ICByZXR1cm4gc3RhdGljX2Nhc3Q8aW50cHRyX3Q+KG1fdmFsdWUpOworICAgIH0KKworICAgIGlu
dDY0X3QgdmFsdWUoKSBjb25zdAorICAgIHsKKyAgICAgICAgQVNTRVJUKGtpbmQoKSA9PSBDb25z
dGFudCk7CisgICAgICAgIHJldHVybiBtX3ZhbHVlOworICAgIH0KKworICAgIGRvdWJsZSBkb3Vi
bGVWYWx1ZSgpIGNvbnN0CisgICAgeworICAgICAgICByZXR1cm4gYml0d2lzZV9jYXN0PGRvdWJs
ZT4odmFsdWUoKSk7CisgICAgfQorCisgICAgdm9pZCBkdW1wKFByaW50U3RyZWFtJikgY29uc3Q7
CisKK3ByaXZhdGU6CisgICAgS2luZCBtX2tpbmQ7CisgICAgaW50NjRfdCBtX3ZhbHVlOworfTsK
KworfSB9IC8vIG5hbWVzcGFjZSBKU0M6OkIzCisKK25hbWVzcGFjZSBXVEYgeworCit2b2lkIHBy
aW50SW50ZXJuYWwoUHJpbnRTdHJlYW0mLCBKU0M6OkIzOjpWYWx1ZVJlcDo6S2luZCk7CisKK30g
Ly8gbmFtZXNwYWNlIFdURgorCisjZW5kaWYgLy8gQjNWYWx1ZVJlcF9oCisKSW5kZXg6IFNvdXJj
ZS9KYXZhU2NyaXB0Q29yZS9iMy9nZW5lcmF0ZV9wYXR0ZXJuX21hdGNoZXIucmIKPT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PQotLS0gU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL2dlbmVyYXRlX3BhdHRlcm5fbWF0Y2hlci5y
YgkocmV2aXNpb24gMCkKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9nZW5lcmF0ZV9wYXR0
ZXJuX21hdGNoZXIucmIJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSw0OTMgQEAKKyMhL3Vzci9i
aW4vZW52IHJ1YnkKKworIyBDb3B5cmlnaHQgKEMpIDIwMTUgQXBwbGUgSW5jLiBBbGwgcmlnaHRz
IHJlc2VydmVkLgorIworIyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmlu
YXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyMgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVk
IHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisjIGFyZSBtZXQ6CisjIDEu
IFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29w
eXJpZ2h0CisjICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xs
b3dpbmcgZGlzY2xhaW1lci4KKyMgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11
c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyMgICAgbm90aWNlLCB0aGlzIGxpc3Qg
b2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorIyAgICBk
b2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlz
dHJpYnV0aW9uLgorIworIyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4g
QU5EIElUUyBDT05UUklCVVRPUlMgYGBBUyBJUycnCisjIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBM
SUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorIyBUSEUgSU1Q
TElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJU
SUNVTEFSCisjIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIEFQUExF
IElOQy4gT1IgSVRTIENPTlRSSUJVVE9SUworIyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElO
RElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCisjIENPTlNFUVVFTlRJ
QUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9G
CisjIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQ
Uk9GSVRTOyBPUiBCVVNJTkVTUworIyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBP
TiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTgorIyBDT05UUkFDVCwgU1RSSUNU
IExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQor
IyBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZF
TiBJRiBBRFZJU0VEIE9GCisjIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworcmVx
dWlyZSAicGF0aG5hbWUiCisKKyR2YXJJbmRleCA9IDAKK2RlZiBuZXdWYXIKKyAgICAkdmFySW5k
ZXggKz0gMQorICAgICJfdG1wI3skdmFySW5kZXh9IgorZW5kCisKK2NsYXNzIFByb2R1Y3Rpb24K
KyAgICBhdHRyX3JlYWRlciA6b3JpZ2luLCA6bmFtZSwgOnZhck5hbWUsIDphbm9ueW1vdXMsIDpv
cGNvZGUsIDpjaGlsZHJlbgorCisgICAgZGVmIGluaXRpYWxpemUob3JpZ2luLCBuYW1lLCBvcGNv
ZGUsIGNoaWxkcmVuKQorICAgICAgICBAb3JpZ2luID0gb3JpZ2luCisgICAgICAgIEBuYW1lID0g
bmFtZQorICAgICAgICBAYW5vbnltb3VzID0gKG5hbWUgPT0gbmlsIG9yIG5hbWUgPX4gL1xBXCQo
WzAtOV0rKVxaLykKKyAgICAgICAgQHZhck5hbWUgPSBAYW5vbnltb3VzID8gbmV3VmFyIDogbmFt
ZQorICAgICAgICBAb3Bjb2RlID0gb3Bjb2RlCisgICAgICAgIEBjaGlsZHJlbiA9IGNoaWxkcmVu
ID8gY2hpbGRyZW4gOiBbXQorICAgIGVuZAorCisgICAgZGVmIGhhc09wY29kZQorICAgICAgICBv
cGNvZGUgIT0gbmlsCisgICAgZW5kCisKKyAgICBkZWYgZWFjaFZhcmlhYmxlKCZwcm9jKQorICAg
ICAgICBjaGlsZHJlbi5lYWNoX3dpdGhfaW5kZXggeworICAgICAgICAgICAgfCBjaGlsZCwgaW5k
ZXggfAorICAgICAgICAgICAgeWllbGQgdmFyTmFtZSwKKyAgICAgICAgICAgICAgICAgIGNoaWxk
Lm5hbWUsCisgICAgICAgICAgICAgICAgICBjaGlsZC52YXJOYW1lLAorICAgICAgICAgICAgICAg
ICAgY2hpbGQuYW5vbnltb3VzID8gKGNoaWxkLm9wY29kZSA/IDphbm9uSW50ZXJuYWwgOiA6YW5v
bk9wZXJhbmQpIDogKGNoaWxkLm9wY29kZSA/IDppbnRlcm5hbCA6IDpvcGVyYW5kKSwKKyAgICAg
ICAgICAgICAgICAgIGluZGV4CisgICAgICAgICAgICBjaGlsZC5lYWNoVmFyaWFibGUoJnByb2Mp
CisgICAgICAgIH0KKyAgICBlbmQKK2VuZAorCitjbGFzcyBNYXRjaGVyCisgICAgYXR0cl9yZWFk
ZXIgOm5hbWUsIDpwcm9kdWN0aW9ucworCisgICAgZGVmIGluaXRpYWxpemUobmFtZSwgcHJvZHVj
dGlvbnMpCisgICAgICAgIEBuYW1lID0gbmFtZQorICAgICAgICBAcHJvZHVjdGlvbnMgPSBwcm9k
dWN0aW9ucworICAgIGVuZAorZW5kCisKK2NsYXNzIE9yaWdpbgorICAgIGF0dHJfcmVhZGVyIDpm
aWxlTmFtZSwgOmxpbmVOdW1iZXIKKyAgICAKKyAgICBkZWYgaW5pdGlhbGl6ZShmaWxlTmFtZSwg
bGluZU51bWJlcikKKyAgICAgICAgQGZpbGVOYW1lID0gZmlsZU5hbWUKKyAgICAgICAgQGxpbmVO
dW1iZXIgPSBsaW5lTnVtYmVyCisgICAgZW5kCisgICAgCisgICAgZGVmIHRvX3MKKyAgICAgICAg
IiN7ZmlsZU5hbWV9OiN7bGluZU51bWJlcn0iCisgICAgZW5kCitlbmQKKworY2xhc3MgVG9rZW4K
KyAgICBhdHRyX3JlYWRlciA6b3JpZ2luLCA6c3RyaW5nCisgICAgCisgICAgZGVmIGluaXRpYWxp
emUob3JpZ2luLCBzdHJpbmcpCisgICAgICAgIEBvcmlnaW4gPSBvcmlnaW4KKyAgICAgICAgQHN0
cmluZyA9IHN0cmluZworICAgIGVuZAorICAgIAorICAgIGRlZiA9PShvdGhlcikKKyAgICAgICAg
aWYgb3RoZXIuaXNfYT8gVG9rZW4KKyAgICAgICAgICAgIEBzdHJpbmcgPT0gb3RoZXIuc3RyaW5n
CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIEBzdHJpbmcgPT0gb3RoZXIKKyAgICAgICAgZW5k
CisgICAgZW5kCisgICAgCisgICAgZGVmID1+KG90aGVyKQorICAgICAgICBAc3RyaW5nID1+IG90
aGVyCisgICAgZW5kCisgICAgCisgICAgZGVmIHRvX3MKKyAgICAgICAgIiN7QHN0cmluZy5pbnNw
ZWN0fSBhdCAje29yaWdpbn0iCisgICAgZW5kCisgICAgCisgICAgZGVmIHBhcnNlRXJyb3IoKmNv
bW1lbnQpCisgICAgICAgIGlmIGNvbW1lbnQuZW1wdHk/CisgICAgICAgICAgICByYWlzZSAiUGFy
c2UgZXJyb3I6ICN7dG9fc30iCisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHJhaXNlICJQYXJz
ZSBlcnJvcjogI3t0b19zfTogI3tjb21tZW50WzBdfSIKKyAgICAgICAgZW5kCisgICAgZW5kCitl
bmQKKworZGVmIGxleChzdHIsIGZpbGVOYW1lKQorICAgIGZpbGVOYW1lID0gUGF0aG5hbWUubmV3
KGZpbGVOYW1lKQorICAgIHJlc3VsdCA9IFtdCisgICAgbGluZU51bWJlciA9IDEKKyAgICB3aGls
ZSBub3Qgc3RyLmVtcHR5PworICAgICAgICBjYXNlIHN0cgorICAgICAgICB3aGVuIC9cQVwjKFte
XG5dKikvCisgICAgICAgICAgICAjIGNvbW1lbnQsIGlnbm9yZQorICAgICAgICB3aGVuIC9cQVxu
LworICAgICAgICAgICAgIyBuZXdsaW5lLCBpZ25vcmUKKyAgICAgICAgICAgIGxpbmVOdW1iZXIg
Kz0gMQorICAgICAgICB3aGVuIC9cQVthLXpBLVowLTkkXShbYS16QS1aMC05X10qKS8KKyAgICAg
ICAgICAgIHJlc3VsdCA8PCBUb2tlbi5uZXcoT3JpZ2luLm5ldyhmaWxlTmFtZSwgbGluZU51bWJl
ciksICQmKQorICAgICAgICB3aGVuIC9cQShbIFx0XHJdKykvCisgICAgICAgICAgICAjIHdoaXRl
c3BhY2UsIGlnbm9yZQorICAgICAgICB3aGVuIC9cQVs9KCksXS8KKyAgICAgICAgICAgIHJlc3Vs
dCA8PCBUb2tlbi5uZXcoT3JpZ2luLm5ldyhmaWxlTmFtZSwgbGluZU51bWJlciksICQmKQorICAg
ICAgICBlbHNlCisgICAgICAgICAgICByYWlzZSAiTGV4ZXIgZXJyb3IgYXQgI3tPcmlnaW4ubmV3
KGZpbGVOYW1lLCBsaW5lTnVtYmVyKS50b19zfSwgdW5leHBlY3RlZCBzZXF1ZW5jZSAje3N0clsw
Li4yMF0uaW5zcGVjdH0iCisgICAgICAgIGVuZAorICAgICAgICBzdHIgPSAkfi5wb3N0X21hdGNo
CisgICAgZW5kCisgICAgcmVzdWx0CitlbmQKKworZGVmIGlzS2V5d29yZCh0b2tlbikKKyAgICAj
IFdlIGNhbiBleHRlbmQgdGhpcyBhcyB3ZSBhZGQgbW9yZSBrZXl3b3Jkcy4gTGlrZSwgd2UgbWln
aHQgd2FudCAiaW5jbHVkZSIgZXZlbnR1YWxseS4KKyAgICB0b2tlbiA9fiAvXEEoKG1hdGNoZXIp
KVxaLworZW5kCisKK2RlZiBpc0lkZW50aWZpZXIodG9rZW4pCisgICAgdG9rZW4gPX4gL1xBW2Et
ekEtWjAtOSRdKFthLXpBLVowLTlfXSopXFovIGFuZCBub3QgaXNLZXl3b3JkKHRva2VuKQorZW5k
CisKK2NsYXNzIFBhcnNlcgorICAgIGRlZiBpbml0aWFsaXplKGRhdGEsIGZpbGVOYW1lKQorICAg
ICAgICBAdG9rZW5zID0gbGV4KGRhdGEsIGZpbGVOYW1lKQorICAgICAgICBAaWR4ID0gMAorICAg
IGVuZAorCisgICAgZGVmIHRva2VuCisgICAgICAgIEB0b2tlbnNbQGlkeF0KKyAgICBlbmQKKwor
ICAgIGRlZiBhZHZhbmNlCisgICAgICAgIEBpZHggKz0gMQorICAgIGVuZAorCisgICAgZGVmIHBh
cnNlRXJyb3IoKmNvbW1lbnQpCisgICAgICAgIGlmIHRva2VuCisgICAgICAgICAgICB0b2tlbi5w
YXJzZUVycm9yKCpjb21tZW50KQorICAgICAgICBlbHNlCisgICAgICAgICAgICBpZiBjb21tZW50
LmVtcHR5PworICAgICAgICAgICAgICAgIHJhaXNlICJQYXJzZSBlcnJvciBhdCBlbmQgb2YgZmls
ZSIKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICByYWlzZSAiUGFyc2UgZXJyb3Ig
YXQgZW5kIG9mIGZpbGU6ICN7Y29tbWVudFswXX0iCisgICAgICAgICAgICBlbmQKKyAgICAgICAg
ZW5kCisgICAgZW5kCisKKyAgICBkZWYgY29uc3VtZShzdHJpbmcpCisgICAgICAgIHBhcnNlRXJy
b3IoIkV4cGVjdGVkICN7c3RyaW5nfSIpIHVubGVzcyB0b2tlbiA9PSBzdHJpbmcKKyAgICAgICAg
YWR2YW5jZQorICAgIGVuZAorCisgICAgZGVmIGNvbnN1bWVJZGVudGlmaWVyCisgICAgICAgIHJl
c3VsdCA9IHRva2VuLnN0cmluZworICAgICAgICBwYXJzZUVycm9yKCJFeHBlY3RlZCBpZGVudGlm
aWVyIikgdW5sZXNzIGlzSWRlbnRpZmllcihyZXN1bHQpCisgICAgICAgIGFkdmFuY2UKKyAgICAg
ICAgcmVzdWx0CisgICAgZW5kCisKKyAgICBkZWYgYWRkVW5pcXVlKG5hbWUsIHByb2R1Y3Rpb25z
LCBwcm9kdWN0aW9uKQorICAgICAgICBpZiBuYW1lID09IHByb2R1Y3Rpb24udmFyTmFtZQorICAg
ICAgICAgICAgcGFyc2VFcnJvcigiQ2hpbGQgcHJvZHVjdGlvbiBoYXMgc2FtZSBuYW1lIGFzIHBh
cmVudCBwcm9kdWN0aW9uIikKKyAgICAgICAgZW5kCisgICAgICAgIGlmIHByb2R1Y3Rpb25zLmRl
dGVjdCB7IHwgZW50cnkgfCBlbnRyeS5uYW1lID09IHByb2R1Y3Rpb24ubmFtZSB9CisgICAgICAg
ICAgICBwYXJzZUVycm9yKCJEdXBsaWNhdGUgcHJvZHVjdGlvbiIpCisgICAgICAgIGVuZAorICAg
ICAgICBwcm9kdWN0aW9ucyA8PCBwcm9kdWN0aW9uCisgICAgZW5kCisKKyAgICBkZWYgcGFyc2UK
KyAgICAgICAgY29uc3VtZSgibWF0Y2hlciIpCisKKyAgICAgICAgbWF0Y2hlck5hbWUgPSBjb25z
dW1lSWRlbnRpZmllcgorCisgICAgICAgIHByb2R1Y3Rpb25zID0gW10KKworICAgICAgICBsb29w
IHsKKyAgICAgICAgICAgIGJyZWFrIGlmIEBpZHggPj0gQHRva2Vucy5sZW5ndGgKKworICAgICAg
ICAgICAgIyBXZSBtaWdodCB3YW50IHRvIHN1cHBvcnQgImluY2x1ZGUiLiBJZiB3ZSBkaWQgdGhh
dCwgaXQgd291bGQgZ28gaGVyZS4KKyAgICAgICAgICAgIHByb2R1Y3Rpb24gPSBwYXJzZVByb2R1
Y3Rpb24KKyAgICAgICAgICAgIAorICAgICAgICAgICAgaWYgcHJvZHVjdGlvbnMuZGV0ZWN0IHsg
fCBlbnRyeSB8IGVudHJ5Lm5hbWUgPT0gcHJvZHVjdGlvbi5uYW1lIH0KKyAgICAgICAgICAgICAg
ICBwYXJzZUVycm9yKCJEdXBsaWNhdGUgcHJvZHVjdGlvbiIpCisgICAgICAgICAgICBlbmQKKwor
ICAgICAgICAgICAgcHJvZHVjdGlvbnMgPDwgcHJvZHVjdGlvbgorICAgICAgICB9CisKKyAgICAg
ICAgTWF0Y2hlci5uZXcobWF0Y2hlck5hbWUsIHByb2R1Y3Rpb25zKQorICAgIGVuZAorCisgICAg
ZGVmIHBhcnNlUHJvZHVjdGlvbgorICAgICAgICBvcmlnaW4gPSB0b2tlbi5vcmlnaW4KKyAgICAg
ICAgbmFtZSA9IGNvbnN1bWVJZGVudGlmaWVyCisKKyAgICAgICAgaWYgdG9rZW4gPT0gIj0iCisg
ICAgICAgICAgICBjb25zdW1lKCI9IikKKyAgICAgICAgICAgIG9wY29kZSA9IGNvbnN1bWVJZGVu
dGlmaWVyCisgICAgICAgICAgICBjb25zdW1lKCIoIikKKyAgICAgICAgZWxzaWYgdG9rZW4gPT0g
IigiCisgICAgICAgICAgICBjb25zdW1lKCIoIikKKyAgICAgICAgICAgIG9wY29kZSA9IG5hbWUK
KyAgICAgICAgICAgIG5hbWUgPSBuaWwKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcmV0dXJu
IFByb2R1Y3Rpb24ubmV3KG9yaWdpbiwgbmFtZSwgbmlsLCBuaWwpCisgICAgICAgIGVuZAorICAg
ICAgICAKKyAgICAgICAgcHJvZHVjdGlvbnMgPSBbXQorICAgICAgICBsb29wIHsKKyAgICAgICAg
ICAgIGJyZWFrIGlmIHRva2VuID09ICIpIgorCisgICAgICAgICAgICBhZGRVbmlxdWUobmFtZSwg
cHJvZHVjdGlvbnMsIHBhcnNlUHJvZHVjdGlvbikKKworICAgICAgICAgICAgYnJlYWsgaWYgdG9r
ZW4gPT0gIikiCisgICAgICAgICAgICBjb25zdW1lKCIsIikKKyAgICAgICAgfQorCisgICAgICAg
ICMgQWR2YW5jZSBhZnRlciB0aGUgIikiCisgICAgICAgIGFkdmFuY2UKKworICAgICAgICBQcm9k
dWN0aW9uLm5ldyhvcmlnaW4sIG5hbWUsIG9wY29kZSwgcHJvZHVjdGlvbnMpCisgICAgZW5kCitl
bmQKKworZmlsZU5hbWUgPSBBUkdWWzBdCisKK3BhcnNlciA9IFBhcnNlci5uZXcoSU86OnJlYWQo
ZmlsZU5hbWUpLCBmaWxlTmFtZSkKK21hdGNoZXIgPSBwYXJzZXIucGFyc2UKKworY2xhc3MgU3Vi
TWF0Y2gKKyAgICBhdHRyX3JlYWRlciA6aW5kZXhNYXAsIDpwcm9kdWN0aW9ucworICAgIAorICAg
IGRlZiBpbml0aWFsaXplKGluZGV4TGlzdCwgcHJvZHVjdGlvbnMpCisgICAgICAgIEBpbmRleE1h
cCA9IFtdCisgICAgICAgIEBwcm9kdWN0aW9ucyA9IFtdCisgICAgICAgIGluZGV4TGlzdC5lYWNo
IHsKKyAgICAgICAgICAgIHwgaW5kZXggfAorICAgICAgICAgICAgQGluZGV4TWFwIDw8IGluZGV4
CisgICAgICAgICAgICBAcHJvZHVjdGlvbnMgPDwgcHJvZHVjdGlvbnNbaW5kZXhdCisgICAgICAg
IH0KKyAgICBlbmQKKworICAgIGRlZiBtYXBJbmRleExpc3QoaW5kZXhMaXN0KQorICAgICAgICBp
bmRleExpc3QubWFwIHsKKyAgICAgICAgICAgIHwgaW5kZXggfAorICAgICAgICAgICAgQGluZGV4
TWFwW2luZGV4XQorICAgICAgICB9CisgICAgZW5kCitlbmQKKworRmlsZS5vcGVuKCJCMyIgKyBt
YXRjaGVyLm5hbWUgKyAiLmgiLCAidyIpIHsKKyAgICB8IG91dHAgfAorCisgICAgb3V0cC5wdXRz
ICIvLyBHZW5lcmF0ZWQgYnkgZ2VuZXJhdGVfcGF0dGVybl9tYXRjaGVyLnJiIGZyb20gI3tmaWxl
TmFtZX0gLS0gZG8gbm90IGVkaXQhIgorCisgICAgb3V0cC5wdXRzICIjaWZuZGVmIEIzI3ttYXRj
aGVyLm5hbWV9X2giCisgICAgb3V0cC5wdXRzICIjZGVmaW5lIEIzI3ttYXRjaGVyLm5hbWV9X2gi
CisgICAgCisgICAgb3V0cC5wdXRzICIjaW5jbHVkZSBcIkIzVmFsdWUuaFwiIgorICAgIAorICAg
IG91dHAucHV0cyAibmFtZXNwYWNlIEpTQyB7IG5hbWVzcGFjZSBCMyB7IgorCisgICAgb3V0cC5w
dXRzICJ0ZW1wbGF0ZTx0eXBlbmFtZSBBZGFwdG9yPiIKKyAgICBvdXRwLnB1dHMgInZvaWQgcnVu
I3ttYXRjaGVyLm5hbWV9KFZhbHVlKiBfdmFsdWUsIEFkYXB0b3ImIGFkYXB0b3IpIgorICAgIG91
dHAucHV0cyAieyIKKworICAgICMgTm90ZSB0aGF0IHRoaXMgZG9lcyBub3QgZW1pdCBwcm9wZXJs
eSBpbmRlbnRlZCBjb2RlLCBiZWNhdXNlIGl0J3MgYSByZWN1cnNpdmUgZW1pdHRlci4gSWYgeW91
CisgICAgIyB3YW50IHRvIHNlZSB0aGUgY29kZSBuaWNlbHkgZm9ybWF0dGVkLCBvcGVuIGl0IGlu
IGEgZ29vZCB0ZXh0IGVkaXRvciBhbmQgYXNrIGl0IHRvIGZvcm1hdCBpdAorICAgICMgZm9yIHlv
dS4KKworICAgICMgSW4gb2RkIHNpdHVhdGlvbnMsIHdlIG1heSBub3QgdXNlIHRoZSBpbnB1dCB2
YWx1ZS4gVGVsbCB0aGUgY29tcGlsZXIgdG8gY2hpbGwgb3V0IGFib3V0IGl0LgorICAgIG91dHAu
cHV0cyAiVU5VU0VEX1BBUkFNKF92YWx1ZSk7IgorICAgICAgICAKKyAgICAjIFRoaXMganVzdCBw
cm90ZWN0cyB0aGUgY2FsbGVyIGZyb20gaGF2aW5nIHRvIHdvcnJ5IGFib3V0IHByb2R1Y3Rpb25z
IGhhdmluZyBkaWZmZXJlbnQgbGVuZ3Rocy4KKyAgICBkZWYgbWF0Y2hMZW5ndGgob3V0cCwgdmFs
dWVOYW1lLCBwcm9kdWN0aW9ucykKKyAgICAgICAgaW5kZXhMaXN0cyA9IFtdCisgICAgICAgIHBy
b2R1Y3Rpb25zLmVhY2hfd2l0aF9pbmRleCB7CisgICAgICAgICAgICB8IHByb2R1Y3Rpb24sIGlu
ZGV4IHwKKyAgICAgICAgICAgIGlmIGluZGV4TGlzdHNbLTFdIGFuZCBwcm9kdWN0aW9uc1tpbmRl
eExpc3RzWy0xXVswXV0uY2hpbGRyZW4ubGVuZ3RoID09IHByb2R1Y3Rpb24uY2hpbGRyZW4ubGVu
Z3RoCisgICAgICAgICAgICAgICAgaW5kZXhMaXN0c1stMV0gPDwgaW5kZXgKKyAgICAgICAgICAg
IGVsc2UKKyAgICAgICAgICAgICAgICBpbmRleExpc3RzIDw8IFtpbmRleF0KKyAgICAgICAgICAg
IGVuZAorICAgICAgICB9CisKKyAgICAgICAgaW5kZXhMaXN0cy5lYWNoIHsKKyAgICAgICAgICAg
IHwgaW5kZXhMaXN0IHwKKyAgICAgICAgICAgIGxlbmd0aCA9IHByb2R1Y3Rpb25zW2luZGV4TGlz
dFswXV0uY2hpbGRyZW4ubGVuZ3RoCisgICAgICAgICAgICBpZiBsZW5ndGggPiAwCisgICAgICAg
ICAgICAgICAgb3V0cC5wdXRzICJpZiAoI3t2YWx1ZU5hbWV9LT5jaGlsZHJlbi5zaXplKCkgPj0g
I3tsZW5ndGh9KSB7IgorICAgICAgICAgICAgICAgIHlpZWxkIGluZGV4TGlzdAorICAgICAgICAg
ICAgICAgIG91dHAucHV0cyAifSIKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB5
aWVsZCBpbmRleExpc3QKKyAgICAgICAgICAgIGVuZAorICAgICAgICB9CisgICAgZW5kCisKKyAg
ICAjIFRoaXMgZWZmaWNpZW50bHkgc2VsZWN0cyBmcm9tIHRoZSBnaXZlbiBzZXQgb2YgcHJvZHVj
dGlvbnMuIEl0IGFzc3VtZXMgdGhhdCBwcm9kdWN0aW9ucworICAgICMgYXJlIG5vdCBkdXBsaWNh
dGVkLiBJdCB5aWVsZHMgdGhlIGluZGV4IG9mIHRoZSBmb3VuZCBwcm9kdWN0aW9uLCBhbmQgdGhl
IGNvcm91dGluZSBpcworICAgICMgcmVzcG9uc2libGUgZm9yIGVtaXR0aW5nIHNwZWNpZmljIGNv
ZGUgZm9yIHRoYXQgcHJvZHVjdGlvbi4gVGhlIGNvcm91dGluZSBpcyBnaXZlbiBsaXN0cyBvZgor
ICAgICMgaW5kaWNlcyBvZiBwb3NzaWJseS1tYXRjaGluZyBwcm9kdWN0aW9ucy4KKyAgICBkZWYg
bWF0Y2hQcm9kdWN0aW9ucyhvdXRwLCB2YWx1ZU5hbWUsIHByb2R1Y3Rpb25zKQorICAgICAgICAj
IEZpcnN0LCBzcGxpdCB0aGUgcHJvZHVjdGlvbnMgbGlzdCBpbnRvIHJ1bnMgb2YgcHJvZHVjdGlv
bnMgd2l0aCBhbiBvcGNvZGUgYW5kIHByb2R1Y3Rpb25zCisgICAgICAgICMgd2l0aG91dCBvbmUu
CisgICAgICAgIGluZGV4TGlzdHMgPSBbXQorICAgICAgICBwcm9kdWN0aW9ucy5lYWNoX3dpdGhf
aW5kZXggeworICAgICAgICAgICAgfCBwcm9kdWN0aW9uLCBpbmRleCB8CisgICAgICAgICAgICBp
ZiBpbmRleExpc3RzWy0xXSBhbmQgcHJvZHVjdGlvbnNbaW5kZXhMaXN0c1stMV1bMF1dLmhhc09w
Y29kZSA9PSBwcm9kdWN0aW9uLmhhc09wY29kZQorICAgICAgICAgICAgICAgIGluZGV4TGlzdHNb
LTFdIDw8IGluZGV4CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgaW5kZXhMaXN0
cyA8PCBbaW5kZXhdCisgICAgICAgICAgICBlbmQKKyAgICAgICAgfQorICAgICAgICAKKyAgICAg
ICAgIyBOb3csIGVtaXQgcGF0dGVybiBtYXRjaGluZyBjb2RlLiBXZSBkbyBpdCBkaWZmZXJlbnRs
eSBmb3IgbGlzdHMgd2l0aCBhbiBvcGNvZGUgdGhhbiBmb3IKKyAgICAgICAgIyBsaXN0cyB3aXRo
b3V0IG9uZS4KKyAgICAgICAgaW5kZXhMaXN0cy5lYWNoIHsKKyAgICAgICAgICAgIHwgaW5kZXhM
aXN0IHwKKyAgICAgICAgICAgIGlmIHByb2R1Y3Rpb25zW2luZGV4TGlzdFswXV0uaGFzT3Bjb2Rl
CisgICAgICAgICAgICAgICAgIyBOb3csIHdlIHNwbGl0IHRoaXMgaW5kZXggbGlzdCBpbnRvIGdy
b3VwcyBmb3IgZWFjaCBvcGNvZGUuCisgICAgICAgICAgICAgICAgZ3JvdXBzID0ge30KKyAgICAg
ICAgICAgICAgICBpbmRleExpc3QuZWFjaCB7CisgICAgICAgICAgICAgICAgICAgIHwgaW5kZXgg
fAorICAgICAgICAgICAgICAgICAgICBwcm9kdWN0aW9uID0gcHJvZHVjdGlvbnNbaW5kZXhdCisg
ICAgICAgICAgICAgICAgICAgIGlmIGdyb3Vwc1twcm9kdWN0aW9uLm9wY29kZV0KKyAgICAgICAg
ICAgICAgICAgICAgICAgIGdyb3Vwc1twcm9kdWN0aW9uLm9wY29kZV0gPDwgaW5kZXgKKyAgICAg
ICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgZ3JvdXBzW3Byb2R1
Y3Rpb24ub3Bjb2RlXSA9IFtpbmRleF0KKyAgICAgICAgICAgICAgICAgICAgZW5kCisgICAgICAg
ICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgIyBFbWl0IGEgc3dpdGNoIHN0YXRlbWVudC4K
KyAgICAgICAgICAgICAgICBvdXRwLnB1dHMgInN3aXRjaCAoI3t2YWx1ZU5hbWV9LT5vcGNvZGUo
KSkgeyIKKyAgICAgICAgICAgICAgICBncm91cHMuZWFjaF9wYWlyIHsKKyAgICAgICAgICAgICAg
ICAgICAgfCBvcGNvZGUsIHN1YkluZGV4TGlzdCB8CisgICAgICAgICAgICAgICAgICAgIG91dHAu
cHV0cyAiY2FzZSAje29wY29kZX06IgorICAgICAgICAgICAgICAgICAgICBzdWJNYXRjaCA9IFN1
Yk1hdGNoLm5ldyhzdWJJbmRleExpc3QsIHByb2R1Y3Rpb25zKQorICAgICAgICAgICAgICAgICAg
ICBtYXRjaExlbmd0aChvdXRwLCB2YWx1ZU5hbWUsIHN1Yk1hdGNoLnByb2R1Y3Rpb25zKSB7Cisg
ICAgICAgICAgICAgICAgICAgICAgICB8IGluZGV4TGlzdCB8CisgICAgICAgICAgICAgICAgICAg
ICAgICB5aWVsZCBzdWJNYXRjaC5tYXBJbmRleExpc3QoaW5kZXhMaXN0KQorICAgICAgICAgICAg
ICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIG91dHAucHV0cyAiYnJlYWs7IgorICAgICAg
ICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBvdXRwLnB1dHMgImRlZmF1bHQ6IgorICAgICAg
ICAgICAgICAgIG91dHAucHV0cyAiYnJlYWs7IgorICAgICAgICAgICAgICAgIG91dHAucHV0cyAi
fSIKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBzdWJNYXRjaCA9IFN1Yk1hdGNo
Lm5ldyhpbmRleExpc3QsIHByb2R1Y3Rpb25zKQorICAgICAgICAgICAgICAgIG1hdGNoTGVuZ3Ro
KG91dHAsIHZhbHVlTmFtZSwgc3ViTWF0Y2gucHJvZHVjdGlvbnMpIHsKKyAgICAgICAgICAgICAg
ICAgICAgfCBpbmRleExpc3QgfAorICAgICAgICAgICAgICAgICAgICB5aWVsZCBzdWJNYXRjaC5t
YXBJbmRleExpc3QoaW5kZXhMaXN0KQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVu
ZAorICAgICAgICB9CisgICAgZW5kCisKKyAgICAjIFRha2VzIHByb2R1Y3Rpb25zIHRoYXQgaGF2
ZSB0aGUgc2FtZSBvcGNvZGUgYW5kIHRoZSBzYW1lIGxlbmd0aCBhbmQgc2VsZWN0cyBmcm9tIHRo
ZW0gYmFzZWQgb24KKyAgICAjIHRoZSBwcm9kdWN0aW9ucyBhdCB0aGUgZ2l2ZW4gY29sdW1uLgor
ICAgIGRlZiBtYXRjaENvbHVtbihvdXRwLCB2YWx1ZU5hbWUsIHByb2R1Y3Rpb25zLCBjb2x1bW5J
bmRleCkKKyAgICAgICAgaWYgY29sdW1uSW5kZXggPj0gcHJvZHVjdGlvbnNbMF0uY2hpbGRyZW4u
bGVuZ3RoCisgICAgICAgICAgICB5aWVsZCAoMC4uLihwcm9kdWN0aW9ucy5zaXplKSkudG9fYQor
ICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIGVuZAorCisgICAgICAgIHN1YlZhbHVlID0gbmV3
VmFyCisgICAgICAgIAorICAgICAgICBvdXRwLnB1dHMgInsiCisgICAgICAgIG91dHAucHV0cyAi
VmFsdWUqICN7c3ViVmFsdWV9ID0gI3t2YWx1ZU5hbWV9LT5jaGlsZCgje2NvbHVtbkluZGV4fSk7
IgorCisgICAgICAgICMgV2UgbWF5IG5vdCB1c2UgdGhpcyB2YWx1ZS4gVGVsbCB0aGUgY29tcGls
ZXIgdG8gY2hpbGwgb3V0IGFib3V0IGl0LgorICAgICAgICBvdXRwLnB1dHMgIlVOVVNFRF9QQVJB
TSgje3N1YlZhbHVlfSk7IgorICAgICAgICAKKyAgICAgICAgc3ViUHJvZHVjdGlvbnMgPSBwcm9k
dWN0aW9ucy5tYXAgeworICAgICAgICAgICAgfCBwcm9kdWN0aW9uIHwKKyAgICAgICAgICAgIHBy
b2R1Y3Rpb24uY2hpbGRyZW5bY29sdW1uSW5kZXhdCisgICAgICAgIH0KKworICAgICAgICBtYXRj
aFJlY3Vyc2l2ZWx5KG91dHAsIHN1YlZhbHVlLCBzdWJQcm9kdWN0aW9ucykgeworICAgICAgICAg
ICAgfCBpbmRleExpc3QgfAorICAgICAgICAgICAgc3ViTWF0Y2ggPSBTdWJNYXRjaC5uZXcoaW5k
ZXhMaXN0LCBwcm9kdWN0aW9ucykKKyAgICAgICAgICAgIG1hdGNoQ29sdW1uKG91dHAsIHZhbHVl
TmFtZSwgc3ViTWF0Y2gucHJvZHVjdGlvbnMsIGNvbHVtbkluZGV4ICsgMSkgeworICAgICAgICAg
ICAgICAgIHwgaW5kZXhMaXN0IHwKKyAgICAgICAgICAgICAgICB5aWVsZCBzdWJNYXRjaC5tYXBJ
bmRleExpc3QoaW5kZXhMaXN0KQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAg
b3V0cC5wdXRzICJ9IgorICAgIGVuZAorCisgICAgZGVmIG1hdGNoUmVjdXJzaXZlbHkob3V0cCwg
dmFsdWVOYW1lLCBwcm9kdWN0aW9ucykKKyAgICAgICAgbWF0Y2hQcm9kdWN0aW9ucyhvdXRwLCB2
YWx1ZU5hbWUsIHByb2R1Y3Rpb25zKSB7CisgICAgICAgICAgICB8IGluZGV4TGlzdCB8CisgICAg
ICAgICAgICAjIFdlIGFyZSBndWFyYW50ZWVkIHRoYXQgdGhpcyBpbmRleCBsaXN0IGNvbnRhaW5z
IHByb2R1Y3Rpb25zIHdpdGggdGhlIHNhbWUgb3Bjb2RlIGFuZAorICAgICAgICAgICAgIyB0aGUg
c2FtZSBsZW5ndGguCisgICAgICAgICAgICBzdWJNYXRjaCA9IFN1Yk1hdGNoLm5ldyhpbmRleExp
c3QsIHByb2R1Y3Rpb25zKQorICAgICAgICAgICAgbWF0Y2hDb2x1bW4ob3V0cCwgdmFsdWVOYW1l
LCBzdWJNYXRjaC5wcm9kdWN0aW9ucywgMCkgeworICAgICAgICAgICAgICAgIHwgaW5kZXhMaXN0
IHwKKyAgICAgICAgICAgICAgICB5aWVsZCBzdWJNYXRjaC5tYXBJbmRleExpc3QoaW5kZXhMaXN0
KQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgZW5kCisKKyAgICBtYXRjaFJlY3Vyc2l2
ZWx5KG91dHAsICJfdmFsdWUiLCBtYXRjaGVyLnByb2R1Y3Rpb25zKSB7CisgICAgICAgIHwgaW5k
ZXhMaXN0IHwKKyAgICAgICAgaW5kZXhMaXN0LmVhY2ggeworICAgICAgICAgICAgfCBpbmRleCB8
CisgICAgICAgICAgICBwcm9kdWN0aW9uID0gbWF0Y2hlci5wcm9kdWN0aW9uc1tpbmRleF0KKyAg
ICAgICAgICAgIG91dHAucHV0cyAieyIKKyAgICAgICAgICAgIG91dHAucHV0cyAiVmFsdWUqICN7
cHJvZHVjdGlvbi52YXJOYW1lfSA9IF92YWx1ZTsiCisgICAgICAgICAgICBpbnRlcm5hbEFyZ3Vt
ZW50cyA9IFtdCisgICAgICAgICAgICBvcGVyYW5kQXJndW1lbnRzID0gW10KKyAgICAgICAgICAg
IHRyeUFyZ3VtZW50cyA9IFtdCisgICAgICAgICAgICBudW1TY29wZXMgPSAwCisgICAgICAgICAg
ICBzZWVuID0ge30KKyAgICAgICAgICAgIHByb2R1Y3Rpb24uZWFjaFZhcmlhYmxlIHsKKyAgICAg
ICAgICAgICAgICB8IHBhcmVudFZhck5hbWUsIGNoaWxkTmFtZSwgY2hpbGRWYXJOYW1lLCBraW5k
LCBpbmRleCB8CisgICAgICAgICAgICAgICAgbG9hZEV4cHIgPSAiI3twYXJlbnRWYXJOYW1lfS0+
Y2hpbGQoI3tpbmRleH0pIgorICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIGlmIHNl
ZW5bY2hpbGRWYXJOYW1lXQorICAgICAgICAgICAgICAgICAgICB0bXAgPSBuZXdWYXIKKyAgICAg
ICAgICAgICAgICAgICAgb3V0cC5wdXRzICJWYWx1ZSogI3t0bXB9ID0gI3tsb2FkRXhwcn07Igor
ICAgICAgICAgICAgICAgICAgICBvdXRwLnB1dHMgImlmICgje3RtcH0gPT0gI3tjaGlsZFZhck5h
bWV9KSB7IgorICAgICAgICAgICAgICAgICAgICBudW1TY29wZXMgKz0gMQorICAgICAgICAgICAg
ICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgc2VlbltjaGlsZFZhck5hbWVdID0gdHJ1ZQor
ICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgb3V0cC5wdXRzICJWYWx1
ZSogI3tjaGlsZFZhck5hbWV9ID0gI3tsb2FkRXhwcn07IgorCisgICAgICAgICAgICAgICAgICAg
IGlmIGNoaWxkTmFtZSA9fiAvXEFcJC8KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIGNoaWxk
TmFtZSA9fiAvXEFcJChbMC05XSspXFovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0
cC5wdXRzICJpZiAoI3tjaGlsZFZhck5hbWV9LT5pc0ludCgjeyQxfSkpIHsiCisgICAgICAgICAg
ICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cC5wdXRz
ICJpZiAoI3tjaGlsZFZhck5hbWV9LT5oYXNJbnQoKSkgeyIKKyAgICAgICAgICAgICAgICAgICAg
ICAgIGVuZAorICAgICAgICAgICAgICAgICAgICAgICAgbnVtU2NvcGVzICs9IDEKKyAgICAgICAg
ICAgICAgICAgICAgZW5kCisgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAg
ICBpbnRlcm5hbEFyZ3VtZW50cyA8PCBjaGlsZFZhck5hbWUgaWYga2luZCA9PSA6aW50ZXJuYWwg
b3Iga2luZCA9PSA6YW5vbkludGVybmFsCisgICAgICAgICAgICAgICAgICAgIG9wZXJhbmRBcmd1
bWVudHMgPDwgY2hpbGRWYXJOYW1lIGlmIGtpbmQgPT0gOm9wZXJhbmQgb3Iga2luZCA9PSA6YW5v
bk9wZXJhbmQKKyAgICAgICAgICAgICAgICAgICAgdHJ5QXJndW1lbnRzIDw8IGNoaWxkVmFyTmFt
ZSBpZiBraW5kID09IDppbnRlcm5hbCBvciBraW5kID09IDpvcGVyYW5kCisgICAgICAgICAgICAg
ICAgZW5kCisgICAgICAgICAgICB9CisgICAgICAgICAgICBvdXRwLnB1dHMgImlmIChhZGFwdG9y
LmFjY2VwdFJvb3QoX3ZhbHVlKSIKKyAgICAgICAgICAgIG91dHAucHV0cygiICAgICYmIGFkYXB0
b3IuYWNjZXB0SW50ZXJuYWxzKCIgKyBpbnRlcm5hbEFyZ3VtZW50cy5qb2luKCIsICIpICsgIiki
KQorICAgICAgICAgICAgb3V0cC5wdXRzKCIgICAgJiYgYWRhcHRvci5hY2NlcHRPcGVyYW5kcygi
ICsgb3BlcmFuZEFyZ3VtZW50cy5qb2luKCIsICIpICsgIikiKQorICAgICAgICAgICAgb3V0cC5w
dXRzKCIgICAgJiYgYWRhcHRvci50cnkje3Byb2R1Y3Rpb24ubmFtZX0oIiArIHRyeUFyZ3VtZW50
cy5qb2luKCIsICIpICsgIikpIikKKyAgICAgICAgICAgIG91dHAucHV0cyAiICAgIHJldHVybjsi
CisgICAgICAgICAgICBudW1TY29wZXMudGltZXMgeworICAgICAgICAgICAgICAgIG91dHAucHV0
cyAifSIKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG91dHAucHV0cyAifSIKKyAgICAgICAg
fQorICAgIH0KKyAgICAKKyAgICBvdXRwLnB1dHMgIiAgICBSRUxFQVNFX0FTU0VSVF9OT1RfUkVB
Q0hFRCgpOyIKKyAgICBvdXRwLnB1dHMgIn0iCisgICAgCisgICAgb3V0cC5wdXRzICJ9IH0gLy8g
bmFtZXNwYWNlIEpTQzo6QjMiCisKKyAgICBvdXRwLnB1dHMgIiNlbmRpZiAvLyBCMyN7bWF0Y2hl
ci5uYW1lfV9oIgorfQpJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL2Fpci9BaXJBbGxv
Y2F0ZVN0YWNrLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvYWly
L0FpckFsbG9jYXRlU3RhY2suY3BwCShyZXZpc2lvbiAwKQorKysgU291cmNlL0phdmFTY3JpcHRD
b3JlL2IzL2Fpci9BaXJBbGxvY2F0ZVN0YWNrLmNwcAkod29ya2luZyBjb3B5KQpAQCAtMCwwICsx
LDE2MiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNSBBcHBsZSBJbmMuIEFsbCByaWdodHMg
cmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJp
bmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0
ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6Cisg
KiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3Zl
IGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhl
IGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBm
b3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhp
cyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUK
KyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRo
IHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBB
UFBMRSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFO
VElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJS
QU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisg
KiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBP
UgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElO
Q0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdF
UyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJT
VElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJ
VFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBU
SEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJ
TElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJ
U0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVO
IElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLiAKKyAqLworCisj
aW5jbHVkZSAiY29uZmlnLmgiCisjaW5jbHVkZSAiQWlyQWxsb2NhdGVTdGFjay5oIgorCisjaW5j
bHVkZSAiQWlyQ29kZS5oIgorI2luY2x1ZGUgIkFpckxpdmVuZXNzLmgiCisjaW5jbHVkZSAiQWly
UGhhc2VTY29wZS5oIgorCituYW1lc3BhY2UgSlNDIHsgbmFtZXNwYWNlIEIzIHsgbmFtZXNwYWNl
IEFpciB7CisKK3ZvaWQgYWxsb2NhdGVTdGFjayhDb2RlJiBjb2RlKQoreworICAgIFBoYXNlU2Nv
cGUgcGhhc2VTY29wZShjb2RlLCAiYWxsb2NhdGVTdGFjayIpOworCisgICAgLy8gQWxsb2NhdGUg
YWxsIG9mIHRoZSBsb2NrZWQgc2xvdHMgaW4gb3JkZXIuCisgICAgQVNTRVJUKCFjb2RlLmZyYW1l
U2l6ZSgpKTsKKyAgICB1bnNpZ25lZCBmcmFtZVNpemUgPSAwOworICAgIGZvciAoU3RhY2tTbG90
KiBzbG90IDogY29kZS5zdGFja1Nsb3RzKCkpIHsKKyAgICAgICAgaWYgKHNsb3QtPmtpbmQoKSA9
PSBTdGFja1Nsb3RLaW5kOjpMb2NrZWQpIHsKKyAgICAgICAgICAgIHNsb3QtPnNldE9mZnNldEZy
b21GUCgtZnJhbWVTaXplIC0gc2xvdC0+Ynl0ZVNpemUoKSk7CisgICAgICAgICAgICBmcmFtZVNp
emUgKz0gc2xvdC0+Ynl0ZVNpemUoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIE5vdyB3
ZSBoYW5kbGUgdGhlIGFub255bW91cyBzbG90cy4gTm90ZSB0aGF0IHRoZW9yZXRpY2FsbHkgd2Ug
c2hvdWxkIGRvIGFuIGVzY2FwZSBhbmFseXNpcworICAgIC8vIGhlcmUuIEJ1dCwgY3VycmVudGx5
IEFpciBkb2Vzbid0IHN1cHBvcnQgZXNjYXBpbmcgYSBTdGFja1Nsb3QhCisgICAgLy8gRklYTUU6
IEFkZCBzdXBwb3J0IGZvciBlc2NhcGluZyBhIFN0YWNrU2xvdCBhbmQgYWRkIGVzY2FwZSBhbmFs
eXNpcyB0byBhbGxvY2F0ZVN0YWNrKCkuCisgICAgLy8gaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcv
c2hvd19idWcuY2dpP2lkPTE1MDQzMAorCisgICAgYXV0byBpc1JlbGV2YW50ID0gW10gKGNvbnN0
IEFyZyYgYXJnKSAtPiBib29sIHsKKyAgICAgICAgcmV0dW5yIGFyZy5pc1N0YWNrKCkgJiYgYXJn
LnN0YWNrU2xvdCgpLT5raW5kKCkgPT0gU3RhY2tTbG90S2luZDo6QW5vbnltb3VzOworICAgIH07
CisKKyAgICBMaXZlbmVzczxBcmc+IGxpdmVuZXNzKGNvZGUpOworICAgIEluZGV4TWFwPFN0YWNr
U2xvdCwgSGFzaFNldDxTdGFja1Nsb3QqPj4gaW50ZXJmZXJlbmNlKGNvZGUuc2l6ZSgpKTsKKyAg
ICBWZWN0b3I8U3RhY2tTbG90Kj4gc2xvdHM7CisKKyAgICBmb3IgKEJhc2ljQmxvY2sqIGJsb2Nr
IDogY29kZSkgeworICAgICAgICBMaXZlbmVzczxBcmc+OjpMb2NhbENhbGMgbG9jYWxDYWxjKGxp
dmVuZXNzLCBibG9jayk7CisKKyAgICAgICAgYXV0byBpbnRlcmZlcmUgPSBbJl0gKCkgeworICAg
ICAgICAgICAgLy8gRm9ybSBhIGNsaXF1ZSBvZiBzdGFjayBzbG90cyB0aGF0IGludGVyZmVyZS4g
Rmlyc3QgZmluZCB0aGUgbGlzdCBvZiBzdGFjayBzbG90cworICAgICAgICAgICAgLy8gdGhhdCBh
cmUgbGl2ZSByaWdodCBub3cuCisgICAgICAgICAgICBzbG90cy5yZXNpemUoMCk7CisgICAgICAg
ICAgICBmb3IgKEFyZyBhcmcgOiBsb2NhbENhbGMubGl2ZSgpKSB7CisgICAgICAgICAgICAgICAg
aWYgKGlzUmVtZXZhbnQoYXJnKSkKKyAgICAgICAgICAgICAgICAgICAgc2xvdHMuYXBwZW5kKGFy
Zy5zdGFja1Nsb3QoKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmb3IgKHVuc2lnbmVk
IGkgPSAwOyBpIDwgc2xvdHMuc2l6ZSgpOyArK2kpIHsKKyAgICAgICAgICAgICAgICBTdGFja1Ns
b3QqIG91dGVyID0gc2xvdHNbaV07CisgICAgICAgICAgICAgICAgZm9yICh1bnNpZ25lZCBqID0g
aSArIDE7IGogPCBzbG90cy5zaXplKCk7ICsraikgeworICAgICAgICAgICAgICAgICAgICBTdGFj
a1Nsb3QqIGlubmVyID0gc2xvdHNbaV07CisKKyAgICAgICAgICAgICAgICAgICAgU3RhY2tTbG90
KiBmaXJzdCA9IG91dGVyOworICAgICAgICAgICAgICAgICAgICBTdGFja1Nsb3QqIHNlY29uZCA9
IGlubmVyOworICAgICAgICAgICAgICAgICAgICBpZiAoZmlyc3QtPmluZGV4KCkgPiBzZWNvbmQt
PmluZGV4KCkpCisgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN3YXAoZmlyc3QsIHNlY29u
ZCk7CisKKyAgICAgICAgICAgICAgICAgICAgaW50ZXJmZXJlbmNlW2ZpcnN0XS5hZGQoc2Vjb25k
KTsKKyAgICAgICAgICAgICAgICAgICAgaW50ZXJmZXJlbmNlW3NlY29uZF0uYWRkKGZpcnN0KTsK
KyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBp
bnRlcmZlcmUobG9jYWxDYWxjLmxpdmUoKSk7CisgICAgICAgIAorICAgICAgICBmb3IgKHVuc2ln
bmVkIGluc3RJbmRleCA9IGJsb2NrLT5zaXplKCk7IGluc3RJbmRleC0tOykgeworICAgICAgICAg
ICAgbG9jYWxDYWxjLmV4ZWN1dGUoYmxvY2stPmF0KGluc3RJbmRleCkpOworICAgICAgICAgICAg
aW50ZXJmZXJlKGxvY2FsQ2FsYy5saXZlKCkpOworICAgICAgICB9CisgICAgfQorCisgICAgLy8g
Tm93IHdlIGFzc2lnbiBzdGFjayBsb2NhdGlvbnMuIEF0IGl0cyBoZWFydCB0aGlzIGFsZ29yaXRo
bSBpcyBqdXN0IGZpcnN0LWZpdC4gRm9yIGVhY2gKKyAgICAvLyBTdGFja1Nsb3Qgd2UganVzdCB3
YW50IHRvIGZpbmQgdGhlIG9mZnNldEZyb21GUCB0aGF0IGlzIGNsb3Nlc3QgdG8gemVybyB3aGls
ZSBlbnN1cmluZyBubworICAgIC8vIG92ZXJsYXAgd2l0aCBvdGhlciBTdGFja1Nsb3RzIHRoYXQg
dGhpcyBvdmVybGFwcyB3aXRoLgorICAgIGZvciAoU3RhY2tTbG90KiBzbG90IDogY29kZS5zdGFj
a1Nsb3RzKCkpIHsKKyAgICAgICAgaWYgKHNsb3QtPm9mZnNldEZyb21GUCgpKSB7CisgICAgICAg
ICAgICAvLyBBbHJlYWR5IGFzc2lnbmVkIGFuIG9mZnNldC4KKyAgICAgICAgICAgIGNvbnRpbnVl
OworICAgICAgICB9CisKKyAgICAgICAgLy8gVGhlIHBvc3NpYmxlIGZpcnN0IGZpdCBvZmZzZXRz
IGFyZToKKyAgICAgICAgLy8gLSBmcmFtZVNpemUgLSBzbG90LT5ieXRlU2l6ZSgpCisgICAgICAg
IC8vIC0gZm9yIGFsbCBzbG90MiBpbiBpbnRlcmZlcmVuY2Vbc2xvdF0sIHNsb3QyLT5vZmZzZXRG
cm9tRlAoKSAtIHNsb3QtPmJ5dGVTaXplKCkuCisgICAgICAgIC8vIFdlIG5lZWQgdG8gZmluZCBv
bmUgb2YgdGhvc2UgdGhhdCBkb2Vzbid0IGludGVyZmVyZSB3aXRoIGFueW9uZS4KKworICAgICAg
ICBIYXNoU2V0PFN0YWNrU2xvdCo+JiBvdGhlclNsb3RzID0gaW50ZXJmZXJlbmNlW3Nsb3RdOwor
CisgICAgICAgIGF1dG8gYXR0ZW1wdEFzc2lnbm1lbnQgPSBbJl0gKGludHB0cl90IG9mZnNldEZy
b21GUCkgLT4gYm9vbCB7CisgICAgICAgICAgICBmb3IgKFN0YWNrU2xvdCogb3RoZXJTbG90IDog
b3RoZXJTbG90cykgeworICAgICAgICAgICAgICAgIGlmICghb3RoZXJTbG90LT5vZmZzZXRGcm9t
RlAoKSkKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgaWYg
KG9mZnNldEZyb21GUCArIHNsb3QtPmJ5dGVTaXplKCkgPj0gb3RoZXJTbG90LT5vZmZzZXRGcm9t
RlAoKSkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAg
IGlmIChvdGhlclNsb3QtPm9mZnNldEZyb21GUCgpICsgb3RoZXJTbG90LT5ieXRlU2l6ZSgpID49
IG9mZnNldEZyb21GUCkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAg
ICAgICAgfQorCisgICAgICAgICAgICBzbG90LT5zZXRPZmZzZXRGcm9tRlAob2Zmc2V0RnJvbUZQ
KTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9OworCisgICAgICAgIGlmIChh
dHRlbXB0QXNzaWdubWVudChmcmFtZVNpemUgLSBzbG90LT5ieXRlU2l6ZSgpKSkKKyAgICAgICAg
ICAgIGNvbnRpbnVlOworICAgICAgICBib29sIGZvdW5kID0gZmFsc2U7CisgICAgICAgIGZvciAo
U3RhY2tTbG90KiBvdGhlclNsb3QgOiBvdGhlclNsb3RzKSB7CisgICAgICAgICAgICBpZiAob3Ro
ZXJTbG90LT5vZmZzZXRGcm9tRlAoKSkgeworICAgICAgICAgICAgICAgIGlmIChhdHRlbXB0QXNz
aWdubWVudChvdGhlclNsb3QtPm9mZnNldEZyb21GUCgpIC0gc2xvdC0+Ynl0ZVNpemUoKSkpIHsK
KyAgICAgICAgICAgICAgICAgICAgZm91bmQgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICBi
cmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAg
ICAgaWYgKGZvdW5kKQorICAgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgUkVMRUFTRV9B
U1NFUlRfTk9UX1JFQUNIRUQoKTsKKyAgICB9CisKKyAgICAvLyBGaW5hbGx5LCB0cmFuc2Zvcm0g
dGhlIGNvZGUgdG8gdXNlIEFkZHIncyBpbnN0ZWFkIG9mIFN0YWNrU2xvdCdzLiBUaGlzIGlzIGEg
bG9zc2xlc3MKKyAgICAvLyB0cmFuc2Zvcm1hdGlvbiBzaW5jZSB3ZSBjYW4gc2VhcmNoIHRoZSBT
dGFja1Nsb3RzIGFycmF5IHRvIGZpZ3VyZSBvdXQgd2hpY2ggU3RhY2tTbG90IGFueQorICAgIC8v
IG9mZnNldC1mcm9tLUZQIHJlZmVycyB0by4KKworICAgIGZvciAoQmFzaWNCbG9jayogYmxvY2sg
OiBjb2RlKSB7CisgICAgICAgIGZvciAoSW5zdCYgaW5zdCA6ICpibG9jaykgeworICAgICAgICAg
ICAgZm9yIChBcmcmIGFyZyA6IGluc3QuYXJncykgeworICAgICAgICAgICAgICAgIGlmIChhcmcu
aXNTdGFjaygpKSB7CisgICAgICAgICAgICAgICAgICAgIGFyZyA9IEFyZzo6YWRkcigKKyAgICAg
ICAgICAgICAgICAgICAgICAgIEdQUkluZm86OmNhbGxGcmFtZVJlZ2lzdGVyLAorICAgICAgICAg
ICAgICAgICAgICAgICAgYXJnLm9mZnNldCgpICsgYXJnLnN0YWNrU2xvdCgpLT5vZmZzZXRGcm9t
RlAoKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAg
fQorfQorCit9IH0gfSAvLyBuYW1lc3BhY2UgSlNDOjpCMzo6QWlyCisKSW5kZXg6IFNvdXJjZS9K
YXZhU2NyaXB0Q29yZS9iMy9haXIvQWlyQWxsb2NhdGVTdGFjay5oCj09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNv
dXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9haXIvQWlyQWxsb2NhdGVTdGFjay5oCShyZXZpc2lvbiAw
KQorKysgU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL2Fpci9BaXJBbGxvY2F0ZVN0YWNrLmgJKHdv
cmtpbmcgY29weSkKQEAgLTAsMCArMSw0MSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNSBB
cHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5k
IHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2Rp
ZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRp
dGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUg
bXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qg
b2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0
cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmln
aHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dp
bmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1h
dGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZU
V0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBS
RVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8s
IFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVT
UyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZF
TlQgU0hBTEwgQVBQTEUgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5Z
IERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9S
IENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisg
KiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVT
RSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZF
UiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBD
T05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdF
TkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBP
RiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNV
Q0ggREFNQUdFLiAKKyAqLworCisjaWZuZGVmIEFpckFsbG9jYXRlU3RhY2tfaAorI2RlZmluZSBB
aXJBbGxvY2F0ZVN0YWNrX2gKKworbmFtZXNwYWNlIEpTQyB7IG5hbWVzcGFjZSBCMyB7IG5hbWVz
cGFjZSBBaXIgeworCitjbGFzcyBDb2RlOworCisvLyBUaGlzIGFsbG9jYXRlcyBTdGFja1Nsb3Rz
IHRvIHBsYWNlcyBvbiB0aGUgc3RhY2suIEl0IGZpcnN0IGFsbG9jYXRlcyB0aGUgcGlubmVkIG9u
ZXMgaW4gaW5kZXgKKy8vIG9yZGVyIGFuZCB0aGVuIGl0IGFsbG9jYXRlcyB0aGUgcmVzdCB1c2lu
ZyBmaXJzdCBmaXQuCisKK3ZvaWQgYWxsb2NhdGVTdGFjayhDb2RlJik7CisKK30gfSB9IC8vIG5h
bWVzcGFjZSBKU0M6OkIzOjpBaXIKKworI2VuZGlmIC8vIEFpckFsbG9jYXRlU3RhY2tfaAorCklu
ZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvYWlyL0FpckFyZy5jcHAKPT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQot
LS0gU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL2Fpci9BaXJBcmcuY3BwCShyZXZpc2lvbiAwKQor
KysgU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL2Fpci9BaXJBcmcuY3BwCSh3b3JraW5nIGNvcHkp
CkBAIC0wLDAgKzEsODEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTUgQXBwbGUgSW5jLiBB
bGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291
cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBh
cmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBh
cmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWlu
IHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlv
bnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBp
biBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBu
b3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWlt
ZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJv
dmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJP
VklERUQgQlkgQVBQTEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBM
SUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElN
UExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFS
VElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQ
UExFIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElO
RElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5U
SUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1F
TlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9S
CisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFO
RCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNU
UklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhF
UldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZU
V0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4g
CisgKi8KKworI2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgIkFpckFyZy5oIgorCituYW1l
c3BhY2UgSlNDIHsgbmFtZXNwYWNlIEIzIHsgbmFtZXNwYWNlIEFpciB7CisKK3ZvaWQgQXJnOjpk
dW1wKFByaW50U3RyZWFtJiBvdXQpIGNvbnN0Cit7CisgICAgc3dpdGNoIChtX2tpbmQpIHsKKyAg
ICBjYXNlIFRtcDoKKyAgICAgICAgb3V0LnByaW50KHRtcCgpKTsKKyAgICAgICAgcmV0dXJuOwor
ICAgIGNhc2UgSW1tOgorICAgICAgICBvdXQucHJpbnQoIiQiLCBtX29mZnNldCk7CisgICAgICAg
IHJldHVybjsKKyAgICBjYXNlIEltbTY0OgorICAgICAgICBvdXQucHJpbnRmKCIkMHglbGx4Iiwg
bV9vZmZzZXQpOworICAgICAgICByZXR1cm47CisgICAgY2FzZSBBZGRyOgorICAgICAgICBpZiAo
b2Zmc2V0KCkpCisgICAgICAgICAgICBvdXQucHJpbnQob2Zmc2V0KCkpOworICAgICAgICBvdXQu
cHJpbnQoIigiLCBiYXNlKCksICIpIik7CisgICAgICAgIHJldHVybjsKKyAgICBjYXNlIEluZGV4
OgorICAgICAgICBpZiAob2Zmc2V0KCkpCisgICAgICAgICAgICBvdXQucHJpbnQob2Zmc2V0KCkp
OworICAgICAgICBvdXQucHJpbnQoIigiLCBiYXNlKCksICIsIiwgaW5kZXgoKSk7CisgICAgICAg
IGlmIChzY2FsZSgpICE9IDEpCisgICAgICAgICAgICBvdXQucHJpbnQoIiwiLCBzY2FsZSgpKTsK
KyAgICAgICAgb3V0LnByaW50KCIpIik7CisgICAgICAgIHJldHVybjsKKyAgICBjYXNlIFN0YWNr
OgorICAgICAgICBpZiAob2Zmc2V0KCkpCisgICAgICAgICAgICBvdXQucHJpbnQob2Zmc2V0KTsK
KyAgICAgICAgb3V0LnByaW50KCIoIiwgcG9pbnRlckR1bXAoc3RhY2tTbG90KCkpLCAiKSIpOwor
ICAgICAgICByZXR1cm47CisgICAgY2FzZSBDYWxsQXJnOgorICAgICAgICBpZiAob2Zmc2V0KCkp
CisgICAgICAgICAgICBvdXQucHJpbnQob2Zmc2V0KTsKKyAgICAgICAgb3V0LnByaW50KCIoY2Fs
bEFyZykiKTsKKyAgICAgICAgcmV0dXJuOworICAgIGNhc2UgUmVsQ29uZDoKKyAgICAgICAgb3V0
LnByaW50KGFzUmVsYXRpb25hbENvbmRpdGlvbigpKTsKKyAgICAgICAgcmV0dXJuOworICAgIGNh
c2UgUmVzQ29uZDoKKyAgICAgICAgb3V0LnByaW50KGFzUmVzdWx0Q29uZGl0aW9uKCkpOworICAg
ICAgICByZXR1cm47CisgICAgY2FzZSBTcGVjaWFsOgorICAgICAgICBvdXQucHJpbnQocG9pbnRl
ckR1bXAoc3BlY2lhbCgpKSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBSRUxFQVNF
X0FTU0VSVF9OT1RfUkVBQ0hFRCgpOworfQorCit9IH0gfSAvLyBuYW1lc3BhY2UgSlNDOjpCMzo6
QWlyCisKSW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9haXIvQWlyQXJnLmgKPT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL2Fpci9BaXJBcmcuaAkocmV2aXNpb24g
MCkKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9haXIvQWlyQXJnLmgJKHdvcmtpbmcgY29w
eSkKQEAgLTAsMCArMSw1ODIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTUgQXBwbGUgSW5j
LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4g
c291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9u
LCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisg
KiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0
YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRp
dGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9u
cyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAg
ICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2Ns
YWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMg
cHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMg
UFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJ
TVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAq
IElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEg
UEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxM
IEFQUExFIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1Qs
IElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFV
RU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VS
RU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEs
IE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VE
IEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1Qs
IFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBP
VEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBT
T0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFH
RS4gCisgKi8KKworI2lmbmRlZiBBaXJBcmdfaAorI2RlZmluZSBBaXJBcmdfaAorCisjaW5jbHVk
ZSAiQWlyVG1wLmgiCisjaW5jbHVkZSAiQjNUeXBlLmgiCisKK25hbWVzcGFjZSBKU0MgeyBuYW1l
c3BhY2UgQjMgeyBuYW1lc3BhY2UgQWlyIHsKKworY2xhc3MgU3BlY2lhbDsKK2NsYXNzIFN0YWNr
U2xvdDsKKworLy8gVGhpcyBjbGFzcyBuYW1lIGlzIGFsc28gaW50ZW50aW9uYWxseSB0ZXJzZSBi
ZWNhdXNlIHdlIHdpbGwgc2F5IGl0IGEgbG90LiBZb3UnbGwgc2VlIGNvZGUgbGlrZQorLy8gSW5z
dCguLi4sIEFyZzo6aW1tKDUpLCBBcmc6OmFkZHIodGhpbmcsIGJsYWgpLCAuLi4pCitjbGFzcyBB
cmcgeworcHVibGljOgorICAgIC8vIFRoZXNlIGVudW0gbWVtYmVycyBhcmUgaW50ZW50aW9uYWxs
eSB0ZXJzZSBiZWNhdXNlIHdlIGhhdmUgdG8gbWVudGlvbiB0aGVtIGEgbG90LgorICAgIGVudW0g
S2luZCA6IGludDhfdCB7CisgICAgICAgIFRtcCwKKyAgICAgICAgSW1tLAorICAgICAgICBJbW02
NCwKKyAgICAgICAgQWRkciwKKyAgICAgICAgU3RhY2ssCisgICAgICAgIENhbGxBcmcsCisgICAg
ICAgIEluZGV4LAorICAgICAgICBSZWxDb25kLAorICAgICAgICBSZXNDb25kLAorICAgICAgICBT
cGVjaWFsCisgICAgfTsKKworICAgIGVudW0gUm9sZSA6IGludDhfdCB7CisgICAgICAgIFVzZSwK
KyAgICAgICAgRGVmLAorICAgICAgICBVc2VEZWYKKyAgICB9OworCisgICAgZW51bSBUeXBlIDog
aW50OF90IHsKKyAgICAgICAgR1AsCisgICAgICAgIEZQCisgICAgfTsKKworICAgIHN0YXRpYyBj
b25zdCB1bnNpZ25lZCBudW1UeXBlcyA9IDI7CisKKyAgICBzdGF0aWMgYm9vbCBpc1VzZShSb2xl
IHJvbGUpCisgICAgeworICAgICAgICBzd2l0Y2ggKHJvbGUpIHsKKyAgICAgICAgY2FzZSBVc2U6
CisgICAgICAgIGNhc2UgVXNlRGVmOgorICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAg
IGNhc2UgRGVmOgorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgfQor
CisgICAgc3RhdGljIGJvb2wgaXNEZWYoUm9sZSByb2xlKQorICAgIHsKKyAgICAgICAgc3dpdGNo
IChyb2xlKSB7CisgICAgICAgIGNhc2UgVXNlOgorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwor
ICAgICAgICBjYXNlIERlZjoKKyAgICAgICAgY2FzZSBVc2VEZWY6CisgICAgICAgICAgICByZXR1
cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHN0YXRpYyBUeXBlIHR5cGVGb3JCM1R5
cGUoQjM6OlR5cGUgdHlwZSkKKyAgICB7CisgICAgICAgIHN3aXRjaCAodHlwZSkgeworICAgICAg
ICBjYXNlIFZvaWQ6CisgICAgICAgICAgICBBU1NFUlRfTk9UX1JFQUNIRUQoKTsKKyAgICAgICAg
ICAgIHJldHVybiBHUDsKKyAgICAgICAgY2FzZSBJbnQzMjoKKyAgICAgICAgY2FzZSBJbnQ2NDoK
KyAgICAgICAgICAgIHJldHVybiBHUDsKKyAgICAgICAgY2FzZSBEb3VibGU6CisgICAgICAgICAg
ICByZXR1cm4gRlA7CisgICAgICAgIH0KKyAgICAgICAgQVNTRVJUX05PVF9SRUFDSEVEKCk7Cisg
ICAgICAgIHJldHVybiBHUDsKKyAgICB9CisKKyAgICBBcmcoKQorICAgIHsKKyAgICB9CisKKyAg
ICBBcmcoQWlyOjpUbXAgdG1wKQorICAgICAgICA6IG1fa2luZChUbXApCisgICAgICAgICwgbV9i
YXNlKHRtcCkKKyAgICB7CisgICAgfQorCisgICAgc3RhdGljIEFyZyBpbW0oaW50MzJfdCB2YWx1
ZSkKKyAgICB7CisgICAgICAgIEFyZyByZXN1bHQ7CisgICAgICAgIHJlc3VsdC5tX2tpbmQgPSBJ
bW07CisgICAgICAgIHJlc3VsdC5tX29mZnNldCA9IHZhbHVlOworICAgICAgICByZXR1cm4gcmVz
dWx0OworICAgIH0KKworICAgIHN0YXRpYyBBcmcgaW1tNjQoaW50cHRyX3QgdmFsdWUpCisgICAg
eworICAgICAgICBBcmcgcmVzdWx0OworICAgICAgICByZXN1bHQubV9raW5kID0gSW1tNjQ7Cisg
ICAgICAgIHJlc3VsdC5tX29mZnNldCA9IHZhbHVlOworICAgICAgICByZXR1cm4gcmVzdWx0Owor
ICAgIH0KKworICAgIHN0YXRpYyBBcmcgYWRkcihBaXI6OlRtcCBiYXNlLCBpbnQzMl90IG9mZnNl
dCA9IDApCisgICAgeworICAgICAgICBBU1NFUlQoYmFzZS5pc0dQKCkpOworICAgICAgICBBcmcg
cmVzdWx0OworICAgICAgICByZXN1bHQubV9raW5kID0gQWRkcjsKKyAgICAgICAgcmVzdWx0Lm1f
YmFzZSA9IGJhc2U7CisgICAgICAgIHJlc3VsdC5tX29mZnNldCA9IG9mZnNldDsKKyAgICAgICAg
cmV0dXJuIHJlc3VsdDsKKyAgICB9CisKKyAgICBzdGF0aWMgQXJnIHN0YWNrKFN0YWNrU2xvdCog
dmFsdWUsIGludDMyX3Qgb2Zmc2V0ID0gMCkKKyAgICB7CisgICAgICAgIEFyZyByZXN1bHQ7Cisg
ICAgICAgIHJlc3VsdC5tX2tpbmQgPSBTdGFjazsKKyAgICAgICAgcmVzdWx0Lm1fb2Zmc2V0ID0g
Yml0d2lzZV9jYXN0PGludHB0cl90Pih2YWx1ZSk7CisgICAgICAgIHJlc3VsdC5tX3NjYWxlID0g
b2Zmc2V0OyAvLyBJIGtub3csIHl1Y2suCisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQor
CisgICAgc3RhdGljIEFyZyBjYWxsQXJnKGludDMyX3Qgb2Zmc2V0KQorICAgIHsKKyAgICAgICAg
QXJnIHJlc3VsdDsKKyAgICAgICAgcmVzdWx0Lm1fa2luZCA9IENhbGxBcmc7CisgICAgICAgIHJl
c3VsdC5tX29mZnNldCA9IG9mZnNldDsKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisK
KyAgICBzdGF0aWMgYm9vbCBpc1ZhbGlkU2NhbGUodW5zaWduZWQgc2NhbGUpCisgICAgeworICAg
ICAgICBzd2l0Y2ggKHNjYWxlKSB