<?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>79899</bug_id>
          
          <creation_ts>2012-02-29 02:19:36 -0800</creation_ts>
          <short_desc>DFG BasicBlocks should not require that their nodes have contiguous indices in the graph</short_desc>
          <delta_ts>2012-02-29 23:40:57 -0800</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>528+ (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></keywords>
          <priority>P2</priority>
          <bug_severity>Normal</bug_severity>
          <target_milestone>---</target_milestone>
          
          <blocked>76770</blocked>
          <everconfirmed>1</everconfirmed>
          <reporter name="Yuqiang Xian">yuqiang.xian</reporter>
          <assigned_to name="Nobody">webkit-unassigned</assigned_to>
          <cc>barraclough</cc>
    
    <cc>fpizlo</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>567529</commentid>
    <comment_count>0</comment_count>
    <who name="Yuqiang Xian">yuqiang.xian</who>
    <bug_when>2012-02-29 02:19:36 -0800</bug_when>
    <thetext>As discussed in bug 76770, we should make it more convenient to insert nodes into the DFG, so a BasicBlock may not have continuous Node indicies.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>567613</commentid>
    <comment_count>1</comment_count>
      <attachid>129448</attachid>
    <who name="Yuqiang Xian">yuqiang.xian</who>
    <bug_when>2012-02-29 07:31:21 -0800</bug_when>
    <thetext>Created attachment 129448
WIP patch

WIP.

There seems to be 1~2% performance regression on SunSpider. Will investigate it later.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>567974</commentid>
    <comment_count>2</comment_count>
    <who name="Filip Pizlo">fpizlo</who>
    <bug_when>2012-02-29 14:50:24 -0800</bug_when>
    <thetext>(In reply to comment #1)
&gt; Created an attachment (id=129448) [details]
&gt; WIP patch
&gt; 
&gt; WIP.
&gt; 
&gt; There seems to be 1~2% performance regression on SunSpider. Will investigate it later.

My guess: the HashMap you added to AbstractState.

My original implementation had a Vector&lt;AbstractValue&gt; indexed by NodeIndex rather than NodeIndex - m_block-&gt;begin.  But my original implementation also had loads of regressions, which turned out to be because of a combination of clobberStructures() (that&apos;s why I have that m_haveStructures and the hacks to make clobberStructures() walk over fewer things).  In the process, I also changed the Vector to be indexed by NodeIndex offset from block begin, but I have no idea if that change improved performance at all.

You might want to turn on SAMPLING_REGIONS to see what&apos;s going on.  That should quickly tell you if you&apos;ve increased DFG compile time.

But in the long run, we should probably tweak the DFG to run concurrently rather than synchronously.  That will be a glorious hack, and will probably require some thread safety changes elsewhere in the runtime since the DFG parser pokes JS heap objects that are somewhat mutable (like Structure).  But it will reduce the likelihood of us having to worry about regressions from compile times in the future.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>568177</commentid>
    <comment_count>3</comment_count>
    <who name="Yuqiang Xian">yuqiang.xian</who>
    <bug_when>2012-02-29 18:26:00 -0800</bug_when>
    <thetext>(In reply to comment #2)
&gt; 
&gt; My guess: the HashMap you added to AbstractState.
&gt; 
&gt; My original implementation had a Vector&lt;AbstractValue&gt; indexed by NodeIndex rather than NodeIndex - m_block-&gt;begin.  But my original implementation also had loads of regressions, which turned out to be because of a combination of clobberStructures() (that&apos;s why I have that m_haveStructures and the hacks to make clobberStructures() walk over fewer things).  In the process, I also changed the Vector to be indexed by NodeIndex offset from block begin, but I have no idea if that change improved performance at all.
&gt; 

Yes, you&apos;re right. If we still maintain the abstract values in a Vector and index them by NodeIndex then there&apos;s no such performance regression. However it may use more memory as the vector size is equal to the graph size. Do you think it&apos;s an acceptable tradeoff?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>568210</commentid>
    <comment_count>4</comment_count>
    <who name="Filip Pizlo">fpizlo</who>
    <bug_when>2012-02-29 18:39:12 -0800</bug_when>
    <thetext>(In reply to comment #3)
&gt; (In reply to comment #2)
&gt; &gt; 
&gt; &gt; My guess: the HashMap you added to AbstractState.
&gt; &gt; 
&gt; &gt; My original implementation had a Vector&lt;AbstractValue&gt; indexed by NodeIndex rather than NodeIndex - m_block-&gt;begin.  But my original implementation also had loads of regressions, which turned out to be because of a combination of clobberStructures() (that&apos;s why I have that m_haveStructures and the hacks to make clobberStructures() walk over fewer things).  In the process, I also changed the Vector to be indexed by NodeIndex offset from block begin, but I have no idea if that change improved performance at all.
&gt; &gt; 
&gt; 
&gt; Yes, you&apos;re right. If we still maintain the abstract values in a Vector and index them by NodeIndex then there&apos;s no such performance regression. However it may use more memory as the vector size is equal to the graph size. Do you think it&apos;s an acceptable tradeoff?

That&apos;s great!  I think that this is a perfectly acceptable tradeoff.

Here&apos;s my specific thinking:

- The old JIT is emitting ~100 bytes of machine code for basic arithmetic instructions, and probably no less than ~20 bytes of any other instruction.  Some instructions emit drastically more than 100 bytes.  So long as the DFG&apos;s footprint per bytecode instruction (with on average two DFG nodes - the operation and the SetLocal - per bytecode instruction) is less than 100, we probably shouldn&apos;t worry.  I think we&apos;re already over this by the way, but probably not by much.

- The DFG::Node class currently has ~8 32-bit words of junk.  Here we&apos;re adding 2 64-bit words to represent the AbstractValue.  So this is a small regression.

- The DFG should be allowed to make a space-time trade-off if needed, and also, a space-teamProductivity trade-off as well.  We only invoke the DFG rarely.  We only invoke the DFG for code that is not absurdly big.  And when we do invoke it, there is only one instance of the DFG running at a time.  Hence it should be allowed to use some extra memory if it&apos;s beneficial for performance, or if it makes the code easier for us to hack.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>568228</commentid>
    <comment_count>5</comment_count>
      <attachid>129614</attachid>
    <who name="Yuqiang Xian">yuqiang.xian</who>
    <bug_when>2012-02-29 19:20:42 -0800</bug_when>
    <thetext>Created attachment 129614
Patch for review

Filip, thanks for the clarification.

Here&apos;s the patch for review.

Performance result is here as well (almost neutral):

Collected 12 samples per benchmark/VM, with 4 VM invocations per benchmark. Emitted a call to gc() between sample
measurements. Used 1 benchmark iteration per VM invocation for warm-up. Used the jsc-specific preciseTime()
function to get microsecond-level timing. Reporting benchmark execution times with 95% confidence intervals in
milliseconds.

                                               ToT                    79899                                      
SunSpider:
   3d-cube                                8.1317+-0.0753    ?     8.1812+-0.0359       ?
   3d-morph                               9.6125+-0.0396    ?     9.6248+-0.0347       ?
   3d-raytrace                           10.4898+-0.1458         10.4073+-0.0569       
   access-binary-trees                    2.4043+-0.0633    ?     2.4274+-0.0725       ?
   access-fannkuch                       10.7972+-0.9117         10.3027+-0.0398         might be 1.0480x faster
   access-nbody                           5.4502+-0.0471    ?     5.4977+-0.0513       ?
   access-nsieve                          4.0119+-0.0407          4.0100+-0.0545       
   bitops-3bit-bits-in-byte               1.2555+-0.0202          1.2482+-0.0243       
   bitops-bits-in-byte                    4.6557+-0.0646          4.6193+-0.0646       
   bitops-bitwise-and                     4.2758+-0.0490    ?     4.3005+-0.0636       ?
   bitops-nsieve-bits                     4.2680+-0.0539          4.2642+-0.0477       
   controlflow-recursive                  2.8596+-0.0376          2.8366+-0.0324       
   crypto-aes                             9.5863+-0.1921    ?     9.6874+-0.1197       ? might be 1.0105x slower
   crypto-md5                             3.3988+-0.0716    ?     3.4228+-0.0502       ?
   crypto-sha1                            2.7206+-0.0500    ?     2.7903+-0.0403       ? might be 1.0256x slower
   date-format-tofte                     13.6587+-1.9276         12.7911+-0.0741         might be 1.0678x faster
   date-format-xparb                     11.9622+-0.1335    ?    12.1260+-0.1427       ? might be 1.0137x slower
   math-cordic                            4.0385+-0.0675    ?     4.0777+-0.0784       ?
   math-partial-sums                     14.8533+-0.0333    ?    15.5325+-1.5644       ? might be 1.0457x slower
   math-spectral-norm                     2.7100+-0.0501          2.6963+-0.0447       
   regexp-dna                             9.3486+-0.0752    ?     9.4206+-0.0760       ?
   string-base64                          5.6182+-0.0711    ?     5.7111+-0.1056       ? might be 1.0165x slower
   string-fasta                           9.4383+-0.0563          9.4094+-0.0468       
   string-tagcloud                       16.9364+-1.9261         16.1189+-0.0514         might be 1.0507x faster
   string-unpack-code                    27.5010+-0.2195         27.4682+-0.0478       
   string-validate-input                  8.3231+-0.0630    ?     8.3302+-0.0378       ?

   &lt;arithmetic&gt; *                         8.0118+-0.1202          7.9732+-0.0610         might be 1.0048x faster
   &lt;geometric&gt;                            6.3050+-0.0562          6.3023+-0.0375         might be 1.0004x faster
   &lt;harmonic&gt;                             4.8941+-0.0416    ?     4.9019+-0.0366       ? might be 1.0016x slower

                                               ToT                    79899                                      
V8:
   crypto                                94.0062+-0.5066    ?    95.0840+-1.2626       ? might be 1.0115x slower
   deltablue                            165.9663+-1.3598    ?   166.3503+-1.6042       ?
   earley-boyer                         121.4067+-2.5646        119.8530+-2.6862         might be 1.0130x faster
   raytrace                              58.6499+-0.4516    ?    59.4065+-0.4719       ? might be 1.0129x slower
   regexp                               111.1548+-0.4702        110.9294+-0.4109       
   richards                             191.6663+-1.2047        190.4287+-0.8902       
   splay                                 77.4138+-0.9005         77.3018+-0.2461       

   &lt;arithmetic&gt;                         117.1806+-0.5576        117.0505+-0.6485         might be 1.0011x faster
   &lt;geometric&gt; *                        109.0251+-0.5826    ?   109.0822+-0.6494       ? might be 1.0005x slower
   &lt;harmonic&gt;                           101.3128+-0.6036    ?   101.5676+-0.6212       ? might be 1.0025x slower

                                               ToT                    79899                                      
Kraken:
   ai-astar                             789.5488+-4.9142        788.0722+-5.0229       
   audio-beat-detection                 237.0390+-0.3647    ?   238.9648+-1.5770       ?
   audio-dft                            367.7708+-2.5980    ?   378.8661+-9.5683       ? might be 1.0302x slower
   audio-fft                            151.2529+-0.0775    ?   151.2913+-0.1593       ?
   audio-oscillator                     344.1697+-1.3283    ?   345.5862+-2.6765       ?
   imaging-darkroom                     377.7554+-9.3130        375.5139+-9.5351       
   imaging-desaturate                   303.6464+-0.6332        303.4512+-0.6833       
   imaging-gaussian-blur                506.0675+-0.1486    ?   506.2780+-0.2269       ?
   json-parse-financial                  85.7818+-0.3590    !    86.9759+-0.7928       ! definitely 1.0139x slower
   json-stringify-tinderbox             106.0411+-0.7759    ?   106.0652+-0.6543       ?
   stanford-crypto-aes                  105.6489+-0.5791    ?   106.1828+-0.4288       ?
   stanford-crypto-ccm                  100.3177+-0.8778         99.5192+-0.5648       
   stanford-crypto-pbkdf2               235.7453+-0.5540    ^   234.9382+-0.1006       ^ definitely 1.0034x faster
   stanford-crypto-sha256-iterative     102.8190+-0.5031    ?   103.1907+-0.5652       ?

   &lt;arithmetic&gt; *                       272.4003+-1.0940    ?   273.2068+-1.3736       ? might be 1.0030x slower
   &lt;geometric&gt;                          216.1398+-0.7343    ?   216.8310+-0.8875       ? might be 1.0032x slower
   &lt;harmonic&gt;                           174.7069+-0.5262    ?   175.2619+-0.5780       ? might be 1.0032x slower

                                               ToT                    79899                                      
All benchmarks:
   &lt;arithmetic&gt;                         103.0250+-0.4143    ?   103.2245+-0.4864       ? might be 1.0019x slower
   &lt;geometric&gt;                           27.6239+-0.1723    ?    27.6462+-0.1356       ? might be 1.0008x slower
   &lt;harmonic&gt;                             8.6053+-0.0719    ?     8.6194+-0.0633       ? might be 1.0016x slower

                                               ToT                    79899                                      
Geomean of preferred means:
   &lt;scaled-result&gt;                       61.9631+-0.4216         61.9369+-0.2838         might be 1.0004x faster</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>568246</commentid>
    <comment_count>6</comment_count>
      <attachid>129614</attachid>
    <who name="Filip Pizlo">fpizlo</who>
    <bug_when>2012-02-29 19:42:24 -0800</bug_when>
    <thetext>Comment on attachment 129614
Patch for review

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

This is really awesome.  R- but only because I want to make sure we do CSE right.

&gt; Source/JavaScriptCore/dfg/DFGCSEPhase.cpp:720
&gt;      
&gt;      void performBlockCSE(BasicBlock&amp; block)
&gt;      {
&gt; -        m_start = block.begin;
&gt; -        NodeIndex end = block.end;
&gt; -        for (m_compileIndex = m_start; m_compileIndex &lt; end; ++m_compileIndex)
&gt; +        m_start = block[block.startExcludingPhis];
&gt; +        for (unsigned i = block.startExcludingPhis; i &lt; block.size(); ++i) {
&gt; +            m_compileIndex = block[i];
&gt;              performNodeCSE(m_graph[m_compileIndex]);
&gt; +        }
&gt;      }
&gt;      
&gt;      NodeIndex m_start;

I&apos;m somewhat surprised that these are the only changes in CSE!  CSE has this whole performance hack where it uses the NodeIndex of the instruction that is a candidate for elimination, and the NodeIndices of its children, to determine the range that it will search.

Seems like that relies on NodeIndices of things in a basic block being monotonically increasing.

Would be better to instead make all of the search things instead break early when they encounter a NodeIndex at block[i] that matches the NodeIndex in one of the children of the node from which the search originated.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>568251</commentid>
    <comment_count>7</comment_count>
    <who name="Yuqiang Xian">yuqiang.xian</who>
    <bug_when>2012-02-29 19:47:19 -0800</bug_when>
    <thetext>(In reply to comment #6)
&gt; (From update of attachment 129614 [details])
&gt; View in context: https://bugs.webkit.org/attachment.cgi?id=129614&amp;action=review
&gt; 
&gt; This is really awesome.  R- but only because I want to make sure we do CSE right.
&gt; 
&gt; &gt; Source/JavaScriptCore/dfg/DFGCSEPhase.cpp:720
&gt; &gt;      
&gt; &gt;      void performBlockCSE(BasicBlock&amp; block)
&gt; &gt;      {
&gt; &gt; -        m_start = block.begin;
&gt; &gt; -        NodeIndex end = block.end;
&gt; &gt; -        for (m_compileIndex = m_start; m_compileIndex &lt; end; ++m_compileIndex)
&gt; &gt; +        m_start = block[block.startExcludingPhis];
&gt; &gt; +        for (unsigned i = block.startExcludingPhis; i &lt; block.size(); ++i) {
&gt; &gt; +            m_compileIndex = block[i];
&gt; &gt;              performNodeCSE(m_graph[m_compileIndex]);
&gt; &gt; +        }
&gt; &gt;      }
&gt; &gt;      
&gt; &gt;      NodeIndex m_start;
&gt; 
&gt; I&apos;m somewhat surprised that these are the only changes in CSE!  CSE has this whole performance hack where it uses the NodeIndex of the instruction that is a candidate for elimination, and the NodeIndices of its children, to determine the range that it will search.
&gt; 
&gt; Seems like that relies on NodeIndices of things in a basic block being monotonically increasing.
&gt; 
&gt; Would be better to instead make all of the search things instead break early when they encounter a NodeIndex at block[i] that matches the NodeIndex in one of the children of the node from which the search originated.

Yes. You&apos;re absolutely right. I didn&apos;t touch CSE for now - actually it still relies on the assumption that the node indicies are continuous, which is true in current stage as we exclude the inserted Phi nodes. But yes we should fix it.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>568252</commentid>
    <comment_count>8</comment_count>
    <who name="Filip Pizlo">fpizlo</who>
    <bug_when>2012-02-29 19:50:05 -0800</bug_when>
    <thetext>&gt; Yes. You&apos;re absolutely right. I didn&apos;t touch CSE for now - actually it still relies on the assumption that the node indicies are continuous, which is true in current stage as we exclude the inserted Phi nodes. But yes we should fix it.

Yeah, I think this is one of those things that we want to fix in this patch.  Feels like even though it will make for a bigger patch, the result will be cleaner and more coherent.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>568312</commentid>
    <comment_count>9</comment_count>
      <attachid>129627</attachid>
    <who name="Yuqiang Xian">yuqiang.xian</who>
    <bug_when>2012-02-29 21:23:50 -0800</bug_when>
    <thetext>Created attachment 129627
patch updated

Correct CSE.

Performance result here:

Collected 12 samples per benchmark/VM, with 4 VM invocations per benchmark. Emitted a call to gc() between sample
measurements. Used 1 benchmark iteration per VM invocation for warm-up. Used the jsc-specific preciseTime()
function to get microsecond-level timing. Reporting benchmark execution times with 95% confidence intervals in
milliseconds.

                                               ToT                    79899
SunSpider:
   3d-cube                                8.2464+-0.0825    ?     8.8842+-1.3563       ? might be 1.0773x slower
   3d-morph                               9.7461+-0.1194          9.6008+-0.0471         might be 1.0151x faster
   3d-raytrace                           10.3699+-0.0746    ?    10.4985+-0.0897       ? might be 1.0124x slower
   access-binary-trees                    2.4174+-0.0491    ?     2.4208+-0.0299       ?
   access-fannkuch                       10.2097+-0.0340    !    10.3671+-0.0738       ! definitely 1.0154x slower
   access-nbody                           5.4205+-0.0502    ?     5.4971+-0.0408       ? might be 1.0141x slower
   access-nsieve                          4.0139+-0.0354          3.9855+-0.0549
   bitops-3bit-bits-in-byte               1.2879+-0.1218          1.2674+-0.0267         might be 1.0162x faster
   bitops-bits-in-byte                    4.6899+-0.0529    ?     4.6899+-0.0680       ?
   bitops-bitwise-and                     4.3005+-0.0526          4.2784+-0.0348
   bitops-nsieve-bits                     4.2527+-0.0555    ?     4.2611+-0.0592       ?
   controlflow-recursive                  2.8832+-0.0560          2.8495+-0.0330         might be 1.0118x faster
   crypto-aes                             9.9004+-0.8040          9.7395+-0.1091         might be 1.0165x faster
   crypto-md5                             3.7363+-0.7201          3.5368+-0.0762         might be 1.0564x faster
   crypto-sha1                            2.7769+-0.1318    ?     2.8187+-0.0382       ? might be 1.0151x slower
   date-format-tofte                     12.7713+-0.1900         12.6657+-0.0813
   date-format-xparb                     11.9215+-0.0611         11.8989+-0.0899
   math-cordic                            4.0575+-0.0668          4.0442+-0.0729
   math-partial-sums                     14.8560+-0.0503    ?    14.8976+-0.0510       ?
   math-spectral-norm                     2.6806+-0.0414          2.6710+-0.0367
   regexp-dna                             9.4064+-0.0848          9.3769+-0.0829
   string-base64                          5.5638+-0.0453    ?     5.6208+-0.0781       ? might be 1.0102x slower
   string-fasta                           9.4595+-0.0784    ?     9.4883+-0.0626       ?
   string-tagcloud                       16.2971+-0.1989    ?    16.6938+-1.4490       ? might be 1.0243x slower
   string-unpack-code                    27.5464+-0.1902         27.2705+-0.1486         might be 1.0101x faster
   string-validate-input                  8.6276+-0.3451          8.4289+-0.0586         might be 1.0236x faster

   &lt;arithmetic&gt; *                         7.9784+-0.0601    ?     7.9905+-0.0691       ? might be 1.0015x slower
   &lt;geometric&gt;                            6.3202+-0.0628    ?     6.3234+-0.0358       ? might be 1.0005x slower
   &lt;harmonic&gt;                             4.9249+-0.0723          4.9247+-0.0266         might be 1.0000x faster

                                               ToT                    79899
V8:
   crypto                                95.0226+-1.0047         94.3739+-0.3426
   deltablue                            165.2617+-0.6624    ?   165.7057+-0.6259       ?
   earley-boyer                         120.6456+-2.7215    ?   122.9765+-2.5056       ? might be 1.0193x slower
   raytrace                              58.9135+-0.3810    ?    59.0790+-0.4627       ?
   regexp                               111.1890+-0.4246        110.9795+-0.4306
   richards                             190.9017+-0.7440    ^   189.6743+-0.2815       ^ definitely 1.0065x faster
   splay                                 76.9456+-0.1664         76.8783+-0.1922

   &lt;arithmetic&gt;                         116.9828+-0.5396    ?   117.0953+-0.4770       ? might be 1.0010x slower
   &lt;geometric&gt; *                        108.9471+-0.5280    ?   109.0833+-0.4856       ? might be 1.0013x slower
   &lt;harmonic&gt;                           101.3365+-0.4907    ?   101.4683+-0.4743       ? might be 1.0013x slower

                                               ToT                    79899
Kraken:
   ai-astar                             785.0024+-0.6913    ?   785.6353+-1.8885       ?
   audio-beat-detection                 237.7250+-1.4305    ?   238.6727+-0.6064       ?
   audio-dft                            368.7606+-7.9661        366.7011+-3.3630
   audio-fft                            152.0918+-1.0270        151.3073+-0.0661
   audio-oscillator                     343.2595+-1.3591    ?   344.1854+-1.4707       ?
   imaging-darkroom                     375.6221+-9.2659        374.0356+-8.6721
   imaging-desaturate                   303.7351+-0.8658        303.5210+-0.5746
   imaging-gaussian-blur                506.6966+-1.0673        506.6839+-0.5188
   json-parse-financial                  86.3672+-0.7082    ?    87.4680+-0.3961       ? might be 1.0127x slower
   json-stringify-tinderbox             106.0603+-0.8037        106.0054+-0.6595
   stanford-crypto-aes                  106.1432+-0.8878        105.0881+-0.3653         might be 1.0100x faster
   stanford-crypto-ccm                   99.5565+-0.6853    ?   100.0071+-0.7250       ?
   stanford-crypto-pbkdf2               235.4754+-0.3006    !   238.4268+-1.2700       ! definitely 1.0125x slower
   stanford-crypto-sha256-iterative     102.9337+-0.3225        102.6497+-0.5483

   &lt;arithmetic&gt; *                       272.1021+-1.1641    ?   272.1705+-0.9473       ? might be 1.0003x slower
   &lt;geometric&gt;                          216.1712+-0.8053    ?   216.3056+-0.6672       ? might be 1.0006x slower
   &lt;harmonic&gt;                           174.8804+-0.5656    ?   175.0663+-0.5010       ? might be 1.0011x slower</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>568327</commentid>
    <comment_count>10</comment_count>
      <attachid>129627</attachid>
    <who name="Filip Pizlo">fpizlo</who>
    <bug_when>2012-02-29 21:44:23 -0800</bug_when>
    <thetext>Comment on attachment 129627
patch updated

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

Awesome!

Question: does this mean that the start index performance hack is no longer in effect at all?  I.e. you&apos;re not even stopping the CSE when it gets to the earliest possible child of the node being replaced?  That&apos;s not a problem - in fact it&apos;s great if that&apos;s true.  I had added that optimization prematurely and it&apos;s somewhat comforting to know that it isn&apos;t necessary.

R=me.

&gt; Source/JavaScriptCore/dfg/DFGByteCodeParser.cpp:616
&gt; +        block-&gt;prepend(resultIndex);

Ha!  I find it to be quite awesome that we see no regression even though prepend is an O(n) operation.  Or am I missing something?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>568330</commentid>
    <comment_count>11</comment_count>
    <who name="James Robinson">jamesr</who>
    <bug_when>2012-02-29 21:45:39 -0800</bug_when>
    <thetext>Sorry about the cc&apos;s and spam, the watchlist bot seems to be a bit off kilter today.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>568359</commentid>
    <comment_count>12</comment_count>
    <who name="Yuqiang Xian">yuqiang.xian</who>
    <bug_when>2012-02-29 22:38:07 -0800</bug_when>
    <thetext>(In reply to comment #10)
&gt; (From update of attachment 129627 [details])
&gt; View in context: https://bugs.webkit.org/attachment.cgi?id=129627&amp;action=review
&gt; 
&gt; Awesome!
&gt; 
&gt; Question: does this mean that the start index performance hack is no longer in effect at all?  I.e. you&apos;re not even stopping the CSE when it gets to the earliest possible child of the node being replaced?  That&apos;s not a problem - in fact it&apos;s great if that&apos;s true.  I had added that optimization prematurely and it&apos;s somewhat comforting to know that it isn&apos;t necessary.
&gt; 

According to the data it may be true. But yes you&apos;re right that it&apos;s possible to terminate the look-back process earlier. Maybe we can do this in a separated patch?

&gt; R=me.
&gt; 
&gt; &gt; Source/JavaScriptCore/dfg/DFGByteCodeParser.cpp:616
&gt; &gt; +        block-&gt;prepend(resultIndex);
&gt; 
&gt; Ha!  I find it to be quite awesome that we see no regression even though prepend is an O(n) operation.  Or am I missing something?

I originally had the same concern as yours. So I had another version which just kept the Phi nodes in a separated block (just as how they&apos;re originally handled) but later I found no obvious performance difference comparing to current approach. So I still throw out this version.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>568388</commentid>
    <comment_count>13</comment_count>
    <who name="Yuqiang Xian">yuqiang.xian</who>
    <bug_when>2012-02-29 23:40:57 -0800</bug_when>
    <thetext>Committed as http://trac.webkit.org/changeset/109318</thetext>
  </long_desc>
      
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>129448</attachid>
            <date>2012-02-29 07:31:21 -0800</date>
            <delta_ts>2012-02-29 19:20:42 -0800</delta_ts>
            <desc>WIP patch</desc>
            <filename>79899.0.patch</filename>
            <type>text/plain</type>
            <size>38634</size>
            <attacher name="Yuqiang Xian">yuqiang.xian</attacher>
            
              <data encoding="base64">SW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9DaGFuZ2VMb2cKPT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291
cmNlL0phdmFTY3JpcHRDb3JlL0NoYW5nZUxvZwkocmV2aXNpb24gMTA5MjA4KQorKysgU291cmNl
L0phdmFTY3JpcHRDb3JlL0NoYW5nZUxvZwkod29ya2luZyBjb3B5KQpAQCAtMSwzICsxLDY0IEBA
CisyMDEyLTAyLTI5ICBZdXFpYW5nIFhpYW4gIDx5dXFpYW5nLnhpYW5AaW50ZWwuY29tPgorCisg
ICAgICAgIERGRyBCYXNpY0Jsb2NrcyBzaG91bGQgbm90IHJlcXVpcmUgdGhhdCB0aGVpciBub2Rl
cyBoYXZlIGNvbnRpbnVvdXMgaW5kaWNlcyBpbiB0aGUgZ3JhcGgKKyAgICAgICAgaHR0cHM6Ly9i
dWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTc5ODk5CisKKyAgICAgICAgUmV2aWV3ZWQg
YnkgTk9CT0RZIChPT1BTISkuCisKKyAgICAgICAgVGhpcyB3aWxsIG1ha2UgaXQgbW9yZSBjb252
ZW5pZW50IHRvIGluc2VydCBub2RlcyBpbnRvIHRoZSBERkcuCisKKyAgICAgICAgKiBkZmcvREZH
QWJzdHJhY3RTdGF0ZS5jcHA6CisgICAgICAgIChKU0M6OkRGRzo6QWJzdHJhY3RTdGF0ZTo6QWJz
dHJhY3RTdGF0ZSk6CisgICAgICAgIChKU0M6OkRGRzo6QWJzdHJhY3RTdGF0ZTo6YmVnaW5CYXNp
Y0Jsb2NrKToKKyAgICAgICAgKEpTQzo6REZHOjpBYnN0cmFjdFN0YXRlOjpleGVjdXRlKToKKyAg
ICAgICAgKEpTQzo6REZHOjpBYnN0cmFjdFN0YXRlOjpjbG9iYmVyU3RydWN0dXJlcyk6CisgICAg
ICAgIChKU0M6OkRGRzo6QWJzdHJhY3RTdGF0ZTo6bWVyZ2VUb1N1Y2Nlc3NvcnMpOgorICAgICAg
ICAoSlNDOjpERkc6OkFic3RyYWN0U3RhdGU6OmR1bXApOgorICAgICAgICAqIGRmZy9ERkdBYnN0
cmFjdFN0YXRlLmg6CisgICAgICAgIChBYnN0cmFjdFN0YXRlKToKKyAgICAgICAgKEpTQzo6REZH
OjpBYnN0cmFjdFN0YXRlOjpmb3JOb2RlKToKKyAgICAgICAgKiBkZmcvREZHQXJpdGhOb2RlRmxh
Z3NJbmZlcmVuY2VQaGFzZS5jcHA6CisgICAgICAgIChBcml0aE5vZGVGbGFnc0luZmVyZW5jZVBo
YXNlKToKKyAgICAgICAgKiBkZmcvREZHQmFzaWNCbG9jay5oOgorICAgICAgICAoSlNDOjpERkc6
OkJhc2ljQmxvY2s6OkJhc2ljQmxvY2spOgorICAgICAgICAoQmFzaWNCbG9jayk6CisgICAgICAg
ICogZGZnL0RGR0J5dGVDb2RlUGFyc2VyLmNwcDoKKyAgICAgICAgKEpTQzo6REZHOjpCeXRlQ29k
ZVBhcnNlcjo6YWRkVG9HcmFwaCk6CisgICAgICAgIChCeXRlQ29kZVBhcnNlcik6CisgICAgICAg
IChKU0M6OkRGRzo6Qnl0ZUNvZGVQYXJzZXI6Omluc2VydFBoaU5vZGUpOgorICAgICAgICAoSlND
OjpERkc6OkJ5dGVDb2RlUGFyc2VyOjpoYW5kbGVJbmxpbmluZyk6CisgICAgICAgIChKU0M6OkRG
Rzo6Qnl0ZUNvZGVQYXJzZXI6OnBhcnNlQmxvY2spOgorICAgICAgICAoSlNDOjpERkc6OkJ5dGVD
b2RlUGFyc2VyOjpwcm9jZXNzUGhpU3RhY2spOgorICAgICAgICAoSlNDOjpERkc6OkJ5dGVDb2Rl
UGFyc2VyOjpsaW5rQmxvY2spOgorICAgICAgICAoSlNDOjpERkc6OkJ5dGVDb2RlUGFyc2VyOjpk
ZXRlcm1pbmVSZWFjaGFiaWxpdHkpOgorICAgICAgICAoSlNDOjpERkc6OkJ5dGVDb2RlUGFyc2Vy
OjpwYXJzZUNvZGVCbG9jayk6CisgICAgICAgICogZGZnL0RGR0NGQVBoYXNlLmNwcDoKKyAgICAg
ICAgKEpTQzo6REZHOjpDRkFQaGFzZTo6cGVyZm9ybUJsb2NrQ0ZBKToKKyAgICAgICAgKENGQVBo
YXNlKToKKyAgICAgICAgKiBkZmcvREZHQ1NFUGhhc2UuY3BwOgorICAgICAgICAoSlNDOjpERkc6
OkNTRVBoYXNlOjpwZXJmb3JtQmxvY2tDU0UpOgorICAgICAgICAqIGRmZy9ERkdHcmFwaC5jcHA6
CisgICAgICAgIChKU0M6OkRGRzo6R3JhcGg6OmR1bXApOgorICAgICAgICAqIGRmZy9ERkdQaGFz
ZS5jcHA6CisgICAgICAgIChKU0M6OkRGRzo6UGhhc2U6OmJlZ2luUGhhc2UpOgorICAgICAgICAq
IGRmZy9ERkdTcGVjdWxhdGl2ZUpJVC5jcHA6CisgICAgICAgIChKU0M6OkRGRzo6U3BlY3VsYXRp
dmVKSVQ6Om5vblNwZWN1bGF0aXZlQ29tcGFyZSk6CisgICAgICAgIChKU0M6OkRGRzo6U3BlY3Vs
YXRpdmVKSVQ6Om5vblNwZWN1bGF0aXZlU3RyaWN0RXEpOgorICAgICAgICAoSlNDOjpERkc6OlNw
ZWN1bGF0aXZlSklUOjpjb21waWxlUGVlcEhvbGVCcmFuY2gpOgorICAgICAgICAoSlNDOjpERkc6
OlNwZWN1bGF0aXZlSklUOjpjb21waWxlKToKKyAgICAgICAgKEpTQzo6REZHOjpTcGVjdWxhdGl2
ZUpJVDo6Y29tcGlsZVN0cmljdEVxRm9yQ29uc3RhbnQpOgorICAgICAgICAoSlNDOjpERkc6OlNw
ZWN1bGF0aXZlSklUOjpjb21waWxlU3RyaWN0RXEpOgorICAgICAgICAqIGRmZy9ERkdTcGVjdWxh
dGl2ZUpJVC5oOgorICAgICAgICAoU3BlY3VsYXRpdmVKSVQpOgorICAgICAgICAoSlNDOjpERkc6
OlNwZWN1bGF0aXZlSklUOjpkZXRlY3RQZWVwSG9sZUJyYW5jaCk6CisgICAgICAgIChKU0M6OkRG
Rzo6U3BlY3VsYXRpdmVKSVQ6OlNwZWN1bGF0aXZlSklUKToKKyAgICAgICAgKiBkZmcvREZHU3Bl
Y3VsYXRpdmVKSVQzMl82NC5jcHA6CisgICAgICAgIChKU0M6OkRGRzo6U3BlY3VsYXRpdmVKSVQ6
Om5vblNwZWN1bGF0aXZlQ29tcGFyZU51bGwpOgorICAgICAgICAqIGRmZy9ERkdTcGVjdWxhdGl2
ZUpJVDY0LmNwcDoKKyAgICAgICAgKEpTQzo6REZHOjpTcGVjdWxhdGl2ZUpJVDo6bm9uU3BlY3Vs
YXRpdmVDb21wYXJlTnVsbCk6CisgICAgICAgICogZGZnL0RGR1ZpcnR1YWxSZWdpc3RlckFsbG9j
YXRpb25QaGFzZS5jcHA6CisgICAgICAgIChKU0M6OkRGRzo6VmlydHVhbFJlZ2lzdGVyQWxsb2Nh
dGlvblBoYXNlOjpydW4pOgorCiAyMDEyLTAyLTI4ICBSYXBoYWVsIEt1Ym8gZGEgQ29zdGEgIDxr
dWJvQHByb2Z1c2lvbi5tb2JpPgogCiAgICAgICAgIFtDTWFrZV0gQWx3YXlzIGJ1aWxkIHd0ZiBh
cyBhIHN0YXRpYyBsaWJyYXJ5LgpJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL2RmZy9ERkdB
YnN0cmFjdFN0YXRlLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvZGZn
L0RGR0Fic3RyYWN0U3RhdGUuY3BwCShyZXZpc2lvbiAxMDkyMDcpCisrKyBTb3VyY2UvSmF2YVNj
cmlwdENvcmUvZGZnL0RGR0Fic3RyYWN0U3RhdGUuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC01NCwx
MyArNTQsNiBAQCBBYnN0cmFjdFN0YXRlOjpBYnN0cmFjdFN0YXRlKEdyYXBoJiBncmFwCiAgICAg
LCBtX3ZhcmlhYmxlcyhtX2NvZGVCbG9jay0+bnVtUGFyYW1ldGVycygpLCBncmFwaC5tX2xvY2Fs
VmFycykKICAgICAsIG1fYmxvY2soMCkKIHsKLSAgICBzaXplX3QgbWF4QmxvY2tTaXplID0gMDsK
LSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGdyYXBoLm1fYmxvY2tzLnNpemUoKTsgKytpKSB7
Ci0gICAgICAgIEJhc2ljQmxvY2sqIGJsb2NrID0gZ3JhcGgubV9ibG9ja3NbaV0uZ2V0KCk7Ci0g
ICAgICAgIGlmIChibG9jay0+ZW5kIC0gYmxvY2stPmJlZ2luID4gbWF4QmxvY2tTaXplKQotICAg
ICAgICAgICAgbWF4QmxvY2tTaXplID0gYmxvY2stPmVuZCAtIGJsb2NrLT5iZWdpbjsKLSAgICB9
Ci0gICAgbV9ub2Rlcy5yZXNpemUobWF4QmxvY2tTaXplKTsKIH0KIAogQWJzdHJhY3RTdGF0ZTo6
fkFic3RyYWN0U3RhdGUoKSB7IH0KQEAgLTc1LDggKzY4LDcgQEAgdm9pZCBBYnN0cmFjdFN0YXRl
OjpiZWdpbkJhc2ljQmxvY2soQmFzaQogICAgIEFTU0VSVChiYXNpY0Jsb2NrLT52YXJpYWJsZXNB
dFRhaWwubnVtYmVyT2ZMb2NhbHMoKSA9PSBiYXNpY0Jsb2NrLT52YWx1ZXNBdFRhaWwubnVtYmVy
T2ZMb2NhbHMoKSk7CiAgICAgQVNTRVJUKGJhc2ljQmxvY2stPnZhcmlhYmxlc0F0SGVhZC5udW1i
ZXJPZkxvY2FscygpID09IGJhc2ljQmxvY2stPnZhcmlhYmxlc0F0VGFpbC5udW1iZXJPZkxvY2Fs
cygpKTsKICAgICAKLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGJhc2ljQmxvY2stPmVuZCAt
IGJhc2ljQmxvY2stPmJlZ2luOyArK2kpCi0gICAgICAgIG1fbm9kZXNbaV0uY2xlYXIoKTsKKyAg
ICBtX25vZGVzLmNsZWFyKCk7CiAgICAgbV92YXJpYWJsZXMgPSBiYXNpY0Jsb2NrLT52YWx1ZXNB
dEhlYWQ7CiAgICAgbV9oYXZlU3RydWN0dXJlcyA9IGZhbHNlOwogICAgIGZvciAoc2l6ZV90IGkg
PSAwOyBpIDwgbV92YXJpYWJsZXMubnVtYmVyT2ZBcmd1bWVudHMoKTsgKytpKSB7CkBAIC0yMTUs
MTIgKzIwNywxMyBAQCB2b2lkIEFic3RyYWN0U3RhdGU6OnJlc2V0KCkKICAgICBtX2lzVmFsaWQg
PSBmYWxzZTsKIH0KIAotYm9vbCBBYnN0cmFjdFN0YXRlOjpleGVjdXRlKE5vZGVJbmRleCBub2Rl
SW5kZXgpCitib29sIEFic3RyYWN0U3RhdGU6OmV4ZWN1dGUodW5zaWduZWQgaW5kZXhJbkJsb2Nr
KQogewogICAgIFBST0ZJTEUoRkxBR19GT1JfRVhFQ1VUSU9OKTsKICAgICBBU1NFUlQobV9ibG9j
ayk7CiAgICAgQVNTRVJUKG1faXNWYWxpZCk7CiAgICAgICAgIAorICAgIE5vZGVJbmRleCBub2Rl
SW5kZXggPSBtX2Jsb2NrLT5hdChpbmRleEluQmxvY2spOwogICAgIE5vZGUmIG5vZGUgPSBtX2dy
YXBoW25vZGVJbmRleF07CiAgICAgICAgIAogICAgIGlmICghbm9kZS5zaG91bGRHZW5lcmF0ZSgp
KQpAQCAtMzE5LDcgKzMxMiw3IEBAIGJvb2wgQWJzdHJhY3RTdGF0ZTo6ZXhlY3V0ZShOb2RlSW5k
ZXggbm8KICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAgICAgICAgIGlmIChub2RlLm9w
ID09IFZhbHVlQWRkKSB7Ci0gICAgICAgICAgICBjbG9iYmVyU3RydWN0dXJlcyhub2RlSW5kZXgp
OworICAgICAgICAgICAgY2xvYmJlclN0cnVjdHVyZXMoaW5kZXhJbkJsb2NrKTsKICAgICAgICAg
ICAgIGZvck5vZGUobm9kZUluZGV4KS5zZXQoUHJlZGljdFN0cmluZyB8IFByZWRpY3RJbnQzMiB8
IFByZWRpY3ROdW1iZXIpOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KQEAgLTQwOSw3
ICs0MDIsNyBAQCBib29sIEFic3RyYWN0U3RhdGU6OmV4ZWN1dGUoTm9kZUluZGV4IG5vCiAgICAg
ICAgIGVsc2UgaWYgKGNoaWxkLnNob3VsZFNwZWN1bGF0ZU51bWJlcigpKQogICAgICAgICAgICAg
Zm9yTm9kZShub2RlLmNoaWxkMSgpKS5maWx0ZXIoUHJlZGljdE51bWJlcik7CiAgICAgICAgIGVs
c2UKLSAgICAgICAgICAgIGNsb2JiZXJTdHJ1Y3R1cmVzKG5vZGVJbmRleCk7CisgICAgICAgICAg
ICBjbG9iYmVyU3RydWN0dXJlcyhpbmRleEluQmxvY2spOwogICAgICAgICBmb3JOb2RlKG5vZGVJ
bmRleCkuc2V0KFByZWRpY3RCb29sZWFuKTsKICAgICAgICAgYnJlYWs7CiAgICAgfQpAQCAtNDMy
LDcgKzQyNSw3IEBAIGJvb2wgQWJzdHJhY3RTdGF0ZTo6ZXhlY3V0ZShOb2RlSW5kZXggbm8KICAg
ICAgICAgICAgIGZpbHRlciA9IFByZWRpY3RBcnJheTsKICAgICAgICAgZWxzZSB7CiAgICAgICAg
ICAgICBmaWx0ZXIgPSBQcmVkaWN0VG9wOwotICAgICAgICAgICAgY2xvYmJlclN0cnVjdHVyZXMo
bm9kZUluZGV4KTsKKyAgICAgICAgICAgIGNsb2JiZXJTdHJ1Y3R1cmVzKGluZGV4SW5CbG9jayk7
CiAgICAgICAgIH0KICAgICAgICAgZm9yTm9kZShub2RlLmNoaWxkMSgpKS5maWx0ZXIoZmlsdGVy
KTsKICAgICAgICAgZm9yTm9kZShub2RlLmNoaWxkMigpKS5maWx0ZXIoZmlsdGVyKTsKQEAgLTQ2
Miw3ICs0NTUsNyBAQCBib29sIEFic3RyYWN0U3RhdGU6OmV4ZWN1dGUoTm9kZUluZGV4IG5vCiAg
ICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogICAgICAgICBpZiAoIWlzQWN0aW9uYWJsZUFy
cmF5UHJlZGljdGlvbihtX2dyYXBoW25vZGUuY2hpbGQxKCldLnByZWRpY3Rpb24oKSkgfHwgIW1f
Z3JhcGhbbm9kZS5jaGlsZDIoKV0uc2hvdWxkU3BlY3VsYXRlSW50ZWdlcigpKSB7Ci0gICAgICAg
ICAgICBjbG9iYmVyU3RydWN0dXJlcyhub2RlSW5kZXgpOworICAgICAgICAgICAgY2xvYmJlclN0
cnVjdHVyZXMoaW5kZXhJbkJsb2NrKTsKICAgICAgICAgICAgIGZvck5vZGUobm9kZUluZGV4KS5t
YWtlVG9wKCk7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQpAQCAtNTQ4LDcgKzU0MSw3
IEBAIGJvb2wgQWJzdHJhY3RTdGF0ZTo6ZXhlY3V0ZShOb2RlSW5kZXggbm8KICAgICAgICAgfQog
ICAgICAgICBpZiAoIW1fZ3JhcGhbbm9kZS5jaGlsZDIoKV0uc2hvdWxkU3BlY3VsYXRlSW50ZWdl
cigpIHx8ICFpc0FjdGlvbmFibGVNdXRhYmxlQXJyYXlQcmVkaWN0aW9uKG1fZ3JhcGhbbm9kZS5j
aGlsZDEoKV0ucHJlZGljdGlvbigpKSkgewogICAgICAgICAgICAgQVNTRVJUKG5vZGUub3AgPT0g
UHV0QnlWYWwpOwotICAgICAgICAgICAgY2xvYmJlclN0cnVjdHVyZXMobm9kZUluZGV4KTsKKyAg
ICAgICAgICAgIGNsb2JiZXJTdHJ1Y3R1cmVzKGluZGV4SW5CbG9jayk7CiAgICAgICAgICAgICBm
b3JOb2RlKG5vZGVJbmRleCkubWFrZVRvcCgpOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAg
IH0KQEAgLTc2Niw3ICs3NTksNyBAQCBib29sIEFic3RyYWN0U3RhdGU6OmV4ZWN1dGUoTm9kZUlu
ZGV4IG5vCiAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgCiAgICAgY2FzZSBQdXRTY29wZWRW
YXI6Ci0gICAgICAgIGNsb2JiZXJTdHJ1Y3R1cmVzKG5vZGVJbmRleCk7CisgICAgICAgIGNsb2Ji
ZXJTdHJ1Y3R1cmVzKGluZGV4SW5CbG9jayk7CiAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAg
CiAgICAgY2FzZSBHZXRCeUlkOgpAQCAtNzc3LDcgKzc3MCw3IEBAIGJvb2wgQWJzdHJhY3RTdGF0
ZTo6ZXhlY3V0ZShOb2RlSW5kZXggbm8KICAgICAgICAgfQogICAgICAgICBpZiAoaXNDZWxsUHJl
ZGljdGlvbihtX2dyYXBoW25vZGUuY2hpbGQxKCldLnByZWRpY3Rpb24oKSkpCiAgICAgICAgICAg
ICBmb3JOb2RlKG5vZGUuY2hpbGQxKCkpLmZpbHRlcihQcmVkaWN0Q2VsbCk7Ci0gICAgICAgIGNs
b2JiZXJTdHJ1Y3R1cmVzKG5vZGVJbmRleCk7CisgICAgICAgIGNsb2JiZXJTdHJ1Y3R1cmVzKGlu
ZGV4SW5CbG9jayk7CiAgICAgICAgIGZvck5vZGUobm9kZUluZGV4KS5tYWtlVG9wKCk7CiAgICAg
ICAgIGJyZWFrOwogICAgICAgICAgICAgCkBAIC04MzksNyArODMyLDcgQEAgYm9vbCBBYnN0cmFj
dFN0YXRlOjpleGVjdXRlKE5vZGVJbmRleCBubwogICAgICAgICBicmVhazsKICAgICAgICAgICAg
IAogICAgIGNhc2UgUHV0U3RydWN0dXJlOgotICAgICAgICBjbG9iYmVyU3RydWN0dXJlcyhub2Rl
SW5kZXgpOworICAgICAgICBjbG9iYmVyU3RydWN0dXJlcyhpbmRleEluQmxvY2spOwogICAgICAg
ICBmb3JOb2RlKG5vZGUuY2hpbGQxKCkpLnNldChub2RlLnN0cnVjdHVyZVRyYW5zaXRpb25EYXRh
KCkubmV3U3RydWN0dXJlKTsKICAgICAgICAgbV9oYXZlU3RydWN0dXJlcyA9IHRydWU7CiAgICAg
ICAgIGJyZWFrOwpAQCAtOTMwLDcgKzkyMyw3IEBAIGJvb2wgQWJzdHJhY3RTdGF0ZTo6ZXhlY3V0
ZShOb2RlSW5kZXggbm8KICAgICBjYXNlIFB1dEJ5SWQ6CiAgICAgY2FzZSBQdXRCeUlkRGlyZWN0
OgogICAgICAgICBmb3JOb2RlKG5vZGUuY2hpbGQxKCkpLmZpbHRlcihQcmVkaWN0Q2VsbCk7Ci0g
ICAgICAgIGNsb2JiZXJTdHJ1Y3R1cmVzKG5vZGVJbmRleCk7CisgICAgICAgIGNsb2JiZXJTdHJ1
Y3R1cmVzKGluZGV4SW5CbG9jayk7CiAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgCiAgICAg
Y2FzZSBHZXRHbG9iYWxWYXI6CkBAIC05NjYsNyArOTU5LDcgQEAgYm9vbCBBYnN0cmFjdFN0YXRl
OjpleGVjdXRlKE5vZGVJbmRleCBubwogICAgIGNhc2UgUmVzb2x2ZUJhc2U6CiAgICAgY2FzZSBS
ZXNvbHZlQmFzZVN0cmljdFB1dDoKICAgICBjYXNlIFJlc29sdmVHbG9iYWw6Ci0gICAgICAgIGNs
b2JiZXJTdHJ1Y3R1cmVzKG5vZGVJbmRleCk7CisgICAgICAgIGNsb2JiZXJTdHJ1Y3R1cmVzKGlu
ZGV4SW5CbG9jayk7CiAgICAgICAgIGZvck5vZGUobm9kZUluZGV4KS5tYWtlVG9wKCk7CiAgICAg
ICAgIGJyZWFrOwogICAgICAgICAgICAgCkBAIC05ODMsMTMgKzk3NiwxMyBAQCBib29sIEFic3Ry
YWN0U3RhdGU6OmV4ZWN1dGUoTm9kZUluZGV4IG5vCiAgICAgcmV0dXJuIG1faXNWYWxpZDsKIH0K
IAotaW5saW5lIHZvaWQgQWJzdHJhY3RTdGF0ZTo6Y2xvYmJlclN0cnVjdHVyZXMoTm9kZUluZGV4
IG5vZGVJbmRleCkKK2lubGluZSB2b2lkIEFic3RyYWN0U3RhdGU6OmNsb2JiZXJTdHJ1Y3R1cmVz
KHVuc2lnbmVkIGluZGV4SW5CbG9jaykKIHsKICAgICBQUk9GSUxFKEZMQUdfRk9SX1NUUlVDVFVS
RV9DTE9CQkVSSU5HKTsKICAgICBpZiAoIW1faGF2ZVN0cnVjdHVyZXMpCiAgICAgICAgIHJldHVy
bjsKLSAgICBmb3IgKHNpemVfdCBpID0gbm9kZUluZGV4IC0gbV9ibG9jay0+YmVnaW4gKyAxOyBp
LS0gPiAwOykKLSAgICAgICAgbV9ub2Rlc1tpXS5jbG9iYmVyU3RydWN0dXJlcygpOworICAgIGZv
ciAoc2l6ZV90IGkgPSBpbmRleEluQmxvY2sgKyAxOyBpLS0gPiAwOykKKyAgICAgICAgZm9yTm9k
ZShtX2Jsb2NrLT5hdChpKSkuY2xvYmJlclN0cnVjdHVyZXMoKTsKICAgICBmb3IgKHNpemVfdCBp
ID0gMDsgaSA8IG1fdmFyaWFibGVzLm51bWJlck9mQXJndW1lbnRzKCk7ICsraSkKICAgICAgICAg
bV92YXJpYWJsZXMuYXJndW1lbnQoaSkuY2xvYmJlclN0cnVjdHVyZXMoKTsKICAgICBmb3IgKHNp
emVfdCBpID0gMDsgaSA8IG1fdmFyaWFibGVzLm51bWJlck9mTG9jYWxzKCk7ICsraSkKQEAgLTEx
MDgsNyArMTEwMSw3IEBAIGlubGluZSBib29sIEFic3RyYWN0U3RhdGU6Om1lcmdlVG9TdWNjZXMK
IHsKICAgICBQUk9GSUxFKEZMQUdfRk9SX01FUkdFX1RPX1NVQ0NFU1NPUlMpOwogCi0gICAgTm9k
ZSYgdGVybWluYWwgPSBncmFwaFtiYXNpY0Jsb2NrLT5lbmQgLSAxXTsKKyAgICBOb2RlJiB0ZXJt
aW5hbCA9IGdyYXBoW2Jhc2ljQmxvY2stPmxhc3QoKV07CiAgICAgCiAgICAgQVNTRVJUKHRlcm1p
bmFsLmlzVGVybWluYWwoKSk7CiAgICAgCkBAIC0xMTQ3LDE1ICsxMTQwLDE3IEBAIGlubGluZSBi
b29sIEFic3RyYWN0U3RhdGU6Om1lcmdlVmFyaWFibGUKIHZvaWQgQWJzdHJhY3RTdGF0ZTo6ZHVt
cChGSUxFKiBvdXQpCiB7CiAgICAgYm9vbCBmaXJzdCA9IHRydWU7Ci0gICAgZm9yIChzaXplX3Qg
aSA9IDA7IGkgPCBtX25vZGVzLnNpemUoKTsgKytpKSB7Ci0gICAgICAgIGlmIChtX25vZGVzW2ld
LmlzQ2xlYXIoKSkKKyAgICBmb3IgKE1hcDo6aXRlcmF0b3IgaXRlciA9IG1fbm9kZXMuYmVnaW4o
KTsgaXRlciAhPSBtX25vZGVzLmVuZCgpOyArK2l0ZXIpIHsKKyAgICAgICAgTm9kZUluZGV4IGlu
ZGV4ID0gaXRlci0+Zmlyc3Q7CisgICAgICAgIEFic3RyYWN0VmFsdWUmIHZhbHVlID0gaXRlci0+
c2Vjb25kOworICAgICAgICBpZiAodmFsdWUuaXNDbGVhcigpKQogICAgICAgICAgICAgY29udGlu
dWU7CiAgICAgICAgIGlmIChmaXJzdCkKICAgICAgICAgICAgIGZpcnN0ID0gZmFsc2U7CiAgICAg
ICAgIGVsc2UKICAgICAgICAgICAgIGZwcmludGYob3V0LCAiICIpOwotICAgICAgICBmcHJpbnRm
KG91dCwgIkAlbHU6Iiwgc3RhdGljX2Nhc3Q8dW5zaWduZWQgbG9uZz4oaSArIG1fYmxvY2stPmJl
Z2luKSk7Ci0gICAgICAgIG1fbm9kZXNbaV0uZHVtcChvdXQpOworICAgICAgICBmcHJpbnRmKG91
dCwgIkAlbHU6Iiwgc3RhdGljX2Nhc3Q8dW5zaWduZWQgbG9uZz4oaW5kZXgpKTsKKyAgICAgICAg
dmFsdWUuZHVtcChvdXQpOwogICAgIH0KIH0KICNlbmRpZgpJbmRleDogU291cmNlL0phdmFTY3Jp
cHRDb3JlL2RmZy9ERkdBYnN0cmFjdFN0YXRlLmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL0phdmFT
Y3JpcHRDb3JlL2RmZy9ERkdBYnN0cmFjdFN0YXRlLmgJKHJldmlzaW9uIDEwOTIwNykKKysrIFNv
dXJjZS9KYXZhU2NyaXB0Q29yZS9kZmcvREZHQWJzdHJhY3RTdGF0ZS5oCSh3b3JraW5nIGNvcHkp
CkBAIC03OSw2ICs3OSw4IEBAIHN0cnVjdCBCYXNpY0Jsb2NrOwogCiBjbGFzcyBBYnN0cmFjdFN0
YXRlIHsKIHB1YmxpYzoKKyAgICB0eXBlZGVmIEhhc2hNYXA8Tm9kZUluZGV4LCBBYnN0cmFjdFZh
bHVlLCBXVEY6OkludEhhc2g8Tm9kZUluZGV4PiwgV1RGOjpVbnNpZ25lZFdpdGhaZXJvS2V5SGFz
aFRyYWl0czxOb2RlSW5kZXg+ID4gTWFwOworCiAgICAgZW51bSBNZXJnZU1vZGUgewogICAgICAg
ICAvLyBEb24ndCBtZXJnZSB0aGUgc3RhdGUgaW4gQWJzdHJhY3RTdGF0ZSB3aXRoIGJhc2ljIGJs
b2Nrcy4KICAgICAgICAgRG9udE1lcmdlLApAQCAtOTgsNyArMTAwLDEzIEBAIHB1YmxpYzoKICAg
ICAKICAgICBBYnN0cmFjdFZhbHVlJiBmb3JOb2RlKE5vZGVJbmRleCBub2RlSW5kZXgpCiAgICAg
ewotICAgICAgICByZXR1cm4gbV9ub2Rlc1tub2RlSW5kZXggLSBtX2Jsb2NrLT5iZWdpbl07Cisg
ICAgICAgIE1hcDo6aXRlcmF0b3IgaXRlciA9IG1fbm9kZXMuZmluZChub2RlSW5kZXgpOworICAg
ICAgICBpZiAoaXRlciAhPSBtX25vZGVzLmVuZCgpKQorICAgICAgICAgICAgcmV0dXJuIGl0ZXIt
PnNlY29uZDsKKworICAgICAgICBBYnN0cmFjdFZhbHVlIHZhbHVlOworICAgICAgICBwYWlyPE1h
cDo6aXRlcmF0b3IsIGJvb2w+IHJlc3VsdCA9IG1fbm9kZXMuYWRkKG5vZGVJbmRleCwgdmFsdWUp
OworICAgICAgICByZXR1cm4gcmVzdWx0LmZpcnN0LT5zZWNvbmQ7CiAgICAgfQogICAgIAogICAg
IEFic3RyYWN0VmFsdWUmIGZvck5vZGUoTm9kZVVzZSBub2RlVXNlKQpAQCAtMTUyLDcgKzE2MCw3
IEBAIHB1YmxpYzoKICAgICAvLyBpZiBleGVjdXRpb24gc2hvdWxkIGNvbnRpbnVlIHBhc3QgdGhp
cyBub2RlLiBOb3RhYmx5LCBpdCB3aWxsIHJldHVybiB0cnVlCiAgICAgLy8gZm9yIGJsb2NrIHRl
cm1pbmFscywgc28gbG9uZyBhcyB0aG9zZSB0ZXJtaW5hbHMgYXJlIG5vdCBSZXR1cm4gb3IgdmFy
aWFudHMKICAgICAvLyBvZiBUaHJvdy4KLSAgICBib29sIGV4ZWN1dGUoTm9kZUluZGV4KTsKKyAg
ICBib29sIGV4ZWN1dGUodW5zaWduZWQpOwogICAgIAogICAgIC8vIElzIHRoZSBleGVjdXRpb24g
c3RhdGUgc3RpbGwgdmFsaWQ/IFRoaXMgd2lsbCBiZSBmYWxzZSBpZiBleGVjdXRlKCkgaGFzCiAg
ICAgLy8gcmV0dXJuZWQgZmFsc2UgcHJldmlvdXNseS4KQEAgLTE3Niw3ICsxODQsNyBAQCBwdWJs
aWM6CiAjZW5kaWYKICAgICAKIHByaXZhdGU6Ci0gICAgdm9pZCBjbG9iYmVyU3RydWN0dXJlcyhO
b2RlSW5kZXgpOworICAgIHZvaWQgY2xvYmJlclN0cnVjdHVyZXModW5zaWduZWQpOwogICAgIAog
ICAgIGJvb2wgbWVyZ2VTdGF0ZUF0VGFpbChBYnN0cmFjdFZhbHVlJiBkZXN0aW5hdGlvbiwgQWJz
dHJhY3RWYWx1ZSYgaW5WYXJpYWJsZSwgTm9kZUluZGV4KTsKICAgICAKQEAgLTE4NSw3ICsxOTMs
NyBAQCBwcml2YXRlOgogICAgIENvZGVCbG9jayogbV9jb2RlQmxvY2s7CiAgICAgR3JhcGgmIG1f
Z3JhcGg7CiAgICAgCi0gICAgVmVjdG9yPEFic3RyYWN0VmFsdWUsIDMyPiBtX25vZGVzOworICAg
IE1hcCBtX25vZGVzOwogICAgIE9wZXJhbmRzPEFic3RyYWN0VmFsdWU+IG1fdmFyaWFibGVzOwog
ICAgIEJhc2ljQmxvY2sqIG1fYmxvY2s7CiAgICAgYm9vbCBtX2hhdmVTdHJ1Y3R1cmVzOwpJbmRl
eDogU291cmNlL0phdmFTY3JpcHRDb3JlL2RmZy9ERkdBcml0aE5vZGVGbGFnc0luZmVyZW5jZVBo
YXNlLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvZGZnL0RGR0FyaXRo
Tm9kZUZsYWdzSW5mZXJlbmNlUGhhc2UuY3BwCShyZXZpc2lvbiAxMDkyMDcpCisrKyBTb3VyY2Uv
SmF2YVNjcmlwdENvcmUvZGZnL0RGR0FyaXRoTm9kZUZsYWdzSW5mZXJlbmNlUGhhc2UuY3BwCSh3
b3JraW5nIGNvcHkpCkBAIC0yMjIsNiArMjIyLDkgQEAgcHJpdmF0ZToKICAgICAKICAgICBOb2Rl
SW5kZXggbV9jb21waWxlSW5kZXg7CiAgICAgYm9vbCBtX2NoYW5nZWQ7CisjaWYgREZHX0VOQUJM
RShERUJVR19QUk9QQUdBVElPTl9WRVJCT1NFKQorICAgIHVuc2lnbmVkIG1fY291bnQ7CisjZW5k
aWYKIH07CiAKIHZvaWQgcGVyZm9ybUFyaXRoTm9kZUZsYWdzSW5mZXJlbmNlKEdyYXBoJiBncmFw
aCkKSW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9kZmcvREZHQmFzaWNCbG9jay5oCj09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9kZmcvREZHQmFzaWNCbG9jay5oCShyZXZp
c2lvbiAxMDkyMDcpCisrKyBTb3VyY2UvSmF2YVNjcmlwdENvcmUvZGZnL0RGR0Jhc2ljQmxvY2su
aAkod29ya2luZyBjb3B5KQpAQCAtMzgsMTEgKzM4LDkgQEAgbmFtZXNwYWNlIEpTQyB7IG5hbWVz
cGFjZSBERkcgewogCiB0eXBlZGVmIFZlY3RvciA8QmxvY2tJbmRleCwgMj4gUHJlZGVjZXNzb3JM
aXN0OwogCi1zdHJ1Y3QgQmFzaWNCbG9jayB7Ci0gICAgQmFzaWNCbG9jayh1bnNpZ25lZCBieXRl
Y29kZUJlZ2luLCBOb2RlSW5kZXggYmVnaW4sIHVuc2lnbmVkIG51bUFyZ3VtZW50cywgdW5zaWdu
ZWQgbnVtTG9jYWxzKQorc3RydWN0IEJhc2ljQmxvY2sgOiBWZWN0b3I8Tm9kZUluZGV4LCA4PiB7
CisgICAgQmFzaWNCbG9jayh1bnNpZ25lZCBieXRlY29kZUJlZ2luLCB1bnNpZ25lZCBudW1Bcmd1
bWVudHMsIHVuc2lnbmVkIG51bUxvY2FscykKICAgICAgICAgOiBieXRlY29kZUJlZ2luKGJ5dGVj
b2RlQmVnaW4pCi0gICAgICAgICwgYmVnaW4oYmVnaW4pCi0gICAgICAgICwgZW5kKE5vTm9kZSkK
ICAgICAgICAgLCBpc09TUlRhcmdldChmYWxzZSkKICAgICAgICAgLCBjZmFIYXNWaXNpdGVkKGZh
bHNlKQogICAgICAgICAsIGNmYVNob3VsZFJldmlzaXQoZmFsc2UpCkBAIC01MCw2ICs0OCw3IEBA
IHN0cnVjdCBCYXNpY0Jsb2NrIHsKICAgICAgICAgLCBpc0xpbmtlZChmYWxzZSkKICNlbmRpZgog
ICAgICAgICAsIGlzUmVhY2hhYmxlKGZhbHNlKQorICAgICAgICAsIHN0YXJ0RXhjbHVkaW5nUGhp
cygwKQogICAgICAgICAsIHZhcmlhYmxlc0F0SGVhZChudW1Bcmd1bWVudHMsIG51bUxvY2FscykK
ICAgICAgICAgLCB2YXJpYWJsZXNBdFRhaWwobnVtQXJndW1lbnRzLCBudW1Mb2NhbHMpCiAgICAg
ICAgICwgdmFsdWVzQXRIZWFkKG51bUFyZ3VtZW50cywgbnVtTG9jYWxzKQpAQCAtNjksOCArNjgs
NiBAQCBzdHJ1Y3QgQmFzaWNCbG9jayB7CiAgICAgLy8gZm9yIG90aGVyIHB1cnBvc2VzIGR1ZSB0
byBpbmxpbmluZy4KICAgICB1bnNpZ25lZCBieXRlY29kZUJlZ2luOwogICAgIAotICAgIE5vZGVJ
bmRleCBiZWdpbjsKLSAgICBOb2RlSW5kZXggZW5kOwogICAgIGJvb2wgaXNPU1JUYXJnZXQ7CiAg
ICAgYm9vbCBjZmFIYXNWaXNpdGVkOwogICAgIGJvb2wgY2ZhU2hvdWxkUmV2aXNpdDsKQEAgLTc4
LDYgKzc1LDcgQEAgc3RydWN0IEJhc2ljQmxvY2sgewogICAgIGJvb2wgaXNMaW5rZWQ7CiAjZW5k
aWYKICAgICBib29sIGlzUmVhY2hhYmxlOworICAgIHVuc2lnbmVkIHN0YXJ0RXhjbHVkaW5nUGhp
czsKICAgICAKICAgICBQcmVkZWNlc3Nvckxpc3QgbV9wcmVkZWNlc3NvcnM7CiAgICAgCkluZGV4
OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUvZGZnL0RGR0J5dGVDb2RlUGFyc2VyLmNwcAo9PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvZGZnL0RGR0J5dGVDb2RlUGFyc2VyLmNwcAko
cmV2aXNpb24gMTA5MjA3KQorKysgU291cmNlL0phdmFTY3JpcHRDb3JlL2RmZy9ERkdCeXRlQ29k
ZVBhcnNlci5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTU2OSw2ICs1NjksNyBAQCBwcml2YXRlOgog
ICAgIHsKICAgICAgICAgTm9kZUluZGV4IHJlc3VsdEluZGV4ID0gKE5vZGVJbmRleCltX2dyYXBo
LnNpemUoKTsKICAgICAgICAgbV9ncmFwaC5hcHBlbmQoTm9kZShvcCwgY3VycmVudENvZGVPcmln
aW4oKSwgY2hpbGQxLCBjaGlsZDIsIGNoaWxkMykpOworICAgICAgICBtX2N1cnJlbnRCbG9jay0+
YXBwZW5kKHJlc3VsdEluZGV4KTsKIAogICAgICAgICBpZiAob3AgJiBOb2RlTXVzdEdlbmVyYXRl
KQogICAgICAgICAgICAgbV9ncmFwaC5yZWYocmVzdWx0SW5kZXgpOwpAQCAtNTc4LDYgKzU3OSw3
IEBAIHByaXZhdGU6CiAgICAgewogICAgICAgICBOb2RlSW5kZXggcmVzdWx0SW5kZXggPSAoTm9k
ZUluZGV4KW1fZ3JhcGguc2l6ZSgpOwogICAgICAgICBtX2dyYXBoLmFwcGVuZChOb2RlKG9wLCBj
dXJyZW50Q29kZU9yaWdpbigpLCBpbmZvLCBjaGlsZDEsIGNoaWxkMiwgY2hpbGQzKSk7CisgICAg
ICAgIG1fY3VycmVudEJsb2NrLT5hcHBlbmQocmVzdWx0SW5kZXgpOwogCiAgICAgICAgIGlmIChv
cCAmIE5vZGVNdXN0R2VuZXJhdGUpCiAgICAgICAgICAgICBtX2dyYXBoLnJlZihyZXN1bHRJbmRl
eCk7CkBAIC01ODcsNiArNTg5LDcgQEAgcHJpdmF0ZToKICAgICB7CiAgICAgICAgIE5vZGVJbmRl
eCByZXN1bHRJbmRleCA9IChOb2RlSW5kZXgpbV9ncmFwaC5zaXplKCk7CiAgICAgICAgIG1fZ3Jh
cGguYXBwZW5kKE5vZGUob3AsIGN1cnJlbnRDb2RlT3JpZ2luKCksIGluZm8xLCBpbmZvMiwgY2hp
bGQxLCBjaGlsZDIsIGNoaWxkMykpOworICAgICAgICBtX2N1cnJlbnRCbG9jay0+YXBwZW5kKHJl
c3VsdEluZGV4KTsKIAogICAgICAgICBpZiAob3AgJiBOb2RlTXVzdEdlbmVyYXRlKQogICAgICAg
ICAgICAgbV9ncmFwaC5yZWYocmVzdWx0SW5kZXgpOwpAQCAtNTk3LDYgKzYwMCw3IEBAIHByaXZh
dGU6CiAgICAgewogICAgICAgICBOb2RlSW5kZXggcmVzdWx0SW5kZXggPSAoTm9kZUluZGV4KW1f
Z3JhcGguc2l6ZSgpOwogICAgICAgICBtX2dyYXBoLmFwcGVuZChOb2RlKE5vZGU6OlZhckFyZywg
b3AsIGN1cnJlbnRDb2RlT3JpZ2luKCksIGluZm8xLCBpbmZvMiwgbV9ncmFwaC5tX3ZhckFyZ0No
aWxkcmVuLnNpemUoKSAtIG1fbnVtUGFzc2VkVmFyQXJncywgbV9udW1QYXNzZWRWYXJBcmdzKSk7
CisgICAgICAgIG1fY3VycmVudEJsb2NrLT5hcHBlbmQocmVzdWx0SW5kZXgpOwogICAgICAgICAK
ICAgICAgICAgbV9udW1QYXNzZWRWYXJBcmdzID0gMDsKICAgICAgICAgCkBAIC02MDQsNiArNjA4
LDE3IEBAIHByaXZhdGU6CiAgICAgICAgICAgICBtX2dyYXBoLnJlZihyZXN1bHRJbmRleCk7CiAg
ICAgICAgIHJldHVybiByZXN1bHRJbmRleDsKICAgICB9CisKKyAgICBOb2RlSW5kZXggaW5zZXJ0
UGhpTm9kZShPcEluZm8gaW5mbywgQmFzaWNCbG9jayogYmxvY2spCisgICAgeworICAgICAgICBO
b2RlSW5kZXggcmVzdWx0SW5kZXggPSAoTm9kZUluZGV4KW1fZ3JhcGguc2l6ZSgpOworICAgICAg
ICBtX2dyYXBoLmFwcGVuZChOb2RlKFBoaSwgY3VycmVudENvZGVPcmlnaW4oKSwgaW5mbykpOwor
ICAgICAgICBibG9jay0+cHJlcGVuZChyZXN1bHRJbmRleCk7CisgICAgICAgICsrYmxvY2stPnN0
YXJ0RXhjbHVkaW5nUGhpczsKKworICAgICAgICByZXR1cm4gcmVzdWx0SW5kZXg7CisgICAgfQor
CiAgICAgdm9pZCBhZGRWYXJBcmdDaGlsZChOb2RlSW5kZXggY2hpbGQpCiAgICAgewogICAgICAg
ICBtX2dyYXBoLm1fdmFyQXJnQ2hpbGRyZW4uYXBwZW5kKE5vZGVVc2UoY2hpbGQpKTsKQEAgLTEx
NjksNyArMTE4NCw3IEBAIGJvb2wgQnl0ZUNvZGVQYXJzZXI6OmhhbmRsZUlubGluaW5nKGJvb2wK
ICAgICAvLyB0aGUgY2FsbGVyIHRvIGNvbnRpbnVlIGluIHdoYXRldmVyIGJhc2ljIGJsb2NrIHdl
J3JlIGluIHJpZ2h0IG5vdy4KICAgICBpZiAoIWlubGluZVN0YWNrRW50cnkubV9kaWRFYXJseVJl
dHVybiAmJiBpbmxpbmVTdGFja0VudHJ5Lm1fZGlkUmV0dXJuKSB7CiAgICAgICAgIEJhc2ljQmxv
Y2sqIGxhc3RCbG9jayA9IG1fZ3JhcGgubV9ibG9ja3MubGFzdCgpLmdldCgpOwotICAgICAgICBB
U1NFUlQobGFzdEJsb2NrLT5iZWdpbiA9PSBsYXN0QmxvY2stPmVuZCB8fCAhbV9ncmFwaC5sYXN0
KCkuaXNUZXJtaW5hbCgpKTsKKyAgICAgICAgQVNTRVJUKGxhc3RCbG9jay0+aXNFbXB0eSgpIHx8
ICFtX2dyYXBoLmxhc3QoKS5pc1Rlcm1pbmFsKCkpOwogICAgICAgICAKICAgICAgICAgLy8gSWYg
d2UgY3JlYXRlZCBuZXcgYmxvY2tzIHRoZW4gdGhlIGxhc3QgYmxvY2sgbmVlZHMgbGlua2luZywg
YnV0IGluIHRoZQogICAgICAgICAvLyBjYWxsZXIuIEl0IGRvZXNuJ3QgbmVlZCB0byBiZSBsaW5r
ZWQgdG8sIGJ1dCBpdCBuZWVkcyBvdXRnb2luZyBsaW5rcy4KQEAgLTEyMDEsNyArMTIxNiw3IEBA
IGJvb2wgQnl0ZUNvZGVQYXJzZXI6OmhhbmRsZUlubGluaW5nKGJvb2wKICAgICAgICAgICAgIGNv
bnRpbnVlOwogICAgICAgICBCYXNpY0Jsb2NrKiBibG9jayA9IG1fZ3JhcGgubV9ibG9ja3NbaW5s
aW5lU3RhY2tFbnRyeS5tX3VubGlua2VkQmxvY2tzW2ldLm1fYmxvY2tJbmRleF0uZ2V0KCk7CiAg
ICAgICAgIEFTU0VSVCghYmxvY2stPmlzTGlua2VkKTsKLSAgICAgICAgTm9kZSYgbm9kZSA9IG1f
Z3JhcGhbYmxvY2stPmVuZCAtIDFdOworICAgICAgICBOb2RlJiBub2RlID0gbV9ncmFwaFtibG9j
ay0+bGFzdCgpXTsKICAgICAgICAgQVNTRVJUKG5vZGUub3AgPT0gSnVtcCk7CiAgICAgICAgIEFT
U0VSVChub2RlLnRha2VuQmxvY2tJbmRleCgpID09IE5vQmxvY2spOwogICAgICAgICBub2RlLnNl
dFRha2VuQmxvY2tJbmRleChtX2dyYXBoLm1fYmxvY2tzLnNpemUoKSk7CkBAIC0xMjEyLDcgKzEy
MjcsNyBAQCBib29sIEJ5dGVDb2RlUGFyc2VyOjpoYW5kbGVJbmxpbmluZyhib29sCiAgICAgfQog
ICAgIAogICAgIC8vIE5lZWQgdG8gY3JlYXRlIGEgbmV3IGJhc2ljIGJsb2NrIGZvciB0aGUgY29u
dGludWF0aW9uIGF0IHRoZSBjYWxsZXIuCi0gICAgT3duUHRyPEJhc2ljQmxvY2s+IGJsb2NrID0g
YWRvcHRQdHIobmV3IEJhc2ljQmxvY2sobmV4dE9mZnNldCwgbV9ncmFwaC5zaXplKCksIG1fbnVt
QXJndW1lbnRzLCBtX251bUxvY2FscykpOworICAgIE93blB0cjxCYXNpY0Jsb2NrPiBibG9jayA9
IGFkb3B0UHRyKG5ldyBCYXNpY0Jsb2NrKG5leHRPZmZzZXQsIG1fbnVtQXJndW1lbnRzLCBtX251
bUxvY2FscykpOwogI2lmIERGR19FTkFCTEUoREVCVUdfVkVSQk9TRSkKICAgICBkYXRhTG9nKCJD
cmVhdGluZyBpbmxpbmUgZXBpbG9ndWUgYmFzaWMgYmxvY2sgJXAsICMlenUgZm9yICVwIGJjIyV1
IGF0IGlubGluZSBkZXB0aCAldS5cbiIsIGJsb2NrLmdldCgpLCBtX2dyYXBoLm1fYmxvY2tzLnNp
emUoKSwgbV9pbmxpbmVTdGFja1RvcC0+ZXhlY3V0YWJsZSgpLCBtX2N1cnJlbnRJbmRleCwgQ29k
ZU9yaWdpbjo6aW5saW5lRGVwdGhGb3JDYWxsRnJhbWUobV9pbmxpbmVTdGFja1RvcC0+bV9pbmxp
bmVDYWxsRnJhbWUpKTsKICNlbmRpZgpAQCAtMTQwNCw3ICsxNDE5LDcgQEAgYm9vbCBCeXRlQ29k
ZVBhcnNlcjo6cGFyc2VCbG9jayh1bnNpZ25lZAogICAgICAgICAgICAgLy8gbG9naWMgcmVsaWVz
IG9uIGV2ZXJ5IGJ5dGVjb2RlIHJlc3VsdGluZyBpbiBvbmUgb3IgbW9yZSBub2Rlcywgd2hpY2gg
d291bGQKICAgICAgICAgICAgIC8vIGJlIHRydWUgYW55d2F5IGV4Y2VwdCBmb3Igb3BfbG9vcF9o
aW50LCB3aGljaCBlbWl0cyBhIFBoYW50b20gdG8gZm9yY2UgdGhpcwogICAgICAgICAgICAgLy8g
dG8gYmUgdHJ1ZS4KLSAgICAgICAgICAgIGlmIChtX2N1cnJlbnRCbG9jay0+YmVnaW4gIT0gbV9n
cmFwaC5zaXplKCkpCisgICAgICAgICAgICBpZiAoIW1fY3VycmVudEJsb2NrLT5pc0VtcHR5KCkp
CiAgICAgICAgICAgICAgICAgYWRkVG9HcmFwaChKdW1wLCBPcEluZm8obV9jdXJyZW50SW5kZXgp
KTsKICAgICAgICAgICAgIGVsc2UgewogI2lmIERGR19FTkFCTEUoREVCVUdfVkVSQk9TRSkKQEAg
LTIzMTMsNyArMjMyOCw3IEBAIHZvaWQgQnl0ZUNvZGVQYXJzZXI6OnByb2Nlc3NQaGlTdGFjaygp
CiAgICAgICAgICAgICAgICAgZGF0YUxvZygiICAgICAgRGlkIG5vdCBmaW5kIG5vZGUsIGFkZGlu
ZyBwaGkuXG4iKTsKICNlbmRpZgogCi0gICAgICAgICAgICAgICAgdmFsdWVJblByZWRlY2Vzc29y
ID0gYWRkVG9HcmFwaChQaGksIE9wSW5mbyhuZXdWYXJpYWJsZUFjY2Vzc0RhdGEoc3RhY2tUeXBl
ID09IEFyZ3VtZW50UGhpU3RhY2sgPyBhcmd1bWVudFRvT3BlcmFuZCh2YXJObykgOiBzdGF0aWNf
Y2FzdDxpbnQ+KHZhck5vKSkpKTsKKyAgICAgICAgICAgICAgICB2YWx1ZUluUHJlZGVjZXNzb3Ig
PSBpbnNlcnRQaGlOb2RlKE9wSW5mbyhuZXdWYXJpYWJsZUFjY2Vzc0RhdGEoc3RhY2tUeXBlID09
IEFyZ3VtZW50UGhpU3RhY2sgPyBhcmd1bWVudFRvT3BlcmFuZCh2YXJObykgOiBzdGF0aWNfY2Fz
dDxpbnQ+KHZhck5vKSkpLCBwcmVkZWNlc3NvckJsb2NrKTsKICAgICAgICAgICAgICAgICB2YXIg
PSB2YWx1ZUluUHJlZGVjZXNzb3I7CiAgICAgICAgICAgICAgICAgaWYgKHN0YWNrVHlwZSA9PSBB
cmd1bWVudFBoaVN0YWNrKQogICAgICAgICAgICAgICAgICAgICBwcmVkZWNlc3NvckJsb2NrLT52
YXJpYWJsZXNBdEhlYWQuc2V0QXJndW1lbnRGaXJzdFRpbWUodmFyTm8sIHZhbHVlSW5QcmVkZWNl
c3Nvcik7CkBAIC0yMzk1LDcgKzI0MTAsNyBAQCB2b2lkIEJ5dGVDb2RlUGFyc2VyOjpwcm9jZXNz
UGhpU3RhY2soKQogICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgfQogICAg
ICAgICAgICAgCi0gICAgICAgICAgICBOb2RlSW5kZXggbmV3UGhpID0gYWRkVG9HcmFwaChQaGks
IE9wSW5mbyhkYXRhRm9yUGhpKSk7CisgICAgICAgICAgICBOb2RlSW5kZXggbmV3UGhpID0gaW5z
ZXJ0UGhpTm9kZShPcEluZm8oZGF0YUZvclBoaSksIGVudHJ5Lm1fYmxvY2spOwogICAgICAgICAg
ICAgCiAjaWYgREZHX0VOQUJMRShERUJVR19QUk9QQUdBVElPTl9WRVJCT1NFKQogICAgICAgICAg
ICAgZGF0YUxvZygiICAgICAgU3BsaXR0aW5nIEAldSwgY3JlYXRlZCBAJXUuXG4iLCBlbnRyeS5t
X3BoaSwgbmV3UGhpKTsKQEAgLTI0MzUsMTAgKzI0NTAsOSBAQCB2b2lkIEJ5dGVDb2RlUGFyc2Vy
OjpmaXhWYXJpYWJsZUFjY2Vzc1ByCiAKIHZvaWQgQnl0ZUNvZGVQYXJzZXI6OmxpbmtCbG9jayhC
YXNpY0Jsb2NrKiBibG9jaywgVmVjdG9yPEJsb2NrSW5kZXg+JiBwb3NzaWJsZVRhcmdldHMpCiB7
Ci0gICAgQVNTRVJUKGJsb2NrLT5lbmQgIT0gTm9Ob2RlKTsKICAgICBBU1NFUlQoIWJsb2NrLT5p
c0xpbmtlZCk7Ci0gICAgQVNTRVJUKGJsb2NrLT5lbmQgPiBibG9jay0+YmVnaW4pOwotICAgIE5v
ZGUmIG5vZGUgPSBtX2dyYXBoW2Jsb2NrLT5lbmQgLSAxXTsKKyAgICBBU1NFUlQoIWJsb2NrLT5p
c0VtcHR5KCkpOworICAgIE5vZGUmIG5vZGUgPSBtX2dyYXBoW2Jsb2NrLT5sYXN0KCldOwogICAg
IEFTU0VSVChub2RlLmlzVGVybWluYWwoKSk7CiAgICAgCiAgICAgc3dpdGNoIChub2RlLm9wKSB7
CkBAIC0yNTAyLDcgKzI1MTYsNyBAQCB2b2lkIEJ5dGVDb2RlUGFyc2VyOjpkZXRlcm1pbmVSZWFj
aGFiaWxpCiAgICAgICAgIEJhc2ljQmxvY2sqIGJsb2NrID0gbV9ncmFwaC5tX2Jsb2Nrc1tpbmRl
eF0uZ2V0KCk7CiAgICAgICAgIEFTU0VSVChibG9jay0+aXNMaW5rZWQpOwogICAgICAgICAKLSAg
ICAgICAgTm9kZSYgbm9kZSA9IG1fZ3JhcGhbYmxvY2stPmVuZCAtIDFdOworICAgICAgICBOb2Rl
JiBub2RlID0gbV9ncmFwaFtibG9jay0+bGFzdCgpXTsKICAgICAgICAgQVNTRVJUKG5vZGUuaXNU
ZXJtaW5hbCgpKTsKICAgICAgICAgCiAgICAgICAgIGlmIChub2RlLmlzSnVtcCgpKQpAQCAtMjY0
OSw3ICsyNjYzLDcgQEAgdm9pZCBCeXRlQ29kZVBhcnNlcjo6cGFyc2VDb2RlQmxvY2soKQogICAg
ICAgICBkbyB7CiAgICAgICAgICAgICBpZiAoIW1fY3VycmVudEJsb2NrKSB7CiAgICAgICAgICAg
ICAgICAgLy8gQ2hlY2sgaWYgd2UgY2FuIHVzZSB0aGUgbGFzdCBibG9jay4KLSAgICAgICAgICAg
ICAgICBpZiAoIW1fZ3JhcGgubV9ibG9ja3MuaXNFbXB0eSgpICYmIG1fZ3JhcGgubV9ibG9ja3Mu
bGFzdCgpLT5iZWdpbiA9PSBtX2dyYXBoLm1fYmxvY2tzLmxhc3QoKS0+ZW5kKSB7CisgICAgICAg
ICAgICAgICAgaWYgKCFtX2dyYXBoLm1fYmxvY2tzLmlzRW1wdHkoKSAmJiBtX2dyYXBoLm1fYmxv
Y2tzLmxhc3QoKS0+aXNFbXB0eSgpKSB7CiAgICAgICAgICAgICAgICAgICAgIC8vIFRoaXMgbXVz
dCBiZSBhIGJsb2NrIGJlbG9uZ2luZyB0byB1cy4KICAgICAgICAgICAgICAgICAgICAgQVNTRVJU
KG1faW5saW5lU3RhY2tUb3AtPm1fdW5saW5rZWRCbG9ja3MubGFzdCgpLm1fYmxvY2tJbmRleCA9
PSBtX2dyYXBoLm1fYmxvY2tzLnNpemUoKSAtIDEpOwogICAgICAgICAgICAgICAgICAgICAvLyBF
aXRoZXIgdGhlIGJsb2NrIGlzIGxpbmthYmxlIG9yIGl0IGlzbid0LiBJZiBpdCdzIGxpbmthYmxl
IHRoZW4gaXQncyB0aGUgbGFzdApAQCAtMjY2Nyw3ICsyNjgxLDcgQEAgdm9pZCBCeXRlQ29kZVBh
cnNlcjo6cGFyc2VDb2RlQmxvY2soKQogI2VuZGlmCiAgICAgICAgICAgICAgICAgICAgIG1fY3Vy
cmVudEJsb2NrLT5ieXRlY29kZUJlZ2luID0gbV9jdXJyZW50SW5kZXg7CiAgICAgICAgICAgICAg
ICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgT3duUHRyPEJhc2ljQmxvY2s+IGJsb2Nr
ID0gYWRvcHRQdHIobmV3IEJhc2ljQmxvY2sobV9jdXJyZW50SW5kZXgsIG1fZ3JhcGguc2l6ZSgp
LCBtX251bUFyZ3VtZW50cywgbV9udW1Mb2NhbHMpKTsKKyAgICAgICAgICAgICAgICAgICAgT3du
UHRyPEJhc2ljQmxvY2s+IGJsb2NrID0gYWRvcHRQdHIobmV3IEJhc2ljQmxvY2sobV9jdXJyZW50
SW5kZXgsIG1fbnVtQXJndW1lbnRzLCBtX251bUxvY2FscykpOwogI2lmIERGR19FTkFCTEUoREVC
VUdfVkVSQk9TRSkKICAgICAgICAgICAgICAgICAgICAgZGF0YUxvZygiQ3JlYXRpbmcgYmFzaWMg
YmxvY2sgJXAsICMlenUgZm9yICVwIGJjIyV1IGF0IGlubGluZSBkZXB0aCAldS5cbiIsIGJsb2Nr
LmdldCgpLCBtX2dyYXBoLm1fYmxvY2tzLnNpemUoKSwgbV9pbmxpbmVTdGFja1RvcC0+ZXhlY3V0
YWJsZSgpLCBtX2N1cnJlbnRJbmRleCwgQ29kZU9yaWdpbjo6aW5saW5lRGVwdGhGb3JDYWxsRnJh
bWUobV9pbmxpbmVTdGFja1RvcC0+bV9pbmxpbmVDYWxsRnJhbWUpKTsKICNlbmRpZgpAQCAtMjY5
MCwxMCArMjcwNCw4IEBAIHZvaWQgQnl0ZUNvZGVQYXJzZXI6OnBhcnNlQ29kZUJsb2NrKCkKICAg
ICAgICAgICAgIC8vIGFyZSBhdCB0aGUgZW5kIG9mIGFuIGlubGluZSBmdW5jdGlvbiwgb3Igd2Ug
cmVhbGl6ZWQgdGhhdCB3ZQogICAgICAgICAgICAgLy8gc2hvdWxkIHN0b3AgcGFyc2luZyBiZWNh
dXNlIHRoZXJlIHdhcyBhIHJldHVybiBpbiB0aGUgZmlyc3QKICAgICAgICAgICAgIC8vIGJhc2lj
IGJsb2NrLgotICAgICAgICAgICAgQVNTRVJUKG1fY3VycmVudEJsb2NrLT5iZWdpbiA9PSBtX2dy
YXBoLnNpemUoKSB8fCBtX2dyYXBoLmxhc3QoKS5pc1Rlcm1pbmFsKCkgfHwgKG1fY3VycmVudElu
ZGV4ID09IGNvZGVCbG9jay0+aW5zdHJ1Y3Rpb25zKCkuc2l6ZSgpICYmIG1faW5saW5lU3RhY2tU
b3AtPm1faW5saW5lQ2FsbEZyYW1lKSB8fCAhc2hvdWxkQ29udGludWVQYXJzaW5nKTsKKyAgICAg
ICAgICAgIEFTU0VSVChtX2N1cnJlbnRCbG9jay0+aXNFbXB0eSgpIHx8IG1fZ3JhcGgubGFzdCgp
LmlzVGVybWluYWwoKSB8fCAobV9jdXJyZW50SW5kZXggPT0gY29kZUJsb2NrLT5pbnN0cnVjdGlv
bnMoKS5zaXplKCkgJiYgbV9pbmxpbmVTdGFja1RvcC0+bV9pbmxpbmVDYWxsRnJhbWUpIHx8ICFz
aG91bGRDb250aW51ZVBhcnNpbmcpOwogCi0gICAgICAgICAgICBtX2N1cnJlbnRCbG9jay0+ZW5k
ID0gbV9ncmFwaC5zaXplKCk7Ci0gICAgICAgICAgICAKICAgICAgICAgICAgIGlmICghc2hvdWxk
Q29udGludWVQYXJzaW5nKQogICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgIApJ
bmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL2RmZy9ERkdDRkFQaGFzZS5jcHAKPT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PQotLS0gU291cmNlL0phdmFTY3JpcHRDb3JlL2RmZy9ERkdDRkFQaGFzZS5jcHAJKHJldmlzaW9u
IDEwOTIwNykKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9kZmcvREZHQ0ZBUGhhc2UuY3BwCSh3
b3JraW5nIGNvcHkpCkBAIC04Miw3ICs4Miw4IEBAIHByaXZhdGU6CiAgICAgICAgIGR1bXBPcGVy
YW5kcyhibG9jay0+dmFsdWVzQXRIZWFkLCBXVEY6OmRhdGFGaWxlKCkpOwogICAgICAgICBkYXRh
TG9nKCJcbiIpOwogI2VuZGlmCi0gICAgICAgIGZvciAoTm9kZUluZGV4IG5vZGVJbmRleCA9IGJs
b2NrLT5iZWdpbjsgbm9kZUluZGV4IDwgYmxvY2stPmVuZDsgKytub2RlSW5kZXgpIHsKKyAgICAg
ICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IGJsb2NrLT5zaXplKCk7ICsraSkgeworICAgICAg
ICAgICAgTm9kZUluZGV4IG5vZGVJbmRleCA9IGJsb2NrLT5hdChpKTsKICAgICAgICAgICAgIGlm
ICghbV9ncmFwaFtub2RlSW5kZXhdLnNob3VsZEdlbmVyYXRlKCkpCiAgICAgICAgICAgICAgICAg
Y29udGludWU7CiAjaWYgREZHX0VOQUJMRShERUJVR19QUk9QQUdBVElPTl9WRVJCT1NFKQpAQCAt
OTAsNyArOTEsNyBAQCBwcml2YXRlOgogICAgICAgICAgICAgbV9zdGF0ZS5kdW1wKFdURjo6ZGF0
YUZpbGUoKSk7CiAgICAgICAgICAgICBkYXRhTG9nKCJcbiIpOwogI2VuZGlmCi0gICAgICAgICAg
ICBpZiAoIW1fc3RhdGUuZXhlY3V0ZShub2RlSW5kZXgpKQorICAgICAgICAgICAgaWYgKCFtX3N0
YXRlLmV4ZWN1dGUoaSkpCiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KICNpZiBE
RkdfRU5BQkxFKERFQlVHX1BST1BBR0FUSU9OX1ZFUkJPU0UpCkBAIC0xMjAsNiArMTIxLDkgQEAg
cHJpdmF0ZToKICAgICBBYnN0cmFjdFN0YXRlIG1fc3RhdGU7CiAgICAgCiAgICAgYm9vbCBtX2No
YW5nZWQ7CisjaWYgREZHX0VOQUJMRShERUJVR19QUk9QQUdBVElPTl9WRVJCT1NFKQorICAgIHVu
c2lnbmVkIG1fY291bnQ7CisjZW5kaWYKIH07CiAKIHZvaWQgcGVyZm9ybUNGQShHcmFwaCYgZ3Jh
cGgpCkluZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUvZGZnL0RGR0NTRVBoYXNlLmNwcAo9PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvZGZnL0RGR0NTRVBoYXNlLmNwcAkocmV2
aXNpb24gMTA5MjA3KQorKysgU291cmNlL0phdmFTY3JpcHRDb3JlL2RmZy9ERkdDU0VQaGFzZS5j
cHAJKHdvcmtpbmcgY29weSkKQEAgLTcxMCwxMCArNzEwLDExIEBAIHByaXZhdGU6CiAgICAgCiAg
ICAgdm9pZCBwZXJmb3JtQmxvY2tDU0UoQmFzaWNCbG9jayYgYmxvY2spCiAgICAgewotICAgICAg
ICBtX3N0YXJ0ID0gYmxvY2suYmVnaW47Ci0gICAgICAgIE5vZGVJbmRleCBlbmQgPSBibG9jay5l
bmQ7Ci0gICAgICAgIGZvciAobV9jb21waWxlSW5kZXggPSBtX3N0YXJ0OyBtX2NvbXBpbGVJbmRl
eCA8IGVuZDsgKyttX2NvbXBpbGVJbmRleCkKKyAgICAgICAgbV9zdGFydCA9IGJsb2NrW2Jsb2Nr
LnN0YXJ0RXhjbHVkaW5nUGhpc107CisgICAgICAgIGZvciAodW5zaWduZWQgaSA9IGJsb2NrLnN0
YXJ0RXhjbHVkaW5nUGhpczsgaSA8IGJsb2NrLnNpemUoKTsgKytpKSB7CisgICAgICAgICAgICBt
X2NvbXBpbGVJbmRleCA9IGJsb2NrW2ldOwogICAgICAgICAgICAgcGVyZm9ybU5vZGVDU0UobV9n
cmFwaFttX2NvbXBpbGVJbmRleF0pOworICAgICAgICB9CiAgICAgfQogICAgIAogICAgIE5vZGVJ
bmRleCBtX3N0YXJ0OwpJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL2RmZy9ERkdHcmFwaC5j
cHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRDb3JlL2RmZy9ERkdHcmFwaC5jcHAJ
KHJldmlzaW9uIDEwOTIwNykKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9kZmcvREZHR3JhcGgu
Y3BwCSh3b3JraW5nIGNvcHkpCkBAIC0yNzQsOCArMjc0LDggQEAgdm9pZCBHcmFwaDo6ZHVtcCgp
CiAgICAgICAgIGRhdGFMb2coIiAgdmFyIGxpbmtzOiAiKTsKICAgICAgICAgZHVtcE9wZXJhbmRz
KGJsb2NrLT52YXJpYWJsZXNBdEhlYWQsIFdURjo6ZGF0YUZpbGUoKSk7CiAgICAgICAgIGRhdGFM
b2coIlxuIik7Ci0gICAgICAgIGZvciAoc2l6ZV90IGkgPSBibG9jay0+YmVnaW47IGkgPCBibG9j
ay0+ZW5kOyArK2kpCi0gICAgICAgICAgICBkdW1wKGkpOworICAgICAgICBmb3IgKHNpemVfdCBp
ID0gMDsgaSA8IGJsb2NrLT5zaXplKCk7ICsraSkKKyAgICAgICAgICAgIGR1bXAoYmxvY2stPmF0
KGkpKTsKICAgICAgICAgZGF0YUxvZygiICB2YXJzIGFmdGVyOiAiKTsKICAgICAgICAgaWYgKGJs
b2NrLT5jZmFIYXNWaXNpdGVkKQogICAgICAgICAgICAgZHVtcE9wZXJhbmRzKGJsb2NrLT52YWx1
ZXNBdFRhaWwsIFdURjo6ZGF0YUZpbGUoKSk7CkBAIC0yODMsOSArMjgzLDYgQEAgdm9pZCBHcmFw
aDo6ZHVtcCgpCiAgICAgICAgICAgICBkYXRhTG9nKCI8ZW1wdHk+Iik7CiAgICAgICAgIGRhdGFM
b2coIlxuIik7CiAgICAgfQotICAgIGRhdGFMb2coIlBoaSBOb2RlczpcbiIpOwotICAgIGZvciAo
c2l6ZV90IGkgPSBtX2Jsb2Nrcy5sYXN0KCktPmVuZDsgaSA8IHNpemUoKTsgKytpKQotICAgICAg
ICBkdW1wKGkpOwogfQogCiAvLyBGSVhNRTogQ29udmVydCB0aGlzIHRvIGJlIGl0ZXJhdGl2ZSwg
bm90IHJlY3Vyc2l2ZS4KSW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9kZmcvREZHUGhhc2Uu
Y3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9kZmcvREZHUGhhc2UuY3Bw
CShyZXZpc2lvbiAxMDkyMDcpCisrKyBTb3VyY2UvSmF2YVNjcmlwdENvcmUvZGZnL0RGR1BoYXNl
LmNwcAkod29ya2luZyBjb3B5KQpAQCAtMzUsNyArMzUsNyBAQCB2b2lkIFBoYXNlOjpiZWdpblBo
YXNlKCkKIHsKICAgICBkYXRhTG9nKCJCZWdpbm5pbmcgREZHIHBoYXNlICVzLlxuIiwgbV9uYW1l
KTsKICAgICBkYXRhTG9nKCJHcmFwaCBiZWZvcmUgJXM6XG4iLCBtX25hbWUpOwotICAgIG1fZ3Jh
cGguZHVtcChtX2NvZGVCbG9jayk7CisgICAgbV9ncmFwaC5kdW1wKCk7CiB9CiAKIHZvaWQgUGhh
c2U6OmVuZFBoYXNlKCkKSW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9kZmcvREZHU3BlY3Vs
YXRpdmVKSVQzMl82NC5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRDb3JlL2Rm
Zy9ERkdTcGVjdWxhdGl2ZUpJVDMyXzY0LmNwcAkocmV2aXNpb24gMTA5MjA3KQorKysgU291cmNl
L0phdmFTY3JpcHRDb3JlL2RmZy9ERkdTcGVjdWxhdGl2ZUpJVDMyXzY0LmNwcAkod29ya2luZyBj
b3B5KQpAQCAtNjUyLDE0ICs2NTIsMTcgQEAgdm9pZCBTcGVjdWxhdGl2ZUpJVDo6bm9uU3BlY3Vs
YXRpdmVQZWVwaAogCiBib29sIFNwZWN1bGF0aXZlSklUOjpub25TcGVjdWxhdGl2ZUNvbXBhcmVO
dWxsKE5vZGUmIG5vZGUsIE5vZGVVc2Ugb3BlcmFuZCwgYm9vbCBpbnZlcnQpCiB7Ci0gICAgTm9k
ZUluZGV4IGJyYW5jaE5vZGVJbmRleCA9IGRldGVjdFBlZXBIb2xlQnJhbmNoKCk7Ci0gICAgaWYg
KGJyYW5jaE5vZGVJbmRleCAhPSBOb05vZGUpIHsKKyAgICB1bnNpZ25lZCBicmFuY2hJbmRleElu
QmxvY2sgPSBkZXRlY3RQZWVwSG9sZUJyYW5jaCgpOworICAgIGlmIChicmFuY2hJbmRleEluQmxv
Y2sgIT0gVUlOVF9NQVgpIHsKKyAgICAgICAgTm9kZUluZGV4IGJyYW5jaE5vZGVJbmRleCA9IG1f
aml0LmdyYXBoKCkubV9ibG9ja3NbbV9ibG9ja10tPmF0KGJyYW5jaEluZGV4SW5CbG9jayk7CisK
ICAgICAgICAgQVNTRVJUKG5vZGUuYWRqdXN0ZWRSZWZDb3VudCgpID09IDEpOwogICAgICAgICAK
ICAgICAgICAgbm9uU3BlY3VsYXRpdmVQZWVwaG9sZUJyYW5jaE51bGwob3BlcmFuZCwgYnJhbmNo
Tm9kZUluZGV4LCBpbnZlcnQpOwogICAgIAogICAgICAgICB1c2Uobm9kZS5jaGlsZDEoKSk7CiAg
ICAgICAgIHVzZShub2RlLmNoaWxkMigpKTsKKyAgICAgICAgbV9pbmRleEluQmxvY2sgPSBicmFu
Y2hJbmRleEluQmxvY2s7CiAgICAgICAgIG1fY29tcGlsZUluZGV4ID0gYnJhbmNoTm9kZUluZGV4
OwogICAgICAgICAKICAgICAgICAgcmV0dXJuIHRydWU7CkluZGV4OiBTb3VyY2UvSmF2YVNjcmlw
dENvcmUvZGZnL0RGR1NwZWN1bGF0aXZlSklUNjQuY3BwCj09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9K
YXZhU2NyaXB0Q29yZS9kZmcvREZHU3BlY3VsYXRpdmVKSVQ2NC5jcHAJKHJldmlzaW9uIDEwOTIw
NykKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9kZmcvREZHU3BlY3VsYXRpdmVKSVQ2NC5jcHAJ
KHdvcmtpbmcgY29weSkKQEAgLTYyOCwxNCArNjI4LDE3IEBAIHZvaWQgU3BlY3VsYXRpdmVKSVQ6
Om5vblNwZWN1bGF0aXZlUGVlcGgKIAogYm9vbCBTcGVjdWxhdGl2ZUpJVDo6bm9uU3BlY3VsYXRp
dmVDb21wYXJlTnVsbChOb2RlJiBub2RlLCBOb2RlVXNlIG9wZXJhbmQsIGJvb2wgaW52ZXJ0KQog
ewotICAgIE5vZGVJbmRleCBicmFuY2hOb2RlSW5kZXggPSBkZXRlY3RQZWVwSG9sZUJyYW5jaCgp
OwotICAgIGlmIChicmFuY2hOb2RlSW5kZXggIT0gTm9Ob2RlKSB7CisgICAgdW5zaWduZWQgYnJh
bmNoSW5kZXhJbkJsb2NrID0gZGV0ZWN0UGVlcEhvbGVCcmFuY2goKTsKKyAgICBpZiAoYnJhbmNo
SW5kZXhJbkJsb2NrICE9IFVJTlRfTUFYKSB7CisgICAgICAgIE5vZGVJbmRleCBicmFuY2hOb2Rl
SW5kZXggPSBtX2ppdC5ncmFwaCgpLm1fYmxvY2tzW21fYmxvY2tdLT5hdChicmFuY2hJbmRleElu
QmxvY2spOworCiAgICAgICAgIEFTU0VSVChub2RlLmFkanVzdGVkUmVmQ291bnQoKSA9PSAxKTsK
ICAgICAgICAgCiAgICAgICAgIG5vblNwZWN1bGF0aXZlUGVlcGhvbGVCcmFuY2hOdWxsKG9wZXJh
bmQsIGJyYW5jaE5vZGVJbmRleCwgaW52ZXJ0KTsKICAgICAKICAgICAgICAgdXNlKG5vZGUuY2hp
bGQxKCkpOwogICAgICAgICB1c2Uobm9kZS5jaGlsZDIoKSk7CisgICAgICAgIG1faW5kZXhJbkJs
b2NrID0gYnJhbmNoSW5kZXhJbkJsb2NrOwogICAgICAgICBtX2NvbXBpbGVJbmRleCA9IGJyYW5j
aE5vZGVJbmRleDsKICAgICAgICAgCiAgICAgICAgIHJldHVybiB0cnVlOwpJbmRleDogU291cmNl
L0phdmFTY3JpcHRDb3JlL2RmZy9ERkdTcGVjdWxhdGl2ZUpJVC5jcHAKPT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0g
U291cmNlL0phdmFTY3JpcHRDb3JlL2RmZy9ERkdTcGVjdWxhdGl2ZUpJVC5jcHAJKHJldmlzaW9u
IDEwOTIwNykKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9kZmcvREZHU3BlY3VsYXRpdmVKSVQu
Y3BwCSh3b3JraW5nIGNvcHkpCkBAIC0zNjUsMTIgKzM2NSwxNSBAQCB2b2lkIFNwZWN1bGF0aXZl
SklUOjp3cml0ZUJhcnJpZXIoSlNDZWxsCiAKIGJvb2wgU3BlY3VsYXRpdmVKSVQ6Om5vblNwZWN1
bGF0aXZlQ29tcGFyZShOb2RlJiBub2RlLCBNYWNyb0Fzc2VtYmxlcjo6UmVsYXRpb25hbENvbmRp
dGlvbiBjb25kLCBTX0RGR09wZXJhdGlvbl9FSkogaGVscGVyRnVuY3Rpb24pCiB7Ci0gICAgTm9k
ZUluZGV4IGJyYW5jaE5vZGVJbmRleCA9IGRldGVjdFBlZXBIb2xlQnJhbmNoKCk7Ci0gICAgaWYg
KGJyYW5jaE5vZGVJbmRleCAhPSBOb05vZGUpIHsKKyAgICB1bnNpZ25lZCBicmFuY2hJbmRleElu
QmxvY2sgPSBkZXRlY3RQZWVwSG9sZUJyYW5jaCgpOworICAgIGlmIChicmFuY2hJbmRleEluQmxv
Y2sgIT0gVUlOVF9NQVgpIHsKKyAgICAgICAgTm9kZUluZGV4IGJyYW5jaE5vZGVJbmRleCA9IG1f
aml0LmdyYXBoKCkubV9ibG9ja3NbbV9ibG9ja10tPmF0KGJyYW5jaEluZGV4SW5CbG9jayk7CisK
ICAgICAgICAgQVNTRVJUKG5vZGUuYWRqdXN0ZWRSZWZDb3VudCgpID09IDEpOwogICAgICAgICAK
ICAgICAgICAgbm9uU3BlY3VsYXRpdmVQZWVwaG9sZUJyYW5jaChub2RlLCBicmFuY2hOb2RlSW5k
ZXgsIGNvbmQsIGhlbHBlckZ1bmN0aW9uKTsKICAgICAKKyAgICAgICAgbV9pbmRleEluQmxvY2sg
PSBicmFuY2hJbmRleEluQmxvY2s7CiAgICAgICAgIG1fY29tcGlsZUluZGV4ID0gYnJhbmNoTm9k
ZUluZGV4OwogICAgICAgICAKICAgICAgICAgcmV0dXJuIHRydWU7CkBAIC0zODMsMTIgKzM4Niwx
NSBAQCBib29sIFNwZWN1bGF0aXZlSklUOjpub25TcGVjdWxhdGl2ZUNvbXBhCiAKIGJvb2wgU3Bl
Y3VsYXRpdmVKSVQ6Om5vblNwZWN1bGF0aXZlU3RyaWN0RXEoTm9kZSYgbm9kZSwgYm9vbCBpbnZl
cnQpCiB7Ci0gICAgTm9kZUluZGV4IGJyYW5jaE5vZGVJbmRleCA9IGRldGVjdFBlZXBIb2xlQnJh
bmNoKCk7Ci0gICAgaWYgKGJyYW5jaE5vZGVJbmRleCAhPSBOb05vZGUpIHsKKyAgICB1bnNpZ25l
ZCBicmFuY2hJbmRleEluQmxvY2sgPSBkZXRlY3RQZWVwSG9sZUJyYW5jaCgpOworICAgIGlmIChi
cmFuY2hJbmRleEluQmxvY2sgIT0gVUlOVF9NQVgpIHsKKyAgICAgICAgTm9kZUluZGV4IGJyYW5j
aE5vZGVJbmRleCA9IG1faml0LmdyYXBoKCkubV9ibG9ja3NbbV9ibG9ja10tPmF0KGJyYW5jaElu
ZGV4SW5CbG9jayk7CisKICAgICAgICAgQVNTRVJUKG5vZGUuYWRqdXN0ZWRSZWZDb3VudCgpID09
IDEpOwogICAgICAgICAKICAgICAgICAgbm9uU3BlY3VsYXRpdmVQZWVwaG9sZVN0cmljdEVxKG5v
ZGUsIGJyYW5jaE5vZGVJbmRleCwgaW52ZXJ0KTsKICAgICAKKyAgICAgICAgbV9pbmRleEluQmxv
Y2sgPSBicmFuY2hJbmRleEluQmxvY2s7CiAgICAgICAgIG1fY29tcGlsZUluZGV4ID0gYnJhbmNo
Tm9kZUluZGV4OwogICAgICAgICAKICAgICAgICAgcmV0dXJuIHRydWU7CkBAIC04NjgsOCArODc0
LDEwIEBAIHZvaWQgU3BlY3VsYXRpdmVKSVQ6OmNvbXBpbGVQZWVwSG9sZUludGUKIGJvb2wgU3Bl
Y3VsYXRpdmVKSVQ6OmNvbXBpbGVQZWVwSG9sZUJyYW5jaChOb2RlJiBub2RlLCBNYWNyb0Fzc2Vt
Ymxlcjo6UmVsYXRpb25hbENvbmRpdGlvbiBjb25kaXRpb24sIE1hY3JvQXNzZW1ibGVyOjpEb3Vi
bGVDb25kaXRpb24gZG91YmxlQ29uZGl0aW9uLCBTX0RGR09wZXJhdGlvbl9FSkogb3BlcmF0aW9u
KQogewogICAgIC8vIEZ1c2VkIGNvbXBhcmUgJiBicmFuY2guCi0gICAgTm9kZUluZGV4IGJyYW5j
aE5vZGVJbmRleCA9IGRldGVjdFBlZXBIb2xlQnJhbmNoKCk7Ci0gICAgaWYgKGJyYW5jaE5vZGVJ
bmRleCAhPSBOb05vZGUpIHsKKyAgICB1bnNpZ25lZCBicmFuY2hJbmRleEluQmxvY2sgPSBkZXRl
Y3RQZWVwSG9sZUJyYW5jaCgpOworICAgIGlmIChicmFuY2hJbmRleEluQmxvY2sgIT0gVUlOVF9N
QVgpIHsKKyAgICAgICAgTm9kZUluZGV4IGJyYW5jaE5vZGVJbmRleCA9IG1faml0LmdyYXBoKCku
bV9ibG9ja3NbbV9ibG9ja10tPmF0KGJyYW5jaEluZGV4SW5CbG9jayk7CisKICAgICAgICAgLy8g
ZGV0ZWN0UGVlcEhvbGVCcmFuY2ggY3VycmVudGx5IG9ubHkgcGVybWl0cyB0aGUgYnJhbmNoIHRv
IGJlIHRoZSB2ZXJ5IG5leHQgbm9kZSwKICAgICAgICAgLy8gc28gY2FuIGJlIG5vIGludGVydmVu
aW5nIG5vZGVzIHRvIGFsc28gcmVmZXJlbmNlIHRoZSBjb21wYXJlLiAKICAgICAgICAgQVNTRVJU
KG5vZGUuYWRqdXN0ZWRSZWZDb3VudCgpID09IDEpOwpAQCAtODkzLDYgKzkwMSw3IEBAIGJvb2wg
U3BlY3VsYXRpdmVKSVQ6OmNvbXBpbGVQZWVwSG9sZUJyYW4KICAgICAgICAgfSBlbHNlCiAgICAg
ICAgICAgICBub25TcGVjdWxhdGl2ZVBlZXBob2xlQnJhbmNoKG5vZGUsIGJyYW5jaE5vZGVJbmRl
eCwgY29uZGl0aW9uLCBvcGVyYXRpb24pOwogCisgICAgICAgIG1faW5kZXhJbkJsb2NrID0gYnJh
bmNoSW5kZXhJbkJsb2NrOwogICAgICAgICBtX2NvbXBpbGVJbmRleCA9IGJyYW5jaE5vZGVJbmRl
eDsKICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgfQpAQCAtOTEwLDEyICs5MTksOSBAQCB2b2lk
IFNwZWN1bGF0aXZlSklUOjpjb21waWxlTW92SGludChOb2RlCiB2b2lkIFNwZWN1bGF0aXZlSklU
Ojpjb21waWxlKEJhc2ljQmxvY2smIGJsb2NrKQogewogICAgIEFTU0VSVChtX2NvbXBpbGVPa2F5
KTsKLSAgICBBU1NFUlQobV9jb21waWxlSW5kZXggPT0gYmxvY2suYmVnaW4pOwogICAgIAotICAg
IGlmICghYmxvY2suaXNSZWFjaGFibGUpIHsKLSAgICAgICAgbV9jb21waWxlSW5kZXggPSBibG9j
ay5lbmQ7CisgICAgaWYgKCFibG9jay5pc1JlYWNoYWJsZSkKICAgICAgICAgcmV0dXJuOwotICAg
IH0KIAogICAgIG1fYmxvY2tIZWFkc1ttX2Jsb2NrXSA9IG1faml0LmxhYmVsKCk7CiAjaWYgREZH
X0VOQUJMRShKSVRfQlJFQUtfT05fRVZFUllfQkxPQ0spCkBAIC05NTUsNyArOTYxLDggQEAgdm9p
ZCBTcGVjdWxhdGl2ZUpJVDo6Y29tcGlsZShCYXNpY0Jsb2NrJgogICAgICAgICB2ZXJpZmljYXRp
b25TdWNjZWVkZWQubGluaygmbV9qaXQpOwogICAgIH0KIAotICAgIGZvciAoOyBtX2NvbXBpbGVJ
bmRleCA8IGJsb2NrLmVuZDsgKyttX2NvbXBpbGVJbmRleCkgeworICAgIGZvciAobV9pbmRleElu
QmxvY2sgPSBibG9jay5zdGFydEV4Y2x1ZGluZ1BoaXM7IG1faW5kZXhJbkJsb2NrIDwgYmxvY2su
c2l6ZSgpOyArK21faW5kZXhJbkJsb2NrKSB7CisgICAgICAgIG1fY29tcGlsZUluZGV4ID0gYmxv
Y2tbbV9pbmRleEluQmxvY2tdOwogICAgICAgICBOb2RlJiBub2RlID0gYXQobV9jb21waWxlSW5k
ZXgpOwogICAgICAgICBtX2NvZGVPcmlnaW5Gb3JPU1IgPSBub2RlLmNvZGVPcmlnaW47CiAgICAg
ICAgIGlmICghbm9kZS5zaG91bGRHZW5lcmF0ZSgpKSB7CkBAIC0xMDAwLDcgKzEwMDcsNiBAQCB2
b2lkIFNwZWN1bGF0aXZlSklUOjpjb21waWxlKEJhc2ljQmxvY2smCiAgICAgICAgICAgICBjb21w
aWxlKG5vZGUpOwogICAgICAgICAgICAgaWYgKCFtX2NvbXBpbGVPa2F5KSB7CiAgICAgICAgICAg
ICAgICAgbV9jb21waWxlT2theSA9IHRydWU7Ci0gICAgICAgICAgICAgICAgbV9jb21waWxlSW5k
ZXggPSBibG9jay5lbmQ7CiAgICAgICAgICAgICAgICAgY2xlYXJHZW5lcmF0aW9uSW5mbygpOwog
ICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgIH0KQEAgLTEwNDAsNyArMTA0Niw3
IEBAIHZvaWQgU3BlY3VsYXRpdmVKSVQ6OmNvbXBpbGUoQmFzaWNCbG9jayYKICNlbmRpZgogICAg
ICAgICAKICAgICAgICAgLy8gTWFrZSBzdXJlIHRoYXQgdGhlIGFic3RyYWN0IHN0YXRlIGlzIHJl
bWF0ZXJpYWxpemVkIGZvciB0aGUgbmV4dCBub2RlLgotICAgICAgICBtX3N0YXRlLmV4ZWN1dGUo
bV9jb21waWxlSW5kZXgpOworICAgICAgICBtX3N0YXRlLmV4ZWN1dGUobV9pbmRleEluQmxvY2sp
OwogICAgICAgICAKICAgICAgICAgaWYgKG5vZGUuc2hvdWxkR2VuZXJhdGUoKSkKICAgICAgICAg
ICAgIGNoZWNrQ29uc2lzdGVuY3koKTsKQEAgLTI0NzksOCArMjQ4NSw5IEBAIGJvb2wgU3BlY3Vs
YXRpdmVKSVQ6OmNvbXBpbGVTdHJpY3RFcUZvckMKIHsKICAgICBKU1ZhbHVlT3BlcmFuZCBvcDEo
dGhpcywgdmFsdWUpOwogICAgIAotICAgIE5vZGVJbmRleCBicmFuY2hOb2RlSW5kZXggPSBkZXRl
Y3RQZWVwSG9sZUJyYW5jaCgpOwotICAgIGlmIChicmFuY2hOb2RlSW5kZXggIT0gTm9Ob2RlKSB7
CisgICAgdW5zaWduZWQgYnJhbmNoSW5kZXhJbkJsb2NrID0gZGV0ZWN0UGVlcEhvbGVCcmFuY2go
KTsKKyAgICBpZiAoYnJhbmNoSW5kZXhJbkJsb2NrICE9IFVJTlRfTUFYKSB7CisgICAgICAgIE5v
ZGVJbmRleCBicmFuY2hOb2RlSW5kZXggPSBtX2ppdC5ncmFwaCgpLm1fYmxvY2tzW21fYmxvY2td
LT5hdChicmFuY2hJbmRleEluQmxvY2spOwogICAgICAgICBOb2RlJiBicmFuY2hOb2RlID0gYXQo
YnJhbmNoTm9kZUluZGV4KTsKICAgICAgICAgQmxvY2tJbmRleCB0YWtlbiA9IGJyYW5jaE5vZGUu
dGFrZW5CbG9ja0luZGV4KCk7CiAgICAgICAgIEJsb2NrSW5kZXggbm90VGFrZW4gPSBicmFuY2hO
b2RlLm5vdFRha2VuQmxvY2tJbmRleCgpOwpAQCAtMjUxNiw2ICsyNTIzLDcgQEAgYm9vbCBTcGVj
dWxhdGl2ZUpJVDo6Y29tcGlsZVN0cmljdEVxRm9yQwogICAgICAgICAKICAgICAgICAgdXNlKG5v
ZGUuY2hpbGQxKCkpOwogICAgICAgICB1c2Uobm9kZS5jaGlsZDIoKSk7CisgICAgICAgIG1faW5k
ZXhJbkJsb2NrID0gYnJhbmNoSW5kZXhJbkJsb2NrOwogICAgICAgICBtX2NvbXBpbGVJbmRleCA9
IGJyYW5jaE5vZGVJbmRleDsKICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgfQpAQCAtMjU2Niwx
MSArMjU3NCwxMyBAQCBib29sIFNwZWN1bGF0aXZlSklUOjpjb21waWxlU3RyaWN0RXEoTm9kCiAg
ICAgLy8gMikgSWYgdGhlIG9wZXJhbmRzIGFyZSBwcmVkaWN0ZWQgaW50ZWdlciwgZG8gYW4gaW50
ZWdlciBjb21wYXJpc29uLgogICAgIAogICAgIGlmIChOb2RlOjpzaG91bGRTcGVjdWxhdGVJbnRl
Z2VyKGF0KG5vZGUuY2hpbGQxKCkpLCBhdChub2RlLmNoaWxkMigpKSkpIHsKLSAgICAgICAgTm9k
ZUluZGV4IGJyYW5jaE5vZGVJbmRleCA9IGRldGVjdFBlZXBIb2xlQnJhbmNoKCk7Ci0gICAgICAg
IGlmIChicmFuY2hOb2RlSW5kZXggIT0gTm9Ob2RlKSB7CisgICAgICAgIHVuc2lnbmVkIGJyYW5j
aEluZGV4SW5CbG9jayA9IGRldGVjdFBlZXBIb2xlQnJhbmNoKCk7CisgICAgICAgIGlmIChicmFu
Y2hJbmRleEluQmxvY2sgIT0gVUlOVF9NQVgpIHsKKyAgICAgICAgICAgIE5vZGVJbmRleCBicmFu
Y2hOb2RlSW5kZXggPSBtX2ppdC5ncmFwaCgpLm1fYmxvY2tzW21fYmxvY2tdLT5hdChicmFuY2hJ
bmRleEluQmxvY2spOwogICAgICAgICAgICAgY29tcGlsZVBlZXBIb2xlSW50ZWdlckJyYW5jaChu
b2RlLCBicmFuY2hOb2RlSW5kZXgsIE1hY3JvQXNzZW1ibGVyOjpFcXVhbCk7CiAgICAgICAgICAg
ICB1c2Uobm9kZS5jaGlsZDEoKSk7CiAgICAgICAgICAgICB1c2Uobm9kZS5jaGlsZDIoKSk7Cisg
ICAgICAgICAgICBtX2luZGV4SW5CbG9jayA9IGJyYW5jaEluZGV4SW5CbG9jazsKICAgICAgICAg
ICAgIG1fY29tcGlsZUluZGV4ID0gYnJhbmNoTm9kZUluZGV4OwogICAgICAgICAgICAgcmV0dXJu
IHRydWU7CiAgICAgICAgIH0KQEAgLTI1ODEsMTEgKzI1OTEsMTMgQEAgYm9vbCBTcGVjdWxhdGl2
ZUpJVDo6Y29tcGlsZVN0cmljdEVxKE5vZAogICAgIC8vIDMpIElmIHRoZSBvcGVyYW5kcyBhcmUg
cHJlZGljdGVkIGRvdWJsZSwgZG8gYSBkb3VibGUgY29tcGFyaXNvbi4KICAgICAKICAgICBpZiAo
Tm9kZTo6c2hvdWxkU3BlY3VsYXRlTnVtYmVyKGF0KG5vZGUuY2hpbGQxKCkpLCBhdChub2RlLmNo
aWxkMigpKSkpIHsKLSAgICAgICAgTm9kZUluZGV4IGJyYW5jaE5vZGVJbmRleCA9IGRldGVjdFBl
ZXBIb2xlQnJhbmNoKCk7Ci0gICAgICAgIGlmIChicmFuY2hOb2RlSW5kZXggIT0gTm9Ob2RlKSB7
CisgICAgICAgIHVuc2lnbmVkIGJyYW5jaEluZGV4SW5CbG9jayA9IGRldGVjdFBlZXBIb2xlQnJh
bmNoKCk7CisgICAgICAgIGlmIChicmFuY2hJbmRleEluQmxvY2sgIT0gVUlOVF9NQVgpIHsKKyAg
ICAgICAgICAgIE5vZGVJbmRleCBicmFuY2hOb2RlSW5kZXggPSBtX2ppdC5ncmFwaCgpLm1fYmxv
Y2tzW21fYmxvY2tdLT5hdChicmFuY2hJbmRleEluQmxvY2spOwogICAgICAgICAgICAgY29tcGls
ZVBlZXBIb2xlRG91YmxlQnJhbmNoKG5vZGUsIGJyYW5jaE5vZGVJbmRleCwgTWFjcm9Bc3NlbWJs
ZXI6OkRvdWJsZUVxdWFsKTsKICAgICAgICAgICAgIHVzZShub2RlLmNoaWxkMSgpKTsKICAgICAg
ICAgICAgIHVzZShub2RlLmNoaWxkMigpKTsKKyAgICAgICAgICAgIG1faW5kZXhJbkJsb2NrID0g
YnJhbmNoSW5kZXhJbkJsb2NrOwogICAgICAgICAgICAgbV9jb21waWxlSW5kZXggPSBicmFuY2hO
b2RlSW5kZXg7CiAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgfQpAQCAtMjU5Nywx
MSArMjYwOSwxMyBAQCBib29sIFNwZWN1bGF0aXZlSklUOjpjb21waWxlU3RyaWN0RXEoTm9kCiAg
ICAgLy8gICAgb3IgYXJyYXkgY29tcGFyaXNvbi4KICAgICAKICAgICBpZiAoTm9kZTo6c2hvdWxk
U3BlY3VsYXRlRmluYWxPYmplY3QoYXQobm9kZS5jaGlsZDEoKSksIGF0KG5vZGUuY2hpbGQyKCkp
KSkgewotICAgICAgICBOb2RlSW5kZXggYnJhbmNoTm9kZUluZGV4ID0gZGV0ZWN0UGVlcEhvbGVC
cmFuY2goKTsKLSAgICAgICAgaWYgKGJyYW5jaE5vZGVJbmRleCAhPSBOb05vZGUpIHsKKyAgICAg
ICAgdW5zaWduZWQgYnJhbmNoSW5kZXhJbkJsb2NrID0gZGV0ZWN0UGVlcEhvbGVCcmFuY2goKTsK
KyAgICAgICAgaWYgKGJyYW5jaEluZGV4SW5CbG9jayAhPSBVSU5UX01BWCkgeworICAgICAgICAg
ICAgTm9kZUluZGV4IGJyYW5jaE5vZGVJbmRleCA9IG1faml0LmdyYXBoKCkubV9ibG9ja3NbbV9i
bG9ja10tPmF0KGJyYW5jaEluZGV4SW5CbG9jayk7CiAgICAgICAgICAgICBjb21waWxlUGVlcEhv
bGVPYmplY3RFcXVhbGl0eShub2RlLCBicmFuY2hOb2RlSW5kZXgsICZKU0ZpbmFsT2JqZWN0Ojpz
X2luZm8sIGlzRmluYWxPYmplY3RQcmVkaWN0aW9uKTsKICAgICAgICAgICAgIHVzZShub2RlLmNo
aWxkMSgpKTsKICAgICAgICAgICAgIHVzZShub2RlLmNoaWxkMigpKTsKKyAgICAgICAgICAgIG1f
aW5kZXhJbkJsb2NrID0gYnJhbmNoSW5kZXhJbkJsb2NrOwogICAgICAgICAgICAgbV9jb21waWxl
SW5kZXggPSBicmFuY2hOb2RlSW5kZXg7CiAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAg
ICAgfQpAQCAtMjYxMCwxMSArMjYyNCwxMyBAQCBib29sIFNwZWN1bGF0aXZlSklUOjpjb21waWxl
U3RyaWN0RXEoTm9kCiAgICAgfQogICAgIAogICAgIGlmIChOb2RlOjpzaG91bGRTcGVjdWxhdGVB
cnJheShhdChub2RlLmNoaWxkMSgpKSwgYXQobm9kZS5jaGlsZDIoKSkpKSB7Ci0gICAgICAgIE5v
ZGVJbmRleCBicmFuY2hOb2RlSW5kZXggPSBkZXRlY3RQZWVwSG9sZUJyYW5jaCgpOwotICAgICAg
ICBpZiAoYnJhbmNoTm9kZUluZGV4ICE9IE5vTm9kZSkgeworICAgICAgICB1bnNpZ25lZCBicmFu
Y2hJbmRleEluQmxvY2sgPSBkZXRlY3RQZWVwSG9sZUJyYW5jaCgpOworICAgICAgICBpZiAoYnJh
bmNoSW5kZXhJbkJsb2NrICE9IFVJTlRfTUFYKSB7CisgICAgICAgICAgICBOb2RlSW5kZXggYnJh
bmNoTm9kZUluZGV4ID0gbV9qaXQuZ3JhcGgoKS5tX2Jsb2Nrc1ttX2Jsb2NrXS0+YXQoYnJhbmNo
SW5kZXhJbkJsb2NrKTsKICAgICAgICAgICAgIGNvbXBpbGVQZWVwSG9sZU9iamVjdEVxdWFsaXR5
KG5vZGUsIGJyYW5jaE5vZGVJbmRleCwgJkpTQXJyYXk6OnNfaW5mbywgaXNBcnJheVByZWRpY3Rp
b24pOwogICAgICAgICAgICAgdXNlKG5vZGUuY2hpbGQxKCkpOwogICAgICAgICAgICAgdXNlKG5v
ZGUuY2hpbGQyKCkpOworICAgICAgICAgICAgbV9pbmRleEluQmxvY2sgPSBicmFuY2hJbmRleElu
QmxvY2s7CiAgICAgICAgICAgICBtX2NvbXBpbGVJbmRleCA9IGJyYW5jaE5vZGVJbmRleDsKICAg
ICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICB9CkluZGV4OiBTb3VyY2UvSmF2YVNjcmlw
dENvcmUvZGZnL0RGR1NwZWN1bGF0aXZlSklULmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL0phdmFT
Y3JpcHRDb3JlL2RmZy9ERkdTcGVjdWxhdGl2ZUpJVC5oCShyZXZpc2lvbiAxMDkyMDcpCisrKyBT
b3VyY2UvSmF2YVNjcmlwdENvcmUvZGZnL0RGR1NwZWN1bGF0aXZlSklULmgJKHdvcmtpbmcgY29w
eSkKQEAgLTg3MywyMCArODczLDIxIEBAIHByaXZhdGU6CiAgICAgICAgIH0KICAgICB9CiAgICAg
Ci0gICAgLy8gUmV0dXJucyB0aGUgbm9kZSBpbmRleCBvZiB0aGUgYnJhbmNoIG5vZGUgaWYgcGVl
cGhvbGUgaXMgb2theSwgTm9Ob2RlIG90aGVyd2lzZS4KLSAgICBOb2RlSW5kZXggZGV0ZWN0UGVl
cEhvbGVCcmFuY2goKQorICAgIC8vIFJldHVybnMgdGhlIGluZGV4IG9mIHRoZSBicmFuY2ggbm9k
ZSBpZiBwZWVwaG9sZSBpcyBva2F5LCBVSU5UX01BWCBvdGhlcndpc2UuCisgICAgdW5zaWduZWQg
ZGV0ZWN0UGVlcEhvbGVCcmFuY2goKQogICAgIHsKLSAgICAgICAgTm9kZUluZGV4IGxhc3ROb2Rl
SW5kZXggPSBtX2ppdC5ncmFwaCgpLm1fYmxvY2tzW21fYmxvY2tdLT5lbmQgLSAxOworICAgICAg
ICBCYXNpY0Jsb2NrKiBibG9jayA9IG1faml0LmdyYXBoKCkubV9ibG9ja3NbbV9ibG9ja10uZ2V0
KCk7CiAKICAgICAgICAgLy8gQ2hlY2sgdGhhdCBubyBpbnRlcnZlbmluZyBub2RlcyB3aWxsIGJl
IGdlbmVyYXRlZC4KLSAgICAgICAgZm9yIChOb2RlSW5kZXggaW5kZXggPSBtX2NvbXBpbGVJbmRl
eCArIDE7IGluZGV4IDwgbGFzdE5vZGVJbmRleDsgKytpbmRleCkgewotICAgICAgICAgICAgaWYg
KGF0KGluZGV4KS5zaG91bGRHZW5lcmF0ZSgpKQotICAgICAgICAgICAgICAgIHJldHVybiBOb05v
ZGU7CisgICAgICAgIGZvciAodW5zaWduZWQgaW5kZXggPSBtX2luZGV4SW5CbG9jayArIDE7IGlu
ZGV4IDwgYmxvY2stPnNpemUoKSAtIDE7ICsraW5kZXgpIHsKKyAgICAgICAgICAgIE5vZGVJbmRl
eCBub2RlSW5kZXggPSBibG9jay0+YXQoaW5kZXgpOworICAgICAgICAgICAgaWYgKGF0KG5vZGVJ
bmRleCkuc2hvdWxkR2VuZXJhdGUoKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gVUlOVF9NQVg7
CiAgICAgICAgIH0KIAogICAgICAgICAvLyBDaGVjayBpZiB0aGUgbGFzdE5vZGUgaXMgYSBicmFu
Y2ggb24gdGhpcyBub2RlLgotICAgICAgICBOb2RlJiBsYXN0Tm9kZSA9IGF0KGxhc3ROb2RlSW5k
ZXgpOwotICAgICAgICByZXR1cm4gbGFzdE5vZGUub3AgPT0gQnJhbmNoICYmIGxhc3ROb2RlLmNo
aWxkMSgpLmluZGV4KCkgPT0gbV9jb21waWxlSW5kZXggPyBsYXN0Tm9kZUluZGV4IDogTm9Ob2Rl
OworICAgICAgICBOb2RlJiBsYXN0Tm9kZSA9IGF0KGJsb2NrLT5sYXN0KCkpOworICAgICAgICBy
ZXR1cm4gbGFzdE5vZGUub3AgPT0gQnJhbmNoICYmIGxhc3ROb2RlLmNoaWxkMSgpLmluZGV4KCkg
PT0gbV9jb21waWxlSW5kZXggPyBibG9jay0+c2l6ZSgpIC0gMSA6IFVJTlRfTUFYOwogICAgIH0K
ICAgICAKICAgICB2b2lkIG5vblNwZWN1bGF0aXZlVmFsdWVUb051bWJlcihOb2RlJik7CkBAIC0x
ODgwLDYgKzE4ODEsNyBAQCBwcml2YXRlOgogICAgIC8vIFRoZSBjdXJyZW50IG5vZGUgYmVpbmcg
Z2VuZXJhdGVkLgogICAgIEJsb2NrSW5kZXggbV9ibG9jazsKICAgICBOb2RlSW5kZXggbV9jb21w
aWxlSW5kZXg7CisgICAgdW5zaWduZWQgbV9pbmRleEluQmxvY2s7CiAgICAgLy8gVmlydHVhbCBh
bmQgcGh5c2ljYWwgcmVnaXN0ZXIgbWFwcy4KICAgICBWZWN0b3I8R2VuZXJhdGlvbkluZm8sIDMy
PiBtX2dlbmVyYXRpb25JbmZvOwogICAgIFJlZ2lzdGVyQmFuazxHUFJJbmZvPiBtX2dwcnM7CkBA
IC0yNTEzLDYgKzI1MTUsNyBAQCBpbmxpbmUgU3BlY3VsYXRpdmVKSVQ6OlNwZWN1bGF0aXZlSklU
KEpJCiAgICAgOiBtX2NvbXBpbGVPa2F5KHRydWUpCiAgICAgLCBtX2ppdChqaXQpCiAgICAgLCBt
X2NvbXBpbGVJbmRleCgwKQorICAgICwgbV9pbmRleEluQmxvY2soMCkKICAgICAsIG1fZ2VuZXJh
dGlvbkluZm8obV9qaXQuY29kZUJsb2NrKCktPm1fbnVtQ2FsbGVlUmVnaXN0ZXJzKQogICAgICwg
bV9ibG9ja0hlYWRzKGppdC5ncmFwaCgpLm1fYmxvY2tzLnNpemUoKSkKICAgICAsIG1fYXJndW1l
bnRzKGppdC5jb2RlQmxvY2soKS0+bnVtUGFyYW1ldGVycygpKQpJbmRleDogU291cmNlL0phdmFT
Y3JpcHRDb3JlL2RmZy9ERkdWaXJ0dWFsUmVnaXN0ZXJBbGxvY2F0aW9uUGhhc2UuY3BwCj09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9kZmcvREZHVmlydHVhbFJlZ2lzdGVyQWxs
b2NhdGlvblBoYXNlLmNwcAkocmV2aXNpb24gMTA5MjA3KQorKysgU291cmNlL0phdmFTY3JpcHRD
b3JlL2RmZy9ERkdWaXJ0dWFsUmVnaXN0ZXJBbGxvY2F0aW9uUGhhc2UuY3BwCSh3b3JraW5nIGNv
cHkpCkBAIC00OCw4ICs0OCw3IEBAIHB1YmxpYzoKICAgICAgICAgZGF0YUxvZygiXG4iKTsKICNl
bmRpZgogICAgICAgICBTY29yZUJvYXJkIHNjb3JlQm9hcmQobV9ncmFwaCwgbV9ncmFwaC5tX3By
ZXNlcnZlZFZhcnMpOwotICAgICAgICB1bnNpZ25lZCBzaXplRXhjbHVkaW5nUGhpTm9kZXMgPSBt
X2dyYXBoLm1fYmxvY2tzLmxhc3QoKS0+ZW5kOwotICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsg
aSA8IHNpemVFeGNsdWRpbmdQaGlOb2RlczsgKytpKSB7CisgICAgICAgIGZvciAoc2l6ZV90IGkg
PSAwOyBpIDwgbV9ncmFwaC5zaXplKCk7ICsraSkgewogICAgICAgICAgICAgTm9kZSYgbm9kZSA9
IG1fZ3JhcGhbaV07CiAgICAgICAgIAogICAgICAgICAgICAgaWYgKCFub2RlLnNob3VsZEdlbmVy
YXRlKCkgfHwgbm9kZS5vcCA9PSBQaGkgfHwgbm9kZS5vcCA9PSBGbHVzaCkK
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>129614</attachid>
            <date>2012-02-29 19:20:42 -0800</date>
            <delta_ts>2012-02-29 21:23:50 -0800</delta_ts>
            <desc>Patch for review</desc>
            <filename>79899.1.patch</filename>
            <type>text/plain</type>
            <size>38353</size>
            <attacher name="Yuqiang Xian">yuqiang.xian</attacher>
            
              <data encoding="base64">SW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9DaGFuZ2VMb2cKPT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291
cmNlL0phdmFTY3JpcHRDb3JlL0NoYW5nZUxvZwkocmV2aXNpb24gMTA5Mjk2KQorKysgU291cmNl
L0phdmFTY3JpcHRDb3JlL0NoYW5nZUxvZwkod29ya2luZyBjb3B5KQpAQCAtMSwzICsxLDY2IEBA
CisyMDEyLTAyLTI5ICBZdXFpYW5nIFhpYW4gIDx5dXFpYW5nLnhpYW5AaW50ZWwuY29tPgorCisg
ICAgICAgIERGRyBCYXNpY0Jsb2NrcyBzaG91bGQgbm90IHJlcXVpcmUgdGhhdCB0aGVpciBub2Rl
cyBoYXZlIGNvbnRpbnVvdXMgaW5kaWNlcyBpbiB0aGUgZ3JhcGgKKyAgICAgICAgaHR0cHM6Ly9i
dWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTc5ODk5CisKKyAgICAgICAgUmV2aWV3ZWQg
YnkgTk9CT0RZIChPT1BTISkuCisKKyAgICAgICAgVGhpcyB3aWxsIG1ha2UgaXQgbW9yZSBjb252
ZW5pZW50IHRvIGluc2VydCBub2RlcyBpbnRvIHRoZSBERkcuCisgICAgICAgIFdpdGggdGhpcyBj
YXBhYmlsaXR5IHdlIG5vdyBwbGFjZSB0aGUgUGhpIG5vZGVzIGluIHRoZSBjb3JyZXNwb25kaW5n
CisgICAgICAgIGJsb2Nrcy4KKworICAgICAgICAqIGRmZy9ERkdBYnN0cmFjdFN0YXRlLmNwcDoK
KyAgICAgICAgKEpTQzo6REZHOjpBYnN0cmFjdFN0YXRlOjpBYnN0cmFjdFN0YXRlKToKKyAgICAg
ICAgKEpTQzo6REZHOjpBYnN0cmFjdFN0YXRlOjpiZWdpbkJhc2ljQmxvY2spOgorICAgICAgICAo
SlNDOjpERkc6OkFic3RyYWN0U3RhdGU6OmV4ZWN1dGUpOgorICAgICAgICAoSlNDOjpERkc6OkFi
c3RyYWN0U3RhdGU6OmNsb2JiZXJTdHJ1Y3R1cmVzKToKKyAgICAgICAgKEpTQzo6REZHOjpBYnN0
cmFjdFN0YXRlOjptZXJnZVRvU3VjY2Vzc29ycyk6CisgICAgICAgIChKU0M6OkRGRzo6QWJzdHJh
Y3RTdGF0ZTo6ZHVtcCk6CisgICAgICAgICogZGZnL0RGR0Fic3RyYWN0U3RhdGUuaDoKKyAgICAg
ICAgKEpTQzo6REZHOjpBYnN0cmFjdFN0YXRlOjpmb3JOb2RlKToKKyAgICAgICAgKEFic3RyYWN0
U3RhdGUpOgorICAgICAgICAqIGRmZy9ERkdBcml0aE5vZGVGbGFnc0luZmVyZW5jZVBoYXNlLmNw
cDoKKyAgICAgICAgKEFyaXRoTm9kZUZsYWdzSW5mZXJlbmNlUGhhc2UpOgorICAgICAgICAqIGRm
Zy9ERkdCYXNpY0Jsb2NrLmg6CisgICAgICAgIChKU0M6OkRGRzo6QmFzaWNCbG9jazo6QmFzaWNC
bG9jayk6CisgICAgICAgIChCYXNpY0Jsb2NrKToKKyAgICAgICAgKiBkZmcvREZHQnl0ZUNvZGVQ
YXJzZXIuY3BwOgorICAgICAgICAoSlNDOjpERkc6OkJ5dGVDb2RlUGFyc2VyOjphZGRUb0dyYXBo
KToKKyAgICAgICAgKEJ5dGVDb2RlUGFyc2VyKToKKyAgICAgICAgKEpTQzo6REZHOjpCeXRlQ29k
ZVBhcnNlcjo6aW5zZXJ0UGhpTm9kZSk6CisgICAgICAgIChKU0M6OkRGRzo6Qnl0ZUNvZGVQYXJz
ZXI6OmhhbmRsZUlubGluaW5nKToKKyAgICAgICAgKEpTQzo6REZHOjpCeXRlQ29kZVBhcnNlcjo6
cGFyc2VCbG9jayk6CisgICAgICAgIChKU0M6OkRGRzo6Qnl0ZUNvZGVQYXJzZXI6OnByb2Nlc3NQ
aGlTdGFjayk6CisgICAgICAgIChKU0M6OkRGRzo6Qnl0ZUNvZGVQYXJzZXI6OmxpbmtCbG9jayk6
CisgICAgICAgIChKU0M6OkRGRzo6Qnl0ZUNvZGVQYXJzZXI6OmRldGVybWluZVJlYWNoYWJpbGl0
eSk6CisgICAgICAgIChKU0M6OkRGRzo6Qnl0ZUNvZGVQYXJzZXI6OnBhcnNlQ29kZUJsb2NrKToK
KyAgICAgICAgKiBkZmcvREZHQ0ZBUGhhc2UuY3BwOgorICAgICAgICAoSlNDOjpERkc6OkNGQVBo
YXNlOjpwZXJmb3JtQmxvY2tDRkEpOgorICAgICAgICAoQ0ZBUGhhc2UpOgorICAgICAgICAqIGRm
Zy9ERkdDU0VQaGFzZS5jcHA6CisgICAgICAgIChKU0M6OkRGRzo6Q1NFUGhhc2U6OnBlcmZvcm1C
bG9ja0NTRSk6CisgICAgICAgICogZGZnL0RGR0dyYXBoLmNwcDoKKyAgICAgICAgKEpTQzo6REZH
OjpHcmFwaDo6ZHVtcCk6CisgICAgICAgICogZGZnL0RGR1BoYXNlLmNwcDoKKyAgICAgICAgKEpT
Qzo6REZHOjpQaGFzZTo6YmVnaW5QaGFzZSk6CisgICAgICAgICogZGZnL0RGR1NwZWN1bGF0aXZl
SklULmNwcDoKKyAgICAgICAgKEpTQzo6REZHOjpTcGVjdWxhdGl2ZUpJVDo6bm9uU3BlY3VsYXRp
dmVDb21wYXJlKToKKyAgICAgICAgKEpTQzo6REZHOjpTcGVjdWxhdGl2ZUpJVDo6bm9uU3BlY3Vs
YXRpdmVTdHJpY3RFcSk6CisgICAgICAgIChKU0M6OkRGRzo6U3BlY3VsYXRpdmVKSVQ6OmNvbXBp
bGVQZWVwSG9sZUJyYW5jaCk6CisgICAgICAgIChKU0M6OkRGRzo6U3BlY3VsYXRpdmVKSVQ6OmNv
bXBpbGUpOgorICAgICAgICAoSlNDOjpERkc6OlNwZWN1bGF0aXZlSklUOjpjb21waWxlU3RyaWN0
RXFGb3JDb25zdGFudCk6CisgICAgICAgIChKU0M6OkRGRzo6U3BlY3VsYXRpdmVKSVQ6OmNvbXBp
bGVTdHJpY3RFcSk6CisgICAgICAgICogZGZnL0RGR1NwZWN1bGF0aXZlSklULmg6CisgICAgICAg
IChTcGVjdWxhdGl2ZUpJVCk6CisgICAgICAgIChKU0M6OkRGRzo6U3BlY3VsYXRpdmVKSVQ6OmRl
dGVjdFBlZXBIb2xlQnJhbmNoKToKKyAgICAgICAgKEpTQzo6REZHOjpTcGVjdWxhdGl2ZUpJVDo6
U3BlY3VsYXRpdmVKSVQpOgorICAgICAgICAqIGRmZy9ERkdTcGVjdWxhdGl2ZUpJVDMyXzY0LmNw
cDoKKyAgICAgICAgKEpTQzo6REZHOjpTcGVjdWxhdGl2ZUpJVDo6bm9uU3BlY3VsYXRpdmVDb21w
YXJlTnVsbCk6CisgICAgICAgICogZGZnL0RGR1NwZWN1bGF0aXZlSklUNjQuY3BwOgorICAgICAg
ICAoSlNDOjpERkc6OlNwZWN1bGF0aXZlSklUOjpub25TcGVjdWxhdGl2ZUNvbXBhcmVOdWxsKToK
KyAgICAgICAgKiBkZmcvREZHVmlydHVhbFJlZ2lzdGVyQWxsb2NhdGlvblBoYXNlLmNwcDoKKyAg
ICAgICAgKEpTQzo6REZHOjpWaXJ0dWFsUmVnaXN0ZXJBbGxvY2F0aW9uUGhhc2U6OnJ1bik6CisK
IDIwMTItMDItMjkgIEdhdmluIEJhcnJhY2xvdWdoICA8YmFycmFjbG91Z2hAYXBwbGUuY29tPgog
CiAgICAgICAgIFJ1YmJlciBzdGFtcGVkIGJ5IE9saXZlciBIdW50LgpJbmRleDogU291cmNlL0ph
dmFTY3JpcHRDb3JlL2RmZy9ERkdBYnN0cmFjdFN0YXRlLmNwcAo9PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3Vy
Y2UvSmF2YVNjcmlwdENvcmUvZGZnL0RGR0Fic3RyYWN0U3RhdGUuY3BwCShyZXZpc2lvbiAxMDky
OTUpCisrKyBTb3VyY2UvSmF2YVNjcmlwdENvcmUvZGZnL0RGR0Fic3RyYWN0U3RhdGUuY3BwCSh3
b3JraW5nIGNvcHkpCkBAIC01NCwxMyArNTQsNyBAQCBBYnN0cmFjdFN0YXRlOjpBYnN0cmFjdFN0
YXRlKEdyYXBoJiBncmFwCiAgICAgLCBtX3ZhcmlhYmxlcyhtX2NvZGVCbG9jay0+bnVtUGFyYW1l
dGVycygpLCBncmFwaC5tX2xvY2FsVmFycykKICAgICAsIG1fYmxvY2soMCkKIHsKLSAgICBzaXpl
X3QgbWF4QmxvY2tTaXplID0gMDsKLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGdyYXBoLm1f
YmxvY2tzLnNpemUoKTsgKytpKSB7Ci0gICAgICAgIEJhc2ljQmxvY2sqIGJsb2NrID0gZ3JhcGgu
bV9ibG9ja3NbaV0uZ2V0KCk7Ci0gICAgICAgIGlmIChibG9jay0+ZW5kIC0gYmxvY2stPmJlZ2lu
ID4gbWF4QmxvY2tTaXplKQotICAgICAgICAgICAgbWF4QmxvY2tTaXplID0gYmxvY2stPmVuZCAt
IGJsb2NrLT5iZWdpbjsKLSAgICB9Ci0gICAgbV9ub2Rlcy5yZXNpemUobWF4QmxvY2tTaXplKTsK
KyAgICBtX25vZGVzLnJlc2l6ZShncmFwaC5zaXplKCkpOwogfQogCiBBYnN0cmFjdFN0YXRlOjp+
QWJzdHJhY3RTdGF0ZSgpIHsgfQpAQCAtNzUsOCArNjksOSBAQCB2b2lkIEFic3RyYWN0U3RhdGU6
OmJlZ2luQmFzaWNCbG9jayhCYXNpCiAgICAgQVNTRVJUKGJhc2ljQmxvY2stPnZhcmlhYmxlc0F0
VGFpbC5udW1iZXJPZkxvY2FscygpID09IGJhc2ljQmxvY2stPnZhbHVlc0F0VGFpbC5udW1iZXJP
ZkxvY2FscygpKTsKICAgICBBU1NFUlQoYmFzaWNCbG9jay0+dmFyaWFibGVzQXRIZWFkLm51bWJl
ck9mTG9jYWxzKCkgPT0gYmFzaWNCbG9jay0+dmFyaWFibGVzQXRUYWlsLm51bWJlck9mTG9jYWxz
KCkpOwogICAgIAotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgYmFzaWNCbG9jay0+ZW5kIC0g
YmFzaWNCbG9jay0+YmVnaW47ICsraSkKLSAgICAgICAgbV9ub2Rlc1tpXS5jbGVhcigpOworICAg
IGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgYmFzaWNCbG9jay0+c2l6ZSgpOyBpKyspCisgICAgICAg
IG1fbm9kZXNbYmFzaWNCbG9jay0+YXQoaSldLmNsZWFyKCk7CisKICAgICBtX3ZhcmlhYmxlcyA9
IGJhc2ljQmxvY2stPnZhbHVlc0F0SGVhZDsKICAgICBtX2hhdmVTdHJ1Y3R1cmVzID0gZmFsc2U7
CiAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtX3ZhcmlhYmxlcy5udW1iZXJPZkFyZ3VtZW50
cygpOyArK2kpIHsKQEAgLTIxNSwxMiArMjEwLDEzIEBAIHZvaWQgQWJzdHJhY3RTdGF0ZTo6cmVz
ZXQoKQogICAgIG1faXNWYWxpZCA9IGZhbHNlOwogfQogCi1ib29sIEFic3RyYWN0U3RhdGU6OmV4
ZWN1dGUoTm9kZUluZGV4IG5vZGVJbmRleCkKK2Jvb2wgQWJzdHJhY3RTdGF0ZTo6ZXhlY3V0ZSh1
bnNpZ25lZCBpbmRleEluQmxvY2spCiB7CiAgICAgUFJPRklMRShGTEFHX0ZPUl9FWEVDVVRJT04p
OwogICAgIEFTU0VSVChtX2Jsb2NrKTsKICAgICBBU1NFUlQobV9pc1ZhbGlkKTsKICAgICAgICAg
CisgICAgTm9kZUluZGV4IG5vZGVJbmRleCA9IG1fYmxvY2stPmF0KGluZGV4SW5CbG9jayk7CiAg
ICAgTm9kZSYgbm9kZSA9IG1fZ3JhcGhbbm9kZUluZGV4XTsKICAgICAgICAgCiAgICAgaWYgKCFu
b2RlLnNob3VsZEdlbmVyYXRlKCkpCkBAIC0zMTksNyArMzE1LDcgQEAgYm9vbCBBYnN0cmFjdFN0
YXRlOjpleGVjdXRlKE5vZGVJbmRleCBubwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0K
ICAgICAgICAgaWYgKG5vZGUub3AgPT0gVmFsdWVBZGQpIHsKLSAgICAgICAgICAgIGNsb2JiZXJT
dHJ1Y3R1cmVzKG5vZGVJbmRleCk7CisgICAgICAgICAgICBjbG9iYmVyU3RydWN0dXJlcyhpbmRl
eEluQmxvY2spOwogICAgICAgICAgICAgZm9yTm9kZShub2RlSW5kZXgpLnNldChQcmVkaWN0U3Ry
aW5nIHwgUHJlZGljdEludDMyIHwgUHJlZGljdE51bWJlcik7CiAgICAgICAgICAgICBicmVhazsK
ICAgICAgICAgfQpAQCAtNDA5LDcgKzQwNSw3IEBAIGJvb2wgQWJzdHJhY3RTdGF0ZTo6ZXhlY3V0
ZShOb2RlSW5kZXggbm8KICAgICAgICAgZWxzZSBpZiAoY2hpbGQuc2hvdWxkU3BlY3VsYXRlTnVt
YmVyKCkpCiAgICAgICAgICAgICBmb3JOb2RlKG5vZGUuY2hpbGQxKCkpLmZpbHRlcihQcmVkaWN0
TnVtYmVyKTsKICAgICAgICAgZWxzZQotICAgICAgICAgICAgY2xvYmJlclN0cnVjdHVyZXMobm9k
ZUluZGV4KTsKKyAgICAgICAgICAgIGNsb2JiZXJTdHJ1Y3R1cmVzKGluZGV4SW5CbG9jayk7CiAg
ICAgICAgIGZvck5vZGUobm9kZUluZGV4KS5zZXQoUHJlZGljdEJvb2xlYW4pOwogICAgICAgICBi
cmVhazsKICAgICB9CkBAIC00MzIsNyArNDI4LDcgQEAgYm9vbCBBYnN0cmFjdFN0YXRlOjpleGVj
dXRlKE5vZGVJbmRleCBubwogICAgICAgICAgICAgZmlsdGVyID0gUHJlZGljdEFycmF5OwogICAg
ICAgICBlbHNlIHsKICAgICAgICAgICAgIGZpbHRlciA9IFByZWRpY3RUb3A7Ci0gICAgICAgICAg
ICBjbG9iYmVyU3RydWN0dXJlcyhub2RlSW5kZXgpOworICAgICAgICAgICAgY2xvYmJlclN0cnVj
dHVyZXMoaW5kZXhJbkJsb2NrKTsKICAgICAgICAgfQogICAgICAgICBmb3JOb2RlKG5vZGUuY2hp
bGQxKCkpLmZpbHRlcihmaWx0ZXIpOwogICAgICAgICBmb3JOb2RlKG5vZGUuY2hpbGQyKCkpLmZp
bHRlcihmaWx0ZXIpOwpAQCAtNDYyLDcgKzQ1OCw3IEBAIGJvb2wgQWJzdHJhY3RTdGF0ZTo6ZXhl
Y3V0ZShOb2RlSW5kZXggbm8KICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAgICAgICAg
IGlmICghaXNBY3Rpb25hYmxlQXJyYXlQcmVkaWN0aW9uKG1fZ3JhcGhbbm9kZS5jaGlsZDEoKV0u
cHJlZGljdGlvbigpKSB8fCAhbV9ncmFwaFtub2RlLmNoaWxkMigpXS5zaG91bGRTcGVjdWxhdGVJ
bnRlZ2VyKCkpIHsKLSAgICAgICAgICAgIGNsb2JiZXJTdHJ1Y3R1cmVzKG5vZGVJbmRleCk7Cisg
ICAgICAgICAgICBjbG9iYmVyU3RydWN0dXJlcyhpbmRleEluQmxvY2spOwogICAgICAgICAgICAg
Zm9yTm9kZShub2RlSW5kZXgpLm1ha2VUb3AoKTsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAg
ICB9CkBAIC01NDgsNyArNTQ0LDcgQEAgYm9vbCBBYnN0cmFjdFN0YXRlOjpleGVjdXRlKE5vZGVJ
bmRleCBubwogICAgICAgICB9CiAgICAgICAgIGlmICghbV9ncmFwaFtub2RlLmNoaWxkMigpXS5z
aG91bGRTcGVjdWxhdGVJbnRlZ2VyKCkgfHwgIWlzQWN0aW9uYWJsZU11dGFibGVBcnJheVByZWRp
Y3Rpb24obV9ncmFwaFtub2RlLmNoaWxkMSgpXS5wcmVkaWN0aW9uKCkpKSB7CiAgICAgICAgICAg
ICBBU1NFUlQobm9kZS5vcCA9PSBQdXRCeVZhbCk7Ci0gICAgICAgICAgICBjbG9iYmVyU3RydWN0
dXJlcyhub2RlSW5kZXgpOworICAgICAgICAgICAgY2xvYmJlclN0cnVjdHVyZXMoaW5kZXhJbkJs
b2NrKTsKICAgICAgICAgICAgIGZvck5vZGUobm9kZUluZGV4KS5tYWtlVG9wKCk7CiAgICAgICAg
ICAgICBicmVhazsKICAgICAgICAgfQpAQCAtNzY2LDcgKzc2Miw3IEBAIGJvb2wgQWJzdHJhY3RT
dGF0ZTo6ZXhlY3V0ZShOb2RlSW5kZXggbm8KICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAK
ICAgICBjYXNlIFB1dFNjb3BlZFZhcjoKLSAgICAgICAgY2xvYmJlclN0cnVjdHVyZXMobm9kZUlu
ZGV4KTsKKyAgICAgICAgY2xvYmJlclN0cnVjdHVyZXMoaW5kZXhJbkJsb2NrKTsKICAgICAgICAg
YnJlYWs7CiAgICAgICAgICAgICAKICAgICBjYXNlIEdldEJ5SWQ6CkBAIC03NzcsNyArNzczLDcg
QEAgYm9vbCBBYnN0cmFjdFN0YXRlOjpleGVjdXRlKE5vZGVJbmRleCBubwogICAgICAgICB9CiAg
ICAgICAgIGlmIChpc0NlbGxQcmVkaWN0aW9uKG1fZ3JhcGhbbm9kZS5jaGlsZDEoKV0ucHJlZGlj
dGlvbigpKSkKICAgICAgICAgICAgIGZvck5vZGUobm9kZS5jaGlsZDEoKSkuZmlsdGVyKFByZWRp
Y3RDZWxsKTsKLSAgICAgICAgY2xvYmJlclN0cnVjdHVyZXMobm9kZUluZGV4KTsKKyAgICAgICAg
Y2xvYmJlclN0cnVjdHVyZXMoaW5kZXhJbkJsb2NrKTsKICAgICAgICAgZm9yTm9kZShub2RlSW5k
ZXgpLm1ha2VUb3AoKTsKICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAKQEAgLTgzOSw3ICs4
MzUsNyBAQCBib29sIEFic3RyYWN0U3RhdGU6OmV4ZWN1dGUoTm9kZUluZGV4IG5vCiAgICAgICAg
IGJyZWFrOwogICAgICAgICAgICAgCiAgICAgY2FzZSBQdXRTdHJ1Y3R1cmU6Ci0gICAgICAgIGNs
b2JiZXJTdHJ1Y3R1cmVzKG5vZGVJbmRleCk7CisgICAgICAgIGNsb2JiZXJTdHJ1Y3R1cmVzKGlu
ZGV4SW5CbG9jayk7CiAgICAgICAgIGZvck5vZGUobm9kZS5jaGlsZDEoKSkuc2V0KG5vZGUuc3Ry
dWN0dXJlVHJhbnNpdGlvbkRhdGEoKS5uZXdTdHJ1Y3R1cmUpOwogICAgICAgICBtX2hhdmVTdHJ1
Y3R1cmVzID0gdHJ1ZTsKICAgICAgICAgYnJlYWs7CkBAIC05MzAsNyArOTI2LDcgQEAgYm9vbCBB
YnN0cmFjdFN0YXRlOjpleGVjdXRlKE5vZGVJbmRleCBubwogICAgIGNhc2UgUHV0QnlJZDoKICAg
ICBjYXNlIFB1dEJ5SWREaXJlY3Q6CiAgICAgICAgIGZvck5vZGUobm9kZS5jaGlsZDEoKSkuZmls
dGVyKFByZWRpY3RDZWxsKTsKLSAgICAgICAgY2xvYmJlclN0cnVjdHVyZXMobm9kZUluZGV4KTsK
KyAgICAgICAgY2xvYmJlclN0cnVjdHVyZXMoaW5kZXhJbkJsb2NrKTsKICAgICAgICAgYnJlYWs7
CiAgICAgICAgICAgICAKICAgICBjYXNlIEdldEdsb2JhbFZhcjoKQEAgLTk2Niw3ICs5NjIsNyBA
QCBib29sIEFic3RyYWN0U3RhdGU6OmV4ZWN1dGUoTm9kZUluZGV4IG5vCiAgICAgY2FzZSBSZXNv
bHZlQmFzZToKICAgICBjYXNlIFJlc29sdmVCYXNlU3RyaWN0UHV0OgogICAgIGNhc2UgUmVzb2x2
ZUdsb2JhbDoKLSAgICAgICAgY2xvYmJlclN0cnVjdHVyZXMobm9kZUluZGV4KTsKKyAgICAgICAg
Y2xvYmJlclN0cnVjdHVyZXMoaW5kZXhJbkJsb2NrKTsKICAgICAgICAgZm9yTm9kZShub2RlSW5k
ZXgpLm1ha2VUb3AoKTsKICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAKQEAgLTk4MywxMyAr
OTc5LDEzIEBAIGJvb2wgQWJzdHJhY3RTdGF0ZTo6ZXhlY3V0ZShOb2RlSW5kZXggbm8KICAgICBy
ZXR1cm4gbV9pc1ZhbGlkOwogfQogCi1pbmxpbmUgdm9pZCBBYnN0cmFjdFN0YXRlOjpjbG9iYmVy
U3RydWN0dXJlcyhOb2RlSW5kZXggbm9kZUluZGV4KQoraW5saW5lIHZvaWQgQWJzdHJhY3RTdGF0
ZTo6Y2xvYmJlclN0cnVjdHVyZXModW5zaWduZWQgaW5kZXhJbkJsb2NrKQogewogICAgIFBST0ZJ
TEUoRkxBR19GT1JfU1RSVUNUVVJFX0NMT0JCRVJJTkcpOwogICAgIGlmICghbV9oYXZlU3RydWN0
dXJlcykKICAgICAgICAgcmV0dXJuOwotICAgIGZvciAoc2l6ZV90IGkgPSBub2RlSW5kZXggLSBt
X2Jsb2NrLT5iZWdpbiArIDE7IGktLSA+IDA7KQotICAgICAgICBtX25vZGVzW2ldLmNsb2JiZXJT
dHJ1Y3R1cmVzKCk7CisgICAgZm9yIChzaXplX3QgaSA9IGluZGV4SW5CbG9jayArIDE7IGktLSA+
IG1fYmxvY2stPnN0YXJ0RXhjbHVkaW5nUGhpczspCisgICAgICAgIGZvck5vZGUobV9ibG9jay0+
YXQoaSkpLmNsb2JiZXJTdHJ1Y3R1cmVzKCk7CiAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBt
X3ZhcmlhYmxlcy5udW1iZXJPZkFyZ3VtZW50cygpOyArK2kpCiAgICAgICAgIG1fdmFyaWFibGVz
LmFyZ3VtZW50KGkpLmNsb2JiZXJTdHJ1Y3R1cmVzKCk7CiAgICAgZm9yIChzaXplX3QgaSA9IDA7
IGkgPCBtX3ZhcmlhYmxlcy5udW1iZXJPZkxvY2FscygpOyArK2kpCkBAIC0xMTA4LDcgKzExMDQs
NyBAQCBpbmxpbmUgYm9vbCBBYnN0cmFjdFN0YXRlOjptZXJnZVRvU3VjY2VzCiB7CiAgICAgUFJP
RklMRShGTEFHX0ZPUl9NRVJHRV9UT19TVUNDRVNTT1JTKTsKIAotICAgIE5vZGUmIHRlcm1pbmFs
ID0gZ3JhcGhbYmFzaWNCbG9jay0+ZW5kIC0gMV07CisgICAgTm9kZSYgdGVybWluYWwgPSBncmFw
aFtiYXNpY0Jsb2NrLT5sYXN0KCldOwogICAgIAogICAgIEFTU0VSVCh0ZXJtaW5hbC5pc1Rlcm1p
bmFsKCkpOwogICAgIApAQCAtMTE0NywxNSArMTE0MywxNyBAQCBpbmxpbmUgYm9vbCBBYnN0cmFj
dFN0YXRlOjptZXJnZVZhcmlhYmxlCiB2b2lkIEFic3RyYWN0U3RhdGU6OmR1bXAoRklMRSogb3V0
KQogewogICAgIGJvb2wgZmlyc3QgPSB0cnVlOwotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwg
bV9ub2Rlcy5zaXplKCk7ICsraSkgewotICAgICAgICBpZiAobV9ub2Rlc1tpXS5pc0NsZWFyKCkp
CisgICAgZm9yIChzaXplX3QgaSA9IG1fYmxvY2stPnN0YXJ0RXhjbHVkaW5nUGhpczsgaSA8IG1f
YmxvY2stPnNpemUoKTsgKytpKSB7CisgICAgICAgIE5vZGVJbmRleCBpbmRleCA9IG1fYmxvY2st
PmF0KGkpOworICAgICAgICBBYnN0cmFjdFZhbHVlJiB2YWx1ZSA9IG1fbm9kZXNbaW5kZXhdOwor
ICAgICAgICBpZiAodmFsdWUuaXNDbGVhcigpKQogICAgICAgICAgICAgY29udGludWU7CiAgICAg
ICAgIGlmIChmaXJzdCkKICAgICAgICAgICAgIGZpcnN0ID0gZmFsc2U7CiAgICAgICAgIGVsc2UK
ICAgICAgICAgICAgIGZwcmludGYob3V0LCAiICIpOwotICAgICAgICBmcHJpbnRmKG91dCwgIkAl
bHU6Iiwgc3RhdGljX2Nhc3Q8dW5zaWduZWQgbG9uZz4oaSArIG1fYmxvY2stPmJlZ2luKSk7Ci0g
ICAgICAgIG1fbm9kZXNbaV0uZHVtcChvdXQpOworICAgICAgICBmcHJpbnRmKG91dCwgIkAlbHU6
Iiwgc3RhdGljX2Nhc3Q8dW5zaWduZWQgbG9uZz4oaW5kZXgpKTsKKyAgICAgICAgdmFsdWUuZHVt
cChvdXQpOwogICAgIH0KIH0KICNlbmRpZgpJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL2Rm
Zy9ERkdBYnN0cmFjdFN0YXRlLmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRDb3Jl
L2RmZy9ERkdBYnN0cmFjdFN0YXRlLmgJKHJldmlzaW9uIDEwOTI5NSkKKysrIFNvdXJjZS9KYXZh
U2NyaXB0Q29yZS9kZmcvREZHQWJzdHJhY3RTdGF0ZS5oCSh3b3JraW5nIGNvcHkpCkBAIC05OCw3
ICs5OCw3IEBAIHB1YmxpYzoKICAgICAKICAgICBBYnN0cmFjdFZhbHVlJiBmb3JOb2RlKE5vZGVJ
bmRleCBub2RlSW5kZXgpCiAgICAgewotICAgICAgICByZXR1cm4gbV9ub2Rlc1tub2RlSW5kZXgg
LSBtX2Jsb2NrLT5iZWdpbl07CisgICAgICAgIHJldHVybiBtX25vZGVzW25vZGVJbmRleF07CiAg
ICAgfQogICAgIAogICAgIEFic3RyYWN0VmFsdWUmIGZvck5vZGUoTm9kZVVzZSBub2RlVXNlKQpA
QCAtMTUyLDcgKzE1Miw3IEBAIHB1YmxpYzoKICAgICAvLyBpZiBleGVjdXRpb24gc2hvdWxkIGNv
bnRpbnVlIHBhc3QgdGhpcyBub2RlLiBOb3RhYmx5LCBpdCB3aWxsIHJldHVybiB0cnVlCiAgICAg
Ly8gZm9yIGJsb2NrIHRlcm1pbmFscywgc28gbG9uZyBhcyB0aG9zZSB0ZXJtaW5hbHMgYXJlIG5v
dCBSZXR1cm4gb3IgdmFyaWFudHMKICAgICAvLyBvZiBUaHJvdy4KLSAgICBib29sIGV4ZWN1dGUo
Tm9kZUluZGV4KTsKKyAgICBib29sIGV4ZWN1dGUodW5zaWduZWQpOwogICAgIAogICAgIC8vIElz
IHRoZSBleGVjdXRpb24gc3RhdGUgc3RpbGwgdmFsaWQ/IFRoaXMgd2lsbCBiZSBmYWxzZSBpZiBl
eGVjdXRlKCkgaGFzCiAgICAgLy8gcmV0dXJuZWQgZmFsc2UgcHJldmlvdXNseS4KQEAgLTE3Niw3
ICsxNzYsNyBAQCBwdWJsaWM6CiAjZW5kaWYKICAgICAKIHByaXZhdGU6Ci0gICAgdm9pZCBjbG9i
YmVyU3RydWN0dXJlcyhOb2RlSW5kZXgpOworICAgIHZvaWQgY2xvYmJlclN0cnVjdHVyZXModW5z
aWduZWQpOwogICAgIAogICAgIGJvb2wgbWVyZ2VTdGF0ZUF0VGFpbChBYnN0cmFjdFZhbHVlJiBk
ZXN0aW5hdGlvbiwgQWJzdHJhY3RWYWx1ZSYgaW5WYXJpYWJsZSwgTm9kZUluZGV4KTsKICAgICAK
QEAgLTE4NSw3ICsxODUsNyBAQCBwcml2YXRlOgogICAgIENvZGVCbG9jayogbV9jb2RlQmxvY2s7
CiAgICAgR3JhcGgmIG1fZ3JhcGg7CiAgICAgCi0gICAgVmVjdG9yPEFic3RyYWN0VmFsdWUsIDMy
PiBtX25vZGVzOworICAgIFZlY3RvcjxBYnN0cmFjdFZhbHVlLCA2ND4gbV9ub2RlczsKICAgICBP
cGVyYW5kczxBYnN0cmFjdFZhbHVlPiBtX3ZhcmlhYmxlczsKICAgICBCYXNpY0Jsb2NrKiBtX2Js
b2NrOwogICAgIGJvb2wgbV9oYXZlU3RydWN0dXJlczsKSW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0
Q29yZS9kZmcvREZHQXJpdGhOb2RlRmxhZ3NJbmZlcmVuY2VQaGFzZS5jcHAKPT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQot
LS0gU291cmNlL0phdmFTY3JpcHRDb3JlL2RmZy9ERkdBcml0aE5vZGVGbGFnc0luZmVyZW5jZVBo
YXNlLmNwcAkocmV2aXNpb24gMTA5Mjk1KQorKysgU291cmNlL0phdmFTY3JpcHRDb3JlL2RmZy9E
RkdBcml0aE5vZGVGbGFnc0luZmVyZW5jZVBoYXNlLmNwcAkod29ya2luZyBjb3B5KQpAQCAtMjIy
LDYgKzIyMiw5IEBAIHByaXZhdGU6CiAgICAgCiAgICAgTm9kZUluZGV4IG1fY29tcGlsZUluZGV4
OwogICAgIGJvb2wgbV9jaGFuZ2VkOworI2lmIERGR19FTkFCTEUoREVCVUdfUFJPUEFHQVRJT05f
VkVSQk9TRSkKKyAgICB1bnNpZ25lZCBtX2NvdW50OworI2VuZGlmCiB9OwogCiB2b2lkIHBlcmZv
cm1Bcml0aE5vZGVGbGFnc0luZmVyZW5jZShHcmFwaCYgZ3JhcGgpCkluZGV4OiBTb3VyY2UvSmF2
YVNjcmlwdENvcmUvZGZnL0RGR0Jhc2ljQmxvY2suaAo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2
YVNjcmlwdENvcmUvZGZnL0RGR0Jhc2ljQmxvY2suaAkocmV2aXNpb24gMTA5Mjk1KQorKysgU291
cmNlL0phdmFTY3JpcHRDb3JlL2RmZy9ERkdCYXNpY0Jsb2NrLmgJKHdvcmtpbmcgY29weSkKQEAg
LTM4LDExICszOCw5IEBAIG5hbWVzcGFjZSBKU0MgeyBuYW1lc3BhY2UgREZHIHsKIAogdHlwZWRl
ZiBWZWN0b3IgPEJsb2NrSW5kZXgsIDI+IFByZWRlY2Vzc29yTGlzdDsKIAotc3RydWN0IEJhc2lj
QmxvY2sgewotICAgIEJhc2ljQmxvY2sodW5zaWduZWQgYnl0ZWNvZGVCZWdpbiwgTm9kZUluZGV4
IGJlZ2luLCB1bnNpZ25lZCBudW1Bcmd1bWVudHMsIHVuc2lnbmVkIG51bUxvY2FscykKK3N0cnVj
dCBCYXNpY0Jsb2NrIDogVmVjdG9yPE5vZGVJbmRleCwgOD4geworICAgIEJhc2ljQmxvY2sodW5z
aWduZWQgYnl0ZWNvZGVCZWdpbiwgdW5zaWduZWQgbnVtQXJndW1lbnRzLCB1bnNpZ25lZCBudW1M
b2NhbHMpCiAgICAgICAgIDogYnl0ZWNvZGVCZWdpbihieXRlY29kZUJlZ2luKQotICAgICAgICAs
IGJlZ2luKGJlZ2luKQotICAgICAgICAsIGVuZChOb05vZGUpCiAgICAgICAgICwgaXNPU1JUYXJn
ZXQoZmFsc2UpCiAgICAgICAgICwgY2ZhSGFzVmlzaXRlZChmYWxzZSkKICAgICAgICAgLCBjZmFT
aG91bGRSZXZpc2l0KGZhbHNlKQpAQCAtNTAsNiArNDgsNyBAQCBzdHJ1Y3QgQmFzaWNCbG9jayB7
CiAgICAgICAgICwgaXNMaW5rZWQoZmFsc2UpCiAjZW5kaWYKICAgICAgICAgLCBpc1JlYWNoYWJs
ZShmYWxzZSkKKyAgICAgICAgLCBzdGFydEV4Y2x1ZGluZ1BoaXMoMCkKICAgICAgICAgLCB2YXJp
YWJsZXNBdEhlYWQobnVtQXJndW1lbnRzLCBudW1Mb2NhbHMpCiAgICAgICAgICwgdmFyaWFibGVz
QXRUYWlsKG51bUFyZ3VtZW50cywgbnVtTG9jYWxzKQogICAgICAgICAsIHZhbHVlc0F0SGVhZChu
dW1Bcmd1bWVudHMsIG51bUxvY2FscykKQEAgLTY5LDggKzY4LDYgQEAgc3RydWN0IEJhc2ljQmxv
Y2sgewogICAgIC8vIGZvciBvdGhlciBwdXJwb3NlcyBkdWUgdG8gaW5saW5pbmcuCiAgICAgdW5z
aWduZWQgYnl0ZWNvZGVCZWdpbjsKICAgICAKLSAgICBOb2RlSW5kZXggYmVnaW47Ci0gICAgTm9k
ZUluZGV4IGVuZDsKICAgICBib29sIGlzT1NSVGFyZ2V0OwogICAgIGJvb2wgY2ZhSGFzVmlzaXRl
ZDsKICAgICBib29sIGNmYVNob3VsZFJldmlzaXQ7CkBAIC03OCw2ICs3NSw3IEBAIHN0cnVjdCBC
YXNpY0Jsb2NrIHsKICAgICBib29sIGlzTGlua2VkOwogI2VuZGlmCiAgICAgYm9vbCBpc1JlYWNo
YWJsZTsKKyAgICB1bnNpZ25lZCBzdGFydEV4Y2x1ZGluZ1BoaXM7CiAgICAgCiAgICAgUHJlZGVj
ZXNzb3JMaXN0IG1fcHJlZGVjZXNzb3JzOwogICAgIApJbmRleDogU291cmNlL0phdmFTY3JpcHRD
b3JlL2RmZy9ERkdCeXRlQ29kZVBhcnNlci5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL0phdmFT
Y3JpcHRDb3JlL2RmZy9ERkdCeXRlQ29kZVBhcnNlci5jcHAJKHJldmlzaW9uIDEwOTI5NSkKKysr
IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9kZmcvREZHQnl0ZUNvZGVQYXJzZXIuY3BwCSh3b3JraW5n
IGNvcHkpCkBAIC01NjksNiArNTY5LDcgQEAgcHJpdmF0ZToKICAgICB7CiAgICAgICAgIE5vZGVJ
bmRleCByZXN1bHRJbmRleCA9IChOb2RlSW5kZXgpbV9ncmFwaC5zaXplKCk7CiAgICAgICAgIG1f
Z3JhcGguYXBwZW5kKE5vZGUob3AsIGN1cnJlbnRDb2RlT3JpZ2luKCksIGNoaWxkMSwgY2hpbGQy
LCBjaGlsZDMpKTsKKyAgICAgICAgbV9jdXJyZW50QmxvY2stPmFwcGVuZChyZXN1bHRJbmRleCk7
CiAKICAgICAgICAgaWYgKG9wICYgTm9kZU11c3RHZW5lcmF0ZSkKICAgICAgICAgICAgIG1fZ3Jh
cGgucmVmKHJlc3VsdEluZGV4KTsKQEAgLTU3OCw2ICs1NzksNyBAQCBwcml2YXRlOgogICAgIHsK
ICAgICAgICAgTm9kZUluZGV4IHJlc3VsdEluZGV4ID0gKE5vZGVJbmRleCltX2dyYXBoLnNpemUo
KTsKICAgICAgICAgbV9ncmFwaC5hcHBlbmQoTm9kZShvcCwgY3VycmVudENvZGVPcmlnaW4oKSwg
aW5mbywgY2hpbGQxLCBjaGlsZDIsIGNoaWxkMykpOworICAgICAgICBtX2N1cnJlbnRCbG9jay0+
YXBwZW5kKHJlc3VsdEluZGV4KTsKIAogICAgICAgICBpZiAob3AgJiBOb2RlTXVzdEdlbmVyYXRl
KQogICAgICAgICAgICAgbV9ncmFwaC5yZWYocmVzdWx0SW5kZXgpOwpAQCAtNTg3LDYgKzU4OSw3
IEBAIHByaXZhdGU6CiAgICAgewogICAgICAgICBOb2RlSW5kZXggcmVzdWx0SW5kZXggPSAoTm9k
ZUluZGV4KW1fZ3JhcGguc2l6ZSgpOwogICAgICAgICBtX2dyYXBoLmFwcGVuZChOb2RlKG9wLCBj
dXJyZW50Q29kZU9yaWdpbigpLCBpbmZvMSwgaW5mbzIsIGNoaWxkMSwgY2hpbGQyLCBjaGlsZDMp
KTsKKyAgICAgICAgbV9jdXJyZW50QmxvY2stPmFwcGVuZChyZXN1bHRJbmRleCk7CiAKICAgICAg
ICAgaWYgKG9wICYgTm9kZU11c3RHZW5lcmF0ZSkKICAgICAgICAgICAgIG1fZ3JhcGgucmVmKHJl
c3VsdEluZGV4KTsKQEAgLTU5Nyw2ICs2MDAsNyBAQCBwcml2YXRlOgogICAgIHsKICAgICAgICAg
Tm9kZUluZGV4IHJlc3VsdEluZGV4ID0gKE5vZGVJbmRleCltX2dyYXBoLnNpemUoKTsKICAgICAg
ICAgbV9ncmFwaC5hcHBlbmQoTm9kZShOb2RlOjpWYXJBcmcsIG9wLCBjdXJyZW50Q29kZU9yaWdp
bigpLCBpbmZvMSwgaW5mbzIsIG1fZ3JhcGgubV92YXJBcmdDaGlsZHJlbi5zaXplKCkgLSBtX251
bVBhc3NlZFZhckFyZ3MsIG1fbnVtUGFzc2VkVmFyQXJncykpOworICAgICAgICBtX2N1cnJlbnRC
bG9jay0+YXBwZW5kKHJlc3VsdEluZGV4KTsKICAgICAgICAgCiAgICAgICAgIG1fbnVtUGFzc2Vk
VmFyQXJncyA9IDA7CiAgICAgICAgIApAQCAtNjA0LDYgKzYwOCwxNyBAQCBwcml2YXRlOgogICAg
ICAgICAgICAgbV9ncmFwaC5yZWYocmVzdWx0SW5kZXgpOwogICAgICAgICByZXR1cm4gcmVzdWx0
SW5kZXg7CiAgICAgfQorCisgICAgTm9kZUluZGV4IGluc2VydFBoaU5vZGUoT3BJbmZvIGluZm8s
IEJhc2ljQmxvY2sqIGJsb2NrKQorICAgIHsKKyAgICAgICAgTm9kZUluZGV4IHJlc3VsdEluZGV4
ID0gKE5vZGVJbmRleCltX2dyYXBoLnNpemUoKTsKKyAgICAgICAgbV9ncmFwaC5hcHBlbmQoTm9k
ZShQaGksIGN1cnJlbnRDb2RlT3JpZ2luKCksIGluZm8pKTsKKyAgICAgICAgYmxvY2stPnByZXBl
bmQocmVzdWx0SW5kZXgpOworICAgICAgICArK2Jsb2NrLT5zdGFydEV4Y2x1ZGluZ1BoaXM7CisK
KyAgICAgICAgcmV0dXJuIHJlc3VsdEluZGV4OworICAgIH0KKwogICAgIHZvaWQgYWRkVmFyQXJn
Q2hpbGQoTm9kZUluZGV4IGNoaWxkKQogICAgIHsKICAgICAgICAgbV9ncmFwaC5tX3ZhckFyZ0No
aWxkcmVuLmFwcGVuZChOb2RlVXNlKGNoaWxkKSk7CkBAIC0xMTY5LDcgKzExODQsNyBAQCBib29s
IEJ5dGVDb2RlUGFyc2VyOjpoYW5kbGVJbmxpbmluZyhib29sCiAgICAgLy8gdGhlIGNhbGxlciB0
byBjb250aW51ZSBpbiB3aGF0ZXZlciBiYXNpYyBibG9jayB3ZSdyZSBpbiByaWdodCBub3cuCiAg
ICAgaWYgKCFpbmxpbmVTdGFja0VudHJ5Lm1fZGlkRWFybHlSZXR1cm4gJiYgaW5saW5lU3RhY2tF
bnRyeS5tX2RpZFJldHVybikgewogICAgICAgICBCYXNpY0Jsb2NrKiBsYXN0QmxvY2sgPSBtX2dy
YXBoLm1fYmxvY2tzLmxhc3QoKS5nZXQoKTsKLSAgICAgICAgQVNTRVJUKGxhc3RCbG9jay0+YmVn
aW4gPT0gbGFzdEJsb2NrLT5lbmQgfHwgIW1fZ3JhcGgubGFzdCgpLmlzVGVybWluYWwoKSk7Cisg
ICAgICAgIEFTU0VSVChsYXN0QmxvY2stPmlzRW1wdHkoKSB8fCAhbV9ncmFwaC5sYXN0KCkuaXNU
ZXJtaW5hbCgpKTsKICAgICAgICAgCiAgICAgICAgIC8vIElmIHdlIGNyZWF0ZWQgbmV3IGJsb2Nr
cyB0aGVuIHRoZSBsYXN0IGJsb2NrIG5lZWRzIGxpbmtpbmcsIGJ1dCBpbiB0aGUKICAgICAgICAg
Ly8gY2FsbGVyLiBJdCBkb2Vzbid0IG5lZWQgdG8gYmUgbGlua2VkIHRvLCBidXQgaXQgbmVlZHMg
b3V0Z29pbmcgbGlua3MuCkBAIC0xMjAxLDcgKzEyMTYsNyBAQCBib29sIEJ5dGVDb2RlUGFyc2Vy
OjpoYW5kbGVJbmxpbmluZyhib29sCiAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgQmFz
aWNCbG9jayogYmxvY2sgPSBtX2dyYXBoLm1fYmxvY2tzW2lubGluZVN0YWNrRW50cnkubV91bmxp
bmtlZEJsb2Nrc1tpXS5tX2Jsb2NrSW5kZXhdLmdldCgpOwogICAgICAgICBBU1NFUlQoIWJsb2Nr
LT5pc0xpbmtlZCk7Ci0gICAgICAgIE5vZGUmIG5vZGUgPSBtX2dyYXBoW2Jsb2NrLT5lbmQgLSAx
XTsKKyAgICAgICAgTm9kZSYgbm9kZSA9IG1fZ3JhcGhbYmxvY2stPmxhc3QoKV07CiAgICAgICAg
IEFTU0VSVChub2RlLm9wID09IEp1bXApOwogICAgICAgICBBU1NFUlQobm9kZS50YWtlbkJsb2Nr
SW5kZXgoKSA9PSBOb0Jsb2NrKTsKICAgICAgICAgbm9kZS5zZXRUYWtlbkJsb2NrSW5kZXgobV9n
cmFwaC5tX2Jsb2Nrcy5zaXplKCkpOwpAQCAtMTIxMiw3ICsxMjI3LDcgQEAgYm9vbCBCeXRlQ29k
ZVBhcnNlcjo6aGFuZGxlSW5saW5pbmcoYm9vbAogICAgIH0KICAgICAKICAgICAvLyBOZWVkIHRv
IGNyZWF0ZSBhIG5ldyBiYXNpYyBibG9jayBmb3IgdGhlIGNvbnRpbnVhdGlvbiBhdCB0aGUgY2Fs
bGVyLgotICAgIE93blB0cjxCYXNpY0Jsb2NrPiBibG9jayA9IGFkb3B0UHRyKG5ldyBCYXNpY0Js
b2NrKG5leHRPZmZzZXQsIG1fZ3JhcGguc2l6ZSgpLCBtX251bUFyZ3VtZW50cywgbV9udW1Mb2Nh
bHMpKTsKKyAgICBPd25QdHI8QmFzaWNCbG9jaz4gYmxvY2sgPSBhZG9wdFB0cihuZXcgQmFzaWNC
bG9jayhuZXh0T2Zmc2V0LCBtX251bUFyZ3VtZW50cywgbV9udW1Mb2NhbHMpKTsKICNpZiBERkdf
RU5BQkxFKERFQlVHX1ZFUkJPU0UpCiAgICAgZGF0YUxvZygiQ3JlYXRpbmcgaW5saW5lIGVwaWxv
Z3VlIGJhc2ljIGJsb2NrICVwLCAjJXp1IGZvciAlcCBiYyMldSBhdCBpbmxpbmUgZGVwdGggJXUu
XG4iLCBibG9jay5nZXQoKSwgbV9ncmFwaC5tX2Jsb2Nrcy5zaXplKCksIG1faW5saW5lU3RhY2tU
b3AtPmV4ZWN1dGFibGUoKSwgbV9jdXJyZW50SW5kZXgsIENvZGVPcmlnaW46OmlubGluZURlcHRo
Rm9yQ2FsbEZyYW1lKG1faW5saW5lU3RhY2tUb3AtPm1faW5saW5lQ2FsbEZyYW1lKSk7CiAjZW5k
aWYKQEAgLTE0MDQsNyArMTQxOSw3IEBAIGJvb2wgQnl0ZUNvZGVQYXJzZXI6OnBhcnNlQmxvY2so
dW5zaWduZWQKICAgICAgICAgICAgIC8vIGxvZ2ljIHJlbGllcyBvbiBldmVyeSBieXRlY29kZSBy
ZXN1bHRpbmcgaW4gb25lIG9yIG1vcmUgbm9kZXMsIHdoaWNoIHdvdWxkCiAgICAgICAgICAgICAv
LyBiZSB0cnVlIGFueXdheSBleGNlcHQgZm9yIG9wX2xvb3BfaGludCwgd2hpY2ggZW1pdHMgYSBQ
aGFudG9tIHRvIGZvcmNlIHRoaXMKICAgICAgICAgICAgIC8vIHRvIGJlIHRydWUuCi0gICAgICAg
ICAgICBpZiAobV9jdXJyZW50QmxvY2stPmJlZ2luICE9IG1fZ3JhcGguc2l6ZSgpKQorICAgICAg
ICAgICAgaWYgKCFtX2N1cnJlbnRCbG9jay0+aXNFbXB0eSgpKQogICAgICAgICAgICAgICAgIGFk
ZFRvR3JhcGgoSnVtcCwgT3BJbmZvKG1fY3VycmVudEluZGV4KSk7CiAgICAgICAgICAgICBlbHNl
IHsKICNpZiBERkdfRU5BQkxFKERFQlVHX1ZFUkJPU0UpCkBAIC0yMzEzLDcgKzIzMjgsNyBAQCB2
b2lkIEJ5dGVDb2RlUGFyc2VyOjpwcm9jZXNzUGhpU3RhY2soKQogICAgICAgICAgICAgICAgIGRh
dGFMb2coIiAgICAgIERpZCBub3QgZmluZCBub2RlLCBhZGRpbmcgcGhpLlxuIik7CiAjZW5kaWYK
IAotICAgICAgICAgICAgICAgIHZhbHVlSW5QcmVkZWNlc3NvciA9IGFkZFRvR3JhcGgoUGhpLCBP
cEluZm8obmV3VmFyaWFibGVBY2Nlc3NEYXRhKHN0YWNrVHlwZSA9PSBBcmd1bWVudFBoaVN0YWNr
ID8gYXJndW1lbnRUb09wZXJhbmQodmFyTm8pIDogc3RhdGljX2Nhc3Q8aW50Pih2YXJObykpKSk7
CisgICAgICAgICAgICAgICAgdmFsdWVJblByZWRlY2Vzc29yID0gaW5zZXJ0UGhpTm9kZShPcElu
Zm8obmV3VmFyaWFibGVBY2Nlc3NEYXRhKHN0YWNrVHlwZSA9PSBBcmd1bWVudFBoaVN0YWNrID8g
YXJndW1lbnRUb09wZXJhbmQodmFyTm8pIDogc3RhdGljX2Nhc3Q8aW50Pih2YXJObykpKSwgcHJl
ZGVjZXNzb3JCbG9jayk7CiAgICAgICAgICAgICAgICAgdmFyID0gdmFsdWVJblByZWRlY2Vzc29y
OwogICAgICAgICAgICAgICAgIGlmIChzdGFja1R5cGUgPT0gQXJndW1lbnRQaGlTdGFjaykKICAg
ICAgICAgICAgICAgICAgICAgcHJlZGVjZXNzb3JCbG9jay0+dmFyaWFibGVzQXRIZWFkLnNldEFy
Z3VtZW50Rmlyc3RUaW1lKHZhck5vLCB2YWx1ZUluUHJlZGVjZXNzb3IpOwpAQCAtMjM5NSw3ICsy
NDEwLDcgQEAgdm9pZCBCeXRlQ29kZVBhcnNlcjo6cHJvY2Vzc1BoaVN0YWNrKCkKICAgICAgICAg
ICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIAotICAgICAgICAg
ICAgTm9kZUluZGV4IG5ld1BoaSA9IGFkZFRvR3JhcGgoUGhpLCBPcEluZm8oZGF0YUZvclBoaSkp
OworICAgICAgICAgICAgTm9kZUluZGV4IG5ld1BoaSA9IGluc2VydFBoaU5vZGUoT3BJbmZvKGRh
dGFGb3JQaGkpLCBlbnRyeS5tX2Jsb2NrKTsKICAgICAgICAgICAgIAogI2lmIERGR19FTkFCTEUo
REVCVUdfUFJPUEFHQVRJT05fVkVSQk9TRSkKICAgICAgICAgICAgIGRhdGFMb2coIiAgICAgIFNw
bGl0dGluZyBAJXUsIGNyZWF0ZWQgQCV1LlxuIiwgZW50cnkubV9waGksIG5ld1BoaSk7CkBAIC0y
NDM1LDEwICsyNDUwLDkgQEAgdm9pZCBCeXRlQ29kZVBhcnNlcjo6Zml4VmFyaWFibGVBY2Nlc3NQ
cgogCiB2b2lkIEJ5dGVDb2RlUGFyc2VyOjpsaW5rQmxvY2soQmFzaWNCbG9jayogYmxvY2ssIFZl
Y3RvcjxCbG9ja0luZGV4PiYgcG9zc2libGVUYXJnZXRzKQogewotICAgIEFTU0VSVChibG9jay0+
ZW5kICE9IE5vTm9kZSk7CiAgICAgQVNTRVJUKCFibG9jay0+aXNMaW5rZWQpOwotICAgIEFTU0VS
VChibG9jay0+ZW5kID4gYmxvY2stPmJlZ2luKTsKLSAgICBOb2RlJiBub2RlID0gbV9ncmFwaFti
bG9jay0+ZW5kIC0gMV07CisgICAgQVNTRVJUKCFibG9jay0+aXNFbXB0eSgpKTsKKyAgICBOb2Rl
JiBub2RlID0gbV9ncmFwaFtibG9jay0+bGFzdCgpXTsKICAgICBBU1NFUlQobm9kZS5pc1Rlcm1p
bmFsKCkpOwogICAgIAogICAgIHN3aXRjaCAobm9kZS5vcCkgewpAQCAtMjUwMiw3ICsyNTE2LDcg
QEAgdm9pZCBCeXRlQ29kZVBhcnNlcjo6ZGV0ZXJtaW5lUmVhY2hhYmlsaQogICAgICAgICBCYXNp
Y0Jsb2NrKiBibG9jayA9IG1fZ3JhcGgubV9ibG9ja3NbaW5kZXhdLmdldCgpOwogICAgICAgICBB
U1NFUlQoYmxvY2stPmlzTGlua2VkKTsKICAgICAgICAgCi0gICAgICAgIE5vZGUmIG5vZGUgPSBt
X2dyYXBoW2Jsb2NrLT5lbmQgLSAxXTsKKyAgICAgICAgTm9kZSYgbm9kZSA9IG1fZ3JhcGhbYmxv
Y2stPmxhc3QoKV07CiAgICAgICAgIEFTU0VSVChub2RlLmlzVGVybWluYWwoKSk7CiAgICAgICAg
IAogICAgICAgICBpZiAobm9kZS5pc0p1bXAoKSkKQEAgLTI2NDksNyArMjY2Myw3IEBAIHZvaWQg
Qnl0ZUNvZGVQYXJzZXI6OnBhcnNlQ29kZUJsb2NrKCkKICAgICAgICAgZG8gewogICAgICAgICAg
ICAgaWYgKCFtX2N1cnJlbnRCbG9jaykgewogICAgICAgICAgICAgICAgIC8vIENoZWNrIGlmIHdl
IGNhbiB1c2UgdGhlIGxhc3QgYmxvY2suCi0gICAgICAgICAgICAgICAgaWYgKCFtX2dyYXBoLm1f
YmxvY2tzLmlzRW1wdHkoKSAmJiBtX2dyYXBoLm1fYmxvY2tzLmxhc3QoKS0+YmVnaW4gPT0gbV9n
cmFwaC5tX2Jsb2Nrcy5sYXN0KCktPmVuZCkgeworICAgICAgICAgICAgICAgIGlmICghbV9ncmFw
aC5tX2Jsb2Nrcy5pc0VtcHR5KCkgJiYgbV9ncmFwaC5tX2Jsb2Nrcy5sYXN0KCktPmlzRW1wdHko
KSkgewogICAgICAgICAgICAgICAgICAgICAvLyBUaGlzIG11c3QgYmUgYSBibG9jayBiZWxvbmdp
bmcgdG8gdXMuCiAgICAgICAgICAgICAgICAgICAgIEFTU0VSVChtX2lubGluZVN0YWNrVG9wLT5t
X3VubGlua2VkQmxvY2tzLmxhc3QoKS5tX2Jsb2NrSW5kZXggPT0gbV9ncmFwaC5tX2Jsb2Nrcy5z
aXplKCkgLSAxKTsKICAgICAgICAgICAgICAgICAgICAgLy8gRWl0aGVyIHRoZSBibG9jayBpcyBs
aW5rYWJsZSBvciBpdCBpc24ndC4gSWYgaXQncyBsaW5rYWJsZSB0aGVuIGl0J3MgdGhlIGxhc3QK
QEAgLTI2NjcsNyArMjY4MSw3IEBAIHZvaWQgQnl0ZUNvZGVQYXJzZXI6OnBhcnNlQ29kZUJsb2Nr
KCkKICNlbmRpZgogICAgICAgICAgICAgICAgICAgICBtX2N1cnJlbnRCbG9jay0+Ynl0ZWNvZGVC
ZWdpbiA9IG1fY3VycmVudEluZGV4OwogICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAg
ICAgICAgICAgICAgIE93blB0cjxCYXNpY0Jsb2NrPiBibG9jayA9IGFkb3B0UHRyKG5ldyBCYXNp
Y0Jsb2NrKG1fY3VycmVudEluZGV4LCBtX2dyYXBoLnNpemUoKSwgbV9udW1Bcmd1bWVudHMsIG1f
bnVtTG9jYWxzKSk7CisgICAgICAgICAgICAgICAgICAgIE93blB0cjxCYXNpY0Jsb2NrPiBibG9j
ayA9IGFkb3B0UHRyKG5ldyBCYXNpY0Jsb2NrKG1fY3VycmVudEluZGV4LCBtX251bUFyZ3VtZW50
cywgbV9udW1Mb2NhbHMpKTsKICNpZiBERkdfRU5BQkxFKERFQlVHX1ZFUkJPU0UpCiAgICAgICAg
ICAgICAgICAgICAgIGRhdGFMb2coIkNyZWF0aW5nIGJhc2ljIGJsb2NrICVwLCAjJXp1IGZvciAl
cCBiYyMldSBhdCBpbmxpbmUgZGVwdGggJXUuXG4iLCBibG9jay5nZXQoKSwgbV9ncmFwaC5tX2Js
b2Nrcy5zaXplKCksIG1faW5saW5lU3RhY2tUb3AtPmV4ZWN1dGFibGUoKSwgbV9jdXJyZW50SW5k
ZXgsIENvZGVPcmlnaW46OmlubGluZURlcHRoRm9yQ2FsbEZyYW1lKG1faW5saW5lU3RhY2tUb3At
Pm1faW5saW5lQ2FsbEZyYW1lKSk7CiAjZW5kaWYKQEAgLTI2OTAsMTAgKzI3MDQsOCBAQCB2b2lk
IEJ5dGVDb2RlUGFyc2VyOjpwYXJzZUNvZGVCbG9jaygpCiAgICAgICAgICAgICAvLyBhcmUgYXQg
dGhlIGVuZCBvZiBhbiBpbmxpbmUgZnVuY3Rpb24sIG9yIHdlIHJlYWxpemVkIHRoYXQgd2UKICAg
ICAgICAgICAgIC8vIHNob3VsZCBzdG9wIHBhcnNpbmcgYmVjYXVzZSB0aGVyZSB3YXMgYSByZXR1
cm4gaW4gdGhlIGZpcnN0CiAgICAgICAgICAgICAvLyBiYXNpYyBibG9jay4KLSAgICAgICAgICAg
IEFTU0VSVChtX2N1cnJlbnRCbG9jay0+YmVnaW4gPT0gbV9ncmFwaC5zaXplKCkgfHwgbV9ncmFw
aC5sYXN0KCkuaXNUZXJtaW5hbCgpIHx8IChtX2N1cnJlbnRJbmRleCA9PSBjb2RlQmxvY2stPmlu
c3RydWN0aW9ucygpLnNpemUoKSAmJiBtX2lubGluZVN0YWNrVG9wLT5tX2lubGluZUNhbGxGcmFt
ZSkgfHwgIXNob3VsZENvbnRpbnVlUGFyc2luZyk7CisgICAgICAgICAgICBBU1NFUlQobV9jdXJy
ZW50QmxvY2stPmlzRW1wdHkoKSB8fCBtX2dyYXBoLmxhc3QoKS5pc1Rlcm1pbmFsKCkgfHwgKG1f
Y3VycmVudEluZGV4ID09IGNvZGVCbG9jay0+aW5zdHJ1Y3Rpb25zKCkuc2l6ZSgpICYmIG1faW5s
aW5lU3RhY2tUb3AtPm1faW5saW5lQ2FsbEZyYW1lKSB8fCAhc2hvdWxkQ29udGludWVQYXJzaW5n
KTsKIAotICAgICAgICAgICAgbV9jdXJyZW50QmxvY2stPmVuZCA9IG1fZ3JhcGguc2l6ZSgpOwot
ICAgICAgICAgICAgCiAgICAgICAgICAgICBpZiAoIXNob3VsZENvbnRpbnVlUGFyc2luZykKICAg
ICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAKSW5kZXg6IFNvdXJjZS9KYXZhU2Ny
aXB0Q29yZS9kZmcvREZHQ0ZBUGhhc2UuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2Ny
aXB0Q29yZS9kZmcvREZHQ0ZBUGhhc2UuY3BwCShyZXZpc2lvbiAxMDkyOTUpCisrKyBTb3VyY2Uv
SmF2YVNjcmlwdENvcmUvZGZnL0RGR0NGQVBoYXNlLmNwcAkod29ya2luZyBjb3B5KQpAQCAtODIs
NyArODIsOCBAQCBwcml2YXRlOgogICAgICAgICBkdW1wT3BlcmFuZHMoYmxvY2stPnZhbHVlc0F0
SGVhZCwgV1RGOjpkYXRhRmlsZSgpKTsKICAgICAgICAgZGF0YUxvZygiXG4iKTsKICNlbmRpZgot
ICAgICAgICBmb3IgKE5vZGVJbmRleCBub2RlSW5kZXggPSBibG9jay0+YmVnaW47IG5vZGVJbmRl
eCA8IGJsb2NrLT5lbmQ7ICsrbm9kZUluZGV4KSB7CisgICAgICAgIGZvciAodW5zaWduZWQgaSA9
IGJsb2NrLT5zdGFydEV4Y2x1ZGluZ1BoaXM7IGkgPCBibG9jay0+c2l6ZSgpOyArK2kpIHsKKyAg
ICAgICAgICAgIE5vZGVJbmRleCBub2RlSW5kZXggPSBibG9jay0+YXQoaSk7CiAgICAgICAgICAg
ICBpZiAoIW1fZ3JhcGhbbm9kZUluZGV4XS5zaG91bGRHZW5lcmF0ZSgpKQogICAgICAgICAgICAg
ICAgIGNvbnRpbnVlOwogI2lmIERGR19FTkFCTEUoREVCVUdfUFJPUEFHQVRJT05fVkVSQk9TRSkK
QEAgLTkwLDcgKzkxLDcgQEAgcHJpdmF0ZToKICAgICAgICAgICAgIG1fc3RhdGUuZHVtcChXVEY6
OmRhdGFGaWxlKCkpOwogICAgICAgICAgICAgZGF0YUxvZygiXG4iKTsKICNlbmRpZgotICAgICAg
ICAgICAgaWYgKCFtX3N0YXRlLmV4ZWN1dGUobm9kZUluZGV4KSkKKyAgICAgICAgICAgIGlmICgh
bV9zdGF0ZS5leGVjdXRlKGkpKQogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAj
aWYgREZHX0VOQUJMRShERUJVR19QUk9QQUdBVElPTl9WRVJCT1NFKQpAQCAtMTIwLDYgKzEyMSw5
IEBAIHByaXZhdGU6CiAgICAgQWJzdHJhY3RTdGF0ZSBtX3N0YXRlOwogICAgIAogICAgIGJvb2wg
bV9jaGFuZ2VkOworI2lmIERGR19FTkFCTEUoREVCVUdfUFJPUEFHQVRJT05fVkVSQk9TRSkKKyAg
ICB1bnNpZ25lZCBtX2NvdW50OworI2VuZGlmCiB9OwogCiB2b2lkIHBlcmZvcm1DRkEoR3JhcGgm
IGdyYXBoKQpJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL2RmZy9ERkdDU0VQaGFzZS5jcHAK
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRDb3JlL2RmZy9ERkdDU0VQaGFzZS5jcHAJ
KHJldmlzaW9uIDEwOTI5NSkKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9kZmcvREZHQ1NFUGhh
c2UuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC03MTAsMTAgKzcxMCwxMSBAQCBwcml2YXRlOgogICAg
IAogICAgIHZvaWQgcGVyZm9ybUJsb2NrQ1NFKEJhc2ljQmxvY2smIGJsb2NrKQogICAgIHsKLSAg
ICAgICAgbV9zdGFydCA9IGJsb2NrLmJlZ2luOwotICAgICAgICBOb2RlSW5kZXggZW5kID0gYmxv
Y2suZW5kOwotICAgICAgICBmb3IgKG1fY29tcGlsZUluZGV4ID0gbV9zdGFydDsgbV9jb21waWxl
SW5kZXggPCBlbmQ7ICsrbV9jb21waWxlSW5kZXgpCisgICAgICAgIG1fc3RhcnQgPSBibG9ja1ti
bG9jay5zdGFydEV4Y2x1ZGluZ1BoaXNdOworICAgICAgICBmb3IgKHVuc2lnbmVkIGkgPSBibG9j
ay5zdGFydEV4Y2x1ZGluZ1BoaXM7IGkgPCBibG9jay5zaXplKCk7ICsraSkgeworICAgICAgICAg
ICAgbV9jb21waWxlSW5kZXggPSBibG9ja1tpXTsKICAgICAgICAgICAgIHBlcmZvcm1Ob2RlQ1NF
KG1fZ3JhcGhbbV9jb21waWxlSW5kZXhdKTsKKyAgICAgICAgfQogICAgIH0KICAgICAKICAgICBO
b2RlSW5kZXggbV9zdGFydDsKSW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9kZmcvREZHR3Jh
cGguY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9kZmcvREZHR3JhcGgu
Y3BwCShyZXZpc2lvbiAxMDkyOTUpCisrKyBTb3VyY2UvSmF2YVNjcmlwdENvcmUvZGZnL0RGR0dy
YXBoLmNwcAkod29ya2luZyBjb3B5KQpAQCAtMjc0LDggKzI3NCw4IEBAIHZvaWQgR3JhcGg6OmR1
bXAoKQogICAgICAgICBkYXRhTG9nKCIgIHZhciBsaW5rczogIik7CiAgICAgICAgIGR1bXBPcGVy
YW5kcyhibG9jay0+dmFyaWFibGVzQXRIZWFkLCBXVEY6OmRhdGFGaWxlKCkpOwogICAgICAgICBk
YXRhTG9nKCJcbiIpOwotICAgICAgICBmb3IgKHNpemVfdCBpID0gYmxvY2stPmJlZ2luOyBpIDwg
YmxvY2stPmVuZDsgKytpKQotICAgICAgICAgICAgZHVtcChpKTsKKyAgICAgICAgZm9yIChzaXpl
X3QgaSA9IDA7IGkgPCBibG9jay0+c2l6ZSgpOyArK2kpCisgICAgICAgICAgICBkdW1wKGJsb2Nr
LT5hdChpKSk7CiAgICAgICAgIGRhdGFMb2coIiAgdmFycyBhZnRlcjogIik7CiAgICAgICAgIGlm
IChibG9jay0+Y2ZhSGFzVmlzaXRlZCkKICAgICAgICAgICAgIGR1bXBPcGVyYW5kcyhibG9jay0+
dmFsdWVzQXRUYWlsLCBXVEY6OmRhdGFGaWxlKCkpOwpAQCAtMjgzLDkgKzI4Myw2IEBAIHZvaWQg
R3JhcGg6OmR1bXAoKQogICAgICAgICAgICAgZGF0YUxvZygiPGVtcHR5PiIpOwogICAgICAgICBk
YXRhTG9nKCJcbiIpOwogICAgIH0KLSAgICBkYXRhTG9nKCJQaGkgTm9kZXM6XG4iKTsKLSAgICBm
b3IgKHNpemVfdCBpID0gbV9ibG9ja3MubGFzdCgpLT5lbmQ7IGkgPCBzaXplKCk7ICsraSkKLSAg
ICAgICAgZHVtcChpKTsKIH0KIAogLy8gRklYTUU6IENvbnZlcnQgdGhpcyB0byBiZSBpdGVyYXRp
dmUsIG5vdCByZWN1cnNpdmUuCkluZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUvZGZnL0RGR1Bo
YXNlLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvZGZnL0RGR1BoYXNl
LmNwcAkocmV2aXNpb24gMTA5Mjk1KQorKysgU291cmNlL0phdmFTY3JpcHRDb3JlL2RmZy9ERkdQ
aGFzZS5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTM1LDcgKzM1LDcgQEAgdm9pZCBQaGFzZTo6YmVn
aW5QaGFzZSgpCiB7CiAgICAgZGF0YUxvZygiQmVnaW5uaW5nIERGRyBwaGFzZSAlcy5cbiIsIG1f
bmFtZSk7CiAgICAgZGF0YUxvZygiR3JhcGggYmVmb3JlICVzOlxuIiwgbV9uYW1lKTsKLSAgICBt
X2dyYXBoLmR1bXAobV9jb2RlQmxvY2spOworICAgIG1fZ3JhcGguZHVtcCgpOwogfQogCiB2b2lk
IFBoYXNlOjplbmRQaGFzZSgpCkluZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUvZGZnL0RGR1Nw
ZWN1bGF0aXZlSklUMzJfNjQuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29y
ZS9kZmcvREZHU3BlY3VsYXRpdmVKSVQzMl82NC5jcHAJKHJldmlzaW9uIDEwOTI5NSkKKysrIFNv
dXJjZS9KYXZhU2NyaXB0Q29yZS9kZmcvREZHU3BlY3VsYXRpdmVKSVQzMl82NC5jcHAJKHdvcmtp
bmcgY29weSkKQEAgLTY1MiwxNCArNjUyLDE3IEBAIHZvaWQgU3BlY3VsYXRpdmVKSVQ6Om5vblNw
ZWN1bGF0aXZlUGVlcGgKIAogYm9vbCBTcGVjdWxhdGl2ZUpJVDo6bm9uU3BlY3VsYXRpdmVDb21w
YXJlTnVsbChOb2RlJiBub2RlLCBOb2RlVXNlIG9wZXJhbmQsIGJvb2wgaW52ZXJ0KQogewotICAg
IE5vZGVJbmRleCBicmFuY2hOb2RlSW5kZXggPSBkZXRlY3RQZWVwSG9sZUJyYW5jaCgpOwotICAg
IGlmIChicmFuY2hOb2RlSW5kZXggIT0gTm9Ob2RlKSB7CisgICAgdW5zaWduZWQgYnJhbmNoSW5k
ZXhJbkJsb2NrID0gZGV0ZWN0UGVlcEhvbGVCcmFuY2goKTsKKyAgICBpZiAoYnJhbmNoSW5kZXhJ
bkJsb2NrICE9IFVJTlRfTUFYKSB7CisgICAgICAgIE5vZGVJbmRleCBicmFuY2hOb2RlSW5kZXgg
PSBtX2ppdC5ncmFwaCgpLm1fYmxvY2tzW21fYmxvY2tdLT5hdChicmFuY2hJbmRleEluQmxvY2sp
OworCiAgICAgICAgIEFTU0VSVChub2RlLmFkanVzdGVkUmVmQ291bnQoKSA9PSAxKTsKICAgICAg
ICAgCiAgICAgICAgIG5vblNwZWN1bGF0aXZlUGVlcGhvbGVCcmFuY2hOdWxsKG9wZXJhbmQsIGJy
YW5jaE5vZGVJbmRleCwgaW52ZXJ0KTsKICAgICAKICAgICAgICAgdXNlKG5vZGUuY2hpbGQxKCkp
OwogICAgICAgICB1c2Uobm9kZS5jaGlsZDIoKSk7CisgICAgICAgIG1faW5kZXhJbkJsb2NrID0g
YnJhbmNoSW5kZXhJbkJsb2NrOwogICAgICAgICBtX2NvbXBpbGVJbmRleCA9IGJyYW5jaE5vZGVJ
bmRleDsKICAgICAgICAgCiAgICAgICAgIHJldHVybiB0cnVlOwpJbmRleDogU291cmNlL0phdmFT
Y3JpcHRDb3JlL2RmZy9ERkdTcGVjdWxhdGl2ZUpJVDY0LmNwcAo9PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3Vy
Y2UvSmF2YVNjcmlwdENvcmUvZGZnL0RGR1NwZWN1bGF0aXZlSklUNjQuY3BwCShyZXZpc2lvbiAx
MDkyOTUpCisrKyBTb3VyY2UvSmF2YVNjcmlwdENvcmUvZGZnL0RGR1NwZWN1bGF0aXZlSklUNjQu
Y3BwCSh3b3JraW5nIGNvcHkpCkBAIC02MjgsMTQgKzYyOCwxNyBAQCB2b2lkIFNwZWN1bGF0aXZl
SklUOjpub25TcGVjdWxhdGl2ZVBlZXBoCiAKIGJvb2wgU3BlY3VsYXRpdmVKSVQ6Om5vblNwZWN1
bGF0aXZlQ29tcGFyZU51bGwoTm9kZSYgbm9kZSwgTm9kZVVzZSBvcGVyYW5kLCBib29sIGludmVy
dCkKIHsKLSAgICBOb2RlSW5kZXggYnJhbmNoTm9kZUluZGV4ID0gZGV0ZWN0UGVlcEhvbGVCcmFu
Y2goKTsKLSAgICBpZiAoYnJhbmNoTm9kZUluZGV4ICE9IE5vTm9kZSkgeworICAgIHVuc2lnbmVk
IGJyYW5jaEluZGV4SW5CbG9jayA9IGRldGVjdFBlZXBIb2xlQnJhbmNoKCk7CisgICAgaWYgKGJy
YW5jaEluZGV4SW5CbG9jayAhPSBVSU5UX01BWCkgeworICAgICAgICBOb2RlSW5kZXggYnJhbmNo
Tm9kZUluZGV4ID0gbV9qaXQuZ3JhcGgoKS5tX2Jsb2Nrc1ttX2Jsb2NrXS0+YXQoYnJhbmNoSW5k
ZXhJbkJsb2NrKTsKKwogICAgICAgICBBU1NFUlQobm9kZS5hZGp1c3RlZFJlZkNvdW50KCkgPT0g
MSk7CiAgICAgICAgIAogICAgICAgICBub25TcGVjdWxhdGl2ZVBlZXBob2xlQnJhbmNoTnVsbChv
cGVyYW5kLCBicmFuY2hOb2RlSW5kZXgsIGludmVydCk7CiAgICAgCiAgICAgICAgIHVzZShub2Rl
LmNoaWxkMSgpKTsKICAgICAgICAgdXNlKG5vZGUuY2hpbGQyKCkpOworICAgICAgICBtX2luZGV4
SW5CbG9jayA9IGJyYW5jaEluZGV4SW5CbG9jazsKICAgICAgICAgbV9jb21waWxlSW5kZXggPSBi
cmFuY2hOb2RlSW5kZXg7CiAgICAgICAgIAogICAgICAgICByZXR1cm4gdHJ1ZTsKSW5kZXg6IFNv
dXJjZS9KYXZhU2NyaXB0Q29yZS9kZmcvREZHU3BlY3VsYXRpdmVKSVQuY3BwCj09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0K
LS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9kZmcvREZHU3BlY3VsYXRpdmVKSVQuY3BwCShyZXZp
c2lvbiAxMDkyOTUpCisrKyBTb3VyY2UvSmF2YVNjcmlwdENvcmUvZGZnL0RGR1NwZWN1bGF0aXZl
SklULmNwcAkod29ya2luZyBjb3B5KQpAQCAtMzY1LDEyICszNjUsMTUgQEAgdm9pZCBTcGVjdWxh
dGl2ZUpJVDo6d3JpdGVCYXJyaWVyKEpTQ2VsbAogCiBib29sIFNwZWN1bGF0aXZlSklUOjpub25T
cGVjdWxhdGl2ZUNvbXBhcmUoTm9kZSYgbm9kZSwgTWFjcm9Bc3NlbWJsZXI6OlJlbGF0aW9uYWxD
b25kaXRpb24gY29uZCwgU19ERkdPcGVyYXRpb25fRUpKIGhlbHBlckZ1bmN0aW9uKQogewotICAg
IE5vZGVJbmRleCBicmFuY2hOb2RlSW5kZXggPSBkZXRlY3RQZWVwSG9sZUJyYW5jaCgpOwotICAg
IGlmIChicmFuY2hOb2RlSW5kZXggIT0gTm9Ob2RlKSB7CisgICAgdW5zaWduZWQgYnJhbmNoSW5k
ZXhJbkJsb2NrID0gZGV0ZWN0UGVlcEhvbGVCcmFuY2goKTsKKyAgICBpZiAoYnJhbmNoSW5kZXhJ
bkJsb2NrICE9IFVJTlRfTUFYKSB7CisgICAgICAgIE5vZGVJbmRleCBicmFuY2hOb2RlSW5kZXgg
PSBtX2ppdC5ncmFwaCgpLm1fYmxvY2tzW21fYmxvY2tdLT5hdChicmFuY2hJbmRleEluQmxvY2sp
OworCiAgICAgICAgIEFTU0VSVChub2RlLmFkanVzdGVkUmVmQ291bnQoKSA9PSAxKTsKICAgICAg
ICAgCiAgICAgICAgIG5vblNwZWN1bGF0aXZlUGVlcGhvbGVCcmFuY2gobm9kZSwgYnJhbmNoTm9k
ZUluZGV4LCBjb25kLCBoZWxwZXJGdW5jdGlvbik7CiAgICAgCisgICAgICAgIG1faW5kZXhJbkJs
b2NrID0gYnJhbmNoSW5kZXhJbkJsb2NrOwogICAgICAgICBtX2NvbXBpbGVJbmRleCA9IGJyYW5j
aE5vZGVJbmRleDsKICAgICAgICAgCiAgICAgICAgIHJldHVybiB0cnVlOwpAQCAtMzgzLDEyICsz
ODYsMTUgQEAgYm9vbCBTcGVjdWxhdGl2ZUpJVDo6bm9uU3BlY3VsYXRpdmVDb21wYQogCiBib29s
IFNwZWN1bGF0aXZlSklUOjpub25TcGVjdWxhdGl2ZVN0cmljdEVxKE5vZGUmIG5vZGUsIGJvb2wg
aW52ZXJ0KQogewotICAgIE5vZGVJbmRleCBicmFuY2hOb2RlSW5kZXggPSBkZXRlY3RQZWVwSG9s
ZUJyYW5jaCgpOwotICAgIGlmIChicmFuY2hOb2RlSW5kZXggIT0gTm9Ob2RlKSB7CisgICAgdW5z
aWduZWQgYnJhbmNoSW5kZXhJbkJsb2NrID0gZGV0ZWN0UGVlcEhvbGVCcmFuY2goKTsKKyAgICBp
ZiAoYnJhbmNoSW5kZXhJbkJsb2NrICE9IFVJTlRfTUFYKSB7CisgICAgICAgIE5vZGVJbmRleCBi
cmFuY2hOb2RlSW5kZXggPSBtX2ppdC5ncmFwaCgpLm1fYmxvY2tzW21fYmxvY2tdLT5hdChicmFu
Y2hJbmRleEluQmxvY2spOworCiAgICAgICAgIEFTU0VSVChub2RlLmFkanVzdGVkUmVmQ291bnQo
KSA9PSAxKTsKICAgICAgICAgCiAgICAgICAgIG5vblNwZWN1bGF0aXZlUGVlcGhvbGVTdHJpY3RF
cShub2RlLCBicmFuY2hOb2RlSW5kZXgsIGludmVydCk7CiAgICAgCisgICAgICAgIG1faW5kZXhJ
bkJsb2NrID0gYnJhbmNoSW5kZXhJbkJsb2NrOwogICAgICAgICBtX2NvbXBpbGVJbmRleCA9IGJy
YW5jaE5vZGVJbmRleDsKICAgICAgICAgCiAgICAgICAgIHJldHVybiB0cnVlOwpAQCAtODY4LDgg
Kzg3NCwxMCBAQCB2b2lkIFNwZWN1bGF0aXZlSklUOjpjb21waWxlUGVlcEhvbGVJbnRlCiBib29s
IFNwZWN1bGF0aXZlSklUOjpjb21waWxlUGVlcEhvbGVCcmFuY2goTm9kZSYgbm9kZSwgTWFjcm9B
c3NlbWJsZXI6OlJlbGF0aW9uYWxDb25kaXRpb24gY29uZGl0aW9uLCBNYWNyb0Fzc2VtYmxlcjo6
RG91YmxlQ29uZGl0aW9uIGRvdWJsZUNvbmRpdGlvbiwgU19ERkdPcGVyYXRpb25fRUpKIG9wZXJh
dGlvbikKIHsKICAgICAvLyBGdXNlZCBjb21wYXJlICYgYnJhbmNoLgotICAgIE5vZGVJbmRleCBi
cmFuY2hOb2RlSW5kZXggPSBkZXRlY3RQZWVwSG9sZUJyYW5jaCgpOwotICAgIGlmIChicmFuY2hO
b2RlSW5kZXggIT0gTm9Ob2RlKSB7CisgICAgdW5zaWduZWQgYnJhbmNoSW5kZXhJbkJsb2NrID0g
ZGV0ZWN0UGVlcEhvbGVCcmFuY2goKTsKKyAgICBpZiAoYnJhbmNoSW5kZXhJbkJsb2NrICE9IFVJ
TlRfTUFYKSB7CisgICAgICAgIE5vZGVJbmRleCBicmFuY2hOb2RlSW5kZXggPSBtX2ppdC5ncmFw
aCgpLm1fYmxvY2tzW21fYmxvY2tdLT5hdChicmFuY2hJbmRleEluQmxvY2spOworCiAgICAgICAg
IC8vIGRldGVjdFBlZXBIb2xlQnJhbmNoIGN1cnJlbnRseSBvbmx5IHBlcm1pdHMgdGhlIGJyYW5j
aCB0byBiZSB0aGUgdmVyeSBuZXh0IG5vZGUsCiAgICAgICAgIC8vIHNvIGNhbiBiZSBubyBpbnRl
cnZlbmluZyBub2RlcyB0byBhbHNvIHJlZmVyZW5jZSB0aGUgY29tcGFyZS4gCiAgICAgICAgIEFT
U0VSVChub2RlLmFkanVzdGVkUmVmQ291bnQoKSA9PSAxKTsKQEAgLTg5Myw2ICs5MDEsNyBAQCBi
b29sIFNwZWN1bGF0aXZlSklUOjpjb21waWxlUGVlcEhvbGVCcmFuCiAgICAgICAgIH0gZWxzZQog
ICAgICAgICAgICAgbm9uU3BlY3VsYXRpdmVQZWVwaG9sZUJyYW5jaChub2RlLCBicmFuY2hOb2Rl
SW5kZXgsIGNvbmRpdGlvbiwgb3BlcmF0aW9uKTsKIAorICAgICAgICBtX2luZGV4SW5CbG9jayA9
IGJyYW5jaEluZGV4SW5CbG9jazsKICAgICAgICAgbV9jb21waWxlSW5kZXggPSBicmFuY2hOb2Rl
SW5kZXg7CiAgICAgICAgIHJldHVybiB0cnVlOwogICAgIH0KQEAgLTkxMCwxMiArOTE5LDkgQEAg
dm9pZCBTcGVjdWxhdGl2ZUpJVDo6Y29tcGlsZU1vdkhpbnQoTm9kZQogdm9pZCBTcGVjdWxhdGl2
ZUpJVDo6Y29tcGlsZShCYXNpY0Jsb2NrJiBibG9jaykKIHsKICAgICBBU1NFUlQobV9jb21waWxl
T2theSk7Ci0gICAgQVNTRVJUKG1fY29tcGlsZUluZGV4ID09IGJsb2NrLmJlZ2luKTsKICAgICAK
LSAgICBpZiAoIWJsb2NrLmlzUmVhY2hhYmxlKSB7Ci0gICAgICAgIG1fY29tcGlsZUluZGV4ID0g
YmxvY2suZW5kOworICAgIGlmICghYmxvY2suaXNSZWFjaGFibGUpCiAgICAgICAgIHJldHVybjsK
LSAgICB9CiAKICAgICBtX2Jsb2NrSGVhZHNbbV9ibG9ja10gPSBtX2ppdC5sYWJlbCgpOwogI2lm
IERGR19FTkFCTEUoSklUX0JSRUFLX09OX0VWRVJZX0JMT0NLKQpAQCAtOTU1LDcgKzk2MSw4IEBA
IHZvaWQgU3BlY3VsYXRpdmVKSVQ6OmNvbXBpbGUoQmFzaWNCbG9jayYKICAgICAgICAgdmVyaWZp
Y2F0aW9uU3VjY2VlZGVkLmxpbmsoJm1faml0KTsKICAgICB9CiAKLSAgICBmb3IgKDsgbV9jb21w
aWxlSW5kZXggPCBibG9jay5lbmQ7ICsrbV9jb21waWxlSW5kZXgpIHsKKyAgICBmb3IgKG1faW5k
ZXhJbkJsb2NrID0gYmxvY2suc3RhcnRFeGNsdWRpbmdQaGlzOyBtX2luZGV4SW5CbG9jayA8IGJs
b2NrLnNpemUoKTsgKyttX2luZGV4SW5CbG9jaykgeworICAgICAgICBtX2NvbXBpbGVJbmRleCA9
IGJsb2NrW21faW5kZXhJbkJsb2NrXTsKICAgICAgICAgTm9kZSYgbm9kZSA9IGF0KG1fY29tcGls
ZUluZGV4KTsKICAgICAgICAgbV9jb2RlT3JpZ2luRm9yT1NSID0gbm9kZS5jb2RlT3JpZ2luOwog
ICAgICAgICBpZiAoIW5vZGUuc2hvdWxkR2VuZXJhdGUoKSkgewpAQCAtMTAwMCw3ICsxMDA3LDYg
QEAgdm9pZCBTcGVjdWxhdGl2ZUpJVDo6Y29tcGlsZShCYXNpY0Jsb2NrJgogICAgICAgICAgICAg
Y29tcGlsZShub2RlKTsKICAgICAgICAgICAgIGlmICghbV9jb21waWxlT2theSkgewogICAgICAg
ICAgICAgICAgIG1fY29tcGlsZU9rYXkgPSB0cnVlOwotICAgICAgICAgICAgICAgIG1fY29tcGls
ZUluZGV4ID0gYmxvY2suZW5kOwogICAgICAgICAgICAgICAgIGNsZWFyR2VuZXJhdGlvbkluZm8o
KTsKICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICB9CkBAIC0xMDQwLDcgKzEw
NDYsNyBAQCB2b2lkIFNwZWN1bGF0aXZlSklUOjpjb21waWxlKEJhc2ljQmxvY2smCiAjZW5kaWYK
ICAgICAgICAgCiAgICAgICAgIC8vIE1ha2Ugc3VyZSB0aGF0IHRoZSBhYnN0cmFjdCBzdGF0ZSBp
cyByZW1hdGVyaWFsaXplZCBmb3IgdGhlIG5leHQgbm9kZS4KLSAgICAgICAgbV9zdGF0ZS5leGVj
dXRlKG1fY29tcGlsZUluZGV4KTsKKyAgICAgICAgbV9zdGF0ZS5leGVjdXRlKG1faW5kZXhJbkJs
b2NrKTsKICAgICAgICAgCiAgICAgICAgIGlmIChub2RlLnNob3VsZEdlbmVyYXRlKCkpCiAgICAg
ICAgICAgICBjaGVja0NvbnNpc3RlbmN5KCk7CkBAIC0yNDc5LDggKzI0ODUsOSBAQCBib29sIFNw
ZWN1bGF0aXZlSklUOjpjb21waWxlU3RyaWN0RXFGb3JDCiB7CiAgICAgSlNWYWx1ZU9wZXJhbmQg
b3AxKHRoaXMsIHZhbHVlKTsKICAgICAKLSAgICBOb2RlSW5kZXggYnJhbmNoTm9kZUluZGV4ID0g
ZGV0ZWN0UGVlcEhvbGVCcmFuY2goKTsKLSAgICBpZiAoYnJhbmNoTm9kZUluZGV4ICE9IE5vTm9k
ZSkgeworICAgIHVuc2lnbmVkIGJyYW5jaEluZGV4SW5CbG9jayA9IGRldGVjdFBlZXBIb2xlQnJh
bmNoKCk7CisgICAgaWYgKGJyYW5jaEluZGV4SW5CbG9jayAhPSBVSU5UX01BWCkgeworICAgICAg
ICBOb2RlSW5kZXggYnJhbmNoTm9kZUluZGV4ID0gbV9qaXQuZ3JhcGgoKS5tX2Jsb2Nrc1ttX2Js
b2NrXS0+YXQoYnJhbmNoSW5kZXhJbkJsb2NrKTsKICAgICAgICAgTm9kZSYgYnJhbmNoTm9kZSA9
IGF0KGJyYW5jaE5vZGVJbmRleCk7CiAgICAgICAgIEJsb2NrSW5kZXggdGFrZW4gPSBicmFuY2hO
b2RlLnRha2VuQmxvY2tJbmRleCgpOwogICAgICAgICBCbG9ja0luZGV4IG5vdFRha2VuID0gYnJh
bmNoTm9kZS5ub3RUYWtlbkJsb2NrSW5kZXgoKTsKQEAgLTI1MTYsNiArMjUyMyw3IEBAIGJvb2wg
U3BlY3VsYXRpdmVKSVQ6OmNvbXBpbGVTdHJpY3RFcUZvckMKICAgICAgICAgCiAgICAgICAgIHVz
ZShub2RlLmNoaWxkMSgpKTsKICAgICAgICAgdXNlKG5vZGUuY2hpbGQyKCkpOworICAgICAgICBt
X2luZGV4SW5CbG9jayA9IGJyYW5jaEluZGV4SW5CbG9jazsKICAgICAgICAgbV9jb21waWxlSW5k
ZXggPSBicmFuY2hOb2RlSW5kZXg7CiAgICAgICAgIHJldHVybiB0cnVlOwogICAgIH0KQEAgLTI1
NjYsMTEgKzI1NzQsMTMgQEAgYm9vbCBTcGVjdWxhdGl2ZUpJVDo6Y29tcGlsZVN0cmljdEVxKE5v
ZAogICAgIC8vIDIpIElmIHRoZSBvcGVyYW5kcyBhcmUgcHJlZGljdGVkIGludGVnZXIsIGRvIGFu
IGludGVnZXIgY29tcGFyaXNvbi4KICAgICAKICAgICBpZiAoTm9kZTo6c2hvdWxkU3BlY3VsYXRl
SW50ZWdlcihhdChub2RlLmNoaWxkMSgpKSwgYXQobm9kZS5jaGlsZDIoKSkpKSB7Ci0gICAgICAg
IE5vZGVJbmRleCBicmFuY2hOb2RlSW5kZXggPSBkZXRlY3RQZWVwSG9sZUJyYW5jaCgpOwotICAg
ICAgICBpZiAoYnJhbmNoTm9kZUluZGV4ICE9IE5vTm9kZSkgeworICAgICAgICB1bnNpZ25lZCBi
cmFuY2hJbmRleEluQmxvY2sgPSBkZXRlY3RQZWVwSG9sZUJyYW5jaCgpOworICAgICAgICBpZiAo
YnJhbmNoSW5kZXhJbkJsb2NrICE9IFVJTlRfTUFYKSB7CisgICAgICAgICAgICBOb2RlSW5kZXgg
YnJhbmNoTm9kZUluZGV4ID0gbV9qaXQuZ3JhcGgoKS5tX2Jsb2Nrc1ttX2Jsb2NrXS0+YXQoYnJh
bmNoSW5kZXhJbkJsb2NrKTsKICAgICAgICAgICAgIGNvbXBpbGVQZWVwSG9sZUludGVnZXJCcmFu
Y2gobm9kZSwgYnJhbmNoTm9kZUluZGV4LCBNYWNyb0Fzc2VtYmxlcjo6RXF1YWwpOwogICAgICAg
ICAgICAgdXNlKG5vZGUuY2hpbGQxKCkpOwogICAgICAgICAgICAgdXNlKG5vZGUuY2hpbGQyKCkp
OworICAgICAgICAgICAgbV9pbmRleEluQmxvY2sgPSBicmFuY2hJbmRleEluQmxvY2s7CiAgICAg
ICAgICAgICBtX2NvbXBpbGVJbmRleCA9IGJyYW5jaE5vZGVJbmRleDsKICAgICAgICAgICAgIHJl
dHVybiB0cnVlOwogICAgICAgICB9CkBAIC0yNTgxLDExICsyNTkxLDEzIEBAIGJvb2wgU3BlY3Vs
YXRpdmVKSVQ6OmNvbXBpbGVTdHJpY3RFcShOb2QKICAgICAvLyAzKSBJZiB0aGUgb3BlcmFuZHMg
YXJlIHByZWRpY3RlZCBkb3VibGUsIGRvIGEgZG91YmxlIGNvbXBhcmlzb24uCiAgICAgCiAgICAg
aWYgKE5vZGU6OnNob3VsZFNwZWN1bGF0ZU51bWJlcihhdChub2RlLmNoaWxkMSgpKSwgYXQobm9k
ZS5jaGlsZDIoKSkpKSB7Ci0gICAgICAgIE5vZGVJbmRleCBicmFuY2hOb2RlSW5kZXggPSBkZXRl
Y3RQZWVwSG9sZUJyYW5jaCgpOwotICAgICAgICBpZiAoYnJhbmNoTm9kZUluZGV4ICE9IE5vTm9k
ZSkgeworICAgICAgICB1bnNpZ25lZCBicmFuY2hJbmRleEluQmxvY2sgPSBkZXRlY3RQZWVwSG9s
ZUJyYW5jaCgpOworICAgICAgICBpZiAoYnJhbmNoSW5kZXhJbkJsb2NrICE9IFVJTlRfTUFYKSB7
CisgICAgICAgICAgICBOb2RlSW5kZXggYnJhbmNoTm9kZUluZGV4ID0gbV9qaXQuZ3JhcGgoKS5t
X2Jsb2Nrc1ttX2Jsb2NrXS0+YXQoYnJhbmNoSW5kZXhJbkJsb2NrKTsKICAgICAgICAgICAgIGNv
bXBpbGVQZWVwSG9sZURvdWJsZUJyYW5jaChub2RlLCBicmFuY2hOb2RlSW5kZXgsIE1hY3JvQXNz
ZW1ibGVyOjpEb3VibGVFcXVhbCk7CiAgICAgICAgICAgICB1c2Uobm9kZS5jaGlsZDEoKSk7CiAg
ICAgICAgICAgICB1c2Uobm9kZS5jaGlsZDIoKSk7CisgICAgICAgICAgICBtX2luZGV4SW5CbG9j
ayA9IGJyYW5jaEluZGV4SW5CbG9jazsKICAgICAgICAgICAgIG1fY29tcGlsZUluZGV4ID0gYnJh
bmNoTm9kZUluZGV4OwogICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgIH0KQEAgLTI1
OTcsMTEgKzI2MDksMTMgQEAgYm9vbCBTcGVjdWxhdGl2ZUpJVDo6Y29tcGlsZVN0cmljdEVxKE5v
ZAogICAgIC8vICAgIG9yIGFycmF5IGNvbXBhcmlzb24uCiAgICAgCiAgICAgaWYgKE5vZGU6OnNo
b3VsZFNwZWN1bGF0ZUZpbmFsT2JqZWN0KGF0KG5vZGUuY2hpbGQxKCkpLCBhdChub2RlLmNoaWxk
MigpKSkpIHsKLSAgICAgICAgTm9kZUluZGV4IGJyYW5jaE5vZGVJbmRleCA9IGRldGVjdFBlZXBI
b2xlQnJhbmNoKCk7Ci0gICAgICAgIGlmIChicmFuY2hOb2RlSW5kZXggIT0gTm9Ob2RlKSB7Cisg
ICAgICAgIHVuc2lnbmVkIGJyYW5jaEluZGV4SW5CbG9jayA9IGRldGVjdFBlZXBIb2xlQnJhbmNo
KCk7CisgICAgICAgIGlmIChicmFuY2hJbmRleEluQmxvY2sgIT0gVUlOVF9NQVgpIHsKKyAgICAg
ICAgICAgIE5vZGVJbmRleCBicmFuY2hOb2RlSW5kZXggPSBtX2ppdC5ncmFwaCgpLm1fYmxvY2tz
W21fYmxvY2tdLT5hdChicmFuY2hJbmRleEluQmxvY2spOwogICAgICAgICAgICAgY29tcGlsZVBl
ZXBIb2xlT2JqZWN0RXF1YWxpdHkobm9kZSwgYnJhbmNoTm9kZUluZGV4LCAmSlNGaW5hbE9iamVj
dDo6c19pbmZvLCBpc0ZpbmFsT2JqZWN0UHJlZGljdGlvbik7CiAgICAgICAgICAgICB1c2Uobm9k
ZS5jaGlsZDEoKSk7CiAgICAgICAgICAgICB1c2Uobm9kZS5jaGlsZDIoKSk7CisgICAgICAgICAg
ICBtX2luZGV4SW5CbG9jayA9IGJyYW5jaEluZGV4SW5CbG9jazsKICAgICAgICAgICAgIG1fY29t
cGlsZUluZGV4ID0gYnJhbmNoTm9kZUluZGV4OwogICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAg
ICAgICAgIH0KQEAgLTI2MTAsMTEgKzI2MjQsMTMgQEAgYm9vbCBTcGVjdWxhdGl2ZUpJVDo6Y29t
cGlsZVN0cmljdEVxKE5vZAogICAgIH0KICAgICAKICAgICBpZiAoTm9kZTo6c2hvdWxkU3BlY3Vs
YXRlQXJyYXkoYXQobm9kZS5jaGlsZDEoKSksIGF0KG5vZGUuY2hpbGQyKCkpKSkgewotICAgICAg
ICBOb2RlSW5kZXggYnJhbmNoTm9kZUluZGV4ID0gZGV0ZWN0UGVlcEhvbGVCcmFuY2goKTsKLSAg
ICAgICAgaWYgKGJyYW5jaE5vZGVJbmRleCAhPSBOb05vZGUpIHsKKyAgICAgICAgdW5zaWduZWQg
YnJhbmNoSW5kZXhJbkJsb2NrID0gZGV0ZWN0UGVlcEhvbGVCcmFuY2goKTsKKyAgICAgICAgaWYg
KGJyYW5jaEluZGV4SW5CbG9jayAhPSBVSU5UX01BWCkgeworICAgICAgICAgICAgTm9kZUluZGV4
IGJyYW5jaE5vZGVJbmRleCA9IG1faml0LmdyYXBoKCkubV9ibG9ja3NbbV9ibG9ja10tPmF0KGJy
YW5jaEluZGV4SW5CbG9jayk7CiAgICAgICAgICAgICBjb21waWxlUGVlcEhvbGVPYmplY3RFcXVh
bGl0eShub2RlLCBicmFuY2hOb2RlSW5kZXgsICZKU0FycmF5OjpzX2luZm8sIGlzQXJyYXlQcmVk
aWN0aW9uKTsKICAgICAgICAgICAgIHVzZShub2RlLmNoaWxkMSgpKTsKICAgICAgICAgICAgIHVz
ZShub2RlLmNoaWxkMigpKTsKKyAgICAgICAgICAgIG1faW5kZXhJbkJsb2NrID0gYnJhbmNoSW5k
ZXhJbkJsb2NrOwogICAgICAgICAgICAgbV9jb21waWxlSW5kZXggPSBicmFuY2hOb2RlSW5kZXg7
CiAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgfQpJbmRleDogU291cmNlL0phdmFT
Y3JpcHRDb3JlL2RmZy9ERkdTcGVjdWxhdGl2ZUpJVC5oCj09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9K
YXZhU2NyaXB0Q29yZS9kZmcvREZHU3BlY3VsYXRpdmVKSVQuaAkocmV2aXNpb24gMTA5Mjk1KQor
KysgU291cmNlL0phdmFTY3JpcHRDb3JlL2RmZy9ERkdTcGVjdWxhdGl2ZUpJVC5oCSh3b3JraW5n
IGNvcHkpCkBAIC04NzMsMjAgKzg3MywyMSBAQCBwcml2YXRlOgogICAgICAgICB9CiAgICAgfQog
ICAgIAotICAgIC8vIFJldHVybnMgdGhlIG5vZGUgaW5kZXggb2YgdGhlIGJyYW5jaCBub2RlIGlm
IHBlZXBob2xlIGlzIG9rYXksIE5vTm9kZSBvdGhlcndpc2UuCi0gICAgTm9kZUluZGV4IGRldGVj
dFBlZXBIb2xlQnJhbmNoKCkKKyAgICAvLyBSZXR1cm5zIHRoZSBpbmRleCBvZiB0aGUgYnJhbmNo
IG5vZGUgaWYgcGVlcGhvbGUgaXMgb2theSwgVUlOVF9NQVggb3RoZXJ3aXNlLgorICAgIHVuc2ln
bmVkIGRldGVjdFBlZXBIb2xlQnJhbmNoKCkKICAgICB7Ci0gICAgICAgIE5vZGVJbmRleCBsYXN0
Tm9kZUluZGV4ID0gbV9qaXQuZ3JhcGgoKS5tX2Jsb2Nrc1ttX2Jsb2NrXS0+ZW5kIC0gMTsKKyAg
ICAgICAgQmFzaWNCbG9jayogYmxvY2sgPSBtX2ppdC5ncmFwaCgpLm1fYmxvY2tzW21fYmxvY2td
LmdldCgpOwogCiAgICAgICAgIC8vIENoZWNrIHRoYXQgbm8gaW50ZXJ2ZW5pbmcgbm9kZXMgd2ls
bCBiZSBnZW5lcmF0ZWQuCi0gICAgICAgIGZvciAoTm9kZUluZGV4IGluZGV4ID0gbV9jb21waWxl
SW5kZXggKyAxOyBpbmRleCA8IGxhc3ROb2RlSW5kZXg7ICsraW5kZXgpIHsKLSAgICAgICAgICAg
IGlmIChhdChpbmRleCkuc2hvdWxkR2VuZXJhdGUoKSkKLSAgICAgICAgICAgICAgICByZXR1cm4g
Tm9Ob2RlOworICAgICAgICBmb3IgKHVuc2lnbmVkIGluZGV4ID0gbV9pbmRleEluQmxvY2sgKyAx
OyBpbmRleCA8IGJsb2NrLT5zaXplKCkgLSAxOyArK2luZGV4KSB7CisgICAgICAgICAgICBOb2Rl
SW5kZXggbm9kZUluZGV4ID0gYmxvY2stPmF0KGluZGV4KTsKKyAgICAgICAgICAgIGlmIChhdChu
b2RlSW5kZXgpLnNob3VsZEdlbmVyYXRlKCkpCisgICAgICAgICAgICAgICAgcmV0dXJuIFVJTlRf
TUFYOwogICAgICAgICB9CiAKICAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIGxhc3ROb2RlIGlzIGEg
YnJhbmNoIG9uIHRoaXMgbm9kZS4KLSAgICAgICAgTm9kZSYgbGFzdE5vZGUgPSBhdChsYXN0Tm9k
ZUluZGV4KTsKLSAgICAgICAgcmV0dXJuIGxhc3ROb2RlLm9wID09IEJyYW5jaCAmJiBsYXN0Tm9k
ZS5jaGlsZDEoKS5pbmRleCgpID09IG1fY29tcGlsZUluZGV4ID8gbGFzdE5vZGVJbmRleCA6IE5v
Tm9kZTsKKyAgICAgICAgTm9kZSYgbGFzdE5vZGUgPSBhdChibG9jay0+bGFzdCgpKTsKKyAgICAg
ICAgcmV0dXJuIGxhc3ROb2RlLm9wID09IEJyYW5jaCAmJiBsYXN0Tm9kZS5jaGlsZDEoKS5pbmRl
eCgpID09IG1fY29tcGlsZUluZGV4ID8gYmxvY2stPnNpemUoKSAtIDEgOiBVSU5UX01BWDsKICAg
ICB9CiAgICAgCiAgICAgdm9pZCBub25TcGVjdWxhdGl2ZVZhbHVlVG9OdW1iZXIoTm9kZSYpOwpA
QCAtMTg4MCw2ICsxODgxLDcgQEAgcHJpdmF0ZToKICAgICAvLyBUaGUgY3VycmVudCBub2RlIGJl
aW5nIGdlbmVyYXRlZC4KICAgICBCbG9ja0luZGV4IG1fYmxvY2s7CiAgICAgTm9kZUluZGV4IG1f
Y29tcGlsZUluZGV4OworICAgIHVuc2lnbmVkIG1faW5kZXhJbkJsb2NrOwogICAgIC8vIFZpcnR1
YWwgYW5kIHBoeXNpY2FsIHJlZ2lzdGVyIG1hcHMuCiAgICAgVmVjdG9yPEdlbmVyYXRpb25JbmZv
LCAzMj4gbV9nZW5lcmF0aW9uSW5mbzsKICAgICBSZWdpc3RlckJhbms8R1BSSW5mbz4gbV9ncHJz
OwpAQCAtMjUxMyw2ICsyNTE1LDcgQEAgaW5saW5lIFNwZWN1bGF0aXZlSklUOjpTcGVjdWxhdGl2
ZUpJVChKSQogICAgIDogbV9jb21waWxlT2theSh0cnVlKQogICAgICwgbV9qaXQoaml0KQogICAg
ICwgbV9jb21waWxlSW5kZXgoMCkKKyAgICAsIG1faW5kZXhJbkJsb2NrKDApCiAgICAgLCBtX2dl
bmVyYXRpb25JbmZvKG1faml0LmNvZGVCbG9jaygpLT5tX251bUNhbGxlZVJlZ2lzdGVycykKICAg
ICAsIG1fYmxvY2tIZWFkcyhqaXQuZ3JhcGgoKS5tX2Jsb2Nrcy5zaXplKCkpCiAgICAgLCBtX2Fy
Z3VtZW50cyhqaXQuY29kZUJsb2NrKCktPm51bVBhcmFtZXRlcnMoKSkKSW5kZXg6IFNvdXJjZS9K
YXZhU2NyaXB0Q29yZS9kZmcvREZHVmlydHVhbFJlZ2lzdGVyQWxsb2NhdGlvblBoYXNlLmNwcAo9
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvZGZnL0RGR1ZpcnR1YWxSZWdpc3Rl
ckFsbG9jYXRpb25QaGFzZS5jcHAJKHJldmlzaW9uIDEwOTI5NSkKKysrIFNvdXJjZS9KYXZhU2Ny
aXB0Q29yZS9kZmcvREZHVmlydHVhbFJlZ2lzdGVyQWxsb2NhdGlvblBoYXNlLmNwcAkod29ya2lu
ZyBjb3B5KQpAQCAtNDgsOCArNDgsNyBAQCBwdWJsaWM6CiAgICAgICAgIGRhdGFMb2coIlxuIik7
CiAjZW5kaWYKICAgICAgICAgU2NvcmVCb2FyZCBzY29yZUJvYXJkKG1fZ3JhcGgsIG1fZ3JhcGgu
bV9wcmVzZXJ2ZWRWYXJzKTsKLSAgICAgICAgdW5zaWduZWQgc2l6ZUV4Y2x1ZGluZ1BoaU5vZGVz
ID0gbV9ncmFwaC5tX2Jsb2Nrcy5sYXN0KCktPmVuZDsKLSAgICAgICAgZm9yIChzaXplX3QgaSA9
IDA7IGkgPCBzaXplRXhjbHVkaW5nUGhpTm9kZXM7ICsraSkgeworICAgICAgICBmb3IgKHNpemVf
dCBpID0gMDsgaSA8IG1fZ3JhcGguc2l6ZSgpOyArK2kpIHsKICAgICAgICAgICAgIE5vZGUmIG5v
ZGUgPSBtX2dyYXBoW2ldOwogICAgICAgICAKICAgICAgICAgICAgIGlmICghbm9kZS5zaG91bGRH
ZW5lcmF0ZSgpIHx8IG5vZGUub3AgPT0gUGhpIHx8IG5vZGUub3AgPT0gRmx1c2gpCg==
</data>
<flag name="review"
          id="132326"
          type_id="1"
          status="-"
          setter="fpizlo"
    />
          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>129627</attachid>
            <date>2012-02-29 21:23:50 -0800</date>
            <delta_ts>2012-02-29 21:44:23 -0800</delta_ts>
            <desc>patch updated</desc>
            <filename>79899.2.patch</filename>
            <type>text/plain</type>
            <size>47773</size>
            <attacher name="Yuqiang Xian">yuqiang.xian</attacher>
            
              <data encoding="base64">SW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9DaGFuZ2VMb2cKPT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291
cmNlL0phdmFTY3JpcHRDb3JlL0NoYW5nZUxvZwkocmV2aXNpb24gMTA5MzA0KQorKysgU291cmNl
L0phdmFTY3JpcHRDb3JlL0NoYW5nZUxvZwkod29ya2luZyBjb3B5KQpAQCAtMSwzICsxLDgzIEBA
CisyMDEyLTAyLTI5ICBZdXFpYW5nIFhpYW4gIDx5dXFpYW5nLnhpYW5AaW50ZWwuY29tPgorCisg
ICAgICAgIERGRyBCYXNpY0Jsb2NrcyBzaG91bGQgbm90IHJlcXVpcmUgdGhhdCB0aGVpciBub2Rl
cyBoYXZlIGNvbnRpbnVvdXMgaW5kaWNlcyBpbiB0aGUgZ3JhcGgKKyAgICAgICAgaHR0cHM6Ly9i
dWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTc5ODk5CisKKyAgICAgICAgUmV2aWV3ZWQg
YnkgTk9CT0RZIChPT1BTISkuCisKKyAgICAgICAgVGhpcyB3aWxsIG1ha2UgaXQgbW9yZSBjb252
ZW5pZW50IHRvIGluc2VydCBub2RlcyBpbnRvIHRoZSBERkcuCisgICAgICAgIFdpdGggdGhpcyBj
YXBhYmlsaXR5IHdlIG5vdyBwbGFjZSB0aGUgUGhpIG5vZGVzIGluIHRoZSBjb3JyZXNwb25kaW5n
CisgICAgICAgIGJsb2Nrcy4KKyAgICAgICAgTG9jYWwgQ1NFIGlzIG1vZGlmaWVkIHRvIG5vdCB0
byByZWx5IG9uIHRoZSBhc3N1bXB0aW9uIG9mIGNvbnRpbnVvdXMKKyAgICAgICAgbm9kZSBpbmRp
Y2VzIGluIGEgYmxvY2suCisgICAgICAgIFRoaXMgaXMgcGVyZm9ybWFuY2UgbmV1dHJhbCBvbiBT
dW5TcGlkZXIsIFY4IGFuZCBLcmFrZW4uCisKKyAgICAgICAgKiBkZmcvREZHQWJzdHJhY3RTdGF0
ZS5jcHA6CisgICAgICAgIChKU0M6OkRGRzo6QWJzdHJhY3RTdGF0ZTo6QWJzdHJhY3RTdGF0ZSk6
CisgICAgICAgIChKU0M6OkRGRzo6QWJzdHJhY3RTdGF0ZTo6YmVnaW5CYXNpY0Jsb2NrKToKKyAg
ICAgICAgKEpTQzo6REZHOjpBYnN0cmFjdFN0YXRlOjpleGVjdXRlKToKKyAgICAgICAgKEpTQzo6
REZHOjpBYnN0cmFjdFN0YXRlOjpjbG9iYmVyU3RydWN0dXJlcyk6CisgICAgICAgIChKU0M6OkRG
Rzo6QWJzdHJhY3RTdGF0ZTo6bWVyZ2VUb1N1Y2Nlc3NvcnMpOgorICAgICAgICAoSlNDOjpERkc6
OkFic3RyYWN0U3RhdGU6OmR1bXApOgorICAgICAgICAqIGRmZy9ERkdBYnN0cmFjdFN0YXRlLmg6
CisgICAgICAgIChKU0M6OkRGRzo6QWJzdHJhY3RTdGF0ZTo6Zm9yTm9kZSk6CisgICAgICAgIChB
YnN0cmFjdFN0YXRlKToKKyAgICAgICAgKiBkZmcvREZHQXJpdGhOb2RlRmxhZ3NJbmZlcmVuY2VQ
aGFzZS5jcHA6CisgICAgICAgIChBcml0aE5vZGVGbGFnc0luZmVyZW5jZVBoYXNlKToKKyAgICAg
ICAgKiBkZmcvREZHQmFzaWNCbG9jay5oOgorICAgICAgICAoSlNDOjpERkc6OkJhc2ljQmxvY2s6
OkJhc2ljQmxvY2spOgorICAgICAgICAoQmFzaWNCbG9jayk6CisgICAgICAgICogZGZnL0RGR0J5
dGVDb2RlUGFyc2VyLmNwcDoKKyAgICAgICAgKEpTQzo6REZHOjpCeXRlQ29kZVBhcnNlcjo6YWRk
VG9HcmFwaCk6CisgICAgICAgIChCeXRlQ29kZVBhcnNlcik6CisgICAgICAgIChKU0M6OkRGRzo6
Qnl0ZUNvZGVQYXJzZXI6Omluc2VydFBoaU5vZGUpOgorICAgICAgICAoSlNDOjpERkc6OkJ5dGVD
b2RlUGFyc2VyOjpoYW5kbGVJbmxpbmluZyk6CisgICAgICAgIChKU0M6OkRGRzo6Qnl0ZUNvZGVQ
YXJzZXI6OnBhcnNlQmxvY2spOgorICAgICAgICAoSlNDOjpERkc6OkJ5dGVDb2RlUGFyc2VyOjpw
cm9jZXNzUGhpU3RhY2spOgorICAgICAgICAoSlNDOjpERkc6OkJ5dGVDb2RlUGFyc2VyOjpsaW5r
QmxvY2spOgorICAgICAgICAoSlNDOjpERkc6OkJ5dGVDb2RlUGFyc2VyOjpkZXRlcm1pbmVSZWFj
aGFiaWxpdHkpOgorICAgICAgICAoSlNDOjpERkc6OkJ5dGVDb2RlUGFyc2VyOjpwYXJzZUNvZGVC
bG9jayk6CisgICAgICAgICogZGZnL0RGR0NGQVBoYXNlLmNwcDoKKyAgICAgICAgKEpTQzo6REZH
OjpDRkFQaGFzZTo6cGVyZm9ybUJsb2NrQ0ZBKToKKyAgICAgICAgKENGQVBoYXNlKToKKyAgICAg
ICAgKiBkZmcvREZHQ1NFUGhhc2UuY3BwOgorICAgICAgICAoSlNDOjpERkc6OkNTRVBoYXNlOjpD
U0VQaGFzZSk6CisgICAgICAgIChKU0M6OkRGRzo6Q1NFUGhhc2U6OmVuZEluZGV4Rm9yUHVyZUNT
RSk6CisgICAgICAgIChKU0M6OkRGRzo6Q1NFUGhhc2U6OnB1cmVDU0UpOgorICAgICAgICAoSlND
OjpERkc6OkNTRVBoYXNlOjppbXB1cmVDU0UpOgorICAgICAgICAoSlNDOjpERkc6OkNTRVBoYXNl
OjpnbG9iYWxWYXJMb2FkRWxpbWluYXRpb24pOgorICAgICAgICAoSlNDOjpERkc6OkNTRVBoYXNl
OjpnZXRCeVZhbExvYWRFbGltaW5hdGlvbik6CisgICAgICAgIChKU0M6OkRGRzo6Q1NFUGhhc2U6
OmNoZWNrRnVuY3Rpb25FbGltaW5hdGlvbik6CisgICAgICAgIChKU0M6OkRGRzo6Q1NFUGhhc2U6
OmNoZWNrU3RydWN0dXJlTG9hZEVsaW1pbmF0aW9uKToKKyAgICAgICAgKEpTQzo6REZHOjpDU0VQ
aGFzZTo6Z2V0QnlPZmZzZXRMb2FkRWxpbWluYXRpb24pOgorICAgICAgICAoSlNDOjpERkc6OkNT
RVBoYXNlOjpnZXRQcm9wZXJ0eVN0b3JhZ2VMb2FkRWxpbWluYXRpb24pOgorICAgICAgICAoSlND
OjpERkc6OkNTRVBoYXNlOjpnZXRJbmRleGVkUHJvcGVydHlTdG9yYWdlTG9hZEVsaW1pbmF0aW9u
KToKKyAgICAgICAgKEpTQzo6REZHOjpDU0VQaGFzZTo6Z2V0U2NvcGVDaGFpbkxvYWRFbGltaW5h
dGlvbik6CisgICAgICAgIChKU0M6OkRGRzo6Q1NFUGhhc2U6OnBlcmZvcm1Ob2RlQ1NFKToKKyAg
ICAgICAgKEpTQzo6REZHOjpDU0VQaGFzZTo6cGVyZm9ybUJsb2NrQ1NFKToKKyAgICAgICAgKENT
RVBoYXNlKToKKyAgICAgICAgKiBkZmcvREZHR3JhcGguY3BwOgorICAgICAgICAoSlNDOjpERkc6
OkdyYXBoOjpkdW1wKToKKyAgICAgICAgKiBkZmcvREZHUGhhc2UuY3BwOgorICAgICAgICAoSlND
OjpERkc6OlBoYXNlOjpiZWdpblBoYXNlKToKKyAgICAgICAgKiBkZmcvREZHU3BlY3VsYXRpdmVK
SVQuY3BwOgorICAgICAgICAoSlNDOjpERkc6OlNwZWN1bGF0aXZlSklUOjpub25TcGVjdWxhdGl2
ZUNvbXBhcmUpOgorICAgICAgICAoSlNDOjpERkc6OlNwZWN1bGF0aXZlSklUOjpub25TcGVjdWxh
dGl2ZVN0cmljdEVxKToKKyAgICAgICAgKEpTQzo6REZHOjpTcGVjdWxhdGl2ZUpJVDo6Y29tcGls
ZVBlZXBIb2xlQnJhbmNoKToKKyAgICAgICAgKEpTQzo6REZHOjpTcGVjdWxhdGl2ZUpJVDo6Y29t
cGlsZSk6CisgICAgICAgIChKU0M6OkRGRzo6U3BlY3VsYXRpdmVKSVQ6OmNvbXBpbGVTdHJpY3RF
cUZvckNvbnN0YW50KToKKyAgICAgICAgKEpTQzo6REZHOjpTcGVjdWxhdGl2ZUpJVDo6Y29tcGls
ZVN0cmljdEVxKToKKyAgICAgICAgKiBkZmcvREZHU3BlY3VsYXRpdmVKSVQuaDoKKyAgICAgICAg
KFNwZWN1bGF0aXZlSklUKToKKyAgICAgICAgKEpTQzo6REZHOjpTcGVjdWxhdGl2ZUpJVDo6ZGV0
ZWN0UGVlcEhvbGVCcmFuY2gpOgorICAgICAgICAoSlNDOjpERkc6OlNwZWN1bGF0aXZlSklUOjpT
cGVjdWxhdGl2ZUpJVCk6CisgICAgICAgICogZGZnL0RGR1NwZWN1bGF0aXZlSklUMzJfNjQuY3Bw
OgorICAgICAgICAoSlNDOjpERkc6OlNwZWN1bGF0aXZlSklUOjpub25TcGVjdWxhdGl2ZUNvbXBh
cmVOdWxsKToKKyAgICAgICAgKiBkZmcvREZHU3BlY3VsYXRpdmVKSVQ2NC5jcHA6CisgICAgICAg
IChKU0M6OkRGRzo6U3BlY3VsYXRpdmVKSVQ6Om5vblNwZWN1bGF0aXZlQ29tcGFyZU51bGwpOgor
ICAgICAgICAqIGRmZy9ERkdWaXJ0dWFsUmVnaXN0ZXJBbGxvY2F0aW9uUGhhc2UuY3BwOgorICAg
ICAgICAoSlNDOjpERkc6OlZpcnR1YWxSZWdpc3RlckFsbG9jYXRpb25QaGFzZTo6cnVuKToKKwog
MjAxMi0wMi0yOSAgTm8nYW0gUm9zZW50aGFsICA8bm9hbS5yb3NlbnRoYWxAbm9raWEuY29tPgog
CiAgICAgICAgIFtRdF1bV0syXSBHZXQgcmlkIG9mIHRoZSAjaWZkZWYgbWVzcyBpbiBMYXllclRy
ZWVIb3N0W1Byb3h5XQpJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL2RmZy9ERkdBYnN0cmFj
dFN0YXRlLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvZGZnL0RGR0Fi
c3RyYWN0U3RhdGUuY3BwCShyZXZpc2lvbiAxMDkyOTUpCisrKyBTb3VyY2UvSmF2YVNjcmlwdENv
cmUvZGZnL0RGR0Fic3RyYWN0U3RhdGUuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC01NCwxMyArNTQs
NyBAQCBBYnN0cmFjdFN0YXRlOjpBYnN0cmFjdFN0YXRlKEdyYXBoJiBncmFwCiAgICAgLCBtX3Zh
cmlhYmxlcyhtX2NvZGVCbG9jay0+bnVtUGFyYW1ldGVycygpLCBncmFwaC5tX2xvY2FsVmFycykK
ICAgICAsIG1fYmxvY2soMCkKIHsKLSAgICBzaXplX3QgbWF4QmxvY2tTaXplID0gMDsKLSAgICBm
b3IgKHNpemVfdCBpID0gMDsgaSA8IGdyYXBoLm1fYmxvY2tzLnNpemUoKTsgKytpKSB7Ci0gICAg
ICAgIEJhc2ljQmxvY2sqIGJsb2NrID0gZ3JhcGgubV9ibG9ja3NbaV0uZ2V0KCk7Ci0gICAgICAg
IGlmIChibG9jay0+ZW5kIC0gYmxvY2stPmJlZ2luID4gbWF4QmxvY2tTaXplKQotICAgICAgICAg
ICAgbWF4QmxvY2tTaXplID0gYmxvY2stPmVuZCAtIGJsb2NrLT5iZWdpbjsKLSAgICB9Ci0gICAg
bV9ub2Rlcy5yZXNpemUobWF4QmxvY2tTaXplKTsKKyAgICBtX25vZGVzLnJlc2l6ZShncmFwaC5z
aXplKCkpOwogfQogCiBBYnN0cmFjdFN0YXRlOjp+QWJzdHJhY3RTdGF0ZSgpIHsgfQpAQCAtNzUs
OCArNjksOSBAQCB2b2lkIEFic3RyYWN0U3RhdGU6OmJlZ2luQmFzaWNCbG9jayhCYXNpCiAgICAg
QVNTRVJUKGJhc2ljQmxvY2stPnZhcmlhYmxlc0F0VGFpbC5udW1iZXJPZkxvY2FscygpID09IGJh
c2ljQmxvY2stPnZhbHVlc0F0VGFpbC5udW1iZXJPZkxvY2FscygpKTsKICAgICBBU1NFUlQoYmFz
aWNCbG9jay0+dmFyaWFibGVzQXRIZWFkLm51bWJlck9mTG9jYWxzKCkgPT0gYmFzaWNCbG9jay0+
dmFyaWFibGVzQXRUYWlsLm51bWJlck9mTG9jYWxzKCkpOwogICAgIAotICAgIGZvciAoc2l6ZV90
IGkgPSAwOyBpIDwgYmFzaWNCbG9jay0+ZW5kIC0gYmFzaWNCbG9jay0+YmVnaW47ICsraSkKLSAg
ICAgICAgbV9ub2Rlc1tpXS5jbGVhcigpOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgYmFz
aWNCbG9jay0+c2l6ZSgpOyBpKyspCisgICAgICAgIG1fbm9kZXNbYmFzaWNCbG9jay0+YXQoaSld
LmNsZWFyKCk7CisKICAgICBtX3ZhcmlhYmxlcyA9IGJhc2ljQmxvY2stPnZhbHVlc0F0SGVhZDsK
ICAgICBtX2hhdmVTdHJ1Y3R1cmVzID0gZmFsc2U7CiAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkg
PCBtX3ZhcmlhYmxlcy5udW1iZXJPZkFyZ3VtZW50cygpOyArK2kpIHsKQEAgLTIxNSwxMiArMjEw
LDEzIEBAIHZvaWQgQWJzdHJhY3RTdGF0ZTo6cmVzZXQoKQogICAgIG1faXNWYWxpZCA9IGZhbHNl
OwogfQogCi1ib29sIEFic3RyYWN0U3RhdGU6OmV4ZWN1dGUoTm9kZUluZGV4IG5vZGVJbmRleCkK
K2Jvb2wgQWJzdHJhY3RTdGF0ZTo6ZXhlY3V0ZSh1bnNpZ25lZCBpbmRleEluQmxvY2spCiB7CiAg
ICAgUFJPRklMRShGTEFHX0ZPUl9FWEVDVVRJT04pOwogICAgIEFTU0VSVChtX2Jsb2NrKTsKICAg
ICBBU1NFUlQobV9pc1ZhbGlkKTsKICAgICAgICAgCisgICAgTm9kZUluZGV4IG5vZGVJbmRleCA9
IG1fYmxvY2stPmF0KGluZGV4SW5CbG9jayk7CiAgICAgTm9kZSYgbm9kZSA9IG1fZ3JhcGhbbm9k
ZUluZGV4XTsKICAgICAgICAgCiAgICAgaWYgKCFub2RlLnNob3VsZEdlbmVyYXRlKCkpCkBAIC0z
MTksNyArMzE1LDcgQEAgYm9vbCBBYnN0cmFjdFN0YXRlOjpleGVjdXRlKE5vZGVJbmRleCBubwog
ICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KICAgICAgICAgaWYgKG5vZGUub3AgPT0gVmFs
dWVBZGQpIHsKLSAgICAgICAgICAgIGNsb2JiZXJTdHJ1Y3R1cmVzKG5vZGVJbmRleCk7CisgICAg
ICAgICAgICBjbG9iYmVyU3RydWN0dXJlcyhpbmRleEluQmxvY2spOwogICAgICAgICAgICAgZm9y
Tm9kZShub2RlSW5kZXgpLnNldChQcmVkaWN0U3RyaW5nIHwgUHJlZGljdEludDMyIHwgUHJlZGlj
dE51bWJlcik7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQpAQCAtNDA5LDcgKzQwNSw3
IEBAIGJvb2wgQWJzdHJhY3RTdGF0ZTo6ZXhlY3V0ZShOb2RlSW5kZXggbm8KICAgICAgICAgZWxz
ZSBpZiAoY2hpbGQuc2hvdWxkU3BlY3VsYXRlTnVtYmVyKCkpCiAgICAgICAgICAgICBmb3JOb2Rl
KG5vZGUuY2hpbGQxKCkpLmZpbHRlcihQcmVkaWN0TnVtYmVyKTsKICAgICAgICAgZWxzZQotICAg
ICAgICAgICAgY2xvYmJlclN0cnVjdHVyZXMobm9kZUluZGV4KTsKKyAgICAgICAgICAgIGNsb2Ji
ZXJTdHJ1Y3R1cmVzKGluZGV4SW5CbG9jayk7CiAgICAgICAgIGZvck5vZGUobm9kZUluZGV4KS5z
ZXQoUHJlZGljdEJvb2xlYW4pOwogICAgICAgICBicmVhazsKICAgICB9CkBAIC00MzIsNyArNDI4
LDcgQEAgYm9vbCBBYnN0cmFjdFN0YXRlOjpleGVjdXRlKE5vZGVJbmRleCBubwogICAgICAgICAg
ICAgZmlsdGVyID0gUHJlZGljdEFycmF5OwogICAgICAgICBlbHNlIHsKICAgICAgICAgICAgIGZp
bHRlciA9IFByZWRpY3RUb3A7Ci0gICAgICAgICAgICBjbG9iYmVyU3RydWN0dXJlcyhub2RlSW5k
ZXgpOworICAgICAgICAgICAgY2xvYmJlclN0cnVjdHVyZXMoaW5kZXhJbkJsb2NrKTsKICAgICAg
ICAgfQogICAgICAgICBmb3JOb2RlKG5vZGUuY2hpbGQxKCkpLmZpbHRlcihmaWx0ZXIpOwogICAg
ICAgICBmb3JOb2RlKG5vZGUuY2hpbGQyKCkpLmZpbHRlcihmaWx0ZXIpOwpAQCAtNDYyLDcgKzQ1
OCw3IEBAIGJvb2wgQWJzdHJhY3RTdGF0ZTo6ZXhlY3V0ZShOb2RlSW5kZXggbm8KICAgICAgICAg
ICAgIGJyZWFrOwogICAgICAgICB9CiAgICAgICAgIGlmICghaXNBY3Rpb25hYmxlQXJyYXlQcmVk
aWN0aW9uKG1fZ3JhcGhbbm9kZS5jaGlsZDEoKV0ucHJlZGljdGlvbigpKSB8fCAhbV9ncmFwaFtu
b2RlLmNoaWxkMigpXS5zaG91bGRTcGVjdWxhdGVJbnRlZ2VyKCkpIHsKLSAgICAgICAgICAgIGNs
b2JiZXJTdHJ1Y3R1cmVzKG5vZGVJbmRleCk7CisgICAgICAgICAgICBjbG9iYmVyU3RydWN0dXJl
cyhpbmRleEluQmxvY2spOwogICAgICAgICAgICAgZm9yTm9kZShub2RlSW5kZXgpLm1ha2VUb3Ao
KTsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CkBAIC01NDgsNyArNTQ0LDcgQEAgYm9v
bCBBYnN0cmFjdFN0YXRlOjpleGVjdXRlKE5vZGVJbmRleCBubwogICAgICAgICB9CiAgICAgICAg
IGlmICghbV9ncmFwaFtub2RlLmNoaWxkMigpXS5zaG91bGRTcGVjdWxhdGVJbnRlZ2VyKCkgfHwg
IWlzQWN0aW9uYWJsZU11dGFibGVBcnJheVByZWRpY3Rpb24obV9ncmFwaFtub2RlLmNoaWxkMSgp
XS5wcmVkaWN0aW9uKCkpKSB7CiAgICAgICAgICAgICBBU1NFUlQobm9kZS5vcCA9PSBQdXRCeVZh
bCk7Ci0gICAgICAgICAgICBjbG9iYmVyU3RydWN0dXJlcyhub2RlSW5kZXgpOworICAgICAgICAg
ICAgY2xvYmJlclN0cnVjdHVyZXMoaW5kZXhJbkJsb2NrKTsKICAgICAgICAgICAgIGZvck5vZGUo
bm9kZUluZGV4KS5tYWtlVG9wKCk7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQpAQCAt
NzY2LDcgKzc2Miw3IEBAIGJvb2wgQWJzdHJhY3RTdGF0ZTo6ZXhlY3V0ZShOb2RlSW5kZXggbm8K
ICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAKICAgICBjYXNlIFB1dFNjb3BlZFZhcjoKLSAg
ICAgICAgY2xvYmJlclN0cnVjdHVyZXMobm9kZUluZGV4KTsKKyAgICAgICAgY2xvYmJlclN0cnVj
dHVyZXMoaW5kZXhJbkJsb2NrKTsKICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAKICAgICBj
YXNlIEdldEJ5SWQ6CkBAIC03NzcsNyArNzczLDcgQEAgYm9vbCBBYnN0cmFjdFN0YXRlOjpleGVj
dXRlKE5vZGVJbmRleCBubwogICAgICAgICB9CiAgICAgICAgIGlmIChpc0NlbGxQcmVkaWN0aW9u
KG1fZ3JhcGhbbm9kZS5jaGlsZDEoKV0ucHJlZGljdGlvbigpKSkKICAgICAgICAgICAgIGZvck5v
ZGUobm9kZS5jaGlsZDEoKSkuZmlsdGVyKFByZWRpY3RDZWxsKTsKLSAgICAgICAgY2xvYmJlclN0
cnVjdHVyZXMobm9kZUluZGV4KTsKKyAgICAgICAgY2xvYmJlclN0cnVjdHVyZXMoaW5kZXhJbkJs
b2NrKTsKICAgICAgICAgZm9yTm9kZShub2RlSW5kZXgpLm1ha2VUb3AoKTsKICAgICAgICAgYnJl
YWs7CiAgICAgICAgICAgICAKQEAgLTgzOSw3ICs4MzUsNyBAQCBib29sIEFic3RyYWN0U3RhdGU6
OmV4ZWN1dGUoTm9kZUluZGV4IG5vCiAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgCiAgICAg
Y2FzZSBQdXRTdHJ1Y3R1cmU6Ci0gICAgICAgIGNsb2JiZXJTdHJ1Y3R1cmVzKG5vZGVJbmRleCk7
CisgICAgICAgIGNsb2JiZXJTdHJ1Y3R1cmVzKGluZGV4SW5CbG9jayk7CiAgICAgICAgIGZvck5v
ZGUobm9kZS5jaGlsZDEoKSkuc2V0KG5vZGUuc3RydWN0dXJlVHJhbnNpdGlvbkRhdGEoKS5uZXdT
dHJ1Y3R1cmUpOwogICAgICAgICBtX2hhdmVTdHJ1Y3R1cmVzID0gdHJ1ZTsKICAgICAgICAgYnJl
YWs7CkBAIC05MzAsNyArOTI2LDcgQEAgYm9vbCBBYnN0cmFjdFN0YXRlOjpleGVjdXRlKE5vZGVJ
bmRleCBubwogICAgIGNhc2UgUHV0QnlJZDoKICAgICBjYXNlIFB1dEJ5SWREaXJlY3Q6CiAgICAg
ICAgIGZvck5vZGUobm9kZS5jaGlsZDEoKSkuZmlsdGVyKFByZWRpY3RDZWxsKTsKLSAgICAgICAg
Y2xvYmJlclN0cnVjdHVyZXMobm9kZUluZGV4KTsKKyAgICAgICAgY2xvYmJlclN0cnVjdHVyZXMo
aW5kZXhJbkJsb2NrKTsKICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAKICAgICBjYXNlIEdl
dEdsb2JhbFZhcjoKQEAgLTk2Niw3ICs5NjIsNyBAQCBib29sIEFic3RyYWN0U3RhdGU6OmV4ZWN1
dGUoTm9kZUluZGV4IG5vCiAgICAgY2FzZSBSZXNvbHZlQmFzZToKICAgICBjYXNlIFJlc29sdmVC
YXNlU3RyaWN0UHV0OgogICAgIGNhc2UgUmVzb2x2ZUdsb2JhbDoKLSAgICAgICAgY2xvYmJlclN0
cnVjdHVyZXMobm9kZUluZGV4KTsKKyAgICAgICAgY2xvYmJlclN0cnVjdHVyZXMoaW5kZXhJbkJs
b2NrKTsKICAgICAgICAgZm9yTm9kZShub2RlSW5kZXgpLm1ha2VUb3AoKTsKICAgICAgICAgYnJl
YWs7CiAgICAgICAgICAgICAKQEAgLTk4MywxMyArOTc5LDEzIEBAIGJvb2wgQWJzdHJhY3RTdGF0
ZTo6ZXhlY3V0ZShOb2RlSW5kZXggbm8KICAgICByZXR1cm4gbV9pc1ZhbGlkOwogfQogCi1pbmxp
bmUgdm9pZCBBYnN0cmFjdFN0YXRlOjpjbG9iYmVyU3RydWN0dXJlcyhOb2RlSW5kZXggbm9kZUlu
ZGV4KQoraW5saW5lIHZvaWQgQWJzdHJhY3RTdGF0ZTo6Y2xvYmJlclN0cnVjdHVyZXModW5zaWdu
ZWQgaW5kZXhJbkJsb2NrKQogewogICAgIFBST0ZJTEUoRkxBR19GT1JfU1RSVUNUVVJFX0NMT0JC
RVJJTkcpOwogICAgIGlmICghbV9oYXZlU3RydWN0dXJlcykKICAgICAgICAgcmV0dXJuOwotICAg
IGZvciAoc2l6ZV90IGkgPSBub2RlSW5kZXggLSBtX2Jsb2NrLT5iZWdpbiArIDE7IGktLSA+IDA7
KQotICAgICAgICBtX25vZGVzW2ldLmNsb2JiZXJTdHJ1Y3R1cmVzKCk7CisgICAgZm9yIChzaXpl
X3QgaSA9IGluZGV4SW5CbG9jayArIDE7IGktLSA+IG1fYmxvY2stPnN0YXJ0RXhjbHVkaW5nUGhp
czspCisgICAgICAgIGZvck5vZGUobV9ibG9jay0+YXQoaSkpLmNsb2JiZXJTdHJ1Y3R1cmVzKCk7
CiAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtX3ZhcmlhYmxlcy5udW1iZXJPZkFyZ3VtZW50
cygpOyArK2kpCiAgICAgICAgIG1fdmFyaWFibGVzLmFyZ3VtZW50KGkpLmNsb2JiZXJTdHJ1Y3R1
cmVzKCk7CiAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtX3ZhcmlhYmxlcy5udW1iZXJPZkxv
Y2FscygpOyArK2kpCkBAIC0xMTA4LDcgKzExMDQsNyBAQCBpbmxpbmUgYm9vbCBBYnN0cmFjdFN0
YXRlOjptZXJnZVRvU3VjY2VzCiB7CiAgICAgUFJPRklMRShGTEFHX0ZPUl9NRVJHRV9UT19TVUND
RVNTT1JTKTsKIAotICAgIE5vZGUmIHRlcm1pbmFsID0gZ3JhcGhbYmFzaWNCbG9jay0+ZW5kIC0g
MV07CisgICAgTm9kZSYgdGVybWluYWwgPSBncmFwaFtiYXNpY0Jsb2NrLT5sYXN0KCldOwogICAg
IAogICAgIEFTU0VSVCh0ZXJtaW5hbC5pc1Rlcm1pbmFsKCkpOwogICAgIApAQCAtMTE0NywxNSAr
MTE0MywxNyBAQCBpbmxpbmUgYm9vbCBBYnN0cmFjdFN0YXRlOjptZXJnZVZhcmlhYmxlCiB2b2lk
IEFic3RyYWN0U3RhdGU6OmR1bXAoRklMRSogb3V0KQogewogICAgIGJvb2wgZmlyc3QgPSB0cnVl
OwotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbV9ub2Rlcy5zaXplKCk7ICsraSkgewotICAg
ICAgICBpZiAobV9ub2Rlc1tpXS5pc0NsZWFyKCkpCisgICAgZm9yIChzaXplX3QgaSA9IG1fYmxv
Y2stPnN0YXJ0RXhjbHVkaW5nUGhpczsgaSA8IG1fYmxvY2stPnNpemUoKTsgKytpKSB7CisgICAg
ICAgIE5vZGVJbmRleCBpbmRleCA9IG1fYmxvY2stPmF0KGkpOworICAgICAgICBBYnN0cmFjdFZh
bHVlJiB2YWx1ZSA9IG1fbm9kZXNbaW5kZXhdOworICAgICAgICBpZiAodmFsdWUuaXNDbGVhcigp
KQogICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgIGlmIChmaXJzdCkKICAgICAgICAgICAg
IGZpcnN0ID0gZmFsc2U7CiAgICAgICAgIGVsc2UKICAgICAgICAgICAgIGZwcmludGYob3V0LCAi
ICIpOwotICAgICAgICBmcHJpbnRmKG91dCwgIkAlbHU6Iiwgc3RhdGljX2Nhc3Q8dW5zaWduZWQg
bG9uZz4oaSArIG1fYmxvY2stPmJlZ2luKSk7Ci0gICAgICAgIG1fbm9kZXNbaV0uZHVtcChvdXQp
OworICAgICAgICBmcHJpbnRmKG91dCwgIkAlbHU6Iiwgc3RhdGljX2Nhc3Q8dW5zaWduZWQgbG9u
Zz4oaW5kZXgpKTsKKyAgICAgICAgdmFsdWUuZHVtcChvdXQpOwogICAgIH0KIH0KICNlbmRpZgpJ
bmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL2RmZy9ERkdBYnN0cmFjdFN0YXRlLmgKPT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRDb3JlL2RmZy9ERkdBYnN0cmFjdFN0YXRlLmgJKHJl
dmlzaW9uIDEwOTI5NSkKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9kZmcvREZHQWJzdHJhY3RT
dGF0ZS5oCSh3b3JraW5nIGNvcHkpCkBAIC05OCw3ICs5OCw3IEBAIHB1YmxpYzoKICAgICAKICAg
ICBBYnN0cmFjdFZhbHVlJiBmb3JOb2RlKE5vZGVJbmRleCBub2RlSW5kZXgpCiAgICAgewotICAg
ICAgICByZXR1cm4gbV9ub2Rlc1tub2RlSW5kZXggLSBtX2Jsb2NrLT5iZWdpbl07CisgICAgICAg
IHJldHVybiBtX25vZGVzW25vZGVJbmRleF07CiAgICAgfQogICAgIAogICAgIEFic3RyYWN0VmFs
dWUmIGZvck5vZGUoTm9kZVVzZSBub2RlVXNlKQpAQCAtMTUyLDcgKzE1Miw3IEBAIHB1YmxpYzoK
ICAgICAvLyBpZiBleGVjdXRpb24gc2hvdWxkIGNvbnRpbnVlIHBhc3QgdGhpcyBub2RlLiBOb3Rh
Ymx5LCBpdCB3aWxsIHJldHVybiB0cnVlCiAgICAgLy8gZm9yIGJsb2NrIHRlcm1pbmFscywgc28g
bG9uZyBhcyB0aG9zZSB0ZXJtaW5hbHMgYXJlIG5vdCBSZXR1cm4gb3IgdmFyaWFudHMKICAgICAv
LyBvZiBUaHJvdy4KLSAgICBib29sIGV4ZWN1dGUoTm9kZUluZGV4KTsKKyAgICBib29sIGV4ZWN1
dGUodW5zaWduZWQpOwogICAgIAogICAgIC8vIElzIHRoZSBleGVjdXRpb24gc3RhdGUgc3RpbGwg
dmFsaWQ/IFRoaXMgd2lsbCBiZSBmYWxzZSBpZiBleGVjdXRlKCkgaGFzCiAgICAgLy8gcmV0dXJu
ZWQgZmFsc2UgcHJldmlvdXNseS4KQEAgLTE3Niw3ICsxNzYsNyBAQCBwdWJsaWM6CiAjZW5kaWYK
ICAgICAKIHByaXZhdGU6Ci0gICAgdm9pZCBjbG9iYmVyU3RydWN0dXJlcyhOb2RlSW5kZXgpOwor
ICAgIHZvaWQgY2xvYmJlclN0cnVjdHVyZXModW5zaWduZWQpOwogICAgIAogICAgIGJvb2wgbWVy
Z2VTdGF0ZUF0VGFpbChBYnN0cmFjdFZhbHVlJiBkZXN0aW5hdGlvbiwgQWJzdHJhY3RWYWx1ZSYg
aW5WYXJpYWJsZSwgTm9kZUluZGV4KTsKICAgICAKQEAgLTE4NSw3ICsxODUsNyBAQCBwcml2YXRl
OgogICAgIENvZGVCbG9jayogbV9jb2RlQmxvY2s7CiAgICAgR3JhcGgmIG1fZ3JhcGg7CiAgICAg
Ci0gICAgVmVjdG9yPEFic3RyYWN0VmFsdWUsIDMyPiBtX25vZGVzOworICAgIFZlY3RvcjxBYnN0
cmFjdFZhbHVlLCA2ND4gbV9ub2RlczsKICAgICBPcGVyYW5kczxBYnN0cmFjdFZhbHVlPiBtX3Zh
cmlhYmxlczsKICAgICBCYXNpY0Jsb2NrKiBtX2Jsb2NrOwogICAgIGJvb2wgbV9oYXZlU3RydWN0
dXJlczsKSW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9kZmcvREZHQXJpdGhOb2RlRmxhZ3NJ
bmZlcmVuY2VQaGFzZS5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRDb3JlL2Rm
Zy9ERkdBcml0aE5vZGVGbGFnc0luZmVyZW5jZVBoYXNlLmNwcAkocmV2aXNpb24gMTA5Mjk1KQor
KysgU291cmNlL0phdmFTY3JpcHRDb3JlL2RmZy9ERkdBcml0aE5vZGVGbGFnc0luZmVyZW5jZVBo
YXNlLmNwcAkod29ya2luZyBjb3B5KQpAQCAtMjIyLDYgKzIyMiw5IEBAIHByaXZhdGU6CiAgICAg
CiAgICAgTm9kZUluZGV4IG1fY29tcGlsZUluZGV4OwogICAgIGJvb2wgbV9jaGFuZ2VkOworI2lm
IERGR19FTkFCTEUoREVCVUdfUFJPUEFHQVRJT05fVkVSQk9TRSkKKyAgICB1bnNpZ25lZCBtX2Nv
dW50OworI2VuZGlmCiB9OwogCiB2b2lkIHBlcmZvcm1Bcml0aE5vZGVGbGFnc0luZmVyZW5jZShH
cmFwaCYgZ3JhcGgpCkluZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUvZGZnL0RGR0Jhc2ljQmxv
Y2suaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvZGZnL0RGR0Jhc2ljQmxv
Y2suaAkocmV2aXNpb24gMTA5Mjk1KQorKysgU291cmNlL0phdmFTY3JpcHRDb3JlL2RmZy9ERkdC
YXNpY0Jsb2NrLmgJKHdvcmtpbmcgY29weSkKQEAgLTM4LDExICszOCw5IEBAIG5hbWVzcGFjZSBK
U0MgeyBuYW1lc3BhY2UgREZHIHsKIAogdHlwZWRlZiBWZWN0b3IgPEJsb2NrSW5kZXgsIDI+IFBy
ZWRlY2Vzc29yTGlzdDsKIAotc3RydWN0IEJhc2ljQmxvY2sgewotICAgIEJhc2ljQmxvY2sodW5z
aWduZWQgYnl0ZWNvZGVCZWdpbiwgTm9kZUluZGV4IGJlZ2luLCB1bnNpZ25lZCBudW1Bcmd1bWVu
dHMsIHVuc2lnbmVkIG51bUxvY2FscykKK3N0cnVjdCBCYXNpY0Jsb2NrIDogVmVjdG9yPE5vZGVJ
bmRleCwgOD4geworICAgIEJhc2ljQmxvY2sodW5zaWduZWQgYnl0ZWNvZGVCZWdpbiwgdW5zaWdu
ZWQgbnVtQXJndW1lbnRzLCB1bnNpZ25lZCBudW1Mb2NhbHMpCiAgICAgICAgIDogYnl0ZWNvZGVC
ZWdpbihieXRlY29kZUJlZ2luKQotICAgICAgICAsIGJlZ2luKGJlZ2luKQotICAgICAgICAsIGVu
ZChOb05vZGUpCiAgICAgICAgICwgaXNPU1JUYXJnZXQoZmFsc2UpCiAgICAgICAgICwgY2ZhSGFz
VmlzaXRlZChmYWxzZSkKICAgICAgICAgLCBjZmFTaG91bGRSZXZpc2l0KGZhbHNlKQpAQCAtNTAs
NiArNDgsNyBAQCBzdHJ1Y3QgQmFzaWNCbG9jayB7CiAgICAgICAgICwgaXNMaW5rZWQoZmFsc2Up
CiAjZW5kaWYKICAgICAgICAgLCBpc1JlYWNoYWJsZShmYWxzZSkKKyAgICAgICAgLCBzdGFydEV4
Y2x1ZGluZ1BoaXMoMCkKICAgICAgICAgLCB2YXJpYWJsZXNBdEhlYWQobnVtQXJndW1lbnRzLCBu
dW1Mb2NhbHMpCiAgICAgICAgICwgdmFyaWFibGVzQXRUYWlsKG51bUFyZ3VtZW50cywgbnVtTG9j
YWxzKQogICAgICAgICAsIHZhbHVlc0F0SGVhZChudW1Bcmd1bWVudHMsIG51bUxvY2FscykKQEAg
LTY5LDggKzY4LDYgQEAgc3RydWN0IEJhc2ljQmxvY2sgewogICAgIC8vIGZvciBvdGhlciBwdXJw
b3NlcyBkdWUgdG8gaW5saW5pbmcuCiAgICAgdW5zaWduZWQgYnl0ZWNvZGVCZWdpbjsKICAgICAK
LSAgICBOb2RlSW5kZXggYmVnaW47Ci0gICAgTm9kZUluZGV4IGVuZDsKICAgICBib29sIGlzT1NS
VGFyZ2V0OwogICAgIGJvb2wgY2ZhSGFzVmlzaXRlZDsKICAgICBib29sIGNmYVNob3VsZFJldmlz
aXQ7CkBAIC03OCw2ICs3NSw3IEBAIHN0cnVjdCBCYXNpY0Jsb2NrIHsKICAgICBib29sIGlzTGlu
a2VkOwogI2VuZGlmCiAgICAgYm9vbCBpc1JlYWNoYWJsZTsKKyAgICB1bnNpZ25lZCBzdGFydEV4
Y2x1ZGluZ1BoaXM7CiAgICAgCiAgICAgUHJlZGVjZXNzb3JMaXN0IG1fcHJlZGVjZXNzb3JzOwog
ICAgIApJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL2RmZy9ERkdCeXRlQ29kZVBhcnNlci5j
cHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRDb3JlL2RmZy9ERkdCeXRlQ29kZVBh
cnNlci5jcHAJKHJldmlzaW9uIDEwOTI5NSkKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9kZmcv
REZHQnl0ZUNvZGVQYXJzZXIuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC01NjksNiArNTY5LDcgQEAg
cHJpdmF0ZToKICAgICB7CiAgICAgICAgIE5vZGVJbmRleCByZXN1bHRJbmRleCA9IChOb2RlSW5k
ZXgpbV9ncmFwaC5zaXplKCk7CiAgICAgICAgIG1fZ3JhcGguYXBwZW5kKE5vZGUob3AsIGN1cnJl
bnRDb2RlT3JpZ2luKCksIGNoaWxkMSwgY2hpbGQyLCBjaGlsZDMpKTsKKyAgICAgICAgbV9jdXJy
ZW50QmxvY2stPmFwcGVuZChyZXN1bHRJbmRleCk7CiAKICAgICAgICAgaWYgKG9wICYgTm9kZU11
c3RHZW5lcmF0ZSkKICAgICAgICAgICAgIG1fZ3JhcGgucmVmKHJlc3VsdEluZGV4KTsKQEAgLTU3
OCw2ICs1NzksNyBAQCBwcml2YXRlOgogICAgIHsKICAgICAgICAgTm9kZUluZGV4IHJlc3VsdElu
ZGV4ID0gKE5vZGVJbmRleCltX2dyYXBoLnNpemUoKTsKICAgICAgICAgbV9ncmFwaC5hcHBlbmQo
Tm9kZShvcCwgY3VycmVudENvZGVPcmlnaW4oKSwgaW5mbywgY2hpbGQxLCBjaGlsZDIsIGNoaWxk
MykpOworICAgICAgICBtX2N1cnJlbnRCbG9jay0+YXBwZW5kKHJlc3VsdEluZGV4KTsKIAogICAg
ICAgICBpZiAob3AgJiBOb2RlTXVzdEdlbmVyYXRlKQogICAgICAgICAgICAgbV9ncmFwaC5yZWYo
cmVzdWx0SW5kZXgpOwpAQCAtNTg3LDYgKzU4OSw3IEBAIHByaXZhdGU6CiAgICAgewogICAgICAg
ICBOb2RlSW5kZXggcmVzdWx0SW5kZXggPSAoTm9kZUluZGV4KW1fZ3JhcGguc2l6ZSgpOwogICAg
ICAgICBtX2dyYXBoLmFwcGVuZChOb2RlKG9wLCBjdXJyZW50Q29kZU9yaWdpbigpLCBpbmZvMSwg
aW5mbzIsIGNoaWxkMSwgY2hpbGQyLCBjaGlsZDMpKTsKKyAgICAgICAgbV9jdXJyZW50QmxvY2st
PmFwcGVuZChyZXN1bHRJbmRleCk7CiAKICAgICAgICAgaWYgKG9wICYgTm9kZU11c3RHZW5lcmF0
ZSkKICAgICAgICAgICAgIG1fZ3JhcGgucmVmKHJlc3VsdEluZGV4KTsKQEAgLTU5Nyw2ICs2MDAs
NyBAQCBwcml2YXRlOgogICAgIHsKICAgICAgICAgTm9kZUluZGV4IHJlc3VsdEluZGV4ID0gKE5v
ZGVJbmRleCltX2dyYXBoLnNpemUoKTsKICAgICAgICAgbV9ncmFwaC5hcHBlbmQoTm9kZShOb2Rl
OjpWYXJBcmcsIG9wLCBjdXJyZW50Q29kZU9yaWdpbigpLCBpbmZvMSwgaW5mbzIsIG1fZ3JhcGgu
bV92YXJBcmdDaGlsZHJlbi5zaXplKCkgLSBtX251bVBhc3NlZFZhckFyZ3MsIG1fbnVtUGFzc2Vk
VmFyQXJncykpOworICAgICAgICBtX2N1cnJlbnRCbG9jay0+YXBwZW5kKHJlc3VsdEluZGV4KTsK
ICAgICAgICAgCiAgICAgICAgIG1fbnVtUGFzc2VkVmFyQXJncyA9IDA7CiAgICAgICAgIApAQCAt
NjA0LDYgKzYwOCwxNyBAQCBwcml2YXRlOgogICAgICAgICAgICAgbV9ncmFwaC5yZWYocmVzdWx0
SW5kZXgpOwogICAgICAgICByZXR1cm4gcmVzdWx0SW5kZXg7CiAgICAgfQorCisgICAgTm9kZUlu
ZGV4IGluc2VydFBoaU5vZGUoT3BJbmZvIGluZm8sIEJhc2ljQmxvY2sqIGJsb2NrKQorICAgIHsK
KyAgICAgICAgTm9kZUluZGV4IHJlc3VsdEluZGV4ID0gKE5vZGVJbmRleCltX2dyYXBoLnNpemUo
KTsKKyAgICAgICAgbV9ncmFwaC5hcHBlbmQoTm9kZShQaGksIGN1cnJlbnRDb2RlT3JpZ2luKCks
IGluZm8pKTsKKyAgICAgICAgYmxvY2stPnByZXBlbmQocmVzdWx0SW5kZXgpOworICAgICAgICAr
K2Jsb2NrLT5zdGFydEV4Y2x1ZGluZ1BoaXM7CisKKyAgICAgICAgcmV0dXJuIHJlc3VsdEluZGV4
OworICAgIH0KKwogICAgIHZvaWQgYWRkVmFyQXJnQ2hpbGQoTm9kZUluZGV4IGNoaWxkKQogICAg
IHsKICAgICAgICAgbV9ncmFwaC5tX3ZhckFyZ0NoaWxkcmVuLmFwcGVuZChOb2RlVXNlKGNoaWxk
KSk7CkBAIC0xMTY5LDcgKzExODQsNyBAQCBib29sIEJ5dGVDb2RlUGFyc2VyOjpoYW5kbGVJbmxp
bmluZyhib29sCiAgICAgLy8gdGhlIGNhbGxlciB0byBjb250aW51ZSBpbiB3aGF0ZXZlciBiYXNp
YyBibG9jayB3ZSdyZSBpbiByaWdodCBub3cuCiAgICAgaWYgKCFpbmxpbmVTdGFja0VudHJ5Lm1f
ZGlkRWFybHlSZXR1cm4gJiYgaW5saW5lU3RhY2tFbnRyeS5tX2RpZFJldHVybikgewogICAgICAg
ICBCYXNpY0Jsb2NrKiBsYXN0QmxvY2sgPSBtX2dyYXBoLm1fYmxvY2tzLmxhc3QoKS5nZXQoKTsK
LSAgICAgICAgQVNTRVJUKGxhc3RCbG9jay0+YmVnaW4gPT0gbGFzdEJsb2NrLT5lbmQgfHwgIW1f
Z3JhcGgubGFzdCgpLmlzVGVybWluYWwoKSk7CisgICAgICAgIEFTU0VSVChsYXN0QmxvY2stPmlz
RW1wdHkoKSB8fCAhbV9ncmFwaC5sYXN0KCkuaXNUZXJtaW5hbCgpKTsKICAgICAgICAgCiAgICAg
ICAgIC8vIElmIHdlIGNyZWF0ZWQgbmV3IGJsb2NrcyB0aGVuIHRoZSBsYXN0IGJsb2NrIG5lZWRz
IGxpbmtpbmcsIGJ1dCBpbiB0aGUKICAgICAgICAgLy8gY2FsbGVyLiBJdCBkb2Vzbid0IG5lZWQg
dG8gYmUgbGlua2VkIHRvLCBidXQgaXQgbmVlZHMgb3V0Z29pbmcgbGlua3MuCkBAIC0xMjAxLDcg
KzEyMTYsNyBAQCBib29sIEJ5dGVDb2RlUGFyc2VyOjpoYW5kbGVJbmxpbmluZyhib29sCiAgICAg
ICAgICAgICBjb250aW51ZTsKICAgICAgICAgQmFzaWNCbG9jayogYmxvY2sgPSBtX2dyYXBoLm1f
YmxvY2tzW2lubGluZVN0YWNrRW50cnkubV91bmxpbmtlZEJsb2Nrc1tpXS5tX2Jsb2NrSW5kZXhd
LmdldCgpOwogICAgICAgICBBU1NFUlQoIWJsb2NrLT5pc0xpbmtlZCk7Ci0gICAgICAgIE5vZGUm
IG5vZGUgPSBtX2dyYXBoW2Jsb2NrLT5lbmQgLSAxXTsKKyAgICAgICAgTm9kZSYgbm9kZSA9IG1f
Z3JhcGhbYmxvY2stPmxhc3QoKV07CiAgICAgICAgIEFTU0VSVChub2RlLm9wID09IEp1bXApOwog
ICAgICAgICBBU1NFUlQobm9kZS50YWtlbkJsb2NrSW5kZXgoKSA9PSBOb0Jsb2NrKTsKICAgICAg
ICAgbm9kZS5zZXRUYWtlbkJsb2NrSW5kZXgobV9ncmFwaC5tX2Jsb2Nrcy5zaXplKCkpOwpAQCAt
MTIxMiw3ICsxMjI3LDcgQEAgYm9vbCBCeXRlQ29kZVBhcnNlcjo6aGFuZGxlSW5saW5pbmcoYm9v
bAogICAgIH0KICAgICAKICAgICAvLyBOZWVkIHRvIGNyZWF0ZSBhIG5ldyBiYXNpYyBibG9jayBm
b3IgdGhlIGNvbnRpbnVhdGlvbiBhdCB0aGUgY2FsbGVyLgotICAgIE93blB0cjxCYXNpY0Jsb2Nr
PiBibG9jayA9IGFkb3B0UHRyKG5ldyBCYXNpY0Jsb2NrKG5leHRPZmZzZXQsIG1fZ3JhcGguc2l6
ZSgpLCBtX251bUFyZ3VtZW50cywgbV9udW1Mb2NhbHMpKTsKKyAgICBPd25QdHI8QmFzaWNCbG9j
az4gYmxvY2sgPSBhZG9wdFB0cihuZXcgQmFzaWNCbG9jayhuZXh0T2Zmc2V0LCBtX251bUFyZ3Vt
ZW50cywgbV9udW1Mb2NhbHMpKTsKICNpZiBERkdfRU5BQkxFKERFQlVHX1ZFUkJPU0UpCiAgICAg
ZGF0YUxvZygiQ3JlYXRpbmcgaW5saW5lIGVwaWxvZ3VlIGJhc2ljIGJsb2NrICVwLCAjJXp1IGZv
ciAlcCBiYyMldSBhdCBpbmxpbmUgZGVwdGggJXUuXG4iLCBibG9jay5nZXQoKSwgbV9ncmFwaC5t
X2Jsb2Nrcy5zaXplKCksIG1faW5saW5lU3RhY2tUb3AtPmV4ZWN1dGFibGUoKSwgbV9jdXJyZW50
SW5kZXgsIENvZGVPcmlnaW46OmlubGluZURlcHRoRm9yQ2FsbEZyYW1lKG1faW5saW5lU3RhY2tU
b3AtPm1faW5saW5lQ2FsbEZyYW1lKSk7CiAjZW5kaWYKQEAgLTE0MDQsNyArMTQxOSw3IEBAIGJv
b2wgQnl0ZUNvZGVQYXJzZXI6OnBhcnNlQmxvY2sodW5zaWduZWQKICAgICAgICAgICAgIC8vIGxv
Z2ljIHJlbGllcyBvbiBldmVyeSBieXRlY29kZSByZXN1bHRpbmcgaW4gb25lIG9yIG1vcmUgbm9k
ZXMsIHdoaWNoIHdvdWxkCiAgICAgICAgICAgICAvLyBiZSB0cnVlIGFueXdheSBleGNlcHQgZm9y
IG9wX2xvb3BfaGludCwgd2hpY2ggZW1pdHMgYSBQaGFudG9tIHRvIGZvcmNlIHRoaXMKICAgICAg
ICAgICAgIC8vIHRvIGJlIHRydWUuCi0gICAgICAgICAgICBpZiAobV9jdXJyZW50QmxvY2stPmJl
Z2luICE9IG1fZ3JhcGguc2l6ZSgpKQorICAgICAgICAgICAgaWYgKCFtX2N1cnJlbnRCbG9jay0+
aXNFbXB0eSgpKQogICAgICAgICAgICAgICAgIGFkZFRvR3JhcGgoSnVtcCwgT3BJbmZvKG1fY3Vy
cmVudEluZGV4KSk7CiAgICAgICAgICAgICBlbHNlIHsKICNpZiBERkdfRU5BQkxFKERFQlVHX1ZF
UkJPU0UpCkBAIC0yMzEzLDcgKzIzMjgsNyBAQCB2b2lkIEJ5dGVDb2RlUGFyc2VyOjpwcm9jZXNz
UGhpU3RhY2soKQogICAgICAgICAgICAgICAgIGRhdGFMb2coIiAgICAgIERpZCBub3QgZmluZCBu
b2RlLCBhZGRpbmcgcGhpLlxuIik7CiAjZW5kaWYKIAotICAgICAgICAgICAgICAgIHZhbHVlSW5Q
cmVkZWNlc3NvciA9IGFkZFRvR3JhcGgoUGhpLCBPcEluZm8obmV3VmFyaWFibGVBY2Nlc3NEYXRh
KHN0YWNrVHlwZSA9PSBBcmd1bWVudFBoaVN0YWNrID8gYXJndW1lbnRUb09wZXJhbmQodmFyTm8p
IDogc3RhdGljX2Nhc3Q8aW50Pih2YXJObykpKSk7CisgICAgICAgICAgICAgICAgdmFsdWVJblBy
ZWRlY2Vzc29yID0gaW5zZXJ0UGhpTm9kZShPcEluZm8obmV3VmFyaWFibGVBY2Nlc3NEYXRhKHN0
YWNrVHlwZSA9PSBBcmd1bWVudFBoaVN0YWNrID8gYXJndW1lbnRUb09wZXJhbmQodmFyTm8pIDog
c3RhdGljX2Nhc3Q8aW50Pih2YXJObykpKSwgcHJlZGVjZXNzb3JCbG9jayk7CiAgICAgICAgICAg
ICAgICAgdmFyID0gdmFsdWVJblByZWRlY2Vzc29yOwogICAgICAgICAgICAgICAgIGlmIChzdGFj
a1R5cGUgPT0gQXJndW1lbnRQaGlTdGFjaykKICAgICAgICAgICAgICAgICAgICAgcHJlZGVjZXNz
b3JCbG9jay0+dmFyaWFibGVzQXRIZWFkLnNldEFyZ3VtZW50Rmlyc3RUaW1lKHZhck5vLCB2YWx1
ZUluUHJlZGVjZXNzb3IpOwpAQCAtMjM5NSw3ICsyNDEwLDcgQEAgdm9pZCBCeXRlQ29kZVBhcnNl
cjo6cHJvY2Vzc1BoaVN0YWNrKCkKICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAg
ICAgIH0KICAgICAgICAgICAgIAotICAgICAgICAgICAgTm9kZUluZGV4IG5ld1BoaSA9IGFkZFRv
R3JhcGgoUGhpLCBPcEluZm8oZGF0YUZvclBoaSkpOworICAgICAgICAgICAgTm9kZUluZGV4IG5l
d1BoaSA9IGluc2VydFBoaU5vZGUoT3BJbmZvKGRhdGFGb3JQaGkpLCBlbnRyeS5tX2Jsb2NrKTsK
ICAgICAgICAgICAgIAogI2lmIERGR19FTkFCTEUoREVCVUdfUFJPUEFHQVRJT05fVkVSQk9TRSkK
ICAgICAgICAgICAgIGRhdGFMb2coIiAgICAgIFNwbGl0dGluZyBAJXUsIGNyZWF0ZWQgQCV1Llxu
IiwgZW50cnkubV9waGksIG5ld1BoaSk7CkBAIC0yNDM1LDEwICsyNDUwLDkgQEAgdm9pZCBCeXRl
Q29kZVBhcnNlcjo6Zml4VmFyaWFibGVBY2Nlc3NQcgogCiB2b2lkIEJ5dGVDb2RlUGFyc2VyOjps
aW5rQmxvY2soQmFzaWNCbG9jayogYmxvY2ssIFZlY3RvcjxCbG9ja0luZGV4PiYgcG9zc2libGVU
YXJnZXRzKQogewotICAgIEFTU0VSVChibG9jay0+ZW5kICE9IE5vTm9kZSk7CiAgICAgQVNTRVJU
KCFibG9jay0+aXNMaW5rZWQpOwotICAgIEFTU0VSVChibG9jay0+ZW5kID4gYmxvY2stPmJlZ2lu
KTsKLSAgICBOb2RlJiBub2RlID0gbV9ncmFwaFtibG9jay0+ZW5kIC0gMV07CisgICAgQVNTRVJU
KCFibG9jay0+aXNFbXB0eSgpKTsKKyAgICBOb2RlJiBub2RlID0gbV9ncmFwaFtibG9jay0+bGFz
dCgpXTsKICAgICBBU1NFUlQobm9kZS5pc1Rlcm1pbmFsKCkpOwogICAgIAogICAgIHN3aXRjaCAo
bm9kZS5vcCkgewpAQCAtMjUwMiw3ICsyNTE2LDcgQEAgdm9pZCBCeXRlQ29kZVBhcnNlcjo6ZGV0
ZXJtaW5lUmVhY2hhYmlsaQogICAgICAgICBCYXNpY0Jsb2NrKiBibG9jayA9IG1fZ3JhcGgubV9i
bG9ja3NbaW5kZXhdLmdldCgpOwogICAgICAgICBBU1NFUlQoYmxvY2stPmlzTGlua2VkKTsKICAg
ICAgICAgCi0gICAgICAgIE5vZGUmIG5vZGUgPSBtX2dyYXBoW2Jsb2NrLT5lbmQgLSAxXTsKKyAg
ICAgICAgTm9kZSYgbm9kZSA9IG1fZ3JhcGhbYmxvY2stPmxhc3QoKV07CiAgICAgICAgIEFTU0VS
VChub2RlLmlzVGVybWluYWwoKSk7CiAgICAgICAgIAogICAgICAgICBpZiAobm9kZS5pc0p1bXAo
KSkKQEAgLTI2NDksNyArMjY2Myw3IEBAIHZvaWQgQnl0ZUNvZGVQYXJzZXI6OnBhcnNlQ29kZUJs
b2NrKCkKICAgICAgICAgZG8gewogICAgICAgICAgICAgaWYgKCFtX2N1cnJlbnRCbG9jaykgewog
ICAgICAgICAgICAgICAgIC8vIENoZWNrIGlmIHdlIGNhbiB1c2UgdGhlIGxhc3QgYmxvY2suCi0g
ICAgICAgICAgICAgICAgaWYgKCFtX2dyYXBoLm1fYmxvY2tzLmlzRW1wdHkoKSAmJiBtX2dyYXBo
Lm1fYmxvY2tzLmxhc3QoKS0+YmVnaW4gPT0gbV9ncmFwaC5tX2Jsb2Nrcy5sYXN0KCktPmVuZCkg
eworICAgICAgICAgICAgICAgIGlmICghbV9ncmFwaC5tX2Jsb2Nrcy5pc0VtcHR5KCkgJiYgbV9n
cmFwaC5tX2Jsb2Nrcy5sYXN0KCktPmlzRW1wdHkoKSkgewogICAgICAgICAgICAgICAgICAgICAv
LyBUaGlzIG11c3QgYmUgYSBibG9jayBiZWxvbmdpbmcgdG8gdXMuCiAgICAgICAgICAgICAgICAg
ICAgIEFTU0VSVChtX2lubGluZVN0YWNrVG9wLT5tX3VubGlua2VkQmxvY2tzLmxhc3QoKS5tX2Js
b2NrSW5kZXggPT0gbV9ncmFwaC5tX2Jsb2Nrcy5zaXplKCkgLSAxKTsKICAgICAgICAgICAgICAg
ICAgICAgLy8gRWl0aGVyIHRoZSBibG9jayBpcyBsaW5rYWJsZSBvciBpdCBpc24ndC4gSWYgaXQn
cyBsaW5rYWJsZSB0aGVuIGl0J3MgdGhlIGxhc3QKQEAgLTI2NjcsNyArMjY4MSw3IEBAIHZvaWQg
Qnl0ZUNvZGVQYXJzZXI6OnBhcnNlQ29kZUJsb2NrKCkKICNlbmRpZgogICAgICAgICAgICAgICAg
ICAgICBtX2N1cnJlbnRCbG9jay0+Ynl0ZWNvZGVCZWdpbiA9IG1fY3VycmVudEluZGV4OwogICAg
ICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIE93blB0cjxCYXNpY0Js
b2NrPiBibG9jayA9IGFkb3B0UHRyKG5ldyBCYXNpY0Jsb2NrKG1fY3VycmVudEluZGV4LCBtX2dy
YXBoLnNpemUoKSwgbV9udW1Bcmd1bWVudHMsIG1fbnVtTG9jYWxzKSk7CisgICAgICAgICAgICAg
ICAgICAgIE93blB0cjxCYXNpY0Jsb2NrPiBibG9jayA9IGFkb3B0UHRyKG5ldyBCYXNpY0Jsb2Nr
KG1fY3VycmVudEluZGV4LCBtX251bUFyZ3VtZW50cywgbV9udW1Mb2NhbHMpKTsKICNpZiBERkdf
RU5BQkxFKERFQlVHX1ZFUkJPU0UpCiAgICAgICAgICAgICAgICAgICAgIGRhdGFMb2coIkNyZWF0
aW5nIGJhc2ljIGJsb2NrICVwLCAjJXp1IGZvciAlcCBiYyMldSBhdCBpbmxpbmUgZGVwdGggJXUu
XG4iLCBibG9jay5nZXQoKSwgbV9ncmFwaC5tX2Jsb2Nrcy5zaXplKCksIG1faW5saW5lU3RhY2tU
b3AtPmV4ZWN1dGFibGUoKSwgbV9jdXJyZW50SW5kZXgsIENvZGVPcmlnaW46OmlubGluZURlcHRo
Rm9yQ2FsbEZyYW1lKG1faW5saW5lU3RhY2tUb3AtPm1faW5saW5lQ2FsbEZyYW1lKSk7CiAjZW5k
aWYKQEAgLTI2OTAsMTAgKzI3MDQsOCBAQCB2b2lkIEJ5dGVDb2RlUGFyc2VyOjpwYXJzZUNvZGVC
bG9jaygpCiAgICAgICAgICAgICAvLyBhcmUgYXQgdGhlIGVuZCBvZiBhbiBpbmxpbmUgZnVuY3Rp
b24sIG9yIHdlIHJlYWxpemVkIHRoYXQgd2UKICAgICAgICAgICAgIC8vIHNob3VsZCBzdG9wIHBh
cnNpbmcgYmVjYXVzZSB0aGVyZSB3YXMgYSByZXR1cm4gaW4gdGhlIGZpcnN0CiAgICAgICAgICAg
ICAvLyBiYXNpYyBibG9jay4KLSAgICAgICAgICAgIEFTU0VSVChtX2N1cnJlbnRCbG9jay0+YmVn
aW4gPT0gbV9ncmFwaC5zaXplKCkgfHwgbV9ncmFwaC5sYXN0KCkuaXNUZXJtaW5hbCgpIHx8ICht
X2N1cnJlbnRJbmRleCA9PSBjb2RlQmxvY2stPmluc3RydWN0aW9ucygpLnNpemUoKSAmJiBtX2lu
bGluZVN0YWNrVG9wLT5tX2lubGluZUNhbGxGcmFtZSkgfHwgIXNob3VsZENvbnRpbnVlUGFyc2lu
Zyk7CisgICAgICAgICAgICBBU1NFUlQobV9jdXJyZW50QmxvY2stPmlzRW1wdHkoKSB8fCBtX2dy
YXBoLmxhc3QoKS5pc1Rlcm1pbmFsKCkgfHwgKG1fY3VycmVudEluZGV4ID09IGNvZGVCbG9jay0+
aW5zdHJ1Y3Rpb25zKCkuc2l6ZSgpICYmIG1faW5saW5lU3RhY2tUb3AtPm1faW5saW5lQ2FsbEZy
YW1lKSB8fCAhc2hvdWxkQ29udGludWVQYXJzaW5nKTsKIAotICAgICAgICAgICAgbV9jdXJyZW50
QmxvY2stPmVuZCA9IG1fZ3JhcGguc2l6ZSgpOwotICAgICAgICAgICAgCiAgICAgICAgICAgICBp
ZiAoIXNob3VsZENvbnRpbnVlUGFyc2luZykKICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAg
ICAgICAgICAKSW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9kZmcvREZHQ0ZBUGhhc2UuY3Bw
Cj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9kZmcvREZHQ0ZBUGhhc2UuY3Bw
CShyZXZpc2lvbiAxMDkyOTUpCisrKyBTb3VyY2UvSmF2YVNjcmlwdENvcmUvZGZnL0RGR0NGQVBo
YXNlLmNwcAkod29ya2luZyBjb3B5KQpAQCAtODIsNyArODIsOCBAQCBwcml2YXRlOgogICAgICAg
ICBkdW1wT3BlcmFuZHMoYmxvY2stPnZhbHVlc0F0SGVhZCwgV1RGOjpkYXRhRmlsZSgpKTsKICAg
ICAgICAgZGF0YUxvZygiXG4iKTsKICNlbmRpZgotICAgICAgICBmb3IgKE5vZGVJbmRleCBub2Rl
SW5kZXggPSBibG9jay0+YmVnaW47IG5vZGVJbmRleCA8IGJsb2NrLT5lbmQ7ICsrbm9kZUluZGV4
KSB7CisgICAgICAgIGZvciAodW5zaWduZWQgaSA9IGJsb2NrLT5zdGFydEV4Y2x1ZGluZ1BoaXM7
IGkgPCBibG9jay0+c2l6ZSgpOyArK2kpIHsKKyAgICAgICAgICAgIE5vZGVJbmRleCBub2RlSW5k
ZXggPSBibG9jay0+YXQoaSk7CiAgICAgICAgICAgICBpZiAoIW1fZ3JhcGhbbm9kZUluZGV4XS5z
aG91bGRHZW5lcmF0ZSgpKQogICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogI2lmIERGR19FTkFC
TEUoREVCVUdfUFJPUEFHQVRJT05fVkVSQk9TRSkKQEAgLTkwLDcgKzkxLDcgQEAgcHJpdmF0ZToK
ICAgICAgICAgICAgIG1fc3RhdGUuZHVtcChXVEY6OmRhdGFGaWxlKCkpOwogICAgICAgICAgICAg
ZGF0YUxvZygiXG4iKTsKICNlbmRpZgotICAgICAgICAgICAgaWYgKCFtX3N0YXRlLmV4ZWN1dGUo
bm9kZUluZGV4KSkKKyAgICAgICAgICAgIGlmICghbV9zdGF0ZS5leGVjdXRlKGkpKQogICAgICAg
ICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAjaWYgREZHX0VOQUJMRShERUJVR19QUk9QQUdB
VElPTl9WRVJCT1NFKQpAQCAtMTIwLDYgKzEyMSw5IEBAIHByaXZhdGU6CiAgICAgQWJzdHJhY3RT
dGF0ZSBtX3N0YXRlOwogICAgIAogICAgIGJvb2wgbV9jaGFuZ2VkOworI2lmIERGR19FTkFCTEUo
REVCVUdfUFJPUEFHQVRJT05fVkVSQk9TRSkKKyAgICB1bnNpZ25lZCBtX2NvdW50OworI2VuZGlm
CiB9OwogCiB2b2lkIHBlcmZvcm1DRkEoR3JhcGgmIGdyYXBoKQpJbmRleDogU291cmNlL0phdmFT
Y3JpcHRDb3JlL2RmZy9ERkdDU0VQaGFzZS5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL0phdmFT
Y3JpcHRDb3JlL2RmZy9ERkdDU0VQaGFzZS5jcHAJKHJldmlzaW9uIDEwOTI5NSkKKysrIFNvdXJj
ZS9KYXZhU2NyaXB0Q29yZS9kZmcvREZHQ1NFUGhhc2UuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC00
Myw5ICs0Myw2IEBAIHB1YmxpYzoKICAgICAgICAgCiAgICAgICAgIGZvciAodW5zaWduZWQgaSA9
IDA7IGkgPCBtX2dyYXBoLnNpemUoKTsgKytpKQogICAgICAgICAgICAgbV9yZXBsYWNlbWVudHNb
aV0gPSBOb05vZGU7Ci0gICAgICAgIAotICAgICAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwg
TGFzdE5vZGVJZDsgKytpKQotICAgICAgICAgICAgbV9sYXN0U2VlbltpXSA9IE5vTm9kZTsKICAg
ICB9CiAgICAgCiAgICAgdm9pZCBydW4oKQpAQCAtNzEsNjggKzY4LDE0IEBAIHByaXZhdGU6CiAg
ICAgICAgIHJldHVybiBjYW5vbmljYWxpemUobm9kZVVzZS5pbmRleFVuY2hlY2tlZCgpKTsKICAg
ICB9CiAgICAgCi0gICAgLy8gQ29tcHV0ZXMgd2hlcmUgdGhlIHNlYXJjaCBmb3IgYSBjYW5kaWRh
dGUgZm9yIENTRSBzaG91bGQgc3RhcnQuIERvbid0IGNhbGwKLSAgICAvLyB0aGlzIGRpcmVjdGx5
OyBjYWxsIHN0YXJ0SW5kZXgoKSBpbnN0ZWFkIGFzIGl0IGRvZXMgbG9nZ2luZyBpbiBkZWJ1ZyBt
b2RlLgotICAgIE5vZGVJbmRleCBjb21wdXRlU3RhcnRJbmRleEZvckNoaWxkcmVuKE5vZGVJbmRl
eCBjaGlsZDEgPSBOb05vZGUsIE5vZGVJbmRleCBjaGlsZDIgPSBOb05vZGUsIE5vZGVJbmRleCBj
aGlsZDMgPSBOb05vZGUpCi0gICAgewotICAgICAgICBjb25zdCB1bnNpZ25lZCBsaW1pdCA9IDMw
MDsKLSAgICAgICAgCi0gICAgICAgIE5vZGVJbmRleCBzdGFydCA9IG1fc3RhcnQ7Ci0gICAgICAg
IGlmIChtX2NvbXBpbGVJbmRleCAtIHN0YXJ0ID4gbGltaXQpCi0gICAgICAgICAgICBzdGFydCA9
IG1fY29tcGlsZUluZGV4IC0gbGltaXQ7Ci0gICAgICAgIAotICAgICAgICBBU1NFUlQoc3RhcnQg
Pj0gbV9zdGFydCk7Ci0gICAgICAgIAotICAgICAgICBOb2RlSW5kZXggY2hpbGQgPSBjYW5vbmlj
YWxpemUoY2hpbGQxKTsKLSAgICAgICAgaWYgKGNoaWxkID09IE5vTm9kZSkKLSAgICAgICAgICAg
IHJldHVybiBzdGFydDsKLSAgICAgICAgCi0gICAgICAgIGlmIChzdGFydCA8IGNoaWxkKQotICAg
ICAgICAgICAgc3RhcnQgPSBjaGlsZDsKLSAgICAgICAgCi0gICAgICAgIGNoaWxkID0gY2Fub25p
Y2FsaXplKGNoaWxkMik7Ci0gICAgICAgIGlmIChjaGlsZCA9PSBOb05vZGUpCi0gICAgICAgICAg
ICByZXR1cm4gc3RhcnQ7Ci0gICAgICAgIAotICAgICAgICBpZiAoc3RhcnQgPCBjaGlsZCkKLSAg
ICAgICAgICAgIHN0YXJ0ID0gY2hpbGQ7Ci0gICAgICAgIAotICAgICAgICBjaGlsZCA9IGNhbm9u
aWNhbGl6ZShjaGlsZDMpOwotICAgICAgICBpZiAoY2hpbGQgPT0gTm9Ob2RlKQotICAgICAgICAg
ICAgcmV0dXJuIHN0YXJ0OwotICAgICAgICAKLSAgICAgICAgaWYgKHN0YXJ0IDwgY2hpbGQpCi0g
ICAgICAgICAgICBzdGFydCA9IGNoaWxkOwotICAgICAgICAKLSAgICAgICAgcmV0dXJuIHN0YXJ0
OwotICAgIH0KLSAgICAKLSAgICBOb2RlSW5kZXggc3RhcnRJbmRleEZvckNoaWxkcmVuKE5vZGVJ
bmRleCBjaGlsZDEgPSBOb05vZGUsIE5vZGVJbmRleCBjaGlsZDIgPSBOb05vZGUsIE5vZGVJbmRl
eCBjaGlsZDMgPSBOb05vZGUpCisgICAgdW5zaWduZWQgZW5kSW5kZXhGb3JQdXJlQ1NFKCkKICAg
ICB7Ci0gICAgICAgIE5vZGVJbmRleCByZXN1bHQgPSBjb21wdXRlU3RhcnRJbmRleEZvckNoaWxk
cmVuKGNoaWxkMSwgY2hpbGQyLCBjaGlsZDMpOwotI2lmIERGR19FTkFCTEUoREVCVUdfUFJPUEFH
QVRJT05fVkVSQk9TRSkKLSAgICAgICAgZGF0YUxvZygiICBsb29rYmFjayAldTogIiwgcmVzdWx0
KTsKLSNlbmRpZgotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLSAgICAKLSAgICBOb2Rl
SW5kZXggc3RhcnRJbmRleCgpCi0gICAgewotICAgICAgICBOb2RlJiBub2RlID0gbV9ncmFwaFtt
X2NvbXBpbGVJbmRleF07Ci0gICAgICAgIHJldHVybiBzdGFydEluZGV4Rm9yQ2hpbGRyZW4oCi0g
ICAgICAgICAgICBub2RlLmNoaWxkMSgpLmluZGV4VW5jaGVja2VkKCksCi0gICAgICAgICAgICBu
b2RlLmNoaWxkMigpLmluZGV4VW5jaGVja2VkKCksCi0gICAgICAgICAgICBub2RlLmNoaWxkMygp
LmluZGV4VW5jaGVja2VkKCkpOwotICAgIH0KLSAgICAKLSAgICBOb2RlSW5kZXggZW5kSW5kZXhG
b3JQdXJlQ1NFKCkKLSAgICB7Ci0gICAgICAgIE5vZGVJbmRleCByZXN1bHQgPSBtX2xhc3RTZWVu
W21fZ3JhcGhbbV9jb21waWxlSW5kZXhdLm9wICYgTm9kZUlkTWFza107Ci0gICAgICAgIGlmIChy
ZXN1bHQgPT0gTm9Ob2RlKQorICAgICAgICB1bnNpZ25lZCByZXN1bHQgPSBtX2xhc3RTZWVuW21f
Z3JhcGhbbV9jb21waWxlSW5kZXhdLm9wICYgTm9kZUlkTWFza107CisgICAgICAgIGlmIChyZXN1
bHQgPT0gVUlOVF9NQVgpCiAgICAgICAgICAgICByZXN1bHQgPSAwOwogICAgICAgICBlbHNlCiAg
ICAgICAgICAgICByZXN1bHQrKzsKLSAgICAgICAgQVNTRVJUKHJlc3VsdCA8PSBtX2NvbXBpbGVJ
bmRleCk7CisgICAgICAgIEFTU0VSVChyZXN1bHQgPD0gbV9pbmRleEluQmxvY2spOwogI2lmIERG
R19FTkFCTEUoREVCVUdfUFJPUEFHQVRJT05fVkVSQk9TRSkKICAgICAgICAgZGF0YUxvZygiICBs
aW1pdCAldTogIiwgcmVzdWx0KTsKICNlbmRpZgpAQCAtMTQ1LDggKzg4LDggQEAgcHJpdmF0ZToK
ICAgICAgICAgTm9kZUluZGV4IGNoaWxkMiA9IGNhbm9uaWNhbGl6ZShub2RlLmNoaWxkMigpKTsK
ICAgICAgICAgTm9kZUluZGV4IGNoaWxkMyA9IGNhbm9uaWNhbGl6ZShub2RlLmNoaWxkMygpKTsK
ICAgICAgICAgCi0gICAgICAgIE5vZGVJbmRleCBzdGFydCA9IHN0YXJ0SW5kZXgoKTsKLSAgICAg
ICAgZm9yIChOb2RlSW5kZXggaW5kZXggPSBlbmRJbmRleEZvclB1cmVDU0UoKTsgaW5kZXgtLSA+
IHN0YXJ0OykgeworICAgICAgICBmb3IgKHVuc2lnbmVkIGkgPSBlbmRJbmRleEZvclB1cmVDU0Uo
KTsgaS0tID4gbV9jdXJyZW50QmxvY2stPnN0YXJ0RXhjbHVkaW5nUGhpczspIHsKKyAgICAgICAg
ICAgIE5vZGVJbmRleCBpbmRleCA9IG1fY3VycmVudEJsb2NrLT5hdChpKTsKICAgICAgICAgICAg
IE5vZGUmIG90aGVyTm9kZSA9IG1fZ3JhcGhbaW5kZXhdOwogICAgICAgICAgICAgaWYgKG5vZGUu
b3AgIT0gb3RoZXJOb2RlLm9wKQogICAgICAgICAgICAgICAgIGNvbnRpbnVlOwpAQCAtMjI5LDgg
KzE3Miw4IEBAIHByaXZhdGU6CiAgICAgICAgIE5vZGVJbmRleCBjaGlsZDIgPSBjYW5vbmljYWxp
emUobm9kZS5jaGlsZDIoKSk7CiAgICAgICAgIE5vZGVJbmRleCBjaGlsZDMgPSBjYW5vbmljYWxp
emUobm9kZS5jaGlsZDMoKSk7CiAgICAgICAgIAotICAgICAgICBOb2RlSW5kZXggc3RhcnQgPSBz
dGFydEluZGV4KCk7Ci0gICAgICAgIGZvciAoTm9kZUluZGV4IGluZGV4ID0gbV9jb21waWxlSW5k
ZXg7IGluZGV4LS0gPiBzdGFydDspIHsKKyAgICAgICAgZm9yICh1bnNpZ25lZCBpID0gbV9pbmRl
eEluQmxvY2s7IGktLSA+IG1fY3VycmVudEJsb2NrLT5zdGFydEV4Y2x1ZGluZ1BoaXM7KSB7Cisg
ICAgICAgICAgICBOb2RlSW5kZXggaW5kZXggPSBtX2N1cnJlbnRCbG9jay0+YXQoaSk7CiAgICAg
ICAgICAgICBOb2RlJiBvdGhlck5vZGUgPSBtX2dyYXBoW2luZGV4XTsKICAgICAgICAgICAgIGlm
IChub2RlLm9wID09IG90aGVyTm9kZS5vcAogICAgICAgICAgICAgICAgICYmIG5vZGUuYXJpdGhO
b2RlRmxhZ3NGb3JDb21wYXJlKCkgPT0gb3RoZXJOb2RlLmFyaXRoTm9kZUZsYWdzRm9yQ29tcGFy
ZSgpKSB7CkBAIC0yNTgsOCArMjAxLDggQEAgcHJpdmF0ZToKICAgICAKICAgICBOb2RlSW5kZXgg
Z2xvYmFsVmFyTG9hZEVsaW1pbmF0aW9uKHVuc2lnbmVkIHZhck51bWJlciwgSlNHbG9iYWxPYmpl
Y3QqIGdsb2JhbE9iamVjdCkKICAgICB7Ci0gICAgICAgIE5vZGVJbmRleCBzdGFydCA9IHN0YXJ0
SW5kZXhGb3JDaGlsZHJlbigpOwotICAgICAgICBmb3IgKE5vZGVJbmRleCBpbmRleCA9IG1fY29t
cGlsZUluZGV4OyBpbmRleC0tID4gc3RhcnQ7KSB7CisgICAgICAgIGZvciAodW5zaWduZWQgaSA9
IG1faW5kZXhJbkJsb2NrOyBpLS0gPiBtX2N1cnJlbnRCbG9jay0+c3RhcnRFeGNsdWRpbmdQaGlz
OykgeworICAgICAgICAgICAgTm9kZUluZGV4IGluZGV4ID0gbV9jdXJyZW50QmxvY2stPmF0KGkp
OwogICAgICAgICAgICAgTm9kZSYgbm9kZSA9IG1fZ3JhcGhbaW5kZXhdOwogICAgICAgICAgICAg
c3dpdGNoIChub2RlLm9wKSB7CiAgICAgICAgICAgICBjYXNlIEdldEdsb2JhbFZhcjoKQEAgLTI4
MSw4ICsyMjQsOCBAQCBwcml2YXRlOgogICAgIAogICAgIE5vZGVJbmRleCBnZXRCeVZhbExvYWRF
bGltaW5hdGlvbihOb2RlSW5kZXggY2hpbGQxLCBOb2RlSW5kZXggY2hpbGQyKQogICAgIHsKLSAg
ICAgICAgTm9kZUluZGV4IHN0YXJ0ID0gc3RhcnRJbmRleEZvckNoaWxkcmVuKGNoaWxkMSwgY2hp
bGQyKTsKLSAgICAgICAgZm9yIChOb2RlSW5kZXggaW5kZXggPSBtX2NvbXBpbGVJbmRleDsgaW5k
ZXgtLSA+IHN0YXJ0OykgeworICAgICAgICBmb3IgKHVuc2lnbmVkIGkgPSBtX2luZGV4SW5CbG9j
azsgaS0tID4gbV9jdXJyZW50QmxvY2stPnN0YXJ0RXhjbHVkaW5nUGhpczspIHsKKyAgICAgICAg
ICAgIE5vZGVJbmRleCBpbmRleCA9IG1fY3VycmVudEJsb2NrLT5hdChpKTsKICAgICAgICAgICAg
IE5vZGUmIG5vZGUgPSBtX2dyYXBoW2luZGV4XTsKICAgICAgICAgICAgIHN3aXRjaCAobm9kZS5v
cCkgewogICAgICAgICAgICAgY2FzZSBHZXRCeVZhbDoKQEAgLTMyMiw4ICsyNjUsOCBAQCBwcml2
YXRlOgogCiAgICAgYm9vbCBjaGVja0Z1bmN0aW9uRWxpbWluYXRpb24oSlNGdW5jdGlvbiogZnVu
Y3Rpb24sIE5vZGVJbmRleCBjaGlsZDEpCiAgICAgewotICAgICAgICBOb2RlSW5kZXggc3RhcnQg
PSBzdGFydEluZGV4Rm9yQ2hpbGRyZW4oY2hpbGQxKTsKLSAgICAgICAgZm9yIChOb2RlSW5kZXgg
aW5kZXggPSBlbmRJbmRleEZvclB1cmVDU0UoKTsgaW5kZXgtLSA+IHN0YXJ0OykgeworICAgICAg
ICBmb3IgKHVuc2lnbmVkIGkgPSBlbmRJbmRleEZvclB1cmVDU0UoKTsgaS0tID4gbV9jdXJyZW50
QmxvY2stPnN0YXJ0RXhjbHVkaW5nUGhpczspIHsKKyAgICAgICAgICAgIE5vZGVJbmRleCBpbmRl
eCA9IG1fY3VycmVudEJsb2NrLT5hdChpKTsKICAgICAgICAgICAgIE5vZGUmIG5vZGUgPSBtX2dy
YXBoW2luZGV4XTsKICAgICAgICAgICAgIGlmIChub2RlLm9wID09IENoZWNrRnVuY3Rpb24gJiYg
bm9kZS5jaGlsZDEoKSA9PSBjaGlsZDEgJiYgbm9kZS5mdW5jdGlvbigpID09IGZ1bmN0aW9uKQog
ICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwpAQCAtMzMzLDggKzI3Niw4IEBAIHByaXZhdGU6
CiAKICAgICBib29sIGNoZWNrU3RydWN0dXJlTG9hZEVsaW1pbmF0aW9uKGNvbnN0IFN0cnVjdHVy
ZVNldCYgc3RydWN0dXJlU2V0LCBOb2RlSW5kZXggY2hpbGQxKQogICAgIHsKLSAgICAgICAgTm9k
ZUluZGV4IHN0YXJ0ID0gc3RhcnRJbmRleEZvckNoaWxkcmVuKGNoaWxkMSk7Ci0gICAgICAgIGZv
ciAoTm9kZUluZGV4IGluZGV4ID0gbV9jb21waWxlSW5kZXg7IGluZGV4LS0gPiBzdGFydDspIHsK
KyAgICAgICAgZm9yICh1bnNpZ25lZCBpID0gbV9pbmRleEluQmxvY2s7IGktLSA+IG1fY3VycmVu
dEJsb2NrLT5zdGFydEV4Y2x1ZGluZ1BoaXM7KSB7CisgICAgICAgICAgICBOb2RlSW5kZXggaW5k
ZXggPSBtX2N1cnJlbnRCbG9jay0+YXQoaSk7CiAgICAgICAgICAgICBOb2RlJiBub2RlID0gbV9n
cmFwaFtpbmRleF07CiAgICAgICAgICAgICBzd2l0Y2ggKG5vZGUub3ApIHsKICAgICAgICAgICAg
IGNhc2UgQ2hlY2tTdHJ1Y3R1cmU6CkBAIC0zNzYsOCArMzE5LDggQEAgcHJpdmF0ZToKICAgICAK
ICAgICBOb2RlSW5kZXggZ2V0QnlPZmZzZXRMb2FkRWxpbWluYXRpb24odW5zaWduZWQgaWRlbnRp
Zmllck51bWJlciwgTm9kZUluZGV4IGNoaWxkMSkKICAgICB7Ci0gICAgICAgIE5vZGVJbmRleCBz
dGFydCA9IHN0YXJ0SW5kZXhGb3JDaGlsZHJlbihjaGlsZDEpOwotICAgICAgICBmb3IgKE5vZGVJ
bmRleCBpbmRleCA9IG1fY29tcGlsZUluZGV4OyBpbmRleC0tID4gc3RhcnQ7KSB7CisgICAgICAg
IGZvciAodW5zaWduZWQgaSA9IG1faW5kZXhJbkJsb2NrOyBpLS0gPiBtX2N1cnJlbnRCbG9jay0+
c3RhcnRFeGNsdWRpbmdQaGlzOykgeworICAgICAgICAgICAgTm9kZUluZGV4IGluZGV4ID0gbV9j
dXJyZW50QmxvY2stPmF0KGkpOwogICAgICAgICAgICAgTm9kZSYgbm9kZSA9IG1fZ3JhcGhbaW5k
ZXhdOwogICAgICAgICAgICAgc3dpdGNoIChub2RlLm9wKSB7CiAgICAgICAgICAgICBjYXNlIEdl
dEJ5T2Zmc2V0OgpAQCAtNDE5LDggKzM2Miw4IEBAIHByaXZhdGU6CiAgICAgCiAgICAgTm9kZUlu
ZGV4IGdldFByb3BlcnR5U3RvcmFnZUxvYWRFbGltaW5hdGlvbihOb2RlSW5kZXggY2hpbGQxKQog
ICAgIHsKLSAgICAgICAgTm9kZUluZGV4IHN0YXJ0ID0gc3RhcnRJbmRleEZvckNoaWxkcmVuKGNo
aWxkMSk7Ci0gICAgICAgIGZvciAoTm9kZUluZGV4IGluZGV4ID0gbV9jb21waWxlSW5kZXg7IGlu
ZGV4LS0gPiBzdGFydDspIHsKKyAgICAgICAgZm9yICh1bnNpZ25lZCBpID0gbV9pbmRleEluQmxv
Y2s7IGktLSA+IG1fY3VycmVudEJsb2NrLT5zdGFydEV4Y2x1ZGluZ1BoaXM7KSB7CisgICAgICAg
ICAgICBOb2RlSW5kZXggaW5kZXggPSBtX2N1cnJlbnRCbG9jay0+YXQoaSk7CiAgICAgICAgICAg
ICBOb2RlJiBub2RlID0gbV9ncmFwaFtpbmRleF07CiAgICAgICAgICAgICBzd2l0Y2ggKG5vZGUu
b3ApIHsKICAgICAgICAgICAgIGNhc2UgR2V0UHJvcGVydHlTdG9yYWdlOgpAQCAtNDU1LDggKzM5
OCw4IEBAIHByaXZhdGU6CiAKICAgICBOb2RlSW5kZXggZ2V0SW5kZXhlZFByb3BlcnR5U3RvcmFn
ZUxvYWRFbGltaW5hdGlvbihOb2RlSW5kZXggY2hpbGQxLCBib29sIGhhc0ludGVnZXJJbmRleFBy
ZWRpY3Rpb24pCiAgICAgewotICAgICAgICBOb2RlSW5kZXggc3RhcnQgPSBzdGFydEluZGV4Rm9y
Q2hpbGRyZW4oY2hpbGQxKTsKLSAgICAgICAgZm9yIChOb2RlSW5kZXggaW5kZXggPSBtX2NvbXBp
bGVJbmRleDsgaW5kZXgtLSA+IHN0YXJ0OykgeworICAgICAgICBmb3IgKHVuc2lnbmVkIGkgPSBt
X2luZGV4SW5CbG9jazsgaS0tID4gbV9jdXJyZW50QmxvY2stPnN0YXJ0RXhjbHVkaW5nUGhpczsp
IHsKKyAgICAgICAgICAgIE5vZGVJbmRleCBpbmRleCA9IG1fY3VycmVudEJsb2NrLT5hdChpKTsK
ICAgICAgICAgICAgIE5vZGUmIG5vZGUgPSBtX2dyYXBoW2luZGV4XTsKICAgICAgICAgICAgIHN3
aXRjaCAobm9kZS5vcCkgewogICAgICAgICAgICAgY2FzZSBHZXRJbmRleGVkUHJvcGVydHlTdG9y
YWdlOiB7CkBAIC00OTMsOCArNDM2LDggQEAgcHJpdmF0ZToKICAgICAKICAgICBOb2RlSW5kZXgg
Z2V0U2NvcGVDaGFpbkxvYWRFbGltaW5hdGlvbih1bnNpZ25lZCBkZXB0aCkKICAgICB7Ci0gICAg
ICAgIE5vZGVJbmRleCBzdGFydCA9IHN0YXJ0SW5kZXhGb3JDaGlsZHJlbigpOwotICAgICAgICBm
b3IgKE5vZGVJbmRleCBpbmRleCA9IGVuZEluZGV4Rm9yUHVyZUNTRSgpOyBpbmRleC0tID4gc3Rh
cnQ7KSB7CisgICAgICAgIGZvciAodW5zaWduZWQgaSA9IGVuZEluZGV4Rm9yUHVyZUNTRSgpOyBp
LS0gPiBtX2N1cnJlbnRCbG9jay0+c3RhcnRFeGNsdWRpbmdQaGlzOykgeworICAgICAgICAgICAg
Tm9kZUluZGV4IGluZGV4ID0gbV9jdXJyZW50QmxvY2stPmF0KGkpOwogICAgICAgICAgICAgTm9k
ZSYgbm9kZSA9IG1fZ3JhcGhbaW5kZXhdOwogICAgICAgICAgICAgaWYgKG5vZGUub3AgPT0gR2V0
U2NvcGVDaGFpbgogICAgICAgICAgICAgICAgICYmIG5vZGUuc2NvcGVDaGFpbkRlcHRoKCkgPT0g
ZGVwdGgpCkBAIC03MDIsNyArNjQ1LDcgQEAgcHJpdmF0ZToKICAgICAgICAgICAgIGJyZWFrOwog
ICAgICAgICB9CiAgICAgICAgIAotICAgICAgICBtX2xhc3RTZWVuW25vZGUub3AgJiBOb2RlSWRN
YXNrXSA9IG1fY29tcGlsZUluZGV4OworICAgICAgICBtX2xhc3RTZWVuW25vZGUub3AgJiBOb2Rl
SWRNYXNrXSA9IG1faW5kZXhJbkJsb2NrOwogI2lmIERGR19FTkFCTEUoREVCVUdfUFJPUEFHQVRJ
T05fVkVSQk9TRSkKICAgICAgICAgZGF0YUxvZygiXG4iKTsKICNlbmRpZgpAQCAtNzEwLDE2ICs2
NTMsMjEgQEAgcHJpdmF0ZToKICAgICAKICAgICB2b2lkIHBlcmZvcm1CbG9ja0NTRShCYXNpY0Js
b2NrJiBibG9jaykKICAgICB7Ci0gICAgICAgIG1fc3RhcnQgPSBibG9jay5iZWdpbjsKLSAgICAg
ICAgTm9kZUluZGV4IGVuZCA9IGJsb2NrLmVuZDsKLSAgICAgICAgZm9yIChtX2NvbXBpbGVJbmRl
eCA9IG1fc3RhcnQ7IG1fY29tcGlsZUluZGV4IDwgZW5kOyArK21fY29tcGlsZUluZGV4KQorICAg
ICAgICBtX2N1cnJlbnRCbG9jayA9ICZibG9jazsKKyAgICAgICAgZm9yICh1bnNpZ25lZCBpID0g
MDsgaSA8IExhc3ROb2RlSWQ7ICsraSkKKyAgICAgICAgICAgIG1fbGFzdFNlZW5baV0gPSBVSU5U
X01BWDsKKworICAgICAgICBmb3IgKG1faW5kZXhJbkJsb2NrID0gYmxvY2suc3RhcnRFeGNsdWRp
bmdQaGlzOyBtX2luZGV4SW5CbG9jayA8IGJsb2NrLnNpemUoKTsgKyttX2luZGV4SW5CbG9jaykg
eworICAgICAgICAgICAgbV9jb21waWxlSW5kZXggPSBibG9ja1ttX2luZGV4SW5CbG9ja107CiAg
ICAgICAgICAgICBwZXJmb3JtTm9kZUNTRShtX2dyYXBoW21fY29tcGlsZUluZGV4XSk7CisgICAg
ICAgIH0KICAgICB9CiAgICAgCi0gICAgTm9kZUluZGV4IG1fc3RhcnQ7CisgICAgQmFzaWNCbG9j
ayogbV9jdXJyZW50QmxvY2s7CiAgICAgTm9kZUluZGV4IG1fY29tcGlsZUluZGV4OworICAgIHVu
c2lnbmVkIG1faW5kZXhJbkJsb2NrOwogICAgIFZlY3RvcjxOb2RlSW5kZXgsIDE2PiBtX3JlcGxh
Y2VtZW50czsKLSAgICBGaXhlZEFycmF5PE5vZGVJbmRleCwgTGFzdE5vZGVJZD4gbV9sYXN0U2Vl
bjsKKyAgICBGaXhlZEFycmF5PHVuc2lnbmVkLCBMYXN0Tm9kZUlkPiBtX2xhc3RTZWVuOwogfTsK
IAogdm9pZCBwZXJmb3JtQ1NFKEdyYXBoJiBncmFwaCkKSW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0
Q29yZS9kZmcvREZHR3JhcGguY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29y
ZS9kZmcvREZHR3JhcGguY3BwCShyZXZpc2lvbiAxMDkyOTUpCisrKyBTb3VyY2UvSmF2YVNjcmlw
dENvcmUvZGZnL0RGR0dyYXBoLmNwcAkod29ya2luZyBjb3B5KQpAQCAtMjc0LDggKzI3NCw4IEBA
IHZvaWQgR3JhcGg6OmR1bXAoKQogICAgICAgICBkYXRhTG9nKCIgIHZhciBsaW5rczogIik7CiAg
ICAgICAgIGR1bXBPcGVyYW5kcyhibG9jay0+dmFyaWFibGVzQXRIZWFkLCBXVEY6OmRhdGFGaWxl
KCkpOwogICAgICAgICBkYXRhTG9nKCJcbiIpOwotICAgICAgICBmb3IgKHNpemVfdCBpID0gYmxv
Y2stPmJlZ2luOyBpIDwgYmxvY2stPmVuZDsgKytpKQotICAgICAgICAgICAgZHVtcChpKTsKKyAg
ICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBibG9jay0+c2l6ZSgpOyArK2kpCisgICAgICAg
ICAgICBkdW1wKGJsb2NrLT5hdChpKSk7CiAgICAgICAgIGRhdGFMb2coIiAgdmFycyBhZnRlcjog
Iik7CiAgICAgICAgIGlmIChibG9jay0+Y2ZhSGFzVmlzaXRlZCkKICAgICAgICAgICAgIGR1bXBP
cGVyYW5kcyhibG9jay0+dmFsdWVzQXRUYWlsLCBXVEY6OmRhdGFGaWxlKCkpOwpAQCAtMjgzLDkg
KzI4Myw2IEBAIHZvaWQgR3JhcGg6OmR1bXAoKQogICAgICAgICAgICAgZGF0YUxvZygiPGVtcHR5
PiIpOwogICAgICAgICBkYXRhTG9nKCJcbiIpOwogICAgIH0KLSAgICBkYXRhTG9nKCJQaGkgTm9k
ZXM6XG4iKTsKLSAgICBmb3IgKHNpemVfdCBpID0gbV9ibG9ja3MubGFzdCgpLT5lbmQ7IGkgPCBz
aXplKCk7ICsraSkKLSAgICAgICAgZHVtcChpKTsKIH0KIAogLy8gRklYTUU6IENvbnZlcnQgdGhp
cyB0byBiZSBpdGVyYXRpdmUsIG5vdCByZWN1cnNpdmUuCkluZGV4OiBTb3VyY2UvSmF2YVNjcmlw
dENvcmUvZGZnL0RGR1BoYXNlLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENv
cmUvZGZnL0RGR1BoYXNlLmNwcAkocmV2aXNpb24gMTA5Mjk1KQorKysgU291cmNlL0phdmFTY3Jp
cHRDb3JlL2RmZy9ERkdQaGFzZS5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTM1LDcgKzM1LDcgQEAg
dm9pZCBQaGFzZTo6YmVnaW5QaGFzZSgpCiB7CiAgICAgZGF0YUxvZygiQmVnaW5uaW5nIERGRyBw
aGFzZSAlcy5cbiIsIG1fbmFtZSk7CiAgICAgZGF0YUxvZygiR3JhcGggYmVmb3JlICVzOlxuIiwg
bV9uYW1lKTsKLSAgICBtX2dyYXBoLmR1bXAobV9jb2RlQmxvY2spOworICAgIG1fZ3JhcGguZHVt
cCgpOwogfQogCiB2b2lkIFBoYXNlOjplbmRQaGFzZSgpCkluZGV4OiBTb3VyY2UvSmF2YVNjcmlw
dENvcmUvZGZnL0RGR1NwZWN1bGF0aXZlSklUMzJfNjQuY3BwCj09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJj
ZS9KYXZhU2NyaXB0Q29yZS9kZmcvREZHU3BlY3VsYXRpdmVKSVQzMl82NC5jcHAJKHJldmlzaW9u
IDEwOTI5NSkKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9kZmcvREZHU3BlY3VsYXRpdmVKSVQz
Ml82NC5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTY1MiwxNCArNjUyLDE3IEBAIHZvaWQgU3BlY3Vs
YXRpdmVKSVQ6Om5vblNwZWN1bGF0aXZlUGVlcGgKIAogYm9vbCBTcGVjdWxhdGl2ZUpJVDo6bm9u
U3BlY3VsYXRpdmVDb21wYXJlTnVsbChOb2RlJiBub2RlLCBOb2RlVXNlIG9wZXJhbmQsIGJvb2wg
aW52ZXJ0KQogewotICAgIE5vZGVJbmRleCBicmFuY2hOb2RlSW5kZXggPSBkZXRlY3RQZWVwSG9s
ZUJyYW5jaCgpOwotICAgIGlmIChicmFuY2hOb2RlSW5kZXggIT0gTm9Ob2RlKSB7CisgICAgdW5z
aWduZWQgYnJhbmNoSW5kZXhJbkJsb2NrID0gZGV0ZWN0UGVlcEhvbGVCcmFuY2goKTsKKyAgICBp
ZiAoYnJhbmNoSW5kZXhJbkJsb2NrICE9IFVJTlRfTUFYKSB7CisgICAgICAgIE5vZGVJbmRleCBi
cmFuY2hOb2RlSW5kZXggPSBtX2ppdC5ncmFwaCgpLm1fYmxvY2tzW21fYmxvY2tdLT5hdChicmFu
Y2hJbmRleEluQmxvY2spOworCiAgICAgICAgIEFTU0VSVChub2RlLmFkanVzdGVkUmVmQ291bnQo
KSA9PSAxKTsKICAgICAgICAgCiAgICAgICAgIG5vblNwZWN1bGF0aXZlUGVlcGhvbGVCcmFuY2hO
dWxsKG9wZXJhbmQsIGJyYW5jaE5vZGVJbmRleCwgaW52ZXJ0KTsKICAgICAKICAgICAgICAgdXNl
KG5vZGUuY2hpbGQxKCkpOwogICAgICAgICB1c2Uobm9kZS5jaGlsZDIoKSk7CisgICAgICAgIG1f
aW5kZXhJbkJsb2NrID0gYnJhbmNoSW5kZXhJbkJsb2NrOwogICAgICAgICBtX2NvbXBpbGVJbmRl
eCA9IGJyYW5jaE5vZGVJbmRleDsKICAgICAgICAgCiAgICAgICAgIHJldHVybiB0cnVlOwpJbmRl
eDogU291cmNlL0phdmFTY3JpcHRDb3JlL2RmZy9ERkdTcGVjdWxhdGl2ZUpJVDY0LmNwcAo9PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvZGZnL0RGR1NwZWN1bGF0aXZlSklUNjQu
Y3BwCShyZXZpc2lvbiAxMDkyOTUpCisrKyBTb3VyY2UvSmF2YVNjcmlwdENvcmUvZGZnL0RGR1Nw
ZWN1bGF0aXZlSklUNjQuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC02MjgsMTQgKzYyOCwxNyBAQCB2
b2lkIFNwZWN1bGF0aXZlSklUOjpub25TcGVjdWxhdGl2ZVBlZXBoCiAKIGJvb2wgU3BlY3VsYXRp
dmVKSVQ6Om5vblNwZWN1bGF0aXZlQ29tcGFyZU51bGwoTm9kZSYgbm9kZSwgTm9kZVVzZSBvcGVy
YW5kLCBib29sIGludmVydCkKIHsKLSAgICBOb2RlSW5kZXggYnJhbmNoTm9kZUluZGV4ID0gZGV0
ZWN0UGVlcEhvbGVCcmFuY2goKTsKLSAgICBpZiAoYnJhbmNoTm9kZUluZGV4ICE9IE5vTm9kZSkg
eworICAgIHVuc2lnbmVkIGJyYW5jaEluZGV4SW5CbG9jayA9IGRldGVjdFBlZXBIb2xlQnJhbmNo
KCk7CisgICAgaWYgKGJyYW5jaEluZGV4SW5CbG9jayAhPSBVSU5UX01BWCkgeworICAgICAgICBO
b2RlSW5kZXggYnJhbmNoTm9kZUluZGV4ID0gbV9qaXQuZ3JhcGgoKS5tX2Jsb2Nrc1ttX2Jsb2Nr
XS0+YXQoYnJhbmNoSW5kZXhJbkJsb2NrKTsKKwogICAgICAgICBBU1NFUlQobm9kZS5hZGp1c3Rl
ZFJlZkNvdW50KCkgPT0gMSk7CiAgICAgICAgIAogICAgICAgICBub25TcGVjdWxhdGl2ZVBlZXBo
b2xlQnJhbmNoTnVsbChvcGVyYW5kLCBicmFuY2hOb2RlSW5kZXgsIGludmVydCk7CiAgICAgCiAg
ICAgICAgIHVzZShub2RlLmNoaWxkMSgpKTsKICAgICAgICAgdXNlKG5vZGUuY2hpbGQyKCkpOwor
ICAgICAgICBtX2luZGV4SW5CbG9jayA9IGJyYW5jaEluZGV4SW5CbG9jazsKICAgICAgICAgbV9j
b21waWxlSW5kZXggPSBicmFuY2hOb2RlSW5kZXg7CiAgICAgICAgIAogICAgICAgICByZXR1cm4g
dHJ1ZTsKSW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9kZmcvREZHU3BlY3VsYXRpdmVKSVQu
Y3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9kZmcvREZHU3BlY3VsYXRp
dmVKSVQuY3BwCShyZXZpc2lvbiAxMDkyOTUpCisrKyBTb3VyY2UvSmF2YVNjcmlwdENvcmUvZGZn
L0RGR1NwZWN1bGF0aXZlSklULmNwcAkod29ya2luZyBjb3B5KQpAQCAtMzY1LDEyICszNjUsMTUg
QEAgdm9pZCBTcGVjdWxhdGl2ZUpJVDo6d3JpdGVCYXJyaWVyKEpTQ2VsbAogCiBib29sIFNwZWN1
bGF0aXZlSklUOjpub25TcGVjdWxhdGl2ZUNvbXBhcmUoTm9kZSYgbm9kZSwgTWFjcm9Bc3NlbWJs
ZXI6OlJlbGF0aW9uYWxDb25kaXRpb24gY29uZCwgU19ERkdPcGVyYXRpb25fRUpKIGhlbHBlckZ1
bmN0aW9uKQogewotICAgIE5vZGVJbmRleCBicmFuY2hOb2RlSW5kZXggPSBkZXRlY3RQZWVwSG9s
ZUJyYW5jaCgpOwotICAgIGlmIChicmFuY2hOb2RlSW5kZXggIT0gTm9Ob2RlKSB7CisgICAgdW5z
aWduZWQgYnJhbmNoSW5kZXhJbkJsb2NrID0gZGV0ZWN0UGVlcEhvbGVCcmFuY2goKTsKKyAgICBp
ZiAoYnJhbmNoSW5kZXhJbkJsb2NrICE9IFVJTlRfTUFYKSB7CisgICAgICAgIE5vZGVJbmRleCBi
cmFuY2hOb2RlSW5kZXggPSBtX2ppdC5ncmFwaCgpLm1fYmxvY2tzW21fYmxvY2tdLT5hdChicmFu
Y2hJbmRleEluQmxvY2spOworCiAgICAgICAgIEFTU0VSVChub2RlLmFkanVzdGVkUmVmQ291bnQo
KSA9PSAxKTsKICAgICAgICAgCiAgICAgICAgIG5vblNwZWN1bGF0aXZlUGVlcGhvbGVCcmFuY2go
bm9kZSwgYnJhbmNoTm9kZUluZGV4LCBjb25kLCBoZWxwZXJGdW5jdGlvbik7CiAgICAgCisgICAg
ICAgIG1faW5kZXhJbkJsb2NrID0gYnJhbmNoSW5kZXhJbkJsb2NrOwogICAgICAgICBtX2NvbXBp
bGVJbmRleCA9IGJyYW5jaE5vZGVJbmRleDsKICAgICAgICAgCiAgICAgICAgIHJldHVybiB0cnVl
OwpAQCAtMzgzLDEyICszODYsMTUgQEAgYm9vbCBTcGVjdWxhdGl2ZUpJVDo6bm9uU3BlY3VsYXRp
dmVDb21wYQogCiBib29sIFNwZWN1bGF0aXZlSklUOjpub25TcGVjdWxhdGl2ZVN0cmljdEVxKE5v
ZGUmIG5vZGUsIGJvb2wgaW52ZXJ0KQogewotICAgIE5vZGVJbmRleCBicmFuY2hOb2RlSW5kZXgg
PSBkZXRlY3RQZWVwSG9sZUJyYW5jaCgpOwotICAgIGlmIChicmFuY2hOb2RlSW5kZXggIT0gTm9O
b2RlKSB7CisgICAgdW5zaWduZWQgYnJhbmNoSW5kZXhJbkJsb2NrID0gZGV0ZWN0UGVlcEhvbGVC
cmFuY2goKTsKKyAgICBpZiAoYnJhbmNoSW5kZXhJbkJsb2NrICE9IFVJTlRfTUFYKSB7CisgICAg
ICAgIE5vZGVJbmRleCBicmFuY2hOb2RlSW5kZXggPSBtX2ppdC5ncmFwaCgpLm1fYmxvY2tzW21f
YmxvY2tdLT5hdChicmFuY2hJbmRleEluQmxvY2spOworCiAgICAgICAgIEFTU0VSVChub2RlLmFk
anVzdGVkUmVmQ291bnQoKSA9PSAxKTsKICAgICAgICAgCiAgICAgICAgIG5vblNwZWN1bGF0aXZl
UGVlcGhvbGVTdHJpY3RFcShub2RlLCBicmFuY2hOb2RlSW5kZXgsIGludmVydCk7CiAgICAgCisg
ICAgICAgIG1faW5kZXhJbkJsb2NrID0gYnJhbmNoSW5kZXhJbkJsb2NrOwogICAgICAgICBtX2Nv
bXBpbGVJbmRleCA9IGJyYW5jaE5vZGVJbmRleDsKICAgICAgICAgCiAgICAgICAgIHJldHVybiB0
cnVlOwpAQCAtODY4LDggKzg3NCwxMCBAQCB2b2lkIFNwZWN1bGF0aXZlSklUOjpjb21waWxlUGVl
cEhvbGVJbnRlCiBib29sIFNwZWN1bGF0aXZlSklUOjpjb21waWxlUGVlcEhvbGVCcmFuY2goTm9k
ZSYgbm9kZSwgTWFjcm9Bc3NlbWJsZXI6OlJlbGF0aW9uYWxDb25kaXRpb24gY29uZGl0aW9uLCBN
YWNyb0Fzc2VtYmxlcjo6RG91YmxlQ29uZGl0aW9uIGRvdWJsZUNvbmRpdGlvbiwgU19ERkdPcGVy
YXRpb25fRUpKIG9wZXJhdGlvbikKIHsKICAgICAvLyBGdXNlZCBjb21wYXJlICYgYnJhbmNoLgot
ICAgIE5vZGVJbmRleCBicmFuY2hOb2RlSW5kZXggPSBkZXRlY3RQZWVwSG9sZUJyYW5jaCgpOwot
ICAgIGlmIChicmFuY2hOb2RlSW5kZXggIT0gTm9Ob2RlKSB7CisgICAgdW5zaWduZWQgYnJhbmNo
SW5kZXhJbkJsb2NrID0gZGV0ZWN0UGVlcEhvbGVCcmFuY2goKTsKKyAgICBpZiAoYnJhbmNoSW5k
ZXhJbkJsb2NrICE9IFVJTlRfTUFYKSB7CisgICAgICAgIE5vZGVJbmRleCBicmFuY2hOb2RlSW5k
ZXggPSBtX2ppdC5ncmFwaCgpLm1fYmxvY2tzW21fYmxvY2tdLT5hdChicmFuY2hJbmRleEluQmxv
Y2spOworCiAgICAgICAgIC8vIGRldGVjdFBlZXBIb2xlQnJhbmNoIGN1cnJlbnRseSBvbmx5IHBl
cm1pdHMgdGhlIGJyYW5jaCB0byBiZSB0aGUgdmVyeSBuZXh0IG5vZGUsCiAgICAgICAgIC8vIHNv
IGNhbiBiZSBubyBpbnRlcnZlbmluZyBub2RlcyB0byBhbHNvIHJlZmVyZW5jZSB0aGUgY29tcGFy
ZS4gCiAgICAgICAgIEFTU0VSVChub2RlLmFkanVzdGVkUmVmQ291bnQoKSA9PSAxKTsKQEAgLTg5
Myw2ICs5MDEsNyBAQCBib29sIFNwZWN1bGF0aXZlSklUOjpjb21waWxlUGVlcEhvbGVCcmFuCiAg
ICAgICAgIH0gZWxzZQogICAgICAgICAgICAgbm9uU3BlY3VsYXRpdmVQZWVwaG9sZUJyYW5jaChu
b2RlLCBicmFuY2hOb2RlSW5kZXgsIGNvbmRpdGlvbiwgb3BlcmF0aW9uKTsKIAorICAgICAgICBt
X2luZGV4SW5CbG9jayA9IGJyYW5jaEluZGV4SW5CbG9jazsKICAgICAgICAgbV9jb21waWxlSW5k
ZXggPSBicmFuY2hOb2RlSW5kZXg7CiAgICAgICAgIHJldHVybiB0cnVlOwogICAgIH0KQEAgLTkx
MCwxMiArOTE5LDkgQEAgdm9pZCBTcGVjdWxhdGl2ZUpJVDo6Y29tcGlsZU1vdkhpbnQoTm9kZQog
dm9pZCBTcGVjdWxhdGl2ZUpJVDo6Y29tcGlsZShCYXNpY0Jsb2NrJiBibG9jaykKIHsKICAgICBB
U1NFUlQobV9jb21waWxlT2theSk7Ci0gICAgQVNTRVJUKG1fY29tcGlsZUluZGV4ID09IGJsb2Nr
LmJlZ2luKTsKICAgICAKLSAgICBpZiAoIWJsb2NrLmlzUmVhY2hhYmxlKSB7Ci0gICAgICAgIG1f
Y29tcGlsZUluZGV4ID0gYmxvY2suZW5kOworICAgIGlmICghYmxvY2suaXNSZWFjaGFibGUpCiAg
ICAgICAgIHJldHVybjsKLSAgICB9CiAKICAgICBtX2Jsb2NrSGVhZHNbbV9ibG9ja10gPSBtX2pp
dC5sYWJlbCgpOwogI2lmIERGR19FTkFCTEUoSklUX0JSRUFLX09OX0VWRVJZX0JMT0NLKQpAQCAt
OTU1LDcgKzk2MSw4IEBAIHZvaWQgU3BlY3VsYXRpdmVKSVQ6OmNvbXBpbGUoQmFzaWNCbG9jayYK
ICAgICAgICAgdmVyaWZpY2F0aW9uU3VjY2VlZGVkLmxpbmsoJm1faml0KTsKICAgICB9CiAKLSAg
ICBmb3IgKDsgbV9jb21waWxlSW5kZXggPCBibG9jay5lbmQ7ICsrbV9jb21waWxlSW5kZXgpIHsK
KyAgICBmb3IgKG1faW5kZXhJbkJsb2NrID0gYmxvY2suc3RhcnRFeGNsdWRpbmdQaGlzOyBtX2lu
ZGV4SW5CbG9jayA8IGJsb2NrLnNpemUoKTsgKyttX2luZGV4SW5CbG9jaykgeworICAgICAgICBt
X2NvbXBpbGVJbmRleCA9IGJsb2NrW21faW5kZXhJbkJsb2NrXTsKICAgICAgICAgTm9kZSYgbm9k
ZSA9IGF0KG1fY29tcGlsZUluZGV4KTsKICAgICAgICAgbV9jb2RlT3JpZ2luRm9yT1NSID0gbm9k
ZS5jb2RlT3JpZ2luOwogICAgICAgICBpZiAoIW5vZGUuc2hvdWxkR2VuZXJhdGUoKSkgewpAQCAt
MTAwMCw3ICsxMDA3LDYgQEAgdm9pZCBTcGVjdWxhdGl2ZUpJVDo6Y29tcGlsZShCYXNpY0Jsb2Nr
JgogICAgICAgICAgICAgY29tcGlsZShub2RlKTsKICAgICAgICAgICAgIGlmICghbV9jb21waWxl
T2theSkgewogICAgICAgICAgICAgICAgIG1fY29tcGlsZU9rYXkgPSB0cnVlOwotICAgICAgICAg
ICAgICAgIG1fY29tcGlsZUluZGV4ID0gYmxvY2suZW5kOwogICAgICAgICAgICAgICAgIGNsZWFy
R2VuZXJhdGlvbkluZm8oKTsKICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICB9
CkBAIC0xMDQwLDcgKzEwNDYsNyBAQCB2b2lkIFNwZWN1bGF0aXZlSklUOjpjb21waWxlKEJhc2lj
QmxvY2smCiAjZW5kaWYKICAgICAgICAgCiAgICAgICAgIC8vIE1ha2Ugc3VyZSB0aGF0IHRoZSBh
YnN0cmFjdCBzdGF0ZSBpcyByZW1hdGVyaWFsaXplZCBmb3IgdGhlIG5leHQgbm9kZS4KLSAgICAg
ICAgbV9zdGF0ZS5leGVjdXRlKG1fY29tcGlsZUluZGV4KTsKKyAgICAgICAgbV9zdGF0ZS5leGVj
dXRlKG1faW5kZXhJbkJsb2NrKTsKICAgICAgICAgCiAgICAgICAgIGlmIChub2RlLnNob3VsZEdl
bmVyYXRlKCkpCiAgICAgICAgICAgICBjaGVja0NvbnNpc3RlbmN5KCk7CkBAIC0yNDc5LDggKzI0
ODUsOSBAQCBib29sIFNwZWN1bGF0aXZlSklUOjpjb21waWxlU3RyaWN0RXFGb3JDCiB7CiAgICAg
SlNWYWx1ZU9wZXJhbmQgb3AxKHRoaXMsIHZhbHVlKTsKICAgICAKLSAgICBOb2RlSW5kZXggYnJh
bmNoTm9kZUluZGV4ID0gZGV0ZWN0UGVlcEhvbGVCcmFuY2goKTsKLSAgICBpZiAoYnJhbmNoTm9k
ZUluZGV4ICE9IE5vTm9kZSkgeworICAgIHVuc2lnbmVkIGJyYW5jaEluZGV4SW5CbG9jayA9IGRl
dGVjdFBlZXBIb2xlQnJhbmNoKCk7CisgICAgaWYgKGJyYW5jaEluZGV4SW5CbG9jayAhPSBVSU5U
X01BWCkgeworICAgICAgICBOb2RlSW5kZXggYnJhbmNoTm9kZUluZGV4ID0gbV9qaXQuZ3JhcGgo
KS5tX2Jsb2Nrc1ttX2Jsb2NrXS0+YXQoYnJhbmNoSW5kZXhJbkJsb2NrKTsKICAgICAgICAgTm9k
ZSYgYnJhbmNoTm9kZSA9IGF0KGJyYW5jaE5vZGVJbmRleCk7CiAgICAgICAgIEJsb2NrSW5kZXgg
dGFrZW4gPSBicmFuY2hOb2RlLnRha2VuQmxvY2tJbmRleCgpOwogICAgICAgICBCbG9ja0luZGV4
IG5vdFRha2VuID0gYnJhbmNoTm9kZS5ub3RUYWtlbkJsb2NrSW5kZXgoKTsKQEAgLTI1MTYsNiAr
MjUyMyw3IEBAIGJvb2wgU3BlY3VsYXRpdmVKSVQ6OmNvbXBpbGVTdHJpY3RFcUZvckMKICAgICAg
ICAgCiAgICAgICAgIHVzZShub2RlLmNoaWxkMSgpKTsKICAgICAgICAgdXNlKG5vZGUuY2hpbGQy
KCkpOworICAgICAgICBtX2luZGV4SW5CbG9jayA9IGJyYW5jaEluZGV4SW5CbG9jazsKICAgICAg
ICAgbV9jb21waWxlSW5kZXggPSBicmFuY2hOb2RlSW5kZXg7CiAgICAgICAgIHJldHVybiB0cnVl
OwogICAgIH0KQEAgLTI1NjYsMTEgKzI1NzQsMTMgQEAgYm9vbCBTcGVjdWxhdGl2ZUpJVDo6Y29t
cGlsZVN0cmljdEVxKE5vZAogICAgIC8vIDIpIElmIHRoZSBvcGVyYW5kcyBhcmUgcHJlZGljdGVk
IGludGVnZXIsIGRvIGFuIGludGVnZXIgY29tcGFyaXNvbi4KICAgICAKICAgICBpZiAoTm9kZTo6
c2hvdWxkU3BlY3VsYXRlSW50ZWdlcihhdChub2RlLmNoaWxkMSgpKSwgYXQobm9kZS5jaGlsZDIo
KSkpKSB7Ci0gICAgICAgIE5vZGVJbmRleCBicmFuY2hOb2RlSW5kZXggPSBkZXRlY3RQZWVwSG9s
ZUJyYW5jaCgpOwotICAgICAgICBpZiAoYnJhbmNoTm9kZUluZGV4ICE9IE5vTm9kZSkgeworICAg
ICAgICB1bnNpZ25lZCBicmFuY2hJbmRleEluQmxvY2sgPSBkZXRlY3RQZWVwSG9sZUJyYW5jaCgp
OworICAgICAgICBpZiAoYnJhbmNoSW5kZXhJbkJsb2NrICE9IFVJTlRfTUFYKSB7CisgICAgICAg
ICAgICBOb2RlSW5kZXggYnJhbmNoTm9kZUluZGV4ID0gbV9qaXQuZ3JhcGgoKS5tX2Jsb2Nrc1tt
X2Jsb2NrXS0+YXQoYnJhbmNoSW5kZXhJbkJsb2NrKTsKICAgICAgICAgICAgIGNvbXBpbGVQZWVw
SG9sZUludGVnZXJCcmFuY2gobm9kZSwgYnJhbmNoTm9kZUluZGV4LCBNYWNyb0Fzc2VtYmxlcjo6
RXF1YWwpOwogICAgICAgICAgICAgdXNlKG5vZGUuY2hpbGQxKCkpOwogICAgICAgICAgICAgdXNl
KG5vZGUuY2hpbGQyKCkpOworICAgICAgICAgICAgbV9pbmRleEluQmxvY2sgPSBicmFuY2hJbmRl
eEluQmxvY2s7CiAgICAgICAgICAgICBtX2NvbXBpbGVJbmRleCA9IGJyYW5jaE5vZGVJbmRleDsK
ICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICB9CkBAIC0yNTgxLDExICsyNTkxLDEz
IEBAIGJvb2wgU3BlY3VsYXRpdmVKSVQ6OmNvbXBpbGVTdHJpY3RFcShOb2QKICAgICAvLyAzKSBJ
ZiB0aGUgb3BlcmFuZHMgYXJlIHByZWRpY3RlZCBkb3VibGUsIGRvIGEgZG91YmxlIGNvbXBhcmlz
b24uCiAgICAgCiAgICAgaWYgKE5vZGU6OnNob3VsZFNwZWN1bGF0ZU51bWJlcihhdChub2RlLmNo
aWxkMSgpKSwgYXQobm9kZS5jaGlsZDIoKSkpKSB7Ci0gICAgICAgIE5vZGVJbmRleCBicmFuY2hO
b2RlSW5kZXggPSBkZXRlY3RQZWVwSG9sZUJyYW5jaCgpOwotICAgICAgICBpZiAoYnJhbmNoTm9k
ZUluZGV4ICE9IE5vTm9kZSkgeworICAgICAgICB1bnNpZ25lZCBicmFuY2hJbmRleEluQmxvY2sg
PSBkZXRlY3RQZWVwSG9sZUJyYW5jaCgpOworICAgICAgICBpZiAoYnJhbmNoSW5kZXhJbkJsb2Nr
ICE9IFVJTlRfTUFYKSB7CisgICAgICAgICAgICBOb2RlSW5kZXggYnJhbmNoTm9kZUluZGV4ID0g
bV9qaXQuZ3JhcGgoKS5tX2Jsb2Nrc1ttX2Jsb2NrXS0+YXQoYnJhbmNoSW5kZXhJbkJsb2NrKTsK
ICAgICAgICAgICAgIGNvbXBpbGVQZWVwSG9sZURvdWJsZUJyYW5jaChub2RlLCBicmFuY2hOb2Rl
SW5kZXgsIE1hY3JvQXNzZW1ibGVyOjpEb3VibGVFcXVhbCk7CiAgICAgICAgICAgICB1c2Uobm9k
ZS5jaGlsZDEoKSk7CiAgICAgICAgICAgICB1c2Uobm9kZS5jaGlsZDIoKSk7CisgICAgICAgICAg
ICBtX2luZGV4SW5CbG9jayA9IGJyYW5jaEluZGV4SW5CbG9jazsKICAgICAgICAgICAgIG1fY29t
cGlsZUluZGV4ID0gYnJhbmNoTm9kZUluZGV4OwogICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAg
ICAgICAgIH0KQEAgLTI1OTcsMTEgKzI2MDksMTMgQEAgYm9vbCBTcGVjdWxhdGl2ZUpJVDo6Y29t
cGlsZVN0cmljdEVxKE5vZAogICAgIC8vICAgIG9yIGFycmF5IGNvbXBhcmlzb24uCiAgICAgCiAg
ICAgaWYgKE5vZGU6OnNob3VsZFNwZWN1bGF0ZUZpbmFsT2JqZWN0KGF0KG5vZGUuY2hpbGQxKCkp
LCBhdChub2RlLmNoaWxkMigpKSkpIHsKLSAgICAgICAgTm9kZUluZGV4IGJyYW5jaE5vZGVJbmRl
eCA9IGRldGVjdFBlZXBIb2xlQnJhbmNoKCk7Ci0gICAgICAgIGlmIChicmFuY2hOb2RlSW5kZXgg
IT0gTm9Ob2RlKSB7CisgICAgICAgIHVuc2lnbmVkIGJyYW5jaEluZGV4SW5CbG9jayA9IGRldGVj
dFBlZXBIb2xlQnJhbmNoKCk7CisgICAgICAgIGlmIChicmFuY2hJbmRleEluQmxvY2sgIT0gVUlO
VF9NQVgpIHsKKyAgICAgICAgICAgIE5vZGVJbmRleCBicmFuY2hOb2RlSW5kZXggPSBtX2ppdC5n
cmFwaCgpLm1fYmxvY2tzW21fYmxvY2tdLT5hdChicmFuY2hJbmRleEluQmxvY2spOwogICAgICAg
ICAgICAgY29tcGlsZVBlZXBIb2xlT2JqZWN0RXF1YWxpdHkobm9kZSwgYnJhbmNoTm9kZUluZGV4
LCAmSlNGaW5hbE9iamVjdDo6c19pbmZvLCBpc0ZpbmFsT2JqZWN0UHJlZGljdGlvbik7CiAgICAg
ICAgICAgICB1c2Uobm9kZS5jaGlsZDEoKSk7CiAgICAgICAgICAgICB1c2Uobm9kZS5jaGlsZDIo
KSk7CisgICAgICAgICAgICBtX2luZGV4SW5CbG9jayA9IGJyYW5jaEluZGV4SW5CbG9jazsKICAg
ICAgICAgICAgIG1fY29tcGlsZUluZGV4ID0gYnJhbmNoTm9kZUluZGV4OwogICAgICAgICAgICAg
cmV0dXJuIHRydWU7CiAgICAgICAgIH0KQEAgLTI2MTAsMTEgKzI2MjQsMTMgQEAgYm9vbCBTcGVj
dWxhdGl2ZUpJVDo6Y29tcGlsZVN0cmljdEVxKE5vZAogICAgIH0KICAgICAKICAgICBpZiAoTm9k
ZTo6c2hvdWxkU3BlY3VsYXRlQXJyYXkoYXQobm9kZS5jaGlsZDEoKSksIGF0KG5vZGUuY2hpbGQy
KCkpKSkgewotICAgICAgICBOb2RlSW5kZXggYnJhbmNoTm9kZUluZGV4ID0gZGV0ZWN0UGVlcEhv
bGVCcmFuY2goKTsKLSAgICAgICAgaWYgKGJyYW5jaE5vZGVJbmRleCAhPSBOb05vZGUpIHsKKyAg
ICAgICAgdW5zaWduZWQgYnJhbmNoSW5kZXhJbkJsb2NrID0gZGV0ZWN0UGVlcEhvbGVCcmFuY2go
KTsKKyAgICAgICAgaWYgKGJyYW5jaEluZGV4SW5CbG9jayAhPSBVSU5UX01BWCkgeworICAgICAg
ICAgICAgTm9kZUluZGV4IGJyYW5jaE5vZGVJbmRleCA9IG1faml0LmdyYXBoKCkubV9ibG9ja3Nb
bV9ibG9ja10tPmF0KGJyYW5jaEluZGV4SW5CbG9jayk7CiAgICAgICAgICAgICBjb21waWxlUGVl
cEhvbGVPYmplY3RFcXVhbGl0eShub2RlLCBicmFuY2hOb2RlSW5kZXgsICZKU0FycmF5OjpzX2lu
Zm8sIGlzQXJyYXlQcmVkaWN0aW9uKTsKICAgICAgICAgICAgIHVzZShub2RlLmNoaWxkMSgpKTsK
ICAgICAgICAgICAgIHVzZShub2RlLmNoaWxkMigpKTsKKyAgICAgICAgICAgIG1faW5kZXhJbkJs
b2NrID0gYnJhbmNoSW5kZXhJbkJsb2NrOwogICAgICAgICAgICAgbV9jb21waWxlSW5kZXggPSBi
cmFuY2hOb2RlSW5kZXg7CiAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgfQpJbmRl
eDogU291cmNlL0phdmFTY3JpcHRDb3JlL2RmZy9ERkdTcGVjdWxhdGl2ZUpJVC5oCj09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9kZmcvREZHU3BlY3VsYXRpdmVKSVQuaAkocmV2
aXNpb24gMTA5Mjk1KQorKysgU291cmNlL0phdmFTY3JpcHRDb3JlL2RmZy9ERkdTcGVjdWxhdGl2
ZUpJVC5oCSh3b3JraW5nIGNvcHkpCkBAIC04NzMsMjAgKzg3MywyMSBAQCBwcml2YXRlOgogICAg
ICAgICB9CiAgICAgfQogICAgIAotICAgIC8vIFJldHVybnMgdGhlIG5vZGUgaW5kZXggb2YgdGhl
IGJyYW5jaCBub2RlIGlmIHBlZXBob2xlIGlzIG9rYXksIE5vTm9kZSBvdGhlcndpc2UuCi0gICAg
Tm9kZUluZGV4IGRldGVjdFBlZXBIb2xlQnJhbmNoKCkKKyAgICAvLyBSZXR1cm5zIHRoZSBpbmRl
eCBvZiB0aGUgYnJhbmNoIG5vZGUgaWYgcGVlcGhvbGUgaXMgb2theSwgVUlOVF9NQVggb3RoZXJ3
aXNlLgorICAgIHVuc2lnbmVkIGRldGVjdFBlZXBIb2xlQnJhbmNoKCkKICAgICB7Ci0gICAgICAg
IE5vZGVJbmRleCBsYXN0Tm9kZUluZGV4ID0gbV9qaXQuZ3JhcGgoKS5tX2Jsb2Nrc1ttX2Jsb2Nr
XS0+ZW5kIC0gMTsKKyAgICAgICAgQmFzaWNCbG9jayogYmxvY2sgPSBtX2ppdC5ncmFwaCgpLm1f
YmxvY2tzW21fYmxvY2tdLmdldCgpOwogCiAgICAgICAgIC8vIENoZWNrIHRoYXQgbm8gaW50ZXJ2
ZW5pbmcgbm9kZXMgd2lsbCBiZSBnZW5lcmF0ZWQuCi0gICAgICAgIGZvciAoTm9kZUluZGV4IGlu
ZGV4ID0gbV9jb21waWxlSW5kZXggKyAxOyBpbmRleCA8IGxhc3ROb2RlSW5kZXg7ICsraW5kZXgp
IHsKLSAgICAgICAgICAgIGlmIChhdChpbmRleCkuc2hvdWxkR2VuZXJhdGUoKSkKLSAgICAgICAg
ICAgICAgICByZXR1cm4gTm9Ob2RlOworICAgICAgICBmb3IgKHVuc2lnbmVkIGluZGV4ID0gbV9p
bmRleEluQmxvY2sgKyAxOyBpbmRleCA8IGJsb2NrLT5zaXplKCkgLSAxOyArK2luZGV4KSB7Cisg
ICAgICAgICAgICBOb2RlSW5kZXggbm9kZUluZGV4ID0gYmxvY2stPmF0KGluZGV4KTsKKyAgICAg
ICAgICAgIGlmIChhdChub2RlSW5kZXgpLnNob3VsZEdlbmVyYXRlKCkpCisgICAgICAgICAgICAg
ICAgcmV0dXJuIFVJTlRfTUFYOwogICAgICAgICB9CiAKICAgICAgICAgLy8gQ2hlY2sgaWYgdGhl
IGxhc3ROb2RlIGlzIGEgYnJhbmNoIG9uIHRoaXMgbm9kZS4KLSAgICAgICAgTm9kZSYgbGFzdE5v
ZGUgPSBhdChsYXN0Tm9kZUluZGV4KTsKLSAgICAgICAgcmV0dXJuIGxhc3ROb2RlLm9wID09IEJy
YW5jaCAmJiBsYXN0Tm9kZS5jaGlsZDEoKS5pbmRleCgpID09IG1fY29tcGlsZUluZGV4ID8gbGFz
dE5vZGVJbmRleCA6IE5vTm9kZTsKKyAgICAgICAgTm9kZSYgbGFzdE5vZGUgPSBhdChibG9jay0+
bGFzdCgpKTsKKyAgICAgICAgcmV0dXJuIGxhc3ROb2RlLm9wID09IEJyYW5jaCAmJiBsYXN0Tm9k
ZS5jaGlsZDEoKS5pbmRleCgpID09IG1fY29tcGlsZUluZGV4ID8gYmxvY2stPnNpemUoKSAtIDEg
OiBVSU5UX01BWDsKICAgICB9CiAgICAgCiAgICAgdm9pZCBub25TcGVjdWxhdGl2ZVZhbHVlVG9O
dW1iZXIoTm9kZSYpOwpAQCAtMTg4MCw2ICsxODgxLDcgQEAgcHJpdmF0ZToKICAgICAvLyBUaGUg
Y3VycmVudCBub2RlIGJlaW5nIGdlbmVyYXRlZC4KICAgICBCbG9ja0luZGV4IG1fYmxvY2s7CiAg
ICAgTm9kZUluZGV4IG1fY29tcGlsZUluZGV4OworICAgIHVuc2lnbmVkIG1faW5kZXhJbkJsb2Nr
OwogICAgIC8vIFZpcnR1YWwgYW5kIHBoeXNpY2FsIHJlZ2lzdGVyIG1hcHMuCiAgICAgVmVjdG9y
PEdlbmVyYXRpb25JbmZvLCAzMj4gbV9nZW5lcmF0aW9uSW5mbzsKICAgICBSZWdpc3RlckJhbms8
R1BSSW5mbz4gbV9ncHJzOwpAQCAtMjUxMyw2ICsyNTE1LDcgQEAgaW5saW5lIFNwZWN1bGF0aXZl
SklUOjpTcGVjdWxhdGl2ZUpJVChKSQogICAgIDogbV9jb21waWxlT2theSh0cnVlKQogICAgICwg
bV9qaXQoaml0KQogICAgICwgbV9jb21waWxlSW5kZXgoMCkKKyAgICAsIG1faW5kZXhJbkJsb2Nr
KDApCiAgICAgLCBtX2dlbmVyYXRpb25JbmZvKG1faml0LmNvZGVCbG9jaygpLT5tX251bUNhbGxl
ZVJlZ2lzdGVycykKICAgICAsIG1fYmxvY2tIZWFkcyhqaXQuZ3JhcGgoKS5tX2Jsb2Nrcy5zaXpl
KCkpCiAgICAgLCBtX2FyZ3VtZW50cyhqaXQuY29kZUJsb2NrKCktPm51bVBhcmFtZXRlcnMoKSkK
SW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9kZmcvREZHVmlydHVhbFJlZ2lzdGVyQWxsb2Nh
dGlvblBoYXNlLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvZGZnL0RG
R1ZpcnR1YWxSZWdpc3RlckFsbG9jYXRpb25QaGFzZS5jcHAJKHJldmlzaW9uIDEwOTI5NSkKKysr
IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9kZmcvREZHVmlydHVhbFJlZ2lzdGVyQWxsb2NhdGlvblBo
YXNlLmNwcAkod29ya2luZyBjb3B5KQpAQCAtNDgsOCArNDgsNyBAQCBwdWJsaWM6CiAgICAgICAg
IGRhdGFMb2coIlxuIik7CiAjZW5kaWYKICAgICAgICAgU2NvcmVCb2FyZCBzY29yZUJvYXJkKG1f
Z3JhcGgsIG1fZ3JhcGgubV9wcmVzZXJ2ZWRWYXJzKTsKLSAgICAgICAgdW5zaWduZWQgc2l6ZUV4
Y2x1ZGluZ1BoaU5vZGVzID0gbV9ncmFwaC5tX2Jsb2Nrcy5sYXN0KCktPmVuZDsKLSAgICAgICAg
Zm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplRXhjbHVkaW5nUGhpTm9kZXM7ICsraSkgeworICAg
ICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1fZ3JhcGguc2l6ZSgpOyArK2kpIHsKICAgICAg
ICAgICAgIE5vZGUmIG5vZGUgPSBtX2dyYXBoW2ldOwogICAgICAgICAKICAgICAgICAgICAgIGlm
ICghbm9kZS5zaG91bGRHZW5lcmF0ZSgpIHx8IG5vZGUub3AgPT0gUGhpIHx8IG5vZGUub3AgPT0g
Rmx1c2gpCg==
</data>
<flag name="review"
          id="132347"
          type_id="1"
          status="+"
          setter="fpizlo"
    />
          </attachment>
      

    </bug>

</bugzilla>