<?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>63494</bug_id>
          
          <creation_ts>2011-06-27 16:51:06 -0700</creation_ts>
          <short_desc>REGRESSION(r84294): new-run-webkit-tests results.html generate links to diffs.html or diff.png that don&apos;t exist</short_desc>
          <delta_ts>2011-06-30 15:13:58 -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>Tools / Tests</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>34984</blocked>
          <everconfirmed>1</everconfirmed>
          <reporter name="Ryosuke Niwa">rniwa</reporter>
          <assigned_to name="Adam Barth">abarth</assigned_to>
          <cc>abarth</cc>
    
    <cc>dpranke</cc>
    
    <cc>eric</cc>
    
    <cc>ojan</cc>
    
    <cc>tomhudson</cc>
    
    <cc>tony</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>428444</commentid>
    <comment_count>0</comment_count>
    <who name="Ryosuke Niwa">rniwa</who>
    <bug_when>2011-06-27 16:51:06 -0700</bug_when>
    <thetext>Tools/Scripts/new-run-webkit-tests --debug --pixel do not generate -diffs.html or diff.png for image failures on Mac port

I can see links on results.html, and in fact, layout-test-results&apos;s corresponding directories do have -expected.png and -actual.png but there are no -diffs.html or -diff.png</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>428453</commentid>
    <comment_count>1</comment_count>
    <who name="Ryosuke Niwa">rniwa</who>
    <bug_when>2011-06-27 17:05:18 -0700</bug_when>
    <thetext>It appears that diffs.html and diff.png aren&apos;t generated when tests fail due to checksum differences.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>428461</commentid>
    <comment_count>2</comment_count>
    <who name="Ryosuke Niwa">rniwa</who>
    <bug_when>2011-06-27 17:16:45 -0700</bug_when>
    <thetext>At this point I&apos;m pretty certain this is a bug in new results.html page.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>428468</commentid>
    <comment_count>3</comment_count>
    <who name="Dirk Pranke">dpranke</who>
    <bug_when>2011-06-27 17:21:03 -0700</bug_when>
    <thetext>On further investigation (e.g., fast/box-shadow/basic-shadows.html), we&apos;re getting cases where the checksums don&apos;t match but the images do match, as reported by ImageDiff.

So, no -diff files will be created. However, the test is still reported as failing. I think the json results generator doesn&apos;t know how to distinguish the different kinds of failures, and so it reports the generic Image failure.

We might need to add another flag to the test_dict in manager.py: summarize_results() to handle this case.

Once again, the attempt to map the broader set of TestFailures onto the smaller set of expectation types might be hurting us.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>429867</commentid>
    <comment_count>4</comment_count>
    <who name="Adam Barth">abarth</who>
    <bug_when>2011-06-29 14:08:12 -0700</bug_when>
    <thetext>Is someone stepping up to own this issue.  Ojan?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>429996</commentid>
    <comment_count>5</comment_count>
    <who name="Ojan Vafai">ojan</who>
    <bug_when>2011-06-29 16:54:57 -0700</bug_when>
    <thetext>(In reply to comment #3)
&gt; On further investigation (e.g., fast/box-shadow/basic-shadows.html), we&apos;re getting cases where the checksums don&apos;t match but the images do match, as reported by ImageDiff.

Hm. That should not happen now that checksums are embedded in pngs!

&gt; So, no -diff files will be created. However, the test is still reported as failing. I think the json results generator doesn&apos;t know how to distinguish the different kinds of failures, and so it reports the generic Image failure.
&gt; 
&gt; We might need to add another flag to the test_dict in manager.py: summarize_results() to handle this case.
&gt; 
&gt; Once again, the attempt to map the broader set of TestFailures onto the smaller set of expectation types might be hurting us.

The right solution IMO, is to make the results types serialized to the JSON file have a one-to-one mapping with the TestFailure types. That would also help cleanup code.

(In reply to comment #4)
&gt; Is someone stepping up to own this issue.  Ojan?

I won&apos;t realistically get to it anytime soon.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>430011</commentid>
    <comment_count>6</comment_count>
    <who name="Dirk Pranke">dpranke</who>
    <bug_when>2011-06-29 17:12:36 -0700</bug_when>
    <thetext>(In reply to comment #5)
&gt; (In reply to comment #3)
&gt; &gt; On further investigation (e.g., fast/box-shadow/basic-shadows.html), we&apos;re getting cases where the checksums don&apos;t match but the images do match, as reported by ImageDiff.
&gt; 
&gt; Hm. That should not happen now that checksums are embedded in pngs!
&gt; 

Tony pointed out a difference a week or two ago where the apple mac ImageDiff implementation will report some PNGs as identical even when they are not bit-for-bit identical (i.e., even when --tolerance=0.0 is specified).

I think that that&apos;s a bug in ImageDiff that should be fixed, but perhaps that is debatable. Regardless, that is probably what is causing this.

&gt; The right solution IMO, is to make the results types serialized to the JSON file have a one-to-one mapping with the TestFailure types. That would also help cleanup code.

That would probably work, and certainly simplify some things.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>430013</commentid>
    <comment_count>7</comment_count>
    <who name="Adam Barth">abarth</who>
    <bug_when>2011-06-29 17:13:46 -0700</bug_when>
    <thetext>Ojan, if you&apos;re not going to fix your regression, should we roll out your patch?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>430048</commentid>
    <comment_count>8</comment_count>
    <who name="Adam Barth">abarth</who>
    <bug_when>2011-06-29 18:02:20 -0700</bug_when>
    <thetext>Hum...  That patch is from 04/19/2011 14:18:52 (2 months ago).  :(</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>430051</commentid>
    <comment_count>9</comment_count>
    <who name="Adam Barth">abarth</who>
    <bug_when>2011-06-29 18:06:23 -0700</bug_when>
    <thetext>Reading this more carefully, this doesn&apos;t need to block Bug 34984.  This appears to happen only in the case were the images differ bit-by-bit but ImageDiff says they match, which should be rare.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>430056</commentid>
    <comment_count>10</comment_count>
    <who name="Ryosuke Niwa">rniwa</who>
    <bug_when>2011-06-29 18:11:45 -0700</bug_when>
    <thetext>(In reply to comment #9)
&gt; Reading this more carefully, this doesn&apos;t need to block Bug 34984.  This appears to happen only in the case were the images differ bit-by-bit but ImageDiff says they match, which should be rare.

It happens on Mac port all the time because it has the default non-zero tolerance.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>430062</commentid>
    <comment_count>11</comment_count>
    <who name="Ryosuke Niwa">rniwa</who>
    <bug_when>2011-06-29 18:14:41 -0700</bug_when>
    <thetext>So it should block the bug 34984.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>430066</commentid>
    <comment_count>12</comment_count>
    <who name="Adam Barth">abarth</who>
    <bug_when>2011-06-29 18:19:31 -0700</bug_when>
    <thetext>I see.  Ok.  Thanks.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>430122</commentid>
    <comment_count>13</comment_count>
      <attachid>99218</attachid>
    <who name="Adam Barth">abarth</who>
    <bug_when>2011-06-29 19:50:43 -0700</bug_when>
    <thetext>Created attachment 99218
Work in progress</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>430129</commentid>
    <comment_count>14</comment_count>
      <attachid>99222</attachid>
    <who name="Adam Barth">abarth</who>
    <bug_when>2011-06-29 19:58:33 -0700</bug_when>
    <thetext>Created attachment 99222
Work in progress</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>430158</commentid>
    <comment_count>15</comment_count>
      <attachid>99231</attachid>
    <who name="Adam Barth">abarth</who>
    <bug_when>2011-06-29 21:27:13 -0700</bug_when>
    <thetext>Created attachment 99231
Work in progress</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>430173</commentid>
    <comment_count>16</comment_count>
      <attachid>99236</attachid>
    <who name="Adam Barth">abarth</who>
    <bug_when>2011-06-29 22:15:04 -0700</bug_when>
    <thetext>Created attachment 99236
Work in progress (might actually work)</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>430178</commentid>
    <comment_count>17</comment_count>
      <attachid>99236</attachid>
    <who name="Eric Seidel (no email)">eric</who>
    <bug_when>2011-06-29 22:20:03 -0700</bug_when>
    <thetext>Comment on attachment 99236
Work in progress (might actually work)

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

I like the idea.  I&apos;d have to review it in the morning.

&gt; Tools/Scripts/webkitpy/layout_tests/port/webkit.py:143
&gt; +            # FIXME: It&apos;s not clear what we should return in this case.
&gt; +            # Maybe we should throw an exception?
&gt;              return True

Seems you could easily raise ValueError here.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>430182</commentid>
    <comment_count>18</comment_count>
      <attachid>99239</attachid>
    <who name="Adam Barth">abarth</who>
    <bug_when>2011-06-29 22:34:29 -0700</bug_when>
    <thetext>Created attachment 99239
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>430183</commentid>
    <comment_count>19</comment_count>
    <who name="Dirk Pranke">dpranke</who>
    <bug_when>2011-06-29 22:39:27 -0700</bug_when>
    <thetext>Looks plausible to me also. I have only skimmed the changes and need to review it more carefully as well

Adding Tom Hudson to this since this is related to some work he was doing that would allow us to return more metrics than just true/false for the diff, so that we could sort results by the degree and type of differences. 

Tom, this patch has much if not all of the restructuring we&apos;d probably want for the things you were working on ...</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>430189</commentid>
    <comment_count>20</comment_count>
      <attachid>99239</attachid>
    <who name="Eric Seidel (no email)">eric</who>
    <bug_when>2011-06-29 22:56:17 -0700</bug_when>
    <thetext>Comment on attachment 99239
Patch

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

&gt; Tools/Scripts/webkitpy/layout_tests/run_webkit_tests_integrationtest.py:573
&gt; +            def diff_image(self, expected_contents, actual_contents):
&gt;                  self.tolerance_used_for_diff_image = self._options.tolerance
&gt;                  return True

Isn&apos;t this supposed to return an image diff?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>430190</commentid>
    <comment_count>21</comment_count>
      <attachid>99239</attachid>
    <who name="Adam Barth">abarth</who>
    <bug_when>2011-06-29 22:58:55 -0700</bug_when>
    <thetext>Comment on attachment 99239
Patch

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

&gt;&gt; Tools/Scripts/webkitpy/layout_tests/run_webkit_tests_integrationtest.py:573
&gt;&gt;                  return True
&gt; 
&gt; Isn&apos;t this supposed to return an image diff?

This is some fake thing for testing something ridiculous.  I think it just has to return something that&apos;s not falsy.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>430559</commentid>
    <comment_count>22</comment_count>
      <attachid>99239</attachid>
    <who name="Eric Seidel (no email)">eric</who>
    <bug_when>2011-06-30 11:18:34 -0700</bug_when>
    <thetext>Comment on attachment 99239
Patch

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

r- for nits.

&gt; Tools/Scripts/webkitpy/layout_tests/run_webkit_tests_integrationtest.py:268
&gt; +        res, buildbot_output, regular_output, user = logging_run([&apos;--print-last-failures&apos;], filesystem=fs)
&gt; +        self.assertEqual(regular_output.get(), [u&apos;failures/expected/checksum.html\n\n&apos;])

I&apos;m confused what would prompt this test case to complain about checksum.html?  This is slightly concerning.  Would be nice to hear dirks thoughts on this.

&gt; Tools/Scripts/webkitpy/layout_tests/layout_package/single_test_runner.py:275
&gt; -        if not expected_driver_outputs.image:
&gt; +        if not expected_driver_output.image:
&gt;              failures.append(test_failures.FailureMissingImage())

Why if the expected output is missing an image do we add FailureMissingImage here?

&gt; Tools/Scripts/webkitpy/layout_tests/layout_package/single_test_runner.py:281
&gt; +        elif driver_output.image_hash != expected_driver_output.image_hash:
&gt; +            driver_output.image_diff = self._port.diff_image(driver_output.image, expected_driver_output.image)
&gt; +            if driver_output.image_diff:
&gt; +                failures.append(test_failures.FailureImageHashMismatch())

Its a little subtle that this image_diff creation is here.  We may need to rename this method or add furhter commetns.

&gt; Tools/Scripts/webkitpy/layout_tests/layout_package/test_result_writer.py:72
&gt; +            # FIXME: This work should be done earlier in the pipeline.

Can you be more specific as to when?  You&apos;re saying that the image diffing should be done before writing out files?

&gt; Tools/Scripts/webkitpy/layout_tests/layout_package/test_result_writer.py:265
&gt; +        # FIXME: This seems like a text file, not a binary file.

All .diff/.patch files are binary, but if this is the diffs.html file (which cycles through the images) then yes, it seems like text rather than binary.

&gt; Tools/Scripts/webkitpy/layout_tests/port/base.py:937
&gt; +        self.image_diff = None  # image_diff gets filled in after construction.

It&apos;s odd that we even need to store this on driver_output.  It doesn&apos;t come from the driver.

&gt; Tools/Scripts/webkitpy/layout_tests/port/chromium.py:179
&gt; -                raise e
&gt; +                raise

Yay!  I wonder how many other places we get this wrong.

&gt; Tools/Scripts/webkitpy/layout_tests/port/chromium.py:182
&gt; +            if exit_code == 1:
&gt; +                result = self._filesystem.read_binary_file(diff_filename)

Although this seems awkward for chromium, this makes much more sense for WebKit who sends the binary over the wire instead of through the filesystem.

&gt; Tools/Scripts/webkitpy/layout_tests/port/webkit.py:143
&gt; +            # FIXME: It&apos;s not clear what we should return in this case.
&gt; +            # Maybe we should throw an exception?
&gt;              return True

I would raise ValueError (or any other error which seems reasonable for bad arguments).

&gt; Tools/Scripts/webkitpy/layout_tests/port/webkit.py:145
&gt; +        process = self._create_image_diff_process(expected_contents, actual_contents)

Maybe thsi should say &quot;start&quot;?  &quot;create&quot; blends wiht image_diff &quot;create_image_diff&quot; as though you&apos;re asking for the process which creates the image diffs.

&gt; Tools/Scripts/webkitpy/layout_tests/port/webkit.py:160
&gt; +                             (len(actual_contents), actual_contents, len(expected_contents), expected_contents))

Did you mean to indent this again?

&gt; Tools/Scripts/webkitpy/layout_tests/port/webkit.py:189
&gt; +        if output.startswith(&apos;diff&apos;):
&gt; +            m = re.match(&apos;diff: (.+)% (passed|failed)&apos;, output)
&gt; +            if m.group(2) == &apos;passed&apos;:
&gt; +                return None
&gt; +        return output

I wonder if ORWT saves the diffs even when they &quot;pass&quot;?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>430566</commentid>
    <comment_count>23</comment_count>
      <attachid>99239</attachid>
    <who name="Adam Barth">abarth</who>
    <bug_when>2011-06-30 11:30:08 -0700</bug_when>
    <thetext>Comment on attachment 99239
Patch

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

&gt;&gt; Tools/Scripts/webkitpy/layout_tests/run_webkit_tests_integrationtest.py:268
&gt;&gt; +        self.assertEqual(regular_output.get(), [u&apos;failures/expected/checksum.html\n\n&apos;])
&gt; 
&gt; I&apos;m confused what would prompt this test case to complain about checksum.html?  This is slightly concerning.  Would be nice to hear dirks thoughts on this.

I suspect this is because we change how this kind of failure is treated.  /me will investigate.

&gt;&gt; Tools/Scripts/webkitpy/layout_tests/layout_package/single_test_runner.py:275
&gt;&gt;              failures.append(test_failures.FailureMissingImage())
&gt; 
&gt; Why if the expected output is missing an image do we add FailureMissingImage here?

Because that&apos;s what FailureMissingImage means!

&gt;&gt; Tools/Scripts/webkitpy/layout_tests/layout_package/single_test_runner.py:281
&gt;&gt; +                failures.append(test_failures.FailureImageHashMismatch())
&gt; 
&gt; Its a little subtle that this image_diff creation is here.  We may need to rename this method or add furhter commetns.

Ok.

&gt;&gt; Tools/Scripts/webkitpy/layout_tests/layout_package/test_result_writer.py:72
&gt;&gt; +            # FIXME: This work should be done earlier in the pipeline.
&gt; 
&gt; Can you be more specific as to when?  You&apos;re saying that the image diffing should be done before writing out files?

I&apos;ve updated the comment.  We should compare image for ref and non-ref tests at the same layer.  That&apos;s all.

&gt;&gt; Tools/Scripts/webkitpy/layout_tests/layout_package/test_result_writer.py:265
&gt;&gt; +        # FIXME: This seems like a text file, not a binary file.
&gt; 
&gt; All .diff/.patch files are binary, but if this is the diffs.html file (which cycles through the images) then yes, it seems like text rather than binary.

I&apos;m going to change that in a future patch.

&gt;&gt; Tools/Scripts/webkitpy/layout_tests/port/base.py:937
&gt;&gt; +        self.image_diff = None  # image_diff gets filled in after construction.
&gt; 
&gt; It&apos;s odd that we even need to store this on driver_output.  It doesn&apos;t come from the driver.

That seems like a problem for a future patch.

&gt;&gt; Tools/Scripts/webkitpy/layout_tests/port/webkit.py:143
&gt;&gt;              return True
&gt; 
&gt; I would raise ValueError (or any other error which seems reasonable for bad arguments).

I&apos;m not sure what the consequences of that would be.  I&apos;m inclined to leave the comment and worry about it later.

&gt;&gt; Tools/Scripts/webkitpy/layout_tests/port/webkit.py:145
&gt;&gt; +        process = self._create_image_diff_process(expected_contents, actual_contents)
&gt; 
&gt; Maybe thsi should say &quot;start&quot;?  &quot;create&quot; blends wiht image_diff &quot;create_image_diff&quot; as though you&apos;re asking for the process which creates the image diffs.

Fixed.

&gt;&gt; Tools/Scripts/webkitpy/layout_tests/port/webkit.py:160
&gt;&gt; +                             (len(actual_contents), actual_contents, len(expected_contents), expected_contents))
&gt; 
&gt; Did you mean to indent this again?

Fixed.

&gt;&gt; Tools/Scripts/webkitpy/layout_tests/port/webkit.py:189
&gt;&gt; +        return output
&gt; 
&gt; I wonder if ORWT saves the diffs even when they &quot;pass&quot;?

The diffs don&apos;t get created in that case, which is the whole problem.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>430568</commentid>
    <comment_count>24</comment_count>
      <attachid>99340</attachid>
    <who name="Adam Barth">abarth</who>
    <bug_when>2011-06-30 11:31:26 -0700</bug_when>
    <thetext>Created attachment 99340
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>430571</commentid>
    <comment_count>25</comment_count>
      <attachid>99340</attachid>
    <who name="Eric Seidel (no email)">eric</who>
    <bug_when>2011-06-30 11:33:08 -0700</bug_when>
    <thetext>Comment on attachment 99340
Patch

OK.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>430574</commentid>
    <comment_count>26</comment_count>
    <who name="Adam Barth">abarth</who>
    <bug_when>2011-06-30 11:37:22 -0700</bug_when>
    <thetext>Committed r90138: &lt;http://trac.webkit.org/changeset/90138&gt;</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>430627</commentid>
    <comment_count>27</comment_count>
      <attachid>99340</attachid>
    <who name="Dirk Pranke">dpranke</who>
    <bug_when>2011-06-30 12:37:05 -0700</bug_when>
    <thetext>Comment on attachment 99340
Patch

Patch looks generally good. Lots of minor stuff that could be changed, but most if not all of it could be done in a follow-on patch. The only major thing I don&apos;t like is hanging the image_diff off of the driver_output. I would probably have R-&apos;ed the patch if I thought that fixing that wouldn&apos;t complicate the patch even more, so hopefully we can clean that up soon rather than forget about it.

I don&apos;t think I saw anything that looked actually incorrect in the sense that it would break things.


&gt; Tools/ChangeLog:18
&gt; +

It would&apos;ve been nice to do these two things in two different patches, since they&apos;re both nontrivial, but I&apos;m not going to lose a lot of sleep over it.

&gt; Tools/Scripts/webkitpy/layout_tests/run_webkit_tests_integrationtest.py:268
&gt; +        self.assertEqual(regular_output.get(), [u&apos;failures/expected/checksum.html\n\n&apos;])

Both you and Eric seem to be unwrapping lines as you go along in these patches, as well as making actual changes.

Since I&apos;ve had this feedback on my patches, I&apos;ll pass it along: it would be nice if you separated out the formatting changes from the semantic changes into different patches. In addition, since there&apos;s nothing actually wrong with the wrapped code, it seems like these changes are kinda unnecessary (one could argue that I would be just as justified in submitting patches that added the line breaks back in, because I find the old way easier to read ...).

&gt; Tools/Scripts/webkitpy/layout_tests/run_webkit_tests_integrationtest.py:426
&gt; +                &apos;failures/unexpected/checksum-with-matching-image.html&apos;,

If this test no longer fails, we should rename it to passes/checksum-with-matching-image.html

&gt; Tools/Scripts/webkitpy/layout_tests/run_webkit_tests_integrationtest.py:431
&gt; +        self.assertTrue(fs.read_text_file(&apos;/tmp/layout-test-results/unexpected_results.json&apos;).find(&apos;&quot;num_regressions&quot;:0&apos;) != -1)

res contains the # of unexpected failures. Just do self.assertEquals(res, 0).

&gt; Tools/Scripts/webkitpy/layout_tests/layout_package/single_test_runner.py:276
&gt; +        if not expected_driver_output.image:

This is concerning ... if these typos weren&apos;t causing failures in the test suite before, then these lines weren&apos;t being executed. We should figure out why that is/was, and if it&apos;s no longer true.

Do you know why they were executing before and that they now are?

&gt; Tools/Scripts/webkitpy/layout_tests/layout_package/single_test_runner.py:281
&gt; +            driver_output.image_diff = self._port.diff_image(driver_output.image, expected_driver_output.image)

The driver isn&apos;t producing the image_diff, so I&apos;m not pleased with hanging the image_diff off of it.

Can we return the diff separately alongside the failures? Maybe we should pass in the TestResult object in to the compare_* routines and modify that instead?

&gt; Tools/Scripts/webkitpy/layout_tests/layout_package/single_test_runner.py:283
&gt; +                failures.append(test_failures.FailureImageHashMismatch())

Probably a separate patch, but I wonder if we should just get rid of the FailureImageHash* failure types and just have FailureImageMismatch ?

&gt; Tools/Scripts/webkitpy/layout_tests/layout_package/test_result_writer.py:61
&gt; +            writer.write_image_diff_files(driver_output.image_diff)

See above re: image_diff hanging off of driver_output. If we modify write_test_result() to take the TestResult object as a parameter instead of just the list of failures, then the changes I made above would allow you to just pull the existing image_diff off of that object. This can probably all be done in a follow-up patch, though.

&gt; Tools/Scripts/webkitpy/layout_tests/layout_package/test_result_writer.py:75
&gt; +                writer.write_image_diff_files(image_diff)

similar to above.

&gt; Tools/Scripts/webkitpy/layout_tests/port/base.py:937
&gt; +        self.image_diff = None  # image_diff gets filled in after construction.

see comments above.

&gt; Tools/Scripts/webkitpy/layout_tests/port/chromium.py:142
&gt;          # FIXME: need unit tests for this.

I think we can actually remove this comment, given that there are unit tests in port_testcase.py for this.

&gt; Tools/Scripts/webkitpy/layout_tests/port/chromium_unittest.py:229
&gt; +        self.assertEquals(None, port.diff_image(&quot;EXPECTED&quot;, &quot;ACTUAL&quot;))

I wonder why these tests are here rather than in port_testcase ... I don&apos;t see anything obviously chromium-specific about them. Maybe I wrote them before I wrote the port_testcase ones, and never moved them over.

&gt; Tools/Scripts/webkitpy/layout_tests/port/port_testcase.py:235
&gt; +        self.assertFalse(port.diff_image(&apos;&apos;, &apos;&apos;))

These should be testing against None explicitly. A port implementation that didn&apos;t get updated and returned False to indicate that there was a image diff would incorrectly pass here.

&gt; Tools/Scripts/webkitpy/layout_tests/port/test.py:148
&gt; +              actual_checksum=&apos;text-image-checksum_fail-checksum&apos;)

See comment way earlier ... this should be renamed if it no longer fails.

&gt; Tools/Scripts/webkitpy/layout_tests/port/webkit.py:142
&gt; +            # Maybe we should throw an exception?

Obviously, the tests expect you return that there was no diff. I don&apos;t remember why I thought this was acceptable or correct, unfortunately :( Maybe there&apos;s a comment in the patch that added them?

&gt; Tools/Scripts/webkitpy/layout_tests/port/webkit.py:190
&gt; +        return output

The re-ordering of these branches looks correct, but it would be nice if we had tests that tested these cases one way or another to know that we were fixing and not introducing bugs. Oh, and I&apos;d like a pony.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>430667</commentid>
    <comment_count>28</comment_count>
    <who name="Adam Barth">abarth</who>
    <bug_when>2011-06-30 13:58:46 -0700</bug_when>
    <thetext>(In reply to comment #27)
&gt; (From update of attachment 99340 [details])
&gt; Patch looks generally good.

Thanks for looking at the patch.

&gt; &gt; Tools/Scripts/webkitpy/layout_tests/run_webkit_tests_integrationtest.py:268
&gt; &gt; +        self.assertEqual(regular_output.get(), [u&apos;failures/expected/checksum.html\n\n&apos;])
&gt; 
&gt; Both you and Eric seem to be unwrapping lines as you go along in these patches, as well as making actual changes.
&gt; 
&gt; Since I&apos;ve had this feedback on my patches, I&apos;ll pass it along: it would be nice if you separated out the formatting changes from the semantic changes into different patches. In addition, since there&apos;s nothing actually wrong with the wrapped code, it seems like these changes are kinda unnecessary (one could argue that I would be just as justified in submitting patches that added the line breaks back in, because I find the old way easier to read ...).

We&apos;re following PEP8, with the exception of the line limit, where we&apos;re following WebKit style.

In any case, if our biggest problem is line length, then we&apos;re in good shape.

&gt; &gt; Tools/Scripts/webkitpy/layout_tests/run_webkit_tests_integrationtest.py:426
&gt; &gt; +                &apos;failures/unexpected/checksum-with-matching-image.html&apos;,
&gt; 
&gt; If this test no longer fails, we should rename it to passes/checksum-with-matching-image.html

Ok.

&gt; &gt; Tools/Scripts/webkitpy/layout_tests/run_webkit_tests_integrationtest.py:431
&gt; &gt; +        self.assertTrue(fs.read_text_file(&apos;/tmp/layout-test-results/unexpected_results.json&apos;).find(&apos;&quot;num_regressions&quot;:0&apos;) != -1)
&gt; 
&gt; res contains the # of unexpected failures. Just do self.assertEquals(res, 0).

The two seem interchangable.  What the advantage of one or the other?

&gt; &gt; Tools/Scripts/webkitpy/layout_tests/layout_package/single_test_runner.py:276
&gt; &gt; +        if not expected_driver_output.image:
&gt; 
&gt; This is concerning ... if these typos weren&apos;t causing failures in the test suite before, then these lines weren&apos;t being executed. We should figure out why that is/was, and if it&apos;s no longer true.

I just renamed a bound variable.

&gt; Do you know why they were executing before and that they now are?
&gt; 
&gt; &gt; Tools/Scripts/webkitpy/layout_tests/layout_package/single_test_runner.py:281
&gt; &gt; +            driver_output.image_diff = self._port.diff_image(driver_output.image, expected_driver_output.image)
&gt; 
&gt; The driver isn&apos;t producing the image_diff, so I&apos;m not pleased with hanging the image_diff off of it.
&gt; 
&gt; Can we return the diff separately alongside the failures? Maybe we should pass in the TestResult object in to the compare_* routines and modify that instead?

Yeah, this isn&apos;t ideal, but that&apos;s not a blocking issue.  Hence, it&apos;s a problem for another day.

&gt; &gt; Tools/Scripts/webkitpy/layout_tests/layout_package/single_test_runner.py:283
&gt; &gt; +                failures.append(test_failures.FailureImageHashMismatch())
&gt; 
&gt; Probably a separate patch, but I wonder if we should just get rid of the FailureImageHash* failure types and just have FailureImageMismatch ?

We&apos;re going to have to rip out the multiple representations of the result of running a test and replace it with something consistent.  We should do that then.

&gt; &gt; Tools/Scripts/webkitpy/layout_tests/layout_package/test_result_writer.py:61
&gt; &gt; +            writer.write_image_diff_files(driver_output.image_diff)
&gt; 
&gt; See above re: image_diff hanging off of driver_output. If we modify write_test_result() to take the TestResult object as a parameter instead of just the list of failures, then the changes I made above would allow you to just pull the existing image_diff off of that object. This can probably all be done in a follow-up patch, though.

This all needs to be re-architected globally.

&gt; &gt; Tools/Scripts/webkitpy/layout_tests/layout_package/test_result_writer.py:75
&gt; &gt; +                writer.write_image_diff_files(image_diff)
&gt; 
&gt; similar to above.
&gt; 
&gt; &gt; Tools/Scripts/webkitpy/layout_tests/port/base.py:937
&gt; &gt; +        self.image_diff = None  # image_diff gets filled in after construction.
&gt; 
&gt; see comments above.
&gt; 
&gt; &gt; Tools/Scripts/webkitpy/layout_tests/port/chromium.py:142
&gt; &gt;          # FIXME: need unit tests for this.
&gt; 
&gt; I think we can actually remove this comment, given that there are unit tests in port_testcase.py for this.

Please feel to write such a patch.

&gt; &gt; Tools/Scripts/webkitpy/layout_tests/port/chromium_unittest.py:229
&gt; &gt; +        self.assertEquals(None, port.diff_image(&quot;EXPECTED&quot;, &quot;ACTUAL&quot;))
&gt; 
&gt; I wonder why these tests are here rather than in port_testcase ... I don&apos;t see anything obviously chromium-specific about them. Maybe I wrote them before I wrote the port_testcase ones, and never moved them over.

Dunno.

&gt; &gt; Tools/Scripts/webkitpy/layout_tests/port/port_testcase.py:235
&gt; &gt; +        self.assertFalse(port.diff_image(&apos;&apos;, &apos;&apos;))
&gt; 
&gt; These should be testing against None explicitly. A port implementation that didn&apos;t get updated and returned False to indicate that there was a image diff would incorrectly pass here.

Why is that an incorrect pass?  Returning anything falsy is probably ok.

&gt; &gt; Tools/Scripts/webkitpy/layout_tests/port/test.py:148
&gt; &gt; +              actual_checksum=&apos;text-image-checksum_fail-checksum&apos;)
&gt; 
&gt; See comment way earlier ... this should be renamed if it no longer fails.
&gt; 
&gt; &gt; Tools/Scripts/webkitpy/layout_tests/port/webkit.py:142
&gt; &gt; +            # Maybe we should throw an exception?
&gt; 
&gt; Obviously, the tests expect you return that there was no diff. I don&apos;t remember why I thought this was acceptable or correct, unfortunately :( Maybe there&apos;s a comment in the patch that added them?

The problem is that they&apos;re returning that there is a diff (which makes very little sense)!

&gt; &gt; Tools/Scripts/webkitpy/layout_tests/port/webkit.py:190
&gt; &gt; +        return output
&gt; 
&gt; The re-ordering of these branches looks correct, but it would be nice if we had tests that tested these cases one way or another to know that we were fixing and not introducing bugs. Oh, and I&apos;d like a pony.

I don&apos;t think I changed any behavior here.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>430714</commentid>
    <comment_count>29</comment_count>
    <who name="Dirk Pranke">dpranke</who>
    <bug_when>2011-06-30 15:13:58 -0700</bug_when>
    <thetext>(In reply to comment #28)
&gt; (In reply to comment #27)
&gt; &gt; (From update of attachment 99340 [details] [details])
&gt; &gt; Patch looks generally good.
&gt; 
&gt; Thanks for looking at the patch.
&gt; 
&gt; &gt; &gt; Tools/Scripts/webkitpy/layout_tests/run_webkit_tests_integrationtest.py:268
&gt; &gt; &gt; +        self.assertEqual(regular_output.get(), [u&apos;failures/expected/checksum.html\n\n&apos;])
&gt; &gt; 
&gt; &gt; Both you and Eric seem to be unwrapping lines as you go along in these patches, as well as making actual changes.
&gt; &gt; 
&gt; &gt; Since I&apos;ve had this feedback on my patches, I&apos;ll pass it along: it would be nice if you separated out the formatting changes from the semantic changes into different patches. In addition, since there&apos;s nothing actually wrong with the wrapped code, it seems like these changes are kinda unnecessary (one could argue that I would be just as justified in submitting patches that added the line breaks back in, because I find the old way easier to read ...).
&gt; 
&gt; We&apos;re following PEP8, with the exception of the line limit, where we&apos;re following WebKit style.
&gt; 
&gt; In any case, if our biggest problem is line length, then we&apos;re in good shape.
&gt; 

Yes. I&apos;m mostly just teasing. 

&gt; &gt; &gt; Tools/Scripts/webkitpy/layout_tests/run_webkit_tests_integrationtest.py:426
&gt; &gt; &gt; +                &apos;failures/unexpected/checksum-with-matching-image.html&apos;,
&gt; &gt; 
&gt; &gt; If this test no longer fails, we should rename it to passes/checksum-with-matching-image.html
&gt; 
&gt; Ok.
&gt; 
&gt; &gt; &gt; Tools/Scripts/webkitpy/layout_tests/run_webkit_tests_integrationtest.py:431
&gt; &gt; &gt; +        self.assertTrue(fs.read_text_file(&apos;/tmp/layout-test-results/unexpected_results.json&apos;).find(&apos;&quot;num_regressions&quot;:0&apos;) != -1)
&gt; &gt; 
&gt; &gt; res contains the # of unexpected failures. Just do self.assertEquals(res, 0).
&gt; 
&gt; The two seem interchangable.  What the advantage of one or the other?
&gt; 

It&apos;s shorter, faster, clearer (IMO), and does not have a dependency on the format of the unexpected_results.json file.


&gt; &gt; &gt; Tools/Scripts/webkitpy/layout_tests/layout_package/single_test_runner.py:276
&gt; &gt; &gt; +        if not expected_driver_output.image:
&gt; &gt; 
&gt; &gt; This is concerning ... if these typos weren&apos;t causing failures in the test suite before, then these lines weren&apos;t being executed. We should figure out why that is/was, and if it&apos;s no longer true.
&gt; 
&gt; I just renamed a bound variable.
&gt; 

Yes, my point was that you found what are at least gaps in test coverage and perhaps actual bugs. We should figure out what those are.

&gt; &gt; Do you know why they were executing before and that they now are?
&gt; &gt; 
&gt; &gt; &gt; Tools/Scripts/webkitpy/layout_tests/layout_package/single_test_runner.py:281
&gt; &gt; &gt; +            driver_output.image_diff = self._port.diff_image(driver_output.image, expected_driver_output.image)
&gt; &gt; 
&gt; &gt; The driver isn&apos;t producing the image_diff, so I&apos;m not pleased with hanging the image_diff off of it.
&gt; &gt; 
&gt; &gt; Can we return the diff separately alongside the failures? Maybe we should pass in the TestResult object in to the compare_* routines and modify that instead?
&gt; 
&gt; Yeah, this isn&apos;t ideal, but that&apos;s not a blocking issue.  Hence, it&apos;s a problem for another day.
&gt; 
&gt; &gt; &gt; Tools/Scripts/webkitpy/layout_tests/layout_package/single_test_runner.py:283
&gt; &gt; &gt; +                failures.append(test_failures.FailureImageHashMismatch())
&gt; &gt; 
&gt; &gt; Probably a separate patch, but I wonder if we should just get rid of the FailureImageHash* failure types and just have FailureImageMismatch ?
&gt; 
&gt; We&apos;re going to have to rip out the multiple representations of the result of running a test and replace it with something consistent.  We should do that then.
&gt; 
&gt; &gt; &gt; Tools/Scripts/webkitpy/layout_tests/layout_package/test_result_writer.py:61
&gt; &gt; &gt; +            writer.write_image_diff_files(driver_output.image_diff)
&gt; &gt; 
&gt; &gt; See above re: image_diff hanging off of driver_output. If we modify write_test_result() to take the TestResult object as a parameter instead of just the list of failures, then the changes I made above would allow you to just pull the existing image_diff off of that object. This can probably all be done in a follow-up patch, though.
&gt; 
&gt; This all needs to be re-architected globally.

I don&apos;t think you should dismiss my comments quite so lightly. You are introducing a design flaw in the code (by confusing what DriverOutput is doing). My suggestions would be straightforward to fix that and would hardly be a &quot;global re-architecting&quot;.

&gt; 
&gt; &gt; &gt; Tools/Scripts/webkitpy/layout_tests/layout_package/test_result_writer.py:75
&gt; &gt; &gt; +                writer.write_image_diff_files(image_diff)
&gt; &gt; 
&gt; &gt; similar to above.
&gt; &gt; 
&gt; &gt; &gt; Tools/Scripts/webkitpy/layout_tests/port/base.py:937
&gt; &gt; &gt; +        self.image_diff = None  # image_diff gets filled in after construction.
&gt; &gt; 
&gt; &gt; see comments above.
&gt; &gt; 
&gt; &gt; &gt; Tools/Scripts/webkitpy/layout_tests/port/chromium.py:142
&gt; &gt; &gt;          # FIXME: need unit tests for this.
&gt; &gt; 
&gt; &gt; I think we can actually remove this comment, given that there are unit tests in port_testcase.py for this.
&gt; 
&gt; Please feel to write such a patch.
&gt; 
&gt; &gt; &gt; Tools/Scripts/webkitpy/layout_tests/port/chromium_unittest.py:229
&gt; &gt; &gt; +        self.assertEquals(None, port.diff_image(&quot;EXPECTED&quot;, &quot;ACTUAL&quot;))
&gt; &gt; 
&gt; &gt; I wonder why these tests are here rather than in port_testcase ... I don&apos;t see anything obviously chromium-specific about them. Maybe I wrote them before I wrote the port_testcase ones, and never moved them over.
&gt; 
&gt; Dunno.
&gt; 
&gt; &gt; &gt; Tools/Scripts/webkitpy/layout_tests/port/port_testcase.py:235
&gt; &gt; &gt; +        self.assertFalse(port.diff_image(&apos;&apos;, &apos;&apos;))
&gt; &gt; 
&gt; &gt; These should be testing against None explicitly. A port implementation that didn&apos;t get updated and returned False to indicate that there was a image diff would incorrectly pass here.
&gt; 
&gt; Why is that an incorrect pass?  Returning anything falsy is probably ok.
&gt; 

The point is that by testing against False, you are missing cases where the routine returns False instead of a string or None (certainly a bug), and missing cases where it&apos;s returning a diff of &apos;&apos; instead of None (probalby a bug).

&gt; &gt; &gt; Tools/Scripts/webkitpy/layout_tests/port/test.py:148
&gt; &gt; &gt; +              actual_checksum=&apos;text-image-checksum_fail-checksum&apos;)
&gt; &gt; 
&gt; &gt; See comment way earlier ... this should be renamed if it no longer fails.
&gt; &gt; 
&gt; &gt; &gt; Tools/Scripts/webkitpy/layout_tests/port/webkit.py:142
&gt; &gt; &gt; +            # Maybe we should throw an exception?
&gt; &gt; 
&gt; &gt; Obviously, the tests expect you return that there was no diff. I don&apos;t remember why I thought this was acceptable or correct, unfortunately :( Maybe there&apos;s a comment in the patch that added them?
&gt; 
&gt; The problem is that they&apos;re returning that there is a diff (which makes very little sense)!
&gt; 

If one file exists and is a valid image, and the other exists but is empty (what this branch is testing), I would say that that is a (sensible) diff.

&gt; &gt; &gt; Tools/Scripts/webkitpy/layout_tests/port/webkit.py:190
&gt; &gt; &gt; +        return output
&gt; &gt; 
&gt; &gt; The re-ordering of these branches looks correct, but it would be nice if we had tests that tested these cases one way or another to know that we were fixing and not introducing bugs. Oh, and I&apos;d like a pony.
&gt; 
&gt; I don&apos;t think I changed any behavior here.

Well, you clearly changed the logic of the code, and that logic should be visibly (testably) different, even if current tests don&apos;t happen to illustrate that. It might be nice to have such tests, but I don&apos;t think it&apos;s super important (hence the pony comment).</thetext>
  </long_desc>
      
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>99218</attachid>
            <date>2011-06-29 19:50:43 -0700</date>
            <delta_ts>2011-06-29 19:58:29 -0700</delta_ts>
            <desc>Work in progress</desc>
            <filename>bug-63494-20110629195042.patch</filename>
            <type>text/plain</type>
            <size>2701</size>
            <attacher name="Adam Barth">abarth</attacher>
            
              <data encoding="base64">SW5kZXg6IFRvb2xzL1NjcmlwdHMvd2Via2l0cHkvbGF5b3V0X3Rlc3RzL2xheW91dF9wYWNrYWdl
L3Rlc3RfcmVzdWx0X3dyaXRlci5weQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBUb29scy9TY3JpcHRzL3dlYmtp
dHB5L2xheW91dF90ZXN0cy9sYXlvdXRfcGFja2FnZS90ZXN0X3Jlc3VsdF93cml0ZXIucHkJKHJl
dmlzaW9uIDkwMDc4KQorKysgVG9vbHMvU2NyaXB0cy93ZWJraXRweS9sYXlvdXRfdGVzdHMvbGF5
b3V0X3BhY2thZ2UvdGVzdF9yZXN1bHRfd3JpdGVyLnB5CSh3b3JraW5nIGNvcHkpCkBAIC00MSw4
ICs0MSw2IEBAIGRlZiB3cml0ZV90ZXN0X3Jlc3VsdChwb3J0LCBmaWxlbmFtZSwgZHIKICAgICAg
ICAgICAgICAgICAgICAgICBleHBlY3RlZF9kcml2ZXJfb3V0cHV0LCBmYWlsdXJlcyk6CiAgICAg
IiIiV3JpdGUgdGhlIHRlc3QgcmVzdWx0IHRvIHRoZSByZXN1bHQgb3V0cHV0IGRpcmVjdG9yeS4i
IiIKICAgICByb290X291dHB1dF9kaXIgPSBwb3J0LnJlc3VsdHNfZGlyZWN0b3J5KCkKLSAgICBj
aGVja3N1bXNfbWlzbWF0Y2hfYnV0X2ltYWdlc19hcmVfc2FtZSA9IEZhbHNlCi0gICAgaW1hZ2Vo
YXNoX21pc21hdGNoX2ZhaWx1cmUgPSBOb25lCiAgICAgd3JpdGVyID0gVGVzdFJlc3VsdFdyaXRl
cihwb3J0LCByb290X291dHB1dF9kaXIsIGZpbGVuYW1lKQogICAgIGlmIGRyaXZlcl9vdXRwdXQu
ZXJyb3I6CiAgICAgICAgIHdyaXRlci53cml0ZV9zdGRlcnIoZHJpdmVyX291dHB1dC5lcnJvcikK
QEAgLTU5LDEyICs1NywxMCBAQCBkZWYgd3JpdGVfdGVzdF9yZXN1bHQocG9ydCwgZmlsZW5hbWUs
IGRyCiAgICAgICAgIGVsaWYgaXNpbnN0YW5jZShmYWlsdXJlLCB0ZXN0X2ZhaWx1cmVzLkZhaWx1
cmVNaXNzaW5nSW1hZ2VIYXNoKToKICAgICAgICAgICAgIHdyaXRlci53cml0ZV9pbWFnZV9maWxl
cyhkcml2ZXJfb3V0cHV0LmltYWdlLCBleHBlY3RlZF9kcml2ZXJfb3V0cHV0LmltYWdlKQogICAg
ICAgICBlbGlmIGlzaW5zdGFuY2UoZmFpbHVyZSwgdGVzdF9mYWlsdXJlcy5GYWlsdXJlSW1hZ2VI
YXNoTWlzbWF0Y2gpOgotICAgICAgICAgICAgd3JpdGVyLndyaXRlX2ltYWdlX2ZpbGVzKGRyaXZl
cl9vdXRwdXQuaW1hZ2UsIGV4cGVjdGVkX2RyaXZlcl9vdXRwdXQuaW1hZ2UpCiAgICAgICAgICAg
ICBpbWFnZXNfYXJlX2RpZmZlcmVudCA9IHdyaXRlci5jcmVhdGVfaW1hZ2VfZGlmZl9hbmRfd3Jp
dGVfcmVzdWx0KAogICAgICAgICAgICAgICAgIGRyaXZlcl9vdXRwdXQuaW1hZ2UsIGV4cGVjdGVk
X2RyaXZlcl9vdXRwdXQuaW1hZ2UpCi0gICAgICAgICAgICBpZiBub3QgaW1hZ2VzX2FyZV9kaWZm
ZXJlbnQ6Ci0gICAgICAgICAgICAgICAgY2hlY2tzdW1zX21pc21hdGNoX2J1dF9pbWFnZXNfYXJl
X3NhbWUgPSBUcnVlCi0gICAgICAgICAgICAgICAgaW1hZ2VoYXNoX21pc21hdGNoX2ZhaWx1cmUg
PSBmYWlsdXJlCisgICAgICAgICAgICBpZiBpbWFnZXNfYXJlX2RpZmZlcmVudDoKKyAgICAgICAg
ICAgICAgICB3cml0ZXIud3JpdGVfaW1hZ2VfZmlsZXMoZHJpdmVyX291dHB1dC5pbWFnZSwgZXhw
ZWN0ZWRfZHJpdmVyX291dHB1dC5pbWFnZSkKICAgICAgICAgZWxpZiBpc2luc3RhbmNlKGZhaWx1
cmUsICh0ZXN0X2ZhaWx1cmVzLkZhaWx1cmVBdWRpb01pc21hdGNoLAogICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgIHRlc3RfZmFpbHVyZXMuRmFpbHVyZU1pc3NpbmdBdWRpbykpOgog
ICAgICAgICAgICAgd3JpdGVyLndyaXRlX2F1ZGlvX2ZpbGVzKGRyaXZlcl9vdXRwdXQuYXVkaW8s
IGV4cGVjdGVkX2RyaXZlcl9vdXRwdXQuYXVkaW8pCkBAIC04MywxNSArNzksNiBAQCBkZWYgd3Jp
dGVfdGVzdF9yZXN1bHQocG9ydCwgZmlsZW5hbWUsIGRyCiAgICAgICAgIGVsc2U6CiAgICAgICAg
ICAgICBhc3NlcnQgaXNpbnN0YW5jZShmYWlsdXJlLCAodGVzdF9mYWlsdXJlcy5GYWlsdXJlVGlt
ZW91dCwpKQogCi0gICAgIyBGSVhNRTogVGhpcyBpcyBhbiB1Z2x5IGhhY2sgdG8gaGFuZGxlIEZh
aWx1cmVJbWFnZUhhc2hJbmNvcnJlY3QgY2FzZS4KLSAgICAjIElkZWFsbHksIEZhaWx1cmVJbWFn
ZUhhc2hJbmNvcnJlY3QgY2FzZSBzaG91bGQgYmUgZGV0ZWN0ZWQgYmVmb3JlIHRoaXMKLSAgICAj
IGZ1bmN0aW9uIGlzIGNhbGxlZC4gQnV0IGl0IHJlcXVpcmVzIGNhbGxpbmcgY3JlYXRlX2RpZmZf
aW1hZ2UoKSB0byBkZXRlY3QKLSAgICAjIHdoZXRoZXIgdHdvIGltYWdlcyBhcmUgc2FtZSBvciBu
b3QuIFNvIHdlIG5lZWQgdGhpcyBoYWNrIHVudGlsIHdlIGhhdmUgYSBiZXR0ZXIgYXBwcm9hY2gu
Ci0gICAgaWYgY2hlY2tzdW1zX21pc21hdGNoX2J1dF9pbWFnZXNfYXJlX3NhbWU6Ci0gICAgICAg
ICMgUmVwbGFjZSBGYWlsdXJlSW1hZ2VIYXNoTWlzbWF0Y2ggd2l0aCBGYWlsdXJlSW1hZ2VIYXNo
SW5jb3JyZWN0LgotICAgICAgICBmYWlsdXJlcy5yZW1vdmUoaW1hZ2VoYXNoX21pc21hdGNoX2Zh
aWx1cmUpCi0gICAgICAgIGZhaWx1cmVzLmFwcGVuZCh0ZXN0X2ZhaWx1cmVzLkZhaWx1cmVJbWFn
ZUhhc2hJbmNvcnJlY3QoKSkKLQogCiBjbGFzcyBUZXN0UmVzdWx0V3JpdGVyKG9iamVjdCk6CiAg
ICAgIiIiQSBjbGFzcyB3aGljaCBoYW5kbGVzIGFsbCB3cml0aW5nIG9wZXJhdGlvbnMgdG8gdGhl
IHJlc3VsdCBkaXJlY3RvcnkuIiIiCg==
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>99222</attachid>
            <date>2011-06-29 19:58:33 -0700</date>
            <delta_ts>2011-06-29 21:27:09 -0700</delta_ts>
            <desc>Work in progress</desc>
            <filename>bug-63494-20110629195832.patch</filename>
            <type>text/plain</type>
            <size>675</size>
            <attacher name="Adam Barth">abarth</attacher>
            
              <data encoding="base64">SW5kZXg6IFRvb2xzL1NjcmlwdHMvd2Via2l0cHkvbGF5b3V0X3Rlc3RzL2xheW91dF9wYWNrYWdl
L3Rlc3RfcmVzdWx0X3dyaXRlci5weQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBUb29scy9TY3JpcHRzL3dlYmtp
dHB5L2xheW91dF90ZXN0cy9sYXlvdXRfcGFja2FnZS90ZXN0X3Jlc3VsdF93cml0ZXIucHkJKHJl
dmlzaW9uIDkwMDc4KQorKysgVG9vbHMvU2NyaXB0cy93ZWJraXRweS9sYXlvdXRfdGVzdHMvbGF5
b3V0X3BhY2thZ2UvdGVzdF9yZXN1bHRfd3JpdGVyLnB5CSh3b3JraW5nIGNvcHkpCkBAIC05MCw3
ICs5MCw2IEBAIGRlZiB3cml0ZV90ZXN0X3Jlc3VsdChwb3J0LCBmaWxlbmFtZSwgZHIKICAgICBp
ZiBjaGVja3N1bXNfbWlzbWF0Y2hfYnV0X2ltYWdlc19hcmVfc2FtZToKICAgICAgICAgIyBSZXBs
YWNlIEZhaWx1cmVJbWFnZUhhc2hNaXNtYXRjaCB3aXRoIEZhaWx1cmVJbWFnZUhhc2hJbmNvcnJl
Y3QuCiAgICAgICAgIGZhaWx1cmVzLnJlbW92ZShpbWFnZWhhc2hfbWlzbWF0Y2hfZmFpbHVyZSkK
LSAgICAgICAgZmFpbHVyZXMuYXBwZW5kKHRlc3RfZmFpbHVyZXMuRmFpbHVyZUltYWdlSGFzaElu
Y29ycmVjdCgpKQogCiAKIGNsYXNzIFRlc3RSZXN1bHRXcml0ZXIob2JqZWN0KToK
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>99231</attachid>
            <date>2011-06-29 21:27:13 -0700</date>
            <delta_ts>2011-06-29 22:15:00 -0700</delta_ts>
            <desc>Work in progress</desc>
            <filename>bug-63494-20110629212712.patch</filename>
            <type>text/plain</type>
            <size>20539</size>
            <attacher name="Adam Barth">abarth</attacher>
            
              <data encoding="base64">SW5kZXg6IFRvb2xzL1NjcmlwdHMvd2Via2l0cHkvbGF5b3V0X3Rlc3RzL3J1bl93ZWJraXRfdGVz
dHNfaW50ZWdyYXRpb250ZXN0LnB5Cj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFRvb2xzL1NjcmlwdHMvd2Via2l0
cHkvbGF5b3V0X3Rlc3RzL3J1bl93ZWJraXRfdGVzdHNfaW50ZWdyYXRpb250ZXN0LnB5CShyZXZp
c2lvbiA5MDA3OCkKKysrIFRvb2xzL1NjcmlwdHMvd2Via2l0cHkvbGF5b3V0X3Rlc3RzL3J1bl93
ZWJraXRfdGVzdHNfaW50ZWdyYXRpb250ZXN0LnB5CSh3b3JraW5nIGNvcHkpCkBAIC01NTMsOCAr
NTUzLDcgQEAgY2xhc3MgTWFpblRlc3QodW5pdHRlc3QuVGVzdENhc2UpOgogCiAgICAgZGVmIHRl
c3RfdG9sZXJhbmNlKHNlbGYpOgogICAgICAgICBjbGFzcyBJbWFnZURpZmZUZXN0UG9ydChUZXN0
UG9ydCk6Ci0gICAgICAgICAgICBkZWYgZGlmZl9pbWFnZShzZWxmLCBleHBlY3RlZF9jb250ZW50
cywgYWN0dWFsX2NvbnRlbnRzLAotICAgICAgICAgICAgICAgICAgIGRpZmZfZmlsZW5hbWU9Tm9u
ZSk6CisgICAgICAgICAgICBkZWYgZGlmZl9pbWFnZShzZWxmLCBleHBlY3RlZF9jb250ZW50cywg
YWN0dWFsX2NvbnRlbnRzKToKICAgICAgICAgICAgICAgICBzZWxmLnRvbGVyYW5jZV91c2VkX2Zv
cl9kaWZmX2ltYWdlID0gc2VsZi5fb3B0aW9ucy50b2xlcmFuY2UKICAgICAgICAgICAgICAgICBy
ZXR1cm4gVHJ1ZQogCkluZGV4OiBUb29scy9TY3JpcHRzL3dlYmtpdHB5L2xheW91dF90ZXN0cy9s
YXlvdXRfcGFja2FnZS9zaW5nbGVfdGVzdF9ydW5uZXIucHkKPT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gVG9vbHMv
U2NyaXB0cy93ZWJraXRweS9sYXlvdXRfdGVzdHMvbGF5b3V0X3BhY2thZ2Uvc2luZ2xlX3Rlc3Rf
cnVubmVyLnB5CShyZXZpc2lvbiA5MDA3OSkKKysrIFRvb2xzL1NjcmlwdHMvd2Via2l0cHkvbGF5
b3V0X3Rlc3RzL2xheW91dF9wYWNrYWdlL3NpbmdsZV90ZXN0X3J1bm5lci5weQkod29ya2luZyBj
b3B5KQpAQCAtMjY2LDE3ICsyNjYsMTkgQEAgY2xhc3MgU2luZ2xlVGVzdFJ1bm5lcjoKICAgICAg
ICAgIyB0aGUgbm9ybWFsaXplZCB0ZXh0IGV4cGVjdGF0aW9uIGZpbGVzLgogICAgICAgICByZXR1
cm4gb3V0cHV0LnJlcGxhY2UoIlxyXHJcbiIsICJcclxuIikucmVwbGFjZSgiXHJcbiIsICJcbiIp
CiAKLSAgICBkZWYgX2NvbXBhcmVfaW1hZ2Uoc2VsZiwgZHJpdmVyX291dHB1dCwgZXhwZWN0ZWRf
ZHJpdmVyX291dHB1dHMpOgorICAgIGRlZiBfY29tcGFyZV9pbWFnZShzZWxmLCBkcml2ZXJfb3V0
cHV0LCBleHBlY3RlZF9kcml2ZXJfb3V0cHV0KToKICAgICAgICAgZmFpbHVyZXMgPSBbXQogICAg
ICAgICAjIElmIHdlIGRpZG4ndCBwcm9kdWNlIGEgaGFzaCBmaWxlLCB0aGlzIHRlc3QgbXVzdCBi
ZSB0ZXh0LW9ubHkuCiAgICAgICAgIGlmIGRyaXZlcl9vdXRwdXQuaW1hZ2VfaGFzaCBpcyBOb25l
OgogICAgICAgICAgICAgcmV0dXJuIGZhaWx1cmVzCi0gICAgICAgIGlmIG5vdCBleHBlY3RlZF9k
cml2ZXJfb3V0cHV0cy5pbWFnZToKKyAgICAgICAgaWYgbm90IGV4cGVjdGVkX2RyaXZlcl9vdXRw
dXQuaW1hZ2U6CiAgICAgICAgICAgICBmYWlsdXJlcy5hcHBlbmQodGVzdF9mYWlsdXJlcy5GYWls
dXJlTWlzc2luZ0ltYWdlKCkpCi0gICAgICAgIGVsaWYgbm90IGV4cGVjdGVkX2RyaXZlcl9vdXRw
dXRzLmltYWdlX2hhc2g6CisgICAgICAgIGVsaWYgbm90IGV4cGVjdGVkX2RyaXZlcl9vdXRwdXQu
aW1hZ2VfaGFzaDoKICAgICAgICAgICAgIGZhaWx1cmVzLmFwcGVuZCh0ZXN0X2ZhaWx1cmVzLkZh
aWx1cmVNaXNzaW5nSW1hZ2VIYXNoKCkpCi0gICAgICAgIGVsaWYgZHJpdmVyX291dHB1dC5pbWFn
ZV9oYXNoICE9IGV4cGVjdGVkX2RyaXZlcl9vdXRwdXRzLmltYWdlX2hhc2g6Ci0gICAgICAgICAg
ICBmYWlsdXJlcy5hcHBlbmQodGVzdF9mYWlsdXJlcy5GYWlsdXJlSW1hZ2VIYXNoTWlzbWF0Y2go
KSkKKyAgICAgICAgZWxpZiBkcml2ZXJfb3V0cHV0LmltYWdlX2hhc2ggIT0gZXhwZWN0ZWRfZHJp
dmVyX291dHB1dC5pbWFnZV9oYXNoOgorICAgICAgICAgICAgZHJpdmVyX291dHB1dC5pbWFnZV9k
aWZmID0gc2VsZi5fcG9ydC5kaWZmX2ltYWdlKGRyaXZlcl9vdXRwdXQuaW1hZ2UsIGV4cGVjdGVk
X2RyaXZlcl9vdXRwdXQuaW1hZ2UpCisgICAgICAgICAgICBpZiBkcml2ZXJfb3V0cHV0LmltYWdl
X2RpZmY6CisgICAgICAgICAgICAgICAgZmFpbHVyZXMuYXBwZW5kKHRlc3RfZmFpbHVyZXMuRmFp
bHVyZUltYWdlSGFzaE1pc21hdGNoKCkpCiAgICAgICAgIHJldHVybiBmYWlsdXJlcwogCiAgICAg
ZGVmIF9ydW5fcmVmdGVzdChzZWxmKToKSW5kZXg6IFRvb2xzL1NjcmlwdHMvd2Via2l0cHkvbGF5
b3V0X3Rlc3RzL2xheW91dF9wYWNrYWdlL3Rlc3RfcmVzdWx0X3dyaXRlci5weQo9PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
Ci0tLSBUb29scy9TY3JpcHRzL3dlYmtpdHB5L2xheW91dF90ZXN0cy9sYXlvdXRfcGFja2FnZS90
ZXN0X3Jlc3VsdF93cml0ZXIucHkJKHJldmlzaW9uIDkwMDc4KQorKysgVG9vbHMvU2NyaXB0cy93
ZWJraXRweS9sYXlvdXRfdGVzdHMvbGF5b3V0X3BhY2thZ2UvdGVzdF9yZXN1bHRfd3JpdGVyLnB5
CSh3b3JraW5nIGNvcHkpCkBAIC00MSw4ICs0MSw2IEBAIGRlZiB3cml0ZV90ZXN0X3Jlc3VsdChw
b3J0LCBmaWxlbmFtZSwgZHIKICAgICAgICAgICAgICAgICAgICAgICBleHBlY3RlZF9kcml2ZXJf
b3V0cHV0LCBmYWlsdXJlcyk6CiAgICAgIiIiV3JpdGUgdGhlIHRlc3QgcmVzdWx0IHRvIHRoZSBy
ZXN1bHQgb3V0cHV0IGRpcmVjdG9yeS4iIiIKICAgICByb290X291dHB1dF9kaXIgPSBwb3J0LnJl
c3VsdHNfZGlyZWN0b3J5KCkKLSAgICBjaGVja3N1bXNfbWlzbWF0Y2hfYnV0X2ltYWdlc19hcmVf
c2FtZSA9IEZhbHNlCi0gICAgaW1hZ2VoYXNoX21pc21hdGNoX2ZhaWx1cmUgPSBOb25lCiAgICAg
d3JpdGVyID0gVGVzdFJlc3VsdFdyaXRlcihwb3J0LCByb290X291dHB1dF9kaXIsIGZpbGVuYW1l
KQogICAgIGlmIGRyaXZlcl9vdXRwdXQuZXJyb3I6CiAgICAgICAgIHdyaXRlci53cml0ZV9zdGRl
cnIoZHJpdmVyX291dHB1dC5lcnJvcikKQEAgLTYwLDExICs1OCw3IEBAIGRlZiB3cml0ZV90ZXN0
X3Jlc3VsdChwb3J0LCBmaWxlbmFtZSwgZHIKICAgICAgICAgICAgIHdyaXRlci53cml0ZV9pbWFn
ZV9maWxlcyhkcml2ZXJfb3V0cHV0LmltYWdlLCBleHBlY3RlZF9kcml2ZXJfb3V0cHV0LmltYWdl
KQogICAgICAgICBlbGlmIGlzaW5zdGFuY2UoZmFpbHVyZSwgdGVzdF9mYWlsdXJlcy5GYWlsdXJl
SW1hZ2VIYXNoTWlzbWF0Y2gpOgogICAgICAgICAgICAgd3JpdGVyLndyaXRlX2ltYWdlX2ZpbGVz
KGRyaXZlcl9vdXRwdXQuaW1hZ2UsIGV4cGVjdGVkX2RyaXZlcl9vdXRwdXQuaW1hZ2UpCi0gICAg
ICAgICAgICBpbWFnZXNfYXJlX2RpZmZlcmVudCA9IHdyaXRlci5jcmVhdGVfaW1hZ2VfZGlmZl9h
bmRfd3JpdGVfcmVzdWx0KAotICAgICAgICAgICAgICAgIGRyaXZlcl9vdXRwdXQuaW1hZ2UsIGV4
cGVjdGVkX2RyaXZlcl9vdXRwdXQuaW1hZ2UpCi0gICAgICAgICAgICBpZiBub3QgaW1hZ2VzX2Fy
ZV9kaWZmZXJlbnQ6Ci0gICAgICAgICAgICAgICAgY2hlY2tzdW1zX21pc21hdGNoX2J1dF9pbWFn
ZXNfYXJlX3NhbWUgPSBUcnVlCi0gICAgICAgICAgICAgICAgaW1hZ2VoYXNoX21pc21hdGNoX2Zh
aWx1cmUgPSBmYWlsdXJlCisgICAgICAgICAgICB3cml0ZXIud3JpdGVfaW1hZ2VfZGlmZl9maWxl
cyhkcml2ZXJfb3V0cHV0LmltYWdlX2RpZmYpCiAgICAgICAgIGVsaWYgaXNpbnN0YW5jZShmYWls
dXJlLCAodGVzdF9mYWlsdXJlcy5GYWlsdXJlQXVkaW9NaXNtYXRjaCwKICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICB0ZXN0X2ZhaWx1cmVzLkZhaWx1cmVNaXNzaW5nQXVkaW8pKToK
ICAgICAgICAgICAgIHdyaXRlci53cml0ZV9hdWRpb19maWxlcyhkcml2ZXJfb3V0cHV0LmF1ZGlv
LCBleHBlY3RlZF9kcml2ZXJfb3V0cHV0LmF1ZGlvKQpAQCAtNzUsNyArNjksMTAgQEAgZGVmIHdy
aXRlX3Rlc3RfcmVzdWx0KHBvcnQsIGZpbGVuYW1lLCBkcgogICAgICAgICAgICAgICAgIHdyaXRl
ci53cml0ZV9jcmFzaF9yZXBvcnQoZHJpdmVyX291dHB1dC5lcnJvcikKICAgICAgICAgZWxpZiBp
c2luc3RhbmNlKGZhaWx1cmUsIHRlc3RfZmFpbHVyZXMuRmFpbHVyZVJlZnRlc3RNaXNtYXRjaCk6
CiAgICAgICAgICAgICB3cml0ZXIud3JpdGVfaW1hZ2VfZmlsZXMoZHJpdmVyX291dHB1dC5pbWFn
ZSwgZXhwZWN0ZWRfZHJpdmVyX291dHB1dC5pbWFnZSkKLSAgICAgICAgICAgIHdyaXRlci5jcmVh
dGVfaW1hZ2VfZGlmZl9hbmRfd3JpdGVfcmVzdWx0KGRyaXZlcl9vdXRwdXQuaW1hZ2UsIGV4cGVj
dGVkX2RyaXZlcl9vdXRwdXQuaW1hZ2UpCisgICAgICAgICAgICAjIEZJWE1FOiBUaGlzIHdvcmsg
c2hvdWxkIGJlIGRvbmUgZWFybGllciBpbiB0aGUgcGlwZWxpbmUuCisgICAgICAgICAgICBpbWFn
ZV9kaWZmID0gcG9ydC5kaWZmX2ltYWdlKGRyaXZlcl9vdXRwdXQuaW1hZ2UsIGV4cGVjdGVkX2Ry
aXZlcl9vdXRwdXQuaW1hZ2UpCisgICAgICAgICAgICBpZiBpbWFnZV9kaWZmOgorICAgICAgICAg
ICAgICAgIHdyaXRlci53cml0ZV9pbWFnZV9kaWZmX2ZpbGVzKGltYWdlX2RpZmYpCiAgICAgICAg
ICAgICB3cml0ZXIuY29weV9maWxlKHBvcnQucmVmdGVzdF9leHBlY3RlZF9maWxlbmFtZShmaWxl
bmFtZSksICctZXhwZWN0ZWQuaHRtbCcpCiAgICAgICAgIGVsaWYgaXNpbnN0YW5jZShmYWlsdXJl
LCB0ZXN0X2ZhaWx1cmVzLkZhaWx1cmVSZWZ0ZXN0TWlzbWF0Y2hEaWROb3RPY2N1cik6CiAgICAg
ICAgICAgICB3cml0ZXIud3JpdGVfaW1hZ2VfZmlsZXMoZHJpdmVyX291dHB1dC5pbWFnZSwgZXhw
ZWN0ZWRfaW1hZ2U9Tm9uZSkKQEAgLTgzLDE1ICs4MCw2IEBAIGRlZiB3cml0ZV90ZXN0X3Jlc3Vs
dChwb3J0LCBmaWxlbmFtZSwgZHIKICAgICAgICAgZWxzZToKICAgICAgICAgICAgIGFzc2VydCBp
c2luc3RhbmNlKGZhaWx1cmUsICh0ZXN0X2ZhaWx1cmVzLkZhaWx1cmVUaW1lb3V0LCkpCiAKLSAg
ICAjIEZJWE1FOiBUaGlzIGlzIGFuIHVnbHkgaGFjayB0byBoYW5kbGUgRmFpbHVyZUltYWdlSGFz
aEluY29ycmVjdCBjYXNlLgotICAgICMgSWRlYWxseSwgRmFpbHVyZUltYWdlSGFzaEluY29ycmVj
dCBjYXNlIHNob3VsZCBiZSBkZXRlY3RlZCBiZWZvcmUgdGhpcwotICAgICMgZnVuY3Rpb24gaXMg
Y2FsbGVkLiBCdXQgaXQgcmVxdWlyZXMgY2FsbGluZyBjcmVhdGVfZGlmZl9pbWFnZSgpIHRvIGRl
dGVjdAotICAgICMgd2hldGhlciB0d28gaW1hZ2VzIGFyZSBzYW1lIG9yIG5vdC4gU28gd2UgbmVl
ZCB0aGlzIGhhY2sgdW50aWwgd2UgaGF2ZSBhIGJldHRlciBhcHByb2FjaC4KLSAgICBpZiBjaGVj
a3N1bXNfbWlzbWF0Y2hfYnV0X2ltYWdlc19hcmVfc2FtZToKLSAgICAgICAgIyBSZXBsYWNlIEZh
aWx1cmVJbWFnZUhhc2hNaXNtYXRjaCB3aXRoIEZhaWx1cmVJbWFnZUhhc2hJbmNvcnJlY3QuCi0g
ICAgICAgIGZhaWx1cmVzLnJlbW92ZShpbWFnZWhhc2hfbWlzbWF0Y2hfZmFpbHVyZSkKLSAgICAg
ICAgZmFpbHVyZXMuYXBwZW5kKHRlc3RfZmFpbHVyZXMuRmFpbHVyZUltYWdlSGFzaEluY29ycmVj
dCgpKQotCiAKIGNsYXNzIFRlc3RSZXN1bHRXcml0ZXIob2JqZWN0KToKICAgICAiIiJBIGNsYXNz
IHdoaWNoIGhhbmRsZXMgYWxsIHdyaXRpbmcgb3BlcmF0aW9ucyB0byB0aGUgcmVzdWx0IGRpcmVj
dG9yeS4iIiIKQEAgLTIxNSwxOSArMjAzLDEwIEBAIGNsYXNzIFRlc3RSZXN1bHRXcml0ZXIob2Jq
ZWN0KToKICAgICBkZWYgd3JpdGVfaW1hZ2VfZmlsZXMoc2VsZiwgYWN0dWFsX2ltYWdlLCBleHBl
Y3RlZF9pbWFnZSk6CiAgICAgICAgIHNlbGYud3JpdGVfb3V0cHV0X2ZpbGVzKCcucG5nJywgYWN0
dWFsX2ltYWdlLCBleHBlY3RlZF9pbWFnZSkKIAotICAgIGRlZiBjcmVhdGVfaW1hZ2VfZGlmZl9h
bmRfd3JpdGVfcmVzdWx0KHNlbGYsIGFjdHVhbF9pbWFnZSwgZXhwZWN0ZWRfaW1hZ2UpOgotICAg
ICAgICAiIiJXcml0ZXMgdGhlIHZpc3VhbCBkaWZmIG9mIHRoZSBleHBlY3RlZC9hY3R1YWwgUE5H
cy4KLQotICAgICAgICBSZXR1cm5zIFRydWUgaWYgdGhlIGltYWdlcyBhcmUgZGlmZmVyZW50Lgot
ICAgICAgICAiIiIKLSAgICAgICAgIyBGSVhNRTogVGhpcyBmdW5jdGlvbiBpcyBhY3R1YWxseSBk
b2luZyB0aGUgZGlmZiBhcyB3ZWxsIGFzIHdyaXRpbmcgYSByZXN1bHQuCi0gICAgICAgICMgSXQg
bWlnaHQgYmUgYmV0dGVyIHRvIGV4dHJhY3QgJ2RpZmYnIGNvZGUgYW5kIG1ha2UgaXQgYSBzZXBh
cmF0ZSBmdW5jdGlvbi4KLSAgICAgICAgIyBUbyBkbyBzbywgd2UgaGF2ZSB0byBjaGFuZ2UgcG9y
dC5kaWZmX2ltYWdlKCkgYXMgd2VsbC4KKyAgICBkZWYgd3JpdGVfaW1hZ2VfZGlmZl9maWxlcyhz
ZWxmLCBpbWFnZV9kaWZmKToKICAgICAgICAgZGlmZl9maWxlbmFtZSA9IHNlbGYub3V0cHV0X2Zp
bGVuYW1lKHNlbGYuRklMRU5BTUVfU1VGRklYX0lNQUdFX0RJRkYpCi0gICAgICAgIGltYWdlc19h
cmVfZGlmZmVyZW50ID0gc2VsZi5fcG9ydC5kaWZmX2ltYWdlKGFjdHVhbF9pbWFnZSwgZXhwZWN0
ZWRfaW1hZ2UsIGRpZmZfZmlsZW5hbWUpCi0KLSAgICAgICAgaWYgbm90IGltYWdlc19hcmVfZGlm
ZmVyZW50OgotICAgICAgICAgICAgcmV0dXJuIEZhbHNlCisgICAgICAgIGZzID0gc2VsZi5fcG9y
dC5fZmlsZXN5c3RlbQorICAgICAgICBmcy53cml0ZV9iaW5hcnlfZmlsZShkaWZmX2ZpbGVuYW1l
LCBpbWFnZV9kaWZmKQogCiAgICAgICAgIGRpZmZzX2h0bWxfZmlsZW5hbWUgPSBzZWxmLm91dHB1
dF9maWxlbmFtZShzZWxmLkZJTEVOQU1FX1NVRkZJWF9JTUFHRV9ESUZGU19IVE1MKQogICAgICAg
ICAjIEZJWE1FOiBvbGQtcnVuLXdlYmtpdC10ZXN0cyBzaG93cyB0aGUgZGlmZiBwZXJjZW50YWdl
IGFzIHRoZSB0ZXh0IGNvbnRlbnRzIG9mIHRoZSAiZGlmZiIgbGluay4KQEAgLTI1MiwxMSArMjMx
LDE0IEBAIERpZmZlcmVuY2UgYmV0d2VlbiBpbWFnZXM6IDxhIGhyZWY9IiUoZGkKICAgICB0b2dn
bGVJbWFnZXMoKTsKICAgICBzZXRJbnRlcnZhbCh0b2dnbGVJbWFnZXMsIDIwMDApCiA8L3Njcmlw
dD4KLSIiIiAlIHsgJ3RpdGxlJzogc2VsZi5fdGVzdG5hbWUsICdkaWZmX2ZpbGVuYW1lJzogc2Vs
Zi5fb3V0cHV0X3Rlc3RuYW1lKCctZGlmZi5wbmcnKSwgJ3ByZWZpeCc6IHNlbGYuX291dHB1dF90
ZXN0bmFtZSgnJykgfQorIiIiICUgICB7CisgICAgICAgICAgICAndGl0bGUnOiBzZWxmLl90ZXN0
bmFtZSwKKyAgICAgICAgICAgICdkaWZmX2ZpbGVuYW1lJzogc2VsZi5fb3V0cHV0X3Rlc3RuYW1l
KHNlbGYuRklMRU5BTUVfU1VGRklYX0lNQUdFX0RJRkYpLAorICAgICAgICAgICAgJ3ByZWZpeCc6
IHNlbGYuX291dHB1dF90ZXN0bmFtZSgnJyksCisgICAgICAgIH0KKyAgICAgICAgIyBGSVhNRTog
VGhpcyBzZWVtcyBsaWtlIGEgdGV4dCBmaWxlLCBub3QgYSBiaW5hcnkgZmlsZS4KICAgICAgICAg
c2VsZi5fcG9ydC5fZmlsZXN5c3RlbS53cml0ZV9iaW5hcnlfZmlsZShkaWZmc19odG1sX2ZpbGVu
YW1lLCBodG1sKQogCi0gICAgICAgIHJldHVybiBUcnVlCi0KICAgICBkZWYgY29weV9maWxlKHNl
bGYsIHNyY19maWxlcGF0aCwgZHN0X2V4dGVuc2lvbik6CiAgICAgICAgIGZzID0gc2VsZi5fcG9y
dC5fZmlsZXN5c3RlbQogICAgICAgICBhc3NlcnQgZnMuZXhpc3RzKHNyY19maWxlcGF0aCksICdz
cmNfZmlsZXBhdGg6ICVzJyAlIHNyY19maWxlcGF0aApJbmRleDogVG9vbHMvU2NyaXB0cy93ZWJr
aXRweS9sYXlvdXRfdGVzdHMvcG9ydC9iYXNlLnB5Cj09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFRvb2xzL1Njcmlw
dHMvd2Via2l0cHkvbGF5b3V0X3Rlc3RzL3BvcnQvYmFzZS5weQkocmV2aXNpb24gOTAwNzgpCisr
KyBUb29scy9TY3JpcHRzL3dlYmtpdHB5L2xheW91dF90ZXN0cy9wb3J0L2Jhc2UucHkJKHdvcmtp
bmcgY29weSkKQEAgLTI0NCwxNiArMjQ0LDExIEBAIGNsYXNzIFBvcnQob2JqZWN0KToKICAgICAg
ICAgIiIiUmV0dXJuIHdoZXRoZXIgdGhlIHR3byBhdWRpbyBmaWxlcyBhcmUgKm5vdCogZXF1YWwu
IiIiCiAgICAgICAgIHJldHVybiBleHBlY3RlZF9hdWRpbyAhPSBhY3R1YWxfYXVkaW8KIAotICAg
IGRlZiBkaWZmX2ltYWdlKHNlbGYsIGV4cGVjdGVkX2NvbnRlbnRzLCBhY3R1YWxfY29udGVudHMs
IGRpZmZfZmlsZW5hbWU9Tm9uZSwgdG9sZXJhbmNlPTApOgotICAgICAgICAiIiJDb21wYXJlIHR3
byBpbWFnZXMgYW5kIHByb2R1Y2UgYSBkZWx0YSBpbWFnZSBmaWxlLgotCi0gICAgICAgIFJldHVy
biBUcnVlIGlmIHRoZSB0d28gaW1hZ2VzIGFyZSBkaWZmZXJlbnQsIEZhbHNlIGlmIHRoZXkgYXJl
IHRoZSBzYW1lLgotICAgICAgICBBbHNvIHByb2R1Y2UgYSBkZWx0YSBpbWFnZSBvZiB0aGUgdHdv
IGltYWdlcyBhbmQgd3JpdGUgdGhhdCBpbnRvCi0gICAgICAgIHxkaWZmX2ZpbGVuYW1lfCBpZiBp
dCBpcyBub3QgTm9uZS4KKyAgICBkZWYgZGlmZl9pbWFnZShzZWxmLCBleHBlY3RlZF9jb250ZW50
cywgYWN0dWFsX2NvbnRlbnRzLCB0b2xlcmFuY2U9MCk6CisgICAgICAgICIiIkNvbXBhcmUgdHdv
IGltYWdlcyBhbmQgcmV0dXJuIGFuIGltYWdlIGRpZmYuCiAKICAgICAgICAgfHRvbGVyYW5jZXwg
c2hvdWxkIGJlIGEgcGVyY2VudGFnZSB2YWx1ZSAoMC4wIC0gMTAwLjApLgogICAgICAgICBJZiBp
dCBpcyBvbWl0dGVkLCB0aGUgcG9ydCBkZWZhdWx0IHRvbGVyYW5jZSB2YWx1ZSBpcyB1c2VkLgot
CiAgICAgICAgICIiIgogICAgICAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKCdQb3J0LmRp
ZmZfaW1hZ2UnKQogCkBAIC05MzksNiArOTM0LDcgQEAgY2xhc3MgRHJpdmVyT3V0cHV0KG9iamVj
dCk6CiAgICAgICAgIHNlbGYudGV4dCA9IHRleHQKICAgICAgICAgc2VsZi5pbWFnZSA9IGltYWdl
CiAgICAgICAgIHNlbGYuaW1hZ2VfaGFzaCA9IGltYWdlX2hhc2gKKyAgICAgICAgc2VsZi5pbWFn
ZV9kaWZmID0gTm9uZSAgIyBpbWFnZV9kaWZmIGdldHMgZmlsbGVkIGluIGFmdGVyIGNvbnN0cnVj
dGlvbi4KICAgICAgICAgc2VsZi5hdWRpbyA9IGF1ZGlvCiAgICAgICAgIHNlbGYuY3Jhc2ggPSBj
cmFzaAogICAgICAgICBzZWxmLnRlc3RfdGltZSA9IHRlc3RfdGltZQpJbmRleDogVG9vbHMvU2Ny
aXB0cy93ZWJraXRweS9sYXlvdXRfdGVzdHMvcG9ydC9jaHJvbWl1bS5weQo9PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0t
LSBUb29scy9TY3JpcHRzL3dlYmtpdHB5L2xheW91dF90ZXN0cy9wb3J0L2Nocm9taXVtLnB5CShy
ZXZpc2lvbiA5MDA3OCkKKysrIFRvb2xzL1NjcmlwdHMvd2Via2l0cHkvbGF5b3V0X3Rlc3RzL3Bv
cnQvY2hyb21pdW0ucHkJKHdvcmtpbmcgY29weSkKQEAgLTEzOCw4ICsxMzgsNyBAQCBjbGFzcyBD
aHJvbWl1bVBvcnQoYmFzZS5Qb3J0KToKICAgICAgICAgcmV0dXJuIHNlbGYuX2NoZWNrX2ZpbGVf
ZXhpc3RzKGltYWdlX2RpZmZfcGF0aCwgJ2ltYWdlIGRpZmYgZXhlJywKICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgIG92ZXJyaWRlX3N0ZXAsIGxvZ2dpbmcpCiAKLSAgICBk
ZWYgZGlmZl9pbWFnZShzZWxmLCBleHBlY3RlZF9jb250ZW50cywgYWN0dWFsX2NvbnRlbnRzLAot
ICAgICAgICAgICAgICAgICAgIGRpZmZfZmlsZW5hbWU9Tm9uZSk6CisgICAgZGVmIGRpZmZfaW1h
Z2Uoc2VsZiwgZXhwZWN0ZWRfY29udGVudHMsIGFjdHVhbF9jb250ZW50cyk6CiAgICAgICAgICMg
RklYTUU6IG5lZWQgdW5pdCB0ZXN0cyBmb3IgdGhpcy4KICAgICAgICAgaWYgbm90IGFjdHVhbF9j
b250ZW50cyBhbmQgbm90IGV4cGVjdGVkX2NvbnRlbnRzOgogICAgICAgICAgICAgcmV0dXJuIEZh
bHNlCkBAIC0xNDcsMzkgKzE0NiwzOSBAQCBjbGFzcyBDaHJvbWl1bVBvcnQoYmFzZS5Qb3J0KToK
ICAgICAgICAgICAgIHJldHVybiBUcnVlCiAKICAgICAgICAgdGVtcGRpciA9IHNlbGYuX2ZpbGVz
eXN0ZW0ubWtkdGVtcCgpCisKICAgICAgICAgZXhwZWN0ZWRfZmlsZW5hbWUgPSBzZWxmLl9maWxl
c3lzdGVtLmpvaW4oc3RyKHRlbXBkaXIpLCAiZXhwZWN0ZWQucG5nIikKICAgICAgICAgc2VsZi5f
ZmlsZXN5c3RlbS53cml0ZV9iaW5hcnlfZmlsZShleHBlY3RlZF9maWxlbmFtZSwgZXhwZWN0ZWRf
Y29udGVudHMpCisKICAgICAgICAgYWN0dWFsX2ZpbGVuYW1lID0gc2VsZi5fZmlsZXN5c3RlbS5q
b2luKHN0cih0ZW1wZGlyKSwgImFjdHVhbC5wbmciKQogICAgICAgICBzZWxmLl9maWxlc3lzdGVt
LndyaXRlX2JpbmFyeV9maWxlKGFjdHVhbF9maWxlbmFtZSwgYWN0dWFsX2NvbnRlbnRzKQogCisg
ICAgICAgIGRpZmZfZmlsZW5hbWUgPSBzZWxmLl9maWxlc3lzdGVtLmpvaW4oc3RyKHRlbXBkaXIp
LCAiZGlmZi5wbmciKQorCiAgICAgICAgIGV4ZWN1dGFibGUgPSBzZWxmLl9wYXRoX3RvX2ltYWdl
X2RpZmYoKQotICAgICAgICBpZiBkaWZmX2ZpbGVuYW1lOgotICAgICAgICAgICAgY21kID0gW2V4
ZWN1dGFibGUsICctLWRpZmYnLCBleHBlY3RlZF9maWxlbmFtZSwKLSAgICAgICAgICAgICAgICAg
ICBhY3R1YWxfZmlsZW5hbWUsIGRpZmZfZmlsZW5hbWVdCi0gICAgICAgIGVsc2U6Ci0gICAgICAg
ICAgICBjbWQgPSBbZXhlY3V0YWJsZSwgZXhwZWN0ZWRfZmlsZW5hbWUsIGFjdHVhbF9maWxlbmFt
ZV0KKyAgICAgICAgY29tYW5kID0gW2V4ZWN1dGFibGUsICctLWRpZmYnLCBleHBlY3RlZF9maWxl
bmFtZSwgYWN0dWFsX2ZpbGVuYW1lLCBkaWZmX2ZpbGVuYW1lXQogCi0gICAgICAgIHJlc3VsdCA9
IFRydWUKKyAgICAgICAgcmVzdWx0ID0gTm9uZQogICAgICAgICB0cnk6Ci0gICAgICAgICAgICBl
eGl0X2NvZGUgPSBzZWxmLl9leGVjdXRpdmUucnVuX2NvbW1hbmQoY21kLCByZXR1cm5fZXhpdF9j
b2RlPVRydWUpCisgICAgICAgICAgICBleGl0X2NvZGUgPSBzZWxmLl9leGVjdXRpdmUucnVuX2Nv
bW1hbmQoY29tYW5kLCByZXR1cm5fZXhpdF9jb2RlPVRydWUpCiAgICAgICAgICAgICBpZiBleGl0
X2NvZGUgPT0gMDoKICAgICAgICAgICAgICAgICAjIFRoZSBpbWFnZXMgYXJlIHRoZSBzYW1lLgot
ICAgICAgICAgICAgICAgIHJlc3VsdCA9IEZhbHNlCisgICAgICAgICAgICAgICAgcmVzdWx0ID0g
Tm9uZQogICAgICAgICAgICAgZWxpZiBleGl0X2NvZGUgIT0gMToKLSAgICAgICAgICAgICAgICBf
bG9nLmVycm9yKCJpbWFnZSBkaWZmIHJldHVybmVkIGFuIGV4aXQgY29kZSBvZiAiCi0gICAgICAg
ICAgICAgICAgICAgICAgICAgICArIHN0cihleGl0X2NvZGUpKQorICAgICAgICAgICAgICAgIF9s
b2cuZXJyb3IoImltYWdlIGRpZmYgcmV0dXJuZWQgYW4gZXhpdCBjb2RlIG9mICVzIiAlIGV4aXRf
Y29kZSkKICAgICAgICAgICAgICAgICAjIFJldHVybmluZyBGYWxzZSBoZXJlIGNhdXNlcyB0aGUg
c2NyaXB0IHRvIHRoaW5rIHRoYXQgd2UKICAgICAgICAgICAgICAgICAjIHN1Y2Nlc3NmdWxseSBj
cmVhdGVkIHRoZSBkaWZmIGV2ZW4gdGhvdWdoIHdlIGRpZG4ndC4gIElmCiAgICAgICAgICAgICAg
ICAgIyB3ZSByZXR1cm4gVHJ1ZSwgd2UgdGhpbmsgdGhhdCB0aGUgaW1hZ2VzIG1hdGNoIGJ1dCB0
aGUgaGFzaGVzCiAgICAgICAgICAgICAgICAgIyBkb24ndCBtYXRjaC4KICAgICAgICAgICAgICAg
ICAjIEZJWE1FOiBGaWd1cmUgb3V0IHdoeSBpbWFnZV9kaWZmIHJldHVybnMgb3RoZXIgdmFsdWVz
LgotICAgICAgICAgICAgICAgIHJlc3VsdCA9IEZhbHNlCisgICAgICAgICAgICAgICAgcmVzdWx0
ID0gTm9uZQogICAgICAgICBleGNlcHQgT1NFcnJvciwgZToKICAgICAgICAgICAgIGlmIGUuZXJy
bm8gPT0gZXJybm8uRU5PRU5UIG9yIGUuZXJybm8gPT0gZXJybm8uRUFDQ0VTOgogICAgICAgICAg
ICAgICAgIF9jb21wYXJlX2F2YWlsYWJsZSA9IEZhbHNlCiAgICAgICAgICAgICBlbHNlOgotICAg
ICAgICAgICAgICAgIHJhaXNlIGUKKyAgICAgICAgICAgICAgICByYWlzZQogICAgICAgICBmaW5h
bGx5OgorICAgICAgICAgICAgcmVzdWx0ID0gc2VsZi5fZmlsZXN5c3RlbS5yZWFkX2JpbmFyeV9m
aWxlKGRpZmZfZmlsZW5hbWUpCiAgICAgICAgICAgICBzZWxmLl9maWxlc3lzdGVtLnJtdHJlZShz
dHIodGVtcGRpcikpCiAgICAgICAgIHJldHVybiByZXN1bHQKIApJbmRleDogVG9vbHMvU2NyaXB0
cy93ZWJraXRweS9sYXlvdXRfdGVzdHMvcG9ydC9wb3J0X3Rlc3RjYXNlLnB5Cj09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0K
LS0tIFRvb2xzL1NjcmlwdHMvd2Via2l0cHkvbGF5b3V0X3Rlc3RzL3BvcnQvcG9ydF90ZXN0Y2Fz
ZS5weQkocmV2aXNpb24gOTAwNzgpCisrKyBUb29scy9TY3JpcHRzL3dlYmtpdHB5L2xheW91dF90
ZXN0cy9wb3J0L3BvcnRfdGVzdGNhc2UucHkJKHdvcmtpbmcgY29weSkKQEAgLTIyOSwyNCArMjI5
LDI0IEBAIGNsYXNzIFBvcnRUZXN0Q2FzZSh1bml0dGVzdC5UZXN0Q2FzZSk6CiAgICAgICAgIHBv
cnQgPSBzZWxmLm1ha2VfcG9ydCgpCiAgICAgICAgIGlmIG5vdCBwb3J0OgogICAgICAgICAgICAg
cmV0dXJuCi0gICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UocG9ydC5kaWZmX2ltYWdlKE5vbmUsIE5v
bmUsIE5vbmUpKQotICAgICAgICBzZWxmLmFzc2VydEZhbHNlKHBvcnQuZGlmZl9pbWFnZShOb25l
LCAnJywgTm9uZSkpCi0gICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UocG9ydC5kaWZmX2ltYWdlKCcn
LCBOb25lLCBOb25lKSkKLSAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShwb3J0LmRpZmZfaW1hZ2Uo
JycsICcnLCBOb25lKSkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShwb3J0LmRpZmZfaW1hZ2Uo
Tm9uZSwgTm9uZSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UocG9ydC5kaWZmX2ltYWdlKE5v
bmUsICcnKSkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShwb3J0LmRpZmZfaW1hZ2UoJycsIE5v
bmUpKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKHBvcnQuZGlmZl9pbWFnZSgnJywgJycpKQog
CiAgICAgZGVmIHRlc3RfZGlmZl9pbWFnZV9fbWlzc2luZ19hY3R1YWwoc2VsZik6CiAgICAgICAg
IHBvcnQgPSBzZWxmLm1ha2VfcG9ydCgpCiAgICAgICAgIGlmIG5vdCBwb3J0OgogICAgICAgICAg
ICAgcmV0dXJuCi0gICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShwb3J0LmRpZmZfaW1hZ2UoTm9uZSwg
J2ZvbycsIE5vbmUpKQotICAgICAgICBzZWxmLmFzc2VydFRydWUocG9ydC5kaWZmX2ltYWdlKCcn
LCAnZm9vJywgTm9uZSkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShwb3J0LmRpZmZfaW1hZ2Uo
Tm9uZSwgJ2ZvbycpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUocG9ydC5kaWZmX2ltYWdlKCcn
LCAnZm9vJykpCiAKICAgICBkZWYgdGVzdF9kaWZmX2ltYWdlX19taXNzaW5nX2V4cGVjdGVkKHNl
bGYpOgogICAgICAgICBwb3J0ID0gc2VsZi5tYWtlX3BvcnQoKQogICAgICAgICBpZiBub3QgcG9y
dDoKICAgICAgICAgICAgIHJldHVybgotICAgICAgICBzZWxmLmFzc2VydFRydWUocG9ydC5kaWZm
X2ltYWdlKCdmb28nLCBOb25lLCBOb25lKSkKLSAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHBvcnQu
ZGlmZl9pbWFnZSgnZm9vJywgJycsIE5vbmUpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUocG9y
dC5kaWZmX2ltYWdlKCdmb28nLCBOb25lKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHBvcnQu
ZGlmZl9pbWFnZSgnZm9vJywgJycpKQogCiAgICAgZGVmIHRlc3RfY2hlY2tfYnVpbGQoc2VsZik6
CiAgICAgICAgIHBvcnQgPSBzZWxmLm1ha2VfcG9ydCgpCkluZGV4OiBUb29scy9TY3JpcHRzL3dl
YmtpdHB5L2xheW91dF90ZXN0cy9wb3J0L3Rlc3QucHkKPT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gVG9vbHMvU2Ny
aXB0cy93ZWJraXRweS9sYXlvdXRfdGVzdHMvcG9ydC90ZXN0LnB5CShyZXZpc2lvbiA5MDA3OCkK
KysrIFRvb2xzL1NjcmlwdHMvd2Via2l0cHkvbGF5b3V0X3Rlc3RzL3BvcnQvdGVzdC5weQkod29y
a2luZyBjb3B5KQpAQCAtMzEzLDEzICszMTMsMTEgQEAgY2xhc3MgVGVzdFBvcnQoYmFzZS5Qb3J0
KToKICAgICBkZWYgZGVmYXVsdF9jb25maWd1cmF0aW9uKHNlbGYpOgogICAgICAgICByZXR1cm4g
J1JlbGVhc2UnCiAKLSAgICBkZWYgZGlmZl9pbWFnZShzZWxmLCBleHBlY3RlZF9jb250ZW50cywg
YWN0dWFsX2NvbnRlbnRzLAotICAgICAgICAgICAgICAgICAgIGRpZmZfZmlsZW5hbWU9Tm9uZSk6
CisgICAgZGVmIGRpZmZfaW1hZ2Uoc2VsZiwgZXhwZWN0ZWRfY29udGVudHMsIGFjdHVhbF9jb250
ZW50cyk6CiAgICAgICAgIGRpZmZlZCA9IGFjdHVhbF9jb250ZW50cyAhPSBleHBlY3RlZF9jb250
ZW50cwotICAgICAgICBpZiBkaWZmZWQgYW5kIGRpZmZfZmlsZW5hbWU6Ci0gICAgICAgICAgICBz
ZWxmLl9maWxlc3lzdGVtLndyaXRlX2JpbmFyeV9maWxlKGRpZmZfZmlsZW5hbWUsCi0gICAgICAg
ICAgICAgICAgIjwgJXNcbi0tLVxuPiAlc1xuIiAlIChleHBlY3RlZF9jb250ZW50cywgYWN0dWFs
X2NvbnRlbnRzKSkKLSAgICAgICAgcmV0dXJuIGRpZmZlZAorICAgICAgICBpZiBkaWZmZWQ6Cisg
ICAgICAgICAgICByZXR1cm4gIjwgJXNcbi0tLVxuPiAlc1xuIiAlIChleHBlY3RlZF9jb250ZW50
cywgYWN0dWFsX2NvbnRlbnRzKQorICAgICAgICByZXR1cm4gTm9uZQogCiAgICAgZGVmIGxheW91
dF90ZXN0c19kaXIoc2VsZik6CiAgICAgICAgIHJldHVybiBMQVlPVVRfVEVTVF9ESVIKSW5kZXg6
IFRvb2xzL1NjcmlwdHMvd2Via2l0cHkvbGF5b3V0X3Rlc3RzL3BvcnQvd2Via2l0LnB5Cj09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT0KLS0tIFRvb2xzL1NjcmlwdHMvd2Via2l0cHkvbGF5b3V0X3Rlc3RzL3BvcnQvd2Via2l0
LnB5CShyZXZpc2lvbiA5MDA3OCkKKysrIFRvb2xzL1NjcmlwdHMvd2Via2l0cHkvbGF5b3V0X3Rl
c3RzL3BvcnQvd2Via2l0LnB5CSh3b3JraW5nIGNvcHkpCkBAIC0xMzIsMTEgKzEzMiw3IEBAIGNs
YXNzIFdlYktpdFBvcnQoYmFzZS5Qb3J0KToKICAgICAgICAgICAgIHJldHVybiBGYWxzZQogICAg
ICAgICByZXR1cm4gVHJ1ZQogCi0gICAgZGVmIGRpZmZfaW1hZ2Uoc2VsZiwgZXhwZWN0ZWRfY29u
dGVudHMsIGFjdHVhbF9jb250ZW50cywKLSAgICAgICAgICAgICAgICAgICBkaWZmX2ZpbGVuYW1l
PU5vbmUpOgotICAgICAgICAiIiJSZXR1cm4gVHJ1ZSBpZiB0aGUgdHdvIGZpbGVzIGFyZSBkaWZm
ZXJlbnQuIEFsc28gd3JpdGUgYSBkZWx0YQotICAgICAgICBpbWFnZSBvZiB0aGUgdHdvIGltYWdl
cyBpbnRvIHxkaWZmX2ZpbGVuYW1lfCBpZiBpdCBpcyBub3QgTm9uZS4iIiIKLQorICAgIGRlZiBk
aWZmX2ltYWdlKHNlbGYsIGV4cGVjdGVkX2NvbnRlbnRzLCBhY3R1YWxfY29udGVudHMpOgogICAg
ICAgICAjIEhhbmRsZSB0aGUgY2FzZSB3aGVyZSB0aGUgdGVzdCBkaWRuJ3QgYWN0dWFsbHkgZ2Vu
ZXJhdGUgYW4gaW1hZ2UuCiAgICAgICAgICMgRklYTUU6IG5lZWQgdW5pdCB0ZXN0cyBmb3IgdGhp
cy4KICAgICAgICAgaWYgbm90IGFjdHVhbF9jb250ZW50cyBhbmQgbm90IGV4cGVjdGVkX2NvbnRl
bnRzOgpAQCAtMTQ0LDEwICsxNDAsMTAgQEAgY2xhc3MgV2ViS2l0UG9ydChiYXNlLlBvcnQpOgog
ICAgICAgICBpZiBub3QgYWN0dWFsX2NvbnRlbnRzIG9yIG5vdCBleHBlY3RlZF9jb250ZW50czoK
ICAgICAgICAgICAgIHJldHVybiBUcnVlCiAKLSAgICAgICAgc3AgPSBzZWxmLl9kaWZmX2ltYWdl
X3JlcXVlc3QoZXhwZWN0ZWRfY29udGVudHMsIGFjdHVhbF9jb250ZW50cykKLSAgICAgICAgcmV0
dXJuIHNlbGYuX2RpZmZfaW1hZ2VfcmVwbHkoc3AsIGRpZmZfZmlsZW5hbWUpCisgICAgICAgIHBy
b2Nlc3MgPSBzZWxmLl9jcmVhdGVfaW1hZ2VfZGlmZl9wcm9jZXNzKGV4cGVjdGVkX2NvbnRlbnRz
LCBhY3R1YWxfY29udGVudHMpCisgICAgICAgIHJldHVybiBzZWxmLl9yZWFkX2ltYWdlX2RpZmYo
cHJvY2VzcykKIAotICAgIGRlZiBfZGlmZl9pbWFnZV9yZXF1ZXN0KHNlbGYsIGV4cGVjdGVkX2Nv
bnRlbnRzLCBhY3R1YWxfY29udGVudHMpOgorICAgIGRlZiBfY3JlYXRlX2ltYWdlX2RpZmZfcHJv
Y2VzcyhzZWxmLCBleHBlY3RlZF9jb250ZW50cywgYWN0dWFsX2NvbnRlbnRzKToKICAgICAgICAg
IyBGSVhNRTogVGhlcmUgbmVlZHMgdG8gYmUgYSBtb3JlIHNhbmUgd2F5IG9mIGhhbmRsaW5nIGRl
ZmF1bHQKICAgICAgICAgIyB2YWx1ZXMgZm9yIG9wdGlvbnMgc28gdGhhdCB5b3UgY2FuIGRpc3Rp
bmd1aXNoIGJldHdlZW4gYSBkZWZhdWx0CiAgICAgICAgICMgdmFsdWUgb2YgTm9uZSBhbmQgYSBk
ZWZhdWx0IHZhbHVlIHRoYXQgd2Fzbid0IHNldC4KQEAgLTE1NiwxNSArMTUyLDEzIEBAIGNsYXNz
IFdlYktpdFBvcnQoYmFzZS5Qb3J0KToKICAgICAgICAgZWxzZToKICAgICAgICAgICAgIHRvbGVy
YW5jZSA9IDAuMQogICAgICAgICBjb21tYW5kID0gW3NlbGYuX3BhdGhfdG9faW1hZ2VfZGlmZigp
LCAnLS10b2xlcmFuY2UnLCBzdHIodG9sZXJhbmNlKV0KLSAgICAgICAgc3AgPSBzZXJ2ZXJfcHJv
Y2Vzcy5TZXJ2ZXJQcm9jZXNzKHNlbGYsICdJbWFnZURpZmYnLCBjb21tYW5kKQotCi0gICAgICAg
IHNwLndyaXRlKCdDb250ZW50LUxlbmd0aDogJWRcbiVzQ29udGVudC1MZW5ndGg6ICVkXG4lcycg
JQotICAgICAgICAgICAgICAgICAobGVuKGFjdHVhbF9jb250ZW50cyksIGFjdHVhbF9jb250ZW50
cywKLSAgICAgICAgICAgICAgICAgIGxlbihleHBlY3RlZF9jb250ZW50cyksIGV4cGVjdGVkX2Nv
bnRlbnRzKSkKKyAgICAgICAgcHJvY2VzcyA9IHNlcnZlcl9wcm9jZXNzLlNlcnZlclByb2Nlc3Mo
c2VsZiwgJ0ltYWdlRGlmZicsIGNvbW1hbmQpCiAKLSAgICAgICAgcmV0dXJuIHNwCisgICAgICAg
IHByb2Nlc3Mud3JpdGUoJ0NvbnRlbnQtTGVuZ3RoOiAlZFxuJXNDb250ZW50LUxlbmd0aDogJWRc
biVzJyAlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChsZW4oYWN0dWFsX2NvbnRlbnRz
KSwgYWN0dWFsX2NvbnRlbnRzLCBsZW4oZXhwZWN0ZWRfY29udGVudHMpLCBleHBlY3RlZF9jb250
ZW50cykpCisgICAgICAgIHJldHVybiBwcm9jZXNzCiAKLSAgICBkZWYgX2RpZmZfaW1hZ2VfcmVw
bHkoc2VsZiwgc3AsIGRpZmZfZmlsZW5hbWUpOgorICAgIGRlZiBfcmVhZF9pbWFnZV9kaWZmKHNl
bGYsIHNwLCBkaWZmX2ZpbGVuYW1lKToKICAgICAgICAgdGltZW91dCA9IDIuMAogICAgICAgICBk
ZWFkbGluZSA9IHRpbWUudGltZSgpICsgdGltZW91dAogICAgICAgICBvdXRwdXQgPSBzcC5yZWFk
X2xpbmUodGltZW91dCkKQEAgLTE4MSwxOSArMTc1LDE2IEBAIGNsYXNzIFdlYktpdFBvcnQoYmFz
ZS5Qb3J0KToKICAgICAgICAgICAgICAgICB0aW1lb3V0ID0gZGVhZGxpbmUgLSB0aW1lLnRpbWUo
KQogICAgICAgICAgICAgICAgIG91dHB1dCA9IHNwLnJlYWRfbGluZShkZWFkbGluZSkKIAotICAg
ICAgICByZXN1bHQgPSBUcnVlCi0gICAgICAgIGlmIG91dHB1dC5zdGFydHN3aXRoKCdkaWZmJyk6
Ci0gICAgICAgICAgICBtID0gcmUubWF0Y2goJ2RpZmY6ICguKyklIChwYXNzZWR8ZmFpbGVkKScs
IG91dHB1dCkKLSAgICAgICAgICAgIGlmIG0uZ3JvdXAoMikgPT0gJ3Bhc3NlZCc6Ci0gICAgICAg
ICAgICAgICAgcmVzdWx0ID0gRmFsc2UKLSAgICAgICAgZWxpZiBvdXRwdXQgYW5kIGRpZmZfZmls
ZW5hbWU6Ci0gICAgICAgICAgICBzZWxmLl9maWxlc3lzdGVtLndyaXRlX2JpbmFyeV9maWxlKGRp
ZmZfZmlsZW5hbWUsIG91dHB1dCkKLSAgICAgICAgZWxpZiBzcC50aW1lZF9vdXQ6CisgICAgICAg
IGlmIHNwLnRpbWVkX291dDoKICAgICAgICAgICAgIF9sb2cuZXJyb3IoIkltYWdlRGlmZiB0aW1l
ZCBvdXQiKQotICAgICAgICBlbGlmIHNwLmNyYXNoZWQ6CisgICAgICAgIGlmIHNwLmNyYXNoZWQ6
CiAgICAgICAgICAgICBfbG9nLmVycm9yKCJJbWFnZURpZmYgY3Jhc2hlZCIpCiAgICAgICAgIHNw
LnN0b3AoKQotICAgICAgICByZXR1cm4gcmVzdWx0CisgICAgICAgIGlmIG91dHB1dC5zdGFydHN3
aXRoKCdkaWZmJyk6CisgICAgICAgICAgICBtID0gcmUubWF0Y2goJ2RpZmY6ICguKyklIChwYXNz
ZWR8ZmFpbGVkKScsIG91dHB1dCkKKyAgICAgICAgICAgIGlmIG0uZ3JvdXAoMikgPT0gJ3Bhc3Nl
ZCc6CisgICAgICAgICAgICAgICAgcmV0dXJuIE5vbmUKKyAgICAgICAgcmV0dXJuIG91dHB1dAog
CiAgICAgZGVmIGRlZmF1bHRfcmVzdWx0c19kaXJlY3Rvcnkoc2VsZik6CiAgICAgICAgICMgUmVz
dWx0cyBhcmUgc3RvcmUgcmVsYXRpdmUgdG8gdGhlIGJ1aWx0IHByb2R1Y3RzIHRvIG1ha2UgaXQg
ZWFzeQpJbmRleDogVG9vbHMvU2NyaXB0cy93ZWJraXRweS90b19iZV9tb3ZlZC9yZWJhc2VsaW5l
X2Nocm9taXVtX3dlYmtpdF90ZXN0cy5weQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBUb29scy9TY3JpcHRzL3dl
YmtpdHB5L3RvX2JlX21vdmVkL3JlYmFzZWxpbmVfY2hyb21pdW1fd2Via2l0X3Rlc3RzLnB5CShy
ZXZpc2lvbiA5MDA3OCkKKysrIFRvb2xzL1NjcmlwdHMvd2Via2l0cHkvdG9fYmVfbW92ZWQvcmVi
YXNlbGluZV9jaHJvbWl1bV93ZWJraXRfdGVzdHMucHkJKHdvcmtpbmcgY29weSkKQEAgLTUxNyw3
ICs1MTcsNyBAQCBjbGFzcyBSZWJhc2VsaW5lcihvYmplY3QpOgogICAgICAgICAiIiIKIAogICAg
ICAgICBpZiBpc19pbWFnZToKLSAgICAgICAgICAgIHJldHVybiBzZWxmLl9wb3J0LmRpZmZfaW1h
Z2Uob3V0cHV0MSwgb3V0cHV0MiwgTm9uZSkKKyAgICAgICAgICAgIHJldHVybiBzZWxmLl9wb3J0
LmRpZmZfaW1hZ2Uob3V0cHV0MSwgb3V0cHV0MikKIAogICAgICAgICByZXR1cm4gc2VsZi5fcG9y
dC5jb21wYXJlX3RleHQob3V0cHV0MSwgb3V0cHV0MikKIApAQCAtNjAyLDcgKzYwMiw4IEBAIGNs
YXNzIFJlYmFzZWxpbmVyKG9iamVjdCk6CiAgICAgICAgICAgICBfbG9nLmRlYnVnKCcgSHRtbDog
ZGlmZmluZyAiJXMiIGFuZCAiJXMiJywgb2xkX2ZpbGUsIG5ld19maWxlKQogICAgICAgICAgICAg
b2xkX291dHB1dCA9IHNlbGYuX2ZpbGVzeXN0ZW0ucmVhZF9iaW5hcnlfZmlsZShvbGRfZmlsZSkK
ICAgICAgICAgICAgIG5ld19vdXRwdXQgPSBzZWxmLl9maWxlc3lzdGVtLnJlYWRfYmluYXJ5X2Zp
bGUobmV3X2ZpbGUpCi0gICAgICAgICAgICBoYXNfZGlmZiA9IHNlbGYuX3BvcnQuZGlmZl9pbWFn
ZShvbGRfb3V0cHV0LCBuZXdfb3V0cHV0LCBkaWZmX2ZpbGUpCisgICAgICAgICAgICBpbWFnZV9k
aWZmID0gc2VsZi5fcG9ydC5kaWZmX2ltYWdlKG9sZF9vdXRwdXQsIG5ld19vdXRwdXQpCisgICAg
ICAgICAgICBzZWxmLl9maWxlc3lzdGVtLndyaXRlX2JpbmFyeV9maWxlKGRpZmZfZmlsZSwgaW1h
Z2VfZGlmZikKIAogICAgICAgICBpZiBoYXNfZGlmZjoKICAgICAgICAgICAgIF9sb2cuZGVidWco
JyAgSHRtbDogY3JlYXRlZCBiYXNlbGluZSBkaWZmIGZpbGU6ICIlcyIuJywgZGlmZl9maWxlKQpJ
bmRleDogTGF5b3V0VGVzdHMvc3ZnL2N1c3RvbS9wYXR0ZXJuLXJvdGF0ZS5zdmcKPT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PQotLS0gTGF5b3V0VGVzdHMvc3ZnL2N1c3RvbS9wYXR0ZXJuLXJvdGF0ZS5zdmcJKHJldmlzaW9u
IDkwMDc4KQorKysgTGF5b3V0VGVzdHMvc3ZnL2N1c3RvbS9wYXR0ZXJuLXJvdGF0ZS5zdmcJKHdv
cmtpbmcgY29weSkKQEAgLTksNyArOSw3IEBACiAgICAgICAgICAgICBwYXR0ZXJuQ29udGVudFVu
aXRzPSJvYmplY3RCb3VuZGluZ0JveCIKICAgICAgICAgICAgID4KICAgICAgICAgICAgIDxjaXJj
bGUgY3g9IjAuMjUiIGN5PSIwLjI1IiByPSIwLjE1IiBzdHlsZT0iZmlsbDogcmVkOyIvPgotICAg
ICAgICAgICAgPGNpcmNsZSBjeD0iMC43NSIgY3k9IjAuMjUiIHI9IjAuMTUiIHN0eWxlPSJmaWxs
OiBncmVlbjsiLz4KKyAgICAgICAgICAgIDxjaXJjbGUgY3g9IjAuNzUiIGN5PSIwLjI1IiByPSIw
LjE1IiBzdHlsZT0iZmlsbDogeWVsbG93OyIvPgogICAgICAgICAgICAgPGNpcmNsZSBjeD0iMC4y
NSIgY3k9IjAuNzUiIHI9IjAuMTUiIHN0eWxlPSJmaWxsOiBibHVlOyIvPgogICAgICAgICAgICAg
PGNpcmNsZSBjeD0iMC43NSIgY3k9IjAuNzUiIHI9IjAuMTUiIHN0eWxlPSJmaWxsOiBwdXJwbGU7
Ii8+CiAgICAgICAgICAgICA8Y2lyY2xlIGN4PSIwLjUiIGN5PSIwLjUiIHI9IjAuMDUiIHN0eWxl
PSJmaWxsOiBvcmFuZ2U7Ii8+Cg==
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>99236</attachid>
            <date>2011-06-29 22:15:04 -0700</date>
            <delta_ts>2011-06-29 22:34:25 -0700</delta_ts>
            <desc>Work in progress (might actually work)</desc>
            <filename>bug-63494-20110629221503.patch</filename>
            <type>text/plain</type>
            <size>23715</size>
            <attacher name="Adam Barth">abarth</attacher>
            
              <data encoding="base64">SW5kZXg6IFRvb2xzL1NjcmlwdHMvd2Via2l0cHkvY29tbW9uL3N5c3RlbS9leGVjdXRpdmVfbW9j
ay5weQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09Ci0tLSBUb29scy9TY3JpcHRzL3dlYmtpdHB5L2NvbW1vbi9zeXN0ZW0v
ZXhlY3V0aXZlX21vY2sucHkJKHJldmlzaW9uIDkwMDg2KQorKysgVG9vbHMvU2NyaXB0cy93ZWJr
aXRweS9jb21tb24vc3lzdGVtL2V4ZWN1dGl2ZV9tb2NrLnB5CSh3b3JraW5nIGNvcHkpCkBAIC02
MSwxMCArNjEsMTAgQEAgY2xhc3MgTW9ja0V4ZWN1dGl2ZTIob2JqZWN0KToKICAgICAgICAgICAg
ICAgICAgICAgZGVjb2RlX291dHB1dD1GYWxzZSk6CiAgICAgICAgIGlmIHNlbGYuX2V4Y2VwdGlv
bjoKICAgICAgICAgICAgIHJhaXNlIHNlbGYuX2V4Y2VwdGlvbgotICAgICAgICBpZiByZXR1cm5f
ZXhpdF9jb2RlOgotICAgICAgICAgICAgcmV0dXJuIHNlbGYuX2V4aXRfY29kZQogICAgICAgICBp
ZiBzZWxmLl9ydW5fY29tbWFuZF9mbjoKICAgICAgICAgICAgIHJldHVybiBzZWxmLl9ydW5fY29t
bWFuZF9mbihhcmdzKQorICAgICAgICBpZiByZXR1cm5fZXhpdF9jb2RlOgorICAgICAgICAgICAg
cmV0dXJuIHNlbGYuX2V4aXRfY29kZQogICAgICAgICBpZiBzZWxmLl9leGl0X2NvZGUgYW5kIGVy
cm9yX2hhbmRsZXI6CiAgICAgICAgICAgICBzY3JpcHRfZXJyb3IgPSBleGVjdXRpdmUuU2NyaXB0
RXJyb3Ioc2NyaXB0X2FyZ3M9YXJncywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICBleGl0X2NvZGU9c2VsZi5fZXhpdF9jb2RlLApJbmRleDogVG9vbHMv
U2NyaXB0cy93ZWJraXRweS9sYXlvdXRfdGVzdHMvcnVuX3dlYmtpdF90ZXN0c19pbnRlZ3JhdGlv
bnRlc3QucHkKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PQotLS0gVG9vbHMvU2NyaXB0cy93ZWJraXRweS9sYXlvdXRfdGVz
dHMvcnVuX3dlYmtpdF90ZXN0c19pbnRlZ3JhdGlvbnRlc3QucHkJKHJldmlzaW9uIDkwMDg2KQor
KysgVG9vbHMvU2NyaXB0cy93ZWJraXRweS9sYXlvdXRfdGVzdHMvcnVuX3dlYmtpdF90ZXN0c19p
bnRlZ3JhdGlvbnRlc3QucHkJKHdvcmtpbmcgY29weSkKQEAgLTI2NCw5ICsyNjQsOCBAQCBjbGFz
cyBNYWluVGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6CiAgICAgICAgICMgV2UgZG8gYSBsb2dnaW5n
IHJ1biBoZXJlIGluc3RlYWQgb2YgYSBwYXNzaW5nIHJ1biBpbiBvcmRlciB0bwogICAgICAgICAj
IHN1cHByZXNzIHRoZSBvdXRwdXQgZnJvbSB0aGUganNvbiBnZW5lcmF0b3IuCiAgICAgICAgIHJl
cywgYnVpbGRib3Rfb3V0cHV0LCByZWd1bGFyX291dHB1dCwgdXNlciA9IGxvZ2dpbmdfcnVuKFsn
LS1jbG9iYmVyLW9sZC1yZXN1bHRzJ10sIHJlY29yZF9yZXN1bHRzPVRydWUsIGZpbGVzeXN0ZW09
ZnMpCi0gICAgICAgIHJlcywgYnVpbGRib3Rfb3V0cHV0LCByZWd1bGFyX291dHB1dCwgdXNlciA9
IGxvZ2dpbmdfcnVuKAotICAgICAgICAgICAgWyctLXByaW50LWxhc3QtZmFpbHVyZXMnXSwgZmls
ZXN5c3RlbT1mcykKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZWd1bGFyX291dHB1dC5nZXQo
KSwgWydcblxuJ10pCisgICAgICAgIHJlcywgYnVpbGRib3Rfb3V0cHV0LCByZWd1bGFyX291dHB1
dCwgdXNlciA9IGxvZ2dpbmdfcnVuKFsnLS1wcmludC1sYXN0LWZhaWx1cmVzJ10sIGZpbGVzeXN0
ZW09ZnMpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVndWxhcl9vdXRwdXQuZ2V0KCksIFt1
J2ZhaWx1cmVzL2V4cGVjdGVkL2NoZWNrc3VtLmh0bWxcblxuJ10pCiAgICAgICAgIHNlbGYuYXNz
ZXJ0RXF1YWwoYnVpbGRib3Rfb3V0cHV0LmdldCgpLCBbXSkKIAogICAgIGRlZiB0ZXN0X2xpbnRf
dGVzdF9maWxlcyhzZWxmKToKQEAgLTU1OSw4ICs1NTgsNyBAQCBjbGFzcyBNYWluVGVzdCh1bml0
dGVzdC5UZXN0Q2FzZSk6CiAKICAgICBkZWYgdGVzdF90b2xlcmFuY2Uoc2VsZik6CiAgICAgICAg
IGNsYXNzIEltYWdlRGlmZlRlc3RQb3J0KFRlc3RQb3J0KToKLSAgICAgICAgICAgIGRlZiBkaWZm
X2ltYWdlKHNlbGYsIGV4cGVjdGVkX2NvbnRlbnRzLCBhY3R1YWxfY29udGVudHMsCi0gICAgICAg
ICAgICAgICAgICAgZGlmZl9maWxlbmFtZT1Ob25lKToKKyAgICAgICAgICAgIGRlZiBkaWZmX2lt
YWdlKHNlbGYsIGV4cGVjdGVkX2NvbnRlbnRzLCBhY3R1YWxfY29udGVudHMpOgogICAgICAgICAg
ICAgICAgIHNlbGYudG9sZXJhbmNlX3VzZWRfZm9yX2RpZmZfaW1hZ2UgPSBzZWxmLl9vcHRpb25z
LnRvbGVyYW5jZQogICAgICAgICAgICAgICAgIHJldHVybiBUcnVlCiAKSW5kZXg6IFRvb2xzL1Nj
cmlwdHMvd2Via2l0cHkvbGF5b3V0X3Rlc3RzL2xheW91dF9wYWNrYWdlL3NpbmdsZV90ZXN0X3J1
bm5lci5weQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09Ci0tLSBUb29scy9TY3JpcHRzL3dlYmtpdHB5L2xheW91dF90ZXN0
cy9sYXlvdXRfcGFja2FnZS9zaW5nbGVfdGVzdF9ydW5uZXIucHkJKHJldmlzaW9uIDkwMDg2KQor
KysgVG9vbHMvU2NyaXB0cy93ZWJraXRweS9sYXlvdXRfdGVzdHMvbGF5b3V0X3BhY2thZ2Uvc2lu
Z2xlX3Rlc3RfcnVubmVyLnB5CSh3b3JraW5nIGNvcHkpCkBAIC0yNjYsMTcgKzI2NiwxOSBAQCBj
bGFzcyBTaW5nbGVUZXN0UnVubmVyOgogICAgICAgICAjIHRoZSBub3JtYWxpemVkIHRleHQgZXhw
ZWN0YXRpb24gZmlsZXMuCiAgICAgICAgIHJldHVybiBvdXRwdXQucmVwbGFjZSgiXHJcclxuIiwg
IlxyXG4iKS5yZXBsYWNlKCJcclxuIiwgIlxuIikKIAotICAgIGRlZiBfY29tcGFyZV9pbWFnZShz
ZWxmLCBkcml2ZXJfb3V0cHV0LCBleHBlY3RlZF9kcml2ZXJfb3V0cHV0cyk6CisgICAgZGVmIF9j
b21wYXJlX2ltYWdlKHNlbGYsIGRyaXZlcl9vdXRwdXQsIGV4cGVjdGVkX2RyaXZlcl9vdXRwdXQp
OgogICAgICAgICBmYWlsdXJlcyA9IFtdCiAgICAgICAgICMgSWYgd2UgZGlkbid0IHByb2R1Y2Ug
YSBoYXNoIGZpbGUsIHRoaXMgdGVzdCBtdXN0IGJlIHRleHQtb25seS4KICAgICAgICAgaWYgZHJp
dmVyX291dHB1dC5pbWFnZV9oYXNoIGlzIE5vbmU6CiAgICAgICAgICAgICByZXR1cm4gZmFpbHVy
ZXMKLSAgICAgICAgaWYgbm90IGV4cGVjdGVkX2RyaXZlcl9vdXRwdXRzLmltYWdlOgorICAgICAg
ICBpZiBub3QgZXhwZWN0ZWRfZHJpdmVyX291dHB1dC5pbWFnZToKICAgICAgICAgICAgIGZhaWx1
cmVzLmFwcGVuZCh0ZXN0X2ZhaWx1cmVzLkZhaWx1cmVNaXNzaW5nSW1hZ2UoKSkKLSAgICAgICAg
ZWxpZiBub3QgZXhwZWN0ZWRfZHJpdmVyX291dHB1dHMuaW1hZ2VfaGFzaDoKKyAgICAgICAgZWxp
ZiBub3QgZXhwZWN0ZWRfZHJpdmVyX291dHB1dC5pbWFnZV9oYXNoOgogICAgICAgICAgICAgZmFp
bHVyZXMuYXBwZW5kKHRlc3RfZmFpbHVyZXMuRmFpbHVyZU1pc3NpbmdJbWFnZUhhc2goKSkKLSAg
ICAgICAgZWxpZiBkcml2ZXJfb3V0cHV0LmltYWdlX2hhc2ggIT0gZXhwZWN0ZWRfZHJpdmVyX291
dHB1dHMuaW1hZ2VfaGFzaDoKLSAgICAgICAgICAgIGZhaWx1cmVzLmFwcGVuZCh0ZXN0X2ZhaWx1
cmVzLkZhaWx1cmVJbWFnZUhhc2hNaXNtYXRjaCgpKQorICAgICAgICBlbGlmIGRyaXZlcl9vdXRw
dXQuaW1hZ2VfaGFzaCAhPSBleHBlY3RlZF9kcml2ZXJfb3V0cHV0LmltYWdlX2hhc2g6CisgICAg
ICAgICAgICBkcml2ZXJfb3V0cHV0LmltYWdlX2RpZmYgPSBzZWxmLl9wb3J0LmRpZmZfaW1hZ2Uo
ZHJpdmVyX291dHB1dC5pbWFnZSwgZXhwZWN0ZWRfZHJpdmVyX291dHB1dC5pbWFnZSkKKyAgICAg
ICAgICAgIGlmIGRyaXZlcl9vdXRwdXQuaW1hZ2VfZGlmZjoKKyAgICAgICAgICAgICAgICBmYWls
dXJlcy5hcHBlbmQodGVzdF9mYWlsdXJlcy5GYWlsdXJlSW1hZ2VIYXNoTWlzbWF0Y2goKSkKICAg
ICAgICAgcmV0dXJuIGZhaWx1cmVzCiAKICAgICBkZWYgX3J1bl9yZWZ0ZXN0KHNlbGYpOgpJbmRl
eDogVG9vbHMvU2NyaXB0cy93ZWJraXRweS9sYXlvdXRfdGVzdHMvbGF5b3V0X3BhY2thZ2UvdGVz
dF9yZXN1bHRfd3JpdGVyLnB5Cj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFRvb2xzL1NjcmlwdHMvd2Via2l0cHkv
bGF5b3V0X3Rlc3RzL2xheW91dF9wYWNrYWdlL3Rlc3RfcmVzdWx0X3dyaXRlci5weQkocmV2aXNp
b24gOTAwODYpCisrKyBUb29scy9TY3JpcHRzL3dlYmtpdHB5L2xheW91dF90ZXN0cy9sYXlvdXRf
cGFja2FnZS90ZXN0X3Jlc3VsdF93cml0ZXIucHkJKHdvcmtpbmcgY29weSkKQEAgLTQxLDggKzQx
LDYgQEAgZGVmIHdyaXRlX3Rlc3RfcmVzdWx0KHBvcnQsIGZpbGVuYW1lLCBkcgogICAgICAgICAg
ICAgICAgICAgICAgIGV4cGVjdGVkX2RyaXZlcl9vdXRwdXQsIGZhaWx1cmVzKToKICAgICAiIiJX
cml0ZSB0aGUgdGVzdCByZXN1bHQgdG8gdGhlIHJlc3VsdCBvdXRwdXQgZGlyZWN0b3J5LiIiIgog
ICAgIHJvb3Rfb3V0cHV0X2RpciA9IHBvcnQucmVzdWx0c19kaXJlY3RvcnkoKQotICAgIGNoZWNr
c3Vtc19taXNtYXRjaF9idXRfaW1hZ2VzX2FyZV9zYW1lID0gRmFsc2UKLSAgICBpbWFnZWhhc2hf
bWlzbWF0Y2hfZmFpbHVyZSA9IE5vbmUKICAgICB3cml0ZXIgPSBUZXN0UmVzdWx0V3JpdGVyKHBv
cnQsIHJvb3Rfb3V0cHV0X2RpciwgZmlsZW5hbWUpCiAgICAgaWYgZHJpdmVyX291dHB1dC5lcnJv
cjoKICAgICAgICAgd3JpdGVyLndyaXRlX3N0ZGVycihkcml2ZXJfb3V0cHV0LmVycm9yKQpAQCAt
NjAsMTEgKzU4LDcgQEAgZGVmIHdyaXRlX3Rlc3RfcmVzdWx0KHBvcnQsIGZpbGVuYW1lLCBkcgog
ICAgICAgICAgICAgd3JpdGVyLndyaXRlX2ltYWdlX2ZpbGVzKGRyaXZlcl9vdXRwdXQuaW1hZ2Us
IGV4cGVjdGVkX2RyaXZlcl9vdXRwdXQuaW1hZ2UpCiAgICAgICAgIGVsaWYgaXNpbnN0YW5jZShm
YWlsdXJlLCB0ZXN0X2ZhaWx1cmVzLkZhaWx1cmVJbWFnZUhhc2hNaXNtYXRjaCk6CiAgICAgICAg
ICAgICB3cml0ZXIud3JpdGVfaW1hZ2VfZmlsZXMoZHJpdmVyX291dHB1dC5pbWFnZSwgZXhwZWN0
ZWRfZHJpdmVyX291dHB1dC5pbWFnZSkKLSAgICAgICAgICAgIGltYWdlc19hcmVfZGlmZmVyZW50
ID0gd3JpdGVyLmNyZWF0ZV9pbWFnZV9kaWZmX2FuZF93cml0ZV9yZXN1bHQoCi0gICAgICAgICAg
ICAgICAgZHJpdmVyX291dHB1dC5pbWFnZSwgZXhwZWN0ZWRfZHJpdmVyX291dHB1dC5pbWFnZSkK
LSAgICAgICAgICAgIGlmIG5vdCBpbWFnZXNfYXJlX2RpZmZlcmVudDoKLSAgICAgICAgICAgICAg
ICBjaGVja3N1bXNfbWlzbWF0Y2hfYnV0X2ltYWdlc19hcmVfc2FtZSA9IFRydWUKLSAgICAgICAg
ICAgICAgICBpbWFnZWhhc2hfbWlzbWF0Y2hfZmFpbHVyZSA9IGZhaWx1cmUKKyAgICAgICAgICAg
IHdyaXRlci53cml0ZV9pbWFnZV9kaWZmX2ZpbGVzKGRyaXZlcl9vdXRwdXQuaW1hZ2VfZGlmZikK
ICAgICAgICAgZWxpZiBpc2luc3RhbmNlKGZhaWx1cmUsICh0ZXN0X2ZhaWx1cmVzLkZhaWx1cmVB
dWRpb01pc21hdGNoLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlc3RfZmFp
bHVyZXMuRmFpbHVyZU1pc3NpbmdBdWRpbykpOgogICAgICAgICAgICAgd3JpdGVyLndyaXRlX2F1
ZGlvX2ZpbGVzKGRyaXZlcl9vdXRwdXQuYXVkaW8sIGV4cGVjdGVkX2RyaXZlcl9vdXRwdXQuYXVk
aW8pCkBAIC03NSw3ICs2OSwxMCBAQCBkZWYgd3JpdGVfdGVzdF9yZXN1bHQocG9ydCwgZmlsZW5h
bWUsIGRyCiAgICAgICAgICAgICAgICAgd3JpdGVyLndyaXRlX2NyYXNoX3JlcG9ydChkcml2ZXJf
b3V0cHV0LmVycm9yKQogICAgICAgICBlbGlmIGlzaW5zdGFuY2UoZmFpbHVyZSwgdGVzdF9mYWls
dXJlcy5GYWlsdXJlUmVmdGVzdE1pc21hdGNoKToKICAgICAgICAgICAgIHdyaXRlci53cml0ZV9p
bWFnZV9maWxlcyhkcml2ZXJfb3V0cHV0LmltYWdlLCBleHBlY3RlZF9kcml2ZXJfb3V0cHV0Lmlt
YWdlKQotICAgICAgICAgICAgd3JpdGVyLmNyZWF0ZV9pbWFnZV9kaWZmX2FuZF93cml0ZV9yZXN1
bHQoZHJpdmVyX291dHB1dC5pbWFnZSwgZXhwZWN0ZWRfZHJpdmVyX291dHB1dC5pbWFnZSkKKyAg
ICAgICAgICAgICMgRklYTUU6IFRoaXMgd29yayBzaG91bGQgYmUgZG9uZSBlYXJsaWVyIGluIHRo
ZSBwaXBlbGluZS4KKyAgICAgICAgICAgIGltYWdlX2RpZmYgPSBwb3J0LmRpZmZfaW1hZ2UoZHJp
dmVyX291dHB1dC5pbWFnZSwgZXhwZWN0ZWRfZHJpdmVyX291dHB1dC5pbWFnZSkKKyAgICAgICAg
ICAgIGlmIGltYWdlX2RpZmY6CisgICAgICAgICAgICAgICAgd3JpdGVyLndyaXRlX2ltYWdlX2Rp
ZmZfZmlsZXMoaW1hZ2VfZGlmZikKICAgICAgICAgICAgIHdyaXRlci5jb3B5X2ZpbGUocG9ydC5y
ZWZ0ZXN0X2V4cGVjdGVkX2ZpbGVuYW1lKGZpbGVuYW1lKSwgJy1leHBlY3RlZC5odG1sJykKICAg
ICAgICAgZWxpZiBpc2luc3RhbmNlKGZhaWx1cmUsIHRlc3RfZmFpbHVyZXMuRmFpbHVyZVJlZnRl
c3RNaXNtYXRjaERpZE5vdE9jY3VyKToKICAgICAgICAgICAgIHdyaXRlci53cml0ZV9pbWFnZV9m
aWxlcyhkcml2ZXJfb3V0cHV0LmltYWdlLCBleHBlY3RlZF9pbWFnZT1Ob25lKQpAQCAtODMsMTUg
KzgwLDYgQEAgZGVmIHdyaXRlX3Rlc3RfcmVzdWx0KHBvcnQsIGZpbGVuYW1lLCBkcgogICAgICAg
ICBlbHNlOgogICAgICAgICAgICAgYXNzZXJ0IGlzaW5zdGFuY2UoZmFpbHVyZSwgKHRlc3RfZmFp
bHVyZXMuRmFpbHVyZVRpbWVvdXQsKSkKIAotICAgICMgRklYTUU6IFRoaXMgaXMgYW4gdWdseSBo
YWNrIHRvIGhhbmRsZSBGYWlsdXJlSW1hZ2VIYXNoSW5jb3JyZWN0IGNhc2UuCi0gICAgIyBJZGVh
bGx5LCBGYWlsdXJlSW1hZ2VIYXNoSW5jb3JyZWN0IGNhc2Ugc2hvdWxkIGJlIGRldGVjdGVkIGJl
Zm9yZSB0aGlzCi0gICAgIyBmdW5jdGlvbiBpcyBjYWxsZWQuIEJ1dCBpdCByZXF1aXJlcyBjYWxs
aW5nIGNyZWF0ZV9kaWZmX2ltYWdlKCkgdG8gZGV0ZWN0Ci0gICAgIyB3aGV0aGVyIHR3byBpbWFn
ZXMgYXJlIHNhbWUgb3Igbm90LiBTbyB3ZSBuZWVkIHRoaXMgaGFjayB1bnRpbCB3ZSBoYXZlIGEg
YmV0dGVyIGFwcHJvYWNoLgotICAgIGlmIGNoZWNrc3Vtc19taXNtYXRjaF9idXRfaW1hZ2VzX2Fy
ZV9zYW1lOgotICAgICAgICAjIFJlcGxhY2UgRmFpbHVyZUltYWdlSGFzaE1pc21hdGNoIHdpdGgg
RmFpbHVyZUltYWdlSGFzaEluY29ycmVjdC4KLSAgICAgICAgZmFpbHVyZXMucmVtb3ZlKGltYWdl
aGFzaF9taXNtYXRjaF9mYWlsdXJlKQotICAgICAgICBmYWlsdXJlcy5hcHBlbmQodGVzdF9mYWls
dXJlcy5GYWlsdXJlSW1hZ2VIYXNoSW5jb3JyZWN0KCkpCi0KIAogY2xhc3MgVGVzdFJlc3VsdFdy
aXRlcihvYmplY3QpOgogICAgICIiIkEgY2xhc3Mgd2hpY2ggaGFuZGxlcyBhbGwgd3JpdGluZyBv
cGVyYXRpb25zIHRvIHRoZSByZXN1bHQgZGlyZWN0b3J5LiIiIgpAQCAtMjE1LDE5ICsyMDMsMTAg
QEAgY2xhc3MgVGVzdFJlc3VsdFdyaXRlcihvYmplY3QpOgogICAgIGRlZiB3cml0ZV9pbWFnZV9m
aWxlcyhzZWxmLCBhY3R1YWxfaW1hZ2UsIGV4cGVjdGVkX2ltYWdlKToKICAgICAgICAgc2VsZi53
cml0ZV9vdXRwdXRfZmlsZXMoJy5wbmcnLCBhY3R1YWxfaW1hZ2UsIGV4cGVjdGVkX2ltYWdlKQog
Ci0gICAgZGVmIGNyZWF0ZV9pbWFnZV9kaWZmX2FuZF93cml0ZV9yZXN1bHQoc2VsZiwgYWN0dWFs
X2ltYWdlLCBleHBlY3RlZF9pbWFnZSk6Ci0gICAgICAgICIiIldyaXRlcyB0aGUgdmlzdWFsIGRp
ZmYgb2YgdGhlIGV4cGVjdGVkL2FjdHVhbCBQTkdzLgotCi0gICAgICAgIFJldHVybnMgVHJ1ZSBp
ZiB0aGUgaW1hZ2VzIGFyZSBkaWZmZXJlbnQuCi0gICAgICAgICIiIgotICAgICAgICAjIEZJWE1F
OiBUaGlzIGZ1bmN0aW9uIGlzIGFjdHVhbGx5IGRvaW5nIHRoZSBkaWZmIGFzIHdlbGwgYXMgd3Jp
dGluZyBhIHJlc3VsdC4KLSAgICAgICAgIyBJdCBtaWdodCBiZSBiZXR0ZXIgdG8gZXh0cmFjdCAn
ZGlmZicgY29kZSBhbmQgbWFrZSBpdCBhIHNlcGFyYXRlIGZ1bmN0aW9uLgotICAgICAgICAjIFRv
IGRvIHNvLCB3ZSBoYXZlIHRvIGNoYW5nZSBwb3J0LmRpZmZfaW1hZ2UoKSBhcyB3ZWxsLgorICAg
IGRlZiB3cml0ZV9pbWFnZV9kaWZmX2ZpbGVzKHNlbGYsIGltYWdlX2RpZmYpOgogICAgICAgICBk
aWZmX2ZpbGVuYW1lID0gc2VsZi5vdXRwdXRfZmlsZW5hbWUoc2VsZi5GSUxFTkFNRV9TVUZGSVhf
SU1BR0VfRElGRikKLSAgICAgICAgaW1hZ2VzX2FyZV9kaWZmZXJlbnQgPSBzZWxmLl9wb3J0LmRp
ZmZfaW1hZ2UoYWN0dWFsX2ltYWdlLCBleHBlY3RlZF9pbWFnZSwgZGlmZl9maWxlbmFtZSkKLQot
ICAgICAgICBpZiBub3QgaW1hZ2VzX2FyZV9kaWZmZXJlbnQ6Ci0gICAgICAgICAgICByZXR1cm4g
RmFsc2UKKyAgICAgICAgZnMgPSBzZWxmLl9wb3J0Ll9maWxlc3lzdGVtCisgICAgICAgIGZzLndy
aXRlX2JpbmFyeV9maWxlKGRpZmZfZmlsZW5hbWUsIGltYWdlX2RpZmYpCiAKICAgICAgICAgZGlm
ZnNfaHRtbF9maWxlbmFtZSA9IHNlbGYub3V0cHV0X2ZpbGVuYW1lKHNlbGYuRklMRU5BTUVfU1VG
RklYX0lNQUdFX0RJRkZTX0hUTUwpCiAgICAgICAgICMgRklYTUU6IG9sZC1ydW4td2Via2l0LXRl
c3RzIHNob3dzIHRoZSBkaWZmIHBlcmNlbnRhZ2UgYXMgdGhlIHRleHQgY29udGVudHMgb2YgdGhl
ICJkaWZmIiBsaW5rLgpAQCAtMjc4LDExICsyNTcsMTQgQEAgRGlmZmVyZW5jZSBiZXR3ZWVuIGlt
YWdlczogPGEgaHJlZj0iJShkaQogPC9zY3JpcHQ+CiA8L2JvZHk+CiA8L2h0bWw+Ci0iIiIgJSB7
ICd0aXRsZSc6IHNlbGYuX3Rlc3RuYW1lLCAnZGlmZl9maWxlbmFtZSc6IHNlbGYuX291dHB1dF90
ZXN0bmFtZSgnLWRpZmYucG5nJyksICdwcmVmaXgnOiBzZWxmLl9vdXRwdXRfdGVzdG5hbWUoJycp
IH0KKyIiIiAlIHsKKyAgICAgICAgICAgICd0aXRsZSc6IHNlbGYuX3Rlc3RuYW1lLAorICAgICAg
ICAgICAgJ2RpZmZfZmlsZW5hbWUnOiBzZWxmLl9vdXRwdXRfdGVzdG5hbWUoc2VsZi5GSUxFTkFN
RV9TVUZGSVhfSU1BR0VfRElGRiksCisgICAgICAgICAgICAncHJlZml4Jzogc2VsZi5fb3V0cHV0
X3Rlc3RuYW1lKCcnKSwKKyAgICAgICAgfQorICAgICAgICAjIEZJWE1FOiBUaGlzIHNlZW1zIGxp
a2UgYSB0ZXh0IGZpbGUsIG5vdCBhIGJpbmFyeSBmaWxlLgogICAgICAgICBzZWxmLl9wb3J0Ll9m
aWxlc3lzdGVtLndyaXRlX2JpbmFyeV9maWxlKGRpZmZzX2h0bWxfZmlsZW5hbWUsIGh0bWwpCiAK
LSAgICAgICAgcmV0dXJuIFRydWUKLQogICAgIGRlZiBjb3B5X2ZpbGUoc2VsZiwgc3JjX2ZpbGVw
YXRoLCBkc3RfZXh0ZW5zaW9uKToKICAgICAgICAgZnMgPSBzZWxmLl9wb3J0Ll9maWxlc3lzdGVt
CiAgICAgICAgIGFzc2VydCBmcy5leGlzdHMoc3JjX2ZpbGVwYXRoKSwgJ3NyY19maWxlcGF0aDog
JXMnICUgc3JjX2ZpbGVwYXRoCkluZGV4OiBUb29scy9TY3JpcHRzL3dlYmtpdHB5L2xheW91dF90
ZXN0cy9wb3J0L2Jhc2UucHkKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gVG9vbHMvU2NyaXB0cy93ZWJraXRweS9s
YXlvdXRfdGVzdHMvcG9ydC9iYXNlLnB5CShyZXZpc2lvbiA5MDA4NikKKysrIFRvb2xzL1Njcmlw
dHMvd2Via2l0cHkvbGF5b3V0X3Rlc3RzL3BvcnQvYmFzZS5weQkod29ya2luZyBjb3B5KQpAQCAt
MjQ0LDE2ICsyNDQsMTEgQEAgY2xhc3MgUG9ydChvYmplY3QpOgogICAgICAgICAiIiJSZXR1cm4g
d2hldGhlciB0aGUgdHdvIGF1ZGlvIGZpbGVzIGFyZSAqbm90KiBlcXVhbC4iIiIKICAgICAgICAg
cmV0dXJuIGV4cGVjdGVkX2F1ZGlvICE9IGFjdHVhbF9hdWRpbwogCi0gICAgZGVmIGRpZmZfaW1h
Z2Uoc2VsZiwgZXhwZWN0ZWRfY29udGVudHMsIGFjdHVhbF9jb250ZW50cywgZGlmZl9maWxlbmFt
ZT1Ob25lLCB0b2xlcmFuY2U9MCk6Ci0gICAgICAgICIiIkNvbXBhcmUgdHdvIGltYWdlcyBhbmQg
cHJvZHVjZSBhIGRlbHRhIGltYWdlIGZpbGUuCi0KLSAgICAgICAgUmV0dXJuIFRydWUgaWYgdGhl
IHR3byBpbWFnZXMgYXJlIGRpZmZlcmVudCwgRmFsc2UgaWYgdGhleSBhcmUgdGhlIHNhbWUuCi0g
ICAgICAgIEFsc28gcHJvZHVjZSBhIGRlbHRhIGltYWdlIG9mIHRoZSB0d28gaW1hZ2VzIGFuZCB3
cml0ZSB0aGF0IGludG8KLSAgICAgICAgfGRpZmZfZmlsZW5hbWV8IGlmIGl0IGlzIG5vdCBOb25l
LgorICAgIGRlZiBkaWZmX2ltYWdlKHNlbGYsIGV4cGVjdGVkX2NvbnRlbnRzLCBhY3R1YWxfY29u
dGVudHMsIHRvbGVyYW5jZT0wKToKKyAgICAgICAgIiIiQ29tcGFyZSB0d28gaW1hZ2VzIGFuZCBy
ZXR1cm4gYW4gaW1hZ2UgZGlmZi4KIAogICAgICAgICB8dG9sZXJhbmNlfCBzaG91bGQgYmUgYSBw
ZXJjZW50YWdlIHZhbHVlICgwLjAgLSAxMDAuMCkuCiAgICAgICAgIElmIGl0IGlzIG9taXR0ZWQs
IHRoZSBwb3J0IGRlZmF1bHQgdG9sZXJhbmNlIHZhbHVlIGlzIHVzZWQuCi0KICAgICAgICAgIiIi
CiAgICAgICAgIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoJ1BvcnQuZGlmZl9pbWFnZScpCiAK
QEAgLTkzOSw2ICs5MzQsNyBAQCBjbGFzcyBEcml2ZXJPdXRwdXQob2JqZWN0KToKICAgICAgICAg
c2VsZi50ZXh0ID0gdGV4dAogICAgICAgICBzZWxmLmltYWdlID0gaW1hZ2UKICAgICAgICAgc2Vs
Zi5pbWFnZV9oYXNoID0gaW1hZ2VfaGFzaAorICAgICAgICBzZWxmLmltYWdlX2RpZmYgPSBOb25l
ICAjIGltYWdlX2RpZmYgZ2V0cyBmaWxsZWQgaW4gYWZ0ZXIgY29uc3RydWN0aW9uLgogICAgICAg
ICBzZWxmLmF1ZGlvID0gYXVkaW8KICAgICAgICAgc2VsZi5jcmFzaCA9IGNyYXNoCiAgICAgICAg
IHNlbGYudGVzdF90aW1lID0gdGVzdF90aW1lCkluZGV4OiBUb29scy9TY3JpcHRzL3dlYmtpdHB5
L2xheW91dF90ZXN0cy9wb3J0L2Nocm9taXVtLnB5Cj09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFRvb2xzL1Njcmlw
dHMvd2Via2l0cHkvbGF5b3V0X3Rlc3RzL3BvcnQvY2hyb21pdW0ucHkJKHJldmlzaW9uIDkwMDg2
KQorKysgVG9vbHMvU2NyaXB0cy93ZWJraXRweS9sYXlvdXRfdGVzdHMvcG9ydC9jaHJvbWl1bS5w
eQkod29ya2luZyBjb3B5KQpAQCAtMTM4LDggKzEzOCw3IEBAIGNsYXNzIENocm9taXVtUG9ydChi
YXNlLlBvcnQpOgogICAgICAgICByZXR1cm4gc2VsZi5fY2hlY2tfZmlsZV9leGlzdHMoaW1hZ2Vf
ZGlmZl9wYXRoLCAnaW1hZ2UgZGlmZiBleGUnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgb3ZlcnJpZGVfc3RlcCwgbG9nZ2luZykKIAotICAgIGRlZiBkaWZmX2ltYWdl
KHNlbGYsIGV4cGVjdGVkX2NvbnRlbnRzLCBhY3R1YWxfY29udGVudHMsCi0gICAgICAgICAgICAg
ICAgICAgZGlmZl9maWxlbmFtZT1Ob25lKToKKyAgICBkZWYgZGlmZl9pbWFnZShzZWxmLCBleHBl
Y3RlZF9jb250ZW50cywgYWN0dWFsX2NvbnRlbnRzKToKICAgICAgICAgIyBGSVhNRTogbmVlZCB1
bml0IHRlc3RzIGZvciB0aGlzLgogICAgICAgICBpZiBub3QgYWN0dWFsX2NvbnRlbnRzIGFuZCBu
b3QgZXhwZWN0ZWRfY29udGVudHM6CiAgICAgICAgICAgICByZXR1cm4gRmFsc2UKQEAgLTE0Nywz
OSArMTQ2LDQwIEBAIGNsYXNzIENocm9taXVtUG9ydChiYXNlLlBvcnQpOgogICAgICAgICAgICAg
cmV0dXJuIFRydWUKIAogICAgICAgICB0ZW1wZGlyID0gc2VsZi5fZmlsZXN5c3RlbS5ta2R0ZW1w
KCkKKwogICAgICAgICBleHBlY3RlZF9maWxlbmFtZSA9IHNlbGYuX2ZpbGVzeXN0ZW0uam9pbihz
dHIodGVtcGRpciksICJleHBlY3RlZC5wbmciKQogICAgICAgICBzZWxmLl9maWxlc3lzdGVtLndy
aXRlX2JpbmFyeV9maWxlKGV4cGVjdGVkX2ZpbGVuYW1lLCBleHBlY3RlZF9jb250ZW50cykKKwog
ICAgICAgICBhY3R1YWxfZmlsZW5hbWUgPSBzZWxmLl9maWxlc3lzdGVtLmpvaW4oc3RyKHRlbXBk
aXIpLCAiYWN0dWFsLnBuZyIpCiAgICAgICAgIHNlbGYuX2ZpbGVzeXN0ZW0ud3JpdGVfYmluYXJ5
X2ZpbGUoYWN0dWFsX2ZpbGVuYW1lLCBhY3R1YWxfY29udGVudHMpCiAKKyAgICAgICAgZGlmZl9m
aWxlbmFtZSA9IHNlbGYuX2ZpbGVzeXN0ZW0uam9pbihzdHIodGVtcGRpciksICJkaWZmLnBuZyIp
CisKICAgICAgICAgZXhlY3V0YWJsZSA9IHNlbGYuX3BhdGhfdG9faW1hZ2VfZGlmZigpCi0gICAg
ICAgIGlmIGRpZmZfZmlsZW5hbWU6Ci0gICAgICAgICAgICBjbWQgPSBbZXhlY3V0YWJsZSwgJy0t
ZGlmZicsIGV4cGVjdGVkX2ZpbGVuYW1lLAotICAgICAgICAgICAgICAgICAgIGFjdHVhbF9maWxl
bmFtZSwgZGlmZl9maWxlbmFtZV0KLSAgICAgICAgZWxzZToKLSAgICAgICAgICAgIGNtZCA9IFtl
eGVjdXRhYmxlLCBleHBlY3RlZF9maWxlbmFtZSwgYWN0dWFsX2ZpbGVuYW1lXQorICAgICAgICBj
b21hbmQgPSBbZXhlY3V0YWJsZSwgJy0tZGlmZicsIGV4cGVjdGVkX2ZpbGVuYW1lLCBhY3R1YWxf
ZmlsZW5hbWUsIGRpZmZfZmlsZW5hbWVdCiAKLSAgICAgICAgcmVzdWx0ID0gVHJ1ZQorICAgICAg
ICByZXN1bHQgPSBOb25lCiAgICAgICAgIHRyeToKLSAgICAgICAgICAgIGV4aXRfY29kZSA9IHNl
bGYuX2V4ZWN1dGl2ZS5ydW5fY29tbWFuZChjbWQsIHJldHVybl9leGl0X2NvZGU9VHJ1ZSkKKyAg
ICAgICAgICAgIGV4aXRfY29kZSA9IHNlbGYuX2V4ZWN1dGl2ZS5ydW5fY29tbWFuZChjb21hbmQs
IHJldHVybl9leGl0X2NvZGU9VHJ1ZSkKICAgICAgICAgICAgIGlmIGV4aXRfY29kZSA9PSAwOgog
ICAgICAgICAgICAgICAgICMgVGhlIGltYWdlcyBhcmUgdGhlIHNhbWUuCi0gICAgICAgICAgICAg
ICAgcmVzdWx0ID0gRmFsc2UKKyAgICAgICAgICAgICAgICByZXN1bHQgPSBOb25lCiAgICAgICAg
ICAgICBlbGlmIGV4aXRfY29kZSAhPSAxOgotICAgICAgICAgICAgICAgIF9sb2cuZXJyb3IoImlt
YWdlIGRpZmYgcmV0dXJuZWQgYW4gZXhpdCBjb2RlIG9mICIKLSAgICAgICAgICAgICAgICAgICAg
ICAgICAgICsgc3RyKGV4aXRfY29kZSkpCisgICAgICAgICAgICAgICAgX2xvZy5lcnJvcigiaW1h
Z2UgZGlmZiByZXR1cm5lZCBhbiBleGl0IGNvZGUgb2YgJXMiICUgZXhpdF9jb2RlKQogICAgICAg
ICAgICAgICAgICMgUmV0dXJuaW5nIEZhbHNlIGhlcmUgY2F1c2VzIHRoZSBzY3JpcHQgdG8gdGhp
bmsgdGhhdCB3ZQogICAgICAgICAgICAgICAgICMgc3VjY2Vzc2Z1bGx5IGNyZWF0ZWQgdGhlIGRp
ZmYgZXZlbiB0aG91Z2ggd2UgZGlkbid0LiAgSWYKICAgICAgICAgICAgICAgICAjIHdlIHJldHVy
biBUcnVlLCB3ZSB0aGluayB0aGF0IHRoZSBpbWFnZXMgbWF0Y2ggYnV0IHRoZSBoYXNoZXMKICAg
ICAgICAgICAgICAgICAjIGRvbid0IG1hdGNoLgogICAgICAgICAgICAgICAgICMgRklYTUU6IEZp
Z3VyZSBvdXQgd2h5IGltYWdlX2RpZmYgcmV0dXJucyBvdGhlciB2YWx1ZXMuCi0gICAgICAgICAg
ICAgICAgcmVzdWx0ID0gRmFsc2UKKyAgICAgICAgICAgICAgICByZXN1bHQgPSBOb25lCiAgICAg
ICAgIGV4Y2VwdCBPU0Vycm9yLCBlOgogICAgICAgICAgICAgaWYgZS5lcnJubyA9PSBlcnJuby5F
Tk9FTlQgb3IgZS5lcnJubyA9PSBlcnJuby5FQUNDRVM6CiAgICAgICAgICAgICAgICAgX2NvbXBh
cmVfYXZhaWxhYmxlID0gRmFsc2UKICAgICAgICAgICAgIGVsc2U6Ci0gICAgICAgICAgICAgICAg
cmFpc2UgZQorICAgICAgICAgICAgICAgIHJhaXNlCiAgICAgICAgIGZpbmFsbHk6CisgICAgICAg
ICAgICBpZiBleGl0X2NvZGUgPT0gMToKKyAgICAgICAgICAgICAgICByZXN1bHQgPSBzZWxmLl9m
aWxlc3lzdGVtLnJlYWRfYmluYXJ5X2ZpbGUoZGlmZl9maWxlbmFtZSkKICAgICAgICAgICAgIHNl
bGYuX2ZpbGVzeXN0ZW0ucm10cmVlKHN0cih0ZW1wZGlyKSkKICAgICAgICAgcmV0dXJuIHJlc3Vs
dAogCkluZGV4OiBUb29scy9TY3JpcHRzL3dlYmtpdHB5L2xheW91dF90ZXN0cy9wb3J0L2Nocm9t
aXVtX3VuaXR0ZXN0LnB5Cj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFRvb2xzL1NjcmlwdHMvd2Via2l0cHkvbGF5
b3V0X3Rlc3RzL3BvcnQvY2hyb21pdW1fdW5pdHRlc3QucHkJKHJldmlzaW9uIDkwMDg2KQorKysg
VG9vbHMvU2NyaXB0cy93ZWJraXRweS9sYXlvdXRfdGVzdHMvcG9ydC9jaHJvbWl1bV91bml0dGVz
dC5weQkod29ya2luZyBjb3B5KQpAQCAtMjE0LDEzICsyMTQsMTkgQEAgTElOVVggV0lOIDogZmFz
dC9qcy92ZXJ5LWdvb2QuanMgPSBUSU1FTwogICAgICAgICBtb2NrX29wdGlvbnMgPSBtb2NrdG9v
bC5Nb2NrT3B0aW9ucygpCiAgICAgICAgIHBvcnQgPSBDaHJvbWl1bVBvcnRUZXN0LlRlc3RMaW51
eFBvcnQobW9ja19vcHRpb25zKQogCisgICAgICAgIG1vY2tfaW1hZ2VfZGlmZiA9ICJNT0NLIElt
YWdlIERpZmYiCisKKyAgICAgICAgZGVmIG1vY2tfcnVuX2NvbW1hbmQoYXJncyk6CisgICAgICAg
ICAgICBwb3J0Ll9maWxlc3lzdGVtLndyaXRlX2JpbmFyeV9maWxlKGFyZ3NbNF0sIG1vY2tfaW1h
Z2VfZGlmZikKKyAgICAgICAgICAgIHJldHVybiAxCisKICAgICAgICAgIyBJbWFnZXMgYXJlIGRp
ZmZlcmVudC4KLSAgICAgICAgcG9ydC5fZXhlY3V0aXZlID0gZXhlY3V0aXZlX21vY2suTW9ja0V4
ZWN1dGl2ZTIoZXhpdF9jb2RlPTApCi0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKEZhbHNlLCBw
b3J0LmRpZmZfaW1hZ2UoIkVYUEVDVEVEIiwgIkFDVFVBTCIpKQorICAgICAgICBwb3J0Ll9leGVj
dXRpdmUgPSBleGVjdXRpdmVfbW9jay5Nb2NrRXhlY3V0aXZlMihydW5fY29tbWFuZF9mbj1tb2Nr
X3J1bl9jb21tYW5kKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhtb2NrX2ltYWdlX2RpZmYs
IHBvcnQuZGlmZl9pbWFnZSgiRVhQRUNURUQiLCAiQUNUVUFMIikpCiAKICAgICAgICAgIyBJbWFn
ZXMgYXJlIHRoZSBzYW1lLgotICAgICAgICBwb3J0Ll9leGVjdXRpdmUgPSBleGVjdXRpdmVfbW9j
ay5Nb2NrRXhlY3V0aXZlMihleGl0X2NvZGU9MSkKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMo
VHJ1ZSwgcG9ydC5kaWZmX2ltYWdlKCJFWFBFQ1RFRCIsICJBQ1RVQUwiKSkKKyAgICAgICAgcG9y
dC5fZXhlY3V0aXZlID0gZXhlY3V0aXZlX21vY2suTW9ja0V4ZWN1dGl2ZTIoZXhpdF9jb2RlPTAp
CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKE5vbmUsIHBvcnQuZGlmZl9pbWFnZSgiRVhQRUNU
RUQiLCAiQUNUVUFMIikpCiAKICAgICAgICAgIyBUaGVyZSB3YXMgc29tZSBlcnJvciBydW5uaW5n
IGltYWdlX2RpZmYuCiAgICAgICAgIHBvcnQuX2V4ZWN1dGl2ZSA9IGV4ZWN1dGl2ZV9tb2NrLk1v
Y2tFeGVjdXRpdmUyKGV4aXRfY29kZT0yKQpJbmRleDogVG9vbHMvU2NyaXB0cy93ZWJraXRweS9s
YXlvdXRfdGVzdHMvcG9ydC9wb3J0X3Rlc3RjYXNlLnB5Cj09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFRvb2xzL1Nj
cmlwdHMvd2Via2l0cHkvbGF5b3V0X3Rlc3RzL3BvcnQvcG9ydF90ZXN0Y2FzZS5weQkocmV2aXNp
b24gOTAwODYpCisrKyBUb29scy9TY3JpcHRzL3dlYmtpdHB5L2xheW91dF90ZXN0cy9wb3J0L3Bv
cnRfdGVzdGNhc2UucHkJKHdvcmtpbmcgY29weSkKQEAgLTIyOSwyNCArMjI5LDI0IEBAIGNsYXNz
IFBvcnRUZXN0Q2FzZSh1bml0dGVzdC5UZXN0Q2FzZSk6CiAgICAgICAgIHBvcnQgPSBzZWxmLm1h
a2VfcG9ydCgpCiAgICAgICAgIGlmIG5vdCBwb3J0OgogICAgICAgICAgICAgcmV0dXJuCi0gICAg
ICAgIHNlbGYuYXNzZXJ0RmFsc2UocG9ydC5kaWZmX2ltYWdlKE5vbmUsIE5vbmUsIE5vbmUpKQot
ICAgICAgICBzZWxmLmFzc2VydEZhbHNlKHBvcnQuZGlmZl9pbWFnZShOb25lLCAnJywgTm9uZSkp
Ci0gICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UocG9ydC5kaWZmX2ltYWdlKCcnLCBOb25lLCBOb25l
KSkKLSAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShwb3J0LmRpZmZfaW1hZ2UoJycsICcnLCBOb25l
KSkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShwb3J0LmRpZmZfaW1hZ2UoTm9uZSwgTm9uZSkp
CisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UocG9ydC5kaWZmX2ltYWdlKE5vbmUsICcnKSkKKyAg
ICAgICAgc2VsZi5hc3NlcnRGYWxzZShwb3J0LmRpZmZfaW1hZ2UoJycsIE5vbmUpKQorICAgICAg
ICBzZWxmLmFzc2VydEZhbHNlKHBvcnQuZGlmZl9pbWFnZSgnJywgJycpKQogCiAgICAgZGVmIHRl
c3RfZGlmZl9pbWFnZV9fbWlzc2luZ19hY3R1YWwoc2VsZik6CiAgICAgICAgIHBvcnQgPSBzZWxm
Lm1ha2VfcG9ydCgpCiAgICAgICAgIGlmIG5vdCBwb3J0OgogICAgICAgICAgICAgcmV0dXJuCi0g
ICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShwb3J0LmRpZmZfaW1hZ2UoTm9uZSwgJ2ZvbycsIE5vbmUp
KQotICAgICAgICBzZWxmLmFzc2VydFRydWUocG9ydC5kaWZmX2ltYWdlKCcnLCAnZm9vJywgTm9u
ZSkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShwb3J0LmRpZmZfaW1hZ2UoTm9uZSwgJ2Zvbycp
KQorICAgICAgICBzZWxmLmFzc2VydFRydWUocG9ydC5kaWZmX2ltYWdlKCcnLCAnZm9vJykpCiAK
ICAgICBkZWYgdGVzdF9kaWZmX2ltYWdlX19taXNzaW5nX2V4cGVjdGVkKHNlbGYpOgogICAgICAg
ICBwb3J0ID0gc2VsZi5tYWtlX3BvcnQoKQogICAgICAgICBpZiBub3QgcG9ydDoKICAgICAgICAg
ICAgIHJldHVybgotICAgICAgICBzZWxmLmFzc2VydFRydWUocG9ydC5kaWZmX2ltYWdlKCdmb28n
LCBOb25lLCBOb25lKSkKLSAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHBvcnQuZGlmZl9pbWFnZSgn
Zm9vJywgJycsIE5vbmUpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUocG9ydC5kaWZmX2ltYWdl
KCdmb28nLCBOb25lKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHBvcnQuZGlmZl9pbWFnZSgn
Zm9vJywgJycpKQogCiAgICAgZGVmIHRlc3RfY2hlY2tfYnVpbGQoc2VsZik6CiAgICAgICAgIHBv
cnQgPSBzZWxmLm1ha2VfcG9ydCgpCkluZGV4OiBUb29scy9TY3JpcHRzL3dlYmtpdHB5L2xheW91
dF90ZXN0cy9wb3J0L3Rlc3QucHkKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gVG9vbHMvU2NyaXB0cy93ZWJraXRw
eS9sYXlvdXRfdGVzdHMvcG9ydC90ZXN0LnB5CShyZXZpc2lvbiA5MDA4NikKKysrIFRvb2xzL1Nj
cmlwdHMvd2Via2l0cHkvbGF5b3V0X3Rlc3RzL3BvcnQvdGVzdC5weQkod29ya2luZyBjb3B5KQpA
QCAtMzEzLDEzICszMTMsMTEgQEAgY2xhc3MgVGVzdFBvcnQoYmFzZS5Qb3J0KToKICAgICBkZWYg
ZGVmYXVsdF9jb25maWd1cmF0aW9uKHNlbGYpOgogICAgICAgICByZXR1cm4gJ1JlbGVhc2UnCiAK
LSAgICBkZWYgZGlmZl9pbWFnZShzZWxmLCBleHBlY3RlZF9jb250ZW50cywgYWN0dWFsX2NvbnRl
bnRzLAotICAgICAgICAgICAgICAgICAgIGRpZmZfZmlsZW5hbWU9Tm9uZSk6CisgICAgZGVmIGRp
ZmZfaW1hZ2Uoc2VsZiwgZXhwZWN0ZWRfY29udGVudHMsIGFjdHVhbF9jb250ZW50cyk6CiAgICAg
ICAgIGRpZmZlZCA9IGFjdHVhbF9jb250ZW50cyAhPSBleHBlY3RlZF9jb250ZW50cwotICAgICAg
ICBpZiBkaWZmZWQgYW5kIGRpZmZfZmlsZW5hbWU6Ci0gICAgICAgICAgICBzZWxmLl9maWxlc3lz
dGVtLndyaXRlX2JpbmFyeV9maWxlKGRpZmZfZmlsZW5hbWUsCi0gICAgICAgICAgICAgICAgIjwg
JXNcbi0tLVxuPiAlc1xuIiAlIChleHBlY3RlZF9jb250ZW50cywgYWN0dWFsX2NvbnRlbnRzKSkK
LSAgICAgICAgcmV0dXJuIGRpZmZlZAorICAgICAgICBpZiBkaWZmZWQ6CisgICAgICAgICAgICBy
ZXR1cm4gIjwgJXNcbi0tLVxuPiAlc1xuIiAlIChleHBlY3RlZF9jb250ZW50cywgYWN0dWFsX2Nv
bnRlbnRzKQorICAgICAgICByZXR1cm4gTm9uZQogCiAgICAgZGVmIGxheW91dF90ZXN0c19kaXIo
c2VsZik6CiAgICAgICAgIHJldHVybiBMQVlPVVRfVEVTVF9ESVIKSW5kZXg6IFRvb2xzL1Njcmlw
dHMvd2Via2l0cHkvbGF5b3V0X3Rlc3RzL3BvcnQvd2Via2l0LnB5Cj09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFRv
b2xzL1NjcmlwdHMvd2Via2l0cHkvbGF5b3V0X3Rlc3RzL3BvcnQvd2Via2l0LnB5CShyZXZpc2lv
biA5MDA4NikKKysrIFRvb2xzL1NjcmlwdHMvd2Via2l0cHkvbGF5b3V0X3Rlc3RzL3BvcnQvd2Vi
a2l0LnB5CSh3b3JraW5nIGNvcHkpCkBAIC0xMzIsMjIgKzEzMiwyMCBAQCBjbGFzcyBXZWJLaXRQ
b3J0KGJhc2UuUG9ydCk6CiAgICAgICAgICAgICByZXR1cm4gRmFsc2UKICAgICAgICAgcmV0dXJu
IFRydWUKIAotICAgIGRlZiBkaWZmX2ltYWdlKHNlbGYsIGV4cGVjdGVkX2NvbnRlbnRzLCBhY3R1
YWxfY29udGVudHMsCi0gICAgICAgICAgICAgICAgICAgZGlmZl9maWxlbmFtZT1Ob25lKToKLSAg
ICAgICAgIiIiUmV0dXJuIFRydWUgaWYgdGhlIHR3byBmaWxlcyBhcmUgZGlmZmVyZW50LiBBbHNv
IHdyaXRlIGEgZGVsdGEKLSAgICAgICAgaW1hZ2Ugb2YgdGhlIHR3byBpbWFnZXMgaW50byB8ZGlm
Zl9maWxlbmFtZXwgaWYgaXQgaXMgbm90IE5vbmUuIiIiCi0KKyAgICBkZWYgZGlmZl9pbWFnZShz
ZWxmLCBleHBlY3RlZF9jb250ZW50cywgYWN0dWFsX2NvbnRlbnRzKToKICAgICAgICAgIyBIYW5k
bGUgdGhlIGNhc2Ugd2hlcmUgdGhlIHRlc3QgZGlkbid0IGFjdHVhbGx5IGdlbmVyYXRlIGFuIGlt
YWdlLgogICAgICAgICAjIEZJWE1FOiBuZWVkIHVuaXQgdGVzdHMgZm9yIHRoaXMuCiAgICAgICAg
IGlmIG5vdCBhY3R1YWxfY29udGVudHMgYW5kIG5vdCBleHBlY3RlZF9jb250ZW50czoKLSAgICAg
ICAgICAgIHJldHVybiBGYWxzZQorICAgICAgICAgICAgcmV0dXJuIE5vbmUKICAgICAgICAgaWYg
bm90IGFjdHVhbF9jb250ZW50cyBvciBub3QgZXhwZWN0ZWRfY29udGVudHM6CisgICAgICAgICAg
ICAjIEZJWE1FOiBJdCdzIG5vdCBjbGVhciB3aGF0IHdlIHNob3VsZCByZXR1cm4gaW4gdGhpcyBj
YXNlLgorICAgICAgICAgICAgIyBNYXliZSB3ZSBzaG91bGQgdGhyb3cgYW4gZXhjZXB0aW9uPwog
ICAgICAgICAgICAgcmV0dXJuIFRydWUKIAotICAgICAgICBzcCA9IHNlbGYuX2RpZmZfaW1hZ2Vf
cmVxdWVzdChleHBlY3RlZF9jb250ZW50cywgYWN0dWFsX2NvbnRlbnRzKQotICAgICAgICByZXR1
cm4gc2VsZi5fZGlmZl9pbWFnZV9yZXBseShzcCwgZGlmZl9maWxlbmFtZSkKKyAgICAgICAgcHJv
Y2VzcyA9IHNlbGYuX2NyZWF0ZV9pbWFnZV9kaWZmX3Byb2Nlc3MoZXhwZWN0ZWRfY29udGVudHMs
IGFjdHVhbF9jb250ZW50cykKKyAgICAgICAgcmV0dXJuIHNlbGYuX3JlYWRfaW1hZ2VfZGlmZihw
cm9jZXNzKQogCi0gICAgZGVmIF9kaWZmX2ltYWdlX3JlcXVlc3Qoc2VsZiwgZXhwZWN0ZWRfY29u
dGVudHMsIGFjdHVhbF9jb250ZW50cyk6CisgICAgZGVmIF9jcmVhdGVfaW1hZ2VfZGlmZl9wcm9j
ZXNzKHNlbGYsIGV4cGVjdGVkX2NvbnRlbnRzLCBhY3R1YWxfY29udGVudHMpOgogICAgICAgICAj
IEZJWE1FOiBUaGVyZSBuZWVkcyB0byBiZSBhIG1vcmUgc2FuZSB3YXkgb2YgaGFuZGxpbmcgZGVm
YXVsdAogICAgICAgICAjIHZhbHVlcyBmb3Igb3B0aW9ucyBzbyB0aGF0IHlvdSBjYW4gZGlzdGlu
Z3Vpc2ggYmV0d2VlbiBhIGRlZmF1bHQKICAgICAgICAgIyB2YWx1ZSBvZiBOb25lIGFuZCBhIGRl
ZmF1bHQgdmFsdWUgdGhhdCB3YXNuJ3Qgc2V0LgpAQCAtMTU2LDE1ICsxNTQsMTMgQEAgY2xhc3Mg
V2ViS2l0UG9ydChiYXNlLlBvcnQpOgogICAgICAgICBlbHNlOgogICAgICAgICAgICAgdG9sZXJh
bmNlID0gMC4xCiAgICAgICAgIGNvbW1hbmQgPSBbc2VsZi5fcGF0aF90b19pbWFnZV9kaWZmKCks
ICctLXRvbGVyYW5jZScsIHN0cih0b2xlcmFuY2UpXQotICAgICAgICBzcCA9IHNlcnZlcl9wcm9j
ZXNzLlNlcnZlclByb2Nlc3Moc2VsZiwgJ0ltYWdlRGlmZicsIGNvbW1hbmQpCisgICAgICAgIHBy
b2Nlc3MgPSBzZXJ2ZXJfcHJvY2Vzcy5TZXJ2ZXJQcm9jZXNzKHNlbGYsICdJbWFnZURpZmYnLCBj
b21tYW5kKQogCi0gICAgICAgIHNwLndyaXRlKCdDb250ZW50LUxlbmd0aDogJWRcbiVzQ29udGVu
dC1MZW5ndGg6ICVkXG4lcycgJQotICAgICAgICAgICAgICAgICAobGVuKGFjdHVhbF9jb250ZW50
cyksIGFjdHVhbF9jb250ZW50cywKLSAgICAgICAgICAgICAgICAgIGxlbihleHBlY3RlZF9jb250
ZW50cyksIGV4cGVjdGVkX2NvbnRlbnRzKSkKKyAgICAgICAgcHJvY2Vzcy53cml0ZSgnQ29udGVu
dC1MZW5ndGg6ICVkXG4lc0NvbnRlbnQtTGVuZ3RoOiAlZFxuJXMnICUKKyAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgKGxlbihhY3R1YWxfY29udGVudHMpLCBhY3R1YWxfY29udGVudHMsIGxl
bihleHBlY3RlZF9jb250ZW50cyksIGV4cGVjdGVkX2NvbnRlbnRzKSkKKyAgICAgICAgcmV0dXJu
IHByb2Nlc3MKIAotICAgICAgICByZXR1cm4gc3AKLQotICAgIGRlZiBfZGlmZl9pbWFnZV9yZXBs
eShzZWxmLCBzcCwgZGlmZl9maWxlbmFtZSk6CisgICAgZGVmIF9yZWFkX2ltYWdlX2RpZmYoc2Vs
Ziwgc3ApOgogICAgICAgICB0aW1lb3V0ID0gMi4wCiAgICAgICAgIGRlYWRsaW5lID0gdGltZS50
aW1lKCkgKyB0aW1lb3V0CiAgICAgICAgIG91dHB1dCA9IHNwLnJlYWRfbGluZSh0aW1lb3V0KQpA
QCAtMTgxLDE5ICsxNzcsMTYgQEAgY2xhc3MgV2ViS2l0UG9ydChiYXNlLlBvcnQpOgogICAgICAg
ICAgICAgICAgIHRpbWVvdXQgPSBkZWFkbGluZSAtIHRpbWUudGltZSgpCiAgICAgICAgICAgICAg
ICAgb3V0cHV0ID0gc3AucmVhZF9saW5lKGRlYWRsaW5lKQogCi0gICAgICAgIHJlc3VsdCA9IFRy
dWUKLSAgICAgICAgaWYgb3V0cHV0LnN0YXJ0c3dpdGgoJ2RpZmYnKToKLSAgICAgICAgICAgIG0g
PSByZS5tYXRjaCgnZGlmZjogKC4rKSUgKHBhc3NlZHxmYWlsZWQpJywgb3V0cHV0KQotICAgICAg
ICAgICAgaWYgbS5ncm91cCgyKSA9PSAncGFzc2VkJzoKLSAgICAgICAgICAgICAgICByZXN1bHQg
PSBGYWxzZQotICAgICAgICBlbGlmIG91dHB1dCBhbmQgZGlmZl9maWxlbmFtZToKLSAgICAgICAg
ICAgIHNlbGYuX2ZpbGVzeXN0ZW0ud3JpdGVfYmluYXJ5X2ZpbGUoZGlmZl9maWxlbmFtZSwgb3V0
cHV0KQotICAgICAgICBlbGlmIHNwLnRpbWVkX291dDoKKyAgICAgICAgaWYgc3AudGltZWRfb3V0
OgogICAgICAgICAgICAgX2xvZy5lcnJvcigiSW1hZ2VEaWZmIHRpbWVkIG91dCIpCi0gICAgICAg
IGVsaWYgc3AuY3Jhc2hlZDoKKyAgICAgICAgaWYgc3AuY3Jhc2hlZDoKICAgICAgICAgICAgIF9s
b2cuZXJyb3IoIkltYWdlRGlmZiBjcmFzaGVkIikKICAgICAgICAgc3Auc3RvcCgpCi0gICAgICAg
IHJldHVybiByZXN1bHQKKyAgICAgICAgaWYgb3V0cHV0LnN0YXJ0c3dpdGgoJ2RpZmYnKToKKyAg
ICAgICAgICAgIG0gPSByZS5tYXRjaCgnZGlmZjogKC4rKSUgKHBhc3NlZHxmYWlsZWQpJywgb3V0
cHV0KQorICAgICAgICAgICAgaWYgbS5ncm91cCgyKSA9PSAncGFzc2VkJzoKKyAgICAgICAgICAg
ICAgICByZXR1cm4gTm9uZQorICAgICAgICByZXR1cm4gb3V0cHV0CiAKICAgICBkZWYgZGVmYXVs
dF9yZXN1bHRzX2RpcmVjdG9yeShzZWxmKToKICAgICAgICAgIyBSZXN1bHRzIGFyZSBzdG9yZSBy
ZWxhdGl2ZSB0byB0aGUgYnVpbHQgcHJvZHVjdHMgdG8gbWFrZSBpdCBlYXN5CkluZGV4OiBUb29s
cy9TY3JpcHRzL3dlYmtpdHB5L3RvX2JlX21vdmVkL3JlYmFzZWxpbmVfY2hyb21pdW1fd2Via2l0
X3Rlc3RzLnB5Cj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT0KLS0tIFRvb2xzL1NjcmlwdHMvd2Via2l0cHkvdG9fYmVfbW92
ZWQvcmViYXNlbGluZV9jaHJvbWl1bV93ZWJraXRfdGVzdHMucHkJKHJldmlzaW9uIDkwMDg2KQor
KysgVG9vbHMvU2NyaXB0cy93ZWJraXRweS90b19iZV9tb3ZlZC9yZWJhc2VsaW5lX2Nocm9taXVt
X3dlYmtpdF90ZXN0cy5weQkod29ya2luZyBjb3B5KQpAQCAtNTE3LDcgKzUxNyw3IEBAIGNsYXNz
IFJlYmFzZWxpbmVyKG9iamVjdCk6CiAgICAgICAgICIiIgogCiAgICAgICAgIGlmIGlzX2ltYWdl
OgotICAgICAgICAgICAgcmV0dXJuIHNlbGYuX3BvcnQuZGlmZl9pbWFnZShvdXRwdXQxLCBvdXRw
dXQyLCBOb25lKQorICAgICAgICAgICAgcmV0dXJuIHNlbGYuX3BvcnQuZGlmZl9pbWFnZShvdXRw
dXQxLCBvdXRwdXQyKQogCiAgICAgICAgIHJldHVybiBzZWxmLl9wb3J0LmNvbXBhcmVfdGV4dChv
dXRwdXQxLCBvdXRwdXQyKQogCkBAIC02MDIsNyArNjAyLDggQEAgY2xhc3MgUmViYXNlbGluZXIo
b2JqZWN0KToKICAgICAgICAgICAgIF9sb2cuZGVidWcoJyBIdG1sOiBkaWZmaW5nICIlcyIgYW5k
ICIlcyInLCBvbGRfZmlsZSwgbmV3X2ZpbGUpCiAgICAgICAgICAgICBvbGRfb3V0cHV0ID0gc2Vs
Zi5fZmlsZXN5c3RlbS5yZWFkX2JpbmFyeV9maWxlKG9sZF9maWxlKQogICAgICAgICAgICAgbmV3
X291dHB1dCA9IHNlbGYuX2ZpbGVzeXN0ZW0ucmVhZF9iaW5hcnlfZmlsZShuZXdfZmlsZSkKLSAg
ICAgICAgICAgIGhhc19kaWZmID0gc2VsZi5fcG9ydC5kaWZmX2ltYWdlKG9sZF9vdXRwdXQsIG5l
d19vdXRwdXQsIGRpZmZfZmlsZSkKKyAgICAgICAgICAgIGltYWdlX2RpZmYgPSBzZWxmLl9wb3J0
LmRpZmZfaW1hZ2Uob2xkX291dHB1dCwgbmV3X291dHB1dCkKKyAgICAgICAgICAgIHNlbGYuX2Zp
bGVzeXN0ZW0ud3JpdGVfYmluYXJ5X2ZpbGUoZGlmZl9maWxlLCBpbWFnZV9kaWZmKQogCiAgICAg
ICAgIGlmIGhhc19kaWZmOgogICAgICAgICAgICAgX2xvZy5kZWJ1ZygnICBIdG1sOiBjcmVhdGVk
IGJhc2VsaW5lIGRpZmYgZmlsZTogIiVzIi4nLCBkaWZmX2ZpbGUpCkluZGV4OiBMYXlvdXRUZXN0
cy9zdmcvY3VzdG9tL3BhdHRlcm4tcm90YXRlLnN2Zwo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBMYXlvdXRUZXN0
cy9zdmcvY3VzdG9tL3BhdHRlcm4tcm90YXRlLnN2ZwkocmV2aXNpb24gOTAwODYpCisrKyBMYXlv
dXRUZXN0cy9zdmcvY3VzdG9tL3BhdHRlcm4tcm90YXRlLnN2Zwkod29ya2luZyBjb3B5KQpAQCAt
OSw3ICs5LDcgQEAKICAgICAgICAgICAgIHBhdHRlcm5Db250ZW50VW5pdHM9Im9iamVjdEJvdW5k
aW5nQm94IgogICAgICAgICAgICAgPgogICAgICAgICAgICAgPGNpcmNsZSBjeD0iMC4yNSIgY3k9
IjAuMjUiIHI9IjAuMTUiIHN0eWxlPSJmaWxsOiByZWQ7Ii8+Ci0gICAgICAgICAgICA8Y2lyY2xl
IGN4PSIwLjc1IiBjeT0iMC4yNSIgcj0iMC4xNSIgc3R5bGU9ImZpbGw6IGdyZWVuOyIvPgorICAg
ICAgICAgICAgPGNpcmNsZSBjeD0iMC43NSIgY3k9IjAuMjUiIHI9IjAuMTUiIHN0eWxlPSJmaWxs
OiB5ZWxsb3c7Ii8+CiAgICAgICAgICAgICA8Y2lyY2xlIGN4PSIwLjI1IiBjeT0iMC43NSIgcj0i
MC4xNSIgc3R5bGU9ImZpbGw6IGJsdWU7Ii8+CiAgICAgICAgICAgICA8Y2lyY2xlIGN4PSIwLjc1
IiBjeT0iMC43NSIgcj0iMC4xNSIgc3R5bGU9ImZpbGw6IHB1cnBsZTsiLz4KICAgICAgICAgICAg
IDxjaXJjbGUgY3g9IjAuNSIgY3k9IjAuNSIgcj0iMC4wNSIgc3R5bGU9ImZpbGw6IG9yYW5nZTsi
Lz4K
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>99239</attachid>
            <date>2011-06-29 22:34:29 -0700</date>
            <delta_ts>2011-06-30 11:31:20 -0700</delta_ts>
            <desc>Patch</desc>
            <filename>bug-63494-20110629223428.patch</filename>
            <type>text/plain</type>
            <size>26095</size>
            <attacher name="Adam Barth">abarth</attacher>
            
              <data encoding="base64">SW5kZXg6IFRvb2xzL0NoYW5nZUxvZwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBUb29scy9DaGFuZ2VMb2cJKHJl
dmlzaW9uIDkwMDg3KQorKysgVG9vbHMvQ2hhbmdlTG9nCSh3b3JraW5nIGNvcHkpCkBAIC0xLDMg
KzEsMzMgQEAKKzIwMTEtMDYtMjkgIEFkYW0gQmFydGggIDxhYmFydGhAd2Via2l0Lm9yZz4KKwor
ICAgICAgICBSZXZpZXdlZCBieSBOT0JPRFkgKE9PUFMhKS4KKworICAgICAgICBSRUdSRVNTSU9O
KHI4NDI5NCk6IG5ldy1ydW4td2Via2l0LXRlc3RzIHJlc3VsdHMuaHRtbCBnZW5lcmF0ZSBsaW5r
cyB0byBkaWZmcy5odG1sIG9yIGRpZmYucG5nIHRoYXQgZG9uJ3QgZXhpc3QKKyAgICAgICAgaHR0
cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTYzNDk0CisKKyAgICAgICAgVGhp
cyBwYXRjaCBkb2VzIHR3byB0aGluZ3M6CisKKyAgICAgICAgMSkgUmVmYWN0b3IgZGlmZl9pbWFn
ZSB0byByZXR1cm4gdGhlIGltYWdlIGRpZmYgaW5zdGVhZCBvZiB3cml0aW5nIHRoZQorICAgICAg
ICBkaWZmIHRvIGEgZmlsZS4gIFRoaXMgZml4ZXMgYSBidW5jaCBvZiBoYWNrcyBhbmQgZGlzZW50
YW5nbGVzIGEgYnVuY2gKKyAgICAgICAgb2YgY29kZS4KKworICAgICAgICAyKSBXaGVuIHRoZXJl
J3MgYSBjaGVja3N1bSBtaXNtYXRjaCBidXQgbm90IGltYWdlIGRpZmYsIHdlIG5vIGxvbmdlcgor
ICAgICAgICByZXBvcnQgYW4gSU1BR0UgZmFpbHVyZSB0byByZXN1bHRzLmh0bWwuICBUaGF0IGZp
eGVzIHRoZSBidWcgaW4KKyAgICAgICAgcXVlc3Rpb24gYmVjYXVzZSByZXN1bHRzLmh0bWwgd29u
J3QgdHJ5IHRvIGxpbmsgdG8gYSBub24tZXhpc3RlbnQgaW1hZ2UKKyAgICAgICAgZGlmZi4KKwor
ICAgICAgICAqIFNjcmlwdHMvd2Via2l0cHkvY29tbW9uL3N5c3RlbS9leGVjdXRpdmVfbW9jay5w
eToKKyAgICAgICAgKiBTY3JpcHRzL3dlYmtpdHB5L2xheW91dF90ZXN0cy9sYXlvdXRfcGFja2Fn
ZS9zaW5nbGVfdGVzdF9ydW5uZXIucHk6CisgICAgICAgICogU2NyaXB0cy93ZWJraXRweS9sYXlv
dXRfdGVzdHMvbGF5b3V0X3BhY2thZ2UvdGVzdF9yZXN1bHRfd3JpdGVyLnB5OgorICAgICAgICAq
IFNjcmlwdHMvd2Via2l0cHkvbGF5b3V0X3Rlc3RzL3BvcnQvYmFzZS5weToKKyAgICAgICAgKiBT
Y3JpcHRzL3dlYmtpdHB5L2xheW91dF90ZXN0cy9wb3J0L2Nocm9taXVtLnB5OgorICAgICAgICAq
IFNjcmlwdHMvd2Via2l0cHkvbGF5b3V0X3Rlc3RzL3BvcnQvY2hyb21pdW1fdW5pdHRlc3QucHk6
CisgICAgICAgICogU2NyaXB0cy93ZWJraXRweS9sYXlvdXRfdGVzdHMvcG9ydC9wb3J0X3Rlc3Rj
YXNlLnB5OgorICAgICAgICAqIFNjcmlwdHMvd2Via2l0cHkvbGF5b3V0X3Rlc3RzL3BvcnQvdGVz
dC5weToKKyAgICAgICAgKiBTY3JpcHRzL3dlYmtpdHB5L2xheW91dF90ZXN0cy9wb3J0L3dlYmtp
dC5weToKKyAgICAgICAgKiBTY3JpcHRzL3dlYmtpdHB5L2xheW91dF90ZXN0cy9ydW5fd2Via2l0
X3Rlc3RzX2ludGVncmF0aW9udGVzdC5weToKKyAgICAgICAgKiBTY3JpcHRzL3dlYmtpdHB5L3Rv
X2JlX21vdmVkL3JlYmFzZWxpbmVfY2hyb21pdW1fd2Via2l0X3Rlc3RzLnB5OgorCiAyMDExLTA2
LTI5ICBEaXJrIFByYW5rZSAgPGRwcmFua2VAY2hyb21pdW0ub3JnPgogCiAgICAgICAgIFJldmll
d2VkIGJ5IEFkYW0gQmFydGguCkluZGV4OiBUb29scy9TY3JpcHRzL3dlYmtpdHB5L2NvbW1vbi9z
eXN0ZW0vZXhlY3V0aXZlX21vY2sucHkKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gVG9vbHMvU2NyaXB0cy93ZWJr
aXRweS9jb21tb24vc3lzdGVtL2V4ZWN1dGl2ZV9tb2NrLnB5CShyZXZpc2lvbiA5MDA4NikKKysr
IFRvb2xzL1NjcmlwdHMvd2Via2l0cHkvY29tbW9uL3N5c3RlbS9leGVjdXRpdmVfbW9jay5weQko
d29ya2luZyBjb3B5KQpAQCAtNjEsMTAgKzYxLDEwIEBAIGNsYXNzIE1vY2tFeGVjdXRpdmUyKG9i
amVjdCk6CiAgICAgICAgICAgICAgICAgICAgIGRlY29kZV9vdXRwdXQ9RmFsc2UpOgogICAgICAg
ICBpZiBzZWxmLl9leGNlcHRpb246CiAgICAgICAgICAgICByYWlzZSBzZWxmLl9leGNlcHRpb24K
LSAgICAgICAgaWYgcmV0dXJuX2V4aXRfY29kZToKLSAgICAgICAgICAgIHJldHVybiBzZWxmLl9l
eGl0X2NvZGUKICAgICAgICAgaWYgc2VsZi5fcnVuX2NvbW1hbmRfZm46CiAgICAgICAgICAgICBy
ZXR1cm4gc2VsZi5fcnVuX2NvbW1hbmRfZm4oYXJncykKKyAgICAgICAgaWYgcmV0dXJuX2V4aXRf
Y29kZToKKyAgICAgICAgICAgIHJldHVybiBzZWxmLl9leGl0X2NvZGUKICAgICAgICAgaWYgc2Vs
Zi5fZXhpdF9jb2RlIGFuZCBlcnJvcl9oYW5kbGVyOgogICAgICAgICAgICAgc2NyaXB0X2Vycm9y
ID0gZXhlY3V0aXZlLlNjcmlwdEVycm9yKHNjcmlwdF9hcmdzPWFyZ3MsCiAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhpdF9jb2RlPXNlbGYuX2V4aXRf
Y29kZSwKSW5kZXg6IFRvb2xzL1NjcmlwdHMvd2Via2l0cHkvbGF5b3V0X3Rlc3RzL3J1bl93ZWJr
aXRfdGVzdHNfaW50ZWdyYXRpb250ZXN0LnB5Cj09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFRvb2xzL1NjcmlwdHMv
d2Via2l0cHkvbGF5b3V0X3Rlc3RzL3J1bl93ZWJraXRfdGVzdHNfaW50ZWdyYXRpb250ZXN0LnB5
CShyZXZpc2lvbiA5MDA4NikKKysrIFRvb2xzL1NjcmlwdHMvd2Via2l0cHkvbGF5b3V0X3Rlc3Rz
L3J1bl93ZWJraXRfdGVzdHNfaW50ZWdyYXRpb250ZXN0LnB5CSh3b3JraW5nIGNvcHkpCkBAIC0y
NjQsOSArMjY0LDggQEAgY2xhc3MgTWFpblRlc3QodW5pdHRlc3QuVGVzdENhc2UpOgogICAgICAg
ICAjIFdlIGRvIGEgbG9nZ2luZyBydW4gaGVyZSBpbnN0ZWFkIG9mIGEgcGFzc2luZyBydW4gaW4g
b3JkZXIgdG8KICAgICAgICAgIyBzdXBwcmVzcyB0aGUgb3V0cHV0IGZyb20gdGhlIGpzb24gZ2Vu
ZXJhdG9yLgogICAgICAgICByZXMsIGJ1aWxkYm90X291dHB1dCwgcmVndWxhcl9vdXRwdXQsIHVz
ZXIgPSBsb2dnaW5nX3J1bihbJy0tY2xvYmJlci1vbGQtcmVzdWx0cyddLCByZWNvcmRfcmVzdWx0
cz1UcnVlLCBmaWxlc3lzdGVtPWZzKQotICAgICAgICByZXMsIGJ1aWxkYm90X291dHB1dCwgcmVn
dWxhcl9vdXRwdXQsIHVzZXIgPSBsb2dnaW5nX3J1bigKLSAgICAgICAgICAgIFsnLS1wcmludC1s
YXN0LWZhaWx1cmVzJ10sIGZpbGVzeXN0ZW09ZnMpCi0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwo
cmVndWxhcl9vdXRwdXQuZ2V0KCksIFsnXG5cbiddKQorICAgICAgICByZXMsIGJ1aWxkYm90X291
dHB1dCwgcmVndWxhcl9vdXRwdXQsIHVzZXIgPSBsb2dnaW5nX3J1bihbJy0tcHJpbnQtbGFzdC1m
YWlsdXJlcyddLCBmaWxlc3lzdGVtPWZzKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlZ3Vs
YXJfb3V0cHV0LmdldCgpLCBbdSdmYWlsdXJlcy9leHBlY3RlZC9jaGVja3N1bS5odG1sXG5cbidd
KQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGJ1aWxkYm90X291dHB1dC5nZXQoKSwgW10pCiAK
ICAgICBkZWYgdGVzdF9saW50X3Rlc3RfZmlsZXMoc2VsZik6CkBAIC00MjEsNiArNDIwLDE2IEBA
IGNsYXNzIE1haW5UZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKICAgICAgICAgICAgIGZpbGVzeXN0
ZW09ZnMpCiAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShmcy5yZWFkX3RleHRfZmlsZSgnL3RtcC9s
YXlvdXQtdGVzdC1yZXN1bHRzL3VuZXhwZWN0ZWRfcmVzdWx0cy5qc29uJykuZmluZCgneyJjcmFz
aC13aXRoLXN0ZGVyci5odG1sIjp7ImV4cGVjdGVkIjoiUEFTUyIsImFjdHVhbCI6IkNSQVNIIiwi
aGFzX3N0ZGVyciI6dHJ1ZX19JykgIT0gLTEpCiAKKyAgICBkZWYgdGVzdF9ub19pbWFnZV9mYWls
dXJlX3dpdGhfaW1hZ2VfZGlmZihzZWxmKToKKyAgICAgICAgZnMgPSBwb3J0LnVuaXRfdGVzdF9m
aWxlc3lzdGVtKCkKKyAgICAgICAgcmVzLCBidWlsZGJvdF9vdXRwdXQsIHJlZ3VsYXJfb3V0cHV0
LCB1c2VyID0gbG9nZ2luZ19ydW4oWworICAgICAgICAgICAgICAgICdmYWlsdXJlcy91bmV4cGVj
dGVkL2NoZWNrc3VtLXdpdGgtbWF0Y2hpbmctaW1hZ2UuaHRtbCcsCisgICAgICAgICAgICBdLAor
ICAgICAgICAgICAgdGVzdHNfaW5jbHVkZWQ9VHJ1ZSwKKyAgICAgICAgICAgIHJlY29yZF9yZXN1
bHRzPVRydWUsCisgICAgICAgICAgICBmaWxlc3lzdGVtPWZzKQorICAgICAgICBzZWxmLmFzc2Vy
dFRydWUoZnMucmVhZF90ZXh0X2ZpbGUoJy90bXAvbGF5b3V0LXRlc3QtcmVzdWx0cy91bmV4cGVj
dGVkX3Jlc3VsdHMuanNvbicpLmZpbmQoJyJudW1fcmVncmVzc2lvbnMiOjAnKSAhPSAtMSkKKwog
ICAgIGRlZiB0ZXN0X2NyYXNoX2xvZyhzZWxmKToKICAgICAgICAgbW9ja19jcmFzaF9yZXBvcnQg
PSAnbW9jay1jcmFzaC1yZXBvcnQnCiAgICAgICAgIGZzID0gcG9ydC51bml0X3Rlc3RfZmlsZXN5
c3RlbSgpCkBAIC01NTksOCArNTY4LDcgQEAgY2xhc3MgTWFpblRlc3QodW5pdHRlc3QuVGVzdENh
c2UpOgogCiAgICAgZGVmIHRlc3RfdG9sZXJhbmNlKHNlbGYpOgogICAgICAgICBjbGFzcyBJbWFn
ZURpZmZUZXN0UG9ydChUZXN0UG9ydCk6Ci0gICAgICAgICAgICBkZWYgZGlmZl9pbWFnZShzZWxm
LCBleHBlY3RlZF9jb250ZW50cywgYWN0dWFsX2NvbnRlbnRzLAotICAgICAgICAgICAgICAgICAg
IGRpZmZfZmlsZW5hbWU9Tm9uZSk6CisgICAgICAgICAgICBkZWYgZGlmZl9pbWFnZShzZWxmLCBl
eHBlY3RlZF9jb250ZW50cywgYWN0dWFsX2NvbnRlbnRzKToKICAgICAgICAgICAgICAgICBzZWxm
LnRvbGVyYW5jZV91c2VkX2Zvcl9kaWZmX2ltYWdlID0gc2VsZi5fb3B0aW9ucy50b2xlcmFuY2UK
ICAgICAgICAgICAgICAgICByZXR1cm4gVHJ1ZQogCkluZGV4OiBUb29scy9TY3JpcHRzL3dlYmtp
dHB5L2xheW91dF90ZXN0cy9sYXlvdXRfcGFja2FnZS9zaW5nbGVfdGVzdF9ydW5uZXIucHkKPT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PQotLS0gVG9vbHMvU2NyaXB0cy93ZWJraXRweS9sYXlvdXRfdGVzdHMvbGF5b3V0X3Bh
Y2thZ2Uvc2luZ2xlX3Rlc3RfcnVubmVyLnB5CShyZXZpc2lvbiA5MDA4NikKKysrIFRvb2xzL1Nj
cmlwdHMvd2Via2l0cHkvbGF5b3V0X3Rlc3RzL2xheW91dF9wYWNrYWdlL3NpbmdsZV90ZXN0X3J1
bm5lci5weQkod29ya2luZyBjb3B5KQpAQCAtMjY2LDE3ICsyNjYsMTkgQEAgY2xhc3MgU2luZ2xl
VGVzdFJ1bm5lcjoKICAgICAgICAgIyB0aGUgbm9ybWFsaXplZCB0ZXh0IGV4cGVjdGF0aW9uIGZp
bGVzLgogICAgICAgICByZXR1cm4gb3V0cHV0LnJlcGxhY2UoIlxyXHJcbiIsICJcclxuIikucmVw
bGFjZSgiXHJcbiIsICJcbiIpCiAKLSAgICBkZWYgX2NvbXBhcmVfaW1hZ2Uoc2VsZiwgZHJpdmVy
X291dHB1dCwgZXhwZWN0ZWRfZHJpdmVyX291dHB1dHMpOgorICAgIGRlZiBfY29tcGFyZV9pbWFn
ZShzZWxmLCBkcml2ZXJfb3V0cHV0LCBleHBlY3RlZF9kcml2ZXJfb3V0cHV0KToKICAgICAgICAg
ZmFpbHVyZXMgPSBbXQogICAgICAgICAjIElmIHdlIGRpZG4ndCBwcm9kdWNlIGEgaGFzaCBmaWxl
LCB0aGlzIHRlc3QgbXVzdCBiZSB0ZXh0LW9ubHkuCiAgICAgICAgIGlmIGRyaXZlcl9vdXRwdXQu
aW1hZ2VfaGFzaCBpcyBOb25lOgogICAgICAgICAgICAgcmV0dXJuIGZhaWx1cmVzCi0gICAgICAg
IGlmIG5vdCBleHBlY3RlZF9kcml2ZXJfb3V0cHV0cy5pbWFnZToKKyAgICAgICAgaWYgbm90IGV4
cGVjdGVkX2RyaXZlcl9vdXRwdXQuaW1hZ2U6CiAgICAgICAgICAgICBmYWlsdXJlcy5hcHBlbmQo
dGVzdF9mYWlsdXJlcy5GYWlsdXJlTWlzc2luZ0ltYWdlKCkpCi0gICAgICAgIGVsaWYgbm90IGV4
cGVjdGVkX2RyaXZlcl9vdXRwdXRzLmltYWdlX2hhc2g6CisgICAgICAgIGVsaWYgbm90IGV4cGVj
dGVkX2RyaXZlcl9vdXRwdXQuaW1hZ2VfaGFzaDoKICAgICAgICAgICAgIGZhaWx1cmVzLmFwcGVu
ZCh0ZXN0X2ZhaWx1cmVzLkZhaWx1cmVNaXNzaW5nSW1hZ2VIYXNoKCkpCi0gICAgICAgIGVsaWYg
ZHJpdmVyX291dHB1dC5pbWFnZV9oYXNoICE9IGV4cGVjdGVkX2RyaXZlcl9vdXRwdXRzLmltYWdl
X2hhc2g6Ci0gICAgICAgICAgICBmYWlsdXJlcy5hcHBlbmQodGVzdF9mYWlsdXJlcy5GYWlsdXJl
SW1hZ2VIYXNoTWlzbWF0Y2goKSkKKyAgICAgICAgZWxpZiBkcml2ZXJfb3V0cHV0LmltYWdlX2hh
c2ggIT0gZXhwZWN0ZWRfZHJpdmVyX291dHB1dC5pbWFnZV9oYXNoOgorICAgICAgICAgICAgZHJp
dmVyX291dHB1dC5pbWFnZV9kaWZmID0gc2VsZi5fcG9ydC5kaWZmX2ltYWdlKGRyaXZlcl9vdXRw
dXQuaW1hZ2UsIGV4cGVjdGVkX2RyaXZlcl9vdXRwdXQuaW1hZ2UpCisgICAgICAgICAgICBpZiBk
cml2ZXJfb3V0cHV0LmltYWdlX2RpZmY6CisgICAgICAgICAgICAgICAgZmFpbHVyZXMuYXBwZW5k
KHRlc3RfZmFpbHVyZXMuRmFpbHVyZUltYWdlSGFzaE1pc21hdGNoKCkpCiAgICAgICAgIHJldHVy
biBmYWlsdXJlcwogCiAgICAgZGVmIF9ydW5fcmVmdGVzdChzZWxmKToKSW5kZXg6IFRvb2xzL1Nj
cmlwdHMvd2Via2l0cHkvbGF5b3V0X3Rlc3RzL2xheW91dF9wYWNrYWdlL3Rlc3RfcmVzdWx0X3dy
aXRlci5weQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09Ci0tLSBUb29scy9TY3JpcHRzL3dlYmtpdHB5L2xheW91dF90ZXN0
cy9sYXlvdXRfcGFja2FnZS90ZXN0X3Jlc3VsdF93cml0ZXIucHkJKHJldmlzaW9uIDkwMDg2KQor
KysgVG9vbHMvU2NyaXB0cy93ZWJraXRweS9sYXlvdXRfdGVzdHMvbGF5b3V0X3BhY2thZ2UvdGVz
dF9yZXN1bHRfd3JpdGVyLnB5CSh3b3JraW5nIGNvcHkpCkBAIC00MSw4ICs0MSw2IEBAIGRlZiB3
cml0ZV90ZXN0X3Jlc3VsdChwb3J0LCBmaWxlbmFtZSwgZHIKICAgICAgICAgICAgICAgICAgICAg
ICBleHBlY3RlZF9kcml2ZXJfb3V0cHV0LCBmYWlsdXJlcyk6CiAgICAgIiIiV3JpdGUgdGhlIHRl
c3QgcmVzdWx0IHRvIHRoZSByZXN1bHQgb3V0cHV0IGRpcmVjdG9yeS4iIiIKICAgICByb290X291
dHB1dF9kaXIgPSBwb3J0LnJlc3VsdHNfZGlyZWN0b3J5KCkKLSAgICBjaGVja3N1bXNfbWlzbWF0
Y2hfYnV0X2ltYWdlc19hcmVfc2FtZSA9IEZhbHNlCi0gICAgaW1hZ2VoYXNoX21pc21hdGNoX2Zh
aWx1cmUgPSBOb25lCiAgICAgd3JpdGVyID0gVGVzdFJlc3VsdFdyaXRlcihwb3J0LCByb290X291
dHB1dF9kaXIsIGZpbGVuYW1lKQogICAgIGlmIGRyaXZlcl9vdXRwdXQuZXJyb3I6CiAgICAgICAg
IHdyaXRlci53cml0ZV9zdGRlcnIoZHJpdmVyX291dHB1dC5lcnJvcikKQEAgLTYwLDExICs1OCw3
IEBAIGRlZiB3cml0ZV90ZXN0X3Jlc3VsdChwb3J0LCBmaWxlbmFtZSwgZHIKICAgICAgICAgICAg
IHdyaXRlci53cml0ZV9pbWFnZV9maWxlcyhkcml2ZXJfb3V0cHV0LmltYWdlLCBleHBlY3RlZF9k
cml2ZXJfb3V0cHV0LmltYWdlKQogICAgICAgICBlbGlmIGlzaW5zdGFuY2UoZmFpbHVyZSwgdGVz
dF9mYWlsdXJlcy5GYWlsdXJlSW1hZ2VIYXNoTWlzbWF0Y2gpOgogICAgICAgICAgICAgd3JpdGVy
LndyaXRlX2ltYWdlX2ZpbGVzKGRyaXZlcl9vdXRwdXQuaW1hZ2UsIGV4cGVjdGVkX2RyaXZlcl9v
dXRwdXQuaW1hZ2UpCi0gICAgICAgICAgICBpbWFnZXNfYXJlX2RpZmZlcmVudCA9IHdyaXRlci5j
cmVhdGVfaW1hZ2VfZGlmZl9hbmRfd3JpdGVfcmVzdWx0KAotICAgICAgICAgICAgICAgIGRyaXZl
cl9vdXRwdXQuaW1hZ2UsIGV4cGVjdGVkX2RyaXZlcl9vdXRwdXQuaW1hZ2UpCi0gICAgICAgICAg
ICBpZiBub3QgaW1hZ2VzX2FyZV9kaWZmZXJlbnQ6Ci0gICAgICAgICAgICAgICAgY2hlY2tzdW1z
X21pc21hdGNoX2J1dF9pbWFnZXNfYXJlX3NhbWUgPSBUcnVlCi0gICAgICAgICAgICAgICAgaW1h
Z2VoYXNoX21pc21hdGNoX2ZhaWx1cmUgPSBmYWlsdXJlCisgICAgICAgICAgICB3cml0ZXIud3Jp
dGVfaW1hZ2VfZGlmZl9maWxlcyhkcml2ZXJfb3V0cHV0LmltYWdlX2RpZmYpCiAgICAgICAgIGVs
aWYgaXNpbnN0YW5jZShmYWlsdXJlLCAodGVzdF9mYWlsdXJlcy5GYWlsdXJlQXVkaW9NaXNtYXRj
aCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXN0X2ZhaWx1cmVzLkZhaWx1
cmVNaXNzaW5nQXVkaW8pKToKICAgICAgICAgICAgIHdyaXRlci53cml0ZV9hdWRpb19maWxlcyhk
cml2ZXJfb3V0cHV0LmF1ZGlvLCBleHBlY3RlZF9kcml2ZXJfb3V0cHV0LmF1ZGlvKQpAQCAtNzUs
NyArNjksMTAgQEAgZGVmIHdyaXRlX3Rlc3RfcmVzdWx0KHBvcnQsIGZpbGVuYW1lLCBkcgogICAg
ICAgICAgICAgICAgIHdyaXRlci53cml0ZV9jcmFzaF9yZXBvcnQoZHJpdmVyX291dHB1dC5lcnJv
cikKICAgICAgICAgZWxpZiBpc2luc3RhbmNlKGZhaWx1cmUsIHRlc3RfZmFpbHVyZXMuRmFpbHVy
ZVJlZnRlc3RNaXNtYXRjaCk6CiAgICAgICAgICAgICB3cml0ZXIud3JpdGVfaW1hZ2VfZmlsZXMo
ZHJpdmVyX291dHB1dC5pbWFnZSwgZXhwZWN0ZWRfZHJpdmVyX291dHB1dC5pbWFnZSkKLSAgICAg
ICAgICAgIHdyaXRlci5jcmVhdGVfaW1hZ2VfZGlmZl9hbmRfd3JpdGVfcmVzdWx0KGRyaXZlcl9v
dXRwdXQuaW1hZ2UsIGV4cGVjdGVkX2RyaXZlcl9vdXRwdXQuaW1hZ2UpCisgICAgICAgICAgICAj
IEZJWE1FOiBUaGlzIHdvcmsgc2hvdWxkIGJlIGRvbmUgZWFybGllciBpbiB0aGUgcGlwZWxpbmUu
CisgICAgICAgICAgICBpbWFnZV9kaWZmID0gcG9ydC5kaWZmX2ltYWdlKGRyaXZlcl9vdXRwdXQu
aW1hZ2UsIGV4cGVjdGVkX2RyaXZlcl9vdXRwdXQuaW1hZ2UpCisgICAgICAgICAgICBpZiBpbWFn
ZV9kaWZmOgorICAgICAgICAgICAgICAgIHdyaXRlci53cml0ZV9pbWFnZV9kaWZmX2ZpbGVzKGlt
YWdlX2RpZmYpCiAgICAgICAgICAgICB3cml0ZXIuY29weV9maWxlKHBvcnQucmVmdGVzdF9leHBl
Y3RlZF9maWxlbmFtZShmaWxlbmFtZSksICctZXhwZWN0ZWQuaHRtbCcpCiAgICAgICAgIGVsaWYg
aXNpbnN0YW5jZShmYWlsdXJlLCB0ZXN0X2ZhaWx1cmVzLkZhaWx1cmVSZWZ0ZXN0TWlzbWF0Y2hE
aWROb3RPY2N1cik6CiAgICAgICAgICAgICB3cml0ZXIud3JpdGVfaW1hZ2VfZmlsZXMoZHJpdmVy
X291dHB1dC5pbWFnZSwgZXhwZWN0ZWRfaW1hZ2U9Tm9uZSkKQEAgLTgzLDE1ICs4MCw2IEBAIGRl
ZiB3cml0ZV90ZXN0X3Jlc3VsdChwb3J0LCBmaWxlbmFtZSwgZHIKICAgICAgICAgZWxzZToKICAg
ICAgICAgICAgIGFzc2VydCBpc2luc3RhbmNlKGZhaWx1cmUsICh0ZXN0X2ZhaWx1cmVzLkZhaWx1
cmVUaW1lb3V0LCkpCiAKLSAgICAjIEZJWE1FOiBUaGlzIGlzIGFuIHVnbHkgaGFjayB0byBoYW5k
bGUgRmFpbHVyZUltYWdlSGFzaEluY29ycmVjdCBjYXNlLgotICAgICMgSWRlYWxseSwgRmFpbHVy
ZUltYWdlSGFzaEluY29ycmVjdCBjYXNlIHNob3VsZCBiZSBkZXRlY3RlZCBiZWZvcmUgdGhpcwot
ICAgICMgZnVuY3Rpb24gaXMgY2FsbGVkLiBCdXQgaXQgcmVxdWlyZXMgY2FsbGluZyBjcmVhdGVf
ZGlmZl9pbWFnZSgpIHRvIGRldGVjdAotICAgICMgd2hldGhlciB0d28gaW1hZ2VzIGFyZSBzYW1l
IG9yIG5vdC4gU28gd2UgbmVlZCB0aGlzIGhhY2sgdW50aWwgd2UgaGF2ZSBhIGJldHRlciBhcHBy
b2FjaC4KLSAgICBpZiBjaGVja3N1bXNfbWlzbWF0Y2hfYnV0X2ltYWdlc19hcmVfc2FtZToKLSAg
ICAgICAgIyBSZXBsYWNlIEZhaWx1cmVJbWFnZUhhc2hNaXNtYXRjaCB3aXRoIEZhaWx1cmVJbWFn
ZUhhc2hJbmNvcnJlY3QuCi0gICAgICAgIGZhaWx1cmVzLnJlbW92ZShpbWFnZWhhc2hfbWlzbWF0
Y2hfZmFpbHVyZSkKLSAgICAgICAgZmFpbHVyZXMuYXBwZW5kKHRlc3RfZmFpbHVyZXMuRmFpbHVy
ZUltYWdlSGFzaEluY29ycmVjdCgpKQotCiAKIGNsYXNzIFRlc3RSZXN1bHRXcml0ZXIob2JqZWN0
KToKICAgICAiIiJBIGNsYXNzIHdoaWNoIGhhbmRsZXMgYWxsIHdyaXRpbmcgb3BlcmF0aW9ucyB0
byB0aGUgcmVzdWx0IGRpcmVjdG9yeS4iIiIKQEAgLTIxNSwxOSArMjAzLDEwIEBAIGNsYXNzIFRl
c3RSZXN1bHRXcml0ZXIob2JqZWN0KToKICAgICBkZWYgd3JpdGVfaW1hZ2VfZmlsZXMoc2VsZiwg
YWN0dWFsX2ltYWdlLCBleHBlY3RlZF9pbWFnZSk6CiAgICAgICAgIHNlbGYud3JpdGVfb3V0cHV0
X2ZpbGVzKCcucG5nJywgYWN0dWFsX2ltYWdlLCBleHBlY3RlZF9pbWFnZSkKIAotICAgIGRlZiBj
cmVhdGVfaW1hZ2VfZGlmZl9hbmRfd3JpdGVfcmVzdWx0KHNlbGYsIGFjdHVhbF9pbWFnZSwgZXhw
ZWN0ZWRfaW1hZ2UpOgotICAgICAgICAiIiJXcml0ZXMgdGhlIHZpc3VhbCBkaWZmIG9mIHRoZSBl
eHBlY3RlZC9hY3R1YWwgUE5Hcy4KLQotICAgICAgICBSZXR1cm5zIFRydWUgaWYgdGhlIGltYWdl
cyBhcmUgZGlmZmVyZW50LgotICAgICAgICAiIiIKLSAgICAgICAgIyBGSVhNRTogVGhpcyBmdW5j
dGlvbiBpcyBhY3R1YWxseSBkb2luZyB0aGUgZGlmZiBhcyB3ZWxsIGFzIHdyaXRpbmcgYSByZXN1
bHQuCi0gICAgICAgICMgSXQgbWlnaHQgYmUgYmV0dGVyIHRvIGV4dHJhY3QgJ2RpZmYnIGNvZGUg
YW5kIG1ha2UgaXQgYSBzZXBhcmF0ZSBmdW5jdGlvbi4KLSAgICAgICAgIyBUbyBkbyBzbywgd2Ug
aGF2ZSB0byBjaGFuZ2UgcG9ydC5kaWZmX2ltYWdlKCkgYXMgd2VsbC4KKyAgICBkZWYgd3JpdGVf
aW1hZ2VfZGlmZl9maWxlcyhzZWxmLCBpbWFnZV9kaWZmKToKICAgICAgICAgZGlmZl9maWxlbmFt
ZSA9IHNlbGYub3V0cHV0X2ZpbGVuYW1lKHNlbGYuRklMRU5BTUVfU1VGRklYX0lNQUdFX0RJRkYp
Ci0gICAgICAgIGltYWdlc19hcmVfZGlmZmVyZW50ID0gc2VsZi5fcG9ydC5kaWZmX2ltYWdlKGFj
dHVhbF9pbWFnZSwgZXhwZWN0ZWRfaW1hZ2UsIGRpZmZfZmlsZW5hbWUpCi0KLSAgICAgICAgaWYg
bm90IGltYWdlc19hcmVfZGlmZmVyZW50OgotICAgICAgICAgICAgcmV0dXJuIEZhbHNlCisgICAg
ICAgIGZzID0gc2VsZi5fcG9ydC5fZmlsZXN5c3RlbQorICAgICAgICBmcy53cml0ZV9iaW5hcnlf
ZmlsZShkaWZmX2ZpbGVuYW1lLCBpbWFnZV9kaWZmKQogCiAgICAgICAgIGRpZmZzX2h0bWxfZmls
ZW5hbWUgPSBzZWxmLm91dHB1dF9maWxlbmFtZShzZWxmLkZJTEVOQU1FX1NVRkZJWF9JTUFHRV9E
SUZGU19IVE1MKQogICAgICAgICAjIEZJWE1FOiBvbGQtcnVuLXdlYmtpdC10ZXN0cyBzaG93cyB0
aGUgZGlmZiBwZXJjZW50YWdlIGFzIHRoZSB0ZXh0IGNvbnRlbnRzIG9mIHRoZSAiZGlmZiIgbGlu
ay4KQEAgLTI3OCwxMSArMjU3LDE0IEBAIERpZmZlcmVuY2UgYmV0d2VlbiBpbWFnZXM6IDxhIGhy
ZWY9IiUoZGkKIDwvc2NyaXB0PgogPC9ib2R5PgogPC9odG1sPgotIiIiICUgeyAndGl0bGUnOiBz
ZWxmLl90ZXN0bmFtZSwgJ2RpZmZfZmlsZW5hbWUnOiBzZWxmLl9vdXRwdXRfdGVzdG5hbWUoJy1k
aWZmLnBuZycpLCAncHJlZml4Jzogc2VsZi5fb3V0cHV0X3Rlc3RuYW1lKCcnKSB9CisiIiIgJSB7
CisgICAgICAgICAgICAndGl0bGUnOiBzZWxmLl90ZXN0bmFtZSwKKyAgICAgICAgICAgICdkaWZm
X2ZpbGVuYW1lJzogc2VsZi5fb3V0cHV0X3Rlc3RuYW1lKHNlbGYuRklMRU5BTUVfU1VGRklYX0lN
QUdFX0RJRkYpLAorICAgICAgICAgICAgJ3ByZWZpeCc6IHNlbGYuX291dHB1dF90ZXN0bmFtZSgn
JyksCisgICAgICAgIH0KKyAgICAgICAgIyBGSVhNRTogVGhpcyBzZWVtcyBsaWtlIGEgdGV4dCBm
aWxlLCBub3QgYSBiaW5hcnkgZmlsZS4KICAgICAgICAgc2VsZi5fcG9ydC5fZmlsZXN5c3RlbS53
cml0ZV9iaW5hcnlfZmlsZShkaWZmc19odG1sX2ZpbGVuYW1lLCBodG1sKQogCi0gICAgICAgIHJl
dHVybiBUcnVlCi0KICAgICBkZWYgY29weV9maWxlKHNlbGYsIHNyY19maWxlcGF0aCwgZHN0X2V4
dGVuc2lvbik6CiAgICAgICAgIGZzID0gc2VsZi5fcG9ydC5fZmlsZXN5c3RlbQogICAgICAgICBh
c3NlcnQgZnMuZXhpc3RzKHNyY19maWxlcGF0aCksICdzcmNfZmlsZXBhdGg6ICVzJyAlIHNyY19m
aWxlcGF0aApJbmRleDogVG9vbHMvU2NyaXB0cy93ZWJraXRweS9sYXlvdXRfdGVzdHMvcG9ydC9i
YXNlLnB5Cj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT0KLS0tIFRvb2xzL1NjcmlwdHMvd2Via2l0cHkvbGF5b3V0X3Rlc3Rz
L3BvcnQvYmFzZS5weQkocmV2aXNpb24gOTAwODYpCisrKyBUb29scy9TY3JpcHRzL3dlYmtpdHB5
L2xheW91dF90ZXN0cy9wb3J0L2Jhc2UucHkJKHdvcmtpbmcgY29weSkKQEAgLTI0NCwxNiArMjQ0
LDExIEBAIGNsYXNzIFBvcnQob2JqZWN0KToKICAgICAgICAgIiIiUmV0dXJuIHdoZXRoZXIgdGhl
IHR3byBhdWRpbyBmaWxlcyBhcmUgKm5vdCogZXF1YWwuIiIiCiAgICAgICAgIHJldHVybiBleHBl
Y3RlZF9hdWRpbyAhPSBhY3R1YWxfYXVkaW8KIAotICAgIGRlZiBkaWZmX2ltYWdlKHNlbGYsIGV4
cGVjdGVkX2NvbnRlbnRzLCBhY3R1YWxfY29udGVudHMsIGRpZmZfZmlsZW5hbWU9Tm9uZSwgdG9s
ZXJhbmNlPTApOgotICAgICAgICAiIiJDb21wYXJlIHR3byBpbWFnZXMgYW5kIHByb2R1Y2UgYSBk
ZWx0YSBpbWFnZSBmaWxlLgotCi0gICAgICAgIFJldHVybiBUcnVlIGlmIHRoZSB0d28gaW1hZ2Vz
IGFyZSBkaWZmZXJlbnQsIEZhbHNlIGlmIHRoZXkgYXJlIHRoZSBzYW1lLgotICAgICAgICBBbHNv
IHByb2R1Y2UgYSBkZWx0YSBpbWFnZSBvZiB0aGUgdHdvIGltYWdlcyBhbmQgd3JpdGUgdGhhdCBp
bnRvCi0gICAgICAgIHxkaWZmX2ZpbGVuYW1lfCBpZiBpdCBpcyBub3QgTm9uZS4KKyAgICBkZWYg
ZGlmZl9pbWFnZShzZWxmLCBleHBlY3RlZF9jb250ZW50cywgYWN0dWFsX2NvbnRlbnRzLCB0b2xl
cmFuY2U9MCk6CisgICAgICAgICIiIkNvbXBhcmUgdHdvIGltYWdlcyBhbmQgcmV0dXJuIGFuIGlt
YWdlIGRpZmYuCiAKICAgICAgICAgfHRvbGVyYW5jZXwgc2hvdWxkIGJlIGEgcGVyY2VudGFnZSB2
YWx1ZSAoMC4wIC0gMTAwLjApLgogICAgICAgICBJZiBpdCBpcyBvbWl0dGVkLCB0aGUgcG9ydCBk
ZWZhdWx0IHRvbGVyYW5jZSB2YWx1ZSBpcyB1c2VkLgotCiAgICAgICAgICIiIgogICAgICAgICBy
YWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKCdQb3J0LmRpZmZfaW1hZ2UnKQogCkBAIC05MzksNiAr
OTM0LDcgQEAgY2xhc3MgRHJpdmVyT3V0cHV0KG9iamVjdCk6CiAgICAgICAgIHNlbGYudGV4dCA9
IHRleHQKICAgICAgICAgc2VsZi5pbWFnZSA9IGltYWdlCiAgICAgICAgIHNlbGYuaW1hZ2VfaGFz
aCA9IGltYWdlX2hhc2gKKyAgICAgICAgc2VsZi5pbWFnZV9kaWZmID0gTm9uZSAgIyBpbWFnZV9k
aWZmIGdldHMgZmlsbGVkIGluIGFmdGVyIGNvbnN0cnVjdGlvbi4KICAgICAgICAgc2VsZi5hdWRp
byA9IGF1ZGlvCiAgICAgICAgIHNlbGYuY3Jhc2ggPSBjcmFzaAogICAgICAgICBzZWxmLnRlc3Rf
dGltZSA9IHRlc3RfdGltZQpJbmRleDogVG9vbHMvU2NyaXB0cy93ZWJraXRweS9sYXlvdXRfdGVz
dHMvcG9ydC9jaHJvbWl1bS5weQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBUb29scy9TY3JpcHRzL3dlYmtpdHB5
L2xheW91dF90ZXN0cy9wb3J0L2Nocm9taXVtLnB5CShyZXZpc2lvbiA5MDA4NikKKysrIFRvb2xz
L1NjcmlwdHMvd2Via2l0cHkvbGF5b3V0X3Rlc3RzL3BvcnQvY2hyb21pdW0ucHkJKHdvcmtpbmcg
Y29weSkKQEAgLTEzOCw4ICsxMzgsNyBAQCBjbGFzcyBDaHJvbWl1bVBvcnQoYmFzZS5Qb3J0KToK
ICAgICAgICAgcmV0dXJuIHNlbGYuX2NoZWNrX2ZpbGVfZXhpc3RzKGltYWdlX2RpZmZfcGF0aCwg
J2ltYWdlIGRpZmYgZXhlJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
IG92ZXJyaWRlX3N0ZXAsIGxvZ2dpbmcpCiAKLSAgICBkZWYgZGlmZl9pbWFnZShzZWxmLCBleHBl
Y3RlZF9jb250ZW50cywgYWN0dWFsX2NvbnRlbnRzLAotICAgICAgICAgICAgICAgICAgIGRpZmZf
ZmlsZW5hbWU9Tm9uZSk6CisgICAgZGVmIGRpZmZfaW1hZ2Uoc2VsZiwgZXhwZWN0ZWRfY29udGVu
dHMsIGFjdHVhbF9jb250ZW50cyk6CiAgICAgICAgICMgRklYTUU6IG5lZWQgdW5pdCB0ZXN0cyBm
b3IgdGhpcy4KICAgICAgICAgaWYgbm90IGFjdHVhbF9jb250ZW50cyBhbmQgbm90IGV4cGVjdGVk
X2NvbnRlbnRzOgogICAgICAgICAgICAgcmV0dXJuIEZhbHNlCkBAIC0xNDcsMzkgKzE0Niw0MCBA
QCBjbGFzcyBDaHJvbWl1bVBvcnQoYmFzZS5Qb3J0KToKICAgICAgICAgICAgIHJldHVybiBUcnVl
CiAKICAgICAgICAgdGVtcGRpciA9IHNlbGYuX2ZpbGVzeXN0ZW0ubWtkdGVtcCgpCisKICAgICAg
ICAgZXhwZWN0ZWRfZmlsZW5hbWUgPSBzZWxmLl9maWxlc3lzdGVtLmpvaW4oc3RyKHRlbXBkaXIp
LCAiZXhwZWN0ZWQucG5nIikKICAgICAgICAgc2VsZi5fZmlsZXN5c3RlbS53cml0ZV9iaW5hcnlf
ZmlsZShleHBlY3RlZF9maWxlbmFtZSwgZXhwZWN0ZWRfY29udGVudHMpCisKICAgICAgICAgYWN0
dWFsX2ZpbGVuYW1lID0gc2VsZi5fZmlsZXN5c3RlbS5qb2luKHN0cih0ZW1wZGlyKSwgImFjdHVh
bC5wbmciKQogICAgICAgICBzZWxmLl9maWxlc3lzdGVtLndyaXRlX2JpbmFyeV9maWxlKGFjdHVh
bF9maWxlbmFtZSwgYWN0dWFsX2NvbnRlbnRzKQogCisgICAgICAgIGRpZmZfZmlsZW5hbWUgPSBz
ZWxmLl9maWxlc3lzdGVtLmpvaW4oc3RyKHRlbXBkaXIpLCAiZGlmZi5wbmciKQorCiAgICAgICAg
IGV4ZWN1dGFibGUgPSBzZWxmLl9wYXRoX3RvX2ltYWdlX2RpZmYoKQotICAgICAgICBpZiBkaWZm
X2ZpbGVuYW1lOgotICAgICAgICAgICAgY21kID0gW2V4ZWN1dGFibGUsICctLWRpZmYnLCBleHBl
Y3RlZF9maWxlbmFtZSwKLSAgICAgICAgICAgICAgICAgICBhY3R1YWxfZmlsZW5hbWUsIGRpZmZf
ZmlsZW5hbWVdCi0gICAgICAgIGVsc2U6Ci0gICAgICAgICAgICBjbWQgPSBbZXhlY3V0YWJsZSwg
ZXhwZWN0ZWRfZmlsZW5hbWUsIGFjdHVhbF9maWxlbmFtZV0KKyAgICAgICAgY29tYW5kID0gW2V4
ZWN1dGFibGUsICctLWRpZmYnLCBleHBlY3RlZF9maWxlbmFtZSwgYWN0dWFsX2ZpbGVuYW1lLCBk
aWZmX2ZpbGVuYW1lXQogCi0gICAgICAgIHJlc3VsdCA9IFRydWUKKyAgICAgICAgcmVzdWx0ID0g
Tm9uZQogICAgICAgICB0cnk6Ci0gICAgICAgICAgICBleGl0X2NvZGUgPSBzZWxmLl9leGVjdXRp
dmUucnVuX2NvbW1hbmQoY21kLCByZXR1cm5fZXhpdF9jb2RlPVRydWUpCisgICAgICAgICAgICBl
eGl0X2NvZGUgPSBzZWxmLl9leGVjdXRpdmUucnVuX2NvbW1hbmQoY29tYW5kLCByZXR1cm5fZXhp
dF9jb2RlPVRydWUpCiAgICAgICAgICAgICBpZiBleGl0X2NvZGUgPT0gMDoKICAgICAgICAgICAg
ICAgICAjIFRoZSBpbWFnZXMgYXJlIHRoZSBzYW1lLgotICAgICAgICAgICAgICAgIHJlc3VsdCA9
IEZhbHNlCisgICAgICAgICAgICAgICAgcmVzdWx0ID0gTm9uZQogICAgICAgICAgICAgZWxpZiBl
eGl0X2NvZGUgIT0gMToKLSAgICAgICAgICAgICAgICBfbG9nLmVycm9yKCJpbWFnZSBkaWZmIHJl
dHVybmVkIGFuIGV4aXQgY29kZSBvZiAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICArIHN0
cihleGl0X2NvZGUpKQorICAgICAgICAgICAgICAgIF9sb2cuZXJyb3IoImltYWdlIGRpZmYgcmV0
dXJuZWQgYW4gZXhpdCBjb2RlIG9mICVzIiAlIGV4aXRfY29kZSkKICAgICAgICAgICAgICAgICAj
IFJldHVybmluZyBGYWxzZSBoZXJlIGNhdXNlcyB0aGUgc2NyaXB0IHRvIHRoaW5rIHRoYXQgd2UK
ICAgICAgICAgICAgICAgICAjIHN1Y2Nlc3NmdWxseSBjcmVhdGVkIHRoZSBkaWZmIGV2ZW4gdGhv
dWdoIHdlIGRpZG4ndC4gIElmCiAgICAgICAgICAgICAgICAgIyB3ZSByZXR1cm4gVHJ1ZSwgd2Ug
dGhpbmsgdGhhdCB0aGUgaW1hZ2VzIG1hdGNoIGJ1dCB0aGUgaGFzaGVzCiAgICAgICAgICAgICAg
ICAgIyBkb24ndCBtYXRjaC4KICAgICAgICAgICAgICAgICAjIEZJWE1FOiBGaWd1cmUgb3V0IHdo
eSBpbWFnZV9kaWZmIHJldHVybnMgb3RoZXIgdmFsdWVzLgotICAgICAgICAgICAgICAgIHJlc3Vs
dCA9IEZhbHNlCisgICAgICAgICAgICAgICAgcmVzdWx0ID0gTm9uZQogICAgICAgICBleGNlcHQg
T1NFcnJvciwgZToKICAgICAgICAgICAgIGlmIGUuZXJybm8gPT0gZXJybm8uRU5PRU5UIG9yIGUu
ZXJybm8gPT0gZXJybm8uRUFDQ0VTOgogICAgICAgICAgICAgICAgIF9jb21wYXJlX2F2YWlsYWJs
ZSA9IEZhbHNlCiAgICAgICAgICAgICBlbHNlOgotICAgICAgICAgICAgICAgIHJhaXNlIGUKKyAg
ICAgICAgICAgICAgICByYWlzZQogICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgaWYgZXhp
dF9jb2RlID09IDE6CisgICAgICAgICAgICAgICAgcmVzdWx0ID0gc2VsZi5fZmlsZXN5c3RlbS5y
ZWFkX2JpbmFyeV9maWxlKGRpZmZfZmlsZW5hbWUpCiAgICAgICAgICAgICBzZWxmLl9maWxlc3lz
dGVtLnJtdHJlZShzdHIodGVtcGRpcikpCiAgICAgICAgIHJldHVybiByZXN1bHQKIApJbmRleDog
VG9vbHMvU2NyaXB0cy93ZWJraXRweS9sYXlvdXRfdGVzdHMvcG9ydC9jaHJvbWl1bV91bml0dGVz
dC5weQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09Ci0tLSBUb29scy9TY3JpcHRzL3dlYmtpdHB5L2xheW91dF90ZXN0cy9w
b3J0L2Nocm9taXVtX3VuaXR0ZXN0LnB5CShyZXZpc2lvbiA5MDA4NikKKysrIFRvb2xzL1Njcmlw
dHMvd2Via2l0cHkvbGF5b3V0X3Rlc3RzL3BvcnQvY2hyb21pdW1fdW5pdHRlc3QucHkJKHdvcmtp
bmcgY29weSkKQEAgLTIxNCwxMyArMjE0LDE5IEBAIExJTlVYIFdJTiA6IGZhc3QvanMvdmVyeS1n
b29kLmpzID0gVElNRU8KICAgICAgICAgbW9ja19vcHRpb25zID0gbW9ja3Rvb2wuTW9ja09wdGlv
bnMoKQogICAgICAgICBwb3J0ID0gQ2hyb21pdW1Qb3J0VGVzdC5UZXN0TGludXhQb3J0KG1vY2tf
b3B0aW9ucykKIAorICAgICAgICBtb2NrX2ltYWdlX2RpZmYgPSAiTU9DSyBJbWFnZSBEaWZmIgor
CisgICAgICAgIGRlZiBtb2NrX3J1bl9jb21tYW5kKGFyZ3MpOgorICAgICAgICAgICAgcG9ydC5f
ZmlsZXN5c3RlbS53cml0ZV9iaW5hcnlfZmlsZShhcmdzWzRdLCBtb2NrX2ltYWdlX2RpZmYpCisg
ICAgICAgICAgICByZXR1cm4gMQorCiAgICAgICAgICMgSW1hZ2VzIGFyZSBkaWZmZXJlbnQuCi0g
ICAgICAgIHBvcnQuX2V4ZWN1dGl2ZSA9IGV4ZWN1dGl2ZV9tb2NrLk1vY2tFeGVjdXRpdmUyKGV4
aXRfY29kZT0wKQotICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhGYWxzZSwgcG9ydC5kaWZmX2lt
YWdlKCJFWFBFQ1RFRCIsICJBQ1RVQUwiKSkKKyAgICAgICAgcG9ydC5fZXhlY3V0aXZlID0gZXhl
Y3V0aXZlX21vY2suTW9ja0V4ZWN1dGl2ZTIocnVuX2NvbW1hbmRfZm49bW9ja19ydW5fY29tbWFu
ZCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMobW9ja19pbWFnZV9kaWZmLCBwb3J0LmRpZmZf
aW1hZ2UoIkVYUEVDVEVEIiwgIkFDVFVBTCIpKQogCiAgICAgICAgICMgSW1hZ2VzIGFyZSB0aGUg
c2FtZS4KLSAgICAgICAgcG9ydC5fZXhlY3V0aXZlID0gZXhlY3V0aXZlX21vY2suTW9ja0V4ZWN1
dGl2ZTIoZXhpdF9jb2RlPTEpCi0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKFRydWUsIHBvcnQu
ZGlmZl9pbWFnZSgiRVhQRUNURUQiLCAiQUNUVUFMIikpCisgICAgICAgIHBvcnQuX2V4ZWN1dGl2
ZSA9IGV4ZWN1dGl2ZV9tb2NrLk1vY2tFeGVjdXRpdmUyKGV4aXRfY29kZT0wKQorICAgICAgICBz
ZWxmLmFzc2VydEVxdWFscyhOb25lLCBwb3J0LmRpZmZfaW1hZ2UoIkVYUEVDVEVEIiwgIkFDVFVB
TCIpKQogCiAgICAgICAgICMgVGhlcmUgd2FzIHNvbWUgZXJyb3IgcnVubmluZyBpbWFnZV9kaWZm
LgogICAgICAgICBwb3J0Ll9leGVjdXRpdmUgPSBleGVjdXRpdmVfbW9jay5Nb2NrRXhlY3V0aXZl
MihleGl0X2NvZGU9MikKSW5kZXg6IFRvb2xzL1NjcmlwdHMvd2Via2l0cHkvbGF5b3V0X3Rlc3Rz
L3BvcnQvcG9ydF90ZXN0Y2FzZS5weQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBUb29scy9TY3JpcHRzL3dlYmtp
dHB5L2xheW91dF90ZXN0cy9wb3J0L3BvcnRfdGVzdGNhc2UucHkJKHJldmlzaW9uIDkwMDg2KQor
KysgVG9vbHMvU2NyaXB0cy93ZWJraXRweS9sYXlvdXRfdGVzdHMvcG9ydC9wb3J0X3Rlc3RjYXNl
LnB5CSh3b3JraW5nIGNvcHkpCkBAIC0yMjksMjQgKzIyOSwyNCBAQCBjbGFzcyBQb3J0VGVzdENh
c2UodW5pdHRlc3QuVGVzdENhc2UpOgogICAgICAgICBwb3J0ID0gc2VsZi5tYWtlX3BvcnQoKQog
ICAgICAgICBpZiBub3QgcG9ydDoKICAgICAgICAgICAgIHJldHVybgotICAgICAgICBzZWxmLmFz
c2VydEZhbHNlKHBvcnQuZGlmZl9pbWFnZShOb25lLCBOb25lLCBOb25lKSkKLSAgICAgICAgc2Vs
Zi5hc3NlcnRGYWxzZShwb3J0LmRpZmZfaW1hZ2UoTm9uZSwgJycsIE5vbmUpKQotICAgICAgICBz
ZWxmLmFzc2VydEZhbHNlKHBvcnQuZGlmZl9pbWFnZSgnJywgTm9uZSwgTm9uZSkpCi0gICAgICAg
IHNlbGYuYXNzZXJ0RmFsc2UocG9ydC5kaWZmX2ltYWdlKCcnLCAnJywgTm9uZSkpCisgICAgICAg
IHNlbGYuYXNzZXJ0RmFsc2UocG9ydC5kaWZmX2ltYWdlKE5vbmUsIE5vbmUpKQorICAgICAgICBz
ZWxmLmFzc2VydEZhbHNlKHBvcnQuZGlmZl9pbWFnZShOb25lLCAnJykpCisgICAgICAgIHNlbGYu
YXNzZXJ0RmFsc2UocG9ydC5kaWZmX2ltYWdlKCcnLCBOb25lKSkKKyAgICAgICAgc2VsZi5hc3Nl
cnRGYWxzZShwb3J0LmRpZmZfaW1hZ2UoJycsICcnKSkKIAogICAgIGRlZiB0ZXN0X2RpZmZfaW1h
Z2VfX21pc3NpbmdfYWN0dWFsKHNlbGYpOgogICAgICAgICBwb3J0ID0gc2VsZi5tYWtlX3BvcnQo
KQogICAgICAgICBpZiBub3QgcG9ydDoKICAgICAgICAgICAgIHJldHVybgotICAgICAgICBzZWxm
LmFzc2VydFRydWUocG9ydC5kaWZmX2ltYWdlKE5vbmUsICdmb28nLCBOb25lKSkKLSAgICAgICAg
c2VsZi5hc3NlcnRUcnVlKHBvcnQuZGlmZl9pbWFnZSgnJywgJ2ZvbycsIE5vbmUpKQorICAgICAg
ICBzZWxmLmFzc2VydFRydWUocG9ydC5kaWZmX2ltYWdlKE5vbmUsICdmb28nKSkKKyAgICAgICAg
c2VsZi5hc3NlcnRUcnVlKHBvcnQuZGlmZl9pbWFnZSgnJywgJ2ZvbycpKQogCiAgICAgZGVmIHRl
c3RfZGlmZl9pbWFnZV9fbWlzc2luZ19leHBlY3RlZChzZWxmKToKICAgICAgICAgcG9ydCA9IHNl
bGYubWFrZV9wb3J0KCkKICAgICAgICAgaWYgbm90IHBvcnQ6CiAgICAgICAgICAgICByZXR1cm4K
LSAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHBvcnQuZGlmZl9pbWFnZSgnZm9vJywgTm9uZSwgTm9u
ZSkpCi0gICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShwb3J0LmRpZmZfaW1hZ2UoJ2ZvbycsICcnLCBO
b25lKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHBvcnQuZGlmZl9pbWFnZSgnZm9vJywgTm9u
ZSkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShwb3J0LmRpZmZfaW1hZ2UoJ2ZvbycsICcnKSkK
IAogICAgIGRlZiB0ZXN0X2NoZWNrX2J1aWxkKHNlbGYpOgogICAgICAgICBwb3J0ID0gc2VsZi5t
YWtlX3BvcnQoKQpJbmRleDogVG9vbHMvU2NyaXB0cy93ZWJraXRweS9sYXlvdXRfdGVzdHMvcG9y
dC90ZXN0LnB5Cj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT0KLS0tIFRvb2xzL1NjcmlwdHMvd2Via2l0cHkvbGF5b3V0X3Rl
c3RzL3BvcnQvdGVzdC5weQkocmV2aXNpb24gOTAwODYpCisrKyBUb29scy9TY3JpcHRzL3dlYmtp
dHB5L2xheW91dF90ZXN0cy9wb3J0L3Rlc3QucHkJKHdvcmtpbmcgY29weSkKQEAgLTE0NCw2ICsx
NDQsOCBAQCBkZWYgdW5pdF90ZXN0X2xpc3QoKToKICAgICB0ZXN0cy5hZGQoJ2ZhaWx1cmVzL3Vu
ZXhwZWN0ZWQvdGV4dC1pbWFnZS1jaGVja3N1bS5odG1sJywKICAgICAgICAgICAgICAgYWN0dWFs
X3RleHQ9J3RleHQtaW1hZ2UtY2hlY2tzdW1fZmFpbC10eHQnLAogICAgICAgICAgICAgICBhY3R1
YWxfY2hlY2tzdW09J3RleHQtaW1hZ2UtY2hlY2tzdW1fZmFpbC1jaGVja3N1bScpCisgICAgdGVz
dHMuYWRkKCdmYWlsdXJlcy91bmV4cGVjdGVkL2NoZWNrc3VtLXdpdGgtbWF0Y2hpbmctaW1hZ2Uu
aHRtbCcsCisgICAgICAgICAgICAgIGFjdHVhbF9jaGVja3N1bT0ndGV4dC1pbWFnZS1jaGVja3N1
bV9mYWlsLWNoZWNrc3VtJykKICAgICB0ZXN0cy5hZGQoJ2ZhaWx1cmVzL3VuZXhwZWN0ZWQvdGlt
ZW91dC5odG1sJywgdGltZW91dD1UcnVlKQogICAgIHRlc3RzLmFkZCgnaHR0cC90ZXN0cy9wYXNz
ZXMvdGV4dC5odG1sJykKICAgICB0ZXN0cy5hZGQoJ2h0dHAvdGVzdHMvcGFzc2VzL2ltYWdlLmh0
bWwnKQpAQCAtMzEzLDEzICszMTUsMTEgQEAgY2xhc3MgVGVzdFBvcnQoYmFzZS5Qb3J0KToKICAg
ICBkZWYgZGVmYXVsdF9jb25maWd1cmF0aW9uKHNlbGYpOgogICAgICAgICByZXR1cm4gJ1JlbGVh
c2UnCiAKLSAgICBkZWYgZGlmZl9pbWFnZShzZWxmLCBleHBlY3RlZF9jb250ZW50cywgYWN0dWFs
X2NvbnRlbnRzLAotICAgICAgICAgICAgICAgICAgIGRpZmZfZmlsZW5hbWU9Tm9uZSk6CisgICAg
ZGVmIGRpZmZfaW1hZ2Uoc2VsZiwgZXhwZWN0ZWRfY29udGVudHMsIGFjdHVhbF9jb250ZW50cyk6
CiAgICAgICAgIGRpZmZlZCA9IGFjdHVhbF9jb250ZW50cyAhPSBleHBlY3RlZF9jb250ZW50cwot
ICAgICAgICBpZiBkaWZmZWQgYW5kIGRpZmZfZmlsZW5hbWU6Ci0gICAgICAgICAgICBzZWxmLl9m
aWxlc3lzdGVtLndyaXRlX2JpbmFyeV9maWxlKGRpZmZfZmlsZW5hbWUsCi0gICAgICAgICAgICAg
ICAgIjwgJXNcbi0tLVxuPiAlc1xuIiAlIChleHBlY3RlZF9jb250ZW50cywgYWN0dWFsX2NvbnRl
bnRzKSkKLSAgICAgICAgcmV0dXJuIGRpZmZlZAorICAgICAgICBpZiBkaWZmZWQ6CisgICAgICAg
ICAgICByZXR1cm4gIjwgJXNcbi0tLVxuPiAlc1xuIiAlIChleHBlY3RlZF9jb250ZW50cywgYWN0
dWFsX2NvbnRlbnRzKQorICAgICAgICByZXR1cm4gTm9uZQogCiAgICAgZGVmIGxheW91dF90ZXN0
c19kaXIoc2VsZik6CiAgICAgICAgIHJldHVybiBMQVlPVVRfVEVTVF9ESVIKSW5kZXg6IFRvb2xz
L1NjcmlwdHMvd2Via2l0cHkvbGF5b3V0X3Rlc3RzL3BvcnQvd2Via2l0LnB5Cj09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0K
LS0tIFRvb2xzL1NjcmlwdHMvd2Via2l0cHkvbGF5b3V0X3Rlc3RzL3BvcnQvd2Via2l0LnB5CShy
ZXZpc2lvbiA5MDA4NikKKysrIFRvb2xzL1NjcmlwdHMvd2Via2l0cHkvbGF5b3V0X3Rlc3RzL3Bv
cnQvd2Via2l0LnB5CSh3b3JraW5nIGNvcHkpCkBAIC0xMzIsMjIgKzEzMiwyMCBAQCBjbGFzcyBX
ZWJLaXRQb3J0KGJhc2UuUG9ydCk6CiAgICAgICAgICAgICByZXR1cm4gRmFsc2UKICAgICAgICAg
cmV0dXJuIFRydWUKIAotICAgIGRlZiBkaWZmX2ltYWdlKHNlbGYsIGV4cGVjdGVkX2NvbnRlbnRz
LCBhY3R1YWxfY29udGVudHMsCi0gICAgICAgICAgICAgICAgICAgZGlmZl9maWxlbmFtZT1Ob25l
KToKLSAgICAgICAgIiIiUmV0dXJuIFRydWUgaWYgdGhlIHR3byBmaWxlcyBhcmUgZGlmZmVyZW50
LiBBbHNvIHdyaXRlIGEgZGVsdGEKLSAgICAgICAgaW1hZ2Ugb2YgdGhlIHR3byBpbWFnZXMgaW50
byB8ZGlmZl9maWxlbmFtZXwgaWYgaXQgaXMgbm90IE5vbmUuIiIiCi0KKyAgICBkZWYgZGlmZl9p
bWFnZShzZWxmLCBleHBlY3RlZF9jb250ZW50cywgYWN0dWFsX2NvbnRlbnRzKToKICAgICAgICAg
IyBIYW5kbGUgdGhlIGNhc2Ugd2hlcmUgdGhlIHRlc3QgZGlkbid0IGFjdHVhbGx5IGdlbmVyYXRl
IGFuIGltYWdlLgogICAgICAgICAjIEZJWE1FOiBuZWVkIHVuaXQgdGVzdHMgZm9yIHRoaXMuCiAg
ICAgICAgIGlmIG5vdCBhY3R1YWxfY29udGVudHMgYW5kIG5vdCBleHBlY3RlZF9jb250ZW50czoK
LSAgICAgICAgICAgIHJldHVybiBGYWxzZQorICAgICAgICAgICAgcmV0dXJuIE5vbmUKICAgICAg
ICAgaWYgbm90IGFjdHVhbF9jb250ZW50cyBvciBub3QgZXhwZWN0ZWRfY29udGVudHM6CisgICAg
ICAgICAgICAjIEZJWE1FOiBJdCdzIG5vdCBjbGVhciB3aGF0IHdlIHNob3VsZCByZXR1cm4gaW4g
dGhpcyBjYXNlLgorICAgICAgICAgICAgIyBNYXliZSB3ZSBzaG91bGQgdGhyb3cgYW4gZXhjZXB0
aW9uPwogICAgICAgICAgICAgcmV0dXJuIFRydWUKIAotICAgICAgICBzcCA9IHNlbGYuX2RpZmZf
aW1hZ2VfcmVxdWVzdChleHBlY3RlZF9jb250ZW50cywgYWN0dWFsX2NvbnRlbnRzKQotICAgICAg
ICByZXR1cm4gc2VsZi5fZGlmZl9pbWFnZV9yZXBseShzcCwgZGlmZl9maWxlbmFtZSkKKyAgICAg
ICAgcHJvY2VzcyA9IHNlbGYuX2NyZWF0ZV9pbWFnZV9kaWZmX3Byb2Nlc3MoZXhwZWN0ZWRfY29u
dGVudHMsIGFjdHVhbF9jb250ZW50cykKKyAgICAgICAgcmV0dXJuIHNlbGYuX3JlYWRfaW1hZ2Vf
ZGlmZihwcm9jZXNzKQogCi0gICAgZGVmIF9kaWZmX2ltYWdlX3JlcXVlc3Qoc2VsZiwgZXhwZWN0
ZWRfY29udGVudHMsIGFjdHVhbF9jb250ZW50cyk6CisgICAgZGVmIF9jcmVhdGVfaW1hZ2VfZGlm
Zl9wcm9jZXNzKHNlbGYsIGV4cGVjdGVkX2NvbnRlbnRzLCBhY3R1YWxfY29udGVudHMpOgogICAg
ICAgICAjIEZJWE1FOiBUaGVyZSBuZWVkcyB0byBiZSBhIG1vcmUgc2FuZSB3YXkgb2YgaGFuZGxp
bmcgZGVmYXVsdAogICAgICAgICAjIHZhbHVlcyBmb3Igb3B0aW9ucyBzbyB0aGF0IHlvdSBjYW4g
ZGlzdGluZ3Vpc2ggYmV0d2VlbiBhIGRlZmF1bHQKICAgICAgICAgIyB2YWx1ZSBvZiBOb25lIGFu
ZCBhIGRlZmF1bHQgdmFsdWUgdGhhdCB3YXNuJ3Qgc2V0LgpAQCAtMTU2LDE1ICsxNTQsMTMgQEAg
Y2xhc3MgV2ViS2l0UG9ydChiYXNlLlBvcnQpOgogICAgICAgICBlbHNlOgogICAgICAgICAgICAg
dG9sZXJhbmNlID0gMC4xCiAgICAgICAgIGNvbW1hbmQgPSBbc2VsZi5fcGF0aF90b19pbWFnZV9k
aWZmKCksICctLXRvbGVyYW5jZScsIHN0cih0b2xlcmFuY2UpXQotICAgICAgICBzcCA9IHNlcnZl
cl9wcm9jZXNzLlNlcnZlclByb2Nlc3Moc2VsZiwgJ0ltYWdlRGlmZicsIGNvbW1hbmQpCisgICAg
ICAgIHByb2Nlc3MgPSBzZXJ2ZXJfcHJvY2Vzcy5TZXJ2ZXJQcm9jZXNzKHNlbGYsICdJbWFnZURp
ZmYnLCBjb21tYW5kKQogCi0gICAgICAgIHNwLndyaXRlKCdDb250ZW50LUxlbmd0aDogJWRcbiVz
Q29udGVudC1MZW5ndGg6ICVkXG4lcycgJQotICAgICAgICAgICAgICAgICAobGVuKGFjdHVhbF9j
b250ZW50cyksIGFjdHVhbF9jb250ZW50cywKLSAgICAgICAgICAgICAgICAgIGxlbihleHBlY3Rl
ZF9jb250ZW50cyksIGV4cGVjdGVkX2NvbnRlbnRzKSkKKyAgICAgICAgcHJvY2Vzcy53cml0ZSgn
Q29udGVudC1MZW5ndGg6ICVkXG4lc0NvbnRlbnQtTGVuZ3RoOiAlZFxuJXMnICUKKyAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgKGxlbihhY3R1YWxfY29udGVudHMpLCBhY3R1YWxfY29udGVu
dHMsIGxlbihleHBlY3RlZF9jb250ZW50cyksIGV4cGVjdGVkX2NvbnRlbnRzKSkKKyAgICAgICAg
cmV0dXJuIHByb2Nlc3MKIAotICAgICAgICByZXR1cm4gc3AKLQotICAgIGRlZiBfZGlmZl9pbWFn
ZV9yZXBseShzZWxmLCBzcCwgZGlmZl9maWxlbmFtZSk6CisgICAgZGVmIF9yZWFkX2ltYWdlX2Rp
ZmYoc2VsZiwgc3ApOgogICAgICAgICB0aW1lb3V0ID0gMi4wCiAgICAgICAgIGRlYWRsaW5lID0g
dGltZS50aW1lKCkgKyB0aW1lb3V0CiAgICAgICAgIG91dHB1dCA9IHNwLnJlYWRfbGluZSh0aW1l
b3V0KQpAQCAtMTgxLDE5ICsxNzcsMTYgQEAgY2xhc3MgV2ViS2l0UG9ydChiYXNlLlBvcnQpOgog
ICAgICAgICAgICAgICAgIHRpbWVvdXQgPSBkZWFkbGluZSAtIHRpbWUudGltZSgpCiAgICAgICAg
ICAgICAgICAgb3V0cHV0ID0gc3AucmVhZF9saW5lKGRlYWRsaW5lKQogCi0gICAgICAgIHJlc3Vs
dCA9IFRydWUKLSAgICAgICAgaWYgb3V0cHV0LnN0YXJ0c3dpdGgoJ2RpZmYnKToKLSAgICAgICAg
ICAgIG0gPSByZS5tYXRjaCgnZGlmZjogKC4rKSUgKHBhc3NlZHxmYWlsZWQpJywgb3V0cHV0KQot
ICAgICAgICAgICAgaWYgbS5ncm91cCgyKSA9PSAncGFzc2VkJzoKLSAgICAgICAgICAgICAgICBy
ZXN1bHQgPSBGYWxzZQotICAgICAgICBlbGlmIG91dHB1dCBhbmQgZGlmZl9maWxlbmFtZToKLSAg
ICAgICAgICAgIHNlbGYuX2ZpbGVzeXN0ZW0ud3JpdGVfYmluYXJ5X2ZpbGUoZGlmZl9maWxlbmFt
ZSwgb3V0cHV0KQotICAgICAgICBlbGlmIHNwLnRpbWVkX291dDoKKyAgICAgICAgaWYgc3AudGlt
ZWRfb3V0OgogICAgICAgICAgICAgX2xvZy5lcnJvcigiSW1hZ2VEaWZmIHRpbWVkIG91dCIpCi0g
ICAgICAgIGVsaWYgc3AuY3Jhc2hlZDoKKyAgICAgICAgaWYgc3AuY3Jhc2hlZDoKICAgICAgICAg
ICAgIF9sb2cuZXJyb3IoIkltYWdlRGlmZiBjcmFzaGVkIikKICAgICAgICAgc3Auc3RvcCgpCi0g
ICAgICAgIHJldHVybiByZXN1bHQKKyAgICAgICAgaWYgb3V0cHV0LnN0YXJ0c3dpdGgoJ2RpZmYn
KToKKyAgICAgICAgICAgIG0gPSByZS5tYXRjaCgnZGlmZjogKC4rKSUgKHBhc3NlZHxmYWlsZWQp
Jywgb3V0cHV0KQorICAgICAgICAgICAgaWYgbS5ncm91cCgyKSA9PSAncGFzc2VkJzoKKyAgICAg
ICAgICAgICAgICByZXR1cm4gTm9uZQorICAgICAgICByZXR1cm4gb3V0cHV0CiAKICAgICBkZWYg
ZGVmYXVsdF9yZXN1bHRzX2RpcmVjdG9yeShzZWxmKToKICAgICAgICAgIyBSZXN1bHRzIGFyZSBz
dG9yZSByZWxhdGl2ZSB0byB0aGUgYnVpbHQgcHJvZHVjdHMgdG8gbWFrZSBpdCBlYXN5CkluZGV4
OiBUb29scy9TY3JpcHRzL3dlYmtpdHB5L3RvX2JlX21vdmVkL3JlYmFzZWxpbmVfY2hyb21pdW1f
d2Via2l0X3Rlc3RzLnB5Cj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFRvb2xzL1NjcmlwdHMvd2Via2l0cHkvdG9f
YmVfbW92ZWQvcmViYXNlbGluZV9jaHJvbWl1bV93ZWJraXRfdGVzdHMucHkJKHJldmlzaW9uIDkw
MDg2KQorKysgVG9vbHMvU2NyaXB0cy93ZWJraXRweS90b19iZV9tb3ZlZC9yZWJhc2VsaW5lX2No
cm9taXVtX3dlYmtpdF90ZXN0cy5weQkod29ya2luZyBjb3B5KQpAQCAtNTE3LDcgKzUxNyw3IEBA
IGNsYXNzIFJlYmFzZWxpbmVyKG9iamVjdCk6CiAgICAgICAgICIiIgogCiAgICAgICAgIGlmIGlz
X2ltYWdlOgotICAgICAgICAgICAgcmV0dXJuIHNlbGYuX3BvcnQuZGlmZl9pbWFnZShvdXRwdXQx
LCBvdXRwdXQyLCBOb25lKQorICAgICAgICAgICAgcmV0dXJuIHNlbGYuX3BvcnQuZGlmZl9pbWFn
ZShvdXRwdXQxLCBvdXRwdXQyKQogCiAgICAgICAgIHJldHVybiBzZWxmLl9wb3J0LmNvbXBhcmVf
dGV4dChvdXRwdXQxLCBvdXRwdXQyKQogCkBAIC02MDIsNyArNjAyLDggQEAgY2xhc3MgUmViYXNl
bGluZXIob2JqZWN0KToKICAgICAgICAgICAgIF9sb2cuZGVidWcoJyBIdG1sOiBkaWZmaW5nICIl
cyIgYW5kICIlcyInLCBvbGRfZmlsZSwgbmV3X2ZpbGUpCiAgICAgICAgICAgICBvbGRfb3V0cHV0
ID0gc2VsZi5fZmlsZXN5c3RlbS5yZWFkX2JpbmFyeV9maWxlKG9sZF9maWxlKQogICAgICAgICAg
ICAgbmV3X291dHB1dCA9IHNlbGYuX2ZpbGVzeXN0ZW0ucmVhZF9iaW5hcnlfZmlsZShuZXdfZmls
ZSkKLSAgICAgICAgICAgIGhhc19kaWZmID0gc2VsZi5fcG9ydC5kaWZmX2ltYWdlKG9sZF9vdXRw
dXQsIG5ld19vdXRwdXQsIGRpZmZfZmlsZSkKKyAgICAgICAgICAgIGltYWdlX2RpZmYgPSBzZWxm
Ll9wb3J0LmRpZmZfaW1hZ2Uob2xkX291dHB1dCwgbmV3X291dHB1dCkKKyAgICAgICAgICAgIHNl
bGYuX2ZpbGVzeXN0ZW0ud3JpdGVfYmluYXJ5X2ZpbGUoZGlmZl9maWxlLCBpbWFnZV9kaWZmKQog
CiAgICAgICAgIGlmIGhhc19kaWZmOgogICAgICAgICAgICAgX2xvZy5kZWJ1ZygnICBIdG1sOiBj
cmVhdGVkIGJhc2VsaW5lIGRpZmYgZmlsZTogIiVzIi4nLCBkaWZmX2ZpbGUpCg==
</data>

          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>99340</attachid>
            <date>2011-06-30 11:31:26 -0700</date>
            <delta_ts>2011-06-30 12:37:05 -0700</delta_ts>
            <desc>Patch</desc>
            <filename>bug-63494-20110630113125.patch</filename>
            <type>text/plain</type>
            <size>26261</size>
            <attacher name="Adam Barth">abarth</attacher>
            
              <data encoding="base64">SW5kZXg6IFRvb2xzL0NoYW5nZUxvZwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBUb29scy9DaGFuZ2VMb2cJKHJl
dmlzaW9uIDkwMTM1KQorKysgVG9vbHMvQ2hhbmdlTG9nCSh3b3JraW5nIGNvcHkpCkBAIC0xLDMg
KzEsMzMgQEAKKzIwMTEtMDYtMzAgIEFkYW0gQmFydGggIDxhYmFydGhAd2Via2l0Lm9yZz4KKwor
ICAgICAgICBSZXZpZXdlZCBieSBOT0JPRFkgKE9PUFMhKS4KKworICAgICAgICBSRUdSRVNTSU9O
KHI4NDI5NCk6IG5ldy1ydW4td2Via2l0LXRlc3RzIHJlc3VsdHMuaHRtbCBnZW5lcmF0ZSBsaW5r
cyB0byBkaWZmcy5odG1sIG9yIGRpZmYucG5nIHRoYXQgZG9uJ3QgZXhpc3QKKyAgICAgICAgaHR0
cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTYzNDk0CisKKyAgICAgICAgVGhp
cyBwYXRjaCBkb2VzIHR3byB0aGluZ3M6CisKKyAgICAgICAgMSkgUmVmYWN0b3IgZGlmZl9pbWFn
ZSB0byByZXR1cm4gdGhlIGltYWdlIGRpZmYgaW5zdGVhZCBvZiB3cml0aW5nIHRoZQorICAgICAg
ICBkaWZmIHRvIGEgZmlsZS4gIFRoaXMgZml4ZXMgYSBidW5jaCBvZiBoYWNrcyBhbmQgZGlzZW50
YW5nbGVzIGEgYnVuY2gKKyAgICAgICAgb2YgY29kZS4KKworICAgICAgICAyKSBXaGVuIHRoZXJl
J3MgYSBjaGVja3N1bSBtaXNtYXRjaCBidXQgbm90IGltYWdlIGRpZmYsIHdlIG5vIGxvbmdlcgor
ICAgICAgICByZXBvcnQgYW4gSU1BR0UgZmFpbHVyZSB0byByZXN1bHRzLmh0bWwuICBUaGF0IGZp
eGVzIHRoZSBidWcgaW4KKyAgICAgICAgcXVlc3Rpb24gYmVjYXVzZSByZXN1bHRzLmh0bWwgd29u
J3QgdHJ5IHRvIGxpbmsgdG8gYSBub24tZXhpc3RlbnQgaW1hZ2UKKyAgICAgICAgZGlmZi4KKwor
ICAgICAgICAqIFNjcmlwdHMvd2Via2l0cHkvY29tbW9uL3N5c3RlbS9leGVjdXRpdmVfbW9jay5w
eToKKyAgICAgICAgKiBTY3JpcHRzL3dlYmtpdHB5L2xheW91dF90ZXN0cy9sYXlvdXRfcGFja2Fn
ZS9zaW5nbGVfdGVzdF9ydW5uZXIucHk6CisgICAgICAgICogU2NyaXB0cy93ZWJraXRweS9sYXlv
dXRfdGVzdHMvbGF5b3V0X3BhY2thZ2UvdGVzdF9yZXN1bHRfd3JpdGVyLnB5OgorICAgICAgICAq
IFNjcmlwdHMvd2Via2l0cHkvbGF5b3V0X3Rlc3RzL3BvcnQvYmFzZS5weToKKyAgICAgICAgKiBT
Y3JpcHRzL3dlYmtpdHB5L2xheW91dF90ZXN0cy9wb3J0L2Nocm9taXVtLnB5OgorICAgICAgICAq
IFNjcmlwdHMvd2Via2l0cHkvbGF5b3V0X3Rlc3RzL3BvcnQvY2hyb21pdW1fdW5pdHRlc3QucHk6
CisgICAgICAgICogU2NyaXB0cy93ZWJraXRweS9sYXlvdXRfdGVzdHMvcG9ydC9wb3J0X3Rlc3Rj
YXNlLnB5OgorICAgICAgICAqIFNjcmlwdHMvd2Via2l0cHkvbGF5b3V0X3Rlc3RzL3BvcnQvdGVz
dC5weToKKyAgICAgICAgKiBTY3JpcHRzL3dlYmtpdHB5L2xheW91dF90ZXN0cy9wb3J0L3dlYmtp
dC5weToKKyAgICAgICAgKiBTY3JpcHRzL3dlYmtpdHB5L2xheW91dF90ZXN0cy9ydW5fd2Via2l0
X3Rlc3RzX2ludGVncmF0aW9udGVzdC5weToKKyAgICAgICAgKiBTY3JpcHRzL3dlYmtpdHB5L3Rv
X2JlX21vdmVkL3JlYmFzZWxpbmVfY2hyb21pdW1fd2Via2l0X3Rlc3RzLnB5OgorCiAyMDExLTA2
LTMwICBac29sdCBGZWjDqXIgIDxoNDkwMjY3QHN0dWQudS1zemVnZWQuaHU+CiAKICAgICAgICAg
UmV2aWV3ZWQgYnkgQ3NhYmEgT3N6dHJvZ29uw6FjLgpJbmRleDogVG9vbHMvU2NyaXB0cy93ZWJr
aXRweS9jb21tb24vc3lzdGVtL2V4ZWN1dGl2ZV9tb2NrLnB5Cj09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFRvb2xz
L1NjcmlwdHMvd2Via2l0cHkvY29tbW9uL3N5c3RlbS9leGVjdXRpdmVfbW9jay5weQkocmV2aXNp
b24gOTAxMzUpCisrKyBUb29scy9TY3JpcHRzL3dlYmtpdHB5L2NvbW1vbi9zeXN0ZW0vZXhlY3V0
aXZlX21vY2sucHkJKHdvcmtpbmcgY29weSkKQEAgLTYxLDEwICs2MSwxMCBAQCBjbGFzcyBNb2Nr
RXhlY3V0aXZlMihvYmplY3QpOgogICAgICAgICAgICAgICAgICAgICBkZWNvZGVfb3V0cHV0PUZh
bHNlKToKICAgICAgICAgaWYgc2VsZi5fZXhjZXB0aW9uOgogICAgICAgICAgICAgcmFpc2Ugc2Vs
Zi5fZXhjZXB0aW9uCi0gICAgICAgIGlmIHJldHVybl9leGl0X2NvZGU6Ci0gICAgICAgICAgICBy
ZXR1cm4gc2VsZi5fZXhpdF9jb2RlCiAgICAgICAgIGlmIHNlbGYuX3J1bl9jb21tYW5kX2ZuOgog
ICAgICAgICAgICAgcmV0dXJuIHNlbGYuX3J1bl9jb21tYW5kX2ZuKGFyZ3MpCisgICAgICAgIGlm
IHJldHVybl9leGl0X2NvZGU6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5fZXhpdF9jb2RlCiAg
ICAgICAgIGlmIHNlbGYuX2V4aXRfY29kZSBhbmQgZXJyb3JfaGFuZGxlcjoKICAgICAgICAgICAg
IHNjcmlwdF9lcnJvciA9IGV4ZWN1dGl2ZS5TY3JpcHRFcnJvcihzY3JpcHRfYXJncz1hcmdzLAog
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4aXRfY29k
ZT1zZWxmLl9leGl0X2NvZGUsCkluZGV4OiBUb29scy9TY3JpcHRzL3dlYmtpdHB5L2xheW91dF90
ZXN0cy9ydW5fd2Via2l0X3Rlc3RzX2ludGVncmF0aW9udGVzdC5weQo9PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBU
b29scy9TY3JpcHRzL3dlYmtpdHB5L2xheW91dF90ZXN0cy9ydW5fd2Via2l0X3Rlc3RzX2ludGVn
cmF0aW9udGVzdC5weQkocmV2aXNpb24gOTAxMzUpCisrKyBUb29scy9TY3JpcHRzL3dlYmtpdHB5
L2xheW91dF90ZXN0cy9ydW5fd2Via2l0X3Rlc3RzX2ludGVncmF0aW9udGVzdC5weQkod29ya2lu
ZyBjb3B5KQpAQCAtMjY0LDkgKzI2NCw4IEBAIGNsYXNzIE1haW5UZXN0KHVuaXR0ZXN0LlRlc3RD
YXNlKToKICAgICAgICAgIyBXZSBkbyBhIGxvZ2dpbmcgcnVuIGhlcmUgaW5zdGVhZCBvZiBhIHBh
c3NpbmcgcnVuIGluIG9yZGVyIHRvCiAgICAgICAgICMgc3VwcHJlc3MgdGhlIG91dHB1dCBmcm9t
IHRoZSBqc29uIGdlbmVyYXRvci4KICAgICAgICAgcmVzLCBidWlsZGJvdF9vdXRwdXQsIHJlZ3Vs
YXJfb3V0cHV0LCB1c2VyID0gbG9nZ2luZ19ydW4oWyctLWNsb2JiZXItb2xkLXJlc3VsdHMnXSwg
cmVjb3JkX3Jlc3VsdHM9VHJ1ZSwgZmlsZXN5c3RlbT1mcykKLSAgICAgICAgcmVzLCBidWlsZGJv
dF9vdXRwdXQsIHJlZ3VsYXJfb3V0cHV0LCB1c2VyID0gbG9nZ2luZ19ydW4oCi0gICAgICAgICAg
ICBbJy0tcHJpbnQtbGFzdC1mYWlsdXJlcyddLCBmaWxlc3lzdGVtPWZzKQotICAgICAgICBzZWxm
LmFzc2VydEVxdWFsKHJlZ3VsYXJfb3V0cHV0LmdldCgpLCBbJ1xuXG4nXSkKKyAgICAgICAgcmVz
LCBidWlsZGJvdF9vdXRwdXQsIHJlZ3VsYXJfb3V0cHV0LCB1c2VyID0gbG9nZ2luZ19ydW4oWyct
LXByaW50LWxhc3QtZmFpbHVyZXMnXSwgZmlsZXN5c3RlbT1mcykKKyAgICAgICAgc2VsZi5hc3Nl
cnRFcXVhbChyZWd1bGFyX291dHB1dC5nZXQoKSwgW3UnZmFpbHVyZXMvZXhwZWN0ZWQvY2hlY2tz
dW0uaHRtbFxuXG4nXSkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChidWlsZGJvdF9vdXRwdXQu
Z2V0KCksIFtdKQogCiAgICAgZGVmIHRlc3RfbGludF90ZXN0X2ZpbGVzKHNlbGYpOgpAQCAtNDIx
LDYgKzQyMCwxNiBAQCBjbGFzcyBNYWluVGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6CiAgICAgICAg
ICAgICBmaWxlc3lzdGVtPWZzKQogICAgICAgICBzZWxmLmFzc2VydFRydWUoZnMucmVhZF90ZXh0
X2ZpbGUoJy90bXAvbGF5b3V0LXRlc3QtcmVzdWx0cy91bmV4cGVjdGVkX3Jlc3VsdHMuanNvbicp
LmZpbmQoJ3siY3Jhc2gtd2l0aC1zdGRlcnIuaHRtbCI6eyJleHBlY3RlZCI6IlBBU1MiLCJhY3R1
YWwiOiJDUkFTSCIsImhhc19zdGRlcnIiOnRydWV9fScpICE9IC0xKQogCisgICAgZGVmIHRlc3Rf
bm9faW1hZ2VfZmFpbHVyZV93aXRoX2ltYWdlX2RpZmYoc2VsZik6CisgICAgICAgIGZzID0gcG9y
dC51bml0X3Rlc3RfZmlsZXN5c3RlbSgpCisgICAgICAgIHJlcywgYnVpbGRib3Rfb3V0cHV0LCBy
ZWd1bGFyX291dHB1dCwgdXNlciA9IGxvZ2dpbmdfcnVuKFsKKyAgICAgICAgICAgICAgICAnZmFp
bHVyZXMvdW5leHBlY3RlZC9jaGVja3N1bS13aXRoLW1hdGNoaW5nLWltYWdlLmh0bWwnLAorICAg
ICAgICAgICAgXSwKKyAgICAgICAgICAgIHRlc3RzX2luY2x1ZGVkPVRydWUsCisgICAgICAgICAg
ICByZWNvcmRfcmVzdWx0cz1UcnVlLAorICAgICAgICAgICAgZmlsZXN5c3RlbT1mcykKKyAgICAg
ICAgc2VsZi5hc3NlcnRUcnVlKGZzLnJlYWRfdGV4dF9maWxlKCcvdG1wL2xheW91dC10ZXN0LXJl
c3VsdHMvdW5leHBlY3RlZF9yZXN1bHRzLmpzb24nKS5maW5kKCcibnVtX3JlZ3Jlc3Npb25zIjow
JykgIT0gLTEpCisKICAgICBkZWYgdGVzdF9jcmFzaF9sb2coc2VsZik6CiAgICAgICAgIG1vY2tf
Y3Jhc2hfcmVwb3J0ID0gJ21vY2stY3Jhc2gtcmVwb3J0JwogICAgICAgICBmcyA9IHBvcnQudW5p
dF90ZXN0X2ZpbGVzeXN0ZW0oKQpAQCAtNTU5LDggKzU2OCw3IEBAIGNsYXNzIE1haW5UZXN0KHVu
aXR0ZXN0LlRlc3RDYXNlKToKIAogICAgIGRlZiB0ZXN0X3RvbGVyYW5jZShzZWxmKToKICAgICAg
ICAgY2xhc3MgSW1hZ2VEaWZmVGVzdFBvcnQoVGVzdFBvcnQpOgotICAgICAgICAgICAgZGVmIGRp
ZmZfaW1hZ2Uoc2VsZiwgZXhwZWN0ZWRfY29udGVudHMsIGFjdHVhbF9jb250ZW50cywKLSAgICAg
ICAgICAgICAgICAgICBkaWZmX2ZpbGVuYW1lPU5vbmUpOgorICAgICAgICAgICAgZGVmIGRpZmZf
aW1hZ2Uoc2VsZiwgZXhwZWN0ZWRfY29udGVudHMsIGFjdHVhbF9jb250ZW50cyk6CiAgICAgICAg
ICAgICAgICAgc2VsZi50b2xlcmFuY2VfdXNlZF9mb3JfZGlmZl9pbWFnZSA9IHNlbGYuX29wdGlv
bnMudG9sZXJhbmNlCiAgICAgICAgICAgICAgICAgcmV0dXJuIFRydWUKIApJbmRleDogVG9vbHMv
U2NyaXB0cy93ZWJraXRweS9sYXlvdXRfdGVzdHMvbGF5b3V0X3BhY2thZ2Uvc2luZ2xlX3Rlc3Rf
cnVubmVyLnB5Cj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT0KLS0tIFRvb2xzL1NjcmlwdHMvd2Via2l0cHkvbGF5b3V0X3Rl
c3RzL2xheW91dF9wYWNrYWdlL3NpbmdsZV90ZXN0X3J1bm5lci5weQkocmV2aXNpb24gOTAxMzUp
CisrKyBUb29scy9TY3JpcHRzL3dlYmtpdHB5L2xheW91dF90ZXN0cy9sYXlvdXRfcGFja2FnZS9z
aW5nbGVfdGVzdF9ydW5uZXIucHkJKHdvcmtpbmcgY29weSkKQEAgLTI2NiwxNyArMjY2LDIxIEBA
IGNsYXNzIFNpbmdsZVRlc3RSdW5uZXI6CiAgICAgICAgICMgdGhlIG5vcm1hbGl6ZWQgdGV4dCBl
eHBlY3RhdGlvbiBmaWxlcy4KICAgICAgICAgcmV0dXJuIG91dHB1dC5yZXBsYWNlKCJcclxyXG4i
LCAiXHJcbiIpLnJlcGxhY2UoIlxyXG4iLCAiXG4iKQogCi0gICAgZGVmIF9jb21wYXJlX2ltYWdl
KHNlbGYsIGRyaXZlcl9vdXRwdXQsIGV4cGVjdGVkX2RyaXZlcl9vdXRwdXRzKToKKyAgICAjIEZJ
WE1FOiBUaGlzIGZ1bmN0aW9uIGFsc28gY3JlYXRlcyB0aGUgaW1hZ2UgZGlmZi4gTWF5YmUgdGhh
dCB3b3JrIHNob3VsZAorICAgICMgYmUgaGFuZGxlZCBlbHNld2hlcmU/CisgICAgZGVmIF9jb21w
YXJlX2ltYWdlKHNlbGYsIGRyaXZlcl9vdXRwdXQsIGV4cGVjdGVkX2RyaXZlcl9vdXRwdXQpOgog
ICAgICAgICBmYWlsdXJlcyA9IFtdCiAgICAgICAgICMgSWYgd2UgZGlkbid0IHByb2R1Y2UgYSBo
YXNoIGZpbGUsIHRoaXMgdGVzdCBtdXN0IGJlIHRleHQtb25seS4KICAgICAgICAgaWYgZHJpdmVy
X291dHB1dC5pbWFnZV9oYXNoIGlzIE5vbmU6CiAgICAgICAgICAgICByZXR1cm4gZmFpbHVyZXMK
LSAgICAgICAgaWYgbm90IGV4cGVjdGVkX2RyaXZlcl9vdXRwdXRzLmltYWdlOgorICAgICAgICBp
ZiBub3QgZXhwZWN0ZWRfZHJpdmVyX291dHB1dC5pbWFnZToKICAgICAgICAgICAgIGZhaWx1cmVz
LmFwcGVuZCh0ZXN0X2ZhaWx1cmVzLkZhaWx1cmVNaXNzaW5nSW1hZ2UoKSkKLSAgICAgICAgZWxp
ZiBub3QgZXhwZWN0ZWRfZHJpdmVyX291dHB1dHMuaW1hZ2VfaGFzaDoKKyAgICAgICAgZWxpZiBu
b3QgZXhwZWN0ZWRfZHJpdmVyX291dHB1dC5pbWFnZV9oYXNoOgogICAgICAgICAgICAgZmFpbHVy
ZXMuYXBwZW5kKHRlc3RfZmFpbHVyZXMuRmFpbHVyZU1pc3NpbmdJbWFnZUhhc2goKSkKLSAgICAg
ICAgZWxpZiBkcml2ZXJfb3V0cHV0LmltYWdlX2hhc2ggIT0gZXhwZWN0ZWRfZHJpdmVyX291dHB1
dHMuaW1hZ2VfaGFzaDoKLSAgICAgICAgICAgIGZhaWx1cmVzLmFwcGVuZCh0ZXN0X2ZhaWx1cmVz
LkZhaWx1cmVJbWFnZUhhc2hNaXNtYXRjaCgpKQorICAgICAgICBlbGlmIGRyaXZlcl9vdXRwdXQu
aW1hZ2VfaGFzaCAhPSBleHBlY3RlZF9kcml2ZXJfb3V0cHV0LmltYWdlX2hhc2g6CisgICAgICAg
ICAgICBkcml2ZXJfb3V0cHV0LmltYWdlX2RpZmYgPSBzZWxmLl9wb3J0LmRpZmZfaW1hZ2UoZHJp
dmVyX291dHB1dC5pbWFnZSwgZXhwZWN0ZWRfZHJpdmVyX291dHB1dC5pbWFnZSkKKyAgICAgICAg
ICAgIGlmIGRyaXZlcl9vdXRwdXQuaW1hZ2VfZGlmZjoKKyAgICAgICAgICAgICAgICBmYWlsdXJl
cy5hcHBlbmQodGVzdF9mYWlsdXJlcy5GYWlsdXJlSW1hZ2VIYXNoTWlzbWF0Y2goKSkKICAgICAg
ICAgcmV0dXJuIGZhaWx1cmVzCiAKICAgICBkZWYgX3J1bl9yZWZ0ZXN0KHNlbGYpOgpJbmRleDog
VG9vbHMvU2NyaXB0cy93ZWJraXRweS9sYXlvdXRfdGVzdHMvbGF5b3V0X3BhY2thZ2UvdGVzdF9y
ZXN1bHRfd3JpdGVyLnB5Cj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFRvb2xzL1NjcmlwdHMvd2Via2l0cHkvbGF5
b3V0X3Rlc3RzL2xheW91dF9wYWNrYWdlL3Rlc3RfcmVzdWx0X3dyaXRlci5weQkocmV2aXNpb24g
OTAxMzUpCisrKyBUb29scy9TY3JpcHRzL3dlYmtpdHB5L2xheW91dF90ZXN0cy9sYXlvdXRfcGFj
a2FnZS90ZXN0X3Jlc3VsdF93cml0ZXIucHkJKHdvcmtpbmcgY29weSkKQEAgLTQxLDggKzQxLDYg
QEAgZGVmIHdyaXRlX3Rlc3RfcmVzdWx0KHBvcnQsIGZpbGVuYW1lLCBkcgogICAgICAgICAgICAg
ICAgICAgICAgIGV4cGVjdGVkX2RyaXZlcl9vdXRwdXQsIGZhaWx1cmVzKToKICAgICAiIiJXcml0
ZSB0aGUgdGVzdCByZXN1bHQgdG8gdGhlIHJlc3VsdCBvdXRwdXQgZGlyZWN0b3J5LiIiIgogICAg
IHJvb3Rfb3V0cHV0X2RpciA9IHBvcnQucmVzdWx0c19kaXJlY3RvcnkoKQotICAgIGNoZWNrc3Vt
c19taXNtYXRjaF9idXRfaW1hZ2VzX2FyZV9zYW1lID0gRmFsc2UKLSAgICBpbWFnZWhhc2hfbWlz
bWF0Y2hfZmFpbHVyZSA9IE5vbmUKICAgICB3cml0ZXIgPSBUZXN0UmVzdWx0V3JpdGVyKHBvcnQs
IHJvb3Rfb3V0cHV0X2RpciwgZmlsZW5hbWUpCiAgICAgaWYgZHJpdmVyX291dHB1dC5lcnJvcjoK
ICAgICAgICAgd3JpdGVyLndyaXRlX3N0ZGVycihkcml2ZXJfb3V0cHV0LmVycm9yKQpAQCAtNjAs
MTEgKzU4LDcgQEAgZGVmIHdyaXRlX3Rlc3RfcmVzdWx0KHBvcnQsIGZpbGVuYW1lLCBkcgogICAg
ICAgICAgICAgd3JpdGVyLndyaXRlX2ltYWdlX2ZpbGVzKGRyaXZlcl9vdXRwdXQuaW1hZ2UsIGV4
cGVjdGVkX2RyaXZlcl9vdXRwdXQuaW1hZ2UpCiAgICAgICAgIGVsaWYgaXNpbnN0YW5jZShmYWls
dXJlLCB0ZXN0X2ZhaWx1cmVzLkZhaWx1cmVJbWFnZUhhc2hNaXNtYXRjaCk6CiAgICAgICAgICAg
ICB3cml0ZXIud3JpdGVfaW1hZ2VfZmlsZXMoZHJpdmVyX291dHB1dC5pbWFnZSwgZXhwZWN0ZWRf
ZHJpdmVyX291dHB1dC5pbWFnZSkKLSAgICAgICAgICAgIGltYWdlc19hcmVfZGlmZmVyZW50ID0g
d3JpdGVyLmNyZWF0ZV9pbWFnZV9kaWZmX2FuZF93cml0ZV9yZXN1bHQoCi0gICAgICAgICAgICAg
ICAgZHJpdmVyX291dHB1dC5pbWFnZSwgZXhwZWN0ZWRfZHJpdmVyX291dHB1dC5pbWFnZSkKLSAg
ICAgICAgICAgIGlmIG5vdCBpbWFnZXNfYXJlX2RpZmZlcmVudDoKLSAgICAgICAgICAgICAgICBj
aGVja3N1bXNfbWlzbWF0Y2hfYnV0X2ltYWdlc19hcmVfc2FtZSA9IFRydWUKLSAgICAgICAgICAg
ICAgICBpbWFnZWhhc2hfbWlzbWF0Y2hfZmFpbHVyZSA9IGZhaWx1cmUKKyAgICAgICAgICAgIHdy
aXRlci53cml0ZV9pbWFnZV9kaWZmX2ZpbGVzKGRyaXZlcl9vdXRwdXQuaW1hZ2VfZGlmZikKICAg
ICAgICAgZWxpZiBpc2luc3RhbmNlKGZhaWx1cmUsICh0ZXN0X2ZhaWx1cmVzLkZhaWx1cmVBdWRp
b01pc21hdGNoLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlc3RfZmFpbHVy
ZXMuRmFpbHVyZU1pc3NpbmdBdWRpbykpOgogICAgICAgICAgICAgd3JpdGVyLndyaXRlX2F1ZGlv
X2ZpbGVzKGRyaXZlcl9vdXRwdXQuYXVkaW8sIGV4cGVjdGVkX2RyaXZlcl9vdXRwdXQuYXVkaW8p
CkBAIC03NSw3ICs2OSwxMCBAQCBkZWYgd3JpdGVfdGVzdF9yZXN1bHQocG9ydCwgZmlsZW5hbWUs
IGRyCiAgICAgICAgICAgICAgICAgd3JpdGVyLndyaXRlX2NyYXNoX3JlcG9ydChkcml2ZXJfb3V0
cHV0LmVycm9yKQogICAgICAgICBlbGlmIGlzaW5zdGFuY2UoZmFpbHVyZSwgdGVzdF9mYWlsdXJl
cy5GYWlsdXJlUmVmdGVzdE1pc21hdGNoKToKICAgICAgICAgICAgIHdyaXRlci53cml0ZV9pbWFn
ZV9maWxlcyhkcml2ZXJfb3V0cHV0LmltYWdlLCBleHBlY3RlZF9kcml2ZXJfb3V0cHV0LmltYWdl
KQotICAgICAgICAgICAgd3JpdGVyLmNyZWF0ZV9pbWFnZV9kaWZmX2FuZF93cml0ZV9yZXN1bHQo
ZHJpdmVyX291dHB1dC5pbWFnZSwgZXhwZWN0ZWRfZHJpdmVyX291dHB1dC5pbWFnZSkKKyAgICAg
ICAgICAgICMgRklYTUU6IFRoaXMgd29yayBzaG91bGQgYmUgZG9uZSBlYXJsaWVyIGluIHRoZSBw
aXBlbGluZSAoZS5nLiwgd2hlbiB3ZSBjb21wYXJlIGltYWdlcyBmb3Igbm9uLXJlZiB0ZXN0cyku
CisgICAgICAgICAgICBpbWFnZV9kaWZmID0gcG9ydC5kaWZmX2ltYWdlKGRyaXZlcl9vdXRwdXQu
aW1hZ2UsIGV4cGVjdGVkX2RyaXZlcl9vdXRwdXQuaW1hZ2UpCisgICAgICAgICAgICBpZiBpbWFn
ZV9kaWZmOgorICAgICAgICAgICAgICAgIHdyaXRlci53cml0ZV9pbWFnZV9kaWZmX2ZpbGVzKGlt
YWdlX2RpZmYpCiAgICAgICAgICAgICB3cml0ZXIuY29weV9maWxlKHBvcnQucmVmdGVzdF9leHBl
Y3RlZF9maWxlbmFtZShmaWxlbmFtZSksICctZXhwZWN0ZWQuaHRtbCcpCiAgICAgICAgIGVsaWYg
aXNpbnN0YW5jZShmYWlsdXJlLCB0ZXN0X2ZhaWx1cmVzLkZhaWx1cmVSZWZ0ZXN0TWlzbWF0Y2hE
aWROb3RPY2N1cik6CiAgICAgICAgICAgICB3cml0ZXIud3JpdGVfaW1hZ2VfZmlsZXMoZHJpdmVy
X291dHB1dC5pbWFnZSwgZXhwZWN0ZWRfaW1hZ2U9Tm9uZSkKQEAgLTgzLDE1ICs4MCw2IEBAIGRl
ZiB3cml0ZV90ZXN0X3Jlc3VsdChwb3J0LCBmaWxlbmFtZSwgZHIKICAgICAgICAgZWxzZToKICAg
ICAgICAgICAgIGFzc2VydCBpc2luc3RhbmNlKGZhaWx1cmUsICh0ZXN0X2ZhaWx1cmVzLkZhaWx1
cmVUaW1lb3V0LCkpCiAKLSAgICAjIEZJWE1FOiBUaGlzIGlzIGFuIHVnbHkgaGFjayB0byBoYW5k
bGUgRmFpbHVyZUltYWdlSGFzaEluY29ycmVjdCBjYXNlLgotICAgICMgSWRlYWxseSwgRmFpbHVy
ZUltYWdlSGFzaEluY29ycmVjdCBjYXNlIHNob3VsZCBiZSBkZXRlY3RlZCBiZWZvcmUgdGhpcwot
ICAgICMgZnVuY3Rpb24gaXMgY2FsbGVkLiBCdXQgaXQgcmVxdWlyZXMgY2FsbGluZyBjcmVhdGVf
ZGlmZl9pbWFnZSgpIHRvIGRldGVjdAotICAgICMgd2hldGhlciB0d28gaW1hZ2VzIGFyZSBzYW1l
IG9yIG5vdC4gU28gd2UgbmVlZCB0aGlzIGhhY2sgdW50aWwgd2UgaGF2ZSBhIGJldHRlciBhcHBy
b2FjaC4KLSAgICBpZiBjaGVja3N1bXNfbWlzbWF0Y2hfYnV0X2ltYWdlc19hcmVfc2FtZToKLSAg
ICAgICAgIyBSZXBsYWNlIEZhaWx1cmVJbWFnZUhhc2hNaXNtYXRjaCB3aXRoIEZhaWx1cmVJbWFn
ZUhhc2hJbmNvcnJlY3QuCi0gICAgICAgIGZhaWx1cmVzLnJlbW92ZShpbWFnZWhhc2hfbWlzbWF0
Y2hfZmFpbHVyZSkKLSAgICAgICAgZmFpbHVyZXMuYXBwZW5kKHRlc3RfZmFpbHVyZXMuRmFpbHVy
ZUltYWdlSGFzaEluY29ycmVjdCgpKQotCiAKIGNsYXNzIFRlc3RSZXN1bHRXcml0ZXIob2JqZWN0
KToKICAgICAiIiJBIGNsYXNzIHdoaWNoIGhhbmRsZXMgYWxsIHdyaXRpbmcgb3BlcmF0aW9ucyB0
byB0aGUgcmVzdWx0IGRpcmVjdG9yeS4iIiIKQEAgLTIxNSwxOSArMjAzLDEwIEBAIGNsYXNzIFRl
c3RSZXN1bHRXcml0ZXIob2JqZWN0KToKICAgICBkZWYgd3JpdGVfaW1hZ2VfZmlsZXMoc2VsZiwg
YWN0dWFsX2ltYWdlLCBleHBlY3RlZF9pbWFnZSk6CiAgICAgICAgIHNlbGYud3JpdGVfb3V0cHV0
X2ZpbGVzKCcucG5nJywgYWN0dWFsX2ltYWdlLCBleHBlY3RlZF9pbWFnZSkKIAotICAgIGRlZiBj
cmVhdGVfaW1hZ2VfZGlmZl9hbmRfd3JpdGVfcmVzdWx0KHNlbGYsIGFjdHVhbF9pbWFnZSwgZXhw
ZWN0ZWRfaW1hZ2UpOgotICAgICAgICAiIiJXcml0ZXMgdGhlIHZpc3VhbCBkaWZmIG9mIHRoZSBl
eHBlY3RlZC9hY3R1YWwgUE5Hcy4KLQotICAgICAgICBSZXR1cm5zIFRydWUgaWYgdGhlIGltYWdl
cyBhcmUgZGlmZmVyZW50LgotICAgICAgICAiIiIKLSAgICAgICAgIyBGSVhNRTogVGhpcyBmdW5j
dGlvbiBpcyBhY3R1YWxseSBkb2luZyB0aGUgZGlmZiBhcyB3ZWxsIGFzIHdyaXRpbmcgYSByZXN1
bHQuCi0gICAgICAgICMgSXQgbWlnaHQgYmUgYmV0dGVyIHRvIGV4dHJhY3QgJ2RpZmYnIGNvZGUg
YW5kIG1ha2UgaXQgYSBzZXBhcmF0ZSBmdW5jdGlvbi4KLSAgICAgICAgIyBUbyBkbyBzbywgd2Ug
aGF2ZSB0byBjaGFuZ2UgcG9ydC5kaWZmX2ltYWdlKCkgYXMgd2VsbC4KKyAgICBkZWYgd3JpdGVf
aW1hZ2VfZGlmZl9maWxlcyhzZWxmLCBpbWFnZV9kaWZmKToKICAgICAgICAgZGlmZl9maWxlbmFt
ZSA9IHNlbGYub3V0cHV0X2ZpbGVuYW1lKHNlbGYuRklMRU5BTUVfU1VGRklYX0lNQUdFX0RJRkYp
Ci0gICAgICAgIGltYWdlc19hcmVfZGlmZmVyZW50ID0gc2VsZi5fcG9ydC5kaWZmX2ltYWdlKGFj
dHVhbF9pbWFnZSwgZXhwZWN0ZWRfaW1hZ2UsIGRpZmZfZmlsZW5hbWUpCi0KLSAgICAgICAgaWYg
bm90IGltYWdlc19hcmVfZGlmZmVyZW50OgotICAgICAgICAgICAgcmV0dXJuIEZhbHNlCisgICAg
ICAgIGZzID0gc2VsZi5fcG9ydC5fZmlsZXN5c3RlbQorICAgICAgICBmcy53cml0ZV9iaW5hcnlf
ZmlsZShkaWZmX2ZpbGVuYW1lLCBpbWFnZV9kaWZmKQogCiAgICAgICAgIGRpZmZzX2h0bWxfZmls
ZW5hbWUgPSBzZWxmLm91dHB1dF9maWxlbmFtZShzZWxmLkZJTEVOQU1FX1NVRkZJWF9JTUFHRV9E
SUZGU19IVE1MKQogICAgICAgICAjIEZJWE1FOiBvbGQtcnVuLXdlYmtpdC10ZXN0cyBzaG93cyB0
aGUgZGlmZiBwZXJjZW50YWdlIGFzIHRoZSB0ZXh0IGNvbnRlbnRzIG9mIHRoZSAiZGlmZiIgbGlu
ay4KQEAgLTI3OCwxMSArMjU3LDE0IEBAIERpZmZlcmVuY2UgYmV0d2VlbiBpbWFnZXM6IDxhIGhy
ZWY9IiUoZGkKIDwvc2NyaXB0PgogPC9ib2R5PgogPC9odG1sPgotIiIiICUgeyAndGl0bGUnOiBz
ZWxmLl90ZXN0bmFtZSwgJ2RpZmZfZmlsZW5hbWUnOiBzZWxmLl9vdXRwdXRfdGVzdG5hbWUoJy1k
aWZmLnBuZycpLCAncHJlZml4Jzogc2VsZi5fb3V0cHV0X3Rlc3RuYW1lKCcnKSB9CisiIiIgJSB7
CisgICAgICAgICAgICAndGl0bGUnOiBzZWxmLl90ZXN0bmFtZSwKKyAgICAgICAgICAgICdkaWZm
X2ZpbGVuYW1lJzogc2VsZi5fb3V0cHV0X3Rlc3RuYW1lKHNlbGYuRklMRU5BTUVfU1VGRklYX0lN
QUdFX0RJRkYpLAorICAgICAgICAgICAgJ3ByZWZpeCc6IHNlbGYuX291dHB1dF90ZXN0bmFtZSgn
JyksCisgICAgICAgIH0KKyAgICAgICAgIyBGSVhNRTogVGhpcyBzZWVtcyBsaWtlIGEgdGV4dCBm
aWxlLCBub3QgYSBiaW5hcnkgZmlsZS4KICAgICAgICAgc2VsZi5fcG9ydC5fZmlsZXN5c3RlbS53
cml0ZV9iaW5hcnlfZmlsZShkaWZmc19odG1sX2ZpbGVuYW1lLCBodG1sKQogCi0gICAgICAgIHJl
dHVybiBUcnVlCi0KICAgICBkZWYgY29weV9maWxlKHNlbGYsIHNyY19maWxlcGF0aCwgZHN0X2V4
dGVuc2lvbik6CiAgICAgICAgIGZzID0gc2VsZi5fcG9ydC5fZmlsZXN5c3RlbQogICAgICAgICBh
c3NlcnQgZnMuZXhpc3RzKHNyY19maWxlcGF0aCksICdzcmNfZmlsZXBhdGg6ICVzJyAlIHNyY19m
aWxlcGF0aApJbmRleDogVG9vbHMvU2NyaXB0cy93ZWJraXRweS9sYXlvdXRfdGVzdHMvcG9ydC9i
YXNlLnB5Cj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT0KLS0tIFRvb2xzL1NjcmlwdHMvd2Via2l0cHkvbGF5b3V0X3Rlc3Rz
L3BvcnQvYmFzZS5weQkocmV2aXNpb24gOTAxMzUpCisrKyBUb29scy9TY3JpcHRzL3dlYmtpdHB5
L2xheW91dF90ZXN0cy9wb3J0L2Jhc2UucHkJKHdvcmtpbmcgY29weSkKQEAgLTI0NCwxNiArMjQ0
LDExIEBAIGNsYXNzIFBvcnQob2JqZWN0KToKICAgICAgICAgIiIiUmV0dXJuIHdoZXRoZXIgdGhl
IHR3byBhdWRpbyBmaWxlcyBhcmUgKm5vdCogZXF1YWwuIiIiCiAgICAgICAgIHJldHVybiBleHBl
Y3RlZF9hdWRpbyAhPSBhY3R1YWxfYXVkaW8KIAotICAgIGRlZiBkaWZmX2ltYWdlKHNlbGYsIGV4
cGVjdGVkX2NvbnRlbnRzLCBhY3R1YWxfY29udGVudHMsIGRpZmZfZmlsZW5hbWU9Tm9uZSwgdG9s
ZXJhbmNlPTApOgotICAgICAgICAiIiJDb21wYXJlIHR3byBpbWFnZXMgYW5kIHByb2R1Y2UgYSBk
ZWx0YSBpbWFnZSBmaWxlLgotCi0gICAgICAgIFJldHVybiBUcnVlIGlmIHRoZSB0d28gaW1hZ2Vz
IGFyZSBkaWZmZXJlbnQsIEZhbHNlIGlmIHRoZXkgYXJlIHRoZSBzYW1lLgotICAgICAgICBBbHNv
IHByb2R1Y2UgYSBkZWx0YSBpbWFnZSBvZiB0aGUgdHdvIGltYWdlcyBhbmQgd3JpdGUgdGhhdCBp
bnRvCi0gICAgICAgIHxkaWZmX2ZpbGVuYW1lfCBpZiBpdCBpcyBub3QgTm9uZS4KKyAgICBkZWYg
ZGlmZl9pbWFnZShzZWxmLCBleHBlY3RlZF9jb250ZW50cywgYWN0dWFsX2NvbnRlbnRzLCB0b2xl
cmFuY2U9MCk6CisgICAgICAgICIiIkNvbXBhcmUgdHdvIGltYWdlcyBhbmQgcmV0dXJuIGFuIGlt
YWdlIGRpZmYuCiAKICAgICAgICAgfHRvbGVyYW5jZXwgc2hvdWxkIGJlIGEgcGVyY2VudGFnZSB2
YWx1ZSAoMC4wIC0gMTAwLjApLgogICAgICAgICBJZiBpdCBpcyBvbWl0dGVkLCB0aGUgcG9ydCBk
ZWZhdWx0IHRvbGVyYW5jZSB2YWx1ZSBpcyB1c2VkLgotCiAgICAgICAgICIiIgogICAgICAgICBy
YWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKCdQb3J0LmRpZmZfaW1hZ2UnKQogCkBAIC05MzksNiAr
OTM0LDcgQEAgY2xhc3MgRHJpdmVyT3V0cHV0KG9iamVjdCk6CiAgICAgICAgIHNlbGYudGV4dCA9
IHRleHQKICAgICAgICAgc2VsZi5pbWFnZSA9IGltYWdlCiAgICAgICAgIHNlbGYuaW1hZ2VfaGFz
aCA9IGltYWdlX2hhc2gKKyAgICAgICAgc2VsZi5pbWFnZV9kaWZmID0gTm9uZSAgIyBpbWFnZV9k
aWZmIGdldHMgZmlsbGVkIGluIGFmdGVyIGNvbnN0cnVjdGlvbi4KICAgICAgICAgc2VsZi5hdWRp
byA9IGF1ZGlvCiAgICAgICAgIHNlbGYuY3Jhc2ggPSBjcmFzaAogICAgICAgICBzZWxmLnRlc3Rf
dGltZSA9IHRlc3RfdGltZQpJbmRleDogVG9vbHMvU2NyaXB0cy93ZWJraXRweS9sYXlvdXRfdGVz
dHMvcG9ydC9jaHJvbWl1bS5weQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBUb29scy9TY3JpcHRzL3dlYmtpdHB5
L2xheW91dF90ZXN0cy9wb3J0L2Nocm9taXVtLnB5CShyZXZpc2lvbiA5MDEzNSkKKysrIFRvb2xz
L1NjcmlwdHMvd2Via2l0cHkvbGF5b3V0X3Rlc3RzL3BvcnQvY2hyb21pdW0ucHkJKHdvcmtpbmcg
Y29weSkKQEAgLTEzOCw4ICsxMzgsNyBAQCBjbGFzcyBDaHJvbWl1bVBvcnQoYmFzZS5Qb3J0KToK
ICAgICAgICAgcmV0dXJuIHNlbGYuX2NoZWNrX2ZpbGVfZXhpc3RzKGltYWdlX2RpZmZfcGF0aCwg
J2ltYWdlIGRpZmYgZXhlJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
IG92ZXJyaWRlX3N0ZXAsIGxvZ2dpbmcpCiAKLSAgICBkZWYgZGlmZl9pbWFnZShzZWxmLCBleHBl
Y3RlZF9jb250ZW50cywgYWN0dWFsX2NvbnRlbnRzLAotICAgICAgICAgICAgICAgICAgIGRpZmZf
ZmlsZW5hbWU9Tm9uZSk6CisgICAgZGVmIGRpZmZfaW1hZ2Uoc2VsZiwgZXhwZWN0ZWRfY29udGVu
dHMsIGFjdHVhbF9jb250ZW50cyk6CiAgICAgICAgICMgRklYTUU6IG5lZWQgdW5pdCB0ZXN0cyBm
b3IgdGhpcy4KICAgICAgICAgaWYgbm90IGFjdHVhbF9jb250ZW50cyBhbmQgbm90IGV4cGVjdGVk
X2NvbnRlbnRzOgogICAgICAgICAgICAgcmV0dXJuIEZhbHNlCkBAIC0xNDcsMzkgKzE0Niw0MCBA
QCBjbGFzcyBDaHJvbWl1bVBvcnQoYmFzZS5Qb3J0KToKICAgICAgICAgICAgIHJldHVybiBUcnVl
CiAKICAgICAgICAgdGVtcGRpciA9IHNlbGYuX2ZpbGVzeXN0ZW0ubWtkdGVtcCgpCisKICAgICAg
ICAgZXhwZWN0ZWRfZmlsZW5hbWUgPSBzZWxmLl9maWxlc3lzdGVtLmpvaW4oc3RyKHRlbXBkaXIp
LCAiZXhwZWN0ZWQucG5nIikKICAgICAgICAgc2VsZi5fZmlsZXN5c3RlbS53cml0ZV9iaW5hcnlf
ZmlsZShleHBlY3RlZF9maWxlbmFtZSwgZXhwZWN0ZWRfY29udGVudHMpCisKICAgICAgICAgYWN0
dWFsX2ZpbGVuYW1lID0gc2VsZi5fZmlsZXN5c3RlbS5qb2luKHN0cih0ZW1wZGlyKSwgImFjdHVh
bC5wbmciKQogICAgICAgICBzZWxmLl9maWxlc3lzdGVtLndyaXRlX2JpbmFyeV9maWxlKGFjdHVh
bF9maWxlbmFtZSwgYWN0dWFsX2NvbnRlbnRzKQogCisgICAgICAgIGRpZmZfZmlsZW5hbWUgPSBz
ZWxmLl9maWxlc3lzdGVtLmpvaW4oc3RyKHRlbXBkaXIpLCAiZGlmZi5wbmciKQorCiAgICAgICAg
IGV4ZWN1dGFibGUgPSBzZWxmLl9wYXRoX3RvX2ltYWdlX2RpZmYoKQotICAgICAgICBpZiBkaWZm
X2ZpbGVuYW1lOgotICAgICAgICAgICAgY21kID0gW2V4ZWN1dGFibGUsICctLWRpZmYnLCBleHBl
Y3RlZF9maWxlbmFtZSwKLSAgICAgICAgICAgICAgICAgICBhY3R1YWxfZmlsZW5hbWUsIGRpZmZf
ZmlsZW5hbWVdCi0gICAgICAgIGVsc2U6Ci0gICAgICAgICAgICBjbWQgPSBbZXhlY3V0YWJsZSwg
ZXhwZWN0ZWRfZmlsZW5hbWUsIGFjdHVhbF9maWxlbmFtZV0KKyAgICAgICAgY29tYW5kID0gW2V4
ZWN1dGFibGUsICctLWRpZmYnLCBleHBlY3RlZF9maWxlbmFtZSwgYWN0dWFsX2ZpbGVuYW1lLCBk
aWZmX2ZpbGVuYW1lXQogCi0gICAgICAgIHJlc3VsdCA9IFRydWUKKyAgICAgICAgcmVzdWx0ID0g
Tm9uZQogICAgICAgICB0cnk6Ci0gICAgICAgICAgICBleGl0X2NvZGUgPSBzZWxmLl9leGVjdXRp
dmUucnVuX2NvbW1hbmQoY21kLCByZXR1cm5fZXhpdF9jb2RlPVRydWUpCisgICAgICAgICAgICBl
eGl0X2NvZGUgPSBzZWxmLl9leGVjdXRpdmUucnVuX2NvbW1hbmQoY29tYW5kLCByZXR1cm5fZXhp
dF9jb2RlPVRydWUpCiAgICAgICAgICAgICBpZiBleGl0X2NvZGUgPT0gMDoKICAgICAgICAgICAg
ICAgICAjIFRoZSBpbWFnZXMgYXJlIHRoZSBzYW1lLgotICAgICAgICAgICAgICAgIHJlc3VsdCA9
IEZhbHNlCisgICAgICAgICAgICAgICAgcmVzdWx0ID0gTm9uZQogICAgICAgICAgICAgZWxpZiBl
eGl0X2NvZGUgIT0gMToKLSAgICAgICAgICAgICAgICBfbG9nLmVycm9yKCJpbWFnZSBkaWZmIHJl
dHVybmVkIGFuIGV4aXQgY29kZSBvZiAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICArIHN0
cihleGl0X2NvZGUpKQorICAgICAgICAgICAgICAgIF9sb2cuZXJyb3IoImltYWdlIGRpZmYgcmV0
dXJuZWQgYW4gZXhpdCBjb2RlIG9mICVzIiAlIGV4aXRfY29kZSkKICAgICAgICAgICAgICAgICAj
IFJldHVybmluZyBGYWxzZSBoZXJlIGNhdXNlcyB0aGUgc2NyaXB0IHRvIHRoaW5rIHRoYXQgd2UK
ICAgICAgICAgICAgICAgICAjIHN1Y2Nlc3NmdWxseSBjcmVhdGVkIHRoZSBkaWZmIGV2ZW4gdGhv
dWdoIHdlIGRpZG4ndC4gIElmCiAgICAgICAgICAgICAgICAgIyB3ZSByZXR1cm4gVHJ1ZSwgd2Ug
dGhpbmsgdGhhdCB0aGUgaW1hZ2VzIG1hdGNoIGJ1dCB0aGUgaGFzaGVzCiAgICAgICAgICAgICAg
ICAgIyBkb24ndCBtYXRjaC4KICAgICAgICAgICAgICAgICAjIEZJWE1FOiBGaWd1cmUgb3V0IHdo
eSBpbWFnZV9kaWZmIHJldHVybnMgb3RoZXIgdmFsdWVzLgotICAgICAgICAgICAgICAgIHJlc3Vs
dCA9IEZhbHNlCisgICAgICAgICAgICAgICAgcmVzdWx0ID0gTm9uZQogICAgICAgICBleGNlcHQg
T1NFcnJvciwgZToKICAgICAgICAgICAgIGlmIGUuZXJybm8gPT0gZXJybm8uRU5PRU5UIG9yIGUu
ZXJybm8gPT0gZXJybm8uRUFDQ0VTOgogICAgICAgICAgICAgICAgIF9jb21wYXJlX2F2YWlsYWJs
ZSA9IEZhbHNlCiAgICAgICAgICAgICBlbHNlOgotICAgICAgICAgICAgICAgIHJhaXNlIGUKKyAg
ICAgICAgICAgICAgICByYWlzZQogICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgaWYgZXhp
dF9jb2RlID09IDE6CisgICAgICAgICAgICAgICAgcmVzdWx0ID0gc2VsZi5fZmlsZXN5c3RlbS5y
ZWFkX2JpbmFyeV9maWxlKGRpZmZfZmlsZW5hbWUpCiAgICAgICAgICAgICBzZWxmLl9maWxlc3lz
dGVtLnJtdHJlZShzdHIodGVtcGRpcikpCiAgICAgICAgIHJldHVybiByZXN1bHQKIApJbmRleDog
VG9vbHMvU2NyaXB0cy93ZWJraXRweS9sYXlvdXRfdGVzdHMvcG9ydC9jaHJvbWl1bV91bml0dGVz
dC5weQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09Ci0tLSBUb29scy9TY3JpcHRzL3dlYmtpdHB5L2xheW91dF90ZXN0cy9w
b3J0L2Nocm9taXVtX3VuaXR0ZXN0LnB5CShyZXZpc2lvbiA5MDEzNSkKKysrIFRvb2xzL1Njcmlw
dHMvd2Via2l0cHkvbGF5b3V0X3Rlc3RzL3BvcnQvY2hyb21pdW1fdW5pdHRlc3QucHkJKHdvcmtp
bmcgY29weSkKQEAgLTIxNCwxMyArMjE0LDE5IEBAIExJTlVYIFdJTiA6IGZhc3QvanMvdmVyeS1n
b29kLmpzID0gVElNRU8KICAgICAgICAgbW9ja19vcHRpb25zID0gbW9ja3Rvb2wuTW9ja09wdGlv
bnMoKQogICAgICAgICBwb3J0ID0gQ2hyb21pdW1Qb3J0VGVzdC5UZXN0TGludXhQb3J0KG1vY2tf
b3B0aW9ucykKIAorICAgICAgICBtb2NrX2ltYWdlX2RpZmYgPSAiTU9DSyBJbWFnZSBEaWZmIgor
CisgICAgICAgIGRlZiBtb2NrX3J1bl9jb21tYW5kKGFyZ3MpOgorICAgICAgICAgICAgcG9ydC5f
ZmlsZXN5c3RlbS53cml0ZV9iaW5hcnlfZmlsZShhcmdzWzRdLCBtb2NrX2ltYWdlX2RpZmYpCisg
ICAgICAgICAgICByZXR1cm4gMQorCiAgICAgICAgICMgSW1hZ2VzIGFyZSBkaWZmZXJlbnQuCi0g
ICAgICAgIHBvcnQuX2V4ZWN1dGl2ZSA9IGV4ZWN1dGl2ZV9tb2NrLk1vY2tFeGVjdXRpdmUyKGV4
aXRfY29kZT0wKQotICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhGYWxzZSwgcG9ydC5kaWZmX2lt
YWdlKCJFWFBFQ1RFRCIsICJBQ1RVQUwiKSkKKyAgICAgICAgcG9ydC5fZXhlY3V0aXZlID0gZXhl
Y3V0aXZlX21vY2suTW9ja0V4ZWN1dGl2ZTIocnVuX2NvbW1hbmRfZm49bW9ja19ydW5fY29tbWFu
ZCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMobW9ja19pbWFnZV9kaWZmLCBwb3J0LmRpZmZf
aW1hZ2UoIkVYUEVDVEVEIiwgIkFDVFVBTCIpKQogCiAgICAgICAgICMgSW1hZ2VzIGFyZSB0aGUg
c2FtZS4KLSAgICAgICAgcG9ydC5fZXhlY3V0aXZlID0gZXhlY3V0aXZlX21vY2suTW9ja0V4ZWN1
dGl2ZTIoZXhpdF9jb2RlPTEpCi0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKFRydWUsIHBvcnQu
ZGlmZl9pbWFnZSgiRVhQRUNURUQiLCAiQUNUVUFMIikpCisgICAgICAgIHBvcnQuX2V4ZWN1dGl2
ZSA9IGV4ZWN1dGl2ZV9tb2NrLk1vY2tFeGVjdXRpdmUyKGV4aXRfY29kZT0wKQorICAgICAgICBz
ZWxmLmFzc2VydEVxdWFscyhOb25lLCBwb3J0LmRpZmZfaW1hZ2UoIkVYUEVDVEVEIiwgIkFDVFVB
TCIpKQogCiAgICAgICAgICMgVGhlcmUgd2FzIHNvbWUgZXJyb3IgcnVubmluZyBpbWFnZV9kaWZm
LgogICAgICAgICBwb3J0Ll9leGVjdXRpdmUgPSBleGVjdXRpdmVfbW9jay5Nb2NrRXhlY3V0aXZl
MihleGl0X2NvZGU9MikKSW5kZXg6IFRvb2xzL1NjcmlwdHMvd2Via2l0cHkvbGF5b3V0X3Rlc3Rz
L3BvcnQvcG9ydF90ZXN0Y2FzZS5weQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBUb29scy9TY3JpcHRzL3dlYmtp
dHB5L2xheW91dF90ZXN0cy9wb3J0L3BvcnRfdGVzdGNhc2UucHkJKHJldmlzaW9uIDkwMTM1KQor
KysgVG9vbHMvU2NyaXB0cy93ZWJraXRweS9sYXlvdXRfdGVzdHMvcG9ydC9wb3J0X3Rlc3RjYXNl
LnB5CSh3b3JraW5nIGNvcHkpCkBAIC0yMjksMjQgKzIyOSwyNCBAQCBjbGFzcyBQb3J0VGVzdENh
c2UodW5pdHRlc3QuVGVzdENhc2UpOgogICAgICAgICBwb3J0ID0gc2VsZi5tYWtlX3BvcnQoKQog
ICAgICAgICBpZiBub3QgcG9ydDoKICAgICAgICAgICAgIHJldHVybgotICAgICAgICBzZWxmLmFz
c2VydEZhbHNlKHBvcnQuZGlmZl9pbWFnZShOb25lLCBOb25lLCBOb25lKSkKLSAgICAgICAgc2Vs
Zi5hc3NlcnRGYWxzZShwb3J0LmRpZmZfaW1hZ2UoTm9uZSwgJycsIE5vbmUpKQotICAgICAgICBz
ZWxmLmFzc2VydEZhbHNlKHBvcnQuZGlmZl9pbWFnZSgnJywgTm9uZSwgTm9uZSkpCi0gICAgICAg
IHNlbGYuYXNzZXJ0RmFsc2UocG9ydC5kaWZmX2ltYWdlKCcnLCAnJywgTm9uZSkpCisgICAgICAg
IHNlbGYuYXNzZXJ0RmFsc2UocG9ydC5kaWZmX2ltYWdlKE5vbmUsIE5vbmUpKQorICAgICAgICBz
ZWxmLmFzc2VydEZhbHNlKHBvcnQuZGlmZl9pbWFnZShOb25lLCAnJykpCisgICAgICAgIHNlbGYu
YXNzZXJ0RmFsc2UocG9ydC5kaWZmX2ltYWdlKCcnLCBOb25lKSkKKyAgICAgICAgc2VsZi5hc3Nl
cnRGYWxzZShwb3J0LmRpZmZfaW1hZ2UoJycsICcnKSkKIAogICAgIGRlZiB0ZXN0X2RpZmZfaW1h
Z2VfX21pc3NpbmdfYWN0dWFsKHNlbGYpOgogICAgICAgICBwb3J0ID0gc2VsZi5tYWtlX3BvcnQo
KQogICAgICAgICBpZiBub3QgcG9ydDoKICAgICAgICAgICAgIHJldHVybgotICAgICAgICBzZWxm
LmFzc2VydFRydWUocG9ydC5kaWZmX2ltYWdlKE5vbmUsICdmb28nLCBOb25lKSkKLSAgICAgICAg
c2VsZi5hc3NlcnRUcnVlKHBvcnQuZGlmZl9pbWFnZSgnJywgJ2ZvbycsIE5vbmUpKQorICAgICAg
ICBzZWxmLmFzc2VydFRydWUocG9ydC5kaWZmX2ltYWdlKE5vbmUsICdmb28nKSkKKyAgICAgICAg
c2VsZi5hc3NlcnRUcnVlKHBvcnQuZGlmZl9pbWFnZSgnJywgJ2ZvbycpKQogCiAgICAgZGVmIHRl
c3RfZGlmZl9pbWFnZV9fbWlzc2luZ19leHBlY3RlZChzZWxmKToKICAgICAgICAgcG9ydCA9IHNl
bGYubWFrZV9wb3J0KCkKICAgICAgICAgaWYgbm90IHBvcnQ6CiAgICAgICAgICAgICByZXR1cm4K
LSAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHBvcnQuZGlmZl9pbWFnZSgnZm9vJywgTm9uZSwgTm9u
ZSkpCi0gICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShwb3J0LmRpZmZfaW1hZ2UoJ2ZvbycsICcnLCBO
b25lKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHBvcnQuZGlmZl9pbWFnZSgnZm9vJywgTm9u
ZSkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShwb3J0LmRpZmZfaW1hZ2UoJ2ZvbycsICcnKSkK
IAogICAgIGRlZiB0ZXN0X2NoZWNrX2J1aWxkKHNlbGYpOgogICAgICAgICBwb3J0ID0gc2VsZi5t
YWtlX3BvcnQoKQpJbmRleDogVG9vbHMvU2NyaXB0cy93ZWJraXRweS9sYXlvdXRfdGVzdHMvcG9y
dC90ZXN0LnB5Cj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT0KLS0tIFRvb2xzL1NjcmlwdHMvd2Via2l0cHkvbGF5b3V0X3Rl
c3RzL3BvcnQvdGVzdC5weQkocmV2aXNpb24gOTAxMzUpCisrKyBUb29scy9TY3JpcHRzL3dlYmtp
dHB5L2xheW91dF90ZXN0cy9wb3J0L3Rlc3QucHkJKHdvcmtpbmcgY29weSkKQEAgLTE0NCw2ICsx
NDQsOCBAQCBkZWYgdW5pdF90ZXN0X2xpc3QoKToKICAgICB0ZXN0cy5hZGQoJ2ZhaWx1cmVzL3Vu
ZXhwZWN0ZWQvdGV4dC1pbWFnZS1jaGVja3N1bS5odG1sJywKICAgICAgICAgICAgICAgYWN0dWFs
X3RleHQ9J3RleHQtaW1hZ2UtY2hlY2tzdW1fZmFpbC10eHQnLAogICAgICAgICAgICAgICBhY3R1
YWxfY2hlY2tzdW09J3RleHQtaW1hZ2UtY2hlY2tzdW1fZmFpbC1jaGVja3N1bScpCisgICAgdGVz
dHMuYWRkKCdmYWlsdXJlcy91bmV4cGVjdGVkL2NoZWNrc3VtLXdpdGgtbWF0Y2hpbmctaW1hZ2Uu
aHRtbCcsCisgICAgICAgICAgICAgIGFjdHVhbF9jaGVja3N1bT0ndGV4dC1pbWFnZS1jaGVja3N1
bV9mYWlsLWNoZWNrc3VtJykKICAgICB0ZXN0cy5hZGQoJ2ZhaWx1cmVzL3VuZXhwZWN0ZWQvdGlt
ZW91dC5odG1sJywgdGltZW91dD1UcnVlKQogICAgIHRlc3RzLmFkZCgnaHR0cC90ZXN0cy9wYXNz
ZXMvdGV4dC5odG1sJykKICAgICB0ZXN0cy5hZGQoJ2h0dHAvdGVzdHMvcGFzc2VzL2ltYWdlLmh0
bWwnKQpAQCAtMzEzLDEzICszMTUsMTEgQEAgY2xhc3MgVGVzdFBvcnQoYmFzZS5Qb3J0KToKICAg
ICBkZWYgZGVmYXVsdF9jb25maWd1cmF0aW9uKHNlbGYpOgogICAgICAgICByZXR1cm4gJ1JlbGVh
c2UnCiAKLSAgICBkZWYgZGlmZl9pbWFnZShzZWxmLCBleHBlY3RlZF9jb250ZW50cywgYWN0dWFs
X2NvbnRlbnRzLAotICAgICAgICAgICAgICAgICAgIGRpZmZfZmlsZW5hbWU9Tm9uZSk6CisgICAg
ZGVmIGRpZmZfaW1hZ2Uoc2VsZiwgZXhwZWN0ZWRfY29udGVudHMsIGFjdHVhbF9jb250ZW50cyk6
CiAgICAgICAgIGRpZmZlZCA9IGFjdHVhbF9jb250ZW50cyAhPSBleHBlY3RlZF9jb250ZW50cwot
ICAgICAgICBpZiBkaWZmZWQgYW5kIGRpZmZfZmlsZW5hbWU6Ci0gICAgICAgICAgICBzZWxmLl9m
aWxlc3lzdGVtLndyaXRlX2JpbmFyeV9maWxlKGRpZmZfZmlsZW5hbWUsCi0gICAgICAgICAgICAg
ICAgIjwgJXNcbi0tLVxuPiAlc1xuIiAlIChleHBlY3RlZF9jb250ZW50cywgYWN0dWFsX2NvbnRl
bnRzKSkKLSAgICAgICAgcmV0dXJuIGRpZmZlZAorICAgICAgICBpZiBkaWZmZWQ6CisgICAgICAg
ICAgICByZXR1cm4gIjwgJXNcbi0tLVxuPiAlc1xuIiAlIChleHBlY3RlZF9jb250ZW50cywgYWN0
dWFsX2NvbnRlbnRzKQorICAgICAgICByZXR1cm4gTm9uZQogCiAgICAgZGVmIGxheW91dF90ZXN0
c19kaXIoc2VsZik6CiAgICAgICAgIHJldHVybiBMQVlPVVRfVEVTVF9ESVIKSW5kZXg6IFRvb2xz
L1NjcmlwdHMvd2Via2l0cHkvbGF5b3V0X3Rlc3RzL3BvcnQvd2Via2l0LnB5Cj09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0K
LS0tIFRvb2xzL1NjcmlwdHMvd2Via2l0cHkvbGF5b3V0X3Rlc3RzL3BvcnQvd2Via2l0LnB5CShy
ZXZpc2lvbiA5MDEzNSkKKysrIFRvb2xzL1NjcmlwdHMvd2Via2l0cHkvbGF5b3V0X3Rlc3RzL3Bv
cnQvd2Via2l0LnB5CSh3b3JraW5nIGNvcHkpCkBAIC0xMzIsMjIgKzEzMiwyMCBAQCBjbGFzcyBX
ZWJLaXRQb3J0KGJhc2UuUG9ydCk6CiAgICAgICAgICAgICByZXR1cm4gRmFsc2UKICAgICAgICAg
cmV0dXJuIFRydWUKIAotICAgIGRlZiBkaWZmX2ltYWdlKHNlbGYsIGV4cGVjdGVkX2NvbnRlbnRz
LCBhY3R1YWxfY29udGVudHMsCi0gICAgICAgICAgICAgICAgICAgZGlmZl9maWxlbmFtZT1Ob25l
KToKLSAgICAgICAgIiIiUmV0dXJuIFRydWUgaWYgdGhlIHR3byBmaWxlcyBhcmUgZGlmZmVyZW50
LiBBbHNvIHdyaXRlIGEgZGVsdGEKLSAgICAgICAgaW1hZ2Ugb2YgdGhlIHR3byBpbWFnZXMgaW50
byB8ZGlmZl9maWxlbmFtZXwgaWYgaXQgaXMgbm90IE5vbmUuIiIiCi0KKyAgICBkZWYgZGlmZl9p
bWFnZShzZWxmLCBleHBlY3RlZF9jb250ZW50cywgYWN0dWFsX2NvbnRlbnRzKToKICAgICAgICAg
IyBIYW5kbGUgdGhlIGNhc2Ugd2hlcmUgdGhlIHRlc3QgZGlkbid0IGFjdHVhbGx5IGdlbmVyYXRl
IGFuIGltYWdlLgogICAgICAgICAjIEZJWE1FOiBuZWVkIHVuaXQgdGVzdHMgZm9yIHRoaXMuCiAg
ICAgICAgIGlmIG5vdCBhY3R1YWxfY29udGVudHMgYW5kIG5vdCBleHBlY3RlZF9jb250ZW50czoK
LSAgICAgICAgICAgIHJldHVybiBGYWxzZQorICAgICAgICAgICAgcmV0dXJuIE5vbmUKICAgICAg
ICAgaWYgbm90IGFjdHVhbF9jb250ZW50cyBvciBub3QgZXhwZWN0ZWRfY29udGVudHM6CisgICAg
ICAgICAgICAjIEZJWE1FOiBJdCdzIG5vdCBjbGVhciB3aGF0IHdlIHNob3VsZCByZXR1cm4gaW4g
dGhpcyBjYXNlLgorICAgICAgICAgICAgIyBNYXliZSB3ZSBzaG91bGQgdGhyb3cgYW4gZXhjZXB0
aW9uPwogICAgICAgICAgICAgcmV0dXJuIFRydWUKIAotICAgICAgICBzcCA9IHNlbGYuX2RpZmZf
aW1hZ2VfcmVxdWVzdChleHBlY3RlZF9jb250ZW50cywgYWN0dWFsX2NvbnRlbnRzKQotICAgICAg
ICByZXR1cm4gc2VsZi5fZGlmZl9pbWFnZV9yZXBseShzcCwgZGlmZl9maWxlbmFtZSkKKyAgICAg
ICAgcHJvY2VzcyA9IHNlbGYuX3N0YXJ0X2ltYWdlX2RpZmZfcHJvY2VzcyhleHBlY3RlZF9jb250
ZW50cywgYWN0dWFsX2NvbnRlbnRzKQorICAgICAgICByZXR1cm4gc2VsZi5fcmVhZF9pbWFnZV9k
aWZmKHByb2Nlc3MpCiAKLSAgICBkZWYgX2RpZmZfaW1hZ2VfcmVxdWVzdChzZWxmLCBleHBlY3Rl
ZF9jb250ZW50cywgYWN0dWFsX2NvbnRlbnRzKToKKyAgICBkZWYgX3N0YXJ0X2ltYWdlX2RpZmZf
cHJvY2VzcyhzZWxmLCBleHBlY3RlZF9jb250ZW50cywgYWN0dWFsX2NvbnRlbnRzKToKICAgICAg
ICAgIyBGSVhNRTogVGhlcmUgbmVlZHMgdG8gYmUgYSBtb3JlIHNhbmUgd2F5IG9mIGhhbmRsaW5n
IGRlZmF1bHQKICAgICAgICAgIyB2YWx1ZXMgZm9yIG9wdGlvbnMgc28gdGhhdCB5b3UgY2FuIGRp
c3Rpbmd1aXNoIGJldHdlZW4gYSBkZWZhdWx0CiAgICAgICAgICMgdmFsdWUgb2YgTm9uZSBhbmQg
YSBkZWZhdWx0IHZhbHVlIHRoYXQgd2Fzbid0IHNldC4KQEAgLTE1NiwxNSArMTU0LDE0IEBAIGNs
YXNzIFdlYktpdFBvcnQoYmFzZS5Qb3J0KToKICAgICAgICAgZWxzZToKICAgICAgICAgICAgIHRv
bGVyYW5jZSA9IDAuMQogICAgICAgICBjb21tYW5kID0gW3NlbGYuX3BhdGhfdG9faW1hZ2VfZGlm
ZigpLCAnLS10b2xlcmFuY2UnLCBzdHIodG9sZXJhbmNlKV0KLSAgICAgICAgc3AgPSBzZXJ2ZXJf
cHJvY2Vzcy5TZXJ2ZXJQcm9jZXNzKHNlbGYsICdJbWFnZURpZmYnLCBjb21tYW5kKQorICAgICAg
ICBwcm9jZXNzID0gc2VydmVyX3Byb2Nlc3MuU2VydmVyUHJvY2VzcyhzZWxmLCAnSW1hZ2VEaWZm
JywgY29tbWFuZCkKIAotICAgICAgICBzcC53cml0ZSgnQ29udGVudC1MZW5ndGg6ICVkXG4lc0Nv
bnRlbnQtTGVuZ3RoOiAlZFxuJXMnICUKLSAgICAgICAgICAgICAgICAgKGxlbihhY3R1YWxfY29u
dGVudHMpLCBhY3R1YWxfY29udGVudHMsCi0gICAgICAgICAgICAgICAgICBsZW4oZXhwZWN0ZWRf
Y29udGVudHMpLCBleHBlY3RlZF9jb250ZW50cykpCisgICAgICAgIHByb2Nlc3Mud3JpdGUoJ0Nv
bnRlbnQtTGVuZ3RoOiAlZFxuJXNDb250ZW50LUxlbmd0aDogJWRcbiVzJyAlICgKKyAgICAgICAg
ICAgIGxlbihhY3R1YWxfY29udGVudHMpLCBhY3R1YWxfY29udGVudHMsCisgICAgICAgICAgICBs
ZW4oZXhwZWN0ZWRfY29udGVudHMpLCBleHBlY3RlZF9jb250ZW50cykpCisgICAgICAgIHJldHVy
biBwcm9jZXNzCiAKLSAgICAgICAgcmV0dXJuIHNwCi0KLSAgICBkZWYgX2RpZmZfaW1hZ2VfcmVw
bHkoc2VsZiwgc3AsIGRpZmZfZmlsZW5hbWUpOgorICAgIGRlZiBfcmVhZF9pbWFnZV9kaWZmKHNl
bGYsIHNwKToKICAgICAgICAgdGltZW91dCA9IDIuMAogICAgICAgICBkZWFkbGluZSA9IHRpbWUu
dGltZSgpICsgdGltZW91dAogICAgICAgICBvdXRwdXQgPSBzcC5yZWFkX2xpbmUodGltZW91dCkK
QEAgLTE4MSwxOSArMTc4LDE2IEBAIGNsYXNzIFdlYktpdFBvcnQoYmFzZS5Qb3J0KToKICAgICAg
ICAgICAgICAgICB0aW1lb3V0ID0gZGVhZGxpbmUgLSB0aW1lLnRpbWUoKQogICAgICAgICAgICAg
ICAgIG91dHB1dCA9IHNwLnJlYWRfbGluZShkZWFkbGluZSkKIAotICAgICAgICByZXN1bHQgPSBU
cnVlCi0gICAgICAgIGlmIG91dHB1dC5zdGFydHN3aXRoKCdkaWZmJyk6Ci0gICAgICAgICAgICBt
ID0gcmUubWF0Y2goJ2RpZmY6ICguKyklIChwYXNzZWR8ZmFpbGVkKScsIG91dHB1dCkKLSAgICAg
ICAgICAgIGlmIG0uZ3JvdXAoMikgPT0gJ3Bhc3NlZCc6Ci0gICAgICAgICAgICAgICAgcmVzdWx0
ID0gRmFsc2UKLSAgICAgICAgZWxpZiBvdXRwdXQgYW5kIGRpZmZfZmlsZW5hbWU6Ci0gICAgICAg
ICAgICBzZWxmLl9maWxlc3lzdGVtLndyaXRlX2JpbmFyeV9maWxlKGRpZmZfZmlsZW5hbWUsIG91
dHB1dCkKLSAgICAgICAgZWxpZiBzcC50aW1lZF9vdXQ6CisgICAgICAgIGlmIHNwLnRpbWVkX291
dDoKICAgICAgICAgICAgIF9sb2cuZXJyb3IoIkltYWdlRGlmZiB0aW1lZCBvdXQiKQotICAgICAg
ICBlbGlmIHNwLmNyYXNoZWQ6CisgICAgICAgIGlmIHNwLmNyYXNoZWQ6CiAgICAgICAgICAgICBf
bG9nLmVycm9yKCJJbWFnZURpZmYgY3Jhc2hlZCIpCiAgICAgICAgIHNwLnN0b3AoKQotICAgICAg
ICByZXR1cm4gcmVzdWx0CisgICAgICAgIGlmIG91dHB1dC5zdGFydHN3aXRoKCdkaWZmJyk6Cisg
ICAgICAgICAgICBtID0gcmUubWF0Y2goJ2RpZmY6ICguKyklIChwYXNzZWR8ZmFpbGVkKScsIG91
dHB1dCkKKyAgICAgICAgICAgIGlmIG0uZ3JvdXAoMikgPT0gJ3Bhc3NlZCc6CisgICAgICAgICAg
ICAgICAgcmV0dXJuIE5vbmUKKyAgICAgICAgcmV0dXJuIG91dHB1dAogCiAgICAgZGVmIGRlZmF1
bHRfcmVzdWx0c19kaXJlY3Rvcnkoc2VsZik6CiAgICAgICAgICMgUmVzdWx0cyBhcmUgc3RvcmUg
cmVsYXRpdmUgdG8gdGhlIGJ1aWx0IHByb2R1Y3RzIHRvIG1ha2UgaXQgZWFzeQpJbmRleDogVG9v
bHMvU2NyaXB0cy93ZWJraXRweS90b19iZV9tb3ZlZC9yZWJhc2VsaW5lX2Nocm9taXVtX3dlYmtp
dF90ZXN0cy5weQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09Ci0tLSBUb29scy9TY3JpcHRzL3dlYmtpdHB5L3RvX2JlX21v
dmVkL3JlYmFzZWxpbmVfY2hyb21pdW1fd2Via2l0X3Rlc3RzLnB5CShyZXZpc2lvbiA5MDEzNSkK
KysrIFRvb2xzL1NjcmlwdHMvd2Via2l0cHkvdG9fYmVfbW92ZWQvcmViYXNlbGluZV9jaHJvbWl1
bV93ZWJraXRfdGVzdHMucHkJKHdvcmtpbmcgY29weSkKQEAgLTUxNyw3ICs1MTcsNyBAQCBjbGFz
cyBSZWJhc2VsaW5lcihvYmplY3QpOgogICAgICAgICAiIiIKIAogICAgICAgICBpZiBpc19pbWFn
ZToKLSAgICAgICAgICAgIHJldHVybiBzZWxmLl9wb3J0LmRpZmZfaW1hZ2Uob3V0cHV0MSwgb3V0
cHV0MiwgTm9uZSkKKyAgICAgICAgICAgIHJldHVybiBzZWxmLl9wb3J0LmRpZmZfaW1hZ2Uob3V0
cHV0MSwgb3V0cHV0MikKIAogICAgICAgICByZXR1cm4gc2VsZi5fcG9ydC5jb21wYXJlX3RleHQo
b3V0cHV0MSwgb3V0cHV0MikKIApAQCAtNjAyLDcgKzYwMiw4IEBAIGNsYXNzIFJlYmFzZWxpbmVy
KG9iamVjdCk6CiAgICAgICAgICAgICBfbG9nLmRlYnVnKCcgSHRtbDogZGlmZmluZyAiJXMiIGFu
ZCAiJXMiJywgb2xkX2ZpbGUsIG5ld19maWxlKQogICAgICAgICAgICAgb2xkX291dHB1dCA9IHNl
bGYuX2ZpbGVzeXN0ZW0ucmVhZF9iaW5hcnlfZmlsZShvbGRfZmlsZSkKICAgICAgICAgICAgIG5l
d19vdXRwdXQgPSBzZWxmLl9maWxlc3lzdGVtLnJlYWRfYmluYXJ5X2ZpbGUobmV3X2ZpbGUpCi0g
ICAgICAgICAgICBoYXNfZGlmZiA9IHNlbGYuX3BvcnQuZGlmZl9pbWFnZShvbGRfb3V0cHV0LCBu
ZXdfb3V0cHV0LCBkaWZmX2ZpbGUpCisgICAgICAgICAgICBpbWFnZV9kaWZmID0gc2VsZi5fcG9y
dC5kaWZmX2ltYWdlKG9sZF9vdXRwdXQsIG5ld19vdXRwdXQpCisgICAgICAgICAgICBzZWxmLl9m
aWxlc3lzdGVtLndyaXRlX2JpbmFyeV9maWxlKGRpZmZfZmlsZSwgaW1hZ2VfZGlmZikKIAogICAg
ICAgICBpZiBoYXNfZGlmZjoKICAgICAgICAgICAgIF9sb2cuZGVidWcoJyAgSHRtbDogY3JlYXRl
ZCBiYXNlbGluZSBkaWZmIGZpbGU6ICIlcyIuJywgZGlmZl9maWxlKQo=
</data>
<flag name="review"
          id="93795"
          type_id="1"
          status="+"
          setter="eric"
    />
          </attachment>
      

    </bug>

</bugzilla>