<?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>92913</bug_id>
          
          <creation_ts>2012-08-01 15:12:35 -0700</creation_ts>
          <short_desc>Add Perf EWS IRC bot</short_desc>
          <delta_ts>2012-08-08 17:19:29 -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>DOM</component>
          <version>528+ (Nightly build)</version>
          <rep_platform>Unspecified</rep_platform>
          <op_sys>Unspecified</op_sys>
          <bug_status>RESOLVED</bug_status>
          <resolution>FIXED</resolution>
          
          
          <bug_file_loc></bug_file_loc>
          <status_whiteboard></status_whiteboard>
          <keywords></keywords>
          <priority>P2</priority>
          <bug_severity>Normal</bug_severity>
          <target_milestone>---</target_milestone>
          <dependson>92912</dependson>
    
    <dependson>93042</dependson>
    
    <dependson>93296</dependson>
          <blocked>77037</blocked>
          <everconfirmed>1</everconfirmed>
          <reporter name="Ryosuke Niwa">rniwa</reporter>
          <assigned_to name="Ryosuke Niwa">rniwa</assigned_to>
          <cc>abarth</cc>
    
    <cc>dbates</cc>
    
    <cc>dpranke</cc>
    
    <cc>eric</cc>
    
    <cc>haraken</cc>
    
    <cc>morrita</cc>
    
    <cc>ojan</cc>
    
    <cc>webkit.review.bot</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>684631</commentid>
    <comment_count>0</comment_count>
    <who name="Ryosuke Niwa">rniwa</who>
    <bug_when>2012-08-01 15:12:35 -0700</bug_when>
    <thetext>Per Adam&apos;s suggestion, I&apos;m going to add an experimental perf EWS IRC bot before integrating it into Bugzilla.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>684819</commentid>
    <comment_count>1</comment_count>
      <attachid>155934</attachid>
    <who name="Ryosuke Niwa">rniwa</who>
    <bug_when>2012-08-01 17:43:34 -0700</bug_when>
    <thetext>Created attachment 155934
work in progress</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>684820</commentid>
    <comment_count>2</comment_count>
      <attachid>155935</attachid>
    <who name="Ryosuke Niwa">rniwa</who>
    <bug_when>2012-08-01 17:44:38 -0700</bug_when>
    <thetext>Created attachment 155935
Added the forgotten perfalizer.py</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>688740</commentid>
    <comment_count>3</comment_count>
      <attachid>156847</attachid>
    <who name="Ryosuke Niwa">rniwa</who>
    <bug_when>2012-08-06 20:21:13 -0700</bug_when>
    <thetext>Created attachment 156847
work in progress 3</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>689720</commentid>
    <comment_count>4</comment_count>
      <attachid>157075</attachid>
    <who name="Ryosuke Niwa">rniwa</who>
    <bug_when>2012-08-07 18:26:08 -0700</bug_when>
    <thetext>Created attachment 157075
work in progress 4</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>689739</commentid>
    <comment_count>5</comment_count>
      <attachid>157081</attachid>
    <who name="Ryosuke Niwa">rniwa</who>
    <bug_when>2012-08-07 18:47:58 -0700</bug_when>
    <thetext>Created attachment 157081
work in progress 5</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>689765</commentid>
    <comment_count>6</comment_count>
      <attachid>157087</attachid>
    <who name="Ryosuke Niwa">rniwa</who>
    <bug_when>2012-08-07 19:25:20 -0700</bug_when>
    <thetext>Created attachment 157087
Adds the initial implementation of perfalizer</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>689766</commentid>
    <comment_count>7</comment_count>
    <who name="Ryosuke Niwa">rniwa</who>
    <bug_when>2012-08-07 19:25:55 -0700</bug_when>
    <thetext>Unfortunately, there isn&apos;t much we can test here because it uses a lot of methods that themselves cannot be tested.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>689867</commentid>
    <comment_count>8</comment_count>
      <attachid>157087</attachid>
    <who name="Dirk Pranke">dpranke</who>
    <bug_when>2012-08-07 21:56:13 -0700</bug_when>
    <thetext>Comment on attachment 157087
Adds the initial implementation of perfalizer

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

Disclaimer: I don&apos;t really know the IRCbot code at all, so some of these questions might be a bit off-base.

Also, I&apos;d want to give a bit more thought to if/how we can test this. I understand the comment about this being untestable, but python&apos;s static checking is pretty weak. We might want to consider at least putting in something that runs lint-webkitpy over this to catch more errors.

&gt; Tools/Scripts/webkitpy/common/system/filesystem.py:80
&gt; +

You should probably add a routine to filesystem_mock as well ...

&gt; Tools/Scripts/webkitpy/tool/commands/perfalizer.py:49
&gt; +    def _copy_build_product_without_patch(self, postfix):

&apos;postfix&apos; isn&apos;t a great name here; at the least it should probably be &quot;suffix&quot;, but even better would be something like &quot;directory_suffix&quot; or &quot;build_dir_suffix&quot;

&gt; Tools/Scripts/webkitpy/tool/commands/perfalizer.py:52
&gt; +        self._build_path = filesystem.dirname(self._port._build_path())

It&apos;s a bit confusing that self._build_path != self._port._build_path() ; maybe pick a different name for the former? This is especially true since you end up adding the configuration dirs back on down below.

&gt; Tools/Scripts/webkitpy/tool/commands/perfalizer.py:58
&gt; +                filesystem.join(self._build_path_without_patch, configuration))

I wonder if something like rsync -a --delete would be much of a win here over rm + cp. I suppose it depends on how often you&apos;ll be building ...

&gt; Tools/Scripts/webkitpy/tool/commands/perfalizer.py:64
&gt; +        if not self._patch.committer() and not self._patch.attacher().can_commit:

Should we have a comment here about why we need a committer here?

&gt; Tools/Scripts/webkitpy/tool/commands/perfalizer.py:135
&gt; +        self.run_webkit_patch(command)

are this and the functions below used anywhere and/or needed? They seem unrelated and possibly just copy&amp;paste from a different command?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>689872</commentid>
    <comment_count>9</comment_count>
      <attachid>157087</attachid>
    <who name="Ryosuke Niwa">rniwa</who>
    <bug_when>2012-08-07 22:04:52 -0700</bug_when>
    <thetext>Comment on attachment 157087
Adds the initial implementation of perfalizer

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

&gt;&gt; Tools/Scripts/webkitpy/common/system/filesystem.py:80
&gt;&gt; +
&gt; 
&gt; You should probably add a routine to filesystem_mock as well ...

Possibly but filesystem_mock doesn&apos;t seem to have methods not used in tests so we can probably wait &apos;til we need one in tests.

&gt;&gt; Tools/Scripts/webkitpy/tool/commands/perfalizer.py:52
&gt;&gt; +        self._build_path = filesystem.dirname(self._port._build_path())
&gt; 
&gt; It&apos;s a bit confusing that self._build_path != self._port._build_path() ; maybe pick a different name for the former? This is especially true since you end up adding the configuration dirs back on down below.

Oh oops, yeah, I should have named it self._build_directory.

&gt;&gt; Tools/Scripts/webkitpy/tool/commands/perfalizer.py:58
&gt;&gt; +                filesystem.join(self._build_path_without_patch, configuration))
&gt; 
&gt; I wonder if something like rsync -a --delete would be much of a win here over rm + cp. I suppose it depends on how often you&apos;ll be building ...

Maybe but copytree is so much slower that the time spent in rmtree doesn&apos;t really matter.

&gt;&gt; Tools/Scripts/webkitpy/tool/commands/perfalizer.py:64
&gt;&gt; +        if not self._patch.committer() and not self._patch.attacher().can_commit:
&gt; 
&gt; Should we have a comment here about why we need a committer here?

What kind of comment are we going to add?

&gt;&gt; Tools/Scripts/webkitpy/tool/commands/perfalizer.py:135
&gt;&gt; +        self.run_webkit_patch(command)
&gt; 
&gt; are this and the functions below used anywhere and/or needed? They seem unrelated and possibly just copy&amp;paste from a different command?

