<?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>26283</bug_id>
          
          <creation_ts>2009-06-09 17:22:21 -0700</creation_ts>
          <short_desc>WebKit needs scripts to auto-commit patches from the commit queue</short_desc>
          <delta_ts>2009-06-23 02:13:48 -0700</delta_ts>
          <reporter_accessible>1</reporter_accessible>
          <cclist_accessible>1</cclist_accessible>
          <classification_id>1</classification_id>
          <classification>Unclassified</classification>
          <product>WebKit</product>
          <component>Tools / Tests</component>
          <version>528+ (Nightly build)</version>
          <rep_platform>Mac</rep_platform>
          <op_sys>OS X 10.5</op_sys>
          <bug_status>RESOLVED</bug_status>
          <resolution>FIXED</resolution>
          
          
          <bug_file_loc></bug_file_loc>
          <status_whiteboard></status_whiteboard>
          <keywords></keywords>
          <priority>P2</priority>
          <bug_severity>Normal</bug_severity>
          <target_milestone>---</target_milestone>
          <dependson>26524</dependson>
    
    <dependson>26299</dependson>
    
    <dependson>26300</dependson>
          
          <everconfirmed>1</everconfirmed>
          <reporter name="Eric Seidel (no email)">eric</reporter>
          <assigned_to name="Eric Seidel (no email)">eric</assigned_to>
          <cc>aroben</cc>
    
    <cc>ddkilzer</cc>
    
    <cc>dglazkov</cc>
    
    <cc>levin</cc>
    
    <cc>mrowe</cc>
    
    <cc>ojan</cc>
    
    <cc>tony</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>125042</commentid>
    <comment_count>0</comment_count>
    <who name="Eric Seidel (no email)">eric</who>
    <bug_when>2009-06-09 17:22:21 -0700</bug_when>
    <thetext>WebKit needs scripts to auto-commit patches from the commit queue

I plan to build some of these for myself and will post them here.  Starting with a script to get an approved patch URL out from a bug number.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>125043</commentid>
    <comment_count>1</comment_count>
      <attachid>31114</attachid>
    <who name="Eric Seidel (no email)">eric</who>
    <bug_when>2009-06-09 17:23:11 -0700</bug_when>
    <thetext>Created attachment 31114
patch-url-from-bug: returns the URL of the r+&apos;d patch on the bug</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>125063</commentid>
    <comment_count>2</comment_count>
    <who name="Eric Seidel (no email)">eric</who>
    <bug_when>2009-06-09 18:08:38 -0700</bug_when>
    <thetext>Steps I would like to eventually build a script to do:

Scan the commit queue, for each bug:
1.  curl down the patch
2.  apply it with svn-apply
3.  build the patch
4.  run the tests with the patch applied
5.  post to the bug the results of the run
6.  fix up the changelogs to include the reviewer name
7.  land the patch
8.  Update the bug with the landed revision number
9.  optionally close the bug or obsolete the patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>125219</commentid>
    <comment_count>3</comment_count>
      <attachid>31142</attachid>
    <who name="Eric Seidel (no email)">eric</who>
    <bug_when>2009-06-10 15:21:56 -0700</bug_when>
    <thetext>Created attachment 31142
bugzilla-tool -- command line access to bugzilla (requires BeautifulSoup)

Commands:
apply-patch-from-bug
bugs-to-commit
patches-to-commit
reviewed-patches-on

Still needs lots of work.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>125430</commentid>
    <comment_count>4</comment_count>
      <attachid>31189</attachid>
    <who name="Eric Seidel (no email)">eric</who>
    <bug_when>2009-06-11 19:02:47 -0700</bug_when>
    <thetext>Created attachment 31189
latest bugzilla-tool, can download patch, apply it, commit it, and update the bug (not ready for general usage yet)</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>125455</commentid>
    <comment_count>5</comment_count>
    <who name="Eric Seidel (no email)">eric</who>
    <bug_when>2009-06-12 02:21:48 -0700</bug_when>
    <thetext>I&apos;m using bug 26301 for testing.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>125558</commentid>
    <comment_count>6</comment_count>
    <who name="Eric Seidel (no email)">eric</who>
    <bug_when>2009-06-12 15:43:25 -0700</bug_when>
    <thetext>Tada!  I have a working script!  see bug 26191</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>125578</commentid>
    <comment_count>7</comment_count>
      <attachid>31223</attachid>
    <who name="Eric Seidel (no email)">eric</who>
    <bug_when>2009-06-12 17:28:51 -0700</bug_when>
    <thetext>Created attachment 31223
bugzilla-tool -- has successfully landed patches, but is not ready for general use yet</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>126109</commentid>
    <comment_count>8</comment_count>
      <attachid>31326</attachid>
    <who name="Eric Seidel (no email)">eric</who>
    <bug_when>2009-06-15 18:36:31 -0700</bug_when>
    <thetext>Created attachment 31326
bugzilla-tool, can now obsolete patches, and is divided into classes better

Nearly ready for review.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>126117</commentid>
    <comment_count>9</comment_count>
    <who name="Eric Seidel (no email)">eric</who>
    <bug_when>2009-06-15 19:23:36 -0700</bug_when>
    <thetext>Another patch committed by the script: bug 25353.  Fixing the autogenerated comment to be nicer. :)</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>126119</commentid>
    <comment_count>10</comment_count>
      <attachid>31327</attachid>
    <who name="Eric Seidel (no email)">eric</who>
    <bug_when>2009-06-15 19:28:20 -0700</bug_when>
    <thetext>Created attachment 31327
bugzilla-tool, now with better bug comments after commit</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>126630</commentid>
    <comment_count>11</comment_count>
      <attachid>31480</attachid>
    <who name="Eric Seidel (no email)">eric</who>
    <bug_when>2009-06-17 18:24:50 -0700</bug_when>
    <thetext>Created attachment 31480
bugzilla-tool -- now able to post local diffs and commits as patches

No, I did not post this patch with the tool... yet. :)  It&apos;s not actually stored in my WebKit tree yet, rather in ~/bin/

I think the only thing left before it&apos;s really useful is option parsing for the individual commands.  I may clean it up and post it for landing as-is though.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>126688</commentid>
    <comment_count>12</comment_count>
      <attachid>31491</attachid>
    <who name="Eric Seidel (no email)">eric</who>
    <bug_when>2009-06-18 04:20:51 -0700</bug_when>
    <thetext>Created attachment 31491
bugzilla-tool -- now with fancy option parsing and excessive OOP ;)

This is nearly ready for prime-time.  I might add an SVN class before submitting this for review, we&apos;ll see.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>126805</commentid>
    <comment_count>13</comment_count>
      <attachid>31516</attachid>
    <who name="Eric Seidel (no email)">eric</who>
    <bug_when>2009-06-18 16:05:02 -0700</bug_when>
    <thetext>Created attachment 31516
Working bugzilla-tool for review (script posted this patch itself)


---
 2 files changed, 903 insertions(+), 0 deletions(-)</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>126961</commentid>
    <comment_count>14</comment_count>
    <who name="David Levin">levin</who>
    <bug_when>2009-06-19 10:45:31 -0700</bug_when>
    <thetext>I tried using this tool.  My first comment is that it seemed to make things a lot easier.

However, after starting to use it, I had a few problems:

0. There seems to be a script error in the current version when applying patches, which I fixed by adding in &quot;False&quot; in line 577,         tool.scm().ensure_clean_working_directory(False)).

1. I couldn&apos;t put it in my directory because it wanted to clean everything (so I had to hack the way it found the webkit dir).

2. I couldn&apos;t apply multiple patches.
I did a git commit for the first patch and then tried to apply the second patch, but the tool reset everything back to trunk.  I commented out the stuff that did the clean and the git svn rebase.

3. I wish that I could apply patches with &quot;--whitespace=fix&quot; :) like I can when I use git apply.

4. It started emitting *.orig files when apply patches even when there didn&apos;t seem to be a conflict. This made me think something was going wrong.  (Of course this was when I tried to apply a second patch so maybe that was the issue.) 


</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>126977</commentid>
    <comment_count>15</comment_count>
    <who name="Eric Seidel (no email)">eric</who>
    <bug_when>2009-06-19 11:32:43 -0700</bug_when>
    <thetext>(In reply to comment #14)
&gt; I tried using this tool.  My first comment is that it seemed to make things a
&gt; lot easier.

Yay!

&gt; However, after starting to use it, I had a few problems:

It&apos;s certainly Alpha quality at best!

&gt; 0. There seems to be a script error in the current version when applying
&gt; patches, which I fixed by adding in &quot;False&quot; in line 577,        
&gt; tool.scm().ensure_clean_working_directory(False)).

I need a way to compile-time check python (someone mentioned pycheck?) to make it robust against these kind of refactors.

&gt; 1. I couldn&apos;t put it in my directory because it wanted to clean everything (so
&gt; I had to hack the way it found the webkit dir).

Yup.  It needs to be landed to be useful.  I think it also needs to be taught how to work from cwd(), that the SCM classes should take a path (which can be cwd()) and then they can walk backwards to find the root.  Then it makes it useful for when you have more than one webkit checkout.

&gt; 2. I couldn&apos;t apply multiple patches.
&gt; I did a git commit for the first patch and then tried to apply the second
&gt; patch, but the tool reset everything back to trunk.  I commented out the stuff
&gt; that did the clean and the git svn rebase.

There is not currently an option to have it apply them locally, or to have it *not* clean the working directory.  I only recently added command-level option parsing.  Now that that&apos;s there, it should be easy to add both options.

&gt; 3. I wish that I could apply patches with &quot;--whitespace=fix&quot; :) like I can when
&gt; I use git apply.

I didn&apos;t know about --whitespace=fix.  Sounds awesome!

&gt; 4. It started emitting *.orig files when apply patches even when there didn&apos;t
&gt; seem to be a conflict. This made me think something was going wrong.  (Of
&gt; course this was when I tried to apply a second patch so maybe that was the
&gt; issue.) 

That&apos;s svn-apply for you (which is the way both the Git and SVN classes apply patches atm.  They use it to support file moves, etc... even though it doesn&apos;t yet work right for git).  The script needs to be made smarter.  I will likely re-write that script on top of this SVN class eventually.  See:
https://bugs.webkit.org/show_bug.cgi?id=26299
https://bugs.webkit.org/show_bug.cgi?id=26300

Again, the script is alpha-quality at best.  Once I add the proper --force option to things that need to clean the directory at least it will be safe for others, if not yet fully useful.  I hope that once I get some version of this script in it will be easy to colaborate with other python hackers to make it much much better!  My hope is just that this is a good *start* to our next-gen of WebKit scripts which will now be smarter, because they&apos;ll be able to deal with bugzilla (which they never could before) as well as git + svn in a saner way.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>127063</commentid>
    <comment_count>16</comment_count>
      <attachid>31573</attachid>
    <who name="Eric Seidel (no email)">eric</who>
    <bug_when>2009-06-19 16:39:09 -0700</bug_when>
    <thetext>Created attachment 31573
Updated patch, split into modules, now supports --force-clean


---
 4 files changed, 985 insertions(+), 0 deletions(-)</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>127065</commentid>
    <comment_count>17</comment_count>
    <who name="Eric Seidel (no email)">eric</who>
    <bug_when>2009-06-19 16:40:59 -0700</bug_when>
    <thetext>(In reply to comment #14)

I&apos;ve addressed concerns 0 and 2 in this patch.  The rest will need more work. :)

Next most important is probably to make it cwd() sensitive.  Hopefully this current patch is &quot;good enough&quot; to start talking about being landed.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>127068</commentid>
    <comment_count>18</comment_count>
      <attachid>31575</attachid>
    <who name="Eric Seidel (no email)">eric</who>
    <bug_when>2009-06-19 16:45:02 -0700</bug_when>
    <thetext>Created attachment 31575
Updated patch, split into modules, now supports --force-clean


---
 4 files changed, 1038 insertions(+), 0 deletions(-)</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>127418</commentid>
    <comment_count>19</comment_count>
    <who name="Eric Seidel (no email)">eric</who>
    <bug_when>2009-06-22 11:58:41 -0700</bug_when>
    <thetext>I suspect that Dave Levin, David Kilzer, Mark Rowe, Adam Roben, or Dimitri Glazkov are the only ones who have both the python knowledge and scripting interest to review this.  Do one of you have cycles to do so today?  I&apos;d like to iterate further with this script.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>127429</commentid>
    <comment_count>20</comment_count>
    <who name="David Levin">levin</who>
    <bug_when>2009-06-22 12:59:24 -0700</bug_when>
    <thetext>I&apos;ll look.  If someone else beats me to it or provides additional comments, that would be great too.
</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>127450</commentid>
    <comment_count>21</comment_count>
      <attachid>31676</attachid>
    <who name="Eric Seidel (no email)">eric</who>
    <bug_when>2009-06-22 14:39:32 -0700</bug_when>
    <thetext>Created attachment 31676
Updated to respect the current working directory instead of using ../..


---
 4 files changed, 1086 insertions(+), 0 deletions(-)</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>127507</commentid>
    <comment_count>22</comment_count>
      <attachid>31575</attachid>
    <who name="David Levin">levin</who>
    <bug_when>2009-06-22 17:17:01 -0700</bug_when>
    <thetext>Comment on attachment 31575
Updated patch, split into modules, now supports --force-clean

Most of these are pretty minor but there are enough comments that it would be worth seeing after it is fixed up so r- for now.



I wish the tool would print out its --help content if I just type its name w/o any args but maybe I&apos;m atypical?


&gt; 91d483a5e9f4b33db4e931e6f99f31bb86066844
&gt; diff --git a/WebKitTools/ChangeLog b/WebKitTools/ChangeLog
&gt; index 14937a6..5885bc0 100644
&gt; --- a/WebKitTools/ChangeLog
&gt; +++ b/WebKitTools/ChangeLog
&gt; @@ -1,3 +1,58 @@
&gt; +2009-06-18  Eric Seidel  &lt;eric@webkit.org&gt;
&gt; +
&gt; +        Reviewed by NOBODY (OOPS!).
&gt; +
&gt; +        WebKit needs a script to interact with bugzilla and automate
&gt; +        parts of the patch posting and commit processes.
&gt; +        https://bugs.webkit.org/show_bug.cgi?id=26283
&gt; +
&gt; +        This is really a first-draft tool.
&gt; +        It&apos;s to the point where it&apos;s useful to more people than just me now though.
&gt; +        Git support works.  SVN support is written, but untested.
&gt; +
&gt; +        This tool requires BeautifulSoup and mechanize python modules to run:
&gt; +        sudo easy_install BeautifulSoup
&gt; +        sudo easy_install mechanize

I wish that this was part of the help in the script.  Also not everyone has easy_install installed either.

&gt; +
&gt; +        More important than the tool itself are the Bugzilla, Git and SVN class abstractions
&gt; +        which I hope will allow easy writing of future tools.
&gt; +
&gt; +        I intend to break Git, SVN and SCM out into an scmtools.py module after landing.

It looks like you did this already.


&gt; +        Likewise, Bugzilla into a bugzilla.py module.  I felt it would be easier to review in one file.

Already done as well!


&gt; diff --git a/WebKitTools/Scripts/bugzilla-tool b/WebKitTools/Scripts/bugzilla-tool
&gt; new file mode 100755
&gt; index 0000000..f28fa0a
&gt; --- /dev/null
&gt; +++ b/WebKitTools/Scripts/bugzilla-tool
&gt; @@ -0,0 +1,446 @@
&gt; +#!/usr/bin/python
&gt; +
&gt; +# Copyright (C) 2009 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
&gt; +# are met:
&gt; +# 1. Redistributions of source code must retain the above copyright
&gt; +#    notice, this list of conditions and the following disclaimer.
&gt; +# 2. Redistributions in binary form must reproduce the above copyright
&gt; +#    notice, this list of conditions and the following disclaimer in the
&gt; +#    documentation and/or other materials provided with the distribution.
&gt; +#

Add clause #3
 *     * Neither the name of Google Inc. nor the names of its
 * contributors may be used to endorse or promote products derived from
 * this software without specific prior written permission.


&gt; +# THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS&apos;&apos; AND ANY
Consider changing to:
 # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS &quot;AS IS&quot; AND ANY 

&gt; +#
&gt; +# A tool for automating dealing with bugzilla, posting patches, commiting patches, etc.

s/commiting/committing/

&gt; +
&gt; +import sys
&gt; +import re
&gt; +import os
&gt; +import subprocess

Nice to alphabetize these.

&gt; +
&gt; +from optparse import OptionParser, IndentedHelpFormatter, SUPPRESS_USAGE, make_option
&gt; +
&gt; +sys.path.append(&quot;modules&quot;) # Import WebKit-specific modules

Modified the sys.path is usually something done as a last resort. &quot;from modules.bugzilla ...&quot; would be better.  You&apos;ll need to add an empty __init__.py file in WebKitTools/Scripts to do this.



&gt; +from bugzilla import Bugzilla
&gt; +from scm import detect_scm_system, ScriptError
&gt; +
&gt; +def chdir_webkit():
&gt; +    # We could instead ask the SCM system for its root directory (since we need that for making patches as well)
End with &quot;.&quot;

&gt; +    script_directory = os.path.abspath(sys.path[0])
&gt; +    webkit_directory = os.path.abspath(os.path.join(script_directory, &quot;../..&quot;))
&gt; +    print webkit_directory
Is this some debug info that was left behind?  If not, should it say something before doing the print (e.g. &quot;Working in %s&quot;)

&gt; +    os.chdir(webkit_directory)
&gt; +
&gt; +
&gt; +def log(string):
&gt; +    print &gt;&gt; sys.stderr, string
&gt; +
&gt; +def error(string):
&gt; +    log(string)
&gt; +    exit(1)
&gt; +
&gt; +
Extra blank line?

&gt; +# These could be put in some sort of changelogs.py
&gt; +def latest_changelog_entry(changelog_path):
&gt; +    entry_lines = []
&gt; +    changelog = open(changelog_path)
&gt; +    try:
&gt; +        log(&quot;Parsing ChangeLog: &quot; + changelog_path)
&gt; +        # The first line should be a date line
Add period at end of comment (throughout).

Why not validate that the first line is a date line by using the regex?
 
&gt; +        entry_lines.append(changelog.readline())
&gt; +        
&gt; +        # e.g. 2009-06-03  Eric Seidel  &lt;eric@webkit.org&gt;
&gt; +        changelog_date_line_regexp = &apos;^([\d\-]+)  (.+)  &lt;(.+)&gt;$&apos;

How about something more strict about the date format and slightly looser about the spacing:
        changelog_date_line_regexp = (&apos;^(\d{1,4}\-){2}\d{1-4}&apos; # Consume the date.
                                      + &apos;\S+(.+)\S+&apos; # Consume the name.
                                      + &apos;&lt;([^&lt;&gt;]+)&gt;$&apos;) # And finally the email address.


&gt; +        for line in changelog:
&gt; +            # if we&apos;ve hit the next entry, return
&gt; +            if re.match(changelog_date_line_regexp, line):

Consider compiling the regex http://docs.python.org/library/re.html#module-contents

&gt; +     finally:
&gt; +             changelog.close()

changelog.close() is indented too far.

&gt; +
&gt; +def modified_changelogs(scm):
&gt; +    changelog_paths = []
&gt; +    paths = scm.changed_files()
&gt; +    for path in paths:
&gt; +        if re.search(&apos;ChangeLog&apos;, path):

What about:
   path.endswith(&quot;changeLog&apos;)
?


&gt; +            changelog_paths.append(path)
&gt; +    return changelog_paths

In WebKitTools/Scripts/commit-log-editor, it has a specific ordering for the changelogs in the commit message.  It isn&apos;t followed here.

&gt; +
&gt; +def commit_message_for_this_commit(scm):
&gt; +    changelog_paths = modified_changelogs(scm)
&gt; +    if len(changelog_paths) == 0:

Consider
   if not len(changelog_paths):

&gt; +        error(&quot;Found no modified ChangeLogs, can&apos;t create a commit message.&quot;)
&gt; +
&gt; +    changelog_messages = []
&gt; +    for path in changelog_paths:
&gt; +        changelog_entry = latest_changelog_entry(path)
&gt; +        if not changelog_entry:
&gt; +            error(&quot;Failed to parse ChangeLog: &quot; + os.path.abspath(path))
&gt; +        changelog_messages.append(changelog_entry)

This code does do the titles &quot;WebCore;&quot;, &quot;LayoutTests:&quot;, etc. that are done in WebKitTools/Scripts/commit-log-editor.

&gt; +    return &apos;&apos;.join(changelog_messages)
&gt; +
&gt; +
&gt; +class Command:
&gt; +    def __init__(self, help_text, argument_names=&quot;&quot;, options = []):
No spaces around = in this case.

&gt; +        self.help_text = help_text
&gt; +        self.argument_names = argument_names
&gt; +        self.options = options
&gt; +        self.option_parser = OptionParser(usage=SUPPRESS_USAGE, add_help_option=False, option_list=self.options)
&gt; +    
&gt; +    def name_with_arguments(self, command_name):
&gt; +        usage_string = command_name
&gt; +        if (len(self.options) &gt; 0):
No need for ().

&gt; +            usage_string += &quot; [options]&quot;
&gt; +        if (self.argument_names != &quot;&quot;):
Prefer
   if self.argument_names:

&gt; +            usage_string += &quot; &quot; + self.argument_names
&gt; +        return usage_string
&gt; +
&gt; +    def parse_args(self, args):
&gt; +        return self.option_parser.parse_args(args)
&gt; +
&gt; +    def execute(self, options, args, tool):
&gt; +        raise NotImplementedError, &quot;subclasses must implement&quot;
&gt; +
&gt; +
&gt; +class BugsInCommitQueue (Command):
No space before ( even in inheritance (throughout).

&gt; +    def __init__(self):
&gt; +        Command.__init__(self, &apos;Bugs in the commit queue&apos;)
&gt; +
&gt; +    def execute(self, options, args, tool):
&gt; +        bug_ids = tool.bugs.fetch_bug_ids_from_commit_queue()
&gt; +        for bug_id in bug_ids:
&gt; +            print tool.bugs.bug_url_for_bug_id(bug_id)
In general it is safer to print like this:

 print &quot;%s&quot; % tool.bugs.bug_url_for_bug_id(bug_id)

which will avoid treating anything in the string as an escape sequence.

&gt; +
&gt; +
&gt; +class PatchesInCommitQueue (Command):
&gt; +    def __init__(self):
&gt; +        Command.__init__(self, &apos;Patches attached to bugs in the commit queue&apos;)
&gt; +
&gt; +    def execute(self, options, args, tool):
&gt; +        patches = tool.bugs.fetch_patches_from_commit_queue()
&gt; +        log(&quot;Patches in commit queue:&quot;)
&gt; +        for patch in patches:
&gt; +            print patch[&apos;url&apos;]

print &quot;%s&quot; % patch[&apos;url&apos;]
(throughout)

&gt; +
&gt; +
&gt; +class ReviewedPatchesOnBug (Command):
&gt; +    def __init__(self):
&gt; +        Command.__init__(self, &apos;r+\&apos;d patches on a bug&apos;, &apos;BUGID&apos;)
&gt; +
&gt; +    def execute(self, options, args, tool):
&gt; +        bug_id = args[0]
&gt; +        patches_to_land = tool.bugs.fetch_reviewed_patches_from_bug(bug_id)
&gt; +        for patch in patches_to_land:
&gt; +            print patch[&apos;url&apos;]
&gt; +
&gt; +
&gt; +class ApplyPatchesFromBug (Command):
&gt; +    def __init__(self):
&gt; +        options = [
&gt; +            make_option(&quot;--no-update&quot;, action=&quot;store_false&quot;, dest=&quot;update&quot;, default=True, help=&quot;Don&apos;t update the working directory before applying patches&quot;),
&gt; +            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; +            make_option(&quot;--no-clean&quot;, action=&quot;store_false&quot;, dest=&quot;clean&quot;, default=True, help=&quot;Don&apos;t check if the working directory is clean before applying patches&quot;),
&gt; +        ]
&gt; +        Command.__init__(self, &apos;Applies all patches on a bug to the local working directory without committing.&apos;, &apos;BUGID&apos;, options=options)
&gt; +
&gt; +    def execute(self, options, args, tool):
&gt; +        bug_id = args[0]
&gt; +        patches = tool.bugs.fetch_reviewed_patches_from_bug(bug_id)
&gt; +        chdir_webkit()
&gt; +        if options.clean:
&gt; +            tool.scm().ensure_clean_working_directory(options.force_clean, allow_local_commits = True)
No space around = in this case.  (Personally, I&apos;d rather always do spaces around = but alas such is not python style.)


&gt; +        if options.update:
&gt; +            tool.scm().update_webkit()
&gt; +        
&gt; +        # Should we error out if tool.scm does not support local commits?
&gt; +        for patch in patches:
&gt; +            tool.scm().apply_patch(patch)

Do all the patches get applied as one bunch?  I typically apply each one as a separate &quot;git commit&quot;.
No sure how do-able this though.  (I guess I&apos;d like to encourage one patch per bug and then there is no issue :).)


&gt; +    def run_and_throw_if_fail(self, script_name):
&gt; +        build_webkit_process = subprocess.Popen(script_name, shell=True)
&gt; +        return_code = build_webkit_process.wait()
&gt; +        if return_code != 0:

Use
        if return_code:

&gt; +            raise ScriptError(script_name + &quot; failed with code &quot; + return_code)



&gt; diff --git a/WebKitTools/Scripts/modules/bugzilla.py b/WebKitTools/Scripts/modules/bugzilla.py


&gt; +def read_config(key):
&gt; +    # Need a way to read from svn too
&gt; +    config_process = subprocess.Popen(&quot;git config --get bugzilla.&quot; + key, stdout=subprocess.PIPE, shell=True)
&gt; +    value = config_process.communicate()[0]
&gt; +    return_code = config_process.wait()
&gt; +
&gt; +    if return_code != 0:

Use
    if return_code:

&gt; +        return None
&gt; +
&gt; +class Bugzilla:
&gt; +    def __init__(self, dryrun = False):
No space around =.


&gt; +        self.br = Browser()
s/self.br/self.browser/


&gt; +
&gt; +    # This could eventually be a text file
&gt; +    reviewer_usernames_to_full_names = {
&gt; +        &quot;abarth&quot; : &quot;Adam Barth&quot;,
&gt; +        &quot;adele&quot; : &quot;Adele Peterson&quot;,
&gt; +        &quot;ariya.hidayat&quot; : &quot;Ariya Hidayat&quot;,
&gt; +        &quot;darin&quot; : &quot;Darin Adler&quot;,
&gt; +        &quot;dglazkov&quot; : &quot;Dimitri Glazkov&quot;,
&gt; +        &quot;eric&quot; : &quot;Eric Seidel&quot;,
&gt; +        &quot;ddkilzer&quot; : &quot;David Kilzer&quot;,
&gt; +        &quot;fishd&quot; : &quot;Darin Fisher&quot;,
&gt; +        &quot;gns&quot; : &quot;Gustavo Noronha&quot;,
&gt; +        &quot;hyatt&quot; : &quot;David Hyatt&quot;,
&gt; +        &quot;jmalonzo&quot; : &quot;Jan Alonzo&quot;,
&gt; +        &quot;levin&quot; : &quot;David Levin&quot;,
&gt; +        &quot;mitz&quot; : &quot;Dan Bernstein&quot;,
&gt; +        &quot;mjs&quot; : &quot;Maciej Stachoviak&quot;,
&gt; +        &quot;mrowe&quot; : &quot;Mark Rowe&quot;,
&gt; +        &quot;oliver&quot; : &quot;Oliver Hunt&quot;,
&gt; +        &quot;staikos&quot; : &quot;George Staikos&quot;,
&gt; +        &quot;treat&quot; : &quot;Adam Treat&quot;,
&gt; +        &quot;timothy&quot; : &quot;Timothy Hatcher&quot;,
&gt; +        &quot;xan.lopez&quot; : &quot;Xan Lopez&quot;,
&gt; +        &quot;zecke&quot; : &quot;Holger Freyther&quot;,
&gt; +    }
This is almost sorted but ddkilzer and treat are out of order.
Also, it looks like these folks are missing aroben, smfr, bradee-oh? (probably more...)


&gt; +    def attachment_url_for_id(self, attachment_id, action = &quot;view&quot;):
No spaces around =.

&gt; +        attachment_base_url = self.bug_server + &quot;attachment.cgi?id=&quot;
&gt; +        return &quot;%s%s&amp;action=%s&quot; % (attachment_base_url, attachment_id, action)

If attachment_id is just an id, then doesn&apos;t the url need id= in it?
(Or perhaps the var name should be attachment_param?)



&gt; +    def fetch_attachments_from_bug(self, bug_id):
...
&gt; +            attachment[&apos;obsolete&apos;] = (attachment_row.has_key(&apos;class&apos;) and attachment_row[&apos;class&apos;] == &quot;bz_obsolete&quot;)

No need for () here.

&gt; +
&gt; +            if (str(review_status).find(&quot;review+&quot;) != -1):
No need for ().


&gt; +
&gt; +    def fetch_bug_ids_from_commit_queue(self):
&gt; +        # unassigned_only = &quot;&amp;emailassigned_to1=1&amp;emailtype1=substring&amp;email1=unassigned&quot;
Did you mean to keep this line?



&gt; +    def fetch_patches_from_commit_queue(self):
&gt; +        patches_to_land = []
&gt; +        for bug_id in self.fetch_bug_ids_from_commit_queue():
&gt; +            patches = self.fetch_reviewed_patches_from_bug(bug_id)
&gt; +            patches_to_land.extend(patches)
This also works
   patches_to_land += patches

&gt; +        return patches_to_land
&gt; +
&gt; +    def authenticate(self, username = None, password = None):
No spaces around =&apos;s.

&gt; +        if (self.authenticated):
&gt; +            return
&gt; +        
&gt; +        if not username:
&gt; +            username = read_config(&quot;username&quot;)
&gt; +            if not username:
&gt; +                username = raw_input(&quot;Bugzilla login: &quot;)
&gt; +        if not password:
&gt; +            password = read_config(&quot;password&quot;)
&gt; +            if not password:
&gt; +                password = getpass.getpass(&quot;Bugzilla password for %s: &quot; % (username,))
&gt; +
&gt; +        log(&quot;Logging in as %s...&quot; % (username,))
&gt; +        if self.dryrun:
Should it set 
       self.authenticated = True
here?

&gt; +            return

&gt; +
&gt; +    def add_patch_to_bug(self, bug_id, patch_file_object, description, comment_text = None, mark_for_review = False):
No spaces around =&apos;s.

&gt; +        
&gt; +        log(&quot;Adding patch \&quot;%s\&quot; to bug %s&quot; % (description, bug_id))

You could do

        log(&apos;Adding patch &quot;%s&quot; to bug %s&apos; % (description, bug_id))

to avoid the escpaing.



&gt; +    def obsolete_attachment(self, attachment_id, comment_text = None):
No space around =.

&gt; +
&gt; +        log(&quot;Obsoleting attachment: %s&quot; % (attachment_id,))

Remove the tuple creation. (&quot;...&quot;,) -&gt; &quot;...&quot;


&gt; +        # Also clear any review flag (to remove it from review/commit queues)
&gt; +        self.br.find_control(type=&apos;select&apos;, nr=0).value = (&quot;X&quot;,)

It seems odd that this needs a tuple.  I&apos;m being too lazy to look it up but just wanted to point this out for your double check.



&gt; +    def post_comment_to_bug(self, bug_id, comment_text):
&gt; +        self.authenticate()
&gt; +
&gt; +        log(&quot;Adding comment to bug %s&quot; % (bug_id,))

Use
        log(&quot;Adding comment to bug %s&quot; % bug_id)


&gt; +    def close_bug_as_fixed(self, bug_id, comment_text = None):
No space around =.

&gt; +        self.authenticate()
&gt; +
&gt; +        log(&quot;Closing bug %s as fixed&quot; % (bug_id,))

Use:
        log(&quot;Closing bug %s as fixed&quot; % bug_id)




&gt; diff --git a/WebKitTools/Scripts/modules/scm.py b/WebKitTools/Scripts/modules/scm.py
&gt; new file mode 100644
&gt; index 0000000..63afd45
&gt; --- /dev/null
&gt; +++ b/WebKitTools/Scripts/modules/scm.py
&gt;

&gt; +class SCM:
&gt; +    def __init__(self, dryrun = False):
No space around =.


&gt; +
&gt; +    def ensure_clean_working_directory(self, force, allow_local_commits = False):

No space around =.


&gt; +        if not force and not self.working_directory_is_clean():
&gt; +            log(&quot;Working directory has modifications, pass --force-clean or --no-clean to continue.&quot;)
&gt; +            os.system(self.status_command())
&gt; +            exit(1)
&gt; +        
&gt; +        log(&quot;Cleaning the working directory&quot;)
&gt; +        self.clean_working_directory(discard_local_commits = not allow_local_commits)

No space around =.


    
&gt; +    def ensure_no_local_commits(self, force):
...
&gt; +        commits = self.local_commits()
&gt; +        if len(commits) == 0:

if len(commits) :



&gt; +
&gt; +    def apply_patch(self, patch):
&gt; +        # It&apos;s possible that the patch was not made from the root directory
Nit: directory&quot;.&quot;

&gt; +        # we should detect and handle that case.
Nit: &quot;W&quot;e

&gt; +        return_code = os.system(&quot;curl &quot; + patch[&apos;url&apos;] + &quot; | svn-apply --reviewer \&quot;&quot; + patch[&apos;reviewer&apos;] + &quot;\&quot;&quot;)

How about?
        return_code = os.system(&apos;curl %s | svn-apply --reviewer &quot;%s&quot;&apos; % (patch[&apos;url&apos;], patch[&apos;reviewer&apos;]))

&gt; +        if (return_code != 0):

Use
        if return_code:

&gt; +            raise ScriptError(&quot;Patch &quot; + patch[&apos;url&apos;] + &quot; failed to download and apply.&quot;)
&gt; +


&gt; +    # It&apos;s slightly hacky to share this code, since there are implicit assumptions about the regexp format
Less so with named groups, so many the comment can go away if you do that.
&gt; +    def run_status_and_extract_filenames(self, status_command, status_regexp):
&gt; +        file_names = []
&gt; +        for line in os.popen(status_command).readlines():
&gt; +            match = re.search(status_regexp, line)
&gt; +            if not match:
&gt; +                continue
&gt; +            # status = match.group(1)
&gt; +            file_name = match.group(2)

If you go with the named group suggestion, this becomes
            file_name = match.group(&apos;filename&apos;)

&gt; +            file_names.append(file_name)
&gt; +        return file_names


&gt; +class SVN (SCM):
&gt; +    def __init__(self, dryrun = False):
No spaces around =.


&gt; +
&gt; +    def working_directory_is_clean(self):
&gt; +        diff_process = subprocess.Popen(&quot;svn diff&quot;, stdout=subprocess.PIPE, shell=True)
&gt; +        diff_output = diff_process.communicate()[0]
&gt; +        if dif_process.wait() != 0:
Two issues (a typo dif vs diff) and no need for &quot;!= 0&quot;), so consider

        if diff_process.wait():


&gt; +
&gt; +    def changed_files(self):
&gt; +        status_regexp = &quot;^([ACDMR]).{6} (.+)$&quot; if self.svn_version() &gt; &quot;1.6&quot; else &quot;^([ACDMR]).{5} (.+)$&quot;

There is something about all of the &quot;&quot; in that line that makes it hard for me to parse.  Personally, I&apos;d
prefer the standard c++ look in this case.

if self.svn_version() &gt; &quot;1.6&quot;:
    status_regexp = &quot;^([ACDMR]).{6} (.+)$&quot;
else
    status_regexp = &quot;^([ACDMR]).{5} (.+)$&quot;

Also consider used named groups (see my comment in the git class).



&gt; +    def commit_with_message(self, message):
&gt; +        commit_process = subprocess.Popen(&apos;svn commit -F -&apos;, stdin=subprocess.PIPE, shell=True)
&gt; +        commit_process.communicate(message)
Should this do
           commit_process.wait()
?


&gt; +
&gt; +# All git-specific logic should go here.
&gt; +class Git (SCM):
&gt; +    def __init__(self, dryrun = False):
No space around =.

&gt; +    
&gt; +    def working_directory_is_clean(self):
&gt; +        diff_process = subprocess.Popen(&quot;git diff-index head&quot;, stdout=subprocess.PIPE, shell=True)
&gt; +        diff_output = diff_process.communicate()[0]
&gt; +        if dif_process.wait() != 0:

Two issues (a typo dif vs diff) and no need for &quot;!= 0&quot;), so consider

        if diff_process.wait():

&gt; +
&gt; +    def changed_files(self):
&gt; +        status_command = &apos;git diff -r --name-status -C -C -M&apos;
Extra -C

&gt; +        status_regexp = &apos;^([ADM])\t(.+)$&apos;
Consider using named groups, for example:

  &apos;^(?P&lt;status&gt;[ADM])\t(?P&lt;filename&gt;.+)$&apos;

See http://docs.python.org/library/re.html#regular-expression-syntax

&gt; +        return self.run_status_and_extract_filenames(status_command, status_regexp)
&gt; +    


&gt; +    # Git-specific methods:
&gt; +    
&gt; +    def commit_locally_with_message(self, message):
&gt; +        commit_process = subprocess.Popen(&apos;git commit -a -F -&apos;, stdin=subprocess.PIPE, shell=True)
In many other places you used &quot;&quot; for strings.  Python also allows single quotes, but it is nice to be consistent (unless you want to switch to put a &quot; in the middle.)


&gt; +        commit_process.communicate(message)
It seems like it should do commit_process.wait() here.
 

&gt; +    def push_local_commits_to_server(self):
...
&gt; +        return out
&gt; +    
&gt; +
extra blank line.

&gt; +    def commit_ids_from_range_arguments(self, args, cherry_pick = False):
No spaces around =.

&gt; +        
&gt; +        # If not cherry-picking and only passed one revision, assume &quot;^revision head&quot; aka &quot;revision..head&quot;

I can read &quot;If we&apos;re not cherry-picking...&quot; more easily.


&gt; +        if len(revisions) &lt; 2:
&gt; +            revisions[0] = &quot;^&quot; + revisions[0]
&gt; +            revisions.append(&quot;head&quot;)
&gt; +        
&gt; +        rev_list_args = [&apos;git&apos;, &apos;rev-list&apos;]
&gt; +        rev_list_args.extend(revisions)

fwiw, 

   rev_list_arg += revisions

will work too.  Your choice.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>127509</commentid>
    <comment_count>23</comment_count>
    <who name="Mark Rowe (bdash)">mrowe</who>
    <bug_when>2009-06-22 17:20:34 -0700</bug_when>
    <thetext>&gt; I wish that this was part of the help in the script.  Also not everyone has
&gt; easy_install installed either.

What&apos;re the licenses like on these modules?  If they&apos;re sufficiently agreeable then the best approach may be to land known good versions in the repository so that the script works out of the box.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>127513</commentid>
    <comment_count>24</comment_count>
    <who name="Eric Seidel (no email)">eric</who>
    <bug_when>2009-06-22 17:28:06 -0700</bug_when>
    <thetext>(In reply to comment #23)
&gt; &gt; I wish that this was part of the help in the script.  Also not everyone has
&gt; &gt; easy_install installed either.
&gt; 
&gt; What&apos;re the licenses like on these modules?  If they&apos;re sufficiently agreeable
&gt; then the best approach may be to land known good versions in the repository so
&gt; that the script works out of the box.

mechanize is tiny, and BSD.  Easy to include.
BeautifulSoup is quite large.  It&apos;s under the python license though, so also should be OK to include.

Lets do that in a separate change.  For now, I&apos;ve added code to detect when they&apos;re missing and print a nice help message. :)</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>127516</commentid>
    <comment_count>25</comment_count>
    <who name="Mark Rowe (bdash)">mrowe</who>
    <bug_when>2009-06-22 17:31:33 -0700</bug_when>
    <thetext>&gt; Lets do that in a separate change.  For now, I&apos;ve added code to detect when
&gt; they&apos;re missing and print a nice help message. :)

For sure.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>127530</commentid>
    <comment_count>26</comment_count>
    <who name="Eric Seidel (no email)">eric</who>
    <bug_when>2009-06-22 17:56:46 -0700</bug_when>
    <thetext>(In reply to comment #22)
&gt; (From update of attachment 31575 [review])
&gt; I wish the tool would print out its --help content if I just type its name w/o
&gt; any args but maybe I&apos;m atypical?

Agreed.  I&apos;ll see what I can do.  OptionParse.error() does not have this behavior by default. :(

&gt; I wish that this was part of the help in the script.  Also not everyone has
&gt; easy_install installed either.

Done.

&gt; Add clause #3
&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.
Fixed.

&gt; s/commiting/committing/
Fixed.

&gt; Nice to alphabetize these.
Fixed.

&gt; Modified the sys.path is usually something done as a last resort. &quot;from
&gt; modules.bugzilla ...&quot; would be better.  You&apos;ll need to add an empty __init__.py
&gt; file in WebKitTools/Scripts to do this.
Fixed.

&gt; Why not validate that the first line is a date line by using the regex?
Fixed.

&gt; How about something more strict about the date format and slightly looser about
&gt; the spacing:
&gt;         changelog_date_line_regexp = (&apos;^(\d{1,4}\-){2}\d{1-4}&apos; # Consume the
&gt; date.
&gt;                                       + &apos;\S+(.+)\S+&apos; # Consume the name.
&gt;                                       + &apos;&lt;([^&lt;&gt;]+)&gt;$&apos;) # And finally the email
Fixed.

&gt; Consider compiling the regex
&gt; http://docs.python.org/library/re.html#module-contents
Fixed.

&gt; changelog.close() is indented too far.
Fixed.

&gt; In WebKitTools/Scripts/commit-log-editor, it has a specific ordering for the
&gt; changelogs in the commit message.  It isn&apos;t followed here.

Added a FIXME.  I think that&apos;s best done in a later patch.  Perhaps when we unify this script with commit-log-editor. :)

&gt; Consider
&gt;    if not len(changelog_paths):
Fixed.

&gt; &gt; +class Command:
&gt; &gt; +    def __init__(self, help_text, argument_names=&quot;&quot;, options = []):
&gt; No spaces around = in this case.
Fixed.  TextMate likes to add these for some reason.

&gt; &gt; +        if (len(self.options) &gt; 0):
&gt; No need for ().
Fixed.

&gt; Prefer
&gt;    if self.argument_names:
Fixed.

&gt; No space before ( even in inheritance (throughout).
Fixed.

&gt; In general it is safer to print like this:
&gt;  print &quot;%s&quot; % tool.bugs.bug_url_for_bug_id(bug_id)
Fixed.

&gt; &gt; +            tool.scm().ensure_clean_working_directory(options.force_clean, allow_local_commits = True)
&gt; No space around = in this case.  (Personally, I&apos;d rather always do spaces
&gt; around = but alas such is not python style.)
Fixed.  I agree.  I dislike this part of Python&apos;s style.

&gt; Do all the patches get applied as one bunch?  I typically apply each one as a
&gt; separate &quot;git commit&quot;.
&gt; No sure how do-able this though.  (I guess I&apos;d like to encourage one patch per
&gt; bug and then there is no issue :).)

Currently apply-patches only applies the patches to your tree.  It does not have a --commit option yet.
I plan to add one.  I&apos;ve added a FIXME for now.

&gt; &gt; +        self.br = Browser()
&gt; s/self.br/self.browser/
Fixed. :)  pylint beat you to it!  (I had copied from mechanize&apos;s examples.)


&gt; This is almost sorted but ddkilzer and treat are out of order.
&gt; Also, it looks like these folks are missing aroben, smfr, bradee-oh? (probably
&gt; more...)

Yup.  The list of reviewers is incomplete.  I should push it out into its own file.  I&apos;ll do that when I post a new one.
That list maps from bugzilla usernames to names.  I have no easy way to generate that list.  I guess I could search for all r+&apos;d patches ever...

&gt; &gt; +        attachment_base_url = self.bug_server + &quot;attachment.cgi?id=&quot;
&gt; &gt; +        return &quot;%s%s&amp;action=%s&quot; % (attachment_base_url, attachment_id, action)
&gt; 
&gt; If attachment_id is just an id, then doesn&apos;t the url need id= in it?
&gt; (Or perhaps the var name should be attachment_param?)

I&apos;m confused.  Are you suggesting that I should distribute the id= differently between the strings?

&gt; &gt; +    def fetch_attachments_from_bug(self, bug_id):
&gt; ...
&gt; &gt; +            attachment[&apos;obsolete&apos;] = (attachment_row.has_key(&apos;class&apos;) and attachment_row[&apos;class&apos;] == &quot;bz_obsolete&quot;)
&gt; 
&gt; No need for () here.

Yeah, but I find it reads clearer...

&gt; &gt; +
&gt; &gt; +            if (str(review_status).find(&quot;review+&quot;) != -1):
&gt; No need for ().
Fixed.

&gt; &gt; +
&gt; &gt; +    def fetch_bug_ids_from_commit_queue(self):
&gt; &gt; +        # unassigned_only = &quot;&amp;emailassigned_to1=1&amp;emailtype1=substring&amp;email1=unassigned&quot;
&gt; Did you mean to keep this line?

Yes.  I plan to use it.  I&apos;ll add a FIXME

&gt; This also works
&gt;    patches_to_land += patches
Nifty!

&gt; Should it set 
&gt;        self.authenticated = True
&gt; here?
Fixed.

&gt; You could do
&gt;         log(&apos;Adding patch &quot;%s&quot; to bug %s&apos; % (description, bug_id))
&gt; to avoid the escpaing.
Fixed.

&gt; &gt; +        log(&quot;Obsoleting attachment: %s&quot; % (attachment_id,))
&gt; 
&gt; Remove the tuple creation. (&quot;...&quot;,) -&gt; &quot;...&quot;

I hit errors w/o them before... I swear.  Fixed.

&gt; &gt; +        # Also clear any review flag (to remove it from review/commit queues)
&gt; &gt; +        self.br.find_control(type=&apos;select&apos;, nr=0).value = (&quot;X&quot;,)
&gt; 
&gt; It seems odd that this needs a tuple.  I&apos;m being too lazy to look it up but
&gt; just wanted to point this out for your double check.

Yes.  ClientForm (part of mechanize) is strange in its need for tuples.

&gt; How about?
&gt;         return_code = os.system(&apos;curl %s | svn-apply --reviewer &quot;%s&quot;&apos; %
&gt; (patch[&apos;url&apos;], patch[&apos;reviewer&apos;]))

Fixed.

&gt; &gt; +    # It&apos;s slightly hacky to share this code, since there are implicit assumptions about the regexp format
&gt; Less so with named groups, so many the comment can go away if you do that.

Excellent suggestion!  Fixed.

&gt; &gt; +    def commit_with_message(self, message):
&gt; &gt; +        commit_process = subprocess.Popen(&apos;svn commit -F -&apos;, stdin=subprocess.PIPE, shell=True)
&gt; &gt; +        commit_process.communicate(message)
&gt; Should this do
&gt;            commit_process.wait()

communicate() waits for the process termination, so I don&apos;t need wait() unless I need the return code.  At least that&apos;s my understanding of these subprocess calls.

&gt; &gt; +        status_command = &apos;git diff -r --name-status -C -C -M&apos;
&gt; Extra -C
Fixed.


Thanks for all the fantastic comments!  New patch coming shortly!</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>127531</commentid>
    <comment_count>27</comment_count>
      <attachid>31696</attachid>
    <who name="Eric Seidel (no email)">eric</who>
    <bug_when>2009-06-22 17:58:49 -0700</bug_when>
    <thetext>Created attachment 31696
Updated to respect the current working directory instead of using ../..


---
 5 files changed, 1130 insertions(+), 0 deletions(-)</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>127533</commentid>
    <comment_count>28</comment_count>
    <who name="Eric Seidel (no email)">eric</who>
    <bug_when>2009-06-22 17:59:19 -0700</bug_when>
    <thetext>Addressed Dave Levin&apos;s comments (even if I didn&apos;t update the patch description).</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>127544</commentid>
    <comment_count>29</comment_count>
      <attachid>31696</attachid>
    <who name="David Levin">levin</who>
    <bug_when>2009-06-22 18:53:12 -0700</bug_when>
    <thetext>Comment on attachment 31696
Updated to respect the current working directory instead of using ../..

Only a few trivial comments below.  Feel free to change and submit.



&gt; diff --git a/WebKitTools/Scripts/bugzilla-tool b/WebKitTools/Scripts/bugzilla-tool

&gt; +def latest_changelog_entry(changelog_path):
...
&gt; +        changelog_date_line_regexp = re.compile(&apos;^(\d{4}-\d{2}-\d{2})&apos; # Consume the date.
&gt; +                                      + &apos;\s+(.+)\s+&apos; # Consume the name.
&gt; +                                      + &apos;&lt;([^&lt;&gt;]+)&gt;$&apos;) # And finally the email address.

You can remove this one since you already have it defined a few lines above this.



&gt; + def commit_message_for_this_commit(scm):
..
&gt; +    # FIXME: We should sort and label the ChangeLog messages like commit-log-editor does

Add &quot;.&quot;



&gt; + class PostDiffAsPatchToBug(Command):
...
&gt; +     def execute(self, options, args, tool):
...
&gt; +         description = options.description if options.description else &quot;patch&quot;

You could also do this if you find it more readable (I do):

  description = options.description || &quot;patch&quot;


&gt; +            log(&quot;Are you sure you want to attach %d patches to bug %s?&quot; % (len(commit_ids), bug_id))
&gt; +            # Should could --patches-limit option.

Fix comment &quot;Should could&quot;?



&gt; +    def format_epilog(self, epilog):
&gt; +        if epilog:
&gt; +            return &quot;\n&quot; + epilog + &quot;\n&quot;
&gt; +        else:

Remove the else in this case.  (Following standard WebKit style).


&gt; +    @staticmethod
&gt; +    def split_args(args):
&gt; +        # Assume the first argument which doesn&apos;t start with &apos;-&apos; is the command name.
&gt; +        command_index = 0
&gt; +        for arg in args:
&gt; +            if arg[0] != &apos;-&apos;:
&gt; +                break
&gt; +            command_index += 1
&gt; +
&gt; +        global_args = args[:command_index]
&gt; +        if command_index &gt;= len(args):
&gt; +            return (global_args, None, [])
&gt; +
&gt; +        command = args[command_index]
&gt; +        command_args = args[command_index + 1:]
&gt; +        return (global_args, command, command_args)

I really like the &quot;else&quot; statement in python for &quot;while&quot; and &quot;for&quot; statements.

Totally optional but consider

        command_index = 0
        for arg in args:
            if arg[0] != &apos;-&apos;:
                break
            command_index += 1
        else:
            return (args[:], None, [])

        global_args = args[:command_index]
        command = args[command_index]
        command_args = args[command_index + 1:]
        return (global_args, command, command_args)

btw, above I did the &quot;args[:]&quot; above just to get a new copy of the array (as opposed to return a reference to args) to be consistent with the other code path in the function.
 


&gt; diff --git a/WebKitTools/Scripts/modules/bugzilla.py b/WebKitTools/Scripts/modules/bugzilla.py


&gt; +# HACK: This should not depend on git for config storage

HACK or FIXME?


&gt; +    reviewer_usernames_to_full_names = {

Would be nice to sort: ddkilzer and treat are out of place.


&gt; diff --git a/WebKitTools/Scripts/modules/scm.py b/WebKitTools/Scripts/modules/scm.py

&gt; +class SCM:
&gt; +    # Subclasses must indicate if they support local commits
&gt; +    # but the SCM baseclass will only call local_commits methods when this is true

Add &quot;.&quot;



&gt;  I&apos;m confused.  Are you suggesting that I should distribute the id= differently
&gt;  between the strings?

My mistake: I missed the &quot;id=&quot; when I was reading the code.  I was dealing with a really small font at that moment.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>127595</commentid>
    <comment_count>30</comment_count>
    <who name="Eric Seidel (no email)">eric</who>
    <bug_when>2009-06-23 01:36:47 -0700</bug_when>
    <thetext>Fixed your comments!  Thanks for the great reviews!</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>127597</commentid>
    <comment_count>31</comment_count>
    <who name="Eric Seidel (no email)">eric</who>
    <bug_when>2009-06-23 01:42:57 -0700</bug_when>
    <thetext>The script landed this as r44979, but it errored out and failed to update the bug. :(</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>127599</commentid>
    <comment_count>32</comment_count>
      <attachid>31710</attachid>
    <who name="Eric Seidel (no email)">eric</who>
    <bug_when>2009-06-23 01:44:32 -0700</bug_when>
    <thetext>Created attachment 31710
patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>127601</commentid>
    <comment_count>33</comment_count>
      <attachid>31710</attachid>
    <who name="Mark Rowe (bdash)">mrowe</who>
    <bug_when>2009-06-23 01:45:38 -0700</bug_when>
    <thetext>Comment on attachment 31710
patch

Very presumptuous, Mr Seidel.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>127602</commentid>
    <comment_count>34</comment_count>
      <attachid>31712</attachid>
    <who name="Eric Seidel (no email)">eric</who>
    <bug_when>2009-06-23 01:52:57 -0700</bug_when>
    <thetext>Created attachment 31712
patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>127603</commentid>
    <comment_count>35</comment_count>
      <attachid>31712</attachid>
    <who name="Mark Rowe (bdash)">mrowe</who>
    <bug_when>2009-06-23 01:57:56 -0700</bug_when>
    <thetext>Comment on attachment 31712
patch

I&apos;m a little sad that you&apos;ve been landing untested code.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>127605</commentid>
    <comment_count>36</comment_count>
    <who name="Eric Seidel (no email)">eric</who>
    <bug_when>2009-06-23 01:59:39 -0700</bug_when>
    <thetext>(In reply to comment #35)
&gt; (From update of attachment 31712 [review])
&gt; I&apos;m a little sad that you&apos;ve been landing untested code.

Agreed.  This is the &quot;actually push it to the svn server&quot; code-path.  Which was tested at one point.  But broke during refactoring. :(  Such is the problem of scripting languages... they don&apos;t refactor nicely.

I need to write unit-tests for all this.  I could also set up a local svn server for some of this testing.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>127606</commentid>
    <comment_count>37</comment_count>
    <who name="Eric Seidel (no email)">eric</who>
    <bug_when>2009-06-23 01:59:55 -0700</bug_when>
    <thetext>Committing to http://svn.webkit.org/repository/webkit/trunk ...
	M	WebKitTools/ChangeLog
	M	WebKitTools/Scripts/modules/scm.py</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>127609</commentid>
    <comment_count>38</comment_count>
    <who name="Eric Seidel (no email)">eric</who>
    <bug_when>2009-06-23 02:13:48 -0700</bug_when>
    <thetext>(In reply to comment #37)
&gt; Committing to http://svn.webkit.org/repository/webkit/trunk ...
&gt;         M       WebKitTools/ChangeLog
&gt;         M       WebKitTools/Scripts/modules/scm.py

For those watching at home... the script error&apos;d out during this commit too (I forgot that the land-and-update-bug option does not know how to fix the ChangeLogs to have the right reviewer yet...). :(  Still lots of pieces to fix.
</thetext>
  </long_desc>
      
          <attachment
              isobsolete="1"
              ispatch="0"
              isprivate="0"
          >
            <attachid>31114</attachid>
            <date>2009-06-09 17:23:11 -0700</date>
            <delta_ts>2009-06-10 15:21:56 -0700</delta_ts>
            <desc>patch-url-from-bug: returns the URL of the r+&apos;d patch on the bug</desc>
            <filename>patch-url-from-bug</filename>
            <type>application/octet-stream</type>
            <size>1253</size>
            <attacher name="Eric Seidel (no email)">eric</attacher>
            
              <data encoding="base64">IyEvdXNyL2Jpbi9weXRob24KCmltcG9ydCByZQppbXBvcnQgc3lzCmltcG9ydCB1cmxsaWIyCmZy
b20gQmVhdXRpZnVsU291cCBpbXBvcnQgQmVhdXRpZnVsU291cAoKIyBEZWZhdWx0czoKYnVnX3Nl
cnZlciA9ICJodHRwczovL2J1Z3Mud2Via2l0Lm9yZy8iCmJ1Z19iYXNlX3VybCA9IGJ1Z19zZXJ2
ZXIgKyAic2hvd19idWcuY2dpP2lkPSIKCiMgV2UgY291bGQgYWRkIGZhbmNpZXIgYXJnIHBhcnNp
bmcgc29tZSBkYXkKYnVnX251bWJlciA9IHN5cy5hcmd2WzFdCgpidWdfdXJsID0gIiVzJXMiICUg
KGJ1Z19iYXNlX3VybCwgYnVnX251bWJlcikKcHJpbnQgPj4gc3lzLnN0ZGVyciwgIkZldGNoaW5n
OiAiICsgYnVnX3VybAoKcGFnZSA9IHVybGxpYjIudXJsb3BlbihidWdfdXJsKQpzb3VwID0gQmVh
dXRpZnVsU291cChwYWdlKQoKcGF0Y2hlc190b19sYW5kID0gW10KIyBHcmFiIGEgbGlzdCBvZiBu
b24tb2Jzb2xldGVkIHBhdGNoIGZpbGVzIApmb3IgcGF0Y2hfcm93IGluIHNvdXAoJ3RyJywgc3R5
bGU9ImJhY2tncm91bmQtY29sb3I6IHJnYigyNTUsMjU1LDIwMCk7Iik6CiAgY2VsbHMgPSBwYXRj
aF9yb3cuZmluZEFsbCgndGQnKQogIHBhdGNoX2xpbmsgPSBjZWxsc1swXS5maW5kKCdhJykKICBw
YXRjaF91cmwgPSBidWdfc2VydmVyICsgcGF0Y2hfbGlua1snaHJlZiddICMgdXJscyBhcmUgcmVs
YXRpdmUKICBwYXRjaF9uYW1lID0gcGF0Y2hfbGluay5zdHJpbmcKICAjIGF0dGFjaG1lbnRfdHlw
ZSA9IGNlbGxzWzFdCiAgIyBkYXRlID0gY2VsbHNbMl0KICAjIHNpemUgPSBjZWxsc1szXQogIHJl
dmlld19zdGF0dXMgPSBjZWxsc1s0XQogICMgYWN0aW9uX2xpbmtzID0gY2VsbHNbNV0KICAKICBp
ZiAoc3RyKHJldmlld19zdGF0dXMpLmZpbmQoInJldmlldysiKSA9PSAtMSk6CiAgICBwcmludCA+
PiBzeXMuc3RkZXJyLCAiSWdub3JpbmcgJyIgKyBwYXRjaF9uYW1lICsgIicgbm90IHJldmlld2Vk
LiIKICAgIGNvbnRpbnVlOwogIAogIHBhdGNoZXNfdG9fbGFuZC5hcHBlbmQoeyAndXJsJyA6IHBh
dGNoX3VybCB9KQoKaWYgbGVuKHBhdGNoZXNfdG9fbGFuZCkgPiAxOgogICAgcmFpc2UgIkVSUk9S
OiBCdWcgIiArIGJ1Z19udW1iZXIgKyAiIGhhcyBtb3JlIHRoYW4gcisnZCBwYXRjaC4iCgppZiBs
ZW4ocGF0Y2hlc190b19sYW5kKSA9PSAwOgogICAgcmFpc2UgIkJ1ZyAiICsgYnVnX251bWJlciAr
ICIgaGFzIG5vIHIrJ2QgcGF0Y2guIgoKcHJpbnQgcGF0Y2hlc190b19sYW5kWzBdWyd1cmwnXQo=
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="0"
              isprivate="0"
          >
            <attachid>31142</attachid>
            <date>2009-06-10 15:21:56 -0700</date>
            <delta_ts>2009-06-11 19:02:47 -0700</delta_ts>
            <desc>bugzilla-tool -- command line access to bugzilla (requires BeautifulSoup)</desc>
            <filename>bugzilla-tool</filename>
            <type>application/octet-stream</type>
            <size>4876</size>
            <attacher name="Eric Seidel (no email)">eric</attacher>
            
              <data encoding="base64">IyEvdXNyL2Jpbi9weXRob24KCmltcG9ydCByZQppbXBvcnQgb3MKaW1wb3J0IHN5cwppbXBvcnQg
dXJsbGliMgppbXBvcnQgdHJhY2ViYWNrCmZyb20gQmVhdXRpZnVsU291cCBpbXBvcnQgQmVhdXRp
ZnVsU291cAoKIyBEZWZhdWx0czoKYnVnX3NlcnZlciA9ICJodHRwczovL2J1Z3Mud2Via2l0Lm9y
Zy8iCmJ1Z19iYXNlX3VybCA9IGJ1Z19zZXJ2ZXIgKyAic2hvd19idWcuY2dpP2lkPSIKd2Via2l0
X2RpcmVjdG9yeSA9ICIvVXNlcnMvZXNlaWRlbC9Qcm9qZWN0cy9XZWJLaXQiCgpkZWYgY2hkaXJf
d2Via2l0KCk6CiAgb3MuY2hkaXIod2Via2l0X2RpcmVjdG9yeSkKCmRlZiBmdWxsX25hbWVfZnJv
bV9idWd6aWxsYV9uYW1lKGJ1Z3ppbGxhX25hbWUpOgogIG5hbWVfbWFwID0gewogICAgImFiYXJ0
aCIgOiAiQWRhbSBCYXJ0aCIsCiAgICAiYXJpeWEuaGlkYXlhdCIgOiAiQXJpeWEgSGlkYXlhdCIs
CiAgICAiZGFyaW4iIDogIkRhcmluIEFkbGVyIiwKICAgICJkZ2xhemtvdiIgOiAiRGltaXRyaSBH
bGF6a292IiwKICAgICJlcmljIiA6ICJFcmljIFNlaWRlbCIsCiAgICAiZGRraWx6ZXIiIDogIkRh
dmlkIEtpbHplciIsCiAgICAiZmlzaGQiIDogIkRhcmluIEZpc2hlciIsCiAgICAiZ25zIiA6ICJH
dXN0YXZvIE5vcm9uaGEiLAogICAgImptYWxvbnpvIiA6ICJKYW4gQWxvbnpvIiwKICAgICJtaXR6
IiA6ICJEYW4gQmVybnN0ZWluIiwKICAgICJtanMiIDogIk1hY2llaiBTdGFjaG92aWFrIiwKICAg
ICJvbGl2ZXIiIDogIk9saXZlciBIdW50IiwKICAgICJzdGFpa29zIiA6ICJHZW9yZ2UgU3RhaWtv
cyIsCiAgICAieGFuLmxvcGV6IiA6ICJYYW4gTG9wZXoiLAogICAgInplY2tlIiA6ICJIb2xnZXIg
RnJleXRoZXIiLAogIH0KICBpZiBub3QgYnVnemlsbGFfbmFtZSBpbiBuYW1lX21hcDoKICAgIHBy
aW50ID4+IHN5cy5zdGRlcnIsICJVbmtub3duIHJldmlld2VyISAiICsgYnVnemlsbGFfbmFtZQog
ICAgcmV0dXJuIGJ1Z3ppbGxhX25hbWUKICByZXR1cm4gbmFtZV9tYXBbYnVnemlsbGFfbmFtZV0K
CmRlZiBidWdfdXJsX2Zvcl9idWdfaWQoYnVnX2lkKToKICByZXR1cm4gIiVzJXMiICUgKGJ1Z19i
YXNlX3VybCwgYnVnX2lkKQoKZGVmIGZldGNoX3Jldmlld2VkX3BhdGNoZXNfZnJvbV9idWcoYnVn
X2lkKToKICBidWdfdXJsID0gYnVnX3VybF9mb3JfYnVnX2lkKGJ1Z19pZCkKICBwcmludCA+PiBz
eXMuc3RkZXJyLCAiRmV0Y2hpbmc6ICIgKyBidWdfdXJsCgogIHBhZ2UgPSB1cmxsaWIyLnVybG9w
ZW4oYnVnX3VybCkKICBzb3VwID0gQmVhdXRpZnVsU291cChwYWdlKQogIAogIHBhdGNoZXNfdG9f
bGFuZCA9IFtdCiAgIyBHcmFiIGEgbGlzdCBvZiBub24tb2Jzb2xldGVkIHBhdGNoIGZpbGVzIAog
IGZvciBwYXRjaF9yb3cgaW4gc291cCgndHInLCBzdHlsZT0iYmFja2dyb3VuZC1jb2xvcjogcmdi
KDI1NSwyNTUsMjAwKTsiKToKICAgIGNlbGxzID0gcGF0Y2hfcm93LmZpbmRBbGwoJ3RkJykKICAg
IHBhdGNoX2xpbmsgPSBjZWxsc1swXS5maW5kKCdhJykKICAgIHBhdGNoX3VybCA9IGJ1Z19zZXJ2
ZXIgKyBwYXRjaF9saW5rWydocmVmJ10gIyB1cmxzIGFyZSByZWxhdGl2ZQogICAgcGF0Y2hfbmFt
ZSA9IHBhdGNoX2xpbmsuc3RyaW5nCiAgICAjIGF0dGFjaG1lbnRfdHlwZSA9IGNlbGxzWzFdCiAg
ICAjIGRhdGUgPSBjZWxsc1syXQogICAgIyBzaXplID0gY2VsbHNbM10KICAgIHJldmlld19zdGF0
dXMgPSBjZWxsc1s0XQogICAgIyBhY3Rpb25fbGlua3MgPSBjZWxsc1s1XQoKICAgIGlmIChzdHIo
cmV2aWV3X3N0YXR1cykuZmluZCgicmV2aWV3KyIpID09IC0xKToKICAgICAgcHJpbnQgPj4gc3lz
LnN0ZGVyciwgIklnbm9yaW5nICciICsgcGF0Y2hfbmFtZSArICInIG5vdCByZXZpZXdlZC4iCiAg
ICAgIGNvbnRpbnVlOwoKICAgIHJldmlld2VyID0gcmV2aWV3X3N0YXR1cy5jb250ZW50c1swXS5z
cGxpdCgnOicpWzBdICMgbmFtZTpcbiByZXZpZXcrXG4KICAgIHJldmlld2VyX2Z1bGxfbmFtZSA9
IGZ1bGxfbmFtZV9mcm9tX2J1Z3ppbGxhX25hbWUocmV2aWV3ZXIpCgogICAgcGF0Y2hlc190b19s
YW5kLmFwcGVuZCh7ICJ1cmwiIDogcGF0Y2hfdXJsLCAicmV2aWV3ZXIiIDogcmV2aWV3ZXJfZnVs
bF9uYW1lIH0pCiAgcmV0dXJuIHBhdGNoZXNfdG9fbGFuZAoKZGVmIGZldGNoX2J1Z19pZHNfZnJv
bV9jb21taXRfcXVldWUoKToKICBjb21taXRfcXVldWVfdXJsID0gImh0dHBzOi8vYnVncy53ZWJr
aXQub3JnL2J1Z2xpc3QuY2dpP3F1ZXJ5X2Zvcm1hdD1hZHZhbmNlZCZidWdfc3RhdHVzPVVOQ09O
RklSTUVEJmJ1Z19zdGF0dXM9TkVXJmJ1Z19zdGF0dXM9QVNTSUdORUQmYnVnX3N0YXR1cz1SRU9Q
RU5FRCZmaWVsZDAtMC0wPWZsYWd0eXBlcy5uYW1lJnR5cGUwLTAtMD1lcXVhbHMmdmFsdWUwLTAt
MD1yZXZpZXclMkIiCiAgcHJpbnQgPj4gc3lzLnN0ZGVyciwgIkxvYWRpbmcgY29tbWl0IHF1ZXVl
IgoKICBwYWdlID0gdXJsbGliMi51cmxvcGVuKGNvbW1pdF9xdWV1ZV91cmwpCiAgc291cCA9IEJl
YXV0aWZ1bFNvdXAocGFnZSkKICAKICBidWdfaWRzID0gW10KICAjIEdyYWIgdGhlIGNlbGxzIGlu
IHRoZSBmaXJzdCBjb2x1bW4gKHdoaWNoIGhhcHBlbnMgdG8gYmUgdGhlIGJ1ZyBpZHMpCiAgZm9y
IGJ1Z19saW5rX2NlbGwgaW4gc291cCgndGQnLCAiZmlyc3QtY2hpbGQiKTogIyB0ZHMgd2l0aCB0
aGUgY2xhc3MgImZpcnN0LWNoaWxkIgogICAgYnVnX2xpbmsgPSBidWdfbGlua19jZWxsLmZpbmQo
ImEiKQogICAgYnVnX2lkcy5hcHBlbmQoYnVnX2xpbmsuc3RyaW5nKSAjIHRoZSBjb250ZW50cyBo
YXBwZW4gdG8gYmUgdGhlIGJ1ZyBpZAogIAogIHJldHVybiBidWdfaWRzCgpkZWYgZW5zdXJlX2Ns
ZWFuX3dvcmtpbmdfZGlyZWN0b3J5KCk6CiAgIyBXZSBzaG91bGQgbWFrZSBzdXJlIHRoZSB0cmVl
IGlzIGNsZWFuCiAgcmV0dXJuIFRydWUKCmRlZiB1cGRhdGVfd2Via2l0KCk6CiAgIyB1cGRhdGUg
dGhlIHRyZWUgdXNpbmcgdXBkYXRlLXdlYmtpdCBvciBnaXQgc3ZuIHJlYmFzZQogIHJldHVybiBU
cnVlCgpkZWYgYXBwbHlfcGF0Y2gocGF0Y2gpOgogIGNoZGlyX3dlYmtpdCgpCiAgZW5zdXJlX2Ns
ZWFuX3dvcmtpbmdfZGlyZWN0b3J5KCkKICB1cGRhdGVfd2Via2l0KCkKCiAgIyBJdCdzIHBvc3Np
YmxlIHRoYXQgdGhlIHBhdGNoIHdhcyBub3QgbWFkZSBmcm9tIHRoZSByb290IGRpcmVjdG9yeQog
ICMgd2Ugc2hvdWxkIGRldGVjdCB0aGF0LgogIHJldHVybl9jb2RlID0gb3Muc3lzdGVtKCJjdXJs
ICIgKyBwYXRjaFsndXJsJ10gKyAiIHwgc3ZuLWFwcGx5IC0tcmV2aWV3ZXIgXCIiICsgcGF0Y2hb
J3Jldmlld2VyJ10gKyAiXCIiKQogIGlmIChyZXR1cm5fY29kZSAhPSAwKToKICAgIHJhaXNlICJQ
YXRjaCAiICsgcGF0Y2hfdXJsICsgIiBmYWlsZWQgdG8gZG93bmxvYWQgYW5kIGFwcGx5LiIKCmRl
ZiB1cGRhdGVfY2hhbmdlbG9nc193aXRoX3Jldmlld2VyKHBhdGNoKToKICByZXR1cm4gVHJ1ZQoK
ZGVmIGZldGNoX3BhdGNoZXNfZnJvbV9jb21taXRfcXVldWUoKToKICBwYXRjaGVzX3RvX2xhbmQg
PSBbXQogIGZvciBidWdfaWQgaW4gZmV0Y2hfYnVnX2lkc19mcm9tX2NvbW1pdF9xdWV1ZSgpOgog
ICAgcGF0Y2hlcyA9IGZldGNoX3Jldmlld2VkX3BhdGNoZXNfZnJvbV9idWcoYnVnX2lkKQogICAg
cGF0Y2hlc190b19sYW5kLmV4dGVuZChwYXRjaGVzKQogIHJldHVybiBwYXRjaGVzX3RvX2xhbmQK
CmRlZiBwcmludF9idWdzX2luX2NvbW1pdF9xdWV1ZShhcmdzKToKICBidWdfaWRzID0gZmV0Y2hf
YnVnX2lkc19mcm9tX2NvbW1pdF9xdWV1ZSgpCiAgZm9yIGJ1Z19pZCBpbiBidWdfaWRzOgogICAg
cHJpbnQgYnVnX3VybF9mb3JfYnVnX2lkKGJ1Z19pZCkKCmRlZiBwcmludF9wYXRjaGVzX2luX2Nv
bW1pdF9xdWV1ZShhcmdzKToKICBwYXRjaGVzID0gZmV0Y2hfcGF0Y2hlc19mcm9tX2NvbW1pdF9x
dWV1ZSgpCiAgZm9yIHBhdGNoIGluIHBhdGNoZXM6CiAgICBwcmludCBwYXRjaFsndXJsJ10KCmRl
ZiBwcmludF9yZXZpZXdlZF9wYXRjaGVzX29uX2J1ZyhhcmdzKToKICBidWdfaWQgPSBhcmdzWzBd
CiAgcGF0Y2hlc190b19sYW5kID0gZmV0Y2hfcmV2aWV3ZWRfcGF0Y2hlc19mcm9tX2J1ZyhidWdf
aWQpCiAgZm9yIHBhdGNoIGluIHBhdGNoZXNfdG9fbGFuZDoKICAgIHByaW50IHBhdGNoWyd1cmwn
XQoKZGVmIGFwcGx5X3BhdGNoX2Zyb21fYnVnKGFyZ3MpOgogIGJ1Z19pZCA9IGFyZ3NbMF0KICBw
YXRjaGVzID0gZmV0Y2hfcmV2aWV3ZWRfcGF0Y2hlc19mcm9tX2J1ZygpCiAgYXBwbHlfcGF0Y2go
cGF0Y2hlc1swXSkKCmRlZiB1c2FnZSgpOgogIHByaW50IHN5cy5hcmd2WzBdICsgIiBjb21tYW5k
IFtjb21tYW5kIGFyZ3NdIgogIHByaW50ICJDb21tYW5kczoiCiAgZm9yIGNvbW1hbmQgaW4gc29y
dGVkKGNvbW1hbmRzLmtleXMoKSk6CiAgICBwcmludCBjb21tYW5kCiAgc3lzLmV4aXQoMSkKCmNv
bW1hbmRzID0gewogICJidWdzLXRvLWNvbW1pdCIgOiBwcmludF9idWdzX2luX2NvbW1pdF9xdWV1
ZSwKICAicGF0Y2hlcy10by1jb21taXQiIDogcHJpbnRfcGF0Y2hlc19pbl9jb21taXRfcXVldWUs
CiAgInJldmlld2VkLXBhdGNoZXMtb24iIDogcHJpbnRfcmV2aWV3ZWRfcGF0Y2hlc19vbl9idWcs
CiAgImFwcGx5LXBhdGNoLWZyb20tYnVnIjogYXBwbHlfcGF0Y2hfZnJvbV9idWcsCn0KZGVmIG1h
aW4oKToKICBpZiBsZW4oc3lzLmFyZ3YpIDwgMjoKICAgIHVzYWdlKCkKCiAgY29tbWFuZCA9IHN5
cy5hcmd2WzFdCiAgYXJncyA9IHN5cy5hcmd2WzI6XQogIGlmIG5vdCBjb21tYW5kIGluIGNvbW1h
bmRzOgogICAgdXNhZ2UoKQoKICByZXR1cm4gY29tbWFuZHNbY29tbWFuZF0oYXJncykKCmlmIF9f
bmFtZV9fID09ICJfX21haW5fXyI6CiAgbWFpbigpCg==
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="0"
              isprivate="0"
          >
            <attachid>31189</attachid>
            <date>2009-06-11 19:02:47 -0700</date>
            <delta_ts>2009-06-12 17:28:51 -0700</delta_ts>
            <desc>latest bugzilla-tool, can download patch, apply it, commit it, and update the bug (not ready for general usage yet)</desc>
            <filename>bugzilla-tool</filename>
            <type>application/octet-stream</type>
            <size>9115</size>
            <attacher name="Eric Seidel (no email)">eric</attacher>
            
              <data encoding="base64">IyEvdXNyL2Jpbi9weXRob24KCmltcG9ydCBnZXRwYXNzCmltcG9ydCByZQppbXBvcnQgb3MKaW1w
b3J0IHN1YnByb2Nlc3MKaW1wb3J0IHN5cwppbXBvcnQgdXJsbGliMgpmcm9tIEJlYXV0aWZ1bFNv
dXAgaW1wb3J0IEJlYXV0aWZ1bFNvdXAKCmZyb20gbWVjaGFuaXplIGltcG9ydCBCcm93c2VyCmJy
ID0gQnJvd3NlcigpCiMgSWdub3JlIGJ1Z3Mud2Via2l0Lm9yZy9yb2JvdHMudHh0IHVudGlsIHdl
IGZpeCBpdCB0byBhbGxvdyB0aGlzIHNjcmlwdApici5zZXRfaGFuZGxlX3JvYm90cyhGYWxzZSkK
CiMgRGVmYXVsdHMgKHVudGlsIHdlIHN1cHBvcnQgb3B0aW9uIHBhcnNpbmcpOgpidWdfc2VydmVy
ID0gImh0dHBzOi8vYnVncy53ZWJraXQub3JnLyIKYnVnX2Jhc2VfdXJsID0gYnVnX3NlcnZlciAr
ICJzaG93X2J1Zy5jZ2k/aWQ9IgoKCiMgT25jZSB0aGlzIGlzIGluIFdlYktpdFRvb2xzIHdlIGNh
biBmaW5kIHRoZSBXZWJLaXQKIyBkaXJlY3RvcnkgYnkgd2Fsa2luZyB1cCB0aGUgcGF0aApkZWYg
Y2hkaXJfd2Via2l0KCk6CiAgd2Via2l0X2RpcmVjdG9yeSA9ICIvVXNlcnMvZXNlaWRlbC9Qcm9q
ZWN0cy9XZWJLaXQiCiAgb3MuY2hkaXIod2Via2l0X2RpcmVjdG9yeSkKCgpkZWYgbG9nKHN0cmlu
Zyk6CiAgcHJpbnQgPj4gc3lzLnN0ZGVyciwgc3RyaW5nCgojIFRoaXMgY291bGQgZXZlbnR1YWxs
eSBiZSBhIHRleHQgZmlsZQpkZWYgZnVsbF9uYW1lX2Zyb21fYnVnemlsbGFfbmFtZShidWd6aWxs
YV9uYW1lKToKICBuYW1lX21hcCA9IHsKICAgICJhYmFydGgiIDogIkFkYW0gQmFydGgiLAogICAg
ImFyaXlhLmhpZGF5YXQiIDogIkFyaXlhIEhpZGF5YXQiLAogICAgImRhcmluIiA6ICJEYXJpbiBB
ZGxlciIsCiAgICAiZGdsYXprb3YiIDogIkRpbWl0cmkgR2xhemtvdiIsCiAgICAiZXJpYyIgOiAi
RXJpYyBTZWlkZWwiLAogICAgImRka2lsemVyIiA6ICJEYXZpZCBLaWx6ZXIiLAogICAgImZpc2hk
IiA6ICJEYXJpbiBGaXNoZXIiLAogICAgImducyIgOiAiR3VzdGF2byBOb3JvbmhhIiwKICAgICJq
bWFsb256byIgOiAiSmFuIEFsb256byIsCiAgICAibWl0eiIgOiAiRGFuIEJlcm5zdGVpbiIsCiAg
ICAibWpzIiA6ICJNYWNpZWogU3RhY2hvdmlhayIsCiAgICAib2xpdmVyIiA6ICJPbGl2ZXIgSHVu
dCIsCiAgICAic3RhaWtvcyIgOiAiR2VvcmdlIFN0YWlrb3MiLAogICAgInhhbi5sb3BleiIgOiAi
WGFuIExvcGV6IiwKICAgICJ6ZWNrZSIgOiAiSG9sZ2VyIEZyZXl0aGVyIiwKICB9CiAgaWYgbm90
IGJ1Z3ppbGxhX25hbWUgaW4gbmFtZV9tYXA6CiAgICBsb2coIlVua25vd24gcmV2aWV3ZXIhICIg
KyBidWd6aWxsYV9uYW1lKQogICAgcmV0dXJuIGJ1Z3ppbGxhX25hbWUKICByZXR1cm4gbmFtZV9t
YXBbYnVnemlsbGFfbmFtZV0KCgpkZWYgYnVnX3VybF9mb3JfYnVnX2lkKGJ1Z19pZCk6CiAgcmV0
dXJuICIlcyVzIiAlIChidWdfYmFzZV91cmwsIGJ1Z19pZCkKCmRlZiBmZXRjaF9yZXZpZXdlZF9w
YXRjaGVzX2Zyb21fYnVnKGJ1Z19pZCk6CiAgYnVnX3VybCA9IGJ1Z191cmxfZm9yX2J1Z19pZChi
dWdfaWQpCiAgbG9nKCJGZXRjaGluZzogIiArIGJ1Z191cmwpCgogIHBhZ2UgPSB1cmxsaWIyLnVy
bG9wZW4oYnVnX3VybCkKICBzb3VwID0gQmVhdXRpZnVsU291cChwYWdlKQogIAogIHBhdGNoZXNf
dG9fbGFuZCA9IFtdCiAgIyBHcmFiIGEgbGlzdCBvZiBub24tb2Jzb2xldGVkIHBhdGNoIGZpbGVz
IAogIGZvciBwYXRjaF9yb3cgaW4gc291cCgndHInLCBzdHlsZT0iYmFja2dyb3VuZC1jb2xvcjog
cmdiKDI1NSwyNTUsMjAwKTsiKToKICAgIGNlbGxzID0gcGF0Y2hfcm93LmZpbmRBbGwoJ3RkJykK
ICAgIHBhdGNoX2xpbmsgPSBjZWxsc1swXS5maW5kKCdhJykKICAgIHBhdGNoX3VybCA9IGJ1Z19z
ZXJ2ZXIgKyBwYXRjaF9saW5rWydocmVmJ10gIyB1cmxzIGFyZSByZWxhdGl2ZQogICAgcGF0Y2hf
bmFtZSA9IHBhdGNoX2xpbmsuc3RyaW5nCiAgICAjIGF0dGFjaG1lbnRfdHlwZSA9IGNlbGxzWzFd
CiAgICAjIGRhdGUgPSBjZWxsc1syXQogICAgIyBzaXplID0gY2VsbHNbM10KICAgIHJldmlld19z
dGF0dXMgPSBjZWxsc1s0XQogICAgIyBhY3Rpb25fbGlua3MgPSBjZWxsc1s1XQoKICAgIGlmIChz
dHIocmV2aWV3X3N0YXR1cykuZmluZCgicmV2aWV3KyIpID09IC0xKToKICAgICAgbG9nKCJJZ25v
cmluZyAnIiArIHBhdGNoX25hbWUgKyAiJyBub3QgcmV2aWV3ZWQuIikKICAgICAgY29udGludWU7
CgogICAgcmV2aWV3ZXIgPSByZXZpZXdfc3RhdHVzLmNvbnRlbnRzWzBdLnNwbGl0KCc6JylbMF0g
IyBuYW1lOlxuIHJldmlldytcbgogICAgcmV2aWV3ZXJfZnVsbF9uYW1lID0gZnVsbF9uYW1lX2Zy
b21fYnVnemlsbGFfbmFtZShyZXZpZXdlcikKCiAgICBwYXRjaGVzX3RvX2xhbmQuYXBwZW5kKHsg
InVybCIgOiBwYXRjaF91cmwsICJyZXZpZXdlciIgOiByZXZpZXdlcl9mdWxsX25hbWUgfSkKICBy
ZXR1cm4gcGF0Y2hlc190b19sYW5kCgpkZWYgZmV0Y2hfYnVnX2lkc19mcm9tX2NvbW1pdF9xdWV1
ZSgpOgogIGNvbW1pdF9xdWV1ZV91cmwgPSAiaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvYnVnbGlz
dC5jZ2k/cXVlcnlfZm9ybWF0PWFkdmFuY2VkJmJ1Z19zdGF0dXM9VU5DT05GSVJNRUQmYnVnX3N0
YXR1cz1ORVcmYnVnX3N0YXR1cz1BU1NJR05FRCZidWdfc3RhdHVzPVJFT1BFTkVEJmZpZWxkMC0w
LTA9ZmxhZ3R5cGVzLm5hbWUmdHlwZTAtMC0wPWVxdWFscyZ2YWx1ZTAtMC0wPXJldmlldyUyQiIK
ICBsb2coIkxvYWRpbmcgY29tbWl0IHF1ZXVlIikKCiAgcGFnZSA9IHVybGxpYjIudXJsb3Blbihj
b21taXRfcXVldWVfdXJsKQogIHNvdXAgPSBCZWF1dGlmdWxTb3VwKHBhZ2UpCiAgCiAgYnVnX2lk
cyA9IFtdCiAgIyBHcmFiIHRoZSBjZWxscyBpbiB0aGUgZmlyc3QgY29sdW1uICh3aGljaCBoYXBw
ZW5zIHRvIGJlIHRoZSBidWcgaWRzKQogIGZvciBidWdfbGlua19jZWxsIGluIHNvdXAoJ3RkJywg
ImZpcnN0LWNoaWxkIik6ICMgdGRzIHdpdGggdGhlIGNsYXNzICJmaXJzdC1jaGlsZCIKICAgIGJ1
Z19saW5rID0gYnVnX2xpbmtfY2VsbC5maW5kKCJhIikKICAgIGJ1Z19pZHMuYXBwZW5kKGJ1Z19s
aW5rLnN0cmluZykgIyB0aGUgY29udGVudHMgaGFwcGVuIHRvIGJlIHRoZSBidWcgaWQKICAKICBy
ZXR1cm4gYnVnX2lkcwoKZGVmIGVuc3VyZV9jbGVhbl93b3JraW5nX2RpcmVjdG9yeSgpOgogICMg
V2Ugc2hvdWxkIG1ha2Ugc3VyZSB0aGUgdHJlZSBpcyBjbGVhbgogIAogICMgSEFDSzogVGhpcyBp
cyBkYW5nZXJvdXMsIGJ1dCBJJ20gdGhlIG9ubHkgb25lIHVzaW5nIHRoaXMgc2NyaXB0LCBzbyBp
dCdzIE9LLiA7KQogIG9zLnN5c3RlbSgiZ2l0IHJlc2V0IC0taGFyZCB0cnVuayAmJiBnaXQgY2xl
YW4gLWYiKQoKZGVmIHVwZGF0ZV93ZWJraXQoKToKICAjIEhBQ0s6IHVwZGF0ZSB0aGUgdHJlZSB1
c2luZyB1cGRhdGUtd2Via2l0IG9yIGdpdCBzdm4gcmViYXNlCiAgb3Muc3lzdGVtKCJnaXQgc3Zu
IHJlYmFzZSIpCiAgcmV0dXJuIFRydWUKCmRlZiBhcHBseV9wYXRjaChwYXRjaCk6CiAgY2hkaXJf
d2Via2l0KCkKICBlbnN1cmVfY2xlYW5fd29ya2luZ19kaXJlY3RvcnkoKQogIHVwZGF0ZV93ZWJr
aXQoKQoKICAjIEl0J3MgcG9zc2libGUgdGhhdCB0aGUgcGF0Y2ggd2FzIG5vdCBtYWRlIGZyb20g
dGhlIHJvb3QgZGlyZWN0b3J5CiAgIyB3ZSBzaG91bGQgZGV0ZWN0IHRoYXQuCiAgcmV0dXJuX2Nv
ZGUgPSBvcy5zeXN0ZW0oImN1cmwgIiArIHBhdGNoWyd1cmwnXSArICIgfCBzdm4tYXBwbHkgLS1y
ZXZpZXdlciBcIiIgKyBwYXRjaFsncmV2aWV3ZXInXSArICJcIiIpCiAgaWYgKHJldHVybl9jb2Rl
ICE9IDApOgogICAgcmFpc2UgIlBhdGNoICIgKyBwYXRjaF91cmwgKyAiIGZhaWxlZCB0byBkb3du
bG9hZCBhbmQgYXBwbHkuIgoKZGVmIGNoYW5nZWRfZmlsZXMoKToKICBmaWxlX25hbWVzID0gW10K
ICBmb3IgbGluZSBpbiBvcy5wb3BlbignZ2l0IGRpZmYgLXIgLS1uYW1lLXN0YXR1cyAtQyAtQyAt
TScpLnJlYWRsaW5lcygpOgogICAgc3RhdHVzID0gTm9uZQogICAgZmlsZV9uYW1lID0gTm9uZQog
ICAgbWF0Y2ggPSByZS5zZWFyY2goJ14oW0FETV0pXHQoLispJCcsIGxpbmUpCiAgICBpZiBtYXRj
aDoKICAgICAgI3N0YXR1cyA9IG1hdGNoLmdyb3VwKDEpCiAgICAgIGZpbGVfbmFtZSA9IG1hdGNo
Lmdyb3VwKDIpCiAgICAgIGZpbGVfbmFtZXMuYXBwZW5kKGZpbGVfbmFtZSkKICByZXR1cm4gZmls
ZV9uYW1lcwoKIyAgIDIwMDktMDYtMDMgIEVyaWMgU2VpZGVsICA8ZXJpY0B3ZWJraXQub3JnPgpj
aGFuZ2Vsb2dfZGF0ZV9saW5lX3JlZ2V4cCA9ICdeKFtcZFwtXSspICAoLispICA8KC4rKT4kJwoK
ZGVmIGxhdGVzdF9jaGFuZ2Vsb2dfZW50cnkoY2hhbmdlbG9nX3BhdGgpOgogIGVudHJ5X2xpbmVz
ID0gW10KICBjaGFuZ2Vsb2cgPSBvcGVuKGNoYW5nZWxvZ19wYXRoKQogIHRyeToKICAgICMgVGhl
IGZpcnN0IGxpbmUgc2hvdWxkIGJlIGEgZGF0ZSBsaW5lCiAgICBlbnRyeV9saW5lcy5hcHBlbmQo
Y2hhbmdlbG9nLnJlYWRsaW5lKCkpCiAgICBmb3IgbGluZSBpbiBjaGFuZ2Vsb2c6CiAgICAgICMg
aWYgd2UndmUgaGl0IHRoZSBuZXh0IGVudHJ5LCByZXR1cm4KICAgICAgaWYgcmUubWF0Y2goY2hh
bmdlbG9nX2RhdGVfbGluZV9yZWdleHAsIGxpbmUpOgogICAgICAgIHJldHVybiAnJy5qb2luKGVu
dHJ5X2xpbmVzKQogICAgICBlbnRyeV9saW5lcy5hcHBlbmQobGluZSkKICBmaW5hbGx5OgogICAg
ICBjaGFuZ2Vsb2cuY2xvc2UoKQogIHJldHVybiBOb25lCgpkZWYgY29tbWl0X21lc3NhZ2VfZm9y
X3RoaXNfY29tbWl0KCk6CiAgY2hhbmdlbG9nX21lc3NhZ2VzID0gW10KICBwYXRocyA9IGNoYW5n
ZWRfZmlsZXMoKQogIGZvciBwYXRoIGluIHBhdGhzOgogICAgaWYgcmUuc2VhcmNoKCdDaGFuZ2VM
b2cnLCBwYXRoKToKICAgICAgY2hhbmdlbG9nX2VudHJ5ID0gbGF0ZXN0X2NoYW5nZWxvZ19lbnRy
eShwYXRoKQogICAgICBjaGFuZ2Vsb2dfbWVzc2FnZXMuYXBwZW5kKGNoYW5nZWxvZ19lbnRyeSkK
ICByZXR1cm4gJycuam9pbihjaGFuZ2Vsb2dfbWVzc2FnZXMpCgpkZWYgY29tbWl0X3dpdGhfbWVz
c2FnZShtZXNzYWdlKToKICAjIENvbW1pdCBmaXJzdCB0byBnaXQKICBjb21taXRfcHJvY2VzcyA9
IHN1YnByb2Nlc3MuUG9wZW4oJ2dpdCBjb21taXQgLWEgLUYgLScsIHN0ZGluPXN1YnByb2Nlc3Mu
UElQRSwgc2hlbGw9VHJ1ZSkKICBjb21taXRfcHJvY2Vzcy5jb21tdW5pY2F0ZShtZXNzYWdlKQoK
ICAjIE5vdyBjb21taXQgdG8gc3ZuOgogIGNvbW1pdF9wcm9jZXNzID0gc3VicHJvY2Vzcy5Qb3Bl
bignZWNobyAiU3VjY2VzcyEiJywgc3Rkb3V0PXN1YnByb2Nlc3MuUElQRSwgc2hlbGw9VHJ1ZSkK
ICAob3V0LCBlcnJvcikgPSBjb21taXRfcHJvY2Vzcy5jb21tdW5pY2F0ZSgpCiAgcmV0dXJuX2Nv
ZGUgPSBjb21taXRfcHJvY2Vzcy53YWl0KCkKICByZXR1cm4gb3V0CgpkZWYgY29tbWl0X2xvY2Fs
X2NoYW5nZXMoKToKICBjb21taXRfbWVzc2FnZSA9IGNvbW1pdF9tZXNzYWdlX2Zvcl90aGlzX2Nv
bW1pdCgpCiAgY29tbWl0X2xvZyA9IGNvbW1pdF93aXRoX21lc3NhZ2UoY29tbWl0X21lc3NhZ2Up
CiAgcmV0dXJuIGNvbW1pdF9sb2cKCmRlZiBhdXRoZW50aWNhdGVfdG9fYnVnemlsbGEodXNlcm5h
bWUgPSBOb25lLCBwYXNzd29yZCA9IE5vbmUpOgogIGlmIG5vdCB1c2VybmFtZToKICAgIHVzZXJu
YW1lID0gcmF3X2lucHV0KCJCdWd6aWxsYSBsb2dpbjogIikKICBpZiBub3QgcGFzc3dvcmQ6CiAg
ICBwYXNzd29yZCA9IGdldHBhc3MuZ2V0cGFzcygiQnVnemlsbGEgcGFzc3dvcmQ6ICIpCgogIGxv
ZygiTG9nZ2luZyBpbiBhcyAlcy4uLiIgJSAodXNlcm5hbWUsKSkKICBpZiBkcnlydW46CiAgICBy
ZXR1cm4KICBici5vcGVuKGJ1Z19zZXJ2ZXIgKyAiL2luZGV4LmNnaT9Hb0FoZWFkQW5kTG9nSW49
MSIpCiAgYnIuc2VsZWN0X2Zvcm0obmFtZT0ibG9naW4iKQogIGJyWydCdWd6aWxsYV9sb2dpbidd
ID0gdXNlcm5hbWUKICBiclsnQnVnemlsbGFfcGFzc3dvcmQnXSA9IHBhc3N3b3JkCiAgYnIuc3Vi
bWl0KCkKCmRlZiBwb3N0X2NvbW1lbnRfdG9fYnVnKGJ1Z19pZCwgY29tbWVudF90ZXh0KToKICBh
dXRoZW50aWNhdGVfdG9fYnVnemlsbGEoKQogIAogIGxvZygiQWRkaW5nIGNvbW1lbnQgdG8gYnVn
ICVzIiAlIChidWdfaWQsKSkKICBpZiBkcnlydW46CiAgICBsb2coY29tbWVudF90ZXh0KQogICAg
cmV0dXJuCiAgCiAgYnIub3BlbihidWdfdXJsX2Zvcl9idWdfaWQoYnVnX2lkKSkKICBici5zZWxl
Y3RfZm9ybShuYW1lPSJjaGFuZ2Vmb3JtIikKICBiclsnY29tbWVudCddID0gY29tbWVudF90ZXh0
CiAgYnIuc3VibWl0KCkKCmRlZiBjbG9zZV9idWdfYXNfZml4ZWQoYnVnX2lkLCBjb21tZW50X3Rl
eHQgPSBOb25lKToKICBhdXRoZW50aWNhdGVfdG9fYnVnemlsbGEoKQoKICBsb2coIkNsb3Npbmcg
YnVnICVzIGFzIGZpeGVkIiAlIChidWdfaWQsKSkKICBpZiBkcnlydW46CiAgICBsb2coY29tbWVu
dF90ZXh0KQogICAgcmV0dXJuCgogIGJyLm9wZW4oYnVnX3VybF9mb3JfYnVnX2lkKGJ1Z19pZCkp
CiAgYnIuc2VsZWN0X2Zvcm0obmFtZT0iY2hhbmdlZm9ybSIpCiAgaWYgY29tbWVudF90ZXh0Ogog
ICAgbG9nKGNvbW1lbnRfdGV4dCkKICAgIGJyWydjb21tZW50J10gPSBjb21tZW50X3RleHQKICBi
clsna25vYiddID0gWydyZXNvbHZlJ10KICBiclsncmVzb2x1dGlvbiddID0gWydGSVhFRCddCiAg
YnIuc3VibWl0KCkKCiMgQ29tbWFuZCBsaW5lIGhhbmRsaW5nIChzaG91bGQgZ28gaW4gc29tZSBz
b3J0IG9mIG1haW4ucHkgZXZlbnR1YWxseSkKCmRlZiBmZXRjaF9wYXRjaGVzX2Zyb21fY29tbWl0
X3F1ZXVlKCk6CiAgcGF0Y2hlc190b19sYW5kID0gW10KICBmb3IgYnVnX2lkIGluIGZldGNoX2J1
Z19pZHNfZnJvbV9jb21taXRfcXVldWUoKToKICAgIHBhdGNoZXMgPSBmZXRjaF9yZXZpZXdlZF9w
YXRjaGVzX2Zyb21fYnVnKGJ1Z19pZCkKICAgIHBhdGNoZXNfdG9fbGFuZC5leHRlbmQocGF0Y2hl
cykKICByZXR1cm4gcGF0Y2hlc190b19sYW5kCgpkZWYgcHJpbnRfYnVnc19pbl9jb21taXRfcXVl
dWUoYXJncyk6CiAgYnVnX2lkcyA9IGZldGNoX2J1Z19pZHNfZnJvbV9jb21taXRfcXVldWUoKQog
IGZvciBidWdfaWQgaW4gYnVnX2lkczoKICAgIHByaW50IGJ1Z191cmxfZm9yX2J1Z19pZChidWdf
aWQpCgpkZWYgcHJpbnRfcGF0Y2hlc19pbl9jb21taXRfcXVldWUoYXJncyk6CiAgcGF0Y2hlcyA9
IGZldGNoX3BhdGNoZXNfZnJvbV9jb21taXRfcXVldWUoKQogIGZvciBwYXRjaCBpbiBwYXRjaGVz
OgogICAgcHJpbnQgcGF0Y2hbJ3VybCddCgpkZWYgcHJpbnRfcmV2aWV3ZWRfcGF0Y2hlc19vbl9i
dWcoYXJncyk6CiAgYnVnX2lkID0gYXJnc1swXQogIHBhdGNoZXNfdG9fbGFuZCA9IGZldGNoX3Jl
dmlld2VkX3BhdGNoZXNfZnJvbV9idWcoYnVnX2lkKQogIGZvciBwYXRjaCBpbiBwYXRjaGVzX3Rv
X2xhbmQ6CiAgICBwcmludCBwYXRjaFsndXJsJ10KCmRlZiBhcHBseV9wYXRjaF9mcm9tX2J1Zyhh
cmdzKToKICBidWdfaWQgPSBhcmdzWzBdCiAgcGF0Y2hlcyA9IGZldGNoX3Jldmlld2VkX3BhdGNo
ZXNfZnJvbV9idWcoYnVnX2lkKQogIGFwcGx5X3BhdGNoKHBhdGNoZXNbMF0pCgpkZWYgY29tbWl0
X2FuZF91cGRhdGVfYnVnKGFyZ3MpOgogIGJ1Z19pZCA9IGFyZ3NbMF0KICBjb21taXRfdGV4dCA9
IGNvbW1pdF9sb2NhbF9jaGFuZ2VzKCkKICBjbG9zZV9idWdfYXNfZml4ZWQoYnVnX2lkLCBjb21t
aXRfdGV4dCkKCmRlZiBsYW5kX3BhdGNoX2Zyb21fYnVnKGFyZ3MpOgogIGJ1Z19pZCA9IGFyZ3Nb
MF0KICBwYXRjaGVzID0gZmV0Y2hfcmV2aWV3ZWRfcGF0Y2hlc19mcm9tX2J1ZyhidWdfaWQpCiAg
YXBwbHlfcGF0Y2gocGF0Y2hlc1swXSkKICBjb21taXRfdGV4dCA9IGNvbW1pdF9sb2NhbF9jaGFu
Z2VzKCkKICBjbG9zZV9idWdfYXNfZml4ZWQoYnVnX2lkLCBjb21taXRfdGV4dCkKCmRlZiBwcmlu
dF9jb21taXRfbWVzc2FnZV9mb3JfdGhpc19jb21taXQoYXJncyk6CiAgcHJpbnQgY29tbWl0X21l
c3NhZ2VfZm9yX3RoaXNfY29tbWl0KCkKCmRlZiB1c2FnZSgpOgogIHByaW50IG9zLnBhdGguYmFz
ZW5hbWUoc3lzLmFyZ3ZbMF0pICsgIiBbb3B0aW9uc10gY29tbWFuZCBbY29tbWFuZC1vcHRpb25z
XSBbY29tbWFuZC1hcmdzXSIKICBwcmludCAiR2xvYmFsIE9wdGlvbnM6IgogIHByaW50ICIgIGRy
eS1ydW4gLS0gRG8gbm90IHRvdWNoIGFueSByZW1vdGUgc2VydmVyLiIKICBwcmludAogIHByaW50
ICJDb21tYW5kczoiCiAgcHJpbnQgIiAgIiArICJcbiAgIi5qb2luKHNvcnRlZChjb21tYW5kcy5r
ZXlzKCkpKQogIHN5cy5leGl0KDEpCgpjb21tYW5kcyA9IHsKICAiYnVncy10by1jb21taXQiIDog
cHJpbnRfYnVnc19pbl9jb21taXRfcXVldWUsCiAgInBhdGNoZXMtdG8tY29tbWl0IiA6IHByaW50
X3BhdGNoZXNfaW5fY29tbWl0X3F1ZXVlLAogICJyZXZpZXdlZC1wYXRjaGVzLW9uIiA6IHByaW50
X3Jldmlld2VkX3BhdGNoZXNfb25fYnVnLAogICJhcHBseS1wYXRjaC1mcm9tLWJ1ZyI6IGFwcGx5
X3BhdGNoX2Zyb21fYnVnLAogICJjb21taXQtYW5kLXVwZGF0ZS1idWciOiBjb21taXRfYW5kX3Vw
ZGF0ZV9idWcsCiAgImxhbmQtcGF0Y2gtZnJvbS1idWciOiBsYW5kX3BhdGNoX2Zyb21fYnVnLAog
ICJjb21taXQtbWVzc2FnZSI6IHByaW50X2NvbW1pdF9tZXNzYWdlX2Zvcl90aGlzX2NvbW1pdCwK
fQoKZHJ5cnVuID0gRmFsc2UKZGVmIG1haW4oKToKICBpZiBsZW4oc3lzLmFyZ3YpIDwgMjoKICAg
IHVzYWdlKCkKCiAgIyB3ZSBjb3VsZCB3cml0ZSBtb3JlIHNvcGhpc2l0Y2F0ZWQgYXJnIHBhcnNp
bmcgc29tZSBkYXkKICBhcmdzID0gc3lzLmFyZ3ZbMTpdCiAgaWYgYXJnc1swXSA9PSAiLS1kcnkt
cnVuIjoKICAgIGRyeXJ1biA9IFRydWUKICAgIGFyZ3MucG9wKDApCgogIGNvbW1hbmQgPSBhcmdz
LnBvcCgwKQogIGlmIG5vdCBjb21tYW5kIGluIGNvbW1hbmRzOgogICAgbG9nKGNvbW1hbmQgKyAi
IGlzIG5vdCBhIHZhbGlkIGNvbW1hbmQiKQogICAgdXNhZ2UoKQoKICByZXR1cm4gY29tbWFuZHNb
Y29tbWFuZF0oYXJncykKCmlmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CiAgbWFpbigpCg==
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="0"
              isprivate="0"
          >
            <attachid>31223</attachid>
            <date>2009-06-12 17:28:51 -0700</date>
            <delta_ts>2009-06-15 18:36:31 -0700</delta_ts>
            <desc>bugzilla-tool -- has successfully landed patches, but is not ready for general use yet</desc>
            <filename>bugzilla-tool</filename>
            <type>application/octet-stream</type>
            <size>12120</size>
            <attacher name="Eric Seidel (no email)">eric</attacher>
            
              <data encoding="base64">IyEvdXNyL2Jpbi9weXRob24KCmltcG9ydCByZQppbXBvcnQgb3MKaW1wb3J0IHN1YnByb2Nlc3MK
aW1wb3J0IHN5cwoKIyBGb3IgQnVnemlsbGE6CmltcG9ydCBnZXRwYXNzCmltcG9ydCB1cmxsaWIy
CmZyb20gQmVhdXRpZnVsU291cCBpbXBvcnQgQmVhdXRpZnVsU291cApmcm9tIG1lY2hhbml6ZSBp
bXBvcnQgQnJvd3NlcgoKIyBEZWZhdWx0cyAodW50aWwgd2Ugc3VwcG9ydCBiZXR0ZXIgb3B0aW9u
IHBhcnNpbmcpOgpidWdfc2VydmVyID0gImh0dHBzOi8vYnVncy53ZWJraXQub3JnLyIKYnVnX2Jh
c2VfdXJsID0gYnVnX3NlcnZlciArICJzaG93X2J1Zy5jZ2k/aWQ9IgoKIyBDYWNoZWQgY29uZmln
LCB0aGVzZSBzaG91bGQgbW92ZSBvbnRvIHRoZSBCdWd6aWxsYSBvYmplY3QKY2FjaGVkX3VzZXJu
YW1lID0gTm9uZQpjYWNoZWRfcGFzc3dvcmQgPSBOb25lCgpkZWYgbG9hZF9jb25maWcoKToKICBn
bG9iYWwgY2FjaGVkX3VzZXJuYW1lLCBjYWNoZWRfcGFzc3dvcmQKICBjYWNoZWRfdXNlcm5hbWUg
PSByZWFkX2NvbmZpZygndXNlcm5hbWUnKQogIGNhY2hlZF9wYXNzd29yZCA9IHJlYWRfY29uZmln
KCdwYXNzd29yZCcpCgpkZWYgcmVhZF9jb25maWcoa2V5KToKICAjIE5lZWQgYSB3YXkgdG8gcmVh
ZCBmcm9tIHN2biB0b28KICBjb25maWdfcHJvY2VzcyA9IHN1YnByb2Nlc3MuUG9wZW4oImdpdCBj
b25maWcgLS1nZXQgYnVnemlsbGEuIiArIGtleSwgc3Rkb3V0PXN1YnByb2Nlc3MuUElQRSwgc2hl
bGw9VHJ1ZSkKICB2YWx1ZSA9IGNvbmZpZ19wcm9jZXNzLmNvbW11bmljYXRlKClbMF0KICByZXR1
cm5fY29kZSA9IGNvbmZpZ19wcm9jZXNzLndhaXQoKQoKICBpZiByZXR1cm5fY29kZSAhPSAwOgog
ICAgcmV0dXJuIE5vbmUKICByZXR1cm4gdmFsdWUKCiMgT25jZSB0aGlzIGlzIGluIFdlYktpdFRv
b2xzIHdlIGNhbiBmaW5kIHRoZSBXZWJLaXQKIyBkaXJlY3RvcnkgYnkgd2Fsa2luZyB1cCB0aGUg
cGF0aApkZWYgY2hkaXJfd2Via2l0KCk6CiAgIyBXRUJLSVRfQkFTRSBpcyBhbiBlbnZpcm9ubWVu
dCB2YXJpYWJsZSBzcGVjaWZpYyB0byBteSBzZXR1cAogIGlmIChvcy5lbnZpcm9uWydXRUJLSVRf
QkFTRSddKToKICAgIHdlYmtpdF9kaXJlY3RvcnkgPSBvcy5lbnZpcm9uWydXRUJLSVRfQkFTRSdd
CiAgZWxzZToKICAgICMgZGVmYXVsdCB0byB3aGVyZSBJIG5vcm1hbGx5IHN0b3JlIFdlYktpdCBp
ZiB3ZSBjYW4ndCBmaW5kIFdFQktJVF9CQVNFCiAgICB3ZWJraXRfZGlyZWN0b3J5ID0gIi9Vc2Vy
cy9lc2VpZGVsL1Byb2plY3RzL1dlYktpdCIKICBvcy5jaGRpcih3ZWJraXRfZGlyZWN0b3J5KQoK
CmRlZiBsb2coc3RyaW5nKToKICBwcmludCA+PiBzeXMuc3RkZXJyLCBzdHJpbmcKICAKIyBXZWJL
aXQgc3BlY2lmaWMgZ29vcDoKZGVmIGxhdGVzdF9jaGFuZ2Vsb2dfZW50cnkoY2hhbmdlbG9nX3Bh
dGgpOgogIGVudHJ5X2xpbmVzID0gW10KICBjaGFuZ2Vsb2cgPSBvcGVuKGNoYW5nZWxvZ19wYXRo
KQogIHRyeToKICAgICMgVGhlIGZpcnN0IGxpbmUgc2hvdWxkIGJlIGEgZGF0ZSBsaW5lCiAgICBl
bnRyeV9saW5lcy5hcHBlbmQoY2hhbmdlbG9nLnJlYWRsaW5lKCkpCiAgICBmb3IgbGluZSBpbiBj
aGFuZ2Vsb2c6CiAgICAgICMgaWYgd2UndmUgaGl0IHRoZSBuZXh0IGVudHJ5LCByZXR1cm4KICAg
ICAgaWYgcmUubWF0Y2goY2hhbmdlbG9nX2RhdGVfbGluZV9yZWdleHAsIGxpbmUpOgogICAgICAg
IHJldHVybiAnJy5qb2luKGVudHJ5X2xpbmVzKQogICAgICBlbnRyeV9saW5lcy5hcHBlbmQobGlu
ZSkKICBmaW5hbGx5OgogICAgICBjaGFuZ2Vsb2cuY2xvc2UoKQogIHJldHVybiBOb25lCgpkZWYg
Y29tbWl0X21lc3NhZ2VfZm9yX3RoaXNfY29tbWl0KHNjbSk6CiAgY2hhbmdlbG9nX21lc3NhZ2Vz
ID0gW10KICBwYXRocyA9IHNjbS5jaGFuZ2VkX2ZpbGVzKCkKICBmb3IgcGF0aCBpbiBwYXRoczoK
ICAgIGlmIHJlLnNlYXJjaCgnQ2hhbmdlTG9nJywgcGF0aCk6CiAgICAgIGNoYW5nZWxvZ19lbnRy
eSA9IGxhdGVzdF9jaGFuZ2Vsb2dfZW50cnkocGF0aCkKICAgICAgY2hhbmdlbG9nX21lc3NhZ2Vz
LmFwcGVuZChjaGFuZ2Vsb2dfZW50cnkpCiAgcmV0dXJuICcnLmpvaW4oY2hhbmdlbG9nX21lc3Nh
Z2VzKQoKY2xhc3MgQnVnemlsbGE6CiAgZGVmIF9faW5pdF9fKHNlbGYsIGRyeXJ1biA9IEZhbHNl
KToKICAgIHNlbGYuZHJ5cnVuID0gZHJ5cnVuCiAgICAKICAgIHNlbGYuYnIgPSBCcm93c2VyKCkK
ICAgICMgSWdub3JlIGJ1Z3Mud2Via2l0Lm9yZy9yb2JvdHMudHh0IHVudGlsIHdlIGZpeCBpdCB0
byBhbGxvdyB0aGlzIHNjcmlwdAogICAgc2VsZi5ici5zZXRfaGFuZGxlX3JvYm90cyhGYWxzZSkK
CiAgIyBUaGlzIGNvdWxkIGV2ZW50dWFsbHkgYmUgYSB0ZXh0IGZpbGUKICB1c2VybmFtZXNfdG9f
ZnVsbF9uYW1lcyA9IHsKICAgICJhYmFydGgiIDogIkFkYW0gQmFydGgiLAogICAgImFyaXlhLmhp
ZGF5YXQiIDogIkFyaXlhIEhpZGF5YXQiLAogICAgImRhcmluIiA6ICJEYXJpbiBBZGxlciIsCiAg
ICAiZGdsYXprb3YiIDogIkRpbWl0cmkgR2xhemtvdiIsCiAgICAiZXJpYyIgOiAiRXJpYyBTZWlk
ZWwiLAogICAgImRka2lsemVyIiA6ICJEYXZpZCBLaWx6ZXIiLAogICAgImZpc2hkIiA6ICJEYXJp
biBGaXNoZXIiLAogICAgImducyIgOiAiR3VzdGF2byBOb3JvbmhhIiwKICAgICJqbWFsb256byIg
OiAiSmFuIEFsb256byIsCiAgICAibWl0eiIgOiAiRGFuIEJlcm5zdGVpbiIsCiAgICAibWpzIiA6
ICJNYWNpZWogU3RhY2hvdmlhayIsCiAgICAibXJvd2UiIDogIk1hcmsgUm93ZSIsCiAgICAib2xp
dmVyIiA6ICJPbGl2ZXIgSHVudCIsCiAgICAic3RhaWtvcyIgOiAiR2VvcmdlIFN0YWlrb3MiLAog
ICAgInhhbi5sb3BleiIgOiAiWGFuIExvcGV6IiwKICAgICJ6ZWNrZSIgOiAiSG9sZ2VyIEZyZXl0
aGVyIiwKICB9CgogIGRlZiBmdWxsX25hbWVfZnJvbV9idWd6aWxsYV9uYW1lKHNlbGYsIGJ1Z3pp
bGxhX25hbWUpOgogICAgaWYgbm90IGJ1Z3ppbGxhX25hbWUgaW4gc2VsZi51c2VybmFtZXNfdG9f
ZnVsbF9uYW1lczoKICAgICAgbG9nKCJFUlJPUjogVW5rbm93biByZXZpZXdlciEgIiArIGJ1Z3pp
bGxhX25hbWUpCiAgICAgIHJldHVybiBidWd6aWxsYV9uYW1lCiAgICByZXR1cm4gc2VsZi51c2Vy
bmFtZXNfdG9fZnVsbF9uYW1lc1tidWd6aWxsYV9uYW1lXQoKICBkZWYgYnVnX3VybF9mb3JfYnVn
X2lkKHNlbGYsIGJ1Z19pZCk6CiAgICByZXR1cm4gIiVzJXMiICUgKGJ1Z19iYXNlX3VybCwgYnVn
X2lkKQoKICBkZWYgZmV0Y2hfcmV2aWV3ZWRfcGF0Y2hlc19mcm9tX2J1ZyhzZWxmLCBidWdfaWQp
OgogICAgYnVnX3VybCA9IHNlbGYuYnVnX3VybF9mb3JfYnVnX2lkKGJ1Z19pZCkKICAgIGxvZygi
RmV0Y2hpbmc6ICIgKyBidWdfdXJsKQoKICAgIHBhZ2UgPSB1cmxsaWIyLnVybG9wZW4oYnVnX3Vy
bCkKICAgIHNvdXAgPSBCZWF1dGlmdWxTb3VwKHBhZ2UpCiAgCiAgICBwYXRjaGVzX3RvX2xhbmQg
PSBbXQogICAgIyBHcmFiIGEgbGlzdCBvZiBub24tb2Jzb2xldGVkIHBhdGNoIGZpbGVzIAogICAg
Zm9yIHBhdGNoX3JvdyBpbiBzb3VwKCd0cicsIHN0eWxlPSJiYWNrZ3JvdW5kLWNvbG9yOiByZ2Io
MjU1LDI1NSwyMDApOyIpOgogICAgICBjZWxscyA9IHBhdGNoX3Jvdy5maW5kQWxsKCd0ZCcpCiAg
ICAgIHBhdGNoX2xpbmsgPSBjZWxsc1swXS5maW5kKCdhJykKICAgICAgcGF0Y2hfdXJsID0gYnVn
X3NlcnZlciArIHBhdGNoX2xpbmtbJ2hyZWYnXSAjIHVybHMgYXJlIHJlbGF0aXZlCiAgICAgIHBh
dGNoX25hbWUgPSBwYXRjaF9saW5rLnN0cmluZwogICAgICAjIGF0dGFjaG1lbnRfdHlwZSA9IGNl
bGxzWzFdCiAgICAgICMgZGF0ZSA9IGNlbGxzWzJdCiAgICAgICMgc2l6ZSA9IGNlbGxzWzNdCiAg
ICAgIHJldmlld19zdGF0dXMgPSBjZWxsc1s0XQogICAgICAjIGFjdGlvbl9saW5rcyA9IGNlbGxz
WzVdCgogICAgICBpZiAoc3RyKHJldmlld19zdGF0dXMpLmZpbmQoInJldmlldysiKSA9PSAtMSk6
CiAgICAgICAgbG9nKCJJZ25vcmluZyAnIiArIHBhdGNoX25hbWUgKyAiJyBub3QgcmV2aWV3ZWQu
IikKICAgICAgICBjb250aW51ZTsKCiAgICAgIHJldmlld2VyID0gcmV2aWV3X3N0YXR1cy5jb250
ZW50c1swXS5zcGxpdCgnOicpWzBdICMgbmFtZTpcbiByZXZpZXcrXG4KICAgICAgcmV2aWV3ZXJf
ZnVsbF9uYW1lID0gc2VsZi5mdWxsX25hbWVfZnJvbV9idWd6aWxsYV9uYW1lKHJldmlld2VyKQoK
ICAgICAgcGF0Y2hlc190b19sYW5kLmFwcGVuZCh7ICJ1cmwiIDogcGF0Y2hfdXJsLCAicmV2aWV3
ZXIiIDogcmV2aWV3ZXJfZnVsbF9uYW1lIH0pCiAgICByZXR1cm4gcGF0Y2hlc190b19sYW5kCgog
IGRlZiBmZXRjaF9idWdfaWRzX2Zyb21fY29tbWl0X3F1ZXVlKHNlbGYpOgogICAgY29tbWl0X3F1
ZXVlX3VybCA9ICJodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9idWdsaXN0LmNnaT9xdWVyeV9mb3Jt
YXQ9YWR2YW5jZWQmYnVnX3N0YXR1cz1VTkNPTkZJUk1FRCZidWdfc3RhdHVzPU5FVyZidWdfc3Rh
dHVzPUFTU0lHTkVEJmJ1Z19zdGF0dXM9UkVPUEVORUQmZmllbGQwLTAtMD1mbGFndHlwZXMubmFt
ZSZ0eXBlMC0wLTA9ZXF1YWxzJnZhbHVlMC0wLTA9cmV2aWV3JTJCIgogICAgbG9nKCJMb2FkaW5n
IGNvbW1pdCBxdWV1ZSIpCgogICAgcGFnZSA9IHVybGxpYjIudXJsb3Blbihjb21taXRfcXVldWVf
dXJsKQogICAgc291cCA9IEJlYXV0aWZ1bFNvdXAocGFnZSkKICAKICAgIGJ1Z19pZHMgPSBbXQog
ICAgIyBHcmFiIHRoZSBjZWxscyBpbiB0aGUgZmlyc3QgY29sdW1uICh3aGljaCBoYXBwZW5zIHRv
IGJlIHRoZSBidWcgaWRzKQogICAgZm9yIGJ1Z19saW5rX2NlbGwgaW4gc291cCgndGQnLCAiZmly
c3QtY2hpbGQiKTogIyB0ZHMgd2l0aCB0aGUgY2xhc3MgImZpcnN0LWNoaWxkIgogICAgICBidWdf
bGluayA9IGJ1Z19saW5rX2NlbGwuZmluZCgiYSIpCiAgICAgIGJ1Z19pZHMuYXBwZW5kKGJ1Z19s
aW5rLnN0cmluZykgIyB0aGUgY29udGVudHMgaGFwcGVuIHRvIGJlIHRoZSBidWcgaWQKICAKICAg
IHJldHVybiBidWdfaWRzCgogIGRlZiBmZXRjaF9wYXRjaGVzX2Zyb21fY29tbWl0X3F1ZXVlKHNl
bGYpOgogICAgcGF0Y2hlc190b19sYW5kID0gW10KICAgIGZvciBidWdfaWQgaW4gc2VsZi5mZXRj
aF9idWdfaWRzX2Zyb21fY29tbWl0X3F1ZXVlKCk6CiAgICAgIHBhdGNoZXMgPSBzZWxmLmZldGNo
X3Jldmlld2VkX3BhdGNoZXNfZnJvbV9idWcoYnVnX2lkKQogICAgICBwYXRjaGVzX3RvX2xhbmQu
ZXh0ZW5kKHBhdGNoZXMpCiAgICByZXR1cm4gcGF0Y2hlc190b19sYW5kCgogIGRlZiBhdXRoZW50
aWNhdGUoc2VsZiwgdXNlcm5hbWUgPSBjYWNoZWRfdXNlcm5hbWUsIHBhc3N3b3JkID0gY2FjaGVk
X3Bhc3N3b3JkKToKICAgIGlmIG5vdCB1c2VybmFtZToKICAgICAgdXNlcm5hbWUgPSByYXdfaW5w
dXQoIkJ1Z3ppbGxhIGxvZ2luOiAiKQogICAgaWYgbm90IHBhc3N3b3JkOgogICAgICBwYXNzd29y
ZCA9IGdldHBhc3MuZ2V0cGFzcygiQnVnemlsbGEgcGFzc3dvcmQ6ICIpCgogICAgbG9nKCJMb2dn
aW5nIGluIGFzICVzLi4uIiAlICh1c2VybmFtZSwpKQogICAgaWYgc2VsZi5kcnlydW46CiAgICAg
IHJldHVybgogICAgc2VsZi5ici5vcGVuKGJ1Z19zZXJ2ZXIgKyAiL2luZGV4LmNnaT9Hb0FoZWFk
QW5kTG9nSW49MSIpCiAgICBzZWxmLmJyLnNlbGVjdF9mb3JtKG5hbWU9ImxvZ2luIikKICAgIHNl
bGYuYnJbJ0J1Z3ppbGxhX2xvZ2luJ10gPSB1c2VybmFtZQogICAgc2VsZi5iclsnQnVnemlsbGFf
cGFzc3dvcmQnXSA9IHBhc3N3b3JkCiAgICBzZWxmLmJyLnN1Ym1pdCgpCgogICAgIyBXZSBzaG91
bGQgY2hlY2sgdG8gc2VlIGlmIGl0IHN1Y2NlZWRlZCBhbmQgaWYgbm90IHRyeSBhZ2FpbgogICAg
Y2FjaGVkX3VzZXJuYW1lID0gdXNlcm5hbWUKICAgIGNhY2hlZF9wYXNzd29yZCA9IHBhc3N3b3Jk
CgogIGRlZiBwb3N0X2NvbW1lbnRfdG9fYnVnKGJ1Z19pZCwgY29tbWVudF90ZXh0KToKICAgIHNl
bGYuYXV0aGVudGljYXRlX3RvX2J1Z3ppbGxhKCkKCiAgICBsb2coIkFkZGluZyBjb21tZW50IHRv
IGJ1ZyAlcyIgJSAoYnVnX2lkLCkpCiAgICBpZiBzZWxmLmRyeXJ1bjoKICAgICAgbG9nKGNvbW1l
bnRfdGV4dCkKICAgICAgcmV0dXJuCgogICAgc2VsZi5ici5vcGVuKGJ1Z191cmxfZm9yX2J1Z19p
ZChidWdfaWQpKQogICAgc2VsZi5ici5zZWxlY3RfZm9ybShuYW1lPSJjaGFuZ2Vmb3JtIikKICAg
IHNlbGYuYnJbJ2NvbW1lbnQnXSA9IGNvbW1lbnRfdGV4dAogICAgc2VsZi5ici5zdWJtaXQoKQoK
ICBkZWYgY2xvc2VfYnVnX2FzX2ZpeGVkKGJ1Z19pZCwgY29tbWVudF90ZXh0ID0gTm9uZSk6CiAg
ICBzZWxmLmF1dGhlbnRpY2F0ZV90b19idWd6aWxsYSgpCgogICAgbG9nKCJDbG9zaW5nIGJ1ZyAl
cyBhcyBmaXhlZCIgJSAoYnVnX2lkLCkpCiAgICBpZiBzZWxmLmRyeXJ1bjoKICAgICAgbG9nKGNv
bW1lbnRfdGV4dCkKICAgICAgcmV0dXJuCgogICAgc2VsZi5ici5vcGVuKGJ1Z191cmxfZm9yX2J1
Z19pZChidWdfaWQpKQogICAgc2VsZi5ici5zZWxlY3RfZm9ybShuYW1lPSJjaGFuZ2Vmb3JtIikK
ICAgIGlmIGNvbW1lbnRfdGV4dDoKICAgICAgbG9nKGNvbW1lbnRfdGV4dCkKICAgICAgc2VsZi5i
clsnY29tbWVudCddID0gY29tbWVudF90ZXh0CiAgICBzZWxmLmJyWydrbm9iJ10gPSBbJ3Jlc29s
dmUnXQogICAgc2VsZi5iclsncmVzb2x1dGlvbiddID0gWydGSVhFRCddCiAgICBzZWxmLmJyLnN1
Ym1pdCgpCgpjbGFzcyBTQ006CiAgZGVmIGVuc3VyZV9jbGVhbl93b3JraW5nX2RpcmVjdG9yeShz
ZWxmKToKICAgICMgV2Ugc2hvdWxkIG1ha2Ugc3VyZSB0aGUgdHJlZSBpcyBjbGVhbgogIAogICAg
IyBIQUNLOiBUaGlzIGlzIGRhbmdlcm91cywgYnV0IEknbSB0aGUgb25seSBvbmUgdXNpbmcgdGhp
cyBzY3JpcHQsIHNvIGl0J3MgT0suIDspCiAgICAjIHdlIHJlYWxseSBzaG91bGQgcmVxdWlyZSBh
IC0tZm9yY2Ugb3B0aW9uIHRvIHVzZSBhIG5vbi1jbGVhbiB3b3JraW5nIGRpcmVjdG9yeQogICAg
bG9nKCJDbGVhbmluZyB0aGUgd29ya2luZyBkaXJlY3RvcnkiKQogICAgb3Muc3lzdGVtKCJnaXQg
cmVzZXQgLS1oYXJkIHRydW5rICYmIGdpdCBjbGVhbiAtZiIpCgogIGRlZiB1cGRhdGVfd2Via2l0
KHNlbGYpOgogICAgIyBIQUNLOiB1cGRhdGUgdGhlIHRyZWUgdXNpbmcgdXBkYXRlLXdlYmtpdCBv
ciBnaXQgc3ZuIHJlYmFzZQogICAgbG9nKCJVcGRhdGluZyB3b3JraW5nIGRpcmVjdG9yeSIpCiAg
ICBvcy5zeXN0ZW0oImdpdCBzdm4gcmViYXNlIikKICAgIHJldHVybiBUcnVlCgogIGRlZiB1cGRh
dGVfYW5kX2NsZWFyX3dvcmtpbmdfZGlyZWN0b3J5KHNlbGYpOgogICAgY2hkaXJfd2Via2l0KCkK
ICAgIHNlbGYuZW5zdXJlX2NsZWFuX3dvcmtpbmdfZGlyZWN0b3J5KCkKICAgIHNlbGYudXBkYXRl
X3dlYmtpdCgpCgogIGRlZiBhcHBseV9wYXRjaChzZWxmLCBwYXRjaCk6CiAgICBjaGRpcl93ZWJr
aXQoKQogICAgIyBJdCdzIHBvc3NpYmxlIHRoYXQgdGhlIHBhdGNoIHdhcyBub3QgbWFkZSBmcm9t
IHRoZSByb290IGRpcmVjdG9yeQogICAgIyB3ZSBzaG91bGQgZGV0ZWN0IGFuZCBoYW5kbGUgdGhh
dCBjYXNlLgogICAgcmV0dXJuX2NvZGUgPSBvcy5zeXN0ZW0oImN1cmwgIiArIHBhdGNoWyd1cmwn
XSArICIgfCBzdm4tYXBwbHkgLS1yZXZpZXdlciBcIiIgKyBwYXRjaFsncmV2aWV3ZXInXSArICJc
IiIpCiAgICBpZiAocmV0dXJuX2NvZGUgIT0gMCk6CiAgICAgIHJhaXNlICJQYXRjaCAiICsgcGF0
Y2hfdXJsICsgIiBmYWlsZWQgdG8gZG93bmxvYWQgYW5kIGFwcGx5LiIKCiAgZGVmIGNoYW5nZWRf
ZmlsZXMoc2VsZik6CiAgICBmaWxlX25hbWVzID0gW10KICAgIGZvciBsaW5lIGluIG9zLnBvcGVu
KCdnaXQgZGlmZiAtciAtLW5hbWUtc3RhdHVzIC1DIC1DIC1NJykucmVhZGxpbmVzKCk6CiAgICAg
IHN0YXR1cyA9IE5vbmUKICAgICAgZmlsZV9uYW1lID0gTm9uZQogICAgICBtYXRjaCA9IHJlLnNl
YXJjaCgnXihbQURNXSlcdCguKykkJywgbGluZSkKICAgICAgaWYgbWF0Y2g6CiAgICAgICAgI3N0
YXR1cyA9IG1hdGNoLmdyb3VwKDEpCiAgICAgICAgZmlsZV9uYW1lID0gbWF0Y2guZ3JvdXAoMikK
ICAgICAgICBmaWxlX25hbWVzLmFwcGVuZChmaWxlX25hbWUpCiAgICByZXR1cm4gZmlsZV9uYW1l
cwoKICAjICAgMjAwOS0wNi0wMyAgRXJpYyBTZWlkZWwgIDxlcmljQHdlYmtpdC5vcmc+CiAgY2hh
bmdlbG9nX2RhdGVfbGluZV9yZWdleHAgPSAnXihbXGRcLV0rKSAgKC4rKSAgPCguKyk+JCcKICAK
ICBkZWYgY29tbWl0X3dpdGhfbWVzc2FnZShzZWxmLCBtZXNzYWdlKToKICAgICMgQ29tbWl0IGZp
cnN0IHRvIGdpdAogICAgY29tbWl0X3Byb2Nlc3MgPSBzdWJwcm9jZXNzLlBvcGVuKCdnaXQgY29t
bWl0IC1hIC1GIC0nLCBzdGRpbj1zdWJwcm9jZXNzLlBJUEUsIHNoZWxsPVRydWUpCiAgICBjb21t
aXRfcHJvY2Vzcy5jb21tdW5pY2F0ZShtZXNzYWdlKQoKICAgICMgTm93IGNvbW1pdCB0byBzdm46
CiAgICBpZiBzZWxmLmRyeXJ1bjoKICAgICAgcmV0dXJuCiAgICBjb21taXRfcHJvY2VzcyA9IHN1
YnByb2Nlc3MuUG9wZW4oJ2dpdCBzdm4gZGNvbW1pdCcsIHN0ZG91dD1zdWJwcm9jZXNzLlBJUEUs
IHNoZWxsPVRydWUpCiAgICAob3V0LCBlcnJvcikgPSBjb21taXRfcHJvY2Vzcy5jb21tdW5pY2F0
ZSgpCiAgICByZXR1cm5fY29kZSA9IGNvbW1pdF9wcm9jZXNzLndhaXQoKQogICAgcmV0dXJuIG91
dAoKICBkZWYgY29tbWl0X2xvY2FsX2NoYW5nZXMoc2VsZik6CiAgICBjb21taXRfbWVzc2FnZSA9
IGNvbW1pdF9tZXNzYWdlX2Zvcl90aGlzX2NvbW1pdChzZWxmLnNjbSkKICAgIGNvbW1pdF9sb2cg
PSBjb21taXRfd2l0aF9tZXNzYWdlKGNvbW1pdF9tZXNzYWdlKQogICAgcmV0dXJuIGNvbW1pdF9s
b2cKCmNsYXNzIEJ1Z3ppbGxhVG9vbDoKICBkZWYgX19pbml0X18oc2VsZik6CiAgICBzZWxmLnNj
bSA9IFNDTSgpCiAgICBzZWxmLmJ1Z3MgPSBCdWd6aWxsYSgpCiAgICBzZWxmLmNvbW1hbmRzID0g
ewogICAgICAiYnVncy10by1jb21taXQiIDogc2VsZi5wcmludF9idWdzX2luX2NvbW1pdF9xdWV1
ZSwKICAgICAgInBhdGNoZXMtdG8tY29tbWl0IiA6IHNlbGYucHJpbnRfcGF0Y2hlc19pbl9jb21t
aXRfcXVldWUsCiAgICAgICJyZXZpZXdlZC1wYXRjaGVzLW9uIiA6IHNlbGYucHJpbnRfcmV2aWV3
ZWRfcGF0Y2hlc19vbl9idWcsCiAgICAgICJhcHBseS1wYXRjaGVzLWZyb20tYnVnIjogc2VsZi5h
cHBseV9wYXRjaGVzX2Zyb21fYnVnLAogICAgICAiY29tbWl0LWFuZC11cGRhdGUtYnVnIjogc2Vs
Zi5jb21taXRfYW5kX3VwZGF0ZV9idWcsCiAgICAgICJsYW5kLXBhdGNoZXMtZnJvbS1idWciOiBz
ZWxmLmxhbmRfcGF0Y2hlc19mcm9tX2J1ZywKICAgICAgImNvbW1pdC1tZXNzYWdlIjogc2VsZi5w
cmludF9jb21taXRfbWVzc2FnZV9mb3JfdGhpc19jb21taXQsCiAgICB9CiAgCiAgZGVmIHByaW50
X2J1Z3NfaW5fY29tbWl0X3F1ZXVlKHNlbGYsIGFyZ3MpOgogICAgYnVnX2lkcyA9IHNlbGYuYnVn
cy5mZXRjaF9idWdfaWRzX2Zyb21fY29tbWl0X3F1ZXVlKCkKICAgIGZvciBidWdfaWQgaW4gYnVn
X2lkczoKICAgICAgcHJpbnQgc2VsZi5idWdzLmJ1Z191cmxfZm9yX2J1Z19pZChidWdfaWQpCgog
IGRlZiBwcmludF9wYXRjaGVzX2luX2NvbW1pdF9xdWV1ZShzZWxmLCBhcmdzKToKICAgIHBhdGNo
ZXMgPSBzZWxmLmJ1Z3MuZmV0Y2hfcGF0Y2hlc19mcm9tX2NvbW1pdF9xdWV1ZSgpCiAgICBsb2co
IlBhdGNoZXMgaW4gY29tbWl0IHF1ZXVlOiIpCiAgICBmb3IgcGF0Y2ggaW4gcGF0Y2hlczoKICAg
ICAgcHJpbnQgcGF0Y2hbJ3VybCddCgogIGRlZiBwcmludF9yZXZpZXdlZF9wYXRjaGVzX29uX2J1
ZyhzZWxmLCBhcmdzKToKICAgIGJ1Z19pZCA9IGFyZ3NbMF0KICAgIHBhdGNoZXNfdG9fbGFuZCA9
IHNlbGYuYnVncy5mZXRjaF9yZXZpZXdlZF9wYXRjaGVzX2Zyb21fYnVnKGJ1Z19pZCkKICAgIGZv
ciBwYXRjaCBpbiBwYXRjaGVzX3RvX2xhbmQ6CiAgICAgIHByaW50IHBhdGNoWyd1cmwnXQoKICBk
ZWYgYXBwbHlfcGF0Y2hlc19mcm9tX2J1ZyhzZWxmLCBhcmdzKToKICAgIGJ1Z19pZCA9IGFyZ3Nb
MF0KICAgIHBhdGNoZXMgPSBzZWxmLmJ1Z3MuZmV0Y2hfcmV2aWV3ZWRfcGF0Y2hlc19mcm9tX2J1
ZyhidWdfaWQpCiAgICBzZWxmLnNjbS51cGRhdGVfYW5kX2NsZWFyX3dvcmtpbmdfZGlyZWN0b3J5
KCkKICAgICMgU2hvdWxkIHdlIGVycm9yIG91dCBpZiBzZWxmLnNjbSBkb2VzIG5vdCBzdXBwb3J0
IGxvY2FsIGNvbW1pdHM/CiAgICBmb3IgcGF0Y2ggaW4gcGF0Y2hlczoKICAgICAgc2VsZi5zY20u
YXBwbHlfcGF0Y2gocGF0Y2gpCgogIGRlZiBjb21taXRfYW5kX3VwZGF0ZV9idWcoc2VsZiwgYXJn
cyk6CiAgICBidWdfaWQgPSBhcmdzWzBdCiAgICBjb21taXRfdGV4dCA9IHNlbGYuc2NtLmNvbW1p
dF9sb2NhbF9jaGFuZ2VzKCkKICAgIHNlbGYuYnVncy5jbG9zZV9idWdfYXNfZml4ZWQoYnVnX2lk
LCBjb21taXRfdGV4dCkKCiAgZGVmIGxhbmRfcGF0Y2hlc19mcm9tX2J1ZyhzZWxmLCBhcmdzKToK
ICAgIGJ1Z19pZCA9IGFyZ3NbMF0KICAgIHBhdGNoZXMgPSBzZWxmLmJ1Z3MuZmV0Y2hfcmV2aWV3
ZWRfcGF0Y2hlc19mcm9tX2J1ZyhidWdfaWQpCiAgICAKICAgIGNvbW1pdF90ZXh0ID0gIiIKICAg
IGZvciBwYXRjaCBpbiBwYXRjaGVzOgogICAgICBzZWxmLnNjbS51cGRhdGVfYW5kX2NsZWFyX3dv
cmtpbmdfZGlyZWN0b3J5KCkKICAgICAgc2VsZi5zY20uYXBwbHlfcGF0Y2gocGF0Y2gpCiAgICAg
IGNvbW1pdF90ZXh0ID0gc2VsZi5zY20uY29tbWl0X2xvY2FsX2NoYW5nZXMoKQogICAgICAjIGlm
IHdlJ3JlIGNvbW1pdGluZyBtb3JlIHRoYW4gb25lIHBhdGNoLCB1cGRhdGUgdGhlIGJ1ZyBhcyB3
ZSBnbwogICAgICBpZiBsZW4ocGF0Y2hlcykgPiAxOgogICAgICAgIHNlbGYuYnVncy5wb3N0X2Nv
bW1lbnRfdG9fYnVnKGJ1Z19pZCwgY29tbWl0X3RleHQpCiAgICAKICAgIGlmIGxlbihwYXRjaGVz
KSA+IDE6CiAgICAgIGNvbW1pdF90ZXh0ID0gIkFsbCByZXZpZXdlZCBwYXRjaGVzIGxhbmRlZCwg
Y2xvc2luZy4iCiAgICBzZWxmLmJ1Z3MuY2xvc2VfYnVnX2FzX2ZpeGVkKGJ1Z19pZCwgY29tbWl0
X3RleHQpCgogIGRlZiBwcmludF9jb21taXRfbWVzc2FnZV9mb3JfdGhpc19jb21taXQoc2VsZiwg
YXJncyk6CiAgICBwcmludCBjb21taXRfbWVzc2FnZV9mb3JfdGhpc19jb21taXQoc2VsZi5zY20p
CiAgCiAgZGVmIHVzYWdlKHNlbGYpOgogICAgcHJpbnQgb3MucGF0aC5iYXNlbmFtZShzeXMuYXJn
dlswXSkgKyAiIFtvcHRpb25zXSBjb21tYW5kIFtjb21tYW5kLW9wdGlvbnNdIFtjb21tYW5kLWFy
Z3NdIgogICAgcHJpbnQgIkdsb2JhbCBPcHRpb25zOiIKICAgIHByaW50ICIgIGRyeS1ydW4gLS0g
RG8gbm90IHRvdWNoIGFueSByZW1vdGUgc2VydmVyLiIKICAgIHByaW50CiAgICBwcmludCAiQ29t
bWFuZHM6IgogICAgcHJpbnQgIiAgIiArICJcbiAgIi5qb2luKHNvcnRlZChzZWxmLmNvbW1hbmRz
LmtleXMoKSkpCiAgICBzeXMuZXhpdCgxKQoKICBkZWYgcGFyc2VfZ2xvYmFsX2FyZ3Moc2VsZiwg
YXJncyk6CiAgICBpZiBhcmdzWzBdID09ICItLWRyeS1ydW4iOgogICAgICBzZWxmLmRyeXJ1biA9
IFRydWUKICAgICAgYXJncy5wb3AoMCkKICAKICBkZWYgbWFpbihzZWxmKToKICAgIGlmIGxlbihz
eXMuYXJndikgPCAyOgogICAgICBzZWxmLnVzYWdlKCkKCiAgICAjIHdlIGNvdWxkIHdyaXRlIG1v
cmUgc29waGlzaXRjYXRlZCBvcHRpb24gcGFyc2luZyBzb21lIGRheQogICAgYXJncyA9IHN5cy5h
cmd2WzE6XQogICAgc2VsZi5wYXJzZV9nbG9iYWxfYXJncyhhcmdzKQoKICAgIGxvYWRfY29uZmln
KCkKCiAgICBjb21tYW5kID0gYXJncy5wb3AoMCkKICAgIGlmIG5vdCBjb21tYW5kIGluIHNlbGYu
Y29tbWFuZHM6CiAgICAgIGxvZyhjb21tYW5kICsgIiBpcyBub3QgYSB2YWxpZCBjb21tYW5kIikK
ICAgICAgdXNhZ2UoKQoKICAgIHJldHVybiBzZWxmLmNvbW1hbmRzW2NvbW1hbmRdKGFyZ3MpCgpk
ZWYgbWFpbigpOgogIHRvb2wgPSBCdWd6aWxsYVRvb2woKQogIHJldHVybiB0b29sLm1haW4oKQoK
aWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKICBtYWluKCkK
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="0"
              isprivate="0"
          >
            <attachid>31326</attachid>
            <date>2009-06-15 18:36:31 -0700</date>
            <delta_ts>2009-06-15 19:28:20 -0700</delta_ts>
            <desc>bugzilla-tool, can now obsolete patches, and is divided into classes better</desc>
            <filename>bugzilla-tool</filename>
            <type>application/octet-stream</type>
            <size>16765</size>
            <attacher name="Eric Seidel (no email)">eric</attacher>
            
              <data encoding="base64">IyEvdXNyL2Jpbi9weXRob24KCmltcG9ydCByZQppbXBvcnQgb3MKaW1wb3J0IHN1YnByb2Nlc3MK
aW1wb3J0IHN5cwoKIyBGb3IgQnVnemlsbGE6CmltcG9ydCBnZXRwYXNzCmltcG9ydCB1cmxsaWIy
CmZyb20gQmVhdXRpZnVsU291cCBpbXBvcnQgQmVhdXRpZnVsU291cApmcm9tIG1lY2hhbml6ZSBp
bXBvcnQgQnJvd3NlcgoKIyBEZWZhdWx0cyAodW50aWwgd2Ugc3VwcG9ydCBiZXR0ZXIgb3B0aW9u
IHBhcnNpbmcpOgpidWdfc2VydmVyID0gImh0dHBzOi8vYnVncy53ZWJraXQub3JnLyIKYnVnX2Jh
c2VfdXJsID0gYnVnX3NlcnZlciArICJzaG93X2J1Zy5jZ2k/aWQ9IgphdHRhY2htZW50X2Jhc2Vf
dXJsID0gYnVnX3NlcnZlciArICJhdHRhY2htZW50LmNnaT9pZD0iCgojIENhY2hlZCBjb25maWcs
IHRoZXNlIHNob3VsZCBtb3ZlIG9udG8gdGhlIEJ1Z3ppbGxhIG9iamVjdApjYWNoZWRfdXNlcm5h
bWUgPSBOb25lCmNhY2hlZF9wYXNzd29yZCA9IE5vbmUKCmRlZiBsb2FkX2NvbmZpZygpOgogICAg
Z2xvYmFsIGNhY2hlZF91c2VybmFtZSwgY2FjaGVkX3Bhc3N3b3JkCiAgICBjYWNoZWRfdXNlcm5h
bWUgPSByZWFkX2NvbmZpZygndXNlcm5hbWUnKQogICAgY2FjaGVkX3Bhc3N3b3JkID0gcmVhZF9j
b25maWcoJ3Bhc3N3b3JkJykKCmRlZiByZWFkX2NvbmZpZyhrZXkpOgogICAgIyBOZWVkIGEgd2F5
IHRvIHJlYWQgZnJvbSBzdm4gdG9vCiAgICBjb25maWdfcHJvY2VzcyA9IHN1YnByb2Nlc3MuUG9w
ZW4oImdpdCBjb25maWcgLS1nZXQgYnVnemlsbGEuIiArIGtleSwgc3Rkb3V0PXN1YnByb2Nlc3Mu
UElQRSwgc2hlbGw9VHJ1ZSkKICAgIHZhbHVlID0gY29uZmlnX3Byb2Nlc3MuY29tbXVuaWNhdGUo
KVswXQogICAgcmV0dXJuX2NvZGUgPSBjb25maWdfcHJvY2Vzcy53YWl0KCkKCiAgICBpZiByZXR1
cm5fY29kZSAhPSAwOgogICAgICAgIHJldHVybiBOb25lCiAgICByZXR1cm4gdmFsdWUucnN0cmlw
KCdcbicpCgojIE9uY2UgdGhpcyBpcyBpbiBXZWJLaXRUb29scyB3ZSBjYW4gZmluZCB0aGUgV2Vi
S2l0CiMgZGlyZWN0b3J5IGJ5IHdhbGtpbmcgdXAgdGhlIHBhdGgKZGVmIGNoZGlyX3dlYmtpdCgp
OgogICAgIyBXRUJLSVRfQkFTRSBpcyBhbiBlbnZpcm9ubWVudCB2YXJpYWJsZSBzcGVjaWZpYyB0
byBteSBzZXR1cAogICAgaWYgKG9zLmVudmlyb25bJ1dFQktJVF9CQVNFJ10pOgogICAgICAgIHdl
YmtpdF9kaXJlY3RvcnkgPSBvcy5lbnZpcm9uWydXRUJLSVRfQkFTRSddCiAgICBlbHNlOgogICAg
ICAgICMgZGVmYXVsdCB0byB3aGVyZSBJIG5vcm1hbGx5IHN0b3JlIFdlYktpdCBpZiB3ZSBjYW4n
dCBmaW5kIFdFQktJVF9CQVNFCiAgICAgICAgd2Via2l0X2RpcmVjdG9yeSA9ICIvVXNlcnMvZXNl
aWRlbC9Qcm9qZWN0cy9XZWJLaXQiCiAgICBvcy5jaGRpcih3ZWJraXRfZGlyZWN0b3J5KQoKCmRl
ZiBsb2coc3RyaW5nKToKICAgIHByaW50ID4+IHN5cy5zdGRlcnIsIHN0cmluZwoKCgojIDIwMDkt
MDYtMDMgIEVyaWMgU2VpZGVsICA8ZXJpY0B3ZWJraXQub3JnPgpjaGFuZ2Vsb2dfZGF0ZV9saW5l
X3JlZ2V4cCA9ICdeKFtcZFwtXSspICAoLispICA8KC4rKT4kJwoKZGVmIGxhdGVzdF9jaGFuZ2Vs
b2dfZW50cnkoY2hhbmdlbG9nX3BhdGgpOgogICAgZW50cnlfbGluZXMgPSBbXQogICAgY2hhbmdl
bG9nID0gb3BlbihjaGFuZ2Vsb2dfcGF0aCkKICAgIHRyeToKICAgICAgICBwcmludCAiUGFyc2lu
ZyBDaGFuZ2VMb2c6ICIgKyBjaGFuZ2Vsb2dfcGF0aAogICAgICAgICMgVGhlIGZpcnN0IGxpbmUg
c2hvdWxkIGJlIGEgZGF0ZSBsaW5lCiAgICAgICAgZW50cnlfbGluZXMuYXBwZW5kKGNoYW5nZWxv
Zy5yZWFkbGluZSgpKQogICAgICAgIGZvciBsaW5lIGluIGNoYW5nZWxvZzoKICAgICAgICAgICAg
IyBpZiB3ZSd2ZSBoaXQgdGhlIG5leHQgZW50cnksIHJldHVybgogICAgICAgICAgICBpZiByZS5t
YXRjaChjaGFuZ2Vsb2dfZGF0ZV9saW5lX3JlZ2V4cCwgbGluZSk6CiAgICAgICAgICAgICAgICBy
ZXR1cm4gJycuam9pbihlbnRyeV9saW5lcykKICAgICAgICAgICAgZW50cnlfbGluZXMuYXBwZW5k
KGxpbmUpCiAgICBmaW5hbGx5OgogICAgICAgICAgICBjaGFuZ2Vsb2cuY2xvc2UoKQogICAgIyBX
ZSBuZXZlciBmb3VuZCBhIGRhdGUgbGluZSEKICAgIHJldHVybiBOb25lCgpkZWYgY29tbWl0X21l
c3NhZ2VfZm9yX3RoaXNfY29tbWl0KHNjbSk6CiAgICBjaGFuZ2Vsb2dfbWVzc2FnZXMgPSBbXQog
ICAgcGF0aHMgPSBzY20uY2hhbmdlZF9maWxlcygpCiAgICBmb3IgcGF0aCBpbiBwYXRoczoKICAg
ICAgICBpZiByZS5zZWFyY2goJ0NoYW5nZUxvZycsIHBhdGgpOgogICAgICAgICAgICBjaGFuZ2Vs
b2dfZW50cnkgPSBsYXRlc3RfY2hhbmdlbG9nX2VudHJ5KHBhdGgpCiAgICAgICAgICAgIGlmIG5v
dCBjaGFuZ2Vsb2dfZW50cnk6CiAgICAgICAgICAgICAgICByYWlzZSAiRmFpbGVkIHRvIHBhcnNl
IENoYW5nZUxvZzogIiArIG9zLnBhdGguYWJzcGF0aChwYXRoKQogICAgICAgICAgICBjaGFuZ2Vs
b2dfbWVzc2FnZXMuYXBwZW5kKGNoYW5nZWxvZ19lbnRyeSkKICAgIHJldHVybiAnJy5qb2luKGNo
YW5nZWxvZ19tZXNzYWdlcykKCgpjbGFzcyBCdWd6aWxsYToKICAgIGRlZiBfX2luaXRfXyhzZWxm
LCBkcnlydW4gPSBGYWxzZSk6CiAgICAgICAgc2VsZi5kcnlydW4gPSBkcnlydW4KICAgICAgICAK
ICAgICAgICBzZWxmLmJyID0gQnJvd3NlcigpCiAgICAgICAgIyBJZ25vcmUgYnVncy53ZWJraXQu
b3JnL3JvYm90cy50eHQgdW50aWwgd2UgZml4IGl0IHRvIGFsbG93IHRoaXMgc2NyaXB0CiAgICAg
ICAgc2VsZi5ici5zZXRfaGFuZGxlX3JvYm90cyhGYWxzZSkKCiAgICAjIFRoaXMgY291bGQgZXZl
bnR1YWxseSBiZSBhIHRleHQgZmlsZQogICAgdXNlcm5hbWVzX3RvX2Z1bGxfbmFtZXMgPSB7CiAg
ICAgICAgImFiYXJ0aCIgOiAiQWRhbSBCYXJ0aCIsCiAgICAgICAgImFyaXlhLmhpZGF5YXQiIDog
IkFyaXlhIEhpZGF5YXQiLAogICAgICAgICJkYXJpbiIgOiAiRGFyaW4gQWRsZXIiLAogICAgICAg
ICJkZ2xhemtvdiIgOiAiRGltaXRyaSBHbGF6a292IiwKICAgICAgICAiZXJpYyIgOiAiRXJpYyBT
ZWlkZWwiLAogICAgICAgICJkZGtpbHplciIgOiAiRGF2aWQgS2lsemVyIiwKICAgICAgICAiZmlz
aGQiIDogIkRhcmluIEZpc2hlciIsCiAgICAgICAgImducyIgOiAiR3VzdGF2byBOb3JvbmhhIiwK
ICAgICAgICAiam1hbG9uem8iIDogIkphbiBBbG9uem8iLAogICAgICAgICJtaXR6IiA6ICJEYW4g
QmVybnN0ZWluIiwKICAgICAgICAibWpzIiA6ICJNYWNpZWogU3RhY2hvdmlhayIsCiAgICAgICAg
Im1yb3dlIiA6ICJNYXJrIFJvd2UiLAogICAgICAgICJvbGl2ZXIiIDogIk9saXZlciBIdW50IiwK
ICAgICAgICAic3RhaWtvcyIgOiAiR2VvcmdlIFN0YWlrb3MiLAogICAgICAgICJ0aW1vdGh5IiA6
ICJUaW1vdGh5IEhhdGNoZXIiLAogICAgICAgICJ4YW4ubG9wZXoiIDogIlhhbiBMb3BleiIsCiAg
ICAgICAgInplY2tlIiA6ICJIb2xnZXIgRnJleXRoZXIiLAogICAgfQoKICAgIGRlZiBmdWxsX25h
bWVfZnJvbV9idWd6aWxsYV9uYW1lKHNlbGYsIGJ1Z3ppbGxhX25hbWUpOgogICAgICAgIGlmIG5v
dCBidWd6aWxsYV9uYW1lIGluIHNlbGYudXNlcm5hbWVzX3RvX2Z1bGxfbmFtZXM6CiAgICAgICAg
ICAgIHJhaXNlIEV4Y2VwdGlvbigiRVJST1I6IFVua25vd24gcmV2aWV3ZXIhICIgKyBidWd6aWxs
YV9uYW1lKQogICAgICAgIHJldHVybiBzZWxmLnVzZXJuYW1lc190b19mdWxsX25hbWVzW2J1Z3pp
bGxhX25hbWVdCgogICAgZGVmIGJ1Z191cmxfZm9yX2J1Z19pZChzZWxmLCBidWdfaWQpOgogICAg
ICAgIHJldHVybiAiJXMlcyIgJSAoYnVnX2Jhc2VfdXJsLCBidWdfaWQpCiAgICAKICAgIGRlZiBh
dHRhY2htZW50X3VybF9mb3JfaWQoc2VsZiwgYXR0YWNobWVudF9pZCwgYWN0aW9uID0gInZpZXci
KToKICAgICAgICByZXR1cm4gIiVzJXMmYWN0aW9uPSVzIiAlIChhdHRhY2htZW50X2Jhc2VfdXJs
LCBhdHRhY2htZW50X2lkLCBhY3Rpb24pCgogICAgZGVmIGZldGNoX2F0dGFjaG1lbnRzX2Zyb21f
YnVnKHNlbGYsIGJ1Z19pZCk6CiAgICAgICAgYnVnX3VybCA9IHNlbGYuYnVnX3VybF9mb3JfYnVn
X2lkKGJ1Z19pZCkKICAgICAgICBsb2coIkZldGNoaW5nOiAiICsgYnVnX3VybCkKCiAgICAgICAg
cGFnZSA9IHVybGxpYjIudXJsb3BlbihidWdfdXJsKQogICAgICAgIHNvdXAgPSBCZWF1dGlmdWxT
b3VwKHBhZ2UpCiAgICAKICAgICAgICBhdHRhY2htZW50X3RhYmxlID0gc291cC5maW5kKCd0YWJs
ZScsIHsnY2VsbHNwYWNpbmcnOiIwIiwgJ2NlbGxwYWRkaW5nJzoiNCIsICdib3JkZXInOiIxIn0p
CiAgICAKICAgICAgICBhdHRhY2htZW50cyA9IFtdCiAgICAgICAgIyBHcmFiIGEgbGlzdCBvZiBu
b24tb2Jzb2xldGVkIHBhdGNoIGZpbGVzIAogICAgICAgIGZvciBhdHRhY2htZW50X3JvdyBpbiBh
dHRhY2htZW50X3RhYmxlLmZpbmRBbGwoJ3RyJyk6CiAgICAgICAgICAgIGZpcnN0X2NlbGwgPSBh
dHRhY2htZW50X3Jvdy5maW5kKCd0ZCcpCiAgICAgICAgICAgIGlmIG5vdCBmaXJzdF9jZWxsOgog
ICAgICAgICAgICAgICAgY29udGludWUgIyBUaGlzIGlzIHRoZSBoZWFkZXIsIG5vIGNlbGxzCiAg
ICAgICAgICAgIGlmIGZpcnN0X2NlbGwuaGFzX2tleSgnY29sc3BhbicpOgogICAgICAgICAgICAg
ICAgYnJlYWsgIyB0aGlzIGlzIHRoZSBsYXN0IHJvdwogICAgICAgICAgICAKICAgICAgICAgICAg
YXR0YWNobWVudCA9IHt9CiAgICAgICAgICAgIGF0dGFjaG1lbnRbJ29ic29sZXRlJ10gPSAoYXR0
YWNobWVudF9yb3cuaGFzX2tleSgnY2xhc3MnKSBhbmQgYXR0YWNobWVudF9yb3dbJ2NsYXNzJ10g
PT0gImJ6X29ic29sZXRlIikKICAgICAgICAgICAgCiAgICAgICAgICAgIGNlbGxzID0gYXR0YWNo
bWVudF9yb3cuZmluZEFsbCgndGQnKQogICAgICAgICAgICBhdHRhY2htZW50X2xpbmsgPSBjZWxs
c1swXS5maW5kKCdhJykKICAgICAgICAgICAgYXR0YWNobWVudFsndXJsJ10gPSBidWdfc2VydmVy
ICsgYXR0YWNobWVudF9saW5rWydocmVmJ10gIyB1cmxzIGFyZSByZWxhdGl2ZQogICAgICAgICAg
ICBhdHRhY2htZW50WydpZCddID0gYXR0YWNobWVudFsndXJsJ10uc3BsaXQoJz0nKVsxXSAjIGUu
Zy4gaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvYXR0YWNobWVudC5jZ2k/aWQ9MzEyMjMKICAgICAg
ICAgICAgYXR0YWNobWVudFsnbmFtZSddID0gYXR0YWNobWVudF9saW5rLnN0cmluZwogICAgICAg
ICAgICAjIGF0dGFjaG1lbnRbJ3R5cGUnXSA9IGNlbGxzWzFdCiAgICAgICAgICAgICMgYXR0YWNo
bWVudFsnZGF0ZSddID0gY2VsbHNbMl0KICAgICAgICAgICAgIyBhdHRhY2htZW50WydzaXplJ10g
PSBjZWxsc1szXQogICAgICAgICAgICByZXZpZXdfc3RhdHVzID0gY2VsbHNbNF0KICAgICAgICAg
ICAgIyBhY3Rpb25fbGlua3MgPSBjZWxsc1s1XQoKICAgICAgICAgICAgaWYgKHN0cihyZXZpZXdf
c3RhdHVzKS5maW5kKCJyZXZpZXcrIikgIT0gLTEpOgogICAgICAgICAgICAgICAgcmV2aWV3ZXIg
PSByZXZpZXdfc3RhdHVzLmNvbnRlbnRzWzBdLnNwbGl0KCc6JylbMF0gIyBuYW1lOlxuIHJldmll
dytcbgogICAgICAgICAgICAgICAgcmV2aWV3ZXJfZnVsbF9uYW1lID0gc2VsZi5mdWxsX25hbWVf
ZnJvbV9idWd6aWxsYV9uYW1lKHJldmlld2VyKQogICAgICAgICAgICAgICAgYXR0YWNobWVudFsn
cmV2aWV3ZXInXSA9IHJldmlld2VyX2Z1bGxfbmFtZQoKICAgICAgICAgICAgYXR0YWNobWVudHMu
YXBwZW5kKGF0dGFjaG1lbnQpCiAgICAgICAgcmV0dXJuIGF0dGFjaG1lbnRzCgogICAgZGVmIGZl
dGNoX3Jldmlld2VkX3BhdGNoZXNfZnJvbV9idWcoc2VsZiwgYnVnX2lkKToKICAgICAgICByZXZp
ZXdlZF9wYXRjaGVzID0gW10KICAgICAgICBmb3IgYXR0YWNobWVudCBpbiBzZWxmLmZldGNoX2F0
dGFjaG1lbnRzX2Zyb21fYnVnKGJ1Z19pZCk6CiAgICAgICAgICAgIGlmICdyZXZpZXdlcicgaW4g
YXR0YWNobWVudCBhbmQgbm90IGF0dGFjaG1lbnRbJ29ic29sZXRlJ106CiAgICAgICAgICAgICAg
ICByZXZpZXdlZF9wYXRjaGVzLmFwcGVuZChhdHRhY2htZW50KQogICAgICAgIHJldHVybiByZXZp
ZXdlZF9wYXRjaGVzCgogICAgZGVmIGZldGNoX2J1Z19pZHNfZnJvbV9jb21taXRfcXVldWUoc2Vs
Zik6CiAgICAgICAgdW5hc3NpZ25lZF9vbmx5ID0gIiZlbWFpbGFzc2lnbmVkX3RvMT0xJmVtYWls
dHlwZTE9c3Vic3RyaW5nJmVtYWlsMT11bmFzc2lnbmVkIgogICAgICAgIGNvbW1pdF9xdWV1ZV91
cmwgPSAiaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvYnVnbGlzdC5jZ2k/cXVlcnlfZm9ybWF0PWFk
dmFuY2VkJmJ1Z19zdGF0dXM9VU5DT05GSVJNRUQmYnVnX3N0YXR1cz1ORVcmYnVnX3N0YXR1cz1B
U1NJR05FRCZidWdfc3RhdHVzPVJFT1BFTkVEJmZpZWxkMC0wLTA9ZmxhZ3R5cGVzLm5hbWUmdHlw
ZTAtMC0wPWVxdWFscyZ2YWx1ZTAtMC0wPXJldmlldyUyQiIKICAgICAgICBsb2coIkxvYWRpbmcg
Y29tbWl0IHF1ZXVlIikKCiAgICAgICAgcGFnZSA9IHVybGxpYjIudXJsb3Blbihjb21taXRfcXVl
dWVfdXJsKQogICAgICAgIHNvdXAgPSBCZWF1dGlmdWxTb3VwKHBhZ2UpCiAgICAKICAgICAgICBi
dWdfaWRzID0gW10KICAgICAgICAjIEdyYWIgdGhlIGNlbGxzIGluIHRoZSBmaXJzdCBjb2x1bW4g
KHdoaWNoIGhhcHBlbnMgdG8gYmUgdGhlIGJ1ZyBpZHMpCiAgICAgICAgZm9yIGJ1Z19saW5rX2Nl
bGwgaW4gc291cCgndGQnLCAiZmlyc3QtY2hpbGQiKTogIyB0ZHMgd2l0aCB0aGUgY2xhc3MgImZp
cnN0LWNoaWxkIgogICAgICAgICAgICBidWdfbGluayA9IGJ1Z19saW5rX2NlbGwuZmluZCgiYSIp
CiAgICAgICAgICAgIGJ1Z19pZHMuYXBwZW5kKGJ1Z19saW5rLnN0cmluZykgIyB0aGUgY29udGVu
dHMgaGFwcGVuIHRvIGJlIHRoZSBidWcgaWQKICAgIAogICAgICAgIHJldHVybiBidWdfaWRzCgog
ICAgZGVmIGZldGNoX3BhdGNoZXNfZnJvbV9jb21taXRfcXVldWUoc2VsZik6CiAgICAgICAgcGF0
Y2hlc190b19sYW5kID0gW10KICAgICAgICBmb3IgYnVnX2lkIGluIHNlbGYuZmV0Y2hfYnVnX2lk
c19mcm9tX2NvbW1pdF9xdWV1ZSgpOgogICAgICAgICAgICBwYXRjaGVzID0gc2VsZi5mZXRjaF9y
ZXZpZXdlZF9wYXRjaGVzX2Zyb21fYnVnKGJ1Z19pZCkKICAgICAgICAgICAgcGF0Y2hlc190b19s
YW5kLmV4dGVuZChwYXRjaGVzKQogICAgICAgIHJldHVybiBwYXRjaGVzX3RvX2xhbmQKCiAgICBk
ZWYgYXV0aGVudGljYXRlKHNlbGYsIHVzZXJuYW1lID0gTm9uZSwgcGFzc3dvcmQgPSBOb25lKToK
ICAgICAgICBnbG9iYWwgY2FjaGVkX3VzZXJuYW1lLCBjYWNoZWRfcGFzc3dvcmQKICAgICAgICAK
ICAgICAgICBpZiBub3QgdXNlcm5hbWU6CiAgICAgICAgICAgIGlmIGNhY2hlZF91c2VybmFtZToK
ICAgICAgICAgICAgICAgIHVzZXJuYW1lID0gY2FjaGVkX3VzZXJuYW1lCiAgICAgICAgICAgIGVs
c2U6CiAgICAgICAgICAgICAgICB1c2VybmFtZSA9IGNhY2hlZF91c2VybmFtZSA9IHJhd19pbnB1
dCgiQnVnemlsbGEgbG9naW46ICIpCiAgICAgICAgaWYgbm90IHBhc3N3b3JkOgogICAgICAgICAg
ICBpZiBjYWNoZWRfcGFzc3dvcmQ6CiAgICAgICAgICAgICAgICBwYXNzd29yZCA9IGNhY2hlZF9w
YXNzd29yZAogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgcGFzc3dvcmQgPSBjYWNo
ZWRfcGFzc3dvcmQgPSBnZXRwYXNzLmdldHBhc3MoIkJ1Z3ppbGxhIHBhc3N3b3JkOiAiKQoKICAg
ICAgICBsb2coIkxvZ2dpbmcgaW4gYXMgJXMuLi4iICUgKHVzZXJuYW1lLCkpCiAgICAgICAgaWYg
c2VsZi5kcnlydW46CiAgICAgICAgICAgIHJldHVybgogICAgICAgIHNlbGYuYnIub3BlbihidWdf
c2VydmVyICsgIi9pbmRleC5jZ2k/R29BaGVhZEFuZExvZ0luPTEiKQogICAgICAgIHNlbGYuYnIu
c2VsZWN0X2Zvcm0obmFtZT0ibG9naW4iKQogICAgICAgIHNlbGYuYnJbJ0J1Z3ppbGxhX2xvZ2lu
J10gPSB1c2VybmFtZQogICAgICAgIHNlbGYuYnJbJ0J1Z3ppbGxhX3Bhc3N3b3JkJ10gPSBwYXNz
d29yZAogICAgICAgIHNlbGYuYnIuc3VibWl0KCkKCiAgICBkZWYgb2Jzb2xldGVfYXR0YWNobWVu
dChzZWxmLCBhdHRhY2htZW50X2lkLCBjb21tZW50X3RleHQgPSBOb25lKToKICAgICAgICBzZWxm
LmF1dGhlbnRpY2F0ZSgpCgogICAgICAgIGxvZygiT2Jzb2xldGluZyBhdHRhY2htZW50OiAlcyIg
JSAoYXR0YWNobWVudF9pZCwpKQogICAgICAgIGlmIHNlbGYuZHJ5cnVuOgogICAgICAgICAgICBs
b2coY29tbWVudF90ZXh0KQogICAgICAgICAgICByZXR1cm4KCiAgICAgICAgc2VsZi5ici5vcGVu
KHNlbGYuYXR0YWNobWVudF91cmxfZm9yX2lkKGF0dGFjaG1lbnRfaWQsICdlZGl0JykpCiAgICAg
ICAgc2VsZi5ici5zZWxlY3RfZm9ybShucj0wKQogICAgICAgIHNlbGYuYnIuZmluZF9jb250cm9s
KCdpc29ic29sZXRlJykuaXRlbXNbMF0uc2VsZWN0ZWQgPSBUcnVlCiAgICAgICAgIyBBbHNvIGNs
ZWFyIGFueSByZXZpZXcgZmxhZyAodG8gcmVtb3ZlIGl0IGZyb20gcmV2aWV3L2NvbW1pdCBxdWV1
ZXMpCiAgICAgICAgc2VsZi5ici5maW5kX2NvbnRyb2wodHlwZT0nc2VsZWN0JywgbnI9MCkudmFs
dWUgPSAoIlgiLCkKICAgICAgICBpZiBjb21tZW50X3RleHQ6CiAgICAgICAgICAgIGxvZyhjb21t
ZW50X3RleHQpCiAgICAgICAgICAgIHNlbGYuYnJbJ2NvbW1lbnQnXSA9IGNvbW1lbnRfdGV4dAog
ICAgICAgIHNlbGYuYnIuc3VibWl0KCkKCiAgICBkZWYgcG9zdF9jb21tZW50X3RvX2J1ZyhzZWxm
LCBidWdfaWQsIGNvbW1lbnRfdGV4dCk6CiAgICAgICAgc2VsZi5hdXRoZW50aWNhdGUoKQoKICAg
ICAgICBsb2coIkFkZGluZyBjb21tZW50IHRvIGJ1ZyAlcyIgJSAoYnVnX2lkLCkpCiAgICAgICAg
aWYgc2VsZi5kcnlydW46CiAgICAgICAgICAgIGxvZyhjb21tZW50X3RleHQpCiAgICAgICAgICAg
IHJldHVybgoKICAgICAgICBzZWxmLmJyLm9wZW4oc2VsZi5idWdfdXJsX2Zvcl9idWdfaWQoYnVn
X2lkKSkKICAgICAgICBzZWxmLmJyLnNlbGVjdF9mb3JtKG5hbWU9ImNoYW5nZWZvcm0iKQogICAg
ICAgIHNlbGYuYnJbJ2NvbW1lbnQnXSA9IGNvbW1lbnRfdGV4dAogICAgICAgIHNlbGYuYnIuc3Vi
bWl0KCkKCiAgICBkZWYgY2xvc2VfYnVnX2FzX2ZpeGVkKHNlbGYsIGJ1Z19pZCwgY29tbWVudF90
ZXh0ID0gTm9uZSk6CiAgICAgICAgc2VsZi5hdXRoZW50aWNhdGUoKQoKICAgICAgICBsb2coIkNs
b3NpbmcgYnVnICVzIGFzIGZpeGVkIiAlIChidWdfaWQsKSkKICAgICAgICBpZiBzZWxmLmRyeXJ1
bjoKICAgICAgICAgICAgbG9nKGNvbW1lbnRfdGV4dCkKICAgICAgICAgICAgcmV0dXJuCgogICAg
ICAgIHNlbGYuYnIub3BlbihzZWxmLmJ1Z191cmxfZm9yX2J1Z19pZChidWdfaWQpKQogICAgICAg
IHNlbGYuYnIuc2VsZWN0X2Zvcm0obmFtZT0iY2hhbmdlZm9ybSIpCiAgICAgICAgaWYgY29tbWVu
dF90ZXh0OgogICAgICAgICAgICBsb2coY29tbWVudF90ZXh0KQogICAgICAgICAgICBzZWxmLmJy
Wydjb21tZW50J10gPSBjb21tZW50X3RleHQKICAgICAgICBzZWxmLmJyWydrbm9iJ10gPSBbJ3Jl
c29sdmUnXQogICAgICAgIHNlbGYuYnJbJ3Jlc29sdXRpb24nXSA9IFsnRklYRUQnXQogICAgICAg
IHNlbGYuYnIuc3VibWl0KCkKCgpjbGFzcyBTQ006CiAgICBkZWYgX19pbml0X18oc2VsZiwgZHJ5
cnVuID0gRmFsc2UpOgogICAgICAgIHNlbGYuZHJ5cnVuID0gZHJ5cnVuCiAgICAKICAgIGRlZiBl
bnN1cmVfY2xlYW5fd29ya2luZ19kaXJlY3Rvcnkoc2VsZik6CiAgICAgICAgIyBXZSBzaG91bGQg
bWFrZSBzdXJlIHRoZSB0cmVlIGlzIGNsZWFuCiAgICAKICAgICAgICAjIEhBQ0s6IFRoaXMgaXMg
ZGFuZ2Vyb3VzLCBidXQgSSdtIHRoZSBvbmx5IG9uZSB1c2luZyB0aGlzIHNjcmlwdCwgc28gaXQn
cyBPSy4gOykKICAgICAgICAjIHdlIHJlYWxseSBzaG91bGQgcmVxdWlyZSBhIC0tZm9yY2Ugb3B0
aW9uIHRvIHVzZSBhIG5vbi1jbGVhbiB3b3JraW5nIGRpcmVjdG9yeQogICAgICAgIGxvZygiQ2xl
YW5pbmcgdGhlIHdvcmtpbmcgZGlyZWN0b3J5IikKICAgICAgICBvcy5zeXN0ZW0oImdpdCByZXNl
dCAtLWhhcmQgdHJ1bmsgJiYgZ2l0IGNsZWFuIC1mIikKCiAgICBkZWYgdXBkYXRlX3dlYmtpdChz
ZWxmKToKICAgICAgICAjIEhBQ0s6IHVwZGF0ZSB0aGUgdHJlZSB1c2luZyB1cGRhdGUtd2Via2l0
IG9yIGdpdCBzdm4gcmViYXNlCiAgICAgICAgbG9nKCJVcGRhdGluZyB3b3JraW5nIGRpcmVjdG9y
eSIpCiAgICAgICAgb3Muc3lzdGVtKCJnaXQgc3ZuIHJlYmFzZSIpCiAgICAgICAgcmV0dXJuIFRy
dWUKCiAgICBkZWYgdXBkYXRlX2FuZF9jbGVhcl93b3JraW5nX2RpcmVjdG9yeShzZWxmKToKICAg
ICAgICBjaGRpcl93ZWJraXQoKQogICAgICAgIHNlbGYuZW5zdXJlX2NsZWFuX3dvcmtpbmdfZGly
ZWN0b3J5KCkKICAgICAgICBzZWxmLnVwZGF0ZV93ZWJraXQoKQoKICAgIGRlZiBhcHBseV9wYXRj
aChzZWxmLCBwYXRjaCk6CiAgICAgICAgY2hkaXJfd2Via2l0KCkKICAgICAgICAjIEl0J3MgcG9z
c2libGUgdGhhdCB0aGUgcGF0Y2ggd2FzIG5vdCBtYWRlIGZyb20gdGhlIHJvb3QgZGlyZWN0b3J5
CiAgICAgICAgIyB3ZSBzaG91bGQgZGV0ZWN0IGFuZCBoYW5kbGUgdGhhdCBjYXNlLgogICAgICAg
IHJldHVybl9jb2RlID0gb3Muc3lzdGVtKCJjdXJsICIgKyBwYXRjaFsndXJsJ10gKyAiIHwgc3Zu
LWFwcGx5IC0tcmV2aWV3ZXIgXCIiICsgcGF0Y2hbJ3Jldmlld2VyJ10gKyAiXCIiKQogICAgICAg
IGlmIChyZXR1cm5fY29kZSAhPSAwKToKICAgICAgICAgICAgcmFpc2UgIlBhdGNoICIgKyBwYXRj
aF91cmwgKyAiIGZhaWxlZCB0byBkb3dubG9hZCBhbmQgYXBwbHkuIgoKICAgIGRlZiBjaGFuZ2Vk
X2ZpbGVzKHNlbGYpOgogICAgICAgIGZpbGVfbmFtZXMgPSBbXQogICAgICAgIGZvciBsaW5lIGlu
IG9zLnBvcGVuKCdnaXQgZGlmZiAtciAtLW5hbWUtc3RhdHVzIC1DIC1DIC1NJykucmVhZGxpbmVz
KCk6CiAgICAgICAgICAgIHN0YXR1cyA9IE5vbmUKICAgICAgICAgICAgZmlsZV9uYW1lID0gTm9u
ZQogICAgICAgICAgICBtYXRjaCA9IHJlLnNlYXJjaCgnXihbQURNXSlcdCguKykkJywgbGluZSkK
ICAgICAgICAgICAgaWYgbWF0Y2g6CiAgICAgICAgICAgICAgICAjc3RhdHVzID0gbWF0Y2guZ3Jv
dXAoMSkKICAgICAgICAgICAgICAgIGZpbGVfbmFtZSA9IG1hdGNoLmdyb3VwKDIpCiAgICAgICAg
ICAgICAgICBmaWxlX25hbWVzLmFwcGVuZChmaWxlX25hbWUpCiAgICAgICAgcmV0dXJuIGZpbGVf
bmFtZXMKICAgIAogICAgZGVmIGNvbW1pdF93aXRoX21lc3NhZ2Uoc2VsZiwgbWVzc2FnZSk6CiAg
ICAgICAgIyBDb21taXQgZmlyc3QgdG8gZ2l0CiAgICAgICAgY29tbWl0X3Byb2Nlc3MgPSBzdWJw
cm9jZXNzLlBvcGVuKCdnaXQgY29tbWl0IC1hIC1GIC0nLCBzdGRpbj1zdWJwcm9jZXNzLlBJUEUs
IHNoZWxsPVRydWUpCiAgICAgICAgY29tbWl0X3Byb2Nlc3MuY29tbXVuaWNhdGUobWVzc2FnZSkK
CiAgICAgICAgIyBOb3cgY29tbWl0IHRvIHN2bjoKICAgICAgICBpZiBzZWxmLmRyeXJ1bjoKICAg
ICAgICAgICAgcmV0dXJuCiAgICAgICAgY29tbWl0X3Byb2Nlc3MgPSBzdWJwcm9jZXNzLlBvcGVu
KCdnaXQgc3ZuIGRjb21taXQnLCBzdGRvdXQ9c3VicHJvY2Vzcy5QSVBFLCBzaGVsbD1UcnVlKQog
ICAgICAgIChvdXQsIGVycm9yKSA9IGNvbW1pdF9wcm9jZXNzLmNvbW11bmljYXRlKCkKICAgICAg
ICByZXR1cm5fY29kZSA9IGNvbW1pdF9wcm9jZXNzLndhaXQoKQogICAgICAgIHJldHVybiBvdXQK
CiAgICBkZWYgY29tbWl0X2xvY2FsX2NoYW5nZXMoc2VsZik6CiAgICAgICAgY29tbWl0X21lc3Nh
Z2UgPSBjb21taXRfbWVzc2FnZV9mb3JfdGhpc19jb21taXQoc2VsZikKICAgICAgICBjb21taXRf
bG9nID0gc2VsZi5jb21taXRfd2l0aF9tZXNzYWdlKGNvbW1pdF9tZXNzYWdlKQogICAgICAgIHJl
dHVybiBjb21taXRfbG9nCgoKY2xhc3MgU2NyaXB0RXJyb3IoRXhjZXB0aW9uKToKICAgIHBhc3MK
CgpjbGFzcyBCdWd6aWxsYVRvb2w6CiAgICBkZWYgX19pbml0X18oc2VsZik6CiAgICAgICAgc2Vs
Zi5zY20gPSBTQ00oKQogICAgICAgIHNlbGYuYnVncyA9IEJ1Z3ppbGxhKCkKICAgICAgICBzZWxm
LmNvbW1hbmRzID0gewogICAgICAgICAgICAiYnVncy10by1jb21taXQiIDogc2VsZi5wcmludF9i
dWdzX2luX2NvbW1pdF9xdWV1ZSwKICAgICAgICAgICAgInBhdGNoZXMtdG8tY29tbWl0IiA6IHNl
bGYucHJpbnRfcGF0Y2hlc19pbl9jb21taXRfcXVldWUsCiAgICAgICAgICAgICJyZXZpZXdlZC1w
YXRjaGVzLW9uIiA6IHNlbGYucHJpbnRfcmV2aWV3ZWRfcGF0Y2hlc19vbl9idWcsCiAgICAgICAg
ICAgICJhcHBseS1wYXRjaGVzLWZyb20tYnVnIjogc2VsZi5hcHBseV9wYXRjaGVzX2Zyb21fYnVn
LAogICAgICAgICAgICAiY29tbWl0LWFuZC11cGRhdGUtYnVnIjogc2VsZi5jb21taXRfYW5kX3Vw
ZGF0ZV9idWcsCiAgICAgICAgICAgICJsYW5kLXBhdGNoZXMtZnJvbS1idWciOiBzZWxmLmxhbmRf
cGF0Y2hlc19mcm9tX2J1ZywKICAgICAgICAgICAgImNvbW1pdC1tZXNzYWdlIjogc2VsZi5wcmlu
dF9jb21taXRfbWVzc2FnZV9mb3JfdGhpc19jb21taXQsCiAgICAgICAgICAgICJvYnNvbGV0ZS1h
dHRhY2htZW50cy1vbi1idWciOiBzZWxmLm9ic29sZXRlX2F0dGFjaG1lbnRzX29uX2J1ZywKICAg
ICAgICB9CiAgICAKICAgIGRlZiBvYnNvbGV0ZV9hdHRhY2htZW50c19vbl9idWcoc2VsZiwgYXJn
cyk6CiAgICAgICAgYnVnX2lkID0gYXJnc1swXQogICAgICAgIGF0dGFjaG1lbnRzID0gc2VsZi5i
dWdzLmZldGNoX2F0dGFjaG1lbnRzX2Zyb21fYnVnKGJ1Z19pZCkKICAgICAgICBmb3IgYXR0YWNo
bWVudCBpbiBhdHRhY2htZW50czoKICAgICAgICAgICAgaWYgbm90IGF0dGFjaG1lbnRbJ29ic29s
ZXRlJ106CiAgICAgICAgICAgICAgICBzZWxmLmJ1Z3Mub2Jzb2xldGVfYXR0YWNobWVudChhdHRh
Y2htZW50WydpZCddKQogICAgCiAgICBkZWYgcHJpbnRfYnVnc19pbl9jb21taXRfcXVldWUoc2Vs
ZiwgYXJncyk6CiAgICAgICAgYnVnX2lkcyA9IHNlbGYuYnVncy5mZXRjaF9idWdfaWRzX2Zyb21f
Y29tbWl0X3F1ZXVlKCkKICAgICAgICBmb3IgYnVnX2lkIGluIGJ1Z19pZHM6CiAgICAgICAgICAg
IHByaW50IHNlbGYuYnVncy5idWdfdXJsX2Zvcl9idWdfaWQoYnVnX2lkKQoKICAgIGRlZiBwcmlu
dF9wYXRjaGVzX2luX2NvbW1pdF9xdWV1ZShzZWxmLCBhcmdzKToKICAgICAgICBwYXRjaGVzID0g
c2VsZi5idWdzLmZldGNoX3BhdGNoZXNfZnJvbV9jb21taXRfcXVldWUoKQogICAgICAgIGxvZygi
UGF0Y2hlcyBpbiBjb21taXQgcXVldWU6IikKICAgICAgICBmb3IgcGF0Y2ggaW4gcGF0Y2hlczoK
ICAgICAgICAgICAgcHJpbnQgcGF0Y2hbJ3VybCddCgogICAgZGVmIHByaW50X3Jldmlld2VkX3Bh
dGNoZXNfb25fYnVnKHNlbGYsIGFyZ3MpOgogICAgICAgIGJ1Z19pZCA9IGFyZ3NbMF0KICAgICAg
ICBwYXRjaGVzX3RvX2xhbmQgPSBzZWxmLmJ1Z3MuZmV0Y2hfcmV2aWV3ZWRfcGF0Y2hlc19mcm9t
X2J1ZyhidWdfaWQpCiAgICAgICAgZm9yIHBhdGNoIGluIHBhdGNoZXNfdG9fbGFuZDoKICAgICAg
ICAgICAgcHJpbnQgcGF0Y2hbJ3VybCddCgogICAgZGVmIGFwcGx5X3BhdGNoZXNfZnJvbV9idWco
c2VsZiwgYXJncyk6CiAgICAgICAgYnVnX2lkID0gYXJnc1swXQogICAgICAgIHBhdGNoZXMgPSBz
ZWxmLmJ1Z3MuZmV0Y2hfcmV2aWV3ZWRfcGF0Y2hlc19mcm9tX2J1ZyhidWdfaWQpCiAgICAgICAg
c2VsZi5zY20udXBkYXRlX2FuZF9jbGVhcl93b3JraW5nX2RpcmVjdG9yeSgpCiAgICAgICAgIyBT
aG91bGQgd2UgZXJyb3Igb3V0IGlmIHNlbGYuc2NtIGRvZXMgbm90IHN1cHBvcnQgbG9jYWwgY29t
bWl0cz8KICAgICAgICBmb3IgcGF0Y2ggaW4gcGF0Y2hlczoKICAgICAgICAgICAgc2VsZi5zY20u
YXBwbHlfcGF0Y2gocGF0Y2gpCgogICAgZGVmIGNvbW1pdF9hbmRfdXBkYXRlX2J1ZyhzZWxmLCBh
cmdzKToKICAgICAgICBidWdfaWQgPSBhcmdzWzBdCiAgICAgICAgY29tbWl0X3RleHQgPSBzZWxm
LnNjbS5jb21taXRfbG9jYWxfY2hhbmdlcygpCiAgICAgICAgc2VsZi5idWdzLmNsb3NlX2J1Z19h
c19maXhlZChidWdfaWQsIGNvbW1pdF90ZXh0KQoKICAgIGRlZiBydW5fYW5kX3Rocm93X2lmX2Zh
aWwoc2VsZiwgc2NyaXB0X25hbWUpOgogICAgICAgIGJ1aWxkX3dlYmtpdF9wcm9jZXNzID0gc3Vi
cHJvY2Vzcy5Qb3BlbihzY3JpcHRfbmFtZSwgc2hlbGw9VHJ1ZSkKICAgICAgICByZXR1cm5fY29k
ZSA9IGJ1aWxkX3dlYmtpdF9wcm9jZXNzLndhaXQoKQogICAgICAgIGlmIHJldHVybl9jb2RlICE9
IDA6CiAgICAgICAgICAgIHJhaXNlIFNjcmlwdEVycm9yKHNjcmlwdF9uYW1lICsgIiBmYWlsZWQg
d2l0aCBjb2RlICIgKyByZXR1cm5fY29kZSkKCiAgICBkZWYgYnVpbGRfd2Via2l0KHNlbGYpOgog
ICAgICAgIHNlbGYucnVuX2FuZF90aHJvd19pZl9mYWlsKCJidWlsZC13ZWJraXQiKQogICAgCiAg
ICBkZWYgcnVuX3dlYmtpdF90ZXN0cyhzZWxmKToKICAgICAgICBzZWxmLnJ1bl9hbmRfdGhyb3df
aWZfZmFpbCgicnVuLXdlYmtpdC10ZXN0cyIpCgogICAgZGVmIGxhbmRfcGF0Y2hlc19mcm9tX2J1
ZyhzZWxmLCBhcmdzKToKICAgICAgICBidWdfaWQgPSBhcmdzWzBdCgogICAgICAgIHRyeToKICAg
ICAgICAgICAgcGF0Y2hlcyA9IHNlbGYuYnVncy5mZXRjaF9yZXZpZXdlZF9wYXRjaGVzX2Zyb21f
YnVnKGJ1Z19pZCkKICAgICAgICAgICAgY29tbWl0X3RleHQgPSAiIgogICAgICAgICAgICAKICAg
ICAgICAgICAgZm9yIHBhdGNoIGluIHBhdGNoZXM6CiAgICAgICAgICAgICAgICBzZWxmLnNjbS51
cGRhdGVfYW5kX2NsZWFyX3dvcmtpbmdfZGlyZWN0b3J5KCkKICAgICAgICAgICAgICAgIHNlbGYu
c2NtLmFwcGx5X3BhdGNoKHBhdGNoKQogICAgICAgICAgICAgICAgc2VsZi5idWlsZF93ZWJraXQo
KQogICAgICAgICAgICAgICAgIyBzZWxmLnJ1bl93ZWJraXRfdGVzdHMoKQogICAgICAgICAgICAg
ICAgY29tbWl0X3RleHQgPSBzZWxmLnNjbS5jb21taXRfbG9jYWxfY2hhbmdlcygpCiAgICAgICAg
ICAgICAgICAjIGlmIHdlJ3JlIGNvbW1pdGluZyBtb3JlIHRoYW4gb25lIHBhdGNoLCB1cGRhdGUg
dGhlIGJ1ZyBhcyB3ZSBnbwogICAgICAgICAgICAgICAgaWYgbGVuKHBhdGNoZXMpID4gMToKICAg
ICAgICAgICAgICAgICAgICBzZWxmLmJ1Z3Mub2Jzb2xldGVfYXR0YWNobWVudChwYXRjaFsnaWQn
XSwgY29tbWl0X3RleHQpCiAgICAgICAgICAgIAogICAgICAgICAgICBpZiBsZW4ocGF0Y2hlcykg
PiAxOgogICAgICAgICAgICAgICAgY29tbWl0X3RleHQgPSAiQWxsIHJldmlld2VkIHBhdGNoZXMg
bGFuZGVkLCBjbG9zaW5nLiIKICAgICAgICAgICAgCiAgICAgICAgICAgIHNlbGYuYnVncy5jbG9z
ZV9idWdfYXNfZml4ZWQoYnVnX2lkLCBjb21taXRfdGV4dCkKICAgICAgICBleGNlcHQgU2NyaXB0
RXJyb3IsIGVycm9yOgogICAgICAgICAgICBwcmludCBlcnJvcgogICAgICAgICAgICAjIFdlIGNv
dWxkIGFkZCBhIGNvbW1lbnQgdG8gdGhlIGJ1ZyBhYm91dCB0aGUgZmFpbHVyZQoKICAgIGRlZiBw
cmludF9jb21taXRfbWVzc2FnZV9mb3JfdGhpc19jb21taXQoc2VsZiwgYXJncyk6CiAgICAgICAg
cHJpbnQgY29tbWl0X21lc3NhZ2VfZm9yX3RoaXNfY29tbWl0KHNlbGYuc2NtKQogICAgCiAgICBk
ZWYgdXNhZ2Uoc2VsZik6CiAgICAgICAgcHJpbnQgb3MucGF0aC5iYXNlbmFtZShzeXMuYXJndlsw
XSkgKyAiIFtvcHRpb25zXSBjb21tYW5kIFtjb21tYW5kLW9wdGlvbnNdIFtjb21tYW5kLWFyZ3Nd
IgogICAgICAgIHByaW50ICJHbG9iYWwgT3B0aW9uczoiCiAgICAgICAgcHJpbnQgIiAgZHJ5LXJ1
biAtLSBEbyBub3QgdG91Y2ggYW55IHJlbW90ZSBzZXJ2ZXIuIgogICAgICAgIHByaW50CiAgICAg
ICAgcHJpbnQgIkNvbW1hbmRzOiIKICAgICAgICBwcmludCAiICAiICsgIlxuICAgICIuam9pbihz
b3J0ZWQoc2VsZi5jb21tYW5kcy5rZXlzKCkpKQogICAgICAgIHN5cy5leGl0KDEpCgogICAgZGVm
IHBhcnNlX2dsb2JhbF9hcmdzKHNlbGYsIGFyZ3MpOgogICAgICAgIGlmIGFyZ3NbMF0gPT0gIi0t
ZHJ5LXJ1biI6CiAgICAgICAgICAgIHNlbGYuc2NtLmRyeXJ1biA9IFRydWUKICAgICAgICAgICAg
c2VsZi5idWdzLmRyeXJ1biA9IFRydWUKICAgICAgICAgICAgYXJncy5wb3AoMCkKICAgIAogICAg
ZGVmIG1haW4oc2VsZik6CiAgICAgICAgaWYgbGVuKHN5cy5hcmd2KSA8IDI6CiAgICAgICAgICAg
IHNlbGYudXNhZ2UoKQoKICAgICAgICAjIHdlIGNvdWxkIHdyaXRlIG1vcmUgc29waGlzaXRjYXRl
ZCBvcHRpb24gcGFyc2luZyBzb21lIGRheQogICAgICAgIGFyZ3MgPSBzeXMuYXJndlsxOl0KICAg
ICAgICBzZWxmLnBhcnNlX2dsb2JhbF9hcmdzKGFyZ3MpCgogICAgICAgIGxvYWRfY29uZmlnKCkK
CiAgICAgICAgY29tbWFuZCA9IGFyZ3MucG9wKDApCiAgICAgICAgaWYgbm90IGNvbW1hbmQgaW4g
c2VsZi5jb21tYW5kczoKICAgICAgICAgICAgbG9nKGNvbW1hbmQgKyAiIGlzIG5vdCBhIHZhbGlk
IGNvbW1hbmQiKQogICAgICAgICAgICB1c2FnZSgpCgogICAgICAgIHJldHVybiBzZWxmLmNvbW1h
bmRzW2NvbW1hbmRdKGFyZ3MpCgoKZGVmIG1haW4oKToKICAgIHRvb2wgPSBCdWd6aWxsYVRvb2wo
KQogICAgcmV0dXJuIHRvb2wubWFpbigpCgppZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgogICAg
bWFpbigpCg==
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="0"
              isprivate="0"
          >
            <attachid>31327</attachid>
            <date>2009-06-15 19:28:20 -0700</date>
            <delta_ts>2009-06-17 18:24:50 -0700</delta_ts>
            <desc>bugzilla-tool, now with better bug comments after commit</desc>
            <filename>bugzilla-tool</filename>
            <type>application/octet-stream</type>
            <size>17468</size>
            <attacher name="Eric Seidel (no email)">eric</attacher>
            
              <data encoding="base64">IyEvdXNyL2Jpbi9weXRob24KCmltcG9ydCByZQppbXBvcnQgb3MKaW1wb3J0IHN1YnByb2Nlc3MK
aW1wb3J0IHN5cwoKIyBGb3IgQnVnemlsbGE6CmltcG9ydCBnZXRwYXNzCmltcG9ydCB1cmxsaWIy
CmZyb20gQmVhdXRpZnVsU291cCBpbXBvcnQgQmVhdXRpZnVsU291cApmcm9tIG1lY2hhbml6ZSBp
bXBvcnQgQnJvd3NlcgoKIyBEZWZhdWx0cyAodW50aWwgd2Ugc3VwcG9ydCBiZXR0ZXIgb3B0aW9u
IHBhcnNpbmcpOgpidWdfc2VydmVyID0gImh0dHBzOi8vYnVncy53ZWJraXQub3JnLyIKYnVnX2Jh
c2VfdXJsID0gYnVnX3NlcnZlciArICJzaG93X2J1Zy5jZ2k/aWQ9IgphdHRhY2htZW50X2Jhc2Vf
dXJsID0gYnVnX3NlcnZlciArICJhdHRhY2htZW50LmNnaT9pZD0iCgojIENhY2hlZCBjb25maWcs
IHRoZXNlIHNob3VsZCBtb3ZlIG9udG8gdGhlIEJ1Z3ppbGxhIG9iamVjdApjYWNoZWRfdXNlcm5h
bWUgPSBOb25lCmNhY2hlZF9wYXNzd29yZCA9IE5vbmUKCmRlZiBsb2FkX2NvbmZpZygpOgogICAg
Z2xvYmFsIGNhY2hlZF91c2VybmFtZSwgY2FjaGVkX3Bhc3N3b3JkCiAgICBjYWNoZWRfdXNlcm5h
bWUgPSByZWFkX2NvbmZpZygndXNlcm5hbWUnKQogICAgY2FjaGVkX3Bhc3N3b3JkID0gcmVhZF9j
b25maWcoJ3Bhc3N3b3JkJykKCmRlZiByZWFkX2NvbmZpZyhrZXkpOgogICAgIyBOZWVkIGEgd2F5
IHRvIHJlYWQgZnJvbSBzdm4gdG9vCiAgICBjb25maWdfcHJvY2VzcyA9IHN1YnByb2Nlc3MuUG9w
ZW4oImdpdCBjb25maWcgLS1nZXQgYnVnemlsbGEuIiArIGtleSwgc3Rkb3V0PXN1YnByb2Nlc3Mu
UElQRSwgc2hlbGw9VHJ1ZSkKICAgIHZhbHVlID0gY29uZmlnX3Byb2Nlc3MuY29tbXVuaWNhdGUo
KVswXQogICAgcmV0dXJuX2NvZGUgPSBjb25maWdfcHJvY2Vzcy53YWl0KCkKCiAgICBpZiByZXR1
cm5fY29kZSAhPSAwOgogICAgICAgIHJldHVybiBOb25lCiAgICByZXR1cm4gdmFsdWUucnN0cmlw
KCdcbicpCgojIE9uY2UgdGhpcyBpcyBpbiBXZWJLaXRUb29scyB3ZSBjYW4gZmluZCB0aGUgV2Vi
S2l0CiMgZGlyZWN0b3J5IGJ5IHdhbGtpbmcgdXAgdGhlIHBhdGgKZGVmIGNoZGlyX3dlYmtpdCgp
OgogICAgIyBXRUJLSVRfQkFTRSBpcyBhbiBlbnZpcm9ubWVudCB2YXJpYWJsZSBzcGVjaWZpYyB0
byBteSBzZXR1cAogICAgaWYgKG9zLmVudmlyb25bJ1dFQktJVF9CQVNFJ10pOgogICAgICAgIHdl
YmtpdF9kaXJlY3RvcnkgPSBvcy5lbnZpcm9uWydXRUJLSVRfQkFTRSddCiAgICBlbHNlOgogICAg
ICAgICMgZGVmYXVsdCB0byB3aGVyZSBJIG5vcm1hbGx5IHN0b3JlIFdlYktpdCBpZiB3ZSBjYW4n
dCBmaW5kIFdFQktJVF9CQVNFCiAgICAgICAgd2Via2l0X2RpcmVjdG9yeSA9ICIvVXNlcnMvZXNl
aWRlbC9Qcm9qZWN0cy9XZWJLaXQiCiAgICBvcy5jaGRpcih3ZWJraXRfZGlyZWN0b3J5KQoKCmRl
ZiBsb2coc3RyaW5nKToKICAgIHByaW50ID4+IHN5cy5zdGRlcnIsIHN0cmluZwoKCgojIDIwMDkt
MDYtMDMgIEVyaWMgU2VpZGVsICA8ZXJpY0B3ZWJraXQub3JnPgpjaGFuZ2Vsb2dfZGF0ZV9saW5l
X3JlZ2V4cCA9ICdeKFtcZFwtXSspICAoLispICA8KC4rKT4kJwoKZGVmIGxhdGVzdF9jaGFuZ2Vs
b2dfZW50cnkoY2hhbmdlbG9nX3BhdGgpOgogICAgZW50cnlfbGluZXMgPSBbXQogICAgY2hhbmdl
bG9nID0gb3BlbihjaGFuZ2Vsb2dfcGF0aCkKICAgIHRyeToKICAgICAgICBwcmludCAiUGFyc2lu
ZyBDaGFuZ2VMb2c6ICIgKyBjaGFuZ2Vsb2dfcGF0aAogICAgICAgICMgVGhlIGZpcnN0IGxpbmUg
c2hvdWxkIGJlIGEgZGF0ZSBsaW5lCiAgICAgICAgZW50cnlfbGluZXMuYXBwZW5kKGNoYW5nZWxv
Zy5yZWFkbGluZSgpKQogICAgICAgIGZvciBsaW5lIGluIGNoYW5nZWxvZzoKICAgICAgICAgICAg
IyBpZiB3ZSd2ZSBoaXQgdGhlIG5leHQgZW50cnksIHJldHVybgogICAgICAgICAgICBpZiByZS5t
YXRjaChjaGFuZ2Vsb2dfZGF0ZV9saW5lX3JlZ2V4cCwgbGluZSk6CiAgICAgICAgICAgICAgICBy
ZXR1cm4gJycuam9pbihlbnRyeV9saW5lcykKICAgICAgICAgICAgZW50cnlfbGluZXMuYXBwZW5k
KGxpbmUpCiAgICBmaW5hbGx5OgogICAgICAgICAgICBjaGFuZ2Vsb2cuY2xvc2UoKQogICAgIyBX
ZSBuZXZlciBmb3VuZCBhIGRhdGUgbGluZSEKICAgIHJldHVybiBOb25lCgpkZWYgY29tbWl0X21l
c3NhZ2VfZm9yX3RoaXNfY29tbWl0KHNjbSk6CiAgICBjaGFuZ2Vsb2dfbWVzc2FnZXMgPSBbXQog
ICAgcGF0aHMgPSBzY20uY2hhbmdlZF9maWxlcygpCiAgICBmb3IgcGF0aCBpbiBwYXRoczoKICAg
ICAgICBpZiByZS5zZWFyY2goJ0NoYW5nZUxvZycsIHBhdGgpOgogICAgICAgICAgICBjaGFuZ2Vs
b2dfZW50cnkgPSBsYXRlc3RfY2hhbmdlbG9nX2VudHJ5KHBhdGgpCiAgICAgICAgICAgIGlmIG5v
dCBjaGFuZ2Vsb2dfZW50cnk6CiAgICAgICAgICAgICAgICByYWlzZSAiRmFpbGVkIHRvIHBhcnNl
IENoYW5nZUxvZzogIiArIG9zLnBhdGguYWJzcGF0aChwYXRoKQogICAgICAgICAgICBjaGFuZ2Vs
b2dfbWVzc2FnZXMuYXBwZW5kKGNoYW5nZWxvZ19lbnRyeSkKICAgIHJldHVybiAnJy5qb2luKGNo
YW5nZWxvZ19tZXNzYWdlcykKCmRlZiBidWdfY29tbWl0X2Zyb21fY29tbWl0X3RleHQoY29tbWl0
X3RleHQpOgogICAgY29tbWVudF9saW5lcyA9IFtdCiAgICBjb21taXRfbGluZXMgPSBjb21taXRf
dGV4dC5zcGxpdGxpbmVzKCkKICAgIGZvciBsaW5lIGluIGNvbW1pdF9saW5lczoKICAgICAgICBj
b21tZW50X2xpbmVzLmFwcGVuZChsaW5lKQogICAgICAgIG1hdGNoID0gcmUubWF0Y2goIl5Db21t
aXR0ZWQgcihcZCspJCIsIGxpbmUpCiAgICAgICAgaWYgbWF0Y2g6CiAgICAgICAgICAgIHJldmlz
aW9uID0gbWF0Y2guZ3JvdXAoMSkKICAgICAgICAgICAgY29tbWVudF9saW5lcy5hcHBlbmQoImh0
dHA6Ly90cmFjLndlYmtpdC5vcmcvY2hhbmdlc2V0LyIgKyByZXZpc2lvbikKICAgICAgICAgICAg
YnJlYWsKICAgIHJldHVybiAiXG4iLmpvaW4oY29tbWVudF9saW5lcykKCgpjbGFzcyBCdWd6aWxs
YToKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBkcnlydW4gPSBGYWxzZSk6CiAgICAgICAgc2VsZi5k
cnlydW4gPSBkcnlydW4KICAgICAgICAKICAgICAgICBzZWxmLmJyID0gQnJvd3NlcigpCiAgICAg
ICAgIyBJZ25vcmUgYnVncy53ZWJraXQub3JnL3JvYm90cy50eHQgdW50aWwgd2UgZml4IGl0IHRv
IGFsbG93IHRoaXMgc2NyaXB0CiAgICAgICAgc2VsZi5ici5zZXRfaGFuZGxlX3JvYm90cyhGYWxz
ZSkKCiAgICAjIFRoaXMgY291bGQgZXZlbnR1YWxseSBiZSBhIHRleHQgZmlsZQogICAgcmV2aWV3
ZXJfdXNlcm5hbWVzX3RvX2Z1bGxfbmFtZXMgPSB7CiAgICAgICAgImFiYXJ0aCIgOiAiQWRhbSBC
YXJ0aCIsCiAgICAgICAgImFkZWxlIiA6ICJBZGVsZSBQZXRlcnNvbiIsCiAgICAgICAgImFyaXlh
LmhpZGF5YXQiIDogIkFyaXlhIEhpZGF5YXQiLAogICAgICAgICJkYXJpbiIgOiAiRGFyaW4gQWRs
ZXIiLAogICAgICAgICJkZ2xhemtvdiIgOiAiRGltaXRyaSBHbGF6a292IiwKICAgICAgICAiZXJp
YyIgOiAiRXJpYyBTZWlkZWwiLAogICAgICAgICJkZGtpbHplciIgOiAiRGF2aWQgS2lsemVyIiwK
ICAgICAgICAiZmlzaGQiIDogIkRhcmluIEZpc2hlciIsCiAgICAgICAgImducyIgOiAiR3VzdGF2
byBOb3JvbmhhIiwKICAgICAgICAiaHlhdHQiIDogIkRhdmlkIEh5YXR0IiwKICAgICAgICAiam1h
bG9uem8iIDogIkphbiBBbG9uem8iLAogICAgICAgICJsZXZpbiIgOiAiRGF2aWQgTGV2aW4iLAog
ICAgICAgICJtaXR6IiA6ICJEYW4gQmVybnN0ZWluIiwKICAgICAgICAibWpzIiA6ICJNYWNpZWog
U3RhY2hvdmlhayIsCiAgICAgICAgIm1yb3dlIiA6ICJNYXJrIFJvd2UiLAogICAgICAgICJvbGl2
ZXIiIDogIk9saXZlciBIdW50IiwKICAgICAgICAic3RhaWtvcyIgOiAiR2VvcmdlIFN0YWlrb3Mi
LAogICAgICAgICJ0cmVhdCIgOiAiQWRhbSBUcmVhdCIsCiAgICAgICAgInRpbW90aHkiIDogIlRp
bW90aHkgSGF0Y2hlciIsCiAgICAgICAgInhhbi5sb3BleiIgOiAiWGFuIExvcGV6IiwKICAgICAg
ICAiemVja2UiIDogIkhvbGdlciBGcmV5dGhlciIsCiAgICB9CgogICAgZGVmIGZ1bGxfbmFtZV9m
cm9tX2J1Z3ppbGxhX25hbWUoc2VsZiwgYnVnemlsbGFfbmFtZSk6CiAgICAgICAgaWYgbm90IGJ1
Z3ppbGxhX25hbWUgaW4gc2VsZi5yZXZpZXdlcl91c2VybmFtZXNfdG9fZnVsbF9uYW1lczoKICAg
ICAgICAgICAgcmFpc2UgRXhjZXB0aW9uKCJFUlJPUjogVW5rbm93biByZXZpZXdlciEgIiArIGJ1
Z3ppbGxhX25hbWUpCiAgICAgICAgcmV0dXJuIHNlbGYucmV2aWV3ZXJfdXNlcm5hbWVzX3RvX2Z1
bGxfbmFtZXNbYnVnemlsbGFfbmFtZV0KCiAgICBkZWYgYnVnX3VybF9mb3JfYnVnX2lkKHNlbGYs
IGJ1Z19pZCk6CiAgICAgICAgcmV0dXJuICIlcyVzIiAlIChidWdfYmFzZV91cmwsIGJ1Z19pZCkK
ICAgIAogICAgZGVmIGF0dGFjaG1lbnRfdXJsX2Zvcl9pZChzZWxmLCBhdHRhY2htZW50X2lkLCBh
Y3Rpb24gPSAidmlldyIpOgogICAgICAgIHJldHVybiAiJXMlcyZhY3Rpb249JXMiICUgKGF0dGFj
aG1lbnRfYmFzZV91cmwsIGF0dGFjaG1lbnRfaWQsIGFjdGlvbikKCiAgICBkZWYgZmV0Y2hfYXR0
YWNobWVudHNfZnJvbV9idWcoc2VsZiwgYnVnX2lkKToKICAgICAgICBidWdfdXJsID0gc2VsZi5i
dWdfdXJsX2Zvcl9idWdfaWQoYnVnX2lkKQogICAgICAgIGxvZygiRmV0Y2hpbmc6ICIgKyBidWdf
dXJsKQoKICAgICAgICBwYWdlID0gdXJsbGliMi51cmxvcGVuKGJ1Z191cmwpCiAgICAgICAgc291
cCA9IEJlYXV0aWZ1bFNvdXAocGFnZSkKICAgIAogICAgICAgIGF0dGFjaG1lbnRfdGFibGUgPSBz
b3VwLmZpbmQoJ3RhYmxlJywgeydjZWxsc3BhY2luZyc6IjAiLCAnY2VsbHBhZGRpbmcnOiI0Iiwg
J2JvcmRlcic6IjEifSkKICAgIAogICAgICAgIGF0dGFjaG1lbnRzID0gW10KICAgICAgICAjIEdy
YWIgYSBsaXN0IG9mIG5vbi1vYnNvbGV0ZWQgcGF0Y2ggZmlsZXMgCiAgICAgICAgZm9yIGF0dGFj
aG1lbnRfcm93IGluIGF0dGFjaG1lbnRfdGFibGUuZmluZEFsbCgndHInKToKICAgICAgICAgICAg
Zmlyc3RfY2VsbCA9IGF0dGFjaG1lbnRfcm93LmZpbmQoJ3RkJykKICAgICAgICAgICAgaWYgbm90
IGZpcnN0X2NlbGw6CiAgICAgICAgICAgICAgICBjb250aW51ZSAjIFRoaXMgaXMgdGhlIGhlYWRl
ciwgbm8gY2VsbHMKICAgICAgICAgICAgaWYgZmlyc3RfY2VsbC5oYXNfa2V5KCdjb2xzcGFuJyk6
CiAgICAgICAgICAgICAgICBicmVhayAjIHRoaXMgaXMgdGhlIGxhc3Qgcm93CiAgICAgICAgICAg
IAogICAgICAgICAgICBhdHRhY2htZW50ID0ge30KICAgICAgICAgICAgYXR0YWNobWVudFsnb2Jz
b2xldGUnXSA9IChhdHRhY2htZW50X3Jvdy5oYXNfa2V5KCdjbGFzcycpIGFuZCBhdHRhY2htZW50
X3Jvd1snY2xhc3MnXSA9PSAiYnpfb2Jzb2xldGUiKQogICAgICAgICAgICAKICAgICAgICAgICAg
Y2VsbHMgPSBhdHRhY2htZW50X3Jvdy5maW5kQWxsKCd0ZCcpCiAgICAgICAgICAgIGF0dGFjaG1l
bnRfbGluayA9IGNlbGxzWzBdLmZpbmQoJ2EnKQogICAgICAgICAgICBhdHRhY2htZW50Wyd1cmwn
XSA9IGJ1Z19zZXJ2ZXIgKyBhdHRhY2htZW50X2xpbmtbJ2hyZWYnXSAjIHVybHMgYXJlIHJlbGF0
aXZlCiAgICAgICAgICAgIGF0dGFjaG1lbnRbJ2lkJ10gPSBhdHRhY2htZW50Wyd1cmwnXS5zcGxp
dCgnPScpWzFdICMgZS5nLiBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9hdHRhY2htZW50LmNnaT9p
ZD0zMTIyMwogICAgICAgICAgICBhdHRhY2htZW50WyduYW1lJ10gPSBhdHRhY2htZW50X2xpbmsu
c3RyaW5nCiAgICAgICAgICAgICMgYXR0YWNobWVudFsndHlwZSddID0gY2VsbHNbMV0KICAgICAg
ICAgICAgIyBhdHRhY2htZW50WydkYXRlJ10gPSBjZWxsc1syXQogICAgICAgICAgICAjIGF0dGFj
aG1lbnRbJ3NpemUnXSA9IGNlbGxzWzNdCiAgICAgICAgICAgIHJldmlld19zdGF0dXMgPSBjZWxs
c1s0XQogICAgICAgICAgICAjIGFjdGlvbl9saW5rcyA9IGNlbGxzWzVdCgogICAgICAgICAgICBp
ZiAoc3RyKHJldmlld19zdGF0dXMpLmZpbmQoInJldmlldysiKSAhPSAtMSk6CiAgICAgICAgICAg
ICAgICByZXZpZXdlciA9IHJldmlld19zdGF0dXMuY29udGVudHNbMF0uc3BsaXQoJzonKVswXSAj
IG5hbWU6XG4gcmV2aWV3K1xuCiAgICAgICAgICAgICAgICByZXZpZXdlcl9mdWxsX25hbWUgPSBz
ZWxmLmZ1bGxfbmFtZV9mcm9tX2J1Z3ppbGxhX25hbWUocmV2aWV3ZXIpCiAgICAgICAgICAgICAg
ICBhdHRhY2htZW50WydyZXZpZXdlciddID0gcmV2aWV3ZXJfZnVsbF9uYW1lCgogICAgICAgICAg
ICBhdHRhY2htZW50cy5hcHBlbmQoYXR0YWNobWVudCkKICAgICAgICByZXR1cm4gYXR0YWNobWVu
dHMKCiAgICBkZWYgZmV0Y2hfcmV2aWV3ZWRfcGF0Y2hlc19mcm9tX2J1ZyhzZWxmLCBidWdfaWQp
OgogICAgICAgIHJldmlld2VkX3BhdGNoZXMgPSBbXQogICAgICAgIGZvciBhdHRhY2htZW50IGlu
IHNlbGYuZmV0Y2hfYXR0YWNobWVudHNfZnJvbV9idWcoYnVnX2lkKToKICAgICAgICAgICAgaWYg
J3Jldmlld2VyJyBpbiBhdHRhY2htZW50IGFuZCBub3QgYXR0YWNobWVudFsnb2Jzb2xldGUnXToK
ICAgICAgICAgICAgICAgIHJldmlld2VkX3BhdGNoZXMuYXBwZW5kKGF0dGFjaG1lbnQpCiAgICAg
ICAgcmV0dXJuIHJldmlld2VkX3BhdGNoZXMKCiAgICBkZWYgZmV0Y2hfYnVnX2lkc19mcm9tX2Nv
bW1pdF9xdWV1ZShzZWxmKToKICAgICAgICB1bmFzc2lnbmVkX29ubHkgPSAiJmVtYWlsYXNzaWdu
ZWRfdG8xPTEmZW1haWx0eXBlMT1zdWJzdHJpbmcmZW1haWwxPXVuYXNzaWduZWQiCiAgICAgICAg
Y29tbWl0X3F1ZXVlX3VybCA9ICJodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9idWdsaXN0LmNnaT9x
dWVyeV9mb3JtYXQ9YWR2YW5jZWQmYnVnX3N0YXR1cz1VTkNPTkZJUk1FRCZidWdfc3RhdHVzPU5F
VyZidWdfc3RhdHVzPUFTU0lHTkVEJmJ1Z19zdGF0dXM9UkVPUEVORUQmZmllbGQwLTAtMD1mbGFn
dHlwZXMubmFtZSZ0eXBlMC0wLTA9ZXF1YWxzJnZhbHVlMC0wLTA9cmV2aWV3JTJCIgogICAgICAg
IGxvZygiTG9hZGluZyBjb21taXQgcXVldWUiKQoKICAgICAgICBwYWdlID0gdXJsbGliMi51cmxv
cGVuKGNvbW1pdF9xdWV1ZV91cmwpCiAgICAgICAgc291cCA9IEJlYXV0aWZ1bFNvdXAocGFnZSkK
ICAgIAogICAgICAgIGJ1Z19pZHMgPSBbXQogICAgICAgICMgR3JhYiB0aGUgY2VsbHMgaW4gdGhl
IGZpcnN0IGNvbHVtbiAod2hpY2ggaGFwcGVucyB0byBiZSB0aGUgYnVnIGlkcykKICAgICAgICBm
b3IgYnVnX2xpbmtfY2VsbCBpbiBzb3VwKCd0ZCcsICJmaXJzdC1jaGlsZCIpOiAjIHRkcyB3aXRo
IHRoZSBjbGFzcyAiZmlyc3QtY2hpbGQiCiAgICAgICAgICAgIGJ1Z19saW5rID0gYnVnX2xpbmtf
Y2VsbC5maW5kKCJhIikKICAgICAgICAgICAgYnVnX2lkcy5hcHBlbmQoYnVnX2xpbmsuc3RyaW5n
KSAjIHRoZSBjb250ZW50cyBoYXBwZW4gdG8gYmUgdGhlIGJ1ZyBpZAogICAgCiAgICAgICAgcmV0
dXJuIGJ1Z19pZHMKCiAgICBkZWYgZmV0Y2hfcGF0Y2hlc19mcm9tX2NvbW1pdF9xdWV1ZShzZWxm
KToKICAgICAgICBwYXRjaGVzX3RvX2xhbmQgPSBbXQogICAgICAgIGZvciBidWdfaWQgaW4gc2Vs
Zi5mZXRjaF9idWdfaWRzX2Zyb21fY29tbWl0X3F1ZXVlKCk6CiAgICAgICAgICAgIHBhdGNoZXMg
PSBzZWxmLmZldGNoX3Jldmlld2VkX3BhdGNoZXNfZnJvbV9idWcoYnVnX2lkKQogICAgICAgICAg
ICBwYXRjaGVzX3RvX2xhbmQuZXh0ZW5kKHBhdGNoZXMpCiAgICAgICAgcmV0dXJuIHBhdGNoZXNf
dG9fbGFuZAoKICAgIGRlZiBhdXRoZW50aWNhdGUoc2VsZiwgdXNlcm5hbWUgPSBOb25lLCBwYXNz
d29yZCA9IE5vbmUpOgogICAgICAgIGdsb2JhbCBjYWNoZWRfdXNlcm5hbWUsIGNhY2hlZF9wYXNz
d29yZAogICAgICAgIAogICAgICAgIGlmIG5vdCB1c2VybmFtZToKICAgICAgICAgICAgaWYgY2Fj
aGVkX3VzZXJuYW1lOgogICAgICAgICAgICAgICAgdXNlcm5hbWUgPSBjYWNoZWRfdXNlcm5hbWUK
ICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIHVzZXJuYW1lID0gY2FjaGVkX3VzZXJu
YW1lID0gcmF3X2lucHV0KCJCdWd6aWxsYSBsb2dpbjogIikKICAgICAgICBpZiBub3QgcGFzc3dv
cmQ6CiAgICAgICAgICAgIGlmIGNhY2hlZF9wYXNzd29yZDoKICAgICAgICAgICAgICAgIHBhc3N3
b3JkID0gY2FjaGVkX3Bhc3N3b3JkCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBw
YXNzd29yZCA9IGNhY2hlZF9wYXNzd29yZCA9IGdldHBhc3MuZ2V0cGFzcygiQnVnemlsbGEgcGFz
c3dvcmQ6ICIpCgogICAgICAgIGxvZygiTG9nZ2luZyBpbiBhcyAlcy4uLiIgJSAodXNlcm5hbWUs
KSkKICAgICAgICBpZiBzZWxmLmRyeXJ1bjoKICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgc2Vs
Zi5ici5vcGVuKGJ1Z19zZXJ2ZXIgKyAiL2luZGV4LmNnaT9Hb0FoZWFkQW5kTG9nSW49MSIpCiAg
ICAgICAgc2VsZi5ici5zZWxlY3RfZm9ybShuYW1lPSJsb2dpbiIpCiAgICAgICAgc2VsZi5iclsn
QnVnemlsbGFfbG9naW4nXSA9IHVzZXJuYW1lCiAgICAgICAgc2VsZi5iclsnQnVnemlsbGFfcGFz
c3dvcmQnXSA9IHBhc3N3b3JkCiAgICAgICAgc2VsZi5ici5zdWJtaXQoKQoKICAgIGRlZiBvYnNv
bGV0ZV9hdHRhY2htZW50KHNlbGYsIGF0dGFjaG1lbnRfaWQsIGNvbW1lbnRfdGV4dCA9IE5vbmUp
OgogICAgICAgIHNlbGYuYXV0aGVudGljYXRlKCkKCiAgICAgICAgbG9nKCJPYnNvbGV0aW5nIGF0
dGFjaG1lbnQ6ICVzIiAlIChhdHRhY2htZW50X2lkLCkpCiAgICAgICAgaWYgc2VsZi5kcnlydW46
CiAgICAgICAgICAgIGxvZyhjb21tZW50X3RleHQpCiAgICAgICAgICAgIHJldHVybgoKICAgICAg
ICBzZWxmLmJyLm9wZW4oc2VsZi5hdHRhY2htZW50X3VybF9mb3JfaWQoYXR0YWNobWVudF9pZCwg
J2VkaXQnKSkKICAgICAgICBzZWxmLmJyLnNlbGVjdF9mb3JtKG5yPTApCiAgICAgICAgc2VsZi5i
ci5maW5kX2NvbnRyb2woJ2lzb2Jzb2xldGUnKS5pdGVtc1swXS5zZWxlY3RlZCA9IFRydWUKICAg
ICAgICAjIEFsc28gY2xlYXIgYW55IHJldmlldyBmbGFnICh0byByZW1vdmUgaXQgZnJvbSByZXZp
ZXcvY29tbWl0IHF1ZXVlcykKICAgICAgICBzZWxmLmJyLmZpbmRfY29udHJvbCh0eXBlPSdzZWxl
Y3QnLCBucj0wKS52YWx1ZSA9ICgiWCIsKQogICAgICAgIGlmIGNvbW1lbnRfdGV4dDoKICAgICAg
ICAgICAgbG9nKGNvbW1lbnRfdGV4dCkKICAgICAgICAgICAgc2VsZi5iclsnY29tbWVudCddID0g
Y29tbWVudF90ZXh0CiAgICAgICAgc2VsZi5ici5zdWJtaXQoKQoKICAgIGRlZiBwb3N0X2NvbW1l
bnRfdG9fYnVnKHNlbGYsIGJ1Z19pZCwgY29tbWVudF90ZXh0KToKICAgICAgICBzZWxmLmF1dGhl
bnRpY2F0ZSgpCgogICAgICAgIGxvZygiQWRkaW5nIGNvbW1lbnQgdG8gYnVnICVzIiAlIChidWdf
aWQsKSkKICAgICAgICBpZiBzZWxmLmRyeXJ1bjoKICAgICAgICAgICAgbG9nKGNvbW1lbnRfdGV4
dCkKICAgICAgICAgICAgcmV0dXJuCgogICAgICAgIHNlbGYuYnIub3BlbihzZWxmLmJ1Z191cmxf
Zm9yX2J1Z19pZChidWdfaWQpKQogICAgICAgIHNlbGYuYnIuc2VsZWN0X2Zvcm0obmFtZT0iY2hh
bmdlZm9ybSIpCiAgICAgICAgc2VsZi5iclsnY29tbWVudCddID0gY29tbWVudF90ZXh0CiAgICAg
ICAgc2VsZi5ici5zdWJtaXQoKQoKICAgIGRlZiBjbG9zZV9idWdfYXNfZml4ZWQoc2VsZiwgYnVn
X2lkLCBjb21tZW50X3RleHQgPSBOb25lKToKICAgICAgICBzZWxmLmF1dGhlbnRpY2F0ZSgpCgog
ICAgICAgIGxvZygiQ2xvc2luZyBidWcgJXMgYXMgZml4ZWQiICUgKGJ1Z19pZCwpKQogICAgICAg
IGlmIHNlbGYuZHJ5cnVuOgogICAgICAgICAgICBsb2coY29tbWVudF90ZXh0KQogICAgICAgICAg
ICByZXR1cm4KCiAgICAgICAgc2VsZi5ici5vcGVuKHNlbGYuYnVnX3VybF9mb3JfYnVnX2lkKGJ1
Z19pZCkpCiAgICAgICAgc2VsZi5ici5zZWxlY3RfZm9ybShuYW1lPSJjaGFuZ2Vmb3JtIikKICAg
ICAgICBpZiBjb21tZW50X3RleHQ6CiAgICAgICAgICAgIGxvZyhjb21tZW50X3RleHQpCiAgICAg
ICAgICAgIHNlbGYuYnJbJ2NvbW1lbnQnXSA9IGNvbW1lbnRfdGV4dAogICAgICAgIHNlbGYuYnJb
J2tub2InXSA9IFsncmVzb2x2ZSddCiAgICAgICAgc2VsZi5iclsncmVzb2x1dGlvbiddID0gWydG
SVhFRCddCiAgICAgICAgc2VsZi5ici5zdWJtaXQoKQoKCiMgRXZlbnR1YWxseSB3ZSdsbCBwcm9i
YWJseSBoYXZlIEdpdCBhbmQgU1ZOIHN1YmNsYXNzZXMKY2xhc3MgU0NNOgogICAgZGVmIF9faW5p
dF9fKHNlbGYsIGRyeXJ1biA9IEZhbHNlKToKICAgICAgICBzZWxmLmRyeXJ1biA9IGRyeXJ1bgog
ICAgCiAgICBkZWYgZW5zdXJlX2NsZWFuX3dvcmtpbmdfZGlyZWN0b3J5KHNlbGYpOgogICAgICAg
ICMgV2Ugc2hvdWxkIG1ha2Ugc3VyZSB0aGUgdHJlZSBpcyBjbGVhbgogICAgCiAgICAgICAgIyBI
QUNLOiBUaGlzIGlzIGRhbmdlcm91cywgYnV0IEknbSB0aGUgb25seSBvbmUgdXNpbmcgdGhpcyBz
Y3JpcHQsIHNvIGl0J3MgT0suIDspCiAgICAgICAgIyB3ZSByZWFsbHkgc2hvdWxkIHJlcXVpcmUg
YSAtLWZvcmNlIG9wdGlvbiB0byB1c2UgYSBub24tY2xlYW4gd29ya2luZyBkaXJlY3RvcnkKICAg
ICAgICBsb2coIkNsZWFuaW5nIHRoZSB3b3JraW5nIGRpcmVjdG9yeSIpCiAgICAgICAgb3Muc3lz
dGVtKCJnaXQgcmVzZXQgLS1oYXJkIHRydW5rICYmIGdpdCBjbGVhbiAtZiIpCgogICAgZGVmIHVw
ZGF0ZV93ZWJraXQoc2VsZik6CiAgICAgICAgIyBIQUNLOiB1cGRhdGUgdGhlIHRyZWUgdXNpbmcg
dXBkYXRlLXdlYmtpdCBvciBnaXQgc3ZuIHJlYmFzZQogICAgICAgIGxvZygiVXBkYXRpbmcgd29y
a2luZyBkaXJlY3RvcnkiKQogICAgICAgIG9zLnN5c3RlbSgiZ2l0IHN2biByZWJhc2UiKQogICAg
ICAgIHJldHVybiBUcnVlCgogICAgZGVmIHVwZGF0ZV9hbmRfY2xlYXJfd29ya2luZ19kaXJlY3Rv
cnkoc2VsZik6CiAgICAgICAgY2hkaXJfd2Via2l0KCkKICAgICAgICBzZWxmLmVuc3VyZV9jbGVh
bl93b3JraW5nX2RpcmVjdG9yeSgpCiAgICAgICAgc2VsZi51cGRhdGVfd2Via2l0KCkKCiAgICBk
ZWYgYXBwbHlfcGF0Y2goc2VsZiwgcGF0Y2gpOgogICAgICAgIGNoZGlyX3dlYmtpdCgpCiAgICAg
ICAgIyBJdCdzIHBvc3NpYmxlIHRoYXQgdGhlIHBhdGNoIHdhcyBub3QgbWFkZSBmcm9tIHRoZSBy
b290IGRpcmVjdG9yeQogICAgICAgICMgd2Ugc2hvdWxkIGRldGVjdCBhbmQgaGFuZGxlIHRoYXQg
Y2FzZS4KICAgICAgICByZXR1cm5fY29kZSA9IG9zLnN5c3RlbSgiY3VybCAiICsgcGF0Y2hbJ3Vy
bCddICsgIiB8IHN2bi1hcHBseSAtLXJldmlld2VyIFwiIiArIHBhdGNoWydyZXZpZXdlciddICsg
IlwiIikKICAgICAgICBpZiAocmV0dXJuX2NvZGUgIT0gMCk6CiAgICAgICAgICAgIHJhaXNlICJQ
YXRjaCAiICsgcGF0Y2hfdXJsICsgIiBmYWlsZWQgdG8gZG93bmxvYWQgYW5kIGFwcGx5LiIKCiAg
ICBkZWYgY2hhbmdlZF9maWxlcyhzZWxmKToKICAgICAgICBmaWxlX25hbWVzID0gW10KICAgICAg
ICBmb3IgbGluZSBpbiBvcy5wb3BlbignZ2l0IGRpZmYgLXIgLS1uYW1lLXN0YXR1cyAtQyAtQyAt
TScpLnJlYWRsaW5lcygpOgogICAgICAgICAgICBzdGF0dXMgPSBOb25lCiAgICAgICAgICAgIGZp
bGVfbmFtZSA9IE5vbmUKICAgICAgICAgICAgbWF0Y2ggPSByZS5zZWFyY2goJ14oW0FETV0pXHQo
LispJCcsIGxpbmUpCiAgICAgICAgICAgIGlmIG1hdGNoOgogICAgICAgICAgICAgICAgI3N0YXR1
cyA9IG1hdGNoLmdyb3VwKDEpCiAgICAgICAgICAgICAgICBmaWxlX25hbWUgPSBtYXRjaC5ncm91
cCgyKQogICAgICAgICAgICAgICAgZmlsZV9uYW1lcy5hcHBlbmQoZmlsZV9uYW1lKQogICAgICAg
IHJldHVybiBmaWxlX25hbWVzCiAgICAKICAgIGRlZiBjb21taXRfd2l0aF9tZXNzYWdlKHNlbGYs
IG1lc3NhZ2UpOgogICAgICAgICMgQ29tbWl0IGZpcnN0IHRvIGdpdAogICAgICAgIGNvbW1pdF9w
cm9jZXNzID0gc3VicHJvY2Vzcy5Qb3BlbignZ2l0IGNvbW1pdCAtYSAtRiAtJywgc3RkaW49c3Vi
cHJvY2Vzcy5QSVBFLCBzaGVsbD1UcnVlKQogICAgICAgIGNvbW1pdF9wcm9jZXNzLmNvbW11bmlj
YXRlKG1lc3NhZ2UpCgogICAgICAgICMgTm93IGNvbW1pdCB0byBzdm46CiAgICAgICAgaWYgc2Vs
Zi5kcnlydW46CiAgICAgICAgICAgIHJldHVybgogICAgICAgIGNvbW1pdF9wcm9jZXNzID0gc3Vi
cHJvY2Vzcy5Qb3BlbignZ2l0IHN2biBkY29tbWl0Jywgc3Rkb3V0PXN1YnByb2Nlc3MuUElQRSwg
c2hlbGw9VHJ1ZSkKICAgICAgICAob3V0LCBlcnJvcikgPSBjb21taXRfcHJvY2Vzcy5jb21tdW5p
Y2F0ZSgpCiAgICAgICAgcmV0dXJuX2NvZGUgPSBjb21taXRfcHJvY2Vzcy53YWl0KCkKICAgICAg
ICByZXR1cm4gb3V0CgogICAgZGVmIGNvbW1pdF9sb2NhbF9jaGFuZ2VzKHNlbGYpOgogICAgICAg
IGNvbW1pdF9tZXNzYWdlID0gY29tbWl0X21lc3NhZ2VfZm9yX3RoaXNfY29tbWl0KHNlbGYpCiAg
ICAgICAgY29tbWl0X2xvZyA9IHNlbGYuY29tbWl0X3dpdGhfbWVzc2FnZShjb21taXRfbWVzc2Fn
ZSkKICAgICAgICBjb21tZW50X3RleHQgPSBidWdfY29tbWl0X2Zyb21fY29tbWl0X3RleHQoY29t
bWl0X2xvZykKICAgICAgICByZXR1cm4gY29tbWVudF90ZXh0CgoKY2xhc3MgU2NyaXB0RXJyb3Io
RXhjZXB0aW9uKToKICAgIHBhc3MKCgpjbGFzcyBCdWd6aWxsYVRvb2w6CiAgICBkZWYgX19pbml0
X18oc2VsZik6CiAgICAgICAgc2VsZi5zY20gPSBTQ00oKQogICAgICAgIHNlbGYuYnVncyA9IEJ1
Z3ppbGxhKCkKICAgICAgICBzZWxmLmNvbW1hbmRzID0gewogICAgICAgICAgICAiYnVncy10by1j
b21taXQiIDogc2VsZi5wcmludF9idWdzX2luX2NvbW1pdF9xdWV1ZSwKICAgICAgICAgICAgInBh
dGNoZXMtdG8tY29tbWl0IiA6IHNlbGYucHJpbnRfcGF0Y2hlc19pbl9jb21taXRfcXVldWUsCiAg
ICAgICAgICAgICJyZXZpZXdlZC1wYXRjaGVzLW9uIiA6IHNlbGYucHJpbnRfcmV2aWV3ZWRfcGF0
Y2hlc19vbl9idWcsCiAgICAgICAgICAgICJhcHBseS1wYXRjaGVzLWZyb20tYnVnIjogc2VsZi5h
cHBseV9wYXRjaGVzX2Zyb21fYnVnLAogICAgICAgICAgICAiY29tbWl0LWFuZC11cGRhdGUtYnVn
Ijogc2VsZi5jb21taXRfYW5kX3VwZGF0ZV9idWcsCiAgICAgICAgICAgICJsYW5kLXBhdGNoZXMt
ZnJvbS1idWciOiBzZWxmLmxhbmRfcGF0Y2hlc19mcm9tX2J1ZywKICAgICAgICAgICAgImNvbW1p
dC1tZXNzYWdlIjogc2VsZi5wcmludF9jb21taXRfbWVzc2FnZV9mb3JfdGhpc19jb21taXQsCiAg
ICAgICAgICAgICJvYnNvbGV0ZS1hdHRhY2htZW50cy1vbi1idWciOiBzZWxmLm9ic29sZXRlX2F0
dGFjaG1lbnRzX29uX2J1ZywKICAgICAgICB9CiAgICAKICAgIGRlZiBvYnNvbGV0ZV9hdHRhY2ht
ZW50c19vbl9idWcoc2VsZiwgYXJncyk6CiAgICAgICAgYnVnX2lkID0gYXJnc1swXQogICAgICAg
IGF0dGFjaG1lbnRzID0gc2VsZi5idWdzLmZldGNoX2F0dGFjaG1lbnRzX2Zyb21fYnVnKGJ1Z19p
ZCkKICAgICAgICBmb3IgYXR0YWNobWVudCBpbiBhdHRhY2htZW50czoKICAgICAgICAgICAgaWYg
bm90IGF0dGFjaG1lbnRbJ29ic29sZXRlJ106CiAgICAgICAgICAgICAgICBzZWxmLmJ1Z3Mub2Jz
b2xldGVfYXR0YWNobWVudChhdHRhY2htZW50WydpZCddKQogICAgCiAgICBkZWYgcHJpbnRfYnVn
c19pbl9jb21taXRfcXVldWUoc2VsZiwgYXJncyk6CiAgICAgICAgYnVnX2lkcyA9IHNlbGYuYnVn
cy5mZXRjaF9idWdfaWRzX2Zyb21fY29tbWl0X3F1ZXVlKCkKICAgICAgICBmb3IgYnVnX2lkIGlu
IGJ1Z19pZHM6CiAgICAgICAgICAgIHByaW50IHNlbGYuYnVncy5idWdfdXJsX2Zvcl9idWdfaWQo
YnVnX2lkKQoKICAgIGRlZiBwcmludF9wYXRjaGVzX2luX2NvbW1pdF9xdWV1ZShzZWxmLCBhcmdz
KToKICAgICAgICBwYXRjaGVzID0gc2VsZi5idWdzLmZldGNoX3BhdGNoZXNfZnJvbV9jb21taXRf
cXVldWUoKQogICAgICAgIGxvZygiUGF0Y2hlcyBpbiBjb21taXQgcXVldWU6IikKICAgICAgICBm
b3IgcGF0Y2ggaW4gcGF0Y2hlczoKICAgICAgICAgICAgcHJpbnQgcGF0Y2hbJ3VybCddCgogICAg
ZGVmIHByaW50X3Jldmlld2VkX3BhdGNoZXNfb25fYnVnKHNlbGYsIGFyZ3MpOgogICAgICAgIGJ1
Z19pZCA9IGFyZ3NbMF0KICAgICAgICBwYXRjaGVzX3RvX2xhbmQgPSBzZWxmLmJ1Z3MuZmV0Y2hf
cmV2aWV3ZWRfcGF0Y2hlc19mcm9tX2J1ZyhidWdfaWQpCiAgICAgICAgZm9yIHBhdGNoIGluIHBh
dGNoZXNfdG9fbGFuZDoKICAgICAgICAgICAgcHJpbnQgcGF0Y2hbJ3VybCddCgogICAgZGVmIGFw
cGx5X3BhdGNoZXNfZnJvbV9idWcoc2VsZiwgYXJncyk6CiAgICAgICAgYnVnX2lkID0gYXJnc1sw
XQogICAgICAgIHBhdGNoZXMgPSBzZWxmLmJ1Z3MuZmV0Y2hfcmV2aWV3ZWRfcGF0Y2hlc19mcm9t
X2J1ZyhidWdfaWQpCiAgICAgICAgc2VsZi5zY20udXBkYXRlX2FuZF9jbGVhcl93b3JraW5nX2Rp
cmVjdG9yeSgpCiAgICAgICAgIyBTaG91bGQgd2UgZXJyb3Igb3V0IGlmIHNlbGYuc2NtIGRvZXMg
bm90IHN1cHBvcnQgbG9jYWwgY29tbWl0cz8KICAgICAgICBmb3IgcGF0Y2ggaW4gcGF0Y2hlczoK
ICAgICAgICAgICAgc2VsZi5zY20uYXBwbHlfcGF0Y2gocGF0Y2gpCgogICAgZGVmIGNvbW1pdF9h
bmRfdXBkYXRlX2J1ZyhzZWxmLCBhcmdzKToKICAgICAgICBidWdfaWQgPSBhcmdzWzBdCiAgICAg
ICAgY29tbWl0X3RleHQgPSBzZWxmLnNjbS5jb21taXRfbG9jYWxfY2hhbmdlcygpCiAgICAgICAg
c2VsZi5idWdzLmNsb3NlX2J1Z19hc19maXhlZChidWdfaWQsIGNvbW1pdF90ZXh0KQoKICAgIGRl
ZiBydW5fYW5kX3Rocm93X2lmX2ZhaWwoc2VsZiwgc2NyaXB0X25hbWUpOgogICAgICAgIGJ1aWxk
X3dlYmtpdF9wcm9jZXNzID0gc3VicHJvY2Vzcy5Qb3BlbihzY3JpcHRfbmFtZSwgc2hlbGw9VHJ1
ZSkKICAgICAgICByZXR1cm5fY29kZSA9IGJ1aWxkX3dlYmtpdF9wcm9jZXNzLndhaXQoKQogICAg
ICAgIGlmIHJldHVybl9jb2RlICE9IDA6CiAgICAgICAgICAgIHJhaXNlIFNjcmlwdEVycm9yKHNj
cmlwdF9uYW1lICsgIiBmYWlsZWQgd2l0aCBjb2RlICIgKyByZXR1cm5fY29kZSkKCiAgICBkZWYg
YnVpbGRfd2Via2l0KHNlbGYpOgogICAgICAgIHNlbGYucnVuX2FuZF90aHJvd19pZl9mYWlsKCJi
dWlsZC13ZWJraXQiKQogICAgCiAgICBkZWYgcnVuX3dlYmtpdF90ZXN0cyhzZWxmKToKICAgICAg
ICBzZWxmLnJ1bl9hbmRfdGhyb3dfaWZfZmFpbCgicnVuLXdlYmtpdC10ZXN0cyIpCgogICAgZGVm
IGxhbmRfcGF0Y2hlc19mcm9tX2J1ZyhzZWxmLCBhcmdzKToKICAgICAgICBidWdfaWQgPSBhcmdz
WzBdCgogICAgICAgIHRyeToKICAgICAgICAgICAgcGF0Y2hlcyA9IHNlbGYuYnVncy5mZXRjaF9y
ZXZpZXdlZF9wYXRjaGVzX2Zyb21fYnVnKGJ1Z19pZCkKICAgICAgICAgICAgY29tbWl0X3RleHQg
PSAiIgogICAgICAgICAgICAKICAgICAgICAgICAgZm9yIHBhdGNoIGluIHBhdGNoZXM6CiAgICAg
ICAgICAgICAgICBzZWxmLnNjbS51cGRhdGVfYW5kX2NsZWFyX3dvcmtpbmdfZGlyZWN0b3J5KCkK
ICAgICAgICAgICAgICAgIHNlbGYuc2NtLmFwcGx5X3BhdGNoKHBhdGNoKQogICAgICAgICAgICAg
ICAgc2VsZi5idWlsZF93ZWJraXQoKQogICAgICAgICAgICAgICAgIyBzZWxmLnJ1bl93ZWJraXRf
dGVzdHMoKQogICAgICAgICAgICAgICAgY29tbWl0X3RleHQgPSBzZWxmLnNjbS5jb21taXRfbG9j
YWxfY2hhbmdlcygpCiAgICAgICAgICAgICAgICAjIGlmIHdlJ3JlIGNvbW1pdGluZyBtb3JlIHRo
YW4gb25lIHBhdGNoLCB1cGRhdGUgdGhlIGJ1ZyBhcyB3ZSBnbwogICAgICAgICAgICAgICAgaWYg
bGVuKHBhdGNoZXMpID4gMToKICAgICAgICAgICAgICAgICAgICBzZWxmLmJ1Z3Mub2Jzb2xldGVf
YXR0YWNobWVudChwYXRjaFsnaWQnXSwgY29tbWl0X3RleHQpCiAgICAgICAgICAgIAogICAgICAg
ICAgICBpZiBsZW4ocGF0Y2hlcykgPiAxOgogICAgICAgICAgICAgICAgY29tbWl0X3RleHQgPSAi
QWxsIHJldmlld2VkIHBhdGNoZXMgbGFuZGVkLCBjbG9zaW5nLiIKICAgICAgICAgICAgCiAgICAg
ICAgICAgIHNlbGYuYnVncy5jbG9zZV9idWdfYXNfZml4ZWQoYnVnX2lkLCBjb21taXRfdGV4dCkK
ICAgICAgICBleGNlcHQgU2NyaXB0RXJyb3IsIGVycm9yOgogICAgICAgICAgICBwcmludCBlcnJv
cgogICAgICAgICAgICAjIFdlIGNvdWxkIGFkZCBhIGNvbW1lbnQgdG8gdGhlIGJ1ZyBhYm91dCB0
aGUgZmFpbHVyZQoKICAgIGRlZiBwcmludF9jb21taXRfbWVzc2FnZV9mb3JfdGhpc19jb21taXQo
c2VsZiwgYXJncyk6CiAgICAgICAgcHJpbnQgY29tbWl0X21lc3NhZ2VfZm9yX3RoaXNfY29tbWl0
KHNlbGYuc2NtKQogICAgCiAgICBkZWYgdXNhZ2Uoc2VsZik6CiAgICAgICAgcHJpbnQgb3MucGF0
aC5iYXNlbmFtZShzeXMuYXJndlswXSkgKyAiIFtvcHRpb25zXSBjb21tYW5kIFtjb21tYW5kLW9w
dGlvbnNdIFtjb21tYW5kLWFyZ3NdIgogICAgICAgIHByaW50ICJHbG9iYWwgT3B0aW9uczoiCiAg
ICAgICAgcHJpbnQgIiAgZHJ5LXJ1biAtLSBEbyBub3QgdG91Y2ggYW55IHJlbW90ZSBzZXJ2ZXIu
IgogICAgICAgIHByaW50CiAgICAgICAgcHJpbnQgIkNvbW1hbmRzOiIKICAgICAgICBwcmludCAi
ICAiICsgIlxuICAiLmpvaW4oc29ydGVkKHNlbGYuY29tbWFuZHMua2V5cygpKSkKICAgICAgICBz
eXMuZXhpdCgxKQoKICAgIGRlZiBwYXJzZV9nbG9iYWxfYXJncyhzZWxmLCBhcmdzKToKICAgICAg
ICBpZiBhcmdzWzBdID09ICItLWRyeS1ydW4iOgogICAgICAgICAgICBzZWxmLnNjbS5kcnlydW4g
PSBUcnVlCiAgICAgICAgICAgIHNlbGYuYnVncy5kcnlydW4gPSBUcnVlCiAgICAgICAgICAgIGFy
Z3MucG9wKDApCiAgICAKICAgIGRlZiBtYWluKHNlbGYpOgogICAgICAgIGlmIGxlbihzeXMuYXJn
dikgPCAyOgogICAgICAgICAgICBzZWxmLnVzYWdlKCkKCiAgICAgICAgIyB3ZSBjb3VsZCB3cml0
ZSBtb3JlIHNvcGhpc2l0Y2F0ZWQgb3B0aW9uIHBhcnNpbmcgc29tZSBkYXkKICAgICAgICBhcmdz
ID0gc3lzLmFyZ3ZbMTpdCiAgICAgICAgc2VsZi5wYXJzZV9nbG9iYWxfYXJncyhhcmdzKQoKICAg
ICAgICBsb2FkX2NvbmZpZygpCgogICAgICAgIGNvbW1hbmQgPSBhcmdzLnBvcCgwKQogICAgICAg
IGlmIG5vdCBjb21tYW5kIGluIHNlbGYuY29tbWFuZHM6CiAgICAgICAgICAgIGxvZyhjb21tYW5k
ICsgIiBpcyBub3QgYSB2YWxpZCBjb21tYW5kIikKICAgICAgICAgICAgdXNhZ2UoKQoKICAgICAg
ICByZXR1cm4gc2VsZi5jb21tYW5kc1tjb21tYW5kXShhcmdzKQoKCmRlZiBtYWluKCk6CiAgICB0
b29sID0gQnVnemlsbGFUb29sKCkKICAgIHJldHVybiB0b29sLm1haW4oKQoKaWYgX19uYW1lX18g
PT0gIl9fbWFpbl9fIjoKICAgIG1haW4oKQo=
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="0"
              isprivate="0"
          >
            <attachid>31480</attachid>
            <date>2009-06-17 18:24:50 -0700</date>
            <delta_ts>2009-06-18 04:20:51 -0700</delta_ts>
            <desc>bugzilla-tool -- now able to post local diffs and commits as patches</desc>
            <filename>bugzilla-tool</filename>
            <type>text/plain</type>
            <size>22403</size>
            <attacher name="Eric Seidel (no email)">eric</attacher>
            
              <data encoding="base64">IyEvdXNyL2Jpbi9weXRob24KCmltcG9ydCByZQppbXBvcnQgb3MKaW1wb3J0IHN1YnByb2Nlc3MK
aW1wb3J0IHN5cwoKIyBGb3IgQnVnemlsbGE6CmltcG9ydCBnZXRwYXNzCmltcG9ydCB1cmxsaWIy
CmZyb20gQmVhdXRpZnVsU291cCBpbXBvcnQgQmVhdXRpZnVsU291cApmcm9tIG1lY2hhbml6ZSBp
bXBvcnQgQnJvd3NlcgoKIyBEZWZhdWx0cyAodW50aWwgd2Ugc3VwcG9ydCBiZXR0ZXIgb3B0aW9u
IHBhcnNpbmcpOgpidWdfc2VydmVyID0gImh0dHBzOi8vYnVncy53ZWJraXQub3JnLyIKYnVnX2Jh
c2VfdXJsID0gYnVnX3NlcnZlciArICJzaG93X2J1Zy5jZ2k/aWQ9IgphdHRhY2htZW50X2Jhc2Vf
dXJsID0gYnVnX3NlcnZlciArICJhdHRhY2htZW50LmNnaT9pZD0iCgojIENhY2hlZCBjb25maWcs
IHRoZXNlIHNob3VsZCBtb3ZlIG9udG8gdGhlIEJ1Z3ppbGxhIG9iamVjdApjYWNoZWRfdXNlcm5h
bWUgPSBOb25lCmNhY2hlZF9wYXNzd29yZCA9IE5vbmUKCmRlZiBsb2FkX2NvbmZpZygpOgogICAg
Z2xvYmFsIGNhY2hlZF91c2VybmFtZSwgY2FjaGVkX3Bhc3N3b3JkCiAgICBjYWNoZWRfdXNlcm5h
bWUgPSByZWFkX2NvbmZpZygndXNlcm5hbWUnKQogICAgY2FjaGVkX3Bhc3N3b3JkID0gcmVhZF9j
b25maWcoJ3Bhc3N3b3JkJykKCmRlZiByZWFkX2NvbmZpZyhrZXkpOgogICAgIyBOZWVkIGEgd2F5
IHRvIHJlYWQgZnJvbSBzdm4gdG9vCiAgICBjb25maWdfcHJvY2VzcyA9IHN1YnByb2Nlc3MuUG9w
ZW4oImdpdCBjb25maWcgLS1nZXQgYnVnemlsbGEuIiArIGtleSwgc3Rkb3V0PXN1YnByb2Nlc3Mu
UElQRSwgc2hlbGw9VHJ1ZSkKICAgIHZhbHVlID0gY29uZmlnX3Byb2Nlc3MuY29tbXVuaWNhdGUo
KVswXQogICAgcmV0dXJuX2NvZGUgPSBjb25maWdfcHJvY2Vzcy53YWl0KCkKCiAgICBpZiByZXR1
cm5fY29kZSAhPSAwOgogICAgICAgIHJldHVybiBOb25lCiAgICByZXR1cm4gdmFsdWUucnN0cmlw
KCdcbicpCgojIE9uY2UgdGhpcyBpcyBpbiBXZWJLaXRUb29scyB3ZSBjYW4gZmluZCB0aGUgV2Vi
S2l0CiMgZGlyZWN0b3J5IGJ5IHdhbGtpbmcgdXAgdGhlIHBhdGgKZGVmIGNoZGlyX3dlYmtpdCgp
OgogICAgIyBXRUJLSVRfQkFTRSBpcyBhbiBlbnZpcm9ubWVudCB2YXJpYWJsZSBzcGVjaWZpYyB0
byBteSBzZXR1cAogICAgaWYgKG9zLmVudmlyb25bJ1dFQktJVF9CQVNFJ10pOgogICAgICAgIHdl
YmtpdF9kaXJlY3RvcnkgPSBvcy5lbnZpcm9uWydXRUJLSVRfQkFTRSddCiAgICBlbHNlOgogICAg
ICAgICMgZGVmYXVsdCB0byB3aGVyZSBJIG5vcm1hbGx5IHN0b3JlIFdlYktpdCBpZiB3ZSBjYW4n
dCBmaW5kIFdFQktJVF9CQVNFCiAgICAgICAgd2Via2l0X2RpcmVjdG9yeSA9ICIvVXNlcnMvZXNl
aWRlbC9Qcm9qZWN0cy9XZWJLaXQiCiAgICBvcy5jaGRpcih3ZWJraXRfZGlyZWN0b3J5KQoKCmRl
ZiBsb2coc3RyaW5nKToKICAgIHByaW50ID4+IHN5cy5zdGRlcnIsIHN0cmluZwoKCgojIDIwMDkt
MDYtMDMgIEVyaWMgU2VpZGVsICA8ZXJpY0B3ZWJraXQub3JnPgpjaGFuZ2Vsb2dfZGF0ZV9saW5l
X3JlZ2V4cCA9ICdeKFtcZFwtXSspICAoLispICA8KC4rKT4kJwoKZGVmIGxhdGVzdF9jaGFuZ2Vs
b2dfZW50cnkoY2hhbmdlbG9nX3BhdGgpOgogICAgZW50cnlfbGluZXMgPSBbXQogICAgY2hhbmdl
bG9nID0gb3BlbihjaGFuZ2Vsb2dfcGF0aCkKICAgIHRyeToKICAgICAgICBwcmludCAiUGFyc2lu
ZyBDaGFuZ2VMb2c6ICIgKyBjaGFuZ2Vsb2dfcGF0aAogICAgICAgICMgVGhlIGZpcnN0IGxpbmUg
c2hvdWxkIGJlIGEgZGF0ZSBsaW5lCiAgICAgICAgZW50cnlfbGluZXMuYXBwZW5kKGNoYW5nZWxv
Zy5yZWFkbGluZSgpKQogICAgICAgIGZvciBsaW5lIGluIGNoYW5nZWxvZzoKICAgICAgICAgICAg
IyBpZiB3ZSd2ZSBoaXQgdGhlIG5leHQgZW50cnksIHJldHVybgogICAgICAgICAgICBpZiByZS5t
YXRjaChjaGFuZ2Vsb2dfZGF0ZV9saW5lX3JlZ2V4cCwgbGluZSk6CiAgICAgICAgICAgICAgICBy
ZXR1cm4gJycuam9pbihlbnRyeV9saW5lcykKICAgICAgICAgICAgZW50cnlfbGluZXMuYXBwZW5k
KGxpbmUpCiAgICBmaW5hbGx5OgogICAgICAgICAgICBjaGFuZ2Vsb2cuY2xvc2UoKQogICAgIyBX
ZSBuZXZlciBmb3VuZCBhIGRhdGUgbGluZSEKICAgIHJldHVybiBOb25lCgpkZWYgY29tbWl0X21l
c3NhZ2VfZm9yX3RoaXNfY29tbWl0KHNjbSk6CiAgICBjaGFuZ2Vsb2dfbWVzc2FnZXMgPSBbXQog
ICAgcGF0aHMgPSBzY20uY2hhbmdlZF9maWxlcygpCiAgICBmb3IgcGF0aCBpbiBwYXRoczoKICAg
ICAgICBpZiByZS5zZWFyY2goJ0NoYW5nZUxvZycsIHBhdGgpOgogICAgICAgICAgICBjaGFuZ2Vs
b2dfZW50cnkgPSBsYXRlc3RfY2hhbmdlbG9nX2VudHJ5KHBhdGgpCiAgICAgICAgICAgIGlmIG5v
dCBjaGFuZ2Vsb2dfZW50cnk6CiAgICAgICAgICAgICAgICByYWlzZSAiRmFpbGVkIHRvIHBhcnNl
IENoYW5nZUxvZzogIiArIG9zLnBhdGguYWJzcGF0aChwYXRoKQogICAgICAgICAgICBjaGFuZ2Vs
b2dfbWVzc2FnZXMuYXBwZW5kKGNoYW5nZWxvZ19lbnRyeSkKICAgIHJldHVybiAnJy5qb2luKGNo
YW5nZWxvZ19tZXNzYWdlcykKCmRlZiBidWdfY29tbWVudF9mcm9tX2NvbW1pdF90ZXh0KGNvbW1p
dF90ZXh0KToKICAgIGNvbW1lbnRfbGluZXMgPSBbXQogICAgY29tbWl0X2xpbmVzID0gY29tbWl0
X3RleHQuc3BsaXRsaW5lcygpCiAgICBmb3IgbGluZSBpbiBjb21taXRfbGluZXM6CiAgICAgICAg
Y29tbWVudF9saW5lcy5hcHBlbmQobGluZSkKICAgICAgICBtYXRjaCA9IHJlLm1hdGNoKCJeQ29t
bWl0dGVkIHIoXGQrKSQiLCBsaW5lKQogICAgICAgIGlmIG1hdGNoOgogICAgICAgICAgICByZXZp
c2lvbiA9IG1hdGNoLmdyb3VwKDEpCiAgICAgICAgICAgIGNvbW1lbnRfbGluZXMuYXBwZW5kKCJo
dHRwOi8vdHJhYy53ZWJraXQub3JnL2NoYW5nZXNldC8iICsgcmV2aXNpb24pCiAgICAgICAgICAg
IGJyZWFrCiAgICByZXR1cm4gIlxuIi5qb2luKGNvbW1lbnRfbGluZXMpCgoKY2xhc3MgQnVnemls
bGE6CiAgICBkZWYgX19pbml0X18oc2VsZiwgZHJ5cnVuID0gRmFsc2UpOgogICAgICAgIHNlbGYu
ZHJ5cnVuID0gZHJ5cnVuCiAgICAgICAgc2VsZi5hdXRoZW50aWNhdGVkID0gRmFsc2UKICAgICAg
ICAKICAgICAgICBzZWxmLmJyID0gQnJvd3NlcigpCiAgICAgICAgIyBJZ25vcmUgYnVncy53ZWJr
aXQub3JnL3JvYm90cy50eHQgdW50aWwgd2UgZml4IGl0IHRvIGFsbG93IHRoaXMgc2NyaXB0CiAg
ICAgICAgc2VsZi5ici5zZXRfaGFuZGxlX3JvYm90cyhGYWxzZSkKCiAgICAjIFRoaXMgY291bGQg
ZXZlbnR1YWxseSBiZSBhIHRleHQgZmlsZQogICAgcmV2aWV3ZXJfdXNlcm5hbWVzX3RvX2Z1bGxf
bmFtZXMgPSB7CiAgICAgICAgImFiYXJ0aCIgOiAiQWRhbSBCYXJ0aCIsCiAgICAgICAgImFkZWxl
IiA6ICJBZGVsZSBQZXRlcnNvbiIsCiAgICAgICAgImFyaXlhLmhpZGF5YXQiIDogIkFyaXlhIEhp
ZGF5YXQiLAogICAgICAgICJkYXJpbiIgOiAiRGFyaW4gQWRsZXIiLAogICAgICAgICJkZ2xhemtv
diIgOiAiRGltaXRyaSBHbGF6a292IiwKICAgICAgICAiZXJpYyIgOiAiRXJpYyBTZWlkZWwiLAog
ICAgICAgICJkZGtpbHplciIgOiAiRGF2aWQgS2lsemVyIiwKICAgICAgICAiZmlzaGQiIDogIkRh
cmluIEZpc2hlciIsCiAgICAgICAgImducyIgOiAiR3VzdGF2byBOb3JvbmhhIiwKICAgICAgICAi
aHlhdHQiIDogIkRhdmlkIEh5YXR0IiwKICAgICAgICAiam1hbG9uem8iIDogIkphbiBBbG9uem8i
LAogICAgICAgICJsZXZpbiIgOiAiRGF2aWQgTGV2aW4iLAogICAgICAgICJtaXR6IiA6ICJEYW4g
QmVybnN0ZWluIiwKICAgICAgICAibWpzIiA6ICJNYWNpZWogU3RhY2hvdmlhayIsCiAgICAgICAg
Im1yb3dlIiA6ICJNYXJrIFJvd2UiLAogICAgICAgICJvbGl2ZXIiIDogIk9saXZlciBIdW50IiwK
ICAgICAgICAic3RhaWtvcyIgOiAiR2VvcmdlIFN0YWlrb3MiLAogICAgICAgICJ0cmVhdCIgOiAi
QWRhbSBUcmVhdCIsCiAgICAgICAgInRpbW90aHkiIDogIlRpbW90aHkgSGF0Y2hlciIsCiAgICAg
ICAgInhhbi5sb3BleiIgOiAiWGFuIExvcGV6IiwKICAgICAgICAiemVja2UiIDogIkhvbGdlciBG
cmV5dGhlciIsCiAgICB9CgogICAgZGVmIGZ1bGxfbmFtZV9mcm9tX2J1Z3ppbGxhX25hbWUoc2Vs
ZiwgYnVnemlsbGFfbmFtZSk6CiAgICAgICAgaWYgbm90IGJ1Z3ppbGxhX25hbWUgaW4gc2VsZi5y
ZXZpZXdlcl91c2VybmFtZXNfdG9fZnVsbF9uYW1lczoKICAgICAgICAgICAgcmFpc2UgRXhjZXB0
aW9uKCJFUlJPUjogVW5rbm93biByZXZpZXdlciEgIiArIGJ1Z3ppbGxhX25hbWUpCiAgICAgICAg
cmV0dXJuIHNlbGYucmV2aWV3ZXJfdXNlcm5hbWVzX3RvX2Z1bGxfbmFtZXNbYnVnemlsbGFfbmFt
ZV0KCiAgICBkZWYgYnVnX3VybF9mb3JfYnVnX2lkKHNlbGYsIGJ1Z19pZCk6CiAgICAgICAgcmV0
dXJuICIlcyVzIiAlIChidWdfYmFzZV91cmwsIGJ1Z19pZCkKICAgIAogICAgZGVmIGF0dGFjaG1l
bnRfdXJsX2Zvcl9pZChzZWxmLCBhdHRhY2htZW50X2lkLCBhY3Rpb24gPSAidmlldyIpOgogICAg
ICAgIHJldHVybiAiJXMlcyZhY3Rpb249JXMiICUgKGF0dGFjaG1lbnRfYmFzZV91cmwsIGF0dGFj
aG1lbnRfaWQsIGFjdGlvbikKCiAgICBkZWYgZmV0Y2hfYXR0YWNobWVudHNfZnJvbV9idWcoc2Vs
ZiwgYnVnX2lkKToKICAgICAgICBidWdfdXJsID0gc2VsZi5idWdfdXJsX2Zvcl9idWdfaWQoYnVn
X2lkKQogICAgICAgIGxvZygiRmV0Y2hpbmc6ICIgKyBidWdfdXJsKQoKICAgICAgICBwYWdlID0g
dXJsbGliMi51cmxvcGVuKGJ1Z191cmwpCiAgICAgICAgc291cCA9IEJlYXV0aWZ1bFNvdXAocGFn
ZSkKICAgIAogICAgICAgIGF0dGFjaG1lbnRfdGFibGUgPSBzb3VwLmZpbmQoJ3RhYmxlJywgeydj
ZWxsc3BhY2luZyc6IjAiLCAnY2VsbHBhZGRpbmcnOiI0IiwgJ2JvcmRlcic6IjEifSkKICAgIAog
ICAgICAgIGF0dGFjaG1lbnRzID0gW10KICAgICAgICAjIEdyYWIgYSBsaXN0IG9mIG5vbi1vYnNv
bGV0ZWQgcGF0Y2ggZmlsZXMgCiAgICAgICAgZm9yIGF0dGFjaG1lbnRfcm93IGluIGF0dGFjaG1l
bnRfdGFibGUuZmluZEFsbCgndHInKToKICAgICAgICAgICAgZmlyc3RfY2VsbCA9IGF0dGFjaG1l
bnRfcm93LmZpbmQoJ3RkJykKICAgICAgICAgICAgaWYgbm90IGZpcnN0X2NlbGw6CiAgICAgICAg
ICAgICAgICBjb250aW51ZSAjIFRoaXMgaXMgdGhlIGhlYWRlciwgbm8gY2VsbHMKICAgICAgICAg
ICAgaWYgZmlyc3RfY2VsbC5oYXNfa2V5KCdjb2xzcGFuJyk6CiAgICAgICAgICAgICAgICBicmVh
ayAjIHRoaXMgaXMgdGhlIGxhc3Qgcm93CiAgICAgICAgICAgIAogICAgICAgICAgICBhdHRhY2ht
ZW50ID0ge30KICAgICAgICAgICAgYXR0YWNobWVudFsnb2Jzb2xldGUnXSA9IChhdHRhY2htZW50
X3Jvdy5oYXNfa2V5KCdjbGFzcycpIGFuZCBhdHRhY2htZW50X3Jvd1snY2xhc3MnXSA9PSAiYnpf
b2Jzb2xldGUiKQogICAgICAgICAgICAKICAgICAgICAgICAgY2VsbHMgPSBhdHRhY2htZW50X3Jv
dy5maW5kQWxsKCd0ZCcpCiAgICAgICAgICAgIGF0dGFjaG1lbnRfbGluayA9IGNlbGxzWzBdLmZp
bmQoJ2EnKQogICAgICAgICAgICBhdHRhY2htZW50Wyd1cmwnXSA9IGJ1Z19zZXJ2ZXIgKyBhdHRh
Y2htZW50X2xpbmtbJ2hyZWYnXSAjIHVybHMgYXJlIHJlbGF0aXZlCiAgICAgICAgICAgIGF0dGFj
aG1lbnRbJ2lkJ10gPSBhdHRhY2htZW50Wyd1cmwnXS5zcGxpdCgnPScpWzFdICMgZS5nLiBodHRw
czovL2J1Z3Mud2Via2l0Lm9yZy9hdHRhY2htZW50LmNnaT9pZD0zMTIyMwogICAgICAgICAgICBh
dHRhY2htZW50WyduYW1lJ10gPSBhdHRhY2htZW50X2xpbmsuc3RyaW5nCiAgICAgICAgICAgICMg
YXR0YWNobWVudFsndHlwZSddID0gY2VsbHNbMV0KICAgICAgICAgICAgIyBhdHRhY2htZW50Wydk
YXRlJ10gPSBjZWxsc1syXQogICAgICAgICAgICAjIGF0dGFjaG1lbnRbJ3NpemUnXSA9IGNlbGxz
WzNdCiAgICAgICAgICAgIHJldmlld19zdGF0dXMgPSBjZWxsc1s0XQogICAgICAgICAgICAjIGFj
dGlvbl9saW5rcyA9IGNlbGxzWzVdCgogICAgICAgICAgICBpZiAoc3RyKHJldmlld19zdGF0dXMp
LmZpbmQoInJldmlldysiKSAhPSAtMSk6CiAgICAgICAgICAgICAgICByZXZpZXdlciA9IHJldmll
d19zdGF0dXMuY29udGVudHNbMF0uc3BsaXQoJzonKVswXSAjIG5hbWU6XG4gcmV2aWV3K1xuCiAg
ICAgICAgICAgICAgICByZXZpZXdlcl9mdWxsX25hbWUgPSBzZWxmLmZ1bGxfbmFtZV9mcm9tX2J1
Z3ppbGxhX25hbWUocmV2aWV3ZXIpCiAgICAgICAgICAgICAgICBhdHRhY2htZW50WydyZXZpZXdl
ciddID0gcmV2aWV3ZXJfZnVsbF9uYW1lCgogICAgICAgICAgICBhdHRhY2htZW50cy5hcHBlbmQo
YXR0YWNobWVudCkKICAgICAgICByZXR1cm4gYXR0YWNobWVudHMKCiAgICBkZWYgZmV0Y2hfcmV2
aWV3ZWRfcGF0Y2hlc19mcm9tX2J1ZyhzZWxmLCBidWdfaWQpOgogICAgICAgIHJldmlld2VkX3Bh
dGNoZXMgPSBbXQogICAgICAgIGZvciBhdHRhY2htZW50IGluIHNlbGYuZmV0Y2hfYXR0YWNobWVu
dHNfZnJvbV9idWcoYnVnX2lkKToKICAgICAgICAgICAgaWYgJ3Jldmlld2VyJyBpbiBhdHRhY2ht
ZW50IGFuZCBub3QgYXR0YWNobWVudFsnb2Jzb2xldGUnXToKICAgICAgICAgICAgICAgIHJldmll
d2VkX3BhdGNoZXMuYXBwZW5kKGF0dGFjaG1lbnQpCiAgICAgICAgcmV0dXJuIHJldmlld2VkX3Bh
dGNoZXMKCiAgICBkZWYgZmV0Y2hfYnVnX2lkc19mcm9tX2NvbW1pdF9xdWV1ZShzZWxmKToKICAg
ICAgICB1bmFzc2lnbmVkX29ubHkgPSAiJmVtYWlsYXNzaWduZWRfdG8xPTEmZW1haWx0eXBlMT1z
dWJzdHJpbmcmZW1haWwxPXVuYXNzaWduZWQiCiAgICAgICAgY29tbWl0X3F1ZXVlX3VybCA9ICJo
dHRwczovL2J1Z3Mud2Via2l0Lm9yZy9idWdsaXN0LmNnaT9xdWVyeV9mb3JtYXQ9YWR2YW5jZWQm
YnVnX3N0YXR1cz1VTkNPTkZJUk1FRCZidWdfc3RhdHVzPU5FVyZidWdfc3RhdHVzPUFTU0lHTkVE
JmJ1Z19zdGF0dXM9UkVPUEVORUQmZmllbGQwLTAtMD1mbGFndHlwZXMubmFtZSZ0eXBlMC0wLTA9
ZXF1YWxzJnZhbHVlMC0wLTA9cmV2aWV3JTJCIgogICAgICAgIGxvZygiTG9hZGluZyBjb21taXQg
cXVldWUiKQoKICAgICAgICBwYWdlID0gdXJsbGliMi51cmxvcGVuKGNvbW1pdF9xdWV1ZV91cmwp
CiAgICAgICAgc291cCA9IEJlYXV0aWZ1bFNvdXAocGFnZSkKICAgIAogICAgICAgIGJ1Z19pZHMg
PSBbXQogICAgICAgICMgR3JhYiB0aGUgY2VsbHMgaW4gdGhlIGZpcnN0IGNvbHVtbiAod2hpY2gg
aGFwcGVucyB0byBiZSB0aGUgYnVnIGlkcykKICAgICAgICBmb3IgYnVnX2xpbmtfY2VsbCBpbiBz
b3VwKCd0ZCcsICJmaXJzdC1jaGlsZCIpOiAjIHRkcyB3aXRoIHRoZSBjbGFzcyAiZmlyc3QtY2hp
bGQiCiAgICAgICAgICAgIGJ1Z19saW5rID0gYnVnX2xpbmtfY2VsbC5maW5kKCJhIikKICAgICAg
ICAgICAgYnVnX2lkcy5hcHBlbmQoYnVnX2xpbmsuc3RyaW5nKSAjIHRoZSBjb250ZW50cyBoYXBw
ZW4gdG8gYmUgdGhlIGJ1ZyBpZAogICAgCiAgICAgICAgcmV0dXJuIGJ1Z19pZHMKCiAgICBkZWYg
ZmV0Y2hfcGF0Y2hlc19mcm9tX2NvbW1pdF9xdWV1ZShzZWxmKToKICAgICAgICBwYXRjaGVzX3Rv
X2xhbmQgPSBbXQogICAgICAgIGZvciBidWdfaWQgaW4gc2VsZi5mZXRjaF9idWdfaWRzX2Zyb21f
Y29tbWl0X3F1ZXVlKCk6CiAgICAgICAgICAgIHBhdGNoZXMgPSBzZWxmLmZldGNoX3Jldmlld2Vk
X3BhdGNoZXNfZnJvbV9idWcoYnVnX2lkKQogICAgICAgICAgICBwYXRjaGVzX3RvX2xhbmQuZXh0
ZW5kKHBhdGNoZXMpCiAgICAgICAgcmV0dXJuIHBhdGNoZXNfdG9fbGFuZAoKICAgIGRlZiBhdXRo
ZW50aWNhdGUoc2VsZiwgdXNlcm5hbWUgPSBOb25lLCBwYXNzd29yZCA9IE5vbmUpOgogICAgICAg
IGlmIChzZWxmLmF1dGhlbnRpY2F0ZWQpOgogICAgICAgICAgICByZXR1cm4KICAgICAgICAKICAg
ICAgICBnbG9iYWwgY2FjaGVkX3VzZXJuYW1lLCBjYWNoZWRfcGFzc3dvcmQKICAgICAgICBpZiBu
b3QgdXNlcm5hbWU6CiAgICAgICAgICAgIGlmIGNhY2hlZF91c2VybmFtZToKICAgICAgICAgICAg
ICAgIHVzZXJuYW1lID0gY2FjaGVkX3VzZXJuYW1lCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAg
ICAgICAgICB1c2VybmFtZSA9IGNhY2hlZF91c2VybmFtZSA9IHJhd19pbnB1dCgiQnVnemlsbGEg
bG9naW46ICIpCiAgICAgICAgaWYgbm90IHBhc3N3b3JkOgogICAgICAgICAgICBpZiBjYWNoZWRf
cGFzc3dvcmQ6CiAgICAgICAgICAgICAgICBwYXNzd29yZCA9IGNhY2hlZF9wYXNzd29yZAogICAg
ICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgcGFzc3dvcmQgPSBjYWNoZWRfcGFzc3dvcmQg
PSBnZXRwYXNzLmdldHBhc3MoIkJ1Z3ppbGxhIHBhc3N3b3JkOiAiKQoKICAgICAgICBsb2coIkxv
Z2dpbmcgaW4gYXMgJXMuLi4iICUgKHVzZXJuYW1lLCkpCiAgICAgICAgaWYgc2VsZi5kcnlydW46
CiAgICAgICAgICAgIHJldHVybgogICAgICAgIHNlbGYuYnIub3BlbihidWdfc2VydmVyICsgIi9p
bmRleC5jZ2k/R29BaGVhZEFuZExvZ0luPTEiKQogICAgICAgIHNlbGYuYnIuc2VsZWN0X2Zvcm0o
bmFtZT0ibG9naW4iKQogICAgICAgIHNlbGYuYnJbJ0J1Z3ppbGxhX2xvZ2luJ10gPSB1c2VybmFt
ZQogICAgICAgIHNlbGYuYnJbJ0J1Z3ppbGxhX3Bhc3N3b3JkJ10gPSBwYXNzd29yZAogICAgICAg
IHNlbGYuYnIuc3VibWl0KCkKICAgICAgICAKICAgICAgICAjIFdlIHJlYWxseSBzaG91bGQgY2hl
Y2sgdGhlIHJlc3VsdCBjb2RlcwogICAgICAgIHNlbGYuYXV0aGVudGljYXRlZCA9IFRydWUKCiAg
ICBkZWYgYWRkX3BhdGNoX3RvX2J1ZyhzZWxmLCBidWdfaWQsIHBhdGNoX2ZpbGVfb2JqZWN0LCBk
ZXNjcmlwdGlvbiwgY29tbWVudF90ZXh0ID0gTm9uZSwgbWFya19mb3JfcmV2aWV3ID0gRmFsc2Up
OgogICAgICAgIHNlbGYuYXV0aGVudGljYXRlKCkKICAgICAgICAKICAgICAgICBsb2coIkFkZGlu
ZyBwYXRjaCBcIiVzXCIgdG8gYnVnICVzIiAlIChkZXNjcmlwdGlvbiwgYnVnX2lkKSkKICAgICAg
ICBpZiBzZWxmLmRyeXJ1bjoKICAgICAgICAgICAgbG9nKGNvbW1lbnRfdGV4dCkKICAgICAgICAg
ICAgcmV0dXJuCiAgICAgICAgCiAgICAgICAgc2VsZi5ici5vcGVuKGJ1Z19zZXJ2ZXIgKyAiL2F0
dGFjaG1lbnQuY2dpP2FjdGlvbj1lbnRlciZidWdpZD0iICsgYnVnX2lkKQogICAgICAgIHNlbGYu
YnIuc2VsZWN0X2Zvcm0obmFtZT0iZW50cnlmb3JtIikgICAgICAgIAogICAgICAgIHNlbGYuYnJb
J2Rlc2NyaXB0aW9uJ10gPSBkZXNjcmlwdGlvbgogICAgICAgIHNlbGYuYnJbJ2lzcGF0Y2gnXSA9
ICgiMSIsKQogICAgICAgIGlmIChjb21tZW50X3RleHQpOgogICAgICAgICAgICBsb2coY29tbWVu
dF90ZXh0KQogICAgICAgICAgICBzZWxmLmJyWydjb21tZW50J10gPSBjb21tZW50X3RleHQKICAg
ICAgICBzZWxmLmJyWydmbGFnX3R5cGUtMSddID0gKCc/JywpIGlmIG1hcmtfZm9yX3JldmlldyBl
bHNlICgnWCcsKQogICAgICAgIHNlbGYuYnIuYWRkX2ZpbGUocGF0Y2hfZmlsZV9vYmplY3QsICJ0
ZXh0L3BsYWluIiwgImJ1Z3ppbGxhX3JlcXVpcmVzX2FfZmlsZW5hbWUucGF0Y2giKQogICAgICAg
IHNlbGYuYnIuc3VibWl0KCkKCiAgICBkZWYgb2Jzb2xldGVfYXR0YWNobWVudChzZWxmLCBhdHRh
Y2htZW50X2lkLCBjb21tZW50X3RleHQgPSBOb25lKToKICAgICAgICBzZWxmLmF1dGhlbnRpY2F0
ZSgpCgogICAgICAgIGxvZygiT2Jzb2xldGluZyBhdHRhY2htZW50OiAlcyIgJSAoYXR0YWNobWVu
dF9pZCwpKQogICAgICAgIGlmIHNlbGYuZHJ5cnVuOgogICAgICAgICAgICBsb2coY29tbWVudF90
ZXh0KQogICAgICAgICAgICByZXR1cm4KCiAgICAgICAgc2VsZi5ici5vcGVuKHNlbGYuYXR0YWNo
bWVudF91cmxfZm9yX2lkKGF0dGFjaG1lbnRfaWQsICdlZGl0JykpCiAgICAgICAgc2VsZi5ici5z
ZWxlY3RfZm9ybShucj0wKQogICAgICAgIHNlbGYuYnIuZmluZF9jb250cm9sKCdpc29ic29sZXRl
JykuaXRlbXNbMF0uc2VsZWN0ZWQgPSBUcnVlCiAgICAgICAgIyBBbHNvIGNsZWFyIGFueSByZXZp
ZXcgZmxhZyAodG8gcmVtb3ZlIGl0IGZyb20gcmV2aWV3L2NvbW1pdCBxdWV1ZXMpCiAgICAgICAg
c2VsZi5ici5maW5kX2NvbnRyb2wodHlwZT0nc2VsZWN0JywgbnI9MCkudmFsdWUgPSAoIlgiLCkK
ICAgICAgICBpZiBjb21tZW50X3RleHQ6CiAgICAgICAgICAgIGxvZyhjb21tZW50X3RleHQpCiAg
ICAgICAgICAgIHNlbGYuYnJbJ2NvbW1lbnQnXSA9IGNvbW1lbnRfdGV4dAogICAgICAgIHNlbGYu
YnIuc3VibWl0KCkKICAgIAogICAgZGVmIHBvc3RfY29tbWVudF90b19idWcoc2VsZiwgYnVnX2lk
LCBjb21tZW50X3RleHQpOgogICAgICAgIHNlbGYuYXV0aGVudGljYXRlKCkKCiAgICAgICAgbG9n
KCJBZGRpbmcgY29tbWVudCB0byBidWcgJXMiICUgKGJ1Z19pZCwpKQogICAgICAgIGlmIHNlbGYu
ZHJ5cnVuOgogICAgICAgICAgICBsb2coY29tbWVudF90ZXh0KQogICAgICAgICAgICByZXR1cm4K
CiAgICAgICAgc2VsZi5ici5vcGVuKHNlbGYuYnVnX3VybF9mb3JfYnVnX2lkKGJ1Z19pZCkpCiAg
ICAgICAgc2VsZi5ici5zZWxlY3RfZm9ybShuYW1lPSJjaGFuZ2Vmb3JtIikKICAgICAgICBzZWxm
LmJyWydjb21tZW50J10gPSBjb21tZW50X3RleHQKICAgICAgICBzZWxmLmJyLnN1Ym1pdCgpCgog
ICAgZGVmIGNsb3NlX2J1Z19hc19maXhlZChzZWxmLCBidWdfaWQsIGNvbW1lbnRfdGV4dCA9IE5v
bmUpOgogICAgICAgIHNlbGYuYXV0aGVudGljYXRlKCkKCiAgICAgICAgbG9nKCJDbG9zaW5nIGJ1
ZyAlcyBhcyBmaXhlZCIgJSAoYnVnX2lkLCkpCiAgICAgICAgaWYgc2VsZi5kcnlydW46CiAgICAg
ICAgICAgIGxvZyhjb21tZW50X3RleHQpCiAgICAgICAgICAgIHJldHVybgoKICAgICAgICBzZWxm
LmJyLm9wZW4oc2VsZi5idWdfdXJsX2Zvcl9idWdfaWQoYnVnX2lkKSkKICAgICAgICBzZWxmLmJy
LnNlbGVjdF9mb3JtKG5hbWU9ImNoYW5nZWZvcm0iKQogICAgICAgIGlmIGNvbW1lbnRfdGV4dDoK
ICAgICAgICAgICAgbG9nKGNvbW1lbnRfdGV4dCkKICAgICAgICAgICAgc2VsZi5iclsnY29tbWVu
dCddID0gY29tbWVudF90ZXh0CiAgICAgICAgc2VsZi5iclsna25vYiddID0gWydyZXNvbHZlJ10K
ICAgICAgICBzZWxmLmJyWydyZXNvbHV0aW9uJ10gPSBbJ0ZJWEVEJ10KICAgICAgICBzZWxmLmJy
LnN1Ym1pdCgpCgoKIyBFdmVudHVhbGx5IHdlJ2xsIHByb2JhYmx5IGhhdmUgR2l0IGFuZCBTVk4g
c3ViY2xhc3NlcyBvZiBzb21lIFNDTSBjbGFzcwpjbGFzcyBHaXQ6CiAgICBkZWYgX19pbml0X18o
c2VsZiwgZHJ5cnVuID0gRmFsc2UpOgogICAgICAgIHNlbGYuZHJ5cnVuID0gZHJ5cnVuCiAgICAK
ICAgIGRlZiBlbnN1cmVfY2xlYW5fd29ya2luZ19kaXJlY3Rvcnkoc2VsZik6CiAgICAgICAgIyBX
ZSBzaG91bGQgbWFrZSBzdXJlIHRoZSB0cmVlIGlzIGNsZWFuCiAgICAKICAgICAgICAjIEhBQ0s6
IFRoaXMgaXMgZGFuZ2Vyb3VzLCBidXQgSSdtIHRoZSBvbmx5IG9uZSB1c2luZyB0aGlzIHNjcmlw
dCwgc28gaXQncyBPSy4gOykKICAgICAgICAjIHdlIHJlYWxseSBzaG91bGQgcmVxdWlyZSBhIC0t
Zm9yY2Ugb3B0aW9uIHRvIHVzZSBhIG5vbi1jbGVhbiB3b3JraW5nIGRpcmVjdG9yeQogICAgICAg
IGxvZygiQ2xlYW5pbmcgdGhlIHdvcmtpbmcgZGlyZWN0b3J5IikKICAgICAgICBvcy5zeXN0ZW0o
ImdpdCByZXNldCAtLWhhcmQgdHJ1bmsgJiYgZ2l0IGNsZWFuIC1mIikKCiAgICBkZWYgdXBkYXRl
X3dlYmtpdChzZWxmKToKICAgICAgICAjIEhBQ0s6IHVwZGF0ZSB0aGUgdHJlZSB1c2luZyB1cGRh
dGUtd2Via2l0IG9yIGdpdCBzdm4gcmViYXNlCiAgICAgICAgbG9nKCJVcGRhdGluZyB3b3JraW5n
IGRpcmVjdG9yeSIpCiAgICAgICAgb3Muc3lzdGVtKCJnaXQgc3ZuIHJlYmFzZSIpCiAgICAgICAg
cmV0dXJuIFRydWUKCiAgICBkZWYgdXBkYXRlX2FuZF9jbGVhcl93b3JraW5nX2RpcmVjdG9yeShz
ZWxmKToKICAgICAgICBjaGRpcl93ZWJraXQoKQogICAgICAgIHNlbGYuZW5zdXJlX2NsZWFuX3dv
cmtpbmdfZGlyZWN0b3J5KCkKICAgICAgICBzZWxmLnVwZGF0ZV93ZWJraXQoKQoKICAgIGRlZiBh
cHBseV9wYXRjaChzZWxmLCBwYXRjaCk6CiAgICAgICAgY2hkaXJfd2Via2l0KCkKICAgICAgICAj
IEl0J3MgcG9zc2libGUgdGhhdCB0aGUgcGF0Y2ggd2FzIG5vdCBtYWRlIGZyb20gdGhlIHJvb3Qg
ZGlyZWN0b3J5CiAgICAgICAgIyB3ZSBzaG91bGQgZGV0ZWN0IGFuZCBoYW5kbGUgdGhhdCBjYXNl
LgogICAgICAgIHJldHVybl9jb2RlID0gb3Muc3lzdGVtKCJjdXJsICIgKyBwYXRjaFsndXJsJ10g
KyAiIHwgc3ZuLWFwcGx5IC0tcmV2aWV3ZXIgXCIiICsgcGF0Y2hbJ3Jldmlld2VyJ10gKyAiXCIi
KQogICAgICAgIGlmIChyZXR1cm5fY29kZSAhPSAwKToKICAgICAgICAgICAgcmFpc2UgIlBhdGNo
ICIgKyBwYXRjaF91cmwgKyAiIGZhaWxlZCB0byBkb3dubG9hZCBhbmQgYXBwbHkuIgoKICAgIGRl
ZiBjaGFuZ2VkX2ZpbGVzKHNlbGYpOgogICAgICAgIGZpbGVfbmFtZXMgPSBbXQogICAgICAgIGZv
ciBsaW5lIGluIG9zLnBvcGVuKCdnaXQgZGlmZiAtciAtLW5hbWUtc3RhdHVzIC1DIC1DIC1NJyku
cmVhZGxpbmVzKCk6CiAgICAgICAgICAgIHN0YXR1cyA9IE5vbmUKICAgICAgICAgICAgZmlsZV9u
YW1lID0gTm9uZQogICAgICAgICAgICBtYXRjaCA9IHJlLnNlYXJjaCgnXihbQURNXSlcdCguKykk
JywgbGluZSkKICAgICAgICAgICAgaWYgbWF0Y2g6CiAgICAgICAgICAgICAgICAjc3RhdHVzID0g
bWF0Y2guZ3JvdXAoMSkKICAgICAgICAgICAgICAgIGZpbGVfbmFtZSA9IG1hdGNoLmdyb3VwKDIp
CiAgICAgICAgICAgICAgICBmaWxlX25hbWVzLmFwcGVuZChmaWxlX25hbWUpCiAgICAgICAgcmV0
dXJuIGZpbGVfbmFtZXMKICAgIAogICAgZGVmIGNvbW1pdF93aXRoX21lc3NhZ2Uoc2VsZiwgbWVz
c2FnZSk6CiAgICAgICAgIyBDb21taXQgZmlyc3QgdG8gZ2l0CiAgICAgICAgY29tbWl0X3Byb2Nl
c3MgPSBzdWJwcm9jZXNzLlBvcGVuKCdnaXQgY29tbWl0IC1hIC1GIC0nLCBzdGRpbj1zdWJwcm9j
ZXNzLlBJUEUsIHNoZWxsPVRydWUpCiAgICAgICAgY29tbWl0X3Byb2Nlc3MuY29tbXVuaWNhdGUo
bWVzc2FnZSkKCiAgICAgICAgIyBOb3cgY29tbWl0IHRvIHN2bjoKICAgICAgICBpZiBzZWxmLmRy
eXJ1bjoKICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgY29tbWl0X3Byb2Nlc3MgPSBzdWJwcm9j
ZXNzLlBvcGVuKCdnaXQgc3ZuIGRjb21taXQnLCBzdGRvdXQ9c3VicHJvY2Vzcy5QSVBFLCBzaGVs
bD1UcnVlKQogICAgICAgIChvdXQsIGVycm9yKSA9IGNvbW1pdF9wcm9jZXNzLmNvbW11bmljYXRl
KCkKICAgICAgICByZXR1cm5fY29kZSA9IGNvbW1pdF9wcm9jZXNzLndhaXQoKQogICAgICAgIHJl
dHVybiBvdXQKCiAgICBkZWYgY29tbWl0X2lkc19mcm9tX3JhbmdlX2FyZ3VtZW50cyhzZWxmLCBh
cmdzLCBjaGVycnlfcGljayA9IEZhbHNlKToKICAgICAgICAjIEZpcnN0IGdldCB0aGUgY29tbWl0
LWlkcyBmb3IgdGhlIHBhc3NlZCBpbiByZXZpc2lvbnMKICAgICAgICByZXZfcGFyc2VfYXJncyA9
IFsnZ2l0JywgJ3Jldi1wYXJzZScsICctLXJldnMtb25seSddCiAgICAgICAgcmV2X3BhcnNlX2Fy
Z3MuZXh0ZW5kKGFyZ3MpCiAgICAgICAgcmV2X3BhcnNlX3Byb2Nlc3MgPSBzdWJwcm9jZXNzLlBv
cGVuKCIgIi5qb2luKHJldl9wYXJzZV9hcmdzKSwgc3Rkb3V0PXN1YnByb2Nlc3MuUElQRSwgc2hl
bGw9VHJ1ZSkKICAgICAgICByZXZpc2lvbnMgPSByZXZfcGFyc2VfcHJvY2Vzcy5jb21tdW5pY2F0
ZSgpWzBdLnNwbGl0bGluZXMoKQogICAgICAgIAogICAgICAgIGlmIGNoZXJyeV9waWNrOgogICAg
ICAgICAgICByZXR1cm4gcmV2aXNpb25zCiAgICAgICAgCiAgICAgICAgIyBJZiBub3QgY2hlcnJ5
LXBpY2tpbmcgYW5kIG9ubHkgcGFzc2VkIG9uZSByZXZpc2lvbiwgYXNzdW1lICJecmV2aXNpb24g
aGVhZCIgYWthICJyZXZpc2lvbi4uaGVhZCIKICAgICAgICBpZiBsZW4ocmV2aXNpb25zKSA8IDI6
CiAgICAgICAgICAgIHJldmlzaW9uc1swXSA9ICJeIiArIHJldmlzaW9uc1swXQogICAgICAgICAg
ICByZXZpc2lvbnMuYXBwZW5kKCJoZWFkIikKICAgICAgICAKICAgICAgICByZXZfbGlzdF9hcmdz
ID0gWydnaXQnLCAncmV2LWxpc3QnXQogICAgICAgIHJldl9saXN0X2FyZ3MuZXh0ZW5kKHJldmlz
aW9ucykKICAgICAgICByZXZfbGlzdF9wcm9jZXNzID0gc3VicHJvY2Vzcy5Qb3BlbigiICIuam9p
bihyZXZfbGlzdF9hcmdzKSwgc3Rkb3V0PXN1YnByb2Nlc3MuUElQRSwgc2hlbGw9VHJ1ZSkKICAg
ICAgICByZXR1cm4gcmV2X2xpc3RfcHJvY2Vzcy5jb21tdW5pY2F0ZSgpWzBdLnNwbGl0bGluZXMo
KQoKICAgIGRlZiBzaG93X2RpZmZfY29tbWFuZF9mb3JfY29tbWl0KHNlbGYsIGNvbW1pdF9pZCk6
CiAgICAgICAgcmV0dXJuICJnaXQgZGlmZi10cmVlIC1wICIgKyBjb21taXRfaWQKCiAgICBkZWYg
ZmlsZXNfY2hhbmdlZF9zdW1tYXJ5X2Zvcl9jb21taXQoc2VsZiwgY29tbWl0X2lkKToKICAgICAg
ICByZXR1cm4gc3VicHJvY2Vzcy5Qb3BlbigiZ2l0IGRpZmYtdHJlZSAtLXNob3J0c3RhdCAtLW5v
LWNvbW1pdC1pZCAiICsgY29tbWl0X2lkLCBzdGRvdXQ9c3VicHJvY2Vzcy5QSVBFLCBzaGVsbD1U
cnVlKS5jb21tdW5pY2F0ZSgpWzBdCiAgICAKICAgIGRlZiBzdXBwb3J0c19sb2NhbF9jb21taXRz
KHNlbGYpOgogICAgICAgIHJldHVybiBUcnVlCiAgICAKICAgIGRlZiBkaXNwbGF5X25hbWUoc2Vs
Zik6CiAgICAgICAgcmV0dXJuICJnaXQiCgogICAgZGVmIGRpZmZfY29tbWFuZChzZWxmKToKICAg
ICAgICByZXR1cm4gImdpdCBkaWZmIGhlYWQiCgogICAgZGVmIGNvbW1pdF9sb2NhbF9jaGFuZ2Vz
KHNlbGYpOgogICAgICAgIGNvbW1pdF9tZXNzYWdlID0gY29tbWl0X21lc3NhZ2VfZm9yX3RoaXNf
Y29tbWl0KHNlbGYpCiAgICAgICAgY29tbWl0X2xvZyA9IHNlbGYuY29tbWl0X3dpdGhfbWVzc2Fn
ZShjb21taXRfbWVzc2FnZSkKICAgICAgICBjb21tZW50X3RleHQgPSBidWdfY29tbWVudF9mcm9t
X2NvbW1pdF90ZXh0KGNvbW1pdF9sb2cpCiAgICAgICAgcmV0dXJuIGNvbW1lbnRfdGV4dAoKY2xh
c3MgU2NyaXB0RXJyb3IoRXhjZXB0aW9uKToKICAgIHBhc3MKCgpjbGFzcyBCdWd6aWxsYVRvb2w6
CiAgICBkZWYgX19pbml0X18oc2VsZik6CiAgICAgICAgc2VsZi5zY20gPSBHaXQoKQogICAgICAg
IHNlbGYuYnVncyA9IEJ1Z3ppbGxhKCkKICAgICAgICBzZWxmLmNvbW1hbmRzID0gewogICAgICAg
ICAgICAiYnVncy10by1jb21taXQiIDogc2VsZi5wcmludF9idWdzX2luX2NvbW1pdF9xdWV1ZSwK
ICAgICAgICAgICAgInBhdGNoZXMtdG8tY29tbWl0IiA6IHNlbGYucHJpbnRfcGF0Y2hlc19pbl9j
b21taXRfcXVldWUsCiAgICAgICAgICAgICJyZXZpZXdlZC1wYXRjaGVzLW9uIiA6IHNlbGYucHJp
bnRfcmV2aWV3ZWRfcGF0Y2hlc19vbl9idWcsCiAgICAgICAgICAgICJhcHBseS1wYXRjaGVzLWZy
b20tYnVnIjogc2VsZi5hcHBseV9wYXRjaGVzX2Zyb21fYnVnLAogICAgICAgICAgICAiY29tbWl0
LWFuZC11cGRhdGUtYnVnIiA6IHNlbGYuY29tbWl0X2FuZF91cGRhdGVfYnVnLAogICAgICAgICAg
ICAibGFuZC1wYXRjaGVzLWZyb20tYnVnIiA6IHNlbGYubGFuZF9wYXRjaGVzX2Zyb21fYnVnLAog
ICAgICAgICAgICAiY29tbWl0LW1lc3NhZ2UiIDogc2VsZi5wcmludF9jb21taXRfbWVzc2FnZV9m
b3JfdGhpc19jb21taXQsCiAgICAgICAgICAgICJvYnNvbGV0ZS1hdHRhY2htZW50cy1vbi1idWci
IDogc2VsZi5vYnNvbGV0ZV9hdHRhY2htZW50c19vbl9idWcsCiAgICAgICAgICAgICJwb3N0LWRp
ZmYiIDogc2VsZi5wb3N0X2RpZmZfdG9fYnVnLAogICAgICAgICAgICAicG9zdC1jb21taXRzIiA6
IHNlbGYucG9zdF9jb21taXRzX3RvX2J1ZywKICAgICAgICB9CiAgICAKICAgIGRlZiBjb21taXRf
bWVzc2FnZV9mb3JfY29tbWl0KHNlbGYsIGNvbW1pdF9pZCA9ICJoZWFkIik6CiAgICAgICAgY29t
bWl0X21lc3NhZ2VfcHJvY2VzcyA9IHN1YnByb2Nlc3MuUG9wZW4oImdpdCBjYXQtZmlsZSBjb21t
aXQgIiArIGNvbW1pdF9pZCwgc3Rkb3V0PXN1YnByb2Nlc3MuUElQRSwgc2hlbGw9VHJ1ZSkKICAg
ICAgICBjb21taXRfbWVzc2FnZSA9IGNvbW1pdF9tZXNzYWdlX3Byb2Nlc3MuY29tbXVuaWNhdGUo
KVswXQogICAgICAgIGNvbW1pdF9saW5lcyA9IGNvbW1pdF9tZXNzYWdlLnNwbGl0bGluZXMoKQog
ICAgICAgIAogICAgICAgICMgc2tpcCB0aGUgaGVhZGVycwogICAgICAgIGZpcnN0X2xpbmVfYWZ0
ZXJfaGVhZGVycyA9IDAKICAgICAgICBmb3IgbGluZSBpbiBjb21taXRfbGluZXM6CiAgICAgICAg
ICAgIGZpcnN0X2xpbmVfYWZ0ZXJfaGVhZGVycyArPSAxCiAgICAgICAgICAgIGlmIGxpbmUgPT0g
IiI6CiAgICAgICAgICAgICAgICBicmVhawogICAgICAgIHJldHVybiAiXG4iLmpvaW4oY29tbWl0
X2xpbmVzW2ZpcnN0X2xpbmVfYWZ0ZXJfaGVhZGVyczpdKQogICAgCiAgICBkZWYgcG9zdF9kaWZm
X3RvX2J1ZyhzZWxmLCBhcmdzKToKICAgICAgICBidWdfaWQgPSBhcmdzWzBdCiAgICAgICAgZGVz
Y3JpcHRpb24gPSBhcmdzWzFdCiAgICAgICAgIyBOZWVkIGFyZyBwYXJzaW5nIQogICAgICAgIAog
ICAgICAgIGRpZmZfcHJvY2VzcyA9IHN1YnByb2Nlc3MuUG9wZW4oc2VsZi5zY20uZGlmZl9jb21t
YW5kKCksIHN0ZG91dD1zdWJwcm9jZXNzLlBJUEUsIHNoZWxsPVRydWUpCiAgICAgICAgCiAgICAg
ICAgc2VsZi5idWdzLmFkZF9wYXRjaF90b19idWcoYnVnX2lkLCBkaWZmX3Byb2Nlc3Muc3Rkb3V0
LCBkZXNjcmlwdGlvbiwgbWFya19mb3JfcmV2aWV3PVRydWUpCiAgICAKICAgIGRlZiBwb3N0X2Nv
bW1pdHNfdG9fYnVnKHNlbGYsIGFyZ3MpOgogICAgICAgIGJ1Z19pZCA9IGFyZ3NbMF0KICAgICAg
ICAKICAgICAgICBpZiBub3Qgc2VsZi5zY20uc3VwcG9ydHNfbG9jYWxfY29tbWl0cygpOgogICAg
ICAgICAgICBsb2coc2VsZi5zY20uZGlzcGxheV9uYW1lKCkgKyAiIGRvZXMgbm90IHN1cHBvcnQg
bG9jYWwgY29tbWl0cy4iKQogICAgICAgICAgICBleGl0KDEpCiAgICAgICAgCiAgICAgICAgY29t
bWl0X2lkcyA9IHNlbGYuc2NtLmNvbW1pdF9pZHNfZnJvbV9yYW5nZV9hcmd1bWVudHMoYXJnc1sx
Ol0pCiAgICAgICAgCiAgICAgICAgaWYgbGVuKGNvbW1pdF9pZHMpID4gMTA6CiAgICAgICAgICAg
IGxvZygiQXJlIHlvdSBzdXJlIHlvdSB3YW50IHRvIGF0dGFjaCAlZCBwYXRjaGVzIHRvIGJ1ZyAl
cz8iICUgKGxlbihjb21taXRfaWRzKSwgYnVnX2lkKSkKICAgICAgICAgICAgIyBTaG91bGQgc3Vw
cG9ydCBhIC0tZm9yY2Ugb3B0aW9uCiAgICAgICAgICAgIGV4aXQoMSkKICAgICAgICAKICAgICAg
ICBsb2coIkF0dGFjaGluZyAlZCBjb21taXRzIGFzIHBhdGNoZXMgdG8gYnVnICVzIiAlIChsZW4o
Y29tbWl0X2lkcyksIGJ1Z19pZCkpCiAgICAgICAgZm9yIGNvbW1pdF9pZCBpbiBjb21taXRfaWRz
OgogICAgICAgICAgICBjb21taXRfbWVzc2FnZSA9IHNlbGYuY29tbWl0X21lc3NhZ2VfZm9yX2Nv
bW1pdChjb21taXRfaWQpCiAgICAgICAgICAgIGNvbW1pdF9saW5lcyA9IGNvbW1pdF9tZXNzYWdl
LnNwbGl0bGluZXMoKQogICAgICAgICAgICAKICAgICAgICAgICAgZGVzY3JpcHRpb24gPSBjb21t
aXRfbGluZXNbMF0KICAgICAgICAgICAgY29tbWVudF90ZXh0ID0gIlxuIi5qb2luKGNvbW1pdF9s
aW5lc1sxOl0pCiAgICAgICAgCiAgICAgICAgICAgIGNvbW1lbnRfdGV4dCArPSAiXG4tLS1cbiIK
ICAgICAgICAgICAgY29tbWVudF90ZXh0ICs9IHNlbGYuc2NtLmZpbGVzX2NoYW5nZWRfc3VtbWFy
eV9mb3JfY29tbWl0KGNvbW1pdF9pZCkKICAgICAgICAKICAgICAgICAgICAgIyBUaGlzIGlzIGEg
bGl0dGxlIGJpdCBvZiBhIGhhY2ssIHRoYXQgd2UgcGFzcyBzdGRvdXQgYXMgdGhlIHBhdGNoIGZp
bGUKICAgICAgICAgICAgIyBXZSBjb3VsZCBhbHRlcm5hdGl2ZWx5IG1ha2UgYW4gaW4tbWVtb3J5
IGZpbGUtbGlrZSBvYmplY3Qgd2l0aCB0aGUgcGF0Y2ggY29udGVudHMKICAgICAgICAgICAgZGlm
Zl9wcm9jZXNzID0gc3VicHJvY2Vzcy5Qb3BlbihzZWxmLnNjbS5zaG93X2RpZmZfY29tbWFuZF9m
b3JfY29tbWl0KGNvbW1pdF9pZCksIHN0ZG91dD1zdWJwcm9jZXNzLlBJUEUsIHNoZWxsPVRydWUp
CiAgICAgICAgICAgIHNlbGYuYnVncy5hZGRfcGF0Y2hfdG9fYnVnKGJ1Z19pZCwgZGlmZl9wcm9j
ZXNzLnN0ZG91dCwgZGVzY3JpcHRpb24sIGNvbW1lbnRfdGV4dCwgbWFya19mb3JfcmV2aWV3PVRy
dWUpCiAgICAKICAgIGRlZiBvYnNvbGV0ZV9hdHRhY2htZW50c19vbl9idWcoc2VsZiwgYXJncyk6
CiAgICAgICAgYnVnX2lkID0gYXJnc1swXQogICAgICAgIGF0dGFjaG1lbnRzID0gc2VsZi5idWdz
LmZldGNoX2F0dGFjaG1lbnRzX2Zyb21fYnVnKGJ1Z19pZCkKICAgICAgICBmb3IgYXR0YWNobWVu
dCBpbiBhdHRhY2htZW50czoKICAgICAgICAgICAgaWYgbm90IGF0dGFjaG1lbnRbJ29ic29sZXRl
J106CiAgICAgICAgICAgICAgICBzZWxmLmJ1Z3Mub2Jzb2xldGVfYXR0YWNobWVudChhdHRhY2ht
ZW50WydpZCddKQogICAgCiAgICBkZWYgcHJpbnRfYnVnc19pbl9jb21taXRfcXVldWUoc2VsZiwg
YXJncyk6CiAgICAgICAgYnVnX2lkcyA9IHNlbGYuYnVncy5mZXRjaF9idWdfaWRzX2Zyb21fY29t
bWl0X3F1ZXVlKCkKICAgICAgICBmb3IgYnVnX2lkIGluIGJ1Z19pZHM6CiAgICAgICAgICAgIHBy
aW50IHNlbGYuYnVncy5idWdfdXJsX2Zvcl9idWdfaWQoYnVnX2lkKQoKICAgIGRlZiBwcmludF9w
YXRjaGVzX2luX2NvbW1pdF9xdWV1ZShzZWxmLCBhcmdzKToKICAgICAgICBwYXRjaGVzID0gc2Vs
Zi5idWdzLmZldGNoX3BhdGNoZXNfZnJvbV9jb21taXRfcXVldWUoKQogICAgICAgIGxvZygiUGF0
Y2hlcyBpbiBjb21taXQgcXVldWU6IikKICAgICAgICBmb3IgcGF0Y2ggaW4gcGF0Y2hlczoKICAg
ICAgICAgICAgcHJpbnQgcGF0Y2hbJ3VybCddCgogICAgZGVmIHByaW50X3Jldmlld2VkX3BhdGNo
ZXNfb25fYnVnKHNlbGYsIGFyZ3MpOgogICAgICAgIGJ1Z19pZCA9IGFyZ3NbMF0KICAgICAgICBw
YXRjaGVzX3RvX2xhbmQgPSBzZWxmLmJ1Z3MuZmV0Y2hfcmV2aWV3ZWRfcGF0Y2hlc19mcm9tX2J1
ZyhidWdfaWQpCiAgICAgICAgZm9yIHBhdGNoIGluIHBhdGNoZXNfdG9fbGFuZDoKICAgICAgICAg
ICAgcHJpbnQgcGF0Y2hbJ3VybCddCgogICAgZGVmIGFwcGx5X3BhdGNoZXNfZnJvbV9idWcoc2Vs
ZiwgYXJncyk6CiAgICAgICAgYnVnX2lkID0gYXJnc1swXQogICAgICAgIHBhdGNoZXMgPSBzZWxm
LmJ1Z3MuZmV0Y2hfcmV2aWV3ZWRfcGF0Y2hlc19mcm9tX2J1ZyhidWdfaWQpCiAgICAgICAgc2Vs
Zi5zY20udXBkYXRlX2FuZF9jbGVhcl93b3JraW5nX2RpcmVjdG9yeSgpCiAgICAgICAgIyBTaG91
bGQgd2UgZXJyb3Igb3V0IGlmIHNlbGYuc2NtIGRvZXMgbm90IHN1cHBvcnQgbG9jYWwgY29tbWl0
cz8KICAgICAgICBmb3IgcGF0Y2ggaW4gcGF0Y2hlczoKICAgICAgICAgICAgc2VsZi5zY20uYXBw
bHlfcGF0Y2gocGF0Y2gpCgogICAgZGVmIGNvbW1pdF9hbmRfdXBkYXRlX2J1ZyhzZWxmLCBhcmdz
KToKICAgICAgICBidWdfaWQgPSBhcmdzWzBdCiAgICAgICAgY29tbWl0X3RleHQgPSBzZWxmLnNj
bS5jb21taXRfbG9jYWxfY2hhbmdlcygpCiAgICAgICAgc2VsZi5idWdzLmNsb3NlX2J1Z19hc19m
aXhlZChidWdfaWQsIGNvbW1pdF90ZXh0KQoKICAgIGRlZiBydW5fYW5kX3Rocm93X2lmX2ZhaWwo
c2VsZiwgc2NyaXB0X25hbWUpOgogICAgICAgIGJ1aWxkX3dlYmtpdF9wcm9jZXNzID0gc3VicHJv
Y2Vzcy5Qb3BlbihzY3JpcHRfbmFtZSwgc2hlbGw9VHJ1ZSkKICAgICAgICByZXR1cm5fY29kZSA9
IGJ1aWxkX3dlYmtpdF9wcm9jZXNzLndhaXQoKQogICAgICAgIGlmIHJldHVybl9jb2RlICE9IDA6
CiAgICAgICAgICAgIHJhaXNlIFNjcmlwdEVycm9yKHNjcmlwdF9uYW1lICsgIiBmYWlsZWQgd2l0
aCBjb2RlICIgKyByZXR1cm5fY29kZSkKCiAgICBkZWYgYnVpbGRfd2Via2l0KHNlbGYpOgogICAg
ICAgIHNlbGYucnVuX2FuZF90aHJvd19pZl9mYWlsKCJidWlsZC13ZWJraXQiKQogICAgCiAgICBk
ZWYgcnVuX3dlYmtpdF90ZXN0cyhzZWxmKToKICAgICAgICBzZWxmLnJ1bl9hbmRfdGhyb3dfaWZf
ZmFpbCgicnVuLXdlYmtpdC10ZXN0cyIpCgogICAgZGVmIGxhbmRfcGF0Y2hlc19mcm9tX2J1Zyhz
ZWxmLCBhcmdzKToKICAgICAgICBidWdfaWQgPSBhcmdzWzBdCgogICAgICAgIHRyeToKICAgICAg
ICAgICAgcGF0Y2hlcyA9IHNlbGYuYnVncy5mZXRjaF9yZXZpZXdlZF9wYXRjaGVzX2Zyb21fYnVn
KGJ1Z19pZCkKICAgICAgICAgICAgY29tbWl0X3RleHQgPSAiIgogICAgICAgICAgICAKICAgICAg
ICAgICAgZm9yIHBhdGNoIGluIHBhdGNoZXM6CiAgICAgICAgICAgICAgICBzZWxmLnNjbS51cGRh
dGVfYW5kX2NsZWFyX3dvcmtpbmdfZGlyZWN0b3J5KCkKICAgICAgICAgICAgICAgIHNlbGYuc2Nt
LmFwcGx5X3BhdGNoKHBhdGNoKQogICAgICAgICAgICAgICAgc2VsZi5idWlsZF93ZWJraXQoKQog
ICAgICAgICAgICAgICAgIyBzZWxmLnJ1bl93ZWJraXRfdGVzdHMoKQogICAgICAgICAgICAgICAg
Y29tbWl0X3RleHQgPSBzZWxmLnNjbS5jb21taXRfbG9jYWxfY2hhbmdlcygpCiAgICAgICAgICAg
ICAgICAjIGlmIHdlJ3JlIGNvbW1pdGluZyBtb3JlIHRoYW4gb25lIHBhdGNoLCB1cGRhdGUgdGhl
IGJ1ZyBhcyB3ZSBnbwogICAgICAgICAgICAgICAgaWYgbGVuKHBhdGNoZXMpID4gMToKICAgICAg
ICAgICAgICAgICAgICBzZWxmLmJ1Z3Mub2Jzb2xldGVfYXR0YWNobWVudChwYXRjaFsnaWQnXSwg
Y29tbWl0X3RleHQpCiAgICAgICAgICAgIAogICAgICAgICAgICBpZiBsZW4ocGF0Y2hlcykgPiAx
OgogICAgICAgICAgICAgICAgY29tbWl0X3RleHQgPSAiQWxsIHJldmlld2VkIHBhdGNoZXMgbGFu
ZGVkLCBjbG9zaW5nLiIKICAgICAgICAgICAgCiAgICAgICAgICAgIHNlbGYuYnVncy5jbG9zZV9i
dWdfYXNfZml4ZWQoYnVnX2lkLCBjb21taXRfdGV4dCkKICAgICAgICBleGNlcHQgU2NyaXB0RXJy
b3IsIGVycm9yOgogICAgICAgICAgICBwcmludCBlcnJvcgogICAgICAgICAgICAjIFdlIGNvdWxk
IGFkZCBhIGNvbW1lbnQgdG8gdGhlIGJ1ZyBhYm91dCB0aGUgZmFpbHVyZQoKICAgIGRlZiBwcmlu
dF9jb21taXRfbWVzc2FnZV9mb3JfdGhpc19jb21taXQoc2VsZiwgYXJncyk6CiAgICAgICAgcHJp
bnQgY29tbWl0X21lc3NhZ2VfZm9yX3RoaXNfY29tbWl0KHNlbGYuc2NtKQogICAgCiAgICBkZWYg
dXNhZ2Uoc2VsZik6CiAgICAgICAgcHJpbnQgb3MucGF0aC5iYXNlbmFtZShzeXMuYXJndlswXSkg
KyAiIFtvcHRpb25zXSBjb21tYW5kIFtjb21tYW5kLW9wdGlvbnNdIFtjb21tYW5kLWFyZ3NdIgog
ICAgICAgIHByaW50ICJHbG9iYWwgT3B0aW9uczoiCiAgICAgICAgcHJpbnQgIiAgZHJ5LXJ1biAt
LSBEbyBub3QgdG91Y2ggYW55IHJlbW90ZSBzZXJ2ZXIuIgogICAgICAgIHByaW50CiAgICAgICAg
cHJpbnQgIkNvbW1hbmRzOiIKICAgICAgICBwcmludCAiICAiICsgIlxuICAiLmpvaW4oc29ydGVk
KHNlbGYuY29tbWFuZHMua2V5cygpKSkKICAgICAgICBzeXMuZXhpdCgxKQoKICAgIGRlZiBwYXJz
ZV9nbG9iYWxfYXJncyhzZWxmLCBhcmdzKToKICAgICAgICBpZiBhcmdzWzBdID09ICItLWRyeS1y
dW4iOgogICAgICAgICAgICBzZWxmLnNjbS5kcnlydW4gPSBUcnVlCiAgICAgICAgICAgIHNlbGYu
YnVncy5kcnlydW4gPSBUcnVlCiAgICAgICAgICAgIGFyZ3MucG9wKDApCiAgICAKICAgIGRlZiBt
YWluKHNlbGYpOgogICAgICAgIGlmIGxlbihzeXMuYXJndikgPCAyOgogICAgICAgICAgICBzZWxm
LnVzYWdlKCkKCiAgICAgICAgIyB3ZSBjb3VsZCB3cml0ZSBtb3JlIHNvcGhpc2l0Y2F0ZWQgb3B0
aW9uIHBhcnNpbmcgc29tZSBkYXkKICAgICAgICBhcmdzID0gc3lzLmFyZ3ZbMTpdCiAgICAgICAg
c2VsZi5wYXJzZV9nbG9iYWxfYXJncyhhcmdzKQoKICAgICAgICBsb2FkX2NvbmZpZygpCgogICAg
ICAgIGNvbW1hbmQgPSBhcmdzLnBvcCgwKQogICAgICAgIGlmIG5vdCBjb21tYW5kIGluIHNlbGYu
Y29tbWFuZHM6CiAgICAgICAgICAgIGxvZyhjb21tYW5kICsgIiBpcyBub3QgYSB2YWxpZCBjb21t
YW5kIikKICAgICAgICAgICAgdXNhZ2UoKQoKICAgICAgICByZXR1cm4gc2VsZi5jb21tYW5kc1tj
b21tYW5kXShhcmdzKQoKCmRlZiBtYWluKCk6CiAgICB0b29sID0gQnVnemlsbGFUb29sKCkKICAg
IHJldHVybiB0b29sLm1haW4oKQoKaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKICAgIG1haW4o
KQo=
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="0"
              isprivate="0"
          >
            <attachid>31491</attachid>
            <date>2009-06-18 04:20:51 -0700</date>
            <delta_ts>2009-06-18 16:06:23 -0700</delta_ts>
            <desc>bugzilla-tool -- now with fancy option parsing and excessive OOP ;)</desc>
            <filename>bugzilla-tool</filename>
            <type>text/plain</type>
            <size>28084</size>
            <attacher name="Eric Seidel (no email)">eric</attacher>
            
              <data encoding="base64">IyEvdXNyL2Jpbi9weXRob24KCiMgRm9yIEdpdDoKaW1wb3J0IHJlCmltcG9ydCBvcwppbXBvcnQg
c3VicHJvY2VzcwppbXBvcnQgc3lzCgojIEZvciBCdWd6aWxsYToKaW1wb3J0IGdldHBhc3MKaW1w
b3J0IHVybGxpYjIKZnJvbSBCZWF1dGlmdWxTb3VwIGltcG9ydCBCZWF1dGlmdWxTb3VwCmZyb20g
bWVjaGFuaXplIGltcG9ydCBCcm93c2VyCgojIEZvciBCdWd6aWxsYVRvb2w6CmZyb20gb3B0cGFy
c2UgaW1wb3J0IE9wdGlvblBhcnNlciwgSW5kZW50ZWRIZWxwRm9ybWF0dGVyLCBTVVBQUkVTU19V
U0FHRSwgbWFrZV9vcHRpb24KCgojIERlZmF1bHRzICh1bnRpbCB3ZSBzdXBwb3J0IGJldHRlciBv
cHRpb24gcGFyc2luZyk6CmJ1Z19zZXJ2ZXIgPSAiaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvIgpi
dWdfYmFzZV91cmwgPSBidWdfc2VydmVyICsgInNob3dfYnVnLmNnaT9pZD0iCmF0dGFjaG1lbnRf
YmFzZV91cmwgPSBidWdfc2VydmVyICsgImF0dGFjaG1lbnQuY2dpP2lkPSIKCiMgQ2FjaGVkIGNv
bmZpZywgdGhlc2Ugc2hvdWxkIG1vdmUgb250byB0aGUgQnVnemlsbGEgb2JqZWN0CmNhY2hlZF91
c2VybmFtZSA9IE5vbmUKY2FjaGVkX3Bhc3N3b3JkID0gTm9uZQoKZGVmIGxvYWRfY29uZmlnKCk6
CiAgICBnbG9iYWwgY2FjaGVkX3VzZXJuYW1lLCBjYWNoZWRfcGFzc3dvcmQKICAgIGNhY2hlZF91
c2VybmFtZSA9IHJlYWRfY29uZmlnKCd1c2VybmFtZScpCiAgICBjYWNoZWRfcGFzc3dvcmQgPSBy
ZWFkX2NvbmZpZygncGFzc3dvcmQnKQoKZGVmIHJlYWRfY29uZmlnKGtleSk6CiAgICAjIE5lZWQg
YSB3YXkgdG8gcmVhZCBmcm9tIHN2biB0b28KICAgIGNvbmZpZ19wcm9jZXNzID0gc3VicHJvY2Vz
cy5Qb3BlbigiZ2l0IGNvbmZpZyAtLWdldCBidWd6aWxsYS4iICsga2V5LCBzdGRvdXQ9c3VicHJv
Y2Vzcy5QSVBFLCBzaGVsbD1UcnVlKQogICAgdmFsdWUgPSBjb25maWdfcHJvY2Vzcy5jb21tdW5p
Y2F0ZSgpWzBdCiAgICByZXR1cm5fY29kZSA9IGNvbmZpZ19wcm9jZXNzLndhaXQoKQoKICAgIGlm
IHJldHVybl9jb2RlICE9IDA6CiAgICAgICAgcmV0dXJuIE5vbmUKICAgIHJldHVybiB2YWx1ZS5y
c3RyaXAoJ1xuJykKCiMgT25jZSB0aGlzIGlzIGluIFdlYktpdFRvb2xzIHdlIGNhbiBmaW5kIHRo
ZSBXZWJLaXQKIyBkaXJlY3RvcnkgYnkgd2Fsa2luZyB1cCB0aGUgcGF0aApkZWYgY2hkaXJfd2Vi
a2l0KCk6CiAgICAjIFdFQktJVF9CQVNFIGlzIGFuIGVudmlyb25tZW50IHZhcmlhYmxlIHNwZWNp
ZmljIHRvIG15IHNldHVwCiAgICBpZiAob3MuZW52aXJvblsnV0VCS0lUX0JBU0UnXSk6CiAgICAg
ICAgd2Via2l0X2RpcmVjdG9yeSA9IG9zLmVudmlyb25bJ1dFQktJVF9CQVNFJ10KICAgIGVsc2U6
CiAgICAgICAgIyBkZWZhdWx0IHRvIHdoZXJlIEkgbm9ybWFsbHkgc3RvcmUgV2ViS2l0IGlmIHdl
IGNhbid0IGZpbmQgV0VCS0lUX0JBU0UKICAgICAgICB3ZWJraXRfZGlyZWN0b3J5ID0gIi9Vc2Vy
cy9lc2VpZGVsL1Byb2plY3RzL1dlYktpdCIKICAgIG9zLmNoZGlyKHdlYmtpdF9kaXJlY3Rvcnkp
CgoKZGVmIGxvZyhzdHJpbmcpOgogICAgcHJpbnQgPj4gc3lzLnN0ZGVyciwgc3RyaW5nCgoKCiMg
MjAwOS0wNi0wMyAgRXJpYyBTZWlkZWwgIDxlcmljQHdlYmtpdC5vcmc+CmNoYW5nZWxvZ19kYXRl
X2xpbmVfcmVnZXhwID0gJ14oW1xkXC1dKykgICguKykgIDwoLispPiQnCgpkZWYgbGF0ZXN0X2No
YW5nZWxvZ19lbnRyeShjaGFuZ2Vsb2dfcGF0aCk6CiAgICBlbnRyeV9saW5lcyA9IFtdCiAgICBj
aGFuZ2Vsb2cgPSBvcGVuKGNoYW5nZWxvZ19wYXRoKQogICAgdHJ5OgogICAgICAgIHByaW50ICJQ
YXJzaW5nIENoYW5nZUxvZzogIiArIGNoYW5nZWxvZ19wYXRoCiAgICAgICAgIyBUaGUgZmlyc3Qg
bGluZSBzaG91bGQgYmUgYSBkYXRlIGxpbmUKICAgICAgICBlbnRyeV9saW5lcy5hcHBlbmQoY2hh
bmdlbG9nLnJlYWRsaW5lKCkpCiAgICAgICAgZm9yIGxpbmUgaW4gY2hhbmdlbG9nOgogICAgICAg
ICAgICAjIGlmIHdlJ3ZlIGhpdCB0aGUgbmV4dCBlbnRyeSwgcmV0dXJuCiAgICAgICAgICAgIGlm
IHJlLm1hdGNoKGNoYW5nZWxvZ19kYXRlX2xpbmVfcmVnZXhwLCBsaW5lKToKICAgICAgICAgICAg
ICAgIHJldHVybiAnJy5qb2luKGVudHJ5X2xpbmVzKQogICAgICAgICAgICBlbnRyeV9saW5lcy5h
cHBlbmQobGluZSkKICAgIGZpbmFsbHk6CiAgICAgICAgICAgIGNoYW5nZWxvZy5jbG9zZSgpCiAg
ICAjIFdlIG5ldmVyIGZvdW5kIGEgZGF0ZSBsaW5lIQogICAgcmV0dXJuIE5vbmUKCmRlZiBjb21t
aXRfbWVzc2FnZV9mb3JfdGhpc19jb21taXQoc2NtKToKICAgIGNoYW5nZWxvZ19tZXNzYWdlcyA9
IFtdCiAgICBwYXRocyA9IHNjbS5jaGFuZ2VkX2ZpbGVzKCkKICAgIGZvciBwYXRoIGluIHBhdGhz
OgogICAgICAgIGlmIHJlLnNlYXJjaCgnQ2hhbmdlTG9nJywgcGF0aCk6CiAgICAgICAgICAgIGNo
YW5nZWxvZ19lbnRyeSA9IGxhdGVzdF9jaGFuZ2Vsb2dfZW50cnkocGF0aCkKICAgICAgICAgICAg
aWYgbm90IGNoYW5nZWxvZ19lbnRyeToKICAgICAgICAgICAgICAgIHJhaXNlICJGYWlsZWQgdG8g
cGFyc2UgQ2hhbmdlTG9nOiAiICsgb3MucGF0aC5hYnNwYXRoKHBhdGgpCiAgICAgICAgICAgIGNo
YW5nZWxvZ19tZXNzYWdlcy5hcHBlbmQoY2hhbmdlbG9nX2VudHJ5KQogICAgcmV0dXJuICcnLmpv
aW4oY2hhbmdlbG9nX21lc3NhZ2VzKQoKZGVmIGJ1Z19jb21tZW50X2Zyb21fY29tbWl0X3RleHQo
Y29tbWl0X3RleHQpOgogICAgY29tbWVudF9saW5lcyA9IFtdCiAgICBjb21taXRfbGluZXMgPSBj
b21taXRfdGV4dC5zcGxpdGxpbmVzKCkKICAgIGZvciBsaW5lIGluIGNvbW1pdF9saW5lczoKICAg
ICAgICBjb21tZW50X2xpbmVzLmFwcGVuZChsaW5lKQogICAgICAgIG1hdGNoID0gcmUubWF0Y2go
Il5Db21taXR0ZWQgcihcZCspJCIsIGxpbmUpCiAgICAgICAgaWYgbWF0Y2g6CiAgICAgICAgICAg
IHJldmlzaW9uID0gbWF0Y2guZ3JvdXAoMSkKICAgICAgICAgICAgY29tbWVudF9saW5lcy5hcHBl
bmQoImh0dHA6Ly90cmFjLndlYmtpdC5vcmcvY2hhbmdlc2V0LyIgKyByZXZpc2lvbikKICAgICAg
ICAgICAgYnJlYWsKICAgIHJldHVybiAiXG4iLmpvaW4oY29tbWVudF9saW5lcykKCgojIEFsbCBC
dWd6aWxsYS1zcGVjaWZpYyBsb2dpYyBzaG91bGQgZ28gaGVyZQojIEl0J3MgcG9zc2libGUgd2Ug
bWF5IGNoYW5nZSBvdXIgcmV2aWV3IHN5c3RlbSBhdCBzb21lIHBvaW50CiMgaW4gd2hpY2ggY2Fz
ZSB0aGF0IHBhcnQgb2YgdGhlIGNvZGUgd291bGQgYnJlYWsgb3V0IG9mIGhlcmUuCmNsYXNzIEJ1
Z3ppbGxhOgogICAgZGVmIF9faW5pdF9fKHNlbGYsIGRyeXJ1biA9IEZhbHNlKToKICAgICAgICBz
ZWxmLmRyeXJ1biA9IGRyeXJ1bgogICAgICAgIHNlbGYuYXV0aGVudGljYXRlZCA9IEZhbHNlCiAg
ICAgICAgCiAgICAgICAgc2VsZi5iciA9IEJyb3dzZXIoKQogICAgICAgICMgSWdub3JlIGJ1Z3Mu
d2Via2l0Lm9yZy9yb2JvdHMudHh0IHVudGlsIHdlIGZpeCBpdCB0byBhbGxvdyB0aGlzIHNjcmlw
dAogICAgICAgIHNlbGYuYnIuc2V0X2hhbmRsZV9yb2JvdHMoRmFsc2UpCgogICAgIyBUaGlzIGNv
dWxkIGV2ZW50dWFsbHkgYmUgYSB0ZXh0IGZpbGUKICAgIHJldmlld2VyX3VzZXJuYW1lc190b19m
dWxsX25hbWVzID0gewogICAgICAgICJhYmFydGgiIDogIkFkYW0gQmFydGgiLAogICAgICAgICJh
ZGVsZSIgOiAiQWRlbGUgUGV0ZXJzb24iLAogICAgICAgICJhcml5YS5oaWRheWF0IiA6ICJBcml5
YSBIaWRheWF0IiwKICAgICAgICAiZGFyaW4iIDogIkRhcmluIEFkbGVyIiwKICAgICAgICAiZGds
YXprb3YiIDogIkRpbWl0cmkgR2xhemtvdiIsCiAgICAgICAgImVyaWMiIDogIkVyaWMgU2VpZGVs
IiwKICAgICAgICAiZGRraWx6ZXIiIDogIkRhdmlkIEtpbHplciIsCiAgICAgICAgImZpc2hkIiA6
ICJEYXJpbiBGaXNoZXIiLAogICAgICAgICJnbnMiIDogIkd1c3Rhdm8gTm9yb25oYSIsCiAgICAg
ICAgImh5YXR0IiA6ICJEYXZpZCBIeWF0dCIsCiAgICAgICAgImptYWxvbnpvIiA6ICJKYW4gQWxv
bnpvIiwKICAgICAgICAibGV2aW4iIDogIkRhdmlkIExldmluIiwKICAgICAgICAibWl0eiIgOiAi
RGFuIEJlcm5zdGVpbiIsCiAgICAgICAgIm1qcyIgOiAiTWFjaWVqIFN0YWNob3ZpYWsiLAogICAg
ICAgICJtcm93ZSIgOiAiTWFyayBSb3dlIiwKICAgICAgICAib2xpdmVyIiA6ICJPbGl2ZXIgSHVu
dCIsCiAgICAgICAgInN0YWlrb3MiIDogIkdlb3JnZSBTdGFpa29zIiwKICAgICAgICAidHJlYXQi
IDogIkFkYW0gVHJlYXQiLAogICAgICAgICJ0aW1vdGh5IiA6ICJUaW1vdGh5IEhhdGNoZXIiLAog
ICAgICAgICJ4YW4ubG9wZXoiIDogIlhhbiBMb3BleiIsCiAgICAgICAgInplY2tlIiA6ICJIb2xn
ZXIgRnJleXRoZXIiLAogICAgfQoKICAgIGRlZiBmdWxsX25hbWVfZnJvbV9idWd6aWxsYV9uYW1l
KHNlbGYsIGJ1Z3ppbGxhX25hbWUpOgogICAgICAgIGlmIG5vdCBidWd6aWxsYV9uYW1lIGluIHNl
bGYucmV2aWV3ZXJfdXNlcm5hbWVzX3RvX2Z1bGxfbmFtZXM6CiAgICAgICAgICAgIHJhaXNlIEV4
Y2VwdGlvbigiRVJST1I6IFVua25vd24gcmV2aWV3ZXIhICIgKyBidWd6aWxsYV9uYW1lKQogICAg
ICAgIHJldHVybiBzZWxmLnJldmlld2VyX3VzZXJuYW1lc190b19mdWxsX25hbWVzW2J1Z3ppbGxh
X25hbWVdCgogICAgZGVmIGJ1Z191cmxfZm9yX2J1Z19pZChzZWxmLCBidWdfaWQpOgogICAgICAg
IHJldHVybiAiJXMlcyIgJSAoYnVnX2Jhc2VfdXJsLCBidWdfaWQpCiAgICAKICAgIGRlZiBhdHRh
Y2htZW50X3VybF9mb3JfaWQoc2VsZiwgYXR0YWNobWVudF9pZCwgYWN0aW9uID0gInZpZXciKToK
ICAgICAgICByZXR1cm4gIiVzJXMmYWN0aW9uPSVzIiAlIChhdHRhY2htZW50X2Jhc2VfdXJsLCBh
dHRhY2htZW50X2lkLCBhY3Rpb24pCgogICAgZGVmIGZldGNoX2F0dGFjaG1lbnRzX2Zyb21fYnVn
KHNlbGYsIGJ1Z19pZCk6CiAgICAgICAgYnVnX3VybCA9IHNlbGYuYnVnX3VybF9mb3JfYnVnX2lk
KGJ1Z19pZCkKICAgICAgICBsb2coIkZldGNoaW5nOiAiICsgYnVnX3VybCkKCiAgICAgICAgcGFn
ZSA9IHVybGxpYjIudXJsb3BlbihidWdfdXJsKQogICAgICAgIHNvdXAgPSBCZWF1dGlmdWxTb3Vw
KHBhZ2UpCiAgICAKICAgICAgICBhdHRhY2htZW50X3RhYmxlID0gc291cC5maW5kKCd0YWJsZScs
IHsnY2VsbHNwYWNpbmcnOiIwIiwgJ2NlbGxwYWRkaW5nJzoiNCIsICdib3JkZXInOiIxIn0pCiAg
ICAKICAgICAgICBhdHRhY2htZW50cyA9IFtdCiAgICAgICAgIyBHcmFiIGEgbGlzdCBvZiBub24t
b2Jzb2xldGVkIHBhdGNoIGZpbGVzIAogICAgICAgIGZvciBhdHRhY2htZW50X3JvdyBpbiBhdHRh
Y2htZW50X3RhYmxlLmZpbmRBbGwoJ3RyJyk6CiAgICAgICAgICAgIGZpcnN0X2NlbGwgPSBhdHRh
Y2htZW50X3Jvdy5maW5kKCd0ZCcpCiAgICAgICAgICAgIGlmIG5vdCBmaXJzdF9jZWxsOgogICAg
ICAgICAgICAgICAgY29udGludWUgIyBUaGlzIGlzIHRoZSBoZWFkZXIsIG5vIGNlbGxzCiAgICAg
ICAgICAgIGlmIGZpcnN0X2NlbGwuaGFzX2tleSgnY29sc3BhbicpOgogICAgICAgICAgICAgICAg
YnJlYWsgIyB0aGlzIGlzIHRoZSBsYXN0IHJvdwogICAgICAgICAgICAKICAgICAgICAgICAgYXR0
YWNobWVudCA9IHt9CiAgICAgICAgICAgIGF0dGFjaG1lbnRbJ29ic29sZXRlJ10gPSAoYXR0YWNo
bWVudF9yb3cuaGFzX2tleSgnY2xhc3MnKSBhbmQgYXR0YWNobWVudF9yb3dbJ2NsYXNzJ10gPT0g
ImJ6X29ic29sZXRlIikKICAgICAgICAgICAgCiAgICAgICAgICAgIGNlbGxzID0gYXR0YWNobWVu
dF9yb3cuZmluZEFsbCgndGQnKQogICAgICAgICAgICBhdHRhY2htZW50X2xpbmsgPSBjZWxsc1sw
XS5maW5kKCdhJykKICAgICAgICAgICAgYXR0YWNobWVudFsndXJsJ10gPSBidWdfc2VydmVyICsg
YXR0YWNobWVudF9saW5rWydocmVmJ10gIyB1cmxzIGFyZSByZWxhdGl2ZQogICAgICAgICAgICBh
dHRhY2htZW50WydpZCddID0gYXR0YWNobWVudFsndXJsJ10uc3BsaXQoJz0nKVsxXSAjIGUuZy4g
aHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvYXR0YWNobWVudC5jZ2k/aWQ9MzEyMjMKICAgICAgICAg
ICAgYXR0YWNobWVudFsnbmFtZSddID0gYXR0YWNobWVudF9saW5rLnN0cmluZwogICAgICAgICAg
ICAjIGF0dGFjaG1lbnRbJ3R5cGUnXSA9IGNlbGxzWzFdCiAgICAgICAgICAgICMgYXR0YWNobWVu
dFsnZGF0ZSddID0gY2VsbHNbMl0KICAgICAgICAgICAgIyBhdHRhY2htZW50WydzaXplJ10gPSBj
ZWxsc1szXQogICAgICAgICAgICByZXZpZXdfc3RhdHVzID0gY2VsbHNbNF0KICAgICAgICAgICAg
IyBhY3Rpb25fbGlua3MgPSBjZWxsc1s1XQoKICAgICAgICAgICAgaWYgKHN0cihyZXZpZXdfc3Rh
dHVzKS5maW5kKCJyZXZpZXcrIikgIT0gLTEpOgogICAgICAgICAgICAgICAgcmV2aWV3ZXIgPSBy
ZXZpZXdfc3RhdHVzLmNvbnRlbnRzWzBdLnNwbGl0KCc6JylbMF0gIyBuYW1lOlxuIHJldmlldytc
bgogICAgICAgICAgICAgICAgcmV2aWV3ZXJfZnVsbF9uYW1lID0gc2VsZi5mdWxsX25hbWVfZnJv
bV9idWd6aWxsYV9uYW1lKHJldmlld2VyKQogICAgICAgICAgICAgICAgYXR0YWNobWVudFsncmV2
aWV3ZXInXSA9IHJldmlld2VyX2Z1bGxfbmFtZQoKICAgICAgICAgICAgYXR0YWNobWVudHMuYXBw
ZW5kKGF0dGFjaG1lbnQpCiAgICAgICAgcmV0dXJuIGF0dGFjaG1lbnRzCgogICAgZGVmIGZldGNo
X3Jldmlld2VkX3BhdGNoZXNfZnJvbV9idWcoc2VsZiwgYnVnX2lkKToKICAgICAgICByZXZpZXdl
ZF9wYXRjaGVzID0gW10KICAgICAgICBmb3IgYXR0YWNobWVudCBpbiBzZWxmLmZldGNoX2F0dGFj
aG1lbnRzX2Zyb21fYnVnKGJ1Z19pZCk6CiAgICAgICAgICAgIGlmICdyZXZpZXdlcicgaW4gYXR0
YWNobWVudCBhbmQgbm90IGF0dGFjaG1lbnRbJ29ic29sZXRlJ106CiAgICAgICAgICAgICAgICBy
ZXZpZXdlZF9wYXRjaGVzLmFwcGVuZChhdHRhY2htZW50KQogICAgICAgIHJldHVybiByZXZpZXdl
ZF9wYXRjaGVzCgogICAgZGVmIGZldGNoX2J1Z19pZHNfZnJvbV9jb21taXRfcXVldWUoc2VsZik6
CiAgICAgICAgdW5hc3NpZ25lZF9vbmx5ID0gIiZlbWFpbGFzc2lnbmVkX3RvMT0xJmVtYWlsdHlw
ZTE9c3Vic3RyaW5nJmVtYWlsMT11bmFzc2lnbmVkIgogICAgICAgIGNvbW1pdF9xdWV1ZV91cmwg
PSAiaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvYnVnbGlzdC5jZ2k/cXVlcnlfZm9ybWF0PWFkdmFu
Y2VkJmJ1Z19zdGF0dXM9VU5DT05GSVJNRUQmYnVnX3N0YXR1cz1ORVcmYnVnX3N0YXR1cz1BU1NJ
R05FRCZidWdfc3RhdHVzPVJFT1BFTkVEJmZpZWxkMC0wLTA9ZmxhZ3R5cGVzLm5hbWUmdHlwZTAt
MC0wPWVxdWFscyZ2YWx1ZTAtMC0wPXJldmlldyUyQiIKICAgICAgICBsb2coIkxvYWRpbmcgY29t
bWl0IHF1ZXVlIikKCiAgICAgICAgcGFnZSA9IHVybGxpYjIudXJsb3Blbihjb21taXRfcXVldWVf
dXJsKQogICAgICAgIHNvdXAgPSBCZWF1dGlmdWxTb3VwKHBhZ2UpCiAgICAKICAgICAgICBidWdf
aWRzID0gW10KICAgICAgICAjIEdyYWIgdGhlIGNlbGxzIGluIHRoZSBmaXJzdCBjb2x1bW4gKHdo
aWNoIGhhcHBlbnMgdG8gYmUgdGhlIGJ1ZyBpZHMpCiAgICAgICAgZm9yIGJ1Z19saW5rX2NlbGwg
aW4gc291cCgndGQnLCAiZmlyc3QtY2hpbGQiKTogIyB0ZHMgd2l0aCB0aGUgY2xhc3MgImZpcnN0
LWNoaWxkIgogICAgICAgICAgICBidWdfbGluayA9IGJ1Z19saW5rX2NlbGwuZmluZCgiYSIpCiAg
ICAgICAgICAgIGJ1Z19pZHMuYXBwZW5kKGJ1Z19saW5rLnN0cmluZykgIyB0aGUgY29udGVudHMg
aGFwcGVuIHRvIGJlIHRoZSBidWcgaWQKICAgIAogICAgICAgIHJldHVybiBidWdfaWRzCgogICAg
ZGVmIGZldGNoX3BhdGNoZXNfZnJvbV9jb21taXRfcXVldWUoc2VsZik6CiAgICAgICAgcGF0Y2hl
c190b19sYW5kID0gW10KICAgICAgICBmb3IgYnVnX2lkIGluIHNlbGYuZmV0Y2hfYnVnX2lkc19m
cm9tX2NvbW1pdF9xdWV1ZSgpOgogICAgICAgICAgICBwYXRjaGVzID0gc2VsZi5mZXRjaF9yZXZp
ZXdlZF9wYXRjaGVzX2Zyb21fYnVnKGJ1Z19pZCkKICAgICAgICAgICAgcGF0Y2hlc190b19sYW5k
LmV4dGVuZChwYXRjaGVzKQogICAgICAgIHJldHVybiBwYXRjaGVzX3RvX2xhbmQKCiAgICBkZWYg
YXV0aGVudGljYXRlKHNlbGYsIHVzZXJuYW1lID0gTm9uZSwgcGFzc3dvcmQgPSBOb25lKToKICAg
ICAgICBpZiAoc2VsZi5hdXRoZW50aWNhdGVkKToKICAgICAgICAgICAgcmV0dXJuCiAgICAgICAg
CiAgICAgICAgZ2xvYmFsIGNhY2hlZF91c2VybmFtZSwgY2FjaGVkX3Bhc3N3b3JkCiAgICAgICAg
aWYgbm90IHVzZXJuYW1lOgogICAgICAgICAgICBpZiBjYWNoZWRfdXNlcm5hbWU6CiAgICAgICAg
ICAgICAgICB1c2VybmFtZSA9IGNhY2hlZF91c2VybmFtZQogICAgICAgICAgICBlbHNlOgogICAg
ICAgICAgICAgICAgdXNlcm5hbWUgPSBjYWNoZWRfdXNlcm5hbWUgPSByYXdfaW5wdXQoIkJ1Z3pp
bGxhIGxvZ2luOiAiKQogICAgICAgIGlmIG5vdCBwYXNzd29yZDoKICAgICAgICAgICAgaWYgY2Fj
aGVkX3Bhc3N3b3JkOgogICAgICAgICAgICAgICAgcGFzc3dvcmQgPSBjYWNoZWRfcGFzc3dvcmQK
ICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIHBhc3N3b3JkID0gY2FjaGVkX3Bhc3N3
b3JkID0gZ2V0cGFzcy5nZXRwYXNzKCJCdWd6aWxsYSBwYXNzd29yZDogIikKCiAgICAgICAgbG9n
KCJMb2dnaW5nIGluIGFzICVzLi4uIiAlICh1c2VybmFtZSwpKQogICAgICAgIGlmIHNlbGYuZHJ5
cnVuOgogICAgICAgICAgICByZXR1cm4KICAgICAgICBzZWxmLmJyLm9wZW4oYnVnX3NlcnZlciAr
ICIvaW5kZXguY2dpP0dvQWhlYWRBbmRMb2dJbj0xIikKICAgICAgICBzZWxmLmJyLnNlbGVjdF9m
b3JtKG5hbWU9ImxvZ2luIikKICAgICAgICBzZWxmLmJyWydCdWd6aWxsYV9sb2dpbiddID0gdXNl
cm5hbWUKICAgICAgICBzZWxmLmJyWydCdWd6aWxsYV9wYXNzd29yZCddID0gcGFzc3dvcmQKICAg
ICAgICBzZWxmLmJyLnN1Ym1pdCgpCiAgICAgICAgCiAgICAgICAgIyBXZSByZWFsbHkgc2hvdWxk
IGNoZWNrIHRoZSByZXN1bHQgY29kZXMKICAgICAgICBzZWxmLmF1dGhlbnRpY2F0ZWQgPSBUcnVl
CgogICAgZGVmIGFkZF9wYXRjaF90b19idWcoc2VsZiwgYnVnX2lkLCBwYXRjaF9maWxlX29iamVj
dCwgZGVzY3JpcHRpb24sIGNvbW1lbnRfdGV4dCA9IE5vbmUsIG1hcmtfZm9yX3JldmlldyA9IEZh
bHNlKToKICAgICAgICBzZWxmLmF1dGhlbnRpY2F0ZSgpCiAgICAgICAgCiAgICAgICAgbG9nKCJB
ZGRpbmcgcGF0Y2ggXCIlc1wiIHRvIGJ1ZyAlcyIgJSAoZGVzY3JpcHRpb24sIGJ1Z19pZCkpCiAg
ICAgICAgaWYgc2VsZi5kcnlydW46CiAgICAgICAgICAgIGxvZyhjb21tZW50X3RleHQpCiAgICAg
ICAgICAgIHJldHVybgogICAgICAgIAogICAgICAgIHNlbGYuYnIub3BlbihidWdfc2VydmVyICsg
Ii9hdHRhY2htZW50LmNnaT9hY3Rpb249ZW50ZXImYnVnaWQ9IiArIGJ1Z19pZCkKICAgICAgICBz
ZWxmLmJyLnNlbGVjdF9mb3JtKG5hbWU9ImVudHJ5Zm9ybSIpICAgICAgICAKICAgICAgICBzZWxm
LmJyWydkZXNjcmlwdGlvbiddID0gZGVzY3JpcHRpb24KICAgICAgICBzZWxmLmJyWydpc3BhdGNo
J10gPSAoIjEiLCkKICAgICAgICBpZiAoY29tbWVudF90ZXh0KToKICAgICAgICAgICAgbG9nKGNv
bW1lbnRfdGV4dCkKICAgICAgICAgICAgc2VsZi5iclsnY29tbWVudCddID0gY29tbWVudF90ZXh0
CiAgICAgICAgc2VsZi5iclsnZmxhZ190eXBlLTEnXSA9ICgnPycsKSBpZiBtYXJrX2Zvcl9yZXZp
ZXcgZWxzZSAoJ1gnLCkKICAgICAgICBzZWxmLmJyLmFkZF9maWxlKHBhdGNoX2ZpbGVfb2JqZWN0
LCAidGV4dC9wbGFpbiIsICJidWd6aWxsYV9yZXF1aXJlc19hX2ZpbGVuYW1lLnBhdGNoIikKICAg
ICAgICBzZWxmLmJyLnN1Ym1pdCgpCgogICAgZGVmIG9ic29sZXRlX2F0dGFjaG1lbnQoc2VsZiwg
YXR0YWNobWVudF9pZCwgY29tbWVudF90ZXh0ID0gTm9uZSk6CiAgICAgICAgc2VsZi5hdXRoZW50
aWNhdGUoKQoKICAgICAgICBsb2coIk9ic29sZXRpbmcgYXR0YWNobWVudDogJXMiICUgKGF0dGFj
aG1lbnRfaWQsKSkKICAgICAgICBpZiBzZWxmLmRyeXJ1bjoKICAgICAgICAgICAgbG9nKGNvbW1l
bnRfdGV4dCkKICAgICAgICAgICAgcmV0dXJuCgogICAgICAgIHNlbGYuYnIub3BlbihzZWxmLmF0
dGFjaG1lbnRfdXJsX2Zvcl9pZChhdHRhY2htZW50X2lkLCAnZWRpdCcpKQogICAgICAgIHNlbGYu
YnIuc2VsZWN0X2Zvcm0obnI9MCkKICAgICAgICBzZWxmLmJyLmZpbmRfY29udHJvbCgnaXNvYnNv
bGV0ZScpLml0ZW1zWzBdLnNlbGVjdGVkID0gVHJ1ZQogICAgICAgICMgQWxzbyBjbGVhciBhbnkg
cmV2aWV3IGZsYWcgKHRvIHJlbW92ZSBpdCBmcm9tIHJldmlldy9jb21taXQgcXVldWVzKQogICAg
ICAgIHNlbGYuYnIuZmluZF9jb250cm9sKHR5cGU9J3NlbGVjdCcsIG5yPTApLnZhbHVlID0gKCJY
IiwpCiAgICAgICAgaWYgY29tbWVudF90ZXh0OgogICAgICAgICAgICBsb2coY29tbWVudF90ZXh0
KQogICAgICAgICAgICBzZWxmLmJyWydjb21tZW50J10gPSBjb21tZW50X3RleHQKICAgICAgICBz
ZWxmLmJyLnN1Ym1pdCgpCiAgICAKICAgIGRlZiBwb3N0X2NvbW1lbnRfdG9fYnVnKHNlbGYsIGJ1
Z19pZCwgY29tbWVudF90ZXh0KToKICAgICAgICBzZWxmLmF1dGhlbnRpY2F0ZSgpCgogICAgICAg
IGxvZygiQWRkaW5nIGNvbW1lbnQgdG8gYnVnICVzIiAlIChidWdfaWQsKSkKICAgICAgICBpZiBz
ZWxmLmRyeXJ1bjoKICAgICAgICAgICAgbG9nKGNvbW1lbnRfdGV4dCkKICAgICAgICAgICAgcmV0
dXJuCgogICAgICAgIHNlbGYuYnIub3BlbihzZWxmLmJ1Z191cmxfZm9yX2J1Z19pZChidWdfaWQp
KQogICAgICAgIHNlbGYuYnIuc2VsZWN0X2Zvcm0obmFtZT0iY2hhbmdlZm9ybSIpCiAgICAgICAg
c2VsZi5iclsnY29tbWVudCddID0gY29tbWVudF90ZXh0CiAgICAgICAgc2VsZi5ici5zdWJtaXQo
KQoKICAgIGRlZiBjbG9zZV9idWdfYXNfZml4ZWQoc2VsZiwgYnVnX2lkLCBjb21tZW50X3RleHQg
PSBOb25lKToKICAgICAgICBzZWxmLmF1dGhlbnRpY2F0ZSgpCgogICAgICAgIGxvZygiQ2xvc2lu
ZyBidWcgJXMgYXMgZml4ZWQiICUgKGJ1Z19pZCwpKQogICAgICAgIGlmIHNlbGYuZHJ5cnVuOgog
ICAgICAgICAgICBsb2coY29tbWVudF90ZXh0KQogICAgICAgICAgICByZXR1cm4KCiAgICAgICAg
c2VsZi5ici5vcGVuKHNlbGYuYnVnX3VybF9mb3JfYnVnX2lkKGJ1Z19pZCkpCiAgICAgICAgc2Vs
Zi5ici5zZWxlY3RfZm9ybShuYW1lPSJjaGFuZ2Vmb3JtIikKICAgICAgICBpZiBjb21tZW50X3Rl
eHQ6CiAgICAgICAgICAgIGxvZyhjb21tZW50X3RleHQpCiAgICAgICAgICAgIHNlbGYuYnJbJ2Nv
bW1lbnQnXSA9IGNvbW1lbnRfdGV4dAogICAgICAgIHNlbGYuYnJbJ2tub2InXSA9IFsncmVzb2x2
ZSddCiAgICAgICAgc2VsZi5iclsncmVzb2x1dGlvbiddID0gWydGSVhFRCddCiAgICAgICAgc2Vs
Zi5ici5zdWJtaXQoKQoKCiMgQWxsIGdpdC1zcGVjaWZpYyBsb2dpYyBzaG91bGQgZ28gaGVyZS4K
IyBFdmVudHVhbGx5IHdlJ2xsIHByb2JhYmx5IGhhdmUgR2l0IGFuZCBTVk4gc3ViY2xhc3NlcyBv
ZiBzb21lIFNDTSBjbGFzcwpjbGFzcyBHaXQ6CiAgICBkZWYgX19pbml0X18oc2VsZiwgZHJ5cnVu
ID0gRmFsc2UpOgogICAgICAgIHNlbGYuZHJ5cnVuID0gZHJ5cnVuCiAgICAKICAgIGRlZiBlbnN1
cmVfY2xlYW5fd29ya2luZ19kaXJlY3Rvcnkoc2VsZik6CiAgICAgICAgIyBXZSBzaG91bGQgbWFr
ZSBzdXJlIHRoZSB0cmVlIGlzIGNsZWFuCiAgICAKICAgICAgICAjIEhBQ0s6IFRoaXMgaXMgZGFu
Z2Vyb3VzLCBidXQgSSdtIHRoZSBvbmx5IG9uZSB1c2luZyB0aGlzIHNjcmlwdCwgc28gaXQncyBP
Sy4gOykKICAgICAgICAjIHdlIHJlYWxseSBzaG91bGQgcmVxdWlyZSBhIC0tZm9yY2Ugb3B0aW9u
IHRvIHVzZSBhIG5vbi1jbGVhbiB3b3JraW5nIGRpcmVjdG9yeQogICAgICAgIGxvZygiQ2xlYW5p
bmcgdGhlIHdvcmtpbmcgZGlyZWN0b3J5IikKICAgICAgICBvcy5zeXN0ZW0oImdpdCByZXNldCAt
LWhhcmQgdHJ1bmsgJiYgZ2l0IGNsZWFuIC1mIikKCiAgICBkZWYgdXBkYXRlX3dlYmtpdChzZWxm
KToKICAgICAgICAjIEhBQ0s6IHVwZGF0ZSB0aGUgdHJlZSB1c2luZyB1cGRhdGUtd2Via2l0IG9y
IGdpdCBzdm4gcmViYXNlCiAgICAgICAgbG9nKCJVcGRhdGluZyB3b3JraW5nIGRpcmVjdG9yeSIp
CiAgICAgICAgb3Muc3lzdGVtKCJnaXQgc3ZuIHJlYmFzZSIpCiAgICAgICAgcmV0dXJuIFRydWUK
CiAgICBkZWYgdXBkYXRlX2FuZF9jbGVhcl93b3JraW5nX2RpcmVjdG9yeShzZWxmKToKICAgICAg
ICBjaGRpcl93ZWJraXQoKQogICAgICAgIHNlbGYuZW5zdXJlX2NsZWFuX3dvcmtpbmdfZGlyZWN0
b3J5KCkKICAgICAgICBzZWxmLnVwZGF0ZV93ZWJraXQoKQoKICAgIGRlZiBhcHBseV9wYXRjaChz
ZWxmLCBwYXRjaCk6CiAgICAgICAgY2hkaXJfd2Via2l0KCkKICAgICAgICAjIEl0J3MgcG9zc2li
bGUgdGhhdCB0aGUgcGF0Y2ggd2FzIG5vdCBtYWRlIGZyb20gdGhlIHJvb3QgZGlyZWN0b3J5CiAg
ICAgICAgIyB3ZSBzaG91bGQgZGV0ZWN0IGFuZCBoYW5kbGUgdGhhdCBjYXNlLgogICAgICAgIHJl
dHVybl9jb2RlID0gb3Muc3lzdGVtKCJjdXJsICIgKyBwYXRjaFsndXJsJ10gKyAiIHwgc3ZuLWFw
cGx5IC0tcmV2aWV3ZXIgXCIiICsgcGF0Y2hbJ3Jldmlld2VyJ10gKyAiXCIiKQogICAgICAgIGlm
IChyZXR1cm5fY29kZSAhPSAwKToKICAgICAgICAgICAgcmFpc2UgIlBhdGNoICIgKyBwYXRjaF91
cmwgKyAiIGZhaWxlZCB0byBkb3dubG9hZCBhbmQgYXBwbHkuIgoKICAgIGRlZiBjaGFuZ2VkX2Zp
bGVzKHNlbGYpOgogICAgICAgIGZpbGVfbmFtZXMgPSBbXQogICAgICAgIGZvciBsaW5lIGluIG9z
LnBvcGVuKCdnaXQgZGlmZiAtciAtLW5hbWUtc3RhdHVzIC1DIC1DIC1NJykucmVhZGxpbmVzKCk6
CiAgICAgICAgICAgIHN0YXR1cyA9IE5vbmUKICAgICAgICAgICAgZmlsZV9uYW1lID0gTm9uZQog
ICAgICAgICAgICBtYXRjaCA9IHJlLnNlYXJjaCgnXihbQURNXSlcdCguKykkJywgbGluZSkKICAg
ICAgICAgICAgaWYgbWF0Y2g6CiAgICAgICAgICAgICAgICAjc3RhdHVzID0gbWF0Y2guZ3JvdXAo
MSkKICAgICAgICAgICAgICAgIGZpbGVfbmFtZSA9IG1hdGNoLmdyb3VwKDIpCiAgICAgICAgICAg
ICAgICBmaWxlX25hbWVzLmFwcGVuZChmaWxlX25hbWUpCiAgICAgICAgcmV0dXJuIGZpbGVfbmFt
ZXMKICAgIAogICAgZGVmIGNvbW1pdF93aXRoX21lc3NhZ2Uoc2VsZiwgbWVzc2FnZSk6CiAgICAg
ICAgIyBDb21taXQgZmlyc3QgdG8gZ2l0CiAgICAgICAgY29tbWl0X3Byb2Nlc3MgPSBzdWJwcm9j
ZXNzLlBvcGVuKCdnaXQgY29tbWl0IC1hIC1GIC0nLCBzdGRpbj1zdWJwcm9jZXNzLlBJUEUsIHNo
ZWxsPVRydWUpCiAgICAgICAgY29tbWl0X3Byb2Nlc3MuY29tbXVuaWNhdGUobWVzc2FnZSkKCiAg
ICAgICAgIyBOb3cgY29tbWl0IHRvIHN2bjoKICAgICAgICBpZiBzZWxmLmRyeXJ1bjoKICAgICAg
ICAgICAgcmV0dXJuCiAgICAgICAgY29tbWl0X3Byb2Nlc3MgPSBzdWJwcm9jZXNzLlBvcGVuKCdn
aXQgc3ZuIGRjb21taXQnLCBzdGRvdXQ9c3VicHJvY2Vzcy5QSVBFLCBzaGVsbD1UcnVlKQogICAg
ICAgIChvdXQsIGVycm9yKSA9IGNvbW1pdF9wcm9jZXNzLmNvbW11bmljYXRlKCkKICAgICAgICBy
ZXR1cm5fY29kZSA9IGNvbW1pdF9wcm9jZXNzLndhaXQoKQogICAgICAgIHJldHVybiBvdXQKCiAg
ICBkZWYgY29tbWl0X2lkc19mcm9tX3JhbmdlX2FyZ3VtZW50cyhzZWxmLCBhcmdzLCBjaGVycnlf
cGljayA9IEZhbHNlKToKICAgICAgICAjIEZpcnN0IGdldCB0aGUgY29tbWl0LWlkcyBmb3IgdGhl
IHBhc3NlZCBpbiByZXZpc2lvbnMKICAgICAgICByZXZfcGFyc2VfYXJncyA9IFsnZ2l0JywgJ3Jl
di1wYXJzZScsICctLXJldnMtb25seSddCiAgICAgICAgcmV2X3BhcnNlX2FyZ3MuZXh0ZW5kKGFy
Z3MpCiAgICAgICAgcmV2X3BhcnNlX3Byb2Nlc3MgPSBzdWJwcm9jZXNzLlBvcGVuKCIgIi5qb2lu
KHJldl9wYXJzZV9hcmdzKSwgc3Rkb3V0PXN1YnByb2Nlc3MuUElQRSwgc2hlbGw9VHJ1ZSkKICAg
ICAgICByZXZpc2lvbnMgPSByZXZfcGFyc2VfcHJvY2Vzcy5jb21tdW5pY2F0ZSgpWzBdLnNwbGl0
bGluZXMoKQogICAgICAgIAogICAgICAgIGlmIGNoZXJyeV9waWNrOgogICAgICAgICAgICByZXR1
cm4gcmV2aXNpb25zCiAgICAgICAgCiAgICAgICAgIyBJZiBub3QgY2hlcnJ5LXBpY2tpbmcgYW5k
IG9ubHkgcGFzc2VkIG9uZSByZXZpc2lvbiwgYXNzdW1lICJecmV2aXNpb24gaGVhZCIgYWthICJy
ZXZpc2lvbi4uaGVhZCIKICAgICAgICBpZiBsZW4ocmV2aXNpb25zKSA8IDI6CiAgICAgICAgICAg
IHJldmlzaW9uc1swXSA9ICJeIiArIHJldmlzaW9uc1swXQogICAgICAgICAgICByZXZpc2lvbnMu
YXBwZW5kKCJoZWFkIikKICAgICAgICAKICAgICAgICByZXZfbGlzdF9hcmdzID0gWydnaXQnLCAn
cmV2LWxpc3QnXQogICAgICAgIHJldl9saXN0X2FyZ3MuZXh0ZW5kKHJldmlzaW9ucykKICAgICAg
ICByZXZfbGlzdF9wcm9jZXNzID0gc3VicHJvY2Vzcy5Qb3BlbigiICIuam9pbihyZXZfbGlzdF9h
cmdzKSwgc3Rkb3V0PXN1YnByb2Nlc3MuUElQRSwgc2hlbGw9VHJ1ZSkKICAgICAgICByZXR1cm4g
cmV2X2xpc3RfcHJvY2Vzcy5jb21tdW5pY2F0ZSgpWzBdLnNwbGl0bGluZXMoKQoKICAgIGRlZiBj
b21taXRfbWVzc2FnZV9mb3JfY29tbWl0KHNlbGYsIGNvbW1pdF9pZCA9ICJoZWFkIik6CiAgICAg
ICAgY29tbWl0X21lc3NhZ2VfcHJvY2VzcyA9IHN1YnByb2Nlc3MuUG9wZW4oImdpdCBjYXQtZmls
ZSBjb21taXQgIiArIGNvbW1pdF9pZCwgc3Rkb3V0PXN1YnByb2Nlc3MuUElQRSwgc2hlbGw9VHJ1
ZSkKICAgICAgICBjb21taXRfbWVzc2FnZSA9IGNvbW1pdF9tZXNzYWdlX3Byb2Nlc3MuY29tbXVu
aWNhdGUoKVswXQogICAgICAgIGNvbW1pdF9saW5lcyA9IGNvbW1pdF9tZXNzYWdlLnNwbGl0bGlu
ZXMoKQoKICAgICAgICAjIHNraXAgdGhlIGhlYWRlcnMKICAgICAgICBmaXJzdF9saW5lX2FmdGVy
X2hlYWRlcnMgPSAwCiAgICAgICAgZm9yIGxpbmUgaW4gY29tbWl0X2xpbmVzOgogICAgICAgICAg
ICBmaXJzdF9saW5lX2FmdGVyX2hlYWRlcnMgKz0gMQogICAgICAgICAgICBpZiBsaW5lID09ICIi
OgogICAgICAgICAgICAgICAgYnJlYWsKICAgICAgICByZXR1cm4gIlxuIi5qb2luKGNvbW1pdF9s
aW5lc1tmaXJzdF9saW5lX2FmdGVyX2hlYWRlcnM6XSkKCiAgICBkZWYgc2hvd19kaWZmX2NvbW1h
bmRfZm9yX2NvbW1pdChzZWxmLCBjb21taXRfaWQpOgogICAgICAgIHJldHVybiAiZ2l0IGRpZmYt
dHJlZSAtcCAiICsgY29tbWl0X2lkCgogICAgZGVmIGZpbGVzX2NoYW5nZWRfc3VtbWFyeV9mb3Jf
Y29tbWl0KHNlbGYsIGNvbW1pdF9pZCk6CiAgICAgICAgcmV0dXJuIHN1YnByb2Nlc3MuUG9wZW4o
ImdpdCBkaWZmLXRyZWUgLS1zaG9ydHN0YXQgLS1uby1jb21taXQtaWQgIiArIGNvbW1pdF9pZCwg
c3Rkb3V0PXN1YnByb2Nlc3MuUElQRSwgc2hlbGw9VHJ1ZSkuY29tbXVuaWNhdGUoKVswXQogICAg
CiAgICBkZWYgc3VwcG9ydHNfbG9jYWxfY29tbWl0cyhzZWxmKToKICAgICAgICByZXR1cm4gVHJ1
ZQogICAgCiAgICBkZWYgZGlzcGxheV9uYW1lKHNlbGYpOgogICAgICAgIHJldHVybiAiZ2l0IgoK
ICAgIGRlZiBkaWZmX2NvbW1hbmQoc2VsZik6CiAgICAgICAgcmV0dXJuICJnaXQgZGlmZiBoZWFk
IgoKICAgIGRlZiBjb21taXRfbG9jYWxfY2hhbmdlcyhzZWxmKToKICAgICAgICBjb21taXRfbWVz
c2FnZSA9IGNvbW1pdF9tZXNzYWdlX2Zvcl90aGlzX2NvbW1pdChzZWxmKQogICAgICAgIGNvbW1p
dF9sb2cgPSBzZWxmLmNvbW1pdF93aXRoX21lc3NhZ2UoY29tbWl0X21lc3NhZ2UpCiAgICAgICAg
Y29tbWVudF90ZXh0ID0gYnVnX2NvbW1lbnRfZnJvbV9jb21taXRfdGV4dChjb21taXRfbG9nKQog
ICAgICAgIHJldHVybiBjb21tZW50X3RleHQKCgpjbGFzcyBDb21tYW5kOgogICAgZGVmIF9faW5p
dF9fKHNlbGYsIGhlbHBfdGV4dCwgYXJndW1lbnRfbmFtZXM9IiIsIG9wdGlvbnMgPSBbXSk6CiAg
ICAgICAgc2VsZi5oZWxwX3RleHQgPSBoZWxwX3RleHQKICAgICAgICBzZWxmLmFyZ3VtZW50X25h
bWVzID0gYXJndW1lbnRfbmFtZXMKICAgICAgICBzZWxmLm9wdGlvbnMgPSBvcHRpb25zCiAgICAg
ICAgc2VsZi5vcHRpb25zX3BhcnNlciA9IE9wdGlvblBhcnNlcih1c2FnZT1TVVBQUkVTU19VU0FH
RSwgYWRkX2hlbHBfb3B0aW9uPUZhbHNlLCBvcHRpb25fbGlzdD1zZWxmLm9wdGlvbnMpCiAgICAK
ICAgIGRlZiBuYW1lX3dpdGhfYXJndW1lbnRzKHNlbGYsIGNvbW1hbmRfbmFtZSk6CiAgICAgICAg
dXNhZ2Vfc3RyaW5nID0gY29tbWFuZF9uYW1lCiAgICAgICAgaWYgKGxlbihzZWxmLm9wdGlvbnMp
ID4gMCk6CiAgICAgICAgICAgIHVzYWdlX3N0cmluZyArPSAiIFtvcHRpb25zXSIKICAgICAgICBp
ZiAoc2VsZi5hcmd1bWVudF9uYW1lcyAhPSAiIik6CiAgICAgICAgICAgIHVzYWdlX3N0cmluZyAr
PSAiICIgKyBzZWxmLmFyZ3VtZW50X25hbWVzCiAgICAgICAgcmV0dXJuIHVzYWdlX3N0cmluZwoK
ICAgIGRlZiBwYXJzZV9hcmdzKHNlbGYsIGFyZ3MsIHRvb2wpOgogICAgICAgIHJldHVybiBzZWxm
Lm9wdGlvbl9wYXJzZXIucGFyc2VfYXJncyhhcmdzKQoKICAgIGRlZiBleGVjdXRlKHNlbGYsIG9w
dGlvbnMsIGFyZ3MpOgogICAgICAgIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IsICJzdWJjbGFz
c2VzIG11c3QgaW1wbGVtZW50IgoKCmNsYXNzIEJ1Z3NJbkNvbW1pdFF1ZXVlIChDb21tYW5kKToK
ICAgIGRlZiBfX2luaXRfXyhzZWxmKToKICAgICAgICBDb21tYW5kLl9faW5pdF9fKHNlbGYsICdC
dWdzIGluIHRoZSBjb21taXQgcXVldWUnKQoKICAgIGRlZiBleGVjdXRlKHNlbGYsIG9wdGlvbnMs
IGFyZ3MsIHRvb2wpOgogICAgICAgIGJ1Z19pZHMgPSB0b29sLmJ1Z3MuZmV0Y2hfYnVnX2lkc19m
cm9tX2NvbW1pdF9xdWV1ZSgpCiAgICAgICAgZm9yIGJ1Z19pZCBpbiBidWdfaWRzOgogICAgICAg
ICAgICBwcmludCB0b29sLmJ1Z3MuYnVnX3VybF9mb3JfYnVnX2lkKGJ1Z19pZCkKCgpjbGFzcyBQ
YXRjaGVzSW5Db21taXRRdWV1ZSAoQ29tbWFuZCk6CiAgICBkZWYgX19pbml0X18oc2VsZik6CiAg
ICAgICAgQ29tbWFuZC5fX2luaXRfXyhzZWxmLCAnUGF0Y2hlcyBhdHRhY2hlZCB0byBidWdzIGlu
IHRoZSBjb21taXQgcXVldWUnKQoKICAgIGRlZiBleGVjdXRlKHNlbGYsIG9wdGlvbnMsIGFyZ3Ms
IHRvb2wpOgogICAgICAgIHBhdGNoZXMgPSB0b29sLmJ1Z3MuZmV0Y2hfcGF0Y2hlc19mcm9tX2Nv
bW1pdF9xdWV1ZSgpCiAgICAgICAgbG9nKCJQYXRjaGVzIGluIGNvbW1pdCBxdWV1ZToiKQogICAg
ICAgIGZvciBwYXRjaCBpbiBwYXRjaGVzOgogICAgICAgICAgICBwcmludCBwYXRjaFsndXJsJ10K
CgpjbGFzcyBSZXZpZXdlZFBhdGNoZXNPbkJ1ZyAoQ29tbWFuZCk6CiAgICBkZWYgX19pbml0X18o
c2VsZik6CiAgICAgICAgQ29tbWFuZC5fX2luaXRfXyhzZWxmLCAncitcJ2QgcGF0Y2hlcyBvbiBh
IGJ1ZycsICdCVUdJRCcpCgogICAgZGVmIGV4ZWN1dGUoc2VsZiwgb3B0aW9ucywgYXJncywgdG9v
bCk6CiAgICAgICAgYnVnX2lkID0gYXJnc1swXQogICAgICAgIHBhdGNoZXNfdG9fbGFuZCA9IHRv
b2wuYnVncy5mZXRjaF9yZXZpZXdlZF9wYXRjaGVzX2Zyb21fYnVnKGJ1Z19pZCkKICAgICAgICBm
b3IgcGF0Y2ggaW4gcGF0Y2hlc190b19sYW5kOgogICAgICAgICAgICBwcmludCBwYXRjaFsndXJs
J10KCgpjbGFzcyBBcHBseVBhdGNoZXNGcm9tQnVnIChDb21tYW5kKToKICAgIGRlZiBfX2luaXRf
XyhzZWxmKToKICAgICAgICBDb21tYW5kLl9faW5pdF9fKHNlbGYsICdBcHBsaWVzIGFsbCBwYXRj
aGVzIG9uIGEgYnVnIHRvIHRoZSBsb2NhbCB3b3JraW5nIGRpcmVjdG9yeSB3aXRob3V0IGNvbW1p
dHRpbmcuJywgJ0JVR0lEJykKCiAgICBkZWYgZXhlY3V0ZShzZWxmLCBvcHRpb25zLCBhcmdzLCB0
b29sKToKICAgICAgICBidWdfaWQgPSBhcmdzWzBdCiAgICAgICAgcGF0Y2hlcyA9IHRvb2wuYnVn
cy5mZXRjaF9yZXZpZXdlZF9wYXRjaGVzX2Zyb21fYnVnKGJ1Z19pZCkKICAgICAgICB0b29sLnNj
bS51cGRhdGVfYW5kX2NsZWFyX3dvcmtpbmdfZGlyZWN0b3J5KCkKICAgICAgICAjIFNob3VsZCB3
ZSBlcnJvciBvdXQgaWYgdG9vbC5zY20gZG9lcyBub3Qgc3VwcG9ydCBsb2NhbCBjb21taXRzPwog
ICAgICAgIGZvciBwYXRjaCBpbiBwYXRjaGVzOgogICAgICAgICAgICB0b29sLnNjbS5hcHBseV9w
YXRjaChwYXRjaCkKCgpjbGFzcyBMYW5kQW5kVXBkYXRlQnVnIChDb21tYW5kKToKICAgIGRlZiBf
X2luaXRfXyhzZWxmKToKICAgICAgICBDb21tYW5kLl9faW5pdF9fKHNlbGYsICdMYW5kcyB0aGUg
Y3VycmVudCB3b3JraW5nIGRpcmVjdG9yeSBkaWZmIGFuZCB1cGRhdGVzIHRoZSBidWcuJywgJ0JV
R0lEJykKCiAgICBkZWYgZXhlY3V0ZShzZWxmLCBvcHRpb25zLCBhcmdzLCB0b29sKToKICAgICAg
ICBidWdfaWQgPSBhcmdzWzBdCiAgICAgICAgY29tbWl0X3RleHQgPSB0b29sLnNjbS5jb21taXRf
bG9jYWxfY2hhbmdlcygpCiAgICAgICAgdG9vbC5idWdzLmNsb3NlX2J1Z19hc19maXhlZChidWdf
aWQsIGNvbW1pdF90ZXh0KQoKCmNsYXNzIFNjcmlwdEVycm9yKEV4Y2VwdGlvbik6CiAgICBwYXNz
CgpjbGFzcyBMYW5kUGF0Y2hlc0Zyb21CdWcgKENvbW1hbmQpOgogICAgZGVmIF9faW5pdF9fKHNl
bGYpOgogICAgICAgIG9wdGlvbnMgPSBbCiAgICAgICAgICAgIG1ha2Vfb3B0aW9uKCItLW5vLWJ1
aWxkIiwgYWN0aW9uPSJzdG9yZV9mYWxzZSIsIGRlc3Q9ImJ1aWxkIiwgZGVmYXVsdD1UcnVlLCBo
ZWxwPSJDb21taXQgd2l0aG91dCBidWlsZGluZyBmaXJzdCwgaW1wbGllcyAtLW5vLXRlc3QuIiks
CiAgICAgICAgICAgIG1ha2Vfb3B0aW9uKCItLW5vLXRlc3QiLCBhY3Rpb249InN0b3JlX2ZhbHNl
IiwgZGVzdD0idGVzdCIsIGRlZmF1bHQ9VHJ1ZSwgaGVscD0iQ29tbWl0IHdpdGhvdXQgcnVubm5p
bmcgcnVuLXdlYmtpdC10ZXN0cy4iKQogICAgICAgIF0KICAgICAgICBDb21tYW5kLl9faW5pdF9f
KHNlbGYsICdMYW5kcyBhbGwgcGF0Y2hlcyBvbiBhIGJ1ZyBvcHRpb25hbGx5IHRlc3RpbmcgdGhl
bSBmaXJzdCcsICdCVUdJRCcsIG9wdGlvbnM9b3B0aW9ucykKCiAgICBkZWYgcnVuX2FuZF90aHJv
d19pZl9mYWlsKHNlbGYsIHNjcmlwdF9uYW1lKToKICAgICAgICBidWlsZF93ZWJraXRfcHJvY2Vz
cyA9IHN1YnByb2Nlc3MuUG9wZW4oc2NyaXB0X25hbWUsIHNoZWxsPVRydWUpCiAgICAgICAgcmV0
dXJuX2NvZGUgPSBidWlsZF93ZWJraXRfcHJvY2Vzcy53YWl0KCkKICAgICAgICBpZiByZXR1cm5f
Y29kZSAhPSAwOgogICAgICAgICAgICByYWlzZSBTY3JpcHRFcnJvcihzY3JpcHRfbmFtZSArICIg
ZmFpbGVkIHdpdGggY29kZSAiICsgcmV0dXJuX2NvZGUpCgogICAgZGVmIGJ1aWxkX3dlYmtpdChz
ZWxmKToKICAgICAgICBzZWxmLnJ1bl9hbmRfdGhyb3dfaWZfZmFpbCgiYnVpbGQtd2Via2l0IikK
CiAgICBkZWYgcnVuX3dlYmtpdF90ZXN0cyhzZWxmKToKICAgICAgICBzZWxmLnJ1bl9hbmRfdGhy
b3dfaWZfZmFpbCgicnVuLXdlYmtpdC10ZXN0cyIpCgogICAgZGVmIGV4ZWN1dGUoc2VsZiwgb3B0
aW9ucywgYXJncywgdG9vbCk6CiAgICAgICAgYnVnX2lkID0gYXJnc1swXQoKICAgICAgICB0cnk6
CiAgICAgICAgICAgIHBhdGNoZXMgPSB0b29sLmJ1Z3MuZmV0Y2hfcmV2aWV3ZWRfcGF0Y2hlc19m
cm9tX2J1ZyhidWdfaWQpCiAgICAgICAgICAgIGNvbW1pdF90ZXh0ID0gIiIKCiAgICAgICAgICAg
IGZvciBwYXRjaCBpbiBwYXRjaGVzOgogICAgICAgICAgICAgICAgdG9vbC5zY20udXBkYXRlX2Fu
ZF9jbGVhcl93b3JraW5nX2RpcmVjdG9yeSgpCiAgICAgICAgICAgICAgICB0b29sLnNjbS5hcHBs
eV9wYXRjaChwYXRjaCkKICAgICAgICAgICAgICAgIGlmIChvcHRpb25zLmJ1aWxkKToKICAgICAg
ICAgICAgICAgICAgICBzZWxmLmJ1aWxkX3dlYmtpdCgpCiAgICAgICAgICAgICAgICAgICAgaWYg
KG9wdGlvbnMudGVzdCk6CiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYucnVuX3dlYmtpdF90
ZXN0cygpCiAgICAgICAgICAgICAgICBjb21taXRfdGV4dCA9IHRvb2wuc2NtLmNvbW1pdF9sb2Nh
bF9jaGFuZ2VzKCkKICAgICAgICAgICAgICAgICMgaWYgd2UncmUgY29tbWl0aW5nIG1vcmUgdGhh
biBvbmUgcGF0Y2gsIHVwZGF0ZSB0aGUgYnVnIGFzIHdlIGdvCiAgICAgICAgICAgICAgICBpZiBs
ZW4ocGF0Y2hlcykgPiAxOgogICAgICAgICAgICAgICAgICAgIHRvb2wuYnVncy5vYnNvbGV0ZV9h
dHRhY2htZW50KHBhdGNoWydpZCddLCBjb21taXRfdGV4dCkKCiAgICAgICAgICAgIGlmIGxlbihw
YXRjaGVzKSA+IDE6CiAgICAgICAgICAgICAgICBjb21taXRfdGV4dCA9ICJBbGwgcmV2aWV3ZWQg
cGF0Y2hlcyBsYW5kZWQsIGNsb3NpbmcuIgoKICAgICAgICAgICAgdG9vbC5idWdzLmNsb3NlX2J1
Z19hc19maXhlZChidWdfaWQsIGNvbW1pdF90ZXh0KQogICAgICAgIGV4Y2VwdCBTY3JpcHRFcnJv
ciwgZXJyb3I6CiAgICAgICAgICAgIHByaW50IGVycm9yCiAgICAgICAgICAgICMgV2UgY291bGQg
YWRkIGEgY29tbWVudCB0byB0aGUgYnVnIGFib3V0IHRoZSBmYWlsdXJlCgoKY2xhc3MgQ29tbWl0
TWVzc2FnZUZvckN1cnJlbnREaWZmIChDb21tYW5kKToKICAgIGRlZiBfX2luaXRfXyhzZWxmKToK
ICAgICAgICBDb21tYW5kLl9faW5pdF9fKHNlbGYsICdQcmludHMgYSBjb21taXQgbWVzc2FnZSBz
dWl0YWJsZSBmb3IgdGhlIHVuY29tbWl0dGVkIGNoYW5nZXMuJykKCiAgICBkZWYgZXhlY3V0ZShz
ZWxmLCBvcHRpb25zLCBhcmdzLCB0b29sKToKICAgICAgICBwcmludCBjb21taXRfbWVzc2FnZV9m
b3JfdGhpc19jb21taXQodG9vbC5zY20pCgoKY2xhc3MgT2Jzb2xldGVBdHRhY2htZW50c09uQnVn
IChDb21tYW5kKToKICAgIGRlZiBfX2luaXRfXyhzZWxmKToKICAgICAgICBDb21tYW5kLl9faW5p
dF9fKHNlbGYsICdNYXJrcyBhbGwgYXR0YWNobWVudHMgb24gYSBidWcgYXMgb2Jzb2xldGUuJywg
J0JVR0lEJykKCiAgICBkZWYgZXhlY3V0ZShzZWxmLCBvcHRpb25zLCBhcmdzLCB0b29sKToKICAg
ICAgICBidWdfaWQgPSBhcmdzWzBdCiAgICAgICAgYXR0YWNobWVudHMgPSB0b29sLmJ1Z3MuZmV0
Y2hfYXR0YWNobWVudHNfZnJvbV9idWcoYnVnX2lkKQogICAgICAgIGZvciBhdHRhY2htZW50IGlu
IGF0dGFjaG1lbnRzOgogICAgICAgICAgICBpZiBub3QgYXR0YWNobWVudFsnb2Jzb2xldGUnXToK
ICAgICAgICAgICAgICAgIHRvb2wuYnVncy5vYnNvbGV0ZV9hdHRhY2htZW50KGF0dGFjaG1lbnRb
J2lkJ10pCgoKY2xhc3MgUG9zdERpZmZBc1BhdGNoVG9CdWcgKENvbW1hbmQpOgogICAgZGVmIF9f
aW5pdF9fKHNlbGYpOgogICAgICAgIENvbW1hbmQuX19pbml0X18oc2VsZiwgJ0F0dGFjaGVzIHRo
ZSBjdXJyZW50IHdvcmtpbmcgZGlyZWN0b3J5IGRpZmYgdG8gYSBidWcgYXMgYSBwYXRjaCBmaWxl
LicsICdCVUdJRCcpCgogICAgZGVmIGV4ZWN1dGUoc2VsZiwgb3B0aW9ucywgYXJncywgdG9vbCk6
CiAgICAgICAgYnVnX2lkID0gYXJnc1swXQogICAgICAgIGRlc2NyaXB0aW9uID0gYXJnc1sxXQog
ICAgICAgICMgTmVlZCBhcmcgcGFyc2luZyEKICAgICAgICAKICAgICAgICBkaWZmX3Byb2Nlc3Mg
PSBzdWJwcm9jZXNzLlBvcGVuKHRvb2wuc2NtLmRpZmZfY29tbWFuZCgpLCBzdGRvdXQ9c3VicHJv
Y2Vzcy5QSVBFLCBzaGVsbD1UcnVlKQogICAgICAgIAogICAgICAgIHRvb2wuYnVncy5hZGRfcGF0
Y2hfdG9fYnVnKGJ1Z19pZCwgZGlmZl9wcm9jZXNzLnN0ZG91dCwgZGVzY3JpcHRpb24sIG1hcmtf
Zm9yX3Jldmlldz1UcnVlKQoKCmNsYXNzIFBvc3RDb21taXRzQXNQYXRjaGVzVG9CdWcgKENvbW1h
bmQpOgogICAgZGVmIF9faW5pdF9fKHNlbGYpOgogICAgICAgIENvbW1hbmQuX19pbml0X18oc2Vs
ZiwgJ0F0dGFjaGVzIGEgcmFuZ2Ugb2YgbG9jYWwgY29tbWl0cyB0byBhIGJ1ZyBhcyBwYXRjaCBm
aWxlcy4nLCAnQlVHSUQgQ09NTUlUSVNIJykKCiAgICBkZWYgZXhlY3V0ZShzZWxmLCBvcHRpb25z
LCBhcmdzLCB0b29sKToKICAgICAgICBidWdfaWQgPSBhcmdzWzBdCiAgICAgICAgCiAgICAgICAg
aWYgbm90IHRvb2wuc2NtLnN1cHBvcnRzX2xvY2FsX2NvbW1pdHMoKToKICAgICAgICAgICAgbG9n
KHRvb2wuc2NtLmRpc3BsYXlfbmFtZSgpICsgIiBkb2VzIG5vdCBzdXBwb3J0IGxvY2FsIGNvbW1p
dHMuIikKICAgICAgICAgICAgZXhpdCgxKQogICAgICAgIAogICAgICAgIGNvbW1pdF9pZHMgPSB0
b29sLnNjbS5jb21taXRfaWRzX2Zyb21fcmFuZ2VfYXJndW1lbnRzKGFyZ3NbMTpdKQogICAgICAg
IAogICAgICAgIGlmIGxlbihjb21taXRfaWRzKSA+IDEwOgogICAgICAgICAgICBsb2coIkFyZSB5
b3Ugc3VyZSB5b3Ugd2FudCB0byBhdHRhY2ggJWQgcGF0Y2hlcyB0byBidWcgJXM/IiAlIChsZW4o
Y29tbWl0X2lkcyksIGJ1Z19pZCkpCiAgICAgICAgICAgICMgU2hvdWxkIHN1cHBvcnQgYSAtLWZv
cmNlIG9wdGlvbgogICAgICAgICAgICBleGl0KDEpCiAgICAgICAgCiAgICAgICAgbG9nKCJBdHRh
Y2hpbmcgJWQgY29tbWl0cyBhcyBwYXRjaGVzIHRvIGJ1ZyAlcyIgJSAobGVuKGNvbW1pdF9pZHMp
LCBidWdfaWQpKQogICAgICAgIGZvciBjb21taXRfaWQgaW4gY29tbWl0X2lkczoKICAgICAgICAg
ICAgY29tbWl0X21lc3NhZ2UgPSB0b29sLnNjbS5jb21taXRfbWVzc2FnZV9mb3JfY29tbWl0KGNv
bW1pdF9pZCkKICAgICAgICAgICAgY29tbWl0X2xpbmVzID0gY29tbWl0X21lc3NhZ2Uuc3BsaXRs
aW5lcygpCiAgICAgICAgICAgIAogICAgICAgICAgICBkZXNjcmlwdGlvbiA9IGNvbW1pdF9saW5l
c1swXQogICAgICAgICAgICBjb21tZW50X3RleHQgPSAiXG4iLmpvaW4oY29tbWl0X2xpbmVzWzE6
XSkKICAgICAgICAKICAgICAgICAgICAgY29tbWVudF90ZXh0ICs9ICJcbi0tLVxuIgogICAgICAg
ICAgICBjb21tZW50X3RleHQgKz0gdG9vbC5zY20uZmlsZXNfY2hhbmdlZF9zdW1tYXJ5X2Zvcl9j
b21taXQoY29tbWl0X2lkKQogICAgICAgIAogICAgICAgICAgICAjIFRoaXMgaXMgYSBsaXR0bGUg
Yml0IG9mIGEgaGFjaywgdGhhdCB3ZSBwYXNzIHN0ZG91dCBhcyB0aGUgcGF0Y2ggZmlsZQogICAg
ICAgICAgICAjIFdlIGNvdWxkIGFsdGVybmF0aXZlbHkgbWFrZSBhbiBpbi1tZW1vcnkgZmlsZS1s
aWtlIG9iamVjdCB3aXRoIHRoZSBwYXRjaCBjb250ZW50cwogICAgICAgICAgICBkaWZmX3Byb2Nl
c3MgPSBzdWJwcm9jZXNzLlBvcGVuKHRvb2wuc2NtLnNob3dfZGlmZl9jb21tYW5kX2Zvcl9jb21t
aXQoY29tbWl0X2lkKSwgc3Rkb3V0PXN1YnByb2Nlc3MuUElQRSwgc2hlbGw9VHJ1ZSkKICAgICAg
ICAgICAgdG9vbC5idWdzLmFkZF9wYXRjaF90b19idWcoYnVnX2lkLCBkaWZmX3Byb2Nlc3Muc3Rk
b3V0LCBkZXNjcmlwdGlvbiwgY29tbWVudF90ZXh0LCBtYXJrX2Zvcl9yZXZpZXc9VHJ1ZSkKCgpj
bGFzcyBOb25XcmFwcGluZ0VwaWxvZ0luZGVudGVkSGVscEZvcm1hdHRlciAoSW5kZW50ZWRIZWxw
Rm9ybWF0dGVyKToKICAgIGRlZiBfX2luaXRfXyhzZWxmKToKICAgICAgICBJbmRlbnRlZEhlbHBG
b3JtYXR0ZXIuX19pbml0X18oc2VsZikKCiAgICAjIFRoZSBzdGFuZGFyZCBJbmRlbnRlZEhlbHBG
b3JtYXR0ZXIgcmUtd3JhcHMgdGhlIGVwaWxvZyEKICAgIGRlZiBmb3JtYXRfZXBpbG9nKHNlbGYs
IGVwaWxvZyk6CiAgICAgICAgaWYgZXBpbG9nOgogICAgICAgICAgICByZXR1cm4gIlxuIiArIGVw
aWxvZyArICJcbiIKICAgICAgICBlbHNlOgogICAgICAgICAgICByZXR1cm4gIiIKCmNsYXNzIEJ1
Z3ppbGxhVG9vbDoKICAgIGRlZiBfX2luaXRfXyhzZWxmKToKICAgICAgICBzZWxmLnNjbSA9IEdp
dCgpCiAgICAgICAgc2VsZi5idWdzID0gQnVnemlsbGEoKQogICAgICAgIHNlbGYuY29tbWFuZHMg
PSBbCiAgICAgICAgICAgIHsgJ25hbWUnIDogJ2J1Z3MtdG8tY29tbWl0JywgJ29iamVjdCcgOiBC
dWdzSW5Db21taXRRdWV1ZSgpIH0sCiAgICAgICAgICAgIHsgJ25hbWUnIDogJ3BhdGNoZXMtdG8t
Y29tbWl0JywgJ29iamVjdCcgOiBQYXRjaGVzSW5Db21taXRRdWV1ZSgpIH0sCiAgICAgICAgICAg
IHsgJ25hbWUnIDogJ3Jldmlld2VkLXBhdGNoZXMnLCAnb2JqZWN0JyA6IFJldmlld2VkUGF0Y2hl
c09uQnVnKCkgfSwKICAgICAgICAgICAgeyAnbmFtZScgOiAnYXBwbHktcGF0Y2hlcycsICdvYmpl
Y3QnIDogQXBwbHlQYXRjaGVzRnJvbUJ1ZygpIH0sCiAgICAgICAgICAgIHsgJ25hbWUnIDogJ2xh
bmQtYW5kLXVwZGF0ZScsICdvYmplY3QnIDogTGFuZEFuZFVwZGF0ZUJ1ZygpIH0sCiAgICAgICAg
ICAgIHsgJ25hbWUnIDogJ2xhbmQtcGF0Y2hlcycsICdvYmplY3QnIDogTGFuZFBhdGNoZXNGcm9t
QnVnKCkgfSwKICAgICAgICAgICAgeyAnbmFtZScgOiAnY29tbWl0LW1lc3NhZ2UnLCAnb2JqZWN0
JyA6IENvbW1pdE1lc3NhZ2VGb3JDdXJyZW50RGlmZigpIH0sCiAgICAgICAgICAgIHsgJ25hbWUn
IDogJ29ic29sZXRlLWF0dGFjaG1lbnRzJywgJ29iamVjdCcgOiBPYnNvbGV0ZUF0dGFjaG1lbnRz
T25CdWcoKSB9LAogICAgICAgICAgICB7ICduYW1lJyA6ICdwb3N0LWRpZmYnLCAnb2JqZWN0JyA6
IFBvc3REaWZmQXNQYXRjaFRvQnVnKCkgfSwKICAgICAgICAgICAgeyAnbmFtZScgOiAncG9zdC1j
b21taXRzJywgJ29iamVjdCcgOiBQb3N0Q29tbWl0c0FzUGF0Y2hlc1RvQnVnKCkgfSwKICAgICAg
ICBdCiAgICAgICAgCiAgICAgICAgc2VsZi5nbG9iYWxfb3B0aW9uX3BhcnNlciA9IE9wdGlvblBh
cnNlcih1c2FnZT1zZWxmLnVzYWdlX2xpbmUoKSwgZm9ybWF0dGVyPU5vbldyYXBwaW5nRXBpbG9n
SW5kZW50ZWRIZWxwRm9ybWF0dGVyKCksIGVwaWxvZz1zZWxmLmNvbW1hbmRzX3VzYWdlKCkpCiAg
ICAgICAgc2VsZi5nbG9iYWxfb3B0aW9uX3BhcnNlci5hZGRfb3B0aW9uKCItLWRyeS1ydW4iLCBh
Y3Rpb249InN0b3JlX3RydWUiLCBkZXN0PSJkcnlydW4iLCBoZWxwPSJkbyBub3QgdG91Y2ggcmVt
b3RlIHNlcnZlcnMiLCBkZWZhdWx0PUZhbHNlKQogICAgCiAgICBkZWYgdXNhZ2VfbGluZShzZWxm
KToKICAgICAgICByZXR1cm4gIlVzYWdlOiAlcHJvZyBbb3B0aW9uc10gY29tbWFuZCBbY29tbWFu
ZC1vcHRpb25zXSBbY29tbWFuZC1hcmd1bWVudHNdIgogICAgCiAgICBkZWYgY29tbWFuZHNfdXNh
Z2Uoc2VsZik6CiAgICAgICAgY29tbWFuZHNfdGV4dCA9ICJDb21tYW5kczpcbiIKICAgICAgICBs
b25nZXN0X25hbWVfbGVuZ3RoID0gMAogICAgICAgIGNvbW1hbmRfcm93cyA9IFtdCiAgICAgICAg
Zm9yIGNvbW1hbmQgaW4gc2VsZi5jb21tYW5kczoKICAgICAgICAgICAgY29tbWFuZF9vYmplY3Qg
PSBjb21tYW5kWydvYmplY3QnXQogICAgICAgICAgICBjb21tYW5kX25hbWVfYW5kX2FyZ3MgPSBj
b21tYW5kX29iamVjdC5uYW1lX3dpdGhfYXJndW1lbnRzKGNvbW1hbmRbJ25hbWUnXSkKICAgICAg
ICAgICAgY29tbWFuZF9yb3dzLmFwcGVuZCh7ICduYW1lLWFuZC1hcmdzJzogY29tbWFuZF9uYW1l
X2FuZF9hcmdzLCAnb2JqZWN0JzogY29tbWFuZF9vYmplY3QgfSkKICAgICAgICAgICAgbG9uZ2Vz
dF9uYW1lX2xlbmd0aCA9IG1heChbbG9uZ2VzdF9uYW1lX2xlbmd0aCwgbGVuKGNvbW1hbmRfbmFt
ZV9hbmRfYXJncyldKQogICAgICAgIAogICAgICAgICMgVXNlIG91ciBvd24gaGVscCBmb3JtYXR0
ZXIgc28gYXMgdG8gaW5kZW50IGVub3VnaAogICAgICAgIGZvcm1hdHRlciA9IEluZGVudGVkSGVs
cEZvcm1hdHRlcigpCiAgICAgICAgZm9ybWF0dGVyLmluZGVudCgpCiAgICAgICAgZm9ybWF0dGVy
LmluZGVudCgpCiAgICAgICAgCiAgICAgICAgZm9yIHJvdyBpbiBjb21tYW5kX3Jvd3M6CiAgICAg
ICAgICAgIGNvbW1hbmRfb2JqZWN0ID0gcm93WydvYmplY3QnXQogICAgICAgICAgICBjb21tYW5k
c190ZXh0ICs9ICIgICIgKyByb3dbJ25hbWUtYW5kLWFyZ3MnXS5sanVzdChsb25nZXN0X25hbWVf
bGVuZ3RoICsgMykgKyBjb21tYW5kX29iamVjdC5oZWxwX3RleHQgKyAiXG4iCiAgICAgICAgICAg
IGNvbW1hbmRzX3RleHQgKz0gY29tbWFuZF9vYmplY3Qub3B0aW9uc19wYXJzZXIuZm9ybWF0X29w
dGlvbl9oZWxwKGZvcm1hdHRlcikKICAgICAgICByZXR1cm4gY29tbWFuZHNfdGV4dAoKICAgIGRl
ZiBwYXJzZV9nbG9iYWxfYXJncyhzZWxmLCBhcmdzKToKICAgICAgICAob3B0aW9ucywgYXJncykg
PSBzZWxmLmdsb2JhbF9vcHRpb25fcGFyc2VyLnBhcnNlX2FyZ3MoYXJncykKICAgICAgICBpZiBs
ZW4oYXJncyk6CiAgICAgICAgICAgIHNlbGYuZ2xvYmFsX29wdGlvbl9wYXJzZXIuZXJyb3IoIkV4
dHJhIGFyZ3VtZW50cyBiZWZvcmUgY29tbWFuZDogIiArIGFyZ3MpCiAgICAgICAgCiAgICAgICAg
aWYgb3B0aW9ucy5kcnlydW46CiAgICAgICAgICAgIHNlbGYuc2NtLmRyeXJ1biA9IFRydWUKICAg
ICAgICAgICAgc2VsZi5idWdzLmRyeXJ1biA9IFRydWUKICAgIAogICAgZGVmIHNwbGl0X2FyZ3Mo
c2VsZiwgYXJncyk6CiAgICAgICAgIyBBc3N1bWUgdGhlIGZpcnN0IGFyZ3VtZW50IHdoaWNoIGRv
ZXNuJ3Qgc3RhcnQgd2l0aCAnLScgaXMgdGhlIGNvbW1hbmQgbmFtZQogICAgICAgIGNvbW1hbmRf
aW5kZXggPSAwCiAgICAgICAgZm9yIGFyZyBpbiBhcmdzOgogICAgICAgICAgICBpZiBhcmdbMF0g
IT0gJy0nOgogICAgICAgICAgICAgICAgYnJlYWsKICAgICAgICAgICAgY29tbWFuZF9pbmRleCAr
PSAxCgogICAgICAgIGdsb2JhbF9hcmdzID0gYXJnc1s6Y29tbWFuZF9pbmRleF0KICAgICAgICBj
b21tYW5kID0gYXJnc1tjb21tYW5kX2luZGV4XSBpZiBjb21tYW5kX2luZGV4IDwgbGVuKGFyZ3Mp
IGVsc2UgTm9uZQogICAgICAgIGNvbW1hbmRfYXJncyA9IGFyZ3NbY29tbWFuZF9pbmRleDpdCiAg
ICAgICAgcmV0dXJuIChnbG9iYWxfYXJncywgY29tbWFuZCwgY29tbWFuZF9hcmdzKQogICAgCiAg
ICBkZWYgY29tbWFuZF9ieV9uYW1lKHNlbGYsIGNvbW1hbmRfbmFtZSk6CiAgICAgICAgZm9yIGNv
bW1hbmQgaW4gc2VsZi5jb21tYW5kczoKICAgICAgICAgICAgaWYgY29tbWFuZF9uYW1lID09IGNv
bW1hbmRbJ25hbWUnXToKICAgICAgICAgICAgICAgIHJldHVybiBjb21tYW5kCiAgICAgICAgcmV0
dXJuIE5vbmUKICAgIAogICAgZGVmIG1haW4oc2VsZik6CiAgICAgICAgKGdsb2JhbF9hcmdzLCBj
b21tYW5kX25hbWUsIGFyZ3NfYWZ0ZXJfY29tbWFuZF9uYW1lKSA9IHNlbGYuc3BsaXRfYXJncyhz
eXMuYXJndlsxOl0pCiAgICAgICAgCiAgICAgICAgIyBIYW5kbGUgLS1oZWxwLCBldGM6CiAgICAg
ICAgc2VsZi5wYXJzZV9nbG9iYWxfYXJncyhnbG9iYWxfYXJncykKICAgICAgICAKICAgICAgICBp
ZiBub3QgY29tbWFuZF9uYW1lOgogICAgICAgICAgICBzZWxmLmdsb2JhbF9vcHRpb25fcGFyc2Vy
LmVycm9yKCJObyBjb21tYW5kIHNwZWNpZmllZCIpCiAgICAgICAgCiAgICAgICAgY29tbWFuZCA9
IHNlbGYuY29tbWFuZF9ieV9uYW1lKGNvbW1hbmRfbmFtZSkKICAgICAgICBpZiBub3QgY29tbWFu
ZDoKICAgICAgICAgICAgc2VsZi5nbG9iYWxfb3B0aW9uX3BhcnNlci5lcnJvcihjb21tYW5kX25h
bWUgKyAiIGlzIG5vdCBhIHJlY29nbml6ZWQgY29tbWFuZCIpCgogICAgICAgIGxvYWRfY29uZmln
KCkKICAgICAgICAKICAgICAgICBjb21tYW5kX29iamVjdCA9IGNvbW1hbmRbJ29iamVjdCddCiAg
ICAgICAgKGNvbW1hbmRfb3B0aW9ucywgY29tbWFuZF9hcmdzKSA9IGNvbW1hbmRfb2JqZWN0LnBh
cnNlX2FyZ3MoYXJnc19hZnRlcl9jb21tYW5kX25hbWUpCiAgICAgICAgcmV0dXJuIGNvbW1hbmRf
b2JqZWN0LmV4ZWN1dGUoY29tbWFuZF9vcHRpb25zLCBjb21tYW5kX2FyZ3MsIHNlbGYpCgoKZGVm
IG1haW4oKToKICAgIHRvb2wgPSBCdWd6aWxsYVRvb2woKQogICAgcmV0dXJuIHRvb2wubWFpbigp
CgppZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgogICAgbWFpbigpCg==
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>31516</attachid>
            <date>2009-06-18 16:05:02 -0700</date>
            <delta_ts>2009-06-19 16:38:18 -0700</delta_ts>
            <desc>Working bugzilla-tool for review (script posted this patch itself)</desc>
            <filename>bugzilla_requires_a_filename.patch</filename>
            <type>text/plain</type>
            <size>36869</size>
            <attacher name="Eric Seidel (no email)">eric</attacher>
            
              <data encoding="base64">ZjcwZTllZjY3NzcyYmI5YWViNDM3OTFjODRmOGQwNWM4Y2JkYzQ5YwpkaWZmIC0tZ2l0IGEvV2Vi
S2l0VG9vbHMvQ2hhbmdlTG9nIGIvV2ViS2l0VG9vbHMvQ2hhbmdlTG9nCmluZGV4IDRhODFlZGUu
Ljk3YTk4N2EgMTAwNjQ0Ci0tLSBhL1dlYktpdFRvb2xzL0NoYW5nZUxvZworKysgYi9XZWJLaXRU
b29scy9DaGFuZ2VMb2cKQEAgLTEsMyArMSw1OCBAQAorMjAwOS0wNi0xOCAgRXJpYyBTZWlkZWwg
IDxlcmljQHdlYmtpdC5vcmc+CisKKyAgICAgICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChPT1BTISku
CisKKyAgICAgICAgV2ViS2l0IG5lZWRzIGEgc2NyaXB0IHRvIGludGVyYWN0IHdpdGggYnVnemls
bGEgYW5kIGF1dG9tYXRlCisgICAgICAgIHBhcnRzIG9mIHRoZSBwYXRjaCBwb3N0aW5nIGFuZCBj
b21taXQgcHJvY2Vzc2VzLgorICAgICAgICBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1
Zy5jZ2k/aWQ9MjYyODMKKworICAgICAgICBUaGlzIGlzIHJlYWxseSBhIGZpcnN0LWRyYWZ0IHRv
b2wuCisgICAgICAgIEl0J3MgdG8gdGhlIHBvaW50IHdoZXJlIGl0J3MgdXNlZnVsIHRvIG1vcmUg
cGVvcGxlIHRoYW4ganVzdCBtZSBub3cgdGhvdWdoLgorICAgICAgICBHaXQgc3VwcG9ydCB3b3Jr
cy4gIFNWTiBzdXBwb3J0IGlzIHdyaXR0ZW4sIGJ1dCB1bnRlc3RlZC4KKworICAgICAgICBUaGlz
IHRvb2wgcmVxdWlyZXMgQmVhdXRpZnVsU291cCBhbmQgbWVjaGFuaXplIHB5dGhvbiBtb2R1bGVz
IHRvIHJ1bjoKKyAgICAgICAgc3VkbyBlYXN5X2luc3RhbGwgQmVhdXRpZnVsU291cAorICAgICAg
ICBzdWRvIGVhc3lfaW5zdGFsbCBtZWNoYW5pemUKKworICAgICAgICBNb3JlIGltcG9ydGFudCB0
aGFuIHRoZSB0b29sIGl0c2VsZiBhcmUgdGhlIEJ1Z3ppbGxhLCBHaXQgYW5kIFNWTiBjbGFzcyBh
YnN0cmFjdGlvbnMKKyAgICAgICAgd2hpY2ggSSBob3BlIHdpbGwgYWxsb3cgZWFzeSB3cml0aW5n
IG9mIGZ1dHVyZSB0b29scy4KKworICAgICAgICBJIGludGVuZCB0byBicmVhayBHaXQsIFNWTiBh
bmQgU0NNIG91dCBpbnRvIGFuIHNjbXRvb2xzLnB5IG1vZHVsZSBhZnRlciBsYW5kaW5nLgorICAg
ICAgICBMaWtld2lzZSwgQnVnemlsbGEgaW50byBhIGJ1Z3ppbGxhLnB5IG1vZHVsZS4gIEkgZmVs
dCBpdCB3b3VsZCBiZSBlYXNpZXIgdG8gcmV2aWV3IGluIG9uZSBmaWxlLgorCisgICAgICAgIFRo
ZSB0b29sIGN1cnJlbnRseSBpbXBsZW1lbnRzIDEwIGNvbW1hbmRzLCBkZXNjcmliZWQgYmVsb3cu
CisKKyAgICAgICAgSGVscGVycyBmb3Igc2NyaXB0aW5nIGRlYWxpbmcgd2l0aCB0aGUgY29tbWl0
IHF1ZXVlOgorICAgICAgICBidWdzLXRvLWNvbW1pdCAgICAgICAgICAgICAgICAgQnVncyBpbiB0
aGUgY29tbWl0IHF1ZXVlCisgICAgICAgIHBhdGNoZXMtdG8tY29tbWl0ICAgICAgICAgICAgICBQ
YXRjaGVzIGF0dGFjaGVkIHRvIGJ1Z3MgaW4gdGhlIGNvbW1pdCBxdWV1ZQorCisgICAgICAgIERl
YWxpbmcgd2l0aCBidWd6aWxsYToKKyAgICAgICAgcmV2aWV3ZWQtcGF0Y2hlcyBCVUdJRCAgICAg
ICAgIHIrJ2QgcGF0Y2hlcyBvbiBhIGJ1ZworICAgICAgICBhcHBseS1wYXRjaGVzIEJVR0lEICAg
ICAgICAgICAgQXBwbGllcyBhbGwgcGF0Y2hlcyBvbiBhIGJ1ZyB0byB0aGUgbG9jYWwgd29ya2lu
ZyBkaXJlY3Rvcnkgd2l0aG91dCBjb21taXR0aW5nLgorICAgICAgICBsYW5kLWFuZC11cGRhdGUg
QlVHSUQgICAgICAgICAgTGFuZHMgdGhlIGN1cnJlbnQgd29ya2luZyBkaXJlY3RvcnkgZGlmZiBh
bmQgdXBkYXRlcyB0aGUgYnVnLgorICAgICAgICBsYW5kLXBhdGNoZXMgW29wdGlvbnNdIEJVR0lE
ICAgTGFuZHMgYWxsIHBhdGNoZXMgb24gYSBidWcgb3B0aW9uYWxseSB0ZXN0aW5nIHRoZW0gZmly
c3QKKyAgICAgICAgb2Jzb2xldGUtYXR0YWNobWVudHMgQlVHSUQgICAgIE1hcmtzIGFsbCBhdHRh
Y2htZW50cyBvbiBhIGJ1ZyBhcyBvYnNvbGV0ZS4KKyAgICAgICAgY29tbWl0LW1lc3NhZ2UgICAg
ICAgICAgICAgICAgIFByaW50cyBhIGNvbW1pdCBtZXNzYWdlIHN1aXRhYmxlIGZvciB0aGUgdW5j
b21taXR0ZWQgY2hhbmdlcy4KKworICAgICAgICBUaGVzZSBlZmZlY3RpdmVseSByZXBsYWNlIGdp
dC1zZW5kLWJ1Z3ppbGxhOgorICAgICAgICBwb3N0LWRpZmYgQlVHSUQgICAgICAgICAgICAgICAg
QXR0YWNoZXMgdGhlIGN1cnJlbnQgd29ya2luZyBkaXJlY3RvcnkgZGlmZiB0byBhIGJ1ZyBhcyBh
IHBhdGNoIGZpbGUuCisgICAgICAgIHBvc3QtY29tbWl0cyBCVUdJRCBDT01NSVRJU0ggICBBdHRh
Y2hlcyBhIHJhbmdlIG9mIGxvY2FsIGNvbW1pdHMgdG8gYSBidWcgYXMgcGF0Y2ggZmlsZXMuCisK
KyAgICAgICAgcG9zdC1kaWZmIHdvcmtzIGZvciBTVk4gYW5kIEdpdCwgcG9zdC1jb21taXRzIG9u
bHkgd29ya3MgZm9yIFNDTXMgd2l0aCBsb2NhbC1jb21taXQgc3VwcG9ydCAobGlrZSBHaXQpCisK
KyAgICAgICAgbGFuZC0qIGNvbW1hbmRzIGluIGEgR2l0IGVudmlyb25tZW50IG9ubHkgd29yayB3
aXRoIHNpbXBsZSBwYXRjaGVzIGR1ZSB0byBzdm4tYXBwbHkgYnVnczoKKyAgICAgICAgaHR0cHM6
Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTI2Mjk5CisgICAgICAgIGh0dHBzOi8v
YnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0yNjMwMAorCisgICAgICAgIFRoaXMgc2Ny
aXB0IGZvbGxvd3MgcHl0aG9uIHN0eWxlIChzaW1pbGFyIHRvIGhvdyBmb3IgT2JqLUMgd2UgZm9s
bG93IEFwcEtpdCBzdHlsZSkKKyAgICAgICAgaHR0cDovL3d3dy5weXRob24ub3JnL2RvYy9lc3Nh
eXMvc3R5bGVndWlkZS5odG1sCisgICAgICAgIFRoZSBQeXRob24gY29tbXVuaXR5IGhhcyBhIHN0
cm9uZyBzdHlsZSBjdWx0dXJlIGFuZCB0aGUgV2ViS2l0IHN0eWxlIGd1aWRlIGlzIHNpbGVudCBy
ZTogUHl0aG9uLgorCisgICAgICAgIEkndmUgZmlsZWQgYSBidWcgdG8gdXBkYXRlIHRoZSBXZWJL
aXQgc3R5bGUgZ3VpZGUgdG8gbWVudGlvbiBweXRob246CisgICAgICAgIGh0dHBzOi8vYnVncy53
ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0yNjUyNAorCisgICAgICAgICogU2NyaXB0cy9idWd6
aWxsYS10b29sOiBBZGRlZC4KKwogMjAwOS0wNi0xOCAgRGFyaW4gQWRsZXIgIDxkYXJpbkBhcHBs
ZS5jb20+CiAKICAgICAgICAgUnViYmVyIHN0YW1wZWQgYnkgTWFyayBSb3dlLgpkaWZmIC0tZ2l0
IGEvV2ViS2l0VG9vbHMvU2NyaXB0cy9idWd6aWxsYS10b29sIGIvV2ViS2l0VG9vbHMvU2NyaXB0
cy9idWd6aWxsYS10b29sCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmE5Y2Fk
OTMKLS0tIC9kZXYvbnVsbAorKysgYi9XZWJLaXRUb29scy9TY3JpcHRzL2J1Z3ppbGxhLXRvb2wK
QEAgLTAsMCArMSw4NDggQEAKKyMhL3Vzci9iaW4vcHl0aG9uCisKKyMgQ29weXJpZ2h0IChDKSAy
MDA5IEdvb2dsZSwgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyMKKyMgUmVkaXN0cmlidXRp
b24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Cisj
IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcg
Y29uZGl0aW9ucworIyBhcmUgbWV0OgorIyAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNv
ZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorIyAgICBub3RpY2UsIHRoaXMgbGlz
dCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisjIDIuIFJlZGlz
dHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJp
Z2h0CisjICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dp
bmcgZGlzY2xhaW1lciBpbiB0aGUKKyMgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0
ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyMKKyMgVEhJUyBTT0ZUV0FS
RSBJUyBQUk9WSURFRCBCWSBBUFBMRSBDT01QVVRFUiwgSU5DLiBgYEFTIElTJycgQU5EIEFOWQor
IyBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlU
RUQgVE8sIFRIRQorIyBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBG
SVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyMgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5P
IEVWRU5UIFNIQUxMIEFQUExFIENPTVBVVEVSLCBJTkMuIE9SCisjIENPTlRSSUJVVE9SUyBCRSBM
SUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorIyBF
WEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJ
TUlURUQgVE8sCisjIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7
IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorIyBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJ
T04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisjIE9GIExJQUJJTElUWSwgV0hF
VEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorIyAoSU5DTFVESU5H
IE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBV
U0UKKyMgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElU
WSBPRiBTVUNIIERBTUFHRS4KKyMKKyMgQSB0b29sIGZvciBhdXRvbWF0aW5nIGRlYWxpbmcgd2l0
aCBidWd6aWxsYSwgcG9zdGluZyBwYXRjaGVzLCBjb21taXRpbmcgcGF0Y2hlcywgZXRjLgorCisj
IEZvciBHaXQ6CitpbXBvcnQgcmUKK2ltcG9ydCBvcworaW1wb3J0IHN1YnByb2Nlc3MKK2ltcG9y
dCBzeXMKKworIyBGb3IgQnVnemlsbGE6CitpbXBvcnQgZ2V0cGFzcworaW1wb3J0IHVybGxpYjIK
K2Zyb20gQmVhdXRpZnVsU291cCBpbXBvcnQgQmVhdXRpZnVsU291cAorZnJvbSBtZWNoYW5pemUg
aW1wb3J0IEJyb3dzZXIKKworIyBGb3IgQnVnemlsbGFUb29sOgorZnJvbSBvcHRwYXJzZSBpbXBv
cnQgT3B0aW9uUGFyc2VyLCBJbmRlbnRlZEhlbHBGb3JtYXR0ZXIsIFNVUFBSRVNTX1VTQUdFLCBt
YWtlX29wdGlvbgorCisKKyMgSEFDSzogVGhpcyBzaG91bGQgbm90IGRlcGVuZCBvbiBnaXQgZm9y
IGNvbmZpZyBzdG9yYWdlCitkZWYgcmVhZF9jb25maWcoa2V5KToKKyAgICAjIE5lZWQgYSB3YXkg
dG8gcmVhZCBmcm9tIHN2biB0b28KKyAgICBjb25maWdfcHJvY2VzcyA9IHN1YnByb2Nlc3MuUG9w
ZW4oImdpdCBjb25maWcgLS1nZXQgYnVnemlsbGEuIiArIGtleSwgc3Rkb3V0PXN1YnByb2Nlc3Mu
UElQRSwgc2hlbGw9VHJ1ZSkKKyAgICB2YWx1ZSA9IGNvbmZpZ19wcm9jZXNzLmNvbW11bmljYXRl
KClbMF0KKyAgICByZXR1cm5fY29kZSA9IGNvbmZpZ19wcm9jZXNzLndhaXQoKQorCisgICAgaWYg
cmV0dXJuX2NvZGUgIT0gMDoKKyAgICAgICAgcmV0dXJuIE5vbmUKKyAgICByZXR1cm4gdmFsdWUu
cnN0cmlwKCdcbicpCisKK2RlZiBjaGRpcl93ZWJraXQoKToKKyAgICAjIFdlIGNvdWxkIGluc3Rl
YWQgYXNrIHRoZSBTQ00gc3lzdGVtIGZvciBpdHMgcm9vdCBkaXJlY3RvcnkgKHNpbmNlIHdlIG5l
ZWQgdGhhdCBmb3IgbWFraW5nIHBhdGNoZXMgYXMgd2VsbCkKKyAgICBzY3JpcHRfZGlyZWN0b3J5
ID0gb3MucGF0aC5hYnNwYXRoKHN5cy5wYXRoWzBdKQorICAgIHdlYmtpdF9kaXJlY3RvcnkgPSBv
cy5wYXRoLmFic3BhdGgob3MucGF0aC5qb2luKHNjcmlwdF9kaXJlY3RvcnksICIuLi8uLiIpKQor
ICAgIHByaW50IHdlYmtpdF9kaXJlY3RvcnkKKyAgICBvcy5jaGRpcih3ZWJraXRfZGlyZWN0b3J5
KQorCisKK2RlZiBsb2coc3RyaW5nKToKKyAgICBwcmludCA+PiBzeXMuc3RkZXJyLCBzdHJpbmcK
KworZGVmIGVycm9yKHN0cmluZyk6CisgICAgbG9nKHN0cmluZykKKyAgICBleGl0KDEpCisKKwor
IyBUaGVzZSBjb3VsZCBiZSBwdXQgaW4gc29tZSBzb3J0IG9mIGNoYW5nZWxvZ3MucHkKK2RlZiBs
YXRlc3RfY2hhbmdlbG9nX2VudHJ5KGNoYW5nZWxvZ19wYXRoKToKKyAgICBlbnRyeV9saW5lcyA9
IFtdCisgICAgY2hhbmdlbG9nID0gb3BlbihjaGFuZ2Vsb2dfcGF0aCkKKyAgICB0cnk6CisgICAg
ICAgIGxvZygiUGFyc2luZyBDaGFuZ2VMb2c6ICIgKyBjaGFuZ2Vsb2dfcGF0aCkKKyAgICAgICAg
IyBUaGUgZmlyc3QgbGluZSBzaG91bGQgYmUgYSBkYXRlIGxpbmUKKyAgICAgICAgZW50cnlfbGlu
ZXMuYXBwZW5kKGNoYW5nZWxvZy5yZWFkbGluZSgpKQorICAgICAgICAKKyAgICAgICAgIyBlLmcu
IDIwMDktMDYtMDMgIEVyaWMgU2VpZGVsICA8ZXJpY0B3ZWJraXQub3JnPgorICAgICAgICBjaGFu
Z2Vsb2dfZGF0ZV9saW5lX3JlZ2V4cCA9ICdeKFtcZFwtXSspICAoLispICA8KC4rKT4kJworICAg
ICAgICAKKyAgICAgICAgZm9yIGxpbmUgaW4gY2hhbmdlbG9nOgorICAgICAgICAgICAgIyBpZiB3
ZSd2ZSBoaXQgdGhlIG5leHQgZW50cnksIHJldHVybgorICAgICAgICAgICAgaWYgcmUubWF0Y2go
Y2hhbmdlbG9nX2RhdGVfbGluZV9yZWdleHAsIGxpbmUpOgorICAgICAgICAgICAgICAgIHJldHVy
biAnJy5qb2luKGVudHJ5X2xpbmVzKQorICAgICAgICAgICAgZW50cnlfbGluZXMuYXBwZW5kKGxp
bmUpCisgICAgZmluYWxseToKKyAgICAgICAgICAgIGNoYW5nZWxvZy5jbG9zZSgpCisgICAgIyBX
ZSBuZXZlciBmb3VuZCBhIGRhdGUgbGluZSEKKyAgICByZXR1cm4gTm9uZQorCitkZWYgbW9kaWZp
ZWRfY2hhbmdlbG9ncyhzY20pOgorICAgIGNoYW5nZWxvZ19wYXRocyA9IFtdCisgICAgcGF0aHMg
PSBzY20uY2hhbmdlZF9maWxlcygpCisgICAgZm9yIHBhdGggaW4gcGF0aHM6CisgICAgICAgIGlm
IHJlLnNlYXJjaCgnQ2hhbmdlTG9nJywgcGF0aCk6CisgICAgICAgICAgICBjaGFuZ2Vsb2dfcGF0
aHMuYXBwZW5kKHBhdGgpCisgICAgcmV0dXJuIGNoYW5nZWxvZ19wYXRocworCitkZWYgY29tbWl0
X21lc3NhZ2VfZm9yX3RoaXNfY29tbWl0KHNjbSk6CisgICAgY2hhbmdlbG9nX3BhdGhzID0gbW9k
aWZpZWRfY2hhbmdlbG9ncyhzY20pCisgICAgaWYgbGVuKGNoYW5nZWxvZ19wYXRocykgPT0gMDoK
KyAgICAgICAgZXJyb3IoIkZvdW5kIG5vIG1vZGlmaWVkIENoYW5nZUxvZ3MsIGNhbid0IGNyZWF0
ZSBhIGNvbW1pdCBtZXNzYWdlLiIpCisKKyAgICBjaGFuZ2Vsb2dfbWVzc2FnZXMgPSBbXQorICAg
IGZvciBwYXRoIGluIGNoYW5nZWxvZ19wYXRoczoKKyAgICAgICAgY2hhbmdlbG9nX2VudHJ5ID0g
bGF0ZXN0X2NoYW5nZWxvZ19lbnRyeShwYXRoKQorICAgICAgICBpZiBub3QgY2hhbmdlbG9nX2Vu
dHJ5OgorICAgICAgICAgICAgZXJyb3IoIkZhaWxlZCB0byBwYXJzZSBDaGFuZ2VMb2c6ICIgKyBv
cy5wYXRoLmFic3BhdGgocGF0aCkpCisgICAgICAgIGNoYW5nZWxvZ19tZXNzYWdlcy5hcHBlbmQo
Y2hhbmdlbG9nX2VudHJ5KQorICAgIHJldHVybiAnJy5qb2luKGNoYW5nZWxvZ19tZXNzYWdlcykK
KworIyBBbGwgQnVnemlsbGEtc3BlY2lmaWMgbG9naWMgc2hvdWxkIGdvIGhlcmUKKyMgSXQncyBw
b3NzaWJsZSB3ZSBtYXkgY2hhbmdlIG91ciByZXZpZXcgc3lzdGVtIGF0IHNvbWUgcG9pbnQKKyMg
aW4gd2hpY2ggY2FzZSB0aGF0IHBhcnQgb2YgdGhlIGNvZGUgd291bGQgYnJlYWsgb3V0IG9mIGhl
cmUuCitjbGFzcyBCdWd6aWxsYToKKyAgICBkZWYgX19pbml0X18oc2VsZiwgZHJ5cnVuID0gRmFs
c2UpOgorICAgICAgICBzZWxmLmRyeXJ1biA9IGRyeXJ1bgorICAgICAgICBzZWxmLmF1dGhlbnRp
Y2F0ZWQgPSBGYWxzZQorICAgICAgICAKKyAgICAgICAgIyBEZWZhdWx0cyAodW50aWwgd2Ugc3Vw
cG9ydCBiZXR0ZXIgb3B0aW9uIHBhcnNpbmcpOgorICAgICAgICBzZWxmLmJ1Z19zZXJ2ZXIgPSAi
aHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvIgorICAgICAgICAKKyAgICAgICAgc2VsZi5iciA9IEJy
b3dzZXIoKQorICAgICAgICAjIElnbm9yZSBidWdzLndlYmtpdC5vcmcvcm9ib3RzLnR4dCB1bnRp
bCB3ZSBmaXggaXQgdG8gYWxsb3cgdGhpcyBzY3JpcHQKKyAgICAgICAgc2VsZi5ici5zZXRfaGFu
ZGxlX3JvYm90cyhGYWxzZSkKKworICAgICMgVGhpcyBjb3VsZCBldmVudHVhbGx5IGJlIGEgdGV4
dCBmaWxlCisgICAgcmV2aWV3ZXJfdXNlcm5hbWVzX3RvX2Z1bGxfbmFtZXMgPSB7CisgICAgICAg
ICJhYmFydGgiIDogIkFkYW0gQmFydGgiLAorICAgICAgICAiYWRlbGUiIDogIkFkZWxlIFBldGVy
c29uIiwKKyAgICAgICAgImFyaXlhLmhpZGF5YXQiIDogIkFyaXlhIEhpZGF5YXQiLAorICAgICAg
ICAiZGFyaW4iIDogIkRhcmluIEFkbGVyIiwKKyAgICAgICAgImRnbGF6a292IiA6ICJEaW1pdHJp
IEdsYXprb3YiLAorICAgICAgICAiZXJpYyIgOiAiRXJpYyBTZWlkZWwiLAorICAgICAgICAiZGRr
aWx6ZXIiIDogIkRhdmlkIEtpbHplciIsCisgICAgICAgICJmaXNoZCIgOiAiRGFyaW4gRmlzaGVy
IiwKKyAgICAgICAgImducyIgOiAiR3VzdGF2byBOb3JvbmhhIiwKKyAgICAgICAgImh5YXR0IiA6
ICJEYXZpZCBIeWF0dCIsCisgICAgICAgICJqbWFsb256byIgOiAiSmFuIEFsb256byIsCisgICAg
ICAgICJsZXZpbiIgOiAiRGF2aWQgTGV2aW4iLAorICAgICAgICAibWl0eiIgOiAiRGFuIEJlcm5z
dGVpbiIsCisgICAgICAgICJtanMiIDogIk1hY2llaiBTdGFjaG92aWFrIiwKKyAgICAgICAgIm1y
b3dlIiA6ICJNYXJrIFJvd2UiLAorICAgICAgICAib2xpdmVyIiA6ICJPbGl2ZXIgSHVudCIsCisg
ICAgICAgICJzdGFpa29zIiA6ICJHZW9yZ2UgU3RhaWtvcyIsCisgICAgICAgICJ0cmVhdCIgOiAi
QWRhbSBUcmVhdCIsCisgICAgICAgICJ0aW1vdGh5IiA6ICJUaW1vdGh5IEhhdGNoZXIiLAorICAg
ICAgICAieGFuLmxvcGV6IiA6ICJYYW4gTG9wZXoiLAorICAgICAgICAiemVja2UiIDogIkhvbGdl
ciBGcmV5dGhlciIsCisgICAgfQorCisgICAgZGVmIGZ1bGxfbmFtZV9mcm9tX2J1Z3ppbGxhX25h
bWUoc2VsZiwgYnVnemlsbGFfbmFtZSk6CisgICAgICAgIGlmIG5vdCBidWd6aWxsYV9uYW1lIGlu
IHNlbGYucmV2aWV3ZXJfdXNlcm5hbWVzX3RvX2Z1bGxfbmFtZXM6CisgICAgICAgICAgICByYWlz
ZSBFeGNlcHRpb24oIkVSUk9SOiBVbmtub3duIHJldmlld2VyISAiICsgYnVnemlsbGFfbmFtZSkK
KyAgICAgICAgcmV0dXJuIHNlbGYucmV2aWV3ZXJfdXNlcm5hbWVzX3RvX2Z1bGxfbmFtZXNbYnVn
emlsbGFfbmFtZV0KKworICAgIGRlZiBidWdfdXJsX2Zvcl9idWdfaWQoc2VsZiwgYnVnX2lkKToK
KyAgICAgICAgYnVnX2Jhc2VfdXJsID0gc2VsZi5idWdfc2VydmVyICsgInNob3dfYnVnLmNnaT9p
ZD0iCisgICAgICAgIHJldHVybiAiJXMlcyIgJSAoYnVnX2Jhc2VfdXJsLCBidWdfaWQpCisgICAg
CisgICAgZGVmIGF0dGFjaG1lbnRfdXJsX2Zvcl9pZChzZWxmLCBhdHRhY2htZW50X2lkLCBhY3Rp
b24gPSAidmlldyIpOgorICAgICAgICBhdHRhY2htZW50X2Jhc2VfdXJsID0gc2VsZi5idWdfc2Vy
dmVyICsgImF0dGFjaG1lbnQuY2dpP2lkPSIKKyAgICAgICAgcmV0dXJuICIlcyVzJmFjdGlvbj0l
cyIgJSAoYXR0YWNobWVudF9iYXNlX3VybCwgYXR0YWNobWVudF9pZCwgYWN0aW9uKQorCisgICAg
ZGVmIGZldGNoX2F0dGFjaG1lbnRzX2Zyb21fYnVnKHNlbGYsIGJ1Z19pZCk6CisgICAgICAgIGJ1
Z191cmwgPSBzZWxmLmJ1Z191cmxfZm9yX2J1Z19pZChidWdfaWQpCisgICAgICAgIGxvZygiRmV0
Y2hpbmc6ICIgKyBidWdfdXJsKQorCisgICAgICAgIHBhZ2UgPSB1cmxsaWIyLnVybG9wZW4oYnVn
X3VybCkKKyAgICAgICAgc291cCA9IEJlYXV0aWZ1bFNvdXAocGFnZSkKKyAgICAKKyAgICAgICAg
YXR0YWNobWVudF90YWJsZSA9IHNvdXAuZmluZCgndGFibGUnLCB7J2NlbGxzcGFjaW5nJzoiMCIs
ICdjZWxscGFkZGluZyc6IjQiLCAnYm9yZGVyJzoiMSJ9KQorICAgIAorICAgICAgICBhdHRhY2ht
ZW50cyA9IFtdCisgICAgICAgICMgR3JhYiBhIGxpc3Qgb2Ygbm9uLW9ic29sZXRlZCBwYXRjaCBm
aWxlcyAKKyAgICAgICAgZm9yIGF0dGFjaG1lbnRfcm93IGluIGF0dGFjaG1lbnRfdGFibGUuZmlu
ZEFsbCgndHInKToKKyAgICAgICAgICAgIGZpcnN0X2NlbGwgPSBhdHRhY2htZW50X3Jvdy5maW5k
KCd0ZCcpCisgICAgICAgICAgICBpZiBub3QgZmlyc3RfY2VsbDoKKyAgICAgICAgICAgICAgICBj
b250aW51ZSAjIFRoaXMgaXMgdGhlIGhlYWRlciwgbm8gY2VsbHMKKyAgICAgICAgICAgIGlmIGZp
cnN0X2NlbGwuaGFzX2tleSgnY29sc3BhbicpOgorICAgICAgICAgICAgICAgIGJyZWFrICMgdGhp
cyBpcyB0aGUgbGFzdCByb3cKKyAgICAgICAgICAgIAorICAgICAgICAgICAgYXR0YWNobWVudCA9
IHt9CisgICAgICAgICAgICBhdHRhY2htZW50WydvYnNvbGV0ZSddID0gKGF0dGFjaG1lbnRfcm93
Lmhhc19rZXkoJ2NsYXNzJykgYW5kIGF0dGFjaG1lbnRfcm93WydjbGFzcyddID09ICJiel9vYnNv
bGV0ZSIpCisgICAgICAgICAgICAKKyAgICAgICAgICAgIGNlbGxzID0gYXR0YWNobWVudF9yb3cu
ZmluZEFsbCgndGQnKQorICAgICAgICAgICAgYXR0YWNobWVudF9saW5rID0gY2VsbHNbMF0uZmlu
ZCgnYScpCisgICAgICAgICAgICBhdHRhY2htZW50Wyd1cmwnXSA9IHNlbGYuYnVnX3NlcnZlciAr
IGF0dGFjaG1lbnRfbGlua1snaHJlZiddICMgdXJscyBhcmUgcmVsYXRpdmUKKyAgICAgICAgICAg
IGF0dGFjaG1lbnRbJ2lkJ10gPSBhdHRhY2htZW50Wyd1cmwnXS5zcGxpdCgnPScpWzFdICMgZS5n
LiBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9hdHRhY2htZW50LmNnaT9pZD0zMTIyMworICAgICAg
ICAgICAgYXR0YWNobWVudFsnbmFtZSddID0gYXR0YWNobWVudF9saW5rLnN0cmluZworICAgICAg
ICAgICAgIyBhdHRhY2htZW50Wyd0eXBlJ10gPSBjZWxsc1sxXQorICAgICAgICAgICAgIyBhdHRh
Y2htZW50WydkYXRlJ10gPSBjZWxsc1syXQorICAgICAgICAgICAgIyBhdHRhY2htZW50WydzaXpl
J10gPSBjZWxsc1szXQorICAgICAgICAgICAgcmV2aWV3X3N0YXR1cyA9IGNlbGxzWzRdCisgICAg
ICAgICAgICAjIGFjdGlvbl9saW5rcyA9IGNlbGxzWzVdCisKKyAgICAgICAgICAgIGlmIChzdHIo
cmV2aWV3X3N0YXR1cykuZmluZCgicmV2aWV3KyIpICE9IC0xKToKKyAgICAgICAgICAgICAgICBy
ZXZpZXdlciA9IHJldmlld19zdGF0dXMuY29udGVudHNbMF0uc3BsaXQoJzonKVswXSAjIG5hbWU6
XG4gcmV2aWV3K1xuCisgICAgICAgICAgICAgICAgcmV2aWV3ZXJfZnVsbF9uYW1lID0gc2VsZi5m
dWxsX25hbWVfZnJvbV9idWd6aWxsYV9uYW1lKHJldmlld2VyKQorICAgICAgICAgICAgICAgIGF0
dGFjaG1lbnRbJ3Jldmlld2VyJ10gPSByZXZpZXdlcl9mdWxsX25hbWUKKworICAgICAgICAgICAg
YXR0YWNobWVudHMuYXBwZW5kKGF0dGFjaG1lbnQpCisgICAgICAgIHJldHVybiBhdHRhY2htZW50
cworCisgICAgZGVmIGZldGNoX3Jldmlld2VkX3BhdGNoZXNfZnJvbV9idWcoc2VsZiwgYnVnX2lk
KToKKyAgICAgICAgcmV2aWV3ZWRfcGF0Y2hlcyA9IFtdCisgICAgICAgIGZvciBhdHRhY2htZW50
IGluIHNlbGYuZmV0Y2hfYXR0YWNobWVudHNfZnJvbV9idWcoYnVnX2lkKToKKyAgICAgICAgICAg
IGlmICdyZXZpZXdlcicgaW4gYXR0YWNobWVudCBhbmQgbm90IGF0dGFjaG1lbnRbJ29ic29sZXRl
J106CisgICAgICAgICAgICAgICAgcmV2aWV3ZWRfcGF0Y2hlcy5hcHBlbmQoYXR0YWNobWVudCkK
KyAgICAgICAgcmV0dXJuIHJldmlld2VkX3BhdGNoZXMKKworICAgIGRlZiBmZXRjaF9idWdfaWRz
X2Zyb21fY29tbWl0X3F1ZXVlKHNlbGYpOgorICAgICAgICB1bmFzc2lnbmVkX29ubHkgPSAiJmVt
YWlsYXNzaWduZWRfdG8xPTEmZW1haWx0eXBlMT1zdWJzdHJpbmcmZW1haWwxPXVuYXNzaWduZWQi
CisgICAgICAgIGNvbW1pdF9xdWV1ZV91cmwgPSAiaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvYnVn
bGlzdC5jZ2k/cXVlcnlfZm9ybWF0PWFkdmFuY2VkJmJ1Z19zdGF0dXM9VU5DT05GSVJNRUQmYnVn
X3N0YXR1cz1ORVcmYnVnX3N0YXR1cz1BU1NJR05FRCZidWdfc3RhdHVzPVJFT1BFTkVEJmZpZWxk
MC0wLTA9ZmxhZ3R5cGVzLm5hbWUmdHlwZTAtMC0wPWVxdWFscyZ2YWx1ZTAtMC0wPXJldmlldyUy
QiIKKyAgICAgICAgbG9nKCJMb2FkaW5nIGNvbW1pdCBxdWV1ZSIpCisKKyAgICAgICAgcGFnZSA9
IHVybGxpYjIudXJsb3Blbihjb21taXRfcXVldWVfdXJsKQorICAgICAgICBzb3VwID0gQmVhdXRp
ZnVsU291cChwYWdlKQorICAgIAorICAgICAgICBidWdfaWRzID0gW10KKyAgICAgICAgIyBHcmFi
IHRoZSBjZWxscyBpbiB0aGUgZmlyc3QgY29sdW1uICh3aGljaCBoYXBwZW5zIHRvIGJlIHRoZSBi
dWcgaWRzKQorICAgICAgICBmb3IgYnVnX2xpbmtfY2VsbCBpbiBzb3VwKCd0ZCcsICJmaXJzdC1j
aGlsZCIpOiAjIHRkcyB3aXRoIHRoZSBjbGFzcyAiZmlyc3QtY2hpbGQiCisgICAgICAgICAgICBi
dWdfbGluayA9IGJ1Z19saW5rX2NlbGwuZmluZCgiYSIpCisgICAgICAgICAgICBidWdfaWRzLmFw
cGVuZChidWdfbGluay5zdHJpbmcpICMgdGhlIGNvbnRlbnRzIGhhcHBlbiB0byBiZSB0aGUgYnVn
IGlkCisgICAgCisgICAgICAgIHJldHVybiBidWdfaWRzCisKKyAgICBkZWYgZmV0Y2hfcGF0Y2hl
c19mcm9tX2NvbW1pdF9xdWV1ZShzZWxmKToKKyAgICAgICAgcGF0Y2hlc190b19sYW5kID0gW10K
KyAgICAgICAgZm9yIGJ1Z19pZCBpbiBzZWxmLmZldGNoX2J1Z19pZHNfZnJvbV9jb21taXRfcXVl
dWUoKToKKyAgICAgICAgICAgIHBhdGNoZXMgPSBzZWxmLmZldGNoX3Jldmlld2VkX3BhdGNoZXNf
ZnJvbV9idWcoYnVnX2lkKQorICAgICAgICAgICAgcGF0Y2hlc190b19sYW5kLmV4dGVuZChwYXRj
aGVzKQorICAgICAgICByZXR1cm4gcGF0Y2hlc190b19sYW5kCisKKyAgICBkZWYgYXV0aGVudGlj
YXRlKHNlbGYsIHVzZXJuYW1lID0gTm9uZSwgcGFzc3dvcmQgPSBOb25lKToKKyAgICAgICAgaWYg
KHNlbGYuYXV0aGVudGljYXRlZCk6CisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgCisgICAg
ICAgIGlmIG5vdCB1c2VybmFtZToKKyAgICAgICAgICAgIHVzZXJuYW1lID0gcmVhZF9jb25maWco
InVzZXJuYW1lIikKKyAgICAgICAgICAgIGlmIG5vdCB1c2VybmFtZToKKyAgICAgICAgICAgICAg
ICB1c2VybmFtZSA9IHJhd19pbnB1dCgiQnVnemlsbGEgbG9naW46ICIpCisgICAgICAgIGlmIG5v
dCBwYXNzd29yZDoKKyAgICAgICAgICAgIHBhc3N3b3JkID0gcmVhZF9jb25maWcoInVzZXJuYW1l
IikKKyAgICAgICAgICAgIGlmIG5vdCBwYXNzd29yZDoKKyAgICAgICAgICAgICAgICBwYXNzd29y
ZCA9IGdldHBhc3MuZ2V0cGFzcygiQnVnemlsbGEgcGFzc3dvcmQ6ICIpCisKKyAgICAgICAgbG9n
KCJMb2dnaW5nIGluIGFzICVzLi4uIiAlICh1c2VybmFtZSwpKQorICAgICAgICBpZiBzZWxmLmRy
eXJ1bjoKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBzZWxmLmJyLm9wZW4oc2VsZi5idWdf
c2VydmVyICsgIi9pbmRleC5jZ2k/R29BaGVhZEFuZExvZ0luPTEiKQorICAgICAgICBzZWxmLmJy
LnNlbGVjdF9mb3JtKG5hbWU9ImxvZ2luIikKKyAgICAgICAgc2VsZi5iclsnQnVnemlsbGFfbG9n
aW4nXSA9IHVzZXJuYW1lCisgICAgICAgIHNlbGYuYnJbJ0J1Z3ppbGxhX3Bhc3N3b3JkJ10gPSBw
YXNzd29yZAorICAgICAgICBzZWxmLmJyLnN1Ym1pdCgpCisgICAgICAgIAorICAgICAgICAjIFdl
IHJlYWxseSBzaG91bGQgY2hlY2sgdGhlIHJlc3VsdCBjb2RlcyBhbmQgdHJ5IGFnYWluIGFzIG5l
Y2Vzc2FyeQorICAgICAgICBzZWxmLmF1dGhlbnRpY2F0ZWQgPSBUcnVlCisKKyAgICBkZWYgYWRk
X3BhdGNoX3RvX2J1ZyhzZWxmLCBidWdfaWQsIHBhdGNoX2ZpbGVfb2JqZWN0LCBkZXNjcmlwdGlv
biwgY29tbWVudF90ZXh0ID0gTm9uZSwgbWFya19mb3JfcmV2aWV3ID0gRmFsc2UpOgorICAgICAg
ICBzZWxmLmF1dGhlbnRpY2F0ZSgpCisgICAgICAgIAorICAgICAgICBsb2coIkFkZGluZyBwYXRj
aCBcIiVzXCIgdG8gYnVnICVzIiAlIChkZXNjcmlwdGlvbiwgYnVnX2lkKSkKKyAgICAgICAgaWYg
c2VsZi5kcnlydW46CisgICAgICAgICAgICBsb2coY29tbWVudF90ZXh0KQorICAgICAgICAgICAg
cmV0dXJuCisgICAgICAgIAorICAgICAgICBzZWxmLmJyLm9wZW4oc2VsZi5idWdfc2VydmVyICsg
Ii9hdHRhY2htZW50LmNnaT9hY3Rpb249ZW50ZXImYnVnaWQ9IiArIGJ1Z19pZCkKKyAgICAgICAg
c2VsZi5ici5zZWxlY3RfZm9ybShuYW1lPSJlbnRyeWZvcm0iKSAgICAgICAgCisgICAgICAgIHNl
bGYuYnJbJ2Rlc2NyaXB0aW9uJ10gPSBkZXNjcmlwdGlvbgorICAgICAgICBzZWxmLmJyWydpc3Bh
dGNoJ10gPSAoIjEiLCkKKyAgICAgICAgaWYgKGNvbW1lbnRfdGV4dCk6CisgICAgICAgICAgICBs
b2coY29tbWVudF90ZXh0KQorICAgICAgICAgICAgc2VsZi5iclsnY29tbWVudCddID0gY29tbWVu
dF90ZXh0CisgICAgICAgIHNlbGYuYnJbJ2ZsYWdfdHlwZS0xJ10gPSAoJz8nLCkgaWYgbWFya19m
b3JfcmV2aWV3IGVsc2UgKCdYJywpCisgICAgICAgIHNlbGYuYnIuYWRkX2ZpbGUocGF0Y2hfZmls
ZV9vYmplY3QsICJ0ZXh0L3BsYWluIiwgImJ1Z3ppbGxhX3JlcXVpcmVzX2FfZmlsZW5hbWUucGF0
Y2giKQorICAgICAgICBzZWxmLmJyLnN1Ym1pdCgpCisKKyAgICBkZWYgb2Jzb2xldGVfYXR0YWNo
bWVudChzZWxmLCBhdHRhY2htZW50X2lkLCBjb21tZW50X3RleHQgPSBOb25lKToKKyAgICAgICAg
c2VsZi5hdXRoZW50aWNhdGUoKQorCisgICAgICAgIGxvZygiT2Jzb2xldGluZyBhdHRhY2htZW50
OiAlcyIgJSAoYXR0YWNobWVudF9pZCwpKQorICAgICAgICBpZiBzZWxmLmRyeXJ1bjoKKyAgICAg
ICAgICAgIGxvZyhjb21tZW50X3RleHQpCisgICAgICAgICAgICByZXR1cm4KKworICAgICAgICBz
ZWxmLmJyLm9wZW4oc2VsZi5hdHRhY2htZW50X3VybF9mb3JfaWQoYXR0YWNobWVudF9pZCwgJ2Vk
aXQnKSkKKyAgICAgICAgc2VsZi5ici5zZWxlY3RfZm9ybShucj0wKQorICAgICAgICBzZWxmLmJy
LmZpbmRfY29udHJvbCgnaXNvYnNvbGV0ZScpLml0ZW1zWzBdLnNlbGVjdGVkID0gVHJ1ZQorICAg
ICAgICAjIEFsc28gY2xlYXIgYW55IHJldmlldyBmbGFnICh0byByZW1vdmUgaXQgZnJvbSByZXZp
ZXcvY29tbWl0IHF1ZXVlcykKKyAgICAgICAgc2VsZi5ici5maW5kX2NvbnRyb2wodHlwZT0nc2Vs
ZWN0JywgbnI9MCkudmFsdWUgPSAoIlgiLCkKKyAgICAgICAgaWYgY29tbWVudF90ZXh0OgorICAg
ICAgICAgICAgbG9nKGNvbW1lbnRfdGV4dCkKKyAgICAgICAgICAgIHNlbGYuYnJbJ2NvbW1lbnQn
XSA9IGNvbW1lbnRfdGV4dAorICAgICAgICBzZWxmLmJyLnN1Ym1pdCgpCisgICAgCisgICAgZGVm
IHBvc3RfY29tbWVudF90b19idWcoc2VsZiwgYnVnX2lkLCBjb21tZW50X3RleHQpOgorICAgICAg
ICBzZWxmLmF1dGhlbnRpY2F0ZSgpCisKKyAgICAgICAgbG9nKCJBZGRpbmcgY29tbWVudCB0byBi
dWcgJXMiICUgKGJ1Z19pZCwpKQorICAgICAgICBpZiBzZWxmLmRyeXJ1bjoKKyAgICAgICAgICAg
IGxvZyhjb21tZW50X3RleHQpCisgICAgICAgICAgICByZXR1cm4KKworICAgICAgICBzZWxmLmJy
Lm9wZW4oc2VsZi5idWdfdXJsX2Zvcl9idWdfaWQoYnVnX2lkKSkKKyAgICAgICAgc2VsZi5ici5z
ZWxlY3RfZm9ybShuYW1lPSJjaGFuZ2Vmb3JtIikKKyAgICAgICAgc2VsZi5iclsnY29tbWVudCdd
ID0gY29tbWVudF90ZXh0CisgICAgICAgIHNlbGYuYnIuc3VibWl0KCkKKworICAgIGRlZiBjbG9z
ZV9idWdfYXNfZml4ZWQoc2VsZiwgYnVnX2lkLCBjb21tZW50X3RleHQgPSBOb25lKToKKyAgICAg
ICAgc2VsZi5hdXRoZW50aWNhdGUoKQorCisgICAgICAgIGxvZygiQ2xvc2luZyBidWcgJXMgYXMg
Zml4ZWQiICUgKGJ1Z19pZCwpKQorICAgICAgICBpZiBzZWxmLmRyeXJ1bjoKKyAgICAgICAgICAg
IGxvZyhjb21tZW50X3RleHQpCisgICAgICAgICAgICByZXR1cm4KKworICAgICAgICBzZWxmLmJy
Lm9wZW4oc2VsZi5idWdfdXJsX2Zvcl9idWdfaWQoYnVnX2lkKSkKKyAgICAgICAgc2VsZi5ici5z
ZWxlY3RfZm9ybShuYW1lPSJjaGFuZ2Vmb3JtIikKKyAgICAgICAgaWYgY29tbWVudF90ZXh0Ogor
ICAgICAgICAgICAgbG9nKGNvbW1lbnRfdGV4dCkKKyAgICAgICAgICAgIHNlbGYuYnJbJ2NvbW1l
bnQnXSA9IGNvbW1lbnRfdGV4dAorICAgICAgICBzZWxmLmJyWydrbm9iJ10gPSBbJ3Jlc29sdmUn
XQorICAgICAgICBzZWxmLmJyWydyZXNvbHV0aW9uJ10gPSBbJ0ZJWEVEJ10KKyAgICAgICAgc2Vs
Zi5ici5zdWJtaXQoKQorCitkZWYgZGV0ZWN0X3NjbV9zeXN0ZW0ocGF0aCk6CisgICAgIyBGSVhN
RTogVGhlc2UgY2hlY2tzIHNob3VsZCBiZSBjb250YWluZWQgaW4gdGhlIFNWTiBhbmQgR2l0IGNs
YXNzZXMuLi4KKyAgICBpZiBvcy5wYXRoLmlzZGlyKG9zLnBhdGguam9pbihwYXRoLCAnLnN2bicp
KToKKyAgICAgICAgcmV0dXJuIFNWTigpCisgICAgCisgICAgaWYgb3Muc3lzdGVtKCJjZCAiICsg
cGF0aCArICIgJiYgZ2l0IHJldi1wYXJzZSA+IC9kZXYvbnVsbCAyPiYxIikgPT0gMDoKKyAgICAg
ICAgcmV0dXJuIEdpdCgpCisgICAgCisgICAgZXJyb3IoIlRoZSBjdXJyZW50IGRpcmVjdG9yeSBk
b2VzIG5vdCBhcHBlYXIgdG8gYmUgYSB2YWxpZCBXZWJLaXQgY2hlY2tvdXQiKQorCitjbGFzcyBT
Q006CisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGRyeXJ1biA9IEZhbHNlKToKKyAgICAgICAgc2Vs
Zi5kcnlydW4gPSBkcnlydW4KKworICAgIGRlZiBfbm90X2ltcGxlbWVudGVkKHNlbGYpOgorICAg
ICAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yLCAic3ViY2xhc3NlcyBtdXN0IGltcGxlbWVu
dCIKKyAgICAKKyAgICBkZWYgZW5zdXJlX2NsZWFuX3dvcmtpbmdfZGlyZWN0b3J5KHNlbGYsIGZv
cmNlKToKKyAgICAgICAgIyBXZSBzaG91bGQgbWFrZSBzdXJlIHRoZSB0cmVlIGlzIGNsZWFuCisg
ICAgICAgICMgaWYgaXQncyBub3QgY2xlYW4gYW5kIGZvcmNlICE9IFRydWUsIHRoZW4gZmFpbCB3
aXRoIGEgbmljZSBtZXNzYWdlCisgICAgICAgICMgc2ltaWxhciB0byBob3cgImdpdCBjbGVhbiAt
biIgd291bGQgc2hvdyB5b3Ugd2hhdCAtZiB3b3VsZCByZW1vdmUKKworICAgICAgICAjIEhBQ0s6
IFRoaXMgaXMgZGFuZ2Vyb3VzLCBidXQgSSdtIHRoZSBvbmx5IG9uZSB1c2luZyB0aGlzIHNjcmlw
dCwgc28gaXQncyBPSy4gOykKKyAgICAgICAgIyB3ZSByZWFsbHkgc2hvdWxkIHJlcXVpcmUgYSAt
LWZvcmNlIG9wdGlvbiB0byB1c2UgYSBub24tY2xlYW4gd29ya2luZyBkaXJlY3RvcnkKKyAgICAg
ICAgbG9nKCJDbGVhbmluZyB0aGUgd29ya2luZyBkaXJlY3RvcnkiKQorICAgICAgICBzZWxmLmNs
ZWFuX3dvcmtpbmdfZGlyZWN0b3J5KCkKKyAgICAKKyAgICBkZWYgY2xlYW5fd29ya2luZ19kaXJl
Y3Rvcnkoc2VsZik6CisgICAgICAgIHNlbGYuX25vdF9pbXBsZW1lbnRlZCgpCisgICAgCisgICAg
ZGVmIHVwZGF0ZV93ZWJraXQoc2VsZik6CisgICAgICAgIHNlbGYuX25vdF9pbXBsZW1lbnRlZCgp
CisgICAgCisgICAgZGVmIGFwcGx5X3BhdGNoKHNlbGYsIHBhdGNoKToKKyAgICAgICAgY2hkaXJf
d2Via2l0KCkKKyAgICAgICAgIyBJdCdzIHBvc3NpYmxlIHRoYXQgdGhlIHBhdGNoIHdhcyBub3Qg
bWFkZSBmcm9tIHRoZSByb290IGRpcmVjdG9yeQorICAgICAgICAjIHdlIHNob3VsZCBkZXRlY3Qg
YW5kIGhhbmRsZSB0aGF0IGNhc2UuCisgICAgICAgIHJldHVybl9jb2RlID0gb3Muc3lzdGVtKCJj
dXJsICIgKyBwYXRjaFsndXJsJ10gKyAiIHwgc3ZuLWFwcGx5IC0tcmV2aWV3ZXIgXCIiICsgcGF0
Y2hbJ3Jldmlld2VyJ10gKyAiXCIiKQorICAgICAgICBpZiAocmV0dXJuX2NvZGUgIT0gMCk6Cisg
ICAgICAgICAgICByYWlzZSBTY3JpcHRFcnJvcigiUGF0Y2ggIiArIHBhdGNoX3VybCArICIgZmFp
bGVkIHRvIGRvd25sb2FkIGFuZCBhcHBseS4iKQorCisgICAgIyBJdCdzIHNsaWdodGx5IGhhY2t5
IHRvIHNoYXJlIHRoaXMgY29kZSwgc2luY2UgdGhlcmUgYXJlIGltcGxpY2l0IGFzc3VtcHRpb25z
IGFib3V0IHRoZSByZWdleHAgZm9ybWF0CisgICAgZGVmIHJ1bl9zdGF0dXNfYW5kX2V4dHJhY3Rf
ZmlsZW5hbWVzKHNlbGYsIHN0YXR1c19jb21tYW5kLCBzdGF0dXNfcmVnZXhwKToKKyAgICAgICAg
ZmlsZV9uYW1lcyA9IFtdCisgICAgICAgIGZvciBsaW5lIGluIG9zLnBvcGVuKHN0YXR1c19jb21t
YW5kKS5yZWFkbGluZXMoKToKKyAgICAgICAgICAgIG1hdGNoID0gcmUuc2VhcmNoKHN0YXR1c19y
ZWdleHAsIGxpbmUpCisgICAgICAgICAgICBpZiBub3QgbWF0Y2g6CisgICAgICAgICAgICAgICAg
Y29udGludWUKKyAgICAgICAgICAgIHN0YXR1cyA9IG1hdGNoLmdyb3VwKDEpCisgICAgICAgICAg
ICBmaWxlX25hbWUgPSBtYXRjaC5ncm91cCgyKQorICAgICAgICAgICAgZmlsZV9uYW1lcy5hcHBl
bmQoZmlsZV9uYW1lKQorICAgICAgICByZXR1cm4gZmlsZV9uYW1lcworCisgICAgZGVmIGNoYW5n
ZWRfZmlsZXMoc2VsZik6CisgICAgICAgIHNlbGYuX25vdF9pbXBsZW1lbnRlZCgpCisKKyAgICBk
ZWYgc3VwcG9ydHNfbG9jYWxfY29tbWl0cyhzZWxmKToKKyAgICAgICAgc2VsZi5fbm90X2ltcGxl
bWVudGVkKCkKKworICAgIGRlZiBkaXNwbGF5X25hbWUoc2VsZik6CisgICAgICAgIHNlbGYuX25v
dF9pbXBsZW1lbnRlZCgpCisKKyAgICBkZWYgY3JlYXRlX3BhdGNoX2NvbW1hbmQoc2VsZik6Cisg
ICAgICAgIHNlbGYuX25vdF9pbXBsZW1lbnRlZCgpCisKKyAgICBkZWYgY29tbWl0X3dpdGhfbWVz
c2FnZShzZWxmLCBtZXNzYWdlKToKKyAgICAgICAgc2VsZi5fbm90X2ltcGxlbWVudGVkKCkKKwor
Y2xhc3MgU1ZOIChTQ00pOgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBkcnlydW4gPSBGYWxzZSk6
CisgICAgICAgIFNDTS5fX2luaXRfXyhzZWxmLCBkcnlydW4pCisKKyAgICBkZWYgX25vdF9pbXBs
ZW1lbnRlZChzZWxmKToKKyAgICAgICAgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvciwgInN1YmNs
YXNzZXMgbXVzdCBpbXBsZW1lbnQiCisKKyAgICBkZWYgY2xlYW5fd29ya2luZ19kaXJlY3Rvcnko
c2VsZik6CisgICAgICAgIG9zLnN5c3RlbSgic3ZuIHJlc2V0IC1SIikKKworICAgIGRlZiB1cGRh
dGVfd2Via2l0KHNlbGYpOgorICAgICAgICBvcy5zeXN0ZW0oInVwZGF0ZS13ZWJraXQiKQorCisg
ICAgZGVmIGNoYW5nZWRfZmlsZXMoc2VsZik6CisgICAgICAgIHN0YXR1c19jb21tYW5kID0gJ3N2
biBzdGF0dXMnCisgICAgICAgIHN0YXR1c19yZWdleHAgPSAiXihbQUNETVJdKS57Nn0gKC4rKSQi
IGlmIHNlbGYuc3ZuX3ZlcnNpb24oKSA+ICIxLjYiIGVsc2UgIl4oW0FDRE1SXSkuezV9ICguKykk
IgorICAgICAgICByZXR1cm4gc2VsZi5ydW5fc3RhdHVzX2FuZF9leHRyYWN0X2ZpbGVuYW1lcyhz
dGF0dXNfY29tbWFuZCwgc3RhdHVzX3JlZ2V4cCkKKworICAgIGRlZiBzdXBwb3J0c19sb2NhbF9j
b21taXRzKHNlbGYpOgorICAgICAgICByZXR1cm4gRmFsc2UKKworICAgIGRlZiBkaXNwbGF5X25h
bWUoc2VsZik6CisgICAgICAgIHJldHVybiAic3ZuIgorCisgICAgZGVmIGNyZWF0ZV9wYXRjaF9j
b21tYW5kKHNlbGYpOgorICAgICAgICByZXR1cm4gInN2bi1jcmVhdGUtcGF0Y2giCisKKyAgICBk
ZWYgY29tbWl0X3dpdGhfbWVzc2FnZShzZWxmLCBtZXNzYWdlKToKKyAgICAgICAgY29tbWl0X3By
b2Nlc3MgPSBzdWJwcm9jZXNzLlBvcGVuKCdzdm4gY29tbWl0IC1GIC0nLCBzdGRpbj1zdWJwcm9j
ZXNzLlBJUEUsIHNoZWxsPVRydWUpCisgICAgICAgIGNvbW1pdF9wcm9jZXNzLmNvbW11bmljYXRl
KG1lc3NhZ2UpCisKKyMgQWxsIGdpdC1zcGVjaWZpYyBsb2dpYyBzaG91bGQgZ28gaGVyZS4KK2Ns
YXNzIEdpdCAoU0NNKToKKyAgICBkZWYgX19pbml0X18oc2VsZiwgZHJ5cnVuID0gRmFsc2UpOgor
ICAgICAgICBTQ00uX19pbml0X18oc2VsZiwgZHJ5cnVuKQorICAgIAorICAgIGRlZiBjbGVhbl93
b3JraW5nX2RpcmVjdG9yeShzZWxmKToKKyAgICAgICAgb3Muc3lzdGVtKCJnaXQgcmVzZXQgLS1o
YXJkIHRydW5rICYmIGdpdCBjbGVhbiAtZiIpCisgICAgCisgICAgZGVmIHVwZGF0ZV93ZWJraXQo
c2VsZik6CisgICAgICAgICMgRklYTUU6IFNob3VsZCBwcm9iYWJseSBjYWxsIHVwZGF0ZS13ZWJr
aXQsIG5vPworICAgICAgICBsb2coIlVwZGF0aW5nIHdvcmtpbmcgZGlyZWN0b3J5IikKKyAgICAg
ICAgb3Muc3lzdGVtKCJnaXQgc3ZuIHJlYmFzZSIpCisKKyAgICBkZWYgY2hhbmdlZF9maWxlcyhz
ZWxmKToKKyAgICAgICAgc3RhdHVzX2NvbW1hbmQgPSAnZ2l0IGRpZmYgLXIgLS1uYW1lLXN0YXR1
cyAtQyAtQyAtTScKKyAgICAgICAgc3RhdHVzX3JlZ2V4cCA9ICdeKFtBRE1dKVx0KC4rKSQnCisg
ICAgICAgIHJldHVybiBzZWxmLnJ1bl9zdGF0dXNfYW5kX2V4dHJhY3RfZmlsZW5hbWVzKHN0YXR1
c19jb21tYW5kLCBzdGF0dXNfcmVnZXhwKQorICAgIAorICAgIGRlZiBzdXBwb3J0c19sb2NhbF9j
b21taXRzKHNlbGYpOgorICAgICAgICByZXR1cm4gVHJ1ZQorCisgICAgZGVmIGRpc3BsYXlfbmFt
ZShzZWxmKToKKyAgICAgICAgcmV0dXJuICJnaXQiCisKKyAgICBkZWYgY3JlYXRlX3BhdGNoX2Nv
bW1hbmQoc2VsZik6CisgICAgICAgIHJldHVybiAiZ2l0IGRpZmYgaGVhZCIKKworICAgIGRlZiBj
b21taXRfd2l0aF9tZXNzYWdlKHNlbGYsIG1lc3NhZ2UpOgorICAgICAgICBzZWxmLmNvbW1pdF9s
b2NhbGx5X3dpdGhfbWVzc2FnZShtZXNzYWdlKQorICAgICAgICBzZWxmLnB1c2hfbG9jYWxfY29t
bWl0c190b19zZXJ2ZXIoKQorCisgICAgIyBHaXQtc3BlY2lmaWMgbWV0aG9kczoKKyAgICAKKyAg
ICBkZWYgY29tbWl0X2xvY2FsbHlfd2l0aF9tZXNzYWdlKHNlbGYsIG1lc3NhZ2UpOgorICAgICAg
ICBjb21taXRfcHJvY2VzcyA9IHN1YnByb2Nlc3MuUG9wZW4oJ2dpdCBjb21taXQgLWEgLUYgLScs
IHN0ZGluPXN1YnByb2Nlc3MuUElQRSwgc2hlbGw9VHJ1ZSkKKyAgICAgICAgY29tbWl0X3Byb2Nl
c3MuY29tbXVuaWNhdGUobWVzc2FnZSkKKyAgICAgICAgCisgICAgZGVmIHB1c2hfbG9jYWxfY29t
bWl0c190b19zZXJ2ZXIoc2VsZik6CisgICAgICAgIGlmIHNlbGYuZHJ5cnVuOgorICAgICAgICAg
ICAgcmV0dXJuICJEcnkgcnVuLCBubyByZW1vdGUgY29tbWl0LiIKKyAgICAgICAgY29tbWl0X3By
b2Nlc3MgPSBzdWJwcm9jZXNzLlBvcGVuKCdnaXQgc3ZuIGRjb21taXQnLCBzdGRvdXQ9c3VicHJv
Y2Vzcy5QSVBFLCBzaGVsbD1UcnVlKQorICAgICAgICAob3V0LCBlcnJvcikgPSBjb21taXRfcHJv
Y2Vzcy5jb21tdW5pY2F0ZSgpCisgICAgICAgIHJldHVybl9jb2RlID0gY29tbWl0X3Byb2Nlc3Mu
d2FpdCgpCisgICAgICAgIHJldHVybiBvdXQKKyAgICAKKworICAgIGRlZiBjb21taXRfaWRzX2Zy
b21fcmFuZ2VfYXJndW1lbnRzKHNlbGYsIGFyZ3MsIGNoZXJyeV9waWNrID0gRmFsc2UpOgorICAg
ICAgICAjIEZpcnN0IGdldCB0aGUgY29tbWl0LWlkcyBmb3IgdGhlIHBhc3NlZCBpbiByZXZpc2lv
bnMKKyAgICAgICAgcmV2X3BhcnNlX2FyZ3MgPSBbJ2dpdCcsICdyZXYtcGFyc2UnLCAnLS1yZXZz
LW9ubHknXQorICAgICAgICByZXZfcGFyc2VfYXJncy5leHRlbmQoYXJncykKKyAgICAgICAgcmV2
X3BhcnNlX3Byb2Nlc3MgPSBzdWJwcm9jZXNzLlBvcGVuKCIgIi5qb2luKHJldl9wYXJzZV9hcmdz
KSwgc3Rkb3V0PXN1YnByb2Nlc3MuUElQRSwgc2hlbGw9VHJ1ZSkKKyAgICAgICAgcmV2aXNpb25z
ID0gcmV2X3BhcnNlX3Byb2Nlc3MuY29tbXVuaWNhdGUoKVswXS5zcGxpdGxpbmVzKCkKKyAgICAg
ICAgCisgICAgICAgIGlmIGNoZXJyeV9waWNrOgorICAgICAgICAgICAgcmV0dXJuIHJldmlzaW9u
cworICAgICAgICAKKyAgICAgICAgIyBJZiBub3QgY2hlcnJ5LXBpY2tpbmcgYW5kIG9ubHkgcGFz
c2VkIG9uZSByZXZpc2lvbiwgYXNzdW1lICJecmV2aXNpb24gaGVhZCIgYWthICJyZXZpc2lvbi4u
aGVhZCIKKyAgICAgICAgaWYgbGVuKHJldmlzaW9ucykgPCAyOgorICAgICAgICAgICAgcmV2aXNp
b25zWzBdID0gIl4iICsgcmV2aXNpb25zWzBdCisgICAgICAgICAgICByZXZpc2lvbnMuYXBwZW5k
KCJoZWFkIikKKyAgICAgICAgCisgICAgICAgIHJldl9saXN0X2FyZ3MgPSBbJ2dpdCcsICdyZXYt
bGlzdCddCisgICAgICAgIHJldl9saXN0X2FyZ3MuZXh0ZW5kKHJldmlzaW9ucykKKyAgICAgICAg
cmV2X2xpc3RfcHJvY2VzcyA9IHN1YnByb2Nlc3MuUG9wZW4oIiAiLmpvaW4ocmV2X2xpc3RfYXJn
cyksIHN0ZG91dD1zdWJwcm9jZXNzLlBJUEUsIHNoZWxsPVRydWUpCisgICAgICAgIHJldHVybiBy
ZXZfbGlzdF9wcm9jZXNzLmNvbW11bmljYXRlKClbMF0uc3BsaXRsaW5lcygpCisKKyAgICBkZWYg
Y29tbWl0X21lc3NhZ2VfZm9yX2NvbW1pdChzZWxmLCBjb21taXRfaWQpOgorICAgICAgICBjb21t
aXRfbWVzc2FnZV9wcm9jZXNzID0gc3VicHJvY2Vzcy5Qb3BlbigiZ2l0IGNhdC1maWxlIGNvbW1p
dCAiICsgY29tbWl0X2lkLCBzdGRvdXQ9c3VicHJvY2Vzcy5QSVBFLCBzaGVsbD1UcnVlKQorICAg
ICAgICBjb21taXRfbWVzc2FnZSA9IGNvbW1pdF9tZXNzYWdlX3Byb2Nlc3MuY29tbXVuaWNhdGUo
KVswXQorICAgICAgICBjb21taXRfbGluZXMgPSBjb21taXRfbWVzc2FnZS5zcGxpdGxpbmVzKCkK
KworICAgICAgICAjIHNraXAgdGhlIGhlYWRlcnMKKyAgICAgICAgZmlyc3RfbGluZV9hZnRlcl9o
ZWFkZXJzID0gMAorICAgICAgICBmb3IgbGluZSBpbiBjb21taXRfbGluZXM6CisgICAgICAgICAg
ICBmaXJzdF9saW5lX2FmdGVyX2hlYWRlcnMgKz0gMQorICAgICAgICAgICAgaWYgbGluZSA9PSAi
IjoKKyAgICAgICAgICAgICAgICBicmVhaworICAgICAgICByZXR1cm4gIlxuIi5qb2luKGNvbW1p
dF9saW5lc1tmaXJzdF9saW5lX2FmdGVyX2hlYWRlcnM6XSkKKworICAgIGRlZiBzaG93X2RpZmZf
Y29tbWFuZF9mb3JfY29tbWl0KHNlbGYsIGNvbW1pdF9pZCk6CisgICAgICAgIHJldHVybiAiZ2l0
IGRpZmYtdHJlZSAtcCAiICsgY29tbWl0X2lkCisKKyAgICBkZWYgZmlsZXNfY2hhbmdlZF9zdW1t
YXJ5X2Zvcl9jb21taXQoc2VsZiwgY29tbWl0X2lkKToKKyAgICAgICAgcmV0dXJuIHN1YnByb2Nl
c3MuUG9wZW4oImdpdCBkaWZmLXRyZWUgLS1zaG9ydHN0YXQgLS1uby1jb21taXQtaWQgIiArIGNv
bW1pdF9pZCwgc3Rkb3V0PXN1YnByb2Nlc3MuUElQRSwgc2hlbGw9VHJ1ZSkuY29tbXVuaWNhdGUo
KVswXQorCisKK2NsYXNzIENvbW1hbmQ6CisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGhlbHBfdGV4
dCwgYXJndW1lbnRfbmFtZXM9IiIsIG9wdGlvbnMgPSBbXSk6CisgICAgICAgIHNlbGYuaGVscF90
ZXh0ID0gaGVscF90ZXh0CisgICAgICAgIHNlbGYuYXJndW1lbnRfbmFtZXMgPSBhcmd1bWVudF9u
YW1lcworICAgICAgICBzZWxmLm9wdGlvbnMgPSBvcHRpb25zCisgICAgICAgIHNlbGYub3B0aW9u
X3BhcnNlciA9IE9wdGlvblBhcnNlcih1c2FnZT1TVVBQUkVTU19VU0FHRSwgYWRkX2hlbHBfb3B0
aW9uPUZhbHNlLCBvcHRpb25fbGlzdD1zZWxmLm9wdGlvbnMpCisgICAgCisgICAgZGVmIG5hbWVf
d2l0aF9hcmd1bWVudHMoc2VsZiwgY29tbWFuZF9uYW1lKToKKyAgICAgICAgdXNhZ2Vfc3RyaW5n
ID0gY29tbWFuZF9uYW1lCisgICAgICAgIGlmIChsZW4oc2VsZi5vcHRpb25zKSA+IDApOgorICAg
ICAgICAgICAgdXNhZ2Vfc3RyaW5nICs9ICIgW29wdGlvbnNdIgorICAgICAgICBpZiAoc2VsZi5h
cmd1bWVudF9uYW1lcyAhPSAiIik6CisgICAgICAgICAgICB1c2FnZV9zdHJpbmcgKz0gIiAiICsg
c2VsZi5hcmd1bWVudF9uYW1lcworICAgICAgICByZXR1cm4gdXNhZ2Vfc3RyaW5nCisKKyAgICBk
ZWYgcGFyc2VfYXJncyhzZWxmLCBhcmdzKToKKyAgICAgICAgcmV0dXJuIHNlbGYub3B0aW9uX3Bh
cnNlci5wYXJzZV9hcmdzKGFyZ3MpCisKKyAgICBkZWYgZXhlY3V0ZShzZWxmLCBvcHRpb25zLCBh
cmdzKToKKyAgICAgICAgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvciwgInN1YmNsYXNzZXMgbXVz
dCBpbXBsZW1lbnQiCisKKworY2xhc3MgQnVnc0luQ29tbWl0UXVldWUgKENvbW1hbmQpOgorICAg
IGRlZiBfX2luaXRfXyhzZWxmKToKKyAgICAgICAgQ29tbWFuZC5fX2luaXRfXyhzZWxmLCAnQnVn
cyBpbiB0aGUgY29tbWl0IHF1ZXVlJykKKworICAgIGRlZiBleGVjdXRlKHNlbGYsIG9wdGlvbnMs
IGFyZ3MsIHRvb2wpOgorICAgICAgICBidWdfaWRzID0gdG9vbC5idWdzLmZldGNoX2J1Z19pZHNf
ZnJvbV9jb21taXRfcXVldWUoKQorICAgICAgICBmb3IgYnVnX2lkIGluIGJ1Z19pZHM6CisgICAg
ICAgICAgICBwcmludCB0b29sLmJ1Z3MuYnVnX3VybF9mb3JfYnVnX2lkKGJ1Z19pZCkKKworCitj
bGFzcyBQYXRjaGVzSW5Db21taXRRdWV1ZSAoQ29tbWFuZCk6CisgICAgZGVmIF9faW5pdF9fKHNl
bGYpOgorICAgICAgICBDb21tYW5kLl9faW5pdF9fKHNlbGYsICdQYXRjaGVzIGF0dGFjaGVkIHRv
IGJ1Z3MgaW4gdGhlIGNvbW1pdCBxdWV1ZScpCisKKyAgICBkZWYgZXhlY3V0ZShzZWxmLCBvcHRp
b25zLCBhcmdzLCB0b29sKToKKyAgICAgICAgcGF0Y2hlcyA9IHRvb2wuYnVncy5mZXRjaF9wYXRj
aGVzX2Zyb21fY29tbWl0X3F1ZXVlKCkKKyAgICAgICAgbG9nKCJQYXRjaGVzIGluIGNvbW1pdCBx
dWV1ZToiKQorICAgICAgICBmb3IgcGF0Y2ggaW4gcGF0Y2hlczoKKyAgICAgICAgICAgIHByaW50
IHBhdGNoWyd1cmwnXQorCisKK2NsYXNzIFJldmlld2VkUGF0Y2hlc09uQnVnIChDb21tYW5kKToK
KyAgICBkZWYgX19pbml0X18oc2VsZik6CisgICAgICAgIENvbW1hbmQuX19pbml0X18oc2VsZiwg
J3IrXCdkIHBhdGNoZXMgb24gYSBidWcnLCAnQlVHSUQnKQorCisgICAgZGVmIGV4ZWN1dGUoc2Vs
Ziwgb3B0aW9ucywgYXJncywgdG9vbCk6CisgICAgICAgIGJ1Z19pZCA9IGFyZ3NbMF0KKyAgICAg
ICAgcGF0Y2hlc190b19sYW5kID0gdG9vbC5idWdzLmZldGNoX3Jldmlld2VkX3BhdGNoZXNfZnJv
bV9idWcoYnVnX2lkKQorICAgICAgICBmb3IgcGF0Y2ggaW4gcGF0Y2hlc190b19sYW5kOgorICAg
ICAgICAgICAgcHJpbnQgcGF0Y2hbJ3VybCddCisKKworY2xhc3MgQXBwbHlQYXRjaGVzRnJvbUJ1
ZyAoQ29tbWFuZCk6CisgICAgZGVmIF9faW5pdF9fKHNlbGYpOgorICAgICAgICBDb21tYW5kLl9f
aW5pdF9fKHNlbGYsICdBcHBsaWVzIGFsbCBwYXRjaGVzIG9uIGEgYnVnIHRvIHRoZSBsb2NhbCB3
b3JraW5nIGRpcmVjdG9yeSB3aXRob3V0IGNvbW1pdHRpbmcuJywgJ0JVR0lEJykKKworICAgIGRl
ZiBleGVjdXRlKHNlbGYsIG9wdGlvbnMsIGFyZ3MsIHRvb2wpOgorICAgICAgICBidWdfaWQgPSBh
cmdzWzBdCisgICAgICAgIHBhdGNoZXMgPSB0b29sLmJ1Z3MuZmV0Y2hfcmV2aWV3ZWRfcGF0Y2hl
c19mcm9tX2J1ZyhidWdfaWQpCisgICAgICAgIGNoZGlyX3dlYmtpdCgpCisgICAgICAgIHRvb2wu
c2NtKCkuZW5zdXJlX2NsZWFuX3dvcmtpbmdfZGlyZWN0b3J5KCkKKyAgICAgICAgdG9vbC5zY20o
KS51cGRhdGVfd2Via2l0KCkKKyAgICAgICAgIyBTaG91bGQgd2UgZXJyb3Igb3V0IGlmIHRvb2wu
c2NtIGRvZXMgbm90IHN1cHBvcnQgbG9jYWwgY29tbWl0cz8KKyAgICAgICAgZm9yIHBhdGNoIGlu
IHBhdGNoZXM6CisgICAgICAgICAgICB0b29sLnNjbSgpLmFwcGx5X3BhdGNoKHBhdGNoKQorCisK
K2RlZiBidWdfY29tbWVudF9mcm9tX2NvbW1pdF90ZXh0KGNvbW1pdF90ZXh0KToKKyAgICBjb21t
ZW50X2xpbmVzID0gW10KKyAgICBjb21taXRfbGluZXMgPSBjb21taXRfdGV4dC5zcGxpdGxpbmVz
KCkKKyAgICBmb3IgbGluZSBpbiBjb21taXRfbGluZXM6CisgICAgICAgIGNvbW1lbnRfbGluZXMu
YXBwZW5kKGxpbmUpCisgICAgICAgIG1hdGNoID0gcmUubWF0Y2goIl5Db21taXR0ZWQgcihcZCsp
JCIsIGxpbmUpCisgICAgICAgIGlmIG1hdGNoOgorICAgICAgICAgICAgcmV2aXNpb24gPSBtYXRj
aC5ncm91cCgxKQorICAgICAgICAgICAgY29tbWVudF9saW5lcy5hcHBlbmQoImh0dHA6Ly90cmFj
LndlYmtpdC5vcmcvY2hhbmdlc2V0LyIgKyByZXZpc2lvbikKKyAgICAgICAgICAgIGJyZWFrCisg
ICAgcmV0dXJuICJcbiIuam9pbihjb21tZW50X2xpbmVzKQorCitjbGFzcyBMYW5kQW5kVXBkYXRl
QnVnIChDb21tYW5kKToKKyAgICBkZWYgX19pbml0X18oc2VsZik6CisgICAgICAgIENvbW1hbmQu
X19pbml0X18oc2VsZiwgJ0xhbmRzIHRoZSBjdXJyZW50IHdvcmtpbmcgZGlyZWN0b3J5IGRpZmYg
YW5kIHVwZGF0ZXMgdGhlIGJ1Zy4nLCAnQlVHSUQnKQorCisgICAgZGVmIGV4ZWN1dGUoc2VsZiwg
b3B0aW9ucywgYXJncywgdG9vbCk6CisgICAgICAgIGJ1Z19pZCA9IGFyZ3NbMF0KKyAgICAgICAg
Y29tbWl0X21lc3NhZ2UgPSBjb21taXRfbWVzc2FnZV9mb3JfdGhpc19jb21taXQodG9vbC5zY20o
KSkKKyAgICAgICAgY29tbWl0X2xvZyA9IHRvb2wuc2NtKCkuY29tbWl0X3dpdGhfbWVzc2FnZShj
b21taXRfbWVzc2FnZSkKKyAgICAgICAgY29tbWVudF90ZXh0ID0gYnVnX2NvbW1lbnRfZnJvbV9j
b21taXRfdGV4dChjb21taXRfbG9nKQorICAgICAgICB0b29sLmJ1Z3MuY2xvc2VfYnVnX2FzX2Zp
eGVkKGJ1Z19pZCwgY29tbWl0X3RleHQpCisKKworY2xhc3MgU2NyaXB0RXJyb3IoRXhjZXB0aW9u
KToKKyAgICBwYXNzCisKK2NsYXNzIExhbmRQYXRjaGVzRnJvbUJ1ZyAoQ29tbWFuZCk6CisgICAg
ZGVmIF9faW5pdF9fKHNlbGYpOgorICAgICAgICBvcHRpb25zID0gWworICAgICAgICAgICAgbWFr
ZV9vcHRpb24oIi0tbm8tYnVpbGQiLCBhY3Rpb249InN0b3JlX2ZhbHNlIiwgZGVzdD0iYnVpbGQi
LCBkZWZhdWx0PVRydWUsIGhlbHA9IkNvbW1pdCB3aXRob3V0IGJ1aWxkaW5nIGZpcnN0LCBpbXBs
aWVzIC0tbm8tdGVzdC4iKSwKKyAgICAgICAgICAgIG1ha2Vfb3B0aW9uKCItLW5vLXRlc3QiLCBh
Y3Rpb249InN0b3JlX2ZhbHNlIiwgZGVzdD0idGVzdCIsIGRlZmF1bHQ9VHJ1ZSwgaGVscD0iQ29t
bWl0IHdpdGhvdXQgcnVubm5pbmcgcnVuLXdlYmtpdC10ZXN0cy4iKQorICAgICAgICBdCisgICAg
ICAgIENvbW1hbmQuX19pbml0X18oc2VsZiwgJ0xhbmRzIGFsbCBwYXRjaGVzIG9uIGEgYnVnIG9w
dGlvbmFsbHkgdGVzdGluZyB0aGVtIGZpcnN0JywgJ0JVR0lEJywgb3B0aW9ucz1vcHRpb25zKQor
CisgICAgZGVmIHJ1bl9hbmRfdGhyb3dfaWZfZmFpbChzZWxmLCBzY3JpcHRfbmFtZSk6CisgICAg
ICAgIGJ1aWxkX3dlYmtpdF9wcm9jZXNzID0gc3VicHJvY2Vzcy5Qb3BlbihzY3JpcHRfbmFtZSwg
c2hlbGw9VHJ1ZSkKKyAgICAgICAgcmV0dXJuX2NvZGUgPSBidWlsZF93ZWJraXRfcHJvY2Vzcy53
YWl0KCkKKyAgICAgICAgaWYgcmV0dXJuX2NvZGUgIT0gMDoKKyAgICAgICAgICAgIHJhaXNlIFNj
cmlwdEVycm9yKHNjcmlwdF9uYW1lICsgIiBmYWlsZWQgd2l0aCBjb2RlICIgKyByZXR1cm5fY29k
ZSkKKworICAgIGRlZiBidWlsZF93ZWJraXQoc2VsZik6CisgICAgICAgIHNlbGYucnVuX2FuZF90
aHJvd19pZl9mYWlsKCJidWlsZC13ZWJraXQiKQorCisgICAgZGVmIHJ1bl93ZWJraXRfdGVzdHMo
c2VsZik6CisgICAgICAgIHNlbGYucnVuX2FuZF90aHJvd19pZl9mYWlsKCJydW4td2Via2l0LXRl
c3RzIikKKworICAgIGRlZiBleGVjdXRlKHNlbGYsIG9wdGlvbnMsIGFyZ3MsIHRvb2wpOgorICAg
ICAgICBidWdfaWQgPSBhcmdzWzBdCisKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgcGF0Y2hl
cyA9IHRvb2wuYnVncy5mZXRjaF9yZXZpZXdlZF9wYXRjaGVzX2Zyb21fYnVnKGJ1Z19pZCkKKyAg
ICAgICAgICAgIGNvbW1pdF90ZXh0ID0gIiIKKworICAgICAgICAgICAgZm9yIHBhdGNoIGluIHBh
dGNoZXM6CisgICAgICAgICAgICAgICAgY2hkaXJfd2Via2l0KCkKKyAgICAgICAgICAgICAgICB0
b29sLnNjbSgpLmVuc3VyZV9jbGVhbl93b3JraW5nX2RpcmVjdG9yeSgpCisgICAgICAgICAgICAg
ICAgdG9vbC5zY20oKS51cGRhdGVfd2Via2l0KCkKKyAgICAgICAgICAgICAgICB0b29sLnNjbSgp
LmFwcGx5X3BhdGNoKHBhdGNoKQorICAgICAgICAgICAgICAgIGlmIChvcHRpb25zLmJ1aWxkKToK
KyAgICAgICAgICAgICAgICAgICAgc2VsZi5idWlsZF93ZWJraXQoKQorICAgICAgICAgICAgICAg
ICAgICBpZiAob3B0aW9ucy50ZXN0KToKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYucnVu
X3dlYmtpdF90ZXN0cygpCisgICAgICAgICAgICAgICAgY29tbWl0X21lc3NhZ2UgPSBjb21taXRf
bWVzc2FnZV9mb3JfdGhpc19jb21taXQodG9vbC5zY20oKSkKKyAgICAgICAgICAgICAgICBjb21t
aXRfbG9nID0gdG9vbC5zY20oKS5jb21taXRfd2l0aF9tZXNzYWdlKGNvbW1pdF9tZXNzYWdlKQor
ICAgICAgICAgICAgICAgIGNvbW1lbnRfdGV4dCA9IGJ1Z19jb21tZW50X2Zyb21fY29tbWl0X3Rl
eHQoY29tbWl0X2xvZykKKyAgICAgICAgICAgICAgICAjIGlmIHdlJ3JlIGNvbW1pdGluZyBtb3Jl
IHRoYW4gb25lIHBhdGNoLCB1cGRhdGUgdGhlIGJ1ZyBhcyB3ZSBnbworICAgICAgICAgICAgICAg
IGlmIGxlbihwYXRjaGVzKSA+IDE6CisgICAgICAgICAgICAgICAgICAgIHRvb2wuYnVncy5vYnNv
bGV0ZV9hdHRhY2htZW50KHBhdGNoWydpZCddLCBjb21tZW50X3RleHQpCisKKyAgICAgICAgICAg
IGlmIGxlbihwYXRjaGVzKSA+IDE6CisgICAgICAgICAgICAgICAgY29tbWl0X3RleHQgPSAiQWxs
IHJldmlld2VkIHBhdGNoZXMgbGFuZGVkLCBjbG9zaW5nLiIKKworICAgICAgICAgICAgdG9vbC5i
dWdzLmNsb3NlX2J1Z19hc19maXhlZChidWdfaWQsIGNvbW1pdF90ZXh0KQorICAgICAgICBleGNl
cHQgU2NyaXB0RXJyb3IsIGVycm9yOgorICAgICAgICAgICAgbG9nKGVycm9yKQorICAgICAgICAg
ICAgIyBXZSBjb3VsZCBhZGQgYSBjb21tZW50IHRvIHRoZSBidWcgYWJvdXQgdGhlIGZhaWx1cmUK
KworCitjbGFzcyBDb21taXRNZXNzYWdlRm9yQ3VycmVudERpZmYgKENvbW1hbmQpOgorICAgIGRl
ZiBfX2luaXRfXyhzZWxmKToKKyAgICAgICAgQ29tbWFuZC5fX2luaXRfXyhzZWxmLCAnUHJpbnRz
IGEgY29tbWl0IG1lc3NhZ2Ugc3VpdGFibGUgZm9yIHRoZSB1bmNvbW1pdHRlZCBjaGFuZ2VzLicp
CisKKyAgICBkZWYgZXhlY3V0ZShzZWxmLCBvcHRpb25zLCBhcmdzLCB0b29sKToKKyAgICAgICAg
cHJpbnQgY29tbWl0X21lc3NhZ2VfZm9yX3RoaXNfY29tbWl0KHRvb2wuc2NtKCkpCisKKworY2xh
c3MgT2Jzb2xldGVBdHRhY2htZW50c09uQnVnIChDb21tYW5kKToKKyAgICBkZWYgX19pbml0X18o
c2VsZik6CisgICAgICAgIENvbW1hbmQuX19pbml0X18oc2VsZiwgJ01hcmtzIGFsbCBhdHRhY2ht
ZW50cyBvbiBhIGJ1ZyBhcyBvYnNvbGV0ZS4nLCAnQlVHSUQnKQorCisgICAgZGVmIGV4ZWN1dGUo
c2VsZiwgb3B0aW9ucywgYXJncywgdG9vbCk6CisgICAgICAgIGJ1Z19pZCA9IGFyZ3NbMF0KKyAg
ICAgICAgYXR0YWNobWVudHMgPSB0b29sLmJ1Z3MuZmV0Y2hfYXR0YWNobWVudHNfZnJvbV9idWco
YnVnX2lkKQorICAgICAgICBmb3IgYXR0YWNobWVudCBpbiBhdHRhY2htZW50czoKKyAgICAgICAg
ICAgIGlmIG5vdCBhdHRhY2htZW50WydvYnNvbGV0ZSddOgorICAgICAgICAgICAgICAgIHRvb2wu
YnVncy5vYnNvbGV0ZV9hdHRhY2htZW50KGF0dGFjaG1lbnRbJ2lkJ10pCisKKworY2xhc3MgUG9z
dERpZmZBc1BhdGNoVG9CdWcgKENvbW1hbmQpOgorICAgIGRlZiBfX2luaXRfXyhzZWxmKToKKyAg
ICAgICAgQ29tbWFuZC5fX2luaXRfXyhzZWxmLCAnQXR0YWNoZXMgdGhlIGN1cnJlbnQgd29ya2lu
ZyBkaXJlY3RvcnkgZGlmZiB0byBhIGJ1ZyBhcyBhIHBhdGNoIGZpbGUuJywgJ0JVR0lEJykKKwor
ICAgIGRlZiBleGVjdXRlKHNlbGYsIG9wdGlvbnMsIGFyZ3MsIHRvb2wpOgorICAgICAgICBidWdf
aWQgPSBhcmdzWzBdCisgICAgICAgIGRlc2NyaXB0aW9uID0gYXJnc1sxXQorICAgICAgICAjIE5l
ZWQgYXJnIHBhcnNpbmchCisgICAgICAgIAorICAgICAgICBkaWZmX3Byb2Nlc3MgPSBzdWJwcm9j
ZXNzLlBvcGVuKHRvb2wuc2NtKCkuZGlmZl9jb21tYW5kKCksIHN0ZG91dD1zdWJwcm9jZXNzLlBJ
UEUsIHNoZWxsPVRydWUpCisgICAgICAgIAorICAgICAgICB0b29sLmJ1Z3MuYWRkX3BhdGNoX3Rv
X2J1ZyhidWdfaWQsIGRpZmZfcHJvY2Vzcy5zdGRvdXQsIGRlc2NyaXB0aW9uLCBtYXJrX2Zvcl9y
ZXZpZXc9VHJ1ZSkKKworCitjbGFzcyBQb3N0Q29tbWl0c0FzUGF0Y2hlc1RvQnVnIChDb21tYW5k
KToKKyAgICBkZWYgX19pbml0X18oc2VsZik6CisgICAgICAgIENvbW1hbmQuX19pbml0X18oc2Vs
ZiwgJ0F0dGFjaGVzIGEgcmFuZ2Ugb2YgbG9jYWwgY29tbWl0cyB0byBhIGJ1ZyBhcyBwYXRjaCBm
aWxlcy4nLCAnQlVHSUQgQ09NTUlUSVNIJykKKworICAgIGRlZiBleGVjdXRlKHNlbGYsIG9wdGlv
bnMsIGFyZ3MsIHRvb2wpOgorICAgICAgICBidWdfaWQgPSBhcmdzWzBdCisgICAgICAgIAorICAg
ICAgICBpZiBub3QgdG9vbC5zY20oKS5zdXBwb3J0c19sb2NhbF9jb21taXRzKCk6CisgICAgICAg
ICAgICBsb2codG9vbC5zY20oKS5kaXNwbGF5X25hbWUoKSArICIgZG9lcyBub3Qgc3VwcG9ydCBs
b2NhbCBjb21taXRzLiIpCisgICAgICAgICAgICBleGl0KDEpCisgICAgICAgIAorICAgICAgICBj
b21taXRfaWRzID0gdG9vbC5zY20oKS5jb21taXRfaWRzX2Zyb21fcmFuZ2VfYXJndW1lbnRzKGFy
Z3NbMTpdKQorICAgICAgICAKKyAgICAgICAgaWYgbGVuKGNvbW1pdF9pZHMpID4gMTA6CisgICAg
ICAgICAgICBsb2coIkFyZSB5b3Ugc3VyZSB5b3Ugd2FudCB0byBhdHRhY2ggJWQgcGF0Y2hlcyB0
byBidWcgJXM/IiAlIChsZW4oY29tbWl0X2lkcyksIGJ1Z19pZCkpCisgICAgICAgICAgICAjIFNo
b3VsZCBzdXBwb3J0IGEgLS1mb3JjZSBvcHRpb24KKyAgICAgICAgICAgIGV4aXQoMSkKKyAgICAg
ICAgCisgICAgICAgIGxvZygiQXR0YWNoaW5nICVkIGNvbW1pdHMgYXMgcGF0Y2hlcyB0byBidWcg
JXMiICUgKGxlbihjb21taXRfaWRzKSwgYnVnX2lkKSkKKyAgICAgICAgZm9yIGNvbW1pdF9pZCBp
biBjb21taXRfaWRzOgorICAgICAgICAgICAgY29tbWl0X21lc3NhZ2UgPSB0b29sLnNjbSgpLmNv
bW1pdF9tZXNzYWdlX2Zvcl9jb21taXQoY29tbWl0X2lkKQorICAgICAgICAgICAgY29tbWl0X2xp
bmVzID0gY29tbWl0X21lc3NhZ2Uuc3BsaXRsaW5lcygpCisgICAgICAgICAgICAKKyAgICAgICAg
ICAgIGRlc2NyaXB0aW9uID0gY29tbWl0X2xpbmVzWzBdCisgICAgICAgICAgICBjb21tZW50X3Rl
eHQgPSAiXG4iLmpvaW4oY29tbWl0X2xpbmVzWzE6XSkKKyAgICAgICAgCisgICAgICAgICAgICBj
b21tZW50X3RleHQgKz0gIlxuLS0tXG4iCisgICAgICAgICAgICBjb21tZW50X3RleHQgKz0gdG9v
bC5zY20oKS5maWxlc19jaGFuZ2VkX3N1bW1hcnlfZm9yX2NvbW1pdChjb21taXRfaWQpCisgICAg
ICAgIAorICAgICAgICAgICAgIyBUaGlzIGlzIGEgbGl0dGxlIGJpdCBvZiBhIGhhY2ssIHRoYXQg
d2UgcGFzcyBzdGRvdXQgYXMgdGhlIHBhdGNoIGZpbGUKKyAgICAgICAgICAgICMgV2UgY291bGQg
YWx0ZXJuYXRpdmVseSBtYWtlIGFuIGluLW1lbW9yeSBmaWxlLWxpa2Ugb2JqZWN0IHdpdGggdGhl
IHBhdGNoIGNvbnRlbnRzCisgICAgICAgICAgICBkaWZmX3Byb2Nlc3MgPSBzdWJwcm9jZXNzLlBv
cGVuKHRvb2wuc2NtKCkuc2hvd19kaWZmX2NvbW1hbmRfZm9yX2NvbW1pdChjb21taXRfaWQpLCBz
dGRvdXQ9c3VicHJvY2Vzcy5QSVBFLCBzaGVsbD1UcnVlKQorICAgICAgICAgICAgdG9vbC5idWdz
LmFkZF9wYXRjaF90b19idWcoYnVnX2lkLCBkaWZmX3Byb2Nlc3Muc3Rkb3V0LCBkZXNjcmlwdGlv
biwgY29tbWVudF90ZXh0LCBtYXJrX2Zvcl9yZXZpZXc9VHJ1ZSkKKworCitjbGFzcyBOb25XcmFw
cGluZ0VwaWxvZ0luZGVudGVkSGVscEZvcm1hdHRlciAoSW5kZW50ZWRIZWxwRm9ybWF0dGVyKToK
KyAgICBkZWYgX19pbml0X18oc2VsZik6CisgICAgICAgIEluZGVudGVkSGVscEZvcm1hdHRlci5f
X2luaXRfXyhzZWxmKQorCisgICAgIyBUaGUgc3RhbmRhcmQgSW5kZW50ZWRIZWxwRm9ybWF0dGVy
IHJlLXdyYXBzIHRoZSBlcGlsb2chCisgICAgZGVmIGZvcm1hdF9lcGlsb2coc2VsZiwgZXBpbG9n
KToKKyAgICAgICAgaWYgZXBpbG9nOgorICAgICAgICAgICAgcmV0dXJuICJcbiIgKyBlcGlsb2cg
KyAiXG4iCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByZXR1cm4gIiIKKworY2xhc3MgQnVn
emlsbGFUb29sOgorICAgIGRlZiBfX2luaXRfXyhzZWxmKToKKyAgICAgICAgc2VsZi5jYWNoZWRf
c2NtID0gTm9uZQorICAgICAgICBzZWxmLmJ1Z3MgPSBCdWd6aWxsYSgpCisgICAgICAgIHNlbGYu
Y29tbWFuZHMgPSBbCisgICAgICAgICAgICB7ICduYW1lJyA6ICdidWdzLXRvLWNvbW1pdCcsICdv
YmplY3QnIDogQnVnc0luQ29tbWl0UXVldWUoKSB9LAorICAgICAgICAgICAgeyAnbmFtZScgOiAn
cGF0Y2hlcy10by1jb21taXQnLCAnb2JqZWN0JyA6IFBhdGNoZXNJbkNvbW1pdFF1ZXVlKCkgfSwK
KyAgICAgICAgICAgIHsgJ25hbWUnIDogJ3Jldmlld2VkLXBhdGNoZXMnLCAnb2JqZWN0JyA6IFJl
dmlld2VkUGF0Y2hlc09uQnVnKCkgfSwKKyAgICAgICAgICAgIHsgJ25hbWUnIDogJ2FwcGx5LXBh
dGNoZXMnLCAnb2JqZWN0JyA6IEFwcGx5UGF0Y2hlc0Zyb21CdWcoKSB9LAorICAgICAgICAgICAg
eyAnbmFtZScgOiAnbGFuZC1hbmQtdXBkYXRlJywgJ29iamVjdCcgOiBMYW5kQW5kVXBkYXRlQnVn
KCkgfSwKKyAgICAgICAgICAgIHsgJ25hbWUnIDogJ2xhbmQtcGF0Y2hlcycsICdvYmplY3QnIDog
TGFuZFBhdGNoZXNGcm9tQnVnKCkgfSwKKyAgICAgICAgICAgIHsgJ25hbWUnIDogJ2NvbW1pdC1t
ZXNzYWdlJywgJ29iamVjdCcgOiBDb21taXRNZXNzYWdlRm9yQ3VycmVudERpZmYoKSB9LAorICAg
ICAgICAgICAgeyAnbmFtZScgOiAnb2Jzb2xldGUtYXR0YWNobWVudHMnLCAnb2JqZWN0JyA6IE9i
c29sZXRlQXR0YWNobWVudHNPbkJ1ZygpIH0sCisgICAgICAgICAgICB7ICduYW1lJyA6ICdwb3N0
LWRpZmYnLCAnb2JqZWN0JyA6IFBvc3REaWZmQXNQYXRjaFRvQnVnKCkgfSwKKyAgICAgICAgICAg
IHsgJ25hbWUnIDogJ3Bvc3QtY29tbWl0cycsICdvYmplY3QnIDogUG9zdENvbW1pdHNBc1BhdGNo
ZXNUb0J1ZygpIH0sCisgICAgICAgIF0KKyAgICAgICAgCisgICAgICAgIHNlbGYuZ2xvYmFsX29w
dGlvbl9wYXJzZXIgPSBPcHRpb25QYXJzZXIodXNhZ2U9c2VsZi51c2FnZV9saW5lKCksIGZvcm1h
dHRlcj1Ob25XcmFwcGluZ0VwaWxvZ0luZGVudGVkSGVscEZvcm1hdHRlcigpLCBlcGlsb2c9c2Vs
Zi5jb21tYW5kc191c2FnZSgpKQorICAgICAgICBzZWxmLmdsb2JhbF9vcHRpb25fcGFyc2VyLmFk
ZF9vcHRpb24oIi0tZHJ5LXJ1biIsIGFjdGlvbj0ic3RvcmVfdHJ1ZSIsIGRlc3Q9ImRyeXJ1biIs
IGhlbHA9ImRvIG5vdCB0b3VjaCByZW1vdGUgc2VydmVycyIsIGRlZmF1bHQ9RmFsc2UpCisgICAg
CisgICAgZGVmIHNjbShzZWxmKToKKyAgICAgICAgaWYgbm90IHNlbGYuY2FjaGVkX3NjbToKKyAg
ICAgICAgICAgICMgTGF6aWx5IGluaXRpYWxpemluZyBTQ00gdG8gbm90IGVycm9yLW91dCBiZWZv
cmUgY29tbWFuZCBsaW5lIHBhcnNpbmcKKyAgICAgICAgICAgIHNlbGYuY2FjaGVkX3NjbSA9IGRl
dGVjdF9zY21fc3lzdGVtKCIuIikKKworICAgICAgICByZXR1cm4gc2VsZi5jYWNoZWRfc2NtCisg
ICAgCisgICAgZGVmIHVzYWdlX2xpbmUoc2VsZik6CisgICAgICAgIHJldHVybiAiVXNhZ2U6ICVw
cm9nIFtvcHRpb25zXSBjb21tYW5kIFtjb21tYW5kLW9wdGlvbnNdIFtjb21tYW5kLWFyZ3VtZW50
c10iCisgICAgCisgICAgZGVmIGNvbW1hbmRzX3VzYWdlKHNlbGYpOgorICAgICAgICBjb21tYW5k
c190ZXh0ID0gIkNvbW1hbmRzOlxuIgorICAgICAgICBsb25nZXN0X25hbWVfbGVuZ3RoID0gMAor
ICAgICAgICBjb21tYW5kX3Jvd3MgPSBbXQorICAgICAgICBmb3IgY29tbWFuZCBpbiBzZWxmLmNv
bW1hbmRzOgorICAgICAgICAgICAgY29tbWFuZF9vYmplY3QgPSBjb21tYW5kWydvYmplY3QnXQor
ICAgICAgICAgICAgY29tbWFuZF9uYW1lX2FuZF9hcmdzID0gY29tbWFuZF9vYmplY3QubmFtZV93
aXRoX2FyZ3VtZW50cyhjb21tYW5kWyduYW1lJ10pCisgICAgICAgICAgICBjb21tYW5kX3Jvd3Mu
YXBwZW5kKHsgJ25hbWUtYW5kLWFyZ3MnOiBjb21tYW5kX25hbWVfYW5kX2FyZ3MsICdvYmplY3Qn
OiBjb21tYW5kX29iamVjdCB9KQorICAgICAgICAgICAgbG9uZ2VzdF9uYW1lX2xlbmd0aCA9IG1h
eChbbG9uZ2VzdF9uYW1lX2xlbmd0aCwgbGVuKGNvbW1hbmRfbmFtZV9hbmRfYXJncyldKQorICAg
ICAgICAKKyAgICAgICAgIyBVc2Ugb3VyIG93biBoZWxwIGZvcm1hdHRlciBzbyBhcyB0byBpbmRl
bnQgZW5vdWdoCisgICAgICAgIGZvcm1hdHRlciA9IEluZGVudGVkSGVscEZvcm1hdHRlcigpCisg
ICAgICAgIGZvcm1hdHRlci5pbmRlbnQoKQorICAgICAgICBmb3JtYXR0ZXIuaW5kZW50KCkKKyAg
ICAgICAgCisgICAgICAgIGZvciByb3cgaW4gY29tbWFuZF9yb3dzOgorICAgICAgICAgICAgY29t
bWFuZF9vYmplY3QgPSByb3dbJ29iamVjdCddCisgICAgICAgICAgICBjb21tYW5kc190ZXh0ICs9
ICIgICIgKyByb3dbJ25hbWUtYW5kLWFyZ3MnXS5sanVzdChsb25nZXN0X25hbWVfbGVuZ3RoICsg
MykgKyBjb21tYW5kX29iamVjdC5oZWxwX3RleHQgKyAiXG4iCisgICAgICAgICAgICBjb21tYW5k
c190ZXh0ICs9IGNvbW1hbmRfb2JqZWN0Lm9wdGlvbl9wYXJzZXIuZm9ybWF0X29wdGlvbl9oZWxw
KGZvcm1hdHRlcikKKyAgICAgICAgcmV0dXJuIGNvbW1hbmRzX3RleHQKKworICAgIGRlZiBoYW5k
bGVfZ2xvYmFsX2FyZ3Moc2VsZiwgYXJncyk6CisgICAgICAgIChvcHRpb25zLCBhcmdzKSA9IHNl
bGYuZ2xvYmFsX29wdGlvbl9wYXJzZXIucGFyc2VfYXJncyhhcmdzKQorICAgICAgICBpZiBsZW4o
YXJncyk6CisgICAgICAgICAgICAjIFdlJ2xsIG5ldmVyIGhpdCB0aGlzIGJlY2F1c2Ugc3BsaXRf
YXJncyBzcGxpdHMgYXQgdGhlIGZpcnN0IGFyZyB3aXRob3V0IGEgbGVhZGluZyAnLScKKyAgICAg
ICAgICAgIHNlbGYuZ2xvYmFsX29wdGlvbl9wYXJzZXIuZXJyb3IoIkV4dHJhIGFyZ3VtZW50cyBi
ZWZvcmUgY29tbWFuZDogIiArIGFyZ3MpCisgICAgICAgIAorICAgICAgICBpZiBvcHRpb25zLmRy
eXJ1bjoKKyAgICAgICAgICAgIHNlbGYuc2NtKCkuZHJ5cnVuID0gVHJ1ZQorICAgICAgICAgICAg
c2VsZi5idWdzLmRyeXJ1biA9IFRydWUKKyAgICAKKyAgICBkZWYgc3BsaXRfYXJncyhzZWxmLCBh
cmdzKToKKyAgICAgICAgIyBBc3N1bWUgdGhlIGZpcnN0IGFyZ3VtZW50IHdoaWNoIGRvZXNuJ3Qg
c3RhcnQgd2l0aCAnLScgaXMgdGhlIGNvbW1hbmQgbmFtZQorICAgICAgICBjb21tYW5kX2luZGV4
ID0gMAorICAgICAgICBmb3IgYXJnIGluIGFyZ3M6CisgICAgICAgICAgICBpZiBhcmdbMF0gIT0g
Jy0nOgorICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICBjb21tYW5kX2luZGV4ICs9
IDEKKworICAgICAgICBnbG9iYWxfYXJncyA9IGFyZ3NbOmNvbW1hbmRfaW5kZXhdCisgICAgICAg
IGlmIGNvbW1hbmRfaW5kZXggPj0gbGVuKGFyZ3MpOgorICAgICAgICAgICAgcmV0dXJuIChnbG9i
YWxfYXJncywgTm9uZSwgW10pCisKKyAgICAgICAgY29tbWFuZCA9IGFyZ3NbY29tbWFuZF9pbmRl
eF0KKyAgICAgICAgY29tbWFuZF9hcmdzID0gYXJnc1tjb21tYW5kX2luZGV4ICsgMTpdCisgICAg
ICAgIHJldHVybiAoZ2xvYmFsX2FyZ3MsIGNvbW1hbmQsIGNvbW1hbmRfYXJncykKKyAgICAKKyAg
ICBkZWYgY29tbWFuZF9ieV9uYW1lKHNlbGYsIGNvbW1hbmRfbmFtZSk6CisgICAgICAgIGZvciBj
b21tYW5kIGluIHNlbGYuY29tbWFuZHM6CisgICAgICAgICAgICBpZiBjb21tYW5kX25hbWUgPT0g
Y29tbWFuZFsnbmFtZSddOgorICAgICAgICAgICAgICAgIHJldHVybiBjb21tYW5kCisgICAgICAg
IHJldHVybiBOb25lCisgICAgCisgICAgZGVmIG1haW4oc2VsZik6CisgICAgICAgIChnbG9iYWxf
YXJncywgY29tbWFuZF9uYW1lLCBhcmdzX2FmdGVyX2NvbW1hbmRfbmFtZSkgPSBzZWxmLnNwbGl0
X2FyZ3Moc3lzLmFyZ3ZbMTpdKQorICAgICAgICAKKyAgICAgICAgIyBIYW5kbGUgLS1oZWxwLCBl
dGM6CisgICAgICAgIHNlbGYuaGFuZGxlX2dsb2JhbF9hcmdzKGdsb2JhbF9hcmdzKQorICAgICAg
ICAKKyAgICAgICAgaWYgbm90IGNvbW1hbmRfbmFtZToKKyAgICAgICAgICAgIHNlbGYuZ2xvYmFs
X29wdGlvbl9wYXJzZXIuZXJyb3IoIk5vIGNvbW1hbmQgc3BlY2lmaWVkIikKKyAgICAgICAgCisg
ICAgICAgIGNvbW1hbmQgPSBzZWxmLmNvbW1hbmRfYnlfbmFtZShjb21tYW5kX25hbWUpCisgICAg
ICAgIGlmIG5vdCBjb21tYW5kOgorICAgICAgICAgICAgc2VsZi5nbG9iYWxfb3B0aW9uX3BhcnNl
ci5lcnJvcihjb21tYW5kX25hbWUgKyAiIGlzIG5vdCBhIHJlY29nbml6ZWQgY29tbWFuZCIpCisg
ICAgICAgIAorICAgICAgICBjb21tYW5kX29iamVjdCA9IGNvbW1hbmRbJ29iamVjdCddCisgICAg
ICAgIChjb21tYW5kX29wdGlvbnMsIGNvbW1hbmRfYXJncykgPSBjb21tYW5kX29iamVjdC5wYXJz
ZV9hcmdzKGFyZ3NfYWZ0ZXJfY29tbWFuZF9uYW1lKQorICAgICAgICByZXR1cm4gY29tbWFuZF9v
YmplY3QuZXhlY3V0ZShjb21tYW5kX29wdGlvbnMsIGNvbW1hbmRfYXJncywgc2VsZikKKworCitk
ZWYgbWFpbigpOgorICAgIHRvb2wgPSBCdWd6aWxsYVRvb2woKQorICAgIHJldHVybiB0b29sLm1h
aW4oKQorCitpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgorICAgIG1haW4oKQo=
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>31573</attachid>
            <date>2009-06-19 16:39:09 -0700</date>
            <delta_ts>2009-06-19 16:44:52 -0700</delta_ts>
            <desc>Updated patch, split into modules, now supports --force-clean</desc>
            <filename>bugzilla_requires_a_filename.patch</filename>
            <type>text/plain</type>
            <size>42077</size>
            <attacher name="Eric Seidel (no email)">eric</attacher>
            
              <data encoding="base64">MWQ2YTc1YTQ0MGNiOWI1ODcwOTkzNTVmYTg1ZWNiYzE1MzFjMDI4ZQpkaWZmIC0tZ2l0IGEvV2Vi
S2l0VG9vbHMvQ2hhbmdlTG9nIGIvV2ViS2l0VG9vbHMvQ2hhbmdlTG9nCmluZGV4IDE0OTM3YTYu
LjU4ODViYzAgMTAwNjQ0Ci0tLSBhL1dlYktpdFRvb2xzL0NoYW5nZUxvZworKysgYi9XZWJLaXRU
b29scy9DaGFuZ2VMb2cKQEAgLTEsMyArMSw1OCBAQAorMjAwOS0wNi0xOCAgRXJpYyBTZWlkZWwg
IDxlcmljQHdlYmtpdC5vcmc+CisKKyAgICAgICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChPT1BTISku
CisKKyAgICAgICAgV2ViS2l0IG5lZWRzIGEgc2NyaXB0IHRvIGludGVyYWN0IHdpdGggYnVnemls
bGEgYW5kIGF1dG9tYXRlCisgICAgICAgIHBhcnRzIG9mIHRoZSBwYXRjaCBwb3N0aW5nIGFuZCBj
b21taXQgcHJvY2Vzc2VzLgorICAgICAgICBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1
Zy5jZ2k/aWQ9MjYyODMKKworICAgICAgICBUaGlzIGlzIHJlYWxseSBhIGZpcnN0LWRyYWZ0IHRv
b2wuCisgICAgICAgIEl0J3MgdG8gdGhlIHBvaW50IHdoZXJlIGl0J3MgdXNlZnVsIHRvIG1vcmUg
cGVvcGxlIHRoYW4ganVzdCBtZSBub3cgdGhvdWdoLgorICAgICAgICBHaXQgc3VwcG9ydCB3b3Jr
cy4gIFNWTiBzdXBwb3J0IGlzIHdyaXR0ZW4sIGJ1dCB1bnRlc3RlZC4KKworICAgICAgICBUaGlz
IHRvb2wgcmVxdWlyZXMgQmVhdXRpZnVsU291cCBhbmQgbWVjaGFuaXplIHB5dGhvbiBtb2R1bGVz
IHRvIHJ1bjoKKyAgICAgICAgc3VkbyBlYXN5X2luc3RhbGwgQmVhdXRpZnVsU291cAorICAgICAg
ICBzdWRvIGVhc3lfaW5zdGFsbCBtZWNoYW5pemUKKworICAgICAgICBNb3JlIGltcG9ydGFudCB0
aGFuIHRoZSB0b29sIGl0c2VsZiBhcmUgdGhlIEJ1Z3ppbGxhLCBHaXQgYW5kIFNWTiBjbGFzcyBh
YnN0cmFjdGlvbnMKKyAgICAgICAgd2hpY2ggSSBob3BlIHdpbGwgYWxsb3cgZWFzeSB3cml0aW5n
IG9mIGZ1dHVyZSB0b29scy4KKworICAgICAgICBJIGludGVuZCB0byBicmVhayBHaXQsIFNWTiBh
bmQgU0NNIG91dCBpbnRvIGFuIHNjbXRvb2xzLnB5IG1vZHVsZSBhZnRlciBsYW5kaW5nLgorICAg
ICAgICBMaWtld2lzZSwgQnVnemlsbGEgaW50byBhIGJ1Z3ppbGxhLnB5IG1vZHVsZS4gIEkgZmVs
dCBpdCB3b3VsZCBiZSBlYXNpZXIgdG8gcmV2aWV3IGluIG9uZSBmaWxlLgorCisgICAgICAgIFRo
ZSB0b29sIGN1cnJlbnRseSBpbXBsZW1lbnRzIDEwIGNvbW1hbmRzLCBkZXNjcmliZWQgYmVsb3cu
CisKKyAgICAgICAgSGVscGVycyBmb3Igc2NyaXB0aW5nIGRlYWxpbmcgd2l0aCB0aGUgY29tbWl0
IHF1ZXVlOgorICAgICAgICBidWdzLXRvLWNvbW1pdCAgICAgICAgICAgICAgICAgQnVncyBpbiB0
aGUgY29tbWl0IHF1ZXVlCisgICAgICAgIHBhdGNoZXMtdG8tY29tbWl0ICAgICAgICAgICAgICBQ
YXRjaGVzIGF0dGFjaGVkIHRvIGJ1Z3MgaW4gdGhlIGNvbW1pdCBxdWV1ZQorCisgICAgICAgIERl
YWxpbmcgd2l0aCBidWd6aWxsYToKKyAgICAgICAgcmV2aWV3ZWQtcGF0Y2hlcyBCVUdJRCAgICAg
ICAgIHIrJ2QgcGF0Y2hlcyBvbiBhIGJ1ZworICAgICAgICBhcHBseS1wYXRjaGVzIEJVR0lEICAg
ICAgICAgICAgQXBwbGllcyBhbGwgcGF0Y2hlcyBvbiBhIGJ1ZyB0byB0aGUgbG9jYWwgd29ya2lu
ZyBkaXJlY3Rvcnkgd2l0aG91dCBjb21taXR0aW5nLgorICAgICAgICBsYW5kLWFuZC11cGRhdGUg
QlVHSUQgICAgICAgICAgTGFuZHMgdGhlIGN1cnJlbnQgd29ya2luZyBkaXJlY3RvcnkgZGlmZiBh
bmQgdXBkYXRlcyB0aGUgYnVnLgorICAgICAgICBsYW5kLXBhdGNoZXMgW29wdGlvbnNdIEJVR0lE
ICAgTGFuZHMgYWxsIHBhdGNoZXMgb24gYSBidWcgb3B0aW9uYWxseSB0ZXN0aW5nIHRoZW0gZmly
c3QKKyAgICAgICAgb2Jzb2xldGUtYXR0YWNobWVudHMgQlVHSUQgICAgIE1hcmtzIGFsbCBhdHRh
Y2htZW50cyBvbiBhIGJ1ZyBhcyBvYnNvbGV0ZS4KKyAgICAgICAgY29tbWl0LW1lc3NhZ2UgICAg
ICAgICAgICAgICAgIFByaW50cyBhIGNvbW1pdCBtZXNzYWdlIHN1aXRhYmxlIGZvciB0aGUgdW5j
b21taXR0ZWQgY2hhbmdlcy4KKworICAgICAgICBUaGVzZSBlZmZlY3RpdmVseSByZXBsYWNlIGdp
dC1zZW5kLWJ1Z3ppbGxhOgorICAgICAgICBwb3N0LWRpZmYgQlVHSUQgICAgICAgICAgICAgICAg
QXR0YWNoZXMgdGhlIGN1cnJlbnQgd29ya2luZyBkaXJlY3RvcnkgZGlmZiB0byBhIGJ1ZyBhcyBh
IHBhdGNoIGZpbGUuCisgICAgICAgIHBvc3QtY29tbWl0cyBCVUdJRCBDT01NSVRJU0ggICBBdHRh
Y2hlcyBhIHJhbmdlIG9mIGxvY2FsIGNvbW1pdHMgdG8gYSBidWcgYXMgcGF0Y2ggZmlsZXMuCisK
KyAgICAgICAgcG9zdC1kaWZmIHdvcmtzIGZvciBTVk4gYW5kIEdpdCwgcG9zdC1jb21taXRzIG9u
bHkgd29ya3MgZm9yIFNDTXMgd2l0aCBsb2NhbC1jb21taXQgc3VwcG9ydCAobGlrZSBHaXQpCisK
KyAgICAgICAgbGFuZC0qIGNvbW1hbmRzIGluIGEgR2l0IGVudmlyb25tZW50IG9ubHkgd29yayB3
aXRoIHNpbXBsZSBwYXRjaGVzIGR1ZSB0byBzdm4tYXBwbHkgYnVnczoKKyAgICAgICAgaHR0cHM6
Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTI2Mjk5CisgICAgICAgIGh0dHBzOi8v
YnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0yNjMwMAorCisgICAgICAgIFRoaXMgc2Ny
aXB0IGZvbGxvd3MgcHl0aG9uIHN0eWxlIChzaW1pbGFyIHRvIGhvdyBmb3IgT2JqLUMgd2UgZm9s
bG93IEFwcEtpdCBzdHlsZSkKKyAgICAgICAgaHR0cDovL3d3dy5weXRob24ub3JnL2RvYy9lc3Nh
eXMvc3R5bGVndWlkZS5odG1sCisgICAgICAgIFRoZSBQeXRob24gY29tbXVuaXR5IGhhcyBhIHN0
cm9uZyBzdHlsZSBjdWx0dXJlIGFuZCB0aGUgV2ViS2l0IHN0eWxlIGd1aWRlIGlzIHNpbGVudCBy
ZTogUHl0aG9uLgorCisgICAgICAgIEkndmUgZmlsZWQgYSBidWcgdG8gdXBkYXRlIHRoZSBXZWJL
aXQgc3R5bGUgZ3VpZGUgdG8gbWVudGlvbiBweXRob246CisgICAgICAgIGh0dHBzOi8vYnVncy53
ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0yNjUyNAorCisgICAgICAgICogU2NyaXB0cy9idWd6
aWxsYS10b29sOiBBZGRlZC4KKwogMjAwOS0wNi0xNSAgQW5kcmUgUGVkcmFsaG8gIDxhbmRyZS5w
ZWRyYWxob0BvcGVuYm9zc2Eub3JnPgogCiAgICAgICAgIFJldmlld2VkIGJ5IFRvciBBcm5lIFZl
c3Riw7guCmRpZmYgLS1naXQgYS9XZWJLaXRUb29scy9TY3JpcHRzL2J1Z3ppbGxhLXRvb2wgYi9X
ZWJLaXRUb29scy9TY3JpcHRzL2J1Z3ppbGxhLXRvb2wKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5k
ZXggMDAwMDAwMC4uZjI4ZmEwYQotLS0gL2Rldi9udWxsCisrKyBiL1dlYktpdFRvb2xzL1Njcmlw
dHMvYnVnemlsbGEtdG9vbApAQCAtMCwwICsxLDQ0NiBAQAorIyEvdXNyL2Jpbi9weXRob24KKwor
IyBDb3B5cmlnaHQgKEMpIDIwMDkgR29vZ2xlLCBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgor
IworIyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3
aXRoIG9yIHdpdGhvdXQKKyMgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRo
YXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisjIGFyZSBtZXQ6CisjIDEuIFJlZGlzdHJpYnV0
aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisjICAg
IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xh
aW1lci4KKyMgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNl
IHRoZSBhYm92ZSBjb3B5cmlnaHQKKyMgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9u
cyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorIyAgICBkb2N1bWVudGF0aW9u
IGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgor
IworIyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIENPTVBVVEVSLCBJTkMuIGBg
QVMgSVMnJyBBTkQgQU5ZCisjIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJ
TkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisjIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJD
SEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorIyBQVVJQT1NFIEFSRSBE
SVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgQ09NUFVURVIsIElOQy4gT1IKKyMg
Q09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5U
QUwsIFNQRUNJQUwsCisjIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNM
VURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyMgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBH
T09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisjIFBST0ZJVFM7IE9SIEJV
U0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyMg
T0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBU
T1JUCisjIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5Z
IFdBWSBPVVQgT0YgVEhFIFVTRQorIyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQg
T0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorIworIyBBIHRvb2wgZm9yIGF1dG9t
YXRpbmcgZGVhbGluZyB3aXRoIGJ1Z3ppbGxhLCBwb3N0aW5nIHBhdGNoZXMsIGNvbW1pdGluZyBw
YXRjaGVzLCBldGMuCisKK2ltcG9ydCBzeXMKK2ltcG9ydCByZQoraW1wb3J0IG9zCitpbXBvcnQg
c3VicHJvY2VzcworCitmcm9tIG9wdHBhcnNlIGltcG9ydCBPcHRpb25QYXJzZXIsIEluZGVudGVk
SGVscEZvcm1hdHRlciwgU1VQUFJFU1NfVVNBR0UsIG1ha2Vfb3B0aW9uCisKK3N5cy5wYXRoLmFw
cGVuZCgibW9kdWxlcyIpICMgSW1wb3J0IFdlYktpdC1zcGVjaWZpYyBtb2R1bGVzCitmcm9tIGJ1
Z3ppbGxhIGltcG9ydCBCdWd6aWxsYQorZnJvbSBzY20gaW1wb3J0IGRldGVjdF9zY21fc3lzdGVt
LCBTY3JpcHRFcnJvcgorCitkZWYgY2hkaXJfd2Via2l0KCk6CisgICAgIyBXZSBjb3VsZCBpbnN0
ZWFkIGFzayB0aGUgU0NNIHN5c3RlbSBmb3IgaXRzIHJvb3QgZGlyZWN0b3J5IChzaW5jZSB3ZSBu
ZWVkIHRoYXQgZm9yIG1ha2luZyBwYXRjaGVzIGFzIHdlbGwpCisgICAgc2NyaXB0X2RpcmVjdG9y
eSA9IG9zLnBhdGguYWJzcGF0aChzeXMucGF0aFswXSkKKyAgICB3ZWJraXRfZGlyZWN0b3J5ID0g
b3MucGF0aC5hYnNwYXRoKG9zLnBhdGguam9pbihzY3JpcHRfZGlyZWN0b3J5LCAiLi4vLi4iKSkK
KyAgICBwcmludCB3ZWJraXRfZGlyZWN0b3J5CisgICAgb3MuY2hkaXIod2Via2l0X2RpcmVjdG9y
eSkKKworCitkZWYgbG9nKHN0cmluZyk6CisgICAgcHJpbnQgPj4gc3lzLnN0ZGVyciwgc3RyaW5n
CisKK2RlZiBlcnJvcihzdHJpbmcpOgorICAgIGxvZyhzdHJpbmcpCisgICAgZXhpdCgxKQorCisK
KyMgVGhlc2UgY291bGQgYmUgcHV0IGluIHNvbWUgc29ydCBvZiBjaGFuZ2Vsb2dzLnB5CitkZWYg
bGF0ZXN0X2NoYW5nZWxvZ19lbnRyeShjaGFuZ2Vsb2dfcGF0aCk6CisgICAgZW50cnlfbGluZXMg
PSBbXQorICAgIGNoYW5nZWxvZyA9IG9wZW4oY2hhbmdlbG9nX3BhdGgpCisgICAgdHJ5OgorICAg
ICAgICBsb2coIlBhcnNpbmcgQ2hhbmdlTG9nOiAiICsgY2hhbmdlbG9nX3BhdGgpCisgICAgICAg
ICMgVGhlIGZpcnN0IGxpbmUgc2hvdWxkIGJlIGEgZGF0ZSBsaW5lCisgICAgICAgIGVudHJ5X2xp
bmVzLmFwcGVuZChjaGFuZ2Vsb2cucmVhZGxpbmUoKSkKKyAgICAgICAgCisgICAgICAgICMgZS5n
LiAyMDA5LTA2LTAzICBFcmljIFNlaWRlbCAgPGVyaWNAd2Via2l0Lm9yZz4KKyAgICAgICAgY2hh
bmdlbG9nX2RhdGVfbGluZV9yZWdleHAgPSAnXihbXGRcLV0rKSAgKC4rKSAgPCguKyk+JCcKKyAg
ICAgICAgCisgICAgICAgIGZvciBsaW5lIGluIGNoYW5nZWxvZzoKKyAgICAgICAgICAgICMgaWYg
d2UndmUgaGl0IHRoZSBuZXh0IGVudHJ5LCByZXR1cm4KKyAgICAgICAgICAgIGlmIHJlLm1hdGNo
KGNoYW5nZWxvZ19kYXRlX2xpbmVfcmVnZXhwLCBsaW5lKToKKyAgICAgICAgICAgICAgICByZXR1
cm4gJycuam9pbihlbnRyeV9saW5lcykKKyAgICAgICAgICAgIGVudHJ5X2xpbmVzLmFwcGVuZChs
aW5lKQorICAgIGZpbmFsbHk6CisgICAgICAgICAgICBjaGFuZ2Vsb2cuY2xvc2UoKQorICAgICMg
V2UgbmV2ZXIgZm91bmQgYSBkYXRlIGxpbmUhCisgICAgcmV0dXJuIE5vbmUKKworZGVmIG1vZGlm
aWVkX2NoYW5nZWxvZ3Moc2NtKToKKyAgICBjaGFuZ2Vsb2dfcGF0aHMgPSBbXQorICAgIHBhdGhz
ID0gc2NtLmNoYW5nZWRfZmlsZXMoKQorICAgIGZvciBwYXRoIGluIHBhdGhzOgorICAgICAgICBp
ZiByZS5zZWFyY2goJ0NoYW5nZUxvZycsIHBhdGgpOgorICAgICAgICAgICAgY2hhbmdlbG9nX3Bh
dGhzLmFwcGVuZChwYXRoKQorICAgIHJldHVybiBjaGFuZ2Vsb2dfcGF0aHMKKworZGVmIGNvbW1p
dF9tZXNzYWdlX2Zvcl90aGlzX2NvbW1pdChzY20pOgorICAgIGNoYW5nZWxvZ19wYXRocyA9IG1v
ZGlmaWVkX2NoYW5nZWxvZ3Moc2NtKQorICAgIGlmIGxlbihjaGFuZ2Vsb2dfcGF0aHMpID09IDA6
CisgICAgICAgIGVycm9yKCJGb3VuZCBubyBtb2RpZmllZCBDaGFuZ2VMb2dzLCBjYW4ndCBjcmVh
dGUgYSBjb21taXQgbWVzc2FnZS4iKQorCisgICAgY2hhbmdlbG9nX21lc3NhZ2VzID0gW10KKyAg
ICBmb3IgcGF0aCBpbiBjaGFuZ2Vsb2dfcGF0aHM6CisgICAgICAgIGNoYW5nZWxvZ19lbnRyeSA9
IGxhdGVzdF9jaGFuZ2Vsb2dfZW50cnkocGF0aCkKKyAgICAgICAgaWYgbm90IGNoYW5nZWxvZ19l
bnRyeToKKyAgICAgICAgICAgIGVycm9yKCJGYWlsZWQgdG8gcGFyc2UgQ2hhbmdlTG9nOiAiICsg
b3MucGF0aC5hYnNwYXRoKHBhdGgpKQorICAgICAgICBjaGFuZ2Vsb2dfbWVzc2FnZXMuYXBwZW5k
KGNoYW5nZWxvZ19lbnRyeSkKKyAgICByZXR1cm4gJycuam9pbihjaGFuZ2Vsb2dfbWVzc2FnZXMp
CisKKworY2xhc3MgQ29tbWFuZDoKKyAgICBkZWYgX19pbml0X18oc2VsZiwgaGVscF90ZXh0LCBh
cmd1bWVudF9uYW1lcz0iIiwgb3B0aW9ucyA9IFtdKToKKyAgICAgICAgc2VsZi5oZWxwX3RleHQg
PSBoZWxwX3RleHQKKyAgICAgICAgc2VsZi5hcmd1bWVudF9uYW1lcyA9IGFyZ3VtZW50X25hbWVz
CisgICAgICAgIHNlbGYub3B0aW9ucyA9IG9wdGlvbnMKKyAgICAgICAgc2VsZi5vcHRpb25fcGFy
c2VyID0gT3B0aW9uUGFyc2VyKHVzYWdlPVNVUFBSRVNTX1VTQUdFLCBhZGRfaGVscF9vcHRpb249
RmFsc2UsIG9wdGlvbl9saXN0PXNlbGYub3B0aW9ucykKKyAgICAKKyAgICBkZWYgbmFtZV93aXRo
X2FyZ3VtZW50cyhzZWxmLCBjb21tYW5kX25hbWUpOgorICAgICAgICB1c2FnZV9zdHJpbmcgPSBj
b21tYW5kX25hbWUKKyAgICAgICAgaWYgKGxlbihzZWxmLm9wdGlvbnMpID4gMCk6CisgICAgICAg
ICAgICB1c2FnZV9zdHJpbmcgKz0gIiBbb3B0aW9uc10iCisgICAgICAgIGlmIChzZWxmLmFyZ3Vt
ZW50X25hbWVzICE9ICIiKToKKyAgICAgICAgICAgIHVzYWdlX3N0cmluZyArPSAiICIgKyBzZWxm
LmFyZ3VtZW50X25hbWVzCisgICAgICAgIHJldHVybiB1c2FnZV9zdHJpbmcKKworICAgIGRlZiBw
YXJzZV9hcmdzKHNlbGYsIGFyZ3MpOgorICAgICAgICByZXR1cm4gc2VsZi5vcHRpb25fcGFyc2Vy
LnBhcnNlX2FyZ3MoYXJncykKKworICAgIGRlZiBleGVjdXRlKHNlbGYsIG9wdGlvbnMsIGFyZ3Ms
IHRvb2wpOgorICAgICAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yLCAic3ViY2xhc3NlcyBt
dXN0IGltcGxlbWVudCIKKworCitjbGFzcyBCdWdzSW5Db21taXRRdWV1ZSAoQ29tbWFuZCk6Cisg
ICAgZGVmIF9faW5pdF9fKHNlbGYpOgorICAgICAgICBDb21tYW5kLl9faW5pdF9fKHNlbGYsICdC
dWdzIGluIHRoZSBjb21taXQgcXVldWUnKQorCisgICAgZGVmIGV4ZWN1dGUoc2VsZiwgb3B0aW9u
cywgYXJncywgdG9vbCk6CisgICAgICAgIGJ1Z19pZHMgPSB0b29sLmJ1Z3MuZmV0Y2hfYnVnX2lk
c19mcm9tX2NvbW1pdF9xdWV1ZSgpCisgICAgICAgIGZvciBidWdfaWQgaW4gYnVnX2lkczoKKyAg
ICAgICAgICAgIHByaW50IHRvb2wuYnVncy5idWdfdXJsX2Zvcl9idWdfaWQoYnVnX2lkKQorCisK
K2NsYXNzIFBhdGNoZXNJbkNvbW1pdFF1ZXVlIChDb21tYW5kKToKKyAgICBkZWYgX19pbml0X18o
c2VsZik6CisgICAgICAgIENvbW1hbmQuX19pbml0X18oc2VsZiwgJ1BhdGNoZXMgYXR0YWNoZWQg
dG8gYnVncyBpbiB0aGUgY29tbWl0IHF1ZXVlJykKKworICAgIGRlZiBleGVjdXRlKHNlbGYsIG9w
dGlvbnMsIGFyZ3MsIHRvb2wpOgorICAgICAgICBwYXRjaGVzID0gdG9vbC5idWdzLmZldGNoX3Bh
dGNoZXNfZnJvbV9jb21taXRfcXVldWUoKQorICAgICAgICBsb2coIlBhdGNoZXMgaW4gY29tbWl0
IHF1ZXVlOiIpCisgICAgICAgIGZvciBwYXRjaCBpbiBwYXRjaGVzOgorICAgICAgICAgICAgcHJp
bnQgcGF0Y2hbJ3VybCddCisKKworY2xhc3MgUmV2aWV3ZWRQYXRjaGVzT25CdWcgKENvbW1hbmQp
OgorICAgIGRlZiBfX2luaXRfXyhzZWxmKToKKyAgICAgICAgQ29tbWFuZC5fX2luaXRfXyhzZWxm
LCAncitcJ2QgcGF0Y2hlcyBvbiBhIGJ1ZycsICdCVUdJRCcpCisKKyAgICBkZWYgZXhlY3V0ZShz
ZWxmLCBvcHRpb25zLCBhcmdzLCB0b29sKToKKyAgICAgICAgYnVnX2lkID0gYXJnc1swXQorICAg
ICAgICBwYXRjaGVzX3RvX2xhbmQgPSB0b29sLmJ1Z3MuZmV0Y2hfcmV2aWV3ZWRfcGF0Y2hlc19m
cm9tX2J1ZyhidWdfaWQpCisgICAgICAgIGZvciBwYXRjaCBpbiBwYXRjaGVzX3RvX2xhbmQ6Cisg
ICAgICAgICAgICBwcmludCBwYXRjaFsndXJsJ10KKworCitjbGFzcyBBcHBseVBhdGNoZXNGcm9t
QnVnIChDb21tYW5kKToKKyAgICBkZWYgX19pbml0X18oc2VsZik6CisgICAgICAgIG9wdGlvbnMg
PSBbCisgICAgICAgICAgICBtYWtlX29wdGlvbigiLS1uby11cGRhdGUiLCBhY3Rpb249InN0b3Jl
X2ZhbHNlIiwgZGVzdD0idXBkYXRlIiwgZGVmYXVsdD1UcnVlLCBoZWxwPSJEb24ndCB1cGRhdGUg
dGhlIHdvcmtpbmcgZGlyZWN0b3J5IGJlZm9yZSBhcHBseWluZyBwYXRjaGVzIiksCisgICAgICAg
ICAgICBtYWtlX29wdGlvbigiLS1mb3JjZS1jbGVhbiIsIGFjdGlvbj0ic3RvcmVfdHJ1ZSIsIGRl
c3Q9ImZvcmNlX2NsZWFuIiwgZGVmYXVsdD1GYWxzZSwgaGVscD0iQ2xlYW4gd29ya2luZyBkaXJl
Y3RvcnkgYmVmb3JlIGFwcGx5aW5nIHBhdGNoZXMgKHJlbW92ZXMgbG9jYWwgY2hhbmdlcyBhbmQg
Y29tbWl0cykiKSwKKyAgICAgICAgICAgIG1ha2Vfb3B0aW9uKCItLW5vLWNsZWFuIiwgYWN0aW9u
PSJzdG9yZV9mYWxzZSIsIGRlc3Q9ImNsZWFuIiwgZGVmYXVsdD1UcnVlLCBoZWxwPSJEb24ndCBj
aGVjayBpZiB0aGUgd29ya2luZyBkaXJlY3RvcnkgaXMgY2xlYW4gYmVmb3JlIGFwcGx5aW5nIHBh
dGNoZXMiKSwKKyAgICAgICAgXQorICAgICAgICBDb21tYW5kLl9faW5pdF9fKHNlbGYsICdBcHBs
aWVzIGFsbCBwYXRjaGVzIG9uIGEgYnVnIHRvIHRoZSBsb2NhbCB3b3JraW5nIGRpcmVjdG9yeSB3
aXRob3V0IGNvbW1pdHRpbmcuJywgJ0JVR0lEJywgb3B0aW9ucz1vcHRpb25zKQorCisgICAgZGVm
IGV4ZWN1dGUoc2VsZiwgb3B0aW9ucywgYXJncywgdG9vbCk6CisgICAgICAgIGJ1Z19pZCA9IGFy
Z3NbMF0KKyAgICAgICAgcGF0Y2hlcyA9IHRvb2wuYnVncy5mZXRjaF9yZXZpZXdlZF9wYXRjaGVz
X2Zyb21fYnVnKGJ1Z19pZCkKKyAgICAgICAgY2hkaXJfd2Via2l0KCkKKyAgICAgICAgaWYgb3B0
aW9ucy5jbGVhbjoKKyAgICAgICAgICAgIHRvb2wuc2NtKCkuZW5zdXJlX2NsZWFuX3dvcmtpbmdf
ZGlyZWN0b3J5KG9wdGlvbnMuZm9yY2VfY2xlYW4sIGFsbG93X2xvY2FsX2NvbW1pdHMgPSBUcnVl
KQorICAgICAgICBpZiBvcHRpb25zLnVwZGF0ZToKKyAgICAgICAgICAgIHRvb2wuc2NtKCkudXBk
YXRlX3dlYmtpdCgpCisgICAgICAgIAorICAgICAgICAjIFNob3VsZCB3ZSBlcnJvciBvdXQgaWYg
dG9vbC5zY20gZG9lcyBub3Qgc3VwcG9ydCBsb2NhbCBjb21taXRzPworICAgICAgICBmb3IgcGF0
Y2ggaW4gcGF0Y2hlczoKKyAgICAgICAgICAgIHRvb2wuc2NtKCkuYXBwbHlfcGF0Y2gocGF0Y2gp
CisKKworZGVmIGJ1Z19jb21tZW50X2Zyb21fY29tbWl0X3RleHQoY29tbWl0X3RleHQpOgorICAg
IGNvbW1lbnRfbGluZXMgPSBbXQorICAgIGNvbW1pdF9saW5lcyA9IGNvbW1pdF90ZXh0LnNwbGl0
bGluZXMoKQorICAgIGZvciBsaW5lIGluIGNvbW1pdF9saW5lczoKKyAgICAgICAgY29tbWVudF9s
aW5lcy5hcHBlbmQobGluZSkKKyAgICAgICAgbWF0Y2ggPSByZS5tYXRjaCgiXkNvbW1pdHRlZCBy
KFxkKykkIiwgbGluZSkKKyAgICAgICAgaWYgbWF0Y2g6CisgICAgICAgICAgICByZXZpc2lvbiA9
IG1hdGNoLmdyb3VwKDEpCisgICAgICAgICAgICBjb21tZW50X2xpbmVzLmFwcGVuZCgiaHR0cDov
L3RyYWMud2Via2l0Lm9yZy9jaGFuZ2VzZXQvIiArIHJldmlzaW9uKQorICAgICAgICAgICAgYnJl
YWsKKyAgICByZXR1cm4gIlxuIi5qb2luKGNvbW1lbnRfbGluZXMpCisKKworY2xhc3MgTGFuZEFu
ZFVwZGF0ZUJ1ZyAoQ29tbWFuZCk6CisgICAgZGVmIF9faW5pdF9fKHNlbGYpOgorICAgICAgICBD
b21tYW5kLl9faW5pdF9fKHNlbGYsICdMYW5kcyB0aGUgY3VycmVudCB3b3JraW5nIGRpcmVjdG9y
eSBkaWZmIGFuZCB1cGRhdGVzIHRoZSBidWcuJywgJ0JVR0lEJykKKworICAgIGRlZiBleGVjdXRl
KHNlbGYsIG9wdGlvbnMsIGFyZ3MsIHRvb2wpOgorICAgICAgICBidWdfaWQgPSBhcmdzWzBdCisg
ICAgICAgIGNvbW1pdF9tZXNzYWdlID0gY29tbWl0X21lc3NhZ2VfZm9yX3RoaXNfY29tbWl0KHRv
b2wuc2NtKCkpCisgICAgICAgIGNvbW1pdF9sb2cgPSB0b29sLnNjbSgpLmNvbW1pdF93aXRoX21l
c3NhZ2UoY29tbWl0X21lc3NhZ2UpCisgICAgICAgIGNvbW1lbnRfdGV4dCA9IGJ1Z19jb21tZW50
X2Zyb21fY29tbWl0X3RleHQoY29tbWl0X2xvZykKKyAgICAgICAgdG9vbC5idWdzLmNsb3NlX2J1
Z19hc19maXhlZChidWdfaWQsIGNvbW1lbnRfdGV4dCkKKworCitjbGFzcyBMYW5kUGF0Y2hlc0Zy
b21CdWcgKENvbW1hbmQpOgorICAgIGRlZiBfX2luaXRfXyhzZWxmKToKKyAgICAgICAgb3B0aW9u
cyA9IFsKKyAgICAgICAgICAgIG1ha2Vfb3B0aW9uKCItLW5vLXVwZGF0ZSIsIGFjdGlvbj0ic3Rv
cmVfZmFsc2UiLCBkZXN0PSJ1cGRhdGUiLCBkZWZhdWx0PVRydWUsIGhlbHA9IkRvbid0IHVwZGF0
ZSB0aGUgd29ya2luZyBkaXJlY3RvcnkgYmVmb3JlIGFwcGx5aW5nIHBhdGNoZXMiKSwKKyAgICAg
ICAgICAgIG1ha2Vfb3B0aW9uKCItLWZvcmNlLWNsZWFuIiwgYWN0aW9uPSJzdG9yZV90cnVlIiwg
ZGVzdD0iZm9yY2VfY2xlYW4iLCBkZWZhdWx0PUZhbHNlLCBoZWxwPSJDbGVhbiB3b3JraW5nIGRp
cmVjdG9yeSBiZWZvcmUgYXBwbHlpbmcgcGF0Y2hlcyAocmVtb3ZlcyBsb2NhbCBjaGFuZ2VzIGFu
ZCBjb21taXRzKSIpLAorICAgICAgICAgICAgbWFrZV9vcHRpb24oIi0tbm8tY2xlYW4iLCBhY3Rp
b249InN0b3JlX2ZhbHNlIiwgZGVzdD0iY2xlYW4iLCBkZWZhdWx0PVRydWUsIGhlbHA9IkRvbid0
IGNoZWNrIGlmIHRoZSB3b3JraW5nIGRpcmVjdG9yeSBpcyBjbGVhbiBiZWZvcmUgYXBwbHlpbmcg
cGF0Y2hlcyIpLAorICAgICAgICAgICAgbWFrZV9vcHRpb24oIi0tbm8tYnVpbGQiLCBhY3Rpb249
InN0b3JlX2ZhbHNlIiwgZGVzdD0iYnVpbGQiLCBkZWZhdWx0PVRydWUsIGhlbHA9IkNvbW1pdCB3
aXRob3V0IGJ1aWxkaW5nIGZpcnN0LCBpbXBsaWVzIC0tbm8tdGVzdC4iKSwKKyAgICAgICAgICAg
IG1ha2Vfb3B0aW9uKCItLW5vLXRlc3QiLCBhY3Rpb249InN0b3JlX2ZhbHNlIiwgZGVzdD0idGVz
dCIsIGRlZmF1bHQ9VHJ1ZSwgaGVscD0iQ29tbWl0IHdpdGhvdXQgcnVubm5pbmcgcnVuLXdlYmtp
dC10ZXN0cy4iKSwKKyAgICAgICAgXQorICAgICAgICBDb21tYW5kLl9faW5pdF9fKHNlbGYsICdM
YW5kcyBhbGwgcGF0Y2hlcyBvbiBhIGJ1ZyBvcHRpb25hbGx5IHRlc3RpbmcgdGhlbSBmaXJzdCcs
ICdCVUdJRCcsIG9wdGlvbnM9b3B0aW9ucykKKworICAgIGRlZiBydW5fYW5kX3Rocm93X2lmX2Zh
aWwoc2VsZiwgc2NyaXB0X25hbWUpOgorICAgICAgICBidWlsZF93ZWJraXRfcHJvY2VzcyA9IHN1
YnByb2Nlc3MuUG9wZW4oc2NyaXB0X25hbWUsIHNoZWxsPVRydWUpCisgICAgICAgIHJldHVybl9j
b2RlID0gYnVpbGRfd2Via2l0X3Byb2Nlc3Mud2FpdCgpCisgICAgICAgIGlmIHJldHVybl9jb2Rl
ICE9IDA6CisgICAgICAgICAgICByYWlzZSBTY3JpcHRFcnJvcihzY3JpcHRfbmFtZSArICIgZmFp
bGVkIHdpdGggY29kZSAiICsgcmV0dXJuX2NvZGUpCisKKyAgICBkZWYgYnVpbGRfd2Via2l0KHNl
bGYpOgorICAgICAgICBzZWxmLnJ1bl9hbmRfdGhyb3dfaWZfZmFpbCgiYnVpbGQtd2Via2l0IikK
KworICAgIGRlZiBydW5fd2Via2l0X3Rlc3RzKHNlbGYpOgorICAgICAgICBzZWxmLnJ1bl9hbmRf
dGhyb3dfaWZfZmFpbCgicnVuLXdlYmtpdC10ZXN0cyIpCisKKyAgICBkZWYgZXhlY3V0ZShzZWxm
LCBvcHRpb25zLCBhcmdzLCB0b29sKToKKyAgICAgICAgYnVnX2lkID0gYXJnc1swXQorCisgICAg
ICAgIHRyeToKKyAgICAgICAgICAgIHBhdGNoZXMgPSB0b29sLmJ1Z3MuZmV0Y2hfcmV2aWV3ZWRf
cGF0Y2hlc19mcm9tX2J1ZyhidWdfaWQpCisgICAgICAgICAgICBjb21taXRfdGV4dCA9ICIiCisK
KyAgICAgICAgICAgIGNoZGlyX3dlYmtpdCgpCisgICAgICAgICAgICB0b29sLnNjbSgpLmVuc3Vy
ZV9ub19sb2NhbF9jb21taXRzKG9wdGlvbnMuZm9yY2VfY2xlYW4pCisgICAgICAgICAgICBpZiBv
cHRpb25zLmNsZWFuOgorICAgICAgICAgICAgICAgIHRvb2wuc2NtKCkuZW5zdXJlX2NsZWFuX3dv
cmtpbmdfZGlyZWN0b3J5KG9wdGlvbnMuZm9yY2VfY2xlYW4pCisgICAgICAgICAgICBpZiBvcHRp
b25zLnVwZGF0ZToKKyAgICAgICAgICAgICAgICB0b29sLnNjbSgpLnVwZGF0ZV93ZWJraXQoKQor
ICAgICAgICAgICAgCisgICAgICAgICAgICBmb3IgcGF0Y2ggaW4gcGF0Y2hlczoKKyAgICAgICAg
ICAgICAgICB0b29sLnNjbSgpLmFwcGx5X3BhdGNoKHBhdGNoKQorICAgICAgICAgICAgICAgIGlm
IG9wdGlvbnMuYnVpbGQ6CisgICAgICAgICAgICAgICAgICAgIHNlbGYuYnVpbGRfd2Via2l0KCkK
KyAgICAgICAgICAgICAgICAgICAgaWYgb3B0aW9ucy50ZXN0OgorICAgICAgICAgICAgICAgICAg
ICAgICAgc2VsZi5ydW5fd2Via2l0X3Rlc3RzKCkKKyAgICAgICAgICAgICAgICBjb21taXRfbWVz
c2FnZSA9IGNvbW1pdF9tZXNzYWdlX2Zvcl90aGlzX2NvbW1pdCh0b29sLnNjbSgpKQorICAgICAg
ICAgICAgICAgIGNvbW1pdF9sb2cgPSB0b29sLnNjbSgpLmNvbW1pdF93aXRoX21lc3NhZ2UoY29t
bWl0X21lc3NhZ2UpCisgICAgICAgICAgICAgICAgY29tbWVudF90ZXh0ID0gYnVnX2NvbW1lbnRf
ZnJvbV9jb21taXRfdGV4dChjb21taXRfbG9nKQorICAgICAgICAgICAgICAgICMgaWYgd2UncmUg
Y29tbWl0aW5nIG1vcmUgdGhhbiBvbmUgcGF0Y2gsIHVwZGF0ZSB0aGUgYnVnIGFzIHdlIGdvCisg
ICAgICAgICAgICAgICAgaWYgbGVuKHBhdGNoZXMpID4gMToKKyAgICAgICAgICAgICAgICAgICAg
dG9vbC5idWdzLm9ic29sZXRlX2F0dGFjaG1lbnQocGF0Y2hbJ2lkJ10sIGNvbW1lbnRfdGV4dCkK
KworICAgICAgICAgICAgaWYgbGVuKHBhdGNoZXMpID4gMToKKyAgICAgICAgICAgICAgICBjb21t
aXRfdGV4dCA9ICJBbGwgcmV2aWV3ZWQgcGF0Y2hlcyBsYW5kZWQsIGNsb3NpbmcuIgorCisgICAg
ICAgICAgICB0b29sLmJ1Z3MuY2xvc2VfYnVnX2FzX2ZpeGVkKGJ1Z19pZCwgY29tbWl0X3RleHQp
CisgICAgICAgIGV4Y2VwdCBTY3JpcHRFcnJvciwgZXJyb3I6CisgICAgICAgICAgICBsb2coZXJy
b3IpCisgICAgICAgICAgICAjIFdlIGNvdWxkIGFkZCBhIGNvbW1lbnQgdG8gdGhlIGJ1ZyBhYm91
dCB0aGUgZmFpbHVyZQorCisKK2NsYXNzIENvbW1pdE1lc3NhZ2VGb3JDdXJyZW50RGlmZiAoQ29t
bWFuZCk6CisgICAgZGVmIF9faW5pdF9fKHNlbGYpOgorICAgICAgICBDb21tYW5kLl9faW5pdF9f
KHNlbGYsICdQcmludHMgYSBjb21taXQgbWVzc2FnZSBzdWl0YWJsZSBmb3IgdGhlIHVuY29tbWl0
dGVkIGNoYW5nZXMuJykKKworICAgIGRlZiBleGVjdXRlKHNlbGYsIG9wdGlvbnMsIGFyZ3MsIHRv
b2wpOgorICAgICAgICBwcmludCBjb21taXRfbWVzc2FnZV9mb3JfdGhpc19jb21taXQodG9vbC5z
Y20oKSkKKworCitjbGFzcyBPYnNvbGV0ZUF0dGFjaG1lbnRzT25CdWcgKENvbW1hbmQpOgorICAg
IGRlZiBfX2luaXRfXyhzZWxmKToKKyAgICAgICAgQ29tbWFuZC5fX2luaXRfXyhzZWxmLCAnTWFy
a3MgYWxsIGF0dGFjaG1lbnRzIG9uIGEgYnVnIGFzIG9ic29sZXRlLicsICdCVUdJRCcpCisKKyAg
ICBkZWYgZXhlY3V0ZShzZWxmLCBvcHRpb25zLCBhcmdzLCB0b29sKToKKyAgICAgICAgYnVnX2lk
ID0gYXJnc1swXQorICAgICAgICBhdHRhY2htZW50cyA9IHRvb2wuYnVncy5mZXRjaF9hdHRhY2ht
ZW50c19mcm9tX2J1ZyhidWdfaWQpCisgICAgICAgIGZvciBhdHRhY2htZW50IGluIGF0dGFjaG1l
bnRzOgorICAgICAgICAgICAgaWYgbm90IGF0dGFjaG1lbnRbJ29ic29sZXRlJ106CisgICAgICAg
ICAgICAgICAgdG9vbC5idWdzLm9ic29sZXRlX2F0dGFjaG1lbnQoYXR0YWNobWVudFsnaWQnXSkK
KworCitjbGFzcyBQb3N0RGlmZkFzUGF0Y2hUb0J1ZyAoQ29tbWFuZCk6CisgICAgZGVmIF9faW5p
dF9fKHNlbGYpOgorICAgICAgICBDb21tYW5kLl9faW5pdF9fKHNlbGYsICdBdHRhY2hlcyB0aGUg
Y3VycmVudCB3b3JraW5nIGRpcmVjdG9yeSBkaWZmIHRvIGEgYnVnIGFzIGEgcGF0Y2ggZmlsZS4n
LCAnQlVHSUQnKQorCisgICAgZGVmIGV4ZWN1dGUoc2VsZiwgb3B0aW9ucywgYXJncywgdG9vbCk6
CisgICAgICAgIGJ1Z19pZCA9IGFyZ3NbMF0KKyAgICAgICAgZGVzY3JpcHRpb24gPSBhcmdzWzFd
CisgICAgICAgICMgTmVlZCBhcmcgcGFyc2luZyEKKyAgICAgICAgCisgICAgICAgIGRpZmZfcHJv
Y2VzcyA9IHN1YnByb2Nlc3MuUG9wZW4odG9vbC5zY20oKS5kaWZmX2NvbW1hbmQoKSwgc3Rkb3V0
PXN1YnByb2Nlc3MuUElQRSwgc2hlbGw9VHJ1ZSkKKyAgICAgICAgCisgICAgICAgIHRvb2wuYnVn
cy5hZGRfcGF0Y2hfdG9fYnVnKGJ1Z19pZCwgZGlmZl9wcm9jZXNzLnN0ZG91dCwgZGVzY3JpcHRp
b24sIG1hcmtfZm9yX3Jldmlldz1UcnVlKQorCisKK2NsYXNzIFBvc3RDb21taXRzQXNQYXRjaGVz
VG9CdWcgKENvbW1hbmQpOgorICAgIGRlZiBfX2luaXRfXyhzZWxmKToKKyAgICAgICAgQ29tbWFu
ZC5fX2luaXRfXyhzZWxmLCAnQXR0YWNoZXMgYSByYW5nZSBvZiBsb2NhbCBjb21taXRzIHRvIGEg
YnVnIGFzIHBhdGNoIGZpbGVzLicsICdCVUdJRCBDT01NSVRJU0gnKQorCisgICAgZGVmIGV4ZWN1
dGUoc2VsZiwgb3B0aW9ucywgYXJncywgdG9vbCk6CisgICAgICAgIGJ1Z19pZCA9IGFyZ3NbMF0K
KyAgICAgICAgCisgICAgICAgIGlmIG5vdCB0b29sLnNjbSgpLnN1cHBvcnRzX2xvY2FsX2NvbW1p
dHMoKToKKyAgICAgICAgICAgIGxvZyh0b29sLnNjbSgpLmRpc3BsYXlfbmFtZSgpICsgIiBkb2Vz
IG5vdCBzdXBwb3J0IGxvY2FsIGNvbW1pdHMuIikKKyAgICAgICAgICAgIGV4aXQoMSkKKyAgICAg
ICAgCisgICAgICAgIGNvbW1pdF9pZHMgPSB0b29sLnNjbSgpLmNvbW1pdF9pZHNfZnJvbV9yYW5n
ZV9hcmd1bWVudHMoYXJnc1sxOl0pCisgICAgICAgIAorICAgICAgICBpZiBsZW4oY29tbWl0X2lk
cykgPiAxMDoKKyAgICAgICAgICAgIGxvZygiQXJlIHlvdSBzdXJlIHlvdSB3YW50IHRvIGF0dGFj
aCAlZCBwYXRjaGVzIHRvIGJ1ZyAlcz8iICUgKGxlbihjb21taXRfaWRzKSwgYnVnX2lkKSkKKyAg
ICAgICAgICAgICMgU2hvdWxkIHN1cHBvcnQgYSAtLWZvcmNlIG9wdGlvbgorICAgICAgICAgICAg
ZXhpdCgxKQorICAgICAgICAKKyAgICAgICAgbG9nKCJBdHRhY2hpbmcgJWQgY29tbWl0cyBhcyBw
YXRjaGVzIHRvIGJ1ZyAlcyIgJSAobGVuKGNvbW1pdF9pZHMpLCBidWdfaWQpKQorICAgICAgICBm
b3IgY29tbWl0X2lkIGluIGNvbW1pdF9pZHM6CisgICAgICAgICAgICBjb21taXRfbWVzc2FnZSA9
IHRvb2wuc2NtKCkuY29tbWl0X21lc3NhZ2VfZm9yX2NvbW1pdChjb21taXRfaWQpCisgICAgICAg
ICAgICBjb21taXRfbGluZXMgPSBjb21taXRfbWVzc2FnZS5zcGxpdGxpbmVzKCkKKyAgICAgICAg
ICAgIAorICAgICAgICAgICAgZGVzY3JpcHRpb24gPSBjb21taXRfbGluZXNbMF0KKyAgICAgICAg
ICAgIGNvbW1lbnRfdGV4dCA9ICJcbiIuam9pbihjb21taXRfbGluZXNbMTpdKQorICAgICAgICAK
KyAgICAgICAgICAgIGNvbW1lbnRfdGV4dCArPSAiXG4tLS1cbiIKKyAgICAgICAgICAgIGNvbW1l
bnRfdGV4dCArPSB0b29sLnNjbSgpLmZpbGVzX2NoYW5nZWRfc3VtbWFyeV9mb3JfY29tbWl0KGNv
bW1pdF9pZCkKKyAgICAgICAgCisgICAgICAgICAgICAjIFRoaXMgaXMgYSBsaXR0bGUgYml0IG9m
IGEgaGFjaywgdGhhdCB3ZSBwYXNzIHN0ZG91dCBhcyB0aGUgcGF0Y2ggZmlsZQorICAgICAgICAg
ICAgIyBXZSBjb3VsZCBhbHRlcm5hdGl2ZWx5IG1ha2UgYW4gaW4tbWVtb3J5IGZpbGUtbGlrZSBv
YmplY3Qgd2l0aCB0aGUgcGF0Y2ggY29udGVudHMKKyAgICAgICAgICAgIGRpZmZfcHJvY2VzcyA9
IHN1YnByb2Nlc3MuUG9wZW4odG9vbC5zY20oKS5zaG93X2RpZmZfY29tbWFuZF9mb3JfY29tbWl0
KGNvbW1pdF9pZCksIHN0ZG91dD1zdWJwcm9jZXNzLlBJUEUsIHNoZWxsPVRydWUpCisgICAgICAg
ICAgICB0b29sLmJ1Z3MuYWRkX3BhdGNoX3RvX2J1ZyhidWdfaWQsIGRpZmZfcHJvY2Vzcy5zdGRv
dXQsIGRlc2NyaXB0aW9uLCBjb21tZW50X3RleHQsIG1hcmtfZm9yX3Jldmlldz1UcnVlKQorCisK
K2NsYXNzIE5vbldyYXBwaW5nRXBpbG9nSW5kZW50ZWRIZWxwRm9ybWF0dGVyIChJbmRlbnRlZEhl
bHBGb3JtYXR0ZXIpOgorICAgIGRlZiBfX2luaXRfXyhzZWxmKToKKyAgICAgICAgSW5kZW50ZWRI
ZWxwRm9ybWF0dGVyLl9faW5pdF9fKHNlbGYpCisKKyAgICAjIFRoZSBzdGFuZGFyZCBJbmRlbnRl
ZEhlbHBGb3JtYXR0ZXIgcmUtd3JhcHMgdGhlIGVwaWxvZyEKKyAgICBkZWYgZm9ybWF0X2VwaWxv
ZyhzZWxmLCBlcGlsb2cpOgorICAgICAgICBpZiBlcGlsb2c6CisgICAgICAgICAgICByZXR1cm4g
IlxuIiArIGVwaWxvZyArICJcbiIKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJldHVybiAi
IgorCitjbGFzcyBCdWd6aWxsYVRvb2w6CisgICAgZGVmIF9faW5pdF9fKHNlbGYpOgorICAgICAg
ICBzZWxmLmNhY2hlZF9zY20gPSBOb25lCisgICAgICAgIHNlbGYuYnVncyA9IEJ1Z3ppbGxhKCkK
KyAgICAgICAgc2VsZi5jb21tYW5kcyA9IFsKKyAgICAgICAgICAgIHsgJ25hbWUnIDogJ2J1Z3Mt
dG8tY29tbWl0JywgJ29iamVjdCcgOiBCdWdzSW5Db21taXRRdWV1ZSgpIH0sCisgICAgICAgICAg
ICB7ICduYW1lJyA6ICdwYXRjaGVzLXRvLWNvbW1pdCcsICdvYmplY3QnIDogUGF0Y2hlc0luQ29t
bWl0UXVldWUoKSB9LAorICAgICAgICAgICAgeyAnbmFtZScgOiAncmV2aWV3ZWQtcGF0Y2hlcycs
ICdvYmplY3QnIDogUmV2aWV3ZWRQYXRjaGVzT25CdWcoKSB9LAorICAgICAgICAgICAgeyAnbmFt
ZScgOiAnYXBwbHktcGF0Y2hlcycsICdvYmplY3QnIDogQXBwbHlQYXRjaGVzRnJvbUJ1ZygpIH0s
CisgICAgICAgICAgICB7ICduYW1lJyA6ICdsYW5kLWFuZC11cGRhdGUnLCAnb2JqZWN0JyA6IExh
bmRBbmRVcGRhdGVCdWcoKSB9LAorICAgICAgICAgICAgeyAnbmFtZScgOiAnbGFuZC1wYXRjaGVz
JywgJ29iamVjdCcgOiBMYW5kUGF0Y2hlc0Zyb21CdWcoKSB9LAorICAgICAgICAgICAgeyAnbmFt
ZScgOiAnY29tbWl0LW1lc3NhZ2UnLCAnb2JqZWN0JyA6IENvbW1pdE1lc3NhZ2VGb3JDdXJyZW50
RGlmZigpIH0sCisgICAgICAgICAgICB7ICduYW1lJyA6ICdvYnNvbGV0ZS1hdHRhY2htZW50cycs
ICdvYmplY3QnIDogT2Jzb2xldGVBdHRhY2htZW50c09uQnVnKCkgfSwKKyAgICAgICAgICAgIHsg
J25hbWUnIDogJ3Bvc3QtZGlmZicsICdvYmplY3QnIDogUG9zdERpZmZBc1BhdGNoVG9CdWcoKSB9
LAorICAgICAgICAgICAgeyAnbmFtZScgOiAncG9zdC1jb21taXRzJywgJ29iamVjdCcgOiBQb3N0
Q29tbWl0c0FzUGF0Y2hlc1RvQnVnKCkgfSwKKyAgICAgICAgXQorICAgICAgICAKKyAgICAgICAg
c2VsZi5nbG9iYWxfb3B0aW9uX3BhcnNlciA9IE9wdGlvblBhcnNlcih1c2FnZT1zZWxmLnVzYWdl
X2xpbmUoKSwgZm9ybWF0dGVyPU5vbldyYXBwaW5nRXBpbG9nSW5kZW50ZWRIZWxwRm9ybWF0dGVy
KCksIGVwaWxvZz1zZWxmLmNvbW1hbmRzX3VzYWdlKCkpCisgICAgICAgIHNlbGYuZ2xvYmFsX29w
dGlvbl9wYXJzZXIuYWRkX29wdGlvbigiLS1kcnktcnVuIiwgYWN0aW9uPSJzdG9yZV90cnVlIiwg
ZGVzdD0iZHJ5cnVuIiwgaGVscD0iZG8gbm90IHRvdWNoIHJlbW90ZSBzZXJ2ZXJzIiwgZGVmYXVs
dD1GYWxzZSkKKyAgICAKKyAgICBkZWYgc2NtKHNlbGYpOgorICAgICAgICBpZiBub3Qgc2VsZi5j
YWNoZWRfc2NtOgorICAgICAgICAgICAgIyBMYXppbHkgaW5pdGlhbGl6aW5nIFNDTSB0byBub3Qg
ZXJyb3Itb3V0IGJlZm9yZSBjb21tYW5kIGxpbmUgcGFyc2luZworICAgICAgICAgICAgc2VsZi5j
YWNoZWRfc2NtID0gZGV0ZWN0X3NjbV9zeXN0ZW0oIi4iKQorCisgICAgICAgIHJldHVybiBzZWxm
LmNhY2hlZF9zY20KKyAgICAKKyAgICBkZWYgdXNhZ2VfbGluZShzZWxmKToKKyAgICAgICAgcmV0
dXJuICJVc2FnZTogJXByb2cgW29wdGlvbnNdIGNvbW1hbmQgW2NvbW1hbmQtb3B0aW9uc10gW2Nv
bW1hbmQtYXJndW1lbnRzXSIKKyAgICAKKyAgICBkZWYgY29tbWFuZHNfdXNhZ2Uoc2VsZik6Cisg
ICAgICAgIGNvbW1hbmRzX3RleHQgPSAiQ29tbWFuZHM6XG4iCisgICAgICAgIGxvbmdlc3RfbmFt
ZV9sZW5ndGggPSAwCisgICAgICAgIGNvbW1hbmRfcm93cyA9IFtdCisgICAgICAgIGZvciBjb21t
YW5kIGluIHNlbGYuY29tbWFuZHM6CisgICAgICAgICAgICBjb21tYW5kX29iamVjdCA9IGNvbW1h
bmRbJ29iamVjdCddCisgICAgICAgICAgICBjb21tYW5kX25hbWVfYW5kX2FyZ3MgPSBjb21tYW5k
X29iamVjdC5uYW1lX3dpdGhfYXJndW1lbnRzKGNvbW1hbmRbJ25hbWUnXSkKKyAgICAgICAgICAg
IGNvbW1hbmRfcm93cy5hcHBlbmQoeyAnbmFtZS1hbmQtYXJncyc6IGNvbW1hbmRfbmFtZV9hbmRf
YXJncywgJ29iamVjdCc6IGNvbW1hbmRfb2JqZWN0IH0pCisgICAgICAgICAgICBsb25nZXN0X25h
bWVfbGVuZ3RoID0gbWF4KFtsb25nZXN0X25hbWVfbGVuZ3RoLCBsZW4oY29tbWFuZF9uYW1lX2Fu
ZF9hcmdzKV0pCisgICAgICAgIAorICAgICAgICAjIFVzZSBvdXIgb3duIGhlbHAgZm9ybWF0dGVy
IHNvIGFzIHRvIGluZGVudCBlbm91Z2gKKyAgICAgICAgZm9ybWF0dGVyID0gSW5kZW50ZWRIZWxw
Rm9ybWF0dGVyKCkKKyAgICAgICAgZm9ybWF0dGVyLmluZGVudCgpCisgICAgICAgIGZvcm1hdHRl
ci5pbmRlbnQoKQorICAgICAgICAKKyAgICAgICAgZm9yIHJvdyBpbiBjb21tYW5kX3Jvd3M6Cisg
ICAgICAgICAgICBjb21tYW5kX29iamVjdCA9IHJvd1snb2JqZWN0J10KKyAgICAgICAgICAgIGNv
bW1hbmRzX3RleHQgKz0gIiAgIiArIHJvd1snbmFtZS1hbmQtYXJncyddLmxqdXN0KGxvbmdlc3Rf
bmFtZV9sZW5ndGggKyAzKSArIGNvbW1hbmRfb2JqZWN0LmhlbHBfdGV4dCArICJcbiIKKyAgICAg
ICAgICAgIGNvbW1hbmRzX3RleHQgKz0gY29tbWFuZF9vYmplY3Qub3B0aW9uX3BhcnNlci5mb3Jt
YXRfb3B0aW9uX2hlbHAoZm9ybWF0dGVyKQorICAgICAgICByZXR1cm4gY29tbWFuZHNfdGV4dAor
CisgICAgZGVmIGhhbmRsZV9nbG9iYWxfYXJncyhzZWxmLCBhcmdzKToKKyAgICAgICAgKG9wdGlv
bnMsIGFyZ3MpID0gc2VsZi5nbG9iYWxfb3B0aW9uX3BhcnNlci5wYXJzZV9hcmdzKGFyZ3MpCisg
ICAgICAgIGlmIGxlbihhcmdzKToKKyAgICAgICAgICAgICMgV2UnbGwgbmV2ZXIgaGl0IHRoaXMg
YmVjYXVzZSBzcGxpdF9hcmdzIHNwbGl0cyBhdCB0aGUgZmlyc3QgYXJnIHdpdGhvdXQgYSBsZWFk
aW5nICctJworICAgICAgICAgICAgc2VsZi5nbG9iYWxfb3B0aW9uX3BhcnNlci5lcnJvcigiRXh0
cmEgYXJndW1lbnRzIGJlZm9yZSBjb21tYW5kOiAiICsgYXJncykKKyAgICAgICAgCisgICAgICAg
IGlmIG9wdGlvbnMuZHJ5cnVuOgorICAgICAgICAgICAgc2VsZi5zY20oKS5kcnlydW4gPSBUcnVl
CisgICAgICAgICAgICBzZWxmLmJ1Z3MuZHJ5cnVuID0gVHJ1ZQorICAgIAorICAgIGRlZiBzcGxp
dF9hcmdzKHNlbGYsIGFyZ3MpOgorICAgICAgICAjIEFzc3VtZSB0aGUgZmlyc3QgYXJndW1lbnQg
d2hpY2ggZG9lc24ndCBzdGFydCB3aXRoICctJyBpcyB0aGUgY29tbWFuZCBuYW1lCisgICAgICAg
IGNvbW1hbmRfaW5kZXggPSAwCisgICAgICAgIGZvciBhcmcgaW4gYXJnczoKKyAgICAgICAgICAg
IGlmIGFyZ1swXSAhPSAnLSc6CisgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgIGNv
bW1hbmRfaW5kZXggKz0gMQorCisgICAgICAgIGdsb2JhbF9hcmdzID0gYXJnc1s6Y29tbWFuZF9p
bmRleF0KKyAgICAgICAgaWYgY29tbWFuZF9pbmRleCA+PSBsZW4oYXJncyk6CisgICAgICAgICAg
ICByZXR1cm4gKGdsb2JhbF9hcmdzLCBOb25lLCBbXSkKKworICAgICAgICBjb21tYW5kID0gYXJn
c1tjb21tYW5kX2luZGV4XQorICAgICAgICBjb21tYW5kX2FyZ3MgPSBhcmdzW2NvbW1hbmRfaW5k
ZXggKyAxOl0KKyAgICAgICAgcmV0dXJuIChnbG9iYWxfYXJncywgY29tbWFuZCwgY29tbWFuZF9h
cmdzKQorICAgIAorICAgIGRlZiBjb21tYW5kX2J5X25hbWUoc2VsZiwgY29tbWFuZF9uYW1lKToK
KyAgICAgICAgZm9yIGNvbW1hbmQgaW4gc2VsZi5jb21tYW5kczoKKyAgICAgICAgICAgIGlmIGNv
bW1hbmRfbmFtZSA9PSBjb21tYW5kWyduYW1lJ106CisgICAgICAgICAgICAgICAgcmV0dXJuIGNv
bW1hbmQKKyAgICAgICAgcmV0dXJuIE5vbmUKKyAgICAKKyAgICBkZWYgbWFpbihzZWxmKToKKyAg
ICAgICAgKGdsb2JhbF9hcmdzLCBjb21tYW5kX25hbWUsIGFyZ3NfYWZ0ZXJfY29tbWFuZF9uYW1l
KSA9IHNlbGYuc3BsaXRfYXJncyhzeXMuYXJndlsxOl0pCisgICAgICAgIAorICAgICAgICAjIEhh
bmRsZSAtLWhlbHAsIGV0YzoKKyAgICAgICAgc2VsZi5oYW5kbGVfZ2xvYmFsX2FyZ3MoZ2xvYmFs
X2FyZ3MpCisgICAgICAgIAorICAgICAgICBpZiBub3QgY29tbWFuZF9uYW1lOgorICAgICAgICAg
ICAgc2VsZi5nbG9iYWxfb3B0aW9uX3BhcnNlci5lcnJvcigiTm8gY29tbWFuZCBzcGVjaWZpZWQi
KQorICAgICAgICAKKyAgICAgICAgY29tbWFuZCA9IHNlbGYuY29tbWFuZF9ieV9uYW1lKGNvbW1h
bmRfbmFtZSkKKyAgICAgICAgaWYgbm90IGNvbW1hbmQ6CisgICAgICAgICAgICBzZWxmLmdsb2Jh
bF9vcHRpb25fcGFyc2VyLmVycm9yKGNvbW1hbmRfbmFtZSArICIgaXMgbm90IGEgcmVjb2duaXpl
ZCBjb21tYW5kIikKKyAgICAgICAgCisgICAgICAgIGNvbW1hbmRfb2JqZWN0ID0gY29tbWFuZFsn
b2JqZWN0J10KKyAgICAgICAgKGNvbW1hbmRfb3B0aW9ucywgY29tbWFuZF9hcmdzKSA9IGNvbW1h
bmRfb2JqZWN0LnBhcnNlX2FyZ3MoYXJnc19hZnRlcl9jb21tYW5kX25hbWUpCisgICAgICAgIHJl
dHVybiBjb21tYW5kX29iamVjdC5leGVjdXRlKGNvbW1hbmRfb3B0aW9ucywgY29tbWFuZF9hcmdz
LCBzZWxmKQorCisKK2RlZiBtYWluKCk6CisgICAgdG9vbCA9IEJ1Z3ppbGxhVG9vbCgpCisgICAg
cmV0dXJuIHRvb2wubWFpbigpCisKK2lmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CisgICAgbWFp
bigpCmRpZmYgLS1naXQgYS9XZWJLaXRUb29scy9TY3JpcHRzL21vZHVsZXMvYnVnemlsbGEucHkg
Yi9XZWJLaXRUb29scy9TY3JpcHRzL21vZHVsZXMvYnVnemlsbGEucHkKbmV3IGZpbGUgbW9kZSAx
MDA2NDQKaW5kZXggMDAwMDAwMC4uNWJlN2I2OQotLS0gL2Rldi9udWxsCisrKyBiL1dlYktpdFRv
b2xzL1NjcmlwdHMvbW9kdWxlcy9idWd6aWxsYS5weQpAQCAtMCwwICsxLDI1OCBAQAorIyBDb3B5
cmlnaHQgKEMpIDIwMDkgR29vZ2xlLCBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorIworIyBS
ZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9y
IHdpdGhvdXQKKyMgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhl
IGZvbGxvd2luZyBjb25kaXRpb25zCisjIGFyZSBtZXQ6CisjIDEuIFJlZGlzdHJpYnV0aW9ucyBv
ZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisjICAgIG5vdGlj
ZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4K
KyMgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBh
Ym92ZSBjb3B5cmlnaHQKKyMgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQg
dGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorIyAgICBkb2N1bWVudGF0aW9uIGFuZC9v
ciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorIworIyBU
SElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIENPTVBVVEVSLCBJTkMuIGBgQVMgSVMn
JyBBTkQgQU5ZCisjIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJV
VCBOT1QgTElNSVRFRCBUTywgVEhFCisjIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFC
SUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorIyBQVVJQT1NFIEFSRSBESVNDTEFJ
TUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgQ09NUFVURVIsIElOQy4gT1IKKyMgQ09OVFJJ
QlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQ
RUNJQUwsCisjIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcs
IEJVVCBOT1QgTElNSVRFRCBUTywKKyMgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBP
UiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisjIFBST0ZJVFM7IE9SIEJVU0lORVNT
IElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyMgT0YgTElB
QklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisj
IChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBP
VVQgT0YgVEhFIFVTRQorIyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhF
IFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorIworIyBXZWJLaXQncyBQeXRob24gbW9kdWxl
IGZvciBpbnRlcmFjdGluZyB3aXRoIEJ1Z3ppbGxhCisKK2ltcG9ydCBnZXRwYXNzCitpbXBvcnQg
c3VicHJvY2VzcworaW1wb3J0IHN5cworaW1wb3J0IHVybGxpYjIKKworZnJvbSBCZWF1dGlmdWxT
b3VwIGltcG9ydCBCZWF1dGlmdWxTb3VwCitmcm9tIG1lY2hhbml6ZSBpbXBvcnQgQnJvd3Nlcgor
CitkZWYgbG9nKHN0cmluZyk6CisgICAgcHJpbnQgPj4gc3lzLnN0ZGVyciwgc3RyaW5nCisKKyMg
SEFDSzogVGhpcyBzaG91bGQgbm90IGRlcGVuZCBvbiBnaXQgZm9yIGNvbmZpZyBzdG9yYWdlCitk
ZWYgcmVhZF9jb25maWcoa2V5KToKKyAgICAjIE5lZWQgYSB3YXkgdG8gcmVhZCBmcm9tIHN2biB0
b28KKyAgICBjb25maWdfcHJvY2VzcyA9IHN1YnByb2Nlc3MuUG9wZW4oImdpdCBjb25maWcgLS1n
ZXQgYnVnemlsbGEuIiArIGtleSwgc3Rkb3V0PXN1YnByb2Nlc3MuUElQRSwgc2hlbGw9VHJ1ZSkK
KyAgICB2YWx1ZSA9IGNvbmZpZ19wcm9jZXNzLmNvbW11bmljYXRlKClbMF0KKyAgICByZXR1cm5f
Y29kZSA9IGNvbmZpZ19wcm9jZXNzLndhaXQoKQorCisgICAgaWYgcmV0dXJuX2NvZGUgIT0gMDoK
KyAgICAgICAgcmV0dXJuIE5vbmUKKyAgICByZXR1cm4gdmFsdWUucnN0cmlwKCdcbicpCisKK2Ns
YXNzIEJ1Z3ppbGxhOgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBkcnlydW4gPSBGYWxzZSk6Cisg
ICAgICAgIHNlbGYuZHJ5cnVuID0gZHJ5cnVuCisgICAgICAgIHNlbGYuYXV0aGVudGljYXRlZCA9
IEZhbHNlCisgICAgICAgIAorICAgICAgICAjIERlZmF1bHRzICh1bnRpbCB3ZSBzdXBwb3J0IGJl
dHRlciBvcHRpb24gcGFyc2luZyk6CisgICAgICAgIHNlbGYuYnVnX3NlcnZlciA9ICJodHRwczov
L2J1Z3Mud2Via2l0Lm9yZy8iCisgICAgICAgIAorICAgICAgICBzZWxmLmJyID0gQnJvd3Nlcigp
CisgICAgICAgICMgSWdub3JlIGJ1Z3Mud2Via2l0Lm9yZy9yb2JvdHMudHh0IHVudGlsIHdlIGZp
eCBpdCB0byBhbGxvdyB0aGlzIHNjcmlwdAorICAgICAgICBzZWxmLmJyLnNldF9oYW5kbGVfcm9i
b3RzKEZhbHNlKQorCisgICAgIyBUaGlzIGNvdWxkIGV2ZW50dWFsbHkgYmUgYSB0ZXh0IGZpbGUK
KyAgICByZXZpZXdlcl91c2VybmFtZXNfdG9fZnVsbF9uYW1lcyA9IHsKKyAgICAgICAgImFiYXJ0
aCIgOiAiQWRhbSBCYXJ0aCIsCisgICAgICAgICJhZGVsZSIgOiAiQWRlbGUgUGV0ZXJzb24iLAor
ICAgICAgICAiYXJpeWEuaGlkYXlhdCIgOiAiQXJpeWEgSGlkYXlhdCIsCisgICAgICAgICJkYXJp
biIgOiAiRGFyaW4gQWRsZXIiLAorICAgICAgICAiZGdsYXprb3YiIDogIkRpbWl0cmkgR2xhemtv
diIsCisgICAgICAgICJlcmljIiA6ICJFcmljIFNlaWRlbCIsCisgICAgICAgICJkZGtpbHplciIg
OiAiRGF2aWQgS2lsemVyIiwKKyAgICAgICAgImZpc2hkIiA6ICJEYXJpbiBGaXNoZXIiLAorICAg
ICAgICAiZ25zIiA6ICJHdXN0YXZvIE5vcm9uaGEiLAorICAgICAgICAiaHlhdHQiIDogIkRhdmlk
IEh5YXR0IiwKKyAgICAgICAgImptYWxvbnpvIiA6ICJKYW4gQWxvbnpvIiwKKyAgICAgICAgImxl
dmluIiA6ICJEYXZpZCBMZXZpbiIsCisgICAgICAgICJtaXR6IiA6ICJEYW4gQmVybnN0ZWluIiwK
KyAgICAgICAgIm1qcyIgOiAiTWFjaWVqIFN0YWNob3ZpYWsiLAorICAgICAgICAibXJvd2UiIDog
Ik1hcmsgUm93ZSIsCisgICAgICAgICJvbGl2ZXIiIDogIk9saXZlciBIdW50IiwKKyAgICAgICAg
InN0YWlrb3MiIDogIkdlb3JnZSBTdGFpa29zIiwKKyAgICAgICAgInRyZWF0IiA6ICJBZGFtIFRy
ZWF0IiwKKyAgICAgICAgInRpbW90aHkiIDogIlRpbW90aHkgSGF0Y2hlciIsCisgICAgICAgICJ4
YW4ubG9wZXoiIDogIlhhbiBMb3BleiIsCisgICAgICAgICJ6ZWNrZSIgOiAiSG9sZ2VyIEZyZXl0
aGVyIiwKKyAgICB9CisKKyAgICBkZWYgZnVsbF9uYW1lX2Zyb21fYnVnemlsbGFfbmFtZShzZWxm
LCBidWd6aWxsYV9uYW1lKToKKyAgICAgICAgaWYgbm90IGJ1Z3ppbGxhX25hbWUgaW4gc2VsZi5y
ZXZpZXdlcl91c2VybmFtZXNfdG9fZnVsbF9uYW1lczoKKyAgICAgICAgICAgIHJhaXNlIEV4Y2Vw
dGlvbigiRVJST1I6IFVua25vd24gcmV2aWV3ZXIhICIgKyBidWd6aWxsYV9uYW1lKQorICAgICAg
ICByZXR1cm4gc2VsZi5yZXZpZXdlcl91c2VybmFtZXNfdG9fZnVsbF9uYW1lc1tidWd6aWxsYV9u
YW1lXQorCisgICAgZGVmIGJ1Z191cmxfZm9yX2J1Z19pZChzZWxmLCBidWdfaWQpOgorICAgICAg
ICBidWdfYmFzZV91cmwgPSBzZWxmLmJ1Z19zZXJ2ZXIgKyAic2hvd19idWcuY2dpP2lkPSIKKyAg
ICAgICAgcmV0dXJuICIlcyVzIiAlIChidWdfYmFzZV91cmwsIGJ1Z19pZCkKKyAgICAKKyAgICBk
ZWYgYXR0YWNobWVudF91cmxfZm9yX2lkKHNlbGYsIGF0dGFjaG1lbnRfaWQsIGFjdGlvbiA9ICJ2
aWV3Iik6CisgICAgICAgIGF0dGFjaG1lbnRfYmFzZV91cmwgPSBzZWxmLmJ1Z19zZXJ2ZXIgKyAi
YXR0YWNobWVudC5jZ2k/aWQ9IgorICAgICAgICByZXR1cm4gIiVzJXMmYWN0aW9uPSVzIiAlIChh
dHRhY2htZW50X2Jhc2VfdXJsLCBhdHRhY2htZW50X2lkLCBhY3Rpb24pCisKKyAgICBkZWYgZmV0
Y2hfYXR0YWNobWVudHNfZnJvbV9idWcoc2VsZiwgYnVnX2lkKToKKyAgICAgICAgYnVnX3VybCA9
IHNlbGYuYnVnX3VybF9mb3JfYnVnX2lkKGJ1Z19pZCkKKyAgICAgICAgbG9nKCJGZXRjaGluZzog
IiArIGJ1Z191cmwpCisKKyAgICAgICAgcGFnZSA9IHVybGxpYjIudXJsb3BlbihidWdfdXJsKQor
ICAgICAgICBzb3VwID0gQmVhdXRpZnVsU291cChwYWdlKQorICAgIAorICAgICAgICBhdHRhY2ht
ZW50X3RhYmxlID0gc291cC5maW5kKCd0YWJsZScsIHsnY2VsbHNwYWNpbmcnOiIwIiwgJ2NlbGxw
YWRkaW5nJzoiNCIsICdib3JkZXInOiIxIn0pCisgICAgCisgICAgICAgIGF0dGFjaG1lbnRzID0g
W10KKyAgICAgICAgIyBHcmFiIGEgbGlzdCBvZiBub24tb2Jzb2xldGVkIHBhdGNoIGZpbGVzIAor
ICAgICAgICBmb3IgYXR0YWNobWVudF9yb3cgaW4gYXR0YWNobWVudF90YWJsZS5maW5kQWxsKCd0
cicpOgorICAgICAgICAgICAgZmlyc3RfY2VsbCA9IGF0dGFjaG1lbnRfcm93LmZpbmQoJ3RkJykK
KyAgICAgICAgICAgIGlmIG5vdCBmaXJzdF9jZWxsOgorICAgICAgICAgICAgICAgIGNvbnRpbnVl
ICMgVGhpcyBpcyB0aGUgaGVhZGVyLCBubyBjZWxscworICAgICAgICAgICAgaWYgZmlyc3RfY2Vs
bC5oYXNfa2V5KCdjb2xzcGFuJyk6CisgICAgICAgICAgICAgICAgYnJlYWsgIyB0aGlzIGlzIHRo
ZSBsYXN0IHJvdworICAgICAgICAgICAgCisgICAgICAgICAgICBhdHRhY2htZW50ID0ge30KKyAg
ICAgICAgICAgIGF0dGFjaG1lbnRbJ29ic29sZXRlJ10gPSAoYXR0YWNobWVudF9yb3cuaGFzX2tl
eSgnY2xhc3MnKSBhbmQgYXR0YWNobWVudF9yb3dbJ2NsYXNzJ10gPT0gImJ6X29ic29sZXRlIikK
KyAgICAgICAgICAgIAorICAgICAgICAgICAgY2VsbHMgPSBhdHRhY2htZW50X3Jvdy5maW5kQWxs
KCd0ZCcpCisgICAgICAgICAgICBhdHRhY2htZW50X2xpbmsgPSBjZWxsc1swXS5maW5kKCdhJykK
KyAgICAgICAgICAgIGF0dGFjaG1lbnRbJ3VybCddID0gc2VsZi5idWdfc2VydmVyICsgYXR0YWNo
bWVudF9saW5rWydocmVmJ10gIyB1cmxzIGFyZSByZWxhdGl2ZQorICAgICAgICAgICAgYXR0YWNo
bWVudFsnaWQnXSA9IGF0dGFjaG1lbnRbJ3VybCddLnNwbGl0KCc9JylbMV0gIyBlLmcuIGh0dHBz
Oi8vYnVncy53ZWJraXQub3JnL2F0dGFjaG1lbnQuY2dpP2lkPTMxMjIzCisgICAgICAgICAgICBh
dHRhY2htZW50WyduYW1lJ10gPSBhdHRhY2htZW50X2xpbmsuc3RyaW5nCisgICAgICAgICAgICAj
IGF0dGFjaG1lbnRbJ3R5cGUnXSA9IGNlbGxzWzFdCisgICAgICAgICAgICAjIGF0dGFjaG1lbnRb
J2RhdGUnXSA9IGNlbGxzWzJdCisgICAgICAgICAgICAjIGF0dGFjaG1lbnRbJ3NpemUnXSA9IGNl
bGxzWzNdCisgICAgICAgICAgICByZXZpZXdfc3RhdHVzID0gY2VsbHNbNF0KKyAgICAgICAgICAg
ICMgYWN0aW9uX2xpbmtzID0gY2VsbHNbNV0KKworICAgICAgICAgICAgaWYgKHN0cihyZXZpZXdf
c3RhdHVzKS5maW5kKCJyZXZpZXcrIikgIT0gLTEpOgorICAgICAgICAgICAgICAgIHJldmlld2Vy
ID0gcmV2aWV3X3N0YXR1cy5jb250ZW50c1swXS5zcGxpdCgnOicpWzBdICMgbmFtZTpcbiByZXZp
ZXcrXG4KKyAgICAgICAgICAgICAgICByZXZpZXdlcl9mdWxsX25hbWUgPSBzZWxmLmZ1bGxfbmFt
ZV9mcm9tX2J1Z3ppbGxhX25hbWUocmV2aWV3ZXIpCisgICAgICAgICAgICAgICAgYXR0YWNobWVu
dFsncmV2aWV3ZXInXSA9IHJldmlld2VyX2Z1bGxfbmFtZQorCisgICAgICAgICAgICBhdHRhY2ht
ZW50cy5hcHBlbmQoYXR0YWNobWVudCkKKyAgICAgICAgcmV0dXJuIGF0dGFjaG1lbnRzCisKKyAg
ICBkZWYgZmV0Y2hfcmV2aWV3ZWRfcGF0Y2hlc19mcm9tX2J1ZyhzZWxmLCBidWdfaWQpOgorICAg
ICAgICByZXZpZXdlZF9wYXRjaGVzID0gW10KKyAgICAgICAgZm9yIGF0dGFjaG1lbnQgaW4gc2Vs
Zi5mZXRjaF9hdHRhY2htZW50c19mcm9tX2J1ZyhidWdfaWQpOgorICAgICAgICAgICAgaWYgJ3Jl
dmlld2VyJyBpbiBhdHRhY2htZW50IGFuZCBub3QgYXR0YWNobWVudFsnb2Jzb2xldGUnXToKKyAg
ICAgICAgICAgICAgICByZXZpZXdlZF9wYXRjaGVzLmFwcGVuZChhdHRhY2htZW50KQorICAgICAg
ICByZXR1cm4gcmV2aWV3ZWRfcGF0Y2hlcworCisgICAgZGVmIGZldGNoX2J1Z19pZHNfZnJvbV9j
b21taXRfcXVldWUoc2VsZik6CisgICAgICAgIHVuYXNzaWduZWRfb25seSA9ICImZW1haWxhc3Np
Z25lZF90bzE9MSZlbWFpbHR5cGUxPXN1YnN0cmluZyZlbWFpbDE9dW5hc3NpZ25lZCIKKyAgICAg
ICAgY29tbWl0X3F1ZXVlX3VybCA9ICJodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9idWdsaXN0LmNn
aT9xdWVyeV9mb3JtYXQ9YWR2YW5jZWQmYnVnX3N0YXR1cz1VTkNPTkZJUk1FRCZidWdfc3RhdHVz
PU5FVyZidWdfc3RhdHVzPUFTU0lHTkVEJmJ1Z19zdGF0dXM9UkVPUEVORUQmZmllbGQwLTAtMD1m
bGFndHlwZXMubmFtZSZ0eXBlMC0wLTA9ZXF1YWxzJnZhbHVlMC0wLTA9cmV2aWV3JTJCIgorICAg
ICAgICBsb2coIkxvYWRpbmcgY29tbWl0IHF1ZXVlIikKKworICAgICAgICBwYWdlID0gdXJsbGli
Mi51cmxvcGVuKGNvbW1pdF9xdWV1ZV91cmwpCisgICAgICAgIHNvdXAgPSBCZWF1dGlmdWxTb3Vw
KHBhZ2UpCisgICAgCisgICAgICAgIGJ1Z19pZHMgPSBbXQorICAgICAgICAjIEdyYWIgdGhlIGNl
bGxzIGluIHRoZSBmaXJzdCBjb2x1bW4gKHdoaWNoIGhhcHBlbnMgdG8gYmUgdGhlIGJ1ZyBpZHMp
CisgICAgICAgIGZvciBidWdfbGlua19jZWxsIGluIHNvdXAoJ3RkJywgImZpcnN0LWNoaWxkIik6
ICMgdGRzIHdpdGggdGhlIGNsYXNzICJmaXJzdC1jaGlsZCIKKyAgICAgICAgICAgIGJ1Z19saW5r
ID0gYnVnX2xpbmtfY2VsbC5maW5kKCJhIikKKyAgICAgICAgICAgIGJ1Z19pZHMuYXBwZW5kKGJ1
Z19saW5rLnN0cmluZykgIyB0aGUgY29udGVudHMgaGFwcGVuIHRvIGJlIHRoZSBidWcgaWQKKyAg
ICAKKyAgICAgICAgcmV0dXJuIGJ1Z19pZHMKKworICAgIGRlZiBmZXRjaF9wYXRjaGVzX2Zyb21f
Y29tbWl0X3F1ZXVlKHNlbGYpOgorICAgICAgICBwYXRjaGVzX3RvX2xhbmQgPSBbXQorICAgICAg
ICBmb3IgYnVnX2lkIGluIHNlbGYuZmV0Y2hfYnVnX2lkc19mcm9tX2NvbW1pdF9xdWV1ZSgpOgor
ICAgICAgICAgICAgcGF0Y2hlcyA9IHNlbGYuZmV0Y2hfcmV2aWV3ZWRfcGF0Y2hlc19mcm9tX2J1
ZyhidWdfaWQpCisgICAgICAgICAgICBwYXRjaGVzX3RvX2xhbmQuZXh0ZW5kKHBhdGNoZXMpCisg
ICAgICAgIHJldHVybiBwYXRjaGVzX3RvX2xhbmQKKworICAgIGRlZiBhdXRoZW50aWNhdGUoc2Vs
ZiwgdXNlcm5hbWUgPSBOb25lLCBwYXNzd29yZCA9IE5vbmUpOgorICAgICAgICBpZiAoc2VsZi5h
dXRoZW50aWNhdGVkKToKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICAKKyAgICAgICAgaWYg
bm90IHVzZXJuYW1lOgorICAgICAgICAgICAgdXNlcm5hbWUgPSByZWFkX2NvbmZpZygidXNlcm5h
bWUiKQorICAgICAgICAgICAgaWYgbm90IHVzZXJuYW1lOgorICAgICAgICAgICAgICAgIHVzZXJu
YW1lID0gcmF3X2lucHV0KCJCdWd6aWxsYSBsb2dpbjogIikKKyAgICAgICAgaWYgbm90IHBhc3N3
b3JkOgorICAgICAgICAgICAgcGFzc3dvcmQgPSByZWFkX2NvbmZpZygicGFzc3dvcmQiKQorICAg
ICAgICAgICAgaWYgbm90IHBhc3N3b3JkOgorICAgICAgICAgICAgICAgIHBhc3N3b3JkID0gZ2V0
cGFzcy5nZXRwYXNzKCJCdWd6aWxsYSBwYXNzd29yZDogIikKKworICAgICAgICBsb2coIkxvZ2dp
bmcgaW4gYXMgJXMuLi4iICUgKHVzZXJuYW1lLCkpCisgICAgICAgIGlmIHNlbGYuZHJ5cnVuOgor
ICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIHNlbGYuYnIub3BlbihzZWxmLmJ1Z19zZXJ2ZXIg
KyAiL2luZGV4LmNnaT9Hb0FoZWFkQW5kTG9nSW49MSIpCisgICAgICAgIHNlbGYuYnIuc2VsZWN0
X2Zvcm0obmFtZT0ibG9naW4iKQorICAgICAgICBzZWxmLmJyWydCdWd6aWxsYV9sb2dpbiddID0g
dXNlcm5hbWUKKyAgICAgICAgc2VsZi5iclsnQnVnemlsbGFfcGFzc3dvcmQnXSA9IHBhc3N3b3Jk
CisgICAgICAgIHNlbGYuYnIuc3VibWl0KCkKKworICAgICAgICAjIFdlIHJlYWxseSBzaG91bGQg
Y2hlY2sgdGhlIHJlc3VsdCBjb2RlcyBhbmQgdHJ5IGFnYWluIGFzIG5lY2Vzc2FyeQorICAgICAg
ICBzZWxmLmF1dGhlbnRpY2F0ZWQgPSBUcnVlCisKKyAgICBkZWYgYWRkX3BhdGNoX3RvX2J1Zyhz
ZWxmLCBidWdfaWQsIHBhdGNoX2ZpbGVfb2JqZWN0LCBkZXNjcmlwdGlvbiwgY29tbWVudF90ZXh0
ID0gTm9uZSwgbWFya19mb3JfcmV2aWV3ID0gRmFsc2UpOgorICAgICAgICBzZWxmLmF1dGhlbnRp
Y2F0ZSgpCisgICAgICAgIAorICAgICAgICBsb2coIkFkZGluZyBwYXRjaCBcIiVzXCIgdG8gYnVn
ICVzIiAlIChkZXNjcmlwdGlvbiwgYnVnX2lkKSkKKyAgICAgICAgaWYgc2VsZi5kcnlydW46Cisg
ICAgICAgICAgICBsb2coY29tbWVudF90ZXh0KQorICAgICAgICAgICAgcmV0dXJuCisgICAgICAg
IAorICAgICAgICBzZWxmLmJyLm9wZW4oc2VsZi5idWdfc2VydmVyICsgIi9hdHRhY2htZW50LmNn
aT9hY3Rpb249ZW50ZXImYnVnaWQ9IiArIGJ1Z19pZCkKKyAgICAgICAgc2VsZi5ici5zZWxlY3Rf
Zm9ybShuYW1lPSJlbnRyeWZvcm0iKSAgICAgICAgCisgICAgICAgIHNlbGYuYnJbJ2Rlc2NyaXB0
aW9uJ10gPSBkZXNjcmlwdGlvbgorICAgICAgICBzZWxmLmJyWydpc3BhdGNoJ10gPSAoIjEiLCkK
KyAgICAgICAgaWYgKGNvbW1lbnRfdGV4dCk6CisgICAgICAgICAgICBsb2coY29tbWVudF90ZXh0
KQorICAgICAgICAgICAgc2VsZi5iclsnY29tbWVudCddID0gY29tbWVudF90ZXh0CisgICAgICAg
IHNlbGYuYnJbJ2ZsYWdfdHlwZS0xJ10gPSAoJz8nLCkgaWYgbWFya19mb3JfcmV2aWV3IGVsc2Ug
KCdYJywpCisgICAgICAgIHNlbGYuYnIuYWRkX2ZpbGUocGF0Y2hfZmlsZV9vYmplY3QsICJ0ZXh0
L3BsYWluIiwgImJ1Z3ppbGxhX3JlcXVpcmVzX2FfZmlsZW5hbWUucGF0Y2giKQorICAgICAgICBz
ZWxmLmJyLnN1Ym1pdCgpCisKKyAgICBkZWYgb2Jzb2xldGVfYXR0YWNobWVudChzZWxmLCBhdHRh
Y2htZW50X2lkLCBjb21tZW50X3RleHQgPSBOb25lKToKKyAgICAgICAgc2VsZi5hdXRoZW50aWNh
dGUoKQorCisgICAgICAgIGxvZygiT2Jzb2xldGluZyBhdHRhY2htZW50OiAlcyIgJSAoYXR0YWNo
bWVudF9pZCwpKQorICAgICAgICBpZiBzZWxmLmRyeXJ1bjoKKyAgICAgICAgICAgIGxvZyhjb21t
ZW50X3RleHQpCisgICAgICAgICAgICByZXR1cm4KKworICAgICAgICBzZWxmLmJyLm9wZW4oc2Vs
Zi5hdHRhY2htZW50X3VybF9mb3JfaWQoYXR0YWNobWVudF9pZCwgJ2VkaXQnKSkKKyAgICAgICAg
c2VsZi5ici5zZWxlY3RfZm9ybShucj0wKQorICAgICAgICBzZWxmLmJyLmZpbmRfY29udHJvbCgn
aXNvYnNvbGV0ZScpLml0ZW1zWzBdLnNlbGVjdGVkID0gVHJ1ZQorICAgICAgICAjIEFsc28gY2xl
YXIgYW55IHJldmlldyBmbGFnICh0byByZW1vdmUgaXQgZnJvbSByZXZpZXcvY29tbWl0IHF1ZXVl
cykKKyAgICAgICAgc2VsZi5ici5maW5kX2NvbnRyb2wodHlwZT0nc2VsZWN0JywgbnI9MCkudmFs
dWUgPSAoIlgiLCkKKyAgICAgICAgaWYgY29tbWVudF90ZXh0OgorICAgICAgICAgICAgbG9nKGNv
bW1lbnRfdGV4dCkKKyAgICAgICAgICAgIHNlbGYuYnJbJ2NvbW1lbnQnXSA9IGNvbW1lbnRfdGV4
dAorICAgICAgICBzZWxmLmJyLnN1Ym1pdCgpCisgICAgCisgICAgZGVmIHBvc3RfY29tbWVudF90
b19idWcoc2VsZiwgYnVnX2lkLCBjb21tZW50X3RleHQpOgorICAgICAgICBzZWxmLmF1dGhlbnRp
Y2F0ZSgpCisKKyAgICAgICAgbG9nKCJBZGRpbmcgY29tbWVudCB0byBidWcgJXMiICUgKGJ1Z19p
ZCwpKQorICAgICAgICBpZiBzZWxmLmRyeXJ1bjoKKyAgICAgICAgICAgIGxvZyhjb21tZW50X3Rl
eHQpCisgICAgICAgICAgICByZXR1cm4KKworICAgICAgICBzZWxmLmJyLm9wZW4oc2VsZi5idWdf
dXJsX2Zvcl9idWdfaWQoYnVnX2lkKSkKKyAgICAgICAgc2VsZi5ici5zZWxlY3RfZm9ybShuYW1l
PSJjaGFuZ2Vmb3JtIikKKyAgICAgICAgc2VsZi5iclsnY29tbWVudCddID0gY29tbWVudF90ZXh0
CisgICAgICAgIHNlbGYuYnIuc3VibWl0KCkKKworICAgIGRlZiBjbG9zZV9idWdfYXNfZml4ZWQo
c2VsZiwgYnVnX2lkLCBjb21tZW50X3RleHQgPSBOb25lKToKKyAgICAgICAgc2VsZi5hdXRoZW50
aWNhdGUoKQorCisgICAgICAgIGxvZygiQ2xvc2luZyBidWcgJXMgYXMgZml4ZWQiICUgKGJ1Z19p
ZCwpKQorICAgICAgICBpZiBzZWxmLmRyeXJ1bjoKKyAgICAgICAgICAgIGxvZyhjb21tZW50X3Rl
eHQpCisgICAgICAgICAgICByZXR1cm4KKworICAgICAgICBzZWxmLmJyLm9wZW4oc2VsZi5idWdf
dXJsX2Zvcl9idWdfaWQoYnVnX2lkKSkKKyAgICAgICAgc2VsZi5ici5zZWxlY3RfZm9ybShuYW1l
PSJjaGFuZ2Vmb3JtIikKKyAgICAgICAgaWYgY29tbWVudF90ZXh0OgorICAgICAgICAgICAgbG9n
KGNvbW1lbnRfdGV4dCkKKyAgICAgICAgICAgIHNlbGYuYnJbJ2NvbW1lbnQnXSA9IGNvbW1lbnRf
dGV4dAorICAgICAgICBzZWxmLmJyWydrbm9iJ10gPSBbJ3Jlc29sdmUnXQorICAgICAgICBzZWxm
LmJyWydyZXNvbHV0aW9uJ10gPSBbJ0ZJWEVEJ10KKyAgICAgICAgc2VsZi5ici5zdWJtaXQoKQpk
aWZmIC0tZ2l0IGEvV2ViS2l0VG9vbHMvU2NyaXB0cy9tb2R1bGVzL3NjbS5weSBiL1dlYktpdFRv
b2xzL1NjcmlwdHMvbW9kdWxlcy9zY20ucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAw
MDAwMC4uMDg4YWVkNgotLS0gL2Rldi9udWxsCisrKyBiL1dlYktpdFRvb2xzL1NjcmlwdHMvbW9k
dWxlcy9zY20ucHkKQEAgLTAsMCArMSwyMjYgQEAKKyMgQ29weXJpZ2h0IChDKSAyMDA5IEdvb2ds
ZSwgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyMKKyMgUmVkaXN0cmlidXRpb24gYW5kIHVz
ZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisjIG1vZGlmaWNh
dGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9u
cworIyBhcmUgbWV0OgorIyAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCBy
ZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorIyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25k
aXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisjIDIuIFJlZGlzdHJpYnV0aW9u
cyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisjICAg
IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xh
aW1lciBpbiB0aGUKKyMgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHBy
b3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyMKKyMgVEhJUyBTT0ZUV0FSRSBJUyBQUk9W
SURFRCBCWSBBUFBMRSBDT01QVVRFUiwgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorIyBFWFBSRVNT
IE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRI
RQorIyBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZP
UiBBIFBBUlRJQ1VMQVIKKyMgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNI
QUxMIEFQUExFIENPTVBVVEVSLCBJTkMuIE9SCisjIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9S
IEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorIyBFWEVNUExBUlks
IE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8s
CisjIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0Yg
VVNFLCBEQVRBLCBPUgorIyBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VW
RVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisjIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBD
T05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorIyAoSU5DTFVESU5HIE5FR0xJR0VO
Q0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyMgT0Yg
VEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNI
IERBTUFHRS4KKyMKKyMgUHl0aG9uIG1vZHVsZSBmb3IgaW50ZXJhY3Rpbmcgd2l0aCBhbiBTQ00g
c3lzdGVtIChsaWtlIFNWTiBvciBHaXQpCisKK2ltcG9ydCBvcworaW1wb3J0IHJlCitpbXBvcnQg
c3VicHJvY2VzcworaW1wb3J0IHN5cworCitkZWYgbG9nKHN0cmluZyk6CisgICAgcHJpbnQgPj4g
c3lzLnN0ZGVyciwgc3RyaW5nCisKK2RlZiBlcnJvcihzdHJpbmcpOgorICAgIGxvZyhzdHJpbmcp
CisgICAgZXhpdCgxKQorCitkZWYgZGV0ZWN0X3NjbV9zeXN0ZW0ocGF0aCk6CisgICAgIyBGSVhN
RTogVGhlc2UgY2hlY2tzIHNob3VsZCBiZSBjb250YWluZWQgaW4gdGhlIFNWTiBhbmQgR2l0IGNs
YXNzZXMuLi4KKyAgICBpZiBvcy5wYXRoLmlzZGlyKG9zLnBhdGguam9pbihwYXRoLCAnLnN2bicp
KToKKyAgICAgICAgcmV0dXJuIFNWTigpCisgICAgCisgICAgaWYgb3Muc3lzdGVtKCJjZCAiICsg
cGF0aCArICIgJiYgZ2l0IHJldi1wYXJzZSA+IC9kZXYvbnVsbCAyPiYxIikgPT0gMDoKKyAgICAg
ICAgcmV0dXJuIEdpdCgpCisgICAgCisgICAgZXJyb3IoIlRoZSBjdXJyZW50IGRpcmVjdG9yeSBk
b2VzIG5vdCBhcHBlYXIgdG8gYmUgYSB2YWxpZCBXZWJLaXQgY2hlY2tvdXQiKQorCitjbGFzcyBT
Y3JpcHRFcnJvcihFeGNlcHRpb24pOgorICAgIHBhc3MKKworY2xhc3MgU0NNOgorICAgIGRlZiBf
X2luaXRfXyhzZWxmLCBkcnlydW4gPSBGYWxzZSk6CisgICAgICAgIHNlbGYuZHJ5cnVuID0gZHJ5
cnVuCisKKyAgICBkZWYgZW5zdXJlX2NsZWFuX3dvcmtpbmdfZGlyZWN0b3J5KHNlbGYsIGZvcmNl
KToKKyAgICAgICAgIyBXZSBzaG91bGQgbWFrZSBzdXJlIHRoZSB0cmVlIGlzIGNsZWFuCisgICAg
ICAgICMgaWYgaXQncyBub3QgY2xlYW4gYW5kIGZvcmNlICE9IFRydWUsIHRoZW4gZmFpbCB3aXRo
IGEgbmljZSBtZXNzYWdlCisgICAgICAgICMgc2ltaWxhciB0byBob3cgImdpdCBjbGVhbiAtbiIg
d291bGQgc2hvdyB5b3Ugd2hhdCAtZiB3b3VsZCByZW1vdmUKKyAgICAgICAgaWYgbm90IGZvcmNl
OgorICAgICAgICAgICAgbG9nKCItLWZvcmNlIHJlcXVpcmVkLCB3b3JraW5nIGRpcmVjdG9yeSBu
b3QgY2xlYW4iKQorCisgICAgICAgICMgSEFDSzogVGhpcyBpcyBkYW5nZXJvdXMsIGJ1dCBJJ20g
dGhlIG9ubHkgb25lIHVzaW5nIHRoaXMgc2NyaXB0LCBzbyBpdCdzIE9LLiA7KQorICAgICAgICAj
IHdlIHJlYWxseSBzaG91bGQgcmVxdWlyZSBhIC0tZm9yY2Ugb3B0aW9uIHRvIHVzZSBhIG5vbi1j
bGVhbiB3b3JraW5nIGRpcmVjdG9yeQorICAgICAgICBsb2coIkNsZWFuaW5nIHRoZSB3b3JraW5n
IGRpcmVjdG9yeSIpCisgICAgICAgIHNlbGYuY2xlYW5fd29ya2luZ19kaXJlY3RvcnkoKQorICAg
IAorICAgIGRlZiBjbGVhbl93b3JraW5nX2RpcmVjdG9yeShzZWxmKToKKyAgICAgICAgcmFpc2Ug
Tm90SW1wbGVtZW50ZWRFcnJvciwgInN1YmNsYXNzZXMgbXVzdCBpbXBsZW1lbnQiCisgICAgCisg
ICAgZGVmIHVwZGF0ZV93ZWJraXQoc2VsZik6CisgICAgICAgIHJhaXNlIE5vdEltcGxlbWVudGVk
RXJyb3IsICJzdWJjbGFzc2VzIG11c3QgaW1wbGVtZW50IgorICAgIAorICAgIGRlZiBhcHBseV9w
YXRjaChzZWxmLCBwYXRjaCk6CisgICAgICAgICMgSXQncyBwb3NzaWJsZSB0aGF0IHRoZSBwYXRj
aCB3YXMgbm90IG1hZGUgZnJvbSB0aGUgcm9vdCBkaXJlY3RvcnkKKyAgICAgICAgIyB3ZSBzaG91
bGQgZGV0ZWN0IGFuZCBoYW5kbGUgdGhhdCBjYXNlLgorICAgICAgICByZXR1cm5fY29kZSA9IG9z
LnN5c3RlbSgiY3VybCAiICsgcGF0Y2hbJ3VybCddICsgIiB8IHN2bi1hcHBseSAtLXJldmlld2Vy
IFwiIiArIHBhdGNoWydyZXZpZXdlciddICsgIlwiIikKKyAgICAgICAgaWYgKHJldHVybl9jb2Rl
ICE9IDApOgorICAgICAgICAgICAgcmFpc2UgU2NyaXB0RXJyb3IoIlBhdGNoICIgKyBwYXRjaFsn
dXJsJ10gKyAiIGZhaWxlZCB0byBkb3dubG9hZCBhbmQgYXBwbHkuIikKKworICAgICMgSXQncyBz
bGlnaHRseSBoYWNreSB0byBzaGFyZSB0aGlzIGNvZGUsIHNpbmNlIHRoZXJlIGFyZSBpbXBsaWNp
dCBhc3N1bXB0aW9ucyBhYm91dCB0aGUgcmVnZXhwIGZvcm1hdAorICAgIGRlZiBydW5fc3RhdHVz
X2FuZF9leHRyYWN0X2ZpbGVuYW1lcyhzZWxmLCBzdGF0dXNfY29tbWFuZCwgc3RhdHVzX3JlZ2V4
cCk6CisgICAgICAgIGZpbGVfbmFtZXMgPSBbXQorICAgICAgICBmb3IgbGluZSBpbiBvcy5wb3Bl
bihzdGF0dXNfY29tbWFuZCkucmVhZGxpbmVzKCk6CisgICAgICAgICAgICBtYXRjaCA9IHJlLnNl
YXJjaChzdGF0dXNfcmVnZXhwLCBsaW5lKQorICAgICAgICAgICAgaWYgbm90IG1hdGNoOgorICAg
ICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICAjIHN0YXR1cyA9IG1hdGNoLmdyb3Vw
KDEpCisgICAgICAgICAgICBmaWxlX25hbWUgPSBtYXRjaC5ncm91cCgyKQorICAgICAgICAgICAg
ZmlsZV9uYW1lcy5hcHBlbmQoZmlsZV9uYW1lKQorICAgICAgICByZXR1cm4gZmlsZV9uYW1lcwor
CisgICAgZGVmIGNoYW5nZWRfZmlsZXMoc2VsZik6CisgICAgICAgIHJhaXNlIE5vdEltcGxlbWVu
dGVkRXJyb3IsICJzdWJjbGFzc2VzIG11c3QgaW1wbGVtZW50IgorCisgICAgZGVmIHN1cHBvcnRz
X2xvY2FsX2NvbW1pdHMoc2VsZik6CisgICAgICAgIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3Is
ICJzdWJjbGFzc2VzIG11c3QgaW1wbGVtZW50IgorCisgICAgZGVmIGRpc3BsYXlfbmFtZShzZWxm
KToKKyAgICAgICAgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvciwgInN1YmNsYXNzZXMgbXVzdCBp
bXBsZW1lbnQiCisKKyAgICBkZWYgY3JlYXRlX3BhdGNoX2NvbW1hbmQoc2VsZik6CisgICAgICAg
IHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IsICJzdWJjbGFzc2VzIG11c3QgaW1wbGVtZW50Igor
CisgICAgZGVmIGNvbW1pdF93aXRoX21lc3NhZ2Uoc2VsZiwgbWVzc2FnZSk6CisgICAgICAgIHJh
aXNlIE5vdEltcGxlbWVudGVkRXJyb3IsICJzdWJjbGFzc2VzIG11c3QgaW1wbGVtZW50IgorCitj
bGFzcyBTVk4gKFNDTSk6CisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGRyeXJ1biA9IEZhbHNlKToK
KyAgICAgICAgU0NNLl9faW5pdF9fKHNlbGYsIGRyeXJ1bikKKyAgICAKKyAgICBkZWYgc3ZuX3Zl
cnNpb24oc2VsZik6CisgICAgICAgIGlmIG5vdCBzZWxmLmNhY2hlZF92ZXJzaW9uOgorICAgICAg
ICAgICAgc2VsZi5jYWNoZWRfdmVyc2lvbiA9IHN1YnByb2Nlc3MuUG9wZW4oInN2biAtLXZlcnNp
b24gLS1xdWlldCIsIHN0ZG91dD1zdWJwcm9jZXNzLlBJUEUsIHNoZWxsPVRydWUpLmNvbW11bmlj
YXRlKClbMF0KKyAgICAgICAgCisgICAgICAgIHJldHVybiBzZWxmLmNhY2hlZF92ZXJzaW9uCisK
KyAgICBkZWYgY2xlYW5fd29ya2luZ19kaXJlY3Rvcnkoc2VsZik6CisgICAgICAgIG9zLnN5c3Rl
bSgic3ZuIHJlc2V0IC1SIikKKworICAgIGRlZiB1cGRhdGVfd2Via2l0KHNlbGYpOgorICAgICAg
ICBvcy5zeXN0ZW0oInVwZGF0ZS13ZWJraXQiKQorCisgICAgZGVmIGNoYW5nZWRfZmlsZXMoc2Vs
Zik6CisgICAgICAgIHN0YXR1c19jb21tYW5kID0gJ3N2biBzdGF0dXMnCisgICAgICAgIHN0YXR1
c19yZWdleHAgPSAiXihbQUNETVJdKS57Nn0gKC4rKSQiIGlmIHNlbGYuc3ZuX3ZlcnNpb24oKSA+
ICIxLjYiIGVsc2UgIl4oW0FDRE1SXSkuezV9ICguKykkIgorICAgICAgICByZXR1cm4gc2VsZi5y
dW5fc3RhdHVzX2FuZF9leHRyYWN0X2ZpbGVuYW1lcyhzdGF0dXNfY29tbWFuZCwgc3RhdHVzX3Jl
Z2V4cCkKKworICAgIGRlZiBzdXBwb3J0c19sb2NhbF9jb21taXRzKHNlbGYpOgorICAgICAgICBy
ZXR1cm4gRmFsc2UKKworICAgIGRlZiBkaXNwbGF5X25hbWUoc2VsZik6CisgICAgICAgIHJldHVy
biAic3ZuIgorCisgICAgZGVmIGNyZWF0ZV9wYXRjaF9jb21tYW5kKHNlbGYpOgorICAgICAgICBy
ZXR1cm4gInN2bi1jcmVhdGUtcGF0Y2giCisKKyAgICBkZWYgY29tbWl0X3dpdGhfbWVzc2FnZShz
ZWxmLCBtZXNzYWdlKToKKyAgICAgICAgY29tbWl0X3Byb2Nlc3MgPSBzdWJwcm9jZXNzLlBvcGVu
KCdzdm4gY29tbWl0IC1GIC0nLCBzdGRpbj1zdWJwcm9jZXNzLlBJUEUsIHNoZWxsPVRydWUpCisg
ICAgICAgIGNvbW1pdF9wcm9jZXNzLmNvbW11bmljYXRlKG1lc3NhZ2UpCisKKyMgQWxsIGdpdC1z
cGVjaWZpYyBsb2dpYyBzaG91bGQgZ28gaGVyZS4KK2NsYXNzIEdpdCAoU0NNKToKKyAgICBkZWYg
X19pbml0X18oc2VsZiwgZHJ5cnVuID0gRmFsc2UpOgorICAgICAgICBTQ00uX19pbml0X18oc2Vs
ZiwgZHJ5cnVuKQorICAgIAorICAgIGRlZiBjbGVhbl93b3JraW5nX2RpcmVjdG9yeShzZWxmKToK
KyAgICAgICAgb3Muc3lzdGVtKCJnaXQgcmVzZXQgLS1oYXJkIHRydW5rICYmIGdpdCBjbGVhbiAt
ZiIpCisgICAgCisgICAgZGVmIHVwZGF0ZV93ZWJraXQoc2VsZik6CisgICAgICAgICMgRklYTUU6
IFNob3VsZCBwcm9iYWJseSBjYWxsIHVwZGF0ZS13ZWJraXQsIG5vPworICAgICAgICBsb2coIlVw
ZGF0aW5nIHdvcmtpbmcgZGlyZWN0b3J5IikKKyAgICAgICAgb3Muc3lzdGVtKCJnaXQgc3ZuIHJl
YmFzZSIpCisKKyAgICBkZWYgY2hhbmdlZF9maWxlcyhzZWxmKToKKyAgICAgICAgc3RhdHVzX2Nv
bW1hbmQgPSAnZ2l0IGRpZmYgLXIgLS1uYW1lLXN0YXR1cyAtQyAtQyAtTScKKyAgICAgICAgc3Rh
dHVzX3JlZ2V4cCA9ICdeKFtBRE1dKVx0KC4rKSQnCisgICAgICAgIHJldHVybiBzZWxmLnJ1bl9z
dGF0dXNfYW5kX2V4dHJhY3RfZmlsZW5hbWVzKHN0YXR1c19jb21tYW5kLCBzdGF0dXNfcmVnZXhw
KQorICAgIAorICAgIGRlZiBzdXBwb3J0c19sb2NhbF9jb21taXRzKHNlbGYpOgorICAgICAgICBy
ZXR1cm4gVHJ1ZQorCisgICAgZGVmIGRpc3BsYXlfbmFtZShzZWxmKToKKyAgICAgICAgcmV0dXJu
ICJnaXQiCisKKyAgICBkZWYgY3JlYXRlX3BhdGNoX2NvbW1hbmQoc2VsZik6CisgICAgICAgIHJl
dHVybiAiZ2l0IGRpZmYgaGVhZCIKKworICAgIGRlZiBjb21taXRfd2l0aF9tZXNzYWdlKHNlbGYs
IG1lc3NhZ2UpOgorICAgICAgICBzZWxmLmNvbW1pdF9sb2NhbGx5X3dpdGhfbWVzc2FnZShtZXNz
YWdlKQorICAgICAgICBzZWxmLnB1c2hfbG9jYWxfY29tbWl0c190b19zZXJ2ZXIoKQorCisgICAg
IyBHaXQtc3BlY2lmaWMgbWV0aG9kczoKKyAgICAKKyAgICBkZWYgY29tbWl0X2xvY2FsbHlfd2l0
aF9tZXNzYWdlKHNlbGYsIG1lc3NhZ2UpOgorICAgICAgICBjb21taXRfcHJvY2VzcyA9IHN1YnBy
b2Nlc3MuUG9wZW4oJ2dpdCBjb21taXQgLWEgLUYgLScsIHN0ZGluPXN1YnByb2Nlc3MuUElQRSwg
c2hlbGw9VHJ1ZSkKKyAgICAgICAgY29tbWl0X3Byb2Nlc3MuY29tbXVuaWNhdGUobWVzc2FnZSkK
KyAgICAgICAgCisgICAgZGVmIHB1c2hfbG9jYWxfY29tbWl0c190b19zZXJ2ZXIoc2VsZik6Cisg
ICAgICAgIGlmIHNlbGYuZHJ5cnVuOgorICAgICAgICAgICAgcmV0dXJuICJEcnkgcnVuLCBubyBy
ZW1vdGUgY29tbWl0LiIKKyAgICAgICAgY29tbWl0X3Byb2Nlc3MgPSBzdWJwcm9jZXNzLlBvcGVu
KCdnaXQgc3ZuIGRjb21taXQnLCBzdGRvdXQ9c3VicHJvY2Vzcy5QSVBFLCBzaGVsbD1UcnVlKQor
ICAgICAgICAob3V0LCBlcnJvcikgPSBjb21taXRfcHJvY2Vzcy5jb21tdW5pY2F0ZSgpCisgICAg
ICAgIHJldHVybl9jb2RlID0gY29tbWl0X3Byb2Nlc3Mud2FpdCgpCisgICAgICAgIGxvZygiQ29t
bWl0IGZhaWx1cmU6ICIgKyByZXR1cm5fY29kZSkgIyBXZSByZWFsbHkgc2hvdWxkIGhhbmRsZSB0
aGUgZmFpbHVyZQorICAgICAgICByZXR1cm4gb3V0CisgICAgCisKKyAgICBkZWYgY29tbWl0X2lk
c19mcm9tX3JhbmdlX2FyZ3VtZW50cyhzZWxmLCBhcmdzLCBjaGVycnlfcGljayA9IEZhbHNlKToK
KyAgICAgICAgIyBGaXJzdCBnZXQgdGhlIGNvbW1pdC1pZHMgZm9yIHRoZSBwYXNzZWQgaW4gcmV2
aXNpb25zCisgICAgICAgIHJldl9wYXJzZV9hcmdzID0gWydnaXQnLCAncmV2LXBhcnNlJywgJy0t
cmV2cy1vbmx5J10KKyAgICAgICAgcmV2X3BhcnNlX2FyZ3MuZXh0ZW5kKGFyZ3MpCisgICAgICAg
IHJldl9wYXJzZV9wcm9jZXNzID0gc3VicHJvY2Vzcy5Qb3BlbigiICIuam9pbihyZXZfcGFyc2Vf
YXJncyksIHN0ZG91dD1zdWJwcm9jZXNzLlBJUEUsIHNoZWxsPVRydWUpCisgICAgICAgIHJldmlz
aW9ucyA9IHJldl9wYXJzZV9wcm9jZXNzLmNvbW11bmljYXRlKClbMF0uc3BsaXRsaW5lcygpCisg
ICAgICAgIAorICAgICAgICBpZiBjaGVycnlfcGljazoKKyAgICAgICAgICAgIHJldHVybiByZXZp
c2lvbnMKKyAgICAgICAgCisgICAgICAgICMgSWYgbm90IGNoZXJyeS1waWNraW5nIGFuZCBvbmx5
IHBhc3NlZCBvbmUgcmV2aXNpb24sIGFzc3VtZSAiXnJldmlzaW9uIGhlYWQiIGFrYSAicmV2aXNp
b24uLmhlYWQiCisgICAgICAgIGlmIGxlbihyZXZpc2lvbnMpIDwgMjoKKyAgICAgICAgICAgIHJl
dmlzaW9uc1swXSA9ICJeIiArIHJldmlzaW9uc1swXQorICAgICAgICAgICAgcmV2aXNpb25zLmFw
cGVuZCgiaGVhZCIpCisgICAgICAgIAorICAgICAgICByZXZfbGlzdF9hcmdzID0gWydnaXQnLCAn
cmV2LWxpc3QnXQorICAgICAgICByZXZfbGlzdF9hcmdzLmV4dGVuZChyZXZpc2lvbnMpCisgICAg
ICAgIHJldl9saXN0X3Byb2Nlc3MgPSBzdWJwcm9jZXNzLlBvcGVuKCIgIi5qb2luKHJldl9saXN0
X2FyZ3MpLCBzdGRvdXQ9c3VicHJvY2Vzcy5QSVBFLCBzaGVsbD1UcnVlKQorICAgICAgICByZXR1
cm4gcmV2X2xpc3RfcHJvY2Vzcy5jb21tdW5pY2F0ZSgpWzBdLnNwbGl0bGluZXMoKQorCisgICAg
ZGVmIGNvbW1pdF9tZXNzYWdlX2Zvcl9jb21taXQoc2VsZiwgY29tbWl0X2lkKToKKyAgICAgICAg
Y29tbWl0X21lc3NhZ2VfcHJvY2VzcyA9IHN1YnByb2Nlc3MuUG9wZW4oImdpdCBjYXQtZmlsZSBj
b21taXQgIiArIGNvbW1pdF9pZCwgc3Rkb3V0PXN1YnByb2Nlc3MuUElQRSwgc2hlbGw9VHJ1ZSkK
KyAgICAgICAgY29tbWl0X21lc3NhZ2UgPSBjb21taXRfbWVzc2FnZV9wcm9jZXNzLmNvbW11bmlj
YXRlKClbMF0KKyAgICAgICAgY29tbWl0X2xpbmVzID0gY29tbWl0X21lc3NhZ2Uuc3BsaXRsaW5l
cygpCisKKyAgICAgICAgIyBza2lwIHRoZSBoZWFkZXJzCisgICAgICAgIGZpcnN0X2xpbmVfYWZ0
ZXJfaGVhZGVycyA9IDAKKyAgICAgICAgZm9yIGxpbmUgaW4gY29tbWl0X2xpbmVzOgorICAgICAg
ICAgICAgZmlyc3RfbGluZV9hZnRlcl9oZWFkZXJzICs9IDEKKyAgICAgICAgICAgIGlmIGxpbmUg
PT0gIiI6CisgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgcmV0dXJuICJcbiIuam9pbihj
b21taXRfbGluZXNbZmlyc3RfbGluZV9hZnRlcl9oZWFkZXJzOl0pCisKKyAgICBkZWYgc2hvd19k
aWZmX2NvbW1hbmRfZm9yX2NvbW1pdChzZWxmLCBjb21taXRfaWQpOgorICAgICAgICByZXR1cm4g
ImdpdCBkaWZmLXRyZWUgLXAgIiArIGNvbW1pdF9pZAorCisgICAgZGVmIGZpbGVzX2NoYW5nZWRf
c3VtbWFyeV9mb3JfY29tbWl0KHNlbGYsIGNvbW1pdF9pZCk6CisgICAgICAgIHJldHVybiBzdWJw
cm9jZXNzLlBvcGVuKCJnaXQgZGlmZi10cmVlIC0tc2hvcnRzdGF0IC0tbm8tY29tbWl0LWlkICIg
KyBjb21taXRfaWQsIHN0ZG91dD1zdWJwcm9jZXNzLlBJUEUsIHNoZWxsPVRydWUpLmNvbW11bmlj
YXRlKClbMF0KKwo=
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>31575</attachid>
            <date>2009-06-19 16:45:02 -0700</date>
            <delta_ts>2009-06-22 17:58:35 -0700</delta_ts>
            <desc>Updated patch, split into modules, now supports --force-clean</desc>
            <filename>bugzilla_requires_a_filename.patch</filename>
            <type>text/plain</type>
            <size>44001</size>
            <attacher name="Eric Seidel (no email)">eric</attacher>
            
              <data encoding="base64">OTFkNDgzYTVlOWY0YjMzZGI0ZTkzMWU2Zjk5ZjMxYmI4NjA2Njg0NApkaWZmIC0tZ2l0IGEvV2Vi
S2l0VG9vbHMvQ2hhbmdlTG9nIGIvV2ViS2l0VG9vbHMvQ2hhbmdlTG9nCmluZGV4IDE0OTM3YTYu
LjU4ODViYzAgMTAwNjQ0Ci0tLSBhL1dlYktpdFRvb2xzL0NoYW5nZUxvZworKysgYi9XZWJLaXRU
b29scy9DaGFuZ2VMb2cKQEAgLTEsMyArMSw1OCBAQAorMjAwOS0wNi0xOCAgRXJpYyBTZWlkZWwg
IDxlcmljQHdlYmtpdC5vcmc+CisKKyAgICAgICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChPT1BTISku
CisKKyAgICAgICAgV2ViS2l0IG5lZWRzIGEgc2NyaXB0IHRvIGludGVyYWN0IHdpdGggYnVnemls
bGEgYW5kIGF1dG9tYXRlCisgICAgICAgIHBhcnRzIG9mIHRoZSBwYXRjaCBwb3N0aW5nIGFuZCBj
b21taXQgcHJvY2Vzc2VzLgorICAgICAgICBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1
Zy5jZ2k/aWQ9MjYyODMKKworICAgICAgICBUaGlzIGlzIHJlYWxseSBhIGZpcnN0LWRyYWZ0IHRv
b2wuCisgICAgICAgIEl0J3MgdG8gdGhlIHBvaW50IHdoZXJlIGl0J3MgdXNlZnVsIHRvIG1vcmUg
cGVvcGxlIHRoYW4ganVzdCBtZSBub3cgdGhvdWdoLgorICAgICAgICBHaXQgc3VwcG9ydCB3b3Jr
cy4gIFNWTiBzdXBwb3J0IGlzIHdyaXR0ZW4sIGJ1dCB1bnRlc3RlZC4KKworICAgICAgICBUaGlz
IHRvb2wgcmVxdWlyZXMgQmVhdXRpZnVsU291cCBhbmQgbWVjaGFuaXplIHB5dGhvbiBtb2R1bGVz
IHRvIHJ1bjoKKyAgICAgICAgc3VkbyBlYXN5X2luc3RhbGwgQmVhdXRpZnVsU291cAorICAgICAg
ICBzdWRvIGVhc3lfaW5zdGFsbCBtZWNoYW5pemUKKworICAgICAgICBNb3JlIGltcG9ydGFudCB0
aGFuIHRoZSB0b29sIGl0c2VsZiBhcmUgdGhlIEJ1Z3ppbGxhLCBHaXQgYW5kIFNWTiBjbGFzcyBh
YnN0cmFjdGlvbnMKKyAgICAgICAgd2hpY2ggSSBob3BlIHdpbGwgYWxsb3cgZWFzeSB3cml0aW5n
IG9mIGZ1dHVyZSB0b29scy4KKworICAgICAgICBJIGludGVuZCB0byBicmVhayBHaXQsIFNWTiBh
bmQgU0NNIG91dCBpbnRvIGFuIHNjbXRvb2xzLnB5IG1vZHVsZSBhZnRlciBsYW5kaW5nLgorICAg
ICAgICBMaWtld2lzZSwgQnVnemlsbGEgaW50byBhIGJ1Z3ppbGxhLnB5IG1vZHVsZS4gIEkgZmVs
dCBpdCB3b3VsZCBiZSBlYXNpZXIgdG8gcmV2aWV3IGluIG9uZSBmaWxlLgorCisgICAgICAgIFRo
ZSB0b29sIGN1cnJlbnRseSBpbXBsZW1lbnRzIDEwIGNvbW1hbmRzLCBkZXNjcmliZWQgYmVsb3cu
CisKKyAgICAgICAgSGVscGVycyBmb3Igc2NyaXB0aW5nIGRlYWxpbmcgd2l0aCB0aGUgY29tbWl0
IHF1ZXVlOgorICAgICAgICBidWdzLXRvLWNvbW1pdCAgICAgICAgICAgICAgICAgQnVncyBpbiB0
aGUgY29tbWl0IHF1ZXVlCisgICAgICAgIHBhdGNoZXMtdG8tY29tbWl0ICAgICAgICAgICAgICBQ
YXRjaGVzIGF0dGFjaGVkIHRvIGJ1Z3MgaW4gdGhlIGNvbW1pdCBxdWV1ZQorCisgICAgICAgIERl
YWxpbmcgd2l0aCBidWd6aWxsYToKKyAgICAgICAgcmV2aWV3ZWQtcGF0Y2hlcyBCVUdJRCAgICAg
ICAgIHIrJ2QgcGF0Y2hlcyBvbiBhIGJ1ZworICAgICAgICBhcHBseS1wYXRjaGVzIEJVR0lEICAg
ICAgICAgICAgQXBwbGllcyBhbGwgcGF0Y2hlcyBvbiBhIGJ1ZyB0byB0aGUgbG9jYWwgd29ya2lu
ZyBkaXJlY3Rvcnkgd2l0aG91dCBjb21taXR0aW5nLgorICAgICAgICBsYW5kLWFuZC11cGRhdGUg
QlVHSUQgICAgICAgICAgTGFuZHMgdGhlIGN1cnJlbnQgd29ya2luZyBkaXJlY3RvcnkgZGlmZiBh
bmQgdXBkYXRlcyB0aGUgYnVnLgorICAgICAgICBsYW5kLXBhdGNoZXMgW29wdGlvbnNdIEJVR0lE
ICAgTGFuZHMgYWxsIHBhdGNoZXMgb24gYSBidWcgb3B0aW9uYWxseSB0ZXN0aW5nIHRoZW0gZmly
c3QKKyAgICAgICAgb2Jzb2xldGUtYXR0YWNobWVudHMgQlVHSUQgICAgIE1hcmtzIGFsbCBhdHRh
Y2htZW50cyBvbiBhIGJ1ZyBhcyBvYnNvbGV0ZS4KKyAgICAgICAgY29tbWl0LW1lc3NhZ2UgICAg
ICAgICAgICAgICAgIFByaW50cyBhIGNvbW1pdCBtZXNzYWdlIHN1aXRhYmxlIGZvciB0aGUgdW5j
b21taXR0ZWQgY2hhbmdlcy4KKworICAgICAgICBUaGVzZSBlZmZlY3RpdmVseSByZXBsYWNlIGdp
dC1zZW5kLWJ1Z3ppbGxhOgorICAgICAgICBwb3N0LWRpZmYgQlVHSUQgICAgICAgICAgICAgICAg
QXR0YWNoZXMgdGhlIGN1cnJlbnQgd29ya2luZyBkaXJlY3RvcnkgZGlmZiB0byBhIGJ1ZyBhcyBh
IHBhdGNoIGZpbGUuCisgICAgICAgIHBvc3QtY29tbWl0cyBCVUdJRCBDT01NSVRJU0ggICBBdHRh
Y2hlcyBhIHJhbmdlIG9mIGxvY2FsIGNvbW1pdHMgdG8gYSBidWcgYXMgcGF0Y2ggZmlsZXMuCisK
KyAgICAgICAgcG9zdC1kaWZmIHdvcmtzIGZvciBTVk4gYW5kIEdpdCwgcG9zdC1jb21taXRzIG9u
bHkgd29ya3MgZm9yIFNDTXMgd2l0aCBsb2NhbC1jb21taXQgc3VwcG9ydCAobGlrZSBHaXQpCisK
KyAgICAgICAgbGFuZC0qIGNvbW1hbmRzIGluIGEgR2l0IGVudmlyb25tZW50IG9ubHkgd29yayB3
aXRoIHNpbXBsZSBwYXRjaGVzIGR1ZSB0byBzdm4tYXBwbHkgYnVnczoKKyAgICAgICAgaHR0cHM6
Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTI2Mjk5CisgICAgICAgIGh0dHBzOi8v
YnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0yNjMwMAorCisgICAgICAgIFRoaXMgc2Ny
aXB0IGZvbGxvd3MgcHl0aG9uIHN0eWxlIChzaW1pbGFyIHRvIGhvdyBmb3IgT2JqLUMgd2UgZm9s
bG93IEFwcEtpdCBzdHlsZSkKKyAgICAgICAgaHR0cDovL3d3dy5weXRob24ub3JnL2RvYy9lc3Nh
eXMvc3R5bGVndWlkZS5odG1sCisgICAgICAgIFRoZSBQeXRob24gY29tbXVuaXR5IGhhcyBhIHN0
cm9uZyBzdHlsZSBjdWx0dXJlIGFuZCB0aGUgV2ViS2l0IHN0eWxlIGd1aWRlIGlzIHNpbGVudCBy
ZTogUHl0aG9uLgorCisgICAgICAgIEkndmUgZmlsZWQgYSBidWcgdG8gdXBkYXRlIHRoZSBXZWJL
aXQgc3R5bGUgZ3VpZGUgdG8gbWVudGlvbiBweXRob246CisgICAgICAgIGh0dHBzOi8vYnVncy53
ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0yNjUyNAorCisgICAgICAgICogU2NyaXB0cy9idWd6
aWxsYS10b29sOiBBZGRlZC4KKwogMjAwOS0wNi0xNSAgQW5kcmUgUGVkcmFsaG8gIDxhbmRyZS5w
ZWRyYWxob0BvcGVuYm9zc2Eub3JnPgogCiAgICAgICAgIFJldmlld2VkIGJ5IFRvciBBcm5lIFZl
c3Riw7guCmRpZmYgLS1naXQgYS9XZWJLaXRUb29scy9TY3JpcHRzL2J1Z3ppbGxhLXRvb2wgYi9X
ZWJLaXRUb29scy9TY3JpcHRzL2J1Z3ppbGxhLXRvb2wKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5k
ZXggMDAwMDAwMC4uZjI4ZmEwYQotLS0gL2Rldi9udWxsCisrKyBiL1dlYktpdFRvb2xzL1Njcmlw
dHMvYnVnemlsbGEtdG9vbApAQCAtMCwwICsxLDQ0NiBAQAorIyEvdXNyL2Jpbi9weXRob24KKwor
IyBDb3B5cmlnaHQgKEMpIDIwMDkgR29vZ2xlLCBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgor
IworIyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3
aXRoIG9yIHdpdGhvdXQKKyMgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRo
YXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisjIGFyZSBtZXQ6CisjIDEuIFJlZGlzdHJpYnV0
aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisjICAg
IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xh
aW1lci4KKyMgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNl
IHRoZSBhYm92ZSBjb3B5cmlnaHQKKyMgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9u
cyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorIyAgICBkb2N1bWVudGF0aW9u
IGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgor
IworIyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIENPTVBVVEVSLCBJTkMuIGBg
QVMgSVMnJyBBTkQgQU5ZCisjIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJ
TkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisjIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJD
SEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorIyBQVVJQT1NFIEFSRSBE
SVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgQ09NUFVURVIsIElOQy4gT1IKKyMg
Q09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5U
QUwsIFNQRUNJQUwsCisjIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNM
VURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyMgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBH
T09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisjIFBST0ZJVFM7IE9SIEJV
U0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyMg
T0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBU
T1JUCisjIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5Z
IFdBWSBPVVQgT0YgVEhFIFVTRQorIyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQg
T0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorIworIyBBIHRvb2wgZm9yIGF1dG9t
YXRpbmcgZGVhbGluZyB3aXRoIGJ1Z3ppbGxhLCBwb3N0aW5nIHBhdGNoZXMsIGNvbW1pdGluZyBw
YXRjaGVzLCBldGMuCisKK2ltcG9ydCBzeXMKK2ltcG9ydCByZQoraW1wb3J0IG9zCitpbXBvcnQg
c3VicHJvY2VzcworCitmcm9tIG9wdHBhcnNlIGltcG9ydCBPcHRpb25QYXJzZXIsIEluZGVudGVk
SGVscEZvcm1hdHRlciwgU1VQUFJFU1NfVVNBR0UsIG1ha2Vfb3B0aW9uCisKK3N5cy5wYXRoLmFw
cGVuZCgibW9kdWxlcyIpICMgSW1wb3J0IFdlYktpdC1zcGVjaWZpYyBtb2R1bGVzCitmcm9tIGJ1
Z3ppbGxhIGltcG9ydCBCdWd6aWxsYQorZnJvbSBzY20gaW1wb3J0IGRldGVjdF9zY21fc3lzdGVt
LCBTY3JpcHRFcnJvcgorCitkZWYgY2hkaXJfd2Via2l0KCk6CisgICAgIyBXZSBjb3VsZCBpbnN0
ZWFkIGFzayB0aGUgU0NNIHN5c3RlbSBmb3IgaXRzIHJvb3QgZGlyZWN0b3J5IChzaW5jZSB3ZSBu
ZWVkIHRoYXQgZm9yIG1ha2luZyBwYXRjaGVzIGFzIHdlbGwpCisgICAgc2NyaXB0X2RpcmVjdG9y
eSA9IG9zLnBhdGguYWJzcGF0aChzeXMucGF0aFswXSkKKyAgICB3ZWJraXRfZGlyZWN0b3J5ID0g
b3MucGF0aC5hYnNwYXRoKG9zLnBhdGguam9pbihzY3JpcHRfZGlyZWN0b3J5LCAiLi4vLi4iKSkK
KyAgICBwcmludCB3ZWJraXRfZGlyZWN0b3J5CisgICAgb3MuY2hkaXIod2Via2l0X2RpcmVjdG9y
eSkKKworCitkZWYgbG9nKHN0cmluZyk6CisgICAgcHJpbnQgPj4gc3lzLnN0ZGVyciwgc3RyaW5n
CisKK2RlZiBlcnJvcihzdHJpbmcpOgorICAgIGxvZyhzdHJpbmcpCisgICAgZXhpdCgxKQorCisK
KyMgVGhlc2UgY291bGQgYmUgcHV0IGluIHNvbWUgc29ydCBvZiBjaGFuZ2Vsb2dzLnB5CitkZWYg
bGF0ZXN0X2NoYW5nZWxvZ19lbnRyeShjaGFuZ2Vsb2dfcGF0aCk6CisgICAgZW50cnlfbGluZXMg
PSBbXQorICAgIGNoYW5nZWxvZyA9IG9wZW4oY2hhbmdlbG9nX3BhdGgpCisgICAgdHJ5OgorICAg
ICAgICBsb2coIlBhcnNpbmcgQ2hhbmdlTG9nOiAiICsgY2hhbmdlbG9nX3BhdGgpCisgICAgICAg
ICMgVGhlIGZpcnN0IGxpbmUgc2hvdWxkIGJlIGEgZGF0ZSBsaW5lCisgICAgICAgIGVudHJ5X2xp
bmVzLmFwcGVuZChjaGFuZ2Vsb2cucmVhZGxpbmUoKSkKKyAgICAgICAgCisgICAgICAgICMgZS5n
LiAyMDA5LTA2LTAzICBFcmljIFNlaWRlbCAgPGVyaWNAd2Via2l0Lm9yZz4KKyAgICAgICAgY2hh
bmdlbG9nX2RhdGVfbGluZV9yZWdleHAgPSAnXihbXGRcLV0rKSAgKC4rKSAgPCguKyk+JCcKKyAg
ICAgICAgCisgICAgICAgIGZvciBsaW5lIGluIGNoYW5nZWxvZzoKKyAgICAgICAgICAgICMgaWYg
d2UndmUgaGl0IHRoZSBuZXh0IGVudHJ5LCByZXR1cm4KKyAgICAgICAgICAgIGlmIHJlLm1hdGNo
KGNoYW5nZWxvZ19kYXRlX2xpbmVfcmVnZXhwLCBsaW5lKToKKyAgICAgICAgICAgICAgICByZXR1
cm4gJycuam9pbihlbnRyeV9saW5lcykKKyAgICAgICAgICAgIGVudHJ5X2xpbmVzLmFwcGVuZChs
aW5lKQorICAgIGZpbmFsbHk6CisgICAgICAgICAgICBjaGFuZ2Vsb2cuY2xvc2UoKQorICAgICMg
V2UgbmV2ZXIgZm91bmQgYSBkYXRlIGxpbmUhCisgICAgcmV0dXJuIE5vbmUKKworZGVmIG1vZGlm
aWVkX2NoYW5nZWxvZ3Moc2NtKToKKyAgICBjaGFuZ2Vsb2dfcGF0aHMgPSBbXQorICAgIHBhdGhz
ID0gc2NtLmNoYW5nZWRfZmlsZXMoKQorICAgIGZvciBwYXRoIGluIHBhdGhzOgorICAgICAgICBp
ZiByZS5zZWFyY2goJ0NoYW5nZUxvZycsIHBhdGgpOgorICAgICAgICAgICAgY2hhbmdlbG9nX3Bh
dGhzLmFwcGVuZChwYXRoKQorICAgIHJldHVybiBjaGFuZ2Vsb2dfcGF0aHMKKworZGVmIGNvbW1p
dF9tZXNzYWdlX2Zvcl90aGlzX2NvbW1pdChzY20pOgorICAgIGNoYW5nZWxvZ19wYXRocyA9IG1v
ZGlmaWVkX2NoYW5nZWxvZ3Moc2NtKQorICAgIGlmIGxlbihjaGFuZ2Vsb2dfcGF0aHMpID09IDA6
CisgICAgICAgIGVycm9yKCJGb3VuZCBubyBtb2RpZmllZCBDaGFuZ2VMb2dzLCBjYW4ndCBjcmVh
dGUgYSBjb21taXQgbWVzc2FnZS4iKQorCisgICAgY2hhbmdlbG9nX21lc3NhZ2VzID0gW10KKyAg
ICBmb3IgcGF0aCBpbiBjaGFuZ2Vsb2dfcGF0aHM6CisgICAgICAgIGNoYW5nZWxvZ19lbnRyeSA9
IGxhdGVzdF9jaGFuZ2Vsb2dfZW50cnkocGF0aCkKKyAgICAgICAgaWYgbm90IGNoYW5nZWxvZ19l
bnRyeToKKyAgICAgICAgICAgIGVycm9yKCJGYWlsZWQgdG8gcGFyc2UgQ2hhbmdlTG9nOiAiICsg
b3MucGF0aC5hYnNwYXRoKHBhdGgpKQorICAgICAgICBjaGFuZ2Vsb2dfbWVzc2FnZXMuYXBwZW5k
KGNoYW5nZWxvZ19lbnRyeSkKKyAgICByZXR1cm4gJycuam9pbihjaGFuZ2Vsb2dfbWVzc2FnZXMp
CisKKworY2xhc3MgQ29tbWFuZDoKKyAgICBkZWYgX19pbml0X18oc2VsZiwgaGVscF90ZXh0LCBh
cmd1bWVudF9uYW1lcz0iIiwgb3B0aW9ucyA9IFtdKToKKyAgICAgICAgc2VsZi5oZWxwX3RleHQg
PSBoZWxwX3RleHQKKyAgICAgICAgc2VsZi5hcmd1bWVudF9uYW1lcyA9IGFyZ3VtZW50X25hbWVz
CisgICAgICAgIHNlbGYub3B0aW9ucyA9IG9wdGlvbnMKKyAgICAgICAgc2VsZi5vcHRpb25fcGFy
c2VyID0gT3B0aW9uUGFyc2VyKHVzYWdlPVNVUFBSRVNTX1VTQUdFLCBhZGRfaGVscF9vcHRpb249
RmFsc2UsIG9wdGlvbl9saXN0PXNlbGYub3B0aW9ucykKKyAgICAKKyAgICBkZWYgbmFtZV93aXRo
X2FyZ3VtZW50cyhzZWxmLCBjb21tYW5kX25hbWUpOgorICAgICAgICB1c2FnZV9zdHJpbmcgPSBj
b21tYW5kX25hbWUKKyAgICAgICAgaWYgKGxlbihzZWxmLm9wdGlvbnMpID4gMCk6CisgICAgICAg
ICAgICB1c2FnZV9zdHJpbmcgKz0gIiBbb3B0aW9uc10iCisgICAgICAgIGlmIChzZWxmLmFyZ3Vt
ZW50X25hbWVzICE9ICIiKToKKyAgICAgICAgICAgIHVzYWdlX3N0cmluZyArPSAiICIgKyBzZWxm
LmFyZ3VtZW50X25hbWVzCisgICAgICAgIHJldHVybiB1c2FnZV9zdHJpbmcKKworICAgIGRlZiBw
YXJzZV9hcmdzKHNlbGYsIGFyZ3MpOgorICAgICAgICByZXR1cm4gc2VsZi5vcHRpb25fcGFyc2Vy
LnBhcnNlX2FyZ3MoYXJncykKKworICAgIGRlZiBleGVjdXRlKHNlbGYsIG9wdGlvbnMsIGFyZ3Ms
IHRvb2wpOgorICAgICAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yLCAic3ViY2xhc3NlcyBt
dXN0IGltcGxlbWVudCIKKworCitjbGFzcyBCdWdzSW5Db21taXRRdWV1ZSAoQ29tbWFuZCk6Cisg
ICAgZGVmIF9faW5pdF9fKHNlbGYpOgorICAgICAgICBDb21tYW5kLl9faW5pdF9fKHNlbGYsICdC
dWdzIGluIHRoZSBjb21taXQgcXVldWUnKQorCisgICAgZGVmIGV4ZWN1dGUoc2VsZiwgb3B0aW9u
cywgYXJncywgdG9vbCk6CisgICAgICAgIGJ1Z19pZHMgPSB0b29sLmJ1Z3MuZmV0Y2hfYnVnX2lk
c19mcm9tX2NvbW1pdF9xdWV1ZSgpCisgICAgICAgIGZvciBidWdfaWQgaW4gYnVnX2lkczoKKyAg
ICAgICAgICAgIHByaW50IHRvb2wuYnVncy5idWdfdXJsX2Zvcl9idWdfaWQoYnVnX2lkKQorCisK
K2NsYXNzIFBhdGNoZXNJbkNvbW1pdFF1ZXVlIChDb21tYW5kKToKKyAgICBkZWYgX19pbml0X18o
c2VsZik6CisgICAgICAgIENvbW1hbmQuX19pbml0X18oc2VsZiwgJ1BhdGNoZXMgYXR0YWNoZWQg
dG8gYnVncyBpbiB0aGUgY29tbWl0IHF1ZXVlJykKKworICAgIGRlZiBleGVjdXRlKHNlbGYsIG9w
dGlvbnMsIGFyZ3MsIHRvb2wpOgorICAgICAgICBwYXRjaGVzID0gdG9vbC5idWdzLmZldGNoX3Bh
dGNoZXNfZnJvbV9jb21taXRfcXVldWUoKQorICAgICAgICBsb2coIlBhdGNoZXMgaW4gY29tbWl0
IHF1ZXVlOiIpCisgICAgICAgIGZvciBwYXRjaCBpbiBwYXRjaGVzOgorICAgICAgICAgICAgcHJp
bnQgcGF0Y2hbJ3VybCddCisKKworY2xhc3MgUmV2aWV3ZWRQYXRjaGVzT25CdWcgKENvbW1hbmQp
OgorICAgIGRlZiBfX2luaXRfXyhzZWxmKToKKyAgICAgICAgQ29tbWFuZC5fX2luaXRfXyhzZWxm
LCAncitcJ2QgcGF0Y2hlcyBvbiBhIGJ1ZycsICdCVUdJRCcpCisKKyAgICBkZWYgZXhlY3V0ZShz
ZWxmLCBvcHRpb25zLCBhcmdzLCB0b29sKToKKyAgICAgICAgYnVnX2lkID0gYXJnc1swXQorICAg
ICAgICBwYXRjaGVzX3RvX2xhbmQgPSB0b29sLmJ1Z3MuZmV0Y2hfcmV2aWV3ZWRfcGF0Y2hlc19m
cm9tX2J1ZyhidWdfaWQpCisgICAgICAgIGZvciBwYXRjaCBpbiBwYXRjaGVzX3RvX2xhbmQ6Cisg
ICAgICAgICAgICBwcmludCBwYXRjaFsndXJsJ10KKworCitjbGFzcyBBcHBseVBhdGNoZXNGcm9t
QnVnIChDb21tYW5kKToKKyAgICBkZWYgX19pbml0X18oc2VsZik6CisgICAgICAgIG9wdGlvbnMg
PSBbCisgICAgICAgICAgICBtYWtlX29wdGlvbigiLS1uby11cGRhdGUiLCBhY3Rpb249InN0b3Jl
X2ZhbHNlIiwgZGVzdD0idXBkYXRlIiwgZGVmYXVsdD1UcnVlLCBoZWxwPSJEb24ndCB1cGRhdGUg
dGhlIHdvcmtpbmcgZGlyZWN0b3J5IGJlZm9yZSBhcHBseWluZyBwYXRjaGVzIiksCisgICAgICAg
ICAgICBtYWtlX29wdGlvbigiLS1mb3JjZS1jbGVhbiIsIGFjdGlvbj0ic3RvcmVfdHJ1ZSIsIGRl
c3Q9ImZvcmNlX2NsZWFuIiwgZGVmYXVsdD1GYWxzZSwgaGVscD0iQ2xlYW4gd29ya2luZyBkaXJl
Y3RvcnkgYmVmb3JlIGFwcGx5aW5nIHBhdGNoZXMgKHJlbW92ZXMgbG9jYWwgY2hhbmdlcyBhbmQg
Y29tbWl0cykiKSwKKyAgICAgICAgICAgIG1ha2Vfb3B0aW9uKCItLW5vLWNsZWFuIiwgYWN0aW9u
PSJzdG9yZV9mYWxzZSIsIGRlc3Q9ImNsZWFuIiwgZGVmYXVsdD1UcnVlLCBoZWxwPSJEb24ndCBj
aGVjayBpZiB0aGUgd29ya2luZyBkaXJlY3RvcnkgaXMgY2xlYW4gYmVmb3JlIGFwcGx5aW5nIHBh
dGNoZXMiKSwKKyAgICAgICAgXQorICAgICAgICBDb21tYW5kLl9faW5pdF9fKHNlbGYsICdBcHBs
aWVzIGFsbCBwYXRjaGVzIG9uIGEgYnVnIHRvIHRoZSBsb2NhbCB3b3JraW5nIGRpcmVjdG9yeSB3
aXRob3V0IGNvbW1pdHRpbmcuJywgJ0JVR0lEJywgb3B0aW9ucz1vcHRpb25zKQorCisgICAgZGVm
IGV4ZWN1dGUoc2VsZiwgb3B0aW9ucywgYXJncywgdG9vbCk6CisgICAgICAgIGJ1Z19pZCA9IGFy
Z3NbMF0KKyAgICAgICAgcGF0Y2hlcyA9IHRvb2wuYnVncy5mZXRjaF9yZXZpZXdlZF9wYXRjaGVz
X2Zyb21fYnVnKGJ1Z19pZCkKKyAgICAgICAgY2hkaXJfd2Via2l0KCkKKyAgICAgICAgaWYgb3B0
aW9ucy5jbGVhbjoKKyAgICAgICAgICAgIHRvb2wuc2NtKCkuZW5zdXJlX2NsZWFuX3dvcmtpbmdf
ZGlyZWN0b3J5KG9wdGlvbnMuZm9yY2VfY2xlYW4sIGFsbG93X2xvY2FsX2NvbW1pdHMgPSBUcnVl
KQorICAgICAgICBpZiBvcHRpb25zLnVwZGF0ZToKKyAgICAgICAgICAgIHRvb2wuc2NtKCkudXBk
YXRlX3dlYmtpdCgpCisgICAgICAgIAorICAgICAgICAjIFNob3VsZCB3ZSBlcnJvciBvdXQgaWYg
dG9vbC5zY20gZG9lcyBub3Qgc3VwcG9ydCBsb2NhbCBjb21taXRzPworICAgICAgICBmb3IgcGF0
Y2ggaW4gcGF0Y2hlczoKKyAgICAgICAgICAgIHRvb2wuc2NtKCkuYXBwbHlfcGF0Y2gocGF0Y2gp
CisKKworZGVmIGJ1Z19jb21tZW50X2Zyb21fY29tbWl0X3RleHQoY29tbWl0X3RleHQpOgorICAg
IGNvbW1lbnRfbGluZXMgPSBbXQorICAgIGNvbW1pdF9saW5lcyA9IGNvbW1pdF90ZXh0LnNwbGl0
bGluZXMoKQorICAgIGZvciBsaW5lIGluIGNvbW1pdF9saW5lczoKKyAgICAgICAgY29tbWVudF9s
aW5lcy5hcHBlbmQobGluZSkKKyAgICAgICAgbWF0Y2ggPSByZS5tYXRjaCgiXkNvbW1pdHRlZCBy
KFxkKykkIiwgbGluZSkKKyAgICAgICAgaWYgbWF0Y2g6CisgICAgICAgICAgICByZXZpc2lvbiA9
IG1hdGNoLmdyb3VwKDEpCisgICAgICAgICAgICBjb21tZW50X2xpbmVzLmFwcGVuZCgiaHR0cDov
L3RyYWMud2Via2l0Lm9yZy9jaGFuZ2VzZXQvIiArIHJldmlzaW9uKQorICAgICAgICAgICAgYnJl
YWsKKyAgICByZXR1cm4gIlxuIi5qb2luKGNvbW1lbnRfbGluZXMpCisKKworY2xhc3MgTGFuZEFu
ZFVwZGF0ZUJ1ZyAoQ29tbWFuZCk6CisgICAgZGVmIF9faW5pdF9fKHNlbGYpOgorICAgICAgICBD
b21tYW5kLl9faW5pdF9fKHNlbGYsICdMYW5kcyB0aGUgY3VycmVudCB3b3JraW5nIGRpcmVjdG9y
eSBkaWZmIGFuZCB1cGRhdGVzIHRoZSBidWcuJywgJ0JVR0lEJykKKworICAgIGRlZiBleGVjdXRl
KHNlbGYsIG9wdGlvbnMsIGFyZ3MsIHRvb2wpOgorICAgICAgICBidWdfaWQgPSBhcmdzWzBdCisg
ICAgICAgIGNvbW1pdF9tZXNzYWdlID0gY29tbWl0X21lc3NhZ2VfZm9yX3RoaXNfY29tbWl0KHRv
b2wuc2NtKCkpCisgICAgICAgIGNvbW1pdF9sb2cgPSB0b29sLnNjbSgpLmNvbW1pdF93aXRoX21l
c3NhZ2UoY29tbWl0X21lc3NhZ2UpCisgICAgICAgIGNvbW1lbnRfdGV4dCA9IGJ1Z19jb21tZW50
X2Zyb21fY29tbWl0X3RleHQoY29tbWl0X2xvZykKKyAgICAgICAgdG9vbC5idWdzLmNsb3NlX2J1
Z19hc19maXhlZChidWdfaWQsIGNvbW1lbnRfdGV4dCkKKworCitjbGFzcyBMYW5kUGF0Y2hlc0Zy
b21CdWcgKENvbW1hbmQpOgorICAgIGRlZiBfX2luaXRfXyhzZWxmKToKKyAgICAgICAgb3B0aW9u
cyA9IFsKKyAgICAgICAgICAgIG1ha2Vfb3B0aW9uKCItLW5vLXVwZGF0ZSIsIGFjdGlvbj0ic3Rv
cmVfZmFsc2UiLCBkZXN0PSJ1cGRhdGUiLCBkZWZhdWx0PVRydWUsIGhlbHA9IkRvbid0IHVwZGF0
ZSB0aGUgd29ya2luZyBkaXJlY3RvcnkgYmVmb3JlIGFwcGx5aW5nIHBhdGNoZXMiKSwKKyAgICAg
ICAgICAgIG1ha2Vfb3B0aW9uKCItLWZvcmNlLWNsZWFuIiwgYWN0aW9uPSJzdG9yZV90cnVlIiwg
ZGVzdD0iZm9yY2VfY2xlYW4iLCBkZWZhdWx0PUZhbHNlLCBoZWxwPSJDbGVhbiB3b3JraW5nIGRp
cmVjdG9yeSBiZWZvcmUgYXBwbHlpbmcgcGF0Y2hlcyAocmVtb3ZlcyBsb2NhbCBjaGFuZ2VzIGFu
ZCBjb21taXRzKSIpLAorICAgICAgICAgICAgbWFrZV9vcHRpb24oIi0tbm8tY2xlYW4iLCBhY3Rp
b249InN0b3JlX2ZhbHNlIiwgZGVzdD0iY2xlYW4iLCBkZWZhdWx0PVRydWUsIGhlbHA9IkRvbid0
IGNoZWNrIGlmIHRoZSB3b3JraW5nIGRpcmVjdG9yeSBpcyBjbGVhbiBiZWZvcmUgYXBwbHlpbmcg
cGF0Y2hlcyIpLAorICAgICAgICAgICAgbWFrZV9vcHRpb24oIi0tbm8tYnVpbGQiLCBhY3Rpb249
InN0b3JlX2ZhbHNlIiwgZGVzdD0iYnVpbGQiLCBkZWZhdWx0PVRydWUsIGhlbHA9IkNvbW1pdCB3
aXRob3V0IGJ1aWxkaW5nIGZpcnN0LCBpbXBsaWVzIC0tbm8tdGVzdC4iKSwKKyAgICAgICAgICAg
IG1ha2Vfb3B0aW9uKCItLW5vLXRlc3QiLCBhY3Rpb249InN0b3JlX2ZhbHNlIiwgZGVzdD0idGVz
dCIsIGRlZmF1bHQ9VHJ1ZSwgaGVscD0iQ29tbWl0IHdpdGhvdXQgcnVubm5pbmcgcnVuLXdlYmtp
dC10ZXN0cy4iKSwKKyAgICAgICAgXQorICAgICAgICBDb21tYW5kLl9faW5pdF9fKHNlbGYsICdM
YW5kcyBhbGwgcGF0Y2hlcyBvbiBhIGJ1ZyBvcHRpb25hbGx5IHRlc3RpbmcgdGhlbSBmaXJzdCcs
ICdCVUdJRCcsIG9wdGlvbnM9b3B0aW9ucykKKworICAgIGRlZiBydW5fYW5kX3Rocm93X2lmX2Zh
aWwoc2VsZiwgc2NyaXB0X25hbWUpOgorICAgICAgICBidWlsZF93ZWJraXRfcHJvY2VzcyA9IHN1
YnByb2Nlc3MuUG9wZW4oc2NyaXB0X25hbWUsIHNoZWxsPVRydWUpCisgICAgICAgIHJldHVybl9j
b2RlID0gYnVpbGRfd2Via2l0X3Byb2Nlc3Mud2FpdCgpCisgICAgICAgIGlmIHJldHVybl9jb2Rl
ICE9IDA6CisgICAgICAgICAgICByYWlzZSBTY3JpcHRFcnJvcihzY3JpcHRfbmFtZSArICIgZmFp
bGVkIHdpdGggY29kZSAiICsgcmV0dXJuX2NvZGUpCisKKyAgICBkZWYgYnVpbGRfd2Via2l0KHNl
bGYpOgorICAgICAgICBzZWxmLnJ1bl9hbmRfdGhyb3dfaWZfZmFpbCgiYnVpbGQtd2Via2l0IikK
KworICAgIGRlZiBydW5fd2Via2l0X3Rlc3RzKHNlbGYpOgorICAgICAgICBzZWxmLnJ1bl9hbmRf
dGhyb3dfaWZfZmFpbCgicnVuLXdlYmtpdC10ZXN0cyIpCisKKyAgICBkZWYgZXhlY3V0ZShzZWxm
LCBvcHRpb25zLCBhcmdzLCB0b29sKToKKyAgICAgICAgYnVnX2lkID0gYXJnc1swXQorCisgICAg
ICAgIHRyeToKKyAgICAgICAgICAgIHBhdGNoZXMgPSB0b29sLmJ1Z3MuZmV0Y2hfcmV2aWV3ZWRf
cGF0Y2hlc19mcm9tX2J1ZyhidWdfaWQpCisgICAgICAgICAgICBjb21taXRfdGV4dCA9ICIiCisK
KyAgICAgICAgICAgIGNoZGlyX3dlYmtpdCgpCisgICAgICAgICAgICB0b29sLnNjbSgpLmVuc3Vy
ZV9ub19sb2NhbF9jb21taXRzKG9wdGlvbnMuZm9yY2VfY2xlYW4pCisgICAgICAgICAgICBpZiBv
cHRpb25zLmNsZWFuOgorICAgICAgICAgICAgICAgIHRvb2wuc2NtKCkuZW5zdXJlX2NsZWFuX3dv
cmtpbmdfZGlyZWN0b3J5KG9wdGlvbnMuZm9yY2VfY2xlYW4pCisgICAgICAgICAgICBpZiBvcHRp
b25zLnVwZGF0ZToKKyAgICAgICAgICAgICAgICB0b29sLnNjbSgpLnVwZGF0ZV93ZWJraXQoKQor
ICAgICAgICAgICAgCisgICAgICAgICAgICBmb3IgcGF0Y2ggaW4gcGF0Y2hlczoKKyAgICAgICAg
ICAgICAgICB0b29sLnNjbSgpLmFwcGx5X3BhdGNoKHBhdGNoKQorICAgICAgICAgICAgICAgIGlm
IG9wdGlvbnMuYnVpbGQ6CisgICAgICAgICAgICAgICAgICAgIHNlbGYuYnVpbGRfd2Via2l0KCkK
KyAgICAgICAgICAgICAgICAgICAgaWYgb3B0aW9ucy50ZXN0OgorICAgICAgICAgICAgICAgICAg
ICAgICAgc2VsZi5ydW5fd2Via2l0X3Rlc3RzKCkKKyAgICAgICAgICAgICAgICBjb21taXRfbWVz
c2FnZSA9IGNvbW1pdF9tZXNzYWdlX2Zvcl90aGlzX2NvbW1pdCh0b29sLnNjbSgpKQorICAgICAg
ICAgICAgICAgIGNvbW1pdF9sb2cgPSB0b29sLnNjbSgpLmNvbW1pdF93aXRoX21lc3NhZ2UoY29t
bWl0X21lc3NhZ2UpCisgICAgICAgICAgICAgICAgY29tbWVudF90ZXh0ID0gYnVnX2NvbW1lbnRf
ZnJvbV9jb21taXRfdGV4dChjb21taXRfbG9nKQorICAgICAgICAgICAgICAgICMgaWYgd2UncmUg
Y29tbWl0aW5nIG1vcmUgdGhhbiBvbmUgcGF0Y2gsIHVwZGF0ZSB0aGUgYnVnIGFzIHdlIGdvCisg
ICAgICAgICAgICAgICAgaWYgbGVuKHBhdGNoZXMpID4gMToKKyAgICAgICAgICAgICAgICAgICAg
dG9vbC5idWdzLm9ic29sZXRlX2F0dGFjaG1lbnQocGF0Y2hbJ2lkJ10sIGNvbW1lbnRfdGV4dCkK
KworICAgICAgICAgICAgaWYgbGVuKHBhdGNoZXMpID4gMToKKyAgICAgICAgICAgICAgICBjb21t
aXRfdGV4dCA9ICJBbGwgcmV2aWV3ZWQgcGF0Y2hlcyBsYW5kZWQsIGNsb3NpbmcuIgorCisgICAg
ICAgICAgICB0b29sLmJ1Z3MuY2xvc2VfYnVnX2FzX2ZpeGVkKGJ1Z19pZCwgY29tbWl0X3RleHQp
CisgICAgICAgIGV4Y2VwdCBTY3JpcHRFcnJvciwgZXJyb3I6CisgICAgICAgICAgICBsb2coZXJy
b3IpCisgICAgICAgICAgICAjIFdlIGNvdWxkIGFkZCBhIGNvbW1lbnQgdG8gdGhlIGJ1ZyBhYm91
dCB0aGUgZmFpbHVyZQorCisKK2NsYXNzIENvbW1pdE1lc3NhZ2VGb3JDdXJyZW50RGlmZiAoQ29t
bWFuZCk6CisgICAgZGVmIF9faW5pdF9fKHNlbGYpOgorICAgICAgICBDb21tYW5kLl9faW5pdF9f
KHNlbGYsICdQcmludHMgYSBjb21taXQgbWVzc2FnZSBzdWl0YWJsZSBmb3IgdGhlIHVuY29tbWl0
dGVkIGNoYW5nZXMuJykKKworICAgIGRlZiBleGVjdXRlKHNlbGYsIG9wdGlvbnMsIGFyZ3MsIHRv
b2wpOgorICAgICAgICBwcmludCBjb21taXRfbWVzc2FnZV9mb3JfdGhpc19jb21taXQodG9vbC5z
Y20oKSkKKworCitjbGFzcyBPYnNvbGV0ZUF0dGFjaG1lbnRzT25CdWcgKENvbW1hbmQpOgorICAg
IGRlZiBfX2luaXRfXyhzZWxmKToKKyAgICAgICAgQ29tbWFuZC5fX2luaXRfXyhzZWxmLCAnTWFy
a3MgYWxsIGF0dGFjaG1lbnRzIG9uIGEgYnVnIGFzIG9ic29sZXRlLicsICdCVUdJRCcpCisKKyAg
ICBkZWYgZXhlY3V0ZShzZWxmLCBvcHRpb25zLCBhcmdzLCB0b29sKToKKyAgICAgICAgYnVnX2lk
ID0gYXJnc1swXQorICAgICAgICBhdHRhY2htZW50cyA9IHRvb2wuYnVncy5mZXRjaF9hdHRhY2ht
ZW50c19mcm9tX2J1ZyhidWdfaWQpCisgICAgICAgIGZvciBhdHRhY2htZW50IGluIGF0dGFjaG1l
bnRzOgorICAgICAgICAgICAgaWYgbm90IGF0dGFjaG1lbnRbJ29ic29sZXRlJ106CisgICAgICAg
ICAgICAgICAgdG9vbC5idWdzLm9ic29sZXRlX2F0dGFjaG1lbnQoYXR0YWNobWVudFsnaWQnXSkK
KworCitjbGFzcyBQb3N0RGlmZkFzUGF0Y2hUb0J1ZyAoQ29tbWFuZCk6CisgICAgZGVmIF9faW5p
dF9fKHNlbGYpOgorICAgICAgICBDb21tYW5kLl9faW5pdF9fKHNlbGYsICdBdHRhY2hlcyB0aGUg
Y3VycmVudCB3b3JraW5nIGRpcmVjdG9yeSBkaWZmIHRvIGEgYnVnIGFzIGEgcGF0Y2ggZmlsZS4n
LCAnQlVHSUQnKQorCisgICAgZGVmIGV4ZWN1dGUoc2VsZiwgb3B0aW9ucywgYXJncywgdG9vbCk6
CisgICAgICAgIGJ1Z19pZCA9IGFyZ3NbMF0KKyAgICAgICAgZGVzY3JpcHRpb24gPSBhcmdzWzFd
CisgICAgICAgICMgTmVlZCBhcmcgcGFyc2luZyEKKyAgICAgICAgCisgICAgICAgIGRpZmZfcHJv
Y2VzcyA9IHN1YnByb2Nlc3MuUG9wZW4odG9vbC5zY20oKS5kaWZmX2NvbW1hbmQoKSwgc3Rkb3V0
PXN1YnByb2Nlc3MuUElQRSwgc2hlbGw9VHJ1ZSkKKyAgICAgICAgCisgICAgICAgIHRvb2wuYnVn
cy5hZGRfcGF0Y2hfdG9fYnVnKGJ1Z19pZCwgZGlmZl9wcm9jZXNzLnN0ZG91dCwgZGVzY3JpcHRp
b24sIG1hcmtfZm9yX3Jldmlldz1UcnVlKQorCisKK2NsYXNzIFBvc3RDb21taXRzQXNQYXRjaGVz
VG9CdWcgKENvbW1hbmQpOgorICAgIGRlZiBfX2luaXRfXyhzZWxmKToKKyAgICAgICAgQ29tbWFu
ZC5fX2luaXRfXyhzZWxmLCAnQXR0YWNoZXMgYSByYW5nZSBvZiBsb2NhbCBjb21taXRzIHRvIGEg
YnVnIGFzIHBhdGNoIGZpbGVzLicsICdCVUdJRCBDT01NSVRJU0gnKQorCisgICAgZGVmIGV4ZWN1
dGUoc2VsZiwgb3B0aW9ucywgYXJncywgdG9vbCk6CisgICAgICAgIGJ1Z19pZCA9IGFyZ3NbMF0K
KyAgICAgICAgCisgICAgICAgIGlmIG5vdCB0b29sLnNjbSgpLnN1cHBvcnRzX2xvY2FsX2NvbW1p
dHMoKToKKyAgICAgICAgICAgIGxvZyh0b29sLnNjbSgpLmRpc3BsYXlfbmFtZSgpICsgIiBkb2Vz
IG5vdCBzdXBwb3J0IGxvY2FsIGNvbW1pdHMuIikKKyAgICAgICAgICAgIGV4aXQoMSkKKyAgICAg
ICAgCisgICAgICAgIGNvbW1pdF9pZHMgPSB0b29sLnNjbSgpLmNvbW1pdF9pZHNfZnJvbV9yYW5n
ZV9hcmd1bWVudHMoYXJnc1sxOl0pCisgICAgICAgIAorICAgICAgICBpZiBsZW4oY29tbWl0X2lk
cykgPiAxMDoKKyAgICAgICAgICAgIGxvZygiQXJlIHlvdSBzdXJlIHlvdSB3YW50IHRvIGF0dGFj
aCAlZCBwYXRjaGVzIHRvIGJ1ZyAlcz8iICUgKGxlbihjb21taXRfaWRzKSwgYnVnX2lkKSkKKyAg
ICAgICAgICAgICMgU2hvdWxkIHN1cHBvcnQgYSAtLWZvcmNlIG9wdGlvbgorICAgICAgICAgICAg
ZXhpdCgxKQorICAgICAgICAKKyAgICAgICAgbG9nKCJBdHRhY2hpbmcgJWQgY29tbWl0cyBhcyBw
YXRjaGVzIHRvIGJ1ZyAlcyIgJSAobGVuKGNvbW1pdF9pZHMpLCBidWdfaWQpKQorICAgICAgICBm
b3IgY29tbWl0X2lkIGluIGNvbW1pdF9pZHM6CisgICAgICAgICAgICBjb21taXRfbWVzc2FnZSA9
IHRvb2wuc2NtKCkuY29tbWl0X21lc3NhZ2VfZm9yX2NvbW1pdChjb21taXRfaWQpCisgICAgICAg
ICAgICBjb21taXRfbGluZXMgPSBjb21taXRfbWVzc2FnZS5zcGxpdGxpbmVzKCkKKyAgICAgICAg
ICAgIAorICAgICAgICAgICAgZGVzY3JpcHRpb24gPSBjb21taXRfbGluZXNbMF0KKyAgICAgICAg
ICAgIGNvbW1lbnRfdGV4dCA9ICJcbiIuam9pbihjb21taXRfbGluZXNbMTpdKQorICAgICAgICAK
KyAgICAgICAgICAgIGNvbW1lbnRfdGV4dCArPSAiXG4tLS1cbiIKKyAgICAgICAgICAgIGNvbW1l
bnRfdGV4dCArPSB0b29sLnNjbSgpLmZpbGVzX2NoYW5nZWRfc3VtbWFyeV9mb3JfY29tbWl0KGNv
bW1pdF9pZCkKKyAgICAgICAgCisgICAgICAgICAgICAjIFRoaXMgaXMgYSBsaXR0bGUgYml0IG9m
IGEgaGFjaywgdGhhdCB3ZSBwYXNzIHN0ZG91dCBhcyB0aGUgcGF0Y2ggZmlsZQorICAgICAgICAg
ICAgIyBXZSBjb3VsZCBhbHRlcm5hdGl2ZWx5IG1ha2UgYW4gaW4tbWVtb3J5IGZpbGUtbGlrZSBv
YmplY3Qgd2l0aCB0aGUgcGF0Y2ggY29udGVudHMKKyAgICAgICAgICAgIGRpZmZfcHJvY2VzcyA9
IHN1YnByb2Nlc3MuUG9wZW4odG9vbC5zY20oKS5zaG93X2RpZmZfY29tbWFuZF9mb3JfY29tbWl0
KGNvbW1pdF9pZCksIHN0ZG91dD1zdWJwcm9jZXNzLlBJUEUsIHNoZWxsPVRydWUpCisgICAgICAg
ICAgICB0b29sLmJ1Z3MuYWRkX3BhdGNoX3RvX2J1ZyhidWdfaWQsIGRpZmZfcHJvY2Vzcy5zdGRv
dXQsIGRlc2NyaXB0aW9uLCBjb21tZW50X3RleHQsIG1hcmtfZm9yX3Jldmlldz1UcnVlKQorCisK
K2NsYXNzIE5vbldyYXBwaW5nRXBpbG9nSW5kZW50ZWRIZWxwRm9ybWF0dGVyIChJbmRlbnRlZEhl
bHBGb3JtYXR0ZXIpOgorICAgIGRlZiBfX2luaXRfXyhzZWxmKToKKyAgICAgICAgSW5kZW50ZWRI
ZWxwRm9ybWF0dGVyLl9faW5pdF9fKHNlbGYpCisKKyAgICAjIFRoZSBzdGFuZGFyZCBJbmRlbnRl
ZEhlbHBGb3JtYXR0ZXIgcmUtd3JhcHMgdGhlIGVwaWxvZyEKKyAgICBkZWYgZm9ybWF0X2VwaWxv
ZyhzZWxmLCBlcGlsb2cpOgorICAgICAgICBpZiBlcGlsb2c6CisgICAgICAgICAgICByZXR1cm4g
IlxuIiArIGVwaWxvZyArICJcbiIKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJldHVybiAi
IgorCitjbGFzcyBCdWd6aWxsYVRvb2w6CisgICAgZGVmIF9faW5pdF9fKHNlbGYpOgorICAgICAg
ICBzZWxmLmNhY2hlZF9zY20gPSBOb25lCisgICAgICAgIHNlbGYuYnVncyA9IEJ1Z3ppbGxhKCkK
KyAgICAgICAgc2VsZi5jb21tYW5kcyA9IFsKKyAgICAgICAgICAgIHsgJ25hbWUnIDogJ2J1Z3Mt
dG8tY29tbWl0JywgJ29iamVjdCcgOiBCdWdzSW5Db21taXRRdWV1ZSgpIH0sCisgICAgICAgICAg
ICB7ICduYW1lJyA6ICdwYXRjaGVzLXRvLWNvbW1pdCcsICdvYmplY3QnIDogUGF0Y2hlc0luQ29t
bWl0UXVldWUoKSB9LAorICAgICAgICAgICAgeyAnbmFtZScgOiAncmV2aWV3ZWQtcGF0Y2hlcycs
ICdvYmplY3QnIDogUmV2aWV3ZWRQYXRjaGVzT25CdWcoKSB9LAorICAgICAgICAgICAgeyAnbmFt
ZScgOiAnYXBwbHktcGF0Y2hlcycsICdvYmplY3QnIDogQXBwbHlQYXRjaGVzRnJvbUJ1ZygpIH0s
CisgICAgICAgICAgICB7ICduYW1lJyA6ICdsYW5kLWFuZC11cGRhdGUnLCAnb2JqZWN0JyA6IExh
bmRBbmRVcGRhdGVCdWcoKSB9LAorICAgICAgICAgICAgeyAnbmFtZScgOiAnbGFuZC1wYXRjaGVz
JywgJ29iamVjdCcgOiBMYW5kUGF0Y2hlc0Zyb21CdWcoKSB9LAorICAgICAgICAgICAgeyAnbmFt
ZScgOiAnY29tbWl0LW1lc3NhZ2UnLCAnb2JqZWN0JyA6IENvbW1pdE1lc3NhZ2VGb3JDdXJyZW50
RGlmZigpIH0sCisgICAgICAgICAgICB7ICduYW1lJyA6ICdvYnNvbGV0ZS1hdHRhY2htZW50cycs
ICdvYmplY3QnIDogT2Jzb2xldGVBdHRhY2htZW50c09uQnVnKCkgfSwKKyAgICAgICAgICAgIHsg
J25hbWUnIDogJ3Bvc3QtZGlmZicsICdvYmplY3QnIDogUG9zdERpZmZBc1BhdGNoVG9CdWcoKSB9
LAorICAgICAgICAgICAgeyAnbmFtZScgOiAncG9zdC1jb21taXRzJywgJ29iamVjdCcgOiBQb3N0
Q29tbWl0c0FzUGF0Y2hlc1RvQnVnKCkgfSwKKyAgICAgICAgXQorICAgICAgICAKKyAgICAgICAg
c2VsZi5nbG9iYWxfb3B0aW9uX3BhcnNlciA9IE9wdGlvblBhcnNlcih1c2FnZT1zZWxmLnVzYWdl
X2xpbmUoKSwgZm9ybWF0dGVyPU5vbldyYXBwaW5nRXBpbG9nSW5kZW50ZWRIZWxwRm9ybWF0dGVy
KCksIGVwaWxvZz1zZWxmLmNvbW1hbmRzX3VzYWdlKCkpCisgICAgICAgIHNlbGYuZ2xvYmFsX29w
dGlvbl9wYXJzZXIuYWRkX29wdGlvbigiLS1kcnktcnVuIiwgYWN0aW9uPSJzdG9yZV90cnVlIiwg
ZGVzdD0iZHJ5cnVuIiwgaGVscD0iZG8gbm90IHRvdWNoIHJlbW90ZSBzZXJ2ZXJzIiwgZGVmYXVs
dD1GYWxzZSkKKyAgICAKKyAgICBkZWYgc2NtKHNlbGYpOgorICAgICAgICBpZiBub3Qgc2VsZi5j
YWNoZWRfc2NtOgorICAgICAgICAgICAgIyBMYXppbHkgaW5pdGlhbGl6aW5nIFNDTSB0byBub3Qg
ZXJyb3Itb3V0IGJlZm9yZSBjb21tYW5kIGxpbmUgcGFyc2luZworICAgICAgICAgICAgc2VsZi5j
YWNoZWRfc2NtID0gZGV0ZWN0X3NjbV9zeXN0ZW0oIi4iKQorCisgICAgICAgIHJldHVybiBzZWxm
LmNhY2hlZF9zY20KKyAgICAKKyAgICBkZWYgdXNhZ2VfbGluZShzZWxmKToKKyAgICAgICAgcmV0
dXJuICJVc2FnZTogJXByb2cgW29wdGlvbnNdIGNvbW1hbmQgW2NvbW1hbmQtb3B0aW9uc10gW2Nv
bW1hbmQtYXJndW1lbnRzXSIKKyAgICAKKyAgICBkZWYgY29tbWFuZHNfdXNhZ2Uoc2VsZik6Cisg
ICAgICAgIGNvbW1hbmRzX3RleHQgPSAiQ29tbWFuZHM6XG4iCisgICAgICAgIGxvbmdlc3RfbmFt
ZV9sZW5ndGggPSAwCisgICAgICAgIGNvbW1hbmRfcm93cyA9IFtdCisgICAgICAgIGZvciBjb21t
YW5kIGluIHNlbGYuY29tbWFuZHM6CisgICAgICAgICAgICBjb21tYW5kX29iamVjdCA9IGNvbW1h
bmRbJ29iamVjdCddCisgICAgICAgICAgICBjb21tYW5kX25hbWVfYW5kX2FyZ3MgPSBjb21tYW5k
X29iamVjdC5uYW1lX3dpdGhfYXJndW1lbnRzKGNvbW1hbmRbJ25hbWUnXSkKKyAgICAgICAgICAg
IGNvbW1hbmRfcm93cy5hcHBlbmQoeyAnbmFtZS1hbmQtYXJncyc6IGNvbW1hbmRfbmFtZV9hbmRf
YXJncywgJ29iamVjdCc6IGNvbW1hbmRfb2JqZWN0IH0pCisgICAgICAgICAgICBsb25nZXN0X25h
bWVfbGVuZ3RoID0gbWF4KFtsb25nZXN0X25hbWVfbGVuZ3RoLCBsZW4oY29tbWFuZF9uYW1lX2Fu
ZF9hcmdzKV0pCisgICAgICAgIAorICAgICAgICAjIFVzZSBvdXIgb3duIGhlbHAgZm9ybWF0dGVy
IHNvIGFzIHRvIGluZGVudCBlbm91Z2gKKyAgICAgICAgZm9ybWF0dGVyID0gSW5kZW50ZWRIZWxw
Rm9ybWF0dGVyKCkKKyAgICAgICAgZm9ybWF0dGVyLmluZGVudCgpCisgICAgICAgIGZvcm1hdHRl
ci5pbmRlbnQoKQorICAgICAgICAKKyAgICAgICAgZm9yIHJvdyBpbiBjb21tYW5kX3Jvd3M6Cisg
ICAgICAgICAgICBjb21tYW5kX29iamVjdCA9IHJvd1snb2JqZWN0J10KKyAgICAgICAgICAgIGNv
bW1hbmRzX3RleHQgKz0gIiAgIiArIHJvd1snbmFtZS1hbmQtYXJncyddLmxqdXN0KGxvbmdlc3Rf
bmFtZV9sZW5ndGggKyAzKSArIGNvbW1hbmRfb2JqZWN0LmhlbHBfdGV4dCArICJcbiIKKyAgICAg
ICAgICAgIGNvbW1hbmRzX3RleHQgKz0gY29tbWFuZF9vYmplY3Qub3B0aW9uX3BhcnNlci5mb3Jt
YXRfb3B0aW9uX2hlbHAoZm9ybWF0dGVyKQorICAgICAgICByZXR1cm4gY29tbWFuZHNfdGV4dAor
CisgICAgZGVmIGhhbmRsZV9nbG9iYWxfYXJncyhzZWxmLCBhcmdzKToKKyAgICAgICAgKG9wdGlv
bnMsIGFyZ3MpID0gc2VsZi5nbG9iYWxfb3B0aW9uX3BhcnNlci5wYXJzZV9hcmdzKGFyZ3MpCisg
ICAgICAgIGlmIGxlbihhcmdzKToKKyAgICAgICAgICAgICMgV2UnbGwgbmV2ZXIgaGl0IHRoaXMg
YmVjYXVzZSBzcGxpdF9hcmdzIHNwbGl0cyBhdCB0aGUgZmlyc3QgYXJnIHdpdGhvdXQgYSBsZWFk
aW5nICctJworICAgICAgICAgICAgc2VsZi5nbG9iYWxfb3B0aW9uX3BhcnNlci5lcnJvcigiRXh0
cmEgYXJndW1lbnRzIGJlZm9yZSBjb21tYW5kOiAiICsgYXJncykKKyAgICAgICAgCisgICAgICAg
IGlmIG9wdGlvbnMuZHJ5cnVuOgorICAgICAgICAgICAgc2VsZi5zY20oKS5kcnlydW4gPSBUcnVl
CisgICAgICAgICAgICBzZWxmLmJ1Z3MuZHJ5cnVuID0gVHJ1ZQorICAgIAorICAgIGRlZiBzcGxp
dF9hcmdzKHNlbGYsIGFyZ3MpOgorICAgICAgICAjIEFzc3VtZSB0aGUgZmlyc3QgYXJndW1lbnQg
d2hpY2ggZG9lc24ndCBzdGFydCB3aXRoICctJyBpcyB0aGUgY29tbWFuZCBuYW1lCisgICAgICAg
IGNvbW1hbmRfaW5kZXggPSAwCisgICAgICAgIGZvciBhcmcgaW4gYXJnczoKKyAgICAgICAgICAg
IGlmIGFyZ1swXSAhPSAnLSc6CisgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgIGNv
bW1hbmRfaW5kZXggKz0gMQorCisgICAgICAgIGdsb2JhbF9hcmdzID0gYXJnc1s6Y29tbWFuZF9p
bmRleF0KKyAgICAgICAgaWYgY29tbWFuZF9pbmRleCA+PSBsZW4oYXJncyk6CisgICAgICAgICAg
ICByZXR1cm4gKGdsb2JhbF9hcmdzLCBOb25lLCBbXSkKKworICAgICAgICBjb21tYW5kID0gYXJn
c1tjb21tYW5kX2luZGV4XQorICAgICAgICBjb21tYW5kX2FyZ3MgPSBhcmdzW2NvbW1hbmRfaW5k
ZXggKyAxOl0KKyAgICAgICAgcmV0dXJuIChnbG9iYWxfYXJncywgY29tbWFuZCwgY29tbWFuZF9h
cmdzKQorICAgIAorICAgIGRlZiBjb21tYW5kX2J5X25hbWUoc2VsZiwgY29tbWFuZF9uYW1lKToK
KyAgICAgICAgZm9yIGNvbW1hbmQgaW4gc2VsZi5jb21tYW5kczoKKyAgICAgICAgICAgIGlmIGNv
bW1hbmRfbmFtZSA9PSBjb21tYW5kWyduYW1lJ106CisgICAgICAgICAgICAgICAgcmV0dXJuIGNv
bW1hbmQKKyAgICAgICAgcmV0dXJuIE5vbmUKKyAgICAKKyAgICBkZWYgbWFpbihzZWxmKToKKyAg
ICAgICAgKGdsb2JhbF9hcmdzLCBjb21tYW5kX25hbWUsIGFyZ3NfYWZ0ZXJfY29tbWFuZF9uYW1l
KSA9IHNlbGYuc3BsaXRfYXJncyhzeXMuYXJndlsxOl0pCisgICAgICAgIAorICAgICAgICAjIEhh
bmRsZSAtLWhlbHAsIGV0YzoKKyAgICAgICAgc2VsZi5oYW5kbGVfZ2xvYmFsX2FyZ3MoZ2xvYmFs
X2FyZ3MpCisgICAgICAgIAorICAgICAgICBpZiBub3QgY29tbWFuZF9uYW1lOgorICAgICAgICAg
ICAgc2VsZi5nbG9iYWxfb3B0aW9uX3BhcnNlci5lcnJvcigiTm8gY29tbWFuZCBzcGVjaWZpZWQi
KQorICAgICAgICAKKyAgICAgICAgY29tbWFuZCA9IHNlbGYuY29tbWFuZF9ieV9uYW1lKGNvbW1h
bmRfbmFtZSkKKyAgICAgICAgaWYgbm90IGNvbW1hbmQ6CisgICAgICAgICAgICBzZWxmLmdsb2Jh
bF9vcHRpb25fcGFyc2VyLmVycm9yKGNvbW1hbmRfbmFtZSArICIgaXMgbm90IGEgcmVjb2duaXpl
ZCBjb21tYW5kIikKKyAgICAgICAgCisgICAgICAgIGNvbW1hbmRfb2JqZWN0ID0gY29tbWFuZFsn
b2JqZWN0J10KKyAgICAgICAgKGNvbW1hbmRfb3B0aW9ucywgY29tbWFuZF9hcmdzKSA9IGNvbW1h
bmRfb2JqZWN0LnBhcnNlX2FyZ3MoYXJnc19hZnRlcl9jb21tYW5kX25hbWUpCisgICAgICAgIHJl
dHVybiBjb21tYW5kX29iamVjdC5leGVjdXRlKGNvbW1hbmRfb3B0aW9ucywgY29tbWFuZF9hcmdz
LCBzZWxmKQorCisKK2RlZiBtYWluKCk6CisgICAgdG9vbCA9IEJ1Z3ppbGxhVG9vbCgpCisgICAg
cmV0dXJuIHRvb2wubWFpbigpCisKK2lmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CisgICAgbWFp
bigpCmRpZmYgLS1naXQgYS9XZWJLaXRUb29scy9TY3JpcHRzL21vZHVsZXMvYnVnemlsbGEucHkg
Yi9XZWJLaXRUb29scy9TY3JpcHRzL21vZHVsZXMvYnVnemlsbGEucHkKbmV3IGZpbGUgbW9kZSAx
MDA2NDQKaW5kZXggMDAwMDAwMC4uNDQyYzVmOQotLS0gL2Rldi9udWxsCisrKyBiL1dlYktpdFRv
b2xzL1NjcmlwdHMvbW9kdWxlcy9idWd6aWxsYS5weQpAQCAtMCwwICsxLDI1OCBAQAorIyBDb3B5
cmlnaHQgKEMpIDIwMDkgR29vZ2xlLCBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorIworIyBS
ZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9y
IHdpdGhvdXQKKyMgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhl
IGZvbGxvd2luZyBjb25kaXRpb25zCisjIGFyZSBtZXQ6CisjIDEuIFJlZGlzdHJpYnV0aW9ucyBv
ZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisjICAgIG5vdGlj
ZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4K
KyMgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBh
Ym92ZSBjb3B5cmlnaHQKKyMgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQg
dGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorIyAgICBkb2N1bWVudGF0aW9uIGFuZC9v
ciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorIworIyBU
SElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIENPTVBVVEVSLCBJTkMuIGBgQVMgSVMn
JyBBTkQgQU5ZCisjIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJV
VCBOT1QgTElNSVRFRCBUTywgVEhFCisjIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFC
SUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorIyBQVVJQT1NFIEFSRSBESVNDTEFJ
TUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgQ09NUFVURVIsIElOQy4gT1IKKyMgQ09OVFJJ
QlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQ
RUNJQUwsCisjIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcs
IEJVVCBOT1QgTElNSVRFRCBUTywKKyMgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBP
UiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisjIFBST0ZJVFM7IE9SIEJVU0lORVNT
IElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyMgT0YgTElB
QklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisj
IChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBP
VVQgT0YgVEhFIFVTRQorIyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhF
IFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorIworIyBXZWJLaXQncyBQeXRob24gbW9kdWxl
IGZvciBpbnRlcmFjdGluZyB3aXRoIEJ1Z3ppbGxhCisKK2ltcG9ydCBnZXRwYXNzCitpbXBvcnQg
c3VicHJvY2VzcworaW1wb3J0IHN5cworaW1wb3J0IHVybGxpYjIKKworZnJvbSBCZWF1dGlmdWxT
b3VwIGltcG9ydCBCZWF1dGlmdWxTb3VwCitmcm9tIG1lY2hhbml6ZSBpbXBvcnQgQnJvd3Nlcgor
CitkZWYgbG9nKHN0cmluZyk6CisgICAgcHJpbnQgPj4gc3lzLnN0ZGVyciwgc3RyaW5nCisKKyMg
SEFDSzogVGhpcyBzaG91bGQgbm90IGRlcGVuZCBvbiBnaXQgZm9yIGNvbmZpZyBzdG9yYWdlCitk
ZWYgcmVhZF9jb25maWcoa2V5KToKKyAgICAjIE5lZWQgYSB3YXkgdG8gcmVhZCBmcm9tIHN2biB0
b28KKyAgICBjb25maWdfcHJvY2VzcyA9IHN1YnByb2Nlc3MuUG9wZW4oImdpdCBjb25maWcgLS1n
ZXQgYnVnemlsbGEuIiArIGtleSwgc3Rkb3V0PXN1YnByb2Nlc3MuUElQRSwgc2hlbGw9VHJ1ZSkK
KyAgICB2YWx1ZSA9IGNvbmZpZ19wcm9jZXNzLmNvbW11bmljYXRlKClbMF0KKyAgICByZXR1cm5f
Y29kZSA9IGNvbmZpZ19wcm9jZXNzLndhaXQoKQorCisgICAgaWYgcmV0dXJuX2NvZGUgIT0gMDoK
KyAgICAgICAgcmV0dXJuIE5vbmUKKyAgICByZXR1cm4gdmFsdWUucnN0cmlwKCdcbicpCisKK2Ns
YXNzIEJ1Z3ppbGxhOgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBkcnlydW4gPSBGYWxzZSk6Cisg
ICAgICAgIHNlbGYuZHJ5cnVuID0gZHJ5cnVuCisgICAgICAgIHNlbGYuYXV0aGVudGljYXRlZCA9
IEZhbHNlCisgICAgICAgIAorICAgICAgICAjIERlZmF1bHRzICh1bnRpbCB3ZSBzdXBwb3J0IGJl
dHRlciBvcHRpb24gcGFyc2luZyk6CisgICAgICAgIHNlbGYuYnVnX3NlcnZlciA9ICJodHRwczov
L2J1Z3Mud2Via2l0Lm9yZy8iCisgICAgICAgIAorICAgICAgICBzZWxmLmJyID0gQnJvd3Nlcigp
CisgICAgICAgICMgSWdub3JlIGJ1Z3Mud2Via2l0Lm9yZy9yb2JvdHMudHh0IHVudGlsIHdlIGZp
eCBpdCB0byBhbGxvdyB0aGlzIHNjcmlwdAorICAgICAgICBzZWxmLmJyLnNldF9oYW5kbGVfcm9i
b3RzKEZhbHNlKQorCisgICAgIyBUaGlzIGNvdWxkIGV2ZW50dWFsbHkgYmUgYSB0ZXh0IGZpbGUK
KyAgICByZXZpZXdlcl91c2VybmFtZXNfdG9fZnVsbF9uYW1lcyA9IHsKKyAgICAgICAgImFiYXJ0
aCIgOiAiQWRhbSBCYXJ0aCIsCisgICAgICAgICJhZGVsZSIgOiAiQWRlbGUgUGV0ZXJzb24iLAor
ICAgICAgICAiYXJpeWEuaGlkYXlhdCIgOiAiQXJpeWEgSGlkYXlhdCIsCisgICAgICAgICJkYXJp
biIgOiAiRGFyaW4gQWRsZXIiLAorICAgICAgICAiZGdsYXprb3YiIDogIkRpbWl0cmkgR2xhemtv
diIsCisgICAgICAgICJlcmljIiA6ICJFcmljIFNlaWRlbCIsCisgICAgICAgICJkZGtpbHplciIg
OiAiRGF2aWQgS2lsemVyIiwKKyAgICAgICAgImZpc2hkIiA6ICJEYXJpbiBGaXNoZXIiLAorICAg
ICAgICAiZ25zIiA6ICJHdXN0YXZvIE5vcm9uaGEiLAorICAgICAgICAiaHlhdHQiIDogIkRhdmlk
IEh5YXR0IiwKKyAgICAgICAgImptYWxvbnpvIiA6ICJKYW4gQWxvbnpvIiwKKyAgICAgICAgImxl
dmluIiA6ICJEYXZpZCBMZXZpbiIsCisgICAgICAgICJtaXR6IiA6ICJEYW4gQmVybnN0ZWluIiwK
KyAgICAgICAgIm1qcyIgOiAiTWFjaWVqIFN0YWNob3ZpYWsiLAorICAgICAgICAibXJvd2UiIDog
Ik1hcmsgUm93ZSIsCisgICAgICAgICJvbGl2ZXIiIDogIk9saXZlciBIdW50IiwKKyAgICAgICAg
InN0YWlrb3MiIDogIkdlb3JnZSBTdGFpa29zIiwKKyAgICAgICAgInRyZWF0IiA6ICJBZGFtIFRy
ZWF0IiwKKyAgICAgICAgInRpbW90aHkiIDogIlRpbW90aHkgSGF0Y2hlciIsCisgICAgICAgICJ4
YW4ubG9wZXoiIDogIlhhbiBMb3BleiIsCisgICAgICAgICJ6ZWNrZSIgOiAiSG9sZ2VyIEZyZXl0
aGVyIiwKKyAgICB9CisKKyAgICBkZWYgZnVsbF9uYW1lX2Zyb21fYnVnemlsbGFfbmFtZShzZWxm
LCBidWd6aWxsYV9uYW1lKToKKyAgICAgICAgaWYgbm90IGJ1Z3ppbGxhX25hbWUgaW4gc2VsZi5y
ZXZpZXdlcl91c2VybmFtZXNfdG9fZnVsbF9uYW1lczoKKyAgICAgICAgICAgIHJhaXNlIEV4Y2Vw
dGlvbigiRVJST1I6IFVua25vd24gcmV2aWV3ZXIhICIgKyBidWd6aWxsYV9uYW1lKQorICAgICAg
ICByZXR1cm4gc2VsZi5yZXZpZXdlcl91c2VybmFtZXNfdG9fZnVsbF9uYW1lc1tidWd6aWxsYV9u
YW1lXQorCisgICAgZGVmIGJ1Z191cmxfZm9yX2J1Z19pZChzZWxmLCBidWdfaWQpOgorICAgICAg
ICBidWdfYmFzZV91cmwgPSBzZWxmLmJ1Z19zZXJ2ZXIgKyAic2hvd19idWcuY2dpP2lkPSIKKyAg
ICAgICAgcmV0dXJuICIlcyVzIiAlIChidWdfYmFzZV91cmwsIGJ1Z19pZCkKKyAgICAKKyAgICBk
ZWYgYXR0YWNobWVudF91cmxfZm9yX2lkKHNlbGYsIGF0dGFjaG1lbnRfaWQsIGFjdGlvbiA9ICJ2
aWV3Iik6CisgICAgICAgIGF0dGFjaG1lbnRfYmFzZV91cmwgPSBzZWxmLmJ1Z19zZXJ2ZXIgKyAi
YXR0YWNobWVudC5jZ2k/aWQ9IgorICAgICAgICByZXR1cm4gIiVzJXMmYWN0aW9uPSVzIiAlIChh
dHRhY2htZW50X2Jhc2VfdXJsLCBhdHRhY2htZW50X2lkLCBhY3Rpb24pCisKKyAgICBkZWYgZmV0
Y2hfYXR0YWNobWVudHNfZnJvbV9idWcoc2VsZiwgYnVnX2lkKToKKyAgICAgICAgYnVnX3VybCA9
IHNlbGYuYnVnX3VybF9mb3JfYnVnX2lkKGJ1Z19pZCkKKyAgICAgICAgbG9nKCJGZXRjaGluZzog
IiArIGJ1Z191cmwpCisKKyAgICAgICAgcGFnZSA9IHVybGxpYjIudXJsb3BlbihidWdfdXJsKQor
ICAgICAgICBzb3VwID0gQmVhdXRpZnVsU291cChwYWdlKQorICAgIAorICAgICAgICBhdHRhY2ht
ZW50X3RhYmxlID0gc291cC5maW5kKCd0YWJsZScsIHsnY2VsbHNwYWNpbmcnOiIwIiwgJ2NlbGxw
YWRkaW5nJzoiNCIsICdib3JkZXInOiIxIn0pCisgICAgCisgICAgICAgIGF0dGFjaG1lbnRzID0g
W10KKyAgICAgICAgIyBHcmFiIGEgbGlzdCBvZiBub24tb2Jzb2xldGVkIHBhdGNoIGZpbGVzIAor
ICAgICAgICBmb3IgYXR0YWNobWVudF9yb3cgaW4gYXR0YWNobWVudF90YWJsZS5maW5kQWxsKCd0
cicpOgorICAgICAgICAgICAgZmlyc3RfY2VsbCA9IGF0dGFjaG1lbnRfcm93LmZpbmQoJ3RkJykK
KyAgICAgICAgICAgIGlmIG5vdCBmaXJzdF9jZWxsOgorICAgICAgICAgICAgICAgIGNvbnRpbnVl
ICMgVGhpcyBpcyB0aGUgaGVhZGVyLCBubyBjZWxscworICAgICAgICAgICAgaWYgZmlyc3RfY2Vs
bC5oYXNfa2V5KCdjb2xzcGFuJyk6CisgICAgICAgICAgICAgICAgYnJlYWsgIyB0aGlzIGlzIHRo
ZSBsYXN0IHJvdworICAgICAgICAgICAgCisgICAgICAgICAgICBhdHRhY2htZW50ID0ge30KKyAg
ICAgICAgICAgIGF0dGFjaG1lbnRbJ29ic29sZXRlJ10gPSAoYXR0YWNobWVudF9yb3cuaGFzX2tl
eSgnY2xhc3MnKSBhbmQgYXR0YWNobWVudF9yb3dbJ2NsYXNzJ10gPT0gImJ6X29ic29sZXRlIikK
KyAgICAgICAgICAgIAorICAgICAgICAgICAgY2VsbHMgPSBhdHRhY2htZW50X3Jvdy5maW5kQWxs
KCd0ZCcpCisgICAgICAgICAgICBhdHRhY2htZW50X2xpbmsgPSBjZWxsc1swXS5maW5kKCdhJykK
KyAgICAgICAgICAgIGF0dGFjaG1lbnRbJ3VybCddID0gc2VsZi5idWdfc2VydmVyICsgYXR0YWNo
bWVudF9saW5rWydocmVmJ10gIyB1cmxzIGFyZSByZWxhdGl2ZQorICAgICAgICAgICAgYXR0YWNo
bWVudFsnaWQnXSA9IGF0dGFjaG1lbnRbJ3VybCddLnNwbGl0KCc9JylbMV0gIyBlLmcuIGh0dHBz
Oi8vYnVncy53ZWJraXQub3JnL2F0dGFjaG1lbnQuY2dpP2lkPTMxMjIzCisgICAgICAgICAgICBh
dHRhY2htZW50WyduYW1lJ10gPSBhdHRhY2htZW50X2xpbmsuc3RyaW5nCisgICAgICAgICAgICAj
IGF0dGFjaG1lbnRbJ3R5cGUnXSA9IGNlbGxzWzFdCisgICAgICAgICAgICAjIGF0dGFjaG1lbnRb
J2RhdGUnXSA9IGNlbGxzWzJdCisgICAgICAgICAgICAjIGF0dGFjaG1lbnRbJ3NpemUnXSA9IGNl
bGxzWzNdCisgICAgICAgICAgICByZXZpZXdfc3RhdHVzID0gY2VsbHNbNF0KKyAgICAgICAgICAg
ICMgYWN0aW9uX2xpbmtzID0gY2VsbHNbNV0KKworICAgICAgICAgICAgaWYgKHN0cihyZXZpZXdf
c3RhdHVzKS5maW5kKCJyZXZpZXcrIikgIT0gLTEpOgorICAgICAgICAgICAgICAgIHJldmlld2Vy
ID0gcmV2aWV3X3N0YXR1cy5jb250ZW50c1swXS5zcGxpdCgnOicpWzBdICMgbmFtZTpcbiByZXZp
ZXcrXG4KKyAgICAgICAgICAgICAgICByZXZpZXdlcl9mdWxsX25hbWUgPSBzZWxmLmZ1bGxfbmFt
ZV9mcm9tX2J1Z3ppbGxhX25hbWUocmV2aWV3ZXIpCisgICAgICAgICAgICAgICAgYXR0YWNobWVu
dFsncmV2aWV3ZXInXSA9IHJldmlld2VyX2Z1bGxfbmFtZQorCisgICAgICAgICAgICBhdHRhY2ht
ZW50cy5hcHBlbmQoYXR0YWNobWVudCkKKyAgICAgICAgcmV0dXJuIGF0dGFjaG1lbnRzCisKKyAg
ICBkZWYgZmV0Y2hfcmV2aWV3ZWRfcGF0Y2hlc19mcm9tX2J1ZyhzZWxmLCBidWdfaWQpOgorICAg
ICAgICByZXZpZXdlZF9wYXRjaGVzID0gW10KKyAgICAgICAgZm9yIGF0dGFjaG1lbnQgaW4gc2Vs
Zi5mZXRjaF9hdHRhY2htZW50c19mcm9tX2J1ZyhidWdfaWQpOgorICAgICAgICAgICAgaWYgJ3Jl
dmlld2VyJyBpbiBhdHRhY2htZW50IGFuZCBub3QgYXR0YWNobWVudFsnb2Jzb2xldGUnXToKKyAg
ICAgICAgICAgICAgICByZXZpZXdlZF9wYXRjaGVzLmFwcGVuZChhdHRhY2htZW50KQorICAgICAg
ICByZXR1cm4gcmV2aWV3ZWRfcGF0Y2hlcworCisgICAgZGVmIGZldGNoX2J1Z19pZHNfZnJvbV9j
b21taXRfcXVldWUoc2VsZik6CisgICAgICAgICMgdW5hc3NpZ25lZF9vbmx5ID0gIiZlbWFpbGFz
c2lnbmVkX3RvMT0xJmVtYWlsdHlwZTE9c3Vic3RyaW5nJmVtYWlsMT11bmFzc2lnbmVkIgorICAg
ICAgICBjb21taXRfcXVldWVfdXJsID0gImh0dHBzOi8vYnVncy53ZWJraXQub3JnL2J1Z2xpc3Qu
Y2dpP3F1ZXJ5X2Zvcm1hdD1hZHZhbmNlZCZidWdfc3RhdHVzPVVOQ09ORklSTUVEJmJ1Z19zdGF0
dXM9TkVXJmJ1Z19zdGF0dXM9QVNTSUdORUQmYnVnX3N0YXR1cz1SRU9QRU5FRCZmaWVsZDAtMC0w
PWZsYWd0eXBlcy5uYW1lJnR5cGUwLTAtMD1lcXVhbHMmdmFsdWUwLTAtMD1yZXZpZXclMkIiCisg
ICAgICAgIGxvZygiTG9hZGluZyBjb21taXQgcXVldWUiKQorCisgICAgICAgIHBhZ2UgPSB1cmxs
aWIyLnVybG9wZW4oY29tbWl0X3F1ZXVlX3VybCkKKyAgICAgICAgc291cCA9IEJlYXV0aWZ1bFNv
dXAocGFnZSkKKyAgICAKKyAgICAgICAgYnVnX2lkcyA9IFtdCisgICAgICAgICMgR3JhYiB0aGUg
Y2VsbHMgaW4gdGhlIGZpcnN0IGNvbHVtbiAod2hpY2ggaGFwcGVucyB0byBiZSB0aGUgYnVnIGlk
cykKKyAgICAgICAgZm9yIGJ1Z19saW5rX2NlbGwgaW4gc291cCgndGQnLCAiZmlyc3QtY2hpbGQi
KTogIyB0ZHMgd2l0aCB0aGUgY2xhc3MgImZpcnN0LWNoaWxkIgorICAgICAgICAgICAgYnVnX2xp
bmsgPSBidWdfbGlua19jZWxsLmZpbmQoImEiKQorICAgICAgICAgICAgYnVnX2lkcy5hcHBlbmQo
YnVnX2xpbmsuc3RyaW5nKSAjIHRoZSBjb250ZW50cyBoYXBwZW4gdG8gYmUgdGhlIGJ1ZyBpZAor
ICAgIAorICAgICAgICByZXR1cm4gYnVnX2lkcworCisgICAgZGVmIGZldGNoX3BhdGNoZXNfZnJv
bV9jb21taXRfcXVldWUoc2VsZik6CisgICAgICAgIHBhdGNoZXNfdG9fbGFuZCA9IFtdCisgICAg
ICAgIGZvciBidWdfaWQgaW4gc2VsZi5mZXRjaF9idWdfaWRzX2Zyb21fY29tbWl0X3F1ZXVlKCk6
CisgICAgICAgICAgICBwYXRjaGVzID0gc2VsZi5mZXRjaF9yZXZpZXdlZF9wYXRjaGVzX2Zyb21f
YnVnKGJ1Z19pZCkKKyAgICAgICAgICAgIHBhdGNoZXNfdG9fbGFuZC5leHRlbmQocGF0Y2hlcykK
KyAgICAgICAgcmV0dXJuIHBhdGNoZXNfdG9fbGFuZAorCisgICAgZGVmIGF1dGhlbnRpY2F0ZShz
ZWxmLCB1c2VybmFtZSA9IE5vbmUsIHBhc3N3b3JkID0gTm9uZSk6CisgICAgICAgIGlmIChzZWxm
LmF1dGhlbnRpY2F0ZWQpOgorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIAorICAgICAgICBp
ZiBub3QgdXNlcm5hbWU6CisgICAgICAgICAgICB1c2VybmFtZSA9IHJlYWRfY29uZmlnKCJ1c2Vy
bmFtZSIpCisgICAgICAgICAgICBpZiBub3QgdXNlcm5hbWU6CisgICAgICAgICAgICAgICAgdXNl
cm5hbWUgPSByYXdfaW5wdXQoIkJ1Z3ppbGxhIGxvZ2luOiAiKQorICAgICAgICBpZiBub3QgcGFz
c3dvcmQ6CisgICAgICAgICAgICBwYXNzd29yZCA9IHJlYWRfY29uZmlnKCJwYXNzd29yZCIpCisg
ICAgICAgICAgICBpZiBub3QgcGFzc3dvcmQ6CisgICAgICAgICAgICAgICAgcGFzc3dvcmQgPSBn
ZXRwYXNzLmdldHBhc3MoIkJ1Z3ppbGxhIHBhc3N3b3JkIGZvciAlczogIiAlICh1c2VybmFtZSwp
KQorCisgICAgICAgIGxvZygiTG9nZ2luZyBpbiBhcyAlcy4uLiIgJSAodXNlcm5hbWUsKSkKKyAg
ICAgICAgaWYgc2VsZi5kcnlydW46CisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgc2VsZi5i
ci5vcGVuKHNlbGYuYnVnX3NlcnZlciArICIvaW5kZXguY2dpP0dvQWhlYWRBbmRMb2dJbj0xIikK
KyAgICAgICAgc2VsZi5ici5zZWxlY3RfZm9ybShuYW1lPSJsb2dpbiIpCisgICAgICAgIHNlbGYu
YnJbJ0J1Z3ppbGxhX2xvZ2luJ10gPSB1c2VybmFtZQorICAgICAgICBzZWxmLmJyWydCdWd6aWxs
YV9wYXNzd29yZCddID0gcGFzc3dvcmQKKyAgICAgICAgc2VsZi5ici5zdWJtaXQoKQorCisgICAg
ICAgICMgV2UgcmVhbGx5IHNob3VsZCBjaGVjayB0aGUgcmVzdWx0IGNvZGVzIGFuZCB0cnkgYWdh
aW4gYXMgbmVjZXNzYXJ5CisgICAgICAgIHNlbGYuYXV0aGVudGljYXRlZCA9IFRydWUKKworICAg
IGRlZiBhZGRfcGF0Y2hfdG9fYnVnKHNlbGYsIGJ1Z19pZCwgcGF0Y2hfZmlsZV9vYmplY3QsIGRl
c2NyaXB0aW9uLCBjb21tZW50X3RleHQgPSBOb25lLCBtYXJrX2Zvcl9yZXZpZXcgPSBGYWxzZSk6
CisgICAgICAgIHNlbGYuYXV0aGVudGljYXRlKCkKKyAgICAgICAgCisgICAgICAgIGxvZygiQWRk
aW5nIHBhdGNoIFwiJXNcIiB0byBidWcgJXMiICUgKGRlc2NyaXB0aW9uLCBidWdfaWQpKQorICAg
ICAgICBpZiBzZWxmLmRyeXJ1bjoKKyAgICAgICAgICAgIGxvZyhjb21tZW50X3RleHQpCisgICAg
ICAgICAgICByZXR1cm4KKyAgICAgICAgCisgICAgICAgIHNlbGYuYnIub3BlbihzZWxmLmJ1Z19z
ZXJ2ZXIgKyAiL2F0dGFjaG1lbnQuY2dpP2FjdGlvbj1lbnRlciZidWdpZD0iICsgYnVnX2lkKQor
ICAgICAgICBzZWxmLmJyLnNlbGVjdF9mb3JtKG5hbWU9ImVudHJ5Zm9ybSIpCisgICAgICAgIHNl
bGYuYnJbJ2Rlc2NyaXB0aW9uJ10gPSBkZXNjcmlwdGlvbgorICAgICAgICBzZWxmLmJyWydpc3Bh
dGNoJ10gPSAoIjEiLCkKKyAgICAgICAgaWYgKGNvbW1lbnRfdGV4dCk6CisgICAgICAgICAgICBs
b2coY29tbWVudF90ZXh0KQorICAgICAgICAgICAgc2VsZi5iclsnY29tbWVudCddID0gY29tbWVu
dF90ZXh0CisgICAgICAgIHNlbGYuYnJbJ2ZsYWdfdHlwZS0xJ10gPSAoJz8nLCkgaWYgbWFya19m
b3JfcmV2aWV3IGVsc2UgKCdYJywpCisgICAgICAgIHNlbGYuYnIuYWRkX2ZpbGUocGF0Y2hfZmls
ZV9vYmplY3QsICJ0ZXh0L3BsYWluIiwgImJ1Z3ppbGxhX3JlcXVpcmVzX2FfZmlsZW5hbWUucGF0
Y2giKQorICAgICAgICBzZWxmLmJyLnN1Ym1pdCgpCisKKyAgICBkZWYgb2Jzb2xldGVfYXR0YWNo
bWVudChzZWxmLCBhdHRhY2htZW50X2lkLCBjb21tZW50X3RleHQgPSBOb25lKToKKyAgICAgICAg
c2VsZi5hdXRoZW50aWNhdGUoKQorCisgICAgICAgIGxvZygiT2Jzb2xldGluZyBhdHRhY2htZW50
OiAlcyIgJSAoYXR0YWNobWVudF9pZCwpKQorICAgICAgICBpZiBzZWxmLmRyeXJ1bjoKKyAgICAg
ICAgICAgIGxvZyhjb21tZW50X3RleHQpCisgICAgICAgICAgICByZXR1cm4KKworICAgICAgICBz
ZWxmLmJyLm9wZW4oc2VsZi5hdHRhY2htZW50X3VybF9mb3JfaWQoYXR0YWNobWVudF9pZCwgJ2Vk
aXQnKSkKKyAgICAgICAgc2VsZi5ici5zZWxlY3RfZm9ybShucj0wKQorICAgICAgICBzZWxmLmJy
LmZpbmRfY29udHJvbCgnaXNvYnNvbGV0ZScpLml0ZW1zWzBdLnNlbGVjdGVkID0gVHJ1ZQorICAg
ICAgICAjIEFsc28gY2xlYXIgYW55IHJldmlldyBmbGFnICh0byByZW1vdmUgaXQgZnJvbSByZXZp
ZXcvY29tbWl0IHF1ZXVlcykKKyAgICAgICAgc2VsZi5ici5maW5kX2NvbnRyb2wodHlwZT0nc2Vs
ZWN0JywgbnI9MCkudmFsdWUgPSAoIlgiLCkKKyAgICAgICAgaWYgY29tbWVudF90ZXh0OgorICAg
ICAgICAgICAgbG9nKGNvbW1lbnRfdGV4dCkKKyAgICAgICAgICAgIHNlbGYuYnJbJ2NvbW1lbnQn
XSA9IGNvbW1lbnRfdGV4dAorICAgICAgICBzZWxmLmJyLnN1Ym1pdCgpCisgICAgCisgICAgZGVm
IHBvc3RfY29tbWVudF90b19idWcoc2VsZiwgYnVnX2lkLCBjb21tZW50X3RleHQpOgorICAgICAg
ICBzZWxmLmF1dGhlbnRpY2F0ZSgpCisKKyAgICAgICAgbG9nKCJBZGRpbmcgY29tbWVudCB0byBi
dWcgJXMiICUgKGJ1Z19pZCwpKQorICAgICAgICBpZiBzZWxmLmRyeXJ1bjoKKyAgICAgICAgICAg
IGxvZyhjb21tZW50X3RleHQpCisgICAgICAgICAgICByZXR1cm4KKworICAgICAgICBzZWxmLmJy
Lm9wZW4oc2VsZi5idWdfdXJsX2Zvcl9idWdfaWQoYnVnX2lkKSkKKyAgICAgICAgc2VsZi5ici5z
ZWxlY3RfZm9ybShuYW1lPSJjaGFuZ2Vmb3JtIikKKyAgICAgICAgc2VsZi5iclsnY29tbWVudCdd
ID0gY29tbWVudF90ZXh0CisgICAgICAgIHNlbGYuYnIuc3VibWl0KCkKKworICAgIGRlZiBjbG9z
ZV9idWdfYXNfZml4ZWQoc2VsZiwgYnVnX2lkLCBjb21tZW50X3RleHQgPSBOb25lKToKKyAgICAg
ICAgc2VsZi5hdXRoZW50aWNhdGUoKQorCisgICAgICAgIGxvZygiQ2xvc2luZyBidWcgJXMgYXMg
Zml4ZWQiICUgKGJ1Z19pZCwpKQorICAgICAgICBpZiBzZWxmLmRyeXJ1bjoKKyAgICAgICAgICAg
IGxvZyhjb21tZW50X3RleHQpCisgICAgICAgICAgICByZXR1cm4KKworICAgICAgICBzZWxmLmJy
Lm9wZW4oc2VsZi5idWdfdXJsX2Zvcl9idWdfaWQoYnVnX2lkKSkKKyAgICAgICAgc2VsZi5ici5z
ZWxlY3RfZm9ybShuYW1lPSJjaGFuZ2Vmb3JtIikKKyAgICAgICAgaWYgY29tbWVudF90ZXh0Ogor
ICAgICAgICAgICAgbG9nKGNvbW1lbnRfdGV4dCkKKyAgICAgICAgICAgIHNlbGYuYnJbJ2NvbW1l
bnQnXSA9IGNvbW1lbnRfdGV4dAorICAgICAgICBzZWxmLmJyWydrbm9iJ10gPSBbJ3Jlc29sdmUn
XQorICAgICAgICBzZWxmLmJyWydyZXNvbHV0aW9uJ10gPSBbJ0ZJWEVEJ10KKyAgICAgICAgc2Vs
Zi5ici5zdWJtaXQoKQpkaWZmIC0tZ2l0IGEvV2ViS2l0VG9vbHMvU2NyaXB0cy9tb2R1bGVzL3Nj
bS5weSBiL1dlYktpdFRvb2xzL1NjcmlwdHMvbW9kdWxlcy9zY20ucHkKbmV3IGZpbGUgbW9kZSAx
MDA2NDQKaW5kZXggMDAwMDAwMC4uNjNhZmQ0NQotLS0gL2Rldi9udWxsCisrKyBiL1dlYktpdFRv
b2xzL1NjcmlwdHMvbW9kdWxlcy9zY20ucHkKQEAgLTAsMCArMSwyNzkgQEAKKyMgQ29weXJpZ2h0
IChDKSAyMDA5IEdvb2dsZSwgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyMKKyMgUmVkaXN0
cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRo
b3V0CisjIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xs
b3dpbmcgY29uZGl0aW9ucworIyBhcmUgbWV0OgorIyAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291
cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorIyAgICBub3RpY2UsIHRo
aXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisjIDIu
IFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUg
Y29weXJpZ2h0CisjICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBm
b2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyMgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3Ro
ZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyMKKyMgVEhJUyBT
T0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBDT01QVVRFUiwgSU5DLiBgYEFTIElTJycgQU5E
IEFOWQorIyBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9U
IExJTUlURUQgVE8sIFRIRQorIyBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZ
IEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyMgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4g
IElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIENPTVBVVEVSLCBJTkMuIE9SCisjIENPTlRSSUJVVE9S
UyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFM
LAorIyBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQg
Tk9UIExJTUlURUQgVE8sCisjIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VS
VklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorIyBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRF
UlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisjIE9GIExJQUJJTElU
WSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorIyAoSU5D
TFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9G
IFRIRSBVU0UKKyMgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NT
SUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyMKKyMgUHl0aG9uIG1vZHVsZSBmb3IgaW50ZXJhY3Rp
bmcgd2l0aCBhbiBTQ00gc3lzdGVtIChsaWtlIFNWTiBvciBHaXQpCisKK2ltcG9ydCBvcworaW1w
b3J0IHJlCitpbXBvcnQgc3VicHJvY2VzcworaW1wb3J0IHN5cworCitkZWYgbG9nKHN0cmluZyk6
CisgICAgcHJpbnQgPj4gc3lzLnN0ZGVyciwgc3RyaW5nCisKK2RlZiBlcnJvcihzdHJpbmcpOgor
ICAgIGxvZyhzdHJpbmcpCisgICAgZXhpdCgxKQorCitkZWYgZGV0ZWN0X3NjbV9zeXN0ZW0ocGF0
aCk6CisgICAgIyBGSVhNRTogVGhlc2UgY2hlY2tzIHNob3VsZCBiZSBjb250YWluZWQgaW4gdGhl
IFNWTiBhbmQgR2l0IGNsYXNzZXMuLi4KKyAgICBpZiBvcy5wYXRoLmlzZGlyKG9zLnBhdGguam9p
bihwYXRoLCAnLnN2bicpKToKKyAgICAgICAgcmV0dXJuIFNWTigpCisgICAgCisgICAgaWYgb3Mu
c3lzdGVtKCJjZCAiICsgcGF0aCArICIgJiYgZ2l0IHJldi1wYXJzZSA+IC9kZXYvbnVsbCAyPiYx
IikgPT0gMDoKKyAgICAgICAgcmV0dXJuIEdpdCgpCisgICAgCisgICAgZXJyb3IoIlRoZSBjdXJy
ZW50IGRpcmVjdG9yeSBkb2VzIG5vdCBhcHBlYXIgdG8gYmUgYSB2YWxpZCBXZWJLaXQgY2hlY2tv
dXQiKQorCitjbGFzcyBTY3JpcHRFcnJvcihFeGNlcHRpb24pOgorICAgIHBhc3MKKworY2xhc3Mg
U0NNOgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBkcnlydW4gPSBGYWxzZSk6CisgICAgICAgIHNl
bGYuZHJ5cnVuID0gZHJ5cnVuCisKKyAgICBkZWYgcnVuX2NvbW1hbmQoY29tbWFuZCk6CisgICAg
ICAgIHJldHVybiBzdWJwcm9jZXNzLlBvcGVuKGNvbW1hbmQsIHN0ZG91dD1zdWJwcm9jZXNzLlBJ
UEUsIHNoZWxsPVRydWUpLmNvbW11bmljYXRlKClbMF0KKworICAgIGRlZiBlbnN1cmVfY2xlYW5f
d29ya2luZ19kaXJlY3Rvcnkoc2VsZiwgZm9yY2UsIGFsbG93X2xvY2FsX2NvbW1pdHMgPSBGYWxz
ZSk6CisgICAgICAgIGlmIG5vdCBmb3JjZSBhbmQgbm90IHNlbGYud29ya2luZ19kaXJlY3Rvcnlf
aXNfY2xlYW4oKToKKyAgICAgICAgICAgIGxvZygiV29ya2luZyBkaXJlY3RvcnkgaGFzIG1vZGlm
aWNhdGlvbnMsIHBhc3MgLS1mb3JjZS1jbGVhbiBvciAtLW5vLWNsZWFuIHRvIGNvbnRpbnVlLiIp
CisgICAgICAgICAgICBvcy5zeXN0ZW0oc2VsZi5zdGF0dXNfY29tbWFuZCgpKQorICAgICAgICAg
ICAgZXhpdCgxKQorICAgICAgICAKKyAgICAgICAgbG9nKCJDbGVhbmluZyB0aGUgd29ya2luZyBk
aXJlY3RvcnkiKQorICAgICAgICBzZWxmLmNsZWFuX3dvcmtpbmdfZGlyZWN0b3J5KGRpc2NhcmRf
bG9jYWxfY29tbWl0cyA9IG5vdCBhbGxvd19sb2NhbF9jb21taXRzKQorICAgIAorICAgIGRlZiBl
bnN1cmVfbm9fbG9jYWxfY29tbWl0cyhzZWxmLCBmb3JjZSk6CisgICAgICAgIGlmIG5vdCBzZWxm
LnN1cHBvcnRzX2xvY2FsX2NvbW1pdHMoKToKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBj
b21taXRzID0gc2VsZi5sb2NhbF9jb21taXRzKCkKKyAgICAgICAgaWYgbGVuKGNvbW1pdHMpID09
IDA6CisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgaWYgbm90IGZvcmNlOgorICAgICAgICAg
ICAgbG9nKCJXb3JraW5nIGRpcmVjdG9yeSBoYXMgbG9jYWwgY29tbWl0cywgcGFzcyAtLWZvcmNl
LWNsZWFuIHRvIGNvbnRpbnVlLiIpCisgICAgICAgICAgICBleGl0KDEpCisgICAgICAgIHNlbGYu
ZGlzY2FyZF9sb2NhbF9jb21taXRzKCkKKworICAgIGRlZiBhcHBseV9wYXRjaChzZWxmLCBwYXRj
aCk6CisgICAgICAgICMgSXQncyBwb3NzaWJsZSB0aGF0IHRoZSBwYXRjaCB3YXMgbm90IG1hZGUg
ZnJvbSB0aGUgcm9vdCBkaXJlY3RvcnkKKyAgICAgICAgIyB3ZSBzaG91bGQgZGV0ZWN0IGFuZCBo
YW5kbGUgdGhhdCBjYXNlLgorICAgICAgICByZXR1cm5fY29kZSA9IG9zLnN5c3RlbSgiY3VybCAi
ICsgcGF0Y2hbJ3VybCddICsgIiB8IHN2bi1hcHBseSAtLXJldmlld2VyIFwiIiArIHBhdGNoWydy
ZXZpZXdlciddICsgIlwiIikKKyAgICAgICAgaWYgKHJldHVybl9jb2RlICE9IDApOgorICAgICAg
ICAgICAgcmFpc2UgU2NyaXB0RXJyb3IoIlBhdGNoICIgKyBwYXRjaFsndXJsJ10gKyAiIGZhaWxl
ZCB0byBkb3dubG9hZCBhbmQgYXBwbHkuIikKKworICAgICMgSXQncyBzbGlnaHRseSBoYWNreSB0
byBzaGFyZSB0aGlzIGNvZGUsIHNpbmNlIHRoZXJlIGFyZSBpbXBsaWNpdCBhc3N1bXB0aW9ucyBh
Ym91dCB0aGUgcmVnZXhwIGZvcm1hdAorICAgIGRlZiBydW5fc3RhdHVzX2FuZF9leHRyYWN0X2Zp
bGVuYW1lcyhzZWxmLCBzdGF0dXNfY29tbWFuZCwgc3RhdHVzX3JlZ2V4cCk6CisgICAgICAgIGZp
bGVfbmFtZXMgPSBbXQorICAgICAgICBmb3IgbGluZSBpbiBvcy5wb3BlbihzdGF0dXNfY29tbWFu
ZCkucmVhZGxpbmVzKCk6CisgICAgICAgICAgICBtYXRjaCA9IHJlLnNlYXJjaChzdGF0dXNfcmVn
ZXhwLCBsaW5lKQorICAgICAgICAgICAgaWYgbm90IG1hdGNoOgorICAgICAgICAgICAgICAgIGNv
bnRpbnVlCisgICAgICAgICAgICAjIHN0YXR1cyA9IG1hdGNoLmdyb3VwKDEpCisgICAgICAgICAg
ICBmaWxlX25hbWUgPSBtYXRjaC5ncm91cCgyKQorICAgICAgICAgICAgZmlsZV9uYW1lcy5hcHBl
bmQoZmlsZV9uYW1lKQorICAgICAgICByZXR1cm4gZmlsZV9uYW1lcworCisgICAgZGVmIHdvcmtp
bmdfZGlyZWN0b3J5X2lzX2NsZWFuKHNlbGYpOgorICAgICAgICByYWlzZSBOb3RJbXBsZW1lbnRl
ZEVycm9yLCAic3ViY2xhc3NlcyBtdXN0IGltcGxlbWVudCIKKworICAgIGRlZiBjbGVhbl93b3Jr
aW5nX2RpcmVjdG9yeShzZWxmKToKKyAgICAgICAgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvciwg
InN1YmNsYXNzZXMgbXVzdCBpbXBsZW1lbnQiCisKKyAgICBkZWYgdXBkYXRlX3dlYmtpdChzZWxm
KToKKyAgICAgICAgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvciwgInN1YmNsYXNzZXMgbXVzdCBp
bXBsZW1lbnQiCisKKyAgICBkZWYgc3RhdHVzX2NvbW1hbmQoc2VsZik6CisgICAgICAgIHJhaXNl
IE5vdEltcGxlbWVudGVkRXJyb3IsICJzdWJjbGFzc2VzIG11c3QgaW1wbGVtZW50IgorCisgICAg
ZGVmIGNoYW5nZWRfZmlsZXMoc2VsZik6CisgICAgICAgIHJhaXNlIE5vdEltcGxlbWVudGVkRXJy
b3IsICJzdWJjbGFzc2VzIG11c3QgaW1wbGVtZW50IgorCisgICAgZGVmIGRpc3BsYXlfbmFtZShz
ZWxmKToKKyAgICAgICAgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvciwgInN1YmNsYXNzZXMgbXVz
dCBpbXBsZW1lbnQiCisKKyAgICBkZWYgY3JlYXRlX3BhdGNoX2NvbW1hbmQoc2VsZik6CisgICAg
ICAgIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IsICJzdWJjbGFzc2VzIG11c3QgaW1wbGVtZW50
IgorCisgICAgZGVmIGNvbW1pdF93aXRoX21lc3NhZ2Uoc2VsZiwgbWVzc2FnZSk6CisgICAgICAg
IHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IsICJzdWJjbGFzc2VzIG11c3QgaW1wbGVtZW50Igor
ICAgIAorICAgICMgU3ViY2xhc3NlcyBtdXN0IGluZGljYXRlIGlmIHRoZXkgc3VwcG9ydCBsb2Nh
bCBjb21taXRzCisgICAgIyBidXQgdGhlIFNDTSBiYXNlY2xhc3Mgd2lsbCBvbmx5IGNhbGwgbG9j
YWxfY29tbWl0cyBtZXRob2RzIHdoZW4gdGhpcyBpcyB0cnVlCisgICAgZGVmIHN1cHBvcnRzX2xv
Y2FsX2NvbW1pdHMoc2VsZik6CisgICAgICAgIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IsICJz
dWJjbGFzc2VzIG11c3QgaW1wbGVtZW50IgorCisgICAgZGVmIGRpc2NhcmRfbG9jYWxfY29tbWl0
cyhzZWxmKToKKyAgICAgICAgcGFzcworCisgICAgZGVmIGxvY2FsX2NvbW1pdHMoc2VsZik6Cisg
ICAgICAgIHJldHVybiBbXQorCitjbGFzcyBTVk4gKFNDTSk6CisgICAgZGVmIF9faW5pdF9fKHNl
bGYsIGRyeXJ1biA9IEZhbHNlKToKKyAgICAgICAgU0NNLl9faW5pdF9fKHNlbGYsIGRyeXJ1bikK
KyAgICAKKyAgICBkZWYgc3ZuX3ZlcnNpb24oc2VsZik6CisgICAgICAgIGlmIG5vdCBzZWxmLmNh
Y2hlZF92ZXJzaW9uOgorICAgICAgICAgICAgc2VsZi5jYWNoZWRfdmVyc2lvbiA9IHN1YnByb2Nl
c3MuUG9wZW4oInN2biAtLXZlcnNpb24gLS1xdWlldCIsIHN0ZG91dD1zdWJwcm9jZXNzLlBJUEUs
IHNoZWxsPVRydWUpLmNvbW11bmljYXRlKClbMF0KKyAgICAgICAgCisgICAgICAgIHJldHVybiBz
ZWxmLmNhY2hlZF92ZXJzaW9uCisKKyAgICBkZWYgd29ya2luZ19kaXJlY3RvcnlfaXNfY2xlYW4o
c2VsZik6CisgICAgICAgIGRpZmZfcHJvY2VzcyA9IHN1YnByb2Nlc3MuUG9wZW4oInN2biBkaWZm
Iiwgc3Rkb3V0PXN1YnByb2Nlc3MuUElQRSwgc2hlbGw9VHJ1ZSkKKyAgICAgICAgZGlmZl9vdXRw
dXQgPSBkaWZmX3Byb2Nlc3MuY29tbXVuaWNhdGUoKVswXQorICAgICAgICBpZiBkaWZfcHJvY2Vz
cy53YWl0KCkgIT0gMDoKKyAgICAgICAgICAgIGxvZygiRmFpbGVkIHRvIHJ1biBzdm4gZGlmZiIp
CisgICAgICAgICAgICByZXR1cm4gRmFsc2UKKyAgICAgICAgcmV0dXJuIGRpZmZfb3V0cHV0ID09
ICIiCisKKyAgICBkZWYgY2xlYW5fd29ya2luZ19kaXJlY3Rvcnkoc2VsZik6CisgICAgICAgIG9z
LnN5c3RlbSgic3ZuIHJlc2V0IC1SIikKKworICAgIGRlZiB1cGRhdGVfd2Via2l0KHNlbGYpOgor
ICAgICAgICBvcy5zeXN0ZW0oInVwZGF0ZS13ZWJraXQiKQorCisgICAgZGVmIHN0YXR1c19jb21t
YW5kKHNlbGYpOgorICAgICAgICByZXR1cm4gJ3N2biBzdGF0dXMnCisKKyAgICBkZWYgY2hhbmdl
ZF9maWxlcyhzZWxmKToKKyAgICAgICAgc3RhdHVzX3JlZ2V4cCA9ICJeKFtBQ0RNUl0pLns2fSAo
LispJCIgaWYgc2VsZi5zdm5fdmVyc2lvbigpID4gIjEuNiIgZWxzZSAiXihbQUNETVJdKS57NX0g
KC4rKSQiCisgICAgICAgIHJldHVybiBzZWxmLnJ1bl9zdGF0dXNfYW5kX2V4dHJhY3RfZmlsZW5h
bWVzKHNlbGYuc3RhdHVzX2NvbW1hbmQoKSwgc3RhdHVzX3JlZ2V4cCkKKworICAgIGRlZiBzdXBw
b3J0c19sb2NhbF9jb21taXRzKHNlbGYpOgorICAgICAgICByZXR1cm4gRmFsc2UKKworICAgIGRl
ZiBkaXNwbGF5X25hbWUoc2VsZik6CisgICAgICAgIHJldHVybiAic3ZuIgorCisgICAgZGVmIGNy
ZWF0ZV9wYXRjaF9jb21tYW5kKHNlbGYpOgorICAgICAgICByZXR1cm4gInN2bi1jcmVhdGUtcGF0
Y2giCisKKyAgICBkZWYgY29tbWl0X3dpdGhfbWVzc2FnZShzZWxmLCBtZXNzYWdlKToKKyAgICAg
ICAgY29tbWl0X3Byb2Nlc3MgPSBzdWJwcm9jZXNzLlBvcGVuKCdzdm4gY29tbWl0IC1GIC0nLCBz
dGRpbj1zdWJwcm9jZXNzLlBJUEUsIHNoZWxsPVRydWUpCisgICAgICAgIGNvbW1pdF9wcm9jZXNz
LmNvbW11bmljYXRlKG1lc3NhZ2UpCisKKyMgQWxsIGdpdC1zcGVjaWZpYyBsb2dpYyBzaG91bGQg
Z28gaGVyZS4KK2NsYXNzIEdpdCAoU0NNKToKKyAgICBkZWYgX19pbml0X18oc2VsZiwgZHJ5cnVu
ID0gRmFsc2UpOgorICAgICAgICBTQ00uX19pbml0X18oc2VsZiwgZHJ5cnVuKQorICAgIAorICAg
IGRlZiBkaXNjYXJkX2xvY2FsX2NvbW1pdHMoc2VsZik6CisgICAgICAgIG9zLnN5c3RlbSgiZ2l0
IHJlc2V0IC0taGFyZCB0cnVuayIpCisgICAgCisgICAgZGVmIGxvY2FsX2NvbW1pdHMoc2VsZik6
CisgICAgICAgIHN1YnByb2Nlc3MuUG9wZW4oImdpdCBsb2cgLS1wcmV0dHk9b25lbGluZSBoZWFk
Li4udHJ1bmsiLCBzdGRvdXQ9c3VicHJvY2Vzcy5QSVBFLCBzaGVsbD1UcnVlKS5jb21tdW5pY2F0
ZSgpWzBdLnNwbGl0bGluZXMoKQorICAgIAorICAgIGRlZiB3b3JraW5nX2RpcmVjdG9yeV9pc19j
bGVhbihzZWxmKToKKyAgICAgICAgZGlmZl9wcm9jZXNzID0gc3VicHJvY2Vzcy5Qb3BlbigiZ2l0
IGRpZmYtaW5kZXggaGVhZCIsIHN0ZG91dD1zdWJwcm9jZXNzLlBJUEUsIHNoZWxsPVRydWUpCisg
ICAgICAgIGRpZmZfb3V0cHV0ID0gZGlmZl9wcm9jZXNzLmNvbW11bmljYXRlKClbMF0KKyAgICAg
ICAgaWYgZGlmX3Byb2Nlc3Mud2FpdCgpICE9IDA6CisgICAgICAgICAgICBsb2coIkZhaWxlZCB0
byBydW4gZ2l0IGRpZmYtaW5kZXggaGVhZCIpCisgICAgICAgICAgICByZXR1cm4gRmFsc2UKKyAg
ICAgICAgcmV0dXJuIGRpZmZfb3V0cHV0ID09ICIiCisgICAgCisgICAgZGVmIGNsZWFuX3dvcmtp
bmdfZGlyZWN0b3J5KHNlbGYpOgorICAgICAgICBvcy5zeXN0ZW0oImdpdCByZXNldCAtLWhhcmQg
aGVhZCIpCisgICAgICAgICMgQ291bGQgcnVuIGdpdCBjbGVhbiBoZXJlIHRvbywgYnV0IHRoYXQg
d291bGRuJ3QgbWF0Y2ggd29ya2luZ19kaXJlY3RvcnlfaXNfY2xlYW4KKyAgICAKKyAgICBkZWYg
dXBkYXRlX3dlYmtpdChzZWxmKToKKyAgICAgICAgIyBGSVhNRTogU2hvdWxkIHByb2JhYmx5IGNh
bGwgdXBkYXRlLXdlYmtpdCwgbm8/CisgICAgICAgIGxvZygiVXBkYXRpbmcgd29ya2luZyBkaXJl
Y3RvcnkiKQorICAgICAgICBvcy5zeXN0ZW0oImdpdCBzdm4gcmViYXNlIikKKworICAgIGRlZiBz
dGF0dXNfY29tbWFuZChzZWxmKToKKyAgICAgICAgcmV0dXJuICdnaXQgc3RhdHVzJworCisgICAg
ZGVmIGNoYW5nZWRfZmlsZXMoc2VsZik6CisgICAgICAgIHN0YXR1c19jb21tYW5kID0gJ2dpdCBk
aWZmIC1yIC0tbmFtZS1zdGF0dXMgLUMgLUMgLU0nCisgICAgICAgIHN0YXR1c19yZWdleHAgPSAn
XihbQURNXSlcdCguKykkJworICAgICAgICByZXR1cm4gc2VsZi5ydW5fc3RhdHVzX2FuZF9leHRy
YWN0X2ZpbGVuYW1lcyhzdGF0dXNfY29tbWFuZCwgc3RhdHVzX3JlZ2V4cCkKKyAgICAKKyAgICBk
ZWYgc3VwcG9ydHNfbG9jYWxfY29tbWl0cyhzZWxmKToKKyAgICAgICAgcmV0dXJuIFRydWUKKwor
ICAgIGRlZiBkaXNwbGF5X25hbWUoc2VsZik6CisgICAgICAgIHJldHVybiAiZ2l0IgorCisgICAg
ZGVmIGNyZWF0ZV9wYXRjaF9jb21tYW5kKHNlbGYpOgorICAgICAgICByZXR1cm4gImdpdCBkaWZm
IGhlYWQiCisKKyAgICBkZWYgY29tbWl0X3dpdGhfbWVzc2FnZShzZWxmLCBtZXNzYWdlKToKKyAg
ICAgICAgc2VsZi5jb21taXRfbG9jYWxseV93aXRoX21lc3NhZ2UobWVzc2FnZSkKKyAgICAgICAg
c2VsZi5wdXNoX2xvY2FsX2NvbW1pdHNfdG9fc2VydmVyKCkKKworICAgICMgR2l0LXNwZWNpZmlj
IG1ldGhvZHM6CisgICAgCisgICAgZGVmIGNvbW1pdF9sb2NhbGx5X3dpdGhfbWVzc2FnZShzZWxm
LCBtZXNzYWdlKToKKyAgICAgICAgY29tbWl0X3Byb2Nlc3MgPSBzdWJwcm9jZXNzLlBvcGVuKCdn
aXQgY29tbWl0IC1hIC1GIC0nLCBzdGRpbj1zdWJwcm9jZXNzLlBJUEUsIHNoZWxsPVRydWUpCisg
ICAgICAgIGNvbW1pdF9wcm9jZXNzLmNvbW11bmljYXRlKG1lc3NhZ2UpCisgICAgICAgIAorICAg
IGRlZiBwdXNoX2xvY2FsX2NvbW1pdHNfdG9fc2VydmVyKHNlbGYpOgorICAgICAgICBpZiBzZWxm
LmRyeXJ1bjoKKyAgICAgICAgICAgIHJldHVybiAiRHJ5IHJ1biwgbm8gcmVtb3RlIGNvbW1pdC4i
CisgICAgICAgIGNvbW1pdF9wcm9jZXNzID0gc3VicHJvY2Vzcy5Qb3BlbignZ2l0IHN2biBkY29t
bWl0Jywgc3Rkb3V0PXN1YnByb2Nlc3MuUElQRSwgc2hlbGw9VHJ1ZSkKKyAgICAgICAgKG91dCwg
ZXJyb3IpID0gY29tbWl0X3Byb2Nlc3MuY29tbXVuaWNhdGUoKQorICAgICAgICByZXR1cm5fY29k
ZSA9IGNvbW1pdF9wcm9jZXNzLndhaXQoKQorICAgICAgICBsb2coIkNvbW1pdCBmYWlsdXJlOiAi
ICsgcmV0dXJuX2NvZGUpICMgV2UgcmVhbGx5IHNob3VsZCBoYW5kbGUgdGhlIGZhaWx1cmUKKyAg
ICAgICAgcmV0dXJuIG91dAorICAgIAorCisgICAgZGVmIGNvbW1pdF9pZHNfZnJvbV9yYW5nZV9h
cmd1bWVudHMoc2VsZiwgYXJncywgY2hlcnJ5X3BpY2sgPSBGYWxzZSk6CisgICAgICAgICMgRmly
c3QgZ2V0IHRoZSBjb21taXQtaWRzIGZvciB0aGUgcGFzc2VkIGluIHJldmlzaW9ucworICAgICAg
ICByZXZfcGFyc2VfYXJncyA9IFsnZ2l0JywgJ3Jldi1wYXJzZScsICctLXJldnMtb25seSddCisg
ICAgICAgIHJldl9wYXJzZV9hcmdzLmV4dGVuZChhcmdzKQorICAgICAgICByZXZfcGFyc2VfcHJv
Y2VzcyA9IHN1YnByb2Nlc3MuUG9wZW4oIiAiLmpvaW4ocmV2X3BhcnNlX2FyZ3MpLCBzdGRvdXQ9
c3VicHJvY2Vzcy5QSVBFLCBzaGVsbD1UcnVlKQorICAgICAgICByZXZpc2lvbnMgPSByZXZfcGFy
c2VfcHJvY2Vzcy5jb21tdW5pY2F0ZSgpWzBdLnNwbGl0bGluZXMoKQorICAgICAgICAKKyAgICAg
ICAgaWYgY2hlcnJ5X3BpY2s6CisgICAgICAgICAgICByZXR1cm4gcmV2aXNpb25zCisgICAgICAg
IAorICAgICAgICAjIElmIG5vdCBjaGVycnktcGlja2luZyBhbmQgb25seSBwYXNzZWQgb25lIHJl
dmlzaW9uLCBhc3N1bWUgIl5yZXZpc2lvbiBoZWFkIiBha2EgInJldmlzaW9uLi5oZWFkIgorICAg
ICAgICBpZiBsZW4ocmV2aXNpb25zKSA8IDI6CisgICAgICAgICAgICByZXZpc2lvbnNbMF0gPSAi
XiIgKyByZXZpc2lvbnNbMF0KKyAgICAgICAgICAgIHJldmlzaW9ucy5hcHBlbmQoImhlYWQiKQor
ICAgICAgICAKKyAgICAgICAgcmV2X2xpc3RfYXJncyA9IFsnZ2l0JywgJ3Jldi1saXN0J10KKyAg
ICAgICAgcmV2X2xpc3RfYXJncy5leHRlbmQocmV2aXNpb25zKQorICAgICAgICByZXZfbGlzdF9w
cm9jZXNzID0gc3VicHJvY2Vzcy5Qb3BlbigiICIuam9pbihyZXZfbGlzdF9hcmdzKSwgc3Rkb3V0
PXN1YnByb2Nlc3MuUElQRSwgc2hlbGw9VHJ1ZSkKKyAgICAgICAgcmV0dXJuIHJldl9saXN0X3By
b2Nlc3MuY29tbXVuaWNhdGUoKVswXS5zcGxpdGxpbmVzKCkKKworICAgIGRlZiBjb21taXRfbWVz
c2FnZV9mb3JfY29tbWl0KHNlbGYsIGNvbW1pdF9pZCk6CisgICAgICAgIGNvbW1pdF9tZXNzYWdl
X3Byb2Nlc3MgPSBzdWJwcm9jZXNzLlBvcGVuKCJnaXQgY2F0LWZpbGUgY29tbWl0ICIgKyBjb21t
aXRfaWQsIHN0ZG91dD1zdWJwcm9jZXNzLlBJUEUsIHNoZWxsPVRydWUpCisgICAgICAgIGNvbW1p
dF9tZXNzYWdlID0gY29tbWl0X21lc3NhZ2VfcHJvY2Vzcy5jb21tdW5pY2F0ZSgpWzBdCisgICAg
ICAgIGNvbW1pdF9saW5lcyA9IGNvbW1pdF9tZXNzYWdlLnNwbGl0bGluZXMoKQorCisgICAgICAg
ICMgc2tpcCB0aGUgaGVhZGVycworICAgICAgICBmaXJzdF9saW5lX2FmdGVyX2hlYWRlcnMgPSAw
CisgICAgICAgIGZvciBsaW5lIGluIGNvbW1pdF9saW5lczoKKyAgICAgICAgICAgIGZpcnN0X2xp
bmVfYWZ0ZXJfaGVhZGVycyArPSAxCisgICAgICAgICAgICBpZiBsaW5lID09ICIiOgorICAgICAg
ICAgICAgICAgIGJyZWFrCisgICAgICAgIHJldHVybiAiXG4iLmpvaW4oY29tbWl0X2xpbmVzW2Zp
cnN0X2xpbmVfYWZ0ZXJfaGVhZGVyczpdKQorCisgICAgZGVmIHNob3dfZGlmZl9jb21tYW5kX2Zv
cl9jb21taXQoc2VsZiwgY29tbWl0X2lkKToKKyAgICAgICAgcmV0dXJuICJnaXQgZGlmZi10cmVl
IC1wICIgKyBjb21taXRfaWQKKworICAgIGRlZiBmaWxlc19jaGFuZ2VkX3N1bW1hcnlfZm9yX2Nv
bW1pdChzZWxmLCBjb21taXRfaWQpOgorICAgICAgICByZXR1cm4gc3VicHJvY2Vzcy5Qb3Blbigi
Z2l0IGRpZmYtdHJlZSAtLXNob3J0c3RhdCAtLW5vLWNvbW1pdC1pZCAiICsgY29tbWl0X2lkLCBz
dGRvdXQ9c3VicHJvY2Vzcy5QSVBFLCBzaGVsbD1UcnVlKS5jb21tdW5pY2F0ZSgpWzBdCisK
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>31676</attachid>
            <date>2009-06-22 14:39:32 -0700</date>
            <delta_ts>2009-06-22 17:24:10 -0700</delta_ts>
            <desc>Updated to respect the current working directory instead of using ../..</desc>
            <filename>bugzilla_requires_a_filename.patch</filename>
            <type>text/plain</type>
            <size>46229</size>
            <attacher name="Eric Seidel (no email)">eric</attacher>
            
              <data encoding="base64">ZGMyNzBhODgxNDQzYmUyMjVhZGU4ODgyYjc4ZTZlZDdhOTViMzNlMApkaWZmIC0tZ2l0IGEvV2Vi
S2l0VG9vbHMvQ2hhbmdlTG9nIGIvV2ViS2l0VG9vbHMvQ2hhbmdlTG9nCmluZGV4IDE0OTM3YTYu
LjU4ODViYzAgMTAwNjQ0Ci0tLSBhL1dlYktpdFRvb2xzL0NoYW5nZUxvZworKysgYi9XZWJLaXRU
b29scy9DaGFuZ2VMb2cKQEAgLTEsMyArMSw1OCBAQAorMjAwOS0wNi0xOCAgRXJpYyBTZWlkZWwg
IDxlcmljQHdlYmtpdC5vcmc+CisKKyAgICAgICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChPT1BTISku
CisKKyAgICAgICAgV2ViS2l0IG5lZWRzIGEgc2NyaXB0IHRvIGludGVyYWN0IHdpdGggYnVnemls
bGEgYW5kIGF1dG9tYXRlCisgICAgICAgIHBhcnRzIG9mIHRoZSBwYXRjaCBwb3N0aW5nIGFuZCBj
b21taXQgcHJvY2Vzc2VzLgorICAgICAgICBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1
Zy5jZ2k/aWQ9MjYyODMKKworICAgICAgICBUaGlzIGlzIHJlYWxseSBhIGZpcnN0LWRyYWZ0IHRv
b2wuCisgICAgICAgIEl0J3MgdG8gdGhlIHBvaW50IHdoZXJlIGl0J3MgdXNlZnVsIHRvIG1vcmUg
cGVvcGxlIHRoYW4ganVzdCBtZSBub3cgdGhvdWdoLgorICAgICAgICBHaXQgc3VwcG9ydCB3b3Jr
cy4gIFNWTiBzdXBwb3J0IGlzIHdyaXR0ZW4sIGJ1dCB1bnRlc3RlZC4KKworICAgICAgICBUaGlz
IHRvb2wgcmVxdWlyZXMgQmVhdXRpZnVsU291cCBhbmQgbWVjaGFuaXplIHB5dGhvbiBtb2R1bGVz
IHRvIHJ1bjoKKyAgICAgICAgc3VkbyBlYXN5X2luc3RhbGwgQmVhdXRpZnVsU291cAorICAgICAg
ICBzdWRvIGVhc3lfaW5zdGFsbCBtZWNoYW5pemUKKworICAgICAgICBNb3JlIGltcG9ydGFudCB0
aGFuIHRoZSB0b29sIGl0c2VsZiBhcmUgdGhlIEJ1Z3ppbGxhLCBHaXQgYW5kIFNWTiBjbGFzcyBh
YnN0cmFjdGlvbnMKKyAgICAgICAgd2hpY2ggSSBob3BlIHdpbGwgYWxsb3cgZWFzeSB3cml0aW5n
IG9mIGZ1dHVyZSB0b29scy4KKworICAgICAgICBJIGludGVuZCB0byBicmVhayBHaXQsIFNWTiBh
bmQgU0NNIG91dCBpbnRvIGFuIHNjbXRvb2xzLnB5IG1vZHVsZSBhZnRlciBsYW5kaW5nLgorICAg
ICAgICBMaWtld2lzZSwgQnVnemlsbGEgaW50byBhIGJ1Z3ppbGxhLnB5IG1vZHVsZS4gIEkgZmVs
dCBpdCB3b3VsZCBiZSBlYXNpZXIgdG8gcmV2aWV3IGluIG9uZSBmaWxlLgorCisgICAgICAgIFRo
ZSB0b29sIGN1cnJlbnRseSBpbXBsZW1lbnRzIDEwIGNvbW1hbmRzLCBkZXNjcmliZWQgYmVsb3cu
CisKKyAgICAgICAgSGVscGVycyBmb3Igc2NyaXB0aW5nIGRlYWxpbmcgd2l0aCB0aGUgY29tbWl0
IHF1ZXVlOgorICAgICAgICBidWdzLXRvLWNvbW1pdCAgICAgICAgICAgICAgICAgQnVncyBpbiB0
aGUgY29tbWl0IHF1ZXVlCisgICAgICAgIHBhdGNoZXMtdG8tY29tbWl0ICAgICAgICAgICAgICBQ
YXRjaGVzIGF0dGFjaGVkIHRvIGJ1Z3MgaW4gdGhlIGNvbW1pdCBxdWV1ZQorCisgICAgICAgIERl
YWxpbmcgd2l0aCBidWd6aWxsYToKKyAgICAgICAgcmV2aWV3ZWQtcGF0Y2hlcyBCVUdJRCAgICAg
ICAgIHIrJ2QgcGF0Y2hlcyBvbiBhIGJ1ZworICAgICAgICBhcHBseS1wYXRjaGVzIEJVR0lEICAg
ICAgICAgICAgQXBwbGllcyBhbGwgcGF0Y2hlcyBvbiBhIGJ1ZyB0byB0aGUgbG9jYWwgd29ya2lu
ZyBkaXJlY3Rvcnkgd2l0aG91dCBjb21taXR0aW5nLgorICAgICAgICBsYW5kLWFuZC11cGRhdGUg
QlVHSUQgICAgICAgICAgTGFuZHMgdGhlIGN1cnJlbnQgd29ya2luZyBkaXJlY3RvcnkgZGlmZiBh
bmQgdXBkYXRlcyB0aGUgYnVnLgorICAgICAgICBsYW5kLXBhdGNoZXMgW29wdGlvbnNdIEJVR0lE
ICAgTGFuZHMgYWxsIHBhdGNoZXMgb24gYSBidWcgb3B0aW9uYWxseSB0ZXN0aW5nIHRoZW0gZmly
c3QKKyAgICAgICAgb2Jzb2xldGUtYXR0YWNobWVudHMgQlVHSUQgICAgIE1hcmtzIGFsbCBhdHRh
Y2htZW50cyBvbiBhIGJ1ZyBhcyBvYnNvbGV0ZS4KKyAgICAgICAgY29tbWl0LW1lc3NhZ2UgICAg
ICAgICAgICAgICAgIFByaW50cyBhIGNvbW1pdCBtZXNzYWdlIHN1aXRhYmxlIGZvciB0aGUgdW5j
b21taXR0ZWQgY2hhbmdlcy4KKworICAgICAgICBUaGVzZSBlZmZlY3RpdmVseSByZXBsYWNlIGdp
dC1zZW5kLWJ1Z3ppbGxhOgorICAgICAgICBwb3N0LWRpZmYgQlVHSUQgICAgICAgICAgICAgICAg
QXR0YWNoZXMgdGhlIGN1cnJlbnQgd29ya2luZyBkaXJlY3RvcnkgZGlmZiB0byBhIGJ1ZyBhcyBh
IHBhdGNoIGZpbGUuCisgICAgICAgIHBvc3QtY29tbWl0cyBCVUdJRCBDT01NSVRJU0ggICBBdHRh
Y2hlcyBhIHJhbmdlIG9mIGxvY2FsIGNvbW1pdHMgdG8gYSBidWcgYXMgcGF0Y2ggZmlsZXMuCisK
KyAgICAgICAgcG9zdC1kaWZmIHdvcmtzIGZvciBTVk4gYW5kIEdpdCwgcG9zdC1jb21taXRzIG9u
bHkgd29ya3MgZm9yIFNDTXMgd2l0aCBsb2NhbC1jb21taXQgc3VwcG9ydCAobGlrZSBHaXQpCisK
KyAgICAgICAgbGFuZC0qIGNvbW1hbmRzIGluIGEgR2l0IGVudmlyb25tZW50IG9ubHkgd29yayB3
aXRoIHNpbXBsZSBwYXRjaGVzIGR1ZSB0byBzdm4tYXBwbHkgYnVnczoKKyAgICAgICAgaHR0cHM6
Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTI2Mjk5CisgICAgICAgIGh0dHBzOi8v
YnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0yNjMwMAorCisgICAgICAgIFRoaXMgc2Ny
aXB0IGZvbGxvd3MgcHl0aG9uIHN0eWxlIChzaW1pbGFyIHRvIGhvdyBmb3IgT2JqLUMgd2UgZm9s
bG93IEFwcEtpdCBzdHlsZSkKKyAgICAgICAgaHR0cDovL3d3dy5weXRob24ub3JnL2RvYy9lc3Nh
eXMvc3R5bGVndWlkZS5odG1sCisgICAgICAgIFRoZSBQeXRob24gY29tbXVuaXR5IGhhcyBhIHN0
cm9uZyBzdHlsZSBjdWx0dXJlIGFuZCB0aGUgV2ViS2l0IHN0eWxlIGd1aWRlIGlzIHNpbGVudCBy
ZTogUHl0aG9uLgorCisgICAgICAgIEkndmUgZmlsZWQgYSBidWcgdG8gdXBkYXRlIHRoZSBXZWJL
aXQgc3R5bGUgZ3VpZGUgdG8gbWVudGlvbiBweXRob246CisgICAgICAgIGh0dHBzOi8vYnVncy53
ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0yNjUyNAorCisgICAgICAgICogU2NyaXB0cy9idWd6
aWxsYS10b29sOiBBZGRlZC4KKwogMjAwOS0wNi0xNSAgQW5kcmUgUGVkcmFsaG8gIDxhbmRyZS5w
ZWRyYWxob0BvcGVuYm9zc2Eub3JnPgogCiAgICAgICAgIFJldmlld2VkIGJ5IFRvciBBcm5lIFZl
c3Riw7guCmRpZmYgLS1naXQgYS9XZWJLaXRUb29scy9TY3JpcHRzL2J1Z3ppbGxhLXRvb2wgYi9X
ZWJLaXRUb29scy9TY3JpcHRzL2J1Z3ppbGxhLXRvb2wKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5k
ZXggMDAwMDAwMC4uMDQ5OGNhYQotLS0gL2Rldi9udWxsCisrKyBiL1dlYktpdFRvb2xzL1Njcmlw
dHMvYnVnemlsbGEtdG9vbApAQCAtMCwwICsxLDQ1NyBAQAorIyEvdXNyL2Jpbi9weXRob24KKwor
IyBDb3B5cmlnaHQgKEMpIDIwMDkgR29vZ2xlLCBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgor
IworIyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3
aXRoIG9yIHdpdGhvdXQKKyMgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRo
YXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisjIGFyZSBtZXQ6CisjIDEuIFJlZGlzdHJpYnV0
aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisjICAg
IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xh
aW1lci4KKyMgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNl
IHRoZSBhYm92ZSBjb3B5cmlnaHQKKyMgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9u
cyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorIyAgICBkb2N1bWVudGF0aW9u
IGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgor
IworIyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIENPTVBVVEVSLCBJTkMuIGBg
QVMgSVMnJyBBTkQgQU5ZCisjIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJ
TkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisjIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJD
SEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorIyBQVVJQT1NFIEFSRSBE
SVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgQ09NUFVURVIsIElOQy4gT1IKKyMg
Q09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5U
QUwsIFNQRUNJQUwsCisjIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNM
VURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyMgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBH
T09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisjIFBST0ZJVFM7IE9SIEJV
U0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyMg
T0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBU
T1JUCisjIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5Z
IFdBWSBPVVQgT0YgVEhFIFVTRQorIyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQg
T0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorIworIyBBIHRvb2wgZm9yIGF1dG9t
YXRpbmcgZGVhbGluZyB3aXRoIGJ1Z3ppbGxhLCBwb3N0aW5nIHBhdGNoZXMsIGNvbW1pdGluZyBw
YXRjaGVzLCBldGMuCisKK2ltcG9ydCBzeXMKK2ltcG9ydCByZQoraW1wb3J0IG9zCitpbXBvcnQg
c3VicHJvY2VzcworCitmcm9tIG9wdHBhcnNlIGltcG9ydCBPcHRpb25QYXJzZXIsIEluZGVudGVk
SGVscEZvcm1hdHRlciwgU1VQUFJFU1NfVVNBR0UsIG1ha2Vfb3B0aW9uCisKK3N5cy5wYXRoLmFw
cGVuZChvcy5wYXRoLmpvaW4oc3lzLnBhdGhbMF0sICJtb2R1bGVzIikpICMgSW1wb3J0IFdlYktp
dC1zcGVjaWZpYyBtb2R1bGVzCitmcm9tIGJ1Z3ppbGxhIGltcG9ydCBCdWd6aWxsYQorZnJvbSBz
Y20gaW1wb3J0IGRldGVjdF9zY21fc3lzdGVtLCBTY3JpcHRFcnJvcgorCitkZWYgbG9nKHN0cmlu
Zyk6CisgICAgcHJpbnQgPj4gc3lzLnN0ZGVyciwgc3RyaW5nCisKK2RlZiBlcnJvcihzdHJpbmcp
OgorICAgIGxvZyhzdHJpbmcpCisgICAgZXhpdCgxKQorCisKKyMgVGhlc2UgY291bGQgYmUgcHV0
IGluIHNvbWUgc29ydCBvZiBjaGFuZ2Vsb2dzLnB5CitkZWYgbGF0ZXN0X2NoYW5nZWxvZ19lbnRy
eShjaGFuZ2Vsb2dfcGF0aCk6CisgICAgZW50cnlfbGluZXMgPSBbXQorICAgIGNoYW5nZWxvZyA9
IG9wZW4oY2hhbmdlbG9nX3BhdGgpCisgICAgdHJ5OgorICAgICAgICBsb2coIlBhcnNpbmcgQ2hh
bmdlTG9nOiAiICsgY2hhbmdlbG9nX3BhdGgpCisgICAgICAgICMgVGhlIGZpcnN0IGxpbmUgc2hv
dWxkIGJlIGEgZGF0ZSBsaW5lCisgICAgICAgIGVudHJ5X2xpbmVzLmFwcGVuZChjaGFuZ2Vsb2cu
cmVhZGxpbmUoKSkKKyAgICAgICAgCisgICAgICAgICMgZS5nLiAyMDA5LTA2LTAzICBFcmljIFNl
aWRlbCAgPGVyaWNAd2Via2l0Lm9yZz4KKyAgICAgICAgY2hhbmdlbG9nX2RhdGVfbGluZV9yZWdl
eHAgPSAnXihbXGRcLV0rKSAgKC4rKSAgPCguKyk+JCcKKyAgICAgICAgCisgICAgICAgIGZvciBs
aW5lIGluIGNoYW5nZWxvZzoKKyAgICAgICAgICAgICMgaWYgd2UndmUgaGl0IHRoZSBuZXh0IGVu
dHJ5LCByZXR1cm4KKyAgICAgICAgICAgIGlmIHJlLm1hdGNoKGNoYW5nZWxvZ19kYXRlX2xpbmVf
cmVnZXhwLCBsaW5lKToKKyAgICAgICAgICAgICAgICByZXR1cm4gJycuam9pbihlbnRyeV9saW5l
cykKKyAgICAgICAgICAgIGVudHJ5X2xpbmVzLmFwcGVuZChsaW5lKQorICAgIGZpbmFsbHk6Cisg
ICAgICAgICAgICBjaGFuZ2Vsb2cuY2xvc2UoKQorICAgICMgV2UgbmV2ZXIgZm91bmQgYSBkYXRl
IGxpbmUhCisgICAgcmV0dXJuIE5vbmUKKworZGVmIG1vZGlmaWVkX2NoYW5nZWxvZ3Moc2NtKToK
KyAgICBjaGFuZ2Vsb2dfcGF0aHMgPSBbXQorICAgIHBhdGhzID0gc2NtLmNoYW5nZWRfZmlsZXMo
KQorICAgIGZvciBwYXRoIGluIHBhdGhzOgorICAgICAgICBpZiBvcy5wYXRoLmJhc2VuYW1lKHBh
dGgpID09ICJDaGFuZ2VMb2ciOgorICAgICAgICAgICAgY2hhbmdlbG9nX3BhdGhzLmFwcGVuZChw
YXRoKQorICAgIHJldHVybiBjaGFuZ2Vsb2dfcGF0aHMKKworZGVmIGNvbW1pdF9tZXNzYWdlX2Zv
cl90aGlzX2NvbW1pdChzY20pOgorICAgIGNoYW5nZWxvZ19wYXRocyA9IG1vZGlmaWVkX2NoYW5n
ZWxvZ3Moc2NtKQorICAgIGlmIGxlbihjaGFuZ2Vsb2dfcGF0aHMpID09IDA6CisgICAgICAgIGVy
cm9yKCJGb3VuZCBubyBtb2RpZmllZCBDaGFuZ2VMb2dzLCBjYW4ndCBjcmVhdGUgYSBjb21taXQg
bWVzc2FnZS4iKQorCisgICAgY2hhbmdlbG9nX21lc3NhZ2VzID0gW10KKyAgICBmb3IgcGF0aCBp
biBjaGFuZ2Vsb2dfcGF0aHM6CisgICAgICAgIGNoYW5nZWxvZ19lbnRyeSA9IGxhdGVzdF9jaGFu
Z2Vsb2dfZW50cnkocGF0aCkKKyAgICAgICAgaWYgbm90IGNoYW5nZWxvZ19lbnRyeToKKyAgICAg
ICAgICAgIGVycm9yKCJGYWlsZWQgdG8gcGFyc2UgQ2hhbmdlTG9nOiAiICsgb3MucGF0aC5hYnNw
YXRoKHBhdGgpKQorICAgICAgICBjaGFuZ2Vsb2dfbWVzc2FnZXMuYXBwZW5kKGNoYW5nZWxvZ19l
bnRyeSkKKyAgICByZXR1cm4gJycuam9pbihjaGFuZ2Vsb2dfbWVzc2FnZXMpCisKKworY2xhc3Mg
Q29tbWFuZDoKKyAgICBkZWYgX19pbml0X18oc2VsZiwgaGVscF90ZXh0LCBhcmd1bWVudF9uYW1l
cz0iIiwgb3B0aW9ucyA9IFtdKToKKyAgICAgICAgc2VsZi5oZWxwX3RleHQgPSBoZWxwX3RleHQK
KyAgICAgICAgc2VsZi5hcmd1bWVudF9uYW1lcyA9IGFyZ3VtZW50X25hbWVzCisgICAgICAgIHNl
bGYub3B0aW9ucyA9IG9wdGlvbnMKKyAgICAgICAgc2VsZi5vcHRpb25fcGFyc2VyID0gT3B0aW9u
UGFyc2VyKHVzYWdlPVNVUFBSRVNTX1VTQUdFLCBhZGRfaGVscF9vcHRpb249RmFsc2UsIG9wdGlv
bl9saXN0PXNlbGYub3B0aW9ucykKKyAgICAKKyAgICBkZWYgbmFtZV93aXRoX2FyZ3VtZW50cyhz
ZWxmLCBjb21tYW5kX25hbWUpOgorICAgICAgICB1c2FnZV9zdHJpbmcgPSBjb21tYW5kX25hbWUK
KyAgICAgICAgaWYgKGxlbihzZWxmLm9wdGlvbnMpID4gMCk6CisgICAgICAgICAgICB1c2FnZV9z
dHJpbmcgKz0gIiBbb3B0aW9uc10iCisgICAgICAgIGlmIChzZWxmLmFyZ3VtZW50X25hbWVzICE9
ICIiKToKKyAgICAgICAgICAgIHVzYWdlX3N0cmluZyArPSAiICIgKyBzZWxmLmFyZ3VtZW50X25h
bWVzCisgICAgICAgIHJldHVybiB1c2FnZV9zdHJpbmcKKworICAgIGRlZiBwYXJzZV9hcmdzKHNl
bGYsIGFyZ3MpOgorICAgICAgICByZXR1cm4gc2VsZi5vcHRpb25fcGFyc2VyLnBhcnNlX2FyZ3Mo
YXJncykKKworICAgIGRlZiBleGVjdXRlKHNlbGYsIG9wdGlvbnMsIGFyZ3MsIHRvb2wpOgorICAg
ICAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yLCAic3ViY2xhc3NlcyBtdXN0IGltcGxlbWVu
dCIKKworCitjbGFzcyBCdWdzSW5Db21taXRRdWV1ZSAoQ29tbWFuZCk6CisgICAgZGVmIF9faW5p
dF9fKHNlbGYpOgorICAgICAgICBDb21tYW5kLl9faW5pdF9fKHNlbGYsICdCdWdzIGluIHRoZSBj
b21taXQgcXVldWUnKQorCisgICAgZGVmIGV4ZWN1dGUoc2VsZiwgb3B0aW9ucywgYXJncywgdG9v
bCk6CisgICAgICAgIGJ1Z19pZHMgPSB0b29sLmJ1Z3MuZmV0Y2hfYnVnX2lkc19mcm9tX2NvbW1p
dF9xdWV1ZSgpCisgICAgICAgIGZvciBidWdfaWQgaW4gYnVnX2lkczoKKyAgICAgICAgICAgIHBy
aW50IHRvb2wuYnVncy5idWdfdXJsX2Zvcl9idWdfaWQoYnVnX2lkKQorCisKK2NsYXNzIFBhdGNo
ZXNJbkNvbW1pdFF1ZXVlIChDb21tYW5kKToKKyAgICBkZWYgX19pbml0X18oc2VsZik6CisgICAg
ICAgIENvbW1hbmQuX19pbml0X18oc2VsZiwgJ1BhdGNoZXMgYXR0YWNoZWQgdG8gYnVncyBpbiB0
aGUgY29tbWl0IHF1ZXVlJykKKworICAgIGRlZiBleGVjdXRlKHNlbGYsIG9wdGlvbnMsIGFyZ3Ms
IHRvb2wpOgorICAgICAgICBwYXRjaGVzID0gdG9vbC5idWdzLmZldGNoX3BhdGNoZXNfZnJvbV9j
b21taXRfcXVldWUoKQorICAgICAgICBsb2coIlBhdGNoZXMgaW4gY29tbWl0IHF1ZXVlOiIpCisg
ICAgICAgIGZvciBwYXRjaCBpbiBwYXRjaGVzOgorICAgICAgICAgICAgcHJpbnQgcGF0Y2hbJ3Vy
bCddCisKKworY2xhc3MgUmV2aWV3ZWRQYXRjaGVzT25CdWcgKENvbW1hbmQpOgorICAgIGRlZiBf
X2luaXRfXyhzZWxmKToKKyAgICAgICAgQ29tbWFuZC5fX2luaXRfXyhzZWxmLCAncitcJ2QgcGF0
Y2hlcyBvbiBhIGJ1ZycsICdCVUdJRCcpCisKKyAgICBkZWYgZXhlY3V0ZShzZWxmLCBvcHRpb25z
LCBhcmdzLCB0b29sKToKKyAgICAgICAgYnVnX2lkID0gYXJnc1swXQorICAgICAgICBwYXRjaGVz
X3RvX2xhbmQgPSB0b29sLmJ1Z3MuZmV0Y2hfcmV2aWV3ZWRfcGF0Y2hlc19mcm9tX2J1ZyhidWdf
aWQpCisgICAgICAgIGZvciBwYXRjaCBpbiBwYXRjaGVzX3RvX2xhbmQ6CisgICAgICAgICAgICBw
cmludCBwYXRjaFsndXJsJ10KKworCitjbGFzcyBBcHBseVBhdGNoZXNGcm9tQnVnIChDb21tYW5k
KToKKyAgICBkZWYgX19pbml0X18oc2VsZik6CisgICAgICAgIG9wdGlvbnMgPSBbCisgICAgICAg
ICAgICBtYWtlX29wdGlvbigiLS1uby11cGRhdGUiLCBhY3Rpb249InN0b3JlX2ZhbHNlIiwgZGVz
dD0idXBkYXRlIiwgZGVmYXVsdD1UcnVlLCBoZWxwPSJEb24ndCB1cGRhdGUgdGhlIHdvcmtpbmcg
ZGlyZWN0b3J5IGJlZm9yZSBhcHBseWluZyBwYXRjaGVzIiksCisgICAgICAgICAgICBtYWtlX29w
dGlvbigiLS1mb3JjZS1jbGVhbiIsIGFjdGlvbj0ic3RvcmVfdHJ1ZSIsIGRlc3Q9ImZvcmNlX2Ns
ZWFuIiwgZGVmYXVsdD1GYWxzZSwgaGVscD0iQ2xlYW4gd29ya2luZyBkaXJlY3RvcnkgYmVmb3Jl
IGFwcGx5aW5nIHBhdGNoZXMgKHJlbW92ZXMgbG9jYWwgY2hhbmdlcyBhbmQgY29tbWl0cykiKSwK
KyAgICAgICAgICAgIG1ha2Vfb3B0aW9uKCItLW5vLWNsZWFuIiwgYWN0aW9uPSJzdG9yZV9mYWxz
ZSIsIGRlc3Q9ImNsZWFuIiwgZGVmYXVsdD1UcnVlLCBoZWxwPSJEb24ndCBjaGVjayBpZiB0aGUg
d29ya2luZyBkaXJlY3RvcnkgaXMgY2xlYW4gYmVmb3JlIGFwcGx5aW5nIHBhdGNoZXMiKSwKKyAg
ICAgICAgXQorICAgICAgICBDb21tYW5kLl9faW5pdF9fKHNlbGYsICdBcHBsaWVzIGFsbCBwYXRj
aGVzIG9uIGEgYnVnIHRvIHRoZSBsb2NhbCB3b3JraW5nIGRpcmVjdG9yeSB3aXRob3V0IGNvbW1p
dHRpbmcuJywgJ0JVR0lEJywgb3B0aW9ucz1vcHRpb25zKQorCisgICAgZGVmIGV4ZWN1dGUoc2Vs
Ziwgb3B0aW9ucywgYXJncywgdG9vbCk6CisgICAgICAgIGJ1Z19pZCA9IGFyZ3NbMF0KKyAgICAg
ICAgcGF0Y2hlcyA9IHRvb2wuYnVncy5mZXRjaF9yZXZpZXdlZF9wYXRjaGVzX2Zyb21fYnVnKGJ1
Z19pZCkKKyAgICAgICAgb3MuY2hkaXIodG9vbC5zY20oKS5jaGVja291dF9yb290KQorICAgICAg
ICBpZiBvcHRpb25zLmNsZWFuOgorICAgICAgICAgICAgdG9vbC5zY20oKS5lbnN1cmVfY2xlYW5f
d29ya2luZ19kaXJlY3Rvcnkob3B0aW9ucy5mb3JjZV9jbGVhbiwgYWxsb3dfbG9jYWxfY29tbWl0
cyA9IFRydWUpCisgICAgICAgIGlmIG9wdGlvbnMudXBkYXRlOgorICAgICAgICAgICAgdG9vbC5z
Y20oKS51cGRhdGVfd2Via2l0KCkKKyAgICAgICAgCisgICAgICAgICMgU2hvdWxkIHdlIGVycm9y
IG91dCBpZiB0b29sLnNjbSBkb2VzIG5vdCBzdXBwb3J0IGxvY2FsIGNvbW1pdHM/CisgICAgICAg
IGZvciBwYXRjaCBpbiBwYXRjaGVzOgorICAgICAgICAgICAgdG9vbC5zY20oKS5hcHBseV9wYXRj
aChwYXRjaCkKKworCitkZWYgYnVnX2NvbW1lbnRfZnJvbV9jb21taXRfdGV4dChjb21taXRfdGV4
dCk6CisgICAgY29tbWVudF9saW5lcyA9IFtdCisgICAgY29tbWl0X2xpbmVzID0gY29tbWl0X3Rl
eHQuc3BsaXRsaW5lcygpCisgICAgZm9yIGxpbmUgaW4gY29tbWl0X2xpbmVzOgorICAgICAgICBj
b21tZW50X2xpbmVzLmFwcGVuZChsaW5lKQorICAgICAgICBtYXRjaCA9IHJlLm1hdGNoKCJeQ29t
bWl0dGVkIHIoXGQrKSQiLCBsaW5lKQorICAgICAgICBpZiBtYXRjaDoKKyAgICAgICAgICAgIHJl
dmlzaW9uID0gbWF0Y2guZ3JvdXAoMSkKKyAgICAgICAgICAgIGNvbW1lbnRfbGluZXMuYXBwZW5k
KCJodHRwOi8vdHJhYy53ZWJraXQub3JnL2NoYW5nZXNldC8iICsgcmV2aXNpb24pCisgICAgICAg
ICAgICBicmVhaworICAgIHJldHVybiAiXG4iLmpvaW4oY29tbWVudF9saW5lcykKKworCitjbGFz
cyBMYW5kQW5kVXBkYXRlQnVnIChDb21tYW5kKToKKyAgICBkZWYgX19pbml0X18oc2VsZik6Cisg
ICAgICAgIENvbW1hbmQuX19pbml0X18oc2VsZiwgJ0xhbmRzIHRoZSBjdXJyZW50IHdvcmtpbmcg
ZGlyZWN0b3J5IGRpZmYgYW5kIHVwZGF0ZXMgdGhlIGJ1Zy4nLCAnQlVHSUQnKQorCisgICAgZGVm
IGV4ZWN1dGUoc2VsZiwgb3B0aW9ucywgYXJncywgdG9vbCk6CisgICAgICAgIGJ1Z19pZCA9IGFy
Z3NbMF0KKyAgICAgICAgb3MuY2hkaXIodG9vbC5zY20oKS5jaGVja291dF9yb290KQorICAgICAg
ICBjb21taXRfbWVzc2FnZSA9IGNvbW1pdF9tZXNzYWdlX2Zvcl90aGlzX2NvbW1pdCh0b29sLnNj
bSgpKQorICAgICAgICBjb21taXRfbG9nID0gdG9vbC5zY20oKS5jb21taXRfd2l0aF9tZXNzYWdl
KGNvbW1pdF9tZXNzYWdlKQorICAgICAgICBjb21tZW50X3RleHQgPSBidWdfY29tbWVudF9mcm9t
X2NvbW1pdF90ZXh0KGNvbW1pdF9sb2cpCisgICAgICAgIHRvb2wuYnVncy5jbG9zZV9idWdfYXNf
Zml4ZWQoYnVnX2lkLCBjb21tZW50X3RleHQpCisKKworY2xhc3MgTGFuZFBhdGNoZXNGcm9tQnVn
IChDb21tYW5kKToKKyAgICBkZWYgX19pbml0X18oc2VsZik6CisgICAgICAgIG9wdGlvbnMgPSBb
CisgICAgICAgICAgICBtYWtlX29wdGlvbigiLS1uby11cGRhdGUiLCBhY3Rpb249InN0b3JlX2Zh
bHNlIiwgZGVzdD0idXBkYXRlIiwgZGVmYXVsdD1UcnVlLCBoZWxwPSJEb24ndCB1cGRhdGUgdGhl
IHdvcmtpbmcgZGlyZWN0b3J5IGJlZm9yZSBhcHBseWluZyBwYXRjaGVzIiksCisgICAgICAgICAg
ICBtYWtlX29wdGlvbigiLS1mb3JjZS1jbGVhbiIsIGFjdGlvbj0ic3RvcmVfdHJ1ZSIsIGRlc3Q9
ImZvcmNlX2NsZWFuIiwgZGVmYXVsdD1GYWxzZSwgaGVscD0iQ2xlYW4gd29ya2luZyBkaXJlY3Rv
cnkgYmVmb3JlIGFwcGx5aW5nIHBhdGNoZXMgKHJlbW92ZXMgbG9jYWwgY2hhbmdlcyBhbmQgY29t
bWl0cykiKSwKKyAgICAgICAgICAgIG1ha2Vfb3B0aW9uKCItLW5vLWNsZWFuIiwgYWN0aW9uPSJz
dG9yZV9mYWxzZSIsIGRlc3Q9ImNsZWFuIiwgZGVmYXVsdD1UcnVlLCBoZWxwPSJEb24ndCBjaGVj
ayBpZiB0aGUgd29ya2luZyBkaXJlY3RvcnkgaXMgY2xlYW4gYmVmb3JlIGFwcGx5aW5nIHBhdGNo
ZXMiKSwKKyAgICAgICAgICAgIG1ha2Vfb3B0aW9uKCItLW5vLWJ1aWxkIiwgYWN0aW9uPSJzdG9y
ZV9mYWxzZSIsIGRlc3Q9ImJ1aWxkIiwgZGVmYXVsdD1UcnVlLCBoZWxwPSJDb21taXQgd2l0aG91
dCBidWlsZGluZyBmaXJzdCwgaW1wbGllcyAtLW5vLXRlc3QuIiksCisgICAgICAgICAgICBtYWtl
X29wdGlvbigiLS1uby10ZXN0IiwgYWN0aW9uPSJzdG9yZV9mYWxzZSIsIGRlc3Q9InRlc3QiLCBk
ZWZhdWx0PVRydWUsIGhlbHA9IkNvbW1pdCB3aXRob3V0IHJ1bm5uaW5nIHJ1bi13ZWJraXQtdGVz
dHMuIiksCisgICAgICAgIF0KKyAgICAgICAgQ29tbWFuZC5fX2luaXRfXyhzZWxmLCAnTGFuZHMg
YWxsIHBhdGNoZXMgb24gYSBidWcgb3B0aW9uYWxseSB0ZXN0aW5nIHRoZW0gZmlyc3QnLCAnQlVH
SUQnLCBvcHRpb25zPW9wdGlvbnMpCisKKyAgICBkZWYgcnVuX2FuZF90aHJvd19pZl9mYWlsKHNl
bGYsIHNjcmlwdF9uYW1lKToKKyAgICAgICAgYnVpbGRfd2Via2l0X3Byb2Nlc3MgPSBzdWJwcm9j
ZXNzLlBvcGVuKHNjcmlwdF9uYW1lLCBzaGVsbD1UcnVlKQorICAgICAgICByZXR1cm5fY29kZSA9
IGJ1aWxkX3dlYmtpdF9wcm9jZXNzLndhaXQoKQorICAgICAgICBpZiByZXR1cm5fY29kZSAhPSAw
OgorICAgICAgICAgICAgcmFpc2UgU2NyaXB0RXJyb3Ioc2NyaXB0X25hbWUgKyAiIGZhaWxlZCB3
aXRoIGNvZGUgIiArIHJldHVybl9jb2RlKQorCisgICAgZGVmIGJ1aWxkX3dlYmtpdChzZWxmKToK
KyAgICAgICAgc2VsZi5ydW5fYW5kX3Rocm93X2lmX2ZhaWwoImJ1aWxkLXdlYmtpdCIpCisKKyAg
ICBkZWYgcnVuX3dlYmtpdF90ZXN0cyhzZWxmKToKKyAgICAgICAgc2VsZi5ydW5fYW5kX3Rocm93
X2lmX2ZhaWwoInJ1bi13ZWJraXQtdGVzdHMiKQorCisgICAgZGVmIGV4ZWN1dGUoc2VsZiwgb3B0
aW9ucywgYXJncywgdG9vbCk6CisgICAgICAgIGJ1Z19pZCA9IGFyZ3NbMF0KKworICAgICAgICB0
cnk6CisgICAgICAgICAgICBwYXRjaGVzID0gdG9vbC5idWdzLmZldGNoX3Jldmlld2VkX3BhdGNo
ZXNfZnJvbV9idWcoYnVnX2lkKQorICAgICAgICAgICAgY29tbWl0X3RleHQgPSAiIgorCisgICAg
ICAgICAgICBvcy5jaGRpcih0b29sLnNjbSgpLmNoZWNrb3V0X3Jvb3QpCisgICAgICAgICAgICB0
b29sLnNjbSgpLmVuc3VyZV9ub19sb2NhbF9jb21taXRzKG9wdGlvbnMuZm9yY2VfY2xlYW4pCisg
ICAgICAgICAgICBpZiBvcHRpb25zLmNsZWFuOgorICAgICAgICAgICAgICAgIHRvb2wuc2NtKCku
ZW5zdXJlX2NsZWFuX3dvcmtpbmdfZGlyZWN0b3J5KG9wdGlvbnMuZm9yY2VfY2xlYW4pCisgICAg
ICAgICAgICBpZiBvcHRpb25zLnVwZGF0ZToKKyAgICAgICAgICAgICAgICB0b29sLnNjbSgpLnVw
ZGF0ZV93ZWJraXQoKQorICAgICAgICAgICAgCisgICAgICAgICAgICBmb3IgcGF0Y2ggaW4gcGF0
Y2hlczoKKyAgICAgICAgICAgICAgICB0b29sLnNjbSgpLmFwcGx5X3BhdGNoKHBhdGNoKQorICAg
ICAgICAgICAgICAgIGlmIG9wdGlvbnMuYnVpbGQ6CisgICAgICAgICAgICAgICAgICAgIHNlbGYu
YnVpbGRfd2Via2l0KCkKKyAgICAgICAgICAgICAgICAgICAgaWYgb3B0aW9ucy50ZXN0OgorICAg
ICAgICAgICAgICAgICAgICAgICAgc2VsZi5ydW5fd2Via2l0X3Rlc3RzKCkKKyAgICAgICAgICAg
ICAgICBjb21taXRfbWVzc2FnZSA9IGNvbW1pdF9tZXNzYWdlX2Zvcl90aGlzX2NvbW1pdCh0b29s
LnNjbSgpKQorICAgICAgICAgICAgICAgIGNvbW1pdF9sb2cgPSB0b29sLnNjbSgpLmNvbW1pdF93
aXRoX21lc3NhZ2UoY29tbWl0X21lc3NhZ2UpCisgICAgICAgICAgICAgICAgY29tbWVudF90ZXh0
ID0gYnVnX2NvbW1lbnRfZnJvbV9jb21taXRfdGV4dChjb21taXRfbG9nKQorICAgICAgICAgICAg
ICAgICMgaWYgd2UncmUgY29tbWl0aW5nIG1vcmUgdGhhbiBvbmUgcGF0Y2gsIHVwZGF0ZSB0aGUg
YnVnIGFzIHdlIGdvCisgICAgICAgICAgICAgICAgaWYgbGVuKHBhdGNoZXMpID4gMToKKyAgICAg
ICAgICAgICAgICAgICAgdG9vbC5idWdzLm9ic29sZXRlX2F0dGFjaG1lbnQocGF0Y2hbJ2lkJ10s
IGNvbW1lbnRfdGV4dCkKKworICAgICAgICAgICAgaWYgbGVuKHBhdGNoZXMpID4gMToKKyAgICAg
ICAgICAgICAgICBjb21taXRfdGV4dCA9ICJBbGwgcmV2aWV3ZWQgcGF0Y2hlcyBsYW5kZWQsIGNs
b3NpbmcuIgorCisgICAgICAgICAgICB0b29sLmJ1Z3MuY2xvc2VfYnVnX2FzX2ZpeGVkKGJ1Z19p
ZCwgY29tbWl0X3RleHQpCisgICAgICAgIGV4Y2VwdCBTY3JpcHRFcnJvciwgZXJyb3I6CisgICAg
ICAgICAgICBsb2coZXJyb3IpCisgICAgICAgICAgICAjIFdlIGNvdWxkIGFkZCBhIGNvbW1lbnQg
dG8gdGhlIGJ1ZyBhYm91dCB0aGUgZmFpbHVyZQorCisKK2NsYXNzIENvbW1pdE1lc3NhZ2VGb3JD
dXJyZW50RGlmZiAoQ29tbWFuZCk6CisgICAgZGVmIF9faW5pdF9fKHNlbGYpOgorICAgICAgICBD
b21tYW5kLl9faW5pdF9fKHNlbGYsICdQcmludHMgYSBjb21taXQgbWVzc2FnZSBzdWl0YWJsZSBm
b3IgdGhlIHVuY29tbWl0dGVkIGNoYW5nZXMuJykKKworICAgIGRlZiBleGVjdXRlKHNlbGYsIG9w
dGlvbnMsIGFyZ3MsIHRvb2wpOgorICAgICAgICBvcy5jaGRpcih0b29sLnNjbSgpLmNoZWNrb3V0
X3Jvb3QpCisgICAgICAgIHByaW50IGNvbW1pdF9tZXNzYWdlX2Zvcl90aGlzX2NvbW1pdCh0b29s
LnNjbSgpKQorCisKK2NsYXNzIE9ic29sZXRlQXR0YWNobWVudHNPbkJ1ZyAoQ29tbWFuZCk6Cisg
ICAgZGVmIF9faW5pdF9fKHNlbGYpOgorICAgICAgICBDb21tYW5kLl9faW5pdF9fKHNlbGYsICdN
YXJrcyBhbGwgYXR0YWNobWVudHMgb24gYSBidWcgYXMgb2Jzb2xldGUuJywgJ0JVR0lEJykKKwor
ICAgIGRlZiBleGVjdXRlKHNlbGYsIG9wdGlvbnMsIGFyZ3MsIHRvb2wpOgorICAgICAgICBidWdf
aWQgPSBhcmdzWzBdCisgICAgICAgIGF0dGFjaG1lbnRzID0gdG9vbC5idWdzLmZldGNoX2F0dGFj
aG1lbnRzX2Zyb21fYnVnKGJ1Z19pZCkKKyAgICAgICAgZm9yIGF0dGFjaG1lbnQgaW4gYXR0YWNo
bWVudHM6CisgICAgICAgICAgICBpZiBub3QgYXR0YWNobWVudFsnb2Jzb2xldGUnXToKKyAgICAg
ICAgICAgICAgICB0b29sLmJ1Z3Mub2Jzb2xldGVfYXR0YWNobWVudChhdHRhY2htZW50WydpZCdd
KQorCisKK2NsYXNzIFBvc3REaWZmQXNQYXRjaFRvQnVnIChDb21tYW5kKToKKyAgICBkZWYgX19p
bml0X18oc2VsZik6CisgICAgICAgIG9wdGlvbnMgPSBbCisgICAgICAgICAgICBtYWtlX29wdGlv
bigiLS1uby1yZXZpZXciLCBhY3Rpb249InN0b3JlX2ZhbHNlIiwgZGVzdD0icmV2aWV3IiwgZGVm
YXVsdD1UcnVlLCBoZWxwPSJEbyBub3QgbWFyayB0aGUgcGF0Y2ggZm9yIHJldmlldy4iKSwKKyAg
ICAgICAgICAgIG1ha2Vfb3B0aW9uKCItbSIsICItLWRlc2NyaXB0aW9uIiwgYWN0aW9uPSJzdG9y
ZSIsIHR5cGU9InN0cmluZyIsIGRlc3Q9ImRlc2NyaXB0aW9uIiwgaGVscD0iRGVzY3JpcHRpb24g
c3RyaW5nIGZvciB0aGUgYXR0YWNobWVudCAoZGVmYXVsdDogJ3BhdGNoJykiKSwKKyAgICAgICAg
XQorICAgICAgICBDb21tYW5kLl9faW5pdF9fKHNlbGYsICdBdHRhY2hlcyB0aGUgY3VycmVudCB3
b3JraW5nIGRpcmVjdG9yeSBkaWZmIHRvIGEgYnVnIGFzIGEgcGF0Y2ggZmlsZS4nLCAnQlVHSUQn
LCBvcHRpb25zPW9wdGlvbnMpCisKKyAgICBkZWYgZXhlY3V0ZShzZWxmLCBvcHRpb25zLCBhcmdz
LCB0b29sKToKKyAgICAgICAgYnVnX2lkID0gYXJnc1swXQorICAgICAgICAKKyAgICAgICAgZGlm
Zl9wcm9jZXNzID0gc3VicHJvY2Vzcy5Qb3Blbih0b29sLnNjbSgpLmNyZWF0ZV9wYXRjaF9jb21t
YW5kKCksIHN0ZG91dD1zdWJwcm9jZXNzLlBJUEUsIHNoZWxsPVRydWUpCisgICAgICAgIGRpZmZf
cHJvY2Vzcy53YWl0KCkgIyBNYWtlIHN1cmUgc3ZuLWNyZWF0ZS1wYXRjaCBpcyBkb25lIGJlZm9y
ZSB3ZSBjb250aW51ZQorICAgICAgICAKKyAgICAgICAgZGVzY3JpcHRpb24gPSBvcHRpb25zLmRl
c2NyaXB0aW9uIGlmIG9wdGlvbnMuZGVzY3JpcHRpb24gZWxzZSAicGF0Y2giCisgICAgICAgIHRv
b2wuYnVncy5hZGRfcGF0Y2hfdG9fYnVnKGJ1Z19pZCwgZGlmZl9wcm9jZXNzLnN0ZG91dCwgZGVz
Y3JpcHRpb24sIG1hcmtfZm9yX3Jldmlldz1vcHRpb25zLnJldmlldykKKworCitjbGFzcyBQb3N0
Q29tbWl0c0FzUGF0Y2hlc1RvQnVnIChDb21tYW5kKToKKyAgICBkZWYgX19pbml0X18oc2VsZik6
CisgICAgICAgIG9wdGlvbnMgPSBbCisgICAgICAgICAgICBtYWtlX29wdGlvbigiLS1uby1yZXZp
ZXciLCBhY3Rpb249InN0b3JlX2ZhbHNlIiwgZGVzdD0icmV2aWV3IiwgZGVmYXVsdD1UcnVlLCBo
ZWxwPSJEbyBub3QgbWFyayB0aGUgcGF0Y2ggZm9yIHJldmlldy4iKSwKKyAgICAgICAgXQorICAg
ICAgICBDb21tYW5kLl9faW5pdF9fKHNlbGYsICdBdHRhY2hlcyBhIHJhbmdlIG9mIGxvY2FsIGNv
bW1pdHMgdG8gYSBidWcgYXMgcGF0Y2ggZmlsZXMuJywgJ0JVR0lEIENPTU1JVElTSCcsIG9wdGlv
bnM9b3B0aW9ucykKKworICAgIGRlZiBleGVjdXRlKHNlbGYsIG9wdGlvbnMsIGFyZ3MsIHRvb2wp
OgorICAgICAgICBidWdfaWQgPSBhcmdzWzBdCisgICAgICAgIAorICAgICAgICBpZiBub3QgdG9v
bC5zY20oKS5zdXBwb3J0c19sb2NhbF9jb21taXRzKCk6CisgICAgICAgICAgICBsb2codG9vbC5z
Y20oKS5kaXNwbGF5X25hbWUoKSArICIgZG9lcyBub3Qgc3VwcG9ydCBsb2NhbCBjb21taXRzLiIp
CisgICAgICAgICAgICBleGl0KDEpCisgICAgICAgIAorICAgICAgICBjb21taXRfaWRzID0gdG9v
bC5zY20oKS5jb21taXRfaWRzX2Zyb21fcmFuZ2VfYXJndW1lbnRzKGFyZ3NbMTpdKQorICAgICAg
ICAKKyAgICAgICAgaWYgbGVuKGNvbW1pdF9pZHMpID4gMTA6CisgICAgICAgICAgICBsb2coIkFy
ZSB5b3Ugc3VyZSB5b3Ugd2FudCB0byBhdHRhY2ggJWQgcGF0Y2hlcyB0byBidWcgJXM/IiAlIChs
ZW4oY29tbWl0X2lkcyksIGJ1Z19pZCkpCisgICAgICAgICAgICAjIFNob3VsZCBzdXBwb3J0IGEg
LS1mb3JjZSBvcHRpb24KKyAgICAgICAgICAgIGV4aXQoMSkKKyAgICAgICAgCisgICAgICAgIGxv
ZygiQXR0YWNoaW5nICVkIGNvbW1pdHMgYXMgcGF0Y2hlcyB0byBidWcgJXMiICUgKGxlbihjb21t
aXRfaWRzKSwgYnVnX2lkKSkKKyAgICAgICAgZm9yIGNvbW1pdF9pZCBpbiBjb21taXRfaWRzOgor
ICAgICAgICAgICAgY29tbWl0X21lc3NhZ2UgPSB0b29sLnNjbSgpLmNvbW1pdF9tZXNzYWdlX2Zv
cl9jb21taXQoY29tbWl0X2lkKQorICAgICAgICAgICAgY29tbWl0X2xpbmVzID0gY29tbWl0X21l
c3NhZ2Uuc3BsaXRsaW5lcygpCisgICAgICAgICAgICAKKyAgICAgICAgICAgIGRlc2NyaXB0aW9u
ID0gY29tbWl0X2xpbmVzWzBdCisgICAgICAgICAgICBjb21tZW50X3RleHQgPSAiXG4iLmpvaW4o
Y29tbWl0X2xpbmVzWzE6XSkKKyAgICAgICAgCisgICAgICAgICAgICBjb21tZW50X3RleHQgKz0g
IlxuLS0tXG4iCisgICAgICAgICAgICBjb21tZW50X3RleHQgKz0gdG9vbC5zY20oKS5maWxlc19j
aGFuZ2VkX3N1bW1hcnlfZm9yX2NvbW1pdChjb21taXRfaWQpCisgICAgICAgIAorICAgICAgICAg
ICAgIyBUaGlzIGlzIGEgbGl0dGxlIGJpdCBvZiBhIGhhY2ssIHRoYXQgd2UgcGFzcyBzdGRvdXQg
YXMgdGhlIHBhdGNoIGZpbGUKKyAgICAgICAgICAgICMgV2UgY291bGQgYWx0ZXJuYXRpdmVseSBt
YWtlIGFuIGluLW1lbW9yeSBmaWxlLWxpa2Ugb2JqZWN0IHdpdGggdGhlIHBhdGNoIGNvbnRlbnRz
CisgICAgICAgICAgICBkaWZmX3Byb2Nlc3MgPSBzdWJwcm9jZXNzLlBvcGVuKHRvb2wuc2NtKCku
c2hvd19kaWZmX2NvbW1hbmRfZm9yX2NvbW1pdChjb21taXRfaWQpLCBzdGRvdXQ9c3VicHJvY2Vz
cy5QSVBFLCBzaGVsbD1UcnVlKQorICAgICAgICAgICAgdG9vbC5idWdzLmFkZF9wYXRjaF90b19i
dWcoYnVnX2lkLCBkaWZmX3Byb2Nlc3Muc3Rkb3V0LCBkZXNjcmlwdGlvbiwgY29tbWVudF90ZXh0
LCBtYXJrX2Zvcl9yZXZpZXc9b3B0aW9ucy5yZXZpZXcpCisKKworY2xhc3MgTm9uV3JhcHBpbmdF
cGlsb2dJbmRlbnRlZEhlbHBGb3JtYXR0ZXIgKEluZGVudGVkSGVscEZvcm1hdHRlcik6CisgICAg
ZGVmIF9faW5pdF9fKHNlbGYpOgorICAgICAgICBJbmRlbnRlZEhlbHBGb3JtYXR0ZXIuX19pbml0
X18oc2VsZikKKworICAgICMgVGhlIHN0YW5kYXJkIEluZGVudGVkSGVscEZvcm1hdHRlciByZS13
cmFwcyB0aGUgZXBpbG9nIQorICAgIGRlZiBmb3JtYXRfZXBpbG9nKHNlbGYsIGVwaWxvZyk6Cisg
ICAgICAgIGlmIGVwaWxvZzoKKyAgICAgICAgICAgIHJldHVybiAiXG4iICsgZXBpbG9nICsgIlxu
IgorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmV0dXJuICIiCisKK2NsYXNzIEJ1Z3ppbGxh
VG9vbDoKKyAgICBkZWYgX19pbml0X18oc2VsZik6CisgICAgICAgIHNlbGYuY2FjaGVkX3NjbSA9
IE5vbmUKKyAgICAgICAgc2VsZi5idWdzID0gQnVnemlsbGEoKQorICAgICAgICBzZWxmLmNvbW1h
bmRzID0gWworICAgICAgICAgICAgeyAnbmFtZScgOiAnYnVncy10by1jb21taXQnLCAnb2JqZWN0
JyA6IEJ1Z3NJbkNvbW1pdFF1ZXVlKCkgfSwKKyAgICAgICAgICAgIHsgJ25hbWUnIDogJ3BhdGNo
ZXMtdG8tY29tbWl0JywgJ29iamVjdCcgOiBQYXRjaGVzSW5Db21taXRRdWV1ZSgpIH0sCisgICAg
ICAgICAgICB7ICduYW1lJyA6ICdyZXZpZXdlZC1wYXRjaGVzJywgJ29iamVjdCcgOiBSZXZpZXdl
ZFBhdGNoZXNPbkJ1ZygpIH0sCisgICAgICAgICAgICB7ICduYW1lJyA6ICdhcHBseS1wYXRjaGVz
JywgJ29iamVjdCcgOiBBcHBseVBhdGNoZXNGcm9tQnVnKCkgfSwKKyAgICAgICAgICAgIHsgJ25h
bWUnIDogJ2xhbmQtYW5kLXVwZGF0ZScsICdvYmplY3QnIDogTGFuZEFuZFVwZGF0ZUJ1ZygpIH0s
CisgICAgICAgICAgICB7ICduYW1lJyA6ICdsYW5kLXBhdGNoZXMnLCAnb2JqZWN0JyA6IExhbmRQ
YXRjaGVzRnJvbUJ1ZygpIH0sCisgICAgICAgICAgICB7ICduYW1lJyA6ICdjb21taXQtbWVzc2Fn
ZScsICdvYmplY3QnIDogQ29tbWl0TWVzc2FnZUZvckN1cnJlbnREaWZmKCkgfSwKKyAgICAgICAg
ICAgIHsgJ25hbWUnIDogJ29ic29sZXRlLWF0dGFjaG1lbnRzJywgJ29iamVjdCcgOiBPYnNvbGV0
ZUF0dGFjaG1lbnRzT25CdWcoKSB9LAorICAgICAgICAgICAgeyAnbmFtZScgOiAncG9zdC1kaWZm
JywgJ29iamVjdCcgOiBQb3N0RGlmZkFzUGF0Y2hUb0J1ZygpIH0sCisgICAgICAgICAgICB7ICdu
YW1lJyA6ICdwb3N0LWNvbW1pdHMnLCAnb2JqZWN0JyA6IFBvc3RDb21taXRzQXNQYXRjaGVzVG9C
dWcoKSB9LAorICAgICAgICBdCisgICAgICAgIAorICAgICAgICBzZWxmLmdsb2JhbF9vcHRpb25f
cGFyc2VyID0gT3B0aW9uUGFyc2VyKHVzYWdlPXNlbGYudXNhZ2VfbGluZSgpLCBmb3JtYXR0ZXI9
Tm9uV3JhcHBpbmdFcGlsb2dJbmRlbnRlZEhlbHBGb3JtYXR0ZXIoKSwgZXBpbG9nPXNlbGYuY29t
bWFuZHNfdXNhZ2UoKSkKKyAgICAgICAgc2VsZi5nbG9iYWxfb3B0aW9uX3BhcnNlci5hZGRfb3B0
aW9uKCItLWRyeS1ydW4iLCBhY3Rpb249InN0b3JlX3RydWUiLCBkZXN0PSJkcnlydW4iLCBoZWxw
PSJkbyBub3QgdG91Y2ggcmVtb3RlIHNlcnZlcnMiLCBkZWZhdWx0PUZhbHNlKQorICAgIAorICAg
IGRlZiBzY20oc2VsZik6CisgICAgICAgICMgTGF6aWx5IGluaXRpYWxpemUgU0NNIHRvIG5vdCBl
cnJvci1vdXQgYmVmb3JlIGNvbW1hbmQgbGluZSBwYXJzaW5nIChvciB3aGVuIHJ1bm5pbmcgbm9u
LXNjbSBjb21tYW5kcykKKyAgICAgICAgb3JpZ2luYWxfY3dkID0gb3MucGF0aC5hYnNwYXRoKCcu
JykKKyAgICAgICAgaWYgbm90IHNlbGYuY2FjaGVkX3NjbToKKyAgICAgICAgICAgIHNlbGYuY2Fj
aGVkX3NjbSA9IGRldGVjdF9zY21fc3lzdGVtKG9yaWdpbmFsX2N3ZCkKKyAgICAgICAgCisgICAg
ICAgIGlmIG5vdCBzZWxmLmNhY2hlZF9zY206CisgICAgICAgICAgICBzY3JpcHRfZGlyZWN0b3J5
ID0gb3MucGF0aC5hYnNwYXRoKHN5cy5wYXRoWzBdKQorICAgICAgICAgICAgd2Via2l0X2RpcmVj
dG9yeSA9IG9zLnBhdGguYWJzcGF0aChvcy5wYXRoLmpvaW4oc2NyaXB0X2RpcmVjdG9yeSwgIi4u
Ly4uIikpCisgICAgICAgICAgICBzZWxmLmNhY2hlZF9zY20gPSBkZXRlY3Rfc2NtX3N5c3RlbSh3
ZWJraXRfZGlyZWN0b3J5KQorICAgICAgICAgICAgaWYgc2VsZi5jYWNoZWRfc2NtOgorICAgICAg
ICAgICAgICAgIGxvZygiVGhlIGN1cnJlbnQgZGlyZWN0b3J5ICglcykgaXMgbm90IGEgV2ViS2l0
IGNoZWNrb3V0LCB1c2luZyAlcyIgJSAob3JpZ2luYWxfY3dkLCB3ZWJraXRfZGlyZWN0b3J5KSkK
KyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgZXJyb3IoIkZBVEFMOiBGYWlsZWQg
dG8gZGV0ZXJtaW5lIHRoZSBTQ00gc3lzdGVtIGZvciBlaXRoZXIgJXMgb3IgJXMiICUgKG9yaWdp
bmFsX2N3ZCwgd2Via2l0X2RpcmVjdG9yeSkpCisgICAgICAgIAorICAgICAgICByZXR1cm4gc2Vs
Zi5jYWNoZWRfc2NtCisgICAgCisgICAgZGVmIHVzYWdlX2xpbmUoc2VsZik6CisgICAgICAgIHJl
dHVybiAiVXNhZ2U6ICVwcm9nIFtvcHRpb25zXSBjb21tYW5kIFtjb21tYW5kLW9wdGlvbnNdIFtj
b21tYW5kLWFyZ3VtZW50c10iCisgICAgCisgICAgZGVmIGNvbW1hbmRzX3VzYWdlKHNlbGYpOgor
ICAgICAgICBjb21tYW5kc190ZXh0ID0gIkNvbW1hbmRzOlxuIgorICAgICAgICBsb25nZXN0X25h
bWVfbGVuZ3RoID0gMAorICAgICAgICBjb21tYW5kX3Jvd3MgPSBbXQorICAgICAgICBmb3IgY29t
bWFuZCBpbiBzZWxmLmNvbW1hbmRzOgorICAgICAgICAgICAgY29tbWFuZF9vYmplY3QgPSBjb21t
YW5kWydvYmplY3QnXQorICAgICAgICAgICAgY29tbWFuZF9uYW1lX2FuZF9hcmdzID0gY29tbWFu
ZF9vYmplY3QubmFtZV93aXRoX2FyZ3VtZW50cyhjb21tYW5kWyduYW1lJ10pCisgICAgICAgICAg
ICBjb21tYW5kX3Jvd3MuYXBwZW5kKHsgJ25hbWUtYW5kLWFyZ3MnOiBjb21tYW5kX25hbWVfYW5k
X2FyZ3MsICdvYmplY3QnOiBjb21tYW5kX29iamVjdCB9KQorICAgICAgICAgICAgbG9uZ2VzdF9u
YW1lX2xlbmd0aCA9IG1heChbbG9uZ2VzdF9uYW1lX2xlbmd0aCwgbGVuKGNvbW1hbmRfbmFtZV9h
bmRfYXJncyldKQorICAgICAgICAKKyAgICAgICAgIyBVc2Ugb3VyIG93biBoZWxwIGZvcm1hdHRl
ciBzbyBhcyB0byBpbmRlbnQgZW5vdWdoCisgICAgICAgIGZvcm1hdHRlciA9IEluZGVudGVkSGVs
cEZvcm1hdHRlcigpCisgICAgICAgIGZvcm1hdHRlci5pbmRlbnQoKQorICAgICAgICBmb3JtYXR0
ZXIuaW5kZW50KCkKKyAgICAgICAgCisgICAgICAgIGZvciByb3cgaW4gY29tbWFuZF9yb3dzOgor
ICAgICAgICAgICAgY29tbWFuZF9vYmplY3QgPSByb3dbJ29iamVjdCddCisgICAgICAgICAgICBj
b21tYW5kc190ZXh0ICs9ICIgICIgKyByb3dbJ25hbWUtYW5kLWFyZ3MnXS5sanVzdChsb25nZXN0
X25hbWVfbGVuZ3RoICsgMykgKyBjb21tYW5kX29iamVjdC5oZWxwX3RleHQgKyAiXG4iCisgICAg
ICAgICAgICBjb21tYW5kc190ZXh0ICs9IGNvbW1hbmRfb2JqZWN0Lm9wdGlvbl9wYXJzZXIuZm9y
bWF0X29wdGlvbl9oZWxwKGZvcm1hdHRlcikKKyAgICAgICAgcmV0dXJuIGNvbW1hbmRzX3RleHQK
KworICAgIGRlZiBoYW5kbGVfZ2xvYmFsX2FyZ3Moc2VsZiwgYXJncyk6CisgICAgICAgIChvcHRp
b25zLCBhcmdzKSA9IHNlbGYuZ2xvYmFsX29wdGlvbl9wYXJzZXIucGFyc2VfYXJncyhhcmdzKQor
ICAgICAgICBpZiBsZW4oYXJncyk6CisgICAgICAgICAgICAjIFdlJ2xsIG5ldmVyIGhpdCB0aGlz
IGJlY2F1c2Ugc3BsaXRfYXJncyBzcGxpdHMgYXQgdGhlIGZpcnN0IGFyZyB3aXRob3V0IGEgbGVh
ZGluZyAnLScKKyAgICAgICAgICAgIHNlbGYuZ2xvYmFsX29wdGlvbl9wYXJzZXIuZXJyb3IoIkV4
dHJhIGFyZ3VtZW50cyBiZWZvcmUgY29tbWFuZDogIiArIGFyZ3MpCisgICAgICAgIAorICAgICAg
ICBpZiBvcHRpb25zLmRyeXJ1bjoKKyAgICAgICAgICAgIHNlbGYuc2NtKCkuZHJ5cnVuID0gVHJ1
ZQorICAgICAgICAgICAgc2VsZi5idWdzLmRyeXJ1biA9IFRydWUKKyAgICAKKyAgICBkZWYgc3Bs
aXRfYXJncyhzZWxmLCBhcmdzKToKKyAgICAgICAgIyBBc3N1bWUgdGhlIGZpcnN0IGFyZ3VtZW50
IHdoaWNoIGRvZXNuJ3Qgc3RhcnQgd2l0aCAnLScgaXMgdGhlIGNvbW1hbmQgbmFtZQorICAgICAg
ICBjb21tYW5kX2luZGV4ID0gMAorICAgICAgICBmb3IgYXJnIGluIGFyZ3M6CisgICAgICAgICAg
ICBpZiBhcmdbMF0gIT0gJy0nOgorICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICBj
b21tYW5kX2luZGV4ICs9IDEKKworICAgICAgICBnbG9iYWxfYXJncyA9IGFyZ3NbOmNvbW1hbmRf
aW5kZXhdCisgICAgICAgIGlmIGNvbW1hbmRfaW5kZXggPj0gbGVuKGFyZ3MpOgorICAgICAgICAg
ICAgcmV0dXJuIChnbG9iYWxfYXJncywgTm9uZSwgW10pCisKKyAgICAgICAgY29tbWFuZCA9IGFy
Z3NbY29tbWFuZF9pbmRleF0KKyAgICAgICAgY29tbWFuZF9hcmdzID0gYXJnc1tjb21tYW5kX2lu
ZGV4ICsgMTpdCisgICAgICAgIHJldHVybiAoZ2xvYmFsX2FyZ3MsIGNvbW1hbmQsIGNvbW1hbmRf
YXJncykKKyAgICAKKyAgICBkZWYgY29tbWFuZF9ieV9uYW1lKHNlbGYsIGNvbW1hbmRfbmFtZSk6
CisgICAgICAgIGZvciBjb21tYW5kIGluIHNlbGYuY29tbWFuZHM6CisgICAgICAgICAgICBpZiBj
b21tYW5kX25hbWUgPT0gY29tbWFuZFsnbmFtZSddOgorICAgICAgICAgICAgICAgIHJldHVybiBj
b21tYW5kCisgICAgICAgIHJldHVybiBOb25lCisgICAgCisgICAgZGVmIG1haW4oc2VsZik6Cisg
ICAgICAgIChnbG9iYWxfYXJncywgY29tbWFuZF9uYW1lLCBhcmdzX2FmdGVyX2NvbW1hbmRfbmFt
ZSkgPSBzZWxmLnNwbGl0X2FyZ3Moc3lzLmFyZ3ZbMTpdKQorICAgICAgICAKKyAgICAgICAgIyBI
YW5kbGUgLS1oZWxwLCBldGM6CisgICAgICAgIHNlbGYuaGFuZGxlX2dsb2JhbF9hcmdzKGdsb2Jh
bF9hcmdzKQorICAgICAgICAKKyAgICAgICAgaWYgbm90IGNvbW1hbmRfbmFtZToKKyAgICAgICAg
ICAgIHNlbGYuZ2xvYmFsX29wdGlvbl9wYXJzZXIuZXJyb3IoIk5vIGNvbW1hbmQgc3BlY2lmaWVk
IikKKyAgICAgICAgCisgICAgICAgIGNvbW1hbmQgPSBzZWxmLmNvbW1hbmRfYnlfbmFtZShjb21t
YW5kX25hbWUpCisgICAgICAgIGlmIG5vdCBjb21tYW5kOgorICAgICAgICAgICAgc2VsZi5nbG9i
YWxfb3B0aW9uX3BhcnNlci5lcnJvcihjb21tYW5kX25hbWUgKyAiIGlzIG5vdCBhIHJlY29nbml6
ZWQgY29tbWFuZCIpCisgICAgICAgIAorICAgICAgICBjb21tYW5kX29iamVjdCA9IGNvbW1hbmRb
J29iamVjdCddCisgICAgICAgIChjb21tYW5kX29wdGlvbnMsIGNvbW1hbmRfYXJncykgPSBjb21t
YW5kX29iamVjdC5wYXJzZV9hcmdzKGFyZ3NfYWZ0ZXJfY29tbWFuZF9uYW1lKQorICAgICAgICBy
ZXR1cm4gY29tbWFuZF9vYmplY3QuZXhlY3V0ZShjb21tYW5kX29wdGlvbnMsIGNvbW1hbmRfYXJn
cywgc2VsZikKKworCitkZWYgbWFpbigpOgorICAgIHRvb2wgPSBCdWd6aWxsYVRvb2woKQorICAg
IHJldHVybiB0b29sLm1haW4oKQorCitpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgorICAgIG1h
aW4oKQpkaWZmIC0tZ2l0IGEvV2ViS2l0VG9vbHMvU2NyaXB0cy9tb2R1bGVzL2J1Z3ppbGxhLnB5
IGIvV2ViS2l0VG9vbHMvU2NyaXB0cy9tb2R1bGVzL2J1Z3ppbGxhLnB5Cm5ldyBmaWxlIG1vZGUg
MTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ0MmM1ZjkKLS0tIC9kZXYvbnVsbAorKysgYi9XZWJLaXRU
b29scy9TY3JpcHRzL21vZHVsZXMvYnVnemlsbGEucHkKQEAgLTAsMCArMSwyNTggQEAKKyMgQ29w
eXJpZ2h0IChDKSAyMDA5IEdvb2dsZSwgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyMKKyMg
UmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBv
ciB3aXRob3V0CisjIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRo
ZSBmb2xsb3dpbmcgY29uZGl0aW9ucworIyBhcmUgbWV0OgorIyAxLiBSZWRpc3RyaWJ1dGlvbnMg
b2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorIyAgICBub3Rp
Y2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIu
CisjIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUg
YWJvdmUgY29weXJpZ2h0CisjICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5k
IHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyMgICAgZG9jdW1lbnRhdGlvbiBhbmQv
b3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyMKKyMg
VEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBDT01QVVRFUiwgSU5DLiBgYEFTIElT
JycgQU5EIEFOWQorIyBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBC
VVQgTk9UIExJTUlURUQgVE8sIFRIRQorIyBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRB
QklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyMgUFVSUE9TRSBBUkUgRElTQ0xB
SU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIENPTVBVVEVSLCBJTkMuIE9SCisjIENPTlRS
SUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBT
UEVDSUFMLAorIyBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5H
LCBCVVQgTk9UIExJTUlURUQgVE8sCisjIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMg
T1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorIyBQUk9GSVRTOyBPUiBCVVNJTkVT
UyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisjIE9GIExJ
QUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAor
IyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkg
T1VUIE9GIFRIRSBVU0UKKyMgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRI
RSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyMKKyMgV2ViS2l0J3MgUHl0aG9uIG1vZHVs
ZSBmb3IgaW50ZXJhY3Rpbmcgd2l0aCBCdWd6aWxsYQorCitpbXBvcnQgZ2V0cGFzcworaW1wb3J0
IHN1YnByb2Nlc3MKK2ltcG9ydCBzeXMKK2ltcG9ydCB1cmxsaWIyCisKK2Zyb20gQmVhdXRpZnVs
U291cCBpbXBvcnQgQmVhdXRpZnVsU291cAorZnJvbSBtZWNoYW5pemUgaW1wb3J0IEJyb3dzZXIK
KworZGVmIGxvZyhzdHJpbmcpOgorICAgIHByaW50ID4+IHN5cy5zdGRlcnIsIHN0cmluZworCisj
IEhBQ0s6IFRoaXMgc2hvdWxkIG5vdCBkZXBlbmQgb24gZ2l0IGZvciBjb25maWcgc3RvcmFnZQor
ZGVmIHJlYWRfY29uZmlnKGtleSk6CisgICAgIyBOZWVkIGEgd2F5IHRvIHJlYWQgZnJvbSBzdm4g
dG9vCisgICAgY29uZmlnX3Byb2Nlc3MgPSBzdWJwcm9jZXNzLlBvcGVuKCJnaXQgY29uZmlnIC0t
Z2V0IGJ1Z3ppbGxhLiIgKyBrZXksIHN0ZG91dD1zdWJwcm9jZXNzLlBJUEUsIHNoZWxsPVRydWUp
CisgICAgdmFsdWUgPSBjb25maWdfcHJvY2Vzcy5jb21tdW5pY2F0ZSgpWzBdCisgICAgcmV0dXJu
X2NvZGUgPSBjb25maWdfcHJvY2Vzcy53YWl0KCkKKworICAgIGlmIHJldHVybl9jb2RlICE9IDA6
CisgICAgICAgIHJldHVybiBOb25lCisgICAgcmV0dXJuIHZhbHVlLnJzdHJpcCgnXG4nKQorCitj
bGFzcyBCdWd6aWxsYToKKyAgICBkZWYgX19pbml0X18oc2VsZiwgZHJ5cnVuID0gRmFsc2UpOgor
ICAgICAgICBzZWxmLmRyeXJ1biA9IGRyeXJ1bgorICAgICAgICBzZWxmLmF1dGhlbnRpY2F0ZWQg
PSBGYWxzZQorICAgICAgICAKKyAgICAgICAgIyBEZWZhdWx0cyAodW50aWwgd2Ugc3VwcG9ydCBi
ZXR0ZXIgb3B0aW9uIHBhcnNpbmcpOgorICAgICAgICBzZWxmLmJ1Z19zZXJ2ZXIgPSAiaHR0cHM6
Ly9idWdzLndlYmtpdC5vcmcvIgorICAgICAgICAKKyAgICAgICAgc2VsZi5iciA9IEJyb3dzZXIo
KQorICAgICAgICAjIElnbm9yZSBidWdzLndlYmtpdC5vcmcvcm9ib3RzLnR4dCB1bnRpbCB3ZSBm
aXggaXQgdG8gYWxsb3cgdGhpcyBzY3JpcHQKKyAgICAgICAgc2VsZi5ici5zZXRfaGFuZGxlX3Jv
Ym90cyhGYWxzZSkKKworICAgICMgVGhpcyBjb3VsZCBldmVudHVhbGx5IGJlIGEgdGV4dCBmaWxl
CisgICAgcmV2aWV3ZXJfdXNlcm5hbWVzX3RvX2Z1bGxfbmFtZXMgPSB7CisgICAgICAgICJhYmFy
dGgiIDogIkFkYW0gQmFydGgiLAorICAgICAgICAiYWRlbGUiIDogIkFkZWxlIFBldGVyc29uIiwK
KyAgICAgICAgImFyaXlhLmhpZGF5YXQiIDogIkFyaXlhIEhpZGF5YXQiLAorICAgICAgICAiZGFy
aW4iIDogIkRhcmluIEFkbGVyIiwKKyAgICAgICAgImRnbGF6a292IiA6ICJEaW1pdHJpIEdsYXpr
b3YiLAorICAgICAgICAiZXJpYyIgOiAiRXJpYyBTZWlkZWwiLAorICAgICAgICAiZGRraWx6ZXIi
IDogIkRhdmlkIEtpbHplciIsCisgICAgICAgICJmaXNoZCIgOiAiRGFyaW4gRmlzaGVyIiwKKyAg
ICAgICAgImducyIgOiAiR3VzdGF2byBOb3JvbmhhIiwKKyAgICAgICAgImh5YXR0IiA6ICJEYXZp
ZCBIeWF0dCIsCisgICAgICAgICJqbWFsb256byIgOiAiSmFuIEFsb256byIsCisgICAgICAgICJs
ZXZpbiIgOiAiRGF2aWQgTGV2aW4iLAorICAgICAgICAibWl0eiIgOiAiRGFuIEJlcm5zdGVpbiIs
CisgICAgICAgICJtanMiIDogIk1hY2llaiBTdGFjaG92aWFrIiwKKyAgICAgICAgIm1yb3dlIiA6
ICJNYXJrIFJvd2UiLAorICAgICAgICAib2xpdmVyIiA6ICJPbGl2ZXIgSHVudCIsCisgICAgICAg
ICJzdGFpa29zIiA6ICJHZW9yZ2UgU3RhaWtvcyIsCisgICAgICAgICJ0cmVhdCIgOiAiQWRhbSBU
cmVhdCIsCisgICAgICAgICJ0aW1vdGh5IiA6ICJUaW1vdGh5IEhhdGNoZXIiLAorICAgICAgICAi
eGFuLmxvcGV6IiA6ICJYYW4gTG9wZXoiLAorICAgICAgICAiemVja2UiIDogIkhvbGdlciBGcmV5
dGhlciIsCisgICAgfQorCisgICAgZGVmIGZ1bGxfbmFtZV9mcm9tX2J1Z3ppbGxhX25hbWUoc2Vs
ZiwgYnVnemlsbGFfbmFtZSk6CisgICAgICAgIGlmIG5vdCBidWd6aWxsYV9uYW1lIGluIHNlbGYu
cmV2aWV3ZXJfdXNlcm5hbWVzX3RvX2Z1bGxfbmFtZXM6CisgICAgICAgICAgICByYWlzZSBFeGNl
cHRpb24oIkVSUk9SOiBVbmtub3duIHJldmlld2VyISAiICsgYnVnemlsbGFfbmFtZSkKKyAgICAg
ICAgcmV0dXJuIHNlbGYucmV2aWV3ZXJfdXNlcm5hbWVzX3RvX2Z1bGxfbmFtZXNbYnVnemlsbGFf
bmFtZV0KKworICAgIGRlZiBidWdfdXJsX2Zvcl9idWdfaWQoc2VsZiwgYnVnX2lkKToKKyAgICAg
ICAgYnVnX2Jhc2VfdXJsID0gc2VsZi5idWdfc2VydmVyICsgInNob3dfYnVnLmNnaT9pZD0iCisg
ICAgICAgIHJldHVybiAiJXMlcyIgJSAoYnVnX2Jhc2VfdXJsLCBidWdfaWQpCisgICAgCisgICAg
ZGVmIGF0dGFjaG1lbnRfdXJsX2Zvcl9pZChzZWxmLCBhdHRhY2htZW50X2lkLCBhY3Rpb24gPSAi
dmlldyIpOgorICAgICAgICBhdHRhY2htZW50X2Jhc2VfdXJsID0gc2VsZi5idWdfc2VydmVyICsg
ImF0dGFjaG1lbnQuY2dpP2lkPSIKKyAgICAgICAgcmV0dXJuICIlcyVzJmFjdGlvbj0lcyIgJSAo
YXR0YWNobWVudF9iYXNlX3VybCwgYXR0YWNobWVudF9pZCwgYWN0aW9uKQorCisgICAgZGVmIGZl
dGNoX2F0dGFjaG1lbnRzX2Zyb21fYnVnKHNlbGYsIGJ1Z19pZCk6CisgICAgICAgIGJ1Z191cmwg
PSBzZWxmLmJ1Z191cmxfZm9yX2J1Z19pZChidWdfaWQpCisgICAgICAgIGxvZygiRmV0Y2hpbmc6
ICIgKyBidWdfdXJsKQorCisgICAgICAgIHBhZ2UgPSB1cmxsaWIyLnVybG9wZW4oYnVnX3VybCkK
KyAgICAgICAgc291cCA9IEJlYXV0aWZ1bFNvdXAocGFnZSkKKyAgICAKKyAgICAgICAgYXR0YWNo
bWVudF90YWJsZSA9IHNvdXAuZmluZCgndGFibGUnLCB7J2NlbGxzcGFjaW5nJzoiMCIsICdjZWxs
cGFkZGluZyc6IjQiLCAnYm9yZGVyJzoiMSJ9KQorICAgIAorICAgICAgICBhdHRhY2htZW50cyA9
IFtdCisgICAgICAgICMgR3JhYiBhIGxpc3Qgb2Ygbm9uLW9ic29sZXRlZCBwYXRjaCBmaWxlcyAK
KyAgICAgICAgZm9yIGF0dGFjaG1lbnRfcm93IGluIGF0dGFjaG1lbnRfdGFibGUuZmluZEFsbCgn
dHInKToKKyAgICAgICAgICAgIGZpcnN0X2NlbGwgPSBhdHRhY2htZW50X3Jvdy5maW5kKCd0ZCcp
CisgICAgICAgICAgICBpZiBub3QgZmlyc3RfY2VsbDoKKyAgICAgICAgICAgICAgICBjb250aW51
ZSAjIFRoaXMgaXMgdGhlIGhlYWRlciwgbm8gY2VsbHMKKyAgICAgICAgICAgIGlmIGZpcnN0X2Nl
bGwuaGFzX2tleSgnY29sc3BhbicpOgorICAgICAgICAgICAgICAgIGJyZWFrICMgdGhpcyBpcyB0
aGUgbGFzdCByb3cKKyAgICAgICAgICAgIAorICAgICAgICAgICAgYXR0YWNobWVudCA9IHt9Cisg
ICAgICAgICAgICBhdHRhY2htZW50WydvYnNvbGV0ZSddID0gKGF0dGFjaG1lbnRfcm93Lmhhc19r
ZXkoJ2NsYXNzJykgYW5kIGF0dGFjaG1lbnRfcm93WydjbGFzcyddID09ICJiel9vYnNvbGV0ZSIp
CisgICAgICAgICAgICAKKyAgICAgICAgICAgIGNlbGxzID0gYXR0YWNobWVudF9yb3cuZmluZEFs
bCgndGQnKQorICAgICAgICAgICAgYXR0YWNobWVudF9saW5rID0gY2VsbHNbMF0uZmluZCgnYScp
CisgICAgICAgICAgICBhdHRhY2htZW50Wyd1cmwnXSA9IHNlbGYuYnVnX3NlcnZlciArIGF0dGFj
aG1lbnRfbGlua1snaHJlZiddICMgdXJscyBhcmUgcmVsYXRpdmUKKyAgICAgICAgICAgIGF0dGFj
aG1lbnRbJ2lkJ10gPSBhdHRhY2htZW50Wyd1cmwnXS5zcGxpdCgnPScpWzFdICMgZS5nLiBodHRw
czovL2J1Z3Mud2Via2l0Lm9yZy9hdHRhY2htZW50LmNnaT9pZD0zMTIyMworICAgICAgICAgICAg
YXR0YWNobWVudFsnbmFtZSddID0gYXR0YWNobWVudF9saW5rLnN0cmluZworICAgICAgICAgICAg
IyBhdHRhY2htZW50Wyd0eXBlJ10gPSBjZWxsc1sxXQorICAgICAgICAgICAgIyBhdHRhY2htZW50
WydkYXRlJ10gPSBjZWxsc1syXQorICAgICAgICAgICAgIyBhdHRhY2htZW50WydzaXplJ10gPSBj
ZWxsc1szXQorICAgICAgICAgICAgcmV2aWV3X3N0YXR1cyA9IGNlbGxzWzRdCisgICAgICAgICAg
ICAjIGFjdGlvbl9saW5rcyA9IGNlbGxzWzVdCisKKyAgICAgICAgICAgIGlmIChzdHIocmV2aWV3
X3N0YXR1cykuZmluZCgicmV2aWV3KyIpICE9IC0xKToKKyAgICAgICAgICAgICAgICByZXZpZXdl
ciA9IHJldmlld19zdGF0dXMuY29udGVudHNbMF0uc3BsaXQoJzonKVswXSAjIG5hbWU6XG4gcmV2
aWV3K1xuCisgICAgICAgICAgICAgICAgcmV2aWV3ZXJfZnVsbF9uYW1lID0gc2VsZi5mdWxsX25h
bWVfZnJvbV9idWd6aWxsYV9uYW1lKHJldmlld2VyKQorICAgICAgICAgICAgICAgIGF0dGFjaG1l
bnRbJ3Jldmlld2VyJ10gPSByZXZpZXdlcl9mdWxsX25hbWUKKworICAgICAgICAgICAgYXR0YWNo
bWVudHMuYXBwZW5kKGF0dGFjaG1lbnQpCisgICAgICAgIHJldHVybiBhdHRhY2htZW50cworCisg
ICAgZGVmIGZldGNoX3Jldmlld2VkX3BhdGNoZXNfZnJvbV9idWcoc2VsZiwgYnVnX2lkKToKKyAg
ICAgICAgcmV2aWV3ZWRfcGF0Y2hlcyA9IFtdCisgICAgICAgIGZvciBhdHRhY2htZW50IGluIHNl
bGYuZmV0Y2hfYXR0YWNobWVudHNfZnJvbV9idWcoYnVnX2lkKToKKyAgICAgICAgICAgIGlmICdy
ZXZpZXdlcicgaW4gYXR0YWNobWVudCBhbmQgbm90IGF0dGFjaG1lbnRbJ29ic29sZXRlJ106Cisg
ICAgICAgICAgICAgICAgcmV2aWV3ZWRfcGF0Y2hlcy5hcHBlbmQoYXR0YWNobWVudCkKKyAgICAg
ICAgcmV0dXJuIHJldmlld2VkX3BhdGNoZXMKKworICAgIGRlZiBmZXRjaF9idWdfaWRzX2Zyb21f
Y29tbWl0X3F1ZXVlKHNlbGYpOgorICAgICAgICAjIHVuYXNzaWduZWRfb25seSA9ICImZW1haWxh
c3NpZ25lZF90bzE9MSZlbWFpbHR5cGUxPXN1YnN0cmluZyZlbWFpbDE9dW5hc3NpZ25lZCIKKyAg
ICAgICAgY29tbWl0X3F1ZXVlX3VybCA9ICJodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9idWdsaXN0
LmNnaT9xdWVyeV9mb3JtYXQ9YWR2YW5jZWQmYnVnX3N0YXR1cz1VTkNPTkZJUk1FRCZidWdfc3Rh
dHVzPU5FVyZidWdfc3RhdHVzPUFTU0lHTkVEJmJ1Z19zdGF0dXM9UkVPUEVORUQmZmllbGQwLTAt
MD1mbGFndHlwZXMubmFtZSZ0eXBlMC0wLTA9ZXF1YWxzJnZhbHVlMC0wLTA9cmV2aWV3JTJCIgor
ICAgICAgICBsb2coIkxvYWRpbmcgY29tbWl0IHF1ZXVlIikKKworICAgICAgICBwYWdlID0gdXJs
bGliMi51cmxvcGVuKGNvbW1pdF9xdWV1ZV91cmwpCisgICAgICAgIHNvdXAgPSBCZWF1dGlmdWxT
b3VwKHBhZ2UpCisgICAgCisgICAgICAgIGJ1Z19pZHMgPSBbXQorICAgICAgICAjIEdyYWIgdGhl
IGNlbGxzIGluIHRoZSBmaXJzdCBjb2x1bW4gKHdoaWNoIGhhcHBlbnMgdG8gYmUgdGhlIGJ1ZyBp
ZHMpCisgICAgICAgIGZvciBidWdfbGlua19jZWxsIGluIHNvdXAoJ3RkJywgImZpcnN0LWNoaWxk
Iik6ICMgdGRzIHdpdGggdGhlIGNsYXNzICJmaXJzdC1jaGlsZCIKKyAgICAgICAgICAgIGJ1Z19s
aW5rID0gYnVnX2xpbmtfY2VsbC5maW5kKCJhIikKKyAgICAgICAgICAgIGJ1Z19pZHMuYXBwZW5k
KGJ1Z19saW5rLnN0cmluZykgIyB0aGUgY29udGVudHMgaGFwcGVuIHRvIGJlIHRoZSBidWcgaWQK
KyAgICAKKyAgICAgICAgcmV0dXJuIGJ1Z19pZHMKKworICAgIGRlZiBmZXRjaF9wYXRjaGVzX2Zy
b21fY29tbWl0X3F1ZXVlKHNlbGYpOgorICAgICAgICBwYXRjaGVzX3RvX2xhbmQgPSBbXQorICAg
ICAgICBmb3IgYnVnX2lkIGluIHNlbGYuZmV0Y2hfYnVnX2lkc19mcm9tX2NvbW1pdF9xdWV1ZSgp
OgorICAgICAgICAgICAgcGF0Y2hlcyA9IHNlbGYuZmV0Y2hfcmV2aWV3ZWRfcGF0Y2hlc19mcm9t
X2J1ZyhidWdfaWQpCisgICAgICAgICAgICBwYXRjaGVzX3RvX2xhbmQuZXh0ZW5kKHBhdGNoZXMp
CisgICAgICAgIHJldHVybiBwYXRjaGVzX3RvX2xhbmQKKworICAgIGRlZiBhdXRoZW50aWNhdGUo
c2VsZiwgdXNlcm5hbWUgPSBOb25lLCBwYXNzd29yZCA9IE5vbmUpOgorICAgICAgICBpZiAoc2Vs
Zi5hdXRoZW50aWNhdGVkKToKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICAKKyAgICAgICAg
aWYgbm90IHVzZXJuYW1lOgorICAgICAgICAgICAgdXNlcm5hbWUgPSByZWFkX2NvbmZpZygidXNl
cm5hbWUiKQorICAgICAgICAgICAgaWYgbm90IHVzZXJuYW1lOgorICAgICAgICAgICAgICAgIHVz
ZXJuYW1lID0gcmF3X2lucHV0KCJCdWd6aWxsYSBsb2dpbjogIikKKyAgICAgICAgaWYgbm90IHBh
c3N3b3JkOgorICAgICAgICAgICAgcGFzc3dvcmQgPSByZWFkX2NvbmZpZygicGFzc3dvcmQiKQor
ICAgICAgICAgICAgaWYgbm90IHBhc3N3b3JkOgorICAgICAgICAgICAgICAgIHBhc3N3b3JkID0g
Z2V0cGFzcy5nZXRwYXNzKCJCdWd6aWxsYSBwYXNzd29yZCBmb3IgJXM6ICIgJSAodXNlcm5hbWUs
KSkKKworICAgICAgICBsb2coIkxvZ2dpbmcgaW4gYXMgJXMuLi4iICUgKHVzZXJuYW1lLCkpCisg
ICAgICAgIGlmIHNlbGYuZHJ5cnVuOgorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIHNlbGYu
YnIub3BlbihzZWxmLmJ1Z19zZXJ2ZXIgKyAiL2luZGV4LmNnaT9Hb0FoZWFkQW5kTG9nSW49MSIp
CisgICAgICAgIHNlbGYuYnIuc2VsZWN0X2Zvcm0obmFtZT0ibG9naW4iKQorICAgICAgICBzZWxm
LmJyWydCdWd6aWxsYV9sb2dpbiddID0gdXNlcm5hbWUKKyAgICAgICAgc2VsZi5iclsnQnVnemls
bGFfcGFzc3dvcmQnXSA9IHBhc3N3b3JkCisgICAgICAgIHNlbGYuYnIuc3VibWl0KCkKKworICAg
ICAgICAjIFdlIHJlYWxseSBzaG91bGQgY2hlY2sgdGhlIHJlc3VsdCBjb2RlcyBhbmQgdHJ5IGFn
YWluIGFzIG5lY2Vzc2FyeQorICAgICAgICBzZWxmLmF1dGhlbnRpY2F0ZWQgPSBUcnVlCisKKyAg
ICBkZWYgYWRkX3BhdGNoX3RvX2J1ZyhzZWxmLCBidWdfaWQsIHBhdGNoX2ZpbGVfb2JqZWN0LCBk
ZXNjcmlwdGlvbiwgY29tbWVudF90ZXh0ID0gTm9uZSwgbWFya19mb3JfcmV2aWV3ID0gRmFsc2Up
OgorICAgICAgICBzZWxmLmF1dGhlbnRpY2F0ZSgpCisgICAgICAgIAorICAgICAgICBsb2coIkFk
ZGluZyBwYXRjaCBcIiVzXCIgdG8gYnVnICVzIiAlIChkZXNjcmlwdGlvbiwgYnVnX2lkKSkKKyAg
ICAgICAgaWYgc2VsZi5kcnlydW46CisgICAgICAgICAgICBsb2coY29tbWVudF90ZXh0KQorICAg
ICAgICAgICAgcmV0dXJuCisgICAgICAgIAorICAgICAgICBzZWxmLmJyLm9wZW4oc2VsZi5idWdf
c2VydmVyICsgIi9hdHRhY2htZW50LmNnaT9hY3Rpb249ZW50ZXImYnVnaWQ9IiArIGJ1Z19pZCkK
KyAgICAgICAgc2VsZi5ici5zZWxlY3RfZm9ybShuYW1lPSJlbnRyeWZvcm0iKQorICAgICAgICBz
ZWxmLmJyWydkZXNjcmlwdGlvbiddID0gZGVzY3JpcHRpb24KKyAgICAgICAgc2VsZi5iclsnaXNw
YXRjaCddID0gKCIxIiwpCisgICAgICAgIGlmIChjb21tZW50X3RleHQpOgorICAgICAgICAgICAg
bG9nKGNvbW1lbnRfdGV4dCkKKyAgICAgICAgICAgIHNlbGYuYnJbJ2NvbW1lbnQnXSA9IGNvbW1l
bnRfdGV4dAorICAgICAgICBzZWxmLmJyWydmbGFnX3R5cGUtMSddID0gKCc/JywpIGlmIG1hcmtf
Zm9yX3JldmlldyBlbHNlICgnWCcsKQorICAgICAgICBzZWxmLmJyLmFkZF9maWxlKHBhdGNoX2Zp
bGVfb2JqZWN0LCAidGV4dC9wbGFpbiIsICJidWd6aWxsYV9yZXF1aXJlc19hX2ZpbGVuYW1lLnBh
dGNoIikKKyAgICAgICAgc2VsZi5ici5zdWJtaXQoKQorCisgICAgZGVmIG9ic29sZXRlX2F0dGFj
aG1lbnQoc2VsZiwgYXR0YWNobWVudF9pZCwgY29tbWVudF90ZXh0ID0gTm9uZSk6CisgICAgICAg
IHNlbGYuYXV0aGVudGljYXRlKCkKKworICAgICAgICBsb2coIk9ic29sZXRpbmcgYXR0YWNobWVu
dDogJXMiICUgKGF0dGFjaG1lbnRfaWQsKSkKKyAgICAgICAgaWYgc2VsZi5kcnlydW46CisgICAg
ICAgICAgICBsb2coY29tbWVudF90ZXh0KQorICAgICAgICAgICAgcmV0dXJuCisKKyAgICAgICAg
c2VsZi5ici5vcGVuKHNlbGYuYXR0YWNobWVudF91cmxfZm9yX2lkKGF0dGFjaG1lbnRfaWQsICdl
ZGl0JykpCisgICAgICAgIHNlbGYuYnIuc2VsZWN0X2Zvcm0obnI9MCkKKyAgICAgICAgc2VsZi5i
ci5maW5kX2NvbnRyb2woJ2lzb2Jzb2xldGUnKS5pdGVtc1swXS5zZWxlY3RlZCA9IFRydWUKKyAg
ICAgICAgIyBBbHNvIGNsZWFyIGFueSByZXZpZXcgZmxhZyAodG8gcmVtb3ZlIGl0IGZyb20gcmV2
aWV3L2NvbW1pdCBxdWV1ZXMpCisgICAgICAgIHNlbGYuYnIuZmluZF9jb250cm9sKHR5cGU9J3Nl
bGVjdCcsIG5yPTApLnZhbHVlID0gKCJYIiwpCisgICAgICAgIGlmIGNvbW1lbnRfdGV4dDoKKyAg
ICAgICAgICAgIGxvZyhjb21tZW50X3RleHQpCisgICAgICAgICAgICBzZWxmLmJyWydjb21tZW50
J10gPSBjb21tZW50X3RleHQKKyAgICAgICAgc2VsZi5ici5zdWJtaXQoKQorICAgIAorICAgIGRl
ZiBwb3N0X2NvbW1lbnRfdG9fYnVnKHNlbGYsIGJ1Z19pZCwgY29tbWVudF90ZXh0KToKKyAgICAg
ICAgc2VsZi5hdXRoZW50aWNhdGUoKQorCisgICAgICAgIGxvZygiQWRkaW5nIGNvbW1lbnQgdG8g
YnVnICVzIiAlIChidWdfaWQsKSkKKyAgICAgICAgaWYgc2VsZi5kcnlydW46CisgICAgICAgICAg
ICBsb2coY29tbWVudF90ZXh0KQorICAgICAgICAgICAgcmV0dXJuCisKKyAgICAgICAgc2VsZi5i
ci5vcGVuKHNlbGYuYnVnX3VybF9mb3JfYnVnX2lkKGJ1Z19pZCkpCisgICAgICAgIHNlbGYuYnIu
c2VsZWN0X2Zvcm0obmFtZT0iY2hhbmdlZm9ybSIpCisgICAgICAgIHNlbGYuYnJbJ2NvbW1lbnQn
XSA9IGNvbW1lbnRfdGV4dAorICAgICAgICBzZWxmLmJyLnN1Ym1pdCgpCisKKyAgICBkZWYgY2xv
c2VfYnVnX2FzX2ZpeGVkKHNlbGYsIGJ1Z19pZCwgY29tbWVudF90ZXh0ID0gTm9uZSk6CisgICAg
ICAgIHNlbGYuYXV0aGVudGljYXRlKCkKKworICAgICAgICBsb2coIkNsb3NpbmcgYnVnICVzIGFz
IGZpeGVkIiAlIChidWdfaWQsKSkKKyAgICAgICAgaWYgc2VsZi5kcnlydW46CisgICAgICAgICAg
ICBsb2coY29tbWVudF90ZXh0KQorICAgICAgICAgICAgcmV0dXJuCisKKyAgICAgICAgc2VsZi5i
ci5vcGVuKHNlbGYuYnVnX3VybF9mb3JfYnVnX2lkKGJ1Z19pZCkpCisgICAgICAgIHNlbGYuYnIu
c2VsZWN0X2Zvcm0obmFtZT0iY2hhbmdlZm9ybSIpCisgICAgICAgIGlmIGNvbW1lbnRfdGV4dDoK
KyAgICAgICAgICAgIGxvZyhjb21tZW50X3RleHQpCisgICAgICAgICAgICBzZWxmLmJyWydjb21t
ZW50J10gPSBjb21tZW50X3RleHQKKyAgICAgICAgc2VsZi5iclsna25vYiddID0gWydyZXNvbHZl
J10KKyAgICAgICAgc2VsZi5iclsncmVzb2x1dGlvbiddID0gWydGSVhFRCddCisgICAgICAgIHNl
bGYuYnIuc3VibWl0KCkKZGlmZiAtLWdpdCBhL1dlYktpdFRvb2xzL1NjcmlwdHMvbW9kdWxlcy9z
Y20ucHkgYi9XZWJLaXRUb29scy9TY3JpcHRzL21vZHVsZXMvc2NtLnB5Cm5ldyBmaWxlIG1vZGUg
MTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRiNzgwMDQKLS0tIC9kZXYvbnVsbAorKysgYi9XZWJLaXRU
b29scy9TY3JpcHRzL21vZHVsZXMvc2NtLnB5CkBAIC0wLDAgKzEsMzE2IEBACisjIENvcHlyaWdo
dCAoQykgMjAwOSBHb29nbGUsIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisjCisjIFJlZGlz
dHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0
aG91dAorIyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9s
bG93aW5nIGNvbmRpdGlvbnMKKyMgYXJlIG1ldDoKKyMgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNv
dXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyMgICAgbm90aWNlLCB0
aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorIyAy
LiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3Zl
IGNvcHlyaWdodAorIyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUg
Zm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisjICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90
aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisjCisjIFRISVMg
U09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgQ09NUFVURVIsIElOQy4gYGBBUyBJUycnIEFO
RCBBTlkKKyMgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5P
VCBMSU1JVEVEIFRPLCBUSEUKKyMgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElU
WSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisjIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQu
ICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBDT01QVVRFUiwgSU5DLiBPUgorIyBDT05UUklCVVRP
UlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lB
TCwKKyMgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVU
IE5PVCBMSU1JVEVEIFRPLAorIyBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNF
UlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyMgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5U
RVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorIyBPRiBMSUFCSUxJ
VFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyMgKElO
Q0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBP
RiBUSEUgVVNFCisjIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9T
U0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisjCisjIFB5dGhvbiBtb2R1bGUgZm9yIGludGVyYWN0
aW5nIHdpdGggYW4gU0NNIHN5c3RlbSAobGlrZSBTVk4gb3IgR2l0KQorCitpbXBvcnQgb3MKK2lt
cG9ydCByZQoraW1wb3J0IHN1YnByb2Nlc3MKK2ltcG9ydCBzeXMKKworZGVmIGxvZyhzdHJpbmcp
OgorICAgIHByaW50ID4+IHN5cy5zdGRlcnIsIHN0cmluZworCitkZWYgZXJyb3Ioc3RyaW5nKToK
KyAgICBsb2coc3RyaW5nKQorICAgIGV4aXQoMSkKKworZGVmIGRldGVjdF9zY21fc3lzdGVtKHBh
dGgpOgorICAgIGlmIFNWTi5pbl93b3JraW5nX2RpcmVjdG9yeShwYXRoKToKKyAgICAgICAgcmV0
dXJuIFNWTihjd2Q9cGF0aCkKKyAgICAKKyAgICBpZiBHaXQuaW5fd29ya2luZ19kaXJlY3Rvcnko
cGF0aCk6CisgICAgICAgIHJldHVybiBHaXQoY3dkPXBhdGgpCisgICAgCisgICAgcmV0dXJuIE5v
bmUKKworY2xhc3MgU2NyaXB0RXJyb3IoRXhjZXB0aW9uKToKKyAgICBwYXNzCisKK2NsYXNzIFND
TToKKyAgICBkZWYgX19pbml0X18oc2VsZiwgY3dkLCBkcnlydW4gPSBGYWxzZSk6CisgICAgICAg
IHNlbGYuY3dkID0gY3dkCisgICAgICAgIHNlbGYuY2hlY2tvdXRfcm9vdCA9IHNlbGYuZmluZF9j
aGVja291dF9yb290KHNlbGYuY3dkKQorICAgICAgICBzZWxmLmRyeXJ1biA9IGRyeXJ1bgorCisg
ICAgQHN0YXRpY21ldGhvZAorICAgIGRlZiBydW5fY29tbWFuZChjb21tYW5kLCBjd2Q9Tm9uZSk6
CisgICAgICAgIHJldHVybiBzdWJwcm9jZXNzLlBvcGVuKGNvbW1hbmQsIHN0ZG91dD1zdWJwcm9j
ZXNzLlBJUEUsIHNoZWxsPVRydWUsIGN3ZD1jd2QpLmNvbW11bmljYXRlKClbMF0ucnN0cmlwKCkK
KworICAgIGRlZiBlbnN1cmVfY2xlYW5fd29ya2luZ19kaXJlY3Rvcnkoc2VsZiwgZm9yY2UsIGFs
bG93X2xvY2FsX2NvbW1pdHMgPSBGYWxzZSk6CisgICAgICAgIGlmIG5vdCBmb3JjZSBhbmQgbm90
IHNlbGYud29ya2luZ19kaXJlY3RvcnlfaXNfY2xlYW4oKToKKyAgICAgICAgICAgIGxvZygiV29y
a2luZyBkaXJlY3RvcnkgaGFzIG1vZGlmaWNhdGlvbnMsIHBhc3MgLS1mb3JjZS1jbGVhbiBvciAt
LW5vLWNsZWFuIHRvIGNvbnRpbnVlLiIpCisgICAgICAgICAgICBvcy5zeXN0ZW0oc2VsZi5zdGF0
dXNfY29tbWFuZCgpKQorICAgICAgICAgICAgZXhpdCgxKQorICAgICAgICAKKyAgICAgICAgbG9n
KCJDbGVhbmluZyB0aGUgd29ya2luZyBkaXJlY3RvcnkiKQorICAgICAgICBzZWxmLmNsZWFuX3dv
cmtpbmdfZGlyZWN0b3J5KGRpc2NhcmRfbG9jYWxfY29tbWl0cyA9IG5vdCBhbGxvd19sb2NhbF9j
b21taXRzKQorICAgIAorICAgIGRlZiBlbnN1cmVfbm9fbG9jYWxfY29tbWl0cyhzZWxmLCBmb3Jj
ZSk6CisgICAgICAgIGlmIG5vdCBzZWxmLnN1cHBvcnRzX2xvY2FsX2NvbW1pdHMoKToKKyAgICAg
ICAgICAgIHJldHVybgorICAgICAgICBjb21taXRzID0gc2VsZi5sb2NhbF9jb21taXRzKCkKKyAg
ICAgICAgaWYgbGVuKGNvbW1pdHMpID09IDA6CisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAg
aWYgbm90IGZvcmNlOgorICAgICAgICAgICAgbG9nKCJXb3JraW5nIGRpcmVjdG9yeSBoYXMgbG9j
YWwgY29tbWl0cywgcGFzcyAtLWZvcmNlLWNsZWFuIHRvIGNvbnRpbnVlLiIpCisgICAgICAgICAg
ICBleGl0KDEpCisgICAgICAgIHNlbGYuZGlzY2FyZF9sb2NhbF9jb21taXRzKCkKKworICAgIGRl
ZiBhcHBseV9wYXRjaChzZWxmLCBwYXRjaCk6CisgICAgICAgICMgSXQncyBwb3NzaWJsZSB0aGF0
IHRoZSBwYXRjaCB3YXMgbm90IG1hZGUgZnJvbSB0aGUgcm9vdCBkaXJlY3RvcnkKKyAgICAgICAg
IyB3ZSBzaG91bGQgZGV0ZWN0IGFuZCBoYW5kbGUgdGhhdCBjYXNlLgorICAgICAgICByZXR1cm5f
Y29kZSA9IG9zLnN5c3RlbSgiY3VybCAiICsgcGF0Y2hbJ3VybCddICsgIiB8IHN2bi1hcHBseSAt
LXJldmlld2VyIFwiIiArIHBhdGNoWydyZXZpZXdlciddICsgIlwiIikKKyAgICAgICAgaWYgKHJl
dHVybl9jb2RlICE9IDApOgorICAgICAgICAgICAgcmFpc2UgU2NyaXB0RXJyb3IoIlBhdGNoICIg
KyBwYXRjaFsndXJsJ10gKyAiIGZhaWxlZCB0byBkb3dubG9hZCBhbmQgYXBwbHkuIikKKworICAg
ICMgSXQncyBzbGlnaHRseSBoYWNreSB0byBzaGFyZSB0aGlzIGNvZGUsIHNpbmNlIHRoZXJlIGFy
ZSBpbXBsaWNpdCBhc3N1bXB0aW9ucyBhYm91dCB0aGUgcmVnZXhwIGZvcm1hdAorICAgIGRlZiBy
dW5fc3RhdHVzX2FuZF9leHRyYWN0X2ZpbGVuYW1lcyhzZWxmLCBzdGF0dXNfY29tbWFuZCwgc3Rh
dHVzX3JlZ2V4cCk6CisgICAgICAgIGZpbGVfbmFtZXMgPSBbXQorICAgICAgICBmb3IgbGluZSBp
biBvcy5wb3BlbihzdGF0dXNfY29tbWFuZCkucmVhZGxpbmVzKCk6CisgICAgICAgICAgICBtYXRj
aCA9IHJlLnNlYXJjaChzdGF0dXNfcmVnZXhwLCBsaW5lKQorICAgICAgICAgICAgaWYgbm90IG1h
dGNoOgorICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICAjIHN0YXR1cyA9IG1h
dGNoLmdyb3VwKDEpCisgICAgICAgICAgICBmaWxlX25hbWUgPSBtYXRjaC5ncm91cCgyKQorICAg
ICAgICAgICAgZmlsZV9uYW1lcy5hcHBlbmQoZmlsZV9uYW1lKQorICAgICAgICByZXR1cm4gZmls
ZV9uYW1lcworCisgICAgQHN0YXRpY21ldGhvZAorICAgIGRlZiBpbl93b3JraW5nX2RpcmVjdG9y
eShwYXRoKToKKyAgICAgICAgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvciwgInN1YmNsYXNzZXMg
bXVzdCBpbXBsZW1lbnQiCisKKyAgICBAc3RhdGljbWV0aG9kCisgICAgZGVmIGZpbmRfY2hlY2tv
dXRfcm9vdChwYXRoKToKKyAgICAgICAgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvciwgInN1YmNs
YXNzZXMgbXVzdCBpbXBsZW1lbnQiCisKKyAgICBkZWYgd29ya2luZ19kaXJlY3RvcnlfaXNfY2xl
YW4oc2VsZik6CisgICAgICAgIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IsICJzdWJjbGFzc2Vz
IG11c3QgaW1wbGVtZW50IgorCisgICAgZGVmIGNsZWFuX3dvcmtpbmdfZGlyZWN0b3J5KHNlbGYp
OgorICAgICAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yLCAic3ViY2xhc3NlcyBtdXN0IGlt
cGxlbWVudCIKKworICAgIGRlZiB1cGRhdGVfd2Via2l0KHNlbGYpOgorICAgICAgICByYWlzZSBO
b3RJbXBsZW1lbnRlZEVycm9yLCAic3ViY2xhc3NlcyBtdXN0IGltcGxlbWVudCIKKworICAgIGRl
ZiBzdGF0dXNfY29tbWFuZChzZWxmKToKKyAgICAgICAgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJv
ciwgInN1YmNsYXNzZXMgbXVzdCBpbXBsZW1lbnQiCisKKyAgICBkZWYgY2hhbmdlZF9maWxlcyhz
ZWxmKToKKyAgICAgICAgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvciwgInN1YmNsYXNzZXMgbXVz
dCBpbXBsZW1lbnQiCisKKyAgICBkZWYgZGlzcGxheV9uYW1lKHNlbGYpOgorICAgICAgICByYWlz
ZSBOb3RJbXBsZW1lbnRlZEVycm9yLCAic3ViY2xhc3NlcyBtdXN0IGltcGxlbWVudCIKKworICAg
IGRlZiBjcmVhdGVfcGF0Y2hfY29tbWFuZChzZWxmKToKKyAgICAgICAgcmFpc2UgTm90SW1wbGVt
ZW50ZWRFcnJvciwgInN1YmNsYXNzZXMgbXVzdCBpbXBsZW1lbnQiCisKKyAgICBkZWYgY29tbWl0
X3dpdGhfbWVzc2FnZShzZWxmLCBtZXNzYWdlKToKKyAgICAgICAgcmFpc2UgTm90SW1wbGVtZW50
ZWRFcnJvciwgInN1YmNsYXNzZXMgbXVzdCBpbXBsZW1lbnQiCisgICAgCisgICAgIyBTdWJjbGFz
c2VzIG11c3QgaW5kaWNhdGUgaWYgdGhleSBzdXBwb3J0IGxvY2FsIGNvbW1pdHMKKyAgICAjIGJ1
dCB0aGUgU0NNIGJhc2VjbGFzcyB3aWxsIG9ubHkgY2FsbCBsb2NhbF9jb21taXRzIG1ldGhvZHMg
d2hlbiB0aGlzIGlzIHRydWUKKyAgICBkZWYgc3VwcG9ydHNfbG9jYWxfY29tbWl0cyhzZWxmKToK
KyAgICAgICAgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvciwgInN1YmNsYXNzZXMgbXVzdCBpbXBs
ZW1lbnQiCisKKyAgICBkZWYgZGlzY2FyZF9sb2NhbF9jb21taXRzKHNlbGYpOgorICAgICAgICBw
YXNzCisKKyAgICBkZWYgbG9jYWxfY29tbWl0cyhzZWxmKToKKyAgICAgICAgcmV0dXJuIFtdCisK
K2NsYXNzIFNWTiAoU0NNKToKKyAgICBkZWYgX19pbml0X18oc2VsZiwgY3dkLCBkcnlydW4gPSBG
YWxzZSk6CisgICAgICAgIFNDTS5fX2luaXRfXyhzZWxmLCBjd2QsIGRyeXJ1bikKKyAgICAgICAg
c2VsZi5jYWNoZWRfdmVyc2lvbiA9IE5vbmUKKyAgICAKKyAgICBAc3RhdGljbWV0aG9kCisgICAg
ZGVmIGluX3dvcmtpbmdfZGlyZWN0b3J5KHBhdGgpOgorICAgICAgICByZXR1cm4gb3MucGF0aC5p
c2Rpcihvcy5wYXRoLmpvaW4ocGF0aCwgJy5zdm4nKSkKKyAgICAKKyAgICBAc3RhdGljbWV0aG9k
CisgICAgZGVmIGZpbmRfY2hlY2tvdXRfcm9vdChwYXRoKToKKyAgICAgICAgbGFzdF9wYXRoID0g
Tm9uZQorICAgICAgICB3aGlsZSBUcnVlOgorICAgICAgICAgICAgaWYgbm90IFNWTi5pbl93b3Jr
aW5nX2RpcmVjdG9yeShwYXRoKToKKyAgICAgICAgICAgICAgICByZXR1cm4gbGFzdF9wYXRoCisg
ICAgICAgICAgICBsYXN0X3BhdGggPSBwYXRoCisgICAgICAgICAgICAocGF0aCwgbGFzdF9jb21w
b25lbnQpID0gb3MucGF0aC5zcGxpdChwYXRoKQorICAgICAgICAgICAgaWYgbGFzdF9wYXRoID09
IHBhdGg6CisgICAgICAgICAgICAgICAgcmV0dXJuIE5vbmUKKyAgICAKKyAgICBkZWYgc3ZuX3Zl
cnNpb24oc2VsZik6CisgICAgICAgIGlmIG5vdCBzZWxmLmNhY2hlZF92ZXJzaW9uOgorICAgICAg
ICAgICAgc2VsZi5jYWNoZWRfdmVyc2lvbiA9IHNlbGYucnVuX2NvbW1hbmQoInN2biAtLXZlcnNp
b24gLS1xdWlldCIpCisgICAgICAgIAorICAgICAgICByZXR1cm4gc2VsZi5jYWNoZWRfdmVyc2lv
bgorCisgICAgZGVmIHdvcmtpbmdfZGlyZWN0b3J5X2lzX2NsZWFuKHNlbGYpOgorICAgICAgICBk
aWZmX3Byb2Nlc3MgPSBzdWJwcm9jZXNzLlBvcGVuKCJzdm4gZGlmZiIsIHN0ZG91dD1zdWJwcm9j
ZXNzLlBJUEUsIHNoZWxsPVRydWUpCisgICAgICAgIGRpZmZfb3V0cHV0ID0gZGlmZl9wcm9jZXNz
LmNvbW11bmljYXRlKClbMF0KKyAgICAgICAgaWYgZGlmX3Byb2Nlc3Mud2FpdCgpICE9IDA6Cisg
ICAgICAgICAgICBsb2coIkZhaWxlZCB0byBydW4gc3ZuIGRpZmYiKQorICAgICAgICAgICAgcmV0
dXJuIEZhbHNlCisgICAgICAgIHJldHVybiBkaWZmX291dHB1dCA9PSAiIgorCisgICAgZGVmIGNs
ZWFuX3dvcmtpbmdfZGlyZWN0b3J5KHNlbGYpOgorICAgICAgICBvcy5zeXN0ZW0oInN2biByZXNl
dCAtUiIpCisKKyAgICBkZWYgdXBkYXRlX3dlYmtpdChzZWxmKToKKyAgICAgICAgb3Muc3lzdGVt
KCJ1cGRhdGUtd2Via2l0IikKKworICAgIGRlZiBzdGF0dXNfY29tbWFuZChzZWxmKToKKyAgICAg
ICAgcmV0dXJuICdzdm4gc3RhdHVzJworCisgICAgZGVmIGNoYW5nZWRfZmlsZXMoc2VsZik6Cisg
ICAgICAgIHN0YXR1c19yZWdleHAgPSAiXihbQUNETVJdKS57Nn0gKC4rKSQiIGlmIHNlbGYuc3Zu
X3ZlcnNpb24oKSA+ICIxLjYiIGVsc2UgIl4oW0FDRE1SXSkuezV9ICguKykkIgorICAgICAgICBy
ZXR1cm4gc2VsZi5ydW5fc3RhdHVzX2FuZF9leHRyYWN0X2ZpbGVuYW1lcyhzZWxmLnN0YXR1c19j
b21tYW5kKCksIHN0YXR1c19yZWdleHApCisKKyAgICBkZWYgc3VwcG9ydHNfbG9jYWxfY29tbWl0
cyhzZWxmKToKKyAgICAgICAgcmV0dXJuIEZhbHNlCisKKyAgICBkZWYgZGlzcGxheV9uYW1lKHNl
bGYpOgorICAgICAgICByZXR1cm4gInN2biIKKworICAgIGRlZiBjcmVhdGVfcGF0Y2hfY29tbWFu
ZChzZWxmKToKKyAgICAgICAgcmV0dXJuICJzdm4tY3JlYXRlLXBhdGNoIgorCisgICAgZGVmIGNv
bW1pdF93aXRoX21lc3NhZ2Uoc2VsZiwgbWVzc2FnZSk6CisgICAgICAgIGNvbW1pdF9wcm9jZXNz
ID0gc3VicHJvY2Vzcy5Qb3Blbignc3ZuIGNvbW1pdCAtRiAtJywgc3RkaW49c3VicHJvY2Vzcy5Q
SVBFLCBzaGVsbD1UcnVlKQorICAgICAgICBjb21taXRfcHJvY2Vzcy5jb21tdW5pY2F0ZShtZXNz
YWdlKQorCisjIEFsbCBnaXQtc3BlY2lmaWMgbG9naWMgc2hvdWxkIGdvIGhlcmUuCitjbGFzcyBH
aXQgKFNDTSk6CisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGN3ZCwgZHJ5cnVuID0gRmFsc2UpOgor
ICAgICAgICBTQ00uX19pbml0X18oc2VsZiwgY3dkLCBkcnlydW4pCisgICAgCisgICAgQHN0YXRp
Y21ldGhvZAorICAgIGRlZiBpbl93b3JraW5nX2RpcmVjdG9yeShwYXRoKToKKyAgICAgICAgcmV0
dXJuIFNDTS5ydW5fY29tbWFuZCgiZ2l0IHJldi1wYXJzZSAtLWlzLWluc2lkZS13b3JrLXRyZWUg
Mj4mMSIsIGN3ZD1wYXRoKSA9PSAidHJ1ZSIKKworICAgIEBzdGF0aWNtZXRob2QKKyAgICBkZWYg
ZmluZF9jaGVja291dF9yb290KHBhdGgpOgorICAgICAgICAjICJnaXQgcmV2LXBhcnNlIC0tc2hv
dy1jZHVwIiB3b3VsZCBiZSBhbm90aGVyIHdheSB0byBnZXQgdG8gdGhlIHJvb3QKKyAgICAgICAg
KGNoZWNrb3V0X3Jvb3QsIGRvdF9naXQpID0gb3MucGF0aC5zcGxpdChTQ00ucnVuX2NvbW1hbmQo
ImdpdCByZXYtcGFyc2UgLS1naXQtZGlyIiwgY3dkPXBhdGgpKQorICAgICAgICAjIElmIHdlIHdl
cmUgdXNpbmcgMi42ICMgY2hlY2tvdXRfcm9vdCA9IG9zLnBhdGgucmVscGF0aChjaGVja291dF9y
b290LCBwYXRoKQorICAgICAgICBpZiBub3Qgb3MucGF0aC5pc2FicyhjaGVja291dF9yb290KTog
IyBTb21ldGltZXMgZ2l0IHJldHVybnMgcmVsYXRpdmUgcGF0aHMKKyAgICAgICAgICAgIGNoZWNr
b3V0X3Jvb3QgPSBvcy5wYXRoLmpvaW4ocGF0aCwgY2hlY2tvdXRfcm9vdCkKKyAgICAgICAgcmV0
dXJuIGNoZWNrb3V0X3Jvb3QKKyAgICAKKyAgICBkZWYgZGlzY2FyZF9sb2NhbF9jb21taXRzKHNl
bGYpOgorICAgICAgICBvcy5zeXN0ZW0oImdpdCByZXNldCAtLWhhcmQgdHJ1bmsiKQorICAgIAor
ICAgIGRlZiBsb2NhbF9jb21taXRzKHNlbGYpOgorICAgICAgICBzZWxmLnJ1bl9jb21tYW5kKCJn
aXQgbG9nIC0tcHJldHR5PW9uZWxpbmUgaGVhZC4uLnRydW5rIikuc3BsaXRsaW5lcygpCisgICAg
CisgICAgZGVmIHdvcmtpbmdfZGlyZWN0b3J5X2lzX2NsZWFuKHNlbGYpOgorICAgICAgICBkaWZm
X3Byb2Nlc3MgPSBzdWJwcm9jZXNzLlBvcGVuKCJnaXQgZGlmZi1pbmRleCBoZWFkIiwgc3Rkb3V0
PXN1YnByb2Nlc3MuUElQRSwgc2hlbGw9VHJ1ZSkKKyAgICAgICAgZGlmZl9vdXRwdXQgPSBkaWZm
X3Byb2Nlc3MuY29tbXVuaWNhdGUoKVswXQorICAgICAgICBpZiBkaWZfcHJvY2Vzcy53YWl0KCkg
IT0gMDoKKyAgICAgICAgICAgIGxvZygiRmFpbGVkIHRvIHJ1biBnaXQgZGlmZi1pbmRleCBoZWFk
IikKKyAgICAgICAgICAgIHJldHVybiBGYWxzZQorICAgICAgICByZXR1cm4gZGlmZl9vdXRwdXQg
PT0gIiIKKyAgICAKKyAgICBkZWYgY2xlYW5fd29ya2luZ19kaXJlY3Rvcnkoc2VsZik6CisgICAg
ICAgIG9zLnN5c3RlbSgiZ2l0IHJlc2V0IC0taGFyZCBoZWFkIikKKyAgICAgICAgIyBDb3VsZCBy
dW4gZ2l0IGNsZWFuIGhlcmUgdG9vLCBidXQgdGhhdCB3b3VsZG4ndCBtYXRjaCB3b3JraW5nX2Rp
cmVjdG9yeV9pc19jbGVhbgorICAgIAorICAgIGRlZiB1cGRhdGVfd2Via2l0KHNlbGYpOgorICAg
ICAgICAjIEZJWE1FOiBTaG91bGQgcHJvYmFibHkgY2FsbCB1cGRhdGUtd2Via2l0LCBubz8KKyAg
ICAgICAgbG9nKCJVcGRhdGluZyB3b3JraW5nIGRpcmVjdG9yeSIpCisgICAgICAgIG9zLnN5c3Rl
bSgiZ2l0IHN2biByZWJhc2UiKQorCisgICAgZGVmIHN0YXR1c19jb21tYW5kKHNlbGYpOgorICAg
ICAgICByZXR1cm4gJ2dpdCBzdGF0dXMnCisKKyAgICBkZWYgY2hhbmdlZF9maWxlcyhzZWxmKToK
KyAgICAgICAgc3RhdHVzX2NvbW1hbmQgPSAnZ2l0IGRpZmYgLXIgLS1uYW1lLXN0YXR1cyAtQyAt
QyAtTScKKyAgICAgICAgc3RhdHVzX3JlZ2V4cCA9ICdeKFtBRE1dKVx0KC4rKSQnCisgICAgICAg
IHJldHVybiBzZWxmLnJ1bl9zdGF0dXNfYW5kX2V4dHJhY3RfZmlsZW5hbWVzKHN0YXR1c19jb21t
YW5kLCBzdGF0dXNfcmVnZXhwKQorICAgIAorICAgIGRlZiBzdXBwb3J0c19sb2NhbF9jb21taXRz
KHNlbGYpOgorICAgICAgICByZXR1cm4gVHJ1ZQorCisgICAgZGVmIGRpc3BsYXlfbmFtZShzZWxm
KToKKyAgICAgICAgcmV0dXJuICJnaXQiCisKKyAgICBkZWYgY3JlYXRlX3BhdGNoX2NvbW1hbmQo
c2VsZik6CisgICAgICAgIHJldHVybiAiZ2l0IGRpZmYgaGVhZCIKKworICAgIGRlZiBjb21taXRf
d2l0aF9tZXNzYWdlKHNlbGYsIG1lc3NhZ2UpOgorICAgICAgICBzZWxmLmNvbW1pdF9sb2NhbGx5
X3dpdGhfbWVzc2FnZShtZXNzYWdlKQorICAgICAgICBzZWxmLnB1c2hfbG9jYWxfY29tbWl0c190
b19zZXJ2ZXIoKQorCisgICAgIyBHaXQtc3BlY2lmaWMgbWV0aG9kczoKKyAgICAKKyAgICBkZWYg
Y29tbWl0X2xvY2FsbHlfd2l0aF9tZXNzYWdlKHNlbGYsIG1lc3NhZ2UpOgorICAgICAgICBjb21t
aXRfcHJvY2VzcyA9IHN1YnByb2Nlc3MuUG9wZW4oJ2dpdCBjb21taXQgLWEgLUYgLScsIHN0ZGlu
PXN1YnByb2Nlc3MuUElQRSwgc2hlbGw9VHJ1ZSkKKyAgICAgICAgY29tbWl0X3Byb2Nlc3MuY29t
bXVuaWNhdGUobWVzc2FnZSkKKyAgICAgICAgCisgICAgZGVmIHB1c2hfbG9jYWxfY29tbWl0c190
b19zZXJ2ZXIoc2VsZik6CisgICAgICAgIGlmIHNlbGYuZHJ5cnVuOgorICAgICAgICAgICAgcmV0
dXJuICJEcnkgcnVuLCBubyByZW1vdGUgY29tbWl0LiIKKyAgICAgICAgY29tbWl0X3Byb2Nlc3Mg
PSBzdWJwcm9jZXNzLlBvcGVuKCdnaXQgc3ZuIGRjb21taXQnLCBzdGRvdXQ9c3VicHJvY2Vzcy5Q
SVBFLCBzaGVsbD1UcnVlKQorICAgICAgICAob3V0LCBlcnJvcikgPSBjb21taXRfcHJvY2Vzcy5j
b21tdW5pY2F0ZSgpCisgICAgICAgIHJldHVybl9jb2RlID0gY29tbWl0X3Byb2Nlc3Mud2FpdCgp
CisgICAgICAgIGxvZygiQ29tbWl0IGZhaWx1cmU6ICIgKyByZXR1cm5fY29kZSkgIyBXZSByZWFs
bHkgc2hvdWxkIGhhbmRsZSB0aGUgZmFpbHVyZQorICAgICAgICByZXR1cm4gb3V0CisgICAgCisK
KyAgICBkZWYgY29tbWl0X2lkc19mcm9tX3JhbmdlX2FyZ3VtZW50cyhzZWxmLCBhcmdzLCBjaGVy
cnlfcGljayA9IEZhbHNlKToKKyAgICAgICAgIyBGaXJzdCBnZXQgdGhlIGNvbW1pdC1pZHMgZm9y
IHRoZSBwYXNzZWQgaW4gcmV2aXNpb25zCisgICAgICAgIHJldl9wYXJzZV9hcmdzID0gWydnaXQn
LCAncmV2LXBhcnNlJywgJy0tcmV2cy1vbmx5J10KKyAgICAgICAgcmV2X3BhcnNlX2FyZ3MuZXh0
ZW5kKGFyZ3MpCisgICAgICAgIHJldmlzaW9ucyA9IHNlbGYucnVuX2NvbW1hbmQoIiAiLmpvaW4o
cmV2X3BhcnNlX2FyZ3MpKS5zcGxpdGxpbmVzKCkKKyAgICAgICAgCisgICAgICAgIGlmIGNoZXJy
eV9waWNrOgorICAgICAgICAgICAgcmV0dXJuIHJldmlzaW9ucworICAgICAgICAKKyAgICAgICAg
IyBJZiBub3QgY2hlcnJ5LXBpY2tpbmcgYW5kIG9ubHkgcGFzc2VkIG9uZSByZXZpc2lvbiwgYXNz
dW1lICJecmV2aXNpb24gaGVhZCIgYWthICJyZXZpc2lvbi4uaGVhZCIKKyAgICAgICAgaWYgbGVu
KHJldmlzaW9ucykgPCAyOgorICAgICAgICAgICAgcmV2aXNpb25zWzBdID0gIl4iICsgcmV2aXNp
b25zWzBdCisgICAgICAgICAgICByZXZpc2lvbnMuYXBwZW5kKCJoZWFkIikKKyAgICAgICAgCisg
ICAgICAgIHJldl9saXN0X2FyZ3MgPSBbJ2dpdCcsICdyZXYtbGlzdCddCisgICAgICAgIHJldl9s
aXN0X2FyZ3MuZXh0ZW5kKHJldmlzaW9ucykKKyAgICAgICAgcmV0dXJuIHNlbGYucnVuX2NvbW1h
bmQoIiAiLmpvaW4ocmV2X2xpc3RfYXJncykpLnNwbGl0bGluZXMoKQorCisgICAgZGVmIGNvbW1p
dF9tZXNzYWdlX2Zvcl9jb21taXQoc2VsZiwgY29tbWl0X2lkKToKKyAgICAgICAgY29tbWl0X21l
c3NhZ2VfcHJvY2VzcyA9IHN1YnByb2Nlc3MuUG9wZW4oImdpdCBjYXQtZmlsZSBjb21taXQgIiAr
IGNvbW1pdF9pZCwgc3Rkb3V0PXN1YnByb2Nlc3MuUElQRSwgc2hlbGw9VHJ1ZSkKKyAgICAgICAg
Y29tbWl0X21lc3NhZ2UgPSBjb21taXRfbWVzc2FnZV9wcm9jZXNzLmNvbW11bmljYXRlKClbMF0K
KyAgICAgICAgY29tbWl0X2xpbmVzID0gY29tbWl0X21lc3NhZ2Uuc3BsaXRsaW5lcygpCisKKyAg
ICAgICAgIyBza2lwIHRoZSBoZWFkZXJzCisgICAgICAgIGZpcnN0X2xpbmVfYWZ0ZXJfaGVhZGVy
cyA9IDAKKyAgICAgICAgZm9yIGxpbmUgaW4gY29tbWl0X2xpbmVzOgorICAgICAgICAgICAgZmly
c3RfbGluZV9hZnRlcl9oZWFkZXJzICs9IDEKKyAgICAgICAgICAgIGlmIGxpbmUgPT0gIiI6Cisg
ICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgcmV0dXJuICJcbiIuam9pbihjb21taXRfbGlu
ZXNbZmlyc3RfbGluZV9hZnRlcl9oZWFkZXJzOl0pCisKKyAgICBkZWYgc2hvd19kaWZmX2NvbW1h
bmRfZm9yX2NvbW1pdChzZWxmLCBjb21taXRfaWQpOgorICAgICAgICByZXR1cm4gImdpdCBkaWZm
LXRyZWUgLXAgIiArIGNvbW1pdF9pZAorCisgICAgZGVmIGZpbGVzX2NoYW5nZWRfc3VtbWFyeV9m
b3JfY29tbWl0KHNlbGYsIGNvbW1pdF9pZCk6CisgICAgICAgIHJldHVybiBzdWJwcm9jZXNzLlBv
cGVuKCJnaXQgZGlmZi10cmVlIC0tc2hvcnRzdGF0IC0tbm8tY29tbWl0LWlkICIgKyBjb21taXRf
aWQsIHN0ZG91dD1zdWJwcm9jZXNzLlBJUEUsIHNoZWxsPVRydWUpLmNvbW11bmljYXRlKClbMF0K
Kwo=
</data>

          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>31696</attachid>
            <date>2009-06-22 17:58:49 -0700</date>
            <delta_ts>2009-06-22 18:53:12 -0700</delta_ts>
            <desc>Updated to respect the current working directory instead of using ../..</desc>
            <filename>bugzilla_requires_a_filename.patch</filename>
            <type>text/plain</type>
            <size>48329</size>
            <attacher name="Eric Seidel (no email)">eric</attacher>
            
              <data encoding="base64">MDhmZmQ0OTNkMTdjYzVhZGQwMDU0NmIyMjQ4NGIxODRkMDlmMWNhMwpkaWZmIC0tZ2l0IGEvV2Vi
S2l0VG9vbHMvQ2hhbmdlTG9nIGIvV2ViS2l0VG9vbHMvQ2hhbmdlTG9nCmluZGV4IDI1YjQwZWQu
LmI5OWY2M2QgMTAwNjQ0Ci0tLSBhL1dlYktpdFRvb2xzL0NoYW5nZUxvZworKysgYi9XZWJLaXRU
b29scy9DaGFuZ2VMb2cKQEAgLTEsMyArMSw1NSBAQAorMjAwOS0wNi0xOCAgRXJpYyBTZWlkZWwg
IDxlcmljQHdlYmtpdC5vcmc+CisKKyAgICAgICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChPT1BTISku
CisKKyAgICAgICAgV2ViS2l0IG5lZWRzIGEgc2NyaXB0IHRvIGludGVyYWN0IHdpdGggYnVnemls
bGEgYW5kIGF1dG9tYXRlCisgICAgICAgIHBhcnRzIG9mIHRoZSBwYXRjaCBwb3N0aW5nIGFuZCBj
b21taXQgcHJvY2Vzc2VzLgorICAgICAgICBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1
Zy5jZ2k/aWQ9MjYyODMKKworICAgICAgICBUaGlzIGlzIHJlYWxseSBhIGZpcnN0LWRyYWZ0IHRv
b2wuCisgICAgICAgIEl0J3MgdG8gdGhlIHBvaW50IHdoZXJlIGl0J3MgdXNlZnVsIHRvIG1vcmUg
cGVvcGxlIHRoYW4ganVzdCBtZSBub3cgdGhvdWdoLgorICAgICAgICBHaXQgc3VwcG9ydCB3b3Jr
cy4gIFNWTiBzdXBwb3J0IGlzIHdyaXR0ZW4sIGJ1dCBtb3N0bHkgdW50ZXN0ZWQuCisKKyAgICAg
ICAgVGhpcyB0b29sIHJlcXVpcmVzIEJlYXV0aWZ1bFNvdXAgYW5kIG1lY2hhbml6ZSBweXRob24g
bW9kdWxlcyB0byBydW46CisgICAgICAgIHN1ZG8gZWFzeV9pbnN0YWxsIEJlYXV0aWZ1bFNvdXAK
KyAgICAgICAgc3VkbyBlYXN5X2luc3RhbGwgbWVjaGFuaXplCisKKyAgICAgICAgTW9yZSBpbXBv
cnRhbnQgdGhhbiB0aGUgdG9vbCBpdHNlbGYgYXJlIHRoZSBCdWd6aWxsYSwgR2l0IGFuZCBTVk4g
Y2xhc3MgYWJzdHJhY3Rpb25zCisgICAgICAgIHdoaWNoIEkgaG9wZSB3aWxsIGFsbG93IGVhc3kg
d3JpdGluZyBvZiBmdXR1cmUgdG9vbHMuCisKKyAgICAgICAgVGhlIHRvb2wgY3VycmVudGx5IGlt
cGxlbWVudHMgMTAgY29tbWFuZHMsIGRlc2NyaWJlZCBiZWxvdy4KKworICAgICAgICBIZWxwZXJz
IGZvciBzY3JpcHRpbmcgZGVhbGluZyB3aXRoIHRoZSBjb21taXQgcXVldWU6CisgICAgICAgIGJ1
Z3MtdG8tY29tbWl0ICAgICAgICAgICAgICAgICBCdWdzIGluIHRoZSBjb21taXQgcXVldWUKKyAg
ICAgICAgcGF0Y2hlcy10by1jb21taXQgICAgICAgICAgICAgIFBhdGNoZXMgYXR0YWNoZWQgdG8g
YnVncyBpbiB0aGUgY29tbWl0IHF1ZXVlCisKKyAgICAgICAgRGVhbGluZyB3aXRoIGJ1Z3ppbGxh
OgorICAgICAgICByZXZpZXdlZC1wYXRjaGVzIEJVR0lEICAgICAgICAgcisnZCBwYXRjaGVzIG9u
IGEgYnVnCisgICAgICAgIGFwcGx5LXBhdGNoZXMgQlVHSUQgICAgICAgICAgICBBcHBsaWVzIGFs
bCBwYXRjaGVzIG9uIGEgYnVnIHRvIHRoZSBsb2NhbCB3b3JraW5nIGRpcmVjdG9yeSB3aXRob3V0
IGNvbW1pdHRpbmcuCisgICAgICAgIGxhbmQtYW5kLXVwZGF0ZSBCVUdJRCAgICAgICAgICBMYW5k
cyB0aGUgY3VycmVudCB3b3JraW5nIGRpcmVjdG9yeSBkaWZmIGFuZCB1cGRhdGVzIHRoZSBidWcu
CisgICAgICAgIGxhbmQtcGF0Y2hlcyBbb3B0aW9uc10gQlVHSUQgICBMYW5kcyBhbGwgcGF0Y2hl
cyBvbiBhIGJ1ZyBvcHRpb25hbGx5IHRlc3RpbmcgdGhlbSBmaXJzdAorICAgICAgICBvYnNvbGV0
ZS1hdHRhY2htZW50cyBCVUdJRCAgICAgTWFya3MgYWxsIGF0dGFjaG1lbnRzIG9uIGEgYnVnIGFz
IG9ic29sZXRlLgorICAgICAgICBjb21taXQtbWVzc2FnZSAgICAgICAgICAgICAgICAgUHJpbnRz
IGEgY29tbWl0IG1lc3NhZ2Ugc3VpdGFibGUgZm9yIHRoZSB1bmNvbW1pdHRlZCBjaGFuZ2VzLgor
CisgICAgICAgIFRoZXNlIGVmZmVjdGl2ZWx5IHJlcGxhY2UgZ2l0LXNlbmQtYnVnemlsbGE6Cisg
ICAgICAgIHBvc3QtZGlmZiBCVUdJRCAgICAgICAgICAgICAgICBBdHRhY2hlcyB0aGUgY3VycmVu
dCB3b3JraW5nIGRpcmVjdG9yeSBkaWZmIHRvIGEgYnVnIGFzIGEgcGF0Y2ggZmlsZS4KKyAgICAg
ICAgcG9zdC1jb21taXRzIEJVR0lEIENPTU1JVElTSCAgIEF0dGFjaGVzIGEgcmFuZ2Ugb2YgbG9j
YWwgY29tbWl0cyB0byBhIGJ1ZyBhcyBwYXRjaCBmaWxlcy4KKworICAgICAgICBwb3N0LWRpZmYg
d29ya3MgZm9yIFNWTiBhbmQgR2l0LCBwb3N0LWNvbW1pdHMgb25seSB3b3JrcyBmb3IgU0NNcyB3
aXRoIGxvY2FsLWNvbW1pdCBzdXBwb3J0IChsaWtlIEdpdCkKKworICAgICAgICBsYW5kLSogY29t
bWFuZHMgaW4gYSBHaXQgZW52aXJvbm1lbnQgb25seSB3b3JrIHdpdGggc2ltcGxlIHBhdGNoZXMg
ZHVlIHRvIHN2bi1hcHBseSBidWdzOgorICAgICAgICBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9z
aG93X2J1Zy5jZ2k/aWQ9MjYyOTkKKyAgICAgICAgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hv
d19idWcuY2dpP2lkPTI2MzAwCisKKyAgICAgICAgVGhpcyBzY3JpcHQgZm9sbG93cyBweXRob24g
c3R5bGUgKHNpbWlsYXIgdG8gaG93IGZvciBPYmotQyB3ZSBmb2xsb3cgQXBwS2l0IHN0eWxlKQor
ICAgICAgICBodHRwOi8vd3d3LnB5dGhvbi5vcmcvZG9jL2Vzc2F5cy9zdHlsZWd1aWRlLmh0bWwK
KyAgICAgICAgVGhlIFB5dGhvbiBjb21tdW5pdHkgaGFzIGEgc3Ryb25nIHN0eWxlIGN1bHR1cmUg
YW5kIHRoZSBXZWJLaXQgc3R5bGUgZ3VpZGUgaXMgc2lsZW50IHJlOiBQeXRob24uCisKKyAgICAg
ICAgSSd2ZSBmaWxlZCBhIGJ1ZyB0byB1cGRhdGUgdGhlIFdlYktpdCBzdHlsZSBndWlkZSB0byBt
ZW50aW9uIHB5dGhvbjoKKyAgICAgICAgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcu
Y2dpP2lkPTI2NTI0CisKKyAgICAgICAgKiBTY3JpcHRzL2J1Z3ppbGxhLXRvb2w6IEFkZGVkLgor
CiAyMDA5LTA2LTIyICBTdGV2ZSBGYWxrZW5idXJnICA8c2ZhbGtlbkBhcHBsZS5jb20+CiAKICAg
ICAgICAgRml4IGxhc3QgRHVtcFJlbmRlclRyZWUgY2hhbmdlIHRvIGNvcnJlY3RseSBzZXQgcHJl
ZmVyZW5jZXMgZmxhZyB3aXRob3V0IGNyYXNoaW5nLgpkaWZmIC0tZ2l0IGEvV2ViS2l0VG9vbHMv
U2NyaXB0cy9idWd6aWxsYS10b29sIGIvV2ViS2l0VG9vbHMvU2NyaXB0cy9idWd6aWxsYS10b29s
Cm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmMyMTczMDkKLS0tIC9kZXYvbnVs
bAorKysgYi9XZWJLaXRUb29scy9TY3JpcHRzL2J1Z3ppbGxhLXRvb2wKQEAgLTAsMCArMSw0NzUg
QEAKKyMhL3Vzci9iaW4vcHl0aG9uCisjIENvcHlyaWdodCAoYykgMjAwOSwgR29vZ2xlIEluYy4g
QWxsIHJpZ2h0cyByZXNlcnZlZC4KKyMKKyMgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3Vy
Y2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisjIG1vZGlmaWNhdGlvbiwgYXJl
IHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKyMg
bWV0OgorIyAKKyMgICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0
YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyMgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9u
cyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorIyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMg
aW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisjIGNvcHlyaWdodCBub3Rp
Y2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIK
KyMgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3
aXRoIHRoZQorIyBkaXN0cmlidXRpb24uCisjICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29v
Z2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyMgY29udHJpYnV0b3JzIG1heSBiZSB1c2Vk
IHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKyMgdGhpcyBzb2Z0
d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyMgCisjIFRI
SVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05U
UklCVVRPUlMKKyMgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVT
LCBJTkNMVURJTkcsIEJVVCBOT1QKKyMgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElF
UyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisjIEEgUEFSVElDVUxBUiBQVVJQ
T1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisjIE9X
TkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJ
TkNJREVOVEFMLAorIyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdF
UyAoSU5DTFVESU5HLCBCVVQgTk9UCisjIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNU
SVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorIyBEQVRBLCBPUiBQUk9GSVRT
OyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyMg
VEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElU
WSwgT1IgVE9SVAorIyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5H
IElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyMgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBB
RFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyMKKyMgQSB0b29sIGZv
ciBhdXRvbWF0aW5nIGRlYWxpbmcgd2l0aCBidWd6aWxsYSwgcG9zdGluZyBwYXRjaGVzLCBjb21t
aXR0aW5nIHBhdGNoZXMsIGV0Yy4KKworaW1wb3J0IG9zCitpbXBvcnQgcmUKK2ltcG9ydCBzdWJw
cm9jZXNzCitpbXBvcnQgc3lzCisKK2Zyb20gb3B0cGFyc2UgaW1wb3J0IE9wdGlvblBhcnNlciwg
SW5kZW50ZWRIZWxwRm9ybWF0dGVyLCBTVVBQUkVTU19VU0FHRSwgbWFrZV9vcHRpb24KKworIyBJ
bXBvcnQgV2ViS2l0LXNwZWNpZmljIG1vZHVsZXMuCitmcm9tIG1vZHVsZXMuYnVnemlsbGEgaW1w
b3J0IEJ1Z3ppbGxhCitmcm9tIG1vZHVsZXMuc2NtIGltcG9ydCBkZXRlY3Rfc2NtX3N5c3RlbSwg
U2NyaXB0RXJyb3IKKworZGVmIGxvZyhzdHJpbmcpOgorICAgIHByaW50ID4+IHN5cy5zdGRlcnIs
IHN0cmluZworCitkZWYgZXJyb3Ioc3RyaW5nKToKKyAgICBsb2coc3RyaW5nKQorICAgIGV4aXQo
MSkKKworIyBUaGVzZSBjb3VsZCBiZSBwdXQgaW4gc29tZSBzb3J0IG9mIGNoYW5nZWxvZ3MucHku
CitkZWYgbGF0ZXN0X2NoYW5nZWxvZ19lbnRyeShjaGFuZ2Vsb2dfcGF0aCk6CisgICAgIyBlLmcu
IDIwMDktMDYtMDMgIEVyaWMgU2VpZGVsICA8ZXJpY0B3ZWJraXQub3JnPgorICAgIGNoYW5nZWxv
Z19kYXRlX2xpbmVfcmVnZXhwID0gcmUuY29tcGlsZSgnXihcZHs0fS1cZHsyfS1cZHsyfSknICMg
Q29uc3VtZSB0aGUgZGF0ZS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICdc
cysoLispXHMrJyAjIENvbnN1bWUgdGhlIG5hbWUuCisgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgKyAnPChbXjw+XSspPiQnKSAjIEFuZCBmaW5hbGx5IHRoZSBlbWFpbCBhZGRyZXNz
LgorICAgIAorICAgIGVudHJ5X2xpbmVzID0gW10KKyAgICBjaGFuZ2Vsb2cgPSBvcGVuKGNoYW5n
ZWxvZ19wYXRoKQorICAgIHRyeToKKyAgICAgICAgbG9nKCJQYXJzaW5nIENoYW5nZUxvZzogIiAr
IGNoYW5nZWxvZ19wYXRoKQorICAgICAgICAjIFRoZSBmaXJzdCBsaW5lIHNob3VsZCBiZSBhIGRh
dGUgbGluZS4KKyAgICAgICAgZmlyc3RfbGluZSA9IGNoYW5nZWxvZy5yZWFkbGluZSgpCisgICAg
ICAgIGlmIG5vdCBjaGFuZ2Vsb2dfZGF0ZV9saW5lX3JlZ2V4cC5tYXRjaChmaXJzdF9saW5lKToK
KyAgICAgICAgICAgIHJldHVybiBOb25lCisgICAgICAgIGVudHJ5X2xpbmVzLmFwcGVuZChmaXJz
dF9saW5lKQorICAgICAgICAKKyAgICAgICAgIyBlLmcuIDIwMDktMDYtMDMgIEVyaWMgU2VpZGVs
ICA8ZXJpY0B3ZWJraXQub3JnPgorICAgICAgICBjaGFuZ2Vsb2dfZGF0ZV9saW5lX3JlZ2V4cCA9
IHJlLmNvbXBpbGUoJ14oXGR7NH0tXGR7Mn0tXGR7Mn0pJyAjIENvbnN1bWUgdGhlIGRhdGUuCisg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgJ1xzKyguKylccysnICMgQ29u
c3VtZSB0aGUgbmFtZS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAn
PChbXjw+XSspPiQnKSAjIEFuZCBmaW5hbGx5IHRoZSBlbWFpbCBhZGRyZXNzLgorICAgICAgICAK
KyAgICAgICAgZm9yIGxpbmUgaW4gY2hhbmdlbG9nOgorICAgICAgICAgICAgIyBJZiB3ZSd2ZSBo
aXQgdGhlIG5leHQgZW50cnksIHJldHVybi4KKyAgICAgICAgICAgIGlmIGNoYW5nZWxvZ19kYXRl
X2xpbmVfcmVnZXhwLm1hdGNoKGxpbmUpOgorICAgICAgICAgICAgICAgIHJldHVybiAnJy5qb2lu
KGVudHJ5X2xpbmVzKQorICAgICAgICAgICAgZW50cnlfbGluZXMuYXBwZW5kKGxpbmUpCisgICAg
ZmluYWxseToKKyAgICAgICAgY2hhbmdlbG9nLmNsb3NlKCkKKyAgICAjIFdlIG5ldmVyIGZvdW5k
IGEgZGF0ZSBsaW5lIQorICAgIHJldHVybiBOb25lCisKK2RlZiBtb2RpZmllZF9jaGFuZ2Vsb2dz
KHNjbSk6CisgICAgY2hhbmdlbG9nX3BhdGhzID0gW10KKyAgICBwYXRocyA9IHNjbS5jaGFuZ2Vk
X2ZpbGVzKCkKKyAgICBmb3IgcGF0aCBpbiBwYXRoczoKKyAgICAgICAgaWYgb3MucGF0aC5iYXNl
bmFtZShwYXRoKSA9PSAiQ2hhbmdlTG9nIjoKKyAgICAgICAgICAgIGNoYW5nZWxvZ19wYXRocy5h
cHBlbmQocGF0aCkKKyAgICByZXR1cm4gY2hhbmdlbG9nX3BhdGhzCisKK2RlZiBjb21taXRfbWVz
c2FnZV9mb3JfdGhpc19jb21taXQoc2NtKToKKyAgICBjaGFuZ2Vsb2dfcGF0aHMgPSBtb2RpZmll
ZF9jaGFuZ2Vsb2dzKHNjbSkKKyAgICBpZiBub3QgbGVuKGNoYW5nZWxvZ19wYXRocyk6CisgICAg
ICAgIGVycm9yKCJGb3VuZCBubyBtb2RpZmllZCBDaGFuZ2VMb2dzLCBjYW4ndCBjcmVhdGUgYSBj
b21taXQgbWVzc2FnZS4iKQorCisgICAgY2hhbmdlbG9nX21lc3NhZ2VzID0gW10KKyAgICBmb3Ig
cGF0aCBpbiBjaGFuZ2Vsb2dfcGF0aHM6CisgICAgICAgIGNoYW5nZWxvZ19lbnRyeSA9IGxhdGVz
dF9jaGFuZ2Vsb2dfZW50cnkocGF0aCkKKyAgICAgICAgaWYgbm90IGNoYW5nZWxvZ19lbnRyeToK
KyAgICAgICAgICAgIGVycm9yKCJGYWlsZWQgdG8gcGFyc2UgQ2hhbmdlTG9nOiAiICsgb3MucGF0
aC5hYnNwYXRoKHBhdGgpKQorICAgICAgICBjaGFuZ2Vsb2dfbWVzc2FnZXMuYXBwZW5kKGNoYW5n
ZWxvZ19lbnRyeSkKKyAgICAKKyAgICAjIEZJWE1FOiBXZSBzaG91bGQgc29ydCBhbmQgbGFiZWwg
dGhlIENoYW5nZUxvZyBtZXNzYWdlcyBsaWtlIGNvbW1pdC1sb2ctZWRpdG9yIGRvZXMKKyAgICBy
ZXR1cm4gJycuam9pbihjaGFuZ2Vsb2dfbWVzc2FnZXMpCisKKworY2xhc3MgQ29tbWFuZDoKKyAg
ICBkZWYgX19pbml0X18oc2VsZiwgaGVscF90ZXh0LCBhcmd1bWVudF9uYW1lcz0iIiwgb3B0aW9u
cz1bXSk6CisgICAgICAgIHNlbGYuaGVscF90ZXh0ID0gaGVscF90ZXh0CisgICAgICAgIHNlbGYu
YXJndW1lbnRfbmFtZXMgPSBhcmd1bWVudF9uYW1lcworICAgICAgICBzZWxmLm9wdGlvbnMgPSBv
cHRpb25zCisgICAgICAgIHNlbGYub3B0aW9uX3BhcnNlciA9IE9wdGlvblBhcnNlcih1c2FnZT1T
VVBQUkVTU19VU0FHRSwgYWRkX2hlbHBfb3B0aW9uPUZhbHNlLCBvcHRpb25fbGlzdD1zZWxmLm9w
dGlvbnMpCisgICAgCisgICAgZGVmIG5hbWVfd2l0aF9hcmd1bWVudHMoc2VsZiwgY29tbWFuZF9u
YW1lKToKKyAgICAgICAgdXNhZ2Vfc3RyaW5nID0gY29tbWFuZF9uYW1lCisgICAgICAgIGlmIGxl
bihzZWxmLm9wdGlvbnMpID4gMDoKKyAgICAgICAgICAgIHVzYWdlX3N0cmluZyArPSAiIFtvcHRp
b25zXSIKKyAgICAgICAgaWYgc2VsZi5hcmd1bWVudF9uYW1lczoKKyAgICAgICAgICAgIHVzYWdl
X3N0cmluZyArPSAiICIgKyBzZWxmLmFyZ3VtZW50X25hbWVzCisgICAgICAgIHJldHVybiB1c2Fn
ZV9zdHJpbmcKKworICAgIGRlZiBwYXJzZV9hcmdzKHNlbGYsIGFyZ3MpOgorICAgICAgICByZXR1
cm4gc2VsZi5vcHRpb25fcGFyc2VyLnBhcnNlX2FyZ3MoYXJncykKKworICAgIGRlZiBleGVjdXRl
KHNlbGYsIG9wdGlvbnMsIGFyZ3MsIHRvb2wpOgorICAgICAgICByYWlzZSBOb3RJbXBsZW1lbnRl
ZEVycm9yLCAic3ViY2xhc3NlcyBtdXN0IGltcGxlbWVudCIKKworCitjbGFzcyBCdWdzSW5Db21t
aXRRdWV1ZShDb21tYW5kKToKKyAgICBkZWYgX19pbml0X18oc2VsZik6CisgICAgICAgIENvbW1h
bmQuX19pbml0X18oc2VsZiwgJ0J1Z3MgaW4gdGhlIGNvbW1pdCBxdWV1ZScpCisKKyAgICBkZWYg
ZXhlY3V0ZShzZWxmLCBvcHRpb25zLCBhcmdzLCB0b29sKToKKyAgICAgICAgYnVnX2lkcyA9IHRv
b2wuYnVncy5mZXRjaF9idWdfaWRzX2Zyb21fY29tbWl0X3F1ZXVlKCkKKyAgICAgICAgZm9yIGJ1
Z19pZCBpbiBidWdfaWRzOgorICAgICAgICAgICAgcHJpbnQgIiVzIiAlIHRvb2wuYnVncy5idWdf
dXJsX2Zvcl9idWdfaWQoYnVnX2lkKQorCisKK2NsYXNzIFBhdGNoZXNJbkNvbW1pdFF1ZXVlKENv
bW1hbmQpOgorICAgIGRlZiBfX2luaXRfXyhzZWxmKToKKyAgICAgICAgQ29tbWFuZC5fX2luaXRf
XyhzZWxmLCAnUGF0Y2hlcyBhdHRhY2hlZCB0byBidWdzIGluIHRoZSBjb21taXQgcXVldWUnKQor
CisgICAgZGVmIGV4ZWN1dGUoc2VsZiwgb3B0aW9ucywgYXJncywgdG9vbCk6CisgICAgICAgIHBh
dGNoZXMgPSB0b29sLmJ1Z3MuZmV0Y2hfcGF0Y2hlc19mcm9tX2NvbW1pdF9xdWV1ZSgpCisgICAg
ICAgIGxvZygiUGF0Y2hlcyBpbiBjb21taXQgcXVldWU6IikKKyAgICAgICAgZm9yIHBhdGNoIGlu
IHBhdGNoZXM6CisgICAgICAgICAgICBwcmludCAiJXMiICUgcGF0Y2hbJ3VybCddCisKKworY2xh
c3MgUmV2aWV3ZWRQYXRjaGVzT25CdWcoQ29tbWFuZCk6CisgICAgZGVmIF9faW5pdF9fKHNlbGYp
OgorICAgICAgICBDb21tYW5kLl9faW5pdF9fKHNlbGYsICdyK1wnZCBwYXRjaGVzIG9uIGEgYnVn
JywgJ0JVR0lEJykKKworICAgIGRlZiBleGVjdXRlKHNlbGYsIG9wdGlvbnMsIGFyZ3MsIHRvb2wp
OgorICAgICAgICBidWdfaWQgPSBhcmdzWzBdCisgICAgICAgIHBhdGNoZXNfdG9fbGFuZCA9IHRv
b2wuYnVncy5mZXRjaF9yZXZpZXdlZF9wYXRjaGVzX2Zyb21fYnVnKGJ1Z19pZCkKKyAgICAgICAg
Zm9yIHBhdGNoIGluIHBhdGNoZXNfdG9fbGFuZDoKKyAgICAgICAgICAgIHByaW50ICIlcyIgJSBw
YXRjaFsndXJsJ10KKworCitjbGFzcyBBcHBseVBhdGNoZXNGcm9tQnVnKENvbW1hbmQpOgorICAg
IGRlZiBfX2luaXRfXyhzZWxmKToKKyAgICAgICAgb3B0aW9ucyA9IFsKKyAgICAgICAgICAgIG1h
a2Vfb3B0aW9uKCItLW5vLXVwZGF0ZSIsIGFjdGlvbj0ic3RvcmVfZmFsc2UiLCBkZXN0PSJ1cGRh
dGUiLCBkZWZhdWx0PVRydWUsIGhlbHA9IkRvbid0IHVwZGF0ZSB0aGUgd29ya2luZyBkaXJlY3Rv
cnkgYmVmb3JlIGFwcGx5aW5nIHBhdGNoZXMiKSwKKyAgICAgICAgICAgIG1ha2Vfb3B0aW9uKCIt
LWZvcmNlLWNsZWFuIiwgYWN0aW9uPSJzdG9yZV90cnVlIiwgZGVzdD0iZm9yY2VfY2xlYW4iLCBk
ZWZhdWx0PUZhbHNlLCBoZWxwPSJDbGVhbiB3b3JraW5nIGRpcmVjdG9yeSBiZWZvcmUgYXBwbHlp
bmcgcGF0Y2hlcyAocmVtb3ZlcyBsb2NhbCBjaGFuZ2VzIGFuZCBjb21taXRzKSIpLAorICAgICAg
ICAgICAgbWFrZV9vcHRpb24oIi0tbm8tY2xlYW4iLCBhY3Rpb249InN0b3JlX2ZhbHNlIiwgZGVz
dD0iY2xlYW4iLCBkZWZhdWx0PVRydWUsIGhlbHA9IkRvbid0IGNoZWNrIGlmIHRoZSB3b3JraW5n
IGRpcmVjdG9yeSBpcyBjbGVhbiBiZWZvcmUgYXBwbHlpbmcgcGF0Y2hlcyIpLAorICAgICAgICBd
CisgICAgICAgIENvbW1hbmQuX19pbml0X18oc2VsZiwgJ0FwcGxpZXMgYWxsIHBhdGNoZXMgb24g
YSBidWcgdG8gdGhlIGxvY2FsIHdvcmtpbmcgZGlyZWN0b3J5IHdpdGhvdXQgY29tbWl0dGluZy4n
LCAnQlVHSUQnLCBvcHRpb25zPW9wdGlvbnMpCisKKyAgICBkZWYgZXhlY3V0ZShzZWxmLCBvcHRp
b25zLCBhcmdzLCB0b29sKToKKyAgICAgICAgYnVnX2lkID0gYXJnc1swXQorICAgICAgICBwYXRj
aGVzID0gdG9vbC5idWdzLmZldGNoX3Jldmlld2VkX3BhdGNoZXNfZnJvbV9idWcoYnVnX2lkKQor
ICAgICAgICBvcy5jaGRpcih0b29sLnNjbSgpLmNoZWNrb3V0X3Jvb3QpCisgICAgICAgIGlmIG9w
dGlvbnMuY2xlYW46CisgICAgICAgICAgICB0b29sLnNjbSgpLmVuc3VyZV9jbGVhbl93b3JraW5n
X2RpcmVjdG9yeShvcHRpb25zLmZvcmNlX2NsZWFuKQorICAgICAgICBpZiBvcHRpb25zLnVwZGF0
ZToKKyAgICAgICAgICAgIHRvb2wuc2NtKCkudXBkYXRlX3dlYmtpdCgpCisgICAgICAgIAorICAg
ICAgICBmb3IgcGF0Y2ggaW4gcGF0Y2hlczoKKyAgICAgICAgICAgICMgRklYTUU6IFNob3VsZCBo
YXZlIGFuIG9wdGlvbiB0byBsb2NhbC1jb21taXQgZWFjaCBwYXRjaCBhZnRlciBhcHBsaWNhdGlv
bi4KKyAgICAgICAgICAgIHRvb2wuc2NtKCkuYXBwbHlfcGF0Y2gocGF0Y2gpCisKKworZGVmIGJ1
Z19jb21tZW50X2Zyb21fY29tbWl0X3RleHQoY29tbWl0X3RleHQpOgorICAgIGNvbW1lbnRfbGlu
ZXMgPSBbXQorICAgIGNvbW1pdF9saW5lcyA9IGNvbW1pdF90ZXh0LnNwbGl0bGluZXMoKQorICAg
IGZvciBsaW5lIGluIGNvbW1pdF9saW5lczoKKyAgICAgICAgY29tbWVudF9saW5lcy5hcHBlbmQo
bGluZSkKKyAgICAgICAgbWF0Y2ggPSByZS5tYXRjaCgiXkNvbW1pdHRlZCByKFxkKykkIiwgbGlu
ZSkKKyAgICAgICAgaWYgbWF0Y2g6CisgICAgICAgICAgICByZXZpc2lvbiA9IG1hdGNoLmdyb3Vw
KDEpCisgICAgICAgICAgICBjb21tZW50X2xpbmVzLmFwcGVuZCgiaHR0cDovL3RyYWMud2Via2l0
Lm9yZy9jaGFuZ2VzZXQvIiArIHJldmlzaW9uKQorICAgICAgICAgICAgYnJlYWsKKyAgICByZXR1
cm4gIlxuIi5qb2luKGNvbW1lbnRfbGluZXMpCisKKworY2xhc3MgTGFuZEFuZFVwZGF0ZUJ1ZyhD
b21tYW5kKToKKyAgICBkZWYgX19pbml0X18oc2VsZik6CisgICAgICAgIENvbW1hbmQuX19pbml0
X18oc2VsZiwgJ0xhbmRzIHRoZSBjdXJyZW50IHdvcmtpbmcgZGlyZWN0b3J5IGRpZmYgYW5kIHVw
ZGF0ZXMgdGhlIGJ1Zy4nLCAnQlVHSUQnKQorCisgICAgZGVmIGV4ZWN1dGUoc2VsZiwgb3B0aW9u
cywgYXJncywgdG9vbCk6CisgICAgICAgIGJ1Z19pZCA9IGFyZ3NbMF0KKyAgICAgICAgb3MuY2hk
aXIodG9vbC5zY20oKS5jaGVja291dF9yb290KQorICAgICAgICBjb21taXRfbWVzc2FnZSA9IGNv
bW1pdF9tZXNzYWdlX2Zvcl90aGlzX2NvbW1pdCh0b29sLnNjbSgpKQorICAgICAgICBjb21taXRf
bG9nID0gdG9vbC5zY20oKS5jb21taXRfd2l0aF9tZXNzYWdlKGNvbW1pdF9tZXNzYWdlKQorICAg
ICAgICBjb21tZW50X3RleHQgPSBidWdfY29tbWVudF9mcm9tX2NvbW1pdF90ZXh0KGNvbW1pdF9s
b2cpCisgICAgICAgIHRvb2wuYnVncy5jbG9zZV9idWdfYXNfZml4ZWQoYnVnX2lkLCBjb21tZW50
X3RleHQpCisKKworY2xhc3MgTGFuZFBhdGNoZXNGcm9tQnVnKENvbW1hbmQpOgorICAgIGRlZiBf
X2luaXRfXyhzZWxmKToKKyAgICAgICAgb3B0aW9ucyA9IFsKKyAgICAgICAgICAgIG1ha2Vfb3B0
aW9uKCItLW5vLXVwZGF0ZSIsIGFjdGlvbj0ic3RvcmVfZmFsc2UiLCBkZXN0PSJ1cGRhdGUiLCBk
ZWZhdWx0PVRydWUsIGhlbHA9IkRvbid0IHVwZGF0ZSB0aGUgd29ya2luZyBkaXJlY3RvcnkgYmVm
b3JlIGFwcGx5aW5nIHBhdGNoZXMiKSwKKyAgICAgICAgICAgIG1ha2Vfb3B0aW9uKCItLWZvcmNl
LWNsZWFuIiwgYWN0aW9uPSJzdG9yZV90cnVlIiwgZGVzdD0iZm9yY2VfY2xlYW4iLCBkZWZhdWx0
PUZhbHNlLCBoZWxwPSJDbGVhbiB3b3JraW5nIGRpcmVjdG9yeSBiZWZvcmUgYXBwbHlpbmcgcGF0
Y2hlcyAocmVtb3ZlcyBsb2NhbCBjaGFuZ2VzIGFuZCBjb21taXRzKSIpLAorICAgICAgICAgICAg
bWFrZV9vcHRpb24oIi0tbm8tY2xlYW4iLCBhY3Rpb249InN0b3JlX2ZhbHNlIiwgZGVzdD0iY2xl
YW4iLCBkZWZhdWx0PVRydWUsIGhlbHA9IkRvbid0IGNoZWNrIGlmIHRoZSB3b3JraW5nIGRpcmVj
dG9yeSBpcyBjbGVhbiBiZWZvcmUgYXBwbHlpbmcgcGF0Y2hlcyIpLAorICAgICAgICAgICAgbWFr
ZV9vcHRpb24oIi0tbm8tYnVpbGQiLCBhY3Rpb249InN0b3JlX2ZhbHNlIiwgZGVzdD0iYnVpbGQi
LCBkZWZhdWx0PVRydWUsIGhlbHA9IkNvbW1pdCB3aXRob3V0IGJ1aWxkaW5nIGZpcnN0LCBpbXBs
aWVzIC0tbm8tdGVzdC4iKSwKKyAgICAgICAgICAgIG1ha2Vfb3B0aW9uKCItLW5vLXRlc3QiLCBh
Y3Rpb249InN0b3JlX2ZhbHNlIiwgZGVzdD0idGVzdCIsIGRlZmF1bHQ9VHJ1ZSwgaGVscD0iQ29t
bWl0IHdpdGhvdXQgcnVubm5pbmcgcnVuLXdlYmtpdC10ZXN0cy4iKSwKKyAgICAgICAgXQorICAg
ICAgICBDb21tYW5kLl9faW5pdF9fKHNlbGYsICdMYW5kcyBhbGwgcGF0Y2hlcyBvbiBhIGJ1ZyBv
cHRpb25hbGx5IHRlc3RpbmcgdGhlbSBmaXJzdCcsICdCVUdJRCcsIG9wdGlvbnM9b3B0aW9ucykK
KworICAgIEBzdGF0aWNtZXRob2QKKyAgICBkZWYgcnVuX2FuZF90aHJvd19pZl9mYWlsKHNjcmlw
dF9uYW1lKToKKyAgICAgICAgYnVpbGRfd2Via2l0X3Byb2Nlc3MgPSBzdWJwcm9jZXNzLlBvcGVu
KHNjcmlwdF9uYW1lLCBzaGVsbD1UcnVlKQorICAgICAgICByZXR1cm5fY29kZSA9IGJ1aWxkX3dl
YmtpdF9wcm9jZXNzLndhaXQoKQorICAgICAgICBpZiByZXR1cm5fY29kZToKKyAgICAgICAgICAg
IHJhaXNlIFNjcmlwdEVycm9yKHNjcmlwdF9uYW1lICsgIiBmYWlsZWQgd2l0aCBjb2RlICIgKyBy
ZXR1cm5fY29kZSkKKworICAgIGRlZiBidWlsZF93ZWJraXQoc2VsZik6CisgICAgICAgIHNlbGYu
cnVuX2FuZF90aHJvd19pZl9mYWlsKCJidWlsZC13ZWJraXQiKQorCisgICAgZGVmIHJ1bl93ZWJr
aXRfdGVzdHMoc2VsZik6CisgICAgICAgIHNlbGYucnVuX2FuZF90aHJvd19pZl9mYWlsKCJydW4t
d2Via2l0LXRlc3RzIikKKworICAgIGRlZiBleGVjdXRlKHNlbGYsIG9wdGlvbnMsIGFyZ3MsIHRv
b2wpOgorICAgICAgICBidWdfaWQgPSBhcmdzWzBdCisKKyAgICAgICAgdHJ5OgorICAgICAgICAg
ICAgcGF0Y2hlcyA9IHRvb2wuYnVncy5mZXRjaF9yZXZpZXdlZF9wYXRjaGVzX2Zyb21fYnVnKGJ1
Z19pZCkKKyAgICAgICAgICAgIGNvbW1pdF90ZXh0ID0gIiIKKworICAgICAgICAgICAgb3MuY2hk
aXIodG9vbC5zY20oKS5jaGVja291dF9yb290KQorICAgICAgICAgICAgdG9vbC5zY20oKS5lbnN1
cmVfbm9fbG9jYWxfY29tbWl0cyhvcHRpb25zLmZvcmNlX2NsZWFuKQorICAgICAgICAgICAgaWYg
b3B0aW9ucy5jbGVhbjoKKyAgICAgICAgICAgICAgICB0b29sLnNjbSgpLmVuc3VyZV9jbGVhbl93
b3JraW5nX2RpcmVjdG9yeShvcHRpb25zLmZvcmNlX2NsZWFuKQorICAgICAgICAgICAgaWYgb3B0
aW9ucy51cGRhdGU6CisgICAgICAgICAgICAgICAgdG9vbC5zY20oKS51cGRhdGVfd2Via2l0KCkK
KyAgICAgICAgICAgIAorICAgICAgICAgICAgZm9yIHBhdGNoIGluIHBhdGNoZXM6CisgICAgICAg
ICAgICAgICAgdG9vbC5zY20oKS5hcHBseV9wYXRjaChwYXRjaCkKKyAgICAgICAgICAgICAgICBp
ZiBvcHRpb25zLmJ1aWxkOgorICAgICAgICAgICAgICAgICAgICBzZWxmLmJ1aWxkX3dlYmtpdCgp
CisgICAgICAgICAgICAgICAgICAgIGlmIG9wdGlvbnMudGVzdDoKKyAgICAgICAgICAgICAgICAg
ICAgICAgIHNlbGYucnVuX3dlYmtpdF90ZXN0cygpCisgICAgICAgICAgICAgICAgY29tbWl0X21l
c3NhZ2UgPSBjb21taXRfbWVzc2FnZV9mb3JfdGhpc19jb21taXQodG9vbC5zY20oKSkKKyAgICAg
ICAgICAgICAgICBjb21taXRfbG9nID0gdG9vbC5zY20oKS5jb21taXRfd2l0aF9tZXNzYWdlKGNv
bW1pdF9tZXNzYWdlKQorICAgICAgICAgICAgICAgIGNvbW1lbnRfdGV4dCA9IGJ1Z19jb21tZW50
X2Zyb21fY29tbWl0X3RleHQoY29tbWl0X2xvZykKKyAgICAgICAgICAgICAgICAjIElmIHdlJ3Jl
IGNvbW1pdGluZyBtb3JlIHRoYW4gb25lIHBhdGNoLCB1cGRhdGUgdGhlIGJ1ZyBhcyB3ZSBnby4K
KyAgICAgICAgICAgICAgICBpZiBsZW4ocGF0Y2hlcykgPiAxOgorICAgICAgICAgICAgICAgICAg
ICB0b29sLmJ1Z3Mub2Jzb2xldGVfYXR0YWNobWVudChwYXRjaFsnaWQnXSwgY29tbWVudF90ZXh0
KQorCisgICAgICAgICAgICBpZiBsZW4ocGF0Y2hlcykgPiAxOgorICAgICAgICAgICAgICAgIGNv
bW1pdF90ZXh0ID0gIkFsbCByZXZpZXdlZCBwYXRjaGVzIGxhbmRlZCwgY2xvc2luZy4iCisKKyAg
ICAgICAgICAgIHRvb2wuYnVncy5jbG9zZV9idWdfYXNfZml4ZWQoYnVnX2lkLCBjb21taXRfdGV4
dCkKKyAgICAgICAgZXhjZXB0IFNjcmlwdEVycm9yLCBlcnJvcjoKKyAgICAgICAgICAgIGxvZyhl
cnJvcikKKyAgICAgICAgICAgICMgV2UgY291bGQgYWRkIGEgY29tbWVudCB0byB0aGUgYnVnIGFi
b3V0IHRoZSBmYWlsdXJlLgorCisKK2NsYXNzIENvbW1pdE1lc3NhZ2VGb3JDdXJyZW50RGlmZihD
b21tYW5kKToKKyAgICBkZWYgX19pbml0X18oc2VsZik6CisgICAgICAgIENvbW1hbmQuX19pbml0
X18oc2VsZiwgJ1ByaW50cyBhIGNvbW1pdCBtZXNzYWdlIHN1aXRhYmxlIGZvciB0aGUgdW5jb21t
aXR0ZWQgY2hhbmdlcy4nKQorCisgICAgZGVmIGV4ZWN1dGUoc2VsZiwgb3B0aW9ucywgYXJncywg
dG9vbCk6CisgICAgICAgIG9zLmNoZGlyKHRvb2wuc2NtKCkuY2hlY2tvdXRfcm9vdCkKKyAgICAg
ICAgcHJpbnQgIiVzIiAlIGNvbW1pdF9tZXNzYWdlX2Zvcl90aGlzX2NvbW1pdCh0b29sLnNjbSgp
KQorCisKK2NsYXNzIE9ic29sZXRlQXR0YWNobWVudHNPbkJ1ZyhDb21tYW5kKToKKyAgICBkZWYg
X19pbml0X18oc2VsZik6CisgICAgICAgIENvbW1hbmQuX19pbml0X18oc2VsZiwgJ01hcmtzIGFs
bCBhdHRhY2htZW50cyBvbiBhIGJ1ZyBhcyBvYnNvbGV0ZS4nLCAnQlVHSUQnKQorCisgICAgZGVm
IGV4ZWN1dGUoc2VsZiwgb3B0aW9ucywgYXJncywgdG9vbCk6CisgICAgICAgIGJ1Z19pZCA9IGFy
Z3NbMF0KKyAgICAgICAgYXR0YWNobWVudHMgPSB0b29sLmJ1Z3MuZmV0Y2hfYXR0YWNobWVudHNf
ZnJvbV9idWcoYnVnX2lkKQorICAgICAgICBmb3IgYXR0YWNobWVudCBpbiBhdHRhY2htZW50czoK
KyAgICAgICAgICAgIGlmIG5vdCBhdHRhY2htZW50WydvYnNvbGV0ZSddOgorICAgICAgICAgICAg
ICAgIHRvb2wuYnVncy5vYnNvbGV0ZV9hdHRhY2htZW50KGF0dGFjaG1lbnRbJ2lkJ10pCisKKwor
Y2xhc3MgUG9zdERpZmZBc1BhdGNoVG9CdWcoQ29tbWFuZCk6CisgICAgZGVmIF9faW5pdF9fKHNl
bGYpOgorICAgICAgICBvcHRpb25zID0gWworICAgICAgICAgICAgbWFrZV9vcHRpb24oIi0tbm8t
cmV2aWV3IiwgYWN0aW9uPSJzdG9yZV9mYWxzZSIsIGRlc3Q9InJldmlldyIsIGRlZmF1bHQ9VHJ1
ZSwgaGVscD0iRG8gbm90IG1hcmsgdGhlIHBhdGNoIGZvciByZXZpZXcuIiksCisgICAgICAgICAg
ICBtYWtlX29wdGlvbigiLW0iLCAiLS1kZXNjcmlwdGlvbiIsIGFjdGlvbj0ic3RvcmUiLCB0eXBl
PSJzdHJpbmciLCBkZXN0PSJkZXNjcmlwdGlvbiIsIGhlbHA9IkRlc2NyaXB0aW9uIHN0cmluZyBm
b3IgdGhlIGF0dGFjaG1lbnQgKGRlZmF1bHQ6ICdwYXRjaCcpIiksCisgICAgICAgIF0KKyAgICAg
ICAgQ29tbWFuZC5fX2luaXRfXyhzZWxmLCAnQXR0YWNoZXMgdGhlIGN1cnJlbnQgd29ya2luZyBk
aXJlY3RvcnkgZGlmZiB0byBhIGJ1ZyBhcyBhIHBhdGNoIGZpbGUuJywgJ0JVR0lEJywgb3B0aW9u
cz1vcHRpb25zKQorCisgICAgZGVmIGV4ZWN1dGUoc2VsZiwgb3B0aW9ucywgYXJncywgdG9vbCk6
CisgICAgICAgIGJ1Z19pZCA9IGFyZ3NbMF0KKyAgICAgICAgCisgICAgICAgIGRpZmZfcHJvY2Vz
cyA9IHN1YnByb2Nlc3MuUG9wZW4odG9vbC5zY20oKS5jcmVhdGVfcGF0Y2hfY29tbWFuZCgpLCBz
dGRvdXQ9c3VicHJvY2Vzcy5QSVBFLCBzaGVsbD1UcnVlKQorICAgICAgICBkaWZmX3Byb2Nlc3Mu
d2FpdCgpICMgTWFrZSBzdXJlIHN2bi1jcmVhdGUtcGF0Y2ggaXMgZG9uZSBiZWZvcmUgd2UgY29u
dGludWUuCisgICAgICAgIAorICAgICAgICBkZXNjcmlwdGlvbiA9IG9wdGlvbnMuZGVzY3JpcHRp
b24gaWYgb3B0aW9ucy5kZXNjcmlwdGlvbiBlbHNlICJwYXRjaCIKKyAgICAgICAgdG9vbC5idWdz
LmFkZF9wYXRjaF90b19idWcoYnVnX2lkLCBkaWZmX3Byb2Nlc3Muc3Rkb3V0LCBkZXNjcmlwdGlv
biwgbWFya19mb3JfcmV2aWV3PW9wdGlvbnMucmV2aWV3KQorCisKK2NsYXNzIFBvc3RDb21taXRz
QXNQYXRjaGVzVG9CdWcoQ29tbWFuZCk6CisgICAgZGVmIF9faW5pdF9fKHNlbGYpOgorICAgICAg
ICBvcHRpb25zID0gWworICAgICAgICAgICAgbWFrZV9vcHRpb24oIi0tbm8tcmV2aWV3IiwgYWN0
aW9uPSJzdG9yZV9mYWxzZSIsIGRlc3Q9InJldmlldyIsIGRlZmF1bHQ9VHJ1ZSwgaGVscD0iRG8g
bm90IG1hcmsgdGhlIHBhdGNoIGZvciByZXZpZXcuIiksCisgICAgICAgIF0KKyAgICAgICAgQ29t
bWFuZC5fX2luaXRfXyhzZWxmLCAnQXR0YWNoZXMgYSByYW5nZSBvZiBsb2NhbCBjb21taXRzIHRv
IGEgYnVnIGFzIHBhdGNoIGZpbGVzLicsICdCVUdJRCBDT01NSVRJU0gnLCBvcHRpb25zPW9wdGlv
bnMpCisKKyAgICBkZWYgZXhlY3V0ZShzZWxmLCBvcHRpb25zLCBhcmdzLCB0b29sKToKKyAgICAg
ICAgYnVnX2lkID0gYXJnc1swXQorICAgICAgICAKKyAgICAgICAgaWYgbm90IHRvb2wuc2NtKCku
c3VwcG9ydHNfbG9jYWxfY29tbWl0cygpOgorICAgICAgICAgICAgbG9nKHRvb2wuc2NtKCkuZGlz
cGxheV9uYW1lKCkgKyAiIGRvZXMgbm90IHN1cHBvcnQgbG9jYWwgY29tbWl0cy4iKQorICAgICAg
ICAgICAgZXhpdCgxKQorICAgICAgICAKKyAgICAgICAgY29tbWl0X2lkcyA9IHRvb2wuc2NtKCku
Y29tbWl0X2lkc19mcm9tX3JhbmdlX2FyZ3VtZW50cyhhcmdzWzE6XSkKKyAgICAgICAgCisgICAg
ICAgIGlmIGxlbihjb21taXRfaWRzKSA+IDEwOgorICAgICAgICAgICAgbG9nKCJBcmUgeW91IHN1
cmUgeW91IHdhbnQgdG8gYXR0YWNoICVkIHBhdGNoZXMgdG8gYnVnICVzPyIgJSAobGVuKGNvbW1p
dF9pZHMpLCBidWdfaWQpKQorICAgICAgICAgICAgIyBTaG91bGQgY291bGQgLS1wYXRjaGVzLWxp
bWl0IG9wdGlvbi4KKyAgICAgICAgICAgIGV4aXQoMSkKKyAgICAgICAgCisgICAgICAgIGxvZygi
QXR0YWNoaW5nICVkIGNvbW1pdHMgYXMgcGF0Y2hlcyB0byBidWcgJXMiICUgKGxlbihjb21taXRf
aWRzKSwgYnVnX2lkKSkKKyAgICAgICAgZm9yIGNvbW1pdF9pZCBpbiBjb21taXRfaWRzOgorICAg
ICAgICAgICAgY29tbWl0X21lc3NhZ2UgPSB0b29sLnNjbSgpLmNvbW1pdF9tZXNzYWdlX2Zvcl9j
b21taXQoY29tbWl0X2lkKQorICAgICAgICAgICAgY29tbWl0X2xpbmVzID0gY29tbWl0X21lc3Nh
Z2Uuc3BsaXRsaW5lcygpCisgICAgICAgICAgICAKKyAgICAgICAgICAgIGRlc2NyaXB0aW9uID0g
Y29tbWl0X2xpbmVzWzBdCisgICAgICAgICAgICBjb21tZW50X3RleHQgPSAiXG4iLmpvaW4oY29t
bWl0X2xpbmVzWzE6XSkKKyAgICAgICAgCisgICAgICAgICAgICBjb21tZW50X3RleHQgKz0gIlxu
LS0tXG4iCisgICAgICAgICAgICBjb21tZW50X3RleHQgKz0gdG9vbC5zY20oKS5maWxlc19jaGFu
Z2VkX3N1bW1hcnlfZm9yX2NvbW1pdChjb21taXRfaWQpCisgICAgICAgIAorICAgICAgICAgICAg
IyBUaGlzIGlzIGEgbGl0dGxlIGJpdCBvZiBhIGhhY2ssIHRoYXQgd2UgcGFzcyBzdGRvdXQgYXMg
dGhlIHBhdGNoIGZpbGUuCisgICAgICAgICAgICAjIFdlIGNvdWxkIGFsdGVybmF0aXZlbHkgbWFr
ZSBhbiBpbi1tZW1vcnkgZmlsZS1saWtlIG9iamVjdCB3aXRoIHRoZSBwYXRjaCBjb250ZW50cy4K
KyAgICAgICAgICAgIGRpZmZfcHJvY2VzcyA9IHN1YnByb2Nlc3MuUG9wZW4odG9vbC5zY20oKS5z
aG93X2RpZmZfY29tbWFuZF9mb3JfY29tbWl0KGNvbW1pdF9pZCksIHN0ZG91dD1zdWJwcm9jZXNz
LlBJUEUsIHNoZWxsPVRydWUpCisgICAgICAgICAgICB0b29sLmJ1Z3MuYWRkX3BhdGNoX3RvX2J1
ZyhidWdfaWQsIGRpZmZfcHJvY2Vzcy5zdGRvdXQsIGRlc2NyaXB0aW9uLCBjb21tZW50X3RleHQs
IG1hcmtfZm9yX3Jldmlldz1vcHRpb25zLnJldmlldykKKworCitjbGFzcyBOb25XcmFwcGluZ0Vw
aWxvZ0luZGVudGVkSGVscEZvcm1hdHRlcihJbmRlbnRlZEhlbHBGb3JtYXR0ZXIpOgorICAgIGRl
ZiBfX2luaXRfXyhzZWxmKToKKyAgICAgICAgSW5kZW50ZWRIZWxwRm9ybWF0dGVyLl9faW5pdF9f
KHNlbGYpCisKKyAgICAjIFRoZSBzdGFuZGFyZCBJbmRlbnRlZEhlbHBGb3JtYXR0ZXIgcGFyYWdy
YXBoLXdyYXBzIHRoZSBlcGlsb2csIGtpbGxpbmcgb3VyIGN1c3RvbSBmb3JtYXR0aW5nLgorICAg
IGRlZiBmb3JtYXRfZXBpbG9nKHNlbGYsIGVwaWxvZyk6CisgICAgICAgIGlmIGVwaWxvZzoKKyAg
ICAgICAgICAgIHJldHVybiAiXG4iICsgZXBpbG9nICsgIlxuIgorICAgICAgICBlbHNlOgorICAg
ICAgICAgICAgcmV0dXJuICIiCisKK2NsYXNzIEJ1Z3ppbGxhVG9vbDoKKyAgICBkZWYgX19pbml0
X18oc2VsZik6CisgICAgICAgIHNlbGYuY2FjaGVkX3NjbSA9IE5vbmUKKyAgICAgICAgc2VsZi5i
dWdzID0gQnVnemlsbGEoKQorICAgICAgICBzZWxmLmNvbW1hbmRzID0gWworICAgICAgICAgICAg
eyAnbmFtZScgOiAnYnVncy10by1jb21taXQnLCAnb2JqZWN0JyA6IEJ1Z3NJbkNvbW1pdFF1ZXVl
KCkgfSwKKyAgICAgICAgICAgIHsgJ25hbWUnIDogJ3BhdGNoZXMtdG8tY29tbWl0JywgJ29iamVj
dCcgOiBQYXRjaGVzSW5Db21taXRRdWV1ZSgpIH0sCisgICAgICAgICAgICB7ICduYW1lJyA6ICdy
ZXZpZXdlZC1wYXRjaGVzJywgJ29iamVjdCcgOiBSZXZpZXdlZFBhdGNoZXNPbkJ1ZygpIH0sCisg
ICAgICAgICAgICB7ICduYW1lJyA6ICdhcHBseS1wYXRjaGVzJywgJ29iamVjdCcgOiBBcHBseVBh
dGNoZXNGcm9tQnVnKCkgfSwKKyAgICAgICAgICAgIHsgJ25hbWUnIDogJ2xhbmQtYW5kLXVwZGF0
ZScsICdvYmplY3QnIDogTGFuZEFuZFVwZGF0ZUJ1ZygpIH0sCisgICAgICAgICAgICB7ICduYW1l
JyA6ICdsYW5kLXBhdGNoZXMnLCAnb2JqZWN0JyA6IExhbmRQYXRjaGVzRnJvbUJ1ZygpIH0sCisg
ICAgICAgICAgICB7ICduYW1lJyA6ICdjb21taXQtbWVzc2FnZScsICdvYmplY3QnIDogQ29tbWl0
TWVzc2FnZUZvckN1cnJlbnREaWZmKCkgfSwKKyAgICAgICAgICAgIHsgJ25hbWUnIDogJ29ic29s
ZXRlLWF0dGFjaG1lbnRzJywgJ29iamVjdCcgOiBPYnNvbGV0ZUF0dGFjaG1lbnRzT25CdWcoKSB9
LAorICAgICAgICAgICAgeyAnbmFtZScgOiAncG9zdC1kaWZmJywgJ29iamVjdCcgOiBQb3N0RGlm
ZkFzUGF0Y2hUb0J1ZygpIH0sCisgICAgICAgICAgICB7ICduYW1lJyA6ICdwb3N0LWNvbW1pdHMn
LCAnb2JqZWN0JyA6IFBvc3RDb21taXRzQXNQYXRjaGVzVG9CdWcoKSB9LAorICAgICAgICBdCisg
ICAgICAgIAorICAgICAgICBzZWxmLmdsb2JhbF9vcHRpb25fcGFyc2VyID0gT3B0aW9uUGFyc2Vy
KHVzYWdlPXNlbGYudXNhZ2VfbGluZSgpLCBmb3JtYXR0ZXI9Tm9uV3JhcHBpbmdFcGlsb2dJbmRl
bnRlZEhlbHBGb3JtYXR0ZXIoKSwgZXBpbG9nPXNlbGYuY29tbWFuZHNfdXNhZ2UoKSkKKyAgICAg
ICAgc2VsZi5nbG9iYWxfb3B0aW9uX3BhcnNlci5hZGRfb3B0aW9uKCItLWRyeS1ydW4iLCBhY3Rp
b249InN0b3JlX3RydWUiLCBkZXN0PSJkcnlydW4iLCBoZWxwPSJkbyBub3QgdG91Y2ggcmVtb3Rl
IHNlcnZlcnMiLCBkZWZhdWx0PUZhbHNlKQorICAgIAorICAgIGRlZiBzY20oc2VsZik6CisgICAg
ICAgICMgTGF6aWx5IGluaXRpYWxpemUgU0NNIHRvIG5vdCBlcnJvci1vdXQgYmVmb3JlIGNvbW1h
bmQgbGluZSBwYXJzaW5nIChvciB3aGVuIHJ1bm5pbmcgbm9uLXNjbSBjb21tYW5kcykuCisgICAg
ICAgIG9yaWdpbmFsX2N3ZCA9IG9zLnBhdGguYWJzcGF0aCgnLicpCisgICAgICAgIGlmIG5vdCBz
ZWxmLmNhY2hlZF9zY206CisgICAgICAgICAgICBzZWxmLmNhY2hlZF9zY20gPSBkZXRlY3Rfc2Nt
X3N5c3RlbShvcmlnaW5hbF9jd2QpCisgICAgICAgIAorICAgICAgICBpZiBub3Qgc2VsZi5jYWNo
ZWRfc2NtOgorICAgICAgICAgICAgc2NyaXB0X2RpcmVjdG9yeSA9IG9zLnBhdGguYWJzcGF0aChz
eXMucGF0aFswXSkKKyAgICAgICAgICAgIHdlYmtpdF9kaXJlY3RvcnkgPSBvcy5wYXRoLmFic3Bh
dGgob3MucGF0aC5qb2luKHNjcmlwdF9kaXJlY3RvcnksICIuLi8uLiIpKQorICAgICAgICAgICAg
c2VsZi5jYWNoZWRfc2NtID0gZGV0ZWN0X3NjbV9zeXN0ZW0od2Via2l0X2RpcmVjdG9yeSkKKyAg
ICAgICAgICAgIGlmIHNlbGYuY2FjaGVkX3NjbToKKyAgICAgICAgICAgICAgICBsb2coIlRoZSBj
dXJyZW50IGRpcmVjdG9yeSAoJXMpIGlzIG5vdCBhIFdlYktpdCBjaGVja291dCwgdXNpbmcgJXMi
ICUgKG9yaWdpbmFsX2N3ZCwgd2Via2l0X2RpcmVjdG9yeSkpCisgICAgICAgICAgICBlbHNlOgor
ICAgICAgICAgICAgICAgIGVycm9yKCJGQVRBTDogRmFpbGVkIHRvIGRldGVybWluZSB0aGUgU0NN
IHN5c3RlbSBmb3IgZWl0aGVyICVzIG9yICVzIiAlIChvcmlnaW5hbF9jd2QsIHdlYmtpdF9kaXJl
Y3RvcnkpKQorICAgICAgICAKKyAgICAgICAgcmV0dXJuIHNlbGYuY2FjaGVkX3NjbQorICAgIAor
ICAgIEBzdGF0aWNtZXRob2QKKyAgICBkZWYgdXNhZ2VfbGluZSgpOgorICAgICAgICByZXR1cm4g
IlVzYWdlOiAlcHJvZyBbb3B0aW9uc10gY29tbWFuZCBbY29tbWFuZC1vcHRpb25zXSBbY29tbWFu
ZC1hcmd1bWVudHNdIgorICAgIAorICAgIGRlZiBjb21tYW5kc191c2FnZShzZWxmKToKKyAgICAg
ICAgY29tbWFuZHNfdGV4dCA9ICJDb21tYW5kczpcbiIKKyAgICAgICAgbG9uZ2VzdF9uYW1lX2xl
bmd0aCA9IDAKKyAgICAgICAgY29tbWFuZF9yb3dzID0gW10KKyAgICAgICAgZm9yIGNvbW1hbmQg
aW4gc2VsZi5jb21tYW5kczoKKyAgICAgICAgICAgIGNvbW1hbmRfb2JqZWN0ID0gY29tbWFuZFsn
b2JqZWN0J10KKyAgICAgICAgICAgIGNvbW1hbmRfbmFtZV9hbmRfYXJncyA9IGNvbW1hbmRfb2Jq
ZWN0Lm5hbWVfd2l0aF9hcmd1bWVudHMoY29tbWFuZFsnbmFtZSddKQorICAgICAgICAgICAgY29t
bWFuZF9yb3dzLmFwcGVuZCh7ICduYW1lLWFuZC1hcmdzJzogY29tbWFuZF9uYW1lX2FuZF9hcmdz
LCAnb2JqZWN0JzogY29tbWFuZF9vYmplY3QgfSkKKyAgICAgICAgICAgIGxvbmdlc3RfbmFtZV9s
ZW5ndGggPSBtYXgoW2xvbmdlc3RfbmFtZV9sZW5ndGgsIGxlbihjb21tYW5kX25hbWVfYW5kX2Fy
Z3MpXSkKKyAgICAgICAgCisgICAgICAgICMgVXNlIG91ciBvd24gaGVscCBmb3JtYXR0ZXIgc28g
YXMgdG8gaW5kZW50IGVub3VnaC4KKyAgICAgICAgZm9ybWF0dGVyID0gSW5kZW50ZWRIZWxwRm9y
bWF0dGVyKCkKKyAgICAgICAgZm9ybWF0dGVyLmluZGVudCgpCisgICAgICAgIGZvcm1hdHRlci5p
bmRlbnQoKQorICAgICAgICAKKyAgICAgICAgZm9yIHJvdyBpbiBjb21tYW5kX3Jvd3M6CisgICAg
ICAgICAgICBjb21tYW5kX29iamVjdCA9IHJvd1snb2JqZWN0J10KKyAgICAgICAgICAgIGNvbW1h
bmRzX3RleHQgKz0gIiAgIiArIHJvd1snbmFtZS1hbmQtYXJncyddLmxqdXN0KGxvbmdlc3RfbmFt
ZV9sZW5ndGggKyAzKSArIGNvbW1hbmRfb2JqZWN0LmhlbHBfdGV4dCArICJcbiIKKyAgICAgICAg
ICAgIGNvbW1hbmRzX3RleHQgKz0gY29tbWFuZF9vYmplY3Qub3B0aW9uX3BhcnNlci5mb3JtYXRf
b3B0aW9uX2hlbHAoZm9ybWF0dGVyKQorICAgICAgICByZXR1cm4gY29tbWFuZHNfdGV4dAorCisg
ICAgZGVmIGhhbmRsZV9nbG9iYWxfYXJncyhzZWxmLCBhcmdzKToKKyAgICAgICAgKG9wdGlvbnMs
IGFyZ3MpID0gc2VsZi5nbG9iYWxfb3B0aW9uX3BhcnNlci5wYXJzZV9hcmdzKGFyZ3MpCisgICAg
ICAgIGlmIGxlbihhcmdzKToKKyAgICAgICAgICAgICMgV2UnbGwgbmV2ZXIgaGl0IHRoaXMgYmVj
YXVzZSBzcGxpdF9hcmdzIHNwbGl0cyBhdCB0aGUgZmlyc3QgYXJnIHdpdGhvdXQgYSBsZWFkaW5n
ICctJworICAgICAgICAgICAgc2VsZi5nbG9iYWxfb3B0aW9uX3BhcnNlci5lcnJvcigiRXh0cmEg
YXJndW1lbnRzIGJlZm9yZSBjb21tYW5kOiAiICsgYXJncykKKyAgICAgICAgCisgICAgICAgIGlm
IG9wdGlvbnMuZHJ5cnVuOgorICAgICAgICAgICAgc2VsZi5zY20oKS5kcnlydW4gPSBUcnVlCisg
ICAgICAgICAgICBzZWxmLmJ1Z3MuZHJ5cnVuID0gVHJ1ZQorICAgIAorICAgIEBzdGF0aWNtZXRo
b2QKKyAgICBkZWYgc3BsaXRfYXJncyhhcmdzKToKKyAgICAgICAgIyBBc3N1bWUgdGhlIGZpcnN0
IGFyZ3VtZW50IHdoaWNoIGRvZXNuJ3Qgc3RhcnQgd2l0aCAnLScgaXMgdGhlIGNvbW1hbmQgbmFt
ZS4KKyAgICAgICAgY29tbWFuZF9pbmRleCA9IDAKKyAgICAgICAgZm9yIGFyZyBpbiBhcmdzOgor
ICAgICAgICAgICAgaWYgYXJnWzBdICE9ICctJzoKKyAgICAgICAgICAgICAgICBicmVhaworICAg
ICAgICAgICAgY29tbWFuZF9pbmRleCArPSAxCisKKyAgICAgICAgZ2xvYmFsX2FyZ3MgPSBhcmdz
Wzpjb21tYW5kX2luZGV4XQorICAgICAgICBpZiBjb21tYW5kX2luZGV4ID49IGxlbihhcmdzKToK
KyAgICAgICAgICAgIHJldHVybiAoZ2xvYmFsX2FyZ3MsIE5vbmUsIFtdKQorCisgICAgICAgIGNv
bW1hbmQgPSBhcmdzW2NvbW1hbmRfaW5kZXhdCisgICAgICAgIGNvbW1hbmRfYXJncyA9IGFyZ3Nb
Y29tbWFuZF9pbmRleCArIDE6XQorICAgICAgICByZXR1cm4gKGdsb2JhbF9hcmdzLCBjb21tYW5k
LCBjb21tYW5kX2FyZ3MpCisgICAgCisgICAgZGVmIGNvbW1hbmRfYnlfbmFtZShzZWxmLCBjb21t
YW5kX25hbWUpOgorICAgICAgICBmb3IgY29tbWFuZCBpbiBzZWxmLmNvbW1hbmRzOgorICAgICAg
ICAgICAgaWYgY29tbWFuZF9uYW1lID09IGNvbW1hbmRbJ25hbWUnXToKKyAgICAgICAgICAgICAg
ICByZXR1cm4gY29tbWFuZAorICAgICAgICByZXR1cm4gTm9uZQorICAgIAorICAgIGRlZiBtYWlu
KHNlbGYpOgorICAgICAgICAoZ2xvYmFsX2FyZ3MsIGNvbW1hbmRfbmFtZSwgYXJnc19hZnRlcl9j
b21tYW5kX25hbWUpID0gc2VsZi5zcGxpdF9hcmdzKHN5cy5hcmd2WzE6XSkKKyAgICAgICAgCisg
ICAgICAgICMgSGFuZGxlIC0taGVscCwgZXRjOgorICAgICAgICBzZWxmLmhhbmRsZV9nbG9iYWxf
YXJncyhnbG9iYWxfYXJncykKKyAgICAgICAgCisgICAgICAgIGlmIG5vdCBjb21tYW5kX25hbWU6
CisgICAgICAgICAgICBzZWxmLmdsb2JhbF9vcHRpb25fcGFyc2VyLmVycm9yKCJObyBjb21tYW5k
IHNwZWNpZmllZCIpCisgICAgICAgIAorICAgICAgICBjb21tYW5kID0gc2VsZi5jb21tYW5kX2J5
X25hbWUoY29tbWFuZF9uYW1lKQorICAgICAgICBpZiBub3QgY29tbWFuZDoKKyAgICAgICAgICAg
IHNlbGYuZ2xvYmFsX29wdGlvbl9wYXJzZXIuZXJyb3IoY29tbWFuZF9uYW1lICsgIiBpcyBub3Qg
YSByZWNvZ25pemVkIGNvbW1hbmQiKQorICAgICAgICAKKyAgICAgICAgY29tbWFuZF9vYmplY3Qg
PSBjb21tYW5kWydvYmplY3QnXQorICAgICAgICAoY29tbWFuZF9vcHRpb25zLCBjb21tYW5kX2Fy
Z3MpID0gY29tbWFuZF9vYmplY3QucGFyc2VfYXJncyhhcmdzX2FmdGVyX2NvbW1hbmRfbmFtZSkK
KyAgICAgICAgcmV0dXJuIGNvbW1hbmRfb2JqZWN0LmV4ZWN1dGUoY29tbWFuZF9vcHRpb25zLCBj
b21tYW5kX2FyZ3MsIHNlbGYpCisKKworZGVmIG1haW4oKToKKyAgICB0b29sID0gQnVnemlsbGFU
b29sKCkKKyAgICByZXR1cm4gdG9vbC5tYWluKCkKKworaWYgX19uYW1lX18gPT0gIl9fbWFpbl9f
IjoKKyAgICBtYWluKCkKZGlmZiAtLWdpdCBhL1dlYktpdFRvb2xzL1NjcmlwdHMvbW9kdWxlcy9f
X2luaXRfXy5weSBiL1dlYktpdFRvb2xzL1NjcmlwdHMvbW9kdWxlcy9fX2luaXRfXy5weQpuZXcg
ZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZjY1YmVlCi0tLSAvZGV2L251bGwKKysr
IGIvV2ViS2l0VG9vbHMvU2NyaXB0cy9tb2R1bGVzL19faW5pdF9fLnB5CkBAIC0wLDAgKzEgQEAK
KyMgUmVxdWlyZWQgZm9yIFB5dGhvbiB0byBzZWFyY2ggdGhpcyBkaXJlY3RvcnkgZm9yIG1vZHVs
ZSBmaWxlcwpkaWZmIC0tZ2l0IGEvV2ViS2l0VG9vbHMvU2NyaXB0cy9tb2R1bGVzL2J1Z3ppbGxh
LnB5IGIvV2ViS2l0VG9vbHMvU2NyaXB0cy9tb2R1bGVzL2J1Z3ppbGxhLnB5Cm5ldyBmaWxlIG1v
ZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUyN2MxMWUKLS0tIC9kZXYvbnVsbAorKysgYi9XZWJL
aXRUb29scy9TY3JpcHRzL21vZHVsZXMvYnVnemlsbGEucHkKQEAgLTAsMCArMSwyODMgQEAKKyMg
Q29weXJpZ2h0IChjKSAyMDA5LCBHb29nbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorIyAK
KyMgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0
aCBvciB3aXRob3V0CisjIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0
IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKyMgbWV0OgorIyAKKyMgICAgICogUmVkaXN0
cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQK
KyMgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNj
bGFpbWVyLgorIyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXBy
b2R1Y2UgdGhlIGFib3ZlCisjIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRp
b25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKyMgaW4gdGhlIGRvY3VtZW50YXRpb24g
YW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorIyBkaXN0cmlidXRpb24u
CisjICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBv
ZiBpdHMKKyMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBw
cm9kdWN0cyBkZXJpdmVkIGZyb20KKyMgdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHBy
aW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyMgCisjIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQg
QlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyMgIkFTIElTIiBBTkQg
QU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyMg
TElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5E
IEZJVE5FU1MgRk9SCisjIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBO
TyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisjIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBM
SUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorIyBTUEVDSUFMLCBF
WEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisj
IExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7
IExPU1MgT0YgVVNFLAorIyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJ
T04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyMgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hF
VEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorIyAoSU5DTFVESU5H
IE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBV
U0UKKyMgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElU
WSBPRiBTVUNIIERBTUFHRS4KKyMKKyMgV2ViS2l0J3MgUHl0aG9uIG1vZHVsZSBmb3IgaW50ZXJh
Y3Rpbmcgd2l0aCBCdWd6aWxsYQorCitpbXBvcnQgZ2V0cGFzcworaW1wb3J0IHN1YnByb2Nlc3MK
K2ltcG9ydCBzeXMKK2ltcG9ydCB1cmxsaWIyCisKK3RyeToKKyAgICBmcm9tIEJlYXV0aWZ1bFNv
dXAgaW1wb3J0IEJlYXV0aWZ1bFNvdXAKKyAgICBmcm9tIG1lY2hhbml6ZSBpbXBvcnQgQnJvd3Nl
cgorZXhjZXB0IEltcG9ydEVycm9yLCBlOgorICAgIHByaW50ICIiIgorQmVhdXRpZnVsU291cCBh
bmQgbWVjaGFuaXplIGFyZSByZXF1aXJlZC4KKworVG8gaW5zdGFsbDoKK3N1ZG8gZWFzeV9pbnN0
YWxsIEJlYXV0aWZ1bFNvdXAgbWVjaGFuaXplCisKK09yIGZyb20gdGhlIHdlYjoKK2h0dHA6Ly93
d3cuY3J1bW15LmNvbS9zb2Z0d2FyZS9CZWF1dGlmdWxTb3VwLworaHR0cDovL3d3d3NlYXJjaC5z
b3VyY2Vmb3JnZS5uZXQvbWVjaGFuaXplLworIiIiCisgICAgZXhpdCgxKQorCitkZWYgbG9nKHN0
cmluZyk6CisgICAgcHJpbnQgPj4gc3lzLnN0ZGVyciwgc3RyaW5nCisKKyMgSEFDSzogVGhpcyBz
aG91bGQgbm90IGRlcGVuZCBvbiBnaXQgZm9yIGNvbmZpZyBzdG9yYWdlCitkZWYgcmVhZF9jb25m
aWcoa2V5KToKKyAgICAjIE5lZWQgYSB3YXkgdG8gcmVhZCBmcm9tIHN2biB0b28KKyAgICBjb25m
aWdfcHJvY2VzcyA9IHN1YnByb2Nlc3MuUG9wZW4oImdpdCBjb25maWcgLS1nZXQgYnVnemlsbGEu
IiArIGtleSwgc3Rkb3V0PXN1YnByb2Nlc3MuUElQRSwgc2hlbGw9VHJ1ZSkKKyAgICB2YWx1ZSA9
IGNvbmZpZ19wcm9jZXNzLmNvbW11bmljYXRlKClbMF0KKyAgICByZXR1cm5fY29kZSA9IGNvbmZp
Z19wcm9jZXNzLndhaXQoKQorCisgICAgaWYgcmV0dXJuX2NvZGU6CisgICAgICAgIHJldHVybiBO
b25lCisgICAgcmV0dXJuIHZhbHVlLnJzdHJpcCgnXG4nKQorCitjbGFzcyBCdWd6aWxsYToKKyAg
ICBkZWYgX19pbml0X18oc2VsZiwgZHJ5cnVuPUZhbHNlKToKKyAgICAgICAgc2VsZi5kcnlydW4g
PSBkcnlydW4KKyAgICAgICAgc2VsZi5hdXRoZW50aWNhdGVkID0gRmFsc2UKKyAgICAgICAgCisg
ICAgICAgICMgRGVmYXVsdHMgKHVudGlsIHdlIHN1cHBvcnQgYmV0dGVyIG9wdGlvbiBwYXJzaW5n
KToKKyAgICAgICAgc2VsZi5idWdfc2VydmVyID0gImh0dHBzOi8vYnVncy53ZWJraXQub3JnLyIK
KyAgICAgICAgCisgICAgICAgIHNlbGYuYnJvd3NlciA9IEJyb3dzZXIoKQorICAgICAgICAjIEln
bm9yZSBidWdzLndlYmtpdC5vcmcvcm9ib3RzLnR4dCB1bnRpbCB3ZSBmaXggaXQgdG8gYWxsb3cg
dGhpcyBzY3JpcHQKKyAgICAgICAgc2VsZi5icm93c2VyLnNldF9oYW5kbGVfcm9ib3RzKEZhbHNl
KQorCisgICAgIyBUaGlzIGNvdWxkIGV2ZW50dWFsbHkgYmUgYSB0ZXh0IGZpbGUKKyAgICByZXZp
ZXdlcl91c2VybmFtZXNfdG9fZnVsbF9uYW1lcyA9IHsKKyAgICAgICAgImFiYXJ0aCIgOiAiQWRh
bSBCYXJ0aCIsCisgICAgICAgICJhZGVsZSIgOiAiQWRlbGUgUGV0ZXJzb24iLAorICAgICAgICAi
YXAiIDogIkFsZXhleSBQcm9za3VyeWFrb3YiLAorICAgICAgICAiYXJpeWEuaGlkYXlhdCIgOiAi
QXJpeWEgSGlkYXlhdCIsCisgICAgICAgICJkYXJpbiIgOiAiRGFyaW4gQWRsZXIiLAorICAgICAg
ICAiZGdsYXprb3YiIDogIkRpbWl0cmkgR2xhemtvdiIsCisgICAgICAgICJlcmljIiA6ICJFcmlj
IFNlaWRlbCIsCisgICAgICAgICJkZGtpbHplciIgOiAiRGF2aWQgS2lsemVyIiwKKyAgICAgICAg
ImZpc2hkIiA6ICJEYXJpbiBGaXNoZXIiLAorICAgICAgICAiZ25zIiA6ICJHdXN0YXZvIE5vcm9u
aGEiLAorICAgICAgICAiaHlhdHQiIDogIkRhdmlkIEh5YXR0IiwKKyAgICAgICAgImptYWxvbnpv
IiA6ICJKYW4gQWxvbnpvIiwKKyAgICAgICAgImp1c3Rpbi5nYXJjaWEiIDogIkp1c3RpbiBHYXJj
aWEiLAorICAgICAgICAia2V2aW5vIiA6ICJLZXZpbiBPbGxpdmllciIsCisgICAgICAgICJsZXZp
biIgOiAiRGF2aWQgTGV2aW4iLAorICAgICAgICAibWl0eiIgOiAiRGFuIEJlcm5zdGVpbiIsCisg
ICAgICAgICJtanMiIDogIk1hY2llaiBTdGFjaG92aWFrIiwKKyAgICAgICAgIm1yb3dlIiA6ICJN
YXJrIFJvd2UiLAorICAgICAgICAib2xpdmVyIiA6ICJPbGl2ZXIgSHVudCIsCisgICAgICAgICJz
YW0iIDogIlNhbSBXZWluaWciLAorICAgICAgICAic3RhaWtvcyIgOiAiR2VvcmdlIFN0YWlrb3Mi
LAorICAgICAgICAidHJlYXQiIDogIkFkYW0gVHJlYXQiLAorICAgICAgICAidGltb3RoeSIgOiAi
VGltb3RoeSBIYXRjaGVyIiwKKyAgICAgICAgInhhbi5sb3BleiIgOiAiWGFuIExvcGV6IiwKKyAg
ICAgICAgInplY2tlIiA6ICJIb2xnZXIgRnJleXRoZXIiLAorICAgICAgICAiemltbWVybWFubiIg
OiAiTmlrb2xhcyBaaW1tZXJtYW5uIiwKKyAgICB9CisKKyAgICBkZWYgZnVsbF9uYW1lX2Zyb21f
YnVnemlsbGFfbmFtZShzZWxmLCBidWd6aWxsYV9uYW1lKToKKyAgICAgICAgaWYgbm90IGJ1Z3pp
bGxhX25hbWUgaW4gc2VsZi5yZXZpZXdlcl91c2VybmFtZXNfdG9fZnVsbF9uYW1lczoKKyAgICAg
ICAgICAgIHJhaXNlIEV4Y2VwdGlvbigiRVJST1I6IFVua25vd24gcmV2aWV3ZXIhICIgKyBidWd6
aWxsYV9uYW1lKQorICAgICAgICByZXR1cm4gc2VsZi5yZXZpZXdlcl91c2VybmFtZXNfdG9fZnVs
bF9uYW1lc1tidWd6aWxsYV9uYW1lXQorCisgICAgZGVmIGJ1Z191cmxfZm9yX2J1Z19pZChzZWxm
LCBidWdfaWQpOgorICAgICAgICBidWdfYmFzZV91cmwgPSBzZWxmLmJ1Z19zZXJ2ZXIgKyAic2hv
d19idWcuY2dpP2lkPSIKKyAgICAgICAgcmV0dXJuICIlcyVzIiAlIChidWdfYmFzZV91cmwsIGJ1
Z19pZCkKKyAgICAKKyAgICBkZWYgYXR0YWNobWVudF91cmxfZm9yX2lkKHNlbGYsIGF0dGFjaG1l
bnRfaWQsIGFjdGlvbj0idmlldyIpOgorICAgICAgICBhdHRhY2htZW50X2Jhc2VfdXJsID0gc2Vs
Zi5idWdfc2VydmVyICsgImF0dGFjaG1lbnQuY2dpP2lkPSIKKyAgICAgICAgcmV0dXJuICIlcyVz
JmFjdGlvbj0lcyIgJSAoYXR0YWNobWVudF9iYXNlX3VybCwgYXR0YWNobWVudF9pZCwgYWN0aW9u
KQorCisgICAgZGVmIGZldGNoX2F0dGFjaG1lbnRzX2Zyb21fYnVnKHNlbGYsIGJ1Z19pZCk6Cisg
ICAgICAgIGJ1Z191cmwgPSBzZWxmLmJ1Z191cmxfZm9yX2J1Z19pZChidWdfaWQpCisgICAgICAg
IGxvZygiRmV0Y2hpbmc6ICIgKyBidWdfdXJsKQorCisgICAgICAgIHBhZ2UgPSB1cmxsaWIyLnVy
bG9wZW4oYnVnX3VybCkKKyAgICAgICAgc291cCA9IEJlYXV0aWZ1bFNvdXAocGFnZSkKKyAgICAK
KyAgICAgICAgYXR0YWNobWVudF90YWJsZSA9IHNvdXAuZmluZCgndGFibGUnLCB7J2NlbGxzcGFj
aW5nJzoiMCIsICdjZWxscGFkZGluZyc6IjQiLCAnYm9yZGVyJzoiMSJ9KQorICAgIAorICAgICAg
ICBhdHRhY2htZW50cyA9IFtdCisgICAgICAgICMgR3JhYiBhIGxpc3Qgb2Ygbm9uLW9ic29sZXRl
ZCBwYXRjaCBmaWxlcyAKKyAgICAgICAgZm9yIGF0dGFjaG1lbnRfcm93IGluIGF0dGFjaG1lbnRf
dGFibGUuZmluZEFsbCgndHInKToKKyAgICAgICAgICAgIGZpcnN0X2NlbGwgPSBhdHRhY2htZW50
X3Jvdy5maW5kKCd0ZCcpCisgICAgICAgICAgICBpZiBub3QgZmlyc3RfY2VsbDoKKyAgICAgICAg
ICAgICAgICBjb250aW51ZSAjIFRoaXMgaXMgdGhlIGhlYWRlciwgbm8gY2VsbHMKKyAgICAgICAg
ICAgIGlmIGZpcnN0X2NlbGwuaGFzX2tleSgnY29sc3BhbicpOgorICAgICAgICAgICAgICAgIGJy
ZWFrICMgdGhpcyBpcyB0aGUgbGFzdCByb3cKKyAgICAgICAgICAgIAorICAgICAgICAgICAgYXR0
YWNobWVudCA9IHt9CisgICAgICAgICAgICBhdHRhY2htZW50WydvYnNvbGV0ZSddID0gKGF0dGFj
aG1lbnRfcm93Lmhhc19rZXkoJ2NsYXNzJykgYW5kIGF0dGFjaG1lbnRfcm93WydjbGFzcyddID09
ICJiel9vYnNvbGV0ZSIpCisgICAgICAgICAgICAKKyAgICAgICAgICAgIGNlbGxzID0gYXR0YWNo
bWVudF9yb3cuZmluZEFsbCgndGQnKQorICAgICAgICAgICAgYXR0YWNobWVudF9saW5rID0gY2Vs
bHNbMF0uZmluZCgnYScpCisgICAgICAgICAgICBhdHRhY2htZW50Wyd1cmwnXSA9IHNlbGYuYnVn
X3NlcnZlciArIGF0dGFjaG1lbnRfbGlua1snaHJlZiddICMgdXJscyBhcmUgcmVsYXRpdmUKKyAg
ICAgICAgICAgIGF0dGFjaG1lbnRbJ2lkJ10gPSBhdHRhY2htZW50Wyd1cmwnXS5zcGxpdCgnPScp
WzFdICMgZS5nLiBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9hdHRhY2htZW50LmNnaT9pZD0zMTIy
MworICAgICAgICAgICAgYXR0YWNobWVudFsnbmFtZSddID0gYXR0YWNobWVudF9saW5rLnN0cmlu
ZworICAgICAgICAgICAgIyBhdHRhY2htZW50Wyd0eXBlJ10gPSBjZWxsc1sxXQorICAgICAgICAg
ICAgIyBhdHRhY2htZW50WydkYXRlJ10gPSBjZWxsc1syXQorICAgICAgICAgICAgIyBhdHRhY2ht
ZW50WydzaXplJ10gPSBjZWxsc1szXQorICAgICAgICAgICAgcmV2aWV3X3N0YXR1cyA9IGNlbGxz
WzRdCisgICAgICAgICAgICAjIGFjdGlvbl9saW5rcyA9IGNlbGxzWzVdCisKKyAgICAgICAgICAg
IGlmIHN0cihyZXZpZXdfc3RhdHVzKS5maW5kKCJyZXZpZXcrIikgIT0gLTE6CisgICAgICAgICAg
ICAgICAgcmV2aWV3ZXIgPSByZXZpZXdfc3RhdHVzLmNvbnRlbnRzWzBdLnNwbGl0KCc6JylbMF0g
IyBuYW1lOlxuIHJldmlldytcbgorICAgICAgICAgICAgICAgIHJldmlld2VyX2Z1bGxfbmFtZSA9
IHNlbGYuZnVsbF9uYW1lX2Zyb21fYnVnemlsbGFfbmFtZShyZXZpZXdlcikKKyAgICAgICAgICAg
ICAgICBhdHRhY2htZW50WydyZXZpZXdlciddID0gcmV2aWV3ZXJfZnVsbF9uYW1lCisKKyAgICAg
ICAgICAgIGF0dGFjaG1lbnRzLmFwcGVuZChhdHRhY2htZW50KQorICAgICAgICByZXR1cm4gYXR0
YWNobWVudHMKKworICAgIGRlZiBmZXRjaF9yZXZpZXdlZF9wYXRjaGVzX2Zyb21fYnVnKHNlbGYs
IGJ1Z19pZCk6CisgICAgICAgIHJldmlld2VkX3BhdGNoZXMgPSBbXQorICAgICAgICBmb3IgYXR0
YWNobWVudCBpbiBzZWxmLmZldGNoX2F0dGFjaG1lbnRzX2Zyb21fYnVnKGJ1Z19pZCk6CisgICAg
ICAgICAgICBpZiAncmV2aWV3ZXInIGluIGF0dGFjaG1lbnQgYW5kIG5vdCBhdHRhY2htZW50Wydv
YnNvbGV0ZSddOgorICAgICAgICAgICAgICAgIHJldmlld2VkX3BhdGNoZXMuYXBwZW5kKGF0dGFj
aG1lbnQpCisgICAgICAgIHJldHVybiByZXZpZXdlZF9wYXRjaGVzCisKKyAgICBkZWYgZmV0Y2hf
YnVnX2lkc19mcm9tX2NvbW1pdF9xdWV1ZShzZWxmKToKKyAgICAgICAgIyBGSVhNRTogV2Ugc2hv
dWxkIGhhdmUgYW4gb3B0aW9uIGZvciByZXN0cmljdGluZyB0aGUgc2VhcmNoIGJ5IGVtYWlsLiAg
RXhhbXBsZToKKyAgICAgICAgIyB1bmFzc2lnbmVkX29ubHkgPSAiJmVtYWlsYXNzaWduZWRfdG8x
PTEmZW1haWx0eXBlMT1zdWJzdHJpbmcmZW1haWwxPXVuYXNzaWduZWQiCisgICAgICAgIGNvbW1p
dF9xdWV1ZV91cmwgPSAiaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvYnVnbGlzdC5jZ2k/cXVlcnlf
Zm9ybWF0PWFkdmFuY2VkJmJ1Z19zdGF0dXM9VU5DT05GSVJNRUQmYnVnX3N0YXR1cz1ORVcmYnVn
X3N0YXR1cz1BU1NJR05FRCZidWdfc3RhdHVzPVJFT1BFTkVEJmZpZWxkMC0wLTA9ZmxhZ3R5cGVz
Lm5hbWUmdHlwZTAtMC0wPWVxdWFscyZ2YWx1ZTAtMC0wPXJldmlldyUyQiIKKyAgICAgICAgbG9n
KCJMb2FkaW5nIGNvbW1pdCBxdWV1ZSIpCisKKyAgICAgICAgcGFnZSA9IHVybGxpYjIudXJsb3Bl
bihjb21taXRfcXVldWVfdXJsKQorICAgICAgICBzb3VwID0gQmVhdXRpZnVsU291cChwYWdlKQor
ICAgIAorICAgICAgICBidWdfaWRzID0gW10KKyAgICAgICAgIyBHcmFiIHRoZSBjZWxscyBpbiB0
aGUgZmlyc3QgY29sdW1uICh3aGljaCBoYXBwZW5zIHRvIGJlIHRoZSBidWcgaWRzKQorICAgICAg
ICBmb3IgYnVnX2xpbmtfY2VsbCBpbiBzb3VwKCd0ZCcsICJmaXJzdC1jaGlsZCIpOiAjIHRkcyB3
aXRoIHRoZSBjbGFzcyAiZmlyc3QtY2hpbGQiCisgICAgICAgICAgICBidWdfbGluayA9IGJ1Z19s
aW5rX2NlbGwuZmluZCgiYSIpCisgICAgICAgICAgICBidWdfaWRzLmFwcGVuZChidWdfbGluay5z
dHJpbmcpICMgdGhlIGNvbnRlbnRzIGhhcHBlbiB0byBiZSB0aGUgYnVnIGlkCisgICAgCisgICAg
ICAgIHJldHVybiBidWdfaWRzCisKKyAgICBkZWYgZmV0Y2hfcGF0Y2hlc19mcm9tX2NvbW1pdF9x
dWV1ZShzZWxmKToKKyAgICAgICAgcGF0Y2hlc190b19sYW5kID0gW10KKyAgICAgICAgZm9yIGJ1
Z19pZCBpbiBzZWxmLmZldGNoX2J1Z19pZHNfZnJvbV9jb21taXRfcXVldWUoKToKKyAgICAgICAg
ICAgIHBhdGNoZXMgPSBzZWxmLmZldGNoX3Jldmlld2VkX3BhdGNoZXNfZnJvbV9idWcoYnVnX2lk
KQorICAgICAgICAgICAgcGF0Y2hlc190b19sYW5kICs9IHBhdGNoZXMKKyAgICAgICAgcmV0dXJu
IHBhdGNoZXNfdG9fbGFuZAorCisgICAgZGVmIGF1dGhlbnRpY2F0ZShzZWxmLCB1c2VybmFtZT1O
b25lLCBwYXNzd29yZD1Ob25lKToKKyAgICAgICAgaWYgc2VsZi5hdXRoZW50aWNhdGVkOgorICAg
ICAgICAgICAgcmV0dXJuCisgICAgICAgIAorICAgICAgICBpZiBub3QgdXNlcm5hbWU6CisgICAg
ICAgICAgICB1c2VybmFtZSA9IHJlYWRfY29uZmlnKCJ1c2VybmFtZSIpCisgICAgICAgICAgICBp
ZiBub3QgdXNlcm5hbWU6CisgICAgICAgICAgICAgICAgdXNlcm5hbWUgPSByYXdfaW5wdXQoIkJ1
Z3ppbGxhIGxvZ2luOiAiKQorICAgICAgICBpZiBub3QgcGFzc3dvcmQ6CisgICAgICAgICAgICBw
YXNzd29yZCA9IHJlYWRfY29uZmlnKCJwYXNzd29yZCIpCisgICAgICAgICAgICBpZiBub3QgcGFz
c3dvcmQ6CisgICAgICAgICAgICAgICAgcGFzc3dvcmQgPSBnZXRwYXNzLmdldHBhc3MoIkJ1Z3pp
bGxhIHBhc3N3b3JkIGZvciAlczogIiAlIHVzZXJuYW1lKQorCisgICAgICAgIGxvZygiTG9nZ2lu
ZyBpbiBhcyAlcy4uLiIgJSB1c2VybmFtZSkKKyAgICAgICAgaWYgc2VsZi5kcnlydW46CisgICAg
ICAgICAgICBzZWxmLmF1dGhlbnRpY2F0ZWQgPSBUcnVlCisgICAgICAgICAgICByZXR1cm4KKyAg
ICAgICAgc2VsZi5icm93c2VyLm9wZW4oc2VsZi5idWdfc2VydmVyICsgIi9pbmRleC5jZ2k/R29B
aGVhZEFuZExvZ0luPTEiKQorICAgICAgICBzZWxmLmJyb3dzZXIuc2VsZWN0X2Zvcm0obmFtZT0i
bG9naW4iKQorICAgICAgICBzZWxmLmJyb3dzZXJbJ0J1Z3ppbGxhX2xvZ2luJ10gPSB1c2VybmFt
ZQorICAgICAgICBzZWxmLmJyb3dzZXJbJ0J1Z3ppbGxhX3Bhc3N3b3JkJ10gPSBwYXNzd29yZAor
ICAgICAgICBzZWxmLmJyb3dzZXIuc3VibWl0KCkKKworICAgICAgICAjIFdlIHJlYWxseSBzaG91
bGQgY2hlY2sgdGhlIHJlc3VsdCBjb2RlcyBhbmQgdHJ5IGFnYWluIGFzIG5lY2Vzc2FyeQorICAg
ICAgICBzZWxmLmF1dGhlbnRpY2F0ZWQgPSBUcnVlCisKKyAgICBkZWYgYWRkX3BhdGNoX3RvX2J1
ZyhzZWxmLCBidWdfaWQsIHBhdGNoX2ZpbGVfb2JqZWN0LCBkZXNjcmlwdGlvbiwgY29tbWVudF90
ZXh0PU5vbmUsIG1hcmtfZm9yX3Jldmlldz1GYWxzZSk6CisgICAgICAgIHNlbGYuYXV0aGVudGlj
YXRlKCkKKyAgICAgICAgCisgICAgICAgIGxvZygnQWRkaW5nIHBhdGNoICIlcyIgdG8gYnVnICVz
JyAlIChkZXNjcmlwdGlvbiwgYnVnX2lkKSkKKyAgICAgICAgaWYgc2VsZi5kcnlydW46CisgICAg
ICAgICAgICBsb2coY29tbWVudF90ZXh0KQorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIAor
ICAgICAgICBzZWxmLmJyb3dzZXIub3BlbihzZWxmLmJ1Z19zZXJ2ZXIgKyAiL2F0dGFjaG1lbnQu
Y2dpP2FjdGlvbj1lbnRlciZidWdpZD0iICsgYnVnX2lkKQorICAgICAgICBzZWxmLmJyb3dzZXIu
c2VsZWN0X2Zvcm0obmFtZT0iZW50cnlmb3JtIikKKyAgICAgICAgc2VsZi5icm93c2VyWydkZXNj
cmlwdGlvbiddID0gZGVzY3JpcHRpb24KKyAgICAgICAgc2VsZi5icm93c2VyWydpc3BhdGNoJ10g
PSAoIjEiLCkKKyAgICAgICAgaWYgY29tbWVudF90ZXh0OgorICAgICAgICAgICAgbG9nKGNvbW1l
bnRfdGV4dCkKKyAgICAgICAgICAgIHNlbGYuYnJvd3NlclsnY29tbWVudCddID0gY29tbWVudF90
ZXh0CisgICAgICAgIHNlbGYuYnJvd3NlclsnZmxhZ190eXBlLTEnXSA9ICgnPycsKSBpZiBtYXJr
X2Zvcl9yZXZpZXcgZWxzZSAoJ1gnLCkKKyAgICAgICAgc2VsZi5icm93c2VyLmFkZF9maWxlKHBh
dGNoX2ZpbGVfb2JqZWN0LCAidGV4dC9wbGFpbiIsICJidWd6aWxsYV9yZXF1aXJlc19hX2ZpbGVu
YW1lLnBhdGNoIikKKyAgICAgICAgc2VsZi5icm93c2VyLnN1Ym1pdCgpCisKKyAgICBkZWYgb2Jz
b2xldGVfYXR0YWNobWVudChzZWxmLCBhdHRhY2htZW50X2lkLCBjb21tZW50X3RleHQgPSBOb25l
KToKKyAgICAgICAgc2VsZi5hdXRoZW50aWNhdGUoKQorCisgICAgICAgIGxvZygiT2Jzb2xldGlu
ZyBhdHRhY2htZW50OiAlcyIgJSBhdHRhY2htZW50X2lkKQorICAgICAgICBpZiBzZWxmLmRyeXJ1
bjoKKyAgICAgICAgICAgIGxvZyhjb21tZW50X3RleHQpCisgICAgICAgICAgICByZXR1cm4KKwor
ICAgICAgICBzZWxmLmJyb3dzZXIub3BlbihzZWxmLmF0dGFjaG1lbnRfdXJsX2Zvcl9pZChhdHRh
Y2htZW50X2lkLCAnZWRpdCcpKQorICAgICAgICBzZWxmLmJyb3dzZXIuc2VsZWN0X2Zvcm0obnI9
MCkKKyAgICAgICAgc2VsZi5icm93c2VyLmZpbmRfY29udHJvbCgnaXNvYnNvbGV0ZScpLml0ZW1z
WzBdLnNlbGVjdGVkID0gVHJ1ZQorICAgICAgICAjIEFsc28gY2xlYXIgYW55IHJldmlldyBmbGFn
ICh0byByZW1vdmUgaXQgZnJvbSByZXZpZXcvY29tbWl0IHF1ZXVlcykKKyAgICAgICAgc2VsZi5i
cm93c2VyLmZpbmRfY29udHJvbCh0eXBlPSdzZWxlY3QnLCBucj0wKS52YWx1ZSA9ICgiWCIsKQor
ICAgICAgICBpZiBjb21tZW50X3RleHQ6CisgICAgICAgICAgICBsb2coY29tbWVudF90ZXh0KQor
ICAgICAgICAgICAgc2VsZi5icm93c2VyWydjb21tZW50J10gPSBjb21tZW50X3RleHQKKyAgICAg
ICAgc2VsZi5icm93c2VyLnN1Ym1pdCgpCisgICAgCisgICAgZGVmIHBvc3RfY29tbWVudF90b19i
dWcoc2VsZiwgYnVnX2lkLCBjb21tZW50X3RleHQpOgorICAgICAgICBzZWxmLmF1dGhlbnRpY2F0
ZSgpCisKKyAgICAgICAgbG9nKCJBZGRpbmcgY29tbWVudCB0byBidWcgJXMiICUgYnVnX2lkKQor
ICAgICAgICBpZiBzZWxmLmRyeXJ1bjoKKyAgICAgICAgICAgIGxvZyhjb21tZW50X3RleHQpCisg
ICAgICAgICAgICByZXR1cm4KKworICAgICAgICBzZWxmLmJyb3dzZXIub3BlbihzZWxmLmJ1Z191
cmxfZm9yX2J1Z19pZChidWdfaWQpKQorICAgICAgICBzZWxmLmJyb3dzZXIuc2VsZWN0X2Zvcm0o
bmFtZT0iY2hhbmdlZm9ybSIpCisgICAgICAgIHNlbGYuYnJvd3NlclsnY29tbWVudCddID0gY29t
bWVudF90ZXh0CisgICAgICAgIHNlbGYuYnJvd3Nlci5zdWJtaXQoKQorCisgICAgZGVmIGNsb3Nl
X2J1Z19hc19maXhlZChzZWxmLCBidWdfaWQsIGNvbW1lbnRfdGV4dD1Ob25lKToKKyAgICAgICAg
c2VsZi5hdXRoZW50aWNhdGUoKQorCisgICAgICAgIGxvZygiQ2xvc2luZyBidWcgJXMgYXMgZml4
ZWQiICUgYnVnX2lkKQorICAgICAgICBpZiBzZWxmLmRyeXJ1bjoKKyAgICAgICAgICAgIGxvZyhj
b21tZW50X3RleHQpCisgICAgICAgICAgICByZXR1cm4KKworICAgICAgICBzZWxmLmJyb3dzZXIu
b3BlbihzZWxmLmJ1Z191cmxfZm9yX2J1Z19pZChidWdfaWQpKQorICAgICAgICBzZWxmLmJyb3dz
ZXIuc2VsZWN0X2Zvcm0obmFtZT0iY2hhbmdlZm9ybSIpCisgICAgICAgIGlmIGNvbW1lbnRfdGV4
dDoKKyAgICAgICAgICAgIGxvZyhjb21tZW50X3RleHQpCisgICAgICAgICAgICBzZWxmLmJyb3dz
ZXJbJ2NvbW1lbnQnXSA9IGNvbW1lbnRfdGV4dAorICAgICAgICBzZWxmLmJyb3dzZXJbJ2tub2In
XSA9IFsncmVzb2x2ZSddCisgICAgICAgIHNlbGYuYnJvd3NlclsncmVzb2x1dGlvbiddID0gWydG
SVhFRCddCisgICAgICAgIHNlbGYuYnJvd3Nlci5zdWJtaXQoKQpkaWZmIC0tZ2l0IGEvV2ViS2l0
VG9vbHMvU2NyaXB0cy9tb2R1bGVzL3NjbS5weSBiL1dlYktpdFRvb2xzL1NjcmlwdHMvbW9kdWxl
cy9zY20ucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTJhYmYxZAotLS0g
L2Rldi9udWxsCisrKyBiL1dlYktpdFRvb2xzL1NjcmlwdHMvbW9kdWxlcy9zY20ucHkKQEAgLTAs
MCArMSwzMTkgQEAKKyMgQ29weXJpZ2h0IChjKSAyMDA5LCBHb29nbGUgSW5jLiBBbGwgcmlnaHRz
IHJlc2VydmVkLgorIyAKKyMgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJp
bmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisjIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRl
ZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKyMgbWV0OgorIyAK
KyMgICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBh
Ym92ZSBjb3B5cmlnaHQKKyMgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhl
IGZvbGxvd2luZyBkaXNjbGFpbWVyLgorIyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5
IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisjIGNvcHlyaWdodCBub3RpY2UsIHRoaXMg
bGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKyMgaW4gdGhl
IGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQor
IyBkaXN0cmlidXRpb24uCisjICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4g
bm9yIHRoZSBuYW1lcyBvZiBpdHMKKyMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9y
c2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKyMgdGhpcyBzb2Z0d2FyZSB3aXRo
b3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyMgCisjIFRISVMgU09GVFdB
UkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMK
KyMgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJ
TkcsIEJVVCBOT1QKKyMgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJD
SEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisjIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBE
SVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisjIE9XTkVSIE9SIENP
TlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFM
LAorIyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVE
SU5HLCBCVVQgTk9UCisjIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09P
RFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorIyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJ
TkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyMgVEhFT1JZIE9G
IExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9S
VAorIyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBX
QVkgT1VUIE9GIFRIRSBVU0UKKyMgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9G
IFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyMKKyMgUHl0aG9uIG1vZHVsZSBmb3Ig
aW50ZXJhY3Rpbmcgd2l0aCBhbiBTQ00gc3lzdGVtIChsaWtlIFNWTiBvciBHaXQpCisKK2ltcG9y
dCBvcworaW1wb3J0IHJlCitpbXBvcnQgc3VicHJvY2VzcworaW1wb3J0IHN5cworCitkZWYgbG9n
KHN0cmluZyk6CisgICAgcHJpbnQgPj4gc3lzLnN0ZGVyciwgc3RyaW5nCisKK2RlZiBlcnJvcihz
dHJpbmcpOgorICAgIGxvZyhzdHJpbmcpCisgICAgZXhpdCgxKQorCitkZWYgZGV0ZWN0X3NjbV9z
eXN0ZW0ocGF0aCk6CisgICAgaWYgU1ZOLmluX3dvcmtpbmdfZGlyZWN0b3J5KHBhdGgpOgorICAg
ICAgICByZXR1cm4gU1ZOKGN3ZD1wYXRoKQorICAgIAorICAgIGlmIEdpdC5pbl93b3JraW5nX2Rp
cmVjdG9yeShwYXRoKToKKyAgICAgICAgcmV0dXJuIEdpdChjd2Q9cGF0aCkKKyAgICAKKyAgICBy
ZXR1cm4gTm9uZQorCitjbGFzcyBTY3JpcHRFcnJvcihFeGNlcHRpb24pOgorICAgIHBhc3MKKwor
Y2xhc3MgU0NNOgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBjd2QsIGRyeXJ1bj1GYWxzZSk6Cisg
ICAgICAgIHNlbGYuY3dkID0gY3dkCisgICAgICAgIHNlbGYuY2hlY2tvdXRfcm9vdCA9IHNlbGYu
ZmluZF9jaGVja291dF9yb290KHNlbGYuY3dkKQorICAgICAgICBzZWxmLmRyeXJ1biA9IGRyeXJ1
bgorCisgICAgQHN0YXRpY21ldGhvZAorICAgIGRlZiBydW5fY29tbWFuZChjb21tYW5kLCBjd2Q9
Tm9uZSk6CisgICAgICAgIHJldHVybiBzdWJwcm9jZXNzLlBvcGVuKGNvbW1hbmQsIHN0ZG91dD1z
dWJwcm9jZXNzLlBJUEUsIHNoZWxsPVRydWUsIGN3ZD1jd2QpLmNvbW11bmljYXRlKClbMF0ucnN0
cmlwKCkKKworICAgIGRlZiBlbnN1cmVfY2xlYW5fd29ya2luZ19kaXJlY3Rvcnkoc2VsZiwgZm9y
Y2UpOgorICAgICAgICBpZiBub3QgZm9yY2UgYW5kIG5vdCBzZWxmLndvcmtpbmdfZGlyZWN0b3J5
X2lzX2NsZWFuKCk6CisgICAgICAgICAgICBsb2coIldvcmtpbmcgZGlyZWN0b3J5IGhhcyBtb2Rp
ZmljYXRpb25zLCBwYXNzIC0tZm9yY2UtY2xlYW4gb3IgLS1uby1jbGVhbiB0byBjb250aW51ZS4i
KQorICAgICAgICAgICAgb3Muc3lzdGVtKHNlbGYuc3RhdHVzX2NvbW1hbmQoKSkKKyAgICAgICAg
ICAgIGV4aXQoMSkKKyAgICAgICAgCisgICAgICAgIGxvZygiQ2xlYW5pbmcgdGhlIHdvcmtpbmcg
ZGlyZWN0b3J5IikKKyAgICAgICAgc2VsZi5jbGVhbl93b3JraW5nX2RpcmVjdG9yeSgpCisgICAg
CisgICAgZGVmIGVuc3VyZV9ub19sb2NhbF9jb21taXRzKHNlbGYsIGZvcmNlKToKKyAgICAgICAg
aWYgbm90IHNlbGYuc3VwcG9ydHNfbG9jYWxfY29tbWl0cygpOgorICAgICAgICAgICAgcmV0dXJu
CisgICAgICAgIGNvbW1pdHMgPSBzZWxmLmxvY2FsX2NvbW1pdHMoKQorICAgICAgICBpZiBub3Qg
bGVuKGNvbW1pdHMpOgorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIGlmIG5vdCBmb3JjZToK
KyAgICAgICAgICAgIGxvZygiV29ya2luZyBkaXJlY3RvcnkgaGFzIGxvY2FsIGNvbW1pdHMsIHBh
c3MgLS1mb3JjZS1jbGVhbiB0byBjb250aW51ZS4iKQorICAgICAgICAgICAgZXhpdCgxKQorICAg
ICAgICBzZWxmLmRpc2NhcmRfbG9jYWxfY29tbWl0cygpCisKKyAgICBkZWYgYXBwbHlfcGF0Y2go
c2VsZiwgcGF0Y2gpOgorICAgICAgICAjIEl0J3MgcG9zc2libGUgdGhhdCB0aGUgcGF0Y2ggd2Fz
IG5vdCBtYWRlIGZyb20gdGhlIHJvb3QgZGlyZWN0b3J5LgorICAgICAgICAjIFdlIHNob3VsZCBk
ZXRlY3QgYW5kIGhhbmRsZSB0aGF0IGNhc2UuCisgICAgICAgIHJldHVybl9jb2RlID0gb3Muc3lz
dGVtKCdjdXJsICVzIHwgc3ZuLWFwcGx5IC0tcmV2aWV3ZXIgIiVzIicgJSAocGF0Y2hbJ3VybCdd
LCBwYXRjaFsncmV2aWV3ZXInXSkpCisgICAgICAgIGlmIHJldHVybl9jb2RlOgorICAgICAgICAg
ICAgcmFpc2UgU2NyaXB0RXJyb3IoIlBhdGNoICIgKyBwYXRjaFsndXJsJ10gKyAiIGZhaWxlZCB0
byBkb3dubG9hZCBhbmQgYXBwbHkuIikKKworICAgIGRlZiBydW5fc3RhdHVzX2FuZF9leHRyYWN0
X2ZpbGVuYW1lcyhzZWxmLCBzdGF0dXNfY29tbWFuZCwgc3RhdHVzX3JlZ2V4cCk6CisgICAgICAg
IGZpbGVuYW1lcyA9IFtdCisgICAgICAgIGZvciBsaW5lIGluIG9zLnBvcGVuKHN0YXR1c19jb21t
YW5kKS5yZWFkbGluZXMoKToKKyAgICAgICAgICAgIG1hdGNoID0gcmUuc2VhcmNoKHN0YXR1c19y
ZWdleHAsIGxpbmUpCisgICAgICAgICAgICBpZiBub3QgbWF0Y2g6CisgICAgICAgICAgICAgICAg
Y29udGludWUKKyAgICAgICAgICAgICMgc3RhdHVzID0gbWF0Y2guZ3JvdXAoJ3N0YXR1cycpCisg
ICAgICAgICAgICBmaWxlbmFtZSA9IG1hdGNoLmdyb3VwKCdmaWxlbmFtZScpCisgICAgICAgICAg
ICBmaWxlbmFtZXMuYXBwZW5kKGZpbGVuYW1lKQorICAgICAgICByZXR1cm4gZmlsZW5hbWVzCisK
KyAgICBAc3RhdGljbWV0aG9kCisgICAgZGVmIGluX3dvcmtpbmdfZGlyZWN0b3J5KHBhdGgpOgor
ICAgICAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yLCAic3ViY2xhc3NlcyBtdXN0IGltcGxl
bWVudCIKKworICAgIEBzdGF0aWNtZXRob2QKKyAgICBkZWYgZmluZF9jaGVja291dF9yb290KHBh
dGgpOgorICAgICAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yLCAic3ViY2xhc3NlcyBtdXN0
IGltcGxlbWVudCIKKworICAgIGRlZiB3b3JraW5nX2RpcmVjdG9yeV9pc19jbGVhbihzZWxmKToK
KyAgICAgICAgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvciwgInN1YmNsYXNzZXMgbXVzdCBpbXBs
ZW1lbnQiCisKKyAgICBkZWYgY2xlYW5fd29ya2luZ19kaXJlY3Rvcnkoc2VsZik6CisgICAgICAg
IHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IsICJzdWJjbGFzc2VzIG11c3QgaW1wbGVtZW50Igor
CisgICAgZGVmIHVwZGF0ZV93ZWJraXQoc2VsZik6CisgICAgICAgIHJhaXNlIE5vdEltcGxlbWVu
dGVkRXJyb3IsICJzdWJjbGFzc2VzIG11c3QgaW1wbGVtZW50IgorCisgICAgZGVmIHN0YXR1c19j
b21tYW5kKHNlbGYpOgorICAgICAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yLCAic3ViY2xh
c3NlcyBtdXN0IGltcGxlbWVudCIKKworICAgIGRlZiBjaGFuZ2VkX2ZpbGVzKHNlbGYpOgorICAg
ICAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yLCAic3ViY2xhc3NlcyBtdXN0IGltcGxlbWVu
dCIKKworICAgIGRlZiBkaXNwbGF5X25hbWUoc2VsZik6CisgICAgICAgIHJhaXNlIE5vdEltcGxl
bWVudGVkRXJyb3IsICJzdWJjbGFzc2VzIG11c3QgaW1wbGVtZW50IgorCisgICAgZGVmIGNyZWF0
ZV9wYXRjaF9jb21tYW5kKHNlbGYpOgorICAgICAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9y
LCAic3ViY2xhc3NlcyBtdXN0IGltcGxlbWVudCIKKworICAgIGRlZiBjb21taXRfd2l0aF9tZXNz
YWdlKHNlbGYsIG1lc3NhZ2UpOgorICAgICAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yLCAi
c3ViY2xhc3NlcyBtdXN0IGltcGxlbWVudCIKKyAgICAKKyAgICAjIFN1YmNsYXNzZXMgbXVzdCBp
bmRpY2F0ZSBpZiB0aGV5IHN1cHBvcnQgbG9jYWwgY29tbWl0cworICAgICMgYnV0IHRoZSBTQ00g
YmFzZWNsYXNzIHdpbGwgb25seSBjYWxsIGxvY2FsX2NvbW1pdHMgbWV0aG9kcyB3aGVuIHRoaXMg
aXMgdHJ1ZQorICAgIGRlZiBzdXBwb3J0c19sb2NhbF9jb21taXRzKHNlbGYpOgorICAgICAgICBy
YWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yLCAic3ViY2xhc3NlcyBtdXN0IGltcGxlbWVudCIKKwor
ICAgIGRlZiBkaXNjYXJkX2xvY2FsX2NvbW1pdHMoc2VsZik6CisgICAgICAgIHBhc3MKKworICAg
IGRlZiBsb2NhbF9jb21taXRzKHNlbGYpOgorICAgICAgICByZXR1cm4gW10KKworY2xhc3MgU1ZO
KFNDTSk6CisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGN3ZCwgZHJ5cnVuPUZhbHNlKToKKyAgICAg
ICAgU0NNLl9faW5pdF9fKHNlbGYsIGN3ZCwgZHJ5cnVuKQorICAgICAgICBzZWxmLmNhY2hlZF92
ZXJzaW9uID0gTm9uZQorICAgIAorICAgIEBzdGF0aWNtZXRob2QKKyAgICBkZWYgaW5fd29ya2lu
Z19kaXJlY3RvcnkocGF0aCk6CisgICAgICAgIHJldHVybiBvcy5wYXRoLmlzZGlyKG9zLnBhdGgu
am9pbihwYXRoLCAnLnN2bicpKQorICAgIAorICAgIEBzdGF0aWNtZXRob2QKKyAgICBkZWYgZmlu
ZF9jaGVja291dF9yb290KHBhdGgpOgorICAgICAgICBsYXN0X3BhdGggPSBOb25lCisgICAgICAg
IHdoaWxlIFRydWU6CisgICAgICAgICAgICBpZiBub3QgU1ZOLmluX3dvcmtpbmdfZGlyZWN0b3J5
KHBhdGgpOgorICAgICAgICAgICAgICAgIHJldHVybiBsYXN0X3BhdGgKKyAgICAgICAgICAgIGxh
c3RfcGF0aCA9IHBhdGgKKyAgICAgICAgICAgIChwYXRoLCBsYXN0X2NvbXBvbmVudCkgPSBvcy5w
YXRoLnNwbGl0KHBhdGgpCisgICAgICAgICAgICBpZiBsYXN0X3BhdGggPT0gcGF0aDoKKyAgICAg
ICAgICAgICAgICByZXR1cm4gTm9uZQorICAgIAorICAgIGRlZiBzdm5fdmVyc2lvbihzZWxmKToK
KyAgICAgICAgaWYgbm90IHNlbGYuY2FjaGVkX3ZlcnNpb246CisgICAgICAgICAgICBzZWxmLmNh
Y2hlZF92ZXJzaW9uID0gc2VsZi5ydW5fY29tbWFuZCgic3ZuIC0tdmVyc2lvbiAtLXF1aWV0IikK
KyAgICAgICAgCisgICAgICAgIHJldHVybiBzZWxmLmNhY2hlZF92ZXJzaW9uCisKKyAgICBkZWYg
d29ya2luZ19kaXJlY3RvcnlfaXNfY2xlYW4oc2VsZik6CisgICAgICAgIGRpZmZfcHJvY2VzcyA9
IHN1YnByb2Nlc3MuUG9wZW4oInN2biBkaWZmIiwgc3Rkb3V0PXN1YnByb2Nlc3MuUElQRSwgc2hl
bGw9VHJ1ZSkKKyAgICAgICAgZGlmZl9vdXRwdXQgPSBkaWZmX3Byb2Nlc3MuY29tbXVuaWNhdGUo
KVswXQorICAgICAgICBpZiBkaWZmX3Byb2Nlc3Mud2FpdCgpOgorICAgICAgICAgICAgbG9nKCJG
YWlsZWQgdG8gcnVuIHN2biBkaWZmIikKKyAgICAgICAgICAgIHJldHVybiBGYWxzZQorICAgICAg
ICByZXR1cm4gZGlmZl9vdXRwdXQgPT0gIiIKKworICAgIGRlZiBjbGVhbl93b3JraW5nX2RpcmVj
dG9yeShzZWxmKToKKyAgICAgICAgb3Muc3lzdGVtKCJzdm4gcmVzZXQgLVIiKQorCisgICAgZGVm
IHVwZGF0ZV93ZWJraXQoc2VsZik6CisgICAgICAgIG9zLnN5c3RlbSgidXBkYXRlLXdlYmtpdCIp
CisKKyAgICBkZWYgc3RhdHVzX2NvbW1hbmQoc2VsZik6CisgICAgICAgIHJldHVybiAnc3ZuIHN0
YXR1cycKKworICAgIGRlZiBjaGFuZ2VkX2ZpbGVzKHNlbGYpOgorICAgICAgICBpZiBzZWxmLnN2
bl92ZXJzaW9uKCkgPiAiMS42IjoKKyAgICAgICAgICAgIHN0YXR1c19yZWdleHAgPSAiXig/UDxz
dGF0dXM+W0FDRE1SXSkuezZ9ICg/UDxmaWxlbmFtZT4uKykkIgorICAgICAgICBlbHNlOgorICAg
ICAgICAgICAgc3RhdHVzX3JlZ2V4cCA9ICJeKD9QPHN0YXR1cz5bQUNETVJdKS57NX0gKD9QPGZp
bGVuYW1lPi4rKSQiCisgICAgICAgIHJldHVybiBzZWxmLnJ1bl9zdGF0dXNfYW5kX2V4dHJhY3Rf
ZmlsZW5hbWVzKHNlbGYuc3RhdHVzX2NvbW1hbmQoKSwgc3RhdHVzX3JlZ2V4cCkKKworICAgIGRl
ZiBzdXBwb3J0c19sb2NhbF9jb21taXRzKHNlbGYpOgorICAgICAgICByZXR1cm4gRmFsc2UKKwor
ICAgIGRlZiBkaXNwbGF5X25hbWUoc2VsZik6CisgICAgICAgIHJldHVybiAic3ZuIgorCisgICAg
ZGVmIGNyZWF0ZV9wYXRjaF9jb21tYW5kKHNlbGYpOgorICAgICAgICByZXR1cm4gInN2bi1jcmVh
dGUtcGF0Y2giCisKKyAgICBkZWYgY29tbWl0X3dpdGhfbWVzc2FnZShzZWxmLCBtZXNzYWdlKToK
KyAgICAgICAgY29tbWl0X3Byb2Nlc3MgPSBzdWJwcm9jZXNzLlBvcGVuKCdzdm4gY29tbWl0IC1G
IC0nLCBzdGRpbj1zdWJwcm9jZXNzLlBJUEUsIHNoZWxsPVRydWUpCisgICAgICAgIGNvbW1pdF9w
cm9jZXNzLmNvbW11bmljYXRlKG1lc3NhZ2UpCisKKyMgQWxsIGdpdC1zcGVjaWZpYyBsb2dpYyBz
aG91bGQgZ28gaGVyZS4KK2NsYXNzIEdpdChTQ00pOgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBj
d2QsIGRyeXJ1bj1GYWxzZSk6CisgICAgICAgIFNDTS5fX2luaXRfXyhzZWxmLCBjd2QsIGRyeXJ1
bikKKyAgICAKKyAgICBAc3RhdGljbWV0aG9kCisgICAgZGVmIGluX3dvcmtpbmdfZGlyZWN0b3J5
KHBhdGgpOgorICAgICAgICByZXR1cm4gU0NNLnJ1bl9jb21tYW5kKCJnaXQgcmV2LXBhcnNlIC0t
aXMtaW5zaWRlLXdvcmstdHJlZSAyPiYxIiwgY3dkPXBhdGgpID09ICJ0cnVlIgorCisgICAgQHN0
YXRpY21ldGhvZAorICAgIGRlZiBmaW5kX2NoZWNrb3V0X3Jvb3QocGF0aCk6CisgICAgICAgICMg
ImdpdCByZXYtcGFyc2UgLS1zaG93LWNkdXAiIHdvdWxkIGJlIGFub3RoZXIgd2F5IHRvIGdldCB0
byB0aGUgcm9vdAorICAgICAgICAoY2hlY2tvdXRfcm9vdCwgZG90X2dpdCkgPSBvcy5wYXRoLnNw
bGl0KFNDTS5ydW5fY29tbWFuZCgiZ2l0IHJldi1wYXJzZSAtLWdpdC1kaXIiLCBjd2Q9cGF0aCkp
CisgICAgICAgICMgSWYgd2Ugd2VyZSB1c2luZyAyLjYgIyBjaGVja291dF9yb290ID0gb3MucGF0
aC5yZWxwYXRoKGNoZWNrb3V0X3Jvb3QsIHBhdGgpCisgICAgICAgIGlmIG5vdCBvcy5wYXRoLmlz
YWJzKGNoZWNrb3V0X3Jvb3QpOiAjIFNvbWV0aW1lcyBnaXQgcmV0dXJucyByZWxhdGl2ZSBwYXRo
cworICAgICAgICAgICAgY2hlY2tvdXRfcm9vdCA9IG9zLnBhdGguam9pbihwYXRoLCBjaGVja291
dF9yb290KQorICAgICAgICByZXR1cm4gY2hlY2tvdXRfcm9vdAorICAgIAorICAgIGRlZiBkaXNj
YXJkX2xvY2FsX2NvbW1pdHMoc2VsZik6CisgICAgICAgIG9zLnN5c3RlbSgiZ2l0IHJlc2V0IC0t
aGFyZCB0cnVuayIpCisgICAgCisgICAgZGVmIGxvY2FsX2NvbW1pdHMoc2VsZik6CisgICAgICAg
IHJldHVybiBzZWxmLnJ1bl9jb21tYW5kKCJnaXQgbG9nIC0tcHJldHR5PW9uZWxpbmUgaGVhZC4u
LnRydW5rIikuc3BsaXRsaW5lcygpCisgICAgCisgICAgZGVmIHdvcmtpbmdfZGlyZWN0b3J5X2lz
X2NsZWFuKHNlbGYpOgorICAgICAgICBkaWZmX3Byb2Nlc3MgPSBzdWJwcm9jZXNzLlBvcGVuKCJn
aXQgZGlmZi1pbmRleCBoZWFkIiwgc3Rkb3V0PXN1YnByb2Nlc3MuUElQRSwgc2hlbGw9VHJ1ZSkK
KyAgICAgICAgZGlmZl9vdXRwdXQgPSBkaWZmX3Byb2Nlc3MuY29tbXVuaWNhdGUoKVswXQorICAg
ICAgICBpZiBkaWZmX3Byb2Nlc3Mud2FpdCgpOgorICAgICAgICAgICAgbG9nKCJGYWlsZWQgdG8g
cnVuIGdpdCBkaWZmLWluZGV4IGhlYWQiKQorICAgICAgICAgICAgcmV0dXJuIEZhbHNlCisgICAg
ICAgIHJldHVybiBkaWZmX291dHB1dCA9PSAiIgorICAgIAorICAgIGRlZiBjbGVhbl93b3JraW5n
X2RpcmVjdG9yeShzZWxmKToKKyAgICAgICAgb3Muc3lzdGVtKCJnaXQgcmVzZXQgLS1oYXJkIGhl
YWQiKQorICAgICAgICAjIENvdWxkIHJ1biBnaXQgY2xlYW4gaGVyZSB0b28sIGJ1dCB0aGF0IHdv
dWxkbid0IG1hdGNoIHdvcmtpbmdfZGlyZWN0b3J5X2lzX2NsZWFuCisgICAgCisgICAgZGVmIHVw
ZGF0ZV93ZWJraXQoc2VsZik6CisgICAgICAgICMgRklYTUU6IFNob3VsZCBwcm9iYWJseSBjYWxs
IHVwZGF0ZS13ZWJraXQsIG5vPworICAgICAgICBsb2coIlVwZGF0aW5nIHdvcmtpbmcgZGlyZWN0
b3J5IikKKyAgICAgICAgb3Muc3lzdGVtKCJnaXQgc3ZuIHJlYmFzZSIpCisKKyAgICBkZWYgc3Rh
dHVzX2NvbW1hbmQoc2VsZik6CisgICAgICAgIHJldHVybiAnZ2l0IHN0YXR1cycKKworICAgIGRl
ZiBjaGFuZ2VkX2ZpbGVzKHNlbGYpOgorICAgICAgICBzdGF0dXNfY29tbWFuZCA9ICdnaXQgZGlm
ZiAtciAtLW5hbWUtc3RhdHVzIC1DIC1NJworICAgICAgICBzdGF0dXNfcmVnZXhwID0gJ14oP1A8
c3RhdHVzPltBRE1dKVx0KD9QPGZpbGVuYW1lPi4rKSQnCisgICAgICAgIHJldHVybiBzZWxmLnJ1
bl9zdGF0dXNfYW5kX2V4dHJhY3RfZmlsZW5hbWVzKHN0YXR1c19jb21tYW5kLCBzdGF0dXNfcmVn
ZXhwKQorICAgIAorICAgIGRlZiBzdXBwb3J0c19sb2NhbF9jb21taXRzKHNlbGYpOgorICAgICAg
ICByZXR1cm4gVHJ1ZQorCisgICAgZGVmIGRpc3BsYXlfbmFtZShzZWxmKToKKyAgICAgICAgcmV0
dXJuICJnaXQiCisKKyAgICBkZWYgY3JlYXRlX3BhdGNoX2NvbW1hbmQoc2VsZik6CisgICAgICAg
IHJldHVybiAiZ2l0IGRpZmYgaGVhZCIKKworICAgIGRlZiBjb21taXRfd2l0aF9tZXNzYWdlKHNl
bGYsIG1lc3NhZ2UpOgorICAgICAgICBzZWxmLmNvbW1pdF9sb2NhbGx5X3dpdGhfbWVzc2FnZSht
ZXNzYWdlKQorICAgICAgICBzZWxmLnB1c2hfbG9jYWxfY29tbWl0c190b19zZXJ2ZXIoKQorCisg
ICAgIyBHaXQtc3BlY2lmaWMgbWV0aG9kczoKKyAgICAKKyAgICBkZWYgY29tbWl0X2xvY2FsbHlf
d2l0aF9tZXNzYWdlKHNlbGYsIG1lc3NhZ2UpOgorICAgICAgICBjb21taXRfcHJvY2VzcyA9IHN1
YnByb2Nlc3MuUG9wZW4oJ2dpdCBjb21taXQgLWEgLUYgLScsIHN0ZGluPXN1YnByb2Nlc3MuUElQ
RSwgc2hlbGw9VHJ1ZSkKKyAgICAgICAgY29tbWl0X3Byb2Nlc3MuY29tbXVuaWNhdGUobWVzc2Fn
ZSkKKyAgICAgICAgCisgICAgZGVmIHB1c2hfbG9jYWxfY29tbWl0c190b19zZXJ2ZXIoc2VsZik6
CisgICAgICAgIGlmIHNlbGYuZHJ5cnVuOgorICAgICAgICAgICAgcmV0dXJuICJEcnkgcnVuLCBu
byByZW1vdGUgY29tbWl0LiIKKyAgICAgICAgY29tbWl0X3Byb2Nlc3MgPSBzdWJwcm9jZXNzLlBv
cGVuKCdnaXQgc3ZuIGRjb21taXQnLCBzdGRvdXQ9c3VicHJvY2Vzcy5QSVBFLCBzaGVsbD1UcnVl
KQorICAgICAgICAob3V0LCBlcnJvcikgPSBjb21taXRfcHJvY2Vzcy5jb21tdW5pY2F0ZSgpCisg
ICAgICAgIHJldHVybl9jb2RlID0gY29tbWl0X3Byb2Nlc3Mud2FpdCgpCisgICAgICAgIGxvZygi
Q29tbWl0IGZhaWx1cmU6ICIgKyByZXR1cm5fY29kZSkgIyBXZSByZWFsbHkgc2hvdWxkIGhhbmRs
ZSB0aGUgZmFpbHVyZQorICAgICAgICByZXR1cm4gb3V0CisKKyAgICBkZWYgY29tbWl0X2lkc19m
cm9tX3JhbmdlX2FyZ3VtZW50cyhzZWxmLCBhcmdzLCBjaGVycnlfcGljaz1GYWxzZSk6CisgICAg
ICAgICMgRmlyc3QgZ2V0IHRoZSBjb21taXQtaWRzIGZvciB0aGUgcGFzc2VkIGluIHJldmlzaW9u
cy4KKyAgICAgICAgcmV2X3BhcnNlX2FyZ3MgPSBbJ2dpdCcsICdyZXYtcGFyc2UnLCAnLS1yZXZz
LW9ubHknXSArIGFyZ3MKKyAgICAgICAgcmV2aXNpb25zID0gc2VsZi5ydW5fY29tbWFuZCgiICIu
am9pbihyZXZfcGFyc2VfYXJncykpLnNwbGl0bGluZXMoKQorICAgICAgICAKKyAgICAgICAgaWYg
Y2hlcnJ5X3BpY2s6CisgICAgICAgICAgICByZXR1cm4gcmV2aXNpb25zCisgICAgICAgIAorICAg
ICAgICAjIElmIHdlJ3JlIG5vdCBjaGVycnkgcGlja2luZyBhbmQgd2VyZSBvbmx5IHBhc3NlZCBv
bmUgcmV2aXNpb24sIGFzc3VtZSAiXnJldmlzaW9uIGhlYWQiIGFrYSAicmV2aXNpb24uLmhlYWQi
LgorICAgICAgICBpZiBsZW4ocmV2aXNpb25zKSA8IDI6CisgICAgICAgICAgICByZXZpc2lvbnNb
MF0gPSAiXiIgKyByZXZpc2lvbnNbMF0KKyAgICAgICAgICAgIHJldmlzaW9ucy5hcHBlbmQoImhl
YWQiKQorICAgICAgICAKKyAgICAgICAgcmV2X2xpc3RfYXJncyA9IFsnZ2l0JywgJ3Jldi1saXN0
J10gKyByZXZpc2lvbnMKKyAgICAgICAgcmV0dXJuIHNlbGYucnVuX2NvbW1hbmQoIiAiLmpvaW4o
cmV2X2xpc3RfYXJncykpLnNwbGl0bGluZXMoKQorCisgICAgZGVmIGNvbW1pdF9tZXNzYWdlX2Zv
cl9jb21taXQoc2VsZiwgY29tbWl0X2lkKToKKyAgICAgICAgY29tbWl0X21lc3NhZ2VfcHJvY2Vz
cyA9IHN1YnByb2Nlc3MuUG9wZW4oImdpdCBjYXQtZmlsZSBjb21taXQgIiArIGNvbW1pdF9pZCwg
c3Rkb3V0PXN1YnByb2Nlc3MuUElQRSwgc2hlbGw9VHJ1ZSkKKyAgICAgICAgY29tbWl0X21lc3Nh
Z2UgPSBjb21taXRfbWVzc2FnZV9wcm9jZXNzLmNvbW11bmljYXRlKClbMF0KKyAgICAgICAgY29t
bWl0X2xpbmVzID0gY29tbWl0X21lc3NhZ2Uuc3BsaXRsaW5lcygpCisKKyAgICAgICAgIyBTa2lw
IHRoZSBnaXQgaGVhZGVycy4KKyAgICAgICAgZmlyc3RfbGluZV9hZnRlcl9oZWFkZXJzID0gMAor
ICAgICAgICBmb3IgbGluZSBpbiBjb21taXRfbGluZXM6CisgICAgICAgICAgICBmaXJzdF9saW5l
X2FmdGVyX2hlYWRlcnMgKz0gMQorICAgICAgICAgICAgaWYgbGluZSA9PSAiIjoKKyAgICAgICAg
ICAgICAgICBicmVhaworICAgICAgICByZXR1cm4gIlxuIi5qb2luKGNvbW1pdF9saW5lc1tmaXJz
dF9saW5lX2FmdGVyX2hlYWRlcnM6XSkKKworICAgIGRlZiBzaG93X2RpZmZfY29tbWFuZF9mb3Jf
Y29tbWl0KHNlbGYsIGNvbW1pdF9pZCk6CisgICAgICAgIHJldHVybiAiZ2l0IGRpZmYtdHJlZSAt
cCAiICsgY29tbWl0X2lkCisKKyAgICBkZWYgZmlsZXNfY2hhbmdlZF9zdW1tYXJ5X2Zvcl9jb21t
aXQoc2VsZiwgY29tbWl0X2lkKToKKyAgICAgICAgcmV0dXJuIHN1YnByb2Nlc3MuUG9wZW4oImdp
dCBkaWZmLXRyZWUgLS1zaG9ydHN0YXQgLS1uby1jb21taXQtaWQgIiArIGNvbW1pdF9pZCwgc3Rk
b3V0PXN1YnByb2Nlc3MuUElQRSwgc2hlbGw9VHJ1ZSkuY29tbXVuaWNhdGUoKVswXQo=
</data>
<flag name="review"
          id="16297"
          type_id="1"
          status="+"
          setter="levin"
    />
          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>31710</attachid>
            <date>2009-06-23 01:44:32 -0700</date>
            <delta_ts>2009-06-23 01:45:38 -0700</delta_ts>
            <desc>patch</desc>
            <filename>bugzilla_requires_a_filename.patch</filename>
            <type>text/plain</type>
            <size>1120</size>
            <attacher name="Eric Seidel (no email)">eric</attacher>
            
              <data encoding="base64">ZGlmZiAtLWdpdCBhL1dlYktpdFRvb2xzL0NoYW5nZUxvZyBiL1dlYktpdFRvb2xzL0NoYW5nZUxv
ZwppbmRleCBhOWFjMjVjLi5jMzkzZWNkIDEwMDY0NAotLS0gYS9XZWJLaXRUb29scy9DaGFuZ2VM
b2cKKysrIGIvV2ViS2l0VG9vbHMvQ2hhbmdlTG9nCkBAIC0xLDMgKzEsOSBAQAorMjAwOS0wNi0y
MyAgRXJpYyBTZWlkZWwgIDxlcmljQHdlYmtpdC5vcmc+CisKKyAgICAgICAgUmV2aWV3ZWQgYnkg
TWFyayBSb3dlLgorCisgICAgICAgICogU2NyaXB0cy9tb2R1bGVzL3NjbS5weTogRml4IGVycm9y
IHNlZW4gd2hlbiBjb21taXRpbmcgcjQ0OTc5LgorCiAyMDA5LTA2LTE4ICBFcmljIFNlaWRlbCAg
PGVyaWNAd2Via2l0Lm9yZz4KIAogICAgICAgICBSZXZpZXdlZCBieSBEYXZlIExldmluLgpkaWZm
IC0tZ2l0IGEvV2ViS2l0VG9vbHMvU2NyaXB0cy9tb2R1bGVzL3NjbS5weSBiL1dlYktpdFRvb2xz
L1NjcmlwdHMvbW9kdWxlcy9zY20ucHkKaW5kZXggNzZlNzEzOC4uODljYzJjZiAxMDA2NDQKLS0t
IGEvV2ViS2l0VG9vbHMvU2NyaXB0cy9tb2R1bGVzL3NjbS5weQorKysgYi9XZWJLaXRUb29scy9T
Y3JpcHRzL21vZHVsZXMvc2NtLnB5CkBAIC0yODAsNyArMjgwLDggQEAgY2xhc3MgR2l0KFNDTSk6
CiAgICAgICAgIGNvbW1pdF9wcm9jZXNzID0gc3VicHJvY2Vzcy5Qb3BlbignZ2l0IHN2biBkY29t
bWl0Jywgc3Rkb3V0PXN1YnByb2Nlc3MuUElQRSwgc2hlbGw9VHJ1ZSkKICAgICAgICAgKG91dCwg
ZXJyb3IpID0gY29tbWl0X3Byb2Nlc3MuY29tbXVuaWNhdGUoKQogICAgICAgICByZXR1cm5fY29k
ZSA9IGNvbW1pdF9wcm9jZXNzLndhaXQoKQotICAgICAgICBsb2coIkNvbW1pdCBmYWlsdXJlOiAi
ICsgcmV0dXJuX2NvZGUpICMgV2UgcmVhbGx5IHNob3VsZCBoYW5kbGUgdGhlIGZhaWx1cmUKKyAg
ICAgICAgaWYgcmV0dXJuX2NvZGU6CisgICAgICAgICAgICBsb2coIkNvbW1pdCBmYWlsdXJlOiAl
ZCIgJSByZXR1cm5fY29kZSkgIyBXZSByZWFsbHkgc2hvdWxkIGhhbmRsZSB0aGUgZmFpbHVyZQog
ICAgICAgICByZXR1cm4gb3V0CiAKICAgICBkZWYgY29tbWl0X2lkc19mcm9tX3JhbmdlX2FyZ3Vt
ZW50cyhzZWxmLCBhcmdzLCBjaGVycnlfcGljaz1GYWxzZSk6Cg==
</data>
<flag name="review"
          id="16308"
          type_id="1"
          status="+"
          setter="mrowe"
    />
          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>31712</attachid>
            <date>2009-06-23 01:52:57 -0700</date>
            <delta_ts>2009-06-23 01:57:56 -0700</delta_ts>
            <desc>patch</desc>
            <filename>bugzilla_requires_a_filename.patch</filename>
            <type>text/plain</type>
            <size>1639</size>
            <attacher name="Eric Seidel (no email)">eric</attacher>
            
              <data encoding="base64">ZGlmZiAtLWdpdCBhL1dlYktpdFRvb2xzL0NoYW5nZUxvZyBiL1dlYktpdFRvb2xzL0NoYW5nZUxv
ZwppbmRleCBjMzkzZWNkLi40ZDc1N2RjIDEwMDY0NAotLS0gYS9XZWJLaXRUb29scy9DaGFuZ2VM
b2cKKysrIGIvV2ViS2l0VG9vbHMvQ2hhbmdlTG9nCkBAIC0xLDUgKzEsMTEgQEAKIDIwMDktMDYt
MjMgIEVyaWMgU2VpZGVsICA8ZXJpY0B3ZWJraXQub3JnPgogCisgICAgICAgIFJldmlld2VkIGJ5
IE5PQk9EWSAoT09QUyEpLgorCisgICAgICAgICogU2NyaXB0cy9tb2R1bGVzL3NjbS5weTogRml4
IGNvbW1pdF93aXRoX21lc3NhZ2UgdG8gcmV0dXJuIHRoZSBjb21taXQgb3V0cHV0LgorCisyMDA5
LTA2LTIzICBFcmljIFNlaWRlbCAgPGVyaWNAd2Via2l0Lm9yZz4KKwogICAgICAgICBSZXZpZXdl
ZCBieSBNYXJrIFJvd2UuCiAKICAgICAgICAgKiBTY3JpcHRzL21vZHVsZXMvc2NtLnB5OiBGaXgg
ZXJyb3Igc2VlbiB3aGVuIGNvbW1pdGluZyByNDQ5NzkuCmRpZmYgLS1naXQgYS9XZWJLaXRUb29s
cy9TY3JpcHRzL21vZHVsZXMvc2NtLnB5IGIvV2ViS2l0VG9vbHMvU2NyaXB0cy9tb2R1bGVzL3Nj
bS5weQppbmRleCA4OWNjMmNmLi41MWE1NjA5IDEwMDY0NAotLS0gYS9XZWJLaXRUb29scy9TY3Jp
cHRzL21vZHVsZXMvc2NtLnB5CisrKyBiL1dlYktpdFRvb2xzL1NjcmlwdHMvbW9kdWxlcy9zY20u
cHkKQEAgLTIwMyw4ICsyMDMsMTIgQEAgY2xhc3MgU1ZOKFNDTSk6CiAgICAgICAgIHJldHVybiAi
c3ZuLWNyZWF0ZS1wYXRjaCIKIAogICAgIGRlZiBjb21taXRfd2l0aF9tZXNzYWdlKHNlbGYsIG1l
c3NhZ2UpOgotICAgICAgICBjb21taXRfcHJvY2VzcyA9IHN1YnByb2Nlc3MuUG9wZW4oJ3N2biBj
b21taXQgLUYgLScsIHN0ZGluPXN1YnByb2Nlc3MuUElQRSwgc2hlbGw9VHJ1ZSkKLSAgICAgICAg
Y29tbWl0X3Byb2Nlc3MuY29tbXVuaWNhdGUobWVzc2FnZSkKKyAgICAgICAgY29tbWl0X3Byb2Nl
c3MgPSBzdWJwcm9jZXNzLlBvcGVuKCdzdm4gY29tbWl0IC1GIC0nLCBzdGRpbj1zdWJwcm9jZXNz
LlBJUEUsIHN0ZG91dD1zdWJwcm9jZXNzLlBJUEUsIHNoZWxsPVRydWUpCisgICAgICAgIChvdXQs
IGVycm9yKSA9IGNvbW1pdF9wcm9jZXNzLmNvbW11bmljYXRlKG1lc3NhZ2UpCisgICAgICAgIHJl
dHVybl9jb2RlID0gY29tbWl0X3Byb2Nlc3Mud2FpdCgpCisgICAgICAgIGlmIHJldHVybl9jb2Rl
OgorICAgICAgICAgICAgbG9nKCJDb21taXQgZmFpbHVyZTogJWQiICUgcmV0dXJuX2NvZGUpICMg
V2UgcmVhbGx5IHNob3VsZCBoYW5kbGUgdGhlIGZhaWx1cmUKKyAgICAgICAgcmV0dXJuIG91dAog
CiAjIEFsbCBnaXQtc3BlY2lmaWMgbG9naWMgc2hvdWxkIGdvIGhlcmUuCiBjbGFzcyBHaXQoU0NN
KToKQEAgLTI2Niw3ICsyNzAsNyBAQCBjbGFzcyBHaXQoU0NNKToKIAogICAgIGRlZiBjb21taXRf
d2l0aF9tZXNzYWdlKHNlbGYsIG1lc3NhZ2UpOgogICAgICAgICBzZWxmLmNvbW1pdF9sb2NhbGx5
X3dpdGhfbWVzc2FnZShtZXNzYWdlKQotICAgICAgICBzZWxmLnB1c2hfbG9jYWxfY29tbWl0c190
b19zZXJ2ZXIoKQorICAgICAgICByZXR1cm4gc2VsZi5wdXNoX2xvY2FsX2NvbW1pdHNfdG9fc2Vy
dmVyKCkKIAogICAgICMgR2l0LXNwZWNpZmljIG1ldGhvZHM6CiAgICAgCg==
</data>
<flag name="review"
          id="16310"
          type_id="1"
          status="+"
          setter="mrowe"
    />
          </attachment>
      

    </bug>

</bugzilla>