<?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>37388</bug_id>
          
          <creation_ts>2010-04-10 09:04:21 -0700</creation_ts>
          <short_desc>Factor WebKitPort out of MacPort to allow for WinPort</short_desc>
          <delta_ts>2010-04-10 15:19:09 -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>FIXED</resolution>
          
          
          <bug_file_loc></bug_file_loc>
          <status_whiteboard></status_whiteboard>
          <keywords></keywords>
          <priority>P2</priority>
          <bug_severity>Normal</bug_severity>
          <target_milestone>---</target_milestone>
          <dependson>37387</dependson>
          
          <everconfirmed>1</everconfirmed>
          <reporter name="Adam Barth">abarth</reporter>
          <assigned_to name="Nobody">webkit-unassigned</assigned_to>
          <cc>cjerdonek</cc>
    
    <cc>dpranke</cc>
    
    <cc>eric</cc>
    
    <cc>ojan</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>211152</commentid>
    <comment_count>0</comment_count>
    <who name="Adam Barth">abarth</who>
    <bug_when>2010-04-10 09:04:21 -0700</bug_when>
    <thetext>Factor WebKitPort out of MacPort to allow for WinPort</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>211153</commentid>
    <comment_count>1</comment_count>
      <attachid>53042</attachid>
    <who name="Adam Barth">abarth</who>
    <bug_when>2010-04-10 09:05:17 -0700</bug_when>
    <thetext>Created attachment 53042
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>211167</commentid>
    <comment_count>2</comment_count>
      <attachid>53042</attachid>
    <who name="Dirk Pranke">dpranke</who>
    <bug_when>2010-04-10 11:25:24 -0700</bug_when>
    <thetext>Comment on attachment 53042
Patch

&gt;  
&gt; diff --git a/WebKitTools/Scripts/webkitpy/layout_tests/port/apache_http_server.py b/WebKitTools/Scripts/webkitpy/layout_tests/port/apache_http_server.py
&gt; index 3cf0f5b..45dce8c 100644
&gt; --- a/WebKitTools/Scripts/webkitpy/layout_tests/port/apache_http_server.py
&gt; +++ b/WebKitTools/Scripts/webkitpy/layout_tests/port/apache_http_server.py
&gt; @@ -79,6 +79,7 @@ class LayoutTestApacheHttpd(http_server_base.HttpServerBase):
&gt;          error_log = self._cygwin_safe_join(output_dir, &quot;error_log.txt&quot;)
&gt;          document_root = self._cygwin_safe_join(test_dir, &quot;http&quot;, &quot;tests&quot;)
&gt;  
&gt; +        # FIXME: We shouldn&apos;t be calling a protected method of _port_obj!
&gt;          executable = self._port_obj._path_to_apache()

I&apos;m not terribly troubled by this. I consider these routines to have package-level scope, so that callers shouldn&apos;t call them but other members of the package can. Unfortunately Python doesn&apos;t give us a good way to indicate this. We can make them public and document them correctly if necessary.

&gt; +    # FIXME: This doesn&apos;t have anything to do with WebKit.
&gt;      def _kill_process(self, pid):
&gt;          &quot;&quot;&quot;Forcefully kill the process.
&gt;          os.kill(pid, signal.SIGKILL)
&gt;  
&gt; +    # FIXME: This doesn&apos;t have anything to do with WebKit.
&gt;      def _kill_all_process(self, process_name):
&gt;          # On Mac OS X 10.6, killall has a new constraint: -SIGNALNAME or
&gt;          # -SIGNALNUMBER must come first.  Example problem:

For routines like this, it&apos;s true that these are platform-specific routines that aren&apos;t strictly tied to a WebKit implementation, but we need to be careful to ensure that &quot;generic&quot; code (like run_webkit_tests and the layout_package code) do not call the platform-specific equivalents directly.  The original design intent (hopefully still preserved, although I may have bungled things at some point and allowed exceptions to creep in) allows for implementations like the &quot;test&quot; port that don&apos;t ever start or stop processes. More realistic examples would be something like an iPhone or Android implementation where the actual testing is done on an embedded device and no direct process controlling is done by the upper layers (everything needs to be mediated through the Port abstractions).

That said, it&apos;s true that these routines are here because the interface mixes &quot;port-specific&quot; and &quot;platform-specific&quot; logic, and while code like http_server.py still needs some platform abstraction to call. Maybe Executive or some other class is a better fit for this?

Otherwise, this looks like about right (although I am not a reviewer).</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>211171</commentid>
    <comment_count>3</comment_count>
    <who name="Adam Barth">abarth</who>
    <bug_when>2010-04-10 12:38:00 -0700</bug_when>
    <thetext>&gt; I&apos;m not terribly troubled by this. I consider these routines to have
&gt; package-level scope, so that callers shouldn&apos;t call them but other members of
&gt; the package can.

Python has a notion of public and non-public:

[[
      Use one leading underscore only for non-public methods and instance
      variables.
]]

Technically, each file is its own package, so these are inter-package uses.

&gt; Unfortunately Python doesn&apos;t give us a good way to indicate
&gt; this. We can make them public and document them correctly if necessary.

I think its simpler just to use non-underscored names.  The main point of the underscores is to limit the amount of other code you need to think about when reasoning about them.

&gt; &gt; +    # FIXME: This doesn&apos;t have anything to do with WebKit.
&gt; &gt;      def _kill_process(self, pid):
&gt; &gt;          &quot;&quot;&quot;Forcefully kill the process.
&gt; &gt;          os.kill(pid, signal.SIGKILL)
&gt; &gt;  
&gt; &gt; +    # FIXME: This doesn&apos;t have anything to do with WebKit.
&gt; &gt;      def _kill_all_process(self, process_name):
&gt; &gt;          # On Mac OS X 10.6, killall has a new constraint: -SIGNALNAME or
&gt; &gt;          # -SIGNALNUMBER must come first.  Example problem:
&gt; 
&gt; For routines like this, it&apos;s true that these are platform-specific routines
&gt; that aren&apos;t strictly tied to a WebKit implementation, but we need to be careful
&gt; to ensure that &quot;generic&quot; code (like run_webkit_tests and the layout_package
&gt; code) do not call the platform-specific equivalents directly.  The original
&gt; design intent (hopefully still preserved, although I may have bungled things at
&gt; some point and allowed exceptions to creep in) allows for implementations like
&gt; the &quot;test&quot; port that don&apos;t ever start or stop processes.

Yes, that&apos;s a good goal.  In fact, that&apos;s exactly the problem that Executive is intended to solve.  The main idea is that you don&apos;t want to interact with process creation / destruction using statics, e.g.:

+         self._process = subprocess.Popen(start_cmd,

because executing that line of code always creates a process.  Instead, you want to indirect through a non-static:

+         self._process = self._executive.make_me_a_process(...)

During testing, you can replaces self._executive with a mock object that doesn&apos;t actually create a process.  We seem to have a mock port object already, but that doesn&apos;t mean we need to hang all of our mocks off of Port.

In any case, the current containment of subprocess is incomplete because lots of code calls subprocess.Popen (or an equivalent) directly.  If we want to be able to test the code without creating processes, then we&apos;ll want to direct all those instances through a non-static that can be replaced with a mock.

At a higher level, the code (as written) puts kill_process on the Port object but not create_process.  The reason for that appears to be that Python has a nice cross-platform API for create_process but not a great API for kill_process.  That&apos;s somehow an implementation detail of the Python library and shouldn&apos;t really be driving the architecture of our code.

&gt; More realistic
&gt; examples would be something like an iPhone or Android implementation where the
&gt; actual testing is done on an embedded device and no direct process controlling
&gt; is done by the upper layers (everything needs to be mediated through the Port
&gt; abstractions).

Well, it needs to be mediated by some abstraction.  It&apos;s unclear why port should be the end-all, be-all abstraction.  There&apos;s already a many-to-many relationship between ports and platforms (e.g., Chromium, Qt, and Gtk all run on Linux, but Apple, Chromium, and Qt also run on Mac).  If we take the current approach, we&apos;ll have to copy/paste all the Linux and Mac specific bits into all the port classes, which doesn&apos;t really scale.  Instead, we need some kind of architecture that can represent a many-to-many relationship.  We can do it with inheritance, but it will be messy because it require multiple inheritance.   It&apos;s much easier to do it with composition, which is what I&apos;m trying to get at with these FIXMEs.

&gt; That said, it&apos;s true that these routines are here because the interface mixes
&gt; &quot;port-specific&quot; and &quot;platform-specific&quot; logic, and while code like
&gt; http_server.py still needs some platform abstraction to call. Maybe Executive
&gt; or some other class is a better fit for this?

Executive is an abstraction for interacting with processes.  We&apos;ve mostly used it for process creation, but it should also handle process destruction.  Other system-specific bits should probably be represent by other abstractions.

&gt; Otherwise, this looks like about right (although I am not a reviewer).

Thanks for the review.  I&apos;m glad that we&apos;re getting this opportunity to cross-pollinate ideas.  Hopefully we can make webkitpy into a more cohesive package instead of two or three independent silos.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>211178</commentid>
    <comment_count>4</comment_count>
      <attachid>53042</attachid>
    <who name="Eric Seidel (no email)">eric</who>
    <bug_when>2010-04-10 14:08:50 -0700</bug_when>
    <thetext>Comment on attachment 53042
Patch

Yay!  Here comes Windows/Qt/Gtk support. :)

Still more lovin needed, but this is a great start.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>211196</commentid>
    <comment_count>5</comment_count>
      <attachid>53042</attachid>
    <who name="Adam Barth">abarth</who>
    <bug_when>2010-04-10 15:19:00 -0700</bug_when>
    <thetext>Comment on attachment 53042
Patch

Clearing flags on attachment: 53042

Committed r57423: &lt;http://trac.webkit.org/changeset/57423&gt;</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>211197</commentid>
    <comment_count>6</comment_count>
    <who name="Adam Barth">abarth</who>
    <bug_when>2010-04-10 15:19:09 -0700</bug_when>
    <thetext>All reviewed patches have been landed.  Closing bug.</thetext>
  </long_desc>
      
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>53042</attachid>
            <date>2010-04-10 09:05:17 -0700</date>
            <delta_ts>2010-04-10 15:19:00 -0700</delta_ts>
            <desc>Patch</desc>
            <filename>bug-37388-20100410090516.patch</filename>
            <type>text/plain</type>
            <size>37377</size>
            <attacher name="Adam Barth">abarth</attacher>
            
              <data encoding="base64">ZGlmZiAtLWdpdCBhL1dlYktpdFRvb2xzL0NoYW5nZUxvZyBiL1dlYktpdFRvb2xzL0NoYW5nZUxv
