<?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>177844</bug_id>
          
          <creation_ts>2017-10-03 15:50:39 -0700</creation_ts>
          <short_desc>Add support for using Probe DFG OSR Exit behind a runtime flag.</short_desc>
          <delta_ts>2017-10-04 13:00:34 -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>Unspecified</rep_platform>
          <op_sys>Unspecified</op_sys>
          <bug_status>RESOLVED</bug_status>
          <resolution>FIXED</resolution>
          
          
          <bug_file_loc></bug_file_loc>
          <status_whiteboard></status_whiteboard>
          <keywords>InRadar</keywords>
          <priority>P2</priority>
          <bug_severity>Normal</bug_severity>
          <target_milestone>---</target_milestone>
          
          <blocked>175144</blocked>
          <everconfirmed>1</everconfirmed>
          <reporter name="Mark Lam">mark.lam</reporter>
          <assigned_to name="Mark Lam">mark.lam</assigned_to>
          <cc>fpizlo</cc>
    
    <cc>jfbastien</cc>
    
    <cc>keith_miller</cc>
    
    <cc>msaboff</cc>
    
    <cc>rmorisset</cc>
    
    <cc>saam</cc>
    
    <cc>webkit-bug-importer</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>1356102</commentid>
    <comment_count>0</comment_count>
    <who name="Mark Lam">mark.lam</who>
    <bug_when>2017-10-03 15:50:39 -0700</bug_when>
    <thetext>This is based on the code originally posted in https://bugs.webkit.org/show_bug.cgi?id=175144 with some optimizations and bug fixes added.  The probe based DFG OSR Exit is only enabled if Options::useProbeBaseOSRExit() is true.  We&apos;re landing this behind an option switch to make it easier to tune performance using the probe based OSR exit.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1356103</commentid>
    <comment_count>1</comment_count>
    <who name="Radar WebKit Bug Importer">webkit-bug-importer</who>
    <bug_when>2017-10-03 15:51:15 -0700</bug_when>
    <thetext>&lt;rdar://problem/34801425&gt;</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1356177</commentid>
    <comment_count>2</comment_count>
      <attachid>322619</attachid>
    <who name="Mark Lam">mark.lam</who>
    <bug_when>2017-10-03 17:45:59 -0700</bug_when>
    <thetext>Created attachment 322619
proposed patch.

Let&apos;s get some feedback and some EWS testing.  I still need to run benchmarks to confirm that perf is at parity with JSC_useProbeOSRExit=false.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1356211</commentid>
    <comment_count>3</comment_count>
      <attachid>322619</attachid>
    <who name="Saam Barati">saam</who>
    <bug_when>2017-10-03 19:35:00 -0700</bug_when>
    <thetext>Comment on attachment 322619
proposed patch.

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

&gt; Source/JavaScriptCore/assembler/ProbeStack.cpp:99
&gt; +    RELEASE_ASSERT(!dirtyBits);

don&apos;t think this is needed since the above loop condition is exactly this.

&gt; Source/JavaScriptCore/dfg/DFGOSRExit.cpp:50
&gt; +//=======================================================================================

I don&apos;t think this is needed to delineate.

&gt; Source/JavaScriptCore/dfg/DFGOSRExit.cpp:444
&gt; +    // The only reason for using this do while look is so we can break out midway when appropriate.

Nit: I think we&apos;ve started to use immediately invoked lambdas in this situation, but I&apos;m also ok with the while loop.

&gt; Source/JavaScriptCore/dfg/DFGOSRExit.cpp:487
&gt; +        if (extraInitializationLevel &lt;= ExtraInitializationLevel::SpeculationRecovery)

I&apos;m confused about this extraInitialzationLevel stuff. Is this something we cache on first exit? Does it actually help with speed? This all seems like straight forward code, so I can&apos;t imagine it would help, you don&apos;t loop anywhere here.

&gt; Source/JavaScriptCore/dfg/DFGOSRExit.cpp:557
&gt; +    size_t nextUndefinedSpanIndex = 0;
&gt; +    size_t nextUndefinedOperandIndex = numberOfOperands;
&gt; +    if (numUndefinedOperandSpans)
&gt; +        nextUndefinedOperandIndex = undefinedOperandSpans[nextUndefinedSpanIndex].firstIndex;
&gt; +
&gt; +    JSValue undefined = jsUndefined();
&gt; +    for (size_t spanIndex = 0; spanIndex &lt; numUndefinedOperandSpans; ++spanIndex) {
&gt; +        auto&amp; span = undefinedOperandSpans[spanIndex];
&gt; +        int firstOffset = span.minOffset;
&gt; +        int lastOffset = firstOffset + span.numberOfRegisters;
&gt; +
&gt; +        for (int offset = firstOffset; offset &lt; lastOffset; ++offset)
&gt; +            frame.setOperand(offset, undefined);
&gt; +    }

I thought you said this optimization doesn&apos;t help? If it doesn&apos;t, I saw we drop it, since it complicates the code.

&gt; Source/JavaScriptCore/dfg/DFGOSRExit.cpp:671
&gt; +    // The tag registers are needed to materialize recoveries below.

This comment seems like it has a high chance of being wrong since this is C++ code.

&gt; Source/JavaScriptCore/dfg/DFGOSRExit.cpp:903
&gt; +//=======================================================================================

I don&apos;t think this is needed to delineate.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1356551</commentid>
    <comment_count>4</comment_count>
      <attachid>322619</attachid>
    <who name="Mark Lam">mark.lam</who>
    <bug_when>2017-10-04 11:47:43 -0700</bug_when>
    <thetext>Comment on attachment 322619
proposed patch.

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

Thanks for the review.  My responses below ...

&gt; Source/JavaScriptCore/assembler/ProbeStack.cpp:91
&gt; +    uintptr_t dirtyBits = m_dirtyBits;

I changed this to uint64_t to fix the 32-bit build failure.

&gt;&gt; Source/JavaScriptCore/assembler/ProbeStack.cpp:99
&gt;&gt; +    RELEASE_ASSERT(!dirtyBits);
&gt; 
&gt; don&apos;t think this is needed since the above loop condition is exactly this.

I&apos;ve removed this.

&gt;&gt; Source/JavaScriptCore/dfg/DFGOSRExit.cpp:50
&gt;&gt; +//=======================================================================================
&gt; 
&gt; I don&apos;t think this is needed to delineate.

I&apos;ve removed this.

&gt;&gt; Source/JavaScriptCore/dfg/DFGOSRExit.cpp:444
&gt;&gt; +    // The only reason for using this do while look is so we can break out midway when appropriate.
&gt; 
&gt; Nit: I think we&apos;ve started to use immediately invoked lambdas in this situation, but I&apos;m also ok with the while loop.

Though we can express this early breakout more elegantly with a lambda, the last time I checked, clang still does not optimize out lambdas in cases where it should / could.  Since this function appears to be perf sensitive (ala the OSR exit perf regression), I&apos;ll stick with the do while loop.

&gt;&gt; Source/JavaScriptCore/dfg/DFGOSRExit.cpp:487
&gt;&gt; +        if (extraInitializationLevel &lt;= ExtraInitializationLevel::SpeculationRecovery)
&gt; 
&gt; I&apos;m confused about this extraInitialzationLevel stuff. Is this something we cache on first exit? Does it actually help with speed? This all seems like straight forward code, so I can&apos;t imagine it would help, you don&apos;t loop anywhere here.

The extraInitialzationLevel is based on my profiling of which of these initialization steps are actually taken during typical benchmarks.  Based on that, I ordered the initialization such that we can skip the least executed steps when not needed.

Regarding the complexity cost vs perf tradeoff, I agree in general.  However, the OSR exit perf issue is like a multi-variable problem.  Once one factor is improved, another one that wasn&apos;t previously a significant contributing factor now becomes significant.  So, I&apos;ll opt for keeping this for now until all the dust settles (at least until after I&apos;ve tuned the OSR exit deopt/reopt policy).  I&apos;ll remove this complexity then if it is still not contributing to perf with any significance.

&gt;&gt; Source/JavaScriptCore/dfg/DFGOSRExit.cpp:557
&gt;&gt; +    }
&gt; 
&gt; I thought you said this optimization doesn&apos;t help? If it doesn&apos;t, I saw we drop it, since it complicates the code.

Same as above.  I saw that it helps on some measurements and not on others (depending on which variables changed).  I&apos;ll keep this for now until the dust settles, and will re-evaluate keeping / removing it then.

&gt;&gt; Source/JavaScriptCore/dfg/DFGOSRExit.cpp:671
&gt;&gt; +    // The tag registers are needed to materialize recoveries below.
&gt; 
&gt; This comment seems like it has a high chance of being wrong since this is C++ code.

I&apos;m not sure that this is true because the tag registers are part of the callee saved registers, and we store the callee save registers to the VMEntryFrameCalleeSavesBuffer below in copyCalleeSavesToVMEntryFrameCalleeSavesBuffer().  Keeping this preserves the JIT OSR exit ramp&apos;s behavior of initializing these tag registers.  Note: the probe will update these registers to the newly set values when the probe returns as well.  Hence, setting here does have an effect.

&gt;&gt; Source/JavaScriptCore/dfg/DFGOSRExit.cpp:903
&gt;&gt; +//=======================================================================================
&gt; 
&gt; I don&apos;t think this is needed to delineate.

I&apos;ve removed this.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1356552</commentid>
    <comment_count>5</comment_count>
      <attachid>322619</attachid>
    <who name="Saam Barati">saam</who>
    <bug_when>2017-10-04 11:50:42 -0700</bug_when>
    <thetext>Comment on attachment 322619
proposed patch.

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

&gt;&gt;&gt; Source/JavaScriptCore/dfg/DFGOSRExit.cpp:671
&gt;&gt;&gt; +    // The tag registers are needed to materialize recoveries below.
&gt;&gt; 
&gt;&gt; This comment seems like it has a high chance of being wrong since this is C++ code.
&gt; 
&gt; I&apos;m not sure that this is true because the tag registers are part of the callee saved registers, and we store the callee save registers to the VMEntryFrameCalleeSavesBuffer below in copyCalleeSavesToVMEntryFrameCalleeSavesBuffer().  Keeping this preserves the JIT OSR exit ramp&apos;s behavior of initializing these tag registers.  Note: the probe will update these registers to the newly set values when the probe returns as well.  Hence, setting here does have an effect.

I&apos;m not saying that you don&apos;t need to materialize these. All I&apos;m saying is that I don&apos;t think these are needed for the recoveries anymore, since they&apos;re probably C++ code.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1356556</commentid>
    <comment_count>6</comment_count>
    <who name="Mark Lam">mark.lam</who>
    <bug_when>2017-10-04 11:54:07 -0700</bug_when>
    <thetext>(In reply to Saam Barati from comment #5)
&gt; Comment on attachment 322619 [details]
&gt; proposed patch.
&gt; 
&gt; View in context:
&gt; https://bugs.webkit.org/attachment.cgi?id=322619&amp;action=review
&gt; 
&gt; &gt;&gt;&gt; Source/JavaScriptCore/dfg/DFGOSRExit.cpp:671
&gt; &gt;&gt;&gt; +    // The tag registers are needed to materialize recoveries below.
&gt; &gt;&gt; 
&gt; &gt;&gt; This comment seems like it has a high chance of being wrong since this is C++ code.
&gt; &gt; 
&gt; &gt; I&apos;m not sure that this is true because the tag registers are part of the callee saved registers, and we store the callee save registers to the VMEntryFrameCalleeSavesBuffer below in copyCalleeSavesToVMEntryFrameCalleeSavesBuffer().  Keeping this preserves the JIT OSR exit ramp&apos;s behavior of initializing these tag registers.  Note: the probe will update these registers to the newly set values when the probe returns as well.  Hence, setting here does have an effect.
&gt; 
&gt; I&apos;m not saying that you don&apos;t need to materialize these. All I&apos;m saying is
&gt; that I don&apos;t think these are needed for the recoveries anymore, since
&gt; they&apos;re probably C++ code.

OK, I&apos;ve removed the comment.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1356604</commentid>
    <comment_count>7</comment_count>
      <attachid>322708</attachid>
    <who name="Mark Lam">mark.lam</who>
    <bug_when>2017-10-04 12:57:54 -0700</bug_when>
    <thetext>Created attachment 322708
patch for landing.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1356605</commentid>
    <comment_count>8</comment_count>
    <who name="Mark Lam">mark.lam</who>
    <bug_when>2017-10-04 13:00:34 -0700</bug_when>
    <thetext>Landed in r222871: &lt;http://trac.webkit.org/r222871&gt;.</thetext>
  </long_desc>
      
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>322619</attachid>
            <date>2017-10-03 17:45:59 -0700</date>
            <delta_ts>2017-10-04 12:57:54 -0700</delta_ts>
            <desc>proposed patch.</desc>
            <filename>bug-177844.patch</filename>
            <type>text/plain</type>
            <size>88213</size>
            <attacher name="Mark Lam">mark.lam</attacher>
            
              <data encoding="base64">SW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9DaGFuZ2VMb2cKPT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291
cmNlL0phdmFTY3JpcHRDb3JlL0NoYW5nZUxvZwkocmV2aXNpb24gMjIyODA1KQorKysgU291cmNl
L0phdmFTY3JpcHRDb3JlL0NoYW5nZUxvZwkod29ya2luZyBjb3B5KQpAQCAtMSwzICsxLDk1IEBA
CisyMDE3LTEwLTAzICBNYXJrIExhbSAgPG1hcmsubGFtQGFwcGxlLmNvbT4KKworICAgICAgICBB
ZGQgc3VwcG9ydCBmb3IgdXNpbmcgUHJvYmUgREZHIE9TUiBFeGl0IGJlaGluZCBhIHJ1bnRpbWUg
ZmxhZy4KKyAgICAgICAgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTE3
Nzg0NAorICAgICAgICA8cmRhcjovL3Byb2JsZW0vMzQ4MDE0MjU+CisKKyAgICAgICAgUmV2aWV3
ZWQgYnkgTk9CT0RZIChPT1BTISkuCisKKyAgICAgICAgVGhpcyBpcyBiYXNlZCBvbiB0aGUgY29k
ZSBvcmlnaW5hbGx5IHBvc3RlZCBpbiBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5j
Z2k/aWQ9MTc1MTQ0CisgICAgICAgIChpbiByMjIxNzc0IGFuZCByMjIxODMyKSB3aXRoIHNvbWUg
b3B0aW1pemF0aW9ucyBhbmQgYnVnIGZpeGVzIGFkZGVkLiAgVGhlIHByb2JlCisgICAgICAgIGJh
c2VkIERGRyBPU1IgRXhpdCBpcyBvbmx5IGVuYWJsZWQgaWYgT3B0aW9uczo6dXNlUHJvYmVPU1JF
eGl0KCkgaXMgdHJ1ZS4gIFdlJ3JlCisgICAgICAgIGxhbmRpbmcgdGhpcyBiZWhpbmQgYW4gb3B0
aW9uIHN3aXRjaCB0byBtYWtlIGl0IGVhc2llciB0byB0dW5lIHBlcmZvcm1hbmNlIHVzaW5nCisg
ICAgICAgIHRoZSBwcm9iZSBiYXNlZCBPU1IgZXhpdC4KKworICAgICAgICAqIEphdmFTY3JpcHRD
b3JlLnhjb2RlcHJvai9wcm9qZWN0LnBieHByb2o6CisgICAgICAgICogYXNzZW1ibGVyL01hY3Jv
QXNzZW1ibGVyLmNwcDoKKyAgICAgICAgKEpTQzo6c3RkRnVuY3Rpb25DYWxsYmFjayk6CisgICAg
ICAgICogYXNzZW1ibGVyL01hY3JvQXNzZW1ibGVyUHJpbnRlci5jcHA6CisgICAgICAgIChKU0M6
OlByaW50ZXI6OnByaW50Q2FsbGJhY2spOgorICAgICAgICAqIGFzc2VtYmxlci9Qcm9iZUNvbnRl
eHQuY3BwOgorICAgICAgICAoSlNDOjpQcm9iZTo6ZXhlY3V0ZVByb2JlKToKKyAgICAgICAgKEpT
Qzo6UHJvYmU6OmZsdXNoRGlydHlTdGFja1BhZ2VzKToKKyAgICAgICAgKiBhc3NlbWJsZXIvUHJv
YmVDb250ZXh0Lmg6CisgICAgICAgIChKU0M6OlByb2JlOjpDb250ZXh0OjpDb250ZXh0KToKKyAg
ICAgICAgKEpTQzo6UHJvYmU6OkNvbnRleHQ6OmFyZyk6CisgICAgICAgICogYXNzZW1ibGVyL1By
b2JlRnJhbWUuaDogQWRkZWQuCisgICAgICAgIChKU0M6OlByb2JlOjpGcmFtZTo6RnJhbWUpOgor
ICAgICAgICAoSlNDOjpQcm9iZTo6RnJhbWU6OmFyZ3VtZW50KToKKyAgICAgICAgKEpTQzo6UHJv
YmU6OkZyYW1lOjpvcGVyYW5kKToKKyAgICAgICAgKEpTQzo6UHJvYmU6OkZyYW1lOjpzZXRBcmd1
bWVudCk6CisgICAgICAgIChKU0M6OlByb2JlOjpGcmFtZTo6c2V0T3BlcmFuZCk6CisgICAgICAg
IChKU0M6OlByb2JlOjpGcmFtZTo6Z2V0KToKKyAgICAgICAgKEpTQzo6UHJvYmU6OkZyYW1lOjpz
ZXQpOgorICAgICAgICAqIGFzc2VtYmxlci9Qcm9iZVN0YWNrLmNwcDoKKyAgICAgICAgKEpTQzo6
UHJvYmU6OlBhZ2U6Omxvd1dhdGVybWFya0Zyb21WaXNpdGluZ0RpcnR5Q2h1bmtzKToKKyAgICAg
ICAgKEpTQzo6UHJvYmU6OlN0YWNrOjpTdGFjayk6CisgICAgICAgIChKU0M6OlByb2JlOjpTdGFj
azo6bG93V2F0ZXJtYXJrRnJvbVZpc2l0aW5nRGlydHlQYWdlcyk6CisgICAgICAgICogYXNzZW1i
bGVyL1Byb2JlU3RhY2suaDoKKyAgICAgICAgKEpTQzo6UHJvYmU6OlN0YWNrOjpTdGFjayk6Cisg
ICAgICAgIChKU0M6OlByb2JlOjpTdGFjazo6bG93V2F0ZXJtYXJrKToKKyAgICAgICAgKEpTQzo6
UHJvYmU6OlN0YWNrOjpzZXQpOgorICAgICAgICAoSlNDOjpQcm9iZTo6U3RhY2s6OnNhdmVkU3Rh
Y2tQb2ludGVyIGNvbnN0KToKKyAgICAgICAgKEpTQzo6UHJvYmU6OlN0YWNrOjpzZXRTYXZlZFN0
YWNrUG9pbnRlcik6CisgICAgICAgIChKU0M6OlByb2JlOjpTdGFjazo6bmV3U3RhY2tQb2ludGVy
IGNvbnN0KTogRGVsZXRlZC4KKyAgICAgICAgKEpTQzo6UHJvYmU6OlN0YWNrOjpzZXROZXdTdGFj
a1BvaW50ZXIpOiBEZWxldGVkLgorICAgICAgICAqIGJ5dGVjb2RlL0FycmF5UHJvZmlsZS5oOgor
ICAgICAgICAoSlNDOjpBcnJheVByb2ZpbGU6Om9ic2VydmVBcnJheU1vZGUpOgorICAgICAgICAq
IGJ5dGVjb2RlL0NvZGVCbG9jay5jcHA6CisgICAgICAgIChKU0M6OkNvZGVCbG9jazo6dXBkYXRl
T1NSRXhpdENvdW50ZXJBbmRDaGVja0lmTmVlZFRvUmVvcHRpbWl6ZSk6CisgICAgICAgICogYnl0
ZWNvZGUvQ29kZUJsb2NrLmg6CisgICAgICAgIChKU0M6OkNvZGVCbG9jazo6YWRkcmVzc09mT1NS
RXhpdENvdW50ZXIpOiBEZWxldGVkLgorICAgICAgICAqIGJ5dGVjb2RlL0V4ZWN1dGlvbkNvdW50
ZXIuaDoKKyAgICAgICAgKEpTQzo6RXhlY3V0aW9uQ291bnRlcjo6aGFzQ3Jvc3NlZFRocmVzaG9s
ZCBjb25zdCk6CisgICAgICAgIChKU0M6OkV4ZWN1dGlvbkNvdW50ZXI6OnNldE5ld1RocmVzaG9s
ZEZvck9TUkV4aXQpOgorICAgICAgICAqIGJ5dGVjb2RlL01ldGhvZE9mR2V0dGluZ0FWYWx1ZVBy
b2ZpbGUuY3BwOgorICAgICAgICAoSlNDOjpNZXRob2RPZkdldHRpbmdBVmFsdWVQcm9maWxlOjpy
ZXBvcnRWYWx1ZSk6CisgICAgICAgICogYnl0ZWNvZGUvTWV0aG9kT2ZHZXR0aW5nQVZhbHVlUHJv
ZmlsZS5oOgorICAgICAgICAqIGRmZy9ERkdEcml2ZXIuY3BwOgorICAgICAgICAoSlNDOjpERkc6
OmNvbXBpbGVJbXBsKToKKyAgICAgICAgKiBkZmcvREZHSklUQ29tcGlsZXIuY3BwOgorICAgICAg
ICAoSlNDOjpERkc6OkpJVENvbXBpbGVyOjpsaW5rT1NSRXhpdHMpOgorICAgICAgICAoSlNDOjpE
Rkc6OkpJVENvbXBpbGVyOjpsaW5rKToKKyAgICAgICAgKiBkZmcvREZHT1NSRXhpdC5jcHA6Cisg
ICAgICAgIChKU0M6OkRGRzo6anNWYWx1ZUZvcik6CisgICAgICAgIChKU0M6OkRGRzo6cmVzdG9y
ZUNhbGxlZVNhdmVzRm9yKToKKyAgICAgICAgKEpTQzo6REZHOjpzYXZlQ2FsbGVlU2F2ZXNGb3Ip
OgorICAgICAgICAoSlNDOjpERkc6OnJlc3RvcmVDYWxsZWVTYXZlc0Zyb21WTUVudHJ5RnJhbWVD
YWxsZWVTYXZlc0J1ZmZlcik6CisgICAgICAgIChKU0M6OkRGRzo6Y29weUNhbGxlZVNhdmVzVG9W
TUVudHJ5RnJhbWVDYWxsZWVTYXZlc0J1ZmZlcik6CisgICAgICAgIChKU0M6OkRGRzo6c2F2ZU9y
Q29weUNhbGxlZVNhdmVzRm9yKToKKyAgICAgICAgKEpTQzo6REZHOjpjcmVhdGVEaXJlY3RBcmd1
bWVudHNEdXJpbmdFeGl0KToKKyAgICAgICAgKEpTQzo6REZHOjpjcmVhdGVDbG9uZWRBcmd1bWVu
dHNEdXJpbmdFeGl0KToKKyAgICAgICAgKEpTQzo6REZHOjplbWl0UmVzdG9yZUFyZ3VtZW50cyk6
CisgICAgICAgIChKU0M6OkRGRzo6T1NSRXhpdDo6ZXhlY3V0ZU9TUkV4aXQpOgorICAgICAgICAo
SlNDOjpERkc6OnJlaWZ5SW5saW5lZENhbGxGcmFtZXMpOgorICAgICAgICAoSlNDOjpERkc6OmFk
anVzdEFuZEp1bXBUb1RhcmdldCk6CisgICAgICAgIChKU0M6OkRGRzo6cHJpbnRPU1JFeGl0KToK
KyAgICAgICAgKiBkZmcvREZHT1NSRXhpdC5oOgorICAgICAgICAoSlNDOjpERkc6Ok9TUkV4aXRT
dGF0ZTo6T1NSRXhpdFN0YXRlKToKKyAgICAgICAgKiBkZmcvREZHVGh1bmtzLmNwcDoKKyAgICAg
ICAgKEpTQzo6REZHOjpvc3JFeGl0VGh1bmtHZW5lcmF0b3IpOgorICAgICAgICAqIGRmZy9ERkdU
aHVua3MuaDoKKyAgICAgICAgKiBkZmcvREZHVmFyaWFibGVFdmVudFN0cmVhbS5jcHA6CisgICAg
ICAgIChKU0M6OkRGRzo6dHJ5VG9TZXRDb25zdGFudFJlY292ZXJ5KToKKyAgICAgICAgKEpTQzo6
REZHOjpWYXJpYWJsZUV2ZW50U3RyZWFtOjpyZWNvbnN0cnVjdCBjb25zdCk6CisgICAgICAgIChK
U0M6OkRGRzo6VmFyaWFibGVFdmVudFN0cmVhbTo6dHJ5VG9TZXRDb25zdGFudFJlY292ZXJ5IGNv
bnN0KTogRGVsZXRlZC4KKyAgICAgICAgKiBkZmcvREZHVmFyaWFibGVFdmVudFN0cmVhbS5oOgor
ICAgICAgICAqIHByb2ZpbGVyL1Byb2ZpbGVyT1NSRXhpdC5oOgorICAgICAgICAoSlNDOjpQcm9m
aWxlcjo6T1NSRXhpdDo6aW5jQ291bnQpOgorICAgICAgICAqIHJ1bnRpbWUvSlNDSlNWYWx1ZS5o
OgorICAgICAgICAqIHJ1bnRpbWUvSlNDSlNWYWx1ZUlubGluZXMuaDoKKyAgICAgICAgKiBydW50
aW1lL09wdGlvbnMuaDoKKwogMjAxNy0xMC0wMyAgSkYgQmFzdGllbiAgPGpmYmFzdGllbkBhcHBs
ZS5jb20+CiAKICAgICAgICAgV2ViQXNzZW1ibHk6IG5vIFZNIC8gSlMgdmVyc2lvbiBvZiBldmVy
eXRoaW5nIGJ1dCBJbnN0YW5jZQpJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL0phdmFTY3Jp
cHRDb3JlLnhjb2RlcHJvai9wcm9qZWN0LnBieHByb2oKPT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL0ph
dmFTY3JpcHRDb3JlL0phdmFTY3JpcHRDb3JlLnhjb2RlcHJvai9wcm9qZWN0LnBieHByb2oJKHJl
dmlzaW9uIDIyMjgwNSkKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9KYXZhU2NyaXB0Q29yZS54
Y29kZXByb2ovcHJvamVjdC5wYnhwcm9qCSh3b3JraW5nIGNvcHkpCkBAIC00NTkzLDYgKzQ1OTMs
NyBAQAogCQlGRUEwQzQwMDFDREQ3RDBFMDA0ODE5OTEgLyogRnVuY3Rpb25XaGl0ZWxpc3QuY3Bw
ICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93
bkZpbGVUeXBlID0gc291cmNlY29kZS5jcHAuY3BwOyBwYXRoID0gRnVuY3Rpb25XaGl0ZWxpc3Qu
Y3BwOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OwogCQlGRUEwQzQwMTFDREQ3RDBFMDA0ODE5
OTEgLyogRnVuY3Rpb25XaGl0ZWxpc3QuaCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBm
aWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5oOyBwYXRo
ID0gRnVuY3Rpb25XaGl0ZWxpc3QuaDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKIAkJRkVC
MTM3NTYxQkIxMUVFRTAwQ0Q1MTAwIC8qIE1hY3JvQXNzZW1ibGVyQVJNNjQuY3BwICovID0ge2lz
YSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBl
ID0gc291cmNlY29kZS5jcHAuY3BwOyBwYXRoID0gTWFjcm9Bc3NlbWJsZXJBUk02NC5jcHA7IHNv
dXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCUZFQjQxQ0NCMUY3MzI4NDIwMEM1NDgxRSAvKiBQ
cm9iZUZyYW1lLmggKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0g
NDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuaDsgcGF0aCA9IFByb2JlRnJhbWUu
aDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKIAkJRkVCNTFGNkExQTk3QjY4ODAwMUY5MjFD
IC8qIFJlZ3Jlc3MxNDE4MDkuaCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5j
b2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5oOyBuYW1lID0gUmVn
cmVzczE0MTgwOS5oOyBwYXRoID0gQVBJL3Rlc3RzL1JlZ3Jlc3MxNDE4MDkuaDsgc291cmNlVHJl
ZSA9ICI8Z3JvdXA+IjsgfTsKIAkJRkVCNTFGNkIxQTk3QjY4ODAwMUY5MjFDIC8qIFJlZ3Jlc3Mx
NDE4MDkubW0gKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsg
bGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmNwcC5vYmpjcHA7IG5hbWUgPSBSZWdyZXNz
MTQxODA5Lm1tOyBwYXRoID0gQVBJL3Rlc3RzL1JlZ3Jlc3MxNDE4MDkubW07IHNvdXJjZVRyZWUg
PSAiPGdyb3VwPiI7IH07CiAJCUZFQjU4QzEyMTg3QjhCMTYwMDk4RUYwQiAvKiBFcnJvckhhbmRs
aW5nU2NvcGUuY3BwICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9
IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jcHAuY3BwOyBwYXRoID0gRXJyb3JI
YW5kbGluZ1Njb3BlLmNwcDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKQEAgLTcyOTIsNiAr
NzI5Myw3IEBACiAJCQkJRkU2M0RENTMxRUE5QjYwRTAwMTAzQTY5IC8qIFByaW50ZXIuaCAqLywK
IAkJCQlGRTEwQUFGMzFGNDY4MjZEMDA5REVEQzUgLyogUHJvYmVDb250ZXh0LmNwcCAqLywKIAkJ
CQlGRTEwQUFFRDFGNDREOTQ2MDA5REVEQzUgLyogUHJvYmVDb250ZXh0LmggKi8sCisJCQkJRkVC
NDFDQ0IxRjczMjg0MjAwQzU0ODFFIC8qIFByb2JlRnJhbWUuaCAqLywKIAkJCQlGRTEwQUFFOTFG
NDRENTEwMDA5REVEQzUgLyogUHJvYmVTdGFjay5jcHAgKi8sCiAJCQkJRkUxMEFBRUExRjQ0RDUx
MjAwOURFREM1IC8qIFByb2JlU3RhY2suaCAqLywKIAkJCQlGRTUzM0NBMDFGMjE3QzMxMDAxNkEx
RkUgLyogdGVzdG1hc20uY3BwICovLApJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL2Fzc2Vt
Ymxlci9NYWNyb0Fzc2VtYmxlci5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRD
b3JlL2Fzc2VtYmxlci9NYWNyb0Fzc2VtYmxlci5jcHAJKHJldmlzaW9uIDIyMjgwNSkKKysrIFNv
dXJjZS9KYXZhU2NyaXB0Q29yZS9hc3NlbWJsZXIvTWFjcm9Bc3NlbWJsZXIuY3BwCSh3b3JraW5n
IGNvcHkpCkBAIC0zOCw3ICszOCw3IEBAIGNvbnN0IGRvdWJsZSBNYWNyb0Fzc2VtYmxlcjo6dHdv
VG9UaGUzMiAKICNpZiBFTkFCTEUoTUFTTV9QUk9CRSkKIHN0YXRpYyB2b2lkIHN0ZEZ1bmN0aW9u
Q2FsbGJhY2soUHJvYmU6OkNvbnRleHQmIGNvbnRleHQpCiB7Ci0gICAgYXV0byBmdW5jID0gc3Rh
dGljX2Nhc3Q8Y29uc3Qgc3RkOjpmdW5jdGlvbjx2b2lkKFByb2JlOjpDb250ZXh0Jik+Kj4oY29u
dGV4dC5hcmcpOworICAgIGF1dG8gZnVuYyA9IGNvbnRleHQuYXJnPGNvbnN0IHN0ZDo6ZnVuY3Rp
b248dm9pZChQcm9iZTo6Q29udGV4dCYpPio+KCk7CiAgICAgKCpmdW5jKShjb250ZXh0KTsKIH0K
ICAgICAKSW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9hc3NlbWJsZXIvTWFjcm9Bc3NlbWJs
ZXJQcmludGVyLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYXNzZW1i
bGVyL01hY3JvQXNzZW1ibGVyUHJpbnRlci5jcHAJKHJldmlzaW9uIDIyMjgwNSkKKysrIFNvdXJj
ZS9KYXZhU2NyaXB0Q29yZS9hc3NlbWJsZXIvTWFjcm9Bc3NlbWJsZXJQcmludGVyLmNwcAkod29y
a2luZyBjb3B5KQpAQCAtMTc1LDcgKzE3NSw3IEBAIHZvaWQgcHJpbnRNZW1vcnkoUHJpbnRTdHJl
YW0mIG91dCwgQ29udGUKIHZvaWQgcHJpbnRDYWxsYmFjayhQcm9iZTo6Q29udGV4dCYgcHJvYmVD
b250ZXh0KQogewogICAgIGF1dG8mIG91dCA9IFdURjo6ZGF0YUZpbGUoKTsKLSAgICBQcmludFJl
Y29yZExpc3QmIGxpc3QgPSAqcmVpbnRlcnByZXRfY2FzdDxQcmludFJlY29yZExpc3QqPihwcm9i
ZUNvbnRleHQuYXJnKTsKKyAgICBQcmludFJlY29yZExpc3QmIGxpc3QgPSAqcHJvYmVDb250ZXh0
LmFyZzxQcmludFJlY29yZExpc3QqPigpOwogICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbGlz
dC5zaXplKCk7IGkrKykgewogICAgICAgICBhdXRvJiByZWNvcmQgPSBsaXN0W2ldOwogICAgICAg
ICBDb250ZXh0IGNvbnRleHQocHJvYmVDb250ZXh0LCByZWNvcmQuZGF0YSk7CkluZGV4OiBTb3Vy
Y2UvSmF2YVNjcmlwdENvcmUvYXNzZW1ibGVyL1Byb2JlQ29udGV4dC5jcHAKPT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQot
LS0gU291cmNlL0phdmFTY3JpcHRDb3JlL2Fzc2VtYmxlci9Qcm9iZUNvbnRleHQuY3BwCShyZXZp
c2lvbiAyMjI4MDUpCisrKyBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYXNzZW1ibGVyL1Byb2JlQ29u
dGV4dC5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTUyLDggKzUyLDkgQEAgdm9pZCBleGVjdXRlUHJv
YmUoU3RhdGUqIHN0YXRlKQogI2VuZGlmCiAKICAgICBpZiAoY29udGV4dC5oYXNXcml0ZXNUb0Zs
dXNoKCkpIHsKLSAgICAgICAgY29udGV4dC5zdGFjaygpLnNldE5ld1N0YWNrUG9pbnRlcihzdGF0
ZS0+Y3B1LnNwKCkpOwotICAgICAgICBzdGF0ZS0+Y3B1LnNwKCkgPSBzdGQ6Om1pbihjb250ZXh0
LnN0YWNrKCkubG93V2F0ZXJtYXJrKCksIHN0YXRlLT5jcHUuc3AoKSk7CisgICAgICAgIGNvbnRl
eHQuc3RhY2soKS5zZXRTYXZlZFN0YWNrUG9pbnRlcihzdGF0ZS0+Y3B1LnNwKCkpOworICAgICAg
ICB2b2lkKiBsb3dXYXRlcm1hcmsgPSBjb250ZXh0LnN0YWNrKCkubG93V2F0ZXJtYXJrKHN0YXRl
LT5jcHUuc3AoKSk7CisgICAgICAgIHN0YXRlLT5jcHUuc3AoKSA9IHN0ZDo6bWluKGxvd1dhdGVy
bWFyaywgc3RhdGUtPmNwdS5zcCgpKTsKIAogICAgICAgICBzdGF0ZS0+aW5pdGlhbGl6ZVN0YWNr
RnVuY3Rpb24gPSBmbHVzaERpcnR5U3RhY2tQYWdlczsKICAgICAgICAgc3RhdGUtPmluaXRpYWxp
emVTdGFja0FyZyA9IGNvbnRleHQucmVsZWFzZVN0YWNrKCk7CkBAIC02NCw3ICs2NSw3IEBAIHN0
YXRpYyB2b2lkIGZsdXNoRGlydHlTdGFja1BhZ2VzKFN0YXRlKiAKIHsKICAgICBzdGQ6OnVuaXF1
ZV9wdHI8U3RhY2s+IHN0YWNrKHJlaW50ZXJwcmV0X2Nhc3Q8UHJvYmU6OlN0YWNrKj4oc3RhdGUt
PmluaXRpYWxpemVTdGFja0FyZykpOwogICAgIHN0YWNrLT5mbHVzaFdyaXRlcygpOwotICAgIHN0
YXRlLT5jcHUuc3AoKSA9IHN0YWNrLT5uZXdTdGFja1BvaW50ZXIoKTsKKyAgICBzdGF0ZS0+Y3B1
LnNwKCkgPSBzdGFjay0+c2F2ZWRTdGFja1BvaW50ZXIoKTsKIH0KIAogLy8gTm90IGZvciBnZW5l
cmFsIHVzZS4gVGhpcyBzaG91bGQgb25seSBiZSBmb3Igd3JpdGluZyB0ZXN0cy4KSW5kZXg6IFNv
dXJjZS9KYXZhU2NyaXB0Q29yZS9hc3NlbWJsZXIvUHJvYmVDb250ZXh0LmgKPT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQot
LS0gU291cmNlL0phdmFTY3JpcHRDb3JlL2Fzc2VtYmxlci9Qcm9iZUNvbnRleHQuaAkocmV2aXNp
b24gMjIyODA1KQorKysgU291cmNlL0phdmFTY3JpcHRDb3JlL2Fzc2VtYmxlci9Qcm9iZUNvbnRl
eHQuaAkod29ya2luZyBjb3B5KQpAQCAtMTkxLDExICsxOTEsMTMgQEAgcHVibGljOgogICAgIHVz
aW5nIEZQUmVnaXN0ZXJJRCA9IE1hY3JvQXNzZW1ibGVyOjpGUFJlZ2lzdGVySUQ7CiAKICAgICBD
b250ZXh0KFN0YXRlKiBzdGF0ZSkKLSAgICAgICAgOiBtX3N0YXRlKHN0YXRlKQotICAgICAgICAs
IGFyZyhzdGF0ZS0+YXJnKQotICAgICAgICAsIGNwdShzdGF0ZS0+Y3B1KQorICAgICAgICA6IGNw
dShzdGF0ZS0+Y3B1KQorICAgICAgICAsIG1fc3RhdGUoc3RhdGUpCiAgICAgeyB9CiAKKyAgICB0
ZW1wbGF0ZTx0eXBlbmFtZSBUPgorICAgIFQgYXJnKCkgeyByZXR1cm4gcmVpbnRlcnByZXRfY2Fz
dDxUPihtX3N0YXRlLT5hcmcpOyB9CisKICAgICB1aW50cHRyX3QmIGdwcihSZWdpc3RlcklEIGlk
KSB7IHJldHVybiBjcHUuZ3ByKGlkKTsgfQogICAgIHVpbnRwdHJfdCYgc3ByKFNQUmVnaXN0ZXJJ
RCBpZCkgeyByZXR1cm4gY3B1LnNwcihpZCk7IH0KICAgICBkb3VibGUmIGZwcihGUFJlZ2lzdGVy
SUQgaWQpIHsgcmV0dXJuIGNwdS5mcHIoaWQpOyB9CkBAIC0yMjQsMTMgKzIyNiwxMCBAQCBwdWJs
aWM6CiAgICAgYm9vbCBoYXNXcml0ZXNUb0ZsdXNoKCkgeyByZXR1cm4gbV9zdGFjay5oYXNXcml0
ZXNUb0ZsdXNoKCk7IH0KICAgICBTdGFjayogcmVsZWFzZVN0YWNrKCkgeyByZXR1cm4gbmV3IFN0
YWNrKFdURk1vdmUobV9zdGFjaykpOyB9CiAKLXByaXZhdGU6Ci0gICAgU3RhdGUqIG1fc3RhdGU7
Ci1wdWJsaWM6Ci0gICAgdm9pZCogYXJnOwogICAgIENQVVN0YXRlJiBjcHU7CiAKIHByaXZhdGU6
CisgICAgU3RhdGUqIG1fc3RhdGU7CiAgICAgU3RhY2sgbV9zdGFjazsKIAogICAgIGZyaWVuZCBK
U19FWFBPUlRfUFJJVkFURSB2b2lkKiBwcm9iZVN0YXRlRm9yQ29udGV4dChDb250ZXh0Jik7IC8v
IE5vdCBmb3IgZ2VuZXJhbCB1c2UuIFRoaXMgc2hvdWxkIG9ubHkgYmUgZm9yIHdyaXRpbmcgdGVz
dHMuCkluZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYXNzZW1ibGVyL1Byb2JlRnJhbWUuaAo9
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYXNzZW1ibGVyL1Byb2JlRnJhbWUu
aAkobm9uZXhpc3RlbnQpCisrKyBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYXNzZW1ibGVyL1Byb2Jl
RnJhbWUuaAkod29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDk0IEBACisvKgorICogQ29weXJpZ2h0
IChDKSAyMDE3IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3Ry
aWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhv
dXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xs
b3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBz
b3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2Us
IHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisg
KiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFi
b3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQg
dGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQv
b3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisg
KiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBB
TlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1Qg
TElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZ
IEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQu
ICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElB
QkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVY
RU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElN
SVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7
IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBU
SU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBX
SEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVE
SU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRI
RSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lC
SUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI3ByYWdtYSBvbmNlCisKKyNpZiBFTkFCTEUo
TUFTTV9QUk9CRSkKKworI2luY2x1ZGUgIkNhbGxGcmFtZS5oIgorI2luY2x1ZGUgIlByb2JlU3Rh
Y2suaCIKKworbmFtZXNwYWNlIEpTQyB7CituYW1lc3BhY2UgUHJvYmUgeworCitjbGFzcyBGcmFt
ZSB7CitwdWJsaWM6CisgICAgRnJhbWUodm9pZCogZnJhbWVCYXNlLCBTdGFjayYgc3RhY2spCisg
ICAgICAgIDogbV9mcmFtZUJhc2UgeyByZWludGVycHJldF9jYXN0PHVpbnQ4X3QqPihmcmFtZUJh
c2UpIH0KKyAgICAgICAgLCBtX3N0YWNrIHsgc3RhY2sgfQorICAgIHsgfQorCisgICAgdGVtcGxh
dGU8dHlwZW5hbWUgVCA9IEpTVmFsdWU+CisgICAgVCBhcmd1bWVudChpbnQgYXJndW1lbnQpCisg
ICAgeworICAgICAgICByZXR1cm4gZ2V0PFQ+KENhbGxGcmFtZTo6YXJndW1lbnRPZmZzZXQoYXJn
dW1lbnQpICogc2l6ZW9mKFJlZ2lzdGVyKSk7CisgICAgfQorICAgIHRlbXBsYXRlPHR5cGVuYW1l
IFQgPSBKU1ZhbHVlPgorICAgIFQgb3BlcmFuZChpbnQgb3BlcmFuZCkKKyAgICB7CisgICAgICAg
IHJldHVybiBnZXQ8VD4oc3RhdGljX2Nhc3Q8VmlydHVhbFJlZ2lzdGVyPihvcGVyYW5kKS5vZmZz
ZXQoKSAqIHNpemVvZihSZWdpc3RlcikpOworICAgIH0KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBU
ID0gSlNWYWx1ZT4KKyAgICBUIG9wZXJhbmQoaW50IG9wZXJhbmQsIHB0cmRpZmZfdCBvZmZzZXQp
CisgICAgeworICAgICAgICByZXR1cm4gZ2V0PFQ+KHN0YXRpY19jYXN0PFZpcnR1YWxSZWdpc3Rl
cj4ob3BlcmFuZCkub2Zmc2V0KCkgKiBzaXplb2YoUmVnaXN0ZXIpICsgb2Zmc2V0KTsKKyAgICB9
CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorICAgIHZvaWQgc2V0QXJndW1lbnQoaW50IGFy
Z3VtZW50LCBUIHZhbHVlKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHNldDxUPihDYWxsRnJhbWU6
OmFyZ3VtZW50T2Zmc2V0KGFyZ3VtZW50KSAqIHNpemVvZihSZWdpc3RlciksIHZhbHVlKTsKKyAg
ICB9CisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4KKyAgICB2b2lkIHNldE9wZXJhbmQoaW50IG9w
ZXJhbmQsIFQgdmFsdWUpCisgICAgeworICAgICAgICBzZXQ8VD4oc3RhdGljX2Nhc3Q8VmlydHVh
bFJlZ2lzdGVyPihvcGVyYW5kKS5vZmZzZXQoKSAqIHNpemVvZihSZWdpc3RlciksIHZhbHVlKTsK
KyAgICB9CisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4KKyAgICB2b2lkIHNldE9wZXJhbmQoaW50
IG9wZXJhbmQsIHB0cmRpZmZfdCBvZmZzZXQsIFQgdmFsdWUpCisgICAgeworICAgICAgICBzZXQ8
VD4oc3RhdGljX2Nhc3Q8VmlydHVhbFJlZ2lzdGVyPihvcGVyYW5kKS5vZmZzZXQoKSAqIHNpemVv
ZihSZWdpc3RlcikgKyBvZmZzZXQsIHZhbHVlKTsKKyAgICB9CisKKyAgICB0ZW1wbGF0ZTx0eXBl
bmFtZSBUID0gSlNWYWx1ZT4KKyAgICBUIGdldChwdHJkaWZmX3Qgb2Zmc2V0KQorICAgIHsKKyAg
ICAgICAgcmV0dXJuIG1fc3RhY2suZ2V0PFQ+KG1fZnJhbWVCYXNlICsgb2Zmc2V0KTsKKyAgICB9
CisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4KKyAgICB2b2lkIHNldChwdHJkaWZmX3Qgb2Zmc2V0
LCBUIHZhbHVlKQorICAgIHsKKyAgICAgICAgbV9zdGFjay5zZXQ8VD4obV9mcmFtZUJhc2UgKyBv
ZmZzZXQsIHZhbHVlKTsKKyAgICB9CisKK3ByaXZhdGU6CisgICAgdWludDhfdCogbV9mcmFtZUJh
c2U7CisgICAgU3RhY2smIG1fc3RhY2s7Cit9OworCit9IC8vIG5hbWVzcGFjZSBQcm9iZQorfSAv
LyBuYW1lc3BhY2UgSlNDCisKKyNlbmRpZiAvLyBFTkFCTEUoTUFTTV9QUk9CRSkKSW5kZXg6IFNv
dXJjZS9KYXZhU2NyaXB0Q29yZS9hc3NlbWJsZXIvUHJvYmVTdGFjay5jcHAKPT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQot
LS0gU291cmNlL0phdmFTY3JpcHRDb3JlL2Fzc2VtYmxlci9Qcm9iZVN0YWNrLmNwcAkocmV2aXNp
b24gMjIyODA1KQorKysgU291cmNlL0phdmFTY3JpcHRDb3JlL2Fzc2VtYmxlci9Qcm9iZVN0YWNr
LmNwcAkod29ya2luZyBjb3B5KQpAQCAtMzQsNiArMzQsOCBAQAogbmFtZXNwYWNlIEpTQyB7CiBu
YW1lc3BhY2UgUHJvYmUgewogCitzdGF0aWMgdm9pZCogY29uc3QgbWF4TG93V2F0ZXJtYXJrID0g
cmVpbnRlcnByZXRfY2FzdDx2b2lkKj4oc3RkOjpudW1lcmljX2xpbWl0czx1aW50cHRyX3Q+Ojpt
YXgoKSk7CisKICNpZiBBU0FOX0VOQUJMRUQKIC8vIEZJWE1FOiB3ZSBzaG91bGQgY29uc2lkZXIg
dXNpbmcgdGhlIGNvcHkgZnVuY3Rpb24gZm9yIGJvdGggQVNhbiBhbmQgbm9uLUFTYW4gYnVpbGRz
LgogLy8gaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTE3Njk2MQpAQCAt
NDksNyArNTEsNyBAQCBzdGF0aWMgdm9pZCBjb3B5U3RhY2tQYWdlKHZvaWQqIGRzdCwgdm9pCiAg
ICAgICAgICpkc3RQb2ludGVyKysgPSAqc3JjUG9pbnRlcisrOwogfQogI2Vsc2UKLSNkZWZpbmUg
Y29weVN0YWNrUGFnZShkc3QsIHNyYywgc2l6ZSkgc3RkOjptZW1jcHkoZHN0LCBzcmMsIHNpemUp
OworI2RlZmluZSBjb3B5U3RhY2tQYWdlKGRzdCwgc3JjLCBzaXplKSBzdGQ6Om1lbWNweShkc3Qs
IHNyYywgc2l6ZSkKICNlbmRpZgogCiBQYWdlOjpQYWdlKHZvaWQqIGJhc2VBZGRyZXNzKQpAQCAt
ODQsMTIgKzg2LDI1IEBAIHZvaWQgUGFnZTo6Zmx1c2hXcml0ZXMoKQogICAgIG1fZGlydHlCaXRz
ID0gMDsKIH0KIAordm9pZCogUGFnZTo6bG93V2F0ZXJtYXJrRnJvbVZpc2l0aW5nRGlydHlDaHVu
a3MoKQoreworICAgIHVpbnRwdHJfdCBkaXJ0eUJpdHMgPSBtX2RpcnR5Qml0czsKKyAgICBzaXpl
X3Qgb2Zmc2V0ID0gMDsKKyAgICB3aGlsZSAoZGlydHlCaXRzKSB7CisgICAgICAgIGlmIChkaXJ0
eUJpdHMgJiAxKQorICAgICAgICAgICAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8dWludDhfdCo+
KG1fYmFzZUxvZ2ljYWxBZGRyZXNzKSArIG9mZnNldDsKKyAgICAgICAgZGlydHlCaXRzID0gZGly
dHlCaXRzID4+IDE7CisgICAgICAgIG9mZnNldCArPSBzX2NodW5rU2l6ZTsKKyAgICB9CisgICAg
UkVMRUFTRV9BU1NFUlQoIWRpcnR5Qml0cyk7CisgICAgcmV0dXJuIG1heExvd1dhdGVybWFyazsK
K30KKwogU3RhY2s6OlN0YWNrKFN0YWNrJiYgb3RoZXIpCi0gICAgOiBtX25ld1N0YWNrUG9pbnRl
cihvdGhlci5tX25ld1N0YWNrUG9pbnRlcikKLSAgICAsIG1fbG93V2F0ZXJtYXJrKG90aGVyLm1f
bG93V2F0ZXJtYXJrKQotICAgICwgbV9zdGFja0JvdW5kcyhXVEZNb3ZlKG90aGVyLm1fc3RhY2tC
b3VuZHMpKQorICAgIDogbV9zdGFja0JvdW5kcyhXVEZNb3ZlKG90aGVyLm1fc3RhY2tCb3VuZHMp
KQogICAgICwgbV9wYWdlcyhXVEZNb3ZlKG90aGVyLm1fcGFnZXMpKQogeworICAgIG1fc2F2ZWRT
dGFja1BvaW50ZXIgPSBvdGhlci5tX3NhdmVkU3RhY2tQb2ludGVyOwogI2lmICFBU1NFUlRfRElT
QUJMRUQKICAgICBvdGhlci5tX2lzVmFsaWQgPSBmYWxzZTsKICNlbmRpZgpAQCAtMTI4LDYgKzE0
MywxOCBAQCBQYWdlKiBTdGFjazo6ZW5zdXJlUGFnZUZvcih2b2lkKiBhZGRyZXNzCiAgICAgcmV0
dXJuIG1fbGFzdEFjY2Vzc2VkUGFnZTsKIH0KIAordm9pZCogU3RhY2s6Omxvd1dhdGVybWFya0Zy
b21WaXNpdGluZ0RpcnR5UGFnZXMoKQoreworICAgIHZvaWQqIGxvdyA9IG1heExvd1dhdGVybWFy
azsKKyAgICBmb3IgKGF1dG8gaXQgPSBtX3BhZ2VzLmJlZ2luKCk7IGl0ICE9IG1fcGFnZXMuZW5k
KCk7ICsraXQpIHsKKyAgICAgICAgUGFnZSYgcGFnZSA9ICppdC0+dmFsdWU7CisgICAgICAgIGlm
ICghcGFnZS5oYXNXcml0ZXNUb0ZsdXNoKCkgfHwgbG93IDwgcGFnZS5iYXNlQWRkcmVzcygpKQor
ICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIGxvdyA9IHN0ZDo6bWluKGxvdywgcGFnZS5s
b3dXYXRlcm1hcmtGcm9tVmlzaXRpbmdEaXJ0eUNodW5rcygpKTsKKyAgICB9CisgICAgcmV0dXJu
IGxvdzsKK30KKwogfSAvLyBuYW1lc3BhY2UgUHJvYmUKIH0gLy8gbmFtZXNwYWNlIEpTQwogCklu
ZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYXNzZW1ibGVyL1Byb2JlU3RhY2suaAo9PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYXNzZW1ibGVyL1Byb2JlU3RhY2suaAkocmV2
aXNpb24gMjIyODA1KQorKysgU291cmNlL0phdmFTY3JpcHRDb3JlL2Fzc2VtYmxlci9Qcm9iZVN0
YWNrLmgJKHdvcmtpbmcgY29weSkKQEAgLTk1LDYgKzk1LDggQEAgcHVibGljOgogICAgICAgICAg
ICAgZmx1c2hXcml0ZXMoKTsKICAgICB9CiAKKyAgICB2b2lkKiBsb3dXYXRlcm1hcmtGcm9tVmlz
aXRpbmdEaXJ0eUNodW5rcygpOworCiBwcml2YXRlOgogICAgIHVpbnQ2NF90IGRpcnR5Qml0Rm9y
KHZvaWQqIGxvZ2ljYWxBZGRyZXNzKQogICAgIHsKQEAgLTE0NiwxNyArMTQ4LDE1IEBAIGNsYXNz
IFN0YWNrIHsKICAgICBXVEZfTUFLRV9GQVNUX0FMTE9DQVRFRDsKIHB1YmxpYzoKICAgICBTdGFj
aygpCi0gICAgICAgIDogbV9sb3dXYXRlcm1hcmsocmVpbnRlcnByZXRfY2FzdDx2b2lkKj4oLTEp
KQotICAgICAgICAsIG1fc3RhY2tCb3VuZHMoVGhyZWFkOjpjdXJyZW50KCkuc3RhY2soKSkKKyAg
ICAgICAgOiBtX3N0YWNrQm91bmRzKFRocmVhZDo6Y3VycmVudCgpLnN0YWNrKCkpCiAgICAgeyB9
CiAgICAgU3RhY2soU3RhY2smJiBvdGhlcik7CiAKLSAgICB2b2lkKiBsb3dXYXRlcm1hcmsoKQor
ICAgIHZvaWQqIGxvd1dhdGVybWFya0Zyb21WaXNpdGluZ0RpcnR5UGFnZXMoKTsKKyAgICB2b2lk
KiBsb3dXYXRlcm1hcmsodm9pZCogc3RhY2tQb2ludGVyKQogICAgIHsKLSAgICAgICAgLy8gV2Ug
dXNlIHRoZSBjaHVua0FkZHJlc3MgZm9yIHRoZSBsb3cgd2F0ZXJtYXJrIGJlY2F1c2Ugd2UnbGwg
YmUgZG9pbmcgd3JpdGUgYmFja3MKLSAgICAgICAgLy8gdG8gdGhlIHN0YWNrIGluIGluY3JlbWVu
dHMgb2YgY2h1bmtzLiBIZW5jZSwgd2UnbGwgdHJlYXQgdGhlIGxvd2VzdCBhZGRyZXNzIG9mCi0g
ICAgICAgIC8vIHRoZSBjaHVuayBhcyB0aGUgbG93IHdhdGVybWFyayBvZiBhbnkgZ2l2ZW4gc2V0
IGFkZHJlc3MuCi0gICAgICAgIHJldHVybiBQYWdlOjpjaHVua0FkZHJlc3NGb3IobV9sb3dXYXRl
cm1hcmspOworICAgICAgICBBU1NFUlQoUGFnZTo6Y2h1bmtBZGRyZXNzRm9yKHN0YWNrUG9pbnRl
cikgPT0gbG93V2F0ZXJtYXJrRnJvbVZpc2l0aW5nRGlydHlQYWdlcygpKTsKKyAgICAgICAgcmV0
dXJuIFBhZ2U6OmNodW5rQWRkcmVzc0ZvcihzdGFja1BvaW50ZXIpOwogICAgIH0KIAogICAgIHRl
bXBsYXRlPHR5cGVuYW1lIFQ+CkBAIC0xNzYsOSArMTc2LDYgQEAgcHVibGljOgogICAgIHsKICAg
ICAgICAgUGFnZSogcGFnZSA9IHBhZ2VGb3IoYWRkcmVzcyk7CiAgICAgICAgIHBhZ2UtPnNldDxU
PihhZGRyZXNzLCB2YWx1ZSk7Ci0KLSAgICAgICAgaWYgKGFkZHJlc3MgPCBtX2xvd1dhdGVybWFy
aykKLSAgICAgICAgICAgIG1fbG93V2F0ZXJtYXJrID0gYWRkcmVzczsKICAgICB9CiAKICAgICB0
ZW1wbGF0ZTx0eXBlbmFtZSBUPgpAQCAtMTg5LDggKzE4Niw4IEBAIHB1YmxpYzoKIAogICAgIEpT
X0VYUE9SVF9QUklWQVRFIFBhZ2UqIGVuc3VyZVBhZ2VGb3Iodm9pZCogYWRkcmVzcyk7CiAKLSAg
ICB2b2lkKiBuZXdTdGFja1BvaW50ZXIoKSBjb25zdCB7IHJldHVybiBtX25ld1N0YWNrUG9pbnRl
cjsgfTsKLSAgICB2b2lkIHNldE5ld1N0YWNrUG9pbnRlcih2b2lkKiBzcCkgeyBtX25ld1N0YWNr
UG9pbnRlciA9IHNwOyB9OworICAgIHZvaWQqIHNhdmVkU3RhY2tQb2ludGVyKCkgY29uc3QgeyBy
ZXR1cm4gbV9zYXZlZFN0YWNrUG9pbnRlcjsgfQorICAgIHZvaWQgc2V0U2F2ZWRTdGFja1BvaW50
ZXIodm9pZCogc3ApIHsgbV9zYXZlZFN0YWNrUG9pbnRlciA9IHNwOyB9CiAKICAgICBib29sIGhh
c1dyaXRlc1RvRmx1c2goKTsKICAgICB2b2lkIGZsdXNoV3JpdGVzKCk7CkBAIC0yMDcsOCArMjA0
LDcgQEAgcHJpdmF0ZToKICAgICAgICAgcmV0dXJuIGVuc3VyZVBhZ2VGb3IoYWRkcmVzcyk7CiAg
ICAgfQogCi0gICAgdm9pZCogbV9uZXdTdGFja1BvaW50ZXIgeyBudWxscHRyIH07Ci0gICAgdm9p
ZCogbV9sb3dXYXRlcm1hcms7CisgICAgdm9pZCogbV9zYXZlZFN0YWNrUG9pbnRlciB7IG51bGxw
dHIgfTsKIAogICAgIC8vIEEgY2FjaGUgb2YgdGhlIGxhc3QgYWNjZXNzZWQgcGFnZSBkZXRhaWxz
IGZvciBxdWljayBhY2Nlc3MuCiAgICAgdm9pZCogbV9sYXN0QWNjZXNzZWRQYWdlQmFzZUFkZHJl
c3MgeyBudWxscHRyIH07CkluZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYnl0ZWNvZGUvQXJy
YXlQcm9maWxlLmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRDb3JlL2J5dGVjb2Rl
L0FycmF5UHJvZmlsZS5oCShyZXZpc2lvbiAyMjI4MDUpCisrKyBTb3VyY2UvSmF2YVNjcmlwdENv
cmUvYnl0ZWNvZGUvQXJyYXlQcm9maWxlLmgJKHdvcmtpbmcgY29weSkKQEAgLTEsNSArMSw1IEBA
CiAvKgotICogQ29weXJpZ2h0IChDKSAyMDEyLCAyMDEzIEFwcGxlIEluYy4gQWxsIHJpZ2h0cyBy
ZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoQykgMjAxMi0yMDE3IEFwcGxlIEluYy4gQWxsIHJpZ2h0
cyByZXNlcnZlZC4KICAqCiAgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQg
YmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKICAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1p
dHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwpAQCAtMjE4LDYgKzIx
OCw3IEBAIHB1YmxpYzoKICAgICB2b2lkIGNvbXB1dGVVcGRhdGVkUHJlZGljdGlvbihjb25zdCBD
b25jdXJyZW50SlNMb2NrZXImLCBDb2RlQmxvY2sqKTsKICAgICB2b2lkIGNvbXB1dGVVcGRhdGVk
UHJlZGljdGlvbihjb25zdCBDb25jdXJyZW50SlNMb2NrZXImLCBDb2RlQmxvY2sqLCBTdHJ1Y3R1
cmUqIGxhc3RTZWVuU3RydWN0dXJlKTsKICAgICAKKyAgICB2b2lkIG9ic2VydmVBcnJheU1vZGUo
QXJyYXlNb2RlcyBtb2RlKSB7IG1fb2JzZXJ2ZWRBcnJheU1vZGVzIHw9IG1vZGU7IH0KICAgICBB
cnJheU1vZGVzIG9ic2VydmVkQXJyYXlNb2Rlcyhjb25zdCBDb25jdXJyZW50SlNMb2NrZXImKSBj
b25zdCB7IHJldHVybiBtX29ic2VydmVkQXJyYXlNb2RlczsgfQogICAgIGJvb2wgbWF5SW50ZXJj
ZXB0SW5kZXhlZEFjY2Vzc2VzKGNvbnN0IENvbmN1cnJlbnRKU0xvY2tlciYpIGNvbnN0IHsgcmV0
dXJuIG1fbWF5SW50ZXJjZXB0SW5kZXhlZEFjY2Vzc2VzOyB9CiAgICAgCkluZGV4OiBTb3VyY2Uv
SmF2YVNjcmlwdENvcmUvYnl0ZWNvZGUvQ29kZUJsb2NrLmNwcAo9PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3Vy
Y2UvSmF2YVNjcmlwdENvcmUvYnl0ZWNvZGUvQ29kZUJsb2NrLmNwcAkocmV2aXNpb24gMjIyODA1
KQorKysgU291cmNlL0phdmFTY3JpcHRDb3JlL2J5dGVjb2RlL0NvZGVCbG9jay5jcHAJKHdvcmtp
bmcgY29weSkKQEAgLTIzMjAsNiArMjMyMCw1MyBAQCBib29sIENvZGVCbG9jazo6Y2hlY2tJZk9w
dGltaXphdGlvblRocmVzCiAgICAgcmV0dXJuIG1faml0RXhlY3V0ZUNvdW50ZXIuY2hlY2tJZlRo
cmVzaG9sZENyb3NzZWRBbmRTZXQodGhpcyk7CiB9CiAKK2F1dG8gQ29kZUJsb2NrOjp1cGRhdGVP
U1JFeGl0Q291bnRlckFuZENoZWNrSWZOZWVkVG9SZW9wdGltaXplKERGRzo6T1NSRXhpdFN0YXRl
JiBleGl0U3RhdGUpIC0+IE9wdGltaXplQWN0aW9uCit7CisgICAgREZHOjpPU1JFeGl0QmFzZSYg
ZXhpdCA9IGV4aXRTdGF0ZS5leGl0OworICAgIGlmICghZXhpdEtpbmRNYXlKZXR0aXNvbihleGl0
Lm1fa2luZCkpIHsKKyAgICAgICAgLy8gRklYTUU6IFdlIG1heSB3YW50IHRvIG5vdGljZSB0aGF0
IHdlJ3JlIGZyZXF1ZW50bHkgZXhpdGluZworICAgICAgICAvLyBhdCBhbiBvcF9jYXRjaCB0aGF0
IHdlIGRpZG4ndCBjb21waWxlIGFuIGVudHJ5cG9pbnQgZm9yLCBhbmQKKyAgICAgICAgLy8gdGhl
biB0cmlnZ2VyIGEgcmVvcHRpbWl6YXRpb24gb2YgdGhpcyBDb2RlQmxvY2s6CisgICAgICAgIC8v
IGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0xNzU4NDIKKyAgICAgICAg
cmV0dXJuIE9wdGltaXplQWN0aW9uOjpOb25lOworICAgIH0KKworICAgIGV4aXQubV9jb3VudCsr
OworICAgIG1fb3NyRXhpdENvdW50ZXIrKzsKKworICAgIENvZGVCbG9jayogYmFzZWxpbmVDb2Rl
QmxvY2sgPSBleGl0U3RhdGUuYmFzZWxpbmVDb2RlQmxvY2s7CisgICAgQVNTRVJUKGJhc2VsaW5l
Q29kZUJsb2NrID09IGJhc2VsaW5lQWx0ZXJuYXRpdmUoKSk7CisgICAgaWYgKFVOTElLRUxZKGJh
c2VsaW5lQ29kZUJsb2NrLT5qaXRFeGVjdXRlQ291bnRlcigpLmhhc0Nyb3NzZWRUaHJlc2hvbGQo
KSkpCisgICAgICAgIHJldHVybiBPcHRpbWl6ZUFjdGlvbjo6UmVvcHRpbWl6ZU5vdzsKKworICAg
IC8vIFdlIHdhbnQgdG8gZmlndXJlIG91dCBpZiB0aGVyZSdzIGEgcG9zc2liaWxpdHkgdGhhdCB3
ZSdyZSBpbiBhIGxvb3AuIEZvciB0aGUgb3V0ZXJtb3N0CisgICAgLy8gY29kZSBibG9jayBpbiB0
aGUgaW5saW5lIHN0YWNrLCB3ZSBoYW5kbGUgdGhpcyBhcHByb3ByaWF0ZWx5IGJ5IGhhdmluZyB0
aGUgbG9vcCBPU1IgdHJpZ2dlcgorICAgIC8vIGNoZWNrIHRoZSBleGl0IGNvdW50IG9mIHRoZSBy
ZXBsYWNlbWVudCBvZiB0aGUgQ29kZUJsb2NrIGZyb20gd2hpY2ggd2UgYXJlIE9TUmluZy4gVGhl
CisgICAgLy8gcHJvYmxlbSBpcyB0aGUgaW5saW5lZCBmdW5jdGlvbnMsIHdoaWNoIG1pZ2h0IGFs
c28gaGF2ZSBsb29wcywgYnV0IHdob3NlIGJhc2VsaW5lIHZlcnNpb25zCisgICAgLy8gZG9uJ3Qg
a25vdyB3aGVyZSB0byBsb29rIGZvciB0aGUgZXhpdCBjb3VudC4gRmlndXJlIG91dCBpZiB0aG9z
ZSBsb29wcyBhcmUgc2V2ZXJlIGVub3VnaAorICAgIC8vIHRoYXQgd2UgaGFkIHRyaWVkIHRvIE9T
UiBlbnRlci4gSWYgc28sIHRoZW4gd2Ugc2hvdWxkIHVzZSB0aGUgbG9vcCByZW9wdGltaXphdGlv
biB0cmlnZ2VyLgorICAgIC8vIE90aGVyd2lzZSwgd2Ugc2hvdWxkIHVzZSB0aGUgbm9ybWFsIHJl
b3B0aW1pemF0aW9uIHRyaWdnZXIuCisKKyAgICBib29sIGRpZFRyeVRvRW50ZXJJbkxvb3AgPSBm
YWxzZTsKKyAgICBmb3IgKElubGluZUNhbGxGcmFtZSogaW5saW5lQ2FsbEZyYW1lID0gZXhpdC5t
X2NvZGVPcmlnaW4uaW5saW5lQ2FsbEZyYW1lOyBpbmxpbmVDYWxsRnJhbWU7IGlubGluZUNhbGxG
cmFtZSA9IGlubGluZUNhbGxGcmFtZS0+ZGlyZWN0Q2FsbGVyLmlubGluZUNhbGxGcmFtZSkgewor
ICAgICAgICBpZiAoaW5saW5lQ2FsbEZyYW1lLT5iYXNlbGluZUNvZGVCbG9jay0+b3duZXJTY3Jp
cHRFeGVjdXRhYmxlKCktPmRpZFRyeVRvRW50ZXJJbkxvb3AoKSkgeworICAgICAgICAgICAgZGlk
VHJ5VG9FbnRlckluTG9vcCA9IHRydWU7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQor
ICAgIH0KKworICAgIHVpbnQzMl90IGV4aXRDb3VudFRocmVzaG9sZCA9IGRpZFRyeVRvRW50ZXJJ
bkxvb3AKKyAgICAgICAgPyBleGl0Q291bnRUaHJlc2hvbGRGb3JSZW9wdGltaXphdGlvbkZyb21M
b29wKCkKKyAgICAgICAgOiBleGl0Q291bnRUaHJlc2hvbGRGb3JSZW9wdGltaXphdGlvbigpOwor
CisgICAgaWYgKG1fb3NyRXhpdENvdW50ZXIgPiBleGl0Q291bnRUaHJlc2hvbGQpCisgICAgICAg
IHJldHVybiBPcHRpbWl6ZUFjdGlvbjo6UmVvcHRpbWl6ZU5vdzsKKworICAgIC8vIFRvbyBmZXcg
ZmFpbHMuIEFkanVzdCB0aGUgZXhlY3V0aW9uIGNvdW50ZXIgc3VjaCB0aGF0IHRoZSB0YXJnZXQg
aXMgdG8gb25seSBvcHRpbWl6ZSBhZnRlciBhIHdoaWxlLgorICAgIGJhc2VsaW5lQ29kZUJsb2Nr
LT5tX2ppdEV4ZWN1dGVDb3VudGVyLnNldE5ld1RocmVzaG9sZEZvck9TUkV4aXQoZXhpdFN0YXRl
LmFjdGl2ZVRocmVzaG9sZCwgZXhpdFN0YXRlLm1lbW9yeVVzYWdlQWRqdXN0ZWRUaHJlc2hvbGQp
OworICAgIHJldHVybiBPcHRpbWl6ZUFjdGlvbjo6Tm9uZTsKK30KKwogdm9pZCBDb2RlQmxvY2s6
Om9wdGltaXplTmV4dEludm9jYXRpb24oKQogewogICAgIGlmIChPcHRpb25zOjp2ZXJib3NlT1NS
KCkpCkluZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYnl0ZWNvZGUvQ29kZUJsb2NrLmgKPT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRDb3JlL2J5dGVjb2RlL0NvZGVCbG9jay5oCShy
ZXZpc2lvbiAyMjI4MDUpCisrKyBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYnl0ZWNvZGUvQ29kZUJs
b2NrLmgJKHdvcmtpbmcgY29weSkKQEAgLTc3LDYgKzc3LDEwIEBACiAKIG5hbWVzcGFjZSBKU0Mg
ewogCituYW1lc3BhY2UgREZHIHsKK3N0cnVjdCBPU1JFeGl0U3RhdGU7Cit9IC8vIG5hbWVzcGFj
ZSBERkcKKwogY2xhc3MgQnl0ZWNvZGVMaXZlbmVzc0FuYWx5c2lzOwogY2xhc3MgQ29kZUJsb2Nr
U2V0OwogY2xhc3MgRXhlY1N0YXRlOwpAQCAtNzYyLDcgKzc2Niw4IEBAIHB1YmxpYzoKIAogICAg
IHZvaWQgY291bnRPU1JFeGl0KCkgeyBtX29zckV4aXRDb3VudGVyKys7IH0KIAotICAgIHVpbnQz
Ml90KiBhZGRyZXNzT2ZPU1JFeGl0Q291bnRlcigpIHsgcmV0dXJuICZtX29zckV4aXRDb3VudGVy
OyB9CisgICAgZW51bSBjbGFzcyBPcHRpbWl6ZUFjdGlvbiB7IE5vbmUsIFJlb3B0aW1pemVOb3cg
fTsKKyAgICBPcHRpbWl6ZUFjdGlvbiB1cGRhdGVPU1JFeGl0Q291bnRlckFuZENoZWNrSWZOZWVk
VG9SZW9wdGltaXplKERGRzo6T1NSRXhpdFN0YXRlJik7CiAKICAgICBzdGF0aWMgcHRyZGlmZl90
IG9mZnNldE9mT1NSRXhpdENvdW50ZXIoKSB7IHJldHVybiBPQkpFQ1RfT0ZGU0VUT0YoQ29kZUJs
b2NrLCBtX29zckV4aXRDb3VudGVyKTsgfQogCkluZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUv
Ynl0ZWNvZGUvRXhlY3V0aW9uQ291bnRlci5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2Ny
aXB0Q29yZS9ieXRlY29kZS9FeGVjdXRpb25Db3VudGVyLmgJKHJldmlzaW9uIDIyMjgwNSkKKysr
IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9ieXRlY29kZS9FeGVjdXRpb25Db3VudGVyLmgJKHdvcmtp
bmcgY29weSkKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IChDKSAyMDEyLCAyMDE0
IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoQykgMjAxMi0y
MDE3IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqCiAgKiBSZWRpc3RyaWJ1dGlv
biBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKICAq
IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcg
Y29uZGl0aW9ucwpAQCAtNTAsMTggKzUwLDI2IEBAIGlubGluZSBpbnQzMl90IGZvcm1hdHRlZFRv
dGFsRXhlY3V0aW9uQ28KICAgICB1LmYgPSB2YWx1ZTsKICAgICByZXR1cm4gdS5pOwogfQotICAg
IAorCiB0ZW1wbGF0ZTxDb3VudGluZ1ZhcmlhbnQgY291bnRpbmdWYXJpYW50PgogY2xhc3MgRXhl
Y3V0aW9uQ291bnRlciB7CiBwdWJsaWM6CiAgICAgRXhlY3V0aW9uQ291bnRlcigpOwogICAgIHZv
aWQgZm9yY2VTbG93UGF0aENvbmN1cnJlbnRseSgpOyAvLyBJZiB5b3UgdXNlIHRoaXMsIGNoZWNr
SWZUaHJlc2hvbGRDcm9zc2VkQW5kU2V0KCkgbWF5IHN0aWxsIHJldHVybiBmYWxzZS4KICAgICBi
b29sIGNoZWNrSWZUaHJlc2hvbGRDcm9zc2VkQW5kU2V0KENvZGVCbG9jayopOworICAgIGJvb2wg
aGFzQ3Jvc3NlZFRocmVzaG9sZCgpIGNvbnN0IHsgcmV0dXJuIG1fY291bnRlciA+PSAwOyB9CiAg
ICAgdm9pZCBzZXROZXdUaHJlc2hvbGQoaW50MzJfdCB0aHJlc2hvbGQsIENvZGVCbG9jayopOwog
ICAgIHZvaWQgZGVmZXJJbmRlZmluaXRlbHkoKTsKICAgICBkb3VibGUgY291bnQoKSBjb25zdCB7
IHJldHVybiBzdGF0aWNfY2FzdDxkb3VibGU+KG1fdG90YWxDb3VudCkgKyBtX2NvdW50ZXI7IH0K
ICAgICB2b2lkIGR1bXAoUHJpbnRTdHJlYW0mKSBjb25zdDsKICAgICAKKyAgICB2b2lkIHNldE5l
d1RocmVzaG9sZEZvck9TUkV4aXQodWludDMyX3QgYWN0aXZlVGhyZXNob2xkLCBkb3VibGUgbWVt
b3J5VXNhZ2VBZGp1c3RlZFRocmVzaG9sZCkKKyAgICB7CisgICAgICAgIG1fYWN0aXZlVGhyZXNo
b2xkID0gYWN0aXZlVGhyZXNob2xkOworICAgICAgICBtX2NvdW50ZXIgPSBzdGF0aWNfY2FzdDxp
bnQzMl90PigtbWVtb3J5VXNhZ2VBZGp1c3RlZFRocmVzaG9sZCk7CisgICAgICAgIG1fdG90YWxD
b3VudCA9IG1lbW9yeVVzYWdlQWRqdXN0ZWRUaHJlc2hvbGQ7CisgICAgfQorCiAgICAgc3RhdGlj
IGludDMyX3QgbWF4aW11bUV4ZWN1dGlvbkNvdW50c0JldHdlZW5DaGVja3BvaW50cygpCiAgICAg
ewogICAgICAgICBzd2l0Y2ggKGNvdW50aW5nVmFyaWFudCkgewpJbmRleDogU291cmNlL0phdmFT
Y3JpcHRDb3JlL2J5dGVjb2RlL01ldGhvZE9mR2V0dGluZ0FWYWx1ZVByb2ZpbGUuY3BwCj09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9ieXRlY29kZS9NZXRob2RPZkdldHRpbmdB
VmFsdWVQcm9maWxlLmNwcAkocmV2aXNpb24gMjIyODA1KQorKysgU291cmNlL0phdmFTY3JpcHRD
b3JlL2J5dGVjb2RlL01ldGhvZE9mR2V0dGluZ0FWYWx1ZVByb2ZpbGUuY3BwCSh3b3JraW5nIGNv
cHkpCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMiwgMjAxMywgMjAx
NiBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKEMpIDIwMTIt
MjAxNyBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKgogICogUmVkaXN0cmlidXRp
b24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CiAg
KiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5n
IGNvbmRpdGlvbnMKQEAgLTc0LDYgKzc0LDM0IEBAIHZvaWQgTWV0aG9kT2ZHZXR0aW5nQVZhbHVl
UHJvZmlsZTo6ZW1pdFIKICAgICBSRUxFQVNFX0FTU0VSVF9OT1RfUkVBQ0hFRCgpOwogfQogCit2
b2lkIE1ldGhvZE9mR2V0dGluZ0FWYWx1ZVByb2ZpbGU6OnJlcG9ydFZhbHVlKEpTVmFsdWUgdmFs
dWUpCit7CisgICAgc3dpdGNoIChtX2tpbmQpIHsKKyAgICBjYXNlIE5vbmU6CisgICAgICAgIHJl
dHVybjsKKworICAgIGNhc2UgUmVhZHk6CisgICAgICAgICp1LnByb2ZpbGUtPnNwZWNGYWlsQnVj
a2V0KDApID0gSlNWYWx1ZTo6ZW5jb2RlKHZhbHVlKTsKKyAgICAgICAgcmV0dXJuOworCisgICAg
Y2FzZSBMYXp5T3BlcmFuZDogeworICAgICAgICBMYXp5T3BlcmFuZFZhbHVlUHJvZmlsZUtleSBr
ZXkodS5sYXp5T3BlcmFuZC5ieXRlY29kZU9mZnNldCwgVmlydHVhbFJlZ2lzdGVyKHUubGF6eU9w
ZXJhbmQub3BlcmFuZCkpOworCisgICAgICAgIENvbmN1cnJlbnRKU0xvY2tlciBsb2NrZXIodS5s
YXp5T3BlcmFuZC5jb2RlQmxvY2stPm1fbG9jayk7CisgICAgICAgIExhenlPcGVyYW5kVmFsdWVQ
cm9maWxlKiBwcm9maWxlID0KKyAgICAgICAgICAgIHUubGF6eU9wZXJhbmQuY29kZUJsb2NrLT5s
YXp5T3BlcmFuZFZhbHVlUHJvZmlsZXMoKS5hZGQobG9ja2VyLCBrZXkpOworICAgICAgICAqcHJv
ZmlsZS0+c3BlY0ZhaWxCdWNrZXQoMCkgPSBKU1ZhbHVlOjplbmNvZGUodmFsdWUpOworICAgICAg
ICByZXR1cm47CisgICAgfQorCisgICAgY2FzZSBBcml0aFByb2ZpbGVSZWFkeTogeworICAgICAg
ICB1LmFyaXRoUHJvZmlsZS0+b2JzZXJ2ZVJlc3VsdCh2YWx1ZSk7CisgICAgICAgIHJldHVybjsK
KyAgICB9IH0KKworICAgIFJFTEVBU0VfQVNTRVJUX05PVF9SRUFDSEVEKCk7Cit9CisKIH0gLy8g
bmFtZXNwYWNlIEpTQwogCiAjZW5kaWYgLy8gRU5BQkxFKERGR19KSVQpCkluZGV4OiBTb3VyY2Uv
SmF2YVNjcmlwdENvcmUvYnl0ZWNvZGUvTWV0aG9kT2ZHZXR0aW5nQVZhbHVlUHJvZmlsZS5oCj09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9ieXRlY29kZS9NZXRob2RPZkdldHRp
bmdBVmFsdWVQcm9maWxlLmgJKHJldmlzaW9uIDIyMjgwNSkKKysrIFNvdXJjZS9KYXZhU2NyaXB0
Q29yZS9ieXRlY29kZS9NZXRob2RPZkdldHRpbmdBVmFsdWVQcm9maWxlLmgJKHdvcmtpbmcgY29w
eSkKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IChDKSAyMDEyLCAyMDE2IEFwcGxl
IEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoQykgMjAxMi0yMDE3IEFw
cGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqCiAgKiBSZWRpc3RyaWJ1dGlvbiBhbmQg
dXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKICAqIG1vZGlm
aWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0
aW9ucwpAQCAtNzAsOSArNzAsMTAgQEAgcHVibGljOgogICAgICAgICBDb2RlQmxvY2sqLCBjb25z
dCBMYXp5T3BlcmFuZFZhbHVlUHJvZmlsZUtleSYpOwogICAgIAogICAgIGV4cGxpY2l0IG9wZXJh
dG9yIGJvb2woKSBjb25zdCB7IHJldHVybiBtX2tpbmQgIT0gTm9uZTsgfQotICAgIAorCiAgICAg
dm9pZCBlbWl0UmVwb3J0VmFsdWUoQ0NhbGxIZWxwZXJzJiwgSlNWYWx1ZVJlZ3MpIGNvbnN0Owot
ICAgIAorICAgIHZvaWQgcmVwb3J0VmFsdWUoSlNWYWx1ZSk7CisKIHByaXZhdGU6CiAgICAgZW51
bSBLaW5kIHsKICAgICAgICAgTm9uZSwKSW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9kZmcv
REZHRHJpdmVyLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvZGZnL0RG
R0RyaXZlci5jcHAJKHJldmlzaW9uIDIyMjgwNSkKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9k
ZmcvREZHRHJpdmVyLmNwcAkod29ya2luZyBjb3B5KQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBD
b3B5cmlnaHQgKEMpIDIwMTEtMjAxNCwgMjAxNiBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2
ZWQuCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEtMjAxNyBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVz
ZXJ2ZWQuCiAgKgogICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFy
eSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CiAgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQg
cHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKQEAgLTg5LDYgKzg5LDcgQEAg
c3RhdGljIENvbXBpbGF0aW9uUmVzdWx0IGNvbXBpbGVJbXBsKAogICAgIAogICAgIC8vIE1ha2Ug
c3VyZSB0aGF0IGFueSBzdHVicyB0aGF0IHRoZSBERkcgaXMgZ29pbmcgdG8gdXNlIGFyZSBpbml0
aWFsaXplZC4gV2Ugd2FudCB0bwogICAgIC8vIG1ha2Ugc3VyZSB0aGF0IGFsbCBKSVQgY29kZSBn
ZW5lcmF0aW9uIGRvZXMgZmluYWxpemF0aW9uIG9uIHRoZSBtYWluIHRocmVhZC4KKyAgICB2bS5n
ZXRDVElTdHViKG9zckV4aXRUaHVua0dlbmVyYXRvcik7CiAgICAgdm0uZ2V0Q1RJU3R1Yihvc3JF
eGl0R2VuZXJhdGlvblRodW5rR2VuZXJhdG9yKTsKICAgICB2bS5nZXRDVElTdHViKHRocm93RXhj
ZXB0aW9uRnJvbUNhbGxTbG93UGF0aEdlbmVyYXRvcik7CiAgICAgdm0uZ2V0Q1RJU3R1YihsaW5r
Q2FsbFRodW5rR2VuZXJhdG9yKTsKSW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9kZmcvREZH
SklUQ29tcGlsZXIuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9kZmcv
REZHSklUQ29tcGlsZXIuY3BwCShyZXZpc2lvbiAyMjI4MDUpCisrKyBTb3VyY2UvSmF2YVNjcmlw
dENvcmUvZGZnL0RGR0pJVENvbXBpbGVyLmNwcAkod29ya2luZyBjb3B5KQpAQCAtODUsOCArODUs
OSBAQCB2b2lkIEpJVENvbXBpbGVyOjpsaW5rT1NSRXhpdHMoKQogICAgICAgICB9CiAgICAgfQog
ICAgIAorICAgIE1hY3JvQXNzZW1ibGVyQ29kZVJlZiBvc3JFeGl0VGh1bmsgPSB2bSgpLT5nZXRD
VElTdHViKG9zckV4aXRUaHVua0dlbmVyYXRvcik7CisgICAgQ29kZUxvY2F0aW9uTGFiZWwgb3Ny
RXhpdFRodW5rTGFiZWwgPSBDb2RlTG9jYXRpb25MYWJlbChvc3JFeGl0VGh1bmsuY29kZSgpKTsK
ICAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgbV9qaXRDb2RlLT5vc3JFeGl0LnNpemUoKTsg
KytpKSB7Ci0gICAgICAgIE9TUkV4aXQmIGV4aXQgPSBtX2ppdENvZGUtPm9zckV4aXRbaV07CiAg
ICAgICAgIE9TUkV4aXRDb21waWxhdGlvbkluZm8mIGluZm8gPSBtX2V4aXRDb21waWxhdGlvbklu
Zm9baV07CiAgICAgICAgIEp1bXBMaXN0JiBmYWlsdXJlSnVtcHMgPSBpbmZvLm1fZmFpbHVyZUp1
bXBzOwogICAgICAgICBpZiAoIWZhaWx1cmVKdW1wcy5lbXB0eSgpKQpAQCAtOTYsNyArOTcsMTUg
QEAgdm9pZCBKSVRDb21waWxlcjo6bGlua09TUkV4aXRzKCkKIAogICAgICAgICBqaXRBc3NlcnRI
YXNWYWxpZENhbGxGcmFtZSgpOwogICAgICAgICBzdG9yZTMyKFRydXN0ZWRJbW0zMihpKSwgJnZt
KCktPm9zckV4aXRJbmRleCk7Ci0gICAgICAgIGV4aXQuc2V0UGF0Y2hhYmxlQ29kZU9mZnNldChw
YXRjaGFibGVKdW1wKCkpOworICAgICAgICBpZiAoT3B0aW9uczo6dXNlUHJvYmVPU1JFeGl0KCkp
IHsKKyAgICAgICAgICAgIEp1bXAgdGFyZ2V0ID0ganVtcCgpOworICAgICAgICAgICAgYWRkTGlu
a1Rhc2soW3RhcmdldCwgb3NyRXhpdFRodW5rTGFiZWxdIChMaW5rQnVmZmVyJiBsaW5rQnVmZmVy
KSB7CisgICAgICAgICAgICAgICAgbGlua0J1ZmZlci5saW5rKHRhcmdldCwgb3NyRXhpdFRodW5r
TGFiZWwpOworICAgICAgICAgICAgfSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBP
U1JFeGl0JiBleGl0ID0gbV9qaXRDb2RlLT5vc3JFeGl0W2ldOworICAgICAgICAgICAgZXhpdC5z
ZXRQYXRjaGFibGVDb2RlT2Zmc2V0KHBhdGNoYWJsZUp1bXAoKSk7CisgICAgICAgIH0KICAgICB9
CiB9CiAKQEAgLTMwNiwxMCArMzE1LDEyIEBAIHZvaWQgSklUQ29tcGlsZXI6OmxpbmsoTGlua0J1
ZmZlciYgbGlua0IKICAgICBNYWNyb0Fzc2VtYmxlckNvZGVSZWYgb3NyRXhpdFRodW5rID0gdm0o
KS0+Z2V0Q1RJU3R1Yihvc3JFeGl0R2VuZXJhdGlvblRodW5rR2VuZXJhdG9yKTsKICAgICBDb2Rl
TG9jYXRpb25MYWJlbCB0YXJnZXQgPSBDb2RlTG9jYXRpb25MYWJlbChvc3JFeGl0VGh1bmsuY29k
ZSgpKTsKICAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgbV9qaXRDb2RlLT5vc3JFeGl0LnNp
emUoKTsgKytpKSB7Ci0gICAgICAgIE9TUkV4aXQmIGV4aXQgPSBtX2ppdENvZGUtPm9zckV4aXRb
aV07CiAgICAgICAgIE9TUkV4aXRDb21waWxhdGlvbkluZm8mIGluZm8gPSBtX2V4aXRDb21waWxh
dGlvbkluZm9baV07Ci0gICAgICAgIGxpbmtCdWZmZXIubGluayhleGl0LmdldFBhdGNoYWJsZUNv
ZGVPZmZzZXRBc0p1bXAoKSwgdGFyZ2V0KTsKLSAgICAgICAgZXhpdC5jb3JyZWN0SnVtcChsaW5r
QnVmZmVyKTsKKyAgICAgICAgaWYgKCFPcHRpb25zOjp1c2VQcm9iZU9TUkV4aXQoKSkgeworICAg
ICAgICAgICAgT1NSRXhpdCYgZXhpdCA9IG1faml0Q29kZS0+b3NyRXhpdFtpXTsKKyAgICAgICAg
ICAgIGxpbmtCdWZmZXIubGluayhleGl0LmdldFBhdGNoYWJsZUNvZGVPZmZzZXRBc0p1bXAoKSwg
dGFyZ2V0KTsKKyAgICAgICAgICAgIGV4aXQuY29ycmVjdEp1bXAobGlua0J1ZmZlcik7CisgICAg
ICAgIH0KICAgICAgICAgaWYgKGluZm8ubV9yZXBsYWNlbWVudFNvdXJjZS5pc1NldCgpKSB7CiAg
ICAgICAgICAgICBtX2ppdENvZGUtPmNvbW1vbi5qdW1wUmVwbGFjZW1lbnRzLmFwcGVuZChKdW1w
UmVwbGFjZW1lbnQoCiAgICAgICAgICAgICAgICAgbGlua0J1ZmZlci5sb2NhdGlvbk9mKGluZm8u
bV9yZXBsYWNlbWVudFNvdXJjZSksCkluZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUvZGZnL0RG
R09TUkV4aXQuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9kZmcvREZH
T1NSRXhpdC5jcHAJKHJldmlzaW9uIDIyMjgwNSkKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9k
ZmcvREZHT1NSRXhpdC5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTI5LDE4ICsyOSw4ODAgQEAKICNp
ZiBFTkFCTEUoREZHX0pJVCkKIAogI2luY2x1ZGUgIkFzc2VtYmx5SGVscGVycy5oIgorI2luY2x1
ZGUgIkNsb25lZEFyZ3VtZW50cy5oIgogI2luY2x1ZGUgIkRGR0dyYXBoLmgiCiAjaW5jbHVkZSAi
REZHTWF5RXhpdC5oIgogI2luY2x1ZGUgIkRGR09TUkV4aXRDb21waWxlckNvbW1vbi5oIgogI2lu
Y2x1ZGUgIkRGR09TUkV4aXRQcmVwYXJhdGlvbi5oIgogI2luY2x1ZGUgIkRGR09wZXJhdGlvbnMu
aCIKICNpbmNsdWRlICJERkdTcGVjdWxhdGl2ZUpJVC5oIgorI2luY2x1ZGUgIkRpcmVjdEFyZ3Vt
ZW50cy5oIgogI2luY2x1ZGUgIkZyYW1lVHJhY2Vycy5oIgorI2luY2x1ZGUgIklubGluZUNhbGxG
cmFtZS5oIgogI2luY2x1ZGUgIkpTQ0lubGluZXMuaCIKKyNpbmNsdWRlICJKU0NKU1ZhbHVlLmgi
CiAjaW5jbHVkZSAiT3BlcmFuZHNJbmxpbmVzLmgiCisjaW5jbHVkZSAiUHJvYmVDb250ZXh0Lmgi
CisjaW5jbHVkZSAiUHJvYmVGcmFtZS5oIgogCiBuYW1lc3BhY2UgSlNDIHsgbmFtZXNwYWNlIERG
RyB7CiAKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLyBQcm9iZSBiYXNlZCBP
U1IgRXhpdC4KKwordXNpbmcgQ1BVU3RhdGUgPSBQcm9iZTo6Q1BVU3RhdGU7Cit1c2luZyBDb250
ZXh0ID0gUHJvYmU6OkNvbnRleHQ7Cit1c2luZyBGcmFtZSA9IFByb2JlOjpGcmFtZTsKKworc3Rh
dGljIHZvaWQgcmVpZnlJbmxpbmVkQ2FsbEZyYW1lcyhQcm9iZTo6Q29udGV4dCYsIENvZGVCbG9j
ayogYmFzZWxpbmVDb2RlQmxvY2ssIGNvbnN0IE9TUkV4aXRCYXNlJik7CitzdGF0aWMgdm9pZCBh
ZGp1c3RBbmRKdW1wVG9UYXJnZXQoUHJvYmU6OkNvbnRleHQmLCBWTSYsIENvZGVCbG9jayosIENv
ZGVCbG9jayogYmFzZWxpbmVDb2RlQmxvY2ssIE9TUkV4aXQmKTsKK3N0YXRpYyB2b2lkIHByaW50
T1NSRXhpdChDb250ZXh0JiwgdWludDMyX3Qgb3NyRXhpdEluZGV4LCBjb25zdCBPU1JFeGl0Jik7
CisKK3N0YXRpYyBKU1ZhbHVlIGpzVmFsdWVGb3IoQ1BVU3RhdGUmIGNwdSwgSlNWYWx1ZVNvdXJj
ZSBzb3VyY2UpCit7CisgICAgaWYgKHNvdXJjZS5pc0FkZHJlc3MoKSkgeworICAgICAgICBKU1Zh
bHVlIHJlc3VsdDsKKyAgICAgICAgc3RkOjptZW1jcHkoJnJlc3VsdCwgY3B1Lmdwcjx1aW50OF90
Kj4oc291cmNlLmJhc2UoKSkgKyBzb3VyY2Uub2Zmc2V0KCksIHNpemVvZihKU1ZhbHVlKSk7Cisg
ICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorI2lmIFVTRShKU1ZBTFVFNjQpCisgICAgcmV0
dXJuIEpTVmFsdWU6OmRlY29kZShjcHUuZ3ByPEVuY29kZWRKU1ZhbHVlPihzb3VyY2UuZ3ByKCkp
KTsKKyNlbHNlCisgICAgaWYgKHNvdXJjZS5oYXNLbm93blRhZygpKQorICAgICAgICByZXR1cm4g
SlNWYWx1ZShzb3VyY2UudGFnKCksIGNwdS5ncHI8aW50MzJfdD4oc291cmNlLnBheWxvYWRHUFIo
KSkpOworICAgIHJldHVybiBKU1ZhbHVlKGNwdS5ncHI8aW50MzJfdD4oc291cmNlLnRhZ0dQUigp
KSwgY3B1LmdwcjxpbnQzMl90Pihzb3VyY2UucGF5bG9hZEdQUigpKSk7CisjZW5kaWYKK30KKwor
I2lmIE5VTUJFUl9PRl9DQUxMRUVfU0FWRVNfUkVHSVNURVJTID4gMAorCitzdGF0aWNfYXNzZXJ0
KGlzNjRCaXQoKSwgIndlIG9ubHkgc3VwcG9ydCBjYWxsZWUgc2F2ZSByZWdpc3RlcnMgb24gNjQt
Yml0Iik7CisKKy8vIEJhc2VkIG9uIEFzc2VtYmx5SGVscGVyczo6ZW1pdFJlc3RvcmVDYWxsZWVT
YXZlc0ZvcigpLgorc3RhdGljIHZvaWQgcmVzdG9yZUNhbGxlZVNhdmVzRm9yKENvbnRleHQmIGNv
bnRleHQsIENvZGVCbG9jayogY29kZUJsb2NrKQoreworICAgIEFTU0VSVChjb2RlQmxvY2spOwor
CisgICAgUmVnaXN0ZXJBdE9mZnNldExpc3QqIGNhbGxlZVNhdmVzID0gY29kZUJsb2NrLT5jYWxs
ZWVTYXZlUmVnaXN0ZXJzKCk7CisgICAgUmVnaXN0ZXJTZXQgZG9udFJlc3RvcmVSZWdpc3RlcnMg
PSBSZWdpc3RlclNldChSZWdpc3RlclNldDo6c3RhY2tSZWdpc3RlcnMoKSwgUmVnaXN0ZXJTZXQ6
OmFsbEZQUnMoKSk7CisgICAgdW5zaWduZWQgcmVnaXN0ZXJDb3VudCA9IGNhbGxlZVNhdmVzLT5z
aXplKCk7CisKKyAgICB1aW50cHRyX3QqIHBoeXNpY2FsU3RhY2tGcmFtZSA9IGNvbnRleHQuZnA8
dWludHB0cl90Kj4oKTsKKyAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgcmVnaXN0ZXJDb3Vu
dDsgaSsrKSB7CisgICAgICAgIFJlZ2lzdGVyQXRPZmZzZXQgZW50cnkgPSBjYWxsZWVTYXZlcy0+
YXQoaSk7CisgICAgICAgIGlmIChkb250UmVzdG9yZVJlZ2lzdGVycy5nZXQoZW50cnkucmVnKCkp
KQorICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIC8vIFRoZSBjYWxsZWUgc2F2ZWQgdmFs
dWVzIGNvbWUgZnJvbSB0aGUgb3JpZ2luYWwgc3RhY2ssIG5vdCB0aGUgcmVjb3ZlcmVkIHN0YWNr
LgorICAgICAgICAvLyBIZW5jZSwgd2UgcmVhZCB0aGUgdmFsdWVzIGRpcmVjdGx5IGZyb20gdGhl
IHBoeXNpY2FsIHN0YWNrIG1lbW9yeSBpbnN0ZWFkIG9mCisgICAgICAgIC8vIGdvaW5nIHRocm91
Z2ggY29udGV4dC5zdGFjaygpLgorICAgICAgICBBU1NFUlQoIShlbnRyeS5vZmZzZXQoKSAlIHNp
emVvZih1aW50cHRyX3QpKSk7CisgICAgICAgIGNvbnRleHQuZ3ByKGVudHJ5LnJlZygpLmdwcigp
KSA9IHBoeXNpY2FsU3RhY2tGcmFtZVtlbnRyeS5vZmZzZXQoKSAvIHNpemVvZih1aW50cHRyX3Qp
XTsKKyAgICB9Cit9CisKKy8vIEJhc2VkIG9uIEFzc2VtYmx5SGVscGVyczo6ZW1pdFNhdmVDYWxs
ZWVTYXZlc0ZvcigpLgorc3RhdGljIHZvaWQgc2F2ZUNhbGxlZVNhdmVzRm9yKENvbnRleHQmIGNv
bnRleHQsIENvZGVCbG9jayogY29kZUJsb2NrKQoreworICAgIGF1dG8mIHN0YWNrID0gY29udGV4
dC5zdGFjaygpOworICAgIEFTU0VSVChjb2RlQmxvY2spOworCisgICAgUmVnaXN0ZXJBdE9mZnNl
dExpc3QqIGNhbGxlZVNhdmVzID0gY29kZUJsb2NrLT5jYWxsZWVTYXZlUmVnaXN0ZXJzKCk7Cisg
ICAgUmVnaXN0ZXJTZXQgZG9udFNhdmVSZWdpc3RlcnMgPSBSZWdpc3RlclNldChSZWdpc3RlclNl
dDo6c3RhY2tSZWdpc3RlcnMoKSwgUmVnaXN0ZXJTZXQ6OmFsbEZQUnMoKSk7CisgICAgdW5zaWdu
ZWQgcmVnaXN0ZXJDb3VudCA9IGNhbGxlZVNhdmVzLT5zaXplKCk7CisKKyAgICBmb3IgKHVuc2ln
bmVkIGkgPSAwOyBpIDwgcmVnaXN0ZXJDb3VudDsgaSsrKSB7CisgICAgICAgIFJlZ2lzdGVyQXRP
ZmZzZXQgZW50cnkgPSBjYWxsZWVTYXZlcy0+YXQoaSk7CisgICAgICAgIGlmIChkb250U2F2ZVJl
Z2lzdGVycy5nZXQoZW50cnkucmVnKCkpKQorICAgICAgICAgICAgY29udGludWU7CisgICAgICAg
IHN0YWNrLnNldChjb250ZXh0LmZwKCksIGVudHJ5Lm9mZnNldCgpLCBjb250ZXh0Lmdwcjx1aW50
cHRyX3Q+KGVudHJ5LnJlZygpLmdwcigpKSk7CisgICAgfQorfQorCisvLyBCYXNlZCBvbiBBc3Nl
bWJseUhlbHBlcnM6OnJlc3RvcmVDYWxsZWVTYXZlc0Zyb21WTUVudHJ5RnJhbWVDYWxsZWVTYXZl
c0J1ZmZlcigpLgorc3RhdGljIHZvaWQgcmVzdG9yZUNhbGxlZVNhdmVzRnJvbVZNRW50cnlGcmFt
ZUNhbGxlZVNhdmVzQnVmZmVyKENvbnRleHQmIGNvbnRleHQpCit7CisgICAgVk0mIHZtID0gKmNv
bnRleHQuYXJnPFZNKj4oKTsKKworICAgIFJlZ2lzdGVyQXRPZmZzZXRMaXN0KiBhbGxDYWxsZWVT
YXZlcyA9IFZNOjpnZXRBbGxDYWxsZWVTYXZlUmVnaXN0ZXJPZmZzZXRzKCk7CisgICAgUmVnaXN0
ZXJTZXQgZG9udFJlc3RvcmVSZWdpc3RlcnMgPSBSZWdpc3RlclNldDo6c3RhY2tSZWdpc3RlcnMo
KTsKKyAgICB1bnNpZ25lZCByZWdpc3RlckNvdW50ID0gYWxsQ2FsbGVlU2F2ZXMtPnNpemUoKTsK
KworICAgIFZNRW50cnlSZWNvcmQqIGVudHJ5UmVjb3JkID0gdm1FbnRyeVJlY29yZCh2bS50b3BF
bnRyeUZyYW1lKTsKKyAgICB1aW50cHRyX3QqIGNhbGxlZVNhdmVCdWZmZXIgPSByZWludGVycHJl
dF9jYXN0PHVpbnRwdHJfdCo+KGVudHJ5UmVjb3JkLT5jYWxsZWVTYXZlUmVnaXN0ZXJzQnVmZmVy
KTsKKworICAgIC8vIFJlc3RvcmUgYWxsIGNhbGxlZSBzYXZlcy4KKyAgICBmb3IgKHVuc2lnbmVk
IGkgPSAwOyBpIDwgcmVnaXN0ZXJDb3VudDsgaSsrKSB7CisgICAgICAgIFJlZ2lzdGVyQXRPZmZz
ZXQgZW50cnkgPSBhbGxDYWxsZWVTYXZlcy0+YXQoaSk7CisgICAgICAgIGlmIChkb250UmVzdG9y
ZVJlZ2lzdGVycy5nZXQoZW50cnkucmVnKCkpKQorICAgICAgICAgICAgY29udGludWU7CisgICAg
ICAgIHNpemVfdCB1aW50cHRyT2Zmc2V0ID0gZW50cnkub2Zmc2V0KCkgLyBzaXplb2YodWludHB0
cl90KTsKKyAgICAgICAgaWYgKGVudHJ5LnJlZygpLmlzR1BSKCkpCisgICAgICAgICAgICBjb250
ZXh0LmdwcihlbnRyeS5yZWcoKS5ncHIoKSkgPSBjYWxsZWVTYXZlQnVmZmVyW3VpbnRwdHJPZmZz
ZXRdOworICAgICAgICBlbHNlCisgICAgICAgICAgICBjb250ZXh0LmZwcihlbnRyeS5yZWcoKS5m
cHIoKSkgPSBiaXR3aXNlX2Nhc3Q8ZG91YmxlPihjYWxsZWVTYXZlQnVmZmVyW3VpbnRwdHJPZmZz
ZXRdKTsKKyAgICB9Cit9CisKKy8vIEJhc2VkIG9uIEFzc2VtYmx5SGVscGVyczo6Y29weUNhbGxl
ZVNhdmVzVG9WTUVudHJ5RnJhbWVDYWxsZWVTYXZlc0J1ZmZlcigpLgorc3RhdGljIHZvaWQgY29w
eUNhbGxlZVNhdmVzVG9WTUVudHJ5RnJhbWVDYWxsZWVTYXZlc0J1ZmZlcihDb250ZXh0JiBjb250
ZXh0KQoreworICAgIFZNJiB2bSA9ICpjb250ZXh0LmFyZzxWTSo+KCk7CisgICAgYXV0byYgc3Rh
Y2sgPSBjb250ZXh0LnN0YWNrKCk7CisKKyAgICBWTUVudHJ5UmVjb3JkKiBlbnRyeVJlY29yZCA9
IHZtRW50cnlSZWNvcmQodm0udG9wRW50cnlGcmFtZSk7CisgICAgdm9pZCogY2FsbGVlU2F2ZUJ1
ZmZlciA9IGVudHJ5UmVjb3JkLT5jYWxsZWVTYXZlUmVnaXN0ZXJzQnVmZmVyOworCisgICAgUmVn
aXN0ZXJBdE9mZnNldExpc3QqIGFsbENhbGxlZVNhdmVzID0gVk06OmdldEFsbENhbGxlZVNhdmVS
ZWdpc3Rlck9mZnNldHMoKTsKKyAgICBSZWdpc3RlclNldCBkb250Q29weVJlZ2lzdGVycyA9IFJl
Z2lzdGVyU2V0OjpzdGFja1JlZ2lzdGVycygpOworICAgIHVuc2lnbmVkIHJlZ2lzdGVyQ291bnQg
PSBhbGxDYWxsZWVTYXZlcy0+c2l6ZSgpOworCisgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8
IHJlZ2lzdGVyQ291bnQ7IGkrKykgeworICAgICAgICBSZWdpc3RlckF0T2Zmc2V0IGVudHJ5ID0g
YWxsQ2FsbGVlU2F2ZXMtPmF0KGkpOworICAgICAgICBpZiAoZG9udENvcHlSZWdpc3RlcnMuZ2V0
KGVudHJ5LnJlZygpKSkKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICBpZiAoZW50cnku
cmVnKCkuaXNHUFIoKSkKKyAgICAgICAgICAgIHN0YWNrLnNldChjYWxsZWVTYXZlQnVmZmVyLCBl
bnRyeS5vZmZzZXQoKSwgY29udGV4dC5ncHI8dWludHB0cl90PihlbnRyeS5yZWcoKS5ncHIoKSkp
OworICAgICAgICBlbHNlCisgICAgICAgICAgICBzdGFjay5zZXQoY2FsbGVlU2F2ZUJ1ZmZlciwg
ZW50cnkub2Zmc2V0KCksIGNvbnRleHQuZnByPHVpbnRwdHJfdD4oZW50cnkucmVnKCkuZnByKCkp
KTsKKyAgICB9Cit9CisKKy8vIEJhc2VkIG9uIEFzc2VtYmx5SGVscGVyczo6ZW1pdFNhdmVPckNv
cHlDYWxsZWVTYXZlc0ZvcigpLgorc3RhdGljIHZvaWQgc2F2ZU9yQ29weUNhbGxlZVNhdmVzRm9y
KENvbnRleHQmIGNvbnRleHQsIENvZGVCbG9jayogY29kZUJsb2NrLCBWaXJ0dWFsUmVnaXN0ZXIg
b2Zmc2V0VmlydHVhbFJlZ2lzdGVyLCBib29sIHdhc0NhbGxlZFZpYVRhaWxDYWxsKQoreworICAg
IEZyYW1lIGZyYW1lKGNvbnRleHQuZnAoKSwgY29udGV4dC5zdGFjaygpKTsKKyAgICBBU1NFUlQo
Y29kZUJsb2NrKTsKKworICAgIFJlZ2lzdGVyQXRPZmZzZXRMaXN0KiBjYWxsZWVTYXZlcyA9IGNv
ZGVCbG9jay0+Y2FsbGVlU2F2ZVJlZ2lzdGVycygpOworICAgIFJlZ2lzdGVyU2V0IGRvbnRTYXZl
UmVnaXN0ZXJzID0gUmVnaXN0ZXJTZXQoUmVnaXN0ZXJTZXQ6OnN0YWNrUmVnaXN0ZXJzKCksIFJl
Z2lzdGVyU2V0OjphbGxGUFJzKCkpOworICAgIHVuc2lnbmVkIHJlZ2lzdGVyQ291bnQgPSBjYWxs
ZWVTYXZlcy0+c2l6ZSgpOworCisgICAgUmVnaXN0ZXJTZXQgYmFzZWxpbmVDYWxsZWVTYXZlcyA9
IFJlZ2lzdGVyU2V0OjpsbGludEJhc2VsaW5lQ2FsbGVlU2F2ZVJlZ2lzdGVycygpOworCisgICAg
Zm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IHJlZ2lzdGVyQ291bnQ7IGkrKykgeworICAgICAgICBS
ZWdpc3RlckF0T2Zmc2V0IGVudHJ5ID0gY2FsbGVlU2F2ZXMtPmF0KGkpOworICAgICAgICBpZiAo
ZG9udFNhdmVSZWdpc3RlcnMuZ2V0KGVudHJ5LnJlZygpKSkKKyAgICAgICAgICAgIGNvbnRpbnVl
OworCisgICAgICAgIHVpbnRwdHJfdCBzYXZlZFJlZ2lzdGVyVmFsdWU7CisKKyAgICAgICAgaWYg
KHdhc0NhbGxlZFZpYVRhaWxDYWxsICYmIGJhc2VsaW5lQ2FsbGVlU2F2ZXMuZ2V0KGVudHJ5LnJl
ZygpKSkKKyAgICAgICAgICAgIHNhdmVkUmVnaXN0ZXJWYWx1ZSA9IGZyYW1lLmdldDx1aW50cHRy
X3Q+KGVudHJ5Lm9mZnNldCgpKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgc2F2ZWRSZWdp
c3RlclZhbHVlID0gY29udGV4dC5ncHIoZW50cnkucmVnKCkuZ3ByKCkpOworCisgICAgICAgIGZy
YW1lLnNldChvZmZzZXRWaXJ0dWFsUmVnaXN0ZXIub2Zmc2V0SW5CeXRlcygpICsgZW50cnkub2Zm
c2V0KCksIHNhdmVkUmVnaXN0ZXJWYWx1ZSk7CisgICAgfQorfQorI2Vsc2UgLy8gbm90IE5VTUJF
Ul9PRl9DQUxMRUVfU0FWRVNfUkVHSVNURVJTID4gMAorCitzdGF0aWMgdm9pZCByZXN0b3JlQ2Fs
bGVlU2F2ZXNGb3IoQ29udGV4dCYsIENvZGVCbG9jayopIHsgfQorc3RhdGljIHZvaWQgc2F2ZUNh
bGxlZVNhdmVzRm9yKENvbnRleHQmLCBDb2RlQmxvY2sqKSB7IH0KK3N0YXRpYyB2b2lkIHJlc3Rv
cmVDYWxsZWVTYXZlc0Zyb21WTUVudHJ5RnJhbWVDYWxsZWVTYXZlc0J1ZmZlcihDb250ZXh0Jikg
eyB9CitzdGF0aWMgdm9pZCBjb3B5Q2FsbGVlU2F2ZXNUb1ZNRW50cnlGcmFtZUNhbGxlZVNhdmVz
QnVmZmVyKENvbnRleHQmKSB7IH0KK3N0YXRpYyB2b2lkIHNhdmVPckNvcHlDYWxsZWVTYXZlc0Zv
cihDb250ZXh0JiwgQ29kZUJsb2NrKiwgVmlydHVhbFJlZ2lzdGVyLCBib29sKSB7IH0KKworI2Vu
ZGlmIC8vIE5VTUJFUl9PRl9DQUxMRUVfU0FWRVNfUkVHSVNURVJTID4gMAorCitzdGF0aWMgSlND
ZWxsKiBjcmVhdGVEaXJlY3RBcmd1bWVudHNEdXJpbmdFeGl0KENvbnRleHQmIGNvbnRleHQsIENv
ZGVCbG9jayogY29kZUJsb2NrLCBJbmxpbmVDYWxsRnJhbWUqIGlubGluZUNhbGxGcmFtZSwgSlNG
dW5jdGlvbiogY2FsbGVlLCBpbnQzMl90IGFyZ3VtZW50Q291bnQpCit7CisgICAgVk0mIHZtID0g
KmNvbnRleHQuYXJnPFZNKj4oKTsKKworICAgIEFTU0VSVCh2bS5oZWFwLmlzRGVmZXJyZWQoKSk7
CisKKyAgICBpZiAoaW5saW5lQ2FsbEZyYW1lKQorICAgICAgICBjb2RlQmxvY2sgPSBiYXNlbGlu
ZUNvZGVCbG9ja0ZvcklubGluZUNhbGxGcmFtZShpbmxpbmVDYWxsRnJhbWUpOworCisgICAgdW5z
aWduZWQgbGVuZ3RoID0gYXJndW1lbnRDb3VudCAtIDE7CisgICAgdW5zaWduZWQgY2FwYWNpdHkg
PSBzdGQ6Om1heChsZW5ndGgsIHN0YXRpY19jYXN0PHVuc2lnbmVkPihjb2RlQmxvY2stPm51bVBh
cmFtZXRlcnMoKSAtIDEpKTsKKyAgICBEaXJlY3RBcmd1bWVudHMqIHJlc3VsdCA9IERpcmVjdEFy
Z3VtZW50czo6Y3JlYXRlKAorICAgICAgICB2bSwgY29kZUJsb2NrLT5nbG9iYWxPYmplY3QoKS0+
ZGlyZWN0QXJndW1lbnRzU3RydWN0dXJlKCksIGxlbmd0aCwgY2FwYWNpdHkpOworCisgICAgcmVz
dWx0LT5jYWxsZWUoKS5zZXQodm0sIHJlc3VsdCwgY2FsbGVlKTsKKworICAgIHZvaWQqIGZyYW1l
QmFzZSA9IGNvbnRleHQuZnA8UmVnaXN0ZXIqPigpICsgKGlubGluZUNhbGxGcmFtZSA/IGlubGlu
ZUNhbGxGcmFtZS0+c3RhY2tPZmZzZXQgOiAwKTsKKyAgICBGcmFtZSBmcmFtZShmcmFtZUJhc2Us
IGNvbnRleHQuc3RhY2soKSk7CisgICAgZm9yICh1bnNpZ25lZCBpID0gbGVuZ3RoOyBpLS07KQor
ICAgICAgICByZXN1bHQtPnNldEluZGV4UXVpY2tseSh2bSwgaSwgZnJhbWUuYXJndW1lbnQoaSkp
OworCisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworc3RhdGljIEpTQ2VsbCogY3JlYXRlQ2xvbmVk
QXJndW1lbnRzRHVyaW5nRXhpdChDb250ZXh0JiBjb250ZXh0LCBDb2RlQmxvY2sqIGNvZGVCbG9j
aywgSW5saW5lQ2FsbEZyYW1lKiBpbmxpbmVDYWxsRnJhbWUsIEpTRnVuY3Rpb24qIGNhbGxlZSwg
aW50MzJfdCBhcmd1bWVudENvdW50KQoreworICAgIFZNJiB2bSA9ICpjb250ZXh0LmFyZzxWTSo+
KCk7CisgICAgRXhlY1N0YXRlKiBleGVjID0gY29udGV4dC5mcDxFeGVjU3RhdGUqPigpOworCisg
ICAgQVNTRVJUKHZtLmhlYXAuaXNEZWZlcnJlZCgpKTsKKworICAgIGlmIChpbmxpbmVDYWxsRnJh
bWUpCisgICAgICAgIGNvZGVCbG9jayA9IGJhc2VsaW5lQ29kZUJsb2NrRm9ySW5saW5lQ2FsbEZy
YW1lKGlubGluZUNhbGxGcmFtZSk7CisKKyAgICB1bnNpZ25lZCBsZW5ndGggPSBhcmd1bWVudENv
dW50IC0gMTsKKyAgICBDbG9uZWRBcmd1bWVudHMqIHJlc3VsdCA9IENsb25lZEFyZ3VtZW50czo6
Y3JlYXRlRW1wdHkoCisgICAgICAgIHZtLCBjb2RlQmxvY2stPmdsb2JhbE9iamVjdCgpLT5jbG9u
ZWRBcmd1bWVudHNTdHJ1Y3R1cmUoKSwgY2FsbGVlLCBsZW5ndGgpOworCisgICAgdm9pZCogZnJh
bWVCYXNlID0gY29udGV4dC5mcDxSZWdpc3Rlcio+KCkgKyAoaW5saW5lQ2FsbEZyYW1lID8gaW5s
aW5lQ2FsbEZyYW1lLT5zdGFja09mZnNldCA6IDApOworICAgIEZyYW1lIGZyYW1lKGZyYW1lQmFz
ZSwgY29udGV4dC5zdGFjaygpKTsKKyAgICBmb3IgKHVuc2lnbmVkIGkgPSBsZW5ndGg7IGktLTsp
CisgICAgICAgIHJlc3VsdC0+cHV0RGlyZWN0SW5kZXgoZXhlYywgaSwgZnJhbWUuYXJndW1lbnQo
aSkpOworICAgIHJldHVybiByZXN1bHQ7Cit9CisKK3N0YXRpYyB2b2lkIGVtaXRSZXN0b3JlQXJn
dW1lbnRzKENvbnRleHQmIGNvbnRleHQsIENvZGVCbG9jayogY29kZUJsb2NrLCBERkc6OkpJVENv
ZGUqIGRmZ0pJVENvZGUsIGNvbnN0IE9wZXJhbmRzPFZhbHVlUmVjb3Zlcnk+JiBvcGVyYW5kcykK
K3sKKyAgICBGcmFtZSBmcmFtZShjb250ZXh0LmZwKCksIGNvbnRleHQuc3RhY2soKSk7CisKKyAg
ICBIYXNoTWFwPE1pbmlmaWVkSUQsIGludD4gYWxyZWFkeUFsbG9jYXRlZEFyZ3VtZW50czsgLy8g
TWFwcyBwaGFudG9tIGFyZ3VtZW50cyBub2RlIElEIHRvIG9wZXJhbmQuCisgICAgZm9yIChzaXpl
X3QgaW5kZXggPSAwOyBpbmRleCA8IG9wZXJhbmRzLnNpemUoKTsgKytpbmRleCkgeworICAgICAg
ICBjb25zdCBWYWx1ZVJlY292ZXJ5JiByZWNvdmVyeSA9IG9wZXJhbmRzW2luZGV4XTsKKyAgICAg
ICAgaW50IG9wZXJhbmQgPSBvcGVyYW5kcy5vcGVyYW5kRm9ySW5kZXgoaW5kZXgpOworCisgICAg
ICAgIGlmIChyZWNvdmVyeS50ZWNobmlxdWUoKSAhPSBEaXJlY3RBcmd1bWVudHNUaGF0V2VyZU5v
dENyZWF0ZWQKKyAgICAgICAgICAgICYmIHJlY292ZXJ5LnRlY2huaXF1ZSgpICE9IENsb25lZEFy
Z3VtZW50c1RoYXRXZXJlTm90Q3JlYXRlZCkKKyAgICAgICAgICAgIGNvbnRpbnVlOworCisgICAg
ICAgIE1pbmlmaWVkSUQgaWQgPSByZWNvdmVyeS5ub2RlSUQoKTsKKyAgICAgICAgYXV0byBpdGVy
ID0gYWxyZWFkeUFsbG9jYXRlZEFyZ3VtZW50cy5maW5kKGlkKTsKKyAgICAgICAgaWYgKGl0ZXIg
IT0gYWxyZWFkeUFsbG9jYXRlZEFyZ3VtZW50cy5lbmQoKSkgeworICAgICAgICAgICAgZnJhbWUu
c2V0T3BlcmFuZChvcGVyYW5kLCBmcmFtZS5vcGVyYW5kKGl0ZXItPnZhbHVlKSk7CisgICAgICAg
ICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgIElubGluZUNhbGxGcmFtZSogaW5s
aW5lQ2FsbEZyYW1lID0KKyAgICAgICAgICAgIGRmZ0pJVENvZGUtPm1pbmlmaWVkREZHLmF0KGlk
KS0+aW5saW5lQ2FsbEZyYW1lKCk7CisKKyAgICAgICAgaW50IHN0YWNrT2Zmc2V0OworICAgICAg
ICBpZiAoaW5saW5lQ2FsbEZyYW1lKQorICAgICAgICAgICAgc3RhY2tPZmZzZXQgPSBpbmxpbmVD
YWxsRnJhbWUtPnN0YWNrT2Zmc2V0OworICAgICAgICBlbHNlCisgICAgICAgICAgICBzdGFja09m
ZnNldCA9IDA7CisKKyAgICAgICAgSlNGdW5jdGlvbiogY2FsbGVlOworICAgICAgICBpZiAoIWlu
bGluZUNhbGxGcmFtZSB8fCBpbmxpbmVDYWxsRnJhbWUtPmlzQ2xvc3VyZUNhbGwpCisgICAgICAg
ICAgICBjYWxsZWUgPSBqc0Nhc3Q8SlNGdW5jdGlvbio+KGZyYW1lLm9wZXJhbmQoc3RhY2tPZmZz
ZXQgKyBDYWxsRnJhbWVTbG90OjpjYWxsZWUpLmFzQ2VsbCgpKTsKKyAgICAgICAgZWxzZQorICAg
ICAgICAgICAgY2FsbGVlID0ganNDYXN0PEpTRnVuY3Rpb24qPihpbmxpbmVDYWxsRnJhbWUtPmNh
bGxlZVJlY292ZXJ5LmNvbnN0YW50KCkuYXNDZWxsKCkpOworCisgICAgICAgIGludDMyX3QgYXJn
dW1lbnRDb3VudDsKKyAgICAgICAgaWYgKCFpbmxpbmVDYWxsRnJhbWUgfHwgaW5saW5lQ2FsbEZy
YW1lLT5pc1ZhcmFyZ3MoKSkKKyAgICAgICAgICAgIGFyZ3VtZW50Q291bnQgPSBmcmFtZS5vcGVy
YW5kPGludDMyX3Q+KHN0YWNrT2Zmc2V0ICsgQ2FsbEZyYW1lU2xvdDo6YXJndW1lbnRDb3VudCwg
UGF5bG9hZE9mZnNldCk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGFyZ3VtZW50Q291bnQg
PSBpbmxpbmVDYWxsRnJhbWUtPmFyZ3VtZW50Q291bnRJbmNsdWRpbmdUaGlzOworCisgICAgICAg
IEpTQ2VsbCogYXJndW1lbnRzT2JqZWN0OworICAgICAgICBzd2l0Y2ggKHJlY292ZXJ5LnRlY2hu
aXF1ZSgpKSB7CisgICAgICAgIGNhc2UgRGlyZWN0QXJndW1lbnRzVGhhdFdlcmVOb3RDcmVhdGVk
OgorICAgICAgICAgICAgYXJndW1lbnRzT2JqZWN0ID0gY3JlYXRlRGlyZWN0QXJndW1lbnRzRHVy
aW5nRXhpdChjb250ZXh0LCBjb2RlQmxvY2ssIGlubGluZUNhbGxGcmFtZSwgY2FsbGVlLCBhcmd1
bWVudENvdW50KTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIENsb25lZEFyZ3Vt
ZW50c1RoYXRXZXJlTm90Q3JlYXRlZDoKKyAgICAgICAgICAgIGFyZ3VtZW50c09iamVjdCA9IGNy
ZWF0ZUNsb25lZEFyZ3VtZW50c0R1cmluZ0V4aXQoY29udGV4dCwgY29kZUJsb2NrLCBpbmxpbmVD
YWxsRnJhbWUsIGNhbGxlZSwgYXJndW1lbnRDb3VudCk7CisgICAgICAgICAgICBicmVhazsKKyAg
ICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIFJFTEVBU0VfQVNTRVJUX05PVF9SRUFDSEVEKCk7
CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBmcmFtZS5zZXRPcGVyYW5k
KG9wZXJhbmQsIEpTVmFsdWUoYXJndW1lbnRzT2JqZWN0KSk7CisKKyAgICAgICAgYWxyZWFkeUFs
bG9jYXRlZEFyZ3VtZW50cy5hZGQoaWQsIG9wZXJhbmQpOworICAgIH0KK30KKworLy8gVGhlIGZv
bGxvd2luZyBpcyBhIGxpc3Qgb2YgZXh0cmEgaW5pdGlhbGl6YXRpb25zIHRoYXQgbmVlZCB0byBi
ZSBkb25lIGluIG9yZGVyCisvLyBvZiBtb3N0IGxpa2VseSBuZWVkZWQgKGxvd2VyIGVudW0gdmFs
dWUpIHRvIGxlYXN0IGxpa2VseSBuZWVkZWQgKGhpZ2hlciBlbnVtIHZhbHVlKS4KKy8vIEVhY2gg
bGV2ZWwgaW5pdGlhbGl6YXRpb24gaW5jbHVkZXMgdGhlIHByZXZpb3VzIGxvd2VyIGVudW0gdmFs
dWUgKHNlZSB1c2Ugb2YgdGhlCisvLyBleHRyYUluaXRpYWxpemF0aW9uTGV2ZWwgdmFsdWUgYmVs
b3cpLgorZW51bSBjbGFzcyBFeHRyYUluaXRpYWxpemF0aW9uTGV2ZWwgeworICAgIE5vbmUsCisg
ICAgU3BlY3VsYXRpb25SZWNvdmVyeSwKKyAgICBWYWx1ZVByb2ZpbGVVcGRhdGUsCisgICAgQXJy
YXlQcm9maWxlVXBkYXRlLAorICAgIE90aGVyCit9OworCit2b2lkIE9TUkV4aXQ6OmV4ZWN1dGVP
U1JFeGl0KENvbnRleHQmIGNvbnRleHQpCit7CisgICAgVk0mIHZtID0gKmNvbnRleHQuYXJnPFZN
Kj4oKTsKKyAgICBhdXRvIHNjb3BlID0gREVDTEFSRV9USFJPV19TQ09QRSh2bSk7CisKKyAgICBF
eGVjU3RhdGUqIGV4ZWMgPSBjb250ZXh0LmZwPEV4ZWNTdGF0ZSo+KCk7CisgICAgQVNTRVJUKCZl
eGVjLT52bSgpID09ICZ2bSk7CisgICAgYXV0byYgY3B1ID0gY29udGV4dC5jcHU7CisKKyAgICBp
ZiAodm0uY2FsbEZyYW1lRm9yQ2F0Y2gpIHsKKyAgICAgICAgZXhlYyA9IHZtLmNhbGxGcmFtZUZv
ckNhdGNoOworICAgICAgICBjb250ZXh0LmZwKCkgPSBleGVjOworICAgIH0KKworICAgIENvZGVC
bG9jayogY29kZUJsb2NrID0gZXhlYy0+Y29kZUJsb2NrKCk7CisgICAgQVNTRVJUKGNvZGVCbG9j
ayk7CisgICAgQVNTRVJUKGNvZGVCbG9jay0+aml0VHlwZSgpID09IEpJVENvZGU6OkRGR0pJVCk7
CisKKyAgICAvLyBJdCdzIHNvcnQgb2YgcHJlZmVyYWJsZSB0aGF0IHdlIGRvbid0IEdDIHdoaWxl
IGluIGhlcmUuIEFueXdheXMsIGRvaW5nIHNvIHdvdWxkbid0CisgICAgLy8gcmVhbGx5IGJlIHBy
b2ZpdGFibGUuCisgICAgRGVmZXJHQ0ZvckFXaGlsZSBkZWZlckdDKHZtLmhlYXApOworCisgICAg
dWludDMyX3QgZXhpdEluZGV4ID0gdm0ub3NyRXhpdEluZGV4OworICAgIERGRzo6SklUQ29kZSog
ZGZnSklUQ29kZSA9IGNvZGVCbG9jay0+aml0Q29kZSgpLT5kZmcoKTsKKyAgICBPU1JFeGl0JiBl
eGl0ID0gZGZnSklUQ29kZS0+b3NyRXhpdFtleGl0SW5kZXhdOworCisgICAgQVNTRVJUKCF2bS5j
YWxsRnJhbWVGb3JDYXRjaCB8fCBleGl0Lm1fa2luZCA9PSBHZW5lcmljVW53aW5kKTsKKyAgICBF
WENFUFRJT05fQVNTRVJUX1VOVVNFRChzY29wZSwgISFzY29wZS5leGNlcHRpb24oKSB8fCAhZXhp
dC5pc0V4Y2VwdGlvbkhhbmRsZXIoKSk7CisKKyAgICBpZiAoVU5MSUtFTFkoIWV4aXQuZXhpdFN0
YXRlKSkgeworICAgICAgICBFeHRyYUluaXRpYWxpemF0aW9uTGV2ZWwgZXh0cmFJbml0aWFsaXph
dGlvbkxldmVsID0gRXh0cmFJbml0aWFsaXphdGlvbkxldmVsOjpOb25lOworCisgICAgICAgIC8v
IFdlIG9ubHkgbmVlZCB0byBleGVjdXRlIHRoaXMgYmxvY2sgb25jZSBmb3IgZWFjaCBPU1JFeGl0
IHJlY29yZC4gVGhlIGNvbXB1dGVkCisgICAgICAgIC8vIHJlc3VsdHMgd2lsbCBiZSBjYWNoZWQg
aW4gdGhlIE9TUkV4aXRTdGF0ZSByZWNvcmQgZm9yIHVzZSBvZiB0aGUgcmVzdCBvZiB0aGUKKyAg
ICAgICAgLy8gZXhpdCByYW1wIGNvZGUuCisKKyAgICAgICAgLy8gRW5zdXJlIHdlIGhhdmUgYmFz
ZWxpbmUgY29kZUJsb2NrcyB0byBPU1IgZXhpdCB0by4KKyAgICAgICAgcHJlcGFyZUNvZGVPcmln
aW5Gb3JPU1JFeGl0KGV4ZWMsIGV4aXQubV9jb2RlT3JpZ2luKTsKKworICAgICAgICBDb2RlQmxv
Y2sqIGJhc2VsaW5lQ29kZUJsb2NrID0gY29kZUJsb2NrLT5iYXNlbGluZUFsdGVybmF0aXZlKCk7
CisgICAgICAgIEFTU0VSVChiYXNlbGluZUNvZGVCbG9jay0+aml0VHlwZSgpID09IEpJVENvZGU6
OkJhc2VsaW5lSklUKTsKKworICAgICAgICBTcGVjdWxhdGlvblJlY292ZXJ5KiByZWNvdmVyeSA9
IG51bGxwdHI7CisgICAgICAgIGlmIChleGl0Lm1fcmVjb3ZlcnlJbmRleCAhPSBVSU5UX01BWCkg
eworICAgICAgICAgICAgcmVjb3ZlcnkgPSAmZGZnSklUQ29kZS0+c3BlY3VsYXRpb25SZWNvdmVy
eVtleGl0Lm1fcmVjb3ZlcnlJbmRleF07CisgICAgICAgICAgICBleHRyYUluaXRpYWxpemF0aW9u
TGV2ZWwgPSBzdGQ6Om1heChleHRyYUluaXRpYWxpemF0aW9uTGV2ZWwsIEV4dHJhSW5pdGlhbGl6
YXRpb25MZXZlbDo6U3BlY3VsYXRpb25SZWNvdmVyeSk7CisgICAgICAgIH0KKworICAgICAgICBp
ZiAoVU5MSUtFTFkoZXhpdC5tX2tpbmQgPT0gR2VuZXJpY1Vud2luZCkpCisgICAgICAgICAgICBl
eHRyYUluaXRpYWxpemF0aW9uTGV2ZWwgPSBzdGQ6Om1heChleHRyYUluaXRpYWxpemF0aW9uTGV2
ZWwsIEV4dHJhSW5pdGlhbGl6YXRpb25MZXZlbDo6T3RoZXIpOworCisgICAgICAgIEFycmF5UHJv
ZmlsZSogYXJyYXlQcm9maWxlID0gbnVsbHB0cjsKKyAgICAgICAgaWYgKCEhZXhpdC5tX2pzVmFs
dWVTb3VyY2UpIHsKKyAgICAgICAgICAgIGlmIChleGl0Lm1fdmFsdWVQcm9maWxlKQorICAgICAg
ICAgICAgICAgIGV4dHJhSW5pdGlhbGl6YXRpb25MZXZlbCA9IHN0ZDo6bWF4KGV4dHJhSW5pdGlh
bGl6YXRpb25MZXZlbCwgRXh0cmFJbml0aWFsaXphdGlvbkxldmVsOjpWYWx1ZVByb2ZpbGVVcGRh
dGUpOworICAgICAgICAgICAgaWYgKGV4aXQubV9raW5kID09IEJhZENhY2hlIHx8IGV4aXQubV9r
aW5kID09IEJhZEluZGV4aW5nVHlwZSkgeworICAgICAgICAgICAgICAgIENvZGVPcmlnaW4gY29k
ZU9yaWdpbiA9IGV4aXQubV9jb2RlT3JpZ2luRm9yRXhpdFByb2ZpbGU7CisgICAgICAgICAgICAg
ICAgQ29kZUJsb2NrKiBwcm9maWxlZENvZGVCbG9jayA9IGJhc2VsaW5lQ29kZUJsb2NrRm9yT3Jp
Z2luQW5kQmFzZWxpbmVDb2RlQmxvY2soY29kZU9yaWdpbiwgYmFzZWxpbmVDb2RlQmxvY2spOwor
ICAgICAgICAgICAgICAgIGFycmF5UHJvZmlsZSA9IHByb2ZpbGVkQ29kZUJsb2NrLT5nZXRBcnJh
eVByb2ZpbGUoY29kZU9yaWdpbi5ieXRlY29kZUluZGV4KTsKKyAgICAgICAgICAgICAgICBpZiAo
YXJyYXlQcm9maWxlKQorICAgICAgICAgICAgICAgICAgICBleHRyYUluaXRpYWxpemF0aW9uTGV2
ZWwgPSBzdGQ6Om1heChleHRyYUluaXRpYWxpemF0aW9uTGV2ZWwsIEV4dHJhSW5pdGlhbGl6YXRp
b25MZXZlbDo6QXJyYXlQcm9maWxlVXBkYXRlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQor
CisgICAgICAgIGludDMyX3QgYWN0aXZlVGhyZXNob2xkID0gYmFzZWxpbmVDb2RlQmxvY2stPmFk
anVzdGVkQ291bnRlclZhbHVlKE9wdGlvbnM6OnRocmVzaG9sZEZvck9wdGltaXplQWZ0ZXJMb25n
V2FybVVwKCkpOworICAgICAgICBkb3VibGUgYWRqdXN0ZWRUaHJlc2hvbGQgPSBhcHBseU1lbW9y
eVVzYWdlSGV1cmlzdGljc0FuZENvbnZlcnRUb0ludChhY3RpdmVUaHJlc2hvbGQsIGJhc2VsaW5l
Q29kZUJsb2NrKTsKKyAgICAgICAgQVNTRVJUKGFkanVzdGVkVGhyZXNob2xkID4gMCk7CisgICAg
ICAgIGFkanVzdGVkVGhyZXNob2xkID0gQmFzZWxpbmVFeGVjdXRpb25Db3VudGVyOjpjbGlwcGVk
VGhyZXNob2xkKGNvZGVCbG9jay0+Z2xvYmFsT2JqZWN0KCksIGFkanVzdGVkVGhyZXNob2xkKTsK
KworICAgICAgICBDb2RlQmxvY2sqIGNvZGVCbG9ja0ZvckV4aXQgPSBiYXNlbGluZUNvZGVCbG9j
a0Zvck9yaWdpbkFuZEJhc2VsaW5lQ29kZUJsb2NrKGV4aXQubV9jb2RlT3JpZ2luLCBiYXNlbGlu
ZUNvZGVCbG9jayk7CisgICAgICAgIFZlY3RvcjxCeXRlY29kZUFuZE1hY2hpbmVPZmZzZXQ+IGRl
Y29kZWRDb2RlTWFwOworICAgICAgICBjb2RlQmxvY2tGb3JFeGl0LT5qaXRDb2RlTWFwKCktPmRl
Y29kZShkZWNvZGVkQ29kZU1hcCk7CisKKyAgICAgICAgQnl0ZWNvZGVBbmRNYWNoaW5lT2Zmc2V0
KiBtYXBwaW5nID0gYmluYXJ5U2VhcmNoPEJ5dGVjb2RlQW5kTWFjaGluZU9mZnNldCwgdW5zaWdu
ZWQ+KGRlY29kZWRDb2RlTWFwLCBkZWNvZGVkQ29kZU1hcC5zaXplKCksIGV4aXQubV9jb2RlT3Jp
Z2luLmJ5dGVjb2RlSW5kZXgsIEJ5dGVjb2RlQW5kTWFjaGluZU9mZnNldDo6Z2V0Qnl0ZWNvZGVJ
bmRleCk7CisKKyAgICAgICAgQVNTRVJUKG1hcHBpbmcpOworICAgICAgICBBU1NFUlQobWFwcGlu
Zy0+bV9ieXRlY29kZUluZGV4ID09IGV4aXQubV9jb2RlT3JpZ2luLmJ5dGVjb2RlSW5kZXgpOwor
CisgICAgICAgIHZvaWQqIGp1bXBUYXJnZXQgPSBjb2RlQmxvY2tGb3JFeGl0LT5qaXRDb2RlKCkt
PmV4ZWN1dGFibGVBZGRyZXNzQXRPZmZzZXQobWFwcGluZy0+bV9tYWNoaW5lQ29kZU9mZnNldCk7
CisKKyAgICAgICAgLy8gQ29tcHV0ZSB0aGUgdmFsdWUgcmVjb3Zlcmllcy4KKyAgICAgICAgT3Bl
cmFuZHM8VmFsdWVSZWNvdmVyeT4gb3BlcmFuZHM7CisgICAgICAgIFZlY3RvcjxVbmRlZmluZWRP
cGVyYW5kU3Bhbj4gdW5kZWZpbmVkT3BlcmFuZFNwYW5zOworICAgICAgICB1bnNpZ25lZCBudW1W
YXJpYWJsZXMgPSBkZmdKSVRDb2RlLT52YXJpYWJsZUV2ZW50U3RyZWFtLnJlY29uc3RydWN0KGNv
ZGVCbG9jaywgZXhpdC5tX2NvZGVPcmlnaW4sIGRmZ0pJVENvZGUtPm1pbmlmaWVkREZHLCBleGl0
Lm1fc3RyZWFtSW5kZXgsIG9wZXJhbmRzLCAmdW5kZWZpbmVkT3BlcmFuZFNwYW5zKTsKKyAgICAg
ICAgcHRyZGlmZl90IHN0YWNrUG9pbnRlck9mZnNldCA9IC1zdGF0aWNfY2FzdDxwdHJkaWZmX3Q+
KG51bVZhcmlhYmxlcykgKiBzaXplb2YoUmVnaXN0ZXIpOworCisgICAgICAgIGV4aXQuZXhpdFN0
YXRlID0gYWRvcHRSZWYobmV3IE9TUkV4aXRTdGF0ZShleGl0LCBjb2RlQmxvY2ssIGJhc2VsaW5l
Q29kZUJsb2NrLCBvcGVyYW5kcywgV1RGTW92ZSh1bmRlZmluZWRPcGVyYW5kU3BhbnMpLCByZWNv
dmVyeSwgc3RhY2tQb2ludGVyT2Zmc2V0LCBhY3RpdmVUaHJlc2hvbGQsIGFkanVzdGVkVGhyZXNo
b2xkLCBqdW1wVGFyZ2V0LCBhcnJheVByb2ZpbGUpKTsKKworICAgICAgICBpZiAoVU5MSUtFTFko
dm0ubV9wZXJCeXRlY29kZVByb2ZpbGVyICYmIGNvZGVCbG9jay0+aml0Q29kZSgpLT5kZmdDb21t
b24oKS0+Y29tcGlsYXRpb24pKSB7CisgICAgICAgICAgICBQcm9maWxlcjo6RGF0YWJhc2UmIGRh
dGFiYXNlID0gKnZtLm1fcGVyQnl0ZWNvZGVQcm9maWxlcjsKKyAgICAgICAgICAgIFByb2ZpbGVy
OjpDb21waWxhdGlvbiogY29tcGlsYXRpb24gPSBjb2RlQmxvY2stPmppdENvZGUoKS0+ZGZnQ29t
bW9uKCktPmNvbXBpbGF0aW9uLmdldCgpOworCisgICAgICAgICAgICBQcm9maWxlcjo6T1NSRXhp
dCogcHJvZmlsZXJFeGl0ID0gY29tcGlsYXRpb24tPmFkZE9TUkV4aXQoCisgICAgICAgICAgICAg
ICAgZXhpdEluZGV4LCBQcm9maWxlcjo6T3JpZ2luU3RhY2soZGF0YWJhc2UsIGNvZGVCbG9jaywg
ZXhpdC5tX2NvZGVPcmlnaW4pLAorICAgICAgICAgICAgICAgIGV4aXQubV9raW5kLCBleGl0Lm1f
a2luZCA9PSBVbmNvdW50YWJsZUludmFsaWRhdGlvbik7CisgICAgICAgICAgICBleGl0LmV4aXRT
dGF0ZS0+cHJvZmlsZXJFeGl0ID0gcHJvZmlsZXJFeGl0OworICAgICAgICAgICAgZXh0cmFJbml0
aWFsaXphdGlvbkxldmVsID0gc3RkOjptYXgoZXh0cmFJbml0aWFsaXphdGlvbkxldmVsLCBFeHRy
YUluaXRpYWxpemF0aW9uTGV2ZWw6Ok90aGVyKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChV
TkxJS0VMWShPcHRpb25zOjpwcmludEVhY2hPU1JFeGl0KCkpKQorICAgICAgICAgICAgZXh0cmFJ
bml0aWFsaXphdGlvbkxldmVsID0gc3RkOjptYXgoZXh0cmFJbml0aWFsaXphdGlvbkxldmVsLCBF
eHRyYUluaXRpYWxpemF0aW9uTGV2ZWw6Ok90aGVyKTsKKworICAgICAgICBleGl0LmV4aXRTdGF0
ZS0+ZXh0cmFJbml0aWFsaXphdGlvbkxldmVsID0gZXh0cmFJbml0aWFsaXphdGlvbkxldmVsOwor
CisgICAgICAgIGlmIChVTkxJS0VMWShPcHRpb25zOjp2ZXJib3NlT1NSKCkgfHwgT3B0aW9uczo6
dmVyYm9zZURGR09TUkV4aXQoKSkpIHsKKyAgICAgICAgICAgIGRhdGFMb2dGKCJERkcgT1NSIGV4
aXQgIyV1ICglcywgJXMpIGZyb20gJXMsIHdpdGggb3BlcmFuZHMgPSAlc1xuIiwKKyAgICAgICAg
ICAgICAgICBleGl0SW5kZXgsIHRvQ1N0cmluZyhleGl0Lm1fY29kZU9yaWdpbikuZGF0YSgpLAor
ICAgICAgICAgICAgICAgIGV4aXRLaW5kVG9TdHJpbmcoZXhpdC5tX2tpbmQpLCB0b0NTdHJpbmco
KmNvZGVCbG9jaykuZGF0YSgpLAorICAgICAgICAgICAgICAgIHRvQ1N0cmluZyhpZ25vcmluZ0Nv
bnRleHQ8RHVtcENvbnRleHQ+KG9wZXJhbmRzKSkuZGF0YSgpKTsKKyAgICAgICAgfQorICAgIH0K
KworICAgIE9TUkV4aXRTdGF0ZSYgZXhpdFN0YXRlID0gKmV4aXQuZXhpdFN0YXRlLmdldCgpOwor
ICAgIENvZGVCbG9jayogYmFzZWxpbmVDb2RlQmxvY2sgPSBleGl0U3RhdGUuYmFzZWxpbmVDb2Rl
QmxvY2s7CisgICAgQVNTRVJUKGJhc2VsaW5lQ29kZUJsb2NrLT5qaXRUeXBlKCkgPT0gSklUQ29k
ZTo6QmFzZWxpbmVKSVQpOworCisgICAgT3BlcmFuZHM8VmFsdWVSZWNvdmVyeT4mIG9wZXJhbmRz
ID0gZXhpdFN0YXRlLm9wZXJhbmRzOworICAgIFZlY3RvcjxVbmRlZmluZWRPcGVyYW5kU3Bhbj4m
IHVuZGVmaW5lZE9wZXJhbmRTcGFucyA9IGV4aXRTdGF0ZS51bmRlZmluZWRPcGVyYW5kU3BhbnM7
CisKKyAgICBjb250ZXh0LnNwKCkgPSBjb250ZXh0LmZwPHVpbnQ4X3QqPigpICsgZXhpdFN0YXRl
LnN0YWNrUG9pbnRlck9mZnNldDsKKworICAgIC8vIFRoZSBvbmx5IHJlYXNvbiBmb3IgdXNpbmcg
dGhpcyBkbyB3aGlsZSBsb29rIGlzIHNvIHdlIGNhbiBicmVhayBvdXQgbWlkd2F5IHdoZW4gYXBw
cm9wcmlhdGUuCisgICAgZG8geworICAgICAgICBhdXRvIGV4dHJhSW5pdGlhbGl6YXRpb25MZXZl
bCA9IHN0YXRpY19jYXN0PEV4dHJhSW5pdGlhbGl6YXRpb25MZXZlbD4oZXhpdFN0YXRlLmV4dHJh
SW5pdGlhbGl6YXRpb25MZXZlbCk7CisKKyAgICAgICAgaWYgKGV4dHJhSW5pdGlhbGl6YXRpb25M
ZXZlbCA9PSBFeHRyYUluaXRpYWxpemF0aW9uTGV2ZWw6Ok5vbmUpIHsKKyAgICAgICAgICAgIGNv
bnRleHQuc3AoKSA9IGNvbnRleHQuZnA8dWludDhfdCo+KCkgKyBleGl0U3RhdGUuc3RhY2tQb2lu
dGVyT2Zmc2V0OworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICAvLyBC
ZWdpbiBleHRyYSBpbml0aWxpemF0aW9uIGxldmVsOiBTcGVjdWxhdGlvblJlY292ZXJ5CisKKyAg
ICAgICAgLy8gV2UgbmVlZCB0byBkbyBzcGVjdWxhdGlvbiByZWNvdmVyeSBmaXJzdCBiZWNhdXNl
IGFycmF5IHByb2ZpbGluZyBhbmQgdmFsdWUgcHJvZmlsaW5nCisgICAgICAgIC8vIG1heSByZWx5
IG9uIGEgdmFsdWUgdGhhdCBpdCByZWNvdmVycy4gSG93ZXZlciwgdGhhdCBkb2Vzbid0IG1lYW4g
dGhhdCBpdCBpcyBsaWtlbHkKKyAgICAgICAgLy8gdG8gaGF2ZSBhIHJlY292ZXJ5IHZhbHVlLiBT
bywgd2UnbGwgZGVjb3JhdGUgaXQgYXMgVU5MSUtFTFkuCisgICAgICAgIFNwZWN1bGF0aW9uUmVj
b3ZlcnkqIHJlY292ZXJ5ID0gZXhpdFN0YXRlLnJlY292ZXJ5OworICAgICAgICBpZiAoVU5MSUtF
TFkocmVjb3ZlcnkpKSB7CisgICAgICAgICAgICBzd2l0Y2ggKHJlY292ZXJ5LT50eXBlKCkpIHsK
KyAgICAgICAgICAgIGNhc2UgU3BlY3VsYXRpdmVBZGQ6CisgICAgICAgICAgICAgICAgY3B1Lmdw
cihyZWNvdmVyeS0+ZGVzdCgpKSA9IGNwdS5ncHI8dWludDMyX3Q+KHJlY292ZXJ5LT5kZXN0KCkp
IC0gY3B1Lmdwcjx1aW50MzJfdD4ocmVjb3ZlcnktPnNyYygpKTsKKyNpZiBVU0UoSlNWQUxVRTY0
KQorICAgICAgICAgICAgICAgIEFTU0VSVCghKGNwdS5ncHIocmVjb3ZlcnktPmRlc3QoKSkgPj4g
MzIpKTsKKyAgICAgICAgICAgICAgICBjcHUuZ3ByKHJlY292ZXJ5LT5kZXN0KCkpIHw9IFRhZ1R5
cGVOdW1iZXI7CisjZW5kaWYKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAg
Y2FzZSBTcGVjdWxhdGl2ZUFkZEltbWVkaWF0ZToKKyAgICAgICAgICAgICAgICBjcHUuZ3ByKHJl
Y292ZXJ5LT5kZXN0KCkpID0gKGNwdS5ncHI8dWludDMyX3Q+KHJlY292ZXJ5LT5kZXN0KCkpIC0g
cmVjb3ZlcnktPmltbWVkaWF0ZSgpKTsKKyNpZiBVU0UoSlNWQUxVRTY0KQorICAgICAgICAgICAg
ICAgIEFTU0VSVCghKGNwdS5ncHIocmVjb3ZlcnktPmRlc3QoKSkgPj4gMzIpKTsKKyAgICAgICAg
ICAgICAgICBjcHUuZ3ByKHJlY292ZXJ5LT5kZXN0KCkpIHw9IFRhZ1R5cGVOdW1iZXI7CisjZW5k
aWYKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSBCb29sZWFuU3Bl
Y3VsYXRpb25DaGVjazoKKyNpZiBVU0UoSlNWQUxVRTY0KQorICAgICAgICAgICAgICAgIGNwdS5n
cHIocmVjb3ZlcnktPmRlc3QoKSkgPSBjcHUuZ3ByKHJlY292ZXJ5LT5kZXN0KCkpIF4gVmFsdWVG
YWxzZTsKKyNlbmRpZgorICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBkZWZh
dWx0OgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9Cisg
ICAgICAgIGlmIChleHRyYUluaXRpYWxpemF0aW9uTGV2ZWwgPD0gRXh0cmFJbml0aWFsaXphdGlv
bkxldmVsOjpTcGVjdWxhdGlvblJlY292ZXJ5KQorICAgICAgICAgICAgYnJlYWs7CisKKyAgICAg
ICAgLy8gQmVnaW4gZXh0cmEgaW5pdGlsaXphdGlvbiBsZXZlbDogVmFsdWVQcm9maWxlVXBkYXRl
CisgICAgICAgIEpTVmFsdWUgcHJvZmlsZWRWYWx1ZTsKKyAgICAgICAgaWYgKCEhZXhpdC5tX2pz
VmFsdWVTb3VyY2UpIHsKKyAgICAgICAgICAgIHByb2ZpbGVkVmFsdWUgPSBqc1ZhbHVlRm9yKGNw
dSwgZXhpdC5tX2pzVmFsdWVTb3VyY2UpOworICAgICAgICAgICAgaWYgKE1ldGhvZE9mR2V0dGlu
Z0FWYWx1ZVByb2ZpbGUgcHJvZmlsZSA9IGV4aXQubV92YWx1ZVByb2ZpbGUpCisgICAgICAgICAg
ICAgICAgcHJvZmlsZS5yZXBvcnRWYWx1ZShwcm9maWxlZFZhbHVlKTsKKyAgICAgICAgfQorICAg
ICAgICBpZiAoZXh0cmFJbml0aWFsaXphdGlvbkxldmVsIDw9IEV4dHJhSW5pdGlhbGl6YXRpb25M
ZXZlbDo6VmFsdWVQcm9maWxlVXBkYXRlKQorICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAg
Ly8gQmVnaW4gZXh0cmEgaW5pdGlsaXphdGlvbiBsZXZlbDogQXJyYXlQcm9maWxlVXBkYXRlCisg
ICAgICAgIEFycmF5UHJvZmlsZSogYXJyYXlQcm9maWxlID0gZXhpdFN0YXRlLmFycmF5UHJvZmls
ZTsKKyAgICAgICAgaWYgKGFycmF5UHJvZmlsZSkgeworICAgICAgICAgICAgQVNTRVJUKCEhZXhp
dC5tX2pzVmFsdWVTb3VyY2UpOworICAgICAgICAgICAgQVNTRVJUKGV4aXQubV9raW5kID09IEJh
ZENhY2hlIHx8IGV4aXQubV9raW5kID09IEJhZEluZGV4aW5nVHlwZSk7CisgICAgICAgICAgICBT
dHJ1Y3R1cmUqIHN0cnVjdHVyZSA9IHByb2ZpbGVkVmFsdWUuYXNDZWxsKCktPnN0cnVjdHVyZSh2
bSk7CisgICAgICAgICAgICBhcnJheVByb2ZpbGUtPm9ic2VydmVTdHJ1Y3R1cmUoc3RydWN0dXJl
KTsKKyAgICAgICAgICAgIGFycmF5UHJvZmlsZS0+b2JzZXJ2ZUFycmF5TW9kZShhc0FycmF5TW9k
ZXMoc3RydWN0dXJlLT5pbmRleGluZ1R5cGUoKSkpOworICAgICAgICB9CisgICAgICAgIGlmIChl
eHRyYUluaXRpYWxpemF0aW9uTGV2ZWwgPD0gRXh0cmFJbml0aWFsaXphdGlvbkxldmVsOjpBcnJh
eVByb2ZpbGVVcGRhdGUpCisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAvLyBCZWdpbiBF
eHRyYSBpbml0aWxpemF0aW9uIGxldmVsOiBPdGhlcgorICAgICAgICBpZiAoVU5MSUtFTFkoZXhp
dC5tX2tpbmQgPT0gR2VuZXJpY1Vud2luZCkpIHsKKyAgICAgICAgICAgIC8vIFdlIGFyZSBhY3Rp
bmcgYXMgYSBkZWZhY3RvIG9wX2NhdGNoIGJlY2F1c2Ugd2UgYXJyaXZlIGhlcmUgZnJvbSBnZW5l
cmljVW53aW5kKCkuCisgICAgICAgICAgICAvLyBTbywgd2UgbXVzdCByZXN0b3JlIG91ciBjYWxs
IGZyYW1lIGFuZCBzdGFjayBwb2ludGVyLgorICAgICAgICAgICAgcmVzdG9yZUNhbGxlZVNhdmVz
RnJvbVZNRW50cnlGcmFtZUNhbGxlZVNhdmVzQnVmZmVyKGNvbnRleHQpOworICAgICAgICAgICAg
QVNTRVJUKGNvbnRleHQuZnAoKSA9PSB2bS5jYWxsRnJhbWVGb3JDYXRjaCk7CisgICAgICAgIH0K
KworICAgICAgICBpZiAoZXhpdFN0YXRlLnByb2ZpbGVyRXhpdCkKKyAgICAgICAgICAgIGV4aXRT
dGF0ZS5wcm9maWxlckV4aXQtPmluY0NvdW50KCk7CisKKyAgICAgICAgaWYgKFVOTElLRUxZKE9w
dGlvbnM6OnByaW50RWFjaE9TUkV4aXQoKSkpCisgICAgICAgICAgICBwcmludE9TUkV4aXQoY29u
dGV4dCwgdm0ub3NyRXhpdEluZGV4LCBleGl0KTsKKworICAgIH0gd2hpbGUgKGZhbHNlKTsgLy8g
RW5kIGV4dHJhIGluaXRpYWxpemF0aW9uLgorCisgICAgRnJhbWUgZnJhbWUoY3B1LmZwKCksIGNv
bnRleHQuc3RhY2soKSk7CisgICAgQVNTRVJUKCEoY29udGV4dC5mcDx1aW50cHRyX3Q+KCkgJiAw
eDcpKTsKKworI2lmIFVTRShKU1ZBTFVFNjQpCisgICAgQVNTRVJUKGNwdS5ncHIoR1BSSW5mbzo6
dGFnVHlwZU51bWJlclJlZ2lzdGVyKSA9PSBUYWdUeXBlTnVtYmVyKTsKKyAgICBBU1NFUlQoY3B1
LmdwcihHUFJJbmZvOjp0YWdNYXNrUmVnaXN0ZXIpID09IFRhZ01hc2spOworI2VuZGlmCisKKyAg
ICAvLyBEbyBhbGwgZGF0YSBmb3JtYXQgY29udmVyc2lvbnMgYW5kIHN0b3JlIHRoZSByZXN1bHRz
IGludG8gdGhlIHN0YWNrLgorICAgIC8vIE5vdGU6IHdlIG5lZWQgdG8gcmVjb3ZlciB2YWx1ZXMg
YmVmb3JlIHJlc3RvcmluZyBjYWxsZWUgc2F2ZSByZWdpc3RlcnMgYmVsb3cKKyAgICAvLyBiZWNh
dXNlIHRoZSByZWNvdmVyeSBtYXkgcmVseSBvbiB2YWx1ZXMgaW4gc29tZSBvZiBjYWxsZWUgc2F2
ZSByZWdpc3RlcnMuCisKKyAgICBpbnQgY2FsbGVlU2F2ZVNwYWNlQXNWaXJ0dWFsUmVnaXN0ZXJz
ID0gc3RhdGljX2Nhc3Q8aW50PihiYXNlbGluZUNvZGVCbG9jay0+Y2FsbGVlU2F2ZVNwYWNlQXNW
aXJ0dWFsUmVnaXN0ZXJzKCkpOworICAgIHNpemVfdCBudW1iZXJPZk9wZXJhbmRzID0gb3BlcmFu
ZHMuc2l6ZSgpOworICAgIHNpemVfdCBudW1VbmRlZmluZWRPcGVyYW5kU3BhbnMgPSB1bmRlZmlu
ZWRPcGVyYW5kU3BhbnMuc2l6ZSgpOworCisgICAgc2l6ZV90IG5leHRVbmRlZmluZWRTcGFuSW5k
ZXggPSAwOworICAgIHNpemVfdCBuZXh0VW5kZWZpbmVkT3BlcmFuZEluZGV4ID0gbnVtYmVyT2ZP
cGVyYW5kczsKKyAgICBpZiAobnVtVW5kZWZpbmVkT3BlcmFuZFNwYW5zKQorICAgICAgICBuZXh0
VW5kZWZpbmVkT3BlcmFuZEluZGV4ID0gdW5kZWZpbmVkT3BlcmFuZFNwYW5zW25leHRVbmRlZmlu
ZWRTcGFuSW5kZXhdLmZpcnN0SW5kZXg7CisKKyAgICBKU1ZhbHVlIHVuZGVmaW5lZCA9IGpzVW5k
ZWZpbmVkKCk7CisgICAgZm9yIChzaXplX3Qgc3BhbkluZGV4ID0gMDsgc3BhbkluZGV4IDwgbnVt
VW5kZWZpbmVkT3BlcmFuZFNwYW5zOyArK3NwYW5JbmRleCkgeworICAgICAgICBhdXRvJiBzcGFu
ID0gdW5kZWZpbmVkT3BlcmFuZFNwYW5zW3NwYW5JbmRleF07CisgICAgICAgIGludCBmaXJzdE9m
ZnNldCA9IHNwYW4ubWluT2Zmc2V0OworICAgICAgICBpbnQgbGFzdE9mZnNldCA9IGZpcnN0T2Zm
c2V0ICsgc3Bhbi5udW1iZXJPZlJlZ2lzdGVyczsKKworICAgICAgICBmb3IgKGludCBvZmZzZXQg
PSBmaXJzdE9mZnNldDsgb2Zmc2V0IDwgbGFzdE9mZnNldDsgKytvZmZzZXQpCisgICAgICAgICAg
ICBmcmFtZS5zZXRPcGVyYW5kKG9mZnNldCwgdW5kZWZpbmVkKTsKKyAgICB9CisKKyAgICBmb3Ig
KHNpemVfdCBpbmRleCA9IDA7IGluZGV4IDwgbnVtYmVyT2ZPcGVyYW5kczsgKytpbmRleCkgewor
ICAgICAgICBjb25zdCBWYWx1ZVJlY292ZXJ5JiByZWNvdmVyeSA9IG9wZXJhbmRzW2luZGV4XTsK
KyAgICAgICAgVmlydHVhbFJlZ2lzdGVyIHJlZyA9IG9wZXJhbmRzLnZpcnR1YWxSZWdpc3RlckZv
ckluZGV4KGluZGV4KTsKKworICAgICAgICBpZiAoVU5MSUtFTFkoaW5kZXggPT0gbmV4dFVuZGVm
aW5lZE9wZXJhbmRJbmRleCkpIHsKKyAgICAgICAgICAgIGluZGV4ICs9IHVuZGVmaW5lZE9wZXJh
bmRTcGFuc1tuZXh0VW5kZWZpbmVkU3BhbkluZGV4KytdLm51bWJlck9mUmVnaXN0ZXJzIC0gMTsK
KyAgICAgICAgICAgIGlmIChuZXh0VW5kZWZpbmVkU3BhbkluZGV4IDwgbnVtVW5kZWZpbmVkT3Bl
cmFuZFNwYW5zKQorICAgICAgICAgICAgICAgIG5leHRVbmRlZmluZWRPcGVyYW5kSW5kZXggPSB1
bmRlZmluZWRPcGVyYW5kU3BhbnNbbmV4dFVuZGVmaW5lZFNwYW5JbmRleF0uZmlyc3RJbmRleDsK
KyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBuZXh0VW5kZWZpbmVkT3BlcmFuZElu
ZGV4ID0gbnVtYmVyT2ZPcGVyYW5kczsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9
CisKKyAgICAgICAgaWYgKHJlZy5pc0xvY2FsKCkgJiYgcmVnLnRvTG9jYWwoKSA8IGNhbGxlZVNh
dmVTcGFjZUFzVmlydHVhbFJlZ2lzdGVycykKKyAgICAgICAgICAgIGNvbnRpbnVlOworCisgICAg
ICAgIGludCBvcGVyYW5kID0gcmVnLm9mZnNldCgpOworCisgICAgICAgIHN3aXRjaCAocmVjb3Zl
cnkudGVjaG5pcXVlKCkpIHsKKyAgICAgICAgY2FzZSBEaXNwbGFjZWRJbkpTU3RhY2s6CisgICAg
ICAgICAgICBmcmFtZS5zZXRPcGVyYW5kKG9wZXJhbmQsIGV4ZWMtPnIocmVjb3ZlcnkudmlydHVh
bFJlZ2lzdGVyKCkpLmpzVmFsdWUoKSk7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBj
YXNlIEluRlBSOgorICAgICAgICAgICAgZnJhbWUuc2V0T3BlcmFuZChvcGVyYW5kLCBjcHUuZnBy
PEpTVmFsdWU+KHJlY292ZXJ5LmZwcigpKSk7CisgICAgICAgICAgICBicmVhazsKKworI2lmIFVT
RShKU1ZBTFVFNjQpCisgICAgICAgIGNhc2UgSW5HUFI6CisgICAgICAgICAgICBmcmFtZS5zZXRP
cGVyYW5kKG9wZXJhbmQsIGNwdS5ncHI8SlNWYWx1ZT4ocmVjb3ZlcnkuZ3ByKCkpKTsKKyAgICAg
ICAgICAgIGJyZWFrOworI2Vsc2UKKyAgICAgICAgY2FzZSBJblBhaXI6CisgICAgICAgICAgICBm
cmFtZS5zZXRPcGVyYW5kKG9wZXJhbmQsIEpTVmFsdWUoY3B1LmdwcjxpbnQzMl90PihyZWNvdmVy
eS50YWdHUFIoKSksIGNwdS5ncHI8aW50MzJfdD4ocmVjb3ZlcnkucGF5bG9hZEdQUigpKSkpOwor
ICAgICAgICAgICAgYnJlYWs7CisjZW5kaWYKKworICAgICAgICBjYXNlIFVuYm94ZWRDZWxsSW5H
UFI6CisgICAgICAgICAgICBmcmFtZS5zZXRPcGVyYW5kKG9wZXJhbmQsIEpTVmFsdWUoY3B1Lmdw
cjxKU0NlbGwqPihyZWNvdmVyeS5ncHIoKSkpKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAg
ICAgIGNhc2UgQ2VsbERpc3BsYWNlZEluSlNTdGFjazoKKyAgICAgICAgICAgIGZyYW1lLnNldE9w
ZXJhbmQob3BlcmFuZCwgSlNWYWx1ZShleGVjLT5yKHJlY292ZXJ5LnZpcnR1YWxSZWdpc3Rlcigp
KS51bmJveGVkQ2VsbCgpKSk7CisgICAgICAgICAgICBicmVhazsKKworI2lmIFVTRShKU1ZBTFVF
MzJfNjQpCisgICAgICAgIGNhc2UgVW5ib3hlZEJvb2xlYW5JbkdQUjoKKyAgICAgICAgICAgIGZy
YW1lLnNldE9wZXJhbmQob3BlcmFuZCwganNCb29sZWFuKGNwdS5ncHI8Ym9vbD4ocmVjb3Zlcnku
Z3ByKCkpKSk7CisgICAgICAgICAgICBicmVhazsKKyNlbmRpZgorCisgICAgICAgIGNhc2UgQm9v
bGVhbkRpc3BsYWNlZEluSlNTdGFjazoKKyNpZiBVU0UoSlNWQUxVRTY0KQorICAgICAgICAgICAg
ZnJhbWUuc2V0T3BlcmFuZChvcGVyYW5kLCBleGVjLT5yKHJlY292ZXJ5LnZpcnR1YWxSZWdpc3Rl
cigpKS5qc1ZhbHVlKCkpOworI2Vsc2UKKyAgICAgICAgICAgIGZyYW1lLnNldE9wZXJhbmQob3Bl
cmFuZCwganNCb29sZWFuKGV4ZWMtPnIocmVjb3ZlcnkudmlydHVhbFJlZ2lzdGVyKCkpLmpzVmFs
dWUoKS5wYXlsb2FkKCkpKTsKKyNlbmRpZgorICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAg
Y2FzZSBVbmJveGVkSW50MzJJbkdQUjoKKyAgICAgICAgICAgIGZyYW1lLnNldE9wZXJhbmQob3Bl
cmFuZCwgSlNWYWx1ZShjcHUuZ3ByPGludDMyX3Q+KHJlY292ZXJ5LmdwcigpKSkpOworICAgICAg
ICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBJbnQzMkRpc3BsYWNlZEluSlNTdGFjazoKKyAg
ICAgICAgICAgIGZyYW1lLnNldE9wZXJhbmQob3BlcmFuZCwgSlNWYWx1ZShleGVjLT5yKHJlY292
ZXJ5LnZpcnR1YWxSZWdpc3RlcigpKS51bmJveGVkSW50MzIoKSkpOworICAgICAgICAgICAgYnJl
YWs7CisKKyNpZiBVU0UoSlNWQUxVRTY0KQorICAgICAgICBjYXNlIFVuYm94ZWRJbnQ1MkluR1BS
OgorICAgICAgICAgICAgZnJhbWUuc2V0T3BlcmFuZChvcGVyYW5kLCBKU1ZhbHVlKGNwdS5ncHI8
aW50NjRfdD4ocmVjb3ZlcnkuZ3ByKCkpID4+IEpTVmFsdWU6OmludDUyU2hpZnRBbW91bnQpKTsK
KyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgSW50NTJEaXNwbGFjZWRJbkpTU3Rh
Y2s6CisgICAgICAgICAgICBmcmFtZS5zZXRPcGVyYW5kKG9wZXJhbmQsIEpTVmFsdWUoZXhlYy0+
cihyZWNvdmVyeS52aXJ0dWFsUmVnaXN0ZXIoKSkudW5ib3hlZEludDUyKCkpKTsKKyAgICAgICAg
ICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgVW5ib3hlZFN0cmljdEludDUySW5HUFI6CisgICAg
ICAgICAgICBmcmFtZS5zZXRPcGVyYW5kKG9wZXJhbmQsIEpTVmFsdWUoY3B1LmdwcjxpbnQ2NF90
PihyZWNvdmVyeS5ncHIoKSkpKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2Ug
U3RyaWN0SW50NTJEaXNwbGFjZWRJbkpTU3RhY2s6CisgICAgICAgICAgICBmcmFtZS5zZXRPcGVy
YW5kKG9wZXJhbmQsIEpTVmFsdWUoZXhlYy0+cihyZWNvdmVyeS52aXJ0dWFsUmVnaXN0ZXIoKSku
dW5ib3hlZFN0cmljdEludDUyKCkpKTsKKyAgICAgICAgICAgIGJyZWFrOworI2VuZGlmCisKKyAg
ICAgICAgY2FzZSBVbmJveGVkRG91YmxlSW5GUFI6CisgICAgICAgICAgICBmcmFtZS5zZXRPcGVy
YW5kKG9wZXJhbmQsIEpTVmFsdWUoSlNWYWx1ZTo6RW5jb2RlQXNEb3VibGUsIHB1cmlmeU5hTihj
cHUuZnByKHJlY292ZXJ5LmZwcigpKSkpKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAg
IGNhc2UgRG91YmxlRGlzcGxhY2VkSW5KU1N0YWNrOgorICAgICAgICAgICAgZnJhbWUuc2V0T3Bl
cmFuZChvcGVyYW5kLCBKU1ZhbHVlKEpTVmFsdWU6OkVuY29kZUFzRG91YmxlLCBwdXJpZnlOYU4o
ZXhlYy0+cihyZWNvdmVyeS52aXJ0dWFsUmVnaXN0ZXIoKSkudW5ib3hlZERvdWJsZSgpKSkpOwor
ICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBDb25zdGFudDoKKyAgICAgICAgICAg
IGZyYW1lLnNldE9wZXJhbmQob3BlcmFuZCwgcmVjb3ZlcnkuY29uc3RhbnQoKSk7CisgICAgICAg
ICAgICBicmVhazsKKworICAgICAgICBjYXNlIERpcmVjdEFyZ3VtZW50c1RoYXRXZXJlTm90Q3Jl
YXRlZDoKKyAgICAgICAgY2FzZSBDbG9uZWRBcmd1bWVudHNUaGF0V2VyZU5vdENyZWF0ZWQ6Cisg
ICAgICAgICAgICAvLyBEb24ndCBkbyB0aGlzLCB5ZXQuCisgICAgICAgICAgICBicmVhazsKKwor
ICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgUkVMRUFTRV9BU1NFUlRfTk9UX1JFQUNIRUQo
KTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gUmVzdG9y
ZSB0aGUgREZHIGNhbGxlZSBzYXZlcyBhbmQgdGhlbiBzYXZlIHRoZSBvbmVzIHRoZSBiYXNlbGlu
ZSBKSVQgdXNlcy4KKyAgICByZXN0b3JlQ2FsbGVlU2F2ZXNGb3IoY29udGV4dCwgY29kZUJsb2Nr
KTsKKyAgICBzYXZlQ2FsbGVlU2F2ZXNGb3IoY29udGV4dCwgYmFzZWxpbmVDb2RlQmxvY2spOwor
CisgICAgLy8gVGhlIHRhZyByZWdpc3RlcnMgYXJlIG5lZWRlZCB0byBtYXRlcmlhbGl6ZSByZWNv
dmVyaWVzIGJlbG93LgorI2lmIFVTRShKU1ZBTFVFNjQpCisgICAgY3B1LmdwcihHUFJJbmZvOjp0
YWdUeXBlTnVtYmVyUmVnaXN0ZXIpID0gVGFnVHlwZU51bWJlcjsKKyAgICBjcHUuZ3ByKEdQUklu
Zm86OnRhZ01hc2tSZWdpc3RlcikgPSBUYWdUeXBlTnVtYmVyIHwgVGFnQml0VHlwZU90aGVyOwor
I2VuZGlmCisKKyAgICBpZiAoZXhpdC5pc0V4Y2VwdGlvbkhhbmRsZXIoKSkKKyAgICAgICAgY29w
eUNhbGxlZVNhdmVzVG9WTUVudHJ5RnJhbWVDYWxsZWVTYXZlc0J1ZmZlcihjb250ZXh0KTsKKwor
ICAgIC8vIE5vdyB0aGF0IHRoaW5ncyBvbiB0aGUgc3RhY2sgYXJlIHJlY292ZXJlZCwgZG8gdGhl
IGFyZ3VtZW50cyByZWNvdmVyeS4gV2UgYXNzdW1lIHRoYXQgYXJndW1lbnRzCisgICAgLy8gcmVj
b3ZlcmllcyBkb24ndCByZWN1cnNpdmVseSByZWZlciB0byBlYWNoIG90aGVyLiBCdXQsIHdlIGRv
bid0IHRyeSB0byBhc3N1bWUgdGhhdCB0aGV5IG9ubHkKKyAgICAvLyByZWZlciB0byBjZXJ0YWlu
IHJhbmdlcyBvZiBsb2NhbHMuIEhlbmNlIHdoeSB3ZSBuZWVkIHRvIGRvIHRoaXMgaGVyZSwgb25j
ZSB0aGUgc3RhY2sgaXMgc2Vuc2libGUuCisgICAgLy8gTm90ZSB0aGF0IHdlIGFsc28gcm91Z2hs
eSBhc3N1bWUgdGhhdCB0aGUgYXJndW1lbnRzIG1pZ2h0IHN0aWxsIGJlIG1hdGVyaWFsaXplZCBv
dXRzaWRlIG9mIGl0cworICAgIC8vIGlubGluZSBjYWxsIGZyYW1lIHNjb3BlIC0gYnV0IGZvciBu
b3cgdGhlIERGRyB3b3VsZG4ndCBkbyB0aGF0LgorCisgICAgREZHOjplbWl0UmVzdG9yZUFyZ3Vt
ZW50cyhjb250ZXh0LCBjb2RlQmxvY2ssIGRmZ0pJVENvZGUsIG9wZXJhbmRzKTsKKworICAgIC8v
IEFkanVzdCB0aGUgb2xkIEpJVCdzIGV4ZWN1dGUgY291bnRlci4gU2luY2Ugd2UgYXJlIGV4aXRp
bmcgT1NSLCB3ZSBrbm93CisgICAgLy8gdGhhdCBhbGwgbmV3IGNhbGxzIGludG8gdGhpcyBjb2Rl
IHdpbGwgZ28gdG8gdGhlIG5ldyBKSVQsIHNvIHRoZSBleGVjdXRlCisgICAgLy8gY291bnRlciBv
bmx5IGFmZmVjdHMgY2FsbCBmcmFtZXMgdGhhdCBwZXJmb3JtZWQgT1NSIGV4aXQgYW5kIGNhbGwg
ZnJhbWVzCisgICAgLy8gdGhhdCB3ZXJlIHN0aWxsIGV4ZWN1dGluZyB0aGUgb2xkIEpJVCBhdCB0
aGUgdGltZSBvZiBhbm90aGVyIGNhbGwgZnJhbWUncworICAgIC8vIE9TUiBleGl0LiBXZSB3YW50
IHRvIGVuc3VyZSB0aGF0IHRoZSBmb2xsb3dpbmcgaXMgdHJ1ZToKKyAgICAvLworICAgIC8vIChh
KSBDb2RlIHRoZSBwZXJmb3JtcyBhbiBPU1IgZXhpdCBnZXRzIGEgY2hhbmNlIHRvIHJlZW50ZXIg
b3B0aW1pemVkCisgICAgLy8gICAgIGNvZGUgZXZlbnR1YWxseSwgc2luY2Ugb3B0aW1pemVkIGNv
ZGUgaXMgZmFzdGVyLiBCdXQgd2UgZG9uJ3QKKyAgICAvLyAgICAgd2FudCB0byBkbyBzdWNoIHJl
ZW50ZXJ5IHRvbyBhZ2dyZXNzaXZlbHkgKHNlZSAoYykgYmVsb3cpLgorICAgIC8vCisgICAgLy8g
KGIpIElmIHRoZXJlIGlzIGNvZGUgb24gdGhlIGNhbGwgc3RhY2sgdGhhdCBpcyBzdGlsbCBydW5u
aW5nIHRoZSBvbGQKKyAgICAvLyAgICAgSklUJ3MgY29kZSBhbmQgaGFzIG5ldmVyIE9TUidkLCB0
aGVuIGl0IHNob3VsZCBnZXQgYSBjaGFuY2UgdG8KKyAgICAvLyAgICAgcGVyZm9ybSBPU1IgZW50
cnkgZGVzcGl0ZSB0aGUgZmFjdCB0aGF0IHdlJ3ZlIGV4aXRlZC4KKyAgICAvLworICAgIC8vIChj
KSBDb2RlIHRoZSBwZXJmb3JtcyBhbiBPU1IgZXhpdCBzaG91bGQgbm90IGltbWVkaWF0ZWx5IHJl
dHJ5IE9TUgorICAgIC8vICAgICBlbnRyeSwgc2luY2UgYm90aCBmb3JtcyBvZiBPU1IgYXJlIGV4
cGVuc2l2ZS4gT1NSIGVudHJ5IGlzCisgICAgLy8gICAgIHBhcnRpY3VsYXJseSBleHBlbnNpdmUu
CisgICAgLy8KKyAgICAvLyAoZCkgRnJlcXVlbnQgT1NSIGZhaWx1cmVzLCBldmVuIHRob3NlIHRo
YXQgZG8gbm90IHJlc3VsdCBpbiB0aGUgY29kZQorICAgIC8vICAgICBydW5uaW5nIGluIGEgaG90
IGxvb3AsIHJlc3VsdCBpbiByZWNvbXBpbGF0aW9uIGdldHRpbmcgdHJpZ2dlcmVkLgorICAgIC8v
CisgICAgLy8gVG8gZW5zdXJlIChjKSwgd2UnZCBsaWtlIHRvIHNldCB0aGUgZXhlY3V0ZSBjb3Vu
dGVyIHRvCisgICAgLy8gY291bnRlclZhbHVlRm9yT3B0aW1pemVBZnRlcldhcm1VcCgpLiBUaGlz
IHNlZW1zIGxpa2UgaXQgd291bGQgZW5kYW5nZXIKKyAgICAvLyAoYSkgYW5kIChiKSwgc2luY2Ug
dGhlbiBldmVyeSBPU1IgZXhpdCB3b3VsZCBkZWxheSB0aGUgb3Bwb3J0dW5pdHkgZm9yCisgICAg
Ly8gZXZlcnkgY2FsbCBmcmFtZSB0byBwZXJmb3JtIE9TUiBlbnRyeS4gRXNzZW50aWFsbHksIGlm
IE9TUiBleGl0IGhhcHBlbnMKKyAgICAvLyBmcmVxdWVudGx5IGFuZCB0aGUgZnVuY3Rpb24gaGFz
IGZldyBsb29wcywgdGhlbiB0aGUgY291bnRlciB3aWxsIG5ldmVyCisgICAgLy8gYmVjb21lIG5v
bi1uZWdhdGl2ZSBhbmQgT1NSIGVudHJ5IHdpbGwgbmV2ZXIgYmUgdHJpZ2dlcmVkLiBPU1IgZW50
cnkKKyAgICAvLyB3aWxsIG9ubHkgaGFwcGVuIGlmIGEgbG9vcCBnZXRzIGhvdCBpbiB0aGUgb2xk
IEpJVCwgd2hpY2ggZG9lcyBhIHByZXR0eQorICAgIC8vIGdvb2Qgam9iIG9mIGVuc3VyaW5nIChh
KSBhbmQgKGIpLiBCdXQgdGhhdCBkb2Vzbid0IHRha2UgY2FyZSBvZiAoZCksCisgICAgLy8gc2lu
Y2UgZWFjaCBzcGVjdWxhdGlvbiBmYWlsdXJlIHdvdWxkIHJlc2V0IHRoZSBleGVjdXRlIGNvdW50
ZXIuCisgICAgLy8gU28gd2UgY2hlY2sgaGVyZSBpZiB0aGUgbnVtYmVyIG9mIHNwZWN1bGF0aW9u
IGZhaWx1cmVzIGlzIHNpZ25pZmljYW50bHkKKyAgICAvLyBsYXJnZXIgdGhhbiB0aGUgbnVtYmVy
IG9mIHN1Y2Nlc3NlcyAod2Ugd2FudCA5MCUgc3VjY2VzcyByYXRlKSwgYW5kIGlmCisgICAgLy8g
dGhlcmUgaGF2ZSBiZWVuIGEgbGFyZ2UgZW5vdWdoIG51bWJlciBvZiBmYWlsdXJlcy4gSWYgc28s
IHdlIHNldCB0aGUKKyAgICAvLyBjb3VudGVyIHRvIDA7IG90aGVyd2lzZSB3ZSBzZXQgdGhlIGNv
dW50ZXIgdG8KKyAgICAvLyBjb3VudGVyVmFsdWVGb3JPcHRpbWl6ZUFmdGVyV2FybVVwKCkuCisK
KyAgICBpZiAoVU5MSUtFTFkoY29kZUJsb2NrLT51cGRhdGVPU1JFeGl0Q291bnRlckFuZENoZWNr
SWZOZWVkVG9SZW9wdGltaXplKGV4aXRTdGF0ZSkgPT0gQ29kZUJsb2NrOjpPcHRpbWl6ZUFjdGlv
bjo6UmVvcHRpbWl6ZU5vdykpCisgICAgICAgIHRyaWdnZXJSZW9wdGltaXphdGlvbk5vdyhiYXNl
bGluZUNvZGVCbG9jaywgJmV4aXQpOworCisgICAgcmVpZnlJbmxpbmVkQ2FsbEZyYW1lcyhjb250
ZXh0LCBiYXNlbGluZUNvZGVCbG9jaywgZXhpdCk7CisgICAgYWRqdXN0QW5kSnVtcFRvVGFyZ2V0
KGNvbnRleHQsIHZtLCBjb2RlQmxvY2ssIGJhc2VsaW5lQ29kZUJsb2NrLCBleGl0KTsKK30KKwor
c3RhdGljIHZvaWQgcmVpZnlJbmxpbmVkQ2FsbEZyYW1lcyhDb250ZXh0JiBjb250ZXh0LCBDb2Rl
QmxvY2sqIG91dGVybW9zdEJhc2VsaW5lQ29kZUJsb2NrLCBjb25zdCBPU1JFeGl0QmFzZSYgZXhp
dCkKK3sKKyAgICBhdXRvJiBjcHUgPSBjb250ZXh0LmNwdTsKKyAgICBGcmFtZSBmcmFtZShjcHUu
ZnAoKSwgY29udGV4dC5zdGFjaygpKTsKKworICAgIC8vIEZJWE1FOiBXZSBzaG91bGRuJ3QgbGVh
dmUgaG9sZXMgb24gdGhlIHN0YWNrIHdoZW4gcGVyZm9ybWluZyBhbiBPU1IgZXhpdAorICAgIC8v
IGluIHByZXNlbmNlIG9mIGlubGluZWQgdGFpbCBjYWxscy4KKyAgICAvLyBodHRwczovL2J1Z3Mu
d2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MTQ3NTExCisgICAgQVNTRVJUKG91dGVybW9zdEJh
c2VsaW5lQ29kZUJsb2NrLT5qaXRUeXBlKCkgPT0gSklUQ29kZTo6QmFzZWxpbmVKSVQpOworICAg
IGZyYW1lLnNldE9wZXJhbmQ8Q29kZUJsb2NrKj4oQ2FsbEZyYW1lU2xvdDo6Y29kZUJsb2NrLCBv
dXRlcm1vc3RCYXNlbGluZUNvZGVCbG9jayk7CisKKyAgICBjb25zdCBDb2RlT3JpZ2luKiBjb2Rl
T3JpZ2luOworICAgIGZvciAoY29kZU9yaWdpbiA9ICZleGl0Lm1fY29kZU9yaWdpbjsgY29kZU9y
aWdpbiAmJiBjb2RlT3JpZ2luLT5pbmxpbmVDYWxsRnJhbWU7IGNvZGVPcmlnaW4gPSBjb2RlT3Jp
Z2luLT5pbmxpbmVDYWxsRnJhbWUtPmdldENhbGxlclNraXBwaW5nVGFpbENhbGxzKCkpIHsKKyAg
ICAgICAgSW5saW5lQ2FsbEZyYW1lKiBpbmxpbmVDYWxsRnJhbWUgPSBjb2RlT3JpZ2luLT5pbmxp
bmVDYWxsRnJhbWU7CisgICAgICAgIENvZGVCbG9jayogYmFzZWxpbmVDb2RlQmxvY2sgPSBiYXNl
bGluZUNvZGVCbG9ja0Zvck9yaWdpbkFuZEJhc2VsaW5lQ29kZUJsb2NrKCpjb2RlT3JpZ2luLCBv
dXRlcm1vc3RCYXNlbGluZUNvZGVCbG9jayk7CisgICAgICAgIElubGluZUNhbGxGcmFtZTo6S2lu
ZCB0cnVlQ2FsbGVyQ2FsbEtpbmQ7CisgICAgICAgIENvZGVPcmlnaW4qIHRydWVDYWxsZXIgPSBp
bmxpbmVDYWxsRnJhbWUtPmdldENhbGxlclNraXBwaW5nVGFpbENhbGxzKCZ0cnVlQ2FsbGVyQ2Fs
bEtpbmQpOworICAgICAgICB2b2lkKiBjYWxsZXJGcmFtZSA9IGNwdS5mcCgpOworCisgICAgICAg
IGlmICghdHJ1ZUNhbGxlcikgeworICAgICAgICAgICAgQVNTRVJUKGlubGluZUNhbGxGcmFtZS0+
aXNUYWlsKCkpOworICAgICAgICAgICAgdm9pZCogcmV0dXJuUEMgPSBmcmFtZS5nZXQ8dm9pZCo+
KENhbGxGcmFtZTo6cmV0dXJuUENPZmZzZXQoKSk7CisgICAgICAgICAgICBmcmFtZS5zZXQ8dm9p
ZCo+KGlubGluZUNhbGxGcmFtZS0+cmV0dXJuUENPZmZzZXQoKSwgcmV0dXJuUEMpOworICAgICAg
ICAgICAgY2FsbGVyRnJhbWUgPSBmcmFtZS5nZXQ8dm9pZCo+KENhbGxGcmFtZTo6Y2FsbGVyRnJh
bWVPZmZzZXQoKSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBDb2RlQmxvY2sqIGJh
c2VsaW5lQ29kZUJsb2NrRm9yQ2FsbGVyID0gYmFzZWxpbmVDb2RlQmxvY2tGb3JPcmlnaW5BbmRC
YXNlbGluZUNvZGVCbG9jaygqdHJ1ZUNhbGxlciwgb3V0ZXJtb3N0QmFzZWxpbmVDb2RlQmxvY2sp
OworICAgICAgICAgICAgdW5zaWduZWQgY2FsbEJ5dGVjb2RlSW5kZXggPSB0cnVlQ2FsbGVyLT5i
eXRlY29kZUluZGV4OworICAgICAgICAgICAgdm9pZCoganVtcFRhcmdldCA9IG51bGxwdHI7CisK
KyAgICAgICAgICAgIHN3aXRjaCAodHJ1ZUNhbGxlckNhbGxLaW5kKSB7CisgICAgICAgICAgICBj
YXNlIElubGluZUNhbGxGcmFtZTo6Q2FsbDoKKyAgICAgICAgICAgIGNhc2UgSW5saW5lQ2FsbEZy
YW1lOjpDb25zdHJ1Y3Q6CisgICAgICAgICAgICBjYXNlIElubGluZUNhbGxGcmFtZTo6Q2FsbFZh
cmFyZ3M6CisgICAgICAgICAgICBjYXNlIElubGluZUNhbGxGcmFtZTo6Q29uc3RydWN0VmFyYXJn
czoKKyAgICAgICAgICAgIGNhc2UgSW5saW5lQ2FsbEZyYW1lOjpUYWlsQ2FsbDoKKyAgICAgICAg
ICAgIGNhc2UgSW5saW5lQ2FsbEZyYW1lOjpUYWlsQ2FsbFZhcmFyZ3M6IHsKKyAgICAgICAgICAg
ICAgICBDYWxsTGlua0luZm8qIGNhbGxMaW5rSW5mbyA9CisgICAgICAgICAgICAgICAgICAgIGJh
c2VsaW5lQ29kZUJsb2NrRm9yQ2FsbGVyLT5nZXRDYWxsTGlua0luZm9Gb3JCeXRlY29kZUluZGV4
KGNhbGxCeXRlY29kZUluZGV4KTsKKyAgICAgICAgICAgICAgICBSRUxFQVNFX0FTU0VSVChjYWxs
TGlua0luZm8pOworCisgICAgICAgICAgICAgICAganVtcFRhcmdldCA9IGNhbGxMaW5rSW5mby0+
Y2FsbFJldHVybkxvY2F0aW9uKCkuZXhlY3V0YWJsZUFkZHJlc3MoKTsKKyAgICAgICAgICAgICAg
ICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgY2FzZSBJbmxpbmVDYWxsRnJh
bWU6OkdldHRlckNhbGw6CisgICAgICAgICAgICBjYXNlIElubGluZUNhbGxGcmFtZTo6U2V0dGVy
Q2FsbDogeworICAgICAgICAgICAgICAgIFN0cnVjdHVyZVN0dWJJbmZvKiBzdHViSW5mbyA9Cisg
ICAgICAgICAgICAgICAgICAgIGJhc2VsaW5lQ29kZUJsb2NrRm9yQ2FsbGVyLT5maW5kU3R1Yklu
Zm8oQ29kZU9yaWdpbihjYWxsQnl0ZWNvZGVJbmRleCkpOworICAgICAgICAgICAgICAgIFJFTEVB
U0VfQVNTRVJUKHN0dWJJbmZvKTsKKworICAgICAgICAgICAgICAgIGp1bXBUYXJnZXQgPSBzdHVi
SW5mby0+ZG9uZUxvY2F0aW9uKCkuZXhlY3V0YWJsZUFkZHJlc3MoKTsKKyAgICAgICAgICAgICAg
ICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAg
ICAgICAgICBSRUxFQVNFX0FTU0VSVF9OT1RfUkVBQ0hFRCgpOworICAgICAgICAgICAgfQorCisg
ICAgICAgICAgICBpZiAodHJ1ZUNhbGxlci0+aW5saW5lQ2FsbEZyYW1lKQorICAgICAgICAgICAg
ICAgIGNhbGxlckZyYW1lID0gY3B1LmZwPHVpbnQ4X3QqPigpICsgdHJ1ZUNhbGxlci0+aW5saW5l
Q2FsbEZyYW1lLT5zdGFja09mZnNldCAqIHNpemVvZihFbmNvZGVkSlNWYWx1ZSk7CisKKyAgICAg
ICAgICAgIGZyYW1lLnNldDx2b2lkKj4oaW5saW5lQ2FsbEZyYW1lLT5yZXR1cm5QQ09mZnNldCgp
LCBqdW1wVGFyZ2V0KTsKKyAgICAgICAgfQorCisgICAgICAgIGZyYW1lLnNldE9wZXJhbmQ8dm9p
ZCo+KGlubGluZUNhbGxGcmFtZS0+c3RhY2tPZmZzZXQgKyBDYWxsRnJhbWVTbG90Ojpjb2RlQmxv
Y2ssIGJhc2VsaW5lQ29kZUJsb2NrKTsKKworICAgICAgICAvLyBSZXN0b3JlIHRoZSBpbmxpbmUg
Y2FsbCBmcmFtZSdzIGNhbGxlZSBzYXZlIHJlZ2lzdGVycy4KKyAgICAgICAgLy8gSWYgdGhpcyBp
bmxpbmVkIGZyYW1lIGlzIGEgdGFpbCBjYWxsIHRoYXQgd2lsbCByZXR1cm4gYmFjayB0byB0aGUg
b3JpZ2luYWwgY2FsbGVyLCB3ZSBuZWVkIHRvCisgICAgICAgIC8vIGNvcHkgdGhlIHByaW9yIGNv
bnRlbnRzIG9mIHRoZSB0YWcgcmVnaXN0ZXJzIGFscmVhZHkgc2F2ZWQgZm9yIHRoZSBvdXRlciBm
cmFtZSB0byB0aGlzIGZyYW1lLgorICAgICAgICBzYXZlT3JDb3B5Q2FsbGVlU2F2ZXNGb3IoY29u
dGV4dCwgYmFzZWxpbmVDb2RlQmxvY2ssIFZpcnR1YWxSZWdpc3RlcihpbmxpbmVDYWxsRnJhbWUt
PnN0YWNrT2Zmc2V0KSwgIXRydWVDYWxsZXIpOworCisgICAgICAgIGlmICghaW5saW5lQ2FsbEZy
YW1lLT5pc1ZhcmFyZ3MoKSkKKyAgICAgICAgICAgIGZyYW1lLnNldE9wZXJhbmQ8dWludDMyX3Q+
KGlubGluZUNhbGxGcmFtZS0+c3RhY2tPZmZzZXQgKyBDYWxsRnJhbWVTbG90Ojphcmd1bWVudENv
dW50LCBQYXlsb2FkT2Zmc2V0LCBpbmxpbmVDYWxsRnJhbWUtPmFyZ3VtZW50Q291bnRJbmNsdWRp
bmdUaGlzKTsKKyAgICAgICAgQVNTRVJUKGNhbGxlckZyYW1lKTsKKyAgICAgICAgZnJhbWUuc2V0
PHZvaWQqPihpbmxpbmVDYWxsRnJhbWUtPmNhbGxlckZyYW1lT2Zmc2V0KCksIGNhbGxlckZyYW1l
KTsKKyNpZiBVU0UoSlNWQUxVRTY0KQorICAgICAgICB1aW50MzJfdCBsb2NhdGlvbkJpdHMgPSBD
YWxsU2l0ZUluZGV4KGNvZGVPcmlnaW4tPmJ5dGVjb2RlSW5kZXgpLmJpdHMoKTsKKyAgICAgICAg
ZnJhbWUuc2V0T3BlcmFuZDx1aW50MzJfdD4oaW5saW5lQ2FsbEZyYW1lLT5zdGFja09mZnNldCAr
IENhbGxGcmFtZVNsb3Q6OmFyZ3VtZW50Q291bnQsIFRhZ09mZnNldCwgbG9jYXRpb25CaXRzKTsK
KyAgICAgICAgaWYgKCFpbmxpbmVDYWxsRnJhbWUtPmlzQ2xvc3VyZUNhbGwpCisgICAgICAgICAg
ICBmcmFtZS5zZXRPcGVyYW5kKGlubGluZUNhbGxGcmFtZS0+c3RhY2tPZmZzZXQgKyBDYWxsRnJh
bWVTbG90OjpjYWxsZWUsIEpTVmFsdWUoaW5saW5lQ2FsbEZyYW1lLT5jYWxsZWVDb25zdGFudCgp
KSk7CisjZWxzZSAvLyBVU0UoSlNWQUxVRTY0KSAvLyBzbyB0aGlzIGlzIHRoZSAzMi1iaXQgcGFy
dAorICAgICAgICBJbnN0cnVjdGlvbiogaW5zdHJ1Y3Rpb24gPSBiYXNlbGluZUNvZGVCbG9jay0+
aW5zdHJ1Y3Rpb25zKCkuYmVnaW4oKSArIGNvZGVPcmlnaW4tPmJ5dGVjb2RlSW5kZXg7CisgICAg
ICAgIHVpbnQzMl90IGxvY2F0aW9uQml0cyA9IENhbGxTaXRlSW5kZXgoaW5zdHJ1Y3Rpb24pLmJp
dHMoKTsKKyAgICAgICAgZnJhbWUuc2V0T3BlcmFuZDx1aW50MzJfdD4oaW5saW5lQ2FsbEZyYW1l
LT5zdGFja09mZnNldCArIENhbGxGcmFtZVNsb3Q6OmFyZ3VtZW50Q291bnQsIFRhZ09mZnNldCwg
bG9jYXRpb25CaXRzKTsKKyAgICAgICAgZnJhbWUuc2V0T3BlcmFuZDx1aW50MzJfdD4oaW5saW5l
Q2FsbEZyYW1lLT5zdGFja09mZnNldCArIENhbGxGcmFtZVNsb3Q6OmNhbGxlZSwgVGFnT2Zmc2V0
LCBzdGF0aWNfY2FzdDx1aW50MzJfdD4oSlNWYWx1ZTo6Q2VsbFRhZykpOworICAgICAgICBpZiAo
IWlubGluZUNhbGxGcmFtZS0+aXNDbG9zdXJlQ2FsbCkKKyAgICAgICAgICAgIGZyYW1lLnNldE9w
ZXJhbmQoaW5saW5lQ2FsbEZyYW1lLT5zdGFja09mZnNldCArIENhbGxGcmFtZVNsb3Q6OmNhbGxl
ZSwgUGF5bG9hZE9mZnNldCwgaW5saW5lQ2FsbEZyYW1lLT5jYWxsZWVDb25zdGFudCgpKTsKKyNl
bmRpZiAvLyBVU0UoSlNWQUxVRTY0KSAvLyBlbmRpbmcgdGhlICNlbHNlIHBhcnQsIHNvIGRpcmVj
dGx5IGFib3ZlIGlzIHRoZSAzMi1iaXQgcGFydAorICAgIH0KKworICAgIC8vIERvbid0IG5lZWQg
dG8gc2V0IHRoZSB0b3BsZXZlbCBjb2RlIG9yaWdpbiBpZiB3ZSBvbmx5IGRpZCBpbmxpbmUgdGFp
bCBjYWxscworICAgIGlmIChjb2RlT3JpZ2luKSB7CisjaWYgVVNFKEpTVkFMVUU2NCkKKyAgICAg
ICAgdWludDMyX3QgbG9jYXRpb25CaXRzID0gQ2FsbFNpdGVJbmRleChjb2RlT3JpZ2luLT5ieXRl
Y29kZUluZGV4KS5iaXRzKCk7CisjZWxzZQorICAgICAgICBJbnN0cnVjdGlvbiogaW5zdHJ1Y3Rp
b24gPSBvdXRlcm1vc3RCYXNlbGluZUNvZGVCbG9jay0+aW5zdHJ1Y3Rpb25zKCkuYmVnaW4oKSAr
IGNvZGVPcmlnaW4tPmJ5dGVjb2RlSW5kZXg7CisgICAgICAgIHVpbnQzMl90IGxvY2F0aW9uQml0
cyA9IENhbGxTaXRlSW5kZXgoaW5zdHJ1Y3Rpb24pLmJpdHMoKTsKKyNlbmRpZgorICAgICAgICBm
cmFtZS5zZXRPcGVyYW5kPHVpbnQzMl90PihDYWxsRnJhbWVTbG90Ojphcmd1bWVudENvdW50LCBU
YWdPZmZzZXQsIGxvY2F0aW9uQml0cyk7CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBhZGp1c3RB
bmRKdW1wVG9UYXJnZXQoQ29udGV4dCYgY29udGV4dCwgVk0mIHZtLCBDb2RlQmxvY2sqIGNvZGVC
bG9jaywgQ29kZUJsb2NrKiBiYXNlbGluZUNvZGVCbG9jaywgT1NSRXhpdCYgZXhpdCkKK3sKKyAg
ICBPU1JFeGl0U3RhdGUqIGV4aXRTdGF0ZSA9IGV4aXQuZXhpdFN0YXRlLmdldCgpOworCisgICAg
V1RGOjpzdG9yZUxvYWRGZW5jZSgpOyAvLyBUaGUgb3B0aW1pemluZyBjb21waWxlciBleHBlY3Rz
IHRoYXQgdGhlIE9TUiBleGl0IG1lY2hhbmlzbSB3aWxsIGV4ZWN1dGUgdGhpcyBmZW5jZS4KKyAg
ICB2bS5oZWFwLndyaXRlQmFycmllcihiYXNlbGluZUNvZGVCbG9jayk7CisKKyAgICAvLyBXZSBi
YXJyaWVyIGFsbCBpbmxpbmVkIGZyYW1lcyAtLSBhbmQgbm90IGp1c3QgdGhlIGN1cnJlbnQgaW5s
aW5lIHN0YWNrIC0tCisgICAgLy8gYmVjYXVzZSB3ZSBkb24ndCBrbm93IHdoaWNoIGlubGluZWQg
ZnVuY3Rpb24gb3ducyB0aGUgdmFsdWUgcHJvZmlsZSB0aGF0CisgICAgLy8gd2UnbGwgdXBkYXRl
IHdoZW4gd2UgZXhpdC4gSW4gdGhlIGNhc2Ugb2YgImYoKSB7IGEoKTsgYigpOyB9IiwgaWYgYm90
aAorICAgIC8vIGEgYW5kIGIgYXJlIGlubGluZWQsIHdlIG1pZ2h0IGV4aXQgaW5zaWRlIGIgZHVl
IHRvIGEgYmFkIHZhbHVlIGxvYWRlZAorICAgIC8vIGZyb20gYS4KKyAgICAvLyBGSVhNRTogTWV0
aG9kT2ZHZXR0aW5nQVZhbHVlUHJvZmlsZSBzaG91bGQgcmVtZW1iZXIgd2hpY2ggQ29kZUJsb2Nr
IG93bnMKKyAgICAvLyB0aGUgdmFsdWUgcHJvZmlsZS4KKyAgICBJbmxpbmVDYWxsRnJhbWVTZXQq
IGlubGluZUNhbGxGcmFtZXMgPSBjb2RlQmxvY2stPmppdENvZGUoKS0+ZGZnQ29tbW9uKCktPmlu
bGluZUNhbGxGcmFtZXMuZ2V0KCk7CisgICAgaWYgKGlubGluZUNhbGxGcmFtZXMpIHsKKyAgICAg
ICAgZm9yIChJbmxpbmVDYWxsRnJhbWUqIGlubGluZUNhbGxGcmFtZSA6ICppbmxpbmVDYWxsRnJh
bWVzKQorICAgICAgICAgICAgdm0uaGVhcC53cml0ZUJhcnJpZXIoaW5saW5lQ2FsbEZyYW1lLT5i
YXNlbGluZUNvZGVCbG9jay5nZXQoKSk7CisgICAgfQorCisgICAgaWYgKGV4aXQubV9jb2RlT3Jp
Z2luLmlubGluZUNhbGxGcmFtZSkKKyAgICAgICAgY29udGV4dC5mcCgpID0gY29udGV4dC5mcDx1
aW50OF90Kj4oKSArIGV4aXQubV9jb2RlT3JpZ2luLmlubGluZUNhbGxGcmFtZS0+c3RhY2tPZmZz
ZXQgKiBzaXplb2YoRW5jb2RlZEpTVmFsdWUpOworCisgICAgdm9pZCoganVtcFRhcmdldCA9IGV4
aXRTdGF0ZS0+anVtcFRhcmdldDsKKyAgICBBU1NFUlQoanVtcFRhcmdldCk7CisKKyAgICBpZiAo
ZXhpdC5pc0V4Y2VwdGlvbkhhbmRsZXIoKSkgeworICAgICAgICAvLyBTaW5jZSB3ZSdyZSBqdW1w
aW5nIHRvIG9wX2NhdGNoLCB3ZSBuZWVkIHRvIHNldCBjYWxsRnJhbWVGb3JDYXRjaC4KKyAgICAg
ICAgdm0uY2FsbEZyYW1lRm9yQ2F0Y2ggPSBjb250ZXh0LmZwPEV4ZWNTdGF0ZSo+KCk7CisgICAg
fQorCisgICAgdm0udG9wQ2FsbEZyYW1lID0gY29udGV4dC5mcDxFeGVjU3RhdGUqPigpOworICAg
IGNvbnRleHQucGMoKSA9IGp1bXBUYXJnZXQ7Cit9CisKK3N0YXRpYyB2b2lkIHByaW50T1NSRXhp
dChDb250ZXh0JiBjb250ZXh0LCB1aW50MzJfdCBvc3JFeGl0SW5kZXgsIGNvbnN0IE9TUkV4aXQm
IGV4aXQpCit7CisgICAgRXhlY1N0YXRlKiBleGVjID0gY29udGV4dC5mcDxFeGVjU3RhdGUqPigp
OworICAgIENvZGVCbG9jayogY29kZUJsb2NrID0gZXhlYy0+Y29kZUJsb2NrKCk7CisgICAgQ29k
ZUJsb2NrKiBhbHRlcm5hdGl2ZSA9IGNvZGVCbG9jay0+YWx0ZXJuYXRpdmUoKTsKKyAgICBFeGl0
S2luZCBraW5kID0gZXhpdC5tX2tpbmQ7CisgICAgdW5zaWduZWQgYnl0ZWNvZGVPZmZzZXQgPSBl
eGl0Lm1fY29kZU9yaWdpbi5ieXRlY29kZUluZGV4OworCisgICAgZGF0YUxvZygiU3BlY3VsYXRp
b24gZmFpbHVyZSBpbiAiLCAqY29kZUJsb2NrKTsKKyAgICBkYXRhTG9nKCIgQCBleGl0ICMiLCBv
c3JFeGl0SW5kZXgsICIgKGJjIyIsIGJ5dGVjb2RlT2Zmc2V0LCAiLCAiLCBleGl0S2luZFRvU3Ry
aW5nKGtpbmQpLCAiKSB3aXRoICIpOworICAgIGlmIChhbHRlcm5hdGl2ZSkgeworICAgICAgICBk
YXRhTG9nKAorICAgICAgICAgICAgImV4ZWN1dGVDb3VudGVyID0gIiwgYWx0ZXJuYXRpdmUtPmpp
dEV4ZWN1dGVDb3VudGVyKCksCisgICAgICAgICAgICAiLCByZW9wdGltaXphdGlvblJldHJ5Q291
bnRlciA9ICIsIGFsdGVybmF0aXZlLT5yZW9wdGltaXphdGlvblJldHJ5Q291bnRlcigpLAorICAg
ICAgICAgICAgIiwgb3B0aW1pemF0aW9uRGVsYXlDb3VudGVyID0gIiwgYWx0ZXJuYXRpdmUtPm9w
dGltaXphdGlvbkRlbGF5Q291bnRlcigpKTsKKyAgICB9IGVsc2UKKyAgICAgICAgZGF0YUxvZygi
bm8gYWx0ZXJuYXRpdmUgY29kZSBibG9jayAoaS5lLiB3ZSd2ZSBiZWVuIGpldHRpc29uZWQpIik7
CisgICAgZGF0YUxvZygiLCBvc3JFeGl0Q291bnRlciA9ICIsIGNvZGVCbG9jay0+b3NyRXhpdENv
dW50ZXIoKSwgIlxuIik7CisgICAgZGF0YUxvZygiICAgIEdQUnMgYXQgdGltZSBvZiBleGl0OiIp
OworICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBHUFJJbmZvOjpudW1iZXJPZlJlZ2lzdGVy
czsgKytpKSB7CisgICAgICAgIEdQUlJlZyBncHIgPSBHUFJJbmZvOjp0b1JlZ2lzdGVyKGkpOwor
ICAgICAgICBkYXRhTG9nKCIgIiwgY29udGV4dC5ncHJOYW1lKGdwciksICI6IiwgUmF3UG9pbnRl
cihjb250ZXh0Lmdwcjx2b2lkKj4oZ3ByKSkpOworICAgIH0KKyAgICBkYXRhTG9nKCJcbiIpOwor
ICAgIGRhdGFMb2coIiAgICBGUFJzIGF0IHRpbWUgb2YgZXhpdDoiKTsKKyAgICBmb3IgKHVuc2ln
bmVkIGkgPSAwOyBpIDwgRlBSSW5mbzo6bnVtYmVyT2ZSZWdpc3RlcnM7ICsraSkgeworICAgICAg
ICBGUFJSZWcgZnByID0gRlBSSW5mbzo6dG9SZWdpc3RlcihpKTsKKyAgICAgICAgZGF0YUxvZygi
ICIsIGNvbnRleHQuZnByTmFtZShmcHIpLCAiOiIpOworICAgICAgICB1aW50NjRfdCBiaXRzID0g
Y29udGV4dC5mcHI8dWludDY0X3Q+KGZwcik7CisgICAgICAgIGRvdWJsZSB2YWx1ZSA9IGNvbnRl
eHQuZnByKGZwcik7CisgICAgICAgIGRhdGFMb2dGKCIlbGx4OiVsZiIsIHN0YXRpY19jYXN0PGxv
bmcgbG9uZz4oYml0cyksIHZhbHVlKTsKKyAgICB9CisgICAgZGF0YUxvZygiXG4iKTsKK30KKwor
Ly89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vIEpJVCBiYXNlZCBPU1IgRXhpdC4K
KwogT1NSRXhpdDo6T1NSRXhpdChFeGl0S2luZCBraW5kLCBKU1ZhbHVlU291cmNlIGpzVmFsdWVT
b3VyY2UsIE1ldGhvZE9mR2V0dGluZ0FWYWx1ZVByb2ZpbGUgdmFsdWVQcm9maWxlLCBTcGVjdWxh
dGl2ZUpJVCogaml0LCB1bnNpZ25lZCBzdHJlYW1JbmRleCwgdW5zaWduZWQgcmVjb3ZlcnlJbmRl
eCkKICAgICA6IE9TUkV4aXRCYXNlKGtpbmQsIGppdC0+bV9vcmlnaW4uZm9yRXhpdCwgaml0LT5t
X29yaWdpbi5zZW1hbnRpYywgaml0LT5tX29yaWdpbi53YXNIb2lzdGVkKQogICAgICwgbV9qc1Zh
bHVlU291cmNlKGpzVmFsdWVTb3VyY2UpCkluZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUvZGZn
L0RGR09TUkV4aXQuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvZGZnL0RG
R09TUkV4aXQuaAkocmV2aXNpb24gMjIyODA1KQorKysgU291cmNlL0phdmFTY3JpcHRDb3JlL2Rm
Zy9ERkdPU1JFeGl0LmgJKHdvcmtpbmcgY29weSkKQEAgLTI4LDE2ICsyOCwyNyBAQAogI2lmIEVO
QUJMRShERkdfSklUKQogCiAjaW5jbHVkZSAiREZHT1NSRXhpdEJhc2UuaCIKKyNpbmNsdWRlICJE
RkdWYXJpYWJsZUV2ZW50U3RyZWFtLmgiCiAjaW5jbHVkZSAiR1BSSW5mby5oIgogI2luY2x1ZGUg
Ik1hY3JvQXNzZW1ibGVyLmgiCiAjaW5jbHVkZSAiTWV0aG9kT2ZHZXR0aW5nQVZhbHVlUHJvZmls
ZS5oIgogI2luY2x1ZGUgIk9wZXJhbmRzLmgiCiAjaW5jbHVkZSAiVmFsdWVSZWNvdmVyeS5oIgor
I2luY2x1ZGUgPHd0Zi9SZWZQdHIuaD4KIAogbmFtZXNwYWNlIEpTQyB7CiAKK2NsYXNzIEFycmF5
UHJvZmlsZTsKIGNsYXNzIENDYWxsSGVscGVyczsKIAorbmFtZXNwYWNlIFByb2JlIHsKK2NsYXNz
IENvbnRleHQ7Cit9IC8vIG5hbWVzcGFjZSBQcm9iZQorCituYW1lc3BhY2UgUHJvZmlsZXIgewor
Y2xhc3MgT1NSRXhpdDsKK30gLy8gbmFtZXNwYWNlIFByb2ZpbGVyCisKIG5hbWVzcGFjZSBERkcg
ewogCiBjbGFzcyBTcGVjdWxhdGl2ZUpJVDsKQEAgLTkxLDYgKzEwMiwzOSBAQCBwcml2YXRlOgog
ICAgIFNwZWN1bGF0aW9uUmVjb3ZlcnlUeXBlIG1fdHlwZTsKIH07CiAKK2VudW0gY2xhc3MgRXh0
cmFJbml0aWFsaXphdGlvbkxldmVsOworCitzdHJ1Y3QgT1NSRXhpdFN0YXRlIDogUmVmQ291bnRl
ZDxPU1JFeGl0U3RhdGU+IHsKKyAgICBPU1JFeGl0U3RhdGUoT1NSRXhpdEJhc2UmIGV4aXQsIENv
ZGVCbG9jayogY29kZUJsb2NrLCBDb2RlQmxvY2sqIGJhc2VsaW5lQ29kZUJsb2NrLCBPcGVyYW5k
czxWYWx1ZVJlY292ZXJ5PiYgb3BlcmFuZHMsIFZlY3RvcjxVbmRlZmluZWRPcGVyYW5kU3Bhbj4m
JiB1bmRlZmluZWRPcGVyYW5kU3BhbnMsIFNwZWN1bGF0aW9uUmVjb3ZlcnkqIHJlY292ZXJ5LCBw
dHJkaWZmX3Qgc3RhY2tQb2ludGVyT2Zmc2V0LCBpbnQzMl90IGFjdGl2ZVRocmVzaG9sZCwgZG91
YmxlIG1lbW9yeVVzYWdlQWRqdXN0ZWRUaHJlc2hvbGQsIHZvaWQqIGp1bXBUYXJnZXQsIEFycmF5
UHJvZmlsZSogYXJyYXlQcm9maWxlKQorICAgICAgICA6IGV4aXQoZXhpdCkKKyAgICAgICAgLCBj
b2RlQmxvY2soY29kZUJsb2NrKQorICAgICAgICAsIGJhc2VsaW5lQ29kZUJsb2NrKGJhc2VsaW5l
Q29kZUJsb2NrKQorICAgICAgICAsIG9wZXJhbmRzKG9wZXJhbmRzKQorICAgICAgICAsIHVuZGVm
aW5lZE9wZXJhbmRTcGFucyh1bmRlZmluZWRPcGVyYW5kU3BhbnMpCisgICAgICAgICwgcmVjb3Zl
cnkocmVjb3ZlcnkpCisgICAgICAgICwgc3RhY2tQb2ludGVyT2Zmc2V0KHN0YWNrUG9pbnRlck9m
ZnNldCkKKyAgICAgICAgLCBhY3RpdmVUaHJlc2hvbGQoYWN0aXZlVGhyZXNob2xkKQorICAgICAg
ICAsIG1lbW9yeVVzYWdlQWRqdXN0ZWRUaHJlc2hvbGQobWVtb3J5VXNhZ2VBZGp1c3RlZFRocmVz
aG9sZCkKKyAgICAgICAgLCBqdW1wVGFyZ2V0KGp1bXBUYXJnZXQpCisgICAgICAgICwgYXJyYXlQ
cm9maWxlKGFycmF5UHJvZmlsZSkKKyAgICB7IH0KKworICAgIE9TUkV4aXRCYXNlJiBleGl0Owor
ICAgIENvZGVCbG9jayogY29kZUJsb2NrOworICAgIENvZGVCbG9jayogYmFzZWxpbmVDb2RlQmxv
Y2s7CisgICAgT3BlcmFuZHM8VmFsdWVSZWNvdmVyeT4gb3BlcmFuZHM7CisgICAgVmVjdG9yPFVu
ZGVmaW5lZE9wZXJhbmRTcGFuPiB1bmRlZmluZWRPcGVyYW5kU3BhbnM7CisgICAgU3BlY3VsYXRp
b25SZWNvdmVyeSogcmVjb3Zlcnk7CisgICAgcHRyZGlmZl90IHN0YWNrUG9pbnRlck9mZnNldDsK
KyAgICB1aW50MzJfdCBhY3RpdmVUaHJlc2hvbGQ7CisgICAgZG91YmxlIG1lbW9yeVVzYWdlQWRq
dXN0ZWRUaHJlc2hvbGQ7CisgICAgdm9pZCoganVtcFRhcmdldDsKKyAgICBBcnJheVByb2ZpbGUq
IGFycmF5UHJvZmlsZTsKKworICAgIEV4dHJhSW5pdGlhbGl6YXRpb25MZXZlbCBleHRyYUluaXRp
YWxpemF0aW9uTGV2ZWw7CisgICAgUHJvZmlsZXI6Ok9TUkV4aXQqIHByb2ZpbGVyRXhpdCB7IG51
bGxwdHIgfTsKK307CisKIC8vID09PSBPU1JFeGl0ID09PQogLy8KIC8vIFRoaXMgc3RydWN0dXJl
IGRlc2NyaWJlcyBob3cgdG8gZXhpdCB0aGUgc3BlY3VsYXRpdmUgcGF0aCBieQpAQCAtOTksMTAg
KzE0MywxMyBAQCBzdHJ1Y3QgT1NSRXhpdCA6IHB1YmxpYyBPU1JFeGl0QmFzZSB7CiAgICAgT1NS
RXhpdChFeGl0S2luZCwgSlNWYWx1ZVNvdXJjZSwgTWV0aG9kT2ZHZXR0aW5nQVZhbHVlUHJvZmls
ZSwgU3BlY3VsYXRpdmVKSVQqLCB1bnNpZ25lZCBzdHJlYW1JbmRleCwgdW5zaWduZWQgcmVjb3Zl
cnlJbmRleCA9IFVJTlRfTUFYKTsKIAogICAgIHN0YXRpYyB2b2lkIEpJVF9PUEVSQVRJT04gY29t
cGlsZU9TUkV4aXQoRXhlY1N0YXRlKikgV1RGX0lOVEVSTkFMOworICAgIHN0YXRpYyB2b2lkIGV4
ZWN1dGVPU1JFeGl0KFByb2JlOjpDb250ZXh0Jik7CiAKICAgICB1bnNpZ25lZCBtX3BhdGNoYWJs
ZUNvZGVPZmZzZXQgeyAwIH07CiAgICAgCiAgICAgTWFjcm9Bc3NlbWJsZXJDb2RlUmVmIG1fY29k
ZTsKKworICAgIFJlZlB0cjxPU1JFeGl0U3RhdGU+IGV4aXRTdGF0ZTsKICAgICAKICAgICBKU1Zh
bHVlU291cmNlIG1fanNWYWx1ZVNvdXJjZTsKICAgICBNZXRob2RPZkdldHRpbmdBVmFsdWVQcm9m
aWxlIG1fdmFsdWVQcm9maWxlOwpJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL2RmZy9ERkdU
aHVua3MuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9kZmcvREZHVGh1
bmtzLmNwcAkocmV2aXNpb24gMjIyODA1KQorKysgU291cmNlL0phdmFTY3JpcHRDb3JlL2RmZy9E
RkdUaHVua3MuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC00MCw2ICs0MCwxNCBAQAogCiBuYW1lc3Bh
Y2UgSlNDIHsgbmFtZXNwYWNlIERGRyB7CiAKK01hY3JvQXNzZW1ibGVyQ29kZVJlZiBvc3JFeGl0
VGh1bmtHZW5lcmF0b3IoVk0qIHZtKQoreworICAgIE1hY3JvQXNzZW1ibGVyIGppdDsKKyAgICBq
aXQucHJvYmUoT1NSRXhpdDo6ZXhlY3V0ZU9TUkV4aXQsIHZtKTsKKyAgICBMaW5rQnVmZmVyIHBh
dGNoQnVmZmVyKGppdCwgR0xPQkFMX1RIVU5LX0lEKTsKKyAgICByZXR1cm4gRklOQUxJWkVfQ09E
RShwYXRjaEJ1ZmZlciwgKCJERkcgT1NSIGV4aXQgdGh1bmsiKSk7Cit9CisKIE1hY3JvQXNzZW1i
bGVyQ29kZVJlZiBvc3JFeGl0R2VuZXJhdGlvblRodW5rR2VuZXJhdG9yKFZNKiB2bSkKIHsKICAg
ICBNYWNyb0Fzc2VtYmxlciBqaXQ7CkluZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUvZGZnL0RG
R1RodW5rcy5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9kZmcvREZHVGh1
bmtzLmgJKHJldmlzaW9uIDIyMjgwNSkKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9kZmcvREZH
VGh1bmtzLmgJKHdvcmtpbmcgY29weSkKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0
IChDKSAyMDExLCAyMDE0IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHly
aWdodCAoQykgMjAxMS0yMDE3IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqCiAg
KiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRo
IG9yIHdpdGhvdXQKICAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0
IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwpAQCAtMzUsNiArMzUsNyBAQCBjbGFzcyBWTTsKIAog
bmFtZXNwYWNlIERGRyB7CiAKK01hY3JvQXNzZW1ibGVyQ29kZVJlZiBvc3JFeGl0VGh1bmtHZW5l
cmF0b3IoVk0qKTsKIE1hY3JvQXNzZW1ibGVyQ29kZVJlZiBvc3JFeGl0R2VuZXJhdGlvblRodW5r
R2VuZXJhdG9yKFZNKik7CiBNYWNyb0Fzc2VtYmxlckNvZGVSZWYgb3NyRW50cnlUaHVua0dlbmVy
YXRvcihWTSopOwogCkluZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUvZGZnL0RGR1ZhcmlhYmxl
RXZlbnRTdHJlYW0uY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9kZmcv
REZHVmFyaWFibGVFdmVudFN0cmVhbS5jcHAJKHJldmlzaW9uIDIyMjgwNSkKKysrIFNvdXJjZS9K
YXZhU2NyaXB0Q29yZS9kZmcvREZHVmFyaWFibGVFdmVudFN0cmVhbS5jcHAJKHdvcmtpbmcgY29w
eSkKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IChDKSAyMDEyLTIwMTUgQXBwbGUg
SW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChDKSAyMDEyLTIwMTcgQXBw
bGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICoKICAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1
c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAogICogbW9kaWZp
Y2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRp
b25zCkBAIC05MSw3ICs5MSw3IEBAIHN0cnVjdCBNaW5pZmllZEdlbmVyYXRpb25JbmZvIHsKIAog
fSAvLyBuYW1lc3BhY2UKIAotYm9vbCBWYXJpYWJsZUV2ZW50U3RyZWFtOjp0cnlUb1NldENvbnN0
YW50UmVjb3ZlcnkoVmFsdWVSZWNvdmVyeSYgcmVjb3ZlcnksIE1pbmlmaWVkTm9kZSogbm9kZSkg
Y29uc3QKK3N0YXRpYyBib29sIHRyeVRvU2V0Q29uc3RhbnRSZWNvdmVyeShWYWx1ZVJlY292ZXJ5
JiByZWNvdmVyeSwgTWluaWZpZWROb2RlKiBub2RlKQogewogICAgIGlmICghbm9kZSkKICAgICAg
ICAgcmV0dXJuIGZhbHNlOwpAQCAtMTE0LDE0ICsxMTQsMzkgQEAgYm9vbCBWYXJpYWJsZUV2ZW50
U3RyZWFtOjp0cnlUb1NldENvbnN0YQogICAgIHJldHVybiBmYWxzZTsKIH0KIAotdm9pZCBWYXJp
YWJsZUV2ZW50U3RyZWFtOjpyZWNvbnN0cnVjdCgKK3RlbXBsYXRlPFZhcmlhYmxlRXZlbnRTdHJl
YW06OlJlY29uc3RydWN0aW9uU3R5bGUgc3R5bGU+Cit1bnNpZ25lZCBWYXJpYWJsZUV2ZW50U3Ry
ZWFtOjpyZWNvbnN0cnVjdCgKICAgICBDb2RlQmxvY2sqIGNvZGVCbG9jaywgQ29kZU9yaWdpbiBj
b2RlT3JpZ2luLCBNaW5pZmllZEdyYXBoJiBncmFwaCwKLSAgICB1bnNpZ25lZCBpbmRleCwgT3Bl
cmFuZHM8VmFsdWVSZWNvdmVyeT4mIHZhbHVlUmVjb3ZlcmllcykgY29uc3QKKyAgICB1bnNpZ25l
ZCBpbmRleCwgT3BlcmFuZHM8VmFsdWVSZWNvdmVyeT4mIHZhbHVlUmVjb3ZlcmllcywgVmVjdG9y
PFVuZGVmaW5lZE9wZXJhbmRTcGFuPiogdW5kZWZpbmVkT3BlcmFuZFNwYW5zKSBjb25zdAogewog
ICAgIEFTU0VSVChjb2RlQmxvY2stPmppdFR5cGUoKSA9PSBKSVRDb2RlOjpERkdKSVQpOwogICAg
IENvZGVCbG9jayogYmFzZWxpbmVDb2RlQmxvY2sgPSBjb2RlQmxvY2stPmJhc2VsaW5lVmVyc2lv
bigpOwotICAgIAorCiAgICAgdW5zaWduZWQgbnVtVmFyaWFibGVzOworICAgIHN0YXRpYyBjb25z
dCB1bnNpZ25lZCBpbnZhbGlkSW5kZXggPSBzdGQ6Om51bWVyaWNfbGltaXRzPHVuc2lnbmVkPjo6
bWF4KCk7CisgICAgdW5zaWduZWQgZmlyc3RVbmRlZmluZWQgPSBpbnZhbGlkSW5kZXg7CisgICAg
Ym9vbCBmaXJzdFVuZGVmaW5lZElzQXJndW1lbnQgPSBmYWxzZTsKKworICAgIGF1dG8gZmx1c2hV
bmRlZmluZWRPcGVyYW5kU3BhbiA9IFsmXSAodW5zaWduZWQgaSkgeworICAgICAgICBpZiAoZmly
c3RVbmRlZmluZWQgPT0gaW52YWxpZEluZGV4KQorICAgICAgICAgICAgcmV0dXJuOworICAgICAg
ICBpbnQgZmlyc3RPZmZzZXQgPSB2YWx1ZVJlY292ZXJpZXMudmlydHVhbFJlZ2lzdGVyRm9ySW5k
ZXgoZmlyc3RVbmRlZmluZWQpLm9mZnNldCgpOworICAgICAgICBpbnQgbGFzdE9mZnNldCA9IHZh
bHVlUmVjb3Zlcmllcy52aXJ0dWFsUmVnaXN0ZXJGb3JJbmRleChpIC0gMSkub2Zmc2V0KCk7Cisg
ICAgICAgIGludCBtaW5PZmZzZXQgPSBzdGQ6Om1pbihmaXJzdE9mZnNldCwgbGFzdE9mZnNldCk7
CisgICAgICAgIHVuZGVmaW5lZE9wZXJhbmRTcGFucy0+YXBwZW5kKHsgZmlyc3RVbmRlZmluZWQs
IG1pbk9mZnNldCwgaSAtIGZpcnN0VW5kZWZpbmVkIH0pOworICAgICAgICBmaXJzdFVuZGVmaW5l
ZCA9IGludmFsaWRJbmRleDsKKyAgICB9OworICAgIGF1dG8gcmVjb3JkVW5kZWZpbmVkT3BlcmFu
ZCA9IFsmXSAodW5zaWduZWQgaSkgeworICAgICAgICAvLyBXZSB3YW50IHRvIHNlcGFyYXRlIHRo
ZSBzcGFuIG9mIGFyZ3VtZW50cyBmcm9tIHRoZSBzcGFuIG9mIGxvY2FscyBldmVuIGlmIHRoZXkg
aGF2ZSBhZGphY2VudCBvcGVyYW5kcyBpbmRleGVzLgorICAgICAgICBpZiAoZmlyc3RVbmRlZmlu
ZWQgIT0gaW52YWxpZEluZGV4ICYmIGZpcnN0VW5kZWZpbmVkSXNBcmd1bWVudCAhPSB2YWx1ZVJl
Y292ZXJpZXMuaXNBcmd1bWVudChpKSkKKyAgICAgICAgICAgIGZsdXNoVW5kZWZpbmVkT3BlcmFu
ZFNwYW4oaSk7CisKKyAgICAgICAgaWYgKGZpcnN0VW5kZWZpbmVkID09IGludmFsaWRJbmRleCkg
eworICAgICAgICAgICAgZmlyc3RVbmRlZmluZWQgPSBpOworICAgICAgICAgICAgZmlyc3RVbmRl
ZmluZWRJc0FyZ3VtZW50ID0gdmFsdWVSZWNvdmVyaWVzLmlzQXJndW1lbnQoaSk7CisgICAgICAg
IH0KKyAgICB9OworCiAgICAgaWYgKGNvZGVPcmlnaW4uaW5saW5lQ2FsbEZyYW1lKQogICAgICAg
ICBudW1WYXJpYWJsZXMgPSBiYXNlbGluZUNvZGVCbG9ja0ZvcklubGluZUNhbGxGcmFtZShjb2Rl
T3JpZ2luLmlubGluZUNhbGxGcmFtZSktPm1fbnVtQ2FsbGVlTG9jYWxzICsgVmlydHVhbFJlZ2lz
dGVyKGNvZGVPcmlnaW4uaW5saW5lQ2FsbEZyYW1lLT5zdGFja09mZnNldCkudG9Mb2NhbCgpICsg
MTsKICAgICBlbHNlCkBAIC0xMzYsNyArMTYxLDcgQEAgdm9pZCBWYXJpYWJsZUV2ZW50U3RyZWFt
OjpyZWNvbnN0cnVjdCgKICAgICAgICAgICAgIHZhbHVlUmVjb3Zlcmllc1tpXSA9IFZhbHVlUmVj
b3Zlcnk6OmRpc3BsYWNlZEluSlNTdGFjaygKICAgICAgICAgICAgICAgICBWaXJ0dWFsUmVnaXN0
ZXIodmFsdWVSZWNvdmVyaWVzLm9wZXJhbmRGb3JJbmRleChpKSksIERhdGFGb3JtYXRKUyk7CiAg
ICAgICAgIH0KLSAgICAgICAgcmV0dXJuOworICAgICAgICByZXR1cm4gbnVtVmFyaWFibGVzOwog
ICAgIH0KICAgICAKICAgICAvLyBTdGVwIDE6IEZpbmQgdGhlIGxhc3QgY2hlY2twb2ludCwgYW5k
IGZpZ3VyZSBvdXQgdGhlIG51bWJlciBvZiB2aXJ0dWFsIHJlZ2lzdGVycyBhcyB3ZSBnby4KQEAg
LTE5MSw2ICsyMTYsMTIgQEAgdm9pZCBWYXJpYWJsZUV2ZW50U3RyZWFtOjpyZWNvbnN0cnVjdCgK
ICAgICAgICAgVmFsdWVTb3VyY2UmIHNvdXJjZSA9IG9wZXJhbmRTb3VyY2VzW2ldOwogICAgICAg
ICBpZiAoc291cmNlLmlzVHJpdmlhbGx5UmVjb3ZlcmFibGUoKSkgewogICAgICAgICAgICAgdmFs
dWVSZWNvdmVyaWVzW2ldID0gc291cmNlLnZhbHVlUmVjb3ZlcnkoKTsKKyAgICAgICAgICAgIGlm
IChzdHlsZSA9PSBSZWNvbnN0cnVjdGlvblN0eWxlOjpTZXBhcmF0ZWQpIHsKKyAgICAgICAgICAg
ICAgICBpZiAodmFsdWVSZWNvdmVyaWVzW2ldLmlzQ29uc3RhbnQoKSAmJiB2YWx1ZVJlY292ZXJp
ZXNbaV0uY29uc3RhbnQoKSA9PSBqc1VuZGVmaW5lZCgpKQorICAgICAgICAgICAgICAgICAgICBy
ZWNvcmRVbmRlZmluZWRPcGVyYW5kKGkpOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAg
ICAgICAgICAgICAgZmx1c2hVbmRlZmluZWRPcGVyYW5kU3BhbihpKTsKKyAgICAgICAgICAgIH0K
ICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICB9CiAgICAgICAgIApAQCAtMTk5LDE0ICsy
MzAsMjUgQEAgdm9pZCBWYXJpYWJsZUV2ZW50U3RyZWFtOjpyZWNvbnN0cnVjdCgKICAgICAgICAg
TWluaWZpZWRHZW5lcmF0aW9uSW5mbyBpbmZvID0gZ2VuZXJhdGlvbkluZm9zLmdldChzb3VyY2Uu
aWQoKSk7CiAgICAgICAgIGlmICghaW5mby5hbGl2ZSkgewogICAgICAgICAgICAgdmFsdWVSZWNv
dmVyaWVzW2ldID0gVmFsdWVSZWNvdmVyeTo6Y29uc3RhbnQoanNVbmRlZmluZWQoKSk7CisgICAg
ICAgICAgICBpZiAoc3R5bGUgPT0gUmVjb25zdHJ1Y3Rpb25TdHlsZTo6U2VwYXJhdGVkKQorICAg
ICAgICAgICAgICAgIHJlY29yZFVuZGVmaW5lZE9wZXJhbmQoaSk7CiAgICAgICAgICAgICBjb250
aW51ZTsKICAgICAgICAgfQogCi0gICAgICAgIGlmICh0cnlUb1NldENvbnN0YW50UmVjb3Zlcnko
dmFsdWVSZWNvdmVyaWVzW2ldLCBub2RlKSkKKyAgICAgICAgaWYgKHRyeVRvU2V0Q29uc3RhbnRS
ZWNvdmVyeSh2YWx1ZVJlY292ZXJpZXNbaV0sIG5vZGUpKSB7CisgICAgICAgICAgICBpZiAoc3R5
bGUgPT0gUmVjb25zdHJ1Y3Rpb25TdHlsZTo6U2VwYXJhdGVkKSB7CisgICAgICAgICAgICAgICAg
aWYgKG5vZGUtPmhhc0NvbnN0YW50KCkgJiYgbm9kZS0+Y29uc3RhbnQoKSA9PSBqc1VuZGVmaW5l
ZCgpKQorICAgICAgICAgICAgICAgICAgICByZWNvcmRVbmRlZmluZWRPcGVyYW5kKGkpOworICAg
ICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgZmx1c2hVbmRlZmluZWRPcGVy
YW5kU3BhbihpKTsKKyAgICAgICAgICAgIH0KICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAg
ICB9CiAgICAgICAgIAogICAgICAgICBBU1NFUlQoaW5mby5mb3JtYXQgIT0gRGF0YUZvcm1hdE5v
bmUpOwotICAgICAgICAKKyAgICAgICAgaWYgKHN0eWxlID09IFJlY29uc3RydWN0aW9uU3R5bGU6
OlNlcGFyYXRlZCkKKyAgICAgICAgICAgIGZsdXNoVW5kZWZpbmVkT3BlcmFuZFNwYW4oaSk7CisK
ICAgICAgICAgaWYgKGluZm8uZmlsbGVkKSB7CiAgICAgICAgICAgICBpZiAoaW5mby5mb3JtYXQg
PT0gRGF0YUZvcm1hdERvdWJsZSkgewogICAgICAgICAgICAgICAgIHZhbHVlUmVjb3Zlcmllc1tp
XSA9IFZhbHVlUmVjb3Zlcnk6OmluRlBSKGluZm8udS5mcHIsIERhdGFGb3JtYXREb3VibGUpOwpA
QCAtMjI1LDYgKzI2NywyNCBAQCB2b2lkIFZhcmlhYmxlRXZlbnRTdHJlYW06OnJlY29uc3RydWN0
KAogICAgICAgICB2YWx1ZVJlY292ZXJpZXNbaV0gPQogICAgICAgICAgICAgVmFsdWVSZWNvdmVy
eTo6ZGlzcGxhY2VkSW5KU1N0YWNrKHN0YXRpY19jYXN0PFZpcnR1YWxSZWdpc3Rlcj4oaW5mby51
LnZpcnR1YWxSZWcpLCBpbmZvLmZvcm1hdCk7CiAgICAgfQorICAgIGlmIChzdHlsZSA9PSBSZWNv
bnN0cnVjdGlvblN0eWxlOjpTZXBhcmF0ZWQpCisgICAgICAgIGZsdXNoVW5kZWZpbmVkT3BlcmFu
ZFNwYW4ob3BlcmFuZFNvdXJjZXMuc2l6ZSgpKTsKKworICAgIHJldHVybiBudW1WYXJpYWJsZXM7
Cit9CisKK3Vuc2lnbmVkIFZhcmlhYmxlRXZlbnRTdHJlYW06OnJlY29uc3RydWN0KAorICAgIENv
ZGVCbG9jayogY29kZUJsb2NrLCBDb2RlT3JpZ2luIGNvZGVPcmlnaW4sIE1pbmlmaWVkR3JhcGgm
IGdyYXBoLAorICAgIHVuc2lnbmVkIGluZGV4LCBPcGVyYW5kczxWYWx1ZVJlY292ZXJ5PiYgdmFs
dWVSZWNvdmVyaWVzKSBjb25zdAoreworICAgIHJldHVybiByZWNvbnN0cnVjdDxSZWNvbnN0cnVj
dGlvblN0eWxlOjpDb21iaW5lZD4oY29kZUJsb2NrLCBjb2RlT3JpZ2luLCBncmFwaCwgaW5kZXgs
IHZhbHVlUmVjb3ZlcmllcywgbnVsbHB0cik7Cit9CisKK3Vuc2lnbmVkIFZhcmlhYmxlRXZlbnRT
dHJlYW06OnJlY29uc3RydWN0KAorICAgIENvZGVCbG9jayogY29kZUJsb2NrLCBDb2RlT3JpZ2lu
IGNvZGVPcmlnaW4sIE1pbmlmaWVkR3JhcGgmIGdyYXBoLAorICAgIHVuc2lnbmVkIGluZGV4LCBP
cGVyYW5kczxWYWx1ZVJlY292ZXJ5PiYgdmFsdWVSZWNvdmVyaWVzLCBWZWN0b3I8VW5kZWZpbmVk
T3BlcmFuZFNwYW4+KiB1bmRlZmluZWRPcGVyYW5kU3BhbnMpIGNvbnN0Cit7CisgICAgcmV0dXJu
IHJlY29uc3RydWN0PFJlY29uc3RydWN0aW9uU3R5bGU6OlNlcGFyYXRlZD4oY29kZUJsb2NrLCBj
b2RlT3JpZ2luLCBncmFwaCwgaW5kZXgsIHZhbHVlUmVjb3ZlcmllcywgdW5kZWZpbmVkT3BlcmFu
ZFNwYW5zKTsKIH0KIAogfSB9IC8vIG5hbWVzcGFjZSBKU0M6OkRGRwpJbmRleDogU291cmNlL0ph
dmFTY3JpcHRDb3JlL2RmZy9ERkdWYXJpYWJsZUV2ZW50U3RyZWFtLmgKPT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0g
U291cmNlL0phdmFTY3JpcHRDb3JlL2RmZy9ERkdWYXJpYWJsZUV2ZW50U3RyZWFtLmgJKHJldmlz
aW9uIDIyMjgwNSkKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9kZmcvREZHVmFyaWFibGVFdmVu
dFN0cmVhbS5oCSh3b3JraW5nIGNvcHkpCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdo
dCAoQykgMjAxMiwgMjAxNCBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5
cmlnaHQgKEMpIDIwMTItMjAxNyBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKgog
ICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0
aCBvciB3aXRob3V0CiAgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhh
dCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKQEAgLTM1LDYgKzM1LDEyIEBACiAKIG5hbWVzcGFj
ZSBKU0MgeyBuYW1lc3BhY2UgREZHIHsKIAorc3RydWN0IFVuZGVmaW5lZE9wZXJhbmRTcGFuIHsK
KyAgICB1bnNpZ25lZCBmaXJzdEluZGV4OworICAgIGludCBtaW5PZmZzZXQ7CisgICAgdW5zaWdu
ZWQgbnVtYmVyT2ZSZWdpc3RlcnM7Cit9OworCiBjbGFzcyBWYXJpYWJsZUV2ZW50U3RyZWFtIDog
cHVibGljIFZlY3RvcjxWYXJpYWJsZUV2ZW50PiB7CiBwdWJsaWM6CiAgICAgdm9pZCBhcHBlbmRB
bmRMb2coY29uc3QgVmFyaWFibGVFdmVudCYgZXZlbnQpCkBAIC00MiwxMyArNDgsMTkgQEAgcHVi
bGljOgogICAgICAgICBhcHBlbmQoZXZlbnQpOwogICAgIH0KICAgICAKLSAgICB2b2lkIHJlY29u
c3RydWN0KAotICAgICAgICBDb2RlQmxvY2sqLCBDb2RlT3JpZ2luLCBNaW5pZmllZEdyYXBoJiwK
LSAgICAgICAgdW5zaWduZWQgaW5kZXgsIE9wZXJhbmRzPFZhbHVlUmVjb3Zlcnk+JikgY29uc3Q7
CisgICAgdW5zaWduZWQgcmVjb25zdHJ1Y3QoQ29kZUJsb2NrKiwgQ29kZU9yaWdpbiwgTWluaWZp
ZWRHcmFwaCYsIHVuc2lnbmVkIGluZGV4LCBPcGVyYW5kczxWYWx1ZVJlY292ZXJ5PiYpIGNvbnN0
OworICAgIHVuc2lnbmVkIHJlY29uc3RydWN0KENvZGVCbG9jayosIENvZGVPcmlnaW4sIE1pbmlm
aWVkR3JhcGgmLCB1bnNpZ25lZCBpbmRleCwgT3BlcmFuZHM8VmFsdWVSZWNvdmVyeT4mLCBWZWN0
b3I8VW5kZWZpbmVkT3BlcmFuZFNwYW4+KikgY29uc3Q7CiAKIHByaXZhdGU6Ci0gICAgYm9vbCB0
cnlUb1NldENvbnN0YW50UmVjb3ZlcnkoVmFsdWVSZWNvdmVyeSYsIE1pbmlmaWVkTm9kZSopIGNv
bnN0OwotICAgIAorICAgIGVudW0gY2xhc3MgUmVjb25zdHJ1Y3Rpb25TdHlsZSB7CisgICAgICAg
IENvbWJpbmVkLAorICAgICAgICBTZXBhcmF0ZWQKKyAgICB9OworICAgIHRlbXBsYXRlPFJlY29u
c3RydWN0aW9uU3R5bGUgc3R5bGU+CisgICAgdW5zaWduZWQgcmVjb25zdHJ1Y3QoCisgICAgICAg
IENvZGVCbG9jayosIENvZGVPcmlnaW4sIE1pbmlmaWVkR3JhcGgmLAorICAgICAgICB1bnNpZ25l
ZCBpbmRleCwgT3BlcmFuZHM8VmFsdWVSZWNvdmVyeT4mLCBWZWN0b3I8VW5kZWZpbmVkT3BlcmFu
ZFNwYW4+KikgY29uc3Q7CisKICAgICB2b2lkIGxvZ0V2ZW50KGNvbnN0IFZhcmlhYmxlRXZlbnQm
KTsKIH07CiAKSW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9wcm9maWxlci9Qcm9maWxlck9T
UkV4aXQuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvcHJvZmlsZXIvUHJv
ZmlsZXJPU1JFeGl0LmgJKHJldmlzaW9uIDIyMjgwNSkKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29y
ZS9wcm9maWxlci9Qcm9maWxlck9TUkV4aXQuaAkod29ya2luZyBjb3B5KQpAQCAtMSw1ICsxLDUg
QEAKIC8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTIgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2Vy
dmVkLgorICogQ29weXJpZ2h0IChDKSAyMDEyLTIwMTcgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJl
c2VydmVkLgogICoKICAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5h
cnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAogICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVk
IHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCkBAIC00Myw3ICs0Myw4IEBA
IHB1YmxpYzoKICAgICAKICAgICB1aW50NjRfdCogY291bnRlckFkZHJlc3MoKSB7IHJldHVybiAm
bV9jb3VudGVyOyB9CiAgICAgdWludDY0X3QgY291bnQoKSBjb25zdCB7IHJldHVybiBtX2NvdW50
ZXI7IH0KLSAgICAKKyAgICB2b2lkIGluY0NvdW50KCkgeyBtX2NvdW50ZXIrKzsgfQorCiAgICAg
SlNWYWx1ZSB0b0pTKEV4ZWNTdGF0ZSopIGNvbnN0OwogCiBwcml2YXRlOgpJbmRleDogU291cmNl
L0phdmFTY3JpcHRDb3JlL3J1bnRpbWUvSlNDSlNWYWx1ZS5oCj09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJj
ZS9KYXZhU2NyaXB0Q29yZS9ydW50aW1lL0pTQ0pTVmFsdWUuaAkocmV2aXNpb24gMjIyODA1KQor
KysgU291cmNlL0phdmFTY3JpcHRDb3JlL3J1bnRpbWUvSlNDSlNWYWx1ZS5oCSh3b3JraW5nIGNv
cHkpCkBAIC0xLDcgKzEsNyBAQAogLyoKICAqICBDb3B5cmlnaHQgKEMpIDE5OTktMjAwMSBIYXJy
aSBQb3J0ZW4gKHBvcnRlbkBrZGUub3JnKQogICogIENvcHlyaWdodCAoQykgMjAwMSBQZXRlciBL
ZWxseSAocG1rQHBvc3QuY29tKQotICogIENvcHlyaWdodCAoQykgMjAwMywgMjAwNCwgMjAwNSwg
MjAwNywgMjAwOCwgMjAwOSwgMjAxMiwgMjAxNSBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2
ZWQuCisgKiAgQ29weXJpZ2h0IChDKSAyMDAzLTIwMTcgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJl
c2VydmVkLgogICoKICAqICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiBy
ZWRpc3RyaWJ1dGUgaXQgYW5kL29yCiAgKiAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0
aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKQEAgLTM0NCwxMiArMzQ0LDkgQEAgcHVibGlj
OgogICAgIHVpbnQzMl90IHRhZygpIGNvbnN0OwogICAgIGludDMyX3QgcGF5bG9hZCgpIGNvbnN0
OwogCi0jaWYgIUVOQUJMRShKSVQpCi0gICAgLy8gVGhpcyBzaG91bGQgb25seSBiZSB1c2VkIGJ5
IHRoZSBMTEludCBDIExvb3AgaW50ZXJwcmV0ZXIgd2hvIG5lZWRzCi0gICAgLy8gc3ludGhlc2l6
ZSBKU1ZhbHVlIGZyb20gaXRzICJyZWdpc3RlciJzIGhvbGRpbmcgdGFnIGFuZCBwYXlsb2FkCi0g
ICAgLy8gdmFsdWVzLgorICAgIC8vIFRoaXMgc2hvdWxkIG9ubHkgYmUgdXNlZCBieSB0aGUgTExJ
bnQgQyBMb29wIGludGVycHJldGVyIGFuZCBPU1JFeGl0IGNvZGUgd2hvIG5lZWRzCisgICAgLy8g
c3ludGhlc2l6ZSBKU1ZhbHVlIGZyb20gaXRzICJyZWdpc3RlciJzIGhvbGRpbmcgdGFnIGFuZCBw
YXlsb2FkIHZhbHVlcy4KICAgICBleHBsaWNpdCBKU1ZhbHVlKGludDMyX3QgdGFnLCBpbnQzMl90
IHBheWxvYWQpOwotI2VuZGlmCiAKICNlbGlmIFVTRShKU1ZBTFVFNjQpCiAgICAgLyoKSW5kZXg6
IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9ydW50aW1lL0pTQ0pTVmFsdWVJbmxpbmVzLmgKPT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRDb3JlL3J1bnRpbWUvSlNDSlNWYWx1ZUlubGluZXMu
aAkocmV2aXNpb24gMjIyODA1KQorKysgU291cmNlL0phdmFTY3JpcHRDb3JlL3J1bnRpbWUvSlND
SlNWYWx1ZUlubGluZXMuaAkod29ya2luZyBjb3B5KQpAQCAtMzQxLDcgKzM0MSw3IEBAIGlubGlu
ZSBKU1ZhbHVlOjpKU1ZhbHVlKGludCBpKQogICAgIHUuYXNCaXRzLnBheWxvYWQgPSBpOwogfQog
Ci0jaWYgIUVOQUJMRShKSVQpCisjaWYgVVNFKEpTVkFMVUUzMl82NCkKIGlubGluZSBKU1ZhbHVl
OjpKU1ZhbHVlKGludDMyX3QgdGFnLCBpbnQzMl90IHBheWxvYWQpCiB7CiAgICAgdS5hc0JpdHMu
dGFnID0gdGFnOwpJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL3J1bnRpbWUvT3B0aW9ucy5o
Cj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9ydW50aW1lL09wdGlvbnMuaAko
cmV2aXNpb24gMjIyODA1KQorKysgU291cmNlL0phdmFTY3JpcHRDb3JlL3J1bnRpbWUvT3B0aW9u
cy5oCSh3b3JraW5nIGNvcHkpCkBAIC0xNzIsNiArMTcyLDcgQEAgdHlwZWRlZiBjb25zdCBjaGFy
KiBvcHRpb25TdHJpbmc7CiAgICAgdihib29sLCB2ZXJib3NlQ29tcGlsYXRpb24sIGZhbHNlLCBO
b3JtYWwsIG51bGxwdHIpIFwKICAgICB2KGJvb2wsIHZlcmJvc2VGVExDb21waWxhdGlvbiwgZmFs
c2UsIE5vcm1hbCwgbnVsbHB0cikgXAogICAgIHYoYm9vbCwgbG9nQ29tcGlsYXRpb25DaGFuZ2Vz
LCBmYWxzZSwgTm9ybWFsLCBudWxscHRyKSBcCisgICAgdihib29sLCB1c2VQcm9iZU9TUkV4aXQs
IGZhbHNlLCBOb3JtYWwsIG51bGxwdHIpIFwKICAgICB2KGJvb2wsIHByaW50RWFjaE9TUkV4aXQs
IGZhbHNlLCBOb3JtYWwsIG51bGxwdHIpIFwKICAgICB2KGJvb2wsIHZhbGlkYXRlR3JhcGgsIGZh
bHNlLCBOb3JtYWwsIG51bGxwdHIpIFwKICAgICB2KGJvb2wsIHZhbGlkYXRlR3JhcGhBdEVhY2hQ
aGFzZSwgZmFsc2UsIE5vcm1hbCwgbnVsbHB0cikgXApJbmRleDogVG9vbHMvQ2hhbmdlTG9nCj09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT0KLS0tIFRvb2xzL0NoYW5nZUxvZwkocmV2aXNpb24gMjIyODIzKQorKysgVG9vbHMv
Q2hhbmdlTG9nCSh3b3JraW5nIGNvcHkpCkBAIC0xLDMgKzEsMTYgQEAKKzIwMTctMTAtMDMgIE1h
cmsgTGFtICA8bWFyay5sYW1AYXBwbGUuY29tPgorCisgICAgICAgIEFkZCBzdXBwb3J0IGZvciB1
c2luZyBQcm9iZSBERkcgT1NSIEV4aXQgYmVoaW5kIGEgcnVudGltZSBmbGFnLgorICAgICAgICBo
dHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MTc3ODQ0CisgICAgICAgIDxy
ZGFyOi8vcHJvYmxlbS8zNDgwMTQyNT4KKworICAgICAgICBSZXZpZXdlZCBieSBOT0JPRFkgKE9P
UFMhKS4KKworICAgICAgICBFbmFibGUgLS11c2VQcm9iZU9TckV4aXQ9dHJ1ZSBmb3IgZGZnLWVh
Z2VyIGFuZCBmdGwtbm8tY2ppdC12YWxpZGF0ZS1zYW1wbGluZy1wcm9maWxlcgorICAgICAgICB0
ZXN0IGNvbmZpZ3VyYXRpb25zLgorCisgICAgICAgICogU2NyaXB0cy9ydW4tanNjLXN0cmVzcy10
ZXN0czoKKwogMjAxNy0xMC0wMyAgQ2hyaXMgRHVtZXogIDxjZHVtZXpAYXBwbGUuY29tPgogCiAg
ICAgICAgIFNoYXJlZFN0cmluZ0hhc2hTdG9yZSBzaG91bGQgc3VwcG9ydCByZW1vdmluZyBoYXNo
ZXMKSW5kZXg6IFRvb2xzL1NjcmlwdHMvcnVuLWpzYy1zdHJlc3MtdGVzdHMKPT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQot
LS0gVG9vbHMvU2NyaXB0cy9ydW4tanNjLXN0cmVzcy10ZXN0cwkocmV2aXNpb24gMjIyODA1KQor
KysgVG9vbHMvU2NyaXB0cy9ydW4tanNjLXN0cmVzcy10ZXN0cwkod29ya2luZyBjb3B5KQpAQCAt
NDU3LDYgKzQ1Nyw3IEBAIEVBR0VSX09QVElPTlMgPSBbIi0tdGhyZXNob2xkRm9ySklUQWZ0ZXIK
IE5PX0NKSVRfT1BUSU9OUyA9IFsiLS11c2VDb25jdXJyZW50SklUPWZhbHNlIiwgIi0tdGhyZXNo
b2xkRm9ySklUQWZ0ZXJXYXJtVXA9MTAwIiwgIi0tc2NyaWJibGVGcmVlQ2VsbHM9dHJ1ZSJdCiBC
M08xX09QVElPTlMgPSBbIi0tZGVmYXVsdEIzT3B0TGV2ZWw9MSJdCiBGVExfT1BUSU9OUyA9IFsi
LS11c2VGVExKSVQ9dHJ1ZSJdCitQUk9CRV9PU1JfRVhJVF9PUFRJT04gPSBbIi0tdXNlUHJvYmVP
U1JFeGl0PXRydWUiXQogCiByZXF1aXJlX3JlbGF0aXZlICJ3ZWJraXRydWJ5L2pzYy1zdHJlc3Mt
dGVzdC13cml0ZXItI3skdGVzdFdyaXRlcn0iCiAKQEAgLTYyMyw3ICs2MjQsNyBAQCBkZWYgcnVu
RlRMTm9DSklUQjNPMSgqb3B0aW9uYWxUZXN0U3BlY2lmCiBlbmQKIAogZGVmIHJ1bkZUTE5vQ0pJ
VFZhbGlkYXRlKCpvcHRpb25hbFRlc3RTcGVjaWZpY09wdGlvbnMpCi0gICAgcnVuKCJmdGwtbm8t
Y2ppdC12YWxpZGF0ZS1zYW1wbGluZy1wcm9maWxlciIsICItLXZhbGlkYXRlR3JhcGg9dHJ1ZSIs
ICItLXVzZVNhbXBsaW5nUHJvZmlsZXI9dHJ1ZSIsICItLWFpckZvcmNlSVJDQWxsb2NhdG9yPXRy
dWUiLCAqKEZUTF9PUFRJT05TICsgTk9fQ0pJVF9PUFRJT05TICsgb3B0aW9uYWxUZXN0U3BlY2lm
aWNPcHRpb25zKSkKKyAgICBydW4oImZ0bC1uby1jaml0LXZhbGlkYXRlLXNhbXBsaW5nLXByb2Zp
bGVyIiwgIi0tdmFsaWRhdGVHcmFwaD10cnVlIiwgIi0tdXNlU2FtcGxpbmdQcm9maWxlcj10cnVl
IiwgIi0tYWlyRm9yY2VJUkNBbGxvY2F0b3I9dHJ1ZSIsICooRlRMX09QVElPTlMgKyBOT19DSklU
X09QVElPTlMgKyBQUk9CRV9PU1JfRVhJVF9PUFRJT04gKyBvcHRpb25hbFRlc3RTcGVjaWZpY09w
dGlvbnMpKQogZW5kCiAKIGRlZiBydW5GVExOb0NKSVROb1B1dFN0YWNrVmFsaWRhdGUoKm9wdGlv
bmFsVGVzdFNwZWNpZmljT3B0aW9ucykKQEAgLTYzOSw3ICs2NDAsNyBAQCBkZWYgcnVuRlRMTm9D
SklUT1NSVmFsaWRhdGlvbigqb3B0aW9uYWxUCiBlbmQKIAogZGVmIHJ1bkRGR0VhZ2VyKCpvcHRp
b25hbFRlc3RTcGVjaWZpY09wdGlvbnMpCi0gICAgcnVuKCJkZmctZWFnZXIiLCAqKEVBR0VSX09Q
VElPTlMgKyBDT0xMRUNUX0NPTlRJTlVPVVNMWV9PUFRJT05TICsgb3B0aW9uYWxUZXN0U3BlY2lm
aWNPcHRpb25zKSkKKyAgICBydW4oImRmZy1lYWdlciIsICooRUFHRVJfT1BUSU9OUyArIENPTExF
Q1RfQ09OVElOVU9VU0xZX09QVElPTlMgKyBQUk9CRV9PU1JfRVhJVF9PUFRJT04gKyBvcHRpb25h
bFRlc3RTcGVjaWZpY09wdGlvbnMpKQogZW5kCiAKIGRlZiBydW5ERkdFYWdlck5vQ0pJVFZhbGlk
YXRlKCpvcHRpb25hbFRlc3RTcGVjaWZpY09wdGlvbnMpCg==
</data>
<flag name="review"
          id="342474"
          type_id="1"
          status="+"
          setter="saam"
    />
          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>322708</attachid>
            <date>2017-10-04 12:57:54 -0700</date>
            <delta_ts>2017-10-04 12:57:54 -0700</delta_ts>
            <desc>patch for landing.</desc>
            <filename>bug-177844.patch</filename>
            <type>text/plain</type>
            <size>87922</size>
            <attacher name="Mark Lam">mark.lam</attacher>
            
              <data encoding="base64">SW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9DaGFuZ2VMb2cKPT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291
cmNlL0phdmFTY3JpcHRDb3JlL0NoYW5nZUxvZwkocmV2aXNpb24gMjIyODcwKQorKysgU291cmNl
L0phdmFTY3JpcHRDb3JlL0NoYW5nZUxvZwkod29ya2luZyBjb3B5KQpAQCAtMSwzICsxLDk1IEBA
CisyMDE3LTEwLTA0ICBNYXJrIExhbSAgPG1hcmsubGFtQGFwcGxlLmNvbT4KKworICAgICAgICBB
ZGQgc3VwcG9ydCBmb3IgdXNpbmcgUHJvYmUgREZHIE9TUiBFeGl0IGJlaGluZCBhIHJ1bnRpbWUg
ZmxhZy4KKyAgICAgICAgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTE3
Nzg0NAorICAgICAgICA8cmRhcjovL3Byb2JsZW0vMzQ4MDE0MjU+CisKKyAgICAgICAgUmV2aWV3
ZWQgYnkgU2FhbSBCYXJhdGkuCisKKyAgICAgICAgVGhpcyBpcyBiYXNlZCBvbiB0aGUgY29kZSBv
cmlnaW5hbGx5IHBvc3RlZCBpbiBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/
aWQ9MTc1MTQ0CisgICAgICAgIChpbiByMjIxNzc0IGFuZCByMjIxODMyKSB3aXRoIHNvbWUgb3B0
aW1pemF0aW9ucyBhbmQgYnVnIGZpeGVzIGFkZGVkLiAgVGhlIHByb2JlCisgICAgICAgIGJhc2Vk
IERGRyBPU1IgRXhpdCBpcyBvbmx5IGVuYWJsZWQgaWYgT3B0aW9uczo6dXNlUHJvYmVPU1JFeGl0
KCkgaXMgdHJ1ZS4gIFdlJ3JlCisgICAgICAgIGxhbmRpbmcgdGhpcyBiZWhpbmQgYW4gb3B0aW9u
IHN3aXRjaCB0byBtYWtlIGl0IGVhc2llciB0byB0dW5lIHBlcmZvcm1hbmNlIHVzaW5nCisgICAg
ICAgIHRoZSBwcm9iZSBiYXNlZCBPU1IgZXhpdC4KKworICAgICAgICAqIEphdmFTY3JpcHRDb3Jl
Lnhjb2RlcHJvai9wcm9qZWN0LnBieHByb2o6CisgICAgICAgICogYXNzZW1ibGVyL01hY3JvQXNz
ZW1ibGVyLmNwcDoKKyAgICAgICAgKEpTQzo6c3RkRnVuY3Rpb25DYWxsYmFjayk6CisgICAgICAg
ICogYXNzZW1ibGVyL01hY3JvQXNzZW1ibGVyUHJpbnRlci5jcHA6CisgICAgICAgIChKU0M6OlBy
aW50ZXI6OnByaW50Q2FsbGJhY2spOgorICAgICAgICAqIGFzc2VtYmxlci9Qcm9iZUNvbnRleHQu
Y3BwOgorICAgICAgICAoSlNDOjpQcm9iZTo6ZXhlY3V0ZVByb2JlKToKKyAgICAgICAgKEpTQzo6
UHJvYmU6OmZsdXNoRGlydHlTdGFja1BhZ2VzKToKKyAgICAgICAgKiBhc3NlbWJsZXIvUHJvYmVD
b250ZXh0Lmg6CisgICAgICAgIChKU0M6OlByb2JlOjpDb250ZXh0OjpDb250ZXh0KToKKyAgICAg
ICAgKEpTQzo6UHJvYmU6OkNvbnRleHQ6OmFyZyk6CisgICAgICAgICogYXNzZW1ibGVyL1Byb2Jl
RnJhbWUuaDogQWRkZWQuCisgICAgICAgIChKU0M6OlByb2JlOjpGcmFtZTo6RnJhbWUpOgorICAg
ICAgICAoSlNDOjpQcm9iZTo6RnJhbWU6OmFyZ3VtZW50KToKKyAgICAgICAgKEpTQzo6UHJvYmU6
OkZyYW1lOjpvcGVyYW5kKToKKyAgICAgICAgKEpTQzo6UHJvYmU6OkZyYW1lOjpzZXRBcmd1bWVu
dCk6CisgICAgICAgIChKU0M6OlByb2JlOjpGcmFtZTo6c2V0T3BlcmFuZCk6CisgICAgICAgIChK
U0M6OlByb2JlOjpGcmFtZTo6Z2V0KToKKyAgICAgICAgKEpTQzo6UHJvYmU6OkZyYW1lOjpzZXQp
OgorICAgICAgICAqIGFzc2VtYmxlci9Qcm9iZVN0YWNrLmNwcDoKKyAgICAgICAgKEpTQzo6UHJv
YmU6OlBhZ2U6Omxvd1dhdGVybWFya0Zyb21WaXNpdGluZ0RpcnR5Q2h1bmtzKToKKyAgICAgICAg
KEpTQzo6UHJvYmU6OlN0YWNrOjpTdGFjayk6CisgICAgICAgIChKU0M6OlByb2JlOjpTdGFjazo6
bG93V2F0ZXJtYXJrRnJvbVZpc2l0aW5nRGlydHlQYWdlcyk6CisgICAgICAgICogYXNzZW1ibGVy
L1Byb2JlU3RhY2suaDoKKyAgICAgICAgKEpTQzo6UHJvYmU6OlN0YWNrOjpTdGFjayk6CisgICAg
ICAgIChKU0M6OlByb2JlOjpTdGFjazo6bG93V2F0ZXJtYXJrKToKKyAgICAgICAgKEpTQzo6UHJv
YmU6OlN0YWNrOjpzZXQpOgorICAgICAgICAoSlNDOjpQcm9iZTo6U3RhY2s6OnNhdmVkU3RhY2tQ
b2ludGVyIGNvbnN0KToKKyAgICAgICAgKEpTQzo6UHJvYmU6OlN0YWNrOjpzZXRTYXZlZFN0YWNr
UG9pbnRlcik6CisgICAgICAgIChKU0M6OlByb2JlOjpTdGFjazo6bmV3U3RhY2tQb2ludGVyIGNv
bnN0KTogRGVsZXRlZC4KKyAgICAgICAgKEpTQzo6UHJvYmU6OlN0YWNrOjpzZXROZXdTdGFja1Bv
aW50ZXIpOiBEZWxldGVkLgorICAgICAgICAqIGJ5dGVjb2RlL0FycmF5UHJvZmlsZS5oOgorICAg
ICAgICAoSlNDOjpBcnJheVByb2ZpbGU6Om9ic2VydmVBcnJheU1vZGUpOgorICAgICAgICAqIGJ5
dGVjb2RlL0NvZGVCbG9jay5jcHA6CisgICAgICAgIChKU0M6OkNvZGVCbG9jazo6dXBkYXRlT1NS
RXhpdENvdW50ZXJBbmRDaGVja0lmTmVlZFRvUmVvcHRpbWl6ZSk6CisgICAgICAgICogYnl0ZWNv
ZGUvQ29kZUJsb2NrLmg6CisgICAgICAgIChKU0M6OkNvZGVCbG9jazo6YWRkcmVzc09mT1NSRXhp
dENvdW50ZXIpOiBEZWxldGVkLgorICAgICAgICAqIGJ5dGVjb2RlL0V4ZWN1dGlvbkNvdW50ZXIu
aDoKKyAgICAgICAgKEpTQzo6RXhlY3V0aW9uQ291bnRlcjo6aGFzQ3Jvc3NlZFRocmVzaG9sZCBj
b25zdCk6CisgICAgICAgIChKU0M6OkV4ZWN1dGlvbkNvdW50ZXI6OnNldE5ld1RocmVzaG9sZEZv
ck9TUkV4aXQpOgorICAgICAgICAqIGJ5dGVjb2RlL01ldGhvZE9mR2V0dGluZ0FWYWx1ZVByb2Zp
bGUuY3BwOgorICAgICAgICAoSlNDOjpNZXRob2RPZkdldHRpbmdBVmFsdWVQcm9maWxlOjpyZXBv
cnRWYWx1ZSk6CisgICAgICAgICogYnl0ZWNvZGUvTWV0aG9kT2ZHZXR0aW5nQVZhbHVlUHJvZmls
ZS5oOgorICAgICAgICAqIGRmZy9ERkdEcml2ZXIuY3BwOgorICAgICAgICAoSlNDOjpERkc6OmNv
bXBpbGVJbXBsKToKKyAgICAgICAgKiBkZmcvREZHSklUQ29tcGlsZXIuY3BwOgorICAgICAgICAo
SlNDOjpERkc6OkpJVENvbXBpbGVyOjpsaW5rT1NSRXhpdHMpOgorICAgICAgICAoSlNDOjpERkc6
OkpJVENvbXBpbGVyOjpsaW5rKToKKyAgICAgICAgKiBkZmcvREZHT1NSRXhpdC5jcHA6CisgICAg
ICAgIChKU0M6OkRGRzo6anNWYWx1ZUZvcik6CisgICAgICAgIChKU0M6OkRGRzo6cmVzdG9yZUNh
bGxlZVNhdmVzRm9yKToKKyAgICAgICAgKEpTQzo6REZHOjpzYXZlQ2FsbGVlU2F2ZXNGb3IpOgor
ICAgICAgICAoSlNDOjpERkc6OnJlc3RvcmVDYWxsZWVTYXZlc0Zyb21WTUVudHJ5RnJhbWVDYWxs
ZWVTYXZlc0J1ZmZlcik6CisgICAgICAgIChKU0M6OkRGRzo6Y29weUNhbGxlZVNhdmVzVG9WTUVu
dHJ5RnJhbWVDYWxsZWVTYXZlc0J1ZmZlcik6CisgICAgICAgIChKU0M6OkRGRzo6c2F2ZU9yQ29w
eUNhbGxlZVNhdmVzRm9yKToKKyAgICAgICAgKEpTQzo6REZHOjpjcmVhdGVEaXJlY3RBcmd1bWVu
dHNEdXJpbmdFeGl0KToKKyAgICAgICAgKEpTQzo6REZHOjpjcmVhdGVDbG9uZWRBcmd1bWVudHNE
dXJpbmdFeGl0KToKKyAgICAgICAgKEpTQzo6REZHOjplbWl0UmVzdG9yZUFyZ3VtZW50cyk6Cisg
ICAgICAgIChKU0M6OkRGRzo6T1NSRXhpdDo6ZXhlY3V0ZU9TUkV4aXQpOgorICAgICAgICAoSlND
OjpERkc6OnJlaWZ5SW5saW5lZENhbGxGcmFtZXMpOgorICAgICAgICAoSlNDOjpERkc6OmFkanVz
dEFuZEp1bXBUb1RhcmdldCk6CisgICAgICAgIChKU0M6OkRGRzo6cHJpbnRPU1JFeGl0KToKKyAg
ICAgICAgKiBkZmcvREZHT1NSRXhpdC5oOgorICAgICAgICAoSlNDOjpERkc6Ok9TUkV4aXRTdGF0
ZTo6T1NSRXhpdFN0YXRlKToKKyAgICAgICAgKiBkZmcvREZHVGh1bmtzLmNwcDoKKyAgICAgICAg
KEpTQzo6REZHOjpvc3JFeGl0VGh1bmtHZW5lcmF0b3IpOgorICAgICAgICAqIGRmZy9ERkdUaHVu
a3MuaDoKKyAgICAgICAgKiBkZmcvREZHVmFyaWFibGVFdmVudFN0cmVhbS5jcHA6CisgICAgICAg
IChKU0M6OkRGRzo6dHJ5VG9TZXRDb25zdGFudFJlY292ZXJ5KToKKyAgICAgICAgKEpTQzo6REZH
OjpWYXJpYWJsZUV2ZW50U3RyZWFtOjpyZWNvbnN0cnVjdCBjb25zdCk6CisgICAgICAgIChKU0M6
OkRGRzo6VmFyaWFibGVFdmVudFN0cmVhbTo6dHJ5VG9TZXRDb25zdGFudFJlY292ZXJ5IGNvbnN0
KTogRGVsZXRlZC4KKyAgICAgICAgKiBkZmcvREZHVmFyaWFibGVFdmVudFN0cmVhbS5oOgorICAg
ICAgICAqIHByb2ZpbGVyL1Byb2ZpbGVyT1NSRXhpdC5oOgorICAgICAgICAoSlNDOjpQcm9maWxl
cjo6T1NSRXhpdDo6aW5jQ291bnQpOgorICAgICAgICAqIHJ1bnRpbWUvSlNDSlNWYWx1ZS5oOgor
ICAgICAgICAqIHJ1bnRpbWUvSlNDSlNWYWx1ZUlubGluZXMuaDoKKyAgICAgICAgKiBydW50aW1l
L09wdGlvbnMuaDoKKwogMjAxNy0xMC0wNCAgUnlhbiBIYWRkYWQgIDxyeWFuaGFkZGFkQGFwcGxl
LmNvbT4KIAogICAgICAgICBVbnJldmlld2VkLCByb2xsaW5nIG91dCByMjIyODQwLgpJbmRleDog
U291cmNlL0phdmFTY3JpcHRDb3JlL0phdmFTY3JpcHRDb3JlLnhjb2RlcHJvai9wcm9qZWN0LnBi
eHByb2oKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRDb3JlL0phdmFTY3JpcHRDb3Jl
Lnhjb2RlcHJvai9wcm9qZWN0LnBieHByb2oJKHJldmlzaW9uIDIyMjg3MCkKKysrIFNvdXJjZS9K
YXZhU2NyaXB0Q29yZS9KYXZhU2NyaXB0Q29yZS54Y29kZXByb2ovcHJvamVjdC5wYnhwcm9qCSh3
b3JraW5nIGNvcHkpCkBAIC00NTk2LDYgKzQ1OTYsNyBAQAogCQlGRUEwQzQwMDFDREQ3RDBFMDA0
ODE5OTEgLyogRnVuY3Rpb25XaGl0ZWxpc3QuY3BwICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVu
Y2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jcHAu
Y3BwOyBwYXRoID0gRnVuY3Rpb25XaGl0ZWxpc3QuY3BwOyBzb3VyY2VUcmVlID0gIjxncm91cD4i
OyB9OwogCQlGRUEwQzQwMTFDREQ3RDBFMDA0ODE5OTEgLyogRnVuY3Rpb25XaGl0ZWxpc3QuaCAq
LyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25G
aWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5oOyBwYXRoID0gRnVuY3Rpb25XaGl0ZWxpc3QuaDsgc291
cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKIAkJRkVCMTM3NTYxQkIxMUVFRTAwQ0Q1MTAwIC8qIE1h
Y3JvQXNzZW1ibGVyQVJNNjQuY3BwICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVF
bmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jcHAuY3BwOyBwYXRo
ID0gTWFjcm9Bc3NlbWJsZXJBUk02NC5jcHA7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJ
CUZFQjQxQ0NCMUY3MzI4NDIwMEM1NDgxRSAvKiBQcm9iZUZyYW1lLmggKi8gPSB7aXNhID0gUEJY
RmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3Vy
Y2Vjb2RlLmMuaDsgcGF0aCA9IFByb2JlRnJhbWUuaDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+Ijsg
fTsKIAkJRkVCNTFGNkExQTk3QjY4ODAwMUY5MjFDIC8qIFJlZ3Jlc3MxNDE4MDkuaCAqLyA9IHtp
c2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlw
ZSA9IHNvdXJjZWNvZGUuYy5oOyBuYW1lID0gUmVncmVzczE0MTgwOS5oOyBwYXRoID0gQVBJL3Rl
c3RzL1JlZ3Jlc3MxNDE4MDkuaDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKIAkJRkVCNTFG
NkIxQTk3QjY4ODAwMUY5MjFDIC8qIFJlZ3Jlc3MxNDE4MDkubW0gKi8gPSB7aXNhID0gUEJYRmls
ZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vj
b2RlLmNwcC5vYmpjcHA7IG5hbWUgPSBSZWdyZXNzMTQxODA5Lm1tOyBwYXRoID0gQVBJL3Rlc3Rz
L1JlZ3Jlc3MxNDE4MDkubW07IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CiAJCUZFQjU4QzEy
MTg3QjhCMTYwMDk4RUYwQiAvKiBFcnJvckhhbmRsaW5nU2NvcGUuY3BwICovID0ge2lzYSA9IFBC
WEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291
cmNlY29kZS5jcHAuY3BwOyBwYXRoID0gRXJyb3JIYW5kbGluZ1Njb3BlLmNwcDsgc291cmNlVHJl
ZSA9ICI8Z3JvdXA+IjsgfTsKQEAgLTcyOTUsNiArNzI5Niw3IEBACiAJCQkJRkU2M0RENTMxRUE5
QjYwRTAwMTAzQTY5IC8qIFByaW50ZXIuaCAqLywKIAkJCQlGRTEwQUFGMzFGNDY4MjZEMDA5REVE
QzUgLyogUHJvYmVDb250ZXh0LmNwcCAqLywKIAkJCQlGRTEwQUFFRDFGNDREOTQ2MDA5REVEQzUg
LyogUHJvYmVDb250ZXh0LmggKi8sCisJCQkJRkVCNDFDQ0IxRjczMjg0MjAwQzU0ODFFIC8qIFBy
b2JlRnJhbWUuaCAqLywKIAkJCQlGRTEwQUFFOTFGNDRENTEwMDA5REVEQzUgLyogUHJvYmVTdGFj
ay5jcHAgKi8sCiAJCQkJRkUxMEFBRUExRjQ0RDUxMjAwOURFREM1IC8qIFByb2JlU3RhY2suaCAq
LywKIAkJCQlGRTUzM0NBMDFGMjE3QzMxMDAxNkExRkUgLyogdGVzdG1hc20uY3BwICovLApJbmRl
eDogU291cmNlL0phdmFTY3JpcHRDb3JlL2Fzc2VtYmxlci9NYWNyb0Fzc2VtYmxlci5jcHAKPT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRDb3JlL2Fzc2VtYmxlci9NYWNyb0Fzc2VtYmxl
ci5jcHAJKHJldmlzaW9uIDIyMjg3MCkKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9hc3NlbWJs
ZXIvTWFjcm9Bc3NlbWJsZXIuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0zOCw3ICszOCw3IEBAIGNv
bnN0IGRvdWJsZSBNYWNyb0Fzc2VtYmxlcjo6dHdvVG9UaGUzMiAKICNpZiBFTkFCTEUoTUFTTV9Q
Uk9CRSkKIHN0YXRpYyB2b2lkIHN0ZEZ1bmN0aW9uQ2FsbGJhY2soUHJvYmU6OkNvbnRleHQmIGNv
bnRleHQpCiB7Ci0gICAgYXV0byBmdW5jID0gc3RhdGljX2Nhc3Q8Y29uc3Qgc3RkOjpmdW5jdGlv
bjx2b2lkKFByb2JlOjpDb250ZXh0Jik+Kj4oY29udGV4dC5hcmcpOworICAgIGF1dG8gZnVuYyA9
IGNvbnRleHQuYXJnPGNvbnN0IHN0ZDo6ZnVuY3Rpb248dm9pZChQcm9iZTo6Q29udGV4dCYpPio+
KCk7CiAgICAgKCpmdW5jKShjb250ZXh0KTsKIH0KICAgICAKSW5kZXg6IFNvdXJjZS9KYXZhU2Ny
aXB0Q29yZS9hc3NlbWJsZXIvTWFjcm9Bc3NlbWJsZXJQcmludGVyLmNwcAo9PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0t
LSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYXNzZW1ibGVyL01hY3JvQXNzZW1ibGVyUHJpbnRlci5j
cHAJKHJldmlzaW9uIDIyMjg3MCkKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9hc3NlbWJsZXIv
TWFjcm9Bc3NlbWJsZXJQcmludGVyLmNwcAkod29ya2luZyBjb3B5KQpAQCAtMTc1LDcgKzE3NSw3
IEBAIHZvaWQgcHJpbnRNZW1vcnkoUHJpbnRTdHJlYW0mIG91dCwgQ29udGUKIHZvaWQgcHJpbnRD
YWxsYmFjayhQcm9iZTo6Q29udGV4dCYgcHJvYmVDb250ZXh0KQogewogICAgIGF1dG8mIG91dCA9
IFdURjo6ZGF0YUZpbGUoKTsKLSAgICBQcmludFJlY29yZExpc3QmIGxpc3QgPSAqcmVpbnRlcnBy
ZXRfY2FzdDxQcmludFJlY29yZExpc3QqPihwcm9iZUNvbnRleHQuYXJnKTsKKyAgICBQcmludFJl
Y29yZExpc3QmIGxpc3QgPSAqcHJvYmVDb250ZXh0LmFyZzxQcmludFJlY29yZExpc3QqPigpOwog
ICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbGlzdC5zaXplKCk7IGkrKykgewogICAgICAgICBh
dXRvJiByZWNvcmQgPSBsaXN0W2ldOwogICAgICAgICBDb250ZXh0IGNvbnRleHQocHJvYmVDb250
ZXh0LCByZWNvcmQuZGF0YSk7CkluZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYXNzZW1ibGVy
L1Byb2JlQ29udGV4dC5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRDb3JlL2Fz
c2VtYmxlci9Qcm9iZUNvbnRleHQuY3BwCShyZXZpc2lvbiAyMjI4NzApCisrKyBTb3VyY2UvSmF2
YVNjcmlwdENvcmUvYXNzZW1ibGVyL1Byb2JlQ29udGV4dC5jcHAJKHdvcmtpbmcgY29weSkKQEAg
LTUyLDggKzUyLDkgQEAgdm9pZCBleGVjdXRlUHJvYmUoU3RhdGUqIHN0YXRlKQogI2VuZGlmCiAK
ICAgICBpZiAoY29udGV4dC5oYXNXcml0ZXNUb0ZsdXNoKCkpIHsKLSAgICAgICAgY29udGV4dC5z
dGFjaygpLnNldE5ld1N0YWNrUG9pbnRlcihzdGF0ZS0+Y3B1LnNwKCkpOwotICAgICAgICBzdGF0
ZS0+Y3B1LnNwKCkgPSBzdGQ6Om1pbihjb250ZXh0LnN0YWNrKCkubG93V2F0ZXJtYXJrKCksIHN0
YXRlLT5jcHUuc3AoKSk7CisgICAgICAgIGNvbnRleHQuc3RhY2soKS5zZXRTYXZlZFN0YWNrUG9p
bnRlcihzdGF0ZS0+Y3B1LnNwKCkpOworICAgICAgICB2b2lkKiBsb3dXYXRlcm1hcmsgPSBjb250
ZXh0LnN0YWNrKCkubG93V2F0ZXJtYXJrKHN0YXRlLT5jcHUuc3AoKSk7CisgICAgICAgIHN0YXRl
LT5jcHUuc3AoKSA9IHN0ZDo6bWluKGxvd1dhdGVybWFyaywgc3RhdGUtPmNwdS5zcCgpKTsKIAog
ICAgICAgICBzdGF0ZS0+aW5pdGlhbGl6ZVN0YWNrRnVuY3Rpb24gPSBmbHVzaERpcnR5U3RhY2tQ
YWdlczsKICAgICAgICAgc3RhdGUtPmluaXRpYWxpemVTdGFja0FyZyA9IGNvbnRleHQucmVsZWFz
ZVN0YWNrKCk7CkBAIC02NCw3ICs2NSw3IEBAIHN0YXRpYyB2b2lkIGZsdXNoRGlydHlTdGFja1Bh
Z2VzKFN0YXRlKiAKIHsKICAgICBzdGQ6OnVuaXF1ZV9wdHI8U3RhY2s+IHN0YWNrKHJlaW50ZXJw
cmV0X2Nhc3Q8UHJvYmU6OlN0YWNrKj4oc3RhdGUtPmluaXRpYWxpemVTdGFja0FyZykpOwogICAg
IHN0YWNrLT5mbHVzaFdyaXRlcygpOwotICAgIHN0YXRlLT5jcHUuc3AoKSA9IHN0YWNrLT5uZXdT
dGFja1BvaW50ZXIoKTsKKyAgICBzdGF0ZS0+Y3B1LnNwKCkgPSBzdGFjay0+c2F2ZWRTdGFja1Bv
aW50ZXIoKTsKIH0KIAogLy8gTm90IGZvciBnZW5lcmFsIHVzZS4gVGhpcyBzaG91bGQgb25seSBi
ZSBmb3Igd3JpdGluZyB0ZXN0cy4KSW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9hc3NlbWJs
ZXIvUHJvYmVDb250ZXh0LmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRDb3JlL2Fz
c2VtYmxlci9Qcm9iZUNvbnRleHQuaAkocmV2aXNpb24gMjIyODcwKQorKysgU291cmNlL0phdmFT
Y3JpcHRDb3JlL2Fzc2VtYmxlci9Qcm9iZUNvbnRleHQuaAkod29ya2luZyBjb3B5KQpAQCAtMTkx
LDExICsxOTEsMTMgQEAgcHVibGljOgogICAgIHVzaW5nIEZQUmVnaXN0ZXJJRCA9IE1hY3JvQXNz
ZW1ibGVyOjpGUFJlZ2lzdGVySUQ7CiAKICAgICBDb250ZXh0KFN0YXRlKiBzdGF0ZSkKLSAgICAg
ICAgOiBtX3N0YXRlKHN0YXRlKQotICAgICAgICAsIGFyZyhzdGF0ZS0+YXJnKQotICAgICAgICAs
IGNwdShzdGF0ZS0+Y3B1KQorICAgICAgICA6IGNwdShzdGF0ZS0+Y3B1KQorICAgICAgICAsIG1f
c3RhdGUoc3RhdGUpCiAgICAgeyB9CiAKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorICAgIFQg
YXJnKCkgeyByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxUPihtX3N0YXRlLT5hcmcpOyB9CisKICAg
ICB1aW50cHRyX3QmIGdwcihSZWdpc3RlcklEIGlkKSB7IHJldHVybiBjcHUuZ3ByKGlkKTsgfQog
ICAgIHVpbnRwdHJfdCYgc3ByKFNQUmVnaXN0ZXJJRCBpZCkgeyByZXR1cm4gY3B1LnNwcihpZCk7
IH0KICAgICBkb3VibGUmIGZwcihGUFJlZ2lzdGVySUQgaWQpIHsgcmV0dXJuIGNwdS5mcHIoaWQp
OyB9CkBAIC0yMjQsMTMgKzIyNiwxMCBAQCBwdWJsaWM6CiAgICAgYm9vbCBoYXNXcml0ZXNUb0Zs
dXNoKCkgeyByZXR1cm4gbV9zdGFjay5oYXNXcml0ZXNUb0ZsdXNoKCk7IH0KICAgICBTdGFjayog
cmVsZWFzZVN0YWNrKCkgeyByZXR1cm4gbmV3IFN0YWNrKFdURk1vdmUobV9zdGFjaykpOyB9CiAK
LXByaXZhdGU6Ci0gICAgU3RhdGUqIG1fc3RhdGU7Ci1wdWJsaWM6Ci0gICAgdm9pZCogYXJnOwog
ICAgIENQVVN0YXRlJiBjcHU7CiAKIHByaXZhdGU6CisgICAgU3RhdGUqIG1fc3RhdGU7CiAgICAg
U3RhY2sgbV9zdGFjazsKIAogICAgIGZyaWVuZCBKU19FWFBPUlRfUFJJVkFURSB2b2lkKiBwcm9i
ZVN0YXRlRm9yQ29udGV4dChDb250ZXh0Jik7IC8vIE5vdCBmb3IgZ2VuZXJhbCB1c2UuIFRoaXMg
c2hvdWxkIG9ubHkgYmUgZm9yIHdyaXRpbmcgdGVzdHMuCkluZGV4OiBTb3VyY2UvSmF2YVNjcmlw
dENvcmUvYXNzZW1ibGVyL1Byb2JlRnJhbWUuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNj
cmlwdENvcmUvYXNzZW1ibGVyL1Byb2JlRnJhbWUuaAkobm9uZXhpc3RlbnQpCisrKyBTb3VyY2Uv
SmF2YVNjcmlwdENvcmUvYXNzZW1ibGVyL1Byb2JlRnJhbWUuaAkod29ya2luZyBjb3B5KQpAQCAt
MCwwICsxLDk0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IEFwcGxlIEluYy4gQWxsIHJp
Z2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBh
bmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBl
cm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1l
dDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUg
YWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFu
ZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmlu
YXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNl
LCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGlu
IHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVk
IHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVE
IEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBX
QVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVE
IFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VM
QVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJ
TkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVD
VCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBE
QU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9G
IFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICog
UFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04g
QU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1Qg
TElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNF
KSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUs
IEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8K
KworI3ByYWdtYSBvbmNlCisKKyNpZiBFTkFCTEUoTUFTTV9QUk9CRSkKKworI2luY2x1ZGUgIkNh
bGxGcmFtZS5oIgorI2luY2x1ZGUgIlByb2JlU3RhY2suaCIKKworbmFtZXNwYWNlIEpTQyB7Citu
YW1lc3BhY2UgUHJvYmUgeworCitjbGFzcyBGcmFtZSB7CitwdWJsaWM6CisgICAgRnJhbWUodm9p
ZCogZnJhbWVCYXNlLCBTdGFjayYgc3RhY2spCisgICAgICAgIDogbV9mcmFtZUJhc2UgeyByZWlu
dGVycHJldF9jYXN0PHVpbnQ4X3QqPihmcmFtZUJhc2UpIH0KKyAgICAgICAgLCBtX3N0YWNrIHsg
c3RhY2sgfQorICAgIHsgfQorCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVCA9IEpTVmFsdWU+Cisg
ICAgVCBhcmd1bWVudChpbnQgYXJndW1lbnQpCisgICAgeworICAgICAgICByZXR1cm4gZ2V0PFQ+
KENhbGxGcmFtZTo6YXJndW1lbnRPZmZzZXQoYXJndW1lbnQpICogc2l6ZW9mKFJlZ2lzdGVyKSk7
CisgICAgfQorICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQgPSBKU1ZhbHVlPgorICAgIFQgb3BlcmFu
ZChpbnQgb3BlcmFuZCkKKyAgICB7CisgICAgICAgIHJldHVybiBnZXQ8VD4oc3RhdGljX2Nhc3Q8
VmlydHVhbFJlZ2lzdGVyPihvcGVyYW5kKS5vZmZzZXQoKSAqIHNpemVvZihSZWdpc3RlcikpOwor
ICAgIH0KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUID0gSlNWYWx1ZT4KKyAgICBUIG9wZXJhbmQo
aW50IG9wZXJhbmQsIHB0cmRpZmZfdCBvZmZzZXQpCisgICAgeworICAgICAgICByZXR1cm4gZ2V0
PFQ+KHN0YXRpY19jYXN0PFZpcnR1YWxSZWdpc3Rlcj4ob3BlcmFuZCkub2Zmc2V0KCkgKiBzaXpl
b2YoUmVnaXN0ZXIpICsgb2Zmc2V0KTsKKyAgICB9CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBU
PgorICAgIHZvaWQgc2V0QXJndW1lbnQoaW50IGFyZ3VtZW50LCBUIHZhbHVlKQorICAgIHsKKyAg
ICAgICAgcmV0dXJuIHNldDxUPihDYWxsRnJhbWU6OmFyZ3VtZW50T2Zmc2V0KGFyZ3VtZW50KSAq
IHNpemVvZihSZWdpc3RlciksIHZhbHVlKTsKKyAgICB9CisgICAgdGVtcGxhdGU8dHlwZW5hbWUg
VD4KKyAgICB2b2lkIHNldE9wZXJhbmQoaW50IG9wZXJhbmQsIFQgdmFsdWUpCisgICAgeworICAg
ICAgICBzZXQ8VD4oc3RhdGljX2Nhc3Q8VmlydHVhbFJlZ2lzdGVyPihvcGVyYW5kKS5vZmZzZXQo
KSAqIHNpemVvZihSZWdpc3RlciksIHZhbHVlKTsKKyAgICB9CisgICAgdGVtcGxhdGU8dHlwZW5h
bWUgVD4KKyAgICB2b2lkIHNldE9wZXJhbmQoaW50IG9wZXJhbmQsIHB0cmRpZmZfdCBvZmZzZXQs
IFQgdmFsdWUpCisgICAgeworICAgICAgICBzZXQ8VD4oc3RhdGljX2Nhc3Q8VmlydHVhbFJlZ2lz
dGVyPihvcGVyYW5kKS5vZmZzZXQoKSAqIHNpemVvZihSZWdpc3RlcikgKyBvZmZzZXQsIHZhbHVl
KTsKKyAgICB9CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUID0gSlNWYWx1ZT4KKyAgICBUIGdl
dChwdHJkaWZmX3Qgb2Zmc2V0KQorICAgIHsKKyAgICAgICAgcmV0dXJuIG1fc3RhY2suZ2V0PFQ+
KG1fZnJhbWVCYXNlICsgb2Zmc2V0KTsKKyAgICB9CisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4K
KyAgICB2b2lkIHNldChwdHJkaWZmX3Qgb2Zmc2V0LCBUIHZhbHVlKQorICAgIHsKKyAgICAgICAg
bV9zdGFjay5zZXQ8VD4obV9mcmFtZUJhc2UgKyBvZmZzZXQsIHZhbHVlKTsKKyAgICB9CisKK3By
aXZhdGU6CisgICAgdWludDhfdCogbV9mcmFtZUJhc2U7CisgICAgU3RhY2smIG1fc3RhY2s7Cit9
OworCit9IC8vIG5hbWVzcGFjZSBQcm9iZQorfSAvLyBuYW1lc3BhY2UgSlNDCisKKyNlbmRpZiAv
LyBFTkFCTEUoTUFTTV9QUk9CRSkKSW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9hc3NlbWJs
ZXIvUHJvYmVTdGFjay5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRDb3JlL2Fz
c2VtYmxlci9Qcm9iZVN0YWNrLmNwcAkocmV2aXNpb24gMjIyODcwKQorKysgU291cmNlL0phdmFT
Y3JpcHRDb3JlL2Fzc2VtYmxlci9Qcm9iZVN0YWNrLmNwcAkod29ya2luZyBjb3B5KQpAQCAtMzQs
NiArMzQsOCBAQAogbmFtZXNwYWNlIEpTQyB7CiBuYW1lc3BhY2UgUHJvYmUgewogCitzdGF0aWMg
dm9pZCogY29uc3QgbWF4TG93V2F0ZXJtYXJrID0gcmVpbnRlcnByZXRfY2FzdDx2b2lkKj4oc3Rk
OjpudW1lcmljX2xpbWl0czx1aW50cHRyX3Q+OjptYXgoKSk7CisKICNpZiBBU0FOX0VOQUJMRUQK
IC8vIEZJWE1FOiB3ZSBzaG91bGQgY29uc2lkZXIgdXNpbmcgdGhlIGNvcHkgZnVuY3Rpb24gZm9y
IGJvdGggQVNhbiBhbmQgbm9uLUFTYW4gYnVpbGRzLgogLy8gaHR0cHM6Ly9idWdzLndlYmtpdC5v
cmcvc2hvd19idWcuY2dpP2lkPTE3Njk2MQpAQCAtNDksNyArNTEsNyBAQCBzdGF0aWMgdm9pZCBj
b3B5U3RhY2tQYWdlKHZvaWQqIGRzdCwgdm9pCiAgICAgICAgICpkc3RQb2ludGVyKysgPSAqc3Jj
UG9pbnRlcisrOwogfQogI2Vsc2UKLSNkZWZpbmUgY29weVN0YWNrUGFnZShkc3QsIHNyYywgc2l6
ZSkgc3RkOjptZW1jcHkoZHN0LCBzcmMsIHNpemUpOworI2RlZmluZSBjb3B5U3RhY2tQYWdlKGRz
dCwgc3JjLCBzaXplKSBzdGQ6Om1lbWNweShkc3QsIHNyYywgc2l6ZSkKICNlbmRpZgogCiBQYWdl
OjpQYWdlKHZvaWQqIGJhc2VBZGRyZXNzKQpAQCAtODQsMTIgKzg2LDI0IEBAIHZvaWQgUGFnZTo6
Zmx1c2hXcml0ZXMoKQogICAgIG1fZGlydHlCaXRzID0gMDsKIH0KIAordm9pZCogUGFnZTo6bG93
V2F0ZXJtYXJrRnJvbVZpc2l0aW5nRGlydHlDaHVua3MoKQoreworICAgIHVpbnQ2NF90IGRpcnR5
Qml0cyA9IG1fZGlydHlCaXRzOworICAgIHNpemVfdCBvZmZzZXQgPSAwOworICAgIHdoaWxlIChk
aXJ0eUJpdHMpIHsKKyAgICAgICAgaWYgKGRpcnR5Qml0cyAmIDEpCisgICAgICAgICAgICByZXR1
cm4gcmVpbnRlcnByZXRfY2FzdDx1aW50OF90Kj4obV9iYXNlTG9naWNhbEFkZHJlc3MpICsgb2Zm
c2V0OworICAgICAgICBkaXJ0eUJpdHMgPSBkaXJ0eUJpdHMgPj4gMTsKKyAgICAgICAgb2Zmc2V0
ICs9IHNfY2h1bmtTaXplOworICAgIH0KKyAgICByZXR1cm4gbWF4TG93V2F0ZXJtYXJrOworfQor
CiBTdGFjazo6U3RhY2soU3RhY2smJiBvdGhlcikKLSAgICA6IG1fbmV3U3RhY2tQb2ludGVyKG90
aGVyLm1fbmV3U3RhY2tQb2ludGVyKQotICAgICwgbV9sb3dXYXRlcm1hcmsob3RoZXIubV9sb3dX
YXRlcm1hcmspCi0gICAgLCBtX3N0YWNrQm91bmRzKFdURk1vdmUob3RoZXIubV9zdGFja0JvdW5k
cykpCisgICAgOiBtX3N0YWNrQm91bmRzKFdURk1vdmUob3RoZXIubV9zdGFja0JvdW5kcykpCiAg
ICAgLCBtX3BhZ2VzKFdURk1vdmUob3RoZXIubV9wYWdlcykpCiB7CisgICAgbV9zYXZlZFN0YWNr
UG9pbnRlciA9IG90aGVyLm1fc2F2ZWRTdGFja1BvaW50ZXI7CiAjaWYgIUFTU0VSVF9ESVNBQkxF
RAogICAgIG90aGVyLm1faXNWYWxpZCA9IGZhbHNlOwogI2VuZGlmCkBAIC0xMjgsNiArMTQyLDE4
IEBAIFBhZ2UqIFN0YWNrOjplbnN1cmVQYWdlRm9yKHZvaWQqIGFkZHJlc3MKICAgICByZXR1cm4g
bV9sYXN0QWNjZXNzZWRQYWdlOwogfQogCit2b2lkKiBTdGFjazo6bG93V2F0ZXJtYXJrRnJvbVZp
c2l0aW5nRGlydHlQYWdlcygpCit7CisgICAgdm9pZCogbG93ID0gbWF4TG93V2F0ZXJtYXJrOwor
ICAgIGZvciAoYXV0byBpdCA9IG1fcGFnZXMuYmVnaW4oKTsgaXQgIT0gbV9wYWdlcy5lbmQoKTsg
KytpdCkgeworICAgICAgICBQYWdlJiBwYWdlID0gKml0LT52YWx1ZTsKKyAgICAgICAgaWYgKCFw
YWdlLmhhc1dyaXRlc1RvRmx1c2goKSB8fCBsb3cgPCBwYWdlLmJhc2VBZGRyZXNzKCkpCisgICAg
ICAgICAgICBjb250aW51ZTsKKyAgICAgICAgbG93ID0gc3RkOjptaW4obG93LCBwYWdlLmxvd1dh
dGVybWFya0Zyb21WaXNpdGluZ0RpcnR5Q2h1bmtzKCkpOworICAgIH0KKyAgICByZXR1cm4gbG93
OworfQorCiB9IC8vIG5hbWVzcGFjZSBQcm9iZQogfSAvLyBuYW1lc3BhY2UgSlNDCiAKSW5kZXg6
IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9hc3NlbWJsZXIvUHJvYmVTdGFjay5oCj09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0K
LS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9hc3NlbWJsZXIvUHJvYmVTdGFjay5oCShyZXZpc2lv
biAyMjI4NzApCisrKyBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYXNzZW1ibGVyL1Byb2JlU3RhY2su
aAkod29ya2luZyBjb3B5KQpAQCAtOTUsNiArOTUsOCBAQCBwdWJsaWM6CiAgICAgICAgICAgICBm
bHVzaFdyaXRlcygpOwogICAgIH0KIAorICAgIHZvaWQqIGxvd1dhdGVybWFya0Zyb21WaXNpdGlu
Z0RpcnR5Q2h1bmtzKCk7CisKIHByaXZhdGU6CiAgICAgdWludDY0X3QgZGlydHlCaXRGb3Iodm9p
ZCogbG9naWNhbEFkZHJlc3MpCiAgICAgewpAQCAtMTQ2LDE3ICsxNDgsMTUgQEAgY2xhc3MgU3Rh
Y2sgewogICAgIFdURl9NQUtFX0ZBU1RfQUxMT0NBVEVEOwogcHVibGljOgogICAgIFN0YWNrKCkK
LSAgICAgICAgOiBtX2xvd1dhdGVybWFyayhyZWludGVycHJldF9jYXN0PHZvaWQqPigtMSkpCi0g
ICAgICAgICwgbV9zdGFja0JvdW5kcyhUaHJlYWQ6OmN1cnJlbnQoKS5zdGFjaygpKQorICAgICAg
ICA6IG1fc3RhY2tCb3VuZHMoVGhyZWFkOjpjdXJyZW50KCkuc3RhY2soKSkKICAgICB7IH0KICAg
ICBTdGFjayhTdGFjayYmIG90aGVyKTsKIAotICAgIHZvaWQqIGxvd1dhdGVybWFyaygpCisgICAg
dm9pZCogbG93V2F0ZXJtYXJrRnJvbVZpc2l0aW5nRGlydHlQYWdlcygpOworICAgIHZvaWQqIGxv
d1dhdGVybWFyayh2b2lkKiBzdGFja1BvaW50ZXIpCiAgICAgewotICAgICAgICAvLyBXZSB1c2Ug
dGhlIGNodW5rQWRkcmVzcyBmb3IgdGhlIGxvdyB3YXRlcm1hcmsgYmVjYXVzZSB3ZSdsbCBiZSBk
b2luZyB3cml0ZSBiYWNrcwotICAgICAgICAvLyB0byB0aGUgc3RhY2sgaW4gaW5jcmVtZW50cyBv
ZiBjaHVua3MuIEhlbmNlLCB3ZSdsbCB0cmVhdCB0aGUgbG93ZXN0IGFkZHJlc3Mgb2YKLSAgICAg
ICAgLy8gdGhlIGNodW5rIGFzIHRoZSBsb3cgd2F0ZXJtYXJrIG9mIGFueSBnaXZlbiBzZXQgYWRk
cmVzcy4KLSAgICAgICAgcmV0dXJuIFBhZ2U6OmNodW5rQWRkcmVzc0ZvcihtX2xvd1dhdGVybWFy
ayk7CisgICAgICAgIEFTU0VSVChQYWdlOjpjaHVua0FkZHJlc3NGb3Ioc3RhY2tQb2ludGVyKSA9
PSBsb3dXYXRlcm1hcmtGcm9tVmlzaXRpbmdEaXJ0eVBhZ2VzKCkpOworICAgICAgICByZXR1cm4g
UGFnZTo6Y2h1bmtBZGRyZXNzRm9yKHN0YWNrUG9pbnRlcik7CiAgICAgfQogCiAgICAgdGVtcGxh
dGU8dHlwZW5hbWUgVD4KQEAgLTE3Niw5ICsxNzYsNiBAQCBwdWJsaWM6CiAgICAgewogICAgICAg
ICBQYWdlKiBwYWdlID0gcGFnZUZvcihhZGRyZXNzKTsKICAgICAgICAgcGFnZS0+c2V0PFQ+KGFk
ZHJlc3MsIHZhbHVlKTsKLQotICAgICAgICBpZiAoYWRkcmVzcyA8IG1fbG93V2F0ZXJtYXJrKQot
ICAgICAgICAgICAgbV9sb3dXYXRlcm1hcmsgPSBhZGRyZXNzOwogICAgIH0KIAogICAgIHRlbXBs
YXRlPHR5cGVuYW1lIFQ+CkBAIC0xODksOCArMTg2LDggQEAgcHVibGljOgogCiAgICAgSlNfRVhQ
T1JUX1BSSVZBVEUgUGFnZSogZW5zdXJlUGFnZUZvcih2b2lkKiBhZGRyZXNzKTsKIAotICAgIHZv
aWQqIG5ld1N0YWNrUG9pbnRlcigpIGNvbnN0IHsgcmV0dXJuIG1fbmV3U3RhY2tQb2ludGVyOyB9
OwotICAgIHZvaWQgc2V0TmV3U3RhY2tQb2ludGVyKHZvaWQqIHNwKSB7IG1fbmV3U3RhY2tQb2lu
dGVyID0gc3A7IH07CisgICAgdm9pZCogc2F2ZWRTdGFja1BvaW50ZXIoKSBjb25zdCB7IHJldHVy
biBtX3NhdmVkU3RhY2tQb2ludGVyOyB9CisgICAgdm9pZCBzZXRTYXZlZFN0YWNrUG9pbnRlcih2
b2lkKiBzcCkgeyBtX3NhdmVkU3RhY2tQb2ludGVyID0gc3A7IH0KIAogICAgIGJvb2wgaGFzV3Jp
dGVzVG9GbHVzaCgpOwogICAgIHZvaWQgZmx1c2hXcml0ZXMoKTsKQEAgLTIwNyw4ICsyMDQsNyBA
QCBwcml2YXRlOgogICAgICAgICByZXR1cm4gZW5zdXJlUGFnZUZvcihhZGRyZXNzKTsKICAgICB9
CiAKLSAgICB2b2lkKiBtX25ld1N0YWNrUG9pbnRlciB7IG51bGxwdHIgfTsKLSAgICB2b2lkKiBt
X2xvd1dhdGVybWFyazsKKyAgICB2b2lkKiBtX3NhdmVkU3RhY2tQb2ludGVyIHsgbnVsbHB0ciB9
OwogCiAgICAgLy8gQSBjYWNoZSBvZiB0aGUgbGFzdCBhY2Nlc3NlZCBwYWdlIGRldGFpbHMgZm9y
IHF1aWNrIGFjY2Vzcy4KICAgICB2b2lkKiBtX2xhc3RBY2Nlc3NlZFBhZ2VCYXNlQWRkcmVzcyB7
IG51bGxwdHIgfTsKSW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9ieXRlY29kZS9BcnJheVBy
b2ZpbGUuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYnl0ZWNvZGUvQXJy
YXlQcm9maWxlLmgJKHJldmlzaW9uIDIyMjg3MCkKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9i
eXRlY29kZS9BcnJheVByb2ZpbGUuaAkod29ya2luZyBjb3B5KQpAQCAtMSw1ICsxLDUgQEAKIC8q
Ci0gKiBDb3B5cmlnaHQgKEMpIDIwMTIsIDIwMTMgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2Vy
dmVkLgorICogQ29weXJpZ2h0IChDKSAyMDEyLTIwMTcgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJl
c2VydmVkLgogICoKICAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5h
cnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAogICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVk
IHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCkBAIC0yMTgsNiArMjE4LDcg
QEAgcHVibGljOgogICAgIHZvaWQgY29tcHV0ZVVwZGF0ZWRQcmVkaWN0aW9uKGNvbnN0IENvbmN1
cnJlbnRKU0xvY2tlciYsIENvZGVCbG9jayopOwogICAgIHZvaWQgY29tcHV0ZVVwZGF0ZWRQcmVk
aWN0aW9uKGNvbnN0IENvbmN1cnJlbnRKU0xvY2tlciYsIENvZGVCbG9jayosIFN0cnVjdHVyZSog
bGFzdFNlZW5TdHJ1Y3R1cmUpOwogICAgIAorICAgIHZvaWQgb2JzZXJ2ZUFycmF5TW9kZShBcnJh
eU1vZGVzIG1vZGUpIHsgbV9vYnNlcnZlZEFycmF5TW9kZXMgfD0gbW9kZTsgfQogICAgIEFycmF5
TW9kZXMgb2JzZXJ2ZWRBcnJheU1vZGVzKGNvbnN0IENvbmN1cnJlbnRKU0xvY2tlciYpIGNvbnN0
IHsgcmV0dXJuIG1fb2JzZXJ2ZWRBcnJheU1vZGVzOyB9CiAgICAgYm9vbCBtYXlJbnRlcmNlcHRJ
bmRleGVkQWNjZXNzZXMoY29uc3QgQ29uY3VycmVudEpTTG9ja2VyJikgY29uc3QgeyByZXR1cm4g
bV9tYXlJbnRlcmNlcHRJbmRleGVkQWNjZXNzZXM7IH0KICAgICAKSW5kZXg6IFNvdXJjZS9KYXZh
U2NyaXB0Q29yZS9ieXRlY29kZS9Db2RlQmxvY2suY3BwCj09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9K
YXZhU2NyaXB0Q29yZS9ieXRlY29kZS9Db2RlQmxvY2suY3BwCShyZXZpc2lvbiAyMjI4NzApCisr
KyBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYnl0ZWNvZGUvQ29kZUJsb2NrLmNwcAkod29ya2luZyBj
b3B5KQpAQCAtMjMyMCw2ICsyMzIwLDUzIEBAIGJvb2wgQ29kZUJsb2NrOjpjaGVja0lmT3B0aW1p
emF0aW9uVGhyZXMKICAgICByZXR1cm4gbV9qaXRFeGVjdXRlQ291bnRlci5jaGVja0lmVGhyZXNo
b2xkQ3Jvc3NlZEFuZFNldCh0aGlzKTsKIH0KIAorYXV0byBDb2RlQmxvY2s6OnVwZGF0ZU9TUkV4
aXRDb3VudGVyQW5kQ2hlY2tJZk5lZWRUb1Jlb3B0aW1pemUoREZHOjpPU1JFeGl0U3RhdGUmIGV4
aXRTdGF0ZSkgLT4gT3B0aW1pemVBY3Rpb24KK3sKKyAgICBERkc6Ok9TUkV4aXRCYXNlJiBleGl0
ID0gZXhpdFN0YXRlLmV4aXQ7CisgICAgaWYgKCFleGl0S2luZE1heUpldHRpc29uKGV4aXQubV9r
aW5kKSkgeworICAgICAgICAvLyBGSVhNRTogV2UgbWF5IHdhbnQgdG8gbm90aWNlIHRoYXQgd2Un
cmUgZnJlcXVlbnRseSBleGl0aW5nCisgICAgICAgIC8vIGF0IGFuIG9wX2NhdGNoIHRoYXQgd2Ug
ZGlkbid0IGNvbXBpbGUgYW4gZW50cnlwb2ludCBmb3IsIGFuZAorICAgICAgICAvLyB0aGVuIHRy
aWdnZXIgYSByZW9wdGltaXphdGlvbiBvZiB0aGlzIENvZGVCbG9jazoKKyAgICAgICAgLy8gaHR0
cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTE3NTg0MgorICAgICAgICByZXR1
cm4gT3B0aW1pemVBY3Rpb246Ok5vbmU7CisgICAgfQorCisgICAgZXhpdC5tX2NvdW50Kys7Cisg
ICAgbV9vc3JFeGl0Q291bnRlcisrOworCisgICAgQ29kZUJsb2NrKiBiYXNlbGluZUNvZGVCbG9j
ayA9IGV4aXRTdGF0ZS5iYXNlbGluZUNvZGVCbG9jazsKKyAgICBBU1NFUlQoYmFzZWxpbmVDb2Rl
QmxvY2sgPT0gYmFzZWxpbmVBbHRlcm5hdGl2ZSgpKTsKKyAgICBpZiAoVU5MSUtFTFkoYmFzZWxp
bmVDb2RlQmxvY2stPmppdEV4ZWN1dGVDb3VudGVyKCkuaGFzQ3Jvc3NlZFRocmVzaG9sZCgpKSkK
KyAgICAgICAgcmV0dXJuIE9wdGltaXplQWN0aW9uOjpSZW9wdGltaXplTm93OworCisgICAgLy8g
V2Ugd2FudCB0byBmaWd1cmUgb3V0IGlmIHRoZXJlJ3MgYSBwb3NzaWJpbGl0eSB0aGF0IHdlJ3Jl
IGluIGEgbG9vcC4gRm9yIHRoZSBvdXRlcm1vc3QKKyAgICAvLyBjb2RlIGJsb2NrIGluIHRoZSBp
bmxpbmUgc3RhY2ssIHdlIGhhbmRsZSB0aGlzIGFwcHJvcHJpYXRlbHkgYnkgaGF2aW5nIHRoZSBs
b29wIE9TUiB0cmlnZ2VyCisgICAgLy8gY2hlY2sgdGhlIGV4aXQgY291bnQgb2YgdGhlIHJlcGxh
Y2VtZW50IG9mIHRoZSBDb2RlQmxvY2sgZnJvbSB3aGljaCB3ZSBhcmUgT1NSaW5nLiBUaGUKKyAg
ICAvLyBwcm9ibGVtIGlzIHRoZSBpbmxpbmVkIGZ1bmN0aW9ucywgd2hpY2ggbWlnaHQgYWxzbyBo
YXZlIGxvb3BzLCBidXQgd2hvc2UgYmFzZWxpbmUgdmVyc2lvbnMKKyAgICAvLyBkb24ndCBrbm93
IHdoZXJlIHRvIGxvb2sgZm9yIHRoZSBleGl0IGNvdW50LiBGaWd1cmUgb3V0IGlmIHRob3NlIGxv
b3BzIGFyZSBzZXZlcmUgZW5vdWdoCisgICAgLy8gdGhhdCB3ZSBoYWQgdHJpZWQgdG8gT1NSIGVu
dGVyLiBJZiBzbywgdGhlbiB3ZSBzaG91bGQgdXNlIHRoZSBsb29wIHJlb3B0aW1pemF0aW9uIHRy
aWdnZXIuCisgICAgLy8gT3RoZXJ3aXNlLCB3ZSBzaG91bGQgdXNlIHRoZSBub3JtYWwgcmVvcHRp
bWl6YXRpb24gdHJpZ2dlci4KKworICAgIGJvb2wgZGlkVHJ5VG9FbnRlckluTG9vcCA9IGZhbHNl
OworICAgIGZvciAoSW5saW5lQ2FsbEZyYW1lKiBpbmxpbmVDYWxsRnJhbWUgPSBleGl0Lm1fY29k
ZU9yaWdpbi5pbmxpbmVDYWxsRnJhbWU7IGlubGluZUNhbGxGcmFtZTsgaW5saW5lQ2FsbEZyYW1l
ID0gaW5saW5lQ2FsbEZyYW1lLT5kaXJlY3RDYWxsZXIuaW5saW5lQ2FsbEZyYW1lKSB7CisgICAg
ICAgIGlmIChpbmxpbmVDYWxsRnJhbWUtPmJhc2VsaW5lQ29kZUJsb2NrLT5vd25lclNjcmlwdEV4
ZWN1dGFibGUoKS0+ZGlkVHJ5VG9FbnRlckluTG9vcCgpKSB7CisgICAgICAgICAgICBkaWRUcnlU
b0VudGVySW5Mb29wID0gdHJ1ZTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAg
fQorCisgICAgdWludDMyX3QgZXhpdENvdW50VGhyZXNob2xkID0gZGlkVHJ5VG9FbnRlckluTG9v
cAorICAgICAgICA/IGV4aXRDb3VudFRocmVzaG9sZEZvclJlb3B0aW1pemF0aW9uRnJvbUxvb3Ao
KQorICAgICAgICA6IGV4aXRDb3VudFRocmVzaG9sZEZvclJlb3B0aW1pemF0aW9uKCk7CisKKyAg
ICBpZiAobV9vc3JFeGl0Q291bnRlciA+IGV4aXRDb3VudFRocmVzaG9sZCkKKyAgICAgICAgcmV0
dXJuIE9wdGltaXplQWN0aW9uOjpSZW9wdGltaXplTm93OworCisgICAgLy8gVG9vIGZldyBmYWls
cy4gQWRqdXN0IHRoZSBleGVjdXRpb24gY291bnRlciBzdWNoIHRoYXQgdGhlIHRhcmdldCBpcyB0
byBvbmx5IG9wdGltaXplIGFmdGVyIGEgd2hpbGUuCisgICAgYmFzZWxpbmVDb2RlQmxvY2stPm1f
aml0RXhlY3V0ZUNvdW50ZXIuc2V0TmV3VGhyZXNob2xkRm9yT1NSRXhpdChleGl0U3RhdGUuYWN0
aXZlVGhyZXNob2xkLCBleGl0U3RhdGUubWVtb3J5VXNhZ2VBZGp1c3RlZFRocmVzaG9sZCk7Cisg
ICAgcmV0dXJuIE9wdGltaXplQWN0aW9uOjpOb25lOworfQorCiB2b2lkIENvZGVCbG9jazo6b3B0
aW1pemVOZXh0SW52b2NhdGlvbigpCiB7CiAgICAgaWYgKE9wdGlvbnM6OnZlcmJvc2VPU1IoKSkK
SW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9ieXRlY29kZS9Db2RlQmxvY2suaAo9PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYnl0ZWNvZGUvQ29kZUJsb2NrLmgJKHJldmlz
aW9uIDIyMjg3MCkKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9ieXRlY29kZS9Db2RlQmxvY2su
aAkod29ya2luZyBjb3B5KQpAQCAtNzcsNiArNzcsMTAgQEAKIAogbmFtZXNwYWNlIEpTQyB7CiAK
K25hbWVzcGFjZSBERkcgeworc3RydWN0IE9TUkV4aXRTdGF0ZTsKK30gLy8gbmFtZXNwYWNlIERG
RworCiBjbGFzcyBCeXRlY29kZUxpdmVuZXNzQW5hbHlzaXM7CiBjbGFzcyBDb2RlQmxvY2tTZXQ7
CiBjbGFzcyBFeGVjU3RhdGU7CkBAIC03NjIsNyArNzY2LDggQEAgcHVibGljOgogCiAgICAgdm9p
ZCBjb3VudE9TUkV4aXQoKSB7IG1fb3NyRXhpdENvdW50ZXIrKzsgfQogCi0gICAgdWludDMyX3Qq
IGFkZHJlc3NPZk9TUkV4aXRDb3VudGVyKCkgeyByZXR1cm4gJm1fb3NyRXhpdENvdW50ZXI7IH0K
KyAgICBlbnVtIGNsYXNzIE9wdGltaXplQWN0aW9uIHsgTm9uZSwgUmVvcHRpbWl6ZU5vdyB9Owor
ICAgIE9wdGltaXplQWN0aW9uIHVwZGF0ZU9TUkV4aXRDb3VudGVyQW5kQ2hlY2tJZk5lZWRUb1Jl
b3B0aW1pemUoREZHOjpPU1JFeGl0U3RhdGUmKTsKIAogICAgIHN0YXRpYyBwdHJkaWZmX3Qgb2Zm
c2V0T2ZPU1JFeGl0Q291bnRlcigpIHsgcmV0dXJuIE9CSkVDVF9PRkZTRVRPRihDb2RlQmxvY2ss
IG1fb3NyRXhpdENvdW50ZXIpOyB9CiAKSW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9ieXRl
Y29kZS9FeGVjdXRpb25Db3VudGVyLmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRD
b3JlL2J5dGVjb2RlL0V4ZWN1dGlvbkNvdW50ZXIuaAkocmV2aXNpb24gMjIyODcwKQorKysgU291
cmNlL0phdmFTY3JpcHRDb3JlL2J5dGVjb2RlL0V4ZWN1dGlvbkNvdW50ZXIuaAkod29ya2luZyBj
b3B5KQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTIsIDIwMTQgQXBw
bGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChDKSAyMDEyLTIwMTcg
QXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICoKICAqIFJlZGlzdHJpYnV0aW9uIGFu
ZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAogICogbW9k
aWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25k
aXRpb25zCkBAIC01MCwxOCArNTAsMjYgQEAgaW5saW5lIGludDMyX3QgZm9ybWF0dGVkVG90YWxF
eGVjdXRpb25DbwogICAgIHUuZiA9IHZhbHVlOwogICAgIHJldHVybiB1Lmk7CiB9Ci0gICAgCisK
IHRlbXBsYXRlPENvdW50aW5nVmFyaWFudCBjb3VudGluZ1ZhcmlhbnQ+CiBjbGFzcyBFeGVjdXRp
b25Db3VudGVyIHsKIHB1YmxpYzoKICAgICBFeGVjdXRpb25Db3VudGVyKCk7CiAgICAgdm9pZCBm
b3JjZVNsb3dQYXRoQ29uY3VycmVudGx5KCk7IC8vIElmIHlvdSB1c2UgdGhpcywgY2hlY2tJZlRo
cmVzaG9sZENyb3NzZWRBbmRTZXQoKSBtYXkgc3RpbGwgcmV0dXJuIGZhbHNlLgogICAgIGJvb2wg
Y2hlY2tJZlRocmVzaG9sZENyb3NzZWRBbmRTZXQoQ29kZUJsb2NrKik7CisgICAgYm9vbCBoYXND
cm9zc2VkVGhyZXNob2xkKCkgY29uc3QgeyByZXR1cm4gbV9jb3VudGVyID49IDA7IH0KICAgICB2
b2lkIHNldE5ld1RocmVzaG9sZChpbnQzMl90IHRocmVzaG9sZCwgQ29kZUJsb2NrKik7CiAgICAg
dm9pZCBkZWZlckluZGVmaW5pdGVseSgpOwogICAgIGRvdWJsZSBjb3VudCgpIGNvbnN0IHsgcmV0
dXJuIHN0YXRpY19jYXN0PGRvdWJsZT4obV90b3RhbENvdW50KSArIG1fY291bnRlcjsgfQogICAg
IHZvaWQgZHVtcChQcmludFN0cmVhbSYpIGNvbnN0OwogICAgIAorICAgIHZvaWQgc2V0TmV3VGhy
ZXNob2xkRm9yT1NSRXhpdCh1aW50MzJfdCBhY3RpdmVUaHJlc2hvbGQsIGRvdWJsZSBtZW1vcnlV
c2FnZUFkanVzdGVkVGhyZXNob2xkKQorICAgIHsKKyAgICAgICAgbV9hY3RpdmVUaHJlc2hvbGQg
PSBhY3RpdmVUaHJlc2hvbGQ7CisgICAgICAgIG1fY291bnRlciA9IHN0YXRpY19jYXN0PGludDMy
X3Q+KC1tZW1vcnlVc2FnZUFkanVzdGVkVGhyZXNob2xkKTsKKyAgICAgICAgbV90b3RhbENvdW50
ID0gbWVtb3J5VXNhZ2VBZGp1c3RlZFRocmVzaG9sZDsKKyAgICB9CisKICAgICBzdGF0aWMgaW50
MzJfdCBtYXhpbXVtRXhlY3V0aW9uQ291bnRzQmV0d2VlbkNoZWNrcG9pbnRzKCkKICAgICB7CiAg
ICAgICAgIHN3aXRjaCAoY291bnRpbmdWYXJpYW50KSB7CkluZGV4OiBTb3VyY2UvSmF2YVNjcmlw
dENvcmUvYnl0ZWNvZGUvTWV0aG9kT2ZHZXR0aW5nQVZhbHVlUHJvZmlsZS5jcHAKPT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PQotLS0gU291cmNlL0phdmFTY3JpcHRDb3JlL2J5dGVjb2RlL01ldGhvZE9mR2V0dGluZ0FWYWx1
ZVByb2ZpbGUuY3BwCShyZXZpc2lvbiAyMjI4NzApCisrKyBTb3VyY2UvSmF2YVNjcmlwdENvcmUv
Ynl0ZWNvZGUvTWV0aG9kT2ZHZXR0aW5nQVZhbHVlUHJvZmlsZS5jcHAJKHdvcmtpbmcgY29weSkK
QEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IChDKSAyMDEyLCAyMDEzLCAyMDE2IEFw
cGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoQykgMjAxMi0yMDE3
IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqCiAgKiBSZWRpc3RyaWJ1dGlvbiBh
bmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKICAqIG1v
ZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29u
ZGl0aW9ucwpAQCAtNzQsNiArNzQsMzQgQEAgdm9pZCBNZXRob2RPZkdldHRpbmdBVmFsdWVQcm9m
aWxlOjplbWl0UgogICAgIFJFTEVBU0VfQVNTRVJUX05PVF9SRUFDSEVEKCk7CiB9CiAKK3ZvaWQg
TWV0aG9kT2ZHZXR0aW5nQVZhbHVlUHJvZmlsZTo6cmVwb3J0VmFsdWUoSlNWYWx1ZSB2YWx1ZSkK
K3sKKyAgICBzd2l0Y2ggKG1fa2luZCkgeworICAgIGNhc2UgTm9uZToKKyAgICAgICAgcmV0dXJu
OworCisgICAgY2FzZSBSZWFkeToKKyAgICAgICAgKnUucHJvZmlsZS0+c3BlY0ZhaWxCdWNrZXQo
MCkgPSBKU1ZhbHVlOjplbmNvZGUodmFsdWUpOworICAgICAgICByZXR1cm47CisKKyAgICBjYXNl
IExhenlPcGVyYW5kOiB7CisgICAgICAgIExhenlPcGVyYW5kVmFsdWVQcm9maWxlS2V5IGtleSh1
LmxhenlPcGVyYW5kLmJ5dGVjb2RlT2Zmc2V0LCBWaXJ0dWFsUmVnaXN0ZXIodS5sYXp5T3BlcmFu
ZC5vcGVyYW5kKSk7CisKKyAgICAgICAgQ29uY3VycmVudEpTTG9ja2VyIGxvY2tlcih1LmxhenlP
cGVyYW5kLmNvZGVCbG9jay0+bV9sb2NrKTsKKyAgICAgICAgTGF6eU9wZXJhbmRWYWx1ZVByb2Zp
bGUqIHByb2ZpbGUgPQorICAgICAgICAgICAgdS5sYXp5T3BlcmFuZC5jb2RlQmxvY2stPmxhenlP
cGVyYW5kVmFsdWVQcm9maWxlcygpLmFkZChsb2NrZXIsIGtleSk7CisgICAgICAgICpwcm9maWxl
LT5zcGVjRmFpbEJ1Y2tldCgwKSA9IEpTVmFsdWU6OmVuY29kZSh2YWx1ZSk7CisgICAgICAgIHJl
dHVybjsKKyAgICB9CisKKyAgICBjYXNlIEFyaXRoUHJvZmlsZVJlYWR5OiB7CisgICAgICAgIHUu
YXJpdGhQcm9maWxlLT5vYnNlcnZlUmVzdWx0KHZhbHVlKTsKKyAgICAgICAgcmV0dXJuOworICAg
IH0gfQorCisgICAgUkVMRUFTRV9BU1NFUlRfTk9UX1JFQUNIRUQoKTsKK30KKwogfSAvLyBuYW1l
c3BhY2UgSlNDCiAKICNlbmRpZiAvLyBFTkFCTEUoREZHX0pJVCkKSW5kZXg6IFNvdXJjZS9KYXZh
U2NyaXB0Q29yZS9ieXRlY29kZS9NZXRob2RPZkdldHRpbmdBVmFsdWVQcm9maWxlLmgKPT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRDb3JlL2J5dGVjb2RlL01ldGhvZE9mR2V0dGluZ0FW
YWx1ZVByb2ZpbGUuaAkocmV2aXNpb24gMjIyODcwKQorKysgU291cmNlL0phdmFTY3JpcHRDb3Jl
L2J5dGVjb2RlL01ldGhvZE9mR2V0dGluZ0FWYWx1ZVByb2ZpbGUuaAkod29ya2luZyBjb3B5KQpA
QCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTIsIDIwMTYgQXBwbGUgSW5j
LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChDKSAyMDEyLTIwMTcgQXBwbGUg
SW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICoKICAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2Ug
aW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAogICogbW9kaWZpY2F0
aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25z
CkBAIC03MCw5ICs3MCwxMCBAQCBwdWJsaWM6CiAgICAgICAgIENvZGVCbG9jayosIGNvbnN0IExh
enlPcGVyYW5kVmFsdWVQcm9maWxlS2V5Jik7CiAgICAgCiAgICAgZXhwbGljaXQgb3BlcmF0b3Ig
Ym9vbCgpIGNvbnN0IHsgcmV0dXJuIG1fa2luZCAhPSBOb25lOyB9Ci0gICAgCisKICAgICB2b2lk
IGVtaXRSZXBvcnRWYWx1ZShDQ2FsbEhlbHBlcnMmLCBKU1ZhbHVlUmVncykgY29uc3Q7Ci0gICAg
CisgICAgdm9pZCByZXBvcnRWYWx1ZShKU1ZhbHVlKTsKKwogcHJpdmF0ZToKICAgICBlbnVtIEtp
bmQgewogICAgICAgICBOb25lLApJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL2RmZy9ERkdE
cml2ZXIuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9kZmcvREZHRHJp
dmVyLmNwcAkocmV2aXNpb24gMjIyODcwKQorKysgU291cmNlL0phdmFTY3JpcHRDb3JlL2RmZy9E
RkdEcml2ZXIuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHly
aWdodCAoQykgMjAxMS0yMDE0LCAyMDE2IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4K
KyAqIENvcHlyaWdodCAoQykgMjAxMS0yMDE3IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZl
ZC4KICAqCiAgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZv
cm1zLCB3aXRoIG9yIHdpdGhvdXQKICAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92
aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwpAQCAtODksNiArODksNyBAQCBzdGF0
aWMgQ29tcGlsYXRpb25SZXN1bHQgY29tcGlsZUltcGwoCiAgICAgCiAgICAgLy8gTWFrZSBzdXJl
IHRoYXQgYW55IHN0dWJzIHRoYXQgdGhlIERGRyBpcyBnb2luZyB0byB1c2UgYXJlIGluaXRpYWxp
emVkLiBXZSB3YW50IHRvCiAgICAgLy8gbWFrZSBzdXJlIHRoYXQgYWxsIEpJVCBjb2RlIGdlbmVy
YXRpb24gZG9lcyBmaW5hbGl6YXRpb24gb24gdGhlIG1haW4gdGhyZWFkLgorICAgIHZtLmdldENU
SVN0dWIob3NyRXhpdFRodW5rR2VuZXJhdG9yKTsKICAgICB2bS5nZXRDVElTdHViKG9zckV4aXRH
ZW5lcmF0aW9uVGh1bmtHZW5lcmF0b3IpOwogICAgIHZtLmdldENUSVN0dWIodGhyb3dFeGNlcHRp
b25Gcm9tQ2FsbFNsb3dQYXRoR2VuZXJhdG9yKTsKICAgICB2bS5nZXRDVElTdHViKGxpbmtDYWxs
VGh1bmtHZW5lcmF0b3IpOwpJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL2RmZy9ERkdKSVRD
b21waWxlci5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRDb3JlL2RmZy9ERkdK
SVRDb21waWxlci5jcHAJKHJldmlzaW9uIDIyMjg3MCkKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29y
ZS9kZmcvREZHSklUQ29tcGlsZXIuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC04NSw4ICs4NSw5IEBA
IHZvaWQgSklUQ29tcGlsZXI6OmxpbmtPU1JFeGl0cygpCiAgICAgICAgIH0KICAgICB9CiAgICAg
CisgICAgTWFjcm9Bc3NlbWJsZXJDb2RlUmVmIG9zckV4aXRUaHVuayA9IHZtKCktPmdldENUSVN0
dWIob3NyRXhpdFRodW5rR2VuZXJhdG9yKTsKKyAgICBDb2RlTG9jYXRpb25MYWJlbCBvc3JFeGl0
VGh1bmtMYWJlbCA9IENvZGVMb2NhdGlvbkxhYmVsKG9zckV4aXRUaHVuay5jb2RlKCkpOwogICAg
IGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBtX2ppdENvZGUtPm9zckV4aXQuc2l6ZSgpOyArK2kp
IHsKLSAgICAgICAgT1NSRXhpdCYgZXhpdCA9IG1faml0Q29kZS0+b3NyRXhpdFtpXTsKICAgICAg
ICAgT1NSRXhpdENvbXBpbGF0aW9uSW5mbyYgaW5mbyA9IG1fZXhpdENvbXBpbGF0aW9uSW5mb1tp
XTsKICAgICAgICAgSnVtcExpc3QmIGZhaWx1cmVKdW1wcyA9IGluZm8ubV9mYWlsdXJlSnVtcHM7
CiAgICAgICAgIGlmICghZmFpbHVyZUp1bXBzLmVtcHR5KCkpCkBAIC05Niw3ICs5NywxNSBAQCB2
b2lkIEpJVENvbXBpbGVyOjpsaW5rT1NSRXhpdHMoKQogCiAgICAgICAgIGppdEFzc2VydEhhc1Zh
bGlkQ2FsbEZyYW1lKCk7CiAgICAgICAgIHN0b3JlMzIoVHJ1c3RlZEltbTMyKGkpLCAmdm0oKS0+
b3NyRXhpdEluZGV4KTsKLSAgICAgICAgZXhpdC5zZXRQYXRjaGFibGVDb2RlT2Zmc2V0KHBhdGNo
YWJsZUp1bXAoKSk7CisgICAgICAgIGlmIChPcHRpb25zOjp1c2VQcm9iZU9TUkV4aXQoKSkgewor
ICAgICAgICAgICAgSnVtcCB0YXJnZXQgPSBqdW1wKCk7CisgICAgICAgICAgICBhZGRMaW5rVGFz
ayhbdGFyZ2V0LCBvc3JFeGl0VGh1bmtMYWJlbF0gKExpbmtCdWZmZXImIGxpbmtCdWZmZXIpIHsK
KyAgICAgICAgICAgICAgICBsaW5rQnVmZmVyLmxpbmsodGFyZ2V0LCBvc3JFeGl0VGh1bmtMYWJl
bCk7CisgICAgICAgICAgICB9KTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIE9TUkV4
aXQmIGV4aXQgPSBtX2ppdENvZGUtPm9zckV4aXRbaV07CisgICAgICAgICAgICBleGl0LnNldFBh
dGNoYWJsZUNvZGVPZmZzZXQocGF0Y2hhYmxlSnVtcCgpKTsKKyAgICAgICAgfQogICAgIH0KIH0K
IApAQCAtMzA2LDEwICszMTUsMTIgQEAgdm9pZCBKSVRDb21waWxlcjo6bGluayhMaW5rQnVmZmVy
JiBsaW5rQgogICAgIE1hY3JvQXNzZW1ibGVyQ29kZVJlZiBvc3JFeGl0VGh1bmsgPSB2bSgpLT5n
ZXRDVElTdHViKG9zckV4aXRHZW5lcmF0aW9uVGh1bmtHZW5lcmF0b3IpOwogICAgIENvZGVMb2Nh
dGlvbkxhYmVsIHRhcmdldCA9IENvZGVMb2NhdGlvbkxhYmVsKG9zckV4aXRUaHVuay5jb2RlKCkp
OwogICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBtX2ppdENvZGUtPm9zckV4aXQuc2l6ZSgp
OyArK2kpIHsKLSAgICAgICAgT1NSRXhpdCYgZXhpdCA9IG1faml0Q29kZS0+b3NyRXhpdFtpXTsK
ICAgICAgICAgT1NSRXhpdENvbXBpbGF0aW9uSW5mbyYgaW5mbyA9IG1fZXhpdENvbXBpbGF0aW9u
SW5mb1tpXTsKLSAgICAgICAgbGlua0J1ZmZlci5saW5rKGV4aXQuZ2V0UGF0Y2hhYmxlQ29kZU9m
ZnNldEFzSnVtcCgpLCB0YXJnZXQpOwotICAgICAgICBleGl0LmNvcnJlY3RKdW1wKGxpbmtCdWZm
ZXIpOworICAgICAgICBpZiAoIU9wdGlvbnM6OnVzZVByb2JlT1NSRXhpdCgpKSB7CisgICAgICAg
ICAgICBPU1JFeGl0JiBleGl0ID0gbV9qaXRDb2RlLT5vc3JFeGl0W2ldOworICAgICAgICAgICAg
bGlua0J1ZmZlci5saW5rKGV4aXQuZ2V0UGF0Y2hhYmxlQ29kZU9mZnNldEFzSnVtcCgpLCB0YXJn
ZXQpOworICAgICAgICAgICAgZXhpdC5jb3JyZWN0SnVtcChsaW5rQnVmZmVyKTsKKyAgICAgICAg
fQogICAgICAgICBpZiAoaW5mby5tX3JlcGxhY2VtZW50U291cmNlLmlzU2V0KCkpIHsKICAgICAg
ICAgICAgIG1faml0Q29kZS0+Y29tbW9uLmp1bXBSZXBsYWNlbWVudHMuYXBwZW5kKEp1bXBSZXBs
YWNlbWVudCgKICAgICAgICAgICAgICAgICBsaW5rQnVmZmVyLmxvY2F0aW9uT2YoaW5mby5tX3Jl
cGxhY2VtZW50U291cmNlKSwKSW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9kZmcvREZHT1NS
RXhpdC5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRDb3JlL2RmZy9ERkdPU1JF
eGl0LmNwcAkocmV2aXNpb24gMjIyODcwKQorKysgU291cmNlL0phdmFTY3JpcHRDb3JlL2RmZy9E
RkdPU1JFeGl0LmNwcAkod29ya2luZyBjb3B5KQpAQCAtMjksMTggKzI5LDg3NyBAQAogI2lmIEVO
QUJMRShERkdfSklUKQogCiAjaW5jbHVkZSAiQXNzZW1ibHlIZWxwZXJzLmgiCisjaW5jbHVkZSAi
Q2xvbmVkQXJndW1lbnRzLmgiCiAjaW5jbHVkZSAiREZHR3JhcGguaCIKICNpbmNsdWRlICJERkdN
YXlFeGl0LmgiCiAjaW5jbHVkZSAiREZHT1NSRXhpdENvbXBpbGVyQ29tbW9uLmgiCiAjaW5jbHVk
ZSAiREZHT1NSRXhpdFByZXBhcmF0aW9uLmgiCiAjaW5jbHVkZSAiREZHT3BlcmF0aW9ucy5oIgog
I2luY2x1ZGUgIkRGR1NwZWN1bGF0aXZlSklULmgiCisjaW5jbHVkZSAiRGlyZWN0QXJndW1lbnRz
LmgiCiAjaW5jbHVkZSAiRnJhbWVUcmFjZXJzLmgiCisjaW5jbHVkZSAiSW5saW5lQ2FsbEZyYW1l
LmgiCiAjaW5jbHVkZSAiSlNDSW5saW5lcy5oIgorI2luY2x1ZGUgIkpTQ0pTVmFsdWUuaCIKICNp
bmNsdWRlICJPcGVyYW5kc0lubGluZXMuaCIKKyNpbmNsdWRlICJQcm9iZUNvbnRleHQuaCIKKyNp
bmNsdWRlICJQcm9iZUZyYW1lLmgiCiAKIG5hbWVzcGFjZSBKU0MgeyBuYW1lc3BhY2UgREZHIHsK
IAorLy8gUHJvYmUgYmFzZWQgT1NSIEV4aXQuCisKK3VzaW5nIENQVVN0YXRlID0gUHJvYmU6OkNQ
VVN0YXRlOwordXNpbmcgQ29udGV4dCA9IFByb2JlOjpDb250ZXh0OwordXNpbmcgRnJhbWUgPSBQ
cm9iZTo6RnJhbWU7CisKK3N0YXRpYyB2b2lkIHJlaWZ5SW5saW5lZENhbGxGcmFtZXMoUHJvYmU6
OkNvbnRleHQmLCBDb2RlQmxvY2sqIGJhc2VsaW5lQ29kZUJsb2NrLCBjb25zdCBPU1JFeGl0QmFz
ZSYpOworc3RhdGljIHZvaWQgYWRqdXN0QW5kSnVtcFRvVGFyZ2V0KFByb2JlOjpDb250ZXh0Jiwg
Vk0mLCBDb2RlQmxvY2sqLCBDb2RlQmxvY2sqIGJhc2VsaW5lQ29kZUJsb2NrLCBPU1JFeGl0Jik7
CitzdGF0aWMgdm9pZCBwcmludE9TUkV4aXQoQ29udGV4dCYsIHVpbnQzMl90IG9zckV4aXRJbmRl
eCwgY29uc3QgT1NSRXhpdCYpOworCitzdGF0aWMgSlNWYWx1ZSBqc1ZhbHVlRm9yKENQVVN0YXRl
JiBjcHUsIEpTVmFsdWVTb3VyY2Ugc291cmNlKQoreworICAgIGlmIChzb3VyY2UuaXNBZGRyZXNz
KCkpIHsKKyAgICAgICAgSlNWYWx1ZSByZXN1bHQ7CisgICAgICAgIHN0ZDo6bWVtY3B5KCZyZXN1
bHQsIGNwdS5ncHI8dWludDhfdCo+KHNvdXJjZS5iYXNlKCkpICsgc291cmNlLm9mZnNldCgpLCBz
aXplb2YoSlNWYWx1ZSkpOworICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKyNpZiBVU0Uo
SlNWQUxVRTY0KQorICAgIHJldHVybiBKU1ZhbHVlOjpkZWNvZGUoY3B1LmdwcjxFbmNvZGVkSlNW
YWx1ZT4oc291cmNlLmdwcigpKSk7CisjZWxzZQorICAgIGlmIChzb3VyY2UuaGFzS25vd25UYWco
KSkKKyAgICAgICAgcmV0dXJuIEpTVmFsdWUoc291cmNlLnRhZygpLCBjcHUuZ3ByPGludDMyX3Q+
KHNvdXJjZS5wYXlsb2FkR1BSKCkpKTsKKyAgICByZXR1cm4gSlNWYWx1ZShjcHUuZ3ByPGludDMy
X3Q+KHNvdXJjZS50YWdHUFIoKSksIGNwdS5ncHI8aW50MzJfdD4oc291cmNlLnBheWxvYWRHUFIo
KSkpOworI2VuZGlmCit9CisKKyNpZiBOVU1CRVJfT0ZfQ0FMTEVFX1NBVkVTX1JFR0lTVEVSUyA+
IDAKKworc3RhdGljX2Fzc2VydChpczY0Qml0KCksICJ3ZSBvbmx5IHN1cHBvcnQgY2FsbGVlIHNh
dmUgcmVnaXN0ZXJzIG9uIDY0LWJpdCIpOworCisvLyBCYXNlZCBvbiBBc3NlbWJseUhlbHBlcnM6
OmVtaXRSZXN0b3JlQ2FsbGVlU2F2ZXNGb3IoKS4KK3N0YXRpYyB2b2lkIHJlc3RvcmVDYWxsZWVT
YXZlc0ZvcihDb250ZXh0JiBjb250ZXh0LCBDb2RlQmxvY2sqIGNvZGVCbG9jaykKK3sKKyAgICBB
U1NFUlQoY29kZUJsb2NrKTsKKworICAgIFJlZ2lzdGVyQXRPZmZzZXRMaXN0KiBjYWxsZWVTYXZl
cyA9IGNvZGVCbG9jay0+Y2FsbGVlU2F2ZVJlZ2lzdGVycygpOworICAgIFJlZ2lzdGVyU2V0IGRv
bnRSZXN0b3JlUmVnaXN0ZXJzID0gUmVnaXN0ZXJTZXQoUmVnaXN0ZXJTZXQ6OnN0YWNrUmVnaXN0
ZXJzKCksIFJlZ2lzdGVyU2V0OjphbGxGUFJzKCkpOworICAgIHVuc2lnbmVkIHJlZ2lzdGVyQ291
bnQgPSBjYWxsZWVTYXZlcy0+c2l6ZSgpOworCisgICAgdWludHB0cl90KiBwaHlzaWNhbFN0YWNr
RnJhbWUgPSBjb250ZXh0LmZwPHVpbnRwdHJfdCo+KCk7CisgICAgZm9yICh1bnNpZ25lZCBpID0g
MDsgaSA8IHJlZ2lzdGVyQ291bnQ7IGkrKykgeworICAgICAgICBSZWdpc3RlckF0T2Zmc2V0IGVu
dHJ5ID0gY2FsbGVlU2F2ZXMtPmF0KGkpOworICAgICAgICBpZiAoZG9udFJlc3RvcmVSZWdpc3Rl
cnMuZ2V0KGVudHJ5LnJlZygpKSkKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAvLyBU
aGUgY2FsbGVlIHNhdmVkIHZhbHVlcyBjb21lIGZyb20gdGhlIG9yaWdpbmFsIHN0YWNrLCBub3Qg
dGhlIHJlY292ZXJlZCBzdGFjay4KKyAgICAgICAgLy8gSGVuY2UsIHdlIHJlYWQgdGhlIHZhbHVl
cyBkaXJlY3RseSBmcm9tIHRoZSBwaHlzaWNhbCBzdGFjayBtZW1vcnkgaW5zdGVhZCBvZgorICAg
ICAgICAvLyBnb2luZyB0aHJvdWdoIGNvbnRleHQuc3RhY2soKS4KKyAgICAgICAgQVNTRVJUKCEo
ZW50cnkub2Zmc2V0KCkgJSBzaXplb2YodWludHB0cl90KSkpOworICAgICAgICBjb250ZXh0Lmdw
cihlbnRyeS5yZWcoKS5ncHIoKSkgPSBwaHlzaWNhbFN0YWNrRnJhbWVbZW50cnkub2Zmc2V0KCkg
LyBzaXplb2YodWludHB0cl90KV07CisgICAgfQorfQorCisvLyBCYXNlZCBvbiBBc3NlbWJseUhl
bHBlcnM6OmVtaXRTYXZlQ2FsbGVlU2F2ZXNGb3IoKS4KK3N0YXRpYyB2b2lkIHNhdmVDYWxsZWVT
YXZlc0ZvcihDb250ZXh0JiBjb250ZXh0LCBDb2RlQmxvY2sqIGNvZGVCbG9jaykKK3sKKyAgICBh
dXRvJiBzdGFjayA9IGNvbnRleHQuc3RhY2soKTsKKyAgICBBU1NFUlQoY29kZUJsb2NrKTsKKwor
ICAgIFJlZ2lzdGVyQXRPZmZzZXRMaXN0KiBjYWxsZWVTYXZlcyA9IGNvZGVCbG9jay0+Y2FsbGVl
U2F2ZVJlZ2lzdGVycygpOworICAgIFJlZ2lzdGVyU2V0IGRvbnRTYXZlUmVnaXN0ZXJzID0gUmVn
aXN0ZXJTZXQoUmVnaXN0ZXJTZXQ6OnN0YWNrUmVnaXN0ZXJzKCksIFJlZ2lzdGVyU2V0OjphbGxG
UFJzKCkpOworICAgIHVuc2lnbmVkIHJlZ2lzdGVyQ291bnQgPSBjYWxsZWVTYXZlcy0+c2l6ZSgp
OworCisgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IHJlZ2lzdGVyQ291bnQ7IGkrKykgewor
ICAgICAgICBSZWdpc3RlckF0T2Zmc2V0IGVudHJ5ID0gY2FsbGVlU2F2ZXMtPmF0KGkpOworICAg
ICAgICBpZiAoZG9udFNhdmVSZWdpc3RlcnMuZ2V0KGVudHJ5LnJlZygpKSkKKyAgICAgICAgICAg
IGNvbnRpbnVlOworICAgICAgICBzdGFjay5zZXQoY29udGV4dC5mcCgpLCBlbnRyeS5vZmZzZXQo
KSwgY29udGV4dC5ncHI8dWludHB0cl90PihlbnRyeS5yZWcoKS5ncHIoKSkpOworICAgIH0KK30K
KworLy8gQmFzZWQgb24gQXNzZW1ibHlIZWxwZXJzOjpyZXN0b3JlQ2FsbGVlU2F2ZXNGcm9tVk1F
bnRyeUZyYW1lQ2FsbGVlU2F2ZXNCdWZmZXIoKS4KK3N0YXRpYyB2b2lkIHJlc3RvcmVDYWxsZWVT
YXZlc0Zyb21WTUVudHJ5RnJhbWVDYWxsZWVTYXZlc0J1ZmZlcihDb250ZXh0JiBjb250ZXh0KQor
eworICAgIFZNJiB2bSA9ICpjb250ZXh0LmFyZzxWTSo+KCk7CisKKyAgICBSZWdpc3RlckF0T2Zm
c2V0TGlzdCogYWxsQ2FsbGVlU2F2ZXMgPSBWTTo6Z2V0QWxsQ2FsbGVlU2F2ZVJlZ2lzdGVyT2Zm
c2V0cygpOworICAgIFJlZ2lzdGVyU2V0IGRvbnRSZXN0b3JlUmVnaXN0ZXJzID0gUmVnaXN0ZXJT
ZXQ6OnN0YWNrUmVnaXN0ZXJzKCk7CisgICAgdW5zaWduZWQgcmVnaXN0ZXJDb3VudCA9IGFsbENh
bGxlZVNhdmVzLT5zaXplKCk7CisKKyAgICBWTUVudHJ5UmVjb3JkKiBlbnRyeVJlY29yZCA9IHZt
RW50cnlSZWNvcmQodm0udG9wRW50cnlGcmFtZSk7CisgICAgdWludHB0cl90KiBjYWxsZWVTYXZl
QnVmZmVyID0gcmVpbnRlcnByZXRfY2FzdDx1aW50cHRyX3QqPihlbnRyeVJlY29yZC0+Y2FsbGVl
U2F2ZVJlZ2lzdGVyc0J1ZmZlcik7CisKKyAgICAvLyBSZXN0b3JlIGFsbCBjYWxsZWUgc2F2ZXMu
CisgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IHJlZ2lzdGVyQ291bnQ7IGkrKykgeworICAg
ICAgICBSZWdpc3RlckF0T2Zmc2V0IGVudHJ5ID0gYWxsQ2FsbGVlU2F2ZXMtPmF0KGkpOworICAg
ICAgICBpZiAoZG9udFJlc3RvcmVSZWdpc3RlcnMuZ2V0KGVudHJ5LnJlZygpKSkKKyAgICAgICAg
ICAgIGNvbnRpbnVlOworICAgICAgICBzaXplX3QgdWludHB0ck9mZnNldCA9IGVudHJ5Lm9mZnNl
dCgpIC8gc2l6ZW9mKHVpbnRwdHJfdCk7CisgICAgICAgIGlmIChlbnRyeS5yZWcoKS5pc0dQUigp
KQorICAgICAgICAgICAgY29udGV4dC5ncHIoZW50cnkucmVnKCkuZ3ByKCkpID0gY2FsbGVlU2F2
ZUJ1ZmZlclt1aW50cHRyT2Zmc2V0XTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgY29udGV4
dC5mcHIoZW50cnkucmVnKCkuZnByKCkpID0gYml0d2lzZV9jYXN0PGRvdWJsZT4oY2FsbGVlU2F2
ZUJ1ZmZlclt1aW50cHRyT2Zmc2V0XSk7CisgICAgfQorfQorCisvLyBCYXNlZCBvbiBBc3NlbWJs
eUhlbHBlcnM6OmNvcHlDYWxsZWVTYXZlc1RvVk1FbnRyeUZyYW1lQ2FsbGVlU2F2ZXNCdWZmZXIo
KS4KK3N0YXRpYyB2b2lkIGNvcHlDYWxsZWVTYXZlc1RvVk1FbnRyeUZyYW1lQ2FsbGVlU2F2ZXNC
dWZmZXIoQ29udGV4dCYgY29udGV4dCkKK3sKKyAgICBWTSYgdm0gPSAqY29udGV4dC5hcmc8Vk0q
PigpOworICAgIGF1dG8mIHN0YWNrID0gY29udGV4dC5zdGFjaygpOworCisgICAgVk1FbnRyeVJl
Y29yZCogZW50cnlSZWNvcmQgPSB2bUVudHJ5UmVjb3JkKHZtLnRvcEVudHJ5RnJhbWUpOworICAg
IHZvaWQqIGNhbGxlZVNhdmVCdWZmZXIgPSBlbnRyeVJlY29yZC0+Y2FsbGVlU2F2ZVJlZ2lzdGVy
c0J1ZmZlcjsKKworICAgIFJlZ2lzdGVyQXRPZmZzZXRMaXN0KiBhbGxDYWxsZWVTYXZlcyA9IFZN
OjpnZXRBbGxDYWxsZWVTYXZlUmVnaXN0ZXJPZmZzZXRzKCk7CisgICAgUmVnaXN0ZXJTZXQgZG9u
dENvcHlSZWdpc3RlcnMgPSBSZWdpc3RlclNldDo6c3RhY2tSZWdpc3RlcnMoKTsKKyAgICB1bnNp
Z25lZCByZWdpc3RlckNvdW50ID0gYWxsQ2FsbGVlU2F2ZXMtPnNpemUoKTsKKworICAgIGZvciAo
dW5zaWduZWQgaSA9IDA7IGkgPCByZWdpc3RlckNvdW50OyBpKyspIHsKKyAgICAgICAgUmVnaXN0
ZXJBdE9mZnNldCBlbnRyeSA9IGFsbENhbGxlZVNhdmVzLT5hdChpKTsKKyAgICAgICAgaWYgKGRv
bnRDb3B5UmVnaXN0ZXJzLmdldChlbnRyeS5yZWcoKSkpCisgICAgICAgICAgICBjb250aW51ZTsK
KyAgICAgICAgaWYgKGVudHJ5LnJlZygpLmlzR1BSKCkpCisgICAgICAgICAgICBzdGFjay5zZXQo
Y2FsbGVlU2F2ZUJ1ZmZlciwgZW50cnkub2Zmc2V0KCksIGNvbnRleHQuZ3ByPHVpbnRwdHJfdD4o
ZW50cnkucmVnKCkuZ3ByKCkpKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgc3RhY2suc2V0
KGNhbGxlZVNhdmVCdWZmZXIsIGVudHJ5Lm9mZnNldCgpLCBjb250ZXh0LmZwcjx1aW50cHRyX3Q+
KGVudHJ5LnJlZygpLmZwcigpKSk7CisgICAgfQorfQorCisvLyBCYXNlZCBvbiBBc3NlbWJseUhl
bHBlcnM6OmVtaXRTYXZlT3JDb3B5Q2FsbGVlU2F2ZXNGb3IoKS4KK3N0YXRpYyB2b2lkIHNhdmVP
ckNvcHlDYWxsZWVTYXZlc0ZvcihDb250ZXh0JiBjb250ZXh0LCBDb2RlQmxvY2sqIGNvZGVCbG9j
aywgVmlydHVhbFJlZ2lzdGVyIG9mZnNldFZpcnR1YWxSZWdpc3RlciwgYm9vbCB3YXNDYWxsZWRW
aWFUYWlsQ2FsbCkKK3sKKyAgICBGcmFtZSBmcmFtZShjb250ZXh0LmZwKCksIGNvbnRleHQuc3Rh
Y2soKSk7CisgICAgQVNTRVJUKGNvZGVCbG9jayk7CisKKyAgICBSZWdpc3RlckF0T2Zmc2V0TGlz
dCogY2FsbGVlU2F2ZXMgPSBjb2RlQmxvY2stPmNhbGxlZVNhdmVSZWdpc3RlcnMoKTsKKyAgICBS
ZWdpc3RlclNldCBkb250U2F2ZVJlZ2lzdGVycyA9IFJlZ2lzdGVyU2V0KFJlZ2lzdGVyU2V0Ojpz
dGFja1JlZ2lzdGVycygpLCBSZWdpc3RlclNldDo6YWxsRlBScygpKTsKKyAgICB1bnNpZ25lZCBy
ZWdpc3RlckNvdW50ID0gY2FsbGVlU2F2ZXMtPnNpemUoKTsKKworICAgIFJlZ2lzdGVyU2V0IGJh
c2VsaW5lQ2FsbGVlU2F2ZXMgPSBSZWdpc3RlclNldDo6bGxpbnRCYXNlbGluZUNhbGxlZVNhdmVS
ZWdpc3RlcnMoKTsKKworICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCByZWdpc3RlckNvdW50
OyBpKyspIHsKKyAgICAgICAgUmVnaXN0ZXJBdE9mZnNldCBlbnRyeSA9IGNhbGxlZVNhdmVzLT5h
dChpKTsKKyAgICAgICAgaWYgKGRvbnRTYXZlUmVnaXN0ZXJzLmdldChlbnRyeS5yZWcoKSkpCisg
ICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICB1aW50cHRyX3Qgc2F2ZWRSZWdpc3RlclZh
bHVlOworCisgICAgICAgIGlmICh3YXNDYWxsZWRWaWFUYWlsQ2FsbCAmJiBiYXNlbGluZUNhbGxl
ZVNhdmVzLmdldChlbnRyeS5yZWcoKSkpCisgICAgICAgICAgICBzYXZlZFJlZ2lzdGVyVmFsdWUg
PSBmcmFtZS5nZXQ8dWludHB0cl90PihlbnRyeS5vZmZzZXQoKSk7CisgICAgICAgIGVsc2UKKyAg
ICAgICAgICAgIHNhdmVkUmVnaXN0ZXJWYWx1ZSA9IGNvbnRleHQuZ3ByKGVudHJ5LnJlZygpLmdw
cigpKTsKKworICAgICAgICBmcmFtZS5zZXQob2Zmc2V0VmlydHVhbFJlZ2lzdGVyLm9mZnNldElu
Qnl0ZXMoKSArIGVudHJ5Lm9mZnNldCgpLCBzYXZlZFJlZ2lzdGVyVmFsdWUpOworICAgIH0KK30K
KyNlbHNlIC8vIG5vdCBOVU1CRVJfT0ZfQ0FMTEVFX1NBVkVTX1JFR0lTVEVSUyA+IDAKKworc3Rh
dGljIHZvaWQgcmVzdG9yZUNhbGxlZVNhdmVzRm9yKENvbnRleHQmLCBDb2RlQmxvY2sqKSB7IH0K
K3N0YXRpYyB2b2lkIHNhdmVDYWxsZWVTYXZlc0ZvcihDb250ZXh0JiwgQ29kZUJsb2NrKikgeyB9
CitzdGF0aWMgdm9pZCByZXN0b3JlQ2FsbGVlU2F2ZXNGcm9tVk1FbnRyeUZyYW1lQ2FsbGVlU2F2
ZXNCdWZmZXIoQ29udGV4dCYpIHsgfQorc3RhdGljIHZvaWQgY29weUNhbGxlZVNhdmVzVG9WTUVu
dHJ5RnJhbWVDYWxsZWVTYXZlc0J1ZmZlcihDb250ZXh0JikgeyB9CitzdGF0aWMgdm9pZCBzYXZl
T3JDb3B5Q2FsbGVlU2F2ZXNGb3IoQ29udGV4dCYsIENvZGVCbG9jayosIFZpcnR1YWxSZWdpc3Rl
ciwgYm9vbCkgeyB9CisKKyNlbmRpZiAvLyBOVU1CRVJfT0ZfQ0FMTEVFX1NBVkVTX1JFR0lTVEVS
UyA+IDAKKworc3RhdGljIEpTQ2VsbCogY3JlYXRlRGlyZWN0QXJndW1lbnRzRHVyaW5nRXhpdChD
b250ZXh0JiBjb250ZXh0LCBDb2RlQmxvY2sqIGNvZGVCbG9jaywgSW5saW5lQ2FsbEZyYW1lKiBp
bmxpbmVDYWxsRnJhbWUsIEpTRnVuY3Rpb24qIGNhbGxlZSwgaW50MzJfdCBhcmd1bWVudENvdW50
KQoreworICAgIFZNJiB2bSA9ICpjb250ZXh0LmFyZzxWTSo+KCk7CisKKyAgICBBU1NFUlQodm0u
aGVhcC5pc0RlZmVycmVkKCkpOworCisgICAgaWYgKGlubGluZUNhbGxGcmFtZSkKKyAgICAgICAg
Y29kZUJsb2NrID0gYmFzZWxpbmVDb2RlQmxvY2tGb3JJbmxpbmVDYWxsRnJhbWUoaW5saW5lQ2Fs
bEZyYW1lKTsKKworICAgIHVuc2lnbmVkIGxlbmd0aCA9IGFyZ3VtZW50Q291bnQgLSAxOworICAg
IHVuc2lnbmVkIGNhcGFjaXR5ID0gc3RkOjptYXgobGVuZ3RoLCBzdGF0aWNfY2FzdDx1bnNpZ25l
ZD4oY29kZUJsb2NrLT5udW1QYXJhbWV0ZXJzKCkgLSAxKSk7CisgICAgRGlyZWN0QXJndW1lbnRz
KiByZXN1bHQgPSBEaXJlY3RBcmd1bWVudHM6OmNyZWF0ZSgKKyAgICAgICAgdm0sIGNvZGVCbG9j
ay0+Z2xvYmFsT2JqZWN0KCktPmRpcmVjdEFyZ3VtZW50c1N0cnVjdHVyZSgpLCBsZW5ndGgsIGNh
cGFjaXR5KTsKKworICAgIHJlc3VsdC0+Y2FsbGVlKCkuc2V0KHZtLCByZXN1bHQsIGNhbGxlZSk7
CisKKyAgICB2b2lkKiBmcmFtZUJhc2UgPSBjb250ZXh0LmZwPFJlZ2lzdGVyKj4oKSArIChpbmxp
bmVDYWxsRnJhbWUgPyBpbmxpbmVDYWxsRnJhbWUtPnN0YWNrT2Zmc2V0IDogMCk7CisgICAgRnJh
bWUgZnJhbWUoZnJhbWVCYXNlLCBjb250ZXh0LnN0YWNrKCkpOworICAgIGZvciAodW5zaWduZWQg
aSA9IGxlbmd0aDsgaS0tOykKKyAgICAgICAgcmVzdWx0LT5zZXRJbmRleFF1aWNrbHkodm0sIGks
IGZyYW1lLmFyZ3VtZW50KGkpKTsKKworICAgIHJldHVybiByZXN1bHQ7Cit9CisKK3N0YXRpYyBK
U0NlbGwqIGNyZWF0ZUNsb25lZEFyZ3VtZW50c0R1cmluZ0V4aXQoQ29udGV4dCYgY29udGV4dCwg
Q29kZUJsb2NrKiBjb2RlQmxvY2ssIElubGluZUNhbGxGcmFtZSogaW5saW5lQ2FsbEZyYW1lLCBK
U0Z1bmN0aW9uKiBjYWxsZWUsIGludDMyX3QgYXJndW1lbnRDb3VudCkKK3sKKyAgICBWTSYgdm0g
PSAqY29udGV4dC5hcmc8Vk0qPigpOworICAgIEV4ZWNTdGF0ZSogZXhlYyA9IGNvbnRleHQuZnA8
RXhlY1N0YXRlKj4oKTsKKworICAgIEFTU0VSVCh2bS5oZWFwLmlzRGVmZXJyZWQoKSk7CisKKyAg
ICBpZiAoaW5saW5lQ2FsbEZyYW1lKQorICAgICAgICBjb2RlQmxvY2sgPSBiYXNlbGluZUNvZGVC
bG9ja0ZvcklubGluZUNhbGxGcmFtZShpbmxpbmVDYWxsRnJhbWUpOworCisgICAgdW5zaWduZWQg
bGVuZ3RoID0gYXJndW1lbnRDb3VudCAtIDE7CisgICAgQ2xvbmVkQXJndW1lbnRzKiByZXN1bHQg
PSBDbG9uZWRBcmd1bWVudHM6OmNyZWF0ZUVtcHR5KAorICAgICAgICB2bSwgY29kZUJsb2NrLT5n
bG9iYWxPYmplY3QoKS0+Y2xvbmVkQXJndW1lbnRzU3RydWN0dXJlKCksIGNhbGxlZSwgbGVuZ3Ro
KTsKKworICAgIHZvaWQqIGZyYW1lQmFzZSA9IGNvbnRleHQuZnA8UmVnaXN0ZXIqPigpICsgKGlu
bGluZUNhbGxGcmFtZSA/IGlubGluZUNhbGxGcmFtZS0+c3RhY2tPZmZzZXQgOiAwKTsKKyAgICBG
cmFtZSBmcmFtZShmcmFtZUJhc2UsIGNvbnRleHQuc3RhY2soKSk7CisgICAgZm9yICh1bnNpZ25l
ZCBpID0gbGVuZ3RoOyBpLS07KQorICAgICAgICByZXN1bHQtPnB1dERpcmVjdEluZGV4KGV4ZWMs
IGksIGZyYW1lLmFyZ3VtZW50KGkpKTsKKyAgICByZXR1cm4gcmVzdWx0OworfQorCitzdGF0aWMg
dm9pZCBlbWl0UmVzdG9yZUFyZ3VtZW50cyhDb250ZXh0JiBjb250ZXh0LCBDb2RlQmxvY2sqIGNv
ZGVCbG9jaywgREZHOjpKSVRDb2RlKiBkZmdKSVRDb2RlLCBjb25zdCBPcGVyYW5kczxWYWx1ZVJl
Y292ZXJ5PiYgb3BlcmFuZHMpCit7CisgICAgRnJhbWUgZnJhbWUoY29udGV4dC5mcCgpLCBjb250
ZXh0LnN0YWNrKCkpOworCisgICAgSGFzaE1hcDxNaW5pZmllZElELCBpbnQ+IGFscmVhZHlBbGxv
Y2F0ZWRBcmd1bWVudHM7IC8vIE1hcHMgcGhhbnRvbSBhcmd1bWVudHMgbm9kZSBJRCB0byBvcGVy
YW5kLgorICAgIGZvciAoc2l6ZV90IGluZGV4ID0gMDsgaW5kZXggPCBvcGVyYW5kcy5zaXplKCk7
ICsraW5kZXgpIHsKKyAgICAgICAgY29uc3QgVmFsdWVSZWNvdmVyeSYgcmVjb3ZlcnkgPSBvcGVy
YW5kc1tpbmRleF07CisgICAgICAgIGludCBvcGVyYW5kID0gb3BlcmFuZHMub3BlcmFuZEZvcklu
ZGV4KGluZGV4KTsKKworICAgICAgICBpZiAocmVjb3ZlcnkudGVjaG5pcXVlKCkgIT0gRGlyZWN0
QXJndW1lbnRzVGhhdFdlcmVOb3RDcmVhdGVkCisgICAgICAgICAgICAmJiByZWNvdmVyeS50ZWNo
bmlxdWUoKSAhPSBDbG9uZWRBcmd1bWVudHNUaGF0V2VyZU5vdENyZWF0ZWQpCisgICAgICAgICAg
ICBjb250aW51ZTsKKworICAgICAgICBNaW5pZmllZElEIGlkID0gcmVjb3Zlcnkubm9kZUlEKCk7
CisgICAgICAgIGF1dG8gaXRlciA9IGFscmVhZHlBbGxvY2F0ZWRBcmd1bWVudHMuZmluZChpZCk7
CisgICAgICAgIGlmIChpdGVyICE9IGFscmVhZHlBbGxvY2F0ZWRBcmd1bWVudHMuZW5kKCkpIHsK
KyAgICAgICAgICAgIGZyYW1lLnNldE9wZXJhbmQob3BlcmFuZCwgZnJhbWUub3BlcmFuZChpdGVy
LT52YWx1ZSkpOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworICAgICAgICBJ
bmxpbmVDYWxsRnJhbWUqIGlubGluZUNhbGxGcmFtZSA9CisgICAgICAgICAgICBkZmdKSVRDb2Rl
LT5taW5pZmllZERGRy5hdChpZCktPmlubGluZUNhbGxGcmFtZSgpOworCisgICAgICAgIGludCBz
dGFja09mZnNldDsKKyAgICAgICAgaWYgKGlubGluZUNhbGxGcmFtZSkKKyAgICAgICAgICAgIHN0
YWNrT2Zmc2V0ID0gaW5saW5lQ2FsbEZyYW1lLT5zdGFja09mZnNldDsKKyAgICAgICAgZWxzZQor
ICAgICAgICAgICAgc3RhY2tPZmZzZXQgPSAwOworCisgICAgICAgIEpTRnVuY3Rpb24qIGNhbGxl
ZTsKKyAgICAgICAgaWYgKCFpbmxpbmVDYWxsRnJhbWUgfHwgaW5saW5lQ2FsbEZyYW1lLT5pc0Ns
b3N1cmVDYWxsKQorICAgICAgICAgICAgY2FsbGVlID0ganNDYXN0PEpTRnVuY3Rpb24qPihmcmFt
ZS5vcGVyYW5kKHN0YWNrT2Zmc2V0ICsgQ2FsbEZyYW1lU2xvdDo6Y2FsbGVlKS5hc0NlbGwoKSk7
CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGNhbGxlZSA9IGpzQ2FzdDxKU0Z1bmN0aW9uKj4o
aW5saW5lQ2FsbEZyYW1lLT5jYWxsZWVSZWNvdmVyeS5jb25zdGFudCgpLmFzQ2VsbCgpKTsKKwor
ICAgICAgICBpbnQzMl90IGFyZ3VtZW50Q291bnQ7CisgICAgICAgIGlmICghaW5saW5lQ2FsbEZy
YW1lIHx8IGlubGluZUNhbGxGcmFtZS0+aXNWYXJhcmdzKCkpCisgICAgICAgICAgICBhcmd1bWVu
dENvdW50ID0gZnJhbWUub3BlcmFuZDxpbnQzMl90PihzdGFja09mZnNldCArIENhbGxGcmFtZVNs
b3Q6OmFyZ3VtZW50Q291bnQsIFBheWxvYWRPZmZzZXQpOworICAgICAgICBlbHNlCisgICAgICAg
ICAgICBhcmd1bWVudENvdW50ID0gaW5saW5lQ2FsbEZyYW1lLT5hcmd1bWVudENvdW50SW5jbHVk
aW5nVGhpczsKKworICAgICAgICBKU0NlbGwqIGFyZ3VtZW50c09iamVjdDsKKyAgICAgICAgc3dp
dGNoIChyZWNvdmVyeS50ZWNobmlxdWUoKSkgeworICAgICAgICBjYXNlIERpcmVjdEFyZ3VtZW50
c1RoYXRXZXJlTm90Q3JlYXRlZDoKKyAgICAgICAgICAgIGFyZ3VtZW50c09iamVjdCA9IGNyZWF0
ZURpcmVjdEFyZ3VtZW50c0R1cmluZ0V4aXQoY29udGV4dCwgY29kZUJsb2NrLCBpbmxpbmVDYWxs
RnJhbWUsIGNhbGxlZSwgYXJndW1lbnRDb3VudCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAg
ICAgY2FzZSBDbG9uZWRBcmd1bWVudHNUaGF0V2VyZU5vdENyZWF0ZWQ6CisgICAgICAgICAgICBh
cmd1bWVudHNPYmplY3QgPSBjcmVhdGVDbG9uZWRBcmd1bWVudHNEdXJpbmdFeGl0KGNvbnRleHQs
IGNvZGVCbG9jaywgaW5saW5lQ2FsbEZyYW1lLCBjYWxsZWUsIGFyZ3VtZW50Q291bnQpOworICAg
ICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBSRUxFQVNFX0FT
U0VSVF9OT1RfUkVBQ0hFRCgpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAg
ICAgZnJhbWUuc2V0T3BlcmFuZChvcGVyYW5kLCBKU1ZhbHVlKGFyZ3VtZW50c09iamVjdCkpOwor
CisgICAgICAgIGFscmVhZHlBbGxvY2F0ZWRBcmd1bWVudHMuYWRkKGlkLCBvcGVyYW5kKTsKKyAg
ICB9Cit9CisKKy8vIFRoZSBmb2xsb3dpbmcgaXMgYSBsaXN0IG9mIGV4dHJhIGluaXRpYWxpemF0
aW9ucyB0aGF0IG5lZWQgdG8gYmUgZG9uZSBpbiBvcmRlcgorLy8gb2YgbW9zdCBsaWtlbHkgbmVl
ZGVkIChsb3dlciBlbnVtIHZhbHVlKSB0byBsZWFzdCBsaWtlbHkgbmVlZGVkIChoaWdoZXIgZW51
bSB2YWx1ZSkuCisvLyBFYWNoIGxldmVsIGluaXRpYWxpemF0aW9uIGluY2x1ZGVzIHRoZSBwcmV2
aW91cyBsb3dlciBlbnVtIHZhbHVlIChzZWUgdXNlIG9mIHRoZQorLy8gZXh0cmFJbml0aWFsaXph
dGlvbkxldmVsIHZhbHVlIGJlbG93KS4KK2VudW0gY2xhc3MgRXh0cmFJbml0aWFsaXphdGlvbkxl
dmVsIHsKKyAgICBOb25lLAorICAgIFNwZWN1bGF0aW9uUmVjb3ZlcnksCisgICAgVmFsdWVQcm9m
aWxlVXBkYXRlLAorICAgIEFycmF5UHJvZmlsZVVwZGF0ZSwKKyAgICBPdGhlcgorfTsKKwordm9p
ZCBPU1JFeGl0OjpleGVjdXRlT1NSRXhpdChDb250ZXh0JiBjb250ZXh0KQoreworICAgIFZNJiB2
bSA9ICpjb250ZXh0LmFyZzxWTSo+KCk7CisgICAgYXV0byBzY29wZSA9IERFQ0xBUkVfVEhST1df
U0NPUEUodm0pOworCisgICAgRXhlY1N0YXRlKiBleGVjID0gY29udGV4dC5mcDxFeGVjU3RhdGUq
PigpOworICAgIEFTU0VSVCgmZXhlYy0+dm0oKSA9PSAmdm0pOworICAgIGF1dG8mIGNwdSA9IGNv
bnRleHQuY3B1OworCisgICAgaWYgKHZtLmNhbGxGcmFtZUZvckNhdGNoKSB7CisgICAgICAgIGV4
ZWMgPSB2bS5jYWxsRnJhbWVGb3JDYXRjaDsKKyAgICAgICAgY29udGV4dC5mcCgpID0gZXhlYzsK
KyAgICB9CisKKyAgICBDb2RlQmxvY2sqIGNvZGVCbG9jayA9IGV4ZWMtPmNvZGVCbG9jaygpOwor
ICAgIEFTU0VSVChjb2RlQmxvY2spOworICAgIEFTU0VSVChjb2RlQmxvY2stPmppdFR5cGUoKSA9
PSBKSVRDb2RlOjpERkdKSVQpOworCisgICAgLy8gSXQncyBzb3J0IG9mIHByZWZlcmFibGUgdGhh
dCB3ZSBkb24ndCBHQyB3aGlsZSBpbiBoZXJlLiBBbnl3YXlzLCBkb2luZyBzbyB3b3VsZG4ndAor
ICAgIC8vIHJlYWxseSBiZSBwcm9maXRhYmxlLgorICAgIERlZmVyR0NGb3JBV2hpbGUgZGVmZXJH
Qyh2bS5oZWFwKTsKKworICAgIHVpbnQzMl90IGV4aXRJbmRleCA9IHZtLm9zckV4aXRJbmRleDsK
KyAgICBERkc6OkpJVENvZGUqIGRmZ0pJVENvZGUgPSBjb2RlQmxvY2stPmppdENvZGUoKS0+ZGZn
KCk7CisgICAgT1NSRXhpdCYgZXhpdCA9IGRmZ0pJVENvZGUtPm9zckV4aXRbZXhpdEluZGV4XTsK
KworICAgIEFTU0VSVCghdm0uY2FsbEZyYW1lRm9yQ2F0Y2ggfHwgZXhpdC5tX2tpbmQgPT0gR2Vu
ZXJpY1Vud2luZCk7CisgICAgRVhDRVBUSU9OX0FTU0VSVF9VTlVTRUQoc2NvcGUsICEhc2NvcGUu
ZXhjZXB0aW9uKCkgfHwgIWV4aXQuaXNFeGNlcHRpb25IYW5kbGVyKCkpOworCisgICAgaWYgKFVO
TElLRUxZKCFleGl0LmV4aXRTdGF0ZSkpIHsKKyAgICAgICAgRXh0cmFJbml0aWFsaXphdGlvbkxl
dmVsIGV4dHJhSW5pdGlhbGl6YXRpb25MZXZlbCA9IEV4dHJhSW5pdGlhbGl6YXRpb25MZXZlbDo6
Tm9uZTsKKworICAgICAgICAvLyBXZSBvbmx5IG5lZWQgdG8gZXhlY3V0ZSB0aGlzIGJsb2NrIG9u
Y2UgZm9yIGVhY2ggT1NSRXhpdCByZWNvcmQuIFRoZSBjb21wdXRlZAorICAgICAgICAvLyByZXN1
bHRzIHdpbGwgYmUgY2FjaGVkIGluIHRoZSBPU1JFeGl0U3RhdGUgcmVjb3JkIGZvciB1c2Ugb2Yg
dGhlIHJlc3Qgb2YgdGhlCisgICAgICAgIC8vIGV4aXQgcmFtcCBjb2RlLgorCisgICAgICAgIC8v
IEVuc3VyZSB3ZSBoYXZlIGJhc2VsaW5lIGNvZGVCbG9ja3MgdG8gT1NSIGV4aXQgdG8uCisgICAg
ICAgIHByZXBhcmVDb2RlT3JpZ2luRm9yT1NSRXhpdChleGVjLCBleGl0Lm1fY29kZU9yaWdpbik7
CisKKyAgICAgICAgQ29kZUJsb2NrKiBiYXNlbGluZUNvZGVCbG9jayA9IGNvZGVCbG9jay0+YmFz
ZWxpbmVBbHRlcm5hdGl2ZSgpOworICAgICAgICBBU1NFUlQoYmFzZWxpbmVDb2RlQmxvY2stPmpp
dFR5cGUoKSA9PSBKSVRDb2RlOjpCYXNlbGluZUpJVCk7CisKKyAgICAgICAgU3BlY3VsYXRpb25S
ZWNvdmVyeSogcmVjb3ZlcnkgPSBudWxscHRyOworICAgICAgICBpZiAoZXhpdC5tX3JlY292ZXJ5
SW5kZXggIT0gVUlOVF9NQVgpIHsKKyAgICAgICAgICAgIHJlY292ZXJ5ID0gJmRmZ0pJVENvZGUt
PnNwZWN1bGF0aW9uUmVjb3ZlcnlbZXhpdC5tX3JlY292ZXJ5SW5kZXhdOworICAgICAgICAgICAg
ZXh0cmFJbml0aWFsaXphdGlvbkxldmVsID0gc3RkOjptYXgoZXh0cmFJbml0aWFsaXphdGlvbkxl
dmVsLCBFeHRyYUluaXRpYWxpemF0aW9uTGV2ZWw6OlNwZWN1bGF0aW9uUmVjb3ZlcnkpOworICAg
ICAgICB9CisKKyAgICAgICAgaWYgKFVOTElLRUxZKGV4aXQubV9raW5kID09IEdlbmVyaWNVbndp
bmQpKQorICAgICAgICAgICAgZXh0cmFJbml0aWFsaXphdGlvbkxldmVsID0gc3RkOjptYXgoZXh0
cmFJbml0aWFsaXphdGlvbkxldmVsLCBFeHRyYUluaXRpYWxpemF0aW9uTGV2ZWw6Ok90aGVyKTsK
KworICAgICAgICBBcnJheVByb2ZpbGUqIGFycmF5UHJvZmlsZSA9IG51bGxwdHI7CisgICAgICAg
IGlmICghIWV4aXQubV9qc1ZhbHVlU291cmNlKSB7CisgICAgICAgICAgICBpZiAoZXhpdC5tX3Zh
bHVlUHJvZmlsZSkKKyAgICAgICAgICAgICAgICBleHRyYUluaXRpYWxpemF0aW9uTGV2ZWwgPSBz
dGQ6Om1heChleHRyYUluaXRpYWxpemF0aW9uTGV2ZWwsIEV4dHJhSW5pdGlhbGl6YXRpb25MZXZl
bDo6VmFsdWVQcm9maWxlVXBkYXRlKTsKKyAgICAgICAgICAgIGlmIChleGl0Lm1fa2luZCA9PSBC
YWRDYWNoZSB8fCBleGl0Lm1fa2luZCA9PSBCYWRJbmRleGluZ1R5cGUpIHsKKyAgICAgICAgICAg
ICAgICBDb2RlT3JpZ2luIGNvZGVPcmlnaW4gPSBleGl0Lm1fY29kZU9yaWdpbkZvckV4aXRQcm9m
aWxlOworICAgICAgICAgICAgICAgIENvZGVCbG9jayogcHJvZmlsZWRDb2RlQmxvY2sgPSBiYXNl
bGluZUNvZGVCbG9ja0Zvck9yaWdpbkFuZEJhc2VsaW5lQ29kZUJsb2NrKGNvZGVPcmlnaW4sIGJh
c2VsaW5lQ29kZUJsb2NrKTsKKyAgICAgICAgICAgICAgICBhcnJheVByb2ZpbGUgPSBwcm9maWxl
ZENvZGVCbG9jay0+Z2V0QXJyYXlQcm9maWxlKGNvZGVPcmlnaW4uYnl0ZWNvZGVJbmRleCk7Cisg
ICAgICAgICAgICAgICAgaWYgKGFycmF5UHJvZmlsZSkKKyAgICAgICAgICAgICAgICAgICAgZXh0
cmFJbml0aWFsaXphdGlvbkxldmVsID0gc3RkOjptYXgoZXh0cmFJbml0aWFsaXphdGlvbkxldmVs
LCBFeHRyYUluaXRpYWxpemF0aW9uTGV2ZWw6OkFycmF5UHJvZmlsZVVwZGF0ZSk7CisgICAgICAg
ICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpbnQzMl90IGFjdGl2ZVRocmVzaG9sZCA9IGJh
c2VsaW5lQ29kZUJsb2NrLT5hZGp1c3RlZENvdW50ZXJWYWx1ZShPcHRpb25zOjp0aHJlc2hvbGRG
b3JPcHRpbWl6ZUFmdGVyTG9uZ1dhcm1VcCgpKTsKKyAgICAgICAgZG91YmxlIGFkanVzdGVkVGhy
ZXNob2xkID0gYXBwbHlNZW1vcnlVc2FnZUhldXJpc3RpY3NBbmRDb252ZXJ0VG9JbnQoYWN0aXZl
VGhyZXNob2xkLCBiYXNlbGluZUNvZGVCbG9jayk7CisgICAgICAgIEFTU0VSVChhZGp1c3RlZFRo
cmVzaG9sZCA+IDApOworICAgICAgICBhZGp1c3RlZFRocmVzaG9sZCA9IEJhc2VsaW5lRXhlY3V0
aW9uQ291bnRlcjo6Y2xpcHBlZFRocmVzaG9sZChjb2RlQmxvY2stPmdsb2JhbE9iamVjdCgpLCBh
ZGp1c3RlZFRocmVzaG9sZCk7CisKKyAgICAgICAgQ29kZUJsb2NrKiBjb2RlQmxvY2tGb3JFeGl0
ID0gYmFzZWxpbmVDb2RlQmxvY2tGb3JPcmlnaW5BbmRCYXNlbGluZUNvZGVCbG9jayhleGl0Lm1f
Y29kZU9yaWdpbiwgYmFzZWxpbmVDb2RlQmxvY2spOworICAgICAgICBWZWN0b3I8Qnl0ZWNvZGVB
bmRNYWNoaW5lT2Zmc2V0PiBkZWNvZGVkQ29kZU1hcDsKKyAgICAgICAgY29kZUJsb2NrRm9yRXhp
dC0+aml0Q29kZU1hcCgpLT5kZWNvZGUoZGVjb2RlZENvZGVNYXApOworCisgICAgICAgIEJ5dGVj
b2RlQW5kTWFjaGluZU9mZnNldCogbWFwcGluZyA9IGJpbmFyeVNlYXJjaDxCeXRlY29kZUFuZE1h
Y2hpbmVPZmZzZXQsIHVuc2lnbmVkPihkZWNvZGVkQ29kZU1hcCwgZGVjb2RlZENvZGVNYXAuc2l6
ZSgpLCBleGl0Lm1fY29kZU9yaWdpbi5ieXRlY29kZUluZGV4LCBCeXRlY29kZUFuZE1hY2hpbmVP
ZmZzZXQ6OmdldEJ5dGVjb2RlSW5kZXgpOworCisgICAgICAgIEFTU0VSVChtYXBwaW5nKTsKKyAg
ICAgICAgQVNTRVJUKG1hcHBpbmctPm1fYnl0ZWNvZGVJbmRleCA9PSBleGl0Lm1fY29kZU9yaWdp
bi5ieXRlY29kZUluZGV4KTsKKworICAgICAgICB2b2lkKiBqdW1wVGFyZ2V0ID0gY29kZUJsb2Nr
Rm9yRXhpdC0+aml0Q29kZSgpLT5leGVjdXRhYmxlQWRkcmVzc0F0T2Zmc2V0KG1hcHBpbmctPm1f
bWFjaGluZUNvZGVPZmZzZXQpOworCisgICAgICAgIC8vIENvbXB1dGUgdGhlIHZhbHVlIHJlY292
ZXJpZXMuCisgICAgICAgIE9wZXJhbmRzPFZhbHVlUmVjb3Zlcnk+IG9wZXJhbmRzOworICAgICAg
ICBWZWN0b3I8VW5kZWZpbmVkT3BlcmFuZFNwYW4+IHVuZGVmaW5lZE9wZXJhbmRTcGFuczsKKyAg
ICAgICAgdW5zaWduZWQgbnVtVmFyaWFibGVzID0gZGZnSklUQ29kZS0+dmFyaWFibGVFdmVudFN0
cmVhbS5yZWNvbnN0cnVjdChjb2RlQmxvY2ssIGV4aXQubV9jb2RlT3JpZ2luLCBkZmdKSVRDb2Rl
LT5taW5pZmllZERGRywgZXhpdC5tX3N0cmVhbUluZGV4LCBvcGVyYW5kcywgJnVuZGVmaW5lZE9w
ZXJhbmRTcGFucyk7CisgICAgICAgIHB0cmRpZmZfdCBzdGFja1BvaW50ZXJPZmZzZXQgPSAtc3Rh
dGljX2Nhc3Q8cHRyZGlmZl90PihudW1WYXJpYWJsZXMpICogc2l6ZW9mKFJlZ2lzdGVyKTsKKwor
ICAgICAgICBleGl0LmV4aXRTdGF0ZSA9IGFkb3B0UmVmKG5ldyBPU1JFeGl0U3RhdGUoZXhpdCwg
Y29kZUJsb2NrLCBiYXNlbGluZUNvZGVCbG9jaywgb3BlcmFuZHMsIFdURk1vdmUodW5kZWZpbmVk
T3BlcmFuZFNwYW5zKSwgcmVjb3ZlcnksIHN0YWNrUG9pbnRlck9mZnNldCwgYWN0aXZlVGhyZXNo
b2xkLCBhZGp1c3RlZFRocmVzaG9sZCwganVtcFRhcmdldCwgYXJyYXlQcm9maWxlKSk7CisKKyAg
ICAgICAgaWYgKFVOTElLRUxZKHZtLm1fcGVyQnl0ZWNvZGVQcm9maWxlciAmJiBjb2RlQmxvY2st
PmppdENvZGUoKS0+ZGZnQ29tbW9uKCktPmNvbXBpbGF0aW9uKSkgeworICAgICAgICAgICAgUHJv
ZmlsZXI6OkRhdGFiYXNlJiBkYXRhYmFzZSA9ICp2bS5tX3BlckJ5dGVjb2RlUHJvZmlsZXI7Cisg
ICAgICAgICAgICBQcm9maWxlcjo6Q29tcGlsYXRpb24qIGNvbXBpbGF0aW9uID0gY29kZUJsb2Nr
LT5qaXRDb2RlKCktPmRmZ0NvbW1vbigpLT5jb21waWxhdGlvbi5nZXQoKTsKKworICAgICAgICAg
ICAgUHJvZmlsZXI6Ok9TUkV4aXQqIHByb2ZpbGVyRXhpdCA9IGNvbXBpbGF0aW9uLT5hZGRPU1JF
eGl0KAorICAgICAgICAgICAgICAgIGV4aXRJbmRleCwgUHJvZmlsZXI6Ok9yaWdpblN0YWNrKGRh
dGFiYXNlLCBjb2RlQmxvY2ssIGV4aXQubV9jb2RlT3JpZ2luKSwKKyAgICAgICAgICAgICAgICBl
eGl0Lm1fa2luZCwgZXhpdC5tX2tpbmQgPT0gVW5jb3VudGFibGVJbnZhbGlkYXRpb24pOworICAg
ICAgICAgICAgZXhpdC5leGl0U3RhdGUtPnByb2ZpbGVyRXhpdCA9IHByb2ZpbGVyRXhpdDsKKyAg
ICAgICAgICAgIGV4dHJhSW5pdGlhbGl6YXRpb25MZXZlbCA9IHN0ZDo6bWF4KGV4dHJhSW5pdGlh
bGl6YXRpb25MZXZlbCwgRXh0cmFJbml0aWFsaXphdGlvbkxldmVsOjpPdGhlcik7CisgICAgICAg
IH0KKworICAgICAgICBpZiAoVU5MSUtFTFkoT3B0aW9uczo6cHJpbnRFYWNoT1NSRXhpdCgpKSkK
KyAgICAgICAgICAgIGV4dHJhSW5pdGlhbGl6YXRpb25MZXZlbCA9IHN0ZDo6bWF4KGV4dHJhSW5p
dGlhbGl6YXRpb25MZXZlbCwgRXh0cmFJbml0aWFsaXphdGlvbkxldmVsOjpPdGhlcik7CisKKyAg
ICAgICAgZXhpdC5leGl0U3RhdGUtPmV4dHJhSW5pdGlhbGl6YXRpb25MZXZlbCA9IGV4dHJhSW5p
dGlhbGl6YXRpb25MZXZlbDsKKworICAgICAgICBpZiAoVU5MSUtFTFkoT3B0aW9uczo6dmVyYm9z
ZU9TUigpIHx8IE9wdGlvbnM6OnZlcmJvc2VERkdPU1JFeGl0KCkpKSB7CisgICAgICAgICAgICBk
YXRhTG9nRigiREZHIE9TUiBleGl0ICMldSAoJXMsICVzKSBmcm9tICVzLCB3aXRoIG9wZXJhbmRz
ID0gJXNcbiIsCisgICAgICAgICAgICAgICAgZXhpdEluZGV4LCB0b0NTdHJpbmcoZXhpdC5tX2Nv
ZGVPcmlnaW4pLmRhdGEoKSwKKyAgICAgICAgICAgICAgICBleGl0S2luZFRvU3RyaW5nKGV4aXQu
bV9raW5kKSwgdG9DU3RyaW5nKCpjb2RlQmxvY2spLmRhdGEoKSwKKyAgICAgICAgICAgICAgICB0
b0NTdHJpbmcoaWdub3JpbmdDb250ZXh0PER1bXBDb250ZXh0PihvcGVyYW5kcykpLmRhdGEoKSk7
CisgICAgICAgIH0KKyAgICB9CisKKyAgICBPU1JFeGl0U3RhdGUmIGV4aXRTdGF0ZSA9ICpleGl0
LmV4aXRTdGF0ZS5nZXQoKTsKKyAgICBDb2RlQmxvY2sqIGJhc2VsaW5lQ29kZUJsb2NrID0gZXhp
dFN0YXRlLmJhc2VsaW5lQ29kZUJsb2NrOworICAgIEFTU0VSVChiYXNlbGluZUNvZGVCbG9jay0+
aml0VHlwZSgpID09IEpJVENvZGU6OkJhc2VsaW5lSklUKTsKKworICAgIE9wZXJhbmRzPFZhbHVl
UmVjb3Zlcnk+JiBvcGVyYW5kcyA9IGV4aXRTdGF0ZS5vcGVyYW5kczsKKyAgICBWZWN0b3I8VW5k
ZWZpbmVkT3BlcmFuZFNwYW4+JiB1bmRlZmluZWRPcGVyYW5kU3BhbnMgPSBleGl0U3RhdGUudW5k
ZWZpbmVkT3BlcmFuZFNwYW5zOworCisgICAgY29udGV4dC5zcCgpID0gY29udGV4dC5mcDx1aW50
OF90Kj4oKSArIGV4aXRTdGF0ZS5zdGFja1BvaW50ZXJPZmZzZXQ7CisKKyAgICAvLyBUaGUgb25s
eSByZWFzb24gZm9yIHVzaW5nIHRoaXMgZG8gd2hpbGUgbG9vayBpcyBzbyB3ZSBjYW4gYnJlYWsg
b3V0IG1pZHdheSB3aGVuIGFwcHJvcHJpYXRlLgorICAgIGRvIHsKKyAgICAgICAgYXV0byBleHRy
YUluaXRpYWxpemF0aW9uTGV2ZWwgPSBzdGF0aWNfY2FzdDxFeHRyYUluaXRpYWxpemF0aW9uTGV2
ZWw+KGV4aXRTdGF0ZS5leHRyYUluaXRpYWxpemF0aW9uTGV2ZWwpOworCisgICAgICAgIGlmIChl
eHRyYUluaXRpYWxpemF0aW9uTGV2ZWwgPT0gRXh0cmFJbml0aWFsaXphdGlvbkxldmVsOjpOb25l
KSB7CisgICAgICAgICAgICBjb250ZXh0LnNwKCkgPSBjb250ZXh0LmZwPHVpbnQ4X3QqPigpICsg
ZXhpdFN0YXRlLnN0YWNrUG9pbnRlck9mZnNldDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAg
ICB9CisKKyAgICAgICAgLy8gQmVnaW4gZXh0cmEgaW5pdGlsaXphdGlvbiBsZXZlbDogU3BlY3Vs
YXRpb25SZWNvdmVyeQorCisgICAgICAgIC8vIFdlIG5lZWQgdG8gZG8gc3BlY3VsYXRpb24gcmVj
b3ZlcnkgZmlyc3QgYmVjYXVzZSBhcnJheSBwcm9maWxpbmcgYW5kIHZhbHVlIHByb2ZpbGluZwor
ICAgICAgICAvLyBtYXkgcmVseSBvbiBhIHZhbHVlIHRoYXQgaXQgcmVjb3ZlcnMuIEhvd2V2ZXIs
IHRoYXQgZG9lc24ndCBtZWFuIHRoYXQgaXQgaXMgbGlrZWx5CisgICAgICAgIC8vIHRvIGhhdmUg
YSByZWNvdmVyeSB2YWx1ZS4gU28sIHdlJ2xsIGRlY29yYXRlIGl0IGFzIFVOTElLRUxZLgorICAg
ICAgICBTcGVjdWxhdGlvblJlY292ZXJ5KiByZWNvdmVyeSA9IGV4aXRTdGF0ZS5yZWNvdmVyeTsK
KyAgICAgICAgaWYgKFVOTElLRUxZKHJlY292ZXJ5KSkgeworICAgICAgICAgICAgc3dpdGNoIChy
ZWNvdmVyeS0+dHlwZSgpKSB7CisgICAgICAgICAgICBjYXNlIFNwZWN1bGF0aXZlQWRkOgorICAg
ICAgICAgICAgICAgIGNwdS5ncHIocmVjb3ZlcnktPmRlc3QoKSkgPSBjcHUuZ3ByPHVpbnQzMl90
PihyZWNvdmVyeS0+ZGVzdCgpKSAtIGNwdS5ncHI8dWludDMyX3Q+KHJlY292ZXJ5LT5zcmMoKSk7
CisjaWYgVVNFKEpTVkFMVUU2NCkKKyAgICAgICAgICAgICAgICBBU1NFUlQoIShjcHUuZ3ByKHJl
Y292ZXJ5LT5kZXN0KCkpID4+IDMyKSk7CisgICAgICAgICAgICAgICAgY3B1LmdwcihyZWNvdmVy
eS0+ZGVzdCgpKSB8PSBUYWdUeXBlTnVtYmVyOworI2VuZGlmCisgICAgICAgICAgICAgICAgYnJl
YWs7CisKKyAgICAgICAgICAgIGNhc2UgU3BlY3VsYXRpdmVBZGRJbW1lZGlhdGU6CisgICAgICAg
ICAgICAgICAgY3B1LmdwcihyZWNvdmVyeS0+ZGVzdCgpKSA9IChjcHUuZ3ByPHVpbnQzMl90Pihy
ZWNvdmVyeS0+ZGVzdCgpKSAtIHJlY292ZXJ5LT5pbW1lZGlhdGUoKSk7CisjaWYgVVNFKEpTVkFM
VUU2NCkKKyAgICAgICAgICAgICAgICBBU1NFUlQoIShjcHUuZ3ByKHJlY292ZXJ5LT5kZXN0KCkp
ID4+IDMyKSk7CisgICAgICAgICAgICAgICAgY3B1LmdwcihyZWNvdmVyeS0+ZGVzdCgpKSB8PSBU
YWdUeXBlTnVtYmVyOworI2VuZGlmCisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAg
ICAgIGNhc2UgQm9vbGVhblNwZWN1bGF0aW9uQ2hlY2s6CisjaWYgVVNFKEpTVkFMVUU2NCkKKyAg
ICAgICAgICAgICAgICBjcHUuZ3ByKHJlY292ZXJ5LT5kZXN0KCkpID0gY3B1LmdwcihyZWNvdmVy
eS0+ZGVzdCgpKSBeIFZhbHVlRmFsc2U7CisjZW5kaWYKKyAgICAgICAgICAgICAgICBicmVhazsK
KworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAg
ICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoZXh0cmFJbml0aWFsaXphdGlvbkxldmVsIDw9
IEV4dHJhSW5pdGlhbGl6YXRpb25MZXZlbDo6U3BlY3VsYXRpb25SZWNvdmVyeSkKKyAgICAgICAg
ICAgIGJyZWFrOworCisgICAgICAgIC8vIEJlZ2luIGV4dHJhIGluaXRpbGl6YXRpb24gbGV2ZWw6
IFZhbHVlUHJvZmlsZVVwZGF0ZQorICAgICAgICBKU1ZhbHVlIHByb2ZpbGVkVmFsdWU7CisgICAg
ICAgIGlmICghIWV4aXQubV9qc1ZhbHVlU291cmNlKSB7CisgICAgICAgICAgICBwcm9maWxlZFZh
bHVlID0ganNWYWx1ZUZvcihjcHUsIGV4aXQubV9qc1ZhbHVlU291cmNlKTsKKyAgICAgICAgICAg
IGlmIChNZXRob2RPZkdldHRpbmdBVmFsdWVQcm9maWxlIHByb2ZpbGUgPSBleGl0Lm1fdmFsdWVQ
cm9maWxlKQorICAgICAgICAgICAgICAgIHByb2ZpbGUucmVwb3J0VmFsdWUocHJvZmlsZWRWYWx1
ZSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGV4dHJhSW5pdGlhbGl6YXRpb25MZXZlbCA8PSBF
eHRyYUluaXRpYWxpemF0aW9uTGV2ZWw6OlZhbHVlUHJvZmlsZVVwZGF0ZSkKKyAgICAgICAgICAg
IGJyZWFrOworCisgICAgICAgIC8vIEJlZ2luIGV4dHJhIGluaXRpbGl6YXRpb24gbGV2ZWw6IEFy
cmF5UHJvZmlsZVVwZGF0ZQorICAgICAgICBBcnJheVByb2ZpbGUqIGFycmF5UHJvZmlsZSA9IGV4
aXRTdGF0ZS5hcnJheVByb2ZpbGU7CisgICAgICAgIGlmIChhcnJheVByb2ZpbGUpIHsKKyAgICAg
ICAgICAgIEFTU0VSVCghIWV4aXQubV9qc1ZhbHVlU291cmNlKTsKKyAgICAgICAgICAgIEFTU0VS
VChleGl0Lm1fa2luZCA9PSBCYWRDYWNoZSB8fCBleGl0Lm1fa2luZCA9PSBCYWRJbmRleGluZ1R5
cGUpOworICAgICAgICAgICAgU3RydWN0dXJlKiBzdHJ1Y3R1cmUgPSBwcm9maWxlZFZhbHVlLmFz
Q2VsbCgpLT5zdHJ1Y3R1cmUodm0pOworICAgICAgICAgICAgYXJyYXlQcm9maWxlLT5vYnNlcnZl
U3RydWN0dXJlKHN0cnVjdHVyZSk7CisgICAgICAgICAgICBhcnJheVByb2ZpbGUtPm9ic2VydmVB
cnJheU1vZGUoYXNBcnJheU1vZGVzKHN0cnVjdHVyZS0+aW5kZXhpbmdUeXBlKCkpKTsKKyAgICAg
ICAgfQorICAgICAgICBpZiAoZXh0cmFJbml0aWFsaXphdGlvbkxldmVsIDw9IEV4dHJhSW5pdGlh
bGl6YXRpb25MZXZlbDo6QXJyYXlQcm9maWxlVXBkYXRlKQorICAgICAgICAgICAgYnJlYWs7CisK
KyAgICAgICAgLy8gQmVnaW4gRXh0cmEgaW5pdGlsaXphdGlvbiBsZXZlbDogT3RoZXIKKyAgICAg
ICAgaWYgKFVOTElLRUxZKGV4aXQubV9raW5kID09IEdlbmVyaWNVbndpbmQpKSB7CisgICAgICAg
ICAgICAvLyBXZSBhcmUgYWN0aW5nIGFzIGEgZGVmYWN0byBvcF9jYXRjaCBiZWNhdXNlIHdlIGFy
cml2ZSBoZXJlIGZyb20gZ2VuZXJpY1Vud2luZCgpLgorICAgICAgICAgICAgLy8gU28sIHdlIG11
c3QgcmVzdG9yZSBvdXIgY2FsbCBmcmFtZSBhbmQgc3RhY2sgcG9pbnRlci4KKyAgICAgICAgICAg
IHJlc3RvcmVDYWxsZWVTYXZlc0Zyb21WTUVudHJ5RnJhbWVDYWxsZWVTYXZlc0J1ZmZlcihjb250
ZXh0KTsKKyAgICAgICAgICAgIEFTU0VSVChjb250ZXh0LmZwKCkgPT0gdm0uY2FsbEZyYW1lRm9y
Q2F0Y2gpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGV4aXRTdGF0ZS5wcm9maWxlckV4aXQp
CisgICAgICAgICAgICBleGl0U3RhdGUucHJvZmlsZXJFeGl0LT5pbmNDb3VudCgpOworCisgICAg
ICAgIGlmIChVTkxJS0VMWShPcHRpb25zOjpwcmludEVhY2hPU1JFeGl0KCkpKQorICAgICAgICAg
ICAgcHJpbnRPU1JFeGl0KGNvbnRleHQsIHZtLm9zckV4aXRJbmRleCwgZXhpdCk7CisKKyAgICB9
IHdoaWxlIChmYWxzZSk7IC8vIEVuZCBleHRyYSBpbml0aWFsaXphdGlvbi4KKworICAgIEZyYW1l
IGZyYW1lKGNwdS5mcCgpLCBjb250ZXh0LnN0YWNrKCkpOworICAgIEFTU0VSVCghKGNvbnRleHQu
ZnA8dWludHB0cl90PigpICYgMHg3KSk7CisKKyNpZiBVU0UoSlNWQUxVRTY0KQorICAgIEFTU0VS
VChjcHUuZ3ByKEdQUkluZm86OnRhZ1R5cGVOdW1iZXJSZWdpc3RlcikgPT0gVGFnVHlwZU51bWJl
cik7CisgICAgQVNTRVJUKGNwdS5ncHIoR1BSSW5mbzo6dGFnTWFza1JlZ2lzdGVyKSA9PSBUYWdN
YXNrKTsKKyNlbmRpZgorCisgICAgLy8gRG8gYWxsIGRhdGEgZm9ybWF0IGNvbnZlcnNpb25zIGFu
ZCBzdG9yZSB0aGUgcmVzdWx0cyBpbnRvIHRoZSBzdGFjay4KKyAgICAvLyBOb3RlOiB3ZSBuZWVk
IHRvIHJlY292ZXIgdmFsdWVzIGJlZm9yZSByZXN0b3JpbmcgY2FsbGVlIHNhdmUgcmVnaXN0ZXJz
IGJlbG93CisgICAgLy8gYmVjYXVzZSB0aGUgcmVjb3ZlcnkgbWF5IHJlbHkgb24gdmFsdWVzIGlu
IHNvbWUgb2YgY2FsbGVlIHNhdmUgcmVnaXN0ZXJzLgorCisgICAgaW50IGNhbGxlZVNhdmVTcGFj
ZUFzVmlydHVhbFJlZ2lzdGVycyA9IHN0YXRpY19jYXN0PGludD4oYmFzZWxpbmVDb2RlQmxvY2st
PmNhbGxlZVNhdmVTcGFjZUFzVmlydHVhbFJlZ2lzdGVycygpKTsKKyAgICBzaXplX3QgbnVtYmVy
T2ZPcGVyYW5kcyA9IG9wZXJhbmRzLnNpemUoKTsKKyAgICBzaXplX3QgbnVtVW5kZWZpbmVkT3Bl
cmFuZFNwYW5zID0gdW5kZWZpbmVkT3BlcmFuZFNwYW5zLnNpemUoKTsKKworICAgIHNpemVfdCBu
ZXh0VW5kZWZpbmVkU3BhbkluZGV4ID0gMDsKKyAgICBzaXplX3QgbmV4dFVuZGVmaW5lZE9wZXJh
bmRJbmRleCA9IG51bWJlck9mT3BlcmFuZHM7CisgICAgaWYgKG51bVVuZGVmaW5lZE9wZXJhbmRT
cGFucykKKyAgICAgICAgbmV4dFVuZGVmaW5lZE9wZXJhbmRJbmRleCA9IHVuZGVmaW5lZE9wZXJh
bmRTcGFuc1tuZXh0VW5kZWZpbmVkU3BhbkluZGV4XS5maXJzdEluZGV4OworCisgICAgSlNWYWx1
ZSB1bmRlZmluZWQgPSBqc1VuZGVmaW5lZCgpOworICAgIGZvciAoc2l6ZV90IHNwYW5JbmRleCA9
IDA7IHNwYW5JbmRleCA8IG51bVVuZGVmaW5lZE9wZXJhbmRTcGFuczsgKytzcGFuSW5kZXgpIHsK
KyAgICAgICAgYXV0byYgc3BhbiA9IHVuZGVmaW5lZE9wZXJhbmRTcGFuc1tzcGFuSW5kZXhdOwor
ICAgICAgICBpbnQgZmlyc3RPZmZzZXQgPSBzcGFuLm1pbk9mZnNldDsKKyAgICAgICAgaW50IGxh
c3RPZmZzZXQgPSBmaXJzdE9mZnNldCArIHNwYW4ubnVtYmVyT2ZSZWdpc3RlcnM7CisKKyAgICAg
ICAgZm9yIChpbnQgb2Zmc2V0ID0gZmlyc3RPZmZzZXQ7IG9mZnNldCA8IGxhc3RPZmZzZXQ7ICsr
b2Zmc2V0KQorICAgICAgICAgICAgZnJhbWUuc2V0T3BlcmFuZChvZmZzZXQsIHVuZGVmaW5lZCk7
CisgICAgfQorCisgICAgZm9yIChzaXplX3QgaW5kZXggPSAwOyBpbmRleCA8IG51bWJlck9mT3Bl
cmFuZHM7ICsraW5kZXgpIHsKKyAgICAgICAgY29uc3QgVmFsdWVSZWNvdmVyeSYgcmVjb3Zlcnkg
PSBvcGVyYW5kc1tpbmRleF07CisgICAgICAgIFZpcnR1YWxSZWdpc3RlciByZWcgPSBvcGVyYW5k
cy52aXJ0dWFsUmVnaXN0ZXJGb3JJbmRleChpbmRleCk7CisKKyAgICAgICAgaWYgKFVOTElLRUxZ
KGluZGV4ID09IG5leHRVbmRlZmluZWRPcGVyYW5kSW5kZXgpKSB7CisgICAgICAgICAgICBpbmRl
eCArPSB1bmRlZmluZWRPcGVyYW5kU3BhbnNbbmV4dFVuZGVmaW5lZFNwYW5JbmRleCsrXS5udW1i
ZXJPZlJlZ2lzdGVycyAtIDE7CisgICAgICAgICAgICBpZiAobmV4dFVuZGVmaW5lZFNwYW5JbmRl
eCA8IG51bVVuZGVmaW5lZE9wZXJhbmRTcGFucykKKyAgICAgICAgICAgICAgICBuZXh0VW5kZWZp
bmVkT3BlcmFuZEluZGV4ID0gdW5kZWZpbmVkT3BlcmFuZFNwYW5zW25leHRVbmRlZmluZWRTcGFu
SW5kZXhdLmZpcnN0SW5kZXg7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgbmV4
dFVuZGVmaW5lZE9wZXJhbmRJbmRleCA9IG51bWJlck9mT3BlcmFuZHM7CisgICAgICAgICAgICBj
b250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChyZWcuaXNMb2NhbCgpICYmIHJlZy50
b0xvY2FsKCkgPCBjYWxsZWVTYXZlU3BhY2VBc1ZpcnR1YWxSZWdpc3RlcnMpCisgICAgICAgICAg
ICBjb250aW51ZTsKKworICAgICAgICBpbnQgb3BlcmFuZCA9IHJlZy5vZmZzZXQoKTsKKworICAg
ICAgICBzd2l0Y2ggKHJlY292ZXJ5LnRlY2huaXF1ZSgpKSB7CisgICAgICAgIGNhc2UgRGlzcGxh
Y2VkSW5KU1N0YWNrOgorICAgICAgICAgICAgZnJhbWUuc2V0T3BlcmFuZChvcGVyYW5kLCBleGVj
LT5yKHJlY292ZXJ5LnZpcnR1YWxSZWdpc3RlcigpKS5qc1ZhbHVlKCkpOworICAgICAgICAgICAg
YnJlYWs7CisKKyAgICAgICAgY2FzZSBJbkZQUjoKKyAgICAgICAgICAgIGZyYW1lLnNldE9wZXJh
bmQob3BlcmFuZCwgY3B1LmZwcjxKU1ZhbHVlPihyZWNvdmVyeS5mcHIoKSkpOworICAgICAgICAg
ICAgYnJlYWs7CisKKyNpZiBVU0UoSlNWQUxVRTY0KQorICAgICAgICBjYXNlIEluR1BSOgorICAg
ICAgICAgICAgZnJhbWUuc2V0T3BlcmFuZChvcGVyYW5kLCBjcHUuZ3ByPEpTVmFsdWU+KHJlY292
ZXJ5LmdwcigpKSk7CisgICAgICAgICAgICBicmVhazsKKyNlbHNlCisgICAgICAgIGNhc2UgSW5Q
YWlyOgorICAgICAgICAgICAgZnJhbWUuc2V0T3BlcmFuZChvcGVyYW5kLCBKU1ZhbHVlKGNwdS5n
cHI8aW50MzJfdD4ocmVjb3ZlcnkudGFnR1BSKCkpLCBjcHUuZ3ByPGludDMyX3Q+KHJlY292ZXJ5
LnBheWxvYWRHUFIoKSkpKTsKKyAgICAgICAgICAgIGJyZWFrOworI2VuZGlmCisKKyAgICAgICAg
Y2FzZSBVbmJveGVkQ2VsbEluR1BSOgorICAgICAgICAgICAgZnJhbWUuc2V0T3BlcmFuZChvcGVy
YW5kLCBKU1ZhbHVlKGNwdS5ncHI8SlNDZWxsKj4ocmVjb3ZlcnkuZ3ByKCkpKSk7CisgICAgICAg
ICAgICBicmVhazsKKworICAgICAgICBjYXNlIENlbGxEaXNwbGFjZWRJbkpTU3RhY2s6CisgICAg
ICAgICAgICBmcmFtZS5zZXRPcGVyYW5kKG9wZXJhbmQsIEpTVmFsdWUoZXhlYy0+cihyZWNvdmVy
eS52aXJ0dWFsUmVnaXN0ZXIoKSkudW5ib3hlZENlbGwoKSkpOworICAgICAgICAgICAgYnJlYWs7
CisKKyNpZiBVU0UoSlNWQUxVRTMyXzY0KQorICAgICAgICBjYXNlIFVuYm94ZWRCb29sZWFuSW5H
UFI6CisgICAgICAgICAgICBmcmFtZS5zZXRPcGVyYW5kKG9wZXJhbmQsIGpzQm9vbGVhbihjcHUu
Z3ByPGJvb2w+KHJlY292ZXJ5LmdwcigpKSkpOworICAgICAgICAgICAgYnJlYWs7CisjZW5kaWYK
KworICAgICAgICBjYXNlIEJvb2xlYW5EaXNwbGFjZWRJbkpTU3RhY2s6CisjaWYgVVNFKEpTVkFM
VUU2NCkKKyAgICAgICAgICAgIGZyYW1lLnNldE9wZXJhbmQob3BlcmFuZCwgZXhlYy0+cihyZWNv
dmVyeS52aXJ0dWFsUmVnaXN0ZXIoKSkuanNWYWx1ZSgpKTsKKyNlbHNlCisgICAgICAgICAgICBm
cmFtZS5zZXRPcGVyYW5kKG9wZXJhbmQsIGpzQm9vbGVhbihleGVjLT5yKHJlY292ZXJ5LnZpcnR1
YWxSZWdpc3RlcigpKS5qc1ZhbHVlKCkucGF5bG9hZCgpKSk7CisjZW5kaWYKKyAgICAgICAgICAg
IGJyZWFrOworCisgICAgICAgIGNhc2UgVW5ib3hlZEludDMySW5HUFI6CisgICAgICAgICAgICBm
cmFtZS5zZXRPcGVyYW5kKG9wZXJhbmQsIEpTVmFsdWUoY3B1LmdwcjxpbnQzMl90PihyZWNvdmVy
eS5ncHIoKSkpKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgSW50MzJEaXNw
bGFjZWRJbkpTU3RhY2s6CisgICAgICAgICAgICBmcmFtZS5zZXRPcGVyYW5kKG9wZXJhbmQsIEpT
VmFsdWUoZXhlYy0+cihyZWNvdmVyeS52aXJ0dWFsUmVnaXN0ZXIoKSkudW5ib3hlZEludDMyKCkp
KTsKKyAgICAgICAgICAgIGJyZWFrOworCisjaWYgVVNFKEpTVkFMVUU2NCkKKyAgICAgICAgY2Fz
ZSBVbmJveGVkSW50NTJJbkdQUjoKKyAgICAgICAgICAgIGZyYW1lLnNldE9wZXJhbmQob3BlcmFu
ZCwgSlNWYWx1ZShjcHUuZ3ByPGludDY0X3Q+KHJlY292ZXJ5LmdwcigpKSA+PiBKU1ZhbHVlOjpp
bnQ1MlNoaWZ0QW1vdW50KSk7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIElu
dDUyRGlzcGxhY2VkSW5KU1N0YWNrOgorICAgICAgICAgICAgZnJhbWUuc2V0T3BlcmFuZChvcGVy
YW5kLCBKU1ZhbHVlKGV4ZWMtPnIocmVjb3ZlcnkudmlydHVhbFJlZ2lzdGVyKCkpLnVuYm94ZWRJ
bnQ1MigpKSk7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIFVuYm94ZWRTdHJp
Y3RJbnQ1MkluR1BSOgorICAgICAgICAgICAgZnJhbWUuc2V0T3BlcmFuZChvcGVyYW5kLCBKU1Zh
bHVlKGNwdS5ncHI8aW50NjRfdD4ocmVjb3ZlcnkuZ3ByKCkpKSk7CisgICAgICAgICAgICBicmVh
azsKKworICAgICAgICBjYXNlIFN0cmljdEludDUyRGlzcGxhY2VkSW5KU1N0YWNrOgorICAgICAg
ICAgICAgZnJhbWUuc2V0T3BlcmFuZChvcGVyYW5kLCBKU1ZhbHVlKGV4ZWMtPnIocmVjb3Zlcnku
dmlydHVhbFJlZ2lzdGVyKCkpLnVuYm94ZWRTdHJpY3RJbnQ1MigpKSk7CisgICAgICAgICAgICBi
cmVhazsKKyNlbmRpZgorCisgICAgICAgIGNhc2UgVW5ib3hlZERvdWJsZUluRlBSOgorICAgICAg
ICAgICAgZnJhbWUuc2V0T3BlcmFuZChvcGVyYW5kLCBKU1ZhbHVlKEpTVmFsdWU6OkVuY29kZUFz
RG91YmxlLCBwdXJpZnlOYU4oY3B1LmZwcihyZWNvdmVyeS5mcHIoKSkpKSk7CisgICAgICAgICAg
ICBicmVhazsKKworICAgICAgICBjYXNlIERvdWJsZURpc3BsYWNlZEluSlNTdGFjazoKKyAgICAg
ICAgICAgIGZyYW1lLnNldE9wZXJhbmQob3BlcmFuZCwgSlNWYWx1ZShKU1ZhbHVlOjpFbmNvZGVB
c0RvdWJsZSwgcHVyaWZ5TmFOKGV4ZWMtPnIocmVjb3ZlcnkudmlydHVhbFJlZ2lzdGVyKCkpLnVu
Ym94ZWREb3VibGUoKSkpKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgQ29u
c3RhbnQ6CisgICAgICAgICAgICBmcmFtZS5zZXRPcGVyYW5kKG9wZXJhbmQsIHJlY292ZXJ5LmNv
bnN0YW50KCkpOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBEaXJlY3RBcmd1
bWVudHNUaGF0V2VyZU5vdENyZWF0ZWQ6CisgICAgICAgIGNhc2UgQ2xvbmVkQXJndW1lbnRzVGhh
dFdlcmVOb3RDcmVhdGVkOgorICAgICAgICAgICAgLy8gRG9uJ3QgZG8gdGhpcywgeWV0LgorICAg
ICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIFJFTEVBU0Vf
QVNTRVJUX05PVF9SRUFDSEVEKCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAg
IH0KKworICAgIC8vIFJlc3RvcmUgdGhlIERGRyBjYWxsZWUgc2F2ZXMgYW5kIHRoZW4gc2F2ZSB0
aGUgb25lcyB0aGUgYmFzZWxpbmUgSklUIHVzZXMuCisgICAgcmVzdG9yZUNhbGxlZVNhdmVzRm9y
KGNvbnRleHQsIGNvZGVCbG9jayk7CisgICAgc2F2ZUNhbGxlZVNhdmVzRm9yKGNvbnRleHQsIGJh
c2VsaW5lQ29kZUJsb2NrKTsKKworI2lmIFVTRShKU1ZBTFVFNjQpCisgICAgY3B1LmdwcihHUFJJ
bmZvOjp0YWdUeXBlTnVtYmVyUmVnaXN0ZXIpID0gVGFnVHlwZU51bWJlcjsKKyAgICBjcHUuZ3By
KEdQUkluZm86OnRhZ01hc2tSZWdpc3RlcikgPSBUYWdUeXBlTnVtYmVyIHwgVGFnQml0VHlwZU90
aGVyOworI2VuZGlmCisKKyAgICBpZiAoZXhpdC5pc0V4Y2VwdGlvbkhhbmRsZXIoKSkKKyAgICAg
ICAgY29weUNhbGxlZVNhdmVzVG9WTUVudHJ5RnJhbWVDYWxsZWVTYXZlc0J1ZmZlcihjb250ZXh0
KTsKKworICAgIC8vIE5vdyB0aGF0IHRoaW5ncyBvbiB0aGUgc3RhY2sgYXJlIHJlY292ZXJlZCwg
ZG8gdGhlIGFyZ3VtZW50cyByZWNvdmVyeS4gV2UgYXNzdW1lIHRoYXQgYXJndW1lbnRzCisgICAg
Ly8gcmVjb3ZlcmllcyBkb24ndCByZWN1cnNpdmVseSByZWZlciB0byBlYWNoIG90aGVyLiBCdXQs
IHdlIGRvbid0IHRyeSB0byBhc3N1bWUgdGhhdCB0aGV5IG9ubHkKKyAgICAvLyByZWZlciB0byBj
ZXJ0YWluIHJhbmdlcyBvZiBsb2NhbHMuIEhlbmNlIHdoeSB3ZSBuZWVkIHRvIGRvIHRoaXMgaGVy
ZSwgb25jZSB0aGUgc3RhY2sgaXMgc2Vuc2libGUuCisgICAgLy8gTm90ZSB0aGF0IHdlIGFsc28g
cm91Z2hseSBhc3N1bWUgdGhhdCB0aGUgYXJndW1lbnRzIG1pZ2h0IHN0aWxsIGJlIG1hdGVyaWFs
aXplZCBvdXRzaWRlIG9mIGl0cworICAgIC8vIGlubGluZSBjYWxsIGZyYW1lIHNjb3BlIC0gYnV0
IGZvciBub3cgdGhlIERGRyB3b3VsZG4ndCBkbyB0aGF0LgorCisgICAgREZHOjplbWl0UmVzdG9y
ZUFyZ3VtZW50cyhjb250ZXh0LCBjb2RlQmxvY2ssIGRmZ0pJVENvZGUsIG9wZXJhbmRzKTsKKwor
ICAgIC8vIEFkanVzdCB0aGUgb2xkIEpJVCdzIGV4ZWN1dGUgY291bnRlci4gU2luY2Ugd2UgYXJl
IGV4aXRpbmcgT1NSLCB3ZSBrbm93CisgICAgLy8gdGhhdCBhbGwgbmV3IGNhbGxzIGludG8gdGhp
cyBjb2RlIHdpbGwgZ28gdG8gdGhlIG5ldyBKSVQsIHNvIHRoZSBleGVjdXRlCisgICAgLy8gY291
bnRlciBvbmx5IGFmZmVjdHMgY2FsbCBmcmFtZXMgdGhhdCBwZXJmb3JtZWQgT1NSIGV4aXQgYW5k
IGNhbGwgZnJhbWVzCisgICAgLy8gdGhhdCB3ZXJlIHN0aWxsIGV4ZWN1dGluZyB0aGUgb2xkIEpJ
VCBhdCB0aGUgdGltZSBvZiBhbm90aGVyIGNhbGwgZnJhbWUncworICAgIC8vIE9TUiBleGl0LiBX
ZSB3YW50IHRvIGVuc3VyZSB0aGF0IHRoZSBmb2xsb3dpbmcgaXMgdHJ1ZToKKyAgICAvLworICAg
IC8vIChhKSBDb2RlIHRoZSBwZXJmb3JtcyBhbiBPU1IgZXhpdCBnZXRzIGEgY2hhbmNlIHRvIHJl
ZW50ZXIgb3B0aW1pemVkCisgICAgLy8gICAgIGNvZGUgZXZlbnR1YWxseSwgc2luY2Ugb3B0aW1p
emVkIGNvZGUgaXMgZmFzdGVyLiBCdXQgd2UgZG9uJ3QKKyAgICAvLyAgICAgd2FudCB0byBkbyBz
dWNoIHJlZW50ZXJ5IHRvbyBhZ2dyZXNzaXZlbHkgKHNlZSAoYykgYmVsb3cpLgorICAgIC8vCisg
ICAgLy8gKGIpIElmIHRoZXJlIGlzIGNvZGUgb24gdGhlIGNhbGwgc3RhY2sgdGhhdCBpcyBzdGls
bCBydW5uaW5nIHRoZSBvbGQKKyAgICAvLyAgICAgSklUJ3MgY29kZSBhbmQgaGFzIG5ldmVyIE9T
UidkLCB0aGVuIGl0IHNob3VsZCBnZXQgYSBjaGFuY2UgdG8KKyAgICAvLyAgICAgcGVyZm9ybSBP
U1IgZW50cnkgZGVzcGl0ZSB0aGUgZmFjdCB0aGF0IHdlJ3ZlIGV4aXRlZC4KKyAgICAvLworICAg
IC8vIChjKSBDb2RlIHRoZSBwZXJmb3JtcyBhbiBPU1IgZXhpdCBzaG91bGQgbm90IGltbWVkaWF0
ZWx5IHJldHJ5IE9TUgorICAgIC8vICAgICBlbnRyeSwgc2luY2UgYm90aCBmb3JtcyBvZiBPU1Ig
YXJlIGV4cGVuc2l2ZS4gT1NSIGVudHJ5IGlzCisgICAgLy8gICAgIHBhcnRpY3VsYXJseSBleHBl
bnNpdmUuCisgICAgLy8KKyAgICAvLyAoZCkgRnJlcXVlbnQgT1NSIGZhaWx1cmVzLCBldmVuIHRo
b3NlIHRoYXQgZG8gbm90IHJlc3VsdCBpbiB0aGUgY29kZQorICAgIC8vICAgICBydW5uaW5nIGlu
IGEgaG90IGxvb3AsIHJlc3VsdCBpbiByZWNvbXBpbGF0aW9uIGdldHRpbmcgdHJpZ2dlcmVkLgor
ICAgIC8vCisgICAgLy8gVG8gZW5zdXJlIChjKSwgd2UnZCBsaWtlIHRvIHNldCB0aGUgZXhlY3V0
ZSBjb3VudGVyIHRvCisgICAgLy8gY291bnRlclZhbHVlRm9yT3B0aW1pemVBZnRlcldhcm1VcCgp
LiBUaGlzIHNlZW1zIGxpa2UgaXQgd291bGQgZW5kYW5nZXIKKyAgICAvLyAoYSkgYW5kIChiKSwg
c2luY2UgdGhlbiBldmVyeSBPU1IgZXhpdCB3b3VsZCBkZWxheSB0aGUgb3Bwb3J0dW5pdHkgZm9y
CisgICAgLy8gZXZlcnkgY2FsbCBmcmFtZSB0byBwZXJmb3JtIE9TUiBlbnRyeS4gRXNzZW50aWFs
bHksIGlmIE9TUiBleGl0IGhhcHBlbnMKKyAgICAvLyBmcmVxdWVudGx5IGFuZCB0aGUgZnVuY3Rp
b24gaGFzIGZldyBsb29wcywgdGhlbiB0aGUgY291bnRlciB3aWxsIG5ldmVyCisgICAgLy8gYmVj
b21lIG5vbi1uZWdhdGl2ZSBhbmQgT1NSIGVudHJ5IHdpbGwgbmV2ZXIgYmUgdHJpZ2dlcmVkLiBP
U1IgZW50cnkKKyAgICAvLyB3aWxsIG9ubHkgaGFwcGVuIGlmIGEgbG9vcCBnZXRzIGhvdCBpbiB0
aGUgb2xkIEpJVCwgd2hpY2ggZG9lcyBhIHByZXR0eQorICAgIC8vIGdvb2Qgam9iIG9mIGVuc3Vy
aW5nIChhKSBhbmQgKGIpLiBCdXQgdGhhdCBkb2Vzbid0IHRha2UgY2FyZSBvZiAoZCksCisgICAg
Ly8gc2luY2UgZWFjaCBzcGVjdWxhdGlvbiBmYWlsdXJlIHdvdWxkIHJlc2V0IHRoZSBleGVjdXRl
IGNvdW50ZXIuCisgICAgLy8gU28gd2UgY2hlY2sgaGVyZSBpZiB0aGUgbnVtYmVyIG9mIHNwZWN1
bGF0aW9uIGZhaWx1cmVzIGlzIHNpZ25pZmljYW50bHkKKyAgICAvLyBsYXJnZXIgdGhhbiB0aGUg
bnVtYmVyIG9mIHN1Y2Nlc3NlcyAod2Ugd2FudCA5MCUgc3VjY2VzcyByYXRlKSwgYW5kIGlmCisg
ICAgLy8gdGhlcmUgaGF2ZSBiZWVuIGEgbGFyZ2UgZW5vdWdoIG51bWJlciBvZiBmYWlsdXJlcy4g
SWYgc28sIHdlIHNldCB0aGUKKyAgICAvLyBjb3VudGVyIHRvIDA7IG90aGVyd2lzZSB3ZSBzZXQg
dGhlIGNvdW50ZXIgdG8KKyAgICAvLyBjb3VudGVyVmFsdWVGb3JPcHRpbWl6ZUFmdGVyV2FybVVw
KCkuCisKKyAgICBpZiAoVU5MSUtFTFkoY29kZUJsb2NrLT51cGRhdGVPU1JFeGl0Q291bnRlckFu
ZENoZWNrSWZOZWVkVG9SZW9wdGltaXplKGV4aXRTdGF0ZSkgPT0gQ29kZUJsb2NrOjpPcHRpbWl6
ZUFjdGlvbjo6UmVvcHRpbWl6ZU5vdykpCisgICAgICAgIHRyaWdnZXJSZW9wdGltaXphdGlvbk5v
dyhiYXNlbGluZUNvZGVCbG9jaywgJmV4aXQpOworCisgICAgcmVpZnlJbmxpbmVkQ2FsbEZyYW1l
cyhjb250ZXh0LCBiYXNlbGluZUNvZGVCbG9jaywgZXhpdCk7CisgICAgYWRqdXN0QW5kSnVtcFRv
VGFyZ2V0KGNvbnRleHQsIHZtLCBjb2RlQmxvY2ssIGJhc2VsaW5lQ29kZUJsb2NrLCBleGl0KTsK
K30KKworc3RhdGljIHZvaWQgcmVpZnlJbmxpbmVkQ2FsbEZyYW1lcyhDb250ZXh0JiBjb250ZXh0
LCBDb2RlQmxvY2sqIG91dGVybW9zdEJhc2VsaW5lQ29kZUJsb2NrLCBjb25zdCBPU1JFeGl0QmFz
ZSYgZXhpdCkKK3sKKyAgICBhdXRvJiBjcHUgPSBjb250ZXh0LmNwdTsKKyAgICBGcmFtZSBmcmFt
ZShjcHUuZnAoKSwgY29udGV4dC5zdGFjaygpKTsKKworICAgIC8vIEZJWE1FOiBXZSBzaG91bGRu
J3QgbGVhdmUgaG9sZXMgb24gdGhlIHN0YWNrIHdoZW4gcGVyZm9ybWluZyBhbiBPU1IgZXhpdAor
ICAgIC8vIGluIHByZXNlbmNlIG9mIGlubGluZWQgdGFpbCBjYWxscy4KKyAgICAvLyBodHRwczov
L2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MTQ3NTExCisgICAgQVNTRVJUKG91dGVy
bW9zdEJhc2VsaW5lQ29kZUJsb2NrLT5qaXRUeXBlKCkgPT0gSklUQ29kZTo6QmFzZWxpbmVKSVQp
OworICAgIGZyYW1lLnNldE9wZXJhbmQ8Q29kZUJsb2NrKj4oQ2FsbEZyYW1lU2xvdDo6Y29kZUJs
b2NrLCBvdXRlcm1vc3RCYXNlbGluZUNvZGVCbG9jayk7CisKKyAgICBjb25zdCBDb2RlT3JpZ2lu
KiBjb2RlT3JpZ2luOworICAgIGZvciAoY29kZU9yaWdpbiA9ICZleGl0Lm1fY29kZU9yaWdpbjsg
Y29kZU9yaWdpbiAmJiBjb2RlT3JpZ2luLT5pbmxpbmVDYWxsRnJhbWU7IGNvZGVPcmlnaW4gPSBj
b2RlT3JpZ2luLT5pbmxpbmVDYWxsRnJhbWUtPmdldENhbGxlclNraXBwaW5nVGFpbENhbGxzKCkp
IHsKKyAgICAgICAgSW5saW5lQ2FsbEZyYW1lKiBpbmxpbmVDYWxsRnJhbWUgPSBjb2RlT3JpZ2lu
LT5pbmxpbmVDYWxsRnJhbWU7CisgICAgICAgIENvZGVCbG9jayogYmFzZWxpbmVDb2RlQmxvY2sg
PSBiYXNlbGluZUNvZGVCbG9ja0Zvck9yaWdpbkFuZEJhc2VsaW5lQ29kZUJsb2NrKCpjb2RlT3Jp
Z2luLCBvdXRlcm1vc3RCYXNlbGluZUNvZGVCbG9jayk7CisgICAgICAgIElubGluZUNhbGxGcmFt
ZTo6S2luZCB0cnVlQ2FsbGVyQ2FsbEtpbmQ7CisgICAgICAgIENvZGVPcmlnaW4qIHRydWVDYWxs
ZXIgPSBpbmxpbmVDYWxsRnJhbWUtPmdldENhbGxlclNraXBwaW5nVGFpbENhbGxzKCZ0cnVlQ2Fs
bGVyQ2FsbEtpbmQpOworICAgICAgICB2b2lkKiBjYWxsZXJGcmFtZSA9IGNwdS5mcCgpOworCisg
ICAgICAgIGlmICghdHJ1ZUNhbGxlcikgeworICAgICAgICAgICAgQVNTRVJUKGlubGluZUNhbGxG
cmFtZS0+aXNUYWlsKCkpOworICAgICAgICAgICAgdm9pZCogcmV0dXJuUEMgPSBmcmFtZS5nZXQ8
dm9pZCo+KENhbGxGcmFtZTo6cmV0dXJuUENPZmZzZXQoKSk7CisgICAgICAgICAgICBmcmFtZS5z
ZXQ8dm9pZCo+KGlubGluZUNhbGxGcmFtZS0+cmV0dXJuUENPZmZzZXQoKSwgcmV0dXJuUEMpOwor
ICAgICAgICAgICAgY2FsbGVyRnJhbWUgPSBmcmFtZS5nZXQ8dm9pZCo+KENhbGxGcmFtZTo6Y2Fs
bGVyRnJhbWVPZmZzZXQoKSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBDb2RlQmxv
Y2sqIGJhc2VsaW5lQ29kZUJsb2NrRm9yQ2FsbGVyID0gYmFzZWxpbmVDb2RlQmxvY2tGb3JPcmln
aW5BbmRCYXNlbGluZUNvZGVCbG9jaygqdHJ1ZUNhbGxlciwgb3V0ZXJtb3N0QmFzZWxpbmVDb2Rl
QmxvY2spOworICAgICAgICAgICAgdW5zaWduZWQgY2FsbEJ5dGVjb2RlSW5kZXggPSB0cnVlQ2Fs
bGVyLT5ieXRlY29kZUluZGV4OworICAgICAgICAgICAgdm9pZCoganVtcFRhcmdldCA9IG51bGxw
dHI7CisKKyAgICAgICAgICAgIHN3aXRjaCAodHJ1ZUNhbGxlckNhbGxLaW5kKSB7CisgICAgICAg
ICAgICBjYXNlIElubGluZUNhbGxGcmFtZTo6Q2FsbDoKKyAgICAgICAgICAgIGNhc2UgSW5saW5l
Q2FsbEZyYW1lOjpDb25zdHJ1Y3Q6CisgICAgICAgICAgICBjYXNlIElubGluZUNhbGxGcmFtZTo6
Q2FsbFZhcmFyZ3M6CisgICAgICAgICAgICBjYXNlIElubGluZUNhbGxGcmFtZTo6Q29uc3RydWN0
VmFyYXJnczoKKyAgICAgICAgICAgIGNhc2UgSW5saW5lQ2FsbEZyYW1lOjpUYWlsQ2FsbDoKKyAg
ICAgICAgICAgIGNhc2UgSW5saW5lQ2FsbEZyYW1lOjpUYWlsQ2FsbFZhcmFyZ3M6IHsKKyAgICAg
ICAgICAgICAgICBDYWxsTGlua0luZm8qIGNhbGxMaW5rSW5mbyA9CisgICAgICAgICAgICAgICAg
ICAgIGJhc2VsaW5lQ29kZUJsb2NrRm9yQ2FsbGVyLT5nZXRDYWxsTGlua0luZm9Gb3JCeXRlY29k
ZUluZGV4KGNhbGxCeXRlY29kZUluZGV4KTsKKyAgICAgICAgICAgICAgICBSRUxFQVNFX0FTU0VS
VChjYWxsTGlua0luZm8pOworCisgICAgICAgICAgICAgICAganVtcFRhcmdldCA9IGNhbGxMaW5r
SW5mby0+Y2FsbFJldHVybkxvY2F0aW9uKCkuZXhlY3V0YWJsZUFkZHJlc3MoKTsKKyAgICAgICAg
ICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgY2FzZSBJbmxpbmVD
YWxsRnJhbWU6OkdldHRlckNhbGw6CisgICAgICAgICAgICBjYXNlIElubGluZUNhbGxGcmFtZTo6
U2V0dGVyQ2FsbDogeworICAgICAgICAgICAgICAgIFN0cnVjdHVyZVN0dWJJbmZvKiBzdHViSW5m
byA9CisgICAgICAgICAgICAgICAgICAgIGJhc2VsaW5lQ29kZUJsb2NrRm9yQ2FsbGVyLT5maW5k
U3R1YkluZm8oQ29kZU9yaWdpbihjYWxsQnl0ZWNvZGVJbmRleCkpOworICAgICAgICAgICAgICAg
IFJFTEVBU0VfQVNTRVJUKHN0dWJJbmZvKTsKKworICAgICAgICAgICAgICAgIGp1bXBUYXJnZXQg
PSBzdHViSW5mby0+ZG9uZUxvY2F0aW9uKCkuZXhlY3V0YWJsZUFkZHJlc3MoKTsKKyAgICAgICAg
ICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZGVmYXVsdDoKKyAg
ICAgICAgICAgICAgICBSRUxFQVNFX0FTU0VSVF9OT1RfUkVBQ0hFRCgpOworICAgICAgICAgICAg
fQorCisgICAgICAgICAgICBpZiAodHJ1ZUNhbGxlci0+aW5saW5lQ2FsbEZyYW1lKQorICAgICAg
ICAgICAgICAgIGNhbGxlckZyYW1lID0gY3B1LmZwPHVpbnQ4X3QqPigpICsgdHJ1ZUNhbGxlci0+
aW5saW5lQ2FsbEZyYW1lLT5zdGFja09mZnNldCAqIHNpemVvZihFbmNvZGVkSlNWYWx1ZSk7CisK
KyAgICAgICAgICAgIGZyYW1lLnNldDx2b2lkKj4oaW5saW5lQ2FsbEZyYW1lLT5yZXR1cm5QQ09m
ZnNldCgpLCBqdW1wVGFyZ2V0KTsKKyAgICAgICAgfQorCisgICAgICAgIGZyYW1lLnNldE9wZXJh
bmQ8dm9pZCo+KGlubGluZUNhbGxGcmFtZS0+c3RhY2tPZmZzZXQgKyBDYWxsRnJhbWVTbG90Ojpj
b2RlQmxvY2ssIGJhc2VsaW5lQ29kZUJsb2NrKTsKKworICAgICAgICAvLyBSZXN0b3JlIHRoZSBp
bmxpbmUgY2FsbCBmcmFtZSdzIGNhbGxlZSBzYXZlIHJlZ2lzdGVycy4KKyAgICAgICAgLy8gSWYg
dGhpcyBpbmxpbmVkIGZyYW1lIGlzIGEgdGFpbCBjYWxsIHRoYXQgd2lsbCByZXR1cm4gYmFjayB0
byB0aGUgb3JpZ2luYWwgY2FsbGVyLCB3ZSBuZWVkIHRvCisgICAgICAgIC8vIGNvcHkgdGhlIHBy
aW9yIGNvbnRlbnRzIG9mIHRoZSB0YWcgcmVnaXN0ZXJzIGFscmVhZHkgc2F2ZWQgZm9yIHRoZSBv
dXRlciBmcmFtZSB0byB0aGlzIGZyYW1lLgorICAgICAgICBzYXZlT3JDb3B5Q2FsbGVlU2F2ZXNG
b3IoY29udGV4dCwgYmFzZWxpbmVDb2RlQmxvY2ssIFZpcnR1YWxSZWdpc3RlcihpbmxpbmVDYWxs
RnJhbWUtPnN0YWNrT2Zmc2V0KSwgIXRydWVDYWxsZXIpOworCisgICAgICAgIGlmICghaW5saW5l
Q2FsbEZyYW1lLT5pc1ZhcmFyZ3MoKSkKKyAgICAgICAgICAgIGZyYW1lLnNldE9wZXJhbmQ8dWlu
dDMyX3Q+KGlubGluZUNhbGxGcmFtZS0+c3RhY2tPZmZzZXQgKyBDYWxsRnJhbWVTbG90Ojphcmd1
bWVudENvdW50LCBQYXlsb2FkT2Zmc2V0LCBpbmxpbmVDYWxsRnJhbWUtPmFyZ3VtZW50Q291bnRJ
bmNsdWRpbmdUaGlzKTsKKyAgICAgICAgQVNTRVJUKGNhbGxlckZyYW1lKTsKKyAgICAgICAgZnJh
bWUuc2V0PHZvaWQqPihpbmxpbmVDYWxsRnJhbWUtPmNhbGxlckZyYW1lT2Zmc2V0KCksIGNhbGxl
ckZyYW1lKTsKKyNpZiBVU0UoSlNWQUxVRTY0KQorICAgICAgICB1aW50MzJfdCBsb2NhdGlvbkJp
dHMgPSBDYWxsU2l0ZUluZGV4KGNvZGVPcmlnaW4tPmJ5dGVjb2RlSW5kZXgpLmJpdHMoKTsKKyAg
ICAgICAgZnJhbWUuc2V0T3BlcmFuZDx1aW50MzJfdD4oaW5saW5lQ2FsbEZyYW1lLT5zdGFja09m
ZnNldCArIENhbGxGcmFtZVNsb3Q6OmFyZ3VtZW50Q291bnQsIFRhZ09mZnNldCwgbG9jYXRpb25C
aXRzKTsKKyAgICAgICAgaWYgKCFpbmxpbmVDYWxsRnJhbWUtPmlzQ2xvc3VyZUNhbGwpCisgICAg
ICAgICAgICBmcmFtZS5zZXRPcGVyYW5kKGlubGluZUNhbGxGcmFtZS0+c3RhY2tPZmZzZXQgKyBD
YWxsRnJhbWVTbG90OjpjYWxsZWUsIEpTVmFsdWUoaW5saW5lQ2FsbEZyYW1lLT5jYWxsZWVDb25z
dGFudCgpKSk7CisjZWxzZSAvLyBVU0UoSlNWQUxVRTY0KSAvLyBzbyB0aGlzIGlzIHRoZSAzMi1i
aXQgcGFydAorICAgICAgICBJbnN0cnVjdGlvbiogaW5zdHJ1Y3Rpb24gPSBiYXNlbGluZUNvZGVC
bG9jay0+aW5zdHJ1Y3Rpb25zKCkuYmVnaW4oKSArIGNvZGVPcmlnaW4tPmJ5dGVjb2RlSW5kZXg7
CisgICAgICAgIHVpbnQzMl90IGxvY2F0aW9uQml0cyA9IENhbGxTaXRlSW5kZXgoaW5zdHJ1Y3Rp
b24pLmJpdHMoKTsKKyAgICAgICAgZnJhbWUuc2V0T3BlcmFuZDx1aW50MzJfdD4oaW5saW5lQ2Fs
bEZyYW1lLT5zdGFja09mZnNldCArIENhbGxGcmFtZVNsb3Q6OmFyZ3VtZW50Q291bnQsIFRhZ09m
ZnNldCwgbG9jYXRpb25CaXRzKTsKKyAgICAgICAgZnJhbWUuc2V0T3BlcmFuZDx1aW50MzJfdD4o
aW5saW5lQ2FsbEZyYW1lLT5zdGFja09mZnNldCArIENhbGxGcmFtZVNsb3Q6OmNhbGxlZSwgVGFn
T2Zmc2V0LCBzdGF0aWNfY2FzdDx1aW50MzJfdD4oSlNWYWx1ZTo6Q2VsbFRhZykpOworICAgICAg
ICBpZiAoIWlubGluZUNhbGxGcmFtZS0+aXNDbG9zdXJlQ2FsbCkKKyAgICAgICAgICAgIGZyYW1l
LnNldE9wZXJhbmQoaW5saW5lQ2FsbEZyYW1lLT5zdGFja09mZnNldCArIENhbGxGcmFtZVNsb3Q6
OmNhbGxlZSwgUGF5bG9hZE9mZnNldCwgaW5saW5lQ2FsbEZyYW1lLT5jYWxsZWVDb25zdGFudCgp
KTsKKyNlbmRpZiAvLyBVU0UoSlNWQUxVRTY0KSAvLyBlbmRpbmcgdGhlICNlbHNlIHBhcnQsIHNv
IGRpcmVjdGx5IGFib3ZlIGlzIHRoZSAzMi1iaXQgcGFydAorICAgIH0KKworICAgIC8vIERvbid0
IG5lZWQgdG8gc2V0IHRoZSB0b3BsZXZlbCBjb2RlIG9yaWdpbiBpZiB3ZSBvbmx5IGRpZCBpbmxp
bmUgdGFpbCBjYWxscworICAgIGlmIChjb2RlT3JpZ2luKSB7CisjaWYgVVNFKEpTVkFMVUU2NCkK
KyAgICAgICAgdWludDMyX3QgbG9jYXRpb25CaXRzID0gQ2FsbFNpdGVJbmRleChjb2RlT3JpZ2lu
LT5ieXRlY29kZUluZGV4KS5iaXRzKCk7CisjZWxzZQorICAgICAgICBJbnN0cnVjdGlvbiogaW5z
dHJ1Y3Rpb24gPSBvdXRlcm1vc3RCYXNlbGluZUNvZGVCbG9jay0+aW5zdHJ1Y3Rpb25zKCkuYmVn
aW4oKSArIGNvZGVPcmlnaW4tPmJ5dGVjb2RlSW5kZXg7CisgICAgICAgIHVpbnQzMl90IGxvY2F0
aW9uQml0cyA9IENhbGxTaXRlSW5kZXgoaW5zdHJ1Y3Rpb24pLmJpdHMoKTsKKyNlbmRpZgorICAg
ICAgICBmcmFtZS5zZXRPcGVyYW5kPHVpbnQzMl90PihDYWxsRnJhbWVTbG90Ojphcmd1bWVudENv
dW50LCBUYWdPZmZzZXQsIGxvY2F0aW9uQml0cyk7CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBh
ZGp1c3RBbmRKdW1wVG9UYXJnZXQoQ29udGV4dCYgY29udGV4dCwgVk0mIHZtLCBDb2RlQmxvY2sq
IGNvZGVCbG9jaywgQ29kZUJsb2NrKiBiYXNlbGluZUNvZGVCbG9jaywgT1NSRXhpdCYgZXhpdCkK
K3sKKyAgICBPU1JFeGl0U3RhdGUqIGV4aXRTdGF0ZSA9IGV4aXQuZXhpdFN0YXRlLmdldCgpOwor
CisgICAgV1RGOjpzdG9yZUxvYWRGZW5jZSgpOyAvLyBUaGUgb3B0aW1pemluZyBjb21waWxlciBl
eHBlY3RzIHRoYXQgdGhlIE9TUiBleGl0IG1lY2hhbmlzbSB3aWxsIGV4ZWN1dGUgdGhpcyBmZW5j
ZS4KKyAgICB2bS5oZWFwLndyaXRlQmFycmllcihiYXNlbGluZUNvZGVCbG9jayk7CisKKyAgICAv
LyBXZSBiYXJyaWVyIGFsbCBpbmxpbmVkIGZyYW1lcyAtLSBhbmQgbm90IGp1c3QgdGhlIGN1cnJl
bnQgaW5saW5lIHN0YWNrIC0tCisgICAgLy8gYmVjYXVzZSB3ZSBkb24ndCBrbm93IHdoaWNoIGlu
bGluZWQgZnVuY3Rpb24gb3ducyB0aGUgdmFsdWUgcHJvZmlsZSB0aGF0CisgICAgLy8gd2UnbGwg
dXBkYXRlIHdoZW4gd2UgZXhpdC4gSW4gdGhlIGNhc2Ugb2YgImYoKSB7IGEoKTsgYigpOyB9Iiwg
aWYgYm90aAorICAgIC8vIGEgYW5kIGIgYXJlIGlubGluZWQsIHdlIG1pZ2h0IGV4aXQgaW5zaWRl
IGIgZHVlIHRvIGEgYmFkIHZhbHVlIGxvYWRlZAorICAgIC8vIGZyb20gYS4KKyAgICAvLyBGSVhN
RTogTWV0aG9kT2ZHZXR0aW5nQVZhbHVlUHJvZmlsZSBzaG91bGQgcmVtZW1iZXIgd2hpY2ggQ29k
ZUJsb2NrIG93bnMKKyAgICAvLyB0aGUgdmFsdWUgcHJvZmlsZS4KKyAgICBJbmxpbmVDYWxsRnJh
bWVTZXQqIGlubGluZUNhbGxGcmFtZXMgPSBjb2RlQmxvY2stPmppdENvZGUoKS0+ZGZnQ29tbW9u
KCktPmlubGluZUNhbGxGcmFtZXMuZ2V0KCk7CisgICAgaWYgKGlubGluZUNhbGxGcmFtZXMpIHsK
KyAgICAgICAgZm9yIChJbmxpbmVDYWxsRnJhbWUqIGlubGluZUNhbGxGcmFtZSA6ICppbmxpbmVD
YWxsRnJhbWVzKQorICAgICAgICAgICAgdm0uaGVhcC53cml0ZUJhcnJpZXIoaW5saW5lQ2FsbEZy
YW1lLT5iYXNlbGluZUNvZGVCbG9jay5nZXQoKSk7CisgICAgfQorCisgICAgaWYgKGV4aXQubV9j
b2RlT3JpZ2luLmlubGluZUNhbGxGcmFtZSkKKyAgICAgICAgY29udGV4dC5mcCgpID0gY29udGV4
dC5mcDx1aW50OF90Kj4oKSArIGV4aXQubV9jb2RlT3JpZ2luLmlubGluZUNhbGxGcmFtZS0+c3Rh
Y2tPZmZzZXQgKiBzaXplb2YoRW5jb2RlZEpTVmFsdWUpOworCisgICAgdm9pZCoganVtcFRhcmdl
dCA9IGV4aXRTdGF0ZS0+anVtcFRhcmdldDsKKyAgICBBU1NFUlQoanVtcFRhcmdldCk7CisKKyAg
ICBpZiAoZXhpdC5pc0V4Y2VwdGlvbkhhbmRsZXIoKSkgeworICAgICAgICAvLyBTaW5jZSB3ZSdy
ZSBqdW1waW5nIHRvIG9wX2NhdGNoLCB3ZSBuZWVkIHRvIHNldCBjYWxsRnJhbWVGb3JDYXRjaC4K
KyAgICAgICAgdm0uY2FsbEZyYW1lRm9yQ2F0Y2ggPSBjb250ZXh0LmZwPEV4ZWNTdGF0ZSo+KCk7
CisgICAgfQorCisgICAgdm0udG9wQ2FsbEZyYW1lID0gY29udGV4dC5mcDxFeGVjU3RhdGUqPigp
OworICAgIGNvbnRleHQucGMoKSA9IGp1bXBUYXJnZXQ7Cit9CisKK3N0YXRpYyB2b2lkIHByaW50
T1NSRXhpdChDb250ZXh0JiBjb250ZXh0LCB1aW50MzJfdCBvc3JFeGl0SW5kZXgsIGNvbnN0IE9T
UkV4aXQmIGV4aXQpCit7CisgICAgRXhlY1N0YXRlKiBleGVjID0gY29udGV4dC5mcDxFeGVjU3Rh
dGUqPigpOworICAgIENvZGVCbG9jayogY29kZUJsb2NrID0gZXhlYy0+Y29kZUJsb2NrKCk7Cisg
ICAgQ29kZUJsb2NrKiBhbHRlcm5hdGl2ZSA9IGNvZGVCbG9jay0+YWx0ZXJuYXRpdmUoKTsKKyAg
ICBFeGl0S2luZCBraW5kID0gZXhpdC5tX2tpbmQ7CisgICAgdW5zaWduZWQgYnl0ZWNvZGVPZmZz
ZXQgPSBleGl0Lm1fY29kZU9yaWdpbi5ieXRlY29kZUluZGV4OworCisgICAgZGF0YUxvZygiU3Bl
Y3VsYXRpb24gZmFpbHVyZSBpbiAiLCAqY29kZUJsb2NrKTsKKyAgICBkYXRhTG9nKCIgQCBleGl0
ICMiLCBvc3JFeGl0SW5kZXgsICIgKGJjIyIsIGJ5dGVjb2RlT2Zmc2V0LCAiLCAiLCBleGl0S2lu
ZFRvU3RyaW5nKGtpbmQpLCAiKSB3aXRoICIpOworICAgIGlmIChhbHRlcm5hdGl2ZSkgeworICAg
ICAgICBkYXRhTG9nKAorICAgICAgICAgICAgImV4ZWN1dGVDb3VudGVyID0gIiwgYWx0ZXJuYXRp
dmUtPmppdEV4ZWN1dGVDb3VudGVyKCksCisgICAgICAgICAgICAiLCByZW9wdGltaXphdGlvblJl
dHJ5Q291bnRlciA9ICIsIGFsdGVybmF0aXZlLT5yZW9wdGltaXphdGlvblJldHJ5Q291bnRlcigp
LAorICAgICAgICAgICAgIiwgb3B0aW1pemF0aW9uRGVsYXlDb3VudGVyID0gIiwgYWx0ZXJuYXRp
dmUtPm9wdGltaXphdGlvbkRlbGF5Q291bnRlcigpKTsKKyAgICB9IGVsc2UKKyAgICAgICAgZGF0
YUxvZygibm8gYWx0ZXJuYXRpdmUgY29kZSBibG9jayAoaS5lLiB3ZSd2ZSBiZWVuIGpldHRpc29u
ZWQpIik7CisgICAgZGF0YUxvZygiLCBvc3JFeGl0Q291bnRlciA9ICIsIGNvZGVCbG9jay0+b3Ny
RXhpdENvdW50ZXIoKSwgIlxuIik7CisgICAgZGF0YUxvZygiICAgIEdQUnMgYXQgdGltZSBvZiBl
eGl0OiIpOworICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBHUFJJbmZvOjpudW1iZXJPZlJl
Z2lzdGVyczsgKytpKSB7CisgICAgICAgIEdQUlJlZyBncHIgPSBHUFJJbmZvOjp0b1JlZ2lzdGVy
KGkpOworICAgICAgICBkYXRhTG9nKCIgIiwgY29udGV4dC5ncHJOYW1lKGdwciksICI6IiwgUmF3
UG9pbnRlcihjb250ZXh0Lmdwcjx2b2lkKj4oZ3ByKSkpOworICAgIH0KKyAgICBkYXRhTG9nKCJc
biIpOworICAgIGRhdGFMb2coIiAgICBGUFJzIGF0IHRpbWUgb2YgZXhpdDoiKTsKKyAgICBmb3Ig
KHVuc2lnbmVkIGkgPSAwOyBpIDwgRlBSSW5mbzo6bnVtYmVyT2ZSZWdpc3RlcnM7ICsraSkgewor
ICAgICAgICBGUFJSZWcgZnByID0gRlBSSW5mbzo6dG9SZWdpc3RlcihpKTsKKyAgICAgICAgZGF0
YUxvZygiICIsIGNvbnRleHQuZnByTmFtZShmcHIpLCAiOiIpOworICAgICAgICB1aW50NjRfdCBi
aXRzID0gY29udGV4dC5mcHI8dWludDY0X3Q+KGZwcik7CisgICAgICAgIGRvdWJsZSB2YWx1ZSA9
IGNvbnRleHQuZnByKGZwcik7CisgICAgICAgIGRhdGFMb2dGKCIlbGx4OiVsZiIsIHN0YXRpY19j
YXN0PGxvbmcgbG9uZz4oYml0cyksIHZhbHVlKTsKKyAgICB9CisgICAgZGF0YUxvZygiXG4iKTsK
K30KKworLy8gSklUIGJhc2VkIE9TUiBFeGl0LgorCiBPU1JFeGl0OjpPU1JFeGl0KEV4aXRLaW5k
IGtpbmQsIEpTVmFsdWVTb3VyY2UganNWYWx1ZVNvdXJjZSwgTWV0aG9kT2ZHZXR0aW5nQVZhbHVl
UHJvZmlsZSB2YWx1ZVByb2ZpbGUsIFNwZWN1bGF0aXZlSklUKiBqaXQsIHVuc2lnbmVkIHN0cmVh
bUluZGV4LCB1bnNpZ25lZCByZWNvdmVyeUluZGV4KQogICAgIDogT1NSRXhpdEJhc2Uoa2luZCwg
aml0LT5tX29yaWdpbi5mb3JFeGl0LCBqaXQtPm1fb3JpZ2luLnNlbWFudGljLCBqaXQtPm1fb3Jp
Z2luLndhc0hvaXN0ZWQpCiAgICAgLCBtX2pzVmFsdWVTb3VyY2UoanNWYWx1ZVNvdXJjZSkKSW5k
ZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9kZmcvREZHT1NSRXhpdC5oCj09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0t
IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9kZmcvREZHT1NSRXhpdC5oCShyZXZpc2lvbiAyMjI4NzAp
CisrKyBTb3VyY2UvSmF2YVNjcmlwdENvcmUvZGZnL0RGR09TUkV4aXQuaAkod29ya2luZyBjb3B5
KQpAQCAtMjgsMTYgKzI4LDI3IEBACiAjaWYgRU5BQkxFKERGR19KSVQpCiAKICNpbmNsdWRlICJE
RkdPU1JFeGl0QmFzZS5oIgorI2luY2x1ZGUgIkRGR1ZhcmlhYmxlRXZlbnRTdHJlYW0uaCIKICNp
bmNsdWRlICJHUFJJbmZvLmgiCiAjaW5jbHVkZSAiTWFjcm9Bc3NlbWJsZXIuaCIKICNpbmNsdWRl
ICJNZXRob2RPZkdldHRpbmdBVmFsdWVQcm9maWxlLmgiCiAjaW5jbHVkZSAiT3BlcmFuZHMuaCIK
ICNpbmNsdWRlICJWYWx1ZVJlY292ZXJ5LmgiCisjaW5jbHVkZSA8d3RmL1JlZlB0ci5oPgogCiBu
YW1lc3BhY2UgSlNDIHsKIAorY2xhc3MgQXJyYXlQcm9maWxlOwogY2xhc3MgQ0NhbGxIZWxwZXJz
OwogCituYW1lc3BhY2UgUHJvYmUgeworY2xhc3MgQ29udGV4dDsKK30gLy8gbmFtZXNwYWNlIFBy
b2JlCisKK25hbWVzcGFjZSBQcm9maWxlciB7CitjbGFzcyBPU1JFeGl0OworfSAvLyBuYW1lc3Bh
Y2UgUHJvZmlsZXIKKwogbmFtZXNwYWNlIERGRyB7CiAKIGNsYXNzIFNwZWN1bGF0aXZlSklUOwpA
QCAtOTEsNiArMTAyLDM5IEBAIHByaXZhdGU6CiAgICAgU3BlY3VsYXRpb25SZWNvdmVyeVR5cGUg
bV90eXBlOwogfTsKIAorZW51bSBjbGFzcyBFeHRyYUluaXRpYWxpemF0aW9uTGV2ZWw7CisKK3N0
cnVjdCBPU1JFeGl0U3RhdGUgOiBSZWZDb3VudGVkPE9TUkV4aXRTdGF0ZT4geworICAgIE9TUkV4
aXRTdGF0ZShPU1JFeGl0QmFzZSYgZXhpdCwgQ29kZUJsb2NrKiBjb2RlQmxvY2ssIENvZGVCbG9j
ayogYmFzZWxpbmVDb2RlQmxvY2ssIE9wZXJhbmRzPFZhbHVlUmVjb3Zlcnk+JiBvcGVyYW5kcywg
VmVjdG9yPFVuZGVmaW5lZE9wZXJhbmRTcGFuPiYmIHVuZGVmaW5lZE9wZXJhbmRTcGFucywgU3Bl
Y3VsYXRpb25SZWNvdmVyeSogcmVjb3ZlcnksIHB0cmRpZmZfdCBzdGFja1BvaW50ZXJPZmZzZXQs
IGludDMyX3QgYWN0aXZlVGhyZXNob2xkLCBkb3VibGUgbWVtb3J5VXNhZ2VBZGp1c3RlZFRocmVz
aG9sZCwgdm9pZCoganVtcFRhcmdldCwgQXJyYXlQcm9maWxlKiBhcnJheVByb2ZpbGUpCisgICAg
ICAgIDogZXhpdChleGl0KQorICAgICAgICAsIGNvZGVCbG9jayhjb2RlQmxvY2spCisgICAgICAg
ICwgYmFzZWxpbmVDb2RlQmxvY2soYmFzZWxpbmVDb2RlQmxvY2spCisgICAgICAgICwgb3BlcmFu
ZHMob3BlcmFuZHMpCisgICAgICAgICwgdW5kZWZpbmVkT3BlcmFuZFNwYW5zKHVuZGVmaW5lZE9w
ZXJhbmRTcGFucykKKyAgICAgICAgLCByZWNvdmVyeShyZWNvdmVyeSkKKyAgICAgICAgLCBzdGFj
a1BvaW50ZXJPZmZzZXQoc3RhY2tQb2ludGVyT2Zmc2V0KQorICAgICAgICAsIGFjdGl2ZVRocmVz
aG9sZChhY3RpdmVUaHJlc2hvbGQpCisgICAgICAgICwgbWVtb3J5VXNhZ2VBZGp1c3RlZFRocmVz
aG9sZChtZW1vcnlVc2FnZUFkanVzdGVkVGhyZXNob2xkKQorICAgICAgICAsIGp1bXBUYXJnZXQo
anVtcFRhcmdldCkKKyAgICAgICAgLCBhcnJheVByb2ZpbGUoYXJyYXlQcm9maWxlKQorICAgIHsg
fQorCisgICAgT1NSRXhpdEJhc2UmIGV4aXQ7CisgICAgQ29kZUJsb2NrKiBjb2RlQmxvY2s7Cisg
ICAgQ29kZUJsb2NrKiBiYXNlbGluZUNvZGVCbG9jazsKKyAgICBPcGVyYW5kczxWYWx1ZVJlY292
ZXJ5PiBvcGVyYW5kczsKKyAgICBWZWN0b3I8VW5kZWZpbmVkT3BlcmFuZFNwYW4+IHVuZGVmaW5l
ZE9wZXJhbmRTcGFuczsKKyAgICBTcGVjdWxhdGlvblJlY292ZXJ5KiByZWNvdmVyeTsKKyAgICBw
dHJkaWZmX3Qgc3RhY2tQb2ludGVyT2Zmc2V0OworICAgIHVpbnQzMl90IGFjdGl2ZVRocmVzaG9s
ZDsKKyAgICBkb3VibGUgbWVtb3J5VXNhZ2VBZGp1c3RlZFRocmVzaG9sZDsKKyAgICB2b2lkKiBq
dW1wVGFyZ2V0OworICAgIEFycmF5UHJvZmlsZSogYXJyYXlQcm9maWxlOworCisgICAgRXh0cmFJ
bml0aWFsaXphdGlvbkxldmVsIGV4dHJhSW5pdGlhbGl6YXRpb25MZXZlbDsKKyAgICBQcm9maWxl
cjo6T1NSRXhpdCogcHJvZmlsZXJFeGl0IHsgbnVsbHB0ciB9OworfTsKKwogLy8gPT09IE9TUkV4
aXQgPT09CiAvLwogLy8gVGhpcyBzdHJ1Y3R1cmUgZGVzY3JpYmVzIGhvdyB0byBleGl0IHRoZSBz
cGVjdWxhdGl2ZSBwYXRoIGJ5CkBAIC05OSwxMCArMTQzLDEzIEBAIHN0cnVjdCBPU1JFeGl0IDog
cHVibGljIE9TUkV4aXRCYXNlIHsKICAgICBPU1JFeGl0KEV4aXRLaW5kLCBKU1ZhbHVlU291cmNl
LCBNZXRob2RPZkdldHRpbmdBVmFsdWVQcm9maWxlLCBTcGVjdWxhdGl2ZUpJVCosIHVuc2lnbmVk
IHN0cmVhbUluZGV4LCB1bnNpZ25lZCByZWNvdmVyeUluZGV4ID0gVUlOVF9NQVgpOwogCiAgICAg
c3RhdGljIHZvaWQgSklUX09QRVJBVElPTiBjb21waWxlT1NSRXhpdChFeGVjU3RhdGUqKSBXVEZf
SU5URVJOQUw7CisgICAgc3RhdGljIHZvaWQgZXhlY3V0ZU9TUkV4aXQoUHJvYmU6OkNvbnRleHQm
KTsKIAogICAgIHVuc2lnbmVkIG1fcGF0Y2hhYmxlQ29kZU9mZnNldCB7IDAgfTsKICAgICAKICAg
ICBNYWNyb0Fzc2VtYmxlckNvZGVSZWYgbV9jb2RlOworCisgICAgUmVmUHRyPE9TUkV4aXRTdGF0
ZT4gZXhpdFN0YXRlOwogICAgIAogICAgIEpTVmFsdWVTb3VyY2UgbV9qc1ZhbHVlU291cmNlOwog
ICAgIE1ldGhvZE9mR2V0dGluZ0FWYWx1ZVByb2ZpbGUgbV92YWx1ZVByb2ZpbGU7CkluZGV4OiBT
b3VyY2UvSmF2YVNjcmlwdENvcmUvZGZnL0RGR1RodW5rcy5jcHAKPT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291
cmNlL0phdmFTY3JpcHRDb3JlL2RmZy9ERkdUaHVua3MuY3BwCShyZXZpc2lvbiAyMjI4NzApCisr
KyBTb3VyY2UvSmF2YVNjcmlwdENvcmUvZGZnL0RGR1RodW5rcy5jcHAJKHdvcmtpbmcgY29weSkK
QEAgLTQwLDYgKzQwLDE0IEBACiAKIG5hbWVzcGFjZSBKU0MgeyBuYW1lc3BhY2UgREZHIHsKIAor
TWFjcm9Bc3NlbWJsZXJDb2RlUmVmIG9zckV4aXRUaHVua0dlbmVyYXRvcihWTSogdm0pCit7Cisg
ICAgTWFjcm9Bc3NlbWJsZXIgaml0OworICAgIGppdC5wcm9iZShPU1JFeGl0OjpleGVjdXRlT1NS
RXhpdCwgdm0pOworICAgIExpbmtCdWZmZXIgcGF0Y2hCdWZmZXIoaml0LCBHTE9CQUxfVEhVTktf
SUQpOworICAgIHJldHVybiBGSU5BTElaRV9DT0RFKHBhdGNoQnVmZmVyLCAoIkRGRyBPU1IgZXhp
dCB0aHVuayIpKTsKK30KKwogTWFjcm9Bc3NlbWJsZXJDb2RlUmVmIG9zckV4aXRHZW5lcmF0aW9u
VGh1bmtHZW5lcmF0b3IoVk0qIHZtKQogewogICAgIE1hY3JvQXNzZW1ibGVyIGppdDsKSW5kZXg6
IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9kZmcvREZHVGh1bmtzLmgKPT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291
cmNlL0phdmFTY3JpcHRDb3JlL2RmZy9ERkdUaHVua3MuaAkocmV2aXNpb24gMjIyODcwKQorKysg
U291cmNlL0phdmFTY3JpcHRDb3JlL2RmZy9ERkdUaHVua3MuaAkod29ya2luZyBjb3B5KQpAQCAt
MSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEsIDIwMTQgQXBwbGUgSW5jLiBB
bGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChDKSAyMDExLTIwMTcgQXBwbGUgSW5j
LiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICoKICAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4g
c291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAogICogbW9kaWZpY2F0aW9u
LCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCkBA
IC0zNSw2ICszNSw3IEBAIGNsYXNzIFZNOwogCiBuYW1lc3BhY2UgREZHIHsKIAorTWFjcm9Bc3Nl
bWJsZXJDb2RlUmVmIG9zckV4aXRUaHVua0dlbmVyYXRvcihWTSopOwogTWFjcm9Bc3NlbWJsZXJD
b2RlUmVmIG9zckV4aXRHZW5lcmF0aW9uVGh1bmtHZW5lcmF0b3IoVk0qKTsKIE1hY3JvQXNzZW1i
bGVyQ29kZVJlZiBvc3JFbnRyeVRodW5rR2VuZXJhdG9yKFZNKik7CiAKSW5kZXg6IFNvdXJjZS9K
YXZhU2NyaXB0Q29yZS9kZmcvREZHVmFyaWFibGVFdmVudFN0cmVhbS5jcHAKPT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQot
LS0gU291cmNlL0phdmFTY3JpcHRDb3JlL2RmZy9ERkdWYXJpYWJsZUV2ZW50U3RyZWFtLmNwcAko
cmV2aXNpb24gMjIyODcwKQorKysgU291cmNlL0phdmFTY3JpcHRDb3JlL2RmZy9ERkdWYXJpYWJs
ZUV2ZW50U3RyZWFtLmNwcAkod29ya2luZyBjb3B5KQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBD
b3B5cmlnaHQgKEMpIDIwMTItMjAxNSBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisg
KiBDb3B5cmlnaHQgKEMpIDIwMTItMjAxNyBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQu
CiAgKgogICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jt
cywgd2l0aCBvciB3aXRob3V0CiAgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlk
ZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKQEAgLTkxLDcgKzkxLDcgQEAgc3RydWN0
IE1pbmlmaWVkR2VuZXJhdGlvbkluZm8gewogCiB9IC8vIG5hbWVzcGFjZQogCi1ib29sIFZhcmlh
YmxlRXZlbnRTdHJlYW06OnRyeVRvU2V0Q29uc3RhbnRSZWNvdmVyeShWYWx1ZVJlY292ZXJ5JiBy
ZWNvdmVyeSwgTWluaWZpZWROb2RlKiBub2RlKSBjb25zdAorc3RhdGljIGJvb2wgdHJ5VG9TZXRD
b25zdGFudFJlY292ZXJ5KFZhbHVlUmVjb3ZlcnkmIHJlY292ZXJ5LCBNaW5pZmllZE5vZGUqIG5v
ZGUpCiB7CiAgICAgaWYgKCFub2RlKQogICAgICAgICByZXR1cm4gZmFsc2U7CkBAIC0xMTQsMTQg
KzExNCwzOSBAQCBib29sIFZhcmlhYmxlRXZlbnRTdHJlYW06OnRyeVRvU2V0Q29uc3RhCiAgICAg
cmV0dXJuIGZhbHNlOwogfQogCi12b2lkIFZhcmlhYmxlRXZlbnRTdHJlYW06OnJlY29uc3RydWN0
KAordGVtcGxhdGU8VmFyaWFibGVFdmVudFN0cmVhbTo6UmVjb25zdHJ1Y3Rpb25TdHlsZSBzdHls
ZT4KK3Vuc2lnbmVkIFZhcmlhYmxlRXZlbnRTdHJlYW06OnJlY29uc3RydWN0KAogICAgIENvZGVC
bG9jayogY29kZUJsb2NrLCBDb2RlT3JpZ2luIGNvZGVPcmlnaW4sIE1pbmlmaWVkR3JhcGgmIGdy
YXBoLAotICAgIHVuc2lnbmVkIGluZGV4LCBPcGVyYW5kczxWYWx1ZVJlY292ZXJ5PiYgdmFsdWVS
ZWNvdmVyaWVzKSBjb25zdAorICAgIHVuc2lnbmVkIGluZGV4LCBPcGVyYW5kczxWYWx1ZVJlY292
ZXJ5PiYgdmFsdWVSZWNvdmVyaWVzLCBWZWN0b3I8VW5kZWZpbmVkT3BlcmFuZFNwYW4+KiB1bmRl
ZmluZWRPcGVyYW5kU3BhbnMpIGNvbnN0CiB7CiAgICAgQVNTRVJUKGNvZGVCbG9jay0+aml0VHlw
ZSgpID09IEpJVENvZGU6OkRGR0pJVCk7CiAgICAgQ29kZUJsb2NrKiBiYXNlbGluZUNvZGVCbG9j
ayA9IGNvZGVCbG9jay0+YmFzZWxpbmVWZXJzaW9uKCk7Ci0gICAgCisKICAgICB1bnNpZ25lZCBu
dW1WYXJpYWJsZXM7CisgICAgc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludmFsaWRJbmRleCA9IHN0
ZDo6bnVtZXJpY19saW1pdHM8dW5zaWduZWQ+OjptYXgoKTsKKyAgICB1bnNpZ25lZCBmaXJzdFVu
ZGVmaW5lZCA9IGludmFsaWRJbmRleDsKKyAgICBib29sIGZpcnN0VW5kZWZpbmVkSXNBcmd1bWVu
dCA9IGZhbHNlOworCisgICAgYXV0byBmbHVzaFVuZGVmaW5lZE9wZXJhbmRTcGFuID0gWyZdICh1
bnNpZ25lZCBpKSB7CisgICAgICAgIGlmIChmaXJzdFVuZGVmaW5lZCA9PSBpbnZhbGlkSW5kZXgp
CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIGludCBmaXJzdE9mZnNldCA9IHZhbHVlUmVj
b3Zlcmllcy52aXJ0dWFsUmVnaXN0ZXJGb3JJbmRleChmaXJzdFVuZGVmaW5lZCkub2Zmc2V0KCk7
CisgICAgICAgIGludCBsYXN0T2Zmc2V0ID0gdmFsdWVSZWNvdmVyaWVzLnZpcnR1YWxSZWdpc3Rl
ckZvckluZGV4KGkgLSAxKS5vZmZzZXQoKTsKKyAgICAgICAgaW50IG1pbk9mZnNldCA9IHN0ZDo6
bWluKGZpcnN0T2Zmc2V0LCBsYXN0T2Zmc2V0KTsKKyAgICAgICAgdW5kZWZpbmVkT3BlcmFuZFNw
YW5zLT5hcHBlbmQoeyBmaXJzdFVuZGVmaW5lZCwgbWluT2Zmc2V0LCBpIC0gZmlyc3RVbmRlZmlu
ZWQgfSk7CisgICAgICAgIGZpcnN0VW5kZWZpbmVkID0gaW52YWxpZEluZGV4OworICAgIH07Cisg
ICAgYXV0byByZWNvcmRVbmRlZmluZWRPcGVyYW5kID0gWyZdICh1bnNpZ25lZCBpKSB7CisgICAg
ICAgIC8vIFdlIHdhbnQgdG8gc2VwYXJhdGUgdGhlIHNwYW4gb2YgYXJndW1lbnRzIGZyb20gdGhl
IHNwYW4gb2YgbG9jYWxzIGV2ZW4gaWYgdGhleSBoYXZlIGFkamFjZW50IG9wZXJhbmRzIGluZGV4
ZXMuCisgICAgICAgIGlmIChmaXJzdFVuZGVmaW5lZCAhPSBpbnZhbGlkSW5kZXggJiYgZmlyc3RV
bmRlZmluZWRJc0FyZ3VtZW50ICE9IHZhbHVlUmVjb3Zlcmllcy5pc0FyZ3VtZW50KGkpKQorICAg
ICAgICAgICAgZmx1c2hVbmRlZmluZWRPcGVyYW5kU3BhbihpKTsKKworICAgICAgICBpZiAoZmly
c3RVbmRlZmluZWQgPT0gaW52YWxpZEluZGV4KSB7CisgICAgICAgICAgICBmaXJzdFVuZGVmaW5l
ZCA9IGk7CisgICAgICAgICAgICBmaXJzdFVuZGVmaW5lZElzQXJndW1lbnQgPSB2YWx1ZVJlY292
ZXJpZXMuaXNBcmd1bWVudChpKTsKKyAgICAgICAgfQorICAgIH07CisKICAgICBpZiAoY29kZU9y
aWdpbi5pbmxpbmVDYWxsRnJhbWUpCiAgICAgICAgIG51bVZhcmlhYmxlcyA9IGJhc2VsaW5lQ29k
ZUJsb2NrRm9ySW5saW5lQ2FsbEZyYW1lKGNvZGVPcmlnaW4uaW5saW5lQ2FsbEZyYW1lKS0+bV9u
dW1DYWxsZWVMb2NhbHMgKyBWaXJ0dWFsUmVnaXN0ZXIoY29kZU9yaWdpbi5pbmxpbmVDYWxsRnJh
bWUtPnN0YWNrT2Zmc2V0KS50b0xvY2FsKCkgKyAxOwogICAgIGVsc2UKQEAgLTEzNiw3ICsxNjEs
NyBAQCB2b2lkIFZhcmlhYmxlRXZlbnRTdHJlYW06OnJlY29uc3RydWN0KAogICAgICAgICAgICAg
dmFsdWVSZWNvdmVyaWVzW2ldID0gVmFsdWVSZWNvdmVyeTo6ZGlzcGxhY2VkSW5KU1N0YWNrKAog
ICAgICAgICAgICAgICAgIFZpcnR1YWxSZWdpc3Rlcih2YWx1ZVJlY292ZXJpZXMub3BlcmFuZEZv
ckluZGV4KGkpKSwgRGF0YUZvcm1hdEpTKTsKICAgICAgICAgfQotICAgICAgICByZXR1cm47Cisg
ICAgICAgIHJldHVybiBudW1WYXJpYWJsZXM7CiAgICAgfQogICAgIAogICAgIC8vIFN0ZXAgMTog
RmluZCB0aGUgbGFzdCBjaGVja3BvaW50LCBhbmQgZmlndXJlIG91dCB0aGUgbnVtYmVyIG9mIHZp
cnR1YWwgcmVnaXN0ZXJzIGFzIHdlIGdvLgpAQCAtMTkxLDYgKzIxNiwxMiBAQCB2b2lkIFZhcmlh
YmxlRXZlbnRTdHJlYW06OnJlY29uc3RydWN0KAogICAgICAgICBWYWx1ZVNvdXJjZSYgc291cmNl
ID0gb3BlcmFuZFNvdXJjZXNbaV07CiAgICAgICAgIGlmIChzb3VyY2UuaXNUcml2aWFsbHlSZWNv
dmVyYWJsZSgpKSB7CiAgICAgICAgICAgICB2YWx1ZVJlY292ZXJpZXNbaV0gPSBzb3VyY2UudmFs
dWVSZWNvdmVyeSgpOworICAgICAgICAgICAgaWYgKHN0eWxlID09IFJlY29uc3RydWN0aW9uU3R5
bGU6OlNlcGFyYXRlZCkgeworICAgICAgICAgICAgICAgIGlmICh2YWx1ZVJlY292ZXJpZXNbaV0u
aXNDb25zdGFudCgpICYmIHZhbHVlUmVjb3Zlcmllc1tpXS5jb25zdGFudCgpID09IGpzVW5kZWZp
bmVkKCkpCisgICAgICAgICAgICAgICAgICAgIHJlY29yZFVuZGVmaW5lZE9wZXJhbmQoaSk7Cisg
ICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICBmbHVzaFVuZGVmaW5lZE9w
ZXJhbmRTcGFuKGkpOworICAgICAgICAgICAgfQogICAgICAgICAgICAgY29udGludWU7CiAgICAg
ICAgIH0KICAgICAgICAgCkBAIC0xOTksMTQgKzIzMCwyNSBAQCB2b2lkIFZhcmlhYmxlRXZlbnRT
dHJlYW06OnJlY29uc3RydWN0KAogICAgICAgICBNaW5pZmllZEdlbmVyYXRpb25JbmZvIGluZm8g
PSBnZW5lcmF0aW9uSW5mb3MuZ2V0KHNvdXJjZS5pZCgpKTsKICAgICAgICAgaWYgKCFpbmZvLmFs
aXZlKSB7CiAgICAgICAgICAgICB2YWx1ZVJlY292ZXJpZXNbaV0gPSBWYWx1ZVJlY292ZXJ5Ojpj
b25zdGFudChqc1VuZGVmaW5lZCgpKTsKKyAgICAgICAgICAgIGlmIChzdHlsZSA9PSBSZWNvbnN0
cnVjdGlvblN0eWxlOjpTZXBhcmF0ZWQpCisgICAgICAgICAgICAgICAgcmVjb3JkVW5kZWZpbmVk
T3BlcmFuZChpKTsKICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICB9CiAKLSAgICAgICAg
aWYgKHRyeVRvU2V0Q29uc3RhbnRSZWNvdmVyeSh2YWx1ZVJlY292ZXJpZXNbaV0sIG5vZGUpKQor
ICAgICAgICBpZiAodHJ5VG9TZXRDb25zdGFudFJlY292ZXJ5KHZhbHVlUmVjb3Zlcmllc1tpXSwg
bm9kZSkpIHsKKyAgICAgICAgICAgIGlmIChzdHlsZSA9PSBSZWNvbnN0cnVjdGlvblN0eWxlOjpT
ZXBhcmF0ZWQpIHsKKyAgICAgICAgICAgICAgICBpZiAobm9kZS0+aGFzQ29uc3RhbnQoKSAmJiBu
b2RlLT5jb25zdGFudCgpID09IGpzVW5kZWZpbmVkKCkpCisgICAgICAgICAgICAgICAgICAgIHJl
Y29yZFVuZGVmaW5lZE9wZXJhbmQoaSk7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAg
ICAgICAgICAgICBmbHVzaFVuZGVmaW5lZE9wZXJhbmRTcGFuKGkpOworICAgICAgICAgICAgfQog
ICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KICAgICAgICAgCiAgICAgICAgIEFTU0VS
VChpbmZvLmZvcm1hdCAhPSBEYXRhRm9ybWF0Tm9uZSk7Ci0gICAgICAgIAorICAgICAgICBpZiAo
c3R5bGUgPT0gUmVjb25zdHJ1Y3Rpb25TdHlsZTo6U2VwYXJhdGVkKQorICAgICAgICAgICAgZmx1
c2hVbmRlZmluZWRPcGVyYW5kU3BhbihpKTsKKwogICAgICAgICBpZiAoaW5mby5maWxsZWQpIHsK
ICAgICAgICAgICAgIGlmIChpbmZvLmZvcm1hdCA9PSBEYXRhRm9ybWF0RG91YmxlKSB7CiAgICAg
ICAgICAgICAgICAgdmFsdWVSZWNvdmVyaWVzW2ldID0gVmFsdWVSZWNvdmVyeTo6aW5GUFIoaW5m
by51LmZwciwgRGF0YUZvcm1hdERvdWJsZSk7CkBAIC0yMjUsNiArMjY3LDI0IEBAIHZvaWQgVmFy
aWFibGVFdmVudFN0cmVhbTo6cmVjb25zdHJ1Y3QoCiAgICAgICAgIHZhbHVlUmVjb3Zlcmllc1tp
XSA9CiAgICAgICAgICAgICBWYWx1ZVJlY292ZXJ5OjpkaXNwbGFjZWRJbkpTU3RhY2soc3RhdGlj
X2Nhc3Q8VmlydHVhbFJlZ2lzdGVyPihpbmZvLnUudmlydHVhbFJlZyksIGluZm8uZm9ybWF0KTsK
ICAgICB9CisgICAgaWYgKHN0eWxlID09IFJlY29uc3RydWN0aW9uU3R5bGU6OlNlcGFyYXRlZCkK
KyAgICAgICAgZmx1c2hVbmRlZmluZWRPcGVyYW5kU3BhbihvcGVyYW5kU291cmNlcy5zaXplKCkp
OworCisgICAgcmV0dXJuIG51bVZhcmlhYmxlczsKK30KKwordW5zaWduZWQgVmFyaWFibGVFdmVu
dFN0cmVhbTo6cmVjb25zdHJ1Y3QoCisgICAgQ29kZUJsb2NrKiBjb2RlQmxvY2ssIENvZGVPcmln
aW4gY29kZU9yaWdpbiwgTWluaWZpZWRHcmFwaCYgZ3JhcGgsCisgICAgdW5zaWduZWQgaW5kZXgs
IE9wZXJhbmRzPFZhbHVlUmVjb3Zlcnk+JiB2YWx1ZVJlY292ZXJpZXMpIGNvbnN0Cit7CisgICAg
cmV0dXJuIHJlY29uc3RydWN0PFJlY29uc3RydWN0aW9uU3R5bGU6OkNvbWJpbmVkPihjb2RlQmxv
Y2ssIGNvZGVPcmlnaW4sIGdyYXBoLCBpbmRleCwgdmFsdWVSZWNvdmVyaWVzLCBudWxscHRyKTsK
K30KKwordW5zaWduZWQgVmFyaWFibGVFdmVudFN0cmVhbTo6cmVjb25zdHJ1Y3QoCisgICAgQ29k
ZUJsb2NrKiBjb2RlQmxvY2ssIENvZGVPcmlnaW4gY29kZU9yaWdpbiwgTWluaWZpZWRHcmFwaCYg
Z3JhcGgsCisgICAgdW5zaWduZWQgaW5kZXgsIE9wZXJhbmRzPFZhbHVlUmVjb3Zlcnk+JiB2YWx1
ZVJlY292ZXJpZXMsIFZlY3RvcjxVbmRlZmluZWRPcGVyYW5kU3Bhbj4qIHVuZGVmaW5lZE9wZXJh
bmRTcGFucykgY29uc3QKK3sKKyAgICByZXR1cm4gcmVjb25zdHJ1Y3Q8UmVjb25zdHJ1Y3Rpb25T
dHlsZTo6U2VwYXJhdGVkPihjb2RlQmxvY2ssIGNvZGVPcmlnaW4sIGdyYXBoLCBpbmRleCwgdmFs
dWVSZWNvdmVyaWVzLCB1bmRlZmluZWRPcGVyYW5kU3BhbnMpOwogfQogCiB9IH0gLy8gbmFtZXNw
YWNlIEpTQzo6REZHCkluZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUvZGZnL0RGR1ZhcmlhYmxl
RXZlbnRTdHJlYW0uaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvZGZnL0RG
R1ZhcmlhYmxlRXZlbnRTdHJlYW0uaAkocmV2aXNpb24gMjIyODcwKQorKysgU291cmNlL0phdmFT
Y3JpcHRDb3JlL2RmZy9ERkdWYXJpYWJsZUV2ZW50U3RyZWFtLmgJKHdvcmtpbmcgY29weSkKQEAg
LTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IChDKSAyMDEyLCAyMDE0IEFwcGxlIEluYy4g
QWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoQykgMjAxMi0yMDE3IEFwcGxlIElu
Yy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqCiAgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGlu
IHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKICAqIG1vZGlmaWNhdGlv
biwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwpA
QCAtMzUsNiArMzUsMTIgQEAKIAogbmFtZXNwYWNlIEpTQyB7IG5hbWVzcGFjZSBERkcgewogCitz
dHJ1Y3QgVW5kZWZpbmVkT3BlcmFuZFNwYW4geworICAgIHVuc2lnbmVkIGZpcnN0SW5kZXg7Cisg
ICAgaW50IG1pbk9mZnNldDsKKyAgICB1bnNpZ25lZCBudW1iZXJPZlJlZ2lzdGVyczsKK307CisK
IGNsYXNzIFZhcmlhYmxlRXZlbnRTdHJlYW0gOiBwdWJsaWMgVmVjdG9yPFZhcmlhYmxlRXZlbnQ+
IHsKIHB1YmxpYzoKICAgICB2b2lkIGFwcGVuZEFuZExvZyhjb25zdCBWYXJpYWJsZUV2ZW50JiBl
dmVudCkKQEAgLTQyLDEzICs0OCwxOSBAQCBwdWJsaWM6CiAgICAgICAgIGFwcGVuZChldmVudCk7
CiAgICAgfQogICAgIAotICAgIHZvaWQgcmVjb25zdHJ1Y3QoCi0gICAgICAgIENvZGVCbG9jayos
IENvZGVPcmlnaW4sIE1pbmlmaWVkR3JhcGgmLAotICAgICAgICB1bnNpZ25lZCBpbmRleCwgT3Bl
cmFuZHM8VmFsdWVSZWNvdmVyeT4mKSBjb25zdDsKKyAgICB1bnNpZ25lZCByZWNvbnN0cnVjdChD
b2RlQmxvY2sqLCBDb2RlT3JpZ2luLCBNaW5pZmllZEdyYXBoJiwgdW5zaWduZWQgaW5kZXgsIE9w
ZXJhbmRzPFZhbHVlUmVjb3Zlcnk+JikgY29uc3Q7CisgICAgdW5zaWduZWQgcmVjb25zdHJ1Y3Qo
Q29kZUJsb2NrKiwgQ29kZU9yaWdpbiwgTWluaWZpZWRHcmFwaCYsIHVuc2lnbmVkIGluZGV4LCBP
cGVyYW5kczxWYWx1ZVJlY292ZXJ5PiYsIFZlY3RvcjxVbmRlZmluZWRPcGVyYW5kU3Bhbj4qKSBj
b25zdDsKIAogcHJpdmF0ZToKLSAgICBib29sIHRyeVRvU2V0Q29uc3RhbnRSZWNvdmVyeShWYWx1
ZVJlY292ZXJ5JiwgTWluaWZpZWROb2RlKikgY29uc3Q7Ci0gICAgCisgICAgZW51bSBjbGFzcyBS
ZWNvbnN0cnVjdGlvblN0eWxlIHsKKyAgICAgICAgQ29tYmluZWQsCisgICAgICAgIFNlcGFyYXRl
ZAorICAgIH07CisgICAgdGVtcGxhdGU8UmVjb25zdHJ1Y3Rpb25TdHlsZSBzdHlsZT4KKyAgICB1
bnNpZ25lZCByZWNvbnN0cnVjdCgKKyAgICAgICAgQ29kZUJsb2NrKiwgQ29kZU9yaWdpbiwgTWlu
aWZpZWRHcmFwaCYsCisgICAgICAgIHVuc2lnbmVkIGluZGV4LCBPcGVyYW5kczxWYWx1ZVJlY292
ZXJ5PiYsIFZlY3RvcjxVbmRlZmluZWRPcGVyYW5kU3Bhbj4qKSBjb25zdDsKKwogICAgIHZvaWQg
bG9nRXZlbnQoY29uc3QgVmFyaWFibGVFdmVudCYpOwogfTsKIApJbmRleDogU291cmNlL0phdmFT
Y3JpcHRDb3JlL3Byb2ZpbGVyL1Byb2ZpbGVyT1NSRXhpdC5oCj09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJj
ZS9KYXZhU2NyaXB0Q29yZS9wcm9maWxlci9Qcm9maWxlck9TUkV4aXQuaAkocmV2aXNpb24gMjIy
ODcwKQorKysgU291cmNlL0phdmFTY3JpcHRDb3JlL3Byb2ZpbGVyL1Byb2ZpbGVyT1NSRXhpdC5o
CSh3b3JraW5nIGNvcHkpCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAoQykgMjAx
MiBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKEMpIDIwMTIt
MjAxNyBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKgogICogUmVkaXN0cmlidXRp
b24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CiAg
KiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5n
IGNvbmRpdGlvbnMKQEAgLTQzLDcgKzQzLDggQEAgcHVibGljOgogICAgIAogICAgIHVpbnQ2NF90
KiBjb3VudGVyQWRkcmVzcygpIHsgcmV0dXJuICZtX2NvdW50ZXI7IH0KICAgICB1aW50NjRfdCBj
b3VudCgpIGNvbnN0IHsgcmV0dXJuIG1fY291bnRlcjsgfQotICAgIAorICAgIHZvaWQgaW5jQ291
bnQoKSB7IG1fY291bnRlcisrOyB9CisKICAgICBKU1ZhbHVlIHRvSlMoRXhlY1N0YXRlKikgY29u
c3Q7CiAKIHByaXZhdGU6CkluZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUvcnVudGltZS9KU0NK
U1ZhbHVlLmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRDb3JlL3J1bnRpbWUvSlND
SlNWYWx1ZS5oCShyZXZpc2lvbiAyMjI4NzApCisrKyBTb3VyY2UvSmF2YVNjcmlwdENvcmUvcnVu
dGltZS9KU0NKU1ZhbHVlLmgJKHdvcmtpbmcgY29weSkKQEAgLTEsNyArMSw3IEBACiAvKgogICog
IENvcHlyaWdodCAoQykgMTk5OS0yMDAxIEhhcnJpIFBvcnRlbiAocG9ydGVuQGtkZS5vcmcpCiAg
KiAgQ29weXJpZ2h0IChDKSAyMDAxIFBldGVyIEtlbGx5IChwbWtAcG9zdC5jb20pCi0gKiAgQ29w
eXJpZ2h0IChDKSAyMDAzLCAyMDA0LCAyMDA1LCAyMDA3LCAyMDA4LCAyMDA5LCAyMDEyLCAyMDE1
IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqICBDb3B5cmlnaHQgKEMpIDIwMDMt
MjAxNyBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKgogICogIFRoaXMgbGlicmFy
eSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKICAqICBt
b2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1Ymxp
YwpAQCAtMzQ0LDEyICszNDQsOSBAQCBwdWJsaWM6CiAgICAgdWludDMyX3QgdGFnKCkgY29uc3Q7
CiAgICAgaW50MzJfdCBwYXlsb2FkKCkgY29uc3Q7CiAKLSNpZiAhRU5BQkxFKEpJVCkKLSAgICAv
LyBUaGlzIHNob3VsZCBvbmx5IGJlIHVzZWQgYnkgdGhlIExMSW50IEMgTG9vcCBpbnRlcnByZXRl
ciB3aG8gbmVlZHMKLSAgICAvLyBzeW50aGVzaXplIEpTVmFsdWUgZnJvbSBpdHMgInJlZ2lzdGVy
InMgaG9sZGluZyB0YWcgYW5kIHBheWxvYWQKLSAgICAvLyB2YWx1ZXMuCisgICAgLy8gVGhpcyBz
aG91bGQgb25seSBiZSB1c2VkIGJ5IHRoZSBMTEludCBDIExvb3AgaW50ZXJwcmV0ZXIgYW5kIE9T
UkV4aXQgY29kZSB3aG8gbmVlZHMKKyAgICAvLyBzeW50aGVzaXplIEpTVmFsdWUgZnJvbSBpdHMg
InJlZ2lzdGVyInMgaG9sZGluZyB0YWcgYW5kIHBheWxvYWQgdmFsdWVzLgogICAgIGV4cGxpY2l0
IEpTVmFsdWUoaW50MzJfdCB0YWcsIGludDMyX3QgcGF5bG9hZCk7Ci0jZW5kaWYKIAogI2VsaWYg
VVNFKEpTVkFMVUU2NCkKICAgICAvKgpJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL3J1bnRp
bWUvSlNDSlNWYWx1ZUlubGluZXMuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENv
cmUvcnVudGltZS9KU0NKU1ZhbHVlSW5saW5lcy5oCShyZXZpc2lvbiAyMjI4NzApCisrKyBTb3Vy
Y2UvSmF2YVNjcmlwdENvcmUvcnVudGltZS9KU0NKU1ZhbHVlSW5saW5lcy5oCSh3b3JraW5nIGNv
cHkpCkBAIC0zNDEsNyArMzQxLDcgQEAgaW5saW5lIEpTVmFsdWU6OkpTVmFsdWUoaW50IGkpCiAg
ICAgdS5hc0JpdHMucGF5bG9hZCA9IGk7CiB9CiAKLSNpZiAhRU5BQkxFKEpJVCkKKyNpZiBVU0Uo
SlNWQUxVRTMyXzY0KQogaW5saW5lIEpTVmFsdWU6OkpTVmFsdWUoaW50MzJfdCB0YWcsIGludDMy
X3QgcGF5bG9hZCkKIHsKICAgICB1LmFzQml0cy50YWcgPSB0YWc7CkluZGV4OiBTb3VyY2UvSmF2
YVNjcmlwdENvcmUvcnVudGltZS9PcHRpb25zLmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL0phdmFT
Y3JpcHRDb3JlL3J1bnRpbWUvT3B0aW9ucy5oCShyZXZpc2lvbiAyMjI4NzApCisrKyBTb3VyY2Uv
SmF2YVNjcmlwdENvcmUvcnVudGltZS9PcHRpb25zLmgJKHdvcmtpbmcgY29weSkKQEAgLTE3Miw2
ICsxNzIsNyBAQCB0eXBlZGVmIGNvbnN0IGNoYXIqIG9wdGlvblN0cmluZzsKICAgICB2KGJvb2ws
IHZlcmJvc2VDb21waWxhdGlvbiwgZmFsc2UsIE5vcm1hbCwgbnVsbHB0cikgXAogICAgIHYoYm9v
bCwgdmVyYm9zZUZUTENvbXBpbGF0aW9uLCBmYWxzZSwgTm9ybWFsLCBudWxscHRyKSBcCiAgICAg
dihib29sLCBsb2dDb21waWxhdGlvbkNoYW5nZXMsIGZhbHNlLCBOb3JtYWwsIG51bGxwdHIpIFwK
KyAgICB2KGJvb2wsIHVzZVByb2JlT1NSRXhpdCwgZmFsc2UsIE5vcm1hbCwgbnVsbHB0cikgXAog
ICAgIHYoYm9vbCwgcHJpbnRFYWNoT1NSRXhpdCwgZmFsc2UsIE5vcm1hbCwgbnVsbHB0cikgXAog
ICAgIHYoYm9vbCwgdmFsaWRhdGVHcmFwaCwgZmFsc2UsIE5vcm1hbCwgbnVsbHB0cikgXAogICAg
IHYoYm9vbCwgdmFsaWRhdGVHcmFwaEF0RWFjaFBoYXNlLCBmYWxzZSwgTm9ybWFsLCBudWxscHRy
KSBcCkluZGV4OiBUb29scy9DaGFuZ2VMb2cKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gVG9vbHMvQ2hhbmdlTG9n
CShyZXZpc2lvbiAyMjI4NzApCisrKyBUb29scy9DaGFuZ2VMb2cJKHdvcmtpbmcgY29weSkKQEAg
LTEsMyArMSwxNiBAQAorMjAxNy0xMC0wNCAgTWFyayBMYW0gIDxtYXJrLmxhbUBhcHBsZS5jb20+
CisKKyAgICAgICAgQWRkIHN1cHBvcnQgZm9yIHVzaW5nIFByb2JlIERGRyBPU1IgRXhpdCBiZWhp
bmQgYSBydW50aW1lIGZsYWcuCisgICAgICAgIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3df
YnVnLmNnaT9pZD0xNzc4NDQKKyAgICAgICAgPHJkYXI6Ly9wcm9ibGVtLzM0ODAxNDI1PgorCisg
ICAgICAgIFJldmlld2VkIGJ5IFNhYW0gQmFyYXRpLgorCisgICAgICAgIEVuYWJsZSAtLXVzZVBy
b2JlT1NyRXhpdD10cnVlIGZvciBkZmctZWFnZXIgYW5kIGZ0bC1uby1jaml0LXZhbGlkYXRlLXNh
bXBsaW5nLXByb2ZpbGVyCisgICAgICAgIHRlc3QgY29uZmlndXJhdGlvbnMuCisKKyAgICAgICAg
KiBTY3JpcHRzL3J1bi1qc2Mtc3RyZXNzLXRlc3RzOgorCiAyMDE3LTEwLTA0ICBKb25hdGhhbiBC
ZWRhcmQgIDxqYmVkYXJkQGFwcGxlLmNvbT4KIAogICAgICAgICB3ZWJraXRweS50b29sLnN0ZXBz
LnN0ZXBzX3VuaXR0ZXN0LlN0ZXBzVGVzdC50ZXN0X3J1bnRlc3RzX2FwaSBpcyBmbGFrZXkKSW5k
ZXg6IFRvb2xzL1NjcmlwdHMvcnVuLWpzYy1zdHJlc3MtdGVzdHMKPT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gVG9v
bHMvU2NyaXB0cy9ydW4tanNjLXN0cmVzcy10ZXN0cwkocmV2aXNpb24gMjIyODcwKQorKysgVG9v
bHMvU2NyaXB0cy9ydW4tanNjLXN0cmVzcy10ZXN0cwkod29ya2luZyBjb3B5KQpAQCAtNDU3LDYg
KzQ1Nyw3IEBAIEVBR0VSX09QVElPTlMgPSBbIi0tdGhyZXNob2xkRm9ySklUQWZ0ZXIKIE5PX0NK
SVRfT1BUSU9OUyA9IFsiLS11c2VDb25jdXJyZW50SklUPWZhbHNlIiwgIi0tdGhyZXNob2xkRm9y
SklUQWZ0ZXJXYXJtVXA9MTAwIiwgIi0tc2NyaWJibGVGcmVlQ2VsbHM9dHJ1ZSJdCiBCM08xX09Q
VElPTlMgPSBbIi0tZGVmYXVsdEIzT3B0TGV2ZWw9MSJdCiBGVExfT1BUSU9OUyA9IFsiLS11c2VG
VExKSVQ9dHJ1ZSJdCitQUk9CRV9PU1JfRVhJVF9PUFRJT04gPSBbIi0tdXNlUHJvYmVPU1JFeGl0
PXRydWUiXQogCiByZXF1aXJlX3JlbGF0aXZlICJ3ZWJraXRydWJ5L2pzYy1zdHJlc3MtdGVzdC13
cml0ZXItI3skdGVzdFdyaXRlcn0iCiAKQEAgLTYyMyw3ICs2MjQsNyBAQCBkZWYgcnVuRlRMTm9D
SklUQjNPMSgqb3B0aW9uYWxUZXN0U3BlY2lmCiBlbmQKIAogZGVmIHJ1bkZUTE5vQ0pJVFZhbGlk
YXRlKCpvcHRpb25hbFRlc3RTcGVjaWZpY09wdGlvbnMpCi0gICAgcnVuKCJmdGwtbm8tY2ppdC12
YWxpZGF0ZS1zYW1wbGluZy1wcm9maWxlciIsICItLXZhbGlkYXRlR3JhcGg9dHJ1ZSIsICItLXVz
ZVNhbXBsaW5nUHJvZmlsZXI9dHJ1ZSIsICItLWFpckZvcmNlSVJDQWxsb2NhdG9yPXRydWUiLCAq
KEZUTF9PUFRJT05TICsgTk9fQ0pJVF9PUFRJT05TICsgb3B0aW9uYWxUZXN0U3BlY2lmaWNPcHRp
b25zKSkKKyAgICBydW4oImZ0bC1uby1jaml0LXZhbGlkYXRlLXNhbXBsaW5nLXByb2ZpbGVyIiwg
Ii0tdmFsaWRhdGVHcmFwaD10cnVlIiwgIi0tdXNlU2FtcGxpbmdQcm9maWxlcj10cnVlIiwgIi0t
YWlyRm9yY2VJUkNBbGxvY2F0b3I9dHJ1ZSIsICooRlRMX09QVElPTlMgKyBOT19DSklUX09QVElP
TlMgKyBQUk9CRV9PU1JfRVhJVF9PUFRJT04gKyBvcHRpb25hbFRlc3RTcGVjaWZpY09wdGlvbnMp
KQogZW5kCiAKIGRlZiBydW5GVExOb0NKSVROb1B1dFN0YWNrVmFsaWRhdGUoKm9wdGlvbmFsVGVz
dFNwZWNpZmljT3B0aW9ucykKQEAgLTYzOSw3ICs2NDAsNyBAQCBkZWYgcnVuRlRMTm9DSklUT1NS
VmFsaWRhdGlvbigqb3B0aW9uYWxUCiBlbmQKIAogZGVmIHJ1bkRGR0VhZ2VyKCpvcHRpb25hbFRl
c3RTcGVjaWZpY09wdGlvbnMpCi0gICAgcnVuKCJkZmctZWFnZXIiLCAqKEVBR0VSX09QVElPTlMg
KyBDT0xMRUNUX0NPTlRJTlVPVVNMWV9PUFRJT05TICsgb3B0aW9uYWxUZXN0U3BlY2lmaWNPcHRp
b25zKSkKKyAgICBydW4oImRmZy1lYWdlciIsICooRUFHRVJfT1BUSU9OUyArIENPTExFQ1RfQ09O
VElOVU9VU0xZX09QVElPTlMgKyBQUk9CRV9PU1JfRVhJVF9PUFRJT04gKyBvcHRpb25hbFRlc3RT
cGVjaWZpY09wdGlvbnMpKQogZW5kCiAKIGRlZiBydW5ERkdFYWdlck5vQ0pJVFZhbGlkYXRlKCpv
cHRpb25hbFRlc3RTcGVjaWZpY09wdGlvbnMpCg==
</data>

          </attachment>
      

    </bug>

</bugzilla>