Yes. Otherwise PatchAnalysisTask is going to blow up.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>689910</commentid>
    <comment_count>10</comment_count>
    <who name="Dirk Pranke">dpranke</who>
    <bug_when>2012-08-07 22:39:05 -0700</bug_when>
    <thetext>(In reply to comment #9)
&gt; (From update of attachment 157087 [details])
&gt; View in context: https://bugs.webkit.org/attachment.cgi?id=157087&amp;action=review
&gt; 
&gt; &gt;&gt; Tools/Scripts/webkitpy/common/system/filesystem.py:80
&gt; &gt;&gt; +
&gt; &gt; 
&gt; &gt; You should probably add a routine to filesystem_mock as well ...
&gt; 
&gt; Possibly but filesystem_mock doesn&apos;t seem to have methods not used in tests so we can probably wait &apos;til we need one in tests.
&gt; 

Sure.

&gt; &gt;&gt; Tools/Scripts/webkitpy/tool/commands/perfalizer.py:64
&gt; &gt;&gt; +        if not self._patch.committer() and not self._patch.attacher().can_commit:
&gt; &gt; 
&gt; &gt; Should we have a comment here about why we need a committer here?
&gt; 
&gt; What kind of comment are we going to add?
&gt;

Why do you need to be a committer (or does the patch need to be uploaded by a committer)? It&apos;s not obvious ...</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>689923</commentid>
    <comment_count>11</comment_count>
      <attachid>157087</attachid>
    <who name="Ryosuke Niwa">rniwa</who>
    <bug_when>2012-08-07 22:46:57 -0700</bug_when>
    <thetext>Comment on attachment 157087
Adds the initial implementation of perfalizer

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

&gt;&gt;&gt;&gt; Tools/Scripts/webkitpy/tool/commands/perfalizer.py:64
&gt;&gt;&gt;&gt; +        if not self._patch.committer() and not self._patch.attacher().can_commit:
&gt;&gt;&gt; 
&gt;&gt;&gt; Should we have a comment here about why we need a committer here?
&gt;&gt; 
&gt;&gt; What kind of comment are we going to add?
&gt; 
&gt; Why do you need to be a committer (or does the patch need to be uploaded by a committer)? It&apos;s not obvious ...

Oh, that&apos;s merely because I don&apos;t trust those patches to be ran on my Mac mini at the moment.
I&apos;m not sure if adding a comment like &quot;rniwa doesn&apos;t trust patches submitted by non-committers&quot; is any more helpful than the code itself given that nobody else is going to run this thing
(surely, we can&apos;t have two IRC bots named perfalizer).</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>690765</commentid>
    <comment_count>12</comment_count>
    <who name="Dirk Pranke">dpranke</who>
    <bug_when>2012-08-08 14:45:29 -0700</bug_when>
    <thetext>(In reply to comment #11)
&gt; (From update of attachment 157087 [details])
&gt; View in context: https://bugs.webkit.org/attachment.cgi?id=157087&amp;action=review
&gt; 
&gt; &gt;&gt;&gt;&gt; Tools/Scripts/webkitpy/tool/commands/perfalizer.py:64
&gt; &gt;&gt;&gt;&gt; +        if not self._patch.committer() and not self._patch.attacher().can_commit:
&gt; &gt;&gt;&gt; 
&gt; &gt;&gt;&gt; Should we have a comment here about why we need a committer here?
&gt; &gt;&gt; 
&gt; &gt;&gt; What kind of comment are we going to add?
&gt; &gt; 
&gt; &gt; Why do you need to be a committer (or does the patch need to be uploaded by a committer)? It&apos;s not obvious ...
&gt; 
&gt; Oh, that&apos;s merely because I don&apos;t trust those patches to be ran on my Mac mini at the moment.
&gt; I&apos;m not sure if adding a comment like &quot;rniwa doesn&apos;t trust patches submitted by non-committers&quot; is any more helpful than the code itself given that nobody else is going to run this thing
&gt; (surely, we can&apos;t have two IRC bots named perfalizer).

I see, I thought this was some sort of security thing (I think we have this check on the other EWS bots, for example).

At any rate, as far as testing goes, can you put in some tests that at least stub out the executive enough to make sure the code executes *at all* (i.e., getting covered, even if we&apos;re not testing correctness)?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>690931</commentid>
    <comment_count>13</comment_count>
      <attachid>157334</attachid>
    <who name="Ryosuke Niwa">rniwa</who>
    <bug_when>2012-08-08 16:53:32 -0700</bug_when>
    <thetext>Created attachment 157334
Added some tests per Dirk&apos;s comment</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>690938</commentid>
    <comment_count>14</comment_count>
      <attachid>157334</attachid>
    <who name="Dirk Pranke">dpranke</who>
    <bug_when>2012-08-08 16:55:22 -0700</bug_when>
    <thetext>Comment on attachment 157334
Added some tests per Dirk&apos;s comment

thanks! coverage makes me happier ...</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>690989</commentid>
    <comment_count>15</comment_count>
    <who name="Ryosuke Niwa">rniwa</who>
    <bug_when>2012-08-08 17:19:29 -0700</bug_when>
    <thetext>Committed r125123: &lt;http://trac.webkit.org/changeset/125123&gt;</thetext>
  </long_desc>
      
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>155934</attachid>
            <date>2012-08-01 17:43:34 -0700</date>
            <delta_ts>2012-08-01 17:44:38 -0700</delta_ts>
            <desc>work in progress</desc>
            <filename>wip92913</filename>
            <type>text/plain</type>
            <size>660</size>
            <attacher name="Ryosuke Niwa">rniwa</attacher>
            
              <data encoding="base64">SW5kZXg6IFRvb2xzL1NjcmlwdHMvd2Via2l0cHkvdG9vbC9jb21tYW5kcy9fX2luaXRfXy5weQo9
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09Ci0tLSBUb29scy9TY3JpcHRzL3dlYmtpdHB5L3Rvb2wvY29tbWFuZHMvX19pbml0
X18ucHkJKHJldmlzaW9uIDEyNDMzOCkKKysrIFRvb2xzL1NjcmlwdHMvd2Via2l0cHkvdG9vbC9j
b21tYW5kcy9fX2luaXRfXy5weQkod29ya2luZyBjb3B5KQpAQCAtMTIsNiArMTIsNyBAQAogZnJv
bSB3ZWJraXRweS50b29sLmNvbW1hbmRzLmZpbmR1c2VycyBpbXBvcnQgRmluZFVzZXJzCiBmcm9t
IHdlYmtpdHB5LnRvb2wuY29tbWFuZHMuZ2FyZGVub21hdGljIGltcG9ydCBHYXJkZW5PTWF0aWMK
IGZyb20gd2Via2l0cHkudG9vbC5jb21tYW5kcy5vcGVuYnVncyBpbXBvcnQgT3BlbkJ1Z3MKK2Zy
b20gd2Via2l0cHkudG9vbC5jb21tYW5kcy5wZXJmYWxpemVyIGltcG9ydCBQZXJmYWxpemVyCiBm
cm9tIHdlYmtpdHB5LnRvb2wuY29tbWFuZHMucHJldHR5ZGlmZiBpbXBvcnQgUHJldHR5RGlmZgog
ZnJvbSB3ZWJraXRweS50b29sLmNvbW1hbmRzLnF1ZXJpZXMgaW1wb3J0ICoKIGZyb20gd2Via2l0
cHkudG9vbC5jb21tYW5kcy5xdWV1ZXMgaW1wb3J0ICoK
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>155935</attachid>
            <date>2012-08-01 17:44:38 -0700</date>
            <delta_ts>2012-08-06 20:21:13 -0700</delta_ts>
            <desc>Added the forgotten perfalizer.py</desc>
            <filename>wip92913b</filename>
            <type>text/plain</type>
            <size>6961</size>
            <attacher name="Ryosuke Niwa">rniwa</attacher>
            
              <data encoding="base64">SW5kZXg6IFRvb2xzL1NjcmlwdHMvd2Via2l0cHkvdG9vbC9jb21tYW5kcy9fX2luaXRfXy5weQo9
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09Ci0tLSBUb29scy9TY3JpcHRzL3dlYmtpdHB5L3Rvb2wvY29tbWFuZHMvX19pbml0
X18ucHkJKHJldmlzaW9uIDEyNDMzOCkKKysrIFRvb2xzL1NjcmlwdHMvd2Via2l0cHkvdG9vbC9j
b21tYW5kcy9fX2luaXRfXy5weQkod29ya2luZyBjb3B5KQpAQCAtMTIsNiArMTIsNyBAQAogZnJv
bSB3ZWJraXRweS50b29sLmNvbW1hbmRzLmZpbmR1c2VycyBpbXBvcnQgRmluZFVzZXJzCiBmcm9t
IHdlYmtpdHB5LnRvb2wuY29tbWFuZHMuZ2FyZGVub21hdGljIGltcG9ydCBHYXJkZW5PTWF0aWMK
IGZyb20gd2Via2l0cHkudG9vbC5jb21tYW5kcy5vcGVuYnVncyBpbXBvcnQgT3BlbkJ1Z3MKK2Zy
b20gd2Via2l0cHkudG9vbC5jb21tYW5kcy5wZXJmYWxpemVyIGltcG9ydCBQZXJmYWxpemVyCiBm
cm9tIHdlYmtpdHB5LnRvb2wuY29tbWFuZHMucHJldHR5ZGlmZiBpbXBvcnQgUHJldHR5RGlmZgog
ZnJvbSB3ZWJraXRweS50b29sLmNvbW1hbmRzLnF1ZXJpZXMgaW1wb3J0ICoKIGZyb20gd2Via2l0
cHkudG9vbC5jb21tYW5kcy5xdWV1ZXMgaW1wb3J0ICoKSW5kZXg6IFRvb2xzL1NjcmlwdHMvd2Vi
a2l0cHkvdG9vbC9jb21tYW5kcy9wZXJmYWxpemVyLnB5Cj09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFRvb2xzL1Nj
cmlwdHMvd2Via2l0cHkvdG9vbC9jb21tYW5kcy9wZXJmYWxpemVyLnB5CShyZXZpc2lvbiAwKQor
KysgVG9vbHMvU2NyaXB0cy93ZWJraXRweS90b29sL2NvbW1hbmRzL3BlcmZhbGl6ZXIucHkJKHJl
dmlzaW9uIDApCkBAIC0wLDAgKzEsMTYyIEBACisjIENvcHlyaWdodCAoYykgMjAxMiBHb29nbGUg
SW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorIworIyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGlu
IHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyMgbW9kaWZpY2F0aW9u
LCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFy
ZQorIyBtZXQ6CisjIAorIyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVz
dCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorIyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25k
aXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisjICAgICAqIFJlZGlzdHJpYnV0
aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyMgY29weXJpZ2h0
IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xh
aW1lcgorIyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3Zp
ZGVkIHdpdGggdGhlCisjIGRpc3RyaWJ1dGlvbi4KKyMgICAgICogTmVpdGhlciB0aGUgbmFtZSBv
ZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworIyBjb250cmlidXRvcnMgbWF5IGJl
IHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorIyB0aGlz
IHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorIyAK
KyMgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5E
IENPTlRSSUJVVE9SUworIyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJB
TlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorIyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJS
QU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyMgQSBQQVJUSUNVTEFS
IFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQK
KyMgT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJF
Q1QsIElOQ0lERU5UQUwsCisjIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBE
QU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKyMgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0Yg
U1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisjIERBVEEsIE9SIFBS
T0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFO
WQorIyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElB
QklMSVRZLCBPUiBUT1JUCisjIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFS
SVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorIyBPRiBUSElTIFNPRlRXQVJFLCBFVkVO
IElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCitmcm9tIHdl
YmtpdHB5LmNvbW1vbi5zeXN0ZW0uZGVwcmVjYXRlZF9sb2dnaW5nIGltcG9ydCBsb2cKK2Zyb20g
d2Via2l0cHkudG9vbC5ib3QuZXhwZWN0ZWRmYWlsdXJlcyBpbXBvcnQgRXhwZWN0ZWRGYWlsdXJl
cworZnJvbSB3ZWJraXRweS50b29sLmJvdC5pcmNfY29tbWFuZCBpbXBvcnQgSVJDQ29tbWFuZAor
ZnJvbSB3ZWJraXRweS50b29sLmJvdC5pcmNfY29tbWFuZCBpbXBvcnQgSGVscAorZnJvbSB3ZWJr
aXRweS50b29sLmJvdC5pcmNfY29tbWFuZCBpbXBvcnQgSGkKK2Zyb20gd2Via2l0cHkudG9vbC5i
b3QuaXJjX2NvbW1hbmQgaW1wb3J0IFJlc3RhcnQKK2Zyb20gd2Via2l0cHkudG9vbC5ib3QuaXJj
Ym90IGltcG9ydCBJUkNCb3QKK2Zyb20gd2Via2l0cHkudG9vbC5ib3QucGF0Y2hhbmFseXNpc3Rh
c2sgaW1wb3J0IFBhdGNoQW5hbHlzaXNUYXNrLCBQYXRjaEFuYWx5c2lzVGFza0RlbGVnYXRlLCBV
bmFibGVUb0FwcGx5UGF0Y2gKK2Zyb20gd2Via2l0cHkudG9vbC5ib3Quc2hlcmlmZiBpbXBvcnQg
U2hlcmlmZgorZnJvbSB3ZWJraXRweS50b29sLmNvbW1hbmRzLnF1ZXVlcyBpbXBvcnQgQWJzdHJh
Y3RRdWV1ZQorZnJvbSB3ZWJraXRweS50b29sLmNvbW1hbmRzLnN0ZXBzZXF1ZW5jZSBpbXBvcnQg
U3RlcFNlcXVlbmNlRXJyb3JIYW5kbGVyCisKK2NsYXNzIFBlcmZhbGl6ZXJUYXNrKFBhdGNoQW5h
bHlzaXNUYXNrKToKKyAgICBkZWYgX19pbml0X18oc2VsZiwgdG9vbCwgcGF0Y2gpOgorICAgICAg
ICBQYXRjaEFuYWx5c2lzVGFzay5fX2luaXRfXyhzZWxmLCBzZWxmLCBwYXRjaCkKKyAgICAgICAg
c2VsZi5fcG9ydCA9IHRvb2wucG9ydCgpCisgICAgICAgIHNlbGYuX3Rvb2wgPSB0b29sCisKKyAg
ICBkZWYgdmFsaWRhdGUoc2VsZik6CisgICAgICAgIHNlbGYuX3BhdGNoID0gc2VsZi5fZGVsZWdh
dGUucmVmZXRjaF9wYXRjaChzZWxmLl9wYXRjaCkKKyAgICAgICAgaWYgc2VsZi5fcGF0Y2guaXNf
b2Jzb2xldGUoKToKKyAgICAgICAgICAgIHJldHVybiBGYWxzZQorICAgICAgICBpZiBzZWxmLl9w
YXRjaC5idWcoKS5pc19jbG9zZWQoKToKKyAgICAgICAgICAgIHJldHVybiBGYWxzZQorICAgICAg
ICBpZiBzZWxmLl9wYXRjaC5yZXZpZXcoKSA9PSAiLSI6CisgICAgICAgICAgICByZXR1cm4gRmFs
c2UKKyAgICAgICAgcmV0dXJuIFRydWUKKworICAgIGRlZiBydW4oc2VsZik6CisgICAgICAgIGly
YyA9IHNlbGYuX3Rvb2wuaXJjKCkKKyAgICAgICAgaXJjLnBvc3QoJ1ZhbGlkYXRpbmcuLi4nKQor
ICAgICAgICBpZiBub3Qgc2VsZi52YWxpZGF0ZSgpOgorICAgICAgICAgICAgcmV0dXJuIEZhbHNl
CisgICAgICAgIGlmIG5vdCBzZWxmLl9jbGVhbigpOgorICAgICAgICAgICAgcmV0dXJuIEZhbHNl
CisgICAgICAgIGlyYy5wb3N0KCdVcGRhdGluZy4uLicpCisgICAgICAgIGlmIG5vdCBzZWxmLl91
cGRhdGUoKToKKyAgICAgICAgICAgIGlyYy5wb3N0KCdDb3VsZCBub3QgdXBkYXRlIScpCisgICAg
ICAgICAgICByZXR1cm4gRmFsc2UKKyAgICAgICAgaXJjLnBvc3QoJ0FwcGx5aW5nIHRoZSBwYXRj
aC4uLicpCisgICAgICAgIGlmIG5vdCBzZWxmLl9hcHBseSgpOgorICAgICAgICAgICAgaXJjLnBv
c3QoJ0NvdWxkIG5vdCBhcHBseSB0aGUgcGF0Y2ghJykKKyAgICAgICAgICAgIHJldHVybiBGYWxz
ZQorICAgICAgICBpcmMucG9zdCgnQnVpbGRpbmcgdGhlIHBhdGNoLi4uJykKKyAgICAgICAgaWYg
bm90IHNlbGYuX2J1aWxkKCk6CisgICAgICAgICAgICByZXR1cm4gRmFsc2UKKyAgICAgICAgaXJj
LnBvc3QoIkJ1aWx0IS4gU29ycnksIEkgZG9uJ3Qga25vdyBob3cgdG8gcnVuIHBlcmYgdGVzdHMg
eWV0IDooLiBCbGFtZSBybml3YS4iKQorICAgICAgICByZXR1cm4gVHJ1ZQorCisgICAgZGVmIHBh
cmVudF9jb21tYW5kKHNlbGYpOgorICAgICAgICByZXR1cm4gInBlcmZhbGl6ZXIiCisKKyAgICBk
ZWYgcnVuX3dlYmtpdF9wYXRjaChzZWxmLCBhcmdzKToKKyAgICAgICAgd2Via2l0X3BhdGNoX2Fy
Z3MgPSBbJy9Wb2x1bWVzL0RhdGEvd2Via2l0Mi9Ub29scy9TY3JpcHRzL3dlYmtpdC1wYXRjaCdd
I1tzZWxmLl90b29sLnBhdGgoKV0KKyAgICAgICAgd2Via2l0X3BhdGNoX2FyZ3MuZXh0ZW5kKGFy
Z3MpCisgICAgICAgIHJldHVybiBzZWxmLl90b29sLmV4ZWN1dGl2ZS5ydW5fYW5kX3Rocm93X2lm
X2ZhaWwod2Via2l0X3BhdGNoX2FyZ3MsIGN3ZD1zZWxmLl90b29sLnNjbSgpLmNoZWNrb3V0X3Jv
b3QpCisKKyAgICBkZWYgcnVuX2NvbW1hbmQoc2VsZiwgY29tbWFuZCk6CisgICAgICAgIHNlbGYu
cnVuX3dlYmtpdF9wYXRjaChjb21tYW5kKQorCisgICAgZGVmIGNvbW1hbmRfcGFzc2VkKHNlbGYs
IG1lc3NhZ2UsIHBhdGNoKToKKyAgICAgICAgcGFzcworCisgICAgZGVmIGNvbW1hbmRfZmFpbGVk
KHNlbGYsIG1lc3NhZ2UsIHNjcmlwdF9lcnJvciwgcGF0Y2gpOgorICAgICAgICBwYXNzCisKKyAg
ICBkZWYgcmVmZXRjaF9wYXRjaChzZWxmLCBwYXRjaCk6CisgICAgICAgIHJldHVybiBzZWxmLl90
b29sLmJ1Z3MuZmV0Y2hfYXR0YWNobWVudChwYXRjaC5pZCgpKQorCisgICAgZGVmIGV4cGVjdGVk
X2ZhaWx1cmVzKHNlbGYpOgorICAgICAgICByZXR1cm4gRXhwZWN0ZWRGYWlsdXJlcygpCisKKyAg
ICBkZWYgYnVpbGRfc3R5bGUoc2VsZik6CisgICAgICAgIHJldHVybiAicmVsZWFzZSIKKworY2xh
c3MgUGVyZlRlc3QoSVJDQ29tbWFuZCk6CisgICAgZGVmIGV4ZWN1dGUoc2VsZiwgbmljaywgYXJn
cywgdG9vbCwgc2hlcmlmZik6CisgICAgICAgIGlmIG5vdCBhcmdzOgorICAgICAgICAgICAgdG9v
bC5pcmMoKS5wb3N0KCJQbGVhc2Ugc3BlY2lmeSBhbiBhdHRhY2htZW50L3BhdGNoIGlkIikKKyAg
ICAgICAgICAgIHJldHVybgorCisgICAgICAgIHBhdGNoX2lkID0gYXJnc1swXQorICAgICAgICBw
YXRjaCA9IHRvb2wuYnVncy5mZXRjaF9hdHRhY2htZW50KHBhdGNoX2lkKQorICAgICAgICBpZiBu
b3QgcGF0Y2g6CisgICAgICAgICAgICB0b29sLnBvc3QoIkNvdWxkIG5vdCBmZXRjaCB0aGUgcGF0
Y2giKQorICAgICAgICAgICAgcmV0dXJuCisKKyAgICAgICAgdGFzayA9IFBlcmZhbGl6ZXJUYXNr
KHRvb2wsIHBhdGNoKQorICAgICAgICB0YXNrLnJ1bigpCisKK2NsYXNzIFBlcmZhbGl6ZXIoQWJz
dHJhY3RRdWV1ZSwgU3RlcFNlcXVlbmNlRXJyb3JIYW5kbGVyKToKKyAgICBuYW1lID0gInBlcmZh
bGl6ZXIiCisgICAgd2F0Y2hlcnMgPSBBYnN0cmFjdFF1ZXVlLndhdGNoZXJzICsgWworICAgICAg
ICAicm5pd2FAd2Via2l0Lm9yZyIKKyAgICBdCisKKyAgICBfY29tbWFuZHMgPSB7CisgICAgICAg
ICJoZWxwIjogSGVscCwKKyAgICAgICAgImhpIjogSGksCisgICAgICAgICJyZXN0YXJ0IjogUmVz
dGFydCwKKyAgICAgICAgInRlc3QiIDogUGVyZlRlc3QsIAorICAgIH0KKworICAgICMgQWJzdHJh
Y3RRdWV1ZSBtZXRob2RzCisKKyAgICBkZWYgYmVnaW5fd29ya19xdWV1ZShzZWxmKToKKyAgICAg
ICAgQWJzdHJhY3RRdWV1ZS5iZWdpbl93b3JrX3F1ZXVlKHNlbGYpCisgICAgICAgIHNlbGYuX3No
ZXJpZmYgPSBTaGVyaWZmKHNlbGYuX3Rvb2wsIHNlbGYpCisgICAgICAgIHNlbGYuX2lyY19ib3Qg
PSBJUkNCb3QoInBlcmZhbGl6ZXIiLCBzZWxmLl90b29sLCBzZWxmLl9zaGVyaWZmLCBzZWxmLl9j
b21tYW5kcykKKyAgICAgICAgc2VsZi5fdG9vbC5lbnN1cmVfaXJjX2Nvbm5lY3RlZChzZWxmLl9p
cmNfYm90LmlyY19kZWxlZ2F0ZSgpKQorCisgICAgZGVmIHdvcmtfaXRlbV9sb2dfcGF0aChzZWxm
LCBmYWlsdXJlX21hcCk6CisgICAgICAgIHJldHVybiBOb25lCisKKyAgICBkZWYgX2lzX29sZF9m
YWlsdXJlKHNlbGYsIHJldmlzaW9uKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX3Rvb2wuc3RhdHVz
X3NlcnZlci5zdm5fcmV2aXNpb24ocmV2aXNpb24pCisKKyAgICBkZWYgbmV4dF93b3JrX2l0ZW0o
c2VsZik6CisgICAgICAgIHNlbGYuX2lyY19ib3QucHJvY2Vzc19wZW5kaW5nX21lc3NhZ2VzKCkK
KyAgICAgICAgcmV0dXJuCisKKyAgICBkZWYgcHJvY2Vzc193b3JrX2l0ZW0oc2VsZiwgZmFpbHVy
ZV9tYXApOgorICAgICAgICByZXR1cm4gVHJ1ZQorCisgICAgZGVmIGhhbmRsZV91bmV4cGVjdGVk
X2Vycm9yKHNlbGYsIGZhaWx1cmVfbWFwLCBtZXNzYWdlKToKKyAgICAgICAgbG9nKG1lc3NhZ2Up
CisKKyAgICAjIFN0ZXBTZXF1ZW5jZUVycm9ySGFuZGxlciBtZXRob2RzCisKKyAgICBAY2xhc3Nt
ZXRob2QKKyAgICBkZWYgaGFuZGxlX3NjcmlwdF9lcnJvcihjbHMsIHRvb2wsIHN0YXRlLCBzY3Jp
cHRfZXJyb3IpOgorICAgICAgICAjIElkZWFsbHkgd2Ugd291bGQgcG9zdCBzb21lIGluZm9ybWF0
aW9uIHRvIElSQyBhYm91dCB3aGF0IHdlbnQgd3JvbmcKKyAgICAgICAgIyBoZXJlLCBidXQgd2Ug
ZG9uJ3QgaGF2ZSB0aGUgSVJDIHBhc3N3b3JkIGluIHRoZSBjaGlsZCBwcm9jZXNzLgorICAgICAg
ICBwYXNzCg==
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>156847</attachid>
            <date>2012-08-06 20:21:13 -0700</date>
            <delta_ts>2012-08-07 18:26:08 -0700</delta_ts>
            <desc>work in progress 3</desc>
            <filename>wip92913c</filename>
            <type>text/plain</type>
            <size>11976</size>
            <attacher name="Ryosuke Niwa">rniwa</attacher>
            
              <data encoding="base64">SW5kZXg6IFBlcmZvcm1hbmNlVGVzdHMvQ2hhbmdlTG9nCj09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFBlcmZvcm1h
bmNlVGVzdHMvQ2hhbmdlTG9nCShyZXZpc2lvbiAxMjQ4MDIpCisrKyBQZXJmb3JtYW5jZVRlc3Rz
L0NoYW5nZUxvZwkod29ya2luZyBjb3B5KQpAQCAtMSw1ICsxLDE4IEBACiAyMDEyLTA4LTA2ICBS
eW9zdWtlIE5pd2EgIDxybml3YUB3ZWJraXQub3JnPgogCisgICAgICAgIFVzZSBwZXJmb3JtYW5j
ZS53ZWJraXROb3cgaW4gUGVyZlRlc3RSdW5uZXIKKyAgICAgICAgaHR0cHM6Ly9idWdzLndlYmtp
dC5vcmcvc2hvd19idWcuY2dpP2lkPTkyODI2CisKKyAgICAgICAgUmV2aWV3ZWQgYnkgTk9CT0RZ
IChPT1BTISkuCisKKyAgICAgICAgVXNlIHBlcmZvcm1hbmNlLndlYmtpdE5vdyB3aXRoIERhdGUu
bm93IGFzIGEgZmFsbGJhY2sgZm9yIG1vcmUgYWN1cmF0ZSB0aW1lIG1lYXN1cmVtZW50cy4KKwor
ICAgICAgICAqIHJlc291cmNlcy9ydW5uZXIuanM6CisgICAgICAgIChQZXJmVGVzdFJ1bm5lci5f
cnVubmVyKToKKyAgICAgICAgKFBlcmZUZXN0UnVubmVyLl9wZXJTZWNvbmRSdW5uZXJJdGVyYXRv
cik6CisKKzIwMTItMDgtMDYgIFJ5b3N1a2UgTml3YSAgPHJuaXdhQHdlYmtpdC5vcmc+CisKICAg
ICAgICAgcnVuLXdlYmtpdC10ZXN0cyBzaG91bGQgaGF2ZSBhYmlsaXR5IHRvIGFkZCBkZXNjcmlw
dGlvbiB0byBpdHMgSlNPTiBvdXRwdXQKICAgICAgICAgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcv
c2hvd19idWcuY2dpP2lkPTkzMjk2CiAKSW5kZXg6IFBlcmZvcm1hbmNlVGVzdHMvcmVzb3VyY2Vz
L3J1bm5lci5qcwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09Ci0tLSBQZXJmb3JtYW5jZVRlc3RzL3Jlc291cmNlcy9ydW5u
ZXIuanMJKHJldmlzaW9uIDEyNDgwMikKKysrIFBlcmZvcm1hbmNlVGVzdHMvcmVzb3VyY2VzL3J1
bm5lci5qcwkod29ya2luZyBjb3B5KQpAQCAtMjMsNiArMjMsOCBAQAogICAgIHJldHVybiAocmFu
ZG9tU2VlZCAmIDB4ZmZmZmZmZikgLyAweDEwMDAwMDAwOwogfTsKIAorUGVyZlRlc3RSdW5uZXIu
bm93ID0gd2luZG93LnBlcmZvcm1hbmNlICYmIHdpbmRvdy5wZXJmb3JtYW5jZS53ZWJraXROb3cg
PyB3aW5kb3cucGVyZm9ybWFuY2Uud2Via2l0Tm93IDogRGF0ZS5ub3c7CisKIFBlcmZUZXN0UnVu
bmVyLmxvZyA9IGZ1bmN0aW9uICh0ZXh0KSB7CiAgICAgaWYgKHRoaXMuX2xvZ0xpbmVzKSB7CiAg
ICAgICAgIHRoaXMuX2xvZ0xpbmVzLnB1c2godGV4dCk7CkBAIC0xMzcsNyArMTM5LDcgQEAKIH0K
IAogUGVyZlRlc3RSdW5uZXIuX3J1bm5lciA9IGZ1bmN0aW9uICgpIHsKLSAgICB2YXIgc3RhcnQg
PSBEYXRlLm5vdygpOworICAgIHZhciBzdGFydCA9IHRoaXMubm93KCk7CiAgICAgdmFyIHRvdGFs
VGltZSA9IDA7CiAKICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuX2xvb3BzUGVyUnVuOyAr
K2kpIHsKQEAgLTE1MCw3ICsxNTIsNyBAQAogICAgIH0KIAogICAgIC8vIEFzc3VtZSB0b3RhbFRp
bWUgY2FuIG5ldmVyIGJlIHplcm8gd2hlbiBfcnVuRnVuY3Rpb24gcmV0dXJucyBhIG51bWJlci4K
LSAgICB2YXIgdGltZSA9IHRvdGFsVGltZSA/IHRvdGFsVGltZSA6IERhdGUubm93KCkgLSBzdGFy
dDsKKyAgICB2YXIgdGltZSA9IHRvdGFsVGltZSA/IHRvdGFsVGltZSA6IHRoaXMubm93KCkgLSBz
dGFydDsKIAogICAgIHRoaXMuaWdub3JlV2FybVVwQW5kTG9nKHRpbWUpOwogICAgIHRoaXMuX3J1
bkxvb3AoKTsKQEAgLTIyMSwxMCArMjIzLDEwIEBACiB9CiAKIFBlcmZUZXN0UnVubmVyLl9wZXJT
ZWNvbmRSdW5uZXJJdGVyYXRvciA9IGZ1bmN0aW9uIChjYWxsc1Blckl0ZXJhdGlvbikgewotICAg
IHZhciBzdGFydFRpbWUgPSBEYXRlLm5vdygpOworICAgIHZhciBzdGFydFRpbWUgPSB0aGlzLm5v
dygpOwogICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY2FsbHNQZXJJdGVyYXRpb247IGkrKykKICAg
ICAgICAgdGhpcy5fdGVzdC5ydW4oKTsKLSAgICByZXR1cm4gRGF0ZS5ub3coKSAtIHN0YXJ0VGlt
ZTsKKyAgICByZXR1cm4gdGhpcy5ub3coKSAtIHN0YXJ0VGltZTsKIH0KIAogaWYgKHdpbmRvdy50
ZXN0UnVubmVyKSB7CkluZGV4OiBUb29scy9TY3JpcHRzL3dlYmtpdHB5L2NvbW1vbi9zeXN0ZW0v
ZmlsZXN5c3RlbS5weQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBUb29scy9TY3JpcHRzL3dlYmtpdHB5L2NvbW1v
bi9zeXN0ZW0vZmlsZXN5c3RlbS5weQkocmV2aXNpb24gMTI0ODAyKQorKysgVG9vbHMvU2NyaXB0
cy93ZWJraXRweS9jb21tb24vc3lzdGVtL2ZpbGVzeXN0ZW0ucHkJKHdvcmtpbmcgY29weSkKQEAg
LTc1LDYgKzc1LDkgQEAKICAgICBkZWYgY29weWZpbGUoc2VsZiwgc291cmNlLCBkZXN0aW5hdGlv
bik6CiAgICAgICAgIHNodXRpbC5jb3B5ZmlsZShzb3VyY2UsIGRlc3RpbmF0aW9uKQogCisgICAg
ZGVmIGNvcHl0cmVlKHNlbGYsIHNvdXJjZSwgZGVzdGluYXRpb24pOgorICAgICAgICBzaHV0aWwu
Y29weXRyZWUoc291cmNlLCBkZXN0aW5hdGlvbikKKwogICAgIGRlZiBkaXJuYW1lKHNlbGYsIHBh
dGgpOgogICAgICAgICByZXR1cm4gb3MucGF0aC5kaXJuYW1lKHBhdGgpCiAKSW5kZXg6IFRvb2xz
L1NjcmlwdHMvd2Via2l0cHkvY29tbW9uL2NvbmZpZy9pcmMucHkKPT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gVG9v
bHMvU2NyaXB0cy93ZWJraXRweS9jb21tb24vY29uZmlnL2lyYy5weQkocmV2aXNpb24gMTI0ODAy
KQorKysgVG9vbHMvU2NyaXB0cy93ZWJraXRweS9jb21tb24vY29uZmlnL2lyYy5weQkod29ya2lu
ZyBjb3B5KQpAQCAtMjgsNCArMjgsNCBAQAogCiBzZXJ2ZXI9ImlyYy5mcmVlbm9kZS5uZXQiCiBw
b3J0PTY2NjcKLWNoYW5uZWw9IiN3ZWJraXQiCitjaGFubmVsPSIjd2Via2l0LXRlc3QiCkluZGV4
OiBUb29scy9TY3JpcHRzL3dlYmtpdHB5L3Rvb2wvY29tbWFuZHMvX19pbml0X18ucHkKPT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PQotLS0gVG9vbHMvU2NyaXB0cy93ZWJraXRweS90b29sL2NvbW1hbmRzL19faW5pdF9fLnB5
CShyZXZpc2lvbiAxMjQ4MDIpCisrKyBUb29scy9TY3JpcHRzL3dlYmtpdHB5L3Rvb2wvY29tbWFu
ZHMvX19pbml0X18ucHkJKHdvcmtpbmcgY29weSkKQEAgLTEyLDYgKzEyLDcgQEAKIGZyb20gd2Vi
a2l0cHkudG9vbC5jb21tYW5kcy5maW5kdXNlcnMgaW1wb3J0IEZpbmRVc2VycwogZnJvbSB3ZWJr
aXRweS50b29sLmNvbW1hbmRzLmdhcmRlbm9tYXRpYyBpbXBvcnQgR2FyZGVuT01hdGljCiBmcm9t
IHdlYmtpdHB5LnRvb2wuY29tbWFuZHMub3BlbmJ1Z3MgaW1wb3J0IE9wZW5CdWdzCitmcm9tIHdl
YmtpdHB5LnRvb2wuY29tbWFuZHMucGVyZmFsaXplciBpbXBvcnQgUGVyZmFsaXplcgogZnJvbSB3
ZWJraXRweS50b29sLmNvbW1hbmRzLnByZXR0eWRpZmYgaW1wb3J0IFByZXR0eURpZmYKIGZyb20g
d2Via2l0cHkudG9vbC5jb21tYW5kcy5xdWVyaWVzIGltcG9ydCAqCiBmcm9tIHdlYmtpdHB5LnRv
b2wuY29tbWFuZHMucXVldWVzIGltcG9ydCAqCkluZGV4OiBUb29scy9TY3JpcHRzL3dlYmtpdHB5
L3Rvb2wvY29tbWFuZHMvcGVyZmFsaXplci5weQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBUb29scy9TY3JpcHRz
L3dlYmtpdHB5L3Rvb2wvY29tbWFuZHMvcGVyZmFsaXplci5weQkocmV2aXNpb24gMCkKKysrIFRv
b2xzL1NjcmlwdHMvd2Via2l0cHkvdG9vbC9jb21tYW5kcy9wZXJmYWxpemVyLnB5CShyZXZpc2lv
biAwKQpAQCAtMCwwICsxLDE4NCBAQAorIyBDb3B5cmlnaHQgKGMpIDIwMTIgR29vZ2xlIEluYy4g
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
RFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworZnJvbSB3ZWJraXRw
eS5jb21tb24uc3lzdGVtLmRlcHJlY2F0ZWRfbG9nZ2luZyBpbXBvcnQgbG9nCitmcm9tIHdlYmtp
dHB5LnRvb2wuYm90LmV4cGVjdGVkZmFpbHVyZXMgaW1wb3J0IEV4cGVjdGVkRmFpbHVyZXMKK2Zy
b20gd2Via2l0cHkudG9vbC5ib3QuaXJjX2NvbW1hbmQgaW1wb3J0IElSQ0NvbW1hbmQKK2Zyb20g
d2Via2l0cHkudG9vbC5ib3QuaXJjX2NvbW1hbmQgaW1wb3J0IEhlbHAKK2Zyb20gd2Via2l0cHku
dG9vbC5ib3QuaXJjX2NvbW1hbmQgaW1wb3J0IEhpCitmcm9tIHdlYmtpdHB5LnRvb2wuYm90Lmly
Y19jb21tYW5kIGltcG9ydCBSZXN0YXJ0Citmcm9tIHdlYmtpdHB5LnRvb2wuYm90LmlyY2JvdCBp
bXBvcnQgSVJDQm90Citmcm9tIHdlYmtpdHB5LnRvb2wuYm90LnBhdGNoYW5hbHlzaXN0YXNrIGlt
cG9ydCBQYXRjaEFuYWx5c2lzVGFzaywgUGF0Y2hBbmFseXNpc1Rhc2tEZWxlZ2F0ZSwgVW5hYmxl
VG9BcHBseVBhdGNoCitmcm9tIHdlYmtpdHB5LnRvb2wuYm90LnNoZXJpZmYgaW1wb3J0IFNoZXJp
ZmYKK2Zyb20gd2Via2l0cHkudG9vbC5jb21tYW5kcy5xdWV1ZXMgaW1wb3J0IEFic3RyYWN0UXVl
dWUKK2Zyb20gd2Via2l0cHkudG9vbC5jb21tYW5kcy5zdGVwc2VxdWVuY2UgaW1wb3J0IFN0ZXBT
ZXF1ZW5jZUVycm9ySGFuZGxlcgorCitjbGFzcyBQZXJmYWxpemVyVGFzayhQYXRjaEFuYWx5c2lz
VGFzayk6CisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHRvb2wsIHBhdGNoLCBsb2dnZXIpOgorICAg
ICAgICBQYXRjaEFuYWx5c2lzVGFzay5fX2luaXRfXyhzZWxmLCBzZWxmLCBwYXRjaCkKKyAgICAg
ICAgc2VsZi5fcG9ydCA9IHRvb2wucG9ydF9mYWN0b3J5LmdldCgpCisgICAgICAgIHNlbGYuX3Rv
b2wgPSB0b29sCisgICAgICAgIHNlbGYuX2xvZ2dlciA9IGxvZ2dlcgorCisgICAgZGVmIHJ1bihz
ZWxmKToKKyAgICAgICAgc2VsZi5fbG9nZ2VyKCdQcmVwYXJpbmcgdG8gcnVuIHBlcmZvcm1hbmNl
IHRlc3RzIGZvciB0aGUgYXR0YWNobWVudCAlZC4uLicgJSBzZWxmLl9wYXRjaC5pZCgpKQorIyAg
ICAgICAgaWYgbm90IHNlbGYuX2NsZWFuKCkgb3Igbm90IHNlbGYuX3VwZGF0ZSgpOgorIyAgICAg
ICAgICAgIHJldHVybiBGYWxzZQorCisgICAgICAgIGhlYWRfcmV2aXNpb24gPSBzZWxmLl90b29s
LnNjbSgpLmhlYWRfc3ZuX3JldmlzaW9uKCkKKworICAgICAgICBzZWxmLl9sb2dnZXIoJ0J1aWxk
aW5nIFdlYktpdCBhdCByJXMgd2l0aG91dCB0aGUgcGF0Y2gnICUgaGVhZF9yZXZpc2lvbikKKyAg
ICAgICAgaWYgbm90IHNlbGYuX2J1aWxkKCk6CisgICAgICAgICAgICByZXR1cm4gRmFsc2UKKwor
ICAgICAgICBpZiBub3Qgc2VsZi5fcG9ydC5jaGVja19idWlsZChuZWVkc19odHRwPUZhbHNlKToK
KyAgICAgICAgICAgIHNlbGYuX2xvZ2dlcignRmFpbGVkIHRvIGJ1aWxkIER1bXBSZW5kZXJUcmVl
LicpCisgICAgICAgICAgICByZXR1cm4gRmFsc2UKKworICAgICAgICBmaWxlc3lzdGVtID0gc2Vs
Zi5fdG9vbC5maWxlc3lzdGVtCisgICAgICAgIGNvbmZpZ3VyYXRpb24gPSBmaWxlc3lzdGVtLmJh
c2VuYW1lKHNlbGYuX3BvcnQuX2J1aWxkX3BhdGgoKSkKKyAgICAgICAgYnVpbGRfcGF0aCA9IGZp
bGVzeXN0ZW0uZGlybmFtZShzZWxmLl9wb3J0Ll9idWlsZF9wYXRoKCkpCisgICAgICAgIGJ1aWxk
X3BhdGhfd2l0aG91dF9wYXRjaCA9IGJ1aWxkX3BhdGggKyAnLXInICsgaGVhZF9yZXZpc2lvbgor
IyAgICAgICAgdHJ5OgorICAgICAgICBmaWxlc3lzdGVtLnJtdHJlZShidWlsZF9wYXRoX3dpdGhv
dXRfcGF0Y2gpCisgICAgICAgIGZpbGVzeXN0ZW0uY29weXRyZWUoZmlsZXN5c3RlbS5qb2luKGJ1
aWxkX3BhdGgsIGNvbmZpZ3VyYXRpb24pLCBmaWxlc3lzdGVtLmpvaW4oYnVpbGRfcGF0aF93aXRo
b3V0X3BhdGNoLCBjb25maWd1cmF0aW9uKSkKKyMgICAgICAgIGV4Y2VwdDoKKyMgICAgICAgICAg
ICBzZWxmLl9sb2dnZXIoJ0ZhaWxlZCB0byBtb3ZlIHRoZSBidWlsZCBwcm9kdWN0IGZyb20gJXMg
dG8gJXMuJyAlIChidWlsZF9wYXRoLCBidWlsZF9wYXRoX3dpdGhvdXRfcGF0Y2gpKQorIyAgICAg
ICAgICAgIHJldHVybiBGYWxzZQorCisgICAgICAgIHNlbGYuX2xvZ2dlcignQnVpbGRpbmcgV2Vi
S2l0IGF0IHIlcyB3aXRoIHRoZSBwYXRjaCcgJSBoZWFkX3JldmlzaW9uKQorICAgICAgICBpZiBu
b3Qgc2VsZi5fYXBwbHkoKSBvciBub3Qgc2VsZi5fYnVpbGQoKToKKyAgICAgICAgICAgIHJldHVy
biBGYWxzZQorCisgICAgICAgIGlmIG5vdCBzZWxmLl9wb3J0LmNoZWNrX2J1aWxkKG5lZWRzX2h0
dHA9RmFsc2UpOgorICAgICAgICAgICAgc2VsZi5fbG9nZ2VyKCdGYWlsZWQgdG8gYnVpbGQgRHVt
cFJlbmRlclRyZWUuJykKKyAgICAgICAgICAgIHJldHVybiBGYWxzZQorCisgICAgICAgIHNlbGYu
X2xvZ2dlcigiUnVubmluZyBwZXJmb3JtYW5jZSB0ZXN0cy4uLiIpCisgICAgICAgIGlmIHNlbGYu
X3J1bl9wZXJmX3Rlc3QoYnVpbGRfcGF0aF93aXRob3V0X3BhdGNoKSA8IDA6CisgICAgICAgICAg
ICBzZWxmLl9sb2dnZXIoJ0ZhaWxlZCB0byBydW4gcGVyZm9ybWFuY2UgdGVzdHMgd2l0aG91dCB0
aGUgcGF0Y2guJykKKyAgICAgICAgICAgIHJldHVybiBGYWxzZQorCisgICAgICAgIGlmIHNlbGYu
X3J1bl9wZXJmX3Rlc3QoYnVpbGRfcGF0aCkgPCAwOgorICAgICAgICAgICAgc2VsZi5fbG9nZ2Vy
KCdGYWlsZWQgdG8gcnVuIHBlcmZvcm1hbmNlIHRlc3RzIHdpdGggdGhlIHBhdGNoLicpCisgICAg
ICAgICAgICByZXR1cm4gRmFsc2UKKworICAgICAgICBzZWxmLl9sb2dnZXIoIkkgc2hvdWxkIGJl
IHVwbG9hZGluZyB0aGUgcmVzdWx0cyBoZXJlLiIpCisgICAgICAgIHJldHVybiBUcnVlCisKKyAg
ICBkZWYgcGFyZW50X2NvbW1hbmQoc2VsZik6CisgICAgICAgIHJldHVybiAicGVyZmFsaXplciIK
KworICAgIGRlZiBydW5fd2Via2l0X3BhdGNoKHNlbGYsIGFyZ3MpOgorICAgICAgICB3ZWJraXRf
cGF0Y2hfYXJncyA9IFtzZWxmLl90b29sLnBhdGgoKV0KKyAgICAgICAgd2Via2l0X3BhdGNoX2Fy
Z3MuZXh0ZW5kKGFyZ3MpCisgICAgICAgIHJldHVybiBzZWxmLl90b29sLmV4ZWN1dGl2ZS5ydW5f
YW5kX3Rocm93X2lmX2ZhaWwod2Via2l0X3BhdGNoX2FyZ3MsIGN3ZD1zZWxmLl90b29sLnNjbSgp
LmNoZWNrb3V0X3Jvb3QpCisKKyAgICBkZWYgX3J1bl9wZXJmX3Rlc3Qoc2VsZiwgYnVpbGRfcGF0
aCk6CisgICAgICAgIGZpbGVzeXN0ZW0gPSBzZWxmLl90b29sLmZpbGVzeXN0ZW0KKyAgICAgICAg
c2NyaXB0X3BhdGggPSBmaWxlc3lzdGVtLmpvaW4oZmlsZXN5c3RlbS5kaXJuYW1lKHNlbGYuX3Rv
b2wucGF0aCgpKSwgJ3J1bi1wZXJmLXRlc3RzJykKKyAgICAgICAgcGVyZl90ZXN0X3J1bm5lcl9h
cmdzID0gW3NjcmlwdF9wYXRoLCAnLS1uby1idWlsZCcsICctLWJ1aWxkLWRpcmVjdG9yeScsIGJ1
aWxkX3BhdGgsICdDU1MnXQorICAgICAgICByZXR1cm4gc2VsZi5fdG9vbC5leGVjdXRpdmUucnVu
X2FuZF90aHJvd19pZl9mYWlsKHBlcmZfdGVzdF9ydW5uZXJfYXJncywgY3dkPXNlbGYuX3Rvb2wu
c2NtKCkuY2hlY2tvdXRfcm9vdCkKKworICAgIGRlZiBydW5fY29tbWFuZChzZWxmLCBjb21tYW5k
KToKKyAgICAgICAgc2VsZi5ydW5fd2Via2l0X3BhdGNoKGNvbW1hbmQpCisKKyAgICBkZWYgY29t
bWFuZF9wYXNzZWQoc2VsZiwgbWVzc2FnZSwgcGF0Y2gpOgorICAgICAgICBwYXNzCisKKyAgICBk
ZWYgY29tbWFuZF9mYWlsZWQoc2VsZiwgbWVzc2FnZSwgc2NyaXB0X2Vycm9yLCBwYXRjaCk6Cisg
ICAgICAgIHNlbGYuX2xvZ2dlcihtZXNzYWdlKQorCisgICAgZGVmIHJlZmV0Y2hfcGF0Y2goc2Vs
ZiwgcGF0Y2gpOgorICAgICAgICByZXR1cm4gc2VsZi5fdG9vbC5idWdzLmZldGNoX2F0dGFjaG1l
bnQocGF0Y2guaWQoKSkKKworICAgIGRlZiBleHBlY3RlZF9mYWlsdXJlcyhzZWxmKToKKyAgICAg
ICAgcmV0dXJuIEV4cGVjdGVkRmFpbHVyZXMoKQorCisgICAgZGVmIGJ1aWxkX3N0eWxlKHNlbGYp
OgorICAgICAgICByZXR1cm4gInJlbGVhc2UiCisKK2NsYXNzIFBlcmZUZXN0KElSQ0NvbW1hbmQp
OgorICAgIGRlZiBleGVjdXRlKHNlbGYsIG5pY2ssIGFyZ3MsIHRvb2wsIHNoZXJpZmYpOgorICAg
ICAgICBpZiBub3QgYXJnczoKKyAgICAgICAgICAgIHRvb2wuaXJjKCkucG9zdChuaWNrICsgIjog
UGxlYXNlIHNwZWNpZnkgYW4gYXR0YWNobWVudC9wYXRjaCBpZCIpCisgICAgICAgICAgICByZXR1
cm4KKworICAgICAgICBwYXRjaF9pZCA9IGFyZ3NbMF0KKyAgICAgICAgcGF0Y2ggPSB0b29sLmJ1
Z3MuZmV0Y2hfYXR0YWNobWVudChwYXRjaF9pZCkKKyAgICAgICAgaWYgbm90IHBhdGNoOgorICAg
ICAgICAgICAgdG9vbC5pcmMoKS5wb3N0KG5pY2sgKyAiOiBDb3VsZCBub3QgZmV0Y2ggdGhlIHBh
dGNoIikKKyAgICAgICAgICAgIHJldHVybgorCisgICAgICAgIHRhc2sgPSBQZXJmYWxpemVyVGFz
ayh0b29sLCBwYXRjaCwgbGFtYmRhIG1lc3NhZ2U6IHRvb2wuaXJjKCkucG9zdCgnJXM6ICVzJyAl
IChuaWNrLCBtZXNzYWdlKSkpCisgICAgICAgIHRhc2sucnVuKCkKKworY2xhc3MgUGVyZmFsaXpl
cihBYnN0cmFjdFF1ZXVlLCBTdGVwU2VxdWVuY2VFcnJvckhhbmRsZXIpOgorICAgIG5hbWUgPSAi
cGVyZmFsaXplciIKKyAgICB3YXRjaGVycyA9IEFic3RyYWN0UXVldWUud2F0Y2hlcnMgKyBbCisg
ICAgICAgICJybml3YUB3ZWJraXQub3JnIgorICAgIF0KKworICAgIF9jb21tYW5kcyA9IHsKKyAg
ICAgICAgImhlbHAiOiBIZWxwLAorICAgICAgICAiaGkiOiBIaSwKKyAgICAgICAgInJlc3RhcnQi
OiBSZXN0YXJ0LAorICAgICAgICAidGVzdCIgOiBQZXJmVGVzdCwgCisgICAgfQorCisgICAgIyBB
YnN0cmFjdFF1ZXVlIG1ldGhvZHMKKworICAgIGRlZiBiZWdpbl93b3JrX3F1ZXVlKHNlbGYpOgor
ICAgICAgICBBYnN0cmFjdFF1ZXVlLmJlZ2luX3dvcmtfcXVldWUoc2VsZikKKyAgICAgICAgc2Vs
Zi5fc2hlcmlmZiA9IFNoZXJpZmYoc2VsZi5fdG9vbCwgc2VsZikKKyAgICAgICAgc2VsZi5faXJj
X2JvdCA9IElSQ0JvdCgicGVyZmFsaXplciIsIHNlbGYuX3Rvb2wsIHNlbGYuX3NoZXJpZmYsIHNl
bGYuX2NvbW1hbmRzKQorICAgICAgICBzZWxmLl90b29sLmVuc3VyZV9pcmNfY29ubmVjdGVkKHNl
bGYuX2lyY19ib3QuaXJjX2RlbGVnYXRlKCkpCisKKyAgICBkZWYgd29ya19pdGVtX2xvZ19wYXRo
KHNlbGYsIGZhaWx1cmVfbWFwKToKKyAgICAgICAgcmV0dXJuIE5vbmUKKworICAgIGRlZiBfaXNf
b2xkX2ZhaWx1cmUoc2VsZiwgcmV2aXNpb24pOgorICAgICAgICByZXR1cm4gc2VsZi5fdG9vbC5z
dGF0dXNfc2VydmVyLnN2bl9yZXZpc2lvbihyZXZpc2lvbikKKworICAgIGRlZiBuZXh0X3dvcmtf
aXRlbShzZWxmKToKKyAgICAgICAgc2VsZi5faXJjX2JvdC5wcm9jZXNzX3BlbmRpbmdfbWVzc2Fn
ZXMoKQorICAgICAgICByZXR1cm4KKworICAgIGRlZiBwcm9jZXNzX3dvcmtfaXRlbShzZWxmLCBm
YWlsdXJlX21hcCk6CisgICAgICAgIHJldHVybiBUcnVlCisKKyAgICBkZWYgaGFuZGxlX3VuZXhw
ZWN0ZWRfZXJyb3Ioc2VsZiwgZmFpbHVyZV9tYXAsIG1lc3NhZ2UpOgorICAgICAgICBsb2cobWVz
c2FnZSkKKworICAgICMgU3RlcFNlcXVlbmNlRXJyb3JIYW5kbGVyIG1ldGhvZHMKKworICAgIEBj
bGFzc21ldGhvZAorICAgIGRlZiBoYW5kbGVfc2NyaXB0X2Vycm9yKGNscywgdG9vbCwgc3RhdGUs
IHNjcmlwdF9lcnJvcik6CisgICAgICAgICMgSWRlYWxseSB3ZSB3b3VsZCBwb3N0IHNvbWUgaW5m
b3JtYXRpb24gdG8gSVJDIGFib3V0IHdoYXQgd2VudCB3cm9uZworICAgICAgICAjIGhlcmUsIGJ1
dCB3ZSBkb24ndCBoYXZlIHRoZSBJUkMgcGFzc3dvcmQgaW4gdGhlIGNoaWxkIHByb2Nlc3MuCisg
ICAgICAgIHBhc3MKSW5kZXg6IFRvb2xzL1NjcmlwdHMvd2Via2l0cHkvdG9vbC9ib3QvcGF0Y2hh
bmFseXNpc3Rhc2sucHkKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gVG9vbHMvU2NyaXB0cy93ZWJraXRweS90b29s
L2JvdC9wYXRjaGFuYWx5c2lzdGFzay5weQkocmV2aXNpb24gMTI0ODAyKQorKysgVG9vbHMvU2Ny
aXB0cy93ZWJraXRweS90b29sL2JvdC9wYXRjaGFuYWx5c2lzdGFzay5weQkod29ya2luZyBjb3B5
KQpAQCAtMTA2LDYgKzEwNiw3IEBACiAgICAgZGVmIF9hcHBseShzZWxmKToKICAgICAgICAgcmV0
dXJuIHNlbGYuX3J1bl9jb21tYW5kKFsKICAgICAgICAgICAgICJhcHBseS1hdHRhY2htZW50IiwK
KyAgICAgICAgICAgICItLW5vLWNsZWFuIiwKICAgICAgICAgICAgICItLW5vLXVwZGF0ZSIsCiAg
ICAgICAgICAgICAiLS1ub24taW50ZXJhY3RpdmUiLAogICAgICAgICAgICAgc2VsZi5fcGF0Y2gu
aWQoKSwK
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>157075</attachid>
            <date>2012-08-07 18:26:08 -0700</date>
            <delta_ts>2012-08-07 18:47:58 -0700</delta_ts>
            <desc>work in progress 4</desc>
            <filename>wip92913d</filename>
            <type>text/plain</type>
            <size>12398</size>
            <attacher name="Ryosuke Niwa">rniwa</attacher>
            
              <data encoding="base64">SW5kZXg6IFRvb2xzL1NjcmlwdHMvd2Via2l0cHkvY29tbW9uL3N5c3RlbS9maWxlc3lzdGVtLnB5
Cj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT0KLS0tIFRvb2xzL1NjcmlwdHMvd2Via2l0cHkvY29tbW9uL3N5c3RlbS9maWxl
c3lzdGVtLnB5CShyZXZpc2lvbiAxMjQ5NTEpCisrKyBUb29scy9TY3JpcHRzL3dlYmtpdHB5L2Nv
bW1vbi9zeXN0ZW0vZmlsZXN5c3RlbS5weQkod29ya2luZyBjb3B5KQpAQCAtNzUsNiArNzUsOSBA
QAogICAgIGRlZiBjb3B5ZmlsZShzZWxmLCBzb3VyY2UsIGRlc3RpbmF0aW9uKToKICAgICAgICAg
c2h1dGlsLmNvcHlmaWxlKHNvdXJjZSwgZGVzdGluYXRpb24pCiAKKyAgICBkZWYgY29weXRyZWUo
c2VsZiwgc291cmNlLCBkZXN0aW5hdGlvbik6CisgICAgICAgIHNodXRpbC5jb3B5dHJlZShzb3Vy
Y2UsIGRlc3RpbmF0aW9uKQorCiAgICAgZGVmIGRpcm5hbWUoc2VsZiwgcGF0aCk6CiAgICAgICAg
IHJldHVybiBvcy5wYXRoLmRpcm5hbWUocGF0aCkKIApJbmRleDogVG9vbHMvU2NyaXB0cy93ZWJr
aXRweS9jb21tb24vbmV0L2J1Z3ppbGxhL2J1Z3ppbGxhLnB5Cj09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFRvb2xz
L1NjcmlwdHMvd2Via2l0cHkvY29tbW9uL25ldC9idWd6aWxsYS9idWd6aWxsYS5weQkocmV2aXNp
b24gMTI0OTUxKQorKysgVG9vbHMvU2NyaXB0cy93ZWJraXRweS9jb21tb24vbmV0L2J1Z3ppbGxh
L2J1Z3ppbGxhLnB5CSh3b3JraW5nIGNvcHkpCkBAIC01NzgsMTkgKzU3OCwxNCBAQAogICAgICAg
ICAgICAgcmV0dXJuIGZpbGVfb2JqZWN0Lm5hbWUKICAgICAgICAgcmV0dXJuICJidWctJXMtJXMu
JXMiICUgKGJ1Z19pZCwgdGltZXN0YW1wKCksIGV4dGVuc2lvbikKIAotICAgIGRlZiBhZGRfYXR0
YWNobWVudF90b19idWcoc2VsZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1Z19p
ZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVfb3Jfc3RyaW5nLAotICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb24sCi0gICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICBmaWxlbmFtZT1Ob25lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
Y29tbWVudF90ZXh0PU5vbmUpOgorICAgIGRlZiBhZGRfYXR0YWNobWVudF90b19idWcoc2VsZiwg
YnVnX2lkLCBmaWxlX29yX3N0cmluZywgZGVzY3JpcHRpb24sIGZpbGVuYW1lPU5vbmUsIGNvbW1l
bnRfdGV4dD1Ob25lLCBtaW1ldHlwZT1Ob25lKToKICAgICAgICAgc2VsZi5hdXRoZW50aWNhdGUo
KQogICAgICAgICBsb2coJ0FkZGluZyBhdHRhY2htZW50ICIlcyIgdG8gJXMnICUgKGRlc2NyaXB0
aW9uLCBzZWxmLmJ1Z191cmxfZm9yX2J1Z19pZChidWdfaWQpKSkKICAgICAgICAgc2VsZi5icm93
c2VyLm9wZW4oc2VsZi5hZGRfYXR0YWNobWVudF91cmwoYnVnX2lkKSkKICAgICAgICAgc2VsZi5i
cm93c2VyLnNlbGVjdF9mb3JtKG5hbWU9ImVudHJ5Zm9ybSIpCiAgICAgICAgIGZpbGVfb2JqZWN0
ID0gc2VsZi5fZmlsZV9vYmplY3RfZm9yX3VwbG9hZChmaWxlX29yX3N0cmluZykKICAgICAgICAg
ZmlsZW5hbWUgPSBmaWxlbmFtZSBvciBzZWxmLl9maWxlbmFtZV9mb3JfdXBsb2FkKGZpbGVfb2Jq
ZWN0LCBidWdfaWQpCi0gICAgICAgIHNlbGYuX2ZpbGxfYXR0YWNobWVudF9mb3JtKGRlc2NyaXB0
aW9uLCBmaWxlX29iamVjdCwgZmlsZW5hbWU9ZmlsZW5hbWUpCisgICAgICAgIHNlbGYuX2ZpbGxf
YXR0YWNobWVudF9mb3JtKGRlc2NyaXB0aW9uLCBmaWxlX29iamVjdCwgZmlsZW5hbWU9ZmlsZW5h
bWUsIG1pbWV0eXBlPW1pbWV0eXBlKQogICAgICAgICBpZiBjb21tZW50X3RleHQ6CiAgICAgICAg
ICAgICBsb2coY29tbWVudF90ZXh0KQogICAgICAgICAgICAgc2VsZi5icm93c2VyWydjb21tZW50
J10gPSBjb21tZW50X3RleHQKSW5kZXg6IFRvb2xzL1NjcmlwdHMvd2Via2l0cHkvY29tbW9uL2Nv
bmZpZy9pcmMucHkKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PQotLS0gVG9vbHMvU2NyaXB0cy93ZWJraXRweS9jb21tb24v
Y29uZmlnL2lyYy5weQkocmV2aXNpb24gMTI0OTUxKQorKysgVG9vbHMvU2NyaXB0cy93ZWJraXRw
eS9jb21tb24vY29uZmlnL2lyYy5weQkod29ya2luZyBjb3B5KQpAQCAtMjgsNCArMjgsNCBAQAog
CiBzZXJ2ZXI9ImlyYy5mcmVlbm9kZS5uZXQiCiBwb3J0PTY2NjcKLWNoYW5uZWw9IiN3ZWJraXQi
CitjaGFubmVsPSIjd2Via2l0LXRlc3QiCkluZGV4OiBUb29scy9TY3JpcHRzL3dlYmtpdHB5L3Rv
b2wvY29tbWFuZHMvX19pbml0X18ucHkKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gVG9vbHMvU2NyaXB0cy93ZWJr
aXRweS90b29sL2NvbW1hbmRzL19faW5pdF9fLnB5CShyZXZpc2lvbiAxMjQ5NTEpCisrKyBUb29s
cy9TY3JpcHRzL3dlYmtpdHB5L3Rvb2wvY29tbWFuZHMvX19pbml0X18ucHkJKHdvcmtpbmcgY29w
eSkKQEAgLTEyLDYgKzEyLDcgQEAKIGZyb20gd2Via2l0cHkudG9vbC5jb21tYW5kcy5maW5kdXNl
cnMgaW1wb3J0IEZpbmRVc2VycwogZnJvbSB3ZWJraXRweS50b29sLmNvbW1hbmRzLmdhcmRlbm9t
YXRpYyBpbXBvcnQgR2FyZGVuT01hdGljCiBmcm9tIHdlYmtpdHB5LnRvb2wuY29tbWFuZHMub3Bl
bmJ1Z3MgaW1wb3J0IE9wZW5CdWdzCitmcm9tIHdlYmtpdHB5LnRvb2wuY29tbWFuZHMucGVyZmFs
aXplciBpbXBvcnQgUGVyZmFsaXplcgogZnJvbSB3ZWJraXRweS50b29sLmNvbW1hbmRzLnByZXR0
eWRpZmYgaW1wb3J0IFByZXR0eURpZmYKIGZyb20gd2Via2l0cHkudG9vbC5jb21tYW5kcy5xdWVy
aWVzIGltcG9ydCAqCiBmcm9tIHdlYmtpdHB5LnRvb2wuY29tbWFuZHMucXVldWVzIGltcG9ydCAq
CkluZGV4OiBUb29scy9TY3JpcHRzL3dlYmtpdHB5L3Rvb2wvY29tbWFuZHMvcGVyZmFsaXplci5w
eQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09Ci0tLSBUb29scy9TY3JpcHRzL3dlYmtpdHB5L3Rvb2wvY29tbWFuZHMvcGVy
ZmFsaXplci5weQkocmV2aXNpb24gMCkKKysrIFRvb2xzL1NjcmlwdHMvd2Via2l0cHkvdG9vbC9j
b21tYW5kcy9wZXJmYWxpemVyLnB5CShyZXZpc2lvbiAwKQpAQCAtMCwwICsxLDIxMCBAQAorIyBD
b3B5cmlnaHQgKGMpIDIwMTIgR29vZ2xlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyMKKyMg
UmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBv
ciB3aXRob3V0CisjIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRo
ZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKyMgbWV0OgorIyAKKyMgICAgICogUmVkaXN0cmli
dXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyMg
bm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFp
bWVyLgorIyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1
Y2UgdGhlIGFib3ZlCisjIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25z
IGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKyMgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5k
L29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorIyBkaXN0cmlidXRpb24uCisj
ICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBp
dHMKKyMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9k
dWN0cyBkZXJpdmVkIGZyb20KKyMgdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9y
IHdyaXR0ZW4gcGVybWlzc2lvbi4KKyMgCisjIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkg
VEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyMgIkFTIElTIiBBTkQgQU5Z
IEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyMgTElN
SVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJ
VE5FU1MgRk9SCisjIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBF
VkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisjIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFC
TEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorIyBTUEVDSUFMLCBFWEVN
UExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisjIExJ
TUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExP
U1MgT0YgVVNFLAorIyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04p
IEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyMgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhF
UiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorIyAoSU5DTFVESU5HIE5F
R0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UK
KyMgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBP
RiBTVUNIIERBTUFHRS4KKworZnJvbSB3ZWJraXRweS5jb21tb24uc3lzdGVtLmRlcHJlY2F0ZWRf
bG9nZ2luZyBpbXBvcnQgbG9nCitmcm9tIHdlYmtpdHB5LnRvb2wuYm90LmV4cGVjdGVkZmFpbHVy
ZXMgaW1wb3J0IEV4cGVjdGVkRmFpbHVyZXMKK2Zyb20gd2Via2l0cHkudG9vbC5ib3QuaXJjX2Nv
bW1hbmQgaW1wb3J0IElSQ0NvbW1hbmQKK2Zyb20gd2Via2l0cHkudG9vbC5ib3QuaXJjX2NvbW1h
bmQgaW1wb3J0IEhlbHAKK2Zyb20gd2Via2l0cHkudG9vbC5ib3QuaXJjX2NvbW1hbmQgaW1wb3J0
IEhpCitmcm9tIHdlYmtpdHB5LnRvb2wuYm90LmlyY19jb21tYW5kIGltcG9ydCBSZXN0YXJ0Citm
cm9tIHdlYmtpdHB5LnRvb2wuYm90LmlyY2JvdCBpbXBvcnQgSVJDQm90Citmcm9tIHdlYmtpdHB5
LnRvb2wuYm90LnBhdGNoYW5hbHlzaXN0YXNrIGltcG9ydCBQYXRjaEFuYWx5c2lzVGFzaywgUGF0
Y2hBbmFseXNpc1Rhc2tEZWxlZ2F0ZSwgVW5hYmxlVG9BcHBseVBhdGNoCitmcm9tIHdlYmtpdHB5
LnRvb2wuYm90LnNoZXJpZmYgaW1wb3J0IFNoZXJpZmYKK2Zyb20gd2Via2l0cHkudG9vbC5jb21t
YW5kcy5xdWV1ZXMgaW1wb3J0IEFic3RyYWN0UXVldWUKK2Zyb20gd2Via2l0cHkudG9vbC5jb21t
YW5kcy5zdGVwc2VxdWVuY2UgaW1wb3J0IFN0ZXBTZXF1ZW5jZUVycm9ySGFuZGxlcgorCitjbGFz
cyBQZXJmYWxpemVyVGFzayhQYXRjaEFuYWx5c2lzVGFzayk6CisgICAgZGVmIF9faW5pdF9fKHNl
bGYsIHRvb2wsIHBhdGNoLCBsb2dnZXIpOgorICAgICAgICBQYXRjaEFuYWx5c2lzVGFzay5fX2lu
aXRfXyhzZWxmLCBzZWxmLCBwYXRjaCkKKyAgICAgICAgc2VsZi5fcG9ydCA9IHRvb2wucG9ydF9m
YWN0b3J5LmdldCgpCisgICAgICAgIHNlbGYuX3Rvb2wgPSB0b29sCisgICAgICAgIHNlbGYuX2xv
Z2dlciA9IGxvZ2dlcgorCisgICAgZGVmIF9jb3B5X2J1aWxkX3Byb2R1Y3Rfd2l0aG91dF9wYXRj
aChzZWxmLCBwb3N0Zml4KToKKyAgICAgICAgZmlsZXN5c3RlbSA9IHNlbGYuX3Rvb2wuZmlsZXN5
c3RlbQorICAgICAgICBjb25maWd1cmF0aW9uID0gZmlsZXN5c3RlbS5iYXNlbmFtZShzZWxmLl9w
b3J0Ll9idWlsZF9wYXRoKCkpCisgICAgICAgIHNlbGYuX2J1aWxkX3BhdGggPSBmaWxlc3lzdGVt
LmRpcm5hbWUoc2VsZi5fcG9ydC5fYnVpbGRfcGF0aCgpKQorICAgICAgICBzZWxmLl9idWlsZF9w
YXRoX3dpdGhvdXRfcGF0Y2ggPSBzZWxmLl9idWlsZF9wYXRoICsgcG9zdGZpeAorCisgICAgICAg
IHRyeToKKyAgICAgICAgICAgIGZpbGVzeXN0ZW0ucm10cmVlKHNlbGYuX2J1aWxkX3BhdGhfd2l0
aG91dF9wYXRjaCkKKyAgICAgICAgICAgIGZpbGVzeXN0ZW0uY29weXRyZWUoZmlsZXN5c3RlbS5q
b2luKHNlbGYuX2J1aWxkX3BhdGgsIGNvbmZpZ3VyYXRpb24pLAorICAgICAgICAgICAgICAgIGZp
bGVzeXN0ZW0uam9pbihzZWxmLl9idWlsZF9wYXRoX3dpdGhvdXRfcGF0Y2gsIGNvbmZpZ3VyYXRp
b24pKQorICAgICAgICAgICAgcmV0dXJuIFRydWUKKyAgICAgICAgZXhjZXB0OgorICAgICAgICAg
ICAgcmV0dXJuIEZhbHNlCisKKyAgICBkZWYgcnVuKHNlbGYpOgorCisgICAgICAgIGlmIG5vdCBz
ZWxmLl9wYXRjaC5jb21taXR0ZXIoKToKKyAgICAgICAgICAgIHNlbGYuX2xvZ2dlcignSSBjYW5u
b3QgcHJvY2VzcyBhIHBhdGNoIG5vdCBhdXRob3JpemVkIGJ5IGEgY29tbW1pdHRlcicgJSBzZWxm
Ll9wYXRjaC5pZCgpKQorICAgICAgICAgICAgcmV0dXJuIEZhbHNlCisKKyAgICAgICAgc2VsZi5f
bG9nZ2VyKCdQcmVwYXJpbmcgdG8gcnVuIHBlcmZvcm1hbmNlIHRlc3RzIGZvciB0aGUgYXR0YWNo
bWVudCAlZC4uLicgJSBzZWxmLl9wYXRjaC5pZCgpKQorIyAgICAgICAgaWYgbm90IHNlbGYuX2Ns
ZWFuKCkgb3Igbm90IHNlbGYuX3VwZGF0ZSgpOgorIyAgICAgICAgICAgIHJldHVybiBGYWxzZQor
CisgICAgICAgIGhlYWRfcmV2aXNpb24gPSBzZWxmLl90b29sLnNjbSgpLmhlYWRfc3ZuX3Jldmlz
aW9uKCkKKworICAgICAgICBzZWxmLl9sb2dnZXIoJ0J1aWxkaW5nIFdlYktpdCBhdCByJXMgd2l0
aG91dCB0aGUgcGF0Y2gnICUgaGVhZF9yZXZpc2lvbikKKyAgICAgICAgaWYgbm90IHNlbGYuX2J1
aWxkKCk6CisgICAgICAgICAgICByZXR1cm4gRmFsc2UKKworICAgICAgICBpZiBub3Qgc2VsZi5f
cG9ydC5jaGVja19idWlsZChuZWVkc19odHRwPUZhbHNlKToKKyAgICAgICAgICAgIHNlbGYuX2xv
Z2dlcignRmFpbGVkIHRvIGJ1aWxkIER1bXBSZW5kZXJUcmVlLicpCisgICAgICAgICAgICByZXR1
cm4gRmFsc2UKKworICAgICAgICBpZiBub3Qgc2VsZi5fY29weV9idWlsZF9wcm9kdWN0X3dpdGhv
dXRfcGF0Y2goJy1yJyArIGhlYWRfcmV2aXNpb24pOgorICAgICAgICAgICAgc2VsZi5fbG9nZ2Vy
KCdGYWlsZWQgdG8gY29weSB0aGUgYnVpbGQgcHJvZHVjdCBmcm9tICVzIHRvICVzJyAlIChzZWxm
Ll9idWlsZF9wYXRoLCBzZWxmLl9idWlsZF9wYXRoX3dpdGhvdXRfcGF0Y2gpKQorICAgICAgICAg
ICAgcmV0dXJuIEZhbHNlCisKKyAgICAgICAgc2VsZi5fbG9nZ2VyKCdCdWlsZGluZyBXZWJLaXQg
YXQgciVzIHdpdGggdGhlIHBhdGNoJyAlIGhlYWRfcmV2aXNpb24pCisgICAgICAgIGlmIG5vdCBz
ZWxmLl9hcHBseSgpIG9yIG5vdCBzZWxmLl9idWlsZCgpOgorICAgICAgICAgICAgcmV0dXJuIEZh
bHNlCisKKyAgICAgICAgaWYgbm90IHNlbGYuX3BvcnQuY2hlY2tfYnVpbGQobmVlZHNfaHR0cD1G
YWxzZSk6CisgICAgICAgICAgICBzZWxmLl9sb2dnZXIoJ0ZhaWxlZCB0byBidWlsZCBEdW1wUmVu
ZGVyVHJlZS4nKQorICAgICAgICAgICAgcmV0dXJuIEZhbHNlCisKKyAgICAgICAgZmlsZXN5c3Rl
bSA9IHNlbGYuX3Rvb2wuZmlsZXN5c3RlbQorICAgICAgICBmaWxlc3lzdGVtLnJlbW92ZShzZWxm
Ll9qc29uX3BhdGgoKSkKKworICAgICAgICBzZWxmLl9sb2dnZXIoIlJ1bm5pbmcgcGVyZm9ybWFu
Y2UgdGVzdHMuLi4iKQorICAgICAgICBpZiBzZWxmLl9ydW5fcGVyZl90ZXN0KHNlbGYuX2J1aWxk
X3BhdGhfd2l0aG91dF9wYXRjaCkgPCAwOgorICAgICAgICAgICAgc2VsZi5fbG9nZ2VyKCdGYWls
ZWQgdG8gcnVuIHBlcmZvcm1hbmNlIHRlc3RzIHdpdGhvdXQgdGhlIHBhdGNoLicpCisgICAgICAg
ICAgICByZXR1cm4gRmFsc2UKKworICAgICAgICBpZiBzZWxmLl9ydW5fcGVyZl90ZXN0KHNlbGYu
X2J1aWxkX3BhdGgpIDwgMDoKKyAgICAgICAgICAgIHNlbGYuX2xvZ2dlcignRmFpbGVkIHRvIHJ1
biBwZXJmb3JtYW5jZSB0ZXN0cyB3aXRoIHRoZSBwYXRjaC4nKQorICAgICAgICAgICAgcmV0dXJu
IEZhbHNlCisKKyAgICAgICAgcmVzdWx0c19wYWdlID0gZmlsZXN5c3RlbS5yZWFkX3RleHRfZmls
ZShzZWxmLl9yZXN1bHRzX3BhZ2VfcGF0aCgpKQorICAgICAgICBzZWxmLl90b29sLmJ1Z3MuYWRk
X2F0dGFjaG1lbnRfdG9fYnVnKHNlbGYuX3BhdGNoLmJ1Z19pZCgpLCByZXN1bHRzX3BhZ2UsCisg
ICAgICAgICAgICBkZXNjcmlwdGlvbj0iUGVyZm9ybWFuY2UgdGVzdHMgcmVzdWx0cyBmb3IgJWQi
ICUgc2VsZi5fcGF0Y2guaWQoKSwgbWluZXR5cGU9J3RleHQvaHRtbCcpCisKKyAgICAgICAgc2Vs
Zi5fbG9nZ2VyKCJVcGxvYWRlZCB0aGUgcmVzdWx0cyBvbiB0aGUgYnVnICVkIiAlIHNlbGYuX3Bh
dGNoLmJ1Z19pZCgpKQorICAgICAgICByZXR1cm4gVHJ1ZQorCisgICAgZGVmIHBhcmVudF9jb21t
YW5kKHNlbGYpOgorICAgICAgICByZXR1cm4gInBlcmZhbGl6ZXIiCisKKyAgICBkZWYgcnVuX3dl
YmtpdF9wYXRjaChzZWxmLCBhcmdzKToKKyAgICAgICAgd2Via2l0X3BhdGNoX2FyZ3MgPSBbc2Vs
Zi5fdG9vbC5wYXRoKCldCisgICAgICAgIHdlYmtpdF9wYXRjaF9hcmdzLmV4dGVuZChhcmdzKQor
ICAgICAgICByZXR1cm4gc2VsZi5fdG9vbC5leGVjdXRpdmUucnVuX2FuZF90aHJvd19pZl9mYWls
KHdlYmtpdF9wYXRjaF9hcmdzLCBjd2Q9c2VsZi5fdG9vbC5zY20oKS5jaGVja291dF9yb290KQor
CisgICAgZGVmIF9qc29uX3BhdGgoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLl90b29sLmZp
bGVzeXN0ZW0uam9pbihzZWxmLl9idWlsZF9wYXRoLCAnUGVyZm9ybWFuY2VUZXN0UmVzdWx0cy5q
c29uJykKKworICAgIGRlZiBfcmVzdWx0c19wYWdlX3BhdGgoc2VsZik6CisgICAgICAgIHJldHVy
biBzZWxmLl90b29sLmZpbGVzeXN0ZW0uam9pbihzZWxmLl9idWlsZF9wYXRoLCAnUGVyZm9ybWFu
Y2VUZXN0UmVzdWx0cy5odG1sJykKKworICAgIGRlZiBfcnVuX3BlcmZfdGVzdChzZWxmLCBidWls
ZF9wYXRoKToKKyAgICAgICAgZmlsZXN5c3RlbSA9IHNlbGYuX3Rvb2wuZmlsZXN5c3RlbQorICAg
ICAgICBzY3JpcHRfcGF0aCA9IGZpbGVzeXN0ZW0uam9pbihmaWxlc3lzdGVtLmRpcm5hbWUoc2Vs
Zi5fdG9vbC5wYXRoKCkpLCAncnVuLXBlcmYtdGVzdHMnKQorICAgICAgICBwZXJmX3Rlc3RfcnVu
bmVyX2FyZ3MgPSBbc2NyaXB0X3BhdGgsICctLW5vLWJ1aWxkJywgJy0tbm8tc2hvdy1yZXN1bHRz
JywgJy0tYnVpbGQtZGlyZWN0b3J5JywgYnVpbGRfcGF0aCwKKyAgICAgICAgICAgICctLW91dHB1
dC1qc29uLXBhdGgnLCBzZWxmLl9qc29uX3BhdGgoKSwgJ0NTUyddCisgICAgICAgIHJldHVybiBz
ZWxmLl90b29sLmV4ZWN1dGl2ZS5ydW5fYW5kX3Rocm93X2lmX2ZhaWwocGVyZl90ZXN0X3J1bm5l
cl9hcmdzLCBjd2Q9c2VsZi5fdG9vbC5zY20oKS5jaGVja291dF9yb290KQorCisgICAgZGVmIHJ1
bl9jb21tYW5kKHNlbGYsIGNvbW1hbmQpOgorICAgICAgICBzZWxmLnJ1bl93ZWJraXRfcGF0Y2go
Y29tbWFuZCkKKworICAgIGRlZiBjb21tYW5kX3Bhc3NlZChzZWxmLCBtZXNzYWdlLCBwYXRjaCk6
CisgICAgICAgIHBhc3MKKworICAgIGRlZiBjb21tYW5kX2ZhaWxlZChzZWxmLCBtZXNzYWdlLCBz
Y3JpcHRfZXJyb3IsIHBhdGNoKToKKyAgICAgICAgc2VsZi5fbG9nZ2VyKG1lc3NhZ2UpCisKKyAg
ICBkZWYgcmVmZXRjaF9wYXRjaChzZWxmLCBwYXRjaCk6CisgICAgICAgIHJldHVybiBzZWxmLl90
b29sLmJ1Z3MuZmV0Y2hfYXR0YWNobWVudChwYXRjaC5pZCgpKQorCisgICAgZGVmIGV4cGVjdGVk
X2ZhaWx1cmVzKHNlbGYpOgorICAgICAgICByZXR1cm4gRXhwZWN0ZWRGYWlsdXJlcygpCisKKyAg
ICBkZWYgYnVpbGRfc3R5bGUoc2VsZik6CisgICAgICAgIHJldHVybiAicmVsZWFzZSIKKworY2xh
c3MgUGVyZlRlc3QoSVJDQ29tbWFuZCk6CisgICAgZGVmIGV4ZWN1dGUoc2VsZiwgbmljaywgYXJn
cywgdG9vbCwgc2hlcmlmZik6CisgICAgICAgIGlmIG5vdCBhcmdzOgorICAgICAgICAgICAgdG9v
bC5pcmMoKS5wb3N0KG5pY2sgKyAiOiBQbGVhc2Ugc3BlY2lmeSBhbiBhdHRhY2htZW50L3BhdGNo
IGlkIikKKyAgICAgICAgICAgIHJldHVybgorCisgICAgICAgIHBhdGNoX2lkID0gYXJnc1swXQor
ICAgICAgICBwYXRjaCA9IHRvb2wuYnVncy5mZXRjaF9hdHRhY2htZW50KHBhdGNoX2lkKQorICAg
ICAgICBpZiBub3QgcGF0Y2g6CisgICAgICAgICAgICB0b29sLmlyYygpLnBvc3QobmljayArICI6
IENvdWxkIG5vdCBmZXRjaCB0aGUgcGF0Y2giKQorICAgICAgICAgICAgcmV0dXJuCisKKyAgICAg
ICAgdGFzayA9IFBlcmZhbGl6ZXJUYXNrKHRvb2wsIHBhdGNoLCBsYW1iZGEgbWVzc2FnZTogdG9v
bC5pcmMoKS5wb3N0KCclczogJXMnICUgKG5pY2ssIG1lc3NhZ2UpKSkKKyAgICAgICAgdGFzay5y
dW4oKQorCitjbGFzcyBQZXJmYWxpemVyKEFic3RyYWN0UXVldWUsIFN0ZXBTZXF1ZW5jZUVycm9y
SGFuZGxlcik6CisgICAgbmFtZSA9ICJwZXJmYWxpemVyIgorICAgIHdhdGNoZXJzID0gQWJzdHJh
Y3RRdWV1ZS53YXRjaGVycyArIFsKKyAgICAgICAgInJuaXdhQHdlYmtpdC5vcmciCisgICAgXQor
CisgICAgX2NvbW1hbmRzID0geworICAgICAgICAiaGVscCI6IEhlbHAsCisgICAgICAgICJoaSI6
IEhpLAorICAgICAgICAicmVzdGFydCI6IFJlc3RhcnQsCisgICAgICAgICJ0ZXN0IiA6IFBlcmZU
ZXN0LCAKKyAgICB9CisKKyAgICAjIEFic3RyYWN0UXVldWUgbWV0aG9kcworCisgICAgZGVmIGJl
Z2luX3dvcmtfcXVldWUoc2VsZik6CisgICAgICAgIEFic3RyYWN0UXVldWUuYmVnaW5fd29ya19x
dWV1ZShzZWxmKQorICAgICAgICBzZWxmLl9zaGVyaWZmID0gU2hlcmlmZihzZWxmLl90b29sLCBz
ZWxmKQorICAgICAgICBzZWxmLl9pcmNfYm90ID0gSVJDQm90KCJwZXJmYWxpemVyIiwgc2VsZi5f
dG9vbCwgc2VsZi5fc2hlcmlmZiwgc2VsZi5fY29tbWFuZHMpCisgICAgICAgIHNlbGYuX3Rvb2wu
ZW5zdXJlX2lyY19jb25uZWN0ZWQoc2VsZi5faXJjX2JvdC5pcmNfZGVsZWdhdGUoKSkKKworICAg
IGRlZiB3b3JrX2l0ZW1fbG9nX3BhdGgoc2VsZiwgZmFpbHVyZV9tYXApOgorICAgICAgICByZXR1
cm4gTm9uZQorCisgICAgZGVmIF9pc19vbGRfZmFpbHVyZShzZWxmLCByZXZpc2lvbik6CisgICAg
ICAgIHJldHVybiBzZWxmLl90b29sLnN0YXR1c19zZXJ2ZXIuc3ZuX3JldmlzaW9uKHJldmlzaW9u
KQorCisgICAgZGVmIG5leHRfd29ya19pdGVtKHNlbGYpOgorICAgICAgICBzZWxmLl9pcmNfYm90
LnByb2Nlc3NfcGVuZGluZ19tZXNzYWdlcygpCisgICAgICAgIHJldHVybgorCisgICAgZGVmIHBy
b2Nlc3Nfd29ya19pdGVtKHNlbGYsIGZhaWx1cmVfbWFwKToKKyAgICAgICAgcmV0dXJuIFRydWUK
KworICAgIGRlZiBoYW5kbGVfdW5leHBlY3RlZF9lcnJvcihzZWxmLCBmYWlsdXJlX21hcCwgbWVz
c2FnZSk6CisgICAgICAgIGxvZyhtZXNzYWdlKQorCisgICAgIyBTdGVwU2VxdWVuY2VFcnJvckhh
bmRsZXIgbWV0aG9kcworCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIGhhbmRsZV9zY3JpcHRf
ZXJyb3IoY2xzLCB0b29sLCBzdGF0ZSwgc2NyaXB0X2Vycm9yKToKKyAgICAgICAgIyBJZGVhbGx5
IHdlIHdvdWxkIHBvc3Qgc29tZSBpbmZvcm1hdGlvbiB0byBJUkMgYWJvdXQgd2hhdCB3ZW50IHdy
b25nCisgICAgICAgICMgaGVyZSwgYnV0IHdlIGRvbid0IGhhdmUgdGhlIElSQyBwYXNzd29yZCBp
biB0aGUgY2hpbGQgcHJvY2Vzcy4KKyAgICAgICAgcGFzcwpJbmRleDogVG9vbHMvU2NyaXB0cy93
ZWJraXRweS90b29sL2JvdC9wYXRjaGFuYWx5c2lzdGFzay5weQo9PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBUb29s
cy9TY3JpcHRzL3dlYmtpdHB5L3Rvb2wvYm90L3BhdGNoYW5hbHlzaXN0YXNrLnB5CShyZXZpc2lv
biAxMjQ5NTEpCisrKyBUb29scy9TY3JpcHRzL3dlYmtpdHB5L3Rvb2wvYm90L3BhdGNoYW5hbHlz
aXN0YXNrLnB5CSh3b3JraW5nIGNvcHkpCkBAIC0xMDYsNiArMTA2LDcgQEAKICAgICBkZWYgX2Fw
cGx5KHNlbGYpOgogICAgICAgICByZXR1cm4gc2VsZi5fcnVuX2NvbW1hbmQoWwogICAgICAgICAg
ICAgImFwcGx5LWF0dGFjaG1lbnQiLAorICAgICAgICAgICAgIi0tbm8tY2xlYW4iLAogICAgICAg
ICAgICAgIi0tbm8tdXBkYXRlIiwKICAgICAgICAgICAgICItLW5vbi1pbnRlcmFjdGl2ZSIsCiAg
ICAgICAgICAgICBzZWxmLl9wYXRjaC5pZCgpLAo=
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>157081</attachid>
            <date>2012-08-07 18:47:58 -0700</date>
            <delta_ts>2012-08-07 19:25:16 -0700</delta_ts>
            <desc>work in progress 5</desc>
            <filename>wip92913e</filename>
            <type>text/plain</type>
            <size>14578</size>
            <attacher name="Ryosuke Niwa">rniwa</attacher>
            
              <data encoding="base64">SW5kZXg6IFBlcmZvcm1hbmNlVGVzdHMvQ2hhbmdlTG9nCj09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFBlcmZvcm1h
bmNlVGVzdHMvQ2hhbmdlTG9nCShyZXZpc2lvbiAxMjQ5NTEpCisrKyBQZXJmb3JtYW5jZVRlc3Rz
L0NoYW5nZUxvZwkod29ya2luZyBjb3B5KQpAQCAtMSw1ICsxLDE4IEBACiAyMDEyLTA4LTA3ICBS
eW9zdWtlIE5pd2EgIDxybml3YUB3ZWJraXQub3JnPgogCisgICAgICAgIFVzZSBwZXJmb3JtYW5j
ZS53ZWJraXROb3cgaW4gUGVyZlRlc3RSdW5uZXIKKyAgICAgICAgaHR0cHM6Ly9idWdzLndlYmtp
dC5vcmcvc2hvd19idWcuY2dpP2lkPTkyODI2CisKKyAgICAgICAgUmV2aWV3ZWQgYnkgRXJpYyBT
ZWlkZWwuCisKKyAgICAgICAgVXNlIHBlcmZvcm1hbmNlLndlYmtpdE5vdyB3aXRoIERhdGUubm93
IGFzIGEgZmFsbGJhY2sgZm9yIG1vcmUgYWN1cmF0ZSB0aW1lIG1lYXN1cmVtZW50cy4KKworICAg
ICAgICAqIHJlc291cmNlcy9ydW5uZXIuanM6CisgICAgICAgIChQZXJmVGVzdFJ1bm5lci5fcnVu
bmVyKToKKyAgICAgICAgKFBlcmZUZXN0UnVubmVyLl9wZXJTZWNvbmRSdW5uZXJJdGVyYXRvcik6
CisKKzIwMTItMDgtMDcgIFJ5b3N1a2UgTml3YSAgPHJuaXdhQHdlYmtpdC5vcmc+CisKICAgICAg
ICAgcnVuLXBlcmYtdGVzdHMgc2hvdWxkIHN1cHBvcnQgLS1uby1zaG93LXJlc3VsdHMKICAgICAg
ICAgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTkzNDA5CiAKSW5kZXg6
IFBlcmZvcm1hbmNlVGVzdHMvcmVzb3VyY2VzL3J1bm5lci5qcwo9PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBQZXJm
b3JtYW5jZVRlc3RzL3Jlc291cmNlcy9ydW5uZXIuanMJKHJldmlzaW9uIDEyNDk1MSkKKysrIFBl
cmZvcm1hbmNlVGVzdHMvcmVzb3VyY2VzL3J1bm5lci5qcwkod29ya2luZyBjb3B5KQpAQCAtMjMs
NiArMjMsOCBAQAogICAgIHJldHVybiAocmFuZG9tU2VlZCAmIDB4ZmZmZmZmZikgLyAweDEwMDAw
MDAwOwogfTsKIAorUGVyZlRlc3RSdW5uZXIubm93ID0gd2luZG93LnBlcmZvcm1hbmNlICYmIHdp
bmRvdy5wZXJmb3JtYW5jZS53ZWJraXROb3cgPyB3aW5kb3cucGVyZm9ybWFuY2Uud2Via2l0Tm93
IDogRGF0ZS5ub3c7CisKIFBlcmZUZXN0UnVubmVyLmxvZyA9IGZ1bmN0aW9uICh0ZXh0KSB7CiAg
ICAgaWYgKHRoaXMuX2xvZ0xpbmVzKSB7CiAgICAgICAgIHRoaXMuX2xvZ0xpbmVzLnB1c2godGV4
dCk7CkBAIC0xMzcsNyArMTM5LDcgQEAKIH0KIAogUGVyZlRlc3RSdW5uZXIuX3J1bm5lciA9IGZ1
bmN0aW9uICgpIHsKLSAgICB2YXIgc3RhcnQgPSBEYXRlLm5vdygpOworICAgIHZhciBzdGFydCA9
IHRoaXMubm93KCk7CiAgICAgdmFyIHRvdGFsVGltZSA9IDA7CiAKICAgICBmb3IgKHZhciBpID0g
MDsgaSA8IHRoaXMuX2xvb3BzUGVyUnVuOyArK2kpIHsKQEAgLTE1MCw3ICsxNTIsNyBAQAogICAg
IH0KIAogICAgIC8vIEFzc3VtZSB0b3RhbFRpbWUgY2FuIG5ldmVyIGJlIHplcm8gd2hlbiBfcnVu
RnVuY3Rpb24gcmV0dXJucyBhIG51bWJlci4KLSAgICB2YXIgdGltZSA9IHRvdGFsVGltZSA/IHRv
dGFsVGltZSA6IERhdGUubm93KCkgLSBzdGFydDsKKyAgICB2YXIgdGltZSA9IHRvdGFsVGltZSA/
IHRvdGFsVGltZSA6IHRoaXMubm93KCkgLSBzdGFydDsKIAogICAgIHRoaXMuaWdub3JlV2FybVVw
QW5kTG9nKHRpbWUpOwogICAgIHRoaXMuX3J1bkxvb3AoKTsKQEAgLTIyMSwxMCArMjIzLDEwIEBA
CiB9CiAKIFBlcmZUZXN0UnVubmVyLl9wZXJTZWNvbmRSdW5uZXJJdGVyYXRvciA9IGZ1bmN0aW9u
IChjYWxsc1Blckl0ZXJhdGlvbikgewotICAgIHZhciBzdGFydFRpbWUgPSBEYXRlLm5vdygpOwor
ICAgIHZhciBzdGFydFRpbWUgPSB0aGlzLm5vdygpOwogICAgIGZvciAodmFyIGkgPSAwOyBpIDwg
Y2FsbHNQZXJJdGVyYXRpb247IGkrKykKICAgICAgICAgdGhpcy5fdGVzdC5ydW4oKTsKLSAgICBy
ZXR1cm4gRGF0ZS5ub3coKSAtIHN0YXJ0VGltZTsKKyAgICByZXR1cm4gdGhpcy5ub3coKSAtIHN0
YXJ0VGltZTsKIH0KIAogaWYgKHdpbmRvdy50ZXN0UnVubmVyKSB7CkluZGV4OiBUb29scy9TY3Jp
cHRzL3dlYmtpdHB5L2NvbW1vbi9zeXN0ZW0vZmlsZXN5c3RlbS5weQo9PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBU
b29scy9TY3JpcHRzL3dlYmtpdHB5L2NvbW1vbi9zeXN0ZW0vZmlsZXN5c3RlbS5weQkocmV2aXNp
b24gMTI0OTUxKQorKysgVG9vbHMvU2NyaXB0cy93ZWJraXRweS9jb21tb24vc3lzdGVtL2ZpbGVz
eXN0ZW0ucHkJKHdvcmtpbmcgY29weSkKQEAgLTc1LDYgKzc1LDkgQEAKICAgICBkZWYgY29weWZp
bGUoc2VsZiwgc291cmNlLCBkZXN0aW5hdGlvbik6CiAgICAgICAgIHNodXRpbC5jb3B5ZmlsZShz
b3VyY2UsIGRlc3RpbmF0aW9uKQogCisgICAgZGVmIGNvcHl0cmVlKHNlbGYsIHNvdXJjZSwgZGVz
dGluYXRpb24pOgorICAgICAgICBzaHV0aWwuY29weXRyZWUoc291cmNlLCBkZXN0aW5hdGlvbikK
KwogICAgIGRlZiBkaXJuYW1lKHNlbGYsIHBhdGgpOgogICAgICAgICByZXR1cm4gb3MucGF0aC5k
aXJuYW1lKHBhdGgpCiAKSW5kZXg6IFRvb2xzL1NjcmlwdHMvd2Via2l0cHkvY29tbW9uL25ldC9i
dWd6aWxsYS9idWd6aWxsYS5weQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBUb29scy9TY3JpcHRzL3dlYmtpdHB5
L2NvbW1vbi9uZXQvYnVnemlsbGEvYnVnemlsbGEucHkJKHJldmlzaW9uIDEyNDk1MSkKKysrIFRv
b2xzL1NjcmlwdHMvd2Via2l0cHkvY29tbW9uL25ldC9idWd6aWxsYS9idWd6aWxsYS5weQkod29y
a2luZyBjb3B5KQpAQCAtNTc4LDE5ICs1NzgsMTQgQEAKICAgICAgICAgICAgIHJldHVybiBmaWxl
X29iamVjdC5uYW1lCiAgICAgICAgIHJldHVybiAiYnVnLSVzLSVzLiVzIiAlIChidWdfaWQsIHRp
bWVzdGFtcCgpLCBleHRlbnNpb24pCiAKLSAgICBkZWYgYWRkX2F0dGFjaG1lbnRfdG9fYnVnKHNl
bGYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWdfaWQsCi0gICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICBmaWxlX29yX3N0cmluZywKLSAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgIGRlc2NyaXB0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZW5h
bWU9Tm9uZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1lbnRfdGV4dD1Ob25l
KToKKyAgICBkZWYgYWRkX2F0dGFjaG1lbnRfdG9fYnVnKHNlbGYsIGJ1Z19pZCwgZmlsZV9vcl9z
dHJpbmcsIGRlc2NyaXB0aW9uLCBmaWxlbmFtZT1Ob25lLCBjb21tZW50X3RleHQ9Tm9uZSwgbWlt
ZXR5cGU9Tm9uZSk6CiAgICAgICAgIHNlbGYuYXV0aGVudGljYXRlKCkKICAgICAgICAgbG9nKCdB
ZGRpbmcgYXR0YWNobWVudCAiJXMiIHRvICVzJyAlIChkZXNjcmlwdGlvbiwgc2VsZi5idWdfdXJs
X2Zvcl9idWdfaWQoYnVnX2lkKSkpCiAgICAgICAgIHNlbGYuYnJvd3Nlci5vcGVuKHNlbGYuYWRk
X2F0dGFjaG1lbnRfdXJsKGJ1Z19pZCkpCiAgICAgICAgIHNlbGYuYnJvd3Nlci5zZWxlY3RfZm9y
bShuYW1lPSJlbnRyeWZvcm0iKQogICAgICAgICBmaWxlX29iamVjdCA9IHNlbGYuX2ZpbGVfb2Jq
ZWN0X2Zvcl91cGxvYWQoZmlsZV9vcl9zdHJpbmcpCiAgICAgICAgIGZpbGVuYW1lID0gZmlsZW5h
bWUgb3Igc2VsZi5fZmlsZW5hbWVfZm9yX3VwbG9hZChmaWxlX29iamVjdCwgYnVnX2lkKQotICAg
ICAgICBzZWxmLl9maWxsX2F0dGFjaG1lbnRfZm9ybShkZXNjcmlwdGlvbiwgZmlsZV9vYmplY3Qs
IGZpbGVuYW1lPWZpbGVuYW1lKQorICAgICAgICBzZWxmLl9maWxsX2F0dGFjaG1lbnRfZm9ybShk
ZXNjcmlwdGlvbiwgZmlsZV9vYmplY3QsIGZpbGVuYW1lPWZpbGVuYW1lLCBtaW1ldHlwZT1taW1l
dHlwZSkKICAgICAgICAgaWYgY29tbWVudF90ZXh0OgogICAgICAgICAgICAgbG9nKGNvbW1lbnRf
dGV4dCkKICAgICAgICAgICAgIHNlbGYuYnJvd3NlclsnY29tbWVudCddID0gY29tbWVudF90ZXh0
CkluZGV4OiBUb29scy9TY3JpcHRzL3dlYmtpdHB5L2NvbW1vbi9jb25maWcvaXJjLnB5Cj09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT0KLS0tIFRvb2xzL1NjcmlwdHMvd2Via2l0cHkvY29tbW9uL2NvbmZpZy9pcmMucHkJKHJl
dmlzaW9uIDEyNDk1MSkKKysrIFRvb2xzL1NjcmlwdHMvd2Via2l0cHkvY29tbW9uL2NvbmZpZy9p
cmMucHkJKHdvcmtpbmcgY29weSkKQEAgLTI4LDQgKzI4LDQgQEAKIAogc2VydmVyPSJpcmMuZnJl
ZW5vZGUubmV0IgogcG9ydD02NjY3Ci1jaGFubmVsPSIjd2Via2l0IgorY2hhbm5lbD0iI3dlYmtp
dC10ZXN0IgpJbmRleDogVG9vbHMvU2NyaXB0cy93ZWJraXRweS90b29sL2NvbW1hbmRzL19faW5p
dF9fLnB5Cj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT0KLS0tIFRvb2xzL1NjcmlwdHMvd2Via2l0cHkvdG9vbC9jb21tYW5k
cy9fX2luaXRfXy5weQkocmV2aXNpb24gMTI0OTUxKQorKysgVG9vbHMvU2NyaXB0cy93ZWJraXRw
eS90b29sL2NvbW1hbmRzL19faW5pdF9fLnB5CSh3b3JraW5nIGNvcHkpCkBAIC0xMiw2ICsxMiw3
IEBACiBmcm9tIHdlYmtpdHB5LnRvb2wuY29tbWFuZHMuZmluZHVzZXJzIGltcG9ydCBGaW5kVXNl
cnMKIGZyb20gd2Via2l0cHkudG9vbC5jb21tYW5kcy5nYXJkZW5vbWF0aWMgaW1wb3J0IEdhcmRl
bk9NYXRpYwogZnJvbSB3ZWJraXRweS50b29sLmNvbW1hbmRzLm9wZW5idWdzIGltcG9ydCBPcGVu
QnVncworZnJvbSB3ZWJraXRweS50b29sLmNvbW1hbmRzLnBlcmZhbGl6ZXIgaW1wb3J0IFBlcmZh
bGl6ZXIKIGZyb20gd2Via2l0cHkudG9vbC5jb21tYW5kcy5wcmV0dHlkaWZmIGltcG9ydCBQcmV0
dHlEaWZmCiBmcm9tIHdlYmtpdHB5LnRvb2wuY29tbWFuZHMucXVlcmllcyBpbXBvcnQgKgogZnJv
bSB3ZWJraXRweS50b29sLmNvbW1hbmRzLnF1ZXVlcyBpbXBvcnQgKgpJbmRleDogVG9vbHMvU2Ny
aXB0cy93ZWJraXRweS90b29sL2NvbW1hbmRzL3BlcmZhbGl6ZXIucHkKPT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0g
VG9vbHMvU2NyaXB0cy93ZWJraXRweS90b29sL2NvbW1hbmRzL3BlcmZhbGl6ZXIucHkJKHJldmlz
aW9uIDApCisrKyBUb29scy9TY3JpcHRzL3dlYmtpdHB5L3Rvb2wvY29tbWFuZHMvcGVyZmFsaXpl
ci5weQkocmV2aXNpb24gMCkKQEAgLTAsMCArMSwyMDkgQEAKKyMgQ29weXJpZ2h0IChjKSAyMDEy
IEdvb2dsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisjCisjIFJlZGlzdHJpYnV0aW9uIGFu
ZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorIyBtb2Rp
ZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRp
dGlvbnMgYXJlCisjIG1ldDoKKyMgCisjICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2Ug
Y29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisjIG5vdGljZSwgdGhpcyBsaXN0
IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyMgICAgICogUmVk
aXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorIyBj
b3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2lu
ZyBkaXNjbGFpbWVyCisjIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlh
bHMgcHJvdmlkZWQgd2l0aCB0aGUKKyMgZGlzdHJpYnV0aW9uLgorIyAgICAgKiBOZWl0aGVyIHRo
ZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisjIGNvbnRyaWJ1dG9y
cyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9t
CisjIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Np
b24uCisjIAorIyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9M
REVSUyBBTkQgQ09OVFJJQlVUT1JTCisjICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJ
RUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisjIExJTUlURUQgVE8sIFRIRSBJTVBM
SUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorIyBBIFBB
UlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENP
UFlSSUdIVAorIyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNU
LCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyMgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFV
RU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorIyBMSU1JVEVEIFRPLCBQUk9DVVJF
TUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyMgREFU
QSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBB
TkQgT04gQU5ZCisjIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNU
UklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyMgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVS
V0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisjIE9GIFRISVMgU09GVFdB
UkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisK
K2Zyb20gd2Via2l0cHkuY29tbW9uLnN5c3RlbS5kZXByZWNhdGVkX2xvZ2dpbmcgaW1wb3J0IGxv
ZworZnJvbSB3ZWJraXRweS50b29sLmJvdC5leHBlY3RlZGZhaWx1cmVzIGltcG9ydCBFeHBlY3Rl
ZEZhaWx1cmVzCitmcm9tIHdlYmtpdHB5LnRvb2wuYm90LmlyY19jb21tYW5kIGltcG9ydCBJUkND
b21tYW5kCitmcm9tIHdlYmtpdHB5LnRvb2wuYm90LmlyY19jb21tYW5kIGltcG9ydCBIZWxwCitm
cm9tIHdlYmtpdHB5LnRvb2wuYm90LmlyY19jb21tYW5kIGltcG9ydCBIaQorZnJvbSB3ZWJraXRw
eS50b29sLmJvdC5pcmNfY29tbWFuZCBpbXBvcnQgUmVzdGFydAorZnJvbSB3ZWJraXRweS50b29s
LmJvdC5pcmNib3QgaW1wb3J0IElSQ0JvdAorZnJvbSB3ZWJraXRweS50b29sLmJvdC5wYXRjaGFu
YWx5c2lzdGFzayBpbXBvcnQgUGF0Y2hBbmFseXNpc1Rhc2ssIFBhdGNoQW5hbHlzaXNUYXNrRGVs
ZWdhdGUsIFVuYWJsZVRvQXBwbHlQYXRjaAorZnJvbSB3ZWJraXRweS50b29sLmJvdC5zaGVyaWZm
IGltcG9ydCBTaGVyaWZmCitmcm9tIHdlYmtpdHB5LnRvb2wuY29tbWFuZHMucXVldWVzIGltcG9y
dCBBYnN0cmFjdFF1ZXVlCitmcm9tIHdlYmtpdHB5LnRvb2wuY29tbWFuZHMuc3RlcHNlcXVlbmNl
IGltcG9ydCBTdGVwU2VxdWVuY2VFcnJvckhhbmRsZXIKKworY2xhc3MgUGVyZmFsaXplclRhc2so
UGF0Y2hBbmFseXNpc1Rhc2spOgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCB0b29sLCBwYXRjaCwg
bG9nZ2VyKToKKyAgICAgICAgUGF0Y2hBbmFseXNpc1Rhc2suX19pbml0X18oc2VsZiwgc2VsZiwg
cGF0Y2gpCisgICAgICAgIHNlbGYuX3BvcnQgPSB0b29sLnBvcnRfZmFjdG9yeS5nZXQoKQorICAg
ICAgICBzZWxmLl90b29sID0gdG9vbAorICAgICAgICBzZWxmLl9sb2dnZXIgPSBsb2dnZXIKKwor
ICAgIGRlZiBfY29weV9idWlsZF9wcm9kdWN0X3dpdGhvdXRfcGF0Y2goc2VsZiwgcG9zdGZpeCk6
CisgICAgICAgIGZpbGVzeXN0ZW0gPSBzZWxmLl90b29sLmZpbGVzeXN0ZW0KKyAgICAgICAgY29u
ZmlndXJhdGlvbiA9IGZpbGVzeXN0ZW0uYmFzZW5hbWUoc2VsZi5fcG9ydC5fYnVpbGRfcGF0aCgp
KQorICAgICAgICBzZWxmLl9idWlsZF9wYXRoID0gZmlsZXN5c3RlbS5kaXJuYW1lKHNlbGYuX3Bv
cnQuX2J1aWxkX3BhdGgoKSkKKyAgICAgICAgc2VsZi5fYnVpbGRfcGF0aF93aXRob3V0X3BhdGNo
ID0gc2VsZi5fYnVpbGRfcGF0aCArIHBvc3RmaXgKKworICAgICAgICB0cnk6CisgICAgICAgICAg
ICBmaWxlc3lzdGVtLnJtdHJlZShzZWxmLl9idWlsZF9wYXRoX3dpdGhvdXRfcGF0Y2gpCisgICAg
ICAgICAgICBmaWxlc3lzdGVtLmNvcHl0cmVlKGZpbGVzeXN0ZW0uam9pbihzZWxmLl9idWlsZF9w
YXRoLCBjb25maWd1cmF0aW9uKSwKKyAgICAgICAgICAgICAgICBmaWxlc3lzdGVtLmpvaW4oc2Vs
Zi5fYnVpbGRfcGF0aF93aXRob3V0X3BhdGNoLCBjb25maWd1cmF0aW9uKSkKKyAgICAgICAgICAg
IHJldHVybiBUcnVlCisgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgIHJldHVybiBGYWxzZQor
CisgICAgZGVmIHJ1bihzZWxmKToKKyAgICAgICAgaWYgbm90IHNlbGYuX3BhdGNoLmNvbW1pdHRl
cigpIGFuZCBub3Qgc2VsZi5fcGF0Y2guYXR0YWNoZXIoKS5jYW5fY29tbWl0OgorICAgICAgICAg
ICAgc2VsZi5fbG9nZ2VyKCdUaGUgcGF0Y2ggJWQgaXMgbm90IGF1dGhvcml6ZWQgYnkgYSBjb21t
bWl0dGVyJyAlIHNlbGYuX3BhdGNoLmlkKCkpCisgICAgICAgICAgICByZXR1cm4gRmFsc2UKKwor
ICAgICAgICBzZWxmLl9sb2dnZXIoJ1ByZXBhcmluZyB0byBydW4gcGVyZm9ybWFuY2UgdGVzdHMg
Zm9yIHRoZSBhdHRhY2htZW50ICVkLi4uJyAlIHNlbGYuX3BhdGNoLmlkKCkpCisjICAgICAgICBp
ZiBub3Qgc2VsZi5fY2xlYW4oKSBvciBub3Qgc2VsZi5fdXBkYXRlKCk6CisjICAgICAgICAgICAg
cmV0dXJuIEZhbHNlCisKKyAgICAgICAgaGVhZF9yZXZpc2lvbiA9IHNlbGYuX3Rvb2wuc2NtKCku
aGVhZF9zdm5fcmV2aXNpb24oKQorCisgICAgICAgIHNlbGYuX2xvZ2dlcignQnVpbGRpbmcgV2Vi
S2l0IGF0IHIlcyB3aXRob3V0IHRoZSBwYXRjaCcgJSBoZWFkX3JldmlzaW9uKQorICAgICAgICBp
ZiBub3Qgc2VsZi5fYnVpbGQoKToKKyAgICAgICAgICAgIHJldHVybiBGYWxzZQorCisgICAgICAg
IGlmIG5vdCBzZWxmLl9wb3J0LmNoZWNrX2J1aWxkKG5lZWRzX2h0dHA9RmFsc2UpOgorICAgICAg
ICAgICAgc2VsZi5fbG9nZ2VyKCdGYWlsZWQgdG8gYnVpbGQgRHVtcFJlbmRlclRyZWUuJykKKyAg
ICAgICAgICAgIHJldHVybiBGYWxzZQorCisgICAgICAgIGlmIG5vdCBzZWxmLl9jb3B5X2J1aWxk
X3Byb2R1Y3Rfd2l0aG91dF9wYXRjaCgnLXInICsgaGVhZF9yZXZpc2lvbik6CisgICAgICAgICAg
ICBzZWxmLl9sb2dnZXIoJ0ZhaWxlZCB0byBjb3B5IHRoZSBidWlsZCBwcm9kdWN0IGZyb20gJXMg
dG8gJXMnICUgKHNlbGYuX2J1aWxkX3BhdGgsIHNlbGYuX2J1aWxkX3BhdGhfd2l0aG91dF9wYXRj
aCkpCisgICAgICAgICAgICByZXR1cm4gRmFsc2UKKworICAgICAgICBzZWxmLl9sb2dnZXIoJ0J1
aWxkaW5nIFdlYktpdCBhdCByJXMgd2l0aCB0aGUgcGF0Y2gnICUgaGVhZF9yZXZpc2lvbikKKyAg
ICAgICAgaWYgbm90IHNlbGYuX2FwcGx5KCkgb3Igbm90IHNlbGYuX2J1aWxkKCk6CisgICAgICAg
ICAgICByZXR1cm4gRmFsc2UKKworICAgICAgICBpZiBub3Qgc2VsZi5fcG9ydC5jaGVja19idWls
ZChuZWVkc19odHRwPUZhbHNlKToKKyAgICAgICAgICAgIHNlbGYuX2xvZ2dlcignRmFpbGVkIHRv
IGJ1aWxkIER1bXBSZW5kZXJUcmVlLicpCisgICAgICAgICAgICByZXR1cm4gRmFsc2UKKworICAg
ICAgICBmaWxlc3lzdGVtID0gc2VsZi5fdG9vbC5maWxlc3lzdGVtCisgICAgICAgIGZpbGVzeXN0
ZW0ucmVtb3ZlKHNlbGYuX2pzb25fcGF0aCgpKQorCisgICAgICAgIHNlbGYuX2xvZ2dlcigiUnVu
bmluZyBwZXJmb3JtYW5jZSB0ZXN0cy4uLiIpCisgICAgICAgIGlmIHNlbGYuX3J1bl9wZXJmX3Rl
c3Qoc2VsZi5fYnVpbGRfcGF0aF93aXRob3V0X3BhdGNoKSA8IDA6CisgICAgICAgICAgICBzZWxm
Ll9sb2dnZXIoJ0ZhaWxlZCB0byBydW4gcGVyZm9ybWFuY2UgdGVzdHMgd2l0aG91dCB0aGUgcGF0
Y2guJykKKyAgICAgICAgICAgIHJldHVybiBGYWxzZQorCisgICAgICAgIGlmIHNlbGYuX3J1bl9w
ZXJmX3Rlc3Qoc2VsZi5fYnVpbGRfcGF0aCkgPCAwOgorICAgICAgICAgICAgc2VsZi5fbG9nZ2Vy
KCdGYWlsZWQgdG8gcnVuIHBlcmZvcm1hbmNlIHRlc3RzIHdpdGggdGhlIHBhdGNoLicpCisgICAg
ICAgICAgICByZXR1cm4gRmFsc2UKKworICAgICAgICByZXN1bHRzX3BhZ2UgPSBmaWxlc3lzdGVt
LnJlYWRfdGV4dF9maWxlKHNlbGYuX3Jlc3VsdHNfcGFnZV9wYXRoKCkpCisgICAgICAgIHNlbGYu
X3Rvb2wuYnVncy5hZGRfYXR0YWNobWVudF90b19idWcoc2VsZi5fcGF0Y2guYnVnX2lkKCksIHJl
c3VsdHNfcGFnZSwKKyAgICAgICAgICAgIGRlc2NyaXB0aW9uPSJQZXJmb3JtYW5jZSB0ZXN0cyBy
ZXN1bHRzIGZvciAlZCIgJSBzZWxmLl9wYXRjaC5pZCgpLCBtaW1ldHlwZT0ndGV4dC9odG1sJykK
KworICAgICAgICBzZWxmLl9sb2dnZXIoIlVwbG9hZGVkIHRoZSByZXN1bHRzIG9uIHRoZSBidWcg
JWQiICUgc2VsZi5fcGF0Y2guYnVnX2lkKCkpCisgICAgICAgIHJldHVybiBUcnVlCisKKyAgICBk
ZWYgcGFyZW50X2NvbW1hbmQoc2VsZik6CisgICAgICAgIHJldHVybiAicGVyZmFsaXplciIKKwor
ICAgIGRlZiBydW5fd2Via2l0X3BhdGNoKHNlbGYsIGFyZ3MpOgorICAgICAgICB3ZWJraXRfcGF0
Y2hfYXJncyA9IFtzZWxmLl90b29sLnBhdGgoKV0KKyAgICAgICAgd2Via2l0X3BhdGNoX2FyZ3Mu
ZXh0ZW5kKGFyZ3MpCisgICAgICAgIHJldHVybiBzZWxmLl90b29sLmV4ZWN1dGl2ZS5ydW5fYW5k
X3Rocm93X2lmX2ZhaWwod2Via2l0X3BhdGNoX2FyZ3MsIGN3ZD1zZWxmLl90b29sLnNjbSgpLmNo
ZWNrb3V0X3Jvb3QpCisKKyAgICBkZWYgX2pzb25fcGF0aChzZWxmKToKKyAgICAgICAgcmV0dXJu
IHNlbGYuX3Rvb2wuZmlsZXN5c3RlbS5qb2luKHNlbGYuX2J1aWxkX3BhdGgsICdQZXJmb3JtYW5j
ZVRlc3RSZXN1bHRzLmpzb24nKQorCisgICAgZGVmIF9yZXN1bHRzX3BhZ2VfcGF0aChzZWxmKToK
KyAgICAgICAgcmV0dXJuIHNlbGYuX3Rvb2wuZmlsZXN5c3RlbS5qb2luKHNlbGYuX2J1aWxkX3Bh
dGgsICdQZXJmb3JtYW5jZVRlc3RSZXN1bHRzLmh0bWwnKQorCisgICAgZGVmIF9ydW5fcGVyZl90
ZXN0KHNlbGYsIGJ1aWxkX3BhdGgpOgorICAgICAgICBmaWxlc3lzdGVtID0gc2VsZi5fdG9vbC5m
aWxlc3lzdGVtCisgICAgICAgIHNjcmlwdF9wYXRoID0gZmlsZXN5c3RlbS5qb2luKGZpbGVzeXN0
ZW0uZGlybmFtZShzZWxmLl90b29sLnBhdGgoKSksICdydW4tcGVyZi10ZXN0cycpCisgICAgICAg
IHBlcmZfdGVzdF9ydW5uZXJfYXJncyA9IFtzY3JpcHRfcGF0aCwgJy0tbm8tYnVpbGQnLCAnLS1u
by1zaG93LXJlc3VsdHMnLCAnLS1idWlsZC1kaXJlY3RvcnknLCBidWlsZF9wYXRoLAorICAgICAg
ICAgICAgJy0tb3V0cHV0LWpzb24tcGF0aCcsIHNlbGYuX2pzb25fcGF0aCgpLCAnQ1NTJ10KKyAg
ICAgICAgcmV0dXJuIHNlbGYuX3Rvb2wuZXhlY3V0aXZlLnJ1bl9hbmRfdGhyb3dfaWZfZmFpbChw
ZXJmX3Rlc3RfcnVubmVyX2FyZ3MsIGN3ZD1zZWxmLl90b29sLnNjbSgpLmNoZWNrb3V0X3Jvb3Qp
CisKKyAgICBkZWYgcnVuX2NvbW1hbmQoc2VsZiwgY29tbWFuZCk6CisgICAgICAgIHNlbGYucnVu
X3dlYmtpdF9wYXRjaChjb21tYW5kKQorCisgICAgZGVmIGNvbW1hbmRfcGFzc2VkKHNlbGYsIG1l
c3NhZ2UsIHBhdGNoKToKKyAgICAgICAgcGFzcworCisgICAgZGVmIGNvbW1hbmRfZmFpbGVkKHNl
bGYsIG1lc3NhZ2UsIHNjcmlwdF9lcnJvciwgcGF0Y2gpOgorICAgICAgICBzZWxmLl9sb2dnZXIo
bWVzc2FnZSkKKworICAgIGRlZiByZWZldGNoX3BhdGNoKHNlbGYsIHBhdGNoKToKKyAgICAgICAg
cmV0dXJuIHNlbGYuX3Rvb2wuYnVncy5mZXRjaF9hdHRhY2htZW50KHBhdGNoLmlkKCkpCisKKyAg
ICBkZWYgZXhwZWN0ZWRfZmFpbHVyZXMoc2VsZik6CisgICAgICAgIHJldHVybiBFeHBlY3RlZEZh
aWx1cmVzKCkKKworICAgIGRlZiBidWlsZF9zdHlsZShzZWxmKToKKyAgICAgICAgcmV0dXJuICJy
ZWxlYXNlIgorCitjbGFzcyBQZXJmVGVzdChJUkNDb21tYW5kKToKKyAgICBkZWYgZXhlY3V0ZShz
ZWxmLCBuaWNrLCBhcmdzLCB0b29sLCBzaGVyaWZmKToKKyAgICAgICAgaWYgbm90IGFyZ3M6Cisg
ICAgICAgICAgICB0b29sLmlyYygpLnBvc3QobmljayArICI6IFBsZWFzZSBzcGVjaWZ5IGFuIGF0
dGFjaG1lbnQvcGF0Y2ggaWQiKQorICAgICAgICAgICAgcmV0dXJuCisKKyAgICAgICAgcGF0Y2hf
aWQgPSBhcmdzWzBdCisgICAgICAgIHBhdGNoID0gdG9vbC5idWdzLmZldGNoX2F0dGFjaG1lbnQo
cGF0Y2hfaWQpCisgICAgICAgIGlmIG5vdCBwYXRjaDoKKyAgICAgICAgICAgIHRvb2wuaXJjKCku
cG9zdChuaWNrICsgIjogQ291bGQgbm90IGZldGNoIHRoZSBwYXRjaCIpCisgICAgICAgICAgICBy
ZXR1cm4KKworICAgICAgICB0YXNrID0gUGVyZmFsaXplclRhc2sodG9vbCwgcGF0Y2gsIGxhbWJk
YSBtZXNzYWdlOiB0b29sLmlyYygpLnBvc3QoJyVzOiAlcycgJSAobmljaywgbWVzc2FnZSkpKQor
ICAgICAgICB0YXNrLnJ1bigpCisKK2NsYXNzIFBlcmZhbGl6ZXIoQWJzdHJhY3RRdWV1ZSwgU3Rl
cFNlcXVlbmNlRXJyb3JIYW5kbGVyKToKKyAgICBuYW1lID0gInBlcmZhbGl6ZXIiCisgICAgd2F0
Y2hlcnMgPSBBYnN0cmFjdFF1ZXVlLndhdGNoZXJzICsgWworICAgICAgICAicm5pd2FAd2Via2l0
Lm9yZyIKKyAgICBdCisKKyAgICBfY29tbWFuZHMgPSB7CisgICAgICAgICJoZWxwIjogSGVscCwK
KyAgICAgICAgImhpIjogSGksCisgICAgICAgICJyZXN0YXJ0IjogUmVzdGFydCwKKyAgICAgICAg
InRlc3QiIDogUGVyZlRlc3QsIAorICAgIH0KKworICAgICMgQWJzdHJhY3RRdWV1ZSBtZXRob2Rz
CisKKyAgICBkZWYgYmVnaW5fd29ya19xdWV1ZShzZWxmKToKKyAgICAgICAgQWJzdHJhY3RRdWV1
ZS5iZWdpbl93b3JrX3F1ZXVlKHNlbGYpCisgICAgICAgIHNlbGYuX3NoZXJpZmYgPSBTaGVyaWZm
KHNlbGYuX3Rvb2wsIHNlbGYpCisgICAgICAgIHNlbGYuX2lyY19ib3QgPSBJUkNCb3QoInBlcmZh
bGl6ZXIiLCBzZWxmLl90b29sLCBzZWxmLl9zaGVyaWZmLCBzZWxmLl9jb21tYW5kcykKKyAgICAg
ICAgc2VsZi5fdG9vbC5lbnN1cmVfaXJjX2Nvbm5lY3RlZChzZWxmLl9pcmNfYm90LmlyY19kZWxl
Z2F0ZSgpKQorCisgICAgZGVmIHdvcmtfaXRlbV9sb2dfcGF0aChzZWxmLCBmYWlsdXJlX21hcCk6
CisgICAgICAgIHJldHVybiBOb25lCisKKyAgICBkZWYgX2lzX29sZF9mYWlsdXJlKHNlbGYsIHJl
dmlzaW9uKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX3Rvb2wuc3RhdHVzX3NlcnZlci5zdm5fcmV2
aXNpb24ocmV2aXNpb24pCisKKyAgICBkZWYgbmV4dF93b3JrX2l0ZW0oc2VsZik6CisgICAgICAg
IHNlbGYuX2lyY19ib3QucHJvY2Vzc19wZW5kaW5nX21lc3NhZ2VzKCkKKyAgICAgICAgcmV0dXJu
CisKKyAgICBkZWYgcHJvY2Vzc193b3JrX2l0ZW0oc2VsZiwgZmFpbHVyZV9tYXApOgorICAgICAg
ICByZXR1cm4gVHJ1ZQorCisgICAgZGVmIGhhbmRsZV91bmV4cGVjdGVkX2Vycm9yKHNlbGYsIGZh
aWx1cmVfbWFwLCBtZXNzYWdlKToKKyAgICAgICAgbG9nKG1lc3NhZ2UpCisKKyAgICAjIFN0ZXBT
ZXF1ZW5jZUVycm9ySGFuZGxlciBtZXRob2RzCisKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYg
aGFuZGxlX3NjcmlwdF9lcnJvcihjbHMsIHRvb2wsIHN0YXRlLCBzY3JpcHRfZXJyb3IpOgorICAg
ICAgICAjIElkZWFsbHkgd2Ugd291bGQgcG9zdCBzb21lIGluZm9ybWF0aW9uIHRvIElSQyBhYm91
dCB3aGF0IHdlbnQgd3JvbmcKKyAgICAgICAgIyBoZXJlLCBidXQgd2UgZG9uJ3QgaGF2ZSB0aGUg
SVJDIHBhc3N3b3JkIGluIHRoZSBjaGlsZCBwcm9jZXNzLgorICAgICAgICBwYXNzCkluZGV4OiBU
b29scy9TY3JpcHRzL3dlYmtpdHB5L3Rvb2wvYm90L3BhdGNoYW5hbHlzaXN0YXNrLnB5Cj09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT0KLS0tIFRvb2xzL1NjcmlwdHMvd2Via2l0cHkvdG9vbC9ib3QvcGF0Y2hhbmFseXNpc3Rh
c2sucHkJKHJldmlzaW9uIDEyNDk1MSkKKysrIFRvb2xzL1NjcmlwdHMvd2Via2l0cHkvdG9vbC9i
b3QvcGF0Y2hhbmFseXNpc3Rhc2sucHkJKHdvcmtpbmcgY29weSkKQEAgLTEwNiw2ICsxMDYsNyBA
QAogICAgIGRlZiBfYXBwbHkoc2VsZik6CiAgICAgICAgIHJldHVybiBzZWxmLl9ydW5fY29tbWFu
ZChbCiAgICAgICAgICAgICAiYXBwbHktYXR0YWNobWVudCIsCisgICAgICAgICAgICAiLS1uby1j
bGVhbiIsCiAgICAgICAgICAgICAiLS1uby11cGRhdGUiLAogICAgICAgICAgICAgIi0tbm9uLWlu
dGVyYWN0aXZlIiwKICAgICAgICAgICAgIHNlbGYuX3BhdGNoLmlkKCksCg==
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>157087</attachid>
            <date>2012-08-07 19:25:20 -0700</date>
            <delta_ts>2012-08-08 16:53:29 -0700</delta_ts>
            <desc>Adds the initial implementation of perfalizer</desc>
            <filename>bug-92913-20120807192455.patch</filename>
            <type>text/plain</type>
            <size>13541</size>
            <attacher name="Ryosuke Niwa">rniwa</attacher>
            
              <data encoding="base64">SW5kZXg6IFRvb2xzL0NoYW5nZUxvZwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBUb29scy9DaGFuZ2VMb2cJKHJl
dmlzaW9uIDEyNDk2OSkKKysrIFRvb2xzL0NoYW5nZUxvZwkod29ya2luZyBjb3B5KQpAQCAtMSwz
ICsxLDQ1IEBACisyMDEyLTA4LTA3ICBSeW9zdWtlIE5pd2EgIDxybml3YUB3ZWJraXQub3JnPgor
CisgICAgICAgIEFkZCBQZXJmIEVXUyBJUkMgYm90CisgICAgICAgIGh0dHBzOi8vYnVncy53ZWJr
aXQub3JnL3Nob3dfYnVnLmNnaT9pZD05MjkxMworCisgICAgICAgIFJldmlld2VkIGJ5IE5PQk9E
WSAoT09QUyEpLgorCisgICAgICAgIEFkZHMgdGhlIHByZWxpbWluYXJ5IGltcGxlbWVudGF0aW9u
IG9mIHBlcmZhbGl6ZXIsIGEgSVJDIGJvdCB0aGF0IHJ1bnMgcGVyZm9ybWFuY2UgdGVzdHMKKyAg
ICAgICAgYmFzZWQgb24gSVJDIHJlcXVlc3RzLgorCisgICAgICAgICogU2NyaXB0cy93ZWJraXRw
eS9jb21tb24vbmV0L2J1Z3ppbGxhL2J1Z3ppbGxhLnB5OgorICAgICAgICAoQnVnemlsbGEuYWRk
X2F0dGFjaG1lbnRfdG9fYnVnKToKKyAgICAgICAgKiBTY3JpcHRzL3dlYmtpdHB5L2NvbW1vbi9z
eXN0ZW0vZmlsZXN5c3RlbS5weToKKyAgICAgICAgKEZpbGVTeXN0ZW0uY29weXRyZWUpOgorICAg
ICAgICAqIFNjcmlwdHMvd2Via2l0cHkvdG9vbC9jb21tYW5kcy9fX2luaXRfXy5weToKKyAgICAg
ICAgKiBTY3JpcHRzL3dlYmtpdHB5L3Rvb2wvY29tbWFuZHMvcGVyZmFsaXplci5weTogQWRkZWQu
CisgICAgICAgIChQZXJmYWxpemVyVGFzayk6CisgICAgICAgIChQZXJmYWxpemVyVGFzay5fX2lu
aXRfXyk6CisgICAgICAgIChQZXJmYWxpemVyVGFzay5fY29weV9idWlsZF9wcm9kdWN0X3dpdGhv
dXRfcGF0Y2gpOgorICAgICAgICAoUGVyZmFsaXplclRhc2sucnVuKToKKyAgICAgICAgKFBlcmZh
bGl6ZXJUYXNrLnBhcmVudF9jb21tYW5kKToKKyAgICAgICAgKFBlcmZhbGl6ZXJUYXNrLnJ1bl93
ZWJraXRfcGF0Y2gpOgorICAgICAgICAoUGVyZmFsaXplclRhc2suX2pzb25fcGF0aCk6CisgICAg
ICAgIChQZXJmYWxpemVyVGFzay5fcmVzdWx0c19wYWdlX3BhdGgpOgorICAgICAgICAoUGVyZmFs
aXplclRhc2suX3J1bl9wZXJmX3Rlc3QpOgorICAgICAgICAoUGVyZmFsaXplclRhc2sucnVuX2Nv
bW1hbmQpOgorICAgICAgICAoUGVyZmFsaXplclRhc2suY29tbWFuZF9wYXNzZWQpOgorICAgICAg
ICAoUGVyZmFsaXplclRhc2suY29tbWFuZF9mYWlsZWQpOgorICAgICAgICAoUGVyZmFsaXplclRh
c2sucmVmZXRjaF9wYXRjaCk6CisgICAgICAgIChQZXJmYWxpemVyVGFzay5leHBlY3RlZF9mYWls
dXJlcyk6CisgICAgICAgIChQZXJmYWxpemVyVGFzay5idWlsZF9zdHlsZSk6CisgICAgICAgIChQ
ZXJmVGVzdCk6CisgICAgICAgIChQZXJmVGVzdC5leGVjdXRlKToKKyAgICAgICAgKFBlcmZhbGl6
ZXIpOgorICAgICAgICAoUGVyZmFsaXplci5iZWdpbl93b3JrX3F1ZXVlKToKKyAgICAgICAgKFBl
cmZhbGl6ZXIud29ya19pdGVtX2xvZ19wYXRoKToKKyAgICAgICAgKFBlcmZhbGl6ZXIuX2lzX29s
ZF9mYWlsdXJlKToKKyAgICAgICAgKFBlcmZhbGl6ZXIubmV4dF93b3JrX2l0ZW0pOgorICAgICAg
ICAoUGVyZmFsaXplci5wcm9jZXNzX3dvcmtfaXRlbSk6CisgICAgICAgIChQZXJmYWxpemVyLmhh
bmRsZV91bmV4cGVjdGVkX2Vycm9yKToKKyAgICAgICAgKFBlcmZhbGl6ZXIuaGFuZGxlX3Njcmlw
dF9lcnJvcik6CisKIDIwMTItMDgtMDcgIERpcmsgUHJhbmtlICA8ZHByYW5rZUBjaHJvbWl1bS5v
cmc+CiAKICAgICAgICAgW05SV1RdIFdvdWxkIGxpa2UgYW4gb3V0cHV0IG1vZGUgc2ltaWxhciB0
byBPUldUIHZlcmJvc2Ugb25lCkluZGV4OiBUb29scy9TY3JpcHRzL3dlYmtpdHB5L2NvbW1vbi9u
ZXQvYnVnemlsbGEvYnVnemlsbGEucHkKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gVG9vbHMvU2NyaXB0cy93ZWJr
aXRweS9jb21tb24vbmV0L2J1Z3ppbGxhL2J1Z3ppbGxhLnB5CShyZXZpc2lvbiAxMjQ5NTEpCisr
KyBUb29scy9TY3JpcHRzL3dlYmtpdHB5L2NvbW1vbi9uZXQvYnVnemlsbGEvYnVnemlsbGEucHkJ
KHdvcmtpbmcgY29weSkKQEAgLTU3OCwxOSArNTc4LDE0IEBAIGNsYXNzIEJ1Z3ppbGxhKG9iamVj
dCk6CiAgICAgICAgICAgICByZXR1cm4gZmlsZV9vYmplY3QubmFtZQogICAgICAgICByZXR1cm4g
ImJ1Zy0lcy0lcy4lcyIgJSAoYnVnX2lkLCB0aW1lc3RhbXAoKSwgZXh0ZW5zaW9uKQogCi0gICAg
ZGVmIGFkZF9hdHRhY2htZW50X3RvX2J1ZyhzZWxmLAotICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgYnVnX2lkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZV9vcl9zdHJp
bmcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbiwKLSAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgIGZpbGVuYW1lPU5vbmUsCi0gICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICBjb21tZW50X3RleHQ9Tm9uZSk6CisgICAgZGVmIGFkZF9hdHRhY2htZW50X3Rv
X2J1ZyhzZWxmLCBidWdfaWQsIGZpbGVfb3Jfc3RyaW5nLCBkZXNjcmlwdGlvbiwgZmlsZW5hbWU9
Tm9uZSwgY29tbWVudF90ZXh0PU5vbmUsIG1pbWV0eXBlPU5vbmUpOgogICAgICAgICBzZWxmLmF1
dGhlbnRpY2F0ZSgpCiAgICAgICAgIGxvZygnQWRkaW5nIGF0dGFjaG1lbnQgIiVzIiB0byAlcycg
JSAoZGVzY3JpcHRpb24sIHNlbGYuYnVnX3VybF9mb3JfYnVnX2lkKGJ1Z19pZCkpKQogICAgICAg
ICBzZWxmLmJyb3dzZXIub3BlbihzZWxmLmFkZF9hdHRhY2htZW50X3VybChidWdfaWQpKQogICAg
ICAgICBzZWxmLmJyb3dzZXIuc2VsZWN0X2Zvcm0obmFtZT0iZW50cnlmb3JtIikKICAgICAgICAg
ZmlsZV9vYmplY3QgPSBzZWxmLl9maWxlX29iamVjdF9mb3JfdXBsb2FkKGZpbGVfb3Jfc3RyaW5n
KQogICAgICAgICBmaWxlbmFtZSA9IGZpbGVuYW1lIG9yIHNlbGYuX2ZpbGVuYW1lX2Zvcl91cGxv
YWQoZmlsZV9vYmplY3QsIGJ1Z19pZCkKLSAgICAgICAgc2VsZi5fZmlsbF9hdHRhY2htZW50X2Zv
cm0oZGVzY3JpcHRpb24sIGZpbGVfb2JqZWN0LCBmaWxlbmFtZT1maWxlbmFtZSkKKyAgICAgICAg
c2VsZi5fZmlsbF9hdHRhY2htZW50X2Zvcm0oZGVzY3JpcHRpb24sIGZpbGVfb2JqZWN0LCBmaWxl
bmFtZT1maWxlbmFtZSwgbWltZXR5cGU9bWltZXR5cGUpCiAgICAgICAgIGlmIGNvbW1lbnRfdGV4
dDoKICAgICAgICAgICAgIGxvZyhjb21tZW50X3RleHQpCiAgICAgICAgICAgICBzZWxmLmJyb3dz
ZXJbJ2NvbW1lbnQnXSA9IGNvbW1lbnRfdGV4dApJbmRleDogVG9vbHMvU2NyaXB0cy93ZWJraXRw
eS9jb21tb24vc3lzdGVtL2ZpbGVzeXN0ZW0ucHkKPT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gVG9vbHMvU2NyaXB0
cy93ZWJraXRweS9jb21tb24vc3lzdGVtL2ZpbGVzeXN0ZW0ucHkJKHJldmlzaW9uIDEyNDk1MSkK
KysrIFRvb2xzL1NjcmlwdHMvd2Via2l0cHkvY29tbW9uL3N5c3RlbS9maWxlc3lzdGVtLnB5CSh3
b3JraW5nIGNvcHkpCkBAIC03NSw2ICs3NSw5IEBAIGNsYXNzIEZpbGVTeXN0ZW0ob2JqZWN0KToK
ICAgICBkZWYgY29weWZpbGUoc2VsZiwgc291cmNlLCBkZXN0aW5hdGlvbik6CiAgICAgICAgIHNo
dXRpbC5jb3B5ZmlsZShzb3VyY2UsIGRlc3RpbmF0aW9uKQogCisgICAgZGVmIGNvcHl0cmVlKHNl
bGYsIHNvdXJjZSwgZGVzdGluYXRpb24pOgorICAgICAgICBzaHV0aWwuY29weXRyZWUoc291cmNl
LCBkZXN0aW5hdGlvbikKKwogICAgIGRlZiBkaXJuYW1lKHNlbGYsIHBhdGgpOgogICAgICAgICBy
ZXR1cm4gb3MucGF0aC5kaXJuYW1lKHBhdGgpCiAKSW5kZXg6IFRvb2xzL1NjcmlwdHMvd2Via2l0
cHkvdG9vbC9jb21tYW5kcy9fX2luaXRfXy5weQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBUb29scy9TY3JpcHRz
L3dlYmtpdHB5L3Rvb2wvY29tbWFuZHMvX19pbml0X18ucHkJKHJldmlzaW9uIDEyNDk1MSkKKysr
IFRvb2xzL1NjcmlwdHMvd2Via2l0cHkvdG9vbC9jb21tYW5kcy9fX2luaXRfXy5weQkod29ya2lu
ZyBjb3B5KQpAQCAtMTIsNiArMTIsNyBAQCBmcm9tIHdlYmtpdHB5LnRvb2wuY29tbWFuZHMuZXhw
ZWN0YXRpb25zCiBmcm9tIHdlYmtpdHB5LnRvb2wuY29tbWFuZHMuZmluZHVzZXJzIGltcG9ydCBG
aW5kVXNlcnMKIGZyb20gd2Via2l0cHkudG9vbC5jb21tYW5kcy5nYXJkZW5vbWF0aWMgaW1wb3J0
IEdhcmRlbk9NYXRpYwogZnJvbSB3ZWJraXRweS50b29sLmNvbW1hbmRzLm9wZW5idWdzIGltcG9y
dCBPcGVuQnVncworZnJvbSB3ZWJraXRweS50b29sLmNvbW1hbmRzLnBlcmZhbGl6ZXIgaW1wb3J0
IFBlcmZhbGl6ZXIKIGZyb20gd2Via2l0cHkudG9vbC5jb21tYW5kcy5wcmV0dHlkaWZmIGltcG9y
dCBQcmV0dHlEaWZmCiBmcm9tIHdlYmtpdHB5LnRvb2wuY29tbWFuZHMucXVlcmllcyBpbXBvcnQg
KgogZnJvbSB3ZWJraXRweS50b29sLmNvbW1hbmRzLnF1ZXVlcyBpbXBvcnQgKgpJbmRleDogVG9v
bHMvU2NyaXB0cy93ZWJraXRweS90b29sL2NvbW1hbmRzL3BlcmZhbGl6ZXIucHkKPT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PQotLS0gVG9vbHMvU2NyaXB0cy93ZWJraXRweS90b29sL2NvbW1hbmRzL3BlcmZhbGl6ZXIucHkJ
KHJldmlzaW9uIDApCisrKyBUb29scy9TY3JpcHRzL3dlYmtpdHB5L3Rvb2wvY29tbWFuZHMvcGVy
ZmFsaXplci5weQkocmV2aXNpb24gMCkKQEAgLTAsMCArMSwyMTAgQEAKKyMgQ29weXJpZ2h0IChj
KSAyMDEyIEdvb2dsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisjCisjIFJlZGlzdHJpYnV0
aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAor
IyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5n
IGNvbmRpdGlvbnMgYXJlCisjIG1ldDoKKyMKKyMgICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNv
dXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyMgbm90aWNlLCB0aGlz
IGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorIyAgICAg
KiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3Zl
CisjIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9s
bG93aW5nIGRpc2NsYWltZXIKKyMgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1h
dGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorIyBkaXN0cmlidXRpb24uCisjICAgICAqIE5laXRo
ZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyMgY29udHJp
YnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVk
IGZyb20KKyMgdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVy
bWlzc2lvbi4KKyMKKyMgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hU
IEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworIyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJ
TVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorIyBMSU1JVEVEIFRPLCBUSEUg
SU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyMg
QSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRI
RSBDT1BZUklHSFQKKyMgT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJ
UkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisjIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09O
U0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKyMgTElNSVRFRCBUTywgUFJP
Q1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisj
IERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVT
RUQgQU5EIE9OIEFOWQorIyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNU
LCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisjIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBP
VEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorIyBPRiBUSElTIFNP
RlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdF
LgorCitmcm9tIHdlYmtpdHB5LmNvbW1vbi5zeXN0ZW0uZGVwcmVjYXRlZF9sb2dnaW5nIGltcG9y
dCBsb2cKK2Zyb20gd2Via2l0cHkudG9vbC5ib3QuZXhwZWN0ZWRmYWlsdXJlcyBpbXBvcnQgRXhw
ZWN0ZWRGYWlsdXJlcworZnJvbSB3ZWJraXRweS50b29sLmJvdC5pcmNfY29tbWFuZCBpbXBvcnQg
SVJDQ29tbWFuZAorZnJvbSB3ZWJraXRweS50b29sLmJvdC5pcmNfY29tbWFuZCBpbXBvcnQgSGVs
cAorZnJvbSB3ZWJraXRweS50b29sLmJvdC5pcmNfY29tbWFuZCBpbXBvcnQgSGkKK2Zyb20gd2Vi
a2l0cHkudG9vbC5ib3QuaXJjX2NvbW1hbmQgaW1wb3J0IFJlc3RhcnQKK2Zyb20gd2Via2l0cHku
dG9vbC5ib3QuaXJjYm90IGltcG9ydCBJUkNCb3QKK2Zyb20gd2Via2l0cHkudG9vbC5ib3QucGF0
Y2hhbmFseXNpc3Rhc2sgaW1wb3J0IFBhdGNoQW5hbHlzaXNUYXNrLCBQYXRjaEFuYWx5c2lzVGFz
a0RlbGVnYXRlLCBVbmFibGVUb0FwcGx5UGF0Y2gKK2Zyb20gd2Via2l0cHkudG9vbC5ib3Quc2hl
cmlmZiBpbXBvcnQgU2hlcmlmZgorZnJvbSB3ZWJraXRweS50b29sLmNvbW1hbmRzLnF1ZXVlcyBp
bXBvcnQgQWJzdHJhY3RRdWV1ZQorZnJvbSB3ZWJraXRweS50b29sLmNvbW1hbmRzLnN0ZXBzZXF1
ZW5jZSBpbXBvcnQgU3RlcFNlcXVlbmNlRXJyb3JIYW5kbGVyCisKKworY2xhc3MgUGVyZmFsaXpl
clRhc2soUGF0Y2hBbmFseXNpc1Rhc2spOgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCB0b29sLCBw
YXRjaCwgbG9nZ2VyKToKKyAgICAgICAgUGF0Y2hBbmFseXNpc1Rhc2suX19pbml0X18oc2VsZiwg
c2VsZiwgcGF0Y2gpCisgICAgICAgIHNlbGYuX3BvcnQgPSB0b29sLnBvcnRfZmFjdG9yeS5nZXQo
KQorICAgICAgICBzZWxmLl90b29sID0gdG9vbAorICAgICAgICBzZWxmLl9sb2dnZXIgPSBsb2dn
ZXIKKworICAgIGRlZiBfY29weV9idWlsZF9wcm9kdWN0X3dpdGhvdXRfcGF0Y2goc2VsZiwgcG9z
dGZpeCk6CisgICAgICAgIGZpbGVzeXN0ZW0gPSBzZWxmLl90b29sLmZpbGVzeXN0ZW0KKyAgICAg
ICAgY29uZmlndXJhdGlvbiA9IGZpbGVzeXN0ZW0uYmFzZW5hbWUoc2VsZi5fcG9ydC5fYnVpbGRf
cGF0aCgpKQorICAgICAgICBzZWxmLl9idWlsZF9wYXRoID0gZmlsZXN5c3RlbS5kaXJuYW1lKHNl
bGYuX3BvcnQuX2J1aWxkX3BhdGgoKSkKKyAgICAgICAgc2VsZi5fYnVpbGRfcGF0aF93aXRob3V0
X3BhdGNoID0gc2VsZi5fYnVpbGRfcGF0aCArIHBvc3RmaXgKKworICAgICAgICB0cnk6CisgICAg
ICAgICAgICBmaWxlc3lzdGVtLnJtdHJlZShzZWxmLl9idWlsZF9wYXRoX3dpdGhvdXRfcGF0Y2gp
CisgICAgICAgICAgICBmaWxlc3lzdGVtLmNvcHl0cmVlKGZpbGVzeXN0ZW0uam9pbihzZWxmLl9i
dWlsZF9wYXRoLCBjb25maWd1cmF0aW9uKSwKKyAgICAgICAgICAgICAgICBmaWxlc3lzdGVtLmpv
aW4oc2VsZi5fYnVpbGRfcGF0aF93aXRob3V0X3BhdGNoLCBjb25maWd1cmF0aW9uKSkKKyAgICAg
ICAgICAgIHJldHVybiBUcnVlCisgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgIHJldHVybiBG
YWxzZQorCisgICAgZGVmIHJ1bihzZWxmKToKKyAgICAgICAgaWYgbm90IHNlbGYuX3BhdGNoLmNv
bW1pdHRlcigpIGFuZCBub3Qgc2VsZi5fcGF0Y2guYXR0YWNoZXIoKS5jYW5fY29tbWl0OgorICAg
ICAgICAgICAgc2VsZi5fbG9nZ2VyKCdUaGUgcGF0Y2ggJWQgaXMgbm90IGF1dGhvcml6ZWQgYnkg
YSBjb21tbWl0dGVyJyAlIHNlbGYuX3BhdGNoLmlkKCkpCisgICAgICAgICAgICByZXR1cm4gRmFs
c2UKKworICAgICAgICBzZWxmLl9sb2dnZXIoJ1ByZXBhcmluZyB0byBydW4gcGVyZm9ybWFuY2Ug
dGVzdHMgZm9yIHRoZSBhdHRhY2htZW50ICVkLi4uJyAlIHNlbGYuX3BhdGNoLmlkKCkpCisgICAg
ICAgIGlmIG5vdCBzZWxmLl9jbGVhbigpIG9yIG5vdCBzZWxmLl91cGRhdGUoKToKKyAgICAgICAg
ICAgIHJldHVybiBGYWxzZQorCisgICAgICAgIGhlYWRfcmV2aXNpb24gPSBzZWxmLl90b29sLnNj
bSgpLmhlYWRfc3ZuX3JldmlzaW9uKCkKKworICAgICAgICBzZWxmLl9sb2dnZXIoJ0J1aWxkaW5n
IFdlYktpdCBhdCByJXMgd2l0aG91dCB0aGUgcGF0Y2gnICUgaGVhZF9yZXZpc2lvbikKKyAgICAg
ICAgaWYgbm90IHNlbGYuX2J1aWxkKCk6CisgICAgICAgICAgICByZXR1cm4gRmFsc2UKKworICAg
ICAgICBpZiBub3Qgc2VsZi5fcG9ydC5jaGVja19idWlsZChuZWVkc19odHRwPUZhbHNlKToKKyAg
ICAgICAgICAgIHNlbGYuX2xvZ2dlcignRmFpbGVkIHRvIGJ1aWxkIER1bXBSZW5kZXJUcmVlLicp
CisgICAgICAgICAgICByZXR1cm4gRmFsc2UKKworICAgICAgICBpZiBub3Qgc2VsZi5fY29weV9i
dWlsZF9wcm9kdWN0X3dpdGhvdXRfcGF0Y2goJy1yJyArIGhlYWRfcmV2aXNpb24pOgorICAgICAg
ICAgICAgc2VsZi5fbG9nZ2VyKCdGYWlsZWQgdG8gY29weSB0aGUgYnVpbGQgcHJvZHVjdCBmcm9t
ICVzIHRvICVzJyAlIChzZWxmLl9idWlsZF9wYXRoLCBzZWxmLl9idWlsZF9wYXRoX3dpdGhvdXRf
cGF0Y2gpKQorICAgICAgICAgICAgcmV0dXJuIEZhbHNlCisKKyAgICAgICAgc2VsZi5fbG9nZ2Vy
KCdCdWlsZGluZyBXZWJLaXQgYXQgciVzIHdpdGggdGhlIHBhdGNoJyAlIGhlYWRfcmV2aXNpb24p
CisgICAgICAgIGlmIG5vdCBzZWxmLl9hcHBseSgpIG9yIG5vdCBzZWxmLl9idWlsZCgpOgorICAg
ICAgICAgICAgcmV0dXJuIEZhbHNlCisKKyAgICAgICAgaWYgbm90IHNlbGYuX3BvcnQuY2hlY2tf
YnVpbGQobmVlZHNfaHR0cD1GYWxzZSk6CisgICAgICAgICAgICBzZWxmLl9sb2dnZXIoJ0ZhaWxl
ZCB0byBidWlsZCBEdW1wUmVuZGVyVHJlZS4nKQorICAgICAgICAgICAgcmV0dXJuIEZhbHNlCisK
KyAgICAgICAgZmlsZXN5c3RlbSA9IHNlbGYuX3Rvb2wuZmlsZXN5c3RlbQorICAgICAgICBmaWxl
c3lzdGVtLnJlbW92ZShzZWxmLl9qc29uX3BhdGgoKSkKKworICAgICAgICBzZWxmLl9sb2dnZXIo
IlJ1bm5pbmcgcGVyZm9ybWFuY2UgdGVzdHMuLi4iKQorICAgICAgICBpZiBzZWxmLl9ydW5fcGVy
Zl90ZXN0KHNlbGYuX2J1aWxkX3BhdGhfd2l0aG91dF9wYXRjaCkgPCAwOgorICAgICAgICAgICAg
c2VsZi5fbG9nZ2VyKCdGYWlsZWQgdG8gcnVuIHBlcmZvcm1hbmNlIHRlc3RzIHdpdGhvdXQgdGhl
IHBhdGNoLicpCisgICAgICAgICAgICByZXR1cm4gRmFsc2UKKworICAgICAgICBpZiBzZWxmLl9y
dW5fcGVyZl90ZXN0KHNlbGYuX2J1aWxkX3BhdGgpIDwgMDoKKyAgICAgICAgICAgIHNlbGYuX2xv
Z2dlcignRmFpbGVkIHRvIHJ1biBwZXJmb3JtYW5jZSB0ZXN0cyB3aXRoIHRoZSBwYXRjaC4nKQor
ICAgICAgICAgICAgcmV0dXJuIEZhbHNlCisKKyAgICAgICAgcmVzdWx0c19wYWdlID0gZmlsZXN5
c3RlbS5yZWFkX3RleHRfZmlsZShzZWxmLl9yZXN1bHRzX3BhZ2VfcGF0aCgpKQorICAgICAgICBz
ZWxmLl90b29sLmJ1Z3MuYWRkX2F0dGFjaG1lbnRfdG9fYnVnKHNlbGYuX3BhdGNoLmJ1Z19pZCgp
LCByZXN1bHRzX3BhZ2UsCisgICAgICAgICAgICBkZXNjcmlwdGlvbj0iUGVyZm9ybWFuY2UgdGVz
dHMgcmVzdWx0cyBmb3IgJWQiICUgc2VsZi5fcGF0Y2guaWQoKSwgbWltZXR5cGU9J3RleHQvaHRt
bCcpCisKKyAgICAgICAgc2VsZi5fbG9nZ2VyKCJVcGxvYWRlZCB0aGUgcmVzdWx0cyBvbiB0aGUg
YnVnICVkIiAlIHNlbGYuX3BhdGNoLmJ1Z19pZCgpKQorICAgICAgICByZXR1cm4gVHJ1ZQorCisg
ICAgZGVmIHBhcmVudF9jb21tYW5kKHNlbGYpOgorICAgICAgICByZXR1cm4gInBlcmZhbGl6ZXIi
CisKKyAgICBkZWYgcnVuX3dlYmtpdF9wYXRjaChzZWxmLCBhcmdzKToKKyAgICAgICAgd2Via2l0
X3BhdGNoX2FyZ3MgPSBbc2VsZi5fdG9vbC5wYXRoKCldCisgICAgICAgIHdlYmtpdF9wYXRjaF9h
cmdzLmV4dGVuZChhcmdzKQorICAgICAgICByZXR1cm4gc2VsZi5fdG9vbC5leGVjdXRpdmUucnVu
X2FuZF90aHJvd19pZl9mYWlsKHdlYmtpdF9wYXRjaF9hcmdzLCBjd2Q9c2VsZi5fdG9vbC5zY20o
KS5jaGVja291dF9yb290KQorCisgICAgZGVmIF9qc29uX3BhdGgoc2VsZik6CisgICAgICAgIHJl
dHVybiBzZWxmLl90b29sLmZpbGVzeXN0ZW0uam9pbihzZWxmLl9idWlsZF9wYXRoLCAnUGVyZm9y
bWFuY2VUZXN0UmVzdWx0cy5qc29uJykKKworICAgIGRlZiBfcmVzdWx0c19wYWdlX3BhdGgoc2Vs
Zik6CisgICAgICAgIHJldHVybiBzZWxmLl90b29sLmZpbGVzeXN0ZW0uam9pbihzZWxmLl9idWls
ZF9wYXRoLCAnUGVyZm9ybWFuY2VUZXN0UmVzdWx0cy5odG1sJykKKworICAgIGRlZiBfcnVuX3Bl
cmZfdGVzdChzZWxmLCBidWlsZF9wYXRoKToKKyAgICAgICAgZmlsZXN5c3RlbSA9IHNlbGYuX3Rv
b2wuZmlsZXN5c3RlbQorICAgICAgICBzY3JpcHRfcGF0aCA9IGZpbGVzeXN0ZW0uam9pbihmaWxl
c3lzdGVtLmRpcm5hbWUoc2VsZi5fdG9vbC5wYXRoKCkpLCAncnVuLXBlcmYtdGVzdHMnKQorICAg
ICAgICBwZXJmX3Rlc3RfcnVubmVyX2FyZ3MgPSBbc2NyaXB0X3BhdGgsICctLW5vLWJ1aWxkJywg
Jy0tbm8tc2hvdy1yZXN1bHRzJywgJy0tYnVpbGQtZGlyZWN0b3J5JywgYnVpbGRfcGF0aCwKKyAg
ICAgICAgICAgICctLW91dHB1dC1qc29uLXBhdGgnLCBzZWxmLl9qc29uX3BhdGgoKV0KKyAgICAg
ICAgcmV0dXJuIHNlbGYuX3Rvb2wuZXhlY3V0aXZlLnJ1bl9hbmRfdGhyb3dfaWZfZmFpbChwZXJm
X3Rlc3RfcnVubmVyX2FyZ3MsIGN3ZD1zZWxmLl90b29sLnNjbSgpLmNoZWNrb3V0X3Jvb3QpCisK
KyAgICBkZWYgcnVuX2NvbW1hbmQoc2VsZiwgY29tbWFuZCk6CisgICAgICAgIHNlbGYucnVuX3dl
YmtpdF9wYXRjaChjb21tYW5kKQorCisgICAgZGVmIGNvbW1hbmRfcGFzc2VkKHNlbGYsIG1lc3Nh
Z2UsIHBhdGNoKToKKyAgICAgICAgcGFzcworCisgICAgZGVmIGNvbW1hbmRfZmFpbGVkKHNlbGYs
IG1lc3NhZ2UsIHNjcmlwdF9lcnJvciwgcGF0Y2gpOgorICAgICAgICBzZWxmLl9sb2dnZXIobWVz
c2FnZSkKKworICAgIGRlZiByZWZldGNoX3BhdGNoKHNlbGYsIHBhdGNoKToKKyAgICAgICAgcmV0
dXJuIHNlbGYuX3Rvb2wuYnVncy5mZXRjaF9hdHRhY2htZW50KHBhdGNoLmlkKCkpCisKKyAgICBk
ZWYgZXhwZWN0ZWRfZmFpbHVyZXMoc2VsZik6CisgICAgICAgIHJldHVybiBFeHBlY3RlZEZhaWx1
cmVzKCkKKworICAgIGRlZiBidWlsZF9zdHlsZShzZWxmKToKKyAgICAgICAgcmV0dXJuICJyZWxl
YXNlIgorCisKK2NsYXNzIFBlcmZUZXN0KElSQ0NvbW1hbmQpOgorICAgIGRlZiBleGVjdXRlKHNl
bGYsIG5pY2ssIGFyZ3MsIHRvb2wsIHNoZXJpZmYpOgorICAgICAgICBpZiBub3QgYXJnczoKKyAg
ICAgICAgICAgIHRvb2wuaXJjKCkucG9zdChuaWNrICsgIjogUGxlYXNlIHNwZWNpZnkgYW4gYXR0
YWNobWVudC9wYXRjaCBpZCIpCisgICAgICAgICAgICByZXR1cm4KKworICAgICAgICBwYXRjaF9p
ZCA9IGFyZ3NbMF0KKyAgICAgICAgcGF0Y2ggPSB0b29sLmJ1Z3MuZmV0Y2hfYXR0YWNobWVudChw
YXRjaF9pZCkKKyAgICAgICAgaWYgbm90IHBhdGNoOgorICAgICAgICAgICAgdG9vbC5pcmMoKS5w
b3N0KG5pY2sgKyAiOiBDb3VsZCBub3QgZmV0Y2ggdGhlIHBhdGNoIikKKyAgICAgICAgICAgIHJl
dHVybgorCisgICAgICAgIHRhc2sgPSBQZXJmYWxpemVyVGFzayh0b29sLCBwYXRjaCwgbGFtYmRh
IG1lc3NhZ2U6IHRvb2wuaXJjKCkucG9zdCgnJXM6ICVzJyAlIChuaWNrLCBtZXNzYWdlKSkpCisg
ICAgICAgIHRhc2sucnVuKCkKKworCitjbGFzcyBQZXJmYWxpemVyKEFic3RyYWN0UXVldWUsIFN0
ZXBTZXF1ZW5jZUVycm9ySGFuZGxlcik6CisgICAgbmFtZSA9ICJwZXJmYWxpemVyIgorICAgIHdh
dGNoZXJzID0gQWJzdHJhY3RRdWV1ZS53YXRjaGVycyArIFsicm5pd2FAd2Via2l0Lm9yZyJdCisK
KyAgICBfY29tbWFuZHMgPSB7CisgICAgICAgICJoZWxwIjogSGVscCwKKyAgICAgICAgImhpIjog
SGksCisgICAgICAgICJyZXN0YXJ0IjogUmVzdGFydCwKKyAgICAgICAgInRlc3QiOiBQZXJmVGVz
dCwKKyAgICB9CisKKyAgICAjIEFic3RyYWN0UXVldWUgbWV0aG9kcworCisgICAgZGVmIGJlZ2lu
X3dvcmtfcXVldWUoc2VsZik6CisgICAgICAgIEFic3RyYWN0UXVldWUuYmVnaW5fd29ya19xdWV1
ZShzZWxmKQorICAgICAgICBzZWxmLl9zaGVyaWZmID0gU2hlcmlmZihzZWxmLl90b29sLCBzZWxm
KQorICAgICAgICBzZWxmLl9pcmNfYm90ID0gSVJDQm90KCJwZXJmYWxpemVyIiwgc2VsZi5fdG9v
bCwgc2VsZi5fc2hlcmlmZiwgc2VsZi5fY29tbWFuZHMpCisgICAgICAgIHNlbGYuX3Rvb2wuZW5z
dXJlX2lyY19jb25uZWN0ZWQoc2VsZi5faXJjX2JvdC5pcmNfZGVsZWdhdGUoKSkKKworICAgIGRl
ZiB3b3JrX2l0ZW1fbG9nX3BhdGgoc2VsZiwgZmFpbHVyZV9tYXApOgorICAgICAgICByZXR1cm4g
Tm9uZQorCisgICAgZGVmIF9pc19vbGRfZmFpbHVyZShzZWxmLCByZXZpc2lvbik6CisgICAgICAg
IHJldHVybiBzZWxmLl90b29sLnN0YXR1c19zZXJ2ZXIuc3ZuX3JldmlzaW9uKHJldmlzaW9uKQor
CisgICAgZGVmIG5leHRfd29ya19pdGVtKHNlbGYpOgorICAgICAgICBzZWxmLl9pcmNfYm90LnBy
b2Nlc3NfcGVuZGluZ19tZXNzYWdlcygpCisgICAgICAgIHJldHVybgorCisgICAgZGVmIHByb2Nl
c3Nfd29ya19pdGVtKHNlbGYsIGZhaWx1cmVfbWFwKToKKyAgICAgICAgcmV0dXJuIFRydWUKKwor
ICAgIGRlZiBoYW5kbGVfdW5leHBlY3RlZF9lcnJvcihzZWxmLCBmYWlsdXJlX21hcCwgbWVzc2Fn
ZSk6CisgICAgICAgIGxvZyhtZXNzYWdlKQorCisgICAgIyBTdGVwU2VxdWVuY2VFcnJvckhhbmRs
ZXIgbWV0aG9kcworCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIGhhbmRsZV9zY3JpcHRfZXJy
b3IoY2xzLCB0b29sLCBzdGF0ZSwgc2NyaXB0X2Vycm9yKToKKyAgICAgICAgIyBJZGVhbGx5IHdl
IHdvdWxkIHBvc3Qgc29tZSBpbmZvcm1hdGlvbiB0byBJUkMgYWJvdXQgd2hhdCB3ZW50IHdyb25n
CisgICAgICAgICMgaGVyZSwgYnV0IHdlIGRvbid0IGhhdmUgdGhlIElSQyBwYXNzd29yZCBpbiB0
aGUgY2hpbGQgcHJvY2Vzcy4KKyAgICAgICAgcGFzcwo=
</data>

          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>157334</attachid>
            <date>2012-08-08 16:53:32 -0700</date>
            <delta_ts>2012-08-08 16:55:22 -0700</delta_ts>
            <desc>Added some tests per Dirk&apos;s comment</desc>
            <filename>bug-92913-20120808165306.patch</filename>
            <type>text/plain</type>
            <size>31389</size>
            <attacher name="Ryosuke Niwa">rniwa</attacher>
            
              <data encoding="base64">SW5kZXg6IFRvb2xzL0NoYW5nZUxvZwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBUb29scy9DaGFuZ2VMb2cJKHJl
dmlzaW9uIDEyNTExMykKKysrIFRvb2xzL0NoYW5nZUxvZwkod29ya2luZyBjb3B5KQpAQCAtMSwz
ICsxLDc4IEBACisyMDEyLTA4LTA4ICBSeW9zdWtlIE5pd2EgIDxybml3YUB3ZWJraXQub3JnPgor
CisgICAgICAgIEFkZCBQZXJmIEVXUyBJUkMgYm90CisgICAgICAgIGh0dHBzOi8vYnVncy53ZWJr
aXQub3JnL3Nob3dfYnVnLmNnaT9pZD05MjkxMworCisgICAgICAgIFJldmlld2VkIGJ5IE5PQk9E
WSAoT09QUyEpLgorCisgICAgICAgIEFkZHMgdGhlIHByZWxpbWluYXJ5IGltcGxlbWVudGF0aW9u
IG9mIHBlcmZhbGl6ZXIsIGEgSVJDIGJvdCB0aGF0IHJ1bnMgcGVyZm9ybWFuY2UgdGVzdHMKKyAg
ICAgICAgYmFzZWQgb24gSVJDIHJlcXVlc3RzLgorCisgICAgICAgICogU2NyaXB0cy93ZWJraXRw
eS9jb21tb24vY2hlY2tvdXQvc2NtL3NjbV9tb2NrLnB5OgorICAgICAgICAoTW9ja1NDTS5oZWFk
X3N2bl9yZXZpc2lvbik6IFRoZSBhY3R1YWwgaW1wbGVtZW50YXRpb24gcmV0dXJucyBzdHJpbmcs
IHNvIG1hdGNoIHRoYXQuCisgICAgICAgIChNb2NrU0NNLnN2bl9yZXZpc2lvbik6IERpdHRvLgor
ICAgICAgICAqIFNjcmlwdHMvd2Via2l0cHkvY29tbW9uL25ldC9idWd6aWxsYS9idWd6aWxsYS5w
eToKKyAgICAgICAgKEJ1Z3ppbGxhLmFkZF9hdHRhY2htZW50X3RvX2J1Zyk6IEFkZGVkIG1pbWV0
eXBlLgorICAgICAgICAqIFNjcmlwdHMvd2Via2l0cHkvY29tbW9uL25ldC9idWd6aWxsYS9idWd6
aWxsYV9tb2NrLnB5OgorICAgICAgICAoTW9ja0J1Z3ppbGxhLmFkZF9hdHRhY2htZW50X3RvX2J1
Zyk6IERpdHRvLgorICAgICAgICAqIFNjcmlwdHMvd2Via2l0cHkvY29tbW9uL3N5c3RlbS9maWxl
c3lzdGVtLnB5OgorICAgICAgICAoRmlsZVN5c3RlbS5jb3B5dHJlZSk6IEFkZGVkLgorICAgICAg
ICAqIFNjcmlwdHMvd2Via2l0cHkvY29tbW9uL3N5c3RlbS9maWxlc3lzdGVtX21vY2sucHk6Cisg
ICAgICAgIChNb2NrRmlsZVN5c3RlbS5jb3B5dHJlZSk6IEFkZGVkLgorICAgICAgICAqIFNjcmlw
dHMvd2Via2l0cHkvcGVyZm9ybWFuY2VfdGVzdHMvcGVyZnRlc3RzcnVubmVyX3VuaXR0ZXN0LnB5
OiBSZWJhc2VsaW5lZCB0ZXN0cworICAgICAgICB0aGF0IGhhZCBhc3N1bWVkIHJldmlzaW9uIG51
bWJlcnMgd2VyZSBpbnRlZ2Vycy4KKyAgICAgICAgKHRlc3RfcnVuX3dpdGhfanNvbl9vdXRwdXQp
OgorICAgICAgICAodGVzdF9ydW5fd2l0aF9kZXNjcmlwdGlvbik6CisgICAgICAgICh0ZXN0X3J1
bl9nZW5lcmF0ZXNfanNvbl9ieV9kZWZhdWx0KToKKyAgICAgICAgKHRlc3RfcnVuX2dlbmVyYXRl
c19hbmRfc2hvd19yZXN1bHRzX3BhZ2UpOgorICAgICAgICAodGVzdF9ydW5fd2l0aF9qc29uX3Nv
dXJjZSk6CisgICAgICAgICh0ZXN0X3J1bl93aXRoX211bHRpcGxlX3JlcG9zaXRvcmllcyk6Cisg
ICAgICAgICogU2NyaXB0cy93ZWJraXRweS90b29sL2JvdC9mbGFreXRlc3RyZXBvcnRlcl91bml0
dGVzdC5weToKKyAgICAgICAgKiBTY3JpcHRzL3dlYmtpdHB5L3Rvb2wvY29tbWFuZHMvX19pbml0
X18ucHk6CisgICAgICAgICogU2NyaXB0cy93ZWJraXRweS90b29sL2NvbW1hbmRzL3BlcmZhbGl6
ZXIucHk6IEFkZGVkLgorICAgICAgICAoUGVyZmFsaXplclRhc2spOgorICAgICAgICAoUGVyZmFs
aXplclRhc2suX19pbml0X18pOgorICAgICAgICAoUGVyZmFsaXplclRhc2suX2NvcHlfYnVpbGRf
cHJvZHVjdF93aXRob3V0X3BhdGNoKToKKyAgICAgICAgKFBlcmZhbGl6ZXJUYXNrLnJ1bik6Cisg
ICAgICAgIChQZXJmYWxpemVyVGFzay5wYXJlbnRfY29tbWFuZCk6CisgICAgICAgIChQZXJmYWxp
emVyVGFzay5ydW5fd2Via2l0X3BhdGNoKToKKyAgICAgICAgKFBlcmZhbGl6ZXJUYXNrLl9qc29u
X3BhdGgpOgorICAgICAgICAoUGVyZmFsaXplclRhc2suX3Jlc3VsdHNfcGFnZV9wYXRoKToKKyAg
ICAgICAgKFBlcmZhbGl6ZXJUYXNrLl9ydW5fcGVyZl90ZXN0KToKKyAgICAgICAgKFBlcmZhbGl6
ZXJUYXNrLnJ1bl9jb21tYW5kKToKKyAgICAgICAgKFBlcmZhbGl6ZXJUYXNrLmNvbW1hbmRfcGFz
c2VkKToKKyAgICAgICAgKFBlcmZhbGl6ZXJUYXNrLmNvbW1hbmRfZmFpbGVkKToKKyAgICAgICAg
KFBlcmZhbGl6ZXJUYXNrLnJlZmV0Y2hfcGF0Y2gpOgorICAgICAgICAoUGVyZmFsaXplclRhc2su
ZXhwZWN0ZWRfZmFpbHVyZXMpOgorICAgICAgICAoUGVyZmFsaXplclRhc2suYnVpbGRfc3R5bGUp
OgorICAgICAgICAoUGVyZlRlc3QpOiBJUkMgY29tbWFuZC4KKyAgICAgICAgKFBlcmZUZXN0LmV4
ZWN1dGUpOgorICAgICAgICAoUGVyZmFsaXplcik6IElSQyBib3QuCisgICAgICAgIChQZXJmYWxp
emVyLmJlZ2luX3dvcmtfcXVldWUpOgorICAgICAgICAoUGVyZmFsaXplci53b3JrX2l0ZW1fbG9n
X3BhdGgpOgorICAgICAgICAoUGVyZmFsaXplci5faXNfb2xkX2ZhaWx1cmUpOgorICAgICAgICAo
UGVyZmFsaXplci5uZXh0X3dvcmtfaXRlbSk6CisgICAgICAgIChQZXJmYWxpemVyLnByb2Nlc3Nf
d29ya19pdGVtKToKKyAgICAgICAgKFBlcmZhbGl6ZXIuaGFuZGxlX3VuZXhwZWN0ZWRfZXJyb3Ip
OgorICAgICAgICAoUGVyZmFsaXplci5oYW5kbGVfc2NyaXB0X2Vycm9yKToKKyAgICAgICAgKiBT
Y3JpcHRzL3dlYmtpdHB5L3Rvb2wvY29tbWFuZHMvcGVyZmFsaXplcl91bml0dGVzdC5weTogQWRk
ZWQuCisgICAgICAgIChQZXJmYWxpemVyVGFza1Rlc3QpOgorICAgICAgICAoUGVyZmFsaXplclRh
c2tUZXN0Ll9jcmVhdGVfYW5kX3J1bl9wZXJmYWxpemVyKToKKyAgICAgICAgKFBlcmZhbGl6ZXJU
YXNrVGVzdC5fY3JlYXRlX2FuZF9ydW5fcGVyZmFsaXplci5sb2dnZXIpOgorICAgICAgICAoUGVy
ZmFsaXplclRhc2tUZXN0Ll9jcmVhdGVfYW5kX3J1bl9wZXJmYWxpemVyLnJ1bl93ZWJraXRfcGF0
Y2gpOgorICAgICAgICAoUGVyZmFsaXplclRhc2tUZXN0Ll9jcmVhdGVfYW5kX3J1bl9wZXJmYWxp
emVyLnJ1bl9wZXJmX3Rlc3QpOgorICAgICAgICAoUGVyZmFsaXplclRhc2tUZXN0LnRlc3RfcnVu
KToKKyAgICAgICAgKFBlcmZhbGl6ZXJUYXNrVGVzdC50ZXN0X3J1bl93aXRoX2NsZWFuX2ZhaWxz
KToKKyAgICAgICAgKFBlcmZhbGl6ZXJUYXNrVGVzdC50ZXN0X3J1bl93aXRoX3VwZGF0ZV9mYWls
cyk6CisgICAgICAgIChQZXJmYWxpemVyVGFza1Rlc3QudGVzdF9ydW5fd2l0aF9idWlsZF9mYWls
cyk6CisgICAgICAgIChQZXJmYWxpemVyVGFza1Rlc3QudGVzdF9ydW5fd2l0aF9wZXJmX3Rlc3Rf
ZmFpbHMpOgorICAgICAgICAoUGVyZmFsaXplclRhc2tUZXN0LnRlc3RfcnVuX3dpdGhvdXRfcmVz
dWx0c19wYWdlKToKKyAgICAgICAgKiBTY3JpcHRzL3dlYmtpdHB5L3Rvb2wvY29tbWFuZHMvcXVl
dWVzX3VuaXR0ZXN0LnB5OgorICAgICAgICAoQWJzdHJhY3RQYXRjaFF1ZXVlVGVzdC50ZXN0X3Vw
bG9hZF9yZXN1bHRzX2FyY2hpdmVfZm9yX3BhdGNoKTogUmViYXNlbGluZWQuCisgICAgICAgICog
U2NyaXB0cy93ZWJraXRweS90b29sL2NvbW1hbmRzL3VwbG9hZF91bml0dGVzdC5weToKKyAgICAg
ICAgKHRlc3RfYXR0YWNoX3RvX2J1Zyk6IERpdHRvLgorICAgICAgICAodGVzdF9hdHRhY2hfdG9f
YnVnX25vX2Rlc2NyaXB0aW9uX29yX2NvbW1lbnQpOiBEaXR0by4KKwogMjAxMi0wOC0wOCAgQWxl
eGV5IFByb3NrdXJ5YWtvdiAgPGFwQGFwcGxlLmNvbT4KIAogICAgICAgICBbV0syXSBNaW5pQnJv
d3NlciBjcmFzaGVzIG9uIHF1aXQgaWYgYW55IHdpbmRvd3Mgd2VyZSBwcmV2aW91c2x5IGNsb3Nl
ZApJbmRleDogVG9vbHMvU2NyaXB0cy93ZWJraXRweS9jb21tb24vY2hlY2tvdXQvc2NtL3NjbV9t
b2NrLnB5Cj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT0KLS0tIFRvb2xzL1NjcmlwdHMvd2Via2l0cHkvY29tbW9uL2NoZWNr
b3V0L3NjbS9zY21fbW9jay5weQkocmV2aXNpb24gMTI0OTUxKQorKysgVG9vbHMvU2NyaXB0cy93
ZWJraXRweS9jb21tb24vY2hlY2tvdXQvc2NtL3NjbV9tb2NrLnB5CSh3b3JraW5nIGNvcHkpCkBA
IC02OSwxMCArNjksMTAgQEAgY2xhc3MgTW9ja1NDTShvYmplY3QpOgogICAgICAgICByZXR1cm4g
WyJNb2NrRmlsZTEiXQogCiAgICAgZGVmIGhlYWRfc3ZuX3JldmlzaW9uKHNlbGYpOgotICAgICAg
ICByZXR1cm4gMTIzNAorICAgICAgICByZXR1cm4gJzEyMzQnCiAKICAgICBkZWYgc3ZuX3Jldmlz
aW9uKHNlbGYsIHBhdGgpOgotICAgICAgICByZXR1cm4gNTY3OAorICAgICAgICByZXR1cm4gJzU2
NzgnCiAKICAgICBkZWYgY3JlYXRlX3BhdGNoKHNlbGYsIGdpdF9jb21taXQsIGNoYW5nZWRfZmls
ZXM9Tm9uZSk6CiAgICAgICAgIHJldHVybiAiUGF0Y2gxIgpJbmRleDogVG9vbHMvU2NyaXB0cy93
ZWJraXRweS9jb21tb24vbmV0L2J1Z3ppbGxhL2J1Z3ppbGxhLnB5Cj09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFRv
b2xzL1NjcmlwdHMvd2Via2l0cHkvY29tbW9uL25ldC9idWd6aWxsYS9idWd6aWxsYS5weQkocmV2
aXNpb24gMTI0OTUxKQorKysgVG9vbHMvU2NyaXB0cy93ZWJraXRweS9jb21tb24vbmV0L2J1Z3pp
bGxhL2J1Z3ppbGxhLnB5CSh3b3JraW5nIGNvcHkpCkBAIC01NzgsMTkgKzU3OCwxNCBAQCBjbGFz
cyBCdWd6aWxsYShvYmplY3QpOgogICAgICAgICAgICAgcmV0dXJuIGZpbGVfb2JqZWN0Lm5hbWUK
ICAgICAgICAgcmV0dXJuICJidWctJXMtJXMuJXMiICUgKGJ1Z19pZCwgdGltZXN0YW1wKCksIGV4
dGVuc2lvbikKIAotICAgIGRlZiBhZGRfYXR0YWNobWVudF90b19idWcoc2VsZiwKLSAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgIGJ1Z19pZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgIGZpbGVfb3Jfc3RyaW5nLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3Jp
cHRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlbmFtZT1Ob25lLAotICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWVudF90ZXh0PU5vbmUpOgorICAgIGRlZiBh
ZGRfYXR0YWNobWVudF90b19idWcoc2VsZiwgYnVnX2lkLCBmaWxlX29yX3N0cmluZywgZGVzY3Jp
cHRpb24sIGZpbGVuYW1lPU5vbmUsIGNvbW1lbnRfdGV4dD1Ob25lLCBtaW1ldHlwZT1Ob25lKToK
ICAgICAgICAgc2VsZi5hdXRoZW50aWNhdGUoKQogICAgICAgICBsb2coJ0FkZGluZyBhdHRhY2ht
ZW50ICIlcyIgdG8gJXMnICUgKGRlc2NyaXB0aW9uLCBzZWxmLmJ1Z191cmxfZm9yX2J1Z19pZChi
dWdfaWQpKSkKICAgICAgICAgc2VsZi5icm93c2VyLm9wZW4oc2VsZi5hZGRfYXR0YWNobWVudF91
cmwoYnVnX2lkKSkKICAgICAgICAgc2VsZi5icm93c2VyLnNlbGVjdF9mb3JtKG5hbWU9ImVudHJ5
Zm9ybSIpCiAgICAgICAgIGZpbGVfb2JqZWN0ID0gc2VsZi5fZmlsZV9vYmplY3RfZm9yX3VwbG9h
ZChmaWxlX29yX3N0cmluZykKICAgICAgICAgZmlsZW5hbWUgPSBmaWxlbmFtZSBvciBzZWxmLl9m
aWxlbmFtZV9mb3JfdXBsb2FkKGZpbGVfb2JqZWN0LCBidWdfaWQpCi0gICAgICAgIHNlbGYuX2Zp
bGxfYXR0YWNobWVudF9mb3JtKGRlc2NyaXB0aW9uLCBmaWxlX29iamVjdCwgZmlsZW5hbWU9Zmls
ZW5hbWUpCisgICAgICAgIHNlbGYuX2ZpbGxfYXR0YWNobWVudF9mb3JtKGRlc2NyaXB0aW9uLCBm
aWxlX29iamVjdCwgZmlsZW5hbWU9ZmlsZW5hbWUsIG1pbWV0eXBlPW1pbWV0eXBlKQogICAgICAg
ICBpZiBjb21tZW50X3RleHQ6CiAgICAgICAgICAgICBsb2coY29tbWVudF90ZXh0KQogICAgICAg
ICAgICAgc2VsZi5icm93c2VyWydjb21tZW50J10gPSBjb21tZW50X3RleHQKSW5kZXg6IFRvb2xz
L1NjcmlwdHMvd2Via2l0cHkvY29tbW9uL25ldC9idWd6aWxsYS9idWd6aWxsYV9tb2NrLnB5Cj09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT0KLS0tIFRvb2xzL1NjcmlwdHMvd2Via2l0cHkvY29tbW9uL25ldC9idWd6aWxsYS9i
dWd6aWxsYV9tb2NrLnB5CShyZXZpc2lvbiAxMjQ5NTEpCisrKyBUb29scy9TY3JpcHRzL3dlYmtp
dHB5L2NvbW1vbi9uZXQvYnVnemlsbGEvYnVnemlsbGFfbW9jay5weQkod29ya2luZyBjb3B5KQpA
QCAtMzkzLDEzICszOTMsOSBAQCBjbGFzcyBNb2NrQnVnemlsbGEob2JqZWN0KToKICAgICAgICAg
bG9nKCJNT0NLIGJ1ZyBjb21tZW50OiBidWdfaWQ9JXMsIGNjPSVzXG4tLS0gQmVnaW4gY29tbWVu
dCAtLS1cbiVzXG4tLS0gRW5kIGNvbW1lbnQgLS0tXG4iICUgKAogICAgICAgICAgICAgYnVnX2lk
LCBjYywgY29tbWVudF90ZXh0KSkKIAotICAgIGRlZiBhZGRfYXR0YWNobWVudF90b19idWcoc2Vs
ZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1Z19pZCwKLSAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgIGZpbGVfb3Jfc3RyaW5nLAotICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgZGVzY3JpcHRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlbmFt
ZT1Ob25lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWVudF90ZXh0PU5vbmUp
OgotICAgICAgICBsb2coIk1PQ0sgYWRkX2F0dGFjaG1lbnRfdG9fYnVnOiBidWdfaWQ9JXMsIGRl
c2NyaXB0aW9uPSVzIGZpbGVuYW1lPSVzIiAlIChidWdfaWQsIGRlc2NyaXB0aW9uLCBmaWxlbmFt
ZSkpCisgICAgZGVmIGFkZF9hdHRhY2htZW50X3RvX2J1ZyhzZWxmLCBidWdfaWQsIGZpbGVfb3Jf
c3RyaW5nLCBkZXNjcmlwdGlvbiwgZmlsZW5hbWU9Tm9uZSwgY29tbWVudF90ZXh0PU5vbmUsIG1p
bWV0eXBlPU5vbmUpOgorICAgICAgICBsb2coIk1PQ0sgYWRkX2F0dGFjaG1lbnRfdG9fYnVnOiBi
dWdfaWQ9JXMsIGRlc2NyaXB0aW9uPSVzIGZpbGVuYW1lPSVzIG1pbWV0eXBlPSVzIiAlCisgICAg
ICAgICAgICAoYnVnX2lkLCBkZXNjcmlwdGlvbiwgZmlsZW5hbWUsIG1pbWV0eXBlKSkKICAgICAg
ICAgaWYgY29tbWVudF90ZXh0OgogICAgICAgICAgICAgbG9nKCItLSBCZWdpbiBjb21tZW50IC0t
IikKICAgICAgICAgICAgIGxvZyhjb21tZW50X3RleHQpCkluZGV4OiBUb29scy9TY3JpcHRzL3dl
YmtpdHB5L2NvbW1vbi9zeXN0ZW0vZmlsZXN5c3RlbS5weQo9PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBUb29scy9T
Y3JpcHRzL3dlYmtpdHB5L2NvbW1vbi9zeXN0ZW0vZmlsZXN5c3RlbS5weQkocmV2aXNpb24gMTI0
OTUxKQorKysgVG9vbHMvU2NyaXB0cy93ZWJraXRweS9jb21tb24vc3lzdGVtL2ZpbGVzeXN0ZW0u
cHkJKHdvcmtpbmcgY29weSkKQEAgLTI2Miw2ICsyNjIsOSBAQCBjbGFzcyBGaWxlU3lzdGVtKG9i
amVjdCk6CiAgICAgICAgICIiIkRlbGV0ZSB0aGUgZGlyZWN0b3J5IHJvb3RlZCBhdCBwYXRoLCB3
aGV0aGVyIGVtcHR5IG9yIG5vdC4iIiIKICAgICAgICAgc2h1dGlsLnJtdHJlZShwYXRoLCBpZ25v
cmVfZXJyb3JzPVRydWUpCiAKKyAgICBkZWYgY29weXRyZWUoc2VsZiwgc291cmNlLCBkZXN0aW5h
dGlvbik6CisgICAgICAgIHNodXRpbC5jb3B5dHJlZShzb3VyY2UsIGRlc3RpbmF0aW9uKQorCiAg
ICAgZGVmIHNwbGl0KHNlbGYsIHBhdGgpOgogICAgICAgICAiIiJSZXR1cm4gKGRpcm5hbWUsIGJh
c2VuYW1lICsgJy4nICsgZXh0KSIiIgogICAgICAgICByZXR1cm4gb3MucGF0aC5zcGxpdChwYXRo
KQpJbmRleDogVG9vbHMvU2NyaXB0cy93ZWJraXRweS9jb21tb24vc3lzdGVtL2ZpbGVzeXN0ZW1f
bW9jay5weQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09Ci0tLSBUb29scy9TY3JpcHRzL3dlYmtpdHB5L2NvbW1vbi9zeXN0
ZW0vZmlsZXN5c3RlbV9tb2NrLnB5CShyZXZpc2lvbiAxMjQ5NTEpCisrKyBUb29scy9TY3JpcHRz
L3dlYmtpdHB5L2NvbW1vbi9zeXN0ZW0vZmlsZXN5c3RlbV9tb2NrLnB5CSh3b3JraW5nIGNvcHkp
CkBAIC0zNzgsNiArMzc4LDE2IEBAIGNsYXNzIE1vY2tGaWxlU3lzdGVtKG9iamVjdCk6CiAKICAg
ICAgICAgc2VsZi5kaXJzID0gc2V0KGZpbHRlcihsYW1iZGEgZDogbm90IGQuc3RhcnRzd2l0aChw
YXRoKSwgc2VsZi5kaXJzKSkKIAorICAgIGRlZiBjb3B5dHJlZShzZWxmLCBzb3VyY2UsIGRlc3Rp
bmF0aW9uKToKKyAgICAgICAgc291cmNlID0gc2VsZi5ub3JtcGF0aChzb3VyY2UpCisgICAgICAg
IGRlc3RpbmF0aW9uID0gc2VsZi5ub3JtcGF0aChkZXN0aW5hdGlvbikKKworICAgICAgICBmb3Ig
c291cmNlX2ZpbGUgaW4gc2VsZi5maWxlczoKKyAgICAgICAgICAgIGlmIHNvdXJjZV9maWxlLnN0
YXJ0c3dpdGgoc291cmNlKToKKyAgICAgICAgICAgICAgICBkZXN0aW5hdGlvbl9wYXRoID0gc2Vs
Zi5qb2luKGRlc3RpbmF0aW9uLCBzZWxmLnJlbHBhdGgoc291cmNlX2ZpbGUsIHNvdXJjZSkpCisg
ICAgICAgICAgICAgICAgc2VsZi5tYXliZV9tYWtlX2RpcmVjdG9yeShzZWxmLmRpcm5hbWUoZGVz
dGluYXRpb25fcGF0aCkpCisgICAgICAgICAgICAgICAgc2VsZi5maWxlc1tkZXN0aW5hdGlvbl9w
YXRoXSA9IHNlbGYuZmlsZXNbc291cmNlX2ZpbGVdCisKICAgICBkZWYgc3BsaXQoc2VsZiwgcGF0
aCk6CiAgICAgICAgIGlkeCA9IHBhdGgucmZpbmQoc2VsZi5zZXApCiAgICAgICAgIGlmIGlkeCA9
PSAtMToKSW5kZXg6IFRvb2xzL1NjcmlwdHMvd2Via2l0cHkvcGVyZm9ybWFuY2VfdGVzdHMvcGVy
ZnRlc3RzcnVubmVyX3VuaXR0ZXN0LnB5Cj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFRvb2xzL1NjcmlwdHMvd2Vi
a2l0cHkvcGVyZm9ybWFuY2VfdGVzdHMvcGVyZnRlc3RzcnVubmVyX3VuaXR0ZXN0LnB5CShyZXZp
c2lvbiAxMjQ5NTEpCisrKyBUb29scy9TY3JpcHRzL3dlYmtpdHB5L3BlcmZvcm1hbmNlX3Rlc3Rz
L3BlcmZ0ZXN0c3J1bm5lcl91bml0dGVzdC5weQkod29ya2luZyBjb3B5KQpAQCAtMjY4LDcgKzI2
OCw3IEBAIG1heCAxMTIwCiAgICAgICAgICAgICAidGltZXN0YW1wIjogMTIzNDU2Nzg5LCAicmVz
dWx0cyI6CiAgICAgICAgICAgICB7IkJpbmRpbmdzL2V2ZW50LXRhcmdldC13cmFwcGVyIjogeyJt
YXgiOiAxNTEwLCAiYXZnIjogMTQ4OS4wNSwgIm1lZGlhbiI6IDE0ODcsICJtaW4iOiAxNDcxLCAi
c3RkZXYiOiAxNC40NiwgInVuaXQiOiAibXMifSwKICAgICAgICAgICAgICJpbnNwZWN0b3IvcGFz
cy5odG1sOmdyb3VwX25hbWU6dGVzdF9uYW1lIjogNDJ9LAotICAgICAgICAgICAgIndlYmtpdC1y
ZXZpc2lvbiI6IDU2NzgsICJicmFuY2giOiAid2Via2l0LXRydW5rIn0pCisgICAgICAgICAgICAi
d2Via2l0LXJldmlzaW9uIjogIjU2NzgiLCAiYnJhbmNoIjogIndlYmtpdC10cnVuayJ9KQogCiAg
ICAgZGVmIHRlc3RfcnVuX3dpdGhfZGVzY3JpcHRpb24oc2VsZik6CiAgICAgICAgIHJ1bm5lciwg
cG9ydCA9IHNlbGYuY3JlYXRlX3J1bm5lcihhcmdzPVsnLS1vdXRwdXQtanNvbi1wYXRoPS9tb2Nr
LWNoZWNrb3V0L291dHB1dC5qc29uJywKQEAgLTI3OCw3ICsyNzgsNyBAQCBtYXggMTEyMAogICAg
ICAgICAgICAgInRpbWVzdGFtcCI6IDEyMzQ1Njc4OSwgImRlc2NyaXB0aW9uIjogInNvbWUgZGVz
Y3JpcHRpb24iLCAicmVzdWx0cyI6CiAgICAgICAgICAgICB7IkJpbmRpbmdzL2V2ZW50LXRhcmdl
dC13cmFwcGVyIjogeyJtYXgiOiAxNTEwLCAiYXZnIjogMTQ4OS4wNSwgIm1lZGlhbiI6IDE0ODcs
ICJtaW4iOiAxNDcxLCAic3RkZXYiOiAxNC40NiwgInVuaXQiOiAibXMifSwKICAgICAgICAgICAg
ICJpbnNwZWN0b3IvcGFzcy5odG1sOmdyb3VwX25hbWU6dGVzdF9uYW1lIjogNDJ9LAotICAgICAg
ICAgICAgIndlYmtpdC1yZXZpc2lvbiI6IDU2NzgsICJicmFuY2giOiAid2Via2l0LXRydW5rIn0p
CisgICAgICAgICAgICAid2Via2l0LXJldmlzaW9uIjogIjU2NzgiLCAiYnJhbmNoIjogIndlYmtp
dC10cnVuayJ9KQogCiAgICAgZGVmIGNyZWF0ZV9ydW5uZXJfYW5kX3NldHVwX3Jlc3VsdHNfdGVt
cGxhdGUoc2VsZiwgYXJncz1bXSk6CiAgICAgICAgIHJ1bm5lciwgcG9ydCA9IHNlbGYuY3JlYXRl
X3J1bm5lcihhcmdzKQpAQCAtMzEwLDcgKzMxMCw3IEBAIG1heCAxMTIwCiAgICAgICAgICAgICAi
dGltZXN0YW1wIjogMTIzNDU2Nzg5LCAicmVzdWx0cyI6CiAgICAgICAgICAgICB7IkJpbmRpbmdz
L2V2ZW50LXRhcmdldC13cmFwcGVyIjogeyJtYXgiOiAxNTEwLCAiYXZnIjogMTQ4OS4wNSwgIm1l
ZGlhbiI6IDE0ODcsICJtaW4iOiAxNDcxLCAic3RkZXYiOiAxNC40NiwgInVuaXQiOiAibXMifSwK
ICAgICAgICAgICAgICJpbnNwZWN0b3IvcGFzcy5odG1sOmdyb3VwX25hbWU6dGVzdF9uYW1lIjog
NDJ9LAotICAgICAgICAgICAgIndlYmtpdC1yZXZpc2lvbiI6IDU2NzgsICJicmFuY2giOiAid2Vi
a2l0LXRydW5rIn1dKQorICAgICAgICAgICAgIndlYmtpdC1yZXZpc2lvbiI6ICI1Njc4IiwgImJy
YW5jaCI6ICJ3ZWJraXQtdHJ1bmsifV0pCiAKICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGZpbGVz
eXN0ZW0uaXNmaWxlKG91dHB1dF9qc29uX3BhdGgpKQogICAgICAgICBzZWxmLmFzc2VydFRydWUo
ZmlsZXN5c3RlbS5pc2ZpbGUocmVzdWx0c19wYWdlX3BhdGgpKQpAQCAtMzI0LDcgKzMyNCw3IEBA
IG1heCAxMTIwCiAKICAgICAgICAgZXhwZWN0ZWRfZW50cnkgPSB7InRpbWVzdGFtcCI6IDEyMzQ1
Njc4OSwgInJlc3VsdHMiOiB7IkJpbmRpbmdzL2V2ZW50LXRhcmdldC13cmFwcGVyIjoKICAgICAg
ICAgICAgIHsibWF4IjogMTUxMCwgImF2ZyI6IDE0ODkuMDUsICJtZWRpYW4iOiAxNDg3LCAibWlu
IjogMTQ3MSwgInN0ZGV2IjogMTQuNDYsICJ1bml0IjogIm1zIn0sCi0gICAgICAgICAgICAiaW5z
cGVjdG9yL3Bhc3MuaHRtbDpncm91cF9uYW1lOnRlc3RfbmFtZSI6IDQyfSwgIndlYmtpdC1yZXZp
c2lvbiI6IDU2NzgsICJicmFuY2giOiAid2Via2l0LXRydW5rIn0KKyAgICAgICAgICAgICJpbnNw
ZWN0b3IvcGFzcy5odG1sOmdyb3VwX25hbWU6dGVzdF9uYW1lIjogNDJ9LCAid2Via2l0LXJldmlz
aW9uIjogIjU2NzgiLCAiYnJhbmNoIjogIndlYmtpdC10cnVuayJ9CiAKICAgICAgICAgc2VsZi5t
YXhEaWZmID0gTm9uZQogICAgICAgICBqc29uX291dHB1dCA9IHBvcnQuaG9zdC5maWxlc3lzdGVt
LnJlYWRfdGV4dF9maWxlKCcvbW9jay1jaGVja291dC9vdXRwdXQuanNvbicpCkBAIC0zNzMsNyAr
MzczLDcgQEAgbWF4IDExMjAKICAgICAgICAgICAgICJ0aW1lc3RhbXAiOiAxMjM0NTY3ODksICJy
ZXN1bHRzIjoKICAgICAgICAgICAgIHsiQmluZGluZ3MvZXZlbnQtdGFyZ2V0LXdyYXBwZXIiOiB7
Im1heCI6IDE1MTAsICJhdmciOiAxNDg5LjA1LCAibWVkaWFuIjogMTQ4NywgIm1pbiI6IDE0NzEs
ICJzdGRldiI6IDE0LjQ2LCAidW5pdCI6ICJtcyJ9LAogICAgICAgICAgICAgImluc3BlY3Rvci9w
YXNzLmh0bWw6Z3JvdXBfbmFtZTp0ZXN0X25hbWUiOiA0Mn0sCi0gICAgICAgICAgICAid2Via2l0
LXJldmlzaW9uIjogNTY3OCwgImJyYW5jaCI6ICJ3ZWJraXQtdHJ1bmsiLAorICAgICAgICAgICAg
IndlYmtpdC1yZXZpc2lvbiI6ICI1Njc4IiwgImJyYW5jaCI6ICJ3ZWJraXQtdHJ1bmsiLAogICAg
ICAgICAgICAgImtleSI6ICJ2YWx1ZSJ9KQogCiAgICAgZGVmIHRlc3RfcnVuX3dpdGhfYmFkX2pz
b25fc291cmNlKHNlbGYpOgpAQCAtMzk0LDcgKzM5NCw3IEBAIG1heCAxMTIwCiAgICAgICAgICAg
ICAidGltZXN0YW1wIjogMTIzNDU2Nzg5LCAicmVzdWx0cyI6CiAgICAgICAgICAgICB7IkJpbmRp
bmdzL2V2ZW50LXRhcmdldC13cmFwcGVyIjogeyJtYXgiOiAxNTEwLCAiYXZnIjogMTQ4OS4wNSwg
Im1lZGlhbiI6IDE0ODcsICJtaW4iOiAxNDcxLCAic3RkZXYiOiAxNC40NiwgInVuaXQiOiAibXMi
fSwKICAgICAgICAgICAgICJpbnNwZWN0b3IvcGFzcy5odG1sOmdyb3VwX25hbWU6dGVzdF9uYW1l
IjogNDIuMH0sCi0gICAgICAgICAgICAid2Via2l0LXJldmlzaW9uIjogNTY3OCwgInNvbWUtcmV2
aXNpb24iOiA1Njc4LCAiYnJhbmNoIjogIndlYmtpdC10cnVuayJ9KQorICAgICAgICAgICAgIndl
YmtpdC1yZXZpc2lvbiI6ICI1Njc4IiwgInNvbWUtcmV2aXNpb24iOiAiNTY3OCIsICJicmFuY2gi
OiAid2Via2l0LXRydW5rIn0pCiAKICAgICBkZWYgdGVzdF9ydW5fd2l0aF91cGxvYWRfanNvbihz
ZWxmKToKICAgICAgICAgcnVubmVyLCBwb3J0ID0gc2VsZi5jcmVhdGVfcnVubmVyKGFyZ3M9Wyct
LW91dHB1dC1qc29uLXBhdGg9L21vY2stY2hlY2tvdXQvb3V0cHV0Lmpzb24nLApJbmRleDogVG9v
bHMvU2NyaXB0cy93ZWJraXRweS90b29sL2JvdC9mbGFreXRlc3RyZXBvcnRlcl91bml0dGVzdC5w
eQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09Ci0tLSBUb29scy9TY3JpcHRzL3dlYmtpdHB5L3Rvb2wvYm90L2ZsYWt5dGVz
dHJlcG9ydGVyX3VuaXR0ZXN0LnB5CShyZXZpc2lvbiAxMjQ5NTEpCisrKyBUb29scy9TY3JpcHRz
L3dlYmtpdHB5L3Rvb2wvYm90L2ZsYWt5dGVzdHJlcG9ydGVyX3VuaXR0ZXN0LnB5CSh3b3JraW5n
IGNvcHkpCkBAIC0xMjUsNyArMTI1LDcgQEAgSWYgeW91IHdvdWxkIGxpa2UgdG8gdHJhY2sgdGhp
cyB0ZXN0IGZpeAogY29tcG9uZW50OiBUb29scyAvIFRlc3RzCiBjYzogYWJhcnRoQHdlYmtpdC5v
cmcKIGJsb2NrZWQ6IDUwODU2Ci1NT0NLIGFkZF9hdHRhY2htZW50X3RvX2J1ZzogYnVnX2lkPTYw
MDAxLCBkZXNjcmlwdGlvbj1GYWlsdXJlIGRpZmYgZnJvbSBtb2NrLWJvdC1pZCBmaWxlbmFtZT1m
YWlsdXJlLmRpZmYKK01PQ0sgYWRkX2F0dGFjaG1lbnRfdG9fYnVnOiBidWdfaWQ9NjAwMDEsIGRl
c2NyaXB0aW9uPUZhaWx1cmUgZGlmZiBmcm9tIG1vY2stYm90LWlkIGZpbGVuYW1lPWZhaWx1cmUu
ZGlmZiBtaW1ldHlwZT1Ob25lCiBNT0NLIGJ1ZyBjb21tZW50OiBidWdfaWQ9NTAwMDAsIGNjPU5v
bmUKIC0tLSBCZWdpbiBjb21tZW50IC0tLQogVGhlIGR1bW15LXF1ZXVlIGVuY291bnRlcmVkIHRo
ZSBmb2xsb3dpbmcgZmxha3kgdGVzdHMgd2hpbGUgcHJvY2Vzc2luZyBhdHRhY2htZW50IDEwMDAw
OgpJbmRleDogVG9vbHMvU2NyaXB0cy93ZWJraXRweS90b29sL2NvbW1hbmRzL19faW5pdF9fLnB5
Cj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT0KLS0tIFRvb2xzL1NjcmlwdHMvd2Via2l0cHkvdG9vbC9jb21tYW5kcy9fX2lu
aXRfXy5weQkocmV2aXNpb24gMTI0OTUxKQorKysgVG9vbHMvU2NyaXB0cy93ZWJraXRweS90b29s
L2NvbW1hbmRzL19faW5pdF9fLnB5CSh3b3JraW5nIGNvcHkpCkBAIC0xMiw2ICsxMiw3IEBAIGZy
b20gd2Via2l0cHkudG9vbC5jb21tYW5kcy5leHBlY3RhdGlvbnMKIGZyb20gd2Via2l0cHkudG9v
bC5jb21tYW5kcy5maW5kdXNlcnMgaW1wb3J0IEZpbmRVc2VycwogZnJvbSB3ZWJraXRweS50b29s
LmNvbW1hbmRzLmdhcmRlbm9tYXRpYyBpbXBvcnQgR2FyZGVuT01hdGljCiBmcm9tIHdlYmtpdHB5
LnRvb2wuY29tbWFuZHMub3BlbmJ1Z3MgaW1wb3J0IE9wZW5CdWdzCitmcm9tIHdlYmtpdHB5LnRv
b2wuY29tbWFuZHMucGVyZmFsaXplciBpbXBvcnQgUGVyZmFsaXplcgogZnJvbSB3ZWJraXRweS50
b29sLmNvbW1hbmRzLnByZXR0eWRpZmYgaW1wb3J0IFByZXR0eURpZmYKIGZyb20gd2Via2l0cHku
dG9vbC5jb21tYW5kcy5xdWVyaWVzIGltcG9ydCAqCiBmcm9tIHdlYmtpdHB5LnRvb2wuY29tbWFu
ZHMucXVldWVzIGltcG9ydCAqCkluZGV4OiBUb29scy9TY3JpcHRzL3dlYmtpdHB5L3Rvb2wvY29t
bWFuZHMvcGVyZmFsaXplci5weQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBUb29scy9TY3JpcHRzL3dlYmtpdHB5
L3Rvb2wvY29tbWFuZHMvcGVyZmFsaXplci5weQkocmV2aXNpb24gMCkKKysrIFRvb2xzL1Njcmlw
dHMvd2Via2l0cHkvdG9vbC9jb21tYW5kcy9wZXJmYWxpemVyLnB5CShyZXZpc2lvbiAwKQpAQCAt
MCwwICsxLDIxNSBAQAorIyBDb3B5cmlnaHQgKGMpIDIwMTIgR29vZ2xlIEluYy4gQWxsIHJpZ2h0
cyByZXNlcnZlZC4KKyMKKyMgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJp
bmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisjIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRl
ZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKyMgbWV0OgorIwor
IyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFi
b3ZlIGNvcHlyaWdodAorIyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUg
Zm9sbG93aW5nIGRpc2NsYWltZXIuCisjICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkg
Zm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyMgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBs
aXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorIyBpbiB0aGUg
ZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisj
IGRpc3RyaWJ1dGlvbi4KKyMgICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBu
b3IgdGhlIG5hbWVzIG9mIGl0cworIyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3Jz
ZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorIyB0aGlzIHNvZnR3YXJlIHdpdGhv
dXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorIworIyBUSElTIFNPRlRXQVJF
IElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisj
ICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5H
LCBCVVQgTk9UCisjIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hB
TlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorIyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElT
Q0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorIyBPV05FUiBPUiBDT05U
UklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwK
KyMgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElO
RywgQlVUIE5PVAorIyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RT
IE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyMgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5F
U1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisjIFRIRU9SWSBPRiBM
SUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQK
KyMgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZ
IE9VVCBPRiBUSEUgVVNFCisjIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBU
SEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKK2Zyb20gd2Via2l0cHkuY29tbW9uLnN5
c3RlbS5kZXByZWNhdGVkX2xvZ2dpbmcgaW1wb3J0IGxvZworZnJvbSB3ZWJraXRweS50b29sLmJv
dC5leHBlY3RlZGZhaWx1cmVzIGltcG9ydCBFeHBlY3RlZEZhaWx1cmVzCitmcm9tIHdlYmtpdHB5
LnRvb2wuYm90LmlyY19jb21tYW5kIGltcG9ydCBJUkNDb21tYW5kCitmcm9tIHdlYmtpdHB5LnRv
b2wuYm90LmlyY19jb21tYW5kIGltcG9ydCBIZWxwCitmcm9tIHdlYmtpdHB5LnRvb2wuYm90Lmly
Y19jb21tYW5kIGltcG9ydCBIaQorZnJvbSB3ZWJraXRweS50b29sLmJvdC5pcmNfY29tbWFuZCBp
bXBvcnQgUmVzdGFydAorZnJvbSB3ZWJraXRweS50b29sLmJvdC5pcmNib3QgaW1wb3J0IElSQ0Jv
dAorZnJvbSB3ZWJraXRweS50b29sLmJvdC5wYXRjaGFuYWx5c2lzdGFzayBpbXBvcnQgUGF0Y2hB
bmFseXNpc1Rhc2ssIFBhdGNoQW5hbHlzaXNUYXNrRGVsZWdhdGUsIFVuYWJsZVRvQXBwbHlQYXRj
aAorZnJvbSB3ZWJraXRweS50b29sLmJvdC5zaGVyaWZmIGltcG9ydCBTaGVyaWZmCitmcm9tIHdl
YmtpdHB5LnRvb2wuY29tbWFuZHMucXVldWVzIGltcG9ydCBBYnN0cmFjdFF1ZXVlCitmcm9tIHdl
YmtpdHB5LnRvb2wuY29tbWFuZHMuc3RlcHNlcXVlbmNlIGltcG9ydCBTdGVwU2VxdWVuY2VFcnJv
ckhhbmRsZXIKKworCitjbGFzcyBQZXJmYWxpemVyVGFzayhQYXRjaEFuYWx5c2lzVGFzayk6Cisg
ICAgZGVmIF9faW5pdF9fKHNlbGYsIHRvb2wsIHBhdGNoLCBsb2dnZXIpOgorICAgICAgICBQYXRj
aEFuYWx5c2lzVGFzay5fX2luaXRfXyhzZWxmLCBzZWxmLCBwYXRjaCkKKyAgICAgICAgc2VsZi5f
cG9ydCA9IHRvb2wucG9ydF9mYWN0b3J5LmdldCgpCisgICAgICAgIHNlbGYuX3Rvb2wgPSB0b29s
CisgICAgICAgIHNlbGYuX2xvZ2dlciA9IGxvZ2dlcgorCisgICAgZGVmIF9jb3B5X2J1aWxkX3By
b2R1Y3Rfd2l0aG91dF9wYXRjaChzZWxmKToKKyAgICAgICAgZmlsZXN5c3RlbSA9IHNlbGYuX3Rv
b2wuZmlsZXN5c3RlbQorICAgICAgICBjb25maWd1cmF0aW9uID0gZmlsZXN5c3RlbS5iYXNlbmFt
ZShzZWxmLl9wb3J0Ll9idWlsZF9wYXRoKCkpCisgICAgICAgIHNlbGYuX2J1aWxkX2RpcmVjdG9y
eSA9IGZpbGVzeXN0ZW0uZGlybmFtZShzZWxmLl9wb3J0Ll9idWlsZF9wYXRoKCkpCisgICAgICAg
IHNlbGYuX2J1aWxkX2RpcmVjdG9yeV93aXRob3V0X3BhdGNoID0gc2VsZi5fYnVpbGRfZGlyZWN0
b3J5ICsgJ1dpdGhvdXRQYXRjaCcKKworICAgICAgICB0cnk6CisgICAgICAgICAgICBmaWxlc3lz
dGVtLnJtdHJlZShzZWxmLl9idWlsZF9kaXJlY3Rvcnlfd2l0aG91dF9wYXRjaCkKKyAgICAgICAg
ICAgIGZpbGVzeXN0ZW0uY29weXRyZWUoZmlsZXN5c3RlbS5qb2luKHNlbGYuX2J1aWxkX2RpcmVj
dG9yeSwgY29uZmlndXJhdGlvbiksCisgICAgICAgICAgICAgICAgZmlsZXN5c3RlbS5qb2luKHNl
bGYuX2J1aWxkX2RpcmVjdG9yeV93aXRob3V0X3BhdGNoLCBjb25maWd1cmF0aW9uKSkKKyAgICAg
ICAgICAgIHJldHVybiBUcnVlCisgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgIHJldHVybiBG
YWxzZQorCisgICAgZGVmIHJ1bihzZWxmKToKKyAgICAgICAgaWYgbm90IHNlbGYuX3BhdGNoLmNv
bW1pdHRlcigpIGFuZCBub3Qgc2VsZi5fcGF0Y2guYXR0YWNoZXIoKS5jYW5fY29tbWl0OgorICAg
ICAgICAgICAgc2VsZi5fbG9nZ2VyKCdUaGUgcGF0Y2ggJWQgaXMgbm90IGF1dGhvcml6ZWQgYnkg
YSBjb21tbWl0dGVyJyAlIHNlbGYuX3BhdGNoLmlkKCkpCisgICAgICAgICAgICByZXR1cm4gRmFs
c2UKKworICAgICAgICBzZWxmLl9sb2dnZXIoJ1ByZXBhcmluZyB0byBydW4gcGVyZm9ybWFuY2Ug
dGVzdHMgZm9yIHRoZSBhdHRhY2htZW50ICVkLi4uJyAlIHNlbGYuX3BhdGNoLmlkKCkpCisgICAg
ICAgIGlmIG5vdCBzZWxmLl9jbGVhbigpIG9yIG5vdCBzZWxmLl91cGRhdGUoKToKKyAgICAgICAg
ICAgIHJldHVybiBGYWxzZQorCisgICAgICAgIGhlYWRfcmV2aXNpb24gPSBzZWxmLl90b29sLnNj
bSgpLmhlYWRfc3ZuX3JldmlzaW9uKCkKKworICAgICAgICBzZWxmLl9sb2dnZXIoJ0J1aWxkaW5n
IFdlYktpdCBhdCByJXMgd2l0aG91dCB0aGUgcGF0Y2gnICUgaGVhZF9yZXZpc2lvbikKKyAgICAg
ICAgaWYgbm90IHNlbGYuX2J1aWxkKCk6CisgICAgICAgICAgICByZXR1cm4gRmFsc2UKKworICAg
ICAgICBpZiBub3Qgc2VsZi5fcG9ydC5jaGVja19idWlsZChuZWVkc19odHRwPUZhbHNlKToKKyAg
ICAgICAgICAgIHNlbGYuX2xvZ2dlcignRmFpbGVkIHRvIGJ1aWxkIER1bXBSZW5kZXJUcmVlLicp
CisgICAgICAgICAgICByZXR1cm4gRmFsc2UKKworICAgICAgICBpZiBub3Qgc2VsZi5fY29weV9i
dWlsZF9wcm9kdWN0X3dpdGhvdXRfcGF0Y2goKToKKyAgICAgICAgICAgIHNlbGYuX2xvZ2dlcign
RmFpbGVkIHRvIGNvcHkgdGhlIGJ1aWxkIHByb2R1Y3QgZnJvbSAlcyB0byAlcycgJSAoc2VsZi5f
YnVpbGRfZGlyZWN0b3J5LCBzZWxmLl9idWlsZF9kaXJlY3Rvcnlfd2l0aG91dF9wYXRjaCkpCisg
ICAgICAgICAgICByZXR1cm4gRmFsc2UKKworICAgICAgICBzZWxmLl9sb2dnZXIoJ0J1aWxkaW5n
IFdlYktpdCBhdCByJXMgd2l0aCB0aGUgcGF0Y2gnICUgaGVhZF9yZXZpc2lvbikKKyAgICAgICAg
aWYgbm90IHNlbGYuX2FwcGx5KCkgb3Igbm90IHNlbGYuX2J1aWxkKCk6CisgICAgICAgICAgICBy
ZXR1cm4gRmFsc2UKKworICAgICAgICBpZiBub3Qgc2VsZi5fcG9ydC5jaGVja19idWlsZChuZWVk
c19odHRwPUZhbHNlKToKKyAgICAgICAgICAgIHNlbGYuX2xvZ2dlcignRmFpbGVkIHRvIGJ1aWxk
IER1bXBSZW5kZXJUcmVlLicpCisgICAgICAgICAgICByZXR1cm4gRmFsc2UKKworICAgICAgICBm
aWxlc3lzdGVtID0gc2VsZi5fdG9vbC5maWxlc3lzdGVtCisgICAgICAgIGlmIGZpbGVzeXN0ZW0u
ZXhpc3RzKHNlbGYuX2pzb25fcGF0aCgpKToKKyAgICAgICAgICAgIGZpbGVzeXN0ZW0ucmVtb3Zl
KHNlbGYuX2pzb25fcGF0aCgpKQorCisgICAgICAgIHNlbGYuX2xvZ2dlcigiUnVubmluZyBwZXJm
b3JtYW5jZSB0ZXN0cy4uLiIpCisgICAgICAgIGlmIHNlbGYuX3J1bl9wZXJmX3Rlc3Qoc2VsZi5f
YnVpbGRfZGlyZWN0b3J5X3dpdGhvdXRfcGF0Y2gpIDwgMDoKKyAgICAgICAgICAgIHNlbGYuX2xv
Z2dlcignRmFpbGVkIHRvIHJ1biBwZXJmb3JtYW5jZSB0ZXN0cyB3aXRob3V0IHRoZSBwYXRjaC4n
KQorICAgICAgICAgICAgcmV0dXJuIEZhbHNlCisKKyAgICAgICAgaWYgc2VsZi5fcnVuX3BlcmZf
dGVzdChzZWxmLl9idWlsZF9kaXJlY3RvcnkpIDwgMDoKKyAgICAgICAgICAgIHNlbGYuX2xvZ2dl
cignRmFpbGVkIHRvIHJ1biBwZXJmb3JtYW5jZSB0ZXN0cyB3aXRoIHRoZSBwYXRjaC4nKQorICAg
ICAgICAgICAgcmV0dXJuIEZhbHNlCisKKyAgICAgICAgaWYgbm90IGZpbGVzeXN0ZW0uZXhpc3Rz
KHNlbGYuX3Jlc3VsdHNfcGFnZV9wYXRoKCkpOgorICAgICAgICAgICAgc2VsZi5fbG9nZ2VyKCdG
YWlsZWQgdG8gZ2VuZXJhdGUgdGhlIHJlc3VsdHMgcGFnZS4nKQorICAgICAgICAgICAgcmV0dXJu
IEZhbHNlCisKKyAgICAgICAgcmVzdWx0c19wYWdlID0gZmlsZXN5c3RlbS5yZWFkX3RleHRfZmls
ZShzZWxmLl9yZXN1bHRzX3BhZ2VfcGF0aCgpKQorICAgICAgICBzZWxmLl90b29sLmJ1Z3MuYWRk
X2F0dGFjaG1lbnRfdG9fYnVnKHNlbGYuX3BhdGNoLmJ1Z19pZCgpLCByZXN1bHRzX3BhZ2UsCisg
ICAgICAgICAgICBkZXNjcmlwdGlvbj0iUGVyZm9ybWFuY2UgdGVzdHMgcmVzdWx0cyBmb3IgJWQi
ICUgc2VsZi5fcGF0Y2guaWQoKSwgbWltZXR5cGU9J3RleHQvaHRtbCcpCisKKyAgICAgICAgc2Vs
Zi5fbG9nZ2VyKCJVcGxvYWRlZCB0aGUgcmVzdWx0cyBvbiB0aGUgYnVnICVkIiAlIHNlbGYuX3Bh
dGNoLmJ1Z19pZCgpKQorICAgICAgICByZXR1cm4gVHJ1ZQorCisgICAgZGVmIHBhcmVudF9jb21t
YW5kKHNlbGYpOgorICAgICAgICByZXR1cm4gInBlcmZhbGl6ZXIiCisKKyAgICBkZWYgcnVuX3dl
YmtpdF9wYXRjaChzZWxmLCBhcmdzKToKKyAgICAgICAgd2Via2l0X3BhdGNoX2FyZ3MgPSBbc2Vs
Zi5fdG9vbC5wYXRoKCldCisgICAgICAgIHdlYmtpdF9wYXRjaF9hcmdzLmV4dGVuZChhcmdzKQor
ICAgICAgICByZXR1cm4gc2VsZi5fdG9vbC5leGVjdXRpdmUucnVuX2FuZF90aHJvd19pZl9mYWls
KHdlYmtpdF9wYXRjaF9hcmdzLCBjd2Q9c2VsZi5fdG9vbC5zY20oKS5jaGVja291dF9yb290KQor
CisgICAgZGVmIF9qc29uX3BhdGgoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLl90b29sLmZp
bGVzeXN0ZW0uam9pbihzZWxmLl9idWlsZF9kaXJlY3RvcnksICdQZXJmb3JtYW5jZVRlc3RSZXN1
bHRzLmpzb24nKQorCisgICAgZGVmIF9yZXN1bHRzX3BhZ2VfcGF0aChzZWxmKToKKyAgICAgICAg
cmV0dXJuIHNlbGYuX3Rvb2wuZmlsZXN5c3RlbS5qb2luKHNlbGYuX2J1aWxkX2RpcmVjdG9yeSwg
J1BlcmZvcm1hbmNlVGVzdFJlc3VsdHMuaHRtbCcpCisKKyAgICBkZWYgX3J1bl9wZXJmX3Rlc3Qo
c2VsZiwgYnVpbGRfcGF0aCk6CisgICAgICAgIGZpbGVzeXN0ZW0gPSBzZWxmLl90b29sLmZpbGVz
eXN0ZW0KKyAgICAgICAgc2NyaXB0X3BhdGggPSBmaWxlc3lzdGVtLmpvaW4oZmlsZXN5c3RlbS5k
aXJuYW1lKHNlbGYuX3Rvb2wucGF0aCgpKSwgJ3J1bi1wZXJmLXRlc3RzJykKKyAgICAgICAgcGVy
Zl90ZXN0X3J1bm5lcl9hcmdzID0gW3NjcmlwdF9wYXRoLCAnLS1uby1idWlsZCcsICctLW5vLXNo
b3ctcmVzdWx0cycsICctLWJ1aWxkLWRpcmVjdG9yeScsIGJ1aWxkX3BhdGgsCisgICAgICAgICAg
ICAnLS1vdXRwdXQtanNvbi1wYXRoJywgc2VsZi5fanNvbl9wYXRoKCldCisgICAgICAgIHJldHVy
biBzZWxmLl90b29sLmV4ZWN1dGl2ZS5ydW5fYW5kX3Rocm93X2lmX2ZhaWwocGVyZl90ZXN0X3J1
bm5lcl9hcmdzLCBjd2Q9c2VsZi5fdG9vbC5zY20oKS5jaGVja291dF9yb290KQorCisgICAgZGVm
IHJ1bl9jb21tYW5kKHNlbGYsIGNvbW1hbmQpOgorICAgICAgICBzZWxmLnJ1bl93ZWJraXRfcGF0
Y2goY29tbWFuZCkKKworICAgIGRlZiBjb21tYW5kX3Bhc3NlZChzZWxmLCBtZXNzYWdlLCBwYXRj
aCk6CisgICAgICAgIHBhc3MKKworICAgIGRlZiBjb21tYW5kX2ZhaWxlZChzZWxmLCBtZXNzYWdl
LCBzY3JpcHRfZXJyb3IsIHBhdGNoKToKKyAgICAgICAgc2VsZi5fbG9nZ2VyKG1lc3NhZ2UpCisK
KyAgICBkZWYgcmVmZXRjaF9wYXRjaChzZWxmLCBwYXRjaCk6CisgICAgICAgIHJldHVybiBzZWxm
Ll90b29sLmJ1Z3MuZmV0Y2hfYXR0YWNobWVudChwYXRjaC5pZCgpKQorCisgICAgZGVmIGV4cGVj
dGVkX2ZhaWx1cmVzKHNlbGYpOgorICAgICAgICByZXR1cm4gRXhwZWN0ZWRGYWlsdXJlcygpCisK
KyAgICBkZWYgYnVpbGRfc3R5bGUoc2VsZik6CisgICAgICAgIHJldHVybiAicmVsZWFzZSIKKwor
CitjbGFzcyBQZXJmVGVzdChJUkNDb21tYW5kKToKKyAgICBkZWYgZXhlY3V0ZShzZWxmLCBuaWNr
LCBhcmdzLCB0b29sLCBzaGVyaWZmKToKKyAgICAgICAgaWYgbm90IGFyZ3M6CisgICAgICAgICAg
ICB0b29sLmlyYygpLnBvc3QobmljayArICI6IFBsZWFzZSBzcGVjaWZ5IGFuIGF0dGFjaG1lbnQv
cGF0Y2ggaWQiKQorICAgICAgICAgICAgcmV0dXJuCisKKyAgICAgICAgcGF0Y2hfaWQgPSBhcmdz
WzBdCisgICAgICAgIHBhdGNoID0gdG9vbC5idWdzLmZldGNoX2F0dGFjaG1lbnQocGF0Y2hfaWQp
CisgICAgICAgIGlmIG5vdCBwYXRjaDoKKyAgICAgICAgICAgIHRvb2wuaXJjKCkucG9zdChuaWNr
ICsgIjogQ291bGQgbm90IGZldGNoIHRoZSBwYXRjaCIpCisgICAgICAgICAgICByZXR1cm4KKwor
ICAgICAgICB0YXNrID0gUGVyZmFsaXplclRhc2sodG9vbCwgcGF0Y2gsIGxhbWJkYSBtZXNzYWdl
OiB0b29sLmlyYygpLnBvc3QoJyVzOiAlcycgJSAobmljaywgbWVzc2FnZSkpKQorICAgICAgICB0
YXNrLnJ1bigpCisKKworY2xhc3MgUGVyZmFsaXplcihBYnN0cmFjdFF1ZXVlLCBTdGVwU2VxdWVu
Y2VFcnJvckhhbmRsZXIpOgorICAgIG5hbWUgPSAicGVyZmFsaXplciIKKyAgICB3YXRjaGVycyA9
IEFic3RyYWN0UXVldWUud2F0Y2hlcnMgKyBbInJuaXdhQHdlYmtpdC5vcmciXQorCisgICAgX2Nv
bW1hbmRzID0geworICAgICAgICAiaGVscCI6IEhlbHAsCisgICAgICAgICJoaSI6IEhpLAorICAg
ICAgICAicmVzdGFydCI6IFJlc3RhcnQsCisgICAgICAgICJ0ZXN0IjogUGVyZlRlc3QsCisgICAg
fQorCisgICAgIyBBYnN0cmFjdFF1ZXVlIG1ldGhvZHMKKworICAgIGRlZiBiZWdpbl93b3JrX3F1
ZXVlKHNlbGYpOgorICAgICAgICBBYnN0cmFjdFF1ZXVlLmJlZ2luX3dvcmtfcXVldWUoc2VsZikK
KyAgICAgICAgc2VsZi5fc2hlcmlmZiA9IFNoZXJpZmYoc2VsZi5fdG9vbCwgc2VsZikKKyAgICAg
ICAgc2VsZi5faXJjX2JvdCA9IElSQ0JvdCgicGVyZmFsaXplciIsIHNlbGYuX3Rvb2wsIHNlbGYu
X3NoZXJpZmYsIHNlbGYuX2NvbW1hbmRzKQorICAgICAgICBzZWxmLl90b29sLmVuc3VyZV9pcmNf
Y29ubmVjdGVkKHNlbGYuX2lyY19ib3QuaXJjX2RlbGVnYXRlKCkpCisKKyAgICBkZWYgd29ya19p
dGVtX2xvZ19wYXRoKHNlbGYsIGZhaWx1cmVfbWFwKToKKyAgICAgICAgcmV0dXJuIE5vbmUKKwor
ICAgIGRlZiBfaXNfb2xkX2ZhaWx1cmUoc2VsZiwgcmV2aXNpb24pOgorICAgICAgICByZXR1cm4g
c2VsZi5fdG9vbC5zdGF0dXNfc2VydmVyLnN2bl9yZXZpc2lvbihyZXZpc2lvbikKKworICAgIGRl
ZiBuZXh0X3dvcmtfaXRlbShzZWxmKToKKyAgICAgICAgc2VsZi5faXJjX2JvdC5wcm9jZXNzX3Bl
bmRpbmdfbWVzc2FnZXMoKQorICAgICAgICByZXR1cm4KKworICAgIGRlZiBwcm9jZXNzX3dvcmtf
aXRlbShzZWxmLCBmYWlsdXJlX21hcCk6CisgICAgICAgIHJldHVybiBUcnVlCisKKyAgICBkZWYg
aGFuZGxlX3VuZXhwZWN0ZWRfZXJyb3Ioc2VsZiwgZmFpbHVyZV9tYXAsIG1lc3NhZ2UpOgorICAg
ICAgICBsb2cobWVzc2FnZSkKKworICAgICMgU3RlcFNlcXVlbmNlRXJyb3JIYW5kbGVyIG1ldGhv
ZHMKKworICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiBoYW5kbGVfc2NyaXB0X2Vycm9yKGNscywg
dG9vbCwgc3RhdGUsIHNjcmlwdF9lcnJvcik6CisgICAgICAgICMgSWRlYWxseSB3ZSB3b3VsZCBw
b3N0IHNvbWUgaW5mb3JtYXRpb24gdG8gSVJDIGFib3V0IHdoYXQgd2VudCB3cm9uZworICAgICAg
ICAjIGhlcmUsIGJ1dCB3ZSBkb24ndCBoYXZlIHRoZSBJUkMgcGFzc3dvcmQgaW4gdGhlIGNoaWxk
IHByb2Nlc3MuCisgICAgICAgIHBhc3MKSW5kZXg6IFRvb2xzL1NjcmlwdHMvd2Via2l0cHkvdG9v
bC9jb21tYW5kcy9wZXJmYWxpemVyX3VuaXR0ZXN0LnB5Cj09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFRvb2xzL1Nj
cmlwdHMvd2Via2l0cHkvdG9vbC9jb21tYW5kcy9wZXJmYWxpemVyX3VuaXR0ZXN0LnB5CShyZXZp
c2lvbiAwKQorKysgVG9vbHMvU2NyaXB0cy93ZWJraXRweS90b29sL2NvbW1hbmRzL3BlcmZhbGl6
ZXJfdW5pdHRlc3QucHkJKHJldmlzaW9uIDApCkBAIC0wLDAgKzEsMTExIEBACisjIENvcHlyaWdo
dCAoQykgMjAxMiBHb29nbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorIworIyBSZWRpc3Ry
aWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhv
dXQKKyMgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxv
d2luZyBjb25kaXRpb25zIGFyZQorIyBtZXQ6CisjCisjICAgICogUmVkaXN0cmlidXRpb25zIG9m
IHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyMgbm90aWNlLCB0
aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorIyAg
ICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJv
dmUKKyMgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBm
b2xsb3dpbmcgZGlzY2xhaW1lcgorIyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIg
bWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisjIGRpc3RyaWJ1dGlvbi4KKyMgICAgKiBOZWl0
aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisjIGNvbnRy
aWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZl
ZCBmcm9tCisjIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBl
cm1pc3Npb24uCisjCisjIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdI
VCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyMgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1Ig
SU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyMgTElNSVRFRCBUTywgVEhF
IElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisj
IEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBU
SEUgQ09QWVJJR0hUCisjIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBE
SVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorIyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENP
TlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisjIExJTUlURUQgVE8sIFBS
T0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAor
IyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FV
U0VEIEFORCBPTiBBTlkKKyMgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFD
VCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorIyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1Ig
T1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyMgT0YgVEhJUyBT
T0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFH
RS4KKworaW1wb3J0IHVuaXR0ZXN0CisKK2Zyb20gd2Via2l0cHkuY29tbW9uLm5ldC5idWlsZGJv
dCBpbXBvcnQgQnVpbGRlcgorZnJvbSB3ZWJraXRweS5jb21tb24uc3lzdGVtLmV4ZWN1dGl2ZSBp
bXBvcnQgU2NyaXB0RXJyb3IKK2Zyb20gd2Via2l0cHkuY29tbW9uLnN5c3RlbS5vdXRwdXRjYXB0
dXJlIGltcG9ydCBPdXRwdXRDYXB0dXJlCitmcm9tIHdlYmtpdHB5LmxheW91dF90ZXN0cy5wb3J0
LnRlc3QgaW1wb3J0IFRlc3RQb3J0Citmcm9tIHdlYmtpdHB5LnRvb2wuY29tbWFuZHMucGVyZmFs
aXplciBpbXBvcnQgUGVyZmFsaXplclRhc2sKK2Zyb20gd2Via2l0cHkudG9vbC5tb2NrdG9vbCBp
bXBvcnQgTW9ja1Rvb2wKKworCitjbGFzcyBQZXJmYWxpemVyVGFza1Rlc3QodW5pdHRlc3QuVGVz
dENhc2UpOgorICAgIGRlZiBfY3JlYXRlX2FuZF9ydW5fcGVyZmFsaXplcihzZWxmLCBjb21tYW5k
c190b19mYWlsPVtdKToKKyAgICAgICAgdG9vbCA9IE1vY2tUb29sKCkKKyAgICAgICAgcGF0Y2gg
PSB0b29sLmJ1Z3MuZmV0Y2hfYXR0YWNobWVudCgxMDAwMCkKKworICAgICAgICBsb2dzID0gW10K
KworICAgICAgICBkZWYgbG9nZ2VyKG1lc3NhZ2UpOgorICAgICAgICAgICAgbG9ncy5hcHBlbmQo
bWVzc2FnZSkKKworICAgICAgICBkZWYgcnVuX3dlYmtpdF9wYXRjaChhcmdzKToKKyAgICAgICAg
ICAgIGlmIGFyZ3NbMF0gaW4gY29tbWFuZHNfdG9fZmFpbDoKKyAgICAgICAgICAgICAgICByYWlz
ZSBTY3JpcHRFcnJvcgorCisgICAgICAgIGRlZiBydW5fcGVyZl90ZXN0KGJ1aWxkX3BhdGgpOgor
ICAgICAgICAgICAgaWYgJ3J1bi1wZXJmLXRlc3RzJyBpbiBjb21tYW5kc190b19mYWlsOgorICAg
ICAgICAgICAgICAgIHJldHVybiAtMQorICAgICAgICAgICAgaWYgJ3Jlc3VsdHMtcGFnZScgbm90
IGluIGNvbW1hbmRzX3RvX2ZhaWw6CisgICAgICAgICAgICAgICAgdG9vbC5maWxlc3lzdGVtLndy
aXRlX3RleHRfZmlsZSh0b29sLmZpbGVzeXN0ZW0uam9pbihidWlsZF9wYXRoLCAnUGVyZm9ybWFu
Y2VUZXN0UmVzdWx0cy5odG1sJyksICdyZXN1bHRzIHBhZ2UnKQorICAgICAgICAgICAgcmV0dXJu
IDAKKworICAgICAgICBwZXJmYWxpemVyID0gUGVyZmFsaXplclRhc2sodG9vbCwgcGF0Y2gsIGxv
Z2dlcikKKyAgICAgICAgcGVyZmFsaXplci5fcG9ydCA9IFRlc3RQb3J0KHRvb2wpCisgICAgICAg
IHBlcmZhbGl6ZXIucnVuX3dlYmtpdF9wYXRjaCA9IHJ1bl93ZWJraXRfcGF0Y2gKKyAgICAgICAg
cGVyZmFsaXplci5fcnVuX3BlcmZfdGVzdCA9IHJ1bl9wZXJmX3Rlc3QKKworICAgICAgICBjYXB0
dXJlID0gT3V0cHV0Q2FwdHVyZSgpCisgICAgICAgIGNhcHR1cmUuY2FwdHVyZV9vdXRwdXQoKQor
CisgICAgICAgIGlmIGNvbW1hbmRzX3RvX2ZhaWw6CisgICAgICAgICAgICBzZWxmLmFzc2VydEZh
bHNlKHBlcmZhbGl6ZXIucnVuKCkpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLmFz
c2VydFRydWUocGVyZmFsaXplci5ydW4oKSkKKworICAgICAgICBjYXB0dXJlLnJlc3RvcmVfb3V0
cHV0KCkKKworICAgICAgICByZXR1cm4gbG9ncworCisgICAgZGVmIHRlc3RfcnVuKHNlbGYpOgor
ICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuX2NyZWF0ZV9hbmRfcnVuX3BlcmZhbGl6ZXIo
KSwgWworICAgICAgICAgICAgJ1ByZXBhcmluZyB0byBydW4gcGVyZm9ybWFuY2UgdGVzdHMgZm9y
IHRoZSBhdHRhY2htZW50IDEwMDAwLi4uJywKKyAgICAgICAgICAgICdCdWlsZGluZyBXZWJLaXQg
YXQgcjEyMzQgd2l0aG91dCB0aGUgcGF0Y2gnLAorICAgICAgICAgICAgJ0J1aWxkaW5nIFdlYktp
dCBhdCByMTIzNCB3aXRoIHRoZSBwYXRjaCcsCisgICAgICAgICAgICAnUnVubmluZyBwZXJmb3Jt
YW5jZSB0ZXN0cy4uLicsCisgICAgICAgICAgICAnVXBsb2FkZWQgdGhlIHJlc3VsdHMgb24gdGhl
IGJ1ZyA1MDAwMCddKQorCisgICAgZGVmIHRlc3RfcnVuX3dpdGhfY2xlYW5fZmFpbHMoc2VsZik6
CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5fY3JlYXRlX2FuZF9ydW5fcGVyZmFsaXpl
cihbJ2NsZWFuJ10pLCBbCisgICAgICAgICAgICAnUHJlcGFyaW5nIHRvIHJ1biBwZXJmb3JtYW5j
ZSB0ZXN0cyBmb3IgdGhlIGF0dGFjaG1lbnQgMTAwMDAuLi4nLAorICAgICAgICAgICAgJ1VuYWJs
ZSB0byBjbGVhbiB3b3JraW5nIGRpcmVjdG9yeSddKQorCisgICAgZGVmIHRlc3RfcnVuX3dpdGhf
dXBkYXRlX2ZhaWxzKHNlbGYpOgorICAgICAgICBsb2dzID0gc2VsZi5fY3JlYXRlX2FuZF9ydW5f
cGVyZmFsaXplcihbJ3VwZGF0ZSddKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihsb2dz
KSwgMikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsb2dzWy0xXSwgJ1VuYWJsZSB0byB1cGRh
dGUgd29ya2luZyBkaXJlY3RvcnknKQorCisgICAgZGVmIHRlc3RfcnVuX3dpdGhfYnVpbGRfZmFp
bHMoc2VsZik6CisgICAgICAgIGxvZ3MgPSBzZWxmLl9jcmVhdGVfYW5kX3J1bl9wZXJmYWxpemVy
KFsnYnVpbGQnXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4obG9ncyksIDMpCisKKyAg
ICBkZWYgdGVzdF9ydW5fd2l0aF9idWlsZF9mYWlscyhzZWxmKToKKyAgICAgICAgbG9ncyA9IHNl
bGYuX2NyZWF0ZV9hbmRfcnVuX3BlcmZhbGl6ZXIoWydhcHBseS1hdHRhY2htZW50J10pCisgICAg
ICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKGxvZ3MpLCA0KQorCisgICAgZGVmIHRlc3RfcnVuX3dp
dGhfcGVyZl90ZXN0X2ZhaWxzKHNlbGYpOgorICAgICAgICBsb2dzID0gc2VsZi5fY3JlYXRlX2Fu
ZF9ydW5fcGVyZmFsaXplcihbJ3J1bi1wZXJmLXRlc3RzJ10pCisgICAgICAgIHNlbGYuYXNzZXJ0
RXF1YWwobGVuKGxvZ3MpLCA1KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxvZ3NbLTFdLCAn
RmFpbGVkIHRvIHJ1biBwZXJmb3JtYW5jZSB0ZXN0cyB3aXRob3V0IHRoZSBwYXRjaC4nKQorCisg
ICAgZGVmIHRlc3RfcnVuX3dpdGhvdXRfcmVzdWx0c19wYWdlKHNlbGYpOgorICAgICAgICBsb2dz
ID0gc2VsZi5fY3JlYXRlX2FuZF9ydW5fcGVyZmFsaXplcihbJ3Jlc3VsdHMtcGFnZSddKQorICAg
ICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihsb2dzKSwgNSkKKyAgICAgICAgc2VsZi5hc3NlcnRF
cXVhbChsb2dzWy0xXSwgJ0ZhaWxlZCB0byBnZW5lcmF0ZSB0aGUgcmVzdWx0cyBwYWdlLicpCklu
ZGV4OiBUb29scy9TY3JpcHRzL3dlYmtpdHB5L3Rvb2wvY29tbWFuZHMvcXVldWVzX3VuaXR0ZXN0
LnB5Cj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT0KLS0tIFRvb2xzL1NjcmlwdHMvd2Via2l0cHkvdG9vbC9jb21tYW5kcy9x
dWV1ZXNfdW5pdHRlc3QucHkJKHJldmlzaW9uIDEyNDk1MSkKKysrIFRvb2xzL1NjcmlwdHMvd2Vi
a2l0cHkvdG9vbC9jb21tYW5kcy9xdWV1ZXNfdW5pdHRlc3QucHkJKHdvcmtpbmcgY29weSkKQEAg
LTE3Myw3ICsxNzMsNyBAQCBjbGFzcyBBYnN0cmFjdFBhdGNoUXVldWVUZXN0KENvbW1hbmRzVGVz
CiAgICAgICAgIHF1ZXVlLl9vcHRpb25zID0gTW9jaygpCiAgICAgICAgIHF1ZXVlLl9vcHRpb25z
LnBvcnQgPSBOb25lCiAgICAgICAgIHBhdGNoID0gcXVldWUuX3Rvb2wuYnVncy5mZXRjaF9hdHRh
Y2htZW50KDEwMDAxKQotICAgICAgICBleHBlY3RlZF9zdGRlcnIgPSAiIiJNT0NLIGFkZF9hdHRh
Y2htZW50X3RvX2J1ZzogYnVnX2lkPTUwMDAwLCBkZXNjcmlwdGlvbj1BcmNoaXZlIG9mIGxheW91
dC10ZXN0LXJlc3VsdHMgZnJvbSBib3QgZmlsZW5hbWU9bGF5b3V0LXRlc3QtcmVzdWx0cy56aXAK
KyAgICAgICAgZXhwZWN0ZWRfc3RkZXJyID0gIiIiTU9DSyBhZGRfYXR0YWNobWVudF90b19idWc6
IGJ1Z19pZD01MDAwMCwgZGVzY3JpcHRpb249QXJjaGl2ZSBvZiBsYXlvdXQtdGVzdC1yZXN1bHRz
IGZyb20gYm90IGZpbGVuYW1lPWxheW91dC10ZXN0LXJlc3VsdHMuemlwIG1pbWV0eXBlPU5vbmUK
IC0tIEJlZ2luIGNvbW1lbnQgLS0KIFRoZSBhdHRhY2hlZCB0ZXN0IGZhaWx1cmVzIHdlcmUgc2Vl
biB3aGlsZSBydW5uaW5nIHJ1bi13ZWJraXQtdGVzdHMgb24gdGhlIG1vY2stcXVldWUuCiBQb3J0
OiBNb2NrUG9ydCAgUGxhdGZvcm06IE1vY2tQbGF0Zm9ybSAxLjAKQEAgLTQwNSwxNCArNDA1LDE0
IEBAIFRoZSBjb21taXQtcXVldWUganVzdCBzYXcgZm9vL2Jhci5odG1sIGYKIFBvcnQ6IE1vY2tQ
b3J0ICBQbGF0Zm9ybTogTW9ja1BsYXRmb3JtIDEuMAogLS0tIEVuZCBjb21tZW50IC0tLQogCi1N
T0NLIGFkZF9hdHRhY2htZW50X3RvX2J1ZzogYnVnX2lkPTUwMDAyLCBkZXNjcmlwdGlvbj1GYWls
dXJlIGRpZmYgZnJvbSBib3QgZmlsZW5hbWU9ZmFpbHVyZS5kaWZmCitNT0NLIGFkZF9hdHRhY2ht
ZW50X3RvX2J1ZzogYnVnX2lkPTUwMDAyLCBkZXNjcmlwdGlvbj1GYWlsdXJlIGRpZmYgZnJvbSBi
b3QgZmlsZW5hbWU9ZmFpbHVyZS5kaWZmIG1pbWV0eXBlPU5vbmUKIE1PQ0sgYnVnIGNvbW1lbnQ6
IGJ1Z19pZD01MDAwMiwgY2M9Tm9uZQogLS0tIEJlZ2luIGNvbW1lbnQgLS0tCiBUaGUgY29tbWl0
LXF1ZXVlIGp1c3Qgc2F3IGJhci9iYXouaHRtbCBmbGFrZSAoVGV4dCBkaWZmIG1pc21hdGNoKSB3
aGlsZSBwcm9jZXNzaW5nIGF0dGFjaG1lbnQgMTAwMDAgb24gYnVnIDUwMDAwLgogUG9ydDogTW9j
a1BvcnQgIFBsYXRmb3JtOiBNb2NrUGxhdGZvcm0gMS4wCiAtLS0gRW5kIGNvbW1lbnQgLS0tCiAK
LU1PQ0sgYWRkX2F0dGFjaG1lbnRfdG9fYnVnOiBidWdfaWQ9NTAwMDIsIGRlc2NyaXB0aW9uPUFy
Y2hpdmUgb2YgbGF5b3V0LXRlc3QtcmVzdWx0cyBmcm9tIGJvdCBmaWxlbmFtZT1sYXlvdXQtdGVz
dC1yZXN1bHRzLnppcAorTU9DSyBhZGRfYXR0YWNobWVudF90b19idWc6IGJ1Z19pZD01MDAwMiwg
ZGVzY3JpcHRpb249QXJjaGl2ZSBvZiBsYXlvdXQtdGVzdC1yZXN1bHRzIGZyb20gYm90IGZpbGVu
YW1lPWxheW91dC10ZXN0LXJlc3VsdHMuemlwIG1pbWV0eXBlPU5vbmUKIE1PQ0sgYnVnIGNvbW1l
bnQ6IGJ1Z19pZD01MDAwMCwgY2M9Tm9uZQogLS0tIEJlZ2luIGNvbW1lbnQgLS0tCiBUaGUgY29t
bWl0LXF1ZXVlIGVuY291bnRlcmVkIHRoZSBmb2xsb3dpbmcgZmxha3kgdGVzdHMgd2hpbGUgcHJv
Y2Vzc2luZyBhdHRhY2htZW50IDEwMDAwOgpJbmRleDogVG9vbHMvU2NyaXB0cy93ZWJraXRweS90
b29sL2NvbW1hbmRzL3VwbG9hZF91bml0dGVzdC5weQo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBUb29scy9TY3Jp
cHRzL3dlYmtpdHB5L3Rvb2wvY29tbWFuZHMvdXBsb2FkX3VuaXR0ZXN0LnB5CShyZXZpc2lvbiAx
MjQ5NTEpCisrKyBUb29scy9TY3JpcHRzL3dlYmtpdHB5L3Rvb2wvY29tbWFuZHMvdXBsb2FkX3Vu
aXR0ZXN0LnB5CSh3b3JraW5nIGNvcHkpCkBAIC03OSw3ICs3OSw3IEBAIE1PQ0s6IHVzZXIub3Bl
bl91cmw6IGh0dHA6Ly9leGFtcGxlLmNvbS8KICAgICAgICAgb3B0aW9ucyA9IE1vY2tPcHRpb25z
KCkKICAgICAgICAgb3B0aW9ucy5jb21tZW50ID0gImV4dHJhIGNvbW1lbnQiCiAgICAgICAgIG9w
dGlvbnMuZGVzY3JpcHRpb24gPSAiZmlsZSBkZXNjcmlwdGlvbiIKLSAgICAgICAgZXhwZWN0ZWRf
c3RkZXJyID0gIiIiTU9DSyBhZGRfYXR0YWNobWVudF90b19idWc6IGJ1Z19pZD01MDAwMCwgZGVz
Y3JpcHRpb249ZmlsZSBkZXNjcmlwdGlvbiBmaWxlbmFtZT1Ob25lCisgICAgICAgIGV4cGVjdGVk
X3N0ZGVyciA9ICIiIk1PQ0sgYWRkX2F0dGFjaG1lbnRfdG9fYnVnOiBidWdfaWQ9NTAwMDAsIGRl
c2NyaXB0aW9uPWZpbGUgZGVzY3JpcHRpb24gZmlsZW5hbWU9Tm9uZSBtaW1ldHlwZT1Ob25lCiAt
LSBCZWdpbiBjb21tZW50IC0tCiBleHRyYSBjb21tZW50CiAtLSBFbmQgY29tbWVudCAtLQpAQCAt
OTAsNyArOTAsNyBAQCBleHRyYSBjb21tZW50CiAgICAgICAgIG9wdGlvbnMgPSBNb2NrT3B0aW9u
cygpCiAgICAgICAgIG9wdGlvbnMuY29tbWVudCA9IE5vbmUKICAgICAgICAgb3B0aW9ucy5kZXNj
cmlwdGlvbiA9IE5vbmUKLSAgICAgICAgZXhwZWN0ZWRfc3RkZXJyID0gIiIiTU9DSyBhZGRfYXR0
YWNobWVudF90b19idWc6IGJ1Z19pZD01MDAwMCwgZGVzY3JpcHRpb249ZmlsZS50eHQgZmlsZW5h
bWU9Tm9uZQorICAgICAgICBleHBlY3RlZF9zdGRlcnIgPSAiIiJNT0NLIGFkZF9hdHRhY2htZW50
X3RvX2J1ZzogYnVnX2lkPTUwMDAwLCBkZXNjcmlwdGlvbj1maWxlLnR4dCBmaWxlbmFtZT1Ob25l
IG1pbWV0eXBlPU5vbmUKICIiIgogICAgICAgICBzZWxmLmFzc2VydF9leGVjdXRlX291dHB1dHMo
QXR0YWNoVG9CdWcoKSwgWzUwMDAwLCAicGF0aC90by9maWxlLnR4dCJdLCBvcHRpb25zPW9wdGlv
bnMsIGV4cGVjdGVkX3N0ZGVycj1leHBlY3RlZF9zdGRlcnIpCiAK
</data>
<flag name="review"
          id="167222"
          type_id="1"
          status="+"
          setter="dpranke"
    />
          </attachment>
      

    </bug>

</bugzilla>