<?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>65418</bug_id>
          
          <creation_ts>2011-07-30 16:04:40 -0700</creation_ts>
          <short_desc>webkit-patch needs to be able to &quot;optimize&quot; the storage of baselines on disk</short_desc>
          <delta_ts>2011-08-09 09:35:29 -0700</delta_ts>
          <reporter_accessible>1</reporter_accessible>
          <cclist_accessible>1</cclist_accessible>
          <classification_id>1</classification_id>
          <classification>Unclassified</classification>
          <product>WebKit</product>
          <component>New Bugs</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>64183</blocked>
          <everconfirmed>1</everconfirmed>
          <reporter name="Adam Barth">abarth</reporter>
          <assigned_to name="Adam Barth">abarth</assigned_to>
          <cc>dglazkov</cc>
    
    <cc>dpranke</cc>
    
    <cc>evan</cc>
    
    <cc>webkit.review.bot</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>444327</commentid>
    <comment_count>0</comment_count>
    <who name="Adam Barth">abarth</who>
    <bug_when>2011-07-30 16:04:40 -0700</bug_when>
    <thetext>webkit-patch needs to be able to &quot;optimize&quot; the storage of baselines on disk</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>444328</commentid>
    <comment_count>1</comment_count>
      <attachid>102443</attachid>
    <who name="Adam Barth">abarth</who>
    <bug_when>2011-07-30 16:08:13 -0700</bug_when>
    <thetext>Created attachment 102443
works, needs tests</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>444329</commentid>
    <comment_count>2</comment_count>
    <who name="Adam Barth">abarth</who>
    <bug_when>2011-07-30 16:10:35 -0700</bug_when>
    <thetext>It&apos;s slightly unclear to me what algorithm to use to compute the global optimum placement of results in the tree.  This patch has a very simple heuristic that worked on a couple examples I tried.  I&apos;m uploading this patch to checkpoint my work.  (Obviously tests are needed!)

Thoughts on a better algorithm?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>444341</commentid>
    <comment_count>3</comment_count>
    <who name="Adam Barth">abarth</who>
    <bug_when>2011-07-30 17:26:34 -0700</bug_when>
    <thetext>Interestingly, we need to take into account mac-future and mysterious qt-unknown results in order to not over optimize.  mac-future and qt-unknown are invisible to us, but they prevent us from performing certain optimizations.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>444342</commentid>
    <comment_count>4</comment_count>
      <attachid>102445</attachid>
    <who name="Adam Barth">abarth</who>
    <bug_when>2011-07-30 17:28:19 -0700</bug_when>
    <thetext>Created attachment 102445
Updated with support for invisible constraints</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>444417</commentid>
    <comment_count>5</comment_count>
      <attachid>102445</attachid>
    <who name="Dimitri Glazkov (Google)">dglazkov</who>
    <bug_when>2011-07-31 07:36:46 -0700</bug_when>
    <thetext>Comment on attachment 102445
Updated with support for invisible constraints

Freakish stuff.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>444531</commentid>
    <comment_count>6</comment_count>
      <attachid>102481</attachid>
    <who name="Adam Barth">abarth</who>
    <bug_when>2011-07-31 23:09:23 -0700</bug_when>
    <thetext>Created attachment 102481
Updated with smarter hueristic</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>444532</commentid>
    <comment_count>7</comment_count>
    <who name="Adam Barth">abarth</who>
    <bug_when>2011-07-31 23:10:47 -0700</bug_when>
    <thetext>I ran into some cases where the old heuristic failed.  This updated version of the patch applies the allocation strategy in a loop, hoping to reduce the set of unsatisfied ports to zero.  I suspect this algorithm can now go into an infinite loop if it can&apos;t allocate everything, but that hasn&apos;t happened yet.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>444951</commentid>
    <comment_count>8</comment_count>
      <attachid>102581</attachid>
    <who name="Adam Barth">abarth</who>
    <bug_when>2011-08-01 15:57:28 -0700</bug_when>
    <thetext>Created attachment 102581
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>444958</commentid>
    <comment_count>9</comment_count>
      <attachid>102581</attachid>
    <who name="Dimitri Glazkov (Google)">dglazkov</who>
    <bug_when>2011-08-01 16:02:15 -0700</bug_when>
    <thetext>Comment on attachment 102581
Patch

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

&gt; Tools/Scripts/webkitpy/common/checkout/baselineoptimizer.py:52
&gt; +def _invert_dictionarty(dictionary):

did you mean to suffix it with &quot;arty&quot;? I mean, it&apos;s pretty arty, but just want to make sure.

&gt; Tools/Scripts/webkitpy/common/checkout/baselineoptimizer_unittest.py:47
&gt; +class BaselineOptimizerTest(unittest.TestCase):

The tests seems skimpy, given the glorious complexity of the code above.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>444964</commentid>
    <comment_count>10</comment_count>
    <who name="Adam Barth">abarth</who>
    <bug_when>2011-08-01 16:08:14 -0700</bug_when>
    <thetext>(In reply to comment #9)
&gt; (From update of attachment 102581 [details])
&gt; View in context: https://bugs.webkit.org/attachment.cgi?id=102581&amp;action=review
&gt; 
&gt; &gt; Tools/Scripts/webkitpy/common/checkout/baselineoptimizer.py:52
&gt; &gt; +def _invert_dictionarty(dictionary):
&gt; 
&gt; did you mean to suffix it with &quot;arty&quot;? I mean, it&apos;s pretty arty, but just want to make sure.

Fixed.

&gt; &gt; Tools/Scripts/webkitpy/common/checkout/baselineoptimizer_unittest.py:47
&gt; &gt; +class BaselineOptimizerTest(unittest.TestCase):
&gt; 
&gt; The tests seems skimpy, given the glorious complexity of the code above.

Ok.  I&apos;ve added a couple more tricky cases.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>444965</commentid>
    <comment_count>11</comment_count>
      <attachid>102585</attachid>
    <who name="Adam Barth">abarth</who>
    <bug_when>2011-08-01 16:08:34 -0700</bug_when>
    <thetext>Created attachment 102585
Patch for landing</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>445004</commentid>
    <comment_count>12</comment_count>
      <attachid>102585</attachid>
    <who name="WebKit Review Bot">webkit.review.bot</who>
    <bug_when>2011-08-01 17:07:29 -0700</bug_when>
    <thetext>Comment on attachment 102585
Patch for landing

Clearing flags on attachment: 102585

Committed r92153: &lt;http://trac.webkit.org/changeset/92153&gt;</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>445005</commentid>
    <comment_count>13</comment_count>
    <who name="WebKit Review Bot">webkit.review.bot</who>
    <bug_when>2011-08-01 17:07:36 -0700</bug_when>
    <thetext>All reviewed patches have been landed.  Closing bug.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>448407</commentid>
    <comment_count>14</comment_count>
    <who name="Dirk Pranke">dpranke</who>
    <bug_when>2011-08-08 18:52:24 -0700</bug_when>
    <thetext>Hm. Okay, I wasn&apos;t a math major, but I would consider myself at least reasonably conversant in graph theory, and yet I have not encountered the concept of a &quot;hypergraph&quot; before. Further, the description in wikipedia did not make things particularly clear to me. 

Would it be possible to get some explanation of (a) why the fallback path is a hypergraph and/or (b) what the algorithm is intended to be as comments in either this bug or the code itself? 

As far as (b) goes, I can accept the answer that it&apos;s not possible to summarize the algorithm/heuristic any more simply than the code does itself, in which case I can take another look at it. 

This is more intended to be the sort of feedback that &quot;wow this code is non-obvious and I&apos;d really want more comments on it than it has&quot;. 

I would also be curious to know what sort of improvements this optimizing gives us over the simpler deduplicating algorithms we have used in the past?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>448431</commentid>
    <comment_count>15</comment_count>
    <who name="Adam Barth">abarth</who>
    <bug_when>2011-08-08 21:47:33 -0700</bug_when>
    <thetext>&gt; Would it be possible to get some explanation of (a) why the fallback path is a hypergraph and/or

There are lots of different representations of hypergraphs.  One that maps nicely onto this problem is to imagine traversing a graph, but that the edges available to add to your patch at any given vertex depend on which edges you&apos;ve already added to your path.  In a normal graph, path construction is history-independent, but in a hypergraph, it is history dependent.

It&apos;s easy to see that the fallback data structure is a hypergraph.  Consider constructing a path that transits the &quot;chromium&quot; node in the graph (e.g., a fallback path that involves LayoutTests/platform/chromium).  Which edges are available depends on how you got to this vertex.  For example, if you came via chromium-mac, then an edge to mac-snowleopard is available, but if you came via chromium-win, then it is not.

&gt; (b) what the algorithm is intended to be as comments in either this bug or the code itself? 

I&apos;m happy to make the code more readable.  The outline of the algorithm is as follows:

1) Compute the operative expectations for every port (e.g., by walking all the fallback paths).
2) Compute the optimal directories to store expectations in the fallback hypergraph such that the operative expectations are the same.
3) Compare the operative expectations from before and after the re-allocation to make sure we haven&apos;t screwed anything up.
4) Move the expected results around to realize the new storage locations.

That much of the algorithm is fairly straightforward.  The tough part is step (2).  For that, we take all the ports that have the same expected result, compute the set of directories they have in common, and then attempt to store the result in the most specific such directory (based on some scoring algorithm).  Repeat this process until you&apos;ve either satisfied all the ports or you fail to make progress.

This algorithm is just heuristic.  There&apos;s no guantee that it works in the general case, which is why step (3) is important.  It seems to work reasonably well on the examples I&apos;ve tried, but I expect we&apos;ll need to refine it over time.

&gt; As far as (b) goes, I can accept the answer that it&apos;s not possible to summarize the algorithm/heuristic any more simply than the code does itself, in which case I can take another look at it. 

What&apos;s more important is the test cases that show the before/after allocations.  I&apos;m not that keen on adding comments because I expect the algorithm will change over time as we learn more.

&gt; This is more intended to be the sort of feedback that &quot;wow this code is non-obvious and I&apos;d really want more comments on it than it has&quot;. 

Yes, this algorithm is very non-obvious.  It&apos;s probably one of the trickier algorithms I&apos;ve written in a while.

&gt; I would also be curious to know what sort of improvements this optimizing gives us over the simpler deduplicating algorithms we have used in the past?

This algorithm is massively better than any previous algorithm we&apos;ve had.  For example, here&apos;s a patch that deletes tons of redundant baselines:

http://trac.webkit.org/changeset/92648

I&apos;ve been generating many patches like that as I&apos;ve bene testing the algorithm.

The main advantage that this algorithm has over its predecessors is that it knows how to *move* baseline around whereas deduplicate-tests only knows how to delete results and rebaseline-chromium-whatever only knew how to not add redundant results.

