<?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>50098</bug_id>
          
          <creation_ts>2010-11-25 22:11:42 -0800</creation_ts>
          <short_desc>New webkit-patch rebaseline2 command.</short_desc>
          <delta_ts>2011-08-06 13:18:46 -0700</delta_ts>
          <reporter_accessible>1</reporter_accessible>
          <cclist_accessible>1</cclist_accessible>
          <classification_id>1</classification_id>
          <classification>Unclassified</classification>
          <product>WebKit</product>
          <component>New Bugs</component>
          <version>528+ (Nightly build)</version>
          <rep_platform>Other</rep_platform>
          <op_sys>OS X 10.5</op_sys>
          <bug_status>RESOLVED</bug_status>
          <resolution>WONTFIX</resolution>
          
          
          <bug_file_loc></bug_file_loc>
          <status_whiteboard></status_whiteboard>
          <keywords></keywords>
          <priority>P2</priority>
          <bug_severity>Normal</bug_severity>
          <target_milestone>---</target_milestone>
          <dependson>50901</dependson>
    
    <dependson>52136</dependson>
          
          <everconfirmed>0</everconfirmed>
          <reporter name="James Kozianski">koz</reporter>
          <assigned_to name="Nobody">webkit-unassigned</assigned_to>
          <cc>abarth</cc>
    
    <cc>dpranke</cc>
    
    <cc>eric</cc>
    
    <cc>hayato</cc>
    
    <cc>mihaip</cc>
    
    <cc>ojan</cc>
    
    <cc>tony</cc>
    
    <cc>webkit.review.bot</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>313903</commentid>
    <comment_count>0</comment_count>
    <who name="James Kozianski">koz</who>
    <bug_when>2010-11-25 22:11:42 -0800</bug_when>
    <thetext>New webkit-patch rebaseline2 command.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>313904</commentid>
    <comment_count>1</comment_count>
      <attachid>74903</attachid>
    <who name="James Kozianski">koz</who>
    <bug_when>2010-11-25 22:12:33 -0800</bug_when>
    <thetext>Created attachment 74903
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>314243</commentid>
    <comment_count>2</comment_count>
      <attachid>74983</attachid>
    <who name="James Kozianski">koz</who>
    <bug_when>2010-11-28 19:11:24 -0800</bug_when>
    <thetext>Created attachment 74983
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>314245</commentid>
    <comment_count>3</comment_count>
      <attachid>74983</attachid>
    <who name="James Kozianski">koz</who>
    <bug_when>2010-11-28 19:13:25 -0800</bug_when>
    <thetext>Comment on attachment 74983
Patch

Added ImageDiff support, instead of just failing on images that don&apos;t have checksums.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>314246</commentid>
    <comment_count>4</comment_count>
    <who name="James Kozianski">koz</who>
    <bug_when>2010-11-28 19:18:31 -0800</bug_when>
    <thetext>This is intended to be an eventual replacement for the various deduping and rebaselining scripts we have. Apologies for the large patch - the individual components don&apos;t really mean anything without the context of the overall script.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>314480</commentid>
    <comment_count>5</comment_count>
    <who name="Adam Barth">abarth</who>
    <bug_when>2010-11-29 09:58:27 -0800</bug_when>
    <thetext>&gt; This is intended to be an eventual replacement for the various deduping and rebaselining scripts we have.

Yay!  Thanks for working on this project.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>314488</commentid>
    <comment_count>6</comment_count>
      <attachid>74983</attachid>
    <who name="Adam Barth">abarth</who>
    <bug_when>2010-11-29 10:18:05 -0800</bug_when>
    <thetext>Comment on attachment 74983
Patch

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

This looks cool, but you&apos;re re-inventing a bunch of wheels instead of making the existing wheels more awesome.  Also, you&apos;ve siloed a bunch of your code in a separate package instead of putting it in the right place in the package hierarchy where it can be used by other parts of webkitpy.

In general, the effectiveness of webkitpy should grow like n^2.  The way you&apos;ve written this patch, the effectiveness is only growing like n because you&apos;re not making use of the network effects of sharing code.

&gt; WebKitTools/Scripts/webkitpy/layout_tests/rebaseline/all_tests.py:7
&gt; +unittest.main()

We have some nifty unittest auto-discovery code.  Maybe we should use that here?  It&apos;s a pay to register new unit tests with the harness.

&gt; WebKitTools/Scripts/webkitpy/layout_tests/rebaseline/bucket.py:209
&gt; +    def b(self, bucket_name, *args):

This is kind of a short function name.  Can we use something more descriptive?

&gt; WebKitTools/Scripts/webkitpy/layout_tests/rebaseline/builder.py:34
&gt; +class RemoteZip(object):

This class seems general and should be in webkitpy.common.net

&gt; WebKitTools/Scripts/webkitpy/layout_tests/rebaseline/builder.py:42
&gt; +    def _load(self):
&gt; +        if self._zip_file is None:
&gt; +            self._zip_file = zipfile.ZipFile(urllib.urlretrieve(self._zip_url)[0])

Consider using NetworkTransaction to be robust to network connectivity issues.

&gt; WebKitTools/Scripts/webkitpy/layout_tests/rebaseline/builder.py:63
&gt; +class ZipFileHandle:

same here.

&gt; WebKitTools/Scripts/webkitpy/layout_tests/rebaseline/builder.py:100
&gt; +class DirectoryAsZip(object):

Also a general class that should be in webkit.common somewhere.

&gt; WebKitTools/Scripts/webkitpy/layout_tests/rebaseline/builder.py:121
&gt; +        f = open(os.path.join(self._path, filename))
&gt; +        contents = f.read()
&gt; +        f.close

We generally use &quot;with&quot; to avoid leaking file handles.  Also, we have a FileSystem class we use to abstract these operations.  Notice that you haven&apos;t specified a codec, which is something that FileSystem enforces.

&gt; WebKitTools/Scripts/webkitpy/layout_tests/rebaseline/builder.py:135
&gt; +    def delete(self, filename):
&gt; +        filename = os.path.join(self._path, filename)
&gt; +        os.remove(filename)

This seems like a security vulnerability waiting to happen...  Maybe some sort of requirement that the final filename is actually a subdirectory of self._path?

&gt; WebKitTools/Scripts/webkitpy/layout_tests/rebaseline/builder.py:139
&gt; +class Builder(object):
&gt; +    &quot;&quot;&quot;Retrieves results from zip files stored on a buildbot builder&quot;&quot;&quot;

We already have an abstraction for a BuildBot.  Presumably we should add this functionality to that abstraction instead of creating a new abstraction.

&gt; WebKitTools/Scripts/webkitpy/layout_tests/rebaseline/builder.py:168
&gt; +    def results_for(self, name, target_type=None):

We already have code that does this for the non-zip case.  We should merge this functionality into that code instead of having two silos.

&gt; WebKitTools/Scripts/webkitpy/layout_tests/rebaseline/builder.py:209
&gt; +class AggregateBuilder(object):

This belongs in the buildbot package somewhere.

&gt; WebKitTools/Scripts/webkitpy/layout_tests/rebaseline/builder.py:234
&gt; +        return &apos;http://build.chromium.org/f/chromium/layout_test_results/&apos; + builder_name + &apos;/layout-test-results.zip&apos;

General webkitpy code shouldn&apos;t refer to build.chromium.org.  You probably need to add this to the port abstraction.

&gt; WebKitTools/Scripts/webkitpy/layout_tests/rebaseline/builder.py:264
&gt; +class WebKitBuilder(object):
&gt; +    BUILDERS = {
&gt; +        &apos;mac-snowleopard&apos;: &apos;SnowLeopard%20Intel%20Release%20(Tests)&apos;,
&gt; +        &apos;mac-leopard&apos;: &apos;Leopard%20Intel%20Debug%20(Tests)&apos;,
&gt; +        &apos;win&apos;: &apos;Windows%207%20Release%20(WebKit2%20Tests)&apos;,
&gt; +        &apos;chromium-linux&apos;: &apos;GTK%20Linux%2032-bit%20Release&apos;,
&gt; +    }

webkitpy already knows about these things.  Please look at how the rest of the system knows about this stuff.

&gt; WebKitTools/Scripts/webkitpy/layout_tests/rebaseline/rebaseliner.py:61
&gt; +    def _make_bucket_tree(self):
&gt; +        b = bucket.BucketTree()
&gt; +        b.b(None,
&gt; +            b.b(&apos;mac&apos;,
&gt; +                b.b(&apos;mac-snowleopard&apos;,
&gt; +                    b.b(&apos;mac-leopard&apos;,
&gt; +                        b.b(&apos;mac-tiger&apos;))),
&gt; +                b.b(&apos;win&apos;,
&gt; +                    b.b(&apos;chromium&apos;,
&gt; +                        b.b(&apos;chromium-mac&apos;),
&gt; +                        b.b(&apos;chromium-win&apos;,
&gt; +                            b.b(&apos;chromium-win-vista&apos;,
&gt; +                                b.b(&apos;chromium-win-xp&apos;)),
&gt; +                            b.b(&apos;chromium-linux&apos;,
&gt; +                                b.b(&apos;chromium-gpu&apos;,
&gt; +                                    b.b(&apos;chromium-gpu-linux&apos;),
&gt; +                                    b.b(&apos;chromium-gpu-win&apos;),
&gt; +                                    b.b(&apos;chromium-gpu-mac&apos;))))))),
&gt; +            b.b(&apos;qt&apos;,
&gt; +                b.b(&apos;qt-linux&apos;),
&gt; +                b.b(&apos;qt-mac&apos;),
&gt; +                b.b(&apos;qt-win&apos;)),
&gt; +            b.b(&apos;gtk&apos;))

Is this some kind of description of the structure of the expectations fallback tree?  If so, it should be in code that&apos;s shareable with the rest of webkitpy instead of siloed away here.

&gt; WebKitTools/Scripts/webkitpy/layout_tests/rebaseline/rebaseliner.py:63
&gt; +        AGGREGATE_BUCKETS = [&apos;chromium&apos;, &apos;chromium-win&apos;, &apos;win&apos;, &apos;mac&apos;, &apos;qt&apos;, &apos;chromium-gpu&apos;]

Why is this magic list here?  We shouldn&apos;t have magic constants like this in the code.

&gt; WebKitTools/Scripts/webkitpy/layout_tests/rebaseline/result.py:35
&gt; +class Result(object):
&gt; +    &quot;&quot;&quot;Represents the result of a single test on a single platform&quot;&quot;&quot;

We already have an abstraction for Result.

&gt; WebKitTools/Scripts/webkitpy/tool/commands/rebaseline2.py:29
&gt; +from webkitpy.layout_tests.port import factory

webkitpy.tool cannot import from webkitpy.layout_tests.  Code that&apos;s shared between these two packages should go in webkitpy.common.

&gt; WebKitTools/Scripts/webkitpy/tool/commands/rebaseline2.py:53
&gt; +            make_option(&quot;--chromium&quot;, action=&quot;store_true&quot;, dest=&quot;use_chromium_bots&quot;, help=&quot;Fetch results from the Chromium bots.&quot;),

Boo.  We should use --port to specify the port instead of making a magic special case for Chromium.

&gt; WebKitTools/Scripts/webkitpy/tool/commands/rebaseline2.py:54
&gt; +            make_option(&quot;--webkit&quot;, action=&quot;store_false&quot;, dest=&quot;use_chromium_bots&quot;, help=&quot;Fetch results from the WebKit bots (default).&quot;),

It doesn&apos;t make sense to have a --webkit command line argument for webkit-patch.  Everything webkit-patch does is related to WebKit!

&gt; WebKitTools/Scripts/webkitpy/tool/commands/rebaseline2.py:57
&gt; +            make_option(&quot;--list-builders&quot;, action=&quot;store_true&quot;, dest=&quot;list_builders&quot;, help=&quot;List the builders for each platform.&quot;),
&gt; +            make_option(&quot;--list-archives&quot;, action=&quot;store_true&quot;, dest=&quot;list_archives&quot;, help=&quot;Show the URLs of the test result archives.&quot;),
&gt; +            make_option(&quot;--show-archives&quot;, action=&quot;store_true&quot;, dest=&quot;show_archives&quot;, help=&quot;Show the results stored in the specified archives.&quot;),

These seem like separate commands.  Why are they arguments to this command?

&gt; WebKitTools/Scripts/webkitpy/tool/commands/rebaseline2.py:63
&gt; +        builder = ChromiumBuilder() if options.use_chromium_bots else WebKitBuilder()

This line of code shouldn&apos;t be here.  We should get this information by instantiating a Port object.  How will this line of code scale when there are N contributors to WebKit with as much infrastructure as Chromium?

&gt; WebKitTools/Scripts/webkitpy/tool/commands/rebaseline2.py:73
&gt; +            exit()

Whenever you call exit, you might consider whether what you really want is a separate command.  Calling exit also makes this code difficult to test.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>315584</commentid>
    <comment_count>7</comment_count>
    <who name="James Kozianski">koz</who>
    <bug_when>2010-12-01 03:18:53 -0800</bug_when>
    <thetext>Thanks for the prompt and thorough review, Adam!

(In reply to comment #6)
&gt; (From update of attachment 74983 [details])
&gt; View in context: https://bugs.webkit.org/attachment.cgi?id=74983&amp;action=review
&gt; 
&gt; This looks cool, but you&apos;re re-inventing a bunch of wheels instead of making the existing wheels more awesome.  Also, you&apos;ve siloed a bunch of your code in a separate package instead of putting it in the right place in the package hierarchy where it can be used by other parts of webkitpy.
&gt; 
&gt; In general, the effectiveness of webkitpy should grow like n^2.  The way you&apos;ve written this patch, the effectiveness is only growing like n because you&apos;re not making use of the network effects of sharing code.

Yep, I&apos;m definitely happy to do that. Writing this script for me was a learning process about the test infrastructure as well as the webkitpy module. Having everything be separate allowed me to iterate quickly on my ideas and be confident that I&apos;m not causing regressions in other people&apos;s code. Much of what&apos;s in webkitpy is stuff that I don&apos;t know that I don&apos;t know about, so your comments are helpful for me to know what should be merged and where.

&gt; 
&gt; &gt; WebKitTools/Scripts/webkitpy/layout_tests/rebaseline/all_tests.py:7
&gt; &gt; +unittest.main()
&gt; 
&gt; We have some nifty unittest auto-discovery code.  Maybe we should use that here?  It&apos;s a pay to register new unit tests with the harness.

You&apos;re right - these tests will be auto-discovered by that script. I&apos;ve deleted this file.

&gt; 
&gt; &gt; WebKitTools/Scripts/webkitpy/layout_tests/rebaseline/bucket.py:209
&gt; &gt; +    def b(self, bucket_name, *args):
&gt; 
&gt; This is kind of a short function name.  Can we use something more descriptive?

This was an alias for &apos;make_bucket&apos; intended to allow the call-sites to be concise so that the hierarchical structure of the calls would be easier to parse. I&apos;ve removed this method and introduced a short alias at the call sites.

&gt; 
&gt; &gt; WebKitTools/Scripts/webkitpy/layout_tests/rebaseline/builder.py:34
&gt; &gt; +class RemoteZip(object):
&gt; 
&gt; This class seems general and should be in webkitpy.common.net

Done.

&gt; 
&gt; &gt; WebKitTools/Scripts/webkitpy/layout_tests/rebaseline/builder.py:42
&gt; &gt; +    def _load(self):
&gt; &gt; +        if self._zip_file is None:
&gt; &gt; +            self._zip_file = zipfile.ZipFile(urllib.urlretrieve(self._zip_url)[0])
&gt; 
&gt; Consider using NetworkTransaction to be robust to network connectivity issues.

Done.

&gt; 
&gt; &gt; WebKitTools/Scripts/webkitpy/layout_tests/rebaseline/builder.py:63
&gt; &gt; +class ZipFileHandle:
&gt; 
&gt; same here.

Done.

&gt; 
&gt; &gt; WebKitTools/Scripts/webkitpy/layout_tests/rebaseline/builder.py:100
&gt; &gt; +class DirectoryAsZip(object):
&gt; 
&gt; Also a general class that should be in webkit.common somewhere.

I&apos;ve moved it to webkit.common.diraszip.

&gt; 
&gt; &gt; WebKitTools/Scripts/webkitpy/layout_tests/rebaseline/builder.py:121
&gt; &gt; +        f = open(os.path.join(self._path, filename))
&gt; &gt; +        contents = f.read()
&gt; &gt; +        f.close
&gt; 
&gt; We generally use &quot;with&quot; to avoid leaking file handles.  Also, we have a FileSystem class we use to abstract these operations.  Notice that you haven&apos;t specified a codec, which is something that FileSystem enforces.

Done.

&gt; 
&gt; &gt; WebKitTools/Scripts/webkitpy/layout_tests/rebaseline/builder.py:135
&gt; &gt; +    def delete(self, filename):
&gt; &gt; +        filename = os.path.join(self._path, filename)
&gt; &gt; +        os.remove(filename)
&gt; 
&gt; This seems like a security vulnerability waiting to happen...  Maybe some sort of requirement that the final filename is actually a subdirectory of self._path?

I&apos;ve added a check to ensure the final filename doesn&apos;t include &apos;..&apos;. Is that enough?

&gt; 
&gt; &gt; WebKitTools/Scripts/webkitpy/layout_tests/rebaseline/builder.py:139
&gt; &gt; +class Builder(object):
&gt; &gt; +    &quot;&quot;&quot;Retrieves results from zip files stored on a buildbot builder&quot;&quot;&quot;
&gt; 
&gt; We already have an abstraction for a BuildBot.  Presumably we should add this functionality to that abstraction instead of creating a new abstraction.

I&apos;ve renamed this to ResultSet and moved it to webkitpy.common.net as it is quite a lot more general than the existing BuildBot / builder abstractions. A ResultSet can be used independently of BuildBots / builders as well (for instance, the existing results in one&apos;s LayoutTests directory can be the source of a ResultSet), so the name was ill-suited in the first place.

I&apos;ve also added a method to the Builder class (results()) that returns a ResultSet of the results stored on that Builder.

&gt; 
&gt; &gt; WebKitTools/Scripts/webkitpy/layout_tests/rebaseline/builder.py:168
&gt; &gt; +    def results_for(self, name, target_type=None):
&gt; 
&gt; We already have code that does this for the non-zip case.  We should merge this functionality into that code instead of having two silos.

Are you referring to webkitpy/common/net/layouttestresults.py? I don&apos;t think the code there and this code can really be merged - that code is for parsing a particular results.html file to extract the names of failing tests, whereas this code consumes zip files and provides search functionality for retrieving Result objects, which can be compared and saved to disk. Also, as mentioned above, the ResultSet code is quite general and it is useful outside of the context of BuildBot, so I would prefer to keep this in its own class.

&gt; 
&gt; &gt; WebKitTools/Scripts/webkitpy/layout_tests/rebaseline/builder.py:209
&gt; &gt; +class AggregateBuilder(object):
&gt; 
&gt; This belongs in the buildbot package somewhere.

I&apos;ve moved this to webkitpy.common.net, where buildbot.py lives.

&gt; 
&gt; &gt; WebKitTools/Scripts/webkitpy/layout_tests/rebaseline/builder.py:234
&gt; &gt; +        return &apos;http://build.chromium.org/f/chromium/layout_test_results/&apos; + builder_name + &apos;/layout-test-results.zip&apos;
&gt; 
&gt; General webkitpy code shouldn&apos;t refer to build.chromium.org.  You probably need to add this to the port abstraction.

Done. I&apos;ve added a method Port.buildbot_resultset() which abstracts how the ResultSet is produced for each platform.

&gt; 
&gt; &gt; WebKitTools/Scripts/webkitpy/layout_tests/rebaseline/builder.py:264
&gt; &gt; +class WebKitBuilder(object):
&gt; &gt; +    BUILDERS = {
&gt; &gt; +        &apos;mac-snowleopard&apos;: &apos;SnowLeopard%20Intel%20Release%20(Tests)&apos;,
&gt; &gt; +        &apos;mac-leopard&apos;: &apos;Leopard%20Intel%20Debug%20(Tests)&apos;,
&gt; &gt; +        &apos;win&apos;: &apos;Windows%207%20Release%20(WebKit2%20Tests)&apos;,
&gt; &gt; +        &apos;chromium-linux&apos;: &apos;GTK%20Linux%2032-bit%20Release&apos;,
&gt; &gt; +    }
&gt; 
&gt; webkitpy already knows about these things.  Please look at how the rest of the system knows about this stuff.

What I&apos;m trying to express here is a mapping between platforms (as in the subdirectories of LayoutTests/platform) and the name of the builder that provides the &apos;canonical&apos; test results for that platform. When a user wants to get new baselines for mac-snowleopard, what builder should those baselines be retrieved from? Looking through the code I can&apos;t find anywhere where such a mapping is defined - rebaseline_chromium_webkit_tests.py defines its own mapping for this kind of work, the current webkit-patch rebaseline script prompts the user to select a builder name and the port object itself provides a fallback order, but no mapping between platforms and builders.

&gt; 
&gt; &gt; WebKitTools/Scripts/webkitpy/layout_tests/rebaseline/rebaseliner.py:61
&gt; &gt; +    def _make_bucket_tree(self):
&gt; &gt; +        b = bucket.BucketTree()
&gt; &gt; +        b.b(None,
&gt; &gt; +            b.b(&apos;mac&apos;,
&gt; &gt; +                b.b(&apos;mac-snowleopard&apos;,
&gt; &gt; +                    b.b(&apos;mac-leopard&apos;,
&gt; &gt; +                        b.b(&apos;mac-tiger&apos;))),
&gt; &gt; +                b.b(&apos;win&apos;,
&gt; &gt; +                    b.b(&apos;chromium&apos;,
&gt; &gt; +                        b.b(&apos;chromium-mac&apos;),
&gt; &gt; +                        b.b(&apos;chromium-win&apos;,
&gt; &gt; +                            b.b(&apos;chromium-win-vista&apos;,
&gt; &gt; +                                b.b(&apos;chromium-win-xp&apos;)),
&gt; &gt; +                            b.b(&apos;chromium-linux&apos;,
&gt; &gt; +                                b.b(&apos;chromium-gpu&apos;,
&gt; &gt; +                                    b.b(&apos;chromium-gpu-linux&apos;),
&gt; &gt; +                                    b.b(&apos;chromium-gpu-win&apos;),
&gt; &gt; +                                    b.b(&apos;chromium-gpu-mac&apos;))))))),
&gt; &gt; +            b.b(&apos;qt&apos;,
&gt; &gt; +                b.b(&apos;qt-linux&apos;),
&gt; &gt; +                b.b(&apos;qt-mac&apos;),
&gt; &gt; +                b.b(&apos;qt-win&apos;)),
&gt; &gt; +            b.b(&apos;gtk&apos;))
&gt; 
&gt; Is this some kind of description of the structure of the expectations fallback tree?  If so, it should be in code that&apos;s shareable with the rest of webkitpy instead of siloed away here.

Yes, this is the fallback tree that is implied by the various implementations of Port.baseline_search_path() - it is needed to do correct deduping. I would like to see all the different implementations of that method go away and have the tree above be the authoritive fallback tree, but that seemed like it should happen in its own patch.

&gt; 
&gt; &gt; WebKitTools/Scripts/webkitpy/layout_tests/rebaseline/rebaseliner.py:63
&gt; &gt; +        AGGREGATE_BUCKETS = [&apos;chromium&apos;, &apos;chromium-win&apos;, &apos;win&apos;, &apos;mac&apos;, &apos;qt&apos;, &apos;chromium-gpu&apos;]
&gt; 
&gt; Why is this magic list here?  We shouldn&apos;t have magic constants like this in the code.

These are the names of platforms that aren&apos;t targeted by any builders because they don&apos;t denote real platforms, merely convenient fallback targets. This is significant in deduping: if we have the same expectations in mac-leopard, mac-snowleopard and mac-tiger, but a different result in mac, then we can clobber the result in mac and delete the others. We couldn&apos;t do that if mac was a platform in itself, because then it having different expectations would be valid and not a duplication.

I&apos;ve added a clarifying comment to explain the meaning of the list.

&gt; 
&gt; &gt; WebKitTools/Scripts/webkitpy/layout_tests/rebaseline/result.py:35
&gt; &gt; +class Result(object):
&gt; &gt; +    &quot;&quot;&quot;Represents the result of a single test on a single platform&quot;&quot;&quot;
&gt; 
&gt; We already have an abstraction for Result.

Are you referring to the webkitpy/layout_tests/test_types module? Those classes seem like they have a different usage to the ones I&apos;m introducing here - they have no state and perform functions on filenames and file contents passed in to them. There is no point in having more than one instance of those classes, whereas the Result classes defined here are stateful and are meant to represent Results (local or remote) for the purposes of comparing them.

&gt; 
&gt; &gt; WebKitTools/Scripts/webkitpy/tool/commands/rebaseline2.py:29
&gt; &gt; +from webkitpy.layout_tests.port import factory
&gt; 
&gt; webkitpy.tool cannot import from webkitpy.layout_tests.  Code that&apos;s shared between these two packages should go in webkitpy.common.

Ah, okay - I was taking inspiration from the original rebaseline.py. I&apos;ve moved the rebaseline package out of layout_tests and into webkitpy/tool/commands/rebaseline2.

&gt; 
&gt; &gt; WebKitTools/Scripts/webkitpy/tool/commands/rebaseline2.py:53
&gt; &gt; +            make_option(&quot;--chromium&quot;, action=&quot;store_true&quot;, dest=&quot;use_chromium_bots&quot;, help=&quot;Fetch results from the Chromium bots.&quot;),
&gt; 
&gt; Boo.  We should use --port to specify the port instead of making a magic special case for Chromium.

Sorry, I was imitating build-webkit&apos;s --chromium flag here. I&apos;ve added Port.buildbot_resultset() so the buildbots used are controlled via the port.

&gt; 
&gt; &gt; WebKitTools/Scripts/webkitpy/tool/commands/rebaseline2.py:54
&gt; &gt; +            make_option(&quot;--webkit&quot;, action=&quot;store_false&quot;, dest=&quot;use_chromium_bots&quot;, help=&quot;Fetch results from the WebKit bots (default).&quot;),
&gt; 
&gt; It doesn&apos;t make sense to have a --webkit command line argument for webkit-patch.  Everything webkit-patch does is related to WebKit!

Haha, of course :-) Removed.

&gt; 
&gt; &gt; WebKitTools/Scripts/webkitpy/tool/commands/rebaseline2.py:57
&gt; &gt; +            make_option(&quot;--list-builders&quot;, action=&quot;store_true&quot;, dest=&quot;list_builders&quot;, help=&quot;List the builders for each platform.&quot;),
&gt; &gt; +            make_option(&quot;--list-archives&quot;, action=&quot;store_true&quot;, dest=&quot;list_archives&quot;, help=&quot;Show the URLs of the test result archives.&quot;),
&gt; &gt; +            make_option(&quot;--show-archives&quot;, action=&quot;store_true&quot;, dest=&quot;show_archives&quot;, help=&quot;Show the results stored in the specified archives.&quot;),
&gt; 
&gt; These seem like separate commands.  Why are they arguments to this command?

I found these useful for selecting what platforms to rebase for and for seeing what results are available for those platforms, so they seemed like reasonable arguments with a similar usage to dry-run: you use them to see what the rebase command you construct will do.

&gt; 
&gt; &gt; WebKitTools/Scripts/webkitpy/tool/commands/rebaseline2.py:63
&gt; &gt; +        builder = ChromiumBuilder() if options.use_chromium_bots else WebKitBuilder()
&gt; 
&gt; This line of code shouldn&apos;t be here.  We should get this information by instantiating a Port object.  How will this line of code scale when there are N contributors to WebKit with as much infrastructure as Chromium?

Done.

&gt; 
&gt; &gt; WebKitTools/Scripts/webkitpy/tool/commands/rebaseline2.py:73
&gt; &gt; +            exit()
&gt; 
&gt; Whenever you call exit, you might consider whether what you really want is a separate command.  Calling exit also makes this code difficult to test.

I&apos;ve removed those flags.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>315585</commentid>
    <comment_count>8</comment_count>
      <attachid>75263</attachid>
    <who name="James Kozianski">koz</who>
    <bug_when>2010-12-01 03:19:34 -0800</bug_when>
    <thetext>Created attachment 75263
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>315686</commentid>
    <comment_count>9</comment_count>
    <who name="Adam Barth">abarth</who>
    <bug_when>2010-12-01 09:19:55 -0800</bug_when>
    <thetext>(In reply to comment #7)
&gt; Thanks for the prompt and thorough review, Adam!
&gt; 
&gt; (In reply to comment #6)
&gt; &gt; (From update of attachment 74983 [details] [details])
&gt; &gt; View in context: https://bugs.webkit.org/attachment.cgi?id=74983&amp;action=review
&gt; &gt; 
&gt; &gt; &gt; WebKitTools/Scripts/webkitpy/layout_tests/rebaseline/builder.py:264
&gt; &gt; &gt; +class WebKitBuilder(object):
&gt; &gt; &gt; +    BUILDERS = {
&gt; &gt; &gt; +        &apos;mac-snowleopard&apos;: &apos;SnowLeopard%20Intel%20Release%20(Tests)&apos;,
&gt; &gt; &gt; +        &apos;mac-leopard&apos;: &apos;Leopard%20Intel%20Debug%20(Tests)&apos;,
&gt; &gt; &gt; +        &apos;win&apos;: &apos;Windows%207%20Release%20(WebKit2%20Tests)&apos;,
&gt; &gt; &gt; +        &apos;chromium-linux&apos;: &apos;GTK%20Linux%2032-bit%20Release&apos;,
&gt; &gt; &gt; +    }
&gt; &gt; 
&gt; &gt; webkitpy already knows about these things.  Please look at how the rest of the system knows about this stuff.
&gt; 
&gt; What I&apos;m trying to express here is a mapping between platforms (as in the subdirectories of LayoutTests/platform) and the name of the builder that provides the &apos;canonical&apos; test results for that platform. When a user wants to get new baselines for mac-snowleopard, what builder should those baselines be retrieved from? Looking through the code I can&apos;t find anywhere where such a mapping is defined - rebaseline_chromium_webkit_tests.py defines its own mapping for this kind of work, the current webkit-patch rebaseline script prompts the user to select a builder name and the port object itself provides a fallback order, but no mapping between platforms and builders.

We should never have let rebaseline_chromium_webkit_tests into the tree.  It&apos;s wrong at so many levels.

The mapping between LayoutTest/platform directories and buildbots probably belongs somewhere in the port abstraction.  You&apos;ll find that we already have two port abstractions (shame on us), but we should be able to teach one fo them to find it&apos;s buildbot.

&gt; &gt; &gt; WebKitTools/Scripts/webkitpy/layout_tests/rebaseline/rebaseliner.py:61
&gt; &gt; &gt; +    def _make_bucket_tree(self):
&gt; &gt; &gt; +        b = bucket.BucketTree()
&gt; &gt; &gt; +        b.b(None,
&gt; &gt; &gt; +            b.b(&apos;mac&apos;,
&gt; &gt; &gt; +                b.b(&apos;mac-snowleopard&apos;,
&gt; &gt; &gt; +                    b.b(&apos;mac-leopard&apos;,
&gt; &gt; &gt; +                        b.b(&apos;mac-tiger&apos;))),
&gt; &gt; &gt; +                b.b(&apos;win&apos;,
&gt; &gt; &gt; +                    b.b(&apos;chromium&apos;,
&gt; &gt; &gt; +                        b.b(&apos;chromium-mac&apos;),
&gt; &gt; &gt; +                        b.b(&apos;chromium-win&apos;,
&gt; &gt; &gt; +                            b.b(&apos;chromium-win-vista&apos;,
&gt; &gt; &gt; +                                b.b(&apos;chromium-win-xp&apos;)),
&gt; &gt; &gt; +                            b.b(&apos;chromium-linux&apos;,
&gt; &gt; &gt; +                                b.b(&apos;chromium-gpu&apos;,
&gt; &gt; &gt; +                                    b.b(&apos;chromium-gpu-linux&apos;),
&gt; &gt; &gt; +                                    b.b(&apos;chromium-gpu-win&apos;),
&gt; &gt; &gt; +                                    b.b(&apos;chromium-gpu-mac&apos;))))))),
&gt; &gt; &gt; +            b.b(&apos;qt&apos;,
&gt; &gt; &gt; +                b.b(&apos;qt-linux&apos;),
&gt; &gt; &gt; +                b.b(&apos;qt-mac&apos;),
&gt; &gt; &gt; +                b.b(&apos;qt-win&apos;)),
&gt; &gt; &gt; +            b.b(&apos;gtk&apos;))
&gt; &gt; 
&gt; &gt; Is this some kind of description of the structure of the expectations fallback tree?  If so, it should be in code that&apos;s shareable with the rest of webkitpy instead of siloed away here.
&gt; 
&gt; Yes, this is the fallback tree that is implied by the various implementations of Port.baseline_search_path() - it is needed to do correct deduping. I would like to see all the different implementations of that method go away and have the tree above be the authoritive fallback tree, but that seemed like it should happen in its own patch.

It&apos;s certainly fine to do that in a separate patch, but we&apos;re not going to want to make the situation worse by landing this patch before that one.  That&apos;s how we accumulate these technical debts.

&gt; &gt; &gt; WebKitTools/Scripts/webkitpy/layout_tests/rebaseline/rebaseliner.py:63
&gt; &gt; &gt; +        AGGREGATE_BUCKETS = [&apos;chromium&apos;, &apos;chromium-win&apos;, &apos;win&apos;, &apos;mac&apos;, &apos;qt&apos;, &apos;chromium-gpu&apos;]
&gt; &gt; 
&gt; &gt; Why is this magic list here?  We shouldn&apos;t have magic constants like this in the code.
&gt; 
&gt; These are the names of platforms that aren&apos;t targeted by any builders because they don&apos;t denote real platforms, merely convenient fallback targets. This is significant in deduping: if we have the same expectations in mac-leopard, mac-snowleopard and mac-tiger, but a different result in mac, then we can clobber the result in mac and delete the others. We couldn&apos;t do that if mac was a platform in itself, because then it having different expectations would be valid and not a duplication.
&gt; 
&gt; I&apos;ve added a clarifying comment to explain the meaning of the list.

Ok, but how does that scale when we add more ports / platforms to the project?  Will someone have to hunt around all of webkitpy to find all the port-specific logic and update it?  It seems better to centralize that knowledge in the port abstraction.

&gt; &gt; &gt; WebKitTools/Scripts/webkitpy/layout_tests/rebaseline/result.py:35
&gt; &gt; &gt; +class Result(object):
&gt; &gt; &gt; +    &quot;&quot;&quot;Represents the result of a single test on a single platform&quot;&quot;&quot;
&gt; &gt; 
&gt; &gt; We already have an abstraction for Result.
&gt; 
&gt; Are you referring to the webkitpy/layout_tests/test_types module? Those classes seem like they have a different usage to the ones I&apos;m introducing here - they have no state and perform functions on filenames and file contents passed in to them. There is no point in having more than one instance of those classes, whereas the Result classes defined here are stateful and are meant to represent Results (local or remote) for the purposes of comparing them.

I meant something in buildbot.py.  I&apos;m not sure exactly what.  The current abstraction might be something as simple as a string, but that doesn&apos;t mean it shouldn&apos;t be improved.

&gt; &gt; &gt; WebKitTools/Scripts/webkitpy/tool/commands/rebaseline2.py:29
&gt; &gt; &gt; +from webkitpy.layout_tests.port import factory
&gt; &gt; 
&gt; &gt; webkitpy.tool cannot import from webkitpy.layout_tests.  Code that&apos;s shared between these two packages should go in webkitpy.common.
&gt; 
&gt; Ah, okay - I was taking inspiration from the original rebaseline.py. I&apos;ve moved the rebaseline package out of layout_tests and into webkitpy/tool/commands/rebaseline2.

Do you mean http://trac.webkit.org/browser/trunk/WebKitTools/Scripts/webkitpy/tool/commands/rebaseline.py ?

The only thing that file imports from layout_tests is webkitpy.layout_tests.port, but that&apos;s because webkitpy.layout_tests.port shouldn&apos;t be in layout_tests.  :P

Some of these invariants aren&apos;t perfect, but we&apos;d like to make them better over time.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>315697</commentid>
    <comment_count>10</comment_count>
    <who name="Ojan Vafai">ojan</who>
    <bug_when>2010-12-01 09:42:19 -0800</bug_when>
    <thetext>&gt; &gt; &gt; &gt; WebKitTools/Scripts/webkitpy/layout_tests/rebaseline/rebaseliner.py:61
&gt; &gt; &gt; &gt; +    def _make_bucket_tree(self):
&gt; &gt; &gt; &gt; +        b = bucket.BucketTree()
&gt; &gt; &gt; &gt; +        b.b(None,
&gt; &gt; &gt; &gt; +            b.b(&apos;mac&apos;,
&gt; &gt; &gt; &gt; +                b.b(&apos;mac-snowleopard&apos;,
&gt; &gt; &gt; &gt; +                    b.b(&apos;mac-leopard&apos;,
&gt; &gt; &gt; &gt; +                        b.b(&apos;mac-tiger&apos;))),
&gt; &gt; &gt; &gt; +                b.b(&apos;win&apos;,
&gt; &gt; &gt; &gt; +                    b.b(&apos;chromium&apos;,
&gt; &gt; &gt; &gt; +                        b.b(&apos;chromium-mac&apos;),

It&apos;s a little more complicated than this. chromium-mac falls back to chromium, then does the same fallback order as upstream mac (i.e. !win). See http://codesearch.google.com/codesearch/p#OAMlx_jo-ck/src/third_party/WebKit/WebKitTools/Scripts/webkitpy/layout_tests/port/chromium_mac.py&amp;l=52&amp;exact_package=chromium.

&gt; &gt; &gt; &gt; +                        b.b(&apos;chromium-win&apos;,
&gt; &gt; &gt; &gt; +                            b.b(&apos;chromium-win-vista&apos;,
&gt; &gt; &gt; &gt; +                                b.b(&apos;chromium-win-xp&apos;)),
&gt; &gt; &gt; &gt; +                            b.b(&apos;chromium-linux&apos;,
&gt; &gt; &gt; &gt; +                                b.b(&apos;chromium-gpu&apos;,
&gt; &gt; &gt; &gt; +                                    b.b(&apos;chromium-gpu-linux&apos;),
&gt; &gt; &gt; &gt; +                                    b.b(&apos;chromium-gpu-win&apos;),
&gt; &gt; &gt; &gt; +                                    b.b(&apos;chromium-gpu-mac&apos;))))))),

Each platform gpu one should fallback to chromium-gpu and then the equivalent platform non-gpu one. See http://codesearch.google.com/codesearch/p#OAMlx_jo-ck/src/third_party/WebKit/WebKitTools/Scripts/webkitpy/layout_tests/port/chromium_gpu.py&amp;l=99&amp;exact_package=chromium

&gt; &gt; &gt; &gt; +            b.b(&apos;qt&apos;,
&gt; &gt; &gt; &gt; +                b.b(&apos;qt-linux&apos;),
&gt; &gt; &gt; &gt; +                b.b(&apos;qt-mac&apos;),
&gt; &gt; &gt; &gt; +                b.b(&apos;qt-win&apos;)),
&gt; &gt; &gt; &gt; +            b.b(&apos;gtk&apos;))
&gt; &gt; &gt; 
&gt; &gt; &gt; Is this some kind of description of the structure of the expectations fallback tree?  If so, it should be in code that&apos;s shareable with the rest of webkitpy instead of siloed away here.
&gt; &gt; 
&gt; &gt; Yes, this is the fallback tree that is implied by the various implementations of Port.baseline_search_path() - it is needed to do correct deduping. I would like to see all the different implementations of that method go away and have the tree above be the authoritive fallback tree, but that seemed like it should happen in its own patch.
&gt; 
&gt; It&apos;s certainly fine to do that in a separate patch, but we&apos;re not going to want to make the situation worse by landing this patch before that one.  That&apos;s how we accumulate these technical debts.
&gt; 
&gt; &gt; &gt; &gt; WebKitTools/Scripts/webkitpy/layout_tests/rebaseline/rebaseliner.py:63
&gt; &gt; &gt; &gt; +        AGGREGATE_BUCKETS = [&apos;chromium&apos;, &apos;chromium-win&apos;, &apos;win&apos;, &apos;mac&apos;, &apos;qt&apos;, &apos;chromium-gpu&apos;]
&gt; &gt; &gt; 
&gt; &gt; &gt; Why is this magic list here?  We shouldn&apos;t have magic constants like this in the code.
&gt; &gt; 
&gt; &gt; These are the names of platforms that aren&apos;t targeted by any builders because they don&apos;t denote real platforms, merely convenient fallback targets. This is significant in deduping: if we have the same expectations in mac-leopard, mac-snowleopard and mac-tiger, but a different result in mac, then we can clobber the result in mac and delete the others. We couldn&apos;t do that if mac was a platform in itself, because then it having different expectations would be valid and not a duplication.
&gt; &gt; 
&gt; &gt; I&apos;ve added a clarifying comment to explain the meaning of the list.
&gt; 
&gt; Ok, but how does that scale when we add more ports / platforms to the project?  Will someone have to hunt around all of webkitpy to find all the port-specific logic and update it?  It seems better to centralize that knowledge in the port abstraction.

I agree that this logic should be in shared code, probably in the port abstraction. I like this better than what we have in port right now though. In order to understand each platform&apos;s fallback rules, you need to look in a bunch of different files and it&apos;s very complicated. Having the data in one file would be great. That said, this could just be the underlying data used by the existing port code. For example, the base port class could have this mapping and the baseline_search_path implementations could just index into the mapping. 

What we lose here is that each port file completely encapsulates the data for that port, but the increased code clarity is worth it IMO.

In either case, that seems like it could easily be a separate patch. In the interested of avoiding too much yak shaving, how about you rewrite this patch to use baseline_search_path and leave refactoring this stuff as a FIXME?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>315883</commentid>
    <comment_count>11</comment_count>
      <attachid>75263</attachid>
    <who name="Dirk Pranke">dpranke</who>
    <bug_when>2010-12-01 14:38:07 -0800</bug_when>
    <thetext>Comment on attachment 75263
Patch

I just started looking at this patch (sorry for the delay!), so I will confine myself to a couple of comments on topics others haven&apos;t raised, and then reply to some of the other bug comments.

Mihai says that the intent of this is to replace both webkit-patch rebaseline and rebaseline-chromium-webkit-tests. If so, great! The latter code is poorly tested and hard to maintain, so it&apos;ll be nice to have something theoretically better :)


&gt; WebKitTools/Scripts/webkitpy/common/system/filesystem.py:126
&gt; +        shutil.copyfile(src, dest)

Why copy_file instead of copyfile(), or remove_file() instead of unlink or remove? I would prefer to have the methods be the same as the underlying package/class method names, to minimize the cognitive overhead.

&gt; WebKitTools/Scripts/webkitpy/layout_tests/port/base.py:637
&gt; +

Comment: I&apos;m not wild about this being put into the layout_test/port/* classes, mostly because this has nothing to do with *running* the tests, and partially because this class is already large and hard to understand as a whole. That said, there&apos;s not an obvious other place to put them, and I don&apos;t want to create a parallel port tree, and it&apos;s only one entry point. This is probably something to think about when I/we get around to refactoring/combining this code with the common.config.ports code.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>315906</commentid>
    <comment_count>12</comment_count>
    <who name="Dirk Pranke">dpranke</who>
    <bug_when>2010-12-01 15:35:09 -0800</bug_when>
    <thetext>(In reply to comment #9)
&gt; 
&gt; The mapping between LayoutTest/platform directories and buildbots probably belongs somewhere in the port abstraction.  You&apos;ll find that we already have two port abstractions (shame on us), but we should be able to teach one fo them to find it&apos;s buildbot.
&gt;

In the absence of an obviously better place to put this, I&apos;m inclined to agree that this belongs as a method on layout_tests/port/*, since those files are likely the basis for whatever persists into the future. That said, my comment above stands, in that this is code that has nothing to do w/ actually running the tests. I think we need to figure out how to break the Port objects up into composites.
 
&gt; &gt; &gt; &gt; WebKitTools/Scripts/webkitpy/layout_tests/rebaseline/rebaseliner.py:61
&gt; &gt; &gt; &gt; +    def _make_bucket_tree(self):
&gt; &gt; &gt; &gt; +        b = bucket.BucketTree()
&gt; &gt; &gt; &gt; +        b.b(None,
&gt; &gt; &gt; &gt; +            b.b(&apos;mac&apos;,
&gt; &gt; &gt; &gt; +                b.b(&apos;mac-snowleopard&apos;,
&gt; &gt; &gt; &gt; +                    b.b(&apos;mac-leopard&apos;,
&gt; &gt; &gt; &gt; +                        b.b(&apos;mac-tiger&apos;))),
&gt; &gt; &gt; &gt; +                b.b(&apos;win&apos;,
&gt; &gt; &gt; &gt; +                    b.b(&apos;chromium&apos;,
&gt; &gt; &gt; &gt; +                        b.b(&apos;chromium-mac&apos;),
&gt; &gt; &gt; &gt; +                        b.b(&apos;chromium-win&apos;,
&gt; &gt; &gt; &gt; +                            b.b(&apos;chromium-win-vista&apos;,
&gt; &gt; &gt; &gt; +                                b.b(&apos;chromium-win-xp&apos;)),
&gt; &gt; &gt; &gt; +                            b.b(&apos;chromium-linux&apos;,
&gt; &gt; &gt; &gt; +                                b.b(&apos;chromium-gpu&apos;,
&gt; &gt; &gt; &gt; +                                    b.b(&apos;chromium-gpu-linux&apos;),
&gt; &gt; &gt; &gt; +                                    b.b(&apos;chromium-gpu-win&apos;),
&gt; &gt; &gt; &gt; +                                    b.b(&apos;chromium-gpu-mac&apos;))))))),
&gt; &gt; &gt; &gt; +            b.b(&apos;qt&apos;,
&gt; &gt; &gt; &gt; +                b.b(&apos;qt-linux&apos;),
&gt; &gt; &gt; &gt; +                b.b(&apos;qt-mac&apos;),
&gt; &gt; &gt; &gt; +                b.b(&apos;qt-win&apos;)),
&gt; &gt; &gt; &gt; +            b.b(&apos;gtk&apos;))
&gt; &gt; &gt; 
&gt; &gt; &gt; Is this some kind of description of the structure of the expectations fallback tree?  If so, it should be in code that&apos;s shareable with the rest of webkitpy instead of siloed away here.
&gt; &gt; 
&gt; &gt; Yes, this is the fallback tree that is implied by the various implementations of Port.baseline_search_path() - it is needed to do correct deduping. I would like to see all the different implementations of that method go away and have the tree above be the authoritive fallback tree, but that seemed like it should happen in its own patch.
&gt; 
&gt; It&apos;s certainly fine to do that in a separate patch, but we&apos;re not going to want to make the situation worse by landing this patch before that one.  That&apos;s how we accumulate these technical debts.
&gt; 

As Ojan has already pointed out, this logic is wrong (e.g., chromium-mac doesn&apos;t fall back to win). 

Unfortunately, I don&apos;t think you can even draw the logic for all of the ports as a single tree, so this approach might be fatally flawed. At least it&apos;s a DAG :)

I agree with Ojan that attempting to figure out the logic in the current codebase is complicated. And, I agree that we don&apos;t want to lose port.baseline_search_path() as at least an entry point. 

Maybe this is something best solved with some form of composition, or mixins, or multiple inheritance. Not sure.

I also agree with Adam that it would be really nice if we didn&apos;t have two sources of truth in the tree at the same time. That said, I would be okay with it as long as you agreed to immediately fix things after this feature landed. It would be better if we could refactor/change the port code first, in a separate patch, though.

&gt; &gt; &gt; &gt; WebKitTools/Scripts/webkitpy/layout_tests/rebaseline/rebaseliner.py:63
&gt; &gt; &gt; &gt; +        AGGREGATE_BUCKETS = [&apos;chromium&apos;, &apos;chromium-win&apos;, &apos;win&apos;, &apos;mac&apos;, &apos;qt&apos;, &apos;chromium-gpu&apos;]
&gt; &gt; &gt; 
&gt; &gt; &gt; Why is this magic list here?  We shouldn&apos;t have magic constants like this in the code.
&gt; &gt; 
&gt; &gt; These are the names of platforms that aren&apos;t targeted by any builders because they don&apos;t denote real platforms, merely convenient fallback targets. This is significant in deduping: if we have the same expectations in mac-leopard, mac-snowleopard and mac-tiger, but a different result in mac, then we can clobber the result in mac and delete the others. We couldn&apos;t do that if mac was a platform in itself, because then it having different expectations would be valid and not a duplication.
&gt; &gt; 
&gt; &gt; I&apos;ve added a clarifying comment to explain the meaning of the list.
&gt; 
&gt; Ok, but how does that scale when we add more ports / platforms to the project?  Will someone have to hunt around all of webkitpy to find all the port-specific logic and update it?  It seems better to centralize that knowledge in the port abstraction.
&gt;

I fear you aren&apos;t aware of how we name the platform dirs. If a platform directory indicates an operating system, but not a version of an operating system, then it is meant to indicate &quot;the most recent version of that operating system&quot; (and it includes any older versions if the older version is either untested, or uncared about).  &quot;chromium-win&quot; is what we use on Windows 7 bots (there is no chromium-win-7 directory). &quot;chromium-mac&quot; is similarly equivalent to &quot;chromium-mac-snowleopard&quot; (and/or Lion, which we don&apos;t really support). Same thing is true for &apos;mac&apos;, and &apos;win&apos;. &apos;qt&apos; is just a regular platform, period.

So, what you said about clobbering &apos;mac&apos; in the paragraph above is wrong. You would want to clobber the &apos;mac-leopard&apos; and &apos;mac-tiger&apos; versions of the results, but leave &apos;mac&apos; and &apos;mac-snowleopard&apos; (and we would assume that &apos;mac&apos; now refers to Lion).

The only truly &quot;dummy&quot; platforms  are &apos;chromium&apos; and &apos;chromium-gpu&apos;.  
   
&gt; &gt; &gt; &gt; WebKitTools/Scripts/webkitpy/layout_tests/rebaseline/result.py:35
&gt; &gt; &gt; &gt; +class Result(object):
&gt; &gt; &gt; &gt; +    &quot;&quot;&quot;Represents the result of a single test on a single platform&quot;&quot;&quot;
&gt; &gt; &gt; 
&gt; &gt; &gt; We already have an abstraction for Result.
&gt; &gt; 
&gt; &gt; Are you referring to the webkitpy/layout_tests/test_types module? Those classes seem like they have a different usage to the ones I&apos;m introducing here - they have no state and perform functions on filenames and file contents passed in to them. There is no point in having more than one instance of those classes, whereas the Result classes defined here are stateful and are meant to represent Results (local or remote) for the purposes of comparing them.
&gt; 

Ouch. My head hurts here at introducing this concept. I think what you actually want is something closer to the layout_tests.layout_package.test_output concept, possibly combined with the expected_* methods on the Port class.

Also, please don&apos;t call this &quot;Result&quot; - that is too generic and overloaded a term. Even if you were to call it a &quot;TestResult&quot;, that&apos;s confusing, because is the object referring to the actual expected output, or the results of running the test and comparing against the expectations (e.g., &quot;PASS&quot;/&quot;FAIL&quot;, etc.)? 

I&apos;ve been trying to morph the layout tests code into using something a bit more consistent, so we should line things up here if we can. I would prefer something like &quot;TestOutput&quot; here.

As to the overlap between test_output, test_types, and the port/* routines, those ned to be cleaned up as well. My current thinking is that the test_types classes are legacy objects from much earlier versions of new-run-webkit-tests (predating the port/* abstraction completely), and just need to go away. I.e., it&apos;s an abstraction that is confusing things.

In the very near future we&apos;ll need to add support for audio files and tests, and this aspect of the design should really be cleaned up (I&apos;m expecting by me) before then.

Also, the work we&apos;re doing with reftests will impact this as well, so it would be good to get up to speed on that if you aren&apos;t already (and I&apos;ve cc&apos;ed Ito-san on this to make sure he&apos;s aware of it as well).</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>315992</commentid>
    <comment_count>13</comment_count>
    <who name="James Kozianski">koz</who>
    <bug_when>2010-12-01 19:10:50 -0800</bug_when>
    <thetext>(In reply to comment #9)
&gt; (In reply to comment #7)
&gt; &gt; Thanks for the prompt and thorough review, Adam!
&gt; &gt; 
&gt; &gt; (In reply to comment #6)
&gt; &gt; &gt; (From update of attachment 74983 [details] [details] [details])
&gt; &gt; &gt; View in context: https://bugs.webkit.org/attachment.cgi?id=74983&amp;action=review
&gt; &gt; &gt; 
&gt; &gt; &gt; &gt; WebKitTools/Scripts/webkitpy/layout_tests/rebaseline/builder.py:264
&gt; &gt; &gt; &gt; +class WebKitBuilder(object):
&gt; &gt; &gt; &gt; +    BUILDERS = {
&gt; &gt; &gt; &gt; +        &apos;mac-snowleopard&apos;: &apos;SnowLeopard%20Intel%20Release%20(Tests)&apos;,
&gt; &gt; &gt; &gt; +        &apos;mac-leopard&apos;: &apos;Leopard%20Intel%20Debug%20(Tests)&apos;,
&gt; &gt; &gt; &gt; +        &apos;win&apos;: &apos;Windows%207%20Release%20(WebKit2%20Tests)&apos;,
&gt; &gt; &gt; &gt; +        &apos;chromium-linux&apos;: &apos;GTK%20Linux%2032-bit%20Release&apos;,
&gt; &gt; &gt; &gt; +    }
&gt; &gt; &gt; 
&gt; &gt; &gt; webkitpy already knows about these things.  Please look at how the rest of the system knows about this stuff.
&gt; &gt; 
&gt; &gt; What I&apos;m trying to express here is a mapping between platforms (as in the subdirectories of LayoutTests/platform) and the name of the builder that provides the &apos;canonical&apos; test results for that platform. When a user wants to get new baselines for mac-snowleopard, what builder should those baselines be retrieved from? Looking through the code I can&apos;t find anywhere where such a mapping is defined - rebaseline_chromium_webkit_tests.py defines its own mapping for this kind of work, the current webkit-patch rebaseline script prompts the user to select a builder name and the port object itself provides a fallback order, but no mapping between platforms and builders.
&gt; 
&gt; We should never have let rebaseline_chromium_webkit_tests into the tree.  It&apos;s wrong at so many levels.
&gt; 
&gt; The mapping between LayoutTest/platform directories and buildbots probably belongs somewhere in the port abstraction.  You&apos;ll find that we already have two port abstractions (shame on us), but we should be able to teach one fo them to find it&apos;s buildbot.

Yep, I&apos;ve moved these mappings into the webkit.py and chromium.py Port implementations (the layout_tests/port implementations.

&gt; 
&gt; &gt; &gt; &gt; WebKitTools/Scripts/webkitpy/layout_tests/rebaseline/rebaseliner.py:61
&gt; &gt; &gt; &gt; +    def _make_bucket_tree(self):
&gt; &gt; &gt; &gt; +        b = bucket.BucketTree()
&gt; &gt; &gt; &gt; +        b.b(None,
&gt; &gt; &gt; &gt; +            b.b(&apos;mac&apos;,
&gt; &gt; &gt; &gt; +                b.b(&apos;mac-snowleopard&apos;,
&gt; &gt; &gt; &gt; +                    b.b(&apos;mac-leopard&apos;,
&gt; &gt; &gt; &gt; +                        b.b(&apos;mac-tiger&apos;))),
&gt; &gt; &gt; &gt; +                b.b(&apos;win&apos;,
&gt; &gt; &gt; &gt; +                    b.b(&apos;chromium&apos;,
&gt; &gt; &gt; &gt; +                        b.b(&apos;chromium-mac&apos;),
&gt; &gt; &gt; &gt; +                        b.b(&apos;chromium-win&apos;,
&gt; &gt; &gt; &gt; +                            b.b(&apos;chromium-win-vista&apos;,
&gt; &gt; &gt; &gt; +                                b.b(&apos;chromium-win-xp&apos;)),
&gt; &gt; &gt; &gt; +                            b.b(&apos;chromium-linux&apos;,
&gt; &gt; &gt; &gt; +                                b.b(&apos;chromium-gpu&apos;,
&gt; &gt; &gt; &gt; +                                    b.b(&apos;chromium-gpu-linux&apos;),
&gt; &gt; &gt; &gt; +                                    b.b(&apos;chromium-gpu-win&apos;),
&gt; &gt; &gt; &gt; +                                    b.b(&apos;chromium-gpu-mac&apos;))))))),
&gt; &gt; &gt; &gt; +            b.b(&apos;qt&apos;,
&gt; &gt; &gt; &gt; +                b.b(&apos;qt-linux&apos;),
&gt; &gt; &gt; &gt; +                b.b(&apos;qt-mac&apos;),
&gt; &gt; &gt; &gt; +                b.b(&apos;qt-win&apos;)),
&gt; &gt; &gt; &gt; +            b.b(&apos;gtk&apos;))
&gt; &gt; &gt; 
&gt; &gt; &gt; Is this some kind of description of the structure of the expectations fallback tree?  If so, it should be in code that&apos;s shareable with the rest of webkitpy instead of siloed away here.
&gt; &gt; 
&gt; &gt; Yes, this is the fallback tree that is implied by the various implementations of Port.baseline_search_path() - it is needed to do correct deduping. I would like to see all the different implementations of that method go away and have the tree above be the authoritive fallback tree, but that seemed like it should happen in its own patch.
&gt; 
&gt; It&apos;s certainly fine to do that in a separate patch, but we&apos;re not going to want to make the situation worse by landing this patch before that one.  That&apos;s how we accumulate these technical debts.

Okay, no worries but from the rest of the comments it looks like this tree might be a bit simplistic. Once we know what the right thing to do is I&apos;ll either make a patch to rewrite the baseline_search_path() methods to be in terms of a tree like this one, or I&apos;ll generate a tree (or graph) from the baseline_search_path()s at runtime.

&gt; 
&gt; &gt; &gt; &gt; WebKitTools/Scripts/webkitpy/layout_tests/rebaseline/rebaseliner.py:63
&gt; &gt; &gt; &gt; +        AGGREGATE_BUCKETS = [&apos;chromium&apos;, &apos;chromium-win&apos;, &apos;win&apos;, &apos;mac&apos;, &apos;qt&apos;, &apos;chromium-gpu&apos;]
&gt; &gt; &gt; 
&gt; &gt; &gt; Why is this magic list here?  We shouldn&apos;t have magic constants like this in the code.
&gt; &gt; 
&gt; &gt; These are the names of platforms that aren&apos;t targeted by any builders because they don&apos;t denote real platforms, merely convenient fallback targets. This is significant in deduping: if we have the same expectations in mac-leopard, mac-snowleopard and mac-tiger, but a different result in mac, then we can clobber the result in mac and delete the others. We couldn&apos;t do that if mac was a platform in itself, because then it having different expectations would be valid and not a duplication.
&gt; &gt; 
&gt; &gt; I&apos;ve added a clarifying comment to explain the meaning of the list.
&gt; 
&gt; Ok, but how does that scale when we add more ports / platforms to the project?  Will someone have to hunt around all of webkitpy to find all the port-specific logic and update it?  It seems better to centralize that knowledge in the port abstraction.

I&apos;m happy to have this tree live in Port, that&apos;s the right place for it. This won&apos;t lead to people needing to hunt for any port-specific stuff - all of the logic surrounding fallbacks (the structure and what platforms are real platforms versus placeholder platforms) will be defined in this tree, which will live in the Port base class.

&gt; 
&gt; &gt; &gt; &gt; WebKitTools/Scripts/webkitpy/layout_tests/rebaseline/result.py:35
&gt; &gt; &gt; &gt; +class Result(object):
&gt; &gt; &gt; &gt; +    &quot;&quot;&quot;Represents the result of a single test on a single platform&quot;&quot;&quot;
&gt; &gt; &gt; 
&gt; &gt; &gt; We already have an abstraction for Result.
&gt; &gt; 
&gt; &gt; Are you referring to the webkitpy/layout_tests/test_types module? Those classes seem like they have a different usage to the ones I&apos;m introducing here - they have no state and perform functions on filenames and file contents passed in to them. There is no point in having more than one instance of those classes, whereas the Result classes defined here are stateful and are meant to represent Results (local or remote) for the purposes of comparing them.
&gt; 
&gt; I meant something in buildbot.py.  I&apos;m not sure exactly what.  The current abstraction might be something as simple as a string, but that doesn&apos;t mean it shouldn&apos;t be improved.

I&apos;ve added a results() method to the buildbot.Build class, which returns the ResultSet of that build&apos;s &apos;-actual&apos; test results. The only thing I can find in buildbot.py that deals with tests is Build.layout_test_results(), which returns a LayoutTestResults object, which deals with test names, but I don&apos;t think it is better to have that return Results instead.

&gt; 
&gt; &gt; &gt; &gt; WebKitTools/Scripts/webkitpy/tool/commands/rebaseline2.py:29
&gt; &gt; &gt; &gt; +from webkitpy.layout_tests.port import factory
&gt; &gt; &gt; 
&gt; &gt; &gt; webkitpy.tool cannot import from webkitpy.layout_tests.  Code that&apos;s shared between these two packages should go in webkitpy.common.
&gt; &gt; 
&gt; &gt; Ah, okay - I was taking inspiration from the original rebaseline.py. I&apos;ve moved the rebaseline package out of layout_tests and into webkitpy/tool/commands/rebaseline2.
&gt; 
&gt; Do you mean http://trac.webkit.org/browser/trunk/WebKitTools/Scripts/webkitpy/tool/commands/rebaseline.py ?
&gt; 
&gt; The only thing that file imports from layout_tests is webkitpy.layout_tests.port, but that&apos;s because webkitpy.layout_tests.port shouldn&apos;t be in layout_tests.  :P
&gt; 
&gt; Some of these invariants aren&apos;t perfect, but we&apos;d like to make them better over time.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>315996</commentid>
    <comment_count>14</comment_count>
    <who name="James Kozianski">koz</who>
    <bug_when>2010-12-01 19:51:43 -0800</bug_when>
    <thetext>(In reply to comment #10)
&gt; &gt; &gt; &gt; &gt; WebKitTools/Scripts/webkitpy/layout_tests/rebaseline/rebaseliner.py:61
&gt; &gt; &gt; &gt; &gt; +    def _make_bucket_tree(self):
&gt; &gt; &gt; &gt; &gt; +        b = bucket.BucketTree()
&gt; &gt; &gt; &gt; &gt; +        b.b(None,
&gt; &gt; &gt; &gt; &gt; +            b.b(&apos;mac&apos;,
&gt; &gt; &gt; &gt; &gt; +                b.b(&apos;mac-snowleopard&apos;,
&gt; &gt; &gt; &gt; &gt; +                    b.b(&apos;mac-leopard&apos;,
&gt; &gt; &gt; &gt; &gt; +                        b.b(&apos;mac-tiger&apos;))),
&gt; &gt; &gt; &gt; &gt; +                b.b(&apos;win&apos;,
&gt; &gt; &gt; &gt; &gt; +                    b.b(&apos;chromium&apos;,
&gt; &gt; &gt; &gt; &gt; +                        b.b(&apos;chromium-mac&apos;),
&gt; 
&gt; It&apos;s a little more complicated than this. chromium-mac falls back to chromium, then does the same fallback order as upstream mac (i.e. !win). See http://codesearch.google.com/codesearch/p#OAMlx_jo-ck/src/third_party/WebKit/WebKitTools/Scripts/webkitpy/layout_tests/port/chromium_mac.py&amp;l=52&amp;exact_package=chromium.

Yeah, this tree was a bit of a simplification. I was wondering if it was possible / a good idea to change our test fallback order so that it does make a tree? In the likely case that it isn&apos;t I could change my code to handle DAGs... I think it should be possible to extend the algorithm I use here.

&gt; &gt; &gt; &gt; &gt; WebKitTools/Scripts/webkitpy/layout_tests/rebaseline/rebaseliner.py:63
&gt; &gt; &gt; &gt; &gt; +        AGGREGATE_BUCKETS = [&apos;chromium&apos;, &apos;chromium-win&apos;, &apos;win&apos;, &apos;mac&apos;, &apos;qt&apos;, &apos;chromium-gpu&apos;]
&gt; &gt; &gt; &gt; 
&gt; &gt; &gt; &gt; Why is this magic list here?  We shouldn&apos;t have magic constants like this in the code.
&gt; &gt; &gt; 
&gt; &gt; &gt; These are the names of platforms that aren&apos;t targeted by any builders because they don&apos;t denote real platforms, merely convenient fallback targets. This is significant in deduping: if we have the same expectations in mac-leopard, mac-snowleopard and mac-tiger, but a different result in mac, then we can clobber the result in mac and delete the others. We couldn&apos;t do that if mac was a platform in itself, because then it having different expectations would be valid and not a duplication.
&gt; &gt; &gt; 
&gt; &gt; &gt; I&apos;ve added a clarifying comment to explain the meaning of the list.
&gt; &gt; 
&gt; &gt; Ok, but how does that scale when we add more ports / platforms to the project?  Will someone have to hunt around all of webkitpy to find all the port-specific logic and update it?  It seems better to centralize that knowledge in the port abstraction.
&gt; 
&gt; I agree that this logic should be in shared code, probably in the port abstraction. I like this better than what we have in port right now though. In order to understand each platform&apos;s fallback rules, you need to look in a bunch of different files and it&apos;s very complicated. Having the data in one file would be great. That said, this could just be the underlying data used by the existing port code. For example, the base port class could have this mapping and the baseline_search_path implementations could just index into the mapping. 
&gt; 
&gt; What we lose here is that each port file completely encapsulates the data for that port, but the increased code clarity is worth it IMO.
&gt; 
&gt; In either case, that seems like it could easily be a separate patch. In the interested of avoiding too much yak shaving, how about you rewrite this patch to use baseline_search_path and leave refactoring this stuff as a FIXME?

I&apos;m not sure it&apos;s easy to use baseline_search_path() instead of the current code - if I just use one port&apos;s baseline_search_path() then it won&apos;t be broad enough to be useful[1], and if combine all the baseline_search_path()s then it doesn&apos;t form a tree. I&apos;ll investigate making my deduping algorithm work for DAGs, and then I can generate the DAG from the baseline_search_paths(), and then as a next step replace the baseline_search_path() implementations with a single one that walks the DAG to calculate its fallback path.

[1] eg: I&apos;m on snowleopard now, so my baseline_search_path() is [mac-snowleopard, mac] which should never cause deduping because we don&apos;t know anything about mac-leopard or the other paths that fallback onto mac.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>315997</commentid>
    <comment_count>15</comment_count>
    <who name="James Kozianski">koz</who>
    <bug_when>2010-12-01 19:56:32 -0800</bug_when>
    <thetext>(In reply to comment #11)
&gt; (From update of attachment 75263 [details])
&gt; I just started looking at this patch (sorry for the delay!), so I will confine myself to a couple of comments on topics others haven&apos;t raised, and then reply to some of the other bug comments.
&gt; 
&gt; Mihai says that the intent of this is to replace both webkit-patch rebaseline and rebaseline-chromium-webkit-tests. If so, great! The latter code is poorly tested and hard to maintain, so it&apos;ll be nice to have something theoretically better :)

Cool! :-)

&gt; 
&gt; 
&gt; &gt; WebKitTools/Scripts/webkitpy/common/system/filesystem.py:126
&gt; &gt; +        shutil.copyfile(src, dest)
&gt; 
&gt; Why copy_file instead of copyfile(), or remove_file() instead of unlink or remove? I would prefer to have the methods be the same as the underlying package/class method names, to minimize the cognitive overhead.

I called them *_file because it seemed to fit the above methods in filesystem.py (read_text_file, write_text_file, ...), but then again there are a bunch of methods higher up that are named after the functions they call through to, so I&apos;ve renamed them &apos;copyfile&apos; and &apos;remove&apos;.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>316010</commentid>
    <comment_count>16</comment_count>
    <who name="James Kozianski">koz</who>
    <bug_when>2010-12-01 21:50:04 -0800</bug_when>
    <thetext>(In reply to comment #12)
&gt; (In reply to comment #9)
&gt; &gt; 
&gt; &gt; The mapping between LayoutTest/platform directories and buildbots probably belongs somewhere in the port abstraction.  You&apos;ll find that we already have two port abstractions (shame on us), but we should be able to teach one fo them to find it&apos;s buildbot.
&gt; &gt;
&gt; 
&gt; In the absence of an obviously better place to put this, I&apos;m inclined to agree that this belongs as a method on layout_tests/port/*, since those files are likely the basis for whatever persists into the future. That said, my comment above stands, in that this is code that has nothing to do w/ actually running the tests. I think we need to figure out how to break the Port objects up into composites.
&gt; 
&gt; &gt; &gt; &gt; &gt; WebKitTools/Scripts/webkitpy/layout_tests/rebaseline/rebaseliner.py:61
&gt; &gt; &gt; &gt; &gt; +    def _make_bucket_tree(self):
&gt; &gt; &gt; &gt; &gt; +        b = bucket.BucketTree()
&gt; &gt; &gt; &gt; &gt; +        b.b(None,
&gt; &gt; &gt; &gt; &gt; +            b.b(&apos;mac&apos;,
&gt; &gt; &gt; &gt; &gt; +                b.b(&apos;mac-snowleopard&apos;,
&gt; &gt; &gt; &gt; &gt; +                    b.b(&apos;mac-leopard&apos;,
&gt; &gt; &gt; &gt; &gt; +                        b.b(&apos;mac-tiger&apos;))),
&gt; &gt; &gt; &gt; &gt; +                b.b(&apos;win&apos;,
&gt; &gt; &gt; &gt; &gt; +                    b.b(&apos;chromium&apos;,
&gt; &gt; &gt; &gt; &gt; +                        b.b(&apos;chromium-mac&apos;),
&gt; &gt; &gt; &gt; &gt; +                        b.b(&apos;chromium-win&apos;,
&gt; &gt; &gt; &gt; &gt; +                            b.b(&apos;chromium-win-vista&apos;,
&gt; &gt; &gt; &gt; &gt; +                                b.b(&apos;chromium-win-xp&apos;)),
&gt; &gt; &gt; &gt; &gt; +                            b.b(&apos;chromium-linux&apos;,
&gt; &gt; &gt; &gt; &gt; +                                b.b(&apos;chromium-gpu&apos;,
&gt; &gt; &gt; &gt; &gt; +                                    b.b(&apos;chromium-gpu-linux&apos;),
&gt; &gt; &gt; &gt; &gt; +                                    b.b(&apos;chromium-gpu-win&apos;),
&gt; &gt; &gt; &gt; &gt; +                                    b.b(&apos;chromium-gpu-mac&apos;))))))),
&gt; &gt; &gt; &gt; &gt; +            b.b(&apos;qt&apos;,
&gt; &gt; &gt; &gt; &gt; +                b.b(&apos;qt-linux&apos;),
&gt; &gt; &gt; &gt; &gt; +                b.b(&apos;qt-mac&apos;),
&gt; &gt; &gt; &gt; &gt; +                b.b(&apos;qt-win&apos;)),
&gt; &gt; &gt; &gt; &gt; +            b.b(&apos;gtk&apos;))
&gt; &gt; &gt; &gt; 
&gt; &gt; &gt; &gt; Is this some kind of description of the structure of the expectations fallback tree?  If so, it should be in code that&apos;s shareable with the rest of webkitpy instead of siloed away here.
&gt; &gt; &gt; 
&gt; &gt; &gt; Yes, this is the fallback tree that is implied by the various implementations of Port.baseline_search_path() - it is needed to do correct deduping. I would like to see all the different implementations of that method go away and have the tree above be the authoritive fallback tree, but that seemed like it should happen in its own patch.
&gt; &gt; 
&gt; &gt; It&apos;s certainly fine to do that in a separate patch, but we&apos;re not going to want to make the situation worse by landing this patch before that one.  That&apos;s how we accumulate these technical debts.
&gt; &gt; 
&gt; 
&gt; As Ojan has already pointed out, this logic is wrong (e.g., chromium-mac doesn&apos;t fall back to win). 
&gt; 
&gt; Unfortunately, I don&apos;t think you can even draw the logic for all of the ports as a single tree, so this approach might be fatally flawed. At least it&apos;s a DAG :)
&gt; 
&gt; I agree with Ojan that attempting to figure out the logic in the current codebase is complicated. And, I agree that we don&apos;t want to lose port.baseline_search_path() as at least an entry point. 
&gt; 
&gt; Maybe this is something best solved with some form of composition, or mixins, or multiple inheritance. Not sure.

If I change my data structure to a DAG then we can generate it from the different baseline_search_path() implementations at runtime, and then as a next step we could replace all the implementations of baseline_search_path() with something like this...

class Port(object):
    ....
    def baseline_search_path(self):
        return DAG_OF_ALL_FALLBACK_PATHS.path_to_root_from(self.name())

&gt; 
&gt; I also agree with Adam that it would be really nice if we didn&apos;t have two sources of truth in the tree at the same time. That said, I would be okay with it as long as you agreed to immediately fix things after this feature landed. It would be better if we could refactor/change the port code first, in a separate patch, though.

Yep, I&apos;ll try to get the DAG happening, then we won&apos;t need the two sources of truth.

&gt; 
&gt; &gt; &gt; &gt; &gt; WebKitTools/Scripts/webkitpy/layout_tests/rebaseline/rebaseliner.py:63
&gt; &gt; &gt; &gt; &gt; +        AGGREGATE_BUCKETS = [&apos;chromium&apos;, &apos;chromium-win&apos;, &apos;win&apos;, &apos;mac&apos;, &apos;qt&apos;, &apos;chromium-gpu&apos;]
&gt; &gt; &gt; &gt; 
&gt; &gt; &gt; &gt; Why is this magic list here?  We shouldn&apos;t have magic constants like this in the code.
&gt; &gt; &gt; 
&gt; &gt; &gt; These are the names of platforms that aren&apos;t targeted by any builders because they don&apos;t denote real platforms, merely convenient fallback targets. This is significant in deduping: if we have the same expectations in mac-leopard, mac-snowleopard and mac-tiger, but a different result in mac, then we can clobber the result in mac and delete the others. We couldn&apos;t do that if mac was a platform in itself, because then it having different expectations would be valid and not a duplication.
&gt; &gt; &gt; 
&gt; &gt; &gt; I&apos;ve added a clarifying comment to explain the meaning of the list.
&gt; &gt; 
&gt; &gt; Ok, but how does that scale when we add more ports / platforms to the project?  Will someone have to hunt around all of webkitpy to find all the port-specific logic and update it?  It seems better to centralize that knowledge in the port abstraction.
&gt; &gt;
&gt; 
&gt; I fear you aren&apos;t aware of how we name the platform dirs. If a platform directory indicates an operating system, but not a version of an operating system, then it is meant to indicate &quot;the most recent version of that operating system&quot; (and it includes any older versions if the older version is either untested, or uncared about).  &quot;chromium-win&quot; is what we use on Windows 7 bots (there is no chromium-win-7 directory). &quot;chromium-mac&quot; is similarly equivalent to &quot;chromium-mac-snowleopard&quot; (and/or Lion, which we don&apos;t really support). Same thing is true for &apos;mac&apos;, and &apos;win&apos;. &apos;qt&apos; is just a regular platform, period.
&gt; 
&gt; So, what you said about clobbering &apos;mac&apos; in the paragraph above is wrong. You would want to clobber the &apos;mac-leopard&apos; and &apos;mac-tiger&apos; versions of the results, but leave &apos;mac&apos; and &apos;mac-snowleopard&apos; (and we would assume that &apos;mac&apos; now refers to Lion).
&gt; 
&gt; The only truly &quot;dummy&quot; platforms  are &apos;chromium&apos; and &apos;chromium-gpu&apos;.  

I see, so the mac fallback order [mac-tiger, mac-leopard, mac-snowleopard, mac] is meant to be searching from the oldest revisions to the newest revisions of mac. Thanks for the explanation.

So this would imply that nothing in the mac directory will ever get overwritten by this rebaseline script because we don&apos;t have mac-lion builders? IE: &quot;SnowLeopard Intel Release (Tests)&quot; would have its results sent to mac-snowleopard?

&gt; 
&gt; &gt; &gt; &gt; &gt; WebKitTools/Scripts/webkitpy/layout_tests/rebaseline/result.py:35
&gt; &gt; &gt; &gt; &gt; +class Result(object):
&gt; &gt; &gt; &gt; &gt; +    &quot;&quot;&quot;Represents the result of a single test on a single platform&quot;&quot;&quot;
&gt; &gt; &gt; &gt; 
&gt; &gt; &gt; &gt; We already have an abstraction for Result.
&gt; &gt; &gt; 
&gt; &gt; &gt; Are you referring to the webkitpy/layout_tests/test_types module? Those classes seem like they have a different usage to the ones I&apos;m introducing here - they have no state and perform functions on filenames and file contents passed in to them. There is no point in having more than one instance of those classes, whereas the Result classes defined here are stateful and are meant to represent Results (local or remote) for the purposes of comparing them.
&gt; &gt; 
&gt; 
&gt; Ouch. My head hurts here at introducing this concept. I think what you actually want is something closer to the layout_tests.layout_package.test_output concept, possibly combined with the expected_* methods on the Port class.
&gt; 
&gt; Also, please don&apos;t call this &quot;Result&quot; - that is too generic and overloaded a term. Even if you were to call it a &quot;TestResult&quot;, that&apos;s confusing, because is the object referring to the actual expected output, or the results of running the test and comparing against the expectations (e.g., &quot;PASS&quot;/&quot;FAIL&quot;, etc.)? 

Maybe we can use the term &apos;baseline&apos; to mean the thing that this class represents, ie: something that the output of a test can be compared against to determine PASS/FAIL?

That seems to fit with the general phrase &apos;rebaselining&apos; - it&apos;s taking baselines from builders and using them to overwrite our existing baselines. What do you think?

&gt; 
&gt; I&apos;ve been trying to morph the layout tests code into using something a bit more consistent, so we should line things up here if we can. I would prefer something like &quot;TestOutput&quot; here.

Could you be a bit more specific? How could I change Results to be more suitable?

&gt; 
&gt; As to the overlap between test_output, test_types, and the port/* routines, those ned to be cleaned up as well. My current thinking is that the test_types classes are legacy objects from much earlier versions of new-run-webkit-tests (predating the port/* abstraction completely), and just need to go away. I.e., it&apos;s an abstraction that is confusing things.
&gt; 
&gt; In the very near future we&apos;ll need to add support for audio files and tests, and this aspect of the design should really be cleaned up (I&apos;m expecting by me) before then.
&gt; 
&gt; Also, the work we&apos;re doing with reftests will impact this as well, so it would be good to get up to speed on that if you aren&apos;t already (and I&apos;ve cc&apos;ed Ito-san on this to make sure he&apos;s aware of it as well).

I&apos;m not familiar with reftests. Could you point me to somewhere I could learn more about them?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>316572</commentid>
    <comment_count>17</comment_count>
    <who name="Dirk Pranke">dpranke</who>
    <bug_when>2010-12-02 17:52:08 -0800</bug_when>
    <thetext>(In reply to comment #14)
&gt; I was wondering if it was possible / a good idea to change our test fallback order so that it does make a tree? 

Yes, it is theoretically possible. I have no idea how much work it would be. I do think it would be a good idea to evaluate it and see, because the current logic causes no end of confusion.

Not as part of this patch, though :)

&gt; 
&gt; I&apos;m not sure it&apos;s easy to use baseline_search_path() instead of the current code - if I just use one port&apos;s baseline_search_path() then it won&apos;t be broad enough to be useful[1], and if combine all the baseline_search_path()s then it doesn&apos;t form a tree. I&apos;ll investigate making my deduping algorithm work for DAGs, and then I can generate the DAG from the baseline_search_paths(), and then as a next step replace the baseline_search_path() implementations with a single one that walks the DAG to calculate its fallback path.
&gt; 
&gt; [1] eg: I&apos;m on snowleopard now, so my baseline_search_path() is [mac-snowleopard, mac] which should never cause deduping because we don&apos;t know anything about mac-leopard or the other paths that fallback onto mac.

Yes, Victor and I had a lot of discussions about how to do this when he was implementing/maintaining rebaseline-chromium-webkit-tests. You end up carrying around multiple Port objects - the port you&apos;re actually running on (to be able to diff images, etc.), the Port you&apos;re manipulating results for, and I think we even needed another one for some reason. I suggest you look carefully at that code.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>316574</commentid>
    <comment_count>18</comment_count>
    <who name="Dirk Pranke">dpranke</who>
    <bug_when>2010-12-02 17:56:21 -0800</bug_when>
    <thetext>(In reply to comment #7)
&gt; &gt; &gt; WebKitTools/Scripts/webkitpy/tool/commands/rebaseline2.py:53
&gt; &gt; &gt; +            make_option(&quot;--chromium&quot;, action=&quot;store_true&quot;, dest=&quot;use_chromium_bots&quot;, help=&quot;Fetch results from the Chromium bots.&quot;),
&gt; &gt; 
&gt; &gt; Boo.  We should use --port to specify the port instead of making a magic special case for Chromium.
&gt; 
&gt; Sorry, I was imitating build-webkit&apos;s --chromium flag here. I&apos;ve added Port.buildbot_resultset() so the buildbots used are controlled via the port.
&gt;

Well, --platform, actually, not --port, but otherwise I agree that these switches probably don&apos;t make sense in this context.

--chromium is useful in the run-webkit-tests case because we run on multiple operating systems, and so it enables scripts to specify that they want the chromium version regardless of what operating system is actually running.

Adam was half jesting, but one could almost argue that --webkit might make sense for the same reason, if you were attempting to define --webkit as (mac|win). But those two ports are different enough from each other that even the Apple guys don&apos;t tend to think of them that way AFAIK.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>316587</commentid>
    <comment_count>19</comment_count>
    <who name="Dirk Pranke">dpranke</who>
    <bug_when>2010-12-02 18:24:23 -0800</bug_when>
    <thetext>(In reply to comment #16)
&gt; I see, so the mac fallback order [mac-tiger, mac-leopard, mac-snowleopard, mac] is meant to be searching from the oldest revisions to the newest revisions of mac. Thanks for the explanation.
&gt; 
&gt; So this would imply that nothing in the mac directory will ever get overwritten by this rebaseline script because we don&apos;t have mac-lion builders? IE: &quot;SnowLeopard Intel Release (Tests)&quot; would have its results sent to mac-snowleopard?
&gt; 

Well, it&apos;s conceivable that someone might have access to a Lion builder and want to use this script. More generally, I was trying to describe the overall method we use for handling operating system versions.

Now, SL/Lion is an interesting case since we know it will arrive &quot;soonish&quot;. I just asked on #webkit to attempt to clarify this. The answer I got back was that platform/mac should be used to refer to &quot;the newest version of the mac operating system&quot;. In particular, those of us who don&apos;t have access to Lion have no way of knowing whether or not our tests (or results) are SL-specific, or if they will be the same for both Lion and SL (in which case, they should be in platform/mac).

Basically, only people w/ access to Lion who know what they are doing should ever put something into mac-snowleopard. The rest of us should assume mac-snowleopard is read/delete-only (not write).

As to how you address this in the code, I have no brilliant idea at the moment. The best idea I have is to distinguish the &quot;read&quot; path from the &quot;write&quot; path, maybe through a flag passed to baseline_search_path. I suggest that for now, for this patch, assume either mac == lion and we have access to it, or mac == snow-leopard, and pretend that mac-snowleopard doesn&apos;t exist.

However, I just clarified the i
&gt; &gt; 
&gt; &gt; &gt; &gt; &gt; &gt; WebKitTools/Scripts/webkitpy/layout_tests/rebaseline/result.py:35
&gt; &gt; &gt; &gt; &gt; &gt; +class Result(object):
&gt; &gt; &gt; &gt; &gt; &gt; +    &quot;&quot;&quot;Represents the result of a single test on a single platform&quot;&quot;&quot;
&gt; &gt; &gt; &gt; &gt; 
&gt; &gt; &gt; &gt; &gt; We already have an abstraction for Result.
&gt; &gt; &gt; &gt; 
&gt; &gt; &gt; &gt; Are you referring to the webkitpy/layout_tests/test_types module? Those classes seem like they have a different usage to the ones I&apos;m introducing here - they have no state and perform functions on filenames and file contents passed in to them. There is no point in having more than one instance of those classes, whereas the Result classes defined here are stateful and are meant to represent Results (local or remote) for the purposes of comparing them.
&gt; &gt; &gt; 
&gt; &gt; 
&gt; &gt; Ouch. My head hurts here at introducing this concept. I think what you actually want is something closer to the layout_tests.layout_package.test_output concept, possibly combined with the expected_* methods on the Port class.
&gt; &gt; 
&gt; &gt; Also, please don&apos;t call this &quot;Result&quot; - that is too generic and overloaded a term. Even if you were to call it a &quot;TestResult&quot;, that&apos;s confusing, because is the object referring to the actual expected output, or the results of running the test and comparing against the expectations (e.g., &quot;PASS&quot;/&quot;FAIL&quot;, etc.)? 
&gt; 
&gt; Maybe we can use the term &apos;baseline&apos; to mean the thing that this class represents, ie: something that the output of a test can be compared against to determine PASS/FAIL?
&gt; 
&gt; That seems to fit with the general phrase &apos;rebaselining&apos; - it&apos;s taking baselines from builders and using them to overwrite our existing baselines. What do you think?
&gt; 
&gt; &gt; 
&gt; &gt; I&apos;ve been trying to morph the layout tests code into using something a bit more consistent, so we should line things up here if we can. I would prefer something like &quot;TestOutput&quot; here.
&gt; 
&gt; Could you be a bit more specific? How could I change Results to be more suitable?
&gt; 
&gt; &gt; 
&gt; &gt; As to the overlap between test_output, test_types, and the port/* routines, those ned to be cleaned up as well. My current thinking is that the test_types classes are legacy objects from much earlier versions of new-run-webkit-tests (predating the port/* abstraction completely), and just need to go away. I.e., it&apos;s an abstraction that is confusing things.
&gt; &gt; 
&gt; &gt; In the very near future we&apos;ll need to add support for audio files and tests, and this aspect of the design should really be cleaned up (I&apos;m expecting by me) before then.
&gt; &gt; 
&gt; &gt; Also, the work we&apos;re doing with reftests will impact this as well, so it would be good to get up to speed on that if you aren&apos;t already (and I&apos;ve cc&apos;ed Ito-san on this to make sure he&apos;s aware of it as well).
&gt; 
&gt; I&apos;m not familiar with reftests. Could you point me to somewhere I could learn more about them?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>316588</commentid>
    <comment_count>20</comment_count>
    <who name="Dirk Pranke">dpranke</who>
    <bug_when>2010-12-02 18:25:49 -0800</bug_when>
    <thetext>(In reply to comment #19)
&gt; As to how you address this in the code, I have no brilliant idea at the moment. The best idea I have is to distinguish the &quot;read&quot; path from the &quot;write&quot; path, maybe through a flag passed to baseline_search_path. I suggest that for now, for this patch, assume either mac == lion and we have access to it, or mac == snow-leopard, and pretend that mac-snowleopard doesn&apos;t exist.
&gt; 

Whoops. Hit return too soon. Ignore everything below following the above paragraph.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>316594</commentid>
    <comment_count>21</comment_count>
    <who name="Dirk Pranke">dpranke</who>
    <bug_when>2010-12-02 18:33:02 -0800</bug_when>
    <thetext>(In reply to comment #16)
&gt; Maybe we can use the term &apos;baseline&apos; to mean the thing that this class represents, ie: something that the output of a test can be compared against to determine PASS/FAIL?
&gt; 
&gt; That seems to fit with the general phrase &apos;rebaselining&apos; - it&apos;s taking baselines from builders and using them to overwrite our existing baselines. What do you think?
&gt;

I&apos;m not a huge fan of this approach, because you get the concepts of &quot;expected baseline&quot; and &quot;actual baseline&quot;, one of which seems like an oxymoron and the other redundantly redundant.

I think &quot;output&quot; is my favorite candidate so far, but admittedly it&apos;s not great either.

Also, I forgot to mention that I can&apos;t see ResultSet without thinking about JDBC and ODBC, but maybe that&apos;s just me ... I haven&apos;t thought of anything better yet as an alternative.
 
&gt; &gt; 
&gt; &gt; I&apos;ve been trying to morph the layout tests code into using something a bit more consistent, so we should line things up here if we can. I would prefer something like &quot;TestOutput&quot; here.
&gt; 
&gt; Could you be a bit more specific? How could I change Results to be more suitable?
&gt;

Unfortunately, not at the moment, as I haven&apos;t really even started to play with these ideas yet. Hopefully more next week. I need to stare more at how you&apos;re using Result to think about commonalities and differences.
 
&gt; &gt; Also, the work we&apos;re doing with reftests will impact this as well, so it would be good to get up to speed on that if you aren&apos;t already (and I&apos;ve cc&apos;ed Ito-san on this to make sure he&apos;s aware of it as well).
&gt; 
&gt; I&apos;m not familiar with reftests. Could you point me to somewhere I could learn more about them?

reftests are the idea that foo.html should render exactly like foo-expected.html (the &quot;reference&quot; version). They allow you to write a large class of tests that can stay pretty platform-independent (for example, because both tests will draw scroll bars the same way). Mozilla uses them pretty extensively. 

They don&apos;t replace every kind of pixel test, though.

Ito-san is working on adding support to NRWT for them. See bug 36065 for more info and references to design, Mozilla&apos;s docs, etc.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>316595</commentid>
    <comment_count>22</comment_count>
    <who name="Dirk Pranke">dpranke</who>
    <bug_when>2010-12-02 18:35:58 -0800</bug_when>
    <thetext>(In reply to comment #19)
&gt; As to how you address this in the code, I have no brilliant idea at the moment. The best idea I have is to distinguish the &quot;read&quot; path from the &quot;write&quot; path, maybe through a flag passed to baseline_search_path. I suggest that for now, for this patch, assume either mac == lion and we have access to it, or mac == snow-leopard, and pretend that mac-snowleopard doesn&apos;t exist.

I meant to add that assuming mac == lion should address the lion&apos;s share of the rebaselining we need to do.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>318606</commentid>
    <comment_count>23</comment_count>
      <attachid>75869</attachid>
    <who name="James Kozianski">koz</who>
    <bug_when>2010-12-07 21:40:14 -0800</bug_when>
    <thetext>Created attachment 75869
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>318620</commentid>
    <comment_count>24</comment_count>
    <who name="James Kozianski">koz</who>
    <bug_when>2010-12-07 21:48:22 -0800</bug_when>
    <thetext>(In reply to comment #23)
&gt; Created an attachment (id=75869) [details]
&gt; Patch

The main changes in this patch are:

- Deduping algorithm now works for DAGs, as opposed to trees.
- Removed big, explicit platform fallback order - now we use one generated from the Port.baseline_search_path()s defined in the Port subclasses.
- Added methods to Port for retrieving ResultSets.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>318630</commentid>
    <comment_count>25</comment_count>
    <who name="James Kozianski">koz</who>
    <bug_when>2010-12-07 21:53:56 -0800</bug_when>
    <thetext>(In reply to comment #17)
&gt; (In reply to comment #14)
&gt; &gt; I&apos;m not sure it&apos;s easy to use baseline_search_path() instead of the current code - if I just use one port&apos;s baseline_search_path() then it won&apos;t be broad enough to be useful[1], and if combine all the baseline_search_path()s then it doesn&apos;t form a tree. I&apos;ll investigate making my deduping algorithm work for DAGs, and then I can generate the DAG from the baseline_search_paths(), and then as a next step replace the baseline_search_path() implementations with a single one that walks the DAG to calculate its fallback path.
&gt; &gt; 
&gt; &gt; [1] eg: I&apos;m on snowleopard now, so my baseline_search_path() is [mac-snowleopard, mac] which should never cause deduping because we don&apos;t know anything about mac-leopard or the other paths that fallback onto mac.
&gt; 
&gt; Yes, Victor and I had a lot of discussions about how to do this when he was implementing/maintaining rebaseline-chromium-webkit-tests. You end up carrying around multiple Port objects - the port you&apos;re actually running on (to be able to diff images, etc.), the Port you&apos;re manipulating results for, and I think we even needed another one for some reason. I suggest you look carefully at that code.

Yes, it is very tricky. In my patch I&apos;ve tried to take out the stuff from Port that I need (ie: the image diffing functionality and the baseline search paths) so the only time I need to reference / depend on them is in the top level rebaseliner2.py.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>318643</commentid>
    <comment_count>26</comment_count>
    <who name="James Kozianski">koz</who>
    <bug_when>2010-12-07 22:00:04 -0800</bug_when>
    <thetext>(In reply to comment #18)
&gt; (In reply to comment #7)
&gt; &gt; &gt; &gt; WebKitTools/Scripts/webkitpy/tool/commands/rebaseline2.py:53
&gt; &gt; &gt; &gt; +            make_option(&quot;--chromium&quot;, action=&quot;store_true&quot;, dest=&quot;use_chromium_bots&quot;, help=&quot;Fetch results from the Chromium bots.&quot;),
&gt; &gt; &gt; 
&gt; &gt; &gt; Boo.  We should use --port to specify the port instead of making a magic special case for Chromium.
&gt; &gt; 
&gt; &gt; Sorry, I was imitating build-webkit&apos;s --chromium flag here. I&apos;ve added Port.buildbot_resultset() so the buildbots used are controlled via the port.
&gt; &gt;
&gt; 
&gt; Well, --platform, actually, not --port, but otherwise I agree that these switches probably don&apos;t make sense in this context.
&gt; 
&gt; --chromium is useful in the run-webkit-tests case because we run on multiple operating systems, and so it enables scripts to specify that they want the chromium version regardless of what operating system is actually running.
&gt; 
&gt; Adam was half jesting, but one could almost argue that --webkit might make sense for the same reason, if you were attempting to define --webkit as (mac|win). But those two ports are different enough from each other that even the Apple guys don&apos;t tend to think of them that way AFAIK.

I&apos;m currently using the --platform*s* flag to specify what platforms to retrieve new baselines for - are you okay with --platform and --platforms existing?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>318646</commentid>
    <comment_count>27</comment_count>
    <who name="WebKit Review Bot">webkit.review.bot</who>
    <bug_when>2010-12-07 22:01:08 -0800</bug_when>
    <thetext>Attachment 75869 did not pass style-queue:

Failed to run &quot;[&apos;WebKitTools/Scripts/update-webkit&apos;]&quot; exit_code: 2
Updating OpenSource
Incomplete data: Delta source ended unexpectedly at /usr/lib/git-core/git-svn line 5061

Died at WebKitTools/Scripts/update-webkit line 132.


If any of these errors are false positives, please file a bug against check-webkit-style.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>318648</commentid>
    <comment_count>28</comment_count>
    <who name="James Kozianski">koz</who>
    <bug_when>2010-12-07 22:06:00 -0800</bug_when>
    <thetext>(In reply to comment #21)
&gt; (In reply to comment #16)
&gt; &gt; Maybe we can use the term &apos;baseline&apos; to mean the thing that this class represents, ie: something that the output of a test can be compared against to determine PASS/FAIL?
&gt; &gt; 
&gt; &gt; That seems to fit with the general phrase &apos;rebaselining&apos; - it&apos;s taking baselines from builders and using them to overwrite our existing baselines. What do you think?
&gt; &gt;
&gt; 
&gt; I&apos;m not a huge fan of this approach, because you get the concepts of &quot;expected baseline&quot; and &quot;actual baseline&quot;, one of which seems like an oxymoron and the other redundantly redundant.
&gt; 
&gt; I think &quot;output&quot; is my favorite candidate so far, but admittedly it&apos;s not great either.
&gt; 
&gt; Also, I forgot to mention that I can&apos;t see ResultSet without thinking about JDBC and ODBC, but maybe that&apos;s just me ... I haven&apos;t thought of anything better yet as an alternative.

How about TestOutput? That is probably the most literal name we could have, and it is a bit less ambiguous than just Output.

&gt; &gt; &gt; Also, the work we&apos;re doing with reftests will impact this as well, so it would be good to get up to speed on that if you aren&apos;t already (and I&apos;ve cc&apos;ed Ito-san on this to make sure he&apos;s aware of it as well).
&gt; &gt; 
&gt; &gt; I&apos;m not familiar with reftests. Could you point me to somewhere I could learn more about them?
&gt; 
&gt; reftests are the idea that foo.html should render exactly like foo-expected.html (the &quot;reference&quot; version). They allow you to write a large class of tests that can stay pretty platform-independent (for example, because both tests will draw scroll bars the same way). Mozilla uses them pretty extensively. 
&gt; 
&gt; They don&apos;t replace every kind of pixel test, though.
&gt; 
&gt; Ito-san is working on adding support to NRWT for them. See bug 36065 for more info and references to design, Mozilla&apos;s docs, etc.

Cool, cheers.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>318655</commentid>
    <comment_count>29</comment_count>
      <attachid>75872</attachid>
    <who name="James Kozianski">koz</who>
    <bug_when>2010-12-07 22:25:42 -0800</bug_when>
    <thetext>Created attachment 75872
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>318983</commentid>
    <comment_count>30</comment_count>
    <who name="Dirk Pranke">dpranke</who>
    <bug_when>2010-12-08 13:31:23 -0800</bug_when>
    <thetext>(In reply to comment #26)
&gt; I&apos;m currently using the --platform*s* flag to specify what platforms to retrieve new baselines for - are you okay with --platform and --platforms existing?

Yes.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>318986</commentid>
    <comment_count>31</comment_count>
    <who name="Dirk Pranke">dpranke</who>
    <bug_when>2010-12-08 13:34:45 -0800</bug_when>
    <thetext>(In reply to comment #28)
&gt; 
&gt; How about TestOutput? That is probably the most literal name we could have, and it is a bit less ambiguous than just Output.
&gt; 

I&apos;m good with TestOutput.

Aplogies for the delay in responding ... I&apos;m not sure why I didn&apos;t see your comments until just now.

Patch looks pretty good otherwise, although I haven&apos;t yet stared at it in detail. It&apos;s a bit under-commented for my tastes, but so is the rest of WebKit. Can you either rename one of rebaseline.py or rebaseliner.py or at least add some docs at the top to indicate why there are two files and which is which? Maybe you should just combine them into a single file and/or call the class RebaselineCommand instead of Rebaseline2 ?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>319179</commentid>
    <comment_count>32</comment_count>
    <who name="Dirk Pranke">dpranke</who>
    <bug_when>2010-12-08 18:19:09 -0800</bug_when>
    <thetext>After a decently-long IM conversation w/ James, I&apos;ve reached the conclusion that what his code is trying to do is different enough from what the code under layout_tests is designed to do that merging the two will be non-trivial.

Where easy, he should use (and add to) the Port abstractions for now, but we need to step back and come up with a common design that works for both run-webkit-tests (which wants to pretend that all it knows about are test names, and test output, and knows nothing about files) and the rebaselining tools (which only knows about filenames and has to try and reconstruct how they map onto test names and outputs).

A resulting design will probably affect, in addition to James&apos; code:

layout_tests/test_types/*
layout_tests/layout_package/gather_files.py
layout_tests/layout_package/test_output.py
layout_tests/port/* (the methods dealing with test name conversions and expectations, at least)

the work Ito-san is doing with reftests.

However, all that stuff is down the road and shouldn&apos;t hold up this patch. I will take another look later at the code, with that in mind, but since I&apos;m not a reviewer, someone else should review this bearing what I&apos;ve just written in mind.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>319224</commentid>
    <comment_count>33</comment_count>
      <attachid>75872</attachid>
    <who name="Adam Barth">abarth</who>
    <bug_when>2010-12-08 19:36:18 -0800</bug_when>
    <thetext>Comment on attachment 75872
Patch

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

This looks much better than the previous version.  Thanks for integrating your work with webkitpy.common.  That&apos;s very valuable to the project.  I&apos;d like Eric to look over this patch too because he&apos;s more familiar with some of these pieces.  Overall, though, I&apos;m happy with this version.  Thanks for working on the tools.  I&apos;d be more than happy to remove the old rebaseline commands if folks like this one better.

&gt; WebKitTools/Scripts/webkitpy/common/diraszip.py:29
&gt; +from __future__ import with_statement
&gt; +from webkitpy.common.net.remotezip import ZipFileHandle
&gt; +from webkitpy.common.system.filesystem import FileSystem
&gt; +import os
&gt; +import shutil

This is totally a style nit, but we usually import the Python standard library stuff first, then have a blank line, then the webkitpy stuff.

&gt; WebKitTools/Scripts/webkitpy/common/diraszip.py:32
&gt; +class DirectoryAsZip(object):

The file name should match the class name.

&gt; WebKitTools/Scripts/webkitpy/common/net/result.py:34
&gt; +class Result(object):

We really need to make a buildbot folder to put all these buildbot related classes in.  Probably not worth worrying about in this patch, but just a thought.

&gt; WebKitTools/Scripts/webkitpy/common/net/resultset.py:38
&gt; +        self._include_expected = kwargs.get(&apos;include_expected&apos;, True)

why kwargs and not just include_expected=True ?

&gt; WebKitTools/Scripts/webkitpy/common/net/resultset.py:74
&gt; +        target_type = kwargs.get(&apos;target_type&apos;, None)
&gt; +        exact_match = kwargs.get(&apos;exact_match&apos;, False)

Here again kwargs seems like overkill.

&gt; WebKitTools/Scripts/webkitpy/common/net/resultset_unittest.py:111
&gt; +    def testTestExtensionIsIgnored(self):

We usually use unix_hacker_style names for tests, but whatever.

&gt; WebKitTools/Scripts/webkitpy/tool/commands/rebaseline2/bucket.py:26
&gt; +class IndentedLogger(object):

This doesn&apos;t seem specific to this command.  It should be in common somewhere in case someone else wants to use an indented logger.  ;)

&gt; WebKitTools/Scripts/webkitpy/tool/commands/rebaseline2/rebaseline2.py:76
&gt; +            i = options.use_zip_as_archive.index(&apos;:&apos;)
&gt; +            platform, url = options.use_zip_as_archive[:i], options.use_zip_as_archive[i + 1:]

crazy

&gt; WebKitTools/Scripts/webkitpy/tool/commands/rebaseline2/rebaseline2.py:91
&gt; +        del(ports[&apos;test&apos;])
&gt; +        del(ports[&apos;dryrun&apos;])

This doesn&apos;t seem scalable.  Can we add something semantic to this port objects so we can know to disregard them?

&gt; WebKitTools/Scripts/webkitpy/tool/commands/rebaseline2/rebaseliner.py:141
&gt; +        for k, v in self.calculate_rebaseline().items():

Can we use more semantic names than k and v here?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>319231</commentid>
    <comment_count>34</comment_count>
    <who name="Dirk Pranke">dpranke</who>
    <bug_when>2010-12-08 20:05:08 -0800</bug_when>
    <thetext>(In reply to comment #33)
&gt; 
&gt; &gt; WebKitTools/Scripts/webkitpy/common/net/resultset_unittest.py:111
&gt; &gt; +    def testTestExtensionIsIgnored(self):
&gt; 
&gt; We usually use unix_hacker_style names for tests, but whatever.
&gt;

More accurately, we try to follow PEP 8&apos;s style guidelines, which use underscores instead of mixed case for function and method names. We differ from Chromium (and Google) in this regard.
 
&gt; &gt; WebKitTools/Scripts/webkitpy/tool/commands/rebaseline2/bucket.py:26
&gt; &gt; +class IndentedLogger(object):
&gt; 
&gt; This doesn&apos;t seem specific to this command.  It should be in common somewhere in case someone else wants to use an indented logger.  ;)
&gt; 
&gt; &gt; WebKitTools/Scripts/webkitpy/tool/commands/rebaseline2/rebaseline2.py:76
&gt; &gt; +            i = options.use_zip_as_archive.index(&apos;:&apos;)
&gt; &gt; +            platform, url = options.use_zip_as_archive[:i], options.use_zip_as_archive[i + 1:]
&gt; 
&gt; crazy

Can you get this with something like options.use_zip_as_archive.index.split(&apos;:&apos;), or might there be more than one colon in the value?

&gt; 
&gt; &gt; WebKitTools/Scripts/webkitpy/tool/commands/rebaseline2/rebaseline2.py:91
&gt; &gt; +        del(ports[&apos;test&apos;])
&gt; &gt; +        del(ports[&apos;dryrun&apos;])
&gt; 
&gt; This doesn&apos;t seem scalable.  Can we add something semantic to this port objects so we can know to disregard them?
&gt;

This will be fixed as part of bug 47578, which I should be addressing shortly. I wouldn&apos;t bother doing anything about it here.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>319691</commentid>
    <comment_count>35</comment_count>
    <who name="James Kozianski">koz</who>
    <bug_when>2010-12-09 13:33:57 -0800</bug_when>
    <thetext>(In reply to comment #33)
&gt; (From update of attachment 75872 [details])
&gt; View in context: https://bugs.webkit.org/attachment.cgi?id=75872&amp;action=review
&gt; 
&gt; This looks much better than the previous version.  Thanks for integrating your work with webkitpy.common.  That&apos;s very valuable to the project.  I&apos;d like Eric to look over this patch too because he&apos;s more familiar with some of these pieces.  Overall, though, I&apos;m happy with this version.  Thanks for working on the tools.  I&apos;d be more than happy to remove the old rebaseline commands if folks like this one better.
&gt; 
&gt; &gt; WebKitTools/Scripts/webkitpy/common/diraszip.py:29
&gt; &gt; +from __future__ import with_statement
&gt; &gt; +from webkitpy.common.net.remotezip import ZipFileHandle
&gt; &gt; +from webkitpy.common.system.filesystem import FileSystem
&gt; &gt; +import os
&gt; &gt; +import shutil
&gt; 
&gt; This is totally a style nit, but we usually import the Python standard library stuff first, then have a blank line, then the webkitpy stuff.

Done.

&gt; 
&gt; &gt; WebKitTools/Scripts/webkitpy/common/diraszip.py:32
&gt; &gt; +class DirectoryAsZip(object):
&gt; 
&gt; The file name should match the class name.

Renamed class to DirAsZip.

&gt; 
&gt; &gt; WebKitTools/Scripts/webkitpy/common/net/resultset.py:38
&gt; &gt; +        self._include_expected = kwargs.get(&apos;include_expected&apos;, True)
&gt; 
&gt; why kwargs and not just include_expected=True ?

I think using keyword arguments here improves readability at the call sites, and it will be easier to add more orthogonal arguments later if the need arises.

&gt; 
&gt; &gt; WebKitTools/Scripts/webkitpy/common/net/resultset.py:74
&gt; &gt; +        target_type = kwargs.get(&apos;target_type&apos;, None)
&gt; &gt; +        exact_match = kwargs.get(&apos;exact_match&apos;, False)
&gt; 
&gt; Here again kwargs seems like overkill.

As above, I think it makes the call sites nicer, but I&apos;m happy to change it if you feel strongly about it.

&gt; 
&gt; &gt; WebKitTools/Scripts/webkitpy/common/net/resultset_unittest.py:111
&gt; &gt; +    def testTestExtensionIsIgnored(self):
&gt; 
&gt; We usually use unix_hacker_style names for tests, but whatever.

That&apos;s fine, it won&apos;t be too much effort to fix.

&gt; 
&gt; &gt; WebKitTools/Scripts/webkitpy/tool/commands/rebaseline2/bucket.py:26
&gt; &gt; +class IndentedLogger(object):
&gt; 
&gt; This doesn&apos;t seem specific to this command.  It should be in common somewhere in case someone else wants to use an indented logger.  ;)

Haha, of course :-) I put it in webkitpy/common/indented_logger.py

&gt; 
&gt; &gt; WebKitTools/Scripts/webkitpy/tool/commands/rebaseline2/rebaseline2.py:76
&gt; &gt; +            i = options.use_zip_as_archive.index(&apos;:&apos;)
&gt; &gt; +            platform, url = options.use_zip_as_archive[:i], options.use_zip_as_archive[i + 1:]
&gt; 
&gt; crazy
&gt; 
&gt; &gt; WebKitTools/Scripts/webkitpy/tool/commands/rebaseline2/rebaseline2.py:91
&gt; &gt; +        del(ports[&apos;test&apos;])
&gt; &gt; +        del(ports[&apos;dryrun&apos;])
&gt; 
&gt; This doesn&apos;t seem scalable.  Can we add something semantic to this port objects so we can know to disregard them?
&gt; 
&gt; &gt; WebKitTools/Scripts/webkitpy/tool/commands/rebaseline2/rebaseliner.py:141
&gt; &gt; +        for k, v in self.calculate_rebaseline().items():
&gt; 
&gt; Can we use more semantic names than k and v here?

Done.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>319692</commentid>
    <comment_count>36</comment_count>
    <who name="James Kozianski">koz</who>
    <bug_when>2010-12-09 13:36:44 -0800</bug_when>
    <thetext>(In reply to comment #34)
&gt; (In reply to comment #33)
&gt; &gt; &gt; WebKitTools/Scripts/webkitpy/tool/commands/rebaseline2/rebaseline2.py:76
&gt; &gt; &gt; +            i = options.use_zip_as_archive.index(&apos;:&apos;)
&gt; &gt; &gt; +            platform, url = options.use_zip_as_archive[:i], options.use_zip_as_archive[i + 1:]
&gt; &gt; 
&gt; &gt; crazy
&gt; 
&gt; Can you get this with something like options.use_zip_as_archive.index.split(&apos;:&apos;), or might there be more than one colon in the value?

It could, depending on what the user names their zips. I remember changing it from .split(&apos;:&apos;) because I broke something.

&gt; 
&gt; &gt; 
&gt; &gt; &gt; WebKitTools/Scripts/webkitpy/tool/commands/rebaseline2/rebaseline2.py:91
&gt; &gt; &gt; +        del(ports[&apos;test&apos;])
&gt; &gt; &gt; +        del(ports[&apos;dryrun&apos;])
&gt; &gt; 
&gt; &gt; This doesn&apos;t seem scalable.  Can we add something semantic to this port objects so we can know to disregard them?
&gt; &gt;
&gt; 
&gt; This will be fixed as part of bug 47578, which I should be addressing shortly. I wouldn&apos;t bother doing anything about it here.

Ok.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>319697</commentid>
    <comment_count>37</comment_count>
    <who name="James Kozianski">koz</who>
    <bug_when>2010-12-09 13:49:35 -0800</bug_when>
    <thetext>(In reply to comment #31)
&gt; (In reply to comment #28)
&gt; &gt; 
&gt; &gt; How about TestOutput? That is probably the most literal name we could have, and it is a bit less ambiguous than just Output.
&gt; &gt; 
&gt; 
&gt; I&apos;m good with TestOutput.
&gt; 
&gt; Aplogies for the delay in responding ... I&apos;m not sure why I didn&apos;t see your comments until just now.
&gt; 
&gt; Patch looks pretty good otherwise, although I haven&apos;t yet stared at it in detail. It&apos;s a bit under-commented for my tastes, but so is the rest of WebKit. Can you either rename one of rebaseline.py or rebaseliner.py or at least add some docs at the top to indicate why there are two files and which is which? Maybe you should just combine them into a single file and/or call the class RebaselineCommand instead of Rebaseline2 ?

I called it rebaseline2 to distinguish it from the current rebaseline command (which is plain Rebaseline). I&apos;ll add comments to clarify.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>319704</commentid>
    <comment_count>38</comment_count>
      <attachid>76120</attachid>
    <who name="James Kozianski">koz</who>
    <bug_when>2010-12-09 14:01:09 -0800</bug_when>
    <thetext>Created attachment 76120
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>319864</commentid>
    <comment_count>39</comment_count>
      <attachid>76120</attachid>
    <who name="Eric Seidel (no email)">eric</who>
    <bug_when>2010-12-09 18:48:58 -0800</bug_when>
    <thetext>Comment on attachment 76120
Patch

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

I really feel like we&apos;re doing way too much in one patch here.  Maybe you and I should talk in person?  I&apos;m glad that this is no longer re-inventing the wheel, but I&apos;m not sure this is really woven into webkitpy like it should be yet.

&gt; WebKitTools/Scripts/webkitpy/common/diraszip.py:34
&gt; +class DirAsZip(object):

I would have prefered &quot;directory&quot;, but this is OK.

&gt; WebKitTools/Scripts/webkitpy/common/diraszip.py:36
&gt; +    def __init__(self, path, fs=FileSystem()):

filesystem=None is much better.

&gt; WebKitTools/Scripts/webkitpy/common/diraszip.py:38
&gt; +        self._fs = fs

_filesystem is more readable than _fs in my mind.

&gt; WebKitTools/Scripts/webkitpy/common/diraszip.py:40
&gt; +        if not self._path.endswith(os.path.sep):
&gt; +            self._path += os.path.sep

If you always use os.join then you don&apos;t need this step.

&gt; WebKitTools/Scripts/webkitpy/common/diraszip.py:42
&gt; +    def handle_to(self, filename):

So we just call this open?  PYthon doesn&apos;t talk about &quot;handles&quot;  you just pass around file-like-objects.

&gt; WebKitTools/Scripts/webkitpy/common/diraszip.py:51
&gt; +    def namelist(self):
&gt; +        results = []
&gt; +        for (path, _, filenames) in os.walk(self._path):
&gt; +            for filename in filenames:
&gt; +                # We drop the path to the directory from our namelist.
&gt; +                results.append(os.path.join(path, filename)[len(self._path):])
&gt; +        return results

This is a list comprehension. :)

What is the purpose of this?
os.path.join(path, filename)[len(self._path):]

Why do we need to append the path only to remove the _path?  Ar the paths from os.walk not relative to the root?  I thought they were.

return list(itertools.chain([filenames for (_, _, filenames) in os.walk(self._path)])
would have done the same thing, minus the strange path re-writing.

&gt; WebKitTools/Scripts/webkitpy/common/diraszip.py:54
&gt; +        return self._fs.read_text_file(os.path.join(self._path, filename))

Seems you want a _full_path(filename) helper function since you do os.path.join all over the place.

&gt; WebKitTools/Scripts/webkitpy/common/diraszip.py:61
&gt; +        path_to_file = os.path.split(filename)[0]

Here is that funny add-the-path-but-remove-it-again dance.  Seems this should be a function if you really need it.

&gt; WebKitTools/Scripts/webkitpy/common/diraszip.py:67
&gt; +        assert &apos;..&apos; not in filename

What about leading / ?  Does filename simply need to be underneeth _path?  There is an os.path.relpath which can tell you that.. there may be others.  (os.path.relpath is 2.6 only but we have an implementation in ospath.py in common)

&gt; WebKitTools/Scripts/webkitpy/common/net/buildbot.py:93
&gt; +    def latest_build(self):
&gt; +        revision_build_pairs = self.revision_build_pairs_with_results()

We didn&apos;t have a latest_build method already?  Seems we could get this from buildbot json.  I&apos;m not sure what revision_pairs_with_results does w/o looking.

&gt; WebKitTools/Scripts/webkitpy/common/net/buildbot.py:231
&gt; +        return ResultSet(self._builder.name(), None, RemoteZip(self.results_zip_url()), include_expected=False)

Naming the None arg would make this more readable.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>319865</commentid>
    <comment_count>40</comment_count>
      <attachid>76120</attachid>
    <who name="Eric Seidel (no email)">eric</who>
    <bug_when>2010-12-09 18:49:40 -0800</bug_when>
    <thetext>Comment on attachment 76120
Patch

r- for the mentioned nits.  I&apos;m not sure the path forward here.  I think this patch is too big to review as is.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>319871</commentid>
    <comment_count>41</comment_count>
    <who name="Eric Seidel (no email)">eric</who>
    <bug_when>2010-12-09 19:16:29 -0800</bug_when>
    <thetext>I&apos;m sure we can land a few smaller pieces of this, like the IndentedLogger first, no?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>319872</commentid>
    <comment_count>42</comment_count>
    <who name="Eric Seidel (no email)">eric</who>
    <bug_when>2010-12-09 19:17:52 -0800</bug_when>
    <thetext>Also, I think the &quot;IndentedLogger&quot; is technically a &quot;logging formatter&quot; based on python&apos;s definition of logging:
http://docs.python.org/library/logging.html

We&apos;re slowly trying to move off of my crappy deprecated_logging.py file which I created before any of us even knew logging.py existed in python. :)</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>319916</commentid>
    <comment_count>43</comment_count>
    <who name="James Kozianski">koz</who>
    <bug_when>2010-12-09 21:37:37 -0800</bug_when>
    <thetext>(In reply to comment #39)
&gt; (From update of attachment 76120 [details])
&gt; View in context: https://bugs.webkit.org/attachment.cgi?id=76120&amp;action=review
&gt; 
&gt; I really feel like we&apos;re doing way too much in one patch here.  Maybe you and I should talk in person?  I&apos;m glad that this is no longer re-inventing the wheel, but I&apos;m not sure this is really woven into webkitpy like it should be yet.

Apologies for the large patch here. I&apos;d be glad to talk about it but unfortunately I&apos;m in Sydney, so talking in person would be difficult. Perhaps I should try breaking the patch up and we can discuss it as we get through it all? This patch could be decomposed into these parts:

- The random utility classes (DirAsZip, RemoteZip together, IndentedLogger in a separate one?)
- Introduce Result and ResultSet classes (includes changes to Buildbot to support returning ResultSets).
- Introduce new &apos;webkit-patch rebaseline2&apos; command, which requires Bucket/BucketTree/Rebaseliner.

I&apos;ll respond to your comments below in the appropriate patches.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>319920</commentid>
    <comment_count>44</comment_count>
    <who name="Eric Seidel (no email)">eric</who>
    <bug_when>2010-12-09 21:45:17 -0800</bug_when>
    <thetext>I would like to say that I&apos;m *very* supportive of bringing our various rebaseline commands into the 21st century.  The original chromium rebaseline architecture was wholy separate from webkitpy and does not work with WebKit.  I wrote one for webkit on top of webkitpy in a quick hack one evening, but it&apos;s obviously incomplete.  A unified rebaseline command which leverages webkitpy&apos;s infrastructure (notice how little code webkit-patch rebaseline is!) is a fantastic goal!</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>320931</commentid>
    <comment_count>45</comment_count>
    <who name="James Kozianski">koz</who>
    <bug_when>2010-12-12 20:53:23 -0800</bug_when>
    <thetext>I&apos;ve split out the first sub-patch at https://bugs.webkit.org/show_bug.cgi?id=50901.

(In reply to comment #39)
&gt; (From update of attachment 76120 [details])
&gt; View in context: https://bugs.webkit.org/attachment.cgi?id=76120&amp;action=review
&gt; 
&gt; &gt; WebKitTools/Scripts/webkitpy/common/diraszip.py:36
&gt; &gt; +    def __init__(self, path, fs=FileSystem()):
&gt; 
&gt; filesystem=None is much better.

Done.

&gt; 
&gt; &gt; WebKitTools/Scripts/webkitpy/common/diraszip.py:38
&gt; &gt; +        self._fs = fs
&gt; 
&gt; _filesystem is more readable than _fs in my mind.

Done.

&gt; 
&gt; &gt; WebKitTools/Scripts/webkitpy/common/diraszip.py:40
&gt; &gt; +        if not self._path.endswith(os.path.sep):
&gt; &gt; +            self._path += os.path.sep
&gt; 
&gt; If you always use os.join then you don&apos;t need this step.

Done.

&gt; 
&gt; &gt; WebKitTools/Scripts/webkitpy/common/diraszip.py:42
&gt; &gt; +    def handle_to(self, filename):
&gt; 
&gt; So we just call this open?  PYthon doesn&apos;t talk about &quot;handles&quot;  you just pass around file-like-objects.

Done.

&gt; 
&gt; &gt; WebKitTools/Scripts/webkitpy/common/diraszip.py:51
&gt; &gt; +    def namelist(self):
&gt; &gt; +        results = []
&gt; &gt; +        for (path, _, filenames) in os.walk(self._path):
&gt; &gt; +            for filename in filenames:
&gt; &gt; +                # We drop the path to the directory from our namelist.
&gt; &gt; +                results.append(os.path.join(path, filename)[len(self._path):])
&gt; &gt; +        return results
&gt; 
&gt; This is a list comprehension. :)

Cool! Done.

&gt; 
&gt; What is the purpose of this?
&gt; os.path.join(path, filename)[len(self._path):]
&gt; 
&gt; Why do we need to append the path only to remove the _path?  Ar the paths from os.walk not relative to the root?  I thought they were.

os.walk() returns results relative to the path that it is called from so all results from os.walk(X) will have X as a prefix. We want to pretend that the directory at X is a zip file (in the same vein as http://docs.python.org/library/zipfile.html), so namelist() shouldn&apos;t expose X in its results.

&gt; 
&gt; return list(itertools.chain([filenames for (_, _, filenames) in os.walk(self._path)])
&gt; would have done the same thing, minus the strange path re-writing.

That would only provide a list of the bare filenames under the directory and not include the relative paths to them which we need for extracting files.

&gt; 
&gt; &gt; WebKitTools/Scripts/webkitpy/common/diraszip.py:54
&gt; &gt; +        return self._fs.read_text_file(os.path.join(self._path, filename))
&gt; 
&gt; Seems you want a _full_path(filename) helper function since you do os.path.join all over the place.

Done.

&gt; 
&gt; &gt; WebKitTools/Scripts/webkitpy/common/diraszip.py:61
&gt; &gt; +        path_to_file = os.path.split(filename)[0]
&gt; 
&gt; Here is that funny add-the-path-but-remove-it-again dance.  Seems this should be a function if you really need it.

This is actually a different thing, but in looking at the code I realise it is unnecessarily circuitous, so I&apos;ve made it more concise. The os.path.split() is used to ensure that the directories above the file we want to extract exist at the destination. In Python ZipFile.extract(&apos;src/file&apos;, &apos;dest&apos;) will copy &apos;src/file&apos; to &apos;dest/src/file&apos;.

&gt; 
&gt; &gt; WebKitTools/Scripts/webkitpy/common/diraszip.py:67
&gt; &gt; +        assert &apos;..&apos; not in filename
&gt; 
&gt; What about leading / ?  Does filename simply need to be underneeth _path?  There is an os.path.relpath which can tell you that.. there may be others.  (os.path.relpath is 2.6 only but we have an implementation in ospath.py in common)

Ah, I see - I didn&apos;t know os.path.join() interpreted leading slashes in the second argument. I&apos;ve added an _is_under() method that uses ospath.relpath() and moved the assert to the new _full_path() method.

(In reply to comment #44)
&gt; I would like to say that I&apos;m *very* supportive of bringing our various rebaseline commands into the 21st century.  The original chromium rebaseline architecture was wholy separate from webkitpy and does not work with WebKit.  I wrote one for webkit on top of webkitpy in a quick hack one evening, but it&apos;s obviously incomplete.  A unified rebaseline command which leverages webkitpy&apos;s infrastructure (notice how little code webkit-patch rebaseline is!) is a fantastic goal!

Thanks for the encouragement! I must admit I didn&apos;t expect this script to be as involved as it has been, but I&apos;ll be happy if it is a positive contribution :-)</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>320978</commentid>
    <comment_count>46</comment_count>
    <who name="Adam Barth">abarth</who>
    <bug_when>2010-12-13 01:16:38 -0800</bug_when>
    <thetext>&gt; Apologies for the large patch here. I&apos;d be glad to talk about it but unfortunately I&apos;m in Sydney, so talking in person would be difficult. Perhaps I should try breaking the patch up and we can discuss it as we get through it all?

I think that&apos;s a great idea.  Can you upload the different pieces in separate bugs that block this bug?  I think we&apos;re at the point where we should start landing this patch in pieces.

&gt; This patch could be decomposed into these parts:
&gt; 
&gt; - The random utility classes (DirAsZip, RemoteZip together, IndentedLogger in a separate one?)

Yep.  I&apos;d put DirAsZip and RemoteZip together but put IndentedLogger in a separate patch.  It might seem pedantic to break these things up into smaller pieces, but it&apos;s very helpful.

&gt; - Introduce Result and ResultSet classes (includes changes to Buildbot to support returning ResultSets).

Yep.

&gt; - Introduce new &apos;webkit-patch rebaseline2&apos; command, which requires Bucket/BucketTree/Rebaseliner.

I&apos;d have to look at the details, but that sounds like a reasonable plan.  Don&apos;t forget:

- Remove old rebaseline commands.  :)</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>321679</commentid>
    <comment_count>47</comment_count>
    <who name="James Kozianski">koz</who>
    <bug_when>2010-12-13 22:10:50 -0800</bug_when>
    <thetext>(In reply to comment #46)
&gt; &gt; Apologies for the large patch here. I&apos;d be glad to talk about it but unfortunately I&apos;m in Sydney, so talking in person would be difficult. Perhaps I should try breaking the patch up and we can discuss it as we get through it all?
&gt; 
&gt; I think that&apos;s a great idea.  Can you upload the different pieces in separate bugs that block this bug?  I think we&apos;re at the point where we should start landing this patch in pieces.

Yep, will do. I&apos;ve split off the first patch into bug 50901.

&gt; 
&gt; &gt; This patch could be decomposed into these parts:
&gt; &gt; 
&gt; &gt; - The random utility classes (DirAsZip, RemoteZip together, IndentedLogger in a separate one?)
&gt; 
&gt; Yep.  I&apos;d put DirAsZip and RemoteZip together but put IndentedLogger in a separate patch.  It might seem pedantic to break these things up into smaller pieces, but it&apos;s very helpful.

Oh, not at all. I can see the wisdom of having smaller patches. My original concern was that landing the overall context and direction of the script would be lost in smaller patches, but I think it&apos;s good now.

&gt; 
&gt; &gt; - Introduce Result and ResultSet classes (includes changes to Buildbot to support returning ResultSets).
&gt; 
&gt; Yep.
&gt; 
&gt; &gt; - Introduce new &apos;webkit-patch rebaseline2&apos; command, which requires Bucket/BucketTree/Rebaseliner.
&gt; 
&gt; I&apos;d have to look at the details, but that sounds like a reasonable plan.  Don&apos;t forget:
&gt; 
&gt; - Remove old rebaseline commands.  :)

Yep, will do :-)</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>447651</commentid>
    <comment_count>48</comment_count>
    <who name="Adam Barth">abarth</who>
    <bug_when>2011-08-06 13:18:46 -0700</bug_when>
    <thetext>This bug hasn&apos;t been touched in over six months and we now have a bunch of fancy new rebaselining tools and infrastructure.  Please let me know if there are use cases we haven&apos;t addressed.</thetext>
  </long_desc>
      
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>74903</attachid>
            <date>2010-11-25 22:12:33 -0800</date>
            <delta_ts>2010-11-28 19:11:17 -0800</delta_ts>
            <desc>Patch</desc>
            <filename>bug-50098-20101126171230.patch</filename>
            <type>text/plain</type>
            <size>67355</size>
            <attacher name="James Kozianski">koz</attacher>
            
              <data encoding="base64">ZGlmZiAtLWdpdCBhL1dlYktpdFRvb2xzL0NoYW5nZUxvZyBiL1dlYktpdFRvb2xzL0NoYW5nZUxv
ZwppbmRleCA1NWNlZGFlM2ZjNGRhNGQzZmNkNDIyNGQ4MzU3ZjQyNDhiZTJiOWQyLi5lMWM2YThj
Zjg5NmE0NTdmMDBiMWVlYmI4MWEzNmQyNDI2OGY3ZWQ0IDEwMDY0NAotLS0gYS9XZWJLaXRUb29s
cy9DaGFuZ2VMb2cKKysrIGIvV2ViS2l0VG9vbHMvQ2hhbmdlTG9nCkBAIC0xLDMgKzEsMjMgQEAK
KzIwMTAtMTEtMjUgIEphbWVzIEtvemlhbnNraSAgPGtvekBjaHJvbWl1bS5vcmc+CisKKyAgICAg
ICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChPT1BTISkuCisKKyAgICAgICAgTmV3IHdlYmtpdC1wYXRj
aCByZWJhc2VsaW5lMiBjb21tYW5kLgorICAgICAgICBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9z
aG93X2J1Zy5jZ2k/aWQ9NTAwOTgKKworICAgICAgICAqIFNjcmlwdHMvd2Via2l0cHkvbGF5b3V0
X3Rlc3RzL3JlYmFzZWxpbmUvX19pbml0X18ucHk6IEFkZGVkLgorICAgICAgICAqIFNjcmlwdHMv
d2Via2l0cHkvbGF5b3V0X3Rlc3RzL3JlYmFzZWxpbmUvYWxsX3Rlc3RzLnB5OiBBZGRlZC4KKyAg
ICAgICAgKiBTY3JpcHRzL3dlYmtpdHB5L2xheW91dF90ZXN0cy9yZWJhc2VsaW5lL2J1Y2tldC5w
eTogQWRkZWQuCisgICAgICAgICogU2NyaXB0cy93ZWJraXRweS9sYXlvdXRfdGVzdHMvcmViYXNl
bGluZS9idWNrZXRfdW5pdHRlc3QucHk6IEFkZGVkLgorICAgICAgICAqIFNjcmlwdHMvd2Via2l0
cHkvbGF5b3V0X3Rlc3RzL3JlYmFzZWxpbmUvYnVpbGRlci5weTogQWRkZWQuCisgICAgICAgICog
U2NyaXB0cy93ZWJraXRweS9sYXlvdXRfdGVzdHMvcmViYXNlbGluZS9idWlsZGVyX3VuaXR0ZXN0
LnB5OiBBZGRlZC4KKyAgICAgICAgKiBTY3JpcHRzL3dlYmtpdHB5L2xheW91dF90ZXN0cy9yZWJh
c2VsaW5lL2ludGVncmF0aW9uX3VuaXR0ZXN0LnB5OiBBZGRlZC4KKyAgICAgICAgKiBTY3JpcHRz
L3dlYmtpdHB5L2xheW91dF90ZXN0cy9yZWJhc2VsaW5lL3JlYmFzZWxpbmVyLnB5OiBBZGRlZC4K
KyAgICAgICAgKiBTY3JpcHRzL3dlYmtpdHB5L2xheW91dF90ZXN0cy9yZWJhc2VsaW5lL3Jlc3Vs
dC5weTogQWRkZWQuCisgICAgICAgICogU2NyaXB0cy93ZWJraXRweS9sYXlvdXRfdGVzdHMvcmVi
YXNlbGluZS9yZXN1bHRfdW5pdHRlc3QucHk6IEFkZGVkLgorICAgICAgICAqIFNjcmlwdHMvd2Vi
a2l0cHkvdG9vbC9jb21tYW5kcy9fX2luaXRfXy5weToKKyAgICAgICAgKiBTY3JpcHRzL3dlYmtp
dHB5L3Rvb2wvY29tbWFuZHMvcmViYXNlbGluZTIucHk6IEFkZGVkLgorCiAyMDEwLTExLTI0ICBO
aWNvbGFzIER1ZnJlc25lICA8bmljb2xhcy5kdWZyZXNuZUBjb2xsYWJvcmEuY28udWs+CiAKICAg
ICAgICAgUmV2aWV3ZWQgYnkgTWFydGluIFJvYmluc29uLgpkaWZmIC0tZ2l0IGEvV2ViS2l0VG9v
bHMvU2NyaXB0cy93ZWJraXRweS9sYXlvdXRfdGVzdHMvcmViYXNlbGluZS9fX2luaXRfXy5weSBi
L1dlYktpdFRvb2xzL1NjcmlwdHMvd2Via2l0cHkvbGF5b3V0X3Rlc3RzL3JlYmFzZWxpbmUvX19p
bml0X18ucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMC4uZWY2NWJlZTViYjc3ZTk2ZWJjN2NkOWM0NzY0MDY5MGZiZGE4
YWMxOQotLS0gL2Rldi9udWxsCisrKyBiL1dlYktpdFRvb2xzL1NjcmlwdHMvd2Via2l0cHkvbGF5
b3V0X3Rlc3RzL3JlYmFzZWxpbmUvX19pbml0X18ucHkKQEAgLTAsMCArMSBAQAorIyBSZXF1aXJl
ZCBmb3IgUHl0aG9uIHRvIHNlYXJjaCB0aGlzIGRpcmVjdG9yeSBmb3IgbW9kdWxlIGZpbGVzCmRp
ZmYgLS1naXQgYS9XZWJLaXRUb29scy9TY3JpcHRzL3dlYmtpdHB5L2xheW91dF90ZXN0cy9yZWJh
c2VsaW5lL2FsbF90ZXN0cy5weSBiL1dlYktpdFRvb2xzL1NjcmlwdHMvd2Via2l0cHkvbGF5b3V0
X3Rlc3RzL3JlYmFzZWxpbmUvYWxsX3Rlc3RzLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4
IDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAuLmI4NWViMTU0N2YyYmE2
ODIyMTY2ZTExMzc5MzU3Mzc3ODQ4YjE3MjIKLS0tIC9kZXYvbnVsbAorKysgYi9XZWJLaXRUb29s
cy9TY3JpcHRzL3dlYmtpdHB5L2xheW91dF90ZXN0cy9yZWJhc2VsaW5lL2FsbF90ZXN0cy5weQpA
QCAtMCwwICsxLDcgQEAKK2Zyb20gYnVpbGRlcl91bml0dGVzdCBpbXBvcnQgKgorZnJvbSByZXN1
bHRfdW5pdHRlc3QgaW1wb3J0ICoKK2Zyb20gYnVja2V0X3VuaXR0ZXN0IGltcG9ydCAqCitmcm9t
IGludGVncmF0aW9uX3VuaXR0ZXN0IGltcG9ydCAqCitpbXBvcnQgdW5pdHRlc3QKKwordW5pdHRl
c3QubWFpbigpCmRpZmYgLS1naXQgYS9XZWJLaXRUb29scy9TY3JpcHRzL3dlYmtpdHB5L2xheW91
dF90ZXN0cy9yZWJhc2VsaW5lL2J1Y2tldC5weSBiL1dlYktpdFRvb2xzL1NjcmlwdHMvd2Via2l0
cHkvbGF5b3V0X3Rlc3RzL3JlYmFzZWxpbmUvYnVja2V0LnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0
CmluZGV4IDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAuLjFiZjYyOWVj
ZDYwNjViZWViYzlkMzM5MzkyZTQwMTlmODM0MzM4ZGEKLS0tIC9kZXYvbnVsbAorKysgYi9XZWJL
aXRUb29scy9TY3JpcHRzL3dlYmtpdHB5L2xheW91dF90ZXN0cy9yZWJhc2VsaW5lL2J1Y2tldC5w
eQpAQCAtMCwwICsxLDIyOSBAQAorIyEvdXNyL2Jpbi9lbnYgcHl0aG9uCisjIENvcHlyaWdodCAo
QykgMjAxMCBHb29nbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorIworIyBSZWRpc3RyaWJ1
dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQK
KyMgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2lu
ZyBjb25kaXRpb25zCisjIGFyZSBtZXQ6CisjCisjIDEuICBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291
cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorIyAgICAgbm90aWNlLCB0
aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorIyAy
LiAgUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92
ZSBjb3B5cmlnaHQKKyMgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRo
ZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyMgICAgIGRvY3VtZW50YXRpb24gYW5kL29y
IG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisjCisjIFRI
SVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgQU5EIElUUyBDT05UUklCVVRPUlMgIkFT
IElTIiBBTkQgQU5ZCisjIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcs
IEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQKKyMgV0FSUkFOVElFUyBPRiBNRVJDSEFO
VEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQorIyBESVND
TEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBPUiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJ
QUJMRSBGT1IgQU5ZCisjIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVY
RU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCisjIChJTkNMVURJTkcsIEJVVCBOT1Qg
TElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsK
KyMgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElP
TikgSE9XRVZFUiBDQVVTRUQgQU5ECisjIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVU
SEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisjIChJTkNMVURJTkcg
TkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVT
RSBPRgorIyBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZ
IE9GIFNVQ0ggREFNQUdFLgorCisKK2NsYXNzIEluZGVudGVkTG9nZ2VyKG9iamVjdCk6CisgICAg
IiIiTG9nZ2VyIHRoYXQgcHJpbnRzIGluZGVudGVkIG1lc3NhZ2VzIiIiCisgICAgZGVmIF9faW5p
dF9fKHNlbGYsIGxvZ2dlcj1Ob25lKToKKyAgICAgICAgc2VsZi5fbG9nZ2VyID0gbG9nZ2VyCisg
ICAgICAgIHNlbGYuX2luZGVudCA9IDAKKworICAgIGRlZiBpbmRlbnQoc2VsZik6CisgICAgICAg
IHNlbGYuX2luZGVudCArPSAxCisKKyAgICBkZWYgb3V0ZGVudChzZWxmKToKKyAgICAgICAgc2Vs
Zi5faW5kZW50IC09IDEKKworICAgIGRlZiBsb2coc2VsZiwgbWVzc2FnZSk6CisgICAgICAgIG1l
c3NhZ2UgPSAnICAnICogc2VsZi5faW5kZW50ICsgbWVzc2FnZQorICAgICAgICBpZiBzZWxmLl9s
b2dnZXIgaXMgTm9uZToKKyAgICAgICAgICAgIHByaW50IG1lc3NhZ2UKKyAgICAgICAgZWxzZToK
KyAgICAgICAgICAgIHNlbGYuX2xvZ2dlcihtZXNzYWdlKQorCisKK2NsYXNzIEJ1Y2tldChvYmpl
Y3QpOgorICAgICIiIkJ1Y2tldHMgaG9sZCBvdGhlciBidWNrZXRzIGluIGEgdHJlZSB0aGF0IHJl
ZmxlY3RzIHRoZSB0ZXN0IGZhbGxiYWNrCisgICAgICAgb3JkZXIuIiIiCisgICAgZGVmIF9faW5p
dF9fKHNlbGYsIG5hbWUpOgorICAgICAgICBzZWxmLl9uYW1lID0gbmFtZQorICAgICAgICBzZWxm
Ll9jaGlsZHJlbiA9IFtdCisgICAgICAgIHNlbGYuX3Jlc3VsdCA9IE5vbmUKKyAgICAgICAgc2Vs
Zi5faW1wbGljaXRfcmVzdWx0ID0gTm9uZQorICAgICAgICAjIEFnZ3JlZ2F0ZSBidWNrZXRzIGRv
bid0IGdldCByZXN1bHRzIGRpcmVjdGx5IGZyb20gYnVpbGRib3QuCisgICAgICAgIHNlbGYuX2lz
X2FnZ3JlZ2F0ZSA9IEZhbHNlCisKKyAgICBkZWYgX29uX2NoYW5nZWQoc2VsZik6CisgICAgICAg
IGZvciBjaGlsZCBpbiBzZWxmLl9jaGlsZHJlbjoKKyAgICAgICAgICAgIGNoaWxkLnNldF9pbXBs
aWNpdChzZWxmLmltcGxpY2l0X3Jlc3VsdCgpKQorCisgICAgZGVmIF9hbGxfZXF1YWwoc2VsZiwg
cmVzdWx0cyk6CisgICAgICAgIGlmIGxlbihyZXN1bHRzKSA9PSAwOgorICAgICAgICAgICAgcmV0
dXJuIFRydWUKKyAgICAgICAgY29udGVudHMgPSByZXN1bHRzWzBdLmNvbnRlbnRzKCkKKyAgICAg
ICAgcmV0dXJuIGFsbChtYXAobGFtYmRhIHg6IHguY29udGVudHMoKSA9PSBjb250ZW50cywgcmVz
dWx0cykpCisKKyAgICBkZWYgZHVtcChzZWxmLCBsb2dnZXI9SW5kZW50ZWRMb2dnZXIoKSk6Cisg
ICAgICAgIGxvZ2dlci5sb2coIkJ1Y2tldDolcyB7IiAlIHNlbGYuX25hbWUpCisgICAgICAgIGxv
Z2dlci5pbmRlbnQoKQorICAgICAgICBsb2dnZXIubG9nKCJSZXN1bHQgPSAlcyIgJSBzZWxmLl9y
ZXN1bHQpCisgICAgICAgIGxvZ2dlci5sb2coIkltcGxpY2l0IHJlc3VsdCA9ICVzIiAlIHNlbGYu
aW1wbGljaXRfcmVzdWx0KCkpCisgICAgICAgIGZvciBjaGlsZCBpbiBzZWxmLl9jaGlsZHJlbjoK
KyAgICAgICAgICAgIGNoaWxkLmR1bXAobG9nZ2VyKQorICAgICAgICBsb2dnZXIub3V0ZGVudCgp
CisgICAgICAgIGxvZ2dlci5sb2coIn0iKQorCisgICAgZGVmIG5hbWUoc2VsZik6CisgICAgICAg
IHJldHVybiBzZWxmLl9uYW1lCisKKyAgICBkZWYgbWFya19hc19hZ2dyZWdhdGUoc2VsZik6Cisg
ICAgICAgICIiIkJ1Y2tldHMgdGhhdCBkb24ndCBtYXAgdG8gYSBzcGVjaWZpYyBwbGF0Zm9ybSBh
cmUgJ2FnZ3JlZ2F0ZScKKyAgICAgICAgYnVja2V0cy4gIEFnZ3JlZ2F0ZSBidWNrZXRzIGNhbiBv
dmVyd3JpdGUgdGhlaXIgb3duIHJlc3VsdHMgd2l0aCB0aG9zZQorICAgICAgICBvZiB0aGVpciBj
aGlsZHJlbiBpZiB0aGVpciBjaGlsZHJlbiBoYXZlIHJlc3VsdHMgdGhhdCBhbGwgbWF0Y2ggYmVj
YXVzZQorICAgICAgICBhZ2dyZWdhdGVzIGFyZSBkZWZpbmVkIGVudGlyZWx5IGJ5IHRoZWlyIGNo
aWxkcmVuIGFuZCBub3QgdGhlaXIgb3duCisgICAgICAgIHRhcmdldGVkIHJlc3VsdHMuIiIiCisg
ICAgICAgIHNlbGYuX2lzX2FnZ3JlZ2F0ZSA9IFRydWUKKworICAgIGRlZiBhcHBlbmQoc2VsZiwg
Y2hpbGQpOgorICAgICAgICBzZWxmLl9jaGlsZHJlbi5hcHBlbmQoY2hpbGQpCisgICAgICAgIHNl
bGYuX29uX2NoYW5nZWQoKQorCisgICAgZGVmIGltcGxpY2l0X3Jlc3VsdChzZWxmKToKKyAgICAg
ICAgaWYgc2VsZi5fcmVzdWx0IGlzIG5vdCBOb25lOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYu
X3Jlc3VsdAorICAgICAgICByZXR1cm4gc2VsZi5faW1wbGljaXRfcmVzdWx0CisKKyAgICBkZWYg
c2V0X3Jlc3VsdChzZWxmLCByZXN1bHQpOgorICAgICAgICBpZiBzZWxmLl9yZXN1bHQgaXMgTm9u
ZToKKyAgICAgICAgICAgIHNlbGYuX3Jlc3VsdCA9IHJlc3VsdAorICAgICAgICAgICAgc2VsZi5f
b25fY2hhbmdlZCgpCisgICAgICAgIGVsaWYgcmVzdWx0LmlzX3JlYmFzZWxpbmVfb2Yoc2VsZi5f
cmVzdWx0KToKKyAgICAgICAgICAgIHNlbGYuX3Jlc3VsdCA9IHJlc3VsdAorICAgICAgICAgICAg
c2VsZi5fb25fY2hhbmdlZCgpCisgICAgICAgIGVsaWYgc2VsZi5fcmVzdWx0LmlzX3JlYmFzZWxp
bmVfb2YocmVzdWx0KToKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgZWxpZiBzZWxmLl9yZXN1
bHQgPT0gcmVzdWx0OgorICAgICAgICAgICAgcmFpc2UgRXhjZXB0aW9uKCJTYW1lIHJlc3VsdCBi
ZWluZyBpbnNlcnRlZCBhZ2FpbiBpbnRvIGJ1Y2tldCAlczogJXMgPC0gJXMiICUgKHNlbGYsIHNl
bGYuX3Jlc3VsdCwgcmVzdWx0KSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJhaXNlIEV4
Y2VwdGlvbigiQ29uZmxpY3RpbmcgcmVzdWx0cyAlcyBhbmQgJXMgYXNzaWduZWQgdG8gYnVja2V0
ICVzIiAlCisgICAgICAgICAgICAgICAgICAgIChzZWxmLl9yZXN1bHQsIHJlc3VsdCwgc2VsZi5f
bmFtZSkpCisKKyAgICBkZWYgY2xlYXJfcmVzdWx0KHNlbGYpOgorICAgICAgICBzZWxmLl9yZXN1
bHQgPSBOb25lCisgICAgICAgIHNlbGYuX29uX2NoYW5nZWQoKQorCisgICAgZGVmIHJlc3VsdChz
ZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX3Jlc3VsdAorCisgICAgZGVmIHNldF9pbXBsaWNp
dChzZWxmLCBpbXBsaWNpdF9yZXN1bHQpOgorICAgICAgICBzZWxmLl9pbXBsaWNpdF9yZXN1bHQg
PSBpbXBsaWNpdF9yZXN1bHQKKyAgICAgICAgc2VsZi5fb25fY2hhbmdlZCgpCisKKyAgICBkZWYg
X3NhbWVfaW1wbGljaXRfcmVzdWx0KHNlbGYsIG90aGVyKToKKyAgICAgICAgaWYgc2VsZi5pbXBs
aWNpdF9yZXN1bHQoKSBpcyBOb25lOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYuaW1wbGljaXRf
cmVzdWx0KCkgPT0gb3RoZXIuaW1wbGljaXRfcmVzdWx0KCkKKyAgICAgICAgcmV0dXJuIG90aGVy
LmltcGxpY2l0X3Jlc3VsdCgpLnNhbWVfY29udGVudChzZWxmLmltcGxpY2l0X3Jlc3VsdCgpKQor
CisgICAgZGVmIF9nZXRfY29tbW9uX2NoaWxkX3Jlc3VsdChzZWxmLCByZXN1bHRzKToKKyAgICAg
ICAgaWYgbGVuKHJlc3VsdHMpID09IDA6CisgICAgICAgICAgICByZXR1cm4gTm9uZQorCisgICAg
ICAgIGZpcnN0X3Jlc3VsdCA9IHJlc3VsdHNbMF0KKyAgICAgICAgcmVzdWx0X3RvX3JldHVybiA9
IGZpcnN0X3Jlc3VsdAorICAgICAgICBmb3IgcmVzdWx0IGluIHJlc3VsdHNbMTpdOgorICAgICAg
ICAgICAgaWYgbm90IHJlc3VsdC5zYW1lX2NvbnRlbnQoZmlyc3RfcmVzdWx0KToKKyAgICAgICAg
ICAgICAgICByZXR1cm4gTm9uZQorICAgICAgICAgICAgaWYgcmVzdWx0LmlzX2FjdHVhbCgpOgor
ICAgICAgICAgICAgICAgIHJlc3VsdF90b19yZXR1cm4gPSByZXN1bHQgICAjIFByZWZlciB0byBy
ZXR1cm4gYWN0dWFsIHJlc3VsdHMuCisgICAgICAgIHJldHVybiByZXN1bHRfdG9fcmV0dXJuCisK
KyAgICBkZWYgX2luaGVyaXQoc2VsZiwgcmVzdWx0KToKKyAgICAgICAgZm9yIGNoaWxkIGluIHNl
bGYuX2NoaWxkcmVuOgorICAgICAgICAgICAgY2hpbGQuY2xlYXJfcmVzdWx0KCkKKyAgICAgICAg
c2VsZi5fcmVzdWx0ID0gcmVzdWx0LnJldGFyZ2V0KHNlbGYuX25hbWUpCisgICAgICAgIHNlbGYu
X29uX2NoYW5nZWQoKQorCisgICAgZGVmIF9hdHRlbXB0X3RvX2luaGVyaXQoc2VsZik6CisgICAg
ICAgICIiIlRyeSB0byBpbmhlcml0IGEgcmVzdWx0IGZyb20gY2hpbGRyZW4uIFRoaXMgd2lsbCBv
bmx5IGhhcHBlbiBpZiBhbGwKKyAgICAgICAgICAgICAgY2hpbGRyZW4gaGF2ZSB0aGUgc2FtZSBy
ZXN1bHQiIiIKKyAgICAgICAgY2hpbGRfcmVzdWx0cyA9IG1hcChsYW1iZGEgYzogYy5pbXBsaWNp
dF9yZXN1bHQoKSwgc2VsZi5fY2hpbGRyZW4pCisgICAgICAgIGNoaWxkX3Jlc3VsdHMgPSBmaWx0
ZXIobGFtYmRhIHI6IHIgaXMgbm90IE5vbmUsIGNoaWxkX3Jlc3VsdHMpCisgICAgICAgIHRvX2lu
aGVyaXQgPSBzZWxmLl9nZXRfY29tbW9uX2NoaWxkX3Jlc3VsdChjaGlsZF9yZXN1bHRzKQorCisg
ICAgICAgIGlmIHRvX2luaGVyaXQgaXMgTm9uZToKKyAgICAgICAgICAgIHJldHVybiBGYWxzZQor
CisgICAgICAgICMgV2UgaGF2ZSBhIHJlc3VsdCB3ZSBjb3VsZCBwb3RlbnRpYWxseSBpbmhlcml0
Li4uCisgICAgICAgIGlmIHNlbGYuaW1wbGljaXRfcmVzdWx0KCkgaXMgTm9uZToKKyAgICAgICAg
ICAgIHNlbGYuX2luaGVyaXQodG9faW5oZXJpdCkKKyAgICAgICAgZWxpZiB0b19pbmhlcml0Lmlz
X25ld2VyX3RoYW4oc2VsZi5pbXBsaWNpdF9yZXN1bHQoKSkgYW5kIHNlbGYuaXNfYWdncmVnYXRl
KCk6CisgICAgICAgICAgICBzZWxmLl9pbmhlcml0KHRvX2luaGVyaXQpCisgICAgICAgIGVsc2U6
CisgICAgICAgICAgICByZXR1cm4gRmFsc2UKKyAgICAgICAgcmV0dXJuIFRydWUKKworICAgIGRl
ZiBpc19hZ2dyZWdhdGUoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLl9pc19hZ2dyZWdhdGUK
KworICAgIGRlZiBjb2xsYXBzZShzZWxmKToKKyAgICAgICAgIiIiRGVsZXRlcyByZWR1bmRhbnQg
cmVzdWx0cyBpbiB0aGUgdHJlZSBzdGFydGluZyBhdCB0aGlzIGJ1Y2tldCIiIgorICAgICAgICBm
b3IgY2hpbGQgaW4gc2VsZi5fY2hpbGRyZW46CisgICAgICAgICAgICBjaGlsZC5jb2xsYXBzZSgp
CisKKyAgICAgICAgaWYgc2VsZi5fYXR0ZW1wdF90b19pbmhlcml0KCk6CisgICAgICAgICAgICBy
ZXR1cm4KKworICAgICAgICBmb3IgY2hpbGQgaW4gc2VsZi5fY2hpbGRyZW46CisgICAgICAgICAg
ICBpZiBzZWxmLl9zYW1lX2ltcGxpY2l0X3Jlc3VsdChjaGlsZCk6CisgICAgICAgICAgICAgICAg
Y2hpbGQuY2xlYXJfcmVzdWx0KCkKKworICAgIGRlZiBpc19lbXB0eShzZWxmKToKKyAgICAgICAg
cmV0dXJuIHNlbGYuX3Jlc3VsdCBpcyBOb25lCisKKyAgICBkZWYgcmVzdWx0cyhzZWxmLCByKToK
KyAgICAgICAgaWYgbm90IHNlbGYuaXNfZW1wdHkoKToKKyAgICAgICAgICAgIHIuYXBwZW5kKHNl
bGYuX3Jlc3VsdCkKKyAgICAgICAgZm9yIGMgaW4gc2VsZi5fY2hpbGRyZW46CisgICAgICAgICAg
ICBjLnJlc3VsdHMocikKKworCitjbGFzcyBCdWNrZXRUcmVlKG9iamVjdCk6CisgICAgIiIiSGVs
cGVyIGNsYXNzIGZvciBjb25zdHJ1Y3RpbmcgYW5kIGluZGV4aW5nIGEgaGllcmFyY2h5IG9mIEJ1
Y2tldHMuIiIiCisgICAgZGVmIF9faW5pdF9fKHNlbGYpOgorICAgICAgICBzZWxmLl9idWNrZXRz
ID0ge30KKyAgICAgICAgc2VsZi5fcm9vdF9idWNrZXQgPSBzZWxmLl9nZXRfb3JfY3JlYXRlX2J1
Y2tldChOb25lKQorCisgICAgZGVmIF9nZXRfb3JfY3JlYXRlX2J1Y2tldChzZWxmLCBidWNrZXRf
bmFtZSk6CisgICAgICAgIGlmIGJ1Y2tldF9uYW1lIG5vdCBpbiBzZWxmLl9idWNrZXRzOgorICAg
ICAgICAgICAgc2VsZi5fYnVja2V0c1tidWNrZXRfbmFtZV0gPSBCdWNrZXQoYnVja2V0X25hbWUp
CisgICAgICAgIHJldHVybiBzZWxmLl9idWNrZXRzW2J1Y2tldF9uYW1lXQorCisgICAgZGVmIG1h
a2VfYnVja2V0KHNlbGYsIGJ1Y2tldF9uYW1lLCAqYXJncyk6CisgICAgICAgIGIgPSBzZWxmLl9n
ZXRfb3JfY3JlYXRlX2J1Y2tldChidWNrZXRfbmFtZSkKKworICAgICAgICBmb3IgYXJnIGluIGFy
Z3M6CisgICAgICAgICAgICBiLmFwcGVuZChhcmcpCisgICAgICAgIHJldHVybiBiCisKKyAgICBk
ZWYgYihzZWxmLCBidWNrZXRfbmFtZSwgKmFyZ3MpOgorICAgICAgICByZXR1cm4gc2VsZi5tYWtl
X2J1Y2tldChidWNrZXRfbmFtZSwgKmFyZ3MpCisKKyAgICBkZWYgaW5zZXJ0X3Jlc3VsdChzZWxm
LCByZXN1bHQpOgorICAgICAgICBpZiByZXN1bHQucGxhdGZvcm0oKSBub3QgaW4gc2VsZi5fYnVj
a2V0cy5rZXlzKCk6CisgICAgICAgICAgICByYWlzZSBFeGNlcHRpb24oIkNvdWxkbid0IGZpbmQg
YnVja2V0IGZvciBwbGF0Zm9ybSAlcyIgJSByZXN1bHQucGxhdGZvcm0oKSkKKyAgICAgICAgc2Vs
Zi5fYnVja2V0c1tyZXN1bHQucGxhdGZvcm0oKV0uc2V0X3Jlc3VsdChyZXN1bHQpCisKKyAgICBk
ZWYgcmVzdWx0cyhzZWxmKToKKyAgICAgICAgciA9IFtdCisgICAgICAgIHNlbGYuX3Jvb3RfYnVj
a2V0LnJlc3VsdHMocikKKyAgICAgICAgcmV0dXJuIHIKKworICAgIGRlZiBjb2xsYXBzZShzZWxm
KToKKyAgICAgICAgc2VsZi5fcm9vdF9idWNrZXQuY29sbGFwc2UoKQorCisgICAgZGVmIGdldF9i
dWNrZXQoc2VsZiwgYnVja2V0X25hbWUpOgorICAgICAgICByZXR1cm4gc2VsZi5fYnVja2V0c1ti
dWNrZXRfbmFtZV0KKworICAgIGRlZiByb290X2J1Y2tldChzZWxmKToKKyAgICAgICAgcmV0dXJu
IHNlbGYuZ2V0X2J1Y2tldChOb25lKQpkaWZmIC0tZ2l0IGEvV2ViS2l0VG9vbHMvU2NyaXB0cy93
ZWJraXRweS9sYXlvdXRfdGVzdHMvcmViYXNlbGluZS9idWNrZXRfdW5pdHRlc3QucHkgYi9XZWJL
aXRUb29scy9TY3JpcHRzL3dlYmtpdHB5L2xheW91dF90ZXN0cy9yZWJhc2VsaW5lL2J1Y2tldF91
bml0dGVzdC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwLi4zYTljMTlkMzNmYzc3MTI3NTlmOGY4MTkwOTgxYzkxYjAz
NzkzOGU3Ci0tLSAvZGV2L251bGwKKysrIGIvV2ViS2l0VG9vbHMvU2NyaXB0cy93ZWJraXRweS9s
YXlvdXRfdGVzdHMvcmViYXNlbGluZS9idWNrZXRfdW5pdHRlc3QucHkKQEAgLTAsMCArMSwyNjYg
QEAKKyMhL3Vzci9iaW4vZW52IHB5dGhvbgorIyBDb3B5cmlnaHQgKEMpIDIwMTAgR29vZ2xlIElu
Yy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyMKKyMgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBz
b3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisjIG1vZGlmaWNhdGlvbiwg
YXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworIyBh
cmUgbWV0OgorIworIyAxLiAgUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0
YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyMgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRp
dGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyMgMi4gIFJlZGlzdHJpYnV0aW9u
cyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisjICAg
ICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2Ns
YWltZXIgaW4gdGhlCisjICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMg
cHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorIworIyBUSElTIFNPRlRXQVJFIElTIFBS
T1ZJREVEIEJZIEFQUExFIEFORCBJVFMgQ09OVFJJQlVUT1JTICJBUyBJUyIgQU5EIEFOWQorIyBF
WFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQg
VE8sIFRIRSBJTVBMSUVECisjIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRO
RVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKKyMgRElTQ0xBSU1FRC4gSU4gTk8gRVZF
TlQgU0hBTEwgQVBQTEUgT1IgSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWQorIyBE
SVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNF
UVVFTlRJQUwgREFNQUdFUworIyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NV
UkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisjIExPU1MgT0YgVVNFLCBE
QVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VE
IEFORAorIyBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwg
U1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorIyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RI
RVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKyMgVEhJUyBTT0ZU
V0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4K
KworZnJvbSBidWNrZXQgaW1wb3J0IEJ1Y2tldCwgQnVja2V0VHJlZQoraW1wb3J0IHVuaXR0ZXN0
Citmcm9tIHJlc3VsdF91bml0dGVzdCBpbXBvcnQgRmFrZVJlc3VsdAorCisKK2NsYXNzIEJ1Y2tl
dFRlc3QodW5pdHRlc3QuVGVzdENhc2UpOgorICAgIGRlZiBzZXRVcChzZWxmKToKKyAgICAgICAg
c2VsZi5fbWFjID0gQnVja2V0KCdtYWMnKQorICAgICAgICBzZWxmLl9tYWNfbGVvcGFyZCA9IEJ1
Y2tldCgnbWFjX2xlb3BhcmQnKQorICAgICAgICBzZWxmLl9saW51eCA9IEJ1Y2tldCgnbGludXgn
KQorICAgICAgICBzZWxmLl9ub25lID0gQnVja2V0KE5vbmUpCisKKyAgICBkZWYgdGVzdENoaWxk
QnVja2V0SW5oZXJpdHNSZXN1bHRPZlBhcmVudEFzSW1wbGljaXRSZXN1bHQoc2VsZik6CisgICAg
ICAgIHNlbGYuX21hYy5zZXRfcmVzdWx0KEZha2VSZXN1bHQoJ21hYycsICd0ZXh0JywgJ2FiYzEy
MycpKQorICAgICAgICBzZWxmLl9tYWMuYXBwZW5kKHNlbGYuX21hY19sZW9wYXJkKQorICAgICAg
ICBzZWxmLmFzc2VydEVxdWFscygnYWJjMTIzJywgc2VsZi5fbWFjX2xlb3BhcmQuaW1wbGljaXRf
cmVzdWx0KCkuY29udGVudHMoKSkKKworICAgIGRlZiB0ZXN0Q29sbGFwc2VXb3Jrc1doZW5DaGls
ZEhhc0VxdWFsUmVzdWx0cyhzZWxmKToKKyAgICAgICAgc2VsZi5fbWFjLnNldF9yZXN1bHQoRmFr
ZVJlc3VsdCgnbWFjJywgJ3RleHQnLCAnYWJjMTIzJykpCisgICAgICAgIHNlbGYuX21hY19sZW9w
YXJkLnNldF9yZXN1bHQoRmFrZVJlc3VsdCgnbWFjJywgJ3RleHQnLCAnYWJjMTIzJykpCisgICAg
ICAgIHNlbGYuX21hYy5hcHBlbmQoc2VsZi5fbWFjX2xlb3BhcmQpCisKKyAgICAgICAgc2VsZi5f
bWFjLmNvbGxhcHNlKCkKKworICAgICAgICBzZWxmLmFzc2VydFRydWUoc2VsZi5fbWFjX2xlb3Bh
cmQuaXNfZW1wdHkoKSkKKworICAgIGRlZiB0ZXN0Q29sbGFwc2VzQ2hpbGRXaXRoSW1wbGljaXRS
ZXN1bHRGcm9tUGFyZW50KHNlbGYpOgorICAgICAgICBzZWxmLl9tYWMuc2V0X3Jlc3VsdChGYWtl
UmVzdWx0KCdtYWMnLCAndGV4dCcsICdhYmMxMjMnKSkKKyAgICAgICAgc2VsZi5fbWFjLmFwcGVu
ZChzZWxmLl9tYWNfbGVvcGFyZCkKKworICAgICAgICBzZWxmLl9tYWMuY29sbGFwc2UoKQorCisg
ICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzZWxmLl9tYWNfbGVvcGFyZC5pc19lbXB0eSgpKQorCisg
ICAgZGVmIHRlc3RDb2xsYXBzZXNDaGlsZFdpdGhJbXBsaWNpdFJlc3VsdEFuZEV4cGxpY2l0U2li
bGluZyhzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHNlbGYuX21hYy5pc19lbXB0eSgp
KQorICAgICAgICBzZWxmLl9tYWMuc2V0X3Jlc3VsdChGYWtlUmVzdWx0KCdtYWMnLCAndGV4dCcs
ICdhYmMxMjMnKSkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShzZWxmLl9tYWMuaXNfZW1wdHko
KSkKKyAgICAgICAgc2VsZi5fbWFjX2xlb3BhcmQuc2V0X3Jlc3VsdChGYWtlUmVzdWx0KCdtYWMn
LCAndGV4dCcsICdhYmMxMjMnKSkKKworICAgICAgICBzZWxmLmFzc2VydEZhbHNlKHNlbGYuX21h
Yy5pc19lbXB0eSgpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscygnYWJjMTIzJywgc2VsZi5f
bWFjLmltcGxpY2l0X3Jlc3VsdCgpLmNvbnRlbnRzKCkpCisKKyAgICAgICAgc2VsZi5fbWFjLmFw
cGVuZChzZWxmLl9tYWNfbGVvcGFyZCkKKyAgICAgICAgc2VsZi5fbWFjLmFwcGVuZChzZWxmLl9s
aW51eCkKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFscygnYWJjMTIzJywgc2VsZi5fbWFjX2xl
b3BhcmQuaW1wbGljaXRfcmVzdWx0KCkuY29udGVudHMoKSkKKworICAgICAgICBzZWxmLl9tYWMu
Y29sbGFwc2UoKQorCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzZWxmLl9saW51eC5pc19lbXB0
eSgpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoc2VsZi5fbWFjX2xlb3BhcmQuaXNfZW1wdHko
KSkKKworICAgIGRlZiB0ZXN0Q2xlYXJzT25seUNoaWxkcmVuVGhhdEhhdmVUaGVTYW1lUmVzdWx0
cyhzZWxmKToKKyAgICAgICAgc2VsZi5fbWFjLnNldF9yZXN1bHQoRmFrZVJlc3VsdCgnbWFjJywg
J3RleHQnLCAnYWJjMTIzJykpCisgICAgICAgIHNlbGYuX21hY19sZW9wYXJkLnNldF9yZXN1bHQo
RmFrZVJlc3VsdCgnbWFjLWxlb3BhcmQnLCAndGV4dCcsICdhYmMxMjMnKSkKKyAgICAgICAgc2Vs
Zi5fbGludXguc2V0X3Jlc3VsdChGYWtlUmVzdWx0KCdsaW51eCcsICd0ZXh0JywgJ2RlZjQ1Nicp
KQorCisgICAgICAgIHNlbGYuX21hYy5hcHBlbmQoc2VsZi5fbWFjX2xlb3BhcmQpCisgICAgICAg
IHNlbGYuX21hYy5hcHBlbmQoc2VsZi5fbGludXgpCisKKyAgICAgICAgc2VsZi5fbWFjLmNvbGxh
cHNlKCkKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFscygnYWJjMTIzJywgc2VsZi5fbWFjLmlt
cGxpY2l0X3Jlc3VsdCgpLmNvbnRlbnRzKCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKCdk
ZWY0NTYnLCBzZWxmLl9saW51eC5pbXBsaWNpdF9yZXN1bHQoKS5jb250ZW50cygpKQorICAgICAg
ICBzZWxmLmFzc2VydFRydWUoc2VsZi5fbWFjX2xlb3BhcmQuaXNfZW1wdHkoKSkKKworICAgIGRl
ZiB0ZXN0Q29sbGFwc2VXb3Jrc0ZvckRlc2NlbmRlbnRzRGVlcGVyVGhhdERpcmVjdENoaWxkcmVu
KHNlbGYpOgorICAgICAgICBzZWxmLl9tYWMuc2V0X3Jlc3VsdChGYWtlUmVzdWx0KCdtYWMnLCAn
dGV4dCcsICdhYmMxMjMnKSkKKyAgICAgICAgc2VsZi5fbGludXguc2V0X3Jlc3VsdChGYWtlUmVz
dWx0KCdsaW51eCcsICd0ZXh0JywgJ2FiYzEyMycpKQorCisgICAgICAgIHNlbGYuX21hYy5hcHBl
bmQoc2VsZi5fbWFjX2xlb3BhcmQpCisgICAgICAgIHNlbGYuX21hY19sZW9wYXJkLmFwcGVuZChz
ZWxmLl9saW51eCkKKworICAgICAgICBzZWxmLl9tYWMuY29sbGFwc2UoKQorCisgICAgICAgIHNl
bGYuYXNzZXJ0VHJ1ZShzZWxmLl9saW51eC5pc19lbXB0eSgpKQorCisgICAgZGVmIHRlc3RUaGF0
Q29sbGFwc2luZ01haW50YWluc0NvcnJlY3RQbGF0Zm9ybShzZWxmKToKKyAgICAgICAgc2VsZi5f
bWFjLmFwcGVuZChzZWxmLl9tYWNfbGVvcGFyZCkKKyAgICAgICAgc2VsZi5fbm9uZS5hcHBlbmQo
c2VsZi5fbWFjKQorCisgICAgICAgIHNlbGYuX21hY19sZW9wYXJkLnNldF9yZXN1bHQoRmFrZVJl
c3VsdCgnbWFjLWxlb3BhcmQnLCAndGV4dCcsICdhYmMxMjMnKSkKKyAgICAgICAgc2VsZi5fbm9u
ZS5zZXRfcmVzdWx0KEZha2VSZXN1bHQoTm9uZSwgJ3RleHQnLCAnZGVmNDU2JykpCisKKyAgICAg
ICAgc2VsZi5fbm9uZS5jb2xsYXBzZSgpCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoTm9u
ZSwgc2VsZi5fbWFjLmltcGxpY2l0X3Jlc3VsdCgpLnBsYXRmb3JtKCkpCisgICAgICAgIHNlbGYu
YXNzZXJ0RXF1YWxzKCdtYWMtbGVvcGFyZCcsIHNlbGYuX21hY19sZW9wYXJkLmltcGxpY2l0X3Jl
c3VsdCgpLnBsYXRmb3JtKCkpCisKKyAgICBkZWYgdGVzdFBhcmVudFdpdGhOb1Jlc3VsdFdpbGxJ
bmhlcml0RnJvbUNoaWxkcmVuV2l0aFNhbWVSZXN1bHQoc2VsZik6CisgICAgICAgIHNlbGYuX21h
Yy5zZXRfcmVzdWx0KEZha2VSZXN1bHQoJ21hYycsICd0ZXh0JywgJ2FiYzEyMycpKQorICAgICAg
ICBzZWxmLl9saW51eC5zZXRfcmVzdWx0KEZha2VSZXN1bHQoJ2xpbnV4JywgJ3RleHQnLCAnYWJj
MTIzJykpCisKKyAgICAgICAgc2VsZi5fbm9uZS5hcHBlbmQoc2VsZi5fbWFjKQorICAgICAgICBz
ZWxmLl9ub25lLmFwcGVuZChzZWxmLl9saW51eCkKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFs
cyhOb25lLCBzZWxmLl9ub25lLmltcGxpY2l0X3Jlc3VsdCgpKQorCisgICAgICAgIHNlbGYuX25v
bmUuY29sbGFwc2UoKQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKCdhYmMxMjMnLCBzZWxm
Ll9ub25lLmltcGxpY2l0X3Jlc3VsdCgpLmNvbnRlbnRzKCkpCisKKyIiIgorICAgICAgICBUT0RP
IE1ha2UgdGhpcyBpbnRvIHRlc3RzLgorCisgICAgICAgIENoaWxkcmVuIGFsbCBoYXZlIHRoZSBz
YW1lIGV4cGxpY2l0IHJlc3VsdCBhcyB0aGUgcGFyZW50LgorCisgICAgICAgIEEgQSBBICAgICAg
ICBPIE8gTworICAgICAgICAgXHwvICAgIC0+ICAgIFx8LworICAgICAgICAgIEEgICAgICAgICAg
ICBBCisKKworICAgICAgICBDaGlsZHJlbiBhbGwgaGF2ZSB0aGUgc2FtZSByZXN1bHQsIGJ1dCB0
aGUgcGFyZW50IGhhcyBub25lLgorCisgICAgICAgIEEgQSBBICAgICAgICBPIE8gTworICAgICAg
ICAgXHwvICAgIC0+ICAgIFx8LworICAgICAgICAgIE8gICAgICAgICAgICBBCisKKworICAgICAg
ICBPbmUgb2YgdGhlIGNoaWxkcmVuIGhhcyB0aGUgc2FtZSByZXN1bHQgYXMgdGhlIHBhcmVudC4K
KworICAgICAgICBBIEIgQyAgICAgICAgTyBCIEMKKyAgICAgICAgIFx8LyAgICAtPiAgICBcfC8K
KyAgICAgICAgICBBICAgICAgICAgICAgQQorCisgICAgICAgIERlc2NlbmRlbnRzIGFsbCBoYXZl
IHNhbWUgZXhwbGljaXQgcmVzdWx0IGFzIHRoZSBhbmNlc3Rvci4KKworICAgICAgICBBIEEgQSAg
ICAgICAgTyBPIE8KKyAgICAgICAgIFx8LyAgICAtPiAgICBcfC8KKyAgICAgICAgICBPICAgICAg
ICAgICAgTworICAgICAgICAgIHwgICAgICAgICAgICB8CisgICAgICAgICAgQSAgICAgICAgICAg
IEEKKworICAgICAgICBXaGVyZSBBIGlzIGEgYnVja2V0IHdpdGggYSB0ZXN0IHJlc3VsdCwgYW5k
IE8gaXMgYW4gZW1wdHkgYnVja2V0LgorIiIiCisKKworY2xhc3MgQnVja2V0VHJlZVRlc3QodW5p
dHRlc3QuVGVzdENhc2UpOgorICAgIGRlZiB0ZXN0TmV3RXhwZWN0YXRpb25zT3ZlcnJpZGVPbGRP
bmVzKHNlbGYpOgorICAgICAgICBiID0gQnVja2V0VHJlZSgpCisgICAgICAgIHJvb3QgPSBiLmIo
Tm9uZSwKKyAgICAgICAgICAgIGIuYignbWFjJyksCisgICAgICAgICAgICBiLmIoJ2xpbnV4Jyks
CisgICAgICAgICAgICBiLmIoJ3dpbicpKQorCisgICAgICAgIGIuaW5zZXJ0X3Jlc3VsdChGYWtl
UmVzdWx0KE5vbmUsICd0ZXh0JywgJ2FiYzEyMycsIFRydWUpKQorICAgICAgICBiLmluc2VydF9y
ZXN1bHQoRmFrZVJlc3VsdChOb25lLCAndGV4dCcsICdkZWY0NTYnKSkKKworICAgICAgICBiLmNv
bGxhcHNlKCkKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKDEsIGxlbihiLnJlc3VsdHMoKSkp
CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoJ2RlZjQ1NicsIGIucmVzdWx0cygpWzBdLmNvbnRl
bnRzKCkpCisKKyAgICBkZWYgdGVzdFJlYmFzZWxpbmluZ1N0aWxsV29ya3NJZk5ld1Jlc3VsdHNB
cmVJbnNlcnRlZEZpcnN0KHNlbGYpOgorICAgICAgICBiID0gQnVja2V0VHJlZSgpCisgICAgICAg
IHJvb3QgPSBiLmIoTm9uZSwKKyAgICAgICAgICAgIGIuYignbWFjJyksCisgICAgICAgICAgICBi
LmIoJ2xpbnV4JyksCisgICAgICAgICAgICBiLmIoJ3dpbicpKQorCisgICAgICAgIGIuaW5zZXJ0
X3Jlc3VsdChGYWtlUmVzdWx0KE5vbmUsICd0ZXh0JywgJ2RlZjQ1NicpKQorICAgICAgICBiLmlu
c2VydF9yZXN1bHQoRmFrZVJlc3VsdChOb25lLCAndGV4dCcsICdhYmMxMjMnLCBUcnVlKSkKKwor
ICAgICAgICBiLmNvbGxhcHNlKCkKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKDEsIGxlbihi
LnJlc3VsdHMoKSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoJ2RlZjQ1NicsIGIucmVzdWx0
cygpWzBdLmNvbnRlbnRzKCkpCisKKyAgICBkZWYgdGVzdEtpZHNIYXZpbmdTYW1lUmViYXNlbGlu
ZUNhdXNlc092ZXJyaWRlT25QYXJlbnQoc2VsZik6CisgICAgICAgIGIgPSBCdWNrZXRUcmVlKCkK
KyAgICAgICAgcm9vdCA9IGIuYihOb25lLAorICAgICAgICAgICAgYi5iKCdtYWMnKSwKKyAgICAg
ICAgICAgIGIuYignd2luJykpCisgICAgICAgIGIuZ2V0X2J1Y2tldChOb25lKS5tYXJrX2FzX2Fn
Z3JlZ2F0ZSgpCisKKyAgICAgICAgYi5pbnNlcnRfcmVzdWx0KEZha2VSZXN1bHQoTm9uZSwgJ3Rl
eHQnLCAnb2xkIHJlc3VsdCcsIFRydWUpKQorICAgICAgICBiLmluc2VydF9yZXN1bHQoRmFrZVJl
c3VsdCgnbWFjJywgJ3RleHQnLCAnbmV3IHJlc3VsdCcpKQorICAgICAgICBiLmluc2VydF9yZXN1
bHQoRmFrZVJlc3VsdCgnd2luJywgJ3RleHQnLCAnbmV3IHJlc3VsdCcpKQorCisgICAgICAgIGIu
Y29sbGFwc2UoKQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoMSwgbGVuKGIucmVzdWx0cygp
KSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChOb25lLCBiLnJlc3VsdHMoKVswXS5wbGF0Zm9y
bSgpKQorCisgICAgZGVmIHRlc3RXZURvbnRJbmhlcml0RnJvbUNoaWxkcmVuSWZXZUFyZU5vdEFu
QWdncmVnYXRlQnVja2V0KHNlbGYpOgorICAgICAgICBiID0gQnVja2V0VHJlZSgpCisgICAgICAg
IHJvb3QgPSBiLmIoTm9uZSwKKyAgICAgICAgICAgIGIuYignbWFjJyksCisgICAgICAgICAgICBi
LmIoJ3dpbicpKQorCisgICAgICAgIGIuaW5zZXJ0X3Jlc3VsdChGYWtlUmVzdWx0KE5vbmUsICd0
ZXh0JywgJ29sZCByZXN1bHQnLCBUcnVlKSkKKyAgICAgICAgYi5pbnNlcnRfcmVzdWx0KEZha2VS
ZXN1bHQoJ21hYycsICd0ZXh0JywgJ25ldyByZXN1bHQnKSkKKyAgICAgICAgYi5pbnNlcnRfcmVz
dWx0KEZha2VSZXN1bHQoJ3dpbicsICd0ZXh0JywgJ25ldyByZXN1bHQnKSkKKworICAgICAgICBi
LmNvbGxhcHNlKCkKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKDMsIGxlbihiLnJlc3VsdHMo
KSkpCisKKyAgICBkZWYgdGVzdE11bHRpUGhhc2VkQ29sbGFwc2VXb3JrcyhzZWxmKToKKyAgICAg
ICAgYiA9IEJ1Y2tldFRyZWUoKQorICAgICAgICByb290ID0gYi5iKE5vbmUsCisgICAgICAgICAg
ICBiLmIoJ21hYycsCisgICAgICAgICAgICAgICAgYi5iKCdtYWMtbGVvcGFyZCcpKSkKKworICAg
ICAgICBiLmdldF9idWNrZXQoTm9uZSkubWFya19hc19hZ2dyZWdhdGUoKQorCisgICAgICAgIGIu
aW5zZXJ0X3Jlc3VsdChGYWtlUmVzdWx0KE5vbmUsICd0ZXh0JywgJ29sZCByZXN1bHQnLCBUcnVl
KSkKKyAgICAgICAgYi5pbnNlcnRfcmVzdWx0KEZha2VSZXN1bHQoJ21hYycsICd0ZXh0JywgJ25l
dyByZXN1bHQnKSkKKyAgICAgICAgYi5pbnNlcnRfcmVzdWx0KEZha2VSZXN1bHQoJ21hYy1sZW9w
YXJkJywgJ3RleHQnLCAnbmV3IHJlc3VsdCcpKQorCisgICAgICAgIGIuY29sbGFwc2UoKQorCisg
ICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoMSwgbGVuKGIucmVzdWx0cygpKSkKKworICAgIGRlZiB0
ZXN0UGxhaW5PbGREZWR1cGVPbkxheW91dFRlc3RzV29ya3Moc2VsZik6CisgICAgICAgIGIgPSBC
dWNrZXRUcmVlKCkKKyAgICAgICAgcm9vdCA9IGIuYihOb25lLAorICAgICAgICAgICAgYi5iKCdt
YWMnLAorICAgICAgICAgICAgICAgIGIuYignbWFjLWxlb3BhcmQnLAorICAgICAgICAgICAgICAg
ICAgICBiLmIoJ21hYy1zbm93bGVvcGFyZCcpKSksCisgICAgICAgICAgICBiLmIoJ2xpbnV4JywK
KyAgICAgICAgICAgICAgICBiLmIoJ2Nocm9taXVtLWxpbnV4JykpKQorCisgICAgICAgIGIuaW5z
ZXJ0X3Jlc3VsdChGYWtlUmVzdWx0KE5vbmUsICd0ZXh0JywgJ3Jlc3VsdCcsIFRydWUpKQorICAg
ICAgICBiLmluc2VydF9yZXN1bHQoRmFrZVJlc3VsdCgnY2hyb21pdW0tbGludXgnLCAndGV4dCcs
ICdyZXN1bHQnLCBUcnVlKSkKKworICAgICAgICBiLmNvbGxhcHNlKCkKKworICAgICAgICBzZWxm
LmFzc2VydEVxdWFscygxLCBsZW4oYi5yZXN1bHRzKCkpKQorICAgICAgICBzZWxmLmFzc2VydEVx
dWFscyhOb25lLCBiLnJlc3VsdHMoKVswXS5wbGF0Zm9ybSgpKQorCisgICAgZGVmIHRlc3RDb2xs
YXBzZU9uQnVja2V0c1dpdGhOb1Jlc3VsdERvZXNudENyYXNoKHNlbGYpOgorICAgICAgICBiID0g
QnVja2V0VHJlZSgpCisgICAgICAgIHJvb3QgPSBiLmIoTm9uZSwKKyAgICAgICAgICAgIGIuYign
bWFjJywKKyAgICAgICAgICAgICAgICBiLmIoJ21hYy1sZW9wYXJkJykpKQorCisgICAgICAgIGIu
Y29sbGFwc2UoKQorCitpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgorICAgIHVuaXR0ZXN0Lm1h
aW4oKQpkaWZmIC0tZ2l0IGEvV2ViS2l0VG9vbHMvU2NyaXB0cy93ZWJraXRweS9sYXlvdXRfdGVz
dHMvcmViYXNlbGluZS9idWlsZGVyLnB5IGIvV2ViS2l0VG9vbHMvU2NyaXB0cy93ZWJraXRweS9s
YXlvdXRfdGVzdHMvcmViYXNlbGluZS9idWlsZGVyLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0Cmlu
ZGV4IDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAuLmZjN2Q3YTQ1M2Fh
Yjk2YzVhNzcyYjVlNzgwOTk5ZDBiNDYxODRiMWIKLS0tIC9kZXYvbnVsbAorKysgYi9XZWJLaXRU
b29scy9TY3JpcHRzL3dlYmtpdHB5L2xheW91dF90ZXN0cy9yZWJhc2VsaW5lL2J1aWxkZXIucHkK
QEAgLTAsMCArMSwzMDAgQEAKKyMhL3Vzci9iaW4vZW52IHB5dGhvbgorIyBDb3B5cmlnaHQgKEMp
IDIwMTAgR29vZ2xlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyMKKyMgUmVkaXN0cmlidXRp
b24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Cisj
IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcg
Y29uZGl0aW9ucworIyBhcmUgbWV0OgorIworIyAxLiAgUmVkaXN0cmlidXRpb25zIG9mIHNvdXJj
ZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyMgICAgIG5vdGljZSwgdGhp
cyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyMgMi4g
IFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUg
Y29weXJpZ2h0CisjICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUg
Zm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisjICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBv
dGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorIworIyBUSElT
IFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIEFORCBJVFMgQ09OVFJJQlVUT1JTICJBUyBJ
UyIgQU5EIEFOWQorIyBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBC
VVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVECisjIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRB
QklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKKyMgRElTQ0xB
SU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgT1IgSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFC
TEUgRk9SIEFOWQorIyBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVN
UExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUworIyAoSU5DTFVESU5HLCBCVVQgTk9UIExJ
TUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7Cisj
IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04p
IEhPV0VWRVIgQ0FVU0VEIEFORAorIyBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhF
UiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorIyAoSU5DTFVESU5HIE5F
R0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0Ug
T0YKKyMgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBP
RiBTVUNIIERBTUFHRS4KKworaW1wb3J0IG9zCitpbXBvcnQgcmUKK2ltcG9ydCByZXN1bHQKK2lt
cG9ydCBzaHV0aWwKK2ltcG9ydCB0ZW1wZmlsZQoraW1wb3J0IHVybGxpYgoraW1wb3J0IHppcGZp
bGUKKworCitjbGFzcyBSZW1vdGVaaXAob2JqZWN0KToKKyAgICAiIiJBIHppcCBmaWxlIHRoYXQg
cmVzaWRlcyBhdCBhIFVSTCAobG9jYWwgb3IgcmVtb3RlKSIiIgorICAgIGRlZiBfX2luaXRfXyhz
ZWxmLCB6aXBfdXJsKToKKyAgICAgICAgc2VsZi5femlwX3VybCA9IHppcF91cmwgICAgICAgICAg
IyBXaGVyZSB0aGUgemlwZmlsZSBpcyBzdG9yZWQKKyAgICAgICAgc2VsZi5femlwX2ZpbGUgPSBO
b25lCisKKyAgICBkZWYgX2xvYWQoc2VsZik6CisgICAgICAgIGlmIHNlbGYuX3ppcF9maWxlIGlz
IE5vbmU6CisgICAgICAgICAgICBzZWxmLl96aXBfZmlsZSA9IHppcGZpbGUuWmlwRmlsZSh1cmxs
aWIudXJscmV0cmlldmUoc2VsZi5femlwX3VybClbMF0pCisKKyAgICBkZWYgaGFuZGxlX3RvKHNl
bGYsIGZpbGVuYW1lKToKKyAgICAgICAgcmV0dXJuIFppcEZpbGVIYW5kbGUoc2VsZiwgZmlsZW5h
bWUpCisKKyAgICBkZWYgbmFtZWxpc3Qoc2VsZik6CisgICAgICAgIHNlbGYuX2xvYWQoKQorICAg
ICAgICByZXR1cm4gc2VsZi5femlwX2ZpbGUubmFtZWxpc3QoKQorCisgICAgZGVmIHJlYWQoc2Vs
ZiwgZmlsZW5hbWUpOgorICAgICAgICBzZWxmLl9sb2FkKCkKKyAgICAgICAgcmV0dXJuIHNlbGYu
X3ppcF9maWxlLnJlYWQoZmlsZW5hbWUpCisKKyAgICBkZWYgZXh0cmFjdChzZWxmLCBmaWxlbmFt
ZSwgcGF0aCk6CisgICAgICAgIHNlbGYuX2xvYWQoKQorICAgICAgICByZXR1cm4gc2VsZi5femlw
X2ZpbGUuZXh0cmFjdChmaWxlbmFtZSwgcGF0aCkKKworICAgIGRlZiBkZWxldGUoc2VsZiwgZmls
ZW5hbWUpOgorICAgICAgICByYWlzZSBFeGNlcHRpb24oIkNhbid0IGRlbGV0ZSBmcm9tIGEgUmVt
b3RlWmlwLiIpCisKKworY2xhc3MgWmlwRmlsZUhhbmRsZToKKyAgICAiIiJQb2ludHMgdG8gYSBm
aWxlIHRoYXQgcmVzaWRlcyBpbiBhIFJlbW90ZVppcCIiIgorICAgIGRlZiBfX2luaXRfXyhzZWxm
LCB6aXBfZmlsZSwgZmlsZW5hbWUpOgorICAgICAgICBzZWxmLl9maWxlbmFtZSA9IGZpbGVuYW1l
CisgICAgICAgIHNlbGYuX3ppcF9maWxlID0gemlwX2ZpbGUKKyAgICAgICAgc2VsZi5fY29udGVu
dHMgPSBOb25lCisKKyAgICBkZWYgX19zdHJfXyhzZWxmKToKKyAgICAgICAgcmV0dXJuICIlczol
cyIgJSAoc2VsZi5femlwX2ZpbGUsIHNlbGYuX2ZpbGVuYW1lKQorCisgICAgZGVmIGNvbnRlbnRz
KHNlbGYpOgorICAgICAgICBpZiBzZWxmLl9jb250ZW50cyBpcyBOb25lOgorICAgICAgICAgICAg
c2VsZi5fY29udGVudHMgPSBzZWxmLl96aXBfZmlsZS5yZWFkKHNlbGYuX2ZpbGVuYW1lKQorICAg
ICAgICByZXR1cm4gc2VsZi5fY29udGVudHMKKworICAgIGRlZiBzYXZlX3RvKHNlbGYsIHBhdGgs
IGZpbGVuYW1lPU5vbmUpOgorICAgICAgICBpZiBmaWxlbmFtZSBpcyBOb25lOgorICAgICAgICAg
ICAgc2VsZi5femlwX2ZpbGUuZXh0cmFjdChzZWxmLl9maWxlbmFtZSwgcGF0aCkKKyAgICAgICAg
ZWxzZToKKyAgICAgICAgICAgIHRlbXBfZGlyID0gdGVtcGZpbGUubWtkdGVtcCgpCisgICAgICAg
ICAgICBzZWxmLl96aXBfZmlsZS5leHRyYWN0KHNlbGYuX2ZpbGVuYW1lLCB0ZW1wX2RpcikKKwor
ICAgICAgICAgICAgc3JjID0gb3MucGF0aC5qb2luKHRlbXBfZGlyLCBzZWxmLl9maWxlbmFtZSkK
KyAgICAgICAgICAgIGRlc3QgPSBvcy5wYXRoLmpvaW4ocGF0aCwgZmlsZW5hbWUpCisgICAgICAg
ICAgICBzaHV0aWwuY29weWZpbGUoc3JjLCBkZXN0KQorICAgICAgICAgICAgc2h1dGlsLnJtdHJl
ZSh0ZW1wX2RpcikKKworICAgIGRlZiBkZWxldGUoc2VsZik6CisgICAgICAgIHNlbGYuX3ppcF9m
aWxlLmRlbGV0ZShzZWxmLl9maWxlbmFtZSkKKworICAgIGRlZiBuYW1lKHNlbGYpOgorICAgICAg
ICByZXR1cm4gc2VsZi5fZmlsZW5hbWUKKworICAgIGRlZiBzcGxpdGV4dChzZWxmKToKKyAgICAg
ICAgcmV0dXJuIG9zLnBhdGguc3BsaXRleHQoc2VsZi5uYW1lKCkpCisKKworY2xhc3MgRGlyZWN0
b3J5QXNaaXAob2JqZWN0KToKKyAgICAiIiJQcm92aWRlcyBhIHppcGZpbGUtbGlrZSBpbnRlcmZh
Y2UgdG8gYSBsb2NhbCBkaXJlY3RvcnkiIiIKKyAgICBkZWYgX19pbml0X18oc2VsZiwgcGF0aCk6
CisgICAgICAgIHNlbGYuX3BhdGggPSBwYXRoCisgICAgICAgIGlmIG5vdCBzZWxmLl9wYXRoLmVu
ZHN3aXRoKG9zLnBhdGguc2VwKToKKyAgICAgICAgICAgIHNlbGYuX3BhdGggKz0gb3MucGF0aC5z
ZXAKKworICAgIGRlZiBoYW5kbGVfdG8oc2VsZiwgZmlsZW5hbWUpOgorICAgICAgICByZXR1cm4g
WmlwRmlsZUhhbmRsZShzZWxmLCBmaWxlbmFtZSkKKworICAgIGRlZiBuYW1lbGlzdChzZWxmKToK
KyAgICAgICAgcmVzdWx0cyA9IFtdCisgICAgICAgIGZvciAocGF0aCwgXywgZmlsZW5hbWVzKSBp
biBvcy53YWxrKHNlbGYuX3BhdGgpOgorICAgICAgICAgICAgZm9yIGZpbGVuYW1lIGluIGZpbGVu
YW1lczoKKyAgICAgICAgICAgICAgICAjIFdlIGRyb3AgdGhlIHBhdGggdG8gdGhlIGRpcmVjdG9y
eSBmcm9tIG91ciBuYW1lbGlzdC4KKyAgICAgICAgICAgICAgICByZXN1bHRzLmFwcGVuZChvcy5w
YXRoLmpvaW4ocGF0aCwgZmlsZW5hbWUpW2xlbihzZWxmLl9wYXRoKTpdKQorICAgICAgICByZXR1
cm4gcmVzdWx0cworCisgICAgZGVmIHJlYWQoc2VsZiwgZmlsZW5hbWUpOgorICAgICAgICBmID0g
b3Blbihvcy5wYXRoLmpvaW4oc2VsZi5fcGF0aCwgZmlsZW5hbWUpKQorICAgICAgICBjb250ZW50
cyA9IGYucmVhZCgpCisgICAgICAgIGYuY2xvc2UKKyAgICAgICAgcmV0dXJuIGNvbnRlbnRzCisK
KyAgICBkZWYgZXh0cmFjdChzZWxmLCBmaWxlbmFtZSwgcGF0aCk6CisgICAgICAgIHNyYyA9IG9z
LnBhdGguam9pbihzZWxmLl9wYXRoLCBmaWxlbmFtZSkKKyAgICAgICAgZGVzdCA9IG9zLnBhdGgu
am9pbihwYXRoLCBmaWxlbmFtZSkKKyAgICAgICAgIyBBcyBmaWxlbmFtZSBtYXkgaGF2ZSBzbGFz
aGVzIGluIGl0LCB3ZSBtdXN0IGVuc3VyZSB0aGF0IHRoZSBjb3JyZWN0CisgICAgICAgICMgZGly
ZWN0b3J5IGhlaXJhcmNoeSBleGlzdHMgd2hlbiB3ZSBhcmUgY29weWluZyBpdCB0byB0aGUgb3V0
cHV0LgorICAgICAgICBwYXRoX3RvX2ZpbGUgPSBvcy5wYXRoLnNwbGl0KGZpbGVuYW1lKVswXQor
ICAgICAgICBvcy5tYWtlZGlycyhvcy5wYXRoLmpvaW4ocGF0aCwgcGF0aF90b19maWxlKSkKKyAg
ICAgICAgc2h1dGlsLmNvcHlmaWxlKHNyYywgZGVzdCkKKworICAgIGRlZiBkZWxldGUoc2VsZiwg
ZmlsZW5hbWUpOgorICAgICAgICBmaWxlbmFtZSA9IG9zLnBhdGguam9pbihzZWxmLl9wYXRoLCBm
aWxlbmFtZSkKKyAgICAgICAgb3MucmVtb3ZlKGZpbGVuYW1lKQorCisKK2NsYXNzIEJ1aWxkZXIo
b2JqZWN0KToKKyAgICAiIiJSZXRyaWV2ZXMgcmVzdWx0cyBmcm9tIHppcCBmaWxlcyBzdG9yZWQg
b24gYSBidWlsZGJvdCBidWlsZGVyIiIiCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGJ1aWxkZXJf
bmFtZSwgcGxhdGZvcm0sIHppcF9maWxlLCAqKmt3YXJncyk6CisgICAgICAgIHNlbGYuX2J1aWxk
ZXJfbmFtZSA9IGJ1aWxkZXJfbmFtZQorICAgICAgICBzZWxmLl9wbGF0Zm9ybSA9IHBsYXRmb3Jt
CisgICAgICAgIHNlbGYuX3ppcF9maWxlID0gemlwX2ZpbGUKKyAgICAgICAgc2VsZi5faW5jbHVk
ZV9leHBlY3RlZCA9IGt3YXJncy5nZXQoJ2luY2x1ZGVfZXhwZWN0ZWQnLCBUcnVlKQorCisgICAg
QGNsYXNzbWV0aG9kCisgICAgZGVmIGZyb21femlwX3VybChjbHMsIHBsYXRmb3JtLCB6aXBfcGF0
aCk6CisgICAgICAgIHJldHVybiBCdWlsZGVyKCdsb2NhbCB6aXAgJXMgYnVpbGRlcicgJSBwbGF0
Zm9ybSwgcGxhdGZvcm0sIFJlbW90ZVppcCh6aXBfcGF0aCkpCisKKyAgICBAY2xhc3NtZXRob2QK
KyAgICBkZWYgZnJvbV96aXAoY2xzLCBwbGF0Zm9ybSwgemlwKToKKyAgICAgICAgcmV0dXJuIEJ1
aWxkZXIoJ2xvY2FsIHppcCAlcyBidWlsZGVyJyAlIHBsYXRmb3JtLCBwbGF0Zm9ybSwgemlwKQor
CisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIGZyb21fcGF0aChzZWxmLCBwYXRoLCBwbGF0Zm9y
bT1Ob25lKToKKyAgICAgICAgeiA9IERpcmVjdG9yeUFzWmlwKHBhdGgpCisgICAgICAgIHJldHVy
biBCdWlsZGVyKCdsb2NhbCAlcyBidWlsZGVyJyAlIHBsYXRmb3JtLCBwbGF0Zm9ybSwgeikKKwor
ICAgIGRlZiBuYW1lKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5fYnVpbGRlcl9uYW1lCisK
KyAgICBkZWYgZmlsZXMoc2VsZik6CisgICAgICAgIGZpbGVzID0gW10KKyAgICAgICAgZm9yIGZp
bGVuYW1lIGluIHNlbGYuX3ppcF9maWxlLm5hbWVsaXN0KCk6CisgICAgICAgICAgICBmaWxlcy5h
cHBlbmQoc2VsZi5femlwX2ZpbGUuaGFuZGxlX3RvKGZpbGVuYW1lKSkKKyAgICAgICAgcmV0dXJu
IGZpbGVzCisKKyAgICBkZWYgcmVzdWx0c19mb3Ioc2VsZiwgbmFtZSwgdGFyZ2V0X3R5cGU9Tm9u
ZSk6CisgICAgICAgIGlmIHJlLnNlYXJjaChyJ1wueD9odG1sJywgbmFtZSk6CisgICAgICAgICAg
ICBuYW1lID0gbmFtZVs6bmFtZS5yaW5kZXgoJy4nKV0KKyAgICAgICAgbmFtZV9tYXRjaGVyID0g
cmUuY29tcGlsZShuYW1lKQorICAgICAgICBhY3R1YWxfbWF0Y2hlciA9IHJlLmNvbXBpbGUocict
YWN0dWFsXC4nKQorICAgICAgICBleHBlY3RlZF9tYXRjaGVyID0gcmUuY29tcGlsZShyJy1leHBl
Y3RlZFwuJykKKworICAgICAgICBjaGVja3N1bV9maWxlcyA9IFtdCisgICAgICAgIHRleHRfZmls
ZXMgPSBbXQorICAgICAgICBpbWFnZV9maWxlcyA9IFtdCisgICAgICAgIGZvciByZXN1bHRfZmls
ZSBpbiBzZWxmLmZpbGVzKCk6CisgICAgICAgICAgICBuYW1lX21hdGNoID0gbmFtZV9tYXRjaGVy
LnNlYXJjaChyZXN1bHRfZmlsZS5uYW1lKCkpCisgICAgICAgICAgICBhY3R1YWxfbWF0Y2ggPSBh
Y3R1YWxfbWF0Y2hlci5zZWFyY2gocmVzdWx0X2ZpbGUubmFtZSgpKQorICAgICAgICAgICAgZXhw
ZWN0ZWRfbWF0Y2ggPSBleHBlY3RlZF9tYXRjaGVyLnNlYXJjaChyZXN1bHRfZmlsZS5uYW1lKCkp
CisgICAgICAgICAgICBpZiBuYW1lX21hdGNoIGFuZCAoYWN0dWFsX21hdGNoIG9yIChzZWxmLl9p
bmNsdWRlX2V4cGVjdGVkIGFuZCBleHBlY3RlZF9tYXRjaCkpOgorICAgICAgICAgICAgICAgIGlm
IHJlc3VsdF9maWxlLm5hbWUoKS5lbmRzd2l0aCgnLmNoZWNrc3VtJyk6CisgICAgICAgICAgICAg
ICAgICAgIGNoZWNrc3VtX2ZpbGVzLmFwcGVuZChyZXN1bHRfZmlsZSkKKyAgICAgICAgICAgICAg
ICBlbGlmIHJlc3VsdF9maWxlLm5hbWUoKS5lbmRzd2l0aCgnLnR4dCcpOgorICAgICAgICAgICAg
ICAgICAgICB0ZXh0X2ZpbGVzLmFwcGVuZChyZXN1bHRfZmlsZSkKKyAgICAgICAgICAgICAgICBl
bGlmIHJlc3VsdF9maWxlLm5hbWUoKS5lbmRzd2l0aCgnLnBuZycpOgorICAgICAgICAgICAgICAg
ICAgICBpbWFnZV9maWxlcy5hcHBlbmQocmVzdWx0X2ZpbGUpCisKKyAgICAgICAgcmVzdWx0cyA9
IFtdCisgICAgICAgIGZvciBpbWFnZV9maWxlIGluIGltYWdlX2ZpbGVzOgorICAgICAgICAgICAg
Y2hlY2tzdW1fZmlsZV9uYW1lID0gcmUuc3ViKHJlLmNvbXBpbGUoJ1wucG5nJyksICcuY2hlY2tz
dW0nLCBpbWFnZV9maWxlLm5hbWUoKSkKKyAgICAgICAgICAgIGZvdW5kX2NoZWNrc3VtID0gRmFs
c2UKKyAgICAgICAgICAgIGZvciBjaGVja3N1bV9maWxlIGluIGNoZWNrc3VtX2ZpbGVzOgorICAg
ICAgICAgICAgICAgIGlmIGNoZWNrc3VtX2ZpbGUubmFtZSgpID09IGNoZWNrc3VtX2ZpbGVfbmFt
ZToKKyAgICAgICAgICAgICAgICAgICAgZm91bmRfY2hlY2tzdW0gPSBUcnVlCisgICAgICAgICAg
ICAgICAgICAgIHJlc3VsdHMuYXBwZW5kKHJlc3VsdC5JbWFnZVJlc3VsdChzZWxmLl9wbGF0Zm9y
bSwgaW1hZ2VfZmlsZSwgY2hlY2tzdW1fZmlsZSkpCisgICAgICAgICAgICAgICAgICAgIGJyZWFr
CisgICAgICAgICAgICBpZiBub3QgZm91bmRfY2hlY2tzdW06CisgICAgICAgICAgICAgICAgcHJp
bnQgIkNvdWxkbid0IGZpbmQgY2hlY2tzdW0gZm9yIGltYWdlICclcyciICUgaW1hZ2VfZmlsZS5u
YW1lKCkKKworICAgICAgICBmb3IgdGV4dF9maWxlIGluIHRleHRfZmlsZXM6CisgICAgICAgICAg
ICByZXN1bHRzLmFwcGVuZChyZXN1bHQuVGV4dFJlc3VsdChzZWxmLl9wbGF0Zm9ybSwgdGV4dF9m
aWxlKSkKKworICAgICAgICByZXR1cm4gZmlsdGVyKGxhbWJkYSByOiB0YXJnZXRfdHlwZSBpcyBO
b25lIG9yIHRhcmdldF90eXBlID09IHIudHlwZSgpLCByZXN1bHRzKQorCisKK2NsYXNzIEFnZ3Jl
Z2F0ZUJ1aWxkZXIob2JqZWN0KToKKyAgICAiIiJDb2xsZWN0cyByZXN1bHRzIGZyb20gYSBsaXN0
IG9mIGJ1aWxkZXJzIiIiCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGJ1aWxkZXJzKToKKyAgICAg
ICAgc2VsZi5fYnVpbGRlcnMgPSBidWlsZGVycworCisgICAgZGVmIHJlc3VsdHNfZm9yKHNlbGYs
IG5hbWUsIHR5cGVfZmlsdGVyPU5vbmUpOgorICAgICAgICByZXN1bHRzID0gW10KKyAgICAgICAg
Zm9yIGJ1aWxkZXIgaW4gc2VsZi5fYnVpbGRlcnM6CisgICAgICAgICAgICByZXN1bHRzICs9IGJ1
aWxkZXIucmVzdWx0c19mb3IobmFtZSwgdHlwZV9maWx0ZXIpCisgICAgICAgIHJldHVybiByZXN1
bHRzCisKKyAgICBkZWYgc3ViX2J1aWxkZXJzKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5f
YnVpbGRlcnMKKworCisjIFRPRE8gVGhpcyBjbGFzcyBpcyBzaW1pbGFyIHRvIFdlYktpdEJ1aWxk
ZXIgc28gd2Ugc2hvdWxkIHByb2JhYmx5IGV4dHJhY3QgYQorIyBiYXNlIGNsYXNzLgorY2xhc3Mg
Q2hyb21pdW1CdWlsZGVyKG9iamVjdCk6CisgICAgQlVJTERFUlMgPSB7CisgICAgICAgICdjaHJv
bWl1bS1tYWMnOiAnV2Via2l0X01hYzEwXzUnLAorICAgICAgICAnY2hyb21pdW0td2luLXZpc3Rh
JzogJ1dlYmtpdF9XaW4nLAorICAgICAgICAnY2hyb21pdW0tbGludXgnOiAnV2Via2l0X0xpbnV4
X1Rlc3RzX19kYmdfXzFfJywKKyAgICB9CisKKyAgICBkZWYgbG9va3VwX3Jlc3VsdF96aXAoc2Vs
ZiwgYnVpbGRlcl9uYW1lKToKKyAgICAgICAgcmV0dXJuICdodHRwOi8vYnVpbGQuY2hyb21pdW0u
b3JnL2YvY2hyb21pdW0vbGF5b3V0X3Rlc3RfcmVzdWx0cy8nICsgYnVpbGRlcl9uYW1lICsgJy9s
YXlvdXQtdGVzdC1yZXN1bHRzLnppcCcKKworICAgIGRlZiBwbGF0Zm9ybXMoc2VsZik6CisgICAg
ICAgIHJldHVybiBDaHJvbWl1bUJ1aWxkZXIuQlVJTERFUlMua2V5cygpCisKKyAgICBkZWYgbG9v
a3VwX2J1aWxkZXJfbmFtZShzZWxmLCBwbGF0Zm9ybSk6CisgICAgICAgIGlmIHBsYXRmb3JtIGlu
IENocm9taXVtQnVpbGRlci5CVUlMREVSUy5rZXlzKCk6CisgICAgICAgICAgICByZXR1cm4gQ2hy
b21pdW1CdWlsZGVyLkJVSUxERVJTW3BsYXRmb3JtXQorICAgICAgICByZXR1cm4gTm9uZQorCisg
ICAgZGVmIGJ1aWxkZXJzKHNlbGYsIHBsYXRmb3Jtcz1Ob25lKToKKyAgICAgICAgaWYgcGxhdGZv
cm1zIGlzIE5vbmU6CisgICAgICAgICAgICBwbGF0Zm9ybXMgPSBDaHJvbWl1bUJ1aWxkZXIuQlVJ
TERFUlMua2V5cygpCisgICAgICAgIHJldHVybiBBZ2dyZWdhdGVCdWlsZGVyKG1hcChzZWxmLmJ1
aWxkZXIsIHBsYXRmb3JtcykpCisKKyAgICBkZWYgYnVpbGRlcihzZWxmLCBwbGF0Zm9ybSk6Cisg
ICAgICAgIGlmIHBsYXRmb3JtIG5vdCBpbiBzZWxmLnBsYXRmb3JtcygpOgorICAgICAgICAgICAg
cmFpc2UgIiclcycgaXMgbm90IGEgcmVjb2duaXNlZCBjaHJvbWl1bSBwbGF0Zm9ybSIgJSBwbGF0
Zm9ybQorICAgICAgICBidWlsZGVyX25hbWUgPSBzZWxmLmxvb2t1cF9idWlsZGVyX25hbWUocGxh
dGZvcm0pCisgICAgICAgIHppcF91cmwgPSBzZWxmLmxvb2t1cF9yZXN1bHRfemlwKGJ1aWxkZXJf
bmFtZSkKKyAgICAgICAgcHJpbnQgIkdvdCAlcyIgJSB6aXBfdXJsCisgICAgICAgIHJldHVybiBC
dWlsZGVyKGJ1aWxkZXJfbmFtZSwgcGxhdGZvcm0sIFJlbW90ZVppcCh6aXBfdXJsKSwgaW5jbHVk
ZV9leHBlY3RlZD1GYWxzZSkKKworCitjbGFzcyBXZWJLaXRCdWlsZGVyKG9iamVjdCk6CisgICAg
QlVJTERFUlMgPSB7CisgICAgICAgICdtYWMtc25vd2xlb3BhcmQnOiAnU25vd0xlb3BhcmQlMjBJ
bnRlbCUyMFJlbGVhc2UlMjAoVGVzdHMpJywKKyAgICAgICAgJ21hYy1sZW9wYXJkJzogJ0xlb3Bh
cmQlMjBJbnRlbCUyMERlYnVnJTIwKFRlc3RzKScsCisgICAgICAgICd3aW4nOiAnV2luZG93cyUy
MDclMjBSZWxlYXNlJTIwKFdlYktpdDIlMjBUZXN0cyknLAorICAgICAgICAnY2hyb21pdW0tbGlu
dXgnOiAnR1RLJTIwTGludXglMjAzMi1iaXQlMjBSZWxlYXNlJywKKyAgICB9CisKKyAgICBkZWYg
cGxhdGZvcm1zKHNlbGYpOgorICAgICAgICByZXR1cm4gV2ViS2l0QnVpbGRlci5CVUlMREVSUy5r
ZXlzKCkKKworICAgIGRlZiBsb29rdXBfYnVpbGRlcl9uYW1lKHNlbGYsIHBsYXRmb3JtKToKKyAg
ICAgICAgcmV0dXJuIFdlYktpdEJ1aWxkZXIuQlVJTERFUlNbcGxhdGZvcm1dCisKKyAgICBkZWYg
bG9va3VwX3Jlc3VsdF96aXAoc2VsZiwgYnVpbGRlcl9uYW1lKToKKyAgICAgICAgIiIiR2V0cyB0
aGUgVVJMIG9mIGEgemlwZmlsZSBjb250YWluaW5nIHRoZSBsYXRlc3QgcmVzdWx0cyBieSBzY3Jh
cGluZyB0aGUKKyAgICAgICAgICAgICAgSFRNTCBkaXJlY3RvcnkgbGlzdGluZyBvZiB0aGUgYnVp
bGRlciIiIgorICAgICAgICByZXN1bHRzX2Rpcl91cmwgPSAnaHR0cDovL2J1aWxkLndlYmtpdC5v
cmcvcmVzdWx0cy8nICsgYnVpbGRlcl9uYW1lICsgJy8nCisKKyAgICAgICAgIyBwcmludCAiTG9v
a2luZyBpbiAlcyBmb3IgemlwcyIgJSByZXN1bHRzX2Rpcl91cmwKKyAgICAgICAgZiA9IHVybGxp
Yi51cmxvcGVuKHJlc3VsdHNfZGlyX3VybCkKKyAgICAgICAgemlwX3VybCA9IE5vbmUKKyAgICAg
ICAgaHJlZl9yZSA9IHJlLmNvbXBpbGUocidhIGhyZWY9IiguKlwuemlwKSI+JykKKyAgICAgICAg
Zm9yIGxpbmUgaW4gZjoKKyAgICAgICAgICAgIG1hdGNoID0gaHJlZl9yZS5zZWFyY2gobGluZSkK
KyAgICAgICAgICAgIGlmIG1hdGNoOgorICAgICAgICAgICAgICAgIHppcF91cmwgPSBtYXRjaC5n
cm91cCgxKQorCisgICAgICAgIGlmIHppcF91cmwgaXMgTm9uZToKKyAgICAgICAgICAgIHJhaXNl
IEV4Y2VwdGlvbigiQ291bGRuJ3QgZmluZCBhbnkgcmVzdWx0cyBhcmNoaXZlcyBvbiB0aGUgV2Vi
S2l0IGJ1aWxkZXIgJyVzJyIgJSBidWlsZGVyX25hbWUpCisKKyAgICAgICAgcmV0dXJuIHJlc3Vs
dHNfZGlyX3VybCArIHppcF91cmwKKworICAgIGRlZiBidWlsZGVycyhzZWxmLCBwbGF0Zm9ybXM9
Tm9uZSk6CisgICAgICAgIGlmIHBsYXRmb3JtcyBpcyBOb25lOgorICAgICAgICAgICAgcGxhdGZv
cm1zID0gc2VsZi5wbGF0Zm9ybXMoKQorICAgICAgICByZXR1cm4gQWdncmVnYXRlQnVpbGRlciht
YXAoc2VsZi5idWlsZGVyLCBwbGF0Zm9ybXMpKQorCisgICAgZGVmIGJ1aWxkZXIoc2VsZiwgcGxh
dGZvcm0pOgorICAgICAgICBpZiBwbGF0Zm9ybSBub3QgaW4gc2VsZi5wbGF0Zm9ybXMoKToKKyAg
ICAgICAgICAgIHJhaXNlIEV4Y2VwdGlvbigiJyVzJyBpcyBub3QgYSByZWNvZ25pc2VkIHdlYmtp
dCBwbGF0Zm9ybSIgJSBwbGF0Zm9ybSkKKyAgICAgICAgYnVpbGRlcl9uYW1lID0gc2VsZi5sb29r
dXBfYnVpbGRlcl9uYW1lKHBsYXRmb3JtKQorICAgICAgICB6aXBfdXJsID0gc2VsZi5sb29rdXBf
cmVzdWx0X3ppcChidWlsZGVyX25hbWUpCisgICAgICAgIHJldHVybiBCdWlsZGVyKGJ1aWxkZXJf
bmFtZSwgcGxhdGZvcm0sIFJlbW90ZVppcCh6aXBfdXJsKSwgaW5jbHVkZV9leHBlY3RlZD1GYWxz
ZSkKZGlmZiAtLWdpdCBhL1dlYktpdFRvb2xzL1NjcmlwdHMvd2Via2l0cHkvbGF5b3V0X3Rlc3Rz
L3JlYmFzZWxpbmUvYnVpbGRlcl91bml0dGVzdC5weSBiL1dlYktpdFRvb2xzL1NjcmlwdHMvd2Vi
a2l0cHkvbGF5b3V0X3Rlc3RzL3JlYmFzZWxpbmUvYnVpbGRlcl91bml0dGVzdC5weQpuZXcgZmls
ZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwLi4wNDdhMWE2N2NjZmE1ZDcxZmYxOGRiZjdlNTliMGVlZWMxMGM3YjAxCi0tLSAvZGV2L251
bGwKKysrIGIvV2ViS2l0VG9vbHMvU2NyaXB0cy93ZWJraXRweS9sYXlvdXRfdGVzdHMvcmViYXNl
bGluZS9idWlsZGVyX3VuaXR0ZXN0LnB5CkBAIC0wLDAgKzEsMTUxIEBACisjIS91c3IvYmluL2Vu
diBweXRob24KKyMgQ29weXJpZ2h0IChDKSAyMDEwIEdvb2dsZSBJbmMuIEFsbCByaWdodHMgcmVz
ZXJ2ZWQuCisjCisjIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkg
Zm9ybXMsIHdpdGggb3Igd2l0aG91dAorIyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJv
dmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyMgYXJlIG1ldDoKKyMKKyMgMS4g
IFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29w
eXJpZ2h0CisjICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9s
bG93aW5nIGRpc2NsYWltZXIuCisjIDIuICBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0g
bXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorIyAgICAgbm90aWNlLCB0aGlzIGxp
c3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorIyAg
ICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhl
IGRpc3RyaWJ1dGlvbi4KKyMKKyMgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBB
TkQgSVRTIENPTlRSSUJVVE9SUyAiQVMgSVMiIEFORCBBTlkKKyMgRVhQUkVTUyBPUiBJTVBMSUVE
IFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRAor
IyBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNV
TEFSIFBVUlBPU0UgQVJFCisjIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIE9S
IElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkKKyMgRElSRUNULCBJTkRJUkVDVCwg
SU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMK
KyMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElU
VVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworIyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsg
T1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKKyMgT04gQU5ZIFRI
RU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFks
IE9SIFRPUlQKKyMgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJ
TiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisjIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURW
SVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKK2ltcG9ydCBidWlsZGVy
CitpbXBvcnQgdW5pdHRlc3QKKworCitjbGFzcyBGYWtlWmlwKG9iamVjdCk6CisgICAgZGVmIF9f
aW5pdF9fKHNlbGYpOgorICAgICAgICBzZWxmLl9maWxlcyA9IHt9CisKKyAgICBkZWYgX19zdHJf
XyhzZWxmKToKKyAgICAgICAgcmV0dXJuICJGYWtlWmlwIgorCisgICAgZGVmIGluc2VydChzZWxm
LCBmaWxlbmFtZSwgY29udGVudCk6CisgICAgICAgIHNlbGYuX2ZpbGVzW2ZpbGVuYW1lXSA9IGNv
bnRlbnQKKworICAgIGRlZiBuYW1lbGlzdChzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX2Zp
bGVzLmtleXMoKQorCisgICAgZGVmIGhhbmRsZV90byhzZWxmLCBmaWxlbmFtZSk6CisgICAgICAg
IHJldHVybiBidWlsZGVyLlppcEZpbGVIYW5kbGUoc2VsZiwgZmlsZW5hbWUpCisKKyAgICBkZWYg
cmVhZChzZWxmLCBmaWxlbmFtZSk6CisgICAgICAgIHJldHVybiBzZWxmLl9maWxlc1tmaWxlbmFt
ZV0KKworICAgIGRlZiBleHRyYWN0KHNlbGYsIGZpbGVuYW1lLCBwYXRoKToKKyAgICAgICAgcHJp
bnQgIkZha2VaaXA+IGNwICVzICVzIiAlIChmaWxlbmFtZSwgcGF0aCkKKworICAgIGRlZiBkZWxl
dGUoc2VsZiwgZmlsZW5hbWUpOgorICAgICAgICBwcmludCAiRmFrZVppcD4gcm0gJXMiICUgZmls
ZW5hbWUKKyAgICAgICAgc2VsZi5fZmlsZXNbZmlsZW5hbWVdID0gTm9uZQorCisKK2NsYXNzIEJ1
aWxkZXJUZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICBkZWYgX2J1aWxkZXJfd2l0aF96aXAo
c2VsZiwgemlwLCAqKmt3YXJncyk6CisgICAgICAgIHJldHVybiBidWlsZGVyLkJ1aWxkZXIoJzxm
YWtlLWJ1aWxkZXI+JywgJzxmYWtlLXBsYXRmb3JtPicsIHppcCwgKiprd2FyZ3MpCisKKyAgICBk
ZWYgdGVzdFRleHRGaWxlc0dldEludGVycHJldGVkQXNUZXh0UmVzdWx0cyhzZWxmKToKKyAgICAg
ICAgemlwID0gRmFrZVppcCgpCisgICAgICAgIHppcC5pbnNlcnQoJ2Zhc3QvZG9tL3NvbWUtdGVz
dC1hY3R1YWwudHh0JywgJ2FjdHVhbCByZXN1bHRzJykKKyAgICAgICAgYiA9IHNlbGYuX2J1aWxk
ZXJfd2l0aF96aXAoemlwKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscygxLCBsZW4oYi5yZXN1
bHRzX2ZvcignZmFzdC9kb20vc29tZS10ZXN0JykpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFs
cygnZmFzdC9kb20vc29tZS10ZXN0JywgYi5yZXN1bHRzX2ZvcignZmFzdC9kb20vc29tZS10ZXN0
Lmh0bWwnKVswXS5uYW1lKCkpCisKKyAgICBkZWYgdGVzdEltYWdlQW5kQ2hlY2tzdW1GaWxlc0dl
dEludGVycHJldGVkQXNBU2luZ2xlSW1hZ2VSZXN1bHQoc2VsZik6CisgICAgICAgIHppcCA9IEZh
a2VaaXAoKQorICAgICAgICB6aXAuaW5zZXJ0KCdmYXN0L2RvbS9zb21lLXRlc3QtYWN0dWFsLmNo
ZWNrc3VtJywgJ2FiYzEyMycpCisgICAgICAgIHppcC5pbnNlcnQoJ2Zhc3QvZG9tL3NvbWUtdGVz
dC1hY3R1YWwucG5nJywgJzxpbWFnZSBkYXRhPicpCisgICAgICAgIGIgPSBzZWxmLl9idWlsZGVy
X3dpdGhfemlwKHppcCkKKyAgICAgICAgcmVzdWx0cyA9IGIucmVzdWx0c19mb3IoJ2Zhc3QvZG9t
L3NvbWUtdGVzdCcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKDEsIGxlbihyZXN1bHRzKSkK
KyAgICAgICAgcmVzdWx0ID0gcmVzdWx0c1swXQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscygn
aW1hZ2UnLCByZXN1bHQudHlwZSgpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscygnYWJjMTIz
JywgcmVzdWx0LmNvbnRlbnRzKCkpCisKKyAgICBkZWYgdGVzdE11bHRpcGxlSW1hZ2VSZXN1bHRz
QXJlRGV0ZWN0ZWQoc2VsZik6CisgICAgICAgIHppcCA9IEZha2VaaXAoKQorICAgICAgICB6aXAu
aW5zZXJ0KCdwbGF0Zm9ybS93aW4vZmFzdC9kb20vc29tZS10ZXN0LWFjdHVhbC5jaGVja3N1bScs
ICdjaGVja3N1bTEnKQorICAgICAgICB6aXAuaW5zZXJ0KCdwbGF0Zm9ybS93aW4vZmFzdC9kb20v
c29tZS10ZXN0LWFjdHVhbC5wbmcnLCAnPGltYWdlIGRhdGEgMT4nKQorICAgICAgICB6aXAuaW5z
ZXJ0KCdwbGF0Zm9ybS9tYWMvZmFzdC9kb20vc29tZS10ZXN0LWFjdHVhbC5jaGVja3N1bScsICdj
aGVja3N1bTInKQorICAgICAgICB6aXAuaW5zZXJ0KCdwbGF0Zm9ybS9tYWMvZmFzdC9kb20vc29t
ZS10ZXN0LWFjdHVhbC5wbmcnLCAnPGltYWdlIGRhdGEgMj4nKQorICAgICAgICBiID0gc2VsZi5f
YnVpbGRlcl93aXRoX3ppcCh6aXApCisgICAgICAgIHJlc3VsdHMgPSBiLnJlc3VsdHNfZm9yKCdm
YXN0L2RvbS9zb21lLXRlc3QnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscygyLCBsZW4ocmVz
dWx0cykpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UocmVzdWx0c1swXS5zYW1lX2NvbnRlbnQo
cmVzdWx0c1sxXSkpCisKKyAgICBkZWYgdGVzdEFnZ3JlZ2F0ZUJ1aWxkZXJDb3JyZWN0bHlSZXRy
aWV2ZXNUZXN0c0Zyb21NdWx0aXBsZUJ1aWxkZXJzKHNlbGYpOgorICAgICAgICBidWlsZGVyMV96
aXAgPSBGYWtlWmlwKCkKKyAgICAgICAgYnVpbGRlcjFfemlwLmluc2VydCgnZmFzdC9kb20vdGVz
dC1hY3R1YWwudHh0JywgJ2xpbnV4IHRleHQgcmVzdWx0JykKKyAgICAgICAgYnVpbGRlcjEgPSBi
dWlsZGVyLkJ1aWxkZXIoJ2xpbnV4LWJ1aWxkZXInLCAnbGludXgnLCBidWlsZGVyMV96aXApCisg
ICAgICAgIGJ1aWxkZXIyX3ppcCA9IEZha2VaaXAoKQorICAgICAgICBidWlsZGVyMl96aXAuaW5z
ZXJ0KCdmYXN0L2RvbS90ZXN0LWFjdHVhbC50eHQnLCAnd2luZG93cyB0ZXh0IHJlc3VsdCcpCisg
ICAgICAgIGJ1aWxkZXIyID0gYnVpbGRlci5CdWlsZGVyKCd3aW4tYnVpbGRlcicsICd3aW4nLCBi
dWlsZGVyMl96aXApCisKKyAgICAgICAgYiA9IGJ1aWxkZXIuQWdncmVnYXRlQnVpbGRlcihbYnVp
bGRlcjEsIGJ1aWxkZXIyXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoMiwgbGVuKGIucmVz
dWx0c19mb3IoJ2Zhc3QvZG9tL3Rlc3QnKSkpCisKKyAgICBkZWYgdGVzdENhbkluZmVyUGxhdGZv
cm1Gcm9tUGF0aElmTm9uZVByb3ZpZGVkKHNlbGYpOgorICAgICAgICB6aXAgPSBGYWtlWmlwKCkK
KyAgICAgICAgemlwLmluc2VydCgncGxhdGZvcm0vd2luL3NvbWUtdGVzdC1leHBlY3RlZC5wbmcn
LCAnPGltYWdlIGRhdGE+JykKKyAgICAgICAgemlwLmluc2VydCgncGxhdGZvcm0vd2luL3NvbWUt
dGVzdC1leHBlY3RlZC5jaGVja3N1bScsICdhYmMxMjMnKQorICAgICAgICBiID0gYnVpbGRlci5C
dWlsZGVyKCdsb2NhbCBMYXlvdXRUZXN0cyBidWlsZGVyJywgTm9uZSwgemlwKQorCisgICAgICAg
IHJlc3VsdHMgPSBiLnJlc3VsdHNfZm9yKCdzb21lLXRlc3QnKQorICAgICAgICBzZWxmLmFzc2Vy
dEVxdWFscygxLCBsZW4ocmVzdWx0cykpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKCd3aW4n
LCByZXN1bHRzWzBdLnBsYXRmb3JtKCkpCisKKyAgICBkZWYgdGVzdFRlc3RFeHRlbnNpb25Jc0ln
bm9yZWQoc2VsZik6CisgICAgICAgIHppcCA9IEZha2VaaXAoKQorICAgICAgICB6aXAuaW5zZXJ0
KCd0ZXN0L3Rlc3QtYS1hY3R1YWwudHh0JywgJ2FjdHVhbCByZXN1bHRzJykKKyAgICAgICAgYiA9
IHNlbGYuX2J1aWxkZXJfd2l0aF96aXAoemlwKQorICAgICAgICByZXN1bHRzID0gYi5yZXN1bHRz
X2ZvcigndGVzdC90ZXN0LWEuaHRtbCcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKDEsIGxl
bihyZXN1bHRzKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoJ3Rlc3QvdGVzdC1hJywgcmVz
dWx0c1swXS5uYW1lKCkpCisKKyAgICBkZWYgdGVzdEV4aXN0aW5nUmVzdWx0c0FyZU1hcmtlZEFz
U3VjaChzZWxmKToKKyAgICAgICAgemlwID0gRmFrZVppcCgpCisgICAgICAgIHppcC5pbnNlcnQo
J3Rlc3QvdGVzdC1hLWV4cGVjdGVkLnR4dCcsICdleHBlY3RlZCByZXN1bHRzJykKKyAgICAgICAg
YiA9IHNlbGYuX2J1aWxkZXJfd2l0aF96aXAoemlwKQorICAgICAgICByZXN1bHRzID0gYi5yZXN1
bHRzX2ZvcigndGVzdC90ZXN0LWEuaHRtbCcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKDEs
IGxlbihyZXN1bHRzKSkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShyZXN1bHRzWzBdLmlzX2Fj
dHVhbCgpKQorCisgICAgZGVmIHRlc3RPbmx5UmV0dXJuc1Jlc3VsdHNPZlNwZWNpZmllZFR5cGUo
c2VsZik6CisgICAgICAgIHppcCA9IEZha2VaaXAoKQorICAgICAgICB6aXAuaW5zZXJ0KCd0ZXN0
L3Rlc3QtYS1leHBlY3RlZC50eHQnLCAnZXhwZWN0ZWQgcmVzdWx0cycpCisgICAgICAgIHppcC5p
bnNlcnQoJ3Rlc3QvdGVzdC1hLWV4cGVjdGVkLmNoZWNrc3VtJywgJ2V4cGVjdGVkIHJlc3VsdHMn
KQorICAgICAgICB6aXAuaW5zZXJ0KCd0ZXN0L3Rlc3QtYS1leHBlY3RlZC5wbmcnLCAnZXhwZWN0
ZWQgcmVzdWx0cycpCisgICAgICAgIGIgPSBzZWxmLl9idWlsZGVyX3dpdGhfemlwKHppcCkKKwor
ICAgICAgICByZXN1bHRzID0gYi5yZXN1bHRzX2ZvcigndGVzdC90ZXN0LWEuaHRtbCcpCisgICAg
ICAgIHRleHRfcmVzdWx0cyA9IGIucmVzdWx0c19mb3IoJ3Rlc3QvdGVzdC1hLmh0bWwnLCAndGV4
dCcpCisgICAgICAgIGltYWdlX3Jlc3VsdHMgPSBiLnJlc3VsdHNfZm9yKCd0ZXN0L3Rlc3QtYS5o
dG1sJywgJ2ltYWdlJykKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFscygyLCBsZW4ocmVzdWx0
cykpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKDEsIGxlbih0ZXh0X3Jlc3VsdHMpKQorICAg
ICAgICBzZWxmLmFzc2VydEVxdWFscygxLCBsZW4oaW1hZ2VfcmVzdWx0cykpCisgICAgICAgIHNl
bGYuYXNzZXJ0RXF1YWxzKCd0ZXh0JywgdGV4dF9yZXN1bHRzWzBdLnR5cGUoKSkKKyAgICAgICAg
c2VsZi5hc3NlcnRFcXVhbHMoJ2ltYWdlJywgaW1hZ2VfcmVzdWx0c1swXS50eXBlKCkpCisKKyAg
ICBkZWYgdGVzdEV4Y2x1ZGVFeHBlY3RlZFJlc3VsdHNXb3JrcyhzZWxmKToKKyAgICAgICAgemlw
ID0gRmFrZVppcCgpCisgICAgICAgIHppcC5pbnNlcnQoJ3Rlc3QtZXhwZWN0ZWQudHh0JywgICdl
eHBlY3RlZCByZXN1bHRzIHN0b3JlZCBvbiBzZXJ2ZXIgZm9yIHNvbWUgcmVhc29uJykKKyAgICAg
ICAgYiA9IHNlbGYuX2J1aWxkZXJfd2l0aF96aXAoemlwLCBpbmNsdWRlX2V4cGVjdGVkPUZhbHNl
KQorICAgICAgICByZXN1bHRzID0gYi5yZXN1bHRzX2ZvcigndGVzdCcsIE5vbmUpCisgICAgICAg
IHNlbGYuYXNzZXJ0RXF1YWxzKDAsIGxlbihyZXN1bHRzKSkKKworaWYgX19uYW1lX18gPT0gIl9f
bWFpbl9fIjoKKyAgICB1bml0dGVzdC5tYWluKCkKZGlmZiAtLWdpdCBhL1dlYktpdFRvb2xzL1Nj
cmlwdHMvd2Via2l0cHkvbGF5b3V0X3Rlc3RzL3JlYmFzZWxpbmUvaW50ZWdyYXRpb25fdW5pdHRl
c3QucHkgYi9XZWJLaXRUb29scy9TY3JpcHRzL3dlYmtpdHB5L2xheW91dF90ZXN0cy9yZWJhc2Vs
aW5lL2ludGVncmF0aW9uX3VuaXR0ZXN0LnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAuLjUzNjhmOTRmMmY3Y2RlM2M2
ZTg5MTY0Y2FlOGQ2YTE5MWI4NTYxYzUKLS0tIC9kZXYvbnVsbAorKysgYi9XZWJLaXRUb29scy9T
Y3JpcHRzL3dlYmtpdHB5L2xheW91dF90ZXN0cy9yZWJhc2VsaW5lL2ludGVncmF0aW9uX3VuaXR0
ZXN0LnB5CkBAIC0wLDAgKzEsMTIxIEBACisjIS91c3IvYmluL2VudiBweXRob24KKyMgQ29weXJp
Z2h0IChDKSAyMDEwIEdvb2dsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisjCisjIFJlZGlz
dHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0
aG91dAorIyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9s
bG93aW5nIGNvbmRpdGlvbnMKKyMgYXJlIG1ldDoKKyMKKyMgMS4gIFJlZGlzdHJpYnV0aW9ucyBv
ZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisjICAgICBub3Rp
Y2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIu
CisjIDIuICBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhl
IGFib3ZlIGNvcHlyaWdodAorIyAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBh
bmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorIyAgICAgZG9jdW1lbnRhdGlvbiBh
bmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyMK
KyMgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBBTkQgSVRTIENPTlRSSUJVVE9S
UyAiQVMgSVMiIEFORCBBTlkKKyMgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xV
RElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRAorIyBXQVJSQU5USUVTIE9GIE1F
UkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCisj
IERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIE9SIElUUyBDT05UUklCVVRPUlMg
QkUgTElBQkxFIEZPUiBBTlkKKyMgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lB
TCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMKKyMgKElOQ0xVRElORywgQlVU
IE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJ
Q0VTOworIyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJS
VVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKKyMgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFks
IFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyMgKElOQ0xV
RElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBU
SEUgVVNFIE9GCisjIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lC
SUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKK2ltcG9ydCBidWNrZXQKK2ltcG9ydCBidWlsZGVyCitm
cm9tIHJlc3VsdF91bml0dGVzdCBpbXBvcnQgRmFrZVJlc3VsdAorZnJvbSBidWlsZGVyX3VuaXR0
ZXN0IGltcG9ydCBGYWtlWmlwCitpbXBvcnQgdW5pdHRlc3QKKworCitjbGFzcyBSZWJhc2VsaW5l
SW50ZWdyYXRpb25UZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICBkZWYgX2xvZyhzZWxmLCBt
c2cpOgorICAgICAgICAjIHByaW50IG1zZworICAgICAgICBwYXNzCisKKyAgICBkZWYgX2R1bXAo
c2VsZiwgYik6CisgICAgICAgIHNlbGYuX2xvZygnLScgKiA4MCkKKyAgICAgICAgYi5yb290X2J1
Y2tldCgpLmR1bXAoYnVja2V0LkluZGVudGVkTG9nZ2VyKHNlbGYuX2xvZykpCisKKyAgICBkZWYg
dGVzdEV2ZXJ5dGhpbmcoc2VsZik6CisgICAgICAgIGIgPSBidWNrZXQuQnVja2V0VHJlZSgpCisg
ICAgICAgIGIuYihOb25lLAorICAgICAgICAgICAgYi5iKCdtYWMnLAorICAgICAgICAgICAgICAg
IGIuYignbWFjLXNub3dsZW9wYXJkJywKKyAgICAgICAgICAgICAgICAgICAgYi5iKCdtYWMtbGVv
cGFyZCcsCisgICAgICAgICAgICAgICAgICAgICAgICBiLmIoJ21hYy10aWdlcicpKSksCisgICAg
ICAgICAgICAgICAgYi5iKCd3aW4nLAorICAgICAgICAgICAgICAgICAgICBiLmIoJ2Nocm9taXVt
JywKKyAgICAgICAgICAgICAgICAgICAgICAgIGIuYignY2hyb21pdW0tbWFjJyksCisgICAgICAg
ICAgICAgICAgICAgICAgICBiLmIoJ2Nocm9taXVtLXdpbicsCisgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgYi5iKCdjaHJvbWl1bS13aW4tdmlzdGEnLAorICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICBiLmIoJ2Nocm9taXVtLXdpbi14cCcpKSwKKyAgICAgICAgICAgICAgICAgICAg
ICAgICAgICBiLmIoJ2Nocm9taXVtLWxpbnV4JywKKyAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgYi5iKCdjaHJvbWl1bS1ncHUnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgYi5iKCdjaHJvbWl1bS1ncHUtbGludXgnKSwKKyAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgIGIuYignY2hyb21pdW0tZ3B1LXdpbicpLAorICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgYi5iKCdjaHJvbWl1bS1ncHUtbWFjJykpKSkpKSksCisgICAgICAg
ICAgICBiLmIoJ3F0JywKKyAgICAgICAgICAgICAgICBiLmIoJ3F0LWxpbnV4JyksCisgICAgICAg
ICAgICAgICAgYi5iKCdxdC1tYWMnKSwKKyAgICAgICAgICAgICAgICBiLmIoJ3F0LXdpbicpKSkK
KworICAgICAgICBBR0dSRUdBVEVfQlVDS0VUUyA9IFsnY2hyb21pdW0nLCAnY2hyb21pdW0td2lu
JywgJ3dpbicsICdtYWMnLCAncXQnLCAnY2hyb21pdW0tZ3B1J10KKyAgICAgICAgZm9yIGJ1Y2tl
dF9uYW1lIGluIEFHR1JFR0FURV9CVUNLRVRTOgorICAgICAgICAgICAgYi5nZXRfYnVja2V0KGJ1
Y2tldF9uYW1lKS5tYXJrX2FzX2FnZ3JlZ2F0ZSgpCisKKyAgICAgICAgbGF5b3V0X3Rlc3RzID0g
RmFrZVppcCgpCisgICAgICAgIGxheW91dF90ZXN0cy5pbnNlcnQoJ0xheW91dFRlc3RzL2Zhc3Qv
ZG9tL3Rlc3QuaHRtbCcsICc8aHRtbD5BIHRlc3Q8L2h0bWw+JykKKyAgICAgICAgbGF5b3V0X3Rl
c3RzLmluc2VydCgnTGF5b3V0VGVzdHMvZmFzdC9kb20vdGVzdC1leHBlY3RlZC50eHQnLCAnYmFz
ZSByZXN1bHQnKQorICAgICAgICBsYXlvdXRfdGVzdHMuaW5zZXJ0KCdMYXlvdXRUZXN0cy9wbGF0
Zm9ybS9jaHJvbWl1bS13aW4vZmFzdC9kb20vdGVzdC1leHBlY3RlZC50eHQnLCAnd2luIHJlc3Vs
dCcpCisKKyAgICAgICAgd2luX3hwX2JvdCA9IEZha2VaaXAoKQorICAgICAgICB3aW5feHBfYm90
Lmluc2VydCgnZmFzdC9kb20vdGVzdC1hY3R1YWwudHh0JywgJ25ldyB3aW4gcmVzdWx0JykKKwor
ICAgICAgICB3aW5fdmlzdGFfYm90ID0gRmFrZVppcCgpCisgICAgICAgIHdpbl92aXN0YV9ib3Qu
aW5zZXJ0KCdmYXN0L2RvbS90ZXN0LWFjdHVhbC50eHQnLCAnbmV3IHdpbiByZXN1bHQnKQorCisg
ICAgICAgIGxpbnV4X2JvdCA9IEZha2VaaXAoKQorICAgICAgICBsaW51eF9ib3QuaW5zZXJ0KCdm
YXN0L2RvbS90ZXN0LWFjdHVhbC50eHQnLCAnbmV3IHdpbiByZXN1bHQnKQorCisgICAgICAgIGZh
Y3RvcnkgPSBidWlsZGVyLkJ1aWxkZXIKKyAgICAgICAgYnVpbGRlcnMgPSBbXQorICAgICAgICBi
dWlsZGVycy5hcHBlbmQoZmFjdG9yeS5mcm9tX3ppcCgnY2hyb21pdW0td2luLXhwJywgd2luX3hw
X2JvdCkpCisgICAgICAgIGJ1aWxkZXJzLmFwcGVuZChmYWN0b3J5LmZyb21femlwKCdjaHJvbWl1
bS13aW4tdmlzdGEnLCB3aW5fdmlzdGFfYm90KSkKKyAgICAgICAgYnVpbGRlcnMuYXBwZW5kKGZh
Y3RvcnkuZnJvbV96aXAoJ2Nocm9taXVtLWxpbnV4JywgbGludXhfYm90KSkKKyAgICAgICAgYnVp
bGRib3RzX2J1aWxkZXIgPSBidWlsZGVyLkFnZ3JlZ2F0ZUJ1aWxkZXIoYnVpbGRlcnMpCisgICAg
ICAgIGxheW91dF9idWlsZGVyID0gZmFjdG9yeS5mcm9tX3ppcChOb25lLCBsYXlvdXRfdGVzdHMp
CisKKyAgICAgICAgYnVpbGRib3RfcmVzdWx0cyA9IGJ1aWxkYm90c19idWlsZGVyLnJlc3VsdHNf
Zm9yKCdmYXN0L2RvbS90ZXN0Lmh0bWwnKQorICAgICAgICBsYXlvdXRfcmVzdWx0cyA9IGxheW91
dF9idWlsZGVyLnJlc3VsdHNfZm9yKCdmYXN0L2RvbS90ZXN0Lmh0bWwnKQorCisgICAgICAgIGZv
ciByIGluIGJ1aWxkYm90X3Jlc3VsdHMgKyBsYXlvdXRfcmVzdWx0czoKKyAgICAgICAgICAgIHNl
bGYuX2xvZygiW0ldICVzIiAlIHIpCisgICAgICAgICAgICBiLmluc2VydF9yZXN1bHQocikKKwor
ICAgICAgICAjIHNlbGYuX2R1bXAoYikKKyAgICAgICAgc2VsZi5fbG9nKCJcbkNPTExBUFNFXG4i
KQorICAgICAgICBiLmNvbGxhcHNlKCkKKyAgICAgICAgIyBzZWxmLl9kdW1wKGIpCisKKyAgICAg
ICAgZm9yIHIgaW4gYi5yZXN1bHRzKCk6CisgICAgICAgICAgICBzZWxmLl9sb2coIltPXSAlcyIg
JSByKQorCisgICAgICAgIGRlZHVwZWRfcmVzdWx0cyA9IGIucmVzdWx0cygpCisgICAgICAgICMg
U2hvdWxkIG9ubHkgaGF2ZSB0aGUgTm9uZSBhbmQgdGhlIHdpbiByZXN1bHQuCisgICAgICAgIHNl
bGYuYXNzZXJ0RXF1YWxzKDIsIGxlbihkZWR1cGVkX3Jlc3VsdHMpKQorCisgICAgICAgICMgZHIg
PSBzZXQoZGVkdXBlZF9yZXN1bHRzKQorICAgICAgICAjIGxyID0gc2V0KGxheW91dF9yZXN1bHRz
KQorCisgICAgICAgICMgcHJpbnQgIkR1cGVzIGluIGxheW91dF9yZXN1bHRzIgorICAgICAgICAj
IGZvciByIGluIGxyIC0gZHI6CisgICAgICAgICMgICByLmRlbGV0ZSgpCisKKyAgICAgICAgIyBw
cmludCAiTmV3IHJlc3VsdHMiCisgICAgICAgICMgZm9yIHIgaW4gZHIgLSBscjoKKyAgICAgICAg
IyAgIHIuaW5zdGFsbCgnTGF5b3V0VGVzdHMnKQorCitpZiBfX25hbWVfXyA9PSAnX19tYWluX18n
OgorICAgIHVuaXR0ZXN0Lm1haW4oKQpkaWZmIC0tZ2l0IGEvV2ViS2l0VG9vbHMvU2NyaXB0cy93
ZWJraXRweS9sYXlvdXRfdGVzdHMvcmViYXNlbGluZS9yZWJhc2VsaW5lci5weSBiL1dlYktpdFRv
b2xzL1NjcmlwdHMvd2Via2l0cHkvbGF5b3V0X3Rlc3RzL3JlYmFzZWxpbmUvcmViYXNlbGluZXIu
cHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMC4uMzZlNDZjOTIyODVmNDJhNzVkN2EwNTUxZmUzMWU1ZGViYjZkZWFjNQot
LS0gL2Rldi9udWxsCisrKyBiL1dlYktpdFRvb2xzL1NjcmlwdHMvd2Via2l0cHkvbGF5b3V0X3Rl
c3RzL3JlYmFzZWxpbmUvcmViYXNlbGluZXIucHkKQEAgLTAsMCArMSwxMjggQEAKKyMhL3Vzci9i
aW4vZW52IHB5dGhvbgorIyBDb3B5cmlnaHQgKEMpIDIwMTAgR29vZ2xlIEluYy4gQWxsIHJpZ2h0
cyByZXNlcnZlZC4KKyMKKyMgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJp
bmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisjIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRl
ZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworIyBhcmUgbWV0OgorIwor
IyAxLiAgUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92
ZSBjb3B5cmlnaHQKKyMgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRo
ZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyMgMi4gIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkg
Zm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisjICAgICBub3RpY2UsIHRo
aXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhl
CisjICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0
aCB0aGUgZGlzdHJpYnV0aW9uLgorIworIyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQ
UExFIEFORCBJVFMgQ09OVFJJQlVUT1JTICJBUyBJUyIgQU5EIEFOWQorIyBFWFBSRVNTIE9SIElN
UExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBM
SUVECisjIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBB
UlRJQ1VMQVIgUFVSUE9TRSBBUkUKKyMgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgQVBQ
TEUgT1IgSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWQorIyBESVJFQ1QsIElORElS
RUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFN
QUdFUworIyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNV
QlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisjIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9G
SVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAorIyBPTiBB
TlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJ
TElUWSwgT1IgVE9SVAorIyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklT
SU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKyMgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJ
RiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworaW1wb3J0IGJ1
Y2tldAoraW1wb3J0IGJ1aWxkZXIKKworCitjbGFzcyBSZWJhc2VsaW5lcihvYmplY3QpOgorICAg
ICIiIlJlYmFzZWxpbmVzIGFuZCBkZWR1cGVzIHJlc3VsdHMuIiIiCisgICAgZGVmIF9faW5pdF9f
KHNlbGYsIHRlc3RfZ2xvYnMsIGxvY2FsX3Jlc3VsdHMsIHJlbW90ZV9yZXN1bHRzLAorICAgICAg
ICAgICAgICAgICBsYXlvdXRfdGVzdHNfZGlyLCAqKmt3YXJncyk6CisgICAgICAgIHNlbGYuX3Rl
c3RfZ2xvYnMgPSB0ZXN0X2dsb2JzCisgICAgICAgIHNlbGYuX2V4aXN0aW5nX3Jlc3VsdHMgPSBs
b2NhbF9yZXN1bHRzCisgICAgICAgIHNlbGYuX25ld19yZXN1bHRzID0gcmVtb3RlX3Jlc3VsdHMK
KyAgICAgICAgc2VsZi5fbGF5b3V0X3Rlc3RzX2RpciA9IGxheW91dF90ZXN0c19kaXIKKyAgICAg
ICAgc2VsZi5fdmVyYm9zZSA9IGt3YXJncy5nZXQoJ3ZlcmJvc2UnLCBGYWxzZSkKKworICAgIGRl
ZiBfbWFrZV9idWNrZXRfdHJlZShzZWxmKToKKyAgICAgICAgYiA9IGJ1Y2tldC5CdWNrZXRUcmVl
KCkKKyAgICAgICAgYi5iKE5vbmUsCisgICAgICAgICAgICBiLmIoJ21hYycsCisgICAgICAgICAg
ICAgICAgYi5iKCdtYWMtc25vd2xlb3BhcmQnLAorICAgICAgICAgICAgICAgICAgICBiLmIoJ21h
Yy1sZW9wYXJkJywKKyAgICAgICAgICAgICAgICAgICAgICAgIGIuYignbWFjLXRpZ2VyJykpKSwK
KyAgICAgICAgICAgICAgICBiLmIoJ3dpbicsCisgICAgICAgICAgICAgICAgICAgIGIuYignY2hy
b21pdW0nLAorICAgICAgICAgICAgICAgICAgICAgICAgYi5iKCdjaHJvbWl1bS1tYWMnKSwKKyAg
ICAgICAgICAgICAgICAgICAgICAgIGIuYignY2hyb21pdW0td2luJywKKyAgICAgICAgICAgICAg
ICAgICAgICAgICAgICBiLmIoJ2Nocm9taXVtLXdpbi12aXN0YScsCisgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgIGIuYignY2hyb21pdW0td2luLXhwJykpLAorICAgICAgICAgICAgICAg
ICAgICAgICAgICAgIGIuYignY2hyb21pdW0tbGludXgnLAorICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICBiLmIoJ2Nocm9taXVtLWdwdScsCisgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICBiLmIoJ2Nocm9taXVtLWdwdS1saW51eCcpLAorICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgYi5iKCdjaHJvbWl1bS1ncHUtd2luJyksCisgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICBiLmIoJ2Nocm9taXVtLWdwdS1tYWMnKSkpKSkpKSwKKyAg
ICAgICAgICAgIGIuYigncXQnLAorICAgICAgICAgICAgICAgIGIuYigncXQtbGludXgnKSwKKyAg
ICAgICAgICAgICAgICBiLmIoJ3F0LW1hYycpLAorICAgICAgICAgICAgICAgIGIuYigncXQtd2lu
JykpKQorICAgICAgICAjIFRPRE8gUHV0IHRoaXMgaW4gdGhlIGNvbnN0cnVjdG9yIG9mIEJ1Y2tl
dFRyZWUoKT8KKyAgICAgICAgQUdHUkVHQVRFX0JVQ0tFVFMgPSBbJ2Nocm9taXVtJywgJ2Nocm9t
aXVtLXdpbicsICd3aW4nLCAnbWFjJywgJ3F0JywgJ2Nocm9taXVtLWdwdSddCisgICAgICAgIGZv
ciBidWNrZXRfbmFtZSBpbiBBR0dSRUdBVEVfQlVDS0VUUzoKKyAgICAgICAgICAgIGIuZ2V0X2J1
Y2tldChidWNrZXRfbmFtZSkubWFya19hc19hZ2dyZWdhdGUoKQorICAgICAgICByZXR1cm4gYgor
CisgICAgZGVmIF9zaG93X3Jlc3VsdHMoc2VsZiwgZGVzY3JpcHRpb24sIHJlc3VsdHMpOgorICAg
ICAgICBpZiBub3Qgc2VsZi5fdmVyYm9zZToKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBw
cmludCBkZXNjcmlwdGlvbgorICAgICAgICBmb3IgciBpbiByZXN1bHRzOgorICAgICAgICAgICAg
cHJpbnQgcgorCisgICAgZGVmIF90ZXN0X25hbWVzKHNlbGYpOgorICAgICAgICB0ZXN0X25hbWVz
ID0gc2V0KFtdKQorICAgICAgICBmb3IgdGVzdF9nbG9iIGluIHNlbGYuX3Rlc3RfZ2xvYnM6Cisg
ICAgICAgICAgICBuZXdfcmVzdWx0cyA9IHNlbGYuX25ld19yZXN1bHRzLnJlc3VsdHNfZm9yKHRl
c3RfZ2xvYikKKyAgICAgICAgICAgICMgVE9ETyBUaGlzIGlzIHJlYWxseSBzbG93IGFuZCBpc24n
dCBuZWNlc3NhcnkgdW5sZXNzIHdlIGFyZSBtZXJlbHkKKyAgICAgICAgICAgICMgZGVkdXBpbmcg
ZXhpc3RpbmcgcmVzdWx0cy4gSXQgc2hvdWxkIGJlIGNvbnRyb2xsZWQgYnkgYSBmbGFnLgorICAg
ICAgICAgICAgIyBvbGRfcmVzdWx0cyA9IHNlbGYuX2V4aXN0aW5nX3Jlc3VsdHMucmVzdWx0c19m
b3IodGVzdF9nbG9iKQorICAgICAgICAgICAgbmFtZXMgPSBzZXQobWFwKGxhbWJkYSByOiByLm5h
bWUoKSwgbmV3X3Jlc3VsdHMpKQorICAgICAgICAgICAgdGVzdF9uYW1lcyA9IHRlc3RfbmFtZXMu
dW5pb24obmFtZXMpCisgICAgICAgIHJldHVybiB0ZXN0X25hbWVzCisKKyAgICBkZWYgX2RlZHVw
ZShzZWxmLCByZXN1bHRzKToKKyAgICAgICAgYnQgPSBzZWxmLl9tYWtlX2J1Y2tldF90cmVlKCkK
KyAgICAgICAgZm9yIHIgaW4gcmVzdWx0czoKKyAgICAgICAgICAgIGJ0Lmluc2VydF9yZXN1bHQo
cikKKyAgICAgICAgYnQuY29sbGFwc2UoKQorICAgICAgICByZXR1cm4gYnQucmVzdWx0cygpCisK
KyAgICBkZWYgc2V0X3ZlcmJvc2Uoc2VsZiwgdmVyYm9zZSk6CisgICAgICAgIHNlbGYuX3ZlcmJv
c2UgPSB2ZXJib3NlCisKKyAgICBkZWYgZXhpc3RpbmdfcmVzdWx0cyhzZWxmLCB0ZXN0X25hbWUp
OgorICAgICAgICByZXR1cm4gc2VsZi5fZXhpc3RpbmdfcmVzdWx0cy5yZXN1bHRzX2Zvcih0ZXN0
X25hbWUpCisKKyAgICBkZWYgbmV3X3Jlc3VsdHMoc2VsZiwgdGVzdF9uYW1lKToKKyAgICAgICAg
cmV0dXJuIHNlbGYuX25ld19yZXN1bHRzLnJlc3VsdHNfZm9yKHRlc3RfbmFtZSkKKworICAgIGRl
ZiByZWJhc2VsaW5lKHNlbGYsIGRyeV9ydW49RmFsc2UpOgorICAgICAgICBmb3IgdGVzdF9uYW1l
IGluIHNlbGYuX3Rlc3RfbmFtZXMoKToKKyAgICAgICAgICAgIGZvciB0eXBlIGluIFsndGV4dCcs
ICdpbWFnZSddOgorICAgICAgICAgICAgICAgIG5ld19yZXN1bHRzID0gc2VsZi5fbmV3X3Jlc3Vs
dHMucmVzdWx0c19mb3IodGVzdF9uYW1lLCB0eXBlKQorICAgICAgICAgICAgICAgIGV4aXN0aW5n
X3Jlc3VsdHMgPSBzZWxmLl9leGlzdGluZ19yZXN1bHRzLnJlc3VsdHNfZm9yKHRlc3RfbmFtZSwg
dHlwZSkKKyAgICAgICAgICAgICAgICBpZiBsZW4obmV3X3Jlc3VsdHMpICsgbGVuKGV4aXN0aW5n
X3Jlc3VsdHMpID09IDA6CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCisKKyAgICAgICAg
ICAgICAgICBwcmludCAiUmViYXNlbGluaW5nICVzWyVzXSIgJSAodGVzdF9uYW1lLCB0eXBlKQor
CisgICAgICAgICAgICAgICAgc2VsZi5fc2hvd19yZXN1bHRzKCJuZXdfcmVzdWx0cyIsIG5ld19y
ZXN1bHRzKQorICAgICAgICAgICAgICAgIHNlbGYuX3Nob3dfcmVzdWx0cygiZXhpc3RpbmdfcmVz
dWx0cyIsIGV4aXN0aW5nX3Jlc3VsdHMpCisKKyAgICAgICAgICAgICAgICBkZWR1cGVkX3Jlc3Vs
dHMgPSBzZWxmLl9kZWR1cGUobmV3X3Jlc3VsdHMgKyBleGlzdGluZ19yZXN1bHRzKQorCisgICAg
ICAgICAgICAgICAgc2VsZi5fc2hvd19yZXN1bHRzKCJkZWR1cGVkX3Jlc3VsdHMiLCBkZWR1cGVk
X3Jlc3VsdHMpCisKKyAgICAgICAgICAgICAgICBmb3IgciBpbiBzZXQoZXhpc3RpbmdfcmVzdWx0
cykgLSBzZXQoZGVkdXBlZF9yZXN1bHRzKToKKyAgICAgICAgICAgICAgICAgICAgaWYgZHJ5X3J1
bjoKKyAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ICJkZWxldGUgJXMiICUgcgorICAgICAg
ICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICAgICAgci5kZWxldGUoKQor
CisgICAgICAgICAgICAgICAgZm9yIHIgaW4gc2V0KGRlZHVwZWRfcmVzdWx0cykgLSBzZXQoZXhp
c3RpbmdfcmVzdWx0cyk6CisgICAgICAgICAgICAgICAgICAgIGlmIGRyeV9ydW46CisgICAgICAg
ICAgICAgICAgICAgICAgICBwcmludCAiaW5zdGFsbCAlcyIgJSByCisgICAgICAgICAgICAgICAg
ICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICAgICByLmluc3RhbGwoc2VsZi5fbGF5b3V0
X3Rlc3RzX2RpcikKZGlmZiAtLWdpdCBhL1dlYktpdFRvb2xzL1NjcmlwdHMvd2Via2l0cHkvbGF5
b3V0X3Rlc3RzL3JlYmFzZWxpbmUvcmVzdWx0LnB5IGIvV2ViS2l0VG9vbHMvU2NyaXB0cy93ZWJr
aXRweS9sYXlvdXRfdGVzdHMvcmViYXNlbGluZS9yZXN1bHQucHkKbmV3IGZpbGUgbW9kZSAxMDA2
NDQKaW5kZXggMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMC4uMmM1MGRk
NTFlOWRiODczZWFkMzJhYjY3YTcyZDk4NWM0NmY2N2RkMwotLS0gL2Rldi9udWxsCisrKyBiL1dl
YktpdFRvb2xzL1NjcmlwdHMvd2Via2l0cHkvbGF5b3V0X3Rlc3RzL3JlYmFzZWxpbmUvcmVzdWx0
LnB5CkBAIC0wLDAgKzEsMTUyIEBACisjIS91c3IvYmluL2VudiBweXRob24KKyMgQ29weXJpZ2h0
IChDKSAyMDEwIEdvb2dsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisjCisjIFJlZGlzdHJp
YnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91
dAorIyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93
aW5nIGNvbmRpdGlvbnMKKyMgYXJlIG1ldDoKKyMKKyMgMS4gIFJlZGlzdHJpYnV0aW9ucyBvZiBz
b3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisjICAgICBub3RpY2Us
IHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisj
IDIuICBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFi
b3ZlIGNvcHlyaWdodAorIyAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQg
dGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorIyAgICAgZG9jdW1lbnRhdGlvbiBhbmQv
b3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyMKKyMg
VEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBBTkQgSVRTIENPTlRSSUJVVE9SUyAi
QVMgSVMiIEFORCBBTlkKKyMgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElO
RywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRAorIyBXQVJSQU5USUVTIE9GIE1FUkNI
QU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCisjIERJ
U0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIE9SIElUUyBDT05UUklCVVRPUlMgQkUg
TElBQkxFIEZPUiBBTlkKKyMgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwg
RVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMKKyMgKElOQ0xVRElORywgQlVUIE5P
VCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VT
OworIyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBU
SU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKKyMgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdI
RVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyMgKElOQ0xVRElO
RyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUg
VVNFIE9GCisjIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJ
VFkgT0YgU1VDSCBEQU1BR0UuCisKK2ltcG9ydCBvcworaW1wb3J0IHJlCisKKworY2xhc3MgUmVz
dWx0KG9iamVjdCk6CisgICAgIiIiUmVwcmVzZW50cyB0aGUgcmVzdWx0IG9mIGEgc2luZ2xlIHRl
c3Qgb24gYSBzaW5nbGUgcGxhdGZvcm0iIiIKKyAgICBkZWYgX19pbml0X18oc2VsZiwgcGxhdGZv
cm0sIHJlc3VsdF90eXBlLCBmaWxlcyk6CisgICAgICAgIHNlbGYuX3BsYXRmb3JtID0gcGxhdGZv
cm0KKyAgICAgICAgc2VsZi5fcmVzdWx0X3R5cGUgPSByZXN1bHRfdHlwZQorICAgICAgICBzZWxm
Ll9maWxlcyA9IGZpbGVzCisgICAgICAgICMgVE9ETyBTZXQgdGhpcyBmcm9tIHN1YmNsYXNzZXM/
CisgICAgICAgIHNlbGYuX21haW5fZmlsZSA9IHNlbGYuX2dldF9tYWluX2ZpbGUoKQorICAgICAg
ICBmaWxlbmFtZSA9IHNlbGYuX21haW5fZmlsZS5uYW1lKCkKKyAgICAgICAgc2VsZi5fbmFtZSA9
IHNlbGYuX2V4dHJhY3RfdGVzdF9uYW1lKGZpbGVuYW1lKQorICAgICAgICBzZWxmLl9pc19hY3R1
YWwgPSAnLWFjdHVhbC4nIGluIGZpbGVuYW1lCisKKyAgICAgICAgaWYgc2VsZi5fcGxhdGZvcm0g
aXMgTm9uZToKKyAgICAgICAgICAgIHNlbGYuX3BsYXRmb3JtID0gc2VsZi5fZXh0cmFjdF9wbGF0
Zm9ybShmaWxlbmFtZSkKKworICAgIGRlZiBfZ2V0X21haW5fZmlsZShzZWxmKToKKyAgICAgICAg
Zm9yIGZpbGUgaW4gc2VsZi5fZmlsZXM6CisgICAgICAgICAgICBpZiBmaWxlLm5hbWUoKS5lbmRz
d2l0aCgnLnR4dCcpOgorICAgICAgICAgICAgICAgIHJldHVybiBmaWxlCisgICAgICAgICAgICBl
bGlmIGZpbGUubmFtZSgpLmVuZHN3aXRoKCcuY2hlY2tzdW0nKToKKyAgICAgICAgICAgICAgICBy
ZXR1cm4gZmlsZQorICAgICAgICByYWlzZSBFeGNlcHRpb24oIkNvdWxkbid0IGxvY2F0ZSBtYWlu
IHJlc3VsdCBmaWxlLiIpCisKKyAgICBkZWYgX2V4dHJhY3RfcGxhdGZvcm0oc2VsZiwgZmlsZW5h
bWUpOgorICAgICAgICAiIiJDYWxjdWxhdGVzIHRoZSBwbGF0Zm9ybSBmcm9tIHRoZSBuYW1lIG9m
IHRoZSBmaWxlIGlmIGl0IGlzbid0IGtub3duIGFscmVhZHkiIiIKKyAgICAgICAgcGF0aCA9IHJl
LnNwbGl0KG9zLnBhdGguc2VwLCBmaWxlbmFtZSkKKyAgICAgICAgaWYgJ3BsYXRmb3JtJyBpbiBw
YXRoOgorICAgICAgICAgICAgcmV0dXJuIHBhdGhbcGF0aC5pbmRleCgncGxhdGZvcm0nKSArIDFd
CisgICAgICAgIHJldHVybiBOb25lCisKKyAgICBkZWYgX2V4dHJhY3RfdGVzdF9uYW1lKHNlbGYs
IGZpbGVuYW1lKToKKyAgICAgICAgdGVzdF9uYW1lID0gZmlsZW5hbWUKKyAgICAgICAgcGF0aCA9
IHJlLnNwbGl0KG9zLnBhdGguc2VwLCB0ZXN0X25hbWUpCisgICAgICAgIGlmICdMYXlvdXRUZXN0
cycgaW4gcGF0aDoKKyAgICAgICAgICAgIHBhdGggPSBwYXRoWzEgKyBwYXRoLmluZGV4KCdMYXlv
dXRUZXN0cycpOl0KKyAgICAgICAgaWYgJ2xheW91dC10ZXN0LXJlc3VsdHMnIGluIHBhdGg6Cisg
ICAgICAgICAgICBwYXRoID0gcGF0aFsxICsgcGF0aC5pbmRleCgnbGF5b3V0LXRlc3QtcmVzdWx0
cycpOl0KKyAgICAgICAgaWYgJ3BsYXRmb3JtJyBpbiBwYXRoOgorICAgICAgICAgICAgcGF0aCA9
IHBhdGhbMiArIHBhdGguaW5kZXgoJ3BsYXRmb3JtJyk6XQorCisgICAgICAgIHRlc3RfbmFtZSA9
IHBhdGhbLTFdCisgICAgICAgIHRlc3RfbmFtZSA9IHJlLnN1YignLWV4cGVjdGVkXC4uKiQnLCAn
JywgdGVzdF9uYW1lKQorICAgICAgICB0ZXN0X25hbWUgPSByZS5zdWIoJy1hY3R1YWxcLi4qJCcs
ICcnLCB0ZXN0X25hbWUpCisgICAgICAgIHBhdGhbLTFdID0gdGVzdF9uYW1lCisgICAgICAgIHJl
dHVybiBvcy5wYXRoLnNlcC5qb2luKHBhdGgpCisKKyAgICBkZWYgX3NldF90ZXN0X25hbWUoc2Vs
ZiwgZmlsZW5hbWUpOgorICAgICAgICBzZWxmLl90ZXN0X25hbWUgPSBmaWxlbmFtZQorICAgICAg
ICBpZiBvcy5wYXRoLnNlcCBpbiBmaWxlbmFtZToKKyAgICAgICAgICAgIHNlbGYuX3Rlc3RfbmFt
ZSA9IGZpbGVuYW1lWzpmaWxlbmFtZS5yaW5kZXgob3MucGF0aC5zZXApXQorCisgICAgZGVmIGNv
bnRlbnRzKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5fbWFpbl9maWxlLmNvbnRlbnRzKCkK
KworICAgIGRlZiBzYXZlX3RvKHNlbGYsIHBhdGgpOgorICAgICAgICBmb3IgZmlsZSBpbiBzZWxm
Ll9maWxlczoKKyAgICAgICAgICAgIGZpbGUuc2F2ZV90byhwYXRoKQorCisgICAgZGVmIGlzX2Fj
dHVhbChzZWxmKToKKyAgICAgICAgIiIiQXJlIHRoZXNlIHJlc3VsdHMgdGhlIGFjdHVhbCBvdXRw
dXQgb2YgYSB0ZXN0PyIiIgorICAgICAgICByZXR1cm4gc2VsZi5faXNfYWN0dWFsCisKKyAgICBk
ZWYgbmFtZShzZWxmKToKKyAgICAgICAgIiIiVGhlIG5hbWUgb2YgdGhpcyB0ZXN0IChkb2Vzbid0
IGluY2x1ZGUgZXh0ZW5zaW9uKSIiIgorICAgICAgICByZXR1cm4gc2VsZi5fbmFtZQorCisgICAg
ZGVmIHNhbWVfY29udGVudChzZWxmLCBvdGhlcik6CisgICAgICAgIHJldHVybiBzZWxmLmNvbnRl
bnRzKCkgPT0gb3RoZXIuY29udGVudHMoKQorCisgICAgZGVmIF9fZXFfXyhzZWxmLCBvdGhlcik6
CisgICAgICAgIHJldHVybiBzZWxmLm5hbWUoKSA9PSBvdGhlci5uYW1lKCkgYW5kIHNlbGYudHlw
ZSgpID09IG90aGVyLnR5cGUoKSBhbmQgc2VsZi5wbGF0Zm9ybSgpID09IG90aGVyLnBsYXRmb3Jt
KCkgYW5kIHNlbGYuaXNfYWN0dWFsKCkgPT0gb3RoZXIuaXNfYWN0dWFsKCkgYW5kIHNlbGYuc2Ft
ZV9jb250ZW50KG90aGVyKQorCisgICAgZGVmIF9faGFzaF9fKHNlbGYpOgorICAgICAgICByZXR1
cm4gaGFzaChzdHIoc2VsZi5uYW1lKCkpICsgc3RyKHNlbGYudHlwZSgpKSArIHN0cihzZWxmLnBs
YXRmb3JtKCkpKQorCisgICAgZGVmIGlzX25ld2VyX3RoYW4oc2VsZiwgb3RoZXIpOgorICAgICAg
ICAiIiInTmV3JyByZXN1bHRzIGFyZSB0aG9zZSBhY3R1YWxseSBjb21pbmcgZnJvbSBhIHRlc3Qu
IiIiCisgICAgICAgIHJldHVybiBzZWxmLmlzX2FjdHVhbCgpIGFuZCBub3Qgb3RoZXIuaXNfYWN0
dWFsKCkKKworICAgIGRlZiBpc19yZWJhc2VsaW5lX29mKHNlbGYsIG90aGVyKToKKyAgICAgICAg
cmV0dXJuIHNlbGYubmFtZSgpID09IG90aGVyLm5hbWUoKSBhbmQgc2VsZi50eXBlKCkgPT0gb3Ro
ZXIudHlwZSgpIGFuZCBzZWxmLnBsYXRmb3JtKCkgPT0gb3RoZXIucGxhdGZvcm0oKSBhbmQgc2Vs
Zi5pc19hY3R1YWwoKSBhbmQgKG5vdCBvdGhlci5pc19hY3R1YWwoKSkKKworICAgIGRlZiBfX3N0
cl9fKHNlbGYpOgorICAgICAgICBhY3R1YWxfc3RyID0gJ1tBXSAnIGlmIHNlbGYuaXNfYWN0dWFs
KCkgZWxzZSAnJworICAgICAgICByZXR1cm4gIlJlc3VsdFslcy8lc10gJXMlcyIgJSAoc2VsZi5f
cGxhdGZvcm0sIHNlbGYuX3Jlc3VsdF90eXBlLCBhY3R1YWxfc3RyLCBzZWxmLm5hbWUoKSkKKwor
ICAgIGRlZiB0eXBlKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5fcmVzdWx0X3R5cGUKKwor
ICAgIGRlZiBwbGF0Zm9ybShzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX3BsYXRmb3JtCisK
KyAgICBkZWYgcmV0YXJnZXQoc2VsZiwgcGxhdGZvcm0pOgorICAgICAgICByZXR1cm4gUmVzdWx0
KHBsYXRmb3JtLCBzZWxmLl9yZXN1bHRfdHlwZSwgc2VsZi5fZmlsZXMpCisKKyAgICBkZWYgX2lu
c3RhbGxfZmlsZShzZWxmLCBmaWxlLCBwYXRoKToKKyAgICAgICAgaWYgc2VsZi5fcGxhdGZvcm0g
aXMgTm9uZToKKyAgICAgICAgICAgIHBsYXRmb3JtX2NvbXBvbmVudCA9ICIiCisgICAgICAgIGVs
c2U6CisgICAgICAgICAgICBwbGF0Zm9ybV9jb21wb25lbnQgPSAicGxhdGZvcm0vJXMvIiAlIHNl
bGYuX3BsYXRmb3JtCisgICAgICAgIGV4dGVuc2lvbiA9IG9zLnBhdGguc3BsaXRleHQoZmlsZS5u
YW1lKCkpWzFdCisgICAgICAgIHBhdGggPSAnJXMvJXMnICUgKHBhdGgsIHBsYXRmb3JtX2NvbXBv
bmVudCkKKyAgICAgICAgZmlsZW5hbWUgPSBzZWxmLm5hbWUoKSArICctZXhwZWN0ZWQnICsgZXh0
ZW5zaW9uCisgICAgICAgIGZpbGUuc2F2ZV90byhwYXRoLCBmaWxlbmFtZSkKKworICAgIGRlZiBp
bnN0YWxsKHNlbGYsIHBhdGgpOgorICAgICAgICBmb3IgZmlsZSBpbiBzZWxmLl9maWxlczoKKyAg
ICAgICAgICAgIHNlbGYuX2luc3RhbGxfZmlsZShmaWxlLCBwYXRoKQorCisgICAgZGVmIGRlbGV0
ZShzZWxmKToKKyAgICAgICAgZm9yIGZpbGUgaW4gc2VsZi5fZmlsZXM6CisgICAgICAgICAgICBm
aWxlLmRlbGV0ZSgpCisKKworY2xhc3MgVGV4dFJlc3VsdChSZXN1bHQpOgorICAgICIiIlJlcHJl
c2VudHMgYSB0ZXh0IHJlc3VsdCBvZiBhIHNpbmdsZSB0ZXN0IG9uIGEgc2luZ2xlIHBsYXRmb3Jt
IiIiCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHBsYXRmb3JtLCB0ZXh0X2ZpbGUpOgorICAgICAg
ICBzdXBlcihUZXh0UmVzdWx0LCBzZWxmKS5fX2luaXRfXyhwbGF0Zm9ybSwgJ3RleHQnLCBbdGV4
dF9maWxlXSkKKworCitjbGFzcyBJbWFnZVJlc3VsdChSZXN1bHQpOgorICAgICIiIlJlcHJlc2Vu
dHMgYW4gaW1hZ2UgcmVzdWx0IG9mIGEgc2luZ2xlIHRlc3Qgb24gYSBzaW5nbGUgcGxhdGZvcm0i
IiIKKyAgICBkZWYgX19pbml0X18oc2VsZiwgcGxhdGZvcm0sIGltYWdlX2ZpbGUsIGNoZWNrc3Vt
X2ZpbGUpOgorICAgICAgICBzdXBlcihJbWFnZVJlc3VsdCwgc2VsZikuX19pbml0X18ocGxhdGZv
cm0sICdpbWFnZScsIFtpbWFnZV9maWxlLCBjaGVja3N1bV9maWxlXSkKZGlmZiAtLWdpdCBhL1dl
YktpdFRvb2xzL1NjcmlwdHMvd2Via2l0cHkvbGF5b3V0X3Rlc3RzL3JlYmFzZWxpbmUvcmVzdWx0
X3VuaXR0ZXN0LnB5IGIvV2ViS2l0VG9vbHMvU2NyaXB0cy93ZWJraXRweS9sYXlvdXRfdGVzdHMv
cmViYXNlbGluZS9yZXN1bHRfdW5pdHRlc3QucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXgg
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMC4uN2NmNTk2YmZlNGFiMDky
MzgzN2FlOGIyNTdkYTljMjYxNjE5ZTZhMwotLS0gL2Rldi9udWxsCisrKyBiL1dlYktpdFRvb2xz
L1NjcmlwdHMvd2Via2l0cHkvbGF5b3V0X3Rlc3RzL3JlYmFzZWxpbmUvcmVzdWx0X3VuaXR0ZXN0
LnB5CkBAIC0wLDAgKzEsMTEzIEBACisjIS91c3IvYmluL2VudiBweXRob24KKyMgQ29weXJpZ2h0
IChDKSAyMDEwIEdvb2dsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisjCisjIFJlZGlzdHJp
YnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91
dAorIyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93
aW5nIGNvbmRpdGlvbnMKKyMgYXJlIG1ldDoKKyMKKyMgMS4gIFJlZGlzdHJpYnV0aW9ucyBvZiBz
b3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisjICAgICBub3RpY2Us
IHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisj
IDIuICBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFi
b3ZlIGNvcHlyaWdodAorIyAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQg
dGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorIyAgICAgZG9jdW1lbnRhdGlvbiBhbmQv
b3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyMKKyMg
VEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBBTkQgSVRTIENPTlRSSUJVVE9SUyAi
QVMgSVMiIEFORCBBTlkKKyMgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElO
RywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRAorIyBXQVJSQU5USUVTIE9GIE1FUkNI
QU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCisjIERJ
U0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIE9SIElUUyBDT05UUklCVVRPUlMgQkUg
TElBQkxFIEZPUiBBTlkKKyMgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwg
RVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMKKyMgKElOQ0xVRElORywgQlVUIE5P
VCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VT
OworIyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBU
SU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKKyMgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdI
RVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyMgKElOQ0xVRElO
RyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUg
VVNFIE9GCisjIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJ
VFkgT0YgU1VDSCBEQU1BR0UuCisKK2ltcG9ydCByZQoraW1wb3J0IHJlc3VsdAoraW1wb3J0IHVu
aXR0ZXN0CisKKworY2xhc3MgRmFrZUZpbGUob2JqZWN0KToKKyAgICBkZWYgX19pbml0X18oc2Vs
ZiwgZmlsZW5hbWUsIGNvbnRlbnRzPSJmYWtlIGNvbnRlbnRzIik6CisgICAgICAgIHNlbGYuX2Zp
bGVuYW1lID0gZmlsZW5hbWUKKyAgICAgICAgc2VsZi5fY29udGVudHMgPSBjb250ZW50cworCisg
ICAgZGVmIG5hbWUoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLl9maWxlbmFtZQorCisgICAg
ZGVmIGNvbnRlbnRzKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5fY29udGVudHMKKworCitj
bGFzcyBGYWtlUmVzdWx0KHJlc3VsdC5SZXN1bHQpOgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBw
bGF0Zm9ybSwgcmVzdWx0X3R5cGUsIGNvbnRlbnRzLCBpc19leHBlY3RlZD1GYWxzZSk6CisgICAg
ICAgIHNlbGYuX2NvbnRlbnRzID0gY29udGVudHMKKyAgICAgICAgYWN0dWFsID0gJ2FjdHVhbCcK
KyAgICAgICAgaWYgaXNfZXhwZWN0ZWQ6CisgICAgICAgICAgICBhY3R1YWwgPSAnZXhwZWN0ZWQn
CisgICAgICAgIHRlc3RfbmFtZSA9ICdhbm9ueW1vdXMtdGVzdC0lcy50eHQnICUgYWN0dWFsCisg
ICAgICAgIGZpbGUgPSBGYWtlRmlsZSh0ZXN0X25hbWUsIGNvbnRlbnRzKQorICAgICAgICBzdXBl
cihGYWtlUmVzdWx0LCBzZWxmKS5fX2luaXRfXyhwbGF0Zm9ybSwgcmVzdWx0X3R5cGUsIFtmaWxl
XSkKKworICAgIGRlZiBjb250ZW50cyhzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX2NvbnRl
bnRzCisKKworY2xhc3MgUmVzdWx0VGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgZGVmIF9j
aGVja19uYW1lKHNlbGYsIGZpbGVuYW1lLCBleHBlY3RlZF90ZXN0X25hbWUpOgorICAgICAgICBy
ID0gcmVzdWx0LlJlc3VsdChOb25lLCBOb25lLCBbRmFrZUZpbGUoZmlsZW5hbWUpXSkKKyAgICAg
ICAgc2VsZi5hc3NlcnRFcXVhbHMoZXhwZWN0ZWRfdGVzdF9uYW1lLCByLm5hbWUoKSkKKworICAg
IGRlZiBfY2hlY2tfcGxhdGZvcm0oc2VsZiwgZmlsZW5hbWUsIGV4cGVjdGVkX3BsYXRmb3JtKToK
KyAgICAgICAgciA9IHJlc3VsdC5SZXN1bHQoTm9uZSwgTm9uZSwgW0Zha2VGaWxlKGZpbGVuYW1l
KV0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKGV4cGVjdGVkX3BsYXRmb3JtLCByLnBsYXRm
b3JtKCkpCisKKyAgICBkZWYgdGVzdEV4dHJhY3RzTmFtZUNvcnJlY3RseShzZWxmKToKKyAgICAg
ICAgc2VsZi5fY2hlY2tfbmFtZSgnTGF5b3V0VGVzdHMvZmFzdC9kb20vYS1leHBlY3RlZC50eHQn
LCAnZmFzdC9kb20vYScpCisgICAgICAgIHNlbGYuX2NoZWNrX25hbWUoJ0xheW91dFRlc3RzL2Zh
c3QvZG9tL2EtYWN0dWFsLnR4dCcsICdmYXN0L2RvbS9hJykKKyAgICAgICAgc2VsZi5fY2hlY2tf
bmFtZSgnTGF5b3V0VGVzdHMvcGxhdGZvcm0vd2luL2Zhc3QvYS1leHBlY3RlZC50eHQnLCAnZmFz
dC9hJykKKyAgICAgICAgc2VsZi5fY2hlY2tfbmFtZSgnTGF5b3V0VGVzdHMvcGxhdGZvcm0vd2lu
L2Zhc3QvYS1leHBlY3RlZC5jaGVja3N1bScsICdmYXN0L2EnKQorICAgICAgICBzZWxmLl9jaGVj
a19uYW1lKCdmYXN0L2RvbS90ZXN0LWV4cGVjdGVkLnR4dCcsICdmYXN0L2RvbS90ZXN0JykKKyAg
ICAgICAgc2VsZi5fY2hlY2tfbmFtZSgnbGF5b3V0LXRlc3QtcmVzdWx0cy9mYXN0L2EtYWN0dWFs
LmNoZWNrc3VtJywgJ2Zhc3QvYScpCisKKyAgICBkZWYgdGVzdEV4dHJhY3RzUGxhdGZvcm1Db3Jy
ZWN0bHkoc2VsZik6CisgICAgICAgIHNlbGYuX2NoZWNrX3BsYXRmb3JtKCdMYXlvdXRUZXN0cy9w
bGF0Zm9ybS93aW4vZmFzdC9hLWV4cGVjdGVkLnR4dCcsICd3aW4nKQorICAgICAgICBzZWxmLl9j
aGVja19wbGF0Zm9ybSgncGxhdGZvcm0vd2luL2Zhc3QvYS1leHBlY3RlZC50eHQnLCAnd2luJykK
KyAgICAgICAgc2VsZi5fY2hlY2tfcGxhdGZvcm0oJ3BsYXRmb3JtL21hYy9mYXN0L2EtZXhwZWN0
ZWQudHh0JywgJ21hYycpCisgICAgICAgIHNlbGYuX2NoZWNrX3BsYXRmb3JtKCdmYXN0L2EtZXhw
ZWN0ZWQudHh0JywgTm9uZSkKKworICAgIGRlZiB0ZXN0UmVzdWx0c0Zyb21BbkFjdHVhbEZpbGVB
cmVNYXJrZWRBc1N1Y2goc2VsZik6CisgICAgICAgIHIgPSByZXN1bHQuUmVzdWx0KE5vbmUsICd0
ZXh0JywgW0Zha2VGaWxlKCd0ZXN0LWFjdHVhbC50eHQnKV0pCisgICAgICAgIHNlbGYuYXNzZXJ0
VHJ1ZShyLmlzX2FjdHVhbCgpKQorCisgICAgZGVmIHRlc3RSZXN1bHRzRnJvbUFuRXhwZWN0ZWRG
aWxlQXJlTm90QWN0dWFsKHNlbGYpOgorICAgICAgICByID0gcmVzdWx0LlJlc3VsdChOb25lLCAn
dGV4dCcsIFtGYWtlRmlsZSgndGVzdC1leHBlY3RlZC50eHQnKV0pCisgICAgICAgIHNlbGYuYXNz
ZXJ0RmFsc2Uoci5pc19hY3R1YWwoKSkKKworICAgIGRlZiB0ZXN0SXNSZWJhc2VsaW5lT2Yoc2Vs
Zik6CisgICAgICAgIGV4cGVjdGVkID0gcmVzdWx0LlJlc3VsdCgnbWFjJywgJ3RleHQnLCBbRmFr
ZUZpbGUoJ3Rlc3QtZXhwZWN0ZWQudHh0JyldKQorICAgICAgICBhY3R1YWwgPSByZXN1bHQuUmVz
dWx0KCdtYWMnLCAndGV4dCcsIFtGYWtlRmlsZSgndGVzdC1hY3R1YWwudHh0JyldKQorICAgICAg
ICBzZWxmLmFzc2VydFRydWUoYWN0dWFsLmlzX3JlYmFzZWxpbmVfb2YoZXhwZWN0ZWQpKQorICAg
ICAgICBzZWxmLmFzc2VydEZhbHNlKGV4cGVjdGVkLmlzX3JlYmFzZWxpbmVfb2YoYWN0dWFsKSkK
KworICAgIGRlZiB0ZXN0X19lcV9fKHNlbGYpOgorICAgICAgICByMSA9IHJlc3VsdC5SZXN1bHQo
J21hYycsICd0ZXh0JywgW0Zha2VGaWxlKCd0ZXN0LWV4cGVjdGVkLnR4dCcsICdjb250ZW50cycp
XSkKKyAgICAgICAgcjIgPSByZXN1bHQuUmVzdWx0KCdtYWMnLCAndGV4dCcsIFtGYWtlRmlsZSgn
dGVzdC1leHBlY3RlZC50eHQnLCAnY29udGVudHMnKV0pCisgICAgICAgIHIzID0gcmVzdWx0LlJl
c3VsdCgnd2luJywgJ3RleHQnLCBbRmFrZUZpbGUoJ3Rlc3QtZXhwZWN0ZWQudHh0JywgJ2NvbnRl
bnRzJyldKQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKHIxLCByMikKKyAgICAgICAgc2Vs
Zi5hc3NlcnRFcXVhbHMocjEsIHIyLnJldGFyZ2V0KCdtYWMnKSkKKyAgICAgICAgc2VsZi5hc3Nl
cnROb3RFcXVhbHMocjEsIHIyLnJldGFyZ2V0KCd3aW4nKSkKKworICAgIGRlZiB0ZXN0X19oYXNo
X18oc2VsZik6CisgICAgICAgIHIxID0gcmVzdWx0LlJlc3VsdCgnbWFjJywgJ3RleHQnLCBbRmFr
ZUZpbGUoJ3Rlc3QtZXhwZWN0ZWQudHh0JywgJ2NvbnRlbnRzJyldKQorICAgICAgICByMiA9IHJl
c3VsdC5SZXN1bHQoJ21hYycsICd0ZXh0JywgW0Zha2VGaWxlKCd0ZXN0LWV4cGVjdGVkLnR4dCcs
ICdjb250ZW50cycpXSkKKyAgICAgICAgcjMgPSByZXN1bHQuUmVzdWx0KE5vbmUsIE5vbmUsIFtG
YWtlRmlsZSgndGVzdC1leHBlY3RlZC50eHQnLCBOb25lKV0pCisKKyAgICAgICAgeCA9IHNldChb
cjEsIHIyXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoMSwgbGVuKHNldChbcjEsIHIyXSkp
KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscygyLCBsZW4oc2V0KFtyMSwgcjIsIHIzXSkpKQor
CisKK2lmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CisgICAgdW5pdHRlc3QubWFpbigpCmRpZmYg
LS1naXQgYS9XZWJLaXRUb29scy9TY3JpcHRzL3dlYmtpdHB5L3Rvb2wvY29tbWFuZHMvX19pbml0
X18ucHkgYi9XZWJLaXRUb29scy9TY3JpcHRzL3dlYmtpdHB5L3Rvb2wvY29tbWFuZHMvX19pbml0
X18ucHkKaW5kZXggZDJhYTUwM2QxODU2MWRlYWIyY2FlNzAwZGY2ZDQ5M2E5YjA1ZmNmMy4uMWRi
YzcyZTM2ZjkwNTdjZTYyZDE2YWJhODYwYWYzNTkxOWZmYmUwYiAxMDA2NDQKLS0tIGEvV2ViS2l0
VG9vbHMvU2NyaXB0cy93ZWJraXRweS90b29sL2NvbW1hbmRzL19faW5pdF9fLnB5CisrKyBiL1dl
YktpdFRvb2xzL1NjcmlwdHMvd2Via2l0cHkvdG9vbC9jb21tYW5kcy9fX2luaXRfXy5weQpAQCAt
Nyw2ICs3LDcgQEAgZnJvbSB3ZWJraXRweS50b29sLmNvbW1hbmRzLnByZXR0eWRpZmYgaW1wb3J0
IFByZXR0eURpZmYKIGZyb20gd2Via2l0cHkudG9vbC5jb21tYW5kcy5xdWVyaWVzIGltcG9ydCAq
CiBmcm9tIHdlYmtpdHB5LnRvb2wuY29tbWFuZHMucXVldWVzIGltcG9ydCAqCiBmcm9tIHdlYmtp
dHB5LnRvb2wuY29tbWFuZHMucmViYXNlbGluZSBpbXBvcnQgUmViYXNlbGluZQorZnJvbSB3ZWJr
aXRweS50b29sLmNvbW1hbmRzLnJlYmFzZWxpbmUyIGltcG9ydCBSZWJhc2VsaW5lMgogZnJvbSB3
ZWJraXRweS50b29sLmNvbW1hbmRzLnJlYmFzZWxpbmVzZXJ2ZXIgaW1wb3J0IFJlYmFzZWxpbmVT
ZXJ2ZXIKIGZyb20gd2Via2l0cHkudG9vbC5jb21tYW5kcy5zaGVyaWZmYm90IGltcG9ydCAqCiBm
cm9tIHdlYmtpdHB5LnRvb2wuY29tbWFuZHMudXBsb2FkIGltcG9ydCAqCmRpZmYgLS1naXQgYS9X
ZWJLaXRUb29scy9TY3JpcHRzL3dlYmtpdHB5L3Rvb2wvY29tbWFuZHMvcmViYXNlbGluZTIucHkg
Yi9XZWJLaXRUb29scy9TY3JpcHRzL3dlYmtpdHB5L3Rvb2wvY29tbWFuZHMvcmViYXNlbGluZTIu
cHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMC4uMTE3YWVhODhiZjQ3ZjU4ZGM1YjFjMmRlNzQzZGY0NWE4ZDA3MzMxNAot
LS0gL2Rldi9udWxsCisrKyBiL1dlYktpdFRvb2xzL1NjcmlwdHMvd2Via2l0cHkvdG9vbC9jb21t
YW5kcy9yZWJhc2VsaW5lMi5weQpAQCAtMCwwICsxLDgyIEBACisjIENvcHlyaWdodCAoYykgMjAx
MCBHb29nbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorIworIyBSZWRpc3RyaWJ1dGlvbiBh
bmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyMgbW9k
aWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25k
aXRpb25zIGFyZQorIyBtZXQ6CisjCisjICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2Ug
Y29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisjIG5vdGljZSwgdGhpcyBsaXN0
IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyMgICAgICogUmVk
aXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorIyBj
b3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2lu
ZyBkaXNjbGFpbWVyCisjIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlh
bHMgcHJvdmlkZWQgd2l0aCB0aGUKKyMgZGlzdHJpYnV0aW9uLgorIyAgICAgKiBOZWl0aGVyIHRo
ZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisjIGNvbnRyaWJ1dG9y
cyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9t
CisjIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Np
b24uCisjCisjIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xE
RVJTIEFORCBDT05UUklCVVRPUlMKKyMgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElF
RCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyMgTElNSVRFRCBUTywgVEhFIElNUExJ
RUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisjIEEgUEFS
VElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09Q
WVJJR0hUCisjIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1Qs
IElORElSRUNULCBJTkNJREVOVEFMLAorIyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVF
TlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisjIExJTUlURUQgVE8sIFBST0NVUkVN
RU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorIyBEQVRB
LCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFO
RCBPTiBBTlkKKyMgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RS
SUNUIExJQUJJTElUWSwgT1IgVE9SVAorIyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJX
SVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyMgT0YgVEhJUyBTT0ZUV0FS
RSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKwor
ZnJvbSB3ZWJraXRweS5sYXlvdXRfdGVzdHMucG9ydCBpbXBvcnQgZmFjdG9yeQorZnJvbSB3ZWJr
aXRweS50b29sLm11bHRpY29tbWFuZHRvb2wgaW1wb3J0IEFic3RyYWN0RGVjbGFyYXRpdmVDb21t
YW5kCitmcm9tIHdlYmtpdHB5LmxheW91dF90ZXN0cy5yZWJhc2VsaW5lLnJlYmFzZWxpbmVyIGlt
cG9ydCBSZWJhc2VsaW5lcgorZnJvbSB3ZWJraXRweS5sYXlvdXRfdGVzdHMucmViYXNlbGluZS5i
dWlsZGVyIGltcG9ydCBCdWlsZGVyLCBDaHJvbWl1bUJ1aWxkZXIsIFdlYktpdEJ1aWxkZXIKKwor
ZnJvbSBvcHRwYXJzZSBpbXBvcnQgbWFrZV9vcHRpb24KKworCitjbGFzcyBSZWJhc2VsaW5lMihB
YnN0cmFjdERlY2xhcmF0aXZlQ29tbWFuZCk6CisgICAgbmFtZSA9ICJyZWJhc2VsaW5lMiIKKyAg
ICBoZWxwX3RleHQgPSAiRmV0Y2hlcyBuZXcgZXhwZWN0ZWQgcmVzdWx0cyBmcm9tIGJ1aWxkYm90
cy4iCisKKyAgICBkZWYgX19pbml0X18oc2VsZik6CisgICAgICAgIG9wdGlvbnMgPSBbCisgICAg
ICAgICAgICBtYWtlX29wdGlvbigiLS1wbGF0Zm9ybXMiLCBhY3Rpb249InN0b3JlIiwgZGVzdD0i
cGxhdGZvcm1zIiwgaGVscD0iQ29tbWEgc2VwYXJhdGVkIGxpc3Qgb2YgdGhlIHBsYXRmb3JtcyB0
byByZWJhc2VsaW5lIGZvci4iKSwKKyAgICAgICAgICAgIG1ha2Vfb3B0aW9uKCItLWNocm9taXVt
IiwgYWN0aW9uPSJzdG9yZV90cnVlIiwgZGVzdD0idXNlX2Nocm9taXVtX2JvdHMiLCBoZWxwPSJG
ZXRjaCByZXN1bHRzIGZyb20gdGhlIENocm9taXVtIGJvdHMuIiksCisgICAgICAgICAgICBtYWtl
X29wdGlvbigiLS13ZWJraXQiLCBhY3Rpb249InN0b3JlX2ZhbHNlIiwgZGVzdD0idXNlX2Nocm9t
aXVtX2JvdHMiLCBoZWxwPSJGZXRjaCByZXN1bHRzIGZyb20gdGhlIFdlYktpdCBib3RzIChkZWZh
dWx0KS4iKSwKKyAgICAgICAgICAgIG1ha2Vfb3B0aW9uKCItLWxpc3QtYnVpbGRlcnMiLCBhY3Rp
b249InN0b3JlX3RydWUiLCBkZXN0PSJsaXN0X2J1aWxkZXJzIiwgaGVscD0iTGlzdCB0aGUgYnVp
bGRlcnMgZm9yIGVhY2ggcGxhdGZvcm0uIiksCisgICAgICAgICAgICBtYWtlX29wdGlvbigiLS1s
aXN0LWFyY2hpdmVzIiwgYWN0aW9uPSJzdG9yZV90cnVlIiwgZGVzdD0ibGlzdF9hcmNoaXZlcyIs
IGhlbHA9IlNob3cgdGhlIFVSTHMgb2YgdGhlIHRlc3QgcmVzdWx0IGFyY2hpdmVzLiIpLAorICAg
ICAgICAgICAgbWFrZV9vcHRpb24oIi0tc2hvdy1hcmNoaXZlcyIsIGFjdGlvbj0ic3RvcmVfdHJ1
ZSIsIGRlc3Q9InNob3dfYXJjaGl2ZXMiLCBoZWxwPSJTaG93IHRoZSByZXN1bHRzIHN0b3JlZCBp
biB0aGUgc3BlY2lmaWVkIGFyY2hpdmVzLiIpLAorICAgICAgICBdCisgICAgICAgIEFic3RyYWN0
RGVjbGFyYXRpdmVDb21tYW5kLl9faW5pdF9fKHNlbGYsIG9wdGlvbnM9b3B0aW9ucykKKworICAg
IGRlZiBleGVjdXRlKHNlbGYsIG9wdGlvbnMsIGFyZ3MsIHRvb2wpOgorICAgICAgICBidWlsZGVy
ID0gQ2hyb21pdW1CdWlsZGVyKCkgaWYgb3B0aW9ucy51c2VfY2hyb21pdW1fYm90cyBlbHNlIFdl
YktpdEJ1aWxkZXIoKQorICAgICAgICBpZiBvcHRpb25zLmxpc3RfYnVpbGRlcnM6CisgICAgICAg
ICAgICBmb3IgcGxhdGZvcm0gaW4gYnVpbGRlci5wbGF0Zm9ybXMoKToKKyAgICAgICAgICAgICAg
ICBwcmludCAiJXNcdC0+XHQlcyIgJSAocGxhdGZvcm0sIGJ1aWxkZXIubG9va3VwX2J1aWxkZXJf
bmFtZShwbGF0Zm9ybSkpCisgICAgICAgICAgICBleGl0KCkKKworICAgICAgICBpZiBvcHRpb25z
LnBsYXRmb3JtczoKKyAgICAgICAgICAgIHBsYXRmb3JtcyA9IG9wdGlvbnMucGxhdGZvcm1zLnNw
bGl0KCcsJykKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHBsYXRmb3JtcyA9IE5vbmUKKwor
ICAgICAgICBpZiBvcHRpb25zLmxpc3RfYXJjaGl2ZXM6CisgICAgICAgICAgICBmb3IgcGxhdGZv
cm0gaW4gYnVpbGRlci5wbGF0Zm9ybXMoKToKKyAgICAgICAgICAgICAgICBidWlsZGVyX25hbWUg
PSBidWlsZGVyLmxvb2t1cF9idWlsZGVyX25hbWUocGxhdGZvcm0pCisgICAgICAgICAgICAgICAg
cHJpbnQgIiVzXHQtPlx0JXMiICUgKHBsYXRmb3JtLCBidWlsZGVyLmxvb2t1cF9yZXN1bHRfemlw
KGJ1aWxkZXJfbmFtZSkpCisgICAgICAgICAgICBleGl0KCkKKworICAgICAgICBpZiBvcHRpb25z
LnNob3dfYXJjaGl2ZXM6CisgICAgICAgICAgICBwYXR0ZXJuID0gJycgaWYgbGVuKGFyZ3MpID09
IDAgZWxzZSBhcmdzWzBdCisgICAgICAgICAgICBmb3IgcGxhdGZvcm0gaW4gYnVpbGRlci5wbGF0
Zm9ybXMoKToKKyAgICAgICAgICAgICAgICBmb3IgciBpbiBidWlsZGVyLmJ1aWxkZXIocGxhdGZv
cm0pLnJlc3VsdHNfZm9yKHBhdHRlcm4pOgorICAgICAgICAgICAgICAgICAgICBwcmludCByCisg
ICAgICAgICAgICBleGl0KCkKKworICAgICAgICByZW1vdGVfYnVpbGRlcnMgPSBidWlsZGVyLmJ1
aWxkZXJzKHBsYXRmb3JtcykKKworICAgICAgICBsYXlvdXRfdGVzdHNfZGlyID0gZmFjdG9yeS5n
ZXQoKS5sYXlvdXRfdGVzdHNfZGlyKCkKKyAgICAgICAgbG9jYWxfYnVpbGRlcnMgPSBCdWlsZGVy
LmZyb21fcGF0aChsYXlvdXRfdGVzdHNfZGlyKQorICAgICAgICByYiA9IFJlYmFzZWxpbmVyKGFy
Z3MsIGxvY2FsX2J1aWxkZXJzLCByZW1vdGVfYnVpbGRlcnMsIGxheW91dF90ZXN0c19kaXIpCisg
ICAgICAgIHJiLnJlYmFzZWxpbmUob3B0aW9ucy5kcnlfcnVuKQo=
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>74983</attachid>
            <date>2010-11-28 19:11:24 -0800</date>
            <delta_ts>2010-12-01 03:19:24 -0800</delta_ts>
            <desc>Patch</desc>
            <filename>bug-50098-20101129141121.patch</filename>
            <type>text/plain</type>
            <size>70004</size>
            <attacher name="James Kozianski">koz</attacher>
            
              <data encoding="base64">ZGlmZiAtLWdpdCBhL1dlYktpdFRvb2xzL0NoYW5nZUxvZyBiL1dlYktpdFRvb2xzL0NoYW5nZUxv
ZwppbmRleCA1NWNlZGFlM2ZjNGRhNGQzZmNkNDIyNGQ4MzU3ZjQyNDhiZTJiOWQyLi5lMWM2YThj
Zjg5NmE0NTdmMDBiMWVlYmI4MWEzNmQyNDI2OGY3ZWQ0IDEwMDY0NAotLS0gYS9XZWJLaXRUb29s
cy9DaGFuZ2VMb2cKKysrIGIvV2ViS2l0VG9vbHMvQ2hhbmdlTG9nCkBAIC0xLDMgKzEsMjMgQEAK
KzIwMTAtMTEtMjUgIEphbWVzIEtvemlhbnNraSAgPGtvekBjaHJvbWl1bS5vcmc+CisKKyAgICAg
ICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChPT1BTISkuCisKKyAgICAgICAgTmV3IHdlYmtpdC1wYXRj
aCByZWJhc2VsaW5lMiBjb21tYW5kLgorICAgICAgICBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9z
aG93X2J1Zy5jZ2k/aWQ9NTAwOTgKKworICAgICAgICAqIFNjcmlwdHMvd2Via2l0cHkvbGF5b3V0
X3Rlc3RzL3JlYmFzZWxpbmUvX19pbml0X18ucHk6IEFkZGVkLgorICAgICAgICAqIFNjcmlwdHMv
d2Via2l0cHkvbGF5b3V0X3Rlc3RzL3JlYmFzZWxpbmUvYWxsX3Rlc3RzLnB5OiBBZGRlZC4KKyAg
ICAgICAgKiBTY3JpcHRzL3dlYmtpdHB5L2xheW91dF90ZXN0cy9yZWJhc2VsaW5lL2J1Y2tldC5w
eTogQWRkZWQuCisgICAgICAgICogU2NyaXB0cy93ZWJraXRweS9sYXlvdXRfdGVzdHMvcmViYXNl
bGluZS9idWNrZXRfdW5pdHRlc3QucHk6IEFkZGVkLgorICAgICAgICAqIFNjcmlwdHMvd2Via2l0
cHkvbGF5b3V0X3Rlc3RzL3JlYmFzZWxpbmUvYnVpbGRlci5weTogQWRkZWQuCisgICAgICAgICog
U2NyaXB0cy93ZWJraXRweS9sYXlvdXRfdGVzdHMvcmViYXNlbGluZS9idWlsZGVyX3VuaXR0ZXN0
LnB5OiBBZGRlZC4KKyAgICAgICAgKiBTY3JpcHRzL3dlYmtpdHB5L2xheW91dF90ZXN0cy9yZWJh
c2VsaW5lL2ludGVncmF0aW9uX3VuaXR0ZXN0LnB5OiBBZGRlZC4KKyAgICAgICAgKiBTY3JpcHRz
L3dlYmtpdHB5L2xheW91dF90ZXN0cy9yZWJhc2VsaW5lL3JlYmFzZWxpbmVyLnB5OiBBZGRlZC4K
KyAgICAgICAgKiBTY3JpcHRzL3dlYmtpdHB5L2xheW91dF90ZXN0cy9yZWJhc2VsaW5lL3Jlc3Vs
dC5weTogQWRkZWQuCisgICAgICAgICogU2NyaXB0cy93ZWJraXRweS9sYXlvdXRfdGVzdHMvcmVi
YXNlbGluZS9yZXN1bHRfdW5pdHRlc3QucHk6IEFkZGVkLgorICAgICAgICAqIFNjcmlwdHMvd2Vi
a2l0cHkvdG9vbC9jb21tYW5kcy9fX2luaXRfXy5weToKKyAgICAgICAgKiBTY3JpcHRzL3dlYmtp
dHB5L3Rvb2wvY29tbWFuZHMvcmViYXNlbGluZTIucHk6IEFkZGVkLgorCiAyMDEwLTExLTI0ICBO
aWNvbGFzIER1ZnJlc25lICA8bmljb2xhcy5kdWZyZXNuZUBjb2xsYWJvcmEuY28udWs+CiAKICAg
ICAgICAgUmV2aWV3ZWQgYnkgTWFydGluIFJvYmluc29uLgpkaWZmIC0tZ2l0IGEvV2ViS2l0VG9v
bHMvU2NyaXB0cy93ZWJraXRweS9sYXlvdXRfdGVzdHMvcmViYXNlbGluZS9fX2luaXRfXy5weSBi
L1dlYktpdFRvb2xzL1NjcmlwdHMvd2Via2l0cHkvbGF5b3V0X3Rlc3RzL3JlYmFzZWxpbmUvX19p
bml0X18ucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMC4uZWY2NWJlZTViYjc3ZTk2ZWJjN2NkOWM0NzY0MDY5MGZiZGE4
YWMxOQotLS0gL2Rldi9udWxsCisrKyBiL1dlYktpdFRvb2xzL1NjcmlwdHMvd2Via2l0cHkvbGF5
b3V0X3Rlc3RzL3JlYmFzZWxpbmUvX19pbml0X18ucHkKQEAgLTAsMCArMSBAQAorIyBSZXF1aXJl
ZCBmb3IgUHl0aG9uIHRvIHNlYXJjaCB0aGlzIGRpcmVjdG9yeSBmb3IgbW9kdWxlIGZpbGVzCmRp
ZmYgLS1naXQgYS9XZWJLaXRUb29scy9TY3JpcHRzL3dlYmtpdHB5L2xheW91dF90ZXN0cy9yZWJh
c2VsaW5lL2FsbF90ZXN0cy5weSBiL1dlYktpdFRvb2xzL1NjcmlwdHMvd2Via2l0cHkvbGF5b3V0
X3Rlc3RzL3JlYmFzZWxpbmUvYWxsX3Rlc3RzLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4
IDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAuLmI4NWViMTU0N2YyYmE2
ODIyMTY2ZTExMzc5MzU3Mzc3ODQ4YjE3MjIKLS0tIC9kZXYvbnVsbAorKysgYi9XZWJLaXRUb29s
cy9TY3JpcHRzL3dlYmtpdHB5L2xheW91dF90ZXN0cy9yZWJhc2VsaW5lL2FsbF90ZXN0cy5weQpA
QCAtMCwwICsxLDcgQEAKK2Zyb20gYnVpbGRlcl91bml0dGVzdCBpbXBvcnQgKgorZnJvbSByZXN1
bHRfdW5pdHRlc3QgaW1wb3J0ICoKK2Zyb20gYnVja2V0X3VuaXR0ZXN0IGltcG9ydCAqCitmcm9t
IGludGVncmF0aW9uX3VuaXR0ZXN0IGltcG9ydCAqCitpbXBvcnQgdW5pdHRlc3QKKwordW5pdHRl
c3QubWFpbigpCmRpZmYgLS1naXQgYS9XZWJLaXRUb29scy9TY3JpcHRzL3dlYmtpdHB5L2xheW91
dF90ZXN0cy9yZWJhc2VsaW5lL2J1Y2tldC5weSBiL1dlYktpdFRvb2xzL1NjcmlwdHMvd2Via2l0
cHkvbGF5b3V0X3Rlc3RzL3JlYmFzZWxpbmUvYnVja2V0LnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0
CmluZGV4IDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAuLjFiZjYyOWVj
ZDYwNjViZWViYzlkMzM5MzkyZTQwMTlmODM0MzM4ZGEKLS0tIC9kZXYvbnVsbAorKysgYi9XZWJL
aXRUb29scy9TY3JpcHRzL3dlYmtpdHB5L2xheW91dF90ZXN0cy9yZWJhc2VsaW5lL2J1Y2tldC5w
eQpAQCAtMCwwICsxLDIyOSBAQAorIyEvdXNyL2Jpbi9lbnYgcHl0aG9uCisjIENvcHlyaWdodCAo
QykgMjAxMCBHb29nbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorIworIyBSZWRpc3RyaWJ1
dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQK
KyMgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2lu
ZyBjb25kaXRpb25zCisjIGFyZSBtZXQ6CisjCisjIDEuICBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291
cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorIyAgICAgbm90aWNlLCB0
aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorIyAy
LiAgUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92
ZSBjb3B5cmlnaHQKKyMgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRo
ZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyMgICAgIGRvY3VtZW50YXRpb24gYW5kL29y
IG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisjCisjIFRI
SVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgQU5EIElUUyBDT05UUklCVVRPUlMgIkFT
IElTIiBBTkQgQU5ZCisjIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcs
IEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQKKyMgV0FSUkFOVElFUyBPRiBNRVJDSEFO
VEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQorIyBESVND
TEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBPUiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJ
QUJMRSBGT1IgQU5ZCisjIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVY
RU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCisjIChJTkNMVURJTkcsIEJVVCBOT1Qg
TElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsK
KyMgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElP
TikgSE9XRVZFUiBDQVVTRUQgQU5ECisjIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVU
SEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisjIChJTkNMVURJTkcg
TkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVT
RSBPRgorIyBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZ
IE9GIFNVQ0ggREFNQUdFLgorCisKK2NsYXNzIEluZGVudGVkTG9nZ2VyKG9iamVjdCk6CisgICAg
IiIiTG9nZ2VyIHRoYXQgcHJpbnRzIGluZGVudGVkIG1lc3NhZ2VzIiIiCisgICAgZGVmIF9faW5p
dF9fKHNlbGYsIGxvZ2dlcj1Ob25lKToKKyAgICAgICAgc2VsZi5fbG9nZ2VyID0gbG9nZ2VyCisg
ICAgICAgIHNlbGYuX2luZGVudCA9IDAKKworICAgIGRlZiBpbmRlbnQoc2VsZik6CisgICAgICAg
IHNlbGYuX2luZGVudCArPSAxCisKKyAgICBkZWYgb3V0ZGVudChzZWxmKToKKyAgICAgICAgc2Vs
Zi5faW5kZW50IC09IDEKKworICAgIGRlZiBsb2coc2VsZiwgbWVzc2FnZSk6CisgICAgICAgIG1l
c3NhZ2UgPSAnICAnICogc2VsZi5faW5kZW50ICsgbWVzc2FnZQorICAgICAgICBpZiBzZWxmLl9s
b2dnZXIgaXMgTm9uZToKKyAgICAgICAgICAgIHByaW50IG1lc3NhZ2UKKyAgICAgICAgZWxzZToK
KyAgICAgICAgICAgIHNlbGYuX2xvZ2dlcihtZXNzYWdlKQorCisKK2NsYXNzIEJ1Y2tldChvYmpl
Y3QpOgorICAgICIiIkJ1Y2tldHMgaG9sZCBvdGhlciBidWNrZXRzIGluIGEgdHJlZSB0aGF0IHJl
ZmxlY3RzIHRoZSB0ZXN0IGZhbGxiYWNrCisgICAgICAgb3JkZXIuIiIiCisgICAgZGVmIF9faW5p
dF9fKHNlbGYsIG5hbWUpOgorICAgICAgICBzZWxmLl9uYW1lID0gbmFtZQorICAgICAgICBzZWxm
Ll9jaGlsZHJlbiA9IFtdCisgICAgICAgIHNlbGYuX3Jlc3VsdCA9IE5vbmUKKyAgICAgICAgc2Vs
Zi5faW1wbGljaXRfcmVzdWx0ID0gTm9uZQorICAgICAgICAjIEFnZ3JlZ2F0ZSBidWNrZXRzIGRv
bid0IGdldCByZXN1bHRzIGRpcmVjdGx5IGZyb20gYnVpbGRib3QuCisgICAgICAgIHNlbGYuX2lz
X2FnZ3JlZ2F0ZSA9IEZhbHNlCisKKyAgICBkZWYgX29uX2NoYW5nZWQoc2VsZik6CisgICAgICAg
IGZvciBjaGlsZCBpbiBzZWxmLl9jaGlsZHJlbjoKKyAgICAgICAgICAgIGNoaWxkLnNldF9pbXBs
aWNpdChzZWxmLmltcGxpY2l0X3Jlc3VsdCgpKQorCisgICAgZGVmIF9hbGxfZXF1YWwoc2VsZiwg
cmVzdWx0cyk6CisgICAgICAgIGlmIGxlbihyZXN1bHRzKSA9PSAwOgorICAgICAgICAgICAgcmV0
dXJuIFRydWUKKyAgICAgICAgY29udGVudHMgPSByZXN1bHRzWzBdLmNvbnRlbnRzKCkKKyAgICAg
ICAgcmV0dXJuIGFsbChtYXAobGFtYmRhIHg6IHguY29udGVudHMoKSA9PSBjb250ZW50cywgcmVz
dWx0cykpCisKKyAgICBkZWYgZHVtcChzZWxmLCBsb2dnZXI9SW5kZW50ZWRMb2dnZXIoKSk6Cisg
ICAgICAgIGxvZ2dlci5sb2coIkJ1Y2tldDolcyB7IiAlIHNlbGYuX25hbWUpCisgICAgICAgIGxv
Z2dlci5pbmRlbnQoKQorICAgICAgICBsb2dnZXIubG9nKCJSZXN1bHQgPSAlcyIgJSBzZWxmLl9y
ZXN1bHQpCisgICAgICAgIGxvZ2dlci5sb2coIkltcGxpY2l0IHJlc3VsdCA9ICVzIiAlIHNlbGYu
aW1wbGljaXRfcmVzdWx0KCkpCisgICAgICAgIGZvciBjaGlsZCBpbiBzZWxmLl9jaGlsZHJlbjoK
KyAgICAgICAgICAgIGNoaWxkLmR1bXAobG9nZ2VyKQorICAgICAgICBsb2dnZXIub3V0ZGVudCgp
CisgICAgICAgIGxvZ2dlci5sb2coIn0iKQorCisgICAgZGVmIG5hbWUoc2VsZik6CisgICAgICAg
IHJldHVybiBzZWxmLl9uYW1lCisKKyAgICBkZWYgbWFya19hc19hZ2dyZWdhdGUoc2VsZik6Cisg
ICAgICAgICIiIkJ1Y2tldHMgdGhhdCBkb24ndCBtYXAgdG8gYSBzcGVjaWZpYyBwbGF0Zm9ybSBh
cmUgJ2FnZ3JlZ2F0ZScKKyAgICAgICAgYnVja2V0cy4gIEFnZ3JlZ2F0ZSBidWNrZXRzIGNhbiBv
dmVyd3JpdGUgdGhlaXIgb3duIHJlc3VsdHMgd2l0aCB0aG9zZQorICAgICAgICBvZiB0aGVpciBj
aGlsZHJlbiBpZiB0aGVpciBjaGlsZHJlbiBoYXZlIHJlc3VsdHMgdGhhdCBhbGwgbWF0Y2ggYmVj
YXVzZQorICAgICAgICBhZ2dyZWdhdGVzIGFyZSBkZWZpbmVkIGVudGlyZWx5IGJ5IHRoZWlyIGNo
aWxkcmVuIGFuZCBub3QgdGhlaXIgb3duCisgICAgICAgIHRhcmdldGVkIHJlc3VsdHMuIiIiCisg
ICAgICAgIHNlbGYuX2lzX2FnZ3JlZ2F0ZSA9IFRydWUKKworICAgIGRlZiBhcHBlbmQoc2VsZiwg
Y2hpbGQpOgorICAgICAgICBzZWxmLl9jaGlsZHJlbi5hcHBlbmQoY2hpbGQpCisgICAgICAgIHNl
bGYuX29uX2NoYW5nZWQoKQorCisgICAgZGVmIGltcGxpY2l0X3Jlc3VsdChzZWxmKToKKyAgICAg
ICAgaWYgc2VsZi5fcmVzdWx0IGlzIG5vdCBOb25lOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYu
X3Jlc3VsdAorICAgICAgICByZXR1cm4gc2VsZi5faW1wbGljaXRfcmVzdWx0CisKKyAgICBkZWYg
c2V0X3Jlc3VsdChzZWxmLCByZXN1bHQpOgorICAgICAgICBpZiBzZWxmLl9yZXN1bHQgaXMgTm9u
ZToKKyAgICAgICAgICAgIHNlbGYuX3Jlc3VsdCA9IHJlc3VsdAorICAgICAgICAgICAgc2VsZi5f
b25fY2hhbmdlZCgpCisgICAgICAgIGVsaWYgcmVzdWx0LmlzX3JlYmFzZWxpbmVfb2Yoc2VsZi5f
cmVzdWx0KToKKyAgICAgICAgICAgIHNlbGYuX3Jlc3VsdCA9IHJlc3VsdAorICAgICAgICAgICAg
c2VsZi5fb25fY2hhbmdlZCgpCisgICAgICAgIGVsaWYgc2VsZi5fcmVzdWx0LmlzX3JlYmFzZWxp
bmVfb2YocmVzdWx0KToKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgZWxpZiBzZWxmLl9yZXN1
bHQgPT0gcmVzdWx0OgorICAgICAgICAgICAgcmFpc2UgRXhjZXB0aW9uKCJTYW1lIHJlc3VsdCBi
ZWluZyBpbnNlcnRlZCBhZ2FpbiBpbnRvIGJ1Y2tldCAlczogJXMgPC0gJXMiICUgKHNlbGYsIHNl
bGYuX3Jlc3VsdCwgcmVzdWx0KSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJhaXNlIEV4
Y2VwdGlvbigiQ29uZmxpY3RpbmcgcmVzdWx0cyAlcyBhbmQgJXMgYXNzaWduZWQgdG8gYnVja2V0
ICVzIiAlCisgICAgICAgICAgICAgICAgICAgIChzZWxmLl9yZXN1bHQsIHJlc3VsdCwgc2VsZi5f
bmFtZSkpCisKKyAgICBkZWYgY2xlYXJfcmVzdWx0KHNlbGYpOgorICAgICAgICBzZWxmLl9yZXN1
bHQgPSBOb25lCisgICAgICAgIHNlbGYuX29uX2NoYW5nZWQoKQorCisgICAgZGVmIHJlc3VsdChz
ZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX3Jlc3VsdAorCisgICAgZGVmIHNldF9pbXBsaWNp
dChzZWxmLCBpbXBsaWNpdF9yZXN1bHQpOgorICAgICAgICBzZWxmLl9pbXBsaWNpdF9yZXN1bHQg
PSBpbXBsaWNpdF9yZXN1bHQKKyAgICAgICAgc2VsZi5fb25fY2hhbmdlZCgpCisKKyAgICBkZWYg
X3NhbWVfaW1wbGljaXRfcmVzdWx0KHNlbGYsIG90aGVyKToKKyAgICAgICAgaWYgc2VsZi5pbXBs
aWNpdF9yZXN1bHQoKSBpcyBOb25lOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYuaW1wbGljaXRf
cmVzdWx0KCkgPT0gb3RoZXIuaW1wbGljaXRfcmVzdWx0KCkKKyAgICAgICAgcmV0dXJuIG90aGVy
LmltcGxpY2l0X3Jlc3VsdCgpLnNhbWVfY29udGVudChzZWxmLmltcGxpY2l0X3Jlc3VsdCgpKQor
CisgICAgZGVmIF9nZXRfY29tbW9uX2NoaWxkX3Jlc3VsdChzZWxmLCByZXN1bHRzKToKKyAgICAg
ICAgaWYgbGVuKHJlc3VsdHMpID09IDA6CisgICAgICAgICAgICByZXR1cm4gTm9uZQorCisgICAg
ICAgIGZpcnN0X3Jlc3VsdCA9IHJlc3VsdHNbMF0KKyAgICAgICAgcmVzdWx0X3RvX3JldHVybiA9
IGZpcnN0X3Jlc3VsdAorICAgICAgICBmb3IgcmVzdWx0IGluIHJlc3VsdHNbMTpdOgorICAgICAg
ICAgICAgaWYgbm90IHJlc3VsdC5zYW1lX2NvbnRlbnQoZmlyc3RfcmVzdWx0KToKKyAgICAgICAg
ICAgICAgICByZXR1cm4gTm9uZQorICAgICAgICAgICAgaWYgcmVzdWx0LmlzX2FjdHVhbCgpOgor
ICAgICAgICAgICAgICAgIHJlc3VsdF90b19yZXR1cm4gPSByZXN1bHQgICAjIFByZWZlciB0byBy
ZXR1cm4gYWN0dWFsIHJlc3VsdHMuCisgICAgICAgIHJldHVybiByZXN1bHRfdG9fcmV0dXJuCisK
KyAgICBkZWYgX2luaGVyaXQoc2VsZiwgcmVzdWx0KToKKyAgICAgICAgZm9yIGNoaWxkIGluIHNl
bGYuX2NoaWxkcmVuOgorICAgICAgICAgICAgY2hpbGQuY2xlYXJfcmVzdWx0KCkKKyAgICAgICAg
c2VsZi5fcmVzdWx0ID0gcmVzdWx0LnJldGFyZ2V0KHNlbGYuX25hbWUpCisgICAgICAgIHNlbGYu
X29uX2NoYW5nZWQoKQorCisgICAgZGVmIF9hdHRlbXB0X3RvX2luaGVyaXQoc2VsZik6CisgICAg
ICAgICIiIlRyeSB0byBpbmhlcml0IGEgcmVzdWx0IGZyb20gY2hpbGRyZW4uIFRoaXMgd2lsbCBv
bmx5IGhhcHBlbiBpZiBhbGwKKyAgICAgICAgICAgICAgY2hpbGRyZW4gaGF2ZSB0aGUgc2FtZSBy
ZXN1bHQiIiIKKyAgICAgICAgY2hpbGRfcmVzdWx0cyA9IG1hcChsYW1iZGEgYzogYy5pbXBsaWNp
dF9yZXN1bHQoKSwgc2VsZi5fY2hpbGRyZW4pCisgICAgICAgIGNoaWxkX3Jlc3VsdHMgPSBmaWx0
ZXIobGFtYmRhIHI6IHIgaXMgbm90IE5vbmUsIGNoaWxkX3Jlc3VsdHMpCisgICAgICAgIHRvX2lu
aGVyaXQgPSBzZWxmLl9nZXRfY29tbW9uX2NoaWxkX3Jlc3VsdChjaGlsZF9yZXN1bHRzKQorCisg
ICAgICAgIGlmIHRvX2luaGVyaXQgaXMgTm9uZToKKyAgICAgICAgICAgIHJldHVybiBGYWxzZQor
CisgICAgICAgICMgV2UgaGF2ZSBhIHJlc3VsdCB3ZSBjb3VsZCBwb3RlbnRpYWxseSBpbmhlcml0
Li4uCisgICAgICAgIGlmIHNlbGYuaW1wbGljaXRfcmVzdWx0KCkgaXMgTm9uZToKKyAgICAgICAg
ICAgIHNlbGYuX2luaGVyaXQodG9faW5oZXJpdCkKKyAgICAgICAgZWxpZiB0b19pbmhlcml0Lmlz
X25ld2VyX3RoYW4oc2VsZi5pbXBsaWNpdF9yZXN1bHQoKSkgYW5kIHNlbGYuaXNfYWdncmVnYXRl
KCk6CisgICAgICAgICAgICBzZWxmLl9pbmhlcml0KHRvX2luaGVyaXQpCisgICAgICAgIGVsc2U6
CisgICAgICAgICAgICByZXR1cm4gRmFsc2UKKyAgICAgICAgcmV0dXJuIFRydWUKKworICAgIGRl
ZiBpc19hZ2dyZWdhdGUoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLl9pc19hZ2dyZWdhdGUK
KworICAgIGRlZiBjb2xsYXBzZShzZWxmKToKKyAgICAgICAgIiIiRGVsZXRlcyByZWR1bmRhbnQg
cmVzdWx0cyBpbiB0aGUgdHJlZSBzdGFydGluZyBhdCB0aGlzIGJ1Y2tldCIiIgorICAgICAgICBm
b3IgY2hpbGQgaW4gc2VsZi5fY2hpbGRyZW46CisgICAgICAgICAgICBjaGlsZC5jb2xsYXBzZSgp
CisKKyAgICAgICAgaWYgc2VsZi5fYXR0ZW1wdF90b19pbmhlcml0KCk6CisgICAgICAgICAgICBy
ZXR1cm4KKworICAgICAgICBmb3IgY2hpbGQgaW4gc2VsZi5fY2hpbGRyZW46CisgICAgICAgICAg
ICBpZiBzZWxmLl9zYW1lX2ltcGxpY2l0X3Jlc3VsdChjaGlsZCk6CisgICAgICAgICAgICAgICAg
Y2hpbGQuY2xlYXJfcmVzdWx0KCkKKworICAgIGRlZiBpc19lbXB0eShzZWxmKToKKyAgICAgICAg
cmV0dXJuIHNlbGYuX3Jlc3VsdCBpcyBOb25lCisKKyAgICBkZWYgcmVzdWx0cyhzZWxmLCByKToK
KyAgICAgICAgaWYgbm90IHNlbGYuaXNfZW1wdHkoKToKKyAgICAgICAgICAgIHIuYXBwZW5kKHNl
bGYuX3Jlc3VsdCkKKyAgICAgICAgZm9yIGMgaW4gc2VsZi5fY2hpbGRyZW46CisgICAgICAgICAg
ICBjLnJlc3VsdHMocikKKworCitjbGFzcyBCdWNrZXRUcmVlKG9iamVjdCk6CisgICAgIiIiSGVs
cGVyIGNsYXNzIGZvciBjb25zdHJ1Y3RpbmcgYW5kIGluZGV4aW5nIGEgaGllcmFyY2h5IG9mIEJ1
Y2tldHMuIiIiCisgICAgZGVmIF9faW5pdF9fKHNlbGYpOgorICAgICAgICBzZWxmLl9idWNrZXRz
ID0ge30KKyAgICAgICAgc2VsZi5fcm9vdF9idWNrZXQgPSBzZWxmLl9nZXRfb3JfY3JlYXRlX2J1
Y2tldChOb25lKQorCisgICAgZGVmIF9nZXRfb3JfY3JlYXRlX2J1Y2tldChzZWxmLCBidWNrZXRf
bmFtZSk6CisgICAgICAgIGlmIGJ1Y2tldF9uYW1lIG5vdCBpbiBzZWxmLl9idWNrZXRzOgorICAg
ICAgICAgICAgc2VsZi5fYnVja2V0c1tidWNrZXRfbmFtZV0gPSBCdWNrZXQoYnVja2V0X25hbWUp
CisgICAgICAgIHJldHVybiBzZWxmLl9idWNrZXRzW2J1Y2tldF9uYW1lXQorCisgICAgZGVmIG1h
a2VfYnVja2V0KHNlbGYsIGJ1Y2tldF9uYW1lLCAqYXJncyk6CisgICAgICAgIGIgPSBzZWxmLl9n
ZXRfb3JfY3JlYXRlX2J1Y2tldChidWNrZXRfbmFtZSkKKworICAgICAgICBmb3IgYXJnIGluIGFy
Z3M6CisgICAgICAgICAgICBiLmFwcGVuZChhcmcpCisgICAgICAgIHJldHVybiBiCisKKyAgICBk
ZWYgYihzZWxmLCBidWNrZXRfbmFtZSwgKmFyZ3MpOgorICAgICAgICByZXR1cm4gc2VsZi5tYWtl
X2J1Y2tldChidWNrZXRfbmFtZSwgKmFyZ3MpCisKKyAgICBkZWYgaW5zZXJ0X3Jlc3VsdChzZWxm
LCByZXN1bHQpOgorICAgICAgICBpZiByZXN1bHQucGxhdGZvcm0oKSBub3QgaW4gc2VsZi5fYnVj
a2V0cy5rZXlzKCk6CisgICAgICAgICAgICByYWlzZSBFeGNlcHRpb24oIkNvdWxkbid0IGZpbmQg
YnVja2V0IGZvciBwbGF0Zm9ybSAlcyIgJSByZXN1bHQucGxhdGZvcm0oKSkKKyAgICAgICAgc2Vs
Zi5fYnVja2V0c1tyZXN1bHQucGxhdGZvcm0oKV0uc2V0X3Jlc3VsdChyZXN1bHQpCisKKyAgICBk
ZWYgcmVzdWx0cyhzZWxmKToKKyAgICAgICAgciA9IFtdCisgICAgICAgIHNlbGYuX3Jvb3RfYnVj
a2V0LnJlc3VsdHMocikKKyAgICAgICAgcmV0dXJuIHIKKworICAgIGRlZiBjb2xsYXBzZShzZWxm
KToKKyAgICAgICAgc2VsZi5fcm9vdF9idWNrZXQuY29sbGFwc2UoKQorCisgICAgZGVmIGdldF9i
dWNrZXQoc2VsZiwgYnVja2V0X25hbWUpOgorICAgICAgICByZXR1cm4gc2VsZi5fYnVja2V0c1ti
dWNrZXRfbmFtZV0KKworICAgIGRlZiByb290X2J1Y2tldChzZWxmKToKKyAgICAgICAgcmV0dXJu
IHNlbGYuZ2V0X2J1Y2tldChOb25lKQpkaWZmIC0tZ2l0IGEvV2ViS2l0VG9vbHMvU2NyaXB0cy93
ZWJraXRweS9sYXlvdXRfdGVzdHMvcmViYXNlbGluZS9idWNrZXRfdW5pdHRlc3QucHkgYi9XZWJL
aXRUb29scy9TY3JpcHRzL3dlYmtpdHB5L2xheW91dF90ZXN0cy9yZWJhc2VsaW5lL2J1Y2tldF91
bml0dGVzdC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwLi4zYTljMTlkMzNmYzc3MTI3NTlmOGY4MTkwOTgxYzkxYjAz
NzkzOGU3Ci0tLSAvZGV2L251bGwKKysrIGIvV2ViS2l0VG9vbHMvU2NyaXB0cy93ZWJraXRweS9s
YXlvdXRfdGVzdHMvcmViYXNlbGluZS9idWNrZXRfdW5pdHRlc3QucHkKQEAgLTAsMCArMSwyNjYg
QEAKKyMhL3Vzci9iaW4vZW52IHB5dGhvbgorIyBDb3B5cmlnaHQgKEMpIDIwMTAgR29vZ2xlIElu
Yy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyMKKyMgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBz
b3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisjIG1vZGlmaWNhdGlvbiwg
YXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworIyBh
cmUgbWV0OgorIworIyAxLiAgUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0
YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyMgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRp
dGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyMgMi4gIFJlZGlzdHJpYnV0aW9u
cyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisjICAg
ICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2Ns
YWltZXIgaW4gdGhlCisjICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMg
cHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorIworIyBUSElTIFNPRlRXQVJFIElTIFBS
T1ZJREVEIEJZIEFQUExFIEFORCBJVFMgQ09OVFJJQlVUT1JTICJBUyBJUyIgQU5EIEFOWQorIyBF
WFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQg
VE8sIFRIRSBJTVBMSUVECisjIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRO
RVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKKyMgRElTQ0xBSU1FRC4gSU4gTk8gRVZF
TlQgU0hBTEwgQVBQTEUgT1IgSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWQorIyBE
SVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNF
UVVFTlRJQUwgREFNQUdFUworIyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NV
UkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisjIExPU1MgT0YgVVNFLCBE
QVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VE
IEFORAorIyBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwg
U1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorIyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RI
RVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKyMgVEhJUyBTT0ZU
V0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4K
KworZnJvbSBidWNrZXQgaW1wb3J0IEJ1Y2tldCwgQnVja2V0VHJlZQoraW1wb3J0IHVuaXR0ZXN0
Citmcm9tIHJlc3VsdF91bml0dGVzdCBpbXBvcnQgRmFrZVJlc3VsdAorCisKK2NsYXNzIEJ1Y2tl
dFRlc3QodW5pdHRlc3QuVGVzdENhc2UpOgorICAgIGRlZiBzZXRVcChzZWxmKToKKyAgICAgICAg
c2VsZi5fbWFjID0gQnVja2V0KCdtYWMnKQorICAgICAgICBzZWxmLl9tYWNfbGVvcGFyZCA9IEJ1
Y2tldCgnbWFjX2xlb3BhcmQnKQorICAgICAgICBzZWxmLl9saW51eCA9IEJ1Y2tldCgnbGludXgn
KQorICAgICAgICBzZWxmLl9ub25lID0gQnVja2V0KE5vbmUpCisKKyAgICBkZWYgdGVzdENoaWxk
QnVja2V0SW5oZXJpdHNSZXN1bHRPZlBhcmVudEFzSW1wbGljaXRSZXN1bHQoc2VsZik6CisgICAg
ICAgIHNlbGYuX21hYy5zZXRfcmVzdWx0KEZha2VSZXN1bHQoJ21hYycsICd0ZXh0JywgJ2FiYzEy
MycpKQorICAgICAgICBzZWxmLl9tYWMuYXBwZW5kKHNlbGYuX21hY19sZW9wYXJkKQorICAgICAg
ICBzZWxmLmFzc2VydEVxdWFscygnYWJjMTIzJywgc2VsZi5fbWFjX2xlb3BhcmQuaW1wbGljaXRf
cmVzdWx0KCkuY29udGVudHMoKSkKKworICAgIGRlZiB0ZXN0Q29sbGFwc2VXb3Jrc1doZW5DaGls
ZEhhc0VxdWFsUmVzdWx0cyhzZWxmKToKKyAgICAgICAgc2VsZi5fbWFjLnNldF9yZXN1bHQoRmFr
ZVJlc3VsdCgnbWFjJywgJ3RleHQnLCAnYWJjMTIzJykpCisgICAgICAgIHNlbGYuX21hY19sZW9w
YXJkLnNldF9yZXN1bHQoRmFrZVJlc3VsdCgnbWFjJywgJ3RleHQnLCAnYWJjMTIzJykpCisgICAg
ICAgIHNlbGYuX21hYy5hcHBlbmQoc2VsZi5fbWFjX2xlb3BhcmQpCisKKyAgICAgICAgc2VsZi5f
bWFjLmNvbGxhcHNlKCkKKworICAgICAgICBzZWxmLmFzc2VydFRydWUoc2VsZi5fbWFjX2xlb3Bh
cmQuaXNfZW1wdHkoKSkKKworICAgIGRlZiB0ZXN0Q29sbGFwc2VzQ2hpbGRXaXRoSW1wbGljaXRS
ZXN1bHRGcm9tUGFyZW50KHNlbGYpOgorICAgICAgICBzZWxmLl9tYWMuc2V0X3Jlc3VsdChGYWtl
UmVzdWx0KCdtYWMnLCAndGV4dCcsICdhYmMxMjMnKSkKKyAgICAgICAgc2VsZi5fbWFjLmFwcGVu
ZChzZWxmLl9tYWNfbGVvcGFyZCkKKworICAgICAgICBzZWxmLl9tYWMuY29sbGFwc2UoKQorCisg
ICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzZWxmLl9tYWNfbGVvcGFyZC5pc19lbXB0eSgpKQorCisg
ICAgZGVmIHRlc3RDb2xsYXBzZXNDaGlsZFdpdGhJbXBsaWNpdFJlc3VsdEFuZEV4cGxpY2l0U2li
bGluZyhzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHNlbGYuX21hYy5pc19lbXB0eSgp
KQorICAgICAgICBzZWxmLl9tYWMuc2V0X3Jlc3VsdChGYWtlUmVzdWx0KCdtYWMnLCAndGV4dCcs
ICdhYmMxMjMnKSkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShzZWxmLl9tYWMuaXNfZW1wdHko
KSkKKyAgICAgICAgc2VsZi5fbWFjX2xlb3BhcmQuc2V0X3Jlc3VsdChGYWtlUmVzdWx0KCdtYWMn
LCAndGV4dCcsICdhYmMxMjMnKSkKKworICAgICAgICBzZWxmLmFzc2VydEZhbHNlKHNlbGYuX21h
Yy5pc19lbXB0eSgpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscygnYWJjMTIzJywgc2VsZi5f
bWFjLmltcGxpY2l0X3Jlc3VsdCgpLmNvbnRlbnRzKCkpCisKKyAgICAgICAgc2VsZi5fbWFjLmFw
cGVuZChzZWxmLl9tYWNfbGVvcGFyZCkKKyAgICAgICAgc2VsZi5fbWFjLmFwcGVuZChzZWxmLl9s
aW51eCkKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFscygnYWJjMTIzJywgc2VsZi5fbWFjX2xl
b3BhcmQuaW1wbGljaXRfcmVzdWx0KCkuY29udGVudHMoKSkKKworICAgICAgICBzZWxmLl9tYWMu
Y29sbGFwc2UoKQorCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzZWxmLl9saW51eC5pc19lbXB0
eSgpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoc2VsZi5fbWFjX2xlb3BhcmQuaXNfZW1wdHko
KSkKKworICAgIGRlZiB0ZXN0Q2xlYXJzT25seUNoaWxkcmVuVGhhdEhhdmVUaGVTYW1lUmVzdWx0
cyhzZWxmKToKKyAgICAgICAgc2VsZi5fbWFjLnNldF9yZXN1bHQoRmFrZVJlc3VsdCgnbWFjJywg
J3RleHQnLCAnYWJjMTIzJykpCisgICAgICAgIHNlbGYuX21hY19sZW9wYXJkLnNldF9yZXN1bHQo
RmFrZVJlc3VsdCgnbWFjLWxlb3BhcmQnLCAndGV4dCcsICdhYmMxMjMnKSkKKyAgICAgICAgc2Vs
Zi5fbGludXguc2V0X3Jlc3VsdChGYWtlUmVzdWx0KCdsaW51eCcsICd0ZXh0JywgJ2RlZjQ1Nicp
KQorCisgICAgICAgIHNlbGYuX21hYy5hcHBlbmQoc2VsZi5fbWFjX2xlb3BhcmQpCisgICAgICAg
IHNlbGYuX21hYy5hcHBlbmQoc2VsZi5fbGludXgpCisKKyAgICAgICAgc2VsZi5fbWFjLmNvbGxh
cHNlKCkKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFscygnYWJjMTIzJywgc2VsZi5fbWFjLmlt
cGxpY2l0X3Jlc3VsdCgpLmNvbnRlbnRzKCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKCdk
ZWY0NTYnLCBzZWxmLl9saW51eC5pbXBsaWNpdF9yZXN1bHQoKS5jb250ZW50cygpKQorICAgICAg
ICBzZWxmLmFzc2VydFRydWUoc2VsZi5fbWFjX2xlb3BhcmQuaXNfZW1wdHkoKSkKKworICAgIGRl
ZiB0ZXN0Q29sbGFwc2VXb3Jrc0ZvckRlc2NlbmRlbnRzRGVlcGVyVGhhdERpcmVjdENoaWxkcmVu
KHNlbGYpOgorICAgICAgICBzZWxmLl9tYWMuc2V0X3Jlc3VsdChGYWtlUmVzdWx0KCdtYWMnLCAn
dGV4dCcsICdhYmMxMjMnKSkKKyAgICAgICAgc2VsZi5fbGludXguc2V0X3Jlc3VsdChGYWtlUmVz
dWx0KCdsaW51eCcsICd0ZXh0JywgJ2FiYzEyMycpKQorCisgICAgICAgIHNlbGYuX21hYy5hcHBl
bmQoc2VsZi5fbWFjX2xlb3BhcmQpCisgICAgICAgIHNlbGYuX21hY19sZW9wYXJkLmFwcGVuZChz
ZWxmLl9saW51eCkKKworICAgICAgICBzZWxmLl9tYWMuY29sbGFwc2UoKQorCisgICAgICAgIHNl
bGYuYXNzZXJ0VHJ1ZShzZWxmLl9saW51eC5pc19lbXB0eSgpKQorCisgICAgZGVmIHRlc3RUaGF0
Q29sbGFwc2luZ01haW50YWluc0NvcnJlY3RQbGF0Zm9ybShzZWxmKToKKyAgICAgICAgc2VsZi5f
bWFjLmFwcGVuZChzZWxmLl9tYWNfbGVvcGFyZCkKKyAgICAgICAgc2VsZi5fbm9uZS5hcHBlbmQo
c2VsZi5fbWFjKQorCisgICAgICAgIHNlbGYuX21hY19sZW9wYXJkLnNldF9yZXN1bHQoRmFrZVJl
c3VsdCgnbWFjLWxlb3BhcmQnLCAndGV4dCcsICdhYmMxMjMnKSkKKyAgICAgICAgc2VsZi5fbm9u
ZS5zZXRfcmVzdWx0KEZha2VSZXN1bHQoTm9uZSwgJ3RleHQnLCAnZGVmNDU2JykpCisKKyAgICAg
ICAgc2VsZi5fbm9uZS5jb2xsYXBzZSgpCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoTm9u
ZSwgc2VsZi5fbWFjLmltcGxpY2l0X3Jlc3VsdCgpLnBsYXRmb3JtKCkpCisgICAgICAgIHNlbGYu
YXNzZXJ0RXF1YWxzKCdtYWMtbGVvcGFyZCcsIHNlbGYuX21hY19sZW9wYXJkLmltcGxpY2l0X3Jl
c3VsdCgpLnBsYXRmb3JtKCkpCisKKyAgICBkZWYgdGVzdFBhcmVudFdpdGhOb1Jlc3VsdFdpbGxJ
bmhlcml0RnJvbUNoaWxkcmVuV2l0aFNhbWVSZXN1bHQoc2VsZik6CisgICAgICAgIHNlbGYuX21h
Yy5zZXRfcmVzdWx0KEZha2VSZXN1bHQoJ21hYycsICd0ZXh0JywgJ2FiYzEyMycpKQorICAgICAg
ICBzZWxmLl9saW51eC5zZXRfcmVzdWx0KEZha2VSZXN1bHQoJ2xpbnV4JywgJ3RleHQnLCAnYWJj
MTIzJykpCisKKyAgICAgICAgc2VsZi5fbm9uZS5hcHBlbmQoc2VsZi5fbWFjKQorICAgICAgICBz
ZWxmLl9ub25lLmFwcGVuZChzZWxmLl9saW51eCkKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFs
cyhOb25lLCBzZWxmLl9ub25lLmltcGxpY2l0X3Jlc3VsdCgpKQorCisgICAgICAgIHNlbGYuX25v
bmUuY29sbGFwc2UoKQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKCdhYmMxMjMnLCBzZWxm
Ll9ub25lLmltcGxpY2l0X3Jlc3VsdCgpLmNvbnRlbnRzKCkpCisKKyIiIgorICAgICAgICBUT0RP
IE1ha2UgdGhpcyBpbnRvIHRlc3RzLgorCisgICAgICAgIENoaWxkcmVuIGFsbCBoYXZlIHRoZSBz
YW1lIGV4cGxpY2l0IHJlc3VsdCBhcyB0aGUgcGFyZW50LgorCisgICAgICAgIEEgQSBBICAgICAg
ICBPIE8gTworICAgICAgICAgXHwvICAgIC0+ICAgIFx8LworICAgICAgICAgIEEgICAgICAgICAg
ICBBCisKKworICAgICAgICBDaGlsZHJlbiBhbGwgaGF2ZSB0aGUgc2FtZSByZXN1bHQsIGJ1dCB0
aGUgcGFyZW50IGhhcyBub25lLgorCisgICAgICAgIEEgQSBBICAgICAgICBPIE8gTworICAgICAg
ICAgXHwvICAgIC0+ICAgIFx8LworICAgICAgICAgIE8gICAgICAgICAgICBBCisKKworICAgICAg
ICBPbmUgb2YgdGhlIGNoaWxkcmVuIGhhcyB0aGUgc2FtZSByZXN1bHQgYXMgdGhlIHBhcmVudC4K
KworICAgICAgICBBIEIgQyAgICAgICAgTyBCIEMKKyAgICAgICAgIFx8LyAgICAtPiAgICBcfC8K
KyAgICAgICAgICBBICAgICAgICAgICAgQQorCisgICAgICAgIERlc2NlbmRlbnRzIGFsbCBoYXZl
IHNhbWUgZXhwbGljaXQgcmVzdWx0IGFzIHRoZSBhbmNlc3Rvci4KKworICAgICAgICBBIEEgQSAg
ICAgICAgTyBPIE8KKyAgICAgICAgIFx8LyAgICAtPiAgICBcfC8KKyAgICAgICAgICBPICAgICAg
ICAgICAgTworICAgICAgICAgIHwgICAgICAgICAgICB8CisgICAgICAgICAgQSAgICAgICAgICAg
IEEKKworICAgICAgICBXaGVyZSBBIGlzIGEgYnVja2V0IHdpdGggYSB0ZXN0IHJlc3VsdCwgYW5k
IE8gaXMgYW4gZW1wdHkgYnVja2V0LgorIiIiCisKKworY2xhc3MgQnVja2V0VHJlZVRlc3QodW5p
dHRlc3QuVGVzdENhc2UpOgorICAgIGRlZiB0ZXN0TmV3RXhwZWN0YXRpb25zT3ZlcnJpZGVPbGRP
bmVzKHNlbGYpOgorICAgICAgICBiID0gQnVja2V0VHJlZSgpCisgICAgICAgIHJvb3QgPSBiLmIo
Tm9uZSwKKyAgICAgICAgICAgIGIuYignbWFjJyksCisgICAgICAgICAgICBiLmIoJ2xpbnV4Jyks
CisgICAgICAgICAgICBiLmIoJ3dpbicpKQorCisgICAgICAgIGIuaW5zZXJ0X3Jlc3VsdChGYWtl
UmVzdWx0KE5vbmUsICd0ZXh0JywgJ2FiYzEyMycsIFRydWUpKQorICAgICAgICBiLmluc2VydF9y
ZXN1bHQoRmFrZVJlc3VsdChOb25lLCAndGV4dCcsICdkZWY0NTYnKSkKKworICAgICAgICBiLmNv
bGxhcHNlKCkKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKDEsIGxlbihiLnJlc3VsdHMoKSkp
CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoJ2RlZjQ1NicsIGIucmVzdWx0cygpWzBdLmNvbnRl
bnRzKCkpCisKKyAgICBkZWYgdGVzdFJlYmFzZWxpbmluZ1N0aWxsV29ya3NJZk5ld1Jlc3VsdHNB
cmVJbnNlcnRlZEZpcnN0KHNlbGYpOgorICAgICAgICBiID0gQnVja2V0VHJlZSgpCisgICAgICAg
IHJvb3QgPSBiLmIoTm9uZSwKKyAgICAgICAgICAgIGIuYignbWFjJyksCisgICAgICAgICAgICBi
LmIoJ2xpbnV4JyksCisgICAgICAgICAgICBiLmIoJ3dpbicpKQorCisgICAgICAgIGIuaW5zZXJ0
X3Jlc3VsdChGYWtlUmVzdWx0KE5vbmUsICd0ZXh0JywgJ2RlZjQ1NicpKQorICAgICAgICBiLmlu
c2VydF9yZXN1bHQoRmFrZVJlc3VsdChOb25lLCAndGV4dCcsICdhYmMxMjMnLCBUcnVlKSkKKwor
ICAgICAgICBiLmNvbGxhcHNlKCkKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKDEsIGxlbihi
LnJlc3VsdHMoKSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoJ2RlZjQ1NicsIGIucmVzdWx0
cygpWzBdLmNvbnRlbnRzKCkpCisKKyAgICBkZWYgdGVzdEtpZHNIYXZpbmdTYW1lUmViYXNlbGlu
ZUNhdXNlc092ZXJyaWRlT25QYXJlbnQoc2VsZik6CisgICAgICAgIGIgPSBCdWNrZXRUcmVlKCkK
KyAgICAgICAgcm9vdCA9IGIuYihOb25lLAorICAgICAgICAgICAgYi5iKCdtYWMnKSwKKyAgICAg
ICAgICAgIGIuYignd2luJykpCisgICAgICAgIGIuZ2V0X2J1Y2tldChOb25lKS5tYXJrX2FzX2Fn
Z3JlZ2F0ZSgpCisKKyAgICAgICAgYi5pbnNlcnRfcmVzdWx0KEZha2VSZXN1bHQoTm9uZSwgJ3Rl
eHQnLCAnb2xkIHJlc3VsdCcsIFRydWUpKQorICAgICAgICBiLmluc2VydF9yZXN1bHQoRmFrZVJl
c3VsdCgnbWFjJywgJ3RleHQnLCAnbmV3IHJlc3VsdCcpKQorICAgICAgICBiLmluc2VydF9yZXN1
bHQoRmFrZVJlc3VsdCgnd2luJywgJ3RleHQnLCAnbmV3IHJlc3VsdCcpKQorCisgICAgICAgIGIu
Y29sbGFwc2UoKQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoMSwgbGVuKGIucmVzdWx0cygp
KSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChOb25lLCBiLnJlc3VsdHMoKVswXS5wbGF0Zm9y
bSgpKQorCisgICAgZGVmIHRlc3RXZURvbnRJbmhlcml0RnJvbUNoaWxkcmVuSWZXZUFyZU5vdEFu
QWdncmVnYXRlQnVja2V0KHNlbGYpOgorICAgICAgICBiID0gQnVja2V0VHJlZSgpCisgICAgICAg
IHJvb3QgPSBiLmIoTm9uZSwKKyAgICAgICAgICAgIGIuYignbWFjJyksCisgICAgICAgICAgICBi
LmIoJ3dpbicpKQorCisgICAgICAgIGIuaW5zZXJ0X3Jlc3VsdChGYWtlUmVzdWx0KE5vbmUsICd0
ZXh0JywgJ29sZCByZXN1bHQnLCBUcnVlKSkKKyAgICAgICAgYi5pbnNlcnRfcmVzdWx0KEZha2VS
ZXN1bHQoJ21hYycsICd0ZXh0JywgJ25ldyByZXN1bHQnKSkKKyAgICAgICAgYi5pbnNlcnRfcmVz
dWx0KEZha2VSZXN1bHQoJ3dpbicsICd0ZXh0JywgJ25ldyByZXN1bHQnKSkKKworICAgICAgICBi
LmNvbGxhcHNlKCkKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKDMsIGxlbihiLnJlc3VsdHMo
KSkpCisKKyAgICBkZWYgdGVzdE11bHRpUGhhc2VkQ29sbGFwc2VXb3JrcyhzZWxmKToKKyAgICAg
ICAgYiA9IEJ1Y2tldFRyZWUoKQorICAgICAgICByb290ID0gYi5iKE5vbmUsCisgICAgICAgICAg
ICBiLmIoJ21hYycsCisgICAgICAgICAgICAgICAgYi5iKCdtYWMtbGVvcGFyZCcpKSkKKworICAg
ICAgICBiLmdldF9idWNrZXQoTm9uZSkubWFya19hc19hZ2dyZWdhdGUoKQorCisgICAgICAgIGIu
aW5zZXJ0X3Jlc3VsdChGYWtlUmVzdWx0KE5vbmUsICd0ZXh0JywgJ29sZCByZXN1bHQnLCBUcnVl
KSkKKyAgICAgICAgYi5pbnNlcnRfcmVzdWx0KEZha2VSZXN1bHQoJ21hYycsICd0ZXh0JywgJ25l
dyByZXN1bHQnKSkKKyAgICAgICAgYi5pbnNlcnRfcmVzdWx0KEZha2VSZXN1bHQoJ21hYy1sZW9w
YXJkJywgJ3RleHQnLCAnbmV3IHJlc3VsdCcpKQorCisgICAgICAgIGIuY29sbGFwc2UoKQorCisg
ICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoMSwgbGVuKGIucmVzdWx0cygpKSkKKworICAgIGRlZiB0
ZXN0UGxhaW5PbGREZWR1cGVPbkxheW91dFRlc3RzV29ya3Moc2VsZik6CisgICAgICAgIGIgPSBC
dWNrZXRUcmVlKCkKKyAgICAgICAgcm9vdCA9IGIuYihOb25lLAorICAgICAgICAgICAgYi5iKCdt
YWMnLAorICAgICAgICAgICAgICAgIGIuYignbWFjLWxlb3BhcmQnLAorICAgICAgICAgICAgICAg
ICAgICBiLmIoJ21hYy1zbm93bGVvcGFyZCcpKSksCisgICAgICAgICAgICBiLmIoJ2xpbnV4JywK
KyAgICAgICAgICAgICAgICBiLmIoJ2Nocm9taXVtLWxpbnV4JykpKQorCisgICAgICAgIGIuaW5z
ZXJ0X3Jlc3VsdChGYWtlUmVzdWx0KE5vbmUsICd0ZXh0JywgJ3Jlc3VsdCcsIFRydWUpKQorICAg
ICAgICBiLmluc2VydF9yZXN1bHQoRmFrZVJlc3VsdCgnY2hyb21pdW0tbGludXgnLCAndGV4dCcs
ICdyZXN1bHQnLCBUcnVlKSkKKworICAgICAgICBiLmNvbGxhcHNlKCkKKworICAgICAgICBzZWxm
LmFzc2VydEVxdWFscygxLCBsZW4oYi5yZXN1bHRzKCkpKQorICAgICAgICBzZWxmLmFzc2VydEVx
dWFscyhOb25lLCBiLnJlc3VsdHMoKVswXS5wbGF0Zm9ybSgpKQorCisgICAgZGVmIHRlc3RDb2xs
YXBzZU9uQnVja2V0c1dpdGhOb1Jlc3VsdERvZXNudENyYXNoKHNlbGYpOgorICAgICAgICBiID0g
QnVja2V0VHJlZSgpCisgICAgICAgIHJvb3QgPSBiLmIoTm9uZSwKKyAgICAgICAgICAgIGIuYign
bWFjJywKKyAgICAgICAgICAgICAgICBiLmIoJ21hYy1sZW9wYXJkJykpKQorCisgICAgICAgIGIu
Y29sbGFwc2UoKQorCitpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgorICAgIHVuaXR0ZXN0Lm1h
aW4oKQpkaWZmIC0tZ2l0IGEvV2ViS2l0VG9vbHMvU2NyaXB0cy93ZWJraXRweS9sYXlvdXRfdGVz
dHMvcmViYXNlbGluZS9idWlsZGVyLnB5IGIvV2ViS2l0VG9vbHMvU2NyaXB0cy93ZWJraXRweS9s
YXlvdXRfdGVzdHMvcmViYXNlbGluZS9idWlsZGVyLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0Cmlu
ZGV4IDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAuLmI2NzUwZWYxYTk1
ZTA1Y2MzOTlmNTY1OTJjYzY4NzVkNzMxMmRmMzgKLS0tIC9kZXYvbnVsbAorKysgYi9XZWJLaXRU
b29scy9TY3JpcHRzL3dlYmtpdHB5L2xheW91dF90ZXN0cy9yZWJhc2VsaW5lL2J1aWxkZXIucHkK
QEAgLTAsMCArMSwzMDEgQEAKKyMhL3Vzci9iaW4vZW52IHB5dGhvbgorIyBDb3B5cmlnaHQgKEMp
IDIwMTAgR29vZ2xlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyMKKyMgUmVkaXN0cmlidXRp
b24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Cisj
IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcg
Y29uZGl0aW9ucworIyBhcmUgbWV0OgorIworIyAxLiAgUmVkaXN0cmlidXRpb25zIG9mIHNvdXJj
ZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyMgICAgIG5vdGljZSwgdGhp
cyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyMgMi4g
IFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUg
Y29weXJpZ2h0CisjICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUg
Zm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisjICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBv
dGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorIworIyBUSElT
IFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIEFORCBJVFMgQ09OVFJJQlVUT1JTICJBUyBJ
UyIgQU5EIEFOWQorIyBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBC
VVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVECisjIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRB
QklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKKyMgRElTQ0xB
SU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgT1IgSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFC
TEUgRk9SIEFOWQorIyBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVN
UExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUworIyAoSU5DTFVESU5HLCBCVVQgTk9UIExJ
TUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7Cisj
IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04p
IEhPV0VWRVIgQ0FVU0VEIEFORAorIyBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhF
UiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorIyAoSU5DTFVESU5HIE5F
R0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0Ug
T0YKKyMgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBP
RiBTVUNIIERBTUFHRS4KKworaW1wb3J0IG9zCitpbXBvcnQgcmUKK2ltcG9ydCByZXN1bHQKK2lt
cG9ydCBzaHV0aWwKK2ltcG9ydCB0ZW1wZmlsZQoraW1wb3J0IHVybGxpYgoraW1wb3J0IHppcGZp
bGUKKworCitjbGFzcyBSZW1vdGVaaXAob2JqZWN0KToKKyAgICAiIiJBIHppcCBmaWxlIHRoYXQg
cmVzaWRlcyBhdCBhIFVSTCAobG9jYWwgb3IgcmVtb3RlKSIiIgorICAgIGRlZiBfX2luaXRfXyhz
ZWxmLCB6aXBfdXJsKToKKyAgICAgICAgc2VsZi5femlwX3VybCA9IHppcF91cmwgICAgICAgICAg
IyBXaGVyZSB0aGUgemlwZmlsZSBpcyBzdG9yZWQKKyAgICAgICAgc2VsZi5femlwX2ZpbGUgPSBO
b25lCisKKyAgICBkZWYgX2xvYWQoc2VsZik6CisgICAgICAgIGlmIHNlbGYuX3ppcF9maWxlIGlz
IE5vbmU6CisgICAgICAgICAgICBzZWxmLl96aXBfZmlsZSA9IHppcGZpbGUuWmlwRmlsZSh1cmxs
aWIudXJscmV0cmlldmUoc2VsZi5femlwX3VybClbMF0pCisKKyAgICBkZWYgaGFuZGxlX3RvKHNl
bGYsIGZpbGVuYW1lKToKKyAgICAgICAgcmV0dXJuIFppcEZpbGVIYW5kbGUoc2VsZiwgZmlsZW5h
bWUpCisKKyAgICBkZWYgbmFtZWxpc3Qoc2VsZik6CisgICAgICAgIHNlbGYuX2xvYWQoKQorICAg
ICAgICByZXR1cm4gc2VsZi5femlwX2ZpbGUubmFtZWxpc3QoKQorCisgICAgZGVmIHJlYWQoc2Vs
ZiwgZmlsZW5hbWUpOgorICAgICAgICBzZWxmLl9sb2FkKCkKKyAgICAgICAgcmV0dXJuIHNlbGYu
X3ppcF9maWxlLnJlYWQoZmlsZW5hbWUpCisKKyAgICBkZWYgZXh0cmFjdChzZWxmLCBmaWxlbmFt
ZSwgcGF0aCk6CisgICAgICAgIHNlbGYuX2xvYWQoKQorICAgICAgICByZXR1cm4gc2VsZi5femlw
X2ZpbGUuZXh0cmFjdChmaWxlbmFtZSwgcGF0aCkKKworICAgIGRlZiBkZWxldGUoc2VsZiwgZmls
ZW5hbWUpOgorICAgICAgICByYWlzZSBFeGNlcHRpb24oIkNhbid0IGRlbGV0ZSBmcm9tIGEgUmVt
b3RlWmlwLiIpCisKKworY2xhc3MgWmlwRmlsZUhhbmRsZToKKyAgICAiIiJQb2ludHMgdG8gYSBm
aWxlIHRoYXQgcmVzaWRlcyBpbiBhIFJlbW90ZVppcCIiIgorICAgIGRlZiBfX2luaXRfXyhzZWxm
LCB6aXBfZmlsZSwgZmlsZW5hbWUpOgorICAgICAgICBzZWxmLl9maWxlbmFtZSA9IGZpbGVuYW1l
CisgICAgICAgIHNlbGYuX3ppcF9maWxlID0gemlwX2ZpbGUKKyAgICAgICAgc2VsZi5fY29udGVu
dHMgPSBOb25lCisKKyAgICBkZWYgX19zdHJfXyhzZWxmKToKKyAgICAgICAgcmV0dXJuICIlczol
cyIgJSAoc2VsZi5femlwX2ZpbGUsIHNlbGYuX2ZpbGVuYW1lKQorCisgICAgZGVmIGNvbnRlbnRz
KHNlbGYpOgorICAgICAgICBpZiBzZWxmLl9jb250ZW50cyBpcyBOb25lOgorICAgICAgICAgICAg
c2VsZi5fY29udGVudHMgPSBzZWxmLl96aXBfZmlsZS5yZWFkKHNlbGYuX2ZpbGVuYW1lKQorICAg
ICAgICByZXR1cm4gc2VsZi5fY29udGVudHMKKworICAgIGRlZiBzYXZlX3RvKHNlbGYsIHBhdGgs
IGZpbGVuYW1lPU5vbmUpOgorICAgICAgICBpZiBmaWxlbmFtZSBpcyBOb25lOgorICAgICAgICAg
ICAgc2VsZi5femlwX2ZpbGUuZXh0cmFjdChzZWxmLl9maWxlbmFtZSwgcGF0aCkKKyAgICAgICAg
ZWxzZToKKyAgICAgICAgICAgIHRlbXBfZGlyID0gdGVtcGZpbGUubWtkdGVtcCgpCisgICAgICAg
ICAgICBzZWxmLl96aXBfZmlsZS5leHRyYWN0KHNlbGYuX2ZpbGVuYW1lLCB0ZW1wX2RpcikKKwor
ICAgICAgICAgICAgc3JjID0gb3MucGF0aC5qb2luKHRlbXBfZGlyLCBzZWxmLl9maWxlbmFtZSkK
KyAgICAgICAgICAgIGRlc3QgPSBvcy5wYXRoLmpvaW4ocGF0aCwgZmlsZW5hbWUpCisgICAgICAg
ICAgICBzaHV0aWwuY29weWZpbGUoc3JjLCBkZXN0KQorICAgICAgICAgICAgc2h1dGlsLnJtdHJl
ZSh0ZW1wX2RpcikKKworICAgIGRlZiBkZWxldGUoc2VsZik6CisgICAgICAgIHNlbGYuX3ppcF9m
aWxlLmRlbGV0ZShzZWxmLl9maWxlbmFtZSkKKworICAgIGRlZiBuYW1lKHNlbGYpOgorICAgICAg
ICByZXR1cm4gc2VsZi5fZmlsZW5hbWUKKworICAgIGRlZiBzcGxpdGV4dChzZWxmKToKKyAgICAg
ICAgcmV0dXJuIG9zLnBhdGguc3BsaXRleHQoc2VsZi5uYW1lKCkpCisKKworY2xhc3MgRGlyZWN0
b3J5QXNaaXAob2JqZWN0KToKKyAgICAiIiJQcm92aWRlcyBhIHppcGZpbGUtbGlrZSBpbnRlcmZh
Y2UgdG8gYSBsb2NhbCBkaXJlY3RvcnkiIiIKKyAgICBkZWYgX19pbml0X18oc2VsZiwgcGF0aCk6
CisgICAgICAgIHNlbGYuX3BhdGggPSBwYXRoCisgICAgICAgIGlmIG5vdCBzZWxmLl9wYXRoLmVu
ZHN3aXRoKG9zLnBhdGguc2VwKToKKyAgICAgICAgICAgIHNlbGYuX3BhdGggKz0gb3MucGF0aC5z
ZXAKKworICAgIGRlZiBoYW5kbGVfdG8oc2VsZiwgZmlsZW5hbWUpOgorICAgICAgICByZXR1cm4g
WmlwRmlsZUhhbmRsZShzZWxmLCBmaWxlbmFtZSkKKworICAgIGRlZiBuYW1lbGlzdChzZWxmKToK
KyAgICAgICAgcmVzdWx0cyA9IFtdCisgICAgICAgIGZvciAocGF0aCwgXywgZmlsZW5hbWVzKSBp
biBvcy53YWxrKHNlbGYuX3BhdGgpOgorICAgICAgICAgICAgZm9yIGZpbGVuYW1lIGluIGZpbGVu
YW1lczoKKyAgICAgICAgICAgICAgICAjIFdlIGRyb3AgdGhlIHBhdGggdG8gdGhlIGRpcmVjdG9y
eSBmcm9tIG91ciBuYW1lbGlzdC4KKyAgICAgICAgICAgICAgICByZXN1bHRzLmFwcGVuZChvcy5w
YXRoLmpvaW4ocGF0aCwgZmlsZW5hbWUpW2xlbihzZWxmLl9wYXRoKTpdKQorICAgICAgICByZXR1
cm4gcmVzdWx0cworCisgICAgZGVmIHJlYWQoc2VsZiwgZmlsZW5hbWUpOgorICAgICAgICBmID0g
b3Blbihvcy5wYXRoLmpvaW4oc2VsZi5fcGF0aCwgZmlsZW5hbWUpKQorICAgICAgICBjb250ZW50
cyA9IGYucmVhZCgpCisgICAgICAgIGYuY2xvc2UKKyAgICAgICAgcmV0dXJuIGNvbnRlbnRzCisK
KyAgICBkZWYgZXh0cmFjdChzZWxmLCBmaWxlbmFtZSwgcGF0aCk6CisgICAgICAgIHNyYyA9IG9z
LnBhdGguam9pbihzZWxmLl9wYXRoLCBmaWxlbmFtZSkKKyAgICAgICAgZGVzdCA9IG9zLnBhdGgu
am9pbihwYXRoLCBmaWxlbmFtZSkKKyAgICAgICAgIyBBcyBmaWxlbmFtZSBtYXkgaGF2ZSBzbGFz
aGVzIGluIGl0LCB3ZSBtdXN0IGVuc3VyZSB0aGF0IHRoZSBjb3JyZWN0CisgICAgICAgICMgZGly
ZWN0b3J5IGhlaXJhcmNoeSBleGlzdHMgd2hlbiB3ZSBhcmUgY29weWluZyBpdCB0byB0aGUgb3V0
cHV0LgorICAgICAgICBwYXRoX3RvX2ZpbGUgPSBvcy5wYXRoLnNwbGl0KGZpbGVuYW1lKVswXQor
ICAgICAgICBvcy5tYWtlZGlycyhvcy5wYXRoLmpvaW4ocGF0aCwgcGF0aF90b19maWxlKSkKKyAg
ICAgICAgc2h1dGlsLmNvcHlmaWxlKHNyYywgZGVzdCkKKworICAgIGRlZiBkZWxldGUoc2VsZiwg
ZmlsZW5hbWUpOgorICAgICAgICBmaWxlbmFtZSA9IG9zLnBhdGguam9pbihzZWxmLl9wYXRoLCBm
aWxlbmFtZSkKKyAgICAgICAgb3MucmVtb3ZlKGZpbGVuYW1lKQorCisKK2NsYXNzIEJ1aWxkZXIo
b2JqZWN0KToKKyAgICAiIiJSZXRyaWV2ZXMgcmVzdWx0cyBmcm9tIHppcCBmaWxlcyBzdG9yZWQg
b24gYSBidWlsZGJvdCBidWlsZGVyIiIiCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGJ1aWxkZXJf
bmFtZSwgcGxhdGZvcm0sIHppcF9maWxlLCAqKmt3YXJncyk6CisgICAgICAgIHNlbGYuX2J1aWxk
ZXJfbmFtZSA9IGJ1aWxkZXJfbmFtZQorICAgICAgICBzZWxmLl9wbGF0Zm9ybSA9IHBsYXRmb3Jt
CisgICAgICAgIHNlbGYuX3ppcF9maWxlID0gemlwX2ZpbGUKKyAgICAgICAgc2VsZi5faW5jbHVk
ZV9leHBlY3RlZCA9IGt3YXJncy5nZXQoJ2luY2x1ZGVfZXhwZWN0ZWQnLCBUcnVlKQorCisgICAg
QGNsYXNzbWV0aG9kCisgICAgZGVmIGZyb21femlwX3VybChjbHMsIHBsYXRmb3JtLCB6aXBfcGF0
aCk6CisgICAgICAgIHJldHVybiBCdWlsZGVyKCdsb2NhbCB6aXAgJXMgYnVpbGRlcicgJSBwbGF0
Zm9ybSwgcGxhdGZvcm0sIFJlbW90ZVppcCh6aXBfcGF0aCkpCisKKyAgICBAY2xhc3NtZXRob2QK
KyAgICBkZWYgZnJvbV96aXAoY2xzLCBwbGF0Zm9ybSwgemlwKToKKyAgICAgICAgcmV0dXJuIEJ1
aWxkZXIoJ2xvY2FsIHppcCAlcyBidWlsZGVyJyAlIHBsYXRmb3JtLCBwbGF0Zm9ybSwgemlwKQor
CisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIGZyb21fcGF0aChzZWxmLCBwYXRoLCBwbGF0Zm9y
bT1Ob25lKToKKyAgICAgICAgeiA9IERpcmVjdG9yeUFzWmlwKHBhdGgpCisgICAgICAgIHJldHVy
biBCdWlsZGVyKCdsb2NhbCAlcyBidWlsZGVyJyAlIHBsYXRmb3JtLCBwbGF0Zm9ybSwgeikKKwor
ICAgIGRlZiBuYW1lKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5fYnVpbGRlcl9uYW1lCisK
KyAgICBkZWYgZmlsZXMoc2VsZik6CisgICAgICAgIGZpbGVzID0gW10KKyAgICAgICAgZm9yIGZp
bGVuYW1lIGluIHNlbGYuX3ppcF9maWxlLm5hbWVsaXN0KCk6CisgICAgICAgICAgICBmaWxlcy5h
cHBlbmQoc2VsZi5femlwX2ZpbGUuaGFuZGxlX3RvKGZpbGVuYW1lKSkKKyAgICAgICAgcmV0dXJu
IGZpbGVzCisKKyAgICBkZWYgcmVzdWx0c19mb3Ioc2VsZiwgbmFtZSwgdGFyZ2V0X3R5cGU9Tm9u
ZSk6CisgICAgICAgIGlmIHJlLnNlYXJjaChyJ1wueD9odG1sJywgbmFtZSk6CisgICAgICAgICAg
ICBuYW1lID0gbmFtZVs6bmFtZS5yaW5kZXgoJy4nKV0KKyAgICAgICAgbmFtZV9tYXRjaGVyID0g
cmUuY29tcGlsZShuYW1lKQorICAgICAgICBhY3R1YWxfbWF0Y2hlciA9IHJlLmNvbXBpbGUocict
YWN0dWFsXC4nKQorICAgICAgICBleHBlY3RlZF9tYXRjaGVyID0gcmUuY29tcGlsZShyJy1leHBl
Y3RlZFwuJykKKworICAgICAgICBjaGVja3N1bV9maWxlcyA9IFtdCisgICAgICAgIHRleHRfZmls
ZXMgPSBbXQorICAgICAgICBpbWFnZV9maWxlcyA9IFtdCisgICAgICAgIGZvciByZXN1bHRfZmls
ZSBpbiBzZWxmLmZpbGVzKCk6CisgICAgICAgICAgICBuYW1lX21hdGNoID0gbmFtZV9tYXRjaGVy
LnNlYXJjaChyZXN1bHRfZmlsZS5uYW1lKCkpCisgICAgICAgICAgICBhY3R1YWxfbWF0Y2ggPSBh
Y3R1YWxfbWF0Y2hlci5zZWFyY2gocmVzdWx0X2ZpbGUubmFtZSgpKQorICAgICAgICAgICAgZXhw
ZWN0ZWRfbWF0Y2ggPSBleHBlY3RlZF9tYXRjaGVyLnNlYXJjaChyZXN1bHRfZmlsZS5uYW1lKCkp
CisgICAgICAgICAgICBpZiBuYW1lX21hdGNoIGFuZCAoYWN0dWFsX21hdGNoIG9yIChzZWxmLl9p
bmNsdWRlX2V4cGVjdGVkIGFuZCBleHBlY3RlZF9tYXRjaCkpOgorICAgICAgICAgICAgICAgIGlm
IHJlc3VsdF9maWxlLm5hbWUoKS5lbmRzd2l0aCgnLmNoZWNrc3VtJyk6CisgICAgICAgICAgICAg
ICAgICAgIGNoZWNrc3VtX2ZpbGVzLmFwcGVuZChyZXN1bHRfZmlsZSkKKyAgICAgICAgICAgICAg
ICBlbGlmIHJlc3VsdF9maWxlLm5hbWUoKS5lbmRzd2l0aCgnLnR4dCcpOgorICAgICAgICAgICAg
ICAgICAgICB0ZXh0X2ZpbGVzLmFwcGVuZChyZXN1bHRfZmlsZSkKKyAgICAgICAgICAgICAgICBl
bGlmIHJlc3VsdF9maWxlLm5hbWUoKS5lbmRzd2l0aCgnLnBuZycpOgorICAgICAgICAgICAgICAg
ICAgICBpbWFnZV9maWxlcy5hcHBlbmQocmVzdWx0X2ZpbGUpCisKKyAgICAgICAgcmVzdWx0cyA9
IFtdCisgICAgICAgIGZvciBpbWFnZV9maWxlIGluIGltYWdlX2ZpbGVzOgorICAgICAgICAgICAg
Y2hlY2tzdW1fZmlsZV9uYW1lID0gcmUuc3ViKHJlLmNvbXBpbGUoJ1wucG5nJyksICcuY2hlY2tz
dW0nLCBpbWFnZV9maWxlLm5hbWUoKSkKKyAgICAgICAgICAgIGZvdW5kX2NoZWNrc3VtID0gRmFs
c2UKKyAgICAgICAgICAgIGZvciBjaGVja3N1bV9maWxlIGluIGNoZWNrc3VtX2ZpbGVzOgorICAg
ICAgICAgICAgICAgIGlmIGNoZWNrc3VtX2ZpbGUubmFtZSgpID09IGNoZWNrc3VtX2ZpbGVfbmFt
ZToKKyAgICAgICAgICAgICAgICAgICAgZm91bmRfY2hlY2tzdW0gPSBUcnVlCisgICAgICAgICAg
ICAgICAgICAgIHJlc3VsdHMuYXBwZW5kKHJlc3VsdC5JbWFnZVJlc3VsdChzZWxmLl9wbGF0Zm9y
bSwgaW1hZ2VfZmlsZSwgY2hlY2tzdW1fZmlsZSkpCisgICAgICAgICAgICAgICAgICAgIGJyZWFr
CisgICAgICAgICAgICBpZiBub3QgZm91bmRfY2hlY2tzdW06CisgICAgICAgICAgICAgICAgIyBw
cmludCAiQ291bGRuJ3QgZmluZCBjaGVja3N1bSBmb3IgaW1hZ2UgJyVzJyIgJSBpbWFnZV9maWxl
Lm5hbWUoKQorICAgICAgICAgICAgICAgIHJlc3VsdHMuYXBwZW5kKHJlc3VsdC5JbWFnZVJlc3Vs
dChzZWxmLl9wbGF0Zm9ybSwgaW1hZ2VfZmlsZSwgTm9uZSkpCisKKyAgICAgICAgZm9yIHRleHRf
ZmlsZSBpbiB0ZXh0X2ZpbGVzOgorICAgICAgICAgICAgcmVzdWx0cy5hcHBlbmQocmVzdWx0LlRl
eHRSZXN1bHQoc2VsZi5fcGxhdGZvcm0sIHRleHRfZmlsZSkpCisKKyAgICAgICAgcmV0dXJuIGZp
bHRlcihsYW1iZGEgcjogdGFyZ2V0X3R5cGUgaXMgTm9uZSBvciB0YXJnZXRfdHlwZSA9PSByLnR5
cGUoKSwgcmVzdWx0cykKKworCitjbGFzcyBBZ2dyZWdhdGVCdWlsZGVyKG9iamVjdCk6CisgICAg
IiIiQ29sbGVjdHMgcmVzdWx0cyBmcm9tIGEgbGlzdCBvZiBidWlsZGVycyIiIgorICAgIGRlZiBf
X2luaXRfXyhzZWxmLCBidWlsZGVycyk6CisgICAgICAgIHNlbGYuX2J1aWxkZXJzID0gYnVpbGRl
cnMKKworICAgIGRlZiByZXN1bHRzX2ZvcihzZWxmLCBuYW1lLCB0eXBlX2ZpbHRlcj1Ob25lKToK
KyAgICAgICAgcmVzdWx0cyA9IFtdCisgICAgICAgIGZvciBidWlsZGVyIGluIHNlbGYuX2J1aWxk
ZXJzOgorICAgICAgICAgICAgcmVzdWx0cyArPSBidWlsZGVyLnJlc3VsdHNfZm9yKG5hbWUsIHR5
cGVfZmlsdGVyKQorICAgICAgICByZXR1cm4gcmVzdWx0cworCisgICAgZGVmIHN1Yl9idWlsZGVy
cyhzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX2J1aWxkZXJzCisKKworIyBUT0RPIFRoaXMg
Y2xhc3MgaXMgc2ltaWxhciB0byBXZWJLaXRCdWlsZGVyIHNvIHdlIHNob3VsZCBwcm9iYWJseSBl
eHRyYWN0IGEKKyMgYmFzZSBjbGFzcy4KK2NsYXNzIENocm9taXVtQnVpbGRlcihvYmplY3QpOgor
ICAgIEJVSUxERVJTID0geworICAgICAgICAnY2hyb21pdW0tbWFjJzogJ1dlYmtpdF9NYWMxMF81
JywKKyAgICAgICAgJ2Nocm9taXVtLXdpbi12aXN0YSc6ICdXZWJraXRfV2luJywKKyAgICAgICAg
J2Nocm9taXVtLWxpbnV4JzogJ1dlYmtpdF9MaW51eF9UZXN0c19fZGJnX18xXycsCisgICAgfQor
CisgICAgZGVmIGxvb2t1cF9yZXN1bHRfemlwKHNlbGYsIGJ1aWxkZXJfbmFtZSk6CisgICAgICAg
IHJldHVybiAnaHR0cDovL2J1aWxkLmNocm9taXVtLm9yZy9mL2Nocm9taXVtL2xheW91dF90ZXN0
X3Jlc3VsdHMvJyArIGJ1aWxkZXJfbmFtZSArICcvbGF5b3V0LXRlc3QtcmVzdWx0cy56aXAnCisK
KyAgICBkZWYgcGxhdGZvcm1zKHNlbGYpOgorICAgICAgICByZXR1cm4gQ2hyb21pdW1CdWlsZGVy
LkJVSUxERVJTLmtleXMoKQorCisgICAgZGVmIGxvb2t1cF9idWlsZGVyX25hbWUoc2VsZiwgcGxh
dGZvcm0pOgorICAgICAgICBpZiBwbGF0Zm9ybSBpbiBDaHJvbWl1bUJ1aWxkZXIuQlVJTERFUlMu
a2V5cygpOgorICAgICAgICAgICAgcmV0dXJuIENocm9taXVtQnVpbGRlci5CVUlMREVSU1twbGF0
Zm9ybV0KKyAgICAgICAgcmV0dXJuIE5vbmUKKworICAgIGRlZiBidWlsZGVycyhzZWxmLCBwbGF0
Zm9ybXM9Tm9uZSk6CisgICAgICAgIGlmIHBsYXRmb3JtcyBpcyBOb25lOgorICAgICAgICAgICAg
cGxhdGZvcm1zID0gQ2hyb21pdW1CdWlsZGVyLkJVSUxERVJTLmtleXMoKQorICAgICAgICByZXR1
cm4gQWdncmVnYXRlQnVpbGRlcihtYXAoc2VsZi5idWlsZGVyLCBwbGF0Zm9ybXMpKQorCisgICAg
ZGVmIGJ1aWxkZXIoc2VsZiwgcGxhdGZvcm0pOgorICAgICAgICBpZiBwbGF0Zm9ybSBub3QgaW4g
c2VsZi5wbGF0Zm9ybXMoKToKKyAgICAgICAgICAgIHJhaXNlICInJXMnIGlzIG5vdCBhIHJlY29n
bmlzZWQgY2hyb21pdW0gcGxhdGZvcm0iICUgcGxhdGZvcm0KKyAgICAgICAgYnVpbGRlcl9uYW1l
ID0gc2VsZi5sb29rdXBfYnVpbGRlcl9uYW1lKHBsYXRmb3JtKQorICAgICAgICB6aXBfdXJsID0g
c2VsZi5sb29rdXBfcmVzdWx0X3ppcChidWlsZGVyX25hbWUpCisgICAgICAgIHByaW50ICJHb3Qg
JXMiICUgemlwX3VybAorICAgICAgICByZXR1cm4gQnVpbGRlcihidWlsZGVyX25hbWUsIHBsYXRm
b3JtLCBSZW1vdGVaaXAoemlwX3VybCksIGluY2x1ZGVfZXhwZWN0ZWQ9RmFsc2UpCisKKworY2xh
c3MgV2ViS2l0QnVpbGRlcihvYmplY3QpOgorICAgIEJVSUxERVJTID0geworICAgICAgICAnbWFj
LXNub3dsZW9wYXJkJzogJ1Nub3dMZW9wYXJkJTIwSW50ZWwlMjBSZWxlYXNlJTIwKFRlc3RzKScs
CisgICAgICAgICdtYWMtbGVvcGFyZCc6ICdMZW9wYXJkJTIwSW50ZWwlMjBEZWJ1ZyUyMChUZXN0
cyknLAorICAgICAgICAnd2luJzogJ1dpbmRvd3MlMjA3JTIwUmVsZWFzZSUyMChXZWJLaXQyJTIw
VGVzdHMpJywKKyAgICAgICAgJ2Nocm9taXVtLWxpbnV4JzogJ0dUSyUyMExpbnV4JTIwMzItYml0
JTIwUmVsZWFzZScsCisgICAgfQorCisgICAgZGVmIHBsYXRmb3JtcyhzZWxmKToKKyAgICAgICAg
cmV0dXJuIFdlYktpdEJ1aWxkZXIuQlVJTERFUlMua2V5cygpCisKKyAgICBkZWYgbG9va3VwX2J1
aWxkZXJfbmFtZShzZWxmLCBwbGF0Zm9ybSk6CisgICAgICAgIHJldHVybiBXZWJLaXRCdWlsZGVy
LkJVSUxERVJTW3BsYXRmb3JtXQorCisgICAgZGVmIGxvb2t1cF9yZXN1bHRfemlwKHNlbGYsIGJ1
aWxkZXJfbmFtZSk6CisgICAgICAgICIiIkdldHMgdGhlIFVSTCBvZiBhIHppcGZpbGUgY29udGFp
bmluZyB0aGUgbGF0ZXN0IHJlc3VsdHMgYnkgc2NyYXBpbmcgdGhlCisgICAgICAgICAgICAgIEhU
TUwgZGlyZWN0b3J5IGxpc3Rpbmcgb2YgdGhlIGJ1aWxkZXIiIiIKKyAgICAgICAgcmVzdWx0c19k
aXJfdXJsID0gJ2h0dHA6Ly9idWlsZC53ZWJraXQub3JnL3Jlc3VsdHMvJyArIGJ1aWxkZXJfbmFt
ZSArICcvJworCisgICAgICAgICMgcHJpbnQgIkxvb2tpbmcgaW4gJXMgZm9yIHppcHMiICUgcmVz
dWx0c19kaXJfdXJsCisgICAgICAgIGYgPSB1cmxsaWIudXJsb3BlbihyZXN1bHRzX2Rpcl91cmwp
CisgICAgICAgIHppcF91cmwgPSBOb25lCisgICAgICAgIGhyZWZfcmUgPSByZS5jb21waWxlKHIn
YSBocmVmPSIoLipcLnppcCkiPicpCisgICAgICAgIGZvciBsaW5lIGluIGY6CisgICAgICAgICAg
ICBtYXRjaCA9IGhyZWZfcmUuc2VhcmNoKGxpbmUpCisgICAgICAgICAgICBpZiBtYXRjaDoKKyAg
ICAgICAgICAgICAgICB6aXBfdXJsID0gbWF0Y2guZ3JvdXAoMSkKKworICAgICAgICBpZiB6aXBf
dXJsIGlzIE5vbmU6CisgICAgICAgICAgICByYWlzZSBFeGNlcHRpb24oIkNvdWxkbid0IGZpbmQg
YW55IHJlc3VsdHMgYXJjaGl2ZXMgb24gdGhlIFdlYktpdCBidWlsZGVyICclcyciICUgYnVpbGRl
cl9uYW1lKQorCisgICAgICAgIHJldHVybiByZXN1bHRzX2Rpcl91cmwgKyB6aXBfdXJsCisKKyAg
ICBkZWYgYnVpbGRlcnMoc2VsZiwgcGxhdGZvcm1zPU5vbmUpOgorICAgICAgICBpZiBwbGF0Zm9y
bXMgaXMgTm9uZToKKyAgICAgICAgICAgIHBsYXRmb3JtcyA9IHNlbGYucGxhdGZvcm1zKCkKKyAg
ICAgICAgcmV0dXJuIEFnZ3JlZ2F0ZUJ1aWxkZXIobWFwKHNlbGYuYnVpbGRlciwgcGxhdGZvcm1z
KSkKKworICAgIGRlZiBidWlsZGVyKHNlbGYsIHBsYXRmb3JtKToKKyAgICAgICAgaWYgcGxhdGZv
cm0gbm90IGluIHNlbGYucGxhdGZvcm1zKCk6CisgICAgICAgICAgICByYWlzZSBFeGNlcHRpb24o
IiclcycgaXMgbm90IGEgcmVjb2duaXNlZCB3ZWJraXQgcGxhdGZvcm0iICUgcGxhdGZvcm0pCisg
ICAgICAgIGJ1aWxkZXJfbmFtZSA9IHNlbGYubG9va3VwX2J1aWxkZXJfbmFtZShwbGF0Zm9ybSkK
KyAgICAgICAgemlwX3VybCA9IHNlbGYubG9va3VwX3Jlc3VsdF96aXAoYnVpbGRlcl9uYW1lKQor
ICAgICAgICByZXR1cm4gQnVpbGRlcihidWlsZGVyX25hbWUsIHBsYXRmb3JtLCBSZW1vdGVaaXAo
emlwX3VybCksIGluY2x1ZGVfZXhwZWN0ZWQ9RmFsc2UpCmRpZmYgLS1naXQgYS9XZWJLaXRUb29s
cy9TY3JpcHRzL3dlYmtpdHB5L2xheW91dF90ZXN0cy9yZWJhc2VsaW5lL2J1aWxkZXJfdW5pdHRl
c3QucHkgYi9XZWJLaXRUb29scy9TY3JpcHRzL3dlYmtpdHB5L2xheW91dF90ZXN0cy9yZWJhc2Vs
aW5lL2J1aWxkZXJfdW5pdHRlc3QucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMC4uMDQ3YTFhNjdjY2ZhNWQ3MWZmMThk
YmY3ZTU5YjBlZWVjMTBjN2IwMQotLS0gL2Rldi9udWxsCisrKyBiL1dlYktpdFRvb2xzL1Njcmlw
dHMvd2Via2l0cHkvbGF5b3V0X3Rlc3RzL3JlYmFzZWxpbmUvYnVpbGRlcl91bml0dGVzdC5weQpA
QCAtMCwwICsxLDE1MSBAQAorIyEvdXNyL2Jpbi9lbnYgcHl0aG9uCisjIENvcHlyaWdodCAoQykg
MjAxMCBHb29nbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorIworIyBSZWRpc3RyaWJ1dGlv
biBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyMg
bW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBj
b25kaXRpb25zCisjIGFyZSBtZXQ6CisjCisjIDEuICBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNl
IGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorIyAgICAgbm90aWNlLCB0aGlz
IGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorIyAyLiAg
UmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBj
b3B5cmlnaHQKKyMgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBm
b2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyMgICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90
aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisjCisjIFRISVMg
U09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgQU5EIElUUyBDT05UUklCVVRPUlMgIkFTIElT
IiBBTkQgQU5ZCisjIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJV
VCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQKKyMgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFC
SUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQorIyBESVNDTEFJ
TUVELiBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBPUiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJM
RSBGT1IgQU5ZCisjIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1Q
TEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCisjIChJTkNMVURJTkcsIEJVVCBOT1QgTElN
SVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyMg
TE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikg
SE9XRVZFUiBDQVVTRUQgQU5ECisjIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVS
IElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisjIChJTkNMVURJTkcgTkVH
TElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBP
RgorIyBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9G
IFNVQ0ggREFNQUdFLgorCitpbXBvcnQgYnVpbGRlcgoraW1wb3J0IHVuaXR0ZXN0CisKKworY2xh
c3MgRmFrZVppcChvYmplY3QpOgorICAgIGRlZiBfX2luaXRfXyhzZWxmKToKKyAgICAgICAgc2Vs
Zi5fZmlsZXMgPSB7fQorCisgICAgZGVmIF9fc3RyX18oc2VsZik6CisgICAgICAgIHJldHVybiAi
RmFrZVppcCIKKworICAgIGRlZiBpbnNlcnQoc2VsZiwgZmlsZW5hbWUsIGNvbnRlbnQpOgorICAg
ICAgICBzZWxmLl9maWxlc1tmaWxlbmFtZV0gPSBjb250ZW50CisKKyAgICBkZWYgbmFtZWxpc3Qo
c2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLl9maWxlcy5rZXlzKCkKKworICAgIGRlZiBoYW5k
bGVfdG8oc2VsZiwgZmlsZW5hbWUpOgorICAgICAgICByZXR1cm4gYnVpbGRlci5aaXBGaWxlSGFu
ZGxlKHNlbGYsIGZpbGVuYW1lKQorCisgICAgZGVmIHJlYWQoc2VsZiwgZmlsZW5hbWUpOgorICAg
ICAgICByZXR1cm4gc2VsZi5fZmlsZXNbZmlsZW5hbWVdCisKKyAgICBkZWYgZXh0cmFjdChzZWxm
LCBmaWxlbmFtZSwgcGF0aCk6CisgICAgICAgIHByaW50ICJGYWtlWmlwPiBjcCAlcyAlcyIgJSAo
ZmlsZW5hbWUsIHBhdGgpCisKKyAgICBkZWYgZGVsZXRlKHNlbGYsIGZpbGVuYW1lKToKKyAgICAg
ICAgcHJpbnQgIkZha2VaaXA+IHJtICVzIiAlIGZpbGVuYW1lCisgICAgICAgIHNlbGYuX2ZpbGVz
W2ZpbGVuYW1lXSA9IE5vbmUKKworCitjbGFzcyBCdWlsZGVyVGVzdCh1bml0dGVzdC5UZXN0Q2Fz
ZSk6CisgICAgZGVmIF9idWlsZGVyX3dpdGhfemlwKHNlbGYsIHppcCwgKiprd2FyZ3MpOgorICAg
ICAgICByZXR1cm4gYnVpbGRlci5CdWlsZGVyKCc8ZmFrZS1idWlsZGVyPicsICc8ZmFrZS1wbGF0
Zm9ybT4nLCB6aXAsICoqa3dhcmdzKQorCisgICAgZGVmIHRlc3RUZXh0RmlsZXNHZXRJbnRlcnBy
ZXRlZEFzVGV4dFJlc3VsdHMoc2VsZik6CisgICAgICAgIHppcCA9IEZha2VaaXAoKQorICAgICAg
ICB6aXAuaW5zZXJ0KCdmYXN0L2RvbS9zb21lLXRlc3QtYWN0dWFsLnR4dCcsICdhY3R1YWwgcmVz
dWx0cycpCisgICAgICAgIGIgPSBzZWxmLl9idWlsZGVyX3dpdGhfemlwKHppcCkKKyAgICAgICAg
c2VsZi5hc3NlcnRFcXVhbHMoMSwgbGVuKGIucmVzdWx0c19mb3IoJ2Zhc3QvZG9tL3NvbWUtdGVz
dCcpKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoJ2Zhc3QvZG9tL3NvbWUtdGVzdCcsIGIu
cmVzdWx0c19mb3IoJ2Zhc3QvZG9tL3NvbWUtdGVzdC5odG1sJylbMF0ubmFtZSgpKQorCisgICAg
ZGVmIHRlc3RJbWFnZUFuZENoZWNrc3VtRmlsZXNHZXRJbnRlcnByZXRlZEFzQVNpbmdsZUltYWdl
UmVzdWx0KHNlbGYpOgorICAgICAgICB6aXAgPSBGYWtlWmlwKCkKKyAgICAgICAgemlwLmluc2Vy
dCgnZmFzdC9kb20vc29tZS10ZXN0LWFjdHVhbC5jaGVja3N1bScsICdhYmMxMjMnKQorICAgICAg
ICB6aXAuaW5zZXJ0KCdmYXN0L2RvbS9zb21lLXRlc3QtYWN0dWFsLnBuZycsICc8aW1hZ2UgZGF0
YT4nKQorICAgICAgICBiID0gc2VsZi5fYnVpbGRlcl93aXRoX3ppcCh6aXApCisgICAgICAgIHJl
c3VsdHMgPSBiLnJlc3VsdHNfZm9yKCdmYXN0L2RvbS9zb21lLXRlc3QnKQorICAgICAgICBzZWxm
LmFzc2VydEVxdWFscygxLCBsZW4ocmVzdWx0cykpCisgICAgICAgIHJlc3VsdCA9IHJlc3VsdHNb
MF0KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoJ2ltYWdlJywgcmVzdWx0LnR5cGUoKSkKKyAg
ICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoJ2FiYzEyMycsIHJlc3VsdC5jb250ZW50cygpKQorCisg
ICAgZGVmIHRlc3RNdWx0aXBsZUltYWdlUmVzdWx0c0FyZURldGVjdGVkKHNlbGYpOgorICAgICAg
ICB6aXAgPSBGYWtlWmlwKCkKKyAgICAgICAgemlwLmluc2VydCgncGxhdGZvcm0vd2luL2Zhc3Qv
ZG9tL3NvbWUtdGVzdC1hY3R1YWwuY2hlY2tzdW0nLCAnY2hlY2tzdW0xJykKKyAgICAgICAgemlw
Lmluc2VydCgncGxhdGZvcm0vd2luL2Zhc3QvZG9tL3NvbWUtdGVzdC1hY3R1YWwucG5nJywgJzxp
bWFnZSBkYXRhIDE+JykKKyAgICAgICAgemlwLmluc2VydCgncGxhdGZvcm0vbWFjL2Zhc3QvZG9t
L3NvbWUtdGVzdC1hY3R1YWwuY2hlY2tzdW0nLCAnY2hlY2tzdW0yJykKKyAgICAgICAgemlwLmlu
c2VydCgncGxhdGZvcm0vbWFjL2Zhc3QvZG9tL3NvbWUtdGVzdC1hY3R1YWwucG5nJywgJzxpbWFn
ZSBkYXRhIDI+JykKKyAgICAgICAgYiA9IHNlbGYuX2J1aWxkZXJfd2l0aF96aXAoemlwKQorICAg
ICAgICByZXN1bHRzID0gYi5yZXN1bHRzX2ZvcignZmFzdC9kb20vc29tZS10ZXN0JykKKyAgICAg
ICAgc2VsZi5hc3NlcnRFcXVhbHMoMiwgbGVuKHJlc3VsdHMpKQorICAgICAgICBzZWxmLmFzc2Vy
dEZhbHNlKHJlc3VsdHNbMF0uc2FtZV9jb250ZW50KHJlc3VsdHNbMV0pKQorCisgICAgZGVmIHRl
c3RBZ2dyZWdhdGVCdWlsZGVyQ29ycmVjdGx5UmV0cmlldmVzVGVzdHNGcm9tTXVsdGlwbGVCdWls
ZGVycyhzZWxmKToKKyAgICAgICAgYnVpbGRlcjFfemlwID0gRmFrZVppcCgpCisgICAgICAgIGJ1
aWxkZXIxX3ppcC5pbnNlcnQoJ2Zhc3QvZG9tL3Rlc3QtYWN0dWFsLnR4dCcsICdsaW51eCB0ZXh0
IHJlc3VsdCcpCisgICAgICAgIGJ1aWxkZXIxID0gYnVpbGRlci5CdWlsZGVyKCdsaW51eC1idWls
ZGVyJywgJ2xpbnV4JywgYnVpbGRlcjFfemlwKQorICAgICAgICBidWlsZGVyMl96aXAgPSBGYWtl
WmlwKCkKKyAgICAgICAgYnVpbGRlcjJfemlwLmluc2VydCgnZmFzdC9kb20vdGVzdC1hY3R1YWwu
dHh0JywgJ3dpbmRvd3MgdGV4dCByZXN1bHQnKQorICAgICAgICBidWlsZGVyMiA9IGJ1aWxkZXIu
QnVpbGRlcignd2luLWJ1aWxkZXInLCAnd2luJywgYnVpbGRlcjJfemlwKQorCisgICAgICAgIGIg
PSBidWlsZGVyLkFnZ3JlZ2F0ZUJ1aWxkZXIoW2J1aWxkZXIxLCBidWlsZGVyMl0pCisgICAgICAg
IHNlbGYuYXNzZXJ0RXF1YWxzKDIsIGxlbihiLnJlc3VsdHNfZm9yKCdmYXN0L2RvbS90ZXN0Jykp
KQorCisgICAgZGVmIHRlc3RDYW5JbmZlclBsYXRmb3JtRnJvbVBhdGhJZk5vbmVQcm92aWRlZChz
ZWxmKToKKyAgICAgICAgemlwID0gRmFrZVppcCgpCisgICAgICAgIHppcC5pbnNlcnQoJ3BsYXRm
b3JtL3dpbi9zb21lLXRlc3QtZXhwZWN0ZWQucG5nJywgJzxpbWFnZSBkYXRhPicpCisgICAgICAg
IHppcC5pbnNlcnQoJ3BsYXRmb3JtL3dpbi9zb21lLXRlc3QtZXhwZWN0ZWQuY2hlY2tzdW0nLCAn
YWJjMTIzJykKKyAgICAgICAgYiA9IGJ1aWxkZXIuQnVpbGRlcignbG9jYWwgTGF5b3V0VGVzdHMg
YnVpbGRlcicsIE5vbmUsIHppcCkKKworICAgICAgICByZXN1bHRzID0gYi5yZXN1bHRzX2Zvcign
c29tZS10ZXN0JykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoMSwgbGVuKHJlc3VsdHMpKQor
ICAgICAgICBzZWxmLmFzc2VydEVxdWFscygnd2luJywgcmVzdWx0c1swXS5wbGF0Zm9ybSgpKQor
CisgICAgZGVmIHRlc3RUZXN0RXh0ZW5zaW9uSXNJZ25vcmVkKHNlbGYpOgorICAgICAgICB6aXAg
PSBGYWtlWmlwKCkKKyAgICAgICAgemlwLmluc2VydCgndGVzdC90ZXN0LWEtYWN0dWFsLnR4dCcs
ICdhY3R1YWwgcmVzdWx0cycpCisgICAgICAgIGIgPSBzZWxmLl9idWlsZGVyX3dpdGhfemlwKHpp
cCkKKyAgICAgICAgcmVzdWx0cyA9IGIucmVzdWx0c19mb3IoJ3Rlc3QvdGVzdC1hLmh0bWwnKQor
ICAgICAgICBzZWxmLmFzc2VydEVxdWFscygxLCBsZW4ocmVzdWx0cykpCisgICAgICAgIHNlbGYu
YXNzZXJ0RXF1YWxzKCd0ZXN0L3Rlc3QtYScsIHJlc3VsdHNbMF0ubmFtZSgpKQorCisgICAgZGVm
IHRlc3RFeGlzdGluZ1Jlc3VsdHNBcmVNYXJrZWRBc1N1Y2goc2VsZik6CisgICAgICAgIHppcCA9
IEZha2VaaXAoKQorICAgICAgICB6aXAuaW5zZXJ0KCd0ZXN0L3Rlc3QtYS1leHBlY3RlZC50eHQn
LCAnZXhwZWN0ZWQgcmVzdWx0cycpCisgICAgICAgIGIgPSBzZWxmLl9idWlsZGVyX3dpdGhfemlw
KHppcCkKKyAgICAgICAgcmVzdWx0cyA9IGIucmVzdWx0c19mb3IoJ3Rlc3QvdGVzdC1hLmh0bWwn
KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscygxLCBsZW4ocmVzdWx0cykpCisgICAgICAgIHNl
bGYuYXNzZXJ0RmFsc2UocmVzdWx0c1swXS5pc19hY3R1YWwoKSkKKworICAgIGRlZiB0ZXN0T25s
eVJldHVybnNSZXN1bHRzT2ZTcGVjaWZpZWRUeXBlKHNlbGYpOgorICAgICAgICB6aXAgPSBGYWtl
WmlwKCkKKyAgICAgICAgemlwLmluc2VydCgndGVzdC90ZXN0LWEtZXhwZWN0ZWQudHh0JywgJ2V4
cGVjdGVkIHJlc3VsdHMnKQorICAgICAgICB6aXAuaW5zZXJ0KCd0ZXN0L3Rlc3QtYS1leHBlY3Rl
ZC5jaGVja3N1bScsICdleHBlY3RlZCByZXN1bHRzJykKKyAgICAgICAgemlwLmluc2VydCgndGVz
dC90ZXN0LWEtZXhwZWN0ZWQucG5nJywgJ2V4cGVjdGVkIHJlc3VsdHMnKQorICAgICAgICBiID0g
c2VsZi5fYnVpbGRlcl93aXRoX3ppcCh6aXApCisKKyAgICAgICAgcmVzdWx0cyA9IGIucmVzdWx0
c19mb3IoJ3Rlc3QvdGVzdC1hLmh0bWwnKQorICAgICAgICB0ZXh0X3Jlc3VsdHMgPSBiLnJlc3Vs
dHNfZm9yKCd0ZXN0L3Rlc3QtYS5odG1sJywgJ3RleHQnKQorICAgICAgICBpbWFnZV9yZXN1bHRz
ID0gYi5yZXN1bHRzX2ZvcigndGVzdC90ZXN0LWEuaHRtbCcsICdpbWFnZScpCisKKyAgICAgICAg
c2VsZi5hc3NlcnRFcXVhbHMoMiwgbGVuKHJlc3VsdHMpKQorICAgICAgICBzZWxmLmFzc2VydEVx
dWFscygxLCBsZW4odGV4dF9yZXN1bHRzKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoMSwg
bGVuKGltYWdlX3Jlc3VsdHMpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscygndGV4dCcsIHRl
eHRfcmVzdWx0c1swXS50eXBlKCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKCdpbWFnZScs
IGltYWdlX3Jlc3VsdHNbMF0udHlwZSgpKQorCisgICAgZGVmIHRlc3RFeGNsdWRlRXhwZWN0ZWRS
ZXN1bHRzV29ya3Moc2VsZik6CisgICAgICAgIHppcCA9IEZha2VaaXAoKQorICAgICAgICB6aXAu
aW5zZXJ0KCd0ZXN0LWV4cGVjdGVkLnR4dCcsICAnZXhwZWN0ZWQgcmVzdWx0cyBzdG9yZWQgb24g
c2VydmVyIGZvciBzb21lIHJlYXNvbicpCisgICAgICAgIGIgPSBzZWxmLl9idWlsZGVyX3dpdGhf
emlwKHppcCwgaW5jbHVkZV9leHBlY3RlZD1GYWxzZSkKKyAgICAgICAgcmVzdWx0cyA9IGIucmVz
dWx0c19mb3IoJ3Rlc3QnLCBOb25lKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscygwLCBsZW4o
cmVzdWx0cykpCisKK2lmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CisgICAgdW5pdHRlc3QubWFp
bigpCmRpZmYgLS1naXQgYS9XZWJLaXRUb29scy9TY3JpcHRzL3dlYmtpdHB5L2xheW91dF90ZXN0
cy9yZWJhc2VsaW5lL2ludGVncmF0aW9uX3VuaXR0ZXN0LnB5IGIvV2ViS2l0VG9vbHMvU2NyaXB0
cy93ZWJraXRweS9sYXlvdXRfdGVzdHMvcmViYXNlbGluZS9pbnRlZ3JhdGlvbl91bml0dGVzdC5w
eQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwLi41MzY4Zjk0ZjJmN2NkZTNjNmU4OTE2NGNhZThkNmExOTFiODU2MWM1Ci0t
LSAvZGV2L251bGwKKysrIGIvV2ViS2l0VG9vbHMvU2NyaXB0cy93ZWJraXRweS9sYXlvdXRfdGVz
dHMvcmViYXNlbGluZS9pbnRlZ3JhdGlvbl91bml0dGVzdC5weQpAQCAtMCwwICsxLDEyMSBAQAor
IyEvdXNyL2Jpbi9lbnYgcHl0aG9uCisjIENvcHlyaWdodCAoQykgMjAxMCBHb29nbGUgSW5jLiBB
bGwgcmlnaHRzIHJlc2VydmVkLgorIworIyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJj
ZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyMgbW9kaWZpY2F0aW9uLCBhcmUg
cGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisjIGFyZSBt
ZXQ6CisjCisjIDEuICBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4g
dGhlIGFib3ZlIGNvcHlyaWdodAorIyAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9u
cyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorIyAyLiAgUmVkaXN0cmlidXRpb25zIGlu
IGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyMgICAgIG5v
dGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1l
ciBpbiB0aGUKKyMgICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92
aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisjCisjIFRISVMgU09GVFdBUkUgSVMgUFJPVklE
RUQgQlkgQVBQTEUgQU5EIElUUyBDT05UUklCVVRPUlMgIkFTIElTIiBBTkQgQU5ZCisjIEVYUFJF
U1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywg
VEhFIElNUExJRUQKKyMgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1Mg
Rk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQorIyBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBT
SEFMTCBBUFBMRSBPUiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZCisjIERJUkVD
VCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVO
VElBTCBEQU1BR0VTCisjIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1F
TlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyMgTE9TUyBPRiBVU0UsIERBVEEs
IE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5E
CisjIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJ
Q1QgTElBQklMSVRZLCBPUiBUT1JUCisjIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJ
U0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorIyBUSElTIFNPRlRXQVJF
LCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCitp
bXBvcnQgYnVja2V0CitpbXBvcnQgYnVpbGRlcgorZnJvbSByZXN1bHRfdW5pdHRlc3QgaW1wb3J0
IEZha2VSZXN1bHQKK2Zyb20gYnVpbGRlcl91bml0dGVzdCBpbXBvcnQgRmFrZVppcAoraW1wb3J0
IHVuaXR0ZXN0CisKKworY2xhc3MgUmViYXNlbGluZUludGVncmF0aW9uVGVzdCh1bml0dGVzdC5U
ZXN0Q2FzZSk6CisgICAgZGVmIF9sb2coc2VsZiwgbXNnKToKKyAgICAgICAgIyBwcmludCBtc2cK
KyAgICAgICAgcGFzcworCisgICAgZGVmIF9kdW1wKHNlbGYsIGIpOgorICAgICAgICBzZWxmLl9s
b2coJy0nICogODApCisgICAgICAgIGIucm9vdF9idWNrZXQoKS5kdW1wKGJ1Y2tldC5JbmRlbnRl
ZExvZ2dlcihzZWxmLl9sb2cpKQorCisgICAgZGVmIHRlc3RFdmVyeXRoaW5nKHNlbGYpOgorICAg
ICAgICBiID0gYnVja2V0LkJ1Y2tldFRyZWUoKQorICAgICAgICBiLmIoTm9uZSwKKyAgICAgICAg
ICAgIGIuYignbWFjJywKKyAgICAgICAgICAgICAgICBiLmIoJ21hYy1zbm93bGVvcGFyZCcsCisg
ICAgICAgICAgICAgICAgICAgIGIuYignbWFjLWxlb3BhcmQnLAorICAgICAgICAgICAgICAgICAg
ICAgICAgYi5iKCdtYWMtdGlnZXInKSkpLAorICAgICAgICAgICAgICAgIGIuYignd2luJywKKyAg
ICAgICAgICAgICAgICAgICAgYi5iKCdjaHJvbWl1bScsCisgICAgICAgICAgICAgICAgICAgICAg
ICBiLmIoJ2Nocm9taXVtLW1hYycpLAorICAgICAgICAgICAgICAgICAgICAgICAgYi5iKCdjaHJv
bWl1bS13aW4nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGIuYignY2hyb21pdW0td2lu
LXZpc3RhJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYi5iKCdjaHJvbWl1bS13
aW4teHAnKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYi5iKCdjaHJvbWl1bS1saW51
eCcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGIuYignY2hyb21pdW0tZ3B1JywK
KyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGIuYignY2hyb21pdW0tZ3B1LWxp
bnV4JyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiLmIoJ2Nocm9taXVt
LWdwdS13aW4nKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGIuYignY2hy
b21pdW0tZ3B1LW1hYycpKSkpKSkpLAorICAgICAgICAgICAgYi5iKCdxdCcsCisgICAgICAgICAg
ICAgICAgYi5iKCdxdC1saW51eCcpLAorICAgICAgICAgICAgICAgIGIuYigncXQtbWFjJyksCisg
ICAgICAgICAgICAgICAgYi5iKCdxdC13aW4nKSkpCisKKyAgICAgICAgQUdHUkVHQVRFX0JVQ0tF
VFMgPSBbJ2Nocm9taXVtJywgJ2Nocm9taXVtLXdpbicsICd3aW4nLCAnbWFjJywgJ3F0JywgJ2No
cm9taXVtLWdwdSddCisgICAgICAgIGZvciBidWNrZXRfbmFtZSBpbiBBR0dSRUdBVEVfQlVDS0VU
UzoKKyAgICAgICAgICAgIGIuZ2V0X2J1Y2tldChidWNrZXRfbmFtZSkubWFya19hc19hZ2dyZWdh
dGUoKQorCisgICAgICAgIGxheW91dF90ZXN0cyA9IEZha2VaaXAoKQorICAgICAgICBsYXlvdXRf
dGVzdHMuaW5zZXJ0KCdMYXlvdXRUZXN0cy9mYXN0L2RvbS90ZXN0Lmh0bWwnLCAnPGh0bWw+QSB0
ZXN0PC9odG1sPicpCisgICAgICAgIGxheW91dF90ZXN0cy5pbnNlcnQoJ0xheW91dFRlc3RzL2Zh
c3QvZG9tL3Rlc3QtZXhwZWN0ZWQudHh0JywgJ2Jhc2UgcmVzdWx0JykKKyAgICAgICAgbGF5b3V0
X3Rlc3RzLmluc2VydCgnTGF5b3V0VGVzdHMvcGxhdGZvcm0vY2hyb21pdW0td2luL2Zhc3QvZG9t
L3Rlc3QtZXhwZWN0ZWQudHh0JywgJ3dpbiByZXN1bHQnKQorCisgICAgICAgIHdpbl94cF9ib3Qg
PSBGYWtlWmlwKCkKKyAgICAgICAgd2luX3hwX2JvdC5pbnNlcnQoJ2Zhc3QvZG9tL3Rlc3QtYWN0
dWFsLnR4dCcsICduZXcgd2luIHJlc3VsdCcpCisKKyAgICAgICAgd2luX3Zpc3RhX2JvdCA9IEZh
a2VaaXAoKQorICAgICAgICB3aW5fdmlzdGFfYm90Lmluc2VydCgnZmFzdC9kb20vdGVzdC1hY3R1
YWwudHh0JywgJ25ldyB3aW4gcmVzdWx0JykKKworICAgICAgICBsaW51eF9ib3QgPSBGYWtlWmlw
KCkKKyAgICAgICAgbGludXhfYm90Lmluc2VydCgnZmFzdC9kb20vdGVzdC1hY3R1YWwudHh0Jywg
J25ldyB3aW4gcmVzdWx0JykKKworICAgICAgICBmYWN0b3J5ID0gYnVpbGRlci5CdWlsZGVyCisg
ICAgICAgIGJ1aWxkZXJzID0gW10KKyAgICAgICAgYnVpbGRlcnMuYXBwZW5kKGZhY3RvcnkuZnJv
bV96aXAoJ2Nocm9taXVtLXdpbi14cCcsIHdpbl94cF9ib3QpKQorICAgICAgICBidWlsZGVycy5h
cHBlbmQoZmFjdG9yeS5mcm9tX3ppcCgnY2hyb21pdW0td2luLXZpc3RhJywgd2luX3Zpc3RhX2Jv
dCkpCisgICAgICAgIGJ1aWxkZXJzLmFwcGVuZChmYWN0b3J5LmZyb21femlwKCdjaHJvbWl1bS1s
aW51eCcsIGxpbnV4X2JvdCkpCisgICAgICAgIGJ1aWxkYm90c19idWlsZGVyID0gYnVpbGRlci5B
Z2dyZWdhdGVCdWlsZGVyKGJ1aWxkZXJzKQorICAgICAgICBsYXlvdXRfYnVpbGRlciA9IGZhY3Rv
cnkuZnJvbV96aXAoTm9uZSwgbGF5b3V0X3Rlc3RzKQorCisgICAgICAgIGJ1aWxkYm90X3Jlc3Vs
dHMgPSBidWlsZGJvdHNfYnVpbGRlci5yZXN1bHRzX2ZvcignZmFzdC9kb20vdGVzdC5odG1sJykK
KyAgICAgICAgbGF5b3V0X3Jlc3VsdHMgPSBsYXlvdXRfYnVpbGRlci5yZXN1bHRzX2ZvcignZmFz
dC9kb20vdGVzdC5odG1sJykKKworICAgICAgICBmb3IgciBpbiBidWlsZGJvdF9yZXN1bHRzICsg
bGF5b3V0X3Jlc3VsdHM6CisgICAgICAgICAgICBzZWxmLl9sb2coIltJXSAlcyIgJSByKQorICAg
ICAgICAgICAgYi5pbnNlcnRfcmVzdWx0KHIpCisKKyAgICAgICAgIyBzZWxmLl9kdW1wKGIpCisg
ICAgICAgIHNlbGYuX2xvZygiXG5DT0xMQVBTRVxuIikKKyAgICAgICAgYi5jb2xsYXBzZSgpCisg
ICAgICAgICMgc2VsZi5fZHVtcChiKQorCisgICAgICAgIGZvciByIGluIGIucmVzdWx0cygpOgor
ICAgICAgICAgICAgc2VsZi5fbG9nKCJbT10gJXMiICUgcikKKworICAgICAgICBkZWR1cGVkX3Jl
c3VsdHMgPSBiLnJlc3VsdHMoKQorICAgICAgICAjIFNob3VsZCBvbmx5IGhhdmUgdGhlIE5vbmUg
YW5kIHRoZSB3aW4gcmVzdWx0LgorICAgICAgICBzZWxmLmFzc2VydEVxdWFscygyLCBsZW4oZGVk
dXBlZF9yZXN1bHRzKSkKKworICAgICAgICAjIGRyID0gc2V0KGRlZHVwZWRfcmVzdWx0cykKKyAg
ICAgICAgIyBsciA9IHNldChsYXlvdXRfcmVzdWx0cykKKworICAgICAgICAjIHByaW50ICJEdXBl
cyBpbiBsYXlvdXRfcmVzdWx0cyIKKyAgICAgICAgIyBmb3IgciBpbiBsciAtIGRyOgorICAgICAg
ICAjICAgci5kZWxldGUoKQorCisgICAgICAgICMgcHJpbnQgIk5ldyByZXN1bHRzIgorICAgICAg
ICAjIGZvciByIGluIGRyIC0gbHI6CisgICAgICAgICMgICByLmluc3RhbGwoJ0xheW91dFRlc3Rz
JykKKworaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKKyAgICB1bml0dGVzdC5tYWluKCkKZGlm
ZiAtLWdpdCBhL1dlYktpdFRvb2xzL1NjcmlwdHMvd2Via2l0cHkvbGF5b3V0X3Rlc3RzL3JlYmFz
ZWxpbmUvcmViYXNlbGluZXIucHkgYi9XZWJLaXRUb29scy9TY3JpcHRzL3dlYmtpdHB5L2xheW91
dF90ZXN0cy9yZWJhc2VsaW5lL3JlYmFzZWxpbmVyLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0Cmlu
ZGV4IDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAuLjQ0Y2JjNmI3OWI5
NmNhOWE5ZDdiMzQ1MjUwZmUwNzJlZGY3MzcyYTQKLS0tIC9kZXYvbnVsbAorKysgYi9XZWJLaXRU
b29scy9TY3JpcHRzL3dlYmtpdHB5L2xheW91dF90ZXN0cy9yZWJhc2VsaW5lL3JlYmFzZWxpbmVy
LnB5CkBAIC0wLDAgKzEsMTMxIEBACisjIS91c3IvYmluL2VudiBweXRob24KKyMgQ29weXJpZ2h0
IChDKSAyMDEwIEdvb2dsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisjCisjIFJlZGlzdHJp
YnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91
dAorIyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93
aW5nIGNvbmRpdGlvbnMKKyMgYXJlIG1ldDoKKyMKKyMgMS4gIFJlZGlzdHJpYnV0aW9ucyBvZiBz
b3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisjICAgICBub3RpY2Us
IHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisj
IDIuICBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFi
b3ZlIGNvcHlyaWdodAorIyAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQg
dGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorIyAgICAgZG9jdW1lbnRhdGlvbiBhbmQv
b3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyMKKyMg
VEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBBTkQgSVRTIENPTlRSSUJVVE9SUyAi
QVMgSVMiIEFORCBBTlkKKyMgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElO
RywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRAorIyBXQVJSQU5USUVTIE9GIE1FUkNI
QU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCisjIERJ
U0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIE9SIElUUyBDT05UUklCVVRPUlMgQkUg
TElBQkxFIEZPUiBBTlkKKyMgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwg
RVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMKKyMgKElOQ0xVRElORywgQlVUIE5P
VCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VT
OworIyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBU
SU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKKyMgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdI
RVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyMgKElOQ0xVRElO
RyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUg
VVNFIE9GCisjIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJ
VFkgT0YgU1VDSCBEQU1BR0UuCisKK2ltcG9ydCBidWNrZXQKK2ltcG9ydCBidWlsZGVyCisKKwor
Y2xhc3MgUmViYXNlbGluZXIob2JqZWN0KToKKyAgICAiIiJSZWJhc2VsaW5lcyBhbmQgZGVkdXBl
cyByZXN1bHRzLiIiIgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCB0ZXN0X2dsb2JzLCBsb2NhbF9y
ZXN1bHRzLCByZW1vdGVfcmVzdWx0cywKKyAgICAgICAgICAgICAgICAgbGF5b3V0X3Rlc3RzX2Rp
ciwgKiprd2FyZ3MpOgorICAgICAgICBzZWxmLl90ZXN0X2dsb2JzID0gdGVzdF9nbG9icworICAg
ICAgICBzZWxmLl9leGlzdGluZ19yZXN1bHRzID0gbG9jYWxfcmVzdWx0cworICAgICAgICBzZWxm
Ll9uZXdfcmVzdWx0cyA9IHJlbW90ZV9yZXN1bHRzCisgICAgICAgIHNlbGYuX2xheW91dF90ZXN0
c19kaXIgPSBsYXlvdXRfdGVzdHNfZGlyCisgICAgICAgIHNlbGYuX3ZlcmJvc2UgPSBrd2FyZ3Mu
Z2V0KCd2ZXJib3NlJywgRmFsc2UpCisKKyAgICBkZWYgX21ha2VfYnVja2V0X3RyZWUoc2VsZik6
CisgICAgICAgIGIgPSBidWNrZXQuQnVja2V0VHJlZSgpCisgICAgICAgIGIuYihOb25lLAorICAg
ICAgICAgICAgYi5iKCdtYWMnLAorICAgICAgICAgICAgICAgIGIuYignbWFjLXNub3dsZW9wYXJk
JywKKyAgICAgICAgICAgICAgICAgICAgYi5iKCdtYWMtbGVvcGFyZCcsCisgICAgICAgICAgICAg
ICAgICAgICAgICBiLmIoJ21hYy10aWdlcicpKSksCisgICAgICAgICAgICAgICAgYi5iKCd3aW4n
LAorICAgICAgICAgICAgICAgICAgICBiLmIoJ2Nocm9taXVtJywKKyAgICAgICAgICAgICAgICAg
ICAgICAgIGIuYignY2hyb21pdW0tbWFjJyksCisgICAgICAgICAgICAgICAgICAgICAgICBiLmIo
J2Nocm9taXVtLXdpbicsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYi5iKCdjaHJvbWl1
bS13aW4tdmlzdGEnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiLmIoJ2Nocm9t
aXVtLXdpbi14cCcpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBiLmIoJ2Nocm9taXVt
LWxpbnV4JywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYi5iKCdjaHJvbWl1bS1n
cHUnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYi5iKCdjaHJvbWl1bS1n
cHUtbGludXgnKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGIuYignY2hy
b21pdW0tZ3B1LXdpbicpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYi5i
KCdjaHJvbWl1bS1ncHUtbWFjJykpKSkpKSksCisgICAgICAgICAgICBiLmIoJ3F0JywKKyAgICAg
ICAgICAgICAgICBiLmIoJ3F0LWxpbnV4JyksCisgICAgICAgICAgICAgICAgYi5iKCdxdC1tYWMn
KSwKKyAgICAgICAgICAgICAgICBiLmIoJ3F0LXdpbicpKSwKKyAgICAgICAgICAgIGIuYignZ3Rr
JykpCisgICAgICAgICMgVE9ETyBQdXQgdGhpcyBpbiB0aGUgY29uc3RydWN0b3Igb2YgQnVja2V0
VHJlZSgpPworICAgICAgICBBR0dSRUdBVEVfQlVDS0VUUyA9IFsnY2hyb21pdW0nLCAnY2hyb21p
dW0td2luJywgJ3dpbicsICdtYWMnLCAncXQnLCAnY2hyb21pdW0tZ3B1J10KKyAgICAgICAgZm9y
IGJ1Y2tldF9uYW1lIGluIEFHR1JFR0FURV9CVUNLRVRTOgorICAgICAgICAgICAgYi5nZXRfYnVj
a2V0KGJ1Y2tldF9uYW1lKS5tYXJrX2FzX2FnZ3JlZ2F0ZSgpCisgICAgICAgIHJldHVybiBiCisK
KyAgICBkZWYgX3Nob3dfcmVzdWx0cyhzZWxmLCBkZXNjcmlwdGlvbiwgcmVzdWx0cyk6CisgICAg
ICAgIGlmIG5vdCBzZWxmLl92ZXJib3NlOgorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIHBy
aW50IGRlc2NyaXB0aW9uCisgICAgICAgIGZvciByIGluIHJlc3VsdHM6CisgICAgICAgICAgICBw
cmludCByCisKKyAgICBkZWYgX3Rlc3RfbmFtZXMoc2VsZik6CisgICAgICAgIHRlc3RfbmFtZXMg
PSBzZXQoW10pCisgICAgICAgIGlmIGxlbihzZWxmLl90ZXN0X2dsb2JzKSA9PSAwOgorICAgICAg
ICAgICAgcmV0dXJuIG1hcChsYW1iZGEgcjogci5uYW1lKCksIHNlbGYuX25ld19yZXN1bHRzLnJl
c3VsdHNfZm9yKCcnKSkKKyAgICAgICAgZm9yIHRlc3RfZ2xvYiBpbiBzZWxmLl90ZXN0X2dsb2Jz
OgorICAgICAgICAgICAgbmV3X3Jlc3VsdHMgPSBzZWxmLl9uZXdfcmVzdWx0cy5yZXN1bHRzX2Zv
cih0ZXN0X2dsb2IpCisgICAgICAgICAgICAjIFRPRE8gVGhpcyBpcyByZWFsbHkgc2xvdyBhbmQg
aXNuJ3QgbmVjZXNzYXJ5IHVubGVzcyB3ZSBhcmUgbWVyZWx5CisgICAgICAgICAgICAjIGRlZHVw
aW5nIGV4aXN0aW5nIHJlc3VsdHMuIEl0IHNob3VsZCBiZSBjb250cm9sbGVkIGJ5IGEgZmxhZy4K
KyAgICAgICAgICAgICMgb2xkX3Jlc3VsdHMgPSBzZWxmLl9leGlzdGluZ19yZXN1bHRzLnJlc3Vs
dHNfZm9yKHRlc3RfZ2xvYikKKyAgICAgICAgICAgIG5hbWVzID0gc2V0KG1hcChsYW1iZGEgcjog
ci5uYW1lKCksIG5ld19yZXN1bHRzKSkKKyAgICAgICAgICAgIHRlc3RfbmFtZXMgPSB0ZXN0X25h
bWVzLnVuaW9uKG5hbWVzKQorICAgICAgICByZXR1cm4gdGVzdF9uYW1lcworCisgICAgZGVmIF9k
ZWR1cGUoc2VsZiwgcmVzdWx0cyk6CisgICAgICAgIGJ0ID0gc2VsZi5fbWFrZV9idWNrZXRfdHJl
ZSgpCisgICAgICAgIGZvciByIGluIHJlc3VsdHM6CisgICAgICAgICAgICBidC5pbnNlcnRfcmVz
dWx0KHIpCisgICAgICAgIGJ0LmNvbGxhcHNlKCkKKyAgICAgICAgcmV0dXJuIGJ0LnJlc3VsdHMo
KQorCisgICAgZGVmIHNldF92ZXJib3NlKHNlbGYsIHZlcmJvc2UpOgorICAgICAgICBzZWxmLl92
ZXJib3NlID0gdmVyYm9zZQorCisgICAgZGVmIGV4aXN0aW5nX3Jlc3VsdHMoc2VsZiwgdGVzdF9u
YW1lKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX2V4aXN0aW5nX3Jlc3VsdHMucmVzdWx0c19mb3Io
dGVzdF9uYW1lKQorCisgICAgZGVmIG5ld19yZXN1bHRzKHNlbGYsIHRlc3RfbmFtZSk6CisgICAg
ICAgIHJldHVybiBzZWxmLl9uZXdfcmVzdWx0cy5yZXN1bHRzX2Zvcih0ZXN0X25hbWUpCisKKyAg
ICBkZWYgcmViYXNlbGluZShzZWxmLCBkcnlfcnVuPUZhbHNlKToKKyAgICAgICAgZm9yIHRlc3Rf
bmFtZSBpbiBzZWxmLl90ZXN0X25hbWVzKCk6CisgICAgICAgICAgICBmb3IgdHlwZSBpbiBbJ3Rl
eHQnLCAnaW1hZ2UnXToKKyAgICAgICAgICAgICAgICBuZXdfcmVzdWx0cyA9IHNlbGYuX25ld19y
ZXN1bHRzLnJlc3VsdHNfZm9yKHRlc3RfbmFtZSwgdHlwZSkKKyAgICAgICAgICAgICAgICBleGlz
dGluZ19yZXN1bHRzID0gc2VsZi5fZXhpc3RpbmdfcmVzdWx0cy5yZXN1bHRzX2Zvcih0ZXN0X25h
bWUsIHR5cGUpCisgICAgICAgICAgICAgICAgaWYgbGVuKG5ld19yZXN1bHRzKSArIGxlbihleGlz
dGluZ19yZXN1bHRzKSA9PSAwOgorICAgICAgICAgICAgICAgICAgICBjb250aW51ZQorCisgICAg
ICAgICAgICAgICAgcHJpbnQgIlJlYmFzZWxpbmluZyAlc1slc10iICUgKHRlc3RfbmFtZSwgdHlw
ZSkKKworICAgICAgICAgICAgICAgIHNlbGYuX3Nob3dfcmVzdWx0cygibmV3X3Jlc3VsdHMiLCBu
ZXdfcmVzdWx0cykKKyAgICAgICAgICAgICAgICBzZWxmLl9zaG93X3Jlc3VsdHMoImV4aXN0aW5n
X3Jlc3VsdHMiLCBleGlzdGluZ19yZXN1bHRzKQorCisgICAgICAgICAgICAgICAgZGVkdXBlZF9y
ZXN1bHRzID0gc2VsZi5fZGVkdXBlKG5ld19yZXN1bHRzICsgZXhpc3RpbmdfcmVzdWx0cykKKwor
ICAgICAgICAgICAgICAgIHNlbGYuX3Nob3dfcmVzdWx0cygiZGVkdXBlZF9yZXN1bHRzIiwgZGVk
dXBlZF9yZXN1bHRzKQorCisgICAgICAgICAgICAgICAgZm9yIHIgaW4gc2V0KGV4aXN0aW5nX3Jl
c3VsdHMpIC0gc2V0KGRlZHVwZWRfcmVzdWx0cyk6CisgICAgICAgICAgICAgICAgICAgIGlmIGRy
eV9ydW46CisgICAgICAgICAgICAgICAgICAgICAgICBwcmludCAiZGVsZXRlICVzIiAlIHIKKyAg
ICAgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgICAgIHIuZGVsZXRl
KCkKKworICAgICAgICAgICAgICAgIGZvciByIGluIHNldChkZWR1cGVkX3Jlc3VsdHMpIC0gc2V0
KGV4aXN0aW5nX3Jlc3VsdHMpOgorICAgICAgICAgICAgICAgICAgICBpZiBkcnlfcnVuOgorICAg
ICAgICAgICAgICAgICAgICAgICAgcHJpbnQgImluc3RhbGwgJXMiICUgcgorICAgICAgICAgICAg
ICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICAgICAgci5pbnN0YWxsKHNlbGYuX2xh
eW91dF90ZXN0c19kaXIpCmRpZmYgLS1naXQgYS9XZWJLaXRUb29scy9TY3JpcHRzL3dlYmtpdHB5
L2xheW91dF90ZXN0cy9yZWJhc2VsaW5lL3Jlc3VsdC5weSBiL1dlYktpdFRvb2xzL1NjcmlwdHMv
d2Via2l0cHkvbGF5b3V0X3Rlc3RzL3JlYmFzZWxpbmUvcmVzdWx0LnB5Cm5ldyBmaWxlIG1vZGUg
MTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAuLjQ0
YzM5ZGMxNTM2MTM4YTFlYjg5NTdlZTRmZTBkNjZjZDkzZDM4YTEKLS0tIC9kZXYvbnVsbAorKysg
Yi9XZWJLaXRUb29scy9TY3JpcHRzL3dlYmtpdHB5L2xheW91dF90ZXN0cy9yZWJhc2VsaW5lL3Jl
c3VsdC5weQpAQCAtMCwwICsxLDE2NyBAQAorIyEvdXNyL2Jpbi9lbnYgcHl0aG9uCisjIENvcHly
aWdodCAoQykgMjAxMCBHb29nbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorIworIyBSZWRp
c3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdp
dGhvdXQKKyMgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZv
bGxvd2luZyBjb25kaXRpb25zCisjIGFyZSBtZXQ6CisjCisjIDEuICBSZWRpc3RyaWJ1dGlvbnMg
b2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorIyAgICAgbm90
aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVy
LgorIyAyLiAgUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRo
ZSBhYm92ZSBjb3B5cmlnaHQKKyMgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMg
YW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyMgICAgIGRvY3VtZW50YXRpb24g
YW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisj
CisjIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgQU5EIElUUyBDT05UUklCVVRP
UlMgIkFTIElTIiBBTkQgQU5ZCisjIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNM
VURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQKKyMgV0FSUkFOVElFUyBPRiBN
RVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQor
IyBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBPUiBJVFMgQ09OVFJJQlVUT1JT
IEJFIExJQUJMRSBGT1IgQU5ZCisjIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJ
QUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCisjIChJTkNMVURJTkcsIEJV
VCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJW
SUNFUzsKKyMgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVS
UlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECisjIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZ
LCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisjIChJTkNM
VURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0Yg
VEhFIFVTRSBPRgorIyBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJ
QklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCitpbXBvcnQgb3MKK2ltcG9ydCByZQorCisKK2NsYXNz
IE5haXZlSW1hZ2VEaWZmZXIob2JqZWN0KToKKyAgICBkZWYgc2FtZV9pbWFnZShzZWxmLCBpbWcx
LCBpbWcyKToKKyAgICAgICAgcmV0dXJuIGltZzEgPT0gaW1nMgorCisKK2NsYXNzIFJlc3VsdChv
YmplY3QpOgorICAgICIiIlJlcHJlc2VudHMgdGhlIHJlc3VsdCBvZiBhIHNpbmdsZSB0ZXN0IG9u
IGEgc2luZ2xlIHBsYXRmb3JtIiIiCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHBsYXRmb3JtLCBy
ZXN1bHRfdHlwZSwgZmlsZXMpOgorICAgICAgICBzZWxmLl9wbGF0Zm9ybSA9IHBsYXRmb3JtCisg
ICAgICAgIHNlbGYuX3Jlc3VsdF90eXBlID0gcmVzdWx0X3R5cGUKKyAgICAgICAgc2VsZi5fZmls
ZXMgPSBmaWxlcworICAgICAgICBzZWxmLl9tYWluX2ZpbGUgPSBmaWxlc1swXQorICAgICAgICBm
aWxlbmFtZSA9IHNlbGYuX21haW5fZmlsZS5uYW1lKCkKKyAgICAgICAgc2VsZi5fbmFtZSA9IHNl
bGYuX2V4dHJhY3RfdGVzdF9uYW1lKGZpbGVuYW1lKQorICAgICAgICBzZWxmLl9pc19hY3R1YWwg
PSAnLWFjdHVhbC4nIGluIGZpbGVuYW1lCisKKyAgICAgICAgaWYgc2VsZi5fcGxhdGZvcm0gaXMg
Tm9uZToKKyAgICAgICAgICAgIHNlbGYuX3BsYXRmb3JtID0gc2VsZi5fZXh0cmFjdF9wbGF0Zm9y
bShmaWxlbmFtZSkKKworICAgIGRlZiBfZXh0cmFjdF9wbGF0Zm9ybShzZWxmLCBmaWxlbmFtZSk6
CisgICAgICAgICIiIkNhbGN1bGF0ZXMgdGhlIHBsYXRmb3JtIGZyb20gdGhlIG5hbWUgb2YgdGhl
IGZpbGUgaWYgaXQgaXNuJ3Qga25vd24gYWxyZWFkeSIiIgorICAgICAgICBwYXRoID0gcmUuc3Bs
aXQob3MucGF0aC5zZXAsIGZpbGVuYW1lKQorICAgICAgICBpZiAncGxhdGZvcm0nIGluIHBhdGg6
CisgICAgICAgICAgICByZXR1cm4gcGF0aFtwYXRoLmluZGV4KCdwbGF0Zm9ybScpICsgMV0KKyAg
ICAgICAgcmV0dXJuIE5vbmUKKworICAgIGRlZiBfZXh0cmFjdF90ZXN0X25hbWUoc2VsZiwgZmls
ZW5hbWUpOgorICAgICAgICB0ZXN0X25hbWUgPSBmaWxlbmFtZQorICAgICAgICBwYXRoID0gcmUu
c3BsaXQob3MucGF0aC5zZXAsIHRlc3RfbmFtZSkKKyAgICAgICAgaWYgJ0xheW91dFRlc3RzJyBp
biBwYXRoOgorICAgICAgICAgICAgcGF0aCA9IHBhdGhbMSArIHBhdGguaW5kZXgoJ0xheW91dFRl
c3RzJyk6XQorICAgICAgICBpZiAnbGF5b3V0LXRlc3QtcmVzdWx0cycgaW4gcGF0aDoKKyAgICAg
ICAgICAgIHBhdGggPSBwYXRoWzEgKyBwYXRoLmluZGV4KCdsYXlvdXQtdGVzdC1yZXN1bHRzJyk6
XQorICAgICAgICBpZiAncGxhdGZvcm0nIGluIHBhdGg6CisgICAgICAgICAgICBwYXRoID0gcGF0
aFsyICsgcGF0aC5pbmRleCgncGxhdGZvcm0nKTpdCisKKyAgICAgICAgdGVzdF9uYW1lID0gcGF0
aFstMV0KKyAgICAgICAgdGVzdF9uYW1lID0gcmUuc3ViKCctZXhwZWN0ZWRcLi4qJCcsICcnLCB0
ZXN0X25hbWUpCisgICAgICAgIHRlc3RfbmFtZSA9IHJlLnN1YignLWFjdHVhbFwuLiokJywgJycs
IHRlc3RfbmFtZSkKKyAgICAgICAgcGF0aFstMV0gPSB0ZXN0X25hbWUKKyAgICAgICAgcmV0dXJu
IG9zLnBhdGguc2VwLmpvaW4ocGF0aCkKKworICAgIGRlZiBfc2V0X3Rlc3RfbmFtZShzZWxmLCBm
aWxlbmFtZSk6CisgICAgICAgIHNlbGYuX3Rlc3RfbmFtZSA9IGZpbGVuYW1lCisgICAgICAgIGlm
IG9zLnBhdGguc2VwIGluIGZpbGVuYW1lOgorICAgICAgICAgICAgc2VsZi5fdGVzdF9uYW1lID0g
ZmlsZW5hbWVbOmZpbGVuYW1lLnJpbmRleChvcy5wYXRoLnNlcCldCisKKyAgICBkZWYgY29udGVu
dHMoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLl9tYWluX2ZpbGUuY29udGVudHMoKQorCisg
ICAgZGVmIHNhdmVfdG8oc2VsZiwgcGF0aCk6CisgICAgICAgIGZvciBmaWxlIGluIHNlbGYuX2Zp
bGVzOgorICAgICAgICAgICAgZmlsZS5zYXZlX3RvKHBhdGgpCisKKyAgICBkZWYgaXNfYWN0dWFs
KHNlbGYpOgorICAgICAgICAiIiJBcmUgdGhlc2UgcmVzdWx0cyB0aGUgYWN0dWFsIG91dHB1dCBv
ZiBhIHRlc3Q/IiIiCisgICAgICAgIHJldHVybiBzZWxmLl9pc19hY3R1YWwKKworICAgIGRlZiBu
YW1lKHNlbGYpOgorICAgICAgICAiIiJUaGUgbmFtZSBvZiB0aGlzIHRlc3QgKGRvZXNuJ3QgaW5j
bHVkZSBleHRlbnNpb24pIiIiCisgICAgICAgIHJldHVybiBzZWxmLl9uYW1lCisKKyAgICBkZWYg
c2FtZV9jb250ZW50KHNlbGYsIG90aGVyKToKKyAgICAgICAgcmV0dXJuIHNlbGYuY29udGVudHMo
KSA9PSBvdGhlci5jb250ZW50cygpCisKKyAgICBkZWYgX19lcV9fKHNlbGYsIG90aGVyKToKKyAg
ICAgICAgcmV0dXJuIHNlbGYubmFtZSgpID09IG90aGVyLm5hbWUoKSBhbmQgc2VsZi50eXBlKCkg
PT0gb3RoZXIudHlwZSgpIGFuZCBzZWxmLnBsYXRmb3JtKCkgPT0gb3RoZXIucGxhdGZvcm0oKSBh
bmQgc2VsZi5pc19hY3R1YWwoKSA9PSBvdGhlci5pc19hY3R1YWwoKSBhbmQgc2VsZi5zYW1lX2Nv
bnRlbnQob3RoZXIpCisKKyAgICBkZWYgX19oYXNoX18oc2VsZik6CisgICAgICAgIHJldHVybiBo
YXNoKHN0cihzZWxmLm5hbWUoKSkgKyBzdHIoc2VsZi50eXBlKCkpICsgc3RyKHNlbGYucGxhdGZv
cm0oKSkpCisKKyAgICBkZWYgaXNfbmV3ZXJfdGhhbihzZWxmLCBvdGhlcik6CisgICAgICAgICIi
IidOZXcnIHJlc3VsdHMgYXJlIHRob3NlIGFjdHVhbGx5IGNvbWluZyBmcm9tIGEgdGVzdC4iIiIK
KyAgICAgICAgcmV0dXJuIHNlbGYuaXNfYWN0dWFsKCkgYW5kIG5vdCBvdGhlci5pc19hY3R1YWwo
KQorCisgICAgZGVmIGlzX3JlYmFzZWxpbmVfb2Yoc2VsZiwgb3RoZXIpOgorICAgICAgICByZXR1
cm4gc2VsZi5uYW1lKCkgPT0gb3RoZXIubmFtZSgpIGFuZCBzZWxmLnR5cGUoKSA9PSBvdGhlci50
eXBlKCkgYW5kIHNlbGYucGxhdGZvcm0oKSA9PSBvdGhlci5wbGF0Zm9ybSgpIGFuZCBzZWxmLmlz
X2FjdHVhbCgpIGFuZCAobm90IG90aGVyLmlzX2FjdHVhbCgpKQorCisgICAgZGVmIF9fc3RyX18o
c2VsZik6CisgICAgICAgIGFjdHVhbF9zdHIgPSAnW0FdICcgaWYgc2VsZi5pc19hY3R1YWwoKSBl
bHNlICcnCisgICAgICAgIHJldHVybiAiUmVzdWx0WyVzLyVzXSAlcyVzIiAlIChzZWxmLl9wbGF0
Zm9ybSwgc2VsZi5fcmVzdWx0X3R5cGUsIGFjdHVhbF9zdHIsIHNlbGYubmFtZSgpKQorCisgICAg
ZGVmIHR5cGUoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLl9yZXN1bHRfdHlwZQorCisgICAg
ZGVmIHBsYXRmb3JtKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5fcGxhdGZvcm0KKworICAg
IGRlZiBfaW5zdGFsbF9maWxlKHNlbGYsIGZpbGUsIHBhdGgpOgorICAgICAgICBpZiBzZWxmLl9w
bGF0Zm9ybSBpcyBOb25lOgorICAgICAgICAgICAgcGxhdGZvcm1fY29tcG9uZW50ID0gIiIKKyAg
ICAgICAgZWxzZToKKyAgICAgICAgICAgIHBsYXRmb3JtX2NvbXBvbmVudCA9ICJwbGF0Zm9ybS8l
cy8iICUgc2VsZi5fcGxhdGZvcm0KKyAgICAgICAgZXh0ZW5zaW9uID0gb3MucGF0aC5zcGxpdGV4
dChmaWxlLm5hbWUoKSlbMV0KKyAgICAgICAgcGF0aCA9ICclcy8lcycgJSAocGF0aCwgcGxhdGZv
cm1fY29tcG9uZW50KQorICAgICAgICBmaWxlbmFtZSA9IHNlbGYubmFtZSgpICsgJy1leHBlY3Rl
ZCcgKyBleHRlbnNpb24KKyAgICAgICAgZmlsZS5zYXZlX3RvKHBhdGgsIGZpbGVuYW1lKQorCisg
ICAgZGVmIGluc3RhbGwoc2VsZiwgcGF0aCk6CisgICAgICAgIGZvciBmaWxlIGluIHNlbGYuX2Zp
bGVzOgorICAgICAgICAgICAgc2VsZi5faW5zdGFsbF9maWxlKGZpbGUsIHBhdGgpCisKKyAgICBk
ZWYgZGVsZXRlKHNlbGYpOgorICAgICAgICBmb3IgZmlsZSBpbiBzZWxmLl9maWxlczoKKyAgICAg
ICAgICAgIGZpbGUuZGVsZXRlKCkKKworCitjbGFzcyBUZXh0UmVzdWx0KFJlc3VsdCk6CisgICAg
IiIiUmVwcmVzZW50cyBhIHRleHQgcmVzdWx0IG9mIGEgc2luZ2xlIHRlc3Qgb24gYSBzaW5nbGUg
cGxhdGZvcm0iIiIKKyAgICBkZWYgX19pbml0X18oc2VsZiwgcGxhdGZvcm0sIHRleHRfZmlsZSk6
CisgICAgICAgIHNlbGYuX3RleHRfZmlsZSA9IHRleHRfZmlsZQorICAgICAgICBSZXN1bHQuX19p
bml0X18oc2VsZiwgcGxhdGZvcm0sICd0ZXh0JywgW3RleHRfZmlsZV0pCisKKyAgICBkZWYgcmV0
YXJnZXQoc2VsZiwgcGxhdGZvcm0pOgorICAgICAgICByZXR1cm4gVGV4dFJlc3VsdChwbGF0Zm9y
bSwgc2VsZi5fdGV4dF9maWxlKQorCisKK2NsYXNzIEltYWdlUmVzdWx0KFJlc3VsdCk6CisgICAg
aW1hZ2VfZGlmZmVyID0gTmFpdmVJbWFnZURpZmZlcigpCisgICAgIiIiUmVwcmVzZW50cyBhbiBp
bWFnZSByZXN1bHQgb2YgYSBzaW5nbGUgdGVzdCBvbiBhIHNpbmdsZSBwbGF0Zm9ybSIiIgorICAg
IGRlZiBfX2luaXRfXyhzZWxmLCBwbGF0Zm9ybSwgaW1hZ2VfZmlsZSwgY2hlY2tzdW1fZmlsZSk6
CisgICAgICAgIHNlbGYuX2NoZWNrc3VtX2ZpbGUgPSBjaGVja3N1bV9maWxlCisgICAgICAgIHNl
bGYuX2ltYWdlX2ZpbGUgPSBpbWFnZV9maWxlCisgICAgICAgIGZpbGVzID0gZmlsdGVyKGJvb2ws
IFtzZWxmLl9jaGVja3N1bV9maWxlLCBzZWxmLl9pbWFnZV9maWxlXSkKKyAgICAgICAgUmVzdWx0
Ll9faW5pdF9fKHNlbGYsIHBsYXRmb3JtLCAnaW1hZ2UnLCBmaWxlcykKKworICAgIGRlZiBoYXNf
Y2hlY2tzdW0oc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLl9jaGVja3N1bV9maWxlIGlzIG5v
dCBOb25lCisKKyAgICBkZWYgc2FtZV9jb250ZW50KHNlbGYsIG90aGVyKToKKyAgICAgICAgaWYg
c2VsZi5oYXNfY2hlY2tzdW0oKSBhbmQgb3RoZXIuaGFzX2NoZWNrc3VtKCk6CisgICAgICAgICAg
ICByZXR1cm4gc2VsZi5fY2hlY2tzdW1fZmlsZS5jb250ZW50cygpID09IG90aGVyLl9jaGVja3N1
bV9maWxlLmNvbnRlbnRzKCkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGZfY29udGVu
dHMgPSBzZWxmLl9pbWFnZV9maWxlLmNvbnRlbnRzKCkKKyAgICAgICAgICAgIG90aGVyX2NvbnRl
bnRzID0gb3RoZXIuX2ltYWdlX2ZpbGUuY29udGVudHMoKQorICAgICAgICAgICAgcmV0dXJuIElt
YWdlUmVzdWx0LmltYWdlX2RpZmZlci5zYW1lX2ltYWdlKHNlbGZfY29udGVudHMsIG90aGVyX2Nv
bnRlbnRzKQorCisgICAgZGVmIHJldGFyZ2V0KHNlbGYsIHBsYXRmb3JtKToKKyAgICAgICAgcmV0
dXJuIEltYWdlUmVzdWx0KHBsYXRmb3JtLCBzZWxmLl9pbWFnZV9maWxlLCBzZWxmLl9jaGVja3N1
bV9maWxlKQpkaWZmIC0tZ2l0IGEvV2ViS2l0VG9vbHMvU2NyaXB0cy93ZWJraXRweS9sYXlvdXRf
dGVzdHMvcmViYXNlbGluZS9yZXN1bHRfdW5pdHRlc3QucHkgYi9XZWJLaXRUb29scy9TY3JpcHRz
L3dlYmtpdHB5L2xheW91dF90ZXN0cy9yZWJhc2VsaW5lL3Jlc3VsdF91bml0dGVzdC5weQpuZXcg
ZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwLi5lZGRkZDgyZDQxYjQzZWY1ZTMxNjFlOTE1OTVmZGQ5YTg5MDdlZTYwCi0tLSAvZGV2
L251bGwKKysrIGIvV2ViS2l0VG9vbHMvU2NyaXB0cy93ZWJraXRweS9sYXlvdXRfdGVzdHMvcmVi
YXNlbGluZS9yZXN1bHRfdW5pdHRlc3QucHkKQEAgLTAsMCArMSwxMzMgQEAKKyMhL3Vzci9iaW4v
ZW52IHB5dGhvbgorIyBDb3B5cmlnaHQgKEMpIDIwMTAgR29vZ2xlIEluYy4gQWxsIHJpZ2h0cyBy
ZXNlcnZlZC4KKyMKKyMgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFy
eSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisjIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBw
cm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworIyBhcmUgbWV0OgorIworIyAx
LiAgUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBj
b3B5cmlnaHQKKyMgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBm
b2xsb3dpbmcgZGlzY2xhaW1lci4KKyMgMi4gIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9y
bSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisjICAgICBub3RpY2UsIHRoaXMg
bGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisj
ICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0
aGUgZGlzdHJpYnV0aW9uLgorIworIyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExF
IEFORCBJVFMgQ09OVFJJQlVUT1JTICJBUyBJUyIgQU5EIEFOWQorIyBFWFBSRVNTIE9SIElNUExJ
RUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVE
CisjIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJ
Q1VMQVIgUFVSUE9TRSBBUkUKKyMgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUg
T1IgSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWQorIyBESVJFQ1QsIElORElSRUNU
LCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdF
UworIyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNU
SVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisjIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRT
OyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAorIyBPTiBBTlkg
VEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElU
WSwgT1IgVE9SVAorIyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5H
IElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKyMgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBB
RFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworaW1wb3J0IHJlCitp
bXBvcnQgcmVzdWx0CitpbXBvcnQgdW5pdHRlc3QKKworCitjbGFzcyBGYWtlRmlsZShvYmplY3Qp
OgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBmaWxlbmFtZSwgY29udGVudHM9ImZha2UgY29udGVu
dHMiKToKKyAgICAgICAgc2VsZi5fZmlsZW5hbWUgPSBmaWxlbmFtZQorICAgICAgICBzZWxmLl9j
b250ZW50cyA9IGNvbnRlbnRzCisKKyAgICBkZWYgbmFtZShzZWxmKToKKyAgICAgICAgcmV0dXJu
IHNlbGYuX2ZpbGVuYW1lCisKKyAgICBkZWYgY29udGVudHMoc2VsZik6CisgICAgICAgIHJldHVy
biBzZWxmLl9jb250ZW50cworCisKK2NsYXNzIEZha2VSZXN1bHQocmVzdWx0LlJlc3VsdCk6Cisg
ICAgZGVmIF9faW5pdF9fKHNlbGYsIHBsYXRmb3JtLCByZXN1bHRfdHlwZSwgY29udGVudHMsIGlz
X2V4cGVjdGVkPUZhbHNlKToKKyAgICAgICAgc2VsZi5fcmVzdWx0X3R5cGUgPSByZXN1bHRfdHlw
ZQorICAgICAgICBzZWxmLl9jb250ZW50cyA9IGNvbnRlbnRzCisgICAgICAgIHNlbGYuX2lzX2V4
cGVjdGVkID0gaXNfZXhwZWN0ZWQKKyAgICAgICAgYWN0dWFsID0gJ2FjdHVhbCcKKyAgICAgICAg
aWYgaXNfZXhwZWN0ZWQ6CisgICAgICAgICAgICBhY3R1YWwgPSAnZXhwZWN0ZWQnCisgICAgICAg
IHRlc3RfbmFtZSA9ICdhbm9ueW1vdXMtdGVzdC0lcy50eHQnICUgYWN0dWFsCisgICAgICAgIGZp
bGUgPSBGYWtlRmlsZSh0ZXN0X25hbWUsIGNvbnRlbnRzKQorICAgICAgICBzdXBlcihGYWtlUmVz
dWx0LCBzZWxmKS5fX2luaXRfXyhwbGF0Zm9ybSwgcmVzdWx0X3R5cGUsIFtmaWxlXSkKKworICAg
IGRlZiBjb250ZW50cyhzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX2NvbnRlbnRzCisKKyAg
ICBkZWYgcmV0YXJnZXQoc2VsZiwgcGxhdGZvcm0pOgorICAgICAgICByZXR1cm4gRmFrZVJlc3Vs
dChwbGF0Zm9ybSwgc2VsZi5fcmVzdWx0X3R5cGUsIHNlbGYuX2NvbnRlbnRzLCBzZWxmLl9pc19l
eHBlY3RlZCkKKworCitjbGFzcyBSZXN1bHRUZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICBk
ZWYgX2NoZWNrX25hbWUoc2VsZiwgZmlsZW5hbWUsIGV4cGVjdGVkX3Rlc3RfbmFtZSk6CisgICAg
ICAgIHIgPSByZXN1bHQuVGV4dFJlc3VsdChOb25lLCBGYWtlRmlsZShmaWxlbmFtZSkpCisgICAg
ICAgIHNlbGYuYXNzZXJ0RXF1YWxzKGV4cGVjdGVkX3Rlc3RfbmFtZSwgci5uYW1lKCkpCisKKyAg
ICBkZWYgX2NoZWNrX3BsYXRmb3JtKHNlbGYsIGZpbGVuYW1lLCBleHBlY3RlZF9wbGF0Zm9ybSk6
CisgICAgICAgIHIgPSByZXN1bHQuVGV4dFJlc3VsdChOb25lLCBGYWtlRmlsZShmaWxlbmFtZSkp
CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKGV4cGVjdGVkX3BsYXRmb3JtLCByLnBsYXRmb3Jt
KCkpCisKKyAgICBkZWYgdGVzdEV4dHJhY3RzTmFtZUNvcnJlY3RseShzZWxmKToKKyAgICAgICAg
c2VsZi5fY2hlY2tfbmFtZSgnTGF5b3V0VGVzdHMvZmFzdC9kb20vYS1leHBlY3RlZC50eHQnLCAn
ZmFzdC9kb20vYScpCisgICAgICAgIHNlbGYuX2NoZWNrX25hbWUoJ0xheW91dFRlc3RzL2Zhc3Qv
ZG9tL2EtYWN0dWFsLnR4dCcsICdmYXN0L2RvbS9hJykKKyAgICAgICAgc2VsZi5fY2hlY2tfbmFt
ZSgnTGF5b3V0VGVzdHMvcGxhdGZvcm0vd2luL2Zhc3QvYS1leHBlY3RlZC50eHQnLCAnZmFzdC9h
JykKKyAgICAgICAgc2VsZi5fY2hlY2tfbmFtZSgnTGF5b3V0VGVzdHMvcGxhdGZvcm0vd2luL2Zh
c3QvYS1leHBlY3RlZC5jaGVja3N1bScsICdmYXN0L2EnKQorICAgICAgICBzZWxmLl9jaGVja19u
YW1lKCdmYXN0L2RvbS90ZXN0LWV4cGVjdGVkLnR4dCcsICdmYXN0L2RvbS90ZXN0JykKKyAgICAg
ICAgc2VsZi5fY2hlY2tfbmFtZSgnbGF5b3V0LXRlc3QtcmVzdWx0cy9mYXN0L2EtYWN0dWFsLmNo
ZWNrc3VtJywgJ2Zhc3QvYScpCisKKyAgICBkZWYgdGVzdEV4dHJhY3RzUGxhdGZvcm1Db3JyZWN0
bHkoc2VsZik6CisgICAgICAgIHNlbGYuX2NoZWNrX3BsYXRmb3JtKCdMYXlvdXRUZXN0cy9wbGF0
Zm9ybS93aW4vZmFzdC9hLWV4cGVjdGVkLnR4dCcsICd3aW4nKQorICAgICAgICBzZWxmLl9jaGVj
a19wbGF0Zm9ybSgncGxhdGZvcm0vd2luL2Zhc3QvYS1leHBlY3RlZC50eHQnLCAnd2luJykKKyAg
ICAgICAgc2VsZi5fY2hlY2tfcGxhdGZvcm0oJ3BsYXRmb3JtL21hYy9mYXN0L2EtZXhwZWN0ZWQu
dHh0JywgJ21hYycpCisgICAgICAgIHNlbGYuX2NoZWNrX3BsYXRmb3JtKCdmYXN0L2EtZXhwZWN0
ZWQudHh0JywgTm9uZSkKKworICAgIGRlZiB0ZXN0UmVzdWx0c0Zyb21BbkFjdHVhbEZpbGVBcmVN
YXJrZWRBc1N1Y2goc2VsZik6CisgICAgICAgIHIgPSByZXN1bHQuVGV4dFJlc3VsdChOb25lLCBG
YWtlRmlsZSgndGVzdC1hY3R1YWwudHh0JykpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShyLmlz
X2FjdHVhbCgpKQorCisgICAgZGVmIHRlc3RSZXN1bHRzRnJvbUFuRXhwZWN0ZWRGaWxlQXJlTm90
QWN0dWFsKHNlbGYpOgorICAgICAgICByID0gcmVzdWx0LlRleHRSZXN1bHQoTm9uZSwgRmFrZUZp
bGUoJ3Rlc3QtZXhwZWN0ZWQudHh0JykpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2Uoci5pc19h
Y3R1YWwoKSkKKworICAgIGRlZiB0ZXN0SXNSZWJhc2VsaW5lT2Yoc2VsZik6CisgICAgICAgIGV4
cGVjdGVkID0gcmVzdWx0LlRleHRSZXN1bHQoJ21hYycsIEZha2VGaWxlKCd0ZXN0LWV4cGVjdGVk
LnR4dCcpKQorICAgICAgICBhY3R1YWwgPSByZXN1bHQuVGV4dFJlc3VsdCgnbWFjJywgRmFrZUZp
bGUoJ3Rlc3QtYWN0dWFsLnR4dCcpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoYWN0dWFsLmlz
X3JlYmFzZWxpbmVfb2YoZXhwZWN0ZWQpKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKGV4cGVj
dGVkLmlzX3JlYmFzZWxpbmVfb2YoYWN0dWFsKSkKKworICAgIGRlZiB0ZXN0X19lcV9fKHNlbGYp
OgorICAgICAgICByMSA9IHJlc3VsdC5UZXh0UmVzdWx0KCdtYWMnLCBGYWtlRmlsZSgndGVzdC1l
eHBlY3RlZC50eHQnLCAnY29udGVudHMnKSkKKyAgICAgICAgcjIgPSByZXN1bHQuVGV4dFJlc3Vs
dCgnbWFjJywgRmFrZUZpbGUoJ3Rlc3QtZXhwZWN0ZWQudHh0JywgJ2NvbnRlbnRzJykpCisgICAg
ICAgIHIzID0gcmVzdWx0LlRleHRSZXN1bHQoJ3dpbicsIEZha2VGaWxlKCd0ZXN0LWV4cGVjdGVk
LnR4dCcsICdjb250ZW50cycpKQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKHIxLCByMikK
KyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMocjEsIHIyLnJldGFyZ2V0KCdtYWMnKSkKKyAgICAg
ICAgc2VsZi5hc3NlcnROb3RFcXVhbHMocjEsIHIyLnJldGFyZ2V0KCd3aW4nKSkKKworICAgIGRl
ZiB0ZXN0X19oYXNoX18oc2VsZik6CisgICAgICAgIHIxID0gcmVzdWx0LlRleHRSZXN1bHQoJ21h
YycsIEZha2VGaWxlKCd0ZXN0LWV4cGVjdGVkLnR4dCcsICdjb250ZW50cycpKQorICAgICAgICBy
MiA9IHJlc3VsdC5UZXh0UmVzdWx0KCdtYWMnLCBGYWtlRmlsZSgndGVzdC1leHBlY3RlZC50eHQn
LCAnY29udGVudHMnKSkKKyAgICAgICAgcjMgPSByZXN1bHQuVGV4dFJlc3VsdChOb25lLCBGYWtl
RmlsZSgndGVzdC1leHBlY3RlZC50eHQnLCBOb25lKSkKKworICAgICAgICB4ID0gc2V0KFtyMSwg
cjJdKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscygxLCBsZW4oc2V0KFtyMSwgcjJdKSkpCisg
ICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKDIsIGxlbihzZXQoW3IxLCByMiwgcjNdKSkpCisKKyAg
ICBkZWYgdGVzdEltYWdlRGlmZklzSW52b2tlZEZvckltYWdlUmVzdWx0c1dpdGhvdXRDaGVja3N1
bShzZWxmKToKKyAgICAgICAgcjEgPSByZXN1bHQuSW1hZ2VSZXN1bHQoJ21hYycsIEZha2VGaWxl
KCd0ZXN0LWV4cGVjdGVkLnBuZycsICdhc2RmJyksIEZha2VGaWxlKCd0ZXN0LWV4cGVjdGVkLmNo
ZWNrc3VtJywgJ2NoZWNrJykpCisgICAgICAgIHIyID0gcmVzdWx0LkltYWdlUmVzdWx0KCdtYWMn
LCBGYWtlRmlsZSgndGVzdC1leHBlY3RlZC5wbmcnLCAnYXNkZicpLCBOb25lKQorCisgICAgICAg
ICMgRGVmYXVsdCBiZWhhdmlvdXIgaXMgdG8ganVzdCBjb21wYXJlIG9uIGltYWdlIGNvbnRlbnRz
LgorICAgICAgICBzZWxmLmFzc2VydFRydWUocjEuc2FtZV9jb250ZW50KHIyKSkKKworICAgICAg
ICBjbGFzcyBBbGxJbWFnZXNBcmVEaWZmZXJlbnQob2JqZWN0KToKKyAgICAgICAgICAgIGRlZiBz
YW1lX2ltYWdlKHNlbGYsIGltYWdlMSwgaW1hZ2UyKToKKyAgICAgICAgICAgICAgICByZXR1cm4g
RmFsc2UKKworICAgICAgICAjIEJ1dCB3ZSBjYW4gaW5zdGFsbCBvdGhlciBpbWFnZSBkaWZmZXJz
LgorICAgICAgICByZXN1bHQuSW1hZ2VSZXN1bHQuaW1hZ2VfZGlmZmVyID0gQWxsSW1hZ2VzQXJl
RGlmZmVyZW50KCkKKworICAgICAgICBzZWxmLmFzc2VydEZhbHNlKHIxLnNhbWVfY29udGVudChy
MikpCisKK2lmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CisgICAgdW5pdHRlc3QubWFpbigpCmRp
ZmYgLS1naXQgYS9XZWJLaXRUb29scy9TY3JpcHRzL3dlYmtpdHB5L3Rvb2wvY29tbWFuZHMvX19p
bml0X18ucHkgYi9XZWJLaXRUb29scy9TY3JpcHRzL3dlYmtpdHB5L3Rvb2wvY29tbWFuZHMvX19p
bml0X18ucHkKaW5kZXggZDJhYTUwM2QxODU2MWRlYWIyY2FlNzAwZGY2ZDQ5M2E5YjA1ZmNmMy4u
MWRiYzcyZTM2ZjkwNTdjZTYyZDE2YWJhODYwYWYzNTkxOWZmYmUwYiAxMDA2NDQKLS0tIGEvV2Vi
S2l0VG9vbHMvU2NyaXB0cy93ZWJraXRweS90b29sL2NvbW1hbmRzL19faW5pdF9fLnB5CisrKyBi
L1dlYktpdFRvb2xzL1NjcmlwdHMvd2Via2l0cHkvdG9vbC9jb21tYW5kcy9fX2luaXRfXy5weQpA
QCAtNyw2ICs3LDcgQEAgZnJvbSB3ZWJraXRweS50b29sLmNvbW1hbmRzLnByZXR0eWRpZmYgaW1w
b3J0IFByZXR0eURpZmYKIGZyb20gd2Via2l0cHkudG9vbC5jb21tYW5kcy5xdWVyaWVzIGltcG9y
dCAqCiBmcm9tIHdlYmtpdHB5LnRvb2wuY29tbWFuZHMucXVldWVzIGltcG9ydCAqCiBmcm9tIHdl
YmtpdHB5LnRvb2wuY29tbWFuZHMucmViYXNlbGluZSBpbXBvcnQgUmViYXNlbGluZQorZnJvbSB3
ZWJraXRweS50b29sLmNvbW1hbmRzLnJlYmFzZWxpbmUyIGltcG9ydCBSZWJhc2VsaW5lMgogZnJv
bSB3ZWJraXRweS50b29sLmNvbW1hbmRzLnJlYmFzZWxpbmVzZXJ2ZXIgaW1wb3J0IFJlYmFzZWxp
bmVTZXJ2ZXIKIGZyb20gd2Via2l0cHkudG9vbC5jb21tYW5kcy5zaGVyaWZmYm90IGltcG9ydCAq
CiBmcm9tIHdlYmtpdHB5LnRvb2wuY29tbWFuZHMudXBsb2FkIGltcG9ydCAqCmRpZmYgLS1naXQg
YS9XZWJLaXRUb29scy9TY3JpcHRzL3dlYmtpdHB5L3Rvb2wvY29tbWFuZHMvcmViYXNlbGluZTIu
cHkgYi9XZWJLaXRUb29scy9TY3JpcHRzL3dlYmtpdHB5L3Rvb2wvY29tbWFuZHMvcmViYXNlbGlu
ZTIucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMC4uYTc3Y2Q4YjE2NjRmZWUyNDlmNWI4MGYwNDA1ODZhOGZlODhjMjFk
YwotLS0gL2Rldi9udWxsCisrKyBiL1dlYktpdFRvb2xzL1NjcmlwdHMvd2Via2l0cHkvdG9vbC9j
b21tYW5kcy9yZWJhc2VsaW5lMi5weQpAQCAtMCwwICsxLDEwNiBAQAorIyBDb3B5cmlnaHQgKGMp
IDIwMTAgR29vZ2xlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyMKKyMgUmVkaXN0cmlidXRp
b24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Cisj
IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcg
Y29uZGl0aW9ucyBhcmUKKyMgbWV0OgorIworIyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291
cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorIyBub3RpY2UsIHRoaXMg
bGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisjICAgICAq
IFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUK
KyMgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xs
b3dpbmcgZGlzY2xhaW1lcgorIyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0
ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisjIGRpc3RyaWJ1dGlvbi4KKyMgICAgICogTmVpdGhl
ciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworIyBjb250cmli
dXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQg
ZnJvbQorIyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJt
aXNzaW9uLgorIworIyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQg
SE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisjICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElN
UExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisjIExJTUlURUQgVE8sIFRIRSBJ
TVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorIyBB
IFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhF
IENPUFlSSUdIVAorIyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElS
RUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyMgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05T
RVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorIyBMSU1JVEVEIFRPLCBQUk9D
VVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyMg
REFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNF
RCBBTkQgT04gQU5ZCisjIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1Qs
IFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyMgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9U
SEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisjIE9GIFRISVMgU09G
VFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0Uu
CisKK2Zyb20gd2Via2l0cHkubGF5b3V0X3Rlc3RzLnBvcnQgaW1wb3J0IGZhY3RvcnkKK2Zyb20g
d2Via2l0cHkudG9vbC5tdWx0aWNvbW1hbmR0b29sIGltcG9ydCBBYnN0cmFjdERlY2xhcmF0aXZl
Q29tbWFuZAorZnJvbSB3ZWJraXRweS5sYXlvdXRfdGVzdHMucmViYXNlbGluZS5yZWJhc2VsaW5l
ciBpbXBvcnQgUmViYXNlbGluZXIKK2Zyb20gd2Via2l0cHkubGF5b3V0X3Rlc3RzLnJlYmFzZWxp
bmUuYnVpbGRlciBpbXBvcnQgQnVpbGRlciwgQ2hyb21pdW1CdWlsZGVyLCBXZWJLaXRCdWlsZGVy
Citmcm9tIHdlYmtpdHB5LmxheW91dF90ZXN0cy5yZWJhc2VsaW5lLnJlc3VsdCBpbXBvcnQgSW1h
Z2VSZXN1bHQKKworZnJvbSBvcHRwYXJzZSBpbXBvcnQgbWFrZV9vcHRpb24KKworCitjbGFzcyBJ
bWFnZURpZmZlcihvYmplY3QpOgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBwb3J0KToKKyAgICAg
ICAgc2VsZi5fcG9ydCA9IHBvcnQKKworICAgIGRlZiBzYW1lX2ltYWdlKHNlbGYsIGltZzEsIGlt
ZzIpOgorICAgICAgICByZXR1cm4gbm90IHNlbGYuX3BvcnQuZGlmZl9pbWFnZShpbWcxLCBpbWcy
KQorCisKK2NsYXNzIFJlYmFzZWxpbmUyKEFic3RyYWN0RGVjbGFyYXRpdmVDb21tYW5kKToKKyAg
ICBuYW1lID0gInJlYmFzZWxpbmUyIgorICAgIGhlbHBfdGV4dCA9ICJGZXRjaGVzIG5ldyBleHBl
Y3RlZCByZXN1bHRzIGZyb20gYnVpbGRib3RzLiIKKworICAgIGRlZiBfX2luaXRfXyhzZWxmKToK
KyAgICAgICAgb3B0aW9ucyA9IFsKKyAgICAgICAgICAgIG1ha2Vfb3B0aW9uKCItLXBsYXRmb3Jt
cyIsIGFjdGlvbj0ic3RvcmUiLCBkZXN0PSJwbGF0Zm9ybXMiLCBoZWxwPSJDb21tYSBzZXBhcmF0
ZWQgbGlzdCBvZiB0aGUgcGxhdGZvcm1zIHRvIHJlYmFzZWxpbmUgZm9yLiIpLAorICAgICAgICAg
ICAgbWFrZV9vcHRpb24oIi0tY2hyb21pdW0iLCBhY3Rpb249InN0b3JlX3RydWUiLCBkZXN0PSJ1
c2VfY2hyb21pdW1fYm90cyIsIGhlbHA9IkZldGNoIHJlc3VsdHMgZnJvbSB0aGUgQ2hyb21pdW0g
Ym90cy4iKSwKKyAgICAgICAgICAgIG1ha2Vfb3B0aW9uKCItLXdlYmtpdCIsIGFjdGlvbj0ic3Rv
cmVfZmFsc2UiLCBkZXN0PSJ1c2VfY2hyb21pdW1fYm90cyIsIGhlbHA9IkZldGNoIHJlc3VsdHMg
ZnJvbSB0aGUgV2ViS2l0IGJvdHMgKGRlZmF1bHQpLiIpLAorICAgICAgICAgICAgbWFrZV9vcHRp
b24oIi0tbGlzdC1idWlsZGVycyIsIGFjdGlvbj0ic3RvcmVfdHJ1ZSIsIGRlc3Q9Imxpc3RfYnVp
bGRlcnMiLCBoZWxwPSJMaXN0IHRoZSBidWlsZGVycyBmb3IgZWFjaCBwbGF0Zm9ybS4iKSwKKyAg
ICAgICAgICAgIG1ha2Vfb3B0aW9uKCItLWxpc3QtYXJjaGl2ZXMiLCBhY3Rpb249InN0b3JlX3Ry
dWUiLCBkZXN0PSJsaXN0X2FyY2hpdmVzIiwgaGVscD0iU2hvdyB0aGUgVVJMcyBvZiB0aGUgdGVz
dCByZXN1bHQgYXJjaGl2ZXMuIiksCisgICAgICAgICAgICBtYWtlX29wdGlvbigiLS1zaG93LWFy
Y2hpdmVzIiwgYWN0aW9uPSJzdG9yZV90cnVlIiwgZGVzdD0ic2hvd19hcmNoaXZlcyIsIGhlbHA9
IlNob3cgdGhlIHJlc3VsdHMgc3RvcmVkIGluIHRoZSBzcGVjaWZpZWQgYXJjaGl2ZXMuIiksCisg
ICAgICAgICAgICBtYWtlX29wdGlvbigiLS11c2UtemlwLWFzLWFyY2hpdmUiLCBhY3Rpb249InN0
b3JlIiwgaGVscD0iVXNlIHRoZSB6aXAgYXQgdGhlIHNwZWNpZmllZCBVUkwgKGxvY2FsIG9yIHJl
bW90ZSkgdG8gc3BlY2lmeSByZXN1bHRzIGZvciB0aGUgZ2l2ZW4gcGxhdGZvcm0uIiwgbWV0YXZh
cj0iPHBsYXRmb3JtPjo8emlwIHVybD4iKSwKKyAgICAgICAgXQorICAgICAgICBBYnN0cmFjdERl
Y2xhcmF0aXZlQ29tbWFuZC5fX2luaXRfXyhzZWxmLCBvcHRpb25zPW9wdGlvbnMpCisKKyAgICBk
ZWYgZXhlY3V0ZShzZWxmLCBvcHRpb25zLCBhcmdzLCB0b29sKToKKyAgICAgICAgYnVpbGRlciA9
IENocm9taXVtQnVpbGRlcigpIGlmIG9wdGlvbnMudXNlX2Nocm9taXVtX2JvdHMgZWxzZSBXZWJL
aXRCdWlsZGVyKCkKKworICAgICAgICBpZiBvcHRpb25zLnBsYXRmb3JtczoKKyAgICAgICAgICAg
IHBsYXRmb3JtcyA9IG9wdGlvbnMucGxhdGZvcm1zLnNwbGl0KCcsJykKKyAgICAgICAgZWxzZToK
KyAgICAgICAgICAgIHBsYXRmb3JtcyA9IGJ1aWxkZXIucGxhdGZvcm1zKCkKKworICAgICAgICBp
ZiBvcHRpb25zLmxpc3RfYnVpbGRlcnM6CisgICAgICAgICAgICBmb3IgcGxhdGZvcm0gaW4gcGxh
dGZvcm1zOgorICAgICAgICAgICAgICAgIHByaW50ICIlc1x0LT5cdCVzIiAlIChwbGF0Zm9ybSwg
YnVpbGRlci5sb29rdXBfYnVpbGRlcl9uYW1lKHBsYXRmb3JtKSkKKyAgICAgICAgICAgIGV4aXQo
KQorCisgICAgICAgIGlmIG9wdGlvbnMubGlzdF9hcmNoaXZlczoKKyAgICAgICAgICAgIGZvciBw
bGF0Zm9ybSBpbiBwbGF0Zm9ybXM6CisgICAgICAgICAgICAgICAgYnVpbGRlcl9uYW1lID0gYnVp
bGRlci5sb29rdXBfYnVpbGRlcl9uYW1lKHBsYXRmb3JtKQorICAgICAgICAgICAgICAgIHByaW50
ICIlc1x0LT5cdCVzIiAlIChwbGF0Zm9ybSwgYnVpbGRlci5sb29rdXBfcmVzdWx0X3ppcChidWls
ZGVyX25hbWUpKQorICAgICAgICAgICAgZXhpdCgpCisKKyAgICAgICAgaWYgb3B0aW9ucy5zaG93
X2FyY2hpdmVzOgorICAgICAgICAgICAgcGF0dGVybiA9ICcnIGlmIGxlbihhcmdzKSA9PSAwIGVs
c2UgYXJnc1swXQorICAgICAgICAgICAgZm9yIHBsYXRmb3JtIGluIHBsYXRmb3JtczoKKyAgICAg
ICAgICAgICAgICBmb3IgciBpbiBidWlsZGVyLmJ1aWxkZXIocGxhdGZvcm0pLnJlc3VsdHNfZm9y
KHBhdHRlcm4pOgorICAgICAgICAgICAgICAgICAgICBwcmludCByCisgICAgICAgICAgICBleGl0
KCkKKworICAgICAgICBwb3J0ID0gZmFjdG9yeS5nZXQoKQorICAgICAgICBpZiBwb3J0LmNoZWNr
X2ltYWdlX2RpZmYoKToKKyAgICAgICAgICAgIEltYWdlUmVzdWx0LmltYWdlX2RpZmZlciA9IElt
YWdlRGlmZmVyKHBvcnQpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBwcmludCAiV2Fybmlu
ZzogTm90IGNvdWxkbid0IGZpbmQgSW1hZ2VEaWZmLCBzbyB3ZSB3aWxsIGNyYXNoIGlmIHdlIG5l
ZWQgdG8gY29tcGFyZSBpbWFnZXMgdGhhdCBkb24ndCBoYXZlIGNoZWNrc3Vtcy4iCisgICAgICAg
ICAgICBJbWFnZVJlc3VsdC5pbWFnZV9kaWZmZXIgPSBOb25lCisKKyAgICAgICAgaWYgb3B0aW9u
cy51c2VfemlwX2FzX2FyY2hpdmUgaXMgbm90IE5vbmU6CisgICAgICAgICAgICBwbGF0Zm9ybSwg
dXJsID0gb3B0aW9ucy51c2VfemlwX2FzX2FyY2hpdmUuc3BsaXQoJzonKQorICAgICAgICAgICAg
cmVtb3RlX2J1aWxkZXJzID0gQnVpbGRlci5mcm9tX3ppcF91cmwocGxhdGZvcm0sIHVybCkKKyAg
ICAgICAgICAgIGZvciByIGluIHJlbW90ZV9idWlsZGVycy5yZXN1bHRzX2ZvcignJyk6CisgICAg
ICAgICAgICAgICAgcHJpbnQgInpyZXN1bHQgPSAlcyIgJSByCisgICAgICAgIGVsc2U6CisgICAg
ICAgICAgICByZW1vdGVfYnVpbGRlcnMgPSBidWlsZGVyLmJ1aWxkZXJzKHBsYXRmb3JtcykKKwor
ICAgICAgICBsYXlvdXRfdGVzdHNfZGlyID0gcG9ydC5sYXlvdXRfdGVzdHNfZGlyKCkKKyAgICAg
ICAgbG9jYWxfYnVpbGRlcnMgPSBCdWlsZGVyLmZyb21fcGF0aChsYXlvdXRfdGVzdHNfZGlyKQor
ICAgICAgICByYiA9IFJlYmFzZWxpbmVyKGFyZ3MsIGxvY2FsX2J1aWxkZXJzLCByZW1vdGVfYnVp
bGRlcnMsIGxheW91dF90ZXN0c19kaXIpCisgICAgICAgIHJiLnJlYmFzZWxpbmUob3B0aW9ucy5k
cnlfcnVuKQo=
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>75263</attachid>
            <date>2010-12-01 03:19:34 -0800</date>
            <delta_ts>2010-12-07 21:40:05 -0800</delta_ts>
            <desc>Patch</desc>
            <filename>bug-50098-20101201221929.patch</filename>
            <type>text/plain</type>
            <size>90070</size>
            <attacher name="James Kozianski">koz</attacher>
            
              <data encoding="base64">ZGlmZiAtLWdpdCBhL1dlYktpdFRvb2xzL0NoYW5nZUxvZyBiL1dlYktpdFRvb2xzL0NoYW5nZUxv
ZwppbmRleCA1NWNlZGFlM2ZjNGRhNGQzZmNkNDIyNGQ4MzU3ZjQyNDhiZTJiOWQyLi4yNzI4OWZm
OGU1ZmY4NmVkYTI0NmQ0M2I0NWJkOTk3MDhjMDQzYjdhIDEwMDY0NAotLS0gYS9XZWJLaXRUb29s
cy9DaGFuZ2VMb2cKKysrIGIvV2ViS2l0VG9vbHMvQ2hhbmdlTG9nCkBAIC0xLDMgKzEsMzEgQEAK
KzIwMTAtMTItMDEgIEphbWVzIEtvemlhbnNraSAgPGtvekBjaHJvbWl1bS5vcmc+CisKKyAgICAg
ICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChPT1BTISkuCisKKyAgICAgICAgTmV3IHdlYmtpdC1wYXRj
aCByZWJhc2VsaW5lMiBjb21tYW5kLgorICAgICAgICBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9z
aG93X2J1Zy5jZ2k/aWQ9NTAwOTgKKworICAgICAgICAqIFNjcmlwdHMvd2Via2l0cHkvY29tbW9u
L2RpcmFzemlwLnB5OiBBZGRlZC4KKyAgICAgICAgKiBTY3JpcHRzL3dlYmtpdHB5L2NvbW1vbi9u
ZXQvYnVpbGRib3QucHk6CisgICAgICAgICogU2NyaXB0cy93ZWJraXRweS9jb21tb24vbmV0L3Jl
bW90ZXppcC5weTogQWRkZWQuCisgICAgICAgICogU2NyaXB0cy93ZWJraXRweS9jb21tb24vbmV0
L3Jlc3VsdC5weTogQWRkZWQuCisgICAgICAgICogU2NyaXB0cy93ZWJraXRweS9jb21tb24vbmV0
L3Jlc3VsdF91bml0dGVzdC5weTogQWRkZWQuCisgICAgICAgICogU2NyaXB0cy93ZWJraXRweS9j
b21tb24vbmV0L3Jlc3VsdHNldC5weTogQWRkZWQuCisgICAgICAgICogU2NyaXB0cy93ZWJraXRw
eS9jb21tb24vbmV0L3Jlc3VsdHNldF91bml0dGVzdC5weTogQWRkZWQuCisgICAgICAgICogU2Ny
aXB0cy93ZWJraXRweS9jb21tb24vc3lzdGVtL2ZpbGVzeXN0ZW0ucHk6CisgICAgICAgICogU2Ny
aXB0cy93ZWJraXRweS9sYXlvdXRfdGVzdHMvcG9ydC9iYXNlLnB5OgorICAgICAgICAqIFNjcmlw
dHMvd2Via2l0cHkvbGF5b3V0X3Rlc3RzL3BvcnQvY2hyb21pdW0ucHk6CisgICAgICAgICogU2Ny
aXB0cy93ZWJraXRweS9sYXlvdXRfdGVzdHMvcG9ydC93ZWJraXQucHk6CisgICAgICAgICogU2Ny
aXB0cy93ZWJraXRweS90b29sL2NvbW1hbmRzL19faW5pdF9fLnB5OgorICAgICAgICAqIFNjcmlw
dHMvd2Via2l0cHkvdG9vbC9jb21tYW5kcy9yZWJhc2VsaW5lMi9fX2luaXRfXy5weTogQWRkZWQu
CisgICAgICAgICogU2NyaXB0cy93ZWJraXRweS90b29sL2NvbW1hbmRzL3JlYmFzZWxpbmUyL2J1
Y2tldC5weTogQWRkZWQuCisgICAgICAgICogU2NyaXB0cy93ZWJraXRweS90b29sL2NvbW1hbmRz
L3JlYmFzZWxpbmUyL2J1Y2tldF91bml0dGVzdC5weTogQWRkZWQuCisgICAgICAgICogU2NyaXB0
cy93ZWJraXRweS90b29sL2NvbW1hbmRzL3JlYmFzZWxpbmUyL2J1aWxkZXIucHk6IEFkZGVkLgor
ICAgICAgICAqIFNjcmlwdHMvd2Via2l0cHkvdG9vbC9jb21tYW5kcy9yZWJhc2VsaW5lMi9idWls
ZGVyX3VuaXR0ZXN0LnB5OiBBZGRlZC4KKyAgICAgICAgKiBTY3JpcHRzL3dlYmtpdHB5L3Rvb2wv
Y29tbWFuZHMvcmViYXNlbGluZTIvaW50ZWdyYXRpb25fdW5pdHRlc3QucHk6IEFkZGVkLgorICAg
ICAgICAqIFNjcmlwdHMvd2Via2l0cHkvdG9vbC9jb21tYW5kcy9yZWJhc2VsaW5lMi9yZWJhc2Vs
aW5lMi5weTogQWRkZWQuCisgICAgICAgICogU2NyaXB0cy93ZWJraXRweS90b29sL2NvbW1hbmRz
L3JlYmFzZWxpbmUyL3JlYmFzZWxpbmVyLnB5OiBBZGRlZC4KKwogMjAxMC0xMS0yNCAgTmljb2xh
cyBEdWZyZXNuZSAgPG5pY29sYXMuZHVmcmVzbmVAY29sbGFib3JhLmNvLnVrPgogCiAgICAgICAg
IFJldmlld2VkIGJ5IE1hcnRpbiBSb2JpbnNvbi4KZGlmZiAtLWdpdCBhL1dlYktpdFRvb2xzL1Nj
cmlwdHMvd2Via2l0cHkvY29tbW9uL2RpcmFzemlwLnB5IGIvV2ViS2l0VG9vbHMvU2NyaXB0cy93
ZWJraXRweS9jb21tb24vZGlyYXN6aXAucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMC4uN2IzM2I3ZjJjYjkyZmY4ODdj
ZTc3Mzc1YzRjZTY5NzAxOTI3ZTI3NwotLS0gL2Rldi9udWxsCisrKyBiL1dlYktpdFRvb2xzL1Nj
cmlwdHMvd2Via2l0cHkvY29tbW9uL2RpcmFzemlwLnB5CkBAIC0wLDAgKzEsNjYgQEAKKyMhL3Vz
ci9iaW4vZW52IHB5dGhvbgorIyBDb3B5cmlnaHQgKEMpIDIwMTAgR29vZ2xlIEluYy4gQWxsIHJp
Z2h0cyByZXNlcnZlZC4KKyMKKyMgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5k
IGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisjIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1p
dHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworIyBhcmUgbWV0Ogor
IworIyAxLiAgUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBh
Ym92ZSBjb3B5cmlnaHQKKyMgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5k
IHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyMgMi4gIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5h
cnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisjICAgICBub3RpY2Us
IHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4g
dGhlCisjICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQg
d2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorIworIyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZ
IEFQUExFIEFORCBJVFMgQ09OVFJJQlVUT1JTICJBUyBJUyIgQU5EIEFOWQorIyBFWFBSRVNTIE9S
IElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJ
TVBMSUVECisjIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBB
IFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKKyMgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwg
QVBQTEUgT1IgSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWQorIyBESVJFQ1QsIElO
RElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwg
REFNQUdFUworIyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9G
IFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisjIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQ
Uk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAorIyBP
TiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJ
QUJJTElUWSwgT1IgVE9SVAorIyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBB
UklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKyMgVEhJUyBTT0ZUV0FSRSwgRVZF
TiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworZnJvbSBf
X2Z1dHVyZV9fIGltcG9ydCB3aXRoX3N0YXRlbWVudAorZnJvbSB3ZWJraXRweS5jb21tb24ubmV0
LnJlbW90ZXppcCBpbXBvcnQgWmlwRmlsZUhhbmRsZQorZnJvbSB3ZWJraXRweS5jb21tb24uc3lz
dGVtLmZpbGVzeXN0ZW0gaW1wb3J0IEZpbGVTeXN0ZW0KK2ltcG9ydCBvcworaW1wb3J0IHNodXRp
bAorCisKK2NsYXNzIERpcmVjdG9yeUFzWmlwKG9iamVjdCk6CisgICAgIiIiUHJvdmlkZXMgYSB6
aXBmaWxlLWxpa2UgaW50ZXJmYWNlIHRvIGEgbG9jYWwgZGlyZWN0b3J5IiIiCisgICAgZGVmIF9f
aW5pdF9fKHNlbGYsIHBhdGgsIGZzPUZpbGVTeXN0ZW0oKSk6CisgICAgICAgIHNlbGYuX3BhdGgg
PSBwYXRoCisgICAgICAgIHNlbGYuX2ZzID0gZnMKKyAgICAgICAgaWYgbm90IHNlbGYuX3BhdGgu
ZW5kc3dpdGgob3MucGF0aC5zZXApOgorICAgICAgICAgICAgc2VsZi5fcGF0aCArPSBvcy5wYXRo
LnNlcAorCisgICAgZGVmIGhhbmRsZV90byhzZWxmLCBmaWxlbmFtZSk6CisgICAgICAgIHJldHVy
biBaaXBGaWxlSGFuZGxlKHNlbGYsIGZpbGVuYW1lKQorCisgICAgZGVmIG5hbWVsaXN0KHNlbGYp
OgorICAgICAgICByZXN1bHRzID0gW10KKyAgICAgICAgZm9yIChwYXRoLCBfLCBmaWxlbmFtZXMp
IGluIG9zLndhbGsoc2VsZi5fcGF0aCk6CisgICAgICAgICAgICBmb3IgZmlsZW5hbWUgaW4gZmls
ZW5hbWVzOgorICAgICAgICAgICAgICAgICMgV2UgZHJvcCB0aGUgcGF0aCB0byB0aGUgZGlyZWN0
b3J5IGZyb20gb3VyIG5hbWVsaXN0LgorICAgICAgICAgICAgICAgIHJlc3VsdHMuYXBwZW5kKG9z
LnBhdGguam9pbihwYXRoLCBmaWxlbmFtZSlbbGVuKHNlbGYuX3BhdGgpOl0pCisgICAgICAgIHJl
dHVybiByZXN1bHRzCisKKyAgICBkZWYgcmVhZChzZWxmLCBmaWxlbmFtZSk6CisgICAgICAgIHJl
dHVybiBzZWxmLl9mcy5yZWFkX3RleHRfZmlsZShvcy5wYXRoLmpvaW4oc2VsZi5fcGF0aCwgZmls
ZW5hbWUpKQorCisgICAgZGVmIGV4dHJhY3Qoc2VsZiwgZmlsZW5hbWUsIHBhdGgpOgorICAgICAg
ICBzcmMgPSBvcy5wYXRoLmpvaW4oc2VsZi5fcGF0aCwgZmlsZW5hbWUpCisgICAgICAgIGRlc3Qg
PSBvcy5wYXRoLmpvaW4ocGF0aCwgZmlsZW5hbWUpCisgICAgICAgICMgQXMgZmlsZW5hbWUgbWF5
IGhhdmUgc2xhc2hlcyBpbiBpdCwgd2UgbXVzdCBlbnN1cmUgdGhhdCB0aGUgY29ycmVjdAorICAg
ICAgICAjIGRpcmVjdG9yeSBoZWlyYXJjaHkgZXhpc3RzIHdoZW4gd2UgYXJlIGNvcHlpbmcgaXQg
dG8gdGhlIG91dHB1dC4KKyAgICAgICAgcGF0aF90b19maWxlID0gb3MucGF0aC5zcGxpdChmaWxl
bmFtZSlbMF0KKyAgICAgICAgc2VsZi5fZnMubWF5YmVfbWFrZV9kaXJlY3RvcnkocGF0aCwgcGF0
aF90b19maWxlKQorICAgICAgICBzZWxmLl9mcy5jb3B5X2ZpbGUoc3JjLCBkZXN0KQorCisgICAg
ZGVmIGRlbGV0ZShzZWxmLCBmaWxlbmFtZSk6CisgICAgICAgIGZpbGVuYW1lID0gb3MucGF0aC5q
b2luKHNlbGYuX3BhdGgsIGZpbGVuYW1lKQorICAgICAgICBhc3NlcnQgJy4uJyBub3QgaW4gZmls
ZW5hbWUKKyAgICAgICAgc2VsZi5fZnMucmVtb3ZlX2ZpbGUoZmlsZW5hbWUpCmRpZmYgLS1naXQg
YS9XZWJLaXRUb29scy9TY3JpcHRzL3dlYmtpdHB5L2NvbW1vbi9uZXQvYnVpbGRib3QucHkgYi9X
ZWJLaXRUb29scy9TY3JpcHRzL3dlYmtpdHB5L2NvbW1vbi9uZXQvYnVpbGRib3QucHkKaW5kZXgg
ODhjZGQ0ZTI4MDI1NWM0OWVmZjg2MjRlMmYyMTgzZGFhNjQyYjFhOC4uNTU2NTEyZjFiZTJiOTUz
Nzk1Yzk5YTlmMDMyNTIwZjhmMTE5ODY0MSAxMDA2NDQKLS0tIGEvV2ViS2l0VG9vbHMvU2NyaXB0
cy93ZWJraXRweS9jb21tb24vbmV0L2J1aWxkYm90LnB5CisrKyBiL1dlYktpdFRvb2xzL1Njcmlw
dHMvd2Via2l0cHkvY29tbW9uL25ldC9idWlsZGJvdC5weQpAQCAtMzcsNiArMzcsOCBAQCBpbXBv
cnQgeG1scnBjbGliCiBmcm9tIHdlYmtpdHB5LmNvbW1vbi5uZXQuZmFpbHVyZW1hcCBpbXBvcnQg
RmFpbHVyZU1hcAogZnJvbSB3ZWJraXRweS5jb21tb24ubmV0LmxheW91dHRlc3RyZXN1bHRzIGlt
cG9ydCBMYXlvdXRUZXN0UmVzdWx0cwogZnJvbSB3ZWJraXRweS5jb21tb24ubmV0LnJlZ3Jlc3Np
b253aW5kb3cgaW1wb3J0IFJlZ3Jlc3Npb25XaW5kb3cKK2Zyb20gd2Via2l0cHkuY29tbW9uLm5l
dC5yZW1vdGV6aXAgaW1wb3J0IFJlbW90ZVppcAorZnJvbSB3ZWJraXRweS5jb21tb24ubmV0LnJl
c3VsdHNldCBpbXBvcnQgUmVzdWx0U2V0CiBmcm9tIHdlYmtpdHB5LmNvbW1vbi5zeXN0ZW0ubG9n
dXRpbHMgaW1wb3J0IGdldF9sb2dnZXIKIGZyb20gd2Via2l0cHkudGhpcmRwYXJ0eS5hdXRvaW5z
dGFsbGVkLm1lY2hhbml6ZSBpbXBvcnQgQnJvd3NlcgogZnJvbSB3ZWJraXRweS50aGlyZHBhcnR5
LkJlYXV0aWZ1bFNvdXAgaW1wb3J0IEJlYXV0aWZ1bFNvdXAKQEAgLTg3LDYgKzg5LDEyIEBAIGNs
YXNzIEJ1aWxkZXIob2JqZWN0KToKICAgICAgICAgc2VsZi5fYnVpbGRzX2NhY2hlW2J1aWxkX251
bWJlcl0gPSBidWlsZAogICAgICAgICByZXR1cm4gYnVpbGQKIAorICAgIGRlZiBsYXRlc3RfYnVp
bGQoc2VsZik6CisgICAgICAgIHJldmlzaW9uX2J1aWxkX3BhaXJzID0gc2VsZi5yZXZpc2lvbl9i
dWlsZF9wYWlyc193aXRoX3Jlc3VsdHMoKQorICAgICAgICByZXZpc2lvbl9idWlsZF9wYWlycy5z
b3J0KGtleT1sYW1iZGEgaTogaVsxXSkKKyAgICAgICAgbGF0ZXN0X2J1aWxkX251bWJlciA9IHJl
dmlzaW9uX2J1aWxkX3BhaXJzWy0xXVsxXQorICAgICAgICByZXR1cm4gc2VsZi5idWlsZChsYXRl
c3RfYnVpbGRfbnVtYmVyKQorCiAgICAgZGVmIGZvcmNlX2J1aWxkKHNlbGYsIHVzZXJuYW1lPSJ3
ZWJraXQtcGF0Y2giLCBjb21tZW50cz1Ob25lKToKICAgICAgICAgZGVmIHByZWRpY2F0ZShmb3Jt
KToKICAgICAgICAgICAgIHRyeToKQEAgLTIxNiw4ICsyMjQsMTYgQEAgY2xhc3MgQnVpbGQob2Jq
ZWN0KToKICAgICAgICAgcmVzdWx0c19kaXJlY3RvcnkgPSAiciVzICglcykiICUgKHNlbGYucmV2
aXNpb24oKSwgc2VsZi5fbnVtYmVyKQogICAgICAgICByZXR1cm4gIiVzLyVzIiAlIChzZWxmLl9i
dWlsZGVyLnJlc3VsdHNfdXJsKCksIHVybGxpYi5xdW90ZShyZXN1bHRzX2RpcmVjdG9yeSkpCiAK
KyAgICBkZWYgcmVzdWx0c196aXBfdXJsKHNlbGYpOgorICAgICAgICByZXR1cm4gIiVzLnppcCIg
JSBzZWxmLnJlc3VsdHNfdXJsKCkKKworICAgIGRlZiByZXN1bHRzKHNlbGYpOgorICAgICAgICBw
cmludCAiZ2V0dGluZyByZXN1bHRzIGZyb20gJXMiICUgc2VsZi5yZXN1bHRzX3ppcF91cmwoKQor
ICAgICAgICByZXR1cm4gUmVzdWx0U2V0KHNlbGYuX2J1aWxkZXIubmFtZSgpLCBOb25lLCBSZW1v
dGVaaXAoc2VsZi5yZXN1bHRzX3ppcF91cmwoKSksIGluY2x1ZGVfZXhwZWN0ZWQ9RmFsc2UpCisK
ICAgICBkZWYgX2ZldGNoX3Jlc3VsdHNfaHRtbChzZWxmKToKICAgICAgICAgcmVzdWx0c19odG1s
ID0gIiVzL3Jlc3VsdHMuaHRtbCIgJSAoc2VsZi5yZXN1bHRzX3VybCgpKQorICAgICAgICBwcmlu
dCAicmVzdWx0c19odG1sID0gJXMiICUgcmVzdWx0c19odG1sCiAgICAgICAgICMgRklYTUU6IFRo
aXMgc2hvdWxkIHVzZSBOZXR3b3JrVHJhbnNhY3Rpb24ncyA0MDQgaGFuZGxpbmcgaW5zdGVhZC4K
ICAgICAgICAgdHJ5OgogICAgICAgICAgICAgIyBJdCBzZWVtcyB0aGlzIGNhbiByZXR1cm4gTm9u
ZSBpZiB0aGUgdXJsIHJlZGlyZWN0cyBhbmQgdGhlbiByZXR1cm5zIDQwNC4KZGlmZiAtLWdpdCBh
L1dlYktpdFRvb2xzL1NjcmlwdHMvd2Via2l0cHkvY29tbW9uL25ldC9yZW1vdGV6aXAucHkgYi9X
ZWJLaXRUb29scy9TY3JpcHRzL3dlYmtpdHB5L2NvbW1vbi9uZXQvcmVtb3RlemlwLnB5Cm5ldyBm
aWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAuLjM0ZTRmZDEwMzU3ZjMzODU5MzI3ZDVjZTVlMjRmMTUwMzQ5ZjhhNDIKLS0tIC9kZXYv
bnVsbAorKysgYi9XZWJLaXRUb29scy9TY3JpcHRzL3dlYmtpdHB5L2NvbW1vbi9uZXQvcmVtb3Rl
emlwLnB5CkBAIC0wLDAgKzEsOTcgQEAKKyMhL3Vzci9iaW4vZW52IHB5dGhvbgorIyBDb3B5cmln
aHQgKEMpIDIwMTAgR29vZ2xlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyMKKyMgUmVkaXN0
cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRo
b3V0CisjIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xs
b3dpbmcgY29uZGl0aW9ucworIyBhcmUgbWV0OgorIworIyAxLiAgUmVkaXN0cmlidXRpb25zIG9m
IHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyMgICAgIG5vdGlj
ZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4K
KyMgMi4gIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUg
YWJvdmUgY29weXJpZ2h0CisjICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFu
ZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisjICAgICBkb2N1bWVudGF0aW9uIGFu
ZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorIwor
IyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIEFORCBJVFMgQ09OVFJJQlVUT1JT
ICJBUyBJUyIgQU5EIEFOWQorIyBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVE
SU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVECisjIFdBUlJBTlRJRVMgT0YgTUVS
Q0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKKyMg
RElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgT1IgSVRTIENPTlRSSUJVVE9SUyBC
RSBMSUFCTEUgRk9SIEFOWQorIyBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFM
LCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUworIyAoSU5DTFVESU5HLCBCVVQg
Tk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklD
RVM7CisjIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJV
UFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAorIyBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwg
V0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorIyAoSU5DTFVE
SU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRI
RSBVU0UgT0YKKyMgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJ
TElUWSBPRiBTVUNIIERBTUFHRS4KKworZnJvbSB3ZWJraXRweS5jb21tb24ubmV0Lm5ldHdvcmt0
cmFuc2FjdGlvbiBpbXBvcnQgTmV0d29ya1RyYW5zYWN0aW9uCitpbXBvcnQgb3MKK2ltcG9ydCBz
aHV0aWwKK2ltcG9ydCB0ZW1wZmlsZQoraW1wb3J0IHVybGxpYgoraW1wb3J0IHppcGZpbGUKKwor
CitjbGFzcyBSZW1vdGVaaXAob2JqZWN0KToKKyAgICAiIiJBIHppcCBmaWxlIHRoYXQgcmVzaWRl
cyBhdCBhIFVSTCAobG9jYWwgb3IgcmVtb3RlKSIiIgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCB6
aXBfdXJsKToKKyAgICAgICAgc2VsZi5femlwX3VybCA9IHppcF91cmwKKyAgICAgICAgc2VsZi5f
emlwX2ZpbGUgPSBOb25lCisKKyAgICBkZWYgX2xvYWQoc2VsZik6CisgICAgICAgIGlmIHNlbGYu
X3ppcF9maWxlIGlzIE5vbmU6CisgICAgICAgICAgICB0ZW1wX2ZpbGUgPSBOZXR3b3JrVHJhbnNh
Y3Rpb24oKS5ydW4obGFtYmRhOiB1cmxsaWIudXJscmV0cmlldmUoc2VsZi5femlwX3VybClbMF0p
CisgICAgICAgICAgICBzZWxmLl96aXBfZmlsZSA9IHppcGZpbGUuWmlwRmlsZSh0ZW1wX2ZpbGUp
CisKKyAgICBkZWYgaGFuZGxlX3RvKHNlbGYsIGZpbGVuYW1lKToKKyAgICAgICAgcmV0dXJuIFpp
cEZpbGVIYW5kbGUoc2VsZiwgZmlsZW5hbWUpCisKKyAgICBkZWYgbmFtZWxpc3Qoc2VsZik6Cisg
ICAgICAgIHNlbGYuX2xvYWQoKQorICAgICAgICByZXR1cm4gc2VsZi5femlwX2ZpbGUubmFtZWxp
c3QoKQorCisgICAgZGVmIHJlYWQoc2VsZiwgZmlsZW5hbWUpOgorICAgICAgICBzZWxmLl9sb2Fk
KCkKKyAgICAgICAgcmV0dXJuIHNlbGYuX3ppcF9maWxlLnJlYWQoZmlsZW5hbWUpCisKKyAgICBk
ZWYgZXh0cmFjdChzZWxmLCBmaWxlbmFtZSwgcGF0aCk6CisgICAgICAgIHNlbGYuX2xvYWQoKQor
ICAgICAgICByZXR1cm4gc2VsZi5femlwX2ZpbGUuZXh0cmFjdChmaWxlbmFtZSwgcGF0aCkKKwor
ICAgIGRlZiBkZWxldGUoc2VsZiwgZmlsZW5hbWUpOgorICAgICAgICByYWlzZSBFeGNlcHRpb24o
IkNhbid0IGRlbGV0ZSBmcm9tIGEgUmVtb3RlWmlwLiIpCisKKworY2xhc3MgWmlwRmlsZUhhbmRs
ZToKKyAgICAiIiJQb2ludHMgdG8gYSBmaWxlIHRoYXQgcmVzaWRlcyBpbiBhIFJlbW90ZVppcCIi
IgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCB6aXBfZmlsZSwgZmlsZW5hbWUpOgorICAgICAgICBz
ZWxmLl9maWxlbmFtZSA9IGZpbGVuYW1lCisgICAgICAgIHNlbGYuX3ppcF9maWxlID0gemlwX2Zp
bGUKKyAgICAgICAgc2VsZi5fY29udGVudHMgPSBOb25lCisKKyAgICBkZWYgX19zdHJfXyhzZWxm
KToKKyAgICAgICAgcmV0dXJuICIlczolcyIgJSAoc2VsZi5femlwX2ZpbGUsIHNlbGYuX2ZpbGVu
YW1lKQorCisgICAgZGVmIGNvbnRlbnRzKHNlbGYpOgorICAgICAgICBpZiBzZWxmLl9jb250ZW50
cyBpcyBOb25lOgorICAgICAgICAgICAgc2VsZi5fY29udGVudHMgPSBzZWxmLl96aXBfZmlsZS5y
ZWFkKHNlbGYuX2ZpbGVuYW1lKQorICAgICAgICByZXR1cm4gc2VsZi5fY29udGVudHMKKworICAg
IGRlZiBzYXZlX3RvKHNlbGYsIHBhdGgsIGZpbGVuYW1lPU5vbmUpOgorICAgICAgICBpZiBmaWxl
bmFtZSBpcyBOb25lOgorICAgICAgICAgICAgc2VsZi5femlwX2ZpbGUuZXh0cmFjdChzZWxmLl9m
aWxlbmFtZSwgcGF0aCkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHRlbXBfZGlyID0gdGVt
cGZpbGUubWtkdGVtcCgpCisgICAgICAgICAgICBzZWxmLl96aXBfZmlsZS5leHRyYWN0KHNlbGYu
X2ZpbGVuYW1lLCB0ZW1wX2RpcikKKworICAgICAgICAgICAgc3JjID0gb3MucGF0aC5qb2luKHRl
bXBfZGlyLCBzZWxmLl9maWxlbmFtZSkKKyAgICAgICAgICAgIGRlc3QgPSBvcy5wYXRoLmpvaW4o
cGF0aCwgZmlsZW5hbWUpCisgICAgICAgICAgICBzaHV0aWwuY29weWZpbGUoc3JjLCBkZXN0KQor
ICAgICAgICAgICAgc2h1dGlsLnJtdHJlZSh0ZW1wX2RpcikKKworICAgIGRlZiBkZWxldGUoc2Vs
Zik6CisgICAgICAgIHNlbGYuX3ppcF9maWxlLmRlbGV0ZShzZWxmLl9maWxlbmFtZSkKKworICAg
IGRlZiBuYW1lKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5fZmlsZW5hbWUKKworICAgIGRl
ZiBzcGxpdGV4dChzZWxmKToKKyAgICAgICAgcmV0dXJuIG9zLnBhdGguc3BsaXRleHQoc2VsZi5u
YW1lKCkpCmRpZmYgLS1naXQgYS9XZWJLaXRUb29scy9TY3JpcHRzL3dlYmtpdHB5L2NvbW1vbi9u
ZXQvcmVzdWx0LnB5IGIvV2ViS2l0VG9vbHMvU2NyaXB0cy93ZWJraXRweS9jb21tb24vbmV0L3Jl
c3VsdC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwLi44N2UxNmIwMjJhZGU1MmQ3NmQ3Yzc0NzUwZmY1YjY5ZGZmNTY3
NWE3Ci0tLSAvZGV2L251bGwKKysrIGIvV2ViS2l0VG9vbHMvU2NyaXB0cy93ZWJraXRweS9jb21t
b24vbmV0L3Jlc3VsdC5weQpAQCAtMCwwICsxLDE2NyBAQAorIyEvdXNyL2Jpbi9lbnYgcHl0aG9u
CisjIENvcHlyaWdodCAoQykgMjAxMCBHb29nbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgor
IworIyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3
aXRoIG9yIHdpdGhvdXQKKyMgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRo
YXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisjIGFyZSBtZXQ6CisjCisjIDEuICBSZWRpc3Ry
aWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAor
IyAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBk
aXNjbGFpbWVyLgorIyAyLiAgUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVw
cm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyMgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNv
bmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyMgICAgIGRvY3Vt
ZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmli
dXRpb24uCisjCisjIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgQU5EIElUUyBD
T05UUklCVVRPUlMgIkFTIElTIiBBTkQgQU5ZCisjIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5U
SUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQKKyMgV0FSUkFO
VElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQ
T1NFIEFSRQorIyBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBPUiBJVFMgQ09O
VFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZCisjIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5U
QUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCisjIChJTkNM
VURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09E
UyBPUiBTRVJWSUNFUzsKKyMgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lO
RVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECisjIE9OIEFOWSBUSEVPUlkgT0Yg
TElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JU
CisjIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdB
WSBPVVQgT0YgVEhFIFVTRSBPRgorIyBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0Yg
VEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCitpbXBvcnQgb3MKK2ltcG9ydCByZQor
CisKK2NsYXNzIE5haXZlSW1hZ2VEaWZmZXIob2JqZWN0KToKKyAgICBkZWYgc2FtZV9pbWFnZShz
ZWxmLCBpbWcxLCBpbWcyKToKKyAgICAgICAgcmV0dXJuIGltZzEgPT0gaW1nMgorCisKK2NsYXNz
IFJlc3VsdChvYmplY3QpOgorICAgICIiIlJlcHJlc2VudHMgdGhlIHJlc3VsdCBvZiBhIHNpbmds
ZSB0ZXN0IG9uIGEgc2luZ2xlIHBsYXRmb3JtIiIiCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHBs
YXRmb3JtLCByZXN1bHRfdHlwZSwgZmlsZXMpOgorICAgICAgICBzZWxmLl9wbGF0Zm9ybSA9IHBs
YXRmb3JtCisgICAgICAgIHNlbGYuX3Jlc3VsdF90eXBlID0gcmVzdWx0X3R5cGUKKyAgICAgICAg
c2VsZi5fZmlsZXMgPSBmaWxlcworICAgICAgICBzZWxmLl9tYWluX2ZpbGUgPSBmaWxlc1swXQor
ICAgICAgICBmaWxlbmFtZSA9IHNlbGYuX21haW5fZmlsZS5uYW1lKCkKKyAgICAgICAgc2VsZi5f
bmFtZSA9IHNlbGYuX2V4dHJhY3RfdGVzdF9uYW1lKGZpbGVuYW1lKQorICAgICAgICBzZWxmLl9p
c19hY3R1YWwgPSAnLWFjdHVhbC4nIGluIGZpbGVuYW1lCisKKyAgICAgICAgaWYgc2VsZi5fcGxh
dGZvcm0gaXMgTm9uZToKKyAgICAgICAgICAgIHNlbGYuX3BsYXRmb3JtID0gc2VsZi5fZXh0cmFj
dF9wbGF0Zm9ybShmaWxlbmFtZSkKKworICAgIGRlZiBfZXh0cmFjdF9wbGF0Zm9ybShzZWxmLCBm
aWxlbmFtZSk6CisgICAgICAgICIiIkNhbGN1bGF0ZXMgdGhlIHBsYXRmb3JtIGZyb20gdGhlIG5h
bWUgb2YgdGhlIGZpbGUgaWYgaXQgaXNuJ3Qga25vd24gYWxyZWFkeSIiIgorICAgICAgICBwYXRo
ID0gcmUuc3BsaXQob3MucGF0aC5zZXAsIGZpbGVuYW1lKQorICAgICAgICBpZiAncGxhdGZvcm0n
IGluIHBhdGg6CisgICAgICAgICAgICByZXR1cm4gcGF0aFtwYXRoLmluZGV4KCdwbGF0Zm9ybScp
ICsgMV0KKyAgICAgICAgcmV0dXJuIE5vbmUKKworICAgIGRlZiBfZXh0cmFjdF90ZXN0X25hbWUo
c2VsZiwgZmlsZW5hbWUpOgorICAgICAgICB0ZXN0X25hbWUgPSBmaWxlbmFtZQorICAgICAgICBw
YXRoID0gcmUuc3BsaXQob3MucGF0aC5zZXAsIHRlc3RfbmFtZSkKKyAgICAgICAgaWYgJ0xheW91
dFRlc3RzJyBpbiBwYXRoOgorICAgICAgICAgICAgcGF0aCA9IHBhdGhbMSArIHBhdGguaW5kZXgo
J0xheW91dFRlc3RzJyk6XQorICAgICAgICBpZiAnbGF5b3V0LXRlc3QtcmVzdWx0cycgaW4gcGF0
aDoKKyAgICAgICAgICAgIHBhdGggPSBwYXRoWzEgKyBwYXRoLmluZGV4KCdsYXlvdXQtdGVzdC1y
ZXN1bHRzJyk6XQorICAgICAgICBpZiAncGxhdGZvcm0nIGluIHBhdGg6CisgICAgICAgICAgICBw
YXRoID0gcGF0aFsyICsgcGF0aC5pbmRleCgncGxhdGZvcm0nKTpdCisKKyAgICAgICAgdGVzdF9u
YW1lID0gcGF0aFstMV0KKyAgICAgICAgdGVzdF9uYW1lID0gcmUuc3ViKCctZXhwZWN0ZWRcLi4q
JCcsICcnLCB0ZXN0X25hbWUpCisgICAgICAgIHRlc3RfbmFtZSA9IHJlLnN1YignLWFjdHVhbFwu
LiokJywgJycsIHRlc3RfbmFtZSkKKyAgICAgICAgcGF0aFstMV0gPSB0ZXN0X25hbWUKKyAgICAg
ICAgcmV0dXJuIG9zLnBhdGguc2VwLmpvaW4ocGF0aCkKKworICAgIGRlZiBfc2V0X3Rlc3RfbmFt
ZShzZWxmLCBmaWxlbmFtZSk6CisgICAgICAgIHNlbGYuX3Rlc3RfbmFtZSA9IGZpbGVuYW1lCisg
ICAgICAgIGlmIG9zLnBhdGguc2VwIGluIGZpbGVuYW1lOgorICAgICAgICAgICAgc2VsZi5fdGVz
dF9uYW1lID0gZmlsZW5hbWVbOmZpbGVuYW1lLnJpbmRleChvcy5wYXRoLnNlcCldCisKKyAgICBk
ZWYgY29udGVudHMoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLl9tYWluX2ZpbGUuY29udGVu
dHMoKQorCisgICAgZGVmIHNhdmVfdG8oc2VsZiwgcGF0aCk6CisgICAgICAgIGZvciBmaWxlIGlu
IHNlbGYuX2ZpbGVzOgorICAgICAgICAgICAgZmlsZS5zYXZlX3RvKHBhdGgpCisKKyAgICBkZWYg
aXNfYWN0dWFsKHNlbGYpOgorICAgICAgICAiIiJBcmUgdGhlc2UgcmVzdWx0cyB0aGUgYWN0dWFs
IG91dHB1dCBvZiBhIHRlc3Q/IiIiCisgICAgICAgIHJldHVybiBzZWxmLl9pc19hY3R1YWwKKwor
ICAgIGRlZiBuYW1lKHNlbGYpOgorICAgICAgICAiIiJUaGUgbmFtZSBvZiB0aGlzIHRlc3QgKGRv
ZXNuJ3QgaW5jbHVkZSBleHRlbnNpb24pIiIiCisgICAgICAgIHJldHVybiBzZWxmLl9uYW1lCisK
KyAgICBkZWYgc2FtZV9jb250ZW50KHNlbGYsIG90aGVyKToKKyAgICAgICAgcmV0dXJuIHNlbGYu
Y29udGVudHMoKSA9PSBvdGhlci5jb250ZW50cygpCisKKyAgICBkZWYgX19lcV9fKHNlbGYsIG90
aGVyKToKKyAgICAgICAgcmV0dXJuIG90aGVyICE9IE5vbmUgYW5kIHNlbGYubmFtZSgpID09IG90
aGVyLm5hbWUoKSBhbmQgc2VsZi50eXBlKCkgPT0gb3RoZXIudHlwZSgpIGFuZCBzZWxmLnBsYXRm
b3JtKCkgPT0gb3RoZXIucGxhdGZvcm0oKSBhbmQgc2VsZi5pc19hY3R1YWwoKSA9PSBvdGhlci5p
c19hY3R1YWwoKSBhbmQgc2VsZi5zYW1lX2NvbnRlbnQob3RoZXIpCisKKyAgICBkZWYgX19oYXNo
X18oc2VsZik6CisgICAgICAgIHJldHVybiBoYXNoKHN0cihzZWxmLm5hbWUoKSkgKyBzdHIoc2Vs
Zi50eXBlKCkpICsgc3RyKHNlbGYucGxhdGZvcm0oKSkpCisKKyAgICBkZWYgaXNfbmV3ZXJfdGhh
bihzZWxmLCBvdGhlcik6CisgICAgICAgICIiIidOZXcnIHJlc3VsdHMgYXJlIHRob3NlIGFjdHVh
bGx5IGNvbWluZyBmcm9tIGEgdGVzdC4iIiIKKyAgICAgICAgcmV0dXJuIHNlbGYuaXNfYWN0dWFs
KCkgYW5kIG5vdCBvdGhlci5pc19hY3R1YWwoKQorCisgICAgZGVmIGlzX3JlYmFzZWxpbmVfb2Yo
c2VsZiwgb3RoZXIpOgorICAgICAgICByZXR1cm4gc2VsZi5uYW1lKCkgPT0gb3RoZXIubmFtZSgp
IGFuZCBzZWxmLnR5cGUoKSA9PSBvdGhlci50eXBlKCkgYW5kIHNlbGYucGxhdGZvcm0oKSA9PSBv
dGhlci5wbGF0Zm9ybSgpIGFuZCBzZWxmLmlzX2FjdHVhbCgpIGFuZCAobm90IG90aGVyLmlzX2Fj
dHVhbCgpKQorCisgICAgZGVmIF9fc3RyX18oc2VsZik6CisgICAgICAgIGFjdHVhbF9zdHIgPSAn
W0FdICcgaWYgc2VsZi5pc19hY3R1YWwoKSBlbHNlICcnCisgICAgICAgIHJldHVybiAiUmVzdWx0
WyVzLyVzXSAlcyVzIiAlIChzZWxmLl9wbGF0Zm9ybSwgc2VsZi5fcmVzdWx0X3R5cGUsIGFjdHVh
bF9zdHIsIHNlbGYubmFtZSgpKQorCisgICAgZGVmIHR5cGUoc2VsZik6CisgICAgICAgIHJldHVy
biBzZWxmLl9yZXN1bHRfdHlwZQorCisgICAgZGVmIHBsYXRmb3JtKHNlbGYpOgorICAgICAgICBy
ZXR1cm4gc2VsZi5fcGxhdGZvcm0KKworICAgIGRlZiBfaW5zdGFsbF9maWxlKHNlbGYsIGZpbGUs
IHBhdGgpOgorICAgICAgICBpZiBzZWxmLl9wbGF0Zm9ybSBpcyBOb25lOgorICAgICAgICAgICAg
cGxhdGZvcm1fY29tcG9uZW50ID0gIiIKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHBsYXRm
b3JtX2NvbXBvbmVudCA9ICJwbGF0Zm9ybS8lcy8iICUgc2VsZi5fcGxhdGZvcm0KKyAgICAgICAg
ZXh0ZW5zaW9uID0gb3MucGF0aC5zcGxpdGV4dChmaWxlLm5hbWUoKSlbMV0KKyAgICAgICAgcGF0
aCA9ICclcy8lcycgJSAocGF0aCwgcGxhdGZvcm1fY29tcG9uZW50KQorICAgICAgICBmaWxlbmFt
ZSA9IHNlbGYubmFtZSgpICsgJy1leHBlY3RlZCcgKyBleHRlbnNpb24KKyAgICAgICAgZmlsZS5z
YXZlX3RvKHBhdGgsIGZpbGVuYW1lKQorCisgICAgZGVmIGluc3RhbGwoc2VsZiwgcGF0aCk6Cisg
ICAgICAgIGZvciBmaWxlIGluIHNlbGYuX2ZpbGVzOgorICAgICAgICAgICAgc2VsZi5faW5zdGFs
bF9maWxlKGZpbGUsIHBhdGgpCisKKyAgICBkZWYgZGVsZXRlKHNlbGYpOgorICAgICAgICBmb3Ig
ZmlsZSBpbiBzZWxmLl9maWxlczoKKyAgICAgICAgICAgIGZpbGUuZGVsZXRlKCkKKworCitjbGFz
cyBUZXh0UmVzdWx0KFJlc3VsdCk6CisgICAgIiIiUmVwcmVzZW50cyBhIHRleHQgcmVzdWx0IG9m
IGEgc2luZ2xlIHRlc3Qgb24gYSBzaW5nbGUgcGxhdGZvcm0iIiIKKyAgICBkZWYgX19pbml0X18o
c2VsZiwgcGxhdGZvcm0sIHRleHRfZmlsZSk6CisgICAgICAgIHNlbGYuX3RleHRfZmlsZSA9IHRl
eHRfZmlsZQorICAgICAgICBSZXN1bHQuX19pbml0X18oc2VsZiwgcGxhdGZvcm0sICd0ZXh0Jywg
W3RleHRfZmlsZV0pCisKKyAgICBkZWYgcmV0YXJnZXQoc2VsZiwgcGxhdGZvcm0pOgorICAgICAg
ICByZXR1cm4gVGV4dFJlc3VsdChwbGF0Zm9ybSwgc2VsZi5fdGV4dF9maWxlKQorCisKK2NsYXNz
IEltYWdlUmVzdWx0KFJlc3VsdCk6CisgICAgaW1hZ2VfZGlmZmVyID0gTmFpdmVJbWFnZURpZmZl
cigpCisgICAgIiIiUmVwcmVzZW50cyBhbiBpbWFnZSByZXN1bHQgb2YgYSBzaW5nbGUgdGVzdCBv
biBhIHNpbmdsZSBwbGF0Zm9ybSIiIgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBwbGF0Zm9ybSwg
aW1hZ2VfZmlsZSwgY2hlY2tzdW1fZmlsZSk6CisgICAgICAgIHNlbGYuX2NoZWNrc3VtX2ZpbGUg
PSBjaGVja3N1bV9maWxlCisgICAgICAgIHNlbGYuX2ltYWdlX2ZpbGUgPSBpbWFnZV9maWxlCisg
ICAgICAgIGZpbGVzID0gZmlsdGVyKGJvb2wsIFtzZWxmLl9jaGVja3N1bV9maWxlLCBzZWxmLl9p
bWFnZV9maWxlXSkKKyAgICAgICAgUmVzdWx0Ll9faW5pdF9fKHNlbGYsIHBsYXRmb3JtLCAnaW1h
Z2UnLCBmaWxlcykKKworICAgIGRlZiBoYXNfY2hlY2tzdW0oc2VsZik6CisgICAgICAgIHJldHVy
biBzZWxmLl9jaGVja3N1bV9maWxlIGlzIG5vdCBOb25lCisKKyAgICBkZWYgc2FtZV9jb250ZW50
KHNlbGYsIG90aGVyKToKKyAgICAgICAgaWYgc2VsZi5oYXNfY2hlY2tzdW0oKSBhbmQgb3RoZXIu
aGFzX2NoZWNrc3VtKCk6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5fY2hlY2tzdW1fZmlsZS5j
b250ZW50cygpID09IG90aGVyLl9jaGVja3N1bV9maWxlLmNvbnRlbnRzKCkKKyAgICAgICAgZWxz
ZToKKyAgICAgICAgICAgIHNlbGZfY29udGVudHMgPSBzZWxmLl9pbWFnZV9maWxlLmNvbnRlbnRz
KCkKKyAgICAgICAgICAgIG90aGVyX2NvbnRlbnRzID0gb3RoZXIuX2ltYWdlX2ZpbGUuY29udGVu
dHMoKQorICAgICAgICAgICAgcmV0dXJuIEltYWdlUmVzdWx0LmltYWdlX2RpZmZlci5zYW1lX2lt
YWdlKHNlbGZfY29udGVudHMsIG90aGVyX2NvbnRlbnRzKQorCisgICAgZGVmIHJldGFyZ2V0KHNl
bGYsIHBsYXRmb3JtKToKKyAgICAgICAgcmV0dXJuIEltYWdlUmVzdWx0KHBsYXRmb3JtLCBzZWxm
Ll9pbWFnZV9maWxlLCBzZWxmLl9jaGVja3N1bV9maWxlKQpkaWZmIC0tZ2l0IGEvV2ViS2l0VG9v
bHMvU2NyaXB0cy93ZWJraXRweS9jb21tb24vbmV0L3Jlc3VsdF91bml0dGVzdC5weSBiL1dlYktp
dFRvb2xzL1NjcmlwdHMvd2Via2l0cHkvY29tbW9uL25ldC9yZXN1bHRfdW5pdHRlc3QucHkKbmV3
IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMC4uZWRkZGQ4MmQ0MWI0M2VmNWUzMTYxZTkxNTk1ZmRkOWE4OTA3ZWU2MAotLS0gL2Rl
di9udWxsCisrKyBiL1dlYktpdFRvb2xzL1NjcmlwdHMvd2Via2l0cHkvY29tbW9uL25ldC9yZXN1
bHRfdW5pdHRlc3QucHkKQEAgLTAsMCArMSwxMzMgQEAKKyMhL3Vzci9iaW4vZW52IHB5dGhvbgor
IyBDb3B5cmlnaHQgKEMpIDIwMTAgR29vZ2xlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyMK
KyMgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0
aCBvciB3aXRob3V0CisjIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0
IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworIyBhcmUgbWV0OgorIworIyAxLiAgUmVkaXN0cmli
dXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyMg
ICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlz
Y2xhaW1lci4KKyMgMi4gIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJv
ZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisjICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25k
aXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisjICAgICBkb2N1bWVu
dGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0
aW9uLgorIworIyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIEFORCBJVFMgQ09O
VFJJQlVUT1JTICJBUyBJUyIgQU5EIEFOWQorIyBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElF
UywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVECisjIFdBUlJBTlRJ
RVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9T
RSBBUkUKKyMgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgT1IgSVRTIENPTlRS
SUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWQorIyBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFM
LCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUworIyAoSU5DTFVE
SU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMg
T1IgU0VSVklDRVM7CisjIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVT
UyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAorIyBPTiBBTlkgVEhFT1JZIE9GIExJ
QUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAor
IyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkg
T1VUIE9GIFRIRSBVU0UgT0YKKyMgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRI
RSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworaW1wb3J0IHJlCitpbXBvcnQgcmVzdWx0
CitpbXBvcnQgdW5pdHRlc3QKKworCitjbGFzcyBGYWtlRmlsZShvYmplY3QpOgorICAgIGRlZiBf
X2luaXRfXyhzZWxmLCBmaWxlbmFtZSwgY29udGVudHM9ImZha2UgY29udGVudHMiKToKKyAgICAg
ICAgc2VsZi5fZmlsZW5hbWUgPSBmaWxlbmFtZQorICAgICAgICBzZWxmLl9jb250ZW50cyA9IGNv
bnRlbnRzCisKKyAgICBkZWYgbmFtZShzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX2ZpbGVu
YW1lCisKKyAgICBkZWYgY29udGVudHMoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLl9jb250
ZW50cworCisKK2NsYXNzIEZha2VSZXN1bHQocmVzdWx0LlJlc3VsdCk6CisgICAgZGVmIF9faW5p
dF9fKHNlbGYsIHBsYXRmb3JtLCByZXN1bHRfdHlwZSwgY29udGVudHMsIGlzX2V4cGVjdGVkPUZh
bHNlKToKKyAgICAgICAgc2VsZi5fcmVzdWx0X3R5cGUgPSByZXN1bHRfdHlwZQorICAgICAgICBz
ZWxmLl9jb250ZW50cyA9IGNvbnRlbnRzCisgICAgICAgIHNlbGYuX2lzX2V4cGVjdGVkID0gaXNf
ZXhwZWN0ZWQKKyAgICAgICAgYWN0dWFsID0gJ2FjdHVhbCcKKyAgICAgICAgaWYgaXNfZXhwZWN0
ZWQ6CisgICAgICAgICAgICBhY3R1YWwgPSAnZXhwZWN0ZWQnCisgICAgICAgIHRlc3RfbmFtZSA9
ICdhbm9ueW1vdXMtdGVzdC0lcy50eHQnICUgYWN0dWFsCisgICAgICAgIGZpbGUgPSBGYWtlRmls
ZSh0ZXN0X25hbWUsIGNvbnRlbnRzKQorICAgICAgICBzdXBlcihGYWtlUmVzdWx0LCBzZWxmKS5f
X2luaXRfXyhwbGF0Zm9ybSwgcmVzdWx0X3R5cGUsIFtmaWxlXSkKKworICAgIGRlZiBjb250ZW50
cyhzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX2NvbnRlbnRzCisKKyAgICBkZWYgcmV0YXJn
ZXQoc2VsZiwgcGxhdGZvcm0pOgorICAgICAgICByZXR1cm4gRmFrZVJlc3VsdChwbGF0Zm9ybSwg
c2VsZi5fcmVzdWx0X3R5cGUsIHNlbGYuX2NvbnRlbnRzLCBzZWxmLl9pc19leHBlY3RlZCkKKwor
CitjbGFzcyBSZXN1bHRUZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICBkZWYgX2NoZWNrX25h
bWUoc2VsZiwgZmlsZW5hbWUsIGV4cGVjdGVkX3Rlc3RfbmFtZSk6CisgICAgICAgIHIgPSByZXN1
bHQuVGV4dFJlc3VsdChOb25lLCBGYWtlRmlsZShmaWxlbmFtZSkpCisgICAgICAgIHNlbGYuYXNz
ZXJ0RXF1YWxzKGV4cGVjdGVkX3Rlc3RfbmFtZSwgci5uYW1lKCkpCisKKyAgICBkZWYgX2NoZWNr
X3BsYXRmb3JtKHNlbGYsIGZpbGVuYW1lLCBleHBlY3RlZF9wbGF0Zm9ybSk6CisgICAgICAgIHIg
PSByZXN1bHQuVGV4dFJlc3VsdChOb25lLCBGYWtlRmlsZShmaWxlbmFtZSkpCisgICAgICAgIHNl
bGYuYXNzZXJ0RXF1YWxzKGV4cGVjdGVkX3BsYXRmb3JtLCByLnBsYXRmb3JtKCkpCisKKyAgICBk
ZWYgdGVzdEV4dHJhY3RzTmFtZUNvcnJlY3RseShzZWxmKToKKyAgICAgICAgc2VsZi5fY2hlY2tf
bmFtZSgnTGF5b3V0VGVzdHMvZmFzdC9kb20vYS1leHBlY3RlZC50eHQnLCAnZmFzdC9kb20vYScp
CisgICAgICAgIHNlbGYuX2NoZWNrX25hbWUoJ0xheW91dFRlc3RzL2Zhc3QvZG9tL2EtYWN0dWFs
LnR4dCcsICdmYXN0L2RvbS9hJykKKyAgICAgICAgc2VsZi5fY2hlY2tfbmFtZSgnTGF5b3V0VGVz
dHMvcGxhdGZvcm0vd2luL2Zhc3QvYS1leHBlY3RlZC50eHQnLCAnZmFzdC9hJykKKyAgICAgICAg
c2VsZi5fY2hlY2tfbmFtZSgnTGF5b3V0VGVzdHMvcGxhdGZvcm0vd2luL2Zhc3QvYS1leHBlY3Rl
ZC5jaGVja3N1bScsICdmYXN0L2EnKQorICAgICAgICBzZWxmLl9jaGVja19uYW1lKCdmYXN0L2Rv
bS90ZXN0LWV4cGVjdGVkLnR4dCcsICdmYXN0L2RvbS90ZXN0JykKKyAgICAgICAgc2VsZi5fY2hl
Y2tfbmFtZSgnbGF5b3V0LXRlc3QtcmVzdWx0cy9mYXN0L2EtYWN0dWFsLmNoZWNrc3VtJywgJ2Zh
c3QvYScpCisKKyAgICBkZWYgdGVzdEV4dHJhY3RzUGxhdGZvcm1Db3JyZWN0bHkoc2VsZik6Cisg
ICAgICAgIHNlbGYuX2NoZWNrX3BsYXRmb3JtKCdMYXlvdXRUZXN0cy9wbGF0Zm9ybS93aW4vZmFz
dC9hLWV4cGVjdGVkLnR4dCcsICd3aW4nKQorICAgICAgICBzZWxmLl9jaGVja19wbGF0Zm9ybSgn
cGxhdGZvcm0vd2luL2Zhc3QvYS1leHBlY3RlZC50eHQnLCAnd2luJykKKyAgICAgICAgc2VsZi5f
Y2hlY2tfcGxhdGZvcm0oJ3BsYXRmb3JtL21hYy9mYXN0L2EtZXhwZWN0ZWQudHh0JywgJ21hYycp
CisgICAgICAgIHNlbGYuX2NoZWNrX3BsYXRmb3JtKCdmYXN0L2EtZXhwZWN0ZWQudHh0JywgTm9u
ZSkKKworICAgIGRlZiB0ZXN0UmVzdWx0c0Zyb21BbkFjdHVhbEZpbGVBcmVNYXJrZWRBc1N1Y2go
c2VsZik6CisgICAgICAgIHIgPSByZXN1bHQuVGV4dFJlc3VsdChOb25lLCBGYWtlRmlsZSgndGVz
dC1hY3R1YWwudHh0JykpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShyLmlzX2FjdHVhbCgpKQor
CisgICAgZGVmIHRlc3RSZXN1bHRzRnJvbUFuRXhwZWN0ZWRGaWxlQXJlTm90QWN0dWFsKHNlbGYp
OgorICAgICAgICByID0gcmVzdWx0LlRleHRSZXN1bHQoTm9uZSwgRmFrZUZpbGUoJ3Rlc3QtZXhw
ZWN0ZWQudHh0JykpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2Uoci5pc19hY3R1YWwoKSkKKwor
ICAgIGRlZiB0ZXN0SXNSZWJhc2VsaW5lT2Yoc2VsZik6CisgICAgICAgIGV4cGVjdGVkID0gcmVz
dWx0LlRleHRSZXN1bHQoJ21hYycsIEZha2VGaWxlKCd0ZXN0LWV4cGVjdGVkLnR4dCcpKQorICAg
ICAgICBhY3R1YWwgPSByZXN1bHQuVGV4dFJlc3VsdCgnbWFjJywgRmFrZUZpbGUoJ3Rlc3QtYWN0
dWFsLnR4dCcpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoYWN0dWFsLmlzX3JlYmFzZWxpbmVf
b2YoZXhwZWN0ZWQpKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKGV4cGVjdGVkLmlzX3JlYmFz
ZWxpbmVfb2YoYWN0dWFsKSkKKworICAgIGRlZiB0ZXN0X19lcV9fKHNlbGYpOgorICAgICAgICBy
MSA9IHJlc3VsdC5UZXh0UmVzdWx0KCdtYWMnLCBGYWtlRmlsZSgndGVzdC1leHBlY3RlZC50eHQn
LCAnY29udGVudHMnKSkKKyAgICAgICAgcjIgPSByZXN1bHQuVGV4dFJlc3VsdCgnbWFjJywgRmFr
ZUZpbGUoJ3Rlc3QtZXhwZWN0ZWQudHh0JywgJ2NvbnRlbnRzJykpCisgICAgICAgIHIzID0gcmVz
dWx0LlRleHRSZXN1bHQoJ3dpbicsIEZha2VGaWxlKCd0ZXN0LWV4cGVjdGVkLnR4dCcsICdjb250
ZW50cycpKQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKHIxLCByMikKKyAgICAgICAgc2Vs
Zi5hc3NlcnRFcXVhbHMocjEsIHIyLnJldGFyZ2V0KCdtYWMnKSkKKyAgICAgICAgc2VsZi5hc3Nl
cnROb3RFcXVhbHMocjEsIHIyLnJldGFyZ2V0KCd3aW4nKSkKKworICAgIGRlZiB0ZXN0X19oYXNo
X18oc2VsZik6CisgICAgICAgIHIxID0gcmVzdWx0LlRleHRSZXN1bHQoJ21hYycsIEZha2VGaWxl
KCd0ZXN0LWV4cGVjdGVkLnR4dCcsICdjb250ZW50cycpKQorICAgICAgICByMiA9IHJlc3VsdC5U
ZXh0UmVzdWx0KCdtYWMnLCBGYWtlRmlsZSgndGVzdC1leHBlY3RlZC50eHQnLCAnY29udGVudHMn
KSkKKyAgICAgICAgcjMgPSByZXN1bHQuVGV4dFJlc3VsdChOb25lLCBGYWtlRmlsZSgndGVzdC1l
eHBlY3RlZC50eHQnLCBOb25lKSkKKworICAgICAgICB4ID0gc2V0KFtyMSwgcjJdKQorICAgICAg
ICBzZWxmLmFzc2VydEVxdWFscygxLCBsZW4oc2V0KFtyMSwgcjJdKSkpCisgICAgICAgIHNlbGYu
YXNzZXJ0RXF1YWxzKDIsIGxlbihzZXQoW3IxLCByMiwgcjNdKSkpCisKKyAgICBkZWYgdGVzdElt
YWdlRGlmZklzSW52b2tlZEZvckltYWdlUmVzdWx0c1dpdGhvdXRDaGVja3N1bShzZWxmKToKKyAg
ICAgICAgcjEgPSByZXN1bHQuSW1hZ2VSZXN1bHQoJ21hYycsIEZha2VGaWxlKCd0ZXN0LWV4cGVj
dGVkLnBuZycsICdhc2RmJyksIEZha2VGaWxlKCd0ZXN0LWV4cGVjdGVkLmNoZWNrc3VtJywgJ2No
ZWNrJykpCisgICAgICAgIHIyID0gcmVzdWx0LkltYWdlUmVzdWx0KCdtYWMnLCBGYWtlRmlsZSgn
dGVzdC1leHBlY3RlZC5wbmcnLCAnYXNkZicpLCBOb25lKQorCisgICAgICAgICMgRGVmYXVsdCBi
ZWhhdmlvdXIgaXMgdG8ganVzdCBjb21wYXJlIG9uIGltYWdlIGNvbnRlbnRzLgorICAgICAgICBz
ZWxmLmFzc2VydFRydWUocjEuc2FtZV9jb250ZW50KHIyKSkKKworICAgICAgICBjbGFzcyBBbGxJ
bWFnZXNBcmVEaWZmZXJlbnQob2JqZWN0KToKKyAgICAgICAgICAgIGRlZiBzYW1lX2ltYWdlKHNl
bGYsIGltYWdlMSwgaW1hZ2UyKToKKyAgICAgICAgICAgICAgICByZXR1cm4gRmFsc2UKKworICAg
ICAgICAjIEJ1dCB3ZSBjYW4gaW5zdGFsbCBvdGhlciBpbWFnZSBkaWZmZXJzLgorICAgICAgICBy
ZXN1bHQuSW1hZ2VSZXN1bHQuaW1hZ2VfZGlmZmVyID0gQWxsSW1hZ2VzQXJlRGlmZmVyZW50KCkK
KworICAgICAgICBzZWxmLmFzc2VydEZhbHNlKHIxLnNhbWVfY29udGVudChyMikpCisKK2lmIF9f
bmFtZV9fID09ICJfX21haW5fXyI6CisgICAgdW5pdHRlc3QubWFpbigpCmRpZmYgLS1naXQgYS9X
ZWJLaXRUb29scy9TY3JpcHRzL3dlYmtpdHB5L2NvbW1vbi9uZXQvcmVzdWx0c2V0LnB5IGIvV2Vi
S2l0VG9vbHMvU2NyaXB0cy93ZWJraXRweS9jb21tb24vbmV0L3Jlc3VsdHNldC5weQpuZXcgZmls
ZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwLi5lYjliODk4YzMzZjE0YTI4MDM2MTVlNjI1NTE2YjBlYWRhMDMyZTNjCi0tLSAvZGV2L251
bGwKKysrIGIvV2ViS2l0VG9vbHMvU2NyaXB0cy93ZWJraXRweS9jb21tb24vbmV0L3Jlc3VsdHNl
dC5weQpAQCAtMCwwICsxLDEyNCBAQAorIyEvdXNyL2Jpbi9lbnYgcHl0aG9uCisjIENvcHlyaWdo
dCAoQykgMjAxMCBHb29nbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorIworIyBSZWRpc3Ry
aWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhv
dXQKKyMgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxv
d2luZyBjb25kaXRpb25zCisjIGFyZSBtZXQ6CisjCisjIDEuICBSZWRpc3RyaWJ1dGlvbnMgb2Yg
c291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorIyAgICAgbm90aWNl
LCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgor
IyAyLiAgUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBh
Ym92ZSBjb3B5cmlnaHQKKyMgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5k
IHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyMgICAgIGRvY3VtZW50YXRpb24gYW5k
L29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisjCisj
IFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgQU5EIElUUyBDT05UUklCVVRPUlMg
IkFTIElTIiBBTkQgQU5ZCisjIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJ
TkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQKKyMgV0FSUkFOVElFUyBPRiBNRVJD
SEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQorIyBE
SVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBPUiBJVFMgQ09OVFJJQlVUT1JTIEJF
IExJQUJMRSBGT1IgQU5ZCisjIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUws
IEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCisjIChJTkNMVURJTkcsIEJVVCBO
T1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNF
UzsKKyMgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQ
VElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECisjIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBX
SEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisjIChJTkNMVURJ
TkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhF
IFVTRSBPRgorIyBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklM
SVRZIE9GIFNVQ0ggREFNQUdFLgorCitmcm9tIHdlYmtpdHB5LmNvbW1vbi5kaXJhc3ppcCBpbXBv
cnQgRGlyZWN0b3J5QXNaaXAKK2Zyb20gd2Via2l0cHkuY29tbW9uLm5ldC5yZW1vdGV6aXAgaW1w
b3J0IFJlbW90ZVppcAoraW1wb3J0IHJlCitpbXBvcnQgcmVzdWx0CitpbXBvcnQgdXJsbGliCisK
KworY2xhc3MgUmVzdWx0U2V0KG9iamVjdCk6CisgICAgIiIiUmV0cmlldmVzIHJlc3VsdHMgZnJv
bSB6aXAgZmlsZXMiIiIKKyAgICBkZWYgX19pbml0X18oc2VsZiwgbmFtZSwgcGxhdGZvcm0sIHpp
cF9maWxlLCAqKmt3YXJncyk6CisgICAgICAgIHNlbGYuX25hbWUgPSBuYW1lCisgICAgICAgIHNl
bGYuX3BsYXRmb3JtID0gcGxhdGZvcm0KKyAgICAgICAgc2VsZi5femlwX2ZpbGUgPSB6aXBfZmls
ZQorICAgICAgICBzZWxmLl9pbmNsdWRlX2V4cGVjdGVkID0ga3dhcmdzLmdldCgnaW5jbHVkZV9l
eHBlY3RlZCcsIFRydWUpCisKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgZnJvbV96aXBfdXJs
KGNscywgcGxhdGZvcm0sIHppcF9wYXRoKToKKyAgICAgICAgcmV0dXJuIFJlc3VsdFNldCgnbG9j
YWwgemlwICVzIGJ1aWxkZXInICUgcGxhdGZvcm0sIHBsYXRmb3JtLCBSZW1vdGVaaXAoemlwX3Bh
dGgpKQorCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIGZyb21femlwKGNscywgcGxhdGZvcm0s
IHppcCk6CisgICAgICAgIHJldHVybiBSZXN1bHRTZXQoJ2xvY2FsIHppcCAlcyBidWlsZGVyJyAl
IHBsYXRmb3JtLCBwbGF0Zm9ybSwgemlwKQorCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIGZy
b21fcGF0aChzZWxmLCBwYXRoLCBwbGF0Zm9ybT1Ob25lKToKKyAgICAgICAgeiA9IERpcmVjdG9y
eUFzWmlwKHBhdGgpCisgICAgICAgIHJldHVybiBSZXN1bHRTZXQoJ2xvY2FsICVzIGJ1aWxkZXIn
ICUgcGxhdGZvcm0sIHBsYXRmb3JtLCB6KQorCisgICAgZGVmIG5hbWUoc2VsZik6CisgICAgICAg
IHJldHVybiBzZWxmLl9uYW1lCisKKyAgICBkZWYgc2V0X3BsYXRmb3JtKHNlbGYsIHBsYXRmb3Jt
KToKKyAgICAgICAgc2VsZi5fcGxhdGZvcm0gPSBwbGF0Zm9ybQorCisgICAgZGVmIGZpbGVzKHNl
bGYpOgorICAgICAgICBmaWxlcyA9IFtdCisgICAgICAgIGZvciBmaWxlbmFtZSBpbiBzZWxmLl96
aXBfZmlsZS5uYW1lbGlzdCgpOgorICAgICAgICAgICAgZmlsZXMuYXBwZW5kKHNlbGYuX3ppcF9m
aWxlLmhhbmRsZV90byhmaWxlbmFtZSkpCisgICAgICAgIHJldHVybiBmaWxlcworCisgICAgZGVm
IHJlc3VsdHNfZm9yKHNlbGYsIG5hbWUsICoqa3dhcmdzKToKKyAgICAgICAgdGFyZ2V0X3R5cGUg
PSBrd2FyZ3MuZ2V0KCd0YXJnZXRfdHlwZScsIE5vbmUpCisgICAgICAgIGV4YWN0X21hdGNoID0g
a3dhcmdzLmdldCgnZXhhY3RfbWF0Y2gnLCBGYWxzZSkKKyAgICAgICAgaWYgcmUuc2VhcmNoKHIn
XC54P2h0bWwnLCBuYW1lKToKKyAgICAgICAgICAgIG5hbWUgPSBuYW1lWzpuYW1lLnJpbmRleCgn
LicpXQorICAgICAgICBuYW1lX21hdGNoZXIgPSByZS5jb21waWxlKG5hbWUpCisgICAgICAgIGFj
dHVhbF9tYXRjaGVyID0gcmUuY29tcGlsZShyJy1hY3R1YWxcLicpCisgICAgICAgIGV4cGVjdGVk
X21hdGNoZXIgPSByZS5jb21waWxlKHInLWV4cGVjdGVkXC4nKQorCisgICAgICAgIGNoZWNrc3Vt
X2ZpbGVzID0gW10KKyAgICAgICAgdGV4dF9maWxlcyA9IFtdCisgICAgICAgIGltYWdlX2ZpbGVz
ID0gW10KKyAgICAgICAgZm9yIHJlc3VsdF9maWxlIGluIHNlbGYuZmlsZXMoKToKKyAgICAgICAg
ICAgIG5hbWVfbWF0Y2ggPSBuYW1lX21hdGNoZXIuc2VhcmNoKHJlc3VsdF9maWxlLm5hbWUoKSkK
KyAgICAgICAgICAgIGFjdHVhbF9tYXRjaCA9IGFjdHVhbF9tYXRjaGVyLnNlYXJjaChyZXN1bHRf
ZmlsZS5uYW1lKCkpCisgICAgICAgICAgICBleHBlY3RlZF9tYXRjaCA9IGV4cGVjdGVkX21hdGNo
ZXIuc2VhcmNoKHJlc3VsdF9maWxlLm5hbWUoKSkKKyAgICAgICAgICAgIGlmIG5hbWVfbWF0Y2gg
YW5kIChhY3R1YWxfbWF0Y2ggb3IgKHNlbGYuX2luY2x1ZGVfZXhwZWN0ZWQgYW5kIGV4cGVjdGVk
X21hdGNoKSk6CisgICAgICAgICAgICAgICAgaWYgcmVzdWx0X2ZpbGUubmFtZSgpLmVuZHN3aXRo
KCcuY2hlY2tzdW0nKToKKyAgICAgICAgICAgICAgICAgICAgY2hlY2tzdW1fZmlsZXMuYXBwZW5k
KHJlc3VsdF9maWxlKQorICAgICAgICAgICAgICAgIGVsaWYgcmVzdWx0X2ZpbGUubmFtZSgpLmVu
ZHN3aXRoKCcudHh0Jyk6CisgICAgICAgICAgICAgICAgICAgIHRleHRfZmlsZXMuYXBwZW5kKHJl
c3VsdF9maWxlKQorICAgICAgICAgICAgICAgIGVsaWYgcmVzdWx0X2ZpbGUubmFtZSgpLmVuZHN3
aXRoKCcucG5nJyk6CisgICAgICAgICAgICAgICAgICAgIGltYWdlX2ZpbGVzLmFwcGVuZChyZXN1
bHRfZmlsZSkKKworICAgICAgICByZXN1bHRzID0gW10KKyAgICAgICAgZm9yIGltYWdlX2ZpbGUg
aW4gaW1hZ2VfZmlsZXM6CisgICAgICAgICAgICBjaGVja3N1bV9maWxlX25hbWUgPSByZS5zdWIo
cmUuY29tcGlsZSgnXC5wbmcnKSwgJy5jaGVja3N1bScsIGltYWdlX2ZpbGUubmFtZSgpKQorICAg
ICAgICAgICAgZm91bmRfY2hlY2tzdW0gPSBGYWxzZQorICAgICAgICAgICAgZm9yIGNoZWNrc3Vt
X2ZpbGUgaW4gY2hlY2tzdW1fZmlsZXM6CisgICAgICAgICAgICAgICAgaWYgY2hlY2tzdW1fZmls
ZS5uYW1lKCkgPT0gY2hlY2tzdW1fZmlsZV9uYW1lOgorICAgICAgICAgICAgICAgICAgICBmb3Vu
ZF9jaGVja3N1bSA9IFRydWUKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0cy5hcHBlbmQocmVz
dWx0LkltYWdlUmVzdWx0KHNlbGYuX3BsYXRmb3JtLCBpbWFnZV9maWxlLCBjaGVja3N1bV9maWxl
KSkKKyAgICAgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgIGlmIG5vdCBmb3VuZF9j
aGVja3N1bToKKyAgICAgICAgICAgICAgICAjIHByaW50ICJDb3VsZG4ndCBmaW5kIGNoZWNrc3Vt
IGZvciBpbWFnZSAnJXMnIiAlIGltYWdlX2ZpbGUubmFtZSgpCisgICAgICAgICAgICAgICAgcmVz
dWx0cy5hcHBlbmQocmVzdWx0LkltYWdlUmVzdWx0KHNlbGYuX3BsYXRmb3JtLCBpbWFnZV9maWxl
LCBOb25lKSkKKworICAgICAgICBmb3IgdGV4dF9maWxlIGluIHRleHRfZmlsZXM6CisgICAgICAg
ICAgICByZXN1bHRzLmFwcGVuZChyZXN1bHQuVGV4dFJlc3VsdChzZWxmLl9wbGF0Zm9ybSwgdGV4
dF9maWxlKSkKKworICAgICAgICBpZiBleGFjdF9tYXRjaDoKKyAgICAgICAgICAgIHJlc3VsdHMg
PSBmaWx0ZXIobGFtYmRhIHI6IHIubmFtZSgpID09IG5hbWUsIHJlc3VsdHMpCisKKyAgICAgICAg
cmVzdWx0cyA9IGZpbHRlcihsYW1iZGEgcjogdGFyZ2V0X3R5cGUgaXMgTm9uZSBvciB0YXJnZXRf
dHlwZSA9PSByLnR5cGUoKSwgcmVzdWx0cykKKyAgICAgICAgcmV0dXJuIHJlc3VsdHMKKworCitj
bGFzcyBBZ2dyZWdhdGVSZXN1bHRTZXQob2JqZWN0KToKKyAgICAiIiJDb2xsZWN0cyByZXN1bHRz
IGZyb20gYSBsaXN0IG9mIGJ1aWxkZXJzIiIiCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGJ1aWxk
ZXJzKToKKyAgICAgICAgc2VsZi5fYnVpbGRlcnMgPSBidWlsZGVycworCisgICAgZGVmIHJlc3Vs
dHNfZm9yKHNlbGYsIG5hbWUsICoqa3dhcmdzKToKKyAgICAgICAgcmVzdWx0cyA9IFtdCisgICAg
ICAgIGZvciBidWlsZGVyIGluIHNlbGYuX2J1aWxkZXJzOgorICAgICAgICAgICAgcmVzdWx0cyAr
PSBidWlsZGVyLnJlc3VsdHNfZm9yKG5hbWUsICoqa3dhcmdzKQorICAgICAgICByZXR1cm4gcmVz
dWx0cworCisgICAgZGVmIHN1Yl9idWlsZGVycyhzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYu
X2J1aWxkZXJzCmRpZmYgLS1naXQgYS9XZWJLaXRUb29scy9TY3JpcHRzL3dlYmtpdHB5L2NvbW1v
bi9uZXQvcmVzdWx0c2V0X3VuaXR0ZXN0LnB5IGIvV2ViS2l0VG9vbHMvU2NyaXB0cy93ZWJraXRw
eS9jb21tb24vbmV0L3Jlc3VsdHNldF91bml0dGVzdC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NApp
bmRleCAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwLi40MjVkNjg0ODQx
ODIxYTAxOTAyYjU3MWQ2ZTRhNGU0YWM3NGIzZjczCi0tLSAvZGV2L251bGwKKysrIGIvV2ViS2l0
VG9vbHMvU2NyaXB0cy93ZWJraXRweS9jb21tb24vbmV0L3Jlc3VsdHNldF91bml0dGVzdC5weQpA
QCAtMCwwICsxLDE1MiBAQAorIyEvdXNyL2Jpbi9lbnYgcHl0aG9uCisjIENvcHlyaWdodCAoQykg
MjAxMCBHb29nbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorIworIyBSZWRpc3RyaWJ1dGlv
biBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyMg
bW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBj
b25kaXRpb25zCisjIGFyZSBtZXQ6CisjCisjIDEuICBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNl
IGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorIyAgICAgbm90aWNlLCB0aGlz
IGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorIyAyLiAg
UmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBj
b3B5cmlnaHQKKyMgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBm
b2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyMgICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90
aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisjCisjIFRISVMg
U09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgQU5EIElUUyBDT05UUklCVVRPUlMgIkFTIElT
IiBBTkQgQU5ZCisjIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJV
VCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQKKyMgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFC
SUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQorIyBESVNDTEFJ
TUVELiBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBPUiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJM
RSBGT1IgQU5ZCisjIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1Q
TEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCisjIChJTkNMVURJTkcsIEJVVCBOT1QgTElN
SVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyMg
TE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikg
SE9XRVZFUiBDQVVTRUQgQU5ECisjIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVS
IElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisjIChJTkNMVURJTkcgTkVH
TElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBP
RgorIyBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9G
IFNVQ0ggREFNQUdFLgorCitmcm9tIHdlYmtpdHB5LmNvbW1vbi5uZXQucmVtb3RlemlwIGltcG9y
dCBaaXBGaWxlSGFuZGxlCitpbXBvcnQgcmVzdWx0c2V0CitpbXBvcnQgdW5pdHRlc3QKKworCitj
bGFzcyBGYWtlWmlwKG9iamVjdCk6CisgICAgZGVmIF9faW5pdF9fKHNlbGYpOgorICAgICAgICBz
ZWxmLl9maWxlcyA9IHt9CisKKyAgICBkZWYgX19zdHJfXyhzZWxmKToKKyAgICAgICAgcmV0dXJu
ICJGYWtlWmlwIgorCisgICAgZGVmIGluc2VydChzZWxmLCBmaWxlbmFtZSwgY29udGVudCk6Cisg
ICAgICAgIHNlbGYuX2ZpbGVzW2ZpbGVuYW1lXSA9IGNvbnRlbnQKKworICAgIGRlZiBuYW1lbGlz
dChzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX2ZpbGVzLmtleXMoKQorCisgICAgZGVmIGhh
bmRsZV90byhzZWxmLCBmaWxlbmFtZSk6CisgICAgICAgIHJldHVybiBaaXBGaWxlSGFuZGxlKHNl
bGYsIGZpbGVuYW1lKQorCisgICAgZGVmIHJlYWQoc2VsZiwgZmlsZW5hbWUpOgorICAgICAgICBy
ZXR1cm4gc2VsZi5fZmlsZXNbZmlsZW5hbWVdCisKKyAgICBkZWYgZXh0cmFjdChzZWxmLCBmaWxl
bmFtZSwgcGF0aCk6CisgICAgICAgIHByaW50ICJGYWtlWmlwPiBjcCAlcyAlcyIgJSAoZmlsZW5h
bWUsIHBhdGgpCisKKyAgICBkZWYgZGVsZXRlKHNlbGYsIGZpbGVuYW1lKToKKyAgICAgICAgcHJp
bnQgIkZha2VaaXA+IHJtICVzIiAlIGZpbGVuYW1lCisgICAgICAgIHNlbGYuX2ZpbGVzW2ZpbGVu
YW1lXSA9IE5vbmUKKworCitjbGFzcyBSZXN1bHRTZXRUZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToK
KyAgICBkZWYgX3Jlc3VsdHNldF93aXRoX3ppcChzZWxmLCB6aXAsICoqa3dhcmdzKToKKyAgICAg
ICAgcmV0dXJuIHJlc3VsdHNldC5SZXN1bHRTZXQoJzxmYWtlLXJlc3VsdHNldD4nLCAnPGZha2Ut
cGxhdGZvcm0+JywgemlwLCAqKmt3YXJncykKKworICAgIGRlZiB0ZXN0VGV4dEZpbGVzR2V0SW50
ZXJwcmV0ZWRBc1RleHRSZXN1bHRzKHNlbGYpOgorICAgICAgICB6aXAgPSBGYWtlWmlwKCkKKyAg
ICAgICAgemlwLmluc2VydCgnZmFzdC9kb20vc29tZS10ZXN0LWFjdHVhbC50eHQnLCAnYWN0dWFs
IHJlc3VsdHMnKQorICAgICAgICBiID0gc2VsZi5fcmVzdWx0c2V0X3dpdGhfemlwKHppcCkKKyAg
ICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoMSwgbGVuKGIucmVzdWx0c19mb3IoJ2Zhc3QvZG9tL3Nv
bWUtdGVzdCcpKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoJ2Zhc3QvZG9tL3NvbWUtdGVz
dCcsIGIucmVzdWx0c19mb3IoJ2Zhc3QvZG9tL3NvbWUtdGVzdC5odG1sJylbMF0ubmFtZSgpKQor
CisgICAgZGVmIHRlc3RJbWFnZUFuZENoZWNrc3VtRmlsZXNHZXRJbnRlcnByZXRlZEFzQVNpbmds
ZUltYWdlUmVzdWx0KHNlbGYpOgorICAgICAgICB6aXAgPSBGYWtlWmlwKCkKKyAgICAgICAgemlw
Lmluc2VydCgnZmFzdC9kb20vc29tZS10ZXN0LWFjdHVhbC5jaGVja3N1bScsICdhYmMxMjMnKQor
ICAgICAgICB6aXAuaW5zZXJ0KCdmYXN0L2RvbS9zb21lLXRlc3QtYWN0dWFsLnBuZycsICc8aW1h
Z2UgZGF0YT4nKQorICAgICAgICBiID0gc2VsZi5fcmVzdWx0c2V0X3dpdGhfemlwKHppcCkKKyAg
ICAgICAgcmVzdWx0cyA9IGIucmVzdWx0c19mb3IoJ2Zhc3QvZG9tL3NvbWUtdGVzdCcpCisgICAg
ICAgIHNlbGYuYXNzZXJ0RXF1YWxzKDEsIGxlbihyZXN1bHRzKSkKKyAgICAgICAgcmVzdWx0ID0g
cmVzdWx0c1swXQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscygnaW1hZ2UnLCByZXN1bHQudHlw
ZSgpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscygnYWJjMTIzJywgcmVzdWx0LmNvbnRlbnRz
KCkpCisKKyAgICBkZWYgdGVzdE11bHRpcGxlSW1hZ2VSZXN1bHRzQXJlRGV0ZWN0ZWQoc2VsZik6
CisgICAgICAgIHppcCA9IEZha2VaaXAoKQorICAgICAgICB6aXAuaW5zZXJ0KCdwbGF0Zm9ybS93
aW4vZmFzdC9kb20vc29tZS10ZXN0LWFjdHVhbC5jaGVja3N1bScsICdjaGVja3N1bTEnKQorICAg
ICAgICB6aXAuaW5zZXJ0KCdwbGF0Zm9ybS93aW4vZmFzdC9kb20vc29tZS10ZXN0LWFjdHVhbC5w
bmcnLCAnPGltYWdlIGRhdGEgMT4nKQorICAgICAgICB6aXAuaW5zZXJ0KCdwbGF0Zm9ybS9tYWMv
ZmFzdC9kb20vc29tZS10ZXN0LWFjdHVhbC5jaGVja3N1bScsICdjaGVja3N1bTInKQorICAgICAg
ICB6aXAuaW5zZXJ0KCdwbGF0Zm9ybS9tYWMvZmFzdC9kb20vc29tZS10ZXN0LWFjdHVhbC5wbmcn
LCAnPGltYWdlIGRhdGEgMj4nKQorICAgICAgICBiID0gc2VsZi5fcmVzdWx0c2V0X3dpdGhfemlw
KHppcCkKKyAgICAgICAgcmVzdWx0cyA9IGIucmVzdWx0c19mb3IoJ2Zhc3QvZG9tL3NvbWUtdGVz
dCcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKDIsIGxlbihyZXN1bHRzKSkKKyAgICAgICAg
c2VsZi5hc3NlcnRGYWxzZShyZXN1bHRzWzBdLnNhbWVfY29udGVudChyZXN1bHRzWzFdKSkKKwor
ICAgIGRlZiB0ZXN0QWdncmVnYXRlUmVzdWx0U2V0Q29ycmVjdGx5UmV0cmlldmVzVGVzdHNGcm9t
TXVsdGlwbGVSZXN1bHRTZXRzKHNlbGYpOgorICAgICAgICByZXN1bHRzZXQxX3ppcCA9IEZha2Va
aXAoKQorICAgICAgICByZXN1bHRzZXQxX3ppcC5pbnNlcnQoJ2Zhc3QvZG9tL3Rlc3QtYWN0dWFs
LnR4dCcsICdsaW51eCB0ZXh0IHJlc3VsdCcpCisgICAgICAgIHJlc3VsdHNldDEgPSByZXN1bHRz
ZXQuUmVzdWx0U2V0KCdsaW51eC1yZXN1bHRzZXQnLCAnbGludXgnLCByZXN1bHRzZXQxX3ppcCkK
KyAgICAgICAgcmVzdWx0c2V0Ml96aXAgPSBGYWtlWmlwKCkKKyAgICAgICAgcmVzdWx0c2V0Ml96
aXAuaW5zZXJ0KCdmYXN0L2RvbS90ZXN0LWFjdHVhbC50eHQnLCAnd2luZG93cyB0ZXh0IHJlc3Vs
dCcpCisgICAgICAgIHJlc3VsdHNldDIgPSByZXN1bHRzZXQuUmVzdWx0U2V0KCd3aW4tcmVzdWx0
c2V0JywgJ3dpbicsIHJlc3VsdHNldDJfemlwKQorCisgICAgICAgIGIgPSByZXN1bHRzZXQuQWdn
cmVnYXRlUmVzdWx0U2V0KFtyZXN1bHRzZXQxLCByZXN1bHRzZXQyXSkKKyAgICAgICAgc2VsZi5h
c3NlcnRFcXVhbHMoMiwgbGVuKGIucmVzdWx0c19mb3IoJ2Zhc3QvZG9tL3Rlc3QnKSkpCisKKyAg
ICBkZWYgdGVzdENhbkluZmVyUGxhdGZvcm1Gcm9tUGF0aElmTm9uZVByb3ZpZGVkKHNlbGYpOgor
ICAgICAgICB6aXAgPSBGYWtlWmlwKCkKKyAgICAgICAgemlwLmluc2VydCgncGxhdGZvcm0vd2lu
L3NvbWUtdGVzdC1leHBlY3RlZC5wbmcnLCAnPGltYWdlIGRhdGE+JykKKyAgICAgICAgemlwLmlu
c2VydCgncGxhdGZvcm0vd2luL3NvbWUtdGVzdC1leHBlY3RlZC5jaGVja3N1bScsICdhYmMxMjMn
KQorICAgICAgICBiID0gcmVzdWx0c2V0LlJlc3VsdFNldCgnbG9jYWwgTGF5b3V0VGVzdHMgcmVz
dWx0c2V0JywgTm9uZSwgemlwKQorCisgICAgICAgIHJlc3VsdHMgPSBiLnJlc3VsdHNfZm9yKCdz
b21lLXRlc3QnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscygxLCBsZW4ocmVzdWx0cykpCisg
ICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKCd3aW4nLCByZXN1bHRzWzBdLnBsYXRmb3JtKCkpCisK
KyAgICBkZWYgdGVzdFRlc3RFeHRlbnNpb25Jc0lnbm9yZWQoc2VsZik6CisgICAgICAgIHppcCA9
IEZha2VaaXAoKQorICAgICAgICB6aXAuaW5zZXJ0KCd0ZXN0L3Rlc3QtYS1hY3R1YWwudHh0Jywg
J2FjdHVhbCByZXN1bHRzJykKKyAgICAgICAgYiA9IHNlbGYuX3Jlc3VsdHNldF93aXRoX3ppcCh6
aXApCisgICAgICAgIHJlc3VsdHMgPSBiLnJlc3VsdHNfZm9yKCd0ZXN0L3Rlc3QtYS5odG1sJykK
KyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoMSwgbGVuKHJlc3VsdHMpKQorICAgICAgICBzZWxm
LmFzc2VydEVxdWFscygndGVzdC90ZXN0LWEnLCByZXN1bHRzWzBdLm5hbWUoKSkKKworICAgIGRl
ZiB0ZXN0RXhpc3RpbmdSZXN1bHRzQXJlTWFya2VkQXNTdWNoKHNlbGYpOgorICAgICAgICB6aXAg
PSBGYWtlWmlwKCkKKyAgICAgICAgemlwLmluc2VydCgndGVzdC90ZXN0LWEtZXhwZWN0ZWQudHh0
JywgJ2V4cGVjdGVkIHJlc3VsdHMnKQorICAgICAgICBiID0gc2VsZi5fcmVzdWx0c2V0X3dpdGhf
emlwKHppcCkKKyAgICAgICAgcmVzdWx0cyA9IGIucmVzdWx0c19mb3IoJ3Rlc3QvdGVzdC1hLmh0
bWwnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscygxLCBsZW4ocmVzdWx0cykpCisgICAgICAg
IHNlbGYuYXNzZXJ0RmFsc2UocmVzdWx0c1swXS5pc19hY3R1YWwoKSkKKworICAgIGRlZiB0ZXN0
T25seVJldHVybnNSZXN1bHRzT2ZTcGVjaWZpZWRUeXBlKHNlbGYpOgorICAgICAgICB6aXAgPSBG
YWtlWmlwKCkKKyAgICAgICAgemlwLmluc2VydCgndGVzdC90ZXN0LWEtZXhwZWN0ZWQudHh0Jywg
J2V4cGVjdGVkIHJlc3VsdHMnKQorICAgICAgICB6aXAuaW5zZXJ0KCd0ZXN0L3Rlc3QtYS1leHBl
Y3RlZC5jaGVja3N1bScsICdleHBlY3RlZCByZXN1bHRzJykKKyAgICAgICAgemlwLmluc2VydCgn
dGVzdC90ZXN0LWEtZXhwZWN0ZWQucG5nJywgJ2V4cGVjdGVkIHJlc3VsdHMnKQorICAgICAgICBi
ID0gc2VsZi5fcmVzdWx0c2V0X3dpdGhfemlwKHppcCkKKworICAgICAgICByZXN1bHRzID0gYi5y
ZXN1bHRzX2ZvcigndGVzdC90ZXN0LWEuaHRtbCcpCisgICAgICAgIHRleHRfcmVzdWx0cyA9IGIu
cmVzdWx0c19mb3IoJ3Rlc3QvdGVzdC1hLmh0bWwnLCB0YXJnZXRfdHlwZT0ndGV4dCcpCisgICAg
ICAgIGltYWdlX3Jlc3VsdHMgPSBiLnJlc3VsdHNfZm9yKCd0ZXN0L3Rlc3QtYS5odG1sJywgdGFy
Z2V0X3R5cGU9J2ltYWdlJykKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFscygyLCBsZW4ocmVz
dWx0cykpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKDEsIGxlbih0ZXh0X3Jlc3VsdHMpKQor
ICAgICAgICBzZWxmLmFzc2VydEVxdWFscygxLCBsZW4oaW1hZ2VfcmVzdWx0cykpCisgICAgICAg
IHNlbGYuYXNzZXJ0RXF1YWxzKCd0ZXh0JywgdGV4dF9yZXN1bHRzWzBdLnR5cGUoKSkKKyAgICAg
ICAgc2VsZi5hc3NlcnRFcXVhbHMoJ2ltYWdlJywgaW1hZ2VfcmVzdWx0c1swXS50eXBlKCkpCisK
KyAgICBkZWYgdGVzdEV4Y2x1ZGVFeHBlY3RlZFJlc3VsdHNXb3JrcyhzZWxmKToKKyAgICAgICAg
emlwID0gRmFrZVppcCgpCisgICAgICAgIHppcC5pbnNlcnQoJ3Rlc3QtZXhwZWN0ZWQudHh0Jywg
ICdleHBlY3RlZCByZXN1bHRzIHN0b3JlZCBvbiBzZXJ2ZXIgZm9yIHNvbWUgcmVhc29uJykKKyAg
ICAgICAgYiA9IHNlbGYuX3Jlc3VsdHNldF93aXRoX3ppcCh6aXAsIGluY2x1ZGVfZXhwZWN0ZWQ9
RmFsc2UpCisgICAgICAgIHJlc3VsdHMgPSBiLnJlc3VsdHNfZm9yKCd0ZXN0JywgdGFyZ2V0X3R5
cGU9Tm9uZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoMCwgbGVuKHJlc3VsdHMpKQorCitp
ZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgorICAgIHVuaXR0ZXN0Lm1haW4oKQpkaWZmIC0tZ2l0
IGEvV2ViS2l0VG9vbHMvU2NyaXB0cy93ZWJraXRweS9jb21tb24vc3lzdGVtL2ZpbGVzeXN0ZW0u
cHkgYi9XZWJLaXRUb29scy9TY3JpcHRzL3dlYmtpdHB5L2NvbW1vbi9zeXN0ZW0vZmlsZXN5c3Rl
bS5weQppbmRleCBjN2VmZGUzYTQyNGNhNDI2OGUxNjBhZTNkNWEzMjYxOGM2NGZjMjNiLi41MDdm
YzFkNDEzZjJiZmEyOTJiZGIzMjFiYjIxYjBlZDFmMjRhM2M1IDEwMDY0NAotLS0gYS9XZWJLaXRU
b29scy9TY3JpcHRzL3dlYmtpdHB5L2NvbW1vbi9zeXN0ZW0vZmlsZXN5c3RlbS5weQorKysgYi9X
ZWJLaXRUb29scy9TY3JpcHRzL3dlYmtpdHB5L2NvbW1vbi9zeXN0ZW0vZmlsZXN5c3RlbS5weQpA
QCAtMzMsNiArMzMsNyBAQCBmcm9tIF9fZnV0dXJlX18gaW1wb3J0IHdpdGhfc3RhdGVtZW50CiBp
bXBvcnQgY29kZWNzCiBpbXBvcnQgZXJybm8KIGltcG9ydCBvcworaW1wb3J0IHNodXRpbAogaW1w
b3J0IHRlbXBmaWxlCiAKIApAQCAtMTE1LDMgKzExNiwxMSBAQCBjbGFzcyBGaWxlU3lzdGVtKG9i
amVjdCk6CiAgICAgICAgIFRoZSBmaWxlIGlzIHdyaXR0ZW4gZW5jb2RlZCBhcyBVVEYtOCB3aXRo
IG5vIEJPTS4iIiIKICAgICAgICAgd2l0aCBjb2RlY3Mub3BlbihwYXRoLCAndycsICd1dGY4Jykg
YXMgZjoKICAgICAgICAgICAgIGYud3JpdGUoY29udGVudHMpCisKKyAgICBkZWYgcmVtb3ZlX2Zp
bGUoc2VsZiwgZmlsZW5hbWUpOgorICAgICAgICAiIiJSZW1vdmUgdGhlIHNwZWNpZmllZCBmaWxl
LiIiIgorICAgICAgICBvcy5yZW1vdmUoZmlsZW5hbWUpCisKKyAgICBkZWYgY29weV9maWxlKHNl
bGYsIHNyYywgZGVzdCk6CisgICAgICAgICIiIkNvcHkgdGhlIGZpbGUgYXQgc3JjIHRvIGRlc3Qu
IiIiCisgICAgICAgIHNodXRpbC5jb3B5ZmlsZShzcmMsIGRlc3QpCmRpZmYgLS1naXQgYS9XZWJL
aXRUb29scy9TY3JpcHRzL3dlYmtpdHB5L2xheW91dF90ZXN0cy9wb3J0L2Jhc2UucHkgYi9XZWJL
aXRUb29scy9TY3JpcHRzL3dlYmtpdHB5L2xheW91dF90ZXN0cy9wb3J0L2Jhc2UucHkKaW5kZXgg
NzU3MzE4ZDEzODA1YmM3ZGE5YTc3ZjM4MzAyYzU1MDE4ZTBhMmJiNi4uY2IyOGNlOWEzZjhmNTNl
YTlhMmU3OTc2ZWIyOTlhNGUyNDYxNzk0MSAxMDA2NDQKLS0tIGEvV2ViS2l0VG9vbHMvU2NyaXB0
cy93ZWJraXRweS9sYXlvdXRfdGVzdHMvcG9ydC9iYXNlLnB5CisrKyBiL1dlYktpdFRvb2xzL1Nj
cmlwdHMvd2Via2l0cHkvbGF5b3V0X3Rlc3RzL3BvcnQvYmFzZS5weQpAQCAtNjMxLDYgKzYzMSwx
MCBAQCBjbGFzcyBQb3J0KG9iamVjdCk6CiAgICAgICAgIGV4cGVjdGF0aW9ucywgZGV0ZXJtaW5p
bmcgc2VhcmNoIHBhdGhzLCBhbmQgbG9nZ2luZyBpbmZvcm1hdGlvbi4iIiIKICAgICAgICAgcmFp
c2UgTm90SW1wbGVtZW50ZWRFcnJvcignUG9ydC52ZXJzaW9uJykKIAorICAgIGRlZiBidWlsZGJv
dF9yZXN1bHRzZXQoc2VsZiwgcGxhdGZvcm1zKToKKyAgICAgICAgIiIiUmV0dXJucyBhIFJlc3Vs
dFNldCBmb3IgdGhlIHNwZWNpZmllZCBwbGF0Zm9ybXMgZm9yIHRoaXMgcG9ydHMgYnVpbGRib3Rz
LiIiIgorICAgICAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKCdQb3J0LmJ1aWxkYm90X3Jl
c3VsdHNldCcpCisKICAgICBkZWYgdGVzdF9yZXBvc2l0b3J5X3BhdGhzKHNlbGYpOgogICAgICAg
ICAiIiJSZXR1cm5zIGEgbGlzdCBvZiAocmVwb3NpdG9yeV9uYW1lLCByZXBvc2l0b3J5X3BhdGgp
IHR1cGxlcwogICAgICAgICBvZiBpdHMgZGVwZW5kaW5nIGNvZGUgYmFzZS4gIEJ5IGRlZmF1bHQg
aXQgcmV0dXJucyBhIGxpc3QgdGhhdCBvbmx5CmRpZmYgLS1naXQgYS9XZWJLaXRUb29scy9TY3Jp
cHRzL3dlYmtpdHB5L2xheW91dF90ZXN0cy9wb3J0L2Nocm9taXVtLnB5IGIvV2ViS2l0VG9vbHMv
U2NyaXB0cy93ZWJraXRweS9sYXlvdXRfdGVzdHMvcG9ydC9jaHJvbWl1bS5weQppbmRleCA4ZmU2
ODVhZjA2NjllYjM0YWZlOGY5NGM1NmZlM2ZmM2NkOTUzNmM3Li5jZTNmZGRhNmFlMzMxODE2ZTcw
NDIzZmQwZjMxM2FiMjAwOTcwNzI1IDEwMDY0NAotLS0gYS9XZWJLaXRUb29scy9TY3JpcHRzL3dl
YmtpdHB5L2xheW91dF90ZXN0cy9wb3J0L2Nocm9taXVtLnB5CisrKyBiL1dlYktpdFRvb2xzL1Nj
cmlwdHMvd2Via2l0cHkvbGF5b3V0X3Rlc3RzL3BvcnQvY2hyb21pdW0ucHkKQEAgLTQ0LDYgKzQ0
LDggQEAgaW1wb3J0IHRlbXBmaWxlCiBpbXBvcnQgdGltZQogaW1wb3J0IHdlYmJyb3dzZXIKIAor
ZnJvbSB3ZWJraXRweS5jb21tb24ubmV0LnJlbW90ZXppcCBpbXBvcnQgUmVtb3RlWmlwCitmcm9t
IHdlYmtpdHB5LmNvbW1vbi5uZXQucmVzdWx0c2V0IGltcG9ydCBBZ2dyZWdhdGVSZXN1bHRTZXQs
IFJlc3VsdFNldAogZnJvbSB3ZWJraXRweS5jb21tb24uc3lzdGVtLnBhdGggaW1wb3J0IGN5Z3Bh
dGgKIGZyb20gd2Via2l0cHkubGF5b3V0X3Rlc3RzLmxheW91dF9wYWNrYWdlIGltcG9ydCB0ZXN0
X2V4cGVjdGF0aW9ucwogZnJvbSB3ZWJraXRweS5sYXlvdXRfdGVzdHMubGF5b3V0X3BhY2thZ2Ug
aW1wb3J0IHRlc3Rfb3V0cHV0CkBAIC0xOTcsNiArMTk5LDI2IEBAIGNsYXNzIENocm9taXVtUG9y
dChiYXNlLlBvcnQpOgogICAgICAgICByZXR1cm4gc2VsZi5wYXRoX2Zyb21fd2Via2l0X2Jhc2Uo
J0xheW91dFRlc3RzJywgJ3BsYXRmb3JtJywKICAgICAgICAgICAgICdjaHJvbWl1bScsICd0ZXN0
X2V4cGVjdGF0aW9ucy50eHQnKQogCisgICAgZGVmIGJ1aWxkYm90X3Jlc3VsdHNldChzZWxmLCBw
bGF0Zm9ybXMpOgorICAgICAgICBwbGF0Zm9ybV9idWlsZGVycyA9IHsKKyAgICAgICAgICAgICdj
aHJvbWl1bS1tYWMnOiAnV2Via2l0X01hYzEwXzUnLAorICAgICAgICAgICAgJ2Nocm9taXVtLXdp
bi12aXN0YSc6ICdXZWJraXRfV2luJywKKyAgICAgICAgICAgICdjaHJvbWl1bS1saW51eCc6ICdX
ZWJraXRfTGludXhfVGVzdHNfX2RiZ19fMV8nLAorICAgICAgICB9CisKKyAgICAgICAgcmVzdWx0
c2V0cyA9IFtdCisgICAgICAgIGZvciBwbGF0Zm9ybSBpbiBwbGF0Zm9ybXM6CisgICAgICAgICAg
ICBpZiBwbGF0Zm9ybSBub3QgaW4gcGxhdGZvcm1fYnVpbGRlcnM6CisgICAgICAgICAgICAgICAg
cmFpc2UgRXhjZXB0aW9uKCJEb24ndCBoYXZlIHJlc3VsdHMgZm9yIHBsYXRmb3JtICVzIiAlIHBs
YXRmb3JtKQorICAgICAgICAgICAgYnVpbGRlcl9uYW1lID0gcGxhdGZvcm1fYnVpbGRlcnNbcGxh
dGZvcm1dCisgICAgICAgICAgICB6aXBfdXJsID0gJ2h0dHA6Ly9idWlsZC5jaHJvbWl1bS5vcmcv
Zi9jaHJvbWl1bS9sYXlvdXRfdGVzdF9yZXN1bHRzLycgKyBcCisgICAgICAgICAgICAgICAgYnVp
bGRlcl9uYW1lICsgJy9sYXlvdXQtdGVzdC1yZXN1bHRzLnppcCcKKyAgICAgICAgICAgIHByaW50
ICJHb3QgJXMiICUgemlwX3VybAorICAgICAgICAgICAgcmVzdWx0c2V0cy5hcHBlbmQoUmVzdWx0
U2V0KGJ1aWxkZXJfbmFtZSwgcGxhdGZvcm0sIFJlbW90ZVppcCh6aXBfdXJsKSwKKyAgICAgICAg
ICAgICAgICBpbmNsdWRlX2V4cGVjdGVkPUZhbHNlKSkKKworICAgICAgICByZXR1cm4gQWdncmVn
YXRlUmVzdWx0U2V0KHJlc3VsdHNldHMpCisKICAgICBkZWYgcmVzdWx0c19kaXJlY3Rvcnkoc2Vs
Zik6CiAgICAgICAgIHRyeToKICAgICAgICAgICAgIHJldHVybiBzZWxmLnBhdGhfZnJvbV9jaHJv
bWl1bV9iYXNlKCd3ZWJraXQnLApkaWZmIC0tZ2l0IGEvV2ViS2l0VG9vbHMvU2NyaXB0cy93ZWJr
aXRweS9sYXlvdXRfdGVzdHMvcG9ydC93ZWJraXQucHkgYi9XZWJLaXRUb29scy9TY3JpcHRzL3dl
YmtpdHB5L2xheW91dF90ZXN0cy9wb3J0L3dlYmtpdC5weQppbmRleCAwOWJlODMzZDc1MmYwMmZk
Yjc5NDQ2NjNiOTBlNTVlYTczMGNlMWExLi5hMmQzOTRmZGExNDU1NDlmZGNkNjRhMWY4NjRkYTQz
YTVkZmEzNzdiIDEwMDY0NAotLS0gYS9XZWJLaXRUb29scy9TY3JpcHRzL3dlYmtpdHB5L2xheW91
dF90ZXN0cy9wb3J0L3dlYmtpdC5weQorKysgYi9XZWJLaXRUb29scy9TY3JpcHRzL3dlYmtpdHB5
L2xheW91dF90ZXN0cy9wb3J0L3dlYmtpdC5weQpAQCAtNDYsNiArNDYsOCBAQCBpbXBvcnQgb3Bl
cmF0b3IKIGltcG9ydCB0ZW1wZmlsZQogaW1wb3J0IHNodXRpbAogCitpbXBvcnQgd2Via2l0cHku
Y29tbW9uLm5ldC5idWlsZGJvdCBhcyBidWlsZGJvdAorZnJvbSB3ZWJraXRweS5jb21tb24ubmV0
LnJlc3VsdHNldCBpbXBvcnQgQWdncmVnYXRlUmVzdWx0U2V0CiBpbXBvcnQgd2Via2l0cHkuY29t
bW9uLnN5c3RlbS5vc3BhdGggYXMgb3NwYXRoCiBpbXBvcnQgd2Via2l0cHkubGF5b3V0X3Rlc3Rz
LmxheW91dF9wYWNrYWdlLnRlc3Rfb3V0cHV0IGFzIHRlc3Rfb3V0cHV0CiBpbXBvcnQgd2Via2l0
cHkubGF5b3V0X3Rlc3RzLnBvcnQuYmFzZSBhcyBiYXNlCkBAIC03OSw2ICs4MSwzNCBAQCBjbGFz
cyBXZWJLaXRQb3J0KGJhc2UuUG9ydCk6CiAgICAgZGVmIHZlcnNpb24oc2VsZik6CiAgICAgICAg
IHJldHVybiAnJwogCisgICAgZGVmIGJ1aWxkYm90X3Jlc3VsdHNldChzZWxmLCBwbGF0Zm9ybXMp
OgorICAgICAgICBwbGF0Zm9ybV9idWlsZGVycyA9IHsKKyAgICAgICAgICAgICdtYWMtc25vd2xl
b3BhcmQnOiAnU25vd0xlb3BhcmQgSW50ZWwgUmVsZWFzZSAoVGVzdHMpJywKKyAgICAgICAgICAg
ICdtYWMtbGVvcGFyZCc6ICdMZW9wYXJkIEludGVsIERlYnVnIChUZXN0cyknLAorICAgICAgICAg
ICAgJ3dpbic6ICdXaW5kb3dzIDcgUmVsZWFzZSAoV2ViS2l0MiBUZXN0cyknLAorICAgICAgICAg
ICAgJ2Nocm9taXVtLWxpbnV4JzogJ0dUSyBMaW51eCAzMi1iaXQgUmVsZWFzZScsCisgICAgICAg
IH0KKworICAgICAgICBmb3IgcGxhdGZvcm0gaW4gcGxhdGZvcm1zOgorICAgICAgICAgICAgaWYg
cGxhdGZvcm0gbm90IGluIHBsYXRmb3JtX2J1aWxkZXJzOgorICAgICAgICAgICAgICAgIHJhaXNl
IEV4Y2VwdGlvbigiQ2FuJ3QgZmluZCBidWlsZGVyIGZvciAlcyIgJSBwbGF0Zm9ybSkKKworICAg
ICAgICBiYiA9IGJ1aWxkYm90LkJ1aWxkQm90KCkKKyAgICAgICAgcmVzdWx0c2V0cyA9IFtdCisg
ICAgICAgIGJ1aWxkZXJzX2J5X25hbWUgPSB7fQorCisgICAgICAgIGZvciBidWlsZGVyIGluIGJi
LmJ1aWxkZXJzKCk6CisgICAgICAgICAgICBidWlsZGVyc19ieV9uYW1lW2J1aWxkZXIubmFtZSgp
XSA9IGJ1aWxkZXIKKworICAgICAgICBmb3IgcGxhdGZvcm0gaW4gcGxhdGZvcm1zOgorICAgICAg
ICAgICAgYnVpbGRlciA9IGJ1aWxkZXJzX2J5X25hbWVbcGxhdGZvcm1fYnVpbGRlcnNbcGxhdGZv
cm1dXQorICAgICAgICAgICAgcHJpbnQgImdvdCBidWlsZGVyICVzIiAlIGJ1aWxkZXIubmFtZSgp
CisgICAgICAgICAgICBycyA9IGJ1aWxkZXIubGF0ZXN0X2J1aWxkKCkucmVzdWx0cygpCisgICAg
ICAgICAgICBycy5zZXRfcGxhdGZvcm0ocGxhdGZvcm0pCisgICAgICAgICAgICByZXN1bHRzZXRz
LmFwcGVuZChycykKKworICAgICAgICByZXR1cm4gQWdncmVnYXRlUmVzdWx0U2V0KHJlc3VsdHNl
dHMpCisKICAgICBkZWYgX2J1aWxkX2RyaXZlcihzZWxmKToKICAgICAgICAgY29uZmlndXJhdGlv
biA9IHNlbGYuZ2V0X29wdGlvbignY29uZmlndXJhdGlvbicpCiAgICAgICAgIHJldHVybiBzZWxm
Ll9jb25maWcuYnVpbGRfZHVtcHJlbmRlcnRyZWUoY29uZmlndXJhdGlvbikKZGlmZiAtLWdpdCBh
L1dlYktpdFRvb2xzL1NjcmlwdHMvd2Via2l0cHkvdG9vbC9jb21tYW5kcy9fX2luaXRfXy5weSBi
L1dlYktpdFRvb2xzL1NjcmlwdHMvd2Via2l0cHkvdG9vbC9jb21tYW5kcy9fX2luaXRfXy5weQpp
bmRleCBkMmFhNTAzZDE4NTYxZGVhYjJjYWU3MDBkZjZkNDkzYTliMDVmY2YzLi5jMDU5NmU3ODky
MmVlZDNlMDE1NzJmMzhhNDIyZWFjYjM1YzhiNTkxIDEwMDY0NAotLS0gYS9XZWJLaXRUb29scy9T
Y3JpcHRzL3dlYmtpdHB5L3Rvb2wvY29tbWFuZHMvX19pbml0X18ucHkKKysrIGIvV2ViS2l0VG9v
bHMvU2NyaXB0cy93ZWJraXRweS90b29sL2NvbW1hbmRzL19faW5pdF9fLnB5CkBAIC03LDYgKzcs
NyBAQCBmcm9tIHdlYmtpdHB5LnRvb2wuY29tbWFuZHMucHJldHR5ZGlmZiBpbXBvcnQgUHJldHR5
RGlmZgogZnJvbSB3ZWJraXRweS50b29sLmNvbW1hbmRzLnF1ZXJpZXMgaW1wb3J0ICoKIGZyb20g
d2Via2l0cHkudG9vbC5jb21tYW5kcy5xdWV1ZXMgaW1wb3J0ICoKIGZyb20gd2Via2l0cHkudG9v
bC5jb21tYW5kcy5yZWJhc2VsaW5lIGltcG9ydCBSZWJhc2VsaW5lCitmcm9tIHdlYmtpdHB5LnRv
b2wuY29tbWFuZHMucmViYXNlbGluZTIucmViYXNlbGluZTIgaW1wb3J0IFJlYmFzZWxpbmUyCiBm
cm9tIHdlYmtpdHB5LnRvb2wuY29tbWFuZHMucmViYXNlbGluZXNlcnZlciBpbXBvcnQgUmViYXNl
bGluZVNlcnZlcgogZnJvbSB3ZWJraXRweS50b29sLmNvbW1hbmRzLnNoZXJpZmZib3QgaW1wb3J0
ICoKIGZyb20gd2Via2l0cHkudG9vbC5jb21tYW5kcy51cGxvYWQgaW1wb3J0ICoKZGlmZiAtLWdp
dCBhL1dlYktpdFRvb2xzL1NjcmlwdHMvd2Via2l0cHkvdG9vbC9jb21tYW5kcy9yZWJhc2VsaW5l
Mi9fX2luaXRfXy5weSBiL1dlYktpdFRvb2xzL1NjcmlwdHMvd2Via2l0cHkvdG9vbC9jb21tYW5k
cy9yZWJhc2VsaW5lMi9fX2luaXRfXy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwLi5lZjY1YmVlNWJiNzdlOTZlYmM3
Y2Q5YzQ3NjQwNjkwZmJkYThhYzE5Ci0tLSAvZGV2L251bGwKKysrIGIvV2ViS2l0VG9vbHMvU2Ny
aXB0cy93ZWJraXRweS90b29sL2NvbW1hbmRzL3JlYmFzZWxpbmUyL19faW5pdF9fLnB5CkBAIC0w
LDAgKzEgQEAKKyMgUmVxdWlyZWQgZm9yIFB5dGhvbiB0byBzZWFyY2ggdGhpcyBkaXJlY3Rvcnkg
Zm9yIG1vZHVsZSBmaWxlcwpkaWZmIC0tZ2l0IGEvV2ViS2l0VG9vbHMvU2NyaXB0cy93ZWJraXRw
eS90b29sL2NvbW1hbmRzL3JlYmFzZWxpbmUyL2J1Y2tldC5weSBiL1dlYktpdFRvb2xzL1Njcmlw
dHMvd2Via2l0cHkvdG9vbC9jb21tYW5kcy9yZWJhc2VsaW5lMi9idWNrZXQucHkKbmV3IGZpbGUg
bW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MC4uODJlYWVhNGJhNDE2ODg1YmYyYjM1MzMwOGYwZmFjYzc0YzllZjQwYQotLS0gL2Rldi9udWxs
CisrKyBiL1dlYktpdFRvb2xzL1NjcmlwdHMvd2Via2l0cHkvdG9vbC9jb21tYW5kcy9yZWJhc2Vs
aW5lMi9idWNrZXQucHkKQEAgLTAsMCArMSwyMjYgQEAKKyMhL3Vzci9iaW4vZW52IHB5dGhvbgor
IyBDb3B5cmlnaHQgKEMpIDIwMTAgR29vZ2xlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyMK
KyMgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0
aCBvciB3aXRob3V0CisjIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0
IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworIyBhcmUgbWV0OgorIworIyAxLiAgUmVkaXN0cmli
dXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyMg
ICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlz
Y2xhaW1lci4KKyMgMi4gIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJv
ZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisjICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25k
aXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisjICAgICBkb2N1bWVu
dGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0
aW9uLgorIworIyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIEFORCBJVFMgQ09O
VFJJQlVUT1JTICJBUyBJUyIgQU5EIEFOWQorIyBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElF
UywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVECisjIFdBUlJBTlRJ
RVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9T
RSBBUkUKKyMgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgT1IgSVRTIENPTlRS
SUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWQorIyBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFM
LCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUworIyAoSU5DTFVE
SU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMg
T1IgU0VSVklDRVM7CisjIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVT
UyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAorIyBPTiBBTlkgVEhFT1JZIE9GIExJ
QUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAor
IyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkg
T1VUIE9GIFRIRSBVU0UgT0YKKyMgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRI
RSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworCitjbGFzcyBJbmRlbnRlZExvZ2dlcihv
YmplY3QpOgorICAgICIiIkxvZ2dlciB0aGF0IHByaW50cyBpbmRlbnRlZCBtZXNzYWdlcyIiIgor
ICAgIGRlZiBfX2luaXRfXyhzZWxmLCBsb2dnZXI9Tm9uZSk6CisgICAgICAgIHNlbGYuX2xvZ2dl
ciA9IGxvZ2dlcgorICAgICAgICBzZWxmLl9pbmRlbnQgPSAwCisKKyAgICBkZWYgaW5kZW50KHNl
bGYpOgorICAgICAgICBzZWxmLl9pbmRlbnQgKz0gMQorCisgICAgZGVmIG91dGRlbnQoc2VsZik6
CisgICAgICAgIHNlbGYuX2luZGVudCAtPSAxCisKKyAgICBkZWYgbG9nKHNlbGYsIG1lc3NhZ2Up
OgorICAgICAgICBtZXNzYWdlID0gJyAgJyAqIHNlbGYuX2luZGVudCArIG1lc3NhZ2UKKyAgICAg
ICAgaWYgc2VsZi5fbG9nZ2VyIGlzIE5vbmU6CisgICAgICAgICAgICBwcmludCBtZXNzYWdlCisg
ICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLl9sb2dnZXIobWVzc2FnZSkKKworCitjbGFz
cyBCdWNrZXQob2JqZWN0KToKKyAgICAiIiJCdWNrZXRzIGhvbGQgb3RoZXIgYnVja2V0cyBpbiBh
IHRyZWUgdGhhdCByZWZsZWN0cyB0aGUgdGVzdCBmYWxsYmFjaworICAgICAgIG9yZGVyLiIiIgor
ICAgIGRlZiBfX2luaXRfXyhzZWxmLCBuYW1lKToKKyAgICAgICAgc2VsZi5fbmFtZSA9IG5hbWUK
KyAgICAgICAgc2VsZi5fY2hpbGRyZW4gPSBbXQorICAgICAgICBzZWxmLl9yZXN1bHQgPSBOb25l
CisgICAgICAgIHNlbGYuX2ltcGxpY2l0X3Jlc3VsdCA9IE5vbmUKKyAgICAgICAgIyBBZ2dyZWdh
dGUgYnVja2V0cyBkb24ndCBnZXQgcmVzdWx0cyBkaXJlY3RseSBmcm9tIGJ1aWxkYm90LgorICAg
ICAgICBzZWxmLl9pc19hZ2dyZWdhdGUgPSBGYWxzZQorCisgICAgZGVmIF9vbl9jaGFuZ2VkKHNl
bGYpOgorICAgICAgICBmb3IgY2hpbGQgaW4gc2VsZi5fY2hpbGRyZW46CisgICAgICAgICAgICBj
aGlsZC5zZXRfaW1wbGljaXQoc2VsZi5pbXBsaWNpdF9yZXN1bHQoKSkKKworICAgIGRlZiBfYWxs
X2VxdWFsKHNlbGYsIHJlc3VsdHMpOgorICAgICAgICBpZiBsZW4ocmVzdWx0cykgPT0gMDoKKyAg
ICAgICAgICAgIHJldHVybiBUcnVlCisgICAgICAgIGNvbnRlbnRzID0gcmVzdWx0c1swXS5jb250
ZW50cygpCisgICAgICAgIHJldHVybiBhbGwobWFwKGxhbWJkYSB4OiB4LmNvbnRlbnRzKCkgPT0g
Y29udGVudHMsIHJlc3VsdHMpKQorCisgICAgZGVmIGR1bXAoc2VsZiwgbG9nZ2VyPUluZGVudGVk
TG9nZ2VyKCkpOgorICAgICAgICBsb2dnZXIubG9nKCJCdWNrZXQ6JXMgeyIgJSBzZWxmLl9uYW1l
KQorICAgICAgICBsb2dnZXIuaW5kZW50KCkKKyAgICAgICAgbG9nZ2VyLmxvZygiUmVzdWx0ID0g
JXMiICUgc2VsZi5fcmVzdWx0KQorICAgICAgICBsb2dnZXIubG9nKCJJbXBsaWNpdCByZXN1bHQg
PSAlcyIgJSBzZWxmLmltcGxpY2l0X3Jlc3VsdCgpKQorICAgICAgICBmb3IgY2hpbGQgaW4gc2Vs
Zi5fY2hpbGRyZW46CisgICAgICAgICAgICBjaGlsZC5kdW1wKGxvZ2dlcikKKyAgICAgICAgbG9n
Z2VyLm91dGRlbnQoKQorICAgICAgICBsb2dnZXIubG9nKCJ9IikKKworICAgIGRlZiBuYW1lKHNl
bGYpOgorICAgICAgICByZXR1cm4gc2VsZi5fbmFtZQorCisgICAgZGVmIG1hcmtfYXNfYWdncmVn
YXRlKHNlbGYpOgorICAgICAgICAiIiJCdWNrZXRzIHRoYXQgZG9uJ3QgbWFwIHRvIGEgc3BlY2lm
aWMgcGxhdGZvcm0gYXJlICdhZ2dyZWdhdGUnCisgICAgICAgIGJ1Y2tldHMuICBBZ2dyZWdhdGUg
YnVja2V0cyBjYW4gb3ZlcndyaXRlIHRoZWlyIG93biByZXN1bHRzIHdpdGggdGhvc2UKKyAgICAg
ICAgb2YgdGhlaXIgY2hpbGRyZW4gaWYgdGhlaXIgY2hpbGRyZW4gaGF2ZSByZXN1bHRzIHRoYXQg
YWxsIG1hdGNoIGJlY2F1c2UKKyAgICAgICAgYWdncmVnYXRlcyBhcmUgZGVmaW5lZCBlbnRpcmVs
eSBieSB0aGVpciBjaGlsZHJlbiBhbmQgbm90IHRoZWlyIG93bgorICAgICAgICB0YXJnZXRlZCBy
ZXN1bHRzLiIiIgorICAgICAgICBzZWxmLl9pc19hZ2dyZWdhdGUgPSBUcnVlCisKKyAgICBkZWYg
YXBwZW5kKHNlbGYsIGNoaWxkKToKKyAgICAgICAgc2VsZi5fY2hpbGRyZW4uYXBwZW5kKGNoaWxk
KQorICAgICAgICBzZWxmLl9vbl9jaGFuZ2VkKCkKKworICAgIGRlZiBpbXBsaWNpdF9yZXN1bHQo
c2VsZik6CisgICAgICAgIGlmIHNlbGYuX3Jlc3VsdCBpcyBub3QgTm9uZToKKyAgICAgICAgICAg
IHJldHVybiBzZWxmLl9yZXN1bHQKKyAgICAgICAgcmV0dXJuIHNlbGYuX2ltcGxpY2l0X3Jlc3Vs
dAorCisgICAgZGVmIHNldF9yZXN1bHQoc2VsZiwgcmVzdWx0KToKKyAgICAgICAgaWYgc2VsZi5f
cmVzdWx0IGlzIE5vbmU6CisgICAgICAgICAgICBzZWxmLl9yZXN1bHQgPSByZXN1bHQKKyAgICAg
ICAgICAgIHNlbGYuX29uX2NoYW5nZWQoKQorICAgICAgICBlbGlmIHJlc3VsdC5pc19yZWJhc2Vs
aW5lX29mKHNlbGYuX3Jlc3VsdCk6CisgICAgICAgICAgICBzZWxmLl9yZXN1bHQgPSByZXN1bHQK
KyAgICAgICAgICAgIHNlbGYuX29uX2NoYW5nZWQoKQorICAgICAgICBlbGlmIHNlbGYuX3Jlc3Vs
dC5pc19yZWJhc2VsaW5lX29mKHJlc3VsdCk6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIGVs
aWYgc2VsZi5fcmVzdWx0ID09IHJlc3VsdDoKKyAgICAgICAgICAgIHJhaXNlIEV4Y2VwdGlvbigi
U2FtZSByZXN1bHQgYmVpbmcgaW5zZXJ0ZWQgYWdhaW4gaW50byBidWNrZXQgJXM6ICVzIDwtICVz
IiAlIChzZWxmLCBzZWxmLl9yZXN1bHQsIHJlc3VsdCkpCisgICAgICAgIGVsc2U6CisgICAgICAg
ICAgICByYWlzZSBFeGNlcHRpb24oIkNvbmZsaWN0aW5nIHJlc3VsdHMgJXMgYW5kICVzIGFzc2ln
bmVkIHRvIGJ1Y2tldCAlcyIgJQorICAgICAgICAgICAgICAgICAgICAoc2VsZi5fcmVzdWx0LCBy
ZXN1bHQsIHNlbGYuX25hbWUpKQorCisgICAgZGVmIGNsZWFyX3Jlc3VsdChzZWxmKToKKyAgICAg
ICAgc2VsZi5fcmVzdWx0ID0gTm9uZQorICAgICAgICBzZWxmLl9vbl9jaGFuZ2VkKCkKKworICAg
IGRlZiByZXN1bHQoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLl9yZXN1bHQKKworICAgIGRl
ZiBzZXRfaW1wbGljaXQoc2VsZiwgaW1wbGljaXRfcmVzdWx0KToKKyAgICAgICAgc2VsZi5faW1w
bGljaXRfcmVzdWx0ID0gaW1wbGljaXRfcmVzdWx0CisgICAgICAgIHNlbGYuX29uX2NoYW5nZWQo
KQorCisgICAgZGVmIF9zYW1lX2ltcGxpY2l0X3Jlc3VsdChzZWxmLCBvdGhlcik6CisgICAgICAg
IGlmIHNlbGYuaW1wbGljaXRfcmVzdWx0KCkgaXMgTm9uZToKKyAgICAgICAgICAgIHJldHVybiBz
ZWxmLmltcGxpY2l0X3Jlc3VsdCgpID09IG90aGVyLmltcGxpY2l0X3Jlc3VsdCgpCisgICAgICAg
IHJldHVybiBvdGhlci5pbXBsaWNpdF9yZXN1bHQoKS5zYW1lX2NvbnRlbnQoc2VsZi5pbXBsaWNp
dF9yZXN1bHQoKSkKKworICAgIGRlZiBfZ2V0X2NvbW1vbl9jaGlsZF9yZXN1bHQoc2VsZiwgcmVz
dWx0cyk6CisgICAgICAgIGlmIGxlbihyZXN1bHRzKSA9PSAwOgorICAgICAgICAgICAgcmV0dXJu
IE5vbmUKKworICAgICAgICBmaXJzdF9yZXN1bHQgPSByZXN1bHRzWzBdCisgICAgICAgIHJlc3Vs
dF90b19yZXR1cm4gPSBmaXJzdF9yZXN1bHQKKyAgICAgICAgZm9yIHJlc3VsdCBpbiByZXN1bHRz
WzE6XToKKyAgICAgICAgICAgIGlmIG5vdCByZXN1bHQuc2FtZV9jb250ZW50KGZpcnN0X3Jlc3Vs
dCk6CisgICAgICAgICAgICAgICAgcmV0dXJuIE5vbmUKKyAgICAgICAgICAgIGlmIHJlc3VsdC5p
c19hY3R1YWwoKToKKyAgICAgICAgICAgICAgICByZXN1bHRfdG9fcmV0dXJuID0gcmVzdWx0ICAg
IyBQcmVmZXIgdG8gcmV0dXJuIGFjdHVhbCByZXN1bHRzLgorICAgICAgICByZXR1cm4gcmVzdWx0
X3RvX3JldHVybgorCisgICAgZGVmIF9pbmhlcml0KHNlbGYsIHJlc3VsdCk6CisgICAgICAgIGZv
ciBjaGlsZCBpbiBzZWxmLl9jaGlsZHJlbjoKKyAgICAgICAgICAgIGNoaWxkLmNsZWFyX3Jlc3Vs
dCgpCisgICAgICAgIHNlbGYuX3Jlc3VsdCA9IHJlc3VsdC5yZXRhcmdldChzZWxmLl9uYW1lKQor
ICAgICAgICBzZWxmLl9vbl9jaGFuZ2VkKCkKKworICAgIGRlZiBfYXR0ZW1wdF90b19pbmhlcml0
KHNlbGYpOgorICAgICAgICAiIiJUcnkgdG8gaW5oZXJpdCBhIHJlc3VsdCBmcm9tIGNoaWxkcmVu
LiBUaGlzIHdpbGwgb25seSBoYXBwZW4gaWYgYWxsCisgICAgICAgICAgICAgIGNoaWxkcmVuIGhh
dmUgdGhlIHNhbWUgcmVzdWx0IiIiCisgICAgICAgIGNoaWxkX3Jlc3VsdHMgPSBtYXAobGFtYmRh
IGM6IGMuaW1wbGljaXRfcmVzdWx0KCksIHNlbGYuX2NoaWxkcmVuKQorICAgICAgICBjaGlsZF9y
ZXN1bHRzID0gZmlsdGVyKGxhbWJkYSByOiByIGlzIG5vdCBOb25lLCBjaGlsZF9yZXN1bHRzKQor
ICAgICAgICB0b19pbmhlcml0ID0gc2VsZi5fZ2V0X2NvbW1vbl9jaGlsZF9yZXN1bHQoY2hpbGRf
cmVzdWx0cykKKworICAgICAgICBpZiB0b19pbmhlcml0IGlzIE5vbmU6CisgICAgICAgICAgICBy
ZXR1cm4gRmFsc2UKKworICAgICAgICAjIFdlIGhhdmUgYSByZXN1bHQgd2UgY291bGQgcG90ZW50
aWFsbHkgaW5oZXJpdC4uLgorICAgICAgICBpZiBzZWxmLmltcGxpY2l0X3Jlc3VsdCgpIGlzIE5v
bmU6CisgICAgICAgICAgICBzZWxmLl9pbmhlcml0KHRvX2luaGVyaXQpCisgICAgICAgIGVsaWYg
dG9faW5oZXJpdC5pc19uZXdlcl90aGFuKHNlbGYuaW1wbGljaXRfcmVzdWx0KCkpIGFuZCBzZWxm
LmlzX2FnZ3JlZ2F0ZSgpOgorICAgICAgICAgICAgc2VsZi5faW5oZXJpdCh0b19pbmhlcml0KQor
ICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmV0dXJuIEZhbHNlCisgICAgICAgIHJldHVybiBU
cnVlCisKKyAgICBkZWYgaXNfYWdncmVnYXRlKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5f
aXNfYWdncmVnYXRlCisKKyAgICBkZWYgY29sbGFwc2Uoc2VsZik6CisgICAgICAgICIiIkRlbGV0
ZXMgcmVkdW5kYW50IHJlc3VsdHMgaW4gdGhlIHRyZWUgc3RhcnRpbmcgYXQgdGhpcyBidWNrZXQi
IiIKKyAgICAgICAgZm9yIGNoaWxkIGluIHNlbGYuX2NoaWxkcmVuOgorICAgICAgICAgICAgY2hp
bGQuY29sbGFwc2UoKQorCisgICAgICAgIGlmIHNlbGYuX2F0dGVtcHRfdG9faW5oZXJpdCgpOgor
ICAgICAgICAgICAgcmV0dXJuCisKKyAgICAgICAgZm9yIGNoaWxkIGluIHNlbGYuX2NoaWxkcmVu
OgorICAgICAgICAgICAgaWYgc2VsZi5fc2FtZV9pbXBsaWNpdF9yZXN1bHQoY2hpbGQpOgorICAg
ICAgICAgICAgICAgIGNoaWxkLmNsZWFyX3Jlc3VsdCgpCisKKyAgICBkZWYgaXNfZW1wdHkoc2Vs
Zik6CisgICAgICAgIHJldHVybiBzZWxmLl9yZXN1bHQgaXMgTm9uZQorCisgICAgZGVmIHJlc3Vs
dHMoc2VsZiwgcik6CisgICAgICAgIGlmIG5vdCBzZWxmLmlzX2VtcHR5KCk6CisgICAgICAgICAg
ICByLmFwcGVuZChzZWxmLl9yZXN1bHQpCisgICAgICAgIGZvciBjIGluIHNlbGYuX2NoaWxkcmVu
OgorICAgICAgICAgICAgYy5yZXN1bHRzKHIpCisKKworY2xhc3MgQnVja2V0VHJlZShvYmplY3Qp
OgorICAgICIiIkhlbHBlciBjbGFzcyBmb3IgY29uc3RydWN0aW5nIGFuZCBpbmRleGluZyBhIGhp
ZXJhcmNoeSBvZiBCdWNrZXRzLiIiIgorICAgIGRlZiBfX2luaXRfXyhzZWxmKToKKyAgICAgICAg
c2VsZi5fYnVja2V0cyA9IHt9CisgICAgICAgIHNlbGYuX3Jvb3RfYnVja2V0ID0gc2VsZi5fZ2V0
X29yX2NyZWF0ZV9idWNrZXQoTm9uZSkKKworICAgIGRlZiBfZ2V0X29yX2NyZWF0ZV9idWNrZXQo
c2VsZiwgYnVja2V0X25hbWUpOgorICAgICAgICBpZiBidWNrZXRfbmFtZSBub3QgaW4gc2VsZi5f
YnVja2V0czoKKyAgICAgICAgICAgIHNlbGYuX2J1Y2tldHNbYnVja2V0X25hbWVdID0gQnVja2V0
KGJ1Y2tldF9uYW1lKQorICAgICAgICByZXR1cm4gc2VsZi5fYnVja2V0c1tidWNrZXRfbmFtZV0K
KworICAgIGRlZiBtYWtlX2J1Y2tldChzZWxmLCBidWNrZXRfbmFtZSwgKmFyZ3MpOgorICAgICAg
ICBiID0gc2VsZi5fZ2V0X29yX2NyZWF0ZV9idWNrZXQoYnVja2V0X25hbWUpCisKKyAgICAgICAg
Zm9yIGFyZyBpbiBhcmdzOgorICAgICAgICAgICAgYi5hcHBlbmQoYXJnKQorICAgICAgICByZXR1
cm4gYgorCisgICAgZGVmIGluc2VydF9yZXN1bHQoc2VsZiwgcmVzdWx0KToKKyAgICAgICAgaWYg
cmVzdWx0LnBsYXRmb3JtKCkgbm90IGluIHNlbGYuX2J1Y2tldHMua2V5cygpOgorICAgICAgICAg
ICAgcmFpc2UgRXhjZXB0aW9uKCJDb3VsZG4ndCBmaW5kIGJ1Y2tldCBmb3IgcGxhdGZvcm0gJXMi
ICUgcmVzdWx0LnBsYXRmb3JtKCkpCisgICAgICAgIHNlbGYuX2J1Y2tldHNbcmVzdWx0LnBsYXRm
b3JtKCldLnNldF9yZXN1bHQocmVzdWx0KQorCisgICAgZGVmIHJlc3VsdHMoc2VsZik6CisgICAg
ICAgIHIgPSBbXQorICAgICAgICBzZWxmLl9yb290X2J1Y2tldC5yZXN1bHRzKHIpCisgICAgICAg
IHJldHVybiByCisKKyAgICBkZWYgY29sbGFwc2Uoc2VsZik6CisgICAgICAgIHNlbGYuX3Jvb3Rf
YnVja2V0LmNvbGxhcHNlKCkKKworICAgIGRlZiBnZXRfYnVja2V0KHNlbGYsIGJ1Y2tldF9uYW1l
KToKKyAgICAgICAgcmV0dXJuIHNlbGYuX2J1Y2tldHNbYnVja2V0X25hbWVdCisKKyAgICBkZWYg
cm9vdF9idWNrZXQoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLmdldF9idWNrZXQoTm9uZSkK
ZGlmZiAtLWdpdCBhL1dlYktpdFRvb2xzL1NjcmlwdHMvd2Via2l0cHkvdG9vbC9jb21tYW5kcy9y
ZWJhc2VsaW5lMi9idWNrZXRfdW5pdHRlc3QucHkgYi9XZWJLaXRUb29scy9TY3JpcHRzL3dlYmtp
dHB5L3Rvb2wvY29tbWFuZHMvcmViYXNlbGluZTIvYnVja2V0X3VuaXR0ZXN0LnB5Cm5ldyBmaWxl
IG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAuLjM0NTRkZGMyMTkwNDE3MjYxN2E1MWI4Yjc2NDczMTBlY2ZmOTM3OWMKLS0tIC9kZXYvbnVs
bAorKysgYi9XZWJLaXRUb29scy9TY3JpcHRzL3dlYmtpdHB5L3Rvb2wvY29tbWFuZHMvcmViYXNl
bGluZTIvYnVja2V0X3VuaXR0ZXN0LnB5CkBAIC0wLDAgKzEsMjczIEBACisjIS91c3IvYmluL2Vu
diBweXRob24KKyMgQ29weXJpZ2h0IChDKSAyMDEwIEdvb2dsZSBJbmMuIEFsbCByaWdodHMgcmVz
ZXJ2ZWQuCisjCisjIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkg
Zm9ybXMsIHdpdGggb3Igd2l0aG91dAorIyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJv
dmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyMgYXJlIG1ldDoKKyMKKyMgMS4g
IFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29w
eXJpZ2h0CisjICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9s
bG93aW5nIGRpc2NsYWltZXIuCisjIDIuICBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0g
bXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorIyAgICAgbm90aWNlLCB0aGlzIGxp
c3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorIyAg
ICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhl
IGRpc3RyaWJ1dGlvbi4KKyMKKyMgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBB
TkQgSVRTIENPTlRSSUJVVE9SUyAiQVMgSVMiIEFORCBBTlkKKyMgRVhQUkVTUyBPUiBJTVBMSUVE
IFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRAor
IyBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNV
TEFSIFBVUlBPU0UgQVJFCisjIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIE9S
IElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkKKyMgRElSRUNULCBJTkRJUkVDVCwg
SU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMK
KyMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElU
VVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworIyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsg
T1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKKyMgT04gQU5ZIFRI
RU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFks
IE9SIFRPUlQKKyMgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJ
TiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisjIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURW
SVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKK2Zyb20gYnVja2V0IGlt
cG9ydCBCdWNrZXQsIEJ1Y2tldFRyZWUKK2ltcG9ydCB1bml0dGVzdAorZnJvbSByZXN1bHRfdW5p
dHRlc3QgaW1wb3J0IEZha2VSZXN1bHQKKworCitjbGFzcyBCdWNrZXRUZXN0KHVuaXR0ZXN0LlRl
c3RDYXNlKToKKyAgICBkZWYgc2V0VXAoc2VsZik6CisgICAgICAgIHNlbGYuX21hYyA9IEJ1Y2tl
dCgnbWFjJykKKyAgICAgICAgc2VsZi5fbWFjX2xlb3BhcmQgPSBCdWNrZXQoJ21hY19sZW9wYXJk
JykKKyAgICAgICAgc2VsZi5fbGludXggPSBCdWNrZXQoJ2xpbnV4JykKKyAgICAgICAgc2VsZi5f
bm9uZSA9IEJ1Y2tldChOb25lKQorCisgICAgZGVmIHRlc3RDaGlsZEJ1Y2tldEluaGVyaXRzUmVz
dWx0T2ZQYXJlbnRBc0ltcGxpY2l0UmVzdWx0KHNlbGYpOgorICAgICAgICBzZWxmLl9tYWMuc2V0
X3Jlc3VsdChGYWtlUmVzdWx0KCdtYWMnLCAndGV4dCcsICdhYmMxMjMnKSkKKyAgICAgICAgc2Vs
Zi5fbWFjLmFwcGVuZChzZWxmLl9tYWNfbGVvcGFyZCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVh
bHMoJ2FiYzEyMycsIHNlbGYuX21hY19sZW9wYXJkLmltcGxpY2l0X3Jlc3VsdCgpLmNvbnRlbnRz
KCkpCisKKyAgICBkZWYgdGVzdENvbGxhcHNlV29ya3NXaGVuQ2hpbGRIYXNFcXVhbFJlc3VsdHMo
c2VsZik6CisgICAgICAgIHNlbGYuX21hYy5zZXRfcmVzdWx0KEZha2VSZXN1bHQoJ21hYycsICd0
ZXh0JywgJ2FiYzEyMycpKQorICAgICAgICBzZWxmLl9tYWNfbGVvcGFyZC5zZXRfcmVzdWx0KEZh
a2VSZXN1bHQoJ21hYycsICd0ZXh0JywgJ2FiYzEyMycpKQorICAgICAgICBzZWxmLl9tYWMuYXBw
ZW5kKHNlbGYuX21hY19sZW9wYXJkKQorCisgICAgICAgIHNlbGYuX21hYy5jb2xsYXBzZSgpCisK
KyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHNlbGYuX21hY19sZW9wYXJkLmlzX2VtcHR5KCkpCisK
KyAgICBkZWYgdGVzdENvbGxhcHNlc0NoaWxkV2l0aEltcGxpY2l0UmVzdWx0RnJvbVBhcmVudChz
ZWxmKToKKyAgICAgICAgc2VsZi5fbWFjLnNldF9yZXN1bHQoRmFrZVJlc3VsdCgnbWFjJywgJ3Rl
eHQnLCAnYWJjMTIzJykpCisgICAgICAgIHNlbGYuX21hYy5hcHBlbmQoc2VsZi5fbWFjX2xlb3Bh
cmQpCisKKyAgICAgICAgc2VsZi5fbWFjLmNvbGxhcHNlKCkKKworICAgICAgICBzZWxmLmFzc2Vy
dFRydWUoc2VsZi5fbWFjX2xlb3BhcmQuaXNfZW1wdHkoKSkKKworICAgIGRlZiB0ZXN0Q29sbGFw
c2VzQ2hpbGRXaXRoSW1wbGljaXRSZXN1bHRBbmRFeHBsaWNpdFNpYmxpbmcoc2VsZik6CisgICAg
ICAgIHNlbGYuYXNzZXJ0VHJ1ZShzZWxmLl9tYWMuaXNfZW1wdHkoKSkKKyAgICAgICAgc2VsZi5f
bWFjLnNldF9yZXN1bHQoRmFrZVJlc3VsdCgnbWFjJywgJ3RleHQnLCAnYWJjMTIzJykpCisgICAg
ICAgIHNlbGYuYXNzZXJ0RmFsc2Uoc2VsZi5fbWFjLmlzX2VtcHR5KCkpCisgICAgICAgIHNlbGYu
X21hY19sZW9wYXJkLnNldF9yZXN1bHQoRmFrZVJlc3VsdCgnbWFjJywgJ3RleHQnLCAnYWJjMTIz
JykpCisKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShzZWxmLl9tYWMuaXNfZW1wdHkoKSkKKyAg
ICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoJ2FiYzEyMycsIHNlbGYuX21hYy5pbXBsaWNpdF9yZXN1
bHQoKS5jb250ZW50cygpKQorCisgICAgICAgIHNlbGYuX21hYy5hcHBlbmQoc2VsZi5fbWFjX2xl
b3BhcmQpCisgICAgICAgIHNlbGYuX21hYy5hcHBlbmQoc2VsZi5fbGludXgpCisKKyAgICAgICAg
c2VsZi5hc3NlcnRFcXVhbHMoJ2FiYzEyMycsIHNlbGYuX21hY19sZW9wYXJkLmltcGxpY2l0X3Jl
c3VsdCgpLmNvbnRlbnRzKCkpCisKKyAgICAgICAgc2VsZi5fbWFjLmNvbGxhcHNlKCkKKworICAg
ICAgICBzZWxmLmFzc2VydFRydWUoc2VsZi5fbGludXguaXNfZW1wdHkoKSkKKyAgICAgICAgc2Vs
Zi5hc3NlcnRUcnVlKHNlbGYuX21hY19sZW9wYXJkLmlzX2VtcHR5KCkpCisKKyAgICBkZWYgdGVz
dENsZWFyc09ubHlDaGlsZHJlblRoYXRIYXZlVGhlU2FtZVJlc3VsdHMoc2VsZik6CisgICAgICAg
IHNlbGYuX21hYy5zZXRfcmVzdWx0KEZha2VSZXN1bHQoJ21hYycsICd0ZXh0JywgJ2FiYzEyMycp
KQorICAgICAgICBzZWxmLl9tYWNfbGVvcGFyZC5zZXRfcmVzdWx0KEZha2VSZXN1bHQoJ21hYy1s
ZW9wYXJkJywgJ3RleHQnLCAnYWJjMTIzJykpCisgICAgICAgIHNlbGYuX2xpbnV4LnNldF9yZXN1
bHQoRmFrZVJlc3VsdCgnbGludXgnLCAndGV4dCcsICdkZWY0NTYnKSkKKworICAgICAgICBzZWxm
Ll9tYWMuYXBwZW5kKHNlbGYuX21hY19sZW9wYXJkKQorICAgICAgICBzZWxmLl9tYWMuYXBwZW5k
KHNlbGYuX2xpbnV4KQorCisgICAgICAgIHNlbGYuX21hYy5jb2xsYXBzZSgpCisKKyAgICAgICAg
c2VsZi5hc3NlcnRFcXVhbHMoJ2FiYzEyMycsIHNlbGYuX21hYy5pbXBsaWNpdF9yZXN1bHQoKS5j
b250ZW50cygpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscygnZGVmNDU2Jywgc2VsZi5fbGlu
dXguaW1wbGljaXRfcmVzdWx0KCkuY29udGVudHMoKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVl
KHNlbGYuX21hY19sZW9wYXJkLmlzX2VtcHR5KCkpCisKKyAgICBkZWYgdGVzdENvbGxhcHNlV29y
a3NGb3JEZXNjZW5kZW50c0RlZXBlclRoYXREaXJlY3RDaGlsZHJlbihzZWxmKToKKyAgICAgICAg
c2VsZi5fbWFjLnNldF9yZXN1bHQoRmFrZVJlc3VsdCgnbWFjJywgJ3RleHQnLCAnYWJjMTIzJykp
CisgICAgICAgIHNlbGYuX2xpbnV4LnNldF9yZXN1bHQoRmFrZVJlc3VsdCgnbGludXgnLCAndGV4
dCcsICdhYmMxMjMnKSkKKworICAgICAgICBzZWxmLl9tYWMuYXBwZW5kKHNlbGYuX21hY19sZW9w
YXJkKQorICAgICAgICBzZWxmLl9tYWNfbGVvcGFyZC5hcHBlbmQoc2VsZi5fbGludXgpCisKKyAg
ICAgICAgc2VsZi5fbWFjLmNvbGxhcHNlKCkKKworICAgICAgICBzZWxmLmFzc2VydFRydWUoc2Vs
Zi5fbGludXguaXNfZW1wdHkoKSkKKworICAgIGRlZiB0ZXN0VGhhdENvbGxhcHNpbmdNYWludGFp
bnNDb3JyZWN0UGxhdGZvcm0oc2VsZik6CisgICAgICAgIHNlbGYuX21hYy5hcHBlbmQoc2VsZi5f
bWFjX2xlb3BhcmQpCisgICAgICAgIHNlbGYuX25vbmUuYXBwZW5kKHNlbGYuX21hYykKKworICAg
ICAgICBzZWxmLl9tYWNfbGVvcGFyZC5zZXRfcmVzdWx0KEZha2VSZXN1bHQoJ21hYy1sZW9wYXJk
JywgJ3RleHQnLCAnYWJjMTIzJykpCisgICAgICAgIHNlbGYuX25vbmUuc2V0X3Jlc3VsdChGYWtl
UmVzdWx0KE5vbmUsICd0ZXh0JywgJ2RlZjQ1NicpKQorCisgICAgICAgIHNlbGYuX25vbmUuY29s
bGFwc2UoKQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKE5vbmUsIHNlbGYuX21hYy5pbXBs
aWNpdF9yZXN1bHQoKS5wbGF0Zm9ybSgpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscygnbWFj
LWxlb3BhcmQnLCBzZWxmLl9tYWNfbGVvcGFyZC5pbXBsaWNpdF9yZXN1bHQoKS5wbGF0Zm9ybSgp
KQorCisgICAgZGVmIHRlc3RQYXJlbnRXaXRoTm9SZXN1bHRXaWxsSW5oZXJpdEZyb21DaGlsZHJl
bldpdGhTYW1lUmVzdWx0KHNlbGYpOgorICAgICAgICBzZWxmLl9tYWMuc2V0X3Jlc3VsdChGYWtl
UmVzdWx0KCdtYWMnLCAndGV4dCcsICdhYmMxMjMnKSkKKyAgICAgICAgc2VsZi5fbGludXguc2V0
X3Jlc3VsdChGYWtlUmVzdWx0KCdsaW51eCcsICd0ZXh0JywgJ2FiYzEyMycpKQorCisgICAgICAg
IHNlbGYuX25vbmUuYXBwZW5kKHNlbGYuX21hYykKKyAgICAgICAgc2VsZi5fbm9uZS5hcHBlbmQo
c2VsZi5fbGludXgpCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoTm9uZSwgc2VsZi5fbm9u
ZS5pbXBsaWNpdF9yZXN1bHQoKSkKKworICAgICAgICBzZWxmLl9ub25lLmNvbGxhcHNlKCkKKwor
ICAgICAgICBzZWxmLmFzc2VydEVxdWFscygnYWJjMTIzJywgc2VsZi5fbm9uZS5pbXBsaWNpdF9y
ZXN1bHQoKS5jb250ZW50cygpKQorCisiIiIKKyAgICAgICAgVE9ETyBNYWtlIHRoaXMgaW50byB0
ZXN0cy4KKworICAgICAgICBDaGlsZHJlbiBhbGwgaGF2ZSB0aGUgc2FtZSBleHBsaWNpdCByZXN1
bHQgYXMgdGhlIHBhcmVudC4KKworICAgICAgICBBIEEgQSAgICAgICAgTyBPIE8KKyAgICAgICAg
IFx8LyAgICAtPiAgICBcfC8KKyAgICAgICAgICBBICAgICAgICAgICAgQQorCisKKyAgICAgICAg
Q2hpbGRyZW4gYWxsIGhhdmUgdGhlIHNhbWUgcmVzdWx0LCBidXQgdGhlIHBhcmVudCBoYXMgbm9u
ZS4KKworICAgICAgICBBIEEgQSAgICAgICAgTyBPIE8KKyAgICAgICAgIFx8LyAgICAtPiAgICBc
fC8KKyAgICAgICAgICBPICAgICAgICAgICAgQQorCisKKyAgICAgICAgT25lIG9mIHRoZSBjaGls
ZHJlbiBoYXMgdGhlIHNhbWUgcmVzdWx0IGFzIHRoZSBwYXJlbnQuCisKKyAgICAgICAgQSBCIEMg
ICAgICAgIE8gQiBDCisgICAgICAgICBcfC8gICAgLT4gICAgXHwvCisgICAgICAgICAgQSAgICAg
ICAgICAgIEEKKworICAgICAgICBEZXNjZW5kZW50cyBhbGwgaGF2ZSBzYW1lIGV4cGxpY2l0IHJl
c3VsdCBhcyB0aGUgYW5jZXN0b3IuCisKKyAgICAgICAgQSBBIEEgICAgICAgIE8gTyBPCisgICAg
ICAgICBcfC8gICAgLT4gICAgXHwvCisgICAgICAgICAgTyAgICAgICAgICAgIE8KKyAgICAgICAg
ICB8ICAgICAgICAgICAgfAorICAgICAgICAgIEEgICAgICAgICAgICBBCisKKyAgICAgICAgV2hl
cmUgQSBpcyBhIGJ1Y2tldCB3aXRoIGEgdGVzdCByZXN1bHQsIGFuZCBPIGlzIGFuIGVtcHR5IGJ1
Y2tldC4KKyIiIgorCisKK2NsYXNzIEJ1Y2tldFRyZWVUZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToK
KyAgICBkZWYgdGVzdE5ld0V4cGVjdGF0aW9uc092ZXJyaWRlT2xkT25lcyhzZWxmKToKKyAgICAg
ICAgYiA9IEJ1Y2tldFRyZWUoKQorICAgICAgICBtYiA9IGIubWFrZV9idWNrZXQKKyAgICAgICAg
cm9vdCA9IG1iKE5vbmUsCisgICAgICAgICAgICBtYignbWFjJyksCisgICAgICAgICAgICBtYign
bGludXgnKSwKKyAgICAgICAgICAgIG1iKCd3aW4nKSkKKworICAgICAgICBiLmluc2VydF9yZXN1
bHQoRmFrZVJlc3VsdChOb25lLCAndGV4dCcsICdhYmMxMjMnLCBUcnVlKSkKKyAgICAgICAgYi5p
bnNlcnRfcmVzdWx0KEZha2VSZXN1bHQoTm9uZSwgJ3RleHQnLCAnZGVmNDU2JykpCisKKyAgICAg
ICAgYi5jb2xsYXBzZSgpCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgxLCBsZW4oYi5yZXN1
bHRzKCkpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCdkZWY0NTYnLCBiLnJlc3VsdHMoKVsw
XS5jb250ZW50cygpKQorCisgICAgZGVmIHRlc3RSZWJhc2VsaW5pbmdTdGlsbFdvcmtzSWZOZXdS
ZXN1bHRzQXJlSW5zZXJ0ZWRGaXJzdChzZWxmKToKKyAgICAgICAgYiA9IEJ1Y2tldFRyZWUoKQor
ICAgICAgICBtYiA9IGIubWFrZV9idWNrZXQKKyAgICAgICAgcm9vdCA9IG1iKE5vbmUsCisgICAg
ICAgICAgICBtYignbWFjJyksCisgICAgICAgICAgICBtYignbGludXgnKSwKKyAgICAgICAgICAg
IG1iKCd3aW4nKSkKKworICAgICAgICBiLmluc2VydF9yZXN1bHQoRmFrZVJlc3VsdChOb25lLCAn
dGV4dCcsICdkZWY0NTYnKSkKKyAgICAgICAgYi5pbnNlcnRfcmVzdWx0KEZha2VSZXN1bHQoTm9u
ZSwgJ3RleHQnLCAnYWJjMTIzJywgVHJ1ZSkpCisKKyAgICAgICAgYi5jb2xsYXBzZSgpCisKKyAg
ICAgICAgc2VsZi5hc3NlcnRFcXVhbCgxLCBsZW4oYi5yZXN1bHRzKCkpKQorICAgICAgICBzZWxm
LmFzc2VydEVxdWFsKCdkZWY0NTYnLCBiLnJlc3VsdHMoKVswXS5jb250ZW50cygpKQorCisgICAg
ZGVmIHRlc3RLaWRzSGF2aW5nU2FtZVJlYmFzZWxpbmVDYXVzZXNPdmVycmlkZU9uUGFyZW50KHNl
bGYpOgorICAgICAgICBiID0gQnVja2V0VHJlZSgpCisgICAgICAgIG1iID0gYi5tYWtlX2J1Y2tl
dAorICAgICAgICByb290ID0gbWIoTm9uZSwKKyAgICAgICAgICAgIG1iKCdtYWMnKSwKKyAgICAg
ICAgICAgIG1iKCd3aW4nKSkKKyAgICAgICAgYi5nZXRfYnVja2V0KE5vbmUpLm1hcmtfYXNfYWdn
cmVnYXRlKCkKKworICAgICAgICBiLmluc2VydF9yZXN1bHQoRmFrZVJlc3VsdChOb25lLCAndGV4
dCcsICdvbGQgcmVzdWx0JywgVHJ1ZSkpCisgICAgICAgIGIuaW5zZXJ0X3Jlc3VsdChGYWtlUmVz
dWx0KCdtYWMnLCAndGV4dCcsICduZXcgcmVzdWx0JykpCisgICAgICAgIGIuaW5zZXJ0X3Jlc3Vs
dChGYWtlUmVzdWx0KCd3aW4nLCAndGV4dCcsICduZXcgcmVzdWx0JykpCisKKyAgICAgICAgYi5j
b2xsYXBzZSgpCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgxLCBsZW4oYi5yZXN1bHRzKCkp
KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKE5vbmUsIGIucmVzdWx0cygpWzBdLnBsYXRmb3Jt
KCkpCisKKyAgICBkZWYgdGVzdFdlRG9udEluaGVyaXRGcm9tQ2hpbGRyZW5JZldlQXJlTm90QW5B
Z2dyZWdhdGVCdWNrZXQoc2VsZik6CisgICAgICAgIGIgPSBCdWNrZXRUcmVlKCkKKyAgICAgICAg
bWIgPSBiLm1ha2VfYnVja2V0CisgICAgICAgIHJvb3QgPSBtYihOb25lLAorICAgICAgICAgICAg
bWIoJ21hYycpLAorICAgICAgICAgICAgbWIoJ3dpbicpKQorCisgICAgICAgIGIuaW5zZXJ0X3Jl
c3VsdChGYWtlUmVzdWx0KE5vbmUsICd0ZXh0JywgJ29sZCByZXN1bHQnLCBUcnVlKSkKKyAgICAg
ICAgYi5pbnNlcnRfcmVzdWx0KEZha2VSZXN1bHQoJ21hYycsICd0ZXh0JywgJ25ldyByZXN1bHQn
KSkKKyAgICAgICAgYi5pbnNlcnRfcmVzdWx0KEZha2VSZXN1bHQoJ3dpbicsICd0ZXh0JywgJ25l
dyByZXN1bHQnKSkKKworICAgICAgICBiLmNvbGxhcHNlKCkKKworICAgICAgICBzZWxmLmFzc2Vy
dEVxdWFsKDMsIGxlbihiLnJlc3VsdHMoKSkpCisKKyAgICBkZWYgdGVzdE11bHRpUGhhc2VkQ29s
bGFwc2VXb3JrcyhzZWxmKToKKyAgICAgICAgYiA9IEJ1Y2tldFRyZWUoKQorICAgICAgICBtYiA9
IGIubWFrZV9idWNrZXQKKyAgICAgICAgcm9vdCA9IG1iKE5vbmUsCisgICAgICAgICAgICBtYign
bWFjJywKKyAgICAgICAgICAgICAgICBtYignbWFjLWxlb3BhcmQnKSkpCisKKyAgICAgICAgYi5n
ZXRfYnVja2V0KE5vbmUpLm1hcmtfYXNfYWdncmVnYXRlKCkKKworICAgICAgICBiLmluc2VydF9y
ZXN1bHQoRmFrZVJlc3VsdChOb25lLCAndGV4dCcsICdvbGQgcmVzdWx0JywgVHJ1ZSkpCisgICAg
ICAgIGIuaW5zZXJ0X3Jlc3VsdChGYWtlUmVzdWx0KCdtYWMnLCAndGV4dCcsICduZXcgcmVzdWx0
JykpCisgICAgICAgIGIuaW5zZXJ0X3Jlc3VsdChGYWtlUmVzdWx0KCdtYWMtbGVvcGFyZCcsICd0
ZXh0JywgJ25ldyByZXN1bHQnKSkKKworICAgICAgICBiLmNvbGxhcHNlKCkKKworICAgICAgICBz
ZWxmLmFzc2VydEVxdWFsKDEsIGxlbihiLnJlc3VsdHMoKSkpCisKKyAgICBkZWYgdGVzdFBsYWlu
T2xkRGVkdXBlT25MYXlvdXRUZXN0c1dvcmtzKHNlbGYpOgorICAgICAgICBiID0gQnVja2V0VHJl
ZSgpCisgICAgICAgIG1iID0gYi5tYWtlX2J1Y2tldAorICAgICAgICByb290ID0gbWIoTm9uZSwK
KyAgICAgICAgICAgIG1iKCdtYWMnLAorICAgICAgICAgICAgICAgIG1iKCdtYWMtbGVvcGFyZCcs
CisgICAgICAgICAgICAgICAgICAgIG1iKCdtYWMtc25vd2xlb3BhcmQnKSkpLAorICAgICAgICAg
ICAgbWIoJ2xpbnV4JywKKyAgICAgICAgICAgICAgICBtYignY2hyb21pdW0tbGludXgnKSkpCisK
KyAgICAgICAgYi5pbnNlcnRfcmVzdWx0KEZha2VSZXN1bHQoTm9uZSwgJ3RleHQnLCAncmVzdWx0
JywgVHJ1ZSkpCisgICAgICAgIGIuaW5zZXJ0X3Jlc3VsdChGYWtlUmVzdWx0KCdjaHJvbWl1bS1s
aW51eCcsICd0ZXh0JywgJ3Jlc3VsdCcsIFRydWUpKQorCisgICAgICAgIGIuY29sbGFwc2UoKQor
CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKDEsIGxlbihiLnJlc3VsdHMoKSkpCisgICAgICAg
IHNlbGYuYXNzZXJ0RXF1YWxzKE5vbmUsIGIucmVzdWx0cygpWzBdLnBsYXRmb3JtKCkpCisKKyAg
ICBkZWYgdGVzdENvbGxhcHNlT25CdWNrZXRzV2l0aE5vUmVzdWx0RG9lc250Q3Jhc2goc2VsZik6
CisgICAgICAgIGIgPSBCdWNrZXRUcmVlKCkKKyAgICAgICAgbWIgPSBiLm1ha2VfYnVja2V0Cisg
ICAgICAgIHJvb3QgPSBtYihOb25lLAorICAgICAgICAgICAgbWIoJ21hYycsCisgICAgICAgICAg
ICAgICAgbWIoJ21hYy1sZW9wYXJkJykpKQorCisgICAgICAgIGIuY29sbGFwc2UoKQorCitpZiBf
X25hbWVfXyA9PSAnX19tYWluX18nOgorICAgIHVuaXR0ZXN0Lm1haW4oKQpkaWZmIC0tZ2l0IGEv
V2ViS2l0VG9vbHMvU2NyaXB0cy93ZWJraXRweS90b29sL2NvbW1hbmRzL3JlYmFzZWxpbmUyL2J1
aWxkZXIucHkgYi9XZWJLaXRUb29scy9TY3JpcHRzL3dlYmtpdHB5L3Rvb2wvY29tbWFuZHMvcmVi
YXNlbGluZTIvYnVpbGRlci5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwLi5iNTA0YzZiZWEzOTBhYjgxMmM1MzllYzY3
ZmU5MzJjZDdiNzdiMmQyCi0tLSAvZGV2L251bGwKKysrIGIvV2ViS2l0VG9vbHMvU2NyaXB0cy93
ZWJraXRweS90b29sL2NvbW1hbmRzL3JlYmFzZWxpbmUyL2J1aWxkZXIucHkKQEAgLTAsMCArMSwx
MTAgQEAKKyMhL3Vzci9iaW4vZW52IHB5dGhvbgorIyBDb3B5cmlnaHQgKEMpIDIwMTAgR29vZ2xl
IEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyMKKyMgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBp
biBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisjIG1vZGlmaWNhdGlv
biwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwor
IyBhcmUgbWV0OgorIworIyAxLiAgUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3Qg
cmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyMgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNv
bmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyMgMi4gIFJlZGlzdHJpYnV0
aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Cisj
ICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRp
c2NsYWltZXIgaW4gdGhlCisjICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlh
bHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorIworIyBUSElTIFNPRlRXQVJFIElT
IFBST1ZJREVEIEJZIEFQUExFIEFORCBJVFMgQ09OVFJJQlVUT1JTICJBUyBJUyIgQU5EIEFOWQor
IyBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlU
RUQgVE8sIFRIRSBJTVBMSUVECisjIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBG
SVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKKyMgRElTQ0xBSU1FRC4gSU4gTk8g
RVZFTlQgU0hBTEwgQVBQTEUgT1IgSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWQor
IyBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENP
TlNFUVVFTlRJQUwgREFNQUdFUworIyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBS
T0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisjIExPU1MgT0YgVVNF
LCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FV
U0VEIEFORAorIyBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFD
VCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorIyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1Ig
T1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKyMgVEhJUyBT
T0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFH
RS4KKworZnJvbSB3ZWJraXRweS5jb21tb24uZGlyYXN6aXAgaW1wb3J0IERpcmVjdG9yeUFzWmlw
Citmcm9tIHdlYmtpdHB5LmNvbW1vbi5uZXQucmVtb3RlemlwIGltcG9ydCBSZW1vdGVaaXAKK2Zy
b20gd2Via2l0cHkuY29tbW9uLm5ldC5yZXN1bHRzZXQgaW1wb3J0IFJlc3VsdFNldCwgQWdncmVn
YXRlUmVzdWx0U2V0CitpbXBvcnQgd2Via2l0cHkuY29tbW9uLm5ldC5yZXN1bHQKK2ltcG9ydCBy
ZQoraW1wb3J0IHVybGxpYgorCisKKyMgVE9ETyBUaGlzIGNsYXNzIGlzIHNpbWlsYXIgdG8gV2Vi
S2l0QnVpbGRlciBzbyB3ZSBzaG91bGQgcHJvYmFibHkgZXh0cmFjdCBhCisjIGJhc2UgY2xhc3Mu
CitjbGFzcyBDaHJvbWl1bUJ1aWxkZXIob2JqZWN0KToKKyAgICBCVUlMREVSUyA9IHsKKyAgICAg
ICAgJ2Nocm9taXVtLW1hYyc6ICdXZWJraXRfTWFjMTBfNScsCisgICAgICAgICdjaHJvbWl1bS13
aW4tdmlzdGEnOiAnV2Via2l0X1dpbicsCisgICAgICAgICdjaHJvbWl1bS1saW51eCc6ICdXZWJr
aXRfTGludXhfVGVzdHNfX2RiZ19fMV8nLAorICAgIH0KKworICAgIGRlZiBsb29rdXBfcmVzdWx0
X3ppcChzZWxmLCBidWlsZGVyX25hbWUpOgorICAgICAgICByZXR1cm4gJ2h0dHA6Ly9idWlsZC5j
aHJvbWl1bS5vcmcvZi9jaHJvbWl1bS9sYXlvdXRfdGVzdF9yZXN1bHRzLycgKyBidWlsZGVyX25h
bWUgKyAnL2xheW91dC10ZXN0LXJlc3VsdHMuemlwJworCisgICAgZGVmIHBsYXRmb3JtcyhzZWxm
KToKKyAgICAgICAgcmV0dXJuIENocm9taXVtQnVpbGRlci5CVUlMREVSUy5rZXlzKCkKKworICAg
IGRlZiBsb29rdXBfYnVpbGRlcl9uYW1lKHNlbGYsIHBsYXRmb3JtKToKKyAgICAgICAgaWYgcGxh
dGZvcm0gaW4gQ2hyb21pdW1CdWlsZGVyLkJVSUxERVJTLmtleXMoKToKKyAgICAgICAgICAgIHJl
dHVybiBDaHJvbWl1bUJ1aWxkZXIuQlVJTERFUlNbcGxhdGZvcm1dCisgICAgICAgIHJldHVybiBO
b25lCisKKyAgICBkZWYgYnVpbGRlcnMoc2VsZiwgcGxhdGZvcm1zPU5vbmUpOgorICAgICAgICBp
ZiBwbGF0Zm9ybXMgaXMgTm9uZToKKyAgICAgICAgICAgIHBsYXRmb3JtcyA9IENocm9taXVtQnVp
bGRlci5CVUlMREVSUy5rZXlzKCkKKyAgICAgICAgcmV0dXJuIEFnZ3JlZ2F0ZUJ1aWxkZXIobWFw
KHNlbGYuYnVpbGRlciwgcGxhdGZvcm1zKSkKKworICAgIGRlZiBidWlsZGVyKHNlbGYsIHBsYXRm
b3JtKToKKyAgICAgICAgaWYgcGxhdGZvcm0gbm90IGluIHNlbGYucGxhdGZvcm1zKCk6CisgICAg
ICAgICAgICByYWlzZSAiJyVzJyBpcyBub3QgYSByZWNvZ25pc2VkIGNocm9taXVtIHBsYXRmb3Jt
IiAlIHBsYXRmb3JtCisgICAgICAgIGJ1aWxkZXJfbmFtZSA9IHNlbGYubG9va3VwX2J1aWxkZXJf
bmFtZShwbGF0Zm9ybSkKKyAgICAgICAgemlwX3VybCA9IHNlbGYubG9va3VwX3Jlc3VsdF96aXAo
YnVpbGRlcl9uYW1lKQorICAgICAgICBwcmludCAiR290ICVzIiAlIHppcF91cmwKKyAgICAgICAg
cmV0dXJuIEJ1aWxkZXIoYnVpbGRlcl9uYW1lLCBwbGF0Zm9ybSwgUmVtb3RlWmlwKHppcF91cmwp
LCBpbmNsdWRlX2V4cGVjdGVkPUZhbHNlKQorCisKK2NsYXNzIFdlYktpdEJ1aWxkZXIob2JqZWN0
KToKKyAgICBCVUlMREVSUyA9IHsKKyAgICAgICAgJ21hYy1zbm93bGVvcGFyZCc6ICdTbm93TGVv
cGFyZCUyMEludGVsJTIwUmVsZWFzZSUyMChUZXN0cyknLAorICAgICAgICAnbWFjLWxlb3BhcmQn
OiAnTGVvcGFyZCUyMEludGVsJTIwRGVidWclMjAoVGVzdHMpJywKKyAgICAgICAgJ3dpbic6ICdX
aW5kb3dzJTIwNyUyMFJlbGVhc2UlMjAoV2ViS2l0MiUyMFRlc3RzKScsCisgICAgICAgICdjaHJv
bWl1bS1saW51eCc6ICdHVEslMjBMaW51eCUyMDMyLWJpdCUyMFJlbGVhc2UnLAorICAgIH0KKwor
ICAgIGRlZiBwbGF0Zm9ybXMoc2VsZik6CisgICAgICAgIHJldHVybiBXZWJLaXRCdWlsZGVyLkJV
SUxERVJTLmtleXMoKQorCisgICAgZGVmIGxvb2t1cF9idWlsZGVyX25hbWUoc2VsZiwgcGxhdGZv
cm0pOgorICAgICAgICByZXR1cm4gV2ViS2l0QnVpbGRlci5CVUlMREVSU1twbGF0Zm9ybV0KKwor
ICAgIGRlZiBsb29rdXBfcmVzdWx0X3ppcChzZWxmLCBidWlsZGVyX25hbWUpOgorICAgICAgICAi
IiJHZXRzIHRoZSBVUkwgb2YgYSB6aXBmaWxlIGNvbnRhaW5pbmcgdGhlIGxhdGVzdCByZXN1bHRz
IGJ5IHNjcmFwaW5nIHRoZQorICAgICAgICAgICAgICBIVE1MIGRpcmVjdG9yeSBsaXN0aW5nIG9m
IHRoZSBidWlsZGVyIiIiCisgICAgICAgIHJlc3VsdHNfZGlyX3VybCA9ICdodHRwOi8vYnVpbGQu
d2Via2l0Lm9yZy9yZXN1bHRzLycgKyBidWlsZGVyX25hbWUgKyAnLycKKworICAgICAgICAjIHBy
aW50ICJMb29raW5nIGluICVzIGZvciB6aXBzIiAlIHJlc3VsdHNfZGlyX3VybAorICAgICAgICBm
ID0gdXJsbGliLnVybG9wZW4ocmVzdWx0c19kaXJfdXJsKQorICAgICAgICB6aXBfdXJsID0gTm9u
ZQorICAgICAgICBocmVmX3JlID0gcmUuY29tcGlsZShyJ2EgaHJlZj0iKC4qXC56aXApIj4nKQor
ICAgICAgICBmb3IgbGluZSBpbiBmOgorICAgICAgICAgICAgbWF0Y2ggPSBocmVmX3JlLnNlYXJj
aChsaW5lKQorICAgICAgICAgICAgaWYgbWF0Y2g6CisgICAgICAgICAgICAgICAgemlwX3VybCA9
IG1hdGNoLmdyb3VwKDEpCisKKyAgICAgICAgaWYgemlwX3VybCBpcyBOb25lOgorICAgICAgICAg
ICAgcmFpc2UgRXhjZXB0aW9uKCJDb3VsZG4ndCBmaW5kIGFueSByZXN1bHRzIGFyY2hpdmVzIG9u
IHRoZSBXZWJLaXQgYnVpbGRlciAnJXMnIiAlIGJ1aWxkZXJfbmFtZSkKKworICAgICAgICByZXR1
cm4gcmVzdWx0c19kaXJfdXJsICsgemlwX3VybAorCisgICAgZGVmIGJ1aWxkZXJzKHNlbGYsIHBs
YXRmb3Jtcz1Ob25lKToKKyAgICAgICAgaWYgcGxhdGZvcm1zIGlzIE5vbmU6CisgICAgICAgICAg
ICBwbGF0Zm9ybXMgPSBzZWxmLnBsYXRmb3JtcygpCisgICAgICAgIHJldHVybiBBZ2dyZWdhdGVS
ZXN1bHRTZXQobWFwKHNlbGYuYnVpbGRlciwgcGxhdGZvcm1zKSkKKworICAgIGRlZiBidWlsZGVy
KHNlbGYsIHBsYXRmb3JtKToKKyAgICAgICAgaWYgcGxhdGZvcm0gbm90IGluIHNlbGYucGxhdGZv
cm1zKCk6CisgICAgICAgICAgICByYWlzZSBFeGNlcHRpb24oIiclcycgaXMgbm90IGEgcmVjb2du
aXNlZCB3ZWJraXQgcGxhdGZvcm0iICUgcGxhdGZvcm0pCisgICAgICAgIGJ1aWxkZXJfbmFtZSA9
IHNlbGYubG9va3VwX2J1aWxkZXJfbmFtZShwbGF0Zm9ybSkKKyAgICAgICAgemlwX3VybCA9IHNl
bGYubG9va3VwX3Jlc3VsdF96aXAoYnVpbGRlcl9uYW1lKQorICAgICAgICByZXR1cm4gUmVzdWx0
U2V0KGJ1aWxkZXJfbmFtZSwgcGxhdGZvcm0sIFJlbW90ZVppcCh6aXBfdXJsKSwgaW5jbHVkZV9l
eHBlY3RlZD1GYWxzZSkKZGlmZiAtLWdpdCBhL1dlYktpdFRvb2xzL1NjcmlwdHMvd2Via2l0cHkv
dG9vbC9jb21tYW5kcy9yZWJhc2VsaW5lMi9idWlsZGVyX3VuaXR0ZXN0LnB5IGIvV2ViS2l0VG9v
bHMvU2NyaXB0cy93ZWJraXRweS90b29sL2NvbW1hbmRzL3JlYmFzZWxpbmUyL2J1aWxkZXJfdW5p
dHRlc3QucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMC4uNTgyZjc3MjUwYTgwNmY0ZDAwMjQyZTM1N2E4YWNiNDFiMTRm
NmMzNAotLS0gL2Rldi9udWxsCisrKyBiL1dlYktpdFRvb2xzL1NjcmlwdHMvd2Via2l0cHkvdG9v
bC9jb21tYW5kcy9yZWJhc2VsaW5lMi9idWlsZGVyX3VuaXR0ZXN0LnB5CkBAIC0wLDAgKzEsMTUy
IEBACisjIS91c3IvYmluL2VudiBweXRob24KKyMgQ29weXJpZ2h0IChDKSAyMDEwIEdvb2dsZSBJ
bmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisjCisjIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4g
c291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorIyBtb2RpZmljYXRpb24s
IGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyMg
YXJlIG1ldDoKKyMKKyMgMS4gIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJl
dGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisjICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25k
aXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisjIDIuICBSZWRpc3RyaWJ1dGlv
bnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorIyAg
ICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNj
bGFpbWVyIGluIHRoZQorIyAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxz
IHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyMKKyMgVEhJUyBTT0ZUV0FSRSBJUyBQ
Uk9WSURFRCBCWSBBUFBMRSBBTkQgSVRTIENPTlRSSUJVVE9SUyAiQVMgSVMiIEFORCBBTlkKKyMg
RVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVE
IFRPLCBUSEUgSU1QTElFRAorIyBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklU
TkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCisjIERJU0NMQUlNRUQuIElOIE5PIEVW
RU5UIFNIQUxMIEFQUExFIE9SIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkKKyMg
RElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05T
RVFVRU5USUFMIERBTUFHRVMKKyMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9D
VVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworIyBMT1NTIE9GIFVTRSwg
REFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNF
RCBBTkQKKyMgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1Qs
IFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyMgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9U
SEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisjIFRISVMgU09G
VFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0Uu
CisKK2Zyb20gd2Via2l0cHkuY29tbW9uLm5ldC5yZW1vdGV6aXAgaW1wb3J0IFppcEZpbGVIYW5k
bGUKK2ltcG9ydCBidWlsZGVyCitpbXBvcnQgdW5pdHRlc3QKKworCitjbGFzcyBGYWtlWmlwKG9i
amVjdCk6CisgICAgZGVmIF9faW5pdF9fKHNlbGYpOgorICAgICAgICBzZWxmLl9maWxlcyA9IHt9
CisKKyAgICBkZWYgX19zdHJfXyhzZWxmKToKKyAgICAgICAgcmV0dXJuICJGYWtlWmlwIgorCisg
ICAgZGVmIGluc2VydChzZWxmLCBmaWxlbmFtZSwgY29udGVudCk6CisgICAgICAgIHNlbGYuX2Zp
bGVzW2ZpbGVuYW1lXSA9IGNvbnRlbnQKKworICAgIGRlZiBuYW1lbGlzdChzZWxmKToKKyAgICAg
ICAgcmV0dXJuIHNlbGYuX2ZpbGVzLmtleXMoKQorCisgICAgZGVmIGhhbmRsZV90byhzZWxmLCBm
aWxlbmFtZSk6CisgICAgICAgIHJldHVybiBaaXBGaWxlSGFuZGxlKHNlbGYsIGZpbGVuYW1lKQor
CisgICAgZGVmIHJlYWQoc2VsZiwgZmlsZW5hbWUpOgorICAgICAgICByZXR1cm4gc2VsZi5fZmls
ZXNbZmlsZW5hbWVdCisKKyAgICBkZWYgZXh0cmFjdChzZWxmLCBmaWxlbmFtZSwgcGF0aCk6Cisg
ICAgICAgIHByaW50ICJGYWtlWmlwPiBjcCAlcyAlcyIgJSAoZmlsZW5hbWUsIHBhdGgpCisKKyAg
ICBkZWYgZGVsZXRlKHNlbGYsIGZpbGVuYW1lKToKKyAgICAgICAgcHJpbnQgIkZha2VaaXA+IHJt
ICVzIiAlIGZpbGVuYW1lCisgICAgICAgIHNlbGYuX2ZpbGVzW2ZpbGVuYW1lXSA9IE5vbmUKKwor
CitjbGFzcyBCdWlsZGVyVGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgZGVmIF9idWlsZGVy
X3dpdGhfemlwKHNlbGYsIHppcCwgKiprd2FyZ3MpOgorICAgICAgICByZXR1cm4gYnVpbGRlci5C
dWlsZGVyKCc8ZmFrZS1idWlsZGVyPicsICc8ZmFrZS1wbGF0Zm9ybT4nLCB6aXAsICoqa3dhcmdz
KQorCisgICAgZGVmIHRlc3RUZXh0RmlsZXNHZXRJbnRlcnByZXRlZEFzVGV4dFJlc3VsdHMoc2Vs
Zik6CisgICAgICAgIHppcCA9IEZha2VaaXAoKQorICAgICAgICB6aXAuaW5zZXJ0KCdmYXN0L2Rv
bS9zb21lLXRlc3QtYWN0dWFsLnR4dCcsICdhY3R1YWwgcmVzdWx0cycpCisgICAgICAgIGIgPSBz
ZWxmLl9idWlsZGVyX3dpdGhfemlwKHppcCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoMSwg
bGVuKGIucmVzdWx0c19mb3IoJ2Zhc3QvZG9tL3NvbWUtdGVzdCcpKSkKKyAgICAgICAgc2VsZi5h
c3NlcnRFcXVhbHMoJ2Zhc3QvZG9tL3NvbWUtdGVzdCcsIGIucmVzdWx0c19mb3IoJ2Zhc3QvZG9t
L3NvbWUtdGVzdC5odG1sJylbMF0ubmFtZSgpKQorCisgICAgZGVmIHRlc3RJbWFnZUFuZENoZWNr
c3VtRmlsZXNHZXRJbnRlcnByZXRlZEFzQVNpbmdsZUltYWdlUmVzdWx0KHNlbGYpOgorICAgICAg
ICB6aXAgPSBGYWtlWmlwKCkKKyAgICAgICAgemlwLmluc2VydCgnZmFzdC9kb20vc29tZS10ZXN0
LWFjdHVhbC5jaGVja3N1bScsICdhYmMxMjMnKQorICAgICAgICB6aXAuaW5zZXJ0KCdmYXN0L2Rv
bS9zb21lLXRlc3QtYWN0dWFsLnBuZycsICc8aW1hZ2UgZGF0YT4nKQorICAgICAgICBiID0gc2Vs
Zi5fYnVpbGRlcl93aXRoX3ppcCh6aXApCisgICAgICAgIHJlc3VsdHMgPSBiLnJlc3VsdHNfZm9y
KCdmYXN0L2RvbS9zb21lLXRlc3QnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscygxLCBsZW4o
cmVzdWx0cykpCisgICAgICAgIHJlc3VsdCA9IHJlc3VsdHNbMF0KKyAgICAgICAgc2VsZi5hc3Nl
cnRFcXVhbHMoJ2ltYWdlJywgcmVzdWx0LnR5cGUoKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVh
bHMoJ2FiYzEyMycsIHJlc3VsdC5jb250ZW50cygpKQorCisgICAgZGVmIHRlc3RNdWx0aXBsZUlt
YWdlUmVzdWx0c0FyZURldGVjdGVkKHNlbGYpOgorICAgICAgICB6aXAgPSBGYWtlWmlwKCkKKyAg
ICAgICAgemlwLmluc2VydCgncGxhdGZvcm0vd2luL2Zhc3QvZG9tL3NvbWUtdGVzdC1hY3R1YWwu
Y2hlY2tzdW0nLCAnY2hlY2tzdW0xJykKKyAgICAgICAgemlwLmluc2VydCgncGxhdGZvcm0vd2lu
L2Zhc3QvZG9tL3NvbWUtdGVzdC1hY3R1YWwucG5nJywgJzxpbWFnZSBkYXRhIDE+JykKKyAgICAg
ICAgemlwLmluc2VydCgncGxhdGZvcm0vbWFjL2Zhc3QvZG9tL3NvbWUtdGVzdC1hY3R1YWwuY2hl
Y2tzdW0nLCAnY2hlY2tzdW0yJykKKyAgICAgICAgemlwLmluc2VydCgncGxhdGZvcm0vbWFjL2Zh
c3QvZG9tL3NvbWUtdGVzdC1hY3R1YWwucG5nJywgJzxpbWFnZSBkYXRhIDI+JykKKyAgICAgICAg
YiA9IHNlbGYuX2J1aWxkZXJfd2l0aF96aXAoemlwKQorICAgICAgICByZXN1bHRzID0gYi5yZXN1
bHRzX2ZvcignZmFzdC9kb20vc29tZS10ZXN0JykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMo
MiwgbGVuKHJlc3VsdHMpKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKHJlc3VsdHNbMF0uc2Ft
ZV9jb250ZW50KHJlc3VsdHNbMV0pKQorCisgICAgZGVmIHRlc3RBZ2dyZWdhdGVCdWlsZGVyQ29y
cmVjdGx5UmV0cmlldmVzVGVzdHNGcm9tTXVsdGlwbGVCdWlsZGVycyhzZWxmKToKKyAgICAgICAg
YnVpbGRlcjFfemlwID0gRmFrZVppcCgpCisgICAgICAgIGJ1aWxkZXIxX3ppcC5pbnNlcnQoJ2Zh
c3QvZG9tL3Rlc3QtYWN0dWFsLnR4dCcsICdsaW51eCB0ZXh0IHJlc3VsdCcpCisgICAgICAgIGJ1
aWxkZXIxID0gYnVpbGRlci5CdWlsZGVyKCdsaW51eC1idWlsZGVyJywgJ2xpbnV4JywgYnVpbGRl
cjFfemlwKQorICAgICAgICBidWlsZGVyMl96aXAgPSBGYWtlWmlwKCkKKyAgICAgICAgYnVpbGRl
cjJfemlwLmluc2VydCgnZmFzdC9kb20vdGVzdC1hY3R1YWwudHh0JywgJ3dpbmRvd3MgdGV4dCBy
ZXN1bHQnKQorICAgICAgICBidWlsZGVyMiA9IGJ1aWxkZXIuQnVpbGRlcignd2luLWJ1aWxkZXIn
LCAnd2luJywgYnVpbGRlcjJfemlwKQorCisgICAgICAgIGIgPSBidWlsZGVyLkFnZ3JlZ2F0ZUJ1
aWxkZXIoW2J1aWxkZXIxLCBidWlsZGVyMl0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKDIs
IGxlbihiLnJlc3VsdHNfZm9yKCdmYXN0L2RvbS90ZXN0JykpKQorCisgICAgZGVmIHRlc3RDYW5J
bmZlclBsYXRmb3JtRnJvbVBhdGhJZk5vbmVQcm92aWRlZChzZWxmKToKKyAgICAgICAgemlwID0g
RmFrZVppcCgpCisgICAgICAgIHppcC5pbnNlcnQoJ3BsYXRmb3JtL3dpbi9zb21lLXRlc3QtZXhw
ZWN0ZWQucG5nJywgJzxpbWFnZSBkYXRhPicpCisgICAgICAgIHppcC5pbnNlcnQoJ3BsYXRmb3Jt
L3dpbi9zb21lLXRlc3QtZXhwZWN0ZWQuY2hlY2tzdW0nLCAnYWJjMTIzJykKKyAgICAgICAgYiA9
IGJ1aWxkZXIuQnVpbGRlcignbG9jYWwgTGF5b3V0VGVzdHMgYnVpbGRlcicsIE5vbmUsIHppcCkK
KworICAgICAgICByZXN1bHRzID0gYi5yZXN1bHRzX2Zvcignc29tZS10ZXN0JykKKyAgICAgICAg
c2VsZi5hc3NlcnRFcXVhbHMoMSwgbGVuKHJlc3VsdHMpKQorICAgICAgICBzZWxmLmFzc2VydEVx
dWFscygnd2luJywgcmVzdWx0c1swXS5wbGF0Zm9ybSgpKQorCisgICAgZGVmIHRlc3RUZXN0RXh0
ZW5zaW9uSXNJZ25vcmVkKHNlbGYpOgorICAgICAgICB6aXAgPSBGYWtlWmlwKCkKKyAgICAgICAg
emlwLmluc2VydCgndGVzdC90ZXN0LWEtYWN0dWFsLnR4dCcsICdhY3R1YWwgcmVzdWx0cycpCisg
ICAgICAgIGIgPSBzZWxmLl9idWlsZGVyX3dpdGhfemlwKHppcCkKKyAgICAgICAgcmVzdWx0cyA9
IGIucmVzdWx0c19mb3IoJ3Rlc3QvdGVzdC1hLmh0bWwnKQorICAgICAgICBzZWxmLmFzc2VydEVx
dWFscygxLCBsZW4ocmVzdWx0cykpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKCd0ZXN0L3Rl
c3QtYScsIHJlc3VsdHNbMF0ubmFtZSgpKQorCisgICAgZGVmIHRlc3RFeGlzdGluZ1Jlc3VsdHNB
cmVNYXJrZWRBc1N1Y2goc2VsZik6CisgICAgICAgIHppcCA9IEZha2VaaXAoKQorICAgICAgICB6
aXAuaW5zZXJ0KCd0ZXN0L3Rlc3QtYS1leHBlY3RlZC50eHQnLCAnZXhwZWN0ZWQgcmVzdWx0cycp
CisgICAgICAgIGIgPSBzZWxmLl9idWlsZGVyX3dpdGhfemlwKHppcCkKKyAgICAgICAgcmVzdWx0
cyA9IGIucmVzdWx0c19mb3IoJ3Rlc3QvdGVzdC1hLmh0bWwnKQorICAgICAgICBzZWxmLmFzc2Vy
dEVxdWFscygxLCBsZW4ocmVzdWx0cykpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UocmVzdWx0
c1swXS5pc19hY3R1YWwoKSkKKworICAgIGRlZiB0ZXN0T25seVJldHVybnNSZXN1bHRzT2ZTcGVj
aWZpZWRUeXBlKHNlbGYpOgorICAgICAgICB6aXAgPSBGYWtlWmlwKCkKKyAgICAgICAgemlwLmlu
c2VydCgndGVzdC90ZXN0LWEtZXhwZWN0ZWQudHh0JywgJ2V4cGVjdGVkIHJlc3VsdHMnKQorICAg
ICAgICB6aXAuaW5zZXJ0KCd0ZXN0L3Rlc3QtYS1leHBlY3RlZC5jaGVja3N1bScsICdleHBlY3Rl
ZCByZXN1bHRzJykKKyAgICAgICAgemlwLmluc2VydCgndGVzdC90ZXN0LWEtZXhwZWN0ZWQucG5n
JywgJ2V4cGVjdGVkIHJlc3VsdHMnKQorICAgICAgICBiID0gc2VsZi5fYnVpbGRlcl93aXRoX3pp
cCh6aXApCisKKyAgICAgICAgcmVzdWx0cyA9IGIucmVzdWx0c19mb3IoJ3Rlc3QvdGVzdC1hLmh0
bWwnKQorICAgICAgICB0ZXh0X3Jlc3VsdHMgPSBiLnJlc3VsdHNfZm9yKCd0ZXN0L3Rlc3QtYS5o
dG1sJywgdGFyZ2V0X3R5cGU9J3RleHQnKQorICAgICAgICBpbWFnZV9yZXN1bHRzID0gYi5yZXN1
bHRzX2ZvcigndGVzdC90ZXN0LWEuaHRtbCcsIHRhcmdldF90eXBlPSdpbWFnZScpCisKKyAgICAg
ICAgc2VsZi5hc3NlcnRFcXVhbHMoMiwgbGVuKHJlc3VsdHMpKQorICAgICAgICBzZWxmLmFzc2Vy
dEVxdWFscygxLCBsZW4odGV4dF9yZXN1bHRzKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMo
MSwgbGVuKGltYWdlX3Jlc3VsdHMpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscygndGV4dCcs
IHRleHRfcmVzdWx0c1swXS50eXBlKCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKCdpbWFn
ZScsIGltYWdlX3Jlc3VsdHNbMF0udHlwZSgpKQorCisgICAgZGVmIHRlc3RFeGNsdWRlRXhwZWN0
ZWRSZXN1bHRzV29ya3Moc2VsZik6CisgICAgICAgIHppcCA9IEZha2VaaXAoKQorICAgICAgICB6
aXAuaW5zZXJ0KCd0ZXN0LWV4cGVjdGVkLnR4dCcsICAnZXhwZWN0ZWQgcmVzdWx0cyBzdG9yZWQg
b24gc2VydmVyIGZvciBzb21lIHJlYXNvbicpCisgICAgICAgIGIgPSBzZWxmLl9idWlsZGVyX3dp
dGhfemlwKHppcCwgaW5jbHVkZV9leHBlY3RlZD1GYWxzZSkKKyAgICAgICAgcmVzdWx0cyA9IGIu
cmVzdWx0c19mb3IoJ3Rlc3QnLCB0YXJnZXRfdHlwZT1Ob25lKQorICAgICAgICBzZWxmLmFzc2Vy
dEVxdWFscygwLCBsZW4ocmVzdWx0cykpCisKK2lmIF9fbmFtZV9fID09ICJfX21haW5fXyI6Cisg
ICAgdW5pdHRlc3QubWFpbigpCmRpZmYgLS1naXQgYS9XZWJLaXRUb29scy9TY3JpcHRzL3dlYmtp
dHB5L3Rvb2wvY29tbWFuZHMvcmViYXNlbGluZTIvaW50ZWdyYXRpb25fdW5pdHRlc3QucHkgYi9X
ZWJLaXRUb29scy9TY3JpcHRzL3dlYmtpdHB5L3Rvb2wvY29tbWFuZHMvcmViYXNlbGluZTIvaW50
ZWdyYXRpb25fdW5pdHRlc3QucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMC4uZTFkMjM2OTM2YTBiYmYzNGMzYzRiMDA2
YTMxM2Q4ZjBhZjJlZWRhYgotLS0gL2Rldi9udWxsCisrKyBiL1dlYktpdFRvb2xzL1NjcmlwdHMv
d2Via2l0cHkvdG9vbC9jb21tYW5kcy9yZWJhc2VsaW5lMi9pbnRlZ3JhdGlvbl91bml0dGVzdC5w
eQpAQCAtMCwwICsxLDEyMiBAQAorIyEvdXNyL2Jpbi9lbnYgcHl0aG9uCisjIENvcHlyaWdodCAo
QykgMjAxMCBHb29nbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorIworIyBSZWRpc3RyaWJ1
dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQK
KyMgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2lu
ZyBjb25kaXRpb25zCisjIGFyZSBtZXQ6CisjCisjIDEuICBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291
cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorIyAgICAgbm90aWNlLCB0
aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorIyAy
LiAgUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92
ZSBjb3B5cmlnaHQKKyMgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRo
ZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyMgICAgIGRvY3VtZW50YXRpb24gYW5kL29y
IG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisjCisjIFRI
SVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgQU5EIElUUyBDT05UUklCVVRPUlMgIkFT
IElTIiBBTkQgQU5ZCisjIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcs
IEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQKKyMgV0FSUkFOVElFUyBPRiBNRVJDSEFO
VEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQorIyBESVND
TEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBPUiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJ
QUJMRSBGT1IgQU5ZCisjIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVY
RU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCisjIChJTkNMVURJTkcsIEJVVCBOT1Qg
TElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsK
KyMgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElP
TikgSE9XRVZFUiBDQVVTRUQgQU5ECisjIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVU
SEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisjIChJTkNMVURJTkcg
TkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVT
RSBPRgorIyBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZ
IE9GIFNVQ0ggREFNQUdFLgorCitpbXBvcnQgYnVja2V0CitpbXBvcnQgYnVpbGRlcgorZnJvbSBy
ZXN1bHRfdW5pdHRlc3QgaW1wb3J0IEZha2VSZXN1bHQKK2Zyb20gYnVpbGRlcl91bml0dGVzdCBp
bXBvcnQgRmFrZVppcAoraW1wb3J0IHVuaXR0ZXN0CisKKworY2xhc3MgUmViYXNlbGluZUludGVn
cmF0aW9uVGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgZGVmIF9sb2coc2VsZiwgbXNnKToK
KyAgICAgICAgIyBwcmludCBtc2cKKyAgICAgICAgcGFzcworCisgICAgZGVmIF9kdW1wKHNlbGYs
IGIpOgorICAgICAgICBzZWxmLl9sb2coJy0nICogODApCisgICAgICAgIGIucm9vdF9idWNrZXQo
KS5kdW1wKGJ1Y2tldC5JbmRlbnRlZExvZ2dlcihzZWxmLl9sb2cpKQorCisgICAgZGVmIHRlc3RF
dmVyeXRoaW5nKHNlbGYpOgorICAgICAgICBiID0gYnVja2V0LkJ1Y2tldFRyZWUoKQorICAgICAg
ICBtYiA9IGIubWFrZV9idWNrZXQKKyAgICAgICAgbWIoTm9uZSwKKyAgICAgICAgICAgIG1iKCdt
YWMnLAorICAgICAgICAgICAgICAgIG1iKCdtYWMtc25vd2xlb3BhcmQnLAorICAgICAgICAgICAg
ICAgICAgICBtYignbWFjLWxlb3BhcmQnLAorICAgICAgICAgICAgICAgICAgICAgICAgbWIoJ21h
Yy10aWdlcicpKSksCisgICAgICAgICAgICAgICAgbWIoJ3dpbicsCisgICAgICAgICAgICAgICAg
ICAgIG1iKCdjaHJvbWl1bScsCisgICAgICAgICAgICAgICAgICAgICAgICBtYignY2hyb21pdW0t
bWFjJyksCisgICAgICAgICAgICAgICAgICAgICAgICBtYignY2hyb21pdW0td2luJywKKyAgICAg
ICAgICAgICAgICAgICAgICAgICAgICBtYignY2hyb21pdW0td2luLXZpc3RhJywKKyAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgbWIoJ2Nocm9taXVtLXdpbi14cCcpKSwKKyAgICAgICAg
ICAgICAgICAgICAgICAgICAgICBtYignY2hyb21pdW0tbGludXgnLAorICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICBtYignY2hyb21pdW0tZ3B1JywKKyAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgIG1iKCdjaHJvbWl1bS1ncHUtbGludXgnKSwKKyAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgIG1iKCdjaHJvbWl1bS1ncHUtd2luJyksCisgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICBtYignY2hyb21pdW0tZ3B1LW1hYycpKSkpKSkpLAor
ICAgICAgICAgICAgbWIoJ3F0JywKKyAgICAgICAgICAgICAgICBtYigncXQtbGludXgnKSwKKyAg
ICAgICAgICAgICAgICBtYigncXQtbWFjJyksCisgICAgICAgICAgICAgICAgbWIoJ3F0LXdpbicp
KSkKKworICAgICAgICBBR0dSRUdBVEVfQlVDS0VUUyA9IFsnY2hyb21pdW0nLCAnY2hyb21pdW0t
d2luJywgJ3dpbicsICdtYWMnLCAncXQnLCAnY2hyb21pdW0tZ3B1J10KKyAgICAgICAgZm9yIGJ1
Y2tldF9uYW1lIGluIEFHR1JFR0FURV9CVUNLRVRTOgorICAgICAgICAgICAgYi5nZXRfYnVja2V0
KGJ1Y2tldF9uYW1lKS5tYXJrX2FzX2FnZ3JlZ2F0ZSgpCisKKyAgICAgICAgbGF5b3V0X3Rlc3Rz
ID0gRmFrZVppcCgpCisgICAgICAgIGxheW91dF90ZXN0cy5pbnNlcnQoJ0xheW91dFRlc3RzL2Zh
c3QvZG9tL3Rlc3QuaHRtbCcsICc8aHRtbD5BIHRlc3Q8L2h0bWw+JykKKyAgICAgICAgbGF5b3V0
X3Rlc3RzLmluc2VydCgnTGF5b3V0VGVzdHMvZmFzdC9kb20vdGVzdC1leHBlY3RlZC50eHQnLCAn
YmFzZSByZXN1bHQnKQorICAgICAgICBsYXlvdXRfdGVzdHMuaW5zZXJ0KCdMYXlvdXRUZXN0cy9w
bGF0Zm9ybS9jaHJvbWl1bS13aW4vZmFzdC9kb20vdGVzdC1leHBlY3RlZC50eHQnLCAnd2luIHJl
c3VsdCcpCisKKyAgICAgICAgd2luX3hwX2JvdCA9IEZha2VaaXAoKQorICAgICAgICB3aW5feHBf
Ym90Lmluc2VydCgnZmFzdC9kb20vdGVzdC1hY3R1YWwudHh0JywgJ25ldyB3aW4gcmVzdWx0JykK
KworICAgICAgICB3aW5fdmlzdGFfYm90ID0gRmFrZVppcCgpCisgICAgICAgIHdpbl92aXN0YV9i
b3QuaW5zZXJ0KCdmYXN0L2RvbS90ZXN0LWFjdHVhbC50eHQnLCAnbmV3IHdpbiByZXN1bHQnKQor
CisgICAgICAgIGxpbnV4X2JvdCA9IEZha2VaaXAoKQorICAgICAgICBsaW51eF9ib3QuaW5zZXJ0
KCdmYXN0L2RvbS90ZXN0LWFjdHVhbC50eHQnLCAnbmV3IHdpbiByZXN1bHQnKQorCisgICAgICAg
IGZhY3RvcnkgPSBidWlsZGVyLkJ1aWxkZXIKKyAgICAgICAgYnVpbGRlcnMgPSBbXQorICAgICAg
ICBidWlsZGVycy5hcHBlbmQoZmFjdG9yeS5mcm9tX3ppcCgnY2hyb21pdW0td2luLXhwJywgd2lu
X3hwX2JvdCkpCisgICAgICAgIGJ1aWxkZXJzLmFwcGVuZChmYWN0b3J5LmZyb21femlwKCdjaHJv
bWl1bS13aW4tdmlzdGEnLCB3aW5fdmlzdGFfYm90KSkKKyAgICAgICAgYnVpbGRlcnMuYXBwZW5k
KGZhY3RvcnkuZnJvbV96aXAoJ2Nocm9taXVtLWxpbnV4JywgbGludXhfYm90KSkKKyAgICAgICAg
YnVpbGRib3RzX2J1aWxkZXIgPSBidWlsZGVyLkFnZ3JlZ2F0ZUJ1aWxkZXIoYnVpbGRlcnMpCisg
ICAgICAgIGxheW91dF9idWlsZGVyID0gZmFjdG9yeS5mcm9tX3ppcChOb25lLCBsYXlvdXRfdGVz
dHMpCisKKyAgICAgICAgYnVpbGRib3RfcmVzdWx0cyA9IGJ1aWxkYm90c19idWlsZGVyLnJlc3Vs
dHNfZm9yKCdmYXN0L2RvbS90ZXN0Lmh0bWwnKQorICAgICAgICBsYXlvdXRfcmVzdWx0cyA9IGxh
eW91dF9idWlsZGVyLnJlc3VsdHNfZm9yKCdmYXN0L2RvbS90ZXN0Lmh0bWwnKQorCisgICAgICAg
IGZvciByIGluIGJ1aWxkYm90X3Jlc3VsdHMgKyBsYXlvdXRfcmVzdWx0czoKKyAgICAgICAgICAg
IHNlbGYuX2xvZygiW0ldICVzIiAlIHIpCisgICAgICAgICAgICBiLmluc2VydF9yZXN1bHQocikK
KworICAgICAgICAjIHNlbGYuX2R1bXAoYikKKyAgICAgICAgc2VsZi5fbG9nKCJcbkNPTExBUFNF
XG4iKQorICAgICAgICBiLmNvbGxhcHNlKCkKKyAgICAgICAgIyBzZWxmLl9kdW1wKGIpCisKKyAg
ICAgICAgZm9yIHIgaW4gYi5yZXN1bHRzKCk6CisgICAgICAgICAgICBzZWxmLl9sb2coIltPXSAl
cyIgJSByKQorCisgICAgICAgIGRlZHVwZWRfcmVzdWx0cyA9IGIucmVzdWx0cygpCisgICAgICAg
ICMgU2hvdWxkIG9ubHkgaGF2ZSB0aGUgTm9uZSBhbmQgdGhlIHdpbiByZXN1bHQuCisgICAgICAg
IHNlbGYuYXNzZXJ0RXF1YWxzKDIsIGxlbihkZWR1cGVkX3Jlc3VsdHMpKQorCisgICAgICAgICMg
ZHIgPSBzZXQoZGVkdXBlZF9yZXN1bHRzKQorICAgICAgICAjIGxyID0gc2V0KGxheW91dF9yZXN1
bHRzKQorCisgICAgICAgICMgcHJpbnQgIkR1cGVzIGluIGxheW91dF9yZXN1bHRzIgorICAgICAg
ICAjIGZvciByIGluIGxyIC0gZHI6CisgICAgICAgICMgICByLmRlbGV0ZSgpCisKKyAgICAgICAg
IyBwcmludCAiTmV3IHJlc3VsdHMiCisgICAgICAgICMgZm9yIHIgaW4gZHIgLSBscjoKKyAgICAg
ICAgIyAgIHIuaW5zdGFsbCgnTGF5b3V0VGVzdHMnKQorCitpZiBfX25hbWVfXyA9PSAnX19tYWlu
X18nOgorICAgIHVuaXR0ZXN0Lm1haW4oKQpkaWZmIC0tZ2l0IGEvV2ViS2l0VG9vbHMvU2NyaXB0
cy93ZWJraXRweS90b29sL2NvbW1hbmRzL3JlYmFzZWxpbmUyL3JlYmFzZWxpbmUyLnB5IGIvV2Vi
S2l0VG9vbHMvU2NyaXB0cy93ZWJraXRweS90b29sL2NvbW1hbmRzL3JlYmFzZWxpbmUyL3JlYmFz
ZWxpbmUyLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAuLjE4YmU0MGMwZjU2NGNlZDQ4MjYwNDdlZTIzY2M5MzFkYjUy
ZTBlY2EKLS0tIC9kZXYvbnVsbAorKysgYi9XZWJLaXRUb29scy9TY3JpcHRzL3dlYmtpdHB5L3Rv
b2wvY29tbWFuZHMvcmViYXNlbGluZTIvcmViYXNlbGluZTIucHkKQEAgLTAsMCArMSw4NSBAQAor
IyBDb3B5cmlnaHQgKGMpIDIwMTAgR29vZ2xlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyMK
KyMgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0
aCBvciB3aXRob3V0CisjIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0
IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKyMgbWV0OgorIworIyAgICAgKiBSZWRpc3Ry
aWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAor
IyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2Ns
YWltZXIuCisjICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJv
ZHVjZSB0aGUgYWJvdmUKKyMgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlv
bnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorIyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBh
bmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisjIGRpc3RyaWJ1dGlvbi4K
KyMgICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9m
IGl0cworIyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHBy
b2R1Y3RzIGRlcml2ZWQgZnJvbQorIyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJp
b3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorIworIyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZ
IFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisjICJBUyBJUyIgQU5EIEFO
WSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisjIExJ
TUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBG
SVRORVNTIEZPUgorIyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8g
RVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorIyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElB
QkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyMgU1BFQ0lBTCwgRVhF
TVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorIyBM
SU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBM
T1NTIE9GIFVTRSwKKyMgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9O
KSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisjIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRI
RVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyMgKElOQ0xVRElORyBO
RUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNF
CisjIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkg
T0YgU1VDSCBEQU1BR0UuCisKK2Zyb20gd2Via2l0cHkudG9vbC5tdWx0aWNvbW1hbmR0b29sIGlt
cG9ydCBBYnN0cmFjdERlY2xhcmF0aXZlQ29tbWFuZAorZnJvbSB3ZWJraXRweS5jb21tb24ubmV0
LnJlc3VsdHNldCBpbXBvcnQgUmVzdWx0U2V0Citmcm9tIHdlYmtpdHB5LmNvbW1vbi5uZXQucmVz
dWx0IGltcG9ydCBJbWFnZVJlc3VsdAorZnJvbSB3ZWJraXRweS50b29sLmNvbW1hbmRzLnJlYmFz
ZWxpbmUyLnJlYmFzZWxpbmVyIGltcG9ydCBSZWJhc2VsaW5lcgorZnJvbSB3ZWJraXRweS50b29s
LmNvbW1hbmRzLnJlYmFzZWxpbmUyLmJ1aWxkZXIgaW1wb3J0IENocm9taXVtQnVpbGRlciwgV2Vi
S2l0QnVpbGRlcgorCitmcm9tIG9wdHBhcnNlIGltcG9ydCBtYWtlX29wdGlvbgorCisKK2NsYXNz
IEltYWdlRGlmZmVyKG9iamVjdCk6CisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHBvcnQpOgorICAg
ICAgICBzZWxmLl9wb3J0ID0gcG9ydAorCisgICAgZGVmIHNhbWVfaW1hZ2Uoc2VsZiwgaW1nMSwg
aW1nMik6CisgICAgICAgIHJldHVybiBub3Qgc2VsZi5fcG9ydC5kaWZmX2ltYWdlKGltZzEsIGlt
ZzIpCisKKworY2xhc3MgUmViYXNlbGluZTIoQWJzdHJhY3REZWNsYXJhdGl2ZUNvbW1hbmQpOgor
ICAgIG5hbWUgPSAicmViYXNlbGluZTIiCisgICAgaGVscF90ZXh0ID0gIkZldGNoZXMgbmV3IGV4
cGVjdGVkIHJlc3VsdHMgZnJvbSBidWlsZGJvdHMuIgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYp
OgorICAgICAgICBvcHRpb25zID0gWworICAgICAgICAgICAgbWFrZV9vcHRpb24oIi0tcGxhdGZv
cm1zIiwgYWN0aW9uPSJzdG9yZSIsIGRlc3Q9InBsYXRmb3JtcyIsCisgICAgICAgICAgICAgICAg
aGVscD0iQ29tbWEgc2VwYXJhdGVkIGxpc3Qgb2YgdGhlIHBsYXRmb3JtcyB0byByZWJhc2VsaW5l
IGZvci4iKSwKKyAgICAgICAgICAgIG1ha2Vfb3B0aW9uKCItLXVzZS16aXAtYXMtYXJjaGl2ZSIs
IGFjdGlvbj0ic3RvcmUiLAorICAgICAgICAgICAgICAgIGhlbHA9IlVzZSB0aGUgemlwIGF0IHRo
ZSBzcGVjaWZpZWQgVVJMIChsb2NhbCBvciByZW1vdGUpIHRvIHNwZWNpZnkgcmVzdWx0cyAiCisg
ICAgICAgICAgICAgICAgImZvciB0aGUgZ2l2ZW4gcGxhdGZvcm0uIiwgbWV0YXZhcj0iPHBsYXRm
b3JtPjo8emlwIHVybD4iKSwKKyAgICAgICAgXQorICAgICAgICBBYnN0cmFjdERlY2xhcmF0aXZl
Q29tbWFuZC5fX2luaXRfXyhzZWxmLCBvcHRpb25zPW9wdGlvbnMpCisKKyAgICBkZWYgZXhlY3V0
ZShzZWxmLCBvcHRpb25zLCBhcmdzLCB0b29sKToKKyAgICAgICAgcG9ydCA9IHRvb2wucG9ydF9m
YWN0b3J5LmdldChwb3J0X25hbWU9b3B0aW9ucy5wb3J0KQorCisgICAgICAgIGlmIG9wdGlvbnMu
cGxhdGZvcm1zOgorICAgICAgICAgICAgcGxhdGZvcm1zID0gb3B0aW9ucy5wbGF0Zm9ybXMuc3Bs
aXQoJywnKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcGxhdGZvcm1zID0gW10KKworICAg
ICAgICBpZiBwb3J0LmNoZWNrX2ltYWdlX2RpZmYoKToKKyAgICAgICAgICAgIEltYWdlUmVzdWx0
LmltYWdlX2RpZmZlciA9IEltYWdlRGlmZmVyKHBvcnQpCisgICAgICAgIGVsc2U6CisgICAgICAg
ICAgICBwcmludCAiV2FybmluZzogQ291bGRuJ3QgZmluZCBJbWFnZURpZmYsIHNvIHdlIHdpbGwg
Y3Jhc2ggaWYgd2UgbmVlZCB0byBjb21wYXJlIGltYWdlcyB0aGF0IGRvbid0IGhhdmUgY2hlY2tz
dW1zLiIKKyAgICAgICAgICAgIEltYWdlUmVzdWx0LmltYWdlX2RpZmZlciA9IE5vbmUKKworICAg
ICAgICBpZiBvcHRpb25zLnVzZV96aXBfYXNfYXJjaGl2ZSBpcyBub3QgTm9uZToKKyAgICAgICAg
ICAgIGkgPSBvcHRpb25zLnVzZV96aXBfYXNfYXJjaGl2ZS5pbmRleCgnOicpCisgICAgICAgICAg
ICBwbGF0Zm9ybSwgdXJsID0gb3B0aW9ucy51c2VfemlwX2FzX2FyY2hpdmVbOmldLCBvcHRpb25z
LnVzZV96aXBfYXNfYXJjaGl2ZVtpICsgMTpdCisgICAgICAgICAgICByZW1vdGVfYnVpbGRlcnMg
PSBSZXN1bHRTZXQuZnJvbV96aXBfdXJsKHBsYXRmb3JtLCB1cmwpCisgICAgICAgIGVsc2U6Cisg
ICAgICAgICAgICByZW1vdGVfYnVpbGRlcnMgPSBwb3J0LmJ1aWxkYm90X3Jlc3VsdHNldChwbGF0
Zm9ybXMpCisKKyAgICAgICAgbGF5b3V0X3Rlc3RzX2RpciA9IHBvcnQubGF5b3V0X3Rlc3RzX2Rp
cigpCisgICAgICAgIGxvY2FsX2J1aWxkZXJzID0gUmVzdWx0U2V0LmZyb21fcGF0aChsYXlvdXRf
dGVzdHNfZGlyKQorICAgICAgICByYiA9IFJlYmFzZWxpbmVyKGFyZ3MsIGxvY2FsX2J1aWxkZXJz
LCByZW1vdGVfYnVpbGRlcnMsIGxheW91dF90ZXN0c19kaXIpCisgICAgICAgIHJiLnNldF92ZXJi
b3NlKG9wdGlvbnMudmVyYm9zZSkKKyAgICAgICAgcmIucmViYXNlbGluZShvcHRpb25zLmRyeV9y
dW4pCmRpZmYgLS1naXQgYS9XZWJLaXRUb29scy9TY3JpcHRzL3dlYmtpdHB5L3Rvb2wvY29tbWFu
ZHMvcmViYXNlbGluZTIvcmViYXNlbGluZXIucHkgYi9XZWJLaXRUb29scy9TY3JpcHRzL3dlYmtp
dHB5L3Rvb2wvY29tbWFuZHMvcmViYXNlbGluZTIvcmViYXNlbGluZXIucHkKbmV3IGZpbGUgbW9k
ZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMC4u
YmM0NGY2YzBhYjRhNmY4ZTIzOWRlMGJkYzgyNGZlOTljNzRjNmEzNwotLS0gL2Rldi9udWxsCisr
KyBiL1dlYktpdFRvb2xzL1NjcmlwdHMvd2Via2l0cHkvdG9vbC9jb21tYW5kcy9yZWJhc2VsaW5l
Mi9yZWJhc2VsaW5lci5weQpAQCAtMCwwICsxLDEzNiBAQAorIyEvdXNyL2Jpbi9lbnYgcHl0aG9u
CisjIENvcHlyaWdodCAoQykgMjAxMCBHb29nbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgor
IworIyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3
aXRoIG9yIHdpdGhvdXQKKyMgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRo
YXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisjIGFyZSBtZXQ6CisjCisjIDEuICBSZWRpc3Ry
aWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAor
IyAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBk
aXNjbGFpbWVyLgorIyAyLiAgUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVw
cm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyMgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNv
bmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyMgICAgIGRvY3Vt
ZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmli
dXRpb24uCisjCisjIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgQU5EIElUUyBD
T05UUklCVVRPUlMgIkFTIElTIiBBTkQgQU5ZCisjIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5U
SUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQKKyMgV0FSUkFO
VElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQ
T1NFIEFSRQorIyBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBPUiBJVFMgQ09O
VFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZCisjIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5U
QUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCisjIChJTkNM
VURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09E
UyBPUiBTRVJWSUNFUzsKKyMgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lO
RVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECisjIE9OIEFOWSBUSEVPUlkgT0Yg
TElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JU
CisjIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdB
WSBPVVQgT0YgVEhFIFVTRSBPRgorIyBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0Yg
VEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCitpbXBvcnQgYnVja2V0CisKKworY2xh
c3MgUmViYXNlbGluZXIob2JqZWN0KToKKyAgICAiIiJSZWJhc2VsaW5lcyBhbmQgZGVkdXBlcyBy
ZXN1bHRzLiIiIgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCB0ZXN0X2dsb2JzLCBsb2NhbF9yZXN1
bHRzLCByZW1vdGVfcmVzdWx0cywKKyAgICAgICAgICAgICAgICAgbGF5b3V0X3Rlc3RzX2Rpciwg
Kiprd2FyZ3MpOgorICAgICAgICBzZWxmLl90ZXN0X2dsb2JzID0gdGVzdF9nbG9icworICAgICAg
ICBzZWxmLl9leGlzdGluZ19yZXN1bHRzID0gbG9jYWxfcmVzdWx0cworICAgICAgICBzZWxmLl9u
ZXdfcmVzdWx0cyA9IHJlbW90ZV9yZXN1bHRzCisgICAgICAgIHNlbGYuX2xheW91dF90ZXN0c19k
aXIgPSBsYXlvdXRfdGVzdHNfZGlyCisgICAgICAgIHNlbGYuX3ZlcmJvc2UgPSBrd2FyZ3MuZ2V0
KCd2ZXJib3NlJywgRmFsc2UpCisKKyAgICBkZWYgX21ha2VfYnVja2V0X3RyZWUoc2VsZik6Cisg
ICAgICAgIGIgPSBidWNrZXQuQnVja2V0VHJlZSgpCisgICAgICAgIGliID0gYi5tYWtlX2J1Y2tl
dAorICAgICAgICBpYihOb25lLAorICAgICAgICAgICAgaWIoJ21hYycsCisgICAgICAgICAgICAg
ICAgaWIoJ21hYy1zbm93bGVvcGFyZCcsCisgICAgICAgICAgICAgICAgICAgIGliKCdtYWMtbGVv
cGFyZCcsCisgICAgICAgICAgICAgICAgICAgICAgICBpYignbWFjLXRpZ2VyJykpKSwKKyAgICAg
ICAgICAgICAgICBpYignd2luJywKKyAgICAgICAgICAgICAgICAgICAgaWIoJ2Nocm9taXVtJywK
KyAgICAgICAgICAgICAgICAgICAgICAgIGliKCdjaHJvbWl1bS1tYWMnKSwKKyAgICAgICAgICAg
ICAgICAgICAgICAgIGliKCdjaHJvbWl1bS13aW4nLAorICAgICAgICAgICAgICAgICAgICAgICAg
ICAgIGliKCdjaHJvbWl1bS13aW4tdmlzdGEnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICBpYignY2hyb21pdW0td2luLXhwJykpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAg
IGliKCdjaHJvbWl1bS1saW51eCcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGli
KCdjaHJvbWl1bS1ncHUnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWIo
J2Nocm9taXVtLWdwdS1saW51eCcpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgaWIoJ2Nocm9taXVtLWdwdS13aW4nKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgIGliKCdjaHJvbWl1bS1ncHUtbWFjJykpKSkpKSksCisgICAgICAgICAgICBpYigncXQn
LAorICAgICAgICAgICAgICAgIGliKCdxdC1saW51eCcpLAorICAgICAgICAgICAgICAgIGliKCdx
dC1tYWMnKSwKKyAgICAgICAgICAgICAgICBpYigncXQtd2luJykpLAorICAgICAgICAgICAgaWIo
J2d0aycpKQorICAgICAgICAjIEFnZ3JlZ2F0ZSBidWNrZXRzIGFyZSBidWNrZXRzIHRoYXQgd2ls
bCBuZXZlciBoYXZlIHJlc3VsdHMgcHJvZHVjZWQgc3BlY2lmaWNhbGx5IGZvciB0aGVtCisgICAg
ICAgICMgLSB0aGV5IGFyZSBidWNrZXRzIHRoYXQgb25seSBleGlzdCBhcyBhIGNvbnZlbmllbnQg
cGxhY2UgdG8gcHV0IHJlc3VsdHMgYW5kIGhhdmUgb3RoZXIKKyAgICAgICAgIyBwbGF0Zm9ybXMg
ZmFsbGJhY2sgb250byB0aGVtLiBUaGlzIGlzIHNpZ25pZmljYW50IGluZm9ybWF0aW9uIGZvciB0
aGUgZGVkdXBpbmcgYWxnb3JpdGhtCisgICAgICAgICMgYmVjYXVzZSBpZiBhbGwgb2YgYW4gYWdn
cmVnYXRlIGJ1Y2tldCdzIGNoaWxkcmVuIGhhdmUgdGhlIHNhbWUgcmVzdWx0IHRoZW4gdGhhdCBy
ZXN1bHQKKyAgICAgICAgIyBzaG91bGQgY2xvYmJlciB0aGUgYWdncmVnYXRlIGJ1Y2tldC4KKyAg
ICAgICAgQUdHUkVHQVRFX0JVQ0tFVFMgPSBbJ2Nocm9taXVtJywgJ2Nocm9taXVtLXdpbicsICd3
aW4nLCAnbWFjJywgJ3F0JywgJ2Nocm9taXVtLWdwdSddCisgICAgICAgIGZvciBidWNrZXRfbmFt
ZSBpbiBBR0dSRUdBVEVfQlVDS0VUUzoKKyAgICAgICAgICAgIGIuZ2V0X2J1Y2tldChidWNrZXRf
bmFtZSkubWFya19hc19hZ2dyZWdhdGUoKQorICAgICAgICByZXR1cm4gYgorCisgICAgZGVmIF9z
aG93X3Jlc3VsdHMoc2VsZiwgZGVzY3JpcHRpb24sIHJlc3VsdHMpOgorICAgICAgICBpZiBub3Qg
c2VsZi5fdmVyYm9zZToKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBwcmludCBkZXNjcmlw
dGlvbgorICAgICAgICBmb3IgciBpbiByZXN1bHRzOgorICAgICAgICAgICAgcHJpbnQgcgorCisg
ICAgZGVmIF90ZXN0X25hbWVzKHNlbGYpOgorICAgICAgICB0ZXN0X25hbWVzID0gc2V0KFtdKQor
ICAgICAgICBpZiBsZW4oc2VsZi5fdGVzdF9nbG9icykgPT0gMDoKKyAgICAgICAgICAgIHJldHVy
biBtYXAobGFtYmRhIHI6IHIubmFtZSgpLCBzZWxmLl9uZXdfcmVzdWx0cy5yZXN1bHRzX2Zvcign
JykpCisgICAgICAgIGZvciB0ZXN0X2dsb2IgaW4gc2VsZi5fdGVzdF9nbG9iczoKKyAgICAgICAg
ICAgIG5ld19yZXN1bHRzID0gc2VsZi5fbmV3X3Jlc3VsdHMucmVzdWx0c19mb3IodGVzdF9nbG9i
KQorICAgICAgICAgICAgIyBUT0RPIFRoaXMgaXMgcmVhbGx5IHNsb3cgYW5kIGlzbid0IG5lY2Vz
c2FyeSB1bmxlc3Mgd2UgYXJlIG1lcmVseQorICAgICAgICAgICAgIyBkZWR1cGluZyBleGlzdGlu
ZyByZXN1bHRzLiBJdCBzaG91bGQgYmUgY29udHJvbGxlZCBieSBhIGZsYWcuCisgICAgICAgICAg
ICAjIG9sZF9yZXN1bHRzID0gc2VsZi5fZXhpc3RpbmdfcmVzdWx0cy5yZXN1bHRzX2Zvcih0ZXN0
X2dsb2IpCisgICAgICAgICAgICBuYW1lcyA9IHNldChtYXAobGFtYmRhIHI6IHIubmFtZSgpLCBu
ZXdfcmVzdWx0cykpCisgICAgICAgICAgICB0ZXN0X25hbWVzID0gdGVzdF9uYW1lcy51bmlvbihu
YW1lcykKKyAgICAgICAgcmV0dXJuIHRlc3RfbmFtZXMKKworICAgIGRlZiBfZGVkdXBlKHNlbGYs
IHJlc3VsdHMpOgorICAgICAgICBidCA9IHNlbGYuX21ha2VfYnVja2V0X3RyZWUoKQorICAgICAg
ICBmb3IgciBpbiByZXN1bHRzOgorICAgICAgICAgICAgYnQuaW5zZXJ0X3Jlc3VsdChyKQorICAg
ICAgICBidC5jb2xsYXBzZSgpCisgICAgICAgIHJldHVybiBidC5yZXN1bHRzKCkKKworICAgIGRl
ZiBzZXRfdmVyYm9zZShzZWxmLCB2ZXJib3NlKToKKyAgICAgICAgc2VsZi5fdmVyYm9zZSA9IHZl
cmJvc2UKKworICAgIGRlZiBleGlzdGluZ19yZXN1bHRzKHNlbGYsIHRlc3RfbmFtZSk6CisgICAg
ICAgIHJldHVybiBzZWxmLl9leGlzdGluZ19yZXN1bHRzLnJlc3VsdHNfZm9yKHRlc3RfbmFtZSkK
KworICAgIGRlZiBuZXdfcmVzdWx0cyhzZWxmLCB0ZXN0X25hbWUpOgorICAgICAgICByZXR1cm4g
c2VsZi5fbmV3X3Jlc3VsdHMucmVzdWx0c19mb3IodGVzdF9uYW1lKQorCisgICAgZGVmIHJlYmFz
ZWxpbmUoc2VsZiwgZHJ5X3J1bj1GYWxzZSk6CisgICAgICAgIGZvciB0ZXN0X25hbWUgaW4gc2Vs
Zi5fdGVzdF9uYW1lcygpOgorICAgICAgICAgICAgZm9yIHR5cGUgaW4gWyd0ZXh0JywgJ2ltYWdl
J106CisgICAgICAgICAgICAgICAgbmV3X3Jlc3VsdHMgPSBzZWxmLl9uZXdfcmVzdWx0cy5yZXN1
bHRzX2Zvcih0ZXN0X25hbWUsIHRhcmdldF90eXBlPXR5cGUsIGV4YWN0X21hdGNoPVRydWUpCisg
ICAgICAgICAgICAgICAgZXhpc3RpbmdfcmVzdWx0cyA9IHNlbGYuX2V4aXN0aW5nX3Jlc3VsdHMu
cmVzdWx0c19mb3IodGVzdF9uYW1lLCB0YXJnZXRfdHlwZT10eXBlLCBleGFjdF9tYXRjaD1UcnVl
KQorCisgICAgICAgICAgICAgICAgaWYgbGVuKG5ld19yZXN1bHRzKSArIGxlbihleGlzdGluZ19y
ZXN1bHRzKSA9PSAwOgorICAgICAgICAgICAgICAgICAgICBjb250aW51ZQorCisgICAgICAgICAg
ICAgICAgcHJpbnQgIlJlYmFzZWxpbmluZyAlc1slc10iICUgKHRlc3RfbmFtZSwgdHlwZSkKKwor
ICAgICAgICAgICAgICAgIHNlbGYuX3Nob3dfcmVzdWx0cygibmV3X3Jlc3VsdHMiLCBuZXdfcmVz
dWx0cykKKyAgICAgICAgICAgICAgICBzZWxmLl9zaG93X3Jlc3VsdHMoImV4aXN0aW5nX3Jlc3Vs
dHMiLCBleGlzdGluZ19yZXN1bHRzKQorCisgICAgICAgICAgICAgICAgZGVkdXBlZF9yZXN1bHRz
ID0gc2VsZi5fZGVkdXBlKG5ld19yZXN1bHRzICsgZXhpc3RpbmdfcmVzdWx0cykKKworICAgICAg
ICAgICAgICAgIHNlbGYuX3Nob3dfcmVzdWx0cygiZGVkdXBlZF9yZXN1bHRzIiwgZGVkdXBlZF9y
ZXN1bHRzKQorCisgICAgICAgICAgICAgICAgZm9yIHIgaW4gc2V0KGV4aXN0aW5nX3Jlc3VsdHMp
IC0gc2V0KGRlZHVwZWRfcmVzdWx0cyk6CisgICAgICAgICAgICAgICAgICAgIGlmIGRyeV9ydW46
CisgICAgICAgICAgICAgICAgICAgICAgICBwcmludCAiZGVsZXRlICVzIiAlIHIKKyAgICAgICAg
ICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgICAgIHIuZGVsZXRlKCkKKwor
ICAgICAgICAgICAgICAgIGZvciByIGluIHNldChkZWR1cGVkX3Jlc3VsdHMpIC0gc2V0KGV4aXN0
aW5nX3Jlc3VsdHMpOgorICAgICAgICAgICAgICAgICAgICBpZiBkcnlfcnVuOgorICAgICAgICAg
ICAgICAgICAgICAgICAgcHJpbnQgImluc3RhbGwgJXMiICUgcgorICAgICAgICAgICAgICAgICAg
ICBlbHNlOgorICAgICAgICAgICAgICAgICAgICAgICAgci5pbnN0YWxsKHNlbGYuX2xheW91dF90
ZXN0c19kaXIpCg==
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>75869</attachid>
            <date>2010-12-07 21:40:14 -0800</date>
            <delta_ts>2010-12-07 22:25:33 -0800</delta_ts>
            <desc>Patch</desc>
            <filename>bug-50098-20101208164010.patch</filename>
            <type>text/plain</type>
            <size>76521</size>
            <attacher name="James Kozianski">koz</attacher>
            
              <data encoding="base64">ZGlmZiAtLWdpdCBhL1dlYktpdFRvb2xzL0NoYW5nZUxvZyBiL1dlYktpdFRvb2xzL0NoYW5nZUxv
ZwppbmRleCA1NWNlZGFlM2ZjNGRhNGQzZmNkNDIyNGQ4MzU3ZjQyNDhiZTJiOWQyLi41MjMwYzI2
MGRkYjUxZTYyNDkwYWY2OTNhZjg1Y2JmYjA2OWJkM2U1IDEwMDY0NAotLS0gYS9XZWJLaXRUb29s
cy9DaGFuZ2VMb2cKKysrIGIvV2ViS2l0VG9vbHMvQ2hhbmdlTG9nCkBAIC0xLDMgKzEsMjkgQEAK
KzIwMTAtMTItMDcgIEphbWVzIEtvemlhbnNraSAgPGtvekBjaHJvbWl1bS5vcmc+CisKKyAgICAg
ICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChPT1BTISkuCisKKyAgICAgICAgTmV3IHdlYmtpdC1wYXRj
aCByZWJhc2VsaW5lMiBjb21tYW5kLgorICAgICAgICBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9z
aG93X2J1Zy5jZ2k/aWQ9NTAwOTgKKworICAgICAgICAqIFNjcmlwdHMvd2Via2l0cHkvY29tbW9u
L2RpcmFzemlwLnB5OiBBZGRlZC4KKyAgICAgICAgKiBTY3JpcHRzL3dlYmtpdHB5L2NvbW1vbi9u
ZXQvYnVpbGRib3QucHk6CisgICAgICAgICogU2NyaXB0cy93ZWJraXRweS9jb21tb24vbmV0L3Jl
bW90ZXppcC5weTogQWRkZWQuCisgICAgICAgICogU2NyaXB0cy93ZWJraXRweS9jb21tb24vbmV0
L3Jlc3VsdC5weTogQWRkZWQuCisgICAgICAgICogU2NyaXB0cy93ZWJraXRweS9jb21tb24vbmV0
L3Jlc3VsdF91bml0dGVzdC5weTogQWRkZWQuCisgICAgICAgICogU2NyaXB0cy93ZWJraXRweS9j
b21tb24vbmV0L3Jlc3VsdHNldC5weTogQWRkZWQuCisgICAgICAgICogU2NyaXB0cy93ZWJraXRw
eS9jb21tb24vbmV0L3Jlc3VsdHNldF91bml0dGVzdC5weTogQWRkZWQuCisgICAgICAgICogU2Ny
aXB0cy93ZWJraXRweS9jb21tb24vc3lzdGVtL2ZpbGVzeXN0ZW0ucHk6CisgICAgICAgICogU2Ny
aXB0cy93ZWJraXRweS9sYXlvdXRfdGVzdHMvcG9ydC9iYXNlLnB5OgorICAgICAgICAqIFNjcmlw
dHMvd2Via2l0cHkvbGF5b3V0X3Rlc3RzL3BvcnQvY2hyb21pdW0ucHk6CisgICAgICAgICogU2Ny
aXB0cy93ZWJraXRweS9sYXlvdXRfdGVzdHMvcG9ydC93ZWJraXQucHk6CisgICAgICAgICogU2Ny
aXB0cy93ZWJraXRweS90b29sL2NvbW1hbmRzL19faW5pdF9fLnB5OgorICAgICAgICAqIFNjcmlw
dHMvd2Via2l0cHkvdG9vbC9jb21tYW5kcy9yZWJhc2VsaW5lMi9fX2luaXRfXy5weTogQWRkZWQu
CisgICAgICAgICogU2NyaXB0cy93ZWJraXRweS90b29sL2NvbW1hbmRzL3JlYmFzZWxpbmUyL2J1
Y2tldC5weTogQWRkZWQuCisgICAgICAgICogU2NyaXB0cy93ZWJraXRweS90b29sL2NvbW1hbmRz
L3JlYmFzZWxpbmUyL2J1Y2tldF91bml0dGVzdC5weTogQWRkZWQuCisgICAgICAgICogU2NyaXB0
cy93ZWJraXRweS90b29sL2NvbW1hbmRzL3JlYmFzZWxpbmUyL3JlYmFzZWxpbmUyLnB5OiBBZGRl
ZC4KKyAgICAgICAgKiBTY3JpcHRzL3dlYmtpdHB5L3Rvb2wvY29tbWFuZHMvcmViYXNlbGluZTIv
cmViYXNlbGluZXIucHk6IEFkZGVkLgorICAgICAgICAqIFNjcmlwdHMvd2Via2l0cHkvdG9vbC9j
b21tYW5kcy9yZWJhc2VsaW5lMi9yZWJhc2VsaW5lcl91bml0dGVzdC5weTogQWRkZWQuCisKIDIw
MTAtMTEtMjQgIE5pY29sYXMgRHVmcmVzbmUgIDxuaWNvbGFzLmR1ZnJlc25lQGNvbGxhYm9yYS5j
by51az4KIAogICAgICAgICBSZXZpZXdlZCBieSBNYXJ0aW4gUm9iaW5zb24uCmRpZmYgLS1naXQg
YS9XZWJLaXRUb29scy9TY3JpcHRzL3dlYmtpdHB5L2NvbW1vbi9kaXJhc3ppcC5weSBiL1dlYktp
dFRvb2xzL1NjcmlwdHMvd2Via2l0cHkvY29tbW9uL2RpcmFzemlwLnB5Cm5ldyBmaWxlIG1vZGUg
MTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAuLjFk
NmFiODA5OTc1NjI0MGFmNjkyOWQ4MjdiNjE0OGY4ZjY4MGJkMTgKLS0tIC9kZXYvbnVsbAorKysg
Yi9XZWJLaXRUb29scy9TY3JpcHRzL3dlYmtpdHB5L2NvbW1vbi9kaXJhc3ppcC5weQpAQCAtMCww
ICsxLDY2IEBACisjIS91c3IvYmluL2VudiBweXRob24KKyMgQ29weXJpZ2h0IChDKSAyMDEwIEdv
b2dsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisjCisjIFJlZGlzdHJpYnV0aW9uIGFuZCB1
c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorIyBtb2RpZmlj
YXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlv
bnMKKyMgYXJlIG1ldDoKKyMKKyMgMS4gIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBt
dXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisjICAgICBub3RpY2UsIHRoaXMgbGlzdCBv
ZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisjIDIuICBSZWRpc3Ry
aWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdo
dAorIyAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2lu
ZyBkaXNjbGFpbWVyIGluIHRoZQorIyAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0
ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyMKKyMgVEhJUyBTT0ZUV0FS
RSBJUyBQUk9WSURFRCBCWSBBUFBMRSBBTkQgSVRTIENPTlRSSUJVVE9SUyAiQVMgSVMiIEFORCBB
TlkKKyMgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBM
SU1JVEVEIFRPLCBUSEUgSU1QTElFRAorIyBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBB
TkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCisjIERJU0NMQUlNRUQuIElO
IE5PIEVWRU5UIFNIQUxMIEFQUExFIE9SIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBB
TlkKKyMgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBP
UiBDT05TRVFVRU5USUFMIERBTUFHRVMKKyMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRP
LCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworIyBMT1NTIE9G
IFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVS
IENBVVNFRCBBTkQKKyMgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09O
VFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyMgKElOQ0xVRElORyBORUdMSUdFTkNF
IE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisjIFRI
SVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBE
QU1BR0UuCisKK2Zyb20gX19mdXR1cmVfXyBpbXBvcnQgd2l0aF9zdGF0ZW1lbnQKK2Zyb20gd2Vi
a2l0cHkuY29tbW9uLm5ldC5yZW1vdGV6aXAgaW1wb3J0IFppcEZpbGVIYW5kbGUKK2Zyb20gd2Vi
a2l0cHkuY29tbW9uLnN5c3RlbS5maWxlc3lzdGVtIGltcG9ydCBGaWxlU3lzdGVtCitpbXBvcnQg
b3MKK2ltcG9ydCBzaHV0aWwKKworCitjbGFzcyBEaXJlY3RvcnlBc1ppcChvYmplY3QpOgorICAg
ICIiIlByb3ZpZGVzIGEgemlwZmlsZS1saWtlIGludGVyZmFjZSB0byBhIGxvY2FsIGRpcmVjdG9y
eSIiIgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBwYXRoLCBmcz1GaWxlU3lzdGVtKCkpOgorICAg
ICAgICBzZWxmLl9wYXRoID0gcGF0aAorICAgICAgICBzZWxmLl9mcyA9IGZzCisgICAgICAgIGlm
IG5vdCBzZWxmLl9wYXRoLmVuZHN3aXRoKG9zLnBhdGguc2VwKToKKyAgICAgICAgICAgIHNlbGYu
X3BhdGggKz0gb3MucGF0aC5zZXAKKworICAgIGRlZiBoYW5kbGVfdG8oc2VsZiwgZmlsZW5hbWUp
OgorICAgICAgICByZXR1cm4gWmlwRmlsZUhhbmRsZShzZWxmLCBmaWxlbmFtZSkKKworICAgIGRl
ZiBuYW1lbGlzdChzZWxmKToKKyAgICAgICAgcmVzdWx0cyA9IFtdCisgICAgICAgIGZvciAocGF0
aCwgXywgZmlsZW5hbWVzKSBpbiBvcy53YWxrKHNlbGYuX3BhdGgpOgorICAgICAgICAgICAgZm9y
IGZpbGVuYW1lIGluIGZpbGVuYW1lczoKKyAgICAgICAgICAgICAgICAjIFdlIGRyb3AgdGhlIHBh
dGggdG8gdGhlIGRpcmVjdG9yeSBmcm9tIG91ciBuYW1lbGlzdC4KKyAgICAgICAgICAgICAgICBy
ZXN1bHRzLmFwcGVuZChvcy5wYXRoLmpvaW4ocGF0aCwgZmlsZW5hbWUpW2xlbihzZWxmLl9wYXRo
KTpdKQorICAgICAgICByZXR1cm4gcmVzdWx0cworCisgICAgZGVmIHJlYWQoc2VsZiwgZmlsZW5h
bWUpOgorICAgICAgICByZXR1cm4gc2VsZi5fZnMucmVhZF90ZXh0X2ZpbGUob3MucGF0aC5qb2lu
KHNlbGYuX3BhdGgsIGZpbGVuYW1lKSkKKworICAgIGRlZiBleHRyYWN0KHNlbGYsIGZpbGVuYW1l
LCBwYXRoKToKKyAgICAgICAgc3JjID0gb3MucGF0aC5qb2luKHNlbGYuX3BhdGgsIGZpbGVuYW1l
KQorICAgICAgICBkZXN0ID0gb3MucGF0aC5qb2luKHBhdGgsIGZpbGVuYW1lKQorICAgICAgICAj
IEFzIGZpbGVuYW1lIG1heSBoYXZlIHNsYXNoZXMgaW4gaXQsIHdlIG11c3QgZW5zdXJlIHRoYXQg
dGhlIGNvcnJlY3QKKyAgICAgICAgIyBkaXJlY3RvcnkgaGVpcmFyY2h5IGV4aXN0cyB3aGVuIHdl
IGFyZSBjb3B5aW5nIGl0IHRvIHRoZSBvdXRwdXQuCisgICAgICAgIHBhdGhfdG9fZmlsZSA9IG9z
LnBhdGguc3BsaXQoZmlsZW5hbWUpWzBdCisgICAgICAgIHNlbGYuX2ZzLm1heWJlX21ha2VfZGly
ZWN0b3J5KHBhdGgsIHBhdGhfdG9fZmlsZSkKKyAgICAgICAgc2VsZi5fZnMuY29weWZpbGUoc3Jj
LCBkZXN0KQorCisgICAgZGVmIGRlbGV0ZShzZWxmLCBmaWxlbmFtZSk6CisgICAgICAgIGZpbGVu
YW1lID0gb3MucGF0aC5qb2luKHNlbGYuX3BhdGgsIGZpbGVuYW1lKQorICAgICAgICBhc3NlcnQg
Jy4uJyBub3QgaW4gZmlsZW5hbWUKKyAgICAgICAgc2VsZi5fZnMucmVtb3ZlKGZpbGVuYW1lKQpk
aWZmIC0tZ2l0IGEvV2ViS2l0VG9vbHMvU2NyaXB0cy93ZWJraXRweS9jb21tb24vbmV0L2J1aWxk
Ym90LnB5IGIvV2ViS2l0VG9vbHMvU2NyaXB0cy93ZWJraXRweS9jb21tb24vbmV0L2J1aWxkYm90
LnB5CmluZGV4IDg4Y2RkNGUyODAyNTVjNDllZmY4NjI0ZTJmMjE4M2RhYTY0MmIxYTguLmVhOGIy
NTZlNjZlOTEzMGYwZTlmNzFkODkzNGJkMjk5YzA1ZjYzMzQgMTAwNjQ0Ci0tLSBhL1dlYktpdFRv
b2xzL1NjcmlwdHMvd2Via2l0cHkvY29tbW9uL25ldC9idWlsZGJvdC5weQorKysgYi9XZWJLaXRU
b29scy9TY3JpcHRzL3dlYmtpdHB5L2NvbW1vbi9uZXQvYnVpbGRib3QucHkKQEAgLTM3LDYgKzM3
LDggQEAgaW1wb3J0IHhtbHJwY2xpYgogZnJvbSB3ZWJraXRweS5jb21tb24ubmV0LmZhaWx1cmVt
YXAgaW1wb3J0IEZhaWx1cmVNYXAKIGZyb20gd2Via2l0cHkuY29tbW9uLm5ldC5sYXlvdXR0ZXN0
cmVzdWx0cyBpbXBvcnQgTGF5b3V0VGVzdFJlc3VsdHMKIGZyb20gd2Via2l0cHkuY29tbW9uLm5l
dC5yZWdyZXNzaW9ud2luZG93IGltcG9ydCBSZWdyZXNzaW9uV2luZG93Citmcm9tIHdlYmtpdHB5
LmNvbW1vbi5uZXQucmVtb3RlemlwIGltcG9ydCBSZW1vdGVaaXAKK2Zyb20gd2Via2l0cHkuY29t
bW9uLm5ldC5yZXN1bHRzZXQgaW1wb3J0IFJlc3VsdFNldAogZnJvbSB3ZWJraXRweS5jb21tb24u
c3lzdGVtLmxvZ3V0aWxzIGltcG9ydCBnZXRfbG9nZ2VyCiBmcm9tIHdlYmtpdHB5LnRoaXJkcGFy
dHkuYXV0b2luc3RhbGxlZC5tZWNoYW5pemUgaW1wb3J0IEJyb3dzZXIKIGZyb20gd2Via2l0cHku
dGhpcmRwYXJ0eS5CZWF1dGlmdWxTb3VwIGltcG9ydCBCZWF1dGlmdWxTb3VwCkBAIC04Nyw2ICs4
OSwxMiBAQCBjbGFzcyBCdWlsZGVyKG9iamVjdCk6CiAgICAgICAgIHNlbGYuX2J1aWxkc19jYWNo
ZVtidWlsZF9udW1iZXJdID0gYnVpbGQKICAgICAgICAgcmV0dXJuIGJ1aWxkCiAKKyAgICBkZWYg
bGF0ZXN0X2J1aWxkKHNlbGYpOgorICAgICAgICByZXZpc2lvbl9idWlsZF9wYWlycyA9IHNlbGYu
cmV2aXNpb25fYnVpbGRfcGFpcnNfd2l0aF9yZXN1bHRzKCkKKyAgICAgICAgcmV2aXNpb25fYnVp
bGRfcGFpcnMuc29ydChrZXk9bGFtYmRhIGk6IGlbMV0pCisgICAgICAgIGxhdGVzdF9idWlsZF9u
dW1iZXIgPSByZXZpc2lvbl9idWlsZF9wYWlyc1stMV1bMV0KKyAgICAgICAgcmV0dXJuIHNlbGYu
YnVpbGQobGF0ZXN0X2J1aWxkX251bWJlcikKKwogICAgIGRlZiBmb3JjZV9idWlsZChzZWxmLCB1
c2VybmFtZT0id2Via2l0LXBhdGNoIiwgY29tbWVudHM9Tm9uZSk6CiAgICAgICAgIGRlZiBwcmVk
aWNhdGUoZm9ybSk6CiAgICAgICAgICAgICB0cnk6CkBAIC0yMTYsNiArMjI0LDEyIEBAIGNsYXNz
IEJ1aWxkKG9iamVjdCk6CiAgICAgICAgIHJlc3VsdHNfZGlyZWN0b3J5ID0gInIlcyAoJXMpIiAl
IChzZWxmLnJldmlzaW9uKCksIHNlbGYuX251bWJlcikKICAgICAgICAgcmV0dXJuICIlcy8lcyIg
JSAoc2VsZi5fYnVpbGRlci5yZXN1bHRzX3VybCgpLCB1cmxsaWIucXVvdGUocmVzdWx0c19kaXJl
Y3RvcnkpKQogCisgICAgZGVmIHJlc3VsdHNfemlwX3VybChzZWxmKToKKyAgICAgICAgcmV0dXJu
ICIlcy56aXAiICUgc2VsZi5yZXN1bHRzX3VybCgpCisKKyAgICBkZWYgcmVzdWx0cyhzZWxmKToK
KyAgICAgICAgcmV0dXJuIFJlc3VsdFNldChzZWxmLl9idWlsZGVyLm5hbWUoKSwgTm9uZSwgUmVt
b3RlWmlwKHNlbGYucmVzdWx0c196aXBfdXJsKCkpLCBpbmNsdWRlX2V4cGVjdGVkPUZhbHNlKQor
CiAgICAgZGVmIF9mZXRjaF9yZXN1bHRzX2h0bWwoc2VsZik6CiAgICAgICAgIHJlc3VsdHNfaHRt
bCA9ICIlcy9yZXN1bHRzLmh0bWwiICUgKHNlbGYucmVzdWx0c191cmwoKSkKICAgICAgICAgIyBG
SVhNRTogVGhpcyBzaG91bGQgdXNlIE5ldHdvcmtUcmFuc2FjdGlvbidzIDQwNCBoYW5kbGluZyBp
bnN0ZWFkLgpkaWZmIC0tZ2l0IGEvV2ViS2l0VG9vbHMvU2NyaXB0cy93ZWJraXRweS9jb21tb24v
bmV0L3JlbW90ZXppcC5weSBiL1dlYktpdFRvb2xzL1NjcmlwdHMvd2Via2l0cHkvY29tbW9uL25l
dC9yZW1vdGV6aXAucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMC4uMzRlNGZkMTAzNTdmMzM4NTkzMjdkNWNlNWUyNGYx
NTAzNDlmOGE0MgotLS0gL2Rldi9udWxsCisrKyBiL1dlYktpdFRvb2xzL1NjcmlwdHMvd2Via2l0
cHkvY29tbW9uL25ldC9yZW1vdGV6aXAucHkKQEAgLTAsMCArMSw5NyBAQAorIyEvdXNyL2Jpbi9l
bnYgcHl0aG9uCisjIENvcHlyaWdodCAoQykgMjAxMCBHb29nbGUgSW5jLiBBbGwgcmlnaHRzIHJl
c2VydmVkLgorIworIyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5
IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyMgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHBy
b3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisjIGFyZSBtZXQ6CisjCisjIDEu
ICBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNv
cHlyaWdodAorIyAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZv
bGxvd2luZyBkaXNjbGFpbWVyLgorIyAyLiAgUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3Jt
IG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyMgICAgIG5vdGljZSwgdGhpcyBs
aXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyMg
ICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRo
ZSBkaXN0cmlidXRpb24uCisjCisjIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUg
QU5EIElUUyBDT05UUklCVVRPUlMgIkFTIElTIiBBTkQgQU5ZCisjIEVYUFJFU1MgT1IgSU1QTElF
RCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQK
KyMgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElD
VUxBUiBQVVJQT1NFIEFSRQorIyBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBP
UiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZCisjIERJUkVDVCwgSU5ESVJFQ1Qs
IElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VT
CisjIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJ
VFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyMgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7
IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECisjIE9OIEFOWSBU
SEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZ
LCBPUiBUT1JUCisjIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcg
SU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorIyBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFE
VklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCitmcm9tIHdlYmtpdHB5
LmNvbW1vbi5uZXQubmV0d29ya3RyYW5zYWN0aW9uIGltcG9ydCBOZXR3b3JrVHJhbnNhY3Rpb24K
K2ltcG9ydCBvcworaW1wb3J0IHNodXRpbAoraW1wb3J0IHRlbXBmaWxlCitpbXBvcnQgdXJsbGli
CitpbXBvcnQgemlwZmlsZQorCisKK2NsYXNzIFJlbW90ZVppcChvYmplY3QpOgorICAgICIiIkEg
emlwIGZpbGUgdGhhdCByZXNpZGVzIGF0IGEgVVJMIChsb2NhbCBvciByZW1vdGUpIiIiCisgICAg
ZGVmIF9faW5pdF9fKHNlbGYsIHppcF91cmwpOgorICAgICAgICBzZWxmLl96aXBfdXJsID0gemlw
X3VybAorICAgICAgICBzZWxmLl96aXBfZmlsZSA9IE5vbmUKKworICAgIGRlZiBfbG9hZChzZWxm
KToKKyAgICAgICAgaWYgc2VsZi5femlwX2ZpbGUgaXMgTm9uZToKKyAgICAgICAgICAgIHRlbXBf
ZmlsZSA9IE5ldHdvcmtUcmFuc2FjdGlvbigpLnJ1bihsYW1iZGE6IHVybGxpYi51cmxyZXRyaWV2
ZShzZWxmLl96aXBfdXJsKVswXSkKKyAgICAgICAgICAgIHNlbGYuX3ppcF9maWxlID0gemlwZmls
ZS5aaXBGaWxlKHRlbXBfZmlsZSkKKworICAgIGRlZiBoYW5kbGVfdG8oc2VsZiwgZmlsZW5hbWUp
OgorICAgICAgICByZXR1cm4gWmlwRmlsZUhhbmRsZShzZWxmLCBmaWxlbmFtZSkKKworICAgIGRl
ZiBuYW1lbGlzdChzZWxmKToKKyAgICAgICAgc2VsZi5fbG9hZCgpCisgICAgICAgIHJldHVybiBz
ZWxmLl96aXBfZmlsZS5uYW1lbGlzdCgpCisKKyAgICBkZWYgcmVhZChzZWxmLCBmaWxlbmFtZSk6
CisgICAgICAgIHNlbGYuX2xvYWQoKQorICAgICAgICByZXR1cm4gc2VsZi5femlwX2ZpbGUucmVh
ZChmaWxlbmFtZSkKKworICAgIGRlZiBleHRyYWN0KHNlbGYsIGZpbGVuYW1lLCBwYXRoKToKKyAg
ICAgICAgc2VsZi5fbG9hZCgpCisgICAgICAgIHJldHVybiBzZWxmLl96aXBfZmlsZS5leHRyYWN0
KGZpbGVuYW1lLCBwYXRoKQorCisgICAgZGVmIGRlbGV0ZShzZWxmLCBmaWxlbmFtZSk6CisgICAg
ICAgIHJhaXNlIEV4Y2VwdGlvbigiQ2FuJ3QgZGVsZXRlIGZyb20gYSBSZW1vdGVaaXAuIikKKwor
CitjbGFzcyBaaXBGaWxlSGFuZGxlOgorICAgICIiIlBvaW50cyB0byBhIGZpbGUgdGhhdCByZXNp
ZGVzIGluIGEgUmVtb3RlWmlwIiIiCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHppcF9maWxlLCBm
aWxlbmFtZSk6CisgICAgICAgIHNlbGYuX2ZpbGVuYW1lID0gZmlsZW5hbWUKKyAgICAgICAgc2Vs
Zi5femlwX2ZpbGUgPSB6aXBfZmlsZQorICAgICAgICBzZWxmLl9jb250ZW50cyA9IE5vbmUKKwor
ICAgIGRlZiBfX3N0cl9fKHNlbGYpOgorICAgICAgICByZXR1cm4gIiVzOiVzIiAlIChzZWxmLl96
aXBfZmlsZSwgc2VsZi5fZmlsZW5hbWUpCisKKyAgICBkZWYgY29udGVudHMoc2VsZik6CisgICAg
ICAgIGlmIHNlbGYuX2NvbnRlbnRzIGlzIE5vbmU6CisgICAgICAgICAgICBzZWxmLl9jb250ZW50
cyA9IHNlbGYuX3ppcF9maWxlLnJlYWQoc2VsZi5fZmlsZW5hbWUpCisgICAgICAgIHJldHVybiBz
ZWxmLl9jb250ZW50cworCisgICAgZGVmIHNhdmVfdG8oc2VsZiwgcGF0aCwgZmlsZW5hbWU9Tm9u
ZSk6CisgICAgICAgIGlmIGZpbGVuYW1lIGlzIE5vbmU6CisgICAgICAgICAgICBzZWxmLl96aXBf
ZmlsZS5leHRyYWN0KHNlbGYuX2ZpbGVuYW1lLCBwYXRoKQorICAgICAgICBlbHNlOgorICAgICAg
ICAgICAgdGVtcF9kaXIgPSB0ZW1wZmlsZS5ta2R0ZW1wKCkKKyAgICAgICAgICAgIHNlbGYuX3pp
cF9maWxlLmV4dHJhY3Qoc2VsZi5fZmlsZW5hbWUsIHRlbXBfZGlyKQorCisgICAgICAgICAgICBz
cmMgPSBvcy5wYXRoLmpvaW4odGVtcF9kaXIsIHNlbGYuX2ZpbGVuYW1lKQorICAgICAgICAgICAg
ZGVzdCA9IG9zLnBhdGguam9pbihwYXRoLCBmaWxlbmFtZSkKKyAgICAgICAgICAgIHNodXRpbC5j
b3B5ZmlsZShzcmMsIGRlc3QpCisgICAgICAgICAgICBzaHV0aWwucm10cmVlKHRlbXBfZGlyKQor
CisgICAgZGVmIGRlbGV0ZShzZWxmKToKKyAgICAgICAgc2VsZi5femlwX2ZpbGUuZGVsZXRlKHNl
bGYuX2ZpbGVuYW1lKQorCisgICAgZGVmIG5hbWUoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxm
Ll9maWxlbmFtZQorCisgICAgZGVmIHNwbGl0ZXh0KHNlbGYpOgorICAgICAgICByZXR1cm4gb3Mu
cGF0aC5zcGxpdGV4dChzZWxmLm5hbWUoKSkKZGlmZiAtLWdpdCBhL1dlYktpdFRvb2xzL1Njcmlw
dHMvd2Via2l0cHkvY29tbW9uL25ldC9yZXN1bHQucHkgYi9XZWJLaXRUb29scy9TY3JpcHRzL3dl
YmtpdHB5L2NvbW1vbi9uZXQvcmVzdWx0LnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAuLjg3ZTE2YjAyMmFkZTUyZDc2
ZDdjNzQ3NTBmZjViNjlkZmY1Njc1YTcKLS0tIC9kZXYvbnVsbAorKysgYi9XZWJLaXRUb29scy9T
Y3JpcHRzL3dlYmtpdHB5L2NvbW1vbi9uZXQvcmVzdWx0LnB5CkBAIC0wLDAgKzEsMTY3IEBACisj
IS91c3IvYmluL2VudiBweXRob24KKyMgQ29weXJpZ2h0IChDKSAyMDEwIEdvb2dsZSBJbmMuIEFs
bCByaWdodHMgcmVzZXJ2ZWQuCisjCisjIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNl
IGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorIyBtb2RpZmljYXRpb24sIGFyZSBw
ZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyMgYXJlIG1l
dDoKKyMKKyMgMS4gIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0
aGUgYWJvdmUgY29weXJpZ2h0CisjICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25z
IGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisjIDIuICBSZWRpc3RyaWJ1dGlvbnMgaW4g
YmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorIyAgICAgbm90
aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVy
IGluIHRoZQorIyAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3Zp
ZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyMKKyMgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURF
RCBCWSBBUFBMRSBBTkQgSVRTIENPTlRSSUJVVE9SUyAiQVMgSVMiIEFORCBBTlkKKyMgRVhQUkVT
UyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBU
SEUgSU1QTElFRAorIyBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBG
T1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCisjIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNI
QUxMIEFQUExFIE9SIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkKKyMgRElSRUNU
LCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5U
SUFMIERBTUFHRVMKKyMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVO
VCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworIyBMT1NTIE9GIFVTRSwgREFUQSwg
T1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQK
KyMgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklD
VCBMSUFCSUxJVFksIE9SIFRPUlQKKyMgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lT
RSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisjIFRISVMgU09GVFdBUkUs
IEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKK2lt
cG9ydCBvcworaW1wb3J0IHJlCisKKworY2xhc3MgTmFpdmVJbWFnZURpZmZlcihvYmplY3QpOgor
ICAgIGRlZiBzYW1lX2ltYWdlKHNlbGYsIGltZzEsIGltZzIpOgorICAgICAgICByZXR1cm4gaW1n
MSA9PSBpbWcyCisKKworY2xhc3MgUmVzdWx0KG9iamVjdCk6CisgICAgIiIiUmVwcmVzZW50cyB0
aGUgcmVzdWx0IG9mIGEgc2luZ2xlIHRlc3Qgb24gYSBzaW5nbGUgcGxhdGZvcm0iIiIKKyAgICBk
ZWYgX19pbml0X18oc2VsZiwgcGxhdGZvcm0sIHJlc3VsdF90eXBlLCBmaWxlcyk6CisgICAgICAg
IHNlbGYuX3BsYXRmb3JtID0gcGxhdGZvcm0KKyAgICAgICAgc2VsZi5fcmVzdWx0X3R5cGUgPSBy
ZXN1bHRfdHlwZQorICAgICAgICBzZWxmLl9maWxlcyA9IGZpbGVzCisgICAgICAgIHNlbGYuX21h
aW5fZmlsZSA9IGZpbGVzWzBdCisgICAgICAgIGZpbGVuYW1lID0gc2VsZi5fbWFpbl9maWxlLm5h
bWUoKQorICAgICAgICBzZWxmLl9uYW1lID0gc2VsZi5fZXh0cmFjdF90ZXN0X25hbWUoZmlsZW5h
bWUpCisgICAgICAgIHNlbGYuX2lzX2FjdHVhbCA9ICctYWN0dWFsLicgaW4gZmlsZW5hbWUKKwor
ICAgICAgICBpZiBzZWxmLl9wbGF0Zm9ybSBpcyBOb25lOgorICAgICAgICAgICAgc2VsZi5fcGxh
dGZvcm0gPSBzZWxmLl9leHRyYWN0X3BsYXRmb3JtKGZpbGVuYW1lKQorCisgICAgZGVmIF9leHRy
YWN0X3BsYXRmb3JtKHNlbGYsIGZpbGVuYW1lKToKKyAgICAgICAgIiIiQ2FsY3VsYXRlcyB0aGUg
cGxhdGZvcm0gZnJvbSB0aGUgbmFtZSBvZiB0aGUgZmlsZSBpZiBpdCBpc24ndCBrbm93biBhbHJl
YWR5IiIiCisgICAgICAgIHBhdGggPSByZS5zcGxpdChvcy5wYXRoLnNlcCwgZmlsZW5hbWUpCisg
ICAgICAgIGlmICdwbGF0Zm9ybScgaW4gcGF0aDoKKyAgICAgICAgICAgIHJldHVybiBwYXRoW3Bh
dGguaW5kZXgoJ3BsYXRmb3JtJykgKyAxXQorICAgICAgICByZXR1cm4gTm9uZQorCisgICAgZGVm
IF9leHRyYWN0X3Rlc3RfbmFtZShzZWxmLCBmaWxlbmFtZSk6CisgICAgICAgIHRlc3RfbmFtZSA9
IGZpbGVuYW1lCisgICAgICAgIHBhdGggPSByZS5zcGxpdChvcy5wYXRoLnNlcCwgdGVzdF9uYW1l
KQorICAgICAgICBpZiAnTGF5b3V0VGVzdHMnIGluIHBhdGg6CisgICAgICAgICAgICBwYXRoID0g
cGF0aFsxICsgcGF0aC5pbmRleCgnTGF5b3V0VGVzdHMnKTpdCisgICAgICAgIGlmICdsYXlvdXQt
dGVzdC1yZXN1bHRzJyBpbiBwYXRoOgorICAgICAgICAgICAgcGF0aCA9IHBhdGhbMSArIHBhdGgu
aW5kZXgoJ2xheW91dC10ZXN0LXJlc3VsdHMnKTpdCisgICAgICAgIGlmICdwbGF0Zm9ybScgaW4g
cGF0aDoKKyAgICAgICAgICAgIHBhdGggPSBwYXRoWzIgKyBwYXRoLmluZGV4KCdwbGF0Zm9ybScp
Ol0KKworICAgICAgICB0ZXN0X25hbWUgPSBwYXRoWy0xXQorICAgICAgICB0ZXN0X25hbWUgPSBy
ZS5zdWIoJy1leHBlY3RlZFwuLiokJywgJycsIHRlc3RfbmFtZSkKKyAgICAgICAgdGVzdF9uYW1l
ID0gcmUuc3ViKCctYWN0dWFsXC4uKiQnLCAnJywgdGVzdF9uYW1lKQorICAgICAgICBwYXRoWy0x
XSA9IHRlc3RfbmFtZQorICAgICAgICByZXR1cm4gb3MucGF0aC5zZXAuam9pbihwYXRoKQorCisg
ICAgZGVmIF9zZXRfdGVzdF9uYW1lKHNlbGYsIGZpbGVuYW1lKToKKyAgICAgICAgc2VsZi5fdGVz
dF9uYW1lID0gZmlsZW5hbWUKKyAgICAgICAgaWYgb3MucGF0aC5zZXAgaW4gZmlsZW5hbWU6Cisg
ICAgICAgICAgICBzZWxmLl90ZXN0X25hbWUgPSBmaWxlbmFtZVs6ZmlsZW5hbWUucmluZGV4KG9z
LnBhdGguc2VwKV0KKworICAgIGRlZiBjb250ZW50cyhzZWxmKToKKyAgICAgICAgcmV0dXJuIHNl
bGYuX21haW5fZmlsZS5jb250ZW50cygpCisKKyAgICBkZWYgc2F2ZV90byhzZWxmLCBwYXRoKToK
KyAgICAgICAgZm9yIGZpbGUgaW4gc2VsZi5fZmlsZXM6CisgICAgICAgICAgICBmaWxlLnNhdmVf
dG8ocGF0aCkKKworICAgIGRlZiBpc19hY3R1YWwoc2VsZik6CisgICAgICAgICIiIkFyZSB0aGVz
ZSByZXN1bHRzIHRoZSBhY3R1YWwgb3V0cHV0IG9mIGEgdGVzdD8iIiIKKyAgICAgICAgcmV0dXJu
IHNlbGYuX2lzX2FjdHVhbAorCisgICAgZGVmIG5hbWUoc2VsZik6CisgICAgICAgICIiIlRoZSBu
YW1lIG9mIHRoaXMgdGVzdCAoZG9lc24ndCBpbmNsdWRlIGV4dGVuc2lvbikiIiIKKyAgICAgICAg
cmV0dXJuIHNlbGYuX25hbWUKKworICAgIGRlZiBzYW1lX2NvbnRlbnQoc2VsZiwgb3RoZXIpOgor
ICAgICAgICByZXR1cm4gc2VsZi5jb250ZW50cygpID09IG90aGVyLmNvbnRlbnRzKCkKKworICAg
IGRlZiBfX2VxX18oc2VsZiwgb3RoZXIpOgorICAgICAgICByZXR1cm4gb3RoZXIgIT0gTm9uZSBh
bmQgc2VsZi5uYW1lKCkgPT0gb3RoZXIubmFtZSgpIGFuZCBzZWxmLnR5cGUoKSA9PSBvdGhlci50
eXBlKCkgYW5kIHNlbGYucGxhdGZvcm0oKSA9PSBvdGhlci5wbGF0Zm9ybSgpIGFuZCBzZWxmLmlz
X2FjdHVhbCgpID09IG90aGVyLmlzX2FjdHVhbCgpIGFuZCBzZWxmLnNhbWVfY29udGVudChvdGhl
cikKKworICAgIGRlZiBfX2hhc2hfXyhzZWxmKToKKyAgICAgICAgcmV0dXJuIGhhc2goc3RyKHNl
bGYubmFtZSgpKSArIHN0cihzZWxmLnR5cGUoKSkgKyBzdHIoc2VsZi5wbGF0Zm9ybSgpKSkKKwor
ICAgIGRlZiBpc19uZXdlcl90aGFuKHNlbGYsIG90aGVyKToKKyAgICAgICAgIiIiJ05ldycgcmVz
dWx0cyBhcmUgdGhvc2UgYWN0dWFsbHkgY29taW5nIGZyb20gYSB0ZXN0LiIiIgorICAgICAgICBy
ZXR1cm4gc2VsZi5pc19hY3R1YWwoKSBhbmQgbm90IG90aGVyLmlzX2FjdHVhbCgpCisKKyAgICBk
ZWYgaXNfcmViYXNlbGluZV9vZihzZWxmLCBvdGhlcik6CisgICAgICAgIHJldHVybiBzZWxmLm5h
bWUoKSA9PSBvdGhlci5uYW1lKCkgYW5kIHNlbGYudHlwZSgpID09IG90aGVyLnR5cGUoKSBhbmQg
c2VsZi5wbGF0Zm9ybSgpID09IG90aGVyLnBsYXRmb3JtKCkgYW5kIHNlbGYuaXNfYWN0dWFsKCkg
YW5kIChub3Qgb3RoZXIuaXNfYWN0dWFsKCkpCisKKyAgICBkZWYgX19zdHJfXyhzZWxmKToKKyAg
ICAgICAgYWN0dWFsX3N0ciA9ICdbQV0gJyBpZiBzZWxmLmlzX2FjdHVhbCgpIGVsc2UgJycKKyAg
ICAgICAgcmV0dXJuICJSZXN1bHRbJXMvJXNdICVzJXMiICUgKHNlbGYuX3BsYXRmb3JtLCBzZWxm
Ll9yZXN1bHRfdHlwZSwgYWN0dWFsX3N0ciwgc2VsZi5uYW1lKCkpCisKKyAgICBkZWYgdHlwZShz
ZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX3Jlc3VsdF90eXBlCisKKyAgICBkZWYgcGxhdGZv
cm0oc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLl9wbGF0Zm9ybQorCisgICAgZGVmIF9pbnN0
YWxsX2ZpbGUoc2VsZiwgZmlsZSwgcGF0aCk6CisgICAgICAgIGlmIHNlbGYuX3BsYXRmb3JtIGlz
IE5vbmU6CisgICAgICAgICAgICBwbGF0Zm9ybV9jb21wb25lbnQgPSAiIgorICAgICAgICBlbHNl
OgorICAgICAgICAgICAgcGxhdGZvcm1fY29tcG9uZW50ID0gInBsYXRmb3JtLyVzLyIgJSBzZWxm
Ll9wbGF0Zm9ybQorICAgICAgICBleHRlbnNpb24gPSBvcy5wYXRoLnNwbGl0ZXh0KGZpbGUubmFt
ZSgpKVsxXQorICAgICAgICBwYXRoID0gJyVzLyVzJyAlIChwYXRoLCBwbGF0Zm9ybV9jb21wb25l
bnQpCisgICAgICAgIGZpbGVuYW1lID0gc2VsZi5uYW1lKCkgKyAnLWV4cGVjdGVkJyArIGV4dGVu
c2lvbgorICAgICAgICBmaWxlLnNhdmVfdG8ocGF0aCwgZmlsZW5hbWUpCisKKyAgICBkZWYgaW5z
dGFsbChzZWxmLCBwYXRoKToKKyAgICAgICAgZm9yIGZpbGUgaW4gc2VsZi5fZmlsZXM6CisgICAg
ICAgICAgICBzZWxmLl9pbnN0YWxsX2ZpbGUoZmlsZSwgcGF0aCkKKworICAgIGRlZiBkZWxldGUo
c2VsZik6CisgICAgICAgIGZvciBmaWxlIGluIHNlbGYuX2ZpbGVzOgorICAgICAgICAgICAgZmls
ZS5kZWxldGUoKQorCisKK2NsYXNzIFRleHRSZXN1bHQoUmVzdWx0KToKKyAgICAiIiJSZXByZXNl
bnRzIGEgdGV4dCByZXN1bHQgb2YgYSBzaW5nbGUgdGVzdCBvbiBhIHNpbmdsZSBwbGF0Zm9ybSIi
IgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBwbGF0Zm9ybSwgdGV4dF9maWxlKToKKyAgICAgICAg
c2VsZi5fdGV4dF9maWxlID0gdGV4dF9maWxlCisgICAgICAgIFJlc3VsdC5fX2luaXRfXyhzZWxm
LCBwbGF0Zm9ybSwgJ3RleHQnLCBbdGV4dF9maWxlXSkKKworICAgIGRlZiByZXRhcmdldChzZWxm
LCBwbGF0Zm9ybSk6CisgICAgICAgIHJldHVybiBUZXh0UmVzdWx0KHBsYXRmb3JtLCBzZWxmLl90
ZXh0X2ZpbGUpCisKKworY2xhc3MgSW1hZ2VSZXN1bHQoUmVzdWx0KToKKyAgICBpbWFnZV9kaWZm
ZXIgPSBOYWl2ZUltYWdlRGlmZmVyKCkKKyAgICAiIiJSZXByZXNlbnRzIGFuIGltYWdlIHJlc3Vs
dCBvZiBhIHNpbmdsZSB0ZXN0IG9uIGEgc2luZ2xlIHBsYXRmb3JtIiIiCisgICAgZGVmIF9faW5p
dF9fKHNlbGYsIHBsYXRmb3JtLCBpbWFnZV9maWxlLCBjaGVja3N1bV9maWxlKToKKyAgICAgICAg
c2VsZi5fY2hlY2tzdW1fZmlsZSA9IGNoZWNrc3VtX2ZpbGUKKyAgICAgICAgc2VsZi5faW1hZ2Vf
ZmlsZSA9IGltYWdlX2ZpbGUKKyAgICAgICAgZmlsZXMgPSBmaWx0ZXIoYm9vbCwgW3NlbGYuX2No
ZWNrc3VtX2ZpbGUsIHNlbGYuX2ltYWdlX2ZpbGVdKQorICAgICAgICBSZXN1bHQuX19pbml0X18o
c2VsZiwgcGxhdGZvcm0sICdpbWFnZScsIGZpbGVzKQorCisgICAgZGVmIGhhc19jaGVja3N1bShz
ZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX2NoZWNrc3VtX2ZpbGUgaXMgbm90IE5vbmUKKwor
ICAgIGRlZiBzYW1lX2NvbnRlbnQoc2VsZiwgb3RoZXIpOgorICAgICAgICBpZiBzZWxmLmhhc19j
aGVja3N1bSgpIGFuZCBvdGhlci5oYXNfY2hlY2tzdW0oKToKKyAgICAgICAgICAgIHJldHVybiBz
ZWxmLl9jaGVja3N1bV9maWxlLmNvbnRlbnRzKCkgPT0gb3RoZXIuX2NoZWNrc3VtX2ZpbGUuY29u
dGVudHMoKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZl9jb250ZW50cyA9IHNlbGYu
X2ltYWdlX2ZpbGUuY29udGVudHMoKQorICAgICAgICAgICAgb3RoZXJfY29udGVudHMgPSBvdGhl
ci5faW1hZ2VfZmlsZS5jb250ZW50cygpCisgICAgICAgICAgICByZXR1cm4gSW1hZ2VSZXN1bHQu
aW1hZ2VfZGlmZmVyLnNhbWVfaW1hZ2Uoc2VsZl9jb250ZW50cywgb3RoZXJfY29udGVudHMpCisK
KyAgICBkZWYgcmV0YXJnZXQoc2VsZiwgcGxhdGZvcm0pOgorICAgICAgICByZXR1cm4gSW1hZ2VS
ZXN1bHQocGxhdGZvcm0sIHNlbGYuX2ltYWdlX2ZpbGUsIHNlbGYuX2NoZWNrc3VtX2ZpbGUpCmRp
ZmYgLS1naXQgYS9XZWJLaXRUb29scy9TY3JpcHRzL3dlYmtpdHB5L2NvbW1vbi9uZXQvcmVzdWx0
X3VuaXR0ZXN0LnB5IGIvV2ViS2l0VG9vbHMvU2NyaXB0cy93ZWJraXRweS9jb21tb24vbmV0L3Jl
c3VsdF91bml0dGVzdC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwLi5lZGRkZDgyZDQxYjQzZWY1ZTMxNjFlOTE1OTVm
ZGQ5YTg5MDdlZTYwCi0tLSAvZGV2L251bGwKKysrIGIvV2ViS2l0VG9vbHMvU2NyaXB0cy93ZWJr
aXRweS9jb21tb24vbmV0L3Jlc3VsdF91bml0dGVzdC5weQpAQCAtMCwwICsxLDEzMyBAQAorIyEv
dXNyL2Jpbi9lbnYgcHl0aG9uCisjIENvcHlyaWdodCAoQykgMjAxMCBHb29nbGUgSW5jLiBBbGwg
cmlnaHRzIHJlc2VydmVkLgorIworIyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBh
bmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyMgbW9kaWZpY2F0aW9uLCBhcmUgcGVy
bWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisjIGFyZSBtZXQ6
CisjCisjIDEuICBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhl
IGFib3ZlIGNvcHlyaWdodAorIyAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBh
bmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorIyAyLiAgUmVkaXN0cmlidXRpb25zIGluIGJp
bmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyMgICAgIG5vdGlj
ZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBp
biB0aGUKKyMgICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRl
ZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisjCisjIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQg
QlkgQVBQTEUgQU5EIElUUyBDT05UUklCVVRPUlMgIkFTIElTIiBBTkQgQU5ZCisjIEVYUFJFU1Mg
T1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhF
IElNUExJRUQKKyMgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9S
IEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQorIyBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFM
TCBBUFBMRSBPUiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZCisjIERJUkVDVCwg
SU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElB
TCBEQU1BR0VTCisjIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQg
T0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyMgTE9TUyBPRiBVU0UsIERBVEEsIE9S
IFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECisj
IE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1Qg
TElBQklMSVRZLCBPUiBUT1JUCisjIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0Up
IEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorIyBUSElTIFNPRlRXQVJFLCBF
VkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCitpbXBv
cnQgcmUKK2ltcG9ydCByZXN1bHQKK2ltcG9ydCB1bml0dGVzdAorCisKK2NsYXNzIEZha2VGaWxl
KG9iamVjdCk6CisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGZpbGVuYW1lLCBjb250ZW50cz0iZmFr
ZSBjb250ZW50cyIpOgorICAgICAgICBzZWxmLl9maWxlbmFtZSA9IGZpbGVuYW1lCisgICAgICAg
IHNlbGYuX2NvbnRlbnRzID0gY29udGVudHMKKworICAgIGRlZiBuYW1lKHNlbGYpOgorICAgICAg
ICByZXR1cm4gc2VsZi5fZmlsZW5hbWUKKworICAgIGRlZiBjb250ZW50cyhzZWxmKToKKyAgICAg
ICAgcmV0dXJuIHNlbGYuX2NvbnRlbnRzCisKKworY2xhc3MgRmFrZVJlc3VsdChyZXN1bHQuUmVz
dWx0KToKKyAgICBkZWYgX19pbml0X18oc2VsZiwgcGxhdGZvcm0sIHJlc3VsdF90eXBlLCBjb250
ZW50cywgaXNfZXhwZWN0ZWQ9RmFsc2UpOgorICAgICAgICBzZWxmLl9yZXN1bHRfdHlwZSA9IHJl
c3VsdF90eXBlCisgICAgICAgIHNlbGYuX2NvbnRlbnRzID0gY29udGVudHMKKyAgICAgICAgc2Vs
Zi5faXNfZXhwZWN0ZWQgPSBpc19leHBlY3RlZAorICAgICAgICBhY3R1YWwgPSAnYWN0dWFsJwor
ICAgICAgICBpZiBpc19leHBlY3RlZDoKKyAgICAgICAgICAgIGFjdHVhbCA9ICdleHBlY3RlZCcK
KyAgICAgICAgdGVzdF9uYW1lID0gJ2Fub255bW91cy10ZXN0LSVzLnR4dCcgJSBhY3R1YWwKKyAg
ICAgICAgZmlsZSA9IEZha2VGaWxlKHRlc3RfbmFtZSwgY29udGVudHMpCisgICAgICAgIHN1cGVy
KEZha2VSZXN1bHQsIHNlbGYpLl9faW5pdF9fKHBsYXRmb3JtLCByZXN1bHRfdHlwZSwgW2ZpbGVd
KQorCisgICAgZGVmIGNvbnRlbnRzKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5fY29udGVu
dHMKKworICAgIGRlZiByZXRhcmdldChzZWxmLCBwbGF0Zm9ybSk6CisgICAgICAgIHJldHVybiBG
YWtlUmVzdWx0KHBsYXRmb3JtLCBzZWxmLl9yZXN1bHRfdHlwZSwgc2VsZi5fY29udGVudHMsIHNl
bGYuX2lzX2V4cGVjdGVkKQorCisKK2NsYXNzIFJlc3VsdFRlc3QodW5pdHRlc3QuVGVzdENhc2Up
OgorICAgIGRlZiBfY2hlY2tfbmFtZShzZWxmLCBmaWxlbmFtZSwgZXhwZWN0ZWRfdGVzdF9uYW1l
KToKKyAgICAgICAgciA9IHJlc3VsdC5UZXh0UmVzdWx0KE5vbmUsIEZha2VGaWxlKGZpbGVuYW1l
KSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoZXhwZWN0ZWRfdGVzdF9uYW1lLCByLm5hbWUo
KSkKKworICAgIGRlZiBfY2hlY2tfcGxhdGZvcm0oc2VsZiwgZmlsZW5hbWUsIGV4cGVjdGVkX3Bs
YXRmb3JtKToKKyAgICAgICAgciA9IHJlc3VsdC5UZXh0UmVzdWx0KE5vbmUsIEZha2VGaWxlKGZp
bGVuYW1lKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoZXhwZWN0ZWRfcGxhdGZvcm0sIHIu
cGxhdGZvcm0oKSkKKworICAgIGRlZiB0ZXN0RXh0cmFjdHNOYW1lQ29ycmVjdGx5KHNlbGYpOgor
ICAgICAgICBzZWxmLl9jaGVja19uYW1lKCdMYXlvdXRUZXN0cy9mYXN0L2RvbS9hLWV4cGVjdGVk
LnR4dCcsICdmYXN0L2RvbS9hJykKKyAgICAgICAgc2VsZi5fY2hlY2tfbmFtZSgnTGF5b3V0VGVz
dHMvZmFzdC9kb20vYS1hY3R1YWwudHh0JywgJ2Zhc3QvZG9tL2EnKQorICAgICAgICBzZWxmLl9j
aGVja19uYW1lKCdMYXlvdXRUZXN0cy9wbGF0Zm9ybS93aW4vZmFzdC9hLWV4cGVjdGVkLnR4dCcs
ICdmYXN0L2EnKQorICAgICAgICBzZWxmLl9jaGVja19uYW1lKCdMYXlvdXRUZXN0cy9wbGF0Zm9y
bS93aW4vZmFzdC9hLWV4cGVjdGVkLmNoZWNrc3VtJywgJ2Zhc3QvYScpCisgICAgICAgIHNlbGYu
X2NoZWNrX25hbWUoJ2Zhc3QvZG9tL3Rlc3QtZXhwZWN0ZWQudHh0JywgJ2Zhc3QvZG9tL3Rlc3Qn
KQorICAgICAgICBzZWxmLl9jaGVja19uYW1lKCdsYXlvdXQtdGVzdC1yZXN1bHRzL2Zhc3QvYS1h
Y3R1YWwuY2hlY2tzdW0nLCAnZmFzdC9hJykKKworICAgIGRlZiB0ZXN0RXh0cmFjdHNQbGF0Zm9y
bUNvcnJlY3RseShzZWxmKToKKyAgICAgICAgc2VsZi5fY2hlY2tfcGxhdGZvcm0oJ0xheW91dFRl
c3RzL3BsYXRmb3JtL3dpbi9mYXN0L2EtZXhwZWN0ZWQudHh0JywgJ3dpbicpCisgICAgICAgIHNl
bGYuX2NoZWNrX3BsYXRmb3JtKCdwbGF0Zm9ybS93aW4vZmFzdC9hLWV4cGVjdGVkLnR4dCcsICd3
aW4nKQorICAgICAgICBzZWxmLl9jaGVja19wbGF0Zm9ybSgncGxhdGZvcm0vbWFjL2Zhc3QvYS1l
eHBlY3RlZC50eHQnLCAnbWFjJykKKyAgICAgICAgc2VsZi5fY2hlY2tfcGxhdGZvcm0oJ2Zhc3Qv
YS1leHBlY3RlZC50eHQnLCBOb25lKQorCisgICAgZGVmIHRlc3RSZXN1bHRzRnJvbUFuQWN0dWFs
RmlsZUFyZU1hcmtlZEFzU3VjaChzZWxmKToKKyAgICAgICAgciA9IHJlc3VsdC5UZXh0UmVzdWx0
KE5vbmUsIEZha2VGaWxlKCd0ZXN0LWFjdHVhbC50eHQnKSkKKyAgICAgICAgc2VsZi5hc3NlcnRU
cnVlKHIuaXNfYWN0dWFsKCkpCisKKyAgICBkZWYgdGVzdFJlc3VsdHNGcm9tQW5FeHBlY3RlZEZp
bGVBcmVOb3RBY3R1YWwoc2VsZik6CisgICAgICAgIHIgPSByZXN1bHQuVGV4dFJlc3VsdChOb25l
LCBGYWtlRmlsZSgndGVzdC1leHBlY3RlZC50eHQnKSkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxz
ZShyLmlzX2FjdHVhbCgpKQorCisgICAgZGVmIHRlc3RJc1JlYmFzZWxpbmVPZihzZWxmKToKKyAg
ICAgICAgZXhwZWN0ZWQgPSByZXN1bHQuVGV4dFJlc3VsdCgnbWFjJywgRmFrZUZpbGUoJ3Rlc3Qt
ZXhwZWN0ZWQudHh0JykpCisgICAgICAgIGFjdHVhbCA9IHJlc3VsdC5UZXh0UmVzdWx0KCdtYWMn
LCBGYWtlRmlsZSgndGVzdC1hY3R1YWwudHh0JykpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShh
Y3R1YWwuaXNfcmViYXNlbGluZV9vZihleHBlY3RlZCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFs
c2UoZXhwZWN0ZWQuaXNfcmViYXNlbGluZV9vZihhY3R1YWwpKQorCisgICAgZGVmIHRlc3RfX2Vx
X18oc2VsZik6CisgICAgICAgIHIxID0gcmVzdWx0LlRleHRSZXN1bHQoJ21hYycsIEZha2VGaWxl
KCd0ZXN0LWV4cGVjdGVkLnR4dCcsICdjb250ZW50cycpKQorICAgICAgICByMiA9IHJlc3VsdC5U
ZXh0UmVzdWx0KCdtYWMnLCBGYWtlRmlsZSgndGVzdC1leHBlY3RlZC50eHQnLCAnY29udGVudHMn
KSkKKyAgICAgICAgcjMgPSByZXN1bHQuVGV4dFJlc3VsdCgnd2luJywgRmFrZUZpbGUoJ3Rlc3Qt
ZXhwZWN0ZWQudHh0JywgJ2NvbnRlbnRzJykpCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMo
cjEsIHIyKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhyMSwgcjIucmV0YXJnZXQoJ21hYycp
KQorICAgICAgICBzZWxmLmFzc2VydE5vdEVxdWFscyhyMSwgcjIucmV0YXJnZXQoJ3dpbicpKQor
CisgICAgZGVmIHRlc3RfX2hhc2hfXyhzZWxmKToKKyAgICAgICAgcjEgPSByZXN1bHQuVGV4dFJl
c3VsdCgnbWFjJywgRmFrZUZpbGUoJ3Rlc3QtZXhwZWN0ZWQudHh0JywgJ2NvbnRlbnRzJykpCisg
ICAgICAgIHIyID0gcmVzdWx0LlRleHRSZXN1bHQoJ21hYycsIEZha2VGaWxlKCd0ZXN0LWV4cGVj
dGVkLnR4dCcsICdjb250ZW50cycpKQorICAgICAgICByMyA9IHJlc3VsdC5UZXh0UmVzdWx0KE5v
bmUsIEZha2VGaWxlKCd0ZXN0LWV4cGVjdGVkLnR4dCcsIE5vbmUpKQorCisgICAgICAgIHggPSBz
ZXQoW3IxLCByMl0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKDEsIGxlbihzZXQoW3IxLCBy
Ml0pKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoMiwgbGVuKHNldChbcjEsIHIyLCByM10p
KSkKKworICAgIGRlZiB0ZXN0SW1hZ2VEaWZmSXNJbnZva2VkRm9ySW1hZ2VSZXN1bHRzV2l0aG91
dENoZWNrc3VtKHNlbGYpOgorICAgICAgICByMSA9IHJlc3VsdC5JbWFnZVJlc3VsdCgnbWFjJywg
RmFrZUZpbGUoJ3Rlc3QtZXhwZWN0ZWQucG5nJywgJ2FzZGYnKSwgRmFrZUZpbGUoJ3Rlc3QtZXhw
ZWN0ZWQuY2hlY2tzdW0nLCAnY2hlY2snKSkKKyAgICAgICAgcjIgPSByZXN1bHQuSW1hZ2VSZXN1
bHQoJ21hYycsIEZha2VGaWxlKCd0ZXN0LWV4cGVjdGVkLnBuZycsICdhc2RmJyksIE5vbmUpCisK
KyAgICAgICAgIyBEZWZhdWx0IGJlaGF2aW91ciBpcyB0byBqdXN0IGNvbXBhcmUgb24gaW1hZ2Ug
Y29udGVudHMuCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShyMS5zYW1lX2NvbnRlbnQocjIpKQor
CisgICAgICAgIGNsYXNzIEFsbEltYWdlc0FyZURpZmZlcmVudChvYmplY3QpOgorICAgICAgICAg
ICAgZGVmIHNhbWVfaW1hZ2Uoc2VsZiwgaW1hZ2UxLCBpbWFnZTIpOgorICAgICAgICAgICAgICAg
IHJldHVybiBGYWxzZQorCisgICAgICAgICMgQnV0IHdlIGNhbiBpbnN0YWxsIG90aGVyIGltYWdl
IGRpZmZlcnMuCisgICAgICAgIHJlc3VsdC5JbWFnZVJlc3VsdC5pbWFnZV9kaWZmZXIgPSBBbGxJ
bWFnZXNBcmVEaWZmZXJlbnQoKQorCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UocjEuc2FtZV9j
b250ZW50KHIyKSkKKworaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKKyAgICB1bml0dGVzdC5t
YWluKCkKZGlmZiAtLWdpdCBhL1dlYktpdFRvb2xzL1NjcmlwdHMvd2Via2l0cHkvY29tbW9uL25l
dC9yZXN1bHRzZXQucHkgYi9XZWJLaXRUb29scy9TY3JpcHRzL3dlYmtpdHB5L2NvbW1vbi9uZXQv
cmVzdWx0c2V0LnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAuLjFiOTZhZmIyMzFiYTEyODBlMzVhYTFlM2E5NjViZjU5
ODQ4NzE5MGUKLS0tIC9kZXYvbnVsbAorKysgYi9XZWJLaXRUb29scy9TY3JpcHRzL3dlYmtpdHB5
L2NvbW1vbi9uZXQvcmVzdWx0c2V0LnB5CkBAIC0wLDAgKzEsMTMxIEBACisjIS91c3IvYmluL2Vu
diBweXRob24KKyMgQ29weXJpZ2h0IChDKSAyMDEwIEdvb2dsZSBJbmMuIEFsbCByaWdodHMgcmVz
ZXJ2ZWQuCisjCisjIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkg
Zm9ybXMsIHdpdGggb3Igd2l0aG91dAorIyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJv
dmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyMgYXJlIG1ldDoKKyMKKyMgMS4g
IFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29w
eXJpZ2h0CisjICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9s
bG93aW5nIGRpc2NsYWltZXIuCisjIDIuICBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0g
bXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorIyAgICAgbm90aWNlLCB0aGlzIGxp
c3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorIyAg
ICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhl
IGRpc3RyaWJ1dGlvbi4KKyMKKyMgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBB
TkQgSVRTIENPTlRSSUJVVE9SUyAiQVMgSVMiIEFORCBBTlkKKyMgRVhQUkVTUyBPUiBJTVBMSUVE
IFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRAor
IyBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNV
TEFSIFBVUlBPU0UgQVJFCisjIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIE9S
IElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkKKyMgRElSRUNULCBJTkRJUkVDVCwg
SU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMK
KyMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElU
VVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworIyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsg
T1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKKyMgT04gQU5ZIFRI
RU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFks
IE9SIFRPUlQKKyMgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJ
TiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisjIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURW
SVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKK2Zyb20gd2Via2l0cHku
Y29tbW9uLmRpcmFzemlwIGltcG9ydCBEaXJlY3RvcnlBc1ppcAorZnJvbSB3ZWJraXRweS5jb21t
b24ubmV0LnJlbW90ZXppcCBpbXBvcnQgUmVtb3RlWmlwCitpbXBvcnQgcmUKK2ltcG9ydCByZXN1
bHQKK2ltcG9ydCB1cmxsaWIKKworCitjbGFzcyBSZXN1bHRTZXQob2JqZWN0KToKKyAgICAiIiJS
ZXRyaWV2ZXMgcmVzdWx0cyBmcm9tIHppcCBmaWxlcyIiIgorICAgIGRlZiBfX2luaXRfXyhzZWxm
LCBuYW1lLCBwbGF0Zm9ybSwgemlwX2ZpbGUsICoqa3dhcmdzKToKKyAgICAgICAgc2VsZi5fbmFt
ZSA9IG5hbWUKKyAgICAgICAgc2VsZi5fcGxhdGZvcm0gPSBwbGF0Zm9ybQorICAgICAgICBzZWxm
Ll96aXBfZmlsZSA9IHppcF9maWxlCisgICAgICAgIHNlbGYuX2luY2x1ZGVfZXhwZWN0ZWQgPSBr
d2FyZ3MuZ2V0KCdpbmNsdWRlX2V4cGVjdGVkJywgVHJ1ZSkKKworICAgIEBjbGFzc21ldGhvZAor
ICAgIGRlZiBmcm9tX3ppcF91cmwoY2xzLCBwbGF0Zm9ybSwgemlwX3BhdGgpOgorICAgICAgICBy
ZXR1cm4gUmVzdWx0U2V0KCdsb2NhbCB6aXAgJXMgYnVpbGRlcicgJSBwbGF0Zm9ybSwgcGxhdGZv
cm0sIFJlbW90ZVppcCh6aXBfcGF0aCkpCisKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgZnJv
bV96aXAoY2xzLCBwbGF0Zm9ybSwgemlwKToKKyAgICAgICAgcmV0dXJuIFJlc3VsdFNldCgnbG9j
YWwgemlwICVzIGJ1aWxkZXInICUgcGxhdGZvcm0sIHBsYXRmb3JtLCB6aXApCisKKyAgICBAY2xh
c3NtZXRob2QKKyAgICBkZWYgZnJvbV96aXBfbWFwKGNscywgemlwX21hcCk6CisgICAgICAgIHJl
c3VsdF9zZXRzID0gW10KKyAgICAgICAgZm9yIGssIHYgaW4gemlwX21hcC5pdGVtcygpOgorICAg
ICAgICAgICAgcmVzdWx0X3NldHMuYXBwZW5kKFJlc3VsdFNldC5mcm9tX3ppcChrLCB2KSkKKyAg
ICAgICAgcmV0dXJuIEFnZ3JlZ2F0ZVJlc3VsdFNldChyZXN1bHRfc2V0cykKKworICAgIEBjbGFz
c21ldGhvZAorICAgIGRlZiBmcm9tX3BhdGgoc2VsZiwgcGF0aCwgcGxhdGZvcm09Tm9uZSk6Cisg
ICAgICAgIHogPSBEaXJlY3RvcnlBc1ppcChwYXRoKQorICAgICAgICByZXR1cm4gUmVzdWx0U2V0
KCdsb2NhbCAlcyBidWlsZGVyJyAlIHBsYXRmb3JtLCBwbGF0Zm9ybSwgeikKKworICAgIGRlZiBu
YW1lKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5fbmFtZQorCisgICAgZGVmIHNldF9wbGF0
Zm9ybShzZWxmLCBwbGF0Zm9ybSk6CisgICAgICAgIHNlbGYuX3BsYXRmb3JtID0gcGxhdGZvcm0K
KworICAgIGRlZiBmaWxlcyhzZWxmKToKKyAgICAgICAgZmlsZXMgPSBbXQorICAgICAgICBmb3Ig
ZmlsZW5hbWUgaW4gc2VsZi5femlwX2ZpbGUubmFtZWxpc3QoKToKKyAgICAgICAgICAgIGZpbGVz
LmFwcGVuZChzZWxmLl96aXBfZmlsZS5oYW5kbGVfdG8oZmlsZW5hbWUpKQorICAgICAgICByZXR1
cm4gZmlsZXMKKworICAgIGRlZiByZXN1bHRzX2ZvcihzZWxmLCBuYW1lLCAqKmt3YXJncyk6Cisg
ICAgICAgIHRhcmdldF90eXBlID0ga3dhcmdzLmdldCgndGFyZ2V0X3R5cGUnLCBOb25lKQorICAg
ICAgICBleGFjdF9tYXRjaCA9IGt3YXJncy5nZXQoJ2V4YWN0X21hdGNoJywgRmFsc2UpCisgICAg
ICAgIGlmIHJlLnNlYXJjaChyJ1wueD9odG1sJywgbmFtZSk6CisgICAgICAgICAgICBuYW1lID0g
bmFtZVs6bmFtZS5yaW5kZXgoJy4nKV0KKyAgICAgICAgbmFtZV9tYXRjaGVyID0gcmUuY29tcGls
ZShuYW1lKQorICAgICAgICBhY3R1YWxfbWF0Y2hlciA9IHJlLmNvbXBpbGUocictYWN0dWFsXC4n
KQorICAgICAgICBleHBlY3RlZF9tYXRjaGVyID0gcmUuY29tcGlsZShyJy1leHBlY3RlZFwuJykK
KworICAgICAgICBjaGVja3N1bV9maWxlcyA9IFtdCisgICAgICAgIHRleHRfZmlsZXMgPSBbXQor
ICAgICAgICBpbWFnZV9maWxlcyA9IFtdCisgICAgICAgIGZvciByZXN1bHRfZmlsZSBpbiBzZWxm
LmZpbGVzKCk6CisgICAgICAgICAgICBuYW1lX21hdGNoID0gbmFtZV9tYXRjaGVyLnNlYXJjaChy
ZXN1bHRfZmlsZS5uYW1lKCkpCisgICAgICAgICAgICBhY3R1YWxfbWF0Y2ggPSBhY3R1YWxfbWF0
Y2hlci5zZWFyY2gocmVzdWx0X2ZpbGUubmFtZSgpKQorICAgICAgICAgICAgZXhwZWN0ZWRfbWF0
Y2ggPSBleHBlY3RlZF9tYXRjaGVyLnNlYXJjaChyZXN1bHRfZmlsZS5uYW1lKCkpCisgICAgICAg
ICAgICBpZiBuYW1lX21hdGNoIGFuZCAoYWN0dWFsX21hdGNoIG9yIChzZWxmLl9pbmNsdWRlX2V4
cGVjdGVkIGFuZCBleHBlY3RlZF9tYXRjaCkpOgorICAgICAgICAgICAgICAgIGlmIHJlc3VsdF9m
aWxlLm5hbWUoKS5lbmRzd2l0aCgnLmNoZWNrc3VtJyk6CisgICAgICAgICAgICAgICAgICAgIGNo
ZWNrc3VtX2ZpbGVzLmFwcGVuZChyZXN1bHRfZmlsZSkKKyAgICAgICAgICAgICAgICBlbGlmIHJl
c3VsdF9maWxlLm5hbWUoKS5lbmRzd2l0aCgnLnR4dCcpOgorICAgICAgICAgICAgICAgICAgICB0
ZXh0X2ZpbGVzLmFwcGVuZChyZXN1bHRfZmlsZSkKKyAgICAgICAgICAgICAgICBlbGlmIHJlc3Vs
dF9maWxlLm5hbWUoKS5lbmRzd2l0aCgnLnBuZycpOgorICAgICAgICAgICAgICAgICAgICBpbWFn
ZV9maWxlcy5hcHBlbmQocmVzdWx0X2ZpbGUpCisKKyAgICAgICAgcmVzdWx0cyA9IFtdCisgICAg
ICAgIGZvciBpbWFnZV9maWxlIGluIGltYWdlX2ZpbGVzOgorICAgICAgICAgICAgY2hlY2tzdW1f
ZmlsZV9uYW1lID0gcmUuc3ViKHJlLmNvbXBpbGUoJ1wucG5nJyksICcuY2hlY2tzdW0nLCBpbWFn
ZV9maWxlLm5hbWUoKSkKKyAgICAgICAgICAgIGZvdW5kX2NoZWNrc3VtID0gRmFsc2UKKyAgICAg
ICAgICAgIGZvciBjaGVja3N1bV9maWxlIGluIGNoZWNrc3VtX2ZpbGVzOgorICAgICAgICAgICAg
ICAgIGlmIGNoZWNrc3VtX2ZpbGUubmFtZSgpID09IGNoZWNrc3VtX2ZpbGVfbmFtZToKKyAgICAg
ICAgICAgICAgICAgICAgZm91bmRfY2hlY2tzdW0gPSBUcnVlCisgICAgICAgICAgICAgICAgICAg
IHJlc3VsdHMuYXBwZW5kKHJlc3VsdC5JbWFnZVJlc3VsdChzZWxmLl9wbGF0Zm9ybSwgaW1hZ2Vf
ZmlsZSwgY2hlY2tzdW1fZmlsZSkpCisgICAgICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAg
ICAgICBpZiBub3QgZm91bmRfY2hlY2tzdW06CisgICAgICAgICAgICAgICAgIyBwcmludCAiQ291
bGRuJ3QgZmluZCBjaGVja3N1bSBmb3IgaW1hZ2UgJyVzJyIgJSBpbWFnZV9maWxlLm5hbWUoKQor
ICAgICAgICAgICAgICAgIHJlc3VsdHMuYXBwZW5kKHJlc3VsdC5JbWFnZVJlc3VsdChzZWxmLl9w
bGF0Zm9ybSwgaW1hZ2VfZmlsZSwgTm9uZSkpCisKKyAgICAgICAgZm9yIHRleHRfZmlsZSBpbiB0
ZXh0X2ZpbGVzOgorICAgICAgICAgICAgcmVzdWx0cy5hcHBlbmQocmVzdWx0LlRleHRSZXN1bHQo
c2VsZi5fcGxhdGZvcm0sIHRleHRfZmlsZSkpCisKKyAgICAgICAgaWYgZXhhY3RfbWF0Y2g6Cisg
ICAgICAgICAgICByZXN1bHRzID0gZmlsdGVyKGxhbWJkYSByOiByLm5hbWUoKSA9PSBuYW1lLCBy
ZXN1bHRzKQorCisgICAgICAgIHJlc3VsdHMgPSBmaWx0ZXIobGFtYmRhIHI6IHRhcmdldF90eXBl
IGlzIE5vbmUgb3IgdGFyZ2V0X3R5cGUgPT0gci50eXBlKCksIHJlc3VsdHMpCisgICAgICAgIHJl
dHVybiByZXN1bHRzCisKKworY2xhc3MgQWdncmVnYXRlUmVzdWx0U2V0KG9iamVjdCk6CisgICAg
IiIiQ29sbGVjdHMgcmVzdWx0cyBmcm9tIGEgbGlzdCBvZiBidWlsZGVycyIiIgorICAgIGRlZiBf
X2luaXRfXyhzZWxmLCBidWlsZGVycyk6CisgICAgICAgIHNlbGYuX2J1aWxkZXJzID0gYnVpbGRl
cnMKKworICAgIGRlZiByZXN1bHRzX2ZvcihzZWxmLCBuYW1lLCAqKmt3YXJncyk6CisgICAgICAg
IHJlc3VsdHMgPSBbXQorICAgICAgICBmb3IgYnVpbGRlciBpbiBzZWxmLl9idWlsZGVyczoKKyAg
ICAgICAgICAgIHJlc3VsdHMgKz0gYnVpbGRlci5yZXN1bHRzX2ZvcihuYW1lLCAqKmt3YXJncykK
KyAgICAgICAgcmV0dXJuIHJlc3VsdHMKKworICAgIGRlZiBzdWJfYnVpbGRlcnMoc2VsZik6Cisg
ICAgICAgIHJldHVybiBzZWxmLl9idWlsZGVycwpkaWZmIC0tZ2l0IGEvV2ViS2l0VG9vbHMvU2Ny
aXB0cy93ZWJraXRweS9jb21tb24vbmV0L3Jlc3VsdHNldF91bml0dGVzdC5weSBiL1dlYktpdFRv
b2xzL1NjcmlwdHMvd2Via2l0cHkvY29tbW9uL25ldC9yZXN1bHRzZXRfdW5pdHRlc3QucHkKbmV3
IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMC4uNDI1ZDY4NDg0MTgyMWEwMTkwMmI1NzFkNmU0YTRlNGFjNzRiM2Y3MwotLS0gL2Rl
di9udWxsCisrKyBiL1dlYktpdFRvb2xzL1NjcmlwdHMvd2Via2l0cHkvY29tbW9uL25ldC9yZXN1
bHRzZXRfdW5pdHRlc3QucHkKQEAgLTAsMCArMSwxNTIgQEAKKyMhL3Vzci9iaW4vZW52IHB5dGhv
bgorIyBDb3B5cmlnaHQgKEMpIDIwMTAgR29vZ2xlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4K
KyMKKyMgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywg
d2l0aCBvciB3aXRob3V0CisjIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0
aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworIyBhcmUgbWV0OgorIworIyAxLiAgUmVkaXN0
cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQK
KyMgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcg
ZGlzY2xhaW1lci4KKyMgMi4gIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJl
cHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisjICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBj
b25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisjICAgICBkb2N1
bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJp
YnV0aW9uLgorIworIyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIEFORCBJVFMg
Q09OVFJJQlVUT1JTICJBUyBJUyIgQU5EIEFOWQorIyBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFO
VElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVECisjIFdBUlJB
TlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVS
UE9TRSBBUkUKKyMgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgT1IgSVRTIENP
TlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWQorIyBESVJFQ1QsIElORElSRUNULCBJTkNJREVO
VEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUworIyAoSU5D
TFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09P
RFMgT1IgU0VSVklDRVM7CisjIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJ
TkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAorIyBPTiBBTlkgVEhFT1JZIE9G
IExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9S
VAorIyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBX
QVkgT1VUIE9GIFRIRSBVU0UgT0YKKyMgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9G
IFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworZnJvbSB3ZWJraXRweS5jb21tb24u
bmV0LnJlbW90ZXppcCBpbXBvcnQgWmlwRmlsZUhhbmRsZQoraW1wb3J0IHJlc3VsdHNldAoraW1w
b3J0IHVuaXR0ZXN0CisKKworY2xhc3MgRmFrZVppcChvYmplY3QpOgorICAgIGRlZiBfX2luaXRf
XyhzZWxmKToKKyAgICAgICAgc2VsZi5fZmlsZXMgPSB7fQorCisgICAgZGVmIF9fc3RyX18oc2Vs
Zik6CisgICAgICAgIHJldHVybiAiRmFrZVppcCIKKworICAgIGRlZiBpbnNlcnQoc2VsZiwgZmls
ZW5hbWUsIGNvbnRlbnQpOgorICAgICAgICBzZWxmLl9maWxlc1tmaWxlbmFtZV0gPSBjb250ZW50
CisKKyAgICBkZWYgbmFtZWxpc3Qoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLl9maWxlcy5r
ZXlzKCkKKworICAgIGRlZiBoYW5kbGVfdG8oc2VsZiwgZmlsZW5hbWUpOgorICAgICAgICByZXR1
cm4gWmlwRmlsZUhhbmRsZShzZWxmLCBmaWxlbmFtZSkKKworICAgIGRlZiByZWFkKHNlbGYsIGZp
bGVuYW1lKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX2ZpbGVzW2ZpbGVuYW1lXQorCisgICAgZGVm
IGV4dHJhY3Qoc2VsZiwgZmlsZW5hbWUsIHBhdGgpOgorICAgICAgICBwcmludCAiRmFrZVppcD4g
Y3AgJXMgJXMiICUgKGZpbGVuYW1lLCBwYXRoKQorCisgICAgZGVmIGRlbGV0ZShzZWxmLCBmaWxl
bmFtZSk6CisgICAgICAgIHByaW50ICJGYWtlWmlwPiBybSAlcyIgJSBmaWxlbmFtZQorICAgICAg
ICBzZWxmLl9maWxlc1tmaWxlbmFtZV0gPSBOb25lCisKKworY2xhc3MgUmVzdWx0U2V0VGVzdCh1
bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgZGVmIF9yZXN1bHRzZXRfd2l0aF96aXAoc2VsZiwgemlw
LCAqKmt3YXJncyk6CisgICAgICAgIHJldHVybiByZXN1bHRzZXQuUmVzdWx0U2V0KCc8ZmFrZS1y
ZXN1bHRzZXQ+JywgJzxmYWtlLXBsYXRmb3JtPicsIHppcCwgKiprd2FyZ3MpCisKKyAgICBkZWYg
dGVzdFRleHRGaWxlc0dldEludGVycHJldGVkQXNUZXh0UmVzdWx0cyhzZWxmKToKKyAgICAgICAg
emlwID0gRmFrZVppcCgpCisgICAgICAgIHppcC5pbnNlcnQoJ2Zhc3QvZG9tL3NvbWUtdGVzdC1h
Y3R1YWwudHh0JywgJ2FjdHVhbCByZXN1bHRzJykKKyAgICAgICAgYiA9IHNlbGYuX3Jlc3VsdHNl
dF93aXRoX3ppcCh6aXApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKDEsIGxlbihiLnJlc3Vs
dHNfZm9yKCdmYXN0L2RvbS9zb21lLXRlc3QnKSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxz
KCdmYXN0L2RvbS9zb21lLXRlc3QnLCBiLnJlc3VsdHNfZm9yKCdmYXN0L2RvbS9zb21lLXRlc3Qu
aHRtbCcpWzBdLm5hbWUoKSkKKworICAgIGRlZiB0ZXN0SW1hZ2VBbmRDaGVja3N1bUZpbGVzR2V0
SW50ZXJwcmV0ZWRBc0FTaW5nbGVJbWFnZVJlc3VsdChzZWxmKToKKyAgICAgICAgemlwID0gRmFr
ZVppcCgpCisgICAgICAgIHppcC5pbnNlcnQoJ2Zhc3QvZG9tL3NvbWUtdGVzdC1hY3R1YWwuY2hl
Y2tzdW0nLCAnYWJjMTIzJykKKyAgICAgICAgemlwLmluc2VydCgnZmFzdC9kb20vc29tZS10ZXN0
LWFjdHVhbC5wbmcnLCAnPGltYWdlIGRhdGE+JykKKyAgICAgICAgYiA9IHNlbGYuX3Jlc3VsdHNl
dF93aXRoX3ppcCh6aXApCisgICAgICAgIHJlc3VsdHMgPSBiLnJlc3VsdHNfZm9yKCdmYXN0L2Rv
bS9zb21lLXRlc3QnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscygxLCBsZW4ocmVzdWx0cykp
CisgICAgICAgIHJlc3VsdCA9IHJlc3VsdHNbMF0KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMo
J2ltYWdlJywgcmVzdWx0LnR5cGUoKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoJ2FiYzEy
MycsIHJlc3VsdC5jb250ZW50cygpKQorCisgICAgZGVmIHRlc3RNdWx0aXBsZUltYWdlUmVzdWx0
c0FyZURldGVjdGVkKHNlbGYpOgorICAgICAgICB6aXAgPSBGYWtlWmlwKCkKKyAgICAgICAgemlw
Lmluc2VydCgncGxhdGZvcm0vd2luL2Zhc3QvZG9tL3NvbWUtdGVzdC1hY3R1YWwuY2hlY2tzdW0n
LCAnY2hlY2tzdW0xJykKKyAgICAgICAgemlwLmluc2VydCgncGxhdGZvcm0vd2luL2Zhc3QvZG9t
L3NvbWUtdGVzdC1hY3R1YWwucG5nJywgJzxpbWFnZSBkYXRhIDE+JykKKyAgICAgICAgemlwLmlu
c2VydCgncGxhdGZvcm0vbWFjL2Zhc3QvZG9tL3NvbWUtdGVzdC1hY3R1YWwuY2hlY2tzdW0nLCAn
Y2hlY2tzdW0yJykKKyAgICAgICAgemlwLmluc2VydCgncGxhdGZvcm0vbWFjL2Zhc3QvZG9tL3Nv
bWUtdGVzdC1hY3R1YWwucG5nJywgJzxpbWFnZSBkYXRhIDI+JykKKyAgICAgICAgYiA9IHNlbGYu
X3Jlc3VsdHNldF93aXRoX3ppcCh6aXApCisgICAgICAgIHJlc3VsdHMgPSBiLnJlc3VsdHNfZm9y
KCdmYXN0L2RvbS9zb21lLXRlc3QnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscygyLCBsZW4o
cmVzdWx0cykpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UocmVzdWx0c1swXS5zYW1lX2NvbnRl
bnQocmVzdWx0c1sxXSkpCisKKyAgICBkZWYgdGVzdEFnZ3JlZ2F0ZVJlc3VsdFNldENvcnJlY3Rs
eVJldHJpZXZlc1Rlc3RzRnJvbU11bHRpcGxlUmVzdWx0U2V0cyhzZWxmKToKKyAgICAgICAgcmVz
dWx0c2V0MV96aXAgPSBGYWtlWmlwKCkKKyAgICAgICAgcmVzdWx0c2V0MV96aXAuaW5zZXJ0KCdm
YXN0L2RvbS90ZXN0LWFjdHVhbC50eHQnLCAnbGludXggdGV4dCByZXN1bHQnKQorICAgICAgICBy
ZXN1bHRzZXQxID0gcmVzdWx0c2V0LlJlc3VsdFNldCgnbGludXgtcmVzdWx0c2V0JywgJ2xpbnV4
JywgcmVzdWx0c2V0MV96aXApCisgICAgICAgIHJlc3VsdHNldDJfemlwID0gRmFrZVppcCgpCisg
ICAgICAgIHJlc3VsdHNldDJfemlwLmluc2VydCgnZmFzdC9kb20vdGVzdC1hY3R1YWwudHh0Jywg
J3dpbmRvd3MgdGV4dCByZXN1bHQnKQorICAgICAgICByZXN1bHRzZXQyID0gcmVzdWx0c2V0LlJl
c3VsdFNldCgnd2luLXJlc3VsdHNldCcsICd3aW4nLCByZXN1bHRzZXQyX3ppcCkKKworICAgICAg
ICBiID0gcmVzdWx0c2V0LkFnZ3JlZ2F0ZVJlc3VsdFNldChbcmVzdWx0c2V0MSwgcmVzdWx0c2V0
Ml0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKDIsIGxlbihiLnJlc3VsdHNfZm9yKCdmYXN0
L2RvbS90ZXN0JykpKQorCisgICAgZGVmIHRlc3RDYW5JbmZlclBsYXRmb3JtRnJvbVBhdGhJZk5v
bmVQcm92aWRlZChzZWxmKToKKyAgICAgICAgemlwID0gRmFrZVppcCgpCisgICAgICAgIHppcC5p
bnNlcnQoJ3BsYXRmb3JtL3dpbi9zb21lLXRlc3QtZXhwZWN0ZWQucG5nJywgJzxpbWFnZSBkYXRh
PicpCisgICAgICAgIHppcC5pbnNlcnQoJ3BsYXRmb3JtL3dpbi9zb21lLXRlc3QtZXhwZWN0ZWQu
Y2hlY2tzdW0nLCAnYWJjMTIzJykKKyAgICAgICAgYiA9IHJlc3VsdHNldC5SZXN1bHRTZXQoJ2xv
Y2FsIExheW91dFRlc3RzIHJlc3VsdHNldCcsIE5vbmUsIHppcCkKKworICAgICAgICByZXN1bHRz
ID0gYi5yZXN1bHRzX2Zvcignc29tZS10ZXN0JykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMo
MSwgbGVuKHJlc3VsdHMpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscygnd2luJywgcmVzdWx0
c1swXS5wbGF0Zm9ybSgpKQorCisgICAgZGVmIHRlc3RUZXN0RXh0ZW5zaW9uSXNJZ25vcmVkKHNl
bGYpOgorICAgICAgICB6aXAgPSBGYWtlWmlwKCkKKyAgICAgICAgemlwLmluc2VydCgndGVzdC90
ZXN0LWEtYWN0dWFsLnR4dCcsICdhY3R1YWwgcmVzdWx0cycpCisgICAgICAgIGIgPSBzZWxmLl9y
ZXN1bHRzZXRfd2l0aF96aXAoemlwKQorICAgICAgICByZXN1bHRzID0gYi5yZXN1bHRzX2Zvcign
dGVzdC90ZXN0LWEuaHRtbCcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKDEsIGxlbihyZXN1
bHRzKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoJ3Rlc3QvdGVzdC1hJywgcmVzdWx0c1sw
XS5uYW1lKCkpCisKKyAgICBkZWYgdGVzdEV4aXN0aW5nUmVzdWx0c0FyZU1hcmtlZEFzU3VjaChz
ZWxmKToKKyAgICAgICAgemlwID0gRmFrZVppcCgpCisgICAgICAgIHppcC5pbnNlcnQoJ3Rlc3Qv
dGVzdC1hLWV4cGVjdGVkLnR4dCcsICdleHBlY3RlZCByZXN1bHRzJykKKyAgICAgICAgYiA9IHNl
bGYuX3Jlc3VsdHNldF93aXRoX3ppcCh6aXApCisgICAgICAgIHJlc3VsdHMgPSBiLnJlc3VsdHNf
Zm9yKCd0ZXN0L3Rlc3QtYS5odG1sJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoMSwgbGVu
KHJlc3VsdHMpKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKHJlc3VsdHNbMF0uaXNfYWN0dWFs
KCkpCisKKyAgICBkZWYgdGVzdE9ubHlSZXR1cm5zUmVzdWx0c09mU3BlY2lmaWVkVHlwZShzZWxm
KToKKyAgICAgICAgemlwID0gRmFrZVppcCgpCisgICAgICAgIHppcC5pbnNlcnQoJ3Rlc3QvdGVz
dC1hLWV4cGVjdGVkLnR4dCcsICdleHBlY3RlZCByZXN1bHRzJykKKyAgICAgICAgemlwLmluc2Vy
dCgndGVzdC90ZXN0LWEtZXhwZWN0ZWQuY2hlY2tzdW0nLCAnZXhwZWN0ZWQgcmVzdWx0cycpCisg
ICAgICAgIHppcC5pbnNlcnQoJ3Rlc3QvdGVzdC1hLWV4cGVjdGVkLnBuZycsICdleHBlY3RlZCBy
ZXN1bHRzJykKKyAgICAgICAgYiA9IHNlbGYuX3Jlc3VsdHNldF93aXRoX3ppcCh6aXApCisKKyAg
ICAgICAgcmVzdWx0cyA9IGIucmVzdWx0c19mb3IoJ3Rlc3QvdGVzdC1hLmh0bWwnKQorICAgICAg
ICB0ZXh0X3Jlc3VsdHMgPSBiLnJlc3VsdHNfZm9yKCd0ZXN0L3Rlc3QtYS5odG1sJywgdGFyZ2V0
X3R5cGU9J3RleHQnKQorICAgICAgICBpbWFnZV9yZXN1bHRzID0gYi5yZXN1bHRzX2ZvcigndGVz
dC90ZXN0LWEuaHRtbCcsIHRhcmdldF90eXBlPSdpbWFnZScpCisKKyAgICAgICAgc2VsZi5hc3Nl
cnRFcXVhbHMoMiwgbGVuKHJlc3VsdHMpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscygxLCBs
ZW4odGV4dF9yZXN1bHRzKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoMSwgbGVuKGltYWdl
X3Jlc3VsdHMpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscygndGV4dCcsIHRleHRfcmVzdWx0
c1swXS50eXBlKCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKCdpbWFnZScsIGltYWdlX3Jl
c3VsdHNbMF0udHlwZSgpKQorCisgICAgZGVmIHRlc3RFeGNsdWRlRXhwZWN0ZWRSZXN1bHRzV29y
a3Moc2VsZik6CisgICAgICAgIHppcCA9IEZha2VaaXAoKQorICAgICAgICB6aXAuaW5zZXJ0KCd0
ZXN0LWV4cGVjdGVkLnR4dCcsICAnZXhwZWN0ZWQgcmVzdWx0cyBzdG9yZWQgb24gc2VydmVyIGZv
ciBzb21lIHJlYXNvbicpCisgICAgICAgIGIgPSBzZWxmLl9yZXN1bHRzZXRfd2l0aF96aXAoemlw
LCBpbmNsdWRlX2V4cGVjdGVkPUZhbHNlKQorICAgICAgICByZXN1bHRzID0gYi5yZXN1bHRzX2Zv
cigndGVzdCcsIHRhcmdldF90eXBlPU5vbmUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKDAs
IGxlbihyZXN1bHRzKSkKKworaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKKyAgICB1bml0dGVz
dC5tYWluKCkKZGlmZiAtLWdpdCBhL1dlYktpdFRvb2xzL1NjcmlwdHMvd2Via2l0cHkvY29tbW9u
L3N5c3RlbS9maWxlc3lzdGVtLnB5IGIvV2ViS2l0VG9vbHMvU2NyaXB0cy93ZWJraXRweS9jb21t
b24vc3lzdGVtL2ZpbGVzeXN0ZW0ucHkKaW5kZXggYzdlZmRlM2E0MjRjYTQyNjhlMTYwYWUzZDVh
MzI2MThjNjRmYzIzYi4uNzg0MGU5ODhlOTYxODhiNjQ2ZDRhZWNjZmRkYWQzZDQ4NTJmZjA3MSAx
MDA2NDQKLS0tIGEvV2ViS2l0VG9vbHMvU2NyaXB0cy93ZWJraXRweS9jb21tb24vc3lzdGVtL2Zp
bGVzeXN0ZW0ucHkKKysrIGIvV2ViS2l0VG9vbHMvU2NyaXB0cy93ZWJraXRweS9jb21tb24vc3lz
dGVtL2ZpbGVzeXN0ZW0ucHkKQEAgLTMzLDYgKzMzLDcgQEAgZnJvbSBfX2Z1dHVyZV9fIGltcG9y
dCB3aXRoX3N0YXRlbWVudAogaW1wb3J0IGNvZGVjcwogaW1wb3J0IGVycm5vCiBpbXBvcnQgb3MK
K2ltcG9ydCBzaHV0aWwKIGltcG9ydCB0ZW1wZmlsZQogCiAKQEAgLTExNSwzICsxMTYsMTEgQEAg
Y2xhc3MgRmlsZVN5c3RlbShvYmplY3QpOgogICAgICAgICBUaGUgZmlsZSBpcyB3cml0dGVuIGVu
Y29kZWQgYXMgVVRGLTggd2l0aCBubyBCT00uIiIiCiAgICAgICAgIHdpdGggY29kZWNzLm9wZW4o
cGF0aCwgJ3cnLCAndXRmOCcpIGFzIGY6CiAgICAgICAgICAgICBmLndyaXRlKGNvbnRlbnRzKQor
CisgICAgZGVmIHJlbW92ZShzZWxmLCBmaWxlbmFtZSk6CisgICAgICAgICIiIlJlbW92ZSB0aGUg
c3BlY2lmaWVkIGZpbGUuIiIiCisgICAgICAgIG9zLnJlbW92ZShmaWxlbmFtZSkKKworICAgIGRl
ZiBjb3B5ZmlsZShzZWxmLCBzcmMsIGRlc3QpOgorICAgICAgICAiIiJDb3B5IHRoZSBmaWxlIGF0
IHNyYyB0byBkZXN0LiIiIgorICAgICAgICBzaHV0aWwuY29weWZpbGUoc3JjLCBkZXN0KQpkaWZm
IC0tZ2l0IGEvV2ViS2l0VG9vbHMvU2NyaXB0cy93ZWJraXRweS9sYXlvdXRfdGVzdHMvcG9ydC9i
YXNlLnB5IGIvV2ViS2l0VG9vbHMvU2NyaXB0cy93ZWJraXRweS9sYXlvdXRfdGVzdHMvcG9ydC9i
YXNlLnB5CmluZGV4IDc1NzMxOGQxMzgwNWJjN2RhOWE3N2YzODMwMmM1NTAxOGUwYTJiYjYuLmNi
MjhjZTlhM2Y4ZjUzZWE5YTJlNzk3NmViMjk5YTRlMjQ2MTc5NDEgMTAwNjQ0Ci0tLSBhL1dlYktp
dFRvb2xzL1NjcmlwdHMvd2Via2l0cHkvbGF5b3V0X3Rlc3RzL3BvcnQvYmFzZS5weQorKysgYi9X
ZWJLaXRUb29scy9TY3JpcHRzL3dlYmtpdHB5L2xheW91dF90ZXN0cy9wb3J0L2Jhc2UucHkKQEAg
LTYzMSw2ICs2MzEsMTAgQEAgY2xhc3MgUG9ydChvYmplY3QpOgogICAgICAgICBleHBlY3RhdGlv
bnMsIGRldGVybWluaW5nIHNlYXJjaCBwYXRocywgYW5kIGxvZ2dpbmcgaW5mb3JtYXRpb24uIiIi
CiAgICAgICAgIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoJ1BvcnQudmVyc2lvbicpCiAKKyAg
ICBkZWYgYnVpbGRib3RfcmVzdWx0c2V0KHNlbGYsIHBsYXRmb3Jtcyk6CisgICAgICAgICIiIlJl
dHVybnMgYSBSZXN1bHRTZXQgZm9yIHRoZSBzcGVjaWZpZWQgcGxhdGZvcm1zIGZvciB0aGlzIHBv
cnRzIGJ1aWxkYm90cy4iIiIKKyAgICAgICAgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcignUG9y
dC5idWlsZGJvdF9yZXN1bHRzZXQnKQorCiAgICAgZGVmIHRlc3RfcmVwb3NpdG9yeV9wYXRocyhz
ZWxmKToKICAgICAgICAgIiIiUmV0dXJucyBhIGxpc3Qgb2YgKHJlcG9zaXRvcnlfbmFtZSwgcmVw
b3NpdG9yeV9wYXRoKSB0dXBsZXMKICAgICAgICAgb2YgaXRzIGRlcGVuZGluZyBjb2RlIGJhc2Uu
ICBCeSBkZWZhdWx0IGl0IHJldHVybnMgYSBsaXN0IHRoYXQgb25seQpkaWZmIC0tZ2l0IGEvV2Vi
S2l0VG9vbHMvU2NyaXB0cy93ZWJraXRweS9sYXlvdXRfdGVzdHMvcG9ydC9jaHJvbWl1bS5weSBi
L1dlYktpdFRvb2xzL1NjcmlwdHMvd2Via2l0cHkvbGF5b3V0X3Rlc3RzL3BvcnQvY2hyb21pdW0u
cHkKaW5kZXggOGZlNjg1YWYwNjY5ZWIzNGFmZThmOTRjNTZmZTNmZjNjZDk1MzZjNy4uNmQ5YTZh
NWYwNDk0MWYwNjI3N2ZjMWY2YmNmOWI2MDQ0M2YxNDNjNCAxMDA2NDQKLS0tIGEvV2ViS2l0VG9v
bHMvU2NyaXB0cy93ZWJraXRweS9sYXlvdXRfdGVzdHMvcG9ydC9jaHJvbWl1bS5weQorKysgYi9X
ZWJLaXRUb29scy9TY3JpcHRzL3dlYmtpdHB5L2xheW91dF90ZXN0cy9wb3J0L2Nocm9taXVtLnB5
CkBAIC00NCw2ICs0NCw4IEBAIGltcG9ydCB0ZW1wZmlsZQogaW1wb3J0IHRpbWUKIGltcG9ydCB3
ZWJicm93c2VyCiAKK2Zyb20gd2Via2l0cHkuY29tbW9uLm5ldC5yZW1vdGV6aXAgaW1wb3J0IFJl
bW90ZVppcAorZnJvbSB3ZWJraXRweS5jb21tb24ubmV0LnJlc3VsdHNldCBpbXBvcnQgQWdncmVn
YXRlUmVzdWx0U2V0LCBSZXN1bHRTZXQKIGZyb20gd2Via2l0cHkuY29tbW9uLnN5c3RlbS5wYXRo
IGltcG9ydCBjeWdwYXRoCiBmcm9tIHdlYmtpdHB5LmxheW91dF90ZXN0cy5sYXlvdXRfcGFja2Fn
ZSBpbXBvcnQgdGVzdF9leHBlY3RhdGlvbnMKIGZyb20gd2Via2l0cHkubGF5b3V0X3Rlc3RzLmxh
eW91dF9wYWNrYWdlIGltcG9ydCB0ZXN0X291dHB1dApAQCAtMTk3LDYgKzE5OSwyNSBAQCBjbGFz
cyBDaHJvbWl1bVBvcnQoYmFzZS5Qb3J0KToKICAgICAgICAgcmV0dXJuIHNlbGYucGF0aF9mcm9t
X3dlYmtpdF9iYXNlKCdMYXlvdXRUZXN0cycsICdwbGF0Zm9ybScsCiAgICAgICAgICAgICAnY2hy
b21pdW0nLCAndGVzdF9leHBlY3RhdGlvbnMudHh0JykKIAorICAgIGRlZiBidWlsZGJvdF9yZXN1
bHRzZXQoc2VsZiwgcGxhdGZvcm1zKToKKyAgICAgICAgcGxhdGZvcm1fYnVpbGRlcnMgPSB7Cisg
ICAgICAgICAgICAnY2hyb21pdW0tbWFjJzogJ1dlYmtpdF9NYWMxMF81JywKKyAgICAgICAgICAg
ICdjaHJvbWl1bS13aW4tdmlzdGEnOiAnV2Via2l0X1dpbicsCisgICAgICAgICAgICAnY2hyb21p
dW0tbGludXgnOiAnV2Via2l0X0xpbnV4X1Rlc3RzX19kYmdfXzFfJywKKyAgICAgICAgfQorCisg
ICAgICAgIHJlc3VsdHNldHMgPSBbXQorICAgICAgICBmb3IgcGxhdGZvcm0gaW4gcGxhdGZvcm1z
OgorICAgICAgICAgICAgaWYgcGxhdGZvcm0gbm90IGluIHBsYXRmb3JtX2J1aWxkZXJzOgorICAg
ICAgICAgICAgICAgIHJhaXNlIEV4Y2VwdGlvbigiRG9uJ3QgaGF2ZSByZXN1bHRzIGZvciBwbGF0
Zm9ybSAlcyIgJSBwbGF0Zm9ybSkKKyAgICAgICAgICAgIGJ1aWxkZXJfbmFtZSA9IHBsYXRmb3Jt
X2J1aWxkZXJzW3BsYXRmb3JtXQorICAgICAgICAgICAgemlwX3VybCA9ICdodHRwOi8vYnVpbGQu
Y2hyb21pdW0ub3JnL2YvY2hyb21pdW0vbGF5b3V0X3Rlc3RfcmVzdWx0cy8nICsgXAorICAgICAg
ICAgICAgICAgIGJ1aWxkZXJfbmFtZSArICcvbGF5b3V0LXRlc3QtcmVzdWx0cy56aXAnCisgICAg
ICAgICAgICByZXN1bHRzZXRzLmFwcGVuZChSZXN1bHRTZXQoYnVpbGRlcl9uYW1lLCBwbGF0Zm9y
bSwgUmVtb3RlWmlwKHppcF91cmwpLAorICAgICAgICAgICAgICAgIGluY2x1ZGVfZXhwZWN0ZWQ9
RmFsc2UpKQorCisgICAgICAgIHJldHVybiBBZ2dyZWdhdGVSZXN1bHRTZXQocmVzdWx0c2V0cykK
KwogICAgIGRlZiByZXN1bHRzX2RpcmVjdG9yeShzZWxmKToKICAgICAgICAgdHJ5OgogICAgICAg
ICAgICAgcmV0dXJuIHNlbGYucGF0aF9mcm9tX2Nocm9taXVtX2Jhc2UoJ3dlYmtpdCcsCmRpZmYg
LS1naXQgYS9XZWJLaXRUb29scy9TY3JpcHRzL3dlYmtpdHB5L2xheW91dF90ZXN0cy9wb3J0L3dl
YmtpdC5weSBiL1dlYktpdFRvb2xzL1NjcmlwdHMvd2Via2l0cHkvbGF5b3V0X3Rlc3RzL3BvcnQv
d2Via2l0LnB5CmluZGV4IDA5YmU4MzNkNzUyZjAyZmRiNzk0NDY2M2I5MGU1NWVhNzMwY2UxYTEu
LmEyZDM5NGZkYTE0NTU0OWZkY2Q2NGExZjg2NGRhNDNhNWRmYTM3N2IgMTAwNjQ0Ci0tLSBhL1dl
YktpdFRvb2xzL1NjcmlwdHMvd2Via2l0cHkvbGF5b3V0X3Rlc3RzL3BvcnQvd2Via2l0LnB5Cisr
KyBiL1dlYktpdFRvb2xzL1NjcmlwdHMvd2Via2l0cHkvbGF5b3V0X3Rlc3RzL3BvcnQvd2Via2l0
LnB5CkBAIC00Niw2ICs0Niw4IEBAIGltcG9ydCBvcGVyYXRvcgogaW1wb3J0IHRlbXBmaWxlCiBp
bXBvcnQgc2h1dGlsCiAKK2ltcG9ydCB3ZWJraXRweS5jb21tb24ubmV0LmJ1aWxkYm90IGFzIGJ1
aWxkYm90Citmcm9tIHdlYmtpdHB5LmNvbW1vbi5uZXQucmVzdWx0c2V0IGltcG9ydCBBZ2dyZWdh
dGVSZXN1bHRTZXQKIGltcG9ydCB3ZWJraXRweS5jb21tb24uc3lzdGVtLm9zcGF0aCBhcyBvc3Bh
dGgKIGltcG9ydCB3ZWJraXRweS5sYXlvdXRfdGVzdHMubGF5b3V0X3BhY2thZ2UudGVzdF9vdXRw
dXQgYXMgdGVzdF9vdXRwdXQKIGltcG9ydCB3ZWJraXRweS5sYXlvdXRfdGVzdHMucG9ydC5iYXNl
IGFzIGJhc2UKQEAgLTc5LDYgKzgxLDM0IEBAIGNsYXNzIFdlYktpdFBvcnQoYmFzZS5Qb3J0KToK
ICAgICBkZWYgdmVyc2lvbihzZWxmKToKICAgICAgICAgcmV0dXJuICcnCiAKKyAgICBkZWYgYnVp
bGRib3RfcmVzdWx0c2V0KHNlbGYsIHBsYXRmb3Jtcyk6CisgICAgICAgIHBsYXRmb3JtX2J1aWxk
ZXJzID0geworICAgICAgICAgICAgJ21hYy1zbm93bGVvcGFyZCc6ICdTbm93TGVvcGFyZCBJbnRl
bCBSZWxlYXNlIChUZXN0cyknLAorICAgICAgICAgICAgJ21hYy1sZW9wYXJkJzogJ0xlb3BhcmQg
SW50ZWwgRGVidWcgKFRlc3RzKScsCisgICAgICAgICAgICAnd2luJzogJ1dpbmRvd3MgNyBSZWxl
YXNlIChXZWJLaXQyIFRlc3RzKScsCisgICAgICAgICAgICAnY2hyb21pdW0tbGludXgnOiAnR1RL
IExpbnV4IDMyLWJpdCBSZWxlYXNlJywKKyAgICAgICAgfQorCisgICAgICAgIGZvciBwbGF0Zm9y
bSBpbiBwbGF0Zm9ybXM6CisgICAgICAgICAgICBpZiBwbGF0Zm9ybSBub3QgaW4gcGxhdGZvcm1f
YnVpbGRlcnM6CisgICAgICAgICAgICAgICAgcmFpc2UgRXhjZXB0aW9uKCJDYW4ndCBmaW5kIGJ1
aWxkZXIgZm9yICVzIiAlIHBsYXRmb3JtKQorCisgICAgICAgIGJiID0gYnVpbGRib3QuQnVpbGRC
b3QoKQorICAgICAgICByZXN1bHRzZXRzID0gW10KKyAgICAgICAgYnVpbGRlcnNfYnlfbmFtZSA9
IHt9CisKKyAgICAgICAgZm9yIGJ1aWxkZXIgaW4gYmIuYnVpbGRlcnMoKToKKyAgICAgICAgICAg
IGJ1aWxkZXJzX2J5X25hbWVbYnVpbGRlci5uYW1lKCldID0gYnVpbGRlcgorCisgICAgICAgIGZv
ciBwbGF0Zm9ybSBpbiBwbGF0Zm9ybXM6CisgICAgICAgICAgICBidWlsZGVyID0gYnVpbGRlcnNf
YnlfbmFtZVtwbGF0Zm9ybV9idWlsZGVyc1twbGF0Zm9ybV1dCisgICAgICAgICAgICBwcmludCAi
Z290IGJ1aWxkZXIgJXMiICUgYnVpbGRlci5uYW1lKCkKKyAgICAgICAgICAgIHJzID0gYnVpbGRl
ci5sYXRlc3RfYnVpbGQoKS5yZXN1bHRzKCkKKyAgICAgICAgICAgIHJzLnNldF9wbGF0Zm9ybShw
bGF0Zm9ybSkKKyAgICAgICAgICAgIHJlc3VsdHNldHMuYXBwZW5kKHJzKQorCisgICAgICAgIHJl
dHVybiBBZ2dyZWdhdGVSZXN1bHRTZXQocmVzdWx0c2V0cykKKwogICAgIGRlZiBfYnVpbGRfZHJp
dmVyKHNlbGYpOgogICAgICAgICBjb25maWd1cmF0aW9uID0gc2VsZi5nZXRfb3B0aW9uKCdjb25m
aWd1cmF0aW9uJykKICAgICAgICAgcmV0dXJuIHNlbGYuX2NvbmZpZy5idWlsZF9kdW1wcmVuZGVy
dHJlZShjb25maWd1cmF0aW9uKQpkaWZmIC0tZ2l0IGEvV2ViS2l0VG9vbHMvU2NyaXB0cy93ZWJr
aXRweS90b29sL2NvbW1hbmRzL19faW5pdF9fLnB5IGIvV2ViS2l0VG9vbHMvU2NyaXB0cy93ZWJr
aXRweS90b29sL2NvbW1hbmRzL19faW5pdF9fLnB5CmluZGV4IGQyYWE1MDNkMTg1NjFkZWFiMmNh
ZTcwMGRmNmQ0OTNhOWIwNWZjZjMuLmMwNTk2ZTc4OTIyZWVkM2UwMTU3MmYzOGE0MjJlYWNiMzVj
OGI1OTEgMTAwNjQ0Ci0tLSBhL1dlYktpdFRvb2xzL1NjcmlwdHMvd2Via2l0cHkvdG9vbC9jb21t
YW5kcy9fX2luaXRfXy5weQorKysgYi9XZWJLaXRUb29scy9TY3JpcHRzL3dlYmtpdHB5L3Rvb2wv
Y29tbWFuZHMvX19pbml0X18ucHkKQEAgLTcsNiArNyw3IEBAIGZyb20gd2Via2l0cHkudG9vbC5j
b21tYW5kcy5wcmV0dHlkaWZmIGltcG9ydCBQcmV0dHlEaWZmCiBmcm9tIHdlYmtpdHB5LnRvb2wu
Y29tbWFuZHMucXVlcmllcyBpbXBvcnQgKgogZnJvbSB3ZWJraXRweS50b29sLmNvbW1hbmRzLnF1
ZXVlcyBpbXBvcnQgKgogZnJvbSB3ZWJraXRweS50b29sLmNvbW1hbmRzLnJlYmFzZWxpbmUgaW1w
b3J0IFJlYmFzZWxpbmUKK2Zyb20gd2Via2l0cHkudG9vbC5jb21tYW5kcy5yZWJhc2VsaW5lMi5y
ZWJhc2VsaW5lMiBpbXBvcnQgUmViYXNlbGluZTIKIGZyb20gd2Via2l0cHkudG9vbC5jb21tYW5k
cy5yZWJhc2VsaW5lc2VydmVyIGltcG9ydCBSZWJhc2VsaW5lU2VydmVyCiBmcm9tIHdlYmtpdHB5
LnRvb2wuY29tbWFuZHMuc2hlcmlmZmJvdCBpbXBvcnQgKgogZnJvbSB3ZWJraXRweS50b29sLmNv
bW1hbmRzLnVwbG9hZCBpbXBvcnQgKgpkaWZmIC0tZ2l0IGEvV2ViS2l0VG9vbHMvU2NyaXB0cy93
ZWJraXRweS90b29sL2NvbW1hbmRzL3JlYmFzZWxpbmUyL19faW5pdF9fLnB5IGIvV2ViS2l0VG9v
bHMvU2NyaXB0cy93ZWJraXRweS90b29sL2NvbW1hbmRzL3JlYmFzZWxpbmUyL19faW5pdF9fLnB5
Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAuLmVmNjViZWU1YmI3N2U5NmViYzdjZDljNDc2NDA2OTBmYmRhOGFjMTkKLS0t
IC9kZXYvbnVsbAorKysgYi9XZWJLaXRUb29scy9TY3JpcHRzL3dlYmtpdHB5L3Rvb2wvY29tbWFu
ZHMvcmViYXNlbGluZTIvX19pbml0X18ucHkKQEAgLTAsMCArMSBAQAorIyBSZXF1aXJlZCBmb3Ig
UHl0aG9uIHRvIHNlYXJjaCB0aGlzIGRpcmVjdG9yeSBmb3IgbW9kdWxlIGZpbGVzCmRpZmYgLS1n
aXQgYS9XZWJLaXRUb29scy9TY3JpcHRzL3dlYmtpdHB5L3Rvb2wvY29tbWFuZHMvcmViYXNlbGlu
ZTIvYnVja2V0LnB5IGIvV2ViS2l0VG9vbHMvU2NyaXB0cy93ZWJraXRweS90b29sL2NvbW1hbmRz
L3JlYmFzZWxpbmUyL2J1Y2tldC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwLi4yMDEwZTI0ZTYwNGNhMDZkOWQ5MzRm
MjFmNjI1MTQzMjllNmZlZGEyCi0tLSAvZGV2L251bGwKKysrIGIvV2ViS2l0VG9vbHMvU2NyaXB0
cy93ZWJraXRweS90b29sL2NvbW1hbmRzL3JlYmFzZWxpbmUyL2J1Y2tldC5weQpAQCAtMCwwICsx
LDIyOCBAQAorIyEvdXNyL2Jpbi9lbnYgcHl0aG9uCisjIENvcHlyaWdodCAoQykgMjAxMCBHb29n
bGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorIworIyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNl
IGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyMgbW9kaWZpY2F0
aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25z
CisjIGFyZSBtZXQ6CisjCisjIDEuICBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVz
dCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorIyAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2Yg
Y29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorIyAyLiAgUmVkaXN0cmli
dXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQK
KyMgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcg
ZGlzY2xhaW1lciBpbiB0aGUKKyMgICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVy
aWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisjCisjIFRISVMgU09GVFdBUkUg
SVMgUFJPVklERUQgQlkgQVBQTEUgQU5EIElUUyBDT05UUklCVVRPUlMgIkFTIElTIiBBTkQgQU5Z
CisjIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElN
SVRFRCBUTywgVEhFIElNUExJRUQKKyMgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5E
IEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQorIyBESVNDTEFJTUVELiBJTiBO
TyBFVkVOVCBTSEFMTCBBUFBMRSBPUiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5Z
CisjIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1Ig
Q09OU0VRVUVOVElBTCBEQU1BR0VTCisjIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywg
UFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyMgTE9TUyBPRiBV
U0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBD
QVVTRUQgQU5ECisjIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRS
QUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisjIChJTkNMVURJTkcgTkVHTElHRU5DRSBP
UiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorIyBUSElT
IFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFN
QUdFLgorCisKK2NsYXNzIEluZGVudGVkTG9nZ2VyKG9iamVjdCk6CisgICAgIiIiTG9nZ2VyIHRo
YXQgcHJpbnRzIGluZGVudGVkIG1lc3NhZ2VzIiIiCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGxv
Z2dlcj1Ob25lKToKKyAgICAgICAgc2VsZi5fbG9nZ2VyID0gbG9nZ2VyCisgICAgICAgIHNlbGYu
X2luZGVudCA9IDAKKworICAgIGRlZiBpbmRlbnQoc2VsZik6CisgICAgICAgIHNlbGYuX2luZGVu
dCArPSAxCisKKyAgICBkZWYgb3V0ZGVudChzZWxmKToKKyAgICAgICAgc2VsZi5faW5kZW50IC09
IDEKKworICAgIGRlZiBsb2coc2VsZiwgbWVzc2FnZSk6CisgICAgICAgIG1lc3NhZ2UgPSAnICAn
ICogc2VsZi5faW5kZW50ICsgbWVzc2FnZQorICAgICAgICBpZiBzZWxmLl9sb2dnZXIgaXMgTm9u
ZToKKyAgICAgICAgICAgIHByaW50IG1lc3NhZ2UKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAg
IHNlbGYuX2xvZ2dlcihtZXNzYWdlKQorCisKK2NsYXNzIEJ1Y2tldChvYmplY3QpOgorICAgICIi
IkJ1Y2tldHMgaG9sZCBvdGhlciBidWNrZXRzIGluIGEgdHJlZSB0aGF0IHJlZmxlY3RzIHRoZSB0
ZXN0IGZhbGxiYWNrCisgICAgICAgb3JkZXIuIiIiCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIG5h
bWUpOgorICAgICAgICBzZWxmLl9uYW1lID0gbmFtZQorICAgICAgICBzZWxmLl9jaGlsZHJlbiA9
IFtdCisgICAgICAgIHNlbGYuX3Jlc3VsdCA9IE5vbmUKKyAgICAgICAgc2VsZi5faW1wbGljaXRf
cmVzdWx0ID0gTm9uZQorICAgICAgICAjIEFnZ3JlZ2F0ZSBidWNrZXRzIGRvbid0IGdldCByZXN1
bHRzIGRpcmVjdGx5IGZyb20gYnVpbGRib3QuCisgICAgICAgIHNlbGYuX2lzX2FnZ3JlZ2F0ZSA9
IEZhbHNlCisKKyAgICBkZWYgX29uX2NoYW5nZWQoc2VsZik6CisgICAgICAgIGZvciBjaGlsZCBp
biBzZWxmLl9jaGlsZHJlbjoKKyAgICAgICAgICAgIGNoaWxkLnNldF9pbXBsaWNpdChzZWxmLmlt
cGxpY2l0X3Jlc3VsdCgpKQorCisgICAgZGVmIF9hbGxfZXF1YWwoc2VsZiwgcmVzdWx0cyk6Cisg
ICAgICAgIGlmIGxlbihyZXN1bHRzKSA9PSAwOgorICAgICAgICAgICAgcmV0dXJuIFRydWUKKyAg
ICAgICAgY29udGVudHMgPSByZXN1bHRzWzBdLmNvbnRlbnRzKCkKKyAgICAgICAgcmV0dXJuIGFs
bChtYXAobGFtYmRhIHg6IHguY29udGVudHMoKSA9PSBjb250ZW50cywgcmVzdWx0cykpCisKKyAg
ICBkZWYgZHVtcChzZWxmLCBsb2dnZXI9SW5kZW50ZWRMb2dnZXIoKSk6CisgICAgICAgIGxvZ2dl
ci5sb2coIkJ1Y2tldDolcyB7IiAlIHNlbGYuX25hbWUpCisgICAgICAgIGxvZ2dlci5pbmRlbnQo
KQorICAgICAgICBsb2dnZXIubG9nKCJSZXN1bHQgPSAlcyIgJSBzZWxmLl9yZXN1bHQpCisgICAg
ICAgIGxvZ2dlci5sb2coIkltcGxpY2l0IHJlc3VsdCA9ICVzIiAlIHNlbGYuaW1wbGljaXRfcmVz
dWx0KCkpCisgICAgICAgIGZvciBjaGlsZCBpbiBzZWxmLl9jaGlsZHJlbjoKKyAgICAgICAgICAg
IGNoaWxkLmR1bXAobG9nZ2VyKQorICAgICAgICBsb2dnZXIub3V0ZGVudCgpCisgICAgICAgIGxv
Z2dlci5sb2coIn0iKQorCisgICAgZGVmIG5hbWUoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxm
Ll9uYW1lCisKKyAgICBkZWYgbWFya19hc19hZ2dyZWdhdGUoc2VsZik6CisgICAgICAgICIiIkJ1
Y2tldHMgdGhhdCBkb24ndCBtYXAgdG8gYSBzcGVjaWZpYyBwbGF0Zm9ybSBhcmUgJ2FnZ3JlZ2F0
ZScKKyAgICAgICAgYnVja2V0cy4gIEFnZ3JlZ2F0ZSBidWNrZXRzIGNhbiBvdmVyd3JpdGUgdGhl
aXIgb3duIHJlc3VsdHMgd2l0aCB0aG9zZQorICAgICAgICBvZiB0aGVpciBjaGlsZHJlbiBpZiB0
aGVpciBjaGlsZHJlbiBoYXZlIHJlc3VsdHMgdGhhdCBhbGwgbWF0Y2ggYmVjYXVzZQorICAgICAg
ICBhZ2dyZWdhdGVzIGFyZSBkZWZpbmVkIGVudGlyZWx5IGJ5IHRoZWlyIGNoaWxkcmVuIGFuZCBu
b3QgdGhlaXIgb3duCisgICAgICAgIHRhcmdldGVkIHJlc3VsdHMuIiIiCisgICAgICAgIHNlbGYu
X2lzX2FnZ3JlZ2F0ZSA9IFRydWUKKworICAgIGRlZiBhcHBlbmQoc2VsZiwgY2hpbGQpOgorICAg
ICAgICBzZWxmLl9jaGlsZHJlbi5hcHBlbmQoY2hpbGQpCisgICAgICAgIHNlbGYuX29uX2NoYW5n
ZWQoKQorCisgICAgZGVmIGltcGxpY2l0X3Jlc3VsdChzZWxmKToKKyAgICAgICAgaWYgc2VsZi5f
cmVzdWx0IGlzIG5vdCBOb25lOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYuX3Jlc3VsdAorICAg
ICAgICByZXR1cm4gc2VsZi5faW1wbGljaXRfcmVzdWx0CisKKyAgICBkZWYgc2V0X3Jlc3VsdChz
ZWxmLCByZXN1bHQpOgorICAgICAgICBpZiBzZWxmLl9yZXN1bHQgaXMgTm9uZToKKyAgICAgICAg
ICAgIHNlbGYuX3Jlc3VsdCA9IHJlc3VsdAorICAgICAgICAgICAgc2VsZi5fb25fY2hhbmdlZCgp
CisgICAgICAgIGVsaWYgcmVzdWx0LmlzX3JlYmFzZWxpbmVfb2Yoc2VsZi5fcmVzdWx0KToKKyAg
ICAgICAgICAgIHNlbGYuX3Jlc3VsdCA9IHJlc3VsdAorICAgICAgICAgICAgc2VsZi5fb25fY2hh
bmdlZCgpCisgICAgICAgIGVsaWYgc2VsZi5fcmVzdWx0LmlzX3JlYmFzZWxpbmVfb2YocmVzdWx0
KToKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgZWxpZiBzZWxmLl9yZXN1bHQgPT0gcmVzdWx0
OgorICAgICAgICAgICAgcmFpc2UgRXhjZXB0aW9uKCJTYW1lIHJlc3VsdCBiZWluZyBpbnNlcnRl
ZCBhZ2FpbiBpbnRvIGJ1Y2tldCAlczogJXMgPC0gJXMiICUgKHNlbGYsIHNlbGYuX3Jlc3VsdCwg
cmVzdWx0KSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJhaXNlIEV4Y2VwdGlvbigiQ29u
ZmxpY3RpbmcgcmVzdWx0cyAlcyBhbmQgJXMgYXNzaWduZWQgdG8gYnVja2V0ICVzIiAlCisgICAg
ICAgICAgICAgICAgICAgIChzZWxmLl9yZXN1bHQsIHJlc3VsdCwgc2VsZi5fbmFtZSkpCisKKyAg
ICBkZWYgY2xlYXJfcmVzdWx0KHNlbGYpOgorICAgICAgICBzZWxmLl9yZXN1bHQgPSBOb25lCisg
ICAgICAgIHNlbGYuX29uX2NoYW5nZWQoKQorCisgICAgZGVmIHJlc3VsdChzZWxmKToKKyAgICAg
ICAgcmV0dXJuIHNlbGYuX3Jlc3VsdAorCisgICAgZGVmIHNldF9pbXBsaWNpdChzZWxmLCBpbXBs
aWNpdF9yZXN1bHQpOgorICAgICAgICBzZWxmLl9pbXBsaWNpdF9yZXN1bHQgPSBpbXBsaWNpdF9y
ZXN1bHQKKyAgICAgICAgc2VsZi5fb25fY2hhbmdlZCgpCisKKyAgICBkZWYgX3NhbWVfaW1wbGlj
aXRfcmVzdWx0KHNlbGYsIG90aGVyKToKKyAgICAgICAgaWYgc2VsZi5pbXBsaWNpdF9yZXN1bHQo
KSBpcyBOb25lOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYuaW1wbGljaXRfcmVzdWx0KCkgPT0g
b3RoZXIuaW1wbGljaXRfcmVzdWx0KCkKKyAgICAgICAgcmV0dXJuIG90aGVyLmltcGxpY2l0X3Jl
c3VsdCgpLnNhbWVfY29udGVudChzZWxmLmltcGxpY2l0X3Jlc3VsdCgpKQorCisgICAgZGVmIF9n
ZXRfY29tbW9uX2NoaWxkX3Jlc3VsdChzZWxmLCByZXN1bHRzKToKKyAgICAgICAgaWYgbGVuKHJl
c3VsdHMpID09IDA6CisgICAgICAgICAgICByZXR1cm4gTm9uZQorCisgICAgICAgIGZpcnN0X3Jl
c3VsdCA9IHJlc3VsdHNbMF0KKyAgICAgICAgcmVzdWx0X3RvX3JldHVybiA9IGZpcnN0X3Jlc3Vs
dAorICAgICAgICBmb3IgcmVzdWx0IGluIHJlc3VsdHNbMTpdOgorICAgICAgICAgICAgaWYgbm90
IHJlc3VsdC5zYW1lX2NvbnRlbnQoZmlyc3RfcmVzdWx0KToKKyAgICAgICAgICAgICAgICByZXR1
cm4gTm9uZQorICAgICAgICAgICAgaWYgcmVzdWx0LmlzX2FjdHVhbCgpOgorICAgICAgICAgICAg
ICAgIHJlc3VsdF90b19yZXR1cm4gPSByZXN1bHQgICAjIFByZWZlciB0byByZXR1cm4gYWN0dWFs
IHJlc3VsdHMuCisgICAgICAgIHJldHVybiByZXN1bHRfdG9fcmV0dXJuCisKKyAgICBkZWYgX2lu
aGVyaXQoc2VsZiwgcmVzdWx0KToKKyAgICAgICAgZm9yIGNoaWxkIGluIHNlbGYuX2NoaWxkcmVu
OgorICAgICAgICAgICAgY2hpbGQuY2xlYXJfcmVzdWx0KCkKKyAgICAgICAgc2VsZi5fcmVzdWx0
ID0gcmVzdWx0LnJldGFyZ2V0KHNlbGYuX25hbWUpCisgICAgICAgIHNlbGYuX29uX2NoYW5nZWQo
KQorCisgICAgZGVmIF9hdHRlbXB0X3RvX2luaGVyaXQoc2VsZik6CisgICAgICAgICIiIlRyeSB0
byBpbmhlcml0IGEgcmVzdWx0IGZyb20gY2hpbGRyZW4uIFRoaXMgd2lsbCBvbmx5IGhhcHBlbiBp
ZiBhbGwKKyAgICAgICAgICAgICAgY2hpbGRyZW4gaGF2ZSB0aGUgc2FtZSByZXN1bHQiIiIKKyAg
ICAgICAgY2hpbGRfcmVzdWx0cyA9IG1hcChsYW1iZGEgYzogYy5pbXBsaWNpdF9yZXN1bHQoKSwg
c2VsZi5fY2hpbGRyZW4pCisgICAgICAgIGNoaWxkX3Jlc3VsdHMgPSBmaWx0ZXIobGFtYmRhIHI6
IHIgaXMgbm90IE5vbmUsIGNoaWxkX3Jlc3VsdHMpCisgICAgICAgIHRvX2luaGVyaXQgPSBzZWxm
Ll9nZXRfY29tbW9uX2NoaWxkX3Jlc3VsdChjaGlsZF9yZXN1bHRzKQorCisgICAgICAgIGlmIHRv
X2luaGVyaXQgaXMgTm9uZToKKyAgICAgICAgICAgIHJldHVybiBGYWxzZQorCisgICAgICAgICMg
V2UgaGF2ZSBhIHJlc3VsdCB3ZSBjb3VsZCBwb3RlbnRpYWxseSBpbmhlcml0Li4uCisgICAgICAg
IGlmIHNlbGYuaW1wbGljaXRfcmVzdWx0KCkgaXMgTm9uZToKKyAgICAgICAgICAgIHNlbGYuX2lu
aGVyaXQodG9faW5oZXJpdCkKKyAgICAgICAgZWxpZiB0b19pbmhlcml0LmlzX25ld2VyX3RoYW4o
c2VsZi5pbXBsaWNpdF9yZXN1bHQoKSkgYW5kIHNlbGYuaXNfYWdncmVnYXRlKCk6CisgICAgICAg
ICAgICBzZWxmLl9pbmhlcml0KHRvX2luaGVyaXQpCisgICAgICAgIGVsc2U6CisgICAgICAgICAg
ICByZXR1cm4gRmFsc2UKKyAgICAgICAgcmV0dXJuIFRydWUKKworICAgIGRlZiBpc19hZ2dyZWdh
dGUoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLl9pc19hZ2dyZWdhdGUKKworICAgIGRlZiBj
b2xsYXBzZShzZWxmKToKKyAgICAgICAgIiIiRGVsZXRlcyByZWR1bmRhbnQgcmVzdWx0cyBpbiB0
aGUgdHJlZSBzdGFydGluZyBhdCB0aGlzIGJ1Y2tldCIiIgorICAgICAgICBmb3IgY2hpbGQgaW4g
c2VsZi5fY2hpbGRyZW46CisgICAgICAgICAgICBjaGlsZC5jb2xsYXBzZSgpCisKKyAgICAgICAg
aWYgc2VsZi5fYXR0ZW1wdF90b19pbmhlcml0KCk6CisgICAgICAgICAgICByZXR1cm4KKworICAg
ICAgICBmb3IgY2hpbGQgaW4gc2VsZi5fY2hpbGRyZW46CisgICAgICAgICAgICBpZiBzZWxmLl9z
YW1lX2ltcGxpY2l0X3Jlc3VsdChjaGlsZCk6CisgICAgICAgICAgICAgICAgY2hpbGQuY2xlYXJf
cmVzdWx0KCkKKworICAgIGRlZiBpc19lbXB0eShzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYu
X3Jlc3VsdCBpcyBOb25lCisKKyAgICBkZWYgcmVzdWx0cyhzZWxmLCByKToKKyAgICAgICAgaWYg
bm90IHNlbGYuaXNfZW1wdHkoKToKKyAgICAgICAgICAgIHIuYXBwZW5kKHNlbGYuX3Jlc3VsdCkK
KyAgICAgICAgZm9yIGMgaW4gc2VsZi5fY2hpbGRyZW46CisgICAgICAgICAgICBjLnJlc3VsdHMo
cikKKworCitjbGFzcyBCdWNrZXRUcmVlKG9iamVjdCk6CisgICAgIiIiSGVscGVyIGNsYXNzIGZv
ciBjb25zdHJ1Y3RpbmcgYW5kIGluZGV4aW5nIGEgaGllcmFyY2h5IG9mIEJ1Y2tldHMuIiIiCisg
ICAgZGVmIF9faW5pdF9fKHNlbGYpOgorICAgICAgICBzZWxmLl9idWNrZXRzID0ge30KKyAgICAg
ICAgc2VsZi5fcm9vdF9idWNrZXQgPSBzZWxmLl9nZXRfb3JfY3JlYXRlX2J1Y2tldChOb25lKQor
CisgICAgZGVmIF9nZXRfb3JfY3JlYXRlX2J1Y2tldChzZWxmLCBidWNrZXRfbmFtZSk6CisgICAg
ICAgIGlmIGJ1Y2tldF9uYW1lIG5vdCBpbiBzZWxmLl9idWNrZXRzOgorICAgICAgICAgICAgc2Vs
Zi5fYnVja2V0c1tidWNrZXRfbmFtZV0gPSBCdWNrZXQoYnVja2V0X25hbWUpCisgICAgICAgIHJl
dHVybiBzZWxmLl9idWNrZXRzW2J1Y2tldF9uYW1lXQorCisgICAgZGVmIG1ha2VfYnVja2V0KHNl
bGYsIGJ1Y2tldF9uYW1lLCAqYXJncyk6CisgICAgICAgIGIgPSBzZWxmLl9nZXRfb3JfY3JlYXRl
X2J1Y2tldChidWNrZXRfbmFtZSkKKworICAgICAgICBmb3IgYXJnIGluIGFyZ3M6CisgICAgICAg
ICAgICBiLmFwcGVuZChhcmcpCisgICAgICAgIHJldHVybiBiCisKKyAgICBkZWYgaW5zZXJ0X3Jl
c3VsdChzZWxmLCByZXN1bHQpOgorICAgICAgICBpZiByZXN1bHQucGxhdGZvcm0oKSBpbiBzZWxm
Ll9idWNrZXRzLmtleXMoKToKKyAgICAgICAgICAgIHNlbGYuX2J1Y2tldHNbcmVzdWx0LnBsYXRm
b3JtKCldLnNldF9yZXN1bHQocmVzdWx0KQorCisgICAgZGVmIHJlc3VsdHMoc2VsZik6CisgICAg
ICAgIHIgPSBbXQorICAgICAgICBzZWxmLl9yb290X2J1Y2tldC5yZXN1bHRzKHIpCisgICAgICAg
IHJldHVybiByCisKKyAgICBkZWYgY29sbGFwc2Uoc2VsZik6CisgICAgICAgIHNlbGYuX3Jvb3Rf
YnVja2V0LmNvbGxhcHNlKCkKKworICAgIGRlZiBnZXRfYnVja2V0KHNlbGYsIGJ1Y2tldF9uYW1l
KToKKyAgICAgICAgcmV0dXJuIHNlbGYuX2J1Y2tldHNbYnVja2V0X25hbWVdCisKKyAgICBkZWYg
cm9vdF9idWNrZXQoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLmdldF9idWNrZXQoTm9uZSkK
KworICAgIGRlZiBkdW1wKHNlbGYpOgorICAgICAgICBzZWxmLnJvb3RfYnVja2V0KCkuZHVtcCgp
CmRpZmYgLS1naXQgYS9XZWJLaXRUb29scy9TY3JpcHRzL3dlYmtpdHB5L3Rvb2wvY29tbWFuZHMv
cmViYXNlbGluZTIvYnVja2V0X3VuaXR0ZXN0LnB5IGIvV2ViS2l0VG9vbHMvU2NyaXB0cy93ZWJr
aXRweS90b29sL2NvbW1hbmRzL3JlYmFzZWxpbmUyL2J1Y2tldF91bml0dGVzdC5weQpuZXcgZmls
ZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwLi4zNDU0ZGRjMjE5MDQxNzI2MTdhNTFiOGI3NjQ3MzEwZWNmZjkzNzljCi0tLSAvZGV2L251
bGwKKysrIGIvV2ViS2l0VG9vbHMvU2NyaXB0cy93ZWJraXRweS90b29sL2NvbW1hbmRzL3JlYmFz
ZWxpbmUyL2J1Y2tldF91bml0dGVzdC5weQpAQCAtMCwwICsxLDI3MyBAQAorIyEvdXNyL2Jpbi9l
bnYgcHl0aG9uCisjIENvcHlyaWdodCAoQykgMjAxMCBHb29nbGUgSW5jLiBBbGwgcmlnaHRzIHJl
c2VydmVkLgorIworIyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5
IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyMgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHBy
b3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisjIGFyZSBtZXQ6CisjCisjIDEu
ICBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNv
cHlyaWdodAorIyAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZv
bGxvd2luZyBkaXNjbGFpbWVyLgorIyAyLiAgUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3Jt
IG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyMgICAgIG5vdGljZSwgdGhpcyBs
aXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyMg
ICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRo
ZSBkaXN0cmlidXRpb24uCisjCisjIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUg
QU5EIElUUyBDT05UUklCVVRPUlMgIkFTIElTIiBBTkQgQU5ZCisjIEVYUFJFU1MgT1IgSU1QTElF
RCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQK
KyMgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElD
VUxBUiBQVVJQT1NFIEFSRQorIyBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBP
UiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZCisjIERJUkVDVCwgSU5ESVJFQ1Qs
IElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VT
CisjIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJ
VFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyMgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7
IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECisjIE9OIEFOWSBU
SEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZ
LCBPUiBUT1JUCisjIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcg
SU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorIyBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFE
VklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCitmcm9tIGJ1Y2tldCBp
bXBvcnQgQnVja2V0LCBCdWNrZXRUcmVlCitpbXBvcnQgdW5pdHRlc3QKK2Zyb20gcmVzdWx0X3Vu
aXR0ZXN0IGltcG9ydCBGYWtlUmVzdWx0CisKKworY2xhc3MgQnVja2V0VGVzdCh1bml0dGVzdC5U
ZXN0Q2FzZSk6CisgICAgZGVmIHNldFVwKHNlbGYpOgorICAgICAgICBzZWxmLl9tYWMgPSBCdWNr
ZXQoJ21hYycpCisgICAgICAgIHNlbGYuX21hY19sZW9wYXJkID0gQnVja2V0KCdtYWNfbGVvcGFy
ZCcpCisgICAgICAgIHNlbGYuX2xpbnV4ID0gQnVja2V0KCdsaW51eCcpCisgICAgICAgIHNlbGYu
X25vbmUgPSBCdWNrZXQoTm9uZSkKKworICAgIGRlZiB0ZXN0Q2hpbGRCdWNrZXRJbmhlcml0c1Jl
c3VsdE9mUGFyZW50QXNJbXBsaWNpdFJlc3VsdChzZWxmKToKKyAgICAgICAgc2VsZi5fbWFjLnNl
dF9yZXN1bHQoRmFrZVJlc3VsdCgnbWFjJywgJ3RleHQnLCAnYWJjMTIzJykpCisgICAgICAgIHNl
bGYuX21hYy5hcHBlbmQoc2VsZi5fbWFjX2xlb3BhcmQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1
YWxzKCdhYmMxMjMnLCBzZWxmLl9tYWNfbGVvcGFyZC5pbXBsaWNpdF9yZXN1bHQoKS5jb250ZW50
cygpKQorCisgICAgZGVmIHRlc3RDb2xsYXBzZVdvcmtzV2hlbkNoaWxkSGFzRXF1YWxSZXN1bHRz
KHNlbGYpOgorICAgICAgICBzZWxmLl9tYWMuc2V0X3Jlc3VsdChGYWtlUmVzdWx0KCdtYWMnLCAn
dGV4dCcsICdhYmMxMjMnKSkKKyAgICAgICAgc2VsZi5fbWFjX2xlb3BhcmQuc2V0X3Jlc3VsdChG
YWtlUmVzdWx0KCdtYWMnLCAndGV4dCcsICdhYmMxMjMnKSkKKyAgICAgICAgc2VsZi5fbWFjLmFw
cGVuZChzZWxmLl9tYWNfbGVvcGFyZCkKKworICAgICAgICBzZWxmLl9tYWMuY29sbGFwc2UoKQor
CisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzZWxmLl9tYWNfbGVvcGFyZC5pc19lbXB0eSgpKQor
CisgICAgZGVmIHRlc3RDb2xsYXBzZXNDaGlsZFdpdGhJbXBsaWNpdFJlc3VsdEZyb21QYXJlbnQo
c2VsZik6CisgICAgICAgIHNlbGYuX21hYy5zZXRfcmVzdWx0KEZha2VSZXN1bHQoJ21hYycsICd0
ZXh0JywgJ2FiYzEyMycpKQorICAgICAgICBzZWxmLl9tYWMuYXBwZW5kKHNlbGYuX21hY19sZW9w
YXJkKQorCisgICAgICAgIHNlbGYuX21hYy5jb2xsYXBzZSgpCisKKyAgICAgICAgc2VsZi5hc3Nl
cnRUcnVlKHNlbGYuX21hY19sZW9wYXJkLmlzX2VtcHR5KCkpCisKKyAgICBkZWYgdGVzdENvbGxh
cHNlc0NoaWxkV2l0aEltcGxpY2l0UmVzdWx0QW5kRXhwbGljaXRTaWJsaW5nKHNlbGYpOgorICAg
ICAgICBzZWxmLmFzc2VydFRydWUoc2VsZi5fbWFjLmlzX2VtcHR5KCkpCisgICAgICAgIHNlbGYu
X21hYy5zZXRfcmVzdWx0KEZha2VSZXN1bHQoJ21hYycsICd0ZXh0JywgJ2FiYzEyMycpKQorICAg
ICAgICBzZWxmLmFzc2VydEZhbHNlKHNlbGYuX21hYy5pc19lbXB0eSgpKQorICAgICAgICBzZWxm
Ll9tYWNfbGVvcGFyZC5zZXRfcmVzdWx0KEZha2VSZXN1bHQoJ21hYycsICd0ZXh0JywgJ2FiYzEy
MycpKQorCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2Uoc2VsZi5fbWFjLmlzX2VtcHR5KCkpCisg
ICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKCdhYmMxMjMnLCBzZWxmLl9tYWMuaW1wbGljaXRfcmVz
dWx0KCkuY29udGVudHMoKSkKKworICAgICAgICBzZWxmLl9tYWMuYXBwZW5kKHNlbGYuX21hY19s
ZW9wYXJkKQorICAgICAgICBzZWxmLl9tYWMuYXBwZW5kKHNlbGYuX2xpbnV4KQorCisgICAgICAg
IHNlbGYuYXNzZXJ0RXF1YWxzKCdhYmMxMjMnLCBzZWxmLl9tYWNfbGVvcGFyZC5pbXBsaWNpdF9y
ZXN1bHQoKS5jb250ZW50cygpKQorCisgICAgICAgIHNlbGYuX21hYy5jb2xsYXBzZSgpCisKKyAg
ICAgICAgc2VsZi5hc3NlcnRUcnVlKHNlbGYuX2xpbnV4LmlzX2VtcHR5KCkpCisgICAgICAgIHNl
bGYuYXNzZXJ0VHJ1ZShzZWxmLl9tYWNfbGVvcGFyZC5pc19lbXB0eSgpKQorCisgICAgZGVmIHRl
c3RDbGVhcnNPbmx5Q2hpbGRyZW5UaGF0SGF2ZVRoZVNhbWVSZXN1bHRzKHNlbGYpOgorICAgICAg
ICBzZWxmLl9tYWMuc2V0X3Jlc3VsdChGYWtlUmVzdWx0KCdtYWMnLCAndGV4dCcsICdhYmMxMjMn
KSkKKyAgICAgICAgc2VsZi5fbWFjX2xlb3BhcmQuc2V0X3Jlc3VsdChGYWtlUmVzdWx0KCdtYWMt
bGVvcGFyZCcsICd0ZXh0JywgJ2FiYzEyMycpKQorICAgICAgICBzZWxmLl9saW51eC5zZXRfcmVz
dWx0KEZha2VSZXN1bHQoJ2xpbnV4JywgJ3RleHQnLCAnZGVmNDU2JykpCisKKyAgICAgICAgc2Vs
Zi5fbWFjLmFwcGVuZChzZWxmLl9tYWNfbGVvcGFyZCkKKyAgICAgICAgc2VsZi5fbWFjLmFwcGVu
ZChzZWxmLl9saW51eCkKKworICAgICAgICBzZWxmLl9tYWMuY29sbGFwc2UoKQorCisgICAgICAg
IHNlbGYuYXNzZXJ0RXF1YWxzKCdhYmMxMjMnLCBzZWxmLl9tYWMuaW1wbGljaXRfcmVzdWx0KCku
Y29udGVudHMoKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoJ2RlZjQ1NicsIHNlbGYuX2xp
bnV4LmltcGxpY2l0X3Jlc3VsdCgpLmNvbnRlbnRzKCkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1
ZShzZWxmLl9tYWNfbGVvcGFyZC5pc19lbXB0eSgpKQorCisgICAgZGVmIHRlc3RDb2xsYXBzZVdv
cmtzRm9yRGVzY2VuZGVudHNEZWVwZXJUaGF0RGlyZWN0Q2hpbGRyZW4oc2VsZik6CisgICAgICAg
IHNlbGYuX21hYy5zZXRfcmVzdWx0KEZha2VSZXN1bHQoJ21hYycsICd0ZXh0JywgJ2FiYzEyMycp
KQorICAgICAgICBzZWxmLl9saW51eC5zZXRfcmVzdWx0KEZha2VSZXN1bHQoJ2xpbnV4JywgJ3Rl
eHQnLCAnYWJjMTIzJykpCisKKyAgICAgICAgc2VsZi5fbWFjLmFwcGVuZChzZWxmLl9tYWNfbGVv
cGFyZCkKKyAgICAgICAgc2VsZi5fbWFjX2xlb3BhcmQuYXBwZW5kKHNlbGYuX2xpbnV4KQorCisg
ICAgICAgIHNlbGYuX21hYy5jb2xsYXBzZSgpCisKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHNl
bGYuX2xpbnV4LmlzX2VtcHR5KCkpCisKKyAgICBkZWYgdGVzdFRoYXRDb2xsYXBzaW5nTWFpbnRh
aW5zQ29ycmVjdFBsYXRmb3JtKHNlbGYpOgorICAgICAgICBzZWxmLl9tYWMuYXBwZW5kKHNlbGYu
X21hY19sZW9wYXJkKQorICAgICAgICBzZWxmLl9ub25lLmFwcGVuZChzZWxmLl9tYWMpCisKKyAg
ICAgICAgc2VsZi5fbWFjX2xlb3BhcmQuc2V0X3Jlc3VsdChGYWtlUmVzdWx0KCdtYWMtbGVvcGFy
ZCcsICd0ZXh0JywgJ2FiYzEyMycpKQorICAgICAgICBzZWxmLl9ub25lLnNldF9yZXN1bHQoRmFr
ZVJlc3VsdChOb25lLCAndGV4dCcsICdkZWY0NTYnKSkKKworICAgICAgICBzZWxmLl9ub25lLmNv
bGxhcHNlKCkKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhOb25lLCBzZWxmLl9tYWMuaW1w
bGljaXRfcmVzdWx0KCkucGxhdGZvcm0oKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoJ21h
Yy1sZW9wYXJkJywgc2VsZi5fbWFjX2xlb3BhcmQuaW1wbGljaXRfcmVzdWx0KCkucGxhdGZvcm0o
KSkKKworICAgIGRlZiB0ZXN0UGFyZW50V2l0aE5vUmVzdWx0V2lsbEluaGVyaXRGcm9tQ2hpbGRy
ZW5XaXRoU2FtZVJlc3VsdChzZWxmKToKKyAgICAgICAgc2VsZi5fbWFjLnNldF9yZXN1bHQoRmFr
ZVJlc3VsdCgnbWFjJywgJ3RleHQnLCAnYWJjMTIzJykpCisgICAgICAgIHNlbGYuX2xpbnV4LnNl
dF9yZXN1bHQoRmFrZVJlc3VsdCgnbGludXgnLCAndGV4dCcsICdhYmMxMjMnKSkKKworICAgICAg
ICBzZWxmLl9ub25lLmFwcGVuZChzZWxmLl9tYWMpCisgICAgICAgIHNlbGYuX25vbmUuYXBwZW5k
KHNlbGYuX2xpbnV4KQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKE5vbmUsIHNlbGYuX25v
bmUuaW1wbGljaXRfcmVzdWx0KCkpCisKKyAgICAgICAgc2VsZi5fbm9uZS5jb2xsYXBzZSgpCisK
KyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoJ2FiYzEyMycsIHNlbGYuX25vbmUuaW1wbGljaXRf
cmVzdWx0KCkuY29udGVudHMoKSkKKworIiIiCisgICAgICAgIFRPRE8gTWFrZSB0aGlzIGludG8g
dGVzdHMuCisKKyAgICAgICAgQ2hpbGRyZW4gYWxsIGhhdmUgdGhlIHNhbWUgZXhwbGljaXQgcmVz
dWx0IGFzIHRoZSBwYXJlbnQuCisKKyAgICAgICAgQSBBIEEgICAgICAgIE8gTyBPCisgICAgICAg
ICBcfC8gICAgLT4gICAgXHwvCisgICAgICAgICAgQSAgICAgICAgICAgIEEKKworCisgICAgICAg
IENoaWxkcmVuIGFsbCBoYXZlIHRoZSBzYW1lIHJlc3VsdCwgYnV0IHRoZSBwYXJlbnQgaGFzIG5v
bmUuCisKKyAgICAgICAgQSBBIEEgICAgICAgIE8gTyBPCisgICAgICAgICBcfC8gICAgLT4gICAg
XHwvCisgICAgICAgICAgTyAgICAgICAgICAgIEEKKworCisgICAgICAgIE9uZSBvZiB0aGUgY2hp
bGRyZW4gaGFzIHRoZSBzYW1lIHJlc3VsdCBhcyB0aGUgcGFyZW50LgorCisgICAgICAgIEEgQiBD
ICAgICAgICBPIEIgQworICAgICAgICAgXHwvICAgIC0+ICAgIFx8LworICAgICAgICAgIEEgICAg
ICAgICAgICBBCisKKyAgICAgICAgRGVzY2VuZGVudHMgYWxsIGhhdmUgc2FtZSBleHBsaWNpdCBy
ZXN1bHQgYXMgdGhlIGFuY2VzdG9yLgorCisgICAgICAgIEEgQSBBICAgICAgICBPIE8gTworICAg
ICAgICAgXHwvICAgIC0+ICAgIFx8LworICAgICAgICAgIE8gICAgICAgICAgICBPCisgICAgICAg
ICAgfCAgICAgICAgICAgIHwKKyAgICAgICAgICBBICAgICAgICAgICAgQQorCisgICAgICAgIFdo
ZXJlIEEgaXMgYSBidWNrZXQgd2l0aCBhIHRlc3QgcmVzdWx0LCBhbmQgTyBpcyBhbiBlbXB0eSBi
dWNrZXQuCisiIiIKKworCitjbGFzcyBCdWNrZXRUcmVlVGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6
CisgICAgZGVmIHRlc3ROZXdFeHBlY3RhdGlvbnNPdmVycmlkZU9sZE9uZXMoc2VsZik6CisgICAg
ICAgIGIgPSBCdWNrZXRUcmVlKCkKKyAgICAgICAgbWIgPSBiLm1ha2VfYnVja2V0CisgICAgICAg
IHJvb3QgPSBtYihOb25lLAorICAgICAgICAgICAgbWIoJ21hYycpLAorICAgICAgICAgICAgbWIo
J2xpbnV4JyksCisgICAgICAgICAgICBtYignd2luJykpCisKKyAgICAgICAgYi5pbnNlcnRfcmVz
dWx0KEZha2VSZXN1bHQoTm9uZSwgJ3RleHQnLCAnYWJjMTIzJywgVHJ1ZSkpCisgICAgICAgIGIu
aW5zZXJ0X3Jlc3VsdChGYWtlUmVzdWx0KE5vbmUsICd0ZXh0JywgJ2RlZjQ1NicpKQorCisgICAg
ICAgIGIuY29sbGFwc2UoKQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoMSwgbGVuKGIucmVz
dWx0cygpKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgnZGVmNDU2JywgYi5yZXN1bHRzKClb
MF0uY29udGVudHMoKSkKKworICAgIGRlZiB0ZXN0UmViYXNlbGluaW5nU3RpbGxXb3Jrc0lmTmV3
UmVzdWx0c0FyZUluc2VydGVkRmlyc3Qoc2VsZik6CisgICAgICAgIGIgPSBCdWNrZXRUcmVlKCkK
KyAgICAgICAgbWIgPSBiLm1ha2VfYnVja2V0CisgICAgICAgIHJvb3QgPSBtYihOb25lLAorICAg
ICAgICAgICAgbWIoJ21hYycpLAorICAgICAgICAgICAgbWIoJ2xpbnV4JyksCisgICAgICAgICAg
ICBtYignd2luJykpCisKKyAgICAgICAgYi5pbnNlcnRfcmVzdWx0KEZha2VSZXN1bHQoTm9uZSwg
J3RleHQnLCAnZGVmNDU2JykpCisgICAgICAgIGIuaW5zZXJ0X3Jlc3VsdChGYWtlUmVzdWx0KE5v
bmUsICd0ZXh0JywgJ2FiYzEyMycsIFRydWUpKQorCisgICAgICAgIGIuY29sbGFwc2UoKQorCisg
ICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoMSwgbGVuKGIucmVzdWx0cygpKSkKKyAgICAgICAgc2Vs
Zi5hc3NlcnRFcXVhbCgnZGVmNDU2JywgYi5yZXN1bHRzKClbMF0uY29udGVudHMoKSkKKworICAg
IGRlZiB0ZXN0S2lkc0hhdmluZ1NhbWVSZWJhc2VsaW5lQ2F1c2VzT3ZlcnJpZGVPblBhcmVudChz
ZWxmKToKKyAgICAgICAgYiA9IEJ1Y2tldFRyZWUoKQorICAgICAgICBtYiA9IGIubWFrZV9idWNr
ZXQKKyAgICAgICAgcm9vdCA9IG1iKE5vbmUsCisgICAgICAgICAgICBtYignbWFjJyksCisgICAg
ICAgICAgICBtYignd2luJykpCisgICAgICAgIGIuZ2V0X2J1Y2tldChOb25lKS5tYXJrX2FzX2Fn
Z3JlZ2F0ZSgpCisKKyAgICAgICAgYi5pbnNlcnRfcmVzdWx0KEZha2VSZXN1bHQoTm9uZSwgJ3Rl
eHQnLCAnb2xkIHJlc3VsdCcsIFRydWUpKQorICAgICAgICBiLmluc2VydF9yZXN1bHQoRmFrZVJl
c3VsdCgnbWFjJywgJ3RleHQnLCAnbmV3IHJlc3VsdCcpKQorICAgICAgICBiLmluc2VydF9yZXN1
bHQoRmFrZVJlc3VsdCgnd2luJywgJ3RleHQnLCAnbmV3IHJlc3VsdCcpKQorCisgICAgICAgIGIu
Y29sbGFwc2UoKQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoMSwgbGVuKGIucmVzdWx0cygp
KSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChOb25lLCBiLnJlc3VsdHMoKVswXS5wbGF0Zm9y
bSgpKQorCisgICAgZGVmIHRlc3RXZURvbnRJbmhlcml0RnJvbUNoaWxkcmVuSWZXZUFyZU5vdEFu
QWdncmVnYXRlQnVja2V0KHNlbGYpOgorICAgICAgICBiID0gQnVja2V0VHJlZSgpCisgICAgICAg
IG1iID0gYi5tYWtlX2J1Y2tldAorICAgICAgICByb290ID0gbWIoTm9uZSwKKyAgICAgICAgICAg
IG1iKCdtYWMnKSwKKyAgICAgICAgICAgIG1iKCd3aW4nKSkKKworICAgICAgICBiLmluc2VydF9y
ZXN1bHQoRmFrZVJlc3VsdChOb25lLCAndGV4dCcsICdvbGQgcmVzdWx0JywgVHJ1ZSkpCisgICAg
ICAgIGIuaW5zZXJ0X3Jlc3VsdChGYWtlUmVzdWx0KCdtYWMnLCAndGV4dCcsICduZXcgcmVzdWx0
JykpCisgICAgICAgIGIuaW5zZXJ0X3Jlc3VsdChGYWtlUmVzdWx0KCd3aW4nLCAndGV4dCcsICdu
ZXcgcmVzdWx0JykpCisKKyAgICAgICAgYi5jb2xsYXBzZSgpCisKKyAgICAgICAgc2VsZi5hc3Nl
cnRFcXVhbCgzLCBsZW4oYi5yZXN1bHRzKCkpKQorCisgICAgZGVmIHRlc3RNdWx0aVBoYXNlZENv
bGxhcHNlV29ya3Moc2VsZik6CisgICAgICAgIGIgPSBCdWNrZXRUcmVlKCkKKyAgICAgICAgbWIg
PSBiLm1ha2VfYnVja2V0CisgICAgICAgIHJvb3QgPSBtYihOb25lLAorICAgICAgICAgICAgbWIo
J21hYycsCisgICAgICAgICAgICAgICAgbWIoJ21hYy1sZW9wYXJkJykpKQorCisgICAgICAgIGIu
Z2V0X2J1Y2tldChOb25lKS5tYXJrX2FzX2FnZ3JlZ2F0ZSgpCisKKyAgICAgICAgYi5pbnNlcnRf
cmVzdWx0KEZha2VSZXN1bHQoTm9uZSwgJ3RleHQnLCAnb2xkIHJlc3VsdCcsIFRydWUpKQorICAg
ICAgICBiLmluc2VydF9yZXN1bHQoRmFrZVJlc3VsdCgnbWFjJywgJ3RleHQnLCAnbmV3IHJlc3Vs
dCcpKQorICAgICAgICBiLmluc2VydF9yZXN1bHQoRmFrZVJlc3VsdCgnbWFjLWxlb3BhcmQnLCAn
dGV4dCcsICduZXcgcmVzdWx0JykpCisKKyAgICAgICAgYi5jb2xsYXBzZSgpCisKKyAgICAgICAg
c2VsZi5hc3NlcnRFcXVhbCgxLCBsZW4oYi5yZXN1bHRzKCkpKQorCisgICAgZGVmIHRlc3RQbGFp
bk9sZERlZHVwZU9uTGF5b3V0VGVzdHNXb3JrcyhzZWxmKToKKyAgICAgICAgYiA9IEJ1Y2tldFRy
ZWUoKQorICAgICAgICBtYiA9IGIubWFrZV9idWNrZXQKKyAgICAgICAgcm9vdCA9IG1iKE5vbmUs
CisgICAgICAgICAgICBtYignbWFjJywKKyAgICAgICAgICAgICAgICBtYignbWFjLWxlb3BhcmQn
LAorICAgICAgICAgICAgICAgICAgICBtYignbWFjLXNub3dsZW9wYXJkJykpKSwKKyAgICAgICAg
ICAgIG1iKCdsaW51eCcsCisgICAgICAgICAgICAgICAgbWIoJ2Nocm9taXVtLWxpbnV4JykpKQor
CisgICAgICAgIGIuaW5zZXJ0X3Jlc3VsdChGYWtlUmVzdWx0KE5vbmUsICd0ZXh0JywgJ3Jlc3Vs
dCcsIFRydWUpKQorICAgICAgICBiLmluc2VydF9yZXN1bHQoRmFrZVJlc3VsdCgnY2hyb21pdW0t
bGludXgnLCAndGV4dCcsICdyZXN1bHQnLCBUcnVlKSkKKworICAgICAgICBiLmNvbGxhcHNlKCkK
KworICAgICAgICBzZWxmLmFzc2VydEVxdWFscygxLCBsZW4oYi5yZXN1bHRzKCkpKQorICAgICAg
ICBzZWxmLmFzc2VydEVxdWFscyhOb25lLCBiLnJlc3VsdHMoKVswXS5wbGF0Zm9ybSgpKQorCisg
ICAgZGVmIHRlc3RDb2xsYXBzZU9uQnVja2V0c1dpdGhOb1Jlc3VsdERvZXNudENyYXNoKHNlbGYp
OgorICAgICAgICBiID0gQnVja2V0VHJlZSgpCisgICAgICAgIG1iID0gYi5tYWtlX2J1Y2tldAor
ICAgICAgICByb290ID0gbWIoTm9uZSwKKyAgICAgICAgICAgIG1iKCdtYWMnLAorICAgICAgICAg
ICAgICAgIG1iKCdtYWMtbGVvcGFyZCcpKSkKKworICAgICAgICBiLmNvbGxhcHNlKCkKKworaWYg
X19uYW1lX18gPT0gJ19fbWFpbl9fJzoKKyAgICB1bml0dGVzdC5tYWluKCkKZGlmZiAtLWdpdCBh
L1dlYktpdFRvb2xzL1NjcmlwdHMvd2Via2l0cHkvdG9vbC9jb21tYW5kcy9yZWJhc2VsaW5lMi9y
ZWJhc2VsaW5lMi5weSBiL1dlYktpdFRvb2xzL1NjcmlwdHMvd2Via2l0cHkvdG9vbC9jb21tYW5k
cy9yZWJhc2VsaW5lMi9yZWJhc2VsaW5lMi5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwLi5lMmFkZjNjNWI4MWVkZjEy
NDBlYTg3ZWM2NTc5MjgyNDJjY2IxYjBkCi0tLSAvZGV2L251bGwKKysrIGIvV2ViS2l0VG9vbHMv
U2NyaXB0cy93ZWJraXRweS90b29sL2NvbW1hbmRzL3JlYmFzZWxpbmUyL3JlYmFzZWxpbmUyLnB5
CkBAIC0wLDAgKzEsOTYgQEAKKyMgQ29weXJpZ2h0IChjKSAyMDEwIEdvb2dsZSBJbmMuIEFsbCBy
aWdodHMgcmVzZXJ2ZWQuCisjCisjIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFu
ZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorIyBtb2RpZmljYXRpb24sIGFyZSBwZXJt
aXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisjIG1ldDoK
KyMKKyMgICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRo
ZSBhYm92ZSBjb3B5cmlnaHQKKyMgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQg
dGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorIyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmlu
YXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisjIGNvcHlyaWdodCBub3RpY2UsIHRo
aXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKyMgaW4g
dGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRo
ZQorIyBkaXN0cmlidXRpb24uCisjICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIElu
Yy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVu
ZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKyMgdGhpcyBzb2Z0d2FyZSB3
aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyMKKyMgVEhJUyBTT0ZU
V0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9S
UworIyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xV
RElORywgQlVUIE5PVAorIyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1F
UkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyMgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJF
IERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKyMgT1dORVIgT1Ig
Q09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5U
QUwsCisjIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNM
VURJTkcsIEJVVCBOT1QKKyMgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBH
T09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisjIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJV
U0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorIyBUSEVPUlkg
T0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBU
T1JUCisjIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5Z
IFdBWSBPVVQgT0YgVEhFIFVTRQorIyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQg
T0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCitmcm9tIHdlYmtpdHB5LnRvb2wu
bXVsdGljb21tYW5kdG9vbCBpbXBvcnQgQWJzdHJhY3REZWNsYXJhdGl2ZUNvbW1hbmQKK2Zyb20g
d2Via2l0cHkuY29tbW9uLm5ldC5yZXN1bHRzZXQgaW1wb3J0IFJlc3VsdFNldAorZnJvbSB3ZWJr
aXRweS5jb21tb24ubmV0LnJlc3VsdCBpbXBvcnQgSW1hZ2VSZXN1bHQKK2Zyb20gd2Via2l0cHku
dG9vbC5jb21tYW5kcy5yZWJhc2VsaW5lMi5yZWJhc2VsaW5lciBpbXBvcnQgUmViYXNlbGluZXIK
KworZnJvbSBvcHRwYXJzZSBpbXBvcnQgbWFrZV9vcHRpb24KK2ltcG9ydCBvcworCisKK2NsYXNz
IEltYWdlRGlmZmVyKG9iamVjdCk6CisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHBvcnQpOgorICAg
ICAgICBzZWxmLl9wb3J0ID0gcG9ydAorCisgICAgZGVmIHNhbWVfaW1hZ2Uoc2VsZiwgaW1nMSwg
aW1nMik6CisgICAgICAgIHJldHVybiBub3Qgc2VsZi5fcG9ydC5kaWZmX2ltYWdlKGltZzEsIGlt
ZzIpCisKKworY2xhc3MgUmViYXNlbGluZTIoQWJzdHJhY3REZWNsYXJhdGl2ZUNvbW1hbmQpOgor
ICAgIG5hbWUgPSAicmViYXNlbGluZTIiCisgICAgaGVscF90ZXh0ID0gIkZldGNoZXMgbmV3IGV4
cGVjdGVkIHJlc3VsdHMgZnJvbSBidWlsZGJvdHMuIgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYp
OgorICAgICAgICBvcHRpb25zID0gWworICAgICAgICAgICAgbWFrZV9vcHRpb24oIi0tcGxhdGZv
cm1zIiwgYWN0aW9uPSJzdG9yZSIsIGRlc3Q9InBsYXRmb3JtcyIsCisgICAgICAgICAgICAgICAg
aGVscD0iQ29tbWEgc2VwYXJhdGVkIGxpc3Qgb2YgdGhlIHBsYXRmb3JtcyB0byByZWJhc2VsaW5l
IGZvci4iKSwKKyAgICAgICAgICAgIG1ha2Vfb3B0aW9uKCItLXVzZS16aXAtYXMtYXJjaGl2ZSIs
IGFjdGlvbj0ic3RvcmUiLAorICAgICAgICAgICAgICAgIGhlbHA9IlVzZSB0aGUgemlwIGF0IHRo
ZSBzcGVjaWZpZWQgVVJMIChsb2NhbCBvciByZW1vdGUpIHRvIHNwZWNpZnkgcmVzdWx0cyAiCisg
ICAgICAgICAgICAgICAgImZvciB0aGUgZ2l2ZW4gcGxhdGZvcm0uIiwgbWV0YXZhcj0iPHBsYXRm
b3JtPjo8emlwIHVybD4iKSwKKyAgICAgICAgXQorICAgICAgICBBYnN0cmFjdERlY2xhcmF0aXZl
Q29tbWFuZC5fX2luaXRfXyhzZWxmLCBvcHRpb25zPW9wdGlvbnMpCisKKyAgICBkZWYgZXhlY3V0
ZShzZWxmLCBvcHRpb25zLCBhcmdzLCB0b29sKToKKyAgICAgICAgcG9ydCA9IHRvb2wucG9ydF9m
YWN0b3J5LmdldChwb3J0X25hbWU9b3B0aW9ucy5wb3J0KQorCisgICAgICAgIGlmIG9wdGlvbnMu
cGxhdGZvcm1zOgorICAgICAgICAgICAgcGxhdGZvcm1zID0gb3B0aW9ucy5wbGF0Zm9ybXMuc3Bs
aXQoJywnKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcGxhdGZvcm1zID0gW10KKworICAg
ICAgICBpZiBwb3J0LmNoZWNrX2ltYWdlX2RpZmYoKToKKyAgICAgICAgICAgIEltYWdlUmVzdWx0
LmltYWdlX2RpZmZlciA9IEltYWdlRGlmZmVyKHBvcnQpCisgICAgICAgIGVsc2U6CisgICAgICAg
ICAgICBwcmludCAiV2FybmluZzogQ291bGRuJ3QgZmluZCBJbWFnZURpZmYsIHNvIHdlIHdpbGwg
Y3Jhc2ggaWYgd2UgbmVlZCB0byBjb21wYXJlIGltYWdlcyB0aGF0IGRvbid0IGhhdmUgY2hlY2tz
dW1zLiIKKyAgICAgICAgICAgIEltYWdlUmVzdWx0LmltYWdlX2RpZmZlciA9IE5vbmUKKworICAg
ICAgICBpZiBvcHRpb25zLnVzZV96aXBfYXNfYXJjaGl2ZSBpcyBub3QgTm9uZToKKyAgICAgICAg
ICAgIGkgPSBvcHRpb25zLnVzZV96aXBfYXNfYXJjaGl2ZS5pbmRleCgnOicpCisgICAgICAgICAg
ICBwbGF0Zm9ybSwgdXJsID0gb3B0aW9ucy51c2VfemlwX2FzX2FyY2hpdmVbOmldLCBvcHRpb25z
LnVzZV96aXBfYXNfYXJjaGl2ZVtpICsgMTpdCisgICAgICAgICAgICByZW1vdGVfYnVpbGRlcnMg
PSBSZXN1bHRTZXQuZnJvbV96aXBfdXJsKHBsYXRmb3JtLCB1cmwpCisgICAgICAgIGVsc2U6Cisg
ICAgICAgICAgICByZW1vdGVfYnVpbGRlcnMgPSBwb3J0LmJ1aWxkYm90X3Jlc3VsdHNldChwbGF0
Zm9ybXMpCisKKyAgICAgICAgbGF5b3V0X3Rlc3RzX2RpciA9IHBvcnQubGF5b3V0X3Rlc3RzX2Rp
cigpCisgICAgICAgIGxvY2FsX2J1aWxkZXJzID0gUmVzdWx0U2V0LmZyb21fcGF0aChsYXlvdXRf
dGVzdHNfZGlyKQorICAgICAgICBsaW5lcyA9IHNlbGYuYWxsX2Jhc2VsaW5lX3NlYXJjaF9wYXRo
cyh0b29sLnBvcnRfZmFjdG9yeSkKKyAgICAgICAgcmIgPSBSZWJhc2VsaW5lcihhcmdzLCBsb2Nh
bF9idWlsZGVycywgcmVtb3RlX2J1aWxkZXJzLCBsaW5lcywgbGF5b3V0X3Rlc3RzX2RpcikKKyAg
ICAgICAgcmIuc2V0X3ZlcmJvc2Uob3B0aW9ucy52ZXJib3NlKQorICAgICAgICByYi5yZWJhc2Vs
aW5lKG9wdGlvbnMuZHJ5X3J1bikKKworICAgIGRlZiBhbGxfYmFzZWxpbmVfc2VhcmNoX3BhdGhz
KHNlbGYsIHBvcnRfZmFjdG9yeSk6CisgICAgICAgIHBvcnRzID0gcG9ydF9mYWN0b3J5LmdldF9h
bGwoKQorICAgICAgICBkZWwocG9ydHNbJ3Rlc3QnXSkKKyAgICAgICAgZGVsKHBvcnRzWydkcnly
dW4nXSkKKyAgICAgICAgcmVzdWx0ID0gW10KKyAgICAgICAgZm9yIHBvcnRfbmFtZSwgcG9ydCBp
biBwb3J0cy5pdGVtcygpOgorICAgICAgICAgICAgcHJpbnQgImdldHRpbmcgYmFzZWxpbmVzIGZv
ciAlcyIgJSBwb3J0X25hbWUKKyAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQobWFwKG9zLnBhdGgu
YmFzZW5hbWUsIHBvcnQuYmFzZWxpbmVfc2VhcmNoX3BhdGgoKSkpCisgICAgICAgIHJldHVybiBy
ZXN1bHQKZGlmZiAtLWdpdCBhL1dlYktpdFRvb2xzL1NjcmlwdHMvd2Via2l0cHkvdG9vbC9jb21t
YW5kcy9yZWJhc2VsaW5lMi9yZWJhc2VsaW5lci5weSBiL1dlYktpdFRvb2xzL1NjcmlwdHMvd2Vi
a2l0cHkvdG9vbC9jb21tYW5kcy9yZWJhc2VsaW5lMi9yZWJhc2VsaW5lci5weQpuZXcgZmlsZSBt
b2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
Li40ZWUxYzE3ZmE3NWNmMmJiODY4NTE0MmVlZTBjOGE5ZDY1NzQ4YTEyCi0tLSAvZGV2L251bGwK
KysrIGIvV2ViS2l0VG9vbHMvU2NyaXB0cy93ZWJraXRweS90b29sL2NvbW1hbmRzL3JlYmFzZWxp
bmUyL3JlYmFzZWxpbmVyLnB5CkBAIC0wLDAgKzEsMTU1IEBACisjIS91c3IvYmluL2VudiBweXRo
b24KKyMgQ29weXJpZ2h0IChDKSAyMDEwIEdvb2dsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQu
CisjCisjIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMs
IHdpdGggb3Igd2l0aG91dAorIyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQg
dGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyMgYXJlIG1ldDoKKyMKKyMgMS4gIFJlZGlz
dHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0
CisjICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5n
IGRpc2NsYWltZXIuCisjIDIuICBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCBy
ZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorIyAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2Yg
Y29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorIyAgICAgZG9j
dW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3Ry
aWJ1dGlvbi4KKyMKKyMgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBBTkQgSVRT
IENPTlRSSUJVVE9SUyAiQVMgSVMiIEFORCBBTlkKKyMgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJB
TlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRAorIyBXQVJS
QU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBV
UlBPU0UgQVJFCisjIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIE9SIElUUyBD
T05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkKKyMgRElSRUNULCBJTkRJUkVDVCwgSU5DSURF
TlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMKKyMgKElO
Q0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdP
T0RTIE9SIFNFUlZJQ0VTOworIyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVT
SU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKKyMgT04gQU5ZIFRIRU9SWSBP
RiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRP
UlQKKyMgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkg
V0FZIE9VVCBPRiBUSEUgVVNFIE9GCisjIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBP
RiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKK2ltcG9ydCBidWNrZXQKKworCitj
bGFzcyBSZWJhc2VsaW5lcihvYmplY3QpOgorICAgIFRZUEVTID0gWyd0ZXh0JywgJ2ltYWdlJ10K
KyAgICAiIiJSZWJhc2VsaW5lcyBhbmQgZGVkdXBlcyByZXN1bHRzLiIiIgorICAgIGRlZiBfX2lu
aXRfXyhzZWxmLCB0ZXN0X2dsb2JzLCBsb2NhbF9yZXN1bHRzLCByZW1vdGVfcmVzdWx0cywgbGlu
ZXMsCisgICAgICAgICAgICAgICAgIGxheW91dF90ZXN0c19kaXIsICoqa3dhcmdzKToKKyAgICAg
ICAgc2VsZi5fdGVzdF9nbG9icyA9IHRlc3RfZ2xvYnMKKyAgICAgICAgc2VsZi5fZXhpc3Rpbmdf
cmVzdWx0cyA9IGxvY2FsX3Jlc3VsdHMKKyAgICAgICAgc2VsZi5fbmV3X3Jlc3VsdHMgPSByZW1v
dGVfcmVzdWx0cworICAgICAgICBzZWxmLl9saW5lcyA9IGxpbmVzCisgICAgICAgIHNlbGYuX2xh
eW91dF90ZXN0c19kaXIgPSBsYXlvdXRfdGVzdHNfZGlyCisgICAgICAgIHNlbGYuX3ZlcmJvc2Ug
PSBrd2FyZ3MuZ2V0KCd2ZXJib3NlJywgRmFsc2UpCisgICAgICAgIHNlbGYuX3JlYmFzZWxpbmVz
ID0gTm9uZQorCisgICAgZGVmIF9zaG93X3Jlc3VsdHMoc2VsZiwgZGVzY3JpcHRpb24sIHJlc3Vs
dHMpOgorICAgICAgICBzZWxmLmxvZyhkZXNjcmlwdGlvbikKKyAgICAgICAgZm9yIHIgaW4gcmVz
dWx0czoKKyAgICAgICAgICAgIHNlbGYubG9nKHIpCisKKyAgICBkZWYgX3Rlc3RfbmFtZXMoc2Vs
Zik6CisgICAgICAgIHRlc3RfbmFtZXMgPSBzZXQoW10pCisgICAgICAgIGlmIGxlbihzZWxmLl90
ZXN0X2dsb2JzKSA9PSAwOgorICAgICAgICAgICAgcmV0dXJuIG1hcChsYW1iZGEgcjogci5uYW1l
KCksIHNlbGYuX25ld19yZXN1bHRzLnJlc3VsdHNfZm9yKCcnKSkKKyAgICAgICAgZm9yIHRlc3Rf
Z2xvYiBpbiBzZWxmLl90ZXN0X2dsb2JzOgorICAgICAgICAgICAgbmV3X3Jlc3VsdHMgPSBzZWxm
Ll9uZXdfcmVzdWx0cy5yZXN1bHRzX2Zvcih0ZXN0X2dsb2IpCisgICAgICAgICAgICAjIFRPRE8g
VGhpcyBpcyByZWFsbHkgc2xvdyBhbmQgaXNuJ3QgbmVjZXNzYXJ5IHVubGVzcyB3ZSBhcmUgbWVy
ZWx5CisgICAgICAgICAgICAjIGRlZHVwaW5nIGV4aXN0aW5nIHJlc3VsdHMuIEl0IHNob3VsZCBi
ZSBjb250cm9sbGVkIGJ5IGEgZmxhZy4KKyAgICAgICAgICAgICMgb2xkX3Jlc3VsdHMgPSBzZWxm
Ll9leGlzdGluZ19yZXN1bHRzLnJlc3VsdHNfZm9yKHRlc3RfZ2xvYikKKyAgICAgICAgICAgIG5h
bWVzID0gc2V0KG1hcChsYW1iZGEgcjogci5uYW1lKCksIG5ld19yZXN1bHRzKSkKKyAgICAgICAg
ICAgIHRlc3RfbmFtZXMgPSB0ZXN0X25hbWVzLnVuaW9uKG5hbWVzKQorICAgICAgICByZXR1cm4g
dGVzdF9uYW1lcworCisgICAgZGVmIF9kZWR1cGUoc2VsZiwgcmVzdWx0cyk6CisgICAgICAgIGRl
ZHVwZWQgPSBzZXQoW10pCisgICAgICAgIGZvciBsaW5lIGluIHNlbGYuX2xpbmVzOgorICAgICAg
ICAgICAgYnVja2V0cyA9IHNlbGYuX21ha2VfYnVja2V0X2xpbmUobGluZSkKKyAgICAgICAgICAg
IGZvciByZXN1bHQgaW4gcmVzdWx0czoKKyAgICAgICAgICAgICAgICBidWNrZXRzLmluc2VydF9y
ZXN1bHQocmVzdWx0KQorICAgICAgICAgICAgYnVja2V0cy5jb2xsYXBzZSgpCisgICAgICAgICAg
ICBkZWR1cGVkID0gZGVkdXBlZC51bmlvbihidWNrZXRzLnJlc3VsdHMoKSkKKyAgICAgICAgcmV0
dXJuIGRlZHVwZWQKKworICAgIGRlZiBfbWFrZV9idWNrZXRfbGluZShzZWxmLCBsaW5lKToKKyAg
ICAgICAgYnQgPSBidWNrZXQuQnVja2V0VHJlZSgpCisgICAgICAgIGxpbmUgPSBsaW5lWzpdCisg
ICAgICAgIGxpbmUucmV2ZXJzZSgpCisgICAgICAgIHRvcF9idWNrZXQgPSBOb25lCisgICAgICAg
IGZvciBwbGF0Zm9ybSBpbiBsaW5lOgorICAgICAgICAgICAgbmV4dF9idWNrZXQgPSBidC5tYWtl
X2J1Y2tldChwbGF0Zm9ybSkKKyAgICAgICAgICAgIGlmIHRvcF9idWNrZXQgaXMgbm90IE5vbmU6
CisgICAgICAgICAgICAgICAgdG9wX2J1Y2tldC5hcHBlbmQobmV4dF9idWNrZXQpCisgICAgICAg
ICAgICB0b3BfYnVja2V0ID0gbmV4dF9idWNrZXQKKyAgICAgICAgcmV0dXJuIGJ0CisKKyAgICBk
ZWYgc2V0X3ZlcmJvc2Uoc2VsZiwgdmVyYm9zZSk6CisgICAgICAgIHNlbGYuX3ZlcmJvc2UgPSB2
ZXJib3NlCisKKyAgICBkZWYgZXhpc3RpbmdfcmVzdWx0cyhzZWxmLCB0ZXN0X25hbWUpOgorICAg
ICAgICByZXR1cm4gc2VsZi5fZXhpc3RpbmdfcmVzdWx0cy5yZXN1bHRzX2Zvcih0ZXN0X25hbWUp
CisKKyAgICBkZWYgbmV3X3Jlc3VsdHMoc2VsZiwgdGVzdF9uYW1lKToKKyAgICAgICAgcmV0dXJu
IHNlbGYuX25ld19yZXN1bHRzLnJlc3VsdHNfZm9yKHRlc3RfbmFtZSkKKworICAgIGRlZiBjYWxj
dWxhdGVfcmViYXNlbGluZShzZWxmKToKKyAgICAgICAgaWYgc2VsZi5fcmViYXNlbGluZXMgaXMg
bm90IE5vbmU6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5fcmViYXNlbGluZXMKKyAgICAgICAg
c2VsZi5fcmViYXNlbGluZXMgPSB7fQorICAgICAgICBmb3IgdGVzdF9uYW1lIGluIHNlbGYuX3Rl
c3RfbmFtZXMoKToKKyAgICAgICAgICAgIGZvciB0eXBlIGluIFJlYmFzZWxpbmVyLlRZUEVTOgor
ICAgICAgICAgICAgICAgIG5ld19yZXN1bHRzID0gc2VsZi5fbmV3X3Jlc3VsdHMucmVzdWx0c19m
b3IodGVzdF9uYW1lLCB0YXJnZXRfdHlwZT10eXBlLCBleGFjdF9tYXRjaD1UcnVlKQorICAgICAg
ICAgICAgICAgIGV4aXN0aW5nX3Jlc3VsdHMgPSBzZWxmLl9leGlzdGluZ19yZXN1bHRzLnJlc3Vs
dHNfZm9yKHRlc3RfbmFtZSwgdGFyZ2V0X3R5cGU9dHlwZSwgZXhhY3RfbWF0Y2g9VHJ1ZSkKKwor
ICAgICAgICAgICAgICAgIGlmIGxlbihuZXdfcmVzdWx0cykgKyBsZW4oZXhpc3RpbmdfcmVzdWx0
cykgPT0gMDoKKyAgICAgICAgICAgICAgICAgICAgY29udGludWUKKworICAgICAgICAgICAgICAg
IHNlbGYubG9nKCJSZWJhc2VsaW5pbmcgJXNbJXNdIiAlICh0ZXN0X25hbWUsIHR5cGUpKQorCisg
ICAgICAgICAgICAgICAgc2VsZi5fc2hvd19yZXN1bHRzKCJuZXdfcmVzdWx0cyIsIG5ld19yZXN1
bHRzKQorICAgICAgICAgICAgICAgIHNlbGYuX3Nob3dfcmVzdWx0cygiZXhpc3RpbmdfcmVzdWx0
cyIsIGV4aXN0aW5nX3Jlc3VsdHMpCisKKyAgICAgICAgICAgICAgICBkZWR1cGVkX3Jlc3VsdHMg
PSBzZWxmLl9kZWR1cGUobmV3X3Jlc3VsdHMgKyBleGlzdGluZ19yZXN1bHRzKQorCisgICAgICAg
ICAgICAgICAgc2VsZi5fc2hvd19yZXN1bHRzKCJkZWR1cGVkX3Jlc3VsdHMiLCBkZWR1cGVkX3Jl
c3VsdHMpCisKKyAgICAgICAgICAgICAgICB0b19kZWxldGUgPSBzZXQoZXhpc3RpbmdfcmVzdWx0
cykgLSBzZXQoZGVkdXBlZF9yZXN1bHRzKQorICAgICAgICAgICAgICAgIHRvX2luc3RhbGwgPSBz
ZXQoZGVkdXBlZF9yZXN1bHRzKSAtIHNldChleGlzdGluZ19yZXN1bHRzKQorICAgICAgICAgICAg
ICAgIHNlbGYuX3JlYmFzZWxpbmVzWyh0ZXN0X25hbWUsIHR5cGUpXSA9ICh0b19kZWxldGUsIHRv
X2luc3RhbGwpCisgICAgICAgIHJldHVybiBzZWxmLl9yZWJhc2VsaW5lcworCisgICAgZGVmIGVh
Y2hfZGVsZXRlKHNlbGYpOgorICAgICAgICBmb3IgaywgdiBpbiBzZWxmLmNhbGN1bGF0ZV9yZWJh
c2VsaW5lKCkuaXRlbXMoKToKKyAgICAgICAgICAgIHlpZWxkIHZbMF0KKworICAgIGRlZiBlYWNo
X2luc3RhbGwoc2VsZik6CisgICAgICAgIGZvciBrLCB2IGluIHNlbGYuY2FsY3VsYXRlX3JlYmFz
ZWxpbmUoKS5pdGVtcygpOgorICAgICAgICAgICAgeWllbGQgdlsxXQorCisgICAgZGVmIGRlbGV0
ZXMoc2VsZik6CisgICAgICAgIHRvX2RlbGV0ZSA9IFtdCisgICAgICAgIGZvciBkZWxldGVzIGlu
IHNlbGYuZWFjaF9kZWxldGUoKToKKyAgICAgICAgICAgIHRvX2RlbGV0ZSArPSBkZWxldGVzCisg
ICAgICAgIHJldHVybiB0b19kZWxldGUKKworICAgIGRlZiBpbnN0YWxscyhzZWxmKToKKyAgICAg
ICAgdG9faW5zdGFsbCA9IFtdCisgICAgICAgIGZvciBpbnN0YWxscyBpbiBzZWxmLmVhY2hfaW5z
dGFsbCgpOgorICAgICAgICAgICAgdG9faW5zdGFsbCArPSBpbnN0YWxscworICAgICAgICByZXR1
cm4gdG9faW5zdGFsbAorCisgICAgZGVmIGxvZyhzZWxmLCBtc2cpOgorICAgICAgICBpZiBzZWxm
Ll92ZXJib3NlOgorICAgICAgICAgICAgcHJpbnQgbXNnCisKKyAgICBkZWYgcmViYXNlbGluZShz
ZWxmLCBkcnlfcnVuPUZhbHNlKToKKyAgICAgICAgZm9yIGssIHYgaW4gc2VsZi5jYWxjdWxhdGVf
cmViYXNlbGluZSgpLml0ZW1zKCk6CisgICAgICAgICAgICBzZWxmLmxvZygicmViYXNlbGluaW5n
ICglcywgJXMpIiAlIGspCisgICAgICAgICAgICB0b19kZWxldGUsIHRvX2luc3RhbGwgPSB2CisK
KyAgICAgICAgICAgIGZvciByIGluIHRvX2RlbGV0ZToKKyAgICAgICAgICAgICAgICBpZiBkcnlf
cnVuOgorICAgICAgICAgICAgICAgICAgICBwcmludCAiZGVsZXRlICVzIiAlIHIKKyAgICAgICAg
ICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICByLmRlbGV0ZSgpCisKKyAgICAgICAg
ICAgIGZvciByIGluIHRvX2luc3RhbGw6CisgICAgICAgICAgICAgICAgaWYgZHJ5X3J1bjoKKyAg
ICAgICAgICAgICAgICAgICAgcHJpbnQgImluc3RhbGwgJXMiICUgcgorICAgICAgICAgICAgICAg
IGVsc2U6CisgICAgICAgICAgICAgICAgICAgIHIuaW5zdGFsbChzZWxmLl9sYXlvdXRfdGVzdHNf
ZGlyKQpkaWZmIC0tZ2l0IGEvV2ViS2l0VG9vbHMvU2NyaXB0cy93ZWJraXRweS90b29sL2NvbW1h
bmRzL3JlYmFzZWxpbmUyL3JlYmFzZWxpbmVyX3VuaXR0ZXN0LnB5IGIvV2ViS2l0VG9vbHMvU2Ny
aXB0cy93ZWJraXRweS90b29sL2NvbW1hbmRzL3JlYmFzZWxpbmUyL3JlYmFzZWxpbmVyX3VuaXR0
ZXN0LnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAuLmM3ZjY4NmRkOGNmZjdhZDlmM2IyNTYyOWE1ODQwZjk4ZWM3NmZh
NjMKLS0tIC9kZXYvbnVsbAorKysgYi9XZWJLaXRUb29scy9TY3JpcHRzL3dlYmtpdHB5L3Rvb2wv
Y29tbWFuZHMvcmViYXNlbGluZTIvcmViYXNlbGluZXJfdW5pdHRlc3QucHkKQEAgLTAsMCArMSw3
NyBAQAorIyEvdXNyL2Jpbi9lbnYgcHl0aG9uCisjIENvcHlyaWdodCAoQykgMjAxMCBHb29nbGUg
SW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorIworIyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGlu
IHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyMgbW9kaWZpY2F0aW9u
LCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisj
IGFyZSBtZXQ6CisjCisjIDEuICBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCBy
ZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorIyAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29u
ZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorIyAyLiAgUmVkaXN0cmlidXRp
b25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyMg
ICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlz
Y2xhaW1lciBpbiB0aGUKKyMgICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFs
cyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisjCisjIFRISVMgU09GVFdBUkUgSVMg
UFJPVklERUQgQlkgQVBQTEUgQU5EIElUUyBDT05UUklCVVRPUlMgIkFTIElTIiBBTkQgQU5ZCisj
IEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRF
RCBUTywgVEhFIElNUExJRUQKKyMgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJ
VE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQorIyBESVNDTEFJTUVELiBJTiBOTyBF
VkVOVCBTSEFMTCBBUFBMRSBPUiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZCisj
IERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09O
U0VRVUVOVElBTCBEQU1BR0VTCisjIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJP
Q1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyMgTE9TUyBPRiBVU0Us
IERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVT
RUQgQU5ECisjIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNU
LCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisjIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBP
VEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorIyBUSElTIFNP
RlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdF
LgorCitpbXBvcnQgdW5pdHRlc3QKK2Zyb20gd2Via2l0cHkuY29tbW9uLm5ldC5yZXN1bHRzZXQg
aW1wb3J0IFJlc3VsdFNldAorZnJvbSB3ZWJraXRweS5jb21tb24ubmV0LnJlc3VsdHNldF91bml0
dGVzdCBpbXBvcnQgRmFrZVppcAorZnJvbSByZWJhc2VsaW5lciBpbXBvcnQgUmViYXNlbGluZXIK
KworCitjbGFzcyBSZWJhc2VsaW5lclRlc3QodW5pdHRlc3QuVGVzdENhc2UpOgorICAgIGRlZiBh
c3NlcnRIYXNJbnN0YWxsc0ZvcihzZWxmLCBwbGF0Zm9ybXMsIHJlYmFzZWxpbmVyKToKKyAgICAg
ICAgaW5zdGFsbF9wbGF0Zm9ybXMgPSBzZXQobWFwKGxhbWJkYSByOiByLnBsYXRmb3JtKCksIHJl
YmFzZWxpbmVyLmluc3RhbGxzKCkpKQorICAgICAgICBwbGF0Zm9ybXMgPSBzZXQocGxhdGZvcm1z
KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhwbGF0Zm9ybXMsIGluc3RhbGxfcGxhdGZvcm1z
KQorCisgICAgZGVmIGFzc2VydEhhc0RlbGV0ZXNGb3Ioc2VsZiwgcGxhdGZvcm1zLCByZWJhc2Vs
aW5lcik6CisgICAgICAgIGluc3RhbGxfcGxhdGZvcm1zID0gc2V0KG1hcChsYW1iZGEgcjogci5w
bGF0Zm9ybSgpLCByZWJhc2VsaW5lci5kZWxldGVzKCkpKQorICAgICAgICBwbGF0Zm9ybXMgPSBz
ZXQocGxhdGZvcm1zKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhwbGF0Zm9ybXMsIGluc3Rh
bGxfcGxhdGZvcm1zKQorCisgICAgZGVmIHRlc3RMaW5lcyhzZWxmKToKKyAgICAgICAgbWFjX3pp
cCA9IEZha2VaaXAoKQorICAgICAgICBtYWNfemlwLmluc2VydCgnc29tZS10ZXN0LWV4cGVjdGVk
LnR4dCcsICdtYWMnKQorCisgICAgICAgIG1hY19sZW9wYXJkX3ppcCA9IEZha2VaaXAoKQorICAg
ICAgICBtYWNfbGVvcGFyZF96aXAuaW5zZXJ0KCdzb21lLXRlc3QtZXhwZWN0ZWQudHh0JywgJ21h
YycpCisKKyAgICAgICAgb3RoZXJfemlwID0gRmFrZVppcCgpCisgICAgICAgIG90aGVyX3ppcC5p
bnNlcnQoJ3NvbWUtdGVzdC1leHBlY3RlZC50eHQnLCAnb3RoZXInKQorCisgICAgICAgIG90aGVy
Ml96aXAgPSBGYWtlWmlwKCkKKyAgICAgICAgb3RoZXIyX3ppcC5pbnNlcnQoJ3NvbWUtdGVzdC1l
eHBlY3RlZC50eHQnLCAnb3RoZXIyJykKKworICAgICAgICBsb2NhbF96aXAgPSBGYWtlWmlwKCkK
KyAgICAgICAgbG9jYWxfemlwLmluc2VydCgnc29tZS10ZXN0LWV4cGVjdGVkLnR4dCcsICdsb2Nh
bCcpCisKKyAgICAgICAgemlwX21hcCA9IHt9CisgICAgICAgIHppcF9tYXBbJ21hYyddID0gbWFj
X3ppcAorICAgICAgICB6aXBfbWFwWydtYWMtbGVvcGFyZCddID0gbWFjX2xlb3BhcmRfemlwCisg
ICAgICAgIHppcF9tYXBbJ290aGVyJ10gPSBvdGhlcl96aXAKKyAgICAgICAgemlwX21hcFsnb3Ro
ZXIyJ10gPSBvdGhlcjJfemlwCisKKyAgICAgICAgcmVtb3RlX3Jlc3VsdHMgPSBSZXN1bHRTZXQu
ZnJvbV96aXBfbWFwKHppcF9tYXApCisgICAgICAgIGxvY2FsX3Jlc3VsdHMgPSBSZXN1bHRTZXQu
ZnJvbV96aXAoTm9uZSwgbG9jYWxfemlwKQorCisgICAgICAgIGxpbmVzID0gW10KKyAgICAgICAg
bGluZXMuYXBwZW5kKFsnbWFjLWxlb3BhcmQnLCAnbWFjJywgTm9uZV0pCisgICAgICAgIGxpbmVz
LmFwcGVuZChbJ290aGVyJywgJ21hYycsICdvdGhlcjInLCBOb25lXSkKKyAgICAgICAgciA9IFJl
YmFzZWxpbmVyKFsnc29tZS10ZXN0J10sIGxvY2FsX3Jlc3VsdHMsIHJlbW90ZV9yZXN1bHRzLCBs
aW5lcywgJ0xheW91dFRlc3RzJywgdmVyYm9zZT1GYWxzZSkKKworICAgICAgICBzZWxmLmFzc2Vy
dEhhc0luc3RhbGxzRm9yKFsnbWFjJywgJ290aGVyJywgJ290aGVyMiddLCByKQorICAgICAgICBz
ZWxmLmFzc2VydEhhc0RlbGV0ZXNGb3IoW10sIHIpCisKKworaWYgX19uYW1lX18gPT0gJ19fbWFp
bl9fJzoKKyAgICB1bml0dGVzdC5tYWluKCkK
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>75872</attachid>
            <date>2010-12-07 22:25:42 -0800</date>
            <delta_ts>2010-12-09 14:01:00 -0800</delta_ts>
            <desc>Patch</desc>
            <filename>bug-50098-20101208172538.patch</filename>
            <type>text/plain</type>
            <size>76264</size>
            <attacher name="James Kozianski">koz</attacher>
            
              <data encoding="base64">ZGlmZiAtLWdpdCBhL1dlYktpdFRvb2xzL0NoYW5nZUxvZyBiL1dlYktpdFRvb2xzL0NoYW5nZUxv
ZwppbmRleCA5Y2FiYzA4YjIyZjc3NGI0NzIxMmNmNzAyYmE5ZGMwNTBiNTA4MGQzLi5mZjVkODUy
YzBlNWE3ZjQ3MzMzZDhkNjg3ZmY3ODA2MzU2NjU1ZDU4IDEwMDY0NAotLS0gYS9XZWJLaXRUb29s
cy9DaGFuZ2VMb2cKKysrIGIvV2ViS2l0VG9vbHMvQ2hhbmdlTG9nCkBAIC0xLDMgKzEsMjkgQEAK
KzIwMTAtMTItMDcgIEphbWVzIEtvemlhbnNraSAgPGtvekBjaHJvbWl1bS5vcmc+CisKKyAgICAg
ICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChPT1BTISkuCisKKyAgICAgICAgTmV3IHdlYmtpdC1wYXRj
aCByZWJhc2VsaW5lMiBjb21tYW5kLgorICAgICAgICBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9z
aG93X2J1Zy5jZ2k/aWQ9NTAwOTgKKworICAgICAgICAqIFNjcmlwdHMvd2Via2l0cHkvY29tbW9u
L2RpcmFzemlwLnB5OiBBZGRlZC4KKyAgICAgICAgKiBTY3JpcHRzL3dlYmtpdHB5L2NvbW1vbi9u
ZXQvYnVpbGRib3QucHk6CisgICAgICAgICogU2NyaXB0cy93ZWJraXRweS9jb21tb24vbmV0L3Jl
bW90ZXppcC5weTogQWRkZWQuCisgICAgICAgICogU2NyaXB0cy93ZWJraXRweS9jb21tb24vbmV0
L3Jlc3VsdC5weTogQWRkZWQuCisgICAgICAgICogU2NyaXB0cy93ZWJraXRweS9jb21tb24vbmV0
L3Jlc3VsdF91bml0dGVzdC5weTogQWRkZWQuCisgICAgICAgICogU2NyaXB0cy93ZWJraXRweS9j
b21tb24vbmV0L3Jlc3VsdHNldC5weTogQWRkZWQuCisgICAgICAgICogU2NyaXB0cy93ZWJraXRw
eS9jb21tb24vbmV0L3Jlc3VsdHNldF91bml0dGVzdC5weTogQWRkZWQuCisgICAgICAgICogU2Ny
aXB0cy93ZWJraXRweS9jb21tb24vc3lzdGVtL2ZpbGVzeXN0ZW0ucHk6CisgICAgICAgICogU2Ny
aXB0cy93ZWJraXRweS9sYXlvdXRfdGVzdHMvcG9ydC9iYXNlLnB5OgorICAgICAgICAqIFNjcmlw
dHMvd2Via2l0cHkvbGF5b3V0X3Rlc3RzL3BvcnQvY2hyb21pdW0ucHk6CisgICAgICAgICogU2Ny
aXB0cy93ZWJraXRweS9sYXlvdXRfdGVzdHMvcG9ydC93ZWJraXQucHk6CisgICAgICAgICogU2Ny
aXB0cy93ZWJraXRweS90b29sL2NvbW1hbmRzL19faW5pdF9fLnB5OgorICAgICAgICAqIFNjcmlw
dHMvd2Via2l0cHkvdG9vbC9jb21tYW5kcy9yZWJhc2VsaW5lMi9fX2luaXRfXy5weTogQWRkZWQu
CisgICAgICAgICogU2NyaXB0cy93ZWJraXRweS90b29sL2NvbW1hbmRzL3JlYmFzZWxpbmUyL2J1
Y2tldC5weTogQWRkZWQuCisgICAgICAgICogU2NyaXB0cy93ZWJraXRweS90b29sL2NvbW1hbmRz
L3JlYmFzZWxpbmUyL2J1Y2tldF91bml0dGVzdC5weTogQWRkZWQuCisgICAgICAgICogU2NyaXB0
cy93ZWJraXRweS90b29sL2NvbW1hbmRzL3JlYmFzZWxpbmUyL3JlYmFzZWxpbmUyLnB5OiBBZGRl
ZC4KKyAgICAgICAgKiBTY3JpcHRzL3dlYmtpdHB5L3Rvb2wvY29tbWFuZHMvcmViYXNlbGluZTIv
cmViYXNlbGluZXIucHk6IEFkZGVkLgorICAgICAgICAqIFNjcmlwdHMvd2Via2l0cHkvdG9vbC9j
b21tYW5kcy9yZWJhc2VsaW5lMi9yZWJhc2VsaW5lcl91bml0dGVzdC5weTogQWRkZWQuCisKIDIw
MTAtMTItMDcgIFRvbnkgQ2hhbmcgIDx0b255QGNocm9taXVtLm9yZz4KIAogICAgICAgICBSZXZp
ZXdlZCBieSBPamFuIFZhZmFpLgpkaWZmIC0tZ2l0IGEvV2ViS2l0VG9vbHMvU2NyaXB0cy93ZWJr
aXRweS9jb21tb24vZGlyYXN6aXAucHkgYi9XZWJLaXRUb29scy9TY3JpcHRzL3dlYmtpdHB5L2Nv
bW1vbi9kaXJhc3ppcC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwLi4xZDZhYjgwOTk3NTYyNDBhZjY5MjlkODI3YjYx
NDhmOGY2ODBiZDE4Ci0tLSAvZGV2L251bGwKKysrIGIvV2ViS2l0VG9vbHMvU2NyaXB0cy93ZWJr
aXRweS9jb21tb24vZGlyYXN6aXAucHkKQEAgLTAsMCArMSw2NiBAQAorIyEvdXNyL2Jpbi9lbnYg
cHl0aG9uCisjIENvcHlyaWdodCAoQykgMjAxMCBHb29nbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2Vy
dmVkLgorIworIyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZv
cm1zLCB3aXRoIG9yIHdpdGhvdXQKKyMgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3Zp
ZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisjIGFyZSBtZXQ6CisjCisjIDEuICBS
ZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHly
aWdodAorIyAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxv
d2luZyBkaXNjbGFpbWVyLgorIyAyLiAgUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11
c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyMgICAgIG5vdGljZSwgdGhpcyBsaXN0
IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyMgICAg
IGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBk
aXN0cmlidXRpb24uCisjCisjIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgQU5E
IElUUyBDT05UUklCVVRPUlMgIkFTIElTIiBBTkQgQU5ZCisjIEVYUFJFU1MgT1IgSU1QTElFRCBX
QVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQKKyMg
V0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxB
UiBQVVJQT1NFIEFSRQorIyBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBPUiBJ
VFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZCisjIERJUkVDVCwgSU5ESVJFQ1QsIElO
Q0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCisj
IChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVU
RSBHT09EUyBPUiBTRVJWSUNFUzsKKyMgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9S
IEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECisjIE9OIEFOWSBUSEVP
UlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBP
UiBUT1JUCisjIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4g
QU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorIyBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklT
RUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCitmcm9tIF9fZnV0dXJlX18g
aW1wb3J0IHdpdGhfc3RhdGVtZW50Citmcm9tIHdlYmtpdHB5LmNvbW1vbi5uZXQucmVtb3Rlemlw
IGltcG9ydCBaaXBGaWxlSGFuZGxlCitmcm9tIHdlYmtpdHB5LmNvbW1vbi5zeXN0ZW0uZmlsZXN5
c3RlbSBpbXBvcnQgRmlsZVN5c3RlbQoraW1wb3J0IG9zCitpbXBvcnQgc2h1dGlsCisKKworY2xh
c3MgRGlyZWN0b3J5QXNaaXAob2JqZWN0KToKKyAgICAiIiJQcm92aWRlcyBhIHppcGZpbGUtbGlr
ZSBpbnRlcmZhY2UgdG8gYSBsb2NhbCBkaXJlY3RvcnkiIiIKKyAgICBkZWYgX19pbml0X18oc2Vs
ZiwgcGF0aCwgZnM9RmlsZVN5c3RlbSgpKToKKyAgICAgICAgc2VsZi5fcGF0aCA9IHBhdGgKKyAg
ICAgICAgc2VsZi5fZnMgPSBmcworICAgICAgICBpZiBub3Qgc2VsZi5fcGF0aC5lbmRzd2l0aChv
cy5wYXRoLnNlcCk6CisgICAgICAgICAgICBzZWxmLl9wYXRoICs9IG9zLnBhdGguc2VwCisKKyAg
ICBkZWYgaGFuZGxlX3RvKHNlbGYsIGZpbGVuYW1lKToKKyAgICAgICAgcmV0dXJuIFppcEZpbGVI
YW5kbGUoc2VsZiwgZmlsZW5hbWUpCisKKyAgICBkZWYgbmFtZWxpc3Qoc2VsZik6CisgICAgICAg
IHJlc3VsdHMgPSBbXQorICAgICAgICBmb3IgKHBhdGgsIF8sIGZpbGVuYW1lcykgaW4gb3Mud2Fs
ayhzZWxmLl9wYXRoKToKKyAgICAgICAgICAgIGZvciBmaWxlbmFtZSBpbiBmaWxlbmFtZXM6Cisg
ICAgICAgICAgICAgICAgIyBXZSBkcm9wIHRoZSBwYXRoIHRvIHRoZSBkaXJlY3RvcnkgZnJvbSBv
dXIgbmFtZWxpc3QuCisgICAgICAgICAgICAgICAgcmVzdWx0cy5hcHBlbmQob3MucGF0aC5qb2lu
KHBhdGgsIGZpbGVuYW1lKVtsZW4oc2VsZi5fcGF0aCk6XSkKKyAgICAgICAgcmV0dXJuIHJlc3Vs
dHMKKworICAgIGRlZiByZWFkKHNlbGYsIGZpbGVuYW1lKToKKyAgICAgICAgcmV0dXJuIHNlbGYu
X2ZzLnJlYWRfdGV4dF9maWxlKG9zLnBhdGguam9pbihzZWxmLl9wYXRoLCBmaWxlbmFtZSkpCisK
KyAgICBkZWYgZXh0cmFjdChzZWxmLCBmaWxlbmFtZSwgcGF0aCk6CisgICAgICAgIHNyYyA9IG9z
LnBhdGguam9pbihzZWxmLl9wYXRoLCBmaWxlbmFtZSkKKyAgICAgICAgZGVzdCA9IG9zLnBhdGgu
am9pbihwYXRoLCBmaWxlbmFtZSkKKyAgICAgICAgIyBBcyBmaWxlbmFtZSBtYXkgaGF2ZSBzbGFz
aGVzIGluIGl0LCB3ZSBtdXN0IGVuc3VyZSB0aGF0IHRoZSBjb3JyZWN0CisgICAgICAgICMgZGly
ZWN0b3J5IGhlaXJhcmNoeSBleGlzdHMgd2hlbiB3ZSBhcmUgY29weWluZyBpdCB0byB0aGUgb3V0
cHV0LgorICAgICAgICBwYXRoX3RvX2ZpbGUgPSBvcy5wYXRoLnNwbGl0KGZpbGVuYW1lKVswXQor
ICAgICAgICBzZWxmLl9mcy5tYXliZV9tYWtlX2RpcmVjdG9yeShwYXRoLCBwYXRoX3RvX2ZpbGUp
CisgICAgICAgIHNlbGYuX2ZzLmNvcHlmaWxlKHNyYywgZGVzdCkKKworICAgIGRlZiBkZWxldGUo
c2VsZiwgZmlsZW5hbWUpOgorICAgICAgICBmaWxlbmFtZSA9IG9zLnBhdGguam9pbihzZWxmLl9w
YXRoLCBmaWxlbmFtZSkKKyAgICAgICAgYXNzZXJ0ICcuLicgbm90IGluIGZpbGVuYW1lCisgICAg
ICAgIHNlbGYuX2ZzLnJlbW92ZShmaWxlbmFtZSkKZGlmZiAtLWdpdCBhL1dlYktpdFRvb2xzL1Nj
cmlwdHMvd2Via2l0cHkvY29tbW9uL25ldC9idWlsZGJvdC5weSBiL1dlYktpdFRvb2xzL1Njcmlw
dHMvd2Via2l0cHkvY29tbW9uL25ldC9idWlsZGJvdC5weQppbmRleCA4OGNkZDRlMjgwMjU1YzQ5
ZWZmODYyNGUyZjIxODNkYWE2NDJiMWE4Li5lYThiMjU2ZTY2ZTkxMzBmMGU5ZjcxZDg5MzRiZDI5
OWMwNWY2MzM0IDEwMDY0NAotLS0gYS9XZWJLaXRUb29scy9TY3JpcHRzL3dlYmtpdHB5L2NvbW1v
bi9uZXQvYnVpbGRib3QucHkKKysrIGIvV2ViS2l0VG9vbHMvU2NyaXB0cy93ZWJraXRweS9jb21t
b24vbmV0L2J1aWxkYm90LnB5CkBAIC0zNyw2ICszNyw4IEBAIGltcG9ydCB4bWxycGNsaWIKIGZy
b20gd2Via2l0cHkuY29tbW9uLm5ldC5mYWlsdXJlbWFwIGltcG9ydCBGYWlsdXJlTWFwCiBmcm9t
IHdlYmtpdHB5LmNvbW1vbi5uZXQubGF5b3V0dGVzdHJlc3VsdHMgaW1wb3J0IExheW91dFRlc3RS
ZXN1bHRzCiBmcm9tIHdlYmtpdHB5LmNvbW1vbi5uZXQucmVncmVzc2lvbndpbmRvdyBpbXBvcnQg
UmVncmVzc2lvbldpbmRvdworZnJvbSB3ZWJraXRweS5jb21tb24ubmV0LnJlbW90ZXppcCBpbXBv
cnQgUmVtb3RlWmlwCitmcm9tIHdlYmtpdHB5LmNvbW1vbi5uZXQucmVzdWx0c2V0IGltcG9ydCBS
ZXN1bHRTZXQKIGZyb20gd2Via2l0cHkuY29tbW9uLnN5c3RlbS5sb2d1dGlscyBpbXBvcnQgZ2V0
X2xvZ2dlcgogZnJvbSB3ZWJraXRweS50aGlyZHBhcnR5LmF1dG9pbnN0YWxsZWQubWVjaGFuaXpl
IGltcG9ydCBCcm93c2VyCiBmcm9tIHdlYmtpdHB5LnRoaXJkcGFydHkuQmVhdXRpZnVsU291cCBp
bXBvcnQgQmVhdXRpZnVsU291cApAQCAtODcsNiArODksMTIgQEAgY2xhc3MgQnVpbGRlcihvYmpl
Y3QpOgogICAgICAgICBzZWxmLl9idWlsZHNfY2FjaGVbYnVpbGRfbnVtYmVyXSA9IGJ1aWxkCiAg
ICAgICAgIHJldHVybiBidWlsZAogCisgICAgZGVmIGxhdGVzdF9idWlsZChzZWxmKToKKyAgICAg
ICAgcmV2aXNpb25fYnVpbGRfcGFpcnMgPSBzZWxmLnJldmlzaW9uX2J1aWxkX3BhaXJzX3dpdGhf
cmVzdWx0cygpCisgICAgICAgIHJldmlzaW9uX2J1aWxkX3BhaXJzLnNvcnQoa2V5PWxhbWJkYSBp
OiBpWzFdKQorICAgICAgICBsYXRlc3RfYnVpbGRfbnVtYmVyID0gcmV2aXNpb25fYnVpbGRfcGFp
cnNbLTFdWzFdCisgICAgICAgIHJldHVybiBzZWxmLmJ1aWxkKGxhdGVzdF9idWlsZF9udW1iZXIp
CisKICAgICBkZWYgZm9yY2VfYnVpbGQoc2VsZiwgdXNlcm5hbWU9IndlYmtpdC1wYXRjaCIsIGNv
bW1lbnRzPU5vbmUpOgogICAgICAgICBkZWYgcHJlZGljYXRlKGZvcm0pOgogICAgICAgICAgICAg
dHJ5OgpAQCAtMjE2LDYgKzIyNCwxMiBAQCBjbGFzcyBCdWlsZChvYmplY3QpOgogICAgICAgICBy
ZXN1bHRzX2RpcmVjdG9yeSA9ICJyJXMgKCVzKSIgJSAoc2VsZi5yZXZpc2lvbigpLCBzZWxmLl9u
dW1iZXIpCiAgICAgICAgIHJldHVybiAiJXMvJXMiICUgKHNlbGYuX2J1aWxkZXIucmVzdWx0c191
cmwoKSwgdXJsbGliLnF1b3RlKHJlc3VsdHNfZGlyZWN0b3J5KSkKIAorICAgIGRlZiByZXN1bHRz
X3ppcF91cmwoc2VsZik6CisgICAgICAgIHJldHVybiAiJXMuemlwIiAlIHNlbGYucmVzdWx0c191
cmwoKQorCisgICAgZGVmIHJlc3VsdHMoc2VsZik6CisgICAgICAgIHJldHVybiBSZXN1bHRTZXQo
c2VsZi5fYnVpbGRlci5uYW1lKCksIE5vbmUsIFJlbW90ZVppcChzZWxmLnJlc3VsdHNfemlwX3Vy
bCgpKSwgaW5jbHVkZV9leHBlY3RlZD1GYWxzZSkKKwogICAgIGRlZiBfZmV0Y2hfcmVzdWx0c19o
dG1sKHNlbGYpOgogICAgICAgICByZXN1bHRzX2h0bWwgPSAiJXMvcmVzdWx0cy5odG1sIiAlIChz
ZWxmLnJlc3VsdHNfdXJsKCkpCiAgICAgICAgICMgRklYTUU6IFRoaXMgc2hvdWxkIHVzZSBOZXR3
b3JrVHJhbnNhY3Rpb24ncyA0MDQgaGFuZGxpbmcgaW5zdGVhZC4KZGlmZiAtLWdpdCBhL1dlYktp
dFRvb2xzL1NjcmlwdHMvd2Via2l0cHkvY29tbW9uL25ldC9yZW1vdGV6aXAucHkgYi9XZWJLaXRU
b29scy9TY3JpcHRzL3dlYmtpdHB5L2NvbW1vbi9uZXQvcmVtb3RlemlwLnB5Cm5ldyBmaWxlIG1v
ZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAu
LjM0ZTRmZDEwMzU3ZjMzODU5MzI3ZDVjZTVlMjRmMTUwMzQ5ZjhhNDIKLS0tIC9kZXYvbnVsbAor
KysgYi9XZWJLaXRUb29scy9TY3JpcHRzL3dlYmtpdHB5L2NvbW1vbi9uZXQvcmVtb3RlemlwLnB5
CkBAIC0wLDAgKzEsOTcgQEAKKyMhL3Vzci9iaW4vZW52IHB5dGhvbgorIyBDb3B5cmlnaHQgKEMp
IDIwMTAgR29vZ2xlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyMKKyMgUmVkaXN0cmlidXRp
b24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Cisj
IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcg
Y29uZGl0aW9ucworIyBhcmUgbWV0OgorIworIyAxLiAgUmVkaXN0cmlidXRpb25zIG9mIHNvdXJj
ZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyMgICAgIG5vdGljZSwgdGhp
cyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyMgMi4g
IFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUg
Y29weXJpZ2h0CisjICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUg
Zm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisjICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBv
dGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorIworIyBUSElT
IFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIEFORCBJVFMgQ09OVFJJQlVUT1JTICJBUyBJ
UyIgQU5EIEFOWQorIyBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBC
VVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVECisjIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRB
QklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKKyMgRElTQ0xB
SU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgT1IgSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFC
TEUgRk9SIEFOWQorIyBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVN
UExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUworIyAoSU5DTFVESU5HLCBCVVQgTk9UIExJ
TUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7Cisj
IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04p
IEhPV0VWRVIgQ0FVU0VEIEFORAorIyBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhF
UiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorIyAoSU5DTFVESU5HIE5F
R0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0Ug
T0YKKyMgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBP
RiBTVUNIIERBTUFHRS4KKworZnJvbSB3ZWJraXRweS5jb21tb24ubmV0Lm5ldHdvcmt0cmFuc2Fj
dGlvbiBpbXBvcnQgTmV0d29ya1RyYW5zYWN0aW9uCitpbXBvcnQgb3MKK2ltcG9ydCBzaHV0aWwK
K2ltcG9ydCB0ZW1wZmlsZQoraW1wb3J0IHVybGxpYgoraW1wb3J0IHppcGZpbGUKKworCitjbGFz
cyBSZW1vdGVaaXAob2JqZWN0KToKKyAgICAiIiJBIHppcCBmaWxlIHRoYXQgcmVzaWRlcyBhdCBh
IFVSTCAobG9jYWwgb3IgcmVtb3RlKSIiIgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCB6aXBfdXJs
KToKKyAgICAgICAgc2VsZi5femlwX3VybCA9IHppcF91cmwKKyAgICAgICAgc2VsZi5femlwX2Zp
bGUgPSBOb25lCisKKyAgICBkZWYgX2xvYWQoc2VsZik6CisgICAgICAgIGlmIHNlbGYuX3ppcF9m
aWxlIGlzIE5vbmU6CisgICAgICAgICAgICB0ZW1wX2ZpbGUgPSBOZXR3b3JrVHJhbnNhY3Rpb24o
KS5ydW4obGFtYmRhOiB1cmxsaWIudXJscmV0cmlldmUoc2VsZi5femlwX3VybClbMF0pCisgICAg
ICAgICAgICBzZWxmLl96aXBfZmlsZSA9IHppcGZpbGUuWmlwRmlsZSh0ZW1wX2ZpbGUpCisKKyAg
ICBkZWYgaGFuZGxlX3RvKHNlbGYsIGZpbGVuYW1lKToKKyAgICAgICAgcmV0dXJuIFppcEZpbGVI
YW5kbGUoc2VsZiwgZmlsZW5hbWUpCisKKyAgICBkZWYgbmFtZWxpc3Qoc2VsZik6CisgICAgICAg
IHNlbGYuX2xvYWQoKQorICAgICAgICByZXR1cm4gc2VsZi5femlwX2ZpbGUubmFtZWxpc3QoKQor
CisgICAgZGVmIHJlYWQoc2VsZiwgZmlsZW5hbWUpOgorICAgICAgICBzZWxmLl9sb2FkKCkKKyAg
ICAgICAgcmV0dXJuIHNlbGYuX3ppcF9maWxlLnJlYWQoZmlsZW5hbWUpCisKKyAgICBkZWYgZXh0
cmFjdChzZWxmLCBmaWxlbmFtZSwgcGF0aCk6CisgICAgICAgIHNlbGYuX2xvYWQoKQorICAgICAg
ICByZXR1cm4gc2VsZi5femlwX2ZpbGUuZXh0cmFjdChmaWxlbmFtZSwgcGF0aCkKKworICAgIGRl
ZiBkZWxldGUoc2VsZiwgZmlsZW5hbWUpOgorICAgICAgICByYWlzZSBFeGNlcHRpb24oIkNhbid0
IGRlbGV0ZSBmcm9tIGEgUmVtb3RlWmlwLiIpCisKKworY2xhc3MgWmlwRmlsZUhhbmRsZToKKyAg
ICAiIiJQb2ludHMgdG8gYSBmaWxlIHRoYXQgcmVzaWRlcyBpbiBhIFJlbW90ZVppcCIiIgorICAg
IGRlZiBfX2luaXRfXyhzZWxmLCB6aXBfZmlsZSwgZmlsZW5hbWUpOgorICAgICAgICBzZWxmLl9m
aWxlbmFtZSA9IGZpbGVuYW1lCisgICAgICAgIHNlbGYuX3ppcF9maWxlID0gemlwX2ZpbGUKKyAg
ICAgICAgc2VsZi5fY29udGVudHMgPSBOb25lCisKKyAgICBkZWYgX19zdHJfXyhzZWxmKToKKyAg
ICAgICAgcmV0dXJuICIlczolcyIgJSAoc2VsZi5femlwX2ZpbGUsIHNlbGYuX2ZpbGVuYW1lKQor
CisgICAgZGVmIGNvbnRlbnRzKHNlbGYpOgorICAgICAgICBpZiBzZWxmLl9jb250ZW50cyBpcyBO
b25lOgorICAgICAgICAgICAgc2VsZi5fY29udGVudHMgPSBzZWxmLl96aXBfZmlsZS5yZWFkKHNl
bGYuX2ZpbGVuYW1lKQorICAgICAgICByZXR1cm4gc2VsZi5fY29udGVudHMKKworICAgIGRlZiBz
YXZlX3RvKHNlbGYsIHBhdGgsIGZpbGVuYW1lPU5vbmUpOgorICAgICAgICBpZiBmaWxlbmFtZSBp
cyBOb25lOgorICAgICAgICAgICAgc2VsZi5femlwX2ZpbGUuZXh0cmFjdChzZWxmLl9maWxlbmFt
ZSwgcGF0aCkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHRlbXBfZGlyID0gdGVtcGZpbGUu
bWtkdGVtcCgpCisgICAgICAgICAgICBzZWxmLl96aXBfZmlsZS5leHRyYWN0KHNlbGYuX2ZpbGVu
YW1lLCB0ZW1wX2RpcikKKworICAgICAgICAgICAgc3JjID0gb3MucGF0aC5qb2luKHRlbXBfZGly
LCBzZWxmLl9maWxlbmFtZSkKKyAgICAgICAgICAgIGRlc3QgPSBvcy5wYXRoLmpvaW4ocGF0aCwg
ZmlsZW5hbWUpCisgICAgICAgICAgICBzaHV0aWwuY29weWZpbGUoc3JjLCBkZXN0KQorICAgICAg
ICAgICAgc2h1dGlsLnJtdHJlZSh0ZW1wX2RpcikKKworICAgIGRlZiBkZWxldGUoc2VsZik6Cisg
ICAgICAgIHNlbGYuX3ppcF9maWxlLmRlbGV0ZShzZWxmLl9maWxlbmFtZSkKKworICAgIGRlZiBu
YW1lKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5fZmlsZW5hbWUKKworICAgIGRlZiBzcGxp
dGV4dChzZWxmKToKKyAgICAgICAgcmV0dXJuIG9zLnBhdGguc3BsaXRleHQoc2VsZi5uYW1lKCkp
CmRpZmYgLS1naXQgYS9XZWJLaXRUb29scy9TY3JpcHRzL3dlYmtpdHB5L2NvbW1vbi9uZXQvcmVz
dWx0LnB5IGIvV2ViS2l0VG9vbHMvU2NyaXB0cy93ZWJraXRweS9jb21tb24vbmV0L3Jlc3VsdC5w
eQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwLi44N2UxNmIwMjJhZGU1MmQ3NmQ3Yzc0NzUwZmY1YjY5ZGZmNTY3NWE3Ci0t
LSAvZGV2L251bGwKKysrIGIvV2ViS2l0VG9vbHMvU2NyaXB0cy93ZWJraXRweS9jb21tb24vbmV0
L3Jlc3VsdC5weQpAQCAtMCwwICsxLDE2NyBAQAorIyEvdXNyL2Jpbi9lbnYgcHl0aG9uCisjIENv
cHlyaWdodCAoQykgMjAxMCBHb29nbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorIworIyBS
ZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9y
IHdpdGhvdXQKKyMgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhl
IGZvbGxvd2luZyBjb25kaXRpb25zCisjIGFyZSBtZXQ6CisjCisjIDEuICBSZWRpc3RyaWJ1dGlv
bnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorIyAgICAg
bm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFp
bWVyLgorIyAyLiAgUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNl
IHRoZSBhYm92ZSBjb3B5cmlnaHQKKyMgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlv
bnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyMgICAgIGRvY3VtZW50YXRp
b24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24u
CisjCisjIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgQU5EIElUUyBDT05UUklC
VVRPUlMgIkFTIElTIiBBTkQgQU5ZCisjIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJ
TkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQKKyMgV0FSUkFOVElFUyBP
RiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFS
RQorIyBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBPUiBJVFMgQ09OVFJJQlVU
T1JTIEJFIExJQUJMRSBGT1IgQU5ZCisjIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQ
RUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCisjIChJTkNMVURJTkcs
IEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBT
RVJWSUNFUzsKKyMgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElO
VEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECisjIE9OIEFOWSBUSEVPUlkgT0YgTElBQklM
SVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisjIChJ
TkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQg
T0YgVEhFIFVTRSBPRgorIyBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBP
U1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCitpbXBvcnQgb3MKK2ltcG9ydCByZQorCisKK2Ns
YXNzIE5haXZlSW1hZ2VEaWZmZXIob2JqZWN0KToKKyAgICBkZWYgc2FtZV9pbWFnZShzZWxmLCBp
bWcxLCBpbWcyKToKKyAgICAgICAgcmV0dXJuIGltZzEgPT0gaW1nMgorCisKK2NsYXNzIFJlc3Vs
dChvYmplY3QpOgorICAgICIiIlJlcHJlc2VudHMgdGhlIHJlc3VsdCBvZiBhIHNpbmdsZSB0ZXN0
IG9uIGEgc2luZ2xlIHBsYXRmb3JtIiIiCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHBsYXRmb3Jt
LCByZXN1bHRfdHlwZSwgZmlsZXMpOgorICAgICAgICBzZWxmLl9wbGF0Zm9ybSA9IHBsYXRmb3Jt
CisgICAgICAgIHNlbGYuX3Jlc3VsdF90eXBlID0gcmVzdWx0X3R5cGUKKyAgICAgICAgc2VsZi5f
ZmlsZXMgPSBmaWxlcworICAgICAgICBzZWxmLl9tYWluX2ZpbGUgPSBmaWxlc1swXQorICAgICAg
ICBmaWxlbmFtZSA9IHNlbGYuX21haW5fZmlsZS5uYW1lKCkKKyAgICAgICAgc2VsZi5fbmFtZSA9
IHNlbGYuX2V4dHJhY3RfdGVzdF9uYW1lKGZpbGVuYW1lKQorICAgICAgICBzZWxmLl9pc19hY3R1
YWwgPSAnLWFjdHVhbC4nIGluIGZpbGVuYW1lCisKKyAgICAgICAgaWYgc2VsZi5fcGxhdGZvcm0g
aXMgTm9uZToKKyAgICAgICAgICAgIHNlbGYuX3BsYXRmb3JtID0gc2VsZi5fZXh0cmFjdF9wbGF0
Zm9ybShmaWxlbmFtZSkKKworICAgIGRlZiBfZXh0cmFjdF9wbGF0Zm9ybShzZWxmLCBmaWxlbmFt
ZSk6CisgICAgICAgICIiIkNhbGN1bGF0ZXMgdGhlIHBsYXRmb3JtIGZyb20gdGhlIG5hbWUgb2Yg
dGhlIGZpbGUgaWYgaXQgaXNuJ3Qga25vd24gYWxyZWFkeSIiIgorICAgICAgICBwYXRoID0gcmUu
c3BsaXQob3MucGF0aC5zZXAsIGZpbGVuYW1lKQorICAgICAgICBpZiAncGxhdGZvcm0nIGluIHBh
dGg6CisgICAgICAgICAgICByZXR1cm4gcGF0aFtwYXRoLmluZGV4KCdwbGF0Zm9ybScpICsgMV0K
KyAgICAgICAgcmV0dXJuIE5vbmUKKworICAgIGRlZiBfZXh0cmFjdF90ZXN0X25hbWUoc2VsZiwg
ZmlsZW5hbWUpOgorICAgICAgICB0ZXN0X25hbWUgPSBmaWxlbmFtZQorICAgICAgICBwYXRoID0g
cmUuc3BsaXQob3MucGF0aC5zZXAsIHRlc3RfbmFtZSkKKyAgICAgICAgaWYgJ0xheW91dFRlc3Rz
JyBpbiBwYXRoOgorICAgICAgICAgICAgcGF0aCA9IHBhdGhbMSArIHBhdGguaW5kZXgoJ0xheW91
dFRlc3RzJyk6XQorICAgICAgICBpZiAnbGF5b3V0LXRlc3QtcmVzdWx0cycgaW4gcGF0aDoKKyAg
ICAgICAgICAgIHBhdGggPSBwYXRoWzEgKyBwYXRoLmluZGV4KCdsYXlvdXQtdGVzdC1yZXN1bHRz
Jyk6XQorICAgICAgICBpZiAncGxhdGZvcm0nIGluIHBhdGg6CisgICAgICAgICAgICBwYXRoID0g
cGF0aFsyICsgcGF0aC5pbmRleCgncGxhdGZvcm0nKTpdCisKKyAgICAgICAgdGVzdF9uYW1lID0g
cGF0aFstMV0KKyAgICAgICAgdGVzdF9uYW1lID0gcmUuc3ViKCctZXhwZWN0ZWRcLi4qJCcsICcn
LCB0ZXN0X25hbWUpCisgICAgICAgIHRlc3RfbmFtZSA9IHJlLnN1YignLWFjdHVhbFwuLiokJywg
JycsIHRlc3RfbmFtZSkKKyAgICAgICAgcGF0aFstMV0gPSB0ZXN0X25hbWUKKyAgICAgICAgcmV0
dXJuIG9zLnBhdGguc2VwLmpvaW4ocGF0aCkKKworICAgIGRlZiBfc2V0X3Rlc3RfbmFtZShzZWxm
LCBmaWxlbmFtZSk6CisgICAgICAgIHNlbGYuX3Rlc3RfbmFtZSA9IGZpbGVuYW1lCisgICAgICAg
IGlmIG9zLnBhdGguc2VwIGluIGZpbGVuYW1lOgorICAgICAgICAgICAgc2VsZi5fdGVzdF9uYW1l
ID0gZmlsZW5hbWVbOmZpbGVuYW1lLnJpbmRleChvcy5wYXRoLnNlcCldCisKKyAgICBkZWYgY29u
dGVudHMoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLl9tYWluX2ZpbGUuY29udGVudHMoKQor
CisgICAgZGVmIHNhdmVfdG8oc2VsZiwgcGF0aCk6CisgICAgICAgIGZvciBmaWxlIGluIHNlbGYu
X2ZpbGVzOgorICAgICAgICAgICAgZmlsZS5zYXZlX3RvKHBhdGgpCisKKyAgICBkZWYgaXNfYWN0
dWFsKHNlbGYpOgorICAgICAgICAiIiJBcmUgdGhlc2UgcmVzdWx0cyB0aGUgYWN0dWFsIG91dHB1
dCBvZiBhIHRlc3Q/IiIiCisgICAgICAgIHJldHVybiBzZWxmLl9pc19hY3R1YWwKKworICAgIGRl
ZiBuYW1lKHNlbGYpOgorICAgICAgICAiIiJUaGUgbmFtZSBvZiB0aGlzIHRlc3QgKGRvZXNuJ3Qg
aW5jbHVkZSBleHRlbnNpb24pIiIiCisgICAgICAgIHJldHVybiBzZWxmLl9uYW1lCisKKyAgICBk
ZWYgc2FtZV9jb250ZW50KHNlbGYsIG90aGVyKToKKyAgICAgICAgcmV0dXJuIHNlbGYuY29udGVu
dHMoKSA9PSBvdGhlci5jb250ZW50cygpCisKKyAgICBkZWYgX19lcV9fKHNlbGYsIG90aGVyKToK
KyAgICAgICAgcmV0dXJuIG90aGVyICE9IE5vbmUgYW5kIHNlbGYubmFtZSgpID09IG90aGVyLm5h
bWUoKSBhbmQgc2VsZi50eXBlKCkgPT0gb3RoZXIudHlwZSgpIGFuZCBzZWxmLnBsYXRmb3JtKCkg
PT0gb3RoZXIucGxhdGZvcm0oKSBhbmQgc2VsZi5pc19hY3R1YWwoKSA9PSBvdGhlci5pc19hY3R1
YWwoKSBhbmQgc2VsZi5zYW1lX2NvbnRlbnQob3RoZXIpCisKKyAgICBkZWYgX19oYXNoX18oc2Vs
Zik6CisgICAgICAgIHJldHVybiBoYXNoKHN0cihzZWxmLm5hbWUoKSkgKyBzdHIoc2VsZi50eXBl
KCkpICsgc3RyKHNlbGYucGxhdGZvcm0oKSkpCisKKyAgICBkZWYgaXNfbmV3ZXJfdGhhbihzZWxm
LCBvdGhlcik6CisgICAgICAgICIiIidOZXcnIHJlc3VsdHMgYXJlIHRob3NlIGFjdHVhbGx5IGNv
bWluZyBmcm9tIGEgdGVzdC4iIiIKKyAgICAgICAgcmV0dXJuIHNlbGYuaXNfYWN0dWFsKCkgYW5k
IG5vdCBvdGhlci5pc19hY3R1YWwoKQorCisgICAgZGVmIGlzX3JlYmFzZWxpbmVfb2Yoc2VsZiwg
b3RoZXIpOgorICAgICAgICByZXR1cm4gc2VsZi5uYW1lKCkgPT0gb3RoZXIubmFtZSgpIGFuZCBz
ZWxmLnR5cGUoKSA9PSBvdGhlci50eXBlKCkgYW5kIHNlbGYucGxhdGZvcm0oKSA9PSBvdGhlci5w
bGF0Zm9ybSgpIGFuZCBzZWxmLmlzX2FjdHVhbCgpIGFuZCAobm90IG90aGVyLmlzX2FjdHVhbCgp
KQorCisgICAgZGVmIF9fc3RyX18oc2VsZik6CisgICAgICAgIGFjdHVhbF9zdHIgPSAnW0FdICcg
aWYgc2VsZi5pc19hY3R1YWwoKSBlbHNlICcnCisgICAgICAgIHJldHVybiAiUmVzdWx0WyVzLyVz
XSAlcyVzIiAlIChzZWxmLl9wbGF0Zm9ybSwgc2VsZi5fcmVzdWx0X3R5cGUsIGFjdHVhbF9zdHIs
IHNlbGYubmFtZSgpKQorCisgICAgZGVmIHR5cGUoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxm
Ll9yZXN1bHRfdHlwZQorCisgICAgZGVmIHBsYXRmb3JtKHNlbGYpOgorICAgICAgICByZXR1cm4g
c2VsZi5fcGxhdGZvcm0KKworICAgIGRlZiBfaW5zdGFsbF9maWxlKHNlbGYsIGZpbGUsIHBhdGgp
OgorICAgICAgICBpZiBzZWxmLl9wbGF0Zm9ybSBpcyBOb25lOgorICAgICAgICAgICAgcGxhdGZv
cm1fY29tcG9uZW50ID0gIiIKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHBsYXRmb3JtX2Nv
bXBvbmVudCA9ICJwbGF0Zm9ybS8lcy8iICUgc2VsZi5fcGxhdGZvcm0KKyAgICAgICAgZXh0ZW5z
aW9uID0gb3MucGF0aC5zcGxpdGV4dChmaWxlLm5hbWUoKSlbMV0KKyAgICAgICAgcGF0aCA9ICcl
cy8lcycgJSAocGF0aCwgcGxhdGZvcm1fY29tcG9uZW50KQorICAgICAgICBmaWxlbmFtZSA9IHNl
bGYubmFtZSgpICsgJy1leHBlY3RlZCcgKyBleHRlbnNpb24KKyAgICAgICAgZmlsZS5zYXZlX3Rv
KHBhdGgsIGZpbGVuYW1lKQorCisgICAgZGVmIGluc3RhbGwoc2VsZiwgcGF0aCk6CisgICAgICAg
IGZvciBmaWxlIGluIHNlbGYuX2ZpbGVzOgorICAgICAgICAgICAgc2VsZi5faW5zdGFsbF9maWxl
KGZpbGUsIHBhdGgpCisKKyAgICBkZWYgZGVsZXRlKHNlbGYpOgorICAgICAgICBmb3IgZmlsZSBp
biBzZWxmLl9maWxlczoKKyAgICAgICAgICAgIGZpbGUuZGVsZXRlKCkKKworCitjbGFzcyBUZXh0
UmVzdWx0KFJlc3VsdCk6CisgICAgIiIiUmVwcmVzZW50cyBhIHRleHQgcmVzdWx0IG9mIGEgc2lu
Z2xlIHRlc3Qgb24gYSBzaW5nbGUgcGxhdGZvcm0iIiIKKyAgICBkZWYgX19pbml0X18oc2VsZiwg
cGxhdGZvcm0sIHRleHRfZmlsZSk6CisgICAgICAgIHNlbGYuX3RleHRfZmlsZSA9IHRleHRfZmls
ZQorICAgICAgICBSZXN1bHQuX19pbml0X18oc2VsZiwgcGxhdGZvcm0sICd0ZXh0JywgW3RleHRf
ZmlsZV0pCisKKyAgICBkZWYgcmV0YXJnZXQoc2VsZiwgcGxhdGZvcm0pOgorICAgICAgICByZXR1
cm4gVGV4dFJlc3VsdChwbGF0Zm9ybSwgc2VsZi5fdGV4dF9maWxlKQorCisKK2NsYXNzIEltYWdl
UmVzdWx0KFJlc3VsdCk6CisgICAgaW1hZ2VfZGlmZmVyID0gTmFpdmVJbWFnZURpZmZlcigpCisg
ICAgIiIiUmVwcmVzZW50cyBhbiBpbWFnZSByZXN1bHQgb2YgYSBzaW5nbGUgdGVzdCBvbiBhIHNp
bmdsZSBwbGF0Zm9ybSIiIgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBwbGF0Zm9ybSwgaW1hZ2Vf
ZmlsZSwgY2hlY2tzdW1fZmlsZSk6CisgICAgICAgIHNlbGYuX2NoZWNrc3VtX2ZpbGUgPSBjaGVj
a3N1bV9maWxlCisgICAgICAgIHNlbGYuX2ltYWdlX2ZpbGUgPSBpbWFnZV9maWxlCisgICAgICAg
IGZpbGVzID0gZmlsdGVyKGJvb2wsIFtzZWxmLl9jaGVja3N1bV9maWxlLCBzZWxmLl9pbWFnZV9m
aWxlXSkKKyAgICAgICAgUmVzdWx0Ll9faW5pdF9fKHNlbGYsIHBsYXRmb3JtLCAnaW1hZ2UnLCBm
aWxlcykKKworICAgIGRlZiBoYXNfY2hlY2tzdW0oc2VsZik6CisgICAgICAgIHJldHVybiBzZWxm
Ll9jaGVja3N1bV9maWxlIGlzIG5vdCBOb25lCisKKyAgICBkZWYgc2FtZV9jb250ZW50KHNlbGYs
IG90aGVyKToKKyAgICAgICAgaWYgc2VsZi5oYXNfY2hlY2tzdW0oKSBhbmQgb3RoZXIuaGFzX2No
ZWNrc3VtKCk6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5fY2hlY2tzdW1fZmlsZS5jb250ZW50
cygpID09IG90aGVyLl9jaGVja3N1bV9maWxlLmNvbnRlbnRzKCkKKyAgICAgICAgZWxzZToKKyAg
ICAgICAgICAgIHNlbGZfY29udGVudHMgPSBzZWxmLl9pbWFnZV9maWxlLmNvbnRlbnRzKCkKKyAg
ICAgICAgICAgIG90aGVyX2NvbnRlbnRzID0gb3RoZXIuX2ltYWdlX2ZpbGUuY29udGVudHMoKQor
ICAgICAgICAgICAgcmV0dXJuIEltYWdlUmVzdWx0LmltYWdlX2RpZmZlci5zYW1lX2ltYWdlKHNl
bGZfY29udGVudHMsIG90aGVyX2NvbnRlbnRzKQorCisgICAgZGVmIHJldGFyZ2V0KHNlbGYsIHBs
YXRmb3JtKToKKyAgICAgICAgcmV0dXJuIEltYWdlUmVzdWx0KHBsYXRmb3JtLCBzZWxmLl9pbWFn
ZV9maWxlLCBzZWxmLl9jaGVja3N1bV9maWxlKQpkaWZmIC0tZ2l0IGEvV2ViS2l0VG9vbHMvU2Ny
aXB0cy93ZWJraXRweS9jb21tb24vbmV0L3Jlc3VsdF91bml0dGVzdC5weSBiL1dlYktpdFRvb2xz
L1NjcmlwdHMvd2Via2l0cHkvY29tbW9uL25ldC9yZXN1bHRfdW5pdHRlc3QucHkKbmV3IGZpbGUg
bW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MC4uZWRkZGQ4MmQ0MWI0M2VmNWUzMTYxZTkxNTk1ZmRkOWE4OTA3ZWU2MAotLS0gL2Rldi9udWxs
CisrKyBiL1dlYktpdFRvb2xzL1NjcmlwdHMvd2Via2l0cHkvY29tbW9uL25ldC9yZXN1bHRfdW5p
dHRlc3QucHkKQEAgLTAsMCArMSwxMzMgQEAKKyMhL3Vzci9iaW4vZW52IHB5dGhvbgorIyBDb3B5
cmlnaHQgKEMpIDIwMTAgR29vZ2xlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyMKKyMgUmVk
aXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3
aXRob3V0CisjIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBm
b2xsb3dpbmcgY29uZGl0aW9ucworIyBhcmUgbWV0OgorIworIyAxLiAgUmVkaXN0cmlidXRpb25z
IG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyMgICAgIG5v
dGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1l
ci4KKyMgMi4gIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0
aGUgYWJvdmUgY29weXJpZ2h0CisjICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25z
IGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisjICAgICBkb2N1bWVudGF0aW9u
IGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgor
IworIyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIEFORCBJVFMgQ09OVFJJQlVU
T1JTICJBUyBJUyIgQU5EIEFOWQorIyBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5D
TFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVECisjIFdBUlJBTlRJRVMgT0Yg
TUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUK
KyMgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgT1IgSVRTIENPTlRSSUJVVE9S
UyBCRSBMSUFCTEUgRk9SIEFOWQorIyBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVD
SUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUworIyAoSU5DTFVESU5HLCBC
VVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VS
VklDRVM7CisjIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRF
UlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAorIyBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElU
WSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorIyAoSU5D
TFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9G
IFRIRSBVU0UgT0YKKyMgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NT
SUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworaW1wb3J0IHJlCitpbXBvcnQgcmVzdWx0CitpbXBv
cnQgdW5pdHRlc3QKKworCitjbGFzcyBGYWtlRmlsZShvYmplY3QpOgorICAgIGRlZiBfX2luaXRf
XyhzZWxmLCBmaWxlbmFtZSwgY29udGVudHM9ImZha2UgY29udGVudHMiKToKKyAgICAgICAgc2Vs
Zi5fZmlsZW5hbWUgPSBmaWxlbmFtZQorICAgICAgICBzZWxmLl9jb250ZW50cyA9IGNvbnRlbnRz
CisKKyAgICBkZWYgbmFtZShzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX2ZpbGVuYW1lCisK
KyAgICBkZWYgY29udGVudHMoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLl9jb250ZW50cwor
CisKK2NsYXNzIEZha2VSZXN1bHQocmVzdWx0LlJlc3VsdCk6CisgICAgZGVmIF9faW5pdF9fKHNl
bGYsIHBsYXRmb3JtLCByZXN1bHRfdHlwZSwgY29udGVudHMsIGlzX2V4cGVjdGVkPUZhbHNlKToK
KyAgICAgICAgc2VsZi5fcmVzdWx0X3R5cGUgPSByZXN1bHRfdHlwZQorICAgICAgICBzZWxmLl9j
b250ZW50cyA9IGNvbnRlbnRzCisgICAgICAgIHNlbGYuX2lzX2V4cGVjdGVkID0gaXNfZXhwZWN0
ZWQKKyAgICAgICAgYWN0dWFsID0gJ2FjdHVhbCcKKyAgICAgICAgaWYgaXNfZXhwZWN0ZWQ6Cisg
ICAgICAgICAgICBhY3R1YWwgPSAnZXhwZWN0ZWQnCisgICAgICAgIHRlc3RfbmFtZSA9ICdhbm9u
eW1vdXMtdGVzdC0lcy50eHQnICUgYWN0dWFsCisgICAgICAgIGZpbGUgPSBGYWtlRmlsZSh0ZXN0
X25hbWUsIGNvbnRlbnRzKQorICAgICAgICBzdXBlcihGYWtlUmVzdWx0LCBzZWxmKS5fX2luaXRf
XyhwbGF0Zm9ybSwgcmVzdWx0X3R5cGUsIFtmaWxlXSkKKworICAgIGRlZiBjb250ZW50cyhzZWxm
KToKKyAgICAgICAgcmV0dXJuIHNlbGYuX2NvbnRlbnRzCisKKyAgICBkZWYgcmV0YXJnZXQoc2Vs
ZiwgcGxhdGZvcm0pOgorICAgICAgICByZXR1cm4gRmFrZVJlc3VsdChwbGF0Zm9ybSwgc2VsZi5f
cmVzdWx0X3R5cGUsIHNlbGYuX2NvbnRlbnRzLCBzZWxmLl9pc19leHBlY3RlZCkKKworCitjbGFz
cyBSZXN1bHRUZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICBkZWYgX2NoZWNrX25hbWUoc2Vs
ZiwgZmlsZW5hbWUsIGV4cGVjdGVkX3Rlc3RfbmFtZSk6CisgICAgICAgIHIgPSByZXN1bHQuVGV4
dFJlc3VsdChOb25lLCBGYWtlRmlsZShmaWxlbmFtZSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1
YWxzKGV4cGVjdGVkX3Rlc3RfbmFtZSwgci5uYW1lKCkpCisKKyAgICBkZWYgX2NoZWNrX3BsYXRm
b3JtKHNlbGYsIGZpbGVuYW1lLCBleHBlY3RlZF9wbGF0Zm9ybSk6CisgICAgICAgIHIgPSByZXN1
bHQuVGV4dFJlc3VsdChOb25lLCBGYWtlRmlsZShmaWxlbmFtZSkpCisgICAgICAgIHNlbGYuYXNz
ZXJ0RXF1YWxzKGV4cGVjdGVkX3BsYXRmb3JtLCByLnBsYXRmb3JtKCkpCisKKyAgICBkZWYgdGVz
dEV4dHJhY3RzTmFtZUNvcnJlY3RseShzZWxmKToKKyAgICAgICAgc2VsZi5fY2hlY2tfbmFtZSgn
TGF5b3V0VGVzdHMvZmFzdC9kb20vYS1leHBlY3RlZC50eHQnLCAnZmFzdC9kb20vYScpCisgICAg
ICAgIHNlbGYuX2NoZWNrX25hbWUoJ0xheW91dFRlc3RzL2Zhc3QvZG9tL2EtYWN0dWFsLnR4dCcs
ICdmYXN0L2RvbS9hJykKKyAgICAgICAgc2VsZi5fY2hlY2tfbmFtZSgnTGF5b3V0VGVzdHMvcGxh
dGZvcm0vd2luL2Zhc3QvYS1leHBlY3RlZC50eHQnLCAnZmFzdC9hJykKKyAgICAgICAgc2VsZi5f
Y2hlY2tfbmFtZSgnTGF5b3V0VGVzdHMvcGxhdGZvcm0vd2luL2Zhc3QvYS1leHBlY3RlZC5jaGVj
a3N1bScsICdmYXN0L2EnKQorICAgICAgICBzZWxmLl9jaGVja19uYW1lKCdmYXN0L2RvbS90ZXN0
LWV4cGVjdGVkLnR4dCcsICdmYXN0L2RvbS90ZXN0JykKKyAgICAgICAgc2VsZi5fY2hlY2tfbmFt
ZSgnbGF5b3V0LXRlc3QtcmVzdWx0cy9mYXN0L2EtYWN0dWFsLmNoZWNrc3VtJywgJ2Zhc3QvYScp
CisKKyAgICBkZWYgdGVzdEV4dHJhY3RzUGxhdGZvcm1Db3JyZWN0bHkoc2VsZik6CisgICAgICAg
IHNlbGYuX2NoZWNrX3BsYXRmb3JtKCdMYXlvdXRUZXN0cy9wbGF0Zm9ybS93aW4vZmFzdC9hLWV4
cGVjdGVkLnR4dCcsICd3aW4nKQorICAgICAgICBzZWxmLl9jaGVja19wbGF0Zm9ybSgncGxhdGZv
cm0vd2luL2Zhc3QvYS1leHBlY3RlZC50eHQnLCAnd2luJykKKyAgICAgICAgc2VsZi5fY2hlY2tf
cGxhdGZvcm0oJ3BsYXRmb3JtL21hYy9mYXN0L2EtZXhwZWN0ZWQudHh0JywgJ21hYycpCisgICAg
ICAgIHNlbGYuX2NoZWNrX3BsYXRmb3JtKCdmYXN0L2EtZXhwZWN0ZWQudHh0JywgTm9uZSkKKwor
ICAgIGRlZiB0ZXN0UmVzdWx0c0Zyb21BbkFjdHVhbEZpbGVBcmVNYXJrZWRBc1N1Y2goc2VsZik6
CisgICAgICAgIHIgPSByZXN1bHQuVGV4dFJlc3VsdChOb25lLCBGYWtlRmlsZSgndGVzdC1hY3R1
YWwudHh0JykpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShyLmlzX2FjdHVhbCgpKQorCisgICAg
ZGVmIHRlc3RSZXN1bHRzRnJvbUFuRXhwZWN0ZWRGaWxlQXJlTm90QWN0dWFsKHNlbGYpOgorICAg
ICAgICByID0gcmVzdWx0LlRleHRSZXN1bHQoTm9uZSwgRmFrZUZpbGUoJ3Rlc3QtZXhwZWN0ZWQu
dHh0JykpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2Uoci5pc19hY3R1YWwoKSkKKworICAgIGRl
ZiB0ZXN0SXNSZWJhc2VsaW5lT2Yoc2VsZik6CisgICAgICAgIGV4cGVjdGVkID0gcmVzdWx0LlRl
eHRSZXN1bHQoJ21hYycsIEZha2VGaWxlKCd0ZXN0LWV4cGVjdGVkLnR4dCcpKQorICAgICAgICBh
Y3R1YWwgPSByZXN1bHQuVGV4dFJlc3VsdCgnbWFjJywgRmFrZUZpbGUoJ3Rlc3QtYWN0dWFsLnR4
dCcpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoYWN0dWFsLmlzX3JlYmFzZWxpbmVfb2YoZXhw
ZWN0ZWQpKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKGV4cGVjdGVkLmlzX3JlYmFzZWxpbmVf
b2YoYWN0dWFsKSkKKworICAgIGRlZiB0ZXN0X19lcV9fKHNlbGYpOgorICAgICAgICByMSA9IHJl
c3VsdC5UZXh0UmVzdWx0KCdtYWMnLCBGYWtlRmlsZSgndGVzdC1leHBlY3RlZC50eHQnLCAnY29u
dGVudHMnKSkKKyAgICAgICAgcjIgPSByZXN1bHQuVGV4dFJlc3VsdCgnbWFjJywgRmFrZUZpbGUo
J3Rlc3QtZXhwZWN0ZWQudHh0JywgJ2NvbnRlbnRzJykpCisgICAgICAgIHIzID0gcmVzdWx0LlRl
eHRSZXN1bHQoJ3dpbicsIEZha2VGaWxlKCd0ZXN0LWV4cGVjdGVkLnR4dCcsICdjb250ZW50cycp
KQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKHIxLCByMikKKyAgICAgICAgc2VsZi5hc3Nl
cnRFcXVhbHMocjEsIHIyLnJldGFyZ2V0KCdtYWMnKSkKKyAgICAgICAgc2VsZi5hc3NlcnROb3RF
cXVhbHMocjEsIHIyLnJldGFyZ2V0KCd3aW4nKSkKKworICAgIGRlZiB0ZXN0X19oYXNoX18oc2Vs
Zik6CisgICAgICAgIHIxID0gcmVzdWx0LlRleHRSZXN1bHQoJ21hYycsIEZha2VGaWxlKCd0ZXN0
LWV4cGVjdGVkLnR4dCcsICdjb250ZW50cycpKQorICAgICAgICByMiA9IHJlc3VsdC5UZXh0UmVz
dWx0KCdtYWMnLCBGYWtlRmlsZSgndGVzdC1leHBlY3RlZC50eHQnLCAnY29udGVudHMnKSkKKyAg
ICAgICAgcjMgPSByZXN1bHQuVGV4dFJlc3VsdChOb25lLCBGYWtlRmlsZSgndGVzdC1leHBlY3Rl
ZC50eHQnLCBOb25lKSkKKworICAgICAgICB4ID0gc2V0KFtyMSwgcjJdKQorICAgICAgICBzZWxm
LmFzc2VydEVxdWFscygxLCBsZW4oc2V0KFtyMSwgcjJdKSkpCisgICAgICAgIHNlbGYuYXNzZXJ0
RXF1YWxzKDIsIGxlbihzZXQoW3IxLCByMiwgcjNdKSkpCisKKyAgICBkZWYgdGVzdEltYWdlRGlm
ZklzSW52b2tlZEZvckltYWdlUmVzdWx0c1dpdGhvdXRDaGVja3N1bShzZWxmKToKKyAgICAgICAg
cjEgPSByZXN1bHQuSW1hZ2VSZXN1bHQoJ21hYycsIEZha2VGaWxlKCd0ZXN0LWV4cGVjdGVkLnBu
ZycsICdhc2RmJyksIEZha2VGaWxlKCd0ZXN0LWV4cGVjdGVkLmNoZWNrc3VtJywgJ2NoZWNrJykp
CisgICAgICAgIHIyID0gcmVzdWx0LkltYWdlUmVzdWx0KCdtYWMnLCBGYWtlRmlsZSgndGVzdC1l
eHBlY3RlZC5wbmcnLCAnYXNkZicpLCBOb25lKQorCisgICAgICAgICMgRGVmYXVsdCBiZWhhdmlv
dXIgaXMgdG8ganVzdCBjb21wYXJlIG9uIGltYWdlIGNvbnRlbnRzLgorICAgICAgICBzZWxmLmFz
c2VydFRydWUocjEuc2FtZV9jb250ZW50KHIyKSkKKworICAgICAgICBjbGFzcyBBbGxJbWFnZXNB
cmVEaWZmZXJlbnQob2JqZWN0KToKKyAgICAgICAgICAgIGRlZiBzYW1lX2ltYWdlKHNlbGYsIGlt
YWdlMSwgaW1hZ2UyKToKKyAgICAgICAgICAgICAgICByZXR1cm4gRmFsc2UKKworICAgICAgICAj
IEJ1dCB3ZSBjYW4gaW5zdGFsbCBvdGhlciBpbWFnZSBkaWZmZXJzLgorICAgICAgICByZXN1bHQu
SW1hZ2VSZXN1bHQuaW1hZ2VfZGlmZmVyID0gQWxsSW1hZ2VzQXJlRGlmZmVyZW50KCkKKworICAg
ICAgICBzZWxmLmFzc2VydEZhbHNlKHIxLnNhbWVfY29udGVudChyMikpCisKK2lmIF9fbmFtZV9f
ID09ICJfX21haW5fXyI6CisgICAgdW5pdHRlc3QubWFpbigpCmRpZmYgLS1naXQgYS9XZWJLaXRU
b29scy9TY3JpcHRzL3dlYmtpdHB5L2NvbW1vbi9uZXQvcmVzdWx0c2V0LnB5IGIvV2ViS2l0VG9v
bHMvU2NyaXB0cy93ZWJraXRweS9jb21tb24vbmV0L3Jlc3VsdHNldC5weQpuZXcgZmlsZSBtb2Rl
IDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwLi4x
Yjk2YWZiMjMxYmExMjgwZTM1YWExZTNhOTY1YmY1OTg0ODcxOTBlCi0tLSAvZGV2L251bGwKKysr
IGIvV2ViS2l0VG9vbHMvU2NyaXB0cy93ZWJraXRweS9jb21tb24vbmV0L3Jlc3VsdHNldC5weQpA
QCAtMCwwICsxLDEzMSBAQAorIyEvdXNyL2Jpbi9lbnYgcHl0aG9uCisjIENvcHlyaWdodCAoQykg
MjAxMCBHb29nbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorIworIyBSZWRpc3RyaWJ1dGlv
biBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyMg
bW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBj
b25kaXRpb25zCisjIGFyZSBtZXQ6CisjCisjIDEuICBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNl
IGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorIyAgICAgbm90aWNlLCB0aGlz
IGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorIyAyLiAg
UmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBj
b3B5cmlnaHQKKyMgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBm
b2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyMgICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90
aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisjCisjIFRISVMg
U09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgQU5EIElUUyBDT05UUklCVVRPUlMgIkFTIElT
IiBBTkQgQU5ZCisjIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJV
VCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQKKyMgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFC
SUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQorIyBESVNDTEFJ
TUVELiBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBPUiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJM
RSBGT1IgQU5ZCisjIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1Q
TEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCisjIChJTkNMVURJTkcsIEJVVCBOT1QgTElN
SVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyMg
TE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikg
SE9XRVZFUiBDQVVTRUQgQU5ECisjIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVS
IElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisjIChJTkNMVURJTkcgTkVH
TElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBP
RgorIyBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9G
IFNVQ0ggREFNQUdFLgorCitmcm9tIHdlYmtpdHB5LmNvbW1vbi5kaXJhc3ppcCBpbXBvcnQgRGly
ZWN0b3J5QXNaaXAKK2Zyb20gd2Via2l0cHkuY29tbW9uLm5ldC5yZW1vdGV6aXAgaW1wb3J0IFJl
bW90ZVppcAoraW1wb3J0IHJlCitpbXBvcnQgcmVzdWx0CitpbXBvcnQgdXJsbGliCisKKworY2xh
c3MgUmVzdWx0U2V0KG9iamVjdCk6CisgICAgIiIiUmV0cmlldmVzIHJlc3VsdHMgZnJvbSB6aXAg
ZmlsZXMiIiIKKyAgICBkZWYgX19pbml0X18oc2VsZiwgbmFtZSwgcGxhdGZvcm0sIHppcF9maWxl
LCAqKmt3YXJncyk6CisgICAgICAgIHNlbGYuX25hbWUgPSBuYW1lCisgICAgICAgIHNlbGYuX3Bs
YXRmb3JtID0gcGxhdGZvcm0KKyAgICAgICAgc2VsZi5femlwX2ZpbGUgPSB6aXBfZmlsZQorICAg
ICAgICBzZWxmLl9pbmNsdWRlX2V4cGVjdGVkID0ga3dhcmdzLmdldCgnaW5jbHVkZV9leHBlY3Rl
ZCcsIFRydWUpCisKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgZnJvbV96aXBfdXJsKGNscywg
cGxhdGZvcm0sIHppcF9wYXRoKToKKyAgICAgICAgcmV0dXJuIFJlc3VsdFNldCgnbG9jYWwgemlw
ICVzIGJ1aWxkZXInICUgcGxhdGZvcm0sIHBsYXRmb3JtLCBSZW1vdGVaaXAoemlwX3BhdGgpKQor
CisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIGZyb21femlwKGNscywgcGxhdGZvcm0sIHppcCk6
CisgICAgICAgIHJldHVybiBSZXN1bHRTZXQoJ2xvY2FsIHppcCAlcyBidWlsZGVyJyAlIHBsYXRm
b3JtLCBwbGF0Zm9ybSwgemlwKQorCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIGZyb21femlw
X21hcChjbHMsIHppcF9tYXApOgorICAgICAgICByZXN1bHRfc2V0cyA9IFtdCisgICAgICAgIGZv
ciBrLCB2IGluIHppcF9tYXAuaXRlbXMoKToKKyAgICAgICAgICAgIHJlc3VsdF9zZXRzLmFwcGVu
ZChSZXN1bHRTZXQuZnJvbV96aXAoaywgdikpCisgICAgICAgIHJldHVybiBBZ2dyZWdhdGVSZXN1
bHRTZXQocmVzdWx0X3NldHMpCisKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgZnJvbV9wYXRo
KHNlbGYsIHBhdGgsIHBsYXRmb3JtPU5vbmUpOgorICAgICAgICB6ID0gRGlyZWN0b3J5QXNaaXAo
cGF0aCkKKyAgICAgICAgcmV0dXJuIFJlc3VsdFNldCgnbG9jYWwgJXMgYnVpbGRlcicgJSBwbGF0
Zm9ybSwgcGxhdGZvcm0sIHopCisKKyAgICBkZWYgbmFtZShzZWxmKToKKyAgICAgICAgcmV0dXJu
IHNlbGYuX25hbWUKKworICAgIGRlZiBzZXRfcGxhdGZvcm0oc2VsZiwgcGxhdGZvcm0pOgorICAg
ICAgICBzZWxmLl9wbGF0Zm9ybSA9IHBsYXRmb3JtCisKKyAgICBkZWYgZmlsZXMoc2VsZik6Cisg
ICAgICAgIGZpbGVzID0gW10KKyAgICAgICAgZm9yIGZpbGVuYW1lIGluIHNlbGYuX3ppcF9maWxl
Lm5hbWVsaXN0KCk6CisgICAgICAgICAgICBmaWxlcy5hcHBlbmQoc2VsZi5femlwX2ZpbGUuaGFu
ZGxlX3RvKGZpbGVuYW1lKSkKKyAgICAgICAgcmV0dXJuIGZpbGVzCisKKyAgICBkZWYgcmVzdWx0
c19mb3Ioc2VsZiwgbmFtZSwgKiprd2FyZ3MpOgorICAgICAgICB0YXJnZXRfdHlwZSA9IGt3YXJn
cy5nZXQoJ3RhcmdldF90eXBlJywgTm9uZSkKKyAgICAgICAgZXhhY3RfbWF0Y2ggPSBrd2FyZ3Mu
Z2V0KCdleGFjdF9tYXRjaCcsIEZhbHNlKQorICAgICAgICBpZiByZS5zZWFyY2gocidcLng/aHRt
bCcsIG5hbWUpOgorICAgICAgICAgICAgbmFtZSA9IG5hbWVbOm5hbWUucmluZGV4KCcuJyldCisg
ICAgICAgIG5hbWVfbWF0Y2hlciA9IHJlLmNvbXBpbGUobmFtZSkKKyAgICAgICAgYWN0dWFsX21h
dGNoZXIgPSByZS5jb21waWxlKHInLWFjdHVhbFwuJykKKyAgICAgICAgZXhwZWN0ZWRfbWF0Y2hl
ciA9IHJlLmNvbXBpbGUocictZXhwZWN0ZWRcLicpCisKKyAgICAgICAgY2hlY2tzdW1fZmlsZXMg
PSBbXQorICAgICAgICB0ZXh0X2ZpbGVzID0gW10KKyAgICAgICAgaW1hZ2VfZmlsZXMgPSBbXQor
ICAgICAgICBmb3IgcmVzdWx0X2ZpbGUgaW4gc2VsZi5maWxlcygpOgorICAgICAgICAgICAgbmFt
ZV9tYXRjaCA9IG5hbWVfbWF0Y2hlci5zZWFyY2gocmVzdWx0X2ZpbGUubmFtZSgpKQorICAgICAg
ICAgICAgYWN0dWFsX21hdGNoID0gYWN0dWFsX21hdGNoZXIuc2VhcmNoKHJlc3VsdF9maWxlLm5h
bWUoKSkKKyAgICAgICAgICAgIGV4cGVjdGVkX21hdGNoID0gZXhwZWN0ZWRfbWF0Y2hlci5zZWFy
Y2gocmVzdWx0X2ZpbGUubmFtZSgpKQorICAgICAgICAgICAgaWYgbmFtZV9tYXRjaCBhbmQgKGFj
dHVhbF9tYXRjaCBvciAoc2VsZi5faW5jbHVkZV9leHBlY3RlZCBhbmQgZXhwZWN0ZWRfbWF0Y2gp
KToKKyAgICAgICAgICAgICAgICBpZiByZXN1bHRfZmlsZS5uYW1lKCkuZW5kc3dpdGgoJy5jaGVj
a3N1bScpOgorICAgICAgICAgICAgICAgICAgICBjaGVja3N1bV9maWxlcy5hcHBlbmQocmVzdWx0
X2ZpbGUpCisgICAgICAgICAgICAgICAgZWxpZiByZXN1bHRfZmlsZS5uYW1lKCkuZW5kc3dpdGgo
Jy50eHQnKToKKyAgICAgICAgICAgICAgICAgICAgdGV4dF9maWxlcy5hcHBlbmQocmVzdWx0X2Zp
bGUpCisgICAgICAgICAgICAgICAgZWxpZiByZXN1bHRfZmlsZS5uYW1lKCkuZW5kc3dpdGgoJy5w
bmcnKToKKyAgICAgICAgICAgICAgICAgICAgaW1hZ2VfZmlsZXMuYXBwZW5kKHJlc3VsdF9maWxl
KQorCisgICAgICAgIHJlc3VsdHMgPSBbXQorICAgICAgICBmb3IgaW1hZ2VfZmlsZSBpbiBpbWFn
ZV9maWxlczoKKyAgICAgICAgICAgIGNoZWNrc3VtX2ZpbGVfbmFtZSA9IHJlLnN1YihyZS5jb21w
aWxlKCdcLnBuZycpLCAnLmNoZWNrc3VtJywgaW1hZ2VfZmlsZS5uYW1lKCkpCisgICAgICAgICAg
ICBmb3VuZF9jaGVja3N1bSA9IEZhbHNlCisgICAgICAgICAgICBmb3IgY2hlY2tzdW1fZmlsZSBp
biBjaGVja3N1bV9maWxlczoKKyAgICAgICAgICAgICAgICBpZiBjaGVja3N1bV9maWxlLm5hbWUo
KSA9PSBjaGVja3N1bV9maWxlX25hbWU6CisgICAgICAgICAgICAgICAgICAgIGZvdW5kX2NoZWNr
c3VtID0gVHJ1ZQorICAgICAgICAgICAgICAgICAgICByZXN1bHRzLmFwcGVuZChyZXN1bHQuSW1h
Z2VSZXN1bHQoc2VsZi5fcGxhdGZvcm0sIGltYWdlX2ZpbGUsIGNoZWNrc3VtX2ZpbGUpKQorICAg
ICAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgaWYgbm90IGZvdW5kX2NoZWNrc3Vt
OgorICAgICAgICAgICAgICAgICMgcHJpbnQgIkNvdWxkbid0IGZpbmQgY2hlY2tzdW0gZm9yIGlt
YWdlICclcyciICUgaW1hZ2VfZmlsZS5uYW1lKCkKKyAgICAgICAgICAgICAgICByZXN1bHRzLmFw
cGVuZChyZXN1bHQuSW1hZ2VSZXN1bHQoc2VsZi5fcGxhdGZvcm0sIGltYWdlX2ZpbGUsIE5vbmUp
KQorCisgICAgICAgIGZvciB0ZXh0X2ZpbGUgaW4gdGV4dF9maWxlczoKKyAgICAgICAgICAgIHJl
c3VsdHMuYXBwZW5kKHJlc3VsdC5UZXh0UmVzdWx0KHNlbGYuX3BsYXRmb3JtLCB0ZXh0X2ZpbGUp
KQorCisgICAgICAgIGlmIGV4YWN0X21hdGNoOgorICAgICAgICAgICAgcmVzdWx0cyA9IGZpbHRl
cihsYW1iZGEgcjogci5uYW1lKCkgPT0gbmFtZSwgcmVzdWx0cykKKworICAgICAgICByZXN1bHRz
ID0gZmlsdGVyKGxhbWJkYSByOiB0YXJnZXRfdHlwZSBpcyBOb25lIG9yIHRhcmdldF90eXBlID09
IHIudHlwZSgpLCByZXN1bHRzKQorICAgICAgICByZXR1cm4gcmVzdWx0cworCisKK2NsYXNzIEFn
Z3JlZ2F0ZVJlc3VsdFNldChvYmplY3QpOgorICAgICIiIkNvbGxlY3RzIHJlc3VsdHMgZnJvbSBh
IGxpc3Qgb2YgYnVpbGRlcnMiIiIKKyAgICBkZWYgX19pbml0X18oc2VsZiwgYnVpbGRlcnMpOgor
ICAgICAgICBzZWxmLl9idWlsZGVycyA9IGJ1aWxkZXJzCisKKyAgICBkZWYgcmVzdWx0c19mb3Io
c2VsZiwgbmFtZSwgKiprd2FyZ3MpOgorICAgICAgICByZXN1bHRzID0gW10KKyAgICAgICAgZm9y
IGJ1aWxkZXIgaW4gc2VsZi5fYnVpbGRlcnM6CisgICAgICAgICAgICByZXN1bHRzICs9IGJ1aWxk
ZXIucmVzdWx0c19mb3IobmFtZSwgKiprd2FyZ3MpCisgICAgICAgIHJldHVybiByZXN1bHRzCisK
KyAgICBkZWYgc3ViX2J1aWxkZXJzKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5fYnVpbGRl
cnMKZGlmZiAtLWdpdCBhL1dlYktpdFRvb2xzL1NjcmlwdHMvd2Via2l0cHkvY29tbW9uL25ldC9y
ZXN1bHRzZXRfdW5pdHRlc3QucHkgYi9XZWJLaXRUb29scy9TY3JpcHRzL3dlYmtpdHB5L2NvbW1v
bi9uZXQvcmVzdWx0c2V0X3VuaXR0ZXN0LnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAuLjQyNWQ2ODQ4NDE4MjFhMDE5
MDJiNTcxZDZlNGE0ZTRhYzc0YjNmNzMKLS0tIC9kZXYvbnVsbAorKysgYi9XZWJLaXRUb29scy9T
Y3JpcHRzL3dlYmtpdHB5L2NvbW1vbi9uZXQvcmVzdWx0c2V0X3VuaXR0ZXN0LnB5CkBAIC0wLDAg
KzEsMTUyIEBACisjIS91c3IvYmluL2VudiBweXRob24KKyMgQ29weXJpZ2h0IChDKSAyMDEwIEdv
b2dsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisjCisjIFJlZGlzdHJpYnV0aW9uIGFuZCB1
c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorIyBtb2RpZmlj
YXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlv
bnMKKyMgYXJlIG1ldDoKKyMKKyMgMS4gIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBt
dXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisjICAgICBub3RpY2UsIHRoaXMgbGlzdCBv
ZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisjIDIuICBSZWRpc3Ry
aWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdo
dAorIyAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2lu
ZyBkaXNjbGFpbWVyIGluIHRoZQorIyAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0
ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyMKKyMgVEhJUyBTT0ZUV0FS
RSBJUyBQUk9WSURFRCBCWSBBUFBMRSBBTkQgSVRTIENPTlRSSUJVVE9SUyAiQVMgSVMiIEFORCBB
TlkKKyMgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBM
SU1JVEVEIFRPLCBUSEUgSU1QTElFRAorIyBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBB
TkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCisjIERJU0NMQUlNRUQuIElO
IE5PIEVWRU5UIFNIQUxMIEFQUExFIE9SIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBB
TlkKKyMgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBP
UiBDT05TRVFVRU5USUFMIERBTUFHRVMKKyMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRP
LCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworIyBMT1NTIE9G
IFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVS
IENBVVNFRCBBTkQKKyMgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09O
VFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyMgKElOQ0xVRElORyBORUdMSUdFTkNF
IE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisjIFRI
SVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBE
QU1BR0UuCisKK2Zyb20gd2Via2l0cHkuY29tbW9uLm5ldC5yZW1vdGV6aXAgaW1wb3J0IFppcEZp
bGVIYW5kbGUKK2ltcG9ydCByZXN1bHRzZXQKK2ltcG9ydCB1bml0dGVzdAorCisKK2NsYXNzIEZh
a2VaaXAob2JqZWN0KToKKyAgICBkZWYgX19pbml0X18oc2VsZik6CisgICAgICAgIHNlbGYuX2Zp
bGVzID0ge30KKworICAgIGRlZiBfX3N0cl9fKHNlbGYpOgorICAgICAgICByZXR1cm4gIkZha2Va
aXAiCisKKyAgICBkZWYgaW5zZXJ0KHNlbGYsIGZpbGVuYW1lLCBjb250ZW50KToKKyAgICAgICAg
c2VsZi5fZmlsZXNbZmlsZW5hbWVdID0gY29udGVudAorCisgICAgZGVmIG5hbWVsaXN0KHNlbGYp
OgorICAgICAgICByZXR1cm4gc2VsZi5fZmlsZXMua2V5cygpCisKKyAgICBkZWYgaGFuZGxlX3Rv
KHNlbGYsIGZpbGVuYW1lKToKKyAgICAgICAgcmV0dXJuIFppcEZpbGVIYW5kbGUoc2VsZiwgZmls
ZW5hbWUpCisKKyAgICBkZWYgcmVhZChzZWxmLCBmaWxlbmFtZSk6CisgICAgICAgIHJldHVybiBz
ZWxmLl9maWxlc1tmaWxlbmFtZV0KKworICAgIGRlZiBleHRyYWN0KHNlbGYsIGZpbGVuYW1lLCBw
YXRoKToKKyAgICAgICAgcHJpbnQgIkZha2VaaXA+IGNwICVzICVzIiAlIChmaWxlbmFtZSwgcGF0
aCkKKworICAgIGRlZiBkZWxldGUoc2VsZiwgZmlsZW5hbWUpOgorICAgICAgICBwcmludCAiRmFr
ZVppcD4gcm0gJXMiICUgZmlsZW5hbWUKKyAgICAgICAgc2VsZi5fZmlsZXNbZmlsZW5hbWVdID0g
Tm9uZQorCisKK2NsYXNzIFJlc3VsdFNldFRlc3QodW5pdHRlc3QuVGVzdENhc2UpOgorICAgIGRl
ZiBfcmVzdWx0c2V0X3dpdGhfemlwKHNlbGYsIHppcCwgKiprd2FyZ3MpOgorICAgICAgICByZXR1
cm4gcmVzdWx0c2V0LlJlc3VsdFNldCgnPGZha2UtcmVzdWx0c2V0PicsICc8ZmFrZS1wbGF0Zm9y
bT4nLCB6aXAsICoqa3dhcmdzKQorCisgICAgZGVmIHRlc3RUZXh0RmlsZXNHZXRJbnRlcnByZXRl
ZEFzVGV4dFJlc3VsdHMoc2VsZik6CisgICAgICAgIHppcCA9IEZha2VaaXAoKQorICAgICAgICB6
aXAuaW5zZXJ0KCdmYXN0L2RvbS9zb21lLXRlc3QtYWN0dWFsLnR4dCcsICdhY3R1YWwgcmVzdWx0
cycpCisgICAgICAgIGIgPSBzZWxmLl9yZXN1bHRzZXRfd2l0aF96aXAoemlwKQorICAgICAgICBz
ZWxmLmFzc2VydEVxdWFscygxLCBsZW4oYi5yZXN1bHRzX2ZvcignZmFzdC9kb20vc29tZS10ZXN0
JykpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscygnZmFzdC9kb20vc29tZS10ZXN0JywgYi5y
ZXN1bHRzX2ZvcignZmFzdC9kb20vc29tZS10ZXN0Lmh0bWwnKVswXS5uYW1lKCkpCisKKyAgICBk
ZWYgdGVzdEltYWdlQW5kQ2hlY2tzdW1GaWxlc0dldEludGVycHJldGVkQXNBU2luZ2xlSW1hZ2VS
ZXN1bHQoc2VsZik6CisgICAgICAgIHppcCA9IEZha2VaaXAoKQorICAgICAgICB6aXAuaW5zZXJ0
KCdmYXN0L2RvbS9zb21lLXRlc3QtYWN0dWFsLmNoZWNrc3VtJywgJ2FiYzEyMycpCisgICAgICAg
IHppcC5pbnNlcnQoJ2Zhc3QvZG9tL3NvbWUtdGVzdC1hY3R1YWwucG5nJywgJzxpbWFnZSBkYXRh
PicpCisgICAgICAgIGIgPSBzZWxmLl9yZXN1bHRzZXRfd2l0aF96aXAoemlwKQorICAgICAgICBy
ZXN1bHRzID0gYi5yZXN1bHRzX2ZvcignZmFzdC9kb20vc29tZS10ZXN0JykKKyAgICAgICAgc2Vs
Zi5hc3NlcnRFcXVhbHMoMSwgbGVuKHJlc3VsdHMpKQorICAgICAgICByZXN1bHQgPSByZXN1bHRz
WzBdCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKCdpbWFnZScsIHJlc3VsdC50eXBlKCkpCisg
ICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKCdhYmMxMjMnLCByZXN1bHQuY29udGVudHMoKSkKKwor
ICAgIGRlZiB0ZXN0TXVsdGlwbGVJbWFnZVJlc3VsdHNBcmVEZXRlY3RlZChzZWxmKToKKyAgICAg
ICAgemlwID0gRmFrZVppcCgpCisgICAgICAgIHppcC5pbnNlcnQoJ3BsYXRmb3JtL3dpbi9mYXN0
L2RvbS9zb21lLXRlc3QtYWN0dWFsLmNoZWNrc3VtJywgJ2NoZWNrc3VtMScpCisgICAgICAgIHpp
cC5pbnNlcnQoJ3BsYXRmb3JtL3dpbi9mYXN0L2RvbS9zb21lLXRlc3QtYWN0dWFsLnBuZycsICc8
aW1hZ2UgZGF0YSAxPicpCisgICAgICAgIHppcC5pbnNlcnQoJ3BsYXRmb3JtL21hYy9mYXN0L2Rv
bS9zb21lLXRlc3QtYWN0dWFsLmNoZWNrc3VtJywgJ2NoZWNrc3VtMicpCisgICAgICAgIHppcC5p
bnNlcnQoJ3BsYXRmb3JtL21hYy9mYXN0L2RvbS9zb21lLXRlc3QtYWN0dWFsLnBuZycsICc8aW1h
Z2UgZGF0YSAyPicpCisgICAgICAgIGIgPSBzZWxmLl9yZXN1bHRzZXRfd2l0aF96aXAoemlwKQor
ICAgICAgICByZXN1bHRzID0gYi5yZXN1bHRzX2ZvcignZmFzdC9kb20vc29tZS10ZXN0JykKKyAg
ICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoMiwgbGVuKHJlc3VsdHMpKQorICAgICAgICBzZWxmLmFz
c2VydEZhbHNlKHJlc3VsdHNbMF0uc2FtZV9jb250ZW50KHJlc3VsdHNbMV0pKQorCisgICAgZGVm
IHRlc3RBZ2dyZWdhdGVSZXN1bHRTZXRDb3JyZWN0bHlSZXRyaWV2ZXNUZXN0c0Zyb21NdWx0aXBs
ZVJlc3VsdFNldHMoc2VsZik6CisgICAgICAgIHJlc3VsdHNldDFfemlwID0gRmFrZVppcCgpCisg
ICAgICAgIHJlc3VsdHNldDFfemlwLmluc2VydCgnZmFzdC9kb20vdGVzdC1hY3R1YWwudHh0Jywg
J2xpbnV4IHRleHQgcmVzdWx0JykKKyAgICAgICAgcmVzdWx0c2V0MSA9IHJlc3VsdHNldC5SZXN1
bHRTZXQoJ2xpbnV4LXJlc3VsdHNldCcsICdsaW51eCcsIHJlc3VsdHNldDFfemlwKQorICAgICAg
ICByZXN1bHRzZXQyX3ppcCA9IEZha2VaaXAoKQorICAgICAgICByZXN1bHRzZXQyX3ppcC5pbnNl
cnQoJ2Zhc3QvZG9tL3Rlc3QtYWN0dWFsLnR4dCcsICd3aW5kb3dzIHRleHQgcmVzdWx0JykKKyAg
ICAgICAgcmVzdWx0c2V0MiA9IHJlc3VsdHNldC5SZXN1bHRTZXQoJ3dpbi1yZXN1bHRzZXQnLCAn
d2luJywgcmVzdWx0c2V0Ml96aXApCisKKyAgICAgICAgYiA9IHJlc3VsdHNldC5BZ2dyZWdhdGVS
ZXN1bHRTZXQoW3Jlc3VsdHNldDEsIHJlc3VsdHNldDJdKQorICAgICAgICBzZWxmLmFzc2VydEVx
dWFscygyLCBsZW4oYi5yZXN1bHRzX2ZvcignZmFzdC9kb20vdGVzdCcpKSkKKworICAgIGRlZiB0
ZXN0Q2FuSW5mZXJQbGF0Zm9ybUZyb21QYXRoSWZOb25lUHJvdmlkZWQoc2VsZik6CisgICAgICAg
IHppcCA9IEZha2VaaXAoKQorICAgICAgICB6aXAuaW5zZXJ0KCdwbGF0Zm9ybS93aW4vc29tZS10
ZXN0LWV4cGVjdGVkLnBuZycsICc8aW1hZ2UgZGF0YT4nKQorICAgICAgICB6aXAuaW5zZXJ0KCdw
bGF0Zm9ybS93aW4vc29tZS10ZXN0LWV4cGVjdGVkLmNoZWNrc3VtJywgJ2FiYzEyMycpCisgICAg
ICAgIGIgPSByZXN1bHRzZXQuUmVzdWx0U2V0KCdsb2NhbCBMYXlvdXRUZXN0cyByZXN1bHRzZXQn
LCBOb25lLCB6aXApCisKKyAgICAgICAgcmVzdWx0cyA9IGIucmVzdWx0c19mb3IoJ3NvbWUtdGVz
dCcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKDEsIGxlbihyZXN1bHRzKSkKKyAgICAgICAg
c2VsZi5hc3NlcnRFcXVhbHMoJ3dpbicsIHJlc3VsdHNbMF0ucGxhdGZvcm0oKSkKKworICAgIGRl
ZiB0ZXN0VGVzdEV4dGVuc2lvbklzSWdub3JlZChzZWxmKToKKyAgICAgICAgemlwID0gRmFrZVpp
cCgpCisgICAgICAgIHppcC5pbnNlcnQoJ3Rlc3QvdGVzdC1hLWFjdHVhbC50eHQnLCAnYWN0dWFs
IHJlc3VsdHMnKQorICAgICAgICBiID0gc2VsZi5fcmVzdWx0c2V0X3dpdGhfemlwKHppcCkKKyAg
ICAgICAgcmVzdWx0cyA9IGIucmVzdWx0c19mb3IoJ3Rlc3QvdGVzdC1hLmh0bWwnKQorICAgICAg
ICBzZWxmLmFzc2VydEVxdWFscygxLCBsZW4ocmVzdWx0cykpCisgICAgICAgIHNlbGYuYXNzZXJ0
RXF1YWxzKCd0ZXN0L3Rlc3QtYScsIHJlc3VsdHNbMF0ubmFtZSgpKQorCisgICAgZGVmIHRlc3RF
eGlzdGluZ1Jlc3VsdHNBcmVNYXJrZWRBc1N1Y2goc2VsZik6CisgICAgICAgIHppcCA9IEZha2Va
aXAoKQorICAgICAgICB6aXAuaW5zZXJ0KCd0ZXN0L3Rlc3QtYS1leHBlY3RlZC50eHQnLCAnZXhw
ZWN0ZWQgcmVzdWx0cycpCisgICAgICAgIGIgPSBzZWxmLl9yZXN1bHRzZXRfd2l0aF96aXAoemlw
KQorICAgICAgICByZXN1bHRzID0gYi5yZXN1bHRzX2ZvcigndGVzdC90ZXN0LWEuaHRtbCcpCisg
ICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKDEsIGxlbihyZXN1bHRzKSkKKyAgICAgICAgc2VsZi5h
c3NlcnRGYWxzZShyZXN1bHRzWzBdLmlzX2FjdHVhbCgpKQorCisgICAgZGVmIHRlc3RPbmx5UmV0
dXJuc1Jlc3VsdHNPZlNwZWNpZmllZFR5cGUoc2VsZik6CisgICAgICAgIHppcCA9IEZha2VaaXAo
KQorICAgICAgICB6aXAuaW5zZXJ0KCd0ZXN0L3Rlc3QtYS1leHBlY3RlZC50eHQnLCAnZXhwZWN0
ZWQgcmVzdWx0cycpCisgICAgICAgIHppcC5pbnNlcnQoJ3Rlc3QvdGVzdC1hLWV4cGVjdGVkLmNo
ZWNrc3VtJywgJ2V4cGVjdGVkIHJlc3VsdHMnKQorICAgICAgICB6aXAuaW5zZXJ0KCd0ZXN0L3Rl
c3QtYS1leHBlY3RlZC5wbmcnLCAnZXhwZWN0ZWQgcmVzdWx0cycpCisgICAgICAgIGIgPSBzZWxm
Ll9yZXN1bHRzZXRfd2l0aF96aXAoemlwKQorCisgICAgICAgIHJlc3VsdHMgPSBiLnJlc3VsdHNf
Zm9yKCd0ZXN0L3Rlc3QtYS5odG1sJykKKyAgICAgICAgdGV4dF9yZXN1bHRzID0gYi5yZXN1bHRz
X2ZvcigndGVzdC90ZXN0LWEuaHRtbCcsIHRhcmdldF90eXBlPSd0ZXh0JykKKyAgICAgICAgaW1h
Z2VfcmVzdWx0cyA9IGIucmVzdWx0c19mb3IoJ3Rlc3QvdGVzdC1hLmh0bWwnLCB0YXJnZXRfdHlw
ZT0naW1hZ2UnKQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKDIsIGxlbihyZXN1bHRzKSkK
KyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoMSwgbGVuKHRleHRfcmVzdWx0cykpCisgICAgICAg
IHNlbGYuYXNzZXJ0RXF1YWxzKDEsIGxlbihpbWFnZV9yZXN1bHRzKSkKKyAgICAgICAgc2VsZi5h
c3NlcnRFcXVhbHMoJ3RleHQnLCB0ZXh0X3Jlc3VsdHNbMF0udHlwZSgpKQorICAgICAgICBzZWxm
LmFzc2VydEVxdWFscygnaW1hZ2UnLCBpbWFnZV9yZXN1bHRzWzBdLnR5cGUoKSkKKworICAgIGRl
ZiB0ZXN0RXhjbHVkZUV4cGVjdGVkUmVzdWx0c1dvcmtzKHNlbGYpOgorICAgICAgICB6aXAgPSBG
YWtlWmlwKCkKKyAgICAgICAgemlwLmluc2VydCgndGVzdC1leHBlY3RlZC50eHQnLCAgJ2V4cGVj
dGVkIHJlc3VsdHMgc3RvcmVkIG9uIHNlcnZlciBmb3Igc29tZSByZWFzb24nKQorICAgICAgICBi
ID0gc2VsZi5fcmVzdWx0c2V0X3dpdGhfemlwKHppcCwgaW5jbHVkZV9leHBlY3RlZD1GYWxzZSkK
KyAgICAgICAgcmVzdWx0cyA9IGIucmVzdWx0c19mb3IoJ3Rlc3QnLCB0YXJnZXRfdHlwZT1Ob25l
KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscygwLCBsZW4ocmVzdWx0cykpCisKK2lmIF9fbmFt
ZV9fID09ICJfX21haW5fXyI6CisgICAgdW5pdHRlc3QubWFpbigpCmRpZmYgLS1naXQgYS9XZWJL
aXRUb29scy9TY3JpcHRzL3dlYmtpdHB5L2NvbW1vbi9zeXN0ZW0vZmlsZXN5c3RlbS5weSBiL1dl
YktpdFRvb2xzL1NjcmlwdHMvd2Via2l0cHkvY29tbW9uL3N5c3RlbS9maWxlc3lzdGVtLnB5Cmlu
ZGV4IDhmMzk2YzRiN2M5M2Y3MjJkZjQ0NjdkZGU4YTM5Mjc4ZDgxZDE0OTcuLjc0MGQyY2QyMDVh
ZDAxY2E5NTk5MDQ2Y2QyNWY2MjMyYzQwYmE3YmQgMTAwNjQ0Ci0tLSBhL1dlYktpdFRvb2xzL1Nj
cmlwdHMvd2Via2l0cHkvY29tbW9uL3N5c3RlbS9maWxlc3lzdGVtLnB5CisrKyBiL1dlYktpdFRv
b2xzL1NjcmlwdHMvd2Via2l0cHkvY29tbW9uL3N5c3RlbS9maWxlc3lzdGVtLnB5CkBAIC0xMjUs
MyArMTI1LDcgQEAgY2xhc3MgRmlsZVN5c3RlbShvYmplY3QpOgogICAgICAgICAiIiJDb3BpZXMg
dGhlIGNvbnRlbnRzIG9mIHRoZSBmaWxlIGF0IHRoZSBnaXZlbiBwYXRoIHRvIHRoZSBkZXN0aW5h
dGlvbgogICAgICAgICBwYXRoLiIiIgogICAgICAgICBzaHV0aWwuY29weWZpbGUoc291cmNlLCBk
ZXN0aW5hdGlvbikKKworICAgIGRlZiByZW1vdmUoc2VsZiwgZmlsZW5hbWUpOgorICAgICAgICAi
IiJSZW1vdmUgdGhlIHNwZWNpZmllZCBmaWxlLiIiIgorICAgICAgICBvcy5yZW1vdmUoZmlsZW5h
bWUpCmRpZmYgLS1naXQgYS9XZWJLaXRUb29scy9TY3JpcHRzL3dlYmtpdHB5L2xheW91dF90ZXN0
cy9wb3J0L2Jhc2UucHkgYi9XZWJLaXRUb29scy9TY3JpcHRzL3dlYmtpdHB5L2xheW91dF90ZXN0
cy9wb3J0L2Jhc2UucHkKaW5kZXggYmM1YTlhYTNlNGQyNTVjMWY3NDkyMTI5ZDA0Y2QyNjY0Yzg3
NjIwOC4uNTE3ZjY1ZTBlOTEzM2JmZjdiMDY5ZTVmNTBiMGM0MDI0NWQ0MzIxZCAxMDA2NDQKLS0t
IGEvV2ViS2l0VG9vbHMvU2NyaXB0cy93ZWJraXRweS9sYXlvdXRfdGVzdHMvcG9ydC9iYXNlLnB5
CisrKyBiL1dlYktpdFRvb2xzL1NjcmlwdHMvd2Via2l0cHkvbGF5b3V0X3Rlc3RzL3BvcnQvYmFz
ZS5weQpAQCAtNjMxLDYgKzYzMSwxMCBAQCBjbGFzcyBQb3J0KG9iamVjdCk6CiAgICAgICAgIGV4
cGVjdGF0aW9ucywgZGV0ZXJtaW5pbmcgc2VhcmNoIHBhdGhzLCBhbmQgbG9nZ2luZyBpbmZvcm1h
dGlvbi4iIiIKICAgICAgICAgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcignUG9ydC52ZXJzaW9u
JykKIAorICAgIGRlZiBidWlsZGJvdF9yZXN1bHRzZXQoc2VsZiwgcGxhdGZvcm1zKToKKyAgICAg
ICAgIiIiUmV0dXJucyBhIFJlc3VsdFNldCBmb3IgdGhlIHNwZWNpZmllZCBwbGF0Zm9ybXMgZm9y
IHRoaXMgcG9ydHMgYnVpbGRib3RzLiIiIgorICAgICAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVy
cm9yKCdQb3J0LmJ1aWxkYm90X3Jlc3VsdHNldCcpCisKICAgICBkZWYgdGVzdF9yZXBvc2l0b3J5
X3BhdGhzKHNlbGYpOgogICAgICAgICAiIiJSZXR1cm5zIGEgbGlzdCBvZiAocmVwb3NpdG9yeV9u
YW1lLCByZXBvc2l0b3J5X3BhdGgpIHR1cGxlcwogICAgICAgICBvZiBpdHMgZGVwZW5kaW5nIGNv
ZGUgYmFzZS4gIEJ5IGRlZmF1bHQgaXQgcmV0dXJucyBhIGxpc3QgdGhhdCBvbmx5CmRpZmYgLS1n
aXQgYS9XZWJLaXRUb29scy9TY3JpcHRzL3dlYmtpdHB5L2xheW91dF90ZXN0cy9wb3J0L2Nocm9t
aXVtLnB5IGIvV2ViS2l0VG9vbHMvU2NyaXB0cy93ZWJraXRweS9sYXlvdXRfdGVzdHMvcG9ydC9j
aHJvbWl1bS5weQppbmRleCA4ZmU2ODVhZjA2NjllYjM0YWZlOGY5NGM1NmZlM2ZmM2NkOTUzNmM3
Li42ZDlhNmE1ZjA0OTQxZjA2Mjc3ZmMxZjZiY2Y5YjYwNDQzZjE0M2M0IDEwMDY0NAotLS0gYS9X
ZWJLaXRUb29scy9TY3JpcHRzL3dlYmtpdHB5L2xheW91dF90ZXN0cy9wb3J0L2Nocm9taXVtLnB5
CisrKyBiL1dlYktpdFRvb2xzL1NjcmlwdHMvd2Via2l0cHkvbGF5b3V0X3Rlc3RzL3BvcnQvY2hy
b21pdW0ucHkKQEAgLTQ0LDYgKzQ0LDggQEAgaW1wb3J0IHRlbXBmaWxlCiBpbXBvcnQgdGltZQog
aW1wb3J0IHdlYmJyb3dzZXIKIAorZnJvbSB3ZWJraXRweS5jb21tb24ubmV0LnJlbW90ZXppcCBp
bXBvcnQgUmVtb3RlWmlwCitmcm9tIHdlYmtpdHB5LmNvbW1vbi5uZXQucmVzdWx0c2V0IGltcG9y
dCBBZ2dyZWdhdGVSZXN1bHRTZXQsIFJlc3VsdFNldAogZnJvbSB3ZWJraXRweS5jb21tb24uc3lz
dGVtLnBhdGggaW1wb3J0IGN5Z3BhdGgKIGZyb20gd2Via2l0cHkubGF5b3V0X3Rlc3RzLmxheW91
dF9wYWNrYWdlIGltcG9ydCB0ZXN0X2V4cGVjdGF0aW9ucwogZnJvbSB3ZWJraXRweS5sYXlvdXRf
dGVzdHMubGF5b3V0X3BhY2thZ2UgaW1wb3J0IHRlc3Rfb3V0cHV0CkBAIC0xOTcsNiArMTk5LDI1
IEBAIGNsYXNzIENocm9taXVtUG9ydChiYXNlLlBvcnQpOgogICAgICAgICByZXR1cm4gc2VsZi5w
YXRoX2Zyb21fd2Via2l0X2Jhc2UoJ0xheW91dFRlc3RzJywgJ3BsYXRmb3JtJywKICAgICAgICAg
ICAgICdjaHJvbWl1bScsICd0ZXN0X2V4cGVjdGF0aW9ucy50eHQnKQogCisgICAgZGVmIGJ1aWxk
Ym90X3Jlc3VsdHNldChzZWxmLCBwbGF0Zm9ybXMpOgorICAgICAgICBwbGF0Zm9ybV9idWlsZGVy
cyA9IHsKKyAgICAgICAgICAgICdjaHJvbWl1bS1tYWMnOiAnV2Via2l0X01hYzEwXzUnLAorICAg
ICAgICAgICAgJ2Nocm9taXVtLXdpbi12aXN0YSc6ICdXZWJraXRfV2luJywKKyAgICAgICAgICAg
ICdjaHJvbWl1bS1saW51eCc6ICdXZWJraXRfTGludXhfVGVzdHNfX2RiZ19fMV8nLAorICAgICAg
ICB9CisKKyAgICAgICAgcmVzdWx0c2V0cyA9IFtdCisgICAgICAgIGZvciBwbGF0Zm9ybSBpbiBw
bGF0Zm9ybXM6CisgICAgICAgICAgICBpZiBwbGF0Zm9ybSBub3QgaW4gcGxhdGZvcm1fYnVpbGRl
cnM6CisgICAgICAgICAgICAgICAgcmFpc2UgRXhjZXB0aW9uKCJEb24ndCBoYXZlIHJlc3VsdHMg
Zm9yIHBsYXRmb3JtICVzIiAlIHBsYXRmb3JtKQorICAgICAgICAgICAgYnVpbGRlcl9uYW1lID0g
cGxhdGZvcm1fYnVpbGRlcnNbcGxhdGZvcm1dCisgICAgICAgICAgICB6aXBfdXJsID0gJ2h0dHA6
Ly9idWlsZC5jaHJvbWl1bS5vcmcvZi9jaHJvbWl1bS9sYXlvdXRfdGVzdF9yZXN1bHRzLycgKyBc
CisgICAgICAgICAgICAgICAgYnVpbGRlcl9uYW1lICsgJy9sYXlvdXQtdGVzdC1yZXN1bHRzLnpp
cCcKKyAgICAgICAgICAgIHJlc3VsdHNldHMuYXBwZW5kKFJlc3VsdFNldChidWlsZGVyX25hbWUs
IHBsYXRmb3JtLCBSZW1vdGVaaXAoemlwX3VybCksCisgICAgICAgICAgICAgICAgaW5jbHVkZV9l
eHBlY3RlZD1GYWxzZSkpCisKKyAgICAgICAgcmV0dXJuIEFnZ3JlZ2F0ZVJlc3VsdFNldChyZXN1
bHRzZXRzKQorCiAgICAgZGVmIHJlc3VsdHNfZGlyZWN0b3J5KHNlbGYpOgogICAgICAgICB0cnk6
CiAgICAgICAgICAgICByZXR1cm4gc2VsZi5wYXRoX2Zyb21fY2hyb21pdW1fYmFzZSgnd2Via2l0
JywKZGlmZiAtLWdpdCBhL1dlYktpdFRvb2xzL1NjcmlwdHMvd2Via2l0cHkvbGF5b3V0X3Rlc3Rz
L3BvcnQvd2Via2l0LnB5IGIvV2ViS2l0VG9vbHMvU2NyaXB0cy93ZWJraXRweS9sYXlvdXRfdGVz
dHMvcG9ydC93ZWJraXQucHkKaW5kZXggMDliZTgzM2Q3NTJmMDJmZGI3OTQ0NjYzYjkwZTU1ZWE3
MzBjZTFhMS4uYTJkMzk0ZmRhMTQ1NTQ5ZmRjZDY0YTFmODY0ZGE0M2E1ZGZhMzc3YiAxMDA2NDQK
LS0tIGEvV2ViS2l0VG9vbHMvU2NyaXB0cy93ZWJraXRweS9sYXlvdXRfdGVzdHMvcG9ydC93ZWJr
aXQucHkKKysrIGIvV2ViS2l0VG9vbHMvU2NyaXB0cy93ZWJraXRweS9sYXlvdXRfdGVzdHMvcG9y
dC93ZWJraXQucHkKQEAgLTQ2LDYgKzQ2LDggQEAgaW1wb3J0IG9wZXJhdG9yCiBpbXBvcnQgdGVt
cGZpbGUKIGltcG9ydCBzaHV0aWwKIAoraW1wb3J0IHdlYmtpdHB5LmNvbW1vbi5uZXQuYnVpbGRi
b3QgYXMgYnVpbGRib3QKK2Zyb20gd2Via2l0cHkuY29tbW9uLm5ldC5yZXN1bHRzZXQgaW1wb3J0
IEFnZ3JlZ2F0ZVJlc3VsdFNldAogaW1wb3J0IHdlYmtpdHB5LmNvbW1vbi5zeXN0ZW0ub3NwYXRo
IGFzIG9zcGF0aAogaW1wb3J0IHdlYmtpdHB5LmxheW91dF90ZXN0cy5sYXlvdXRfcGFja2FnZS50
ZXN0X291dHB1dCBhcyB0ZXN0X291dHB1dAogaW1wb3J0IHdlYmtpdHB5LmxheW91dF90ZXN0cy5w
b3J0LmJhc2UgYXMgYmFzZQpAQCAtNzksNiArODEsMzQgQEAgY2xhc3MgV2ViS2l0UG9ydChiYXNl
LlBvcnQpOgogICAgIGRlZiB2ZXJzaW9uKHNlbGYpOgogICAgICAgICByZXR1cm4gJycKIAorICAg
IGRlZiBidWlsZGJvdF9yZXN1bHRzZXQoc2VsZiwgcGxhdGZvcm1zKToKKyAgICAgICAgcGxhdGZv
cm1fYnVpbGRlcnMgPSB7CisgICAgICAgICAgICAnbWFjLXNub3dsZW9wYXJkJzogJ1Nub3dMZW9w
YXJkIEludGVsIFJlbGVhc2UgKFRlc3RzKScsCisgICAgICAgICAgICAnbWFjLWxlb3BhcmQnOiAn
TGVvcGFyZCBJbnRlbCBEZWJ1ZyAoVGVzdHMpJywKKyAgICAgICAgICAgICd3aW4nOiAnV2luZG93
cyA3IFJlbGVhc2UgKFdlYktpdDIgVGVzdHMpJywKKyAgICAgICAgICAgICdjaHJvbWl1bS1saW51
eCc6ICdHVEsgTGludXggMzItYml0IFJlbGVhc2UnLAorICAgICAgICB9CisKKyAgICAgICAgZm9y
IHBsYXRmb3JtIGluIHBsYXRmb3JtczoKKyAgICAgICAgICAgIGlmIHBsYXRmb3JtIG5vdCBpbiBw
bGF0Zm9ybV9idWlsZGVyczoKKyAgICAgICAgICAgICAgICByYWlzZSBFeGNlcHRpb24oIkNhbid0
IGZpbmQgYnVpbGRlciBmb3IgJXMiICUgcGxhdGZvcm0pCisKKyAgICAgICAgYmIgPSBidWlsZGJv
dC5CdWlsZEJvdCgpCisgICAgICAgIHJlc3VsdHNldHMgPSBbXQorICAgICAgICBidWlsZGVyc19i
eV9uYW1lID0ge30KKworICAgICAgICBmb3IgYnVpbGRlciBpbiBiYi5idWlsZGVycygpOgorICAg
ICAgICAgICAgYnVpbGRlcnNfYnlfbmFtZVtidWlsZGVyLm5hbWUoKV0gPSBidWlsZGVyCisKKyAg
ICAgICAgZm9yIHBsYXRmb3JtIGluIHBsYXRmb3JtczoKKyAgICAgICAgICAgIGJ1aWxkZXIgPSBi
dWlsZGVyc19ieV9uYW1lW3BsYXRmb3JtX2J1aWxkZXJzW3BsYXRmb3JtXV0KKyAgICAgICAgICAg
IHByaW50ICJnb3QgYnVpbGRlciAlcyIgJSBidWlsZGVyLm5hbWUoKQorICAgICAgICAgICAgcnMg
PSBidWlsZGVyLmxhdGVzdF9idWlsZCgpLnJlc3VsdHMoKQorICAgICAgICAgICAgcnMuc2V0X3Bs
YXRmb3JtKHBsYXRmb3JtKQorICAgICAgICAgICAgcmVzdWx0c2V0cy5hcHBlbmQocnMpCisKKyAg
ICAgICAgcmV0dXJuIEFnZ3JlZ2F0ZVJlc3VsdFNldChyZXN1bHRzZXRzKQorCiAgICAgZGVmIF9i
dWlsZF9kcml2ZXIoc2VsZik6CiAgICAgICAgIGNvbmZpZ3VyYXRpb24gPSBzZWxmLmdldF9vcHRp
b24oJ2NvbmZpZ3VyYXRpb24nKQogICAgICAgICByZXR1cm4gc2VsZi5fY29uZmlnLmJ1aWxkX2R1
bXByZW5kZXJ0cmVlKGNvbmZpZ3VyYXRpb24pCmRpZmYgLS1naXQgYS9XZWJLaXRUb29scy9TY3Jp
cHRzL3dlYmtpdHB5L3Rvb2wvY29tbWFuZHMvX19pbml0X18ucHkgYi9XZWJLaXRUb29scy9TY3Jp
cHRzL3dlYmtpdHB5L3Rvb2wvY29tbWFuZHMvX19pbml0X18ucHkKaW5kZXggZDJhYTUwM2QxODU2
MWRlYWIyY2FlNzAwZGY2ZDQ5M2E5YjA1ZmNmMy4uYzA1OTZlNzg5MjJlZWQzZTAxNTcyZjM4YTQy
MmVhY2IzNWM4YjU5MSAxMDA2NDQKLS0tIGEvV2ViS2l0VG9vbHMvU2NyaXB0cy93ZWJraXRweS90
b29sL2NvbW1hbmRzL19faW5pdF9fLnB5CisrKyBiL1dlYktpdFRvb2xzL1NjcmlwdHMvd2Via2l0
cHkvdG9vbC9jb21tYW5kcy9fX2luaXRfXy5weQpAQCAtNyw2ICs3LDcgQEAgZnJvbSB3ZWJraXRw
eS50b29sLmNvbW1hbmRzLnByZXR0eWRpZmYgaW1wb3J0IFByZXR0eURpZmYKIGZyb20gd2Via2l0
cHkudG9vbC5jb21tYW5kcy5xdWVyaWVzIGltcG9ydCAqCiBmcm9tIHdlYmtpdHB5LnRvb2wuY29t
bWFuZHMucXVldWVzIGltcG9ydCAqCiBmcm9tIHdlYmtpdHB5LnRvb2wuY29tbWFuZHMucmViYXNl
bGluZSBpbXBvcnQgUmViYXNlbGluZQorZnJvbSB3ZWJraXRweS50b29sLmNvbW1hbmRzLnJlYmFz
ZWxpbmUyLnJlYmFzZWxpbmUyIGltcG9ydCBSZWJhc2VsaW5lMgogZnJvbSB3ZWJraXRweS50b29s
LmNvbW1hbmRzLnJlYmFzZWxpbmVzZXJ2ZXIgaW1wb3J0IFJlYmFzZWxpbmVTZXJ2ZXIKIGZyb20g
d2Via2l0cHkudG9vbC5jb21tYW5kcy5zaGVyaWZmYm90IGltcG9ydCAqCiBmcm9tIHdlYmtpdHB5
LnRvb2wuY29tbWFuZHMudXBsb2FkIGltcG9ydCAqCmRpZmYgLS1naXQgYS9XZWJLaXRUb29scy9T
Y3JpcHRzL3dlYmtpdHB5L3Rvb2wvY29tbWFuZHMvcmViYXNlbGluZTIvX19pbml0X18ucHkgYi9X
ZWJLaXRUb29scy9TY3JpcHRzL3dlYmtpdHB5L3Rvb2wvY29tbWFuZHMvcmViYXNlbGluZTIvX19p
bml0X18ucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMC4uZWY2NWJlZTViYjc3ZTk2ZWJjN2NkOWM0NzY0MDY5MGZiZGE4
YWMxOQotLS0gL2Rldi9udWxsCisrKyBiL1dlYktpdFRvb2xzL1NjcmlwdHMvd2Via2l0cHkvdG9v
bC9jb21tYW5kcy9yZWJhc2VsaW5lMi9fX2luaXRfXy5weQpAQCAtMCwwICsxIEBACisjIFJlcXVp
cmVkIGZvciBQeXRob24gdG8gc2VhcmNoIHRoaXMgZGlyZWN0b3J5IGZvciBtb2R1bGUgZmlsZXMK
ZGlmZiAtLWdpdCBhL1dlYktpdFRvb2xzL1NjcmlwdHMvd2Via2l0cHkvdG9vbC9jb21tYW5kcy9y
ZWJhc2VsaW5lMi9idWNrZXQucHkgYi9XZWJLaXRUb29scy9TY3JpcHRzL3dlYmtpdHB5L3Rvb2wv
Y29tbWFuZHMvcmViYXNlbGluZTIvYnVja2V0LnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4
IDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAuLjIwMTBlMjRlNjA0Y2Ew
NmQ5ZDkzNGYyMWY2MjUxNDMyOWU2ZmVkYTIKLS0tIC9kZXYvbnVsbAorKysgYi9XZWJLaXRUb29s
cy9TY3JpcHRzL3dlYmtpdHB5L3Rvb2wvY29tbWFuZHMvcmViYXNlbGluZTIvYnVja2V0LnB5CkBA
IC0wLDAgKzEsMjI4IEBACisjIS91c3IvYmluL2VudiBweXRob24KKyMgQ29weXJpZ2h0IChDKSAy
MDEwIEdvb2dsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisjCisjIFJlZGlzdHJpYnV0aW9u
IGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorIyBt
b2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNv
bmRpdGlvbnMKKyMgYXJlIG1ldDoKKyMKKyMgMS4gIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2Ug
Y29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisjICAgICBub3RpY2UsIHRoaXMg
bGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisjIDIuICBS
ZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNv
cHlyaWdodAorIyAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZv
bGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorIyAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3Ro
ZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyMKKyMgVEhJUyBT
T0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBBTkQgSVRTIENPTlRSSUJVVE9SUyAiQVMgSVMi
IEFORCBBTlkKKyMgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVU
IE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRAorIyBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJ
TElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCisjIERJU0NMQUlN
RUQuIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIE9SIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxF
IEZPUiBBTlkKKyMgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBM
QVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMKKyMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1J
VEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworIyBM
T1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBI
T1dFVkVSIENBVVNFRCBBTkQKKyMgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIg
SU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyMgKElOQ0xVRElORyBORUdM
SUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9G
CisjIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0Yg
U1VDSCBEQU1BR0UuCisKKworY2xhc3MgSW5kZW50ZWRMb2dnZXIob2JqZWN0KToKKyAgICAiIiJM
b2dnZXIgdGhhdCBwcmludHMgaW5kZW50ZWQgbWVzc2FnZXMiIiIKKyAgICBkZWYgX19pbml0X18o
c2VsZiwgbG9nZ2VyPU5vbmUpOgorICAgICAgICBzZWxmLl9sb2dnZXIgPSBsb2dnZXIKKyAgICAg
ICAgc2VsZi5faW5kZW50ID0gMAorCisgICAgZGVmIGluZGVudChzZWxmKToKKyAgICAgICAgc2Vs
Zi5faW5kZW50ICs9IDEKKworICAgIGRlZiBvdXRkZW50KHNlbGYpOgorICAgICAgICBzZWxmLl9p
bmRlbnQgLT0gMQorCisgICAgZGVmIGxvZyhzZWxmLCBtZXNzYWdlKToKKyAgICAgICAgbWVzc2Fn
ZSA9ICcgICcgKiBzZWxmLl9pbmRlbnQgKyBtZXNzYWdlCisgICAgICAgIGlmIHNlbGYuX2xvZ2dl
ciBpcyBOb25lOgorICAgICAgICAgICAgcHJpbnQgbWVzc2FnZQorICAgICAgICBlbHNlOgorICAg
ICAgICAgICAgc2VsZi5fbG9nZ2VyKG1lc3NhZ2UpCisKKworY2xhc3MgQnVja2V0KG9iamVjdCk6
CisgICAgIiIiQnVja2V0cyBob2xkIG90aGVyIGJ1Y2tldHMgaW4gYSB0cmVlIHRoYXQgcmVmbGVj
dHMgdGhlIHRlc3QgZmFsbGJhY2sKKyAgICAgICBvcmRlci4iIiIKKyAgICBkZWYgX19pbml0X18o
c2VsZiwgbmFtZSk6CisgICAgICAgIHNlbGYuX25hbWUgPSBuYW1lCisgICAgICAgIHNlbGYuX2No
aWxkcmVuID0gW10KKyAgICAgICAgc2VsZi5fcmVzdWx0ID0gTm9uZQorICAgICAgICBzZWxmLl9p
bXBsaWNpdF9yZXN1bHQgPSBOb25lCisgICAgICAgICMgQWdncmVnYXRlIGJ1Y2tldHMgZG9uJ3Qg
Z2V0IHJlc3VsdHMgZGlyZWN0bHkgZnJvbSBidWlsZGJvdC4KKyAgICAgICAgc2VsZi5faXNfYWdn
cmVnYXRlID0gRmFsc2UKKworICAgIGRlZiBfb25fY2hhbmdlZChzZWxmKToKKyAgICAgICAgZm9y
IGNoaWxkIGluIHNlbGYuX2NoaWxkcmVuOgorICAgICAgICAgICAgY2hpbGQuc2V0X2ltcGxpY2l0
KHNlbGYuaW1wbGljaXRfcmVzdWx0KCkpCisKKyAgICBkZWYgX2FsbF9lcXVhbChzZWxmLCByZXN1
bHRzKToKKyAgICAgICAgaWYgbGVuKHJlc3VsdHMpID09IDA6CisgICAgICAgICAgICByZXR1cm4g
VHJ1ZQorICAgICAgICBjb250ZW50cyA9IHJlc3VsdHNbMF0uY29udGVudHMoKQorICAgICAgICBy
ZXR1cm4gYWxsKG1hcChsYW1iZGEgeDogeC5jb250ZW50cygpID09IGNvbnRlbnRzLCByZXN1bHRz
KSkKKworICAgIGRlZiBkdW1wKHNlbGYsIGxvZ2dlcj1JbmRlbnRlZExvZ2dlcigpKToKKyAgICAg
ICAgbG9nZ2VyLmxvZygiQnVja2V0OiVzIHsiICUgc2VsZi5fbmFtZSkKKyAgICAgICAgbG9nZ2Vy
LmluZGVudCgpCisgICAgICAgIGxvZ2dlci5sb2coIlJlc3VsdCA9ICVzIiAlIHNlbGYuX3Jlc3Vs
dCkKKyAgICAgICAgbG9nZ2VyLmxvZygiSW1wbGljaXQgcmVzdWx0ID0gJXMiICUgc2VsZi5pbXBs
aWNpdF9yZXN1bHQoKSkKKyAgICAgICAgZm9yIGNoaWxkIGluIHNlbGYuX2NoaWxkcmVuOgorICAg
ICAgICAgICAgY2hpbGQuZHVtcChsb2dnZXIpCisgICAgICAgIGxvZ2dlci5vdXRkZW50KCkKKyAg
ICAgICAgbG9nZ2VyLmxvZygifSIpCisKKyAgICBkZWYgbmFtZShzZWxmKToKKyAgICAgICAgcmV0
dXJuIHNlbGYuX25hbWUKKworICAgIGRlZiBtYXJrX2FzX2FnZ3JlZ2F0ZShzZWxmKToKKyAgICAg
ICAgIiIiQnVja2V0cyB0aGF0IGRvbid0IG1hcCB0byBhIHNwZWNpZmljIHBsYXRmb3JtIGFyZSAn
YWdncmVnYXRlJworICAgICAgICBidWNrZXRzLiAgQWdncmVnYXRlIGJ1Y2tldHMgY2FuIG92ZXJ3
cml0ZSB0aGVpciBvd24gcmVzdWx0cyB3aXRoIHRob3NlCisgICAgICAgIG9mIHRoZWlyIGNoaWxk
cmVuIGlmIHRoZWlyIGNoaWxkcmVuIGhhdmUgcmVzdWx0cyB0aGF0IGFsbCBtYXRjaCBiZWNhdXNl
CisgICAgICAgIGFnZ3JlZ2F0ZXMgYXJlIGRlZmluZWQgZW50aXJlbHkgYnkgdGhlaXIgY2hpbGRy
ZW4gYW5kIG5vdCB0aGVpciBvd24KKyAgICAgICAgdGFyZ2V0ZWQgcmVzdWx0cy4iIiIKKyAgICAg
ICAgc2VsZi5faXNfYWdncmVnYXRlID0gVHJ1ZQorCisgICAgZGVmIGFwcGVuZChzZWxmLCBjaGls
ZCk6CisgICAgICAgIHNlbGYuX2NoaWxkcmVuLmFwcGVuZChjaGlsZCkKKyAgICAgICAgc2VsZi5f
b25fY2hhbmdlZCgpCisKKyAgICBkZWYgaW1wbGljaXRfcmVzdWx0KHNlbGYpOgorICAgICAgICBp
ZiBzZWxmLl9yZXN1bHQgaXMgbm90IE5vbmU6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5fcmVz
dWx0CisgICAgICAgIHJldHVybiBzZWxmLl9pbXBsaWNpdF9yZXN1bHQKKworICAgIGRlZiBzZXRf
cmVzdWx0KHNlbGYsIHJlc3VsdCk6CisgICAgICAgIGlmIHNlbGYuX3Jlc3VsdCBpcyBOb25lOgor
ICAgICAgICAgICAgc2VsZi5fcmVzdWx0ID0gcmVzdWx0CisgICAgICAgICAgICBzZWxmLl9vbl9j
aGFuZ2VkKCkKKyAgICAgICAgZWxpZiByZXN1bHQuaXNfcmViYXNlbGluZV9vZihzZWxmLl9yZXN1
bHQpOgorICAgICAgICAgICAgc2VsZi5fcmVzdWx0ID0gcmVzdWx0CisgICAgICAgICAgICBzZWxm
Ll9vbl9jaGFuZ2VkKCkKKyAgICAgICAgZWxpZiBzZWxmLl9yZXN1bHQuaXNfcmViYXNlbGluZV9v
ZihyZXN1bHQpOgorICAgICAgICAgICAgcGFzcworICAgICAgICBlbGlmIHNlbGYuX3Jlc3VsdCA9
PSByZXN1bHQ6CisgICAgICAgICAgICByYWlzZSBFeGNlcHRpb24oIlNhbWUgcmVzdWx0IGJlaW5n
IGluc2VydGVkIGFnYWluIGludG8gYnVja2V0ICVzOiAlcyA8LSAlcyIgJSAoc2VsZiwgc2VsZi5f
cmVzdWx0LCByZXN1bHQpKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmFpc2UgRXhjZXB0
aW9uKCJDb25mbGljdGluZyByZXN1bHRzICVzIGFuZCAlcyBhc3NpZ25lZCB0byBidWNrZXQgJXMi
ICUKKyAgICAgICAgICAgICAgICAgICAgKHNlbGYuX3Jlc3VsdCwgcmVzdWx0LCBzZWxmLl9uYW1l
KSkKKworICAgIGRlZiBjbGVhcl9yZXN1bHQoc2VsZik6CisgICAgICAgIHNlbGYuX3Jlc3VsdCA9
IE5vbmUKKyAgICAgICAgc2VsZi5fb25fY2hhbmdlZCgpCisKKyAgICBkZWYgcmVzdWx0KHNlbGYp
OgorICAgICAgICByZXR1cm4gc2VsZi5fcmVzdWx0CisKKyAgICBkZWYgc2V0X2ltcGxpY2l0KHNl
bGYsIGltcGxpY2l0X3Jlc3VsdCk6CisgICAgICAgIHNlbGYuX2ltcGxpY2l0X3Jlc3VsdCA9IGlt
cGxpY2l0X3Jlc3VsdAorICAgICAgICBzZWxmLl9vbl9jaGFuZ2VkKCkKKworICAgIGRlZiBfc2Ft
ZV9pbXBsaWNpdF9yZXN1bHQoc2VsZiwgb3RoZXIpOgorICAgICAgICBpZiBzZWxmLmltcGxpY2l0
X3Jlc3VsdCgpIGlzIE5vbmU6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5pbXBsaWNpdF9yZXN1
bHQoKSA9PSBvdGhlci5pbXBsaWNpdF9yZXN1bHQoKQorICAgICAgICByZXR1cm4gb3RoZXIuaW1w
bGljaXRfcmVzdWx0KCkuc2FtZV9jb250ZW50KHNlbGYuaW1wbGljaXRfcmVzdWx0KCkpCisKKyAg
ICBkZWYgX2dldF9jb21tb25fY2hpbGRfcmVzdWx0KHNlbGYsIHJlc3VsdHMpOgorICAgICAgICBp
ZiBsZW4ocmVzdWx0cykgPT0gMDoKKyAgICAgICAgICAgIHJldHVybiBOb25lCisKKyAgICAgICAg
Zmlyc3RfcmVzdWx0ID0gcmVzdWx0c1swXQorICAgICAgICByZXN1bHRfdG9fcmV0dXJuID0gZmly
c3RfcmVzdWx0CisgICAgICAgIGZvciByZXN1bHQgaW4gcmVzdWx0c1sxOl06CisgICAgICAgICAg
ICBpZiBub3QgcmVzdWx0LnNhbWVfY29udGVudChmaXJzdF9yZXN1bHQpOgorICAgICAgICAgICAg
ICAgIHJldHVybiBOb25lCisgICAgICAgICAgICBpZiByZXN1bHQuaXNfYWN0dWFsKCk6CisgICAg
ICAgICAgICAgICAgcmVzdWx0X3RvX3JldHVybiA9IHJlc3VsdCAgICMgUHJlZmVyIHRvIHJldHVy
biBhY3R1YWwgcmVzdWx0cy4KKyAgICAgICAgcmV0dXJuIHJlc3VsdF90b19yZXR1cm4KKworICAg
IGRlZiBfaW5oZXJpdChzZWxmLCByZXN1bHQpOgorICAgICAgICBmb3IgY2hpbGQgaW4gc2VsZi5f
Y2hpbGRyZW46CisgICAgICAgICAgICBjaGlsZC5jbGVhcl9yZXN1bHQoKQorICAgICAgICBzZWxm
Ll9yZXN1bHQgPSByZXN1bHQucmV0YXJnZXQoc2VsZi5fbmFtZSkKKyAgICAgICAgc2VsZi5fb25f
Y2hhbmdlZCgpCisKKyAgICBkZWYgX2F0dGVtcHRfdG9faW5oZXJpdChzZWxmKToKKyAgICAgICAg
IiIiVHJ5IHRvIGluaGVyaXQgYSByZXN1bHQgZnJvbSBjaGlsZHJlbi4gVGhpcyB3aWxsIG9ubHkg
aGFwcGVuIGlmIGFsbAorICAgICAgICAgICAgICBjaGlsZHJlbiBoYXZlIHRoZSBzYW1lIHJlc3Vs
dCIiIgorICAgICAgICBjaGlsZF9yZXN1bHRzID0gbWFwKGxhbWJkYSBjOiBjLmltcGxpY2l0X3Jl
c3VsdCgpLCBzZWxmLl9jaGlsZHJlbikKKyAgICAgICAgY2hpbGRfcmVzdWx0cyA9IGZpbHRlcihs
YW1iZGEgcjogciBpcyBub3QgTm9uZSwgY2hpbGRfcmVzdWx0cykKKyAgICAgICAgdG9faW5oZXJp
dCA9IHNlbGYuX2dldF9jb21tb25fY2hpbGRfcmVzdWx0KGNoaWxkX3Jlc3VsdHMpCisKKyAgICAg
ICAgaWYgdG9faW5oZXJpdCBpcyBOb25lOgorICAgICAgICAgICAgcmV0dXJuIEZhbHNlCisKKyAg
ICAgICAgIyBXZSBoYXZlIGEgcmVzdWx0IHdlIGNvdWxkIHBvdGVudGlhbGx5IGluaGVyaXQuLi4K
KyAgICAgICAgaWYgc2VsZi5pbXBsaWNpdF9yZXN1bHQoKSBpcyBOb25lOgorICAgICAgICAgICAg
c2VsZi5faW5oZXJpdCh0b19pbmhlcml0KQorICAgICAgICBlbGlmIHRvX2luaGVyaXQuaXNfbmV3
ZXJfdGhhbihzZWxmLmltcGxpY2l0X3Jlc3VsdCgpKSBhbmQgc2VsZi5pc19hZ2dyZWdhdGUoKToK
KyAgICAgICAgICAgIHNlbGYuX2luaGVyaXQodG9faW5oZXJpdCkKKyAgICAgICAgZWxzZToKKyAg
ICAgICAgICAgIHJldHVybiBGYWxzZQorICAgICAgICByZXR1cm4gVHJ1ZQorCisgICAgZGVmIGlz
X2FnZ3JlZ2F0ZShzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX2lzX2FnZ3JlZ2F0ZQorCisg
ICAgZGVmIGNvbGxhcHNlKHNlbGYpOgorICAgICAgICAiIiJEZWxldGVzIHJlZHVuZGFudCByZXN1
bHRzIGluIHRoZSB0cmVlIHN0YXJ0aW5nIGF0IHRoaXMgYnVja2V0IiIiCisgICAgICAgIGZvciBj
aGlsZCBpbiBzZWxmLl9jaGlsZHJlbjoKKyAgICAgICAgICAgIGNoaWxkLmNvbGxhcHNlKCkKKwor
ICAgICAgICBpZiBzZWxmLl9hdHRlbXB0X3RvX2luaGVyaXQoKToKKyAgICAgICAgICAgIHJldHVy
bgorCisgICAgICAgIGZvciBjaGlsZCBpbiBzZWxmLl9jaGlsZHJlbjoKKyAgICAgICAgICAgIGlm
IHNlbGYuX3NhbWVfaW1wbGljaXRfcmVzdWx0KGNoaWxkKToKKyAgICAgICAgICAgICAgICBjaGls
ZC5jbGVhcl9yZXN1bHQoKQorCisgICAgZGVmIGlzX2VtcHR5KHNlbGYpOgorICAgICAgICByZXR1
cm4gc2VsZi5fcmVzdWx0IGlzIE5vbmUKKworICAgIGRlZiByZXN1bHRzKHNlbGYsIHIpOgorICAg
ICAgICBpZiBub3Qgc2VsZi5pc19lbXB0eSgpOgorICAgICAgICAgICAgci5hcHBlbmQoc2VsZi5f
cmVzdWx0KQorICAgICAgICBmb3IgYyBpbiBzZWxmLl9jaGlsZHJlbjoKKyAgICAgICAgICAgIGMu
cmVzdWx0cyhyKQorCisKK2NsYXNzIEJ1Y2tldFRyZWUob2JqZWN0KToKKyAgICAiIiJIZWxwZXIg
Y2xhc3MgZm9yIGNvbnN0cnVjdGluZyBhbmQgaW5kZXhpbmcgYSBoaWVyYXJjaHkgb2YgQnVja2V0
cy4iIiIKKyAgICBkZWYgX19pbml0X18oc2VsZik6CisgICAgICAgIHNlbGYuX2J1Y2tldHMgPSB7
fQorICAgICAgICBzZWxmLl9yb290X2J1Y2tldCA9IHNlbGYuX2dldF9vcl9jcmVhdGVfYnVja2V0
KE5vbmUpCisKKyAgICBkZWYgX2dldF9vcl9jcmVhdGVfYnVja2V0KHNlbGYsIGJ1Y2tldF9uYW1l
KToKKyAgICAgICAgaWYgYnVja2V0X25hbWUgbm90IGluIHNlbGYuX2J1Y2tldHM6CisgICAgICAg
ICAgICBzZWxmLl9idWNrZXRzW2J1Y2tldF9uYW1lXSA9IEJ1Y2tldChidWNrZXRfbmFtZSkKKyAg
ICAgICAgcmV0dXJuIHNlbGYuX2J1Y2tldHNbYnVja2V0X25hbWVdCisKKyAgICBkZWYgbWFrZV9i
dWNrZXQoc2VsZiwgYnVja2V0X25hbWUsICphcmdzKToKKyAgICAgICAgYiA9IHNlbGYuX2dldF9v
cl9jcmVhdGVfYnVja2V0KGJ1Y2tldF9uYW1lKQorCisgICAgICAgIGZvciBhcmcgaW4gYXJnczoK
KyAgICAgICAgICAgIGIuYXBwZW5kKGFyZykKKyAgICAgICAgcmV0dXJuIGIKKworICAgIGRlZiBp
bnNlcnRfcmVzdWx0KHNlbGYsIHJlc3VsdCk6CisgICAgICAgIGlmIHJlc3VsdC5wbGF0Zm9ybSgp
IGluIHNlbGYuX2J1Y2tldHMua2V5cygpOgorICAgICAgICAgICAgc2VsZi5fYnVja2V0c1tyZXN1
bHQucGxhdGZvcm0oKV0uc2V0X3Jlc3VsdChyZXN1bHQpCisKKyAgICBkZWYgcmVzdWx0cyhzZWxm
KToKKyAgICAgICAgciA9IFtdCisgICAgICAgIHNlbGYuX3Jvb3RfYnVja2V0LnJlc3VsdHMocikK
KyAgICAgICAgcmV0dXJuIHIKKworICAgIGRlZiBjb2xsYXBzZShzZWxmKToKKyAgICAgICAgc2Vs
Zi5fcm9vdF9idWNrZXQuY29sbGFwc2UoKQorCisgICAgZGVmIGdldF9idWNrZXQoc2VsZiwgYnVj
a2V0X25hbWUpOgorICAgICAgICByZXR1cm4gc2VsZi5fYnVja2V0c1tidWNrZXRfbmFtZV0KKwor
ICAgIGRlZiByb290X2J1Y2tldChzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuZ2V0X2J1Y2tl
dChOb25lKQorCisgICAgZGVmIGR1bXAoc2VsZik6CisgICAgICAgIHNlbGYucm9vdF9idWNrZXQo
KS5kdW1wKCkKZGlmZiAtLWdpdCBhL1dlYktpdFRvb2xzL1NjcmlwdHMvd2Via2l0cHkvdG9vbC9j
b21tYW5kcy9yZWJhc2VsaW5lMi9idWNrZXRfdW5pdHRlc3QucHkgYi9XZWJLaXRUb29scy9TY3Jp
cHRzL3dlYmtpdHB5L3Rvb2wvY29tbWFuZHMvcmViYXNlbGluZTIvYnVja2V0X3VuaXR0ZXN0LnB5
Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAuLmY3Yjc1ZmE5Y2MzYjAwYzU5MzI0YTFmYTg2NmNhYzM3ODE2ODdkMWUKLS0t
IC9kZXYvbnVsbAorKysgYi9XZWJLaXRUb29scy9TY3JpcHRzL3dlYmtpdHB5L3Rvb2wvY29tbWFu
ZHMvcmViYXNlbGluZTIvYnVja2V0X3VuaXR0ZXN0LnB5CkBAIC0wLDAgKzEsMjczIEBACisjIS91
c3IvYmluL2VudiBweXRob24KKyMgQ29weXJpZ2h0IChDKSAyMDEwIEdvb2dsZSBJbmMuIEFsbCBy
aWdodHMgcmVzZXJ2ZWQuCisjCisjIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFu
ZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorIyBtb2RpZmljYXRpb24sIGFyZSBwZXJt
aXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyMgYXJlIG1ldDoK
KyMKKyMgMS4gIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUg
YWJvdmUgY29weXJpZ2h0CisjICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFu
ZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisjIDIuICBSZWRpc3RyaWJ1dGlvbnMgaW4gYmlu
YXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorIyAgICAgbm90aWNl
LCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGlu
IHRoZQorIyAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVk
IHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyMKKyMgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBC
WSBBUFBMRSBBTkQgSVRTIENPTlRSSUJVVE9SUyAiQVMgSVMiIEFORCBBTlkKKyMgRVhQUkVTUyBP
UiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUg
SU1QTElFRAorIyBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1Ig
QSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCisjIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxM
IEFQUExFIE9SIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkKKyMgRElSRUNULCBJ
TkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFM
IERBTUFHRVMKKyMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBP
RiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworIyBMT1NTIE9GIFVTRSwgREFUQSwgT1Ig
UFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKKyMg
T04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBM
SUFCSUxJVFksIE9SIFRPUlQKKyMgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkg
QVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisjIFRISVMgU09GVFdBUkUsIEVW
RU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKK2Zyb20g
YnVja2V0IGltcG9ydCBCdWNrZXQsIEJ1Y2tldFRyZWUKK2ltcG9ydCB1bml0dGVzdAorZnJvbSB3
ZWJraXRweS5jb21tb24ubmV0LnJlc3VsdF91bml0dGVzdCBpbXBvcnQgRmFrZVJlc3VsdAorCisK
K2NsYXNzIEJ1Y2tldFRlc3QodW5pdHRlc3QuVGVzdENhc2UpOgorICAgIGRlZiBzZXRVcChzZWxm
KToKKyAgICAgICAgc2VsZi5fbWFjID0gQnVja2V0KCdtYWMnKQorICAgICAgICBzZWxmLl9tYWNf
bGVvcGFyZCA9IEJ1Y2tldCgnbWFjX2xlb3BhcmQnKQorICAgICAgICBzZWxmLl9saW51eCA9IEJ1
Y2tldCgnbGludXgnKQorICAgICAgICBzZWxmLl9ub25lID0gQnVja2V0KE5vbmUpCisKKyAgICBk
ZWYgdGVzdENoaWxkQnVja2V0SW5oZXJpdHNSZXN1bHRPZlBhcmVudEFzSW1wbGljaXRSZXN1bHQo
c2VsZik6CisgICAgICAgIHNlbGYuX21hYy5zZXRfcmVzdWx0KEZha2VSZXN1bHQoJ21hYycsICd0
ZXh0JywgJ2FiYzEyMycpKQorICAgICAgICBzZWxmLl9tYWMuYXBwZW5kKHNlbGYuX21hY19sZW9w
YXJkKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscygnYWJjMTIzJywgc2VsZi5fbWFjX2xlb3Bh
cmQuaW1wbGljaXRfcmVzdWx0KCkuY29udGVudHMoKSkKKworICAgIGRlZiB0ZXN0Q29sbGFwc2VX
b3Jrc1doZW5DaGlsZEhhc0VxdWFsUmVzdWx0cyhzZWxmKToKKyAgICAgICAgc2VsZi5fbWFjLnNl
dF9yZXN1bHQoRmFrZVJlc3VsdCgnbWFjJywgJ3RleHQnLCAnYWJjMTIzJykpCisgICAgICAgIHNl
bGYuX21hY19sZW9wYXJkLnNldF9yZXN1bHQoRmFrZVJlc3VsdCgnbWFjJywgJ3RleHQnLCAnYWJj
MTIzJykpCisgICAgICAgIHNlbGYuX21hYy5hcHBlbmQoc2VsZi5fbWFjX2xlb3BhcmQpCisKKyAg
ICAgICAgc2VsZi5fbWFjLmNvbGxhcHNlKCkKKworICAgICAgICBzZWxmLmFzc2VydFRydWUoc2Vs
Zi5fbWFjX2xlb3BhcmQuaXNfZW1wdHkoKSkKKworICAgIGRlZiB0ZXN0Q29sbGFwc2VzQ2hpbGRX
aXRoSW1wbGljaXRSZXN1bHRGcm9tUGFyZW50KHNlbGYpOgorICAgICAgICBzZWxmLl9tYWMuc2V0
X3Jlc3VsdChGYWtlUmVzdWx0KCdtYWMnLCAndGV4dCcsICdhYmMxMjMnKSkKKyAgICAgICAgc2Vs
Zi5fbWFjLmFwcGVuZChzZWxmLl9tYWNfbGVvcGFyZCkKKworICAgICAgICBzZWxmLl9tYWMuY29s
bGFwc2UoKQorCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzZWxmLl9tYWNfbGVvcGFyZC5pc19l
bXB0eSgpKQorCisgICAgZGVmIHRlc3RDb2xsYXBzZXNDaGlsZFdpdGhJbXBsaWNpdFJlc3VsdEFu
ZEV4cGxpY2l0U2libGluZyhzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHNlbGYuX21h
Yy5pc19lbXB0eSgpKQorICAgICAgICBzZWxmLl9tYWMuc2V0X3Jlc3VsdChGYWtlUmVzdWx0KCdt
YWMnLCAndGV4dCcsICdhYmMxMjMnKSkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShzZWxmLl9t
YWMuaXNfZW1wdHkoKSkKKyAgICAgICAgc2VsZi5fbWFjX2xlb3BhcmQuc2V0X3Jlc3VsdChGYWtl
UmVzdWx0KCdtYWMnLCAndGV4dCcsICdhYmMxMjMnKSkKKworICAgICAgICBzZWxmLmFzc2VydEZh
bHNlKHNlbGYuX21hYy5pc19lbXB0eSgpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscygnYWJj
MTIzJywgc2VsZi5fbWFjLmltcGxpY2l0X3Jlc3VsdCgpLmNvbnRlbnRzKCkpCisKKyAgICAgICAg
c2VsZi5fbWFjLmFwcGVuZChzZWxmLl9tYWNfbGVvcGFyZCkKKyAgICAgICAgc2VsZi5fbWFjLmFw
cGVuZChzZWxmLl9saW51eCkKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFscygnYWJjMTIzJywg
c2VsZi5fbWFjX2xlb3BhcmQuaW1wbGljaXRfcmVzdWx0KCkuY29udGVudHMoKSkKKworICAgICAg
ICBzZWxmLl9tYWMuY29sbGFwc2UoKQorCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzZWxmLl9s
aW51eC5pc19lbXB0eSgpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoc2VsZi5fbWFjX2xlb3Bh
cmQuaXNfZW1wdHkoKSkKKworICAgIGRlZiB0ZXN0Q2xlYXJzT25seUNoaWxkcmVuVGhhdEhhdmVU
aGVTYW1lUmVzdWx0cyhzZWxmKToKKyAgICAgICAgc2VsZi5fbWFjLnNldF9yZXN1bHQoRmFrZVJl
c3VsdCgnbWFjJywgJ3RleHQnLCAnYWJjMTIzJykpCisgICAgICAgIHNlbGYuX21hY19sZW9wYXJk
LnNldF9yZXN1bHQoRmFrZVJlc3VsdCgnbWFjLWxlb3BhcmQnLCAndGV4dCcsICdhYmMxMjMnKSkK
KyAgICAgICAgc2VsZi5fbGludXguc2V0X3Jlc3VsdChGYWtlUmVzdWx0KCdsaW51eCcsICd0ZXh0
JywgJ2RlZjQ1NicpKQorCisgICAgICAgIHNlbGYuX21hYy5hcHBlbmQoc2VsZi5fbWFjX2xlb3Bh
cmQpCisgICAgICAgIHNlbGYuX21hYy5hcHBlbmQoc2VsZi5fbGludXgpCisKKyAgICAgICAgc2Vs
Zi5fbWFjLmNvbGxhcHNlKCkKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFscygnYWJjMTIzJywg
c2VsZi5fbWFjLmltcGxpY2l0X3Jlc3VsdCgpLmNvbnRlbnRzKCkpCisgICAgICAgIHNlbGYuYXNz
ZXJ0RXF1YWxzKCdkZWY0NTYnLCBzZWxmLl9saW51eC5pbXBsaWNpdF9yZXN1bHQoKS5jb250ZW50
cygpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoc2VsZi5fbWFjX2xlb3BhcmQuaXNfZW1wdHko
KSkKKworICAgIGRlZiB0ZXN0Q29sbGFwc2VXb3Jrc0ZvckRlc2NlbmRlbnRzRGVlcGVyVGhhdERp
cmVjdENoaWxkcmVuKHNlbGYpOgorICAgICAgICBzZWxmLl9tYWMuc2V0X3Jlc3VsdChGYWtlUmVz
dWx0KCdtYWMnLCAndGV4dCcsICdhYmMxMjMnKSkKKyAgICAgICAgc2VsZi5fbGludXguc2V0X3Jl
c3VsdChGYWtlUmVzdWx0KCdsaW51eCcsICd0ZXh0JywgJ2FiYzEyMycpKQorCisgICAgICAgIHNl
bGYuX21hYy5hcHBlbmQoc2VsZi5fbWFjX2xlb3BhcmQpCisgICAgICAgIHNlbGYuX21hY19sZW9w
YXJkLmFwcGVuZChzZWxmLl9saW51eCkKKworICAgICAgICBzZWxmLl9tYWMuY29sbGFwc2UoKQor
CisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzZWxmLl9saW51eC5pc19lbXB0eSgpKQorCisgICAg
ZGVmIHRlc3RUaGF0Q29sbGFwc2luZ01haW50YWluc0NvcnJlY3RQbGF0Zm9ybShzZWxmKToKKyAg
ICAgICAgc2VsZi5fbWFjLmFwcGVuZChzZWxmLl9tYWNfbGVvcGFyZCkKKyAgICAgICAgc2VsZi5f
bm9uZS5hcHBlbmQoc2VsZi5fbWFjKQorCisgICAgICAgIHNlbGYuX21hY19sZW9wYXJkLnNldF9y
ZXN1bHQoRmFrZVJlc3VsdCgnbWFjLWxlb3BhcmQnLCAndGV4dCcsICdhYmMxMjMnKSkKKyAgICAg
ICAgc2VsZi5fbm9uZS5zZXRfcmVzdWx0KEZha2VSZXN1bHQoTm9uZSwgJ3RleHQnLCAnZGVmNDU2
JykpCisKKyAgICAgICAgc2VsZi5fbm9uZS5jb2xsYXBzZSgpCisKKyAgICAgICAgc2VsZi5hc3Nl
cnRFcXVhbHMoTm9uZSwgc2VsZi5fbWFjLmltcGxpY2l0X3Jlc3VsdCgpLnBsYXRmb3JtKCkpCisg
ICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKCdtYWMtbGVvcGFyZCcsIHNlbGYuX21hY19sZW9wYXJk
LmltcGxpY2l0X3Jlc3VsdCgpLnBsYXRmb3JtKCkpCisKKyAgICBkZWYgdGVzdFBhcmVudFdpdGhO
b1Jlc3VsdFdpbGxJbmhlcml0RnJvbUNoaWxkcmVuV2l0aFNhbWVSZXN1bHQoc2VsZik6CisgICAg
ICAgIHNlbGYuX21hYy5zZXRfcmVzdWx0KEZha2VSZXN1bHQoJ21hYycsICd0ZXh0JywgJ2FiYzEy
MycpKQorICAgICAgICBzZWxmLl9saW51eC5zZXRfcmVzdWx0KEZha2VSZXN1bHQoJ2xpbnV4Jywg
J3RleHQnLCAnYWJjMTIzJykpCisKKyAgICAgICAgc2VsZi5fbm9uZS5hcHBlbmQoc2VsZi5fbWFj
KQorICAgICAgICBzZWxmLl9ub25lLmFwcGVuZChzZWxmLl9saW51eCkKKworICAgICAgICBzZWxm
LmFzc2VydEVxdWFscyhOb25lLCBzZWxmLl9ub25lLmltcGxpY2l0X3Jlc3VsdCgpKQorCisgICAg
ICAgIHNlbGYuX25vbmUuY29sbGFwc2UoKQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKCdh
YmMxMjMnLCBzZWxmLl9ub25lLmltcGxpY2l0X3Jlc3VsdCgpLmNvbnRlbnRzKCkpCisKKyIiIgor
ICAgICAgICBUT0RPIE1ha2UgdGhpcyBpbnRvIHRlc3RzLgorCisgICAgICAgIENoaWxkcmVuIGFs
bCBoYXZlIHRoZSBzYW1lIGV4cGxpY2l0IHJlc3VsdCBhcyB0aGUgcGFyZW50LgorCisgICAgICAg
IEEgQSBBICAgICAgICBPIE8gTworICAgICAgICAgXHwvICAgIC0+ICAgIFx8LworICAgICAgICAg
IEEgICAgICAgICAgICBBCisKKworICAgICAgICBDaGlsZHJlbiBhbGwgaGF2ZSB0aGUgc2FtZSBy
ZXN1bHQsIGJ1dCB0aGUgcGFyZW50IGhhcyBub25lLgorCisgICAgICAgIEEgQSBBICAgICAgICBP
IE8gTworICAgICAgICAgXHwvICAgIC0+ICAgIFx8LworICAgICAgICAgIE8gICAgICAgICAgICBB
CisKKworICAgICAgICBPbmUgb2YgdGhlIGNoaWxkcmVuIGhhcyB0aGUgc2FtZSByZXN1bHQgYXMg
dGhlIHBhcmVudC4KKworICAgICAgICBBIEIgQyAgICAgICAgTyBCIEMKKyAgICAgICAgIFx8LyAg
ICAtPiAgICBcfC8KKyAgICAgICAgICBBICAgICAgICAgICAgQQorCisgICAgICAgIERlc2NlbmRl
bnRzIGFsbCBoYXZlIHNhbWUgZXhwbGljaXQgcmVzdWx0IGFzIHRoZSBhbmNlc3Rvci4KKworICAg
ICAgICBBIEEgQSAgICAgICAgTyBPIE8KKyAgICAgICAgIFx8LyAgICAtPiAgICBcfC8KKyAgICAg
ICAgICBPICAgICAgICAgICAgTworICAgICAgICAgIHwgICAgICAgICAgICB8CisgICAgICAgICAg
QSAgICAgICAgICAgIEEKKworICAgICAgICBXaGVyZSBBIGlzIGEgYnVja2V0IHdpdGggYSB0ZXN0
IHJlc3VsdCwgYW5kIE8gaXMgYW4gZW1wdHkgYnVja2V0LgorIiIiCisKKworY2xhc3MgQnVja2V0
VHJlZVRlc3QodW5pdHRlc3QuVGVzdENhc2UpOgorICAgIGRlZiB0ZXN0TmV3RXhwZWN0YXRpb25z
T3ZlcnJpZGVPbGRPbmVzKHNlbGYpOgorICAgICAgICBiID0gQnVja2V0VHJlZSgpCisgICAgICAg
IG1iID0gYi5tYWtlX2J1Y2tldAorICAgICAgICByb290ID0gbWIoTm9uZSwKKyAgICAgICAgICAg
IG1iKCdtYWMnKSwKKyAgICAgICAgICAgIG1iKCdsaW51eCcpLAorICAgICAgICAgICAgbWIoJ3dp
bicpKQorCisgICAgICAgIGIuaW5zZXJ0X3Jlc3VsdChGYWtlUmVzdWx0KE5vbmUsICd0ZXh0Jywg
J2FiYzEyMycsIFRydWUpKQorICAgICAgICBiLmluc2VydF9yZXN1bHQoRmFrZVJlc3VsdChOb25l
LCAndGV4dCcsICdkZWY0NTYnKSkKKworICAgICAgICBiLmNvbGxhcHNlKCkKKworICAgICAgICBz
ZWxmLmFzc2VydEVxdWFsKDEsIGxlbihiLnJlc3VsdHMoKSkpCisgICAgICAgIHNlbGYuYXNzZXJ0
RXF1YWwoJ2RlZjQ1NicsIGIucmVzdWx0cygpWzBdLmNvbnRlbnRzKCkpCisKKyAgICBkZWYgdGVz
dFJlYmFzZWxpbmluZ1N0aWxsV29ya3NJZk5ld1Jlc3VsdHNBcmVJbnNlcnRlZEZpcnN0KHNlbGYp
OgorICAgICAgICBiID0gQnVja2V0VHJlZSgpCisgICAgICAgIG1iID0gYi5tYWtlX2J1Y2tldAor
ICAgICAgICByb290ID0gbWIoTm9uZSwKKyAgICAgICAgICAgIG1iKCdtYWMnKSwKKyAgICAgICAg
ICAgIG1iKCdsaW51eCcpLAorICAgICAgICAgICAgbWIoJ3dpbicpKQorCisgICAgICAgIGIuaW5z
ZXJ0X3Jlc3VsdChGYWtlUmVzdWx0KE5vbmUsICd0ZXh0JywgJ2RlZjQ1NicpKQorICAgICAgICBi
Lmluc2VydF9yZXN1bHQoRmFrZVJlc3VsdChOb25lLCAndGV4dCcsICdhYmMxMjMnLCBUcnVlKSkK
KworICAgICAgICBiLmNvbGxhcHNlKCkKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKDEsIGxl
bihiLnJlc3VsdHMoKSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoJ2RlZjQ1NicsIGIucmVz
dWx0cygpWzBdLmNvbnRlbnRzKCkpCisKKyAgICBkZWYgdGVzdEtpZHNIYXZpbmdTYW1lUmViYXNl
bGluZUNhdXNlc092ZXJyaWRlT25QYXJlbnQoc2VsZik6CisgICAgICAgIGIgPSBCdWNrZXRUcmVl
KCkKKyAgICAgICAgbWIgPSBiLm1ha2VfYnVja2V0CisgICAgICAgIHJvb3QgPSBtYihOb25lLAor
ICAgICAgICAgICAgbWIoJ21hYycpLAorICAgICAgICAgICAgbWIoJ3dpbicpKQorICAgICAgICBi
LmdldF9idWNrZXQoTm9uZSkubWFya19hc19hZ2dyZWdhdGUoKQorCisgICAgICAgIGIuaW5zZXJ0
X3Jlc3VsdChGYWtlUmVzdWx0KE5vbmUsICd0ZXh0JywgJ29sZCByZXN1bHQnLCBUcnVlKSkKKyAg
ICAgICAgYi5pbnNlcnRfcmVzdWx0KEZha2VSZXN1bHQoJ21hYycsICd0ZXh0JywgJ25ldyByZXN1
bHQnKSkKKyAgICAgICAgYi5pbnNlcnRfcmVzdWx0KEZha2VSZXN1bHQoJ3dpbicsICd0ZXh0Jywg
J25ldyByZXN1bHQnKSkKKworICAgICAgICBiLmNvbGxhcHNlKCkKKworICAgICAgICBzZWxmLmFz
c2VydEVxdWFsKDEsIGxlbihiLnJlc3VsdHMoKSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwo
Tm9uZSwgYi5yZXN1bHRzKClbMF0ucGxhdGZvcm0oKSkKKworICAgIGRlZiB0ZXN0V2VEb250SW5o
ZXJpdEZyb21DaGlsZHJlbklmV2VBcmVOb3RBbkFnZ3JlZ2F0ZUJ1Y2tldChzZWxmKToKKyAgICAg
ICAgYiA9IEJ1Y2tldFRyZWUoKQorICAgICAgICBtYiA9IGIubWFrZV9idWNrZXQKKyAgICAgICAg
cm9vdCA9IG1iKE5vbmUsCisgICAgICAgICAgICBtYignbWFjJyksCisgICAgICAgICAgICBtYign
d2luJykpCisKKyAgICAgICAgYi5pbnNlcnRfcmVzdWx0KEZha2VSZXN1bHQoTm9uZSwgJ3RleHQn
LCAnb2xkIHJlc3VsdCcsIFRydWUpKQorICAgICAgICBiLmluc2VydF9yZXN1bHQoRmFrZVJlc3Vs
dCgnbWFjJywgJ3RleHQnLCAnbmV3IHJlc3VsdCcpKQorICAgICAgICBiLmluc2VydF9yZXN1bHQo
RmFrZVJlc3VsdCgnd2luJywgJ3RleHQnLCAnbmV3IHJlc3VsdCcpKQorCisgICAgICAgIGIuY29s
bGFwc2UoKQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoMywgbGVuKGIucmVzdWx0cygpKSkK
KworICAgIGRlZiB0ZXN0TXVsdGlQaGFzZWRDb2xsYXBzZVdvcmtzKHNlbGYpOgorICAgICAgICBi
ID0gQnVja2V0VHJlZSgpCisgICAgICAgIG1iID0gYi5tYWtlX2J1Y2tldAorICAgICAgICByb290
ID0gbWIoTm9uZSwKKyAgICAgICAgICAgIG1iKCdtYWMnLAorICAgICAgICAgICAgICAgIG1iKCdt
YWMtbGVvcGFyZCcpKSkKKworICAgICAgICBiLmdldF9idWNrZXQoTm9uZSkubWFya19hc19hZ2dy
ZWdhdGUoKQorCisgICAgICAgIGIuaW5zZXJ0X3Jlc3VsdChGYWtlUmVzdWx0KE5vbmUsICd0ZXh0
JywgJ29sZCByZXN1bHQnLCBUcnVlKSkKKyAgICAgICAgYi5pbnNlcnRfcmVzdWx0KEZha2VSZXN1
bHQoJ21hYycsICd0ZXh0JywgJ25ldyByZXN1bHQnKSkKKyAgICAgICAgYi5pbnNlcnRfcmVzdWx0
KEZha2VSZXN1bHQoJ21hYy1sZW9wYXJkJywgJ3RleHQnLCAnbmV3IHJlc3VsdCcpKQorCisgICAg
ICAgIGIuY29sbGFwc2UoKQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoMSwgbGVuKGIucmVz
dWx0cygpKSkKKworICAgIGRlZiB0ZXN0UGxhaW5PbGREZWR1cGVPbkxheW91dFRlc3RzV29ya3Mo
c2VsZik6CisgICAgICAgIGIgPSBCdWNrZXRUcmVlKCkKKyAgICAgICAgbWIgPSBiLm1ha2VfYnVj
a2V0CisgICAgICAgIHJvb3QgPSBtYihOb25lLAorICAgICAgICAgICAgbWIoJ21hYycsCisgICAg
ICAgICAgICAgICAgbWIoJ21hYy1sZW9wYXJkJywKKyAgICAgICAgICAgICAgICAgICAgbWIoJ21h
Yy1zbm93bGVvcGFyZCcpKSksCisgICAgICAgICAgICBtYignbGludXgnLAorICAgICAgICAgICAg
ICAgIG1iKCdjaHJvbWl1bS1saW51eCcpKSkKKworICAgICAgICBiLmluc2VydF9yZXN1bHQoRmFr
ZVJlc3VsdChOb25lLCAndGV4dCcsICdyZXN1bHQnLCBUcnVlKSkKKyAgICAgICAgYi5pbnNlcnRf
cmVzdWx0KEZha2VSZXN1bHQoJ2Nocm9taXVtLWxpbnV4JywgJ3RleHQnLCAncmVzdWx0JywgVHJ1
ZSkpCisKKyAgICAgICAgYi5jb2xsYXBzZSgpCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMo
MSwgbGVuKGIucmVzdWx0cygpKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoTm9uZSwgYi5y
ZXN1bHRzKClbMF0ucGxhdGZvcm0oKSkKKworICAgIGRlZiB0ZXN0Q29sbGFwc2VPbkJ1Y2tldHNX
aXRoTm9SZXN1bHREb2VzbnRDcmFzaChzZWxmKToKKyAgICAgICAgYiA9IEJ1Y2tldFRyZWUoKQor
ICAgICAgICBtYiA9IGIubWFrZV9idWNrZXQKKyAgICAgICAgcm9vdCA9IG1iKE5vbmUsCisgICAg
ICAgICAgICBtYignbWFjJywKKyAgICAgICAgICAgICAgICBtYignbWFjLWxlb3BhcmQnKSkpCisK
KyAgICAgICAgYi5jb2xsYXBzZSgpCisKK2lmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CisgICAg
dW5pdHRlc3QubWFpbigpCmRpZmYgLS1naXQgYS9XZWJLaXRUb29scy9TY3JpcHRzL3dlYmtpdHB5
L3Rvb2wvY29tbWFuZHMvcmViYXNlbGluZTIvcmViYXNlbGluZTIucHkgYi9XZWJLaXRUb29scy9T
Y3JpcHRzL3dlYmtpdHB5L3Rvb2wvY29tbWFuZHMvcmViYXNlbGluZTIvcmViYXNlbGluZTIucHkK
bmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMC4uZTJhZGYzYzViODFlZGYxMjQwZWE4N2VjNjU3OTI4MjQyY2NiMWIwZAotLS0g
L2Rldi9udWxsCisrKyBiL1dlYktpdFRvb2xzL1NjcmlwdHMvd2Via2l0cHkvdG9vbC9jb21tYW5k
cy9yZWJhc2VsaW5lMi9yZWJhc2VsaW5lMi5weQpAQCAtMCwwICsxLDk2IEBACisjIENvcHlyaWdo
dCAoYykgMjAxMCBHb29nbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorIworIyBSZWRpc3Ry
aWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhv
dXQKKyMgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxv
d2luZyBjb25kaXRpb25zIGFyZQorIyBtZXQ6CisjCisjICAgICAqIFJlZGlzdHJpYnV0aW9ucyBv
ZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisjIG5vdGljZSwg
dGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyMg
ICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBh
Ym92ZQorIyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhl
IGZvbGxvd2luZyBkaXNjbGFpbWVyCisjIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhl
ciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyMgZGlzdHJpYnV0aW9uLgorIyAgICAgKiBO
ZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisjIGNv
bnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVy
aXZlZCBmcm9tCisjIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVu
IHBlcm1pc3Npb24uCisjCisjIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlS
SUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyMgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1Mg
T1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyMgTElNSVRFRCBUTywg
VEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9S
CisjIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFM
TCBUSEUgQ09QWVJJR0hUCisjIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFO
WSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorIyBTUEVDSUFMLCBFWEVNUExBUlksIE9S
IENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisjIExJTUlURUQgVE8s
IFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNF
LAorIyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIg
Q0FVU0VEIEFORCBPTiBBTlkKKyMgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05U
UkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorIyAoSU5DTFVESU5HIE5FR0xJR0VOQ0Ug
T1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyMgT0YgVEhJ
UyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERB
TUFHRS4KKworZnJvbSB3ZWJraXRweS50b29sLm11bHRpY29tbWFuZHRvb2wgaW1wb3J0IEFic3Ry
YWN0RGVjbGFyYXRpdmVDb21tYW5kCitmcm9tIHdlYmtpdHB5LmNvbW1vbi5uZXQucmVzdWx0c2V0
IGltcG9ydCBSZXN1bHRTZXQKK2Zyb20gd2Via2l0cHkuY29tbW9uLm5ldC5yZXN1bHQgaW1wb3J0
IEltYWdlUmVzdWx0Citmcm9tIHdlYmtpdHB5LnRvb2wuY29tbWFuZHMucmViYXNlbGluZTIucmVi
YXNlbGluZXIgaW1wb3J0IFJlYmFzZWxpbmVyCisKK2Zyb20gb3B0cGFyc2UgaW1wb3J0IG1ha2Vf
b3B0aW9uCitpbXBvcnQgb3MKKworCitjbGFzcyBJbWFnZURpZmZlcihvYmplY3QpOgorICAgIGRl
ZiBfX2luaXRfXyhzZWxmLCBwb3J0KToKKyAgICAgICAgc2VsZi5fcG9ydCA9IHBvcnQKKworICAg
IGRlZiBzYW1lX2ltYWdlKHNlbGYsIGltZzEsIGltZzIpOgorICAgICAgICByZXR1cm4gbm90IHNl
bGYuX3BvcnQuZGlmZl9pbWFnZShpbWcxLCBpbWcyKQorCisKK2NsYXNzIFJlYmFzZWxpbmUyKEFi
c3RyYWN0RGVjbGFyYXRpdmVDb21tYW5kKToKKyAgICBuYW1lID0gInJlYmFzZWxpbmUyIgorICAg
IGhlbHBfdGV4dCA9ICJGZXRjaGVzIG5ldyBleHBlY3RlZCByZXN1bHRzIGZyb20gYnVpbGRib3Rz
LiIKKworICAgIGRlZiBfX2luaXRfXyhzZWxmKToKKyAgICAgICAgb3B0aW9ucyA9IFsKKyAgICAg
ICAgICAgIG1ha2Vfb3B0aW9uKCItLXBsYXRmb3JtcyIsIGFjdGlvbj0ic3RvcmUiLCBkZXN0PSJw
bGF0Zm9ybXMiLAorICAgICAgICAgICAgICAgIGhlbHA9IkNvbW1hIHNlcGFyYXRlZCBsaXN0IG9m
IHRoZSBwbGF0Zm9ybXMgdG8gcmViYXNlbGluZSBmb3IuIiksCisgICAgICAgICAgICBtYWtlX29w
dGlvbigiLS11c2UtemlwLWFzLWFyY2hpdmUiLCBhY3Rpb249InN0b3JlIiwKKyAgICAgICAgICAg
ICAgICBoZWxwPSJVc2UgdGhlIHppcCBhdCB0aGUgc3BlY2lmaWVkIFVSTCAobG9jYWwgb3IgcmVt
b3RlKSB0byBzcGVjaWZ5IHJlc3VsdHMgIgorICAgICAgICAgICAgICAgICJmb3IgdGhlIGdpdmVu
IHBsYXRmb3JtLiIsIG1ldGF2YXI9IjxwbGF0Zm9ybT46PHppcCB1cmw+IiksCisgICAgICAgIF0K
KyAgICAgICAgQWJzdHJhY3REZWNsYXJhdGl2ZUNvbW1hbmQuX19pbml0X18oc2VsZiwgb3B0aW9u
cz1vcHRpb25zKQorCisgICAgZGVmIGV4ZWN1dGUoc2VsZiwgb3B0aW9ucywgYXJncywgdG9vbCk6
CisgICAgICAgIHBvcnQgPSB0b29sLnBvcnRfZmFjdG9yeS5nZXQocG9ydF9uYW1lPW9wdGlvbnMu
cG9ydCkKKworICAgICAgICBpZiBvcHRpb25zLnBsYXRmb3JtczoKKyAgICAgICAgICAgIHBsYXRm
b3JtcyA9IG9wdGlvbnMucGxhdGZvcm1zLnNwbGl0KCcsJykKKyAgICAgICAgZWxzZToKKyAgICAg
ICAgICAgIHBsYXRmb3JtcyA9IFtdCisKKyAgICAgICAgaWYgcG9ydC5jaGVja19pbWFnZV9kaWZm
KCk6CisgICAgICAgICAgICBJbWFnZVJlc3VsdC5pbWFnZV9kaWZmZXIgPSBJbWFnZURpZmZlcihw
b3J0KQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcHJpbnQgIldhcm5pbmc6IENvdWxkbid0
IGZpbmQgSW1hZ2VEaWZmLCBzbyB3ZSB3aWxsIGNyYXNoIGlmIHdlIG5lZWQgdG8gY29tcGFyZSBp
bWFnZXMgdGhhdCBkb24ndCBoYXZlIGNoZWNrc3Vtcy4iCisgICAgICAgICAgICBJbWFnZVJlc3Vs
dC5pbWFnZV9kaWZmZXIgPSBOb25lCisKKyAgICAgICAgaWYgb3B0aW9ucy51c2VfemlwX2FzX2Fy
Y2hpdmUgaXMgbm90IE5vbmU6CisgICAgICAgICAgICBpID0gb3B0aW9ucy51c2VfemlwX2FzX2Fy
Y2hpdmUuaW5kZXgoJzonKQorICAgICAgICAgICAgcGxhdGZvcm0sIHVybCA9IG9wdGlvbnMudXNl
X3ppcF9hc19hcmNoaXZlWzppXSwgb3B0aW9ucy51c2VfemlwX2FzX2FyY2hpdmVbaSArIDE6XQor
ICAgICAgICAgICAgcmVtb3RlX2J1aWxkZXJzID0gUmVzdWx0U2V0LmZyb21femlwX3VybChwbGF0
Zm9ybSwgdXJsKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmVtb3RlX2J1aWxkZXJzID0g
cG9ydC5idWlsZGJvdF9yZXN1bHRzZXQocGxhdGZvcm1zKQorCisgICAgICAgIGxheW91dF90ZXN0
c19kaXIgPSBwb3J0LmxheW91dF90ZXN0c19kaXIoKQorICAgICAgICBsb2NhbF9idWlsZGVycyA9
IFJlc3VsdFNldC5mcm9tX3BhdGgobGF5b3V0X3Rlc3RzX2RpcikKKyAgICAgICAgbGluZXMgPSBz
ZWxmLmFsbF9iYXNlbGluZV9zZWFyY2hfcGF0aHModG9vbC5wb3J0X2ZhY3RvcnkpCisgICAgICAg
IHJiID0gUmViYXNlbGluZXIoYXJncywgbG9jYWxfYnVpbGRlcnMsIHJlbW90ZV9idWlsZGVycywg
bGluZXMsIGxheW91dF90ZXN0c19kaXIpCisgICAgICAgIHJiLnNldF92ZXJib3NlKG9wdGlvbnMu
dmVyYm9zZSkKKyAgICAgICAgcmIucmViYXNlbGluZShvcHRpb25zLmRyeV9ydW4pCisKKyAgICBk
ZWYgYWxsX2Jhc2VsaW5lX3NlYXJjaF9wYXRocyhzZWxmLCBwb3J0X2ZhY3RvcnkpOgorICAgICAg
ICBwb3J0cyA9IHBvcnRfZmFjdG9yeS5nZXRfYWxsKCkKKyAgICAgICAgZGVsKHBvcnRzWyd0ZXN0
J10pCisgICAgICAgIGRlbChwb3J0c1snZHJ5cnVuJ10pCisgICAgICAgIHJlc3VsdCA9IFtdCisg
ICAgICAgIGZvciBwb3J0X25hbWUsIHBvcnQgaW4gcG9ydHMuaXRlbXMoKToKKyAgICAgICAgICAg
IHByaW50ICJnZXR0aW5nIGJhc2VsaW5lcyBmb3IgJXMiICUgcG9ydF9uYW1lCisgICAgICAgICAg
ICByZXN1bHQuYXBwZW5kKG1hcChvcy5wYXRoLmJhc2VuYW1lLCBwb3J0LmJhc2VsaW5lX3NlYXJj
aF9wYXRoKCkpKQorICAgICAgICByZXR1cm4gcmVzdWx0CmRpZmYgLS1naXQgYS9XZWJLaXRUb29s
cy9TY3JpcHRzL3dlYmtpdHB5L3Rvb2wvY29tbWFuZHMvcmViYXNlbGluZTIvcmViYXNlbGluZXIu
cHkgYi9XZWJLaXRUb29scy9TY3JpcHRzL3dlYmtpdHB5L3Rvb2wvY29tbWFuZHMvcmViYXNlbGlu
ZTIvcmViYXNlbGluZXIucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMC4uNGVlMWMxN2ZhNzVjZjJiYjg2ODUxNDJlZWUw
YzhhOWQ2NTc0OGExMgotLS0gL2Rldi9udWxsCisrKyBiL1dlYktpdFRvb2xzL1NjcmlwdHMvd2Vi
a2l0cHkvdG9vbC9jb21tYW5kcy9yZWJhc2VsaW5lMi9yZWJhc2VsaW5lci5weQpAQCAtMCwwICsx
LDE1NSBAQAorIyEvdXNyL2Jpbi9lbnYgcHl0aG9uCisjIENvcHlyaWdodCAoQykgMjAxMCBHb29n
bGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorIworIyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNl
IGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyMgbW9kaWZpY2F0
aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25z
CisjIGFyZSBtZXQ6CisjCisjIDEuICBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVz
dCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorIyAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2Yg
Y29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorIyAyLiAgUmVkaXN0cmli
dXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQK
KyMgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcg
ZGlzY2xhaW1lciBpbiB0aGUKKyMgICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVy
aWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisjCisjIFRISVMgU09GVFdBUkUg
SVMgUFJPVklERUQgQlkgQVBQTEUgQU5EIElUUyBDT05UUklCVVRPUlMgIkFTIElTIiBBTkQgQU5Z
CisjIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElN
SVRFRCBUTywgVEhFIElNUExJRUQKKyMgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5E
IEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQorIyBESVNDTEFJTUVELiBJTiBO
TyBFVkVOVCBTSEFMTCBBUFBMRSBPUiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5Z
CisjIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1Ig
Q09OU0VRVUVOVElBTCBEQU1BR0VTCisjIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywg
UFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyMgTE9TUyBPRiBV
U0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBD
QVVTRUQgQU5ECisjIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRS
QUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisjIChJTkNMVURJTkcgTkVHTElHRU5DRSBP
UiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorIyBUSElT
IFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFN
QUdFLgorCitpbXBvcnQgYnVja2V0CisKKworY2xhc3MgUmViYXNlbGluZXIob2JqZWN0KToKKyAg
ICBUWVBFUyA9IFsndGV4dCcsICdpbWFnZSddCisgICAgIiIiUmViYXNlbGluZXMgYW5kIGRlZHVw
ZXMgcmVzdWx0cy4iIiIKKyAgICBkZWYgX19pbml0X18oc2VsZiwgdGVzdF9nbG9icywgbG9jYWxf
cmVzdWx0cywgcmVtb3RlX3Jlc3VsdHMsIGxpbmVzLAorICAgICAgICAgICAgICAgICBsYXlvdXRf
dGVzdHNfZGlyLCAqKmt3YXJncyk6CisgICAgICAgIHNlbGYuX3Rlc3RfZ2xvYnMgPSB0ZXN0X2ds
b2JzCisgICAgICAgIHNlbGYuX2V4aXN0aW5nX3Jlc3VsdHMgPSBsb2NhbF9yZXN1bHRzCisgICAg
ICAgIHNlbGYuX25ld19yZXN1bHRzID0gcmVtb3RlX3Jlc3VsdHMKKyAgICAgICAgc2VsZi5fbGlu
ZXMgPSBsaW5lcworICAgICAgICBzZWxmLl9sYXlvdXRfdGVzdHNfZGlyID0gbGF5b3V0X3Rlc3Rz
X2RpcgorICAgICAgICBzZWxmLl92ZXJib3NlID0ga3dhcmdzLmdldCgndmVyYm9zZScsIEZhbHNl
KQorICAgICAgICBzZWxmLl9yZWJhc2VsaW5lcyA9IE5vbmUKKworICAgIGRlZiBfc2hvd19yZXN1
bHRzKHNlbGYsIGRlc2NyaXB0aW9uLCByZXN1bHRzKToKKyAgICAgICAgc2VsZi5sb2coZGVzY3Jp
cHRpb24pCisgICAgICAgIGZvciByIGluIHJlc3VsdHM6CisgICAgICAgICAgICBzZWxmLmxvZyhy
KQorCisgICAgZGVmIF90ZXN0X25hbWVzKHNlbGYpOgorICAgICAgICB0ZXN0X25hbWVzID0gc2V0
KFtdKQorICAgICAgICBpZiBsZW4oc2VsZi5fdGVzdF9nbG9icykgPT0gMDoKKyAgICAgICAgICAg
IHJldHVybiBtYXAobGFtYmRhIHI6IHIubmFtZSgpLCBzZWxmLl9uZXdfcmVzdWx0cy5yZXN1bHRz
X2ZvcignJykpCisgICAgICAgIGZvciB0ZXN0X2dsb2IgaW4gc2VsZi5fdGVzdF9nbG9iczoKKyAg
ICAgICAgICAgIG5ld19yZXN1bHRzID0gc2VsZi5fbmV3X3Jlc3VsdHMucmVzdWx0c19mb3IodGVz
dF9nbG9iKQorICAgICAgICAgICAgIyBUT0RPIFRoaXMgaXMgcmVhbGx5IHNsb3cgYW5kIGlzbid0
IG5lY2Vzc2FyeSB1bmxlc3Mgd2UgYXJlIG1lcmVseQorICAgICAgICAgICAgIyBkZWR1cGluZyBl
eGlzdGluZyByZXN1bHRzLiBJdCBzaG91bGQgYmUgY29udHJvbGxlZCBieSBhIGZsYWcuCisgICAg
ICAgICAgICAjIG9sZF9yZXN1bHRzID0gc2VsZi5fZXhpc3RpbmdfcmVzdWx0cy5yZXN1bHRzX2Zv
cih0ZXN0X2dsb2IpCisgICAgICAgICAgICBuYW1lcyA9IHNldChtYXAobGFtYmRhIHI6IHIubmFt
ZSgpLCBuZXdfcmVzdWx0cykpCisgICAgICAgICAgICB0ZXN0X25hbWVzID0gdGVzdF9uYW1lcy51
bmlvbihuYW1lcykKKyAgICAgICAgcmV0dXJuIHRlc3RfbmFtZXMKKworICAgIGRlZiBfZGVkdXBl
KHNlbGYsIHJlc3VsdHMpOgorICAgICAgICBkZWR1cGVkID0gc2V0KFtdKQorICAgICAgICBmb3Ig
bGluZSBpbiBzZWxmLl9saW5lczoKKyAgICAgICAgICAgIGJ1Y2tldHMgPSBzZWxmLl9tYWtlX2J1
Y2tldF9saW5lKGxpbmUpCisgICAgICAgICAgICBmb3IgcmVzdWx0IGluIHJlc3VsdHM6CisgICAg
ICAgICAgICAgICAgYnVja2V0cy5pbnNlcnRfcmVzdWx0KHJlc3VsdCkKKyAgICAgICAgICAgIGJ1
Y2tldHMuY29sbGFwc2UoKQorICAgICAgICAgICAgZGVkdXBlZCA9IGRlZHVwZWQudW5pb24oYnVj
a2V0cy5yZXN1bHRzKCkpCisgICAgICAgIHJldHVybiBkZWR1cGVkCisKKyAgICBkZWYgX21ha2Vf
YnVja2V0X2xpbmUoc2VsZiwgbGluZSk6CisgICAgICAgIGJ0ID0gYnVja2V0LkJ1Y2tldFRyZWUo
KQorICAgICAgICBsaW5lID0gbGluZVs6XQorICAgICAgICBsaW5lLnJldmVyc2UoKQorICAgICAg
ICB0b3BfYnVja2V0ID0gTm9uZQorICAgICAgICBmb3IgcGxhdGZvcm0gaW4gbGluZToKKyAgICAg
ICAgICAgIG5leHRfYnVja2V0ID0gYnQubWFrZV9idWNrZXQocGxhdGZvcm0pCisgICAgICAgICAg
ICBpZiB0b3BfYnVja2V0IGlzIG5vdCBOb25lOgorICAgICAgICAgICAgICAgIHRvcF9idWNrZXQu
YXBwZW5kKG5leHRfYnVja2V0KQorICAgICAgICAgICAgdG9wX2J1Y2tldCA9IG5leHRfYnVja2V0
CisgICAgICAgIHJldHVybiBidAorCisgICAgZGVmIHNldF92ZXJib3NlKHNlbGYsIHZlcmJvc2Up
OgorICAgICAgICBzZWxmLl92ZXJib3NlID0gdmVyYm9zZQorCisgICAgZGVmIGV4aXN0aW5nX3Jl
c3VsdHMoc2VsZiwgdGVzdF9uYW1lKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX2V4aXN0aW5nX3Jl
c3VsdHMucmVzdWx0c19mb3IodGVzdF9uYW1lKQorCisgICAgZGVmIG5ld19yZXN1bHRzKHNlbGYs
IHRlc3RfbmFtZSk6CisgICAgICAgIHJldHVybiBzZWxmLl9uZXdfcmVzdWx0cy5yZXN1bHRzX2Zv
cih0ZXN0X25hbWUpCisKKyAgICBkZWYgY2FsY3VsYXRlX3JlYmFzZWxpbmUoc2VsZik6CisgICAg
ICAgIGlmIHNlbGYuX3JlYmFzZWxpbmVzIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgcmV0dXJu
IHNlbGYuX3JlYmFzZWxpbmVzCisgICAgICAgIHNlbGYuX3JlYmFzZWxpbmVzID0ge30KKyAgICAg
ICAgZm9yIHRlc3RfbmFtZSBpbiBzZWxmLl90ZXN0X25hbWVzKCk6CisgICAgICAgICAgICBmb3Ig
dHlwZSBpbiBSZWJhc2VsaW5lci5UWVBFUzoKKyAgICAgICAgICAgICAgICBuZXdfcmVzdWx0cyA9
IHNlbGYuX25ld19yZXN1bHRzLnJlc3VsdHNfZm9yKHRlc3RfbmFtZSwgdGFyZ2V0X3R5cGU9dHlw
ZSwgZXhhY3RfbWF0Y2g9VHJ1ZSkKKyAgICAgICAgICAgICAgICBleGlzdGluZ19yZXN1bHRzID0g
c2VsZi5fZXhpc3RpbmdfcmVzdWx0cy5yZXN1bHRzX2Zvcih0ZXN0X25hbWUsIHRhcmdldF90eXBl
PXR5cGUsIGV4YWN0X21hdGNoPVRydWUpCisKKyAgICAgICAgICAgICAgICBpZiBsZW4obmV3X3Jl
c3VsdHMpICsgbGVuKGV4aXN0aW5nX3Jlc3VsdHMpID09IDA6CisgICAgICAgICAgICAgICAgICAg
IGNvbnRpbnVlCisKKyAgICAgICAgICAgICAgICBzZWxmLmxvZygiUmViYXNlbGluaW5nICVzWyVz
XSIgJSAodGVzdF9uYW1lLCB0eXBlKSkKKworICAgICAgICAgICAgICAgIHNlbGYuX3Nob3dfcmVz
dWx0cygibmV3X3Jlc3VsdHMiLCBuZXdfcmVzdWx0cykKKyAgICAgICAgICAgICAgICBzZWxmLl9z
aG93X3Jlc3VsdHMoImV4aXN0aW5nX3Jlc3VsdHMiLCBleGlzdGluZ19yZXN1bHRzKQorCisgICAg
ICAgICAgICAgICAgZGVkdXBlZF9yZXN1bHRzID0gc2VsZi5fZGVkdXBlKG5ld19yZXN1bHRzICsg
ZXhpc3RpbmdfcmVzdWx0cykKKworICAgICAgICAgICAgICAgIHNlbGYuX3Nob3dfcmVzdWx0cygi
ZGVkdXBlZF9yZXN1bHRzIiwgZGVkdXBlZF9yZXN1bHRzKQorCisgICAgICAgICAgICAgICAgdG9f
ZGVsZXRlID0gc2V0KGV4aXN0aW5nX3Jlc3VsdHMpIC0gc2V0KGRlZHVwZWRfcmVzdWx0cykKKyAg
ICAgICAgICAgICAgICB0b19pbnN0YWxsID0gc2V0KGRlZHVwZWRfcmVzdWx0cykgLSBzZXQoZXhp
c3RpbmdfcmVzdWx0cykKKyAgICAgICAgICAgICAgICBzZWxmLl9yZWJhc2VsaW5lc1sodGVzdF9u
YW1lLCB0eXBlKV0gPSAodG9fZGVsZXRlLCB0b19pbnN0YWxsKQorICAgICAgICByZXR1cm4gc2Vs
Zi5fcmViYXNlbGluZXMKKworICAgIGRlZiBlYWNoX2RlbGV0ZShzZWxmKToKKyAgICAgICAgZm9y
IGssIHYgaW4gc2VsZi5jYWxjdWxhdGVfcmViYXNlbGluZSgpLml0ZW1zKCk6CisgICAgICAgICAg
ICB5aWVsZCB2WzBdCisKKyAgICBkZWYgZWFjaF9pbnN0YWxsKHNlbGYpOgorICAgICAgICBmb3Ig
aywgdiBpbiBzZWxmLmNhbGN1bGF0ZV9yZWJhc2VsaW5lKCkuaXRlbXMoKToKKyAgICAgICAgICAg
IHlpZWxkIHZbMV0KKworICAgIGRlZiBkZWxldGVzKHNlbGYpOgorICAgICAgICB0b19kZWxldGUg
PSBbXQorICAgICAgICBmb3IgZGVsZXRlcyBpbiBzZWxmLmVhY2hfZGVsZXRlKCk6CisgICAgICAg
ICAgICB0b19kZWxldGUgKz0gZGVsZXRlcworICAgICAgICByZXR1cm4gdG9fZGVsZXRlCisKKyAg
ICBkZWYgaW5zdGFsbHMoc2VsZik6CisgICAgICAgIHRvX2luc3RhbGwgPSBbXQorICAgICAgICBm
b3IgaW5zdGFsbHMgaW4gc2VsZi5lYWNoX2luc3RhbGwoKToKKyAgICAgICAgICAgIHRvX2luc3Rh
bGwgKz0gaW5zdGFsbHMKKyAgICAgICAgcmV0dXJuIHRvX2luc3RhbGwKKworICAgIGRlZiBsb2co
c2VsZiwgbXNnKToKKyAgICAgICAgaWYgc2VsZi5fdmVyYm9zZToKKyAgICAgICAgICAgIHByaW50
IG1zZworCisgICAgZGVmIHJlYmFzZWxpbmUoc2VsZiwgZHJ5X3J1bj1GYWxzZSk6CisgICAgICAg
IGZvciBrLCB2IGluIHNlbGYuY2FsY3VsYXRlX3JlYmFzZWxpbmUoKS5pdGVtcygpOgorICAgICAg
ICAgICAgc2VsZi5sb2coInJlYmFzZWxpbmluZyAoJXMsICVzKSIgJSBrKQorICAgICAgICAgICAg
dG9fZGVsZXRlLCB0b19pbnN0YWxsID0gdgorCisgICAgICAgICAgICBmb3IgciBpbiB0b19kZWxl
dGU6CisgICAgICAgICAgICAgICAgaWYgZHJ5X3J1bjoKKyAgICAgICAgICAgICAgICAgICAgcHJp
bnQgImRlbGV0ZSAlcyIgJSByCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAg
ICAgICAgci5kZWxldGUoKQorCisgICAgICAgICAgICBmb3IgciBpbiB0b19pbnN0YWxsOgorICAg
ICAgICAgICAgICAgIGlmIGRyeV9ydW46CisgICAgICAgICAgICAgICAgICAgIHByaW50ICJpbnN0
YWxsICVzIiAlIHIKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICBy
Lmluc3RhbGwoc2VsZi5fbGF5b3V0X3Rlc3RzX2RpcikKZGlmZiAtLWdpdCBhL1dlYktpdFRvb2xz
L1NjcmlwdHMvd2Via2l0cHkvdG9vbC9jb21tYW5kcy9yZWJhc2VsaW5lMi9yZWJhc2VsaW5lcl91
bml0dGVzdC5weSBiL1dlYktpdFRvb2xzL1NjcmlwdHMvd2Via2l0cHkvdG9vbC9jb21tYW5kcy9y
ZWJhc2VsaW5lMi9yZWJhc2VsaW5lcl91bml0dGVzdC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NApp
bmRleCAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwLi5jN2Y2ODZkZDhj
ZmY3YWQ5ZjNiMjU2MjlhNTg0MGY5OGVjNzZmYTYzCi0tLSAvZGV2L251bGwKKysrIGIvV2ViS2l0
VG9vbHMvU2NyaXB0cy93ZWJraXRweS90b29sL2NvbW1hbmRzL3JlYmFzZWxpbmUyL3JlYmFzZWxp
bmVyX3VuaXR0ZXN0LnB5CkBAIC0wLDAgKzEsNzcgQEAKKyMhL3Vzci9iaW4vZW52IHB5dGhvbgor
IyBDb3B5cmlnaHQgKEMpIDIwMTAgR29vZ2xlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyMK
KyMgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0
aCBvciB3aXRob3V0CisjIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0
IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworIyBhcmUgbWV0OgorIworIyAxLiAgUmVkaXN0cmli
dXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyMg
ICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlz
Y2xhaW1lci4KKyMgMi4gIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJv
ZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisjICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25k
aXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisjICAgICBkb2N1bWVu
dGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0
aW9uLgorIworIyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIEFORCBJVFMgQ09O
VFJJQlVUT1JTICJBUyBJUyIgQU5EIEFOWQorIyBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElF
UywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVECisjIFdBUlJBTlRJ
RVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9T
RSBBUkUKKyMgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgT1IgSVRTIENPTlRS
SUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWQorIyBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFM
LCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUworIyAoSU5DTFVE
SU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMg
T1IgU0VSVklDRVM7CisjIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVT
UyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAorIyBPTiBBTlkgVEhFT1JZIE9GIExJ
QUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAor
IyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkg
T1VUIE9GIFRIRSBVU0UgT0YKKyMgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRI
RSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworaW1wb3J0IHVuaXR0ZXN0Citmcm9tIHdl
YmtpdHB5LmNvbW1vbi5uZXQucmVzdWx0c2V0IGltcG9ydCBSZXN1bHRTZXQKK2Zyb20gd2Via2l0
cHkuY29tbW9uLm5ldC5yZXN1bHRzZXRfdW5pdHRlc3QgaW1wb3J0IEZha2VaaXAKK2Zyb20gcmVi
YXNlbGluZXIgaW1wb3J0IFJlYmFzZWxpbmVyCisKKworY2xhc3MgUmViYXNlbGluZXJUZXN0KHVu
aXR0ZXN0LlRlc3RDYXNlKToKKyAgICBkZWYgYXNzZXJ0SGFzSW5zdGFsbHNGb3Ioc2VsZiwgcGxh
dGZvcm1zLCByZWJhc2VsaW5lcik6CisgICAgICAgIGluc3RhbGxfcGxhdGZvcm1zID0gc2V0KG1h
cChsYW1iZGEgcjogci5wbGF0Zm9ybSgpLCByZWJhc2VsaW5lci5pbnN0YWxscygpKSkKKyAgICAg
ICAgcGxhdGZvcm1zID0gc2V0KHBsYXRmb3JtcykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMo
cGxhdGZvcm1zLCBpbnN0YWxsX3BsYXRmb3JtcykKKworICAgIGRlZiBhc3NlcnRIYXNEZWxldGVz
Rm9yKHNlbGYsIHBsYXRmb3JtcywgcmViYXNlbGluZXIpOgorICAgICAgICBpbnN0YWxsX3BsYXRm
b3JtcyA9IHNldChtYXAobGFtYmRhIHI6IHIucGxhdGZvcm0oKSwgcmViYXNlbGluZXIuZGVsZXRl
cygpKSkKKyAgICAgICAgcGxhdGZvcm1zID0gc2V0KHBsYXRmb3JtcykKKyAgICAgICAgc2VsZi5h
c3NlcnRFcXVhbHMocGxhdGZvcm1zLCBpbnN0YWxsX3BsYXRmb3JtcykKKworICAgIGRlZiB0ZXN0
TGluZXMoc2VsZik6CisgICAgICAgIG1hY196aXAgPSBGYWtlWmlwKCkKKyAgICAgICAgbWFjX3pp
cC5pbnNlcnQoJ3NvbWUtdGVzdC1leHBlY3RlZC50eHQnLCAnbWFjJykKKworICAgICAgICBtYWNf
bGVvcGFyZF96aXAgPSBGYWtlWmlwKCkKKyAgICAgICAgbWFjX2xlb3BhcmRfemlwLmluc2VydCgn
c29tZS10ZXN0LWV4cGVjdGVkLnR4dCcsICdtYWMnKQorCisgICAgICAgIG90aGVyX3ppcCA9IEZh
a2VaaXAoKQorICAgICAgICBvdGhlcl96aXAuaW5zZXJ0KCdzb21lLXRlc3QtZXhwZWN0ZWQudHh0
JywgJ290aGVyJykKKworICAgICAgICBvdGhlcjJfemlwID0gRmFrZVppcCgpCisgICAgICAgIG90
aGVyMl96aXAuaW5zZXJ0KCdzb21lLXRlc3QtZXhwZWN0ZWQudHh0JywgJ290aGVyMicpCisKKyAg
ICAgICAgbG9jYWxfemlwID0gRmFrZVppcCgpCisgICAgICAgIGxvY2FsX3ppcC5pbnNlcnQoJ3Nv
bWUtdGVzdC1leHBlY3RlZC50eHQnLCAnbG9jYWwnKQorCisgICAgICAgIHppcF9tYXAgPSB7fQor
ICAgICAgICB6aXBfbWFwWydtYWMnXSA9IG1hY196aXAKKyAgICAgICAgemlwX21hcFsnbWFjLWxl
b3BhcmQnXSA9IG1hY19sZW9wYXJkX3ppcAorICAgICAgICB6aXBfbWFwWydvdGhlciddID0gb3Ro
ZXJfemlwCisgICAgICAgIHppcF9tYXBbJ290aGVyMiddID0gb3RoZXIyX3ppcAorCisgICAgICAg
IHJlbW90ZV9yZXN1bHRzID0gUmVzdWx0U2V0LmZyb21femlwX21hcCh6aXBfbWFwKQorICAgICAg
ICBsb2NhbF9yZXN1bHRzID0gUmVzdWx0U2V0LmZyb21femlwKE5vbmUsIGxvY2FsX3ppcCkKKwor
ICAgICAgICBsaW5lcyA9IFtdCisgICAgICAgIGxpbmVzLmFwcGVuZChbJ21hYy1sZW9wYXJkJywg
J21hYycsIE5vbmVdKQorICAgICAgICBsaW5lcy5hcHBlbmQoWydvdGhlcicsICdtYWMnLCAnb3Ro
ZXIyJywgTm9uZV0pCisgICAgICAgIHIgPSBSZWJhc2VsaW5lcihbJ3NvbWUtdGVzdCddLCBsb2Nh
bF9yZXN1bHRzLCByZW1vdGVfcmVzdWx0cywgbGluZXMsICdMYXlvdXRUZXN0cycsIHZlcmJvc2U9
RmFsc2UpCisKKyAgICAgICAgc2VsZi5hc3NlcnRIYXNJbnN0YWxsc0ZvcihbJ21hYycsICdvdGhl
cicsICdvdGhlcjInXSwgcikKKyAgICAgICAgc2VsZi5hc3NlcnRIYXNEZWxldGVzRm9yKFtdLCBy
KQorCisKK2lmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CisgICAgdW5pdHRlc3QubWFpbigpCg==
</data>

          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>76120</attachid>
            <date>2010-12-09 14:01:09 -0800</date>
            <delta_ts>2010-12-09 18:49:40 -0800</delta_ts>
            <desc>Patch</desc>
            <filename>bug-50098-20101210090106.patch</filename>
            <type>text/plain</type>
            <size>78829</size>
            <attacher name="James Kozianski">koz</attacher>
            
              <data encoding="base64">ZGlmZiAtLWdpdCBhL1dlYktpdFRvb2xzL0NoYW5nZUxvZyBiL1dlYktpdFRvb2xzL0NoYW5nZUxv
ZwppbmRleCBhMWNjYmU0YmRiNjk4ZjgyNTE1NGI0ZjJiMmMwNzUxZDgzNTY5OWU4Li5lNjhiMTdm
YWVjNTY5ZjUzZGMzZTI4MmQ4MmJkNTNkMzY1MDQxMzI0IDEwMDY0NAotLS0gYS9XZWJLaXRUb29s
cy9DaGFuZ2VMb2cKKysrIGIvV2ViS2l0VG9vbHMvQ2hhbmdlTG9nCkBAIC0xLDMgKzEsMzAgQEAK
KzIwMTAtMTItMDkgIEphbWVzIEtvemlhbnNraSAgPGtvekBjaHJvbWl1bS5vcmc+CisKKyAgICAg
ICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChPT1BTISkuCisKKyAgICAgICAgTmV3IHdlYmtpdC1wYXRj
aCByZWJhc2VsaW5lMiBjb21tYW5kLgorICAgICAgICBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9z
aG93X2J1Zy5jZ2k/aWQ9NTAwOTgKKworICAgICAgICAqIFNjcmlwdHMvd2Via2l0cHkvY29tbW9u
L2RpcmFzemlwLnB5OiBBZGRlZC4KKyAgICAgICAgKiBTY3JpcHRzL3dlYmtpdHB5L2NvbW1vbi9p
bmRlbnRlZF9sb2dnZXIucHk6IEFkZGVkLgorICAgICAgICAqIFNjcmlwdHMvd2Via2l0cHkvY29t
bW9uL25ldC9idWlsZGJvdC5weToKKyAgICAgICAgKiBTY3JpcHRzL3dlYmtpdHB5L2NvbW1vbi9u
ZXQvcmVtb3RlemlwLnB5OiBBZGRlZC4KKyAgICAgICAgKiBTY3JpcHRzL3dlYmtpdHB5L2NvbW1v
bi9uZXQvcmVzdWx0LnB5OiBBZGRlZC4KKyAgICAgICAgKiBTY3JpcHRzL3dlYmtpdHB5L2NvbW1v
bi9uZXQvcmVzdWx0X3VuaXR0ZXN0LnB5OiBBZGRlZC4KKyAgICAgICAgKiBTY3JpcHRzL3dlYmtp
dHB5L2NvbW1vbi9uZXQvcmVzdWx0c2V0LnB5OiBBZGRlZC4KKyAgICAgICAgKiBTY3JpcHRzL3dl
YmtpdHB5L2NvbW1vbi9uZXQvcmVzdWx0c2V0X3VuaXR0ZXN0LnB5OiBBZGRlZC4KKyAgICAgICAg
KiBTY3JpcHRzL3dlYmtpdHB5L2NvbW1vbi9zeXN0ZW0vZmlsZXN5c3RlbS5weToKKyAgICAgICAg
KiBTY3JpcHRzL3dlYmtpdHB5L2xheW91dF90ZXN0cy9wb3J0L2Jhc2UucHk6CisgICAgICAgICog
U2NyaXB0cy93ZWJraXRweS9sYXlvdXRfdGVzdHMvcG9ydC9jaHJvbWl1bS5weToKKyAgICAgICAg
KiBTY3JpcHRzL3dlYmtpdHB5L2xheW91dF90ZXN0cy9wb3J0L3dlYmtpdC5weToKKyAgICAgICAg
KiBTY3JpcHRzL3dlYmtpdHB5L3Rvb2wvY29tbWFuZHMvX19pbml0X18ucHk6CisgICAgICAgICog
U2NyaXB0cy93ZWJraXRweS90b29sL2NvbW1hbmRzL3JlYmFzZWxpbmUyL19faW5pdF9fLnB5OiBB
ZGRlZC4KKyAgICAgICAgKiBTY3JpcHRzL3dlYmtpdHB5L3Rvb2wvY29tbWFuZHMvcmViYXNlbGlu
ZTIvYnVja2V0LnB5OiBBZGRlZC4KKyAgICAgICAgKiBTY3JpcHRzL3dlYmtpdHB5L3Rvb2wvY29t
bWFuZHMvcmViYXNlbGluZTIvYnVja2V0X3VuaXR0ZXN0LnB5OiBBZGRlZC4KKyAgICAgICAgKiBT
Y3JpcHRzL3dlYmtpdHB5L3Rvb2wvY29tbWFuZHMvcmViYXNlbGluZTIvcmViYXNlbGluZTIucHk6
IEFkZGVkLgorICAgICAgICAqIFNjcmlwdHMvd2Via2l0cHkvdG9vbC9jb21tYW5kcy9yZWJhc2Vs
aW5lMi9yZWJhc2VsaW5lci5weTogQWRkZWQuCisgICAgICAgICogU2NyaXB0cy93ZWJraXRweS90
b29sL2NvbW1hbmRzL3JlYmFzZWxpbmUyL3JlYmFzZWxpbmVyX3VuaXR0ZXN0LnB5OiBBZGRlZC4K
KwogMjAxMC0xMi0wOCAgVG9ueSBDaGFuZyAgPHRvbnlAY2hyb21pdW0ub3JnPgogCiAgICAgICAg
IFJldmlld2VkIGJ5IEVyaWMgU2VpZGVsLgpkaWZmIC0tZ2l0IGEvV2ViS2l0VG9vbHMvU2NyaXB0
cy93ZWJraXRweS9jb21tb24vZGlyYXN6aXAucHkgYi9XZWJLaXRUb29scy9TY3JpcHRzL3dlYmtp
dHB5L2NvbW1vbi9kaXJhc3ppcC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwLi45NWQ1NjNkMmM3MjIxZDVjNzBmZmU3
ZjBlOGEyNDlkMDBkYmIwNDUyCi0tLSAvZGV2L251bGwKKysrIGIvV2ViS2l0VG9vbHMvU2NyaXB0
cy93ZWJraXRweS9jb21tb24vZGlyYXN6aXAucHkKQEAgLTAsMCArMSw2OCBAQAorIyEvdXNyL2Jp
bi9lbnYgcHl0aG9uCisjIENvcHlyaWdodCAoQykgMjAxMCBHb29nbGUgSW5jLiBBbGwgcmlnaHRz
IHJlc2VydmVkLgorIworIyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmlu
YXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyMgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVk
IHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisjIGFyZSBtZXQ6CisjCisj
IDEuICBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3Zl
IGNvcHlyaWdodAorIyAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhl
IGZvbGxvd2luZyBkaXNjbGFpbWVyLgorIyAyLiAgUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBm
b3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyMgICAgIG5vdGljZSwgdGhp
cyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUK
KyMgICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRo
IHRoZSBkaXN0cmlidXRpb24uCisjCisjIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQ
TEUgQU5EIElUUyBDT05UUklCVVRPUlMgIkFTIElTIiBBTkQgQU5ZCisjIEVYUFJFU1MgT1IgSU1Q
TElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJ
RUQKKyMgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFS
VElDVUxBUiBQVVJQT1NFIEFSRQorIyBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBBUFBM
RSBPUiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZCisjIERJUkVDVCwgSU5ESVJF
Q1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1B
R0VTCisjIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VC
U1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyMgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJ
VFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECisjIE9OIEFO
WSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklM
SVRZLCBPUiBUT1JUCisjIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJ
TkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorIyBUSElTIFNPRlRXQVJFLCBFVkVOIElG
IEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCitmcm9tIF9fZnV0
dXJlX18gaW1wb3J0IHdpdGhfc3RhdGVtZW50CisKK2ltcG9ydCBvcworaW1wb3J0IHNodXRpbAor
Citmcm9tIHdlYmtpdHB5LmNvbW1vbi5uZXQucmVtb3RlemlwIGltcG9ydCBaaXBGaWxlSGFuZGxl
Citmcm9tIHdlYmtpdHB5LmNvbW1vbi5zeXN0ZW0uZmlsZXN5c3RlbSBpbXBvcnQgRmlsZVN5c3Rl
bQorCisKK2NsYXNzIERpckFzWmlwKG9iamVjdCk6CisgICAgIiIiUHJvdmlkZXMgYSB6aXBmaWxl
LWxpa2UgaW50ZXJmYWNlIHRvIGEgbG9jYWwgZGlyZWN0b3J5IiIiCisgICAgZGVmIF9faW5pdF9f
KHNlbGYsIHBhdGgsIGZzPUZpbGVTeXN0ZW0oKSk6CisgICAgICAgIHNlbGYuX3BhdGggPSBwYXRo
CisgICAgICAgIHNlbGYuX2ZzID0gZnMKKyAgICAgICAgaWYgbm90IHNlbGYuX3BhdGguZW5kc3dp
dGgob3MucGF0aC5zZXApOgorICAgICAgICAgICAgc2VsZi5fcGF0aCArPSBvcy5wYXRoLnNlcAor
CisgICAgZGVmIGhhbmRsZV90byhzZWxmLCBmaWxlbmFtZSk6CisgICAgICAgIHJldHVybiBaaXBG
aWxlSGFuZGxlKHNlbGYsIGZpbGVuYW1lKQorCisgICAgZGVmIG5hbWVsaXN0KHNlbGYpOgorICAg
ICAgICByZXN1bHRzID0gW10KKyAgICAgICAgZm9yIChwYXRoLCBfLCBmaWxlbmFtZXMpIGluIG9z
LndhbGsoc2VsZi5fcGF0aCk6CisgICAgICAgICAgICBmb3IgZmlsZW5hbWUgaW4gZmlsZW5hbWVz
OgorICAgICAgICAgICAgICAgICMgV2UgZHJvcCB0aGUgcGF0aCB0byB0aGUgZGlyZWN0b3J5IGZy
b20gb3VyIG5hbWVsaXN0LgorICAgICAgICAgICAgICAgIHJlc3VsdHMuYXBwZW5kKG9zLnBhdGgu
am9pbihwYXRoLCBmaWxlbmFtZSlbbGVuKHNlbGYuX3BhdGgpOl0pCisgICAgICAgIHJldHVybiBy
ZXN1bHRzCisKKyAgICBkZWYgcmVhZChzZWxmLCBmaWxlbmFtZSk6CisgICAgICAgIHJldHVybiBz
ZWxmLl9mcy5yZWFkX3RleHRfZmlsZShvcy5wYXRoLmpvaW4oc2VsZi5fcGF0aCwgZmlsZW5hbWUp
KQorCisgICAgZGVmIGV4dHJhY3Qoc2VsZiwgZmlsZW5hbWUsIHBhdGgpOgorICAgICAgICBzcmMg
PSBvcy5wYXRoLmpvaW4oc2VsZi5fcGF0aCwgZmlsZW5hbWUpCisgICAgICAgIGRlc3QgPSBvcy5w
YXRoLmpvaW4ocGF0aCwgZmlsZW5hbWUpCisgICAgICAgICMgQXMgZmlsZW5hbWUgbWF5IGhhdmUg
c2xhc2hlcyBpbiBpdCwgd2UgbXVzdCBlbnN1cmUgdGhhdCB0aGUgY29ycmVjdAorICAgICAgICAj
IGRpcmVjdG9yeSBoZWlyYXJjaHkgZXhpc3RzIHdoZW4gd2UgYXJlIGNvcHlpbmcgaXQgdG8gdGhl
IG91dHB1dC4KKyAgICAgICAgcGF0aF90b19maWxlID0gb3MucGF0aC5zcGxpdChmaWxlbmFtZSlb
MF0KKyAgICAgICAgc2VsZi5fZnMubWF5YmVfbWFrZV9kaXJlY3RvcnkocGF0aCwgcGF0aF90b19m
aWxlKQorICAgICAgICBzZWxmLl9mcy5jb3B5ZmlsZShzcmMsIGRlc3QpCisKKyAgICBkZWYgZGVs
ZXRlKHNlbGYsIGZpbGVuYW1lKToKKyAgICAgICAgZmlsZW5hbWUgPSBvcy5wYXRoLmpvaW4oc2Vs
Zi5fcGF0aCwgZmlsZW5hbWUpCisgICAgICAgIGFzc2VydCAnLi4nIG5vdCBpbiBmaWxlbmFtZQor
ICAgICAgICBzZWxmLl9mcy5yZW1vdmUoZmlsZW5hbWUpCmRpZmYgLS1naXQgYS9XZWJLaXRUb29s
cy9TY3JpcHRzL3dlYmtpdHB5L2NvbW1vbi9pbmRlbnRlZF9sb2dnZXIucHkgYi9XZWJLaXRUb29s
cy9TY3JpcHRzL3dlYmtpdHB5L2NvbW1vbi9pbmRlbnRlZF9sb2dnZXIucHkKbmV3IGZpbGUgbW9k
ZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMC4u
ZjEwZDcxODI5YTNjMTEyYWUxNjY4MzQ1NWFkNWI3YmNhYWI3OGQ0NAotLS0gL2Rldi9udWxsCisr
KyBiL1dlYktpdFRvb2xzL1NjcmlwdHMvd2Via2l0cHkvY29tbW9uL2luZGVudGVkX2xvZ2dlci5w
eQpAQCAtMCwwICsxLDQzIEBACisjIS91c3IvYmluL2VudiBweXRob24KKyMgQ29weXJpZ2h0IChD
KSAyMDEwIEdvb2dsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisjCisjIFJlZGlzdHJpYnV0
aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAor
IyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5n
IGNvbmRpdGlvbnMKKyMgYXJlIG1ldDoKKyMKKyMgMS4gIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3Vy
Y2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisjICAgICBub3RpY2UsIHRo
aXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisjIDIu
ICBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3Zl
IGNvcHlyaWdodAorIyAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhl
IGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorIyAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Ig
b3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyMKKyMgVEhJ
UyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBBTkQgSVRTIENPTlRSSUJVVE9SUyAiQVMg
SVMiIEFORCBBTlkKKyMgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywg
QlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRAorIyBXQVJSQU5USUVTIE9GIE1FUkNIQU5U
QUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCisjIERJU0NM
QUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIE9SIElUUyBDT05UUklCVVRPUlMgQkUgTElB
QkxFIEZPUiBBTlkKKyMgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhF
TVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMKKyMgKElOQ0xVRElORywgQlVUIE5PVCBM
SU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOwor
IyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9O
KSBIT1dFVkVSIENBVVNFRCBBTkQKKyMgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRI
RVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyMgKElOQ0xVRElORyBO
RUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNF
IE9GCisjIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkg
T0YgU1VDSCBEQU1BR0UuCisKKworY2xhc3MgSW5kZW50ZWRMb2dnZXIob2JqZWN0KToKKyAgICAi
IiJMb2dnZXIgdGhhdCBwcmludHMgaW5kZW50ZWQgbWVzc2FnZXMiIiIKKyAgICBkZWYgX19pbml0
X18oc2VsZiwgbG9nZ2VyPU5vbmUpOgorICAgICAgICBzZWxmLl9sb2dnZXIgPSBsb2dnZXIKKyAg
ICAgICAgc2VsZi5faW5kZW50ID0gMAorCisgICAgZGVmIGluZGVudChzZWxmKToKKyAgICAgICAg
c2VsZi5faW5kZW50ICs9IDEKKworICAgIGRlZiBvdXRkZW50KHNlbGYpOgorICAgICAgICBzZWxm
Ll9pbmRlbnQgLT0gMQorCisgICAgZGVmIGxvZyhzZWxmLCBtZXNzYWdlKToKKyAgICAgICAgbWVz
c2FnZSA9ICcgICcgKiBzZWxmLl9pbmRlbnQgKyBtZXNzYWdlCisgICAgICAgIGlmIHNlbGYuX2xv
Z2dlciBpcyBOb25lOgorICAgICAgICAgICAgcHJpbnQgbWVzc2FnZQorICAgICAgICBlbHNlOgor
ICAgICAgICAgICAgc2VsZi5fbG9nZ2VyKG1lc3NhZ2UpCmRpZmYgLS1naXQgYS9XZWJLaXRUb29s
cy9TY3JpcHRzL3dlYmtpdHB5L2NvbW1vbi9uZXQvYnVpbGRib3QucHkgYi9XZWJLaXRUb29scy9T
Y3JpcHRzL3dlYmtpdHB5L2NvbW1vbi9uZXQvYnVpbGRib3QucHkKaW5kZXggODhjZGQ0ZTI4MDI1
NWM0OWVmZjg2MjRlMmYyMTgzZGFhNjQyYjFhOC4uZWE4YjI1NmU2NmU5MTMwZjBlOWY3MWQ4OTM0
YmQyOTljMDVmNjMzNCAxMDA2NDQKLS0tIGEvV2ViS2l0VG9vbHMvU2NyaXB0cy93ZWJraXRweS9j
b21tb24vbmV0L2J1aWxkYm90LnB5CisrKyBiL1dlYktpdFRvb2xzL1NjcmlwdHMvd2Via2l0cHkv
Y29tbW9uL25ldC9idWlsZGJvdC5weQpAQCAtMzcsNiArMzcsOCBAQCBpbXBvcnQgeG1scnBjbGli
CiBmcm9tIHdlYmtpdHB5LmNvbW1vbi5uZXQuZmFpbHVyZW1hcCBpbXBvcnQgRmFpbHVyZU1hcAog
ZnJvbSB3ZWJraXRweS5jb21tb24ubmV0LmxheW91dHRlc3RyZXN1bHRzIGltcG9ydCBMYXlvdXRU
ZXN0UmVzdWx0cwogZnJvbSB3ZWJraXRweS5jb21tb24ubmV0LnJlZ3Jlc3Npb253aW5kb3cgaW1w
b3J0IFJlZ3Jlc3Npb25XaW5kb3cKK2Zyb20gd2Via2l0cHkuY29tbW9uLm5ldC5yZW1vdGV6aXAg
aW1wb3J0IFJlbW90ZVppcAorZnJvbSB3ZWJraXRweS5jb21tb24ubmV0LnJlc3VsdHNldCBpbXBv
cnQgUmVzdWx0U2V0CiBmcm9tIHdlYmtpdHB5LmNvbW1vbi5zeXN0ZW0ubG9ndXRpbHMgaW1wb3J0
IGdldF9sb2dnZXIKIGZyb20gd2Via2l0cHkudGhpcmRwYXJ0eS5hdXRvaW5zdGFsbGVkLm1lY2hh
bml6ZSBpbXBvcnQgQnJvd3NlcgogZnJvbSB3ZWJraXRweS50aGlyZHBhcnR5LkJlYXV0aWZ1bFNv
dXAgaW1wb3J0IEJlYXV0aWZ1bFNvdXAKQEAgLTg3LDYgKzg5LDEyIEBAIGNsYXNzIEJ1aWxkZXIo
b2JqZWN0KToKICAgICAgICAgc2VsZi5fYnVpbGRzX2NhY2hlW2J1aWxkX251bWJlcl0gPSBidWls
ZAogICAgICAgICByZXR1cm4gYnVpbGQKIAorICAgIGRlZiBsYXRlc3RfYnVpbGQoc2VsZik6Cisg
ICAgICAgIHJldmlzaW9uX2J1aWxkX3BhaXJzID0gc2VsZi5yZXZpc2lvbl9idWlsZF9wYWlyc193
aXRoX3Jlc3VsdHMoKQorICAgICAgICByZXZpc2lvbl9idWlsZF9wYWlycy5zb3J0KGtleT1sYW1i
ZGEgaTogaVsxXSkKKyAgICAgICAgbGF0ZXN0X2J1aWxkX251bWJlciA9IHJldmlzaW9uX2J1aWxk
X3BhaXJzWy0xXVsxXQorICAgICAgICByZXR1cm4gc2VsZi5idWlsZChsYXRlc3RfYnVpbGRfbnVt
YmVyKQorCiAgICAgZGVmIGZvcmNlX2J1aWxkKHNlbGYsIHVzZXJuYW1lPSJ3ZWJraXQtcGF0Y2gi
LCBjb21tZW50cz1Ob25lKToKICAgICAgICAgZGVmIHByZWRpY2F0ZShmb3JtKToKICAgICAgICAg
ICAgIHRyeToKQEAgLTIxNiw2ICsyMjQsMTIgQEAgY2xhc3MgQnVpbGQob2JqZWN0KToKICAgICAg
ICAgcmVzdWx0c19kaXJlY3RvcnkgPSAiciVzICglcykiICUgKHNlbGYucmV2aXNpb24oKSwgc2Vs
Zi5fbnVtYmVyKQogICAgICAgICByZXR1cm4gIiVzLyVzIiAlIChzZWxmLl9idWlsZGVyLnJlc3Vs
dHNfdXJsKCksIHVybGxpYi5xdW90ZShyZXN1bHRzX2RpcmVjdG9yeSkpCiAKKyAgICBkZWYgcmVz
dWx0c196aXBfdXJsKHNlbGYpOgorICAgICAgICByZXR1cm4gIiVzLnppcCIgJSBzZWxmLnJlc3Vs
dHNfdXJsKCkKKworICAgIGRlZiByZXN1bHRzKHNlbGYpOgorICAgICAgICByZXR1cm4gUmVzdWx0
U2V0KHNlbGYuX2J1aWxkZXIubmFtZSgpLCBOb25lLCBSZW1vdGVaaXAoc2VsZi5yZXN1bHRzX3pp
cF91cmwoKSksIGluY2x1ZGVfZXhwZWN0ZWQ9RmFsc2UpCisKICAgICBkZWYgX2ZldGNoX3Jlc3Vs
dHNfaHRtbChzZWxmKToKICAgICAgICAgcmVzdWx0c19odG1sID0gIiVzL3Jlc3VsdHMuaHRtbCIg
JSAoc2VsZi5yZXN1bHRzX3VybCgpKQogICAgICAgICAjIEZJWE1FOiBUaGlzIHNob3VsZCB1c2Ug
TmV0d29ya1RyYW5zYWN0aW9uJ3MgNDA0IGhhbmRsaW5nIGluc3RlYWQuCmRpZmYgLS1naXQgYS9X
ZWJLaXRUb29scy9TY3JpcHRzL3dlYmtpdHB5L2NvbW1vbi9uZXQvcmVtb3RlemlwLnB5IGIvV2Vi
S2l0VG9vbHMvU2NyaXB0cy93ZWJraXRweS9jb21tb24vbmV0L3JlbW90ZXppcC5weQpuZXcgZmls
ZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwLi4zNGU0ZmQxMDM1N2YzMzg1OTMyN2Q1Y2U1ZTI0ZjE1MDM0OWY4YTQyCi0tLSAvZGV2L251
bGwKKysrIGIvV2ViS2l0VG9vbHMvU2NyaXB0cy93ZWJraXRweS9jb21tb24vbmV0L3JlbW90ZXpp
cC5weQpAQCAtMCwwICsxLDk3IEBACisjIS91c3IvYmluL2VudiBweXRob24KKyMgQ29weXJpZ2h0
IChDKSAyMDEwIEdvb2dsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisjCisjIFJlZGlzdHJp
YnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91
dAorIyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93
aW5nIGNvbmRpdGlvbnMKKyMgYXJlIG1ldDoKKyMKKyMgMS4gIFJlZGlzdHJpYnV0aW9ucyBvZiBz
b3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisjICAgICBub3RpY2Us
IHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisj
IDIuICBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFi
b3ZlIGNvcHlyaWdodAorIyAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQg
dGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorIyAgICAgZG9jdW1lbnRhdGlvbiBhbmQv
b3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyMKKyMg
VEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBBTkQgSVRTIENPTlRSSUJVVE9SUyAi
QVMgSVMiIEFORCBBTlkKKyMgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElO
RywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRAorIyBXQVJSQU5USUVTIE9GIE1FUkNI
QU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCisjIERJ
U0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIE9SIElUUyBDT05UUklCVVRPUlMgQkUg
TElBQkxFIEZPUiBBTlkKKyMgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwg
RVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMKKyMgKElOQ0xVRElORywgQlVUIE5P
VCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VT
OworIyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBU
SU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKKyMgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdI
RVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyMgKElOQ0xVRElO
RyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUg
VVNFIE9GCisjIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJ
VFkgT0YgU1VDSCBEQU1BR0UuCisKK2Zyb20gd2Via2l0cHkuY29tbW9uLm5ldC5uZXR3b3JrdHJh
bnNhY3Rpb24gaW1wb3J0IE5ldHdvcmtUcmFuc2FjdGlvbgoraW1wb3J0IG9zCitpbXBvcnQgc2h1
dGlsCitpbXBvcnQgdGVtcGZpbGUKK2ltcG9ydCB1cmxsaWIKK2ltcG9ydCB6aXBmaWxlCisKKwor
Y2xhc3MgUmVtb3RlWmlwKG9iamVjdCk6CisgICAgIiIiQSB6aXAgZmlsZSB0aGF0IHJlc2lkZXMg
YXQgYSBVUkwgKGxvY2FsIG9yIHJlbW90ZSkiIiIKKyAgICBkZWYgX19pbml0X18oc2VsZiwgemlw
X3VybCk6CisgICAgICAgIHNlbGYuX3ppcF91cmwgPSB6aXBfdXJsCisgICAgICAgIHNlbGYuX3pp
cF9maWxlID0gTm9uZQorCisgICAgZGVmIF9sb2FkKHNlbGYpOgorICAgICAgICBpZiBzZWxmLl96
aXBfZmlsZSBpcyBOb25lOgorICAgICAgICAgICAgdGVtcF9maWxlID0gTmV0d29ya1RyYW5zYWN0
aW9uKCkucnVuKGxhbWJkYTogdXJsbGliLnVybHJldHJpZXZlKHNlbGYuX3ppcF91cmwpWzBdKQor
ICAgICAgICAgICAgc2VsZi5femlwX2ZpbGUgPSB6aXBmaWxlLlppcEZpbGUodGVtcF9maWxlKQor
CisgICAgZGVmIGhhbmRsZV90byhzZWxmLCBmaWxlbmFtZSk6CisgICAgICAgIHJldHVybiBaaXBG
aWxlSGFuZGxlKHNlbGYsIGZpbGVuYW1lKQorCisgICAgZGVmIG5hbWVsaXN0KHNlbGYpOgorICAg
ICAgICBzZWxmLl9sb2FkKCkKKyAgICAgICAgcmV0dXJuIHNlbGYuX3ppcF9maWxlLm5hbWVsaXN0
KCkKKworICAgIGRlZiByZWFkKHNlbGYsIGZpbGVuYW1lKToKKyAgICAgICAgc2VsZi5fbG9hZCgp
CisgICAgICAgIHJldHVybiBzZWxmLl96aXBfZmlsZS5yZWFkKGZpbGVuYW1lKQorCisgICAgZGVm
IGV4dHJhY3Qoc2VsZiwgZmlsZW5hbWUsIHBhdGgpOgorICAgICAgICBzZWxmLl9sb2FkKCkKKyAg
ICAgICAgcmV0dXJuIHNlbGYuX3ppcF9maWxlLmV4dHJhY3QoZmlsZW5hbWUsIHBhdGgpCisKKyAg
ICBkZWYgZGVsZXRlKHNlbGYsIGZpbGVuYW1lKToKKyAgICAgICAgcmFpc2UgRXhjZXB0aW9uKCJD
YW4ndCBkZWxldGUgZnJvbSBhIFJlbW90ZVppcC4iKQorCisKK2NsYXNzIFppcEZpbGVIYW5kbGU6
CisgICAgIiIiUG9pbnRzIHRvIGEgZmlsZSB0aGF0IHJlc2lkZXMgaW4gYSBSZW1vdGVaaXAiIiIK
KyAgICBkZWYgX19pbml0X18oc2VsZiwgemlwX2ZpbGUsIGZpbGVuYW1lKToKKyAgICAgICAgc2Vs
Zi5fZmlsZW5hbWUgPSBmaWxlbmFtZQorICAgICAgICBzZWxmLl96aXBfZmlsZSA9IHppcF9maWxl
CisgICAgICAgIHNlbGYuX2NvbnRlbnRzID0gTm9uZQorCisgICAgZGVmIF9fc3RyX18oc2VsZik6
CisgICAgICAgIHJldHVybiAiJXM6JXMiICUgKHNlbGYuX3ppcF9maWxlLCBzZWxmLl9maWxlbmFt
ZSkKKworICAgIGRlZiBjb250ZW50cyhzZWxmKToKKyAgICAgICAgaWYgc2VsZi5fY29udGVudHMg
aXMgTm9uZToKKyAgICAgICAgICAgIHNlbGYuX2NvbnRlbnRzID0gc2VsZi5femlwX2ZpbGUucmVh
ZChzZWxmLl9maWxlbmFtZSkKKyAgICAgICAgcmV0dXJuIHNlbGYuX2NvbnRlbnRzCisKKyAgICBk
ZWYgc2F2ZV90byhzZWxmLCBwYXRoLCBmaWxlbmFtZT1Ob25lKToKKyAgICAgICAgaWYgZmlsZW5h
bWUgaXMgTm9uZToKKyAgICAgICAgICAgIHNlbGYuX3ppcF9maWxlLmV4dHJhY3Qoc2VsZi5fZmls
ZW5hbWUsIHBhdGgpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICB0ZW1wX2RpciA9IHRlbXBm
aWxlLm1rZHRlbXAoKQorICAgICAgICAgICAgc2VsZi5femlwX2ZpbGUuZXh0cmFjdChzZWxmLl9m
aWxlbmFtZSwgdGVtcF9kaXIpCisKKyAgICAgICAgICAgIHNyYyA9IG9zLnBhdGguam9pbih0ZW1w
X2Rpciwgc2VsZi5fZmlsZW5hbWUpCisgICAgICAgICAgICBkZXN0ID0gb3MucGF0aC5qb2luKHBh
dGgsIGZpbGVuYW1lKQorICAgICAgICAgICAgc2h1dGlsLmNvcHlmaWxlKHNyYywgZGVzdCkKKyAg
ICAgICAgICAgIHNodXRpbC5ybXRyZWUodGVtcF9kaXIpCisKKyAgICBkZWYgZGVsZXRlKHNlbGYp
OgorICAgICAgICBzZWxmLl96aXBfZmlsZS5kZWxldGUoc2VsZi5fZmlsZW5hbWUpCisKKyAgICBk
ZWYgbmFtZShzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX2ZpbGVuYW1lCisKKyAgICBkZWYg
c3BsaXRleHQoc2VsZik6CisgICAgICAgIHJldHVybiBvcy5wYXRoLnNwbGl0ZXh0KHNlbGYubmFt
ZSgpKQpkaWZmIC0tZ2l0IGEvV2ViS2l0VG9vbHMvU2NyaXB0cy93ZWJraXRweS9jb21tb24vbmV0
L3Jlc3VsdC5weSBiL1dlYktpdFRvb2xzL1NjcmlwdHMvd2Via2l0cHkvY29tbW9uL25ldC9yZXN1
bHQucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMC4uODdlMTZiMDIyYWRlNTJkNzZkN2M3NDc1MGZmNWI2OWRmZjU2NzVh
NwotLS0gL2Rldi9udWxsCisrKyBiL1dlYktpdFRvb2xzL1NjcmlwdHMvd2Via2l0cHkvY29tbW9u
L25ldC9yZXN1bHQucHkKQEAgLTAsMCArMSwxNjcgQEAKKyMhL3Vzci9iaW4vZW52IHB5dGhvbgor
IyBDb3B5cmlnaHQgKEMpIDIwMTAgR29vZ2xlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyMK
KyMgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0
aCBvciB3aXRob3V0CisjIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0
IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworIyBhcmUgbWV0OgorIworIyAxLiAgUmVkaXN0cmli
dXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyMg
ICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlz
Y2xhaW1lci4KKyMgMi4gIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJv
ZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisjICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25k
aXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisjICAgICBkb2N1bWVu
dGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0
aW9uLgorIworIyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIEFORCBJVFMgQ09O
VFJJQlVUT1JTICJBUyBJUyIgQU5EIEFOWQorIyBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElF
UywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVECisjIFdBUlJBTlRJ
RVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9T
RSBBUkUKKyMgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgT1IgSVRTIENPTlRS
SUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWQorIyBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFM
LCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUworIyAoSU5DTFVE
SU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMg
T1IgU0VSVklDRVM7CisjIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVT
UyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAorIyBPTiBBTlkgVEhFT1JZIE9GIExJ
QUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAor
IyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkg
T1VUIE9GIFRIRSBVU0UgT0YKKyMgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRI
RSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworaW1wb3J0IG9zCitpbXBvcnQgcmUKKwor
CitjbGFzcyBOYWl2ZUltYWdlRGlmZmVyKG9iamVjdCk6CisgICAgZGVmIHNhbWVfaW1hZ2Uoc2Vs
ZiwgaW1nMSwgaW1nMik6CisgICAgICAgIHJldHVybiBpbWcxID09IGltZzIKKworCitjbGFzcyBS
ZXN1bHQob2JqZWN0KToKKyAgICAiIiJSZXByZXNlbnRzIHRoZSByZXN1bHQgb2YgYSBzaW5nbGUg
dGVzdCBvbiBhIHNpbmdsZSBwbGF0Zm9ybSIiIgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBwbGF0
Zm9ybSwgcmVzdWx0X3R5cGUsIGZpbGVzKToKKyAgICAgICAgc2VsZi5fcGxhdGZvcm0gPSBwbGF0
Zm9ybQorICAgICAgICBzZWxmLl9yZXN1bHRfdHlwZSA9IHJlc3VsdF90eXBlCisgICAgICAgIHNl
bGYuX2ZpbGVzID0gZmlsZXMKKyAgICAgICAgc2VsZi5fbWFpbl9maWxlID0gZmlsZXNbMF0KKyAg
ICAgICAgZmlsZW5hbWUgPSBzZWxmLl9tYWluX2ZpbGUubmFtZSgpCisgICAgICAgIHNlbGYuX25h
bWUgPSBzZWxmLl9leHRyYWN0X3Rlc3RfbmFtZShmaWxlbmFtZSkKKyAgICAgICAgc2VsZi5faXNf
YWN0dWFsID0gJy1hY3R1YWwuJyBpbiBmaWxlbmFtZQorCisgICAgICAgIGlmIHNlbGYuX3BsYXRm
b3JtIGlzIE5vbmU6CisgICAgICAgICAgICBzZWxmLl9wbGF0Zm9ybSA9IHNlbGYuX2V4dHJhY3Rf
cGxhdGZvcm0oZmlsZW5hbWUpCisKKyAgICBkZWYgX2V4dHJhY3RfcGxhdGZvcm0oc2VsZiwgZmls
ZW5hbWUpOgorICAgICAgICAiIiJDYWxjdWxhdGVzIHRoZSBwbGF0Zm9ybSBmcm9tIHRoZSBuYW1l
IG9mIHRoZSBmaWxlIGlmIGl0IGlzbid0IGtub3duIGFscmVhZHkiIiIKKyAgICAgICAgcGF0aCA9
IHJlLnNwbGl0KG9zLnBhdGguc2VwLCBmaWxlbmFtZSkKKyAgICAgICAgaWYgJ3BsYXRmb3JtJyBp
biBwYXRoOgorICAgICAgICAgICAgcmV0dXJuIHBhdGhbcGF0aC5pbmRleCgncGxhdGZvcm0nKSAr
IDFdCisgICAgICAgIHJldHVybiBOb25lCisKKyAgICBkZWYgX2V4dHJhY3RfdGVzdF9uYW1lKHNl
bGYsIGZpbGVuYW1lKToKKyAgICAgICAgdGVzdF9uYW1lID0gZmlsZW5hbWUKKyAgICAgICAgcGF0
aCA9IHJlLnNwbGl0KG9zLnBhdGguc2VwLCB0ZXN0X25hbWUpCisgICAgICAgIGlmICdMYXlvdXRU
ZXN0cycgaW4gcGF0aDoKKyAgICAgICAgICAgIHBhdGggPSBwYXRoWzEgKyBwYXRoLmluZGV4KCdM
YXlvdXRUZXN0cycpOl0KKyAgICAgICAgaWYgJ2xheW91dC10ZXN0LXJlc3VsdHMnIGluIHBhdGg6
CisgICAgICAgICAgICBwYXRoID0gcGF0aFsxICsgcGF0aC5pbmRleCgnbGF5b3V0LXRlc3QtcmVz
dWx0cycpOl0KKyAgICAgICAgaWYgJ3BsYXRmb3JtJyBpbiBwYXRoOgorICAgICAgICAgICAgcGF0
aCA9IHBhdGhbMiArIHBhdGguaW5kZXgoJ3BsYXRmb3JtJyk6XQorCisgICAgICAgIHRlc3RfbmFt
ZSA9IHBhdGhbLTFdCisgICAgICAgIHRlc3RfbmFtZSA9IHJlLnN1YignLWV4cGVjdGVkXC4uKiQn
LCAnJywgdGVzdF9uYW1lKQorICAgICAgICB0ZXN0X25hbWUgPSByZS5zdWIoJy1hY3R1YWxcLi4q
JCcsICcnLCB0ZXN0X25hbWUpCisgICAgICAgIHBhdGhbLTFdID0gdGVzdF9uYW1lCisgICAgICAg
IHJldHVybiBvcy5wYXRoLnNlcC5qb2luKHBhdGgpCisKKyAgICBkZWYgX3NldF90ZXN0X25hbWUo
c2VsZiwgZmlsZW5hbWUpOgorICAgICAgICBzZWxmLl90ZXN0X25hbWUgPSBmaWxlbmFtZQorICAg
ICAgICBpZiBvcy5wYXRoLnNlcCBpbiBmaWxlbmFtZToKKyAgICAgICAgICAgIHNlbGYuX3Rlc3Rf
bmFtZSA9IGZpbGVuYW1lWzpmaWxlbmFtZS5yaW5kZXgob3MucGF0aC5zZXApXQorCisgICAgZGVm
IGNvbnRlbnRzKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5fbWFpbl9maWxlLmNvbnRlbnRz
KCkKKworICAgIGRlZiBzYXZlX3RvKHNlbGYsIHBhdGgpOgorICAgICAgICBmb3IgZmlsZSBpbiBz
ZWxmLl9maWxlczoKKyAgICAgICAgICAgIGZpbGUuc2F2ZV90byhwYXRoKQorCisgICAgZGVmIGlz
X2FjdHVhbChzZWxmKToKKyAgICAgICAgIiIiQXJlIHRoZXNlIHJlc3VsdHMgdGhlIGFjdHVhbCBv
dXRwdXQgb2YgYSB0ZXN0PyIiIgorICAgICAgICByZXR1cm4gc2VsZi5faXNfYWN0dWFsCisKKyAg
ICBkZWYgbmFtZShzZWxmKToKKyAgICAgICAgIiIiVGhlIG5hbWUgb2YgdGhpcyB0ZXN0IChkb2Vz
bid0IGluY2x1ZGUgZXh0ZW5zaW9uKSIiIgorICAgICAgICByZXR1cm4gc2VsZi5fbmFtZQorCisg
ICAgZGVmIHNhbWVfY29udGVudChzZWxmLCBvdGhlcik6CisgICAgICAgIHJldHVybiBzZWxmLmNv
bnRlbnRzKCkgPT0gb3RoZXIuY29udGVudHMoKQorCisgICAgZGVmIF9fZXFfXyhzZWxmLCBvdGhl
cik6CisgICAgICAgIHJldHVybiBvdGhlciAhPSBOb25lIGFuZCBzZWxmLm5hbWUoKSA9PSBvdGhl
ci5uYW1lKCkgYW5kIHNlbGYudHlwZSgpID09IG90aGVyLnR5cGUoKSBhbmQgc2VsZi5wbGF0Zm9y
bSgpID09IG90aGVyLnBsYXRmb3JtKCkgYW5kIHNlbGYuaXNfYWN0dWFsKCkgPT0gb3RoZXIuaXNf
YWN0dWFsKCkgYW5kIHNlbGYuc2FtZV9jb250ZW50KG90aGVyKQorCisgICAgZGVmIF9faGFzaF9f
KHNlbGYpOgorICAgICAgICByZXR1cm4gaGFzaChzdHIoc2VsZi5uYW1lKCkpICsgc3RyKHNlbGYu
dHlwZSgpKSArIHN0cihzZWxmLnBsYXRmb3JtKCkpKQorCisgICAgZGVmIGlzX25ld2VyX3RoYW4o
c2VsZiwgb3RoZXIpOgorICAgICAgICAiIiInTmV3JyByZXN1bHRzIGFyZSB0aG9zZSBhY3R1YWxs
eSBjb21pbmcgZnJvbSBhIHRlc3QuIiIiCisgICAgICAgIHJldHVybiBzZWxmLmlzX2FjdHVhbCgp
IGFuZCBub3Qgb3RoZXIuaXNfYWN0dWFsKCkKKworICAgIGRlZiBpc19yZWJhc2VsaW5lX29mKHNl
bGYsIG90aGVyKToKKyAgICAgICAgcmV0dXJuIHNlbGYubmFtZSgpID09IG90aGVyLm5hbWUoKSBh
bmQgc2VsZi50eXBlKCkgPT0gb3RoZXIudHlwZSgpIGFuZCBzZWxmLnBsYXRmb3JtKCkgPT0gb3Ro
ZXIucGxhdGZvcm0oKSBhbmQgc2VsZi5pc19hY3R1YWwoKSBhbmQgKG5vdCBvdGhlci5pc19hY3R1
YWwoKSkKKworICAgIGRlZiBfX3N0cl9fKHNlbGYpOgorICAgICAgICBhY3R1YWxfc3RyID0gJ1tB
XSAnIGlmIHNlbGYuaXNfYWN0dWFsKCkgZWxzZSAnJworICAgICAgICByZXR1cm4gIlJlc3VsdFsl
cy8lc10gJXMlcyIgJSAoc2VsZi5fcGxhdGZvcm0sIHNlbGYuX3Jlc3VsdF90eXBlLCBhY3R1YWxf
c3RyLCBzZWxmLm5hbWUoKSkKKworICAgIGRlZiB0eXBlKHNlbGYpOgorICAgICAgICByZXR1cm4g
c2VsZi5fcmVzdWx0X3R5cGUKKworICAgIGRlZiBwbGF0Zm9ybShzZWxmKToKKyAgICAgICAgcmV0
dXJuIHNlbGYuX3BsYXRmb3JtCisKKyAgICBkZWYgX2luc3RhbGxfZmlsZShzZWxmLCBmaWxlLCBw
YXRoKToKKyAgICAgICAgaWYgc2VsZi5fcGxhdGZvcm0gaXMgTm9uZToKKyAgICAgICAgICAgIHBs
YXRmb3JtX2NvbXBvbmVudCA9ICIiCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBwbGF0Zm9y
bV9jb21wb25lbnQgPSAicGxhdGZvcm0vJXMvIiAlIHNlbGYuX3BsYXRmb3JtCisgICAgICAgIGV4
dGVuc2lvbiA9IG9zLnBhdGguc3BsaXRleHQoZmlsZS5uYW1lKCkpWzFdCisgICAgICAgIHBhdGgg
PSAnJXMvJXMnICUgKHBhdGgsIHBsYXRmb3JtX2NvbXBvbmVudCkKKyAgICAgICAgZmlsZW5hbWUg
PSBzZWxmLm5hbWUoKSArICctZXhwZWN0ZWQnICsgZXh0ZW5zaW9uCisgICAgICAgIGZpbGUuc2F2
ZV90byhwYXRoLCBmaWxlbmFtZSkKKworICAgIGRlZiBpbnN0YWxsKHNlbGYsIHBhdGgpOgorICAg
ICAgICBmb3IgZmlsZSBpbiBzZWxmLl9maWxlczoKKyAgICAgICAgICAgIHNlbGYuX2luc3RhbGxf
ZmlsZShmaWxlLCBwYXRoKQorCisgICAgZGVmIGRlbGV0ZShzZWxmKToKKyAgICAgICAgZm9yIGZp
bGUgaW4gc2VsZi5fZmlsZXM6CisgICAgICAgICAgICBmaWxlLmRlbGV0ZSgpCisKKworY2xhc3Mg
VGV4dFJlc3VsdChSZXN1bHQpOgorICAgICIiIlJlcHJlc2VudHMgYSB0ZXh0IHJlc3VsdCBvZiBh
IHNpbmdsZSB0ZXN0IG9uIGEgc2luZ2xlIHBsYXRmb3JtIiIiCisgICAgZGVmIF9faW5pdF9fKHNl
bGYsIHBsYXRmb3JtLCB0ZXh0X2ZpbGUpOgorICAgICAgICBzZWxmLl90ZXh0X2ZpbGUgPSB0ZXh0
X2ZpbGUKKyAgICAgICAgUmVzdWx0Ll9faW5pdF9fKHNlbGYsIHBsYXRmb3JtLCAndGV4dCcsIFt0
ZXh0X2ZpbGVdKQorCisgICAgZGVmIHJldGFyZ2V0KHNlbGYsIHBsYXRmb3JtKToKKyAgICAgICAg
cmV0dXJuIFRleHRSZXN1bHQocGxhdGZvcm0sIHNlbGYuX3RleHRfZmlsZSkKKworCitjbGFzcyBJ
bWFnZVJlc3VsdChSZXN1bHQpOgorICAgIGltYWdlX2RpZmZlciA9IE5haXZlSW1hZ2VEaWZmZXIo
KQorICAgICIiIlJlcHJlc2VudHMgYW4gaW1hZ2UgcmVzdWx0IG9mIGEgc2luZ2xlIHRlc3Qgb24g
YSBzaW5nbGUgcGxhdGZvcm0iIiIKKyAgICBkZWYgX19pbml0X18oc2VsZiwgcGxhdGZvcm0sIGlt
YWdlX2ZpbGUsIGNoZWNrc3VtX2ZpbGUpOgorICAgICAgICBzZWxmLl9jaGVja3N1bV9maWxlID0g
Y2hlY2tzdW1fZmlsZQorICAgICAgICBzZWxmLl9pbWFnZV9maWxlID0gaW1hZ2VfZmlsZQorICAg
ICAgICBmaWxlcyA9IGZpbHRlcihib29sLCBbc2VsZi5fY2hlY2tzdW1fZmlsZSwgc2VsZi5faW1h
Z2VfZmlsZV0pCisgICAgICAgIFJlc3VsdC5fX2luaXRfXyhzZWxmLCBwbGF0Zm9ybSwgJ2ltYWdl
JywgZmlsZXMpCisKKyAgICBkZWYgaGFzX2NoZWNrc3VtKHNlbGYpOgorICAgICAgICByZXR1cm4g
c2VsZi5fY2hlY2tzdW1fZmlsZSBpcyBub3QgTm9uZQorCisgICAgZGVmIHNhbWVfY29udGVudChz
ZWxmLCBvdGhlcik6CisgICAgICAgIGlmIHNlbGYuaGFzX2NoZWNrc3VtKCkgYW5kIG90aGVyLmhh
c19jaGVja3N1bSgpOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYuX2NoZWNrc3VtX2ZpbGUuY29u
dGVudHMoKSA9PSBvdGhlci5fY2hlY2tzdW1fZmlsZS5jb250ZW50cygpCisgICAgICAgIGVsc2U6
CisgICAgICAgICAgICBzZWxmX2NvbnRlbnRzID0gc2VsZi5faW1hZ2VfZmlsZS5jb250ZW50cygp
CisgICAgICAgICAgICBvdGhlcl9jb250ZW50cyA9IG90aGVyLl9pbWFnZV9maWxlLmNvbnRlbnRz
KCkKKyAgICAgICAgICAgIHJldHVybiBJbWFnZVJlc3VsdC5pbWFnZV9kaWZmZXIuc2FtZV9pbWFn
ZShzZWxmX2NvbnRlbnRzLCBvdGhlcl9jb250ZW50cykKKworICAgIGRlZiByZXRhcmdldChzZWxm
LCBwbGF0Zm9ybSk6CisgICAgICAgIHJldHVybiBJbWFnZVJlc3VsdChwbGF0Zm9ybSwgc2VsZi5f
aW1hZ2VfZmlsZSwgc2VsZi5fY2hlY2tzdW1fZmlsZSkKZGlmZiAtLWdpdCBhL1dlYktpdFRvb2xz
L1NjcmlwdHMvd2Via2l0cHkvY29tbW9uL25ldC9yZXN1bHRfdW5pdHRlc3QucHkgYi9XZWJLaXRU
b29scy9TY3JpcHRzL3dlYmtpdHB5L2NvbW1vbi9uZXQvcmVzdWx0X3VuaXR0ZXN0LnB5Cm5ldyBm
aWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAuLmM0NTNkYmNkZjExOTY4MDU1MjE0NWI3NDY4MjVhZjA3ZjM5ZjljNmMKLS0tIC9kZXYv
bnVsbAorKysgYi9XZWJLaXRUb29scy9TY3JpcHRzL3dlYmtpdHB5L2NvbW1vbi9uZXQvcmVzdWx0
X3VuaXR0ZXN0LnB5CkBAIC0wLDAgKzEsMTMzIEBACisjIS91c3IvYmluL2VudiBweXRob24KKyMg
Q29weXJpZ2h0IChDKSAyMDEwIEdvb2dsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisjCisj
IFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGgg
b3Igd2l0aG91dAorIyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0
aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyMgYXJlIG1ldDoKKyMKKyMgMS4gIFJlZGlzdHJpYnV0
aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisjICAg
ICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2Ns
YWltZXIuCisjIDIuICBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1
Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorIyAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0
aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorIyAgICAgZG9jdW1lbnRh
dGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlv
bi4KKyMKKyMgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBBTkQgSVRTIENPTlRS
SUJVVE9SUyAiQVMgSVMiIEFORCBBTlkKKyMgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMs
IElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRAorIyBXQVJSQU5USUVT
IE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0Ug
QVJFCisjIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIE9SIElUUyBDT05UUklC
VVRPUlMgQkUgTElBQkxFIEZPUiBBTlkKKyMgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwg
U1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMKKyMgKElOQ0xVRElO
RywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9S
IFNFUlZJQ0VTOworIyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1Mg
SU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKKyMgT04gQU5ZIFRIRU9SWSBPRiBMSUFC
SUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyMg
KElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9V
VCBPRiBUSEUgVVNFIE9GCisjIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUg
UE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKK2ltcG9ydCByZQoraW1wb3J0IHJlc3VsdAor
aW1wb3J0IHVuaXR0ZXN0CisKKworY2xhc3MgRmFrZUZpbGUob2JqZWN0KToKKyAgICBkZWYgX19p
bml0X18oc2VsZiwgZmlsZW5hbWUsIGNvbnRlbnRzPSJmYWtlIGNvbnRlbnRzIik6CisgICAgICAg
IHNlbGYuX2ZpbGVuYW1lID0gZmlsZW5hbWUKKyAgICAgICAgc2VsZi5fY29udGVudHMgPSBjb250
ZW50cworCisgICAgZGVmIG5hbWUoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLl9maWxlbmFt
ZQorCisgICAgZGVmIGNvbnRlbnRzKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5fY29udGVu
dHMKKworCitjbGFzcyBGYWtlUmVzdWx0KHJlc3VsdC5SZXN1bHQpOgorICAgIGRlZiBfX2luaXRf
XyhzZWxmLCBwbGF0Zm9ybSwgcmVzdWx0X3R5cGUsIGNvbnRlbnRzLCBpc19leHBlY3RlZD1GYWxz
ZSk6CisgICAgICAgIHNlbGYuX3Jlc3VsdF90eXBlID0gcmVzdWx0X3R5cGUKKyAgICAgICAgc2Vs
Zi5fY29udGVudHMgPSBjb250ZW50cworICAgICAgICBzZWxmLl9pc19leHBlY3RlZCA9IGlzX2V4
cGVjdGVkCisgICAgICAgIGFjdHVhbCA9ICdhY3R1YWwnCisgICAgICAgIGlmIGlzX2V4cGVjdGVk
OgorICAgICAgICAgICAgYWN0dWFsID0gJ2V4cGVjdGVkJworICAgICAgICB0ZXN0X25hbWUgPSAn
YW5vbnltb3VzLXRlc3QtJXMudHh0JyAlIGFjdHVhbAorICAgICAgICBmaWxlID0gRmFrZUZpbGUo
dGVzdF9uYW1lLCBjb250ZW50cykKKyAgICAgICAgc3VwZXIoRmFrZVJlc3VsdCwgc2VsZikuX19p
bml0X18ocGxhdGZvcm0sIHJlc3VsdF90eXBlLCBbZmlsZV0pCisKKyAgICBkZWYgY29udGVudHMo
c2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLl9jb250ZW50cworCisgICAgZGVmIHJldGFyZ2V0
KHNlbGYsIHBsYXRmb3JtKToKKyAgICAgICAgcmV0dXJuIEZha2VSZXN1bHQocGxhdGZvcm0sIHNl
bGYuX3Jlc3VsdF90eXBlLCBzZWxmLl9jb250ZW50cywgc2VsZi5faXNfZXhwZWN0ZWQpCisKKwor
Y2xhc3MgUmVzdWx0VGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgZGVmIF9jaGVja19uYW1l
KHNlbGYsIGZpbGVuYW1lLCBleHBlY3RlZF90ZXN0X25hbWUpOgorICAgICAgICByID0gcmVzdWx0
LlRleHRSZXN1bHQoTm9uZSwgRmFrZUZpbGUoZmlsZW5hbWUpKQorICAgICAgICBzZWxmLmFzc2Vy
dEVxdWFscyhleHBlY3RlZF90ZXN0X25hbWUsIHIubmFtZSgpKQorCisgICAgZGVmIF9jaGVja19w
bGF0Zm9ybShzZWxmLCBmaWxlbmFtZSwgZXhwZWN0ZWRfcGxhdGZvcm0pOgorICAgICAgICByID0g
cmVzdWx0LlRleHRSZXN1bHQoTm9uZSwgRmFrZUZpbGUoZmlsZW5hbWUpKQorICAgICAgICBzZWxm
LmFzc2VydEVxdWFscyhleHBlY3RlZF9wbGF0Zm9ybSwgci5wbGF0Zm9ybSgpKQorCisgICAgZGVm
IHRlc3RfZXh0cmFjdHNfbmFtZV9jb3JyZWN0bHkoc2VsZik6CisgICAgICAgIHNlbGYuX2NoZWNr
X25hbWUoJ0xheW91dFRlc3RzL2Zhc3QvZG9tL2EtZXhwZWN0ZWQudHh0JywgJ2Zhc3QvZG9tL2En
KQorICAgICAgICBzZWxmLl9jaGVja19uYW1lKCdMYXlvdXRUZXN0cy9mYXN0L2RvbS9hLWFjdHVh
bC50eHQnLCAnZmFzdC9kb20vYScpCisgICAgICAgIHNlbGYuX2NoZWNrX25hbWUoJ0xheW91dFRl
c3RzL3BsYXRmb3JtL3dpbi9mYXN0L2EtZXhwZWN0ZWQudHh0JywgJ2Zhc3QvYScpCisgICAgICAg
IHNlbGYuX2NoZWNrX25hbWUoJ0xheW91dFRlc3RzL3BsYXRmb3JtL3dpbi9mYXN0L2EtZXhwZWN0
ZWQuY2hlY2tzdW0nLCAnZmFzdC9hJykKKyAgICAgICAgc2VsZi5fY2hlY2tfbmFtZSgnZmFzdC9k
b20vdGVzdC1leHBlY3RlZC50eHQnLCAnZmFzdC9kb20vdGVzdCcpCisgICAgICAgIHNlbGYuX2No
ZWNrX25hbWUoJ2xheW91dC10ZXN0LXJlc3VsdHMvZmFzdC9hLWFjdHVhbC5jaGVja3N1bScsICdm
YXN0L2EnKQorCisgICAgZGVmIHRlc3RfZXh0cmFjdHNfcGxhdGZvcm1fY29ycmVjdGx5KHNlbGYp
OgorICAgICAgICBzZWxmLl9jaGVja19wbGF0Zm9ybSgnTGF5b3V0VGVzdHMvcGxhdGZvcm0vd2lu
L2Zhc3QvYS1leHBlY3RlZC50eHQnLCAnd2luJykKKyAgICAgICAgc2VsZi5fY2hlY2tfcGxhdGZv
cm0oJ3BsYXRmb3JtL3dpbi9mYXN0L2EtZXhwZWN0ZWQudHh0JywgJ3dpbicpCisgICAgICAgIHNl
bGYuX2NoZWNrX3BsYXRmb3JtKCdwbGF0Zm9ybS9tYWMvZmFzdC9hLWV4cGVjdGVkLnR4dCcsICdt
YWMnKQorICAgICAgICBzZWxmLl9jaGVja19wbGF0Zm9ybSgnZmFzdC9hLWV4cGVjdGVkLnR4dCcs
IE5vbmUpCisKKyAgICBkZWYgdGVzdF9yZXN1bHRzX2Zyb21fYW5fYWN0dWFsX2ZpbGVfYXJlX21h
cmtlZF9hc19zdWNoKHNlbGYpOgorICAgICAgICByID0gcmVzdWx0LlRleHRSZXN1bHQoTm9uZSwg
RmFrZUZpbGUoJ3Rlc3QtYWN0dWFsLnR4dCcpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoci5p
c19hY3R1YWwoKSkKKworICAgIGRlZiB0ZXN0X3Jlc3VsdHNfZnJvbV9hbl9leHBlY3RlZF9maWxl
X2FyZV9ub3RfYWN0dWFsKHNlbGYpOgorICAgICAgICByID0gcmVzdWx0LlRleHRSZXN1bHQoTm9u
ZSwgRmFrZUZpbGUoJ3Rlc3QtZXhwZWN0ZWQudHh0JykpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFs
c2Uoci5pc19hY3R1YWwoKSkKKworICAgIGRlZiB0ZXN0X2lzX3JlYmFzZWxpbmVfb2Yoc2VsZik6
CisgICAgICAgIGV4cGVjdGVkID0gcmVzdWx0LlRleHRSZXN1bHQoJ21hYycsIEZha2VGaWxlKCd0
ZXN0LWV4cGVjdGVkLnR4dCcpKQorICAgICAgICBhY3R1YWwgPSByZXN1bHQuVGV4dFJlc3VsdCgn
bWFjJywgRmFrZUZpbGUoJ3Rlc3QtYWN0dWFsLnR4dCcpKQorICAgICAgICBzZWxmLmFzc2VydFRy
dWUoYWN0dWFsLmlzX3JlYmFzZWxpbmVfb2YoZXhwZWN0ZWQpKQorICAgICAgICBzZWxmLmFzc2Vy
dEZhbHNlKGV4cGVjdGVkLmlzX3JlYmFzZWxpbmVfb2YoYWN0dWFsKSkKKworICAgIGRlZiB0ZXN0
X19lcV9fKHNlbGYpOgorICAgICAgICByMSA9IHJlc3VsdC5UZXh0UmVzdWx0KCdtYWMnLCBGYWtl
RmlsZSgndGVzdC1leHBlY3RlZC50eHQnLCAnY29udGVudHMnKSkKKyAgICAgICAgcjIgPSByZXN1
bHQuVGV4dFJlc3VsdCgnbWFjJywgRmFrZUZpbGUoJ3Rlc3QtZXhwZWN0ZWQudHh0JywgJ2NvbnRl
bnRzJykpCisgICAgICAgIHIzID0gcmVzdWx0LlRleHRSZXN1bHQoJ3dpbicsIEZha2VGaWxlKCd0
ZXN0LWV4cGVjdGVkLnR4dCcsICdjb250ZW50cycpKQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1
YWxzKHIxLCByMikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMocjEsIHIyLnJldGFyZ2V0KCdt
YWMnKSkKKyAgICAgICAgc2VsZi5hc3NlcnROb3RFcXVhbHMocjEsIHIyLnJldGFyZ2V0KCd3aW4n
KSkKKworICAgIGRlZiB0ZXN0X19oYXNoX18oc2VsZik6CisgICAgICAgIHIxID0gcmVzdWx0LlRl
eHRSZXN1bHQoJ21hYycsIEZha2VGaWxlKCd0ZXN0LWV4cGVjdGVkLnR4dCcsICdjb250ZW50cycp
KQorICAgICAgICByMiA9IHJlc3VsdC5UZXh0UmVzdWx0KCdtYWMnLCBGYWtlRmlsZSgndGVzdC1l
eHBlY3RlZC50eHQnLCAnY29udGVudHMnKSkKKyAgICAgICAgcjMgPSByZXN1bHQuVGV4dFJlc3Vs
dChOb25lLCBGYWtlRmlsZSgndGVzdC1leHBlY3RlZC50eHQnLCBOb25lKSkKKworICAgICAgICB4
ID0gc2V0KFtyMSwgcjJdKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscygxLCBsZW4oc2V0KFty
MSwgcjJdKSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKDIsIGxlbihzZXQoW3IxLCByMiwg
cjNdKSkpCisKKyAgICBkZWYgdGVzdF9pbWFnZV9kaWZmX2lzX2ludm9rZWRfZm9yX2ltYWdlX3Jl
c3VsdHNfd2l0aG91dF9jaGVja3N1bShzZWxmKToKKyAgICAgICAgcjEgPSByZXN1bHQuSW1hZ2VS
ZXN1bHQoJ21hYycsIEZha2VGaWxlKCd0ZXN0LWV4cGVjdGVkLnBuZycsICdhc2RmJyksIEZha2VG
aWxlKCd0ZXN0LWV4cGVjdGVkLmNoZWNrc3VtJywgJ2NoZWNrJykpCisgICAgICAgIHIyID0gcmVz
dWx0LkltYWdlUmVzdWx0KCdtYWMnLCBGYWtlRmlsZSgndGVzdC1leHBlY3RlZC5wbmcnLCAnYXNk
ZicpLCBOb25lKQorCisgICAgICAgICMgRGVmYXVsdCBiZWhhdmlvdXIgaXMgdG8ganVzdCBjb21w
YXJlIG9uIGltYWdlIGNvbnRlbnRzLgorICAgICAgICBzZWxmLmFzc2VydFRydWUocjEuc2FtZV9j
b250ZW50KHIyKSkKKworICAgICAgICBjbGFzcyBBbGxJbWFnZXNBcmVEaWZmZXJlbnQob2JqZWN0
KToKKyAgICAgICAgICAgIGRlZiBzYW1lX2ltYWdlKHNlbGYsIGltYWdlMSwgaW1hZ2UyKToKKyAg
ICAgICAgICAgICAgICByZXR1cm4gRmFsc2UKKworICAgICAgICAjIEJ1dCB3ZSBjYW4gaW5zdGFs
bCBvdGhlciBpbWFnZSBkaWZmZXJzLgorICAgICAgICByZXN1bHQuSW1hZ2VSZXN1bHQuaW1hZ2Vf
ZGlmZmVyID0gQWxsSW1hZ2VzQXJlRGlmZmVyZW50KCkKKworICAgICAgICBzZWxmLmFzc2VydEZh
bHNlKHIxLnNhbWVfY29udGVudChyMikpCisKK2lmIF9fbmFtZV9fID09ICJfX21haW5fXyI6Cisg
ICAgdW5pdHRlc3QubWFpbigpCmRpZmYgLS1naXQgYS9XZWJLaXRUb29scy9TY3JpcHRzL3dlYmtp
dHB5L2NvbW1vbi9uZXQvcmVzdWx0c2V0LnB5IGIvV2ViS2l0VG9vbHMvU2NyaXB0cy93ZWJraXRw
eS9jb21tb24vbmV0L3Jlc3VsdHNldC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwLi4xMGYyNjcyODZmZTdlODliYWFi
YmRkYjUyMjljNjg0YzE4MzU0N2RlCi0tLSAvZGV2L251bGwKKysrIGIvV2ViS2l0VG9vbHMvU2Ny
aXB0cy93ZWJraXRweS9jb21tb24vbmV0L3Jlc3VsdHNldC5weQpAQCAtMCwwICsxLDEzMSBAQAor
IyEvdXNyL2Jpbi9lbnYgcHl0aG9uCisjIENvcHlyaWdodCAoQykgMjAxMCBHb29nbGUgSW5jLiBB
bGwgcmlnaHRzIHJlc2VydmVkLgorIworIyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJj
ZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyMgbW9kaWZpY2F0aW9uLCBhcmUg
cGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisjIGFyZSBt
ZXQ6CisjCisjIDEuICBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4g
dGhlIGFib3ZlIGNvcHlyaWdodAorIyAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9u
cyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorIyAyLiAgUmVkaXN0cmlidXRpb25zIGlu
IGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyMgICAgIG5v
dGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1l
ciBpbiB0aGUKKyMgICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92
aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisjCisjIFRISVMgU09GVFdBUkUgSVMgUFJPVklE
RUQgQlkgQVBQTEUgQU5EIElUUyBDT05UUklCVVRPUlMgIkFTIElTIiBBTkQgQU5ZCisjIEVYUFJF
U1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywg
VEhFIElNUExJRUQKKyMgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1Mg
Rk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQorIyBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBT
SEFMTCBBUFBMRSBPUiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZCisjIERJUkVD
VCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVO
VElBTCBEQU1BR0VTCisjIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1F
TlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyMgTE9TUyBPRiBVU0UsIERBVEEs
IE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5E
CisjIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJ
Q1QgTElBQklMSVRZLCBPUiBUT1JUCisjIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJ
U0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorIyBUSElTIFNPRlRXQVJF
LCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCitm
cm9tIHdlYmtpdHB5LmNvbW1vbi5kaXJhc3ppcCBpbXBvcnQgRGlyQXNaaXAKK2Zyb20gd2Via2l0
cHkuY29tbW9uLm5ldC5yZW1vdGV6aXAgaW1wb3J0IFJlbW90ZVppcAoraW1wb3J0IHJlCitpbXBv
cnQgcmVzdWx0CitpbXBvcnQgdXJsbGliCisKKworY2xhc3MgUmVzdWx0U2V0KG9iamVjdCk6Cisg
ICAgIiIiUmV0cmlldmVzIHJlc3VsdHMgZnJvbSB6aXAgZmlsZXMiIiIKKyAgICBkZWYgX19pbml0
X18oc2VsZiwgbmFtZSwgcGxhdGZvcm0sIHppcF9maWxlLCAqKmt3YXJncyk6CisgICAgICAgIHNl
bGYuX25hbWUgPSBuYW1lCisgICAgICAgIHNlbGYuX3BsYXRmb3JtID0gcGxhdGZvcm0KKyAgICAg
ICAgc2VsZi5femlwX2ZpbGUgPSB6aXBfZmlsZQorICAgICAgICBzZWxmLl9pbmNsdWRlX2V4cGVj
dGVkID0ga3dhcmdzLmdldCgnaW5jbHVkZV9leHBlY3RlZCcsIFRydWUpCisKKyAgICBAY2xhc3Nt
ZXRob2QKKyAgICBkZWYgZnJvbV96aXBfdXJsKGNscywgcGxhdGZvcm0sIHppcF9wYXRoKToKKyAg
ICAgICAgcmV0dXJuIFJlc3VsdFNldCgnbG9jYWwgemlwICVzIGJ1aWxkZXInICUgcGxhdGZvcm0s
IHBsYXRmb3JtLCBSZW1vdGVaaXAoemlwX3BhdGgpKQorCisgICAgQGNsYXNzbWV0aG9kCisgICAg
ZGVmIGZyb21femlwKGNscywgcGxhdGZvcm0sIHppcCk6CisgICAgICAgIHJldHVybiBSZXN1bHRT
ZXQoJ2xvY2FsIHppcCAlcyBidWlsZGVyJyAlIHBsYXRmb3JtLCBwbGF0Zm9ybSwgemlwKQorCisg
ICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIGZyb21femlwX21hcChjbHMsIHppcF9tYXApOgorICAg
ICAgICByZXN1bHRfc2V0cyA9IFtdCisgICAgICAgIGZvciBrLCB2IGluIHppcF9tYXAuaXRlbXMo
KToKKyAgICAgICAgICAgIHJlc3VsdF9zZXRzLmFwcGVuZChSZXN1bHRTZXQuZnJvbV96aXAoaywg
dikpCisgICAgICAgIHJldHVybiBBZ2dyZWdhdGVSZXN1bHRTZXQocmVzdWx0X3NldHMpCisKKyAg
ICBAY2xhc3NtZXRob2QKKyAgICBkZWYgZnJvbV9wYXRoKHNlbGYsIHBhdGgsIHBsYXRmb3JtPU5v
bmUpOgorICAgICAgICB6ID0gRGlyQXNaaXAocGF0aCkKKyAgICAgICAgcmV0dXJuIFJlc3VsdFNl
dCgnbG9jYWwgJXMgYnVpbGRlcicgJSBwbGF0Zm9ybSwgcGxhdGZvcm0sIHopCisKKyAgICBkZWYg
bmFtZShzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX25hbWUKKworICAgIGRlZiBzZXRfcGxh
dGZvcm0oc2VsZiwgcGxhdGZvcm0pOgorICAgICAgICBzZWxmLl9wbGF0Zm9ybSA9IHBsYXRmb3Jt
CisKKyAgICBkZWYgZmlsZXMoc2VsZik6CisgICAgICAgIGZpbGVzID0gW10KKyAgICAgICAgZm9y
IGZpbGVuYW1lIGluIHNlbGYuX3ppcF9maWxlLm5hbWVsaXN0KCk6CisgICAgICAgICAgICBmaWxl
cy5hcHBlbmQoc2VsZi5femlwX2ZpbGUuaGFuZGxlX3RvKGZpbGVuYW1lKSkKKyAgICAgICAgcmV0
dXJuIGZpbGVzCisKKyAgICBkZWYgcmVzdWx0c19mb3Ioc2VsZiwgbmFtZSwgKiprd2FyZ3MpOgor
ICAgICAgICB0YXJnZXRfdHlwZSA9IGt3YXJncy5nZXQoJ3RhcmdldF90eXBlJywgTm9uZSkKKyAg
ICAgICAgZXhhY3RfbWF0Y2ggPSBrd2FyZ3MuZ2V0KCdleGFjdF9tYXRjaCcsIEZhbHNlKQorICAg
ICAgICBpZiByZS5zZWFyY2gocidcLng/aHRtbCcsIG5hbWUpOgorICAgICAgICAgICAgbmFtZSA9
IG5hbWVbOm5hbWUucmluZGV4KCcuJyldCisgICAgICAgIG5hbWVfbWF0Y2hlciA9IHJlLmNvbXBp
bGUobmFtZSkKKyAgICAgICAgYWN0dWFsX21hdGNoZXIgPSByZS5jb21waWxlKHInLWFjdHVhbFwu
JykKKyAgICAgICAgZXhwZWN0ZWRfbWF0Y2hlciA9IHJlLmNvbXBpbGUocictZXhwZWN0ZWRcLicp
CisKKyAgICAgICAgY2hlY2tzdW1fZmlsZXMgPSBbXQorICAgICAgICB0ZXh0X2ZpbGVzID0gW10K
KyAgICAgICAgaW1hZ2VfZmlsZXMgPSBbXQorICAgICAgICBmb3IgcmVzdWx0X2ZpbGUgaW4gc2Vs
Zi5maWxlcygpOgorICAgICAgICAgICAgbmFtZV9tYXRjaCA9IG5hbWVfbWF0Y2hlci5zZWFyY2go
cmVzdWx0X2ZpbGUubmFtZSgpKQorICAgICAgICAgICAgYWN0dWFsX21hdGNoID0gYWN0dWFsX21h
dGNoZXIuc2VhcmNoKHJlc3VsdF9maWxlLm5hbWUoKSkKKyAgICAgICAgICAgIGV4cGVjdGVkX21h
dGNoID0gZXhwZWN0ZWRfbWF0Y2hlci5zZWFyY2gocmVzdWx0X2ZpbGUubmFtZSgpKQorICAgICAg
ICAgICAgaWYgbmFtZV9tYXRjaCBhbmQgKGFjdHVhbF9tYXRjaCBvciAoc2VsZi5faW5jbHVkZV9l
eHBlY3RlZCBhbmQgZXhwZWN0ZWRfbWF0Y2gpKToKKyAgICAgICAgICAgICAgICBpZiByZXN1bHRf
ZmlsZS5uYW1lKCkuZW5kc3dpdGgoJy5jaGVja3N1bScpOgorICAgICAgICAgICAgICAgICAgICBj
aGVja3N1bV9maWxlcy5hcHBlbmQocmVzdWx0X2ZpbGUpCisgICAgICAgICAgICAgICAgZWxpZiBy
ZXN1bHRfZmlsZS5uYW1lKCkuZW5kc3dpdGgoJy50eHQnKToKKyAgICAgICAgICAgICAgICAgICAg
dGV4dF9maWxlcy5hcHBlbmQocmVzdWx0X2ZpbGUpCisgICAgICAgICAgICAgICAgZWxpZiByZXN1
bHRfZmlsZS5uYW1lKCkuZW5kc3dpdGgoJy5wbmcnKToKKyAgICAgICAgICAgICAgICAgICAgaW1h
Z2VfZmlsZXMuYXBwZW5kKHJlc3VsdF9maWxlKQorCisgICAgICAgIHJlc3VsdHMgPSBbXQorICAg
ICAgICBmb3IgaW1hZ2VfZmlsZSBpbiBpbWFnZV9maWxlczoKKyAgICAgICAgICAgIGNoZWNrc3Vt
X2ZpbGVfbmFtZSA9IHJlLnN1YihyZS5jb21waWxlKCdcLnBuZycpLCAnLmNoZWNrc3VtJywgaW1h
Z2VfZmlsZS5uYW1lKCkpCisgICAgICAgICAgICBmb3VuZF9jaGVja3N1bSA9IEZhbHNlCisgICAg
ICAgICAgICBmb3IgY2hlY2tzdW1fZmlsZSBpbiBjaGVja3N1bV9maWxlczoKKyAgICAgICAgICAg
ICAgICBpZiBjaGVja3N1bV9maWxlLm5hbWUoKSA9PSBjaGVja3N1bV9maWxlX25hbWU6CisgICAg
ICAgICAgICAgICAgICAgIGZvdW5kX2NoZWNrc3VtID0gVHJ1ZQorICAgICAgICAgICAgICAgICAg
ICByZXN1bHRzLmFwcGVuZChyZXN1bHQuSW1hZ2VSZXN1bHQoc2VsZi5fcGxhdGZvcm0sIGltYWdl
X2ZpbGUsIGNoZWNrc3VtX2ZpbGUpKQorICAgICAgICAgICAgICAgICAgICBicmVhaworICAgICAg
ICAgICAgaWYgbm90IGZvdW5kX2NoZWNrc3VtOgorICAgICAgICAgICAgICAgICMgcHJpbnQgIkNv
dWxkbid0IGZpbmQgY2hlY2tzdW0gZm9yIGltYWdlICclcyciICUgaW1hZ2VfZmlsZS5uYW1lKCkK
KyAgICAgICAgICAgICAgICByZXN1bHRzLmFwcGVuZChyZXN1bHQuSW1hZ2VSZXN1bHQoc2VsZi5f
cGxhdGZvcm0sIGltYWdlX2ZpbGUsIE5vbmUpKQorCisgICAgICAgIGZvciB0ZXh0X2ZpbGUgaW4g
dGV4dF9maWxlczoKKyAgICAgICAgICAgIHJlc3VsdHMuYXBwZW5kKHJlc3VsdC5UZXh0UmVzdWx0
KHNlbGYuX3BsYXRmb3JtLCB0ZXh0X2ZpbGUpKQorCisgICAgICAgIGlmIGV4YWN0X21hdGNoOgor
ICAgICAgICAgICAgcmVzdWx0cyA9IGZpbHRlcihsYW1iZGEgcjogci5uYW1lKCkgPT0gbmFtZSwg
cmVzdWx0cykKKworICAgICAgICByZXN1bHRzID0gZmlsdGVyKGxhbWJkYSByOiB0YXJnZXRfdHlw
ZSBpcyBOb25lIG9yIHRhcmdldF90eXBlID09IHIudHlwZSgpLCByZXN1bHRzKQorICAgICAgICBy
ZXR1cm4gcmVzdWx0cworCisKK2NsYXNzIEFnZ3JlZ2F0ZVJlc3VsdFNldChvYmplY3QpOgorICAg
ICIiIkNvbGxlY3RzIHJlc3VsdHMgZnJvbSBhIGxpc3Qgb2YgYnVpbGRlcnMiIiIKKyAgICBkZWYg
X19pbml0X18oc2VsZiwgYnVpbGRlcnMpOgorICAgICAgICBzZWxmLl9idWlsZGVycyA9IGJ1aWxk
ZXJzCisKKyAgICBkZWYgcmVzdWx0c19mb3Ioc2VsZiwgbmFtZSwgKiprd2FyZ3MpOgorICAgICAg
ICByZXN1bHRzID0gW10KKyAgICAgICAgZm9yIGJ1aWxkZXIgaW4gc2VsZi5fYnVpbGRlcnM6Cisg
ICAgICAgICAgICByZXN1bHRzICs9IGJ1aWxkZXIucmVzdWx0c19mb3IobmFtZSwgKiprd2FyZ3Mp
CisgICAgICAgIHJldHVybiByZXN1bHRzCisKKyAgICBkZWYgc3ViX2J1aWxkZXJzKHNlbGYpOgor
ICAgICAgICByZXR1cm4gc2VsZi5fYnVpbGRlcnMKZGlmZiAtLWdpdCBhL1dlYktpdFRvb2xzL1Nj
cmlwdHMvd2Via2l0cHkvY29tbW9uL25ldC9yZXN1bHRzZXRfdW5pdHRlc3QucHkgYi9XZWJLaXRU
b29scy9TY3JpcHRzL3dlYmtpdHB5L2NvbW1vbi9uZXQvcmVzdWx0c2V0X3VuaXR0ZXN0LnB5Cm5l
dyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAuLjUwZWZiNjM5Nzg4NDYzMjA4NzUzYmUwYjAwOTJlNWM3Yzg5N2Q3YWQKLS0tIC9k
ZXYvbnVsbAorKysgYi9XZWJLaXRUb29scy9TY3JpcHRzL3dlYmtpdHB5L2NvbW1vbi9uZXQvcmVz
dWx0c2V0X3VuaXR0ZXN0LnB5CkBAIC0wLDAgKzEsMTUyIEBACisjIS91c3IvYmluL2VudiBweXRo
b24KKyMgQ29weXJpZ2h0IChDKSAyMDEwIEdvb2dsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQu
CisjCisjIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMs
IHdpdGggb3Igd2l0aG91dAorIyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQg
dGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyMgYXJlIG1ldDoKKyMKKyMgMS4gIFJlZGlz
dHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0
CisjICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5n
IGRpc2NsYWltZXIuCisjIDIuICBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCBy
ZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorIyAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2Yg
Y29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorIyAgICAgZG9j
dW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3Ry
aWJ1dGlvbi4KKyMKKyMgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBBTkQgSVRT
IENPTlRSSUJVVE9SUyAiQVMgSVMiIEFORCBBTlkKKyMgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJB
TlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRAorIyBXQVJS
QU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBV
UlBPU0UgQVJFCisjIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIE9SIElUUyBD
T05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkKKyMgRElSRUNULCBJTkRJUkVDVCwgSU5DSURF
TlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMKKyMgKElO
Q0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdP
T0RTIE9SIFNFUlZJQ0VTOworIyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVT
SU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKKyMgT04gQU5ZIFRIRU9SWSBP
RiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRP
UlQKKyMgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkg
V0FZIE9VVCBPRiBUSEUgVVNFIE9GCisjIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBP
RiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKK2Zyb20gd2Via2l0cHkuY29tbW9u
Lm5ldC5yZW1vdGV6aXAgaW1wb3J0IFppcEZpbGVIYW5kbGUKK2ltcG9ydCByZXN1bHRzZXQKK2lt
cG9ydCB1bml0dGVzdAorCisKK2NsYXNzIEZha2VaaXAob2JqZWN0KToKKyAgICBkZWYgX19pbml0
X18oc2VsZik6CisgICAgICAgIHNlbGYuX2ZpbGVzID0ge30KKworICAgIGRlZiBfX3N0cl9fKHNl
bGYpOgorICAgICAgICByZXR1cm4gIkZha2VaaXAiCisKKyAgICBkZWYgaW5zZXJ0KHNlbGYsIGZp
bGVuYW1lLCBjb250ZW50KToKKyAgICAgICAgc2VsZi5fZmlsZXNbZmlsZW5hbWVdID0gY29udGVu
dAorCisgICAgZGVmIG5hbWVsaXN0KHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5fZmlsZXMu
a2V5cygpCisKKyAgICBkZWYgaGFuZGxlX3RvKHNlbGYsIGZpbGVuYW1lKToKKyAgICAgICAgcmV0
dXJuIFppcEZpbGVIYW5kbGUoc2VsZiwgZmlsZW5hbWUpCisKKyAgICBkZWYgcmVhZChzZWxmLCBm
aWxlbmFtZSk6CisgICAgICAgIHJldHVybiBzZWxmLl9maWxlc1tmaWxlbmFtZV0KKworICAgIGRl
ZiBleHRyYWN0KHNlbGYsIGZpbGVuYW1lLCBwYXRoKToKKyAgICAgICAgcHJpbnQgIkZha2VaaXA+
IGNwICVzICVzIiAlIChmaWxlbmFtZSwgcGF0aCkKKworICAgIGRlZiBkZWxldGUoc2VsZiwgZmls
ZW5hbWUpOgorICAgICAgICBwcmludCAiRmFrZVppcD4gcm0gJXMiICUgZmlsZW5hbWUKKyAgICAg
ICAgc2VsZi5fZmlsZXNbZmlsZW5hbWVdID0gTm9uZQorCisKK2NsYXNzIFJlc3VsdFNldFRlc3Qo
dW5pdHRlc3QuVGVzdENhc2UpOgorICAgIGRlZiBfcmVzdWx0c2V0X3dpdGhfemlwKHNlbGYsIHpp
cCwgKiprd2FyZ3MpOgorICAgICAgICByZXR1cm4gcmVzdWx0c2V0LlJlc3VsdFNldCgnPGZha2Ut
cmVzdWx0c2V0PicsICc8ZmFrZS1wbGF0Zm9ybT4nLCB6aXAsICoqa3dhcmdzKQorCisgICAgZGVm
IHRlc3RfdGV4dF9maWxlc19nZXRfaW50ZXJwcmV0ZWRfYXNfdGV4dF9yZXN1bHRzKHNlbGYpOgor
ICAgICAgICB6aXAgPSBGYWtlWmlwKCkKKyAgICAgICAgemlwLmluc2VydCgnZmFzdC9kb20vc29t
ZS10ZXN0LWFjdHVhbC50eHQnLCAnYWN0dWFsIHJlc3VsdHMnKQorICAgICAgICBiID0gc2VsZi5f
cmVzdWx0c2V0X3dpdGhfemlwKHppcCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoMSwgbGVu
KGIucmVzdWx0c19mb3IoJ2Zhc3QvZG9tL3NvbWUtdGVzdCcpKSkKKyAgICAgICAgc2VsZi5hc3Nl
cnRFcXVhbHMoJ2Zhc3QvZG9tL3NvbWUtdGVzdCcsIGIucmVzdWx0c19mb3IoJ2Zhc3QvZG9tL3Nv
bWUtdGVzdC5odG1sJylbMF0ubmFtZSgpKQorCisgICAgZGVmIHRlc3RfaW1hZ2VfYW5kX2NoZWNr
c3VtX2ZpbGVzX2dldF9pbnRlcnByZXRlZF9hc19hX3NpbmdsZV9pbWFnZV9yZXN1bHQoc2VsZik6
CisgICAgICAgIHppcCA9IEZha2VaaXAoKQorICAgICAgICB6aXAuaW5zZXJ0KCdmYXN0L2RvbS9z
b21lLXRlc3QtYWN0dWFsLmNoZWNrc3VtJywgJ2FiYzEyMycpCisgICAgICAgIHppcC5pbnNlcnQo
J2Zhc3QvZG9tL3NvbWUtdGVzdC1hY3R1YWwucG5nJywgJzxpbWFnZSBkYXRhPicpCisgICAgICAg
IGIgPSBzZWxmLl9yZXN1bHRzZXRfd2l0aF96aXAoemlwKQorICAgICAgICByZXN1bHRzID0gYi5y
ZXN1bHRzX2ZvcignZmFzdC9kb20vc29tZS10ZXN0JykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVh
bHMoMSwgbGVuKHJlc3VsdHMpKQorICAgICAgICByZXN1bHQgPSByZXN1bHRzWzBdCisgICAgICAg
IHNlbGYuYXNzZXJ0RXF1YWxzKCdpbWFnZScsIHJlc3VsdC50eXBlKCkpCisgICAgICAgIHNlbGYu
YXNzZXJ0RXF1YWxzKCdhYmMxMjMnLCByZXN1bHQuY29udGVudHMoKSkKKworICAgIGRlZiB0ZXN0
X211bHRpcGxlX2ltYWdlX3Jlc3VsdHNfYXJlX2RldGVjdGVkKHNlbGYpOgorICAgICAgICB6aXAg
PSBGYWtlWmlwKCkKKyAgICAgICAgemlwLmluc2VydCgncGxhdGZvcm0vd2luL2Zhc3QvZG9tL3Nv
bWUtdGVzdC1hY3R1YWwuY2hlY2tzdW0nLCAnY2hlY2tzdW0xJykKKyAgICAgICAgemlwLmluc2Vy
dCgncGxhdGZvcm0vd2luL2Zhc3QvZG9tL3NvbWUtdGVzdC1hY3R1YWwucG5nJywgJzxpbWFnZSBk
YXRhIDE+JykKKyAgICAgICAgemlwLmluc2VydCgncGxhdGZvcm0vbWFjL2Zhc3QvZG9tL3NvbWUt
dGVzdC1hY3R1YWwuY2hlY2tzdW0nLCAnY2hlY2tzdW0yJykKKyAgICAgICAgemlwLmluc2VydCgn
cGxhdGZvcm0vbWFjL2Zhc3QvZG9tL3NvbWUtdGVzdC1hY3R1YWwucG5nJywgJzxpbWFnZSBkYXRh
IDI+JykKKyAgICAgICAgYiA9IHNlbGYuX3Jlc3VsdHNldF93aXRoX3ppcCh6aXApCisgICAgICAg
IHJlc3VsdHMgPSBiLnJlc3VsdHNfZm9yKCdmYXN0L2RvbS9zb21lLXRlc3QnKQorICAgICAgICBz
ZWxmLmFzc2VydEVxdWFscygyLCBsZW4ocmVzdWx0cykpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFs
c2UocmVzdWx0c1swXS5zYW1lX2NvbnRlbnQocmVzdWx0c1sxXSkpCisKKyAgICBkZWYgdGVzdF9h
Z2dyZWdhdGVfcmVzdWx0X3NldF9jb3JyZWN0bHlfcmV0cmlldmVzX3Rlc3RzX2Zyb21fbXVsdGlw
bGVfcmVzdWx0X3NldHMoc2VsZik6CisgICAgICAgIHJlc3VsdHNldDFfemlwID0gRmFrZVppcCgp
CisgICAgICAgIHJlc3VsdHNldDFfemlwLmluc2VydCgnZmFzdC9kb20vdGVzdC1hY3R1YWwudHh0
JywgJ2xpbnV4IHRleHQgcmVzdWx0JykKKyAgICAgICAgcmVzdWx0c2V0MSA9IHJlc3VsdHNldC5S
ZXN1bHRTZXQoJ2xpbnV4LXJlc3VsdHNldCcsICdsaW51eCcsIHJlc3VsdHNldDFfemlwKQorICAg
ICAgICByZXN1bHRzZXQyX3ppcCA9IEZha2VaaXAoKQorICAgICAgICByZXN1bHRzZXQyX3ppcC5p
bnNlcnQoJ2Zhc3QvZG9tL3Rlc3QtYWN0dWFsLnR4dCcsICd3aW5kb3dzIHRleHQgcmVzdWx0JykK
KyAgICAgICAgcmVzdWx0c2V0MiA9IHJlc3VsdHNldC5SZXN1bHRTZXQoJ3dpbi1yZXN1bHRzZXQn
LCAnd2luJywgcmVzdWx0c2V0Ml96aXApCisKKyAgICAgICAgYiA9IHJlc3VsdHNldC5BZ2dyZWdh
dGVSZXN1bHRTZXQoW3Jlc3VsdHNldDEsIHJlc3VsdHNldDJdKQorICAgICAgICBzZWxmLmFzc2Vy
dEVxdWFscygyLCBsZW4oYi5yZXN1bHRzX2ZvcignZmFzdC9kb20vdGVzdCcpKSkKKworICAgIGRl
ZiB0ZXN0X2Nhbl9pbmZlcl9wbGF0Zm9ybV9mcm9tX3BhdGhfaWZfbm9uZV9wcm92aWRlZChzZWxm
KToKKyAgICAgICAgemlwID0gRmFrZVppcCgpCisgICAgICAgIHppcC5pbnNlcnQoJ3BsYXRmb3Jt
L3dpbi9zb21lLXRlc3QtZXhwZWN0ZWQucG5nJywgJzxpbWFnZSBkYXRhPicpCisgICAgICAgIHpp
cC5pbnNlcnQoJ3BsYXRmb3JtL3dpbi9zb21lLXRlc3QtZXhwZWN0ZWQuY2hlY2tzdW0nLCAnYWJj
MTIzJykKKyAgICAgICAgYiA9IHJlc3VsdHNldC5SZXN1bHRTZXQoJ2xvY2FsIExheW91dFRlc3Rz
IHJlc3VsdHNldCcsIE5vbmUsIHppcCkKKworICAgICAgICByZXN1bHRzID0gYi5yZXN1bHRzX2Zv
cignc29tZS10ZXN0JykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoMSwgbGVuKHJlc3VsdHMp
KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscygnd2luJywgcmVzdWx0c1swXS5wbGF0Zm9ybSgp
KQorCisgICAgZGVmIHRlc3RfdGVzdF9leHRlbnNpb25faXNfaWdub3JlZChzZWxmKToKKyAgICAg
ICAgemlwID0gRmFrZVppcCgpCisgICAgICAgIHppcC5pbnNlcnQoJ3Rlc3QvdGVzdC1hLWFjdHVh
bC50eHQnLCAnYWN0dWFsIHJlc3VsdHMnKQorICAgICAgICBiID0gc2VsZi5fcmVzdWx0c2V0X3dp
dGhfemlwKHppcCkKKyAgICAgICAgcmVzdWx0cyA9IGIucmVzdWx0c19mb3IoJ3Rlc3QvdGVzdC1h
Lmh0bWwnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscygxLCBsZW4ocmVzdWx0cykpCisgICAg
ICAgIHNlbGYuYXNzZXJ0RXF1YWxzKCd0ZXN0L3Rlc3QtYScsIHJlc3VsdHNbMF0ubmFtZSgpKQor
CisgICAgZGVmIHRlc3RfZXhpc3RpbmdfcmVzdWx0c19hcmVfbWFya2VkX2FzX3N1Y2goc2VsZik6
CisgICAgICAgIHppcCA9IEZha2VaaXAoKQorICAgICAgICB6aXAuaW5zZXJ0KCd0ZXN0L3Rlc3Qt
YS1leHBlY3RlZC50eHQnLCAnZXhwZWN0ZWQgcmVzdWx0cycpCisgICAgICAgIGIgPSBzZWxmLl9y
ZXN1bHRzZXRfd2l0aF96aXAoemlwKQorICAgICAgICByZXN1bHRzID0gYi5yZXN1bHRzX2Zvcign
dGVzdC90ZXN0LWEuaHRtbCcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKDEsIGxlbihyZXN1
bHRzKSkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShyZXN1bHRzWzBdLmlzX2FjdHVhbCgpKQor
CisgICAgZGVmIHRlc3Rfb25seV9yZXR1cm5zX3Jlc3VsdHNfb2Zfc3BlY2lmaWVkX3R5cGUoc2Vs
Zik6CisgICAgICAgIHppcCA9IEZha2VaaXAoKQorICAgICAgICB6aXAuaW5zZXJ0KCd0ZXN0L3Rl
c3QtYS1leHBlY3RlZC50eHQnLCAnZXhwZWN0ZWQgcmVzdWx0cycpCisgICAgICAgIHppcC5pbnNl
cnQoJ3Rlc3QvdGVzdC1hLWV4cGVjdGVkLmNoZWNrc3VtJywgJ2V4cGVjdGVkIHJlc3VsdHMnKQor
ICAgICAgICB6aXAuaW5zZXJ0KCd0ZXN0L3Rlc3QtYS1leHBlY3RlZC5wbmcnLCAnZXhwZWN0ZWQg
cmVzdWx0cycpCisgICAgICAgIGIgPSBzZWxmLl9yZXN1bHRzZXRfd2l0aF96aXAoemlwKQorCisg
ICAgICAgIHJlc3VsdHMgPSBiLnJlc3VsdHNfZm9yKCd0ZXN0L3Rlc3QtYS5odG1sJykKKyAgICAg
ICAgdGV4dF9yZXN1bHRzID0gYi5yZXN1bHRzX2ZvcigndGVzdC90ZXN0LWEuaHRtbCcsIHRhcmdl
dF90eXBlPSd0ZXh0JykKKyAgICAgICAgaW1hZ2VfcmVzdWx0cyA9IGIucmVzdWx0c19mb3IoJ3Rl
c3QvdGVzdC1hLmh0bWwnLCB0YXJnZXRfdHlwZT0naW1hZ2UnKQorCisgICAgICAgIHNlbGYuYXNz
ZXJ0RXF1YWxzKDIsIGxlbihyZXN1bHRzKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoMSwg
bGVuKHRleHRfcmVzdWx0cykpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKDEsIGxlbihpbWFn
ZV9yZXN1bHRzKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoJ3RleHQnLCB0ZXh0X3Jlc3Vs
dHNbMF0udHlwZSgpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscygnaW1hZ2UnLCBpbWFnZV9y
ZXN1bHRzWzBdLnR5cGUoKSkKKworICAgIGRlZiB0ZXN0X2V4Y2x1ZGVfZXhwZWN0ZWRfcmVzdWx0
c193b3JrcyhzZWxmKToKKyAgICAgICAgemlwID0gRmFrZVppcCgpCisgICAgICAgIHppcC5pbnNl
cnQoJ3Rlc3QtZXhwZWN0ZWQudHh0JywgICdleHBlY3RlZCByZXN1bHRzIHN0b3JlZCBvbiBzZXJ2
ZXIgZm9yIHNvbWUgcmVhc29uJykKKyAgICAgICAgYiA9IHNlbGYuX3Jlc3VsdHNldF93aXRoX3pp
cCh6aXAsIGluY2x1ZGVfZXhwZWN0ZWQ9RmFsc2UpCisgICAgICAgIHJlc3VsdHMgPSBiLnJlc3Vs
dHNfZm9yKCd0ZXN0JywgdGFyZ2V0X3R5cGU9Tm9uZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVh
bHMoMCwgbGVuKHJlc3VsdHMpKQorCitpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgorICAgIHVu
aXR0ZXN0Lm1haW4oKQpkaWZmIC0tZ2l0IGEvV2ViS2l0VG9vbHMvU2NyaXB0cy93ZWJraXRweS9j
b21tb24vc3lzdGVtL2ZpbGVzeXN0ZW0ucHkgYi9XZWJLaXRUb29scy9TY3JpcHRzL3dlYmtpdHB5
L2NvbW1vbi9zeXN0ZW0vZmlsZXN5c3RlbS5weQppbmRleCBhNmFkNDI1YjE1MDllMGIwZjUzZDY0
NjNkY2I3Nzg3ZmQ0Y2NjMGFkLi40NmE0MDFhZGFiMmQ3ZmE2OGJiNmQ5NzFiNTg0OWI0NDM5ZmU2
N2ZjIDEwMDY0NAotLS0gYS9XZWJLaXRUb29scy9TY3JpcHRzL3dlYmtpdHB5L2NvbW1vbi9zeXN0
ZW0vZmlsZXN5c3RlbS5weQorKysgYi9XZWJLaXRUb29scy9TY3JpcHRzL3dlYmtpdHB5L2NvbW1v
bi9zeXN0ZW0vZmlsZXN5c3RlbS5weQpAQCAtMTU0LDMgKzE1NCw3IEBAIGNsYXNzIEZpbGVTeXN0
ZW0ob2JqZWN0KToKICAgICAgICAgIiIiQ29waWVzIHRoZSBjb250ZW50cyBvZiB0aGUgZmlsZSBh
dCB0aGUgZ2l2ZW4gcGF0aCB0byB0aGUgZGVzdGluYXRpb24KICAgICAgICAgcGF0aC4iIiIKICAg
ICAgICAgc2h1dGlsLmNvcHlmaWxlKHNvdXJjZSwgZGVzdGluYXRpb24pCisKKyAgICBkZWYgcmVt
b3ZlKHNlbGYsIGZpbGVuYW1lKToKKyAgICAgICAgIiIiUmVtb3ZlIHRoZSBzcGVjaWZpZWQgZmls
ZS4iIiIKKyAgICAgICAgb3MucmVtb3ZlKGZpbGVuYW1lKQpkaWZmIC0tZ2l0IGEvV2ViS2l0VG9v
bHMvU2NyaXB0cy93ZWJraXRweS9sYXlvdXRfdGVzdHMvcG9ydC9iYXNlLnB5IGIvV2ViS2l0VG9v
bHMvU2NyaXB0cy93ZWJraXRweS9sYXlvdXRfdGVzdHMvcG9ydC9iYXNlLnB5CmluZGV4IGJjNWE5
YWEzZTRkMjU1YzFmNzQ5MjEyOWQwNGNkMjY2NGM4NzYyMDguLjUxN2Y2NWUwZTkxMzNiZmY3YjA2
OWU1ZjUwYjBjNDAyNDVkNDMyMWQgMTAwNjQ0Ci0tLSBhL1dlYktpdFRvb2xzL1NjcmlwdHMvd2Vi
a2l0cHkvbGF5b3V0X3Rlc3RzL3BvcnQvYmFzZS5weQorKysgYi9XZWJLaXRUb29scy9TY3JpcHRz
L3dlYmtpdHB5L2xheW91dF90ZXN0cy9wb3J0L2Jhc2UucHkKQEAgLTYzMSw2ICs2MzEsMTAgQEAg
Y2xhc3MgUG9ydChvYmplY3QpOgogICAgICAgICBleHBlY3RhdGlvbnMsIGRldGVybWluaW5nIHNl
YXJjaCBwYXRocywgYW5kIGxvZ2dpbmcgaW5mb3JtYXRpb24uIiIiCiAgICAgICAgIHJhaXNlIE5v
dEltcGxlbWVudGVkRXJyb3IoJ1BvcnQudmVyc2lvbicpCiAKKyAgICBkZWYgYnVpbGRib3RfcmVz
dWx0c2V0KHNlbGYsIHBsYXRmb3Jtcyk6CisgICAgICAgICIiIlJldHVybnMgYSBSZXN1bHRTZXQg
Zm9yIHRoZSBzcGVjaWZpZWQgcGxhdGZvcm1zIGZvciB0aGlzIHBvcnRzIGJ1aWxkYm90cy4iIiIK
KyAgICAgICAgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcignUG9ydC5idWlsZGJvdF9yZXN1bHRz
ZXQnKQorCiAgICAgZGVmIHRlc3RfcmVwb3NpdG9yeV9wYXRocyhzZWxmKToKICAgICAgICAgIiIi
UmV0dXJucyBhIGxpc3Qgb2YgKHJlcG9zaXRvcnlfbmFtZSwgcmVwb3NpdG9yeV9wYXRoKSB0dXBs
ZXMKICAgICAgICAgb2YgaXRzIGRlcGVuZGluZyBjb2RlIGJhc2UuICBCeSBkZWZhdWx0IGl0IHJl
dHVybnMgYSBsaXN0IHRoYXQgb25seQpkaWZmIC0tZ2l0IGEvV2ViS2l0VG9vbHMvU2NyaXB0cy93
ZWJraXRweS9sYXlvdXRfdGVzdHMvcG9ydC9jaHJvbWl1bS5weSBiL1dlYktpdFRvb2xzL1Njcmlw
dHMvd2Via2l0cHkvbGF5b3V0X3Rlc3RzL3BvcnQvY2hyb21pdW0ucHkKaW5kZXggOGZlNjg1YWYw
NjY5ZWIzNGFmZThmOTRjNTZmZTNmZjNjZDk1MzZjNy4uNmQ5YTZhNWYwNDk0MWYwNjI3N2ZjMWY2
YmNmOWI2MDQ0M2YxNDNjNCAxMDA2NDQKLS0tIGEvV2ViS2l0VG9vbHMvU2NyaXB0cy93ZWJraXRw
eS9sYXlvdXRfdGVzdHMvcG9ydC9jaHJvbWl1bS5weQorKysgYi9XZWJLaXRUb29scy9TY3JpcHRz
L3dlYmtpdHB5L2xheW91dF90ZXN0cy9wb3J0L2Nocm9taXVtLnB5CkBAIC00NCw2ICs0NCw4IEBA
IGltcG9ydCB0ZW1wZmlsZQogaW1wb3J0IHRpbWUKIGltcG9ydCB3ZWJicm93c2VyCiAKK2Zyb20g
d2Via2l0cHkuY29tbW9uLm5ldC5yZW1vdGV6aXAgaW1wb3J0IFJlbW90ZVppcAorZnJvbSB3ZWJr
aXRweS5jb21tb24ubmV0LnJlc3VsdHNldCBpbXBvcnQgQWdncmVnYXRlUmVzdWx0U2V0LCBSZXN1
bHRTZXQKIGZyb20gd2Via2l0cHkuY29tbW9uLnN5c3RlbS5wYXRoIGltcG9ydCBjeWdwYXRoCiBm
cm9tIHdlYmtpdHB5LmxheW91dF90ZXN0cy5sYXlvdXRfcGFja2FnZSBpbXBvcnQgdGVzdF9leHBl
Y3RhdGlvbnMKIGZyb20gd2Via2l0cHkubGF5b3V0X3Rlc3RzLmxheW91dF9wYWNrYWdlIGltcG9y
dCB0ZXN0X291dHB1dApAQCAtMTk3LDYgKzE5OSwyNSBAQCBjbGFzcyBDaHJvbWl1bVBvcnQoYmFz
ZS5Qb3J0KToKICAgICAgICAgcmV0dXJuIHNlbGYucGF0aF9mcm9tX3dlYmtpdF9iYXNlKCdMYXlv
dXRUZXN0cycsICdwbGF0Zm9ybScsCiAgICAgICAgICAgICAnY2hyb21pdW0nLCAndGVzdF9leHBl
Y3RhdGlvbnMudHh0JykKIAorICAgIGRlZiBidWlsZGJvdF9yZXN1bHRzZXQoc2VsZiwgcGxhdGZv
cm1zKToKKyAgICAgICAgcGxhdGZvcm1fYnVpbGRlcnMgPSB7CisgICAgICAgICAgICAnY2hyb21p
dW0tbWFjJzogJ1dlYmtpdF9NYWMxMF81JywKKyAgICAgICAgICAgICdjaHJvbWl1bS13aW4tdmlz
dGEnOiAnV2Via2l0X1dpbicsCisgICAgICAgICAgICAnY2hyb21pdW0tbGludXgnOiAnV2Via2l0
X0xpbnV4X1Rlc3RzX19kYmdfXzFfJywKKyAgICAgICAgfQorCisgICAgICAgIHJlc3VsdHNldHMg
PSBbXQorICAgICAgICBmb3IgcGxhdGZvcm0gaW4gcGxhdGZvcm1zOgorICAgICAgICAgICAgaWYg
cGxhdGZvcm0gbm90IGluIHBsYXRmb3JtX2J1aWxkZXJzOgorICAgICAgICAgICAgICAgIHJhaXNl
IEV4Y2VwdGlvbigiRG9uJ3QgaGF2ZSByZXN1bHRzIGZvciBwbGF0Zm9ybSAlcyIgJSBwbGF0Zm9y
bSkKKyAgICAgICAgICAgIGJ1aWxkZXJfbmFtZSA9IHBsYXRmb3JtX2J1aWxkZXJzW3BsYXRmb3Jt
XQorICAgICAgICAgICAgemlwX3VybCA9ICdodHRwOi8vYnVpbGQuY2hyb21pdW0ub3JnL2YvY2hy
b21pdW0vbGF5b3V0X3Rlc3RfcmVzdWx0cy8nICsgXAorICAgICAgICAgICAgICAgIGJ1aWxkZXJf
bmFtZSArICcvbGF5b3V0LXRlc3QtcmVzdWx0cy56aXAnCisgICAgICAgICAgICByZXN1bHRzZXRz
LmFwcGVuZChSZXN1bHRTZXQoYnVpbGRlcl9uYW1lLCBwbGF0Zm9ybSwgUmVtb3RlWmlwKHppcF91
cmwpLAorICAgICAgICAgICAgICAgIGluY2x1ZGVfZXhwZWN0ZWQ9RmFsc2UpKQorCisgICAgICAg
IHJldHVybiBBZ2dyZWdhdGVSZXN1bHRTZXQocmVzdWx0c2V0cykKKwogICAgIGRlZiByZXN1bHRz
X2RpcmVjdG9yeShzZWxmKToKICAgICAgICAgdHJ5OgogICAgICAgICAgICAgcmV0dXJuIHNlbGYu
cGF0aF9mcm9tX2Nocm9taXVtX2Jhc2UoJ3dlYmtpdCcsCmRpZmYgLS1naXQgYS9XZWJLaXRUb29s
cy9TY3JpcHRzL3dlYmtpdHB5L2xheW91dF90ZXN0cy9wb3J0L3dlYmtpdC5weSBiL1dlYktpdFRv
b2xzL1NjcmlwdHMvd2Via2l0cHkvbGF5b3V0X3Rlc3RzL3BvcnQvd2Via2l0LnB5CmluZGV4IDA5
YmU4MzNkNzUyZjAyZmRiNzk0NDY2M2I5MGU1NWVhNzMwY2UxYTEuLmEyZDM5NGZkYTE0NTU0OWZk
Y2Q2NGExZjg2NGRhNDNhNWRmYTM3N2IgMTAwNjQ0Ci0tLSBhL1dlYktpdFRvb2xzL1NjcmlwdHMv
d2Via2l0cHkvbGF5b3V0X3Rlc3RzL3BvcnQvd2Via2l0LnB5CisrKyBiL1dlYktpdFRvb2xzL1Nj
cmlwdHMvd2Via2l0cHkvbGF5b3V0X3Rlc3RzL3BvcnQvd2Via2l0LnB5CkBAIC00Niw2ICs0Niw4
IEBAIGltcG9ydCBvcGVyYXRvcgogaW1wb3J0IHRlbXBmaWxlCiBpbXBvcnQgc2h1dGlsCiAKK2lt
cG9ydCB3ZWJraXRweS5jb21tb24ubmV0LmJ1aWxkYm90IGFzIGJ1aWxkYm90Citmcm9tIHdlYmtp
dHB5LmNvbW1vbi5uZXQucmVzdWx0c2V0IGltcG9ydCBBZ2dyZWdhdGVSZXN1bHRTZXQKIGltcG9y
dCB3ZWJraXRweS5jb21tb24uc3lzdGVtLm9zcGF0aCBhcyBvc3BhdGgKIGltcG9ydCB3ZWJraXRw
eS5sYXlvdXRfdGVzdHMubGF5b3V0X3BhY2thZ2UudGVzdF9vdXRwdXQgYXMgdGVzdF9vdXRwdXQK
IGltcG9ydCB3ZWJraXRweS5sYXlvdXRfdGVzdHMucG9ydC5iYXNlIGFzIGJhc2UKQEAgLTc5LDYg
KzgxLDM0IEBAIGNsYXNzIFdlYktpdFBvcnQoYmFzZS5Qb3J0KToKICAgICBkZWYgdmVyc2lvbihz
ZWxmKToKICAgICAgICAgcmV0dXJuICcnCiAKKyAgICBkZWYgYnVpbGRib3RfcmVzdWx0c2V0KHNl
bGYsIHBsYXRmb3Jtcyk6CisgICAgICAgIHBsYXRmb3JtX2J1aWxkZXJzID0geworICAgICAgICAg
ICAgJ21hYy1zbm93bGVvcGFyZCc6ICdTbm93TGVvcGFyZCBJbnRlbCBSZWxlYXNlIChUZXN0cykn
LAorICAgICAgICAgICAgJ21hYy1sZW9wYXJkJzogJ0xlb3BhcmQgSW50ZWwgRGVidWcgKFRlc3Rz
KScsCisgICAgICAgICAgICAnd2luJzogJ1dpbmRvd3MgNyBSZWxlYXNlIChXZWJLaXQyIFRlc3Rz
KScsCisgICAgICAgICAgICAnY2hyb21pdW0tbGludXgnOiAnR1RLIExpbnV4IDMyLWJpdCBSZWxl
YXNlJywKKyAgICAgICAgfQorCisgICAgICAgIGZvciBwbGF0Zm9ybSBpbiBwbGF0Zm9ybXM6Cisg
ICAgICAgICAgICBpZiBwbGF0Zm9ybSBub3QgaW4gcGxhdGZvcm1fYnVpbGRlcnM6CisgICAgICAg
ICAgICAgICAgcmFpc2UgRXhjZXB0aW9uKCJDYW4ndCBmaW5kIGJ1aWxkZXIgZm9yICVzIiAlIHBs
YXRmb3JtKQorCisgICAgICAgIGJiID0gYnVpbGRib3QuQnVpbGRCb3QoKQorICAgICAgICByZXN1
bHRzZXRzID0gW10KKyAgICAgICAgYnVpbGRlcnNfYnlfbmFtZSA9IHt9CisKKyAgICAgICAgZm9y
IGJ1aWxkZXIgaW4gYmIuYnVpbGRlcnMoKToKKyAgICAgICAgICAgIGJ1aWxkZXJzX2J5X25hbWVb
YnVpbGRlci5uYW1lKCldID0gYnVpbGRlcgorCisgICAgICAgIGZvciBwbGF0Zm9ybSBpbiBwbGF0
Zm9ybXM6CisgICAgICAgICAgICBidWlsZGVyID0gYnVpbGRlcnNfYnlfbmFtZVtwbGF0Zm9ybV9i
dWlsZGVyc1twbGF0Zm9ybV1dCisgICAgICAgICAgICBwcmludCAiZ290IGJ1aWxkZXIgJXMiICUg
YnVpbGRlci5uYW1lKCkKKyAgICAgICAgICAgIHJzID0gYnVpbGRlci5sYXRlc3RfYnVpbGQoKS5y
ZXN1bHRzKCkKKyAgICAgICAgICAgIHJzLnNldF9wbGF0Zm9ybShwbGF0Zm9ybSkKKyAgICAgICAg
ICAgIHJlc3VsdHNldHMuYXBwZW5kKHJzKQorCisgICAgICAgIHJldHVybiBBZ2dyZWdhdGVSZXN1
bHRTZXQocmVzdWx0c2V0cykKKwogICAgIGRlZiBfYnVpbGRfZHJpdmVyKHNlbGYpOgogICAgICAg
ICBjb25maWd1cmF0aW9uID0gc2VsZi5nZXRfb3B0aW9uKCdjb25maWd1cmF0aW9uJykKICAgICAg
ICAgcmV0dXJuIHNlbGYuX2NvbmZpZy5idWlsZF9kdW1wcmVuZGVydHJlZShjb25maWd1cmF0aW9u
KQpkaWZmIC0tZ2l0IGEvV2ViS2l0VG9vbHMvU2NyaXB0cy93ZWJraXRweS90b29sL2NvbW1hbmRz
L19faW5pdF9fLnB5IGIvV2ViS2l0VG9vbHMvU2NyaXB0cy93ZWJraXRweS90b29sL2NvbW1hbmRz
L19faW5pdF9fLnB5CmluZGV4IGQyYWE1MDNkMTg1NjFkZWFiMmNhZTcwMGRmNmQ0OTNhOWIwNWZj
ZjMuLmMwNTk2ZTc4OTIyZWVkM2UwMTU3MmYzOGE0MjJlYWNiMzVjOGI1OTEgMTAwNjQ0Ci0tLSBh
L1dlYktpdFRvb2xzL1NjcmlwdHMvd2Via2l0cHkvdG9vbC9jb21tYW5kcy9fX2luaXRfXy5weQor
KysgYi9XZWJLaXRUb29scy9TY3JpcHRzL3dlYmtpdHB5L3Rvb2wvY29tbWFuZHMvX19pbml0X18u
cHkKQEAgLTcsNiArNyw3IEBAIGZyb20gd2Via2l0cHkudG9vbC5jb21tYW5kcy5wcmV0dHlkaWZm
IGltcG9ydCBQcmV0dHlEaWZmCiBmcm9tIHdlYmtpdHB5LnRvb2wuY29tbWFuZHMucXVlcmllcyBp
bXBvcnQgKgogZnJvbSB3ZWJraXRweS50b29sLmNvbW1hbmRzLnF1ZXVlcyBpbXBvcnQgKgogZnJv
bSB3ZWJraXRweS50b29sLmNvbW1hbmRzLnJlYmFzZWxpbmUgaW1wb3J0IFJlYmFzZWxpbmUKK2Zy
b20gd2Via2l0cHkudG9vbC5jb21tYW5kcy5yZWJhc2VsaW5lMi5yZWJhc2VsaW5lMiBpbXBvcnQg
UmViYXNlbGluZTIKIGZyb20gd2Via2l0cHkudG9vbC5jb21tYW5kcy5yZWJhc2VsaW5lc2VydmVy
IGltcG9ydCBSZWJhc2VsaW5lU2VydmVyCiBmcm9tIHdlYmtpdHB5LnRvb2wuY29tbWFuZHMuc2hl
cmlmZmJvdCBpbXBvcnQgKgogZnJvbSB3ZWJraXRweS50b29sLmNvbW1hbmRzLnVwbG9hZCBpbXBv
cnQgKgpkaWZmIC0tZ2l0IGEvV2ViS2l0VG9vbHMvU2NyaXB0cy93ZWJraXRweS90b29sL2NvbW1h
bmRzL3JlYmFzZWxpbmUyL19faW5pdF9fLnB5IGIvV2ViS2l0VG9vbHMvU2NyaXB0cy93ZWJraXRw
eS90b29sL2NvbW1hbmRzL3JlYmFzZWxpbmUyL19faW5pdF9fLnB5Cm5ldyBmaWxlIG1vZGUgMTAw
NjQ0CmluZGV4IDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAuLmVmNjVi
ZWU1YmI3N2U5NmViYzdjZDljNDc2NDA2OTBmYmRhOGFjMTkKLS0tIC9kZXYvbnVsbAorKysgYi9X
ZWJLaXRUb29scy9TY3JpcHRzL3dlYmtpdHB5L3Rvb2wvY29tbWFuZHMvcmViYXNlbGluZTIvX19p
bml0X18ucHkKQEAgLTAsMCArMSBAQAorIyBSZXF1aXJlZCBmb3IgUHl0aG9uIHRvIHNlYXJjaCB0
aGlzIGRpcmVjdG9yeSBmb3IgbW9kdWxlIGZpbGVzCmRpZmYgLS1naXQgYS9XZWJLaXRUb29scy9T
Y3JpcHRzL3dlYmtpdHB5L3Rvb2wvY29tbWFuZHMvcmViYXNlbGluZTIvYnVja2V0LnB5IGIvV2Vi
S2l0VG9vbHMvU2NyaXB0cy93ZWJraXRweS90b29sL2NvbW1hbmRzL3JlYmFzZWxpbmUyL2J1Y2tl
dC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwLi5lMmFlNmFjZGFhMzFhNmYzNGY1ZDU2NjJmZTliMGFkMzVlOGYxMGRi
Ci0tLSAvZGV2L251bGwKKysrIGIvV2ViS2l0VG9vbHMvU2NyaXB0cy93ZWJraXRweS90b29sL2Nv
bW1hbmRzL3JlYmFzZWxpbmUyL2J1Y2tldC5weQpAQCAtMCwwICsxLDIxMCBAQAorIyEvdXNyL2Jp
bi9lbnYgcHl0aG9uCisjIENvcHlyaWdodCAoQykgMjAxMCBHb29nbGUgSW5jLiBBbGwgcmlnaHRz
IHJlc2VydmVkLgorIworIyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmlu
YXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyMgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVk
IHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisjIGFyZSBtZXQ6CisjCisj
IDEuICBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3Zl
IGNvcHlyaWdodAorIyAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhl
IGZvbGxvd2luZyBkaXNjbGFpbWVyLgorIyAyLiAgUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBm
b3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyMgICAgIG5vdGljZSwgdGhp
cyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUK
KyMgICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRo
IHRoZSBkaXN0cmlidXRpb24uCisjCisjIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQ
TEUgQU5EIElUUyBDT05UUklCVVRPUlMgIkFTIElTIiBBTkQgQU5ZCisjIEVYUFJFU1MgT1IgSU1Q
TElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJ
RUQKKyMgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFS
VElDVUxBUiBQVVJQT1NFIEFSRQorIyBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBBUFBM
RSBPUiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZCisjIERJUkVDVCwgSU5ESVJF
Q1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1B
R0VTCisjIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VC
U1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyMgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJ
VFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECisjIE9OIEFO
WSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklM
SVRZLCBPUiBUT1JUCisjIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJ
TkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorIyBUSElTIFNPRlRXQVJFLCBFVkVOIElG
IEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCitmcm9tIHdlYmtp
dHB5LmNvbW1vbi5pbmRlbnRlZF9sb2dnZXIgaW1wb3J0IEluZGVudGVkTG9nZ2VyCisKKworY2xh
c3MgQnVja2V0KG9iamVjdCk6CisgICAgIiIiQnVja2V0cyBob2xkIG90aGVyIGJ1Y2tldHMgaW4g
YSB0cmVlIHRoYXQgcmVmbGVjdHMgdGhlIHRlc3QgZmFsbGJhY2sKKyAgICAgICBvcmRlci4iIiIK
KyAgICBkZWYgX19pbml0X18oc2VsZiwgbmFtZSk6CisgICAgICAgIHNlbGYuX25hbWUgPSBuYW1l
CisgICAgICAgIHNlbGYuX2NoaWxkcmVuID0gW10KKyAgICAgICAgc2VsZi5fcmVzdWx0ID0gTm9u
ZQorICAgICAgICBzZWxmLl9pbXBsaWNpdF9yZXN1bHQgPSBOb25lCisgICAgICAgICMgQWdncmVn
YXRlIGJ1Y2tldHMgZG9uJ3QgZ2V0IHJlc3VsdHMgZGlyZWN0bHkgZnJvbSBidWlsZGJvdC4KKyAg
ICAgICAgc2VsZi5faXNfYWdncmVnYXRlID0gRmFsc2UKKworICAgIGRlZiBfb25fY2hhbmdlZChz
ZWxmKToKKyAgICAgICAgZm9yIGNoaWxkIGluIHNlbGYuX2NoaWxkcmVuOgorICAgICAgICAgICAg
Y2hpbGQuc2V0X2ltcGxpY2l0KHNlbGYuaW1wbGljaXRfcmVzdWx0KCkpCisKKyAgICBkZWYgX2Fs
bF9lcXVhbChzZWxmLCByZXN1bHRzKToKKyAgICAgICAgaWYgbGVuKHJlc3VsdHMpID09IDA6Cisg
ICAgICAgICAgICByZXR1cm4gVHJ1ZQorICAgICAgICBjb250ZW50cyA9IHJlc3VsdHNbMF0uY29u
dGVudHMoKQorICAgICAgICByZXR1cm4gYWxsKG1hcChsYW1iZGEgeDogeC5jb250ZW50cygpID09
IGNvbnRlbnRzLCByZXN1bHRzKSkKKworICAgIGRlZiBkdW1wKHNlbGYsIGxvZ2dlcj1JbmRlbnRl
ZExvZ2dlcigpKToKKyAgICAgICAgbG9nZ2VyLmxvZygiQnVja2V0OiVzIHsiICUgc2VsZi5fbmFt
ZSkKKyAgICAgICAgbG9nZ2VyLmluZGVudCgpCisgICAgICAgIGxvZ2dlci5sb2coIlJlc3VsdCA9
ICVzIiAlIHNlbGYuX3Jlc3VsdCkKKyAgICAgICAgbG9nZ2VyLmxvZygiSW1wbGljaXQgcmVzdWx0
ID0gJXMiICUgc2VsZi5pbXBsaWNpdF9yZXN1bHQoKSkKKyAgICAgICAgZm9yIGNoaWxkIGluIHNl
bGYuX2NoaWxkcmVuOgorICAgICAgICAgICAgY2hpbGQuZHVtcChsb2dnZXIpCisgICAgICAgIGxv
Z2dlci5vdXRkZW50KCkKKyAgICAgICAgbG9nZ2VyLmxvZygifSIpCisKKyAgICBkZWYgbmFtZShz
ZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX25hbWUKKworICAgIGRlZiBtYXJrX2FzX2FnZ3Jl
Z2F0ZShzZWxmKToKKyAgICAgICAgIiIiQnVja2V0cyB0aGF0IGRvbid0IG1hcCB0byBhIHNwZWNp
ZmljIHBsYXRmb3JtIGFyZSAnYWdncmVnYXRlJworICAgICAgICBidWNrZXRzLiAgQWdncmVnYXRl
IGJ1Y2tldHMgY2FuIG92ZXJ3cml0ZSB0aGVpciBvd24gcmVzdWx0cyB3aXRoIHRob3NlCisgICAg
ICAgIG9mIHRoZWlyIGNoaWxkcmVuIGlmIHRoZWlyIGNoaWxkcmVuIGhhdmUgcmVzdWx0cyB0aGF0
IGFsbCBtYXRjaCBiZWNhdXNlCisgICAgICAgIGFnZ3JlZ2F0ZXMgYXJlIGRlZmluZWQgZW50aXJl
bHkgYnkgdGhlaXIgY2hpbGRyZW4gYW5kIG5vdCB0aGVpciBvd24KKyAgICAgICAgdGFyZ2V0ZWQg
cmVzdWx0cy4iIiIKKyAgICAgICAgc2VsZi5faXNfYWdncmVnYXRlID0gVHJ1ZQorCisgICAgZGVm
IGFwcGVuZChzZWxmLCBjaGlsZCk6CisgICAgICAgIHNlbGYuX2NoaWxkcmVuLmFwcGVuZChjaGls
ZCkKKyAgICAgICAgc2VsZi5fb25fY2hhbmdlZCgpCisKKyAgICBkZWYgaW1wbGljaXRfcmVzdWx0
KHNlbGYpOgorICAgICAgICBpZiBzZWxmLl9yZXN1bHQgaXMgbm90IE5vbmU6CisgICAgICAgICAg
ICByZXR1cm4gc2VsZi5fcmVzdWx0CisgICAgICAgIHJldHVybiBzZWxmLl9pbXBsaWNpdF9yZXN1
bHQKKworICAgIGRlZiBzZXRfcmVzdWx0KHNlbGYsIHJlc3VsdCk6CisgICAgICAgIGlmIHNlbGYu
X3Jlc3VsdCBpcyBOb25lOgorICAgICAgICAgICAgc2VsZi5fcmVzdWx0ID0gcmVzdWx0CisgICAg
ICAgICAgICBzZWxmLl9vbl9jaGFuZ2VkKCkKKyAgICAgICAgZWxpZiByZXN1bHQuaXNfcmViYXNl
bGluZV9vZihzZWxmLl9yZXN1bHQpOgorICAgICAgICAgICAgc2VsZi5fcmVzdWx0ID0gcmVzdWx0
CisgICAgICAgICAgICBzZWxmLl9vbl9jaGFuZ2VkKCkKKyAgICAgICAgZWxpZiBzZWxmLl9yZXN1
bHQuaXNfcmViYXNlbGluZV9vZihyZXN1bHQpOgorICAgICAgICAgICAgcGFzcworICAgICAgICBl
bGlmIHNlbGYuX3Jlc3VsdCA9PSByZXN1bHQ6CisgICAgICAgICAgICByYWlzZSBFeGNlcHRpb24o
IlNhbWUgcmVzdWx0IGJlaW5nIGluc2VydGVkIGFnYWluIGludG8gYnVja2V0ICVzOiAlcyA8LSAl
cyIgJSAoc2VsZiwgc2VsZi5fcmVzdWx0LCByZXN1bHQpKQorICAgICAgICBlbHNlOgorICAgICAg
ICAgICAgcmFpc2UgRXhjZXB0aW9uKCJDb25mbGljdGluZyByZXN1bHRzICVzIGFuZCAlcyBhc3Np
Z25lZCB0byBidWNrZXQgJXMiICUKKyAgICAgICAgICAgICAgICAgICAgKHNlbGYuX3Jlc3VsdCwg
cmVzdWx0LCBzZWxmLl9uYW1lKSkKKworICAgIGRlZiBjbGVhcl9yZXN1bHQoc2VsZik6CisgICAg
ICAgIHNlbGYuX3Jlc3VsdCA9IE5vbmUKKyAgICAgICAgc2VsZi5fb25fY2hhbmdlZCgpCisKKyAg
ICBkZWYgcmVzdWx0KHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5fcmVzdWx0CisKKyAgICBk
ZWYgc2V0X2ltcGxpY2l0KHNlbGYsIGltcGxpY2l0X3Jlc3VsdCk6CisgICAgICAgIHNlbGYuX2lt
cGxpY2l0X3Jlc3VsdCA9IGltcGxpY2l0X3Jlc3VsdAorICAgICAgICBzZWxmLl9vbl9jaGFuZ2Vk
KCkKKworICAgIGRlZiBfc2FtZV9pbXBsaWNpdF9yZXN1bHQoc2VsZiwgb3RoZXIpOgorICAgICAg
ICBpZiBzZWxmLmltcGxpY2l0X3Jlc3VsdCgpIGlzIE5vbmU6CisgICAgICAgICAgICByZXR1cm4g
c2VsZi5pbXBsaWNpdF9yZXN1bHQoKSA9PSBvdGhlci5pbXBsaWNpdF9yZXN1bHQoKQorICAgICAg
ICByZXR1cm4gb3RoZXIuaW1wbGljaXRfcmVzdWx0KCkuc2FtZV9jb250ZW50KHNlbGYuaW1wbGlj
aXRfcmVzdWx0KCkpCisKKyAgICBkZWYgX2dldF9jb21tb25fY2hpbGRfcmVzdWx0KHNlbGYsIHJl
c3VsdHMpOgorICAgICAgICBpZiBsZW4ocmVzdWx0cykgPT0gMDoKKyAgICAgICAgICAgIHJldHVy
biBOb25lCisKKyAgICAgICAgZmlyc3RfcmVzdWx0ID0gcmVzdWx0c1swXQorICAgICAgICByZXN1
bHRfdG9fcmV0dXJuID0gZmlyc3RfcmVzdWx0CisgICAgICAgIGZvciByZXN1bHQgaW4gcmVzdWx0
c1sxOl06CisgICAgICAgICAgICBpZiBub3QgcmVzdWx0LnNhbWVfY29udGVudChmaXJzdF9yZXN1
bHQpOgorICAgICAgICAgICAgICAgIHJldHVybiBOb25lCisgICAgICAgICAgICBpZiByZXN1bHQu
aXNfYWN0dWFsKCk6CisgICAgICAgICAgICAgICAgcmVzdWx0X3RvX3JldHVybiA9IHJlc3VsdCAg
ICMgUHJlZmVyIHRvIHJldHVybiBhY3R1YWwgcmVzdWx0cy4KKyAgICAgICAgcmV0dXJuIHJlc3Vs
dF90b19yZXR1cm4KKworICAgIGRlZiBfaW5oZXJpdChzZWxmLCByZXN1bHQpOgorICAgICAgICBm
b3IgY2hpbGQgaW4gc2VsZi5fY2hpbGRyZW46CisgICAgICAgICAgICBjaGlsZC5jbGVhcl9yZXN1
bHQoKQorICAgICAgICBzZWxmLl9yZXN1bHQgPSByZXN1bHQucmV0YXJnZXQoc2VsZi5fbmFtZSkK
KyAgICAgICAgc2VsZi5fb25fY2hhbmdlZCgpCisKKyAgICBkZWYgX2F0dGVtcHRfdG9faW5oZXJp
dChzZWxmKToKKyAgICAgICAgIiIiVHJ5IHRvIGluaGVyaXQgYSByZXN1bHQgZnJvbSBjaGlsZHJl
bi4gVGhpcyB3aWxsIG9ubHkgaGFwcGVuIGlmIGFsbAorICAgICAgICAgICAgICBjaGlsZHJlbiBo
YXZlIHRoZSBzYW1lIHJlc3VsdCIiIgorICAgICAgICBjaGlsZF9yZXN1bHRzID0gbWFwKGxhbWJk
YSBjOiBjLmltcGxpY2l0X3Jlc3VsdCgpLCBzZWxmLl9jaGlsZHJlbikKKyAgICAgICAgY2hpbGRf
cmVzdWx0cyA9IGZpbHRlcihsYW1iZGEgcjogciBpcyBub3QgTm9uZSwgY2hpbGRfcmVzdWx0cykK
KyAgICAgICAgdG9faW5oZXJpdCA9IHNlbGYuX2dldF9jb21tb25fY2hpbGRfcmVzdWx0KGNoaWxk
X3Jlc3VsdHMpCisKKyAgICAgICAgaWYgdG9faW5oZXJpdCBpcyBOb25lOgorICAgICAgICAgICAg
cmV0dXJuIEZhbHNlCisKKyAgICAgICAgIyBXZSBoYXZlIGEgcmVzdWx0IHdlIGNvdWxkIHBvdGVu
dGlhbGx5IGluaGVyaXQuLi4KKyAgICAgICAgaWYgc2VsZi5pbXBsaWNpdF9yZXN1bHQoKSBpcyBO
b25lOgorICAgICAgICAgICAgc2VsZi5faW5oZXJpdCh0b19pbmhlcml0KQorICAgICAgICBlbGlm
IHRvX2luaGVyaXQuaXNfbmV3ZXJfdGhhbihzZWxmLmltcGxpY2l0X3Jlc3VsdCgpKSBhbmQgc2Vs
Zi5pc19hZ2dyZWdhdGUoKToKKyAgICAgICAgICAgIHNlbGYuX2luaGVyaXQodG9faW5oZXJpdCkK
KyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJldHVybiBGYWxzZQorICAgICAgICByZXR1cm4g
VHJ1ZQorCisgICAgZGVmIGlzX2FnZ3JlZ2F0ZShzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYu
X2lzX2FnZ3JlZ2F0ZQorCisgICAgZGVmIGNvbGxhcHNlKHNlbGYpOgorICAgICAgICAiIiJEZWxl
dGVzIHJlZHVuZGFudCByZXN1bHRzIGluIHRoZSB0cmVlIHN0YXJ0aW5nIGF0IHRoaXMgYnVja2V0
IiIiCisgICAgICAgIGZvciBjaGlsZCBpbiBzZWxmLl9jaGlsZHJlbjoKKyAgICAgICAgICAgIGNo
aWxkLmNvbGxhcHNlKCkKKworICAgICAgICBpZiBzZWxmLl9hdHRlbXB0X3RvX2luaGVyaXQoKToK
KyAgICAgICAgICAgIHJldHVybgorCisgICAgICAgIGZvciBjaGlsZCBpbiBzZWxmLl9jaGlsZHJl
bjoKKyAgICAgICAgICAgIGlmIHNlbGYuX3NhbWVfaW1wbGljaXRfcmVzdWx0KGNoaWxkKToKKyAg
ICAgICAgICAgICAgICBjaGlsZC5jbGVhcl9yZXN1bHQoKQorCisgICAgZGVmIGlzX2VtcHR5KHNl
bGYpOgorICAgICAgICByZXR1cm4gc2VsZi5fcmVzdWx0IGlzIE5vbmUKKworICAgIGRlZiByZXN1
bHRzKHNlbGYsIHIpOgorICAgICAgICBpZiBub3Qgc2VsZi5pc19lbXB0eSgpOgorICAgICAgICAg
ICAgci5hcHBlbmQoc2VsZi5fcmVzdWx0KQorICAgICAgICBmb3IgYyBpbiBzZWxmLl9jaGlsZHJl
bjoKKyAgICAgICAgICAgIGMucmVzdWx0cyhyKQorCisKK2NsYXNzIEJ1Y2tldFRyZWUob2JqZWN0
KToKKyAgICAiIiJIZWxwZXIgY2xhc3MgZm9yIGNvbnN0cnVjdGluZyBhbmQgaW5kZXhpbmcgYSBo
aWVyYXJjaHkgb2YgQnVja2V0cy4iIiIKKyAgICBkZWYgX19pbml0X18oc2VsZik6CisgICAgICAg
IHNlbGYuX2J1Y2tldHMgPSB7fQorICAgICAgICBzZWxmLl9yb290X2J1Y2tldCA9IHNlbGYuX2dl
dF9vcl9jcmVhdGVfYnVja2V0KE5vbmUpCisKKyAgICBkZWYgX2dldF9vcl9jcmVhdGVfYnVja2V0
KHNlbGYsIGJ1Y2tldF9uYW1lKToKKyAgICAgICAgaWYgYnVja2V0X25hbWUgbm90IGluIHNlbGYu
X2J1Y2tldHM6CisgICAgICAgICAgICBzZWxmLl9idWNrZXRzW2J1Y2tldF9uYW1lXSA9IEJ1Y2tl
dChidWNrZXRfbmFtZSkKKyAgICAgICAgcmV0dXJuIHNlbGYuX2J1Y2tldHNbYnVja2V0X25hbWVd
CisKKyAgICBkZWYgbWFrZV9idWNrZXQoc2VsZiwgYnVja2V0X25hbWUsICphcmdzKToKKyAgICAg
ICAgYiA9IHNlbGYuX2dldF9vcl9jcmVhdGVfYnVja2V0KGJ1Y2tldF9uYW1lKQorCisgICAgICAg
IGZvciBhcmcgaW4gYXJnczoKKyAgICAgICAgICAgIGIuYXBwZW5kKGFyZykKKyAgICAgICAgcmV0
dXJuIGIKKworICAgIGRlZiBpbnNlcnRfcmVzdWx0KHNlbGYsIHJlc3VsdCk6CisgICAgICAgIGlm
IHJlc3VsdC5wbGF0Zm9ybSgpIGluIHNlbGYuX2J1Y2tldHMua2V5cygpOgorICAgICAgICAgICAg
c2VsZi5fYnVja2V0c1tyZXN1bHQucGxhdGZvcm0oKV0uc2V0X3Jlc3VsdChyZXN1bHQpCisKKyAg
ICBkZWYgcmVzdWx0cyhzZWxmKToKKyAgICAgICAgciA9IFtdCisgICAgICAgIHNlbGYuX3Jvb3Rf
YnVja2V0LnJlc3VsdHMocikKKyAgICAgICAgcmV0dXJuIHIKKworICAgIGRlZiBjb2xsYXBzZShz
ZWxmKToKKyAgICAgICAgc2VsZi5fcm9vdF9idWNrZXQuY29sbGFwc2UoKQorCisgICAgZGVmIGdl
dF9idWNrZXQoc2VsZiwgYnVja2V0X25hbWUpOgorICAgICAgICByZXR1cm4gc2VsZi5fYnVja2V0
c1tidWNrZXRfbmFtZV0KKworICAgIGRlZiByb290X2J1Y2tldChzZWxmKToKKyAgICAgICAgcmV0
dXJuIHNlbGYuZ2V0X2J1Y2tldChOb25lKQorCisgICAgZGVmIGR1bXAoc2VsZik6CisgICAgICAg
IHNlbGYucm9vdF9idWNrZXQoKS5kdW1wKCkKZGlmZiAtLWdpdCBhL1dlYktpdFRvb2xzL1Njcmlw
dHMvd2Via2l0cHkvdG9vbC9jb21tYW5kcy9yZWJhc2VsaW5lMi9idWNrZXRfdW5pdHRlc3QucHkg
Yi9XZWJLaXRUb29scy9TY3JpcHRzL3dlYmtpdHB5L3Rvb2wvY29tbWFuZHMvcmViYXNlbGluZTIv
YnVja2V0X3VuaXR0ZXN0LnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAuLmM1Zjg0ZDc3NDQ5MDdlZmI5ZWZmNDZmYTdh
NjMzODk5MTNmZGZmOTgKLS0tIC9kZXYvbnVsbAorKysgYi9XZWJLaXRUb29scy9TY3JpcHRzL3dl
YmtpdHB5L3Rvb2wvY29tbWFuZHMvcmViYXNlbGluZTIvYnVja2V0X3VuaXR0ZXN0LnB5CkBAIC0w
LDAgKzEsMjczIEBACisjIS91c3IvYmluL2VudiBweXRob24KKyMgQ29weXJpZ2h0IChDKSAyMDEw
IEdvb2dsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisjCisjIFJlZGlzdHJpYnV0aW9uIGFu
ZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorIyBtb2Rp
ZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRp
dGlvbnMKKyMgYXJlIG1ldDoKKyMKKyMgMS4gIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29k
ZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisjICAgICBub3RpY2UsIHRoaXMgbGlz
dCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisjIDIuICBSZWRp
c3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHly
aWdodAorIyAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxv
d2luZyBkaXNjbGFpbWVyIGluIHRoZQorIyAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIg
bWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyMKKyMgVEhJUyBTT0ZU
V0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBBTkQgSVRTIENPTlRSSUJVVE9SUyAiQVMgSVMiIEFO
RCBBTlkKKyMgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5P
VCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRAorIyBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElU
WSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCisjIERJU0NMQUlNRUQu
IElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIE9SIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZP
UiBBTlkKKyMgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZ
LCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMKKyMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVE
IFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworIyBMT1NT
IE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dF
VkVSIENBVVNFRCBBTkQKKyMgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4g
Q09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyMgKElOQ0xVRElORyBORUdMSUdF
TkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisj
IFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VD
SCBEQU1BR0UuCisKK2Zyb20gYnVja2V0IGltcG9ydCBCdWNrZXQsIEJ1Y2tldFRyZWUKK2ltcG9y
dCB1bml0dGVzdAorZnJvbSB3ZWJraXRweS5jb21tb24ubmV0LnJlc3VsdF91bml0dGVzdCBpbXBv
cnQgRmFrZVJlc3VsdAorCisKK2NsYXNzIEJ1Y2tldFRlc3QodW5pdHRlc3QuVGVzdENhc2UpOgor
ICAgIGRlZiBzZXRVcChzZWxmKToKKyAgICAgICAgc2VsZi5fbWFjID0gQnVja2V0KCdtYWMnKQor
ICAgICAgICBzZWxmLl9tYWNfbGVvcGFyZCA9IEJ1Y2tldCgnbWFjX2xlb3BhcmQnKQorICAgICAg
ICBzZWxmLl9saW51eCA9IEJ1Y2tldCgnbGludXgnKQorICAgICAgICBzZWxmLl9ub25lID0gQnVj
a2V0KE5vbmUpCisKKyAgICBkZWYgdGVzdF9jaGlsZF9idWNrZXRfaW5oZXJpdHNfcmVzdWx0X29m
X3BhcmVudF9hc19pbXBsaWNpdF9yZXN1bHQoc2VsZik6CisgICAgICAgIHNlbGYuX21hYy5zZXRf
cmVzdWx0KEZha2VSZXN1bHQoJ21hYycsICd0ZXh0JywgJ2FiYzEyMycpKQorICAgICAgICBzZWxm
Ll9tYWMuYXBwZW5kKHNlbGYuX21hY19sZW9wYXJkKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFs
cygnYWJjMTIzJywgc2VsZi5fbWFjX2xlb3BhcmQuaW1wbGljaXRfcmVzdWx0KCkuY29udGVudHMo
KSkKKworICAgIGRlZiB0ZXN0X2NvbGxhcHNlX3dvcmtzX3doZW5fY2hpbGRfaGFzX2VxdWFsX3Jl
c3VsdHMoc2VsZik6CisgICAgICAgIHNlbGYuX21hYy5zZXRfcmVzdWx0KEZha2VSZXN1bHQoJ21h
YycsICd0ZXh0JywgJ2FiYzEyMycpKQorICAgICAgICBzZWxmLl9tYWNfbGVvcGFyZC5zZXRfcmVz
dWx0KEZha2VSZXN1bHQoJ21hYycsICd0ZXh0JywgJ2FiYzEyMycpKQorICAgICAgICBzZWxmLl9t
YWMuYXBwZW5kKHNlbGYuX21hY19sZW9wYXJkKQorCisgICAgICAgIHNlbGYuX21hYy5jb2xsYXBz
ZSgpCisKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHNlbGYuX21hY19sZW9wYXJkLmlzX2VtcHR5
KCkpCisKKyAgICBkZWYgdGVzdF9jb2xsYXBzZXNfY2hpbGRfd2l0aF9pbXBsaWNpdF9yZXN1bHRf
ZnJvbV9wYXJlbnQoc2VsZik6CisgICAgICAgIHNlbGYuX21hYy5zZXRfcmVzdWx0KEZha2VSZXN1
bHQoJ21hYycsICd0ZXh0JywgJ2FiYzEyMycpKQorICAgICAgICBzZWxmLl9tYWMuYXBwZW5kKHNl
bGYuX21hY19sZW9wYXJkKQorCisgICAgICAgIHNlbGYuX21hYy5jb2xsYXBzZSgpCisKKyAgICAg
ICAgc2VsZi5hc3NlcnRUcnVlKHNlbGYuX21hY19sZW9wYXJkLmlzX2VtcHR5KCkpCisKKyAgICBk
ZWYgdGVzdF9jb2xsYXBzZXNfY2hpbGRfd2l0aF9pbXBsaWNpdF9yZXN1bHRfYW5kX2V4cGxpY2l0
X3NpYmxpbmcoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzZWxmLl9tYWMuaXNfZW1w
dHkoKSkKKyAgICAgICAgc2VsZi5fbWFjLnNldF9yZXN1bHQoRmFrZVJlc3VsdCgnbWFjJywgJ3Rl
eHQnLCAnYWJjMTIzJykpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2Uoc2VsZi5fbWFjLmlzX2Vt
cHR5KCkpCisgICAgICAgIHNlbGYuX21hY19sZW9wYXJkLnNldF9yZXN1bHQoRmFrZVJlc3VsdCgn
bWFjJywgJ3RleHQnLCAnYWJjMTIzJykpCisKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShzZWxm
Ll9tYWMuaXNfZW1wdHkoKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoJ2FiYzEyMycsIHNl
bGYuX21hYy5pbXBsaWNpdF9yZXN1bHQoKS5jb250ZW50cygpKQorCisgICAgICAgIHNlbGYuX21h
Yy5hcHBlbmQoc2VsZi5fbWFjX2xlb3BhcmQpCisgICAgICAgIHNlbGYuX21hYy5hcHBlbmQoc2Vs
Zi5fbGludXgpCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoJ2FiYzEyMycsIHNlbGYuX21h
Y19sZW9wYXJkLmltcGxpY2l0X3Jlc3VsdCgpLmNvbnRlbnRzKCkpCisKKyAgICAgICAgc2VsZi5f
bWFjLmNvbGxhcHNlKCkKKworICAgICAgICBzZWxmLmFzc2VydFRydWUoc2VsZi5fbGludXguaXNf
ZW1wdHkoKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHNlbGYuX21hY19sZW9wYXJkLmlzX2Vt
cHR5KCkpCisKKyAgICBkZWYgdGVzdF9jbGVhcnNfb25seV9jaGlsZHJlbl90aGF0X2hhdmVfdGhl
X3NhbWVfcmVzdWx0cyhzZWxmKToKKyAgICAgICAgc2VsZi5fbWFjLnNldF9yZXN1bHQoRmFrZVJl
c3VsdCgnbWFjJywgJ3RleHQnLCAnYWJjMTIzJykpCisgICAgICAgIHNlbGYuX21hY19sZW9wYXJk
LnNldF9yZXN1bHQoRmFrZVJlc3VsdCgnbWFjLWxlb3BhcmQnLCAndGV4dCcsICdhYmMxMjMnKSkK
KyAgICAgICAgc2VsZi5fbGludXguc2V0X3Jlc3VsdChGYWtlUmVzdWx0KCdsaW51eCcsICd0ZXh0
JywgJ2RlZjQ1NicpKQorCisgICAgICAgIHNlbGYuX21hYy5hcHBlbmQoc2VsZi5fbWFjX2xlb3Bh
cmQpCisgICAgICAgIHNlbGYuX21hYy5hcHBlbmQoc2VsZi5fbGludXgpCisKKyAgICAgICAgc2Vs
Zi5fbWFjLmNvbGxhcHNlKCkKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFscygnYWJjMTIzJywg
c2VsZi5fbWFjLmltcGxpY2l0X3Jlc3VsdCgpLmNvbnRlbnRzKCkpCisgICAgICAgIHNlbGYuYXNz
ZXJ0RXF1YWxzKCdkZWY0NTYnLCBzZWxmLl9saW51eC5pbXBsaWNpdF9yZXN1bHQoKS5jb250ZW50
cygpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoc2VsZi5fbWFjX2xlb3BhcmQuaXNfZW1wdHko
KSkKKworICAgIGRlZiB0ZXN0X2NvbGxhcHNlX3dvcmtzX2Zvcl9kZXNjZW5kZW50c19kZWVwZXJf
dGhhdF9kaXJlY3RfY2hpbGRyZW4oc2VsZik6CisgICAgICAgIHNlbGYuX21hYy5zZXRfcmVzdWx0
KEZha2VSZXN1bHQoJ21hYycsICd0ZXh0JywgJ2FiYzEyMycpKQorICAgICAgICBzZWxmLl9saW51
eC5zZXRfcmVzdWx0KEZha2VSZXN1bHQoJ2xpbnV4JywgJ3RleHQnLCAnYWJjMTIzJykpCisKKyAg
ICAgICAgc2VsZi5fbWFjLmFwcGVuZChzZWxmLl9tYWNfbGVvcGFyZCkKKyAgICAgICAgc2VsZi5f
bWFjX2xlb3BhcmQuYXBwZW5kKHNlbGYuX2xpbnV4KQorCisgICAgICAgIHNlbGYuX21hYy5jb2xs
YXBzZSgpCisKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHNlbGYuX2xpbnV4LmlzX2VtcHR5KCkp
CisKKyAgICBkZWYgdGVzdF90aGF0X2NvbGxhcHNpbmdfbWFpbnRhaW5zX2NvcnJlY3RfcGxhdGZv
cm0oc2VsZik6CisgICAgICAgIHNlbGYuX21hYy5hcHBlbmQoc2VsZi5fbWFjX2xlb3BhcmQpCisg
ICAgICAgIHNlbGYuX25vbmUuYXBwZW5kKHNlbGYuX21hYykKKworICAgICAgICBzZWxmLl9tYWNf
bGVvcGFyZC5zZXRfcmVzdWx0KEZha2VSZXN1bHQoJ21hYy1sZW9wYXJkJywgJ3RleHQnLCAnYWJj
MTIzJykpCisgICAgICAgIHNlbGYuX25vbmUuc2V0X3Jlc3VsdChGYWtlUmVzdWx0KE5vbmUsICd0
ZXh0JywgJ2RlZjQ1NicpKQorCisgICAgICAgIHNlbGYuX25vbmUuY29sbGFwc2UoKQorCisgICAg
ICAgIHNlbGYuYXNzZXJ0RXF1YWxzKE5vbmUsIHNlbGYuX21hYy5pbXBsaWNpdF9yZXN1bHQoKS5w
bGF0Zm9ybSgpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscygnbWFjLWxlb3BhcmQnLCBzZWxm
Ll9tYWNfbGVvcGFyZC5pbXBsaWNpdF9yZXN1bHQoKS5wbGF0Zm9ybSgpKQorCisgICAgZGVmIHRl
c3RfcGFyZW50X3dpdGhfbm9fcmVzdWx0X3dpbGxfaW5oZXJpdF9mcm9tX2NoaWxkcmVuX3dpdGhf
c2FtZV9yZXN1bHQoc2VsZik6CisgICAgICAgIHNlbGYuX21hYy5zZXRfcmVzdWx0KEZha2VSZXN1
bHQoJ21hYycsICd0ZXh0JywgJ2FiYzEyMycpKQorICAgICAgICBzZWxmLl9saW51eC5zZXRfcmVz
dWx0KEZha2VSZXN1bHQoJ2xpbnV4JywgJ3RleHQnLCAnYWJjMTIzJykpCisKKyAgICAgICAgc2Vs
Zi5fbm9uZS5hcHBlbmQoc2VsZi5fbWFjKQorICAgICAgICBzZWxmLl9ub25lLmFwcGVuZChzZWxm
Ll9saW51eCkKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhOb25lLCBzZWxmLl9ub25lLmlt
cGxpY2l0X3Jlc3VsdCgpKQorCisgICAgICAgIHNlbGYuX25vbmUuY29sbGFwc2UoKQorCisgICAg
ICAgIHNlbGYuYXNzZXJ0RXF1YWxzKCdhYmMxMjMnLCBzZWxmLl9ub25lLmltcGxpY2l0X3Jlc3Vs
dCgpLmNvbnRlbnRzKCkpCisKKyIiIgorICAgICAgICBUT0RPIE1ha2UgdGhpcyBpbnRvIHRlc3Rz
LgorCisgICAgICAgIENoaWxkcmVuIGFsbCBoYXZlIHRoZSBzYW1lIGV4cGxpY2l0IHJlc3VsdCBh
cyB0aGUgcGFyZW50LgorCisgICAgICAgIEEgQSBBICAgICAgICBPIE8gTworICAgICAgICAgXHwv
ICAgIC0+ICAgIFx8LworICAgICAgICAgIEEgICAgICAgICAgICBBCisKKworICAgICAgICBDaGls
ZHJlbiBhbGwgaGF2ZSB0aGUgc2FtZSByZXN1bHQsIGJ1dCB0aGUgcGFyZW50IGhhcyBub25lLgor
CisgICAgICAgIEEgQSBBICAgICAgICBPIE8gTworICAgICAgICAgXHwvICAgIC0+ICAgIFx8Lwor
ICAgICAgICAgIE8gICAgICAgICAgICBBCisKKworICAgICAgICBPbmUgb2YgdGhlIGNoaWxkcmVu
IGhhcyB0aGUgc2FtZSByZXN1bHQgYXMgdGhlIHBhcmVudC4KKworICAgICAgICBBIEIgQyAgICAg
ICAgTyBCIEMKKyAgICAgICAgIFx8LyAgICAtPiAgICBcfC8KKyAgICAgICAgICBBICAgICAgICAg
ICAgQQorCisgICAgICAgIERlc2NlbmRlbnRzIGFsbCBoYXZlIHNhbWUgZXhwbGljaXQgcmVzdWx0
IGFzIHRoZSBhbmNlc3Rvci4KKworICAgICAgICBBIEEgQSAgICAgICAgTyBPIE8KKyAgICAgICAg
IFx8LyAgICAtPiAgICBcfC8KKyAgICAgICAgICBPICAgICAgICAgICAgTworICAgICAgICAgIHwg
ICAgICAgICAgICB8CisgICAgICAgICAgQSAgICAgICAgICAgIEEKKworICAgICAgICBXaGVyZSBB
IGlzIGEgYnVja2V0IHdpdGggYSB0ZXN0IHJlc3VsdCwgYW5kIE8gaXMgYW4gZW1wdHkgYnVja2V0
LgorIiIiCisKKworY2xhc3MgQnVja2V0VHJlZVRlc3QodW5pdHRlc3QuVGVzdENhc2UpOgorICAg
IGRlZiB0ZXN0X25ld19leHBlY3RhdGlvbnNfb3ZlcnJpZGVfb2xkX29uZXMoc2VsZik6CisgICAg
ICAgIGIgPSBCdWNrZXRUcmVlKCkKKyAgICAgICAgbWIgPSBiLm1ha2VfYnVja2V0CisgICAgICAg
IHJvb3QgPSBtYihOb25lLAorICAgICAgICAgICAgbWIoJ21hYycpLAorICAgICAgICAgICAgbWIo
J2xpbnV4JyksCisgICAgICAgICAgICBtYignd2luJykpCisKKyAgICAgICAgYi5pbnNlcnRfcmVz
dWx0KEZha2VSZXN1bHQoTm9uZSwgJ3RleHQnLCAnYWJjMTIzJywgVHJ1ZSkpCisgICAgICAgIGIu
aW5zZXJ0X3Jlc3VsdChGYWtlUmVzdWx0KE5vbmUsICd0ZXh0JywgJ2RlZjQ1NicpKQorCisgICAg
ICAgIGIuY29sbGFwc2UoKQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoMSwgbGVuKGIucmVz
dWx0cygpKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgnZGVmNDU2JywgYi5yZXN1bHRzKClb
MF0uY29udGVudHMoKSkKKworICAgIGRlZiB0ZXN0X3JlYmFzZWxpbmluZ19zdGlsbF93b3Jrc19p
Zl9uZXdfcmVzdWx0c19hcmVfaW5zZXJ0ZWRfZmlyc3Qoc2VsZik6CisgICAgICAgIGIgPSBCdWNr
ZXRUcmVlKCkKKyAgICAgICAgbWIgPSBiLm1ha2VfYnVja2V0CisgICAgICAgIHJvb3QgPSBtYihO
b25lLAorICAgICAgICAgICAgbWIoJ21hYycpLAorICAgICAgICAgICAgbWIoJ2xpbnV4JyksCisg
ICAgICAgICAgICBtYignd2luJykpCisKKyAgICAgICAgYi5pbnNlcnRfcmVzdWx0KEZha2VSZXN1
bHQoTm9uZSwgJ3RleHQnLCAnZGVmNDU2JykpCisgICAgICAgIGIuaW5zZXJ0X3Jlc3VsdChGYWtl
UmVzdWx0KE5vbmUsICd0ZXh0JywgJ2FiYzEyMycsIFRydWUpKQorCisgICAgICAgIGIuY29sbGFw
c2UoKQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoMSwgbGVuKGIucmVzdWx0cygpKSkKKyAg
ICAgICAgc2VsZi5hc3NlcnRFcXVhbCgnZGVmNDU2JywgYi5yZXN1bHRzKClbMF0uY29udGVudHMo
KSkKKworICAgIGRlZiB0ZXN0X2tpZHNfaGF2aW5nX3NhbWVfcmViYXNlbGluZV9jYXVzZXNfb3Zl
cnJpZGVfb25fcGFyZW50KHNlbGYpOgorICAgICAgICBiID0gQnVja2V0VHJlZSgpCisgICAgICAg
IG1iID0gYi5tYWtlX2J1Y2tldAorICAgICAgICByb290ID0gbWIoTm9uZSwKKyAgICAgICAgICAg
IG1iKCdtYWMnKSwKKyAgICAgICAgICAgIG1iKCd3aW4nKSkKKyAgICAgICAgYi5nZXRfYnVja2V0
KE5vbmUpLm1hcmtfYXNfYWdncmVnYXRlKCkKKworICAgICAgICBiLmluc2VydF9yZXN1bHQoRmFr
ZVJlc3VsdChOb25lLCAndGV4dCcsICdvbGQgcmVzdWx0JywgVHJ1ZSkpCisgICAgICAgIGIuaW5z
ZXJ0X3Jlc3VsdChGYWtlUmVzdWx0KCdtYWMnLCAndGV4dCcsICduZXcgcmVzdWx0JykpCisgICAg
ICAgIGIuaW5zZXJ0X3Jlc3VsdChGYWtlUmVzdWx0KCd3aW4nLCAndGV4dCcsICduZXcgcmVzdWx0
JykpCisKKyAgICAgICAgYi5jb2xsYXBzZSgpCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgx
LCBsZW4oYi5yZXN1bHRzKCkpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKE5vbmUsIGIucmVz
dWx0cygpWzBdLnBsYXRmb3JtKCkpCisKKyAgICBkZWYgdGVzdF93ZV9kb250X2luaGVyaXRfZnJv
bV9jaGlsZHJlbl9pZl93ZV9hcmVfbm90X2FuX2FnZ3JlZ2F0ZV9idWNrZXQoc2VsZik6CisgICAg
ICAgIGIgPSBCdWNrZXRUcmVlKCkKKyAgICAgICAgbWIgPSBiLm1ha2VfYnVja2V0CisgICAgICAg
IHJvb3QgPSBtYihOb25lLAorICAgICAgICAgICAgbWIoJ21hYycpLAorICAgICAgICAgICAgbWIo
J3dpbicpKQorCisgICAgICAgIGIuaW5zZXJ0X3Jlc3VsdChGYWtlUmVzdWx0KE5vbmUsICd0ZXh0
JywgJ29sZCByZXN1bHQnLCBUcnVlKSkKKyAgICAgICAgYi5pbnNlcnRfcmVzdWx0KEZha2VSZXN1
bHQoJ21hYycsICd0ZXh0JywgJ25ldyByZXN1bHQnKSkKKyAgICAgICAgYi5pbnNlcnRfcmVzdWx0
KEZha2VSZXN1bHQoJ3dpbicsICd0ZXh0JywgJ25ldyByZXN1bHQnKSkKKworICAgICAgICBiLmNv
bGxhcHNlKCkKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKDMsIGxlbihiLnJlc3VsdHMoKSkp
CisKKyAgICBkZWYgdGVzdF9tdWx0aV9waGFzZWRfY29sbGFwc2Vfd29ya3Moc2VsZik6CisgICAg
ICAgIGIgPSBCdWNrZXRUcmVlKCkKKyAgICAgICAgbWIgPSBiLm1ha2VfYnVja2V0CisgICAgICAg
IHJvb3QgPSBtYihOb25lLAorICAgICAgICAgICAgbWIoJ21hYycsCisgICAgICAgICAgICAgICAg
bWIoJ21hYy1sZW9wYXJkJykpKQorCisgICAgICAgIGIuZ2V0X2J1Y2tldChOb25lKS5tYXJrX2Fz
X2FnZ3JlZ2F0ZSgpCisKKyAgICAgICAgYi5pbnNlcnRfcmVzdWx0KEZha2VSZXN1bHQoTm9uZSwg
J3RleHQnLCAnb2xkIHJlc3VsdCcsIFRydWUpKQorICAgICAgICBiLmluc2VydF9yZXN1bHQoRmFr
ZVJlc3VsdCgnbWFjJywgJ3RleHQnLCAnbmV3IHJlc3VsdCcpKQorICAgICAgICBiLmluc2VydF9y
ZXN1bHQoRmFrZVJlc3VsdCgnbWFjLWxlb3BhcmQnLCAndGV4dCcsICduZXcgcmVzdWx0JykpCisK
KyAgICAgICAgYi5jb2xsYXBzZSgpCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgxLCBsZW4o
Yi5yZXN1bHRzKCkpKQorCisgICAgZGVmIHRlc3RfcGxhaW5fb2xkX2RlZHVwZV9vbl9sYXlvdXRf
dGVzdHNfd29ya3Moc2VsZik6CisgICAgICAgIGIgPSBCdWNrZXRUcmVlKCkKKyAgICAgICAgbWIg
PSBiLm1ha2VfYnVja2V0CisgICAgICAgIHJvb3QgPSBtYihOb25lLAorICAgICAgICAgICAgbWIo
J21hYycsCisgICAgICAgICAgICAgICAgbWIoJ21hYy1sZW9wYXJkJywKKyAgICAgICAgICAgICAg
ICAgICAgbWIoJ21hYy1zbm93bGVvcGFyZCcpKSksCisgICAgICAgICAgICBtYignbGludXgnLAor
ICAgICAgICAgICAgICAgIG1iKCdjaHJvbWl1bS1saW51eCcpKSkKKworICAgICAgICBiLmluc2Vy
dF9yZXN1bHQoRmFrZVJlc3VsdChOb25lLCAndGV4dCcsICdyZXN1bHQnLCBUcnVlKSkKKyAgICAg
ICAgYi5pbnNlcnRfcmVzdWx0KEZha2VSZXN1bHQoJ2Nocm9taXVtLWxpbnV4JywgJ3RleHQnLCAn
cmVzdWx0JywgVHJ1ZSkpCisKKyAgICAgICAgYi5jb2xsYXBzZSgpCisKKyAgICAgICAgc2VsZi5h
c3NlcnRFcXVhbHMoMSwgbGVuKGIucmVzdWx0cygpKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVh
bHMoTm9uZSwgYi5yZXN1bHRzKClbMF0ucGxhdGZvcm0oKSkKKworICAgIGRlZiB0ZXN0X2NvbGxh
cHNlX29uX2J1Y2tldHNfd2l0aF9ub19yZXN1bHRfZG9lc250X2NyYXNoKHNlbGYpOgorICAgICAg
ICBiID0gQnVja2V0VHJlZSgpCisgICAgICAgIG1iID0gYi5tYWtlX2J1Y2tldAorICAgICAgICBy
b290ID0gbWIoTm9uZSwKKyAgICAgICAgICAgIG1iKCdtYWMnLAorICAgICAgICAgICAgICAgIG1i
KCdtYWMtbGVvcGFyZCcpKSkKKworICAgICAgICBiLmNvbGxhcHNlKCkKKworaWYgX19uYW1lX18g
PT0gJ19fbWFpbl9fJzoKKyAgICB1bml0dGVzdC5tYWluKCkKZGlmZiAtLWdpdCBhL1dlYktpdFRv
b2xzL1NjcmlwdHMvd2Via2l0cHkvdG9vbC9jb21tYW5kcy9yZWJhc2VsaW5lMi9yZWJhc2VsaW5l
Mi5weSBiL1dlYktpdFRvb2xzL1NjcmlwdHMvd2Via2l0cHkvdG9vbC9jb21tYW5kcy9yZWJhc2Vs
aW5lMi9yZWJhc2VsaW5lMi5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwLi4xYTgxMzAyOGEzMjNjNjMxYzcwNGVkZDdj
ZGM2MWI5N2IxYWQ3MjM4Ci0tLSAvZGV2L251bGwKKysrIGIvV2ViS2l0VG9vbHMvU2NyaXB0cy93
ZWJraXRweS90b29sL2NvbW1hbmRzL3JlYmFzZWxpbmUyL3JlYmFzZWxpbmUyLnB5CkBAIC0wLDAg
KzEsMTAyIEBACisjIENvcHlyaWdodCAoYykgMjAxMCBHb29nbGUgSW5jLiBBbGwgcmlnaHRzIHJl
c2VydmVkLgorIworIyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5
IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyMgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHBy
b3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorIyBtZXQ6CisjCisjICAg
ICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUg
Y29weXJpZ2h0CisjIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xs
b3dpbmcgZGlzY2xhaW1lci4KKyMgICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3Jt
IG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorIyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qg
b2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisjIGluIHRoZSBkb2N1
bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyMgZGlz
dHJpYnV0aW9uLgorIyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0
aGUgbmFtZXMgb2YgaXRzCisjIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9y
IHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisjIHRoaXMgc29mdHdhcmUgd2l0aG91dCBz
cGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisjCisjIFRISVMgU09GVFdBUkUgSVMg
UFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyMgIkFT
IElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJV
VCBOT1QKKyMgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFC
SUxJVFkgQU5EIEZJVE5FU1MgRk9SCisjIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJ
TUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisjIE9XTkVSIE9SIENPTlRSSUJV
VE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorIyBT
UEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBC
VVQgTk9UCisjIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1Ig
U0VSVklDRVM7IExPU1MgT0YgVVNFLAorIyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJ
TlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyMgVEhFT1JZIE9GIExJQUJJ
TElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorIyAo
SU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VU
IE9GIFRIRSBVU0UKKyMgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQ
T1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyMKKyMgQ29udGFpbnMgdGhlIGNvbW1hbmQgZm9y
IHRoZSAnd2Via2l0LXBhdGNoIHJlYmFzZWxpbmUyJyBzY3JpcHQuIFRoaXMKKyMgY2xhc3MgaGFu
ZGxlcyBjb21tYW5kIGxpbmUgb3B0aW9ucyBhbmQgaW52b2tlcyB0aGUgY2xhc3MgUmViYXNlbGlu
ZXIKKyMgdG8gcGVyZm9ybSByZWJhc2VsaW5lcy4KKworZnJvbSB3ZWJraXRweS50b29sLm11bHRp
Y29tbWFuZHRvb2wgaW1wb3J0IEFic3RyYWN0RGVjbGFyYXRpdmVDb21tYW5kCitmcm9tIHdlYmtp
dHB5LmNvbW1vbi5uZXQucmVzdWx0c2V0IGltcG9ydCBSZXN1bHRTZXQKK2Zyb20gd2Via2l0cHku
Y29tbW9uLm5ldC5yZXN1bHQgaW1wb3J0IEltYWdlUmVzdWx0Citmcm9tIHdlYmtpdHB5LnRvb2wu
Y29tbWFuZHMucmViYXNlbGluZTIucmViYXNlbGluZXIgaW1wb3J0IFJlYmFzZWxpbmVyCisKK2Zy
b20gb3B0cGFyc2UgaW1wb3J0IG1ha2Vfb3B0aW9uCitpbXBvcnQgb3MKKworCitjbGFzcyBJbWFn
ZURpZmZlcihvYmplY3QpOgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBwb3J0KToKKyAgICAgICAg
c2VsZi5fcG9ydCA9IHBvcnQKKworICAgIGRlZiBzYW1lX2ltYWdlKHNlbGYsIGltZzEsIGltZzIp
OgorICAgICAgICByZXR1cm4gbm90IHNlbGYuX3BvcnQuZGlmZl9pbWFnZShpbWcxLCBpbWcyKQor
CisKK2NsYXNzIFJlYmFzZWxpbmUyKEFic3RyYWN0RGVjbGFyYXRpdmVDb21tYW5kKToKKyAgICBu
YW1lID0gInJlYmFzZWxpbmUyIgorICAgIGhlbHBfdGV4dCA9ICJGZXRjaGVzIG5ldyBleHBlY3Rl
ZCByZXN1bHRzIGZyb20gYnVpbGRib3RzLiIKKworICAgIGRlZiBfX2luaXRfXyhzZWxmKToKKyAg
ICAgICAgb3B0aW9ucyA9IFsKKyAgICAgICAgICAgIG1ha2Vfb3B0aW9uKCItLXBsYXRmb3JtIiwg
YWN0aW9uPSJzdG9yZSIsIGRlc3Q9InBsYXRmb3JtIiwKKyAgICAgICAgICAgICAgICBoZWxwPSJX
aGF0IHBsYXRmb3JtJ3MgYnVpbGRlcnMgc2hvdWxkIGJlIHVzZWQgdG8gcmV0cmlldmUgbmV3IGJh
c2VsaW5lcy4iKSwKKyAgICAgICAgICAgIG1ha2Vfb3B0aW9uKCItLXBsYXRmb3JtcyIsIGFjdGlv
bj0ic3RvcmUiLCBkZXN0PSJwbGF0Zm9ybXMiLAorICAgICAgICAgICAgICAgIGhlbHA9IkNvbW1h
IHNlcGFyYXRlZCBsaXN0IG9mIHRoZSBwbGF0Zm9ybXMgdG8gcmViYXNlbGluZSBmb3IuIiksCisg
ICAgICAgICAgICBtYWtlX29wdGlvbigiLS11c2UtemlwLWFzLWFyY2hpdmUiLCBhY3Rpb249InN0
b3JlIiwKKyAgICAgICAgICAgICAgICBoZWxwPSJVc2UgdGhlIHppcCBhdCB0aGUgc3BlY2lmaWVk
IFVSTCAobG9jYWwgb3IgcmVtb3RlKSB0byBzcGVjaWZ5IHJlc3VsdHMgIgorICAgICAgICAgICAg
ICAgICJmb3IgdGhlIGdpdmVuIHBsYXRmb3JtLiIsIG1ldGF2YXI9IjxwbGF0Zm9ybT46PHppcCB1
cmw+IiksCisgICAgICAgIF0KKyAgICAgICAgQWJzdHJhY3REZWNsYXJhdGl2ZUNvbW1hbmQuX19p
bml0X18oc2VsZiwgb3B0aW9ucz1vcHRpb25zKQorCisgICAgZGVmIGV4ZWN1dGUoc2VsZiwgb3B0
aW9ucywgYXJncywgdG9vbCk6CisgICAgICAgIHBvcnQgPSB0b29sLnBvcnRfZmFjdG9yeS5nZXQo
cG9ydF9uYW1lPW9wdGlvbnMucGxhdGZvcm0pCisKKyAgICAgICAgaWYgb3B0aW9ucy5wbGF0Zm9y
bXM6CisgICAgICAgICAgICBwbGF0Zm9ybXMgPSBvcHRpb25zLnBsYXRmb3Jtcy5zcGxpdCgnLCcp
CisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBwbGF0Zm9ybXMgPSBbXQorCisgICAgICAgIGlm
IHBvcnQuY2hlY2tfaW1hZ2VfZGlmZigpOgorICAgICAgICAgICAgSW1hZ2VSZXN1bHQuaW1hZ2Vf
ZGlmZmVyID0gSW1hZ2VEaWZmZXIocG9ydCkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHBy
aW50ICJXYXJuaW5nOiBDb3VsZG4ndCBmaW5kIEltYWdlRGlmZiwgc28gd2Ugd2lsbCBjcmFzaCBp
ZiB3ZSBuZWVkIHRvIGNvbXBhcmUgaW1hZ2VzIHRoYXQgZG9uJ3QgaGF2ZSBjaGVja3N1bXMuIgor
ICAgICAgICAgICAgSW1hZ2VSZXN1bHQuaW1hZ2VfZGlmZmVyID0gTm9uZQorCisgICAgICAgIGlm
IG9wdGlvbnMudXNlX3ppcF9hc19hcmNoaXZlIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgaSA9
IG9wdGlvbnMudXNlX3ppcF9hc19hcmNoaXZlLmluZGV4KCc6JykKKyAgICAgICAgICAgIHBsYXRm
b3JtLCB1cmwgPSBvcHRpb25zLnVzZV96aXBfYXNfYXJjaGl2ZVs6aV0sIG9wdGlvbnMudXNlX3pp
cF9hc19hcmNoaXZlW2kgKyAxOl0KKyAgICAgICAgICAgIHJlbW90ZV9idWlsZGVycyA9IFJlc3Vs
dFNldC5mcm9tX3ppcF91cmwocGxhdGZvcm0sIHVybCkKKyAgICAgICAgZWxzZToKKyAgICAgICAg
ICAgIHJlbW90ZV9idWlsZGVycyA9IHBvcnQuYnVpbGRib3RfcmVzdWx0c2V0KHBsYXRmb3JtcykK
KworICAgICAgICBsYXlvdXRfdGVzdHNfZGlyID0gcG9ydC5sYXlvdXRfdGVzdHNfZGlyKCkKKyAg
ICAgICAgbG9jYWxfYnVpbGRlcnMgPSBSZXN1bHRTZXQuZnJvbV9wYXRoKGxheW91dF90ZXN0c19k
aXIpCisgICAgICAgIGxpbmVzID0gc2VsZi5hbGxfYmFzZWxpbmVfc2VhcmNoX3BhdGhzKHRvb2wu
cG9ydF9mYWN0b3J5KQorICAgICAgICByYiA9IFJlYmFzZWxpbmVyKGFyZ3MsIGxvY2FsX2J1aWxk
ZXJzLCByZW1vdGVfYnVpbGRlcnMsIGxpbmVzLCBsYXlvdXRfdGVzdHNfZGlyKQorICAgICAgICBy
Yi5zZXRfdmVyYm9zZShvcHRpb25zLnZlcmJvc2UpCisgICAgICAgIHJiLnJlYmFzZWxpbmUob3B0
aW9ucy5kcnlfcnVuKQorCisgICAgZGVmIGFsbF9iYXNlbGluZV9zZWFyY2hfcGF0aHMoc2VsZiwg
cG9ydF9mYWN0b3J5KToKKyAgICAgICAgcG9ydHMgPSBwb3J0X2ZhY3RvcnkuZ2V0X2FsbCgpCisg
ICAgICAgIGRlbChwb3J0c1sndGVzdCddKQorICAgICAgICBkZWwocG9ydHNbJ2RyeXJ1biddKQor
ICAgICAgICByZXN1bHQgPSBbXQorICAgICAgICBmb3IgcG9ydF9uYW1lLCBwb3J0IGluIHBvcnRz
Lml0ZW1zKCk6CisgICAgICAgICAgICBwcmludCAiZ2V0dGluZyBiYXNlbGluZXMgZm9yICVzIiAl
IHBvcnRfbmFtZQorICAgICAgICAgICAgcmVzdWx0LmFwcGVuZChtYXAob3MucGF0aC5iYXNlbmFt
ZSwgcG9ydC5iYXNlbGluZV9zZWFyY2hfcGF0aCgpKSkKKyAgICAgICAgcmV0dXJuIHJlc3VsdApk
aWZmIC0tZ2l0IGEvV2ViS2l0VG9vbHMvU2NyaXB0cy93ZWJraXRweS90b29sL2NvbW1hbmRzL3Jl
YmFzZWxpbmUyL3JlYmFzZWxpbmVyLnB5IGIvV2ViS2l0VG9vbHMvU2NyaXB0cy93ZWJraXRweS90
b29sL2NvbW1hbmRzL3JlYmFzZWxpbmUyL3JlYmFzZWxpbmVyLnB5Cm5ldyBmaWxlIG1vZGUgMTAw
NjQ0CmluZGV4IDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAuLjgxYTVk
ZGFkNGVhNmZkMTE3MjlmNDNlZTZlNmY4MGZmODIzOGM3N2MKLS0tIC9kZXYvbnVsbAorKysgYi9X
ZWJLaXRUb29scy9TY3JpcHRzL3dlYmtpdHB5L3Rvb2wvY29tbWFuZHMvcmViYXNlbGluZTIvcmVi
YXNlbGluZXIucHkKQEAgLTAsMCArMSwxNTggQEAKKyMhL3Vzci9iaW4vZW52IHB5dGhvbgorIyBD
b3B5cmlnaHQgKEMpIDIwMTAgR29vZ2xlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyMKKyMg
UmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBv
ciB3aXRob3V0CisjIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRo
ZSBmb2xsb3dpbmcgY29uZGl0aW9ucworIyBhcmUgbWV0OgorIworIyAxLiAgUmVkaXN0cmlidXRp
b25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyMgICAg
IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xh
aW1lci4KKyMgMi4gIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVj
ZSB0aGUgYWJvdmUgY29weXJpZ2h0CisjICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRp
b25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisjICAgICBkb2N1bWVudGF0
aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9u
LgorIworIyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIEFORCBJVFMgQ09OVFJJ
QlVUT1JTICJBUyBJUyIgQU5EIEFOWQorIyBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywg
SU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVECisjIFdBUlJBTlRJRVMg
T0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBB
UkUKKyMgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgT1IgSVRTIENPTlRSSUJV
VE9SUyBCRSBMSUFCTEUgRk9SIEFOWQorIyBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBT
UEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUworIyAoSU5DTFVESU5H
LCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1Ig
U0VSVklDRVM7CisjIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJ
TlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAorIyBPTiBBTlkgVEhFT1JZIE9GIExJQUJJ
TElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorIyAo
SU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VU
IE9GIFRIRSBVU0UgT0YKKyMgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQ
T1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyMKKyMgQSBSZWJhc2VsaW5lciBpbnN0YWxscyB0
aGUgbWluaW1hbCBzZXQgb2YgbmV3IGJhc2VsaW5lcyBvdmVyIGEgc2V0IG9mIGxvY2FsCisjIGJh
c2VsaW5lcywgcmVtb3ZpbmcgYW55IGR1cGxpY2F0ZXMgdGhhdCBpdCBkZXRlY3RzLgorCitpbXBv
cnQgYnVja2V0CisKKworY2xhc3MgUmViYXNlbGluZXIob2JqZWN0KToKKyAgICBUWVBFUyA9IFsn
dGV4dCcsICdpbWFnZSddCisgICAgIiIiUmViYXNlbGluZXMgYW5kIGRlZHVwZXMgcmVzdWx0cy4i
IiIKKyAgICBkZWYgX19pbml0X18oc2VsZiwgdGVzdF9nbG9icywgbG9jYWxfcmVzdWx0cywgcmVt
b3RlX3Jlc3VsdHMsIGxpbmVzLAorICAgICAgICAgICAgICAgICBsYXlvdXRfdGVzdHNfZGlyLCAq
Kmt3YXJncyk6CisgICAgICAgIHNlbGYuX3Rlc3RfZ2xvYnMgPSB0ZXN0X2dsb2JzCisgICAgICAg
IHNlbGYuX2V4aXN0aW5nX3Jlc3VsdHMgPSBsb2NhbF9yZXN1bHRzCisgICAgICAgIHNlbGYuX25l
d19yZXN1bHRzID0gcmVtb3RlX3Jlc3VsdHMKKyAgICAgICAgc2VsZi5fbGluZXMgPSBsaW5lcwor
ICAgICAgICBzZWxmLl9sYXlvdXRfdGVzdHNfZGlyID0gbGF5b3V0X3Rlc3RzX2RpcgorICAgICAg
ICBzZWxmLl92ZXJib3NlID0ga3dhcmdzLmdldCgndmVyYm9zZScsIEZhbHNlKQorICAgICAgICBz
ZWxmLl9yZWJhc2VsaW5lcyA9IE5vbmUKKworICAgIGRlZiBfc2hvd19yZXN1bHRzKHNlbGYsIGRl
c2NyaXB0aW9uLCByZXN1bHRzKToKKyAgICAgICAgc2VsZi5sb2coZGVzY3JpcHRpb24pCisgICAg
ICAgIGZvciByIGluIHJlc3VsdHM6CisgICAgICAgICAgICBzZWxmLmxvZyhyKQorCisgICAgZGVm
IF90ZXN0X25hbWVzKHNlbGYpOgorICAgICAgICB0ZXN0X25hbWVzID0gc2V0KFtdKQorICAgICAg
ICBpZiBsZW4oc2VsZi5fdGVzdF9nbG9icykgPT0gMDoKKyAgICAgICAgICAgIHJldHVybiBtYXAo
bGFtYmRhIHI6IHIubmFtZSgpLCBzZWxmLl9uZXdfcmVzdWx0cy5yZXN1bHRzX2ZvcignJykpCisg
ICAgICAgIGZvciB0ZXN0X2dsb2IgaW4gc2VsZi5fdGVzdF9nbG9iczoKKyAgICAgICAgICAgIG5l
d19yZXN1bHRzID0gc2VsZi5fbmV3X3Jlc3VsdHMucmVzdWx0c19mb3IodGVzdF9nbG9iKQorICAg
ICAgICAgICAgIyBUT0RPIFRoaXMgaXMgcmVhbGx5IHNsb3cgYW5kIGlzbid0IG5lY2Vzc2FyeSB1
bmxlc3Mgd2UgYXJlIG1lcmVseQorICAgICAgICAgICAgIyBkZWR1cGluZyBleGlzdGluZyByZXN1
bHRzLiBJdCBzaG91bGQgYmUgY29udHJvbGxlZCBieSBhIGZsYWcuCisgICAgICAgICAgICAjIG9s
ZF9yZXN1bHRzID0gc2VsZi5fZXhpc3RpbmdfcmVzdWx0cy5yZXN1bHRzX2Zvcih0ZXN0X2dsb2Ip
CisgICAgICAgICAgICBuYW1lcyA9IHNldChtYXAobGFtYmRhIHI6IHIubmFtZSgpLCBuZXdfcmVz
dWx0cykpCisgICAgICAgICAgICB0ZXN0X25hbWVzID0gdGVzdF9uYW1lcy51bmlvbihuYW1lcykK
KyAgICAgICAgcmV0dXJuIHRlc3RfbmFtZXMKKworICAgIGRlZiBfZGVkdXBlKHNlbGYsIHJlc3Vs
dHMpOgorICAgICAgICBkZWR1cGVkID0gc2V0KFtdKQorICAgICAgICBmb3IgbGluZSBpbiBzZWxm
Ll9saW5lczoKKyAgICAgICAgICAgIGJ1Y2tldHMgPSBzZWxmLl9tYWtlX2J1Y2tldF9saW5lKGxp
bmUpCisgICAgICAgICAgICBmb3IgcmVzdWx0IGluIHJlc3VsdHM6CisgICAgICAgICAgICAgICAg
YnVja2V0cy5pbnNlcnRfcmVzdWx0KHJlc3VsdCkKKyAgICAgICAgICAgIGJ1Y2tldHMuY29sbGFw
c2UoKQorICAgICAgICAgICAgZGVkdXBlZCA9IGRlZHVwZWQudW5pb24oYnVja2V0cy5yZXN1bHRz
KCkpCisgICAgICAgIHJldHVybiBkZWR1cGVkCisKKyAgICBkZWYgX21ha2VfYnVja2V0X2xpbmUo
c2VsZiwgbGluZSk6CisgICAgICAgIGJ0ID0gYnVja2V0LkJ1Y2tldFRyZWUoKQorICAgICAgICBs
aW5lID0gbGluZVs6XQorICAgICAgICBsaW5lLnJldmVyc2UoKQorICAgICAgICB0b3BfYnVja2V0
ID0gTm9uZQorICAgICAgICBmb3IgcGxhdGZvcm0gaW4gbGluZToKKyAgICAgICAgICAgIG5leHRf
YnVja2V0ID0gYnQubWFrZV9idWNrZXQocGxhdGZvcm0pCisgICAgICAgICAgICBpZiB0b3BfYnVj
a2V0IGlzIG5vdCBOb25lOgorICAgICAgICAgICAgICAgIHRvcF9idWNrZXQuYXBwZW5kKG5leHRf
YnVja2V0KQorICAgICAgICAgICAgdG9wX2J1Y2tldCA9IG5leHRfYnVja2V0CisgICAgICAgIHJl
dHVybiBidAorCisgICAgZGVmIHNldF92ZXJib3NlKHNlbGYsIHZlcmJvc2UpOgorICAgICAgICBz
ZWxmLl92ZXJib3NlID0gdmVyYm9zZQorCisgICAgZGVmIGV4aXN0aW5nX3Jlc3VsdHMoc2VsZiwg
dGVzdF9uYW1lKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX2V4aXN0aW5nX3Jlc3VsdHMucmVzdWx0
c19mb3IodGVzdF9uYW1lKQorCisgICAgZGVmIG5ld19yZXN1bHRzKHNlbGYsIHRlc3RfbmFtZSk6
CisgICAgICAgIHJldHVybiBzZWxmLl9uZXdfcmVzdWx0cy5yZXN1bHRzX2Zvcih0ZXN0X25hbWUp
CisKKyAgICBkZWYgY2FsY3VsYXRlX3JlYmFzZWxpbmUoc2VsZik6CisgICAgICAgIGlmIHNlbGYu
X3JlYmFzZWxpbmVzIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYuX3JlYmFz
ZWxpbmVzCisgICAgICAgIHNlbGYuX3JlYmFzZWxpbmVzID0ge30KKyAgICAgICAgZm9yIHRlc3Rf
bmFtZSBpbiBzZWxmLl90ZXN0X25hbWVzKCk6CisgICAgICAgICAgICBmb3IgdHlwZSBpbiBSZWJh
c2VsaW5lci5UWVBFUzoKKyAgICAgICAgICAgICAgICBuZXdfcmVzdWx0cyA9IHNlbGYuX25ld19y
ZXN1bHRzLnJlc3VsdHNfZm9yKHRlc3RfbmFtZSwgdGFyZ2V0X3R5cGU9dHlwZSwgZXhhY3RfbWF0
Y2g9VHJ1ZSkKKyAgICAgICAgICAgICAgICBleGlzdGluZ19yZXN1bHRzID0gc2VsZi5fZXhpc3Rp
bmdfcmVzdWx0cy5yZXN1bHRzX2Zvcih0ZXN0X25hbWUsIHRhcmdldF90eXBlPXR5cGUsIGV4YWN0
X21hdGNoPVRydWUpCisKKyAgICAgICAgICAgICAgICBpZiBsZW4obmV3X3Jlc3VsdHMpICsgbGVu
KGV4aXN0aW5nX3Jlc3VsdHMpID09IDA6CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCisK
KyAgICAgICAgICAgICAgICBzZWxmLmxvZygiUmViYXNlbGluaW5nICVzWyVzXSIgJSAodGVzdF9u
YW1lLCB0eXBlKSkKKworICAgICAgICAgICAgICAgIHNlbGYuX3Nob3dfcmVzdWx0cygibmV3X3Jl
c3VsdHMiLCBuZXdfcmVzdWx0cykKKyAgICAgICAgICAgICAgICBzZWxmLl9zaG93X3Jlc3VsdHMo
ImV4aXN0aW5nX3Jlc3VsdHMiLCBleGlzdGluZ19yZXN1bHRzKQorCisgICAgICAgICAgICAgICAg
ZGVkdXBlZF9yZXN1bHRzID0gc2VsZi5fZGVkdXBlKG5ld19yZXN1bHRzICsgZXhpc3RpbmdfcmVz
dWx0cykKKworICAgICAgICAgICAgICAgIHNlbGYuX3Nob3dfcmVzdWx0cygiZGVkdXBlZF9yZXN1
bHRzIiwgZGVkdXBlZF9yZXN1bHRzKQorCisgICAgICAgICAgICAgICAgdG9fZGVsZXRlID0gc2V0
KGV4aXN0aW5nX3Jlc3VsdHMpIC0gc2V0KGRlZHVwZWRfcmVzdWx0cykKKyAgICAgICAgICAgICAg
ICB0b19pbnN0YWxsID0gc2V0KGRlZHVwZWRfcmVzdWx0cykgLSBzZXQoZXhpc3RpbmdfcmVzdWx0
cykKKyAgICAgICAgICAgICAgICBzZWxmLl9yZWJhc2VsaW5lc1sodGVzdF9uYW1lLCB0eXBlKV0g
PSAodG9fZGVsZXRlLCB0b19pbnN0YWxsKQorICAgICAgICByZXR1cm4gc2VsZi5fcmViYXNlbGlu
ZXMKKworICAgIGRlZiBlYWNoX2RlbGV0ZShzZWxmKToKKyAgICAgICAgZm9yIHRlc3RfbmFtZSwg
Y2hhbmdlcyBpbiBzZWxmLmNhbGN1bGF0ZV9yZWJhc2VsaW5lKCkuaXRlbXMoKToKKyAgICAgICAg
ICAgIHlpZWxkIGNoYW5nZXNbMF0KKworICAgIGRlZiBlYWNoX2luc3RhbGwoc2VsZik6CisgICAg
ICAgIGZvciB0ZXN0X25hbWUsIGNoYW5nZXMgaW4gc2VsZi5jYWxjdWxhdGVfcmViYXNlbGluZSgp
Lml0ZW1zKCk6CisgICAgICAgICAgICB5aWVsZCBjaGFuZ2VzWzFdCisKKyAgICBkZWYgZGVsZXRl
cyhzZWxmKToKKyAgICAgICAgdG9fZGVsZXRlID0gW10KKyAgICAgICAgZm9yIGRlbGV0ZXMgaW4g
c2VsZi5lYWNoX2RlbGV0ZSgpOgorICAgICAgICAgICAgdG9fZGVsZXRlICs9IGRlbGV0ZXMKKyAg
ICAgICAgcmV0dXJuIHRvX2RlbGV0ZQorCisgICAgZGVmIGluc3RhbGxzKHNlbGYpOgorICAgICAg
ICB0b19pbnN0YWxsID0gW10KKyAgICAgICAgZm9yIGluc3RhbGxzIGluIHNlbGYuZWFjaF9pbnN0
YWxsKCk6CisgICAgICAgICAgICB0b19pbnN0YWxsICs9IGluc3RhbGxzCisgICAgICAgIHJldHVy
biB0b19pbnN0YWxsCisKKyAgICBkZWYgbG9nKHNlbGYsIG1zZyk6CisgICAgICAgIGlmIHNlbGYu
X3ZlcmJvc2U6CisgICAgICAgICAgICBwcmludCBtc2cKKworICAgIGRlZiByZWJhc2VsaW5lKHNl
bGYsIGRyeV9ydW49RmFsc2UpOgorICAgICAgICBmb3IgdGVzdF9uYW1lLCBjaGFuZ2VzIGluIHNl
bGYuY2FsY3VsYXRlX3JlYmFzZWxpbmUoKS5pdGVtcygpOgorICAgICAgICAgICAgc2VsZi5sb2co
InJlYmFzZWxpbmluZyAoJXMsICVzKSIgJSB0ZXN0X25hbWUpCisgICAgICAgICAgICB0b19kZWxl
dGUsIHRvX2luc3RhbGwgPSBjaGFuZ2VzCisKKyAgICAgICAgICAgIGZvciByIGluIHRvX2RlbGV0
ZToKKyAgICAgICAgICAgICAgICBpZiBkcnlfcnVuOgorICAgICAgICAgICAgICAgICAgICBwcmlu
dCAiZGVsZXRlICVzIiAlIHIKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAg
ICAgICByLmRlbGV0ZSgpCisKKyAgICAgICAgICAgIGZvciByIGluIHRvX2luc3RhbGw6CisgICAg
ICAgICAgICAgICAgaWYgZHJ5X3J1bjoKKyAgICAgICAgICAgICAgICAgICAgcHJpbnQgImluc3Rh
bGwgJXMiICUgcgorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIHIu
aW5zdGFsbChzZWxmLl9sYXlvdXRfdGVzdHNfZGlyKQpkaWZmIC0tZ2l0IGEvV2ViS2l0VG9vbHMv
U2NyaXB0cy93ZWJraXRweS90b29sL2NvbW1hbmRzL3JlYmFzZWxpbmUyL3JlYmFzZWxpbmVyX3Vu
aXR0ZXN0LnB5IGIvV2ViS2l0VG9vbHMvU2NyaXB0cy93ZWJraXRweS90b29sL2NvbW1hbmRzL3Jl
YmFzZWxpbmUyL3JlYmFzZWxpbmVyX3VuaXR0ZXN0LnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0Cmlu
ZGV4IDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAuLjAxMWVhMmJjY2Ni
Zjk3MjZhODE5ZWVmZDRhMjY2YmE4ODE0MmQxYjAKLS0tIC9kZXYvbnVsbAorKysgYi9XZWJLaXRU
b29scy9TY3JpcHRzL3dlYmtpdHB5L3Rvb2wvY29tbWFuZHMvcmViYXNlbGluZTIvcmViYXNlbGlu
ZXJfdW5pdHRlc3QucHkKQEAgLTAsMCArMSw3NyBAQAorIyEvdXNyL2Jpbi9lbnYgcHl0aG9uCisj
IENvcHlyaWdodCAoQykgMjAxMCBHb29nbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorIwor
IyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRo
IG9yIHdpdGhvdXQKKyMgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQg
dGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisjIGFyZSBtZXQ6CisjCisjIDEuICBSZWRpc3RyaWJ1
dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorIyAg
ICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNj
bGFpbWVyLgorIyAyLiAgUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9k
dWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyMgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRp
dGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyMgICAgIGRvY3VtZW50
YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRp
b24uCisjCisjIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgQU5EIElUUyBDT05U
UklCVVRPUlMgIkFTIElTIiBBTkQgQU5ZCisjIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVT
LCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQKKyMgV0FSUkFOVElF
UyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NF
IEFSRQorIyBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBPUiBJVFMgQ09OVFJJ
QlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZCisjIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUws
IFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCisjIChJTkNMVURJ
TkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBP
UiBTRVJWSUNFUzsKKyMgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNT
IElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECisjIE9OIEFOWSBUSEVPUlkgT0YgTElB
QklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisj
IChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBP
VVQgT0YgVEhFIFVTRSBPRgorIyBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhF
IFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCitpbXBvcnQgdW5pdHRlc3QKK2Zyb20gd2Vi
a2l0cHkuY29tbW9uLm5ldC5yZXN1bHRzZXQgaW1wb3J0IFJlc3VsdFNldAorZnJvbSB3ZWJraXRw
eS5jb21tb24ubmV0LnJlc3VsdHNldF91bml0dGVzdCBpbXBvcnQgRmFrZVppcAorZnJvbSByZWJh
c2VsaW5lciBpbXBvcnQgUmViYXNlbGluZXIKKworCitjbGFzcyBSZWJhc2VsaW5lclRlc3QodW5p
dHRlc3QuVGVzdENhc2UpOgorICAgIGRlZiBhc3NlcnRIYXNJbnN0YWxsc0ZvcihzZWxmLCBwbGF0
Zm9ybXMsIHJlYmFzZWxpbmVyKToKKyAgICAgICAgaW5zdGFsbF9wbGF0Zm9ybXMgPSBzZXQobWFw
KGxhbWJkYSByOiByLnBsYXRmb3JtKCksIHJlYmFzZWxpbmVyLmluc3RhbGxzKCkpKQorICAgICAg
ICBwbGF0Zm9ybXMgPSBzZXQocGxhdGZvcm1zKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhw
bGF0Zm9ybXMsIGluc3RhbGxfcGxhdGZvcm1zKQorCisgICAgZGVmIGFzc2VydEhhc0RlbGV0ZXNG
b3Ioc2VsZiwgcGxhdGZvcm1zLCByZWJhc2VsaW5lcik6CisgICAgICAgIGluc3RhbGxfcGxhdGZv
cm1zID0gc2V0KG1hcChsYW1iZGEgcjogci5wbGF0Zm9ybSgpLCByZWJhc2VsaW5lci5kZWxldGVz
KCkpKQorICAgICAgICBwbGF0Zm9ybXMgPSBzZXQocGxhdGZvcm1zKQorICAgICAgICBzZWxmLmFz
c2VydEVxdWFscyhwbGF0Zm9ybXMsIGluc3RhbGxfcGxhdGZvcm1zKQorCisgICAgZGVmIHRlc3Rf
bGluZXMoc2VsZik6CisgICAgICAgIG1hY196aXAgPSBGYWtlWmlwKCkKKyAgICAgICAgbWFjX3pp
cC5pbnNlcnQoJ3NvbWUtdGVzdC1leHBlY3RlZC50eHQnLCAnbWFjJykKKworICAgICAgICBtYWNf
bGVvcGFyZF96aXAgPSBGYWtlWmlwKCkKKyAgICAgICAgbWFjX2xlb3BhcmRfemlwLmluc2VydCgn
c29tZS10ZXN0LWV4cGVjdGVkLnR4dCcsICdtYWMnKQorCisgICAgICAgIG90aGVyX3ppcCA9IEZh
a2VaaXAoKQorICAgICAgICBvdGhlcl96aXAuaW5zZXJ0KCdzb21lLXRlc3QtZXhwZWN0ZWQudHh0
JywgJ290aGVyJykKKworICAgICAgICBvdGhlcjJfemlwID0gRmFrZVppcCgpCisgICAgICAgIG90
aGVyMl96aXAuaW5zZXJ0KCdzb21lLXRlc3QtZXhwZWN0ZWQudHh0JywgJ290aGVyMicpCisKKyAg
ICAgICAgbG9jYWxfemlwID0gRmFrZVppcCgpCisgICAgICAgIGxvY2FsX3ppcC5pbnNlcnQoJ3Nv
bWUtdGVzdC1leHBlY3RlZC50eHQnLCAnbG9jYWwnKQorCisgICAgICAgIHppcF9tYXAgPSB7fQor
ICAgICAgICB6aXBfbWFwWydtYWMnXSA9IG1hY196aXAKKyAgICAgICAgemlwX21hcFsnbWFjLWxl
b3BhcmQnXSA9IG1hY19sZW9wYXJkX3ppcAorICAgICAgICB6aXBfbWFwWydvdGhlciddID0gb3Ro
ZXJfemlwCisgICAgICAgIHppcF9tYXBbJ290aGVyMiddID0gb3RoZXIyX3ppcAorCisgICAgICAg
IHJlbW90ZV9yZXN1bHRzID0gUmVzdWx0U2V0LmZyb21femlwX21hcCh6aXBfbWFwKQorICAgICAg
ICBsb2NhbF9yZXN1bHRzID0gUmVzdWx0U2V0LmZyb21femlwKE5vbmUsIGxvY2FsX3ppcCkKKwor
ICAgICAgICBsaW5lcyA9IFtdCisgICAgICAgIGxpbmVzLmFwcGVuZChbJ21hYy1sZW9wYXJkJywg
J21hYycsIE5vbmVdKQorICAgICAgICBsaW5lcy5hcHBlbmQoWydvdGhlcicsICdtYWMnLCAnb3Ro
ZXIyJywgTm9uZV0pCisgICAgICAgIHIgPSBSZWJhc2VsaW5lcihbJ3NvbWUtdGVzdCddLCBsb2Nh
bF9yZXN1bHRzLCByZW1vdGVfcmVzdWx0cywgbGluZXMsICdMYXlvdXRUZXN0cycsIHZlcmJvc2U9
RmFsc2UpCisKKyAgICAgICAgc2VsZi5hc3NlcnRIYXNJbnN0YWxsc0ZvcihbJ21hYycsICdvdGhl
cicsICdvdGhlcjInXSwgcikKKyAgICAgICAgc2VsZi5hc3NlcnRIYXNEZWxldGVzRm9yKFtdLCBy
KQorCisKK2lmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CisgICAgdW5pdHRlc3QubWFpbigpCg==
</data>
<flag name="review"
          id="66997"
          type_id="1"
          status="-"
          setter="eric"
    />
          </attachment>
      

    </bug>

</bugzilla>