ZwppbmRleCA5ZjhmOWIwLi4zNjJmMDM4IDEwMDY0NAotLS0gYS9XZWJLaXRUb29scy9DaGFuZ2VM
b2cKKysrIGIvV2ViS2l0VG9vbHMvQ2hhbmdlTG9nCkBAIC0yLDYgKzIsMjEgQEAKIAogICAgICAg
ICBSZXZpZXdlZCBieSBOT0JPRFkgKE9PUFMhKS4KIAorICAgICAgICBGYWN0b3IgV2ViS2l0UG9y
dCBvdXQgb2YgTWFjUG9ydCB0byBhbGxvdyBmb3IgV2luUG9ydAorICAgICAgICBodHRwczovL2J1
Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MzczODgKKworICAgICAgICBUaGUgc3BsaXQg
aXMgYSBiaXQgb2YgYSBndWVzcy4gIFdlIG1pZ2h0IGhhdmUgdG8gYWRqdXN0IHRoaW5ncyBvbmNl
IHdlCisgICAgICAgIGFjdHVhbGx5IGhhdmUgYSBzZWNvbmQgcG9ydCB0byB3b3JrIHdpdGguCisK
KyAgICAgICAgKiBTY3JpcHRzL3dlYmtpdHB5L2xheW91dF90ZXN0cy9wb3J0L2FwYWNoZV9odHRw
X3NlcnZlci5weToKKyAgICAgICAgKiBTY3JpcHRzL3dlYmtpdHB5L2xheW91dF90ZXN0cy9wb3J0
L21hYy5weToKKyAgICAgICAgKiBTY3JpcHRzL3dlYmtpdHB5L2xheW91dF90ZXN0cy9wb3J0L3dl
YmtpdC5weTogQWRkZWQuCisgICAgICAgICogU2NyaXB0cy93ZWJraXRweS9sYXlvdXRfdGVzdHMv
cG9ydC93ZWJzb2NrZXRfc2VydmVyLnB5OgorCisyMDEwLTA0LTEwICBBZGFtIEJhcnRoICA8YWJh
cnRoQHdlYmtpdC5vcmc+CisKKyAgICAgICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChPT1BTISkuCisK
ICAgICAgICAgcnVuX3dlYmtpdF90ZXN0cy5weSBzaG91bGRuJ3QgaGF2ZSBwbGF0Zm9ybS1zcGVj
aWZpYyBsb2dpYwogICAgICAgICBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/
aWQ9MzczODcKIApkaWZmIC0tZ2l0IGEvV2ViS2l0VG9vbHMvU2NyaXB0cy93ZWJraXRweS9sYXlv
dXRfdGVzdHMvcG9ydC9hcGFjaGVfaHR0cF9zZXJ2ZXIucHkgYi9XZWJLaXRUb29scy9TY3JpcHRz
L3dlYmtpdHB5L2xheW91dF90ZXN0cy9wb3J0L2FwYWNoZV9odHRwX3NlcnZlci5weQppbmRleCAz
Y2YwZjViLi40NWRjZThjIDEwMDY0NAotLS0gYS9XZWJLaXRUb29scy9TY3JpcHRzL3dlYmtpdHB5
L2xheW91dF90ZXN0cy9wb3J0L2FwYWNoZV9odHRwX3NlcnZlci5weQorKysgYi9XZWJLaXRUb29s
cy9TY3JpcHRzL3dlYmtpdHB5L2xheW91dF90ZXN0cy9wb3J0L2FwYWNoZV9odHRwX3NlcnZlci5w
eQpAQCAtNzksNiArNzksNyBAQCBjbGFzcyBMYXlvdXRUZXN0QXBhY2hlSHR0cGQoaHR0cF9zZXJ2
ZXJfYmFzZS5IdHRwU2VydmVyQmFzZSk6CiAgICAgICAgIGVycm9yX2xvZyA9IHNlbGYuX2N5Z3dp
bl9zYWZlX2pvaW4ob3V0cHV0X2RpciwgImVycm9yX2xvZy50eHQiKQogICAgICAgICBkb2N1bWVu
dF9yb290ID0gc2VsZi5fY3lnd2luX3NhZmVfam9pbih0ZXN0X2RpciwgImh0dHAiLCAidGVzdHMi
KQogCisgICAgICAgICMgRklYTUU6IFdlIHNob3VsZG4ndCBiZSBjYWxsaW5nIGEgcHJvdGVjdGVk
IG1ldGhvZCBvZiBfcG9ydF9vYmohCiAgICAgICAgIGV4ZWN1dGFibGUgPSBzZWxmLl9wb3J0X29i
ai5fcGF0aF90b19hcGFjaGUoKQogICAgICAgICBpZiBzZWxmLl9pc19jeWd3aW4oKToKICAgICAg
ICAgICAgIGV4ZWN1dGFibGUgPSBzZWxmLl9nZXRfY3lnd2luX3BhdGgoZXhlY3V0YWJsZSkKQEAg
LTIxNyw0ICsyMTgsNSBAQCBjbGFzcyBMYXlvdXRUZXN0QXBhY2hlSHR0cGQoaHR0cF9zZXJ2ZXJf
YmFzZS5IdHRwU2VydmVyQmFzZSk6CiAgICAgICAgIGh0dHBkX3BpZCA9IE5vbmUKICAgICAgICAg
aWYgb3MucGF0aC5leGlzdHMoc2VsZi5fcGlkX2ZpbGUpOgogICAgICAgICAgICAgaHR0cGRfcGlk
ID0gaW50KG9wZW4oc2VsZi5fcGlkX2ZpbGUpLnJlYWRsaW5lKCkpCisgICAgICAgICMgRklYTUU6
IFdlIHNob3VsZG4ndCBiZSBjYWxsaW5nIGEgcHJvdGVjdGVkIG1ldGhvZCBvZiBfcG9ydF9vYmoh
CiAgICAgICAgIHNlbGYuX3BvcnRfb2JqLl9zaHV0X2Rvd25faHR0cF9zZXJ2ZXIoaHR0cGRfcGlk
KQpkaWZmIC0tZ2l0IGEvV2ViS2l0VG9vbHMvU2NyaXB0cy93ZWJraXRweS9sYXlvdXRfdGVzdHMv
cG9ydC9tYWMucHkgYi9XZWJLaXRUb29scy9TY3JpcHRzL3dlYmtpdHB5L2xheW91dF90ZXN0cy9w
b3J0L21hYy5weQppbmRleCBkMWNjZDU5Li40ZWY1NjBlIDEwMDY0NAotLS0gYS9XZWJLaXRUb29s
cy9TY3JpcHRzL3dlYmtpdHB5L2xheW91dF90ZXN0cy9wb3J0L21hYy5weQorKysgYi9XZWJLaXRU
b29scy9TY3JpcHRzL3dlYmtpdHB5L2xheW91dF90ZXN0cy9wb3J0L21hYy5weQpAQCAtNDEsNDIg
KzQxLDMwIEBAIGltcG9ydCBzeXMKIGltcG9ydCB0aW1lCiBpbXBvcnQgd2ViYnJvd3NlcgogCi1p
bXBvcnQgYmFzZQotaW1wb3J0IHNlcnZlcl9wcm9jZXNzCi0KLWltcG9ydCB3ZWJraXRweQogaW1w
b3J0IHdlYmtpdHB5LmNvbW1vbi5zeXN0ZW0ub3NwYXRoIGFzIG9zcGF0aAoraW1wb3J0IHdlYmtp
dHB5LmxheW91dF90ZXN0cy5wb3J0LnNlcnZlcl9wcm9jZXNzIGFzIHNlcnZlcl9wcm9jZXNzCitm
cm9tIHdlYmtpdHB5LmxheW91dF90ZXN0cy5wb3J0LndlYmtpdCBpbXBvcnQgV2ViS2l0UG9ydCwg
V2ViS2l0RHJpdmVyCiAKIF9sb2cgPSBsb2dnaW5nLmdldExvZ2dlcigid2Via2l0cHkubGF5b3V0
X3Rlc3RzLnBvcnQubWFjIikKIAogCi1jbGFzcyBNYWNQb3J0KGJhc2UuUG9ydCk6CitjbGFzcyBN
YWNQb3J0KFdlYktpdFBvcnQpOgogICAgICIiIldlYktpdCBNYWMgaW1wbGVtZW50YXRpb24gb2Yg
dGhlIFBvcnQgY2xhc3MuIiIiCiAKICAgICBkZWYgX19pbml0X18oc2VsZiwgcG9ydF9uYW1lPU5v
bmUsIG9wdGlvbnM9Tm9uZSk6CiAgICAgICAgIGlmIHBvcnRfbmFtZSBpcyBOb25lOgogICAgICAg
ICAgICAgcG9ydF9uYW1lID0gJ21hYycgKyBzZWxmLnZlcnNpb24oKQotICAgICAgICBiYXNlLlBv
cnQuX19pbml0X18oc2VsZiwgcG9ydF9uYW1lLCBvcHRpb25zKQotICAgICAgICBzZWxmLl9jYWNo
ZWRfYnVpbGRfcm9vdCA9IE5vbmUKLQotICAgICAgICAjIEZJWE1FOiBkaXNhYmxlIHBpeGVsIHRl
c3RzIHVudGlsIHRoZXkgYXJlIHJ1biBieSBkZWZhdWx0IG9uIHRoZQotICAgICAgICAjIGJ1aWxk
IG1hY2hpbmVzLgotICAgICAgICBpZiBvcHRpb25zIGFuZCAobm90IGhhc2F0dHIob3B0aW9ucywg
InBpeGVsX3Rlc3RzIikgb3IKLSAgICAgICAgICAgb3B0aW9ucy5waXhlbF90ZXN0cyBpcyBOb25l
KToKLSAgICAgICAgICAgIG9wdGlvbnMucGl4ZWxfdGVzdHMgPSBGYWxzZQorICAgICAgICBXZWJL
aXRQb3J0Ll9faW5pdF9fKHNlbGYsIHBvcnRfbmFtZSwgb3B0aW9ucykKIAogICAgIGRlZiBkZWZh
dWx0X251bV9kdW1wX3JlbmRlcl90cmVlcyhzZWxmKToKICAgICAgICAgIyBGSVhNRTogbmV3LXJ1
bi13ZWJraXQtdGVzdHMgaXMgdW5zdGFibGUgb24gTWFjIHJ1bm5pbmcgbW9yZSB0aGFuCiAgICAg
ICAgICMgZm91ciB0aHJlYWRzIGluIHBhcmFsbGVsLgogICAgICAgICAjIFNlZSBodHRwczovL2J1
Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MzY2MjIKLSAgICAgICAgbnVtX2R1bXBfcmVu
ZGVyX3RyZWVzID0gYmFzZS5Qb3J0LmRlZmF1bHRfbnVtX2R1bXBfcmVuZGVyX3RyZWVzKHNlbGYp
CisgICAgICAgIG51bV9kdW1wX3JlbmRlcl90cmVlcyA9IFdlYktpdFBvcnQuZGVmYXVsdF9udW1f
ZHVtcF9yZW5kZXJfdHJlZXMoc2VsZikKICAgICAgICAgaWYgbnVtX2R1bXBfcmVuZGVyX3RyZWVz
ID4gNDoKICAgICAgICAgICAgIHJldHVybiA0CiAgICAgICAgIHJldHVybiBudW1fZHVtcF9yZW5k
ZXJfdHJlZXMKIAotICAgIGRlZiBiYXNlbGluZV9wYXRoKHNlbGYpOgotICAgICAgICByZXR1cm4g
c2VsZi5fd2Via2l0X2Jhc2VsaW5lX3BhdGgoc2VsZi5fbmFtZSkKLQogICAgIGRlZiBiYXNlbGlu
ZV9zZWFyY2hfcGF0aChzZWxmKToKICAgICAgICAgZGlycyA9IFtdCiAgICAgICAgIGlmIHNlbGYu
X25hbWUgPT0gJ21hYy10aWdlcic6CkBAIC04OCwxMjMgKzc2LDEwIEBAIGNsYXNzIE1hY1BvcnQo
YmFzZS5Qb3J0KToKICAgICAgICAgZGlycy5hcHBlbmQoc2VsZi5fd2Via2l0X2Jhc2VsaW5lX3Bh
dGgoJ21hYycpKQogICAgICAgICByZXR1cm4gZGlycwogCi0gICAgZGVmIGNoZWNrX2J1aWxkKHNl
bGYsIG5lZWRzX2h0dHApOgotICAgICAgICBidWlsZF9kcnRfY29tbWFuZCA9IFsKLSAgICAgICAg
ICAgIHNlbGYuc2NyaXB0X3BhdGgoImJ1aWxkLWR1bXByZW5kZXJ0cmVlIiksCi0gICAgICAgICAg
ICBzZWxmLmZsYWdfZnJvbV9jb25maWd1cmF0aW9uKHNlbGYuX29wdGlvbnMuY29uZmlndXJhdGlv
biksCi0gICAgICAgIF0KLSAgICAgICAgaWYgc2VsZi5fZXhlY3V0aXZlLnJ1bl9jb21tYW5kKGJ1
aWxkX2RydF9jb21tYW5kLCByZXR1cm5fZXhpdF9jb2RlPVRydWUpOgotICAgICAgICAgICAgcmV0
dXJuIEZhbHNlCi0KLSAgICAgICAgaWYgbm90IHNlbGYuY2hlY2tfaW1hZ2VfZGlmZigpOgotICAg
ICAgICAgICAgcmV0dXJuIEZhbHNlCi0KLSAgICAgICAgZHJpdmVyX3BhdGggPSBzZWxmLl9wYXRo
X3RvX2RyaXZlcigpCi0gICAgICAgIGlmIG5vdCBvcy5wYXRoLmV4aXN0cyhkcml2ZXJfcGF0aCk6
Ci0gICAgICAgICAgICBfbG9nLmVycm9yKCJEdW1wUmVuZGVyVHJlZSB3YXMgbm90IGZvdW5kIGF0
ICVzIiAlIGRyaXZlcl9wYXRoKQotICAgICAgICAgICAgcmV0dXJuIEZhbHNlCi0KLSAgICAgICAg
amF2YV90ZXN0c19wYXRoID0gb3MucGF0aC5qb2luKHNlbGYubGF5b3V0X3Rlc3RzX2RpcigpLCAi
amF2YSIpCi0gICAgICAgIGJ1aWxkX2phdmEgPSBbIi91c3IvYmluL21ha2UiLCAiLUMiLCBqYXZh
X3Rlc3RzX3BhdGhdCi0gICAgICAgIGlmIHNlbGYuX2V4ZWN1dGl2ZS5ydW5fY29tbWFuZChidWls
ZF9qYXZhLCByZXR1cm5fZXhpdF9jb2RlPVRydWUpOgotICAgICAgICAgICAgX2xvZy5lcnJvcigi
RmFpbGVkIHRvIGJ1aWxkIEphdmEgc3VwcG9ydCBmaWxlczogJXMiICUgYnVpbGRfamF2YSkKLSAg
ICAgICAgICAgIHJldHVybiBGYWxzZQotCi0gICAgICAgIHJldHVybiBUcnVlCi0KLSAgICBkZWYg
Y2hlY2tfaW1hZ2VfZGlmZihzZWxmLCBvdmVycmlkZV9zdGVwPU5vbmUsIGxvZ2dpbmc9VHJ1ZSk6
Ci0gICAgICAgIGltYWdlX2RpZmZfcGF0aCA9IHNlbGYuX3BhdGhfdG9faW1hZ2VfZGlmZigpCi0g
ICAgICAgIGlmIG5vdCBvcy5wYXRoLmV4aXN0cyhpbWFnZV9kaWZmX3BhdGgpOgotICAgICAgICAg
ICAgX2xvZy5lcnJvcigiSW1hZ2VEaWZmIHdhcyBub3QgZm91bmQgYXQgJXMiICUgaW1hZ2VfZGlm
Zl9wYXRoKQotICAgICAgICAgICAgcmV0dXJuIEZhbHNlCi0gICAgICAgIHJldHVybiBUcnVlCi0K
LSAgICBkZWYgZGlmZl9pbWFnZShzZWxmLCBleHBlY3RlZF9maWxlbmFtZSwgYWN0dWFsX2ZpbGVu
YW1lLAotICAgICAgICAgICAgICAgICAgIGRpZmZfZmlsZW5hbWU9Tm9uZSk6Ci0gICAgICAgICIi
IlJldHVybiBUcnVlIGlmIHRoZSB0d28gZmlsZXMgYXJlIGRpZmZlcmVudC4gQWxzbyB3cml0ZSBh
IGRlbHRhCi0gICAgICAgIGltYWdlIG9mIHRoZSB0d28gaW1hZ2VzIGludG8gfGRpZmZfZmlsZW5h
bWV8IGlmIGl0IGlzIG5vdCBOb25lLiIiIgotCi0gICAgICAgICMgSGFuZGxlIHRoZSBjYXNlIHdo
ZXJlIHRoZSB0ZXN0IGRpZG4ndCBhY3R1YWxseSBnZW5lcmF0ZSBhbiBpbWFnZS4KLSAgICAgICAg
YWN0dWFsX2xlbmd0aCA9IG9zLnN0YXQoYWN0dWFsX2ZpbGVuYW1lKS5zdF9zaXplCi0gICAgICAg
IGlmIGFjdHVhbF9sZW5ndGggPT0gMDoKLSAgICAgICAgICAgIGlmIGRpZmZfZmlsZW5hbWU6Ci0g
ICAgICAgICAgICAgICAgc2h1dGlsLmNvcHlmaWxlKGFjdHVhbF9maWxlbmFtZSwgZXhwZWN0ZWRf
ZmlsZW5hbWUpCi0gICAgICAgICAgICByZXR1cm4gVHJ1ZQotCi0gICAgICAgIHNwID0gc2VsZi5f
ZGlmZl9pbWFnZV9yZXF1ZXN0KGV4cGVjdGVkX2ZpbGVuYW1lLCBhY3R1YWxfZmlsZW5hbWUpCi0g
ICAgICAgIHJldHVybiBzZWxmLl9kaWZmX2ltYWdlX3JlcGx5KHNwLCBleHBlY3RlZF9maWxlbmFt
ZSwgZGlmZl9maWxlbmFtZSkKLQotICAgIGRlZiBfZGlmZl9pbWFnZV9yZXF1ZXN0KHNlbGYsIGV4
cGVjdGVkX2ZpbGVuYW1lLCBhY3R1YWxfZmlsZW5hbWUpOgotICAgICAgICAjIEZJWE1FOiBlaXRo
ZXIgZXhwb3NlIHRoZSB0b2xlcmFuY2UgYXJndW1lbnQgYXMgYSBjb21tYW5kLWxpbmUKLSAgICAg
ICAgIyBwYXJhbWV0ZXIsIG9yIG1ha2UgaXQgZ28gYXdheSBhbmQgYXdheXMgdXNlIGV4YWN0IG1h
dGNoZXMuCi0gICAgICAgIGNtZCA9IFtzZWxmLl9wYXRoX3RvX2ltYWdlX2RpZmYoKSwgJy0tdG9s
ZXJhbmNlJywgJzAuMSddCi0gICAgICAgIHNwID0gc2VydmVyX3Byb2Nlc3MuU2VydmVyUHJvY2Vz
cyhzZWxmLCAnSW1hZ2VEaWZmJywgY21kKQotCi0gICAgICAgIGFjdHVhbF9sZW5ndGggPSBvcy5z
dGF0KGFjdHVhbF9maWxlbmFtZSkuc3Rfc2l6ZQotICAgICAgICBhY3R1YWxfZmlsZSA9IG9wZW4o
YWN0dWFsX2ZpbGVuYW1lKS5yZWFkKCkKLSAgICAgICAgZXhwZWN0ZWRfbGVuZ3RoID0gb3Muc3Rh
dChleHBlY3RlZF9maWxlbmFtZSkuc3Rfc2l6ZQotICAgICAgICBleHBlY3RlZF9maWxlID0gb3Bl
bihleHBlY3RlZF9maWxlbmFtZSkucmVhZCgpCi0gICAgICAgIHNwLndyaXRlKCdDb250ZW50LUxl
bmd0aDogJWRcbiVzQ29udGVudC1MZW5ndGg6ICVkXG4lcycgJQotICAgICAgICAgICAgICAgICAo
YWN0dWFsX2xlbmd0aCwgYWN0dWFsX2ZpbGUsIGV4cGVjdGVkX2xlbmd0aCwgZXhwZWN0ZWRfZmls
ZSkpCi0KLSAgICAgICAgcmV0dXJuIHNwCi0KLSAgICBkZWYgX2RpZmZfaW1hZ2VfcmVwbHkoc2Vs
Ziwgc3AsIGV4cGVjdGVkX2ZpbGVuYW1lLCBkaWZmX2ZpbGVuYW1lKToKLSAgICAgICAgdGltZW91
dCA9IDIuMAotICAgICAgICBkZWFkbGluZSA9IHRpbWUudGltZSgpICsgdGltZW91dAotICAgICAg
ICBvdXRwdXQgPSBzcC5yZWFkX2xpbmUodGltZW91dCkKLSAgICAgICAgd2hpbGUgbm90IHNwLnRp
bWVkX291dCBhbmQgbm90IHNwLmNyYXNoZWQgYW5kIG91dHB1dDoKLSAgICAgICAgICAgIGlmIG91
dHB1dC5zdGFydHN3aXRoKCdDb250ZW50LUxlbmd0aCcpOgotICAgICAgICAgICAgICAgIG0gPSBy
ZS5tYXRjaCgnQ29udGVudC1MZW5ndGg6IChcZCspJywgb3V0cHV0KQotICAgICAgICAgICAgICAg
IGNvbnRlbnRfbGVuZ3RoID0gaW50KG0uZ3JvdXAoMSkpCi0gICAgICAgICAgICAgICAgdGltZW91
dCA9IGRlYWRsaW5lIC0gdGltZS50aW1lKCkKLSAgICAgICAgICAgICAgICBvdXRwdXQgPSBzcC5y
ZWFkKHRpbWVvdXQsIGNvbnRlbnRfbGVuZ3RoKQotICAgICAgICAgICAgICAgIGJyZWFrCi0gICAg
ICAgICAgICBlbGlmIG91dHB1dC5zdGFydHN3aXRoKCdkaWZmJyk6Ci0gICAgICAgICAgICAgICAg
YnJlYWsKLSAgICAgICAgICAgIGVsc2U6Ci0gICAgICAgICAgICAgICAgdGltZW91dCA9IGRlYWRs
aW5lIC0gdGltZS50aW1lKCkKLSAgICAgICAgICAgICAgICBvdXRwdXQgPSBzcC5yZWFkX2xpbmUo
ZGVhZGxpbmUpCi0KLSAgICAgICAgcmVzdWx0ID0gVHJ1ZQotICAgICAgICBpZiBvdXRwdXQuc3Rh
cnRzd2l0aCgnZGlmZicpOgotICAgICAgICAgICAgbSA9IHJlLm1hdGNoKCdkaWZmOiAoLispJSAo
cGFzc2VkfGZhaWxlZCknLCBvdXRwdXQpCi0gICAgICAgICAgICBpZiBtLmdyb3VwKDIpID09ICdw
YXNzZWQnOgotICAgICAgICAgICAgICAgIHJlc3VsdCA9IEZhbHNlCi0gICAgICAgIGVsaWYgb3V0
cHV0IGFuZCBkaWZmX2ZpbGVuYW1lOgotICAgICAgICAgICAgb3BlbihkaWZmX2ZpbGVuYW1lLCAn
dycpLndyaXRlKG91dHB1dCkKLSAgICAgICAgZWxpZiBzcC50aW1lZF9vdXQ6Ci0gICAgICAgICAg
ICBfbG9nLmVycm9yKCJJbWFnZURpZmYgdGltZWQgb3V0IG9uICVzIiAlIGV4cGVjdGVkX2ZpbGVu
YW1lKQotICAgICAgICBlbGlmIHNwLmNyYXNoZWQ6Ci0gICAgICAgICAgICBfbG9nLmVycm9yKCJJ
bWFnZURpZmYgY3Jhc2hlZCIpCi0gICAgICAgIHNwLnN0b3AoKQotICAgICAgICByZXR1cm4gcmVz
dWx0Ci0KICAgICBkZWYgcGF0aF90b190ZXN0X2V4cGVjdGF0aW9uc19maWxlKHNlbGYpOgogICAg
ICAgICByZXR1cm4gc2VsZi5wYXRoX2Zyb21fd2Via2l0X2Jhc2UoJ0xheW91dFRlc3RzJywgJ3Bs
YXRmb3JtJywKICAgICAgICAgICAgJ21hYycsICd0ZXN0X2V4cGVjdGF0aW9ucy50eHQnKQogCi0g
ICAgZGVmIHJlc3VsdHNfZGlyZWN0b3J5KHNlbGYpOgotICAgICAgICByZXR1cm4gKCcvdG1wL3J1
bi1jaHJvbWl1bS13ZWJraXQtdGVzdHMtJyArCi0gICAgICAgICAgICAgICAgc2VsZi5fb3B0aW9u
cy5yZXN1bHRzX2RpcmVjdG9yeSkKLQotICAgIGRlZiBzZXR1cF90ZXN0X3J1bihzZWxmKToKLSAg
ICAgICAgIyBUaGlzIHBvcnQgZG9lc24ndCByZXF1aXJlIGFueSBzcGVjaWZpYyBjb25maWd1cmF0
aW9uLgotICAgICAgICBwYXNzCi0KLSAgICBkZWYgc2hvd19yZXN1bHRzX2h0bWxfZmlsZShzZWxm
LCByZXN1bHRzX2ZpbGVuYW1lKToKLSAgICAgICAgdXJpID0gc2VsZi5maWxlbmFtZV90b191cmko
cmVzdWx0c19maWxlbmFtZSkKLSAgICAgICAgd2ViYnJvd3Nlci5vcGVuKHVyaSwgbmV3PTEpCi0K
LSAgICBkZWYgc3RhcnRfZHJpdmVyKHNlbGYsIGltYWdlX3BhdGgsIG9wdGlvbnMpOgotICAgICAg
ICAiIiJTdGFydHMgYSBuZXcgRHJpdmVyIGFuZCByZXR1cm5zIGEgaGFuZGxlIHRvIGl0LiIiIgot
ICAgICAgICByZXR1cm4gTWFjRHJpdmVyKHNlbGYsIGltYWdlX3BhdGgsIG9wdGlvbnMpCi0KLSAg
ICBkZWYgdGVzdF9iYXNlX3BsYXRmb3JtX25hbWVzKHNlbGYpOgotICAgICAgICAjIEF0IHRoZSBt
b21lbnQgd2UgZG9uJ3QgdXNlIHRlc3QgcGxhdGZvcm0gbmFtZXMsIGJ1dCB3ZSBoYXZlCi0gICAg
ICAgICMgdG8gcmV0dXJuIHNvbWV0aGluZy4KLSAgICAgICAgcmV0dXJuICgnbWFjJywpCi0KICAg
ICBkZWYgX3NraXBwZWRfZmlsZV9wYXRocyhzZWxmKToKICAgICAgICAgIyBGSVhNRTogVGhpcyBt
ZXRob2Qgd2lsbCBuZWVkIHRvIGJlIG1hZGUgd29yayBmb3Igbm9uLW1hYwogICAgICAgICAjIHBs
YXRmb3JtcyBhbmQgbW92ZWQgaW50byBiYXNlLlBvcnQuCkBAIC0yMTYsNiArOTEsMjIgQEAgY2xh
c3MgTWFjUG9ydChiYXNlLlBvcnQpOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgJ1NraXBwZWQnKSkKICAgICAgICAgcmV0dXJuIHNraXBwZWRfZmlsZXMKIAorICAg
IGRlZiB0ZXN0X3BsYXRmb3JtX25hbWUoc2VsZik6CisgICAgICAgIHJldHVybiAnbWFjJyArIHNl
bGYudmVyc2lvbigpCisKKyAgICBkZWYgdmVyc2lvbihzZWxmKToKKyAgICAgICAgb3NfdmVyc2lv
bl9zdHJpbmcgPSBwbGF0Zm9ybS5tYWNfdmVyKClbMF0gICMgZS5nLiAiMTAuNS42IgorICAgICAg
ICBpZiBub3Qgb3NfdmVyc2lvbl9zdHJpbmc6CisgICAgICAgICAgICByZXR1cm4gJy1sZW9wYXJk
JworICAgICAgICByZWxlYXNlX3ZlcnNpb24gPSBpbnQob3NfdmVyc2lvbl9zdHJpbmcuc3BsaXQo
Jy4nKVsxXSkKKyAgICAgICAgaWYgcmVsZWFzZV92ZXJzaW9uID09IDQ6CisgICAgICAgICAgICBy
ZXR1cm4gJy10aWdlcicKKyAgICAgICAgZWxpZiByZWxlYXNlX3ZlcnNpb24gPT0gNToKKyAgICAg
ICAgICAgIHJldHVybiAnLWxlb3BhcmQnCisgICAgICAgIGVsaWYgcmVsZWFzZV92ZXJzaW9uID09
IDY6CisgICAgICAgICAgICByZXR1cm4gJy1zbm93bGVvcGFyZCcKKyAgICAgICAgcmV0dXJuICcn
CisKICAgICBkZWYgX3Rlc3RzX2Zvcl9vdGhlcl9wbGF0Zm9ybXMoc2VsZik6CiAgICAgICAgICMg
VGhlIG9yaWdpbmFsIHJ1bi13ZWJraXQtdGVzdHMgYnVpbGRzIHVwIGEgIndoaXRlbGlzdCIgb2Yg
dGVzdHMgdG8KICAgICAgICAgIyBydW4sIGFuZCBwYXNzZXMgdGhhdCB0byBEdW1wUmVuZGVyVHJl
ZS4gbmV3LXJ1bi13ZWJraXQtdGVzdHMgYXNzdW1lcwpAQCAtMjUzLDkzICsxNDQsNyBAQCBjbGFz
cyBNYWNQb3J0KGJhc2UuUG9ydCk6CiAgICAgICAgIF0KICAgICAgICAgcmV0dXJuIGRpc2FibGVk
X2ZlYXR1cmVfdGVzdHMgKyB3ZWJhcmNoaXZlX3Rlc3RzCiAKLSAgICBkZWYgX3Rlc3RzX2Zyb21f
c2tpcHBlZF9maWxlKHNlbGYsIHNraXBwZWRfZmlsZSk6Ci0gICAgICAgIHRlc3RzX3RvX3NraXAg
PSBbXQotICAgICAgICBmb3IgbGluZSBpbiBza2lwcGVkX2ZpbGUucmVhZGxpbmVzKCk6Ci0gICAg
ICAgICAgICBsaW5lID0gbGluZS5zdHJpcCgpCi0gICAgICAgICAgICBpZiBsaW5lLnN0YXJ0c3dp
dGgoJyMnKSBvciBub3QgbGVuKGxpbmUpOgotICAgICAgICAgICAgICAgIGNvbnRpbnVlCi0gICAg
ICAgICAgICB0ZXN0c190b19za2lwLmFwcGVuZChsaW5lKQotICAgICAgICByZXR1cm4gdGVzdHNf
dG9fc2tpcAotCi0gICAgZGVmIF9leHBlY3RhdGlvbnNfZnJvbV9za2lwcGVkX2ZpbGVzKHNlbGYp
OgotICAgICAgICB0ZXN0c190b19za2lwID0gW10KLSAgICAgICAgZm9yIGZpbGVuYW1lIGluIHNl
bGYuX3NraXBwZWRfZmlsZV9wYXRocygpOgotICAgICAgICAgICAgaWYgbm90IG9zLnBhdGguZXhp
c3RzKGZpbGVuYW1lKToKLSAgICAgICAgICAgICAgICBfbG9nLndhcm4oIkZhaWxlZCB0byBvcGVu
IFNraXBwZWQgZmlsZTogJXMiICUgZmlsZW5hbWUpCi0gICAgICAgICAgICAgICAgY29udGludWUK
LSAgICAgICAgICAgIHNraXBwZWRfZmlsZSA9IGZpbGUoZmlsZW5hbWUpCi0gICAgICAgICAgICB0
ZXN0c190b19za2lwLmV4dGVuZChzZWxmLl90ZXN0c19mcm9tX3NraXBwZWRfZmlsZShza2lwcGVk
X2ZpbGUpKQotICAgICAgICAgICAgc2tpcHBlZF9maWxlLmNsb3NlKCkKLSAgICAgICAgcmV0dXJu
IHRlc3RzX3RvX3NraXAKLQotICAgIGRlZiB0ZXN0X2V4cGVjdGF0aW9ucyhzZWxmKToKLSAgICAg
ICAgIyBUaGUgV2ViS2l0IG1hYyBwb3J0IHVzZXMgYSBjb21iaW5hdGlvbiBvZiBhIHRlc3RfZXhw
ZWN0YXRpb25zIGZpbGUKLSAgICAgICAgIyBhbmQgJ1NraXBwZWQnIGZpbGVzLgotICAgICAgICBl
eHBlY3RhdGlvbnNfZmlsZSA9IHNlbGYucGF0aF90b190ZXN0X2V4cGVjdGF0aW9uc19maWxlKCkK
LSAgICAgICAgZXhwZWN0YXRpb25zID0gZmlsZShleHBlY3RhdGlvbnNfZmlsZSwgInIiKS5yZWFk
KCkKLSAgICAgICAgcmV0dXJuIGV4cGVjdGF0aW9ucyArIHNlbGYuX3NraXBzKCkKLQotICAgIGRl
ZiBfc2tpcHMoc2VsZik6Ci0gICAgICAgICMgRWFjaCBTa2lwcGVkIGZpbGUgY29udGFpbnMgYSBs
aXN0IG9mIGZpbGVzCi0gICAgICAgICMgb3IgZGlyZWN0b3JpZXMgdG8gYmUgc2tpcHBlZCBkdXJp
bmcgdGhlIHRlc3QgcnVuLiBUaGUgdG90YWwgbGlzdAotICAgICAgICAjIG9mIHRlc3RzIHRvIHNr
aXBwZWQgaXMgZ2l2ZW4gYnkgdGhlIGNvbnRlbnRzIG9mIHRoZSBnZW5lcmljCi0gICAgICAgICMg
U2tpcHBlZCBmaWxlIGZvdW5kIGluIHBsYXRmb3JtL1ggcGx1cyBhIHZlcnNpb24tc3BlY2lmaWMg
ZmlsZQotICAgICAgICAjIGZvdW5kIGluIHBsYXRmb3JtL1gtdmVyc2lvbi4gRHVwbGljYXRlIGVu
dHJpZXMgYXJlIGFsbG93ZWQuCi0gICAgICAgICMgVGhpcyByb3V0aW5lIHJlYWRzIHRob3NlIGZp
bGVzIGFuZCB0dXJucyBjb250ZW50cyBpbnRvIHRoZQotICAgICAgICAjIGZvcm1hdCBleHBlY3Rl
ZCBieSB0ZXN0X2V4cGVjdGF0aW9ucy4KLQotICAgICAgICAjIFVzZSBhIHNldCB0byBhbGxvdyBk
dXBsaWNhdGVzCi0gICAgICAgIHRlc3RzX3RvX3NraXAgPSBzZXQoc2VsZi5fZXhwZWN0YXRpb25z
X2Zyb21fc2tpcHBlZF9maWxlcygpKQotCi0gICAgICAgIHRlc3RzX3RvX3NraXAudXBkYXRlKHNl
bGYuX3Rlc3RzX2Zvcl9vdGhlcl9wbGF0Zm9ybXMoKSkKLSAgICAgICAgdGVzdHNfdG9fc2tpcC51
cGRhdGUoc2VsZi5fdGVzdHNfZm9yX2Rpc2FibGVkX2ZlYXR1cmVzKCkpCi0gICAgICAgIHNraXBf
bGluZXMgPSBtYXAobGFtYmRhIHRlc3RfcGF0aDogIkJVR19TS0lQUEVEIFNLSVAgOiAlcyA9IEZB
SUwiICUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVzdF9wYXRoLCB0ZXN0c190
b19za2lwKQotICAgICAgICByZXR1cm4gIlxuIi5qb2luKHNraXBfbGluZXMpCi0KLSAgICBkZWYg
dGVzdF9wbGF0Zm9ybV9uYW1lKHNlbGYpOgotICAgICAgICByZXR1cm4gJ21hYycgKyBzZWxmLnZl
cnNpb24oKQotCi0gICAgZGVmIHRlc3RfcGxhdGZvcm1fbmFtZXMoc2VsZik6Ci0gICAgICAgIHJl
dHVybiAoJ21hYycsICdtYWMtdGlnZXInLCAnbWFjLWxlb3BhcmQnLCAnbWFjLXNub3dsZW9wYXJk
JykKLQotICAgIGRlZiB2ZXJzaW9uKHNlbGYpOgotICAgICAgICBvc192ZXJzaW9uX3N0cmluZyA9
IHBsYXRmb3JtLm1hY192ZXIoKVswXSAgIyBlLmcuICIxMC41LjYiCi0gICAgICAgIGlmIG5vdCBv
c192ZXJzaW9uX3N0cmluZzoKLSAgICAgICAgICAgIHJldHVybiAnLWxlb3BhcmQnCi0gICAgICAg
IHJlbGVhc2VfdmVyc2lvbiA9IGludChvc192ZXJzaW9uX3N0cmluZy5zcGxpdCgnLicpWzFdKQot
ICAgICAgICBpZiByZWxlYXNlX3ZlcnNpb24gPT0gNDoKLSAgICAgICAgICAgIHJldHVybiAnLXRp
Z2VyJwotICAgICAgICBlbGlmIHJlbGVhc2VfdmVyc2lvbiA9PSA1OgotICAgICAgICAgICAgcmV0
dXJuICctbGVvcGFyZCcKLSAgICAgICAgZWxpZiByZWxlYXNlX3ZlcnNpb24gPT0gNjoKLSAgICAg
ICAgICAgIHJldHVybiAnLXNub3dsZW9wYXJkJwotICAgICAgICByZXR1cm4gJycKLQotICAgIGRl
ZiBkZWZhdWx0X2NvbmZpZ3VyYXRpb24oc2VsZik6Ci0gICAgICAgICMgVGhpcyBpcyBhIGJpdCBv
ZiBhIGhhY2suIFRoaXMgc3RhdGUgZXhpc3RzIGluIGEgbXVjaCBuaWNlciBmb3JtIGluCi0gICAg
ICAgICMgcGVybC1sYW5kLgotICAgICAgICBjb25maWd1cmF0aW9uID0gb3NwYXRoLnJlbHBhdGgo
Ci0gICAgICAgICAgICBzZWxmLl93ZWJraXRfYnVpbGRfZGlyZWN0b3J5KFsiLS1jb25maWd1cmF0
aW9uIl0pLAotICAgICAgICAgICAgc2VsZi5fd2Via2l0X2J1aWxkX2RpcmVjdG9yeShbIi0tdG9w
LWxldmVsIl0pKQotICAgICAgICBhc3NlcnQoY29uZmlndXJhdGlvbiA9PSAiRGVidWciIG9yIGNv
bmZpZ3VyYXRpb24gPT0gIlJlbGVhc2UiKQotICAgICAgICByZXR1cm4gY29uZmlndXJhdGlvbgot
Ci0gICAgIwotICAgICMgUFJPVEVDVEVEIE1FVEhPRFMKLSAgICAjCi0KLSAgICBkZWYgX3dlYmtp
dF9idWlsZF9kaXJlY3Rvcnkoc2VsZiwgYXJncyk6Ci0gICAgICAgIGNtZCA9IFtzZWxmLnNjcmlw
dF9wYXRoKCJ3ZWJraXQtYnVpbGQtZGlyZWN0b3J5IildICsgYXJncwotICAgICAgICByZXR1cm4g
c2VsZi5fZXhlY3V0aXZlLnJ1bl9jb21tYW5kKGNtZCkucnN0cmlwKCkKLQotICAgIGRlZiBfYnVp
bGRfcGF0aChzZWxmLCAqY29tcHMpOgotICAgICAgICBpZiBub3Qgc2VsZi5fY2FjaGVkX2J1aWxk
X3Jvb3Q6Ci0gICAgICAgICAgICBzZWxmLl9jYWNoZWRfYnVpbGRfcm9vdCA9IHNlbGYuX3dlYmtp
dF9idWlsZF9kaXJlY3RvcnkoWyItLXRvcC1sZXZlbCJdKQotICAgICAgICByZXR1cm4gb3MucGF0
aC5qb2luKHNlbGYuX2NhY2hlZF9idWlsZF9yb290LCBzZWxmLl9vcHRpb25zLmNvbmZpZ3VyYXRp
b24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKmNvbXBzKQotCisgICAgIyBGSVhNRTog
VGhpcyBkb2Vzbid0IGhhdmUgYW55dGhpbmcgdG8gZG8gd2l0aCBXZWJLaXQuCiAgICAgZGVmIF9r
aWxsX3Byb2Nlc3Moc2VsZiwgcGlkKToKICAgICAgICAgIiIiRm9yY2VmdWxseSBraWxsIHRoZSBw
cm9jZXNzLgogCkBAIC0zNDgsNiArMTUzLDcgQEAgY2xhc3MgTWFjUG9ydChiYXNlLlBvcnQpOgog
ICAgICAgICAiIiIKICAgICAgICAgb3Mua2lsbChwaWQsIHNpZ25hbC5TSUdLSUxMKQogCisgICAg
IyBGSVhNRTogVGhpcyBkb2Vzbid0IGhhdmUgYW55dGhpbmcgdG8gZG8gd2l0aCBXZWJLaXQuCiAg
ICAgZGVmIF9raWxsX2FsbF9wcm9jZXNzKHNlbGYsIHByb2Nlc3NfbmFtZSk6CiAgICAgICAgICMg
T24gTWFjIE9TIFggMTAuNiwga2lsbGFsbCBoYXMgYSBuZXcgY29uc3RyYWludDogLVNJR05BTE5B
TUUgb3IKICAgICAgICAgIyAtU0lHTkFMTlVNQkVSIG11c3QgY29tZSBmaXJzdC4gIEV4YW1wbGUg
cHJvYmxlbToKQEAgLTM2NiwxOSArMTcyLDcgQEAgY2xhc3MgTWFjUG9ydChiYXNlLlBvcnQpOgog
ICAgICAgICByZXR1cm4gb3MucGF0aC5qb2luKHNlbGYubGF5b3V0X3Rlc3RzX2RpcigpLCAnaHR0
cCcsICdjb25mJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnYXBhY2hlMi1odHRwZC5j
b25mJykKIAotICAgIGRlZiBfcGF0aF90b19kcml2ZXIoc2VsZik6Ci0gICAgICAgIHJldHVybiBz
ZWxmLl9idWlsZF9wYXRoKCdEdW1wUmVuZGVyVHJlZScpCi0KLSAgICBkZWYgX3BhdGhfdG9faGVs
cGVyKHNlbGYpOgotICAgICAgICByZXR1cm4gTm9uZQotCi0gICAgZGVmIF9wYXRoX3RvX2ltYWdl
X2RpZmYoc2VsZik6Ci0gICAgICAgIHJldHVybiBzZWxmLl9idWlsZF9wYXRoKCdJbWFnZURpZmYn
KQotCi0gICAgZGVmIF9wYXRoX3RvX3dkaWZmKHNlbGYpOgotICAgICAgICAjIEZJWE1FOiBUaGlz
IGRvZXMgbm90IGV4aXN0IG9uIGEgZGVmYXVsdCBNYWMgT1MgWCBMZW9wYXJkIGluc3RhbGwuCi0g
ICAgICAgIHJldHVybiAnd2RpZmYnCi0KKyAgICAjIEZJWE1FOiBUaGlzIGRvZXNuJ3QgaGF2ZSBh
bnl0aGluZyB0byBkbyB3aXRoIFdlYktpdC4KICAgICBkZWYgX3NodXRfZG93bl9odHRwX3NlcnZl
cihzZWxmLCBzZXJ2ZXJfcGlkKToKICAgICAgICAgIiIiU2h1dCBkb3duIHRoZSBsaWdodHRwZCB3
ZWIgc2VydmVyLiBCbG9ja3MgdW50aWwgaXQncyBmdWxseQogICAgICAgICBzaHV0IGRvd24uCkBA
IC0zODgsMTE3ICsxODIsMTYgQEAgY2xhc3MgTWFjUG9ydChiYXNlLlBvcnQpOgogICAgICAgICAi
IiIKICAgICAgICAgIyBzZXJ2ZXJfcGlkIGlzIG5vdCBzZXQgd2hlbiAiaHR0cF9zZXJ2ZXIucHkg
c3RvcCIgaXMgcnVuIG1hbnVhbGx5LgogICAgICAgICBpZiBzZXJ2ZXJfcGlkIGlzIE5vbmU6Ci0g
ICAgICAgICAgICAjIFRPRE8obW1vc3MpIFRoaXMgaXNuJ3QgaWRlYWwsIHNpbmNlIGl0IGNvdWxk
IGNvbmZsaWN0IHdpdGgKKyAgICAgICAgICAgICMgRklYTUU6IFRoaXMgaXNuJ3QgaWRlYWwsIHNp
bmNlIGl0IGNvdWxkIGNvbmZsaWN0IHdpdGgKICAgICAgICAgICAgICMgbGlnaHR0cGQgcHJvY2Vz
c2VzIG5vdCBzdGFydGVkIGJ5IGh0dHBfc2VydmVyLnB5LAogICAgICAgICAgICAgIyBidXQgZ29v
ZCBlbm91Z2ggZm9yIG5vdy4KICAgICAgICAgICAgIHNlbGYuX2tpbGxfYWxsX3Byb2Nlc3MoJ2h0
dHBkJykKICAgICAgICAgZWxzZToKICAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgICBv
cy5raWxsKHNlcnZlcl9waWQsIHNpZ25hbC5TSUdURVJNKQotICAgICAgICAgICAgICAgICMgVE9E
TyhtbW9zcykgTWF5YmUgdGhyb3cgaW4gYSBTSUdLSUxMIGp1c3QgdG8gYmUgc3VyZT8KKyAgICAg
ICAgICAgICAgICAjIEZJWE1FOiBNYXliZSB0aHJvdyBpbiBhIFNJR0tJTEwganVzdCB0byBiZSBz
dXJlPwogICAgICAgICAgICAgZXhjZXB0IE9TRXJyb3I6CiAgICAgICAgICAgICAgICAgIyBTb21l
dGltZXMgd2UgZ2V0IGEgYmFkIFBJRCAoZS5nLiBmcm9tIGEgc3RhbGUgaHR0cGQucGlkCiAgICAg
ICAgICAgICAgICAgIyBmaWxlKSwgc28gaWYga2lsbCBmYWlscyBvbiB0aGUgZ2l2ZW4gUElELCBq
dXN0IHRyeSB0bwogICAgICAgICAgICAgICAgICMgJ2tpbGxhbGwnIHdlYiBzZXJ2ZXJzLgogICAg
ICAgICAgICAgICAgIHNlbGYuX3NodXRfZG93bl9odHRwX3NlcnZlcihOb25lKQotCi0KLWNsYXNz
IE1hY0RyaXZlcihiYXNlLkRyaXZlcik6Ci0gICAgIiIiaW1wbGVtZW50YXRpb24gb2YgdGhlIER1
bXBSZW5kZXJUcmVlIGludGVyZmFjZS4iIiIKLQotICAgIGRlZiBfX2luaXRfXyhzZWxmLCBwb3J0
LCBpbWFnZV9wYXRoLCBkcml2ZXJfb3B0aW9ucyk6Ci0gICAgICAgIHNlbGYuX3BvcnQgPSBwb3J0
Ci0gICAgICAgIHNlbGYuX2RyaXZlcl9vcHRpb25zID0gZHJpdmVyX29wdGlvbnMKLSAgICAgICAg
c2VsZi5faW1hZ2VfcGF0aCA9IGltYWdlX3BhdGgKLQotICAgICAgICBjbWQgPSBbXQotICAgICAg
ICAjIEhvb2sgZm9yIGluamVjdGluZyB2YWxncmluZCBvciBvdGhlciBydW50aW1lIGluc3RydW1l
bnRhdGlvbiwKLSAgICAgICAgIyB1c2VkIGJ5IGUuZy4gdG9vbHMvdmFsZ3JpbmQvdmFsZ3JpbmRf
dGVzdHMucHkuCi0gICAgICAgIHdyYXBwZXIgPSBvcy5lbnZpcm9uLmdldCgiQlJPV1NFUl9XUkFQ
UEVSIiwgTm9uZSkKLSAgICAgICAgaWYgd3JhcHBlciAhPSBOb25lOgotICAgICAgICAgICAgY21k
ICs9IFt3cmFwcGVyXQotICAgICAgICBpZiBzZWxmLl9wb3J0Ll9vcHRpb25zLndyYXBwZXI6Ci0g
ICAgICAgICAgICAjIFRoaXMgc3BsaXQoKSBpc24ndCByZWFsbHkgd2hhdCB3ZSB3YW50IC0tIGl0
IGluY29ycmVjdGx5IHdpbGwKLSAgICAgICAgICAgICMgc3BsaXQgcXVvdGVkIHN0cmluZ3Mgd2l0
aGluIHRoZSB3cmFwcGVyIGFyZ3VtZW50IC0tIGJ1dCBpbgotICAgICAgICAgICAgIyBwcmFjdGlj
ZSBpdCBzaG91bGRuJ3QgY29tZSB1cCBhbmQgdGhlIC0taGVscCBvdXRwdXQgd2FybnMKLSAgICAg
ICAgICAgICMgYWJvdXQgaXQgYW55d2F5LgotICAgICAgICAgICAgY21kICs9IHNlbGYuX29wdGlv
bnMud3JhcHBlci5zcGxpdCgpCi0KLSAgICAgICAgY21kICs9IFtwb3J0Ll9wYXRoX3RvX2RyaXZl
cigpLCAnLSddCi0KLSAgICAgICAgaWYgaW1hZ2VfcGF0aDoKLSAgICAgICAgICAgIGNtZC5hcHBl
bmQoJy0tcGl4ZWwtdGVzdHMnKQotICAgICAgICBlbnYgPSBvcy5lbnZpcm9uCi0gICAgICAgIGVu
dlsnRFlMRF9GUkFNRVdPUktfUEFUSCddID0gc2VsZi5fcG9ydC5fYnVpbGRfcGF0aCgpCi0gICAg
ICAgIHNlbGYuX3Nwcm9jID0gc2VydmVyX3Byb2Nlc3MuU2VydmVyUHJvY2VzcyhzZWxmLl9wb3J0
LAotICAgICAgICAgICAgIkR1bXBSZW5kZXJUcmVlIiwgY21kLCBlbnYpCi0KLSAgICBkZWYgcG9s
bChzZWxmKToKLSAgICAgICAgcmV0dXJuIHNlbGYuX3Nwcm9jLnBvbGwoKQotCi0gICAgZGVmIHJl
c3RhcnQoc2VsZik6Ci0gICAgICAgIHNlbGYuX3Nwcm9jLnN0b3AoKQotICAgICAgICBzZWxmLl9z
cHJvYy5zdGFydCgpCi0gICAgICAgIHJldHVybgotCi0gICAgZGVmIHJldHVybmNvZGUoc2VsZik6
Ci0gICAgICAgIHJldHVybiBzZWxmLl9wcm9jLnJldHVybmNvZGUoKQotCi0gICAgZGVmIHJ1bl90
ZXN0KHNlbGYsIHVyaSwgdGltZW91dG1zLCBpbWFnZV9oYXNoKToKLSAgICAgICAgaWYgdXJpLnN0
YXJ0c3dpdGgoImZpbGU6Ly8vIik6Ci0gICAgICAgICAgICBjbWQgPSB1cmlbNzpdCi0gICAgICAg
IGVsc2U6Ci0gICAgICAgICAgICBjbWQgPSB1cmkKLQotICAgICAgICBpZiBpbWFnZV9oYXNoOgot
ICAgICAgICAgICAgY21kICs9ICInIiArIGltYWdlX2hhc2gKLSAgICAgICAgY21kICs9ICJcbiIK
LQotICAgICAgICAjIHBkYi5zZXRfdHJhY2UoKQotICAgICAgICBzcCA9IHNlbGYuX3Nwcm9jCi0g
ICAgICAgIHNwLndyaXRlKGNtZCkKLQotICAgICAgICBoYXZlX3NlZW5fY29udGVudF90eXBlID0g
RmFsc2UKLSAgICAgICAgYWN0dWFsX2ltYWdlX2hhc2ggPSBOb25lCi0gICAgICAgIG91dHB1dCA9
ICcnCi0gICAgICAgIGltYWdlID0gJycKLQotICAgICAgICB0aW1lb3V0ID0gaW50KHRpbWVvdXRt
cykgLyAxMDAwLjAKLSAgICAgICAgZGVhZGxpbmUgPSB0aW1lLnRpbWUoKSArIHRpbWVvdXQKLSAg
ICAgICAgbGluZSA9IHNwLnJlYWRfbGluZSh0aW1lb3V0KQotICAgICAgICB3aGlsZSBub3Qgc3Au
dGltZWRfb3V0IGFuZCBub3Qgc3AuY3Jhc2hlZCBhbmQgbGluZS5yc3RyaXAoKSAhPSAiI0VPRiI6
Ci0gICAgICAgICAgICBpZiAobGluZS5zdGFydHN3aXRoKCdDb250ZW50LVR5cGU6JykgYW5kIG5v
dAotICAgICAgICAgICAgICAgIGhhdmVfc2Vlbl9jb250ZW50X3R5cGUpOgotICAgICAgICAgICAg
ICAgIGhhdmVfc2Vlbl9jb250ZW50X3R5cGUgPSBUcnVlCi0gICAgICAgICAgICBlbHNlOgotICAg
ICAgICAgICAgICAgIG91dHB1dCArPSBsaW5lCi0gICAgICAgICAgICBsaW5lID0gc3AucmVhZF9s
aW5lKHRpbWVvdXQpCi0gICAgICAgICAgICB0aW1lb3V0ID0gZGVhZGxpbmUgLSB0aW1lLnRpbWUo
KQotCi0gICAgICAgICMgTm93IHJlYWQgYSBzZWNvbmQgYmxvY2sgb2YgdGV4dCBmb3IgdGhlIG9w
dGlvbmFsIGltYWdlIGRhdGEKLSAgICAgICAgcmVtYWluaW5nX2xlbmd0aCA9IC0xCi0gICAgICAg
IEhBU0hfSEVBREVSID0gJ0FjdHVhbEhhc2g6ICcKLSAgICAgICAgTEVOR1RIX0hFQURFUiA9ICdD
b250ZW50LUxlbmd0aDogJwotICAgICAgICBsaW5lID0gc3AucmVhZF9saW5lKHRpbWVvdXQpCi0g
ICAgICAgIHdoaWxlIG5vdCBzcC50aW1lZF9vdXQgYW5kIG5vdCBzcC5jcmFzaGVkIGFuZCBsaW5l
LnJzdHJpcCgpICE9ICIjRU9GIjoKLSAgICAgICAgICAgIGlmIGxpbmUuc3RhcnRzd2l0aChIQVNI
X0hFQURFUik6Ci0gICAgICAgICAgICAgICAgYWN0dWFsX2ltYWdlX2hhc2ggPSBsaW5lW2xlbihI
QVNIX0hFQURFUik6XS5zdHJpcCgpCi0gICAgICAgICAgICBlbGlmIGxpbmUuc3RhcnRzd2l0aCgn
Q29udGVudC1UeXBlOicpOgotICAgICAgICAgICAgICAgIHBhc3MKLSAgICAgICAgICAgIGVsaWYg
bGluZS5zdGFydHN3aXRoKExFTkdUSF9IRUFERVIpOgotICAgICAgICAgICAgICAgIHRpbWVvdXQg
PSBkZWFkbGluZSAtIHRpbWUudGltZSgpCi0gICAgICAgICAgICAgICAgY29udGVudF9sZW5ndGgg
PSBpbnQobGluZVtsZW4oTEVOR1RIX0hFQURFUik6XSkKLSAgICAgICAgICAgICAgICBpbWFnZSA9
IHNwLnJlYWQodGltZW91dCwgY29udGVudF9sZW5ndGgpCi0gICAgICAgICAgICB0aW1lb3V0ID0g
ZGVhZGxpbmUgLSB0aW1lLnRpbWUoKQotICAgICAgICAgICAgbGluZSA9IHNwLnJlYWRfbGluZSh0
aW1lb3V0KQotCi0gICAgICAgIGlmIHNlbGYuX2ltYWdlX3BhdGggYW5kIGxlbihzZWxmLl9pbWFn
ZV9wYXRoKToKLSAgICAgICAgICAgIGltYWdlX2ZpbGUgPSBmaWxlKHNlbGYuX2ltYWdlX3BhdGgs
ICJ3YiIpCi0gICAgICAgICAgICBpbWFnZV9maWxlLndyaXRlKGltYWdlKQotICAgICAgICAgICAg
aW1hZ2VfZmlsZS5jbG9zZSgpCi0gICAgICAgIHJldHVybiAoc3AuY3Jhc2hlZCwgc3AudGltZWRf
b3V0LCBhY3R1YWxfaW1hZ2VfaGFzaCwgb3V0cHV0LCBzcC5lcnJvcikKLQotICAgIGRlZiBzdG9w
KHNlbGYpOgotICAgICAgICBpZiBzZWxmLl9zcHJvYzoKLSAgICAgICAgICAgIHNlbGYuX3Nwcm9j
LnN0b3AoKQotICAgICAgICAgICAgc2VsZi5fc3Byb2MgPSBOb25lCmRpZmYgLS1naXQgYS9XZWJL
aXRUb29scy9TY3JpcHRzL3dlYmtpdHB5L2xheW91dF90ZXN0cy9wb3J0L3dlYmtpdC5weSBiL1dl
YktpdFRvb2xzL1NjcmlwdHMvd2Via2l0cHkvbGF5b3V0X3Rlc3RzL3BvcnQvd2Via2l0LnB5Cm5l
dyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY0YzI0MzMKLS0tIC9kZXYvbnVsbAor
KysgYi9XZWJLaXRUb29scy9TY3JpcHRzL3dlYmtpdHB5L2xheW91dF90ZXN0cy9wb3J0L3dlYmtp
dC5weQpAQCAtMCwwICsxLDQyOSBAQAorIyEvdXNyL2Jpbi9lbnYgcHl0aG9uCisjIENvcHlyaWdo
dCAoQykgMjAxMCBHb29nbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorIworIyBSZWRpc3Ry
aWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhv
dXQKKyMgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxv
d2luZyBjb25kaXRpb25zIGFyZQorIyBtZXQ6CisjCisjICAgICAqIFJlZGlzdHJpYnV0aW9ucyBv
ZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisjIG5vdGljZSwg
dGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyMg
ICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBh
Ym92ZQorIyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhl
IGZvbGxvd2luZyBkaXNjbGFpbWVyCisjIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhl
ciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyMgZGlzdHJpYnV0aW9uLgorIyAgICAgKiBO
ZWl0aGVyIHRoZSBHb29nbGUgbmFtZSBub3IgdGhlIG5hbWVzIG9mIGl0cworIyBjb250cmlidXRv
cnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJv
bQorIyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNz
aW9uLgorIworIyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9M
REVSUyBBTkQgQ09OVFJJQlVUT1JTCisjICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJ
RUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisjIExJTUlURUQgVE8sIFRIRSBJTVBM
SUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorIyBBIFBB
UlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENP
UFlSSUdIVAorIyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNU
LCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyMgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFV
RU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorIyBMSU1JVEVEIFRPLCBQUk9DVVJF
TUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyMgREFU
QSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBB
TkQgT04gQU5ZCisjIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNU
UklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyMgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVS
V0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisjIE9GIFRISVMgU09GVFdB
UkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisK
KyIiIldlYktpdCBpbXBsZW1lbnRhdGlvbnMgb2YgdGhlIFBvcnQgaW50ZXJmYWNlLiIiIgorCitp
bXBvcnQgbG9nZ2luZworaW1wb3J0IG9zCitpbXBvcnQgcGRiCitpbXBvcnQgcGxhdGZvcm0KK2lt
cG9ydCByZQoraW1wb3J0IHNodXRpbAoraW1wb3J0IHNpZ25hbAoraW1wb3J0IHN1YnByb2Nlc3MK
K2ltcG9ydCBzeXMKK2ltcG9ydCB0aW1lCitpbXBvcnQgd2ViYnJvd3NlcgorCitpbXBvcnQgd2Vi
a2l0cHkuY29tbW9uLnN5c3RlbS5vc3BhdGggYXMgb3NwYXRoCitpbXBvcnQgd2Via2l0cHkubGF5
b3V0X3Rlc3RzLnBvcnQuYmFzZSBhcyBiYXNlCitpbXBvcnQgd2Via2l0cHkubGF5b3V0X3Rlc3Rz
LnBvcnQuc2VydmVyX3Byb2Nlc3MgYXMgc2VydmVyX3Byb2Nlc3MKKworX2xvZyA9IGxvZ2dpbmcu
Z2V0TG9nZ2VyKCJ3ZWJraXRweS5sYXlvdXRfdGVzdHMucG9ydC53ZWJraXQiKQorCisKK2NsYXNz
IFdlYktpdFBvcnQoYmFzZS5Qb3J0KToKKyAgICAiIiJXZWJLaXQgaW1wbGVtZW50YXRpb24gb2Yg
dGhlIFBvcnQgY2xhc3MuIiIiCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgcG9ydF9uYW1lPU5v
bmUsIG9wdGlvbnM9Tm9uZSk6CisgICAgICAgIGJhc2UuUG9ydC5fX2luaXRfXyhzZWxmLCBwb3J0
X25hbWUsIG9wdGlvbnMpCisgICAgICAgIHNlbGYuX2NhY2hlZF9idWlsZF9yb290ID0gTm9uZQor
CisgICAgICAgICMgRklYTUU6IGRpc2FibGUgcGl4ZWwgdGVzdHMgdW50aWwgdGhleSBhcmUgcnVu
IGJ5IGRlZmF1bHQgb24gdGhlCisgICAgICAgICMgYnVpbGQgbWFjaGluZXMuCisgICAgICAgIGlm
IG9wdGlvbnMgYW5kIChub3QgaGFzYXR0cihvcHRpb25zLCAicGl4ZWxfdGVzdHMiKSBvcgorICAg
ICAgICAgICBvcHRpb25zLnBpeGVsX3Rlc3RzIGlzIE5vbmUpOgorICAgICAgICAgICAgb3B0aW9u
cy5waXhlbF90ZXN0cyA9IEZhbHNlCisKKyAgICBkZWYgYmFzZWxpbmVfcGF0aChzZWxmKToKKyAg
ICAgICAgcmV0dXJuIHNlbGYuX3dlYmtpdF9iYXNlbGluZV9wYXRoKHNlbGYuX25hbWUpCisKKyAg
ICBkZWYgYmFzZWxpbmVfc2VhcmNoX3BhdGgoc2VsZik6CisgICAgICAgIHJhaXNlIE5vdEltcGxl
bWVudGVkRXJyb3IoJ1dlYktpdFBvcnQuYmFzZWxpbmVfc2VhcmNoX3BhdGgnKQorCisgICAgZGVm
IF9idWlsZF9kcml2ZXIoc2VsZik6CisgICAgICAgIHJldHVybiBub3Qgc2VsZi5fZXhlY3V0aXZl
LnJ1bl9jb21tYW5kKFsKKyAgICAgICAgICAgIHNlbGYuc2NyaXB0X3BhdGgoImJ1aWxkLWR1bXBy
ZW5kZXJ0cmVlIiksCisgICAgICAgICAgICBzZWxmLmZsYWdfZnJvbV9jb25maWd1cmF0aW9uKHNl
bGYuX29wdGlvbnMuY29uZmlndXJhdGlvbiksCisgICAgICAgIF0sIHJldHVybl9leGl0X2NvZGU9
VHJ1ZSkKKworICAgIGRlZiBfYnVpbGRfamF2YShzZWxmKToKKyAgICAgICAgamF2YV90ZXN0c19w
YXRoID0gb3MucGF0aC5qb2luKHNlbGYubGF5b3V0X3Rlc3RzX2RpcigpLCAiamF2YSIpCisgICAg
ICAgIGJ1aWxkX2phdmEgPSBbIi91c3IvYmluL21ha2UiLCAiLUMiLCBqYXZhX3Rlc3RzX3BhdGhd
CisgICAgICAgIGlmIHNlbGYuX2V4ZWN1dGl2ZS5ydW5fY29tbWFuZChidWlsZF9qYXZhLCByZXR1
cm5fZXhpdF9jb2RlPVRydWUpOgorICAgICAgICAgICAgX2xvZy5lcnJvcigiRmFpbGVkIHRvIGJ1
aWxkIEphdmEgc3VwcG9ydCBmaWxlczogJXMiICUgYnVpbGRfamF2YSkKKyAgICAgICAgICAgIHJl
dHVybiBGYWxzZQorICAgICAgICByZXR1cm4gVHJ1ZQorCisgICAgZGVmIF9jaGVja19kcml2ZXIo
c2VsZik6CisgICAgICAgIGRyaXZlcl9wYXRoID0gc2VsZi5fcGF0aF90b19kcml2ZXIoKQorICAg
ICAgICBpZiBub3Qgb3MucGF0aC5leGlzdHMoZHJpdmVyX3BhdGgpOgorICAgICAgICAgICAgX2xv
Zy5lcnJvcigiRHVtcFJlbmRlclRyZWUgd2FzIG5vdCBmb3VuZCBhdCAlcyIgJSBkcml2ZXJfcGF0
aCkKKyAgICAgICAgICAgIHJldHVybiBGYWxzZQorICAgICAgICByZXR1cm4gVHJ1ZQorCisgICAg
ZGVmIGNoZWNrX2J1aWxkKHNlbGYsIG5lZWRzX2h0dHApOgorICAgICAgICBpZiBub3Qgc2VsZi5f
YnVpbGRfZHJpdmVyKCk6CisgICAgICAgICAgICByZXR1cm4gRmFsc2UKKyAgICAgICAgaWYgbm90
IHNlbGYuY2hlY2tfaW1hZ2VfZGlmZigpOgorICAgICAgICAgICAgcmV0dXJuIEZhbHNlCisgICAg
ICAgIGlmIG5vdCBzZWxmLl9jaGVja19kcml2ZXIoKToKKyAgICAgICAgICAgIHJldHVybiBGYWxz
ZQorICAgICAgICBpZiBub3Qgc2VsZi5fYnVpbGRfamF2YSgpOgorICAgICAgICAgICAgcmV0dXJu
IEZhbHNlCisgICAgICAgIHJldHVybiBUcnVlCisKKyAgICBkZWYgY2hlY2tfaW1hZ2VfZGlmZihz
ZWxmLCBvdmVycmlkZV9zdGVwPU5vbmUsIGxvZ2dpbmc9VHJ1ZSk6CisgICAgICAgIGltYWdlX2Rp
ZmZfcGF0aCA9IHNlbGYuX3BhdGhfdG9faW1hZ2VfZGlmZigpCisgICAgICAgIGlmIG5vdCBvcy5w
YXRoLmV4aXN0cyhpbWFnZV9kaWZmX3BhdGgpOgorICAgICAgICAgICAgX2xvZy5lcnJvcigiSW1h
Z2VEaWZmIHdhcyBub3QgZm91bmQgYXQgJXMiICUgaW1hZ2VfZGlmZl9wYXRoKQorICAgICAgICAg
ICAgcmV0dXJuIEZhbHNlCisgICAgICAgIHJldHVybiBUcnVlCisKKyAgICBkZWYgZGlmZl9pbWFn
ZShzZWxmLCBleHBlY3RlZF9maWxlbmFtZSwgYWN0dWFsX2ZpbGVuYW1lLAorICAgICAgICAgICAg
ICAgICAgIGRpZmZfZmlsZW5hbWU9Tm9uZSk6CisgICAgICAgICIiIlJldHVybiBUcnVlIGlmIHRo
ZSB0d28gZmlsZXMgYXJlIGRpZmZlcmVudC4gQWxzbyB3cml0ZSBhIGRlbHRhCisgICAgICAgIGlt
YWdlIG9mIHRoZSB0d28gaW1hZ2VzIGludG8gfGRpZmZfZmlsZW5hbWV8IGlmIGl0IGlzIG5vdCBO
b25lLiIiIgorCisgICAgICAgICMgSGFuZGxlIHRoZSBjYXNlIHdoZXJlIHRoZSB0ZXN0IGRpZG4n
dCBhY3R1YWxseSBnZW5lcmF0ZSBhbiBpbWFnZS4KKyAgICAgICAgYWN0dWFsX2xlbmd0aCA9IG9z
LnN0YXQoYWN0dWFsX2ZpbGVuYW1lKS5zdF9zaXplCisgICAgICAgIGlmIGFjdHVhbF9sZW5ndGgg
PT0gMDoKKyAgICAgICAgICAgIGlmIGRpZmZfZmlsZW5hbWU6CisgICAgICAgICAgICAgICAgc2h1
dGlsLmNvcHlmaWxlKGFjdHVhbF9maWxlbmFtZSwgZXhwZWN0ZWRfZmlsZW5hbWUpCisgICAgICAg
ICAgICByZXR1cm4gVHJ1ZQorCisgICAgICAgIHNwID0gc2VsZi5fZGlmZl9pbWFnZV9yZXF1ZXN0
KGV4cGVjdGVkX2ZpbGVuYW1lLCBhY3R1YWxfZmlsZW5hbWUpCisgICAgICAgIHJldHVybiBzZWxm
Ll9kaWZmX2ltYWdlX3JlcGx5KHNwLCBleHBlY3RlZF9maWxlbmFtZSwgZGlmZl9maWxlbmFtZSkK
KworICAgIGRlZiBfZGlmZl9pbWFnZV9yZXF1ZXN0KHNlbGYsIGV4cGVjdGVkX2ZpbGVuYW1lLCBh
Y3R1YWxfZmlsZW5hbWUpOgorICAgICAgICAjIEZJWE1FOiBlaXRoZXIgZXhwb3NlIHRoZSB0b2xl
cmFuY2UgYXJndW1lbnQgYXMgYSBjb21tYW5kLWxpbmUKKyAgICAgICAgIyBwYXJhbWV0ZXIsIG9y
IG1ha2UgaXQgZ28gYXdheSBhbmQgYXdheXMgdXNlIGV4YWN0IG1hdGNoZXMuCisgICAgICAgIGNv
bW1hbmQgPSBbc2VsZi5fcGF0aF90b19pbWFnZV9kaWZmKCksICctLXRvbGVyYW5jZScsICcwLjEn
XQorICAgICAgICBzcCA9IHNlcnZlcl9wcm9jZXNzLlNlcnZlclByb2Nlc3Moc2VsZiwgJ0ltYWdl
RGlmZicsIGNvbW1hbmQpCisKKyAgICAgICAgYWN0dWFsX2xlbmd0aCA9IG9zLnN0YXQoYWN0dWFs
X2ZpbGVuYW1lKS5zdF9zaXplCisgICAgICAgIGFjdHVhbF9maWxlID0gb3BlbihhY3R1YWxfZmls
ZW5hbWUpLnJlYWQoKQorICAgICAgICBleHBlY3RlZF9sZW5ndGggPSBvcy5zdGF0KGV4cGVjdGVk
X2ZpbGVuYW1lKS5zdF9zaXplCisgICAgICAgIGV4cGVjdGVkX2ZpbGUgPSBvcGVuKGV4cGVjdGVk
X2ZpbGVuYW1lKS5yZWFkKCkKKyAgICAgICAgc3Aud3JpdGUoJ0NvbnRlbnQtTGVuZ3RoOiAlZFxu
JXNDb250ZW50LUxlbmd0aDogJWRcbiVzJyAlCisgICAgICAgICAgICAgICAgIChhY3R1YWxfbGVu
Z3RoLCBhY3R1YWxfZmlsZSwgZXhwZWN0ZWRfbGVuZ3RoLCBleHBlY3RlZF9maWxlKSkKKworICAg
ICAgICByZXR1cm4gc3AKKworICAgIGRlZiBfZGlmZl9pbWFnZV9yZXBseShzZWxmLCBzcCwgZXhw
ZWN0ZWRfZmlsZW5hbWUsIGRpZmZfZmlsZW5hbWUpOgorICAgICAgICB0aW1lb3V0ID0gMi4wCisg
ICAgICAgIGRlYWRsaW5lID0gdGltZS50aW1lKCkgKyB0aW1lb3V0CisgICAgICAgIG91dHB1dCA9
IHNwLnJlYWRfbGluZSh0aW1lb3V0KQorICAgICAgICB3aGlsZSBub3Qgc3AudGltZWRfb3V0IGFu
ZCBub3Qgc3AuY3Jhc2hlZCBhbmQgb3V0cHV0OgorICAgICAgICAgICAgaWYgb3V0cHV0LnN0YXJ0
c3dpdGgoJ0NvbnRlbnQtTGVuZ3RoJyk6CisgICAgICAgICAgICAgICAgbSA9IHJlLm1hdGNoKCdD
b250ZW50LUxlbmd0aDogKFxkKyknLCBvdXRwdXQpCisgICAgICAgICAgICAgICAgY29udGVudF9s
ZW5ndGggPSBpbnQobS5ncm91cCgxKSkKKyAgICAgICAgICAgICAgICB0aW1lb3V0ID0gZGVhZGxp
bmUgLSB0aW1lLnRpbWUoKQorICAgICAgICAgICAgICAgIG91dHB1dCA9IHNwLnJlYWQodGltZW91
dCwgY29udGVudF9sZW5ndGgpCisgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgIGVs
aWYgb3V0cHV0LnN0YXJ0c3dpdGgoJ2RpZmYnKToKKyAgICAgICAgICAgICAgICBicmVhaworICAg
ICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICB0aW1lb3V0ID0gZGVhZGxpbmUgLSB0aW1l
LnRpbWUoKQorICAgICAgICAgICAgICAgIG91dHB1dCA9IHNwLnJlYWRfbGluZShkZWFkbGluZSkK
KworICAgICAgICByZXN1bHQgPSBUcnVlCisgICAgICAgIGlmIG91dHB1dC5zdGFydHN3aXRoKCdk
aWZmJyk6CisgICAgICAgICAgICBtID0gcmUubWF0Y2goJ2RpZmY6ICguKyklIChwYXNzZWR8ZmFp
bGVkKScsIG91dHB1dCkKKyAgICAgICAgICAgIGlmIG0uZ3JvdXAoMikgPT0gJ3Bhc3NlZCc6Cisg
ICAgICAgICAgICAgICAgcmVzdWx0ID0gRmFsc2UKKyAgICAgICAgZWxpZiBvdXRwdXQgYW5kIGRp
ZmZfZmlsZW5hbWU6CisgICAgICAgICAgICBvcGVuKGRpZmZfZmlsZW5hbWUsICd3Jykud3JpdGUo
b3V0cHV0KQorICAgICAgICBlbGlmIHNwLnRpbWVkX291dDoKKyAgICAgICAgICAgIF9sb2cuZXJy
b3IoIkltYWdlRGlmZiB0aW1lZCBvdXQgb24gJXMiICUgZXhwZWN0ZWRfZmlsZW5hbWUpCisgICAg
ICAgIGVsaWYgc3AuY3Jhc2hlZDoKKyAgICAgICAgICAgIF9sb2cuZXJyb3IoIkltYWdlRGlmZiBj
cmFzaGVkIikKKyAgICAgICAgc3Auc3RvcCgpCisgICAgICAgIHJldHVybiByZXN1bHQKKworICAg
IGRlZiBwYXRoX3RvX3Rlc3RfZXhwZWN0YXRpb25zX2ZpbGUoc2VsZik6CisgICAgICAgIHJhaXNl
IE5vdEltcGxlbWVudGVkRXJyb3IoJ1dlYktpdFBvcnQucGF0aF90b190ZXN0X2V4cGVjdGF0aW9u
c19maWxlJykKKworICAgIGRlZiByZXN1bHRzX2RpcmVjdG9yeShzZWxmKToKKyAgICAgICAgIyBG
SVhNRTogV2h5IGRvIHdlIHNheSBjaHJvbWl1bSBoZXJlPyAgTWF5YmUgIm5ldy1ydW4td2Via2l0
LXRlc3RzLSI/CisgICAgICAgIHJldHVybiAoJy90bXAvcnVuLWNocm9taXVtLXdlYmtpdC10ZXN0
cy0nICsKKyAgICAgICAgICAgICAgICBzZWxmLl9vcHRpb25zLnJlc3VsdHNfZGlyZWN0b3J5KQor
CisgICAgZGVmIHNldHVwX3Rlc3RfcnVuKHNlbGYpOgorICAgICAgICAjIFRoaXMgcG9ydCBkb2Vz
bid0IHJlcXVpcmUgYW55IHNwZWNpZmljIGNvbmZpZ3VyYXRpb24uCisgICAgICAgIHBhc3MKKwor
ICAgIGRlZiBzaG93X3Jlc3VsdHNfaHRtbF9maWxlKHNlbGYsIHJlc3VsdHNfZmlsZW5hbWUpOgor
ICAgICAgICB1cmkgPSBzZWxmLmZpbGVuYW1lX3RvX3VyaShyZXN1bHRzX2ZpbGVuYW1lKQorICAg
ICAgICAjIEZJWE1FOiBXZSBzaG91bGQgb3BlbiByZXN1bHRzIGluIHRoZSB2ZXJzaW9uIG9mIFdl
YktpdCB3ZSBidWlsdC4KKyAgICAgICAgd2ViYnJvd3Nlci5vcGVuKHVyaSwgbmV3PTEpCisKKyAg
ICBkZWYgc3RhcnRfZHJpdmVyKHNlbGYsIGltYWdlX3BhdGgsIG9wdGlvbnMpOgorICAgICAgICBy
ZXR1cm4gV2ViS2l0RHJpdmVyKHNlbGYsIGltYWdlX3BhdGgsIG9wdGlvbnMpCisKKyAgICBkZWYg
dGVzdF9iYXNlX3BsYXRmb3JtX25hbWVzKHNlbGYpOgorICAgICAgICAjIEF0IHRoZSBtb21lbnQg
d2UgZG9uJ3QgdXNlIHRlc3QgcGxhdGZvcm0gbmFtZXMsIGJ1dCB3ZSBoYXZlCisgICAgICAgICMg
dG8gcmV0dXJuIHNvbWV0aGluZy4KKyAgICAgICAgcmV0dXJuICgnbWFjJywpCisKKyAgICBkZWYg
X3Rlc3RzX2Zvcl9vdGhlcl9wbGF0Zm9ybXMoc2VsZik6CisgICAgICAgIHJhaXNlIE5vdEltcGxl
bWVudGVkRXJyb3IoJ1dlYktpdFBvcnQuX3Rlc3RzX2Zvcl9vdGhlcl9wbGF0Zm9ybXMnKQorICAg
ICAgICAjIFRoZSBvcmlnaW5hbCBydW4td2Via2l0LXRlc3RzIGJ1aWxkcyB1cCBhICJ3aGl0ZWxp
c3QiIG9mIHRlc3RzIHRvCisgICAgICAgICMgcnVuLCBhbmQgcGFzc2VzIHRoYXQgdG8gRHVtcFJl
bmRlclRyZWUuIG5ldy1ydW4td2Via2l0LXRlc3RzIGFzc3VtZXMKKyAgICAgICAgIyB3ZSBydW4g
KmFsbCogdGVzdHMgYW5kIHRlc3RfZXhwZWN0YXRpb25zLnR4dCBmdW5jdGlvbnMgYXMgYQorICAg
ICAgICAjIGJsYWNrbGlzdC4KKyAgICAgICAgIyBGSVhNRTogVGhpcyBsaXN0IGNvdWxkIGJlIGR5
bmFtaWMgYmFzZWQgb24gcGxhdGZvcm0gbmFtZSBhbmQKKyAgICAgICAgIyBwdXNoZWQgaW50byBi
YXNlLlBvcnQuCisgICAgICAgIHJldHVybiBbCisgICAgICAgICAgICAicGxhdGZvcm0vY2hyb21p
dW0iLAorICAgICAgICAgICAgInBsYXRmb3JtL2d0ayIsCisgICAgICAgICAgICAicGxhdGZvcm0v
cXQiLAorICAgICAgICAgICAgInBsYXRmb3JtL3dpbiIsCisgICAgICAgIF0KKworICAgIGRlZiBf
dGVzdHNfZm9yX2Rpc2FibGVkX2ZlYXR1cmVzKHNlbGYpOgorICAgICAgICByYWlzZSBOb3RJbXBs
ZW1lbnRlZEVycm9yKCdXZWJLaXRQb3J0Ll90ZXN0c19mb3JfZGlzYWJsZWRfZmVhdHVyZXMnKQor
ICAgICAgICAjIEZJWE1FOiBUaGlzIHNob3VsZCB1c2UgdGhlIGZlYXR1cmUgZGV0ZWN0aW9uIGZy
b20KKyAgICAgICAgIyB3ZWJraXRwZXJsL2ZlYXR1cmVzLnBtIHRvIG1hdGNoIHJ1bi13ZWJraXQt
dGVzdHMuCisgICAgICAgICMgRm9yIG5vdyB3ZSBoYXJkLWNvZGUgYSBsaXN0IG9mIGZlYXR1cmVz
IGtub3duIHRvIGJlIGRpc2FibGVkIG9uCisgICAgICAgICMgdGhlIE1hYyBwbGF0Zm9ybS4KKyAg
ICAgICAgZGlzYWJsZWRfZmVhdHVyZV90ZXN0cyA9IFsKKyAgICAgICAgICAgICJmYXN0L3hodG1s
bXAiLAorICAgICAgICAgICAgImh0dHAvdGVzdHMvd21sIiwKKyAgICAgICAgICAgICJtYXRobWwi
LAorICAgICAgICAgICAgIndtbCIsCisgICAgICAgIF0KKyAgICAgICAgIyBGSVhNRTogd2ViYXJj
aGl2ZSB0ZXN0cyBleHBlY3QgdG8gcmVhZC13cml0ZSBmcm9tCisgICAgICAgICMgLWV4cGVjdGVk
LndlYmFyY2hpdmUgZmlsZXMgaW5zdGVhZCBvZiAudHh0IGZpbGVzLgorICAgICAgICAjIFRoaXMg
c2NyaXB0IGRvZXNuJ3Qga25vdyBob3cgdG8gZG8gdGhhdCB5ZXQsIHNvIHByZXRlbmQgdGhleSdy
ZQorICAgICAgICAjIGp1c3QgImRpc2FibGVkIi4KKyAgICAgICAgd2ViYXJjaGl2ZV90ZXN0cyA9
IFsKKyAgICAgICAgICAgICJ3ZWJhcmNoaXZlIiwKKyAgICAgICAgICAgICJzdmcvd2ViYXJjaGl2
ZSIsCisgICAgICAgICAgICAiaHR0cC90ZXN0cy93ZWJhcmNoaXZlIiwKKyAgICAgICAgICAgICJz
dmcvY3VzdG9tL2ltYWdlLXdpdGgtcHJlZml4LWluLXdlYmFyY2hpdmUuc3ZnIiwKKyAgICAgICAg
XQorICAgICAgICByZXR1cm4gZGlzYWJsZWRfZmVhdHVyZV90ZXN0cyArIHdlYmFyY2hpdmVfdGVz
dHMKKworICAgIGRlZiBfdGVzdHNfZnJvbV9za2lwcGVkX2ZpbGUoc2VsZiwgc2tpcHBlZF9maWxl
KToKKyAgICAgICAgdGVzdHNfdG9fc2tpcCA9IFtdCisgICAgICAgIGZvciBsaW5lIGluIHNraXBw
ZWRfZmlsZS5yZWFkbGluZXMoKToKKyAgICAgICAgICAgIGxpbmUgPSBsaW5lLnN0cmlwKCkKKyAg
ICAgICAgICAgIGlmIGxpbmUuc3RhcnRzd2l0aCgnIycpIG9yIG5vdCBsZW4obGluZSk6CisgICAg
ICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgIHRlc3RzX3RvX3NraXAuYXBwZW5kKGxp
bmUpCisgICAgICAgIHJldHVybiB0ZXN0c190b19za2lwCisKKyAgICBkZWYgX2V4cGVjdGF0aW9u
c19mcm9tX3NraXBwZWRfZmlsZXMoc2VsZik6CisgICAgICAgIHRlc3RzX3RvX3NraXAgPSBbXQor
ICAgICAgICBmb3IgZmlsZW5hbWUgaW4gc2VsZi5fc2tpcHBlZF9maWxlX3BhdGhzKCk6CisgICAg
ICAgICAgICBpZiBub3Qgb3MucGF0aC5leGlzdHMoZmlsZW5hbWUpOgorICAgICAgICAgICAgICAg
IF9sb2cud2FybigiRmFpbGVkIHRvIG9wZW4gU2tpcHBlZCBmaWxlOiAlcyIgJSBmaWxlbmFtZSkK
KyAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgc2tpcHBlZF9maWxlID0gZmls
ZShmaWxlbmFtZSkKKyAgICAgICAgICAgIHRlc3RzX3RvX3NraXAuZXh0ZW5kKHNlbGYuX3Rlc3Rz
X2Zyb21fc2tpcHBlZF9maWxlKHNraXBwZWRfZmlsZSkpCisgICAgICAgICAgICBza2lwcGVkX2Zp
bGUuY2xvc2UoKQorICAgICAgICByZXR1cm4gdGVzdHNfdG9fc2tpcAorCisgICAgZGVmIHRlc3Rf
ZXhwZWN0YXRpb25zKHNlbGYpOgorICAgICAgICAjIFRoZSBXZWJLaXQgbWFjIHBvcnQgdXNlcyBh
IGNvbWJpbmF0aW9uIG9mIGEgdGVzdF9leHBlY3RhdGlvbnMgZmlsZQorICAgICAgICAjIGFuZCAn
U2tpcHBlZCcgZmlsZXMuCisgICAgICAgIGV4cGVjdGF0aW9uc19maWxlID0gc2VsZi5wYXRoX3Rv
X3Rlc3RfZXhwZWN0YXRpb25zX2ZpbGUoKQorICAgICAgICBleHBlY3RhdGlvbnMgPSBmaWxlKGV4
cGVjdGF0aW9uc19maWxlLCAiciIpLnJlYWQoKQorICAgICAgICByZXR1cm4gZXhwZWN0YXRpb25z
ICsgc2VsZi5fc2tpcHMoKQorCisgICAgZGVmIF9za2lwcyhzZWxmKToKKyAgICAgICAgIyBFYWNo
IFNraXBwZWQgZmlsZSBjb250YWlucyBhIGxpc3Qgb2YgZmlsZXMKKyAgICAgICAgIyBvciBkaXJl
Y3RvcmllcyB0byBiZSBza2lwcGVkIGR1cmluZyB0aGUgdGVzdCBydW4uIFRoZSB0b3RhbCBsaXN0
CisgICAgICAgICMgb2YgdGVzdHMgdG8gc2tpcHBlZCBpcyBnaXZlbiBieSB0aGUgY29udGVudHMg
b2YgdGhlIGdlbmVyaWMKKyAgICAgICAgIyBTa2lwcGVkIGZpbGUgZm91bmQgaW4gcGxhdGZvcm0v
WCBwbHVzIGEgdmVyc2lvbi1zcGVjaWZpYyBmaWxlCisgICAgICAgICMgZm91bmQgaW4gcGxhdGZv
cm0vWC12ZXJzaW9uLiBEdXBsaWNhdGUgZW50cmllcyBhcmUgYWxsb3dlZC4KKyAgICAgICAgIyBU
aGlzIHJvdXRpbmUgcmVhZHMgdGhvc2UgZmlsZXMgYW5kIHR1cm5zIGNvbnRlbnRzIGludG8gdGhl
CisgICAgICAgICMgZm9ybWF0IGV4cGVjdGVkIGJ5IHRlc3RfZXhwZWN0YXRpb25zLgorCisgICAg
ICAgICMgVXNlIGEgc2V0IHRvIGFsbG93IGR1cGxpY2F0ZXMKKyAgICAgICAgdGVzdHNfdG9fc2tp
cCA9IHNldChzZWxmLl9leHBlY3RhdGlvbnNfZnJvbV9za2lwcGVkX2ZpbGVzKCkpCisKKyAgICAg
ICAgdGVzdHNfdG9fc2tpcC51cGRhdGUoc2VsZi5fdGVzdHNfZm9yX290aGVyX3BsYXRmb3Jtcygp
KQorICAgICAgICB0ZXN0c190b19za2lwLnVwZGF0ZShzZWxmLl90ZXN0c19mb3JfZGlzYWJsZWRf
ZmVhdHVyZXMoKSkKKyAgICAgICAgc2tpcF9saW5lcyA9IG1hcChsYW1iZGEgdGVzdF9wYXRoOiAi
QlVHX1NLSVBQRUQgU0tJUCA6ICVzID0gRkFJTCIgJQorICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICB0ZXN0X3BhdGgsIHRlc3RzX3RvX3NraXApCisgICAgICAgIHJldHVybiAiXG4iLmpv
aW4oc2tpcF9saW5lcykKKworICAgIGRlZiB0ZXN0X3BsYXRmb3JtX25hbWUoc2VsZik6CisgICAg
ICAgIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoJ1dlYktpdFBvcnQudGVzdF9wbGF0Zm9ybV9u
YW1lJykKKworICAgIGRlZiB0ZXN0X3BsYXRmb3JtX25hbWVzKHNlbGYpOgorICAgICAgICByZXR1
cm4gc2VsZi50ZXN0X2Jhc2VfcGxhdGZvcm1fbmFtZXMoKSArICgKKyAgICAgICAgICAgICdtYWMt
dGlnZXInLCAnbWFjLWxlb3BhcmQnLCAnbWFjLXNub3dsZW9wYXJkJykKKworICAgIGRlZiB2ZXJz
aW9uKHNlbGYpOgorICAgICAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKCdXZWJLaXRQb3J0
LnZlcnNpb24nKQorCisgICAgZGVmIGRlZmF1bHRfY29uZmlndXJhdGlvbihzZWxmKToKKyAgICAg
ICAgIyBUaGlzIGlzIGEgYml0IG9mIGEgaGFjay4gVGhpcyBzdGF0ZSBleGlzdHMgaW4gYSBtdWNo
IG5pY2VyIGZvcm0gaW4KKyAgICAgICAgIyBwZXJsLWxhbmQuCisgICAgICAgIGNvbmZpZ3VyYXRp
b24gPSBvc3BhdGgucmVscGF0aCgKKyAgICAgICAgICAgIHNlbGYuX3dlYmtpdF9idWlsZF9kaXJl
Y3RvcnkoWyItLWNvbmZpZ3VyYXRpb24iXSksCisgICAgICAgICAgICBzZWxmLl93ZWJraXRfYnVp
bGRfZGlyZWN0b3J5KFsiLS10b3AtbGV2ZWwiXSkpCisgICAgICAgIGFzc2VydChjb25maWd1cmF0
aW9uID09ICJEZWJ1ZyIgb3IgY29uZmlndXJhdGlvbiA9PSAiUmVsZWFzZSIpCisgICAgICAgIHJl
dHVybiBjb25maWd1cmF0aW9uCisKKyAgICBkZWYgX3dlYmtpdF9idWlsZF9kaXJlY3Rvcnkoc2Vs
ZiwgYXJncyk6CisgICAgICAgIGFyZ3MgPSBbc2VsZi5zY3JpcHRfcGF0aCgid2Via2l0LWJ1aWxk
LWRpcmVjdG9yeSIpXSArIGFyZ3MKKyAgICAgICAgcmV0dXJuIHNlbGYuX2V4ZWN1dGl2ZS5ydW5f
Y29tbWFuZChhcmdzKS5yc3RyaXAoKQorCisgICAgZGVmIF9idWlsZF9wYXRoKHNlbGYsICpjb21w
cyk6CisgICAgICAgIGlmIG5vdCBzZWxmLl9jYWNoZWRfYnVpbGRfcm9vdDoKKyAgICAgICAgICAg
IHNlbGYuX2NhY2hlZF9idWlsZF9yb290ID0gc2VsZi5fd2Via2l0X2J1aWxkX2RpcmVjdG9yeShb
Ii0tdG9wLWxldmVsIl0pCisgICAgICAgIHJldHVybiBvcy5wYXRoLmpvaW4oc2VsZi5fY2FjaGVk
X2J1aWxkX3Jvb3QsIHNlbGYuX29wdGlvbnMuY29uZmlndXJhdGlvbiwKKyAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAqY29tcHMpCisKKyAgICBkZWYgX3BhdGhfdG9fZHJpdmVyKHNlbGYpOgor
ICAgICAgICByZXR1cm4gc2VsZi5fYnVpbGRfcGF0aCgnRHVtcFJlbmRlclRyZWUnKQorCisgICAg
ZGVmIF9wYXRoX3RvX2hlbHBlcihzZWxmKToKKyAgICAgICAgcmV0dXJuIE5vbmUKKworICAgIGRl
ZiBfcGF0aF90b19pbWFnZV9kaWZmKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5fYnVpbGRf
cGF0aCgnSW1hZ2VEaWZmJykKKworICAgIGRlZiBfcGF0aF90b193ZGlmZihzZWxmKToKKyAgICAg
ICAgIyBGSVhNRTogVGhpcyBkb2VzIG5vdCBleGlzdCBvbiBhIGRlZmF1bHQgTWFjIE9TIFggTGVv
cGFyZCBpbnN0YWxsLgorICAgICAgICByZXR1cm4gJ3dkaWZmJworCisKK2NsYXNzIFdlYktpdERy
aXZlcihiYXNlLkRyaXZlcik6CisgICAgIiIiV2ViS2l0IGltcGxlbWVudGF0aW9uIG9mIHRoZSBE
dW1wUmVuZGVyVHJlZSBpbnRlcmZhY2UuIiIiCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgcG9y
dCwgaW1hZ2VfcGF0aCwgZHJpdmVyX29wdGlvbnMpOgorICAgICAgICBzZWxmLl9wb3J0ID0gcG9y
dAorICAgICAgICBzZWxmLl9kcml2ZXJfb3B0aW9ucyA9IGRyaXZlcl9vcHRpb25zCisgICAgICAg
IHNlbGYuX2ltYWdlX3BhdGggPSBpbWFnZV9wYXRoCisKKyAgICAgICAgY29tbWFuZCA9IFtdCisg
ICAgICAgICMgSG9vayBmb3IgaW5qZWN0aW5nIHZhbGdyaW5kIG9yIG90aGVyIHJ1bnRpbWUgaW5z
dHJ1bWVudGF0aW9uLAorICAgICAgICAjIHVzZWQgYnkgZS5nLiB0b29scy92YWxncmluZC92YWxn
cmluZF90ZXN0cy5weS4KKyAgICAgICAgd3JhcHBlciA9IG9zLmVudmlyb24uZ2V0KCJCUk9XU0VS
X1dSQVBQRVIiLCBOb25lKQorICAgICAgICBpZiB3cmFwcGVyICE9IE5vbmU6CisgICAgICAgICAg
ICBjb21tYW5kICs9IFt3cmFwcGVyXQorICAgICAgICBpZiBzZWxmLl9wb3J0Ll9vcHRpb25zLndy
YXBwZXI6CisgICAgICAgICAgICAjIFRoaXMgc3BsaXQoKSBpc24ndCByZWFsbHkgd2hhdCB3ZSB3
YW50IC0tIGl0IGluY29ycmVjdGx5IHdpbGwKKyAgICAgICAgICAgICMgc3BsaXQgcXVvdGVkIHN0
cmluZ3Mgd2l0aGluIHRoZSB3cmFwcGVyIGFyZ3VtZW50IC0tIGJ1dCBpbgorICAgICAgICAgICAg
IyBwcmFjdGljZSBpdCBzaG91bGRuJ3QgY29tZSB1cCBhbmQgdGhlIC0taGVscCBvdXRwdXQgd2Fy
bnMKKyAgICAgICAgICAgICMgYWJvdXQgaXQgYW55d2F5LgorICAgICAgICAgICAgIyBGSVhNRTog
VXNlIGEgcmVhbCBzaGVsbCBwYXJzZXIuCisgICAgICAgICAgICBjb21tYW5kICs9IHNlbGYuX29w
dGlvbnMud3JhcHBlci5zcGxpdCgpCisKKyAgICAgICAgY29tbWFuZCArPSBbcG9ydC5fcGF0aF90
b19kcml2ZXIoKSwgJy0nXQorCisgICAgICAgIGlmIGltYWdlX3BhdGg6CisgICAgICAgICAgICBj
b21tYW5kLmFwcGVuZCgnLS1waXhlbC10ZXN0cycpCisgICAgICAgIGVudmlyb25tZW50ID0gb3Mu
ZW52aXJvbgorICAgICAgICBlbnZpcm9ubWVudFsnRFlMRF9GUkFNRVdPUktfUEFUSCddID0gc2Vs
Zi5fcG9ydC5fYnVpbGRfcGF0aCgpCisgICAgICAgIHNlbGYuX3NlcnZlcl9wcm9jZXNzID0gc2Vy
dmVyX3Byb2Nlc3MuU2VydmVyUHJvY2VzcyhzZWxmLl9wb3J0LAorICAgICAgICAgICAgIkR1bXBS
ZW5kZXJUcmVlIiwgY29tbWFuZCwgZW52aXJvbm1lbnQpCisKKyAgICBkZWYgcG9sbChzZWxmKToK
KyAgICAgICAgcmV0dXJuIHNlbGYuX3NlcnZlcl9wcm9jZXNzLnBvbGwoKQorCisgICAgZGVmIHJl
c3RhcnQoc2VsZik6CisgICAgICAgIHNlbGYuX3NlcnZlcl9wcm9jZXNzLnN0b3AoKQorICAgICAg
ICBzZWxmLl9zZXJ2ZXJfcHJvY2Vzcy5zdGFydCgpCisgICAgICAgIHJldHVybgorCisgICAgZGVm
IHJldHVybmNvZGUoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLl9zZXJ2ZXJfcHJvY2Vzcy5y
ZXR1cm5jb2RlKCkKKworICAgICMgRklYTUU6IFRoaXMgZnVuY3Rpb24gaXMgaHVnZS4KKyAgICBk
ZWYgcnVuX3Rlc3Qoc2VsZiwgdXJpLCB0aW1lb3V0bXMsIGltYWdlX2hhc2gpOgorICAgICAgICBp
ZiB1cmkuc3RhcnRzd2l0aCgiZmlsZTovLy8iKToKKyAgICAgICAgICAgIGNvbW1hbmQgPSB1cmlb
NzpdCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBjb21tYW5kID0gdXJpCisKKyAgICAgICAg
aWYgaW1hZ2VfaGFzaDoKKyAgICAgICAgICAgIGNvbW1hbmQgKz0gIiciICsgaW1hZ2VfaGFzaAor
ICAgICAgICBjb21tYW5kICs9ICJcbiIKKworICAgICAgICAjIHBkYi5zZXRfdHJhY2UoKQorICAg
ICAgICBzZWxmLl9zZXJ2ZXJfcHJvY2Vzcy53cml0ZShjb21tYW5kKQorCisgICAgICAgIGhhdmVf
c2Vlbl9jb250ZW50X3R5cGUgPSBGYWxzZQorICAgICAgICBhY3R1YWxfaW1hZ2VfaGFzaCA9IE5v
bmUKKyAgICAgICAgb3V0cHV0ID0gJycKKyAgICAgICAgaW1hZ2UgPSAnJworCisgICAgICAgIHRp
bWVvdXQgPSBpbnQodGltZW91dG1zKSAvIDEwMDAuMAorICAgICAgICBkZWFkbGluZSA9IHRpbWUu
dGltZSgpICsgdGltZW91dAorICAgICAgICBsaW5lID0gc2VsZi5fc2VydmVyX3Byb2Nlc3MucmVh
ZF9saW5lKHRpbWVvdXQpCisgICAgICAgIHdoaWxlIChub3Qgc2VsZi5fc2VydmVyX3Byb2Nlc3Mu
dGltZWRfb3V0CisgICAgICAgICAgICAgICBhbmQgbm90IHNlbGYuX3NlcnZlcl9wcm9jZXNzLmNy
YXNoZWQKKyAgICAgICAgICAgICAgIGFuZCBsaW5lLnJzdHJpcCgpICE9ICIjRU9GIik6CisgICAg
ICAgICAgICBpZiAobGluZS5zdGFydHN3aXRoKCdDb250ZW50LVR5cGU6JykgYW5kIG5vdAorICAg
ICAgICAgICAgICAgIGhhdmVfc2Vlbl9jb250ZW50X3R5cGUpOgorICAgICAgICAgICAgICAgIGhh
dmVfc2Vlbl9jb250ZW50X3R5cGUgPSBUcnVlCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAg
ICAgICAgIG91dHB1dCArPSBsaW5lCisgICAgICAgICAgICBsaW5lID0gc2VsZi5fc2VydmVyX3By
b2Nlc3MucmVhZF9saW5lKHRpbWVvdXQpCisgICAgICAgICAgICB0aW1lb3V0ID0gZGVhZGxpbmUg
LSB0aW1lLnRpbWUoKQorCisgICAgICAgICMgTm93IHJlYWQgYSBzZWNvbmQgYmxvY2sgb2YgdGV4
dCBmb3IgdGhlIG9wdGlvbmFsIGltYWdlIGRhdGEKKyAgICAgICAgcmVtYWluaW5nX2xlbmd0aCA9
IC0xCisgICAgICAgIEhBU0hfSEVBREVSID0gJ0FjdHVhbEhhc2g6ICcKKyAgICAgICAgTEVOR1RI
X0hFQURFUiA9ICdDb250ZW50LUxlbmd0aDogJworICAgICAgICBsaW5lID0gc2VsZi5fc2VydmVy
X3Byb2Nlc3MucmVhZF9saW5lKHRpbWVvdXQpCisgICAgICAgIHdoaWxlIChub3Qgc2VsZi5fc2Vy
dmVyX3Byb2Nlc3MudGltZWRfb3V0CisgICAgICAgICAgICAgICBhbmQgbm90IHNlbGYuX3NlcnZl
cl9wcm9jZXNzLmNyYXNoZWQKKyAgICAgICAgICAgICAgIGFuZCBsaW5lLnJzdHJpcCgpICE9ICIj
RU9GIik6CisgICAgICAgICAgICBpZiBsaW5lLnN0YXJ0c3dpdGgoSEFTSF9IRUFERVIpOgorICAg
ICAgICAgICAgICAgIGFjdHVhbF9pbWFnZV9oYXNoID0gbGluZVtsZW4oSEFTSF9IRUFERVIpOl0u
c3RyaXAoKQorICAgICAgICAgICAgZWxpZiBsaW5lLnN0YXJ0c3dpdGgoJ0NvbnRlbnQtVHlwZTon
KToKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICBlbGlmIGxpbmUuc3RhcnRzd2l0
aChMRU5HVEhfSEVBREVSKToKKyAgICAgICAgICAgICAgICB0aW1lb3V0ID0gZGVhZGxpbmUgLSB0
aW1lLnRpbWUoKQorICAgICAgICAgICAgICAgIGNvbnRlbnRfbGVuZ3RoID0gaW50KGxpbmVbbGVu
KExFTkdUSF9IRUFERVIpOl0pCisgICAgICAgICAgICAgICAgaW1hZ2UgPSBzZWxmLl9zZXJ2ZXJf
cHJvY2Vzcy5yZWFkKHRpbWVvdXQsIGNvbnRlbnRfbGVuZ3RoKQorICAgICAgICAgICAgdGltZW91
dCA9IGRlYWRsaW5lIC0gdGltZS50aW1lKCkKKyAgICAgICAgICAgIGxpbmUgPSBzZWxmLl9zZXJ2
ZXJfcHJvY2Vzcy5yZWFkX2xpbmUodGltZW91dCkKKworICAgICAgICBpZiBzZWxmLl9pbWFnZV9w
YXRoIGFuZCBsZW4oc2VsZi5faW1hZ2VfcGF0aCk6CisgICAgICAgICAgICBpbWFnZV9maWxlID0g
ZmlsZShzZWxmLl9pbWFnZV9wYXRoLCAid2IiKQorICAgICAgICAgICAgaW1hZ2VfZmlsZS53cml0
ZShpbWFnZSkKKyAgICAgICAgICAgIGltYWdlX2ZpbGUuY2xvc2UoKQorICAgICAgICByZXR1cm4g
KHNlbGYuX3NlcnZlcl9wcm9jZXNzLmNyYXNoZWQsCisgICAgICAgICAgICAgICAgc2VsZi5fc2Vy
dmVyX3Byb2Nlc3MudGltZWRfb3V0LAorICAgICAgICAgICAgICAgIGFjdHVhbF9pbWFnZV9oYXNo
LAorICAgICAgICAgICAgICAgIG91dHB1dCwKKyAgICAgICAgICAgICAgICBzZWxmLl9zZXJ2ZXJf
cHJvY2Vzcy5lcnJvcikKKworICAgIGRlZiBzdG9wKHNlbGYpOgorICAgICAgICBpZiBzZWxmLl9z
ZXJ2ZXJfcHJvY2VzczoKKyAgICAgICAgICAgIHNlbGYuX3NlcnZlcl9wcm9jZXNzLnN0b3AoKQor
ICAgICAgICAgICAgc2VsZi5fc2VydmVyX3Byb2Nlc3MgPSBOb25lCmRpZmYgLS1naXQgYS9XZWJL
aXRUb29scy9TY3JpcHRzL3dlYmtpdHB5L2xheW91dF90ZXN0cy9wb3J0L3dlYnNvY2tldF9zZXJ2
ZXIucHkgYi9XZWJLaXRUb29scy9TY3JpcHRzL3dlYmtpdHB5L2xheW91dF90ZXN0cy9wb3J0L3dl
YnNvY2tldF9zZXJ2ZXIucHkKaW5kZXggYjI4MzVmNy4uMjA4NzkyMSAxMDA2NDQKLS0tIGEvV2Vi
S2l0VG9vbHMvU2NyaXB0cy93ZWJraXRweS9sYXlvdXRfdGVzdHMvcG9ydC93ZWJzb2NrZXRfc2Vy
dmVyLnB5CisrKyBiL1dlYktpdFRvb2xzL1NjcmlwdHMvd2Via2l0cHkvbGF5b3V0X3Rlc3RzL3Bv
cnQvd2Vic29ja2V0X3NlcnZlci5weQpAQCAtMjUwLDYgKzI1MCw3IEBAIGNsYXNzIFB5V2ViU29j
a2V0KGh0dHBfc2VydmVyLkxpZ2h0dHBkKToKICAgICAgICAgICAgICAgICAnRmFpbGVkIHRvIGZp
bmQgJXMgc2VydmVyIHBpZC4nICUgc2VsZi5fc2VydmVyX25hbWUpCiAKICAgICAgICAgX2xvZy5k
ZWJ1ZygnU2h1dHRpbmcgZG93biAlcyBzZXJ2ZXIgJWQuJyAlIChzZWxmLl9zZXJ2ZXJfbmFtZSwg
cGlkKSkKKyAgICAgICAgIyBGSVhNRTogV2Ugc2hvdWxkbid0IGJlIGNhbGxpbmcgYSBwcm90ZWN0
ZWQgbWV0aG9kIG9mIHRoZSBwb3J0X29iaiEKICAgICAgICAgc2VsZi5fcG9ydF9vYmouX2tpbGxf
cHJvY2VzcyhwaWQpCiAKICAgICAgICAgaWYgc2VsZi5fcHJvY2VzczoK
</data>

          </attachment>
      

    </bug>

</bugzilla>