I would have preferred to change the fallback system to not be insanely complicated, which would have made the optimization algorithm trivial, but webkit-dev wasn&apos;t too keen on that idea.  Rather than argue about it, I just made this algorithm smart and now I don&apos;t have to worry about it.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>448618</commentid>
    <comment_count>16</comment_count>
    <who name="Dirk Pranke">dpranke</who>
    <bug_when>2011-08-09 09:22:44 -0700</bug_when>
    <thetext>(In reply to comment #15)
&gt; &gt; Would it be possible to get some explanation of (a) why the fallback path is a hypergraph and/or
&gt; 
&gt; There are lots of different representations of hypergraphs.  One that maps nicely onto this problem is to imagine traversing a graph, but that the edges available to add to your patch at any given vertex depend on which edges you&apos;ve already added to your path.  In a normal graph, path construction is history-independent, but in a hypergraph, it is history dependent.
&gt; 

Thanks, that makes sense, but I didn&apos;t get that from wikipedia at all :(

&gt; 
&gt; That much of the algorithm is fairly straightforward.  The tough part is step (2).  For that, we take all the ports that have the same expected result, compute the set of directories they have in common, and then attempt to store the result in the most specific such directory (based on some scoring algorithm).  Repeat this process until you&apos;ve either satisfied all the ports or you fail to make progress.
&gt; 
&gt; This algorithm is just heuristic.  There&apos;s no guantee that it works in the general case, which is why step (3) is important.  It seems to work reasonably well on the examples I&apos;ve tried, but I expect we&apos;ll need to refine it over time

Hm. I will stare at this part of the code further. Agreed that this is the tough part :)
 
&gt; 
&gt; What&apos;s more important is the test cases that show the before/after allocations.  I&apos;m not that keen on adding comments because I expect the algorithm will change over time as we learn more.
&gt;

I agree that the test cases are the main thing; however, reading them to figure out what is actually happening can be hard to follow and error-prone (since the paths and checksums are long). If you look at what I did in rebaseline-chromium-whatever&apos;s unit tests, I tried to add short comments indicating what and maybe a little why, but not how.

&gt; This algorithm is massively better than any previous algorithm we&apos;ve had.

No question, the previous algorithms were pretty simple. Do you have anything like aggregate stats for the tree, e.g., we had 1000 duplicated files before, 500 after?

Thanks for explaining!</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>448621</commentid>
    <comment_count>17</comment_count>
    <who name="Adam Barth">abarth</who>
    <bug_when>2011-08-09 09:35:29 -0700</bug_when>
    <thetext>No stats yet.  I&apos;m optimizing a block at a time to test the algorithm.  Basically any test that has the same results on chromium-mac and chromium-win will have redundant results today.</thetext>
  </long_desc>
      
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>102443</attachid>
            <date>2011-07-30 16:08:13 -0700</date>
            <delta_ts>2011-07-30 17:28:16 -0700</delta_ts>
            <desc>works, needs tests</desc>
            <filename>bug-65418-20110730160812.patch</filename>
            <type>text/plain</type>
            <size>8004</size>
            <attacher name="Adam Barth">abarth</attacher>
            
              <data encoding="base64">U3VidmVyc2lvbiBSZXZpc2lvbjogOTIwNTcKZGlmZiAtLWdpdCBhL1Rvb2xzL0NoYW5nZUxvZyBi
L1Rvb2xzL0NoYW5nZUxvZwppbmRleCA3MTQ1ZjA0NzM1OGNkNDJiN2M5M2M0MGQ3OGE5ODIyZGU5
MDNhOGY5Li4yNjZmNTI1ZGFlMjNmMGI5NmI5NDkyOGVhMjRiMWFmZDY4OTg3MDRlIDEwMDY0NAot
LS0gYS9Ub29scy9DaGFuZ2VMb2cKKysrIGIvVG9vbHMvQ2hhbmdlTG9nCkBAIC0xLDUgKzEsMjYg
QEAKIDIwMTEtMDctMzAgIEFkYW0gQmFydGggIDxhYmFydGhAd2Via2l0Lm9yZz4KIAorICAgICAg
ICB3ZWJraXQtcGF0Y2ggbmVlZHMgdG8gYmUgYWJsZSB0byAib3B0aW1pemUiIHRoZSBzdG9yYWdl
IG9mIGJhc2VsaW5lcyBvbiBkaXNrCisgICAgICAgIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3No
b3dfYnVnLmNnaT9pZD02NTQxOAorCisgICAgICAgIFJldmlld2VkIGJ5IE5PQk9EWSAoT09QUyEp
LgorCisgICAgICAgIElmIHdlJ3JlIG5vdCBjYXJlZnVsIHdoZW4gcmViYXNlbGluaW5nIHRlc3Rz
LCB3ZSBjYW4gZW5kIHVwIHdpdGggbG90cworICAgICAgICBvZiBkdXBsaWNhdGUgZXhwZWN0ZWQg
cmVzdWx0cyBmaWxlcyBpbiB0aGUgdHJlZS4gIFRoaXMgcGF0Y2ggYWRkcyBhCisgICAgICAgIHdl
YmtpdC1wYXRjaCBjb21tYW5kIHRoYXQgb3B0aW1pemVzIHRoZSBzdG9yYWdlIG9mIGV4cGVjdGVk
IHJlc3VsdHMgb24KKyAgICAgICAgZGlzay4KKworICAgICAgICBUaGlzIGNvbW1hbmQgaXMgc2lt
aWxhciB0byBkZWR1cGxpY2F0ZS10ZXN0cywgZXhjZXB0IHRoYXQgaXQgY2FuIG1vdmUKKyAgICAg
ICAgdGVzdCByZXN1bHRzIGFyb3VuZCByYXRoZXIgdGhhbiBqdXN0IHJlbW92ZSBkdXBsaWNhdGUg
cmVzdWx0cy4KKworICAgICAgICBVbmZvcnR1bmF0ZWx5LCB0aGlzIHByb2JsZW0gaXMgdmVyeSB0
cmlja3kgYmVjYXVzZSB0aGUgYmFzZWxpbmUgc2VhcmNoCisgICAgICAgIHN0cnVjdHVyZSBpcyBh
IGh5cGVyZ3JhcGguCisKKyAgICAgICAgKiBTY3JpcHRzL3dlYmtpdHB5L2NvbW1vbi9zeXN0ZW0v
ZmlsZXN5c3RlbS5weToKKyAgICAgICAgKiBTY3JpcHRzL3dlYmtpdHB5L3Rvb2wvY29tbWFuZHMv
cmViYXNlbGluZS5weToKKworMjAxMS0wNy0zMCAgQWRhbSBCYXJ0aCAgPGFiYXJ0aEB3ZWJraXQu
b3JnPgorCiAgICAgICAgIGdhcmRlbi1vLW1hdGljIHJlZ3Jlc3Npb24gcmFuZ2VzIGV4cGFuZCBh
ZnRlciBmYXN0IGJvdHMgc3RhcnQgcGFzc2luZwogICAgICAgICBodHRwczovL2J1Z3Mud2Via2l0
Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NjU0MDYKIApkaWZmIC0tZ2l0IGEvVG9vbHMvU2NyaXB0cy93
ZWJraXRweS9jb21tb24vc3lzdGVtL2ZpbGVzeXN0ZW0ucHkgYi9Ub29scy9TY3JpcHRzL3dlYmtp
dHB5L2NvbW1vbi9zeXN0ZW0vZmlsZXN5c3RlbS5weQppbmRleCAwYWY2ZWM4OTE1MjY1ZTQ1YzMz
NTBhY2UyNGY2NWUxM2M5NTAyZjUyLi43ZGU0MWE0MjRkMWJiY2Y5NTFiZWNhMmZlOGU0YTU0OTQy
MWE2ZDgyIDEwMDY0NAotLS0gYS9Ub29scy9TY3JpcHRzL3dlYmtpdHB5L2NvbW1vbi9zeXN0ZW0v
ZmlsZXN5c3RlbS5weQorKysgYi9Ub29scy9TY3JpcHRzL3dlYmtpdHB5L2NvbW1vbi9zeXN0ZW0v
ZmlsZXN5c3RlbS5weQpAQCAtMzQsNiArMzQsNyBAQCBpbXBvcnQgY29kZWNzCiBpbXBvcnQgZXJy
bm8KIGltcG9ydCBleGNlcHRpb25zCiBpbXBvcnQgZ2xvYgoraW1wb3J0IGhhc2hsaWIKIGltcG9y
dCBvcwogaW1wb3J0IHNodXRpbAogaW1wb3J0IHN5cwpAQCAtMjIzLDYgKzIyNCwxMCBAQCBjbGFz
cyBGaWxlU3lzdGVtKG9iamVjdCk6CiAgICAgICAgIHdpdGggY29kZWNzLm9wZW4ocGF0aCwgJ3cn
LCAndXRmOCcpIGFzIGY6CiAgICAgICAgICAgICBmLndyaXRlKGNvbnRlbnRzKQogCisgICAgZGVm
IHNoYTEoc2VsZiwgcGF0aCk6CisgICAgICAgIGNvbnRlbnRzID0gc2VsZi5yZWFkX2JpbmFyeV9m
aWxlKHBhdGgpCisgICAgICAgIHJldHVybiBoYXNobGliLnNoYTEoY29udGVudHMpLmhleGRpZ2Vz
dCgpCisKICAgICBkZWYgcmVscGF0aChzZWxmLCBwYXRoLCBzdGFydD0nLicpOgogICAgICAgICBy
ZXR1cm4gb3NwYXRoLnJlbHBhdGgocGF0aCwgc3RhcnQpCiAKZGlmZiAtLWdpdCBhL1Rvb2xzL1Nj
cmlwdHMvd2Via2l0cHkvdG9vbC9jb21tYW5kcy9yZWJhc2VsaW5lLnB5IGIvVG9vbHMvU2NyaXB0
cy93ZWJraXRweS90b29sL2NvbW1hbmRzL3JlYmFzZWxpbmUucHkKaW5kZXggZDhiYzYwMjQxMjVk
ZGJkZjk4MjkyMmIzNjUxYzdiMTM4MmU2YWRhYS4uNThmMzk2ZGM4OGU0ZGM2YmM2OGNlZGMwYzI1
OWUzNDNiZTRkM2JlNiAxMDA2NDQKLS0tIGEvVG9vbHMvU2NyaXB0cy93ZWJraXRweS90b29sL2Nv
bW1hbmRzL3JlYmFzZWxpbmUucHkKKysrIGIvVG9vbHMvU2NyaXB0cy93ZWJraXRweS90b29sL2Nv
bW1hbmRzL3JlYmFzZWxpbmUucHkKQEAgLTM1LDYgKzM1LDcgQEAgaW1wb3J0IHdlYmtpdHB5LmNv
bW1vbi5jb25maWcudXJscyBhcyBjb25maWdfdXJscwogZnJvbSB3ZWJraXRweS5jb21tb24ubmV0
LmJ1aWxkYm90IGltcG9ydCBCdWlsZEJvdAogZnJvbSB3ZWJraXRweS5jb21tb24ubmV0LmxheW91
dHRlc3RyZXN1bHRzIGltcG9ydCBMYXlvdXRUZXN0UmVzdWx0cwogZnJvbSB3ZWJraXRweS5jb21t
b24uc3lzdGVtLnVzZXIgaW1wb3J0IFVzZXIKK2Zyb20gd2Via2l0cHkubGF5b3V0X3Rlc3RzLmxh
eW91dF9wYWNrYWdlLnRlc3RfcmVzdWx0X3dyaXRlciBpbXBvcnQgVGVzdFJlc3VsdFdyaXRlcgog
ZnJvbSB3ZWJraXRweS5sYXlvdXRfdGVzdHMubW9kZWxzIGltcG9ydCB0ZXN0X2ZhaWx1cmVzCiBm
cm9tIHdlYmtpdHB5LmxheW91dF90ZXN0cy5wb3J0IGltcG9ydCBmYWN0b3J5CiBmcm9tIHdlYmtp
dHB5LnRvb2wuZ3JhbW1hciBpbXBvcnQgcGx1cmFsaXplCkBAIC0xMjgsNiArMTI5LDEwNSBAQCBj
bGFzcyBSZWJhc2VsaW5lVGVzdChBYnN0cmFjdERlY2xhcmF0aXZlQ29tbWFuZCk6CiAgICAgICAg
IHNlbGYuX3JlYmFzZWxpbmVfdGVzdChhcmdzWzBdLCBhcmdzWzFdLCBhcmdzWzJdKQogCiAKK2Zy
b20gd2Via2l0cHkubGF5b3V0X3Rlc3RzLnBvcnQgaW1wb3J0IGZhY3RvcnkgYXMgcG9ydF9mYWN0
b3J5CisKKworY2xhc3MgT3B0aW1pemVCYXNlbGluZXMoQWJzdHJhY3REZWNsYXJhdGl2ZUNvbW1h
bmQpOgorICAgIG5hbWUgPSAib3B0aW1pemUtYmFzZWxpbmVzIgorICAgIGhlbHBfdGV4dCA9ICJS
ZXNodWZmbGVzIHRoZSBiYXNlbGluZXMgZm9yIGEgdGhlIGdpdmVuIHRlc3QgdG8gdXNlIGFzIGxp
dHRlIHNwYWNlIG9uIGRpc2sgYXMgcG9zc2libGUuIgorICAgIGFyZ3VtZW50X25hbWVzID0gIlRF
U1RfTkFNRSIKKworICAgICMgWWVzLCBpdCdzIGEgaHlwZXJncmFwaC4KKyAgICBkZWYgX2Jhc2Vs
aW5lX3NlYXJjaF9oeXBlcmdyYXBoKHNlbGYpOgorICAgICAgICBoeXBlcmdyYXBoID0ge30KKyAg
ICAgICAgZm9yIHBvcnRfbmFtZSBpbiBwb3J0X2ZhY3RvcnkuYWxsX3BvcnRfbmFtZXMoKToKKyAg
ICAgICAgICAgIHNlYXJjaF9wYXRoID0gcG9ydF9mYWN0b3J5LmdldChwb3J0X25hbWUpLmJhc2Vs
aW5lX3NlYXJjaF9wYXRoKCkKKyAgICAgICAgICAgIGlmIHNlYXJjaF9wYXRoOgorICAgICAgICAg
ICAgICAgIGh5cGVyZ3JhcGhbcG9ydF9uYW1lXSA9IHNlYXJjaF9wYXRoCisgICAgICAgIHJldHVy
biBoeXBlcmdyYXBoCisKKyAgICBkZWYgX3JlYWRfcmVzdWx0cyhzZWxmLCBkaXJlY3Rvcmllcywg
YmFzZWxpbmVfbmFtZSk6CisgICAgICAgIHJlc3VsdHNfYnlfZGlyZWN0b3J5ID0ge30KKyAgICAg
ICAgZm9yIGRpcmVjdG9yeSBpbiBkaXJlY3RvcmllczoKKyAgICAgICAgICAgIHBhdGggPSBzZWxm
Ll9mcy5qb2luKGRpcmVjdG9yeSwgYmFzZWxpbmVfbmFtZSkKKyAgICAgICAgICAgIGlmIHNlbGYu
X2ZzLmV4aXN0cyhwYXRoKToKKyAgICAgICAgICAgICAgICByZXN1bHRzX2J5X2RpcmVjdG9yeVtk
aXJlY3RvcnldID0gc2VsZi5fZnMuc2hhMShwYXRoKQorICAgICAgICByZXR1cm4gcmVzdWx0c19i
eV9kaXJlY3RvcnkKKworICAgIGRlZiBfcmVzdWx0c19ieV9wb3J0X25hbWUoc2VsZiwgaHlwZXJn
cmFwaCwgcmVzdWx0c19ieV9kaXJlY3RvcnkpOgorICAgICAgICBvYnNlcnZhdGlvbnMgPSB7fQor
ICAgICAgICBmb3IgcG9ydF9uYW1lLCBzZWFyY2hfcGF0aCBpbiBoeXBlcmdyYXBoLml0ZW1zKCk6
CisgICAgICAgICAgICBmb3IgZGlyZWN0b3J5IGluIHNlYXJjaF9wYXRoOgorICAgICAgICAgICAg
ICAgIGlmIGRpcmVjdG9yeSBpbiByZXN1bHRzX2J5X2RpcmVjdG9yeToKKyAgICAgICAgICAgICAg
ICAgICAgb2JzZXJ2YXRpb25zW3BvcnRfbmFtZV0gPSByZXN1bHRzX2J5X2RpcmVjdG9yeVtkaXJl
Y3RvcnldCisgICAgICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgIHJldHVybiBvYnNlcnZh
dGlvbnMKKworICAgIGRlZiBfZ3JvdXBfcG9ydF9uYW1lc19ieV9yZXN1bHQoc2VsZiwgb2JzZXJ2
YXRpb25zKToKKyAgICAgICAgb2JzZXJ2YXRpb25zX2J5X3Jlc3VsdCA9IHt9CisgICAgICAgIGZv
ciBwb3J0X25hbWUsIHJlc3VsdCBpbiBvYnNlcnZhdGlvbnMuaXRlbXMoKToKKyAgICAgICAgICAg
IGlmIG9ic2VydmF0aW9uc19ieV9yZXN1bHQuZ2V0KHJlc3VsdCk6CisgICAgICAgICAgICAgICAg
b2JzZXJ2YXRpb25zX2J5X3Jlc3VsdFtyZXN1bHRdLmFwcGVuZChwb3J0X25hbWUpCisgICAgICAg
ICAgICBlbHNlOgorICAgICAgICAgICAgICAgIG9ic2VydmF0aW9uc19ieV9yZXN1bHRbcmVzdWx0
XSA9IFtwb3J0X25hbWVdCisgICAgICAgIHJldHVybiBvYnNlcnZhdGlvbnNfYnlfcmVzdWx0CisK
KyAgICBkZWYgX21vc3Rfc3BlY2lmaWNfY29tbW9uX2RpcmVjdG9yeShzZWxmLCBwb3J0X25hbWVz
LCBoeXBlcmdyYXBoKToKKyAgICAgICAgcGF0aHMgPSBbaHlwZXJncmFwaFtwb3J0X25hbWVdIGZv
ciBwb3J0X25hbWUgaW4gcG9ydF9uYW1lc10KKyAgICAgICAgY29tbW9uX2RpcmVjdG9yaWVzID0g
cmVkdWNlKHNldC5pbnRlcnNlY3Rpb24sIG1hcChzZXQsIHBhdGhzKSkKKyAgICAgICAgc2NvcmUs
IGRpcmVjdG9yeSA9IHNvcnRlZChbKHN1bShbcGF0aC5pbmRleChkaXJlY3RvcnkpIGZvciBwYXRo
IGluIHBhdGhzXSksIGRpcmVjdG9yeSkgZm9yIGRpcmVjdG9yeSBpbiBjb21tb25fZGlyZWN0b3Jp
ZXNdKVswXQorICAgICAgICByZXR1cm4gZGlyZWN0b3J5CisKKyAgICBkZWYgX2ZpbmRfb3B0aW1h
bF9yZXN1bHRfcGxhY2VtZW50KHNlbGYsIGh5cGVyZ3JhcGgsIGRpcmVjdG9yaWVzLCBiYXNlbGlu
ZV9uYW1lKToKKyAgICAgICAgcmVzdWx0c19ieV9kaXJlY3RvcnkgPSBzZWxmLl9yZWFkX3Jlc3Vs
dHMoZGlyZWN0b3JpZXMsIGJhc2VsaW5lX25hbWUpCisgICAgICAgIHJlc3VsdHNfYnlfcG9ydF9u
YW1lID0gc2VsZi5fcmVzdWx0c19ieV9wb3J0X25hbWUoaHlwZXJncmFwaCwgcmVzdWx0c19ieV9k
aXJlY3RvcnkpCisgICAgICAgIHBvcnRfbmFtZXNfYnlfcmVzdWx0ID0gc2VsZi5fZ3JvdXBfcG9y
dF9uYW1lc19ieV9yZXN1bHQocmVzdWx0c19ieV9wb3J0X25hbWUpCisKKyAgICAgICAgbmV3X3Jl
c3VsdHNfYnlfZGlyZWN0b3J5ID0ge30KKyAgICAgICAgZm9yIHJlc3VsdCwgcG9ydF9uYW1lcyBp
biBwb3J0X25hbWVzX2J5X3Jlc3VsdC5pdGVtcygpOgorICAgICAgICAgICAgZGlyZWN0b3J5ID0g
c2VsZi5fbW9zdF9zcGVjaWZpY19jb21tb25fZGlyZWN0b3J5KHBvcnRfbmFtZXMsIGh5cGVyZ3Jh
cGgpCisgICAgICAgICAgICBuZXdfcmVzdWx0c19ieV9kaXJlY3RvcnlbZGlyZWN0b3J5XSA9IHJl
c3VsdAorCisgICAgICAgIHJldHVybiByZXN1bHRzX2J5X2RpcmVjdG9yeSwgbmV3X3Jlc3VsdHNf
YnlfZGlyZWN0b3J5CisKKyAgICBkZWYgX21vdmVfYmFzZWxpbmVzKHNlbGYsIGJhc2VsaW5lX25h
bWUsIHJlc3VsdHNfYnlfZGlyZWN0b3J5LCBuZXdfcmVzdWx0c19ieV9kaXJlY3RvcnkpOgorICAg
ICAgICBzb3VyY2VfZGlyZWN0b3J5X2Zvcl9yZXN1bHQgPSB7fQorICAgICAgICBmb3IgZGlyZWN0
b3J5LCByZXN1bHQgaW4gcmVzdWx0c19ieV9kaXJlY3RvcnkuaXRlbXMoKToKKyAgICAgICAgICAg
IHNvdXJjZV9kaXJlY3RvcnlfZm9yX3Jlc3VsdFtyZXN1bHRdID0gZGlyZWN0b3J5CisKKyAgICAg
ICAgZm9yIGRpcmVjdG9yeSwgcmVzdWx0IGluIG5ld19yZXN1bHRzX2J5X2RpcmVjdG9yeS5pdGVt
cygpOgorICAgICAgICAgICAgaWYgcmVzdWx0c19ieV9kaXJlY3RvcnkuZ2V0KGRpcmVjdG9yeSkg
IT0gcmVzdWx0OgorICAgICAgICAgICAgICAgIHNvdXJjZSA9IHNlbGYuX2ZzLmpvaW4oc291cmNl
X2RpcmVjdG9yeV9mb3JfcmVzdWx0W3Jlc3VsdF0sIGJhc2VsaW5lX25hbWUpCisgICAgICAgICAg
ICAgICAgZGVzdGluYXRpb24gPSBzZWxmLl9mcy5qb2luKGRpcmVjdG9yeSwgYmFzZWxpbmVfbmFt
ZSkKKyAgICAgICAgICAgICAgICBzZWxmLl9mcy5tYXliZV9tYWtlX2RpcmVjdG9yeShzZWxmLl9m
cy5zcGxpdChkZXN0aW5hdGlvbilbMF0pCisgICAgICAgICAgICAgICAgc2VsZi5fZnMuY29weWZp
bGUoc291cmNlLCBkZXN0aW5hdGlvbikKKyAgICAgICAgICAgICAgICBzZWxmLl90b29sLnNjbSgp
LmFkZChkZXN0aW5hdGlvbikKKworICAgICAgICBmb3IgZGlyZWN0b3J5LCByZXN1bHQgaW4gcmVz
dWx0c19ieV9kaXJlY3RvcnkuaXRlbXMoKToKKyAgICAgICAgICAgIGlmIG5ld19yZXN1bHRzX2J5
X2RpcmVjdG9yeS5nZXQoZGlyZWN0b3J5KSAhPSByZXN1bHQ6CisgICAgICAgICAgICAgICAgZmls
ZV9uYW1lID0gc2VsZi5fZnMuam9pbihkaXJlY3RvcnksIGJhc2VsaW5lX25hbWUpCisgICAgICAg
ICAgICAgICAgc2VsZi5fdG9vbC5zY20oKS5kZWxldGUoZmlsZV9uYW1lKQorCisgICAgZGVmIF9v
cHRpbWl6ZShzZWxmLCBoeXBlcmdyYXBoLCBkaXJlY3RvcmllcywgYmFzZWxpbmVfbmFtZSk6Cisg
ICAgICAgIHJlc3VsdHNfYnlfZGlyZWN0b3J5LCBuZXdfcmVzdWx0c19ieV9kaXJlY3RvcnkgPSBz
ZWxmLl9maW5kX29wdGltYWxfcmVzdWx0X3BsYWNlbWVudChoeXBlcmdyYXBoLCBkaXJlY3Rvcmll
cywgYmFzZWxpbmVfbmFtZSkKKyAgICAgICAgaWYgc2VsZi5fcmVzdWx0c19ieV9wb3J0X25hbWUo
aHlwZXJncmFwaCwgcmVzdWx0c19ieV9kaXJlY3RvcnkpICE9IHNlbGYuX3Jlc3VsdHNfYnlfcG9y
dF9uYW1lKGh5cGVyZ3JhcGgsIG5ld19yZXN1bHRzX2J5X2RpcmVjdG9yeSk6CisgICAgICAgICAg
ICBsb2coJ0h1ZXJpc3RpYyBhbGxvY2F0aW9uIGZhaWxlZC4gVW5hYmxlIHRvIG9wdGltaXplICVz
LicgJSBiYXNlbGluZV9uYW1lKQorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIHNlbGYuX21v
dmVfYmFzZWxpbmVzKGJhc2VsaW5lX25hbWUsIHJlc3VsdHNfYnlfZGlyZWN0b3J5LCBuZXdfcmVz
dWx0c19ieV9kaXJlY3RvcnkpCisKKyAgICBkZWYgZXhlY3V0ZShzZWxmLCBvcHRpb25zLCBhcmdz
LCB0b29sKToKKyAgICAgICAgc2VsZi5fZnMgPSB0b29sLmZpbGVzeXN0ZW0KKworICAgICAgICB0
ZXN0X25hbWUgPSBhcmdzWzBdCisKKyAgICAgICAgaHlwZXJncmFwaCA9IHNlbGYuX2Jhc2VsaW5l
X3NlYXJjaF9oeXBlcmdyYXBoKCkKKyAgICAgICAgZGlyZWN0b3JpZXMgPSByZWR1Y2Uoc2V0LnVu
aW9uLCBtYXAoc2V0LCBoeXBlcmdyYXBoLnZhbHVlcygpKSkKKworICAgICAgICBmb3Igc3VmZml4
IGluIFsnLnBuZycsICcudHh0J106CisgICAgICAgICAgICBiYXNlbGluZV9uYW1lID0gc2VsZi5f
ZnMuc3BsaXRleHQodGVzdF9uYW1lKVswXSArIFRlc3RSZXN1bHRXcml0ZXIuRklMRU5BTUVfU1VG
RklYX0VYUEVDVEVEICsgc3VmZml4CisgICAgICAgICAgICBzZWxmLl9vcHRpbWl6ZShoeXBlcmdy
YXBoLCBkaXJlY3RvcmllcywgYmFzZWxpbmVfbmFtZSkKKworCiBjbGFzcyBSZWJhc2VsaW5lKEFi
c3RyYWN0RGVjbGFyYXRpdmVDb21tYW5kKToKICAgICBuYW1lID0gInJlYmFzZWxpbmUiCiAgICAg
aGVscF90ZXh0ID0gIlJlcGxhY2VzIGxvY2FsIGV4cGVjdGVkLnR4dCBmaWxlcyB3aXRoIG5ldyBy
ZXN1bHRzIGZyb20gYnVpbGQgYm90cyIK
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>102445</attachid>
            <date>2011-07-30 17:28:19 -0700</date>
            <delta_ts>2011-07-31 23:09:19 -0700</delta_ts>
            <desc>Updated with support for invisible constraints</desc>
            <filename>bug-65418-20110730172818.patch</filename>
            <type>text/plain</type>
            <size>9432</size>
            <attacher name="Adam Barth">abarth</attacher>
            
              <data encoding="base64">U3VidmVyc2lvbiBSZXZpc2lvbjogOTIwNTcKZGlmZiAtLWdpdCBhL1Rvb2xzL0NoYW5nZUxvZyBi
L1Rvb2xzL0NoYW5nZUxvZwppbmRleCA3MTQ1ZjA0NzM1OGNkNDJiN2M5M2M0MGQ3OGE5ODIyZGU5
MDNhOGY5Li4yNjZmNTI1ZGFlMjNmMGI5NmI5NDkyOGVhMjRiMWFmZDY4OTg3MDRlIDEwMDY0NAot
LS0gYS9Ub29scy9DaGFuZ2VMb2cKKysrIGIvVG9vbHMvQ2hhbmdlTG9nCkBAIC0xLDUgKzEsMjYg
QEAKIDIwMTEtMDctMzAgIEFkYW0gQmFydGggIDxhYmFydGhAd2Via2l0Lm9yZz4KIAorICAgICAg
ICB3ZWJraXQtcGF0Y2ggbmVlZHMgdG8gYmUgYWJsZSB0byAib3B0aW1pemUiIHRoZSBzdG9yYWdl
IG9mIGJhc2VsaW5lcyBvbiBkaXNrCisgICAgICAgIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3No
b3dfYnVnLmNnaT9pZD02NTQxOAorCisgICAgICAgIFJldmlld2VkIGJ5IE5PQk9EWSAoT09QUyEp
LgorCisgICAgICAgIElmIHdlJ3JlIG5vdCBjYXJlZnVsIHdoZW4gcmViYXNlbGluaW5nIHRlc3Rz
LCB3ZSBjYW4gZW5kIHVwIHdpdGggbG90cworICAgICAgICBvZiBkdXBsaWNhdGUgZXhwZWN0ZWQg
cmVzdWx0cyBmaWxlcyBpbiB0aGUgdHJlZS4gIFRoaXMgcGF0Y2ggYWRkcyBhCisgICAgICAgIHdl
YmtpdC1wYXRjaCBjb21tYW5kIHRoYXQgb3B0aW1pemVzIHRoZSBzdG9yYWdlIG9mIGV4cGVjdGVk
IHJlc3VsdHMgb24KKyAgICAgICAgZGlzay4KKworICAgICAgICBUaGlzIGNvbW1hbmQgaXMgc2lt
aWxhciB0byBkZWR1cGxpY2F0ZS10ZXN0cywgZXhjZXB0IHRoYXQgaXQgY2FuIG1vdmUKKyAgICAg
ICAgdGVzdCByZXN1bHRzIGFyb3VuZCByYXRoZXIgdGhhbiBqdXN0IHJlbW92ZSBkdXBsaWNhdGUg
cmVzdWx0cy4KKworICAgICAgICBVbmZvcnR1bmF0ZWx5LCB0aGlzIHByb2JsZW0gaXMgdmVyeSB0
cmlja3kgYmVjYXVzZSB0aGUgYmFzZWxpbmUgc2VhcmNoCisgICAgICAgIHN0cnVjdHVyZSBpcyBh
IGh5cGVyZ3JhcGguCisKKyAgICAgICAgKiBTY3JpcHRzL3dlYmtpdHB5L2NvbW1vbi9zeXN0ZW0v
ZmlsZXN5c3RlbS5weToKKyAgICAgICAgKiBTY3JpcHRzL3dlYmtpdHB5L3Rvb2wvY29tbWFuZHMv
cmViYXNlbGluZS5weToKKworMjAxMS0wNy0zMCAgQWRhbSBCYXJ0aCAgPGFiYXJ0aEB3ZWJraXQu
b3JnPgorCiAgICAgICAgIGdhcmRlbi1vLW1hdGljIHJlZ3Jlc3Npb24gcmFuZ2VzIGV4cGFuZCBh
ZnRlciBmYXN0IGJvdHMgc3RhcnQgcGFzc2luZwogICAgICAgICBodHRwczovL2J1Z3Mud2Via2l0
Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NjU0MDYKIApkaWZmIC0tZ2l0IGEvVG9vbHMvU2NyaXB0cy93
ZWJraXRweS9jb21tb24vc3lzdGVtL2ZpbGVzeXN0ZW0ucHkgYi9Ub29scy9TY3JpcHRzL3dlYmtp
dHB5L2NvbW1vbi9zeXN0ZW0vZmlsZXN5c3RlbS5weQppbmRleCAwYWY2ZWM4OTE1MjY1ZTQ1YzMz
NTBhY2UyNGY2NWUxM2M5NTAyZjUyLi43ZGU0MWE0MjRkMWJiY2Y5NTFiZWNhMmZlOGU0YTU0OTQy
MWE2ZDgyIDEwMDY0NAotLS0gYS9Ub29scy9TY3JpcHRzL3dlYmtpdHB5L2NvbW1vbi9zeXN0ZW0v
ZmlsZXN5c3RlbS5weQorKysgYi9Ub29scy9TY3JpcHRzL3dlYmtpdHB5L2NvbW1vbi9zeXN0ZW0v
ZmlsZXN5c3RlbS5weQpAQCAtMzQsNiArMzQsNyBAQCBpbXBvcnQgY29kZWNzCiBpbXBvcnQgZXJy
bm8KIGltcG9ydCBleGNlcHRpb25zCiBpbXBvcnQgZ2xvYgoraW1wb3J0IGhhc2hsaWIKIGltcG9y
dCBvcwogaW1wb3J0IHNodXRpbAogaW1wb3J0IHN5cwpAQCAtMjIzLDYgKzIyNCwxMCBAQCBjbGFz
cyBGaWxlU3lzdGVtKG9iamVjdCk6CiAgICAgICAgIHdpdGggY29kZWNzLm9wZW4ocGF0aCwgJ3cn
LCAndXRmOCcpIGFzIGY6CiAgICAgICAgICAgICBmLndyaXRlKGNvbnRlbnRzKQogCisgICAgZGVm
IHNoYTEoc2VsZiwgcGF0aCk6CisgICAgICAgIGNvbnRlbnRzID0gc2VsZi5yZWFkX2JpbmFyeV9m
aWxlKHBhdGgpCisgICAgICAgIHJldHVybiBoYXNobGliLnNoYTEoY29udGVudHMpLmhleGRpZ2Vz
dCgpCisKICAgICBkZWYgcmVscGF0aChzZWxmLCBwYXRoLCBzdGFydD0nLicpOgogICAgICAgICBy
ZXR1cm4gb3NwYXRoLnJlbHBhdGgocGF0aCwgc3RhcnQpCiAKZGlmZiAtLWdpdCBhL1Rvb2xzL1Nj
cmlwdHMvd2Via2l0cHkvbGF5b3V0X3Rlc3RzL3BvcnQvYmFzZS5weSBiL1Rvb2xzL1NjcmlwdHMv
d2Via2l0cHkvbGF5b3V0X3Rlc3RzL3BvcnQvYmFzZS5weQppbmRleCA0OTA5OTgzZTViNzQ1YjIz
MjFiYzMyYzZhOThjNzVjYjY3MDcyNWY5Li5hZTIzZTExZWZiYTQyYzFkZjJmNDBiNzJiMzI4Yjg4
YzkyYzIyMzgzIDEwMDc1NQotLS0gYS9Ub29scy9TY3JpcHRzL3dlYmtpdHB5L2xheW91dF90ZXN0
cy9wb3J0L2Jhc2UucHkKKysrIGIvVG9vbHMvU2NyaXB0cy93ZWJraXRweS9sYXlvdXRfdGVzdHMv
cG9ydC9iYXNlLnB5CkBAIC01NDEsNiArNTQxLDkgQEAgY2xhc3MgUG9ydChvYmplY3QpOgogICAg
ICAgICAiIiJSZXR1cm4gdGhlIGFic29sdXRlIHBhdGggdG8gdGhlIHRvcCBvZiB0aGUgTGF5b3V0
VGVzdHMgZGlyZWN0b3J5LiIiIgogICAgICAgICByZXR1cm4gc2VsZi5wYXRoX2Zyb21fd2Via2l0
X2Jhc2UoJ0xheW91dFRlc3RzJykKIAorICAgIGRlZiB3ZWJraXRfYmFzZShzZWxmKToKKyAgICAg
ICAgcmV0dXJuIHNlbGYuX2ZpbGVzeXN0ZW0uYWJzcGF0aChzZWxmLnBhdGhfZnJvbV93ZWJraXRf
YmFzZSgnLicpKQorCiAgICAgZGVmIHNraXBwZWRfbGF5b3V0X3Rlc3RzKHNlbGYpOgogICAgICAg
ICByZXR1cm4gW10KIApkaWZmIC0tZ2l0IGEvVG9vbHMvU2NyaXB0cy93ZWJraXRweS90b29sL2Nv
bW1hbmRzL3JlYmFzZWxpbmUucHkgYi9Ub29scy9TY3JpcHRzL3dlYmtpdHB5L3Rvb2wvY29tbWFu
ZHMvcmViYXNlbGluZS5weQppbmRleCBkOGJjNjAyNDEyNWRkYmRmOTgyOTIyYjM2NTFjN2IxMzgy
ZTZhZGFhLi42NDdkMDRlMDNhNzk3NWYzYmFjMDNlODc0ODUyYWI4ZjhmYmE2NWFjIDEwMDY0NAot
LS0gYS9Ub29scy9TY3JpcHRzL3dlYmtpdHB5L3Rvb2wvY29tbWFuZHMvcmViYXNlbGluZS5weQor
KysgYi9Ub29scy9TY3JpcHRzL3dlYmtpdHB5L3Rvb2wvY29tbWFuZHMvcmViYXNlbGluZS5weQpA
QCAtMzUsNiArMzUsNyBAQCBpbXBvcnQgd2Via2l0cHkuY29tbW9uLmNvbmZpZy51cmxzIGFzIGNv
bmZpZ191cmxzCiBmcm9tIHdlYmtpdHB5LmNvbW1vbi5uZXQuYnVpbGRib3QgaW1wb3J0IEJ1aWxk
Qm90CiBmcm9tIHdlYmtpdHB5LmNvbW1vbi5uZXQubGF5b3V0dGVzdHJlc3VsdHMgaW1wb3J0IExh
eW91dFRlc3RSZXN1bHRzCiBmcm9tIHdlYmtpdHB5LmNvbW1vbi5zeXN0ZW0udXNlciBpbXBvcnQg
VXNlcgorZnJvbSB3ZWJraXRweS5sYXlvdXRfdGVzdHMubGF5b3V0X3BhY2thZ2UudGVzdF9yZXN1
bHRfd3JpdGVyIGltcG9ydCBUZXN0UmVzdWx0V3JpdGVyCiBmcm9tIHdlYmtpdHB5LmxheW91dF90
ZXN0cy5tb2RlbHMgaW1wb3J0IHRlc3RfZmFpbHVyZXMKIGZyb20gd2Via2l0cHkubGF5b3V0X3Rl
c3RzLnBvcnQgaW1wb3J0IGZhY3RvcnkKIGZyb20gd2Via2l0cHkudG9vbC5ncmFtbWFyIGltcG9y
dCBwbHVyYWxpemUKQEAgLTEyOCw2ICsxMjksMTE5IEBAIGNsYXNzIFJlYmFzZWxpbmVUZXN0KEFi
c3RyYWN0RGVjbGFyYXRpdmVDb21tYW5kKToKICAgICAgICAgc2VsZi5fcmViYXNlbGluZV90ZXN0
KGFyZ3NbMF0sIGFyZ3NbMV0sIGFyZ3NbMl0pCiAKIAorZnJvbSB3ZWJraXRweS5sYXlvdXRfdGVz
dHMucG9ydCBpbXBvcnQgZmFjdG9yeSBhcyBwb3J0X2ZhY3RvcnkKKworCitjbGFzcyBPcHRpbWl6
ZUJhc2VsaW5lcyhBYnN0cmFjdERlY2xhcmF0aXZlQ29tbWFuZCk6CisgICAgbmFtZSA9ICJvcHRp
bWl6ZS1iYXNlbGluZXMiCisgICAgaGVscF90ZXh0ID0gIlJlc2h1ZmZsZXMgdGhlIGJhc2VsaW5l
cyBmb3IgYSB0aGUgZ2l2ZW4gdGVzdCB0byB1c2UgYXMgbGl0dGUgc3BhY2Ugb24gZGlzayBhcyBw
b3NzaWJsZS4iCisgICAgYXJndW1lbnRfbmFtZXMgPSAiVEVTVF9OQU1FIgorCisgICAgIyBZZXMs
IGl0J3MgYSBoeXBlcmdyYXBoLgorICAgIGRlZiBfYmFzZWxpbmVfc2VhcmNoX2h5cGVyZ3JhcGgo
c2VsZik6CisgICAgICAgIGh5cGVyZ3JhcGggPSB7fQorCisgICAgICAgICMgVGhlc2UgZWRnZXMg
aW4gdGhlIGh5cGVyZ3JhcGggYXJlbid0IHZpc2libGUgb24gYnVpbGQud2Via2l0Lm9yZywKKyAg
ICAgICAgIyBidXQgdGhleSBpbXBvc2UgY29uc3RyYWludHMgb24gaG93IHdlIG9wdGltaXplIGJh
c2VsaW5lcy4KKyAgICAgICAgaHlwZXJncmFwaFsnbWFjLWZ1dHVyZSddID0gWydMYXlvdXRUZXN0
cy9wbGF0Zm9ybS9tYWMtZnV0dXJlJywgJ0xheW91dFRlc3RzL3BsYXRmb3JtL21hYyddCisgICAg
ICAgIGh5cGVyZ3JhcGhbJ3F0LXVua25vd24nXSA9IFsnTGF5b3V0VGVzdHMvcGxhdGZvcm0vcXQt
dW5rbm93bicsICdMYXlvdXRUZXN0cy9wbGF0Zm9ybS9xdCddCisKKyAgICAgICAgZm9yIHBvcnRf
bmFtZSBpbiBwb3J0X2ZhY3RvcnkuYWxsX3BvcnRfbmFtZXMoKToKKyAgICAgICAgICAgIHBvcnQg
PSBwb3J0X2ZhY3RvcnkuZ2V0KHBvcnRfbmFtZSkKKyAgICAgICAgICAgIHdlYmtpdF9iYXNlID0g
cG9ydC53ZWJraXRfYmFzZSgpCisgICAgICAgICAgICBzZWFyY2hfcGF0aCA9IHBvcnQuYmFzZWxp
bmVfc2VhcmNoX3BhdGgoKQorICAgICAgICAgICAgaWYgc2VhcmNoX3BhdGg6CisgICAgICAgICAg
ICAgICAgaHlwZXJncmFwaFtwb3J0X25hbWVdID0gW3NlbGYuX2ZzLnJlbHBhdGgocGF0aCwgd2Vi
a2l0X2Jhc2UpIGZvciBwYXRoIGluIHNlYXJjaF9wYXRoXQorICAgICAgICByZXR1cm4gaHlwZXJn
cmFwaAorCisgICAgZGVmIF9yZWFkX3Jlc3VsdHMoc2VsZiwgZGlyZWN0b3JpZXMsIGJhc2VsaW5l
X25hbWUpOgorICAgICAgICByZXN1bHRzX2J5X2RpcmVjdG9yeSA9IHt9CisgICAgICAgIGZvciBk
aXJlY3RvcnkgaW4gZGlyZWN0b3JpZXM6CisgICAgICAgICAgICBwYXRoID0gc2VsZi5fZnMuam9p
bihzZWxmLl90b29sLnNjbSgpLmNoZWNrb3V0X3Jvb3QsIGRpcmVjdG9yeSwgYmFzZWxpbmVfbmFt
ZSkKKyAgICAgICAgICAgIGlmIHNlbGYuX2ZzLmV4aXN0cyhwYXRoKToKKyAgICAgICAgICAgICAg
ICByZXN1bHRzX2J5X2RpcmVjdG9yeVtkaXJlY3RvcnldID0gc2VsZi5fZnMuc2hhMShwYXRoKQor
ICAgICAgICByZXR1cm4gcmVzdWx0c19ieV9kaXJlY3RvcnkKKworICAgIGRlZiBfcmVzdWx0c19i
eV9wb3J0X25hbWUoc2VsZiwgaHlwZXJncmFwaCwgcmVzdWx0c19ieV9kaXJlY3RvcnkpOgorICAg
ICAgICBvYnNlcnZhdGlvbnMgPSB7fQorICAgICAgICBmb3IgcG9ydF9uYW1lLCBzZWFyY2hfcGF0
aCBpbiBoeXBlcmdyYXBoLml0ZW1zKCk6CisgICAgICAgICAgICBmb3IgZGlyZWN0b3J5IGluIHNl
YXJjaF9wYXRoOgorICAgICAgICAgICAgICAgIGlmIGRpcmVjdG9yeSBpbiByZXN1bHRzX2J5X2Rp
cmVjdG9yeToKKyAgICAgICAgICAgICAgICAgICAgb2JzZXJ2YXRpb25zW3BvcnRfbmFtZV0gPSBy
ZXN1bHRzX2J5X2RpcmVjdG9yeVtkaXJlY3RvcnldCisgICAgICAgICAgICAgICAgICAgIGJyZWFr
CisgICAgICAgIHJldHVybiBvYnNlcnZhdGlvbnMKKworICAgIGRlZiBfZ3JvdXBfcG9ydF9uYW1l
c19ieV9yZXN1bHQoc2VsZiwgb2JzZXJ2YXRpb25zKToKKyAgICAgICAgb2JzZXJ2YXRpb25zX2J5
X3Jlc3VsdCA9IHt9CisgICAgICAgIGZvciBwb3J0X25hbWUsIHJlc3VsdCBpbiBvYnNlcnZhdGlv
bnMuaXRlbXMoKToKKyAgICAgICAgICAgIGlmIG9ic2VydmF0aW9uc19ieV9yZXN1bHQuZ2V0KHJl
c3VsdCk6CisgICAgICAgICAgICAgICAgb2JzZXJ2YXRpb25zX2J5X3Jlc3VsdFtyZXN1bHRdLmFw
cGVuZChwb3J0X25hbWUpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIG9ic2Vy
dmF0aW9uc19ieV9yZXN1bHRbcmVzdWx0XSA9IFtwb3J0X25hbWVdCisgICAgICAgIHJldHVybiBv
YnNlcnZhdGlvbnNfYnlfcmVzdWx0CisKKyAgICBkZWYgX21vc3Rfc3BlY2lmaWNfY29tbW9uX2Rp
cmVjdG9yeShzZWxmLCBwb3J0X25hbWVzLCBoeXBlcmdyYXBoKToKKyAgICAgICAgcGF0aHMgPSBb
aHlwZXJncmFwaFtwb3J0X25hbWVdIGZvciBwb3J0X25hbWUgaW4gcG9ydF9uYW1lc10KKyAgICAg
ICAgY29tbW9uX2RpcmVjdG9yaWVzID0gcmVkdWNlKHNldC5pbnRlcnNlY3Rpb24sIG1hcChzZXQs
IHBhdGhzKSkKKworICAgICAgICBkZWYgc2NvcmUoZGlyZWN0b3J5KToKKyAgICAgICAgICAgIHJl
dHVybiBzdW0oW3BhdGguaW5kZXgoZGlyZWN0b3J5KSBmb3IgcGF0aCBpbiBwYXRoc10pCisKKyAg
ICAgICAgXywgZGlyZWN0b3J5ID0gc29ydGVkKFsoc2NvcmUoZGlyZWN0b3J5KSwgZGlyZWN0b3J5
KSBmb3IgZGlyZWN0b3J5IGluIGNvbW1vbl9kaXJlY3Rvcmllc10pWzBdCisgICAgICAgIHJldHVy
biBkaXJlY3RvcnkKKworICAgIGRlZiBfZmluZF9vcHRpbWFsX3Jlc3VsdF9wbGFjZW1lbnQoc2Vs
ZiwgaHlwZXJncmFwaCwgZGlyZWN0b3JpZXMsIGJhc2VsaW5lX25hbWUpOgorICAgICAgICByZXN1
bHRzX2J5X2RpcmVjdG9yeSA9IHNlbGYuX3JlYWRfcmVzdWx0cyhkaXJlY3RvcmllcywgYmFzZWxp
bmVfbmFtZSkKKyAgICAgICAgcmVzdWx0c19ieV9wb3J0X25hbWUgPSBzZWxmLl9yZXN1bHRzX2J5
X3BvcnRfbmFtZShoeXBlcmdyYXBoLCByZXN1bHRzX2J5X2RpcmVjdG9yeSkKKyAgICAgICAgcG9y
dF9uYW1lc19ieV9yZXN1bHQgPSBzZWxmLl9ncm91cF9wb3J0X25hbWVzX2J5X3Jlc3VsdChyZXN1
bHRzX2J5X3BvcnRfbmFtZSkKKworICAgICAgICBuZXdfcmVzdWx0c19ieV9kaXJlY3RvcnkgPSB7
fQorICAgICAgICBmb3IgcmVzdWx0LCBwb3J0X25hbWVzIGluIHBvcnRfbmFtZXNfYnlfcmVzdWx0
Lml0ZW1zKCk6CisgICAgICAgICAgICBkaXJlY3RvcnkgPSBzZWxmLl9tb3N0X3NwZWNpZmljX2Nv
bW1vbl9kaXJlY3RvcnkocG9ydF9uYW1lcywgaHlwZXJncmFwaCkKKyAgICAgICAgICAgIG5ld19y
ZXN1bHRzX2J5X2RpcmVjdG9yeVtkaXJlY3RvcnldID0gcmVzdWx0CisKKyAgICAgICAgcmV0dXJu
IHJlc3VsdHNfYnlfZGlyZWN0b3J5LCBuZXdfcmVzdWx0c19ieV9kaXJlY3RvcnkKKworICAgIGRl
ZiBfbW92ZV9iYXNlbGluZXMoc2VsZiwgYmFzZWxpbmVfbmFtZSwgcmVzdWx0c19ieV9kaXJlY3Rv
cnksIG5ld19yZXN1bHRzX2J5X2RpcmVjdG9yeSk6CisgICAgICAgIHNvdXJjZV9kaXJlY3Rvcnlf
Zm9yX3Jlc3VsdCA9IHt9CisgICAgICAgIGZvciBkaXJlY3RvcnksIHJlc3VsdCBpbiByZXN1bHRz
X2J5X2RpcmVjdG9yeS5pdGVtcygpOgorICAgICAgICAgICAgc291cmNlX2RpcmVjdG9yeV9mb3Jf
cmVzdWx0W3Jlc3VsdF0gPSBkaXJlY3RvcnkKKworICAgICAgICBmb3IgZGlyZWN0b3J5LCByZXN1
bHQgaW4gbmV3X3Jlc3VsdHNfYnlfZGlyZWN0b3J5Lml0ZW1zKCk6CisgICAgICAgICAgICBpZiBy
ZXN1bHRzX2J5X2RpcmVjdG9yeS5nZXQoZGlyZWN0b3J5KSAhPSByZXN1bHQ6CisgICAgICAgICAg
ICAgICAgc291cmNlID0gc2VsZi5fZnMuam9pbihzZWxmLl90b29sLnNjbSgpLmNoZWNrb3V0X3Jv
b3QsIHNvdXJjZV9kaXJlY3RvcnlfZm9yX3Jlc3VsdFtyZXN1bHRdLCBiYXNlbGluZV9uYW1lKQor
ICAgICAgICAgICAgICAgIGRlc3RpbmF0aW9uID0gc2VsZi5fZnMuam9pbihzZWxmLl90b29sLnNj
bSgpLmNoZWNrb3V0X3Jvb3QsIGRpcmVjdG9yeSwgYmFzZWxpbmVfbmFtZSkKKyAgICAgICAgICAg
ICAgICBwcmludCAnQ29weWluZycsIHNvdXJjZSwgZGVzdGluYXRpb24KKyAgICAgICAgICAgICAg
ICBzZWxmLl9mcy5tYXliZV9tYWtlX2RpcmVjdG9yeShzZWxmLl9mcy5zcGxpdChkZXN0aW5hdGlv
bilbMF0pCisgICAgICAgICAgICAgICAgc2VsZi5fZnMuY29weWZpbGUoc291cmNlLCBkZXN0aW5h
dGlvbikKKyAgICAgICAgICAgICAgICBzZWxmLl90b29sLnNjbSgpLmFkZChkZXN0aW5hdGlvbikK
KworICAgICAgICBmb3IgZGlyZWN0b3J5LCByZXN1bHQgaW4gcmVzdWx0c19ieV9kaXJlY3Rvcnku
aXRlbXMoKToKKyAgICAgICAgICAgIGlmIG5ld19yZXN1bHRzX2J5X2RpcmVjdG9yeS5nZXQoZGly
ZWN0b3J5KSAhPSByZXN1bHQ6CisgICAgICAgICAgICAgICAgZmlsZV9uYW1lID0gc2VsZi5fZnMu
am9pbihzZWxmLl90b29sLnNjbSgpLmNoZWNrb3V0X3Jvb3QsIGRpcmVjdG9yeSwgYmFzZWxpbmVf
bmFtZSkKKyAgICAgICAgICAgICAgICBwcmludCAnUmVtb3ZpbmcnLCBmaWxlX25hbWUKKyAgICAg
ICAgICAgICAgICBzZWxmLl90b29sLnNjbSgpLmRlbGV0ZShmaWxlX25hbWUpCisKKyAgICBkZWYg
X29wdGltaXplKHNlbGYsIGh5cGVyZ3JhcGgsIGRpcmVjdG9yaWVzLCBiYXNlbGluZV9uYW1lKToK
KyAgICAgICAgcmVzdWx0c19ieV9kaXJlY3RvcnksIG5ld19yZXN1bHRzX2J5X2RpcmVjdG9yeSA9
IHNlbGYuX2ZpbmRfb3B0aW1hbF9yZXN1bHRfcGxhY2VtZW50KGh5cGVyZ3JhcGgsIGRpcmVjdG9y
aWVzLCBiYXNlbGluZV9uYW1lKQorICAgICAgICBpZiBzZWxmLl9yZXN1bHRzX2J5X3BvcnRfbmFt
ZShoeXBlcmdyYXBoLCByZXN1bHRzX2J5X2RpcmVjdG9yeSkgIT0gc2VsZi5fcmVzdWx0c19ieV9w
b3J0X25hbWUoaHlwZXJncmFwaCwgbmV3X3Jlc3VsdHNfYnlfZGlyZWN0b3J5KToKKyAgICAgICAg
ICAgIHByaW50ICdIdWVyaXN0aWMgYWxsb2NhdGlvbiBmYWlsZWQuIFVuYWJsZSB0byBvcHRpbWl6
ZSAlcy4nICUgYmFzZWxpbmVfbmFtZQorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIHNlbGYu
X21vdmVfYmFzZWxpbmVzKGJhc2VsaW5lX25hbWUsIHJlc3VsdHNfYnlfZGlyZWN0b3J5LCBuZXdf
cmVzdWx0c19ieV9kaXJlY3RvcnkpCisKKyAgICBkZWYgZXhlY3V0ZShzZWxmLCBvcHRpb25zLCBh
cmdzLCB0b29sKToKKyAgICAgICAgc2VsZi5fZnMgPSB0b29sLmZpbGVzeXN0ZW0KKworICAgICAg
ICB0ZXN0X25hbWUgPSBhcmdzWzBdCisKKyAgICAgICAgaHlwZXJncmFwaCA9IHNlbGYuX2Jhc2Vs
aW5lX3NlYXJjaF9oeXBlcmdyYXBoKCkKKyAgICAgICAgZGlyZWN0b3JpZXMgPSByZWR1Y2Uoc2V0
LnVuaW9uLCBtYXAoc2V0LCBoeXBlcmdyYXBoLnZhbHVlcygpKSkKKworICAgICAgICBmb3Igc3Vm
Zml4IGluIFsnLnBuZycsICcudHh0J106CisgICAgICAgICAgICBiYXNlbGluZV9uYW1lID0gc2Vs
Zi5fZnMuc3BsaXRleHQodGVzdF9uYW1lKVswXSArIFRlc3RSZXN1bHRXcml0ZXIuRklMRU5BTUVf
U1VGRklYX0VYUEVDVEVEICsgc3VmZml4CisgICAgICAgICAgICBzZWxmLl9vcHRpbWl6ZShoeXBl
cmdyYXBoLCBkaXJlY3RvcmllcywgYmFzZWxpbmVfbmFtZSkKKworCiBjbGFzcyBSZWJhc2VsaW5l
KEFic3RyYWN0RGVjbGFyYXRpdmVDb21tYW5kKToKICAgICBuYW1lID0gInJlYmFzZWxpbmUiCiAg
ICAgaGVscF90ZXh0ID0gIlJlcGxhY2VzIGxvY2FsIGV4cGVjdGVkLnR4dCBmaWxlcyB3aXRoIG5l
dyByZXN1bHRzIGZyb20gYnVpbGQgYm90cyIK
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>102481</attachid>
            <date>2011-07-31 23:09:23 -0700</date>
            <delta_ts>2011-08-01 15:57:24 -0700</delta_ts>
            <desc>Updated with smarter hueristic</desc>
            <filename>bug-65418-20110731230922.patch</filename>
            <type>text/plain</type>
            <size>10658</size>
            <attacher name="Adam Barth">abarth</attacher>
            
              <data encoding="base64">U3VidmVyc2lvbiBSZXZpc2lvbjogOTIwOTUKZGlmZiAtLWdpdCBhL1Rvb2xzL0NoYW5nZUxvZyBi
L1Rvb2xzL0NoYW5nZUxvZwppbmRleCA4Mzg1OTNiZjQ2MGVmZDljYTYxZTVlMGFjODBlZDU3YzY3
ZTM5OThmLi5lMTNiNTNjNTA1ZTM0N2Y4MGVjNTUyZGMxNDVhZGY3ZDI4ZDZmNDViIDEwMDY0NAot
LS0gYS9Ub29scy9DaGFuZ2VMb2cKKysrIGIvVG9vbHMvQ2hhbmdlTG9nCkBAIC0xLDUgKzEsMjYg
QEAKIDIwMTEtMDctMzEgIEFkYW0gQmFydGggIDxhYmFydGhAd2Via2l0Lm9yZz4KIAorICAgICAg
ICB3ZWJraXQtcGF0Y2ggbmVlZHMgdG8gYmUgYWJsZSB0byAib3B0aW1pemUiIHRoZSBzdG9yYWdl
IG9mIGJhc2VsaW5lcyBvbiBkaXNrCisgICAgICAgIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3No
b3dfYnVnLmNnaT9pZD02NTQxOAorCisgICAgICAgIFJldmlld2VkIGJ5IE5PQk9EWSAoT09QUyEp
LgorCisgICAgICAgIElmIHdlJ3JlIG5vdCBjYXJlZnVsIHdoZW4gcmViYXNlbGluaW5nIHRlc3Rz
LCB3ZSBjYW4gZW5kIHVwIHdpdGggbG90cworICAgICAgICBvZiBkdXBsaWNhdGUgZXhwZWN0ZWQg
cmVzdWx0cyBmaWxlcyBpbiB0aGUgdHJlZS4gIFRoaXMgcGF0Y2ggYWRkcyBhCisgICAgICAgIHdl
YmtpdC1wYXRjaCBjb21tYW5kIHRoYXQgb3B0aW1pemVzIHRoZSBzdG9yYWdlIG9mIGV4cGVjdGVk
IHJlc3VsdHMgb24KKyAgICAgICAgZGlzay4KKworICAgICAgICBUaGlzIGNvbW1hbmQgaXMgc2lt
aWxhciB0byBkZWR1cGxpY2F0ZS10ZXN0cywgZXhjZXB0IHRoYXQgaXQgY2FuIG1vdmUKKyAgICAg
ICAgdGVzdCByZXN1bHRzIGFyb3VuZCByYXRoZXIgdGhhbiBqdXN0IHJlbW92ZSBkdXBsaWNhdGUg
cmVzdWx0cy4KKworICAgICAgICBVbmZvcnR1bmF0ZWx5LCB0aGlzIHByb2JsZW0gaXMgdmVyeSB0
cmlja3kgYmVjYXVzZSB0aGUgYmFzZWxpbmUgc2VhcmNoCisgICAgICAgIHN0cnVjdHVyZSBpcyBh
IGh5cGVyZ3JhcGguCisKKyAgICAgICAgKiBTY3JpcHRzL3dlYmtpdHB5L2NvbW1vbi9zeXN0ZW0v
ZmlsZXN5c3RlbS5weToKKyAgICAgICAgKiBTY3JpcHRzL3dlYmtpdHB5L3Rvb2wvY29tbWFuZHMv
cmViYXNlbGluZS5weToKKworMjAxMS0wNy0zMSAgQWRhbSBCYXJ0aCAgPGFiYXJ0aEB3ZWJraXQu
b3JnPgorCiAgICAgICAgIGdhcmRlbi1vLW1hdGljIHNob3VsZCBzaG93IGFsbCBmYWlsdXJlcywg
ZXZlbiBvbmVzIHRoYXQgaXQgY2FuJ3QgZmluZCBhIHJlZ3Jlc3Npb24gcmFuZ2UgZm9yCiAgICAg
ICAgIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD02NTQ0NwogCmRpZmYg
LS1naXQgYS9Ub29scy9TY3JpcHRzL3dlYmtpdHB5L2NvbW1vbi9zeXN0ZW0vZmlsZXN5c3RlbS5w
eSBiL1Rvb2xzL1NjcmlwdHMvd2Via2l0cHkvY29tbW9uL3N5c3RlbS9maWxlc3lzdGVtLnB5Cmlu
ZGV4IDBhZjZlYzg5MTUyNjVlNDVjMzM1MGFjZTI0ZjY1ZTEzYzk1MDJmNTIuLjdkZTQxYTQyNGQx
YmJjZjk1MWJlY2EyZmU4ZTRhNTQ5NDIxYTZkODIgMTAwNjQ0Ci0tLSBhL1Rvb2xzL1NjcmlwdHMv
d2Via2l0cHkvY29tbW9uL3N5c3RlbS9maWxlc3lzdGVtLnB5CisrKyBiL1Rvb2xzL1NjcmlwdHMv
d2Via2l0cHkvY29tbW9uL3N5c3RlbS9maWxlc3lzdGVtLnB5CkBAIC0zNCw2ICszNCw3IEBAIGlt
cG9ydCBjb2RlY3MKIGltcG9ydCBlcnJubwogaW1wb3J0IGV4Y2VwdGlvbnMKIGltcG9ydCBnbG9i
CitpbXBvcnQgaGFzaGxpYgogaW1wb3J0IG9zCiBpbXBvcnQgc2h1dGlsCiBpbXBvcnQgc3lzCkBA
IC0yMjMsNiArMjI0LDEwIEBAIGNsYXNzIEZpbGVTeXN0ZW0ob2JqZWN0KToKICAgICAgICAgd2l0
aCBjb2RlY3Mub3BlbihwYXRoLCAndycsICd1dGY4JykgYXMgZjoKICAgICAgICAgICAgIGYud3Jp
dGUoY29udGVudHMpCiAKKyAgICBkZWYgc2hhMShzZWxmLCBwYXRoKToKKyAgICAgICAgY29udGVu
dHMgPSBzZWxmLnJlYWRfYmluYXJ5X2ZpbGUocGF0aCkKKyAgICAgICAgcmV0dXJuIGhhc2hsaWIu
c2hhMShjb250ZW50cykuaGV4ZGlnZXN0KCkKKwogICAgIGRlZiByZWxwYXRoKHNlbGYsIHBhdGgs
IHN0YXJ0PScuJyk6CiAgICAgICAgIHJldHVybiBvc3BhdGgucmVscGF0aChwYXRoLCBzdGFydCkK
IApkaWZmIC0tZ2l0IGEvVG9vbHMvU2NyaXB0cy93ZWJraXRweS9sYXlvdXRfdGVzdHMvcG9ydC9i
YXNlLnB5IGIvVG9vbHMvU2NyaXB0cy93ZWJraXRweS9sYXlvdXRfdGVzdHMvcG9ydC9iYXNlLnB5
CmluZGV4IDQ5MDk5ODNlNWI3NDViMjMyMWJjMzJjNmE5OGM3NWNiNjcwNzI1ZjkuLmFlMjNlMTFl
ZmJhNDJjMWRmMmY0MGI3MmIzMjhiODhjOTJjMjIzODMgMTAwNzU1Ci0tLSBhL1Rvb2xzL1Njcmlw
dHMvd2Via2l0cHkvbGF5b3V0X3Rlc3RzL3BvcnQvYmFzZS5weQorKysgYi9Ub29scy9TY3JpcHRz
L3dlYmtpdHB5L2xheW91dF90ZXN0cy9wb3J0L2Jhc2UucHkKQEAgLTU0MSw2ICs1NDEsOSBAQCBj
bGFzcyBQb3J0KG9iamVjdCk6CiAgICAgICAgICIiIlJldHVybiB0aGUgYWJzb2x1dGUgcGF0aCB0
byB0aGUgdG9wIG9mIHRoZSBMYXlvdXRUZXN0cyBkaXJlY3RvcnkuIiIiCiAgICAgICAgIHJldHVy
biBzZWxmLnBhdGhfZnJvbV93ZWJraXRfYmFzZSgnTGF5b3V0VGVzdHMnKQogCisgICAgZGVmIHdl
YmtpdF9iYXNlKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5fZmlsZXN5c3RlbS5hYnNwYXRo
KHNlbGYucGF0aF9mcm9tX3dlYmtpdF9iYXNlKCcuJykpCisKICAgICBkZWYgc2tpcHBlZF9sYXlv
dXRfdGVzdHMoc2VsZik6CiAgICAgICAgIHJldHVybiBbXQogCmRpZmYgLS1naXQgYS9Ub29scy9T
Y3JpcHRzL3dlYmtpdHB5L3Rvb2wvY29tbWFuZHMvcmViYXNlbGluZS5weSBiL1Rvb2xzL1Njcmlw
dHMvd2Via2l0cHkvdG9vbC9jb21tYW5kcy9yZWJhc2VsaW5lLnB5CmluZGV4IGU0ZDk1ZGI3YmZk
NjcxMmZmZDdkYTNkNTJkM2U2MjI3MDE5OGY5OWUuLmJhNjAxOTJjYWEyYjQwMTgzYWY3MTQ5ZDdh
NjYwOGFmMTVkZTFiM2IgMTAwNjQ0Ci0tLSBhL1Rvb2xzL1NjcmlwdHMvd2Via2l0cHkvdG9vbC9j
b21tYW5kcy9yZWJhc2VsaW5lLnB5CisrKyBiL1Rvb2xzL1NjcmlwdHMvd2Via2l0cHkvdG9vbC9j
b21tYW5kcy9yZWJhc2VsaW5lLnB5CkBAIC0zNSw2ICszNSw3IEBAIGltcG9ydCB3ZWJraXRweS5j
b21tb24uY29uZmlnLnVybHMgYXMgY29uZmlnX3VybHMKIGZyb20gd2Via2l0cHkuY29tbW9uLm5l
dC5idWlsZGJvdCBpbXBvcnQgQnVpbGRCb3QKIGZyb20gd2Via2l0cHkuY29tbW9uLm5ldC5sYXlv
dXR0ZXN0cmVzdWx0cyBpbXBvcnQgTGF5b3V0VGVzdFJlc3VsdHMKIGZyb20gd2Via2l0cHkuY29t
bW9uLnN5c3RlbS51c2VyIGltcG9ydCBVc2VyCitmcm9tIHdlYmtpdHB5LmxheW91dF90ZXN0cy5s
YXlvdXRfcGFja2FnZS50ZXN0X3Jlc3VsdF93cml0ZXIgaW1wb3J0IFRlc3RSZXN1bHRXcml0ZXIK
IGZyb20gd2Via2l0cHkubGF5b3V0X3Rlc3RzLm1vZGVscyBpbXBvcnQgdGVzdF9mYWlsdXJlcwog
ZnJvbSB3ZWJraXRweS5sYXlvdXRfdGVzdHMucG9ydCBpbXBvcnQgZmFjdG9yeQogZnJvbSB3ZWJr
aXRweS50b29sLmdyYW1tYXIgaW1wb3J0IHBsdXJhbGl6ZQpAQCAtMTI4LDYgKzEyOSwxMzkgQEAg
Y2xhc3MgUmViYXNlbGluZVRlc3QoQWJzdHJhY3REZWNsYXJhdGl2ZUNvbW1hbmQpOgogICAgICAg
ICBzZWxmLl9yZWJhc2VsaW5lX3Rlc3QoYXJnc1swXSwgYXJnc1sxXSwgYXJnc1syXSkKIAogCitm
cm9tIHdlYmtpdHB5LmxheW91dF90ZXN0cy5wb3J0IGltcG9ydCBmYWN0b3J5IGFzIHBvcnRfZmFj
dG9yeQorCisKK2NsYXNzIE9wdGltaXplQmFzZWxpbmVzKEFic3RyYWN0RGVjbGFyYXRpdmVDb21t
YW5kKToKKyAgICBuYW1lID0gIm9wdGltaXplLWJhc2VsaW5lcyIKKyAgICBoZWxwX3RleHQgPSAi
UmVzaHVmZmxlcyB0aGUgYmFzZWxpbmVzIGZvciBhIHRoZSBnaXZlbiB0ZXN0IHRvIHVzZSBhcyBs
aXR0ZSBzcGFjZSBvbiBkaXNrIGFzIHBvc3NpYmxlLiIKKyAgICBhcmd1bWVudF9uYW1lcyA9ICJU
RVNUX05BTUUiCisKKyAgICAjIFllcywgaXQncyBhIGh5cGVyZ3JhcGguCisgICAgZGVmIF9iYXNl
bGluZV9zZWFyY2hfaHlwZXJncmFwaChzZWxmKToKKyAgICAgICAgaHlwZXJncmFwaCA9IHt9CisK
KyAgICAgICAgIyBUaGVzZSBlZGdlcyBpbiB0aGUgaHlwZXJncmFwaCBhcmVuJ3QgdmlzaWJsZSBv
biBidWlsZC53ZWJraXQub3JnLAorICAgICAgICAjIGJ1dCB0aGV5IGltcG9zZSBjb25zdHJhaW50
cyBvbiBob3cgd2Ugb3B0aW1pemUgYmFzZWxpbmVzLgorICAgICAgICBoeXBlcmdyYXBoWydtYWMt
ZnV0dXJlJ10gPSBbJ0xheW91dFRlc3RzL3BsYXRmb3JtL21hYy1mdXR1cmUnLCAnTGF5b3V0VGVz
dHMvcGxhdGZvcm0vbWFjJ10KKyAgICAgICAgaHlwZXJncmFwaFsncXQtdW5rbm93biddID0gWydM
YXlvdXRUZXN0cy9wbGF0Zm9ybS9xdC11bmtub3duJywgJ0xheW91dFRlc3RzL3BsYXRmb3JtL3F0
J10KKworICAgICAgICBmb3IgcG9ydF9uYW1lIGluIHBvcnRfZmFjdG9yeS5hbGxfcG9ydF9uYW1l
cygpOgorICAgICAgICAgICAgcG9ydCA9IHBvcnRfZmFjdG9yeS5nZXQocG9ydF9uYW1lKQorICAg
ICAgICAgICAgd2Via2l0X2Jhc2UgPSBwb3J0LndlYmtpdF9iYXNlKCkKKyAgICAgICAgICAgIHNl
YXJjaF9wYXRoID0gcG9ydC5iYXNlbGluZV9zZWFyY2hfcGF0aCgpCisgICAgICAgICAgICBpZiBz
ZWFyY2hfcGF0aDoKKyAgICAgICAgICAgICAgICBoeXBlcmdyYXBoW3BvcnRfbmFtZV0gPSBbc2Vs
Zi5fZnMucmVscGF0aChwYXRoLCB3ZWJraXRfYmFzZSkgZm9yIHBhdGggaW4gc2VhcmNoX3BhdGhd
CisgICAgICAgIHJldHVybiBoeXBlcmdyYXBoCisKKyAgICBkZWYgX3JlYWRfcmVzdWx0cyhzZWxm
LCBkaXJlY3RvcmllcywgYmFzZWxpbmVfbmFtZSk6CisgICAgICAgIHJlc3VsdHNfYnlfZGlyZWN0
b3J5ID0ge30KKyAgICAgICAgZm9yIGRpcmVjdG9yeSBpbiBkaXJlY3RvcmllczoKKyAgICAgICAg
ICAgIHBhdGggPSBzZWxmLl9mcy5qb2luKHNlbGYuX3Rvb2wuc2NtKCkuY2hlY2tvdXRfcm9vdCwg
ZGlyZWN0b3J5LCBiYXNlbGluZV9uYW1lKQorICAgICAgICAgICAgaWYgc2VsZi5fZnMuZXhpc3Rz
KHBhdGgpOgorICAgICAgICAgICAgICAgIHJlc3VsdHNfYnlfZGlyZWN0b3J5W2RpcmVjdG9yeV0g
PSBzZWxmLl9mcy5zaGExKHBhdGgpCisgICAgICAgIHJldHVybiByZXN1bHRzX2J5X2RpcmVjdG9y
eQorCisgICAgZGVmIF9yZXN1bHRzX2J5X3BvcnRfbmFtZShzZWxmLCBoeXBlcmdyYXBoLCByZXN1
bHRzX2J5X2RpcmVjdG9yeSk6CisgICAgICAgIG9ic2VydmF0aW9ucyA9IHt9CisgICAgICAgIGZv
ciBwb3J0X25hbWUsIHNlYXJjaF9wYXRoIGluIGh5cGVyZ3JhcGguaXRlbXMoKToKKyAgICAgICAg
ICAgIGZvciBkaXJlY3RvcnkgaW4gc2VhcmNoX3BhdGg6CisgICAgICAgICAgICAgICAgaWYgZGly
ZWN0b3J5IGluIHJlc3VsdHNfYnlfZGlyZWN0b3J5OgorICAgICAgICAgICAgICAgICAgICBvYnNl
cnZhdGlvbnNbcG9ydF9uYW1lXSA9IHJlc3VsdHNfYnlfZGlyZWN0b3J5W2RpcmVjdG9yeV0KKyAg
ICAgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgcmV0dXJuIG9ic2VydmF0aW9ucworCisg
ICAgZGVmIF9ncm91cF9wb3J0X25hbWVzX2J5X3Jlc3VsdChzZWxmLCBvYnNlcnZhdGlvbnMpOgor
ICAgICAgICBvYnNlcnZhdGlvbnNfYnlfcmVzdWx0ID0ge30KKyAgICAgICAgZm9yIHBvcnRfbmFt
ZSwgcmVzdWx0IGluIG9ic2VydmF0aW9ucy5pdGVtcygpOgorICAgICAgICAgICAgaWYgb2JzZXJ2
YXRpb25zX2J5X3Jlc3VsdC5nZXQocmVzdWx0KToKKyAgICAgICAgICAgICAgICBvYnNlcnZhdGlv
bnNfYnlfcmVzdWx0W3Jlc3VsdF0uYXBwZW5kKHBvcnRfbmFtZSkKKyAgICAgICAgICAgIGVsc2U6
CisgICAgICAgICAgICAgICAgb2JzZXJ2YXRpb25zX2J5X3Jlc3VsdFtyZXN1bHRdID0gW3BvcnRf
bmFtZV0KKyAgICAgICAgcmV0dXJuIG9ic2VydmF0aW9uc19ieV9yZXN1bHQKKworICAgIGRlZiBf
bW9zdF9zcGVjaWZpY19jb21tb25fZGlyZWN0b3J5KHNlbGYsIHBvcnRfbmFtZXMsIGh5cGVyZ3Jh
cGgpOgorICAgICAgICBwYXRocyA9IFtoeXBlcmdyYXBoW3BvcnRfbmFtZV0gZm9yIHBvcnRfbmFt
ZSBpbiBwb3J0X25hbWVzXQorICAgICAgICBjb21tb25fZGlyZWN0b3JpZXMgPSByZWR1Y2Uoc2V0
LmludGVyc2VjdGlvbiwgbWFwKHNldCwgcGF0aHMpKQorCisgICAgICAgIGRlZiBzY29yZShkaXJl
Y3RvcnkpOgorICAgICAgICAgICAgcmV0dXJuIHN1bShbcGF0aC5pbmRleChkaXJlY3RvcnkpIGZv
ciBwYXRoIGluIHBhdGhzXSkKKworICAgICAgICBfLCBkaXJlY3RvcnkgPSBzb3J0ZWQoWyhzY29y
ZShkaXJlY3RvcnkpLCBkaXJlY3RvcnkpIGZvciBkaXJlY3RvcnkgaW4gY29tbW9uX2RpcmVjdG9y
aWVzXSlbMF0KKyAgICAgICAgcmV0dXJuIGRpcmVjdG9yeQorCisgICAgZGVmIF9maWx0ZXJfcG9y
dF9uYW1lc19ieV9yZXN1bHQoc2VsZiwgcHJlZGljYXRlLCBwb3J0X25hbWVzX2J5X3Jlc3VsdCk6
CisgICAgICAgIGZpbHRlcmVkX3BvcnRfbmFtZXNfYnlfcmVzdWx0ID0ge30KKyAgICAgICAgZm9y
IHJlc3VsdCwgcG9ydF9uYW1lcyBpbiBwb3J0X25hbWVzX2J5X3Jlc3VsdC5pdGVtcygpOgorICAg
ICAgICAgICAgZmlsdGVyZWRfcG9ydF9uYW1lcyA9IGZpbHRlcihwcmVkaWNhdGUsIHBvcnRfbmFt
ZXMpCisgICAgICAgICAgICBpZiBmaWx0ZXJlZF9wb3J0X25hbWVzOgorICAgICAgICAgICAgICAg
IGZpbHRlcmVkX3BvcnRfbmFtZXNfYnlfcmVzdWx0W3Jlc3VsdF0gPSBmaWx0ZXJlZF9wb3J0X25h
bWVzCisgICAgICAgIHJldHVybiBmaWx0ZXJlZF9wb3J0X25hbWVzX2J5X3Jlc3VsdAorCisgICAg
ZGVmIF9wbGFjZV9yZXN1bHRzX2luX21vc3Rfc3BlY2lmaWNfY29tbW9uX2RpcmVjdG9yeShzZWxm
LCBoeXBlcmdyYXBoLCBwb3J0X25hbWVzX2J5X3Jlc3VsdCwgcmVzdWx0c19ieV9kaXJlY3Rvcnkp
OgorICAgICAgICBmb3IgcmVzdWx0LCBwb3J0X25hbWVzIGluIHBvcnRfbmFtZXNfYnlfcmVzdWx0
Lml0ZW1zKCk6CisgICAgICAgICAgICBkaXJlY3RvcnkgPSBzZWxmLl9tb3N0X3NwZWNpZmljX2Nv
bW1vbl9kaXJlY3RvcnkocG9ydF9uYW1lcywgaHlwZXJncmFwaCkKKyAgICAgICAgICAgIHJlc3Vs
dHNfYnlfZGlyZWN0b3J5W2RpcmVjdG9yeV0gPSByZXN1bHQKKworICAgIGRlZiBfZmluZF9vcHRp
bWFsX3Jlc3VsdF9wbGFjZW1lbnQoc2VsZiwgaHlwZXJncmFwaCwgZGlyZWN0b3JpZXMsIGJhc2Vs
aW5lX25hbWUpOgorICAgICAgICByZXN1bHRzX2J5X2RpcmVjdG9yeSA9IHNlbGYuX3JlYWRfcmVz
dWx0cyhkaXJlY3RvcmllcywgYmFzZWxpbmVfbmFtZSkKKyAgICAgICAgcmVzdWx0c19ieV9wb3J0
X25hbWUgPSBzZWxmLl9yZXN1bHRzX2J5X3BvcnRfbmFtZShoeXBlcmdyYXBoLCByZXN1bHRzX2J5
X2RpcmVjdG9yeSkKKyAgICAgICAgcG9ydF9uYW1lc19ieV9yZXN1bHQgPSBzZWxmLl9ncm91cF9w
b3J0X25hbWVzX2J5X3Jlc3VsdChyZXN1bHRzX2J5X3BvcnRfbmFtZSkKKworICAgICAgICBuZXdf
cmVzdWx0c19ieV9kaXJlY3RvcnkgPSB7fQorICAgICAgICB1bnNhdGlzZmllZF9wb3J0X25hbWVz
X2J5X3Jlc3VsdCA9IHBvcnRfbmFtZXNfYnlfcmVzdWx0CisgICAgICAgIHdoaWxlIHVuc2F0aXNm
aWVkX3BvcnRfbmFtZXNfYnlfcmVzdWx0OgorICAgICAgICAgICAgIyBGSVhNRTogQ2FuIHRoaXMg
bG9vcCBnbyBpbmZpbml0ZT8KKyAgICAgICAgICAgIHNlbGYuX3BsYWNlX3Jlc3VsdHNfaW5fbW9z
dF9zcGVjaWZpY19jb21tb25fZGlyZWN0b3J5KGh5cGVyZ3JhcGgsIHVuc2F0aXNmaWVkX3BvcnRf
bmFtZXNfYnlfcmVzdWx0LCBuZXdfcmVzdWx0c19ieV9kaXJlY3RvcnkpCisgICAgICAgICAgICBu
ZXdfcmVzdWx0c19ieV9wb3J0X25hbWUgPSBzZWxmLl9yZXN1bHRzX2J5X3BvcnRfbmFtZShoeXBl
cmdyYXBoLCBuZXdfcmVzdWx0c19ieV9kaXJlY3RvcnkpCisKKyAgICAgICAgICAgIGRlZiBpc191
bnNhdGlzZmllZChwb3J0X25hbWUpOgorICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHRzX2J5
X3BvcnRfbmFtZVtwb3J0X25hbWVdICE9IG5ld19yZXN1bHRzX2J5X3BvcnRfbmFtZVtwb3J0X25h
bWVdCisKKyAgICAgICAgICAgIHVuc2F0aXNmaWVkX3BvcnRfbmFtZXNfYnlfcmVzdWx0ID0gc2Vs
Zi5fZmlsdGVyX3BvcnRfbmFtZXNfYnlfcmVzdWx0KGlzX3Vuc2F0aXNmaWVkLCBwb3J0X25hbWVz
X2J5X3Jlc3VsdCkKKworICAgICAgICByZXR1cm4gcmVzdWx0c19ieV9kaXJlY3RvcnksIG5ld19y
ZXN1bHRzX2J5X2RpcmVjdG9yeQorCisgICAgZGVmIF9tb3ZlX2Jhc2VsaW5lcyhzZWxmLCBiYXNl
bGluZV9uYW1lLCByZXN1bHRzX2J5X2RpcmVjdG9yeSwgbmV3X3Jlc3VsdHNfYnlfZGlyZWN0b3J5
KToKKyAgICAgICAgc291cmNlX2RpcmVjdG9yeV9mb3JfcmVzdWx0ID0ge30KKyAgICAgICAgZm9y
IGRpcmVjdG9yeSwgcmVzdWx0IGluIHJlc3VsdHNfYnlfZGlyZWN0b3J5Lml0ZW1zKCk6CisgICAg
ICAgICAgICBzb3VyY2VfZGlyZWN0b3J5X2Zvcl9yZXN1bHRbcmVzdWx0XSA9IGRpcmVjdG9yeQor
CisgICAgICAgIGZvciBkaXJlY3RvcnksIHJlc3VsdCBpbiBuZXdfcmVzdWx0c19ieV9kaXJlY3Rv
cnkuaXRlbXMoKToKKyAgICAgICAgICAgIGlmIHJlc3VsdHNfYnlfZGlyZWN0b3J5LmdldChkaXJl
Y3RvcnkpICE9IHJlc3VsdDoKKyAgICAgICAgICAgICAgICBzb3VyY2UgPSBzZWxmLl9mcy5qb2lu
KHNlbGYuX3Rvb2wuc2NtKCkuY2hlY2tvdXRfcm9vdCwgc291cmNlX2RpcmVjdG9yeV9mb3JfcmVz
dWx0W3Jlc3VsdF0sIGJhc2VsaW5lX25hbWUpCisgICAgICAgICAgICAgICAgZGVzdGluYXRpb24g
PSBzZWxmLl9mcy5qb2luKHNlbGYuX3Rvb2wuc2NtKCkuY2hlY2tvdXRfcm9vdCwgZGlyZWN0b3J5
LCBiYXNlbGluZV9uYW1lKQorICAgICAgICAgICAgICAgIHByaW50ICdDb3B5aW5nJywgc291cmNl
LCBkZXN0aW5hdGlvbgorICAgICAgICAgICAgICAgIHNlbGYuX2ZzLm1heWJlX21ha2VfZGlyZWN0
b3J5KHNlbGYuX2ZzLnNwbGl0KGRlc3RpbmF0aW9uKVswXSkKKyAgICAgICAgICAgICAgICBzZWxm
Ll9mcy5jb3B5ZmlsZShzb3VyY2UsIGRlc3RpbmF0aW9uKQorICAgICAgICAgICAgICAgIHNlbGYu
X3Rvb2wuc2NtKCkuYWRkKGRlc3RpbmF0aW9uKQorCisgICAgICAgIGZvciBkaXJlY3RvcnksIHJl
c3VsdCBpbiByZXN1bHRzX2J5X2RpcmVjdG9yeS5pdGVtcygpOgorICAgICAgICAgICAgaWYgbmV3
X3Jlc3VsdHNfYnlfZGlyZWN0b3J5LmdldChkaXJlY3RvcnkpICE9IHJlc3VsdDoKKyAgICAgICAg
ICAgICAgICBmaWxlX25hbWUgPSBzZWxmLl9mcy5qb2luKHNlbGYuX3Rvb2wuc2NtKCkuY2hlY2tv
dXRfcm9vdCwgZGlyZWN0b3J5LCBiYXNlbGluZV9uYW1lKQorICAgICAgICAgICAgICAgIHByaW50
ICdSZW1vdmluZycsIGZpbGVfbmFtZQorICAgICAgICAgICAgICAgIHNlbGYuX3Rvb2wuc2NtKCku
ZGVsZXRlKGZpbGVfbmFtZSkKKworICAgIGRlZiBfb3B0aW1pemUoc2VsZiwgaHlwZXJncmFwaCwg
ZGlyZWN0b3JpZXMsIGJhc2VsaW5lX25hbWUpOgorICAgICAgICByZXN1bHRzX2J5X2RpcmVjdG9y
eSwgbmV3X3Jlc3VsdHNfYnlfZGlyZWN0b3J5ID0gc2VsZi5fZmluZF9vcHRpbWFsX3Jlc3VsdF9w
bGFjZW1lbnQoaHlwZXJncmFwaCwgZGlyZWN0b3JpZXMsIGJhc2VsaW5lX25hbWUpCisgICAgICAg
IGlmIHNlbGYuX3Jlc3VsdHNfYnlfcG9ydF9uYW1lKGh5cGVyZ3JhcGgsIHJlc3VsdHNfYnlfZGly
ZWN0b3J5KSAhPSBzZWxmLl9yZXN1bHRzX2J5X3BvcnRfbmFtZShoeXBlcmdyYXBoLCBuZXdfcmVz
dWx0c19ieV9kaXJlY3RvcnkpOgorICAgICAgICAgICAgcHJpbnQgJ0h1ZXJpc3RpYyBhbGxvY2F0
aW9uIGZhaWxlZC4gVW5hYmxlIHRvIG9wdGltaXplICVzLicgJSBiYXNlbGluZV9uYW1lCisgICAg
ICAgICAgICByZXR1cm4KKyAgICAgICAgc2VsZi5fbW92ZV9iYXNlbGluZXMoYmFzZWxpbmVfbmFt
ZSwgcmVzdWx0c19ieV9kaXJlY3RvcnksIG5ld19yZXN1bHRzX2J5X2RpcmVjdG9yeSkKKworICAg
IGRlZiBleGVjdXRlKHNlbGYsIG9wdGlvbnMsIGFyZ3MsIHRvb2wpOgorICAgICAgICBzZWxmLl9m
cyA9IHRvb2wuZmlsZXN5c3RlbQorCisgICAgICAgIHRlc3RfbmFtZSA9IGFyZ3NbMF0KKworICAg
ICAgICBoeXBlcmdyYXBoID0gc2VsZi5fYmFzZWxpbmVfc2VhcmNoX2h5cGVyZ3JhcGgoKQorICAg
ICAgICBkaXJlY3RvcmllcyA9IHJlZHVjZShzZXQudW5pb24sIG1hcChzZXQsIGh5cGVyZ3JhcGgu
dmFsdWVzKCkpKQorCisgICAgICAgIGZvciBzdWZmaXggaW4gWycucG5nJywgJy50eHQnXToKKyAg
ICAgICAgICAgIGJhc2VsaW5lX25hbWUgPSBzZWxmLl9mcy5zcGxpdGV4dCh0ZXN0X25hbWUpWzBd
ICsgVGVzdFJlc3VsdFdyaXRlci5GSUxFTkFNRV9TVUZGSVhfRVhQRUNURUQgKyBzdWZmaXgKKyAg
ICAgICAgICAgIHNlbGYuX29wdGltaXplKGh5cGVyZ3JhcGgsIGRpcmVjdG9yaWVzLCBiYXNlbGlu
ZV9uYW1lKQorCisKIGNsYXNzIFJlYmFzZWxpbmUoQWJzdHJhY3REZWNsYXJhdGl2ZUNvbW1hbmQp
OgogICAgIG5hbWUgPSAicmViYXNlbGluZSIKICAgICBoZWxwX3RleHQgPSAiUmVwbGFjZXMgbG9j
YWwgZXhwZWN0ZWQudHh0IGZpbGVzIHdpdGggbmV3IHJlc3VsdHMgZnJvbSBidWlsZCBib3RzIgo=
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>102581</attachid>
            <date>2011-08-01 15:57:28 -0700</date>
            <delta_ts>2011-08-01 16:08:31 -0700</delta_ts>
            <desc>Patch</desc>
            <filename>bug-65418-20110801155727.patch</filename>
            <type>text/plain</type>
            <size>19583</size>
            <attacher name="Adam Barth">abarth</attacher>
            
              <data encoding="base64">U3VidmVyc2lvbiBSZXZpc2lvbjogOTIxNDMKZGlmZiAtLWdpdCBhL1Rvb2xzL0NoYW5nZUxvZyBi
L1Rvb2xzL0NoYW5nZUxvZwppbmRleCAwNWRmMDdkYWFiZTZkMmYzOTVlODMxNDY0OGI2ZjA3YWU1
NTRhOTAyLi4zMGEyY2E0NzA4NmYwZTAwNTRlY2NmZjZjYjU1MmU4MTVhYWFhOGVkIDEwMDY0NAot
LS0gYS9Ub29scy9DaGFuZ2VMb2cKKysrIGIvVG9vbHMvQ2hhbmdlTG9nCkBAIC0xLDUgKzEsMjgg
QEAKIDIwMTEtMDgtMDEgIEFkYW0gQmFydGggIDxhYmFydGhAd2Via2l0Lm9yZz4KIAorICAgICAg
ICB3ZWJraXQtcGF0Y2ggbmVlZHMgdG8gYmUgYWJsZSB0byAib3B0aW1pemUiIHRoZSBzdG9yYWdl
IG9mIGJhc2VsaW5lcyBvbiBkaXNrCisgICAgICAgIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3No
b3dfYnVnLmNnaT9pZD02NTQxOAorCisgICAgICAgIFJldmlld2VkIGJ5IE5PQk9EWSAoT09QUyEp
LgorCisgICAgICAgIElmIHdlJ3JlIG5vdCBjYXJlZnVsIHdoZW4gcmViYXNlbGluaW5nIHRlc3Rz
LCB3ZSBjYW4gZW5kIHVwIHdpdGggbG90cworICAgICAgICBvZiBkdXBsaWNhdGUgZXhwZWN0ZWQg
cmVzdWx0cyBmaWxlcyBpbiB0aGUgdHJlZS4gIFRoaXMgcGF0Y2ggYWRkcyBhCisgICAgICAgIHdl
YmtpdC1wYXRjaCBjb21tYW5kIHRoYXQgb3B0aW1pemVzIHRoZSBzdG9yYWdlIG9mIGV4cGVjdGVk
IHJlc3VsdHMgb24KKyAgICAgICAgZGlzay4KKworICAgICAgICBUaGlzIGNvbW1hbmQgaXMgc2lt
aWxhciB0byBkZWR1cGxpY2F0ZS10ZXN0cywgZXhjZXB0IHRoYXQgaXQgY2FuIG1vdmUKKyAgICAg
ICAgdGVzdCByZXN1bHRzIGFyb3VuZCByYXRoZXIgdGhhbiBqdXN0IHJlbW92ZSBkdXBsaWNhdGUg
cmVzdWx0cy4KKworICAgICAgICBVbmZvcnR1bmF0ZWx5LCB0aGlzIHByb2JsZW0gaXMgdmVyeSB0
cmlja3kgYmVjYXVzZSB0aGUgYmFzZWxpbmUgc2VhcmNoCisgICAgICAgIHN0cnVjdHVyZSBpcyBh
IGh5cGVyZ3JhcGguICBUaGlzIHBhdGNoIGluY2x1ZGUgYSBodWVyc3RpYyBvcHRpbWl6ZXIKKyAg
ICAgICAgdGhhdCBhcHBlYXJzIHRvIHdvcmsgb24gYSBidW5jaCBvZiBleGFtcGxlcyBJJ3ZlIHRy
aWVkLiAgV2UnbGwgbGlrZWx5CisgICAgICAgIG5lZWQgdG8gcmVmaW5lIGl0IGFzIGdhaW4gZXhw
ZXJpZW5jZS4KKworICAgICAgICAqIFNjcmlwdHMvd2Via2l0cHkvY29tbW9uL3N5c3RlbS9maWxl
c3lzdGVtLnB5OgorICAgICAgICAqIFNjcmlwdHMvd2Via2l0cHkvdG9vbC9jb21tYW5kcy9yZWJh
c2VsaW5lLnB5OgorCisyMDExLTA4LTAxICBBZGFtIEJhcnRoICA8YWJhcnRoQHdlYmtpdC5vcmc+
CisKICAgICAgICAgUmVtb3ZlIHVudXNlZCBmdW5jdGlvbmFsaXR5IGZyb20gZ2FyZGVuaW5nc2Vy
dmVyCiAgICAgICAgIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD02NTQ3
OQogCmRpZmYgLS1naXQgYS9Ub29scy9TY3JpcHRzL3dlYmtpdHB5L2NvbW1vbi9jaGVja291dC9i
YXNlbGluZW9wdGltaXplci5weSBiL1Rvb2xzL1NjcmlwdHMvd2Via2l0cHkvY29tbW9uL2NoZWNr
b3V0L2Jhc2VsaW5lb3B0aW1pemVyLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAuLjk1YjZkYTQ3ZWEwYmU0ZGNkZDcx
YjUwNWU3ZTE2MDUzOGM1NTc4MzMKLS0tIC9kZXYvbnVsbAorKysgYi9Ub29scy9TY3JpcHRzL3dl
YmtpdHB5L2NvbW1vbi9jaGVja291dC9iYXNlbGluZW9wdGltaXplci5weQpAQCAtMCwwICsxLDE1
NCBAQAorIyBDb3B5cmlnaHQgKEMpIDIwMTEsIEdvb2dsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2
ZWQuCisjCisjIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9y
bXMsIHdpdGggb3Igd2l0aG91dAorIyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlk
ZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisjIG1ldDoKKyMKKyMgICAgICog
UmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5
cmlnaHQKKyMgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2lu
ZyBkaXNjbGFpbWVyLgorIyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVz
dCByZXByb2R1Y2UgdGhlIGFib3ZlCisjIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBj
b25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKyMgaW4gdGhlIGRvY3VtZW50
YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorIyBkaXN0cmli
dXRpb24uCisjICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBu
YW1lcyBvZiBpdHMKKyMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJv
bW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKyMgdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNp
ZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyMKKyMgVEhJUyBTT0ZUV0FSRSBJUyBQUk9W
SURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworIyAiQVMgSVMi
IEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5P
VAorIyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElU
WSBBTkQgRklUTkVTUyBGT1IKKyMgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQu
IElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKyMgT1dORVIgT1IgQ09OVFJJQlVUT1JT
IEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisjIFNQRUNJ
QUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBO
T1QKKyMgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJW
SUNFUzsgTE9TUyBPRiBVU0UsCisjIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVS
UlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorIyBUSEVPUlkgT0YgTElBQklMSVRZ
LCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisjIChJTkNM
VURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0Yg
VEhFIFVTRQorIyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJ
QklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCitmcm9tIHdlYmtpdHB5LmxheW91dF90ZXN0cy5wb3J0
IGltcG9ydCBmYWN0b3J5IGFzIHBvcnRfZmFjdG9yeQorCisKKyMgWWVzLCBpdCdzIGEgaHlwZXJn
cmFwaC4KKyMgRklYTUU6IFNob3VsZCB0aGlzIGZ1bmN0aW9uIGxpdmUgd2l0aCB0aGUgcG9ydHMg
c29tZXdoZXJlPworZGVmIF9iYXNlbGluZV9zZWFyY2hfaHlwZXJncmFwaChmcyk6CisgICAgaHlw
ZXJncmFwaCA9IHt9CisKKyAgICAjIFRoZXNlIGVkZ2VzIGluIHRoZSBoeXBlcmdyYXBoIGFyZW4n
dCB2aXNpYmxlIG9uIGJ1aWxkLndlYmtpdC5vcmcsCisgICAgIyBidXQgdGhleSBpbXBvc2UgY29u
c3RyYWludHMgb24gaG93IHdlIG9wdGltaXplIGJhc2VsaW5lcy4KKyAgICBoeXBlcmdyYXBoWydt
YWMtZnV0dXJlJ10gPSBbJ0xheW91dFRlc3RzL3BsYXRmb3JtL21hYy1mdXR1cmUnLCAnTGF5b3V0
VGVzdHMvcGxhdGZvcm0vbWFjJ10KKyAgICBoeXBlcmdyYXBoWydxdC11bmtub3duJ10gPSBbJ0xh
eW91dFRlc3RzL3BsYXRmb3JtL3F0LXVua25vd24nLCAnTGF5b3V0VGVzdHMvcGxhdGZvcm0vcXQn
XQorCisgICAgZm9yIHBvcnRfbmFtZSBpbiBwb3J0X2ZhY3RvcnkuYWxsX3BvcnRfbmFtZXMoKToK
KyAgICAgICAgcG9ydCA9IHBvcnRfZmFjdG9yeS5nZXQocG9ydF9uYW1lKQorICAgICAgICB3ZWJr
aXRfYmFzZSA9IHBvcnQud2Via2l0X2Jhc2UoKQorICAgICAgICBzZWFyY2hfcGF0aCA9IHBvcnQu
YmFzZWxpbmVfc2VhcmNoX3BhdGgoKQorICAgICAgICBpZiBzZWFyY2hfcGF0aDoKKyAgICAgICAg
ICAgIGh5cGVyZ3JhcGhbcG9ydF9uYW1lXSA9IFtmcy5yZWxwYXRoKHBhdGgsIHdlYmtpdF9iYXNl
KSBmb3IgcGF0aCBpbiBzZWFyY2hfcGF0aF0KKyAgICByZXR1cm4gaHlwZXJncmFwaAorCisKKyMg
RklYTUU6IFNob3VsZCB0aGlzIGZ1bmN0aW9uIGJlIHNvbWV3aGVyZSBtb3JlIGdlbmVyYWw/Citk
ZWYgX2ludmVydF9kaWN0aW9uYXJ0eShkaWN0aW9uYXJ5KToKKyAgICBpbnZlcnRlZF9kaWN0aW9u
YXJ5ID0ge30KKyAgICBmb3Iga2V5LCB2YWx1ZSBpbiBkaWN0aW9uYXJ5Lml0ZW1zKCk6CisgICAg
ICAgIGlmIGludmVydGVkX2RpY3Rpb25hcnkuZ2V0KHZhbHVlKToKKyAgICAgICAgICAgIGludmVy
dGVkX2RpY3Rpb25hcnlbdmFsdWVdLmFwcGVuZChrZXkpCisgICAgICAgIGVsc2U6CisgICAgICAg
ICAgICBpbnZlcnRlZF9kaWN0aW9uYXJ5W3ZhbHVlXSA9IFtrZXldCisgICAgcmV0dXJuIGludmVy
dGVkX2RpY3Rpb25hcnkKKworCitjbGFzcyBCYXNlbGluZU9wdGltaXplcihvYmplY3QpOgorICAg
IGRlZiBfX2luaXRfXyhzZWxmLCBzY20sIGZpbGVzeXN0ZW0pOgorICAgICAgICBzZWxmLl9zY20g
PSBzY20KKyAgICAgICAgc2VsZi5fZmlsZXN5c3RlbSA9IGZpbGVzeXN0ZW0KKyAgICAgICAgc2Vs
Zi5faHlwZXJncmFwaCA9IF9iYXNlbGluZV9zZWFyY2hfaHlwZXJncmFwaChzZWxmLl9maWxlc3lz
dGVtKQorICAgICAgICBzZWxmLl9kaXJlY3RvcmllcyA9IHJlZHVjZShzZXQudW5pb24sIG1hcChz
ZXQsIHNlbGYuX2h5cGVyZ3JhcGgudmFsdWVzKCkpKQorCisgICAgZGVmIF9yZWFkX3Jlc3VsdHNf
YnlfZGlyZWN0b3J5KHNlbGYsIGJhc2VsaW5lX25hbWUpOgorICAgICAgICByZXN1bHRzX2J5X2Rp
cmVjdG9yeSA9IHt9CisgICAgICAgIGZvciBkaXJlY3RvcnkgaW4gc2VsZi5fZGlyZWN0b3JpZXM6
CisgICAgICAgICAgICBwYXRoID0gc2VsZi5fZmlsZXN5c3RlbS5qb2luKHNlbGYuX3NjbS5jaGVj
a291dF9yb290LCBkaXJlY3RvcnksIGJhc2VsaW5lX25hbWUpCisgICAgICAgICAgICBpZiBzZWxm
Ll9maWxlc3lzdGVtLmV4aXN0cyhwYXRoKToKKyAgICAgICAgICAgICAgICByZXN1bHRzX2J5X2Rp
cmVjdG9yeVtkaXJlY3RvcnldID0gc2VsZi5fZmlsZXN5c3RlbS5zaGExKHBhdGgpCisgICAgICAg
IHJldHVybiByZXN1bHRzX2J5X2RpcmVjdG9yeQorCisgICAgZGVmIF9yZXN1bHRzX2J5X3BvcnRf
bmFtZShzZWxmLCByZXN1bHRzX2J5X2RpcmVjdG9yeSk6CisgICAgICAgIHJlc3VsdHNfYnlfcG9y
dF9uYW1lID0ge30KKyAgICAgICAgZm9yIHBvcnRfbmFtZSwgc2VhcmNoX3BhdGggaW4gc2VsZi5f
aHlwZXJncmFwaC5pdGVtcygpOgorICAgICAgICAgICAgZm9yIGRpcmVjdG9yeSBpbiBzZWFyY2hf
cGF0aDoKKyAgICAgICAgICAgICAgICBpZiBkaXJlY3RvcnkgaW4gcmVzdWx0c19ieV9kaXJlY3Rv
cnk6CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdHNfYnlfcG9ydF9uYW1lW3BvcnRfbmFtZV0g
PSByZXN1bHRzX2J5X2RpcmVjdG9yeVtkaXJlY3RvcnldCisgICAgICAgICAgICAgICAgICAgIGJy
ZWFrCisgICAgICAgIHJldHVybiByZXN1bHRzX2J5X3BvcnRfbmFtZQorCisgICAgZGVmIF9tb3N0
X3NwZWNpZmljX2NvbW1vbl9kaXJlY3Rvcnkoc2VsZiwgcG9ydF9uYW1lcyk6CisgICAgICAgIHBh
dGhzID0gW3NlbGYuX2h5cGVyZ3JhcGhbcG9ydF9uYW1lXSBmb3IgcG9ydF9uYW1lIGluIHBvcnRf
bmFtZXNdCisgICAgICAgIGNvbW1vbl9kaXJlY3RvcmllcyA9IHJlZHVjZShzZXQuaW50ZXJzZWN0
aW9uLCBtYXAoc2V0LCBwYXRocykpCisKKyAgICAgICAgZGVmIHNjb3JlKGRpcmVjdG9yeSk6Cisg
ICAgICAgICAgICByZXR1cm4gc3VtKFtwYXRoLmluZGV4KGRpcmVjdG9yeSkgZm9yIHBhdGggaW4g
cGF0aHNdKQorCisgICAgICAgIF8sIGRpcmVjdG9yeSA9IHNvcnRlZChbKHNjb3JlKGRpcmVjdG9y
eSksIGRpcmVjdG9yeSkgZm9yIGRpcmVjdG9yeSBpbiBjb21tb25fZGlyZWN0b3JpZXNdKVswXQor
ICAgICAgICByZXR1cm4gZGlyZWN0b3J5CisKKyAgICBkZWYgX2ZpbHRlcl9wb3J0X25hbWVzX2J5
X3Jlc3VsdChzZWxmLCBwcmVkaWNhdGUsIHBvcnRfbmFtZXNfYnlfcmVzdWx0KToKKyAgICAgICAg
ZmlsdGVyZWRfcG9ydF9uYW1lc19ieV9yZXN1bHQgPSB7fQorICAgICAgICBmb3IgcmVzdWx0LCBw
b3J0X25hbWVzIGluIHBvcnRfbmFtZXNfYnlfcmVzdWx0Lml0ZW1zKCk6CisgICAgICAgICAgICBm
aWx0ZXJlZF9wb3J0X25hbWVzID0gZmlsdGVyKHByZWRpY2F0ZSwgcG9ydF9uYW1lcykKKyAgICAg
ICAgICAgIGlmIGZpbHRlcmVkX3BvcnRfbmFtZXM6CisgICAgICAgICAgICAgICAgZmlsdGVyZWRf
cG9ydF9uYW1lc19ieV9yZXN1bHRbcmVzdWx0XSA9IGZpbHRlcmVkX3BvcnRfbmFtZXMKKyAgICAg
ICAgcmV0dXJuIGZpbHRlcmVkX3BvcnRfbmFtZXNfYnlfcmVzdWx0CisKKyAgICBkZWYgX3BsYWNl
X3Jlc3VsdHNfaW5fbW9zdF9zcGVjaWZpY19jb21tb25fZGlyZWN0b3J5KHNlbGYsIHBvcnRfbmFt
ZXNfYnlfcmVzdWx0LCByZXN1bHRzX2J5X2RpcmVjdG9yeSk6CisgICAgICAgIGZvciByZXN1bHQs
IHBvcnRfbmFtZXMgaW4gcG9ydF9uYW1lc19ieV9yZXN1bHQuaXRlbXMoKToKKyAgICAgICAgICAg
IGRpcmVjdG9yeSA9IHNlbGYuX21vc3Rfc3BlY2lmaWNfY29tbW9uX2RpcmVjdG9yeShwb3J0X25h
bWVzKQorICAgICAgICAgICAgcmVzdWx0c19ieV9kaXJlY3RvcnlbZGlyZWN0b3J5XSA9IHJlc3Vs
dAorCisgICAgZGVmIF9maW5kX29wdGltYWxfcmVzdWx0X3BsYWNlbWVudChzZWxmLCBiYXNlbGlu
ZV9uYW1lKToKKyAgICAgICAgcmVzdWx0c19ieV9kaXJlY3RvcnkgPSBzZWxmLl9yZWFkX3Jlc3Vs
dHNfYnlfZGlyZWN0b3J5KGJhc2VsaW5lX25hbWUpCisgICAgICAgIHJlc3VsdHNfYnlfcG9ydF9u
YW1lID0gc2VsZi5fcmVzdWx0c19ieV9wb3J0X25hbWUocmVzdWx0c19ieV9kaXJlY3RvcnkpCisg
ICAgICAgIHBvcnRfbmFtZXNfYnlfcmVzdWx0ID0gX2ludmVydF9kaWN0aW9uYXJ0eShyZXN1bHRz
X2J5X3BvcnRfbmFtZSkKKworICAgICAgICBuZXdfcmVzdWx0c19ieV9kaXJlY3RvcnkgPSB7fQor
ICAgICAgICB1bnNhdGlzZmllZF9wb3J0X25hbWVzX2J5X3Jlc3VsdCA9IHBvcnRfbmFtZXNfYnlf
cmVzdWx0CisgICAgICAgIHdoaWxlIHVuc2F0aXNmaWVkX3BvcnRfbmFtZXNfYnlfcmVzdWx0Ogor
ICAgICAgICAgICAgc2VsZi5fcGxhY2VfcmVzdWx0c19pbl9tb3N0X3NwZWNpZmljX2NvbW1vbl9k
aXJlY3RvcnkodW5zYXRpc2ZpZWRfcG9ydF9uYW1lc19ieV9yZXN1bHQsIG5ld19yZXN1bHRzX2J5
X2RpcmVjdG9yeSkKKyAgICAgICAgICAgIG5ld19yZXN1bHRzX2J5X3BvcnRfbmFtZSA9IHNlbGYu
X3Jlc3VsdHNfYnlfcG9ydF9uYW1lKG5ld19yZXN1bHRzX2J5X2RpcmVjdG9yeSkKKworICAgICAg
ICAgICAgZGVmIGlzX3Vuc2F0aXNmaWVkKHBvcnRfbmFtZSk6CisgICAgICAgICAgICAgICAgcmV0
dXJuIHJlc3VsdHNfYnlfcG9ydF9uYW1lW3BvcnRfbmFtZV0gIT0gbmV3X3Jlc3VsdHNfYnlfcG9y
dF9uYW1lW3BvcnRfbmFtZV0KKworICAgICAgICAgICAgbmV3X3Vuc2F0aXNmaWVkX3BvcnRfbmFt
ZXNfYnlfcmVzdWx0ID0gc2VsZi5fZmlsdGVyX3BvcnRfbmFtZXNfYnlfcmVzdWx0KGlzX3Vuc2F0
aXNmaWVkLCBwb3J0X25hbWVzX2J5X3Jlc3VsdCkKKworICAgICAgICAgICAgaWYgbGVuKG5ld191
bnNhdGlzZmllZF9wb3J0X25hbWVzX2J5X3Jlc3VsdC52YWx1ZXMoKSkgPj0gbGVuKHVuc2F0aXNm
aWVkX3BvcnRfbmFtZXNfYnlfcmVzdWx0LnZhbHVlcygpKToKKyAgICAgICAgICAgICAgICBicmVh
ayAgIyBGcm93bnMuIFdlIGRvIG5vdCBhcHBlYXIgdG8gYmUgY29udmVyZ2luZy4KKyAgICAgICAg
ICAgIHVuc2F0aXNmaWVkX3BvcnRfbmFtZXNfYnlfcmVzdWx0ID0gbmV3X3Vuc2F0aXNmaWVkX3Bv
cnRfbmFtZXNfYnlfcmVzdWx0CisKKyAgICAgICAgcmV0dXJuIHJlc3VsdHNfYnlfZGlyZWN0b3J5
LCBuZXdfcmVzdWx0c19ieV9kaXJlY3RvcnkKKworICAgIGRlZiBfbW92ZV9iYXNlbGluZXMoc2Vs
ZiwgYmFzZWxpbmVfbmFtZSwgcmVzdWx0c19ieV9kaXJlY3RvcnksIG5ld19yZXN1bHRzX2J5X2Rp
cmVjdG9yeSk6CisgICAgICAgIHNvdXJjZV9kaXJlY3RvcnlfZm9yX3Jlc3VsdCA9IHt9CisgICAg
ICAgIGZvciBkaXJlY3RvcnksIHJlc3VsdCBpbiByZXN1bHRzX2J5X2RpcmVjdG9yeS5pdGVtcygp
OgorICAgICAgICAgICAgc291cmNlX2RpcmVjdG9yeV9mb3JfcmVzdWx0W3Jlc3VsdF0gPSBkaXJl
Y3RvcnkKKworICAgICAgICBmb3IgZGlyZWN0b3J5LCByZXN1bHQgaW4gbmV3X3Jlc3VsdHNfYnlf
ZGlyZWN0b3J5Lml0ZW1zKCk6CisgICAgICAgICAgICBpZiByZXN1bHRzX2J5X2RpcmVjdG9yeS5n
ZXQoZGlyZWN0b3J5KSAhPSByZXN1bHQ6CisgICAgICAgICAgICAgICAgc291cmNlID0gc2VsZi5f
ZmlsZXN5c3RlbS5qb2luKHNlbGYuX3NjbS5jaGVja291dF9yb290LCBzb3VyY2VfZGlyZWN0b3J5
X2Zvcl9yZXN1bHRbcmVzdWx0XSwgYmFzZWxpbmVfbmFtZSkKKyAgICAgICAgICAgICAgICBkZXN0
aW5hdGlvbiA9IHNlbGYuX2ZpbGVzeXN0ZW0uam9pbihzZWxmLl9zY20uY2hlY2tvdXRfcm9vdCwg
ZGlyZWN0b3J5LCBiYXNlbGluZV9uYW1lKQorICAgICAgICAgICAgICAgIHNlbGYuX2ZpbGVzeXN0
ZW0ubWF5YmVfbWFrZV9kaXJlY3Rvcnkoc2VsZi5fZmlsZXN5c3RlbS5zcGxpdChkZXN0aW5hdGlv
bilbMF0pCisgICAgICAgICAgICAgICAgc2VsZi5fZmlsZXN5c3RlbS5jb3B5ZmlsZShzb3VyY2Us
IGRlc3RpbmF0aW9uKQorICAgICAgICAgICAgICAgIHNlbGYuX3NjbS5hZGQoZGVzdGluYXRpb24p
CisKKyAgICAgICAgZm9yIGRpcmVjdG9yeSwgcmVzdWx0IGluIHJlc3VsdHNfYnlfZGlyZWN0b3J5
Lml0ZW1zKCk6CisgICAgICAgICAgICBpZiBuZXdfcmVzdWx0c19ieV9kaXJlY3RvcnkuZ2V0KGRp
cmVjdG9yeSkgIT0gcmVzdWx0OgorICAgICAgICAgICAgICAgIGZpbGVfbmFtZSA9IHNlbGYuX2Zp
bGVzeXN0ZW0uam9pbihzZWxmLl9zY20uY2hlY2tvdXRfcm9vdCwgZGlyZWN0b3J5LCBiYXNlbGlu
ZV9uYW1lKQorICAgICAgICAgICAgICAgIHNlbGYuX3NjbS5kZWxldGUoZmlsZV9uYW1lKQorCisg
ICAgZGVmIG9wdGltaXplKHNlbGYsIGJhc2VsaW5lX25hbWUpOgorICAgICAgICByZXN1bHRzX2J5
X2RpcmVjdG9yeSwgbmV3X3Jlc3VsdHNfYnlfZGlyZWN0b3J5ID0gc2VsZi5fZmluZF9vcHRpbWFs
X3Jlc3VsdF9wbGFjZW1lbnQoYmFzZWxpbmVfbmFtZSkKKyAgICAgICAgaWYgc2VsZi5fcmVzdWx0
c19ieV9wb3J0X25hbWUocmVzdWx0c19ieV9kaXJlY3RvcnkpICE9IHNlbGYuX3Jlc3VsdHNfYnlf
cG9ydF9uYW1lKG5ld19yZXN1bHRzX2J5X2RpcmVjdG9yeSk6CisgICAgICAgICAgICByZXR1cm4g
RmFsc2UKKyAgICAgICAgc2VsZi5fbW92ZV9iYXNlbGluZXMoYmFzZWxpbmVfbmFtZSwgcmVzdWx0
c19ieV9kaXJlY3RvcnksIG5ld19yZXN1bHRzX2J5X2RpcmVjdG9yeSkKKyAgICAgICAgcmV0dXJu
IFRydWUKZGlmZiAtLWdpdCBhL1Rvb2xzL1NjcmlwdHMvd2Via2l0cHkvY29tbW9uL2NoZWNrb3V0
L2Jhc2VsaW5lb3B0aW1pemVyX3VuaXR0ZXN0LnB5IGIvVG9vbHMvU2NyaXB0cy93ZWJraXRweS9j
b21tb24vY2hlY2tvdXQvYmFzZWxpbmVvcHRpbWl6ZXJfdW5pdHRlc3QucHkKbmV3IGZpbGUgbW9k
ZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMC4u
OGQyYWJlMWYxYmJhZDI5ODc5Mjg3NWMzMjAzZmZjY2YyNDFkNGY0OQotLS0gL2Rldi9udWxsCisr
KyBiL1Rvb2xzL1NjcmlwdHMvd2Via2l0cHkvY29tbW9uL2NoZWNrb3V0L2Jhc2VsaW5lb3B0aW1p
emVyX3VuaXR0ZXN0LnB5CkBAIC0wLDAgKzEsODkgQEAKKyMgQ29weXJpZ2h0IChDKSAyMDExIEdv
b2dsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisjCisjIFJlZGlzdHJpYnV0aW9uIGFuZCB1
c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorIyBtb2RpZmlj
YXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlv
bnMgYXJlCisjIG1ldDoKKyMKKyMgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUg
bXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorIyBub3RpY2UsIHRoaXMgbGlzdCBvZiBj
b25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisjICAgICogUmVkaXN0cmli
dXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorIyBjb3B5cmln
aHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNj
bGFpbWVyCisjIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJv
dmlkZWQgd2l0aCB0aGUKKyMgZGlzdHJpYnV0aW9uLgorIyAgICAqIE5laXRoZXIgdGhlIG5hbWUg
b2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyMgY29udHJpYnV0b3JzIG1heSBi
ZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKyMgdGhp
cyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyMK
KyMgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5E
IENPTlRSSUJVVE9SUworIyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJB
TlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorIyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJS
QU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyMgQSBQQVJUSUNVTEFS
IFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQK
KyMgT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJF
Q1QsIElOQ0lERU5UQUwsCisjIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBE
QU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKyMgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0Yg
U1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisjIERBVEEsIE9SIFBS
T0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFO
WQorIyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElB
QklMSVRZLCBPUiBUT1JUCisjIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFS
SVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorIyBPRiBUSElTIFNPRlRXQVJFLCBFVkVO
IElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCitpbXBvcnQg
dW5pdHRlc3QKKworZnJvbSB3ZWJraXRweS5jb21tb24uY2hlY2tvdXQuYmFzZWxpbmVvcHRpbWl6
ZXIgaW1wb3J0IEJhc2VsaW5lT3B0aW1pemVyCitmcm9tIHdlYmtpdHB5LmNvbW1vbi5zeXN0ZW0u
ZmlsZXN5c3RlbV9tb2NrIGltcG9ydCBNb2NrRmlsZVN5c3RlbQorZnJvbSB3ZWJraXRweS50b29s
Lm1vY2t0b29sIGltcG9ydCBNb2NrU0NNCisKKworY2xhc3MgVGVzdEJhc2VsaW5lT3B0aW1pemVy
KEJhc2VsaW5lT3B0aW1pemVyKToKKyAgICBkZWYgX19pbml0X18oc2VsZiwgbW9ja19yZXN1bHRz
X2J5X2RpcmVjdG9yeSk6CisgICAgICAgIEJhc2VsaW5lT3B0aW1pemVyLl9faW5pdF9fKHNlbGYs
IE1vY2tTQ00oKSwgTW9ja0ZpbGVTeXN0ZW0oKSkKKyAgICAgICAgc2VsZi5fbW9ja19yZXN1bHRz
X2J5X2RpcmVjdG9yeSA9IG1vY2tfcmVzdWx0c19ieV9kaXJlY3RvcnkKKworICAgICMgV2Ugb3Zl
cnJpZGUgdGhpcyBtZXRob2QgZm9yIHRlc3Rpbmcgc28gd2UgZG9uJ3QgaGF2ZSB0byBjb25zdHJ1
Y3QgYW4KKyAgICAjIGVsYWJvcmF0ZSBtb2NrIGZpbGUgc3lzdGVtLgorICAgIGRlZiBfcmVhZF9y
ZXN1bHRzX2J5X2RpcmVjdG9yeShzZWxmLCBiYXNlbGluZV9uYW1lKToKKyAgICAgICAgcmV0dXJu
IHNlbGYuX21vY2tfcmVzdWx0c19ieV9kaXJlY3RvcnkKKworCitjbGFzcyBCYXNlbGluZU9wdGlt
aXplclRlc3QodW5pdHRlc3QuVGVzdENhc2UpOgorICAgIGRlZiBfYXNzZXJ0T3B0aW1pemF0aW9u
KHNlbGYsIHJlc3VsdHNfYnlfZGlyZWN0b3J5LCBleHBlY3RlZF9uZXdfcmVzdWx0c19ieV9kaXJl
Y3RvcnkpOgorICAgICAgICBiYXNlbGluZV9vcHRpbWl6ZXIgPSBUZXN0QmFzZWxpbmVPcHRpbWl6
ZXIocmVzdWx0c19ieV9kaXJlY3RvcnkpCisgICAgICAgIF8sIG5ld19yZXN1bHRzX2J5X2RpcmVj
dG9yeSA9IGJhc2VsaW5lX29wdGltaXplci5fZmluZF9vcHRpbWFsX3Jlc3VsdF9wbGFjZW1lbnQo
J21vY2stYmFzZWxpbmUucG5nJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChuZXdfcmVzdWx0
c19ieV9kaXJlY3RvcnksIGV4cGVjdGVkX25ld19yZXN1bHRzX2J5X2RpcmVjdG9yeSkKKworICAg
IGRlZiB0ZXN0X2Nocm9taXVtX2xpbnV4X3JlZHVuZGFudF93aXRoX3dpbihzZWxmKToKKyAgICAg
ICAgc2VsZi5fYXNzZXJ0T3B0aW1pemF0aW9uKHsKKyAgICAgICAgICAgICdMYXlvdXRUZXN0cy9w
bGF0Zm9ybS9jaHJvbWl1bS13aW4nOiAnNDYyZDAzYjljMDI1ZGIxYjAzOTJkNzQ1MzMxMGRiZWU1
ZjlhOWU3NCcsCisgICAgICAgICAgICAnTGF5b3V0VGVzdHMvcGxhdGZvcm0vY2hyb21pdW0tbGlu
dXgnOiAnNDYyZDAzYjljMDI1ZGIxYjAzOTJkNzQ1MzMxMGRiZWU1ZjlhOWU3NCcsCisgICAgICAg
IH0sIHsKKyAgICAgICAgICAgICdMYXlvdXRUZXN0cy9wbGF0Zm9ybS9jaHJvbWl1bS13aW4nOiAn
NDYyZDAzYjljMDI1ZGIxYjAzOTJkNzQ1MzMxMGRiZWU1ZjlhOWU3NCcsCisgICAgICAgIH0pCisK
KyAgICBkZWYgdGVzdF9jaHJvbWl1bV9jb3ZlcnNfbWFjX3dpbl9saW51eChzZWxmKToKKyAgICAg
ICAgc2VsZi5fYXNzZXJ0T3B0aW1pemF0aW9uKHsKKyAgICAgICAgICAgICdMYXlvdXRUZXN0cy9w
bGF0Zm9ybS9jaHJvbWl1bS1tYWMnOiAnNDYyZDAzYjljMDI1ZGIxYjAzOTJkNzQ1MzMxMGRiZWU1
ZjlhOWU3NCcsCisgICAgICAgICAgICAnTGF5b3V0VGVzdHMvcGxhdGZvcm0vY2hyb21pdW0td2lu
JzogJzQ2MmQwM2I5YzAyNWRiMWIwMzkyZDc0NTMzMTBkYmVlNWY5YTllNzQnLAorICAgICAgICAg
ICAgJ0xheW91dFRlc3RzL3BsYXRmb3JtL2Nocm9taXVtLWxpbnV4JzogJzQ2MmQwM2I5YzAyNWRi
MWIwMzkyZDc0NTMzMTBkYmVlNWY5YTllNzQnLAorICAgICAgICB9LCB7CisgICAgICAgICAgICAn
TGF5b3V0VGVzdHMvcGxhdGZvcm0vY2hyb21pdW0nOiAnNDYyZDAzYjljMDI1ZGIxYjAzOTJkNzQ1
MzMxMGRiZWU1ZjlhOWU3NCcsCisgICAgICAgIH0pCisKKyAgICBkZWYgdGVzdF9jb21wbGV4X3No
YWRvd2luZyhzZWxmKToKKyAgICAgICAgc2VsZi5fYXNzZXJ0T3B0aW1pemF0aW9uKHsKKyAgICAg
ICAgICAgICdMYXlvdXRUZXN0cy9wbGF0Zm9ybS9jaHJvbWl1bS13aW4nOiAnNDYyZDAzYjljMDI1
ZGIxYjAzOTJkNzQ1MzMxMGRiZWU1ZjlhOWU3NCcsCisgICAgICAgICAgICAnTGF5b3V0VGVzdHMv
cGxhdGZvcm0vbWFjJzogJzVkYWE3OGU1NWYwNWQ5ZjBkMWJiMWYzMmIwY2QxYmMzYTAxZTkzNjQn
LAorICAgICAgICAgICAgJ0xheW91dFRlc3RzL3BsYXRmb3JtL2Nocm9taXVtLXdpbi14cCc6ICc0
NjJkMDNiOWMwMjVkYjFiMDM5MmQ3NDUzMzEwZGJlZTVmOWE5ZTc0JywKKyAgICAgICAgICAgICdM
YXlvdXRUZXN0cy9wbGF0Zm9ybS9jaHJvbWl1bS1tYWMtbGVvcGFyZCc6ICc2NWU3ZDQyZjhiNDg4
MmIyOWQ0NmRjNzdiYjg3OWRkNDFiYzA3NGRjJywKKyAgICAgICAgICAgICdMYXlvdXRUZXN0cy9w
bGF0Zm9ybS9tYWMtbGVvcGFyZCc6ICc3YWQwNDVlY2U3YzAzMGUyMjgzYzVkMjFkOTU4N2JlMjJi
Y2JhNTZlJywKKyAgICAgICAgICAgICdMYXlvdXRUZXN0cy9wbGF0Zm9ybS9jaHJvbWl1bS13aW4t
dmlzdGEnOiAnZjgzYWY5NzMyY2U3NGY3MDJiOGM5YzRhM2Q5YTRjNjYzNmI4ZDNiZCcsCisgICAg
ICAgICAgICAnTGF5b3V0VGVzdHMvcGxhdGZvcm0vd2luJzogJzViMTI1M2VmNGQ1MDk0NTMwZDVm
MWJjNmNkYjk1YzkwYjQ0NmJlYzcnLAorICAgICAgICAgICAgJ0xheW91dFRlc3RzL3BsYXRmb3Jt
L2Nocm9taXVtLWxpbnV4JzogJ2Y1MmZjZGRlOWU0YmU4YmQ1MTQyMTcxY2Q4NTkyMzBiZDQ0NzEw
MzYnLAorICAgICAgICB9LCB7CisgICAgICAgICAgICAnTGF5b3V0VGVzdHMvcGxhdGZvcm0vY2hy
b21pdW0td2luJzogJzQ2MmQwM2I5YzAyNWRiMWIwMzkyZDc0NTMzMTBkYmVlNWY5YTllNzQnLAor
ICAgICAgICAgICAgJ0xheW91dFRlc3RzL3BsYXRmb3JtL21hYyc6ICc1ZGFhNzhlNTVmMDVkOWYw
ZDFiYjFmMzJiMGNkMWJjM2EwMWU5MzY0JywKKyAgICAgICAgICAgICdMYXlvdXRUZXN0cy9wbGF0
Zm9ybS9jaHJvbWl1bS13aW4teHAnOiAnNDYyZDAzYjljMDI1ZGIxYjAzOTJkNzQ1MzMxMGRiZWU1
ZjlhOWU3NCcsCisgICAgICAgICAgICAnTGF5b3V0VGVzdHMvcGxhdGZvcm0vY2hyb21pdW0tbWFj
LWxlb3BhcmQnOiAnNjVlN2Q0MmY4YjQ4ODJiMjlkNDZkYzc3YmI4NzlkZDQxYmMwNzRkYycsCisg
ICAgICAgICAgICAnTGF5b3V0VGVzdHMvcGxhdGZvcm0vbWFjLWxlb3BhcmQnOiAnN2FkMDQ1ZWNl
N2MwMzBlMjI4M2M1ZDIxZDk1ODdiZTIyYmNiYTU2ZScsCisgICAgICAgICAgICAnTGF5b3V0VGVz
dHMvcGxhdGZvcm0vY2hyb21pdW0td2luLXZpc3RhJzogJ2Y4M2FmOTczMmNlNzRmNzAyYjhjOWM0
YTNkOWE0YzY2MzZiOGQzYmQnLAorICAgICAgICAgICAgJ0xheW91dFRlc3RzL3BsYXRmb3JtL3dp
bic6ICc1YjEyNTNlZjRkNTA5NDUzMGQ1ZjFiYzZjZGI5NWM5MGI0NDZiZWM3JywKKyAgICAgICAg
ICAgICdMYXlvdXRUZXN0cy9wbGF0Zm9ybS9jaHJvbWl1bS1saW51eCc6ICdmNTJmY2RkZTllNGJl
OGJkNTE0MjE3MWNkODU5MjMwYmQ0NDcxMDM2JworICAgICAgICB9KQpkaWZmIC0tZ2l0IGEvVG9v
bHMvU2NyaXB0cy93ZWJraXRweS9jb21tb24vc3lzdGVtL2ZpbGVzeXN0ZW0ucHkgYi9Ub29scy9T
Y3JpcHRzL3dlYmtpdHB5L2NvbW1vbi9zeXN0ZW0vZmlsZXN5c3RlbS5weQppbmRleCAwYWY2ZWM4
OTE1MjY1ZTQ1YzMzNTBhY2UyNGY2NWUxM2M5NTAyZjUyLi43ZGU0MWE0MjRkMWJiY2Y5NTFiZWNh
MmZlOGU0YTU0OTQyMWE2ZDgyIDEwMDY0NAotLS0gYS9Ub29scy9TY3JpcHRzL3dlYmtpdHB5L2Nv
bW1vbi9zeXN0ZW0vZmlsZXN5c3RlbS5weQorKysgYi9Ub29scy9TY3JpcHRzL3dlYmtpdHB5L2Nv
bW1vbi9zeXN0ZW0vZmlsZXN5c3RlbS5weQpAQCAtMzQsNiArMzQsNyBAQCBpbXBvcnQgY29kZWNz
CiBpbXBvcnQgZXJybm8KIGltcG9ydCBleGNlcHRpb25zCiBpbXBvcnQgZ2xvYgoraW1wb3J0IGhh
c2hsaWIKIGltcG9ydCBvcwogaW1wb3J0IHNodXRpbAogaW1wb3J0IHN5cwpAQCAtMjIzLDYgKzIy
NCwxMCBAQCBjbGFzcyBGaWxlU3lzdGVtKG9iamVjdCk6CiAgICAgICAgIHdpdGggY29kZWNzLm9w
ZW4ocGF0aCwgJ3cnLCAndXRmOCcpIGFzIGY6CiAgICAgICAgICAgICBmLndyaXRlKGNvbnRlbnRz
KQogCisgICAgZGVmIHNoYTEoc2VsZiwgcGF0aCk6CisgICAgICAgIGNvbnRlbnRzID0gc2VsZi5y
ZWFkX2JpbmFyeV9maWxlKHBhdGgpCisgICAgICAgIHJldHVybiBoYXNobGliLnNoYTEoY29udGVu
dHMpLmhleGRpZ2VzdCgpCisKICAgICBkZWYgcmVscGF0aChzZWxmLCBwYXRoLCBzdGFydD0nLicp
OgogICAgICAgICByZXR1cm4gb3NwYXRoLnJlbHBhdGgocGF0aCwgc3RhcnQpCiAKZGlmZiAtLWdp
dCBhL1Rvb2xzL1NjcmlwdHMvd2Via2l0cHkvY29tbW9uL3N5c3RlbS9maWxlc3lzdGVtX21vY2su
cHkgYi9Ub29scy9TY3JpcHRzL3dlYmtpdHB5L2NvbW1vbi9zeXN0ZW0vZmlsZXN5c3RlbV9tb2Nr
LnB5CmluZGV4IDFlYzhiNmI5NTgwZTFiZWY1MGIxZTMwYTRjYjRkOWY4MzhhZGZlYTMuLmY5MTJm
YWNmYTkwNjYxZjZjOGRkNGFjOTA5MzI0MDhkNjhjZWY5NDQgMTAwNjQ0Ci0tLSBhL1Rvb2xzL1Nj
cmlwdHMvd2Via2l0cHkvY29tbW9uL3N5c3RlbS9maWxlc3lzdGVtX21vY2sucHkKKysrIGIvVG9v
bHMvU2NyaXB0cy93ZWJraXRweS9jb21tb24vc3lzdGVtL2ZpbGVzeXN0ZW1fbW9jay5weQpAQCAt
MjcsNiArMjcsNyBAQAogIyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhF
IFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgogCiBpbXBvcnQgZXJybm8KK2ltcG9ydCBoYXNo
bGliCiBpbXBvcnQgb3MKIGltcG9ydCByZQogCkBAIC0yODQsNiArMjg1LDEwIEBAIGNsYXNzIE1v
Y2tGaWxlU3lzdGVtKG9iamVjdCk6CiAgICAgZGVmIHdyaXRlX3RleHRfZmlsZShzZWxmLCBwYXRo
LCBjb250ZW50cyk6CiAgICAgICAgIHJldHVybiBzZWxmLndyaXRlX2JpbmFyeV9maWxlKHBhdGgs
IGNvbnRlbnRzLmVuY29kZSgndXRmLTgnKSkKIAorICAgIGRlZiBzaGExKHNlbGYsIHBhdGgpOgor
ICAgICAgICBjb250ZW50cyA9IHNlbGYucmVhZF9iaW5hcnlfZmlsZShwYXRoKQorICAgICAgICBy
ZXR1cm4gaGFzaGxpYi5zaGExKGNvbnRlbnRzKS5oZXhkaWdlc3QoKQorCiAgICAgZGVmIHJlbHBh
dGgoc2VsZiwgcGF0aCwgc3RhcnQ9Jy4nKToKICAgICAgICAgcmV0dXJuIG9zcGF0aC5yZWxwYXRo
KHBhdGgsIHN0YXJ0LCBzZWxmLmFic3BhdGgsIHNlbGYuc2VwKQogCmRpZmYgLS1naXQgYS9Ub29s
cy9TY3JpcHRzL3dlYmtpdHB5L2xheW91dF90ZXN0cy9wb3J0L2Jhc2UucHkgYi9Ub29scy9TY3Jp
cHRzL3dlYmtpdHB5L2xheW91dF90ZXN0cy9wb3J0L2Jhc2UucHkKaW5kZXggNDkwOTk4M2U1Yjc0
NWIyMzIxYmMzMmM2YTk4Yzc1Y2I2NzA3MjVmOS4uYWUyM2UxMWVmYmE0MmMxZGYyZjQwYjcyYjMy
OGI4OGM5MmMyMjM4MyAxMDA3NTUKLS0tIGEvVG9vbHMvU2NyaXB0cy93ZWJraXRweS9sYXlvdXRf
dGVzdHMvcG9ydC9iYXNlLnB5CisrKyBiL1Rvb2xzL1NjcmlwdHMvd2Via2l0cHkvbGF5b3V0X3Rl
c3RzL3BvcnQvYmFzZS5weQpAQCAtNTQxLDYgKzU0MSw5IEBAIGNsYXNzIFBvcnQob2JqZWN0KToK
ICAgICAgICAgIiIiUmV0dXJuIHRoZSBhYnNvbHV0ZSBwYXRoIHRvIHRoZSB0b3Agb2YgdGhlIExh
eW91dFRlc3RzIGRpcmVjdG9yeS4iIiIKICAgICAgICAgcmV0dXJuIHNlbGYucGF0aF9mcm9tX3dl
YmtpdF9iYXNlKCdMYXlvdXRUZXN0cycpCiAKKyAgICBkZWYgd2Via2l0X2Jhc2Uoc2VsZik6Cisg
ICAgICAgIHJldHVybiBzZWxmLl9maWxlc3lzdGVtLmFic3BhdGgoc2VsZi5wYXRoX2Zyb21fd2Vi
a2l0X2Jhc2UoJy4nKSkKKwogICAgIGRlZiBza2lwcGVkX2xheW91dF90ZXN0cyhzZWxmKToKICAg
ICAgICAgcmV0dXJuIFtdCiAKZGlmZiAtLWdpdCBhL1Rvb2xzL1NjcmlwdHMvd2Via2l0cHkvdG9v
bC9jb21tYW5kcy9yZWJhc2VsaW5lLnB5IGIvVG9vbHMvU2NyaXB0cy93ZWJraXRweS90b29sL2Nv
bW1hbmRzL3JlYmFzZWxpbmUucHkKaW5kZXggZTRkOTVkYjdiZmQ2NzEyZmZkN2RhM2Q1MmQzZTYy
MjcwMTk4Zjk5ZS4uMDRiMjRlNzA5OWQwOWJkMWY2NGM3NDkzMzNlNWQyOTA0OWIyMmY2YiAxMDA2
NDQKLS0tIGEvVG9vbHMvU2NyaXB0cy93ZWJraXRweS90b29sL2NvbW1hbmRzL3JlYmFzZWxpbmUu
cHkKKysrIGIvVG9vbHMvU2NyaXB0cy93ZWJraXRweS90b29sL2NvbW1hbmRzL3JlYmFzZWxpbmUu
cHkKQEAgLTMyLDkgKzMyLDExIEBAIGltcG9ydCBzaHV0aWwKIGltcG9ydCB1cmxsaWIKIAogaW1w
b3J0IHdlYmtpdHB5LmNvbW1vbi5jb25maWcudXJscyBhcyBjb25maWdfdXJscworZnJvbSB3ZWJr
aXRweS5jb21tb24uY2hlY2tvdXQuYmFzZWxpbmVvcHRpbWl6ZXIgaW1wb3J0IEJhc2VsaW5lT3B0
aW1pemVyCiBmcm9tIHdlYmtpdHB5LmNvbW1vbi5uZXQuYnVpbGRib3QgaW1wb3J0IEJ1aWxkQm90
CiBmcm9tIHdlYmtpdHB5LmNvbW1vbi5uZXQubGF5b3V0dGVzdHJlc3VsdHMgaW1wb3J0IExheW91
dFRlc3RSZXN1bHRzCiBmcm9tIHdlYmtpdHB5LmNvbW1vbi5zeXN0ZW0udXNlciBpbXBvcnQgVXNl
cgorZnJvbSB3ZWJraXRweS5sYXlvdXRfdGVzdHMubGF5b3V0X3BhY2thZ2UudGVzdF9yZXN1bHRf
d3JpdGVyIGltcG9ydCBUZXN0UmVzdWx0V3JpdGVyCiBmcm9tIHdlYmtpdHB5LmxheW91dF90ZXN0
cy5tb2RlbHMgaW1wb3J0IHRlc3RfZmFpbHVyZXMKIGZyb20gd2Via2l0cHkubGF5b3V0X3Rlc3Rz
LnBvcnQgaW1wb3J0IGZhY3RvcnkKIGZyb20gd2Via2l0cHkudG9vbC5ncmFtbWFyIGltcG9ydCBw
bHVyYWxpemUKQEAgLTEyOCw2ICsxMzAsMjUgQEAgY2xhc3MgUmViYXNlbGluZVRlc3QoQWJzdHJh
Y3REZWNsYXJhdGl2ZUNvbW1hbmQpOgogICAgICAgICBzZWxmLl9yZWJhc2VsaW5lX3Rlc3QoYXJn
c1swXSwgYXJnc1sxXSwgYXJnc1syXSkKIAogCitjbGFzcyBPcHRpbWl6ZUJhc2VsaW5lcyhBYnN0
cmFjdERlY2xhcmF0aXZlQ29tbWFuZCk6CisgICAgbmFtZSA9ICJvcHRpbWl6ZS1iYXNlbGluZXMi
CisgICAgaGVscF90ZXh0ID0gIlJlc2h1ZmZsZXMgdGhlIGJhc2VsaW5lcyBmb3IgYSB0aGUgZ2l2
ZW4gdGVzdCB0byB1c2UgYXMgbGl0dGUgc3BhY2Ugb24gZGlzayBhcyBwb3NzaWJsZS4iCisgICAg
YXJndW1lbnRfbmFtZXMgPSAiVEVTVF9OQU1FIgorCisgICAgIyBGSVhNRTogU2hvdWxkIFRlc3RS
ZXN1bHRXcml0ZXIga25vdyBob3cgdG8gY29tcHV0ZSB0aGlzIHN0cmluZz8KKyAgICBkZWYgX2Jh
c2VsaW5lX25hbWUoc2VsZiwgdGVzdF9uYW1lLCBzdWZmaXgpOgorICAgICAgICByZXR1cm4gc2Vs
Zi5fdG9vbC5maWxlc3lzdGVtLnNwbGl0ZXh0KHRlc3RfbmFtZSlbMF0gKyBUZXN0UmVzdWx0V3Jp
dGVyLkZJTEVOQU1FX1NVRkZJWF9FWFBFQ1RFRCArIHN1ZmZpeAorCisgICAgZGVmIGV4ZWN1dGUo
c2VsZiwgb3B0aW9ucywgYXJncywgdG9vbCk6CisgICAgICAgIGJhc2VsaW5lX29wdGltaXplciA9
IEJhc2VsaW5lT3B0aW1pemVyKHRvb2wuc2NtKCksIHRvb2wuZmlsZXN5c3RlbSkKKworICAgICAg
ICB0ZXN0X25hbWUgPSBhcmdzWzBdCisgICAgICAgIGZvciBzdWZmaXggaW4gWycucG5nJywgJy50
eHQnXToKKyAgICAgICAgICAgIGJhc2VsaW5lX25hbWUgPSBzZWxmLl9iYXNlbGluZV9uYW1lKHRl
c3RfbmFtZSwgc3VmZml4KQorICAgICAgICAgICAgaWYgbm90IGJhc2VsaW5lX29wdGltaXplci5v
cHRpbWl6ZShiYXNlbGluZV9uYW1lKToKKyAgICAgICAgICAgICAgICBwcmludCAiSHVlcmlzdGlj
cyBmYWlsZWQgdG8gb3B0aW1pemUgJXMiICUgYmFzZWxpbmVfbmFtZQorCisKIGNsYXNzIFJlYmFz
ZWxpbmUoQWJzdHJhY3REZWNsYXJhdGl2ZUNvbW1hbmQpOgogICAgIG5hbWUgPSAicmViYXNlbGlu
ZSIKICAgICBoZWxwX3RleHQgPSAiUmVwbGFjZXMgbG9jYWwgZXhwZWN0ZWQudHh0IGZpbGVzIHdp
dGggbmV3IHJlc3VsdHMgZnJvbSBidWlsZCBib3RzIgo=
</data>

          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>102585</attachid>
            <date>2011-08-01 16:08:34 -0700</date>
            <delta_ts>2011-08-01 17:07:29 -0700</delta_ts>
            <desc>Patch for landing</desc>
            <filename>bug-65418-20110801160833.patch</filename>
            <type>text/plain</type>
            <size>20560</size>
            <attacher name="Adam Barth">abarth</attacher>
            
              <data encoding="base64">U3VidmVyc2lvbiBSZXZpc2lvbjogOTIxNDMKZGlmZiAtLWdpdCBhL1Rvb2xzL0NoYW5nZUxvZyBi
L1Rvb2xzL0NoYW5nZUxvZwppbmRleCAwNWRmMDdkYWFiZTZkMmYzOTVlODMxNDY0OGI2ZjA3YWU1
NTRhOTAyLi45MmFhNTY0NmM3NjdlMjNhYjFmYzJkZDFlMmEyNDk0ZTZkMjE4ODRjIDEwMDY0NAot
LS0gYS9Ub29scy9DaGFuZ2VMb2cKKysrIGIvVG9vbHMvQ2hhbmdlTG9nCkBAIC0xLDUgKzEsMjgg
QEAKIDIwMTEtMDgtMDEgIEFkYW0gQmFydGggIDxhYmFydGhAd2Via2l0Lm9yZz4KIAorICAgICAg
ICB3ZWJraXQtcGF0Y2ggbmVlZHMgdG8gYmUgYWJsZSB0byAib3B0aW1pemUiIHRoZSBzdG9yYWdl
IG9mIGJhc2VsaW5lcyBvbiBkaXNrCisgICAgICAgIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3No
b3dfYnVnLmNnaT9pZD02NTQxOAorCisgICAgICAgIFJldmlld2VkIGJ5IERpbWl0cmkgR2xhemtv
di4KKworICAgICAgICBJZiB3ZSdyZSBub3QgY2FyZWZ1bCB3aGVuIHJlYmFzZWxpbmluZyB0ZXN0
cywgd2UgY2FuIGVuZCB1cCB3aXRoIGxvdHMKKyAgICAgICAgb2YgZHVwbGljYXRlIGV4cGVjdGVk
IHJlc3VsdHMgZmlsZXMgaW4gdGhlIHRyZWUuICBUaGlzIHBhdGNoIGFkZHMgYQorICAgICAgICB3
ZWJraXQtcGF0Y2ggY29tbWFuZCB0aGF0IG9wdGltaXplcyB0aGUgc3RvcmFnZSBvZiBleHBlY3Rl
ZCByZXN1bHRzIG9uCisgICAgICAgIGRpc2suCisKKyAgICAgICAgVGhpcyBjb21tYW5kIGlzIHNp
bWlsYXIgdG8gZGVkdXBsaWNhdGUtdGVzdHMsIGV4Y2VwdCB0aGF0IGl0IGNhbiBtb3ZlCisgICAg
ICAgIHRlc3QgcmVzdWx0cyBhcm91bmQgcmF0aGVyIHRoYW4ganVzdCByZW1vdmUgZHVwbGljYXRl
IHJlc3VsdHMuCisKKyAgICAgICAgVW5mb3J0dW5hdGVseSwgdGhpcyBwcm9ibGVtIGlzIHZlcnkg
dHJpY2t5IGJlY2F1c2UgdGhlIGJhc2VsaW5lIHNlYXJjaAorICAgICAgICBzdHJ1Y3R1cmUgaXMg
YSBoeXBlcmdyYXBoLiAgVGhpcyBwYXRjaCBpbmNsdWRlIGEgaHVlcnN0aWMgb3B0aW1pemVyCisg
ICAgICAgIHRoYXQgYXBwZWFycyB0byB3b3JrIG9uIGEgYnVuY2ggb2YgZXhhbXBsZXMgSSd2ZSB0
cmllZC4gIFdlJ2xsIGxpa2VseQorICAgICAgICBuZWVkIHRvIHJlZmluZSBpdCBhcyBnYWluIGV4
cGVyaWVuY2UuCisKKyAgICAgICAgKiBTY3JpcHRzL3dlYmtpdHB5L2NvbW1vbi9zeXN0ZW0vZmls
ZXN5c3RlbS5weToKKyAgICAgICAgKiBTY3JpcHRzL3dlYmtpdHB5L3Rvb2wvY29tbWFuZHMvcmVi
YXNlbGluZS5weToKKworMjAxMS0wOC0wMSAgQWRhbSBCYXJ0aCAgPGFiYXJ0aEB3ZWJraXQub3Jn
PgorCiAgICAgICAgIFJlbW92ZSB1bnVzZWQgZnVuY3Rpb25hbGl0eSBmcm9tIGdhcmRlbmluZ3Nl
cnZlcgogICAgICAgICBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NjU0
NzkKIApkaWZmIC0tZ2l0IGEvVG9vbHMvU2NyaXB0cy93ZWJraXRweS9jb21tb24vY2hlY2tvdXQv
YmFzZWxpbmVvcHRpbWl6ZXIucHkgYi9Ub29scy9TY3JpcHRzL3dlYmtpdHB5L2NvbW1vbi9jaGVj
a291dC9iYXNlbGluZW9wdGltaXplci5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwLi5hZTE1YWYxOTQwYTMxNDQ4MTg1
YmIwOTczMjU4Yzk0OTM2MWFhYTc1Ci0tLSAvZGV2L251bGwKKysrIGIvVG9vbHMvU2NyaXB0cy93
ZWJraXRweS9jb21tb24vY2hlY2tvdXQvYmFzZWxpbmVvcHRpbWl6ZXIucHkKQEAgLTAsMCArMSwx
NTQgQEAKKyMgQ29weXJpZ2h0IChDKSAyMDExLCBHb29nbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2Vy
dmVkLgorIworIyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZv
cm1zLCB3aXRoIG9yIHdpdGhvdXQKKyMgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3Zp
ZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorIyBtZXQ6CisjCisjICAgICAq
IFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29w
eXJpZ2h0CisjIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dp
bmcgZGlzY2xhaW1lci4KKyMgICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11
c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorIyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2Yg
Y29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisjIGluIHRoZSBkb2N1bWVu
dGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyMgZGlzdHJp
YnV0aW9uLgorIyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUg
bmFtZXMgb2YgaXRzCisjIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHBy
b21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisjIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVj
aWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisjCisjIFRISVMgU09GVFdBUkUgSVMgUFJP
VklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyMgIkFTIElT
IiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBO
T1QKKyMgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJ
VFkgQU5EIEZJVE5FU1MgRk9SCisjIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVE
LiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisjIE9XTkVSIE9SIENPTlRSSUJVVE9S
UyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorIyBTUEVD
SUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQg
Tk9UCisjIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VS
VklDRVM7IExPU1MgT0YgVVNFLAorIyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRF
UlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyMgVEhFT1JZIE9GIExJQUJJTElU
WSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorIyAoSU5D
TFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9G
IFRIRSBVU0UKKyMgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NT
SUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworZnJvbSB3ZWJraXRweS5sYXlvdXRfdGVzdHMucG9y
dCBpbXBvcnQgZmFjdG9yeSBhcyBwb3J0X2ZhY3RvcnkKKworCisjIFllcywgaXQncyBhIGh5cGVy
Z3JhcGguCisjIEZJWE1FOiBTaG91bGQgdGhpcyBmdW5jdGlvbiBsaXZlIHdpdGggdGhlIHBvcnRz
IHNvbWV3aGVyZT8KK2RlZiBfYmFzZWxpbmVfc2VhcmNoX2h5cGVyZ3JhcGgoZnMpOgorICAgIGh5
cGVyZ3JhcGggPSB7fQorCisgICAgIyBUaGVzZSBlZGdlcyBpbiB0aGUgaHlwZXJncmFwaCBhcmVu
J3QgdmlzaWJsZSBvbiBidWlsZC53ZWJraXQub3JnLAorICAgICMgYnV0IHRoZXkgaW1wb3NlIGNv
bnN0cmFpbnRzIG9uIGhvdyB3ZSBvcHRpbWl6ZSBiYXNlbGluZXMuCisgICAgaHlwZXJncmFwaFsn
bWFjLWZ1dHVyZSddID0gWydMYXlvdXRUZXN0cy9wbGF0Zm9ybS9tYWMtZnV0dXJlJywgJ0xheW91
dFRlc3RzL3BsYXRmb3JtL21hYyddCisgICAgaHlwZXJncmFwaFsncXQtdW5rbm93biddID0gWydM
YXlvdXRUZXN0cy9wbGF0Zm9ybS9xdC11bmtub3duJywgJ0xheW91dFRlc3RzL3BsYXRmb3JtL3F0
J10KKworICAgIGZvciBwb3J0X25hbWUgaW4gcG9ydF9mYWN0b3J5LmFsbF9wb3J0X25hbWVzKCk6
CisgICAgICAgIHBvcnQgPSBwb3J0X2ZhY3RvcnkuZ2V0KHBvcnRfbmFtZSkKKyAgICAgICAgd2Vi
a2l0X2Jhc2UgPSBwb3J0LndlYmtpdF9iYXNlKCkKKyAgICAgICAgc2VhcmNoX3BhdGggPSBwb3J0
LmJhc2VsaW5lX3NlYXJjaF9wYXRoKCkKKyAgICAgICAgaWYgc2VhcmNoX3BhdGg6CisgICAgICAg
ICAgICBoeXBlcmdyYXBoW3BvcnRfbmFtZV0gPSBbZnMucmVscGF0aChwYXRoLCB3ZWJraXRfYmFz
ZSkgZm9yIHBhdGggaW4gc2VhcmNoX3BhdGhdCisgICAgcmV0dXJuIGh5cGVyZ3JhcGgKKworCisj
IEZJWE1FOiBTaG91bGQgdGhpcyBmdW5jdGlvbiBiZSBzb21ld2hlcmUgbW9yZSBnZW5lcmFsPwor
ZGVmIF9pbnZlcnRfZGljdGlvbmFyeShkaWN0aW9uYXJ5KToKKyAgICBpbnZlcnRlZF9kaWN0aW9u
YXJ5ID0ge30KKyAgICBmb3Iga2V5LCB2YWx1ZSBpbiBkaWN0aW9uYXJ5Lml0ZW1zKCk6CisgICAg
ICAgIGlmIGludmVydGVkX2RpY3Rpb25hcnkuZ2V0KHZhbHVlKToKKyAgICAgICAgICAgIGludmVy
dGVkX2RpY3Rpb25hcnlbdmFsdWVdLmFwcGVuZChrZXkpCisgICAgICAgIGVsc2U6CisgICAgICAg
ICAgICBpbnZlcnRlZF9kaWN0aW9uYXJ5W3ZhbHVlXSA9IFtrZXldCisgICAgcmV0dXJuIGludmVy
dGVkX2RpY3Rpb25hcnkKKworCitjbGFzcyBCYXNlbGluZU9wdGltaXplcihvYmplY3QpOgorICAg
IGRlZiBfX2luaXRfXyhzZWxmLCBzY20sIGZpbGVzeXN0ZW0pOgorICAgICAgICBzZWxmLl9zY20g
PSBzY20KKyAgICAgICAgc2VsZi5fZmlsZXN5c3RlbSA9IGZpbGVzeXN0ZW0KKyAgICAgICAgc2Vs
Zi5faHlwZXJncmFwaCA9IF9iYXNlbGluZV9zZWFyY2hfaHlwZXJncmFwaChzZWxmLl9maWxlc3lz
dGVtKQorICAgICAgICBzZWxmLl9kaXJlY3RvcmllcyA9IHJlZHVjZShzZXQudW5pb24sIG1hcChz
ZXQsIHNlbGYuX2h5cGVyZ3JhcGgudmFsdWVzKCkpKQorCisgICAgZGVmIF9yZWFkX3Jlc3VsdHNf
YnlfZGlyZWN0b3J5KHNlbGYsIGJhc2VsaW5lX25hbWUpOgorICAgICAgICByZXN1bHRzX2J5X2Rp
cmVjdG9yeSA9IHt9CisgICAgICAgIGZvciBkaXJlY3RvcnkgaW4gc2VsZi5fZGlyZWN0b3JpZXM6
CisgICAgICAgICAgICBwYXRoID0gc2VsZi5fZmlsZXN5c3RlbS5qb2luKHNlbGYuX3NjbS5jaGVj
a291dF9yb290LCBkaXJlY3RvcnksIGJhc2VsaW5lX25hbWUpCisgICAgICAgICAgICBpZiBzZWxm
Ll9maWxlc3lzdGVtLmV4aXN0cyhwYXRoKToKKyAgICAgICAgICAgICAgICByZXN1bHRzX2J5X2Rp
cmVjdG9yeVtkaXJlY3RvcnldID0gc2VsZi5fZmlsZXN5c3RlbS5zaGExKHBhdGgpCisgICAgICAg
IHJldHVybiByZXN1bHRzX2J5X2RpcmVjdG9yeQorCisgICAgZGVmIF9yZXN1bHRzX2J5X3BvcnRf
bmFtZShzZWxmLCByZXN1bHRzX2J5X2RpcmVjdG9yeSk6CisgICAgICAgIHJlc3VsdHNfYnlfcG9y
dF9uYW1lID0ge30KKyAgICAgICAgZm9yIHBvcnRfbmFtZSwgc2VhcmNoX3BhdGggaW4gc2VsZi5f
aHlwZXJncmFwaC5pdGVtcygpOgorICAgICAgICAgICAgZm9yIGRpcmVjdG9yeSBpbiBzZWFyY2hf
cGF0aDoKKyAgICAgICAgICAgICAgICBpZiBkaXJlY3RvcnkgaW4gcmVzdWx0c19ieV9kaXJlY3Rv
cnk6CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdHNfYnlfcG9ydF9uYW1lW3BvcnRfbmFtZV0g
PSByZXN1bHRzX2J5X2RpcmVjdG9yeVtkaXJlY3RvcnldCisgICAgICAgICAgICAgICAgICAgIGJy
ZWFrCisgICAgICAgIHJldHVybiByZXN1bHRzX2J5X3BvcnRfbmFtZQorCisgICAgZGVmIF9tb3N0
X3NwZWNpZmljX2NvbW1vbl9kaXJlY3Rvcnkoc2VsZiwgcG9ydF9uYW1lcyk6CisgICAgICAgIHBh
dGhzID0gW3NlbGYuX2h5cGVyZ3JhcGhbcG9ydF9uYW1lXSBmb3IgcG9ydF9uYW1lIGluIHBvcnRf
bmFtZXNdCisgICAgICAgIGNvbW1vbl9kaXJlY3RvcmllcyA9IHJlZHVjZShzZXQuaW50ZXJzZWN0
aW9uLCBtYXAoc2V0LCBwYXRocykpCisKKyAgICAgICAgZGVmIHNjb3JlKGRpcmVjdG9yeSk6Cisg
ICAgICAgICAgICByZXR1cm4gc3VtKFtwYXRoLmluZGV4KGRpcmVjdG9yeSkgZm9yIHBhdGggaW4g
cGF0aHNdKQorCisgICAgICAgIF8sIGRpcmVjdG9yeSA9IHNvcnRlZChbKHNjb3JlKGRpcmVjdG9y
eSksIGRpcmVjdG9yeSkgZm9yIGRpcmVjdG9yeSBpbiBjb21tb25fZGlyZWN0b3JpZXNdKVswXQor
ICAgICAgICByZXR1cm4gZGlyZWN0b3J5CisKKyAgICBkZWYgX2ZpbHRlcl9wb3J0X25hbWVzX2J5
X3Jlc3VsdChzZWxmLCBwcmVkaWNhdGUsIHBvcnRfbmFtZXNfYnlfcmVzdWx0KToKKyAgICAgICAg
ZmlsdGVyZWRfcG9ydF9uYW1lc19ieV9yZXN1bHQgPSB7fQorICAgICAgICBmb3IgcmVzdWx0LCBw
b3J0X25hbWVzIGluIHBvcnRfbmFtZXNfYnlfcmVzdWx0Lml0ZW1zKCk6CisgICAgICAgICAgICBm
aWx0ZXJlZF9wb3J0X25hbWVzID0gZmlsdGVyKHByZWRpY2F0ZSwgcG9ydF9uYW1lcykKKyAgICAg
ICAgICAgIGlmIGZpbHRlcmVkX3BvcnRfbmFtZXM6CisgICAgICAgICAgICAgICAgZmlsdGVyZWRf
cG9ydF9uYW1lc19ieV9yZXN1bHRbcmVzdWx0XSA9IGZpbHRlcmVkX3BvcnRfbmFtZXMKKyAgICAg
ICAgcmV0dXJuIGZpbHRlcmVkX3BvcnRfbmFtZXNfYnlfcmVzdWx0CisKKyAgICBkZWYgX3BsYWNl
X3Jlc3VsdHNfaW5fbW9zdF9zcGVjaWZpY19jb21tb25fZGlyZWN0b3J5KHNlbGYsIHBvcnRfbmFt
ZXNfYnlfcmVzdWx0LCByZXN1bHRzX2J5X2RpcmVjdG9yeSk6CisgICAgICAgIGZvciByZXN1bHQs
IHBvcnRfbmFtZXMgaW4gcG9ydF9uYW1lc19ieV9yZXN1bHQuaXRlbXMoKToKKyAgICAgICAgICAg
IGRpcmVjdG9yeSA9IHNlbGYuX21vc3Rfc3BlY2lmaWNfY29tbW9uX2RpcmVjdG9yeShwb3J0X25h
bWVzKQorICAgICAgICAgICAgcmVzdWx0c19ieV9kaXJlY3RvcnlbZGlyZWN0b3J5XSA9IHJlc3Vs
dAorCisgICAgZGVmIF9maW5kX29wdGltYWxfcmVzdWx0X3BsYWNlbWVudChzZWxmLCBiYXNlbGlu
ZV9uYW1lKToKKyAgICAgICAgcmVzdWx0c19ieV9kaXJlY3RvcnkgPSBzZWxmLl9yZWFkX3Jlc3Vs
dHNfYnlfZGlyZWN0b3J5KGJhc2VsaW5lX25hbWUpCisgICAgICAgIHJlc3VsdHNfYnlfcG9ydF9u
YW1lID0gc2VsZi5fcmVzdWx0c19ieV9wb3J0X25hbWUocmVzdWx0c19ieV9kaXJlY3RvcnkpCisg
ICAgICAgIHBvcnRfbmFtZXNfYnlfcmVzdWx0ID0gX2ludmVydF9kaWN0aW9uYXJ5KHJlc3VsdHNf
YnlfcG9ydF9uYW1lKQorCisgICAgICAgIG5ld19yZXN1bHRzX2J5X2RpcmVjdG9yeSA9IHt9Cisg
ICAgICAgIHVuc2F0aXNmaWVkX3BvcnRfbmFtZXNfYnlfcmVzdWx0ID0gcG9ydF9uYW1lc19ieV9y
ZXN1bHQKKyAgICAgICAgd2hpbGUgdW5zYXRpc2ZpZWRfcG9ydF9uYW1lc19ieV9yZXN1bHQ6Cisg
ICAgICAgICAgICBzZWxmLl9wbGFjZV9yZXN1bHRzX2luX21vc3Rfc3BlY2lmaWNfY29tbW9uX2Rp
cmVjdG9yeSh1bnNhdGlzZmllZF9wb3J0X25hbWVzX2J5X3Jlc3VsdCwgbmV3X3Jlc3VsdHNfYnlf
ZGlyZWN0b3J5KQorICAgICAgICAgICAgbmV3X3Jlc3VsdHNfYnlfcG9ydF9uYW1lID0gc2VsZi5f
cmVzdWx0c19ieV9wb3J0X25hbWUobmV3X3Jlc3VsdHNfYnlfZGlyZWN0b3J5KQorCisgICAgICAg
ICAgICBkZWYgaXNfdW5zYXRpc2ZpZWQocG9ydF9uYW1lKToKKyAgICAgICAgICAgICAgICByZXR1
cm4gcmVzdWx0c19ieV9wb3J0X25hbWVbcG9ydF9uYW1lXSAhPSBuZXdfcmVzdWx0c19ieV9wb3J0
X25hbWVbcG9ydF9uYW1lXQorCisgICAgICAgICAgICBuZXdfdW5zYXRpc2ZpZWRfcG9ydF9uYW1l
c19ieV9yZXN1bHQgPSBzZWxmLl9maWx0ZXJfcG9ydF9uYW1lc19ieV9yZXN1bHQoaXNfdW5zYXRp
c2ZpZWQsIHBvcnRfbmFtZXNfYnlfcmVzdWx0KQorCisgICAgICAgICAgICBpZiBsZW4obmV3X3Vu
c2F0aXNmaWVkX3BvcnRfbmFtZXNfYnlfcmVzdWx0LnZhbHVlcygpKSA+PSBsZW4odW5zYXRpc2Zp
ZWRfcG9ydF9uYW1lc19ieV9yZXN1bHQudmFsdWVzKCkpOgorICAgICAgICAgICAgICAgIGJyZWFr
ICAjIEZyb3ducy4gV2UgZG8gbm90IGFwcGVhciB0byBiZSBjb252ZXJnaW5nLgorICAgICAgICAg
ICAgdW5zYXRpc2ZpZWRfcG9ydF9uYW1lc19ieV9yZXN1bHQgPSBuZXdfdW5zYXRpc2ZpZWRfcG9y
dF9uYW1lc19ieV9yZXN1bHQKKworICAgICAgICByZXR1cm4gcmVzdWx0c19ieV9kaXJlY3Rvcnks
IG5ld19yZXN1bHRzX2J5X2RpcmVjdG9yeQorCisgICAgZGVmIF9tb3ZlX2Jhc2VsaW5lcyhzZWxm
LCBiYXNlbGluZV9uYW1lLCByZXN1bHRzX2J5X2RpcmVjdG9yeSwgbmV3X3Jlc3VsdHNfYnlfZGly
ZWN0b3J5KToKKyAgICAgICAgc291cmNlX2RpcmVjdG9yeV9mb3JfcmVzdWx0ID0ge30KKyAgICAg
ICAgZm9yIGRpcmVjdG9yeSwgcmVzdWx0IGluIHJlc3VsdHNfYnlfZGlyZWN0b3J5Lml0ZW1zKCk6
CisgICAgICAgICAgICBzb3VyY2VfZGlyZWN0b3J5X2Zvcl9yZXN1bHRbcmVzdWx0XSA9IGRpcmVj
dG9yeQorCisgICAgICAgIGZvciBkaXJlY3RvcnksIHJlc3VsdCBpbiBuZXdfcmVzdWx0c19ieV9k
aXJlY3RvcnkuaXRlbXMoKToKKyAgICAgICAgICAgIGlmIHJlc3VsdHNfYnlfZGlyZWN0b3J5Lmdl
dChkaXJlY3RvcnkpICE9IHJlc3VsdDoKKyAgICAgICAgICAgICAgICBzb3VyY2UgPSBzZWxmLl9m
aWxlc3lzdGVtLmpvaW4oc2VsZi5fc2NtLmNoZWNrb3V0X3Jvb3QsIHNvdXJjZV9kaXJlY3Rvcnlf
Zm9yX3Jlc3VsdFtyZXN1bHRdLCBiYXNlbGluZV9uYW1lKQorICAgICAgICAgICAgICAgIGRlc3Rp
bmF0aW9uID0gc2VsZi5fZmlsZXN5c3RlbS5qb2luKHNlbGYuX3NjbS5jaGVja291dF9yb290LCBk
aXJlY3RvcnksIGJhc2VsaW5lX25hbWUpCisgICAgICAgICAgICAgICAgc2VsZi5fZmlsZXN5c3Rl
bS5tYXliZV9tYWtlX2RpcmVjdG9yeShzZWxmLl9maWxlc3lzdGVtLnNwbGl0KGRlc3RpbmF0aW9u
KVswXSkKKyAgICAgICAgICAgICAgICBzZWxmLl9maWxlc3lzdGVtLmNvcHlmaWxlKHNvdXJjZSwg
ZGVzdGluYXRpb24pCisgICAgICAgICAgICAgICAgc2VsZi5fc2NtLmFkZChkZXN0aW5hdGlvbikK
KworICAgICAgICBmb3IgZGlyZWN0b3J5LCByZXN1bHQgaW4gcmVzdWx0c19ieV9kaXJlY3Rvcnku
aXRlbXMoKToKKyAgICAgICAgICAgIGlmIG5ld19yZXN1bHRzX2J5X2RpcmVjdG9yeS5nZXQoZGly
ZWN0b3J5KSAhPSByZXN1bHQ6CisgICAgICAgICAgICAgICAgZmlsZV9uYW1lID0gc2VsZi5fZmls
ZXN5c3RlbS5qb2luKHNlbGYuX3NjbS5jaGVja291dF9yb290LCBkaXJlY3RvcnksIGJhc2VsaW5l
X25hbWUpCisgICAgICAgICAgICAgICAgc2VsZi5fc2NtLmRlbGV0ZShmaWxlX25hbWUpCisKKyAg
ICBkZWYgb3B0aW1pemUoc2VsZiwgYmFzZWxpbmVfbmFtZSk6CisgICAgICAgIHJlc3VsdHNfYnlf
ZGlyZWN0b3J5LCBuZXdfcmVzdWx0c19ieV9kaXJlY3RvcnkgPSBzZWxmLl9maW5kX29wdGltYWxf
cmVzdWx0X3BsYWNlbWVudChiYXNlbGluZV9uYW1lKQorICAgICAgICBpZiBzZWxmLl9yZXN1bHRz
X2J5X3BvcnRfbmFtZShyZXN1bHRzX2J5X2RpcmVjdG9yeSkgIT0gc2VsZi5fcmVzdWx0c19ieV9w
b3J0X25hbWUobmV3X3Jlc3VsdHNfYnlfZGlyZWN0b3J5KToKKyAgICAgICAgICAgIHJldHVybiBG
YWxzZQorICAgICAgICBzZWxmLl9tb3ZlX2Jhc2VsaW5lcyhiYXNlbGluZV9uYW1lLCByZXN1bHRz
X2J5X2RpcmVjdG9yeSwgbmV3X3Jlc3VsdHNfYnlfZGlyZWN0b3J5KQorICAgICAgICByZXR1cm4g
VHJ1ZQpkaWZmIC0tZ2l0IGEvVG9vbHMvU2NyaXB0cy93ZWJraXRweS9jb21tb24vY2hlY2tvdXQv
YmFzZWxpbmVvcHRpbWl6ZXJfdW5pdHRlc3QucHkgYi9Ub29scy9TY3JpcHRzL3dlYmtpdHB5L2Nv
bW1vbi9jaGVja291dC9iYXNlbGluZW9wdGltaXplcl91bml0dGVzdC5weQpuZXcgZmlsZSBtb2Rl
IDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwLi4w
NDRhYmJlOTJlMTZmM2Y3NDhhYmY1M2Y1ZDUyYWY3MWQ3ODI2OTk1Ci0tLSAvZGV2L251bGwKKysr
IGIvVG9vbHMvU2NyaXB0cy93ZWJraXRweS9jb21tb24vY2hlY2tvdXQvYmFzZWxpbmVvcHRpbWl6
ZXJfdW5pdHRlc3QucHkKQEAgLTAsMCArMSwxMTEgQEAKKyMgQ29weXJpZ2h0IChDKSAyMDExIEdv
b2dsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisjCisjIFJlZGlzdHJpYnV0aW9uIGFuZCB1
c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorIyBtb2RpZmlj
YXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlv
bnMgYXJlCisjIG1ldDoKKyMKKyMgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUg
bXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorIyBub3RpY2UsIHRoaXMgbGlzdCBvZiBj
b25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisjICAgICogUmVkaXN0cmli
dXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorIyBjb3B5cmln
aHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNj
bGFpbWVyCisjIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJv
dmlkZWQgd2l0aCB0aGUKKyMgZGlzdHJpYnV0aW9uLgorIyAgICAqIE5laXRoZXIgdGhlIG5hbWUg
b2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyMgY29udHJpYnV0b3JzIG1heSBi
ZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKyMgdGhp
cyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyMK
KyMgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5E
IENPTlRSSUJVVE9SUworIyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJB
TlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorIyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJS
QU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyMgQSBQQVJUSUNVTEFS
IFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQK
KyMgT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJF
Q1QsIElOQ0lERU5UQUwsCisjIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBE
QU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKyMgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0Yg
U1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisjIERBVEEsIE9SIFBS
T0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFO
WQorIyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElB
QklMSVRZLCBPUiBUT1JUCisjIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFS
SVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorIyBPRiBUSElTIFNPRlRXQVJFLCBFVkVO
IElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCitpbXBvcnQg
dW5pdHRlc3QKKworZnJvbSB3ZWJraXRweS5jb21tb24uY2hlY2tvdXQuYmFzZWxpbmVvcHRpbWl6
ZXIgaW1wb3J0IEJhc2VsaW5lT3B0aW1pemVyCitmcm9tIHdlYmtpdHB5LmNvbW1vbi5zeXN0ZW0u
ZmlsZXN5c3RlbV9tb2NrIGltcG9ydCBNb2NrRmlsZVN5c3RlbQorZnJvbSB3ZWJraXRweS50b29s
Lm1vY2t0b29sIGltcG9ydCBNb2NrU0NNCisKKworY2xhc3MgVGVzdEJhc2VsaW5lT3B0aW1pemVy
KEJhc2VsaW5lT3B0aW1pemVyKToKKyAgICBkZWYgX19pbml0X18oc2VsZiwgbW9ja19yZXN1bHRz
X2J5X2RpcmVjdG9yeSk6CisgICAgICAgIEJhc2VsaW5lT3B0aW1pemVyLl9faW5pdF9fKHNlbGYs
IE1vY2tTQ00oKSwgTW9ja0ZpbGVTeXN0ZW0oKSkKKyAgICAgICAgc2VsZi5fbW9ja19yZXN1bHRz
X2J5X2RpcmVjdG9yeSA9IG1vY2tfcmVzdWx0c19ieV9kaXJlY3RvcnkKKworICAgICMgV2Ugb3Zl
cnJpZGUgdGhpcyBtZXRob2QgZm9yIHRlc3Rpbmcgc28gd2UgZG9uJ3QgaGF2ZSB0byBjb25zdHJ1
Y3QgYW4KKyAgICAjIGVsYWJvcmF0ZSBtb2NrIGZpbGUgc3lzdGVtLgorICAgIGRlZiBfcmVhZF9y
ZXN1bHRzX2J5X2RpcmVjdG9yeShzZWxmLCBiYXNlbGluZV9uYW1lKToKKyAgICAgICAgcmV0dXJu
IHNlbGYuX21vY2tfcmVzdWx0c19ieV9kaXJlY3RvcnkKKworCitjbGFzcyBCYXNlbGluZU9wdGlt
aXplclRlc3QodW5pdHRlc3QuVGVzdENhc2UpOgorICAgIGRlZiBfYXNzZXJ0T3B0aW1pemF0aW9u
KHNlbGYsIHJlc3VsdHNfYnlfZGlyZWN0b3J5LCBleHBlY3RlZF9uZXdfcmVzdWx0c19ieV9kaXJl
Y3RvcnkpOgorICAgICAgICBiYXNlbGluZV9vcHRpbWl6ZXIgPSBUZXN0QmFzZWxpbmVPcHRpbWl6
ZXIocmVzdWx0c19ieV9kaXJlY3RvcnkpCisgICAgICAgIF8sIG5ld19yZXN1bHRzX2J5X2RpcmVj
dG9yeSA9IGJhc2VsaW5lX29wdGltaXplci5fZmluZF9vcHRpbWFsX3Jlc3VsdF9wbGFjZW1lbnQo
J21vY2stYmFzZWxpbmUucG5nJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChuZXdfcmVzdWx0
c19ieV9kaXJlY3RvcnksIGV4cGVjdGVkX25ld19yZXN1bHRzX2J5X2RpcmVjdG9yeSkKKworICAg
IGRlZiB0ZXN0X2Nocm9taXVtX2xpbnV4X3JlZHVuZGFudF93aXRoX3dpbihzZWxmKToKKyAgICAg
ICAgc2VsZi5fYXNzZXJ0T3B0aW1pemF0aW9uKHsKKyAgICAgICAgICAgICdMYXlvdXRUZXN0cy9w
bGF0Zm9ybS9jaHJvbWl1bS13aW4nOiAnNDYyZDAzYjljMDI1ZGIxYjAzOTJkNzQ1MzMxMGRiZWU1
ZjlhOWU3NCcsCisgICAgICAgICAgICAnTGF5b3V0VGVzdHMvcGxhdGZvcm0vY2hyb21pdW0tbGlu
dXgnOiAnNDYyZDAzYjljMDI1ZGIxYjAzOTJkNzQ1MzMxMGRiZWU1ZjlhOWU3NCcsCisgICAgICAg
IH0sIHsKKyAgICAgICAgICAgICdMYXlvdXRUZXN0cy9wbGF0Zm9ybS9jaHJvbWl1bS13aW4nOiAn
NDYyZDAzYjljMDI1ZGIxYjAzOTJkNzQ1MzMxMGRiZWU1ZjlhOWU3NCcsCisgICAgICAgIH0pCisK
KyAgICBkZWYgdGVzdF9jaHJvbWl1bV9jb3ZlcnNfbWFjX3dpbl9saW51eChzZWxmKToKKyAgICAg
ICAgc2VsZi5fYXNzZXJ0T3B0aW1pemF0aW9uKHsKKyAgICAgICAgICAgICdMYXlvdXRUZXN0cy9w
bGF0Zm9ybS9jaHJvbWl1bS1tYWMnOiAnNDYyZDAzYjljMDI1ZGIxYjAzOTJkNzQ1MzMxMGRiZWU1
ZjlhOWU3NCcsCisgICAgICAgICAgICAnTGF5b3V0VGVzdHMvcGxhdGZvcm0vY2hyb21pdW0td2lu
JzogJzQ2MmQwM2I5YzAyNWRiMWIwMzkyZDc0NTMzMTBkYmVlNWY5YTllNzQnLAorICAgICAgICAg
ICAgJ0xheW91dFRlc3RzL3BsYXRmb3JtL2Nocm9taXVtLWxpbnV4JzogJzQ2MmQwM2I5YzAyNWRi
MWIwMzkyZDc0NTMzMTBkYmVlNWY5YTllNzQnLAorICAgICAgICB9LCB7CisgICAgICAgICAgICAn
TGF5b3V0VGVzdHMvcGxhdGZvcm0vY2hyb21pdW0nOiAnNDYyZDAzYjljMDI1ZGIxYjAzOTJkNzQ1
MzMxMGRiZWU1ZjlhOWU3NCcsCisgICAgICAgIH0pCisKKyAgICBkZWYgdGVzdF9jaHJvbWl1bV9t
YWNfcmVkdW5kYW50X3dpdGhfYXBwbGVfbWFjKHNlbGYpOgorICAgICAgICBzZWxmLl9hc3NlcnRP
cHRpbWl6YXRpb24oeworICAgICAgICAgICAgJ0xheW91dFRlc3RzL3BsYXRmb3JtL2Nocm9taXVt
LW1hYy1zbm93bGVvcGFyZCc6ICc0NjJkMDNiOWMwMjVkYjFiMDM5MmQ3NDUzMzEwZGJlZTVmOWE5
ZTc0JywKKyAgICAgICAgICAgICdMYXlvdXRUZXN0cy9wbGF0Zm9ybS9tYWMtc25vd2xlb3BhcmQn
OiAnNDYyZDAzYjljMDI1ZGIxYjAzOTJkNzQ1MzMxMGRiZWU1ZjlhOWU3NCcsCisgICAgICAgIH0s
IHsKKyAgICAgICAgICAgICdMYXlvdXRUZXN0cy9wbGF0Zm9ybS9tYWMtc25vd2xlb3BhcmQnOiAn
NDYyZDAzYjljMDI1ZGIxYjAzOTJkNzQ1MzMxMGRiZWU1ZjlhOWU3NCcsCisgICAgICAgIH0pCisK
KyAgICBkZWYgdGVzdF9tYWNfZnV0dXJlKHNlbGYpOgorICAgICAgICBzZWxmLl9hc3NlcnRPcHRp
bWl6YXRpb24oeworICAgICAgICAgICAgJ0xheW91dFRlc3RzL3BsYXRmb3JtL21hYy1zbm93bGVv
cGFyZCc6ICc0NjJkMDNiOWMwMjVkYjFiMDM5MmQ3NDUzMzEwZGJlZTVmOWE5ZTc0JywKKyAgICAg
ICAgfSwgeworICAgICAgICAgICAgJ0xheW91dFRlc3RzL3BsYXRmb3JtL21hYy1zbm93bGVvcGFy
ZCc6ICc0NjJkMDNiOWMwMjVkYjFiMDM5MmQ3NDUzMzEwZGJlZTVmOWE5ZTc0JywKKyAgICAgICAg
fSkKKworICAgIGRlZiB0ZXN0X3F0X3Vua25vd24oc2VsZik6CisgICAgICAgIHNlbGYuX2Fzc2Vy
dE9wdGltaXphdGlvbih7CisgICAgICAgICAgICAnTGF5b3V0VGVzdHMvcGxhdGZvcm0vcXQnOiAn
NDYyZDAzYjljMDI1ZGIxYjAzOTJkNzQ1MzMxMGRiZWU1ZjlhOWU3NCcsCisgICAgICAgIH0sIHsK
KyAgICAgICAgICAgICdMYXlvdXRUZXN0cy9wbGF0Zm9ybS9xdCc6ICc0NjJkMDNiOWMwMjVkYjFi
MDM5MmQ3NDUzMzEwZGJlZTVmOWE5ZTc0JywKKyAgICAgICAgfSkKKworICAgIGRlZiB0ZXN0X2Nv
bXBsZXhfc2hhZG93aW5nKHNlbGYpOgorICAgICAgICBzZWxmLl9hc3NlcnRPcHRpbWl6YXRpb24o
eworICAgICAgICAgICAgJ0xheW91dFRlc3RzL3BsYXRmb3JtL2Nocm9taXVtLXdpbic6ICc0NjJk
MDNiOWMwMjVkYjFiMDM5MmQ3NDUzMzEwZGJlZTVmOWE5ZTc0JywKKyAgICAgICAgICAgICdMYXlv
dXRUZXN0cy9wbGF0Zm9ybS9tYWMnOiAnNWRhYTc4ZTU1ZjA1ZDlmMGQxYmIxZjMyYjBjZDFiYzNh
MDFlOTM2NCcsCisgICAgICAgICAgICAnTGF5b3V0VGVzdHMvcGxhdGZvcm0vY2hyb21pdW0td2lu
LXhwJzogJzQ2MmQwM2I5YzAyNWRiMWIwMzkyZDc0NTMzMTBkYmVlNWY5YTllNzQnLAorICAgICAg
ICAgICAgJ0xheW91dFRlc3RzL3BsYXRmb3JtL2Nocm9taXVtLW1hYy1sZW9wYXJkJzogJzY1ZTdk
NDJmOGI0ODgyYjI5ZDQ2ZGM3N2JiODc5ZGQ0MWJjMDc0ZGMnLAorICAgICAgICAgICAgJ0xheW91
dFRlc3RzL3BsYXRmb3JtL21hYy1sZW9wYXJkJzogJzdhZDA0NWVjZTdjMDMwZTIyODNjNWQyMWQ5
NTg3YmUyMmJjYmE1NmUnLAorICAgICAgICAgICAgJ0xheW91dFRlc3RzL3BsYXRmb3JtL2Nocm9t
aXVtLXdpbi12aXN0YSc6ICdmODNhZjk3MzJjZTc0ZjcwMmI4YzljNGEzZDlhNGM2NjM2YjhkM2Jk
JywKKyAgICAgICAgICAgICdMYXlvdXRUZXN0cy9wbGF0Zm9ybS93aW4nOiAnNWIxMjUzZWY0ZDUw
OTQ1MzBkNWYxYmM2Y2RiOTVjOTBiNDQ2YmVjNycsCisgICAgICAgICAgICAnTGF5b3V0VGVzdHMv
cGxhdGZvcm0vY2hyb21pdW0tbGludXgnOiAnZjUyZmNkZGU5ZTRiZThiZDUxNDIxNzFjZDg1OTIz
MGJkNDQ3MTAzNicsCisgICAgICAgIH0sIHsKKyAgICAgICAgICAgICdMYXlvdXRUZXN0cy9wbGF0
Zm9ybS9jaHJvbWl1bS13aW4nOiAnNDYyZDAzYjljMDI1ZGIxYjAzOTJkNzQ1MzMxMGRiZWU1Zjlh
OWU3NCcsCisgICAgICAgICAgICAnTGF5b3V0VGVzdHMvcGxhdGZvcm0vbWFjJzogJzVkYWE3OGU1
NWYwNWQ5ZjBkMWJiMWYzMmIwY2QxYmMzYTAxZTkzNjQnLAorICAgICAgICAgICAgJ0xheW91dFRl
c3RzL3BsYXRmb3JtL2Nocm9taXVtLXdpbi14cCc6ICc0NjJkMDNiOWMwMjVkYjFiMDM5MmQ3NDUz
MzEwZGJlZTVmOWE5ZTc0JywKKyAgICAgICAgICAgICdMYXlvdXRUZXN0cy9wbGF0Zm9ybS9jaHJv
bWl1bS1tYWMtbGVvcGFyZCc6ICc2NWU3ZDQyZjhiNDg4MmIyOWQ0NmRjNzdiYjg3OWRkNDFiYzA3
NGRjJywKKyAgICAgICAgICAgICdMYXlvdXRUZXN0cy9wbGF0Zm9ybS9tYWMtbGVvcGFyZCc6ICc3
YWQwNDVlY2U3YzAzMGUyMjgzYzVkMjFkOTU4N2JlMjJiY2JhNTZlJywKKyAgICAgICAgICAgICdM
YXlvdXRUZXN0cy9wbGF0Zm9ybS9jaHJvbWl1bS13aW4tdmlzdGEnOiAnZjgzYWY5NzMyY2U3NGY3
MDJiOGM5YzRhM2Q5YTRjNjYzNmI4ZDNiZCcsCisgICAgICAgICAgICAnTGF5b3V0VGVzdHMvcGxh
dGZvcm0vd2luJzogJzViMTI1M2VmNGQ1MDk0NTMwZDVmMWJjNmNkYjk1YzkwYjQ0NmJlYzcnLAor
ICAgICAgICAgICAgJ0xheW91dFRlc3RzL3BsYXRmb3JtL2Nocm9taXVtLWxpbnV4JzogJ2Y1MmZj
ZGRlOWU0YmU4YmQ1MTQyMTcxY2Q4NTkyMzBiZDQ0NzEwMzYnCisgICAgICAgIH0pCmRpZmYgLS1n
aXQgYS9Ub29scy9TY3JpcHRzL3dlYmtpdHB5L2NvbW1vbi9zeXN0ZW0vZmlsZXN5c3RlbS5weSBi
L1Rvb2xzL1NjcmlwdHMvd2Via2l0cHkvY29tbW9uL3N5c3RlbS9maWxlc3lzdGVtLnB5CmluZGV4
IDBhZjZlYzg5MTUyNjVlNDVjMzM1MGFjZTI0ZjY1ZTEzYzk1MDJmNTIuLjdkZTQxYTQyNGQxYmJj
Zjk1MWJlY2EyZmU4ZTRhNTQ5NDIxYTZkODIgMTAwNjQ0Ci0tLSBhL1Rvb2xzL1NjcmlwdHMvd2Vi
a2l0cHkvY29tbW9uL3N5c3RlbS9maWxlc3lzdGVtLnB5CisrKyBiL1Rvb2xzL1NjcmlwdHMvd2Vi
a2l0cHkvY29tbW9uL3N5c3RlbS9maWxlc3lzdGVtLnB5CkBAIC0zNCw2ICszNCw3IEBAIGltcG9y
dCBjb2RlY3MKIGltcG9ydCBlcnJubwogaW1wb3J0IGV4Y2VwdGlvbnMKIGltcG9ydCBnbG9iCitp
bXBvcnQgaGFzaGxpYgogaW1wb3J0IG9zCiBpbXBvcnQgc2h1dGlsCiBpbXBvcnQgc3lzCkBAIC0y
MjMsNiArMjI0LDEwIEBAIGNsYXNzIEZpbGVTeXN0ZW0ob2JqZWN0KToKICAgICAgICAgd2l0aCBj
b2RlY3Mub3BlbihwYXRoLCAndycsICd1dGY4JykgYXMgZjoKICAgICAgICAgICAgIGYud3JpdGUo
Y29udGVudHMpCiAKKyAgICBkZWYgc2hhMShzZWxmLCBwYXRoKToKKyAgICAgICAgY29udGVudHMg
PSBzZWxmLnJlYWRfYmluYXJ5X2ZpbGUocGF0aCkKKyAgICAgICAgcmV0dXJuIGhhc2hsaWIuc2hh
MShjb250ZW50cykuaGV4ZGlnZXN0KCkKKwogICAgIGRlZiByZWxwYXRoKHNlbGYsIHBhdGgsIHN0
YXJ0PScuJyk6CiAgICAgICAgIHJldHVybiBvc3BhdGgucmVscGF0aChwYXRoLCBzdGFydCkKIApk
aWZmIC0tZ2l0IGEvVG9vbHMvU2NyaXB0cy93ZWJraXRweS9jb21tb24vc3lzdGVtL2ZpbGVzeXN0
ZW1fbW9jay5weSBiL1Rvb2xzL1NjcmlwdHMvd2Via2l0cHkvY29tbW9uL3N5c3RlbS9maWxlc3lz
dGVtX21vY2sucHkKaW5kZXggMWVjOGI2Yjk1ODBlMWJlZjUwYjFlMzBhNGNiNGQ5ZjgzOGFkZmVh
My4uZjkxMmZhY2ZhOTA2NjFmNmM4ZGQ0YWM5MDkzMjQwOGQ2OGNlZjk0NCAxMDA2NDQKLS0tIGEv
VG9vbHMvU2NyaXB0cy93ZWJraXRweS9jb21tb24vc3lzdGVtL2ZpbGVzeXN0ZW1fbW9jay5weQor
KysgYi9Ub29scy9TY3JpcHRzL3dlYmtpdHB5L2NvbW1vbi9zeXN0ZW0vZmlsZXN5c3RlbV9tb2Nr
LnB5CkBAIC0yNyw2ICsyNyw3IEBACiAjIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNF
RCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCiAKIGltcG9ydCBlcnJubworaW1w
b3J0IGhhc2hsaWIKIGltcG9ydCBvcwogaW1wb3J0IHJlCiAKQEAgLTI4NCw2ICsyODUsMTAgQEAg
Y2xhc3MgTW9ja0ZpbGVTeXN0ZW0ob2JqZWN0KToKICAgICBkZWYgd3JpdGVfdGV4dF9maWxlKHNl
bGYsIHBhdGgsIGNvbnRlbnRzKToKICAgICAgICAgcmV0dXJuIHNlbGYud3JpdGVfYmluYXJ5X2Zp
bGUocGF0aCwgY29udGVudHMuZW5jb2RlKCd1dGYtOCcpKQogCisgICAgZGVmIHNoYTEoc2VsZiwg
cGF0aCk6CisgICAgICAgIGNvbnRlbnRzID0gc2VsZi5yZWFkX2JpbmFyeV9maWxlKHBhdGgpCisg
ICAgICAgIHJldHVybiBoYXNobGliLnNoYTEoY29udGVudHMpLmhleGRpZ2VzdCgpCisKICAgICBk
ZWYgcmVscGF0aChzZWxmLCBwYXRoLCBzdGFydD0nLicpOgogICAgICAgICByZXR1cm4gb3NwYXRo
LnJlbHBhdGgocGF0aCwgc3RhcnQsIHNlbGYuYWJzcGF0aCwgc2VsZi5zZXApCiAKZGlmZiAtLWdp
dCBhL1Rvb2xzL1NjcmlwdHMvd2Via2l0cHkvbGF5b3V0X3Rlc3RzL3BvcnQvYmFzZS5weSBiL1Rv
b2xzL1NjcmlwdHMvd2Via2l0cHkvbGF5b3V0X3Rlc3RzL3BvcnQvYmFzZS5weQppbmRleCA0OTA5
OTgzZTViNzQ1YjIzMjFiYzMyYzZhOThjNzVjYjY3MDcyNWY5Li5hZTIzZTExZWZiYTQyYzFkZjJm
NDBiNzJiMzI4Yjg4YzkyYzIyMzgzIDEwMDc1NQotLS0gYS9Ub29scy9TY3JpcHRzL3dlYmtpdHB5
L2xheW91dF90ZXN0cy9wb3J0L2Jhc2UucHkKKysrIGIvVG9vbHMvU2NyaXB0cy93ZWJraXRweS9s
YXlvdXRfdGVzdHMvcG9ydC9iYXNlLnB5CkBAIC01NDEsNiArNTQxLDkgQEAgY2xhc3MgUG9ydChv
YmplY3QpOgogICAgICAgICAiIiJSZXR1cm4gdGhlIGFic29sdXRlIHBhdGggdG8gdGhlIHRvcCBv
ZiB0aGUgTGF5b3V0VGVzdHMgZGlyZWN0b3J5LiIiIgogICAgICAgICByZXR1cm4gc2VsZi5wYXRo
X2Zyb21fd2Via2l0X2Jhc2UoJ0xheW91dFRlc3RzJykKIAorICAgIGRlZiB3ZWJraXRfYmFzZShz
ZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX2ZpbGVzeXN0ZW0uYWJzcGF0aChzZWxmLnBhdGhf
ZnJvbV93ZWJraXRfYmFzZSgnLicpKQorCiAgICAgZGVmIHNraXBwZWRfbGF5b3V0X3Rlc3RzKHNl
bGYpOgogICAgICAgICByZXR1cm4gW10KIApkaWZmIC0tZ2l0IGEvVG9vbHMvU2NyaXB0cy93ZWJr
aXRweS90b29sL2NvbW1hbmRzL3JlYmFzZWxpbmUucHkgYi9Ub29scy9TY3JpcHRzL3dlYmtpdHB5
L3Rvb2wvY29tbWFuZHMvcmViYXNlbGluZS5weQppbmRleCBlNGQ5NWRiN2JmZDY3MTJmZmQ3ZGEz
ZDUyZDNlNjIyNzAxOThmOTllLi4wNGIyNGU3MDk5ZDA5YmQxZjY0Yzc0OTMzM2U1ZDI5MDQ5YjIy
ZjZiIDEwMDY0NAotLS0gYS9Ub29scy9TY3JpcHRzL3dlYmtpdHB5L3Rvb2wvY29tbWFuZHMvcmVi
YXNlbGluZS5weQorKysgYi9Ub29scy9TY3JpcHRzL3dlYmtpdHB5L3Rvb2wvY29tbWFuZHMvcmVi
YXNlbGluZS5weQpAQCAtMzIsOSArMzIsMTEgQEAgaW1wb3J0IHNodXRpbAogaW1wb3J0IHVybGxp
YgogCiBpbXBvcnQgd2Via2l0cHkuY29tbW9uLmNvbmZpZy51cmxzIGFzIGNvbmZpZ191cmxzCitm
cm9tIHdlYmtpdHB5LmNvbW1vbi5jaGVja291dC5iYXNlbGluZW9wdGltaXplciBpbXBvcnQgQmFz
ZWxpbmVPcHRpbWl6ZXIKIGZyb20gd2Via2l0cHkuY29tbW9uLm5ldC5idWlsZGJvdCBpbXBvcnQg
QnVpbGRCb3QKIGZyb20gd2Via2l0cHkuY29tbW9uLm5ldC5sYXlvdXR0ZXN0cmVzdWx0cyBpbXBv
cnQgTGF5b3V0VGVzdFJlc3VsdHMKIGZyb20gd2Via2l0cHkuY29tbW9uLnN5c3RlbS51c2VyIGlt
cG9ydCBVc2VyCitmcm9tIHdlYmtpdHB5LmxheW91dF90ZXN0cy5sYXlvdXRfcGFja2FnZS50ZXN0
X3Jlc3VsdF93cml0ZXIgaW1wb3J0IFRlc3RSZXN1bHRXcml0ZXIKIGZyb20gd2Via2l0cHkubGF5
b3V0X3Rlc3RzLm1vZGVscyBpbXBvcnQgdGVzdF9mYWlsdXJlcwogZnJvbSB3ZWJraXRweS5sYXlv
dXRfdGVzdHMucG9ydCBpbXBvcnQgZmFjdG9yeQogZnJvbSB3ZWJraXRweS50b29sLmdyYW1tYXIg
aW1wb3J0IHBsdXJhbGl6ZQpAQCAtMTI4LDYgKzEzMCwyNSBAQCBjbGFzcyBSZWJhc2VsaW5lVGVz
dChBYnN0cmFjdERlY2xhcmF0aXZlQ29tbWFuZCk6CiAgICAgICAgIHNlbGYuX3JlYmFzZWxpbmVf
dGVzdChhcmdzWzBdLCBhcmdzWzFdLCBhcmdzWzJdKQogCiAKK2NsYXNzIE9wdGltaXplQmFzZWxp
bmVzKEFic3RyYWN0RGVjbGFyYXRpdmVDb21tYW5kKToKKyAgICBuYW1lID0gIm9wdGltaXplLWJh
c2VsaW5lcyIKKyAgICBoZWxwX3RleHQgPSAiUmVzaHVmZmxlcyB0aGUgYmFzZWxpbmVzIGZvciBh
IHRoZSBnaXZlbiB0ZXN0IHRvIHVzZSBhcyBsaXR0ZSBzcGFjZSBvbiBkaXNrIGFzIHBvc3NpYmxl
LiIKKyAgICBhcmd1bWVudF9uYW1lcyA9ICJURVNUX05BTUUiCisKKyAgICAjIEZJWE1FOiBTaG91
bGQgVGVzdFJlc3VsdFdyaXRlciBrbm93IGhvdyB0byBjb21wdXRlIHRoaXMgc3RyaW5nPworICAg
IGRlZiBfYmFzZWxpbmVfbmFtZShzZWxmLCB0ZXN0X25hbWUsIHN1ZmZpeCk6CisgICAgICAgIHJl
dHVybiBzZWxmLl90b29sLmZpbGVzeXN0ZW0uc3BsaXRleHQodGVzdF9uYW1lKVswXSArIFRlc3RS
ZXN1bHRXcml0ZXIuRklMRU5BTUVfU1VGRklYX0VYUEVDVEVEICsgc3VmZml4CisKKyAgICBkZWYg
ZXhlY3V0ZShzZWxmLCBvcHRpb25zLCBhcmdzLCB0b29sKToKKyAgICAgICAgYmFzZWxpbmVfb3B0
aW1pemVyID0gQmFzZWxpbmVPcHRpbWl6ZXIodG9vbC5zY20oKSwgdG9vbC5maWxlc3lzdGVtKQor
CisgICAgICAgIHRlc3RfbmFtZSA9IGFyZ3NbMF0KKyAgICAgICAgZm9yIHN1ZmZpeCBpbiBbJy5w
bmcnLCAnLnR4dCddOgorICAgICAgICAgICAgYmFzZWxpbmVfbmFtZSA9IHNlbGYuX2Jhc2VsaW5l
X25hbWUodGVzdF9uYW1lLCBzdWZmaXgpCisgICAgICAgICAgICBpZiBub3QgYmFzZWxpbmVfb3B0
aW1pemVyLm9wdGltaXplKGJhc2VsaW5lX25hbWUpOgorICAgICAgICAgICAgICAgIHByaW50ICJI
dWVyaXN0aWNzIGZhaWxlZCB0byBvcHRpbWl6ZSAlcyIgJSBiYXNlbGluZV9uYW1lCisKKwogY2xh
c3MgUmViYXNlbGluZShBYnN0cmFjdERlY2xhcmF0aXZlQ29tbWFuZCk6CiAgICAgbmFtZSA9ICJy
ZWJhc2VsaW5lIgogICAgIGhlbHBfdGV4dCA9ICJSZXBsYWNlcyBsb2NhbCBleHBlY3RlZC50eHQg
ZmlsZXMgd2l0aCBuZXcgcmVzdWx0cyBmcm9tIGJ1aWxkIGJvdHMiCg==
</data>

          </attachment>
      

    </bug>

</bugzilla>