<?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>37418</bug_id>
          
          <creation_ts>2010-04-11 15:09:49 -0700</creation_ts>
          <short_desc>Add experimental prototype Rietveld integration to webkit-patch upload</short_desc>
          <delta_ts>2010-04-13 21:26:56 -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>
          
          
          <everconfirmed>1</everconfirmed>
          <reporter name="Adam Barth">abarth</reporter>
          <assigned_to name="Nobody">webkit-unassigned</assigned_to>
          <cc>cjerdonek</cc>
    
    <cc>eric</cc>
    
    <cc>ojan</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>211436</commentid>
    <comment_count>0</comment_count>
    <who name="Adam Barth">abarth</who>
    <bug_when>2010-04-11 15:09:49 -0700</bug_when>
    <thetext>Add experimental prototype Rietveld integration to webkit-patch upload</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>211437</commentid>
    <comment_count>1</comment_count>
      <attachid>53113</attachid>
    <who name="Adam Barth">abarth</who>
    <bug_when>2010-04-11 15:13:05 -0700</bug_when>
    <thetext>Created attachment 53113
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>211438</commentid>
    <comment_count>2</comment_count>
      <attachid>53113</attachid>
    <who name="Adam Barth">abarth</who>
    <bug_when>2010-04-11 15:14:02 -0700</bug_when>
    <thetext>Comment on attachment 53113
Patch

Let me try a slightly tweak.  One sec.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>211439</commentid>
    <comment_count>3</comment_count>
      <attachid>53114</attachid>
    <who name="Adam Barth">abarth</who>
    <bug_when>2010-04-11 15:19:47 -0700</bug_when>
    <thetext>Created attachment 53114
Patch

Feel free to provide comments at https://codereview.appspot.com/818047</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>211440</commentid>
    <comment_count>4</comment_count>
    <who name="Chris Jerdonek">cjerdonek</who>
    <bug_when>2010-04-11 15:40:03 -0700</bug_when>
    <thetext>(In reply to comment #3)
&gt; Created an attachment (id=53114) [details]
&gt; Patch
&gt; 
&gt; Feel free to provide comments at https://codereview.appspot.com/818047

Was this posted via the code itself?  It looks like only part of the patch got posted, or maybe part of a diff of a later patch of this report with an earlier patch.  Otherwise I would review it there.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>211445</commentid>
    <comment_count>5</comment_count>
    <who name="Adam Barth">abarth</who>
    <bug_when>2010-04-11 16:02:12 -0700</bug_when>
    <thetext>&gt; Was this posted via the code itself?

Yes.

&gt; It looks like only part of the patch got
&gt; posted, or maybe part of a diff of a later patch of this report with an earlier
&gt; patch.  Otherwise I would review it there.

Yeah, it seems to be diffing against the index instead of against HEAD.  I&apos;ll have to look into that, although I&apos;d like to do that in a second iteration.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>211457</commentid>
    <comment_count>6</comment_count>
    <who name="Chris Jerdonek">cjerdonek</who>
    <bug_when>2010-04-11 16:53:33 -0700</bug_when>
    <thetext>(In reply to comment #3)
&gt; Created an attachment (id=53114) [details]
&gt; Patch

Thanks for getting the ball rolling on this, Adam!  It&apos;s amazing you were able to do this with so little code.

Here are some quick, random reactions rather than a review.  I haven&apos;t looked much at the webkit-patch code before, so some (though not all) of these comments may be somewhat speculative.

--- a/WebKitTools/Scripts/webkitpy/common/config/__init__.py
+++ b/WebKitTools/Scripts/webkitpy/common/config/__init__.py
@@ -1 +1,7 @@
 # Required for Python to search this directory for module files
+
+import re
+
+codereview_server_host = &quot;codereview.appspot.com&quot;
+codereview_server_regex = &quot;https?://%s/&quot; % re.sub(&apos;\.&apos;, &apos;\\.&apos;, codereview_server_host)
+codereview_server_url = &quot;https://%s/&quot; % codereview_server_host

Until we figure out how we want to use our __init__ files, I would recommend leaving the file empty and putting this information in a separate file.  Also, I&apos;ve mentioned this before, but I have mixed feelings about putting settings for a range of areas in a single config folder because it increases the number of couplings.  I think it might be better, for example, to put Rietveld-related settings in a rietveld/ folder.  To illustrate with another example, I think putting style settings like these in the config folder would make the style code harder to understand and maintain:

http://trac.webkit.org/browser/trunk/WebKitTools/Scripts/webkitpy/style/checker.py?rev=57119#L71

Keeping the settings close to the code where they&apos;re used (but clearly separated off) would I think be easier.  We can always expose parameters on the API that allow values other than the settings to be passed in, for more flexibility, etc.  That approach would also make it a bit simpler to drop new functionality in and out.

b/WebKitTools/Scripts/webkitpy/common/net/rietveld.py
new file mode 100644

+from webkitpy.common.system.deprecated_logging import log
+from webkitpy.common.system.executive import ScriptError

Should we still be using deprecated_logging in new code?

b/WebKitTools/Scripts/webkitpy/thirdparty/rietveld/__init__.py
new file mode 100644
+# Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at

Is the Apache license compatible with the WebKit project?  I once asked re: Apache 1.1 on webkit-dev, but never got a response:

https://lists.webkit.org/pipermail/webkit-dev/2010-January/011461.html

diff --git a/WebKitTools/Scripts/webkitpy/tool/commands/queues_unittest.py b/WebKitTools/Scripts/webkitpy/tool/commands/queues_unittest.py
index a425e90..24b4ef7 100644
--- a/WebKitTools/Scripts/webkitpy/tool/commands/queues_unittest.py
+++ b/WebKitTools/Scripts/webkitpy/tool/commands/queues_unittest.py
@@ -68,6 +68,7 @@ class AbstractQueueTest(CommandsTest):
     def _assert_run_webkit_patch(self, run_args):
         queue = TestQueue()
         tool = MockTool()
+        tool.executive = Mock()
         queue.bind_to_tool(tool)
 
See remarks below.

diff --git a/WebKitTools/Scripts/webkitpy/tool/main.py b/WebKitTools/Scripts/webkitpy/tool/main.py
index 629e86f..dd7652d 100755
--- a/WebKitTools/Scripts/webkitpy/tool/main.py
+++ b/WebKitTools/Scripts/webkitpy/tool/main.py
@@ -36,6 +36,7 @@ from webkitpy.common.checkout.api import Checkout
 from webkitpy.common.checkout.scm import detect_scm_system
 from webkitpy.common.net.bugzilla import Bugzilla
 from webkitpy.common.net.buildbot import BuildBot
+from webkitpy.common.net.rietveld import Rietveld
 from webkitpy.common.net.irc.ircproxy import IRCProxy
 from webkitpy.common.system.executive import Executive
 from webkitpy.common.system.user import User
@@ -70,6 +71,7 @@ class WebKitPatch(MultiCommandTool):
         self._scm = None
         self._checkout = None
         self.status_server = StatusServer()
+        self.codereview = Rietveld(self.executive)

Given that WebKitPatch is meant to be a generic all-purpose tool, I wonder if there&apos;s a way to design things so the class doesn&apos;t itself have to be aware of all its capabilities a priori (e.g. if there is some sort of generic pass-through design where you can add more functionality to WebKitPatch without having to change its class structure/attributes each time).
 
@@ -488,13 +490,18 @@ class MockStatusServer(object):
         return 191
 
 
+class MockExecute(Mock):
+    def run_and_throw_if_fail(self, args, quiet=False):
+        return &quot;MOCK output of child process&quot;
+
+
 class MockTool():
 
     def __init__(self, log_executive=False):
         self.wakeup_event = threading.Event()
         self.bugs = MockBugzilla()
         self.buildbot = MockBuildBot()
-        self.executive = Mock()
+        self.executive = MockExecute()
         if log_executive:
             self.executive.run_and_throw_if_fail = lambda args: log(&quot;MOCK run_and_throw_if_fail: %s&quot; % args)
         self._irc = None
@@ -503,6 +510,7 @@ class MockTool():
         self._checkout = MockCheckout()
         self.status_server = MockStatusServer()
         self.irc_password = &quot;MOCK irc password&quot;
+        self.codereview = Rietveld(self.executive)

Same remark here as above re: knowing about all its capabilities. 

Also, what&apos;s the rationale for using MockExecute() here but Mock() in queues_unittest.py?  It seems like another approach could be to make MockTool the &quot;bare bones&quot; object, and then add more complex values for the data attributes as needed to test particular functionality.  With the queues_unittest change above, it seems like the reverse might be happening, where you are obscuring previously set attributes with simpler variants.  It seems like keeping things simpler by default may result in fewer changes to dependent tests going forward.

+class PostCodeReview(AbstractStep):
+    @classmethod
+    def options(cls):
+        return [
+            Options.cc,
+            Options.description,
+            Options.fancy_review,
+            Options.review,
+        ]
+
+    def run(self, state):
+        if not self._options.fancy_review:
+            return
+        if not self._options.review:
+            return
+        # FIXME: This will always be None because we don&apos;t retrieve the issue
+        #        number frmo the ChangeLog yet.
+        codereview_issue = state.get(&quot;codereview_issue&quot;)

Where is this string coming from -- is there a way to avoid having it hard-coded in more than one spot?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>211458</commentid>
    <comment_count>7</comment_count>
    <who name="Adam Barth">abarth</who>
    <bug_when>2010-04-11 17:09:41 -0700</bug_when>
    <thetext>All good comments, thanks.

&gt; Thanks for getting the ball rolling on this, Adam!  It&apos;s amazing you were able
&gt; to do this with so little code.

We have lots of infrastructure now that makes adding features pretty easy.

&gt; +++ b/WebKitTools/Scripts/webkitpy/common/config/__init__.py

&gt; Until we figure out how we want to use our __init__ files, I would recommend
&gt; leaving the file empty and putting this information in a separate file.

Ok.  Maybe servers.py in the config folder?  I tried that with the irc settings, but its slightly awkward to import:

import webkitpy.common.config.servers as config_servers

???

&gt;  Also,
&gt; I&apos;ve mentioned this before, but I have mixed feelings about putting settings
&gt; for a range of areas in a single config folder because it increases the number
&gt; of couplings.  I think it might be better, for example, to put Rietveld-related
&gt; settings in a rietveld/ folder.

For Bugzilla, we store this information directly in bugzilla.py, but there&apos;s a comment there that Eric added about wanting to move this to a more generic location.  I think Eric has the idea that someone might want to take webkitpy and use it for their own project.  They might want a central place to point all the URLs, etc, to the ones for their project.  I&apos;m not sure what&apos;s best here.

&gt; Should we still be using deprecated_logging in new code?

No, but I don&apos;t know how to use the real logging.  I need to read up more on it.

&gt; Is the Apache license compatible with the WebKit project?

My understanding is that it is because it&apos;s essentially the same as the BSD license.

&gt; Given that WebKitPatch is meant to be a generic all-purpose tool, I wonder if
&gt; there&apos;s a way to design things so the class doesn&apos;t itself have to be aware of
&gt; all its capabilities a priori (e.g. if there is some sort of generic
&gt; pass-through design where you can add more functionality to WebKitPatch without
&gt; having to change its class structure/attributes each time).

That would be nice.  We do something like that with commands and it works nicely.  We just haven&apos;t gotten around to build that for the main tool object.

&gt; Also, what&apos;s the rationale for using MockExecute() here but Mock() in
&gt; queues_unittest.py?

We could use MockExecutive in queues_unittest.  I could have just used None in that case (and maybe should have) because the method I&apos;m testing doesn&apos;t interact with the executive.

I eventually want to build a nice fancy MockExecutive and have more of the tool-related classes use that as their mock point instead of always mocking at the tool.  Rietveld is a bit of an experiment in that regard.  I just did the minimum necessary to make that work in this patch.

&gt; +        codereview_issue = state.get(&quot;codereview_issue&quot;)
&gt; 
&gt; Where is this string coming from -- is there a way to avoid having it
&gt; hard-coded in more than one spot?

The state dictionary is a bit of an experiment.  We probably should make it into an object and document it properly.  As the moment, this is a hook for future extension.  I wanted to do try remembering the issue number, but I wasn&apos;t sure of the bets design and so pushed it off to the next iteration.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>211863</commentid>
    <comment_count>8</comment_count>
      <attachid>53114</attachid>
    <who name="Adam Barth">abarth</who>
    <bug_when>2010-04-12 23:06:50 -0700</bug_when>
    <thetext>Comment on attachment 53114
Patch

Chris is right.  Apache is not a legit license.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>212143</commentid>
    <comment_count>9</comment_count>
      <attachid>53295</attachid>
    <who name="Ojan Vafai">ojan</who>
    <bug_when>2010-04-13 16:23:25 -0700</bug_when>
    <thetext>Created attachment 53295
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>212147</commentid>
    <comment_count>10</comment_count>
    <who name="Chris Jerdonek">cjerdonek</who>
    <bug_when>2010-04-13 16:29:16 -0700</bug_when>
    <thetext>(In reply to comment #9)
&gt; Created an attachment (id=53295) [details]
&gt; Patch

I don&apos;t see the actual autoinstall code in the patch.

+import webkitpy.thirdparty.autoinstalled.rietveld_upload as rietveld_upload

Could we autoinstall upload.py to this instead?

autoinstalled/rietveld/upload.py

This will preserve the original file name.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>212150</commentid>
    <comment_count>11</comment_count>
    <who name="Chris Jerdonek">cjerdonek</who>
    <bug_when>2010-04-13 16:35:49 -0700</bug_when>
    <thetext>(In reply to comment #10)
&gt; (In reply to comment #9)
&gt; &gt; Created an attachment (id=53295) [details] [details]
&gt; &gt; Patch
&gt; 
&gt; I don&apos;t see the actual autoinstall code in the patch.

Oh, I see the code now.  The file is just not mentioned in the ChangeLog.  You can look at the ircbot/irclib autoinstall code for an example of creating an intermediate directory.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>212159</commentid>
    <comment_count>12</comment_count>
      <attachid>53300</attachid>
    <who name="Ojan Vafai">ojan</who>
    <bug_when>2010-04-13 16:55:39 -0700</bug_when>
    <thetext>Created attachment 53300
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>212164</commentid>
    <comment_count>13</comment_count>
      <attachid>53300</attachid>
    <who name="David Levin">levin</who>
    <bug_when>2010-04-13 17:05:49 -0700</bug_when>
    <thetext>Comment on attachment 53300
Patch

&gt; diff --git a/WebKitTools/ChangeLog b/WebKitTools/ChangeLog
&gt; index 5f55f45..1ce3af2 100644
&gt; --- a/WebKitTools/ChangeLog
&gt; +++ b/WebKitTools/ChangeLog
&gt; @@ -1,3 +1,31 @@
&gt; +2010-04-13  Ojan Vafai  &lt;ojan@chromium.org&gt;
&gt; +
&gt; +        Reviewed by NOBODY (OOPS!).
&gt; +
&gt; +        Add experimental prototype Rietveld integration to webkit-patch upload
&gt; +        https://bugs.webkit.org/show_bug.cgi?id=37418
&gt; +
&gt; +        This patch adds bare-bones integrtion with Rietveld for code reviews.
&gt; +        The behavior is hidden behind the --fancy-review command line flag.
&gt; +        Currently, there&apos;s no support for uploading more than one patch per
&gt; +        issue (which is a nice feature of Rietveld).  The plan is to play with
&gt; +        this for a bit and see if it&apos;s useful.
&gt; +
&gt; +        Modified from Adam&apos;s original patch to autoinstall the rietveld upload script.
&gt; +
&gt; +        * Scripts/webkitpy/common/config/__init__.py:
&gt; +        * Scripts/webkitpy/common/net/rietveld.py: Added.
&gt; +        * Scripts/webkitpy/common/net/rietveld_unitttest.py: Added.
&gt; +        * Scripts/webkitpy/tool/commands/queues_unittest.py:
&gt; +        * Scripts/webkitpy/tool/commands/upload.py:
&gt; +        * Scripts/webkitpy/tool/commands/upload_unittest.py:
&gt; +        * Scripts/webkitpy/tool/main.py:
&gt; +        * Scripts/webkitpy/tool/mocktool.py:
&gt; +        * Scripts/webkitpy/tool/steps/__init__.py:
&gt; +        * Scripts/webkitpy/tool/steps/options.py:
&gt; +        * Scripts/webkitpy/tool/steps/postcodereview.py: Added.
&gt; +        * Scripts/webkitpy/tool/steps/postdiff.py:
&gt; +
&gt;  2010-04-13  Csaba OsztrogonÃ¡c  &lt;ossy@webkit.org&gt;
&gt;  
&gt;          Unreviewed buildfix after r57537.
&gt; diff --git a/WebKitTools/Scripts/webkitpy/common/config/__init__.py b/WebKitTools/Scripts/webkitpy/common/config/__init__.py
&gt; index ef65bee..03f1bc7 100644
&gt; --- a/WebKitTools/Scripts/webkitpy/common/config/__init__.py
&gt; +++ b/WebKitTools/Scripts/webkitpy/common/config/__init__.py
&gt; @@ -1 +1,7 @@
&gt;  # Required for Python to search this directory for module files
&gt; +
&gt; +import re
&gt; +
&gt; +codereview_server_host = &quot;wkrietveld.appspot.com&quot;
&gt; +codereview_server_regex = &quot;https?://%s/&quot; % re.sub(&apos;\.&apos;, &apos;\\.&apos;, codereview_server_host)
&gt; +codereview_server_url = &quot;https://%s/&quot; % codereview_server_host
&gt; diff --git a/WebKitTools/Scripts/webkitpy/common/net/rietveld.py b/WebKitTools/Scripts/webkitpy/common/net/rietveld.py
&gt; new file mode 100644
&gt; index 0000000..96ceb2b
&gt; --- /dev/null
&gt; +++ b/WebKitTools/Scripts/webkitpy/common/net/rietveld.py
&gt; @@ -0,0 +1,89 @@
&gt; +# Copyright (c) 2010 Google Inc. All rights reserved.
&gt; +#
&gt; +# Redistribution and use in source and binary forms, with or without
&gt; +# modification, are permitted provided that the following conditions are
&gt; +# met:
&gt; +#
&gt; +#     * Redistributions of source code must retain the above copyright
&gt; +# notice, this list of conditions and the following disclaimer.
&gt; +#     * Redistributions in binary form must reproduce the above
&gt; +# copyright notice, this list of conditions and the following disclaimer
&gt; +# in the documentation and/or other materials provided with the
&gt; +# distribution.
&gt; +#     * Neither the name of Google Inc. nor the names of its
&gt; +# contributors may be used to endorse or promote products derived from
&gt; +# this software without specific prior written permission.
&gt; +#
&gt; +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
&gt; +# &quot;AS IS&quot; AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
&gt; +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
&gt; +# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
&gt; +# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
&gt; +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
&gt; +# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
&gt; +# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
&gt; +# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
&gt; +# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
&gt; +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
&gt; +
&gt; +import os
&gt; +import re
&gt; +import stat
&gt; +
&gt; +import webkitpy.common.config as config
&gt; +from webkitpy.common.system.deprecated_logging import log
&gt; +from webkitpy.common.system.executive import ScriptError
&gt; +import webkitpy.thirdparty.autoinstalled.rietveld.upload as upload
&gt; +
&gt; +
&gt; +def parse_codereview_issue(message):
&gt; +    if not message:
&gt; +        return None
&gt; +    match = re.search(config.codereview_server_regex +
&gt; +                      &quot;(?P&lt;codereview_issue&gt;\d+)&quot;,
&gt; +                      message)
&gt; +    if match:
&gt; +        return int(match.group(&apos;codereview_issue&apos;))
&gt; +
&gt; +
&gt; +class Rietveld(object):
&gt; +    def __init__(self, executive, dryrun=False):
&gt; +        self.dryrun = dryrun
&gt; +        self._executive = executive
&gt; +        self._upload_py = upload.__file__
&gt; +        # Chop of the last character so we modify permissions on the py file instead of the pyc.
s/Chop of/Chop off/

&gt; +        if os.path.splitext(self._upload_py)[1] == &quot;.pyc&quot;:
&gt; +            self._upload_py = self._upload_py[:-1]
&gt; +        os.chmod(self._upload_py, os.stat(self._upload_py).st_mode | stat.S_IXUSR | stat.S_IXGRP | stat.S_IXOTH)
&gt; +
&gt; +    def url_for_issue(self, codereview_issue):
&gt; +        if not codereview_issue:
&gt; +            return None
&gt; +        return &quot;%s%s&quot; % (config.codereview_server_url, codereview_issue)
&gt; +
&gt; +    def post(self, message=None, codereview_issue=None, cc=None):
&gt; +        if not message:
&gt; +            raise ScriptError(&quot;Rietveld requires a message.&quot;)
&gt; +
&gt; +        args = [
&gt; +            self._upload_py,
&gt; +            &quot;--assume_yes&quot;,
&gt; +            &quot;--server=%s&quot; % config.codereview_server_host,
&gt; +            &quot;--message=%s&quot; % message,
&gt; +        ]
&gt; +        if codereview_issue:
&gt; +            args.append(&quot;--issue=%s&quot; % codereview_issue)
&gt; +        if cc:
&gt; +            args.append(&quot;--cc=%s&quot; % cc)
&gt; +
&gt; +        if self.dryrun:
&gt; +            log(&quot;Would have run %s&quot; % args)
&gt; +            return
&gt; +
&gt; +        output = self._executive.run_and_throw_if_fail(args)
&gt; +        match = re.search(&quot;Issue created\. URL: &quot; +
&gt; +                          config.codereview_server_regex +
&gt; +                          &quot;(?P&lt;codereview_issue&gt;\d+)&quot;,
&gt; +                          output)
&gt; +        if match:
&gt; +            return int(match.group(&apos;codereview_issue&apos;))
&gt; diff --git a/WebKitTools/Scripts/webkitpy/common/net/rietveld_unittest.py b/WebKitTools/Scripts/webkitpy/common/net/rietveld_unittest.py
&gt; new file mode 100644
&gt; index 0000000..da5e0f5
&gt; --- /dev/null
&gt; +++ b/WebKitTools/Scripts/webkitpy/common/net/rietveld_unittest.py
&gt; @@ -0,0 +1,39 @@
&gt; +# Copyright (c) 2010 Google Inc. All rights reserved.
&gt; +#
&gt; +# Redistribution and use in source and binary forms, with or without
&gt; +# modification, are permitted provided that the following conditions are
&gt; +# met:
&gt; +#
&gt; +#     * Redistributions of source code must retain the above copyright
&gt; +# notice, this list of conditions and the following disclaimer.
&gt; +#     * Redistributions in binary form must reproduce the above
&gt; +# copyright notice, this list of conditions and the following disclaimer
&gt; +# in the documentation and/or other materials provided with the
&gt; +# distribution.
&gt; +#     * Neither the name of Google Inc. nor the names of its
&gt; +# contributors may be used to endorse or promote products derived from
&gt; +# this software without specific prior written permission.
&gt; +#
&gt; +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
&gt; +# &quot;AS IS&quot; AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
&gt; +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
&gt; +# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
&gt; +# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
&gt; +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
&gt; +# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
&gt; +# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
&gt; +# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
&gt; +# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
&gt; +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
&gt; +
&gt; +import unittest
&gt; +
&gt; +from webkitpy.common.net.rietveld import Rietveld
&gt; +from webkitpy.thirdparty.mock import Mock
&gt; +
&gt; +
&gt; +class RietveldTest(unittest.TestCase):
&gt; +    def test_url_for_issue(self):
&gt; +        rietveld = Rietveld(Mock())
&gt; +        self.assertEqual(rietveld.url_for_issue(34223),
&gt; +                         &quot;https://codereview.appspot.com/34223&quot;)
&gt; diff --git a/WebKitTools/Scripts/webkitpy/thirdparty/__init__.py b/WebKitTools/Scripts/webkitpy/thirdparty/__init__.py
&gt; index 312da53..f1e5334 100644
&gt; --- a/WebKitTools/Scripts/webkitpy/thirdparty/__init__.py
&gt; +++ b/WebKitTools/Scripts/webkitpy/thirdparty/__init__.py
&gt; @@ -69,6 +69,13 @@ installer.install(url=&quot;http://pypi.python.org/packages/source/m/mechanize/mechan
&gt;  installer.install(url=&quot;http://pypi.python.org/packages/source/p/pep8/pep8-0.5.0.tar.gz#md5=512a818af9979290cd619cce8e9c2e2b&quot;,
&gt;                    url_subpath=&quot;pep8-0.5.0/pep8.py&quot;)
&gt;  
&gt; +
&gt; +rietveld_dir = os.path.join(autoinstalled_dir, &quot;rietveld&quot;)
&gt; +installer = AutoInstaller(target_dir=rietveld_dir)
&gt; +installer.install(url=&quot;http://webkit-rietveld.googlecode.com/svn/trunk/static/upload.py&quot;,
&gt; +                  target_name=&quot;upload.py&quot;)
&gt; +
&gt; +
&gt;  # Since irclib and ircbot are two top-level packages, we need to import
&gt;  # them separately.  We group them into an irc package for better
&gt;  # organization purposes.
&gt; diff --git a/WebKitTools/Scripts/webkitpy/tool/commands/queues_unittest.py b/WebKitTools/Scripts/webkitpy/tool/commands/queues_unittest.py
&gt; index 88a37f3..0906c70 100644
&gt; --- a/WebKitTools/Scripts/webkitpy/tool/commands/queues_unittest.py
&gt; +++ b/WebKitTools/Scripts/webkitpy/tool/commands/queues_unittest.py
&gt; @@ -71,6 +71,7 @@ class AbstractQueueTest(CommandsTest):
&gt;      def _assert_run_webkit_patch(self, run_args):
&gt;          queue = TestQueue()
&gt;          tool = MockTool()
&gt; +        tool.executive = Mock()
&gt;          queue.bind_to_tool(tool)
&gt;  
&gt;          queue.run_webkit_patch(run_args)
&gt; diff --git a/WebKitTools/Scripts/webkitpy/tool/commands/upload.py b/WebKitTools/Scripts/webkitpy/tool/commands/upload.py
&gt; index 6e68fbe..dd0ac13 100644
&gt; --- a/WebKitTools/Scripts/webkitpy/tool/commands/upload.py
&gt; +++ b/WebKitTools/Scripts/webkitpy/tool/commands/upload.py
&gt; @@ -164,6 +164,7 @@ class Post(AbstractPatchUploadingCommand):
&gt;      steps = [
&gt;          steps.CheckStyle,
&gt;          steps.ConfirmDiff,
&gt; +        steps.PostCodeReview,
&gt;          steps.ObsoletePatches,
&gt;          steps.PostDiff,
&gt;      ]
&gt; @@ -208,6 +209,7 @@ class Upload(AbstractPatchUploadingCommand):
&gt;          steps.PrepareChangeLog,
&gt;          steps.EditChangeLog,
&gt;          steps.ConfirmDiff,
&gt; +        steps.PostCodeReview,
&gt;          steps.ObsoletePatches,
&gt;          steps.PostDiff,
&gt;      ]
&gt; diff --git a/WebKitTools/Scripts/webkitpy/tool/commands/upload_unittest.py b/WebKitTools/Scripts/webkitpy/tool/commands/upload_unittest.py
&gt; index 4e987c9..9766e19 100644
&gt; --- a/WebKitTools/Scripts/webkitpy/tool/commands/upload_unittest.py
&gt; +++ b/WebKitTools/Scripts/webkitpy/tool/commands/upload_unittest.py
&gt; @@ -58,6 +58,7 @@ class UploadCommandsTest(CommandsTest):
&gt;          options.description = &quot;MOCK description&quot;
&gt;          options.request_commit = False
&gt;          options.review = True
&gt; +        options.cc = None
&gt;          expected_stderr = &quot;Running check-webkit-style\nObsoleting 2 old patches on bug 42\nMOCK add_patch_to_bug: bug_id=42, description=MOCK description, mark_for_review=True, mark_for_commit_queue=False, mark_for_landing=False\n-- Begin comment --\nNone\n-- End comment --\nMOCK: user.open_url: http://example.com/42\n&quot;
&gt;          self.assert_execute_outputs(Post(), [42], options=options, expected_stderr=expected_stderr)
&gt;  
&gt; @@ -77,6 +78,7 @@ class UploadCommandsTest(CommandsTest):
&gt;          options.description = &quot;MOCK description&quot;
&gt;          options.request_commit = False
&gt;          options.review = True
&gt; +        options.cc = None
&gt;          expected_stderr = &quot;Running check-webkit-style\nObsoleting 2 old patches on bug 42\nMOCK add_patch_to_bug: bug_id=42, description=MOCK description, mark_for_review=True, mark_for_commit_queue=False, mark_for_landing=False\n-- Begin comment --\nNone\n-- End comment --\nMOCK: user.open_url: http://example.com/42\n&quot;
&gt;          self.assert_execute_outputs(Upload(), [42], options=options, expected_stderr=expected_stderr)
&gt;  
&gt; diff --git a/WebKitTools/Scripts/webkitpy/tool/main.py b/WebKitTools/Scripts/webkitpy/tool/main.py
&gt; index 629e86f..dd7652d 100755
&gt; --- a/WebKitTools/Scripts/webkitpy/tool/main.py
&gt; +++ b/WebKitTools/Scripts/webkitpy/tool/main.py
&gt; @@ -36,6 +36,7 @@ from webkitpy.common.checkout.api import Checkout
&gt;  from webkitpy.common.checkout.scm import detect_scm_system
&gt;  from webkitpy.common.net.bugzilla import Bugzilla
&gt;  from webkitpy.common.net.buildbot import BuildBot
&gt; +from webkitpy.common.net.rietveld import Rietveld
&gt;  from webkitpy.common.net.irc.ircproxy import IRCProxy
&gt;  from webkitpy.common.system.executive import Executive
&gt;  from webkitpy.common.system.user import User
&gt; @@ -70,6 +71,7 @@ class WebKitPatch(MultiCommandTool):
&gt;          self._scm = None
&gt;          self._checkout = None
&gt;          self.status_server = StatusServer()
&gt; +        self.codereview = Rietveld(self.executive)
&gt;  
&gt;      def scm(self):
&gt;          # Lazily initialize SCM to not error-out before command line parsing (or when running non-scm commands).
&gt; @@ -121,6 +123,7 @@ class WebKitPatch(MultiCommandTool):
&gt;          if options.dry_run:
&gt;              self.scm().dryrun = True
&gt;              self.bugs.dryrun = True
&gt; +            self.codereview.dryrun = True
&gt;          if options.status_host:
&gt;              self.status_server.set_host(options.status_host)
&gt;          if options.irc_password:
&gt; diff --git a/WebKitTools/Scripts/webkitpy/tool/mocktool.py b/WebKitTools/Scripts/webkitpy/tool/mocktool.py
&gt; index 89fde6a..6e4b64f 100644
&gt; --- a/WebKitTools/Scripts/webkitpy/tool/mocktool.py
&gt; +++ b/WebKitTools/Scripts/webkitpy/tool/mocktool.py
&gt; @@ -33,6 +33,7 @@ from webkitpy.common.config.committers import CommitterList, Reviewer
&gt;  from webkitpy.common.checkout.commitinfo import CommitInfo
&gt;  from webkitpy.common.checkout.scm import CommitMessage
&gt;  from webkitpy.common.net.bugzilla import Bug, Attachment
&gt; +from webkitpy.common.net.rietveld import Rietveld
&gt;  from webkitpy.thirdparty.mock import Mock
&gt;  from webkitpy.common.system.deprecated_logging import log
&gt;  
&gt; @@ -43,6 +44,7 @@ def _id_to_object_dictionary(*objects):
&gt;          dictionary[thing[&quot;id&quot;]] = thing
&gt;      return dictionary
&gt;  
&gt; +# Testing
&gt;  
&gt;  # FIXME: The ids should be 1, 2, 3 instead of crazy numbers.
&gt;  
&gt; @@ -488,13 +490,18 @@ class MockStatusServer(object):
&gt;          return 191
&gt;  
&gt;  
&gt; +class MockExecute(Mock):
&gt; +    def run_and_throw_if_fail(self, args, quiet=False):
&gt; +        return &quot;MOCK output of child process&quot;
&gt; +
&gt; +
&gt;  class MockTool():
&gt;  
&gt;      def __init__(self, log_executive=False):
&gt;          self.wakeup_event = threading.Event()
&gt;          self.bugs = MockBugzilla()
&gt;          self.buildbot = MockBuildBot()
&gt; -        self.executive = Mock()
&gt; +        self.executive = MockExecute()
&gt;          if log_executive:
&gt;              self.executive.run_and_throw_if_fail = lambda args: log(&quot;MOCK run_and_throw_if_fail: %s&quot; % args)
&gt;          self._irc = None
&gt; @@ -503,6 +510,7 @@ class MockTool():
&gt;          self._checkout = MockCheckout()
&gt;          self.status_server = MockStatusServer()
&gt;          self.irc_password = &quot;MOCK irc password&quot;
&gt; +        self.codereview = Rietveld(self.executive)
&gt;  
&gt;      def scm(self):
&gt;          return self._scm
&gt; diff --git a/WebKitTools/Scripts/webkitpy/tool/steps/__init__.py b/WebKitTools/Scripts/webkitpy/tool/steps/__init__.py
&gt; index 8e8ab15..d59cdc5 100644
&gt; --- a/WebKitTools/Scripts/webkitpy/tool/steps/__init__.py
&gt; +++ b/WebKitTools/Scripts/webkitpy/tool/steps/__init__.py
&gt; @@ -44,6 +44,7 @@ from webkitpy.tool.steps.ensurebuildersaregreen import EnsureBuildersAreGreen
&gt;  from webkitpy.tool.steps.ensurelocalcommitifneeded import EnsureLocalCommitIfNeeded
&gt;  from webkitpy.tool.steps.obsoletepatches import ObsoletePatches
&gt;  from webkitpy.tool.steps.options import Options
&gt; +from webkitpy.tool.steps.postcodereview import PostCodeReview
&gt;  from webkitpy.tool.steps.postdiff import PostDiff
&gt;  from webkitpy.tool.steps.postdiffforcommit import PostDiffForCommit
&gt;  from webkitpy.tool.steps.postdiffforrevert import PostDiffForRevert
&gt; diff --git a/WebKitTools/Scripts/webkitpy/tool/steps/options.py b/WebKitTools/Scripts/webkitpy/tool/steps/options.py
&gt; index 40a6680..7f76f55 100644
&gt; --- a/WebKitTools/Scripts/webkitpy/tool/steps/options.py
&gt; +++ b/WebKitTools/Scripts/webkitpy/tool/steps/options.py
&gt; @@ -40,6 +40,7 @@ class Options(object):
&gt;      confirm = make_option(&quot;--no-confirm&quot;, action=&quot;store_false&quot;, dest=&quot;confirm&quot;, default=True, help=&quot;Skip confirmation steps.&quot;)
&gt;      description = make_option(&quot;-m&quot;, &quot;--description&quot;, action=&quot;store&quot;, type=&quot;string&quot;, dest=&quot;description&quot;, help=&quot;Description string for the attachment (default: \&quot;patch\&quot;)&quot;)
&gt;      email = make_option(&quot;--email&quot;, action=&quot;store&quot;, type=&quot;string&quot;, dest=&quot;email&quot;, help=&quot;Email address to use in ChangeLogs.&quot;)
&gt; +    fancy_review = make_option(&quot;--fancy-review&quot;, action=&quot;store_true&quot;, dest=&quot;fancy_review&quot;, default=False, help=&quot;(Experimental) Upload the patch to Rietveld code review tool.&quot;)
&gt;      force_clean = make_option(&quot;--force-clean&quot;, action=&quot;store_true&quot;, dest=&quot;force_clean&quot;, default=False, help=&quot;Clean working directory before applying patches (removes local changes and commits)&quot;)
&gt;      local_commit = make_option(&quot;--local-commit&quot;, action=&quot;store_true&quot;, dest=&quot;local_commit&quot;, default=False, help=&quot;Make a local commit for each applied patch&quot;)
&gt;      non_interactive = make_option(&quot;--non-interactive&quot;, action=&quot;store_true&quot;, dest=&quot;non_interactive&quot;, default=False, help=&quot;Never prompt the user, fail as fast as possible.&quot;)
&gt; diff --git a/WebKitTools/Scripts/webkitpy/tool/steps/postcodereview.py b/WebKitTools/Scripts/webkitpy/tool/steps/postcodereview.py
&gt; new file mode 100644
&gt; index 0000000..670ce6c
&gt; --- /dev/null
&gt; +++ b/WebKitTools/Scripts/webkitpy/tool/steps/postcodereview.py
&gt; @@ -0,0 +1,76 @@
&gt; +# Copyright (C) 2010 Google Inc. All rights reserved.
&gt; +#
&gt; +# Redistribution and use in source and binary forms, with or without
&gt; +# modification, are permitted provided that the following conditions are
&gt; +# met:
&gt; +#
&gt; +#     * Redistributions of source code must retain the above copyright
&gt; +# notice, this list of conditions and the following disclaimer.
&gt; +#     * Redistributions in binary form must reproduce the above
&gt; +# copyright notice, this list of conditions and the following disclaimer
&gt; +# in the documentation and/or other materials provided with the
&gt; +# distribution.
&gt; +#     * Neither the name of Google Inc. nor the names of its
&gt; +# contributors may be used to endorse or promote products derived from
&gt; +# this software without specific prior written permission.
&gt; +#
&gt; +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
&gt; +# &quot;AS IS&quot; AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
&gt; +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
&gt; +# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
&gt; +# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
&gt; +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
&gt; +# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
&gt; +# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
&gt; +# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
&gt; +# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
&gt; +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
&gt; +
&gt; +from webkitpy.tool.steps.abstractstep import AbstractStep
&gt; +from webkitpy.tool.steps.options import Options
&gt; +
&gt; +
&gt; +class PostCodeReview(AbstractStep):
&gt; +    @classmethod
&gt; +    def options(cls):
&gt; +        return [
&gt; +            Options.cc,
&gt; +            Options.description,
&gt; +            Options.fancy_review,
&gt; +            Options.review,
&gt; +        ]
&gt; +
&gt; +    def run(self, state):
&gt; +        if not self._options.fancy_review:
&gt; +            return
&gt; +        if not self._options.review:
&gt; +            return
&gt; +        # FIXME: This will always be None because we don&apos;t retrieve the issue
&gt; +        #        number frmo the ChangeLog yet.
typo: frmo

&gt; +        codereview_issue = state.get(&quot;codereview_issue&quot;)
&gt; +        message = self._options.description
&gt; +        if not message:
&gt; +            # If we have an issue number, then the message because the label

s/because/becomes/

&gt; +            # of the new patch. Otherwise, it becomes the title of the whole
&gt; +            # issue.
&gt; +            if codereview_issue:
&gt; +                message = &quot;Updated patch&quot;
&gt; +            elif state.get(&quot;bug_title&quot;):
&gt; +                # This is the common case for the the first &quot;upload&quot; command.
&gt; +                message = state.get(&quot;bug_title&quot;)
&gt; +            elif state.get(&quot;bug_id&quot;):
&gt; +                # This is the common case for the &quot;post&quot; command and
&gt; +                # subsequent runs of the &quot;upload&quot; command.  In this case,
&gt; +                # I&apos;d rather add the new patch to the existing issue, but
&gt; +                # that&apos;s not implemented yet.
&gt; +                message = &quot;Code review for %s&quot; % self._tool.bugs.bug_url_for_bug_id(state[&quot;bug_id&quot;])
&gt; +            else:
&gt; +                # Unreachable with our current commands, but we might hit
&gt; +                # this case if we support bug-less code reviews.
&gt; +                message = &quot;Code review&quot;
&gt; +        created_issue = self._tool.codereview.post(message=message,
&gt; +                                                   codereview_issue=codereview_issue,
&gt; +                                                   cc=self._options.cc)
&gt; +        if created_issue:
&gt; +            # FIXME: Record the issue number in the ChangeLog.
&gt; +            state[&quot;codereview_issue&quot;] = created_issue
&gt;</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>212178</commentid>
    <comment_count>14</comment_count>
    <who name="Ojan Vafai">ojan</who>
    <bug_when>2010-04-13 17:23:48 -0700</bug_when>
    <thetext>Committed r57552: &lt;http://trac.webkit.org/changeset/57552&gt;</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>212202</commentid>
    <comment_count>15</comment_count>
    <who name="Eric Seidel (no email)">eric</who>
    <bug_when>2010-04-13 21:20:09 -0700</bug_when>
    <thetext>======================================================================
FAIL: test_url_for_issue (webkitpy.common.net.rietveld_unittest.RietveldTest)
----------------------------------------------------------------------
Traceback (most recent call last):
  File &quot;/Projects/WebKit/WebKitTools/Scripts/webkitpy/common/net/rietveld_unittest.py&quot;, line 39, in test_url_for_issue
    &quot;https://codereview.appspot.com/34223&quot;)
AssertionError: &apos;https://wkrietveld.appspot.com/34223&apos; != &apos;https://codereview.appspot.com/34223&apos;

----------------------------------------------------------------------
Ran 369 tests in 2.627s

Looks like a new failure from this change.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>212206</commentid>
    <comment_count>16</comment_count>
      <attachid>53309</attachid>
    <who name="Eric Seidel (no email)">eric</who>
    <bug_when>2010-04-13 21:26:56 -0700</bug_when>
    <thetext>Created attachment 53309
Patch</thetext>
  </long_desc>
      
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>53113</attachid>
            <date>2010-04-11 15:13:05 -0700</date>
            <delta_ts>2010-04-11 15:14:44 -0700</delta_ts>
            <desc>Patch</desc>
            <filename>bug-37418-20100411151303.patch</filename>
            <type>text/plain</type>
            <size>83826</size>
            <attacher name="Adam Barth">abarth</attacher>
            
              <data encoding="base64">ZGlmZiAtLWdpdCBhL1dlYktpdFRvb2xzL0NoYW5nZUxvZyBiL1dlYktpdFRvb2xzL0NoYW5nZUxv
ZwppbmRleCA2ZWRiOGI5Li5mZmM4YjFkIDEwMDY0NAotLS0gYS9XZWJLaXRUb29scy9DaGFuZ2VM
b2cKKysrIGIvV2ViS2l0VG9vbHMvQ2hhbmdlTG9nCkBAIC0xLDMgKzEsMzAgQEAKKzIwMTAtMDQt
MTEgIEFkYW0gQmFydGggIDxhYmFydGhAd2Via2l0Lm9yZz4KKworICAgICAgICBSZXZpZXdlZCBi
eSBOT0JPRFkgKE9PUFMhKS4KKworICAgICAgICBBZGQgZXhwZXJpbWVudGFsIHByb3RvdHlwZSBS
aWV0dmVsZCBpbnRlZ3JhdGlvbiB0byB3ZWJraXQtcGF0Y2ggdXBsb2FkCisgICAgICAgIGh0dHBz
Oi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0zNzQxOAorCisgICAgICAgIFRoaXMg
cGF0Y2ggYWRkcyBiYXJlLWJvbmVzIGludGVncnRpb24gd2l0aCBSaWV0dmVsZCBmb3IgY29kZSBy
ZXZpZXdzLgorICAgICAgICBUaGUgYmVoYXZpb3IgaXMgaGlkZGVuIGJlaGluZCB0aGUgLS1mYW5j
eS1yZXZpZXcgY29tbWFuZCBsaW5lIGZsYWcuCisgICAgICAgIEN1cnJlbnRseSwgdGhlcmUncyBu
byBzdXBwb3J0IGZvciB1cGxvYWRpbmcgbW9yZSB0aGFuIG9uZSBwYXRjaCBwZXIKKyAgICAgICAg
aXNzdWUgKHdoaWNoIGlzIGEgbmljZSBmZWF0dXJlIG9mIFJpZXR2ZWxkKS4gIFRoZSBwbGFuIGlz
IHRvIHBsYXkgd2l0aAorICAgICAgICB0aGlzIGZvciBhIGJpdCBhbmQgc2VlIGlmIGl0J3MgdXNl
ZnVsLgorCisgICAgICAgICogU2NyaXB0cy93ZWJraXRweS9jb21tb24vY29uZmlnL19faW5pdF9f
LnB5OgorICAgICAgICAqIFNjcmlwdHMvd2Via2l0cHkvY29tbW9uL25ldC9yaWV0dmVsZC5weTog
QWRkZWQuCisgICAgICAgICogU2NyaXB0cy93ZWJraXRweS90aGlyZHBhcnR5L3JpZXR2ZWxkL19f
aW5pdF9fLnB5OiBBZGRlZC4KKyAgICAgICAgKiBTY3JpcHRzL3dlYmtpdHB5L3RoaXJkcGFydHkv
cmlldHZlbGQvdXBsb2FkLnB5OiBBZGRlZC4KKyAgICAgICAgKiBTY3JpcHRzL3dlYmtpdHB5L3Rv
b2wvY29tbWFuZHMvcXVldWVzX3VuaXR0ZXN0LnB5OgorICAgICAgICAqIFNjcmlwdHMvd2Via2l0
cHkvdG9vbC9jb21tYW5kcy91cGxvYWQucHk6CisgICAgICAgICogU2NyaXB0cy93ZWJraXRweS90
b29sL2NvbW1hbmRzL3VwbG9hZF91bml0dGVzdC5weToKKyAgICAgICAgKiBTY3JpcHRzL3dlYmtp
dHB5L3Rvb2wvbWFpbi5weToKKyAgICAgICAgKiBTY3JpcHRzL3dlYmtpdHB5L3Rvb2wvbW9ja3Rv
b2wucHk6CisgICAgICAgICogU2NyaXB0cy93ZWJraXRweS90b29sL3N0ZXBzL19faW5pdF9fLnB5
OgorICAgICAgICAqIFNjcmlwdHMvd2Via2l0cHkvdG9vbC9zdGVwcy9vcHRpb25zLnB5OgorICAg
ICAgICAqIFNjcmlwdHMvd2Via2l0cHkvdG9vbC9zdGVwcy9wb3N0Y29kZXJldmlldy5weTogQWRk
ZWQuCisgICAgICAgICogU2NyaXB0cy93ZWJraXRweS90b29sL3N0ZXBzL3Bvc3RkaWZmLnB5Ogor
CiAyMDEwLTA0LTEwICBBZGFtIEJhcnRoICA8YWJhcnRoQHdlYmtpdC5vcmc+CiAKICAgICAgICAg
UnViYmVyLXN0YW1wZWQgYnkgRXJpYyBTZWlkZWwuCmRpZmYgLS1naXQgYS9XZWJLaXRUb29scy9T
Y3JpcHRzL3dlYmtpdHB5L2NvbW1vbi9jb25maWcvX19pbml0X18ucHkgYi9XZWJLaXRUb29scy9T
Y3JpcHRzL3dlYmtpdHB5L2NvbW1vbi9jb25maWcvX19pbml0X18ucHkKaW5kZXggZWY2NWJlZS4u
MjIxOGYwMiAxMDA2NDQKLS0tIGEvV2ViS2l0VG9vbHMvU2NyaXB0cy93ZWJraXRweS9jb21tb24v
Y29uZmlnL19faW5pdF9fLnB5CisrKyBiL1dlYktpdFRvb2xzL1NjcmlwdHMvd2Via2l0cHkvY29t
bW9uL2NvbmZpZy9fX2luaXRfXy5weQpAQCAtMSArMSw3IEBACiAjIFJlcXVpcmVkIGZvciBQeXRo
b24gdG8gc2VhcmNoIHRoaXMgZGlyZWN0b3J5IGZvciBtb2R1bGUgZmlsZXMKKworaW1wb3J0IHJl
CisKK2NvZGVyZXZpZXdfc2VydmVyX2hvc3QgPSAiY29kZXJldmlldy5hcHBzcG90LmNvbSIKK2Nv
ZGVyZXZpZXdfc2VydmVyX3JlZ2V4ID0gImh0dHBzPzovLyVzLyIgJSByZS5zdWIoJ1wuJywgJ1xc
LicsIGNvZGVyZXZpZXdfc2VydmVyX2hvc3QpCitjb2RlcmV2aWV3X3NlcnZlcl91cmwgPSAiaHR0
cHM6Ly8lcy8iICUgY29kZXJldmlld19zZXJ2ZXJfaG9zdApkaWZmIC0tZ2l0IGEvV2ViS2l0VG9v
bHMvU2NyaXB0cy93ZWJraXRweS9jb21tb24vbmV0L3JpZXR2ZWxkLnB5IGIvV2ViS2l0VG9vbHMv
U2NyaXB0cy93ZWJraXRweS9jb21tb24vbmV0L3JpZXR2ZWxkLnB5Cm5ldyBmaWxlIG1vZGUgMTAw
NjQ0CmluZGV4IDAwMDAwMDAuLjBlMTNjOWUKLS0tIC9kZXYvbnVsbAorKysgYi9XZWJLaXRUb29s
cy9TY3JpcHRzL3dlYmtpdHB5L2NvbW1vbi9uZXQvcmlldHZlbGQucHkKQEAgLTAsMCArMSw4NiBA
QAorIyBDb3B5cmlnaHQgKGMpIDIwMTAgR29vZ2xlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4K
KyMKKyMgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywg
d2l0aCBvciB3aXRob3V0CisjIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0
aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKyMgbWV0OgorIworIyAgICAgKiBSZWRp
c3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdo
dAorIyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRp
c2NsYWltZXIuCisjICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJl
cHJvZHVjZSB0aGUgYWJvdmUKKyMgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRp
dGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorIyBpbiB0aGUgZG9jdW1lbnRhdGlv
biBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisjIGRpc3RyaWJ1dGlv
bi4KKyMgICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVz
IG9mIGl0cworIyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3Rl
IHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorIyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMg
cHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorIworIyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVE
IEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisjICJBUyBJUyIgQU5E
IEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisj
IExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFO
RCBGSVRORVNTIEZPUgorIyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4g
Tk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorIyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUg
TElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyMgU1BFQ0lBTCwg
RVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAor
IyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VT
OyBMT1NTIE9GIFVTRSwKKyMgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBU
SU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisjIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdI
RVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyMgKElOQ0xVRElO
RyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUg
VVNFCisjIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJ
VFkgT0YgU1VDSCBEQU1BR0UuCisKK2ltcG9ydCBvcworaW1wb3J0IHJlCisKK2ltcG9ydCB3ZWJr
aXRweS5jb21tb24uY29uZmlnIGFzIGNvbmZpZworZnJvbSB3ZWJraXRweS5jb21tb24uc3lzdGVt
LmRlcHJlY2F0ZWRfbG9nZ2luZyBpbXBvcnQgbG9nCitmcm9tIHdlYmtpdHB5LmNvbW1vbi5zeXN0
ZW0uZXhlY3V0aXZlIGltcG9ydCBTY3JpcHRFcnJvcgoraW1wb3J0IHdlYmtpdHB5LnRoaXJkcGFy
dHkucmlldHZlbGQgYXMgcmlldHZlbGQKKworCitkZWYgcGFyc2VfY29kZXJldmlld19pc3N1ZSht
ZXNzYWdlKToKKyAgICBpZiBub3QgbWVzc2FnZToKKyAgICAgICAgcmV0dXJuIE5vbmUKKyAgICBt
YXRjaCA9IHJlLnNlYXJjaChjb25maWcuY29kZXJldmlld19zZXJ2ZXJfcmVnZXggKworICAgICAg
ICAgICAgICAgICAgICAgICIoP1A8Y29kZXJldmlld19pc3N1ZT5cZCspIiwKKyAgICAgICAgICAg
ICAgICAgICAgICBtZXNzYWdlKQorICAgIGlmIG1hdGNoOgorICAgICAgICByZXR1cm4gaW50KG1h
dGNoLmdyb3VwKCdjb2RlcmV2aWV3X2lzc3VlJykpCisKKworY2xhc3MgUmlldHZlbGQob2JqZWN0
KToKKyAgICBkZWYgX19pbml0X18oc2VsZiwgZXhlY3V0aXZlLCBkcnlydW49RmFsc2UpOgorICAg
ICAgICBzZWxmLmRyeXJ1biA9IGRyeXJ1bgorICAgICAgICBzZWxmLl9leGVjdXRpdmUgPSBleGVj
dXRpdmUKKyAgICAgICAgc2VsZi5fdXBsb2FkX3B5ID0gb3MucGF0aC5qb2luKG9zLnBhdGguZGly
bmFtZShyaWV0dmVsZC5fX2ZpbGVfXyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAidXBsb2FkLnB5IikKKworICAgIGRlZiB1cmxfZm9yX2lzc3VlKHNlbGYsIGNvZGVy
ZXZpZXdfaXNzdWUpOgorICAgICAgICBpZiBub3QgY29kZXJldmlld19pc3N1ZToKKyAgICAgICAg
ICAgIHJldHVybiBOb25lCisgICAgICAgIHJldHVybiAiJXMiICUgKGNvbmZpZy5jb2RlcmV2aWV3
X3NlcnZlcl91cmwsIGNvZGVyZXZpZXdfaXNzdWUpCisKKyAgICBkZWYgcG9zdChzZWxmLCBtZXNz
YWdlPU5vbmUsIGNvZGVyZXZpZXdfaXNzdWU9Tm9uZSwgY2M9Tm9uZSk6CisgICAgICAgIGlmIG5v
dCBtZXNzYWdlOgorICAgICAgICAgICAgcmFpc2UgU2NyaXB0RXJyb3IoIlJpZXR2ZWxkIHJlcXVp
cmVzIGEgbWVzc2FnZS4iKQorCisgICAgICAgIGFyZ3MgPSBbCisgICAgICAgICAgICBzZWxmLl91
cGxvYWRfcHksCisgICAgICAgICAgICAiLS1hc3N1bWVfeWVzIiwKKyAgICAgICAgICAgICItLXF1
aWV0IiwKKyAgICAgICAgICAgICItLXNlcnZlcj0lcyIgJSBjb25maWcuY29kZXJldmlld19zZXJ2
ZXJfaG9zdCwKKyAgICAgICAgICAgICItLW1lc3NhZ2U9JXMiICUgbWVzc2FnZSwKKyAgICAgICAg
XQorICAgICAgICBpZiBjb2RlcmV2aWV3X2lzc3VlOgorICAgICAgICAgICAgYXJncy5hcHBlbmQo
Ii0taXNzdWU9JWQiICUgY29kZXJldmlld19pc3N1ZSkKKyAgICAgICAgaWYgY2M6CisgICAgICAg
ICAgICBhcmdzLmFwcGVuZCgiLS1jYz0lcyIgJSBjYykKKworICAgICAgICBpZiBzZWxmLmRyeXJ1
bjoKKyAgICAgICAgICAgIGxvZygiV291bGQgaGF2ZSBydW4gJXMiICUgYXJncykKKyAgICAgICAg
ICAgIHJldHVybgorCisgICAgICAgIG91dHB1dCA9IHNlbGYuX2V4ZWN1dGl2ZS5ydW5fYW5kX3Ro
cm93X2lmX2ZhaWwoYXJncykKKyAgICAgICAgbWF0Y2ggPSByZS5zZWFyY2goIklzc3VlIGNyZWF0
ZWRcLiBVUkw6ICIgKworICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maWcuY29kZXJldmll
d19zZXJ2ZXJfcmVnZXggKworICAgICAgICAgICAgICAgICAgICAgICAgICAiKD9QPGNvZGVyZXZp
ZXdfaXNzdWU+XGQrKSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dCkKKyAgICAg
ICAgaWYgbWF0Y2g6CisgICAgICAgICAgICByZXR1cm4gaW50KG1hdGNoLmdyb3VwKCdjb2RlcmV2
aWV3X2lzc3VlJykpCmRpZmYgLS1naXQgYS9XZWJLaXRUb29scy9TY3JpcHRzL3dlYmtpdHB5L3Ro
aXJkcGFydHkvcmlldHZlbGQvX19pbml0X18ucHkgYi9XZWJLaXRUb29scy9TY3JpcHRzL3dlYmtp
dHB5L3RoaXJkcGFydHkvcmlldHZlbGQvX19pbml0X18ucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQK
aW5kZXggMDAwMDAwMC4uZWY2NWJlZQotLS0gL2Rldi9udWxsCisrKyBiL1dlYktpdFRvb2xzL1Nj
cmlwdHMvd2Via2l0cHkvdGhpcmRwYXJ0eS9yaWV0dmVsZC9fX2luaXRfXy5weQpAQCAtMCwwICsx
IEBACisjIFJlcXVpcmVkIGZvciBQeXRob24gdG8gc2VhcmNoIHRoaXMgZGlyZWN0b3J5IGZvciBt
b2R1bGUgZmlsZXMKZGlmZiAtLWdpdCBhL1dlYktpdFRvb2xzL1NjcmlwdHMvd2Via2l0cHkvdGhp
cmRwYXJ0eS9yaWV0dmVsZC91cGxvYWQucHkgYi9XZWJLaXRUb29scy9TY3JpcHRzL3dlYmtpdHB5
L3RoaXJkcGFydHkvcmlldHZlbGQvdXBsb2FkLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4
IDAwMDAwMDAuLjVkYWExZDcKLS0tIC9kZXYvbnVsbAorKysgYi9XZWJLaXRUb29scy9TY3JpcHRz
L3dlYmtpdHB5L3RoaXJkcGFydHkvcmlldHZlbGQvdXBsb2FkLnB5CkBAIC0wLDAgKzEsMTY5MyBA
QAorIyEvdXNyL2Jpbi9lbnYgcHl0aG9uCisjCisjIENvcHlyaWdodCAyMDA3IEdvb2dsZSBJbmMu
CisjCisjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRo
ZSAiTGljZW5zZSIpOworIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21w
bGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisjIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUg
TGljZW5zZSBhdAorIworIyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VO
U0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQg
dG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2Ug
aXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgV0lUSE9VVCBXQVJSQU5USUVT
IE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisj
IFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJt
aXNzaW9ucyBhbmQKKyMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKyIiIlRvb2wg
Zm9yIHVwbG9hZGluZyBkaWZmcyBmcm9tIGEgdmVyc2lvbiBjb250cm9sIHN5c3RlbSB0byB0aGUg
Y29kZXJldmlldyBhcHAuCisKK1VzYWdlIHN1bW1hcnk6IHVwbG9hZC5weSBbb3B0aW9uc10gWy0t
IGRpZmZfb3B0aW9uc10KKworRGlmZiBvcHRpb25zIGFyZSBwYXNzZWQgdG8gdGhlIGRpZmYgY29t
bWFuZCBvZiB0aGUgdW5kZXJseWluZyBzeXN0ZW0uCisKK1N1cHBvcnRlZCB2ZXJzaW9uIGNvbnRy
b2wgc3lzdGVtczoKKyAgR2l0CisgIE1lcmN1cmlhbAorICBTdWJ2ZXJzaW9uCisKK0l0IGlzIGlt
cG9ydGFudCBmb3IgR2l0L01lcmN1cmlhbCB1c2VycyB0byBzcGVjaWZ5IGEgdHJlZS9ub2RlL2Jy
YW5jaCB0byBkaWZmCithZ2FpbnN0IGJ5IHVzaW5nIHRoZSAnLS1yZXYnIG9wdGlvbi4KKyIiIgor
IyBUaGlzIGNvZGUgaXMgZGVyaXZlZCBmcm9tIGFwcGNmZy5weSBpbiB0aGUgQXBwIEVuZ2luZSBT
REsgKG9wZW4gc291cmNlKSwKKyMgYW5kIGZyb20gQVNQTiByZWNpcGUgIzE0NjMwNi4KKworaW1w
b3J0IENvbmZpZ1BhcnNlcgoraW1wb3J0IGNvb2tpZWxpYgoraW1wb3J0IGZubWF0Y2gKK2ltcG9y
dCBnZXRwYXNzCitpbXBvcnQgbG9nZ2luZworaW1wb3J0IG1pbWV0eXBlcworaW1wb3J0IG9wdHBh
cnNlCitpbXBvcnQgb3MKK2ltcG9ydCByZQoraW1wb3J0IHNvY2tldAoraW1wb3J0IHN1YnByb2Nl
c3MKK2ltcG9ydCBzeXMKK2ltcG9ydCB1cmxsaWIKK2ltcG9ydCB1cmxsaWIyCitpbXBvcnQgdXJs
cGFyc2UKKworIyBUaGUgbWQ1IG1vZHVsZSB3YXMgZGVwcmVjYXRlZCBpbiBQeXRob24gMi41Lgor
dHJ5OgorICBmcm9tIGhhc2hsaWIgaW1wb3J0IG1kNQorZXhjZXB0IEltcG9ydEVycm9yOgorICBm
cm9tIG1kNSBpbXBvcnQgbWQ1CisKK3RyeToKKyAgaW1wb3J0IHJlYWRsaW5lCitleGNlcHQgSW1w
b3J0RXJyb3I6CisgIHBhc3MKKworIyBUaGUgbG9nZ2luZyB2ZXJib3NpdHk6CisjICAwOiBFcnJv
cnMgb25seS4KKyMgIDE6IFN0YXR1cyBtZXNzYWdlcy4KKyMgIDI6IEluZm8gbG9ncy4KKyMgIDM6
IERlYnVnIGxvZ3MuCit2ZXJib3NpdHkgPSAxCisKKyMgTWF4IHNpemUgb2YgcGF0Y2ggb3IgYmFz
ZSBmaWxlLgorTUFYX1VQTE9BRF9TSVpFID0gOTAwICogMTAyNAorCisjIENvbnN0YW50cyBmb3Ig
dmVyc2lvbiBjb250cm9sIG5hbWVzLiAgVXNlZCBieSBHdWVzc1ZDU05hbWUuCitWQ1NfR0lUID0g
IkdpdCIKK1ZDU19NRVJDVVJJQUwgPSAiTWVyY3VyaWFsIgorVkNTX1NVQlZFUlNJT04gPSAiU3Vi
dmVyc2lvbiIKK1ZDU19VTktOT1dOID0gIlVua25vd24iCisKKyMgd2hpdGVsaXN0IGZvciBub24t
YmluYXJ5IGZpbGV0eXBlcyB3aGljaCBkbyBub3Qgc3RhcnQgd2l0aCAidGV4dC8iCisjIC5tbSAo
T2JqZWN0aXZlLUMpIHNob3dzIHVwIGFzIGFwcGxpY2F0aW9uL3gtZnJlZW1pbmQgb24gbXkgTGlu
dXggYm94LgorVEVYVF9NSU1FVFlQRVMgPSBbJ2FwcGxpY2F0aW9uL2phdmFzY3JpcHQnLCAnYXBw
bGljYXRpb24veC1qYXZhc2NyaXB0JywKKyAgICAgICAgICAgICAgICAgICdhcHBsaWNhdGlvbi94
LWZyZWVtaW5kJ10KKworVkNTX0FCQlJFVklBVElPTlMgPSB7CisgIFZDU19NRVJDVVJJQUwubG93
ZXIoKTogVkNTX01FUkNVUklBTCwKKyAgImhnIjogVkNTX01FUkNVUklBTCwKKyAgVkNTX1NVQlZF
UlNJT04ubG93ZXIoKTogVkNTX1NVQlZFUlNJT04sCisgICJzdm4iOiBWQ1NfU1VCVkVSU0lPTiwK
KyAgVkNTX0dJVC5sb3dlcigpOiBWQ1NfR0lULAorfQorCisjIFRoZSByZXN1bHQgb2YgcGFyc2lu
ZyBTdWJ2ZXJzaW9uJ3MgW2F1dG8tcHJvcHNdIHNldHRpbmcuCitzdm5fYXV0b19wcm9wc19tYXAg
PSBOb25lCisKK2RlZiBHZXRFbWFpbChwcm9tcHQpOgorICAiIiJQcm9tcHRzIHRoZSB1c2VyIGZv
ciB0aGVpciBlbWFpbCBhZGRyZXNzIGFuZCByZXR1cm5zIGl0LgorCisgIFRoZSBsYXN0IHVzZWQg
ZW1haWwgYWRkcmVzcyBpcyBzYXZlZCB0byBhIGZpbGUgYW5kIG9mZmVyZWQgdXAgYXMgYSBzdWdn
ZXN0aW9uCisgIHRvIHRoZSB1c2VyLiBJZiB0aGUgdXNlciBwcmVzc2VzIGVudGVyIHdpdGhvdXQg
dHlwaW5nIGluIGFueXRoaW5nIHRoZSBsYXN0CisgIHVzZWQgZW1haWwgYWRkcmVzcyBpcyB1c2Vk
LiBJZiB0aGUgdXNlciBlbnRlcnMgYSBuZXcgYWRkcmVzcywgaXQgaXMgc2F2ZWQKKyAgZm9yIG5l
eHQgdGltZSB3ZSBwcm9tcHQuCisKKyAgIiIiCisgIGxhc3RfZW1haWxfZmlsZV9uYW1lID0gb3Mu
cGF0aC5leHBhbmR1c2VyKCJ+Ly5sYXN0X2NvZGVyZXZpZXdfZW1haWxfYWRkcmVzcyIpCisgIGxh
c3RfZW1haWwgPSAiIgorICBpZiBvcy5wYXRoLmV4aXN0cyhsYXN0X2VtYWlsX2ZpbGVfbmFtZSk6
CisgICAgdHJ5OgorICAgICAgbGFzdF9lbWFpbF9maWxlID0gb3BlbihsYXN0X2VtYWlsX2ZpbGVf
bmFtZSwgInIiKQorICAgICAgbGFzdF9lbWFpbCA9IGxhc3RfZW1haWxfZmlsZS5yZWFkbGluZSgp
LnN0cmlwKCJcbiIpCisgICAgICBsYXN0X2VtYWlsX2ZpbGUuY2xvc2UoKQorICAgICAgcHJvbXB0
ICs9ICIgWyVzXSIgJSBsYXN0X2VtYWlsCisgICAgZXhjZXB0IElPRXJyb3IsIGU6CisgICAgICBw
YXNzCisgIGVtYWlsID0gcmF3X2lucHV0KHByb21wdCArICI6ICIpLnN0cmlwKCkKKyAgaWYgZW1h
aWw6CisgICAgdHJ5OgorICAgICAgbGFzdF9lbWFpbF9maWxlID0gb3BlbihsYXN0X2VtYWlsX2Zp
bGVfbmFtZSwgInciKQorICAgICAgbGFzdF9lbWFpbF9maWxlLndyaXRlKGVtYWlsKQorICAgICAg
bGFzdF9lbWFpbF9maWxlLmNsb3NlKCkKKyAgICBleGNlcHQgSU9FcnJvciwgZToKKyAgICAgIHBh
c3MKKyAgZWxzZToKKyAgICBlbWFpbCA9IGxhc3RfZW1haWwKKyAgcmV0dXJuIGVtYWlsCisKKwor
ZGVmIFN0YXR1c1VwZGF0ZShtc2cpOgorICAiIiJQcmludCBhIHN0YXR1cyBtZXNzYWdlIHRvIHN0
ZG91dC4KKworICBJZiAndmVyYm9zaXR5JyBpcyBncmVhdGVyIHRoYW4gMCwgcHJpbnQgdGhlIG1l
c3NhZ2UuCisKKyAgQXJnczoKKyAgICBtc2c6IFRoZSBzdHJpbmcgdG8gcHJpbnQuCisgICIiIgor
ICBpZiB2ZXJib3NpdHkgPiAwOgorICAgIHByaW50IG1zZworCisKK2RlZiBFcnJvckV4aXQobXNn
KToKKyAgIiIiUHJpbnQgYW4gZXJyb3IgbWVzc2FnZSB0byBzdGRlcnIgYW5kIGV4aXQuIiIiCisg
IHByaW50ID4+c3lzLnN0ZGVyciwgbXNnCisgIHN5cy5leGl0KDEpCisKKworY2xhc3MgQ2xpZW50
TG9naW5FcnJvcih1cmxsaWIyLkhUVFBFcnJvcik6CisgICIiIlJhaXNlZCB0byBpbmRpY2F0ZSB0
aGVyZSB3YXMgYW4gZXJyb3IgYXV0aGVudGljYXRpbmcgd2l0aCBDbGllbnRMb2dpbi4iIiIKKwor
ICBkZWYgX19pbml0X18oc2VsZiwgdXJsLCBjb2RlLCBtc2csIGhlYWRlcnMsIGFyZ3MpOgorICAg
IHVybGxpYjIuSFRUUEVycm9yLl9faW5pdF9fKHNlbGYsIHVybCwgY29kZSwgbXNnLCBoZWFkZXJz
LCBOb25lKQorICAgIHNlbGYuYXJncyA9IGFyZ3MKKyAgICBzZWxmLnJlYXNvbiA9IGFyZ3NbIkVy
cm9yIl0KKworCitjbGFzcyBBYnN0cmFjdFJwY1NlcnZlcihvYmplY3QpOgorICAiIiJQcm92aWRl
cyBhIGNvbW1vbiBpbnRlcmZhY2UgZm9yIGEgc2ltcGxlIFJQQyBzZXJ2ZXIuIiIiCisKKyAgZGVm
IF9faW5pdF9fKHNlbGYsIGhvc3QsIGF1dGhfZnVuY3Rpb24sIGhvc3Rfb3ZlcnJpZGU9Tm9uZSwg
ZXh0cmFfaGVhZGVycz17fSwKKyAgICAgICAgICAgICAgIHNhdmVfY29va2llcz1GYWxzZSk6Cisg
ICAgIiIiQ3JlYXRlcyBhIG5ldyBIdHRwUnBjU2VydmVyLgorCisgICAgQXJnczoKKyAgICAgIGhv
c3Q6IFRoZSBob3N0IHRvIHNlbmQgcmVxdWVzdHMgdG8uCisgICAgICBhdXRoX2Z1bmN0aW9uOiBB
IGZ1bmN0aW9uIHRoYXQgdGFrZXMgbm8gYXJndW1lbnRzIGFuZCByZXR1cm5zIGFuCisgICAgICAg
IChlbWFpbCwgcGFzc3dvcmQpIHR1cGxlIHdoZW4gY2FsbGVkLiBXaWxsIGJlIGNhbGxlZCBpZiBh
dXRoZW50aWNhdGlvbgorICAgICAgICBpcyByZXF1aXJlZC4KKyAgICAgIGhvc3Rfb3ZlcnJpZGU6
IFRoZSBob3N0IGhlYWRlciB0byBzZW5kIHRvIHRoZSBzZXJ2ZXIgKGRlZmF1bHRzIHRvIGhvc3Qp
LgorICAgICAgZXh0cmFfaGVhZGVyczogQSBkaWN0IG9mIGV4dHJhIGhlYWRlcnMgdG8gYXBwZW5k
IHRvIGV2ZXJ5IHJlcXVlc3QuCisgICAgICBzYXZlX2Nvb2tpZXM6IElmIFRydWUsIHNhdmUgdGhl
IGF1dGhlbnRpY2F0aW9uIGNvb2tpZXMgdG8gbG9jYWwgZGlzay4KKyAgICAgICAgSWYgRmFsc2Us
IHVzZSBhbiBpbi1tZW1vcnkgY29va2llamFyIGluc3RlYWQuICBTdWJjbGFzc2VzIG11c3QKKyAg
ICAgICAgaW1wbGVtZW50IHRoaXMgZnVuY3Rpb25hbGl0eS4gIERlZmF1bHRzIHRvIEZhbHNlLgor
ICAgICIiIgorICAgIHNlbGYuaG9zdCA9IGhvc3QKKyAgICBzZWxmLmhvc3Rfb3ZlcnJpZGUgPSBo
b3N0X292ZXJyaWRlCisgICAgc2VsZi5hdXRoX2Z1bmN0aW9uID0gYXV0aF9mdW5jdGlvbgorICAg
IHNlbGYuYXV0aGVudGljYXRlZCA9IEZhbHNlCisgICAgc2VsZi5leHRyYV9oZWFkZXJzID0gZXh0
cmFfaGVhZGVycworICAgIHNlbGYuc2F2ZV9jb29raWVzID0gc2F2ZV9jb29raWVzCisgICAgc2Vs
Zi5vcGVuZXIgPSBzZWxmLl9HZXRPcGVuZXIoKQorICAgIGlmIHNlbGYuaG9zdF9vdmVycmlkZToK
KyAgICAgIGxvZ2dpbmcuaW5mbygiU2VydmVyOiAlczsgSG9zdDogJXMiLCBzZWxmLmhvc3QsIHNl
bGYuaG9zdF9vdmVycmlkZSkKKyAgICBlbHNlOgorICAgICAgbG9nZ2luZy5pbmZvKCJTZXJ2ZXI6
ICVzIiwgc2VsZi5ob3N0KQorCisgIGRlZiBfR2V0T3BlbmVyKHNlbGYpOgorICAgICIiIlJldHVy
bnMgYW4gT3BlbmVyRGlyZWN0b3IgZm9yIG1ha2luZyBIVFRQIHJlcXVlc3RzLgorCisgICAgUmV0
dXJuczoKKyAgICAgIEEgdXJsbGliMi5PcGVuZXJEaXJlY3RvciBvYmplY3QuCisgICAgIiIiCisg
ICAgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcigpCisKKyAgZGVmIF9DcmVhdGVSZXF1ZXN0KHNl
bGYsIHVybCwgZGF0YT1Ob25lKToKKyAgICAiIiJDcmVhdGVzIGEgbmV3IHVybGxpYiByZXF1ZXN0
LiIiIgorICAgIGxvZ2dpbmcuZGVidWcoIkNyZWF0aW5nIHJlcXVlc3QgZm9yOiAnJXMnIHdpdGgg
cGF5bG9hZDpcbiVzIiwgdXJsLCBkYXRhKQorICAgIHJlcSA9IHVybGxpYjIuUmVxdWVzdCh1cmws
IGRhdGE9ZGF0YSkKKyAgICBpZiBzZWxmLmhvc3Rfb3ZlcnJpZGU6CisgICAgICByZXEuYWRkX2hl
YWRlcigiSG9zdCIsIHNlbGYuaG9zdF9vdmVycmlkZSkKKyAgICBmb3Iga2V5LCB2YWx1ZSBpbiBz
ZWxmLmV4dHJhX2hlYWRlcnMuaXRlcml0ZW1zKCk6CisgICAgICByZXEuYWRkX2hlYWRlcihrZXks
IHZhbHVlKQorICAgIHJldHVybiByZXEKKworICBkZWYgX0dldEF1dGhUb2tlbihzZWxmLCBlbWFp
bCwgcGFzc3dvcmQpOgorICAgICIiIlVzZXMgQ2xpZW50TG9naW4gdG8gYXV0aGVudGljYXRlIHRo
ZSB1c2VyLCByZXR1cm5pbmcgYW4gYXV0aCB0b2tlbi4KKworICAgIEFyZ3M6CisgICAgICBlbWFp
bDogICAgVGhlIHVzZXIncyBlbWFpbCBhZGRyZXNzCisgICAgICBwYXNzd29yZDogVGhlIHVzZXIn
cyBwYXNzd29yZAorCisgICAgUmFpc2VzOgorICAgICAgQ2xpZW50TG9naW5FcnJvcjogSWYgdGhl
cmUgd2FzIGFuIGVycm9yIGF1dGhlbnRpY2F0aW5nIHdpdGggQ2xpZW50TG9naW4uCisgICAgICBI
VFRQRXJyb3I6IElmIHRoZXJlIHdhcyBzb21lIG90aGVyIGZvcm0gb2YgSFRUUCBlcnJvci4KKwor
ICAgIFJldHVybnM6CisgICAgICBUaGUgYXV0aGVudGljYXRpb24gdG9rZW4gcmV0dXJuZWQgYnkg
Q2xpZW50TG9naW4uCisgICAgIiIiCisgICAgYWNjb3VudF90eXBlID0gIkdPT0dMRSIKKyAgICBp
ZiBzZWxmLmhvc3QuZW5kc3dpdGgoIi5nb29nbGUuY29tIik6CisgICAgICAjIE5lZWRlZCBmb3Ig
dXNlIGluc2lkZSBHb29nbGUuCisgICAgICBhY2NvdW50X3R5cGUgPSAiSE9TVEVEIgorICAgIHJl
cSA9IHNlbGYuX0NyZWF0ZVJlcXVlc3QoCisgICAgICAgIHVybD0iaHR0cHM6Ly93d3cuZ29vZ2xl
LmNvbS9hY2NvdW50cy9DbGllbnRMb2dpbiIsCisgICAgICAgIGRhdGE9dXJsbGliLnVybGVuY29k
ZSh7CisgICAgICAgICAgICAiRW1haWwiOiBlbWFpbCwKKyAgICAgICAgICAgICJQYXNzd2QiOiBw
YXNzd29yZCwKKyAgICAgICAgICAgICJzZXJ2aWNlIjogImFoIiwKKyAgICAgICAgICAgICJzb3Vy
Y2UiOiAicmlldHZlbGQtY29kZXJldmlldy11cGxvYWQiLAorICAgICAgICAgICAgImFjY291bnRU
eXBlIjogYWNjb3VudF90eXBlLAorICAgICAgICB9KSwKKyAgICApCisgICAgdHJ5OgorICAgICAg
cmVzcG9uc2UgPSBzZWxmLm9wZW5lci5vcGVuKHJlcSkKKyAgICAgIHJlc3BvbnNlX2JvZHkgPSBy
ZXNwb25zZS5yZWFkKCkKKyAgICAgIHJlc3BvbnNlX2RpY3QgPSBkaWN0KHguc3BsaXQoIj0iKQor
ICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIHggaW4gcmVzcG9uc2VfYm9keS5zcGxpdCgi
XG4iKSBpZiB4KQorICAgICAgcmV0dXJuIHJlc3BvbnNlX2RpY3RbIkF1dGgiXQorICAgIGV4Y2Vw
dCB1cmxsaWIyLkhUVFBFcnJvciwgZToKKyAgICAgIGlmIGUuY29kZSA9PSA0MDM6CisgICAgICAg
IGJvZHkgPSBlLnJlYWQoKQorICAgICAgICByZXNwb25zZV9kaWN0ID0gZGljdCh4LnNwbGl0KCI9
IiwgMSkgZm9yIHggaW4gYm9keS5zcGxpdCgiXG4iKSBpZiB4KQorICAgICAgICByYWlzZSBDbGll
bnRMb2dpbkVycm9yKHJlcS5nZXRfZnVsbF91cmwoKSwgZS5jb2RlLCBlLm1zZywKKyAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICBlLmhlYWRlcnMsIHJlc3BvbnNlX2RpY3QpCisgICAgICBl
bHNlOgorICAgICAgICByYWlzZQorCisgIGRlZiBfR2V0QXV0aENvb2tpZShzZWxmLCBhdXRoX3Rv
a2VuKToKKyAgICAiIiJGZXRjaGVzIGF1dGhlbnRpY2F0aW9uIGNvb2tpZXMgZm9yIGFuIGF1dGhl
bnRpY2F0aW9uIHRva2VuLgorCisgICAgQXJnczoKKyAgICAgIGF1dGhfdG9rZW46IFRoZSBhdXRo
ZW50aWNhdGlvbiB0b2tlbiByZXR1cm5lZCBieSBDbGllbnRMb2dpbi4KKworICAgIFJhaXNlczoK
KyAgICAgIEhUVFBFcnJvcjogSWYgdGhlcmUgd2FzIGFuIGVycm9yIGZldGNoaW5nIHRoZSBhdXRo
ZW50aWNhdGlvbiBjb29raWVzLgorICAgICIiIgorICAgICMgVGhpcyBpcyBhIGR1bW15IHZhbHVl
IHRvIGFsbG93IHVzIHRvIGlkZW50aWZ5IHdoZW4gd2UncmUgc3VjY2Vzc2Z1bC4KKyAgICBjb250
aW51ZV9sb2NhdGlvbiA9ICJodHRwOi8vbG9jYWxob3N0LyIKKyAgICBhcmdzID0geyJjb250aW51
ZSI6IGNvbnRpbnVlX2xvY2F0aW9uLCAiYXV0aCI6IGF1dGhfdG9rZW59CisgICAgcmVxID0gc2Vs
Zi5fQ3JlYXRlUmVxdWVzdCgiaHR0cDovLyVzL19haC9sb2dpbj8lcyIgJQorICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgKHNlbGYuaG9zdCwgdXJsbGliLnVybGVuY29kZShhcmdzKSkpCisg
ICAgdHJ5OgorICAgICAgcmVzcG9uc2UgPSBzZWxmLm9wZW5lci5vcGVuKHJlcSkKKyAgICBleGNl
cHQgdXJsbGliMi5IVFRQRXJyb3IsIGU6CisgICAgICByZXNwb25zZSA9IGUKKyAgICBpZiAocmVz
cG9uc2UuY29kZSAhPSAzMDIgb3IKKyAgICAgICAgcmVzcG9uc2UuaW5mbygpWyJsb2NhdGlvbiJd
ICE9IGNvbnRpbnVlX2xvY2F0aW9uKToKKyAgICAgIHJhaXNlIHVybGxpYjIuSFRUUEVycm9yKHJl
cS5nZXRfZnVsbF91cmwoKSwgcmVzcG9uc2UuY29kZSwgcmVzcG9uc2UubXNnLAorICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2UuaGVhZGVycywgcmVzcG9uc2UuZnApCisgICAg
c2VsZi5hdXRoZW50aWNhdGVkID0gVHJ1ZQorCisgIGRlZiBfQXV0aGVudGljYXRlKHNlbGYpOgor
ICAgICIiIkF1dGhlbnRpY2F0ZXMgdGhlIHVzZXIuCisKKyAgICBUaGUgYXV0aGVudGljYXRpb24g
cHJvY2VzcyB3b3JrcyBhcyBmb2xsb3dzOgorICAgICAxKSBXZSBnZXQgYSB1c2VybmFtZSBhbmQg
cGFzc3dvcmQgZnJvbSB0aGUgdXNlcgorICAgICAyKSBXZSB1c2UgQ2xpZW50TG9naW4gdG8gb2J0
YWluIGFuIEFVVEggdG9rZW4gZm9yIHRoZSB1c2VyCisgICAgICAgIChzZWUgaHR0cDovL2NvZGUu
Z29vZ2xlLmNvbS9hcGlzL2FjY291bnRzL0F1dGhGb3JJbnN0YWxsZWRBcHBzLmh0bWwpLgorICAg
ICAzKSBXZSBwYXNzIHRoZSBhdXRoIHRva2VuIHRvIC9fYWgvbG9naW4gb24gdGhlIHNlcnZlciB0
byBvYnRhaW4gYW4KKyAgICAgICAgYXV0aGVudGljYXRpb24gY29va2llLiBJZiBsb2dpbiB3YXMg
c3VjY2Vzc2Z1bCwgaXQgdHJpZXMgdG8gcmVkaXJlY3QKKyAgICAgICAgdXMgdG8gdGhlIFVSTCB3
ZSBwcm92aWRlZC4KKworICAgIElmIHdlIGF0dGVtcHQgdG8gYWNjZXNzIHRoZSB1cGxvYWQgQVBJ
IHdpdGhvdXQgZmlyc3Qgb2J0YWluaW5nIGFuCisgICAgYXV0aGVudGljYXRpb24gY29va2llLCBp
dCByZXR1cm5zIGEgNDAxIHJlc3BvbnNlIChvciBhIDMwMikgYW5kCisgICAgZGlyZWN0cyB1cyB0
byBhdXRoZW50aWNhdGUgb3Vyc2VsdmVzIHdpdGggQ2xpZW50TG9naW4uCisgICAgIiIiCisgICAg
Zm9yIGkgaW4gcmFuZ2UoMyk6CisgICAgICBjcmVkZW50aWFscyA9IHNlbGYuYXV0aF9mdW5jdGlv
bigpCisgICAgICB0cnk6CisgICAgICAgIGF1dGhfdG9rZW4gPSBzZWxmLl9HZXRBdXRoVG9rZW4o
Y3JlZGVudGlhbHNbMF0sIGNyZWRlbnRpYWxzWzFdKQorICAgICAgZXhjZXB0IENsaWVudExvZ2lu
RXJyb3IsIGU6CisgICAgICAgIGlmIGUucmVhc29uID09ICJCYWRBdXRoZW50aWNhdGlvbiI6Cisg
ICAgICAgICAgcHJpbnQgPj5zeXMuc3RkZXJyLCAiSW52YWxpZCB1c2VybmFtZSBvciBwYXNzd29y
ZC4iCisgICAgICAgICAgY29udGludWUKKyAgICAgICAgaWYgZS5yZWFzb24gPT0gIkNhcHRjaGFS
ZXF1aXJlZCI6CisgICAgICAgICAgcHJpbnQgPj5zeXMuc3RkZXJyLCAoCisgICAgICAgICAgICAg
ICJQbGVhc2UgZ28gdG9cbiIKKyAgICAgICAgICAgICAgImh0dHBzOi8vd3d3Lmdvb2dsZS5jb20v
YWNjb3VudHMvRGlzcGxheVVubG9ja0NhcHRjaGFcbiIKKyAgICAgICAgICAgICAgImFuZCB2ZXJp
ZnkgeW91IGFyZSBhIGh1bWFuLiAgVGhlbiB0cnkgYWdhaW4uIikKKyAgICAgICAgICBicmVhawor
ICAgICAgICBpZiBlLnJlYXNvbiA9PSAiTm90VmVyaWZpZWQiOgorICAgICAgICAgIHByaW50ID4+
c3lzLnN0ZGVyciwgIkFjY291bnQgbm90IHZlcmlmaWVkLiIKKyAgICAgICAgICBicmVhaworICAg
ICAgICBpZiBlLnJlYXNvbiA9PSAiVGVybXNOb3RBZ3JlZWQiOgorICAgICAgICAgIHByaW50ID4+
c3lzLnN0ZGVyciwgIlVzZXIgaGFzIG5vdCBhZ3JlZWQgdG8gVE9TLiIKKyAgICAgICAgICBicmVh
aworICAgICAgICBpZiBlLnJlYXNvbiA9PSAiQWNjb3VudERlbGV0ZWQiOgorICAgICAgICAgIHBy
aW50ID4+c3lzLnN0ZGVyciwgIlRoZSB1c2VyIGFjY291bnQgaGFzIGJlZW4gZGVsZXRlZC4iCisg
ICAgICAgICAgYnJlYWsKKyAgICAgICAgaWYgZS5yZWFzb24gPT0gIkFjY291bnREaXNhYmxlZCI6
CisgICAgICAgICAgcHJpbnQgPj5zeXMuc3RkZXJyLCAiVGhlIHVzZXIgYWNjb3VudCBoYXMgYmVl
biBkaXNhYmxlZC4iCisgICAgICAgICAgYnJlYWsKKyAgICAgICAgaWYgZS5yZWFzb24gPT0gIlNl
cnZpY2VEaXNhYmxlZCI6CisgICAgICAgICAgcHJpbnQgPj5zeXMuc3RkZXJyLCAoIlRoZSB1c2Vy
J3MgYWNjZXNzIHRvIHRoZSBzZXJ2aWNlIGhhcyBiZWVuICIKKyAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAiZGlzYWJsZWQuIikKKyAgICAgICAgICBicmVhaworICAgICAgICBpZiBlLnJl
YXNvbiA9PSAiU2VydmljZVVuYXZhaWxhYmxlIjoKKyAgICAgICAgICBwcmludCA+PnN5cy5zdGRl
cnIsICJUaGUgc2VydmljZSBpcyBub3QgYXZhaWxhYmxlOyB0cnkgYWdhaW4gbGF0ZXIuIgorICAg
ICAgICAgIGJyZWFrCisgICAgICAgIHJhaXNlCisgICAgICBzZWxmLl9HZXRBdXRoQ29va2llKGF1
dGhfdG9rZW4pCisgICAgICByZXR1cm4KKworICBkZWYgU2VuZChzZWxmLCByZXF1ZXN0X3BhdGgs
IHBheWxvYWQ9Tm9uZSwKKyAgICAgICAgICAgY29udGVudF90eXBlPSJhcHBsaWNhdGlvbi9vY3Rl
dC1zdHJlYW0iLAorICAgICAgICAgICB0aW1lb3V0PU5vbmUsCisgICAgICAgICAgICoqa3dhcmdz
KToKKyAgICAiIiJTZW5kcyBhbiBSUEMgYW5kIHJldHVybnMgdGhlIHJlc3BvbnNlLgorCisgICAg
QXJnczoKKyAgICAgIHJlcXVlc3RfcGF0aDogVGhlIHBhdGggdG8gc2VuZCB0aGUgcmVxdWVzdCB0
bywgZWcgL2FwaS9hcHB2ZXJzaW9uL2NyZWF0ZS4KKyAgICAgIHBheWxvYWQ6IFRoZSBib2R5IG9m
IHRoZSByZXF1ZXN0LCBvciBOb25lIHRvIHNlbmQgYW4gZW1wdHkgcmVxdWVzdC4KKyAgICAgIGNv
bnRlbnRfdHlwZTogVGhlIENvbnRlbnQtVHlwZSBoZWFkZXIgdG8gdXNlLgorICAgICAgdGltZW91
dDogdGltZW91dCBpbiBzZWNvbmRzOyBkZWZhdWx0IE5vbmUgaS5lLiBubyB0aW1lb3V0LgorICAg
ICAgICAoTm90ZTogZm9yIGxhcmdlIHJlcXVlc3RzIG9uIE9TIFgsIHRoZSB0aW1lb3V0IGRvZXNu
J3Qgd29yayByaWdodC4pCisgICAgICBrd2FyZ3M6IEFueSBrZXl3b3JkIGFyZ3VtZW50cyBhcmUg
Y29udmVydGVkIGludG8gcXVlcnkgc3RyaW5nIHBhcmFtZXRlcnMuCisKKyAgICBSZXR1cm5zOgor
ICAgICAgVGhlIHJlc3BvbnNlIGJvZHksIGFzIGEgc3RyaW5nLgorICAgICIiIgorICAgICMgVE9E
TzogRG9uJ3QgcmVxdWlyZSBhdXRoZW50aWNhdGlvbi4gIExldCB0aGUgc2VydmVyIHNheQorICAg
ICMgd2hldGhlciBpdCBpcyBuZWNlc3NhcnkuCisgICAgaWYgbm90IHNlbGYuYXV0aGVudGljYXRl
ZDoKKyAgICAgIHNlbGYuX0F1dGhlbnRpY2F0ZSgpCisKKyAgICBvbGRfdGltZW91dCA9IHNvY2tl
dC5nZXRkZWZhdWx0dGltZW91dCgpCisgICAgc29ja2V0LnNldGRlZmF1bHR0aW1lb3V0KHRpbWVv
dXQpCisgICAgdHJ5OgorICAgICAgdHJpZXMgPSAwCisgICAgICB3aGlsZSBUcnVlOgorICAgICAg
ICB0cmllcyArPSAxCisgICAgICAgIGFyZ3MgPSBkaWN0KGt3YXJncykKKyAgICAgICAgdXJsID0g
Imh0dHA6Ly8lcyVzIiAlIChzZWxmLmhvc3QsIHJlcXVlc3RfcGF0aCkKKyAgICAgICAgaWYgYXJn
czoKKyAgICAgICAgICB1cmwgKz0gIj8iICsgdXJsbGliLnVybGVuY29kZShhcmdzKQorICAgICAg
ICByZXEgPSBzZWxmLl9DcmVhdGVSZXF1ZXN0KHVybD11cmwsIGRhdGE9cGF5bG9hZCkKKyAgICAg
ICAgcmVxLmFkZF9oZWFkZXIoIkNvbnRlbnQtVHlwZSIsIGNvbnRlbnRfdHlwZSkKKyAgICAgICAg
dHJ5OgorICAgICAgICAgIGYgPSBzZWxmLm9wZW5lci5vcGVuKHJlcSkKKyAgICAgICAgICByZXNw
b25zZSA9IGYucmVhZCgpCisgICAgICAgICAgZi5jbG9zZSgpCisgICAgICAgICAgcmV0dXJuIHJl
c3BvbnNlCisgICAgICAgIGV4Y2VwdCB1cmxsaWIyLkhUVFBFcnJvciwgZToKKyAgICAgICAgICBp
ZiB0cmllcyA+IDM6CisgICAgICAgICAgICByYWlzZQorICAgICAgICAgIGVsaWYgZS5jb2RlID09
IDQwMSBvciBlLmNvZGUgPT0gMzAyOgorICAgICAgICAgICAgc2VsZi5fQXV0aGVudGljYXRlKCkK
KyMjICAgICAgICAgICBlbGlmIGUuY29kZSA+PSA1MDAgYW5kIGUuY29kZSA8IDYwMDoKKyMjICAg
ICAgICAgICAgICMgU2VydmVyIEVycm9yIC0gdHJ5IGFnYWluLgorIyMgICAgICAgICAgICAgY29u
dGludWUKKyAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmFpc2UKKyAgICBmaW5hbGx5Ogor
ICAgICAgc29ja2V0LnNldGRlZmF1bHR0aW1lb3V0KG9sZF90aW1lb3V0KQorCisKK2NsYXNzIEh0
dHBScGNTZXJ2ZXIoQWJzdHJhY3RScGNTZXJ2ZXIpOgorICAiIiJQcm92aWRlcyBhIHNpbXBsaWZp
ZWQgUlBDLXN0eWxlIGludGVyZmFjZSBmb3IgSFRUUCByZXF1ZXN0cy4iIiIKKworICBkZWYgX0F1
dGhlbnRpY2F0ZShzZWxmKToKKyAgICAiIiJTYXZlIHRoZSBjb29raWUgamFyIGFmdGVyIGF1dGhl
bnRpY2F0aW9uLiIiIgorICAgIHN1cGVyKEh0dHBScGNTZXJ2ZXIsIHNlbGYpLl9BdXRoZW50aWNh
dGUoKQorICAgIGlmIHNlbGYuc2F2ZV9jb29raWVzOgorICAgICAgU3RhdHVzVXBkYXRlKCJTYXZp
bmcgYXV0aGVudGljYXRpb24gY29va2llcyB0byAlcyIgJSBzZWxmLmNvb2tpZV9maWxlKQorICAg
ICAgc2VsZi5jb29raWVfamFyLnNhdmUoKQorCisgIGRlZiBfR2V0T3BlbmVyKHNlbGYpOgorICAg
ICIiIlJldHVybnMgYW4gT3BlbmVyRGlyZWN0b3IgdGhhdCBzdXBwb3J0cyBjb29raWVzIGFuZCBp
Z25vcmVzIHJlZGlyZWN0cy4KKworICAgIFJldHVybnM6CisgICAgICBBIHVybGxpYjIuT3BlbmVy
RGlyZWN0b3Igb2JqZWN0LgorICAgICIiIgorICAgIG9wZW5lciA9IHVybGxpYjIuT3BlbmVyRGly
ZWN0b3IoKQorICAgIG9wZW5lci5hZGRfaGFuZGxlcih1cmxsaWIyLlByb3h5SGFuZGxlcigpKQor
ICAgIG9wZW5lci5hZGRfaGFuZGxlcih1cmxsaWIyLlVua25vd25IYW5kbGVyKCkpCisgICAgb3Bl
bmVyLmFkZF9oYW5kbGVyKHVybGxpYjIuSFRUUEhhbmRsZXIoKSkKKyAgICBvcGVuZXIuYWRkX2hh
bmRsZXIodXJsbGliMi5IVFRQRGVmYXVsdEVycm9ySGFuZGxlcigpKQorICAgIG9wZW5lci5hZGRf
aGFuZGxlcih1cmxsaWIyLkhUVFBTSGFuZGxlcigpKQorICAgIG9wZW5lci5hZGRfaGFuZGxlcih1
cmxsaWIyLkhUVFBFcnJvclByb2Nlc3NvcigpKQorICAgIGlmIHNlbGYuc2F2ZV9jb29raWVzOgor
ICAgICAgc2VsZi5jb29raWVfZmlsZSA9IG9zLnBhdGguZXhwYW5kdXNlcigifi8uY29kZXJldmll
d191cGxvYWRfY29va2llcyIpCisgICAgICBzZWxmLmNvb2tpZV9qYXIgPSBjb29raWVsaWIuTW96
aWxsYUNvb2tpZUphcihzZWxmLmNvb2tpZV9maWxlKQorICAgICAgaWYgb3MucGF0aC5leGlzdHMo
c2VsZi5jb29raWVfZmlsZSk6CisgICAgICAgIHRyeToKKyAgICAgICAgICBzZWxmLmNvb2tpZV9q
YXIubG9hZCgpCisgICAgICAgICAgc2VsZi5hdXRoZW50aWNhdGVkID0gVHJ1ZQorICAgICAgICAg
IFN0YXR1c1VwZGF0ZSgiTG9hZGVkIGF1dGhlbnRpY2F0aW9uIGNvb2tpZXMgZnJvbSAlcyIgJQor
ICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmNvb2tpZV9maWxlKQorICAgICAgICBleGNlcHQg
KGNvb2tpZWxpYi5Mb2FkRXJyb3IsIElPRXJyb3IpOgorICAgICAgICAgICMgRmFpbGVkIHRvIGxv
YWQgY29va2llcyAtIGp1c3QgaWdub3JlIHRoZW0uCisgICAgICAgICAgcGFzcworICAgICAgZWxz
ZToKKyAgICAgICAgIyBDcmVhdGUgYW4gZW1wdHkgY29va2llIGZpbGUgd2l0aCBtb2RlIDYwMAor
ICAgICAgICBmZCA9IG9zLm9wZW4oc2VsZi5jb29raWVfZmlsZSwgb3MuT19DUkVBVCwgMDYwMCkK
KyAgICAgICAgb3MuY2xvc2UoZmQpCisgICAgICAjIEFsd2F5cyBjaG1vZCB0aGUgY29va2llIGZp
bGUKKyAgICAgIG9zLmNobW9kKHNlbGYuY29va2llX2ZpbGUsIDA2MDApCisgICAgZWxzZToKKyAg
ICAgICMgRG9uJ3Qgc2F2ZSBjb29raWVzIGFjcm9zcyBydW5zIG9mIHVwZGF0ZS5weS4KKyAgICAg
IHNlbGYuY29va2llX2phciA9IGNvb2tpZWxpYi5Db29raWVKYXIoKQorICAgIG9wZW5lci5hZGRf
aGFuZGxlcih1cmxsaWIyLkhUVFBDb29raWVQcm9jZXNzb3Ioc2VsZi5jb29raWVfamFyKSkKKyAg
ICByZXR1cm4gb3BlbmVyCisKKworcGFyc2VyID0gb3B0cGFyc2UuT3B0aW9uUGFyc2VyKHVzYWdl
PSIlcHJvZyBbb3B0aW9uc10gWy0tIGRpZmZfb3B0aW9uc10iKQorcGFyc2VyLmFkZF9vcHRpb24o
Ii15IiwgIi0tYXNzdW1lX3llcyIsIGFjdGlvbj0ic3RvcmVfdHJ1ZSIsCisgICAgICAgICAgICAg
ICAgICBkZXN0PSJhc3N1bWVfeWVzIiwgZGVmYXVsdD1GYWxzZSwKKyAgICAgICAgICAgICAgICAg
IGhlbHA9IkFzc3VtZSB0aGF0IHRoZSBhbnN3ZXIgdG8geWVzL25vIHF1ZXN0aW9ucyBpcyAneWVz
Jy4iKQorIyBMb2dnaW5nCitncm91cCA9IHBhcnNlci5hZGRfb3B0aW9uX2dyb3VwKCJMb2dnaW5n
IG9wdGlvbnMiKQorZ3JvdXAuYWRkX29wdGlvbigiLXEiLCAiLS1xdWlldCIsIGFjdGlvbj0ic3Rv
cmVfY29uc3QiLCBjb25zdD0wLAorICAgICAgICAgICAgICAgICBkZXN0PSJ2ZXJib3NlIiwgaGVs
cD0iUHJpbnQgZXJyb3JzIG9ubHkuIikKK2dyb3VwLmFkZF9vcHRpb24oIi12IiwgIi0tdmVyYm9z
ZSIsIGFjdGlvbj0ic3RvcmVfY29uc3QiLCBjb25zdD0yLAorICAgICAgICAgICAgICAgICBkZXN0
PSJ2ZXJib3NlIiwgZGVmYXVsdD0xLAorICAgICAgICAgICAgICAgICBoZWxwPSJQcmludCBpbmZv
IGxldmVsIGxvZ3MgKGRlZmF1bHQpLiIpCitncm91cC5hZGRfb3B0aW9uKCItLW5vaXN5IiwgYWN0
aW9uPSJzdG9yZV9jb25zdCIsIGNvbnN0PTMsCisgICAgICAgICAgICAgICAgIGRlc3Q9InZlcmJv
c2UiLCBoZWxwPSJQcmludCBhbGwgbG9ncy4iKQorIyBSZXZpZXcgc2VydmVyCitncm91cCA9IHBh
cnNlci5hZGRfb3B0aW9uX2dyb3VwKCJSZXZpZXcgc2VydmVyIG9wdGlvbnMiKQorZ3JvdXAuYWRk
X29wdGlvbigiLXMiLCAiLS1zZXJ2ZXIiLCBhY3Rpb249InN0b3JlIiwgZGVzdD0ic2VydmVyIiwK
KyAgICAgICAgICAgICAgICAgZGVmYXVsdD0iY29kZXJldmlldy5hcHBzcG90LmNvbSIsCisgICAg
ICAgICAgICAgICAgIG1ldGF2YXI9IlNFUlZFUiIsCisgICAgICAgICAgICAgICAgIGhlbHA9KCJU
aGUgc2VydmVyIHRvIHVwbG9hZCB0by4gVGhlIGZvcm1hdCBpcyBob3N0Wzpwb3J0XS4gIgorICAg
ICAgICAgICAgICAgICAgICAgICAiRGVmYXVsdHMgdG8gJyVkZWZhdWx0Jy4iKSkKK2dyb3VwLmFk
ZF9vcHRpb24oIi1lIiwgIi0tZW1haWwiLCBhY3Rpb249InN0b3JlIiwgZGVzdD0iZW1haWwiLAor
ICAgICAgICAgICAgICAgICBtZXRhdmFyPSJFTUFJTCIsIGRlZmF1bHQ9Tm9uZSwKKyAgICAgICAg
ICAgICAgICAgaGVscD0iVGhlIHVzZXJuYW1lIHRvIHVzZS4gV2lsbCBwcm9tcHQgaWYgb21pdHRl
ZC4iKQorZ3JvdXAuYWRkX29wdGlvbigiLUgiLCAiLS1ob3N0IiwgYWN0aW9uPSJzdG9yZSIsIGRl
c3Q9Imhvc3QiLAorICAgICAgICAgICAgICAgICBtZXRhdmFyPSJIT1NUIiwgZGVmYXVsdD1Ob25l
LAorICAgICAgICAgICAgICAgICBoZWxwPSJPdmVycmlkZXMgdGhlIEhvc3QgaGVhZGVyIHNlbnQg
d2l0aCBhbGwgUlBDcy4iKQorZ3JvdXAuYWRkX29wdGlvbigiLS1ub19jb29raWVzIiwgYWN0aW9u
PSJzdG9yZV9mYWxzZSIsCisgICAgICAgICAgICAgICAgIGRlc3Q9InNhdmVfY29va2llcyIsIGRl
ZmF1bHQ9VHJ1ZSwKKyAgICAgICAgICAgICAgICAgaGVscD0iRG8gbm90IHNhdmUgYXV0aGVudGlj
YXRpb24gY29va2llcyB0byBsb2NhbCBkaXNrLiIpCisjIElzc3VlCitncm91cCA9IHBhcnNlci5h
ZGRfb3B0aW9uX2dyb3VwKCJJc3N1ZSBvcHRpb25zIikKK2dyb3VwLmFkZF9vcHRpb24oIi1kIiwg
Ii0tZGVzY3JpcHRpb24iLCBhY3Rpb249InN0b3JlIiwgZGVzdD0iZGVzY3JpcHRpb24iLAorICAg
ICAgICAgICAgICAgICBtZXRhdmFyPSJERVNDUklQVElPTiIsIGRlZmF1bHQ9Tm9uZSwKKyAgICAg
ICAgICAgICAgICAgaGVscD0iT3B0aW9uYWwgZGVzY3JpcHRpb24gd2hlbiBjcmVhdGluZyBhbiBp
c3N1ZS4iKQorZ3JvdXAuYWRkX29wdGlvbigiLWYiLCAiLS1kZXNjcmlwdGlvbl9maWxlIiwgYWN0
aW9uPSJzdG9yZSIsCisgICAgICAgICAgICAgICAgIGRlc3Q9ImRlc2NyaXB0aW9uX2ZpbGUiLCBt
ZXRhdmFyPSJERVNDUklQVElPTl9GSUxFIiwKKyAgICAgICAgICAgICAgICAgZGVmYXVsdD1Ob25l
LAorICAgICAgICAgICAgICAgICBoZWxwPSJPcHRpb25hbCBwYXRoIG9mIGEgZmlsZSB0aGF0IGNv
bnRhaW5zICIKKyAgICAgICAgICAgICAgICAgICAgICAidGhlIGRlc2NyaXB0aW9uIHdoZW4gY3Jl
YXRpbmcgYW4gaXNzdWUuIikKK2dyb3VwLmFkZF9vcHRpb24oIi1yIiwgIi0tcmV2aWV3ZXJzIiwg
YWN0aW9uPSJzdG9yZSIsIGRlc3Q9InJldmlld2VycyIsCisgICAgICAgICAgICAgICAgIG1ldGF2
YXI9IlJFVklFV0VSUyIsIGRlZmF1bHQ9Tm9uZSwKKyAgICAgICAgICAgICAgICAgaGVscD0iQWRk
IHJldmlld2VycyAoY29tbWEgc2VwYXJhdGVkIGVtYWlsIGFkZHJlc3NlcykuIikKK2dyb3VwLmFk
ZF9vcHRpb24oIi0tY2MiLCBhY3Rpb249InN0b3JlIiwgZGVzdD0iY2MiLAorICAgICAgICAgICAg
ICAgICBtZXRhdmFyPSJDQyIsIGRlZmF1bHQ9Tm9uZSwKKyAgICAgICAgICAgICAgICAgaGVscD0i
QWRkIENDIChjb21tYSBzZXBhcmF0ZWQgZW1haWwgYWRkcmVzc2VzKS4iKQorZ3JvdXAuYWRkX29w
dGlvbigiLS1wcml2YXRlIiwgYWN0aW9uPSJzdG9yZV90cnVlIiwgZGVzdD0icHJpdmF0ZSIsCisg
ICAgICAgICAgICAgICAgIGRlZmF1bHQ9RmFsc2UsCisgICAgICAgICAgICAgICAgIGhlbHA9Ik1h
a2UgdGhlIGlzc3VlIHJlc3RyaWN0ZWQgdG8gcmV2aWV3ZXJzIGFuZCB0aG9zZSBDQ2VkIikKKyMg
VXBsb2FkIG9wdGlvbnMKK2dyb3VwID0gcGFyc2VyLmFkZF9vcHRpb25fZ3JvdXAoIlBhdGNoIG9w
dGlvbnMiKQorZ3JvdXAuYWRkX29wdGlvbigiLW0iLCAiLS1tZXNzYWdlIiwgYWN0aW9uPSJzdG9y
ZSIsIGRlc3Q9Im1lc3NhZ2UiLAorICAgICAgICAgICAgICAgICBtZXRhdmFyPSJNRVNTQUdFIiwg
ZGVmYXVsdD1Ob25lLAorICAgICAgICAgICAgICAgICBoZWxwPSJBIG1lc3NhZ2UgdG8gaWRlbnRp
ZnkgdGhlIHBhdGNoLiAiCisgICAgICAgICAgICAgICAgICAgICAgIldpbGwgcHJvbXB0IGlmIG9t
aXR0ZWQuIikKK2dyb3VwLmFkZF9vcHRpb24oIi1pIiwgIi0taXNzdWUiLCB0eXBlPSJpbnQiLCBh
Y3Rpb249InN0b3JlIiwKKyAgICAgICAgICAgICAgICAgbWV0YXZhcj0iSVNTVUUiLCBkZWZhdWx0
PU5vbmUsCisgICAgICAgICAgICAgICAgIGhlbHA9Iklzc3VlIG51bWJlciB0byB3aGljaCB0byBh
ZGQuIERlZmF1bHRzIHRvIG5ldyBpc3N1ZS4iKQorZ3JvdXAuYWRkX29wdGlvbigiLS1iYXNlX3Vy
bCIsIGFjdGlvbj0ic3RvcmUiLCBkZXN0PSJiYXNlX3VybCIsIGRlZmF1bHQ9Tm9uZSwKKyAgICAg
ICAgICAgICAgICAgaGVscD0iQmFzZSByZXBvc2l0b3J5IFVSTCAobGlzdGVkIGFzIFwiQmFzZSBV
UkxcIiB3aGVuICIKKyAgICAgICAgICAgICAgICAgInZpZXdpbmcgaXNzdWUpLiAgSWYgb21pdHRl
ZCwgd2lsbCBiZSBndWVzc2VkIGF1dG9tYXRpY2FsbHkgIgorICAgICAgICAgICAgICAgICAiZm9y
IFNWTiByZXBvcyBhbmQgbGVmdCBibGFuayBmb3Igb3RoZXJzLiIpCitncm91cC5hZGRfb3B0aW9u
KCItLWRvd25sb2FkX2Jhc2UiLCBhY3Rpb249InN0b3JlX3RydWUiLAorICAgICAgICAgICAgICAg
ICBkZXN0PSJkb3dubG9hZF9iYXNlIiwgZGVmYXVsdD1GYWxzZSwKKyAgICAgICAgICAgICAgICAg
aGVscD0iQmFzZSBmaWxlcyB3aWxsIGJlIGRvd25sb2FkZWQgYnkgdGhlIHNlcnZlciAiCisgICAg
ICAgICAgICAgICAgICIoc2lkZS1ieS1zaWRlIGRpZmZzIG1heSBub3Qgd29yayBvbiBmaWxlcyB3
aXRoIENScykuIikKK2dyb3VwLmFkZF9vcHRpb24oIi0tcmV2IiwgYWN0aW9uPSJzdG9yZSIsIGRl
c3Q9InJldmlzaW9uIiwKKyAgICAgICAgICAgICAgICAgbWV0YXZhcj0iUkVWIiwgZGVmYXVsdD1O
b25lLAorICAgICAgICAgICAgICAgICBoZWxwPSJCYXNlIHJldmlzaW9uL2JyYW5jaC90cmVlIHRv
IGRpZmYgYWdhaW5zdC4gVXNlICIKKyAgICAgICAgICAgICAgICAgICAgICAicmV2MTpyZXYyIHJh
bmdlIHRvIHJldmlldyBhbHJlYWR5IGNvbW1pdHRlZCBjaGFuZ2VzZXQuIikKK2dyb3VwLmFkZF9v
cHRpb24oIi0tc2VuZF9tYWlsIiwgYWN0aW9uPSJzdG9yZV90cnVlIiwKKyAgICAgICAgICAgICAg
ICAgZGVzdD0ic2VuZF9tYWlsIiwgZGVmYXVsdD1GYWxzZSwKKyAgICAgICAgICAgICAgICAgaGVs
cD0iU2VuZCBub3RpZmljYXRpb24gZW1haWwgdG8gcmV2aWV3ZXJzLiIpCitncm91cC5hZGRfb3B0
aW9uKCItLXZjcyIsIGFjdGlvbj0ic3RvcmUiLCBkZXN0PSJ2Y3MiLAorICAgICAgICAgICAgICAg
ICBtZXRhdmFyPSJWQ1MiLCBkZWZhdWx0PU5vbmUsCisgICAgICAgICAgICAgICAgIGhlbHA9KCJW
ZXJzaW9uIGNvbnRyb2wgc3lzdGVtIChvcHRpb25hbCwgdXN1YWxseSB1cGxvYWQucHkgIgorICAg
ICAgICAgICAgICAgICAgICAgICAiYWxyZWFkeSBndWVzc2VzIHRoZSByaWdodCBWQ1MpLiIpKQor
Z3JvdXAuYWRkX29wdGlvbigiLS1lbXVsYXRlX3N2bl9hdXRvX3Byb3BzIiwgYWN0aW9uPSJzdG9y
ZV90cnVlIiwKKyAgICAgICAgICAgICAgICAgZGVzdD0iZW11bGF0ZV9zdm5fYXV0b19wcm9wcyIs
IGRlZmF1bHQ9RmFsc2UsCisgICAgICAgICAgICAgICAgIGhlbHA9KCJFbXVsYXRlIFN1YnZlcnNp
b24ncyBhdXRvIHByb3BlcnRpZXMgZmVhdHVyZS4iKSkKKworCitkZWYgR2V0UnBjU2VydmVyKG9w
dGlvbnMpOgorICAiIiJSZXR1cm5zIGFuIGluc3RhbmNlIG9mIGFuIEFic3RyYWN0UnBjU2VydmVy
LgorCisgIFJldHVybnM6CisgICAgQSBuZXcgQWJzdHJhY3RScGNTZXJ2ZXIsIG9uIHdoaWNoIFJQ
QyBjYWxscyBjYW4gYmUgbWFkZS4KKyAgIiIiCisKKyAgcnBjX3NlcnZlcl9jbGFzcyA9IEh0dHBS
cGNTZXJ2ZXIKKworICBkZWYgR2V0VXNlckNyZWRlbnRpYWxzKCk6CisgICAgIiIiUHJvbXB0cyB0
aGUgdXNlciBmb3IgYSB1c2VybmFtZSBhbmQgcGFzc3dvcmQuIiIiCisgICAgZW1haWwgPSBvcHRp
b25zLmVtYWlsCisgICAgaWYgZW1haWwgaXMgTm9uZToKKyAgICAgIGVtYWlsID0gR2V0RW1haWwo
IkVtYWlsIChsb2dpbiBmb3IgdXBsb2FkaW5nIHRvICVzKSIgJSBvcHRpb25zLnNlcnZlcikKKyAg
ICBwYXNzd29yZCA9IGdldHBhc3MuZ2V0cGFzcygiUGFzc3dvcmQgZm9yICVzOiAiICUgZW1haWwp
CisgICAgcmV0dXJuIChlbWFpbCwgcGFzc3dvcmQpCisKKyAgIyBJZiB0aGlzIGlzIHRoZSBkZXZf
YXBwc2VydmVyLCB1c2UgZmFrZSBhdXRoZW50aWNhdGlvbi4KKyAgaG9zdCA9IChvcHRpb25zLmhv
c3Qgb3Igb3B0aW9ucy5zZXJ2ZXIpLmxvd2VyKCkKKyAgaWYgaG9zdCA9PSAibG9jYWxob3N0IiBv
ciBob3N0LnN0YXJ0c3dpdGgoImxvY2FsaG9zdDoiKToKKyAgICBlbWFpbCA9IG9wdGlvbnMuZW1h
aWwKKyAgICBpZiBlbWFpbCBpcyBOb25lOgorICAgICAgZW1haWwgPSAidGVzdEBleGFtcGxlLmNv
bSIKKyAgICAgIGxvZ2dpbmcuaW5mbygiVXNpbmcgZGVidWcgdXNlciAlcy4gIE92ZXJyaWRlIHdp
dGggLS1lbWFpbCIgJSBlbWFpbCkKKyAgICBzZXJ2ZXIgPSBycGNfc2VydmVyX2NsYXNzKAorICAg
ICAgICBvcHRpb25zLnNlcnZlciwKKyAgICAgICAgbGFtYmRhOiAoZW1haWwsICJwYXNzd29yZCIp
LAorICAgICAgICBob3N0X292ZXJyaWRlPW9wdGlvbnMuaG9zdCwKKyAgICAgICAgZXh0cmFfaGVh
ZGVycz17IkNvb2tpZSI6CisgICAgICAgICAgICAgICAgICAgICAgICdkZXZfYXBwc2VydmVyX2xv
Z2luPSIlczpGYWxzZSInICUgZW1haWx9LAorICAgICAgICBzYXZlX2Nvb2tpZXM9b3B0aW9ucy5z
YXZlX2Nvb2tpZXMpCisgICAgIyBEb24ndCB0cnkgdG8gdGFsayB0byBDbGllbnRMb2dpbi4KKyAg
ICBzZXJ2ZXIuYXV0aGVudGljYXRlZCA9IFRydWUKKyAgICByZXR1cm4gc2VydmVyCisKKyAgcmV0
dXJuIHJwY19zZXJ2ZXJfY2xhc3Mob3B0aW9ucy5zZXJ2ZXIsIEdldFVzZXJDcmVkZW50aWFscywK
KyAgICAgICAgICAgICAgICAgICAgICAgICAgaG9zdF9vdmVycmlkZT1vcHRpb25zLmhvc3QsCisg
ICAgICAgICAgICAgICAgICAgICAgICAgIHNhdmVfY29va2llcz1vcHRpb25zLnNhdmVfY29va2ll
cykKKworCitkZWYgRW5jb2RlTXVsdGlwYXJ0Rm9ybURhdGEoZmllbGRzLCBmaWxlcyk6CisgICIi
IkVuY29kZSBmb3JtIGZpZWxkcyBmb3IgbXVsdGlwYXJ0L2Zvcm0tZGF0YS4KKworICBBcmdzOgor
ICAgIGZpZWxkczogQSBzZXF1ZW5jZSBvZiAobmFtZSwgdmFsdWUpIGVsZW1lbnRzIGZvciByZWd1
bGFyIGZvcm0gZmllbGRzLgorICAgIGZpbGVzOiBBIHNlcXVlbmNlIG9mIChuYW1lLCBmaWxlbmFt
ZSwgdmFsdWUpIGVsZW1lbnRzIGZvciBkYXRhIHRvIGJlCisgICAgICAgICAgIHVwbG9hZGVkIGFz
IGZpbGVzLgorICBSZXR1cm5zOgorICAgIChjb250ZW50X3R5cGUsIGJvZHkpIHJlYWR5IGZvciBo
dHRwbGliLkhUVFAgaW5zdGFuY2UuCisKKyAgU291cmNlOgorICAgIGh0dHA6Ly9hc3BuLmFjdGl2
ZXN0YXRlLmNvbS9BU1BOL0Nvb2tib29rL1B5dGhvbi9SZWNpcGUvMTQ2MzA2CisgICIiIgorICBC
T1VOREFSWSA9ICctTS1BLUctSS1DLS0tQi1PLVUtTi1ELUEtUi1ZLScKKyAgQ1JMRiA9ICdcclxu
JworICBsaW5lcyA9IFtdCisgIGZvciAoa2V5LCB2YWx1ZSkgaW4gZmllbGRzOgorICAgIGxpbmVz
LmFwcGVuZCgnLS0nICsgQk9VTkRBUlkpCisgICAgbGluZXMuYXBwZW5kKCdDb250ZW50LURpc3Bv
c2l0aW9uOiBmb3JtLWRhdGE7IG5hbWU9IiVzIicgJSBrZXkpCisgICAgbGluZXMuYXBwZW5kKCcn
KQorICAgIGxpbmVzLmFwcGVuZCh2YWx1ZSkKKyAgZm9yIChrZXksIGZpbGVuYW1lLCB2YWx1ZSkg
aW4gZmlsZXM6CisgICAgbGluZXMuYXBwZW5kKCctLScgKyBCT1VOREFSWSkKKyAgICBsaW5lcy5h
cHBlbmQoJ0NvbnRlbnQtRGlzcG9zaXRpb246IGZvcm0tZGF0YTsgbmFtZT0iJXMiOyBmaWxlbmFt
ZT0iJXMiJyAlCisgICAgICAgICAgICAgKGtleSwgZmlsZW5hbWUpKQorICAgIGxpbmVzLmFwcGVu
ZCgnQ29udGVudC1UeXBlOiAlcycgJSBHZXRDb250ZW50VHlwZShmaWxlbmFtZSkpCisgICAgbGlu
ZXMuYXBwZW5kKCcnKQorICAgIGxpbmVzLmFwcGVuZCh2YWx1ZSkKKyAgbGluZXMuYXBwZW5kKCct
LScgKyBCT1VOREFSWSArICctLScpCisgIGxpbmVzLmFwcGVuZCgnJykKKyAgYm9keSA9IENSTEYu
am9pbihsaW5lcykKKyAgY29udGVudF90eXBlID0gJ211bHRpcGFydC9mb3JtLWRhdGE7IGJvdW5k
YXJ5PSVzJyAlIEJPVU5EQVJZCisgIHJldHVybiBjb250ZW50X3R5cGUsIGJvZHkKKworCitkZWYg
R2V0Q29udGVudFR5cGUoZmlsZW5hbWUpOgorICAiIiJIZWxwZXIgdG8gZ3Vlc3MgdGhlIGNvbnRl
bnQtdHlwZSBmcm9tIHRoZSBmaWxlbmFtZS4iIiIKKyAgcmV0dXJuIG1pbWV0eXBlcy5ndWVzc190
eXBlKGZpbGVuYW1lKVswXSBvciAnYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtJworCisKKyMgVXNl
IGEgc2hlbGwgZm9yIHN1YmNvbW1hbmRzIG9uIFdpbmRvd3MgdG8gZ2V0IGEgUEFUSCBzZWFyY2gu
Cit1c2Vfc2hlbGwgPSBzeXMucGxhdGZvcm0uc3RhcnRzd2l0aCgid2luIikKKworZGVmIFJ1blNo
ZWxsV2l0aFJldHVybkNvZGUoY29tbWFuZCwgcHJpbnRfb3V0cHV0PUZhbHNlLAorICAgICAgICAg
ICAgICAgICAgICAgICAgICAgdW5pdmVyc2FsX25ld2xpbmVzPVRydWUsCisgICAgICAgICAgICAg
ICAgICAgICAgICAgICBlbnY9b3MuZW52aXJvbik6CisgICIiIkV4ZWN1dGVzIGEgY29tbWFuZCBh
bmQgcmV0dXJucyB0aGUgb3V0cHV0IGZyb20gc3Rkb3V0IGFuZCB0aGUgcmV0dXJuIGNvZGUuCisK
KyAgQXJnczoKKyAgICBjb21tYW5kOiBDb21tYW5kIHRvIGV4ZWN1dGUuCisgICAgcHJpbnRfb3V0
cHV0OiBJZiBUcnVlLCB0aGUgb3V0cHV0IGlzIHByaW50ZWQgdG8gc3Rkb3V0LgorICAgICAgICAg
ICAgICAgICAgSWYgRmFsc2UsIGJvdGggc3Rkb3V0IGFuZCBzdGRlcnIgYXJlIGlnbm9yZWQuCisg
ICAgdW5pdmVyc2FsX25ld2xpbmVzOiBVc2UgdW5pdmVyc2FsX25ld2xpbmVzIGZsYWcgKGRlZmF1
bHQ6IFRydWUpLgorCisgIFJldHVybnM6CisgICAgVHVwbGUgKG91dHB1dCwgcmV0dXJuIGNvZGUp
CisgICIiIgorICBsb2dnaW5nLmluZm8oIlJ1bm5pbmcgJXMiLCBjb21tYW5kKQorICBwID0gc3Vi
cHJvY2Vzcy5Qb3Blbihjb21tYW5kLCBzdGRvdXQ9c3VicHJvY2Vzcy5QSVBFLCBzdGRlcnI9c3Vi
cHJvY2Vzcy5QSVBFLAorICAgICAgICAgICAgICAgICAgICAgICBzaGVsbD11c2Vfc2hlbGwsIHVu
aXZlcnNhbF9uZXdsaW5lcz11bml2ZXJzYWxfbmV3bGluZXMsCisgICAgICAgICAgICAgICAgICAg
ICAgIGVudj1lbnYpCisgIGlmIHByaW50X291dHB1dDoKKyAgICBvdXRwdXRfYXJyYXkgPSBbXQor
ICAgIHdoaWxlIFRydWU6CisgICAgICBsaW5lID0gcC5zdGRvdXQucmVhZGxpbmUoKQorICAgICAg
aWYgbm90IGxpbmU6CisgICAgICAgIGJyZWFrCisgICAgICBwcmludCBsaW5lLnN0cmlwKCJcbiIp
CisgICAgICBvdXRwdXRfYXJyYXkuYXBwZW5kKGxpbmUpCisgICAgb3V0cHV0ID0gIiIuam9pbihv
dXRwdXRfYXJyYXkpCisgIGVsc2U6CisgICAgb3V0cHV0ID0gcC5zdGRvdXQucmVhZCgpCisgIHAu
d2FpdCgpCisgIGVycm91dCA9IHAuc3RkZXJyLnJlYWQoKQorICBpZiBwcmludF9vdXRwdXQgYW5k
IGVycm91dDoKKyAgICBwcmludCA+PnN5cy5zdGRlcnIsIGVycm91dAorICBwLnN0ZG91dC5jbG9z
ZSgpCisgIHAuc3RkZXJyLmNsb3NlKCkKKyAgcmV0dXJuIG91dHB1dCwgcC5yZXR1cm5jb2RlCisK
KworZGVmIFJ1blNoZWxsKGNvbW1hbmQsIHNpbGVudF9vaz1GYWxzZSwgdW5pdmVyc2FsX25ld2xp
bmVzPVRydWUsCisgICAgICAgICAgICAgcHJpbnRfb3V0cHV0PUZhbHNlLCBlbnY9b3MuZW52aXJv
bik6CisgIGRhdGEsIHJldGNvZGUgPSBSdW5TaGVsbFdpdGhSZXR1cm5Db2RlKGNvbW1hbmQsIHBy
aW50X291dHB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5p
dmVyc2FsX25ld2xpbmVzLCBlbnYpCisgIGlmIHJldGNvZGU6CisgICAgRXJyb3JFeGl0KCJHb3Qg
ZXJyb3Igc3RhdHVzIGZyb20gJXM6XG4lcyIgJSAoY29tbWFuZCwgZGF0YSkpCisgIGlmIG5vdCBz
aWxlbnRfb2sgYW5kIG5vdCBkYXRhOgorICAgIEVycm9yRXhpdCgiTm8gb3V0cHV0IGZyb20gJXMi
ICUgY29tbWFuZCkKKyAgcmV0dXJuIGRhdGEKKworCitjbGFzcyBWZXJzaW9uQ29udHJvbFN5c3Rl
bShvYmplY3QpOgorICAiIiJBYnN0cmFjdCBiYXNlIGNsYXNzIHByb3ZpZGluZyBhbiBpbnRlcmZh
Y2UgdG8gdGhlIFZDUy4iIiIKKworICBkZWYgX19pbml0X18oc2VsZiwgb3B0aW9ucyk6CisgICAg
IiIiQ29uc3RydWN0b3IuCisKKyAgICBBcmdzOgorICAgICAgb3B0aW9uczogQ29tbWFuZCBsaW5l
IG9wdGlvbnMuCisgICAgIiIiCisgICAgc2VsZi5vcHRpb25zID0gb3B0aW9ucworCisgIGRlZiBH
ZW5lcmF0ZURpZmYoc2VsZiwgYXJncyk6CisgICAgIiIiUmV0dXJuIHRoZSBjdXJyZW50IGRpZmYg
YXMgYSBzdHJpbmcuCisKKyAgICBBcmdzOgorICAgICAgYXJnczogRXh0cmEgYXJndW1lbnRzIHRv
IHBhc3MgdG8gdGhlIGRpZmYgY29tbWFuZC4KKyAgICAiIiIKKyAgICByYWlzZSBOb3RJbXBsZW1l
bnRlZEVycm9yKAorICAgICAgICAiYWJzdHJhY3QgbWV0aG9kIC0tIHN1YmNsYXNzICVzIG11c3Qg
b3ZlcnJpZGUiICUgc2VsZi5fX2NsYXNzX18pCisKKyAgZGVmIEdldFVua25vd25GaWxlcyhzZWxm
KToKKyAgICAiIiJSZXR1cm4gYSBsaXN0IG9mIGZpbGVzIHVua25vd24gdG8gdGhlIFZDUy4iIiIK
KyAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKAorICAgICAgICAiYWJzdHJhY3QgbWV0aG9k
IC0tIHN1YmNsYXNzICVzIG11c3Qgb3ZlcnJpZGUiICUgc2VsZi5fX2NsYXNzX18pCisKKyAgZGVm
IENoZWNrRm9yVW5rbm93bkZpbGVzKHNlbGYpOgorICAgICIiIlNob3cgYW4gImFyZSB5b3Ugc3Vy
ZT8iIHByb21wdCBpZiB0aGVyZSBhcmUgdW5rbm93biBmaWxlcy4iIiIKKyAgICB1bmtub3duX2Zp
bGVzID0gc2VsZi5HZXRVbmtub3duRmlsZXMoKQorICAgIGlmIHVua25vd25fZmlsZXM6CisgICAg
ICBwcmludCAiVGhlIGZvbGxvd2luZyBmaWxlcyBhcmUgbm90IGFkZGVkIHRvIHZlcnNpb24gY29u
dHJvbDoiCisgICAgICBmb3IgbGluZSBpbiB1bmtub3duX2ZpbGVzOgorICAgICAgICBwcmludCBs
aW5lCisgICAgICBwcm9tcHQgPSAiQXJlIHlvdSBzdXJlIHRvIGNvbnRpbnVlPyh5L04pICIKKyAg
ICAgIGFuc3dlciA9IHJhd19pbnB1dChwcm9tcHQpLnN0cmlwKCkKKyAgICAgIGlmIGFuc3dlciAh
PSAieSI6CisgICAgICAgIEVycm9yRXhpdCgiVXNlciBhYm9ydGVkIikKKworICBkZWYgR2V0QmFz
ZUZpbGUoc2VsZiwgZmlsZW5hbWUpOgorICAgICIiIkdldCB0aGUgY29udGVudCBvZiB0aGUgdXBz
dHJlYW0gdmVyc2lvbiBvZiBhIGZpbGUuCisKKyAgICBSZXR1cm5zOgorICAgICAgQSB0dXBsZSAo
YmFzZV9jb250ZW50LCBuZXdfY29udGVudCwgaXNfYmluYXJ5LCBzdGF0dXMpCisgICAgICAgIGJh
c2VfY29udGVudDogVGhlIGNvbnRlbnRzIG9mIHRoZSBiYXNlIGZpbGUuCisgICAgICAgIG5ld19j
b250ZW50OiBGb3IgdGV4dCBmaWxlcywgdGhpcyBpcyBlbXB0eS4gIEZvciBiaW5hcnkgZmlsZXMs
IHRoaXMgaXMKKyAgICAgICAgICB0aGUgY29udGVudHMgb2YgdGhlIG5ldyBmaWxlLCBzaW5jZSB0
aGUgZGlmZiBvdXRwdXQgd29uJ3QgY29udGFpbgorICAgICAgICAgIGluZm9ybWF0aW9uIHRvIHJl
Y29uc3RydWN0IHRoZSBjdXJyZW50IGZpbGUuCisgICAgICAgIGlzX2JpbmFyeTogVHJ1ZSBpZmYg
dGhlIGZpbGUgaXMgYmluYXJ5LgorICAgICAgICBzdGF0dXM6IFRoZSBzdGF0dXMgb2YgdGhlIGZp
bGUuCisgICAgIiIiCisKKyAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKAorICAgICAgICAi
YWJzdHJhY3QgbWV0aG9kIC0tIHN1YmNsYXNzICVzIG11c3Qgb3ZlcnJpZGUiICUgc2VsZi5fX2Ns
YXNzX18pCisKKworICBkZWYgR2V0QmFzZUZpbGVzKHNlbGYsIGRpZmYpOgorICAgICIiIkhlbHBl
ciB0aGF0IGNhbGxzIEdldEJhc2UgZmlsZSBmb3IgZWFjaCBmaWxlIGluIHRoZSBwYXRjaC4KKwor
ICAgIFJldHVybnM6CisgICAgICBBIGRpY3Rpb25hcnkgdGhhdCBtYXBzIGZyb20gZmlsZW5hbWUg
dG8gR2V0QmFzZUZpbGUncyB0dXBsZS4gIEZpbGVuYW1lcworICAgICAgYXJlIHJldHJpZXZlZCBi
YXNlZCBvbiBsaW5lcyB0aGF0IHN0YXJ0IHdpdGggIkluZGV4OiIgb3IKKyAgICAgICJQcm9wZXJ0
eSBjaGFuZ2VzIG9uOiIuCisgICAgIiIiCisgICAgZmlsZXMgPSB7fQorICAgIGZvciBsaW5lIGlu
IGRpZmYuc3BsaXRsaW5lcyhUcnVlKToKKyAgICAgIGlmIGxpbmUuc3RhcnRzd2l0aCgnSW5kZXg6
Jykgb3IgbGluZS5zdGFydHN3aXRoKCdQcm9wZXJ0eSBjaGFuZ2VzIG9uOicpOgorICAgICAgICB1
bnVzZWQsIGZpbGVuYW1lID0gbGluZS5zcGxpdCgnOicsIDEpCisgICAgICAgICMgT24gV2luZG93
cyBpZiBhIGZpbGUgaGFzIHByb3BlcnR5IGNoYW5nZXMgaXRzIGZpbGVuYW1lIHVzZXMgJ1wnCisg
ICAgICAgICMgaW5zdGVhZCBvZiAnLycuCisgICAgICAgIGZpbGVuYW1lID0gZmlsZW5hbWUuc3Ry
aXAoKS5yZXBsYWNlKCdcXCcsICcvJykKKyAgICAgICAgZmlsZXNbZmlsZW5hbWVdID0gc2VsZi5H
ZXRCYXNlRmlsZShmaWxlbmFtZSkKKyAgICByZXR1cm4gZmlsZXMKKworCisgIGRlZiBVcGxvYWRC
YXNlRmlsZXMoc2VsZiwgaXNzdWUsIHJwY19zZXJ2ZXIsIHBhdGNoX2xpc3QsIHBhdGNoc2V0LCBv
cHRpb25zLAorICAgICAgICAgICAgICAgICAgICAgIGZpbGVzKToKKyAgICAiIiJVcGxvYWRzIHRo
ZSBiYXNlIGZpbGVzIChhbmQgaWYgbmVjZXNzYXJ5LCB0aGUgY3VycmVudCBvbmVzIGFzIHdlbGwp
LiIiIgorCisgICAgZGVmIFVwbG9hZEZpbGUoZmlsZW5hbWUsIGZpbGVfaWQsIGNvbnRlbnQsIGlz
X2JpbmFyeSwgc3RhdHVzLCBpc19iYXNlKToKKyAgICAgICIiIlVwbG9hZHMgYSBmaWxlIHRvIHRo
ZSBzZXJ2ZXIuIiIiCisgICAgICBmaWxlX3Rvb19sYXJnZSA9IEZhbHNlCisgICAgICBpZiBpc19i
YXNlOgorICAgICAgICB0eXBlID0gImJhc2UiCisgICAgICBlbHNlOgorICAgICAgICB0eXBlID0g
ImN1cnJlbnQiCisgICAgICBpZiBsZW4oY29udGVudCkgPiBNQVhfVVBMT0FEX1NJWkU6CisgICAg
ICAgIHByaW50ICgiTm90IHVwbG9hZGluZyB0aGUgJXMgZmlsZSBmb3IgJXMgYmVjYXVzZSBpdCdz
IHRvbyBsYXJnZS4iICUKKyAgICAgICAgICAgICAgICh0eXBlLCBmaWxlbmFtZSkpCisgICAgICAg
IGZpbGVfdG9vX2xhcmdlID0gVHJ1ZQorICAgICAgICBjb250ZW50ID0gIiIKKyAgICAgIGNoZWNr
c3VtID0gbWQ1KGNvbnRlbnQpLmhleGRpZ2VzdCgpCisgICAgICBpZiBvcHRpb25zLnZlcmJvc2Ug
PiAwIGFuZCBub3QgZmlsZV90b29fbGFyZ2U6CisgICAgICAgIHByaW50ICJVcGxvYWRpbmcgJXMg
ZmlsZSBmb3IgJXMiICUgKHR5cGUsIGZpbGVuYW1lKQorICAgICAgdXJsID0gIi8lZC91cGxvYWRf
Y29udGVudC8lZC8lZCIgJSAoaW50KGlzc3VlKSwgaW50KHBhdGNoc2V0KSwgZmlsZV9pZCkKKyAg
ICAgIGZvcm1fZmllbGRzID0gWygiZmlsZW5hbWUiLCBmaWxlbmFtZSksCisgICAgICAgICAgICAg
ICAgICAgICAoInN0YXR1cyIsIHN0YXR1cyksCisgICAgICAgICAgICAgICAgICAgICAoImNoZWNr
c3VtIiwgY2hlY2tzdW0pLAorICAgICAgICAgICAgICAgICAgICAgKCJpc19iaW5hcnkiLCBzdHIo
aXNfYmluYXJ5KSksCisgICAgICAgICAgICAgICAgICAgICAoImlzX2N1cnJlbnQiLCBzdHIobm90
IGlzX2Jhc2UpKSwKKyAgICAgICAgICAgICAgICAgICAgXQorICAgICAgaWYgZmlsZV90b29fbGFy
Z2U6CisgICAgICAgIGZvcm1fZmllbGRzLmFwcGVuZCgoImZpbGVfdG9vX2xhcmdlIiwgIjEiKSkK
KyAgICAgIGlmIG9wdGlvbnMuZW1haWw6CisgICAgICAgIGZvcm1fZmllbGRzLmFwcGVuZCgoInVz
ZXIiLCBvcHRpb25zLmVtYWlsKSkKKyAgICAgIGN0eXBlLCBib2R5ID0gRW5jb2RlTXVsdGlwYXJ0
Rm9ybURhdGEoZm9ybV9maWVsZHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgIFsoImRhdGEiLCBmaWxlbmFtZSwgY29udGVudCldKQorICAgICAgcmVzcG9uc2Vf
Ym9keSA9IHJwY19zZXJ2ZXIuU2VuZCh1cmwsIGJvZHksCisgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgIGNvbnRlbnRfdHlwZT1jdHlwZSkKKyAgICAgIGlmIG5vdCByZXNwb25z
ZV9ib2R5LnN0YXJ0c3dpdGgoIk9LIik6CisgICAgICAgIFN0YXR1c1VwZGF0ZSgiICAtLT4gJXMi
ICUgcmVzcG9uc2VfYm9keSkKKyAgICAgICAgc3lzLmV4aXQoMSkKKworICAgIHBhdGNoZXMgPSBk
aWN0KCkKKyAgICBbcGF0Y2hlcy5zZXRkZWZhdWx0KHYsIGspIGZvciBrLCB2IGluIHBhdGNoX2xp
c3RdCisgICAgZm9yIGZpbGVuYW1lIGluIHBhdGNoZXMua2V5cygpOgorICAgICAgYmFzZV9jb250
ZW50LCBuZXdfY29udGVudCwgaXNfYmluYXJ5LCBzdGF0dXMgPSBmaWxlc1tmaWxlbmFtZV0KKyAg
ICAgIGZpbGVfaWRfc3RyID0gcGF0Y2hlcy5nZXQoZmlsZW5hbWUpCisgICAgICBpZiBmaWxlX2lk
X3N0ci5maW5kKCJub2Jhc2UiKSAhPSAtMToKKyAgICAgICAgYmFzZV9jb250ZW50ID0gTm9uZQor
ICAgICAgICBmaWxlX2lkX3N0ciA9IGZpbGVfaWRfc3RyW2ZpbGVfaWRfc3RyLnJmaW5kKCJfIikg
KyAxOl0KKyAgICAgIGZpbGVfaWQgPSBpbnQoZmlsZV9pZF9zdHIpCisgICAgICBpZiBiYXNlX2Nv
bnRlbnQgIT0gTm9uZToKKyAgICAgICAgVXBsb2FkRmlsZShmaWxlbmFtZSwgZmlsZV9pZCwgYmFz
ZV9jb250ZW50LCBpc19iaW5hcnksIHN0YXR1cywgVHJ1ZSkKKyAgICAgIGlmIG5ld19jb250ZW50
ICE9IE5vbmU6CisgICAgICAgIFVwbG9hZEZpbGUoZmlsZW5hbWUsIGZpbGVfaWQsIG5ld19jb250
ZW50LCBpc19iaW5hcnksIHN0YXR1cywgRmFsc2UpCisKKyAgZGVmIElzSW1hZ2Uoc2VsZiwgZmls
ZW5hbWUpOgorICAgICIiIlJldHVybnMgdHJ1ZSBpZiB0aGUgZmlsZW5hbWUgaGFzIGFuIGltYWdl
IGV4dGVuc2lvbi4iIiIKKyAgICBtaW1ldHlwZSA9ICBtaW1ldHlwZXMuZ3Vlc3NfdHlwZShmaWxl
bmFtZSlbMF0KKyAgICBpZiBub3QgbWltZXR5cGU6CisgICAgICByZXR1cm4gRmFsc2UKKyAgICBy
ZXR1cm4gbWltZXR5cGUuc3RhcnRzd2l0aCgiaW1hZ2UvIikKKworICBkZWYgSXNCaW5hcnkoc2Vs
ZiwgZmlsZW5hbWUpOgorICAgICIiIlJldHVybnMgdHJ1ZSBpZiB0aGUgZ3Vlc3NlZCBtaW1ldHlw
ZWQgaXNudCd0IGluIHRleHQgZ3JvdXAuIiIiCisgICAgbWltZXR5cGUgPSBtaW1ldHlwZXMuZ3Vl
c3NfdHlwZShmaWxlbmFtZSlbMF0KKyAgICBpZiBub3QgbWltZXR5cGU6CisgICAgICByZXR1cm4g
RmFsc2UgICMgZS5nLiBSRUFETUUsICJyZWFsIiBiaW5hcmllcyB1c3VhbGx5IGhhdmUgYW4gZXh0
ZW5zaW9uCisgICAgIyBzcGVjaWFsIGNhc2UgZm9yIHRleHQgZmlsZXMgd2hpY2ggZG9uJ3Qgc3Rh
cnQgd2l0aCB0ZXh0LworICAgIGlmIG1pbWV0eXBlIGluIFRFWFRfTUlNRVRZUEVTOgorICAgICAg
cmV0dXJuIEZhbHNlCisgICAgcmV0dXJuIG5vdCBtaW1ldHlwZS5zdGFydHN3aXRoKCJ0ZXh0LyIp
CisKKworY2xhc3MgU3VidmVyc2lvblZDUyhWZXJzaW9uQ29udHJvbFN5c3RlbSk6CisgICIiIklt
cGxlbWVudGF0aW9uIG9mIHRoZSBWZXJzaW9uQ29udHJvbFN5c3RlbSBpbnRlcmZhY2UgZm9yIFN1
YnZlcnNpb24uIiIiCisKKyAgZGVmIF9faW5pdF9fKHNlbGYsIG9wdGlvbnMpOgorICAgIHN1cGVy
KFN1YnZlcnNpb25WQ1MsIHNlbGYpLl9faW5pdF9fKG9wdGlvbnMpCisgICAgaWYgc2VsZi5vcHRp
b25zLnJldmlzaW9uOgorICAgICAgbWF0Y2ggPSByZS5tYXRjaChyIihcZCspKDooXGQrKSk/Iiwg
c2VsZi5vcHRpb25zLnJldmlzaW9uKQorICAgICAgaWYgbm90IG1hdGNoOgorICAgICAgICBFcnJv
ckV4aXQoIkludmFsaWQgU3VidmVyc2lvbiByZXZpc2lvbiAlcy4iICUgc2VsZi5vcHRpb25zLnJl
dmlzaW9uKQorICAgICAgc2VsZi5yZXZfc3RhcnQgPSBtYXRjaC5ncm91cCgxKQorICAgICAgc2Vs
Zi5yZXZfZW5kID0gbWF0Y2guZ3JvdXAoMykKKyAgICBlbHNlOgorICAgICAgc2VsZi5yZXZfc3Rh
cnQgPSBzZWxmLnJldl9lbmQgPSBOb25lCisgICAgIyBDYWNoZSBvdXRwdXQgZnJvbSAic3ZuIGxp
c3QgLXIgUkVWTk8gZGlybmFtZSIuCisgICAgIyBLZXlzOiBkaXJuYW1lLCBWYWx1ZXM6IDItdHVw
bGUgKG91cHV0IGZvciBzdGFydCByZXYgYW5kIGVuZCByZXYpLgorICAgIHNlbGYuc3ZubHNfY2Fj
aGUgPSB7fQorICAgICMgQmFzZSBVUkwgaXMgcmVxdWlyZWQgdG8gZmV0Y2ggZmlsZXMgZGVsZXRl
ZCBpbiBhbiBvbGRlciByZXZpc2lvbi4KKyAgICAjIFJlc3VsdCBpcyBjYWNoZWQgdG8gbm90IGd1
ZXNzIGl0IG92ZXIgYW5kIG92ZXIgYWdhaW4gaW4gR2V0QmFzZUZpbGUoKS4KKyAgICByZXF1aXJl
ZCA9IHNlbGYub3B0aW9ucy5kb3dubG9hZF9iYXNlIG9yIHNlbGYub3B0aW9ucy5yZXZpc2lvbiBp
cyBub3QgTm9uZQorICAgIHNlbGYuc3ZuX2Jhc2UgPSBzZWxmLl9HdWVzc0Jhc2UocmVxdWlyZWQp
CisKKyAgZGVmIEd1ZXNzQmFzZShzZWxmLCByZXF1aXJlZCk6CisgICAgIiIiV3JhcHBlciBmb3Ig
X0d1ZXNzQmFzZS4iIiIKKyAgICByZXR1cm4gc2VsZi5zdm5fYmFzZQorCisgIGRlZiBfR3Vlc3NC
YXNlKHNlbGYsIHJlcXVpcmVkKToKKyAgICAiIiJSZXR1cm5zIHRoZSBTVk4gYmFzZSBVUkwuCisK
KyAgICBBcmdzOgorICAgICAgcmVxdWlyZWQ6IElmIHRydWUsIGV4aXRzIGlmIHRoZSB1cmwgY2Fu
J3QgYmUgZ3Vlc3NlZCwgb3RoZXJ3aXNlIE5vbmUgaXMKKyAgICAgICAgcmV0dXJuZWQuCisgICAg
IiIiCisgICAgaW5mbyA9IFJ1blNoZWxsKFsic3ZuIiwgImluZm8iXSkKKyAgICBmb3IgbGluZSBp
biBpbmZvLnNwbGl0bGluZXMoKToKKyAgICAgIHdvcmRzID0gbGluZS5zcGxpdCgpCisgICAgICBp
ZiBsZW4od29yZHMpID09IDIgYW5kIHdvcmRzWzBdID09ICJVUkw6IjoKKyAgICAgICAgdXJsID0g
d29yZHNbMV0KKyAgICAgICAgc2NoZW1lLCBuZXRsb2MsIHBhdGgsIHBhcmFtcywgcXVlcnksIGZy
YWdtZW50ID0gdXJscGFyc2UudXJscGFyc2UodXJsKQorICAgICAgICB1c2VybmFtZSwgbmV0bG9j
ID0gdXJsbGliLnNwbGl0dXNlcihuZXRsb2MpCisgICAgICAgIGlmIHVzZXJuYW1lOgorICAgICAg
ICAgIGxvZ2dpbmcuaW5mbygiUmVtb3ZlZCB1c2VybmFtZSBmcm9tIGJhc2UgVVJMIikKKyAgICAg
ICAgaWYgbmV0bG9jLmVuZHN3aXRoKCJzdm4ucHl0aG9uLm9yZyIpOgorICAgICAgICAgIGlmIG5l
dGxvYyA9PSAic3ZuLnB5dGhvbi5vcmciOgorICAgICAgICAgICAgaWYgcGF0aC5zdGFydHN3aXRo
KCIvcHJvamVjdHMvIik6CisgICAgICAgICAgICAgIHBhdGggPSBwYXRoWzk6XQorICAgICAgICAg
IGVsaWYgbmV0bG9jICE9ICJweXRob25kZXZAc3ZuLnB5dGhvbi5vcmciOgorICAgICAgICAgICAg
RXJyb3JFeGl0KCJVbnJlY29nbml6ZWQgUHl0aG9uIFVSTDogJXMiICUgdXJsKQorICAgICAgICAg
IGJhc2UgPSAiaHR0cDovL3N2bi5weXRob24ub3JnL3ZpZXcvKmNoZWNrb3V0KiVzLyIgJSBwYXRo
CisgICAgICAgICAgbG9nZ2luZy5pbmZvKCJHdWVzc2VkIFB5dGhvbiBiYXNlID0gJXMiLCBiYXNl
KQorICAgICAgICBlbGlmIG5ldGxvYy5lbmRzd2l0aCgic3ZuLmNvbGxhYi5uZXQiKToKKyAgICAg
ICAgICBpZiBwYXRoLnN0YXJ0c3dpdGgoIi9yZXBvcy8iKToKKyAgICAgICAgICAgIHBhdGggPSBw
YXRoWzY6XQorICAgICAgICAgIGJhc2UgPSAiaHR0cDovL3N2bi5jb2xsYWIubmV0L3ZpZXd2Yy8q
Y2hlY2tvdXQqJXMvIiAlIHBhdGgKKyAgICAgICAgICBsb2dnaW5nLmluZm8oIkd1ZXNzZWQgQ29s
bGFiTmV0IGJhc2UgPSAlcyIsIGJhc2UpCisgICAgICAgIGVsaWYgbmV0bG9jLmVuZHN3aXRoKCIu
Z29vZ2xlY29kZS5jb20iKToKKyAgICAgICAgICBwYXRoID0gcGF0aCArICIvIgorICAgICAgICAg
IGJhc2UgPSB1cmxwYXJzZS51cmx1bnBhcnNlKCgiaHR0cCIsIG5ldGxvYywgcGF0aCwgcGFyYW1z
LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWVyeSwgZnJhZ21lbnQp
KQorICAgICAgICAgIGxvZ2dpbmcuaW5mbygiR3Vlc3NlZCBHb29nbGUgQ29kZSBiYXNlID0gJXMi
LCBiYXNlKQorICAgICAgICBlbHNlOgorICAgICAgICAgIHBhdGggPSBwYXRoICsgIi8iCisgICAg
ICAgICAgYmFzZSA9IHVybHBhcnNlLnVybHVucGFyc2UoKHNjaGVtZSwgbmV0bG9jLCBwYXRoLCBw
YXJhbXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1ZXJ5LCBmcmFn
bWVudCkpCisgICAgICAgICAgbG9nZ2luZy5pbmZvKCJHdWVzc2VkIGJhc2UgPSAlcyIsIGJhc2Up
CisgICAgICAgIHJldHVybiBiYXNlCisgICAgaWYgcmVxdWlyZWQ6CisgICAgICBFcnJvckV4aXQo
IkNhbid0IGZpbmQgVVJMIGluIG91dHB1dCBmcm9tIHN2biBpbmZvIikKKyAgICByZXR1cm4gTm9u
ZQorCisgIGRlZiBHZW5lcmF0ZURpZmYoc2VsZiwgYXJncyk6CisgICAgY21kID0gWyJzdm4iLCAi
ZGlmZiJdCisgICAgaWYgc2VsZi5vcHRpb25zLnJldmlzaW9uOgorICAgICAgY21kICs9IFsiLXIi
LCBzZWxmLm9wdGlvbnMucmV2aXNpb25dCisgICAgY21kLmV4dGVuZChhcmdzKQorICAgIGRhdGEg
PSBSdW5TaGVsbChjbWQpCisgICAgY291bnQgPSAwCisgICAgZm9yIGxpbmUgaW4gZGF0YS5zcGxp
dGxpbmVzKCk6CisgICAgICBpZiBsaW5lLnN0YXJ0c3dpdGgoIkluZGV4OiIpIG9yIGxpbmUuc3Rh
cnRzd2l0aCgiUHJvcGVydHkgY2hhbmdlcyBvbjoiKToKKyAgICAgICAgY291bnQgKz0gMQorICAg
ICAgICBsb2dnaW5nLmluZm8obGluZSkKKyAgICBpZiBub3QgY291bnQ6CisgICAgICBFcnJvckV4
aXQoIk5vIHZhbGlkIHBhdGNoZXMgZm91bmQgaW4gb3V0cHV0IGZyb20gc3ZuIGRpZmYiKQorICAg
IHJldHVybiBkYXRhCisKKyAgZGVmIF9Db2xsYXBzZUtleXdvcmRzKHNlbGYsIGNvbnRlbnQsIGtl
eXdvcmRfc3RyKToKKyAgICAiIiJDb2xsYXBzZXMgU1ZOIGtleXdvcmRzLiIiIgorICAgICMgc3Zu
IGNhdCB0cmFuc2xhdGVzIGtleXdvcmRzIGJ1dCBzdm4gZGlmZiBkb2Vzbid0LiBBcyBhIHJlc3Vs
dCBvZiB0aGlzCisgICAgIyBiZWhhdmlvciBwYXRjaGluZy5QYXRjaENodW5rcygpIGZhaWxzIHdp
dGggYSBjaHVuayBtaXNtYXRjaCBlcnJvci4KKyAgICAjIFRoaXMgcGFydCB3YXMgb3JpZ2luYWxs
eSB3cml0dGVuIGJ5IHRoZSBSZXZpZXcgQm9hcmQgZGV2ZWxvcG1lbnQgdGVhbQorICAgICMgd2hv
IGhhZCB0aGUgc2FtZSBwcm9ibGVtIChodHRwOi8vcmV2aWV3cy5yZXZpZXctYm9hcmQub3JnL3Iv
Mjc2LykuCisgICAgIyBNYXBwaW5nIG9mIGtleXdvcmRzIHRvIGtub3duIGFsaWFzZXMKKyAgICBz
dm5fa2V5d29yZHMgPSB7CisgICAgICAjIFN0YW5kYXJkIGtleXdvcmRzCisgICAgICAnRGF0ZSc6
ICAgICAgICAgICAgICAgIFsnRGF0ZScsICdMYXN0Q2hhbmdlZERhdGUnXSwKKyAgICAgICdSZXZp
c2lvbic6ICAgICAgICAgICAgWydSZXZpc2lvbicsICdMYXN0Q2hhbmdlZFJldmlzaW9uJywgJ1Jl
diddLAorICAgICAgJ0F1dGhvcic6ICAgICAgICAgICAgICBbJ0F1dGhvcicsICdMYXN0Q2hhbmdl
ZEJ5J10sCisgICAgICAnSGVhZFVSTCc6ICAgICAgICAgICAgIFsnSGVhZFVSTCcsICdVUkwnXSwK
KyAgICAgICdJZCc6ICAgICAgICAgICAgICAgICAgWydJZCddLAorCisgICAgICAjIEFsaWFzZXMK
KyAgICAgICdMYXN0Q2hhbmdlZERhdGUnOiAgICAgWydMYXN0Q2hhbmdlZERhdGUnLCAnRGF0ZSdd
LAorICAgICAgJ0xhc3RDaGFuZ2VkUmV2aXNpb24nOiBbJ0xhc3RDaGFuZ2VkUmV2aXNpb24nLCAn
UmV2JywgJ1JldmlzaW9uJ10sCisgICAgICAnTGFzdENoYW5nZWRCeSc6ICAgICAgIFsnTGFzdENo
YW5nZWRCeScsICdBdXRob3InXSwKKyAgICAgICdVUkwnOiAgICAgICAgICAgICAgICAgWydVUkwn
LCAnSGVhZFVSTCddLAorICAgIH0KKworICAgIGRlZiByZXBsKG0pOgorICAgICAgIGlmIG0uZ3Jv
dXAoMik6CisgICAgICAgICByZXR1cm4gIiQlczo6JXMkIiAlIChtLmdyb3VwKDEpLCAiICIgKiBs
ZW4obS5ncm91cCgzKSkpCisgICAgICAgcmV0dXJuICIkJXMkIiAlIG0uZ3JvdXAoMSkKKyAgICBr
ZXl3b3JkcyA9IFtrZXl3b3JkCisgICAgICAgICAgICAgICAgZm9yIG5hbWUgaW4ga2V5d29yZF9z
dHIuc3BsaXQoIiAiKQorICAgICAgICAgICAgICAgIGZvciBrZXl3b3JkIGluIHN2bl9rZXl3b3Jk
cy5nZXQobmFtZSwgW10pXQorICAgIHJldHVybiByZS5zdWIociJcJCglcyk6KDo/KShbXlwkXSsp
XCQiICUgJ3wnLmpvaW4oa2V5d29yZHMpLCByZXBsLCBjb250ZW50KQorCisgIGRlZiBHZXRVbmtu
b3duRmlsZXMoc2VsZik6CisgICAgc3RhdHVzID0gUnVuU2hlbGwoWyJzdm4iLCAic3RhdHVzIiwg
Ii0taWdub3JlLWV4dGVybmFscyJdLCBzaWxlbnRfb2s9VHJ1ZSkKKyAgICB1bmtub3duX2ZpbGVz
ID0gW10KKyAgICBmb3IgbGluZSBpbiBzdGF0dXMuc3BsaXQoIlxuIik6CisgICAgICBpZiBsaW5l
IGFuZCBsaW5lWzBdID09ICI/IjoKKyAgICAgICAgdW5rbm93bl9maWxlcy5hcHBlbmQobGluZSkK
KyAgICByZXR1cm4gdW5rbm93bl9maWxlcworCisgIGRlZiBSZWFkRmlsZShzZWxmLCBmaWxlbmFt
ZSk6CisgICAgIiIiUmV0dXJucyB0aGUgY29udGVudHMgb2YgYSBmaWxlLiIiIgorICAgIGZpbGUg
PSBvcGVuKGZpbGVuYW1lLCAncmInKQorICAgIHJlc3VsdCA9ICIiCisgICAgdHJ5OgorICAgICAg
cmVzdWx0ID0gZmlsZS5yZWFkKCkKKyAgICBmaW5hbGx5OgorICAgICAgZmlsZS5jbG9zZSgpCisg
ICAgcmV0dXJuIHJlc3VsdAorCisgIGRlZiBHZXRTdGF0dXMoc2VsZiwgZmlsZW5hbWUpOgorICAg
ICIiIlJldHVybnMgdGhlIHN0YXR1cyBvZiBhIGZpbGUuIiIiCisgICAgaWYgbm90IHNlbGYub3B0
aW9ucy5yZXZpc2lvbjoKKyAgICAgIHN0YXR1cyA9IFJ1blNoZWxsKFsic3ZuIiwgInN0YXR1cyIs
ICItLWlnbm9yZS1leHRlcm5hbHMiLCBmaWxlbmFtZV0pCisgICAgICBpZiBub3Qgc3RhdHVzOgor
ICAgICAgICBFcnJvckV4aXQoInN2biBzdGF0dXMgcmV0dXJuZWQgbm8gb3V0cHV0IGZvciAlcyIg
JSBmaWxlbmFtZSkKKyAgICAgIHN0YXR1c19saW5lcyA9IHN0YXR1cy5zcGxpdGxpbmVzKCkKKyAg
ICAgICMgSWYgZmlsZSBpcyBpbiBhIGNsLCB0aGUgb3V0cHV0IHdpbGwgYmVnaW4gd2l0aAorICAg
ICAgIyAiXG4tLS0gQ2hhbmdlbGlzdCAnY2xfbmFtZSc6XG4iLiAgU2VlCisgICAgICAjIGh0dHA6
Ly9zdm4uY29sbGFiLm5ldC9yZXBvcy9zdm4vdHJ1bmsvbm90ZXMvY2hhbmdlbGlzdC1kZXNpZ24u
dHh0CisgICAgICBpZiAobGVuKHN0YXR1c19saW5lcykgPT0gMyBhbmQKKyAgICAgICAgICBub3Qg
c3RhdHVzX2xpbmVzWzBdIGFuZAorICAgICAgICAgIHN0YXR1c19saW5lc1sxXS5zdGFydHN3aXRo
KCItLS0gQ2hhbmdlbGlzdCIpKToKKyAgICAgICAgc3RhdHVzID0gc3RhdHVzX2xpbmVzWzJdCisg
ICAgICBlbHNlOgorICAgICAgICBzdGF0dXMgPSBzdGF0dXNfbGluZXNbMF0KKyAgICAjIElmIHdl
IGhhdmUgYSByZXZpc2lvbiB0byBkaWZmIGFnYWluc3Qgd2UgbmVlZCB0byBydW4gInN2biBsaXN0
IgorICAgICMgZm9yIHRoZSBvbGQgYW5kIHRoZSBuZXcgcmV2aXNpb24gYW5kIGNvbXBhcmUgdGhl
IHJlc3VsdHMgdG8gZ2V0CisgICAgIyB0aGUgY29ycmVjdCBzdGF0dXMgZm9yIGEgZmlsZS4KKyAg
ICBlbHNlOgorICAgICAgZGlybmFtZSwgcmVsZmlsZW5hbWUgPSBvcy5wYXRoLnNwbGl0KGZpbGVu
YW1lKQorICAgICAgaWYgZGlybmFtZSBub3QgaW4gc2VsZi5zdm5sc19jYWNoZToKKyAgICAgICAg
Y21kID0gWyJzdm4iLCAibGlzdCIsICItciIsIHNlbGYucmV2X3N0YXJ0LCBkaXJuYW1lIG9yICIu
Il0KKyAgICAgICAgb3V0LCByZXR1cm5jb2RlID0gUnVuU2hlbGxXaXRoUmV0dXJuQ29kZShjbWQp
CisgICAgICAgIGlmIHJldHVybmNvZGU6CisgICAgICAgICAgRXJyb3JFeGl0KCJGYWlsZWQgdG8g
Z2V0IHN0YXR1cyBmb3IgJXMuIiAlIGZpbGVuYW1lKQorICAgICAgICBvbGRfZmlsZXMgPSBvdXQu
c3BsaXRsaW5lcygpCisgICAgICAgIGFyZ3MgPSBbInN2biIsICJsaXN0Il0KKyAgICAgICAgaWYg
c2VsZi5yZXZfZW5kOgorICAgICAgICAgIGFyZ3MgKz0gWyItciIsIHNlbGYucmV2X2VuZF0KKyAg
ICAgICAgY21kID0gYXJncyArIFtkaXJuYW1lIG9yICIuIl0KKyAgICAgICAgb3V0LCByZXR1cm5j
b2RlID0gUnVuU2hlbGxXaXRoUmV0dXJuQ29kZShjbWQpCisgICAgICAgIGlmIHJldHVybmNvZGU6
CisgICAgICAgICAgRXJyb3JFeGl0KCJGYWlsZWQgdG8gcnVuIGNvbW1hbmQgJXMiICUgY21kKQor
ICAgICAgICBzZWxmLnN2bmxzX2NhY2hlW2Rpcm5hbWVdID0gKG9sZF9maWxlcywgb3V0LnNwbGl0
bGluZXMoKSkKKyAgICAgIG9sZF9maWxlcywgbmV3X2ZpbGVzID0gc2VsZi5zdm5sc19jYWNoZVtk
aXJuYW1lXQorICAgICAgaWYgcmVsZmlsZW5hbWUgaW4gb2xkX2ZpbGVzIGFuZCByZWxmaWxlbmFt
ZSBub3QgaW4gbmV3X2ZpbGVzOgorICAgICAgICBzdGF0dXMgPSAiRCAgICIKKyAgICAgIGVsaWYg
cmVsZmlsZW5hbWUgaW4gb2xkX2ZpbGVzIGFuZCByZWxmaWxlbmFtZSBpbiBuZXdfZmlsZXM6Cisg
ICAgICAgIHN0YXR1cyA9ICJNICAgIgorICAgICAgZWxzZToKKyAgICAgICAgc3RhdHVzID0gIkEg
ICAiCisgICAgcmV0dXJuIHN0YXR1cworCisgIGRlZiBHZXRCYXNlRmlsZShzZWxmLCBmaWxlbmFt
ZSk6CisgICAgc3RhdHVzID0gc2VsZi5HZXRTdGF0dXMoZmlsZW5hbWUpCisgICAgYmFzZV9jb250
ZW50ID0gTm9uZQorICAgIG5ld19jb250ZW50ID0gTm9uZQorCisgICAgIyBJZiBhIGZpbGUgaXMg
Y29waWVkIGl0cyBzdGF0dXMgd2lsbCBiZSAiQSAgKyIsIHdoaWNoIHNpZ25pZmllcworICAgICMg
ImFkZGl0aW9uLXdpdGgtaGlzdG9yeSIuICBTZWUgInN2biBzdCIgZm9yIG1vcmUgaW5mb3JtYXRp
b24uICBXZSBuZWVkIHRvCisgICAgIyB1cGxvYWQgdGhlIG9yaWdpbmFsIGZpbGUgb3IgZWxzZSBk
aWZmIHBhcnNpbmcgd2lsbCBmYWlsIGlmIHRoZSBmaWxlIHdhcworICAgICMgZWRpdGVkLgorICAg
IGlmIHN0YXR1c1swXSA9PSAiQSIgYW5kIHN0YXR1c1szXSAhPSAiKyI6CisgICAgICAjIFdlJ2xs
IG5lZWQgdG8gdXBsb2FkIHRoZSBuZXcgY29udGVudCBpZiB3ZSdyZSBhZGRpbmcgYSBiaW5hcnkg
ZmlsZQorICAgICAgIyBzaW5jZSBkaWZmJ3Mgb3V0cHV0IHdvbid0IGNvbnRhaW4gaXQuCisgICAg
ICBtaW1ldHlwZSA9IFJ1blNoZWxsKFsic3ZuIiwgInByb3BnZXQiLCAic3ZuOm1pbWUtdHlwZSIs
IGZpbGVuYW1lXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc2lsZW50X29rPVRydWUpCisg
ICAgICBiYXNlX2NvbnRlbnQgPSAiIgorICAgICAgaXNfYmluYXJ5ID0gYm9vbChtaW1ldHlwZSkg
YW5kIG5vdCBtaW1ldHlwZS5zdGFydHN3aXRoKCJ0ZXh0LyIpCisgICAgICBpZiBpc19iaW5hcnkg
YW5kIHNlbGYuSXNJbWFnZShmaWxlbmFtZSk6CisgICAgICAgIG5ld19jb250ZW50ID0gc2VsZi5S
ZWFkRmlsZShmaWxlbmFtZSkKKyAgICBlbGlmIChzdGF0dXNbMF0gaW4gKCJNIiwgIkQiLCAiUiIp
IG9yCisgICAgICAgICAgKHN0YXR1c1swXSA9PSAiQSIgYW5kIHN0YXR1c1szXSA9PSAiKyIpIG9y
ICAjIENvcGllZCBmaWxlLgorICAgICAgICAgIChzdGF0dXNbMF0gPT0gIiAiIGFuZCBzdGF0dXNb
MV0gPT0gIk0iKSk6ICAjIFByb3BlcnR5IGNoYW5nZS4KKyAgICAgIGFyZ3MgPSBbXQorICAgICAg
aWYgc2VsZi5vcHRpb25zLnJldmlzaW9uOgorICAgICAgICB1cmwgPSAiJXMvJXNAJXMiICUgKHNl
bGYuc3ZuX2Jhc2UsIGZpbGVuYW1lLCBzZWxmLnJldl9zdGFydCkKKyAgICAgIGVsc2U6CisgICAg
ICAgICMgRG9uJ3QgY2hhbmdlIGZpbGVuYW1lLCBpdCdzIG5lZWRlZCBsYXRlci4KKyAgICAgICAg
dXJsID0gZmlsZW5hbWUKKyAgICAgICAgYXJncyArPSBbIi1yIiwgIkJBU0UiXQorICAgICAgY21k
ID0gWyJzdm4iXSArIGFyZ3MgKyBbInByb3BnZXQiLCAic3ZuOm1pbWUtdHlwZSIsIHVybF0KKyAg
ICAgIG1pbWV0eXBlLCByZXR1cm5jb2RlID0gUnVuU2hlbGxXaXRoUmV0dXJuQ29kZShjbWQpCisg
ICAgICBpZiByZXR1cm5jb2RlOgorICAgICAgICAjIEZpbGUgZG9lcyBub3QgZXhpc3QgaW4gdGhl
IHJlcXVlc3RlZCByZXZpc2lvbi4KKyAgICAgICAgIyBSZXNldCBtaW1ldHlwZSwgaXQgY29udGFp
bnMgYW4gZXJyb3IgbWVzc2FnZS4KKyAgICAgICAgbWltZXR5cGUgPSAiIgorICAgICAgZ2V0X2Jh
c2UgPSBGYWxzZQorICAgICAgaXNfYmluYXJ5ID0gYm9vbChtaW1ldHlwZSkgYW5kIG5vdCBtaW1l
dHlwZS5zdGFydHN3aXRoKCJ0ZXh0LyIpCisgICAgICBpZiBzdGF0dXNbMF0gPT0gIiAiOgorICAg
ICAgICAjIEVtcHR5IGJhc2UgY29udGVudCBqdXN0IHRvIGZvcmNlIGFuIHVwbG9hZC4KKyAgICAg
ICAgYmFzZV9jb250ZW50ID0gIiIKKyAgICAgIGVsaWYgaXNfYmluYXJ5OgorICAgICAgICBpZiBz
ZWxmLklzSW1hZ2UoZmlsZW5hbWUpOgorICAgICAgICAgIGdldF9iYXNlID0gVHJ1ZQorICAgICAg
ICAgIGlmIHN0YXR1c1swXSA9PSAiTSI6CisgICAgICAgICAgICBpZiBub3Qgc2VsZi5yZXZfZW5k
OgorICAgICAgICAgICAgICBuZXdfY29udGVudCA9IHNlbGYuUmVhZEZpbGUoZmlsZW5hbWUpCisg
ICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICB1cmwgPSAiJXMvJXNAJXMiICUgKHNlbGYu
c3ZuX2Jhc2UsIGZpbGVuYW1lLCBzZWxmLnJldl9lbmQpCisgICAgICAgICAgICAgIG5ld19jb250
ZW50ID0gUnVuU2hlbGwoWyJzdm4iLCAiY2F0IiwgdXJsXSwKKyAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICB1bml2ZXJzYWxfbmV3bGluZXM9VHJ1ZSwgc2lsZW50X29rPVRydWUp
CisgICAgICAgIGVsc2U6CisgICAgICAgICAgYmFzZV9jb250ZW50ID0gIiIKKyAgICAgIGVsc2U6
CisgICAgICAgIGdldF9iYXNlID0gVHJ1ZQorCisgICAgICBpZiBnZXRfYmFzZToKKyAgICAgICAg
aWYgaXNfYmluYXJ5OgorICAgICAgICAgIHVuaXZlcnNhbF9uZXdsaW5lcyA9IEZhbHNlCisgICAg
ICAgIGVsc2U6CisgICAgICAgICAgdW5pdmVyc2FsX25ld2xpbmVzID0gVHJ1ZQorICAgICAgICBp
ZiBzZWxmLnJldl9zdGFydDoKKyAgICAgICAgICAjICJzdm4gY2F0IC1yIFJFViBkZWxldGVfZmls
ZS50eHQiIGRvZXNuJ3Qgd29yay4gY2F0IHJlcXVpcmVzCisgICAgICAgICAgIyB0aGUgZnVsbCBV
Ukwgd2l0aCAiQFJFViIgYXBwZW5kZWQgaW5zdGVhZCBvZiB1c2luZyAiLXIiIG9wdGlvbi4KKyAg
ICAgICAgICB1cmwgPSAiJXMvJXNAJXMiICUgKHNlbGYuc3ZuX2Jhc2UsIGZpbGVuYW1lLCBzZWxm
LnJldl9zdGFydCkKKyAgICAgICAgICBiYXNlX2NvbnRlbnQgPSBSdW5TaGVsbChbInN2biIsICJj
YXQiLCB1cmxdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuaXZlcnNhbF9u
ZXdsaW5lcz11bml2ZXJzYWxfbmV3bGluZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgc2lsZW50X29rPVRydWUpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgYmFzZV9jb250
ZW50ID0gUnVuU2hlbGwoWyJzdm4iLCAiY2F0IiwgZmlsZW5hbWVdLAorICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgIHVuaXZlcnNhbF9uZXdsaW5lcz11bml2ZXJzYWxfbmV3bGluZXMs
CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2lsZW50X29rPVRydWUpCisgICAg
ICAgIGlmIG5vdCBpc19iaW5hcnk6CisgICAgICAgICAgYXJncyA9IFtdCisgICAgICAgICAgaWYg
c2VsZi5yZXZfc3RhcnQ6CisgICAgICAgICAgICB1cmwgPSAiJXMvJXNAJXMiICUgKHNlbGYuc3Zu
X2Jhc2UsIGZpbGVuYW1lLCBzZWxmLnJldl9zdGFydCkKKyAgICAgICAgICBlbHNlOgorICAgICAg
ICAgICAgdXJsID0gZmlsZW5hbWUKKyAgICAgICAgICAgIGFyZ3MgKz0gWyItciIsICJCQVNFIl0K
KyAgICAgICAgICBjbWQgPSBbInN2biJdICsgYXJncyArIFsicHJvcGdldCIsICJzdm46a2V5d29y
ZHMiLCB1cmxdCisgICAgICAgICAga2V5d29yZHMsIHJldHVybmNvZGUgPSBSdW5TaGVsbFdpdGhS
ZXR1cm5Db2RlKGNtZCkKKyAgICAgICAgICBpZiBrZXl3b3JkcyBhbmQgbm90IHJldHVybmNvZGU6
CisgICAgICAgICAgICBiYXNlX2NvbnRlbnQgPSBzZWxmLl9Db2xsYXBzZUtleXdvcmRzKGJhc2Vf
Y29udGVudCwga2V5d29yZHMpCisgICAgZWxzZToKKyAgICAgIFN0YXR1c1VwZGF0ZSgic3ZuIHN0
YXR1cyByZXR1cm5lZCB1bmV4cGVjdGVkIG91dHB1dDogJXMiICUgc3RhdHVzKQorICAgICAgc3lz
LmV4aXQoMSkKKyAgICByZXR1cm4gYmFzZV9jb250ZW50LCBuZXdfY29udGVudCwgaXNfYmluYXJ5
LCBzdGF0dXNbMDo1XQorCisKK2NsYXNzIEdpdFZDUyhWZXJzaW9uQ29udHJvbFN5c3RlbSk6Cisg
ICIiIkltcGxlbWVudGF0aW9uIG9mIHRoZSBWZXJzaW9uQ29udHJvbFN5c3RlbSBpbnRlcmZhY2Ug
Zm9yIEdpdC4iIiIKKworICBkZWYgX19pbml0X18oc2VsZiwgb3B0aW9ucyk6CisgICAgc3VwZXIo
R2l0VkNTLCBzZWxmKS5fX2luaXRfXyhvcHRpb25zKQorICAgICMgTWFwIG9mIGZpbGVuYW1lIC0+
IChoYXNoIGJlZm9yZSwgaGFzaCBhZnRlcikgb2YgYmFzZSBmaWxlLgorICAgICMgSGFzaGVzIGZv
ciAibm8gc3VjaCBmaWxlIiBhcmUgcmVwcmVzZW50ZWQgYXMgTm9uZS4KKyAgICBzZWxmLmhhc2hl
cyA9IHt9CisgICAgIyBNYXAgb2YgbmV3IGZpbGVuYW1lIC0+IG9sZCBmaWxlbmFtZSBmb3IgcmVu
YW1lcy4KKyAgICBzZWxmLnJlbmFtZXMgPSB7fQorCisgIGRlZiBHZW5lcmF0ZURpZmYoc2VsZiwg
ZXh0cmFfYXJncyk6CisgICAgIyBUaGlzIGlzIG1vcmUgY29tcGxpY2F0ZWQgdGhhbiBzdm4ncyBH
ZW5lcmF0ZURpZmYgYmVjYXVzZSB3ZSBtdXN0IGNvbnZlcnQKKyAgICAjIHRoZSBkaWZmIG91dHB1
dCB0byBpbmNsdWRlIGFuIHN2bi1zdHlsZSAiSW5kZXg6IiBsaW5lIGFzIHdlbGwgYXMgcmVjb3Jk
CisgICAgIyB0aGUgaGFzaGVzIG9mIHRoZSBmaWxlcywgc28gd2UgY2FuIHVwbG9hZCB0aGVtIGFs
b25nIHdpdGggb3VyIGRpZmYuCisKKyAgICAjIFNwZWNpYWwgdXNlZCBieSBnaXQgdG8gaW5kaWNh
dGUgIm5vIHN1Y2ggY29udGVudCIuCisgICAgTlVMTF9IQVNIID0gIjAiKjQwCisKKyAgICBleHRy
YV9hcmdzID0gZXh0cmFfYXJnc1s6XQorICAgIGlmIHNlbGYub3B0aW9ucy5yZXZpc2lvbjoKKyAg
ICAgIGV4dHJhX2FyZ3MgPSBbc2VsZi5vcHRpb25zLnJldmlzaW9uXSArIGV4dHJhX2FyZ3MKKwor
ICAgICMgLS1uby1leHQtZGlmZiBpcyBicm9rZW4gaW4gc29tZSB2ZXJzaW9ucyBvZiBHaXQsIHNv
IHRyeSB0byB3b3JrIGFyb3VuZAorICAgICMgdGhpcyBieSBvdmVycmlkaW5nIHRoZSBlbnZpcm9u
bWVudCAoYnV0IHRoZXJlIGlzIHN0aWxsIGEgcHJvYmxlbSBpZiB0aGUKKyAgICAjIGdpdCBjb25m
aWcga2V5ICJkaWZmLmV4dGVybmFsIiBpcyB1c2VkKS4KKyAgICBlbnYgPSBvcy5lbnZpcm9uLmNv
cHkoKQorICAgIGlmICdHSVRfRVhURVJOQUxfRElGRicgaW4gZW52OiBkZWwgZW52WydHSVRfRVhU
RVJOQUxfRElGRiddCisgICAgZ2l0ZGlmZiA9IFJ1blNoZWxsKFsiZ2l0IiwgImRpZmYiLCAiLS1u
by1leHQtZGlmZiIsICItLWZ1bGwtaW5kZXgiLCAiLU0iXQorICAgICAgICAgICAgICAgICAgICAg
ICArIGV4dHJhX2FyZ3MsIGVudj1lbnYpCisKKyAgICBkZWYgSXNGaWxlTmV3KGZpbGVuYW1lKToK
KyAgICAgIHJldHVybiBmaWxlbmFtZSBpbiBzZWxmLmhhc2hlcyBhbmQgc2VsZi5oYXNoZXNbZmls
ZW5hbWVdWzBdIGlzIE5vbmUKKworICAgIGRlZiBBZGRTdWJ2ZXJzaW9uUHJvcGVydHlDaGFuZ2Uo
ZmlsZW5hbWUpOgorICAgICAgIiIiQWRkIHN2bidzIHByb3BlcnR5IGNoYW5nZSBpbmZvcm1hdGlv
biBpbnRvIHRoZSBwYXRjaCBpZiBnaXZlbiBmaWxlIGlzCisgICAgICBuZXcgZmlsZS4KKworICAg
ICAgV2UgdXNlIFN1YnZlcnNpb24ncyBhdXRvLXByb3BzIHNldHRpbmcgdG8gcmV0cmlldmUgaXRz
IHByb3BlcnR5LgorICAgICAgU2VlIGh0dHA6Ly9zdm5ib29rLnJlZC1iZWFuLmNvbS9lbi8xLjEv
Y2gwNy5odG1sI3N2bi1jaC03LXNlY3QtMS4zLjIgZm9yCisgICAgICBTdWJ2ZXJzaW9uJ3MgW2F1
dG8tcHJvcHNdIHNldHRpbmcuCisgICAgICAiIiIKKyAgICAgIGlmIHNlbGYub3B0aW9ucy5lbXVs
YXRlX3N2bl9hdXRvX3Byb3BzIGFuZCBJc0ZpbGVOZXcoZmlsZW5hbWUpOgorICAgICAgICBzdm5w
cm9wcyA9IEdldFN1YnZlcnNpb25Qcm9wZXJ0eUNoYW5nZXMoZmlsZW5hbWUpCisgICAgICAgIGlm
IHN2bnByb3BzOgorICAgICAgICAgIHN2bmRpZmYuYXBwZW5kKCJcbiIgKyBzdm5wcm9wcyArICJc
biIpCisKKyAgICBzdm5kaWZmID0gW10KKyAgICBmaWxlY291bnQgPSAwCisgICAgZmlsZW5hbWUg
PSBOb25lCisgICAgZm9yIGxpbmUgaW4gZ2l0ZGlmZi5zcGxpdGxpbmVzKCk6CisgICAgICBtYXRj
aCA9IHJlLm1hdGNoKHIiZGlmZiAtLWdpdCBhLyguKikgYi8oLiopJCIsIGxpbmUpCisgICAgICBp
ZiBtYXRjaDoKKyAgICAgICAgIyBBZGQgYXV0byBwcm9wZXJ0eSBoZXJlIGZvciBwcmV2aW91c2x5
IHNlZW4gZmlsZS4KKyAgICAgICAgaWYgZmlsZW5hbWUgaXMgbm90IE5vbmU6CisgICAgICAgICAg
QWRkU3VidmVyc2lvblByb3BlcnR5Q2hhbmdlKGZpbGVuYW1lKQorICAgICAgICBmaWxlY291bnQg
Kz0gMQorICAgICAgICAjIEludGVudGlvbmFsbHkgdXNlIHRoZSAiYWZ0ZXIiIGZpbGVuYW1lIHNv
IHdlIGNhbiBzaG93IHJlbmFtZXMuCisgICAgICAgIGZpbGVuYW1lID0gbWF0Y2guZ3JvdXAoMikK
KyAgICAgICAgc3ZuZGlmZi5hcHBlbmQoIkluZGV4OiAlc1xuIiAlIGZpbGVuYW1lKQorICAgICAg
ICBpZiBtYXRjaC5ncm91cCgxKSAhPSBtYXRjaC5ncm91cCgyKToKKyAgICAgICAgICBzZWxmLnJl
bmFtZXNbbWF0Y2guZ3JvdXAoMildID0gbWF0Y2guZ3JvdXAoMSkKKyAgICAgIGVsc2U6CisgICAg
ICAgICMgVGhlICJpbmRleCIgbGluZSBpbiBhIGdpdCBkaWZmIGxvb2tzIGxpa2UgdGhpcyAobG9u
ZyBoYXNoZXMgZWxpZGVkKToKKyAgICAgICAgIyAgIGluZGV4IDgyYzBkNDQuLmIyY2VlM2YgMTAw
NzU1CisgICAgICAgICMgV2Ugd2FudCB0byBzYXZlIHRoZSBsZWZ0IGhhc2gsIGFzIHRoYXQgaWRl
bnRpZmllcyB0aGUgYmFzZSBmaWxlLgorICAgICAgICBtYXRjaCA9IHJlLm1hdGNoKHIiaW5kZXgg
KFx3KylcLlwuKFx3KykiLCBsaW5lKQorICAgICAgICBpZiBtYXRjaDoKKyAgICAgICAgICBiZWZv
cmUsIGFmdGVyID0gKG1hdGNoLmdyb3VwKDEpLCBtYXRjaC5ncm91cCgyKSkKKyAgICAgICAgICBp
ZiBiZWZvcmUgPT0gTlVMTF9IQVNIOgorICAgICAgICAgICAgYmVmb3JlID0gTm9uZQorICAgICAg
ICAgIGlmIGFmdGVyID09IE5VTExfSEFTSDoKKyAgICAgICAgICAgIGFmdGVyID0gTm9uZQorICAg
ICAgICAgIHNlbGYuaGFzaGVzW2ZpbGVuYW1lXSA9IChiZWZvcmUsIGFmdGVyKQorICAgICAgc3Zu
ZGlmZi5hcHBlbmQobGluZSArICJcbiIpCisgICAgaWYgbm90IGZpbGVjb3VudDoKKyAgICAgIEVy
cm9yRXhpdCgiTm8gdmFsaWQgcGF0Y2hlcyBmb3VuZCBpbiBvdXRwdXQgZnJvbSBnaXQgZGlmZiIp
CisgICAgIyBBZGQgYXV0byBwcm9wZXJ0eSBmb3IgdGhlIGxhc3Qgc2VlbiBmaWxlLgorICAgIGFz
c2VydCBmaWxlbmFtZSBpcyBub3QgTm9uZQorICAgIEFkZFN1YnZlcnNpb25Qcm9wZXJ0eUNoYW5n
ZShmaWxlbmFtZSkKKyAgICByZXR1cm4gIiIuam9pbihzdm5kaWZmKQorCisgIGRlZiBHZXRVbmtu
b3duRmlsZXMoc2VsZik6CisgICAgc3RhdHVzID0gUnVuU2hlbGwoWyJnaXQiLCAibHMtZmlsZXMi
LCAiLS1leGNsdWRlLXN0YW5kYXJkIiwgIi0tb3RoZXJzIl0sCisgICAgICAgICAgICAgICAgICAg
ICAgc2lsZW50X29rPVRydWUpCisgICAgcmV0dXJuIHN0YXR1cy5zcGxpdGxpbmVzKCkKKworICBk
ZWYgR2V0RmlsZUNvbnRlbnQoc2VsZiwgZmlsZV9oYXNoLCBpc19iaW5hcnkpOgorICAgICIiIlJl
dHVybnMgdGhlIGNvbnRlbnQgb2YgYSBmaWxlIGlkZW50aWZpZWQgYnkgaXRzIGdpdCBoYXNoLiIi
IgorICAgIGRhdGEsIHJldGNvZGUgPSBSdW5TaGVsbFdpdGhSZXR1cm5Db2RlKFsiZ2l0IiwgInNo
b3ciLCBmaWxlX2hhc2hdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICB1bml2ZXJzYWxfbmV3bGluZXM9bm90IGlzX2JpbmFyeSkKKyAgICBpZiByZXRjb2RlOgor
ICAgICAgRXJyb3JFeGl0KCJHb3QgZXJyb3Igc3RhdHVzIGZyb20gJ2dpdCBzaG93ICVzJyIgJSBm
aWxlX2hhc2gpCisgICAgcmV0dXJuIGRhdGEKKworICBkZWYgR2V0QmFzZUZpbGUoc2VsZiwgZmls
ZW5hbWUpOgorICAgIGhhc2hfYmVmb3JlLCBoYXNoX2FmdGVyID0gc2VsZi5oYXNoZXMuZ2V0KGZp
bGVuYW1lLCAoTm9uZSxOb25lKSkKKyAgICBiYXNlX2NvbnRlbnQgPSBOb25lCisgICAgbmV3X2Nv
bnRlbnQgPSBOb25lCisgICAgaXNfYmluYXJ5ID0gc2VsZi5Jc0JpbmFyeShmaWxlbmFtZSkKKyAg
ICBzdGF0dXMgPSBOb25lCisKKyAgICBpZiBmaWxlbmFtZSBpbiBzZWxmLnJlbmFtZXM6CisgICAg
ICBzdGF0dXMgPSAiQSArIiAgIyBNYXRjaCBzdm4gYXR0cmlidXRlIG5hbWUgZm9yIHJlbmFtZXMu
CisgICAgICBpZiBmaWxlbmFtZSBub3QgaW4gc2VsZi5oYXNoZXM6CisgICAgICAgICMgSWYgYSBy
ZW5hbWUgZG9lc24ndCBjaGFuZ2UgdGhlIGNvbnRlbnQsIHdlIG5ldmVyIGdldCBhIGhhc2guCisg
ICAgICAgIGJhc2VfY29udGVudCA9IFJ1blNoZWxsKFsiZ2l0IiwgInNob3ciLCAiSEVBRDoiICsg
ZmlsZW5hbWVdKQorICAgIGVsaWYgbm90IGhhc2hfYmVmb3JlOgorICAgICAgc3RhdHVzID0gIkEi
CisgICAgICBiYXNlX2NvbnRlbnQgPSAiIgorICAgIGVsaWYgbm90IGhhc2hfYWZ0ZXI6CisgICAg
ICBzdGF0dXMgPSAiRCIKKyAgICBlbHNlOgorICAgICAgc3RhdHVzID0gIk0iCisKKyAgICBpc19p
bWFnZSA9IHNlbGYuSXNJbWFnZShmaWxlbmFtZSkKKworICAgICMgR3JhYiB0aGUgYmVmb3JlL2Fm
dGVyIGNvbnRlbnQgaWYgd2UgbmVlZCBpdC4KKyAgICAjIFdlIHNob3VsZCBpbmNsdWRlIGZpbGUg
Y29udGVudHMgaWYgaXQncyB0ZXh0IG9yIGl0J3MgYW4gaW1hZ2UuCisgICAgaWYgbm90IGlzX2Jp
bmFyeSBvciBpc19pbWFnZToKKyAgICAgICMgR3JhYiB0aGUgYmFzZSBjb250ZW50IGlmIHdlIGRv
bid0IGhhdmUgaXQgYWxyZWFkeS4KKyAgICAgIGlmIGJhc2VfY29udGVudCBpcyBOb25lIGFuZCBo
YXNoX2JlZm9yZToKKyAgICAgICAgYmFzZV9jb250ZW50ID0gc2VsZi5HZXRGaWxlQ29udGVudCho
YXNoX2JlZm9yZSwgaXNfYmluYXJ5KQorICAgICAgIyBPbmx5IGluY2x1ZGUgdGhlICJhZnRlciIg
ZmlsZSBpZiBpdCdzIGFuIGltYWdlOyBvdGhlcndpc2UgaXQKKyAgICAgICMgaXQgaXMgcmVjb25z
dHJ1Y3RlZCBmcm9tIHRoZSBkaWZmLgorICAgICAgaWYgaXNfaW1hZ2UgYW5kIGhhc2hfYWZ0ZXI6
CisgICAgICAgIG5ld19jb250ZW50ID0gc2VsZi5HZXRGaWxlQ29udGVudChoYXNoX2FmdGVyLCBp
c19iaW5hcnkpCisKKyAgICByZXR1cm4gKGJhc2VfY29udGVudCwgbmV3X2NvbnRlbnQsIGlzX2Jp
bmFyeSwgc3RhdHVzKQorCisKK2NsYXNzIE1lcmN1cmlhbFZDUyhWZXJzaW9uQ29udHJvbFN5c3Rl
bSk6CisgICIiIkltcGxlbWVudGF0aW9uIG9mIHRoZSBWZXJzaW9uQ29udHJvbFN5c3RlbSBpbnRl
cmZhY2UgZm9yIE1lcmN1cmlhbC4iIiIKKworICBkZWYgX19pbml0X18oc2VsZiwgb3B0aW9ucywg
cmVwb19kaXIpOgorICAgIHN1cGVyKE1lcmN1cmlhbFZDUywgc2VsZikuX19pbml0X18ob3B0aW9u
cykKKyAgICAjIEFic29sdXRlIHBhdGggdG8gcmVwb3NpdG9yeSAod2UgY2FuIGJlIGluIGEgc3Vi
ZGlyKQorICAgIHNlbGYucmVwb19kaXIgPSBvcy5wYXRoLm5vcm1wYXRoKHJlcG9fZGlyKQorICAg
ICMgQ29tcHV0ZSB0aGUgc3ViZGlyCisgICAgY3dkID0gb3MucGF0aC5ub3JtcGF0aChvcy5nZXRj
d2QoKSkKKyAgICBhc3NlcnQgY3dkLnN0YXJ0c3dpdGgoc2VsZi5yZXBvX2RpcikKKyAgICBzZWxm
LnN1YmRpciA9IGN3ZFtsZW4oc2VsZi5yZXBvX2Rpcik6XS5sc3RyaXAociJcLyIpCisgICAgaWYg
c2VsZi5vcHRpb25zLnJldmlzaW9uOgorICAgICAgc2VsZi5iYXNlX3JldiA9IHNlbGYub3B0aW9u
cy5yZXZpc2lvbgorICAgIGVsc2U6CisgICAgICBzZWxmLmJhc2VfcmV2ID0gUnVuU2hlbGwoWyJo
ZyIsICJwYXJlbnQiLCAiLXEiXSkuc3BsaXQoJzonKVsxXS5zdHJpcCgpCisKKyAgZGVmIF9HZXRS
ZWxQYXRoKHNlbGYsIGZpbGVuYW1lKToKKyAgICAiIiJHZXQgcmVsYXRpdmUgcGF0aCBvZiBhIGZp
bGUgYWNjb3JkaW5nIHRvIHRoZSBjdXJyZW50IGRpcmVjdG9yeSwKKyAgICBnaXZlbiBpdHMgbG9n
aWNhbCBwYXRoIGluIHRoZSByZXBvLiIiIgorICAgIGFzc2VydCBmaWxlbmFtZS5zdGFydHN3aXRo
KHNlbGYuc3ViZGlyKSwgKGZpbGVuYW1lLCBzZWxmLnN1YmRpcikKKyAgICByZXR1cm4gZmlsZW5h
bWVbbGVuKHNlbGYuc3ViZGlyKTpdLmxzdHJpcChyIlwvIikKKworICBkZWYgR2VuZXJhdGVEaWZm
KHNlbGYsIGV4dHJhX2FyZ3MpOgorICAgICMgSWYgbm8gZmlsZSBzcGVjaWZpZWQsIHJlc3RyaWN0
IHRvIHRoZSBjdXJyZW50IHN1YmRpcgorICAgIGV4dHJhX2FyZ3MgPSBleHRyYV9hcmdzIG9yIFsi
LiJdCisgICAgY21kID0gWyJoZyIsICJkaWZmIiwgIi0tZ2l0IiwgIi1yIiwgc2VsZi5iYXNlX3Jl
dl0gKyBleHRyYV9hcmdzCisgICAgZGF0YSA9IFJ1blNoZWxsKGNtZCwgc2lsZW50X29rPVRydWUp
CisgICAgc3ZuZGlmZiA9IFtdCisgICAgZmlsZWNvdW50ID0gMAorICAgIGZvciBsaW5lIGluIGRh
dGEuc3BsaXRsaW5lcygpOgorICAgICAgbSA9IHJlLm1hdGNoKCJkaWZmIC0tZ2l0IGEvKFxTKykg
Yi8oXFMrKSIsIGxpbmUpCisgICAgICBpZiBtOgorICAgICAgICAjIE1vZGlmeSBsaW5lIHRvIG1h
a2UgaXQgbG9vayBsaWtlIGFzIGl0IGNvbWVzIGZyb20gc3ZuIGRpZmYuCisgICAgICAgICMgV2l0
aCB0aGlzIG1vZGlmaWNhdGlvbiBubyBjaGFuZ2VzIG9uIHRoZSBzZXJ2ZXIgc2lkZSBhcmUgcmVx
dWlyZWQKKyAgICAgICAgIyB0byBtYWtlIHVwbG9hZC5weSB3b3JrIHdpdGggTWVyY3VyaWFsIHJl
cG9zLgorICAgICAgICAjIE5PVEU6IGZvciBwcm9wZXIgaGFuZGxpbmcgb2YgbW92ZWQvY29waWVk
IGZpbGVzLCB3ZSBoYXZlIHRvIHVzZQorICAgICAgICAjIHRoZSBzZWNvbmQgZmlsZW5hbWUuCisg
ICAgICAgIGZpbGVuYW1lID0gbS5ncm91cCgyKQorICAgICAgICBzdm5kaWZmLmFwcGVuZCgiSW5k
ZXg6ICVzIiAlIGZpbGVuYW1lKQorICAgICAgICBzdm5kaWZmLmFwcGVuZCgiPSIgKiA2NykKKyAg
ICAgICAgZmlsZWNvdW50ICs9IDEKKyAgICAgICAgbG9nZ2luZy5pbmZvKGxpbmUpCisgICAgICBl
bHNlOgorICAgICAgICBzdm5kaWZmLmFwcGVuZChsaW5lKQorICAgIGlmIG5vdCBmaWxlY291bnQ6
CisgICAgICBFcnJvckV4aXQoIk5vIHZhbGlkIHBhdGNoZXMgZm91bmQgaW4gb3V0cHV0IGZyb20g
aGcgZGlmZiIpCisgICAgcmV0dXJuICJcbiIuam9pbihzdm5kaWZmKSArICJcbiIKKworICBkZWYg
R2V0VW5rbm93bkZpbGVzKHNlbGYpOgorICAgICIiIlJldHVybiBhIGxpc3Qgb2YgZmlsZXMgdW5r
bm93biB0byB0aGUgVkNTLiIiIgorICAgIGFyZ3MgPSBbXQorICAgIHN0YXR1cyA9IFJ1blNoZWxs
KFsiaGciLCAic3RhdHVzIiwgIi0tcmV2Iiwgc2VsZi5iYXNlX3JldiwgIi11IiwgIi4iXSwKKyAg
ICAgICAgc2lsZW50X29rPVRydWUpCisgICAgdW5rbm93bl9maWxlcyA9IFtdCisgICAgZm9yIGxp
bmUgaW4gc3RhdHVzLnNwbGl0bGluZXMoKToKKyAgICAgIHN0LCBmbiA9IGxpbmUuc3BsaXQoIiAi
LCAxKQorICAgICAgaWYgc3QgPT0gIj8iOgorICAgICAgICB1bmtub3duX2ZpbGVzLmFwcGVuZChm
bikKKyAgICByZXR1cm4gdW5rbm93bl9maWxlcworCisgIGRlZiBHZXRCYXNlRmlsZShzZWxmLCBm
aWxlbmFtZSk6CisgICAgIyAiaGcgc3RhdHVzIiBhbmQgImhnIGNhdCIgYm90aCB0YWtlIGEgcGF0
aCByZWxhdGl2ZSB0byB0aGUgY3VycmVudCBzdWJkaXIKKyAgICAjIHJhdGhlciB0aGFuIHRvIHRo
ZSByZXBvIHJvb3QsIGJ1dCAiaGcgZGlmZiIgaGFzIGdpdmVuIHVzIHRoZSBmdWxsIHBhdGgKKyAg
ICAjIHRvIHRoZSByZXBvIHJvb3QuCisgICAgYmFzZV9jb250ZW50ID0gIiIKKyAgICBuZXdfY29u
dGVudCA9IE5vbmUKKyAgICBpc19iaW5hcnkgPSBGYWxzZQorICAgIG9sZHJlbHBhdGggPSByZWxw
YXRoID0gc2VsZi5fR2V0UmVsUGF0aChmaWxlbmFtZSkKKyAgICAjICJoZyBzdGF0dXMgLUMiIHJl
dHVybnMgdHdvIGxpbmVzIGZvciBtb3ZlZC9jb3BpZWQgZmlsZXMsIG9uZSBvdGhlcndpc2UKKyAg
ICBvdXQgPSBSdW5TaGVsbChbImhnIiwgInN0YXR1cyIsICItQyIsICItLXJldiIsIHNlbGYuYmFz
ZV9yZXYsIHJlbHBhdGhdKQorICAgIG91dCA9IG91dC5zcGxpdGxpbmVzKCkKKyAgICAjIEhBQ0s6
IHN0cmlwIGVycm9yIG1lc3NhZ2UgYWJvdXQgbWlzc2luZyBmaWxlL2RpcmVjdG9yeSBpZiBpdCBp
c24ndCBpbgorICAgICMgdGhlIHdvcmtpbmcgY29weQorICAgIGlmIG91dFswXS5zdGFydHN3aXRo
KCclczogJyAlIHJlbHBhdGgpOgorICAgICAgb3V0ID0gb3V0WzE6XQorICAgIGlmIGxlbihvdXQp
ID4gMToKKyAgICAgICMgTW92ZWQvY29waWVkID0+IGNvbnNpZGVyZWQgYXMgbW9kaWZpZWQsIHVz
ZSBvbGQgZmlsZW5hbWUgdG8KKyAgICAgICMgcmV0cmlldmUgYmFzZSBjb250ZW50cworICAgICAg
b2xkcmVscGF0aCA9IG91dFsxXS5zdHJpcCgpCisgICAgICBzdGF0dXMgPSAiTSIKKyAgICBlbHNl
OgorICAgICAgc3RhdHVzLCBfID0gb3V0WzBdLnNwbGl0KCcgJywgMSkKKyAgICBpZiAiOiIgaW4g
c2VsZi5iYXNlX3JldjoKKyAgICAgIGJhc2VfcmV2ID0gc2VsZi5iYXNlX3Jldi5zcGxpdCgiOiIs
IDEpWzBdCisgICAgZWxzZToKKyAgICAgIGJhc2VfcmV2ID0gc2VsZi5iYXNlX3JldgorICAgIGlm
IHN0YXR1cyAhPSAiQSI6CisgICAgICBiYXNlX2NvbnRlbnQgPSBSdW5TaGVsbChbImhnIiwgImNh
dCIsICItciIsIGJhc2VfcmV2LCBvbGRyZWxwYXRoXSwKKyAgICAgICAgc2lsZW50X29rPVRydWUp
CisgICAgICBpc19iaW5hcnkgPSAiXDAiIGluIGJhc2VfY29udGVudCAgIyBNZXJjdXJpYWwncyBo
ZXVyaXN0aWMKKyAgICBpZiBzdGF0dXMgIT0gIlIiOgorICAgICAgbmV3X2NvbnRlbnQgPSBvcGVu
KHJlbHBhdGgsICJyYiIpLnJlYWQoKQorICAgICAgaXNfYmluYXJ5ID0gaXNfYmluYXJ5IG9yICJc
MCIgaW4gbmV3X2NvbnRlbnQKKyAgICBpZiBpc19iaW5hcnkgYW5kIGJhc2VfY29udGVudDoKKyAg
ICAgICMgRmV0Y2ggYWdhaW4gd2l0aG91dCBjb252ZXJ0aW5nIG5ld2xpbmVzCisgICAgICBiYXNl
X2NvbnRlbnQgPSBSdW5TaGVsbChbImhnIiwgImNhdCIsICItciIsIGJhc2VfcmV2LCBvbGRyZWxw
YXRoXSwKKyAgICAgICAgc2lsZW50X29rPVRydWUsIHVuaXZlcnNhbF9uZXdsaW5lcz1GYWxzZSkK
KyAgICBpZiBub3QgaXNfYmluYXJ5IG9yIG5vdCBzZWxmLklzSW1hZ2UocmVscGF0aCk6CisgICAg
ICBuZXdfY29udGVudCA9IE5vbmUKKyAgICByZXR1cm4gYmFzZV9jb250ZW50LCBuZXdfY29udGVu
dCwgaXNfYmluYXJ5LCBzdGF0dXMKKworCisjIE5PVEU6IFRoZSBTcGxpdFBhdGNoIGZ1bmN0aW9u
IGlzIGR1cGxpY2F0ZWQgaW4gZW5naW5lLnB5LCBrZWVwIHRoZW0gaW4gc3luYy4KK2RlZiBTcGxp
dFBhdGNoKGRhdGEpOgorICAiIiJTcGxpdHMgYSBwYXRjaCBpbnRvIHNlcGFyYXRlIHBpZWNlcyBm
b3IgZWFjaCBmaWxlLgorCisgIEFyZ3M6CisgICAgZGF0YTogQSBzdHJpbmcgY29udGFpbmluZyB0
aGUgb3V0cHV0IG9mIHN2biBkaWZmLgorCisgIFJldHVybnM6CisgICAgQSBsaXN0IG9mIDItdHVw
bGUgKGZpbGVuYW1lLCB0ZXh0KSB3aGVyZSB0ZXh0IGlzIHRoZSBzdm4gZGlmZiBvdXRwdXQKKyAg
ICAgIHBlcnRhaW5pbmcgdG8gZmlsZW5hbWUuCisgICIiIgorICBwYXRjaGVzID0gW10KKyAgZmls
ZW5hbWUgPSBOb25lCisgIGRpZmYgPSBbXQorICBmb3IgbGluZSBpbiBkYXRhLnNwbGl0bGluZXMo
VHJ1ZSk6CisgICAgbmV3X2ZpbGVuYW1lID0gTm9uZQorICAgIGlmIGxpbmUuc3RhcnRzd2l0aCgn
SW5kZXg6Jyk6CisgICAgICB1bnVzZWQsIG5ld19maWxlbmFtZSA9IGxpbmUuc3BsaXQoJzonLCAx
KQorICAgICAgbmV3X2ZpbGVuYW1lID0gbmV3X2ZpbGVuYW1lLnN0cmlwKCkKKyAgICBlbGlmIGxp
bmUuc3RhcnRzd2l0aCgnUHJvcGVydHkgY2hhbmdlcyBvbjonKToKKyAgICAgIHVudXNlZCwgdGVt
cF9maWxlbmFtZSA9IGxpbmUuc3BsaXQoJzonLCAxKQorICAgICAgIyBXaGVuIGEgZmlsZSBpcyBt
b2RpZmllZCwgcGF0aHMgdXNlICcvJyBiZXR3ZWVuIGRpcmVjdG9yaWVzLCBob3dldmVyCisgICAg
ICAjIHdoZW4gYSBwcm9wZXJ0eSBpcyBtb2RpZmllZCAnXCcgaXMgdXNlZCBvbiBXaW5kb3dzLiAg
TWFrZSB0aGVtIHRoZSBzYW1lCisgICAgICAjIG90aGVyd2lzZSB0aGUgZmlsZSBzaG93cyB1cCB0
d2ljZS4KKyAgICAgIHRlbXBfZmlsZW5hbWUgPSB0ZW1wX2ZpbGVuYW1lLnN0cmlwKCkucmVwbGFj
ZSgnXFwnLCAnLycpCisgICAgICBpZiB0ZW1wX2ZpbGVuYW1lICE9IGZpbGVuYW1lOgorICAgICAg
ICAjIEZpbGUgaGFzIHByb3BlcnR5IGNoYW5nZXMgYnV0IG5vIG1vZGlmaWNhdGlvbnMsIGNyZWF0
ZSBhIG5ldyBkaWZmLgorICAgICAgICBuZXdfZmlsZW5hbWUgPSB0ZW1wX2ZpbGVuYW1lCisgICAg
aWYgbmV3X2ZpbGVuYW1lOgorICAgICAgaWYgZmlsZW5hbWUgYW5kIGRpZmY6CisgICAgICAgIHBh
dGNoZXMuYXBwZW5kKChmaWxlbmFtZSwgJycuam9pbihkaWZmKSkpCisgICAgICBmaWxlbmFtZSA9
IG5ld19maWxlbmFtZQorICAgICAgZGlmZiA9IFtsaW5lXQorICAgICAgY29udGludWUKKyAgICBp
ZiBkaWZmIGlzIG5vdCBOb25lOgorICAgICAgZGlmZi5hcHBlbmQobGluZSkKKyAgaWYgZmlsZW5h
bWUgYW5kIGRpZmY6CisgICAgcGF0Y2hlcy5hcHBlbmQoKGZpbGVuYW1lLCAnJy5qb2luKGRpZmYp
KSkKKyAgcmV0dXJuIHBhdGNoZXMKKworCitkZWYgVXBsb2FkU2VwYXJhdGVQYXRjaGVzKGlzc3Vl
LCBycGNfc2VydmVyLCBwYXRjaHNldCwgZGF0YSwgb3B0aW9ucyk6CisgICIiIlVwbG9hZHMgYSBz
ZXBhcmF0ZSBwYXRjaCBmb3IgZWFjaCBmaWxlIGluIHRoZSBkaWZmIG91dHB1dC4KKworICBSZXR1
cm5zIGEgbGlzdCBvZiBbcGF0Y2hfa2V5LCBmaWxlbmFtZV0gZm9yIGVhY2ggZmlsZS4KKyAgIiIi
CisgIHBhdGNoZXMgPSBTcGxpdFBhdGNoKGRhdGEpCisgIHJ2ID0gW10KKyAgZm9yIHBhdGNoIGlu
IHBhdGNoZXM6CisgICAgaWYgbGVuKHBhdGNoWzFdKSA+IE1BWF9VUExPQURfU0laRToKKyAgICAg
IHByaW50ICgiTm90IHVwbG9hZGluZyB0aGUgcGF0Y2ggZm9yICIgKyBwYXRjaFswXSArCisgICAg
ICAgICAgICAgIiBiZWNhdXNlIHRoZSBmaWxlIGlzIHRvbyBsYXJnZS4iKQorICAgICAgY29udGlu
dWUKKyAgICBmb3JtX2ZpZWxkcyA9IFsoImZpbGVuYW1lIiwgcGF0Y2hbMF0pXQorICAgIGlmIG5v
dCBvcHRpb25zLmRvd25sb2FkX2Jhc2U6CisgICAgICBmb3JtX2ZpZWxkcy5hcHBlbmQoKCJjb250
ZW50X3VwbG9hZCIsICIxIikpCisgICAgZmlsZXMgPSBbKCJkYXRhIiwgImRhdGEuZGlmZiIsIHBh
dGNoWzFdKV0KKyAgICBjdHlwZSwgYm9keSA9IEVuY29kZU11bHRpcGFydEZvcm1EYXRhKGZvcm1f
ZmllbGRzLCBmaWxlcykKKyAgICB1cmwgPSAiLyVkL3VwbG9hZF9wYXRjaC8lZCIgJSAoaW50KGlz
c3VlKSwgaW50KHBhdGNoc2V0KSkKKyAgICBwcmludCAiVXBsb2FkaW5nIHBhdGNoIGZvciAiICsg
cGF0Y2hbMF0KKyAgICByZXNwb25zZV9ib2R5ID0gcnBjX3NlcnZlci5TZW5kKHVybCwgYm9keSwg
Y29udGVudF90eXBlPWN0eXBlKQorICAgIGxpbmVzID0gcmVzcG9uc2VfYm9keS5zcGxpdGxpbmVz
KCkKKyAgICBpZiBub3QgbGluZXMgb3IgbGluZXNbMF0gIT0gIk9LIjoKKyAgICAgIFN0YXR1c1Vw
ZGF0ZSgiICAtLT4gJXMiICUgcmVzcG9uc2VfYm9keSkKKyAgICAgIHN5cy5leGl0KDEpCisgICAg
cnYuYXBwZW5kKFtsaW5lc1sxXSwgcGF0Y2hbMF1dKQorICByZXR1cm4gcnYKKworCitkZWYgR3Vl
c3NWQ1NOYW1lKCk6CisgICIiIkhlbHBlciB0byBndWVzcyB0aGUgdmVyc2lvbiBjb250cm9sIHN5
c3RlbS4KKworICBUaGlzIGV4YW1pbmVzIHRoZSBjdXJyZW50IGRpcmVjdG9yeSwgZ3Vlc3NlcyB3
aGljaCBWZXJzaW9uQ29udHJvbFN5c3RlbQorICB3ZSdyZSB1c2luZywgYW5kIHJldHVybnMgYW4g
c3RyaW5nIGluZGljYXRpbmcgd2hpY2ggVkNTIGlzIGRldGVjdGVkLgorCisgIFJldHVybnM6Cisg
ICAgQSBwYWlyICh2Y3MsIG91dHB1dCkuICB2Y3MgaXMgYSBzdHJpbmcgaW5kaWNhdGluZyB3aGlj
aCBWQ1Mgd2FzIGRldGVjdGVkCisgICAgYW5kIGlzIG9uZSBvZiBWQ1NfR0lULCBWQ1NfTUVSQ1VS
SUFMLCBWQ1NfU1VCVkVSU0lPTiwgb3IgVkNTX1VOS05PV04uCisgICAgb3V0cHV0IGlzIGEgc3Ry
aW5nIGNvbnRhaW5pbmcgYW55IGludGVyZXN0aW5nIG91dHB1dCBmcm9tIHRoZSB2Y3MKKyAgICBk
ZXRlY3Rpb24gcm91dGluZSwgb3IgTm9uZSBpZiB0aGVyZSBpcyBub3RoaW5nIGludGVyZXN0aW5n
LgorICAiIiIKKyAgIyBNZXJjdXJpYWwgaGFzIGEgY29tbWFuZCB0byBnZXQgdGhlIGJhc2UgZGly
ZWN0b3J5IG9mIGEgcmVwb3NpdG9yeQorICAjIFRyeSBydW5uaW5nIGl0LCBidXQgZG9uJ3QgZGll
IGlmIHdlIGRvbid0IGhhdmUgaGcgaW5zdGFsbGVkLgorICAjIE5PVEU6IHdlIHRyeSBNZXJjdXJp
YWwgZmlyc3QgYXMgaXQgY2FuIHNpdCBvbiB0b3Agb2YgYW4gU1ZOIHdvcmtpbmcgY29weS4KKyAg
dHJ5OgorICAgIG91dCwgcmV0dXJuY29kZSA9IFJ1blNoZWxsV2l0aFJldHVybkNvZGUoWyJoZyIs
ICJyb290Il0pCisgICAgaWYgcmV0dXJuY29kZSA9PSAwOgorICAgICAgcmV0dXJuIChWQ1NfTUVS
Q1VSSUFMLCBvdXQuc3RyaXAoKSkKKyAgZXhjZXB0IE9TRXJyb3IsIChlcnJubywgbWVzc2FnZSk6
CisgICAgaWYgZXJybm8gIT0gMjogICMgRU5PRU5UIC0tIHRoZXkgZG9uJ3QgaGF2ZSBoZyBpbnN0
YWxsZWQuCisgICAgICByYWlzZQorCisgICMgU3VidmVyc2lvbiBoYXMgYSAuc3ZuIGluIGFsbCB3
b3JraW5nIGRpcmVjdG9yaWVzLgorICBpZiBvcy5wYXRoLmlzZGlyKCcuc3ZuJyk6CisgICAgbG9n
Z2luZy5pbmZvKCJHdWVzc2VkIFZDUyA9IFN1YnZlcnNpb24iKQorICAgIHJldHVybiAoVkNTX1NV
QlZFUlNJT04sIE5vbmUpCisKKyAgIyBHaXQgaGFzIGEgY29tbWFuZCB0byB0ZXN0IGlmIHlvdSdy
ZSBpbiBhIGdpdCB0cmVlLgorICAjIFRyeSBydW5uaW5nIGl0LCBidXQgZG9uJ3QgZGllIGlmIHdl
IGRvbid0IGhhdmUgZ2l0IGluc3RhbGxlZC4KKyAgdHJ5OgorICAgIG91dCwgcmV0dXJuY29kZSA9
IFJ1blNoZWxsV2l0aFJldHVybkNvZGUoWyJnaXQiLCAicmV2LXBhcnNlIiwKKyAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLS1pcy1pbnNpZGUtd29yay10cmVl
Il0pCisgICAgaWYgcmV0dXJuY29kZSA9PSAwOgorICAgICAgcmV0dXJuIChWQ1NfR0lULCBOb25l
KQorICBleGNlcHQgT1NFcnJvciwgKGVycm5vLCBtZXNzYWdlKToKKyAgICBpZiBlcnJubyAhPSAy
OiAgIyBFTk9FTlQgLS0gdGhleSBkb24ndCBoYXZlIGdpdCBpbnN0YWxsZWQuCisgICAgICByYWlz
ZQorCisgIHJldHVybiAoVkNTX1VOS05PV04sIE5vbmUpCisKKworZGVmIEd1ZXNzVkNTKG9wdGlv
bnMpOgorICAiIiJIZWxwZXIgdG8gZ3Vlc3MgdGhlIHZlcnNpb24gY29udHJvbCBzeXN0ZW0uCisK
KyAgVGhpcyB2ZXJpZmllcyBhbnkgdXNlci1zcGVjaWZpZWQgVmVyc2lvbkNvbnRyb2xTeXN0ZW0g
KGJ5IGNvbW1hbmQgbGluZQorICBvciBlbnZpcm9ubWVudCB2YXJpYWJsZSkuICBJZiB0aGUgdXNl
ciBkaWRuJ3Qgc3BlY2lmeSBvbmUsIHRoaXMgZXhhbWluZXMKKyAgdGhlIGN1cnJlbnQgZGlyZWN0
b3J5LCBndWVzc2VzIHdoaWNoIFZlcnNpb25Db250cm9sU3lzdGVtIHdlJ3JlIHVzaW5nLAorICBh
bmQgcmV0dXJucyBhbiBpbnN0YW5jZSBvZiB0aGUgYXBwcm9wcmlhdGUgY2xhc3MuICBFeGl0IHdp
dGggYW4gZXJyb3IKKyAgaWYgd2UgY2FuJ3QgZmlndXJlIGl0IG91dC4KKworICBSZXR1cm5zOgor
ICAgIEEgVmVyc2lvbkNvbnRyb2xTeXN0ZW0gaW5zdGFuY2UuIEV4aXRzIGlmIHRoZSBWQ1MgY2Fu
J3QgYmUgZ3Vlc3NlZC4KKyAgIiIiCisgIHZjcyA9IG9wdGlvbnMudmNzCisgIGlmIG5vdCB2Y3M6
CisgICAgdmNzID0gb3MuZW52aXJvbi5nZXQoIkNPREVSRVZJRVdfVkNTIikKKyAgaWYgdmNzOgor
ICAgIHYgPSBWQ1NfQUJCUkVWSUFUSU9OUy5nZXQodmNzLmxvd2VyKCkpCisgICAgaWYgdiBpcyBO
b25lOgorICAgICAgRXJyb3JFeGl0KCJVbmtub3duIHZlcnNpb24gY29udHJvbCBzeXN0ZW0gJXIg
c3BlY2lmaWVkLiIgJSB2Y3MpCisgICAgKHZjcywgZXh0cmFfb3V0cHV0KSA9ICh2LCBOb25lKQor
ICBlbHNlOgorICAgICh2Y3MsIGV4dHJhX291dHB1dCkgPSBHdWVzc1ZDU05hbWUoKQorCisgIGlm
IHZjcyA9PSBWQ1NfTUVSQ1VSSUFMOgorICAgIGlmIGV4dHJhX291dHB1dCBpcyBOb25lOgorICAg
ICAgZXh0cmFfb3V0cHV0ID0gUnVuU2hlbGwoWyJoZyIsICJyb290Il0pLnN0cmlwKCkKKyAgICBy
ZXR1cm4gTWVyY3VyaWFsVkNTKG9wdGlvbnMsIGV4dHJhX291dHB1dCkKKyAgZWxpZiB2Y3MgPT0g
VkNTX1NVQlZFUlNJT046CisgICAgcmV0dXJuIFN1YnZlcnNpb25WQ1Mob3B0aW9ucykKKyAgZWxp
ZiB2Y3MgPT0gVkNTX0dJVDoKKyAgICByZXR1cm4gR2l0VkNTKG9wdGlvbnMpCisKKyAgRXJyb3JF
eGl0KCgiQ291bGQgbm90IGd1ZXNzIHZlcnNpb24gY29udHJvbCBzeXN0ZW0uICIKKyAgICAgICAg
ICAgICAiQXJlIHlvdSBpbiBhIHdvcmtpbmcgY29weSBkaXJlY3Rvcnk/IikpCisKKworZGVmIENo
ZWNrUmV2aWV3ZXIocmV2aWV3ZXIpOgorICAiIiJWYWxpZGF0ZSBhIHJldmlld2VyIC0tIGVpdGhl
ciBhIG5pY2tuYW1lIG9yIGFuIGVtYWlsIGFkZHJlcy4KKworICBBcmdzOgorICAgIHJldmlld2Vy
OiBBIG5pY2tuYW1lIG9yIGFuIGVtYWlsIGFkZHJlc3MuCisKKyAgQ2FsbHMgRXJyb3JFeGl0KCkg
aWYgaXQgaXMgYW4gaW52YWxpZCBlbWFpbCBhZGRyZXNzLgorICAiIiIKKyAgaWYgIkAiIG5vdCBp
biByZXZpZXdlcjoKKyAgICByZXR1cm4gICMgQXNzdW1lIG5pY2tuYW1lCisgIHBhcnRzID0gcmV2
aWV3ZXIuc3BsaXQoIkAiKQorICBpZiBsZW4ocGFydHMpID4gMjoKKyAgICBFcnJvckV4aXQoIklu
dmFsaWQgZW1haWwgYWRkcmVzczogJXIiICUgcmV2aWV3ZXIpCisgIGFzc2VydCBsZW4ocGFydHMp
ID09IDIKKyAgaWYgIi4iIG5vdCBpbiBwYXJ0c1sxXToKKyAgICBFcnJvckV4aXQoIkludmFsaWQg
ZW1haWwgYWRkcmVzczogJXIiICUgcmV2aWV3ZXIpCisKKworZGVmIExvYWRTdWJ2ZXJzaW9uQXV0
b1Byb3BlcnRpZXMoKToKKyAgIiIiUmV0dXJucyB0aGUgY29udGVudCBvZiBbYXV0by1wcm9wc10g
c2VjdGlvbiBvZiBTdWJ2ZXJzaW9uJ3MgY29uZmlnIGZpbGUgYXMKKyAgYSBkaWN0aW9uYXJ5Lgor
CisgIFJldHVybnM6CisgICAgQSBkaWN0aW9uYXJ5IHdob3NlIGtleS12YWx1ZSBwYWlyIGNvcnJl
c3BvbmRzIHRoZSBbYXV0by1wcm9wc10gc2VjdGlvbidzCisgICAgICBrZXktdmFsdWUgcGFpci4K
KyAgICBJbiBmb2xsb3dpbmcgY2FzZXMsIHJldHVybnMgZW1wdHkgZGljdGlvbmFyeToKKyAgICAg
IC0gY29uZmlnIGZpbGUgZG9lc24ndCBleGlzdCwgb3IKKyAgICAgIC0gJ2VuYWJsZS1hdXRvLXBy
b3BzJyBpcyBub3Qgc2V0IHRvICd0cnVlLWxpa2UtdmFsdWUnIGluIFttaXNjZWxsYW55XS4KKyAg
IiIiCisgICMgVG9kbyhoYXlhdG8pOiBXaW5kb3dzIHVzZXJzIG1pZ2h0IHVzZSBkaWZmZXJlbnQg
cGF0aCBmb3IgY29uZmlndXJhdGlvbiBmaWxlLgorICBzdWJ2ZXJzaW9uX2NvbmZpZyA9IG9zLnBh
dGguZXhwYW5kdXNlcigifi8uc3VidmVyc2lvbi9jb25maWciKQorICBpZiBub3Qgb3MucGF0aC5l
eGlzdHMoc3VidmVyc2lvbl9jb25maWcpOgorICAgIHJldHVybiB7fQorICBjb25maWcgPSBDb25m
aWdQYXJzZXIuQ29uZmlnUGFyc2VyKCkKKyAgY29uZmlnLnJlYWQoc3VidmVyc2lvbl9jb25maWcp
CisgIGlmIChjb25maWcuaGFzX3NlY3Rpb24oIm1pc2NlbGxhbnkiKSBhbmQKKyAgICAgIGNvbmZp
Zy5oYXNfb3B0aW9uKCJtaXNjZWxsYW55IiwgImVuYWJsZS1hdXRvLXByb3BzIikgYW5kCisgICAg
ICBjb25maWcuZ2V0Ym9vbGVhbigibWlzY2VsbGFueSIsICJlbmFibGUtYXV0by1wcm9wcyIpIGFu
ZAorICAgICAgY29uZmlnLmhhc19zZWN0aW9uKCJhdXRvLXByb3BzIikpOgorICAgIHByb3BzID0g
e30KKyAgICBmb3IgZmlsZV9wYXR0ZXJuIGluIGNvbmZpZy5vcHRpb25zKCJhdXRvLXByb3BzIik6
CisgICAgICBwcm9wc1tmaWxlX3BhdHRlcm5dID0gUGFyc2VTdWJ2ZXJzaW9uUHJvcGVydHlWYWx1
ZXMoCisgICAgICAgIGNvbmZpZy5nZXQoImF1dG8tcHJvcHMiLCBmaWxlX3BhdHRlcm4pKQorICAg
IHJldHVybiBwcm9wcworICBlbHNlOgorICAgIHJldHVybiB7fQorCitkZWYgUGFyc2VTdWJ2ZXJz
aW9uUHJvcGVydHlWYWx1ZXMocHJvcHMpOgorICAiIiJQYXJzZSB0aGUgZ2l2ZW4gcHJvcGVydHkg
dmFsdWUgd2hpY2ggY29tZXMgZnJvbSBbYXV0by1wcm9wc10gc2VjdGlvbiBhbmQKKyAgcmV0dXJu
cyBhIGxpc3Qgd2hvc2UgZWxlbWVudCBpcyBhIChzdm5fcHJvcF9rZXksIHN2bl9wcm9wX3ZhbHVl
KSBwYWlyLgorCisgIFNlZSB0aGUgZm9sbG93aW5nIGRvY3Rlc3QgZm9yIGV4YW1wbGUuCisKKyAg
Pj4+IFBhcnNlU3VidmVyc2lvblByb3BlcnR5VmFsdWVzKCdzdm46ZW9sLXN0eWxlPUxGJykKKyAg
Wygnc3ZuOmVvbC1zdHlsZScsICdMRicpXQorICA+Pj4gUGFyc2VTdWJ2ZXJzaW9uUHJvcGVydHlW
YWx1ZXMoJ3N2bjptaW1lLXR5cGU9aW1hZ2UvanBlZycpCisgIFsoJ3N2bjptaW1lLXR5cGUnLCAn
aW1hZ2UvanBlZycpXQorICA+Pj4gUGFyc2VTdWJ2ZXJzaW9uUHJvcGVydHlWYWx1ZXMoJ3N2bjpl
b2wtc3R5bGU9TEY7c3ZuOmV4ZWN1dGFibGUnKQorICBbKCdzdm46ZW9sLXN0eWxlJywgJ0xGJyks
ICgnc3ZuOmV4ZWN1dGFibGUnLCAnKicpXQorICAiIiIKKyAga2V5X3ZhbHVlX3BhaXJzID0gW10K
KyAgZm9yIHByb3AgaW4gcHJvcHMuc3BsaXQoIjsiKToKKyAgICBrZXlfdmFsdWUgPSBwcm9wLnNw
bGl0KCI9IikKKyAgICBhc3NlcnQgbGVuKGtleV92YWx1ZSkgPD0gMgorICAgIGlmIGxlbihrZXlf
dmFsdWUpID09IDE6CisgICAgICAjIElmIHZhbHVlIGlzIG5vdCBnaXZlbiwgdXNlICcqJyBhcyBh
IFN1YnZlcnNpb24ncyBjb252ZW50aW9uLgorICAgICAga2V5X3ZhbHVlX3BhaXJzLmFwcGVuZCgo
a2V5X3ZhbHVlWzBdLCAiKiIpKQorICAgIGVsc2U6CisgICAgICBrZXlfdmFsdWVfcGFpcnMuYXBw
ZW5kKChrZXlfdmFsdWVbMF0sIGtleV92YWx1ZVsxXSkpCisgIHJldHVybiBrZXlfdmFsdWVfcGFp
cnMKKworCitkZWYgR2V0U3VidmVyc2lvblByb3BlcnR5Q2hhbmdlcyhmaWxlbmFtZSk6CisgICIi
IlJldHVybiBhIFN1YnZlcnNpb24ncyAnUHJvcGVydHkgY2hhbmdlcyBvbiAuLi4nIHN0cmluZywg
d2hpY2ggaXMgdXNlZCBpbgorICB0aGUgcGF0Y2ggZmlsZS4KKworICBBcmdzOgorICAgIGZpbGVu
YW1lOiBmaWxlbmFtZSB3aG9zZSBwcm9wZXJ0eSBtaWdodCBiZSBzZXQgYnkgW2F1dG8tcHJvcHNd
IGNvbmZpZy4KKworICBSZXR1cm5zOgorICAgIEEgc3RyaW5nIGxpa2UgJ1Byb3BlcnR5IGNoYW5n
ZXMgb24gfGZpbGVuYW1lfCAuLi4nIGlmIGdpdmVuIHxmaWxlbmFtZXwKKyAgICAgIG1hdGNoZXMg
YW55IGVudHJpZXMgaW4gW2F1dG8tcHJvcHNdIHNlY3Rpb24uIE5vbmUsIG90aGVyd2lzZS4KKyAg
IiIiCisgIGdsb2JhbCBzdm5fYXV0b19wcm9wc19tYXAKKyAgaWYgc3ZuX2F1dG9fcHJvcHNfbWFw
IGlzIE5vbmU6CisgICAgc3ZuX2F1dG9fcHJvcHNfbWFwID0gTG9hZFN1YnZlcnNpb25BdXRvUHJv
cGVydGllcygpCisKKyAgYWxsX3Byb3BzID0gW10KKyAgZm9yIGZpbGVfcGF0dGVybiwgcHJvcHMg
aW4gc3ZuX2F1dG9fcHJvcHNfbWFwLml0ZW1zKCk6CisgICAgaWYgZm5tYXRjaC5mbm1hdGNoKGZp
bGVuYW1lLCBmaWxlX3BhdHRlcm4pOgorICAgICAgYWxsX3Byb3BzLmV4dGVuZChwcm9wcykKKyAg
aWYgYWxsX3Byb3BzOgorICAgIHJldHVybiBGb3JtYXRTdWJ2ZXJzaW9uUHJvcGVydHlDaGFuZ2Vz
KGZpbGVuYW1lLCBhbGxfcHJvcHMpCisgIHJldHVybiBOb25lCisKKworZGVmIEZvcm1hdFN1YnZl
cnNpb25Qcm9wZXJ0eUNoYW5nZXMoZmlsZW5hbWUsIHByb3BzKToKKyAgIiIiUmV0dXJucyBTdWJ2
ZXJzaW9uJ3MgJ1Byb3BlcnR5IGNoYW5nZXMgb24gLi4uJyBzdHJpbmdzIHVzaW5nIGdpdmVuIGZp
bGVuYW1lCisgIGFuZCBwcm9wZXJ0aWVzLgorCisgIEFyZ3M6CisgICAgZmlsZW5hbWU6IGZpbGVu
YW1lCisgICAgcHJvcHM6IEEgbGlzdCB3aG9zZSBlbGVtZW50IGlzIGEgKHN2bl9wcm9wX2tleSwg
c3ZuX3Byb3BfdmFsdWUpIHBhaXIuCisKKyAgUmV0dXJuczoKKyAgICBBIHN0cmluZyB3aGljaCBj
YW4gYmUgdXNlZCBpbiB0aGUgcGF0Y2ggZmlsZSBmb3IgU3VidmVyc2lvbi4KKworICBTZWUgdGhl
IGZvbGxvd2luZyBkb2N0ZXN0IGZvciBleGFtcGxlLgorCisgID4+PiBwcmludCBGb3JtYXRTdWJ2
ZXJzaW9uUHJvcGVydHlDaGFuZ2VzKCdmb28uY2MnLCBbKCdzdm46ZW9sLXN0eWxlJywgJ0xGJyld
KQorICBQcm9wZXJ0eSBjaGFuZ2VzIG9uOiBmb28uY2MKKyAgX19fX19fX19fX19fX19fX19fX19f
X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXworICBBZGRlZDog
c3ZuOmVvbC1zdHlsZQorICAgICArIExGCisgIDxCTEFOS0xJTkU+CisgICIiIgorICBwcm9wX2No
YW5nZXNfbGluZXMgPSBbCisgICAgIlByb3BlcnR5IGNoYW5nZXMgb246ICVzIiAlIGZpbGVuYW1l
LAorICAgICJfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f
X19fX19fX19fX19fX19fX19fIl0KKyAgZm9yIGtleSwgdmFsdWUgaW4gcHJvcHM6CisgICAgcHJv
cF9jaGFuZ2VzX2xpbmVzLmFwcGVuZCgiQWRkZWQ6ICIgKyBrZXkpCisgICAgcHJvcF9jaGFuZ2Vz
X2xpbmVzLmFwcGVuZCgiICAgKyAiICsgdmFsdWUpCisgIHJldHVybiAiXG4iLmpvaW4ocHJvcF9j
aGFuZ2VzX2xpbmVzKSArICJcbiIKKworCitkZWYgUmVhbE1haW4oYXJndiwgZGF0YT1Ob25lKToK
KyAgIiIiVGhlIHJlYWwgbWFpbiBmdW5jdGlvbi4KKworICBBcmdzOgorICAgIGFyZ3Y6IENvbW1h
bmQgbGluZSBhcmd1bWVudHMuCisgICAgZGF0YTogRGlmZiBjb250ZW50cy4gSWYgTm9uZSAoZGVm
YXVsdCkgdGhlIGRpZmYgaXMgZ2VuZXJhdGVkIGJ5CisgICAgICB0aGUgVmVyc2lvbkNvbnRyb2xT
eXN0ZW0gaW1wbGVtZW50YXRpb24gcmV0dXJuZWQgYnkgR3Vlc3NWQ1MoKS4KKworICBSZXR1cm5z
OgorICAgIEEgMi10dXBsZSAoaXNzdWUgaWQsIHBhdGNoc2V0IGlkKS4KKyAgICBUaGUgcGF0Y2hz
ZXQgaWQgaXMgTm9uZSBpZiB0aGUgYmFzZSBmaWxlcyBhcmUgbm90IHVwbG9hZGVkIGJ5IHRoaXMK
KyAgICBzY3JpcHQgKGFwcGxpZXMgb25seSB0byBTVk4gY2hlY2tvdXRzKS4KKyAgIiIiCisgIGxv
Z2dpbmcuYmFzaWNDb25maWcoZm9ybWF0PSgiJShhc2N0aW1lKS4xOXMgJShsZXZlbG5hbWUpcyAl
KGZpbGVuYW1lKXM6IgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiUobGluZW5vKXMg
JShtZXNzYWdlKXMgIikpCisgIG9zLmVudmlyb25bJ0xDX0FMTCddID0gJ0MnCisgIG9wdGlvbnMs
IGFyZ3MgPSBwYXJzZXIucGFyc2VfYXJncyhhcmd2WzE6XSkKKyAgZ2xvYmFsIHZlcmJvc2l0eQor
ICB2ZXJib3NpdHkgPSBvcHRpb25zLnZlcmJvc2UKKyAgaWYgdmVyYm9zaXR5ID49IDM6CisgICAg
bG9nZ2luZy5nZXRMb2dnZXIoKS5zZXRMZXZlbChsb2dnaW5nLkRFQlVHKQorICBlbGlmIHZlcmJv
c2l0eSA+PSAyOgorICAgIGxvZ2dpbmcuZ2V0TG9nZ2VyKCkuc2V0TGV2ZWwobG9nZ2luZy5JTkZP
KQorCisgIHZjcyA9IEd1ZXNzVkNTKG9wdGlvbnMpCisKKyAgYmFzZSA9IG9wdGlvbnMuYmFzZV91
cmwKKyAgaWYgaXNpbnN0YW5jZSh2Y3MsIFN1YnZlcnNpb25WQ1MpOgorICAgICMgR3Vlc3Npbmcg
dGhlIGJhc2UgZmllbGQgaXMgb25seSBzdXBwb3J0ZWQgZm9yIFN1YnZlcnNpb24uCisgICAgIyBO
b3RlOiBGZXRjaGluZyBiYXNlIGZpbGVzIG1heSBiZWNvbWUgZGVwcmVjYXRlZCBpbiBmdXR1cmUg
cmVsZWFzZXMuCisgICAgZ3Vlc3NlZF9iYXNlID0gdmNzLkd1ZXNzQmFzZShvcHRpb25zLmRvd25s
b2FkX2Jhc2UpCisgICAgaWYgYmFzZToKKyAgICAgIGlmIGd1ZXNzZWRfYmFzZSBhbmQgYmFzZSAh
PSBndWVzc2VkX2Jhc2U6CisgICAgICAgIHByaW50ICJVc2luZyBiYXNlIFVSTCBcIiVzXCIgZnJv
bSAtLWJhc2VfdXJsIGluc3RlYWQgb2YgXCIlc1wiIiAlIFwKKyAgICAgICAgICAgIChiYXNlLCBn
dWVzc2VkX2Jhc2UpCisgICAgZWxzZToKKyAgICAgIGJhc2UgPSBndWVzc2VkX2Jhc2UKKworICBp
ZiBub3QgYmFzZSBhbmQgb3B0aW9ucy5kb3dubG9hZF9iYXNlOgorICAgIG9wdGlvbnMuZG93bmxv
YWRfYmFzZSA9IFRydWUKKyAgICBsb2dnaW5nLmluZm8oIkVuYWJsZWQgdXBsb2FkIG9mIGJhc2Ug
ZmlsZSIpCisgIGlmIG5vdCBvcHRpb25zLmFzc3VtZV95ZXM6CisgICAgdmNzLkNoZWNrRm9yVW5r
bm93bkZpbGVzKCkKKyAgaWYgZGF0YSBpcyBOb25lOgorICAgIGRhdGEgPSB2Y3MuR2VuZXJhdGVE
aWZmKGFyZ3MpCisgIGZpbGVzID0gdmNzLkdldEJhc2VGaWxlcyhkYXRhKQorICBpZiB2ZXJib3Np
dHkgPj0gMToKKyAgICBwcmludCAiVXBsb2FkIHNlcnZlcjoiLCBvcHRpb25zLnNlcnZlciwgIihj
aGFuZ2Ugd2l0aCAtcy8tLXNlcnZlcikiCisgIGlmIG9wdGlvbnMuaXNzdWU6CisgICAgcHJvbXB0
ID0gIk1lc3NhZ2UgZGVzY3JpYmluZyB0aGlzIHBhdGNoIHNldDogIgorICBlbHNlOgorICAgIHBy
b21wdCA9ICJOZXcgaXNzdWUgc3ViamVjdDogIgorICBtZXNzYWdlID0gb3B0aW9ucy5tZXNzYWdl
IG9yIHJhd19pbnB1dChwcm9tcHQpLnN0cmlwKCkKKyAgaWYgbm90IG1lc3NhZ2U6CisgICAgRXJy
b3JFeGl0KCJBIG5vbi1lbXB0eSBtZXNzYWdlIGlzIHJlcXVpcmVkIikKKyAgcnBjX3NlcnZlciA9
IEdldFJwY1NlcnZlcihvcHRpb25zKQorICBmb3JtX2ZpZWxkcyA9IFsoInN1YmplY3QiLCBtZXNz
YWdlKV0KKyAgaWYgYmFzZToKKyAgICBmb3JtX2ZpZWxkcy5hcHBlbmQoKCJiYXNlIiwgYmFzZSkp
CisgIGlmIG9wdGlvbnMuaXNzdWU6CisgICAgZm9ybV9maWVsZHMuYXBwZW5kKCgiaXNzdWUiLCBz
dHIob3B0aW9ucy5pc3N1ZSkpKQorICBpZiBvcHRpb25zLmVtYWlsOgorICAgIGZvcm1fZmllbGRz
LmFwcGVuZCgoInVzZXIiLCBvcHRpb25zLmVtYWlsKSkKKyAgaWYgb3B0aW9ucy5yZXZpZXdlcnM6
CisgICAgZm9yIHJldmlld2VyIGluIG9wdGlvbnMucmV2aWV3ZXJzLnNwbGl0KCcsJyk6CisgICAg
ICBDaGVja1Jldmlld2VyKHJldmlld2VyKQorICAgIGZvcm1fZmllbGRzLmFwcGVuZCgoInJldmll
d2VycyIsIG9wdGlvbnMucmV2aWV3ZXJzKSkKKyAgaWYgb3B0aW9ucy5jYzoKKyAgICBmb3IgY2Mg
aW4gb3B0aW9ucy5jYy5zcGxpdCgnLCcpOgorICAgICAgQ2hlY2tSZXZpZXdlcihjYykKKyAgICBm
b3JtX2ZpZWxkcy5hcHBlbmQoKCJjYyIsIG9wdGlvbnMuY2MpKQorICBkZXNjcmlwdGlvbiA9IG9w
dGlvbnMuZGVzY3JpcHRpb24KKyAgaWYgb3B0aW9ucy5kZXNjcmlwdGlvbl9maWxlOgorICAgIGlm
IG9wdGlvbnMuZGVzY3JpcHRpb246CisgICAgICBFcnJvckV4aXQoIkNhbid0IHNwZWNpZnkgZGVz
Y3JpcHRpb24gYW5kIGRlc2NyaXB0aW9uX2ZpbGUiKQorICAgIGZpbGUgPSBvcGVuKG9wdGlvbnMu
ZGVzY3JpcHRpb25fZmlsZSwgJ3InKQorICAgIGRlc2NyaXB0aW9uID0gZmlsZS5yZWFkKCkKKyAg
ICBmaWxlLmNsb3NlKCkKKyAgaWYgZGVzY3JpcHRpb246CisgICAgZm9ybV9maWVsZHMuYXBwZW5k
KCgiZGVzY3JpcHRpb24iLCBkZXNjcmlwdGlvbikpCisgICMgU2VuZCBhIGhhc2ggb2YgYWxsIHRo
ZSBiYXNlIGZpbGUgc28gdGhlIHNlcnZlciBjYW4gZGV0ZXJtaW5lIGlmIGEgY29weQorICAjIGFs
cmVhZHkgZXhpc3RzIGluIGFuIGVhcmxpZXIgcGF0Y2hzZXQuCisgIGJhc2VfaGFzaGVzID0gIiIK
KyAgZm9yIGZpbGUsIGluZm8gaW4gZmlsZXMuaXRlcml0ZW1zKCk6CisgICAgaWYgbm90IGluZm9b
MF0gaXMgTm9uZToKKyAgICAgIGNoZWNrc3VtID0gbWQ1KGluZm9bMF0pLmhleGRpZ2VzdCgpCisg
ICAgICBpZiBiYXNlX2hhc2hlczoKKyAgICAgICAgYmFzZV9oYXNoZXMgKz0gInwiCisgICAgICBi
YXNlX2hhc2hlcyArPSBjaGVja3N1bSArICI6IiArIGZpbGUKKyAgZm9ybV9maWVsZHMuYXBwZW5k
KCgiYmFzZV9oYXNoZXMiLCBiYXNlX2hhc2hlcykpCisgIGlmIG9wdGlvbnMucHJpdmF0ZToKKyAg
ICBpZiBvcHRpb25zLmlzc3VlOgorICAgICAgcHJpbnQgIldhcm5pbmc6IFByaXZhdGUgZmxhZyBp
Z25vcmVkIHdoZW4gdXBkYXRpbmcgYW4gZXhpc3RpbmcgaXNzdWUuIgorICAgIGVsc2U6CisgICAg
ICBmb3JtX2ZpZWxkcy5hcHBlbmQoKCJwcml2YXRlIiwgIjEiKSkKKyAgIyBJZiB3ZSdyZSB1cGxv
YWRpbmcgYmFzZSBmaWxlcywgZG9uJ3Qgc2VuZCB0aGUgZW1haWwgYmVmb3JlIHRoZSB1cGxvYWRz
LCBzbworICAjIHRoYXQgaXQgY29udGFpbnMgdGhlIGZpbGUgc3RhdHVzLgorICBpZiBvcHRpb25z
LnNlbmRfbWFpbCBhbmQgb3B0aW9ucy5kb3dubG9hZF9iYXNlOgorICAgIGZvcm1fZmllbGRzLmFw
cGVuZCgoInNlbmRfbWFpbCIsICIxIikpCisgIGlmIG5vdCBvcHRpb25zLmRvd25sb2FkX2Jhc2U6
CisgICAgZm9ybV9maWVsZHMuYXBwZW5kKCgiY29udGVudF91cGxvYWQiLCAiMSIpKQorICBpZiBs
ZW4oZGF0YSkgPiBNQVhfVVBMT0FEX1NJWkU6CisgICAgcHJpbnQgIlBhdGNoIGlzIGxhcmdlLCBz
byB1cGxvYWRpbmcgZmlsZSBwYXRjaGVzIHNlcGFyYXRlbHkuIgorICAgIHVwbG9hZGVkX2RpZmZf
ZmlsZSA9IFtdCisgICAgZm9ybV9maWVsZHMuYXBwZW5kKCgic2VwYXJhdGVfcGF0Y2hlcyIsICIx
IikpCisgIGVsc2U6CisgICAgdXBsb2FkZWRfZGlmZl9maWxlID0gWygiZGF0YSIsICJkYXRhLmRp
ZmYiLCBkYXRhKV0KKyAgY3R5cGUsIGJvZHkgPSBFbmNvZGVNdWx0aXBhcnRGb3JtRGF0YShmb3Jt
X2ZpZWxkcywgdXBsb2FkZWRfZGlmZl9maWxlKQorICByZXNwb25zZV9ib2R5ID0gcnBjX3NlcnZl
ci5TZW5kKCIvdXBsb2FkIiwgYm9keSwgY29udGVudF90eXBlPWN0eXBlKQorICBwYXRjaHNldCA9
IE5vbmUKKyAgaWYgbm90IG9wdGlvbnMuZG93bmxvYWRfYmFzZSBvciBub3QgdXBsb2FkZWRfZGlm
Zl9maWxlOgorICAgIGxpbmVzID0gcmVzcG9uc2VfYm9keS5zcGxpdGxpbmVzKCkKKyAgICBpZiBs
ZW4obGluZXMpID49IDI6CisgICAgICBtc2cgPSBsaW5lc1swXQorICAgICAgcGF0Y2hzZXQgPSBs
aW5lc1sxXS5zdHJpcCgpCisgICAgICBwYXRjaGVzID0gW3guc3BsaXQoIiAiLCAxKSBmb3IgeCBp
biBsaW5lc1syOl1dCisgICAgZWxzZToKKyAgICAgIG1zZyA9IHJlc3BvbnNlX2JvZHkKKyAgZWxz
ZToKKyAgICBtc2cgPSByZXNwb25zZV9ib2R5CisgIFN0YXR1c1VwZGF0ZShtc2cpCisgIGlmIG5v
dCByZXNwb25zZV9ib2R5LnN0YXJ0c3dpdGgoIklzc3VlIGNyZWF0ZWQuIikgYW5kIFwKKyAgbm90
IHJlc3BvbnNlX2JvZHkuc3RhcnRzd2l0aCgiSXNzdWUgdXBkYXRlZC4iKToKKyAgICBzeXMuZXhp
dCgwKQorICBpc3N1ZSA9IG1zZ1ttc2cucmZpbmQoIi8iKSsxOl0KKworICBpZiBub3QgdXBsb2Fk
ZWRfZGlmZl9maWxlOgorICAgIHJlc3VsdCA9IFVwbG9hZFNlcGFyYXRlUGF0Y2hlcyhpc3N1ZSwg
cnBjX3NlcnZlciwgcGF0Y2hzZXQsIGRhdGEsIG9wdGlvbnMpCisgICAgaWYgbm90IG9wdGlvbnMu
ZG93bmxvYWRfYmFzZToKKyAgICAgIHBhdGNoZXMgPSByZXN1bHQKKworICBpZiBub3Qgb3B0aW9u
cy5kb3dubG9hZF9iYXNlOgorICAgIHZjcy5VcGxvYWRCYXNlRmlsZXMoaXNzdWUsIHJwY19zZXJ2
ZXIsIHBhdGNoZXMsIHBhdGNoc2V0LCBvcHRpb25zLCBmaWxlcykKKyAgICBpZiBvcHRpb25zLnNl
bmRfbWFpbDoKKyAgICAgIHJwY19zZXJ2ZXIuU2VuZCgiLyIgKyBpc3N1ZSArICIvbWFpbCIsIHBh
eWxvYWQ9IiIpCisgIHJldHVybiBpc3N1ZSwgcGF0Y2hzZXQKKworCitkZWYgbWFpbigpOgorICB0
cnk6CisgICAgUmVhbE1haW4oc3lzLmFyZ3YpCisgIGV4Y2VwdCBLZXlib2FyZEludGVycnVwdDoK
KyAgICBwcmludAorICAgIFN0YXR1c1VwZGF0ZSgiSW50ZXJydXB0ZWQuIikKKyAgICBzeXMuZXhp
dCgxKQorCisKK2lmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CisgIG1haW4oKQpkaWZmIC0tZ2l0
IGEvV2ViS2l0VG9vbHMvU2NyaXB0cy93ZWJraXRweS90b29sL2NvbW1hbmRzL3F1ZXVlc191bml0
dGVzdC5weSBiL1dlYktpdFRvb2xzL1NjcmlwdHMvd2Via2l0cHkvdG9vbC9jb21tYW5kcy9xdWV1
ZXNfdW5pdHRlc3QucHkKaW5kZXggYTQyNWU5MC4uMjRiNGVmNyAxMDA2NDQKLS0tIGEvV2ViS2l0
VG9vbHMvU2NyaXB0cy93ZWJraXRweS90b29sL2NvbW1hbmRzL3F1ZXVlc191bml0dGVzdC5weQor
KysgYi9XZWJLaXRUb29scy9TY3JpcHRzL3dlYmtpdHB5L3Rvb2wvY29tbWFuZHMvcXVldWVzX3Vu
aXR0ZXN0LnB5CkBAIC02OCw2ICs2OCw3IEBAIGNsYXNzIEFic3RyYWN0UXVldWVUZXN0KENvbW1h
bmRzVGVzdCk6CiAgICAgZGVmIF9hc3NlcnRfcnVuX3dlYmtpdF9wYXRjaChzZWxmLCBydW5fYXJn
cyk6CiAgICAgICAgIHF1ZXVlID0gVGVzdFF1ZXVlKCkKICAgICAgICAgdG9vbCA9IE1vY2tUb29s
KCkKKyAgICAgICAgdG9vbC5leGVjdXRpdmUgPSBNb2NrKCkKICAgICAgICAgcXVldWUuYmluZF90
b190b29sKHRvb2wpCiAKICAgICAgICAgcXVldWUucnVuX3dlYmtpdF9wYXRjaChydW5fYXJncykK
ZGlmZiAtLWdpdCBhL1dlYktpdFRvb2xzL1NjcmlwdHMvd2Via2l0cHkvdG9vbC9jb21tYW5kcy91
cGxvYWQucHkgYi9XZWJLaXRUb29scy9TY3JpcHRzL3dlYmtpdHB5L3Rvb2wvY29tbWFuZHMvdXBs
b2FkLnB5CmluZGV4IDZlNjhmYmUuLmRkMGFjMTMgMTAwNjQ0Ci0tLSBhL1dlYktpdFRvb2xzL1Nj
cmlwdHMvd2Via2l0cHkvdG9vbC9jb21tYW5kcy91cGxvYWQucHkKKysrIGIvV2ViS2l0VG9vbHMv
U2NyaXB0cy93ZWJraXRweS90b29sL2NvbW1hbmRzL3VwbG9hZC5weQpAQCAtMTY0LDYgKzE2NCw3
IEBAIGNsYXNzIFBvc3QoQWJzdHJhY3RQYXRjaFVwbG9hZGluZ0NvbW1hbmQpOgogICAgIHN0ZXBz
ID0gWwogICAgICAgICBzdGVwcy5DaGVja1N0eWxlLAogICAgICAgICBzdGVwcy5Db25maXJtRGlm
ZiwKKyAgICAgICAgc3RlcHMuUG9zdENvZGVSZXZpZXcsCiAgICAgICAgIHN0ZXBzLk9ic29sZXRl
UGF0Y2hlcywKICAgICAgICAgc3RlcHMuUG9zdERpZmYsCiAgICAgXQpAQCAtMjA4LDYgKzIwOSw3
IEBAIGNsYXNzIFVwbG9hZChBYnN0cmFjdFBhdGNoVXBsb2FkaW5nQ29tbWFuZCk6CiAgICAgICAg
IHN0ZXBzLlByZXBhcmVDaGFuZ2VMb2csCiAgICAgICAgIHN0ZXBzLkVkaXRDaGFuZ2VMb2csCiAg
ICAgICAgIHN0ZXBzLkNvbmZpcm1EaWZmLAorICAgICAgICBzdGVwcy5Qb3N0Q29kZVJldmlldywK
ICAgICAgICAgc3RlcHMuT2Jzb2xldGVQYXRjaGVzLAogICAgICAgICBzdGVwcy5Qb3N0RGlmZiwK
ICAgICBdCmRpZmYgLS1naXQgYS9XZWJLaXRUb29scy9TY3JpcHRzL3dlYmtpdHB5L3Rvb2wvY29t
bWFuZHMvdXBsb2FkX3VuaXR0ZXN0LnB5IGIvV2ViS2l0VG9vbHMvU2NyaXB0cy93ZWJraXRweS90
b29sL2NvbW1hbmRzL3VwbG9hZF91bml0dGVzdC5weQppbmRleCA0ZTk4N2M5Li45NzY2ZTE5IDEw
MDY0NAotLS0gYS9XZWJLaXRUb29scy9TY3JpcHRzL3dlYmtpdHB5L3Rvb2wvY29tbWFuZHMvdXBs
b2FkX3VuaXR0ZXN0LnB5CisrKyBiL1dlYktpdFRvb2xzL1NjcmlwdHMvd2Via2l0cHkvdG9vbC9j
b21tYW5kcy91cGxvYWRfdW5pdHRlc3QucHkKQEAgLTU4LDYgKzU4LDcgQEAgY2xhc3MgVXBsb2Fk
Q29tbWFuZHNUZXN0KENvbW1hbmRzVGVzdCk6CiAgICAgICAgIG9wdGlvbnMuZGVzY3JpcHRpb24g
PSAiTU9DSyBkZXNjcmlwdGlvbiIKICAgICAgICAgb3B0aW9ucy5yZXF1ZXN0X2NvbW1pdCA9IEZh
bHNlCiAgICAgICAgIG9wdGlvbnMucmV2aWV3ID0gVHJ1ZQorICAgICAgICBvcHRpb25zLmNjID0g
Tm9uZQogICAgICAgICBleHBlY3RlZF9zdGRlcnIgPSAiUnVubmluZyBjaGVjay13ZWJraXQtc3R5
bGVcbk9ic29sZXRpbmcgMiBvbGQgcGF0Y2hlcyBvbiBidWcgNDJcbk1PQ0sgYWRkX3BhdGNoX3Rv
X2J1ZzogYnVnX2lkPTQyLCBkZXNjcmlwdGlvbj1NT0NLIGRlc2NyaXB0aW9uLCBtYXJrX2Zvcl9y
ZXZpZXc9VHJ1ZSwgbWFya19mb3JfY29tbWl0X3F1ZXVlPUZhbHNlLCBtYXJrX2Zvcl9sYW5kaW5n
PUZhbHNlXG4tLSBCZWdpbiBjb21tZW50IC0tXG5Ob25lXG4tLSBFbmQgY29tbWVudCAtLVxuTU9D
SzogdXNlci5vcGVuX3VybDogaHR0cDovL2V4YW1wbGUuY29tLzQyXG4iCiAgICAgICAgIHNlbGYu
YXNzZXJ0X2V4ZWN1dGVfb3V0cHV0cyhQb3N0KCksIFs0Ml0sIG9wdGlvbnM9b3B0aW9ucywgZXhw
ZWN0ZWRfc3RkZXJyPWV4cGVjdGVkX3N0ZGVycikKIApAQCAtNzcsNiArNzgsNyBAQCBjbGFzcyBV
cGxvYWRDb21tYW5kc1Rlc3QoQ29tbWFuZHNUZXN0KToKICAgICAgICAgb3B0aW9ucy5kZXNjcmlw
dGlvbiA9ICJNT0NLIGRlc2NyaXB0aW9uIgogICAgICAgICBvcHRpb25zLnJlcXVlc3RfY29tbWl0
ID0gRmFsc2UKICAgICAgICAgb3B0aW9ucy5yZXZpZXcgPSBUcnVlCisgICAgICAgIG9wdGlvbnMu
Y2MgPSBOb25lCiAgICAgICAgIGV4cGVjdGVkX3N0ZGVyciA9ICJSdW5uaW5nIGNoZWNrLXdlYmtp
dC1zdHlsZVxuT2Jzb2xldGluZyAyIG9sZCBwYXRjaGVzIG9uIGJ1ZyA0MlxuTU9DSyBhZGRfcGF0
Y2hfdG9fYnVnOiBidWdfaWQ9NDIsIGRlc2NyaXB0aW9uPU1PQ0sgZGVzY3JpcHRpb24sIG1hcmtf
Zm9yX3Jldmlldz1UcnVlLCBtYXJrX2Zvcl9jb21taXRfcXVldWU9RmFsc2UsIG1hcmtfZm9yX2xh
bmRpbmc9RmFsc2Vcbi0tIEJlZ2luIGNvbW1lbnQgLS1cbk5vbmVcbi0tIEVuZCBjb21tZW50IC0t
XG5NT0NLOiB1c2VyLm9wZW5fdXJsOiBodHRwOi8vZXhhbXBsZS5jb20vNDJcbiIKICAgICAgICAg
c2VsZi5hc3NlcnRfZXhlY3V0ZV9vdXRwdXRzKFVwbG9hZCgpLCBbNDJdLCBvcHRpb25zPW9wdGlv
bnMsIGV4cGVjdGVkX3N0ZGVycj1leHBlY3RlZF9zdGRlcnIpCiAKZGlmZiAtLWdpdCBhL1dlYktp
dFRvb2xzL1NjcmlwdHMvd2Via2l0cHkvdG9vbC9tYWluLnB5IGIvV2ViS2l0VG9vbHMvU2NyaXB0
cy93ZWJraXRweS90b29sL21haW4ucHkKaW5kZXggNjI5ZTg2Zi4uZGQ3NjUyZCAxMDA3NTUKLS0t
IGEvV2ViS2l0VG9vbHMvU2NyaXB0cy93ZWJraXRweS90b29sL21haW4ucHkKKysrIGIvV2ViS2l0
VG9vbHMvU2NyaXB0cy93ZWJraXRweS90b29sL21haW4ucHkKQEAgLTM2LDYgKzM2LDcgQEAgZnJv
bSB3ZWJraXRweS5jb21tb24uY2hlY2tvdXQuYXBpIGltcG9ydCBDaGVja291dAogZnJvbSB3ZWJr
aXRweS5jb21tb24uY2hlY2tvdXQuc2NtIGltcG9ydCBkZXRlY3Rfc2NtX3N5c3RlbQogZnJvbSB3
ZWJraXRweS5jb21tb24ubmV0LmJ1Z3ppbGxhIGltcG9ydCBCdWd6aWxsYQogZnJvbSB3ZWJraXRw
eS5jb21tb24ubmV0LmJ1aWxkYm90IGltcG9ydCBCdWlsZEJvdAorZnJvbSB3ZWJraXRweS5jb21t
b24ubmV0LnJpZXR2ZWxkIGltcG9ydCBSaWV0dmVsZAogZnJvbSB3ZWJraXRweS5jb21tb24ubmV0
LmlyYy5pcmNwcm94eSBpbXBvcnQgSVJDUHJveHkKIGZyb20gd2Via2l0cHkuY29tbW9uLnN5c3Rl
bS5leGVjdXRpdmUgaW1wb3J0IEV4ZWN1dGl2ZQogZnJvbSB3ZWJraXRweS5jb21tb24uc3lzdGVt
LnVzZXIgaW1wb3J0IFVzZXIKQEAgLTcwLDYgKzcxLDcgQEAgY2xhc3MgV2ViS2l0UGF0Y2goTXVs
dGlDb21tYW5kVG9vbCk6CiAgICAgICAgIHNlbGYuX3NjbSA9IE5vbmUKICAgICAgICAgc2VsZi5f
Y2hlY2tvdXQgPSBOb25lCiAgICAgICAgIHNlbGYuc3RhdHVzX3NlcnZlciA9IFN0YXR1c1NlcnZl
cigpCisgICAgICAgIHNlbGYuY29kZXJldmlldyA9IFJpZXR2ZWxkKHNlbGYuZXhlY3V0aXZlKQog
CiAgICAgZGVmIHNjbShzZWxmKToKICAgICAgICAgIyBMYXppbHkgaW5pdGlhbGl6ZSBTQ00gdG8g
bm90IGVycm9yLW91dCBiZWZvcmUgY29tbWFuZCBsaW5lIHBhcnNpbmcgKG9yIHdoZW4gcnVubmlu
ZyBub24tc2NtIGNvbW1hbmRzKS4KQEAgLTEyMSw2ICsxMjMsNyBAQCBjbGFzcyBXZWJLaXRQYXRj
aChNdWx0aUNvbW1hbmRUb29sKToKICAgICAgICAgaWYgb3B0aW9ucy5kcnlfcnVuOgogICAgICAg
ICAgICAgc2VsZi5zY20oKS5kcnlydW4gPSBUcnVlCiAgICAgICAgICAgICBzZWxmLmJ1Z3MuZHJ5
cnVuID0gVHJ1ZQorICAgICAgICAgICAgc2VsZi5jb2RlcmV2aWV3LmRyeXJ1biA9IFRydWUKICAg
ICAgICAgaWYgb3B0aW9ucy5zdGF0dXNfaG9zdDoKICAgICAgICAgICAgIHNlbGYuc3RhdHVzX3Nl
cnZlci5zZXRfaG9zdChvcHRpb25zLnN0YXR1c19ob3N0KQogICAgICAgICBpZiBvcHRpb25zLmly
Y19wYXNzd29yZDoKZGlmZiAtLWdpdCBhL1dlYktpdFRvb2xzL1NjcmlwdHMvd2Via2l0cHkvdG9v
bC9tb2NrdG9vbC5weSBiL1dlYktpdFRvb2xzL1NjcmlwdHMvd2Via2l0cHkvdG9vbC9tb2NrdG9v
bC5weQppbmRleCA4OWZkZTZhLi42ZTRiNjRmIDEwMDY0NAotLS0gYS9XZWJLaXRUb29scy9TY3Jp
cHRzL3dlYmtpdHB5L3Rvb2wvbW9ja3Rvb2wucHkKKysrIGIvV2ViS2l0VG9vbHMvU2NyaXB0cy93
ZWJraXRweS90b29sL21vY2t0b29sLnB5CkBAIC0zMyw2ICszMyw3IEBAIGZyb20gd2Via2l0cHku
Y29tbW9uLmNvbmZpZy5jb21taXR0ZXJzIGltcG9ydCBDb21taXR0ZXJMaXN0LCBSZXZpZXdlcgog
ZnJvbSB3ZWJraXRweS5jb21tb24uY2hlY2tvdXQuY29tbWl0aW5mbyBpbXBvcnQgQ29tbWl0SW5m
bwogZnJvbSB3ZWJraXRweS5jb21tb24uY2hlY2tvdXQuc2NtIGltcG9ydCBDb21taXRNZXNzYWdl
CiBmcm9tIHdlYmtpdHB5LmNvbW1vbi5uZXQuYnVnemlsbGEgaW1wb3J0IEJ1ZywgQXR0YWNobWVu
dAorZnJvbSB3ZWJraXRweS5jb21tb24ubmV0LnJpZXR2ZWxkIGltcG9ydCBSaWV0dmVsZAogZnJv
bSB3ZWJraXRweS50aGlyZHBhcnR5Lm1vY2sgaW1wb3J0IE1vY2sKIGZyb20gd2Via2l0cHkuY29t
bW9uLnN5c3RlbS5kZXByZWNhdGVkX2xvZ2dpbmcgaW1wb3J0IGxvZwogCkBAIC00Myw2ICs0NCw3
IEBAIGRlZiBfaWRfdG9fb2JqZWN0X2RpY3Rpb25hcnkoKm9iamVjdHMpOgogICAgICAgICBkaWN0
aW9uYXJ5W3RoaW5nWyJpZCJdXSA9IHRoaW5nCiAgICAgcmV0dXJuIGRpY3Rpb25hcnkKIAorIyBU
ZXN0aW5nCiAKICMgRklYTUU6IFRoZSBpZHMgc2hvdWxkIGJlIDEsIDIsIDMgaW5zdGVhZCBvZiBj
cmF6eSBudW1iZXJzLgogCkBAIC00ODgsMTMgKzQ5MCwxOCBAQCBjbGFzcyBNb2NrU3RhdHVzU2Vy
dmVyKG9iamVjdCk6CiAgICAgICAgIHJldHVybiAxOTEKIAogCitjbGFzcyBNb2NrRXhlY3V0ZShN
b2NrKToKKyAgICBkZWYgcnVuX2FuZF90aHJvd19pZl9mYWlsKHNlbGYsIGFyZ3MsIHF1aWV0PUZh
bHNlKToKKyAgICAgICAgcmV0dXJuICJNT0NLIG91dHB1dCBvZiBjaGlsZCBwcm9jZXNzIgorCisK
IGNsYXNzIE1vY2tUb29sKCk6CiAKICAgICBkZWYgX19pbml0X18oc2VsZiwgbG9nX2V4ZWN1dGl2
ZT1GYWxzZSk6CiAgICAgICAgIHNlbGYud2FrZXVwX2V2ZW50ID0gdGhyZWFkaW5nLkV2ZW50KCkK
ICAgICAgICAgc2VsZi5idWdzID0gTW9ja0J1Z3ppbGxhKCkKICAgICAgICAgc2VsZi5idWlsZGJv
dCA9IE1vY2tCdWlsZEJvdCgpCi0gICAgICAgIHNlbGYuZXhlY3V0aXZlID0gTW9jaygpCisgICAg
ICAgIHNlbGYuZXhlY3V0aXZlID0gTW9ja0V4ZWN1dGUoKQogICAgICAgICBpZiBsb2dfZXhlY3V0
aXZlOgogICAgICAgICAgICAgc2VsZi5leGVjdXRpdmUucnVuX2FuZF90aHJvd19pZl9mYWlsID0g
bGFtYmRhIGFyZ3M6IGxvZygiTU9DSyBydW5fYW5kX3Rocm93X2lmX2ZhaWw6ICVzIiAlIGFyZ3Mp
CiAgICAgICAgIHNlbGYuX2lyYyA9IE5vbmUKQEAgLTUwMyw2ICs1MTAsNyBAQCBjbGFzcyBNb2Nr
VG9vbCgpOgogICAgICAgICBzZWxmLl9jaGVja291dCA9IE1vY2tDaGVja291dCgpCiAgICAgICAg
IHNlbGYuc3RhdHVzX3NlcnZlciA9IE1vY2tTdGF0dXNTZXJ2ZXIoKQogICAgICAgICBzZWxmLmly
Y19wYXNzd29yZCA9ICJNT0NLIGlyYyBwYXNzd29yZCIKKyAgICAgICAgc2VsZi5jb2RlcmV2aWV3
ID0gUmlldHZlbGQoc2VsZi5leGVjdXRpdmUpCiAKICAgICBkZWYgc2NtKHNlbGYpOgogICAgICAg
ICByZXR1cm4gc2VsZi5fc2NtCmRpZmYgLS1naXQgYS9XZWJLaXRUb29scy9TY3JpcHRzL3dlYmtp
dHB5L3Rvb2wvc3RlcHMvX19pbml0X18ucHkgYi9XZWJLaXRUb29scy9TY3JpcHRzL3dlYmtpdHB5
L3Rvb2wvc3RlcHMvX19pbml0X18ucHkKaW5kZXggOGU4YWIxNS4uZDU5Y2RjNSAxMDA2NDQKLS0t
IGEvV2ViS2l0VG9vbHMvU2NyaXB0cy93ZWJraXRweS90b29sL3N0ZXBzL19faW5pdF9fLnB5Cisr
KyBiL1dlYktpdFRvb2xzL1NjcmlwdHMvd2Via2l0cHkvdG9vbC9zdGVwcy9fX2luaXRfXy5weQpA
QCAtNDQsNiArNDQsNyBAQCBmcm9tIHdlYmtpdHB5LnRvb2wuc3RlcHMuZW5zdXJlYnVpbGRlcnNh
cmVncmVlbiBpbXBvcnQgRW5zdXJlQnVpbGRlcnNBcmVHcmVlbgogZnJvbSB3ZWJraXRweS50b29s
LnN0ZXBzLmVuc3VyZWxvY2FsY29tbWl0aWZuZWVkZWQgaW1wb3J0IEVuc3VyZUxvY2FsQ29tbWl0
SWZOZWVkZWQKIGZyb20gd2Via2l0cHkudG9vbC5zdGVwcy5vYnNvbGV0ZXBhdGNoZXMgaW1wb3J0
IE9ic29sZXRlUGF0Y2hlcwogZnJvbSB3ZWJraXRweS50b29sLnN0ZXBzLm9wdGlvbnMgaW1wb3J0
IE9wdGlvbnMKK2Zyb20gd2Via2l0cHkudG9vbC5zdGVwcy5wb3N0Y29kZXJldmlldyBpbXBvcnQg
UG9zdENvZGVSZXZpZXcKIGZyb20gd2Via2l0cHkudG9vbC5zdGVwcy5wb3N0ZGlmZiBpbXBvcnQg
UG9zdERpZmYKIGZyb20gd2Via2l0cHkudG9vbC5zdGVwcy5wb3N0ZGlmZmZvcmNvbW1pdCBpbXBv
cnQgUG9zdERpZmZGb3JDb21taXQKIGZyb20gd2Via2l0cHkudG9vbC5zdGVwcy5wb3N0ZGlmZmZv
cnJldmVydCBpbXBvcnQgUG9zdERpZmZGb3JSZXZlcnQKZGlmZiAtLWdpdCBhL1dlYktpdFRvb2xz
L1NjcmlwdHMvd2Via2l0cHkvdG9vbC9zdGVwcy9vcHRpb25zLnB5IGIvV2ViS2l0VG9vbHMvU2Ny
aXB0cy93ZWJraXRweS90b29sL3N0ZXBzL29wdGlvbnMucHkKaW5kZXggNDBhNjY4MC4uN2Y3NmY1
NSAxMDA2NDQKLS0tIGEvV2ViS2l0VG9vbHMvU2NyaXB0cy93ZWJraXRweS90b29sL3N0ZXBzL29w
dGlvbnMucHkKKysrIGIvV2ViS2l0VG9vbHMvU2NyaXB0cy93ZWJraXRweS90b29sL3N0ZXBzL29w
dGlvbnMucHkKQEAgLTQwLDYgKzQwLDcgQEAgY2xhc3MgT3B0aW9ucyhvYmplY3QpOgogICAgIGNv
bmZpcm0gPSBtYWtlX29wdGlvbigiLS1uby1jb25maXJtIiwgYWN0aW9uPSJzdG9yZV9mYWxzZSIs
IGRlc3Q9ImNvbmZpcm0iLCBkZWZhdWx0PVRydWUsIGhlbHA9IlNraXAgY29uZmlybWF0aW9uIHN0
ZXBzLiIpCiAgICAgZGVzY3JpcHRpb24gPSBtYWtlX29wdGlvbigiLW0iLCAiLS1kZXNjcmlwdGlv
biIsIGFjdGlvbj0ic3RvcmUiLCB0eXBlPSJzdHJpbmciLCBkZXN0PSJkZXNjcmlwdGlvbiIsIGhl
bHA9IkRlc2NyaXB0aW9uIHN0cmluZyBmb3IgdGhlIGF0dGFjaG1lbnQgKGRlZmF1bHQ6IFwicGF0
Y2hcIikiKQogICAgIGVtYWlsID0gbWFrZV9vcHRpb24oIi0tZW1haWwiLCBhY3Rpb249InN0b3Jl
IiwgdHlwZT0ic3RyaW5nIiwgZGVzdD0iZW1haWwiLCBoZWxwPSJFbWFpbCBhZGRyZXNzIHRvIHVz
ZSBpbiBDaGFuZ2VMb2dzLiIpCisgICAgZmFuY3lfcmV2aWV3ID0gbWFrZV9vcHRpb24oIi0tZmFu
Y3ktcmV2aWV3IiwgYWN0aW9uPSJzdG9yZV90cnVlIiwgZGVzdD0iZmFuY3lfcmV2aWV3IiwgZGVm
YXVsdD1GYWxzZSwgaGVscD0iKEV4cGVyaW1lbnRhbCkgVXBsb2FkIHRoZSBwYXRjaCB0byBSaWV0
dmVsZCBjb2RlIHJldmlldyB0b29sLiIpCiAgICAgZm9yY2VfY2xlYW4gPSBtYWtlX29wdGlvbigi
LS1mb3JjZS1jbGVhbiIsIGFjdGlvbj0ic3RvcmVfdHJ1ZSIsIGRlc3Q9ImZvcmNlX2NsZWFuIiwg
ZGVmYXVsdD1GYWxzZSwgaGVscD0iQ2xlYW4gd29ya2luZyBkaXJlY3RvcnkgYmVmb3JlIGFwcGx5
aW5nIHBhdGNoZXMgKHJlbW92ZXMgbG9jYWwgY2hhbmdlcyBhbmQgY29tbWl0cykiKQogICAgIGxv
Y2FsX2NvbW1pdCA9IG1ha2Vfb3B0aW9uKCItLWxvY2FsLWNvbW1pdCIsIGFjdGlvbj0ic3RvcmVf
dHJ1ZSIsIGRlc3Q9ImxvY2FsX2NvbW1pdCIsIGRlZmF1bHQ9RmFsc2UsIGhlbHA9Ik1ha2UgYSBs
b2NhbCBjb21taXQgZm9yIGVhY2ggYXBwbGllZCBwYXRjaCIpCiAgICAgbm9uX2ludGVyYWN0aXZl
ID0gbWFrZV9vcHRpb24oIi0tbm9uLWludGVyYWN0aXZlIiwgYWN0aW9uPSJzdG9yZV90cnVlIiwg
ZGVzdD0ibm9uX2ludGVyYWN0aXZlIiwgZGVmYXVsdD1GYWxzZSwgaGVscD0iTmV2ZXIgcHJvbXB0
IHRoZSB1c2VyLCBmYWlsIGFzIGZhc3QgYXMgcG9zc2libGUuIikKZGlmZiAtLWdpdCBhL1dlYktp
dFRvb2xzL1NjcmlwdHMvd2Via2l0cHkvdG9vbC9zdGVwcy9wb3N0Y29kZXJldmlldy5weSBiL1dl
YktpdFRvb2xzL1NjcmlwdHMvd2Via2l0cHkvdG9vbC9zdGVwcy9wb3N0Y29kZXJldmlldy5weQpu
ZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NzBjZTZjCi0tLSAvZGV2L251bGwK
KysrIGIvV2ViS2l0VG9vbHMvU2NyaXB0cy93ZWJraXRweS90b29sL3N0ZXBzL3Bvc3Rjb2RlcmV2
aWV3LnB5CkBAIC0wLDAgKzEsNzYgQEAKKyMgQ29weXJpZ2h0IChDKSAyMDEwIEdvb2dsZSBJbmMu
IEFsbCByaWdodHMgcmVzZXJ2ZWQuCisjCisjIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291
cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorIyBtb2RpZmljYXRpb24sIGFy
ZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisj
IG1ldDoKKyMKKyMgICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0
YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyMgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9u
cyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorIyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMg
aW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisjIGNvcHlyaWdodCBub3Rp
Y2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIK
KyMgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3
aXRoIHRoZQorIyBkaXN0cmlidXRpb24uCisjICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29v
Z2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyMgY29udHJpYnV0b3JzIG1heSBiZSB1c2Vk
IHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKyMgdGhpcyBzb2Z0
d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyMKKyMgVEhJ
UyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRS
SUJVVE9SUworIyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMs
IElOQ0xVRElORywgQlVUIE5PVAorIyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVT
IE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyMgQSBQQVJUSUNVTEFSIFBVUlBP
U0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKyMgT1dO
RVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElO
Q0lERU5UQUwsCisjIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VT
IChJTkNMVURJTkcsIEJVVCBOT1QKKyMgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJ
VFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisjIERBVEEsIE9SIFBST0ZJVFM7
IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorIyBU
SEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZ
LCBPUiBUT1JUCisjIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcg
SU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorIyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFE
VklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCitmcm9tIHdlYmtpdHB5
LnRvb2wuc3RlcHMuYWJzdHJhY3RzdGVwIGltcG9ydCBBYnN0cmFjdFN0ZXAKK2Zyb20gd2Via2l0
cHkudG9vbC5zdGVwcy5vcHRpb25zIGltcG9ydCBPcHRpb25zCisKKworY2xhc3MgUG9zdENvZGVS
ZXZpZXcoQWJzdHJhY3RTdGVwKToKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgb3B0aW9ucyhj
bHMpOgorICAgICAgICByZXR1cm4gWworICAgICAgICAgICAgT3B0aW9ucy5jYywKKyAgICAgICAg
ICAgIE9wdGlvbnMuZGVzY3JpcHRpb24sCisgICAgICAgICAgICBPcHRpb25zLmZhbmN5X3Jldmll
dywKKyAgICAgICAgICAgIE9wdGlvbnMucmV2aWV3LAorICAgICAgICBdCisKKyAgICBkZWYgcnVu
KHNlbGYsIHN0YXRlKToKKyAgICAgICAgaWYgbm90IHNlbGYuX29wdGlvbnMuZmFuY3lfcmV2aWV3
OgorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIGlmIG5vdCBzZWxmLl9vcHRpb25zLnJldmll
dzoKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICAjIEZJWE1FOiBUaGlzIHdpbGwgYWx3YXlz
IGJlIE5vbmUgYmVjYXVzZSB3ZSBkb24ndCByZXRyaWV2ZSB0aGUgaXNzdWUKKyAgICAgICAgIyAg
ICAgICAgbnVtYmVyIGZybW8gdGhlIENoYW5nZUxvZyB5ZXQuCisgICAgICAgIGNvZGVyZXZpZXdf
aXNzdWUgPSBzdGF0ZS5nZXQoImNvZGVyZXZpZXdfaXNzdWUiKQorICAgICAgICBtZXNzYWdlID0g
c2VsZi5fb3B0aW9ucy5kZXNjcmlwdGlvbgorICAgICAgICBpZiBub3QgbWVzc2FnZToKKyAgICAg
ICAgICAgICMgSWYgd2UgaGF2ZSBhbiBpc3N1ZSBudW1iZXIsIHRoZW4gdGhlIG1lc3NhZ2UgYmVj
YXVzZSB0aGUgbGFiZWwKKyAgICAgICAgICAgICMgb2YgdGhlIG5ldyBwYXRjaC4gT3RoZXJ3aXNl
LCBpdCBiZWNvbWVzIHRoZSB0aXRsZSBvZiB0aGUgd2hvbGUKKyAgICAgICAgICAgICMgaXNzdWUu
CisgICAgICAgICAgICBpZiBjb2RlcmV2aWV3X2lzc3VlOgorICAgICAgICAgICAgICAgIG1lc3Nh
Z2UgPSAiVXBkYXRlZCBwYXRjaCIKKyAgICAgICAgICAgIGVsaWYgc3RhdGUuZ2V0KCJidWdfdGl0
bGUiKToKKyAgICAgICAgICAgICAgICAjIFRoaXMgaXMgdGhlIGNvbW1vbiBjYXNlIGZvciB0aGUg
dGhlIGZpcnN0ICJ1cGxvYWQiIGNvbW1hbmQuCisgICAgICAgICAgICAgICAgbWVzc2FnZSA9IHN0
YXRlLmdldCgiYnVnX3RpdGxlIikKKyAgICAgICAgICAgIGVsaWYgc3RhdGUuZ2V0KCJidWdfaWQi
KToKKyAgICAgICAgICAgICAgICAjIFRoaXMgaXMgdGhlIGNvbW1vbiBjYXNlIGZvciB0aGUgInBv
c3QiIGNvbW1hbmQgYW5kCisgICAgICAgICAgICAgICAgIyBzdWJzZXF1ZW50IHJ1bnMgb2YgdGhl
ICJ1cGxvYWQiIGNvbW1hbmQuICBJbiB0aGlzIGNhc2UsCisgICAgICAgICAgICAgICAgIyBJJ2Qg
cmF0aGVyIGFkZCB0aGUgbmV3IHBhdGNoIHRvIHRoZSBleGlzdGluZyBpc3N1ZSwgYnV0CisgICAg
ICAgICAgICAgICAgIyB0aGF0J3Mgbm90IGltcGxlbWVudGVkIHlldC4KKyAgICAgICAgICAgICAg
ICBtZXNzYWdlID0gIkNvZGUgcmV2aWV3IGZvciAlcyIgJSBzZWxmLl90b29sLmJ1Z3MuYnVnX3Vy
bF9mb3JfYnVnX2lkKHN0YXRlWyJidWdfaWQiXSkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAg
ICAgICAgICAgIyBVbnJlYWNoYWJsZSB3aXRoIG91ciBjdXJyZW50IGNvbW1hbmRzLCBidXQgd2Ug
bWlnaHQgaGl0CisgICAgICAgICAgICAgICAgIyB0aGlzIGNhc2UgaWYgd2Ugc3VwcG9ydCBidWct
bGVzcyBjb2RlIHJldmlld3MuCisgICAgICAgICAgICAgICAgbWVzc2FnZSA9ICJDb2RlIHJldmll
dyIKKyAgICAgICAgY3JlYXRlZF9pc3N1ZSA9IHNlbGYuX3Rvb2wuY29kZXJldmlldy5wb3N0KG1l
c3NhZ2U9bWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgIGNvZGVyZXZpZXdfaXNzdWU9Y29kZXJldmlld19pc3N1ZSwKKyAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNjPXNlbGYuX29wdGlvbnMu
Y2MpCisgICAgICAgIGlmIGNyZWF0ZWRfaXNzdWU6CisgICAgICAgICAgICAjIEZJWE1FOiBSZWNv
cmQgdGhlIGlzc3VlIG51bWJlciBpbiB0aGUgQ2hhbmdlTG9nLgorICAgICAgICAgICAgc3RhdGVb
ImNvZGVyZXZpZXdfaXNzdWUiXSA9IGNyZWF0ZWRfaXNzdWUKZGlmZiAtLWdpdCBhL1dlYktpdFRv
b2xzL1NjcmlwdHMvd2Via2l0cHkvdG9vbC9zdGVwcy9wb3N0ZGlmZi5weSBiL1dlYktpdFRvb2xz
L1NjcmlwdHMvd2Via2l0cHkvdG9vbC9zdGVwcy9wb3N0ZGlmZi5weQppbmRleCBlZjhmNGM4Li41
YjI4MzgzIDEwMDY0NAotLS0gYS9XZWJLaXRUb29scy9TY3JpcHRzL3dlYmtpdHB5L3Rvb2wvc3Rl
cHMvcG9zdGRpZmYucHkKKysrIGIvV2ViS2l0VG9vbHMvU2NyaXB0cy93ZWJraXRweS90b29sL3N0
ZXBzL3Bvc3RkaWZmLnB5CkBAIC00Niw2ICs0NiwxMCBAQCBjbGFzcyBQb3N0RGlmZihBYnN0cmFj
dFN0ZXApOgogICAgICAgICBkaWZmID0gc2VsZi5jYWNoZWRfbG9va3VwKHN0YXRlLCAiZGlmZiIp
CiAgICAgICAgIGRpZmZfZmlsZSA9IFN0cmluZ0lPLlN0cmluZ0lPKGRpZmYpICMgYWRkX3BhdGNo
X3RvX2J1ZyBleHBlY3RzIGEgZmlsZS1saWtlIG9iamVjdAogICAgICAgICBkZXNjcmlwdGlvbiA9
IHNlbGYuX29wdGlvbnMuZGVzY3JpcHRpb24gb3IgIlBhdGNoIgotICAgICAgICBzZWxmLl90b29s
LmJ1Z3MuYWRkX3BhdGNoX3RvX2J1ZyhzdGF0ZVsiYnVnX2lkIl0sIGRpZmZfZmlsZSwgZGVzY3Jp
cHRpb24sIG1hcmtfZm9yX3Jldmlldz1zZWxmLl9vcHRpb25zLnJldmlldywgbWFya19mb3JfY29t
bWl0X3F1ZXVlPXNlbGYuX29wdGlvbnMucmVxdWVzdF9jb21taXQpCisgICAgICAgIGNvbW1lbnRf
dGV4dCA9IE5vbmUKKyAgICAgICAgY29kZXJldmlld19pc3N1ZSA9IHN0YXRlLmdldCgiY29kZXJl
dmlld19pc3N1ZSIpCisgICAgICAgIGlmIGNvZGVyZXZpZXdfaXNzdWU6CisgICAgICAgICAgICBj
b21tZW50X3RleHQgPSAiRmVlbCBmcmVlIHRvIHByb3ZpZGUgY29tbWVudHMgYXQgJXMiICUgc2Vs
Zi5fdG9vbC5jb2RlcmV2aWV3LnVybF9mb3JfaXNzdWUoY29kZXJldmlld19pc3N1ZSkKKyAgICAg
ICAgc2VsZi5fdG9vbC5idWdzLmFkZF9wYXRjaF90b19idWcoc3RhdGVbImJ1Z19pZCJdLCBkaWZm
X2ZpbGUsIGRlc2NyaXB0aW9uLCBjb21tZW50X3RleHQ9Y29tbWVudF90ZXh0LCBtYXJrX2Zvcl9y
ZXZpZXc9c2VsZi5fb3B0aW9ucy5yZXZpZXcsIG1hcmtfZm9yX2NvbW1pdF9xdWV1ZT1zZWxmLl9v
cHRpb25zLnJlcXVlc3RfY29tbWl0KQogICAgICAgICBpZiBzZWxmLl9vcHRpb25zLm9wZW5fYnVn
OgogICAgICAgICAgICAgc2VsZi5fdG9vbC51c2VyLm9wZW5fdXJsKHNlbGYuX3Rvb2wuYnVncy5i
dWdfdXJsX2Zvcl9idWdfaWQoc3RhdGVbImJ1Z19pZCJdKSkK
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>53114</attachid>
            <date>2010-04-11 15:19:47 -0700</date>
            <delta_ts>2010-04-13 16:23:21 -0700</delta_ts>
            <desc>Patch</desc>
            <filename>bug-37418-20100411151945.patch</filename>
            <type>text/plain</type>
            <size>86062</size>
            <attacher name="Adam Barth">abarth</attacher>
            
              <data encoding="base64">ZGlmZiAtLWdpdCBhL1dlYktpdFRvb2xzL0NoYW5nZUxvZyBiL1dlYktpdFRvb2xzL0NoYW5nZUxv
ZwppbmRleCA2ZWRiOGI5Li42NDE5MTg3IDEwMDY0NAotLS0gYS9XZWJLaXRUb29scy9DaGFuZ2VM
b2cKKysrIGIvV2ViS2l0VG9vbHMvQ2hhbmdlTG9nCkBAIC0xLDMgKzEsMzEgQEAKKzIwMTAtMDQt
MTEgIEFkYW0gQmFydGggIDxhYmFydGhAd2Via2l0Lm9yZz4KKworICAgICAgICBSZXZpZXdlZCBi
eSBOT0JPRFkgKE9PUFMhKS4KKworICAgICAgICBBZGQgZXhwZXJpbWVudGFsIHByb3RvdHlwZSBS
aWV0dmVsZCBpbnRlZ3JhdGlvbiB0byB3ZWJraXQtcGF0Y2ggdXBsb2FkCisgICAgICAgIGh0dHBz
Oi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0zNzQxOAorCisgICAgICAgIFRoaXMg
cGF0Y2ggYWRkcyBiYXJlLWJvbmVzIGludGVncnRpb24gd2l0aCBSaWV0dmVsZCBmb3IgY29kZSBy
ZXZpZXdzLgorICAgICAgICBUaGUgYmVoYXZpb3IgaXMgaGlkZGVuIGJlaGluZCB0aGUgLS1mYW5j
eS1yZXZpZXcgY29tbWFuZCBsaW5lIGZsYWcuCisgICAgICAgIEN1cnJlbnRseSwgdGhlcmUncyBu
byBzdXBwb3J0IGZvciB1cGxvYWRpbmcgbW9yZSB0aGFuIG9uZSBwYXRjaCBwZXIKKyAgICAgICAg
aXNzdWUgKHdoaWNoIGlzIGEgbmljZSBmZWF0dXJlIG9mIFJpZXR2ZWxkKS4gIFRoZSBwbGFuIGlz
IHRvIHBsYXkgd2l0aAorICAgICAgICB0aGlzIGZvciBhIGJpdCBhbmQgc2VlIGlmIGl0J3MgdXNl
ZnVsLgorCisgICAgICAgICogU2NyaXB0cy93ZWJraXRweS9jb21tb24vY29uZmlnL19faW5pdF9f
LnB5OgorICAgICAgICAqIFNjcmlwdHMvd2Via2l0cHkvY29tbW9uL25ldC9yaWV0dmVsZC5weTog
QWRkZWQuCisgICAgICAgICogU2NyaXB0cy93ZWJraXRweS9jb21tb24vbmV0L3JpZXR2ZWxkX3Vu
aXR0dGVzdC5weTogQWRkZWQuCisgICAgICAgICogU2NyaXB0cy93ZWJraXRweS90aGlyZHBhcnR5
L3JpZXR2ZWxkL19faW5pdF9fLnB5OiBBZGRlZC4KKyAgICAgICAgKiBTY3JpcHRzL3dlYmtpdHB5
L3RoaXJkcGFydHkvcmlldHZlbGQvdXBsb2FkLnB5OiBBZGRlZC4KKyAgICAgICAgKiBTY3JpcHRz
L3dlYmtpdHB5L3Rvb2wvY29tbWFuZHMvcXVldWVzX3VuaXR0ZXN0LnB5OgorICAgICAgICAqIFNj
cmlwdHMvd2Via2l0cHkvdG9vbC9jb21tYW5kcy91cGxvYWQucHk6CisgICAgICAgICogU2NyaXB0
cy93ZWJraXRweS90b29sL2NvbW1hbmRzL3VwbG9hZF91bml0dGVzdC5weToKKyAgICAgICAgKiBT
Y3JpcHRzL3dlYmtpdHB5L3Rvb2wvbWFpbi5weToKKyAgICAgICAgKiBTY3JpcHRzL3dlYmtpdHB5
L3Rvb2wvbW9ja3Rvb2wucHk6CisgICAgICAgICogU2NyaXB0cy93ZWJraXRweS90b29sL3N0ZXBz
L19faW5pdF9fLnB5OgorICAgICAgICAqIFNjcmlwdHMvd2Via2l0cHkvdG9vbC9zdGVwcy9vcHRp
b25zLnB5OgorICAgICAgICAqIFNjcmlwdHMvd2Via2l0cHkvdG9vbC9zdGVwcy9wb3N0Y29kZXJl
dmlldy5weTogQWRkZWQuCisgICAgICAgICogU2NyaXB0cy93ZWJraXRweS90b29sL3N0ZXBzL3Bv
c3RkaWZmLnB5OgorCiAyMDEwLTA0LTEwICBBZGFtIEJhcnRoICA8YWJhcnRoQHdlYmtpdC5vcmc+
CiAKICAgICAgICAgUnViYmVyLXN0YW1wZWQgYnkgRXJpYyBTZWlkZWwuCmRpZmYgLS1naXQgYS9X
ZWJLaXRUb29scy9TY3JpcHRzL3dlYmtpdHB5L2NvbW1vbi9jb25maWcvX19pbml0X18ucHkgYi9X
ZWJLaXRUb29scy9TY3JpcHRzL3dlYmtpdHB5L2NvbW1vbi9jb25maWcvX19pbml0X18ucHkKaW5k
ZXggZWY2NWJlZS4uMjIxOGYwMiAxMDA2NDQKLS0tIGEvV2ViS2l0VG9vbHMvU2NyaXB0cy93ZWJr
aXRweS9jb21tb24vY29uZmlnL19faW5pdF9fLnB5CisrKyBiL1dlYktpdFRvb2xzL1NjcmlwdHMv
d2Via2l0cHkvY29tbW9uL2NvbmZpZy9fX2luaXRfXy5weQpAQCAtMSArMSw3IEBACiAjIFJlcXVp
cmVkIGZvciBQeXRob24gdG8gc2VhcmNoIHRoaXMgZGlyZWN0b3J5IGZvciBtb2R1bGUgZmlsZXMK
KworaW1wb3J0IHJlCisKK2NvZGVyZXZpZXdfc2VydmVyX2hvc3QgPSAiY29kZXJldmlldy5hcHBz
cG90LmNvbSIKK2NvZGVyZXZpZXdfc2VydmVyX3JlZ2V4ID0gImh0dHBzPzovLyVzLyIgJSByZS5z
dWIoJ1wuJywgJ1xcLicsIGNvZGVyZXZpZXdfc2VydmVyX2hvc3QpCitjb2RlcmV2aWV3X3NlcnZl
cl91cmwgPSAiaHR0cHM6Ly8lcy8iICUgY29kZXJldmlld19zZXJ2ZXJfaG9zdApkaWZmIC0tZ2l0
IGEvV2ViS2l0VG9vbHMvU2NyaXB0cy93ZWJraXRweS9jb21tb24vbmV0L3JpZXR2ZWxkLnB5IGIv
V2ViS2l0VG9vbHMvU2NyaXB0cy93ZWJraXRweS9jb21tb24vbmV0L3JpZXR2ZWxkLnB5Cm5ldyBm
aWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU5NTUxODMKLS0tIC9kZXYvbnVsbAorKysg
Yi9XZWJLaXRUb29scy9TY3JpcHRzL3dlYmtpdHB5L2NvbW1vbi9uZXQvcmlldHZlbGQucHkKQEAg
LTAsMCArMSw4NSBAQAorIyBDb3B5cmlnaHQgKGMpIDIwMTAgR29vZ2xlIEluYy4gQWxsIHJpZ2h0
cyByZXNlcnZlZC4KKyMKKyMgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJp
bmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisjIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRl
ZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKyMgbWV0OgorIwor
IyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFi
b3ZlIGNvcHlyaWdodAorIyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUg
Zm9sbG93aW5nIGRpc2NsYWltZXIuCisjICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkg
Zm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyMgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBs
aXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorIyBpbiB0aGUg
ZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisj
IGRpc3RyaWJ1dGlvbi4KKyMgICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBu
b3IgdGhlIG5hbWVzIG9mIGl0cworIyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3Jz
ZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorIyB0aGlzIHNvZnR3YXJlIHdpdGhv
dXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorIworIyBUSElTIFNPRlRXQVJF
IElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisj
ICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5H
LCBCVVQgTk9UCisjIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hB
TlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorIyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElT
Q0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorIyBPV05FUiBPUiBDT05U
UklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwK
KyMgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElO
RywgQlVUIE5PVAorIyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RT
IE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyMgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5F
U1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisjIFRIRU9SWSBPRiBM
SUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQK
KyMgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZ
IE9VVCBPRiBUSEUgVVNFCisjIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBU
SEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKK2ltcG9ydCBvcworaW1wb3J0IHJlCisK
K2ltcG9ydCB3ZWJraXRweS5jb21tb24uY29uZmlnIGFzIGNvbmZpZworZnJvbSB3ZWJraXRweS5j
b21tb24uc3lzdGVtLmRlcHJlY2F0ZWRfbG9nZ2luZyBpbXBvcnQgbG9nCitmcm9tIHdlYmtpdHB5
LmNvbW1vbi5zeXN0ZW0uZXhlY3V0aXZlIGltcG9ydCBTY3JpcHRFcnJvcgoraW1wb3J0IHdlYmtp
dHB5LnRoaXJkcGFydHkucmlldHZlbGQgYXMgcmlldHZlbGQKKworCitkZWYgcGFyc2VfY29kZXJl
dmlld19pc3N1ZShtZXNzYWdlKToKKyAgICBpZiBub3QgbWVzc2FnZToKKyAgICAgICAgcmV0dXJu
IE5vbmUKKyAgICBtYXRjaCA9IHJlLnNlYXJjaChjb25maWcuY29kZXJldmlld19zZXJ2ZXJfcmVn
ZXggKworICAgICAgICAgICAgICAgICAgICAgICIoP1A8Y29kZXJldmlld19pc3N1ZT5cZCspIiwK
KyAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlKQorICAgIGlmIG1hdGNoOgorICAgICAgICBy
ZXR1cm4gaW50KG1hdGNoLmdyb3VwKCdjb2RlcmV2aWV3X2lzc3VlJykpCisKKworY2xhc3MgUmll
dHZlbGQob2JqZWN0KToKKyAgICBkZWYgX19pbml0X18oc2VsZiwgZXhlY3V0aXZlLCBkcnlydW49
RmFsc2UpOgorICAgICAgICBzZWxmLmRyeXJ1biA9IGRyeXJ1bgorICAgICAgICBzZWxmLl9leGVj
dXRpdmUgPSBleGVjdXRpdmUKKyAgICAgICAgc2VsZi5fdXBsb2FkX3B5ID0gb3MucGF0aC5qb2lu
KG9zLnBhdGguZGlybmFtZShyaWV0dmVsZC5fX2ZpbGVfXyksCisgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAidXBsb2FkLnB5IikKKworICAgIGRlZiB1cmxfZm9yX2lzc3Vl
KHNlbGYsIGNvZGVyZXZpZXdfaXNzdWUpOgorICAgICAgICBpZiBub3QgY29kZXJldmlld19pc3N1
ZToKKyAgICAgICAgICAgIHJldHVybiBOb25lCisgICAgICAgIHJldHVybiAiJXMlcyIgJSAoY29u
ZmlnLmNvZGVyZXZpZXdfc2VydmVyX3VybCwgY29kZXJldmlld19pc3N1ZSkKKworICAgIGRlZiBw
b3N0KHNlbGYsIG1lc3NhZ2U9Tm9uZSwgY29kZXJldmlld19pc3N1ZT1Ob25lLCBjYz1Ob25lKToK
KyAgICAgICAgaWYgbm90IG1lc3NhZ2U6CisgICAgICAgICAgICByYWlzZSBTY3JpcHRFcnJvcigi
UmlldHZlbGQgcmVxdWlyZXMgYSBtZXNzYWdlLiIpCisKKyAgICAgICAgYXJncyA9IFsKKyAgICAg
ICAgICAgIHNlbGYuX3VwbG9hZF9weSwKKyAgICAgICAgICAgICItLWFzc3VtZV95ZXMiLAorICAg
ICAgICAgICAgIi0tc2VydmVyPSVzIiAlIGNvbmZpZy5jb2RlcmV2aWV3X3NlcnZlcl9ob3N0LAor
ICAgICAgICAgICAgIi0tbWVzc2FnZT0lcyIgJSBtZXNzYWdlLAorICAgICAgICBdCisgICAgICAg
IGlmIGNvZGVyZXZpZXdfaXNzdWU6CisgICAgICAgICAgICBhcmdzLmFwcGVuZCgiLS1pc3N1ZT0l
cyIgJSBjb2RlcmV2aWV3X2lzc3VlKQorICAgICAgICBpZiBjYzoKKyAgICAgICAgICAgIGFyZ3Mu
YXBwZW5kKCItLWNjPSVzIiAlIGNjKQorCisgICAgICAgIGlmIHNlbGYuZHJ5cnVuOgorICAgICAg
ICAgICAgbG9nKCJXb3VsZCBoYXZlIHJ1biAlcyIgJSBhcmdzKQorICAgICAgICAgICAgcmV0dXJu
CisKKyAgICAgICAgb3V0cHV0ID0gc2VsZi5fZXhlY3V0aXZlLnJ1bl9hbmRfdGhyb3dfaWZfZmFp
bChhcmdzKQorICAgICAgICBtYXRjaCA9IHJlLnNlYXJjaCgiSXNzdWUgY3JlYXRlZFwuIFVSTDog
IiArCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZy5jb2RlcmV2aWV3X3NlcnZlcl9y
ZWdleCArCisgICAgICAgICAgICAgICAgICAgICAgICAgICIoP1A8Y29kZXJldmlld19pc3N1ZT5c
ZCspIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0KQorICAgICAgICBpZiBtYXRj
aDoKKyAgICAgICAgICAgIHJldHVybiBpbnQobWF0Y2guZ3JvdXAoJ2NvZGVyZXZpZXdfaXNzdWUn
KSkKZGlmZiAtLWdpdCBhL1dlYktpdFRvb2xzL1NjcmlwdHMvd2Via2l0cHkvY29tbW9uL25ldC9y
aWV0dmVsZF91bml0dGVzdC5weSBiL1dlYktpdFRvb2xzL1NjcmlwdHMvd2Via2l0cHkvY29tbW9u
L25ldC9yaWV0dmVsZF91bml0dGVzdC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAw
MDAwLi5kYTVlMGY1Ci0tLSAvZGV2L251bGwKKysrIGIvV2ViS2l0VG9vbHMvU2NyaXB0cy93ZWJr
aXRweS9jb21tb24vbmV0L3JpZXR2ZWxkX3VuaXR0ZXN0LnB5CkBAIC0wLDAgKzEsMzkgQEAKKyMg
Q29weXJpZ2h0IChjKSAyMDEwIEdvb2dsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisjCisj
IFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGgg
b3Igd2l0aG91dAorIyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0
aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisjIG1ldDoKKyMKKyMgICAgICogUmVkaXN0cmli
dXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyMg
bm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFp
bWVyLgorIyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1
Y2UgdGhlIGFib3ZlCisjIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25z
IGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKyMgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5k
L29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorIyBkaXN0cmlidXRpb24uCisj
ICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBp
dHMKKyMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9k
dWN0cyBkZXJpdmVkIGZyb20KKyMgdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9y
IHdyaXR0ZW4gcGVybWlzc2lvbi4KKyMKKyMgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBU
SEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworIyAiQVMgSVMiIEFORCBBTlkg
RVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorIyBMSU1J
VEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklU
TkVTUyBGT1IKKyMgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVW
RU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKyMgT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJM
RSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisjIFNQRUNJQUwsIEVYRU1Q
TEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKyMgTElN
SVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9T
UyBPRiBVU0UsCisjIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikg
SE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorIyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVS
IElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisjIChJTkNMVURJTkcgTkVH
TElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQor
IyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9G
IFNVQ0ggREFNQUdFLgorCitpbXBvcnQgdW5pdHRlc3QKKworZnJvbSB3ZWJraXRweS5jb21tb24u
bmV0LnJpZXR2ZWxkIGltcG9ydCBSaWV0dmVsZAorZnJvbSB3ZWJraXRweS50aGlyZHBhcnR5Lm1v
Y2sgaW1wb3J0IE1vY2sKKworCitjbGFzcyBSaWV0dmVsZFRlc3QodW5pdHRlc3QuVGVzdENhc2Up
OgorICAgIGRlZiB0ZXN0X3VybF9mb3JfaXNzdWUoc2VsZik6CisgICAgICAgIHJpZXR2ZWxkID0g
UmlldHZlbGQoTW9jaygpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJpZXR2ZWxkLnVybF9m
b3JfaXNzdWUoMzQyMjMpLAorICAgICAgICAgICAgICAgICAgICAgICAgICJodHRwczovL2NvZGVy
ZXZpZXcuYXBwc3BvdC5jb20vMzQyMjMiKQpkaWZmIC0tZ2l0IGEvV2ViS2l0VG9vbHMvU2NyaXB0
cy93ZWJraXRweS90aGlyZHBhcnR5L3JpZXR2ZWxkL19faW5pdF9fLnB5IGIvV2ViS2l0VG9vbHMv
U2NyaXB0cy93ZWJraXRweS90aGlyZHBhcnR5L3JpZXR2ZWxkL19faW5pdF9fLnB5Cm5ldyBmaWxl
IG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVmNjViZWUKLS0tIC9kZXYvbnVsbAorKysgYi9X
ZWJLaXRUb29scy9TY3JpcHRzL3dlYmtpdHB5L3RoaXJkcGFydHkvcmlldHZlbGQvX19pbml0X18u
cHkKQEAgLTAsMCArMSBAQAorIyBSZXF1aXJlZCBmb3IgUHl0aG9uIHRvIHNlYXJjaCB0aGlzIGRp
cmVjdG9yeSBmb3IgbW9kdWxlIGZpbGVzCmRpZmYgLS1naXQgYS9XZWJLaXRUb29scy9TY3JpcHRz
L3dlYmtpdHB5L3RoaXJkcGFydHkvcmlldHZlbGQvdXBsb2FkLnB5IGIvV2ViS2l0VG9vbHMvU2Ny
aXB0cy93ZWJraXRweS90aGlyZHBhcnR5L3JpZXR2ZWxkL3VwbG9hZC5weQpuZXcgZmlsZSBtb2Rl
IDEwMDc1NQppbmRleCAwMDAwMDAwLi41ZGFhMWQ3Ci0tLSAvZGV2L251bGwKKysrIGIvV2ViS2l0
VG9vbHMvU2NyaXB0cy93ZWJraXRweS90aGlyZHBhcnR5L3JpZXR2ZWxkL3VwbG9hZC5weQpAQCAt
MCwwICsxLDE2OTMgQEAKKyMhL3Vzci9iaW4vZW52IHB5dGhvbgorIworIyBDb3B5cmlnaHQgMjAw
NyBHb29nbGUgSW5jLgorIworIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZl
cnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBl
eGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorIyBZb3UgbWF5IG9idGFpbiBh
IGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9s
aWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBs
YXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVy
IHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhP
VVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBv
ciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBn
b3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNl
LgorCisiIiJUb29sIGZvciB1cGxvYWRpbmcgZGlmZnMgZnJvbSBhIHZlcnNpb24gY29udHJvbCBz
eXN0ZW0gdG8gdGhlIGNvZGVyZXZpZXcgYXBwLgorCitVc2FnZSBzdW1tYXJ5OiB1cGxvYWQucHkg
W29wdGlvbnNdIFstLSBkaWZmX29wdGlvbnNdCisKK0RpZmYgb3B0aW9ucyBhcmUgcGFzc2VkIHRv
IHRoZSBkaWZmIGNvbW1hbmQgb2YgdGhlIHVuZGVybHlpbmcgc3lzdGVtLgorCitTdXBwb3J0ZWQg
dmVyc2lvbiBjb250cm9sIHN5c3RlbXM6CisgIEdpdAorICBNZXJjdXJpYWwKKyAgU3VidmVyc2lv
bgorCitJdCBpcyBpbXBvcnRhbnQgZm9yIEdpdC9NZXJjdXJpYWwgdXNlcnMgdG8gc3BlY2lmeSBh
IHRyZWUvbm9kZS9icmFuY2ggdG8gZGlmZgorYWdhaW5zdCBieSB1c2luZyB0aGUgJy0tcmV2JyBv
cHRpb24uCisiIiIKKyMgVGhpcyBjb2RlIGlzIGRlcml2ZWQgZnJvbSBhcHBjZmcucHkgaW4gdGhl
IEFwcCBFbmdpbmUgU0RLIChvcGVuIHNvdXJjZSksCisjIGFuZCBmcm9tIEFTUE4gcmVjaXBlICMx
NDYzMDYuCisKK2ltcG9ydCBDb25maWdQYXJzZXIKK2ltcG9ydCBjb29raWVsaWIKK2ltcG9ydCBm
bm1hdGNoCitpbXBvcnQgZ2V0cGFzcworaW1wb3J0IGxvZ2dpbmcKK2ltcG9ydCBtaW1ldHlwZXMK
K2ltcG9ydCBvcHRwYXJzZQoraW1wb3J0IG9zCitpbXBvcnQgcmUKK2ltcG9ydCBzb2NrZXQKK2lt
cG9ydCBzdWJwcm9jZXNzCitpbXBvcnQgc3lzCitpbXBvcnQgdXJsbGliCitpbXBvcnQgdXJsbGli
MgoraW1wb3J0IHVybHBhcnNlCisKKyMgVGhlIG1kNSBtb2R1bGUgd2FzIGRlcHJlY2F0ZWQgaW4g
UHl0aG9uIDIuNS4KK3RyeToKKyAgZnJvbSBoYXNobGliIGltcG9ydCBtZDUKK2V4Y2VwdCBJbXBv
cnRFcnJvcjoKKyAgZnJvbSBtZDUgaW1wb3J0IG1kNQorCit0cnk6CisgIGltcG9ydCByZWFkbGlu
ZQorZXhjZXB0IEltcG9ydEVycm9yOgorICBwYXNzCisKKyMgVGhlIGxvZ2dpbmcgdmVyYm9zaXR5
OgorIyAgMDogRXJyb3JzIG9ubHkuCisjICAxOiBTdGF0dXMgbWVzc2FnZXMuCisjICAyOiBJbmZv
IGxvZ3MuCisjICAzOiBEZWJ1ZyBsb2dzLgordmVyYm9zaXR5ID0gMQorCisjIE1heCBzaXplIG9m
IHBhdGNoIG9yIGJhc2UgZmlsZS4KK01BWF9VUExPQURfU0laRSA9IDkwMCAqIDEwMjQKKworIyBD
b25zdGFudHMgZm9yIHZlcnNpb24gY29udHJvbCBuYW1lcy4gIFVzZWQgYnkgR3Vlc3NWQ1NOYW1l
LgorVkNTX0dJVCA9ICJHaXQiCitWQ1NfTUVSQ1VSSUFMID0gIk1lcmN1cmlhbCIKK1ZDU19TVUJW
RVJTSU9OID0gIlN1YnZlcnNpb24iCitWQ1NfVU5LTk9XTiA9ICJVbmtub3duIgorCisjIHdoaXRl
bGlzdCBmb3Igbm9uLWJpbmFyeSBmaWxldHlwZXMgd2hpY2ggZG8gbm90IHN0YXJ0IHdpdGggInRl
eHQvIgorIyAubW0gKE9iamVjdGl2ZS1DKSBzaG93cyB1cCBhcyBhcHBsaWNhdGlvbi94LWZyZWVt
aW5kIG9uIG15IExpbnV4IGJveC4KK1RFWFRfTUlNRVRZUEVTID0gWydhcHBsaWNhdGlvbi9qYXZh
c2NyaXB0JywgJ2FwcGxpY2F0aW9uL3gtamF2YXNjcmlwdCcsCisgICAgICAgICAgICAgICAgICAn
YXBwbGljYXRpb24veC1mcmVlbWluZCddCisKK1ZDU19BQkJSRVZJQVRJT05TID0geworICBWQ1Nf
TUVSQ1VSSUFMLmxvd2VyKCk6IFZDU19NRVJDVVJJQUwsCisgICJoZyI6IFZDU19NRVJDVVJJQUws
CisgIFZDU19TVUJWRVJTSU9OLmxvd2VyKCk6IFZDU19TVUJWRVJTSU9OLAorICAic3ZuIjogVkNT
X1NVQlZFUlNJT04sCisgIFZDU19HSVQubG93ZXIoKTogVkNTX0dJVCwKK30KKworIyBUaGUgcmVz
dWx0IG9mIHBhcnNpbmcgU3VidmVyc2lvbidzIFthdXRvLXByb3BzXSBzZXR0aW5nLgorc3ZuX2F1
dG9fcHJvcHNfbWFwID0gTm9uZQorCitkZWYgR2V0RW1haWwocHJvbXB0KToKKyAgIiIiUHJvbXB0
cyB0aGUgdXNlciBmb3IgdGhlaXIgZW1haWwgYWRkcmVzcyBhbmQgcmV0dXJucyBpdC4KKworICBU
aGUgbGFzdCB1c2VkIGVtYWlsIGFkZHJlc3MgaXMgc2F2ZWQgdG8gYSBmaWxlIGFuZCBvZmZlcmVk
IHVwIGFzIGEgc3VnZ2VzdGlvbgorICB0byB0aGUgdXNlci4gSWYgdGhlIHVzZXIgcHJlc3NlcyBl
bnRlciB3aXRob3V0IHR5cGluZyBpbiBhbnl0aGluZyB0aGUgbGFzdAorICB1c2VkIGVtYWlsIGFk
ZHJlc3MgaXMgdXNlZC4gSWYgdGhlIHVzZXIgZW50ZXJzIGEgbmV3IGFkZHJlc3MsIGl0IGlzIHNh
dmVkCisgIGZvciBuZXh0IHRpbWUgd2UgcHJvbXB0LgorCisgICIiIgorICBsYXN0X2VtYWlsX2Zp
bGVfbmFtZSA9IG9zLnBhdGguZXhwYW5kdXNlcigifi8ubGFzdF9jb2RlcmV2aWV3X2VtYWlsX2Fk
ZHJlc3MiKQorICBsYXN0X2VtYWlsID0gIiIKKyAgaWYgb3MucGF0aC5leGlzdHMobGFzdF9lbWFp
bF9maWxlX25hbWUpOgorICAgIHRyeToKKyAgICAgIGxhc3RfZW1haWxfZmlsZSA9IG9wZW4obGFz
dF9lbWFpbF9maWxlX25hbWUsICJyIikKKyAgICAgIGxhc3RfZW1haWwgPSBsYXN0X2VtYWlsX2Zp
bGUucmVhZGxpbmUoKS5zdHJpcCgiXG4iKQorICAgICAgbGFzdF9lbWFpbF9maWxlLmNsb3NlKCkK
KyAgICAgIHByb21wdCArPSAiIFslc10iICUgbGFzdF9lbWFpbAorICAgIGV4Y2VwdCBJT0Vycm9y
LCBlOgorICAgICAgcGFzcworICBlbWFpbCA9IHJhd19pbnB1dChwcm9tcHQgKyAiOiAiKS5zdHJp
cCgpCisgIGlmIGVtYWlsOgorICAgIHRyeToKKyAgICAgIGxhc3RfZW1haWxfZmlsZSA9IG9wZW4o
bGFzdF9lbWFpbF9maWxlX25hbWUsICJ3IikKKyAgICAgIGxhc3RfZW1haWxfZmlsZS53cml0ZShl
bWFpbCkKKyAgICAgIGxhc3RfZW1haWxfZmlsZS5jbG9zZSgpCisgICAgZXhjZXB0IElPRXJyb3Is
IGU6CisgICAgICBwYXNzCisgIGVsc2U6CisgICAgZW1haWwgPSBsYXN0X2VtYWlsCisgIHJldHVy
biBlbWFpbAorCisKK2RlZiBTdGF0dXNVcGRhdGUobXNnKToKKyAgIiIiUHJpbnQgYSBzdGF0dXMg
bWVzc2FnZSB0byBzdGRvdXQuCisKKyAgSWYgJ3ZlcmJvc2l0eScgaXMgZ3JlYXRlciB0aGFuIDAs
IHByaW50IHRoZSBtZXNzYWdlLgorCisgIEFyZ3M6CisgICAgbXNnOiBUaGUgc3RyaW5nIHRvIHBy
aW50LgorICAiIiIKKyAgaWYgdmVyYm9zaXR5ID4gMDoKKyAgICBwcmludCBtc2cKKworCitkZWYg
RXJyb3JFeGl0KG1zZyk6CisgICIiIlByaW50IGFuIGVycm9yIG1lc3NhZ2UgdG8gc3RkZXJyIGFu
ZCBleGl0LiIiIgorICBwcmludCA+PnN5cy5zdGRlcnIsIG1zZworICBzeXMuZXhpdCgxKQorCisK
K2NsYXNzIENsaWVudExvZ2luRXJyb3IodXJsbGliMi5IVFRQRXJyb3IpOgorICAiIiJSYWlzZWQg
dG8gaW5kaWNhdGUgdGhlcmUgd2FzIGFuIGVycm9yIGF1dGhlbnRpY2F0aW5nIHdpdGggQ2xpZW50
TG9naW4uIiIiCisKKyAgZGVmIF9faW5pdF9fKHNlbGYsIHVybCwgY29kZSwgbXNnLCBoZWFkZXJz
LCBhcmdzKToKKyAgICB1cmxsaWIyLkhUVFBFcnJvci5fX2luaXRfXyhzZWxmLCB1cmwsIGNvZGUs
IG1zZywgaGVhZGVycywgTm9uZSkKKyAgICBzZWxmLmFyZ3MgPSBhcmdzCisgICAgc2VsZi5yZWFz
b24gPSBhcmdzWyJFcnJvciJdCisKKworY2xhc3MgQWJzdHJhY3RScGNTZXJ2ZXIob2JqZWN0KToK
KyAgIiIiUHJvdmlkZXMgYSBjb21tb24gaW50ZXJmYWNlIGZvciBhIHNpbXBsZSBSUEMgc2VydmVy
LiIiIgorCisgIGRlZiBfX2luaXRfXyhzZWxmLCBob3N0LCBhdXRoX2Z1bmN0aW9uLCBob3N0X292
ZXJyaWRlPU5vbmUsIGV4dHJhX2hlYWRlcnM9e30sCisgICAgICAgICAgICAgICBzYXZlX2Nvb2tp
ZXM9RmFsc2UpOgorICAgICIiIkNyZWF0ZXMgYSBuZXcgSHR0cFJwY1NlcnZlci4KKworICAgIEFy
Z3M6CisgICAgICBob3N0OiBUaGUgaG9zdCB0byBzZW5kIHJlcXVlc3RzIHRvLgorICAgICAgYXV0
aF9mdW5jdGlvbjogQSBmdW5jdGlvbiB0aGF0IHRha2VzIG5vIGFyZ3VtZW50cyBhbmQgcmV0dXJu
cyBhbgorICAgICAgICAoZW1haWwsIHBhc3N3b3JkKSB0dXBsZSB3aGVuIGNhbGxlZC4gV2lsbCBi
ZSBjYWxsZWQgaWYgYXV0aGVudGljYXRpb24KKyAgICAgICAgaXMgcmVxdWlyZWQuCisgICAgICBo
b3N0X292ZXJyaWRlOiBUaGUgaG9zdCBoZWFkZXIgdG8gc2VuZCB0byB0aGUgc2VydmVyIChkZWZh
dWx0cyB0byBob3N0KS4KKyAgICAgIGV4dHJhX2hlYWRlcnM6IEEgZGljdCBvZiBleHRyYSBoZWFk
ZXJzIHRvIGFwcGVuZCB0byBldmVyeSByZXF1ZXN0LgorICAgICAgc2F2ZV9jb29raWVzOiBJZiBU
cnVlLCBzYXZlIHRoZSBhdXRoZW50aWNhdGlvbiBjb29raWVzIHRvIGxvY2FsIGRpc2suCisgICAg
ICAgIElmIEZhbHNlLCB1c2UgYW4gaW4tbWVtb3J5IGNvb2tpZWphciBpbnN0ZWFkLiAgU3ViY2xh
c3NlcyBtdXN0CisgICAgICAgIGltcGxlbWVudCB0aGlzIGZ1bmN0aW9uYWxpdHkuICBEZWZhdWx0
cyB0byBGYWxzZS4KKyAgICAiIiIKKyAgICBzZWxmLmhvc3QgPSBob3N0CisgICAgc2VsZi5ob3N0
X292ZXJyaWRlID0gaG9zdF9vdmVycmlkZQorICAgIHNlbGYuYXV0aF9mdW5jdGlvbiA9IGF1dGhf
ZnVuY3Rpb24KKyAgICBzZWxmLmF1dGhlbnRpY2F0ZWQgPSBGYWxzZQorICAgIHNlbGYuZXh0cmFf
aGVhZGVycyA9IGV4dHJhX2hlYWRlcnMKKyAgICBzZWxmLnNhdmVfY29va2llcyA9IHNhdmVfY29v
a2llcworICAgIHNlbGYub3BlbmVyID0gc2VsZi5fR2V0T3BlbmVyKCkKKyAgICBpZiBzZWxmLmhv
c3Rfb3ZlcnJpZGU6CisgICAgICBsb2dnaW5nLmluZm8oIlNlcnZlcjogJXM7IEhvc3Q6ICVzIiwg
c2VsZi5ob3N0LCBzZWxmLmhvc3Rfb3ZlcnJpZGUpCisgICAgZWxzZToKKyAgICAgIGxvZ2dpbmcu
aW5mbygiU2VydmVyOiAlcyIsIHNlbGYuaG9zdCkKKworICBkZWYgX0dldE9wZW5lcihzZWxmKToK
KyAgICAiIiJSZXR1cm5zIGFuIE9wZW5lckRpcmVjdG9yIGZvciBtYWtpbmcgSFRUUCByZXF1ZXN0
cy4KKworICAgIFJldHVybnM6CisgICAgICBBIHVybGxpYjIuT3BlbmVyRGlyZWN0b3Igb2JqZWN0
LgorICAgICIiIgorICAgIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoKQorCisgIGRlZiBfQ3Jl
YXRlUmVxdWVzdChzZWxmLCB1cmwsIGRhdGE9Tm9uZSk6CisgICAgIiIiQ3JlYXRlcyBhIG5ldyB1
cmxsaWIgcmVxdWVzdC4iIiIKKyAgICBsb2dnaW5nLmRlYnVnKCJDcmVhdGluZyByZXF1ZXN0IGZv
cjogJyVzJyB3aXRoIHBheWxvYWQ6XG4lcyIsIHVybCwgZGF0YSkKKyAgICByZXEgPSB1cmxsaWIy
LlJlcXVlc3QodXJsLCBkYXRhPWRhdGEpCisgICAgaWYgc2VsZi5ob3N0X292ZXJyaWRlOgorICAg
ICAgcmVxLmFkZF9oZWFkZXIoIkhvc3QiLCBzZWxmLmhvc3Rfb3ZlcnJpZGUpCisgICAgZm9yIGtl
eSwgdmFsdWUgaW4gc2VsZi5leHRyYV9oZWFkZXJzLml0ZXJpdGVtcygpOgorICAgICAgcmVxLmFk
ZF9oZWFkZXIoa2V5LCB2YWx1ZSkKKyAgICByZXR1cm4gcmVxCisKKyAgZGVmIF9HZXRBdXRoVG9r
ZW4oc2VsZiwgZW1haWwsIHBhc3N3b3JkKToKKyAgICAiIiJVc2VzIENsaWVudExvZ2luIHRvIGF1
dGhlbnRpY2F0ZSB0aGUgdXNlciwgcmV0dXJuaW5nIGFuIGF1dGggdG9rZW4uCisKKyAgICBBcmdz
OgorICAgICAgZW1haWw6ICAgIFRoZSB1c2VyJ3MgZW1haWwgYWRkcmVzcworICAgICAgcGFzc3dv
cmQ6IFRoZSB1c2VyJ3MgcGFzc3dvcmQKKworICAgIFJhaXNlczoKKyAgICAgIENsaWVudExvZ2lu
RXJyb3I6IElmIHRoZXJlIHdhcyBhbiBlcnJvciBhdXRoZW50aWNhdGluZyB3aXRoIENsaWVudExv
Z2luLgorICAgICAgSFRUUEVycm9yOiBJZiB0aGVyZSB3YXMgc29tZSBvdGhlciBmb3JtIG9mIEhU
VFAgZXJyb3IuCisKKyAgICBSZXR1cm5zOgorICAgICAgVGhlIGF1dGhlbnRpY2F0aW9uIHRva2Vu
IHJldHVybmVkIGJ5IENsaWVudExvZ2luLgorICAgICIiIgorICAgIGFjY291bnRfdHlwZSA9ICJH
T09HTEUiCisgICAgaWYgc2VsZi5ob3N0LmVuZHN3aXRoKCIuZ29vZ2xlLmNvbSIpOgorICAgICAg
IyBOZWVkZWQgZm9yIHVzZSBpbnNpZGUgR29vZ2xlLgorICAgICAgYWNjb3VudF90eXBlID0gIkhP
U1RFRCIKKyAgICByZXEgPSBzZWxmLl9DcmVhdGVSZXF1ZXN0KAorICAgICAgICB1cmw9Imh0dHBz
Oi8vd3d3Lmdvb2dsZS5jb20vYWNjb3VudHMvQ2xpZW50TG9naW4iLAorICAgICAgICBkYXRhPXVy
bGxpYi51cmxlbmNvZGUoeworICAgICAgICAgICAgIkVtYWlsIjogZW1haWwsCisgICAgICAgICAg
ICAiUGFzc3dkIjogcGFzc3dvcmQsCisgICAgICAgICAgICAic2VydmljZSI6ICJhaCIsCisgICAg
ICAgICAgICAic291cmNlIjogInJpZXR2ZWxkLWNvZGVyZXZpZXctdXBsb2FkIiwKKyAgICAgICAg
ICAgICJhY2NvdW50VHlwZSI6IGFjY291bnRfdHlwZSwKKyAgICAgICAgfSksCisgICAgKQorICAg
IHRyeToKKyAgICAgIHJlc3BvbnNlID0gc2VsZi5vcGVuZXIub3BlbihyZXEpCisgICAgICByZXNw
b25zZV9ib2R5ID0gcmVzcG9uc2UucmVhZCgpCisgICAgICByZXNwb25zZV9kaWN0ID0gZGljdCh4
LnNwbGl0KCI9IikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciB4IGluIHJlc3BvbnNl
X2JvZHkuc3BsaXQoIlxuIikgaWYgeCkKKyAgICAgIHJldHVybiByZXNwb25zZV9kaWN0WyJBdXRo
Il0KKyAgICBleGNlcHQgdXJsbGliMi5IVFRQRXJyb3IsIGU6CisgICAgICBpZiBlLmNvZGUgPT0g
NDAzOgorICAgICAgICBib2R5ID0gZS5yZWFkKCkKKyAgICAgICAgcmVzcG9uc2VfZGljdCA9IGRp
Y3QoeC5zcGxpdCgiPSIsIDEpIGZvciB4IGluIGJvZHkuc3BsaXQoIlxuIikgaWYgeCkKKyAgICAg
ICAgcmFpc2UgQ2xpZW50TG9naW5FcnJvcihyZXEuZ2V0X2Z1bGxfdXJsKCksIGUuY29kZSwgZS5t
c2csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5oZWFkZXJzLCByZXNwb25zZV9k
aWN0KQorICAgICAgZWxzZToKKyAgICAgICAgcmFpc2UKKworICBkZWYgX0dldEF1dGhDb29raWUo
c2VsZiwgYXV0aF90b2tlbik6CisgICAgIiIiRmV0Y2hlcyBhdXRoZW50aWNhdGlvbiBjb29raWVz
IGZvciBhbiBhdXRoZW50aWNhdGlvbiB0b2tlbi4KKworICAgIEFyZ3M6CisgICAgICBhdXRoX3Rv
a2VuOiBUaGUgYXV0aGVudGljYXRpb24gdG9rZW4gcmV0dXJuZWQgYnkgQ2xpZW50TG9naW4uCisK
KyAgICBSYWlzZXM6CisgICAgICBIVFRQRXJyb3I6IElmIHRoZXJlIHdhcyBhbiBlcnJvciBmZXRj
aGluZyB0aGUgYXV0aGVudGljYXRpb24gY29va2llcy4KKyAgICAiIiIKKyAgICAjIFRoaXMgaXMg
YSBkdW1teSB2YWx1ZSB0byBhbGxvdyB1cyB0byBpZGVudGlmeSB3aGVuIHdlJ3JlIHN1Y2Nlc3Nm
dWwuCisgICAgY29udGludWVfbG9jYXRpb24gPSAiaHR0cDovL2xvY2FsaG9zdC8iCisgICAgYXJn
cyA9IHsiY29udGludWUiOiBjb250aW51ZV9sb2NhdGlvbiwgImF1dGgiOiBhdXRoX3Rva2VufQor
ICAgIHJlcSA9IHNlbGYuX0NyZWF0ZVJlcXVlc3QoImh0dHA6Ly8lcy9fYWgvbG9naW4/JXMiICUK
KyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzZWxmLmhvc3QsIHVybGxpYi51cmxlbmNv
ZGUoYXJncykpKQorICAgIHRyeToKKyAgICAgIHJlc3BvbnNlID0gc2VsZi5vcGVuZXIub3Blbihy
ZXEpCisgICAgZXhjZXB0IHVybGxpYjIuSFRUUEVycm9yLCBlOgorICAgICAgcmVzcG9uc2UgPSBl
CisgICAgaWYgKHJlc3BvbnNlLmNvZGUgIT0gMzAyIG9yCisgICAgICAgIHJlc3BvbnNlLmluZm8o
KVsibG9jYXRpb24iXSAhPSBjb250aW51ZV9sb2NhdGlvbik6CisgICAgICByYWlzZSB1cmxsaWIy
LkhUVFBFcnJvcihyZXEuZ2V0X2Z1bGxfdXJsKCksIHJlc3BvbnNlLmNvZGUsIHJlc3BvbnNlLm1z
ZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlLmhlYWRlcnMsIHJlc3Bv
bnNlLmZwKQorICAgIHNlbGYuYXV0aGVudGljYXRlZCA9IFRydWUKKworICBkZWYgX0F1dGhlbnRp
Y2F0ZShzZWxmKToKKyAgICAiIiJBdXRoZW50aWNhdGVzIHRoZSB1c2VyLgorCisgICAgVGhlIGF1
dGhlbnRpY2F0aW9uIHByb2Nlc3Mgd29ya3MgYXMgZm9sbG93czoKKyAgICAgMSkgV2UgZ2V0IGEg
dXNlcm5hbWUgYW5kIHBhc3N3b3JkIGZyb20gdGhlIHVzZXIKKyAgICAgMikgV2UgdXNlIENsaWVu
dExvZ2luIHRvIG9idGFpbiBhbiBBVVRIIHRva2VuIGZvciB0aGUgdXNlcgorICAgICAgICAoc2Vl
IGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vYXBpcy9hY2NvdW50cy9BdXRoRm9ySW5zdGFsbGVkQXBw
cy5odG1sKS4KKyAgICAgMykgV2UgcGFzcyB0aGUgYXV0aCB0b2tlbiB0byAvX2FoL2xvZ2luIG9u
IHRoZSBzZXJ2ZXIgdG8gb2J0YWluIGFuCisgICAgICAgIGF1dGhlbnRpY2F0aW9uIGNvb2tpZS4g
SWYgbG9naW4gd2FzIHN1Y2Nlc3NmdWwsIGl0IHRyaWVzIHRvIHJlZGlyZWN0CisgICAgICAgIHVz
IHRvIHRoZSBVUkwgd2UgcHJvdmlkZWQuCisKKyAgICBJZiB3ZSBhdHRlbXB0IHRvIGFjY2VzcyB0
aGUgdXBsb2FkIEFQSSB3aXRob3V0IGZpcnN0IG9idGFpbmluZyBhbgorICAgIGF1dGhlbnRpY2F0
aW9uIGNvb2tpZSwgaXQgcmV0dXJucyBhIDQwMSByZXNwb25zZSAob3IgYSAzMDIpIGFuZAorICAg
IGRpcmVjdHMgdXMgdG8gYXV0aGVudGljYXRlIG91cnNlbHZlcyB3aXRoIENsaWVudExvZ2luLgor
ICAgICIiIgorICAgIGZvciBpIGluIHJhbmdlKDMpOgorICAgICAgY3JlZGVudGlhbHMgPSBzZWxm
LmF1dGhfZnVuY3Rpb24oKQorICAgICAgdHJ5OgorICAgICAgICBhdXRoX3Rva2VuID0gc2VsZi5f
R2V0QXV0aFRva2VuKGNyZWRlbnRpYWxzWzBdLCBjcmVkZW50aWFsc1sxXSkKKyAgICAgIGV4Y2Vw
dCBDbGllbnRMb2dpbkVycm9yLCBlOgorICAgICAgICBpZiBlLnJlYXNvbiA9PSAiQmFkQXV0aGVu
dGljYXRpb24iOgorICAgICAgICAgIHByaW50ID4+c3lzLnN0ZGVyciwgIkludmFsaWQgdXNlcm5h
bWUgb3IgcGFzc3dvcmQuIgorICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgIGlmIGUucmVhc29u
ID09ICJDYXB0Y2hhUmVxdWlyZWQiOgorICAgICAgICAgIHByaW50ID4+c3lzLnN0ZGVyciwgKAor
ICAgICAgICAgICAgICAiUGxlYXNlIGdvIHRvXG4iCisgICAgICAgICAgICAgICJodHRwczovL3d3
dy5nb29nbGUuY29tL2FjY291bnRzL0Rpc3BsYXlVbmxvY2tDYXB0Y2hhXG4iCisgICAgICAgICAg
ICAgICJhbmQgdmVyaWZ5IHlvdSBhcmUgYSBodW1hbi4gIFRoZW4gdHJ5IGFnYWluLiIpCisgICAg
ICAgICAgYnJlYWsKKyAgICAgICAgaWYgZS5yZWFzb24gPT0gIk5vdFZlcmlmaWVkIjoKKyAgICAg
ICAgICBwcmludCA+PnN5cy5zdGRlcnIsICJBY2NvdW50IG5vdCB2ZXJpZmllZC4iCisgICAgICAg
ICAgYnJlYWsKKyAgICAgICAgaWYgZS5yZWFzb24gPT0gIlRlcm1zTm90QWdyZWVkIjoKKyAgICAg
ICAgICBwcmludCA+PnN5cy5zdGRlcnIsICJVc2VyIGhhcyBub3QgYWdyZWVkIHRvIFRPUy4iCisg
ICAgICAgICAgYnJlYWsKKyAgICAgICAgaWYgZS5yZWFzb24gPT0gIkFjY291bnREZWxldGVkIjoK
KyAgICAgICAgICBwcmludCA+PnN5cy5zdGRlcnIsICJUaGUgdXNlciBhY2NvdW50IGhhcyBiZWVu
IGRlbGV0ZWQuIgorICAgICAgICAgIGJyZWFrCisgICAgICAgIGlmIGUucmVhc29uID09ICJBY2Nv
dW50RGlzYWJsZWQiOgorICAgICAgICAgIHByaW50ID4+c3lzLnN0ZGVyciwgIlRoZSB1c2VyIGFj
Y291bnQgaGFzIGJlZW4gZGlzYWJsZWQuIgorICAgICAgICAgIGJyZWFrCisgICAgICAgIGlmIGUu
cmVhc29uID09ICJTZXJ2aWNlRGlzYWJsZWQiOgorICAgICAgICAgIHByaW50ID4+c3lzLnN0ZGVy
ciwgKCJUaGUgdXNlcidzIGFjY2VzcyB0byB0aGUgc2VydmljZSBoYXMgYmVlbiAiCisgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgImRpc2FibGVkLiIpCisgICAgICAgICAgYnJlYWsKKyAg
ICAgICAgaWYgZS5yZWFzb24gPT0gIlNlcnZpY2VVbmF2YWlsYWJsZSI6CisgICAgICAgICAgcHJp
bnQgPj5zeXMuc3RkZXJyLCAiVGhlIHNlcnZpY2UgaXMgbm90IGF2YWlsYWJsZTsgdHJ5IGFnYWlu
IGxhdGVyLiIKKyAgICAgICAgICBicmVhaworICAgICAgICByYWlzZQorICAgICAgc2VsZi5fR2V0
QXV0aENvb2tpZShhdXRoX3Rva2VuKQorICAgICAgcmV0dXJuCisKKyAgZGVmIFNlbmQoc2VsZiwg
cmVxdWVzdF9wYXRoLCBwYXlsb2FkPU5vbmUsCisgICAgICAgICAgIGNvbnRlbnRfdHlwZT0iYXBw
bGljYXRpb24vb2N0ZXQtc3RyZWFtIiwKKyAgICAgICAgICAgdGltZW91dD1Ob25lLAorICAgICAg
ICAgICAqKmt3YXJncyk6CisgICAgIiIiU2VuZHMgYW4gUlBDIGFuZCByZXR1cm5zIHRoZSByZXNw
b25zZS4KKworICAgIEFyZ3M6CisgICAgICByZXF1ZXN0X3BhdGg6IFRoZSBwYXRoIHRvIHNlbmQg
dGhlIHJlcXVlc3QgdG8sIGVnIC9hcGkvYXBwdmVyc2lvbi9jcmVhdGUuCisgICAgICBwYXlsb2Fk
OiBUaGUgYm9keSBvZiB0aGUgcmVxdWVzdCwgb3IgTm9uZSB0byBzZW5kIGFuIGVtcHR5IHJlcXVl
c3QuCisgICAgICBjb250ZW50X3R5cGU6IFRoZSBDb250ZW50LVR5cGUgaGVhZGVyIHRvIHVzZS4K
KyAgICAgIHRpbWVvdXQ6IHRpbWVvdXQgaW4gc2Vjb25kczsgZGVmYXVsdCBOb25lIGkuZS4gbm8g
dGltZW91dC4KKyAgICAgICAgKE5vdGU6IGZvciBsYXJnZSByZXF1ZXN0cyBvbiBPUyBYLCB0aGUg
dGltZW91dCBkb2Vzbid0IHdvcmsgcmlnaHQuKQorICAgICAga3dhcmdzOiBBbnkga2V5d29yZCBh
cmd1bWVudHMgYXJlIGNvbnZlcnRlZCBpbnRvIHF1ZXJ5IHN0cmluZyBwYXJhbWV0ZXJzLgorCisg
ICAgUmV0dXJuczoKKyAgICAgIFRoZSByZXNwb25zZSBib2R5LCBhcyBhIHN0cmluZy4KKyAgICAi
IiIKKyAgICAjIFRPRE86IERvbid0IHJlcXVpcmUgYXV0aGVudGljYXRpb24uICBMZXQgdGhlIHNl
cnZlciBzYXkKKyAgICAjIHdoZXRoZXIgaXQgaXMgbmVjZXNzYXJ5LgorICAgIGlmIG5vdCBzZWxm
LmF1dGhlbnRpY2F0ZWQ6CisgICAgICBzZWxmLl9BdXRoZW50aWNhdGUoKQorCisgICAgb2xkX3Rp
bWVvdXQgPSBzb2NrZXQuZ2V0ZGVmYXVsdHRpbWVvdXQoKQorICAgIHNvY2tldC5zZXRkZWZhdWx0
dGltZW91dCh0aW1lb3V0KQorICAgIHRyeToKKyAgICAgIHRyaWVzID0gMAorICAgICAgd2hpbGUg
VHJ1ZToKKyAgICAgICAgdHJpZXMgKz0gMQorICAgICAgICBhcmdzID0gZGljdChrd2FyZ3MpCisg
ICAgICAgIHVybCA9ICJodHRwOi8vJXMlcyIgJSAoc2VsZi5ob3N0LCByZXF1ZXN0X3BhdGgpCisg
ICAgICAgIGlmIGFyZ3M6CisgICAgICAgICAgdXJsICs9ICI/IiArIHVybGxpYi51cmxlbmNvZGUo
YXJncykKKyAgICAgICAgcmVxID0gc2VsZi5fQ3JlYXRlUmVxdWVzdCh1cmw9dXJsLCBkYXRhPXBh
eWxvYWQpCisgICAgICAgIHJlcS5hZGRfaGVhZGVyKCJDb250ZW50LVR5cGUiLCBjb250ZW50X3R5
cGUpCisgICAgICAgIHRyeToKKyAgICAgICAgICBmID0gc2VsZi5vcGVuZXIub3BlbihyZXEpCisg
ICAgICAgICAgcmVzcG9uc2UgPSBmLnJlYWQoKQorICAgICAgICAgIGYuY2xvc2UoKQorICAgICAg
ICAgIHJldHVybiByZXNwb25zZQorICAgICAgICBleGNlcHQgdXJsbGliMi5IVFRQRXJyb3IsIGU6
CisgICAgICAgICAgaWYgdHJpZXMgPiAzOgorICAgICAgICAgICAgcmFpc2UKKyAgICAgICAgICBl
bGlmIGUuY29kZSA9PSA0MDEgb3IgZS5jb2RlID09IDMwMjoKKyAgICAgICAgICAgIHNlbGYuX0F1
dGhlbnRpY2F0ZSgpCisjIyAgICAgICAgICAgZWxpZiBlLmNvZGUgPj0gNTAwIGFuZCBlLmNvZGUg
PCA2MDA6CisjIyAgICAgICAgICAgICAjIFNlcnZlciBFcnJvciAtIHRyeSBhZ2Fpbi4KKyMjICAg
ICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJhaXNlCisg
ICAgZmluYWxseToKKyAgICAgIHNvY2tldC5zZXRkZWZhdWx0dGltZW91dChvbGRfdGltZW91dCkK
KworCitjbGFzcyBIdHRwUnBjU2VydmVyKEFic3RyYWN0UnBjU2VydmVyKToKKyAgIiIiUHJvdmlk
ZXMgYSBzaW1wbGlmaWVkIFJQQy1zdHlsZSBpbnRlcmZhY2UgZm9yIEhUVFAgcmVxdWVzdHMuIiIi
CisKKyAgZGVmIF9BdXRoZW50aWNhdGUoc2VsZik6CisgICAgIiIiU2F2ZSB0aGUgY29va2llIGph
ciBhZnRlciBhdXRoZW50aWNhdGlvbi4iIiIKKyAgICBzdXBlcihIdHRwUnBjU2VydmVyLCBzZWxm
KS5fQXV0aGVudGljYXRlKCkKKyAgICBpZiBzZWxmLnNhdmVfY29va2llczoKKyAgICAgIFN0YXR1
c1VwZGF0ZSgiU2F2aW5nIGF1dGhlbnRpY2F0aW9uIGNvb2tpZXMgdG8gJXMiICUgc2VsZi5jb29r
aWVfZmlsZSkKKyAgICAgIHNlbGYuY29va2llX2phci5zYXZlKCkKKworICBkZWYgX0dldE9wZW5l
cihzZWxmKToKKyAgICAiIiJSZXR1cm5zIGFuIE9wZW5lckRpcmVjdG9yIHRoYXQgc3VwcG9ydHMg
Y29va2llcyBhbmQgaWdub3JlcyByZWRpcmVjdHMuCisKKyAgICBSZXR1cm5zOgorICAgICAgQSB1
cmxsaWIyLk9wZW5lckRpcmVjdG9yIG9iamVjdC4KKyAgICAiIiIKKyAgICBvcGVuZXIgPSB1cmxs
aWIyLk9wZW5lckRpcmVjdG9yKCkKKyAgICBvcGVuZXIuYWRkX2hhbmRsZXIodXJsbGliMi5Qcm94
eUhhbmRsZXIoKSkKKyAgICBvcGVuZXIuYWRkX2hhbmRsZXIodXJsbGliMi5Vbmtub3duSGFuZGxl
cigpKQorICAgIG9wZW5lci5hZGRfaGFuZGxlcih1cmxsaWIyLkhUVFBIYW5kbGVyKCkpCisgICAg
b3BlbmVyLmFkZF9oYW5kbGVyKHVybGxpYjIuSFRUUERlZmF1bHRFcnJvckhhbmRsZXIoKSkKKyAg
ICBvcGVuZXIuYWRkX2hhbmRsZXIodXJsbGliMi5IVFRQU0hhbmRsZXIoKSkKKyAgICBvcGVuZXIu
YWRkX2hhbmRsZXIodXJsbGliMi5IVFRQRXJyb3JQcm9jZXNzb3IoKSkKKyAgICBpZiBzZWxmLnNh
dmVfY29va2llczoKKyAgICAgIHNlbGYuY29va2llX2ZpbGUgPSBvcy5wYXRoLmV4cGFuZHVzZXIo
In4vLmNvZGVyZXZpZXdfdXBsb2FkX2Nvb2tpZXMiKQorICAgICAgc2VsZi5jb29raWVfamFyID0g
Y29va2llbGliLk1vemlsbGFDb29raWVKYXIoc2VsZi5jb29raWVfZmlsZSkKKyAgICAgIGlmIG9z
LnBhdGguZXhpc3RzKHNlbGYuY29va2llX2ZpbGUpOgorICAgICAgICB0cnk6CisgICAgICAgICAg
c2VsZi5jb29raWVfamFyLmxvYWQoKQorICAgICAgICAgIHNlbGYuYXV0aGVudGljYXRlZCA9IFRy
dWUKKyAgICAgICAgICBTdGF0dXNVcGRhdGUoIkxvYWRlZCBhdXRoZW50aWNhdGlvbiBjb29raWVz
IGZyb20gJXMiICUKKyAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5jb29raWVfZmlsZSkKKyAg
ICAgICAgZXhjZXB0IChjb29raWVsaWIuTG9hZEVycm9yLCBJT0Vycm9yKToKKyAgICAgICAgICAj
IEZhaWxlZCB0byBsb2FkIGNvb2tpZXMgLSBqdXN0IGlnbm9yZSB0aGVtLgorICAgICAgICAgIHBh
c3MKKyAgICAgIGVsc2U6CisgICAgICAgICMgQ3JlYXRlIGFuIGVtcHR5IGNvb2tpZSBmaWxlIHdp
dGggbW9kZSA2MDAKKyAgICAgICAgZmQgPSBvcy5vcGVuKHNlbGYuY29va2llX2ZpbGUsIG9zLk9f
Q1JFQVQsIDA2MDApCisgICAgICAgIG9zLmNsb3NlKGZkKQorICAgICAgIyBBbHdheXMgY2htb2Qg
dGhlIGNvb2tpZSBmaWxlCisgICAgICBvcy5jaG1vZChzZWxmLmNvb2tpZV9maWxlLCAwNjAwKQor
ICAgIGVsc2U6CisgICAgICAjIERvbid0IHNhdmUgY29va2llcyBhY3Jvc3MgcnVucyBvZiB1cGRh
dGUucHkuCisgICAgICBzZWxmLmNvb2tpZV9qYXIgPSBjb29raWVsaWIuQ29va2llSmFyKCkKKyAg
ICBvcGVuZXIuYWRkX2hhbmRsZXIodXJsbGliMi5IVFRQQ29va2llUHJvY2Vzc29yKHNlbGYuY29v
a2llX2phcikpCisgICAgcmV0dXJuIG9wZW5lcgorCisKK3BhcnNlciA9IG9wdHBhcnNlLk9wdGlv
blBhcnNlcih1c2FnZT0iJXByb2cgW29wdGlvbnNdIFstLSBkaWZmX29wdGlvbnNdIikKK3BhcnNl
ci5hZGRfb3B0aW9uKCIteSIsICItLWFzc3VtZV95ZXMiLCBhY3Rpb249InN0b3JlX3RydWUiLAor
ICAgICAgICAgICAgICAgICAgZGVzdD0iYXNzdW1lX3llcyIsIGRlZmF1bHQ9RmFsc2UsCisgICAg
ICAgICAgICAgICAgICBoZWxwPSJBc3N1bWUgdGhhdCB0aGUgYW5zd2VyIHRvIHllcy9ubyBxdWVz
dGlvbnMgaXMgJ3llcycuIikKKyMgTG9nZ2luZworZ3JvdXAgPSBwYXJzZXIuYWRkX29wdGlvbl9n
cm91cCgiTG9nZ2luZyBvcHRpb25zIikKK2dyb3VwLmFkZF9vcHRpb24oIi1xIiwgIi0tcXVpZXQi
LCBhY3Rpb249InN0b3JlX2NvbnN0IiwgY29uc3Q9MCwKKyAgICAgICAgICAgICAgICAgZGVzdD0i
dmVyYm9zZSIsIGhlbHA9IlByaW50IGVycm9ycyBvbmx5LiIpCitncm91cC5hZGRfb3B0aW9uKCIt
diIsICItLXZlcmJvc2UiLCBhY3Rpb249InN0b3JlX2NvbnN0IiwgY29uc3Q9MiwKKyAgICAgICAg
ICAgICAgICAgZGVzdD0idmVyYm9zZSIsIGRlZmF1bHQ9MSwKKyAgICAgICAgICAgICAgICAgaGVs
cD0iUHJpbnQgaW5mbyBsZXZlbCBsb2dzIChkZWZhdWx0KS4iKQorZ3JvdXAuYWRkX29wdGlvbigi
LS1ub2lzeSIsIGFjdGlvbj0ic3RvcmVfY29uc3QiLCBjb25zdD0zLAorICAgICAgICAgICAgICAg
ICBkZXN0PSJ2ZXJib3NlIiwgaGVscD0iUHJpbnQgYWxsIGxvZ3MuIikKKyMgUmV2aWV3IHNlcnZl
cgorZ3JvdXAgPSBwYXJzZXIuYWRkX29wdGlvbl9ncm91cCgiUmV2aWV3IHNlcnZlciBvcHRpb25z
IikKK2dyb3VwLmFkZF9vcHRpb24oIi1zIiwgIi0tc2VydmVyIiwgYWN0aW9uPSJzdG9yZSIsIGRl
c3Q9InNlcnZlciIsCisgICAgICAgICAgICAgICAgIGRlZmF1bHQ9ImNvZGVyZXZpZXcuYXBwc3Bv
dC5jb20iLAorICAgICAgICAgICAgICAgICBtZXRhdmFyPSJTRVJWRVIiLAorICAgICAgICAgICAg
ICAgICBoZWxwPSgiVGhlIHNlcnZlciB0byB1cGxvYWQgdG8uIFRoZSBmb3JtYXQgaXMgaG9zdFs6
cG9ydF0uICIKKyAgICAgICAgICAgICAgICAgICAgICAgIkRlZmF1bHRzIHRvICclZGVmYXVsdCcu
IikpCitncm91cC5hZGRfb3B0aW9uKCItZSIsICItLWVtYWlsIiwgYWN0aW9uPSJzdG9yZSIsIGRl
c3Q9ImVtYWlsIiwKKyAgICAgICAgICAgICAgICAgbWV0YXZhcj0iRU1BSUwiLCBkZWZhdWx0PU5v
bmUsCisgICAgICAgICAgICAgICAgIGhlbHA9IlRoZSB1c2VybmFtZSB0byB1c2UuIFdpbGwgcHJv
bXB0IGlmIG9taXR0ZWQuIikKK2dyb3VwLmFkZF9vcHRpb24oIi1IIiwgIi0taG9zdCIsIGFjdGlv
bj0ic3RvcmUiLCBkZXN0PSJob3N0IiwKKyAgICAgICAgICAgICAgICAgbWV0YXZhcj0iSE9TVCIs
IGRlZmF1bHQ9Tm9uZSwKKyAgICAgICAgICAgICAgICAgaGVscD0iT3ZlcnJpZGVzIHRoZSBIb3N0
IGhlYWRlciBzZW50IHdpdGggYWxsIFJQQ3MuIikKK2dyb3VwLmFkZF9vcHRpb24oIi0tbm9fY29v
a2llcyIsIGFjdGlvbj0ic3RvcmVfZmFsc2UiLAorICAgICAgICAgICAgICAgICBkZXN0PSJzYXZl
X2Nvb2tpZXMiLCBkZWZhdWx0PVRydWUsCisgICAgICAgICAgICAgICAgIGhlbHA9IkRvIG5vdCBz
YXZlIGF1dGhlbnRpY2F0aW9uIGNvb2tpZXMgdG8gbG9jYWwgZGlzay4iKQorIyBJc3N1ZQorZ3Jv
dXAgPSBwYXJzZXIuYWRkX29wdGlvbl9ncm91cCgiSXNzdWUgb3B0aW9ucyIpCitncm91cC5hZGRf
b3B0aW9uKCItZCIsICItLWRlc2NyaXB0aW9uIiwgYWN0aW9uPSJzdG9yZSIsIGRlc3Q9ImRlc2Ny
aXB0aW9uIiwKKyAgICAgICAgICAgICAgICAgbWV0YXZhcj0iREVTQ1JJUFRJT04iLCBkZWZhdWx0
PU5vbmUsCisgICAgICAgICAgICAgICAgIGhlbHA9Ik9wdGlvbmFsIGRlc2NyaXB0aW9uIHdoZW4g
Y3JlYXRpbmcgYW4gaXNzdWUuIikKK2dyb3VwLmFkZF9vcHRpb24oIi1mIiwgIi0tZGVzY3JpcHRp
b25fZmlsZSIsIGFjdGlvbj0ic3RvcmUiLAorICAgICAgICAgICAgICAgICBkZXN0PSJkZXNjcmlw
dGlvbl9maWxlIiwgbWV0YXZhcj0iREVTQ1JJUFRJT05fRklMRSIsCisgICAgICAgICAgICAgICAg
IGRlZmF1bHQ9Tm9uZSwKKyAgICAgICAgICAgICAgICAgaGVscD0iT3B0aW9uYWwgcGF0aCBvZiBh
IGZpbGUgdGhhdCBjb250YWlucyAiCisgICAgICAgICAgICAgICAgICAgICAgInRoZSBkZXNjcmlw
dGlvbiB3aGVuIGNyZWF0aW5nIGFuIGlzc3VlLiIpCitncm91cC5hZGRfb3B0aW9uKCItciIsICIt
LXJldmlld2VycyIsIGFjdGlvbj0ic3RvcmUiLCBkZXN0PSJyZXZpZXdlcnMiLAorICAgICAgICAg
ICAgICAgICBtZXRhdmFyPSJSRVZJRVdFUlMiLCBkZWZhdWx0PU5vbmUsCisgICAgICAgICAgICAg
ICAgIGhlbHA9IkFkZCByZXZpZXdlcnMgKGNvbW1hIHNlcGFyYXRlZCBlbWFpbCBhZGRyZXNzZXMp
LiIpCitncm91cC5hZGRfb3B0aW9uKCItLWNjIiwgYWN0aW9uPSJzdG9yZSIsIGRlc3Q9ImNjIiwK
KyAgICAgICAgICAgICAgICAgbWV0YXZhcj0iQ0MiLCBkZWZhdWx0PU5vbmUsCisgICAgICAgICAg
ICAgICAgIGhlbHA9IkFkZCBDQyAoY29tbWEgc2VwYXJhdGVkIGVtYWlsIGFkZHJlc3NlcykuIikK
K2dyb3VwLmFkZF9vcHRpb24oIi0tcHJpdmF0ZSIsIGFjdGlvbj0ic3RvcmVfdHJ1ZSIsIGRlc3Q9
InByaXZhdGUiLAorICAgICAgICAgICAgICAgICBkZWZhdWx0PUZhbHNlLAorICAgICAgICAgICAg
ICAgICBoZWxwPSJNYWtlIHRoZSBpc3N1ZSByZXN0cmljdGVkIHRvIHJldmlld2VycyBhbmQgdGhv
c2UgQ0NlZCIpCisjIFVwbG9hZCBvcHRpb25zCitncm91cCA9IHBhcnNlci5hZGRfb3B0aW9uX2dy
b3VwKCJQYXRjaCBvcHRpb25zIikKK2dyb3VwLmFkZF9vcHRpb24oIi1tIiwgIi0tbWVzc2FnZSIs
IGFjdGlvbj0ic3RvcmUiLCBkZXN0PSJtZXNzYWdlIiwKKyAgICAgICAgICAgICAgICAgbWV0YXZh
cj0iTUVTU0FHRSIsIGRlZmF1bHQ9Tm9uZSwKKyAgICAgICAgICAgICAgICAgaGVscD0iQSBtZXNz
YWdlIHRvIGlkZW50aWZ5IHRoZSBwYXRjaC4gIgorICAgICAgICAgICAgICAgICAgICAgICJXaWxs
IHByb21wdCBpZiBvbWl0dGVkLiIpCitncm91cC5hZGRfb3B0aW9uKCItaSIsICItLWlzc3VlIiwg
dHlwZT0iaW50IiwgYWN0aW9uPSJzdG9yZSIsCisgICAgICAgICAgICAgICAgIG1ldGF2YXI9IklT
U1VFIiwgZGVmYXVsdD1Ob25lLAorICAgICAgICAgICAgICAgICBoZWxwPSJJc3N1ZSBudW1iZXIg
dG8gd2hpY2ggdG8gYWRkLiBEZWZhdWx0cyB0byBuZXcgaXNzdWUuIikKK2dyb3VwLmFkZF9vcHRp
b24oIi0tYmFzZV91cmwiLCBhY3Rpb249InN0b3JlIiwgZGVzdD0iYmFzZV91cmwiLCBkZWZhdWx0
PU5vbmUsCisgICAgICAgICAgICAgICAgIGhlbHA9IkJhc2UgcmVwb3NpdG9yeSBVUkwgKGxpc3Rl
ZCBhcyBcIkJhc2UgVVJMXCIgd2hlbiAiCisgICAgICAgICAgICAgICAgICJ2aWV3aW5nIGlzc3Vl
KS4gIElmIG9taXR0ZWQsIHdpbGwgYmUgZ3Vlc3NlZCBhdXRvbWF0aWNhbGx5ICIKKyAgICAgICAg
ICAgICAgICAgImZvciBTVk4gcmVwb3MgYW5kIGxlZnQgYmxhbmsgZm9yIG90aGVycy4iKQorZ3Jv
dXAuYWRkX29wdGlvbigiLS1kb3dubG9hZF9iYXNlIiwgYWN0aW9uPSJzdG9yZV90cnVlIiwKKyAg
ICAgICAgICAgICAgICAgZGVzdD0iZG93bmxvYWRfYmFzZSIsIGRlZmF1bHQ9RmFsc2UsCisgICAg
ICAgICAgICAgICAgIGhlbHA9IkJhc2UgZmlsZXMgd2lsbCBiZSBkb3dubG9hZGVkIGJ5IHRoZSBz
ZXJ2ZXIgIgorICAgICAgICAgICAgICAgICAiKHNpZGUtYnktc2lkZSBkaWZmcyBtYXkgbm90IHdv
cmsgb24gZmlsZXMgd2l0aCBDUnMpLiIpCitncm91cC5hZGRfb3B0aW9uKCItLXJldiIsIGFjdGlv
bj0ic3RvcmUiLCBkZXN0PSJyZXZpc2lvbiIsCisgICAgICAgICAgICAgICAgIG1ldGF2YXI9IlJF
ViIsIGRlZmF1bHQ9Tm9uZSwKKyAgICAgICAgICAgICAgICAgaGVscD0iQmFzZSByZXZpc2lvbi9i
cmFuY2gvdHJlZSB0byBkaWZmIGFnYWluc3QuIFVzZSAiCisgICAgICAgICAgICAgICAgICAgICAg
InJldjE6cmV2MiByYW5nZSB0byByZXZpZXcgYWxyZWFkeSBjb21taXR0ZWQgY2hhbmdlc2V0LiIp
Citncm91cC5hZGRfb3B0aW9uKCItLXNlbmRfbWFpbCIsIGFjdGlvbj0ic3RvcmVfdHJ1ZSIsCisg
ICAgICAgICAgICAgICAgIGRlc3Q9InNlbmRfbWFpbCIsIGRlZmF1bHQ9RmFsc2UsCisgICAgICAg
ICAgICAgICAgIGhlbHA9IlNlbmQgbm90aWZpY2F0aW9uIGVtYWlsIHRvIHJldmlld2Vycy4iKQor
Z3JvdXAuYWRkX29wdGlvbigiLS12Y3MiLCBhY3Rpb249InN0b3JlIiwgZGVzdD0idmNzIiwKKyAg
ICAgICAgICAgICAgICAgbWV0YXZhcj0iVkNTIiwgZGVmYXVsdD1Ob25lLAorICAgICAgICAgICAg
ICAgICBoZWxwPSgiVmVyc2lvbiBjb250cm9sIHN5c3RlbSAob3B0aW9uYWwsIHVzdWFsbHkgdXBs
b2FkLnB5ICIKKyAgICAgICAgICAgICAgICAgICAgICAgImFscmVhZHkgZ3Vlc3NlcyB0aGUgcmln
aHQgVkNTKS4iKSkKK2dyb3VwLmFkZF9vcHRpb24oIi0tZW11bGF0ZV9zdm5fYXV0b19wcm9wcyIs
IGFjdGlvbj0ic3RvcmVfdHJ1ZSIsCisgICAgICAgICAgICAgICAgIGRlc3Q9ImVtdWxhdGVfc3Zu
X2F1dG9fcHJvcHMiLCBkZWZhdWx0PUZhbHNlLAorICAgICAgICAgICAgICAgICBoZWxwPSgiRW11
bGF0ZSBTdWJ2ZXJzaW9uJ3MgYXV0byBwcm9wZXJ0aWVzIGZlYXR1cmUuIikpCisKKworZGVmIEdl
dFJwY1NlcnZlcihvcHRpb25zKToKKyAgIiIiUmV0dXJucyBhbiBpbnN0YW5jZSBvZiBhbiBBYnN0
cmFjdFJwY1NlcnZlci4KKworICBSZXR1cm5zOgorICAgIEEgbmV3IEFic3RyYWN0UnBjU2VydmVy
LCBvbiB3aGljaCBSUEMgY2FsbHMgY2FuIGJlIG1hZGUuCisgICIiIgorCisgIHJwY19zZXJ2ZXJf
Y2xhc3MgPSBIdHRwUnBjU2VydmVyCisKKyAgZGVmIEdldFVzZXJDcmVkZW50aWFscygpOgorICAg
ICIiIlByb21wdHMgdGhlIHVzZXIgZm9yIGEgdXNlcm5hbWUgYW5kIHBhc3N3b3JkLiIiIgorICAg
IGVtYWlsID0gb3B0aW9ucy5lbWFpbAorICAgIGlmIGVtYWlsIGlzIE5vbmU6CisgICAgICBlbWFp
bCA9IEdldEVtYWlsKCJFbWFpbCAobG9naW4gZm9yIHVwbG9hZGluZyB0byAlcykiICUgb3B0aW9u
cy5zZXJ2ZXIpCisgICAgcGFzc3dvcmQgPSBnZXRwYXNzLmdldHBhc3MoIlBhc3N3b3JkIGZvciAl
czogIiAlIGVtYWlsKQorICAgIHJldHVybiAoZW1haWwsIHBhc3N3b3JkKQorCisgICMgSWYgdGhp
cyBpcyB0aGUgZGV2X2FwcHNlcnZlciwgdXNlIGZha2UgYXV0aGVudGljYXRpb24uCisgIGhvc3Qg
PSAob3B0aW9ucy5ob3N0IG9yIG9wdGlvbnMuc2VydmVyKS5sb3dlcigpCisgIGlmIGhvc3QgPT0g
ImxvY2FsaG9zdCIgb3IgaG9zdC5zdGFydHN3aXRoKCJsb2NhbGhvc3Q6Iik6CisgICAgZW1haWwg
PSBvcHRpb25zLmVtYWlsCisgICAgaWYgZW1haWwgaXMgTm9uZToKKyAgICAgIGVtYWlsID0gInRl
c3RAZXhhbXBsZS5jb20iCisgICAgICBsb2dnaW5nLmluZm8oIlVzaW5nIGRlYnVnIHVzZXIgJXMu
ICBPdmVycmlkZSB3aXRoIC0tZW1haWwiICUgZW1haWwpCisgICAgc2VydmVyID0gcnBjX3NlcnZl
cl9jbGFzcygKKyAgICAgICAgb3B0aW9ucy5zZXJ2ZXIsCisgICAgICAgIGxhbWJkYTogKGVtYWls
LCAicGFzc3dvcmQiKSwKKyAgICAgICAgaG9zdF9vdmVycmlkZT1vcHRpb25zLmhvc3QsCisgICAg
ICAgIGV4dHJhX2hlYWRlcnM9eyJDb29raWUiOgorICAgICAgICAgICAgICAgICAgICAgICAnZGV2
X2FwcHNlcnZlcl9sb2dpbj0iJXM6RmFsc2UiJyAlIGVtYWlsfSwKKyAgICAgICAgc2F2ZV9jb29r
aWVzPW9wdGlvbnMuc2F2ZV9jb29raWVzKQorICAgICMgRG9uJ3QgdHJ5IHRvIHRhbGsgdG8gQ2xp
ZW50TG9naW4uCisgICAgc2VydmVyLmF1dGhlbnRpY2F0ZWQgPSBUcnVlCisgICAgcmV0dXJuIHNl
cnZlcgorCisgIHJldHVybiBycGNfc2VydmVyX2NsYXNzKG9wdGlvbnMuc2VydmVyLCBHZXRVc2Vy
Q3JlZGVudGlhbHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGhvc3Rfb3ZlcnJpZGU9b3B0
aW9ucy5ob3N0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBzYXZlX2Nvb2tpZXM9b3B0aW9u
cy5zYXZlX2Nvb2tpZXMpCisKKworZGVmIEVuY29kZU11bHRpcGFydEZvcm1EYXRhKGZpZWxkcywg
ZmlsZXMpOgorICAiIiJFbmNvZGUgZm9ybSBmaWVsZHMgZm9yIG11bHRpcGFydC9mb3JtLWRhdGEu
CisKKyAgQXJnczoKKyAgICBmaWVsZHM6IEEgc2VxdWVuY2Ugb2YgKG5hbWUsIHZhbHVlKSBlbGVt
ZW50cyBmb3IgcmVndWxhciBmb3JtIGZpZWxkcy4KKyAgICBmaWxlczogQSBzZXF1ZW5jZSBvZiAo
bmFtZSwgZmlsZW5hbWUsIHZhbHVlKSBlbGVtZW50cyBmb3IgZGF0YSB0byBiZQorICAgICAgICAg
ICB1cGxvYWRlZCBhcyBmaWxlcy4KKyAgUmV0dXJuczoKKyAgICAoY29udGVudF90eXBlLCBib2R5
KSByZWFkeSBmb3IgaHR0cGxpYi5IVFRQIGluc3RhbmNlLgorCisgIFNvdXJjZToKKyAgICBodHRw
Oi8vYXNwbi5hY3RpdmVzdGF0ZS5jb20vQVNQTi9Db29rYm9vay9QeXRob24vUmVjaXBlLzE0NjMw
NgorICAiIiIKKyAgQk9VTkRBUlkgPSAnLU0tQS1HLUktQy0tLUItTy1VLU4tRC1BLVItWS0nCisg
IENSTEYgPSAnXHJcbicKKyAgbGluZXMgPSBbXQorICBmb3IgKGtleSwgdmFsdWUpIGluIGZpZWxk
czoKKyAgICBsaW5lcy5hcHBlbmQoJy0tJyArIEJPVU5EQVJZKQorICAgIGxpbmVzLmFwcGVuZCgn
Q29udGVudC1EaXNwb3NpdGlvbjogZm9ybS1kYXRhOyBuYW1lPSIlcyInICUga2V5KQorICAgIGxp
bmVzLmFwcGVuZCgnJykKKyAgICBsaW5lcy5hcHBlbmQodmFsdWUpCisgIGZvciAoa2V5LCBmaWxl
bmFtZSwgdmFsdWUpIGluIGZpbGVzOgorICAgIGxpbmVzLmFwcGVuZCgnLS0nICsgQk9VTkRBUlkp
CisgICAgbGluZXMuYXBwZW5kKCdDb250ZW50LURpc3Bvc2l0aW9uOiBmb3JtLWRhdGE7IG5hbWU9
IiVzIjsgZmlsZW5hbWU9IiVzIicgJQorICAgICAgICAgICAgIChrZXksIGZpbGVuYW1lKSkKKyAg
ICBsaW5lcy5hcHBlbmQoJ0NvbnRlbnQtVHlwZTogJXMnICUgR2V0Q29udGVudFR5cGUoZmlsZW5h
bWUpKQorICAgIGxpbmVzLmFwcGVuZCgnJykKKyAgICBsaW5lcy5hcHBlbmQodmFsdWUpCisgIGxp
bmVzLmFwcGVuZCgnLS0nICsgQk9VTkRBUlkgKyAnLS0nKQorICBsaW5lcy5hcHBlbmQoJycpCisg
IGJvZHkgPSBDUkxGLmpvaW4obGluZXMpCisgIGNvbnRlbnRfdHlwZSA9ICdtdWx0aXBhcnQvZm9y
bS1kYXRhOyBib3VuZGFyeT0lcycgJSBCT1VOREFSWQorICByZXR1cm4gY29udGVudF90eXBlLCBi
b2R5CisKKworZGVmIEdldENvbnRlbnRUeXBlKGZpbGVuYW1lKToKKyAgIiIiSGVscGVyIHRvIGd1
ZXNzIHRoZSBjb250ZW50LXR5cGUgZnJvbSB0aGUgZmlsZW5hbWUuIiIiCisgIHJldHVybiBtaW1l
dHlwZXMuZ3Vlc3NfdHlwZShmaWxlbmFtZSlbMF0gb3IgJ2FwcGxpY2F0aW9uL29jdGV0LXN0cmVh
bScKKworCisjIFVzZSBhIHNoZWxsIGZvciBzdWJjb21tYW5kcyBvbiBXaW5kb3dzIHRvIGdldCBh
IFBBVEggc2VhcmNoLgordXNlX3NoZWxsID0gc3lzLnBsYXRmb3JtLnN0YXJ0c3dpdGgoIndpbiIp
CisKK2RlZiBSdW5TaGVsbFdpdGhSZXR1cm5Db2RlKGNvbW1hbmQsIHByaW50X291dHB1dD1GYWxz
ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuaXZlcnNhbF9uZXdsaW5lcz1UcnVlLAor
ICAgICAgICAgICAgICAgICAgICAgICAgICAgZW52PW9zLmVudmlyb24pOgorICAiIiJFeGVjdXRl
cyBhIGNvbW1hbmQgYW5kIHJldHVybnMgdGhlIG91dHB1dCBmcm9tIHN0ZG91dCBhbmQgdGhlIHJl
dHVybiBjb2RlLgorCisgIEFyZ3M6CisgICAgY29tbWFuZDogQ29tbWFuZCB0byBleGVjdXRlLgor
ICAgIHByaW50X291dHB1dDogSWYgVHJ1ZSwgdGhlIG91dHB1dCBpcyBwcmludGVkIHRvIHN0ZG91
dC4KKyAgICAgICAgICAgICAgICAgIElmIEZhbHNlLCBib3RoIHN0ZG91dCBhbmQgc3RkZXJyIGFy
ZSBpZ25vcmVkLgorICAgIHVuaXZlcnNhbF9uZXdsaW5lczogVXNlIHVuaXZlcnNhbF9uZXdsaW5l
cyBmbGFnIChkZWZhdWx0OiBUcnVlKS4KKworICBSZXR1cm5zOgorICAgIFR1cGxlIChvdXRwdXQs
IHJldHVybiBjb2RlKQorICAiIiIKKyAgbG9nZ2luZy5pbmZvKCJSdW5uaW5nICVzIiwgY29tbWFu
ZCkKKyAgcCA9IHN1YnByb2Nlc3MuUG9wZW4oY29tbWFuZCwgc3Rkb3V0PXN1YnByb2Nlc3MuUElQ
RSwgc3RkZXJyPXN1YnByb2Nlc3MuUElQRSwKKyAgICAgICAgICAgICAgICAgICAgICAgc2hlbGw9
dXNlX3NoZWxsLCB1bml2ZXJzYWxfbmV3bGluZXM9dW5pdmVyc2FsX25ld2xpbmVzLAorICAgICAg
ICAgICAgICAgICAgICAgICBlbnY9ZW52KQorICBpZiBwcmludF9vdXRwdXQ6CisgICAgb3V0cHV0
X2FycmF5ID0gW10KKyAgICB3aGlsZSBUcnVlOgorICAgICAgbGluZSA9IHAuc3Rkb3V0LnJlYWRs
aW5lKCkKKyAgICAgIGlmIG5vdCBsaW5lOgorICAgICAgICBicmVhaworICAgICAgcHJpbnQgbGlu
ZS5zdHJpcCgiXG4iKQorICAgICAgb3V0cHV0X2FycmF5LmFwcGVuZChsaW5lKQorICAgIG91dHB1
dCA9ICIiLmpvaW4ob3V0cHV0X2FycmF5KQorICBlbHNlOgorICAgIG91dHB1dCA9IHAuc3Rkb3V0
LnJlYWQoKQorICBwLndhaXQoKQorICBlcnJvdXQgPSBwLnN0ZGVyci5yZWFkKCkKKyAgaWYgcHJp
bnRfb3V0cHV0IGFuZCBlcnJvdXQ6CisgICAgcHJpbnQgPj5zeXMuc3RkZXJyLCBlcnJvdXQKKyAg
cC5zdGRvdXQuY2xvc2UoKQorICBwLnN0ZGVyci5jbG9zZSgpCisgIHJldHVybiBvdXRwdXQsIHAu
cmV0dXJuY29kZQorCisKK2RlZiBSdW5TaGVsbChjb21tYW5kLCBzaWxlbnRfb2s9RmFsc2UsIHVu
aXZlcnNhbF9uZXdsaW5lcz1UcnVlLAorICAgICAgICAgICAgIHByaW50X291dHB1dD1GYWxzZSwg
ZW52PW9zLmVudmlyb24pOgorICBkYXRhLCByZXRjb2RlID0gUnVuU2hlbGxXaXRoUmV0dXJuQ29k
ZShjb21tYW5kLCBwcmludF9vdXRwdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgIHVuaXZlcnNhbF9uZXdsaW5lcywgZW52KQorICBpZiByZXRjb2RlOgorICAgIEVy
cm9yRXhpdCgiR290IGVycm9yIHN0YXR1cyBmcm9tICVzOlxuJXMiICUgKGNvbW1hbmQsIGRhdGEp
KQorICBpZiBub3Qgc2lsZW50X29rIGFuZCBub3QgZGF0YToKKyAgICBFcnJvckV4aXQoIk5vIG91
dHB1dCBmcm9tICVzIiAlIGNvbW1hbmQpCisgIHJldHVybiBkYXRhCisKKworY2xhc3MgVmVyc2lv
bkNvbnRyb2xTeXN0ZW0ob2JqZWN0KToKKyAgIiIiQWJzdHJhY3QgYmFzZSBjbGFzcyBwcm92aWRp
bmcgYW4gaW50ZXJmYWNlIHRvIHRoZSBWQ1MuIiIiCisKKyAgZGVmIF9faW5pdF9fKHNlbGYsIG9w
dGlvbnMpOgorICAgICIiIkNvbnN0cnVjdG9yLgorCisgICAgQXJnczoKKyAgICAgIG9wdGlvbnM6
IENvbW1hbmQgbGluZSBvcHRpb25zLgorICAgICIiIgorICAgIHNlbGYub3B0aW9ucyA9IG9wdGlv
bnMKKworICBkZWYgR2VuZXJhdGVEaWZmKHNlbGYsIGFyZ3MpOgorICAgICIiIlJldHVybiB0aGUg
Y3VycmVudCBkaWZmIGFzIGEgc3RyaW5nLgorCisgICAgQXJnczoKKyAgICAgIGFyZ3M6IEV4dHJh
IGFyZ3VtZW50cyB0byBwYXNzIHRvIHRoZSBkaWZmIGNvbW1hbmQuCisgICAgIiIiCisgICAgcmFp
c2UgTm90SW1wbGVtZW50ZWRFcnJvcigKKyAgICAgICAgImFic3RyYWN0IG1ldGhvZCAtLSBzdWJj
bGFzcyAlcyBtdXN0IG92ZXJyaWRlIiAlIHNlbGYuX19jbGFzc19fKQorCisgIGRlZiBHZXRVbmtu
b3duRmlsZXMoc2VsZik6CisgICAgIiIiUmV0dXJuIGEgbGlzdCBvZiBmaWxlcyB1bmtub3duIHRv
IHRoZSBWQ1MuIiIiCisgICAgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcigKKyAgICAgICAgImFi
c3RyYWN0IG1ldGhvZCAtLSBzdWJjbGFzcyAlcyBtdXN0IG92ZXJyaWRlIiAlIHNlbGYuX19jbGFz
c19fKQorCisgIGRlZiBDaGVja0ZvclVua25vd25GaWxlcyhzZWxmKToKKyAgICAiIiJTaG93IGFu
ICJhcmUgeW91IHN1cmU/IiBwcm9tcHQgaWYgdGhlcmUgYXJlIHVua25vd24gZmlsZXMuIiIiCisg
ICAgdW5rbm93bl9maWxlcyA9IHNlbGYuR2V0VW5rbm93bkZpbGVzKCkKKyAgICBpZiB1bmtub3du
X2ZpbGVzOgorICAgICAgcHJpbnQgIlRoZSBmb2xsb3dpbmcgZmlsZXMgYXJlIG5vdCBhZGRlZCB0
byB2ZXJzaW9uIGNvbnRyb2w6IgorICAgICAgZm9yIGxpbmUgaW4gdW5rbm93bl9maWxlczoKKyAg
ICAgICAgcHJpbnQgbGluZQorICAgICAgcHJvbXB0ID0gIkFyZSB5b3Ugc3VyZSB0byBjb250aW51
ZT8oeS9OKSAiCisgICAgICBhbnN3ZXIgPSByYXdfaW5wdXQocHJvbXB0KS5zdHJpcCgpCisgICAg
ICBpZiBhbnN3ZXIgIT0gInkiOgorICAgICAgICBFcnJvckV4aXQoIlVzZXIgYWJvcnRlZCIpCisK
KyAgZGVmIEdldEJhc2VGaWxlKHNlbGYsIGZpbGVuYW1lKToKKyAgICAiIiJHZXQgdGhlIGNvbnRl
bnQgb2YgdGhlIHVwc3RyZWFtIHZlcnNpb24gb2YgYSBmaWxlLgorCisgICAgUmV0dXJuczoKKyAg
ICAgIEEgdHVwbGUgKGJhc2VfY29udGVudCwgbmV3X2NvbnRlbnQsIGlzX2JpbmFyeSwgc3RhdHVz
KQorICAgICAgICBiYXNlX2NvbnRlbnQ6IFRoZSBjb250ZW50cyBvZiB0aGUgYmFzZSBmaWxlLgor
ICAgICAgICBuZXdfY29udGVudDogRm9yIHRleHQgZmlsZXMsIHRoaXMgaXMgZW1wdHkuICBGb3Ig
YmluYXJ5IGZpbGVzLCB0aGlzIGlzCisgICAgICAgICAgdGhlIGNvbnRlbnRzIG9mIHRoZSBuZXcg
ZmlsZSwgc2luY2UgdGhlIGRpZmYgb3V0cHV0IHdvbid0IGNvbnRhaW4KKyAgICAgICAgICBpbmZv
cm1hdGlvbiB0byByZWNvbnN0cnVjdCB0aGUgY3VycmVudCBmaWxlLgorICAgICAgICBpc19iaW5h
cnk6IFRydWUgaWZmIHRoZSBmaWxlIGlzIGJpbmFyeS4KKyAgICAgICAgc3RhdHVzOiBUaGUgc3Rh
dHVzIG9mIHRoZSBmaWxlLgorICAgICIiIgorCisgICAgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJv
cigKKyAgICAgICAgImFic3RyYWN0IG1ldGhvZCAtLSBzdWJjbGFzcyAlcyBtdXN0IG92ZXJyaWRl
IiAlIHNlbGYuX19jbGFzc19fKQorCisKKyAgZGVmIEdldEJhc2VGaWxlcyhzZWxmLCBkaWZmKToK
KyAgICAiIiJIZWxwZXIgdGhhdCBjYWxscyBHZXRCYXNlIGZpbGUgZm9yIGVhY2ggZmlsZSBpbiB0
aGUgcGF0Y2guCisKKyAgICBSZXR1cm5zOgorICAgICAgQSBkaWN0aW9uYXJ5IHRoYXQgbWFwcyBm
cm9tIGZpbGVuYW1lIHRvIEdldEJhc2VGaWxlJ3MgdHVwbGUuICBGaWxlbmFtZXMKKyAgICAgIGFy
ZSByZXRyaWV2ZWQgYmFzZWQgb24gbGluZXMgdGhhdCBzdGFydCB3aXRoICJJbmRleDoiIG9yCisg
ICAgICAiUHJvcGVydHkgY2hhbmdlcyBvbjoiLgorICAgICIiIgorICAgIGZpbGVzID0ge30KKyAg
ICBmb3IgbGluZSBpbiBkaWZmLnNwbGl0bGluZXMoVHJ1ZSk6CisgICAgICBpZiBsaW5lLnN0YXJ0
c3dpdGgoJ0luZGV4OicpIG9yIGxpbmUuc3RhcnRzd2l0aCgnUHJvcGVydHkgY2hhbmdlcyBvbjon
KToKKyAgICAgICAgdW51c2VkLCBmaWxlbmFtZSA9IGxpbmUuc3BsaXQoJzonLCAxKQorICAgICAg
ICAjIE9uIFdpbmRvd3MgaWYgYSBmaWxlIGhhcyBwcm9wZXJ0eSBjaGFuZ2VzIGl0cyBmaWxlbmFt
ZSB1c2VzICdcJworICAgICAgICAjIGluc3RlYWQgb2YgJy8nLgorICAgICAgICBmaWxlbmFtZSA9
IGZpbGVuYW1lLnN0cmlwKCkucmVwbGFjZSgnXFwnLCAnLycpCisgICAgICAgIGZpbGVzW2ZpbGVu
YW1lXSA9IHNlbGYuR2V0QmFzZUZpbGUoZmlsZW5hbWUpCisgICAgcmV0dXJuIGZpbGVzCisKKwor
ICBkZWYgVXBsb2FkQmFzZUZpbGVzKHNlbGYsIGlzc3VlLCBycGNfc2VydmVyLCBwYXRjaF9saXN0
LCBwYXRjaHNldCwgb3B0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgICBmaWxlcyk6CisgICAg
IiIiVXBsb2FkcyB0aGUgYmFzZSBmaWxlcyAoYW5kIGlmIG5lY2Vzc2FyeSwgdGhlIGN1cnJlbnQg
b25lcyBhcyB3ZWxsKS4iIiIKKworICAgIGRlZiBVcGxvYWRGaWxlKGZpbGVuYW1lLCBmaWxlX2lk
LCBjb250ZW50LCBpc19iaW5hcnksIHN0YXR1cywgaXNfYmFzZSk6CisgICAgICAiIiJVcGxvYWRz
IGEgZmlsZSB0byB0aGUgc2VydmVyLiIiIgorICAgICAgZmlsZV90b29fbGFyZ2UgPSBGYWxzZQor
ICAgICAgaWYgaXNfYmFzZToKKyAgICAgICAgdHlwZSA9ICJiYXNlIgorICAgICAgZWxzZToKKyAg
ICAgICAgdHlwZSA9ICJjdXJyZW50IgorICAgICAgaWYgbGVuKGNvbnRlbnQpID4gTUFYX1VQTE9B
RF9TSVpFOgorICAgICAgICBwcmludCAoIk5vdCB1cGxvYWRpbmcgdGhlICVzIGZpbGUgZm9yICVz
IGJlY2F1c2UgaXQncyB0b28gbGFyZ2UuIiAlCisgICAgICAgICAgICAgICAodHlwZSwgZmlsZW5h
bWUpKQorICAgICAgICBmaWxlX3Rvb19sYXJnZSA9IFRydWUKKyAgICAgICAgY29udGVudCA9ICIi
CisgICAgICBjaGVja3N1bSA9IG1kNShjb250ZW50KS5oZXhkaWdlc3QoKQorICAgICAgaWYgb3B0
aW9ucy52ZXJib3NlID4gMCBhbmQgbm90IGZpbGVfdG9vX2xhcmdlOgorICAgICAgICBwcmludCAi
VXBsb2FkaW5nICVzIGZpbGUgZm9yICVzIiAlICh0eXBlLCBmaWxlbmFtZSkKKyAgICAgIHVybCA9
ICIvJWQvdXBsb2FkX2NvbnRlbnQvJWQvJWQiICUgKGludChpc3N1ZSksIGludChwYXRjaHNldCks
IGZpbGVfaWQpCisgICAgICBmb3JtX2ZpZWxkcyA9IFsoImZpbGVuYW1lIiwgZmlsZW5hbWUpLAor
ICAgICAgICAgICAgICAgICAgICAgKCJzdGF0dXMiLCBzdGF0dXMpLAorICAgICAgICAgICAgICAg
ICAgICAgKCJjaGVja3N1bSIsIGNoZWNrc3VtKSwKKyAgICAgICAgICAgICAgICAgICAgICgiaXNf
YmluYXJ5Iiwgc3RyKGlzX2JpbmFyeSkpLAorICAgICAgICAgICAgICAgICAgICAgKCJpc19jdXJy
ZW50Iiwgc3RyKG5vdCBpc19iYXNlKSksCisgICAgICAgICAgICAgICAgICAgIF0KKyAgICAgIGlm
IGZpbGVfdG9vX2xhcmdlOgorICAgICAgICBmb3JtX2ZpZWxkcy5hcHBlbmQoKCJmaWxlX3Rvb19s
YXJnZSIsICIxIikpCisgICAgICBpZiBvcHRpb25zLmVtYWlsOgorICAgICAgICBmb3JtX2ZpZWxk
cy5hcHBlbmQoKCJ1c2VyIiwgb3B0aW9ucy5lbWFpbCkpCisgICAgICBjdHlwZSwgYm9keSA9IEVu
Y29kZU11bHRpcGFydEZvcm1EYXRhKGZvcm1fZmllbGRzLAorICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICBbKCJkYXRhIiwgZmlsZW5hbWUsIGNvbnRlbnQpXSkKKyAg
ICAgIHJlc3BvbnNlX2JvZHkgPSBycGNfc2VydmVyLlNlbmQodXJsLCBib2R5LAorICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZW50X3R5cGU9Y3R5cGUpCisgICAgICBp
ZiBub3QgcmVzcG9uc2VfYm9keS5zdGFydHN3aXRoKCJPSyIpOgorICAgICAgICBTdGF0dXNVcGRh
dGUoIiAgLS0+ICVzIiAlIHJlc3BvbnNlX2JvZHkpCisgICAgICAgIHN5cy5leGl0KDEpCisKKyAg
ICBwYXRjaGVzID0gZGljdCgpCisgICAgW3BhdGNoZXMuc2V0ZGVmYXVsdCh2LCBrKSBmb3Igaywg
diBpbiBwYXRjaF9saXN0XQorICAgIGZvciBmaWxlbmFtZSBpbiBwYXRjaGVzLmtleXMoKToKKyAg
ICAgIGJhc2VfY29udGVudCwgbmV3X2NvbnRlbnQsIGlzX2JpbmFyeSwgc3RhdHVzID0gZmlsZXNb
ZmlsZW5hbWVdCisgICAgICBmaWxlX2lkX3N0ciA9IHBhdGNoZXMuZ2V0KGZpbGVuYW1lKQorICAg
ICAgaWYgZmlsZV9pZF9zdHIuZmluZCgibm9iYXNlIikgIT0gLTE6CisgICAgICAgIGJhc2VfY29u
dGVudCA9IE5vbmUKKyAgICAgICAgZmlsZV9pZF9zdHIgPSBmaWxlX2lkX3N0cltmaWxlX2lkX3N0
ci5yZmluZCgiXyIpICsgMTpdCisgICAgICBmaWxlX2lkID0gaW50KGZpbGVfaWRfc3RyKQorICAg
ICAgaWYgYmFzZV9jb250ZW50ICE9IE5vbmU6CisgICAgICAgIFVwbG9hZEZpbGUoZmlsZW5hbWUs
IGZpbGVfaWQsIGJhc2VfY29udGVudCwgaXNfYmluYXJ5LCBzdGF0dXMsIFRydWUpCisgICAgICBp
ZiBuZXdfY29udGVudCAhPSBOb25lOgorICAgICAgICBVcGxvYWRGaWxlKGZpbGVuYW1lLCBmaWxl
X2lkLCBuZXdfY29udGVudCwgaXNfYmluYXJ5LCBzdGF0dXMsIEZhbHNlKQorCisgIGRlZiBJc0lt
YWdlKHNlbGYsIGZpbGVuYW1lKToKKyAgICAiIiJSZXR1cm5zIHRydWUgaWYgdGhlIGZpbGVuYW1l
IGhhcyBhbiBpbWFnZSBleHRlbnNpb24uIiIiCisgICAgbWltZXR5cGUgPSAgbWltZXR5cGVzLmd1
ZXNzX3R5cGUoZmlsZW5hbWUpWzBdCisgICAgaWYgbm90IG1pbWV0eXBlOgorICAgICAgcmV0dXJu
IEZhbHNlCisgICAgcmV0dXJuIG1pbWV0eXBlLnN0YXJ0c3dpdGgoImltYWdlLyIpCisKKyAgZGVm
IElzQmluYXJ5KHNlbGYsIGZpbGVuYW1lKToKKyAgICAiIiJSZXR1cm5zIHRydWUgaWYgdGhlIGd1
ZXNzZWQgbWltZXR5cGVkIGlzbnQndCBpbiB0ZXh0IGdyb3VwLiIiIgorICAgIG1pbWV0eXBlID0g
bWltZXR5cGVzLmd1ZXNzX3R5cGUoZmlsZW5hbWUpWzBdCisgICAgaWYgbm90IG1pbWV0eXBlOgor
ICAgICAgcmV0dXJuIEZhbHNlICAjIGUuZy4gUkVBRE1FLCAicmVhbCIgYmluYXJpZXMgdXN1YWxs
eSBoYXZlIGFuIGV4dGVuc2lvbgorICAgICMgc3BlY2lhbCBjYXNlIGZvciB0ZXh0IGZpbGVzIHdo
aWNoIGRvbid0IHN0YXJ0IHdpdGggdGV4dC8KKyAgICBpZiBtaW1ldHlwZSBpbiBURVhUX01JTUVU
WVBFUzoKKyAgICAgIHJldHVybiBGYWxzZQorICAgIHJldHVybiBub3QgbWltZXR5cGUuc3RhcnRz
d2l0aCgidGV4dC8iKQorCisKK2NsYXNzIFN1YnZlcnNpb25WQ1MoVmVyc2lvbkNvbnRyb2xTeXN0
ZW0pOgorICAiIiJJbXBsZW1lbnRhdGlvbiBvZiB0aGUgVmVyc2lvbkNvbnRyb2xTeXN0ZW0gaW50
ZXJmYWNlIGZvciBTdWJ2ZXJzaW9uLiIiIgorCisgIGRlZiBfX2luaXRfXyhzZWxmLCBvcHRpb25z
KToKKyAgICBzdXBlcihTdWJ2ZXJzaW9uVkNTLCBzZWxmKS5fX2luaXRfXyhvcHRpb25zKQorICAg
IGlmIHNlbGYub3B0aW9ucy5yZXZpc2lvbjoKKyAgICAgIG1hdGNoID0gcmUubWF0Y2gociIoXGQr
KSg6KFxkKykpPyIsIHNlbGYub3B0aW9ucy5yZXZpc2lvbikKKyAgICAgIGlmIG5vdCBtYXRjaDoK
KyAgICAgICAgRXJyb3JFeGl0KCJJbnZhbGlkIFN1YnZlcnNpb24gcmV2aXNpb24gJXMuIiAlIHNl
bGYub3B0aW9ucy5yZXZpc2lvbikKKyAgICAgIHNlbGYucmV2X3N0YXJ0ID0gbWF0Y2guZ3JvdXAo
MSkKKyAgICAgIHNlbGYucmV2X2VuZCA9IG1hdGNoLmdyb3VwKDMpCisgICAgZWxzZToKKyAgICAg
IHNlbGYucmV2X3N0YXJ0ID0gc2VsZi5yZXZfZW5kID0gTm9uZQorICAgICMgQ2FjaGUgb3V0cHV0
IGZyb20gInN2biBsaXN0IC1yIFJFVk5PIGRpcm5hbWUiLgorICAgICMgS2V5czogZGlybmFtZSwg
VmFsdWVzOiAyLXR1cGxlIChvdXB1dCBmb3Igc3RhcnQgcmV2IGFuZCBlbmQgcmV2KS4KKyAgICBz
ZWxmLnN2bmxzX2NhY2hlID0ge30KKyAgICAjIEJhc2UgVVJMIGlzIHJlcXVpcmVkIHRvIGZldGNo
IGZpbGVzIGRlbGV0ZWQgaW4gYW4gb2xkZXIgcmV2aXNpb24uCisgICAgIyBSZXN1bHQgaXMgY2Fj
aGVkIHRvIG5vdCBndWVzcyBpdCBvdmVyIGFuZCBvdmVyIGFnYWluIGluIEdldEJhc2VGaWxlKCku
CisgICAgcmVxdWlyZWQgPSBzZWxmLm9wdGlvbnMuZG93bmxvYWRfYmFzZSBvciBzZWxmLm9wdGlv
bnMucmV2aXNpb24gaXMgbm90IE5vbmUKKyAgICBzZWxmLnN2bl9iYXNlID0gc2VsZi5fR3Vlc3NC
YXNlKHJlcXVpcmVkKQorCisgIGRlZiBHdWVzc0Jhc2Uoc2VsZiwgcmVxdWlyZWQpOgorICAgICIi
IldyYXBwZXIgZm9yIF9HdWVzc0Jhc2UuIiIiCisgICAgcmV0dXJuIHNlbGYuc3ZuX2Jhc2UKKwor
ICBkZWYgX0d1ZXNzQmFzZShzZWxmLCByZXF1aXJlZCk6CisgICAgIiIiUmV0dXJucyB0aGUgU1ZO
IGJhc2UgVVJMLgorCisgICAgQXJnczoKKyAgICAgIHJlcXVpcmVkOiBJZiB0cnVlLCBleGl0cyBp
ZiB0aGUgdXJsIGNhbid0IGJlIGd1ZXNzZWQsIG90aGVyd2lzZSBOb25lIGlzCisgICAgICAgIHJl
dHVybmVkLgorICAgICIiIgorICAgIGluZm8gPSBSdW5TaGVsbChbInN2biIsICJpbmZvIl0pCisg
ICAgZm9yIGxpbmUgaW4gaW5mby5zcGxpdGxpbmVzKCk6CisgICAgICB3b3JkcyA9IGxpbmUuc3Bs
aXQoKQorICAgICAgaWYgbGVuKHdvcmRzKSA9PSAyIGFuZCB3b3Jkc1swXSA9PSAiVVJMOiI6Cisg
ICAgICAgIHVybCA9IHdvcmRzWzFdCisgICAgICAgIHNjaGVtZSwgbmV0bG9jLCBwYXRoLCBwYXJh
bXMsIHF1ZXJ5LCBmcmFnbWVudCA9IHVybHBhcnNlLnVybHBhcnNlKHVybCkKKyAgICAgICAgdXNl
cm5hbWUsIG5ldGxvYyA9IHVybGxpYi5zcGxpdHVzZXIobmV0bG9jKQorICAgICAgICBpZiB1c2Vy
bmFtZToKKyAgICAgICAgICBsb2dnaW5nLmluZm8oIlJlbW92ZWQgdXNlcm5hbWUgZnJvbSBiYXNl
IFVSTCIpCisgICAgICAgIGlmIG5ldGxvYy5lbmRzd2l0aCgic3ZuLnB5dGhvbi5vcmciKToKKyAg
ICAgICAgICBpZiBuZXRsb2MgPT0gInN2bi5weXRob24ub3JnIjoKKyAgICAgICAgICAgIGlmIHBh
dGguc3RhcnRzd2l0aCgiL3Byb2plY3RzLyIpOgorICAgICAgICAgICAgICBwYXRoID0gcGF0aFs5
Ol0KKyAgICAgICAgICBlbGlmIG5ldGxvYyAhPSAicHl0aG9uZGV2QHN2bi5weXRob24ub3JnIjoK
KyAgICAgICAgICAgIEVycm9yRXhpdCgiVW5yZWNvZ25pemVkIFB5dGhvbiBVUkw6ICVzIiAlIHVy
bCkKKyAgICAgICAgICBiYXNlID0gImh0dHA6Ly9zdm4ucHl0aG9uLm9yZy92aWV3LypjaGVja291
dColcy8iICUgcGF0aAorICAgICAgICAgIGxvZ2dpbmcuaW5mbygiR3Vlc3NlZCBQeXRob24gYmFz
ZSA9ICVzIiwgYmFzZSkKKyAgICAgICAgZWxpZiBuZXRsb2MuZW5kc3dpdGgoInN2bi5jb2xsYWIu
bmV0Iik6CisgICAgICAgICAgaWYgcGF0aC5zdGFydHN3aXRoKCIvcmVwb3MvIik6CisgICAgICAg
ICAgICBwYXRoID0gcGF0aFs2Ol0KKyAgICAgICAgICBiYXNlID0gImh0dHA6Ly9zdm4uY29sbGFi
Lm5ldC92aWV3dmMvKmNoZWNrb3V0KiVzLyIgJSBwYXRoCisgICAgICAgICAgbG9nZ2luZy5pbmZv
KCJHdWVzc2VkIENvbGxhYk5ldCBiYXNlID0gJXMiLCBiYXNlKQorICAgICAgICBlbGlmIG5ldGxv
Yy5lbmRzd2l0aCgiLmdvb2dsZWNvZGUuY29tIik6CisgICAgICAgICAgcGF0aCA9IHBhdGggKyAi
LyIKKyAgICAgICAgICBiYXNlID0gdXJscGFyc2UudXJsdW5wYXJzZSgoImh0dHAiLCBuZXRsb2Ms
IHBhdGgsIHBhcmFtcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVl
cnksIGZyYWdtZW50KSkKKyAgICAgICAgICBsb2dnaW5nLmluZm8oIkd1ZXNzZWQgR29vZ2xlIENv
ZGUgYmFzZSA9ICVzIiwgYmFzZSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICBwYXRoID0gcGF0
aCArICIvIgorICAgICAgICAgIGJhc2UgPSB1cmxwYXJzZS51cmx1bnBhcnNlKChzY2hlbWUsIG5l
dGxvYywgcGF0aCwgcGFyYW1zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICBxdWVyeSwgZnJhZ21lbnQpKQorICAgICAgICAgIGxvZ2dpbmcuaW5mbygiR3Vlc3NlZCBiYXNl
ID0gJXMiLCBiYXNlKQorICAgICAgICByZXR1cm4gYmFzZQorICAgIGlmIHJlcXVpcmVkOgorICAg
ICAgRXJyb3JFeGl0KCJDYW4ndCBmaW5kIFVSTCBpbiBvdXRwdXQgZnJvbSBzdm4gaW5mbyIpCisg
ICAgcmV0dXJuIE5vbmUKKworICBkZWYgR2VuZXJhdGVEaWZmKHNlbGYsIGFyZ3MpOgorICAgIGNt
ZCA9IFsic3ZuIiwgImRpZmYiXQorICAgIGlmIHNlbGYub3B0aW9ucy5yZXZpc2lvbjoKKyAgICAg
IGNtZCArPSBbIi1yIiwgc2VsZi5vcHRpb25zLnJldmlzaW9uXQorICAgIGNtZC5leHRlbmQoYXJn
cykKKyAgICBkYXRhID0gUnVuU2hlbGwoY21kKQorICAgIGNvdW50ID0gMAorICAgIGZvciBsaW5l
IGluIGRhdGEuc3BsaXRsaW5lcygpOgorICAgICAgaWYgbGluZS5zdGFydHN3aXRoKCJJbmRleDoi
KSBvciBsaW5lLnN0YXJ0c3dpdGgoIlByb3BlcnR5IGNoYW5nZXMgb246Iik6CisgICAgICAgIGNv
dW50ICs9IDEKKyAgICAgICAgbG9nZ2luZy5pbmZvKGxpbmUpCisgICAgaWYgbm90IGNvdW50Ogor
ICAgICAgRXJyb3JFeGl0KCJObyB2YWxpZCBwYXRjaGVzIGZvdW5kIGluIG91dHB1dCBmcm9tIHN2
biBkaWZmIikKKyAgICByZXR1cm4gZGF0YQorCisgIGRlZiBfQ29sbGFwc2VLZXl3b3JkcyhzZWxm
LCBjb250ZW50LCBrZXl3b3JkX3N0cik6CisgICAgIiIiQ29sbGFwc2VzIFNWTiBrZXl3b3Jkcy4i
IiIKKyAgICAjIHN2biBjYXQgdHJhbnNsYXRlcyBrZXl3b3JkcyBidXQgc3ZuIGRpZmYgZG9lc24n
dC4gQXMgYSByZXN1bHQgb2YgdGhpcworICAgICMgYmVoYXZpb3IgcGF0Y2hpbmcuUGF0Y2hDaHVu
a3MoKSBmYWlscyB3aXRoIGEgY2h1bmsgbWlzbWF0Y2ggZXJyb3IuCisgICAgIyBUaGlzIHBhcnQg
d2FzIG9yaWdpbmFsbHkgd3JpdHRlbiBieSB0aGUgUmV2aWV3IEJvYXJkIGRldmVsb3BtZW50IHRl
YW0KKyAgICAjIHdobyBoYWQgdGhlIHNhbWUgcHJvYmxlbSAoaHR0cDovL3Jldmlld3MucmV2aWV3
LWJvYXJkLm9yZy9yLzI3Ni8pLgorICAgICMgTWFwcGluZyBvZiBrZXl3b3JkcyB0byBrbm93biBh
bGlhc2VzCisgICAgc3ZuX2tleXdvcmRzID0geworICAgICAgIyBTdGFuZGFyZCBrZXl3b3Jkcwor
ICAgICAgJ0RhdGUnOiAgICAgICAgICAgICAgICBbJ0RhdGUnLCAnTGFzdENoYW5nZWREYXRlJ10s
CisgICAgICAnUmV2aXNpb24nOiAgICAgICAgICAgIFsnUmV2aXNpb24nLCAnTGFzdENoYW5nZWRS
ZXZpc2lvbicsICdSZXYnXSwKKyAgICAgICdBdXRob3InOiAgICAgICAgICAgICAgWydBdXRob3In
LCAnTGFzdENoYW5nZWRCeSddLAorICAgICAgJ0hlYWRVUkwnOiAgICAgICAgICAgICBbJ0hlYWRV
UkwnLCAnVVJMJ10sCisgICAgICAnSWQnOiAgICAgICAgICAgICAgICAgIFsnSWQnXSwKKworICAg
ICAgIyBBbGlhc2VzCisgICAgICAnTGFzdENoYW5nZWREYXRlJzogICAgIFsnTGFzdENoYW5nZWRE
YXRlJywgJ0RhdGUnXSwKKyAgICAgICdMYXN0Q2hhbmdlZFJldmlzaW9uJzogWydMYXN0Q2hhbmdl
ZFJldmlzaW9uJywgJ1JldicsICdSZXZpc2lvbiddLAorICAgICAgJ0xhc3RDaGFuZ2VkQnknOiAg
ICAgICBbJ0xhc3RDaGFuZ2VkQnknLCAnQXV0aG9yJ10sCisgICAgICAnVVJMJzogICAgICAgICAg
ICAgICAgIFsnVVJMJywgJ0hlYWRVUkwnXSwKKyAgICB9CisKKyAgICBkZWYgcmVwbChtKToKKyAg
ICAgICBpZiBtLmdyb3VwKDIpOgorICAgICAgICAgcmV0dXJuICIkJXM6OiVzJCIgJSAobS5ncm91
cCgxKSwgIiAiICogbGVuKG0uZ3JvdXAoMykpKQorICAgICAgIHJldHVybiAiJCVzJCIgJSBtLmdy
b3VwKDEpCisgICAga2V5d29yZHMgPSBba2V5d29yZAorICAgICAgICAgICAgICAgIGZvciBuYW1l
IGluIGtleXdvcmRfc3RyLnNwbGl0KCIgIikKKyAgICAgICAgICAgICAgICBmb3Iga2V5d29yZCBp
biBzdm5fa2V5d29yZHMuZ2V0KG5hbWUsIFtdKV0KKyAgICByZXR1cm4gcmUuc3ViKHIiXCQoJXMp
Oig6PykoW15cJF0rKVwkIiAlICd8Jy5qb2luKGtleXdvcmRzKSwgcmVwbCwgY29udGVudCkKKwor
ICBkZWYgR2V0VW5rbm93bkZpbGVzKHNlbGYpOgorICAgIHN0YXR1cyA9IFJ1blNoZWxsKFsic3Zu
IiwgInN0YXR1cyIsICItLWlnbm9yZS1leHRlcm5hbHMiXSwgc2lsZW50X29rPVRydWUpCisgICAg
dW5rbm93bl9maWxlcyA9IFtdCisgICAgZm9yIGxpbmUgaW4gc3RhdHVzLnNwbGl0KCJcbiIpOgor
ICAgICAgaWYgbGluZSBhbmQgbGluZVswXSA9PSAiPyI6CisgICAgICAgIHVua25vd25fZmlsZXMu
YXBwZW5kKGxpbmUpCisgICAgcmV0dXJuIHVua25vd25fZmlsZXMKKworICBkZWYgUmVhZEZpbGUo
c2VsZiwgZmlsZW5hbWUpOgorICAgICIiIlJldHVybnMgdGhlIGNvbnRlbnRzIG9mIGEgZmlsZS4i
IiIKKyAgICBmaWxlID0gb3BlbihmaWxlbmFtZSwgJ3JiJykKKyAgICByZXN1bHQgPSAiIgorICAg
IHRyeToKKyAgICAgIHJlc3VsdCA9IGZpbGUucmVhZCgpCisgICAgZmluYWxseToKKyAgICAgIGZp
bGUuY2xvc2UoKQorICAgIHJldHVybiByZXN1bHQKKworICBkZWYgR2V0U3RhdHVzKHNlbGYsIGZp
bGVuYW1lKToKKyAgICAiIiJSZXR1cm5zIHRoZSBzdGF0dXMgb2YgYSBmaWxlLiIiIgorICAgIGlm
IG5vdCBzZWxmLm9wdGlvbnMucmV2aXNpb246CisgICAgICBzdGF0dXMgPSBSdW5TaGVsbChbInN2
biIsICJzdGF0dXMiLCAiLS1pZ25vcmUtZXh0ZXJuYWxzIiwgZmlsZW5hbWVdKQorICAgICAgaWYg
bm90IHN0YXR1czoKKyAgICAgICAgRXJyb3JFeGl0KCJzdm4gc3RhdHVzIHJldHVybmVkIG5vIG91
dHB1dCBmb3IgJXMiICUgZmlsZW5hbWUpCisgICAgICBzdGF0dXNfbGluZXMgPSBzdGF0dXMuc3Bs
aXRsaW5lcygpCisgICAgICAjIElmIGZpbGUgaXMgaW4gYSBjbCwgdGhlIG91dHB1dCB3aWxsIGJl
Z2luIHdpdGgKKyAgICAgICMgIlxuLS0tIENoYW5nZWxpc3QgJ2NsX25hbWUnOlxuIi4gIFNlZQor
ICAgICAgIyBodHRwOi8vc3ZuLmNvbGxhYi5uZXQvcmVwb3Mvc3ZuL3RydW5rL25vdGVzL2NoYW5n
ZWxpc3QtZGVzaWduLnR4dAorICAgICAgaWYgKGxlbihzdGF0dXNfbGluZXMpID09IDMgYW5kCisg
ICAgICAgICAgbm90IHN0YXR1c19saW5lc1swXSBhbmQKKyAgICAgICAgICBzdGF0dXNfbGluZXNb
MV0uc3RhcnRzd2l0aCgiLS0tIENoYW5nZWxpc3QiKSk6CisgICAgICAgIHN0YXR1cyA9IHN0YXR1
c19saW5lc1syXQorICAgICAgZWxzZToKKyAgICAgICAgc3RhdHVzID0gc3RhdHVzX2xpbmVzWzBd
CisgICAgIyBJZiB3ZSBoYXZlIGEgcmV2aXNpb24gdG8gZGlmZiBhZ2FpbnN0IHdlIG5lZWQgdG8g
cnVuICJzdm4gbGlzdCIKKyAgICAjIGZvciB0aGUgb2xkIGFuZCB0aGUgbmV3IHJldmlzaW9uIGFu
ZCBjb21wYXJlIHRoZSByZXN1bHRzIHRvIGdldAorICAgICMgdGhlIGNvcnJlY3Qgc3RhdHVzIGZv
ciBhIGZpbGUuCisgICAgZWxzZToKKyAgICAgIGRpcm5hbWUsIHJlbGZpbGVuYW1lID0gb3MucGF0
aC5zcGxpdChmaWxlbmFtZSkKKyAgICAgIGlmIGRpcm5hbWUgbm90IGluIHNlbGYuc3ZubHNfY2Fj
aGU6CisgICAgICAgIGNtZCA9IFsic3ZuIiwgImxpc3QiLCAiLXIiLCBzZWxmLnJldl9zdGFydCwg
ZGlybmFtZSBvciAiLiJdCisgICAgICAgIG91dCwgcmV0dXJuY29kZSA9IFJ1blNoZWxsV2l0aFJl
dHVybkNvZGUoY21kKQorICAgICAgICBpZiByZXR1cm5jb2RlOgorICAgICAgICAgIEVycm9yRXhp
dCgiRmFpbGVkIHRvIGdldCBzdGF0dXMgZm9yICVzLiIgJSBmaWxlbmFtZSkKKyAgICAgICAgb2xk
X2ZpbGVzID0gb3V0LnNwbGl0bGluZXMoKQorICAgICAgICBhcmdzID0gWyJzdm4iLCAibGlzdCJd
CisgICAgICAgIGlmIHNlbGYucmV2X2VuZDoKKyAgICAgICAgICBhcmdzICs9IFsiLXIiLCBzZWxm
LnJldl9lbmRdCisgICAgICAgIGNtZCA9IGFyZ3MgKyBbZGlybmFtZSBvciAiLiJdCisgICAgICAg
IG91dCwgcmV0dXJuY29kZSA9IFJ1blNoZWxsV2l0aFJldHVybkNvZGUoY21kKQorICAgICAgICBp
ZiByZXR1cm5jb2RlOgorICAgICAgICAgIEVycm9yRXhpdCgiRmFpbGVkIHRvIHJ1biBjb21tYW5k
ICVzIiAlIGNtZCkKKyAgICAgICAgc2VsZi5zdm5sc19jYWNoZVtkaXJuYW1lXSA9IChvbGRfZmls
ZXMsIG91dC5zcGxpdGxpbmVzKCkpCisgICAgICBvbGRfZmlsZXMsIG5ld19maWxlcyA9IHNlbGYu
c3ZubHNfY2FjaGVbZGlybmFtZV0KKyAgICAgIGlmIHJlbGZpbGVuYW1lIGluIG9sZF9maWxlcyBh
bmQgcmVsZmlsZW5hbWUgbm90IGluIG5ld19maWxlczoKKyAgICAgICAgc3RhdHVzID0gIkQgICAi
CisgICAgICBlbGlmIHJlbGZpbGVuYW1lIGluIG9sZF9maWxlcyBhbmQgcmVsZmlsZW5hbWUgaW4g
bmV3X2ZpbGVzOgorICAgICAgICBzdGF0dXMgPSAiTSAgICIKKyAgICAgIGVsc2U6CisgICAgICAg
IHN0YXR1cyA9ICJBICAgIgorICAgIHJldHVybiBzdGF0dXMKKworICBkZWYgR2V0QmFzZUZpbGUo
c2VsZiwgZmlsZW5hbWUpOgorICAgIHN0YXR1cyA9IHNlbGYuR2V0U3RhdHVzKGZpbGVuYW1lKQor
ICAgIGJhc2VfY29udGVudCA9IE5vbmUKKyAgICBuZXdfY29udGVudCA9IE5vbmUKKworICAgICMg
SWYgYSBmaWxlIGlzIGNvcGllZCBpdHMgc3RhdHVzIHdpbGwgYmUgIkEgICsiLCB3aGljaCBzaWdu
aWZpZXMKKyAgICAjICJhZGRpdGlvbi13aXRoLWhpc3RvcnkiLiAgU2VlICJzdm4gc3QiIGZvciBt
b3JlIGluZm9ybWF0aW9uLiAgV2UgbmVlZCB0bworICAgICMgdXBsb2FkIHRoZSBvcmlnaW5hbCBm
aWxlIG9yIGVsc2UgZGlmZiBwYXJzaW5nIHdpbGwgZmFpbCBpZiB0aGUgZmlsZSB3YXMKKyAgICAj
IGVkaXRlZC4KKyAgICBpZiBzdGF0dXNbMF0gPT0gIkEiIGFuZCBzdGF0dXNbM10gIT0gIisiOgor
ICAgICAgIyBXZSdsbCBuZWVkIHRvIHVwbG9hZCB0aGUgbmV3IGNvbnRlbnQgaWYgd2UncmUgYWRk
aW5nIGEgYmluYXJ5IGZpbGUKKyAgICAgICMgc2luY2UgZGlmZidzIG91dHB1dCB3b24ndCBjb250
YWluIGl0LgorICAgICAgbWltZXR5cGUgPSBSdW5TaGVsbChbInN2biIsICJwcm9wZ2V0IiwgInN2
bjptaW1lLXR5cGUiLCBmaWxlbmFtZV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgIHNpbGVu
dF9vaz1UcnVlKQorICAgICAgYmFzZV9jb250ZW50ID0gIiIKKyAgICAgIGlzX2JpbmFyeSA9IGJv
b2wobWltZXR5cGUpIGFuZCBub3QgbWltZXR5cGUuc3RhcnRzd2l0aCgidGV4dC8iKQorICAgICAg
aWYgaXNfYmluYXJ5IGFuZCBzZWxmLklzSW1hZ2UoZmlsZW5hbWUpOgorICAgICAgICBuZXdfY29u
dGVudCA9IHNlbGYuUmVhZEZpbGUoZmlsZW5hbWUpCisgICAgZWxpZiAoc3RhdHVzWzBdIGluICgi
TSIsICJEIiwgIlIiKSBvcgorICAgICAgICAgIChzdGF0dXNbMF0gPT0gIkEiIGFuZCBzdGF0dXNb
M10gPT0gIisiKSBvciAgIyBDb3BpZWQgZmlsZS4KKyAgICAgICAgICAoc3RhdHVzWzBdID09ICIg
IiBhbmQgc3RhdHVzWzFdID09ICJNIikpOiAgIyBQcm9wZXJ0eSBjaGFuZ2UuCisgICAgICBhcmdz
ID0gW10KKyAgICAgIGlmIHNlbGYub3B0aW9ucy5yZXZpc2lvbjoKKyAgICAgICAgdXJsID0gIiVz
LyVzQCVzIiAlIChzZWxmLnN2bl9iYXNlLCBmaWxlbmFtZSwgc2VsZi5yZXZfc3RhcnQpCisgICAg
ICBlbHNlOgorICAgICAgICAjIERvbid0IGNoYW5nZSBmaWxlbmFtZSwgaXQncyBuZWVkZWQgbGF0
ZXIuCisgICAgICAgIHVybCA9IGZpbGVuYW1lCisgICAgICAgIGFyZ3MgKz0gWyItciIsICJCQVNF
Il0KKyAgICAgIGNtZCA9IFsic3ZuIl0gKyBhcmdzICsgWyJwcm9wZ2V0IiwgInN2bjptaW1lLXR5
cGUiLCB1cmxdCisgICAgICBtaW1ldHlwZSwgcmV0dXJuY29kZSA9IFJ1blNoZWxsV2l0aFJldHVy
bkNvZGUoY21kKQorICAgICAgaWYgcmV0dXJuY29kZToKKyAgICAgICAgIyBGaWxlIGRvZXMgbm90
IGV4aXN0IGluIHRoZSByZXF1ZXN0ZWQgcmV2aXNpb24uCisgICAgICAgICMgUmVzZXQgbWltZXR5
cGUsIGl0IGNvbnRhaW5zIGFuIGVycm9yIG1lc3NhZ2UuCisgICAgICAgIG1pbWV0eXBlID0gIiIK
KyAgICAgIGdldF9iYXNlID0gRmFsc2UKKyAgICAgIGlzX2JpbmFyeSA9IGJvb2wobWltZXR5cGUp
IGFuZCBub3QgbWltZXR5cGUuc3RhcnRzd2l0aCgidGV4dC8iKQorICAgICAgaWYgc3RhdHVzWzBd
ID09ICIgIjoKKyAgICAgICAgIyBFbXB0eSBiYXNlIGNvbnRlbnQganVzdCB0byBmb3JjZSBhbiB1
cGxvYWQuCisgICAgICAgIGJhc2VfY29udGVudCA9ICIiCisgICAgICBlbGlmIGlzX2JpbmFyeToK
KyAgICAgICAgaWYgc2VsZi5Jc0ltYWdlKGZpbGVuYW1lKToKKyAgICAgICAgICBnZXRfYmFzZSA9
IFRydWUKKyAgICAgICAgICBpZiBzdGF0dXNbMF0gPT0gIk0iOgorICAgICAgICAgICAgaWYgbm90
IHNlbGYucmV2X2VuZDoKKyAgICAgICAgICAgICAgbmV3X2NvbnRlbnQgPSBzZWxmLlJlYWRGaWxl
KGZpbGVuYW1lKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgdXJsID0gIiVzLyVz
QCVzIiAlIChzZWxmLnN2bl9iYXNlLCBmaWxlbmFtZSwgc2VsZi5yZXZfZW5kKQorICAgICAgICAg
ICAgICBuZXdfY29udGVudCA9IFJ1blNoZWxsKFsic3ZuIiwgImNhdCIsIHVybF0sCisgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5pdmVyc2FsX25ld2xpbmVzPVRydWUsIHNp
bGVudF9vaz1UcnVlKQorICAgICAgICBlbHNlOgorICAgICAgICAgIGJhc2VfY29udGVudCA9ICIi
CisgICAgICBlbHNlOgorICAgICAgICBnZXRfYmFzZSA9IFRydWUKKworICAgICAgaWYgZ2V0X2Jh
c2U6CisgICAgICAgIGlmIGlzX2JpbmFyeToKKyAgICAgICAgICB1bml2ZXJzYWxfbmV3bGluZXMg
PSBGYWxzZQorICAgICAgICBlbHNlOgorICAgICAgICAgIHVuaXZlcnNhbF9uZXdsaW5lcyA9IFRy
dWUKKyAgICAgICAgaWYgc2VsZi5yZXZfc3RhcnQ6CisgICAgICAgICAgIyAic3ZuIGNhdCAtciBS
RVYgZGVsZXRlX2ZpbGUudHh0IiBkb2Vzbid0IHdvcmsuIGNhdCByZXF1aXJlcworICAgICAgICAg
ICMgdGhlIGZ1bGwgVVJMIHdpdGggIkBSRVYiIGFwcGVuZGVkIGluc3RlYWQgb2YgdXNpbmcgIi1y
IiBvcHRpb24uCisgICAgICAgICAgdXJsID0gIiVzLyVzQCVzIiAlIChzZWxmLnN2bl9iYXNlLCBm
aWxlbmFtZSwgc2VsZi5yZXZfc3RhcnQpCisgICAgICAgICAgYmFzZV9jb250ZW50ID0gUnVuU2hl
bGwoWyJzdm4iLCAiY2F0IiwgdXJsXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICB1bml2ZXJzYWxfbmV3bGluZXM9dW5pdmVyc2FsX25ld2xpbmVzLAorICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgIHNpbGVudF9vaz1UcnVlKQorICAgICAgICBlbHNlOgorICAgICAg
ICAgIGJhc2VfY29udGVudCA9IFJ1blNoZWxsKFsic3ZuIiwgImNhdCIsIGZpbGVuYW1lXSwKKyAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bml2ZXJzYWxfbmV3bGluZXM9dW5pdmVy
c2FsX25ld2xpbmVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpbGVudF9v
az1UcnVlKQorICAgICAgICBpZiBub3QgaXNfYmluYXJ5OgorICAgICAgICAgIGFyZ3MgPSBbXQor
ICAgICAgICAgIGlmIHNlbGYucmV2X3N0YXJ0OgorICAgICAgICAgICAgdXJsID0gIiVzLyVzQCVz
IiAlIChzZWxmLnN2bl9iYXNlLCBmaWxlbmFtZSwgc2VsZi5yZXZfc3RhcnQpCisgICAgICAgICAg
ZWxzZToKKyAgICAgICAgICAgIHVybCA9IGZpbGVuYW1lCisgICAgICAgICAgICBhcmdzICs9IFsi
LXIiLCAiQkFTRSJdCisgICAgICAgICAgY21kID0gWyJzdm4iXSArIGFyZ3MgKyBbInByb3BnZXQi
LCAic3ZuOmtleXdvcmRzIiwgdXJsXQorICAgICAgICAgIGtleXdvcmRzLCByZXR1cm5jb2RlID0g
UnVuU2hlbGxXaXRoUmV0dXJuQ29kZShjbWQpCisgICAgICAgICAgaWYga2V5d29yZHMgYW5kIG5v
dCByZXR1cm5jb2RlOgorICAgICAgICAgICAgYmFzZV9jb250ZW50ID0gc2VsZi5fQ29sbGFwc2VL
ZXl3b3JkcyhiYXNlX2NvbnRlbnQsIGtleXdvcmRzKQorICAgIGVsc2U6CisgICAgICBTdGF0dXNV
cGRhdGUoInN2biBzdGF0dXMgcmV0dXJuZWQgdW5leHBlY3RlZCBvdXRwdXQ6ICVzIiAlIHN0YXR1
cykKKyAgICAgIHN5cy5leGl0KDEpCisgICAgcmV0dXJuIGJhc2VfY29udGVudCwgbmV3X2NvbnRl
bnQsIGlzX2JpbmFyeSwgc3RhdHVzWzA6NV0KKworCitjbGFzcyBHaXRWQ1MoVmVyc2lvbkNvbnRy
b2xTeXN0ZW0pOgorICAiIiJJbXBsZW1lbnRhdGlvbiBvZiB0aGUgVmVyc2lvbkNvbnRyb2xTeXN0
ZW0gaW50ZXJmYWNlIGZvciBHaXQuIiIiCisKKyAgZGVmIF9faW5pdF9fKHNlbGYsIG9wdGlvbnMp
OgorICAgIHN1cGVyKEdpdFZDUywgc2VsZikuX19pbml0X18ob3B0aW9ucykKKyAgICAjIE1hcCBv
ZiBmaWxlbmFtZSAtPiAoaGFzaCBiZWZvcmUsIGhhc2ggYWZ0ZXIpIG9mIGJhc2UgZmlsZS4KKyAg
ICAjIEhhc2hlcyBmb3IgIm5vIHN1Y2ggZmlsZSIgYXJlIHJlcHJlc2VudGVkIGFzIE5vbmUuCisg
ICAgc2VsZi5oYXNoZXMgPSB7fQorICAgICMgTWFwIG9mIG5ldyBmaWxlbmFtZSAtPiBvbGQgZmls
ZW5hbWUgZm9yIHJlbmFtZXMuCisgICAgc2VsZi5yZW5hbWVzID0ge30KKworICBkZWYgR2VuZXJh
dGVEaWZmKHNlbGYsIGV4dHJhX2FyZ3MpOgorICAgICMgVGhpcyBpcyBtb3JlIGNvbXBsaWNhdGVk
IHRoYW4gc3ZuJ3MgR2VuZXJhdGVEaWZmIGJlY2F1c2Ugd2UgbXVzdCBjb252ZXJ0CisgICAgIyB0
aGUgZGlmZiBvdXRwdXQgdG8gaW5jbHVkZSBhbiBzdm4tc3R5bGUgIkluZGV4OiIgbGluZSBhcyB3
ZWxsIGFzIHJlY29yZAorICAgICMgdGhlIGhhc2hlcyBvZiB0aGUgZmlsZXMsIHNvIHdlIGNhbiB1
cGxvYWQgdGhlbSBhbG9uZyB3aXRoIG91ciBkaWZmLgorCisgICAgIyBTcGVjaWFsIHVzZWQgYnkg
Z2l0IHRvIGluZGljYXRlICJubyBzdWNoIGNvbnRlbnQiLgorICAgIE5VTExfSEFTSCA9ICIwIio0
MAorCisgICAgZXh0cmFfYXJncyA9IGV4dHJhX2FyZ3NbOl0KKyAgICBpZiBzZWxmLm9wdGlvbnMu
cmV2aXNpb246CisgICAgICBleHRyYV9hcmdzID0gW3NlbGYub3B0aW9ucy5yZXZpc2lvbl0gKyBl
eHRyYV9hcmdzCisKKyAgICAjIC0tbm8tZXh0LWRpZmYgaXMgYnJva2VuIGluIHNvbWUgdmVyc2lv
bnMgb2YgR2l0LCBzbyB0cnkgdG8gd29yayBhcm91bmQKKyAgICAjIHRoaXMgYnkgb3ZlcnJpZGlu
ZyB0aGUgZW52aXJvbm1lbnQgKGJ1dCB0aGVyZSBpcyBzdGlsbCBhIHByb2JsZW0gaWYgdGhlCisg
ICAgIyBnaXQgY29uZmlnIGtleSAiZGlmZi5leHRlcm5hbCIgaXMgdXNlZCkuCisgICAgZW52ID0g
b3MuZW52aXJvbi5jb3B5KCkKKyAgICBpZiAnR0lUX0VYVEVSTkFMX0RJRkYnIGluIGVudjogZGVs
IGVudlsnR0lUX0VYVEVSTkFMX0RJRkYnXQorICAgIGdpdGRpZmYgPSBSdW5TaGVsbChbImdpdCIs
ICJkaWZmIiwgIi0tbm8tZXh0LWRpZmYiLCAiLS1mdWxsLWluZGV4IiwgIi1NIl0KKyAgICAgICAg
ICAgICAgICAgICAgICAgKyBleHRyYV9hcmdzLCBlbnY9ZW52KQorCisgICAgZGVmIElzRmlsZU5l
dyhmaWxlbmFtZSk6CisgICAgICByZXR1cm4gZmlsZW5hbWUgaW4gc2VsZi5oYXNoZXMgYW5kIHNl
bGYuaGFzaGVzW2ZpbGVuYW1lXVswXSBpcyBOb25lCisKKyAgICBkZWYgQWRkU3VidmVyc2lvblBy
b3BlcnR5Q2hhbmdlKGZpbGVuYW1lKToKKyAgICAgICIiIkFkZCBzdm4ncyBwcm9wZXJ0eSBjaGFu
Z2UgaW5mb3JtYXRpb24gaW50byB0aGUgcGF0Y2ggaWYgZ2l2ZW4gZmlsZSBpcworICAgICAgbmV3
IGZpbGUuCisKKyAgICAgIFdlIHVzZSBTdWJ2ZXJzaW9uJ3MgYXV0by1wcm9wcyBzZXR0aW5nIHRv
IHJldHJpZXZlIGl0cyBwcm9wZXJ0eS4KKyAgICAgIFNlZSBodHRwOi8vc3ZuYm9vay5yZWQtYmVh
bi5jb20vZW4vMS4xL2NoMDcuaHRtbCNzdm4tY2gtNy1zZWN0LTEuMy4yIGZvcgorICAgICAgU3Vi
dmVyc2lvbidzIFthdXRvLXByb3BzXSBzZXR0aW5nLgorICAgICAgIiIiCisgICAgICBpZiBzZWxm
Lm9wdGlvbnMuZW11bGF0ZV9zdm5fYXV0b19wcm9wcyBhbmQgSXNGaWxlTmV3KGZpbGVuYW1lKToK
KyAgICAgICAgc3ZucHJvcHMgPSBHZXRTdWJ2ZXJzaW9uUHJvcGVydHlDaGFuZ2VzKGZpbGVuYW1l
KQorICAgICAgICBpZiBzdm5wcm9wczoKKyAgICAgICAgICBzdm5kaWZmLmFwcGVuZCgiXG4iICsg
c3ZucHJvcHMgKyAiXG4iKQorCisgICAgc3ZuZGlmZiA9IFtdCisgICAgZmlsZWNvdW50ID0gMAor
ICAgIGZpbGVuYW1lID0gTm9uZQorICAgIGZvciBsaW5lIGluIGdpdGRpZmYuc3BsaXRsaW5lcygp
OgorICAgICAgbWF0Y2ggPSByZS5tYXRjaChyImRpZmYgLS1naXQgYS8oLiopIGIvKC4qKSQiLCBs
aW5lKQorICAgICAgaWYgbWF0Y2g6CisgICAgICAgICMgQWRkIGF1dG8gcHJvcGVydHkgaGVyZSBm
b3IgcHJldmlvdXNseSBzZWVuIGZpbGUuCisgICAgICAgIGlmIGZpbGVuYW1lIGlzIG5vdCBOb25l
OgorICAgICAgICAgIEFkZFN1YnZlcnNpb25Qcm9wZXJ0eUNoYW5nZShmaWxlbmFtZSkKKyAgICAg
ICAgZmlsZWNvdW50ICs9IDEKKyAgICAgICAgIyBJbnRlbnRpb25hbGx5IHVzZSB0aGUgImFmdGVy
IiBmaWxlbmFtZSBzbyB3ZSBjYW4gc2hvdyByZW5hbWVzLgorICAgICAgICBmaWxlbmFtZSA9IG1h
dGNoLmdyb3VwKDIpCisgICAgICAgIHN2bmRpZmYuYXBwZW5kKCJJbmRleDogJXNcbiIgJSBmaWxl
bmFtZSkKKyAgICAgICAgaWYgbWF0Y2guZ3JvdXAoMSkgIT0gbWF0Y2guZ3JvdXAoMik6CisgICAg
ICAgICAgc2VsZi5yZW5hbWVzW21hdGNoLmdyb3VwKDIpXSA9IG1hdGNoLmdyb3VwKDEpCisgICAg
ICBlbHNlOgorICAgICAgICAjIFRoZSAiaW5kZXgiIGxpbmUgaW4gYSBnaXQgZGlmZiBsb29rcyBs
aWtlIHRoaXMgKGxvbmcgaGFzaGVzIGVsaWRlZCk6CisgICAgICAgICMgICBpbmRleCA4MmMwZDQ0
Li5iMmNlZTNmIDEwMDc1NQorICAgICAgICAjIFdlIHdhbnQgdG8gc2F2ZSB0aGUgbGVmdCBoYXNo
LCBhcyB0aGF0IGlkZW50aWZpZXMgdGhlIGJhc2UgZmlsZS4KKyAgICAgICAgbWF0Y2ggPSByZS5t
YXRjaChyImluZGV4IChcdyspXC5cLihcdyspIiwgbGluZSkKKyAgICAgICAgaWYgbWF0Y2g6Cisg
ICAgICAgICAgYmVmb3JlLCBhZnRlciA9IChtYXRjaC5ncm91cCgxKSwgbWF0Y2guZ3JvdXAoMikp
CisgICAgICAgICAgaWYgYmVmb3JlID09IE5VTExfSEFTSDoKKyAgICAgICAgICAgIGJlZm9yZSA9
IE5vbmUKKyAgICAgICAgICBpZiBhZnRlciA9PSBOVUxMX0hBU0g6CisgICAgICAgICAgICBhZnRl
ciA9IE5vbmUKKyAgICAgICAgICBzZWxmLmhhc2hlc1tmaWxlbmFtZV0gPSAoYmVmb3JlLCBhZnRl
cikKKyAgICAgIHN2bmRpZmYuYXBwZW5kKGxpbmUgKyAiXG4iKQorICAgIGlmIG5vdCBmaWxlY291
bnQ6CisgICAgICBFcnJvckV4aXQoIk5vIHZhbGlkIHBhdGNoZXMgZm91bmQgaW4gb3V0cHV0IGZy
b20gZ2l0IGRpZmYiKQorICAgICMgQWRkIGF1dG8gcHJvcGVydHkgZm9yIHRoZSBsYXN0IHNlZW4g
ZmlsZS4KKyAgICBhc3NlcnQgZmlsZW5hbWUgaXMgbm90IE5vbmUKKyAgICBBZGRTdWJ2ZXJzaW9u
UHJvcGVydHlDaGFuZ2UoZmlsZW5hbWUpCisgICAgcmV0dXJuICIiLmpvaW4oc3ZuZGlmZikKKwor
ICBkZWYgR2V0VW5rbm93bkZpbGVzKHNlbGYpOgorICAgIHN0YXR1cyA9IFJ1blNoZWxsKFsiZ2l0
IiwgImxzLWZpbGVzIiwgIi0tZXhjbHVkZS1zdGFuZGFyZCIsICItLW90aGVycyJdLAorICAgICAg
ICAgICAgICAgICAgICAgIHNpbGVudF9vaz1UcnVlKQorICAgIHJldHVybiBzdGF0dXMuc3BsaXRs
aW5lcygpCisKKyAgZGVmIEdldEZpbGVDb250ZW50KHNlbGYsIGZpbGVfaGFzaCwgaXNfYmluYXJ5
KToKKyAgICAiIiJSZXR1cm5zIHRoZSBjb250ZW50IG9mIGEgZmlsZSBpZGVudGlmaWVkIGJ5IGl0
cyBnaXQgaGFzaC4iIiIKKyAgICBkYXRhLCByZXRjb2RlID0gUnVuU2hlbGxXaXRoUmV0dXJuQ29k
ZShbImdpdCIsICJzaG93IiwgZmlsZV9oYXNoXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgdW5pdmVyc2FsX25ld2xpbmVzPW5vdCBpc19iaW5hcnkpCisgICAg
aWYgcmV0Y29kZToKKyAgICAgIEVycm9yRXhpdCgiR290IGVycm9yIHN0YXR1cyBmcm9tICdnaXQg
c2hvdyAlcyciICUgZmlsZV9oYXNoKQorICAgIHJldHVybiBkYXRhCisKKyAgZGVmIEdldEJhc2VG
aWxlKHNlbGYsIGZpbGVuYW1lKToKKyAgICBoYXNoX2JlZm9yZSwgaGFzaF9hZnRlciA9IHNlbGYu
aGFzaGVzLmdldChmaWxlbmFtZSwgKE5vbmUsTm9uZSkpCisgICAgYmFzZV9jb250ZW50ID0gTm9u
ZQorICAgIG5ld19jb250ZW50ID0gTm9uZQorICAgIGlzX2JpbmFyeSA9IHNlbGYuSXNCaW5hcnko
ZmlsZW5hbWUpCisgICAgc3RhdHVzID0gTm9uZQorCisgICAgaWYgZmlsZW5hbWUgaW4gc2VsZi5y
ZW5hbWVzOgorICAgICAgc3RhdHVzID0gIkEgKyIgICMgTWF0Y2ggc3ZuIGF0dHJpYnV0ZSBuYW1l
IGZvciByZW5hbWVzLgorICAgICAgaWYgZmlsZW5hbWUgbm90IGluIHNlbGYuaGFzaGVzOgorICAg
ICAgICAjIElmIGEgcmVuYW1lIGRvZXNuJ3QgY2hhbmdlIHRoZSBjb250ZW50LCB3ZSBuZXZlciBn
ZXQgYSBoYXNoLgorICAgICAgICBiYXNlX2NvbnRlbnQgPSBSdW5TaGVsbChbImdpdCIsICJzaG93
IiwgIkhFQUQ6IiArIGZpbGVuYW1lXSkKKyAgICBlbGlmIG5vdCBoYXNoX2JlZm9yZToKKyAgICAg
IHN0YXR1cyA9ICJBIgorICAgICAgYmFzZV9jb250ZW50ID0gIiIKKyAgICBlbGlmIG5vdCBoYXNo
X2FmdGVyOgorICAgICAgc3RhdHVzID0gIkQiCisgICAgZWxzZToKKyAgICAgIHN0YXR1cyA9ICJN
IgorCisgICAgaXNfaW1hZ2UgPSBzZWxmLklzSW1hZ2UoZmlsZW5hbWUpCisKKyAgICAjIEdyYWIg
dGhlIGJlZm9yZS9hZnRlciBjb250ZW50IGlmIHdlIG5lZWQgaXQuCisgICAgIyBXZSBzaG91bGQg
aW5jbHVkZSBmaWxlIGNvbnRlbnRzIGlmIGl0J3MgdGV4dCBvciBpdCdzIGFuIGltYWdlLgorICAg
IGlmIG5vdCBpc19iaW5hcnkgb3IgaXNfaW1hZ2U6CisgICAgICAjIEdyYWIgdGhlIGJhc2UgY29u
dGVudCBpZiB3ZSBkb24ndCBoYXZlIGl0IGFscmVhZHkuCisgICAgICBpZiBiYXNlX2NvbnRlbnQg
aXMgTm9uZSBhbmQgaGFzaF9iZWZvcmU6CisgICAgICAgIGJhc2VfY29udGVudCA9IHNlbGYuR2V0
RmlsZUNvbnRlbnQoaGFzaF9iZWZvcmUsIGlzX2JpbmFyeSkKKyAgICAgICMgT25seSBpbmNsdWRl
IHRoZSAiYWZ0ZXIiIGZpbGUgaWYgaXQncyBhbiBpbWFnZTsgb3RoZXJ3aXNlIGl0CisgICAgICAj
IGl0IGlzIHJlY29uc3RydWN0ZWQgZnJvbSB0aGUgZGlmZi4KKyAgICAgIGlmIGlzX2ltYWdlIGFu
ZCBoYXNoX2FmdGVyOgorICAgICAgICBuZXdfY29udGVudCA9IHNlbGYuR2V0RmlsZUNvbnRlbnQo
aGFzaF9hZnRlciwgaXNfYmluYXJ5KQorCisgICAgcmV0dXJuIChiYXNlX2NvbnRlbnQsIG5ld19j
b250ZW50LCBpc19iaW5hcnksIHN0YXR1cykKKworCitjbGFzcyBNZXJjdXJpYWxWQ1MoVmVyc2lv
bkNvbnRyb2xTeXN0ZW0pOgorICAiIiJJbXBsZW1lbnRhdGlvbiBvZiB0aGUgVmVyc2lvbkNvbnRy
b2xTeXN0ZW0gaW50ZXJmYWNlIGZvciBNZXJjdXJpYWwuIiIiCisKKyAgZGVmIF9faW5pdF9fKHNl
bGYsIG9wdGlvbnMsIHJlcG9fZGlyKToKKyAgICBzdXBlcihNZXJjdXJpYWxWQ1MsIHNlbGYpLl9f
aW5pdF9fKG9wdGlvbnMpCisgICAgIyBBYnNvbHV0ZSBwYXRoIHRvIHJlcG9zaXRvcnkgKHdlIGNh
biBiZSBpbiBhIHN1YmRpcikKKyAgICBzZWxmLnJlcG9fZGlyID0gb3MucGF0aC5ub3JtcGF0aChy
ZXBvX2RpcikKKyAgICAjIENvbXB1dGUgdGhlIHN1YmRpcgorICAgIGN3ZCA9IG9zLnBhdGgubm9y
bXBhdGgob3MuZ2V0Y3dkKCkpCisgICAgYXNzZXJ0IGN3ZC5zdGFydHN3aXRoKHNlbGYucmVwb19k
aXIpCisgICAgc2VsZi5zdWJkaXIgPSBjd2RbbGVuKHNlbGYucmVwb19kaXIpOl0ubHN0cmlwKHIi
XC8iKQorICAgIGlmIHNlbGYub3B0aW9ucy5yZXZpc2lvbjoKKyAgICAgIHNlbGYuYmFzZV9yZXYg
PSBzZWxmLm9wdGlvbnMucmV2aXNpb24KKyAgICBlbHNlOgorICAgICAgc2VsZi5iYXNlX3JldiA9
IFJ1blNoZWxsKFsiaGciLCAicGFyZW50IiwgIi1xIl0pLnNwbGl0KCc6JylbMV0uc3RyaXAoKQor
CisgIGRlZiBfR2V0UmVsUGF0aChzZWxmLCBmaWxlbmFtZSk6CisgICAgIiIiR2V0IHJlbGF0aXZl
IHBhdGggb2YgYSBmaWxlIGFjY29yZGluZyB0byB0aGUgY3VycmVudCBkaXJlY3RvcnksCisgICAg
Z2l2ZW4gaXRzIGxvZ2ljYWwgcGF0aCBpbiB0aGUgcmVwby4iIiIKKyAgICBhc3NlcnQgZmlsZW5h
bWUuc3RhcnRzd2l0aChzZWxmLnN1YmRpciksIChmaWxlbmFtZSwgc2VsZi5zdWJkaXIpCisgICAg
cmV0dXJuIGZpbGVuYW1lW2xlbihzZWxmLnN1YmRpcik6XS5sc3RyaXAociJcLyIpCisKKyAgZGVm
IEdlbmVyYXRlRGlmZihzZWxmLCBleHRyYV9hcmdzKToKKyAgICAjIElmIG5vIGZpbGUgc3BlY2lm
aWVkLCByZXN0cmljdCB0byB0aGUgY3VycmVudCBzdWJkaXIKKyAgICBleHRyYV9hcmdzID0gZXh0
cmFfYXJncyBvciBbIi4iXQorICAgIGNtZCA9IFsiaGciLCAiZGlmZiIsICItLWdpdCIsICItciIs
IHNlbGYuYmFzZV9yZXZdICsgZXh0cmFfYXJncworICAgIGRhdGEgPSBSdW5TaGVsbChjbWQsIHNp
bGVudF9vaz1UcnVlKQorICAgIHN2bmRpZmYgPSBbXQorICAgIGZpbGVjb3VudCA9IDAKKyAgICBm
b3IgbGluZSBpbiBkYXRhLnNwbGl0bGluZXMoKToKKyAgICAgIG0gPSByZS5tYXRjaCgiZGlmZiAt
LWdpdCBhLyhcUyspIGIvKFxTKykiLCBsaW5lKQorICAgICAgaWYgbToKKyAgICAgICAgIyBNb2Rp
ZnkgbGluZSB0byBtYWtlIGl0IGxvb2sgbGlrZSBhcyBpdCBjb21lcyBmcm9tIHN2biBkaWZmLgor
ICAgICAgICAjIFdpdGggdGhpcyBtb2RpZmljYXRpb24gbm8gY2hhbmdlcyBvbiB0aGUgc2VydmVy
IHNpZGUgYXJlIHJlcXVpcmVkCisgICAgICAgICMgdG8gbWFrZSB1cGxvYWQucHkgd29yayB3aXRo
IE1lcmN1cmlhbCByZXBvcy4KKyAgICAgICAgIyBOT1RFOiBmb3IgcHJvcGVyIGhhbmRsaW5nIG9m
IG1vdmVkL2NvcGllZCBmaWxlcywgd2UgaGF2ZSB0byB1c2UKKyAgICAgICAgIyB0aGUgc2Vjb25k
IGZpbGVuYW1lLgorICAgICAgICBmaWxlbmFtZSA9IG0uZ3JvdXAoMikKKyAgICAgICAgc3ZuZGlm
Zi5hcHBlbmQoIkluZGV4OiAlcyIgJSBmaWxlbmFtZSkKKyAgICAgICAgc3ZuZGlmZi5hcHBlbmQo
Ij0iICogNjcpCisgICAgICAgIGZpbGVjb3VudCArPSAxCisgICAgICAgIGxvZ2dpbmcuaW5mbyhs
aW5lKQorICAgICAgZWxzZToKKyAgICAgICAgc3ZuZGlmZi5hcHBlbmQobGluZSkKKyAgICBpZiBu
b3QgZmlsZWNvdW50OgorICAgICAgRXJyb3JFeGl0KCJObyB2YWxpZCBwYXRjaGVzIGZvdW5kIGlu
IG91dHB1dCBmcm9tIGhnIGRpZmYiKQorICAgIHJldHVybiAiXG4iLmpvaW4oc3ZuZGlmZikgKyAi
XG4iCisKKyAgZGVmIEdldFVua25vd25GaWxlcyhzZWxmKToKKyAgICAiIiJSZXR1cm4gYSBsaXN0
IG9mIGZpbGVzIHVua25vd24gdG8gdGhlIFZDUy4iIiIKKyAgICBhcmdzID0gW10KKyAgICBzdGF0
dXMgPSBSdW5TaGVsbChbImhnIiwgInN0YXR1cyIsICItLXJldiIsIHNlbGYuYmFzZV9yZXYsICIt
dSIsICIuIl0sCisgICAgICAgIHNpbGVudF9vaz1UcnVlKQorICAgIHVua25vd25fZmlsZXMgPSBb
XQorICAgIGZvciBsaW5lIGluIHN0YXR1cy5zcGxpdGxpbmVzKCk6CisgICAgICBzdCwgZm4gPSBs
aW5lLnNwbGl0KCIgIiwgMSkKKyAgICAgIGlmIHN0ID09ICI/IjoKKyAgICAgICAgdW5rbm93bl9m
aWxlcy5hcHBlbmQoZm4pCisgICAgcmV0dXJuIHVua25vd25fZmlsZXMKKworICBkZWYgR2V0QmFz
ZUZpbGUoc2VsZiwgZmlsZW5hbWUpOgorICAgICMgImhnIHN0YXR1cyIgYW5kICJoZyBjYXQiIGJv
dGggdGFrZSBhIHBhdGggcmVsYXRpdmUgdG8gdGhlIGN1cnJlbnQgc3ViZGlyCisgICAgIyByYXRo
ZXIgdGhhbiB0byB0aGUgcmVwbyByb290LCBidXQgImhnIGRpZmYiIGhhcyBnaXZlbiB1cyB0aGUg
ZnVsbCBwYXRoCisgICAgIyB0byB0aGUgcmVwbyByb290LgorICAgIGJhc2VfY29udGVudCA9ICIi
CisgICAgbmV3X2NvbnRlbnQgPSBOb25lCisgICAgaXNfYmluYXJ5ID0gRmFsc2UKKyAgICBvbGRy
ZWxwYXRoID0gcmVscGF0aCA9IHNlbGYuX0dldFJlbFBhdGgoZmlsZW5hbWUpCisgICAgIyAiaGcg
c3RhdHVzIC1DIiByZXR1cm5zIHR3byBsaW5lcyBmb3IgbW92ZWQvY29waWVkIGZpbGVzLCBvbmUg
b3RoZXJ3aXNlCisgICAgb3V0ID0gUnVuU2hlbGwoWyJoZyIsICJzdGF0dXMiLCAiLUMiLCAiLS1y
ZXYiLCBzZWxmLmJhc2VfcmV2LCByZWxwYXRoXSkKKyAgICBvdXQgPSBvdXQuc3BsaXRsaW5lcygp
CisgICAgIyBIQUNLOiBzdHJpcCBlcnJvciBtZXNzYWdlIGFib3V0IG1pc3NpbmcgZmlsZS9kaXJl
Y3RvcnkgaWYgaXQgaXNuJ3QgaW4KKyAgICAjIHRoZSB3b3JraW5nIGNvcHkKKyAgICBpZiBvdXRb
MF0uc3RhcnRzd2l0aCgnJXM6ICcgJSByZWxwYXRoKToKKyAgICAgIG91dCA9IG91dFsxOl0KKyAg
ICBpZiBsZW4ob3V0KSA+IDE6CisgICAgICAjIE1vdmVkL2NvcGllZCA9PiBjb25zaWRlcmVkIGFz
IG1vZGlmaWVkLCB1c2Ugb2xkIGZpbGVuYW1lIHRvCisgICAgICAjIHJldHJpZXZlIGJhc2UgY29u
dGVudHMKKyAgICAgIG9sZHJlbHBhdGggPSBvdXRbMV0uc3RyaXAoKQorICAgICAgc3RhdHVzID0g
Ik0iCisgICAgZWxzZToKKyAgICAgIHN0YXR1cywgXyA9IG91dFswXS5zcGxpdCgnICcsIDEpCisg
ICAgaWYgIjoiIGluIHNlbGYuYmFzZV9yZXY6CisgICAgICBiYXNlX3JldiA9IHNlbGYuYmFzZV9y
ZXYuc3BsaXQoIjoiLCAxKVswXQorICAgIGVsc2U6CisgICAgICBiYXNlX3JldiA9IHNlbGYuYmFz
ZV9yZXYKKyAgICBpZiBzdGF0dXMgIT0gIkEiOgorICAgICAgYmFzZV9jb250ZW50ID0gUnVuU2hl
bGwoWyJoZyIsICJjYXQiLCAiLXIiLCBiYXNlX3Jldiwgb2xkcmVscGF0aF0sCisgICAgICAgIHNp
bGVudF9vaz1UcnVlKQorICAgICAgaXNfYmluYXJ5ID0gIlwwIiBpbiBiYXNlX2NvbnRlbnQgICMg
TWVyY3VyaWFsJ3MgaGV1cmlzdGljCisgICAgaWYgc3RhdHVzICE9ICJSIjoKKyAgICAgIG5ld19j
b250ZW50ID0gb3BlbihyZWxwYXRoLCAicmIiKS5yZWFkKCkKKyAgICAgIGlzX2JpbmFyeSA9IGlz
X2JpbmFyeSBvciAiXDAiIGluIG5ld19jb250ZW50CisgICAgaWYgaXNfYmluYXJ5IGFuZCBiYXNl
X2NvbnRlbnQ6CisgICAgICAjIEZldGNoIGFnYWluIHdpdGhvdXQgY29udmVydGluZyBuZXdsaW5l
cworICAgICAgYmFzZV9jb250ZW50ID0gUnVuU2hlbGwoWyJoZyIsICJjYXQiLCAiLXIiLCBiYXNl
X3Jldiwgb2xkcmVscGF0aF0sCisgICAgICAgIHNpbGVudF9vaz1UcnVlLCB1bml2ZXJzYWxfbmV3
bGluZXM9RmFsc2UpCisgICAgaWYgbm90IGlzX2JpbmFyeSBvciBub3Qgc2VsZi5Jc0ltYWdlKHJl
bHBhdGgpOgorICAgICAgbmV3X2NvbnRlbnQgPSBOb25lCisgICAgcmV0dXJuIGJhc2VfY29udGVu
dCwgbmV3X2NvbnRlbnQsIGlzX2JpbmFyeSwgc3RhdHVzCisKKworIyBOT1RFOiBUaGUgU3BsaXRQ
YXRjaCBmdW5jdGlvbiBpcyBkdXBsaWNhdGVkIGluIGVuZ2luZS5weSwga2VlcCB0aGVtIGluIHN5
bmMuCitkZWYgU3BsaXRQYXRjaChkYXRhKToKKyAgIiIiU3BsaXRzIGEgcGF0Y2ggaW50byBzZXBh
cmF0ZSBwaWVjZXMgZm9yIGVhY2ggZmlsZS4KKworICBBcmdzOgorICAgIGRhdGE6IEEgc3RyaW5n
IGNvbnRhaW5pbmcgdGhlIG91dHB1dCBvZiBzdm4gZGlmZi4KKworICBSZXR1cm5zOgorICAgIEEg
bGlzdCBvZiAyLXR1cGxlIChmaWxlbmFtZSwgdGV4dCkgd2hlcmUgdGV4dCBpcyB0aGUgc3ZuIGRp
ZmYgb3V0cHV0CisgICAgICBwZXJ0YWluaW5nIHRvIGZpbGVuYW1lLgorICAiIiIKKyAgcGF0Y2hl
cyA9IFtdCisgIGZpbGVuYW1lID0gTm9uZQorICBkaWZmID0gW10KKyAgZm9yIGxpbmUgaW4gZGF0
YS5zcGxpdGxpbmVzKFRydWUpOgorICAgIG5ld19maWxlbmFtZSA9IE5vbmUKKyAgICBpZiBsaW5l
LnN0YXJ0c3dpdGgoJ0luZGV4OicpOgorICAgICAgdW51c2VkLCBuZXdfZmlsZW5hbWUgPSBsaW5l
LnNwbGl0KCc6JywgMSkKKyAgICAgIG5ld19maWxlbmFtZSA9IG5ld19maWxlbmFtZS5zdHJpcCgp
CisgICAgZWxpZiBsaW5lLnN0YXJ0c3dpdGgoJ1Byb3BlcnR5IGNoYW5nZXMgb246Jyk6CisgICAg
ICB1bnVzZWQsIHRlbXBfZmlsZW5hbWUgPSBsaW5lLnNwbGl0KCc6JywgMSkKKyAgICAgICMgV2hl
biBhIGZpbGUgaXMgbW9kaWZpZWQsIHBhdGhzIHVzZSAnLycgYmV0d2VlbiBkaXJlY3Rvcmllcywg
aG93ZXZlcgorICAgICAgIyB3aGVuIGEgcHJvcGVydHkgaXMgbW9kaWZpZWQgJ1wnIGlzIHVzZWQg
b24gV2luZG93cy4gIE1ha2UgdGhlbSB0aGUgc2FtZQorICAgICAgIyBvdGhlcndpc2UgdGhlIGZp
bGUgc2hvd3MgdXAgdHdpY2UuCisgICAgICB0ZW1wX2ZpbGVuYW1lID0gdGVtcF9maWxlbmFtZS5z
dHJpcCgpLnJlcGxhY2UoJ1xcJywgJy8nKQorICAgICAgaWYgdGVtcF9maWxlbmFtZSAhPSBmaWxl
bmFtZToKKyAgICAgICAgIyBGaWxlIGhhcyBwcm9wZXJ0eSBjaGFuZ2VzIGJ1dCBubyBtb2RpZmlj
YXRpb25zLCBjcmVhdGUgYSBuZXcgZGlmZi4KKyAgICAgICAgbmV3X2ZpbGVuYW1lID0gdGVtcF9m
aWxlbmFtZQorICAgIGlmIG5ld19maWxlbmFtZToKKyAgICAgIGlmIGZpbGVuYW1lIGFuZCBkaWZm
OgorICAgICAgICBwYXRjaGVzLmFwcGVuZCgoZmlsZW5hbWUsICcnLmpvaW4oZGlmZikpKQorICAg
ICAgZmlsZW5hbWUgPSBuZXdfZmlsZW5hbWUKKyAgICAgIGRpZmYgPSBbbGluZV0KKyAgICAgIGNv
bnRpbnVlCisgICAgaWYgZGlmZiBpcyBub3QgTm9uZToKKyAgICAgIGRpZmYuYXBwZW5kKGxpbmUp
CisgIGlmIGZpbGVuYW1lIGFuZCBkaWZmOgorICAgIHBhdGNoZXMuYXBwZW5kKChmaWxlbmFtZSwg
Jycuam9pbihkaWZmKSkpCisgIHJldHVybiBwYXRjaGVzCisKKworZGVmIFVwbG9hZFNlcGFyYXRl
UGF0Y2hlcyhpc3N1ZSwgcnBjX3NlcnZlciwgcGF0Y2hzZXQsIGRhdGEsIG9wdGlvbnMpOgorICAi
IiJVcGxvYWRzIGEgc2VwYXJhdGUgcGF0Y2ggZm9yIGVhY2ggZmlsZSBpbiB0aGUgZGlmZiBvdXRw
dXQuCisKKyAgUmV0dXJucyBhIGxpc3Qgb2YgW3BhdGNoX2tleSwgZmlsZW5hbWVdIGZvciBlYWNo
IGZpbGUuCisgICIiIgorICBwYXRjaGVzID0gU3BsaXRQYXRjaChkYXRhKQorICBydiA9IFtdCisg
IGZvciBwYXRjaCBpbiBwYXRjaGVzOgorICAgIGlmIGxlbihwYXRjaFsxXSkgPiBNQVhfVVBMT0FE
X1NJWkU6CisgICAgICBwcmludCAoIk5vdCB1cGxvYWRpbmcgdGhlIHBhdGNoIGZvciAiICsgcGF0
Y2hbMF0gKworICAgICAgICAgICAgICIgYmVjYXVzZSB0aGUgZmlsZSBpcyB0b28gbGFyZ2UuIikK
KyAgICAgIGNvbnRpbnVlCisgICAgZm9ybV9maWVsZHMgPSBbKCJmaWxlbmFtZSIsIHBhdGNoWzBd
KV0KKyAgICBpZiBub3Qgb3B0aW9ucy5kb3dubG9hZF9iYXNlOgorICAgICAgZm9ybV9maWVsZHMu
YXBwZW5kKCgiY29udGVudF91cGxvYWQiLCAiMSIpKQorICAgIGZpbGVzID0gWygiZGF0YSIsICJk
YXRhLmRpZmYiLCBwYXRjaFsxXSldCisgICAgY3R5cGUsIGJvZHkgPSBFbmNvZGVNdWx0aXBhcnRG
b3JtRGF0YShmb3JtX2ZpZWxkcywgZmlsZXMpCisgICAgdXJsID0gIi8lZC91cGxvYWRfcGF0Y2gv
JWQiICUgKGludChpc3N1ZSksIGludChwYXRjaHNldCkpCisgICAgcHJpbnQgIlVwbG9hZGluZyBw
YXRjaCBmb3IgIiArIHBhdGNoWzBdCisgICAgcmVzcG9uc2VfYm9keSA9IHJwY19zZXJ2ZXIuU2Vu
ZCh1cmwsIGJvZHksIGNvbnRlbnRfdHlwZT1jdHlwZSkKKyAgICBsaW5lcyA9IHJlc3BvbnNlX2Jv
ZHkuc3BsaXRsaW5lcygpCisgICAgaWYgbm90IGxpbmVzIG9yIGxpbmVzWzBdICE9ICJPSyI6Cisg
ICAgICBTdGF0dXNVcGRhdGUoIiAgLS0+ICVzIiAlIHJlc3BvbnNlX2JvZHkpCisgICAgICBzeXMu
ZXhpdCgxKQorICAgIHJ2LmFwcGVuZChbbGluZXNbMV0sIHBhdGNoWzBdXSkKKyAgcmV0dXJuIHJ2
CisKKworZGVmIEd1ZXNzVkNTTmFtZSgpOgorICAiIiJIZWxwZXIgdG8gZ3Vlc3MgdGhlIHZlcnNp
b24gY29udHJvbCBzeXN0ZW0uCisKKyAgVGhpcyBleGFtaW5lcyB0aGUgY3VycmVudCBkaXJlY3Rv
cnksIGd1ZXNzZXMgd2hpY2ggVmVyc2lvbkNvbnRyb2xTeXN0ZW0KKyAgd2UncmUgdXNpbmcsIGFu
ZCByZXR1cm5zIGFuIHN0cmluZyBpbmRpY2F0aW5nIHdoaWNoIFZDUyBpcyBkZXRlY3RlZC4KKwor
ICBSZXR1cm5zOgorICAgIEEgcGFpciAodmNzLCBvdXRwdXQpLiAgdmNzIGlzIGEgc3RyaW5nIGlu
ZGljYXRpbmcgd2hpY2ggVkNTIHdhcyBkZXRlY3RlZAorICAgIGFuZCBpcyBvbmUgb2YgVkNTX0dJ
VCwgVkNTX01FUkNVUklBTCwgVkNTX1NVQlZFUlNJT04sIG9yIFZDU19VTktOT1dOLgorICAgIG91
dHB1dCBpcyBhIHN0cmluZyBjb250YWluaW5nIGFueSBpbnRlcmVzdGluZyBvdXRwdXQgZnJvbSB0
aGUgdmNzCisgICAgZGV0ZWN0aW9uIHJvdXRpbmUsIG9yIE5vbmUgaWYgdGhlcmUgaXMgbm90aGlu
ZyBpbnRlcmVzdGluZy4KKyAgIiIiCisgICMgTWVyY3VyaWFsIGhhcyBhIGNvbW1hbmQgdG8gZ2V0
IHRoZSBiYXNlIGRpcmVjdG9yeSBvZiBhIHJlcG9zaXRvcnkKKyAgIyBUcnkgcnVubmluZyBpdCwg
YnV0IGRvbid0IGRpZSBpZiB3ZSBkb24ndCBoYXZlIGhnIGluc3RhbGxlZC4KKyAgIyBOT1RFOiB3
ZSB0cnkgTWVyY3VyaWFsIGZpcnN0IGFzIGl0IGNhbiBzaXQgb24gdG9wIG9mIGFuIFNWTiB3b3Jr
aW5nIGNvcHkuCisgIHRyeToKKyAgICBvdXQsIHJldHVybmNvZGUgPSBSdW5TaGVsbFdpdGhSZXR1
cm5Db2RlKFsiaGciLCAicm9vdCJdKQorICAgIGlmIHJldHVybmNvZGUgPT0gMDoKKyAgICAgIHJl
dHVybiAoVkNTX01FUkNVUklBTCwgb3V0LnN0cmlwKCkpCisgIGV4Y2VwdCBPU0Vycm9yLCAoZXJy
bm8sIG1lc3NhZ2UpOgorICAgIGlmIGVycm5vICE9IDI6ICAjIEVOT0VOVCAtLSB0aGV5IGRvbid0
IGhhdmUgaGcgaW5zdGFsbGVkLgorICAgICAgcmFpc2UKKworICAjIFN1YnZlcnNpb24gaGFzIGEg
LnN2biBpbiBhbGwgd29ya2luZyBkaXJlY3Rvcmllcy4KKyAgaWYgb3MucGF0aC5pc2RpcignLnN2
bicpOgorICAgIGxvZ2dpbmcuaW5mbygiR3Vlc3NlZCBWQ1MgPSBTdWJ2ZXJzaW9uIikKKyAgICBy
ZXR1cm4gKFZDU19TVUJWRVJTSU9OLCBOb25lKQorCisgICMgR2l0IGhhcyBhIGNvbW1hbmQgdG8g
dGVzdCBpZiB5b3UncmUgaW4gYSBnaXQgdHJlZS4KKyAgIyBUcnkgcnVubmluZyBpdCwgYnV0IGRv
bid0IGRpZSBpZiB3ZSBkb24ndCBoYXZlIGdpdCBpbnN0YWxsZWQuCisgIHRyeToKKyAgICBvdXQs
IHJldHVybmNvZGUgPSBSdW5TaGVsbFdpdGhSZXR1cm5Db2RlKFsiZ2l0IiwgInJldi1wYXJzZSIs
CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi0taXMtaW5z
aWRlLXdvcmstdHJlZSJdKQorICAgIGlmIHJldHVybmNvZGUgPT0gMDoKKyAgICAgIHJldHVybiAo
VkNTX0dJVCwgTm9uZSkKKyAgZXhjZXB0IE9TRXJyb3IsIChlcnJubywgbWVzc2FnZSk6CisgICAg
aWYgZXJybm8gIT0gMjogICMgRU5PRU5UIC0tIHRoZXkgZG9uJ3QgaGF2ZSBnaXQgaW5zdGFsbGVk
LgorICAgICAgcmFpc2UKKworICByZXR1cm4gKFZDU19VTktOT1dOLCBOb25lKQorCisKK2RlZiBH
dWVzc1ZDUyhvcHRpb25zKToKKyAgIiIiSGVscGVyIHRvIGd1ZXNzIHRoZSB2ZXJzaW9uIGNvbnRy
b2wgc3lzdGVtLgorCisgIFRoaXMgdmVyaWZpZXMgYW55IHVzZXItc3BlY2lmaWVkIFZlcnNpb25D
b250cm9sU3lzdGVtIChieSBjb21tYW5kIGxpbmUKKyAgb3IgZW52aXJvbm1lbnQgdmFyaWFibGUp
LiAgSWYgdGhlIHVzZXIgZGlkbid0IHNwZWNpZnkgb25lLCB0aGlzIGV4YW1pbmVzCisgIHRoZSBj
dXJyZW50IGRpcmVjdG9yeSwgZ3Vlc3NlcyB3aGljaCBWZXJzaW9uQ29udHJvbFN5c3RlbSB3ZSdy
ZSB1c2luZywKKyAgYW5kIHJldHVybnMgYW4gaW5zdGFuY2Ugb2YgdGhlIGFwcHJvcHJpYXRlIGNs
YXNzLiAgRXhpdCB3aXRoIGFuIGVycm9yCisgIGlmIHdlIGNhbid0IGZpZ3VyZSBpdCBvdXQuCisK
KyAgUmV0dXJuczoKKyAgICBBIFZlcnNpb25Db250cm9sU3lzdGVtIGluc3RhbmNlLiBFeGl0cyBp
ZiB0aGUgVkNTIGNhbid0IGJlIGd1ZXNzZWQuCisgICIiIgorICB2Y3MgPSBvcHRpb25zLnZjcwor
ICBpZiBub3QgdmNzOgorICAgIHZjcyA9IG9zLmVudmlyb24uZ2V0KCJDT0RFUkVWSUVXX1ZDUyIp
CisgIGlmIHZjczoKKyAgICB2ID0gVkNTX0FCQlJFVklBVElPTlMuZ2V0KHZjcy5sb3dlcigpKQor
ICAgIGlmIHYgaXMgTm9uZToKKyAgICAgIEVycm9yRXhpdCgiVW5rbm93biB2ZXJzaW9uIGNvbnRy
b2wgc3lzdGVtICVyIHNwZWNpZmllZC4iICUgdmNzKQorICAgICh2Y3MsIGV4dHJhX291dHB1dCkg
PSAodiwgTm9uZSkKKyAgZWxzZToKKyAgICAodmNzLCBleHRyYV9vdXRwdXQpID0gR3Vlc3NWQ1NO
YW1lKCkKKworICBpZiB2Y3MgPT0gVkNTX01FUkNVUklBTDoKKyAgICBpZiBleHRyYV9vdXRwdXQg
aXMgTm9uZToKKyAgICAgIGV4dHJhX291dHB1dCA9IFJ1blNoZWxsKFsiaGciLCAicm9vdCJdKS5z
dHJpcCgpCisgICAgcmV0dXJuIE1lcmN1cmlhbFZDUyhvcHRpb25zLCBleHRyYV9vdXRwdXQpCisg
IGVsaWYgdmNzID09IFZDU19TVUJWRVJTSU9OOgorICAgIHJldHVybiBTdWJ2ZXJzaW9uVkNTKG9w
dGlvbnMpCisgIGVsaWYgdmNzID09IFZDU19HSVQ6CisgICAgcmV0dXJuIEdpdFZDUyhvcHRpb25z
KQorCisgIEVycm9yRXhpdCgoIkNvdWxkIG5vdCBndWVzcyB2ZXJzaW9uIGNvbnRyb2wgc3lzdGVt
LiAiCisgICAgICAgICAgICAgIkFyZSB5b3UgaW4gYSB3b3JraW5nIGNvcHkgZGlyZWN0b3J5PyIp
KQorCisKK2RlZiBDaGVja1Jldmlld2VyKHJldmlld2VyKToKKyAgIiIiVmFsaWRhdGUgYSByZXZp
ZXdlciAtLSBlaXRoZXIgYSBuaWNrbmFtZSBvciBhbiBlbWFpbCBhZGRyZXMuCisKKyAgQXJnczoK
KyAgICByZXZpZXdlcjogQSBuaWNrbmFtZSBvciBhbiBlbWFpbCBhZGRyZXNzLgorCisgIENhbGxz
IEVycm9yRXhpdCgpIGlmIGl0IGlzIGFuIGludmFsaWQgZW1haWwgYWRkcmVzcy4KKyAgIiIiCisg
IGlmICJAIiBub3QgaW4gcmV2aWV3ZXI6CisgICAgcmV0dXJuICAjIEFzc3VtZSBuaWNrbmFtZQor
ICBwYXJ0cyA9IHJldmlld2VyLnNwbGl0KCJAIikKKyAgaWYgbGVuKHBhcnRzKSA+IDI6CisgICAg
RXJyb3JFeGl0KCJJbnZhbGlkIGVtYWlsIGFkZHJlc3M6ICVyIiAlIHJldmlld2VyKQorICBhc3Nl
cnQgbGVuKHBhcnRzKSA9PSAyCisgIGlmICIuIiBub3QgaW4gcGFydHNbMV06CisgICAgRXJyb3JF
eGl0KCJJbnZhbGlkIGVtYWlsIGFkZHJlc3M6ICVyIiAlIHJldmlld2VyKQorCisKK2RlZiBMb2Fk
U3VidmVyc2lvbkF1dG9Qcm9wZXJ0aWVzKCk6CisgICIiIlJldHVybnMgdGhlIGNvbnRlbnQgb2Yg
W2F1dG8tcHJvcHNdIHNlY3Rpb24gb2YgU3VidmVyc2lvbidzIGNvbmZpZyBmaWxlIGFzCisgIGEg
ZGljdGlvbmFyeS4KKworICBSZXR1cm5zOgorICAgIEEgZGljdGlvbmFyeSB3aG9zZSBrZXktdmFs
dWUgcGFpciBjb3JyZXNwb25kcyB0aGUgW2F1dG8tcHJvcHNdIHNlY3Rpb24ncworICAgICAga2V5
LXZhbHVlIHBhaXIuCisgICAgSW4gZm9sbG93aW5nIGNhc2VzLCByZXR1cm5zIGVtcHR5IGRpY3Rp
b25hcnk6CisgICAgICAtIGNvbmZpZyBmaWxlIGRvZXNuJ3QgZXhpc3QsIG9yCisgICAgICAtICdl
bmFibGUtYXV0by1wcm9wcycgaXMgbm90IHNldCB0byAndHJ1ZS1saWtlLXZhbHVlJyBpbiBbbWlz
Y2VsbGFueV0uCisgICIiIgorICAjIFRvZG8oaGF5YXRvKTogV2luZG93cyB1c2VycyBtaWdodCB1
c2UgZGlmZmVyZW50IHBhdGggZm9yIGNvbmZpZ3VyYXRpb24gZmlsZS4KKyAgc3VidmVyc2lvbl9j
b25maWcgPSBvcy5wYXRoLmV4cGFuZHVzZXIoIn4vLnN1YnZlcnNpb24vY29uZmlnIikKKyAgaWYg
bm90IG9zLnBhdGguZXhpc3RzKHN1YnZlcnNpb25fY29uZmlnKToKKyAgICByZXR1cm4ge30KKyAg
Y29uZmlnID0gQ29uZmlnUGFyc2VyLkNvbmZpZ1BhcnNlcigpCisgIGNvbmZpZy5yZWFkKHN1YnZl
cnNpb25fY29uZmlnKQorICBpZiAoY29uZmlnLmhhc19zZWN0aW9uKCJtaXNjZWxsYW55IikgYW5k
CisgICAgICBjb25maWcuaGFzX29wdGlvbigibWlzY2VsbGFueSIsICJlbmFibGUtYXV0by1wcm9w
cyIpIGFuZAorICAgICAgY29uZmlnLmdldGJvb2xlYW4oIm1pc2NlbGxhbnkiLCAiZW5hYmxlLWF1
dG8tcHJvcHMiKSBhbmQKKyAgICAgIGNvbmZpZy5oYXNfc2VjdGlvbigiYXV0by1wcm9wcyIpKToK
KyAgICBwcm9wcyA9IHt9CisgICAgZm9yIGZpbGVfcGF0dGVybiBpbiBjb25maWcub3B0aW9ucygi
YXV0by1wcm9wcyIpOgorICAgICAgcHJvcHNbZmlsZV9wYXR0ZXJuXSA9IFBhcnNlU3VidmVyc2lv
blByb3BlcnR5VmFsdWVzKAorICAgICAgICBjb25maWcuZ2V0KCJhdXRvLXByb3BzIiwgZmlsZV9w
YXR0ZXJuKSkKKyAgICByZXR1cm4gcHJvcHMKKyAgZWxzZToKKyAgICByZXR1cm4ge30KKworZGVm
IFBhcnNlU3VidmVyc2lvblByb3BlcnR5VmFsdWVzKHByb3BzKToKKyAgIiIiUGFyc2UgdGhlIGdp
dmVuIHByb3BlcnR5IHZhbHVlIHdoaWNoIGNvbWVzIGZyb20gW2F1dG8tcHJvcHNdIHNlY3Rpb24g
YW5kCisgIHJldHVybnMgYSBsaXN0IHdob3NlIGVsZW1lbnQgaXMgYSAoc3ZuX3Byb3Bfa2V5LCBz
dm5fcHJvcF92YWx1ZSkgcGFpci4KKworICBTZWUgdGhlIGZvbGxvd2luZyBkb2N0ZXN0IGZvciBl
eGFtcGxlLgorCisgID4+PiBQYXJzZVN1YnZlcnNpb25Qcm9wZXJ0eVZhbHVlcygnc3ZuOmVvbC1z
dHlsZT1MRicpCisgIFsoJ3N2bjplb2wtc3R5bGUnLCAnTEYnKV0KKyAgPj4+IFBhcnNlU3VidmVy
c2lvblByb3BlcnR5VmFsdWVzKCdzdm46bWltZS10eXBlPWltYWdlL2pwZWcnKQorICBbKCdzdm46
bWltZS10eXBlJywgJ2ltYWdlL2pwZWcnKV0KKyAgPj4+IFBhcnNlU3VidmVyc2lvblByb3BlcnR5
VmFsdWVzKCdzdm46ZW9sLXN0eWxlPUxGO3N2bjpleGVjdXRhYmxlJykKKyAgWygnc3ZuOmVvbC1z
dHlsZScsICdMRicpLCAoJ3N2bjpleGVjdXRhYmxlJywgJyonKV0KKyAgIiIiCisgIGtleV92YWx1
ZV9wYWlycyA9IFtdCisgIGZvciBwcm9wIGluIHByb3BzLnNwbGl0KCI7Iik6CisgICAga2V5X3Zh
bHVlID0gcHJvcC5zcGxpdCgiPSIpCisgICAgYXNzZXJ0IGxlbihrZXlfdmFsdWUpIDw9IDIKKyAg
ICBpZiBsZW4oa2V5X3ZhbHVlKSA9PSAxOgorICAgICAgIyBJZiB2YWx1ZSBpcyBub3QgZ2l2ZW4s
IHVzZSAnKicgYXMgYSBTdWJ2ZXJzaW9uJ3MgY29udmVudGlvbi4KKyAgICAgIGtleV92YWx1ZV9w
YWlycy5hcHBlbmQoKGtleV92YWx1ZVswXSwgIioiKSkKKyAgICBlbHNlOgorICAgICAga2V5X3Zh
bHVlX3BhaXJzLmFwcGVuZCgoa2V5X3ZhbHVlWzBdLCBrZXlfdmFsdWVbMV0pKQorICByZXR1cm4g
a2V5X3ZhbHVlX3BhaXJzCisKKworZGVmIEdldFN1YnZlcnNpb25Qcm9wZXJ0eUNoYW5nZXMoZmls
ZW5hbWUpOgorICAiIiJSZXR1cm4gYSBTdWJ2ZXJzaW9uJ3MgJ1Byb3BlcnR5IGNoYW5nZXMgb24g
Li4uJyBzdHJpbmcsIHdoaWNoIGlzIHVzZWQgaW4KKyAgdGhlIHBhdGNoIGZpbGUuCisKKyAgQXJn
czoKKyAgICBmaWxlbmFtZTogZmlsZW5hbWUgd2hvc2UgcHJvcGVydHkgbWlnaHQgYmUgc2V0IGJ5
IFthdXRvLXByb3BzXSBjb25maWcuCisKKyAgUmV0dXJuczoKKyAgICBBIHN0cmluZyBsaWtlICdQ
cm9wZXJ0eSBjaGFuZ2VzIG9uIHxmaWxlbmFtZXwgLi4uJyBpZiBnaXZlbiB8ZmlsZW5hbWV8Cisg
ICAgICBtYXRjaGVzIGFueSBlbnRyaWVzIGluIFthdXRvLXByb3BzXSBzZWN0aW9uLiBOb25lLCBv
dGhlcndpc2UuCisgICIiIgorICBnbG9iYWwgc3ZuX2F1dG9fcHJvcHNfbWFwCisgIGlmIHN2bl9h
dXRvX3Byb3BzX21hcCBpcyBOb25lOgorICAgIHN2bl9hdXRvX3Byb3BzX21hcCA9IExvYWRTdWJ2
ZXJzaW9uQXV0b1Byb3BlcnRpZXMoKQorCisgIGFsbF9wcm9wcyA9IFtdCisgIGZvciBmaWxlX3Bh
dHRlcm4sIHByb3BzIGluIHN2bl9hdXRvX3Byb3BzX21hcC5pdGVtcygpOgorICAgIGlmIGZubWF0
Y2guZm5tYXRjaChmaWxlbmFtZSwgZmlsZV9wYXR0ZXJuKToKKyAgICAgIGFsbF9wcm9wcy5leHRl
bmQocHJvcHMpCisgIGlmIGFsbF9wcm9wczoKKyAgICByZXR1cm4gRm9ybWF0U3VidmVyc2lvblBy
b3BlcnR5Q2hhbmdlcyhmaWxlbmFtZSwgYWxsX3Byb3BzKQorICByZXR1cm4gTm9uZQorCisKK2Rl
ZiBGb3JtYXRTdWJ2ZXJzaW9uUHJvcGVydHlDaGFuZ2VzKGZpbGVuYW1lLCBwcm9wcyk6CisgICIi
IlJldHVybnMgU3VidmVyc2lvbidzICdQcm9wZXJ0eSBjaGFuZ2VzIG9uIC4uLicgc3RyaW5ncyB1
c2luZyBnaXZlbiBmaWxlbmFtZQorICBhbmQgcHJvcGVydGllcy4KKworICBBcmdzOgorICAgIGZp
bGVuYW1lOiBmaWxlbmFtZQorICAgIHByb3BzOiBBIGxpc3Qgd2hvc2UgZWxlbWVudCBpcyBhIChz
dm5fcHJvcF9rZXksIHN2bl9wcm9wX3ZhbHVlKSBwYWlyLgorCisgIFJldHVybnM6CisgICAgQSBz
dHJpbmcgd2hpY2ggY2FuIGJlIHVzZWQgaW4gdGhlIHBhdGNoIGZpbGUgZm9yIFN1YnZlcnNpb24u
CisKKyAgU2VlIHRoZSBmb2xsb3dpbmcgZG9jdGVzdCBmb3IgZXhhbXBsZS4KKworICA+Pj4gcHJp
bnQgRm9ybWF0U3VidmVyc2lvblByb3BlcnR5Q2hhbmdlcygnZm9vLmNjJywgWygnc3ZuOmVvbC1z
dHlsZScsICdMRicpXSkKKyAgUHJvcGVydHkgY2hhbmdlcyBvbjogZm9vLmNjCisgIF9fX19fX19f
X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f
X18KKyAgQWRkZWQ6IHN2bjplb2wtc3R5bGUKKyAgICAgKyBMRgorICA8QkxBTktMSU5FPgorICAi
IiIKKyAgcHJvcF9jaGFuZ2VzX2xpbmVzID0gWworICAgICJQcm9wZXJ0eSBjaGFuZ2VzIG9uOiAl
cyIgJSBmaWxlbmFtZSwKKyAgICAiX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f
X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXyJdCisgIGZvciBrZXksIHZhbHVlIGluIHBy
b3BzOgorICAgIHByb3BfY2hhbmdlc19saW5lcy5hcHBlbmQoIkFkZGVkOiAiICsga2V5KQorICAg
IHByb3BfY2hhbmdlc19saW5lcy5hcHBlbmQoIiAgICsgIiArIHZhbHVlKQorICByZXR1cm4gIlxu
Ii5qb2luKHByb3BfY2hhbmdlc19saW5lcykgKyAiXG4iCisKKworZGVmIFJlYWxNYWluKGFyZ3Ys
IGRhdGE9Tm9uZSk6CisgICIiIlRoZSByZWFsIG1haW4gZnVuY3Rpb24uCisKKyAgQXJnczoKKyAg
ICBhcmd2OiBDb21tYW5kIGxpbmUgYXJndW1lbnRzLgorICAgIGRhdGE6IERpZmYgY29udGVudHMu
IElmIE5vbmUgKGRlZmF1bHQpIHRoZSBkaWZmIGlzIGdlbmVyYXRlZCBieQorICAgICAgdGhlIFZl
cnNpb25Db250cm9sU3lzdGVtIGltcGxlbWVudGF0aW9uIHJldHVybmVkIGJ5IEd1ZXNzVkNTKCku
CisKKyAgUmV0dXJuczoKKyAgICBBIDItdHVwbGUgKGlzc3VlIGlkLCBwYXRjaHNldCBpZCkuCisg
ICAgVGhlIHBhdGNoc2V0IGlkIGlzIE5vbmUgaWYgdGhlIGJhc2UgZmlsZXMgYXJlIG5vdCB1cGxv
YWRlZCBieSB0aGlzCisgICAgc2NyaXB0IChhcHBsaWVzIG9ubHkgdG8gU1ZOIGNoZWNrb3V0cyku
CisgICIiIgorICBsb2dnaW5nLmJhc2ljQ29uZmlnKGZvcm1hdD0oIiUoYXNjdGltZSkuMTlzICUo
bGV2ZWxuYW1lKXMgJShmaWxlbmFtZSlzOiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICIlKGxpbmVubylzICUobWVzc2FnZSlzICIpKQorICBvcy5lbnZpcm9uWydMQ19BTEwnXSA9ICdD
JworICBvcHRpb25zLCBhcmdzID0gcGFyc2VyLnBhcnNlX2FyZ3MoYXJndlsxOl0pCisgIGdsb2Jh
bCB2ZXJib3NpdHkKKyAgdmVyYm9zaXR5ID0gb3B0aW9ucy52ZXJib3NlCisgIGlmIHZlcmJvc2l0
eSA+PSAzOgorICAgIGxvZ2dpbmcuZ2V0TG9nZ2VyKCkuc2V0TGV2ZWwobG9nZ2luZy5ERUJVRykK
KyAgZWxpZiB2ZXJib3NpdHkgPj0gMjoKKyAgICBsb2dnaW5nLmdldExvZ2dlcigpLnNldExldmVs
KGxvZ2dpbmcuSU5GTykKKworICB2Y3MgPSBHdWVzc1ZDUyhvcHRpb25zKQorCisgIGJhc2UgPSBv
cHRpb25zLmJhc2VfdXJsCisgIGlmIGlzaW5zdGFuY2UodmNzLCBTdWJ2ZXJzaW9uVkNTKToKKyAg
ICAjIEd1ZXNzaW5nIHRoZSBiYXNlIGZpZWxkIGlzIG9ubHkgc3VwcG9ydGVkIGZvciBTdWJ2ZXJz
aW9uLgorICAgICMgTm90ZTogRmV0Y2hpbmcgYmFzZSBmaWxlcyBtYXkgYmVjb21lIGRlcHJlY2F0
ZWQgaW4gZnV0dXJlIHJlbGVhc2VzLgorICAgIGd1ZXNzZWRfYmFzZSA9IHZjcy5HdWVzc0Jhc2Uo
b3B0aW9ucy5kb3dubG9hZF9iYXNlKQorICAgIGlmIGJhc2U6CisgICAgICBpZiBndWVzc2VkX2Jh
c2UgYW5kIGJhc2UgIT0gZ3Vlc3NlZF9iYXNlOgorICAgICAgICBwcmludCAiVXNpbmcgYmFzZSBV
UkwgXCIlc1wiIGZyb20gLS1iYXNlX3VybCBpbnN0ZWFkIG9mIFwiJXNcIiIgJSBcCisgICAgICAg
ICAgICAoYmFzZSwgZ3Vlc3NlZF9iYXNlKQorICAgIGVsc2U6CisgICAgICBiYXNlID0gZ3Vlc3Nl
ZF9iYXNlCisKKyAgaWYgbm90IGJhc2UgYW5kIG9wdGlvbnMuZG93bmxvYWRfYmFzZToKKyAgICBv
cHRpb25zLmRvd25sb2FkX2Jhc2UgPSBUcnVlCisgICAgbG9nZ2luZy5pbmZvKCJFbmFibGVkIHVw
bG9hZCBvZiBiYXNlIGZpbGUiKQorICBpZiBub3Qgb3B0aW9ucy5hc3N1bWVfeWVzOgorICAgIHZj
cy5DaGVja0ZvclVua25vd25GaWxlcygpCisgIGlmIGRhdGEgaXMgTm9uZToKKyAgICBkYXRhID0g
dmNzLkdlbmVyYXRlRGlmZihhcmdzKQorICBmaWxlcyA9IHZjcy5HZXRCYXNlRmlsZXMoZGF0YSkK
KyAgaWYgdmVyYm9zaXR5ID49IDE6CisgICAgcHJpbnQgIlVwbG9hZCBzZXJ2ZXI6Iiwgb3B0aW9u
cy5zZXJ2ZXIsICIoY2hhbmdlIHdpdGggLXMvLS1zZXJ2ZXIpIgorICBpZiBvcHRpb25zLmlzc3Vl
OgorICAgIHByb21wdCA9ICJNZXNzYWdlIGRlc2NyaWJpbmcgdGhpcyBwYXRjaCBzZXQ6ICIKKyAg
ZWxzZToKKyAgICBwcm9tcHQgPSAiTmV3IGlzc3VlIHN1YmplY3Q6ICIKKyAgbWVzc2FnZSA9IG9w
dGlvbnMubWVzc2FnZSBvciByYXdfaW5wdXQocHJvbXB0KS5zdHJpcCgpCisgIGlmIG5vdCBtZXNz
YWdlOgorICAgIEVycm9yRXhpdCgiQSBub24tZW1wdHkgbWVzc2FnZSBpcyByZXF1aXJlZCIpCisg
IHJwY19zZXJ2ZXIgPSBHZXRScGNTZXJ2ZXIob3B0aW9ucykKKyAgZm9ybV9maWVsZHMgPSBbKCJz
dWJqZWN0IiwgbWVzc2FnZSldCisgIGlmIGJhc2U6CisgICAgZm9ybV9maWVsZHMuYXBwZW5kKCgi
YmFzZSIsIGJhc2UpKQorICBpZiBvcHRpb25zLmlzc3VlOgorICAgIGZvcm1fZmllbGRzLmFwcGVu
ZCgoImlzc3VlIiwgc3RyKG9wdGlvbnMuaXNzdWUpKSkKKyAgaWYgb3B0aW9ucy5lbWFpbDoKKyAg
ICBmb3JtX2ZpZWxkcy5hcHBlbmQoKCJ1c2VyIiwgb3B0aW9ucy5lbWFpbCkpCisgIGlmIG9wdGlv
bnMucmV2aWV3ZXJzOgorICAgIGZvciByZXZpZXdlciBpbiBvcHRpb25zLnJldmlld2Vycy5zcGxp
dCgnLCcpOgorICAgICAgQ2hlY2tSZXZpZXdlcihyZXZpZXdlcikKKyAgICBmb3JtX2ZpZWxkcy5h
cHBlbmQoKCJyZXZpZXdlcnMiLCBvcHRpb25zLnJldmlld2VycykpCisgIGlmIG9wdGlvbnMuY2M6
CisgICAgZm9yIGNjIGluIG9wdGlvbnMuY2Muc3BsaXQoJywnKToKKyAgICAgIENoZWNrUmV2aWV3
ZXIoY2MpCisgICAgZm9ybV9maWVsZHMuYXBwZW5kKCgiY2MiLCBvcHRpb25zLmNjKSkKKyAgZGVz
Y3JpcHRpb24gPSBvcHRpb25zLmRlc2NyaXB0aW9uCisgIGlmIG9wdGlvbnMuZGVzY3JpcHRpb25f
ZmlsZToKKyAgICBpZiBvcHRpb25zLmRlc2NyaXB0aW9uOgorICAgICAgRXJyb3JFeGl0KCJDYW4n
dCBzcGVjaWZ5IGRlc2NyaXB0aW9uIGFuZCBkZXNjcmlwdGlvbl9maWxlIikKKyAgICBmaWxlID0g
b3BlbihvcHRpb25zLmRlc2NyaXB0aW9uX2ZpbGUsICdyJykKKyAgICBkZXNjcmlwdGlvbiA9IGZp
bGUucmVhZCgpCisgICAgZmlsZS5jbG9zZSgpCisgIGlmIGRlc2NyaXB0aW9uOgorICAgIGZvcm1f
ZmllbGRzLmFwcGVuZCgoImRlc2NyaXB0aW9uIiwgZGVzY3JpcHRpb24pKQorICAjIFNlbmQgYSBo
YXNoIG9mIGFsbCB0aGUgYmFzZSBmaWxlIHNvIHRoZSBzZXJ2ZXIgY2FuIGRldGVybWluZSBpZiBh
IGNvcHkKKyAgIyBhbHJlYWR5IGV4aXN0cyBpbiBhbiBlYXJsaWVyIHBhdGNoc2V0LgorICBiYXNl
X2hhc2hlcyA9ICIiCisgIGZvciBmaWxlLCBpbmZvIGluIGZpbGVzLml0ZXJpdGVtcygpOgorICAg
IGlmIG5vdCBpbmZvWzBdIGlzIE5vbmU6CisgICAgICBjaGVja3N1bSA9IG1kNShpbmZvWzBdKS5o
ZXhkaWdlc3QoKQorICAgICAgaWYgYmFzZV9oYXNoZXM6CisgICAgICAgIGJhc2VfaGFzaGVzICs9
ICJ8IgorICAgICAgYmFzZV9oYXNoZXMgKz0gY2hlY2tzdW0gKyAiOiIgKyBmaWxlCisgIGZvcm1f
ZmllbGRzLmFwcGVuZCgoImJhc2VfaGFzaGVzIiwgYmFzZV9oYXNoZXMpKQorICBpZiBvcHRpb25z
LnByaXZhdGU6CisgICAgaWYgb3B0aW9ucy5pc3N1ZToKKyAgICAgIHByaW50ICJXYXJuaW5nOiBQ
cml2YXRlIGZsYWcgaWdub3JlZCB3aGVuIHVwZGF0aW5nIGFuIGV4aXN0aW5nIGlzc3VlLiIKKyAg
ICBlbHNlOgorICAgICAgZm9ybV9maWVsZHMuYXBwZW5kKCgicHJpdmF0ZSIsICIxIikpCisgICMg
SWYgd2UncmUgdXBsb2FkaW5nIGJhc2UgZmlsZXMsIGRvbid0IHNlbmQgdGhlIGVtYWlsIGJlZm9y
ZSB0aGUgdXBsb2Fkcywgc28KKyAgIyB0aGF0IGl0IGNvbnRhaW5zIHRoZSBmaWxlIHN0YXR1cy4K
KyAgaWYgb3B0aW9ucy5zZW5kX21haWwgYW5kIG9wdGlvbnMuZG93bmxvYWRfYmFzZToKKyAgICBm
b3JtX2ZpZWxkcy5hcHBlbmQoKCJzZW5kX21haWwiLCAiMSIpKQorICBpZiBub3Qgb3B0aW9ucy5k
b3dubG9hZF9iYXNlOgorICAgIGZvcm1fZmllbGRzLmFwcGVuZCgoImNvbnRlbnRfdXBsb2FkIiwg
IjEiKSkKKyAgaWYgbGVuKGRhdGEpID4gTUFYX1VQTE9BRF9TSVpFOgorICAgIHByaW50ICJQYXRj
aCBpcyBsYXJnZSwgc28gdXBsb2FkaW5nIGZpbGUgcGF0Y2hlcyBzZXBhcmF0ZWx5LiIKKyAgICB1
cGxvYWRlZF9kaWZmX2ZpbGUgPSBbXQorICAgIGZvcm1fZmllbGRzLmFwcGVuZCgoInNlcGFyYXRl
X3BhdGNoZXMiLCAiMSIpKQorICBlbHNlOgorICAgIHVwbG9hZGVkX2RpZmZfZmlsZSA9IFsoImRh
dGEiLCAiZGF0YS5kaWZmIiwgZGF0YSldCisgIGN0eXBlLCBib2R5ID0gRW5jb2RlTXVsdGlwYXJ0
Rm9ybURhdGEoZm9ybV9maWVsZHMsIHVwbG9hZGVkX2RpZmZfZmlsZSkKKyAgcmVzcG9uc2VfYm9k
eSA9IHJwY19zZXJ2ZXIuU2VuZCgiL3VwbG9hZCIsIGJvZHksIGNvbnRlbnRfdHlwZT1jdHlwZSkK
KyAgcGF0Y2hzZXQgPSBOb25lCisgIGlmIG5vdCBvcHRpb25zLmRvd25sb2FkX2Jhc2Ugb3Igbm90
IHVwbG9hZGVkX2RpZmZfZmlsZToKKyAgICBsaW5lcyA9IHJlc3BvbnNlX2JvZHkuc3BsaXRsaW5l
cygpCisgICAgaWYgbGVuKGxpbmVzKSA+PSAyOgorICAgICAgbXNnID0gbGluZXNbMF0KKyAgICAg
IHBhdGNoc2V0ID0gbGluZXNbMV0uc3RyaXAoKQorICAgICAgcGF0Y2hlcyA9IFt4LnNwbGl0KCIg
IiwgMSkgZm9yIHggaW4gbGluZXNbMjpdXQorICAgIGVsc2U6CisgICAgICBtc2cgPSByZXNwb25z
ZV9ib2R5CisgIGVsc2U6CisgICAgbXNnID0gcmVzcG9uc2VfYm9keQorICBTdGF0dXNVcGRhdGUo
bXNnKQorICBpZiBub3QgcmVzcG9uc2VfYm9keS5zdGFydHN3aXRoKCJJc3N1ZSBjcmVhdGVkLiIp
IGFuZCBcCisgIG5vdCByZXNwb25zZV9ib2R5LnN0YXJ0c3dpdGgoIklzc3VlIHVwZGF0ZWQuIik6
CisgICAgc3lzLmV4aXQoMCkKKyAgaXNzdWUgPSBtc2dbbXNnLnJmaW5kKCIvIikrMTpdCisKKyAg
aWYgbm90IHVwbG9hZGVkX2RpZmZfZmlsZToKKyAgICByZXN1bHQgPSBVcGxvYWRTZXBhcmF0ZVBh
dGNoZXMoaXNzdWUsIHJwY19zZXJ2ZXIsIHBhdGNoc2V0LCBkYXRhLCBvcHRpb25zKQorICAgIGlm
IG5vdCBvcHRpb25zLmRvd25sb2FkX2Jhc2U6CisgICAgICBwYXRjaGVzID0gcmVzdWx0CisKKyAg
aWYgbm90IG9wdGlvbnMuZG93bmxvYWRfYmFzZToKKyAgICB2Y3MuVXBsb2FkQmFzZUZpbGVzKGlz
c3VlLCBycGNfc2VydmVyLCBwYXRjaGVzLCBwYXRjaHNldCwgb3B0aW9ucywgZmlsZXMpCisgICAg
aWYgb3B0aW9ucy5zZW5kX21haWw6CisgICAgICBycGNfc2VydmVyLlNlbmQoIi8iICsgaXNzdWUg
KyAiL21haWwiLCBwYXlsb2FkPSIiKQorICByZXR1cm4gaXNzdWUsIHBhdGNoc2V0CisKKworZGVm
IG1haW4oKToKKyAgdHJ5OgorICAgIFJlYWxNYWluKHN5cy5hcmd2KQorICBleGNlcHQgS2V5Ym9h
cmRJbnRlcnJ1cHQ6CisgICAgcHJpbnQKKyAgICBTdGF0dXNVcGRhdGUoIkludGVycnVwdGVkLiIp
CisgICAgc3lzLmV4aXQoMSkKKworCitpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgorICBtYWlu
KCkKZGlmZiAtLWdpdCBhL1dlYktpdFRvb2xzL1NjcmlwdHMvd2Via2l0cHkvdG9vbC9jb21tYW5k
cy9xdWV1ZXNfdW5pdHRlc3QucHkgYi9XZWJLaXRUb29scy9TY3JpcHRzL3dlYmtpdHB5L3Rvb2wv
Y29tbWFuZHMvcXVldWVzX3VuaXR0ZXN0LnB5CmluZGV4IGE0MjVlOTAuLjI0YjRlZjcgMTAwNjQ0
Ci0tLSBhL1dlYktpdFRvb2xzL1NjcmlwdHMvd2Via2l0cHkvdG9vbC9jb21tYW5kcy9xdWV1ZXNf
dW5pdHRlc3QucHkKKysrIGIvV2ViS2l0VG9vbHMvU2NyaXB0cy93ZWJraXRweS90b29sL2NvbW1h
bmRzL3F1ZXVlc191bml0dGVzdC5weQpAQCAtNjgsNiArNjgsNyBAQCBjbGFzcyBBYnN0cmFjdFF1
ZXVlVGVzdChDb21tYW5kc1Rlc3QpOgogICAgIGRlZiBfYXNzZXJ0X3J1bl93ZWJraXRfcGF0Y2go
c2VsZiwgcnVuX2FyZ3MpOgogICAgICAgICBxdWV1ZSA9IFRlc3RRdWV1ZSgpCiAgICAgICAgIHRv
b2wgPSBNb2NrVG9vbCgpCisgICAgICAgIHRvb2wuZXhlY3V0aXZlID0gTW9jaygpCiAgICAgICAg
IHF1ZXVlLmJpbmRfdG9fdG9vbCh0b29sKQogCiAgICAgICAgIHF1ZXVlLnJ1bl93ZWJraXRfcGF0
Y2gocnVuX2FyZ3MpCmRpZmYgLS1naXQgYS9XZWJLaXRUb29scy9TY3JpcHRzL3dlYmtpdHB5L3Rv
b2wvY29tbWFuZHMvdXBsb2FkLnB5IGIvV2ViS2l0VG9vbHMvU2NyaXB0cy93ZWJraXRweS90b29s
L2NvbW1hbmRzL3VwbG9hZC5weQppbmRleCA2ZTY4ZmJlLi5kZDBhYzEzIDEwMDY0NAotLS0gYS9X
ZWJLaXRUb29scy9TY3JpcHRzL3dlYmtpdHB5L3Rvb2wvY29tbWFuZHMvdXBsb2FkLnB5CisrKyBi
L1dlYktpdFRvb2xzL1NjcmlwdHMvd2Via2l0cHkvdG9vbC9jb21tYW5kcy91cGxvYWQucHkKQEAg
LTE2NCw2ICsxNjQsNyBAQCBjbGFzcyBQb3N0KEFic3RyYWN0UGF0Y2hVcGxvYWRpbmdDb21tYW5k
KToKICAgICBzdGVwcyA9IFsKICAgICAgICAgc3RlcHMuQ2hlY2tTdHlsZSwKICAgICAgICAgc3Rl
cHMuQ29uZmlybURpZmYsCisgICAgICAgIHN0ZXBzLlBvc3RDb2RlUmV2aWV3LAogICAgICAgICBz
dGVwcy5PYnNvbGV0ZVBhdGNoZXMsCiAgICAgICAgIHN0ZXBzLlBvc3REaWZmLAogICAgIF0KQEAg
LTIwOCw2ICsyMDksNyBAQCBjbGFzcyBVcGxvYWQoQWJzdHJhY3RQYXRjaFVwbG9hZGluZ0NvbW1h
bmQpOgogICAgICAgICBzdGVwcy5QcmVwYXJlQ2hhbmdlTG9nLAogICAgICAgICBzdGVwcy5FZGl0
Q2hhbmdlTG9nLAogICAgICAgICBzdGVwcy5Db25maXJtRGlmZiwKKyAgICAgICAgc3RlcHMuUG9z
dENvZGVSZXZpZXcsCiAgICAgICAgIHN0ZXBzLk9ic29sZXRlUGF0Y2hlcywKICAgICAgICAgc3Rl
cHMuUG9zdERpZmYsCiAgICAgXQpkaWZmIC0tZ2l0IGEvV2ViS2l0VG9vbHMvU2NyaXB0cy93ZWJr
aXRweS90b29sL2NvbW1hbmRzL3VwbG9hZF91bml0dGVzdC5weSBiL1dlYktpdFRvb2xzL1Njcmlw
dHMvd2Via2l0cHkvdG9vbC9jb21tYW5kcy91cGxvYWRfdW5pdHRlc3QucHkKaW5kZXggNGU5ODdj
OS4uOTc2NmUxOSAxMDA2NDQKLS0tIGEvV2ViS2l0VG9vbHMvU2NyaXB0cy93ZWJraXRweS90b29s
L2NvbW1hbmRzL3VwbG9hZF91bml0dGVzdC5weQorKysgYi9XZWJLaXRUb29scy9TY3JpcHRzL3dl
YmtpdHB5L3Rvb2wvY29tbWFuZHMvdXBsb2FkX3VuaXR0ZXN0LnB5CkBAIC01OCw2ICs1OCw3IEBA
IGNsYXNzIFVwbG9hZENvbW1hbmRzVGVzdChDb21tYW5kc1Rlc3QpOgogICAgICAgICBvcHRpb25z
LmRlc2NyaXB0aW9uID0gIk1PQ0sgZGVzY3JpcHRpb24iCiAgICAgICAgIG9wdGlvbnMucmVxdWVz
dF9jb21taXQgPSBGYWxzZQogICAgICAgICBvcHRpb25zLnJldmlldyA9IFRydWUKKyAgICAgICAg
b3B0aW9ucy5jYyA9IE5vbmUKICAgICAgICAgZXhwZWN0ZWRfc3RkZXJyID0gIlJ1bm5pbmcgY2hl
Y2std2Via2l0LXN0eWxlXG5PYnNvbGV0aW5nIDIgb2xkIHBhdGNoZXMgb24gYnVnIDQyXG5NT0NL
IGFkZF9wYXRjaF90b19idWc6IGJ1Z19pZD00MiwgZGVzY3JpcHRpb249TU9DSyBkZXNjcmlwdGlv
biwgbWFya19mb3JfcmV2aWV3PVRydWUsIG1hcmtfZm9yX2NvbW1pdF9xdWV1ZT1GYWxzZSwgbWFy
a19mb3JfbGFuZGluZz1GYWxzZVxuLS0gQmVnaW4gY29tbWVudCAtLVxuTm9uZVxuLS0gRW5kIGNv
bW1lbnQgLS1cbk1PQ0s6IHVzZXIub3Blbl91cmw6IGh0dHA6Ly9leGFtcGxlLmNvbS80MlxuIgog
ICAgICAgICBzZWxmLmFzc2VydF9leGVjdXRlX291dHB1dHMoUG9zdCgpLCBbNDJdLCBvcHRpb25z
PW9wdGlvbnMsIGV4cGVjdGVkX3N0ZGVycj1leHBlY3RlZF9zdGRlcnIpCiAKQEAgLTc3LDYgKzc4
LDcgQEAgY2xhc3MgVXBsb2FkQ29tbWFuZHNUZXN0KENvbW1hbmRzVGVzdCk6CiAgICAgICAgIG9w
dGlvbnMuZGVzY3JpcHRpb24gPSAiTU9DSyBkZXNjcmlwdGlvbiIKICAgICAgICAgb3B0aW9ucy5y
ZXF1ZXN0X2NvbW1pdCA9IEZhbHNlCiAgICAgICAgIG9wdGlvbnMucmV2aWV3ID0gVHJ1ZQorICAg
ICAgICBvcHRpb25zLmNjID0gTm9uZQogICAgICAgICBleHBlY3RlZF9zdGRlcnIgPSAiUnVubmlu
ZyBjaGVjay13ZWJraXQtc3R5bGVcbk9ic29sZXRpbmcgMiBvbGQgcGF0Y2hlcyBvbiBidWcgNDJc
bk1PQ0sgYWRkX3BhdGNoX3RvX2J1ZzogYnVnX2lkPTQyLCBkZXNjcmlwdGlvbj1NT0NLIGRlc2Ny
aXB0aW9uLCBtYXJrX2Zvcl9yZXZpZXc9VHJ1ZSwgbWFya19mb3JfY29tbWl0X3F1ZXVlPUZhbHNl
LCBtYXJrX2Zvcl9sYW5kaW5nPUZhbHNlXG4tLSBCZWdpbiBjb21tZW50IC0tXG5Ob25lXG4tLSBF
bmQgY29tbWVudCAtLVxuTU9DSzogdXNlci5vcGVuX3VybDogaHR0cDovL2V4YW1wbGUuY29tLzQy
XG4iCiAgICAgICAgIHNlbGYuYXNzZXJ0X2V4ZWN1dGVfb3V0cHV0cyhVcGxvYWQoKSwgWzQyXSwg
b3B0aW9ucz1vcHRpb25zLCBleHBlY3RlZF9zdGRlcnI9ZXhwZWN0ZWRfc3RkZXJyKQogCmRpZmYg
LS1naXQgYS9XZWJLaXRUb29scy9TY3JpcHRzL3dlYmtpdHB5L3Rvb2wvbWFpbi5weSBiL1dlYktp
dFRvb2xzL1NjcmlwdHMvd2Via2l0cHkvdG9vbC9tYWluLnB5CmluZGV4IDYyOWU4NmYuLmRkNzY1
MmQgMTAwNzU1Ci0tLSBhL1dlYktpdFRvb2xzL1NjcmlwdHMvd2Via2l0cHkvdG9vbC9tYWluLnB5
CisrKyBiL1dlYktpdFRvb2xzL1NjcmlwdHMvd2Via2l0cHkvdG9vbC9tYWluLnB5CkBAIC0zNiw2
ICszNiw3IEBAIGZyb20gd2Via2l0cHkuY29tbW9uLmNoZWNrb3V0LmFwaSBpbXBvcnQgQ2hlY2tv
dXQKIGZyb20gd2Via2l0cHkuY29tbW9uLmNoZWNrb3V0LnNjbSBpbXBvcnQgZGV0ZWN0X3NjbV9z
eXN0ZW0KIGZyb20gd2Via2l0cHkuY29tbW9uLm5ldC5idWd6aWxsYSBpbXBvcnQgQnVnemlsbGEK
IGZyb20gd2Via2l0cHkuY29tbW9uLm5ldC5idWlsZGJvdCBpbXBvcnQgQnVpbGRCb3QKK2Zyb20g
d2Via2l0cHkuY29tbW9uLm5ldC5yaWV0dmVsZCBpbXBvcnQgUmlldHZlbGQKIGZyb20gd2Via2l0
cHkuY29tbW9uLm5ldC5pcmMuaXJjcHJveHkgaW1wb3J0IElSQ1Byb3h5CiBmcm9tIHdlYmtpdHB5
LmNvbW1vbi5zeXN0ZW0uZXhlY3V0aXZlIGltcG9ydCBFeGVjdXRpdmUKIGZyb20gd2Via2l0cHku
Y29tbW9uLnN5c3RlbS51c2VyIGltcG9ydCBVc2VyCkBAIC03MCw2ICs3MSw3IEBAIGNsYXNzIFdl
YktpdFBhdGNoKE11bHRpQ29tbWFuZFRvb2wpOgogICAgICAgICBzZWxmLl9zY20gPSBOb25lCiAg
ICAgICAgIHNlbGYuX2NoZWNrb3V0ID0gTm9uZQogICAgICAgICBzZWxmLnN0YXR1c19zZXJ2ZXIg
PSBTdGF0dXNTZXJ2ZXIoKQorICAgICAgICBzZWxmLmNvZGVyZXZpZXcgPSBSaWV0dmVsZChzZWxm
LmV4ZWN1dGl2ZSkKIAogICAgIGRlZiBzY20oc2VsZik6CiAgICAgICAgICMgTGF6aWx5IGluaXRp
YWxpemUgU0NNIHRvIG5vdCBlcnJvci1vdXQgYmVmb3JlIGNvbW1hbmQgbGluZSBwYXJzaW5nIChv
ciB3aGVuIHJ1bm5pbmcgbm9uLXNjbSBjb21tYW5kcykuCkBAIC0xMjEsNiArMTIzLDcgQEAgY2xh
c3MgV2ViS2l0UGF0Y2goTXVsdGlDb21tYW5kVG9vbCk6CiAgICAgICAgIGlmIG9wdGlvbnMuZHJ5
X3J1bjoKICAgICAgICAgICAgIHNlbGYuc2NtKCkuZHJ5cnVuID0gVHJ1ZQogICAgICAgICAgICAg
c2VsZi5idWdzLmRyeXJ1biA9IFRydWUKKyAgICAgICAgICAgIHNlbGYuY29kZXJldmlldy5kcnly
dW4gPSBUcnVlCiAgICAgICAgIGlmIG9wdGlvbnMuc3RhdHVzX2hvc3Q6CiAgICAgICAgICAgICBz
ZWxmLnN0YXR1c19zZXJ2ZXIuc2V0X2hvc3Qob3B0aW9ucy5zdGF0dXNfaG9zdCkKICAgICAgICAg
aWYgb3B0aW9ucy5pcmNfcGFzc3dvcmQ6CmRpZmYgLS1naXQgYS9XZWJLaXRUb29scy9TY3JpcHRz
L3dlYmtpdHB5L3Rvb2wvbW9ja3Rvb2wucHkgYi9XZWJLaXRUb29scy9TY3JpcHRzL3dlYmtpdHB5
L3Rvb2wvbW9ja3Rvb2wucHkKaW5kZXggODlmZGU2YS4uNmU0YjY0ZiAxMDA2NDQKLS0tIGEvV2Vi
S2l0VG9vbHMvU2NyaXB0cy93ZWJraXRweS90b29sL21vY2t0b29sLnB5CisrKyBiL1dlYktpdFRv
b2xzL1NjcmlwdHMvd2Via2l0cHkvdG9vbC9tb2NrdG9vbC5weQpAQCAtMzMsNiArMzMsNyBAQCBm
cm9tIHdlYmtpdHB5LmNvbW1vbi5jb25maWcuY29tbWl0dGVycyBpbXBvcnQgQ29tbWl0dGVyTGlz
dCwgUmV2aWV3ZXIKIGZyb20gd2Via2l0cHkuY29tbW9uLmNoZWNrb3V0LmNvbW1pdGluZm8gaW1w
b3J0IENvbW1pdEluZm8KIGZyb20gd2Via2l0cHkuY29tbW9uLmNoZWNrb3V0LnNjbSBpbXBvcnQg
Q29tbWl0TWVzc2FnZQogZnJvbSB3ZWJraXRweS5jb21tb24ubmV0LmJ1Z3ppbGxhIGltcG9ydCBC
dWcsIEF0dGFjaG1lbnQKK2Zyb20gd2Via2l0cHkuY29tbW9uLm5ldC5yaWV0dmVsZCBpbXBvcnQg
UmlldHZlbGQKIGZyb20gd2Via2l0cHkudGhpcmRwYXJ0eS5tb2NrIGltcG9ydCBNb2NrCiBmcm9t
IHdlYmtpdHB5LmNvbW1vbi5zeXN0ZW0uZGVwcmVjYXRlZF9sb2dnaW5nIGltcG9ydCBsb2cKIApA
QCAtNDMsNiArNDQsNyBAQCBkZWYgX2lkX3RvX29iamVjdF9kaWN0aW9uYXJ5KCpvYmplY3RzKToK
ICAgICAgICAgZGljdGlvbmFyeVt0aGluZ1siaWQiXV0gPSB0aGluZwogICAgIHJldHVybiBkaWN0
aW9uYXJ5CiAKKyMgVGVzdGluZwogCiAjIEZJWE1FOiBUaGUgaWRzIHNob3VsZCBiZSAxLCAyLCAz
IGluc3RlYWQgb2YgY3JhenkgbnVtYmVycy4KIApAQCAtNDg4LDEzICs0OTAsMTggQEAgY2xhc3Mg
TW9ja1N0YXR1c1NlcnZlcihvYmplY3QpOgogICAgICAgICByZXR1cm4gMTkxCiAKIAorY2xhc3Mg
TW9ja0V4ZWN1dGUoTW9jayk6CisgICAgZGVmIHJ1bl9hbmRfdGhyb3dfaWZfZmFpbChzZWxmLCBh
cmdzLCBxdWlldD1GYWxzZSk6CisgICAgICAgIHJldHVybiAiTU9DSyBvdXRwdXQgb2YgY2hpbGQg
cHJvY2VzcyIKKworCiBjbGFzcyBNb2NrVG9vbCgpOgogCiAgICAgZGVmIF9faW5pdF9fKHNlbGYs
IGxvZ19leGVjdXRpdmU9RmFsc2UpOgogICAgICAgICBzZWxmLndha2V1cF9ldmVudCA9IHRocmVh
ZGluZy5FdmVudCgpCiAgICAgICAgIHNlbGYuYnVncyA9IE1vY2tCdWd6aWxsYSgpCiAgICAgICAg
IHNlbGYuYnVpbGRib3QgPSBNb2NrQnVpbGRCb3QoKQotICAgICAgICBzZWxmLmV4ZWN1dGl2ZSA9
IE1vY2soKQorICAgICAgICBzZWxmLmV4ZWN1dGl2ZSA9IE1vY2tFeGVjdXRlKCkKICAgICAgICAg
aWYgbG9nX2V4ZWN1dGl2ZToKICAgICAgICAgICAgIHNlbGYuZXhlY3V0aXZlLnJ1bl9hbmRfdGhy
b3dfaWZfZmFpbCA9IGxhbWJkYSBhcmdzOiBsb2coIk1PQ0sgcnVuX2FuZF90aHJvd19pZl9mYWls
OiAlcyIgJSBhcmdzKQogICAgICAgICBzZWxmLl9pcmMgPSBOb25lCkBAIC01MDMsNiArNTEwLDcg
QEAgY2xhc3MgTW9ja1Rvb2woKToKICAgICAgICAgc2VsZi5fY2hlY2tvdXQgPSBNb2NrQ2hlY2tv
dXQoKQogICAgICAgICBzZWxmLnN0YXR1c19zZXJ2ZXIgPSBNb2NrU3RhdHVzU2VydmVyKCkKICAg
ICAgICAgc2VsZi5pcmNfcGFzc3dvcmQgPSAiTU9DSyBpcmMgcGFzc3dvcmQiCisgICAgICAgIHNl
bGYuY29kZXJldmlldyA9IFJpZXR2ZWxkKHNlbGYuZXhlY3V0aXZlKQogCiAgICAgZGVmIHNjbShz
ZWxmKToKICAgICAgICAgcmV0dXJuIHNlbGYuX3NjbQpkaWZmIC0tZ2l0IGEvV2ViS2l0VG9vbHMv
U2NyaXB0cy93ZWJraXRweS90b29sL3N0ZXBzL19faW5pdF9fLnB5IGIvV2ViS2l0VG9vbHMvU2Ny
aXB0cy93ZWJraXRweS90b29sL3N0ZXBzL19faW5pdF9fLnB5CmluZGV4IDhlOGFiMTUuLmQ1OWNk
YzUgMTAwNjQ0Ci0tLSBhL1dlYktpdFRvb2xzL1NjcmlwdHMvd2Via2l0cHkvdG9vbC9zdGVwcy9f
X2luaXRfXy5weQorKysgYi9XZWJLaXRUb29scy9TY3JpcHRzL3dlYmtpdHB5L3Rvb2wvc3RlcHMv
X19pbml0X18ucHkKQEAgLTQ0LDYgKzQ0LDcgQEAgZnJvbSB3ZWJraXRweS50b29sLnN0ZXBzLmVu
c3VyZWJ1aWxkZXJzYXJlZ3JlZW4gaW1wb3J0IEVuc3VyZUJ1aWxkZXJzQXJlR3JlZW4KIGZyb20g
d2Via2l0cHkudG9vbC5zdGVwcy5lbnN1cmVsb2NhbGNvbW1pdGlmbmVlZGVkIGltcG9ydCBFbnN1
cmVMb2NhbENvbW1pdElmTmVlZGVkCiBmcm9tIHdlYmtpdHB5LnRvb2wuc3RlcHMub2Jzb2xldGVw
YXRjaGVzIGltcG9ydCBPYnNvbGV0ZVBhdGNoZXMKIGZyb20gd2Via2l0cHkudG9vbC5zdGVwcy5v
cHRpb25zIGltcG9ydCBPcHRpb25zCitmcm9tIHdlYmtpdHB5LnRvb2wuc3RlcHMucG9zdGNvZGVy
ZXZpZXcgaW1wb3J0IFBvc3RDb2RlUmV2aWV3CiBmcm9tIHdlYmtpdHB5LnRvb2wuc3RlcHMucG9z
dGRpZmYgaW1wb3J0IFBvc3REaWZmCiBmcm9tIHdlYmtpdHB5LnRvb2wuc3RlcHMucG9zdGRpZmZm
b3Jjb21taXQgaW1wb3J0IFBvc3REaWZmRm9yQ29tbWl0CiBmcm9tIHdlYmtpdHB5LnRvb2wuc3Rl
cHMucG9zdGRpZmZmb3JyZXZlcnQgaW1wb3J0IFBvc3REaWZmRm9yUmV2ZXJ0CmRpZmYgLS1naXQg
YS9XZWJLaXRUb29scy9TY3JpcHRzL3dlYmtpdHB5L3Rvb2wvc3RlcHMvb3B0aW9ucy5weSBiL1dl
YktpdFRvb2xzL1NjcmlwdHMvd2Via2l0cHkvdG9vbC9zdGVwcy9vcHRpb25zLnB5CmluZGV4IDQw
YTY2ODAuLjdmNzZmNTUgMTAwNjQ0Ci0tLSBhL1dlYktpdFRvb2xzL1NjcmlwdHMvd2Via2l0cHkv
dG9vbC9zdGVwcy9vcHRpb25zLnB5CisrKyBiL1dlYktpdFRvb2xzL1NjcmlwdHMvd2Via2l0cHkv
dG9vbC9zdGVwcy9vcHRpb25zLnB5CkBAIC00MCw2ICs0MCw3IEBAIGNsYXNzIE9wdGlvbnMob2Jq
ZWN0KToKICAgICBjb25maXJtID0gbWFrZV9vcHRpb24oIi0tbm8tY29uZmlybSIsIGFjdGlvbj0i
c3RvcmVfZmFsc2UiLCBkZXN0PSJjb25maXJtIiwgZGVmYXVsdD1UcnVlLCBoZWxwPSJTa2lwIGNv
bmZpcm1hdGlvbiBzdGVwcy4iKQogICAgIGRlc2NyaXB0aW9uID0gbWFrZV9vcHRpb24oIi1tIiwg
Ii0tZGVzY3JpcHRpb24iLCBhY3Rpb249InN0b3JlIiwgdHlwZT0ic3RyaW5nIiwgZGVzdD0iZGVz
Y3JpcHRpb24iLCBoZWxwPSJEZXNjcmlwdGlvbiBzdHJpbmcgZm9yIHRoZSBhdHRhY2htZW50IChk
ZWZhdWx0OiBcInBhdGNoXCIpIikKICAgICBlbWFpbCA9IG1ha2Vfb3B0aW9uKCItLWVtYWlsIiwg
YWN0aW9uPSJzdG9yZSIsIHR5cGU9InN0cmluZyIsIGRlc3Q9ImVtYWlsIiwgaGVscD0iRW1haWwg
YWRkcmVzcyB0byB1c2UgaW4gQ2hhbmdlTG9ncy4iKQorICAgIGZhbmN5X3JldmlldyA9IG1ha2Vf
b3B0aW9uKCItLWZhbmN5LXJldmlldyIsIGFjdGlvbj0ic3RvcmVfdHJ1ZSIsIGRlc3Q9ImZhbmN5
X3JldmlldyIsIGRlZmF1bHQ9RmFsc2UsIGhlbHA9IihFeHBlcmltZW50YWwpIFVwbG9hZCB0aGUg
cGF0Y2ggdG8gUmlldHZlbGQgY29kZSByZXZpZXcgdG9vbC4iKQogICAgIGZvcmNlX2NsZWFuID0g
bWFrZV9vcHRpb24oIi0tZm9yY2UtY2xlYW4iLCBhY3Rpb249InN0b3JlX3RydWUiLCBkZXN0PSJm
b3JjZV9jbGVhbiIsIGRlZmF1bHQ9RmFsc2UsIGhlbHA9IkNsZWFuIHdvcmtpbmcgZGlyZWN0b3J5
IGJlZm9yZSBhcHBseWluZyBwYXRjaGVzIChyZW1vdmVzIGxvY2FsIGNoYW5nZXMgYW5kIGNvbW1p
dHMpIikKICAgICBsb2NhbF9jb21taXQgPSBtYWtlX29wdGlvbigiLS1sb2NhbC1jb21taXQiLCBh
Y3Rpb249InN0b3JlX3RydWUiLCBkZXN0PSJsb2NhbF9jb21taXQiLCBkZWZhdWx0PUZhbHNlLCBo
ZWxwPSJNYWtlIGEgbG9jYWwgY29tbWl0IGZvciBlYWNoIGFwcGxpZWQgcGF0Y2giKQogICAgIG5v
bl9pbnRlcmFjdGl2ZSA9IG1ha2Vfb3B0aW9uKCItLW5vbi1pbnRlcmFjdGl2ZSIsIGFjdGlvbj0i
c3RvcmVfdHJ1ZSIsIGRlc3Q9Im5vbl9pbnRlcmFjdGl2ZSIsIGRlZmF1bHQ9RmFsc2UsIGhlbHA9
Ik5ldmVyIHByb21wdCB0aGUgdXNlciwgZmFpbCBhcyBmYXN0IGFzIHBvc3NpYmxlLiIpCmRpZmYg
LS1naXQgYS9XZWJLaXRUb29scy9TY3JpcHRzL3dlYmtpdHB5L3Rvb2wvc3RlcHMvcG9zdGNvZGVy
ZXZpZXcucHkgYi9XZWJLaXRUb29scy9TY3JpcHRzL3dlYmtpdHB5L3Rvb2wvc3RlcHMvcG9zdGNv
ZGVyZXZpZXcucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjcwY2U2Ywot
LS0gL2Rldi9udWxsCisrKyBiL1dlYktpdFRvb2xzL1NjcmlwdHMvd2Via2l0cHkvdG9vbC9zdGVw
cy9wb3N0Y29kZXJldmlldy5weQpAQCAtMCwwICsxLDc2IEBACisjIENvcHlyaWdodCAoQykgMjAx
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
ZnJvbSB3ZWJraXRweS50b29sLnN0ZXBzLmFic3RyYWN0c3RlcCBpbXBvcnQgQWJzdHJhY3RTdGVw
Citmcm9tIHdlYmtpdHB5LnRvb2wuc3RlcHMub3B0aW9ucyBpbXBvcnQgT3B0aW9ucworCisKK2Ns
YXNzIFBvc3RDb2RlUmV2aWV3KEFic3RyYWN0U3RlcCk6CisgICAgQGNsYXNzbWV0aG9kCisgICAg
ZGVmIG9wdGlvbnMoY2xzKToKKyAgICAgICAgcmV0dXJuIFsKKyAgICAgICAgICAgIE9wdGlvbnMu
Y2MsCisgICAgICAgICAgICBPcHRpb25zLmRlc2NyaXB0aW9uLAorICAgICAgICAgICAgT3B0aW9u
cy5mYW5jeV9yZXZpZXcsCisgICAgICAgICAgICBPcHRpb25zLnJldmlldywKKyAgICAgICAgXQor
CisgICAgZGVmIHJ1bihzZWxmLCBzdGF0ZSk6CisgICAgICAgIGlmIG5vdCBzZWxmLl9vcHRpb25z
LmZhbmN5X3JldmlldzoKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBpZiBub3Qgc2VsZi5f
b3B0aW9ucy5yZXZpZXc6CisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgIyBGSVhNRTogVGhp
cyB3aWxsIGFsd2F5cyBiZSBOb25lIGJlY2F1c2Ugd2UgZG9uJ3QgcmV0cmlldmUgdGhlIGlzc3Vl
CisgICAgICAgICMgICAgICAgIG51bWJlciBmcm1vIHRoZSBDaGFuZ2VMb2cgeWV0LgorICAgICAg
ICBjb2RlcmV2aWV3X2lzc3VlID0gc3RhdGUuZ2V0KCJjb2RlcmV2aWV3X2lzc3VlIikKKyAgICAg
ICAgbWVzc2FnZSA9IHNlbGYuX29wdGlvbnMuZGVzY3JpcHRpb24KKyAgICAgICAgaWYgbm90IG1l
c3NhZ2U6CisgICAgICAgICAgICAjIElmIHdlIGhhdmUgYW4gaXNzdWUgbnVtYmVyLCB0aGVuIHRo
ZSBtZXNzYWdlIGJlY2F1c2UgdGhlIGxhYmVsCisgICAgICAgICAgICAjIG9mIHRoZSBuZXcgcGF0
Y2guIE90aGVyd2lzZSwgaXQgYmVjb21lcyB0aGUgdGl0bGUgb2YgdGhlIHdob2xlCisgICAgICAg
ICAgICAjIGlzc3VlLgorICAgICAgICAgICAgaWYgY29kZXJldmlld19pc3N1ZToKKyAgICAgICAg
ICAgICAgICBtZXNzYWdlID0gIlVwZGF0ZWQgcGF0Y2giCisgICAgICAgICAgICBlbGlmIHN0YXRl
LmdldCgiYnVnX3RpdGxlIik6CisgICAgICAgICAgICAgICAgIyBUaGlzIGlzIHRoZSBjb21tb24g
Y2FzZSBmb3IgdGhlIHRoZSBmaXJzdCAidXBsb2FkIiBjb21tYW5kLgorICAgICAgICAgICAgICAg
IG1lc3NhZ2UgPSBzdGF0ZS5nZXQoImJ1Z190aXRsZSIpCisgICAgICAgICAgICBlbGlmIHN0YXRl
LmdldCgiYnVnX2lkIik6CisgICAgICAgICAgICAgICAgIyBUaGlzIGlzIHRoZSBjb21tb24gY2Fz
ZSBmb3IgdGhlICJwb3N0IiBjb21tYW5kIGFuZAorICAgICAgICAgICAgICAgICMgc3Vic2VxdWVu
dCBydW5zIG9mIHRoZSAidXBsb2FkIiBjb21tYW5kLiAgSW4gdGhpcyBjYXNlLAorICAgICAgICAg
ICAgICAgICMgSSdkIHJhdGhlciBhZGQgdGhlIG5ldyBwYXRjaCB0byB0aGUgZXhpc3RpbmcgaXNz
dWUsIGJ1dAorICAgICAgICAgICAgICAgICMgdGhhdCdzIG5vdCBpbXBsZW1lbnRlZCB5ZXQuCisg
ICAgICAgICAgICAgICAgbWVzc2FnZSA9ICJDb2RlIHJldmlldyBmb3IgJXMiICUgc2VsZi5fdG9v
bC5idWdzLmJ1Z191cmxfZm9yX2J1Z19pZChzdGF0ZVsiYnVnX2lkIl0pCisgICAgICAgICAgICBl
bHNlOgorICAgICAgICAgICAgICAgICMgVW5yZWFjaGFibGUgd2l0aCBvdXIgY3VycmVudCBjb21t
YW5kcywgYnV0IHdlIG1pZ2h0IGhpdAorICAgICAgICAgICAgICAgICMgdGhpcyBjYXNlIGlmIHdl
IHN1cHBvcnQgYnVnLWxlc3MgY29kZSByZXZpZXdzLgorICAgICAgICAgICAgICAgIG1lc3NhZ2Ug
PSAiQ29kZSByZXZpZXciCisgICAgICAgIGNyZWF0ZWRfaXNzdWUgPSBzZWxmLl90b29sLmNvZGVy
ZXZpZXcucG9zdChtZXNzYWdlPW1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICBjb2RlcmV2aWV3X2lzc3VlPWNvZGVyZXZpZXdfaXNzdWUs
CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYz1z
ZWxmLl9vcHRpb25zLmNjKQorICAgICAgICBpZiBjcmVhdGVkX2lzc3VlOgorICAgICAgICAgICAg
IyBGSVhNRTogUmVjb3JkIHRoZSBpc3N1ZSBudW1iZXIgaW4gdGhlIENoYW5nZUxvZy4KKyAgICAg
ICAgICAgIHN0YXRlWyJjb2RlcmV2aWV3X2lzc3VlIl0gPSBjcmVhdGVkX2lzc3VlCmRpZmYgLS1n
aXQgYS9XZWJLaXRUb29scy9TY3JpcHRzL3dlYmtpdHB5L3Rvb2wvc3RlcHMvcG9zdGRpZmYucHkg
Yi9XZWJLaXRUb29scy9TY3JpcHRzL3dlYmtpdHB5L3Rvb2wvc3RlcHMvcG9zdGRpZmYucHkKaW5k
ZXggZWY4ZjRjOC4uNWIyODM4MyAxMDA2NDQKLS0tIGEvV2ViS2l0VG9vbHMvU2NyaXB0cy93ZWJr
aXRweS90b29sL3N0ZXBzL3Bvc3RkaWZmLnB5CisrKyBiL1dlYktpdFRvb2xzL1NjcmlwdHMvd2Vi
a2l0cHkvdG9vbC9zdGVwcy9wb3N0ZGlmZi5weQpAQCAtNDYsNiArNDYsMTAgQEAgY2xhc3MgUG9z
dERpZmYoQWJzdHJhY3RTdGVwKToKICAgICAgICAgZGlmZiA9IHNlbGYuY2FjaGVkX2xvb2t1cChz
dGF0ZSwgImRpZmYiKQogICAgICAgICBkaWZmX2ZpbGUgPSBTdHJpbmdJTy5TdHJpbmdJTyhkaWZm
KSAjIGFkZF9wYXRjaF90b19idWcgZXhwZWN0cyBhIGZpbGUtbGlrZSBvYmplY3QKICAgICAgICAg
ZGVzY3JpcHRpb24gPSBzZWxmLl9vcHRpb25zLmRlc2NyaXB0aW9uIG9yICJQYXRjaCIKLSAgICAg
ICAgc2VsZi5fdG9vbC5idWdzLmFkZF9wYXRjaF90b19idWcoc3RhdGVbImJ1Z19pZCJdLCBkaWZm
X2ZpbGUsIGRlc2NyaXB0aW9uLCBtYXJrX2Zvcl9yZXZpZXc9c2VsZi5fb3B0aW9ucy5yZXZpZXcs
IG1hcmtfZm9yX2NvbW1pdF9xdWV1ZT1zZWxmLl9vcHRpb25zLnJlcXVlc3RfY29tbWl0KQorICAg
ICAgICBjb21tZW50X3RleHQgPSBOb25lCisgICAgICAgIGNvZGVyZXZpZXdfaXNzdWUgPSBzdGF0
ZS5nZXQoImNvZGVyZXZpZXdfaXNzdWUiKQorICAgICAgICBpZiBjb2RlcmV2aWV3X2lzc3VlOgor
ICAgICAgICAgICAgY29tbWVudF90ZXh0ID0gIkZlZWwgZnJlZSB0byBwcm92aWRlIGNvbW1lbnRz
IGF0ICVzIiAlIHNlbGYuX3Rvb2wuY29kZXJldmlldy51cmxfZm9yX2lzc3VlKGNvZGVyZXZpZXdf
aXNzdWUpCisgICAgICAgIHNlbGYuX3Rvb2wuYnVncy5hZGRfcGF0Y2hfdG9fYnVnKHN0YXRlWyJi
dWdfaWQiXSwgZGlmZl9maWxlLCBkZXNjcmlwdGlvbiwgY29tbWVudF90ZXh0PWNvbW1lbnRfdGV4
dCwgbWFya19mb3JfcmV2aWV3PXNlbGYuX29wdGlvbnMucmV2aWV3LCBtYXJrX2Zvcl9jb21taXRf
cXVldWU9c2VsZi5fb3B0aW9ucy5yZXF1ZXN0X2NvbW1pdCkKICAgICAgICAgaWYgc2VsZi5fb3B0
aW9ucy5vcGVuX2J1ZzoKICAgICAgICAgICAgIHNlbGYuX3Rvb2wudXNlci5vcGVuX3VybChzZWxm
Ll90b29sLmJ1Z3MuYnVnX3VybF9mb3JfYnVnX2lkKHN0YXRlWyJidWdfaWQiXSkpCg==
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>53295</attachid>
            <date>2010-04-13 16:23:25 -0700</date>
            <delta_ts>2010-04-13 16:55:36 -0700</delta_ts>
            <desc>Patch</desc>
            <filename>bug-37418-20100413162324.patch</filename>
            <type>text/plain</type>
            <size>22541</size>
            <attacher name="Ojan Vafai">ojan</attacher>
            
              <data encoding="base64">ZGlmZiAtLWdpdCBhL1dlYktpdFRvb2xzL0NoYW5nZUxvZyBiL1dlYktpdFRvb2xzL0NoYW5nZUxv
ZwppbmRleCA1ZjU1ZjQ1Li4xY2UzYWYyIDEwMDY0NAotLS0gYS9XZWJLaXRUb29scy9DaGFuZ2VM
b2cKKysrIGIvV2ViS2l0VG9vbHMvQ2hhbmdlTG9nCkBAIC0xLDMgKzEsMzEgQEAKKzIwMTAtMDQt
MTMgIE9qYW4gVmFmYWkgIDxvamFuQGNocm9taXVtLm9yZz4KKworICAgICAgICBSZXZpZXdlZCBi
eSBOT0JPRFkgKE9PUFMhKS4KKworICAgICAgICBBZGQgZXhwZXJpbWVudGFsIHByb3RvdHlwZSBS
aWV0dmVsZCBpbnRlZ3JhdGlvbiB0byB3ZWJraXQtcGF0Y2ggdXBsb2FkCisgICAgICAgIGh0dHBz
Oi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0zNzQxOAorCisgICAgICAgIFRoaXMg
cGF0Y2ggYWRkcyBiYXJlLWJvbmVzIGludGVncnRpb24gd2l0aCBSaWV0dmVsZCBmb3IgY29kZSBy
ZXZpZXdzLgorICAgICAgICBUaGUgYmVoYXZpb3IgaXMgaGlkZGVuIGJlaGluZCB0aGUgLS1mYW5j
eS1yZXZpZXcgY29tbWFuZCBsaW5lIGZsYWcuCisgICAgICAgIEN1cnJlbnRseSwgdGhlcmUncyBu
byBzdXBwb3J0IGZvciB1cGxvYWRpbmcgbW9yZSB0aGFuIG9uZSBwYXRjaCBwZXIKKyAgICAgICAg
aXNzdWUgKHdoaWNoIGlzIGEgbmljZSBmZWF0dXJlIG9mIFJpZXR2ZWxkKS4gIFRoZSBwbGFuIGlz
IHRvIHBsYXkgd2l0aAorICAgICAgICB0aGlzIGZvciBhIGJpdCBhbmQgc2VlIGlmIGl0J3MgdXNl
ZnVsLgorCisgICAgICAgIE1vZGlmaWVkIGZyb20gQWRhbSdzIG9yaWdpbmFsIHBhdGNoIHRvIGF1
dG9pbnN0YWxsIHRoZSByaWV0dmVsZCB1cGxvYWQgc2NyaXB0LgorCisgICAgICAgICogU2NyaXB0
cy93ZWJraXRweS9jb21tb24vY29uZmlnL19faW5pdF9fLnB5OgorICAgICAgICAqIFNjcmlwdHMv
d2Via2l0cHkvY29tbW9uL25ldC9yaWV0dmVsZC5weTogQWRkZWQuCisgICAgICAgICogU2NyaXB0
cy93ZWJraXRweS9jb21tb24vbmV0L3JpZXR2ZWxkX3VuaXR0dGVzdC5weTogQWRkZWQuCisgICAg
ICAgICogU2NyaXB0cy93ZWJraXRweS90b29sL2NvbW1hbmRzL3F1ZXVlc191bml0dGVzdC5weToK
KyAgICAgICAgKiBTY3JpcHRzL3dlYmtpdHB5L3Rvb2wvY29tbWFuZHMvdXBsb2FkLnB5OgorICAg
ICAgICAqIFNjcmlwdHMvd2Via2l0cHkvdG9vbC9jb21tYW5kcy91cGxvYWRfdW5pdHRlc3QucHk6
CisgICAgICAgICogU2NyaXB0cy93ZWJraXRweS90b29sL21haW4ucHk6CisgICAgICAgICogU2Ny
aXB0cy93ZWJraXRweS90b29sL21vY2t0b29sLnB5OgorICAgICAgICAqIFNjcmlwdHMvd2Via2l0
cHkvdG9vbC9zdGVwcy9fX2luaXRfXy5weToKKyAgICAgICAgKiBTY3JpcHRzL3dlYmtpdHB5L3Rv
b2wvc3RlcHMvb3B0aW9ucy5weToKKyAgICAgICAgKiBTY3JpcHRzL3dlYmtpdHB5L3Rvb2wvc3Rl
cHMvcG9zdGNvZGVyZXZpZXcucHk6IEFkZGVkLgorICAgICAgICAqIFNjcmlwdHMvd2Via2l0cHkv
dG9vbC9zdGVwcy9wb3N0ZGlmZi5weToKKwogMjAxMC0wNC0xMyAgQ3NhYmEgT3N6dHJvZ29uw6Fj
ICA8b3NzeUB3ZWJraXQub3JnPgogCiAgICAgICAgIFVucmV2aWV3ZWQgYnVpbGRmaXggYWZ0ZXIg
cjU3NTM3LgpkaWZmIC0tZ2l0IGEvV2ViS2l0VG9vbHMvU2NyaXB0cy93ZWJraXRweS9jb21tb24v
Y29uZmlnL19faW5pdF9fLnB5IGIvV2ViS2l0VG9vbHMvU2NyaXB0cy93ZWJraXRweS9jb21tb24v
Y29uZmlnL19faW5pdF9fLnB5CmluZGV4IGVmNjViZWUuLjIyMThmMDIgMTAwNjQ0Ci0tLSBhL1dl
YktpdFRvb2xzL1NjcmlwdHMvd2Via2l0cHkvY29tbW9uL2NvbmZpZy9fX2luaXRfXy5weQorKysg
Yi9XZWJLaXRUb29scy9TY3JpcHRzL3dlYmtpdHB5L2NvbW1vbi9jb25maWcvX19pbml0X18ucHkK
QEAgLTEgKzEsNyBAQAogIyBSZXF1aXJlZCBmb3IgUHl0aG9uIHRvIHNlYXJjaCB0aGlzIGRpcmVj
dG9yeSBmb3IgbW9kdWxlIGZpbGVzCisKK2ltcG9ydCByZQorCitjb2RlcmV2aWV3X3NlcnZlcl9o
b3N0ID0gImNvZGVyZXZpZXcuYXBwc3BvdC5jb20iCitjb2RlcmV2aWV3X3NlcnZlcl9yZWdleCA9
ICJodHRwcz86Ly8lcy8iICUgcmUuc3ViKCdcLicsICdcXC4nLCBjb2RlcmV2aWV3X3NlcnZlcl9o
b3N0KQorY29kZXJldmlld19zZXJ2ZXJfdXJsID0gImh0dHBzOi8vJXMvIiAlIGNvZGVyZXZpZXdf
c2VydmVyX2hvc3QKZGlmZiAtLWdpdCBhL1dlYktpdFRvb2xzL1NjcmlwdHMvd2Via2l0cHkvY29t
bW9uL25ldC9yaWV0dmVsZC5weSBiL1dlYktpdFRvb2xzL1NjcmlwdHMvd2Via2l0cHkvY29tbW9u
L25ldC9yaWV0dmVsZC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYTNk
OWQwCi0tLSAvZGV2L251bGwKKysrIGIvV2ViS2l0VG9vbHMvU2NyaXB0cy93ZWJraXRweS9jb21t
b24vbmV0L3JpZXR2ZWxkLnB5CkBAIC0wLDAgKzEsODYgQEAKKyMgQ29weXJpZ2h0IChjKSAyMDEw
IEdvb2dsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisjCisjIFJlZGlzdHJpYnV0aW9uIGFu
ZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorIyBtb2Rp
ZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRp
dGlvbnMgYXJlCisjIG1ldDoKKyMKKyMgICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBj
b2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyMgbm90aWNlLCB0aGlzIGxpc3Qg
b2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorIyAgICAgKiBSZWRp
c3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisjIGNv
cHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5n
IGRpc2NsYWltZXIKKyMgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFs
cyBwcm92aWRlZCB3aXRoIHRoZQorIyBkaXN0cmlidXRpb24uCisjICAgICAqIE5laXRoZXIgdGhl
IG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyMgY29udHJpYnV0b3Jz
IG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20K
KyMgdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lv
bi4KKyMKKyMgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERF
UlMgQU5EIENPTlRSSUJVVE9SUworIyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVE
IFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorIyBMSU1JVEVEIFRPLCBUSEUgSU1QTElF
RCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyMgQSBQQVJU
SUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZ
UklHSFQKKyMgT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwg
SU5ESVJFQ1QsIElOQ0lERU5UQUwsCisjIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVO
VElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKyMgTElNSVRFRCBUTywgUFJPQ1VSRU1F
TlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisjIERBVEEs
IE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5E
IE9OIEFOWQorIyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJ
Q1QgTElBQklMSVRZLCBPUiBUT1JUCisjIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJ
U0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorIyBPRiBUSElTIFNPRlRXQVJF
LCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCitp
bXBvcnQgb3MKK2ltcG9ydCByZQoraW1wb3J0IHN0YXQKKworaW1wb3J0IHdlYmtpdHB5LmNvbW1v
bi5jb25maWcgYXMgY29uZmlnCitmcm9tIHdlYmtpdHB5LmNvbW1vbi5zeXN0ZW0uZGVwcmVjYXRl
ZF9sb2dnaW5nIGltcG9ydCBsb2cKK2Zyb20gd2Via2l0cHkuY29tbW9uLnN5c3RlbS5leGVjdXRp
dmUgaW1wb3J0IFNjcmlwdEVycm9yCitpbXBvcnQgd2Via2l0cHkudGhpcmRwYXJ0eS5hdXRvaW5z
dGFsbGVkLnJpZXR2ZWxkX3VwbG9hZCBhcyByaWV0dmVsZF91cGxvYWQKKworCitkZWYgcGFyc2Vf
Y29kZXJldmlld19pc3N1ZShtZXNzYWdlKToKKyAgICBpZiBub3QgbWVzc2FnZToKKyAgICAgICAg
cmV0dXJuIE5vbmUKKyAgICBtYXRjaCA9IHJlLnNlYXJjaChjb25maWcuY29kZXJldmlld19zZXJ2
ZXJfcmVnZXggKworICAgICAgICAgICAgICAgICAgICAgICIoP1A8Y29kZXJldmlld19pc3N1ZT5c
ZCspIiwKKyAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlKQorICAgIGlmIG1hdGNoOgorICAg
ICAgICByZXR1cm4gaW50KG1hdGNoLmdyb3VwKCdjb2RlcmV2aWV3X2lzc3VlJykpCisKKworY2xh
c3MgUmlldHZlbGQob2JqZWN0KToKKyAgICBkZWYgX19pbml0X18oc2VsZiwgZXhlY3V0aXZlLCBk
cnlydW49RmFsc2UpOgorICAgICAgICBzZWxmLmRyeXJ1biA9IGRyeXJ1bgorICAgICAgICBzZWxm
Ll9leGVjdXRpdmUgPSBleGVjdXRpdmUKKyAgICAgICAgc2VsZi5fdXBsb2FkX3B5ID0gcmlldHZl
bGRfdXBsb2FkLl9fZmlsZV9fWzotMV0KKyAgICAgICAgb3MuY2htb2Qoc2VsZi5fdXBsb2FkX3B5
LCBvcy5zdGF0KHNlbGYuX3VwbG9hZF9weSkuc3RfbW9kZSB8IHN0YXQuU19JWFVTUiB8IHN0YXQu
U19JWEdSUCB8IHN0YXQuU19JWE9USCkKKworICAgIGRlZiB1cmxfZm9yX2lzc3VlKHNlbGYsIGNv
ZGVyZXZpZXdfaXNzdWUpOgorICAgICAgICBpZiBub3QgY29kZXJldmlld19pc3N1ZToKKyAgICAg
ICAgICAgIHJldHVybiBOb25lCisgICAgICAgIHJldHVybiAiJXMlcyIgJSAoY29uZmlnLmNvZGVy
ZXZpZXdfc2VydmVyX3VybCwgY29kZXJldmlld19pc3N1ZSkKKworICAgIGRlZiBwb3N0KHNlbGYs
IG1lc3NhZ2U9Tm9uZSwgY29kZXJldmlld19pc3N1ZT1Ob25lLCBjYz1Ob25lKToKKyAgICAgICAg
aWYgbm90IG1lc3NhZ2U6CisgICAgICAgICAgICByYWlzZSBTY3JpcHRFcnJvcigiUmlldHZlbGQg
cmVxdWlyZXMgYSBtZXNzYWdlLiIpCisKKyAgICAgICAgYXJncyA9IFsKKyAgICAgICAgICAgIHNl
bGYuX3VwbG9hZF9weSwKKyAgICAgICAgICAgICItLWFzc3VtZV95ZXMiLAorICAgICAgICAgICAg
Ii0tc2VydmVyPSVzIiAlIGNvbmZpZy5jb2RlcmV2aWV3X3NlcnZlcl9ob3N0LAorICAgICAgICAg
ICAgIi0tbWVzc2FnZT0lcyIgJSBtZXNzYWdlLAorICAgICAgICBdCisgICAgICAgIGlmIGNvZGVy
ZXZpZXdfaXNzdWU6CisgICAgICAgICAgICBhcmdzLmFwcGVuZCgiLS1pc3N1ZT0lcyIgJSBjb2Rl
cmV2aWV3X2lzc3VlKQorICAgICAgICBpZiBjYzoKKyAgICAgICAgICAgIGFyZ3MuYXBwZW5kKCIt
LWNjPSVzIiAlIGNjKQorCisgICAgICAgIGlmIHNlbGYuZHJ5cnVuOgorICAgICAgICAgICAgbG9n
KCJXb3VsZCBoYXZlIHJ1biAlcyIgJSBhcmdzKQorICAgICAgICAgICAgcmV0dXJuCisKKyAgICAg
ICAgb3V0cHV0ID0gc2VsZi5fZXhlY3V0aXZlLnJ1bl9hbmRfdGhyb3dfaWZfZmFpbChhcmdzKQor
ICAgICAgICBtYXRjaCA9IHJlLnNlYXJjaCgiSXNzdWUgY3JlYXRlZFwuIFVSTDogIiArCisgICAg
ICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZy5jb2RlcmV2aWV3X3NlcnZlcl9yZWdleCArCisg
ICAgICAgICAgICAgICAgICAgICAgICAgICIoP1A8Y29kZXJldmlld19pc3N1ZT5cZCspIiwKKyAg
ICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0KQorICAgICAgICBpZiBtYXRjaDoKKyAgICAg
ICAgICAgIHJldHVybiBpbnQobWF0Y2guZ3JvdXAoJ2NvZGVyZXZpZXdfaXNzdWUnKSkKZGlmZiAt
LWdpdCBhL1dlYktpdFRvb2xzL1NjcmlwdHMvd2Via2l0cHkvY29tbW9uL25ldC9yaWV0dmVsZF91
bml0dGVzdC5weSBiL1dlYktpdFRvb2xzL1NjcmlwdHMvd2Via2l0cHkvY29tbW9uL25ldC9yaWV0
dmVsZF91bml0dGVzdC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYTVl
MGY1Ci0tLSAvZGV2L251bGwKKysrIGIvV2ViS2l0VG9vbHMvU2NyaXB0cy93ZWJraXRweS9jb21t
b24vbmV0L3JpZXR2ZWxkX3VuaXR0ZXN0LnB5CkBAIC0wLDAgKzEsMzkgQEAKKyMgQ29weXJpZ2h0
IChjKSAyMDEwIEdvb2dsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisjCisjIFJlZGlzdHJp
YnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91
dAorIyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93
aW5nIGNvbmRpdGlvbnMgYXJlCisjIG1ldDoKKyMKKyMgICAgICogUmVkaXN0cmlidXRpb25zIG9m
IHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyMgbm90aWNlLCB0
aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorIyAg
ICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFi
b3ZlCisjIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUg
Zm9sbG93aW5nIGRpc2NsYWltZXIKKyMgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVy
IG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorIyBkaXN0cmlidXRpb24uCisjICAgICAqIE5l
aXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyMgY29u
dHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJp
dmVkIGZyb20KKyMgdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4g
cGVybWlzc2lvbi4KKyMKKyMgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJ
R0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworIyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBP
UiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorIyBMSU1JVEVEIFRPLCBU
SEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IK
KyMgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxM
IFRIRSBDT1BZUklHSFQKKyMgT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5Z
IERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisjIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1Ig
Q09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKyMgTElNSVRFRCBUTywg
UFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0Us
CisjIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBD
QVVTRUQgQU5EIE9OIEFOWQorIyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRS
QUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisjIChJTkNMVURJTkcgTkVHTElHRU5DRSBP
UiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorIyBPRiBUSElT
IFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFN
QUdFLgorCitpbXBvcnQgdW5pdHRlc3QKKworZnJvbSB3ZWJraXRweS5jb21tb24ubmV0LnJpZXR2
ZWxkIGltcG9ydCBSaWV0dmVsZAorZnJvbSB3ZWJraXRweS50aGlyZHBhcnR5Lm1vY2sgaW1wb3J0
IE1vY2sKKworCitjbGFzcyBSaWV0dmVsZFRlc3QodW5pdHRlc3QuVGVzdENhc2UpOgorICAgIGRl
ZiB0ZXN0X3VybF9mb3JfaXNzdWUoc2VsZik6CisgICAgICAgIHJpZXR2ZWxkID0gUmlldHZlbGQo
TW9jaygpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJpZXR2ZWxkLnVybF9mb3JfaXNzdWUo
MzQyMjMpLAorICAgICAgICAgICAgICAgICAgICAgICAgICJodHRwczovL2NvZGVyZXZpZXcuYXBw
c3BvdC5jb20vMzQyMjMiKQpkaWZmIC0tZ2l0IGEvV2ViS2l0VG9vbHMvU2NyaXB0cy93ZWJraXRw
eS90aGlyZHBhcnR5L19faW5pdF9fLnB5IGIvV2ViS2l0VG9vbHMvU2NyaXB0cy93ZWJraXRweS90
aGlyZHBhcnR5L19faW5pdF9fLnB5CmluZGV4IDMxMmRhNTMuLjMzMmIyN2IgMTAwNjQ0Ci0tLSBh
L1dlYktpdFRvb2xzL1NjcmlwdHMvd2Via2l0cHkvdGhpcmRwYXJ0eS9fX2luaXRfXy5weQorKysg
Yi9XZWJLaXRUb29scy9TY3JpcHRzL3dlYmtpdHB5L3RoaXJkcGFydHkvX19pbml0X18ucHkKQEAg
LTY4LDYgKzY4LDkgQEAgaW5zdGFsbGVyLmluc3RhbGwodXJsPSJodHRwOi8vcHlwaS5weXRob24u
b3JnL3BhY2thZ2VzL3NvdXJjZS9tL21lY2hhbml6ZS9tZWNoYW4KICAgICAgICAgICAgICAgICAg
IHVybF9zdWJwYXRoPSJtZWNoYW5pemUiKQogaW5zdGFsbGVyLmluc3RhbGwodXJsPSJodHRwOi8v
cHlwaS5weXRob24ub3JnL3BhY2thZ2VzL3NvdXJjZS9wL3BlcDgvcGVwOC0wLjUuMC50YXIuZ3oj
bWQ1PTUxMmE4MThhZjk5NzkyOTBjZDYxOWNjZThlOWMyZTJiIiwKICAgICAgICAgICAgICAgICAg
IHVybF9zdWJwYXRoPSJwZXA4LTAuNS4wL3BlcDgucHkiKQoraW5zdGFsbGVyLmluc3RhbGwodXJs
PSJodHRwOi8vd2Via2l0LXJpZXR2ZWxkLmdvb2dsZWNvZGUuY29tL3N2bi90cnVuay9zdGF0aWMv
dXBsb2FkLnB5IiwKKyAgICAgICAgICAgICAgICAgIHRhcmdldF9uYW1lPSJyaWV0dmVsZF91cGxv
YWQucHkiKQorCiAKICMgU2luY2UgaXJjbGliIGFuZCBpcmNib3QgYXJlIHR3byB0b3AtbGV2ZWwg
cGFja2FnZXMsIHdlIG5lZWQgdG8gaW1wb3J0CiAjIHRoZW0gc2VwYXJhdGVseS4gIFdlIGdyb3Vw
IHRoZW0gaW50byBhbiBpcmMgcGFja2FnZSBmb3IgYmV0dGVyCmRpZmYgLS1naXQgYS9XZWJLaXRU
b29scy9TY3JpcHRzL3dlYmtpdHB5L3Rvb2wvY29tbWFuZHMvcXVldWVzX3VuaXR0ZXN0LnB5IGIv
V2ViS2l0VG9vbHMvU2NyaXB0cy93ZWJraXRweS90b29sL2NvbW1hbmRzL3F1ZXVlc191bml0dGVz
dC5weQppbmRleCA4OGEzN2YzLi4wOTA2YzcwIDEwMDY0NAotLS0gYS9XZWJLaXRUb29scy9TY3Jp
cHRzL3dlYmtpdHB5L3Rvb2wvY29tbWFuZHMvcXVldWVzX3VuaXR0ZXN0LnB5CisrKyBiL1dlYktp
dFRvb2xzL1NjcmlwdHMvd2Via2l0cHkvdG9vbC9jb21tYW5kcy9xdWV1ZXNfdW5pdHRlc3QucHkK
QEAgLTcxLDYgKzcxLDcgQEAgY2xhc3MgQWJzdHJhY3RRdWV1ZVRlc3QoQ29tbWFuZHNUZXN0KToK
ICAgICBkZWYgX2Fzc2VydF9ydW5fd2Via2l0X3BhdGNoKHNlbGYsIHJ1bl9hcmdzKToKICAgICAg
ICAgcXVldWUgPSBUZXN0UXVldWUoKQogICAgICAgICB0b29sID0gTW9ja1Rvb2woKQorICAgICAg
ICB0b29sLmV4ZWN1dGl2ZSA9IE1vY2soKQogICAgICAgICBxdWV1ZS5iaW5kX3RvX3Rvb2wodG9v
bCkKIAogICAgICAgICBxdWV1ZS5ydW5fd2Via2l0X3BhdGNoKHJ1bl9hcmdzKQpkaWZmIC0tZ2l0
IGEvV2ViS2l0VG9vbHMvU2NyaXB0cy93ZWJraXRweS90b29sL2NvbW1hbmRzL3VwbG9hZC5weSBi
L1dlYktpdFRvb2xzL1NjcmlwdHMvd2Via2l0cHkvdG9vbC9jb21tYW5kcy91cGxvYWQucHkKaW5k
ZXggNmU2OGZiZS4uZGQwYWMxMyAxMDA2NDQKLS0tIGEvV2ViS2l0VG9vbHMvU2NyaXB0cy93ZWJr
aXRweS90b29sL2NvbW1hbmRzL3VwbG9hZC5weQorKysgYi9XZWJLaXRUb29scy9TY3JpcHRzL3dl
YmtpdHB5L3Rvb2wvY29tbWFuZHMvdXBsb2FkLnB5CkBAIC0xNjQsNiArMTY0LDcgQEAgY2xhc3Mg
UG9zdChBYnN0cmFjdFBhdGNoVXBsb2FkaW5nQ29tbWFuZCk6CiAgICAgc3RlcHMgPSBbCiAgICAg
ICAgIHN0ZXBzLkNoZWNrU3R5bGUsCiAgICAgICAgIHN0ZXBzLkNvbmZpcm1EaWZmLAorICAgICAg
ICBzdGVwcy5Qb3N0Q29kZVJldmlldywKICAgICAgICAgc3RlcHMuT2Jzb2xldGVQYXRjaGVzLAog
ICAgICAgICBzdGVwcy5Qb3N0RGlmZiwKICAgICBdCkBAIC0yMDgsNiArMjA5LDcgQEAgY2xhc3Mg
VXBsb2FkKEFic3RyYWN0UGF0Y2hVcGxvYWRpbmdDb21tYW5kKToKICAgICAgICAgc3RlcHMuUHJl
cGFyZUNoYW5nZUxvZywKICAgICAgICAgc3RlcHMuRWRpdENoYW5nZUxvZywKICAgICAgICAgc3Rl
cHMuQ29uZmlybURpZmYsCisgICAgICAgIHN0ZXBzLlBvc3RDb2RlUmV2aWV3LAogICAgICAgICBz
dGVwcy5PYnNvbGV0ZVBhdGNoZXMsCiAgICAgICAgIHN0ZXBzLlBvc3REaWZmLAogICAgIF0KZGlm
ZiAtLWdpdCBhL1dlYktpdFRvb2xzL1NjcmlwdHMvd2Via2l0cHkvdG9vbC9jb21tYW5kcy91cGxv
YWRfdW5pdHRlc3QucHkgYi9XZWJLaXRUb29scy9TY3JpcHRzL3dlYmtpdHB5L3Rvb2wvY29tbWFu
ZHMvdXBsb2FkX3VuaXR0ZXN0LnB5CmluZGV4IDRlOTg3YzkuLjk3NjZlMTkgMTAwNjQ0Ci0tLSBh
L1dlYktpdFRvb2xzL1NjcmlwdHMvd2Via2l0cHkvdG9vbC9jb21tYW5kcy91cGxvYWRfdW5pdHRl
c3QucHkKKysrIGIvV2ViS2l0VG9vbHMvU2NyaXB0cy93ZWJraXRweS90b29sL2NvbW1hbmRzL3Vw
bG9hZF91bml0dGVzdC5weQpAQCAtNTgsNiArNTgsNyBAQCBjbGFzcyBVcGxvYWRDb21tYW5kc1Rl
c3QoQ29tbWFuZHNUZXN0KToKICAgICAgICAgb3B0aW9ucy5kZXNjcmlwdGlvbiA9ICJNT0NLIGRl
c2NyaXB0aW9uIgogICAgICAgICBvcHRpb25zLnJlcXVlc3RfY29tbWl0ID0gRmFsc2UKICAgICAg
ICAgb3B0aW9ucy5yZXZpZXcgPSBUcnVlCisgICAgICAgIG9wdGlvbnMuY2MgPSBOb25lCiAgICAg
ICAgIGV4cGVjdGVkX3N0ZGVyciA9ICJSdW5uaW5nIGNoZWNrLXdlYmtpdC1zdHlsZVxuT2Jzb2xl
dGluZyAyIG9sZCBwYXRjaGVzIG9uIGJ1ZyA0MlxuTU9DSyBhZGRfcGF0Y2hfdG9fYnVnOiBidWdf
aWQ9NDIsIGRlc2NyaXB0aW9uPU1PQ0sgZGVzY3JpcHRpb24sIG1hcmtfZm9yX3Jldmlldz1UcnVl
LCBtYXJrX2Zvcl9jb21taXRfcXVldWU9RmFsc2UsIG1hcmtfZm9yX2xhbmRpbmc9RmFsc2Vcbi0t
IEJlZ2luIGNvbW1lbnQgLS1cbk5vbmVcbi0tIEVuZCBjb21tZW50IC0tXG5NT0NLOiB1c2VyLm9w
ZW5fdXJsOiBodHRwOi8vZXhhbXBsZS5jb20vNDJcbiIKICAgICAgICAgc2VsZi5hc3NlcnRfZXhl
Y3V0ZV9vdXRwdXRzKFBvc3QoKSwgWzQyXSwgb3B0aW9ucz1vcHRpb25zLCBleHBlY3RlZF9zdGRl
cnI9ZXhwZWN0ZWRfc3RkZXJyKQogCkBAIC03Nyw2ICs3OCw3IEBAIGNsYXNzIFVwbG9hZENvbW1h
bmRzVGVzdChDb21tYW5kc1Rlc3QpOgogICAgICAgICBvcHRpb25zLmRlc2NyaXB0aW9uID0gIk1P
Q0sgZGVzY3JpcHRpb24iCiAgICAgICAgIG9wdGlvbnMucmVxdWVzdF9jb21taXQgPSBGYWxzZQog
ICAgICAgICBvcHRpb25zLnJldmlldyA9IFRydWUKKyAgICAgICAgb3B0aW9ucy5jYyA9IE5vbmUK
ICAgICAgICAgZXhwZWN0ZWRfc3RkZXJyID0gIlJ1bm5pbmcgY2hlY2std2Via2l0LXN0eWxlXG5P
YnNvbGV0aW5nIDIgb2xkIHBhdGNoZXMgb24gYnVnIDQyXG5NT0NLIGFkZF9wYXRjaF90b19idWc6
IGJ1Z19pZD00MiwgZGVzY3JpcHRpb249TU9DSyBkZXNjcmlwdGlvbiwgbWFya19mb3JfcmV2aWV3
PVRydWUsIG1hcmtfZm9yX2NvbW1pdF9xdWV1ZT1GYWxzZSwgbWFya19mb3JfbGFuZGluZz1GYWxz
ZVxuLS0gQmVnaW4gY29tbWVudCAtLVxuTm9uZVxuLS0gRW5kIGNvbW1lbnQgLS1cbk1PQ0s6IHVz
ZXIub3Blbl91cmw6IGh0dHA6Ly9leGFtcGxlLmNvbS80MlxuIgogICAgICAgICBzZWxmLmFzc2Vy
dF9leGVjdXRlX291dHB1dHMoVXBsb2FkKCksIFs0Ml0sIG9wdGlvbnM9b3B0aW9ucywgZXhwZWN0
ZWRfc3RkZXJyPWV4cGVjdGVkX3N0ZGVycikKIApkaWZmIC0tZ2l0IGEvV2ViS2l0VG9vbHMvU2Ny
aXB0cy93ZWJraXRweS90b29sL21haW4ucHkgYi9XZWJLaXRUb29scy9TY3JpcHRzL3dlYmtpdHB5
L3Rvb2wvbWFpbi5weQppbmRleCA2MjllODZmLi5kZDc2NTJkIDEwMDc1NQotLS0gYS9XZWJLaXRU
b29scy9TY3JpcHRzL3dlYmtpdHB5L3Rvb2wvbWFpbi5weQorKysgYi9XZWJLaXRUb29scy9TY3Jp
cHRzL3dlYmtpdHB5L3Rvb2wvbWFpbi5weQpAQCAtMzYsNiArMzYsNyBAQCBmcm9tIHdlYmtpdHB5
LmNvbW1vbi5jaGVja291dC5hcGkgaW1wb3J0IENoZWNrb3V0CiBmcm9tIHdlYmtpdHB5LmNvbW1v
bi5jaGVja291dC5zY20gaW1wb3J0IGRldGVjdF9zY21fc3lzdGVtCiBmcm9tIHdlYmtpdHB5LmNv
bW1vbi5uZXQuYnVnemlsbGEgaW1wb3J0IEJ1Z3ppbGxhCiBmcm9tIHdlYmtpdHB5LmNvbW1vbi5u
ZXQuYnVpbGRib3QgaW1wb3J0IEJ1aWxkQm90Citmcm9tIHdlYmtpdHB5LmNvbW1vbi5uZXQucmll
dHZlbGQgaW1wb3J0IFJpZXR2ZWxkCiBmcm9tIHdlYmtpdHB5LmNvbW1vbi5uZXQuaXJjLmlyY3By
b3h5IGltcG9ydCBJUkNQcm94eQogZnJvbSB3ZWJraXRweS5jb21tb24uc3lzdGVtLmV4ZWN1dGl2
ZSBpbXBvcnQgRXhlY3V0aXZlCiBmcm9tIHdlYmtpdHB5LmNvbW1vbi5zeXN0ZW0udXNlciBpbXBv
cnQgVXNlcgpAQCAtNzAsNiArNzEsNyBAQCBjbGFzcyBXZWJLaXRQYXRjaChNdWx0aUNvbW1hbmRU
b29sKToKICAgICAgICAgc2VsZi5fc2NtID0gTm9uZQogICAgICAgICBzZWxmLl9jaGVja291dCA9
IE5vbmUKICAgICAgICAgc2VsZi5zdGF0dXNfc2VydmVyID0gU3RhdHVzU2VydmVyKCkKKyAgICAg
ICAgc2VsZi5jb2RlcmV2aWV3ID0gUmlldHZlbGQoc2VsZi5leGVjdXRpdmUpCiAKICAgICBkZWYg
c2NtKHNlbGYpOgogICAgICAgICAjIExhemlseSBpbml0aWFsaXplIFNDTSB0byBub3QgZXJyb3It
b3V0IGJlZm9yZSBjb21tYW5kIGxpbmUgcGFyc2luZyAob3Igd2hlbiBydW5uaW5nIG5vbi1zY20g
Y29tbWFuZHMpLgpAQCAtMTIxLDYgKzEyMyw3IEBAIGNsYXNzIFdlYktpdFBhdGNoKE11bHRpQ29t
bWFuZFRvb2wpOgogICAgICAgICBpZiBvcHRpb25zLmRyeV9ydW46CiAgICAgICAgICAgICBzZWxm
LnNjbSgpLmRyeXJ1biA9IFRydWUKICAgICAgICAgICAgIHNlbGYuYnVncy5kcnlydW4gPSBUcnVl
CisgICAgICAgICAgICBzZWxmLmNvZGVyZXZpZXcuZHJ5cnVuID0gVHJ1ZQogICAgICAgICBpZiBv
cHRpb25zLnN0YXR1c19ob3N0OgogICAgICAgICAgICAgc2VsZi5zdGF0dXNfc2VydmVyLnNldF9o
b3N0KG9wdGlvbnMuc3RhdHVzX2hvc3QpCiAgICAgICAgIGlmIG9wdGlvbnMuaXJjX3Bhc3N3b3Jk
OgpkaWZmIC0tZ2l0IGEvV2ViS2l0VG9vbHMvU2NyaXB0cy93ZWJraXRweS90b29sL21vY2t0b29s
LnB5IGIvV2ViS2l0VG9vbHMvU2NyaXB0cy93ZWJraXRweS90b29sL21vY2t0b29sLnB5CmluZGV4
IDg5ZmRlNmEuLjZlNGI2NGYgMTAwNjQ0Ci0tLSBhL1dlYktpdFRvb2xzL1NjcmlwdHMvd2Via2l0
cHkvdG9vbC9tb2NrdG9vbC5weQorKysgYi9XZWJLaXRUb29scy9TY3JpcHRzL3dlYmtpdHB5L3Rv
b2wvbW9ja3Rvb2wucHkKQEAgLTMzLDYgKzMzLDcgQEAgZnJvbSB3ZWJraXRweS5jb21tb24uY29u
ZmlnLmNvbW1pdHRlcnMgaW1wb3J0IENvbW1pdHRlckxpc3QsIFJldmlld2VyCiBmcm9tIHdlYmtp
dHB5LmNvbW1vbi5jaGVja291dC5jb21taXRpbmZvIGltcG9ydCBDb21taXRJbmZvCiBmcm9tIHdl
YmtpdHB5LmNvbW1vbi5jaGVja291dC5zY20gaW1wb3J0IENvbW1pdE1lc3NhZ2UKIGZyb20gd2Vi
a2l0cHkuY29tbW9uLm5ldC5idWd6aWxsYSBpbXBvcnQgQnVnLCBBdHRhY2htZW50Citmcm9tIHdl
YmtpdHB5LmNvbW1vbi5uZXQucmlldHZlbGQgaW1wb3J0IFJpZXR2ZWxkCiBmcm9tIHdlYmtpdHB5
LnRoaXJkcGFydHkubW9jayBpbXBvcnQgTW9jawogZnJvbSB3ZWJraXRweS5jb21tb24uc3lzdGVt
LmRlcHJlY2F0ZWRfbG9nZ2luZyBpbXBvcnQgbG9nCiAKQEAgLTQzLDYgKzQ0LDcgQEAgZGVmIF9p
ZF90b19vYmplY3RfZGljdGlvbmFyeSgqb2JqZWN0cyk6CiAgICAgICAgIGRpY3Rpb25hcnlbdGhp
bmdbImlkIl1dID0gdGhpbmcKICAgICByZXR1cm4gZGljdGlvbmFyeQogCisjIFRlc3RpbmcKIAog
IyBGSVhNRTogVGhlIGlkcyBzaG91bGQgYmUgMSwgMiwgMyBpbnN0ZWFkIG9mIGNyYXp5IG51bWJl
cnMuCiAKQEAgLTQ4OCwxMyArNDkwLDE4IEBAIGNsYXNzIE1vY2tTdGF0dXNTZXJ2ZXIob2JqZWN0
KToKICAgICAgICAgcmV0dXJuIDE5MQogCiAKK2NsYXNzIE1vY2tFeGVjdXRlKE1vY2spOgorICAg
IGRlZiBydW5fYW5kX3Rocm93X2lmX2ZhaWwoc2VsZiwgYXJncywgcXVpZXQ9RmFsc2UpOgorICAg
ICAgICByZXR1cm4gIk1PQ0sgb3V0cHV0IG9mIGNoaWxkIHByb2Nlc3MiCisKKwogY2xhc3MgTW9j
a1Rvb2woKToKIAogICAgIGRlZiBfX2luaXRfXyhzZWxmLCBsb2dfZXhlY3V0aXZlPUZhbHNlKToK
ICAgICAgICAgc2VsZi53YWtldXBfZXZlbnQgPSB0aHJlYWRpbmcuRXZlbnQoKQogICAgICAgICBz
ZWxmLmJ1Z3MgPSBNb2NrQnVnemlsbGEoKQogICAgICAgICBzZWxmLmJ1aWxkYm90ID0gTW9ja0J1
aWxkQm90KCkKLSAgICAgICAgc2VsZi5leGVjdXRpdmUgPSBNb2NrKCkKKyAgICAgICAgc2VsZi5l
eGVjdXRpdmUgPSBNb2NrRXhlY3V0ZSgpCiAgICAgICAgIGlmIGxvZ19leGVjdXRpdmU6CiAgICAg
ICAgICAgICBzZWxmLmV4ZWN1dGl2ZS5ydW5fYW5kX3Rocm93X2lmX2ZhaWwgPSBsYW1iZGEgYXJn
czogbG9nKCJNT0NLIHJ1bl9hbmRfdGhyb3dfaWZfZmFpbDogJXMiICUgYXJncykKICAgICAgICAg
c2VsZi5faXJjID0gTm9uZQpAQCAtNTAzLDYgKzUxMCw3IEBAIGNsYXNzIE1vY2tUb29sKCk6CiAg
ICAgICAgIHNlbGYuX2NoZWNrb3V0ID0gTW9ja0NoZWNrb3V0KCkKICAgICAgICAgc2VsZi5zdGF0
dXNfc2VydmVyID0gTW9ja1N0YXR1c1NlcnZlcigpCiAgICAgICAgIHNlbGYuaXJjX3Bhc3N3b3Jk
ID0gIk1PQ0sgaXJjIHBhc3N3b3JkIgorICAgICAgICBzZWxmLmNvZGVyZXZpZXcgPSBSaWV0dmVs
ZChzZWxmLmV4ZWN1dGl2ZSkKIAogICAgIGRlZiBzY20oc2VsZik6CiAgICAgICAgIHJldHVybiBz
ZWxmLl9zY20KZGlmZiAtLWdpdCBhL1dlYktpdFRvb2xzL1NjcmlwdHMvd2Via2l0cHkvdG9vbC9z
dGVwcy9fX2luaXRfXy5weSBiL1dlYktpdFRvb2xzL1NjcmlwdHMvd2Via2l0cHkvdG9vbC9zdGVw
cy9fX2luaXRfXy5weQppbmRleCA4ZThhYjE1Li5kNTljZGM1IDEwMDY0NAotLS0gYS9XZWJLaXRU
b29scy9TY3JpcHRzL3dlYmtpdHB5L3Rvb2wvc3RlcHMvX19pbml0X18ucHkKKysrIGIvV2ViS2l0
VG9vbHMvU2NyaXB0cy93ZWJraXRweS90b29sL3N0ZXBzL19faW5pdF9fLnB5CkBAIC00NCw2ICs0
NCw3IEBAIGZyb20gd2Via2l0cHkudG9vbC5zdGVwcy5lbnN1cmVidWlsZGVyc2FyZWdyZWVuIGlt
cG9ydCBFbnN1cmVCdWlsZGVyc0FyZUdyZWVuCiBmcm9tIHdlYmtpdHB5LnRvb2wuc3RlcHMuZW5z
dXJlbG9jYWxjb21taXRpZm5lZWRlZCBpbXBvcnQgRW5zdXJlTG9jYWxDb21taXRJZk5lZWRlZAog
ZnJvbSB3ZWJraXRweS50b29sLnN0ZXBzLm9ic29sZXRlcGF0Y2hlcyBpbXBvcnQgT2Jzb2xldGVQ
YXRjaGVzCiBmcm9tIHdlYmtpdHB5LnRvb2wuc3RlcHMub3B0aW9ucyBpbXBvcnQgT3B0aW9ucwor
ZnJvbSB3ZWJraXRweS50b29sLnN0ZXBzLnBvc3Rjb2RlcmV2aWV3IGltcG9ydCBQb3N0Q29kZVJl
dmlldwogZnJvbSB3ZWJraXRweS50b29sLnN0ZXBzLnBvc3RkaWZmIGltcG9ydCBQb3N0RGlmZgog
ZnJvbSB3ZWJraXRweS50b29sLnN0ZXBzLnBvc3RkaWZmZm9yY29tbWl0IGltcG9ydCBQb3N0RGlm
ZkZvckNvbW1pdAogZnJvbSB3ZWJraXRweS50b29sLnN0ZXBzLnBvc3RkaWZmZm9ycmV2ZXJ0IGlt
cG9ydCBQb3N0RGlmZkZvclJldmVydApkaWZmIC0tZ2l0IGEvV2ViS2l0VG9vbHMvU2NyaXB0cy93
ZWJraXRweS90b29sL3N0ZXBzL29wdGlvbnMucHkgYi9XZWJLaXRUb29scy9TY3JpcHRzL3dlYmtp
dHB5L3Rvb2wvc3RlcHMvb3B0aW9ucy5weQppbmRleCA0MGE2NjgwLi43Zjc2ZjU1IDEwMDY0NAot
LS0gYS9XZWJLaXRUb29scy9TY3JpcHRzL3dlYmtpdHB5L3Rvb2wvc3RlcHMvb3B0aW9ucy5weQor
KysgYi9XZWJLaXRUb29scy9TY3JpcHRzL3dlYmtpdHB5L3Rvb2wvc3RlcHMvb3B0aW9ucy5weQpA
QCAtNDAsNiArNDAsNyBAQCBjbGFzcyBPcHRpb25zKG9iamVjdCk6CiAgICAgY29uZmlybSA9IG1h
a2Vfb3B0aW9uKCItLW5vLWNvbmZpcm0iLCBhY3Rpb249InN0b3JlX2ZhbHNlIiwgZGVzdD0iY29u
ZmlybSIsIGRlZmF1bHQ9VHJ1ZSwgaGVscD0iU2tpcCBjb25maXJtYXRpb24gc3RlcHMuIikKICAg
ICBkZXNjcmlwdGlvbiA9IG1ha2Vfb3B0aW9uKCItbSIsICItLWRlc2NyaXB0aW9uIiwgYWN0aW9u
PSJzdG9yZSIsIHR5cGU9InN0cmluZyIsIGRlc3Q9ImRlc2NyaXB0aW9uIiwgaGVscD0iRGVzY3Jp
cHRpb24gc3RyaW5nIGZvciB0aGUgYXR0YWNobWVudCAoZGVmYXVsdDogXCJwYXRjaFwiKSIpCiAg
ICAgZW1haWwgPSBtYWtlX29wdGlvbigiLS1lbWFpbCIsIGFjdGlvbj0ic3RvcmUiLCB0eXBlPSJz
dHJpbmciLCBkZXN0PSJlbWFpbCIsIGhlbHA9IkVtYWlsIGFkZHJlc3MgdG8gdXNlIGluIENoYW5n
ZUxvZ3MuIikKKyAgICBmYW5jeV9yZXZpZXcgPSBtYWtlX29wdGlvbigiLS1mYW5jeS1yZXZpZXci
LCBhY3Rpb249InN0b3JlX3RydWUiLCBkZXN0PSJmYW5jeV9yZXZpZXciLCBkZWZhdWx0PUZhbHNl
LCBoZWxwPSIoRXhwZXJpbWVudGFsKSBVcGxvYWQgdGhlIHBhdGNoIHRvIFJpZXR2ZWxkIGNvZGUg
cmV2aWV3IHRvb2wuIikKICAgICBmb3JjZV9jbGVhbiA9IG1ha2Vfb3B0aW9uKCItLWZvcmNlLWNs
ZWFuIiwgYWN0aW9uPSJzdG9yZV90cnVlIiwgZGVzdD0iZm9yY2VfY2xlYW4iLCBkZWZhdWx0PUZh
bHNlLCBoZWxwPSJDbGVhbiB3b3JraW5nIGRpcmVjdG9yeSBiZWZvcmUgYXBwbHlpbmcgcGF0Y2hl
cyAocmVtb3ZlcyBsb2NhbCBjaGFuZ2VzIGFuZCBjb21taXRzKSIpCiAgICAgbG9jYWxfY29tbWl0
ID0gbWFrZV9vcHRpb24oIi0tbG9jYWwtY29tbWl0IiwgYWN0aW9uPSJzdG9yZV90cnVlIiwgZGVz
dD0ibG9jYWxfY29tbWl0IiwgZGVmYXVsdD1GYWxzZSwgaGVscD0iTWFrZSBhIGxvY2FsIGNvbW1p
dCBmb3IgZWFjaCBhcHBsaWVkIHBhdGNoIikKICAgICBub25faW50ZXJhY3RpdmUgPSBtYWtlX29w
dGlvbigiLS1ub24taW50ZXJhY3RpdmUiLCBhY3Rpb249InN0b3JlX3RydWUiLCBkZXN0PSJub25f
aW50ZXJhY3RpdmUiLCBkZWZhdWx0PUZhbHNlLCBoZWxwPSJOZXZlciBwcm9tcHQgdGhlIHVzZXIs
IGZhaWwgYXMgZmFzdCBhcyBwb3NzaWJsZS4iKQpkaWZmIC0tZ2l0IGEvV2ViS2l0VG9vbHMvU2Ny
aXB0cy93ZWJraXRweS90b29sL3N0ZXBzL3Bvc3Rjb2RlcmV2aWV3LnB5IGIvV2ViS2l0VG9vbHMv
U2NyaXB0cy93ZWJraXRweS90b29sL3N0ZXBzL3Bvc3Rjb2RlcmV2aWV3LnB5Cm5ldyBmaWxlIG1v
ZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY3MGNlNmMKLS0tIC9kZXYvbnVsbAorKysgYi9XZWJL
aXRUb29scy9TY3JpcHRzL3dlYmtpdHB5L3Rvb2wvc3RlcHMvcG9zdGNvZGVyZXZpZXcucHkKQEAg
LTAsMCArMSw3NiBAQAorIyBDb3B5cmlnaHQgKEMpIDIwMTAgR29vZ2xlIEluYy4gQWxsIHJpZ2h0
cyByZXNlcnZlZC4KKyMKKyMgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJp
bmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisjIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRl
ZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKyMgbWV0OgorIwor
IyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFi
b3ZlIGNvcHlyaWdodAorIyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUg
Zm9sbG93aW5nIGRpc2NsYWltZXIuCisjICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkg
Zm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyMgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBs
aXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorIyBpbiB0aGUg
ZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisj
IGRpc3RyaWJ1dGlvbi4KKyMgICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBu
b3IgdGhlIG5hbWVzIG9mIGl0cworIyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3Jz
ZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorIyB0aGlzIHNvZnR3YXJlIHdpdGhv
dXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorIworIyBUSElTIFNPRlRXQVJF
IElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisj
ICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5H
LCBCVVQgTk9UCisjIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hB
TlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorIyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElT
Q0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorIyBPV05FUiBPUiBDT05U
UklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwK
KyMgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElO
RywgQlVUIE5PVAorIyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RT
IE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyMgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5F
U1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisjIFRIRU9SWSBPRiBM
SUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQK
KyMgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZ
IE9VVCBPRiBUSEUgVVNFCisjIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBU
SEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKK2Zyb20gd2Via2l0cHkudG9vbC5zdGVw
cy5hYnN0cmFjdHN0ZXAgaW1wb3J0IEFic3RyYWN0U3RlcAorZnJvbSB3ZWJraXRweS50b29sLnN0
ZXBzLm9wdGlvbnMgaW1wb3J0IE9wdGlvbnMKKworCitjbGFzcyBQb3N0Q29kZVJldmlldyhBYnN0
cmFjdFN0ZXApOgorICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiBvcHRpb25zKGNscyk6CisgICAg
ICAgIHJldHVybiBbCisgICAgICAgICAgICBPcHRpb25zLmNjLAorICAgICAgICAgICAgT3B0aW9u
cy5kZXNjcmlwdGlvbiwKKyAgICAgICAgICAgIE9wdGlvbnMuZmFuY3lfcmV2aWV3LAorICAgICAg
ICAgICAgT3B0aW9ucy5yZXZpZXcsCisgICAgICAgIF0KKworICAgIGRlZiBydW4oc2VsZiwgc3Rh
dGUpOgorICAgICAgICBpZiBub3Qgc2VsZi5fb3B0aW9ucy5mYW5jeV9yZXZpZXc6CisgICAgICAg
ICAgICByZXR1cm4KKyAgICAgICAgaWYgbm90IHNlbGYuX29wdGlvbnMucmV2aWV3OgorICAgICAg
ICAgICAgcmV0dXJuCisgICAgICAgICMgRklYTUU6IFRoaXMgd2lsbCBhbHdheXMgYmUgTm9uZSBi
ZWNhdXNlIHdlIGRvbid0IHJldHJpZXZlIHRoZSBpc3N1ZQorICAgICAgICAjICAgICAgICBudW1i
ZXIgZnJtbyB0aGUgQ2hhbmdlTG9nIHlldC4KKyAgICAgICAgY29kZXJldmlld19pc3N1ZSA9IHN0
YXRlLmdldCgiY29kZXJldmlld19pc3N1ZSIpCisgICAgICAgIG1lc3NhZ2UgPSBzZWxmLl9vcHRp
b25zLmRlc2NyaXB0aW9uCisgICAgICAgIGlmIG5vdCBtZXNzYWdlOgorICAgICAgICAgICAgIyBJ
ZiB3ZSBoYXZlIGFuIGlzc3VlIG51bWJlciwgdGhlbiB0aGUgbWVzc2FnZSBiZWNhdXNlIHRoZSBs
YWJlbAorICAgICAgICAgICAgIyBvZiB0aGUgbmV3IHBhdGNoLiBPdGhlcndpc2UsIGl0IGJlY29t
ZXMgdGhlIHRpdGxlIG9mIHRoZSB3aG9sZQorICAgICAgICAgICAgIyBpc3N1ZS4KKyAgICAgICAg
ICAgIGlmIGNvZGVyZXZpZXdfaXNzdWU6CisgICAgICAgICAgICAgICAgbWVzc2FnZSA9ICJVcGRh
dGVkIHBhdGNoIgorICAgICAgICAgICAgZWxpZiBzdGF0ZS5nZXQoImJ1Z190aXRsZSIpOgorICAg
ICAgICAgICAgICAgICMgVGhpcyBpcyB0aGUgY29tbW9uIGNhc2UgZm9yIHRoZSB0aGUgZmlyc3Qg
InVwbG9hZCIgY29tbWFuZC4KKyAgICAgICAgICAgICAgICBtZXNzYWdlID0gc3RhdGUuZ2V0KCJi
dWdfdGl0bGUiKQorICAgICAgICAgICAgZWxpZiBzdGF0ZS5nZXQoImJ1Z19pZCIpOgorICAgICAg
ICAgICAgICAgICMgVGhpcyBpcyB0aGUgY29tbW9uIGNhc2UgZm9yIHRoZSAicG9zdCIgY29tbWFu
ZCBhbmQKKyAgICAgICAgICAgICAgICAjIHN1YnNlcXVlbnQgcnVucyBvZiB0aGUgInVwbG9hZCIg
Y29tbWFuZC4gIEluIHRoaXMgY2FzZSwKKyAgICAgICAgICAgICAgICAjIEknZCByYXRoZXIgYWRk
IHRoZSBuZXcgcGF0Y2ggdG8gdGhlIGV4aXN0aW5nIGlzc3VlLCBidXQKKyAgICAgICAgICAgICAg
ICAjIHRoYXQncyBub3QgaW1wbGVtZW50ZWQgeWV0LgorICAgICAgICAgICAgICAgIG1lc3NhZ2Ug
PSAiQ29kZSByZXZpZXcgZm9yICVzIiAlIHNlbGYuX3Rvb2wuYnVncy5idWdfdXJsX2Zvcl9idWdf
aWQoc3RhdGVbImJ1Z19pZCJdKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAj
IFVucmVhY2hhYmxlIHdpdGggb3VyIGN1cnJlbnQgY29tbWFuZHMsIGJ1dCB3ZSBtaWdodCBoaXQK
KyAgICAgICAgICAgICAgICAjIHRoaXMgY2FzZSBpZiB3ZSBzdXBwb3J0IGJ1Zy1sZXNzIGNvZGUg
cmV2aWV3cy4KKyAgICAgICAgICAgICAgICBtZXNzYWdlID0gIkNvZGUgcmV2aWV3IgorICAgICAg
ICBjcmVhdGVkX2lzc3VlID0gc2VsZi5fdG9vbC5jb2RlcmV2aWV3LnBvc3QobWVzc2FnZT1tZXNz
YWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
Y29kZXJldmlld19pc3N1ZT1jb2RlcmV2aWV3X2lzc3VlLAorICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2M9c2VsZi5fb3B0aW9ucy5jYykKKyAgICAg
ICAgaWYgY3JlYXRlZF9pc3N1ZToKKyAgICAgICAgICAgICMgRklYTUU6IFJlY29yZCB0aGUgaXNz
dWUgbnVtYmVyIGluIHRoZSBDaGFuZ2VMb2cuCisgICAgICAgICAgICBzdGF0ZVsiY29kZXJldmll
d19pc3N1ZSJdID0gY3JlYXRlZF9pc3N1ZQpkaWZmIC0tZ2l0IGEvV2ViS2l0VG9vbHMvU2NyaXB0
cy93ZWJraXRweS90b29sL3N0ZXBzL3Bvc3RkaWZmLnB5IGIvV2ViS2l0VG9vbHMvU2NyaXB0cy93
ZWJraXRweS90b29sL3N0ZXBzL3Bvc3RkaWZmLnB5CmluZGV4IGVmOGY0YzguLjViMjgzODMgMTAw
NjQ0Ci0tLSBhL1dlYktpdFRvb2xzL1NjcmlwdHMvd2Via2l0cHkvdG9vbC9zdGVwcy9wb3N0ZGlm
Zi5weQorKysgYi9XZWJLaXRUb29scy9TY3JpcHRzL3dlYmtpdHB5L3Rvb2wvc3RlcHMvcG9zdGRp
ZmYucHkKQEAgLTQ2LDYgKzQ2LDEwIEBAIGNsYXNzIFBvc3REaWZmKEFic3RyYWN0U3RlcCk6CiAg
ICAgICAgIGRpZmYgPSBzZWxmLmNhY2hlZF9sb29rdXAoc3RhdGUsICJkaWZmIikKICAgICAgICAg
ZGlmZl9maWxlID0gU3RyaW5nSU8uU3RyaW5nSU8oZGlmZikgIyBhZGRfcGF0Y2hfdG9fYnVnIGV4
cGVjdHMgYSBmaWxlLWxpa2Ugb2JqZWN0CiAgICAgICAgIGRlc2NyaXB0aW9uID0gc2VsZi5fb3B0
aW9ucy5kZXNjcmlwdGlvbiBvciAiUGF0Y2giCi0gICAgICAgIHNlbGYuX3Rvb2wuYnVncy5hZGRf
cGF0Y2hfdG9fYnVnKHN0YXRlWyJidWdfaWQiXSwgZGlmZl9maWxlLCBkZXNjcmlwdGlvbiwgbWFy
a19mb3JfcmV2aWV3PXNlbGYuX29wdGlvbnMucmV2aWV3LCBtYXJrX2Zvcl9jb21taXRfcXVldWU9
c2VsZi5fb3B0aW9ucy5yZXF1ZXN0X2NvbW1pdCkKKyAgICAgICAgY29tbWVudF90ZXh0ID0gTm9u
ZQorICAgICAgICBjb2RlcmV2aWV3X2lzc3VlID0gc3RhdGUuZ2V0KCJjb2RlcmV2aWV3X2lzc3Vl
IikKKyAgICAgICAgaWYgY29kZXJldmlld19pc3N1ZToKKyAgICAgICAgICAgIGNvbW1lbnRfdGV4
dCA9ICJGZWVsIGZyZWUgdG8gcHJvdmlkZSBjb21tZW50cyBhdCAlcyIgJSBzZWxmLl90b29sLmNv
ZGVyZXZpZXcudXJsX2Zvcl9pc3N1ZShjb2RlcmV2aWV3X2lzc3VlKQorICAgICAgICBzZWxmLl90
b29sLmJ1Z3MuYWRkX3BhdGNoX3RvX2J1ZyhzdGF0ZVsiYnVnX2lkIl0sIGRpZmZfZmlsZSwgZGVz
Y3JpcHRpb24sIGNvbW1lbnRfdGV4dD1jb21tZW50X3RleHQsIG1hcmtfZm9yX3Jldmlldz1zZWxm
Ll9vcHRpb25zLnJldmlldywgbWFya19mb3JfY29tbWl0X3F1ZXVlPXNlbGYuX29wdGlvbnMucmVx
dWVzdF9jb21taXQpCiAgICAgICAgIGlmIHNlbGYuX29wdGlvbnMub3Blbl9idWc6CiAgICAgICAg
ICAgICBzZWxmLl90b29sLnVzZXIub3Blbl91cmwoc2VsZi5fdG9vbC5idWdzLmJ1Z191cmxfZm9y
X2J1Z19pZChzdGF0ZVsiYnVnX2lkIl0pKQo=
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>53300</attachid>
            <date>2010-04-13 16:55:39 -0700</date>
            <delta_ts>2010-04-13 21:26:49 -0700</delta_ts>
            <desc>Patch</desc>
            <filename>bug-37418-20100413165538.patch</filename>
            <type>text/plain</type>
            <size>22818</size>
            <attacher name="Ojan Vafai">ojan</attacher>
            
              <data encoding="base64">ZGlmZiAtLWdpdCBhL1dlYktpdFRvb2xzL0NoYW5nZUxvZyBiL1dlYktpdFRvb2xzL0NoYW5nZUxv
ZwppbmRleCA1ZjU1ZjQ1Li4xY2UzYWYyIDEwMDY0NAotLS0gYS9XZWJLaXRUb29scy9DaGFuZ2VM
b2cKKysrIGIvV2ViS2l0VG9vbHMvQ2hhbmdlTG9nCkBAIC0xLDMgKzEsMzEgQEAKKzIwMTAtMDQt
MTMgIE9qYW4gVmFmYWkgIDxvamFuQGNocm9taXVtLm9yZz4KKworICAgICAgICBSZXZpZXdlZCBi
eSBOT0JPRFkgKE9PUFMhKS4KKworICAgICAgICBBZGQgZXhwZXJpbWVudGFsIHByb3RvdHlwZSBS
aWV0dmVsZCBpbnRlZ3JhdGlvbiB0byB3ZWJraXQtcGF0Y2ggdXBsb2FkCisgICAgICAgIGh0dHBz
Oi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0zNzQxOAorCisgICAgICAgIFRoaXMg
cGF0Y2ggYWRkcyBiYXJlLWJvbmVzIGludGVncnRpb24gd2l0aCBSaWV0dmVsZCBmb3IgY29kZSBy
ZXZpZXdzLgorICAgICAgICBUaGUgYmVoYXZpb3IgaXMgaGlkZGVuIGJlaGluZCB0aGUgLS1mYW5j
eS1yZXZpZXcgY29tbWFuZCBsaW5lIGZsYWcuCisgICAgICAgIEN1cnJlbnRseSwgdGhlcmUncyBu
byBzdXBwb3J0IGZvciB1cGxvYWRpbmcgbW9yZSB0aGFuIG9uZSBwYXRjaCBwZXIKKyAgICAgICAg
aXNzdWUgKHdoaWNoIGlzIGEgbmljZSBmZWF0dXJlIG9mIFJpZXR2ZWxkKS4gIFRoZSBwbGFuIGlz
IHRvIHBsYXkgd2l0aAorICAgICAgICB0aGlzIGZvciBhIGJpdCBhbmQgc2VlIGlmIGl0J3MgdXNl
ZnVsLgorCisgICAgICAgIE1vZGlmaWVkIGZyb20gQWRhbSdzIG9yaWdpbmFsIHBhdGNoIHRvIGF1
dG9pbnN0YWxsIHRoZSByaWV0dmVsZCB1cGxvYWQgc2NyaXB0LgorCisgICAgICAgICogU2NyaXB0
cy93ZWJraXRweS9jb21tb24vY29uZmlnL19faW5pdF9fLnB5OgorICAgICAgICAqIFNjcmlwdHMv
d2Via2l0cHkvY29tbW9uL25ldC9yaWV0dmVsZC5weTogQWRkZWQuCisgICAgICAgICogU2NyaXB0
cy93ZWJraXRweS9jb21tb24vbmV0L3JpZXR2ZWxkX3VuaXR0dGVzdC5weTogQWRkZWQuCisgICAg
ICAgICogU2NyaXB0cy93ZWJraXRweS90b29sL2NvbW1hbmRzL3F1ZXVlc191bml0dGVzdC5weToK
KyAgICAgICAgKiBTY3JpcHRzL3dlYmtpdHB5L3Rvb2wvY29tbWFuZHMvdXBsb2FkLnB5OgorICAg
ICAgICAqIFNjcmlwdHMvd2Via2l0cHkvdG9vbC9jb21tYW5kcy91cGxvYWRfdW5pdHRlc3QucHk6
CisgICAgICAgICogU2NyaXB0cy93ZWJraXRweS90b29sL21haW4ucHk6CisgICAgICAgICogU2Ny
aXB0cy93ZWJraXRweS90b29sL21vY2t0b29sLnB5OgorICAgICAgICAqIFNjcmlwdHMvd2Via2l0
cHkvdG9vbC9zdGVwcy9fX2luaXRfXy5weToKKyAgICAgICAgKiBTY3JpcHRzL3dlYmtpdHB5L3Rv
b2wvc3RlcHMvb3B0aW9ucy5weToKKyAgICAgICAgKiBTY3JpcHRzL3dlYmtpdHB5L3Rvb2wvc3Rl
cHMvcG9zdGNvZGVyZXZpZXcucHk6IEFkZGVkLgorICAgICAgICAqIFNjcmlwdHMvd2Via2l0cHkv
dG9vbC9zdGVwcy9wb3N0ZGlmZi5weToKKwogMjAxMC0wNC0xMyAgQ3NhYmEgT3N6dHJvZ29uw6Fj
ICA8b3NzeUB3ZWJraXQub3JnPgogCiAgICAgICAgIFVucmV2aWV3ZWQgYnVpbGRmaXggYWZ0ZXIg
cjU3NTM3LgpkaWZmIC0tZ2l0IGEvV2ViS2l0VG9vbHMvU2NyaXB0cy93ZWJraXRweS9jb21tb24v
Y29uZmlnL19faW5pdF9fLnB5IGIvV2ViS2l0VG9vbHMvU2NyaXB0cy93ZWJraXRweS9jb21tb24v
Y29uZmlnL19faW5pdF9fLnB5CmluZGV4IGVmNjViZWUuLjAzZjFiYzcgMTAwNjQ0Ci0tLSBhL1dl
YktpdFRvb2xzL1NjcmlwdHMvd2Via2l0cHkvY29tbW9uL2NvbmZpZy9fX2luaXRfXy5weQorKysg
Yi9XZWJLaXRUb29scy9TY3JpcHRzL3dlYmtpdHB5L2NvbW1vbi9jb25maWcvX19pbml0X18ucHkK
QEAgLTEgKzEsNyBAQAogIyBSZXF1aXJlZCBmb3IgUHl0aG9uIHRvIHNlYXJjaCB0aGlzIGRpcmVj
dG9yeSBmb3IgbW9kdWxlIGZpbGVzCisKK2ltcG9ydCByZQorCitjb2RlcmV2aWV3X3NlcnZlcl9o
b3N0ID0gIndrcmlldHZlbGQuYXBwc3BvdC5jb20iCitjb2RlcmV2aWV3X3NlcnZlcl9yZWdleCA9
ICJodHRwcz86Ly8lcy8iICUgcmUuc3ViKCdcLicsICdcXC4nLCBjb2RlcmV2aWV3X3NlcnZlcl9o
b3N0KQorY29kZXJldmlld19zZXJ2ZXJfdXJsID0gImh0dHBzOi8vJXMvIiAlIGNvZGVyZXZpZXdf
c2VydmVyX2hvc3QKZGlmZiAtLWdpdCBhL1dlYktpdFRvb2xzL1NjcmlwdHMvd2Via2l0cHkvY29t
bW9uL25ldC9yaWV0dmVsZC5weSBiL1dlYktpdFRvb2xzL1NjcmlwdHMvd2Via2l0cHkvY29tbW9u
L25ldC9yaWV0dmVsZC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NmNl
YjJiCi0tLSAvZGV2L251bGwKKysrIGIvV2ViS2l0VG9vbHMvU2NyaXB0cy93ZWJraXRweS9jb21t
b24vbmV0L3JpZXR2ZWxkLnB5CkBAIC0wLDAgKzEsODkgQEAKKyMgQ29weXJpZ2h0IChjKSAyMDEw
IEdvb2dsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisjCisjIFJlZGlzdHJpYnV0aW9uIGFu
ZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorIyBtb2Rp
ZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRp
dGlvbnMgYXJlCisjIG1ldDoKKyMKKyMgICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBj
b2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyMgbm90aWNlLCB0aGlzIGxpc3Qg
b2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorIyAgICAgKiBSZWRp
c3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisjIGNv
cHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5n
IGRpc2NsYWltZXIKKyMgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFs
cyBwcm92aWRlZCB3aXRoIHRoZQorIyBkaXN0cmlidXRpb24uCisjICAgICAqIE5laXRoZXIgdGhl
IG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyMgY29udHJpYnV0b3Jz
IG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20K
KyMgdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lv
bi4KKyMKKyMgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERF
UlMgQU5EIENPTlRSSUJVVE9SUworIyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVE
IFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorIyBMSU1JVEVEIFRPLCBUSEUgSU1QTElF
RCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyMgQSBQQVJU
SUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZ
UklHSFQKKyMgT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwg
SU5ESVJFQ1QsIElOQ0lERU5UQUwsCisjIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVO
VElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKyMgTElNSVRFRCBUTywgUFJPQ1VSRU1F
TlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisjIERBVEEs
IE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5E
IE9OIEFOWQorIyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJ
Q1QgTElBQklMSVRZLCBPUiBUT1JUCisjIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJ
U0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorIyBPRiBUSElTIFNPRlRXQVJF
LCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCitp
bXBvcnQgb3MKK2ltcG9ydCByZQoraW1wb3J0IHN0YXQKKworaW1wb3J0IHdlYmtpdHB5LmNvbW1v
bi5jb25maWcgYXMgY29uZmlnCitmcm9tIHdlYmtpdHB5LmNvbW1vbi5zeXN0ZW0uZGVwcmVjYXRl
ZF9sb2dnaW5nIGltcG9ydCBsb2cKK2Zyb20gd2Via2l0cHkuY29tbW9uLnN5c3RlbS5leGVjdXRp
dmUgaW1wb3J0IFNjcmlwdEVycm9yCitpbXBvcnQgd2Via2l0cHkudGhpcmRwYXJ0eS5hdXRvaW5z
dGFsbGVkLnJpZXR2ZWxkLnVwbG9hZCBhcyB1cGxvYWQKKworCitkZWYgcGFyc2VfY29kZXJldmll
d19pc3N1ZShtZXNzYWdlKToKKyAgICBpZiBub3QgbWVzc2FnZToKKyAgICAgICAgcmV0dXJuIE5v
bmUKKyAgICBtYXRjaCA9IHJlLnNlYXJjaChjb25maWcuY29kZXJldmlld19zZXJ2ZXJfcmVnZXgg
KworICAgICAgICAgICAgICAgICAgICAgICIoP1A8Y29kZXJldmlld19pc3N1ZT5cZCspIiwKKyAg
ICAgICAgICAgICAgICAgICAgICBtZXNzYWdlKQorICAgIGlmIG1hdGNoOgorICAgICAgICByZXR1
cm4gaW50KG1hdGNoLmdyb3VwKCdjb2RlcmV2aWV3X2lzc3VlJykpCisKKworY2xhc3MgUmlldHZl
bGQob2JqZWN0KToKKyAgICBkZWYgX19pbml0X18oc2VsZiwgZXhlY3V0aXZlLCBkcnlydW49RmFs
c2UpOgorICAgICAgICBzZWxmLmRyeXJ1biA9IGRyeXJ1bgorICAgICAgICBzZWxmLl9leGVjdXRp
dmUgPSBleGVjdXRpdmUKKyAgICAgICAgc2VsZi5fdXBsb2FkX3B5ID0gdXBsb2FkLl9fZmlsZV9f
CisgICAgICAgICMgQ2hvcCBvZiB0aGUgbGFzdCBjaGFyYWN0ZXIgc28gd2UgbW9kaWZ5IHBlcm1p
c3Npb25zIG9uIHRoZSBweSBmaWxlIGluc3RlYWQgb2YgdGhlIHB5Yy4KKyAgICAgICAgaWYgb3Mu
cGF0aC5zcGxpdGV4dChzZWxmLl91cGxvYWRfcHkpWzFdID09ICIucHljIjoKKyAgICAgICAgICAg
IHNlbGYuX3VwbG9hZF9weSA9IHNlbGYuX3VwbG9hZF9weVs6LTFdCisgICAgICAgIG9zLmNobW9k
KHNlbGYuX3VwbG9hZF9weSwgb3Muc3RhdChzZWxmLl91cGxvYWRfcHkpLnN0X21vZGUgfCBzdGF0
LlNfSVhVU1IgfCBzdGF0LlNfSVhHUlAgfCBzdGF0LlNfSVhPVEgpCisKKyAgICBkZWYgdXJsX2Zv
cl9pc3N1ZShzZWxmLCBjb2RlcmV2aWV3X2lzc3VlKToKKyAgICAgICAgaWYgbm90IGNvZGVyZXZp
ZXdfaXNzdWU6CisgICAgICAgICAgICByZXR1cm4gTm9uZQorICAgICAgICByZXR1cm4gIiVzJXMi
ICUgKGNvbmZpZy5jb2RlcmV2aWV3X3NlcnZlcl91cmwsIGNvZGVyZXZpZXdfaXNzdWUpCisKKyAg
ICBkZWYgcG9zdChzZWxmLCBtZXNzYWdlPU5vbmUsIGNvZGVyZXZpZXdfaXNzdWU9Tm9uZSwgY2M9
Tm9uZSk6CisgICAgICAgIGlmIG5vdCBtZXNzYWdlOgorICAgICAgICAgICAgcmFpc2UgU2NyaXB0
RXJyb3IoIlJpZXR2ZWxkIHJlcXVpcmVzIGEgbWVzc2FnZS4iKQorCisgICAgICAgIGFyZ3MgPSBb
CisgICAgICAgICAgICBzZWxmLl91cGxvYWRfcHksCisgICAgICAgICAgICAiLS1hc3N1bWVfeWVz
IiwKKyAgICAgICAgICAgICItLXNlcnZlcj0lcyIgJSBjb25maWcuY29kZXJldmlld19zZXJ2ZXJf
aG9zdCwKKyAgICAgICAgICAgICItLW1lc3NhZ2U9JXMiICUgbWVzc2FnZSwKKyAgICAgICAgXQor
ICAgICAgICBpZiBjb2RlcmV2aWV3X2lzc3VlOgorICAgICAgICAgICAgYXJncy5hcHBlbmQoIi0t
aXNzdWU9JXMiICUgY29kZXJldmlld19pc3N1ZSkKKyAgICAgICAgaWYgY2M6CisgICAgICAgICAg
ICBhcmdzLmFwcGVuZCgiLS1jYz0lcyIgJSBjYykKKworICAgICAgICBpZiBzZWxmLmRyeXJ1bjoK
KyAgICAgICAgICAgIGxvZygiV291bGQgaGF2ZSBydW4gJXMiICUgYXJncykKKyAgICAgICAgICAg
IHJldHVybgorCisgICAgICAgIG91dHB1dCA9IHNlbGYuX2V4ZWN1dGl2ZS5ydW5fYW5kX3Rocm93
X2lmX2ZhaWwoYXJncykKKyAgICAgICAgbWF0Y2ggPSByZS5zZWFyY2goIklzc3VlIGNyZWF0ZWRc
LiBVUkw6ICIgKworICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maWcuY29kZXJldmlld19z
ZXJ2ZXJfcmVnZXggKworICAgICAgICAgICAgICAgICAgICAgICAgICAiKD9QPGNvZGVyZXZpZXdf
aXNzdWU+XGQrKSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dCkKKyAgICAgICAg
aWYgbWF0Y2g6CisgICAgICAgICAgICByZXR1cm4gaW50KG1hdGNoLmdyb3VwKCdjb2RlcmV2aWV3
X2lzc3VlJykpCmRpZmYgLS1naXQgYS9XZWJLaXRUb29scy9TY3JpcHRzL3dlYmtpdHB5L2NvbW1v
bi9uZXQvcmlldHZlbGRfdW5pdHRlc3QucHkgYi9XZWJLaXRUb29scy9TY3JpcHRzL3dlYmtpdHB5
L2NvbW1vbi9uZXQvcmlldHZlbGRfdW5pdHRlc3QucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5k
ZXggMDAwMDAwMC4uZGE1ZTBmNQotLS0gL2Rldi9udWxsCisrKyBiL1dlYktpdFRvb2xzL1Njcmlw
dHMvd2Via2l0cHkvY29tbW9uL25ldC9yaWV0dmVsZF91bml0dGVzdC5weQpAQCAtMCwwICsxLDM5
IEBACisjIENvcHlyaWdodCAoYykgMjAxMCBHb29nbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVk
LgorIworIyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1z
LCB3aXRoIG9yIHdpdGhvdXQKKyMgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVk
IHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorIyBtZXQ6CisjCisjICAgICAqIFJl
ZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJp
Z2h0CisjIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcg
ZGlzY2xhaW1lci4KKyMgICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3Qg
cmVwcm9kdWNlIHRoZSBhYm92ZQorIyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29u
ZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisjIGluIHRoZSBkb2N1bWVudGF0
aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyMgZGlzdHJpYnV0
aW9uLgorIyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFt
ZXMgb2YgaXRzCisjIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21v
dGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisjIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZp
YyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisjCisjIFRISVMgU09GVFdBUkUgSVMgUFJPVklE
RUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyMgIkFTIElTIiBB
TkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QK
KyMgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkg
QU5EIEZJVE5FU1MgRk9SCisjIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJ
TiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisjIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBC
RSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorIyBTUEVDSUFM
LCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9U
CisjIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklD
RVM7IExPU1MgT0YgVVNFLAorIyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJV
UFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyMgVEhFT1JZIE9GIExJQUJJTElUWSwg
V0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorIyAoSU5DTFVE
SU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRI
RSBVU0UKKyMgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJ
TElUWSBPRiBTVUNIIERBTUFHRS4KKworaW1wb3J0IHVuaXR0ZXN0CisKK2Zyb20gd2Via2l0cHku
Y29tbW9uLm5ldC5yaWV0dmVsZCBpbXBvcnQgUmlldHZlbGQKK2Zyb20gd2Via2l0cHkudGhpcmRw
YXJ0eS5tb2NrIGltcG9ydCBNb2NrCisKKworY2xhc3MgUmlldHZlbGRUZXN0KHVuaXR0ZXN0LlRl
c3RDYXNlKToKKyAgICBkZWYgdGVzdF91cmxfZm9yX2lzc3VlKHNlbGYpOgorICAgICAgICByaWV0
dmVsZCA9IFJpZXR2ZWxkKE1vY2soKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyaWV0dmVs
ZC51cmxfZm9yX2lzc3VlKDM0MjIzKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAiaHR0cHM6
Ly9jb2RlcmV2aWV3LmFwcHNwb3QuY29tLzM0MjIzIikKZGlmZiAtLWdpdCBhL1dlYktpdFRvb2xz
L1NjcmlwdHMvd2Via2l0cHkvdGhpcmRwYXJ0eS9fX2luaXRfXy5weSBiL1dlYktpdFRvb2xzL1Nj
cmlwdHMvd2Via2l0cHkvdGhpcmRwYXJ0eS9fX2luaXRfXy5weQppbmRleCAzMTJkYTUzLi5mMWU1
MzM0IDEwMDY0NAotLS0gYS9XZWJLaXRUb29scy9TY3JpcHRzL3dlYmtpdHB5L3RoaXJkcGFydHkv
X19pbml0X18ucHkKKysrIGIvV2ViS2l0VG9vbHMvU2NyaXB0cy93ZWJraXRweS90aGlyZHBhcnR5
L19faW5pdF9fLnB5CkBAIC02OSw2ICs2OSwxMyBAQCBpbnN0YWxsZXIuaW5zdGFsbCh1cmw9Imh0
dHA6Ly9weXBpLnB5dGhvbi5vcmcvcGFja2FnZXMvc291cmNlL20vbWVjaGFuaXplL21lY2hhbgog
aW5zdGFsbGVyLmluc3RhbGwodXJsPSJodHRwOi8vcHlwaS5weXRob24ub3JnL3BhY2thZ2VzL3Nv
dXJjZS9wL3BlcDgvcGVwOC0wLjUuMC50YXIuZ3ojbWQ1PTUxMmE4MThhZjk5NzkyOTBjZDYxOWNj
ZThlOWMyZTJiIiwKICAgICAgICAgICAgICAgICAgIHVybF9zdWJwYXRoPSJwZXA4LTAuNS4wL3Bl
cDgucHkiKQogCisKK3JpZXR2ZWxkX2RpciA9IG9zLnBhdGguam9pbihhdXRvaW5zdGFsbGVkX2Rp
ciwgInJpZXR2ZWxkIikKK2luc3RhbGxlciA9IEF1dG9JbnN0YWxsZXIodGFyZ2V0X2Rpcj1yaWV0
dmVsZF9kaXIpCitpbnN0YWxsZXIuaW5zdGFsbCh1cmw9Imh0dHA6Ly93ZWJraXQtcmlldHZlbGQu
Z29vZ2xlY29kZS5jb20vc3ZuL3RydW5rL3N0YXRpYy91cGxvYWQucHkiLAorICAgICAgICAgICAg
ICAgICAgdGFyZ2V0X25hbWU9InVwbG9hZC5weSIpCisKKwogIyBTaW5jZSBpcmNsaWIgYW5kIGly
Y2JvdCBhcmUgdHdvIHRvcC1sZXZlbCBwYWNrYWdlcywgd2UgbmVlZCB0byBpbXBvcnQKICMgdGhl
bSBzZXBhcmF0ZWx5LiAgV2UgZ3JvdXAgdGhlbSBpbnRvIGFuIGlyYyBwYWNrYWdlIGZvciBiZXR0
ZXIKICMgb3JnYW5pemF0aW9uIHB1cnBvc2VzLgpkaWZmIC0tZ2l0IGEvV2ViS2l0VG9vbHMvU2Ny
aXB0cy93ZWJraXRweS90b29sL2NvbW1hbmRzL3F1ZXVlc191bml0dGVzdC5weSBiL1dlYktpdFRv
b2xzL1NjcmlwdHMvd2Via2l0cHkvdG9vbC9jb21tYW5kcy9xdWV1ZXNfdW5pdHRlc3QucHkKaW5k
ZXggODhhMzdmMy4uMDkwNmM3MCAxMDA2NDQKLS0tIGEvV2ViS2l0VG9vbHMvU2NyaXB0cy93ZWJr
aXRweS90b29sL2NvbW1hbmRzL3F1ZXVlc191bml0dGVzdC5weQorKysgYi9XZWJLaXRUb29scy9T
Y3JpcHRzL3dlYmtpdHB5L3Rvb2wvY29tbWFuZHMvcXVldWVzX3VuaXR0ZXN0LnB5CkBAIC03MSw2
ICs3MSw3IEBAIGNsYXNzIEFic3RyYWN0UXVldWVUZXN0KENvbW1hbmRzVGVzdCk6CiAgICAgZGVm
IF9hc3NlcnRfcnVuX3dlYmtpdF9wYXRjaChzZWxmLCBydW5fYXJncyk6CiAgICAgICAgIHF1ZXVl
ID0gVGVzdFF1ZXVlKCkKICAgICAgICAgdG9vbCA9IE1vY2tUb29sKCkKKyAgICAgICAgdG9vbC5l
eGVjdXRpdmUgPSBNb2NrKCkKICAgICAgICAgcXVldWUuYmluZF90b190b29sKHRvb2wpCiAKICAg
ICAgICAgcXVldWUucnVuX3dlYmtpdF9wYXRjaChydW5fYXJncykKZGlmZiAtLWdpdCBhL1dlYktp
dFRvb2xzL1NjcmlwdHMvd2Via2l0cHkvdG9vbC9jb21tYW5kcy91cGxvYWQucHkgYi9XZWJLaXRU
b29scy9TY3JpcHRzL3dlYmtpdHB5L3Rvb2wvY29tbWFuZHMvdXBsb2FkLnB5CmluZGV4IDZlNjhm
YmUuLmRkMGFjMTMgMTAwNjQ0Ci0tLSBhL1dlYktpdFRvb2xzL1NjcmlwdHMvd2Via2l0cHkvdG9v
bC9jb21tYW5kcy91cGxvYWQucHkKKysrIGIvV2ViS2l0VG9vbHMvU2NyaXB0cy93ZWJraXRweS90
b29sL2NvbW1hbmRzL3VwbG9hZC5weQpAQCAtMTY0LDYgKzE2NCw3IEBAIGNsYXNzIFBvc3QoQWJz
dHJhY3RQYXRjaFVwbG9hZGluZ0NvbW1hbmQpOgogICAgIHN0ZXBzID0gWwogICAgICAgICBzdGVw
cy5DaGVja1N0eWxlLAogICAgICAgICBzdGVwcy5Db25maXJtRGlmZiwKKyAgICAgICAgc3RlcHMu
UG9zdENvZGVSZXZpZXcsCiAgICAgICAgIHN0ZXBzLk9ic29sZXRlUGF0Y2hlcywKICAgICAgICAg
c3RlcHMuUG9zdERpZmYsCiAgICAgXQpAQCAtMjA4LDYgKzIwOSw3IEBAIGNsYXNzIFVwbG9hZChB
YnN0cmFjdFBhdGNoVXBsb2FkaW5nQ29tbWFuZCk6CiAgICAgICAgIHN0ZXBzLlByZXBhcmVDaGFu
Z2VMb2csCiAgICAgICAgIHN0ZXBzLkVkaXRDaGFuZ2VMb2csCiAgICAgICAgIHN0ZXBzLkNvbmZp
cm1EaWZmLAorICAgICAgICBzdGVwcy5Qb3N0Q29kZVJldmlldywKICAgICAgICAgc3RlcHMuT2Jz
b2xldGVQYXRjaGVzLAogICAgICAgICBzdGVwcy5Qb3N0RGlmZiwKICAgICBdCmRpZmYgLS1naXQg
YS9XZWJLaXRUb29scy9TY3JpcHRzL3dlYmtpdHB5L3Rvb2wvY29tbWFuZHMvdXBsb2FkX3VuaXR0
ZXN0LnB5IGIvV2ViS2l0VG9vbHMvU2NyaXB0cy93ZWJraXRweS90b29sL2NvbW1hbmRzL3VwbG9h
ZF91bml0dGVzdC5weQppbmRleCA0ZTk4N2M5Li45NzY2ZTE5IDEwMDY0NAotLS0gYS9XZWJLaXRU
b29scy9TY3JpcHRzL3dlYmtpdHB5L3Rvb2wvY29tbWFuZHMvdXBsb2FkX3VuaXR0ZXN0LnB5Cisr
KyBiL1dlYktpdFRvb2xzL1NjcmlwdHMvd2Via2l0cHkvdG9vbC9jb21tYW5kcy91cGxvYWRfdW5p
dHRlc3QucHkKQEAgLTU4LDYgKzU4LDcgQEAgY2xhc3MgVXBsb2FkQ29tbWFuZHNUZXN0KENvbW1h
bmRzVGVzdCk6CiAgICAgICAgIG9wdGlvbnMuZGVzY3JpcHRpb24gPSAiTU9DSyBkZXNjcmlwdGlv
biIKICAgICAgICAgb3B0aW9ucy5yZXF1ZXN0X2NvbW1pdCA9IEZhbHNlCiAgICAgICAgIG9wdGlv
bnMucmV2aWV3ID0gVHJ1ZQorICAgICAgICBvcHRpb25zLmNjID0gTm9uZQogICAgICAgICBleHBl
Y3RlZF9zdGRlcnIgPSAiUnVubmluZyBjaGVjay13ZWJraXQtc3R5bGVcbk9ic29sZXRpbmcgMiBv
bGQgcGF0Y2hlcyBvbiBidWcgNDJcbk1PQ0sgYWRkX3BhdGNoX3RvX2J1ZzogYnVnX2lkPTQyLCBk
ZXNjcmlwdGlvbj1NT0NLIGRlc2NyaXB0aW9uLCBtYXJrX2Zvcl9yZXZpZXc9VHJ1ZSwgbWFya19m
b3JfY29tbWl0X3F1ZXVlPUZhbHNlLCBtYXJrX2Zvcl9sYW5kaW5nPUZhbHNlXG4tLSBCZWdpbiBj
b21tZW50IC0tXG5Ob25lXG4tLSBFbmQgY29tbWVudCAtLVxuTU9DSzogdXNlci5vcGVuX3VybDog
aHR0cDovL2V4YW1wbGUuY29tLzQyXG4iCiAgICAgICAgIHNlbGYuYXNzZXJ0X2V4ZWN1dGVfb3V0
cHV0cyhQb3N0KCksIFs0Ml0sIG9wdGlvbnM9b3B0aW9ucywgZXhwZWN0ZWRfc3RkZXJyPWV4cGVj
dGVkX3N0ZGVycikKIApAQCAtNzcsNiArNzgsNyBAQCBjbGFzcyBVcGxvYWRDb21tYW5kc1Rlc3Qo
Q29tbWFuZHNUZXN0KToKICAgICAgICAgb3B0aW9ucy5kZXNjcmlwdGlvbiA9ICJNT0NLIGRlc2Ny
aXB0aW9uIgogICAgICAgICBvcHRpb25zLnJlcXVlc3RfY29tbWl0ID0gRmFsc2UKICAgICAgICAg
b3B0aW9ucy5yZXZpZXcgPSBUcnVlCisgICAgICAgIG9wdGlvbnMuY2MgPSBOb25lCiAgICAgICAg
IGV4cGVjdGVkX3N0ZGVyciA9ICJSdW5uaW5nIGNoZWNrLXdlYmtpdC1zdHlsZVxuT2Jzb2xldGlu
ZyAyIG9sZCBwYXRjaGVzIG9uIGJ1ZyA0MlxuTU9DSyBhZGRfcGF0Y2hfdG9fYnVnOiBidWdfaWQ9
NDIsIGRlc2NyaXB0aW9uPU1PQ0sgZGVzY3JpcHRpb24sIG1hcmtfZm9yX3Jldmlldz1UcnVlLCBt
YXJrX2Zvcl9jb21taXRfcXVldWU9RmFsc2UsIG1hcmtfZm9yX2xhbmRpbmc9RmFsc2Vcbi0tIEJl
Z2luIGNvbW1lbnQgLS1cbk5vbmVcbi0tIEVuZCBjb21tZW50IC0tXG5NT0NLOiB1c2VyLm9wZW5f
dXJsOiBodHRwOi8vZXhhbXBsZS5jb20vNDJcbiIKICAgICAgICAgc2VsZi5hc3NlcnRfZXhlY3V0
ZV9vdXRwdXRzKFVwbG9hZCgpLCBbNDJdLCBvcHRpb25zPW9wdGlvbnMsIGV4cGVjdGVkX3N0ZGVy
cj1leHBlY3RlZF9zdGRlcnIpCiAKZGlmZiAtLWdpdCBhL1dlYktpdFRvb2xzL1NjcmlwdHMvd2Vi
a2l0cHkvdG9vbC9tYWluLnB5IGIvV2ViS2l0VG9vbHMvU2NyaXB0cy93ZWJraXRweS90b29sL21h
aW4ucHkKaW5kZXggNjI5ZTg2Zi4uZGQ3NjUyZCAxMDA3NTUKLS0tIGEvV2ViS2l0VG9vbHMvU2Ny
aXB0cy93ZWJraXRweS90b29sL21haW4ucHkKKysrIGIvV2ViS2l0VG9vbHMvU2NyaXB0cy93ZWJr
aXRweS90b29sL21haW4ucHkKQEAgLTM2LDYgKzM2LDcgQEAgZnJvbSB3ZWJraXRweS5jb21tb24u
Y2hlY2tvdXQuYXBpIGltcG9ydCBDaGVja291dAogZnJvbSB3ZWJraXRweS5jb21tb24uY2hlY2tv
dXQuc2NtIGltcG9ydCBkZXRlY3Rfc2NtX3N5c3RlbQogZnJvbSB3ZWJraXRweS5jb21tb24ubmV0
LmJ1Z3ppbGxhIGltcG9ydCBCdWd6aWxsYQogZnJvbSB3ZWJraXRweS5jb21tb24ubmV0LmJ1aWxk
Ym90IGltcG9ydCBCdWlsZEJvdAorZnJvbSB3ZWJraXRweS5jb21tb24ubmV0LnJpZXR2ZWxkIGlt
cG9ydCBSaWV0dmVsZAogZnJvbSB3ZWJraXRweS5jb21tb24ubmV0LmlyYy5pcmNwcm94eSBpbXBv
cnQgSVJDUHJveHkKIGZyb20gd2Via2l0cHkuY29tbW9uLnN5c3RlbS5leGVjdXRpdmUgaW1wb3J0
IEV4ZWN1dGl2ZQogZnJvbSB3ZWJraXRweS5jb21tb24uc3lzdGVtLnVzZXIgaW1wb3J0IFVzZXIK
QEAgLTcwLDYgKzcxLDcgQEAgY2xhc3MgV2ViS2l0UGF0Y2goTXVsdGlDb21tYW5kVG9vbCk6CiAg
ICAgICAgIHNlbGYuX3NjbSA9IE5vbmUKICAgICAgICAgc2VsZi5fY2hlY2tvdXQgPSBOb25lCiAg
ICAgICAgIHNlbGYuc3RhdHVzX3NlcnZlciA9IFN0YXR1c1NlcnZlcigpCisgICAgICAgIHNlbGYu
Y29kZXJldmlldyA9IFJpZXR2ZWxkKHNlbGYuZXhlY3V0aXZlKQogCiAgICAgZGVmIHNjbShzZWxm
KToKICAgICAgICAgIyBMYXppbHkgaW5pdGlhbGl6ZSBTQ00gdG8gbm90IGVycm9yLW91dCBiZWZv
cmUgY29tbWFuZCBsaW5lIHBhcnNpbmcgKG9yIHdoZW4gcnVubmluZyBub24tc2NtIGNvbW1hbmRz
KS4KQEAgLTEyMSw2ICsxMjMsNyBAQCBjbGFzcyBXZWJLaXRQYXRjaChNdWx0aUNvbW1hbmRUb29s
KToKICAgICAgICAgaWYgb3B0aW9ucy5kcnlfcnVuOgogICAgICAgICAgICAgc2VsZi5zY20oKS5k
cnlydW4gPSBUcnVlCiAgICAgICAgICAgICBzZWxmLmJ1Z3MuZHJ5cnVuID0gVHJ1ZQorICAgICAg
ICAgICAgc2VsZi5jb2RlcmV2aWV3LmRyeXJ1biA9IFRydWUKICAgICAgICAgaWYgb3B0aW9ucy5z
dGF0dXNfaG9zdDoKICAgICAgICAgICAgIHNlbGYuc3RhdHVzX3NlcnZlci5zZXRfaG9zdChvcHRp
b25zLnN0YXR1c19ob3N0KQogICAgICAgICBpZiBvcHRpb25zLmlyY19wYXNzd29yZDoKZGlmZiAt
LWdpdCBhL1dlYktpdFRvb2xzL1NjcmlwdHMvd2Via2l0cHkvdG9vbC9tb2NrdG9vbC5weSBiL1dl
YktpdFRvb2xzL1NjcmlwdHMvd2Via2l0cHkvdG9vbC9tb2NrdG9vbC5weQppbmRleCA4OWZkZTZh
Li42ZTRiNjRmIDEwMDY0NAotLS0gYS9XZWJLaXRUb29scy9TY3JpcHRzL3dlYmtpdHB5L3Rvb2wv
bW9ja3Rvb2wucHkKKysrIGIvV2ViS2l0VG9vbHMvU2NyaXB0cy93ZWJraXRweS90b29sL21vY2t0
b29sLnB5CkBAIC0zMyw2ICszMyw3IEBAIGZyb20gd2Via2l0cHkuY29tbW9uLmNvbmZpZy5jb21t
aXR0ZXJzIGltcG9ydCBDb21taXR0ZXJMaXN0LCBSZXZpZXdlcgogZnJvbSB3ZWJraXRweS5jb21t
b24uY2hlY2tvdXQuY29tbWl0aW5mbyBpbXBvcnQgQ29tbWl0SW5mbwogZnJvbSB3ZWJraXRweS5j
b21tb24uY2hlY2tvdXQuc2NtIGltcG9ydCBDb21taXRNZXNzYWdlCiBmcm9tIHdlYmtpdHB5LmNv
bW1vbi5uZXQuYnVnemlsbGEgaW1wb3J0IEJ1ZywgQXR0YWNobWVudAorZnJvbSB3ZWJraXRweS5j
b21tb24ubmV0LnJpZXR2ZWxkIGltcG9ydCBSaWV0dmVsZAogZnJvbSB3ZWJraXRweS50aGlyZHBh
cnR5Lm1vY2sgaW1wb3J0IE1vY2sKIGZyb20gd2Via2l0cHkuY29tbW9uLnN5c3RlbS5kZXByZWNh
dGVkX2xvZ2dpbmcgaW1wb3J0IGxvZwogCkBAIC00Myw2ICs0NCw3IEBAIGRlZiBfaWRfdG9fb2Jq
ZWN0X2RpY3Rpb25hcnkoKm9iamVjdHMpOgogICAgICAgICBkaWN0aW9uYXJ5W3RoaW5nWyJpZCJd
XSA9IHRoaW5nCiAgICAgcmV0dXJuIGRpY3Rpb25hcnkKIAorIyBUZXN0aW5nCiAKICMgRklYTUU6
IFRoZSBpZHMgc2hvdWxkIGJlIDEsIDIsIDMgaW5zdGVhZCBvZiBjcmF6eSBudW1iZXJzLgogCkBA
IC00ODgsMTMgKzQ5MCwxOCBAQCBjbGFzcyBNb2NrU3RhdHVzU2VydmVyKG9iamVjdCk6CiAgICAg
ICAgIHJldHVybiAxOTEKIAogCitjbGFzcyBNb2NrRXhlY3V0ZShNb2NrKToKKyAgICBkZWYgcnVu
X2FuZF90aHJvd19pZl9mYWlsKHNlbGYsIGFyZ3MsIHF1aWV0PUZhbHNlKToKKyAgICAgICAgcmV0
dXJuICJNT0NLIG91dHB1dCBvZiBjaGlsZCBwcm9jZXNzIgorCisKIGNsYXNzIE1vY2tUb29sKCk6
CiAKICAgICBkZWYgX19pbml0X18oc2VsZiwgbG9nX2V4ZWN1dGl2ZT1GYWxzZSk6CiAgICAgICAg
IHNlbGYud2FrZXVwX2V2ZW50ID0gdGhyZWFkaW5nLkV2ZW50KCkKICAgICAgICAgc2VsZi5idWdz
ID0gTW9ja0J1Z3ppbGxhKCkKICAgICAgICAgc2VsZi5idWlsZGJvdCA9IE1vY2tCdWlsZEJvdCgp
Ci0gICAgICAgIHNlbGYuZXhlY3V0aXZlID0gTW9jaygpCisgICAgICAgIHNlbGYuZXhlY3V0aXZl
ID0gTW9ja0V4ZWN1dGUoKQogICAgICAgICBpZiBsb2dfZXhlY3V0aXZlOgogICAgICAgICAgICAg
c2VsZi5leGVjdXRpdmUucnVuX2FuZF90aHJvd19pZl9mYWlsID0gbGFtYmRhIGFyZ3M6IGxvZygi
TU9DSyBydW5fYW5kX3Rocm93X2lmX2ZhaWw6ICVzIiAlIGFyZ3MpCiAgICAgICAgIHNlbGYuX2ly
YyA9IE5vbmUKQEAgLTUwMyw2ICs1MTAsNyBAQCBjbGFzcyBNb2NrVG9vbCgpOgogICAgICAgICBz
ZWxmLl9jaGVja291dCA9IE1vY2tDaGVja291dCgpCiAgICAgICAgIHNlbGYuc3RhdHVzX3NlcnZl
ciA9IE1vY2tTdGF0dXNTZXJ2ZXIoKQogICAgICAgICBzZWxmLmlyY19wYXNzd29yZCA9ICJNT0NL
IGlyYyBwYXNzd29yZCIKKyAgICAgICAgc2VsZi5jb2RlcmV2aWV3ID0gUmlldHZlbGQoc2VsZi5l
eGVjdXRpdmUpCiAKICAgICBkZWYgc2NtKHNlbGYpOgogICAgICAgICByZXR1cm4gc2VsZi5fc2Nt
CmRpZmYgLS1naXQgYS9XZWJLaXRUb29scy9TY3JpcHRzL3dlYmtpdHB5L3Rvb2wvc3RlcHMvX19p
bml0X18ucHkgYi9XZWJLaXRUb29scy9TY3JpcHRzL3dlYmtpdHB5L3Rvb2wvc3RlcHMvX19pbml0
X18ucHkKaW5kZXggOGU4YWIxNS4uZDU5Y2RjNSAxMDA2NDQKLS0tIGEvV2ViS2l0VG9vbHMvU2Ny
aXB0cy93ZWJraXRweS90b29sL3N0ZXBzL19faW5pdF9fLnB5CisrKyBiL1dlYktpdFRvb2xzL1Nj
cmlwdHMvd2Via2l0cHkvdG9vbC9zdGVwcy9fX2luaXRfXy5weQpAQCAtNDQsNiArNDQsNyBAQCBm
cm9tIHdlYmtpdHB5LnRvb2wuc3RlcHMuZW5zdXJlYnVpbGRlcnNhcmVncmVlbiBpbXBvcnQgRW5z
dXJlQnVpbGRlcnNBcmVHcmVlbgogZnJvbSB3ZWJraXRweS50b29sLnN0ZXBzLmVuc3VyZWxvY2Fs
Y29tbWl0aWZuZWVkZWQgaW1wb3J0IEVuc3VyZUxvY2FsQ29tbWl0SWZOZWVkZWQKIGZyb20gd2Vi
a2l0cHkudG9vbC5zdGVwcy5vYnNvbGV0ZXBhdGNoZXMgaW1wb3J0IE9ic29sZXRlUGF0Y2hlcwog
ZnJvbSB3ZWJraXRweS50b29sLnN0ZXBzLm9wdGlvbnMgaW1wb3J0IE9wdGlvbnMKK2Zyb20gd2Vi
a2l0cHkudG9vbC5zdGVwcy5wb3N0Y29kZXJldmlldyBpbXBvcnQgUG9zdENvZGVSZXZpZXcKIGZy
b20gd2Via2l0cHkudG9vbC5zdGVwcy5wb3N0ZGlmZiBpbXBvcnQgUG9zdERpZmYKIGZyb20gd2Vi
a2l0cHkudG9vbC5zdGVwcy5wb3N0ZGlmZmZvcmNvbW1pdCBpbXBvcnQgUG9zdERpZmZGb3JDb21t
aXQKIGZyb20gd2Via2l0cHkudG9vbC5zdGVwcy5wb3N0ZGlmZmZvcnJldmVydCBpbXBvcnQgUG9z
dERpZmZGb3JSZXZlcnQKZGlmZiAtLWdpdCBhL1dlYktpdFRvb2xzL1NjcmlwdHMvd2Via2l0cHkv
dG9vbC9zdGVwcy9vcHRpb25zLnB5IGIvV2ViS2l0VG9vbHMvU2NyaXB0cy93ZWJraXRweS90b29s
L3N0ZXBzL29wdGlvbnMucHkKaW5kZXggNDBhNjY4MC4uN2Y3NmY1NSAxMDA2NDQKLS0tIGEvV2Vi
S2l0VG9vbHMvU2NyaXB0cy93ZWJraXRweS90b29sL3N0ZXBzL29wdGlvbnMucHkKKysrIGIvV2Vi
S2l0VG9vbHMvU2NyaXB0cy93ZWJraXRweS90b29sL3N0ZXBzL29wdGlvbnMucHkKQEAgLTQwLDYg
KzQwLDcgQEAgY2xhc3MgT3B0aW9ucyhvYmplY3QpOgogICAgIGNvbmZpcm0gPSBtYWtlX29wdGlv
bigiLS1uby1jb25maXJtIiwgYWN0aW9uPSJzdG9yZV9mYWxzZSIsIGRlc3Q9ImNvbmZpcm0iLCBk
ZWZhdWx0PVRydWUsIGhlbHA9IlNraXAgY29uZmlybWF0aW9uIHN0ZXBzLiIpCiAgICAgZGVzY3Jp
cHRpb24gPSBtYWtlX29wdGlvbigiLW0iLCAiLS1kZXNjcmlwdGlvbiIsIGFjdGlvbj0ic3RvcmUi
LCB0eXBlPSJzdHJpbmciLCBkZXN0PSJkZXNjcmlwdGlvbiIsIGhlbHA9IkRlc2NyaXB0aW9uIHN0
cmluZyBmb3IgdGhlIGF0dGFjaG1lbnQgKGRlZmF1bHQ6IFwicGF0Y2hcIikiKQogICAgIGVtYWls
ID0gbWFrZV9vcHRpb24oIi0tZW1haWwiLCBhY3Rpb249InN0b3JlIiwgdHlwZT0ic3RyaW5nIiwg
ZGVzdD0iZW1haWwiLCBoZWxwPSJFbWFpbCBhZGRyZXNzIHRvIHVzZSBpbiBDaGFuZ2VMb2dzLiIp
CisgICAgZmFuY3lfcmV2aWV3ID0gbWFrZV9vcHRpb24oIi0tZmFuY3ktcmV2aWV3IiwgYWN0aW9u
PSJzdG9yZV90cnVlIiwgZGVzdD0iZmFuY3lfcmV2aWV3IiwgZGVmYXVsdD1GYWxzZSwgaGVscD0i
KEV4cGVyaW1lbnRhbCkgVXBsb2FkIHRoZSBwYXRjaCB0byBSaWV0dmVsZCBjb2RlIHJldmlldyB0
b29sLiIpCiAgICAgZm9yY2VfY2xlYW4gPSBtYWtlX29wdGlvbigiLS1mb3JjZS1jbGVhbiIsIGFj
dGlvbj0ic3RvcmVfdHJ1ZSIsIGRlc3Q9ImZvcmNlX2NsZWFuIiwgZGVmYXVsdD1GYWxzZSwgaGVs
cD0iQ2xlYW4gd29ya2luZyBkaXJlY3RvcnkgYmVmb3JlIGFwcGx5aW5nIHBhdGNoZXMgKHJlbW92
ZXMgbG9jYWwgY2hhbmdlcyBhbmQgY29tbWl0cykiKQogICAgIGxvY2FsX2NvbW1pdCA9IG1ha2Vf
b3B0aW9uKCItLWxvY2FsLWNvbW1pdCIsIGFjdGlvbj0ic3RvcmVfdHJ1ZSIsIGRlc3Q9ImxvY2Fs
X2NvbW1pdCIsIGRlZmF1bHQ9RmFsc2UsIGhlbHA9Ik1ha2UgYSBsb2NhbCBjb21taXQgZm9yIGVh
Y2ggYXBwbGllZCBwYXRjaCIpCiAgICAgbm9uX2ludGVyYWN0aXZlID0gbWFrZV9vcHRpb24oIi0t
bm9uLWludGVyYWN0aXZlIiwgYWN0aW9uPSJzdG9yZV90cnVlIiwgZGVzdD0ibm9uX2ludGVyYWN0
aXZlIiwgZGVmYXVsdD1GYWxzZSwgaGVscD0iTmV2ZXIgcHJvbXB0IHRoZSB1c2VyLCBmYWlsIGFz
IGZhc3QgYXMgcG9zc2libGUuIikKZGlmZiAtLWdpdCBhL1dlYktpdFRvb2xzL1NjcmlwdHMvd2Vi
a2l0cHkvdG9vbC9zdGVwcy9wb3N0Y29kZXJldmlldy5weSBiL1dlYktpdFRvb2xzL1NjcmlwdHMv
d2Via2l0cHkvdG9vbC9zdGVwcy9wb3N0Y29kZXJldmlldy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0
NAppbmRleCAwMDAwMDAwLi42NzBjZTZjCi0tLSAvZGV2L251bGwKKysrIGIvV2ViS2l0VG9vbHMv
U2NyaXB0cy93ZWJraXRweS90b29sL3N0ZXBzL3Bvc3Rjb2RlcmV2aWV3LnB5CkBAIC0wLDAgKzEs
NzYgQEAKKyMgQ29weXJpZ2h0IChDKSAyMDEwIEdvb2dsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2
ZWQuCisjCisjIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9y
bXMsIHdpdGggb3Igd2l0aG91dAorIyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlk
ZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisjIG1ldDoKKyMKKyMgICAgICog
UmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5
cmlnaHQKKyMgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2lu
ZyBkaXNjbGFpbWVyLgorIyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVz
dCByZXByb2R1Y2UgdGhlIGFib3ZlCisjIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBj
b25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKyMgaW4gdGhlIGRvY3VtZW50
YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorIyBkaXN0cmli
dXRpb24uCisjICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBu
YW1lcyBvZiBpdHMKKyMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJv
bW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKyMgdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNp
ZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyMKKyMgVEhJUyBTT0ZUV0FSRSBJUyBQUk9W
SURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworIyAiQVMgSVMi
IEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5P
VAorIyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElU
WSBBTkQgRklUTkVTUyBGT1IKKyMgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQu
IElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKyMgT1dORVIgT1IgQ09OVFJJQlVUT1JT
IEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisjIFNQRUNJ
QUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBO
T1QKKyMgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJW
SUNFUzsgTE9TUyBPRiBVU0UsCisjIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVS
UlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorIyBUSEVPUlkgT0YgTElBQklMSVRZ
LCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisjIChJTkNM
VURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0Yg
VEhFIFVTRQorIyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJ
QklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCitmcm9tIHdlYmtpdHB5LnRvb2wuc3RlcHMuYWJzdHJh
Y3RzdGVwIGltcG9ydCBBYnN0cmFjdFN0ZXAKK2Zyb20gd2Via2l0cHkudG9vbC5zdGVwcy5vcHRp
b25zIGltcG9ydCBPcHRpb25zCisKKworY2xhc3MgUG9zdENvZGVSZXZpZXcoQWJzdHJhY3RTdGVw
KToKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgb3B0aW9ucyhjbHMpOgorICAgICAgICByZXR1
cm4gWworICAgICAgICAgICAgT3B0aW9ucy5jYywKKyAgICAgICAgICAgIE9wdGlvbnMuZGVzY3Jp
cHRpb24sCisgICAgICAgICAgICBPcHRpb25zLmZhbmN5X3JldmlldywKKyAgICAgICAgICAgIE9w
dGlvbnMucmV2aWV3LAorICAgICAgICBdCisKKyAgICBkZWYgcnVuKHNlbGYsIHN0YXRlKToKKyAg
ICAgICAgaWYgbm90IHNlbGYuX29wdGlvbnMuZmFuY3lfcmV2aWV3OgorICAgICAgICAgICAgcmV0
dXJuCisgICAgICAgIGlmIG5vdCBzZWxmLl9vcHRpb25zLnJldmlldzoKKyAgICAgICAgICAgIHJl
dHVybgorICAgICAgICAjIEZJWE1FOiBUaGlzIHdpbGwgYWx3YXlzIGJlIE5vbmUgYmVjYXVzZSB3
ZSBkb24ndCByZXRyaWV2ZSB0aGUgaXNzdWUKKyAgICAgICAgIyAgICAgICAgbnVtYmVyIGZybW8g
dGhlIENoYW5nZUxvZyB5ZXQuCisgICAgICAgIGNvZGVyZXZpZXdfaXNzdWUgPSBzdGF0ZS5nZXQo
ImNvZGVyZXZpZXdfaXNzdWUiKQorICAgICAgICBtZXNzYWdlID0gc2VsZi5fb3B0aW9ucy5kZXNj
cmlwdGlvbgorICAgICAgICBpZiBub3QgbWVzc2FnZToKKyAgICAgICAgICAgICMgSWYgd2UgaGF2
ZSBhbiBpc3N1ZSBudW1iZXIsIHRoZW4gdGhlIG1lc3NhZ2UgYmVjYXVzZSB0aGUgbGFiZWwKKyAg
ICAgICAgICAgICMgb2YgdGhlIG5ldyBwYXRjaC4gT3RoZXJ3aXNlLCBpdCBiZWNvbWVzIHRoZSB0
aXRsZSBvZiB0aGUgd2hvbGUKKyAgICAgICAgICAgICMgaXNzdWUuCisgICAgICAgICAgICBpZiBj
b2RlcmV2aWV3X2lzc3VlOgorICAgICAgICAgICAgICAgIG1lc3NhZ2UgPSAiVXBkYXRlZCBwYXRj
aCIKKyAgICAgICAgICAgIGVsaWYgc3RhdGUuZ2V0KCJidWdfdGl0bGUiKToKKyAgICAgICAgICAg
ICAgICAjIFRoaXMgaXMgdGhlIGNvbW1vbiBjYXNlIGZvciB0aGUgdGhlIGZpcnN0ICJ1cGxvYWQi
IGNvbW1hbmQuCisgICAgICAgICAgICAgICAgbWVzc2FnZSA9IHN0YXRlLmdldCgiYnVnX3RpdGxl
IikKKyAgICAgICAgICAgIGVsaWYgc3RhdGUuZ2V0KCJidWdfaWQiKToKKyAgICAgICAgICAgICAg
ICAjIFRoaXMgaXMgdGhlIGNvbW1vbiBjYXNlIGZvciB0aGUgInBvc3QiIGNvbW1hbmQgYW5kCisg
ICAgICAgICAgICAgICAgIyBzdWJzZXF1ZW50IHJ1bnMgb2YgdGhlICJ1cGxvYWQiIGNvbW1hbmQu
ICBJbiB0aGlzIGNhc2UsCisgICAgICAgICAgICAgICAgIyBJJ2QgcmF0aGVyIGFkZCB0aGUgbmV3
IHBhdGNoIHRvIHRoZSBleGlzdGluZyBpc3N1ZSwgYnV0CisgICAgICAgICAgICAgICAgIyB0aGF0
J3Mgbm90IGltcGxlbWVudGVkIHlldC4KKyAgICAgICAgICAgICAgICBtZXNzYWdlID0gIkNvZGUg
cmV2aWV3IGZvciAlcyIgJSBzZWxmLl90b29sLmJ1Z3MuYnVnX3VybF9mb3JfYnVnX2lkKHN0YXRl
WyJidWdfaWQiXSkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgIyBVbnJlYWNo
YWJsZSB3aXRoIG91ciBjdXJyZW50IGNvbW1hbmRzLCBidXQgd2UgbWlnaHQgaGl0CisgICAgICAg
ICAgICAgICAgIyB0aGlzIGNhc2UgaWYgd2Ugc3VwcG9ydCBidWctbGVzcyBjb2RlIHJldmlld3Mu
CisgICAgICAgICAgICAgICAgbWVzc2FnZSA9ICJDb2RlIHJldmlldyIKKyAgICAgICAgY3JlYXRl
ZF9pc3N1ZSA9IHNlbGYuX3Rvb2wuY29kZXJldmlldy5wb3N0KG1lc3NhZ2U9bWVzc2FnZSwKKyAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGVyZXZp
ZXdfaXNzdWU9Y29kZXJldmlld19pc3N1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgIGNjPXNlbGYuX29wdGlvbnMuY2MpCisgICAgICAgIGlmIGNy
ZWF0ZWRfaXNzdWU6CisgICAgICAgICAgICAjIEZJWE1FOiBSZWNvcmQgdGhlIGlzc3VlIG51bWJl
ciBpbiB0aGUgQ2hhbmdlTG9nLgorICAgICAgICAgICAgc3RhdGVbImNvZGVyZXZpZXdfaXNzdWUi
XSA9IGNyZWF0ZWRfaXNzdWUKZGlmZiAtLWdpdCBhL1dlYktpdFRvb2xzL1NjcmlwdHMvd2Via2l0
cHkvdG9vbC9zdGVwcy9wb3N0ZGlmZi5weSBiL1dlYktpdFRvb2xzL1NjcmlwdHMvd2Via2l0cHkv
dG9vbC9zdGVwcy9wb3N0ZGlmZi5weQppbmRleCBlZjhmNGM4Li41YjI4MzgzIDEwMDY0NAotLS0g
YS9XZWJLaXRUb29scy9TY3JpcHRzL3dlYmtpdHB5L3Rvb2wvc3RlcHMvcG9zdGRpZmYucHkKKysr
IGIvV2ViS2l0VG9vbHMvU2NyaXB0cy93ZWJraXRweS90b29sL3N0ZXBzL3Bvc3RkaWZmLnB5CkBA
IC00Niw2ICs0NiwxMCBAQCBjbGFzcyBQb3N0RGlmZihBYnN0cmFjdFN0ZXApOgogICAgICAgICBk
aWZmID0gc2VsZi5jYWNoZWRfbG9va3VwKHN0YXRlLCAiZGlmZiIpCiAgICAgICAgIGRpZmZfZmls
ZSA9IFN0cmluZ0lPLlN0cmluZ0lPKGRpZmYpICMgYWRkX3BhdGNoX3RvX2J1ZyBleHBlY3RzIGEg
ZmlsZS1saWtlIG9iamVjdAogICAgICAgICBkZXNjcmlwdGlvbiA9IHNlbGYuX29wdGlvbnMuZGVz
Y3JpcHRpb24gb3IgIlBhdGNoIgotICAgICAgICBzZWxmLl90b29sLmJ1Z3MuYWRkX3BhdGNoX3Rv
X2J1ZyhzdGF0ZVsiYnVnX2lkIl0sIGRpZmZfZmlsZSwgZGVzY3JpcHRpb24sIG1hcmtfZm9yX3Jl
dmlldz1zZWxmLl9vcHRpb25zLnJldmlldywgbWFya19mb3JfY29tbWl0X3F1ZXVlPXNlbGYuX29w
dGlvbnMucmVxdWVzdF9jb21taXQpCisgICAgICAgIGNvbW1lbnRfdGV4dCA9IE5vbmUKKyAgICAg
ICAgY29kZXJldmlld19pc3N1ZSA9IHN0YXRlLmdldCgiY29kZXJldmlld19pc3N1ZSIpCisgICAg
ICAgIGlmIGNvZGVyZXZpZXdfaXNzdWU6CisgICAgICAgICAgICBjb21tZW50X3RleHQgPSAiRmVl
bCBmcmVlIHRvIHByb3ZpZGUgY29tbWVudHMgYXQgJXMiICUgc2VsZi5fdG9vbC5jb2RlcmV2aWV3
LnVybF9mb3JfaXNzdWUoY29kZXJldmlld19pc3N1ZSkKKyAgICAgICAgc2VsZi5fdG9vbC5idWdz
LmFkZF9wYXRjaF90b19idWcoc3RhdGVbImJ1Z19pZCJdLCBkaWZmX2ZpbGUsIGRlc2NyaXB0aW9u
LCBjb21tZW50X3RleHQ9Y29tbWVudF90ZXh0LCBtYXJrX2Zvcl9yZXZpZXc9c2VsZi5fb3B0aW9u
cy5yZXZpZXcsIG1hcmtfZm9yX2NvbW1pdF9xdWV1ZT1zZWxmLl9vcHRpb25zLnJlcXVlc3RfY29t
bWl0KQogICAgICAgICBpZiBzZWxmLl9vcHRpb25zLm9wZW5fYnVnOgogICAgICAgICAgICAgc2Vs
Zi5fdG9vbC51c2VyLm9wZW5fdXJsKHNlbGYuX3Rvb2wuYnVncy5idWdfdXJsX2Zvcl9idWdfaWQo
c3RhdGVbImJ1Z19pZCJdKSkK
</data>

          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>53309</attachid>
            <date>2010-04-13 21:26:56 -0700</date>
            <delta_ts>2010-04-13 21:26:56 -0700</delta_ts>
            <desc>Patch</desc>
            <filename>bug-37418-20100413212654.patch</filename>
            <type>text/plain</type>
            <size>1671</size>
            <attacher name="Eric Seidel (no email)">eric</attacher>
            
              <data encoding="base64">ZGlmZiAtLWdpdCBhL1dlYktpdFRvb2xzL0NoYW5nZUxvZyBiL1dlYktpdFRvb2xzL0NoYW5nZUxv
ZwppbmRleCBjOThiODVmLi4zNDQyZTgwIDEwMDY0NAotLS0gYS9XZWJLaXRUb29scy9DaGFuZ2VM
b2cKKysrIGIvV2ViS2l0VG9vbHMvQ2hhbmdlTG9nCkBAIC0xLDUgKzEsMTEgQEAKIDIwMTAtMDQt
MTMgIEVyaWMgU2VpZGVsICA8ZXJpY0B3ZWJraXQub3JnPgogCisgICAgICAgIFVucmV2aWV3ZWQs
IGp1c3QgZml4aW5nIGEgY29uc3RhbnQgaW4gdGhlIFJpZXR2ZWxkIHVuaXQgdGVzdC4KKworICAg
ICAgICAqIFNjcmlwdHMvd2Via2l0cHkvY29tbW9uL25ldC9yaWV0dmVsZF91bml0dGVzdC5weQor
CisyMDEwLTA0LTEzICBFcmljIFNlaWRlbCAgPGVyaWNAd2Via2l0Lm9yZz4KKwogICAgICAgICBV
bnJldmlld2VkLCBqdXN0IGFkZGluZyBtaXNzaW5nIE1vY2sgdG8gZml4IHB5dGhvbiB0ZXN0cy4K
IAogICAgICAgICAqIFNjcmlwdHMvd2Via2l0cHkvdG9vbC9tb2NrdG9vbC5weToKQEAgLTExLDcg
KzE3LDcgQEAKICAgICAgICAgQWRkIGV4cGVyaW1lbnRhbCBwcm90b3R5cGUgUmlldHZlbGQgaW50
ZWdyYXRpb24gdG8gd2Via2l0LXBhdGNoIHVwbG9hZAogICAgICAgICBodHRwczovL2J1Z3Mud2Vi
a2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9Mzc0MTgKIAotICAgICAgICBUaGlzIHBhdGNoIGFkZHMg
YmFyZS1ib25lcyBpbnRlZ3J0aW9uIHdpdGggUmlldHZlbGQgZm9yIGNvZGUgcmV2aWV3cy4KKyAg
ICAgICAgVGhpcyBwYXRjaCBhZGRzIGJhcmUtYm9uZXMgaW50ZWdyYXRpb24gd2l0aCBSaWV0dmVs
ZCBmb3IgY29kZSByZXZpZXdzLgogICAgICAgICBUaGUgYmVoYXZpb3IgaXMgaGlkZGVuIGJlaGlu
ZCB0aGUgLS1mYW5jeS1yZXZpZXcgY29tbWFuZCBsaW5lIGZsYWcuCiAgICAgICAgIEN1cnJlbnRs
eSwgdGhlcmUncyBubyBzdXBwb3J0IGZvciB1cGxvYWRpbmcgbW9yZSB0aGFuIG9uZSBwYXRjaCBw
ZXIKICAgICAgICAgaXNzdWUgKHdoaWNoIGlzIGEgbmljZSBmZWF0dXJlIG9mIFJpZXR2ZWxkKS4g
IFRoZSBwbGFuIGlzIHRvIHBsYXkgd2l0aApkaWZmIC0tZ2l0IGEvV2ViS2l0VG9vbHMvU2NyaXB0
cy93ZWJraXRweS9jb21tb24vbmV0L3JpZXR2ZWxkX3VuaXR0ZXN0LnB5IGIvV2ViS2l0VG9vbHMv
U2NyaXB0cy93ZWJraXRweS9jb21tb24vbmV0L3JpZXR2ZWxkX3VuaXR0ZXN0LnB5CmluZGV4IGRh
NWUwZjUuLjljNWEyOWUgMTAwNjQ0Ci0tLSBhL1dlYktpdFRvb2xzL1NjcmlwdHMvd2Via2l0cHkv
Y29tbW9uL25ldC9yaWV0dmVsZF91bml0dGVzdC5weQorKysgYi9XZWJLaXRUb29scy9TY3JpcHRz
L3dlYmtpdHB5L2NvbW1vbi9uZXQvcmlldHZlbGRfdW5pdHRlc3QucHkKQEAgLTM2LDQgKzM2LDQg
QEAgY2xhc3MgUmlldHZlbGRUZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKICAgICBkZWYgdGVzdF91
cmxfZm9yX2lzc3VlKHNlbGYpOgogICAgICAgICByaWV0dmVsZCA9IFJpZXR2ZWxkKE1vY2soKSkK
ICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyaWV0dmVsZC51cmxfZm9yX2lzc3VlKDM0MjIzKSwK
LSAgICAgICAgICAgICAgICAgICAgICAgICAiaHR0cHM6Ly9jb2RlcmV2aWV3LmFwcHNwb3QuY29t
LzM0MjIzIikKKyAgICAgICAgICAgICAgICAgICAgICAgICAiaHR0cHM6Ly93a3JpZXR2ZWxkLmFw
cHNwb3QuY29tLzM0MjIzIikK
</data>

          </attachment>
      

    </bug>

</bugzilla>