<?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>38885</bug_id>
          
          <creation_ts>2010-05-10 20:52:58 -0700</creation_ts>
          <short_desc>Add infrastructure to parse SVN property changes</short_desc>
          <delta_ts>2010-05-22 14:40:55 -0700</delta_ts>
          <reporter_accessible>1</reporter_accessible>
          <cclist_accessible>1</cclist_accessible>
          <classification_id>1</classification_id>
          <classification>Unclassified</classification>
          <product>WebKit</product>
          <component>Tools / Tests</component>
          <version>528+ (Nightly build)</version>
          <rep_platform>All</rep_platform>
          <op_sys>All</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>39170</dependson>
    
    <dependson>39184</dependson>
          <blocked>39409</blocked>
          <everconfirmed>1</everconfirmed>
          <reporter name="Daniel Bates">dbates</reporter>
          <assigned_to name="Daniel Bates">dbates</assigned_to>
          <cc>cjerdonek</cc>
    
    <cc>eric</cc>
    
    <cc>webkit.review.bot</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>223713</commentid>
    <comment_count>0</comment_count>
    <who name="Daniel Bates">dbates</who>
    <bug_when>2010-05-10 20:52:58 -0700</bug_when>
    <thetext>Towards adding executable bit support to svn-apply and svn-unapply, we need to add support for parsing SVN property change diffs.

SVN property change diffs have the following forms:

Property changes on: Makefile
___________________________________________________________________
Added: svn:executable
   + *

OR

Property changes on: Makefile
___________________________________________________________________
Deleted: svn:executable
   + *

OR

Property changes on: Makefile
___________________________________________________________________
Name: svn:executable
   + *</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>223714</commentid>
    <comment_count>1</comment_count>
      <attachid>55654</attachid>
    <who name="Daniel Bates">dbates</who>
    <bug_when>2010-05-10 20:54:48 -0700</bug_when>
    <thetext>Created attachment 55654
Patch with unit tests</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>223716</commentid>
    <comment_count>2</comment_count>
      <attachid>55654</attachid>
    <who name="Daniel Bates">dbates</who>
    <bug_when>2010-05-10 21:07:21 -0700</bug_when>
    <thetext>Comment on attachment 55654
Patch with unit tests

Noticed an issue with this patch, will correct.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>223717</commentid>
    <comment_count>3</comment_count>
      <attachid>55655</attachid>
    <who name="Daniel Bates">dbates</who>
    <bug_when>2010-05-10 21:17:45 -0700</bug_when>
    <thetext>Created attachment 55655
Patch with unit tests</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>223720</commentid>
    <comment_count>4</comment_count>
    <who name="Chris Jerdonek">cjerdonek</who>
    <bug_when>2010-05-10 21:26:20 -0700</bug_when>
    <thetext>(In reply to comment #0)
&gt; SVN property change diffs have the following forms:
&gt; 
&gt; Property changes on: Makefile
&gt; ___________________________________________________________________
&gt; Added: svn:executable
&gt;    + *

For completeness, can you also include enough examples so the pattern is clear when there are multiple additions or, say, additions combined with deletions, etc?  In particular, does each added property get its own &quot;Added&quot; line, or do multiple additions get a single &quot;Added&quot; line?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>223743</commentid>
    <comment_count>5</comment_count>
    <who name="Daniel Bates">dbates</who>
    <bug_when>2010-05-10 22:20:06 -0700</bug_when>
    <thetext>(In reply to comment #4)
&gt; (In reply to comment #0)
&gt; &gt; SVN property change diffs have the following forms:
&gt; &gt; 
&gt; &gt; Property changes on: Makefile
&gt; &gt; ___________________________________________________________________
&gt; &gt; Added: svn:executable
&gt; &gt;    + *
&gt; 
&gt; For completeness, can you also include enough examples so the pattern is clear when there are multiple additions or, say, additions combined with deletions, etc?  In particular, does each added property get its own &quot;Added&quot; line, or do multiple additions get a single &quot;Added&quot; line?

Sure, I&apos;ll add more test cases.

Yes, each property gets its own Added/Deleted/Name line followed by a line of the form: +/- V, where V is the the value of the property. Take V := &apos;*&apos; for the svn:executable property.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>223772</commentid>
    <comment_count>6</comment_count>
      <attachid>55669</attachid>
    <who name="Daniel Bates">dbates</who>
    <bug_when>2010-05-10 23:20:41 -0700</bug_when>
    <thetext>Created attachment 55669
Patch with unit tests

Added additional unit tests. Also, while testing found that property change lines can be separated by whitespace/empty lines, so added support for this.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>223773</commentid>
    <comment_count>7</comment_count>
    <who name="WebKit Review Bot">webkit.review.bot</who>
    <bug_when>2010-05-10 23:27:59 -0700</bug_when>
    <thetext>Attachment 55669 did not pass style-queue:

Failed to run &quot;[&apos;WebKitTools/Scripts/check-webkit-style&apos;, &apos;--no-squash&apos;]&quot; exit_code: 1
WebKitTools/Scripts/webkitperl/VCSUtils_unittest/parseSvnDiffFooter.pl:140:  Line contains tab character.  [whitespace/tab] [5]
Total errors found: 1 in 4 files


If any of these errors are false positives, please file a bug against check-webkit-style.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>223952</commentid>
    <comment_count>8</comment_count>
    <who name="Chris Jerdonek">cjerdonek</who>
    <bug_when>2010-05-11 09:26:09 -0700</bug_when>
    <thetext>(In reply to comment #6)
&gt; Created an attachment (id=55669) [details]

Some comments on the first portion of the patch:

&gt; Index: WebKitTools/ChangeLog
&gt; +        * Scripts/VCSUtils.pm:

In the ChangeLog, it is generally good to comment on the per-file changes
for each file.  For example, can you at least include the names of the new
subroutines added to VCSUtils.pm?

&gt; Index: WebKitTools/Scripts/VCSUtils.pm
&gt;  my $gitDiffStartRegEx = qr#^diff --git (\w/)?(.+) (\w/)?([^\r\n]+)#;
&gt;  my $svnDiffStartRegEx = qr#^Index: ([^\r\n]+)#;
&gt; +my $svnFooterStartRegEx = qr#^Property changes on: ([^\r\n]+)#;
&gt; +my $svnPropertyNameRegEx = qr#^(Name|Added|Deleted): ([^\r\n]+)#;

It might be good to comment these two variables.  For example, it might be
nice to say here what $1 is (will normally be the same as the index path).
For the second, it might be good to state what $1 is and also clarify that the
reg ex marks the beginning of a change to a particular property instead of
to a section of additions (for example).

For the second, might $svnPropertyChangeStartRegEx or $svnPropertyStartRegEx
be clearer since the line marks the beginning of a property change in the
&quot;Property changes&quot; section and when parseSvnProperty() should be called?

&gt; +# Args:
&gt; +#   $fileHandle: advanced so the last line read from the handle is either the
&gt; +#                the first occurence of an empty line or the first line of the

occurrence

Since this is in the args section, the $fileHandle comment should be explaining
the state of the file handle going into the subroutine.  Can you clarify the scoping
in the phrase &quot;first occurrence of an empty line&quot;?  This could be taken to mean
the first empty line in the diff, which is obviously not right.  Also, do we really
want to be saying that an empty line is what marks the beginning of the footer?
It seems like we can always require it to be the &quot;Property changes&quot; line.

&gt; +#                next header to parse.  For SVN-formatted diffs, this is a line
&gt; +#                beginning with &quot;Index:&quot;.  For Git, this is a line beginning
&gt; +#                with &quot;diff --git&quot;.

It looks like you need to rewrite this in terms of footer language.

&gt; +#   $line: the line last read from $fileHandle

Missing a period.

&gt; +# Returns ($footerHashRef, $lastReadLine):
&gt; +#   $footerHashRef: a hash reference representing a diff footer
&gt; +#     propertyPath: the path of the target file.

It might be good to add that this should normally be the same as the
&quot;index path&quot; for the diff.

&gt; +sub parseSvnDiffFooter($$)

&gt; +        if (/$svnFooterStartRegEx/) {
&gt; +            $propertyPath = $1;

Would something like &quot;filePath&quot; be clearer?  propertyPath makes it seem like
it is a path to a property.

&gt; +        } elsif (/$svnPropertyNameRegEx/) {
&gt; +            ($propertyHashRef, $_) = parseSvnProperty($fileHandle, $_);
&gt; +            $footer{executableBitDelta} = $propertyHashRef-&gt;{propertyChangeDelta} if $propertyHashRef-&gt;{name} eq &quot;svn:executable&quot;;

Since it doesn&apos;t look like you&apos;re storing any property changes other than
the executable bit one, it might be good to add a FIXME somewhere (like in
or near the description of the subroutine) to add support for parsing
all properties.

When this method is modified to support all properties, it seems like it
would make sense to store all the properties as a generic hash of key-value
pairs, so that this subroutine will not need to have any special knowledge of
the property representing the executable bit.  Then the caller could be
responsible for examining the hash and converting that information into an
executableBitDelta for the diff.  Maybe you can include a FIXME here
suggesting at future changes to this subroutine.

&gt; +        } elsif (/^\s*$/x || $_ eq &apos;_&apos; x 67) {
&gt; +            # Skip empty/whitespace-only lines and the divider line.
&gt; +        } else {
&gt; +            # Some other content, such as the binary portion of an SVN binary diff.
&gt; +            last;

Since the binary lines are getting skipped over, how are they getting preserved
so the binary changes can later be applied?

&gt; +        }
&gt; +
&gt; +        $_ = &lt;$fileHandle&gt;; # Not defined if end-of-file reached.
&gt; +
&gt; +        last if (!defined($_) || /$svnDiffStartRegEx/ || /$gitDiffStartRegEx/);

Are we supporting patches with Git and SVN diffs mixed together?  It doesn&apos;t
seem like this SVN-specific method needs to know about Git diffs.

&gt; +    }
&gt; +
&gt; +    if (!$propertyPath) {
&gt; +        die(&quot;First line of SVN diff does not begin with \&quot;Property changes on \&quot;: \&quot;$_\&quot;.&quot;);

It seems like the logic above doesn&apos;t require the first line to be the
&quot;Property changes&quot; line.  It seems like it only requires that some line
be a &quot;Property changes&quot; line.  Is there any reason not to check the first
line at the beginning of the method?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>223971</commentid>
    <comment_count>9</comment_count>
    <who name="Chris Jerdonek">cjerdonek</who>
    <bug_when>2010-05-11 09:48:38 -0700</bug_when>
    <thetext>(In reply to comment #5)
&gt; Sure, I&apos;ll add more test cases.
&gt; 
&gt; Yes, each property gets its own Added/Deleted/Name line followed by a line of the form: +/- V, where V is the the value of the property. Take V := &apos;*&apos; for the svn:executable property.

Thanks for this extra information and for the added test cases.  Do you know when &quot;Name&quot; is used versus Added/Deleted?

It looks like &quot;Modified&quot; is also a possibility, and for there to be both a + and - line after the first line.  For example, I tried modifying the svn:ignore property for a directory and got this:

Property changes on: WebKitTools/Scripts/webkitpy
___________________________________________________________________
Modified: svn:ignore
   - commands
init
irc
patch
steps
*.pyc
autoinstall.cache.d

   + commands
init
patch
steps
*.pyc
autoinstall.cache.d
test-add</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>224181</commentid>
    <comment_count>10</comment_count>
    <who name="Daniel Bates">dbates</who>
    <bug_when>2010-05-11 15:16:01 -0700</bug_when>
    <thetext>(In reply to comment #8)
&gt; (In reply to comment #6)
&gt; &gt; Created an attachment (id=55669) [details] [details]
&gt; 
&gt; Some comments on the first portion of the patch:
&gt; 
&gt; &gt; Index: WebKitTools/ChangeLog
&gt; &gt; +        * Scripts/VCSUtils.pm:
&gt; 
&gt; In the ChangeLog, it is generally good to comment on the per-file changes
&gt; for each file.  For example, can you at least include the names of the new
&gt; subroutines added to VCSUtils.pm?

Yes, I agree. Will change.

&gt; 
&gt; &gt; Index: WebKitTools/Scripts/VCSUtils.pm
&gt; &gt;  my $gitDiffStartRegEx = qr#^diff --git (\w/)?(.+) (\w/)?([^\r\n]+)#;
&gt; &gt;  my $svnDiffStartRegEx = qr#^Index: ([^\r\n]+)#;
&gt; &gt; +my $svnFooterStartRegEx = qr#^Property changes on: ([^\r\n]+)#;
&gt; &gt; +my $svnPropertyNameRegEx = qr#^(Name|Added|Deleted): ([^\r\n]+)#;
&gt; 
&gt; It might be good to comment these two variables.  For example, it might be
&gt; nice to say here what $1 is (will normally be the same as the index path).

Will add comment.

&gt; For the second, it might be good to state what $1 is and also clarify that the
&gt; reg ex marks the beginning of a change to a particular property instead of
&gt; to a section of additions (for example).

Will add comment.

&gt; 
&gt; For the second, might $svnPropertyChangeStartRegEx or $svnPropertyStartRegEx
&gt; be clearer since the line marks the beginning of a property change in the
&gt; &quot;Property changes&quot; section and when parseSvnProperty() should be called?

Yeah, I was not sure what to call this. I&apos;ll go with $svnPropertyChangeStartRegEx.

&gt; 
&gt; &gt; +# Args:
&gt; &gt; +#   $fileHandle: advanced so the last line read from the handle is either the
&gt; &gt; +#                the first occurence of an empty line or the first line of the
&gt; 
&gt; occurrence
&gt; 
&gt; Since this is in the args section, the $fileHandle comment should be explaining
&gt; the state of the file handle going into the subroutine.  Can you clarify the scoping
&gt; in the phrase &quot;first occurrence of an empty line&quot;?  This could be taken to mean
&gt; the first empty line in the diff, which is obviously not right.  Also, do we really
&gt; want to be saying that an empty line is what marks the beginning of the footer?
&gt; It seems like we can always require it to be the &quot;Property changes&quot; line.

Oops, this used to describe the state of the fileHandle after the subroutine returns (in the old patch: &lt;https://bugs.webkit.org/attachment.cgi?id=55655&gt;). The empty line comment no longer applies to &lt;https://bugs.webkit.org/attachment.cgi?id=55669&gt;. Will update comment. 

&gt; 
&gt; &gt; +#                next header to parse.  For SVN-formatted diffs, this is a line
&gt; &gt; +#                beginning with &quot;Index:&quot;.  For Git, this is a line beginning
&gt; &gt; +#                with &quot;diff --git&quot;.
&gt; 
&gt; It looks like you need to rewrite this in terms of footer language.

See above response. Will update comment.

&gt; 
&gt; &gt; +#   $line: the line last read from $fileHandle
&gt; 
&gt; Missing a period.

Will fix.

&gt; 
&gt; &gt; +# Returns ($footerHashRef, $lastReadLine):
&gt; &gt; +#   $footerHashRef: a hash reference representing a diff footer
&gt; &gt; +#     propertyPath: the path of the target file.
&gt; 
&gt; It might be good to add that this should normally be the same as the
&gt; &quot;index path&quot; for the diff.

Will update comment to reflect this.

&gt; 
&gt; &gt; +sub parseSvnDiffFooter($$)
&gt; 
&gt; &gt; +        if (/$svnFooterStartRegEx/) {
&gt; &gt; +            $propertyPath = $1;
&gt; 
&gt; Would something like &quot;filePath&quot; be clearer?  propertyPath makes it seem like
&gt; it is a path to a property.
&gt; 
&gt; &gt; +        } elsif (/$svnPropertyNameRegEx/) {
&gt; &gt; +            ($propertyHashRef, $_) = parseSvnProperty($fileHandle, $_);
&gt; &gt; +            $footer{executableBitDelta} = $propertyHashRef-&gt;{propertyChangeDelta} if $propertyHashRef-&gt;{name} eq &quot;svn:executable&quot;;
&gt; 
&gt; Since it doesn&apos;t look like you&apos;re storing any property changes other than
&gt; the executable bit one, it might be good to add a FIXME somewhere (like in
&gt; or near the description of the subroutine) to add support for parsing
&gt; all properties.

Will do.

&gt; 
&gt; When this method is modified to support all properties, it seems like it
&gt; would make sense to store all the properties as a generic hash of key-value
&gt; pairs, so that this subroutine will not need to have any special knowledge of
&gt; the property representing the executable bit.  Then the caller could be
&gt; responsible for examining the hash and converting that information into an
&gt; executableBitDelta for the diff.  Maybe you can include a FIXME here
&gt; suggesting at future changes to this subroutine.

Yes, this was my original thought as well. Will add a FIXME for now.

&gt; 
&gt; &gt; +        } elsif (/^\s*$/x || $_ eq &apos;_&apos; x 67) {
&gt; &gt; +            # Skip empty/whitespace-only lines and the divider line.
&gt; &gt; +        } else {
&gt; &gt; +            # Some other content, such as the binary portion of an SVN binary diff.
&gt; &gt; +            last;
&gt; 
&gt; Since the binary lines are getting skipped over, how are they getting preserved
&gt; so the binary changes can later be applied?

The binary lines should not be skipped over. Disregarding the case where the caller of parseSvnFooterDiff does not pass the start of an SVN property change entry (i.e. starts with &quot;Property changes on ...&quot;), by the last &quot;else&quot; clause we break out of the loop and will return this line so that the caller (say, parseDiff() can continue processing the diff). Therefore, it will be the caller&apos;s responsibility to to preserve the binary patch contents. See test cases in parseSvnDiffFooter.pl: &quot;binary file (diff snippet) with executable bit set&quot;, and  &quot;binary file (diff snippet) with executable bit set (with empty line)&quot;.

&gt; 
&gt; &gt; +        }
&gt; &gt; +
&gt; &gt; +        $_ = &lt;$fileHandle&gt;; # Not defined if end-of-file reached.
&gt; &gt; +
&gt; &gt; +        last if (!defined($_) || /$svnDiffStartRegEx/ || /$gitDiffStartRegEx/);
&gt; 
&gt; Are we supporting patches with Git and SVN diffs mixed together?  It doesn&apos;t
&gt; seem like this SVN-specific method needs to know about Git diffs.

I agree, we shouldn&apos;t have mixing. Will change.

&gt; 
&gt; &gt; +    }
&gt; &gt; +
&gt; &gt; +    if (!$propertyPath) {
&gt; &gt; +        die(&quot;First line of SVN diff does not begin with \&quot;Property changes on \&quot;: \&quot;$_\&quot;.&quot;);
&gt; 
&gt; It seems like the logic above doesn&apos;t require the first line to be the
&gt; &quot;Property changes&quot; line.  It seems like it only requires that some line
&gt; be a &quot;Property changes&quot; line.  Is there any reason not to check the first
&gt; line at the beginning of the method?

In the process of refactoring this, I wound up moving it into the loop. I believe we can factor this out of the loop and do the testing at the beginning of the method.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>224184</commentid>
    <comment_count>11</comment_count>
    <who name="Daniel Bates">dbates</who>
    <bug_when>2010-05-11 15:19:03 -0700</bug_when>
    <thetext>(In reply to comment #9)
&gt; (In reply to comment #5)
&gt; &gt; Sure, I&apos;ll add more test cases.
&gt; &gt; 
&gt; &gt; Yes, each property gets its own Added/Deleted/Name line followed by a line of the form: +/- V, where V is the the value of the property. Take V := &apos;*&apos; for the svn:executable property.
&gt; 
&gt; Thanks for this extra information and for the added test cases.  Do you know when &quot;Name&quot; is used versus Added/Deleted?

For some versions of SVN &lt; 1.6.5, such as 1.4.4 (I did not determine the exact SVN version that changed the format from &quot;Name&quot; to &quot;Added&quot;, &quot;Deleted&quot;, &quot;Modified&quot;.

&gt; 
&gt; It looks like &quot;Modified&quot; is also a possibility, and for there to be both a + and - line after the first line.  For example, I tried modifying the svn:ignore property for a directory and got this:
&gt; 
&gt; Property changes on: WebKitTools/Scripts/webkitpy
&gt; ___________________________________________________________________
&gt; Modified: svn:ignore
&gt;    - commands
&gt; init
&gt; irc
&gt; patch
&gt; steps
&gt; *.pyc
&gt; autoinstall.cache.d
&gt; 
&gt;    + commands
&gt; init
&gt; patch
&gt; steps
&gt; *.pyc
&gt; autoinstall.cache.d
&gt; test-add

Will add &quot;Modified&quot;.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>224231</commentid>
    <comment_count>12</comment_count>
    <who name="Chris Jerdonek">cjerdonek</who>
    <bug_when>2010-05-11 16:13:28 -0700</bug_when>
    <thetext>(In reply to comment #10)

Thanks a lot for your responses, Dan, and for incorporating that feedback.

&gt; &gt; &gt; +        } else {
&gt; &gt; &gt; +            # Some other content, such as the binary portion of an SVN binary diff.
&gt; &gt; &gt; +            last;
&gt; &gt; 
&gt; &gt; Since the binary lines are getting skipped over, how are they getting preserved
&gt; &gt; so the binary changes can later be applied?
&gt; 
&gt; The binary lines should not be skipped over. Disregarding the case where the 

Sorry for the confusion on this point.  I had misread that &quot;last&quot; to be &quot;next&quot;.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>228212</commentid>
    <comment_count>13</comment_count>
      <attachid>56567</attachid>
    <who name="Daniel Bates">dbates</who>
    <bug_when>2010-05-19 23:35:32 -0700</bug_when>
    <thetext>Created attachment 56567
Patch with unit tests</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>228337</commentid>
    <comment_count>14</comment_count>
      <attachid>56567</attachid>
    <who name="Chris Jerdonek">cjerdonek</who>
    <bug_when>2010-05-20 05:30:16 -0700</bug_when>
    <thetext>Comment on attachment 56567
Patch with unit tests

Thanks for the revised patch.  Some suggestions (mostly about comments) to consider before landing.

&gt; +# Parse the next SVN diff footer from the given file handle, and advance
&gt; +# the handle so the last line read is the first line after the footer.
&gt; +#
&gt; +# This subroutine dies if given leading junk.

I would just say &quot;Parse an SVN diff footer....&quot;  I would also not use the
phrase &quot;leading junk&quot; here since it is usually used in the context of
leading junk at the beginning of a patch (e.g. the e-mail stuff that appears
at the beginning of git-format-patch) rather than in the middle.

It might be nice to add a comment here that for the special case of an
SVN binary diff, there can be binary contents after the footer (so
technically speaking, the &quot;Property changes&quot; section is not the full
footer).  Should we be calling this parseSvnPropertyChanges() since it&apos;s
not really always the footer?

&gt; +    if (defined($_) &amp;&amp; /^\Q$separator\E[\r\n]+$/) {

Do you need to be using \Q/\E here?  If so, I would add a comment why since
it&apos;s a bit more obscure.

&gt; +    # FIXME: We should expand this to support other SVN properties.
&gt; +    # Notice, we keep processing until we hit end-of-file or some

I would add a blank line after FIXME line so it&apos;s clearer that the second
and subsequent lines is not part of the FIXME.

Also, did you want to hint at possible implementation for other SVN
properties -- e.g. by returning a hash of property key-values that
represents all properties?  The line you wrote makes it seem like the 
FIXME is to make the function explicitly more aware of other properties.
In some sense, returning a hash makes the function less aware of the 
specific properties since the special handling of svn:executable will be
going in the calling code with the implementation we&apos;ve discussed
(returning a hash).

&gt; +            # FIXME: Should the diff specify multiple values for svn:executable
&gt; +            #        (hence be malformed) then we set the value to the last
&gt; +            #        svn:executable property. We may want to consider some
&gt; +            #        better error handling.

I probably wouldn&apos;t bother with this FIXME.  We shouldn&apos;t need to be validating
every aspect of a patch.  And &quot;last wins&quot; is a valid logic to follow.

&gt; +####
&gt; +# Simple test cases
&gt; +##

This looks good.  I like how you start the text closer in. :)

&gt; +{
&gt; +    # New test
&gt; +    diffName =&gt; &quot;add svn:executable, followed by empty line and start of next property diff&quot;,
&gt; +    inputText =&gt; &lt;&lt;&apos;END&apos;,
&gt; +Property changes on: FileA
&gt; +___________________________________________________________________
&gt; +Added: svn:executable
&gt; +   + *
&gt; +
&gt; +Property changes on: Makefile.shared
&gt; +END

Can this case ever happen?  Is this what happens if a property change
is the only change to a file?

&gt; +####
&gt; +# Property value followed by empty line and start of binary patch
&gt; +##

I would say &quot;binary contents&quot; as binary patch makes it seem like it&apos;s the
start of a new diff.

&gt; +Added: documentation
&gt; +   + A sentence.

This is not a complete sentence.  JK. :)</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>229234</commentid>
    <comment_count>15</comment_count>
    <who name="Daniel Bates">dbates</who>
    <bug_when>2010-05-21 21:27:50 -0700</bug_when>
    <thetext>(In reply to comment #14)
&gt; (From update of attachment 56567 [details])
&gt; Thanks for the revised patch.  Some suggestions (mostly about comments) to consider before landing.
&gt; 
&gt; &gt; +# Parse the next SVN diff footer from the given file handle, and advance
&gt; &gt; +# the handle so the last line read is the first line after the footer.
&gt; &gt; +#
&gt; &gt; +# This subroutine dies if given leading junk.
&gt; 
&gt; I would just say &quot;Parse an SVN diff footer....&quot;  I would also not use the
&gt; phrase &quot;leading junk&quot; here since it is usually used in the context of
&gt; leading junk at the beginning of a patch (e.g. the e-mail stuff that appears
&gt; at the beginning of git-format-patch) rather than in the middle.

Will change.

&gt; It might be nice to add a comment here that for the special case of an
&gt; SVN binary diff, there can be binary contents after the footer (so
&gt; technically speaking, the &quot;Property changes&quot; section is not the full
&gt; footer).  Should we be calling this parseSvnPropertyChanges() since it&apos;s
&gt; not really always the footer?

I can add a comment about the binary diff. With regards to the name, what are your thoughts on parseSvnDiffPropertyChanges? This would follow our naming of parseDiff, parseDiffHeader, parseSvnDiffHeader, et cetera.

&gt; 
&gt; &gt; +    if (defined($_) &amp;&amp; /^\Q$separator\E[\r\n]+$/) {
&gt; 
&gt; Do you need to be using \Q/\E here?  If so, I would add a comment why since
&gt; it&apos;s a bit more obscure.

I&apos;ll remove the \Q and \E.

&gt; 
&gt; &gt; +    # FIXME: We should expand this to support other SVN properties.
&gt; &gt; +    # Notice, we keep processing until we hit end-of-file or some
&gt; 
&gt; I would add a blank line after FIXME line so it&apos;s clearer that the second
&gt; and subsequent lines is not part of the FIXME.

Will change.

&gt; Also, did you want to hint at possible implementation for other SVN
&gt; properties -- e.g. by returning a hash of property key-values that
&gt; represents all properties?  The line you wrote makes it seem like the 
&gt; FIXME is to make the function explicitly more aware of other properties.
&gt; In some sense, returning a hash makes the function less aware of the 
&gt; specific properties since the special handling of svn:executable will be
&gt; going in the calling code with the implementation we&apos;ve discussed
&gt; (returning a hash).

Sure, I&apos;ll elaborate a bit further in the FIXME.

&gt; 
&gt; &gt; +            # FIXME: Should the diff specify multiple values for svn:executable
&gt; &gt; +            #        (hence be malformed) then we set the value to the last
&gt; &gt; +            #        svn:executable property. We may want to consider some
&gt; &gt; +            #        better error handling.
&gt; 
&gt; I probably wouldn&apos;t bother with this FIXME.  We shouldn&apos;t need to be validating
&gt; every aspect of a patch.  And &quot;last wins&quot; is a valid logic to follow.

Will remove.

&gt; 
&gt; &gt; +####
&gt; &gt; +# Simple test cases
&gt; &gt; +##
&gt; 
&gt; This looks good.  I like how you start the text closer in. :)

:-)

&gt; 
&gt; &gt; +{
&gt; &gt; +    # New test
&gt; &gt; +    diffName =&gt; &quot;add svn:executable, followed by empty line and start of next property diff&quot;,
&gt; &gt; +    inputText =&gt; &lt;&lt;&apos;END&apos;,
&gt; &gt; +Property changes on: FileA
&gt; &gt; +___________________________________________________________________
&gt; &gt; +Added: svn:executable
&gt; &gt; +   + *
&gt; &gt; +
&gt; &gt; +Property changes on: Makefile.shared
&gt; &gt; +END
&gt; 
&gt; Can this case ever happen?  Is this what happens if a property change
&gt; is the only change to a file?

Yes, it can happen for the reason you stated. That is, a property change may be the only change to a file.

&gt; &gt; +####
&gt; &gt; +# Property value followed by empty line and start of binary patch
&gt; &gt; +##
&gt; 
&gt; I would say &quot;binary contents&quot; as binary patch makes it seem like it&apos;s the
&gt; start of a new diff.

Will change.

&gt; 
&gt; &gt; +Added: documentation
&gt; &gt; +   + A sentence.
&gt; 
&gt; This is not a complete sentence.  JK. :)

Will change.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>229237</commentid>
    <comment_count>16</comment_count>
    <who name="Chris Jerdonek">cjerdonek</who>
    <bug_when>2010-05-21 22:00:26 -0700</bug_when>
    <thetext>(In reply to comment #15)
&gt; &gt; It might be nice to add a comment here that for the special case of an
&gt; &gt; SVN binary diff, there can be binary contents after the footer (so
&gt; &gt; technically speaking, the &quot;Property changes&quot; section is not the full
&gt; &gt; footer).  Should we be calling this parseSvnPropertyChanges() since it&apos;s
&gt; &gt; not really always the footer?
&gt; 
&gt; I can add a comment about the binary diff. With regards to the name, what are your thoughts on parseSvnDiffPropertyChanges? This would follow our naming of parseDiff, parseDiffHeader, parseSvnDiffHeader, et cetera.

In that case, perhaps parseSvnDiffProperties() to keep it a tad shorter?

&gt; &gt; &gt; +Added: documentation
&gt; &gt; &gt; +   + A sentence.
&gt; &gt; 
&gt; &gt; This is not a complete sentence.  JK. :)
&gt; 
&gt; Will change.

That was a joke, so no need (JK = just kidding).  But you can if you want.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>229324</commentid>
    <comment_count>17</comment_count>
    <who name="Daniel Bates">dbates</who>
    <bug_when>2010-05-22 14:40:55 -0700</bug_when>
    <thetext>Committed r60015: &lt;http://trac.webkit.org/changeset/60015&gt;</thetext>
  </long_desc>
      
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>55654</attachid>
            <date>2010-05-10 20:54:48 -0700</date>
            <delta_ts>2010-05-10 21:17:45 -0700</delta_ts>
            <desc>Patch with unit tests</desc>
            <filename>Bug38885.patch</filename>
            <type>text/plain</type>
            <size>14128</size>
            <attacher name="Daniel Bates">dbates</attacher>
            
              <data encoding="base64">SW5kZXg6IFdlYktpdFRvb2xzL0NoYW5nZUxvZwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJLaXRUb29scy9D
aGFuZ2VMb2cJKHJldmlzaW9uIDU5MTI0KQorKysgV2ViS2l0VG9vbHMvQ2hhbmdlTG9nCSh3b3Jr
aW5nIGNvcHkpCkBAIC0xLDMgKzEsMTYgQEAKKzIwMTAtMDUtMTAgIERhbmllbCBCYXRlcyAgPGRi
YXRlc0ByaW0uY29tPgorCisgICAgICAgIFJldmlld2VkIGJ5IE5PQk9EWSAoT09QUyEpLgorCisg
ICAgICAgIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0zODg4NQorCisg
ICAgICAgIEltcGxlbWVudHMgc3VwcG9ydCBmb3IgcGFyc2luZyBhbiBTVk4gZm9vdGVyIGNvbnNp
c3Rpbmcgb2YgcHJvcGVydGllcy4KKyAgICAgICAgSW4gcGFydGljdWxhciwgc3VwcG9ydHMgcGFy
c2luZyB0aGUgc3ZuOmV4ZWN1dGFibGUgcHJvcGVydHkuCisKKyAgICAgICAgKiBTY3JpcHRzL1ZD
U1V0aWxzLnBtOgorICAgICAgICAqIFNjcmlwdHMvd2Via2l0cGVybC9WQ1NVdGlsc191bml0dGVz
dC9wYXJzZVN2bkRpZmZGb290ZXIucGw6IEFkZGVkLgorICAgICAgICAqIFNjcmlwdHMvd2Via2l0
cGVybC9WQ1NVdGlsc191bml0dGVzdC9wYXJzZVN2blByb3BlcnR5LnBsOiBBZGRlZC4KKwogMjAx
MC0wNS0xMCAgVG9ueSBDaGFuZyAgPHRvbnlAY2hyb21pdW0ub3JnPgogCiAgICAgICAgIFJldmll
d2VkIGJ5IEtlbnQgVGFtdXJhLgpJbmRleDogV2ViS2l0VG9vbHMvU2NyaXB0cy9WQ1NVdGlscy5w
bQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09Ci0tLSBXZWJLaXRUb29scy9TY3JpcHRzL1ZDU1V0aWxzLnBtCShyZXZpc2lv
biA1OTEyMikKKysrIFdlYktpdFRvb2xzL1NjcmlwdHMvVkNTVXRpbHMucG0JKHdvcmtpbmcgY29w
eSkKQEAgLTg2LDYgKzg2LDggQEAgbXkgJHN2blZlcnNpb247CiAKIG15ICRnaXREaWZmU3RhcnRS
ZWdFeCA9IHFyI15kaWZmIC0tZ2l0IChcdy8pPyguKykgKFx3Lyk/KFteXHJcbl0rKSM7CiBteSAk
c3ZuRGlmZlN0YXJ0UmVnRXggPSBxciNeSW5kZXg6IChbXlxyXG5dKykjOworbXkgJHN2bkZvb3Rl
clN0YXJ0UmVnRXggPSBxciNeUHJvcGVydHkgY2hhbmdlcyBvbjogKFteXHJcbl0rKSM7CitteSAk
c3ZuUHJvcGVydHlOYW1lUmVnRXggPSBxciNeKE5hbWV8QWRkZWR8RGVsZXRlZCk6IChbXlxyXG5d
KykjOwogCiAjIFRoaXMgbWV0aG9kIGlzIGZvciBwb3J0YWJpbGl0eS4gUmV0dXJuIHRoZSBzeXN0
ZW0tYXBwcm9wcmlhdGUgZXhpdAogIyBzdGF0dXMgb2YgYSBjaGlsZCBwcm9jZXNzLgpAQCAtNjU3
LDYgKzY1OSwxMzcgQEAgc3ViIHBhcnNlU3ZuRGlmZkhlYWRlcigkJCkKICAgICByZXR1cm4gKFwl
aGVhZGVyLCAkXyk7CiB9CiAKKyMgUGFyc2UgdGhlIG5leHQgU1ZOIGRpZmYgZm9vdGVyIGZyb20g
dGhlIGdpdmVuIGZpbGUgaGFuZGxlLCBhbmQgYWR2YW5jZQorIyB0aGUgaGFuZGxlIHNvIHRoZSBs
YXN0IGxpbmUgcmVhZCBpcyB0aGUgZmlyc3QgbGluZSBhZnRlciB0aGUgZm9vdGVyLgorIworIyBU
aGlzIHN1YnJvdXRpbmUgZGllcyBpZiBnaXZlbiBsZWFkaW5nIGp1bmsuCisjCisjIEFyZ3M6Cisj
ICAgJGZpbGVIYW5kbGU6IGFkdmFuY2VkIHNvIHRoZSBsYXN0IGxpbmUgcmVhZCBmcm9tIHRoZSBo
YW5kbGUgaXMgZWl0aGVyIHRoZQorIyAgICAgICAgICAgICAgICB0aGUgZmlyc3Qgb2NjdXJlbmNl
IG9mIGFuIGVtcHR5IGxpbmUgb3IgdGhlIGZpcnN0IGxpbmUgb2YgdGhlCisjICAgICAgICAgICAg
ICAgIG5leHQgaGVhZGVyIHRvIHBhcnNlLiAgRm9yIFNWTi1mb3JtYXR0ZWQgZGlmZnMsIHRoaXMg
aXMgYSBsaW5lCisjICAgICAgICAgICAgICAgIGJlZ2lubmluZyB3aXRoICJJbmRleDoiLiAgRm9y
IEdpdCwgdGhpcyBpcyBhIGxpbmUgYmVnaW5uaW5nCisjICAgICAgICAgICAgICAgIHdpdGggImRp
ZmYgLS1naXQiLgorIyAgICRsaW5lOiB0aGUgbGluZSBsYXN0IHJlYWQgZnJvbSAkZmlsZUhhbmRs
ZQorIworIyBSZXR1cm5zICgkZm9vdGVySGFzaFJlZiwgJGxhc3RSZWFkTGluZSk6CisjICAgJGZv
b3Rlckhhc2hSZWY6IGEgaGFzaCByZWZlcmVuY2UgcmVwcmVzZW50aW5nIGEgZGlmZiBmb290ZXIK
KyMgICAgIHByb3BlcnR5UGF0aDogdGhlIHBhdGggb2YgdGhlIHRhcmdldCBmaWxlLgorIyAgICAg
ZXhlY3V0YWJsZUJpdERlbHRhOiB0aGUgdmFsdWUgMSBvciAtMSBpZiB0aGUgZXhlY3V0YWJsZSBi
aXQgd2FzIGFkZGVkIG9yCisjICAgICAgICAgICAgICAgICAgICAgICAgIHJlbW92ZWQsIHJlc3Bl
Y3RpdmVseS4gIE5ldyBhbmQgZGVsZXRlZCBmaWxlcyBoYXZlCisjICAgICAgICAgICAgICAgICAg
ICAgICAgIHRoaXMgdmFsdWUgb25seSBpZiB0aGUgZmlsZSBpcyBleGVjdXRhYmxlLCBpbiB3aGlj
aAorIyAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIHRoZSB2YWx1ZSBpcyAxIGFuZCAtMSwg
cmVzcGVjdGl2ZWx5LgorIyAgICRsYXN0UmVhZExpbmU6IHRoZSBsaW5lIGxhc3QgcmVhZCBmcm9t
ICRmaWxlSGFuZGxlLgorc3ViIHBhcnNlU3ZuRGlmZkZvb3RlcigkJCkKK3sKKyAgICBteSAoJGZp
bGVIYW5kbGUsICRsaW5lKSA9IEBfOworCisgICAgJF8gPSAkbGluZTsKKworICAgIG15ICRwcm9w
ZXJ0eVBhdGg7CisgICAgaWYgKC8kc3ZuRm9vdGVyU3RhcnRSZWdFeC8pIHsKKyAgICAgICAgJHBy
b3BlcnR5UGF0aCA9ICQxOworICAgIH0gZWxzZSB7CisgICAgICAgIGRpZSgiRmlyc3QgbGluZSBv
ZiBTVk4gZGlmZiBkb2VzIG5vdCBiZWdpbiB3aXRoIFwiUHJvcGVydHkgY2hhbmdlcyBvbiBcIjog
XCIkX1wiIik7CisgICAgfQorCisgICAgbXkgJWZvb3RlcjsKKyAgICAkZm9vdGVye3Byb3BlcnR5
UGF0aH0gPSAkcHJvcGVydHlQYXRoOworICAgIG15ICRwcm9wZXJ0eUhhc2hSZWY7CisgICAgd2hp
bGUgKDEpIHsKKworICAgICAgICBpZiAoLyRzdm5Qcm9wZXJ0eU5hbWVSZWdFeC8pIHsKKyAgICAg
ICAgICAgICgkcHJvcGVydHlIYXNoUmVmLCAkXykgPSBwYXJzZVN2blByb3BlcnR5KCRmaWxlSGFu
ZGxlLCAkXyk7CisgICAgICAgICAgICAkZm9vdGVye2V4ZWN1dGFibGVCaXREZWx0YX0gPSAkcHJv
cGVydHlIYXNoUmVmLT57cHJvcGVydHlDaGFuZ2VEZWx0YX0gaWYgJHByb3BlcnR5SGFzaFJlZi0+
e25hbWV9IGVxICJzdm46ZXhlY3V0YWJsZSI7CisgICAgICAgIH0KKworICAgICAgICAkXyA9IDwk
ZmlsZUhhbmRsZT47ICMgTm90IGRlZmluZWQgaWYgZW5kLW9mLWZpbGUgcmVhY2hlZC4KKworICAg
ICAgICAjIFNpbmNlIHRoZSBib2R5IG9mIGFuIFNWTiBiaW5hcnkgcGF0Y2ggZm9sbG93cyB0aGUg
Zm9vdGVyLCB3ZSBicmVhaworICAgICAgICAjIGlmIHRoZSBuZXh0IGxpbmUgcmVhZCBpcyBlbXB0
eS4KKyAgICAgICAgbGFzdCBpZiAoIWRlZmluZWQoJF8pIHx8IC9eJC8gfHwgLyRzdm5EaWZmU3Rh
cnRSZWdFeC8gfHwgLyRnaXREaWZmU3RhcnRSZWdFeC8pOworICAgIH0KKworICAgIHJldHVybiAo
XCVmb290ZXIsICRfKTsKK30KKworIyBQYXJzZSB0aGUgbmV4dCBTVk4gcHJvcGVydHkgZnJvbSB0
aGUgZ2l2ZW4gZmlsZSBoYW5kbGUsIGFuZCBhZHZhbmNlCisjIHRoZSBoYW5kbGUgc28gdGhlIGxh
c3QgbGluZSByZWFkIGlzIHRoZSBmaXJzdCBsaW5lIGFmdGVyIHRoZSBwcm9wZXJ0eQorIyB2YWx1
ZS4KKyMKKyMgVGhpcyBzdWJyb3V0aW5lIGRpZXMgaWYgZ2l2ZW4gbGVhZGluZyBqdW5rLgorIwor
IyBBcmdzOgorIyAgICRmaWxlSGFuZGxlOiBhZHZhbmNlZCBzbyB0aGUgbGFzdCBsaW5lIHJlYWQg
ZnJvbSB0aGUgaGFuZGxlIGlzIHRoZSBmaXJzdCBsaW5lCisjICAgICAgICAgICAgICAgIG9mIHRo
ZSBuZXh0IHByb3BlcnR5IHRvIHBhcnNlLgorIyAgICRsaW5lOiB0aGUgbGluZSBsYXN0IHJlYWQg
ZnJvbSAkZmlsZUhhbmRsZQorIworIyBSZXR1cm5zICgkcHJvcGVydHlIYXNoUmVmLCAkbGFzdFJl
YWRMaW5lKToKKyMgICAkcHJvcGVydHlIYXNoUmVmOiBhIGhhc2ggcmVmZXJlbmNlIHJlcHJlc2Vu
dGluZyBhIGRpZmYgZm9vdGVyCisjICAgICBuYW1lOiB0aGUgbmFtZSBvZiB0aGUgcHJvcGVydHku
CisjICAgICB2YWx1ZTogdGhlIHZhbHVlIG9mIHRoZSBwcm9wZXJ0eS4KKyMgICAgIHByb3BlcnR5
Q2hhbmdlRGVsdGE6IHRoZSB2YWx1ZSAxIG9yIC0xIGlmIHRoZSBwcm9wZXJ0eSB3YXMgYWRkZWQg
b3IKKyMgICAgICAgICAgICAgICAgICAgICAgICAgcmVtb3ZlZCwgcmVzcGVjdGl2ZWx5LgorIyAg
ICRsYXN0UmVhZExpbmU6IHRoZSBsaW5lIGxhc3QgcmVhZCBmcm9tICRmaWxlSGFuZGxlLgorc3Vi
IHBhcnNlU3ZuUHJvcGVydHkoJCQpCit7CisgICAgbXkgKCRmaWxlSGFuZGxlLCAkbGluZSkgPSBA
XzsKKworICAgICRfID0gJGxpbmU7CisKKyAgICBteSAkc3ZuUHJvcGVydHlWYWx1ZVJlZ0V4ID0g
cXIjXlxzKihcK3wtKVxzKihbXlxyXG5dKykjOworCisgICAgbXkgJHByb3BlcnR5TmFtZTsKKyAg
ICBteSAkcHJvcGVydHlOYW1lUHJlZml4OworICAgIGlmICgvJHN2blByb3BlcnR5TmFtZVJlZ0V4
LykgeworICAgICAgICAkcHJvcGVydHlOYW1lUHJlZml4ID0gJDE7CisgICAgICAgICRwcm9wZXJ0
eU5hbWUgPSAkMjsKKyAgICB9IGVsc2UgeworICAgICAgICBkaWUoIkZhaWxlZCB0byBmaW5kIFNW
TiBwcm9wZXJ0eSBuYW1lOiBcIiRfXCIiKTsKKyAgICB9CisKKyAgICBteSAkcHJvcGVydHlDaGFu
Z2VEZWx0YSA9IDA7CisgICAgbXkgJHByb3BlcnR5VmFsdWU7CisgICAgbXkgJHByb3BlcnR5VmFs
dWVQcmVmaXg7CisgICAgd2hpbGUgKDEpIHsKKyAgICAgICAgIyBTdHJpcCBvZmYgYW55IGVuZC1v
Zi1saW5lIGNoYXJhY3RlcnMgdG8gc2ltcGxpZnkgcmVnZXggbWF0Y2hpbmcgYmVsb3cuCisgICAg
ICAgIHMvKFtcblxyXSspJC8vOworCisgICAgICAgIGlmICgvJHN2blByb3BlcnR5VmFsdWVSZWdF
eC8pIHsKKyAgICAgICAgICAgICRwcm9wZXJ0eVZhbHVlUHJlZml4ID0gJDE7CisgICAgICAgICAg
ICAkcHJvcGVydHlWYWx1ZSA9ICQyOworICAgICAgICAgICAgbGFzdDsKKyAgICAgICAgfQorCisg
ICAgICAgICRfID0gPCRmaWxlSGFuZGxlPjsgIyBOb3QgZGVmaW5lZCBpZiBlbmQtb2YtZmlsZSBy
ZWFjaGVkLgorCisgICAgICAgIGxhc3QgaWYgKCFkZWZpbmVkKCRfKSB8fCAvJHN2blByb3BlcnR5
TmFtZVJlZ0V4Lyk7CisgICAgfQorCisgICAgJHByb3BlcnR5Q2hhbmdlRGVsdGEgPSAoJHByb3Bl
cnR5VmFsdWVQcmVmaXggZXEgJysnKSA/IDEgOiAtMTsKKyAgICBteSAkZXhwZWN0ZWRDaGFuZ2VE
ZWx0YSA9IDA7CisgICAgaWYgKCRwcm9wZXJ0eU5hbWVQcmVmaXggZXEgIkFkZGVkIikgeworICAg
ICAgICAkZXhwZWN0ZWRDaGFuZ2VEZWx0YSA9IDE7CisgICAgfSBlbHNpZiAoJHByb3BlcnR5TmFt
ZVByZWZpeCBlcSAiRGVsZXRlZCIpIHsKKyAgICAgICAgJGV4cGVjdGVkQ2hhbmdlRGVsdGEgPSAt
MTsKKyAgICB9CisKKyAgICBpZiAoJHByb3BlcnR5Q2hhbmdlRGVsdGEgPT0gLTEgKiAkZXhwZWN0
ZWRDaGFuZ2VEZWx0YSkgeworICAgICAgICBkaWUoIlByb3BlcnR5IGNoYW5nZSBwcmVmaXggXCIk
cHJvcGVydHlWYWx1ZVByZWZpeFwiIGRvZXMgbm90IG1hdGNoICIgLgorICAgICAgICAgICAgInRo
ZSBwcm9wZXJ0eSBuYW1lIHByZWZpeCBcIiRwcm9wZXJ0eU5hbWVQcmVmaXhcIi4iKTsKKyAgICB9
CisKKyAgICBpZiAoISRwcm9wZXJ0eVZhbHVlKSB7CisgICAgICAgIGRpZSgiRGlkIG5vdCBmaW5k
IHByb3BlcnR5IHZhbHVlIGZvciBwcm9wZXJ0eTogXCIkcHJvcGVydHlOYW1lXCIiKTsKKyAgICB9
CisKKyAgICBteSAlcHJvcGVydHlIYXNoOworICAgICRwcm9wZXJ0eUhhc2h7bmFtZX0gPSAkcHJv
cGVydHlOYW1lOworICAgICRwcm9wZXJ0eUhhc2h7cHJvcGVydHlDaGFuZ2VEZWx0YX0gPSAkcHJv
cGVydHlDaGFuZ2VEZWx0YTsKKyAgICAkcHJvcGVydHlIYXNoe3ZhbHVlfSA9ICRwcm9wZXJ0eVZh
bHVlOworICAgIHJldHVybiAoXCVwcm9wZXJ0eUhhc2gsICRfKTsKK30KKwogIyBQYXJzZSB0aGUg
bmV4dCBkaWZmIGhlYWRlciBmcm9tIHRoZSBnaXZlbiBmaWxlIGhhbmRsZSwgYW5kIGFkdmFuY2UK
ICMgdGhlIGhhbmRsZSBzbyB0aGUgbGFzdCBsaW5lIHJlYWQgaXMgdGhlIGZpcnN0IGxpbmUgYWZ0
ZXIgdGhlIGhlYWRlci4KICMKSW5kZXg6IFdlYktpdFRvb2xzL1NjcmlwdHMvd2Via2l0cGVybC9W
Q1NVdGlsc191bml0dGVzdC9wYXJzZVN2bkRpZmZGb290ZXIucGwKPT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2Vi
S2l0VG9vbHMvU2NyaXB0cy93ZWJraXRwZXJsL1ZDU1V0aWxzX3VuaXR0ZXN0L3BhcnNlU3ZuRGlm
ZkZvb3Rlci5wbAkocmV2aXNpb24gMCkKKysrIFdlYktpdFRvb2xzL1NjcmlwdHMvd2Via2l0cGVy
bC9WQ1NVdGlsc191bml0dGVzdC9wYXJzZVN2bkRpZmZGb290ZXIucGwJKHJldmlzaW9uIDApCkBA
IC0wLDAgKzEsMTExIEBACisjIS91c3IvYmluL3BlcmwgLXcKKyMKKyMgQ29weXJpZ2h0IChDKSBS
ZXNlYXJjaCBpbiBNb3Rpb24gTGltaXRlZCAyMDEwLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorIyBD
b3B5cmlnaHQgKEMpIDIwMTAgQ2hyaXMgSmVyZG9uZWsgKGNocmlzLmplcmRvbmVrQGdtYWlsLmNv
bSkKKyMKKyMgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jt
cywgd2l0aCBvciB3aXRob3V0CisjIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRl
ZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKyMgbWV0OgorIworIyAgICAgKiBS
ZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHly
aWdodAorIyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5n
IGRpc2NsYWltZXIuCisjICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0
IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyMgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNv
bmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorIyBpbiB0aGUgZG9jdW1lbnRh
dGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisjIGRpc3RyaWJ1
dGlvbi4KKyMgICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBBcHBsZSBDb21wdXRlciwgSW5jLiAo
IkFwcGxlIikgbm9yIHRoZSBuYW1lcyBvZgorIyBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2Vk
IHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisjIGZyb20gdGhpcyBzb2Z0
d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyMKKyMgVEhJ
UyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRS
SUJVVE9SUworIyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMs
IElOQ0xVRElORywgQlVUIE5PVAorIyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVT
IE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyMgQSBQQVJUSUNVTEFSIFBVUlBP
U0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKyMgT1dO
RVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElO
Q0lERU5UQUwsCisjIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VT
IChJTkNMVURJTkcsIEJVVCBOT1QKKyMgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJ
VFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisjIERBVEEsIE9SIFBST0ZJVFM7
IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorIyBU
SEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZ
LCBPUiBUT1JUCisjIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcg
SU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorIyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFE
VklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisjIFVuaXQgdGVzdHMg
b2YgcGFyc2VTdm5EaWZmRm9vdGVyKCkuCisKK3VzZSBzdHJpY3Q7Cit1c2Ugd2FybmluZ3M7CisK
K3VzZSBUZXN0OjpNb3JlOwordXNlIFZDU1V0aWxzOworCisjIFRoZSBhcnJheSBvZiB0ZXN0IGNh
c2VzLgorbXkgQHRlc3RDYXNlSGFzaFJlZnMgPSAoCit7CisgICAgIyBOZXcgdGVzdAorICAgIGRp
ZmZOYW1lID0+ICJhZGQgZXhlY3V0YWJsZSBiaXQiLAorICAgIGlucHV0VGV4dCA9PiA8PCdFTkQn
LAorUHJvcGVydHkgY2hhbmdlcyBvbjogTWFrZWZpbGUKK19fX19fX19fX19fX19fX19fX19fX19f
X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KK0FkZGVkOiBzdm46
ZXhlY3V0YWJsZQorICAgKyAqCitFTkQKKyAgICBleHBlY3RlZFJldHVybiA9PiBbCit7CisgICAg
ZXhlY3V0YWJsZUJpdERlbHRhID0+IDEsCisgICAgcHJvcGVydHlQYXRoID0+ICJNYWtlZmlsZSIs
Cit9LAordW5kZWZdLAorICAgIGV4cGVjdGVkTmV4dExpbmUgPT4gdW5kZWYsCit9LAoreworICAg
ICMgTmV3IHRlc3QKKyAgICBkaWZmTmFtZSA9PiAiZGVsZXRlIGV4ZWN1dGFibGUgYml0IiwKKyAg
ICBpbnB1dFRleHQgPT4gPDwnRU5EJywKK1Byb3BlcnR5IGNoYW5nZXMgb246IE1ha2VmaWxlCitf
X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f
X19fX19fX19fCitEZWxldGVkOiBzdm46ZXhlY3V0YWJsZQorICAgLSAqCitFTkQKKyAgICBleHBl
Y3RlZFJldHVybiA9PiBbCit7CisgICAgZXhlY3V0YWJsZUJpdERlbHRhID0+IC0xLAorICAgIHBy
b3BlcnR5UGF0aCA9PiAiTWFrZWZpbGUiLAorfSwKK3VuZGVmXSwKKyAgICBleHBlY3RlZE5leHRM
aW5lID0+IHVuZGVmLAorfSwKK3sKKyAgICAjIE5ldyB0ZXN0CisgICAgZGlmZk5hbWUgPT4gImR1
bW15IHByb3BlcnR5IiwKKyAgICBpbnB1dFRleHQgPT4gPDwnRU5EJywKK1Byb3BlcnR5IGNoYW5n
ZXMgb246IE1ha2VmaWxlCitfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f
X19fX19fX19fX19fX19fX19fX19fX19fX19fCitBZGRlZDogZHVtbXlfcHJvcGVydHkKKyAgICsg
ZHVtbXlfcHJvcGVydHkKK0VORAorICAgIGV4cGVjdGVkUmV0dXJuID0+IFsKK3sKKyAgICBwcm9w
ZXJ0eVBhdGggPT4gIk1ha2VmaWxlIiwKK30sCit1bmRlZl0sCisgICAgZXhwZWN0ZWROZXh0TGlu
ZSA9PiB1bmRlZiwKK30sCispOworCitteSAkdGVzdENhc2VzQ291bnQgPSBAdGVzdENhc2VIYXNo
UmVmczsKK3BsYW4odGVzdHMgPT4gMiAqICR0ZXN0Q2FzZXNDb3VudCk7ICMgVG90YWwgbnVtYmVy
IG9mIGFzc2VydGlvbnMuCisKK2ZvcmVhY2ggbXkgJHRlc3RDYXNlIChAdGVzdENhc2VIYXNoUmVm
cykgeworICAgIG15ICR0ZXN0TmFtZVN0YXJ0ID0gInBhcnNlU3ZuRGlmZkZvb3RlcigpOiAkdGVz
dENhc2UtPntkaWZmTmFtZX06IGNvbXBhcmluZyI7CisKKyAgICBteSAkZmlsZUhhbmRsZTsKKyAg
ICBvcGVuKCRmaWxlSGFuZGxlLCAiPCIsIFwkdGVzdENhc2UtPntpbnB1dFRleHR9KTsKKyAgICBt
eSAkbGluZSA9IDwkZmlsZUhhbmRsZT47CisKKyAgICBteSBAZ290ID0gVkNTVXRpbHM6OnBhcnNl
U3ZuRGlmZkZvb3RlcigkZmlsZUhhbmRsZSwgJGxpbmUpOworICAgIG15ICRleHBlY3RlZFJldHVy
biA9ICR0ZXN0Q2FzZS0+e2V4cGVjdGVkUmV0dXJufTsKKworICAgIGlzX2RlZXBseShcQGdvdCwg
JGV4cGVjdGVkUmV0dXJuLCAiJHRlc3ROYW1lU3RhcnQgcmV0dXJuIHZhbHVlLiIpOworCisgICAg
bXkgJGdvdE5leHRMaW5lID0gPCRmaWxlSGFuZGxlPjsKKyAgICBpcygkZ290TmV4dExpbmUsICR0
ZXN0Q2FzZS0+e2V4cGVjdGVkTmV4dExpbmV9LCAgIiR0ZXN0TmFtZVN0YXJ0IG5leHQgcmVhZCBs
aW5lLiIpOworfQpJbmRleDogV2ViS2l0VG9vbHMvU2NyaXB0cy93ZWJraXRwZXJsL1ZDU1V0aWxz
X3VuaXR0ZXN0L3BhcnNlU3ZuUHJvcGVydHkucGwKPT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViS2l0VG9vbHMv
U2NyaXB0cy93ZWJraXRwZXJsL1ZDU1V0aWxzX3VuaXR0ZXN0L3BhcnNlU3ZuUHJvcGVydHkucGwJ
KHJldmlzaW9uIDApCisrKyBXZWJLaXRUb29scy9TY3JpcHRzL3dlYmtpdHBlcmwvVkNTVXRpbHNf
dW5pdHRlc3QvcGFyc2VTdm5Qcm9wZXJ0eS5wbAkocmV2aXNpb24gMCkKQEAgLTAsMCArMSwxMjUg
QEAKKyMhL3Vzci9iaW4vcGVybCAtdworIworIyBDb3B5cmlnaHQgKEMpIFJlc2VhcmNoIGluIE1v
dGlvbiBMaW1pdGVkIDIwMTAuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisjIENvcHlyaWdodCAoQykg
MjAxMCBDaHJpcyBKZXJkb25layAoY2hyaXMuamVyZG9uZWtAZ21haWwuY29tKQorIworIyBSZWRp
c3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdp
dGhvdXQKKyMgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZv
bGxvd2luZyBjb25kaXRpb25zIGFyZQorIyBtZXQ6CisjCisjICAgICAqIFJlZGlzdHJpYnV0aW9u
cyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisjIG5vdGlj
ZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4K
KyMgICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRo
ZSBhYm92ZQorIyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQg
dGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisjIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBv
dGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyMgZGlzdHJpYnV0aW9uLgorIyAgICAg
KiBOZWl0aGVyIHRoZSBuYW1lIG9mIEFwcGxlIENvbXB1dGVyLCBJbmMuICgiQXBwbGUiKSBub3Ig
dGhlIG5hbWVzIG9mCisjIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBv
ciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyMgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQg
c3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorIworIyBUSElTIFNPRlRXQVJFIElT
IFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisjICJB
UyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBC
VVQgTk9UCisjIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRB
QklMSVRZIEFORCBGSVRORVNTIEZPUgorIyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xB
SU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorIyBPV05FUiBPUiBDT05UUklC
VVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyMg
U1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywg
QlVUIE5PVAorIyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9S
IFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyMgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1Mg
SU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisjIFRIRU9SWSBPRiBMSUFC
SUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyMg
KElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9V
VCBPRiBUSEUgVVNFCisjIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUg
UE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyMgVW5pdCB0ZXN0cyBvZiBwYXJzZVN2blBy
b3BlcnR5KCkuCisKK3VzZSBzdHJpY3Q7Cit1c2Ugd2FybmluZ3M7CisKK3VzZSBUZXN0OjpNb3Jl
OwordXNlIFZDU1V0aWxzOworCisjIFRoZSBhcnJheSBvZiB0ZXN0IGNhc2VzLgorbXkgQHRlc3RD
YXNlSGFzaFJlZnMgPSAoCit7CisgICAgIyBOZXcgdGVzdAorICAgIGRpZmZOYW1lID0+ICInQWRk
ZWQ6IHN2bjpleGVjdXRhYmxlJyBhbmQgJysnIiwKKyAgICBpbnB1dFRleHQgPT4gPDwnRU5EJywK
K0FkZGVkOiBzdm46ZXhlY3V0YWJsZQorICAgKyAqCitFTkQKKyAgICBleHBlY3RlZFJldHVybiA9
PiBbCit7CisgICAgbmFtZSA9PiAic3ZuOmV4ZWN1dGFibGUiLAorICAgIHByb3BlcnR5Q2hhbmdl
RGVsdGEgPT4gMSwKKyAgICB2YWx1ZSA9PiAiKiIsCit9LAorIiAgICsgKiJdLAorICAgIGV4cGVj
dGVkTmV4dExpbmUgPT4gdW5kZWYsCit9LAoreworICAgICMgTmV3IHRlc3QKKyAgICBkaWZmTmFt
ZSA9PiAiJ0RlbGV0ZWQ6IHN2bjpleGVjdXRhYmxlJyBhbmQgJy0nIiwKKyAgICBpbnB1dFRleHQg
PT4gPDwnRU5EJywKK0RlbGV0ZWQ6IHN2bjpleGVjdXRhYmxlCisgICAtICoKK0VORAorICAgIGV4
cGVjdGVkUmV0dXJuID0+IFsKK3sKKyAgICBuYW1lID0+ICJzdm46ZXhlY3V0YWJsZSIsCisgICAg
cHJvcGVydHlDaGFuZ2VEZWx0YSA9PiAtMSwKKyAgICB2YWx1ZSA9PiAiKiIsCit9LAorIiAgIC0g
KiJdLAorICAgIGV4cGVjdGVkTmV4dExpbmUgPT4gdW5kZWYsCit9LAoreworICAgICMgTmV3IHRl
c3QKKyAgICBkaWZmTmFtZSA9PiAiJ05hbWU6IHN2bjpleGVjdXRhYmxlJyBhbmQgJy0nIiwKKyAg
ICBpbnB1dFRleHQgPT4gPDwnRU5EJywKK05hbWU6IHN2bjpleGVjdXRhYmxlCisgICAtICoKK0VO
RAorICAgIGV4cGVjdGVkUmV0dXJuID0+IFsKK3sKKyAgICBuYW1lID0+ICJzdm46ZXhlY3V0YWJs
ZSIsCisgICAgcHJvcGVydHlDaGFuZ2VEZWx0YSA9PiAtMSwKKyAgICB2YWx1ZSA9PiAiKiIsCit9
LAorIiAgIC0gKiJdLAorICAgIGV4cGVjdGVkTmV4dExpbmUgPT4gdW5kZWYsCit9LAoreworICAg
ICMgTmV3IHRlc3QKKyAgICBkaWZmTmFtZSA9PiAiJ05hbWU6IHN2bjpleGVjdXRhYmxlJyBhbmQg
JysnIiwKKyAgICBpbnB1dFRleHQgPT4gPDwnRU5EJywKK05hbWU6IHN2bjpleGVjdXRhYmxlCisg
ICArICoKK0VORAorICAgIGV4cGVjdGVkUmV0dXJuID0+IFsKK3sKKyAgICBuYW1lID0+ICJzdm46
ZXhlY3V0YWJsZSIsCisgICAgcHJvcGVydHlDaGFuZ2VEZWx0YSA9PiAxLAorICAgIHZhbHVlID0+
ICIqIiwKK30sCisiICAgKyAqIl0sCisgICAgZXhwZWN0ZWROZXh0TGluZSA9PiB1bmRlZiwKK30s
CispOworCitteSAkdGVzdENhc2VzQ291bnQgPSBAdGVzdENhc2VIYXNoUmVmczsKK3BsYW4odGVz
dHMgPT4gMiAqICR0ZXN0Q2FzZXNDb3VudCk7ICMgVG90YWwgbnVtYmVyIG9mIGFzc2VydGlvbnMu
CisKK2ZvcmVhY2ggbXkgJHRlc3RDYXNlIChAdGVzdENhc2VIYXNoUmVmcykgeworICAgIG15ICR0
ZXN0TmFtZVN0YXJ0ID0gInBhcnNlU3ZuUHJvcGVydHkoKTogJHRlc3RDYXNlLT57ZGlmZk5hbWV9
OiBjb21wYXJpbmciOworCisgICAgbXkgJGZpbGVIYW5kbGU7CisgICAgb3BlbigkZmlsZUhhbmRs
ZSwgIjwiLCBcJHRlc3RDYXNlLT57aW5wdXRUZXh0fSk7CisgICAgbXkgJGxpbmUgPSA8JGZpbGVI
YW5kbGU+OworCisgICAgbXkgQGdvdCA9IFZDU1V0aWxzOjpwYXJzZVN2blByb3BlcnR5KCRmaWxl
SGFuZGxlLCAkbGluZSk7CisgICAgbXkgJGV4cGVjdGVkUmV0dXJuID0gJHRlc3RDYXNlLT57ZXhw
ZWN0ZWRSZXR1cm59OworCisgICAgaXNfZGVlcGx5KFxAZ290LCAkZXhwZWN0ZWRSZXR1cm4sICIk
dGVzdE5hbWVTdGFydCByZXR1cm4gdmFsdWUuIik7CisKKyAgICBteSAkZ290TmV4dExpbmUgPSA8
JGZpbGVIYW5kbGU+OworICAgIGlzKCRnb3ROZXh0TGluZSwgJHRlc3RDYXNlLT57ZXhwZWN0ZWRO
ZXh0TGluZX0sICAiJHRlc3ROYW1lU3RhcnQgbmV4dCByZWFkIGxpbmUuIik7Cit9Cg==
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>55655</attachid>
            <date>2010-05-10 21:17:45 -0700</date>
            <delta_ts>2010-05-10 23:20:41 -0700</delta_ts>
            <desc>Patch with unit tests</desc>
            <filename>Bug38885_1.patch</filename>
            <type>text/plain</type>
            <size>14406</size>
            <attacher name="Daniel Bates">dbates</attacher>
            
              <data encoding="base64">SW5kZXg6IFdlYktpdFRvb2xzL0NoYW5nZUxvZwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJLaXRUb29scy9D
aGFuZ2VMb2cJKHJldmlzaW9uIDU5MTI0KQorKysgV2ViS2l0VG9vbHMvQ2hhbmdlTG9nCSh3b3Jr
aW5nIGNvcHkpCkBAIC0xLDMgKzEsMTYgQEAKKzIwMTAtMDUtMTAgIERhbmllbCBCYXRlcyAgPGRi
YXRlc0ByaW0uY29tPgorCisgICAgICAgIFJldmlld2VkIGJ5IE5PQk9EWSAoT09QUyEpLgorCisg
ICAgICAgIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0zODg4NQorCisg
ICAgICAgIEltcGxlbWVudHMgc3VwcG9ydCBmb3IgcGFyc2luZyBhbiBTVk4gZm9vdGVyIGNvbnNp
c3Rpbmcgb2YgcHJvcGVydGllcy4KKyAgICAgICAgSW4gcGFydGljdWxhciwgc3VwcG9ydHMgcGFy
c2luZyB0aGUgc3ZuOmV4ZWN1dGFibGUgcHJvcGVydHkuCisKKyAgICAgICAgKiBTY3JpcHRzL1ZD
U1V0aWxzLnBtOgorICAgICAgICAqIFNjcmlwdHMvd2Via2l0cGVybC9WQ1NVdGlsc191bml0dGVz
dC9wYXJzZVN2bkRpZmZGb290ZXIucGw6IEFkZGVkLgorICAgICAgICAqIFNjcmlwdHMvd2Via2l0
cGVybC9WQ1NVdGlsc191bml0dGVzdC9wYXJzZVN2blByb3BlcnR5LnBsOiBBZGRlZC4KKwogMjAx
MC0wNS0xMCAgVG9ueSBDaGFuZyAgPHRvbnlAY2hyb21pdW0ub3JnPgogCiAgICAgICAgIFJldmll
d2VkIGJ5IEtlbnQgVGFtdXJhLgpJbmRleDogV2ViS2l0VG9vbHMvU2NyaXB0cy9WQ1NVdGlscy5w
bQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09Ci0tLSBXZWJLaXRUb29scy9TY3JpcHRzL1ZDU1V0aWxzLnBtCShyZXZpc2lv
biA1OTEyMikKKysrIFdlYktpdFRvb2xzL1NjcmlwdHMvVkNTVXRpbHMucG0JKHdvcmtpbmcgY29w
eSkKQEAgLTg2LDYgKzg2LDggQEAgbXkgJHN2blZlcnNpb247CiAKIG15ICRnaXREaWZmU3RhcnRS
ZWdFeCA9IHFyI15kaWZmIC0tZ2l0IChcdy8pPyguKykgKFx3Lyk/KFteXHJcbl0rKSM7CiBteSAk
c3ZuRGlmZlN0YXJ0UmVnRXggPSBxciNeSW5kZXg6IChbXlxyXG5dKykjOworbXkgJHN2bkZvb3Rl
clN0YXJ0UmVnRXggPSBxciNeUHJvcGVydHkgY2hhbmdlcyBvbjogKFteXHJcbl0rKSM7CitteSAk
c3ZuUHJvcGVydHlOYW1lUmVnRXggPSBxciNeKE5hbWV8QWRkZWR8RGVsZXRlZCk6IChbXlxyXG5d
KykjOwogCiAjIFRoaXMgbWV0aG9kIGlzIGZvciBwb3J0YWJpbGl0eS4gUmV0dXJuIHRoZSBzeXN0
ZW0tYXBwcm9wcmlhdGUgZXhpdAogIyBzdGF0dXMgb2YgYSBjaGlsZCBwcm9jZXNzLgpAQCAtNjU3
LDYgKzY1OSwxNTAgQEAgc3ViIHBhcnNlU3ZuRGlmZkhlYWRlcigkJCkKICAgICByZXR1cm4gKFwl
aGVhZGVyLCAkXyk7CiB9CiAKKyMgUGFyc2UgdGhlIG5leHQgU1ZOIGRpZmYgZm9vdGVyIGZyb20g
dGhlIGdpdmVuIGZpbGUgaGFuZGxlLCBhbmQgYWR2YW5jZQorIyB0aGUgaGFuZGxlIHNvIHRoZSBs
YXN0IGxpbmUgcmVhZCBpcyB0aGUgZmlyc3QgbGluZSBhZnRlciB0aGUgZm9vdGVyLgorIworIyBU
aGlzIHN1YnJvdXRpbmUgZGllcyBpZiBnaXZlbiBsZWFkaW5nIGp1bmsuCisjCisjIEFyZ3M6Cisj
ICAgJGZpbGVIYW5kbGU6IGFkdmFuY2VkIHNvIHRoZSBsYXN0IGxpbmUgcmVhZCBmcm9tIHRoZSBo
YW5kbGUgaXMgZWl0aGVyIHRoZQorIyAgICAgICAgICAgICAgICB0aGUgZmlyc3Qgb2NjdXJlbmNl
IG9mIGFuIGVtcHR5IGxpbmUgb3IgdGhlIGZpcnN0IGxpbmUgb2YgdGhlCisjICAgICAgICAgICAg
ICAgIG5leHQgaGVhZGVyIHRvIHBhcnNlLiAgRm9yIFNWTi1mb3JtYXR0ZWQgZGlmZnMsIHRoaXMg
aXMgYSBsaW5lCisjICAgICAgICAgICAgICAgIGJlZ2lubmluZyB3aXRoICJJbmRleDoiLiAgRm9y
IEdpdCwgdGhpcyBpcyBhIGxpbmUgYmVnaW5uaW5nCisjICAgICAgICAgICAgICAgIHdpdGggImRp
ZmYgLS1naXQiLgorIyAgICRsaW5lOiB0aGUgbGluZSBsYXN0IHJlYWQgZnJvbSAkZmlsZUhhbmRs
ZQorIworIyBSZXR1cm5zICgkZm9vdGVySGFzaFJlZiwgJGxhc3RSZWFkTGluZSk6CisjICAgJGZv
b3Rlckhhc2hSZWY6IGEgaGFzaCByZWZlcmVuY2UgcmVwcmVzZW50aW5nIGEgZGlmZiBmb290ZXIK
KyMgICAgIHByb3BlcnR5UGF0aDogdGhlIHBhdGggb2YgdGhlIHRhcmdldCBmaWxlLgorIyAgICAg
ZXhlY3V0YWJsZUJpdERlbHRhOiB0aGUgdmFsdWUgMSBvciAtMSBpZiB0aGUgZXhlY3V0YWJsZSBi
aXQgd2FzIGFkZGVkIG9yCisjICAgICAgICAgICAgICAgICAgICAgICAgIHJlbW92ZWQsIHJlc3Bl
Y3RpdmVseS4gIE5ldyBhbmQgZGVsZXRlZCBmaWxlcyBoYXZlCisjICAgICAgICAgICAgICAgICAg
ICAgICAgIHRoaXMgdmFsdWUgb25seSBpZiB0aGUgZmlsZSBpcyBleGVjdXRhYmxlLCBpbiB3aGlj
aAorIyAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIHRoZSB2YWx1ZSBpcyAxIGFuZCAtMSwg
cmVzcGVjdGl2ZWx5LgorIyAgICRsYXN0UmVhZExpbmU6IHRoZSBsaW5lIGxhc3QgcmVhZCBmcm9t
ICRmaWxlSGFuZGxlLgorc3ViIHBhcnNlU3ZuRGlmZkZvb3RlcigkJCkKK3sKKyAgICBteSAoJGZp
bGVIYW5kbGUsICRsaW5lKSA9IEBfOworCisgICAgJF8gPSAkbGluZTsKKworICAgIG15ICRwcm9w
ZXJ0eVBhdGg7CisgICAgaWYgKC8kc3ZuRm9vdGVyU3RhcnRSZWdFeC8pIHsKKyAgICAgICAgJHBy
b3BlcnR5UGF0aCA9ICQxOworICAgIH0gZWxzZSB7CisgICAgICAgIGRpZSgiRmlyc3QgbGluZSBv
ZiBTVk4gZGlmZiBkb2VzIG5vdCBiZWdpbiB3aXRoIFwiUHJvcGVydHkgY2hhbmdlcyBvbiBcIjog
XCIkX1wiLiIpOworICAgIH0KKworICAgIG15ICVmb290ZXI7CisgICAgJGZvb3Rlcntwcm9wZXJ0
eVBhdGh9ID0gJHByb3BlcnR5UGF0aDsKKyAgICBteSAkcHJvcGVydHlIYXNoUmVmOworICAgIHdo
aWxlICgxKSB7CisKKyAgICAgICAgaWYgKC8kc3ZuUHJvcGVydHlOYW1lUmVnRXgvKSB7CisgICAg
ICAgICAgICAoJHByb3BlcnR5SGFzaFJlZiwgJF8pID0gcGFyc2VTdm5Qcm9wZXJ0eSgkZmlsZUhh
bmRsZSwgJF8pOworICAgICAgICAgICAgJGZvb3RlcntleGVjdXRhYmxlQml0RGVsdGF9ID0gJHBy
b3BlcnR5SGFzaFJlZi0+e3Byb3BlcnR5Q2hhbmdlRGVsdGF9IGlmICRwcm9wZXJ0eUhhc2hSZWYt
PntuYW1lfSBlcSAic3ZuOmV4ZWN1dGFibGUiOworICAgICAgICB9CisKKyAgICAgICAgJF8gPSA8
JGZpbGVIYW5kbGU+OyAjIE5vdCBkZWZpbmVkIGlmIGVuZC1vZi1maWxlIHJlYWNoZWQuCisKKyAg
ICAgICAgIyBTaW5jZSB0aGUgYm9keSBvZiBhbiBTVk4gYmluYXJ5IHBhdGNoIGZvbGxvd3MgdGhl
IGZvb3Rlciwgd2UgYnJlYWsKKyAgICAgICAgIyBpZiB0aGUgbmV4dCBsaW5lIHJlYWQgaXMgZW1w
dHkuCisgICAgICAgIGxhc3QgaWYgKCFkZWZpbmVkKCRfKSB8fCAvXiQvIHx8IC8kc3ZuRGlmZlN0
YXJ0UmVnRXgvIHx8IC8kZ2l0RGlmZlN0YXJ0UmVnRXgvKTsKKyAgICB9CisKKyAgICByZXR1cm4g
KFwlZm9vdGVyLCAkXyk7Cit9CisKKyMgUGFyc2UgdGhlIG5leHQgU1ZOIHByb3BlcnR5IGZyb20g
dGhlIGdpdmVuIGZpbGUgaGFuZGxlLCBhbmQgYWR2YW5jZQorIyB0aGUgaGFuZGxlIHNvIHRoZSBs
YXN0IGxpbmUgcmVhZCBpcyB0aGUgZmlyc3QgbGluZSBhZnRlciB0aGUgcHJvcGVydHkKKyMgdmFs
dWUuCisjCisjIFRoaXMgc3Vicm91dGluZSBkaWVzIGlmIGdpdmVuIGxlYWRpbmcganVuay4KKyMK
KyMgQXJnczoKKyMgICAkZmlsZUhhbmRsZTogYWR2YW5jZWQgc28gdGhlIGxhc3QgbGluZSByZWFk
IGZyb20gdGhlIGhhbmRsZSBpcyB0aGUgZmlyc3QgbGluZQorIyAgICAgICAgICAgICAgICBvZiB0
aGUgbmV4dCBwcm9wZXJ0eSB0byBwYXJzZS4KKyMgICAkbGluZTogdGhlIGxpbmUgbGFzdCByZWFk
IGZyb20gJGZpbGVIYW5kbGUKKyMKKyMgUmV0dXJucyAoJHByb3BlcnR5SGFzaFJlZiwgJGxhc3RS
ZWFkTGluZSk6CisjICAgJHByb3BlcnR5SGFzaFJlZjogYSBoYXNoIHJlZmVyZW5jZSByZXByZXNl
bnRpbmcgYSBkaWZmIGZvb3RlcgorIyAgICAgbmFtZTogdGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5
LgorIyAgICAgdmFsdWU6IHRoZSB2YWx1ZSBvZiB0aGUgcHJvcGVydHkuCisjICAgICBwcm9wZXJ0
eUNoYW5nZURlbHRhOiB0aGUgdmFsdWUgMSBvciAtMSBpZiB0aGUgcHJvcGVydHkgd2FzIGFkZGVk
IG9yCisjICAgICAgICAgICAgICAgICAgICAgICAgIHJlbW92ZWQsIHJlc3BlY3RpdmVseS4KKyMg
ICAkbGFzdFJlYWRMaW5lOiB0aGUgbGluZSBsYXN0IHJlYWQgZnJvbSAkZmlsZUhhbmRsZS4KK3N1
YiBwYXJzZVN2blByb3BlcnR5KCQkKQoreworICAgIG15ICgkZmlsZUhhbmRsZSwgJGxpbmUpID0g
QF87CisKKyAgICAkXyA9ICRsaW5lOworCisgICAgbXkgJHN2blByb3BlcnR5VmFsdWVSZWdFeCA9
IHFyI15ccyooXCt8LSlccyooW15cclxuXSspIzsKKworICAgIG15ICRwcm9wZXJ0eU5hbWU7Cisg
ICAgbXkgJHByb3BlcnR5TmFtZVByZWZpeDsKKyAgICBpZiAoLyRzdm5Qcm9wZXJ0eU5hbWVSZWdF
eC8pIHsKKyAgICAgICAgJHByb3BlcnR5TmFtZVByZWZpeCA9ICQxOworICAgICAgICAkcHJvcGVy
dHlOYW1lID0gJDI7CisgICAgfSBlbHNlIHsKKyAgICAgICAgZGllKCJGYWlsZWQgdG8gZmluZCBT
Vk4gcHJvcGVydHkgbmFtZTogXCIkX1wiLiIpOworICAgIH0KKworICAgIG15ICRwcm9wZXJ0eVZh
bHVlOworICAgIG15ICRwcm9wZXJ0eVZhbHVlUHJlZml4OworICAgIHdoaWxlICgxKSB7CisgICAg
ICAgICMgU3RyaXAgb2ZmIGFueSBlbmQtb2YtbGluZSBjaGFyYWN0ZXJzIHRvIHNpbXBsaWZ5IHJl
Z2V4IG1hdGNoaW5nIGJlbG93LgorICAgICAgICBzLyhbXG5ccl0rKSQvLzsKKworICAgICAgICBp
ZiAoLyRzdm5Qcm9wZXJ0eVZhbHVlUmVnRXgvKSB7CisgICAgICAgICAgICAkcHJvcGVydHlWYWx1
ZVByZWZpeCA9ICQxOworICAgICAgICAgICAgJHByb3BlcnR5VmFsdWUgPSAkMjsKKyAgICAgICAg
ICAgIGxhc3Q7CisgICAgICAgIH0KKworICAgICAgICAkXyA9IDwkZmlsZUhhbmRsZT47ICMgTm90
IGRlZmluZWQgaWYgZW5kLW9mLWZpbGUgcmVhY2hlZC4KKworICAgICAgICBsYXN0IGlmICghZGVm
aW5lZCgkXykgfHwgLyRzdm5Qcm9wZXJ0eU5hbWVSZWdFeC8pOworICAgIH0KKworICAgIGlmICgh
JHByb3BlcnR5VmFsdWUpIHsKKyAgICAgICAgZGllKCJEaWQgbm90IGZpbmQgcHJvcGVydHkgdmFs
dWUgZm9yIHByb3BlcnR5OiBcIiRwcm9wZXJ0eU5hbWVcIi4iKTsKKyAgICB9CisKKyAgICBteSAk
cHJvcGVydHlDaGFuZ2VEZWx0YTsKKyAgICBpZiAoJHByb3BlcnR5VmFsdWVQcmVmaXggZXEgJysn
KSB7CisgICAgICAgICRwcm9wZXJ0eUNoYW5nZURlbHRhID0gMTsKKyAgICB9IGVsc2lmICgkcHJv
cGVydHlWYWx1ZVByZWZpeCBlcSAnLScpIHsKKyAgICAgICAgJHByb3BlcnR5Q2hhbmdlRGVsdGEg
PSAtMTsKKyAgICB9IGVsc2UgeworICAgICAgICAjIE5vdCByZWFjaGVkLgorICAgICAgICBkaWU7
CisgICAgfQorCisgICAgbXkgJGV4cGVjdGVkQ2hhbmdlRGVsdGE7CisgICAgaWYgKCRwcm9wZXJ0
eU5hbWVQcmVmaXggZXEgIk5hbWUiKSB7CisgICAgICAgICRleHBlY3RlZENoYW5nZURlbHRhID0g
MDsKKyAgICB9IGVsc2lmICgkcHJvcGVydHlOYW1lUHJlZml4IGVxICJBZGRlZCIpIHsKKyAgICAg
ICAgJGV4cGVjdGVkQ2hhbmdlRGVsdGEgPSAxOworICAgIH0gZWxzaWYgKCRwcm9wZXJ0eU5hbWVQ
cmVmaXggZXEgIkRlbGV0ZWQiKSB7CisgICAgICAgICRleHBlY3RlZENoYW5nZURlbHRhID0gLTE7
CisgICAgfSBlbHNlIHsKKyAgICAgICAgIyBOb3QgcmVhY2hlZC4KKyAgICAgICAgZGllOworICAg
IH0KKworICAgIGlmICgkcHJvcGVydHlDaGFuZ2VEZWx0YSA9PSAtMSAqICRleHBlY3RlZENoYW5n
ZURlbHRhKSB7CisgICAgICAgIGRpZSgiUHJvcGVydHkgY2hhbmdlIHByZWZpeCBcIiRwcm9wZXJ0
eVZhbHVlUHJlZml4XCIgZG9lcyBub3QgbWF0Y2ggIiAuCisgICAgICAgICAgICAidGhlIHByb3Bl
cnR5IG5hbWUgcHJlZml4IFwiJHByb3BlcnR5TmFtZVByZWZpeFwiLiIpOworICAgIH0KKworICAg
IG15ICVwcm9wZXJ0eUhhc2g7CisgICAgJHByb3BlcnR5SGFzaHtuYW1lfSA9ICRwcm9wZXJ0eU5h
bWU7CisgICAgJHByb3BlcnR5SGFzaHtwcm9wZXJ0eUNoYW5nZURlbHRhfSA9ICRwcm9wZXJ0eUNo
YW5nZURlbHRhOworICAgICRwcm9wZXJ0eUhhc2h7dmFsdWV9ID0gJHByb3BlcnR5VmFsdWU7Cisg
ICAgcmV0dXJuIChcJXByb3BlcnR5SGFzaCwgJF8pOworfQorCiAjIFBhcnNlIHRoZSBuZXh0IGRp
ZmYgaGVhZGVyIGZyb20gdGhlIGdpdmVuIGZpbGUgaGFuZGxlLCBhbmQgYWR2YW5jZQogIyB0aGUg
aGFuZGxlIHNvIHRoZSBsYXN0IGxpbmUgcmVhZCBpcyB0aGUgZmlyc3QgbGluZSBhZnRlciB0aGUg
aGVhZGVyLgogIwpJbmRleDogV2ViS2l0VG9vbHMvU2NyaXB0cy93ZWJraXRwZXJsL1ZDU1V0aWxz
X3VuaXR0ZXN0L3BhcnNlU3ZuRGlmZkZvb3Rlci5wbAo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJLaXRUb29s
cy9TY3JpcHRzL3dlYmtpdHBlcmwvVkNTVXRpbHNfdW5pdHRlc3QvcGFyc2VTdm5EaWZmRm9vdGVy
LnBsCShyZXZpc2lvbiAwKQorKysgV2ViS2l0VG9vbHMvU2NyaXB0cy93ZWJraXRwZXJsL1ZDU1V0
aWxzX3VuaXR0ZXN0L3BhcnNlU3ZuRGlmZkZvb3Rlci5wbAkocmV2aXNpb24gMCkKQEAgLTAsMCAr
MSwxMTEgQEAKKyMhL3Vzci9iaW4vcGVybCAtdworIworIyBDb3B5cmlnaHQgKEMpIFJlc2VhcmNo
IGluIE1vdGlvbiBMaW1pdGVkIDIwMTAuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisjIENvcHlyaWdo
dCAoQykgMjAxMCBDaHJpcyBKZXJkb25layAoY2hyaXMuamVyZG9uZWtAZ21haWwuY29tKQorIwor
IyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRo
IG9yIHdpdGhvdXQKKyMgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQg
dGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorIyBtZXQ6CisjCisjICAgICAqIFJlZGlzdHJp
YnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Cisj
IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xh
aW1lci4KKyMgICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9k
dWNlIHRoZSBhYm92ZQorIyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9u
cyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisjIGluIHRoZSBkb2N1bWVudGF0aW9uIGFu
ZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyMgZGlzdHJpYnV0aW9uLgor
IyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEFwcGxlIENvbXB1dGVyLCBJbmMuICgiQXBwbGUi
KSBub3IgdGhlIG5hbWVzIG9mCisjIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5k
b3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyMgZnJvbSB0aGlzIHNvZnR3YXJlIHdp
dGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorIworIyBUSElTIFNPRlRX
QVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JT
CisjICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVE
SU5HLCBCVVQgTk9UCisjIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVS
Q0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorIyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUg
RElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorIyBPV05FUiBPUiBD
T05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRB
TCwKKyMgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xV
RElORywgQlVUIE5PVAorIyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdP
T0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyMgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVT
SU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisjIFRIRU9SWSBP
RiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRP
UlQKKyMgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkg
V0FZIE9VVCBPRiBUSEUgVVNFCisjIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBP
RiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyMgVW5pdCB0ZXN0cyBvZiBwYXJz
ZVN2bkRpZmZGb290ZXIoKS4KKwordXNlIHN0cmljdDsKK3VzZSB3YXJuaW5nczsKKwordXNlIFRl
c3Q6Ok1vcmU7Cit1c2UgVkNTVXRpbHM7CisKKyMgVGhlIGFycmF5IG9mIHRlc3QgY2FzZXMuCitt
eSBAdGVzdENhc2VIYXNoUmVmcyA9ICgKK3sKKyAgICAjIE5ldyB0ZXN0CisgICAgZGlmZk5hbWUg
PT4gImFkZCBleGVjdXRhYmxlIGJpdCIsCisgICAgaW5wdXRUZXh0ID0+IDw8J0VORCcsCitQcm9w
ZXJ0eSBjaGFuZ2VzIG9uOiBNYWtlZmlsZQorX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f
X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXworQWRkZWQ6IHN2bjpleGVjdXRh
YmxlCisgICArICoKK0VORAorICAgIGV4cGVjdGVkUmV0dXJuID0+IFsKK3sKKyAgICBleGVjdXRh
YmxlQml0RGVsdGEgPT4gMSwKKyAgICBwcm9wZXJ0eVBhdGggPT4gIk1ha2VmaWxlIiwKK30sCit1
bmRlZl0sCisgICAgZXhwZWN0ZWROZXh0TGluZSA9PiB1bmRlZiwKK30sCit7CisgICAgIyBOZXcg
dGVzdAorICAgIGRpZmZOYW1lID0+ICJkZWxldGUgZXhlY3V0YWJsZSBiaXQiLAorICAgIGlucHV0
VGV4dCA9PiA8PCdFTkQnLAorUHJvcGVydHkgY2hhbmdlcyBvbjogTWFrZWZpbGUKK19fX19fX19f
X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f
X18KK0RlbGV0ZWQ6IHN2bjpleGVjdXRhYmxlCisgICAtICoKK0VORAorICAgIGV4cGVjdGVkUmV0
dXJuID0+IFsKK3sKKyAgICBleGVjdXRhYmxlQml0RGVsdGEgPT4gLTEsCisgICAgcHJvcGVydHlQ
YXRoID0+ICJNYWtlZmlsZSIsCit9LAordW5kZWZdLAorICAgIGV4cGVjdGVkTmV4dExpbmUgPT4g
dW5kZWYsCit9LAoreworICAgICMgTmV3IHRlc3QKKyAgICBkaWZmTmFtZSA9PiAiZHVtbXkgcHJv
cGVydHkiLAorICAgIGlucHV0VGV4dCA9PiA8PCdFTkQnLAorUHJvcGVydHkgY2hhbmdlcyBvbjog
TWFrZWZpbGUKK19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f
X19fX19fX19fX19fX19fX19fX18KK0FkZGVkOiBkdW1teV9wcm9wZXJ0eQorICAgKyBkdW1teV9w
cm9wZXJ0eQorRU5ECisgICAgZXhwZWN0ZWRSZXR1cm4gPT4gWworeworICAgIHByb3BlcnR5UGF0
aCA9PiAiTWFrZWZpbGUiLAorfSwKK3VuZGVmXSwKKyAgICBleHBlY3RlZE5leHRMaW5lID0+IHVu
ZGVmLAorfSwKKyk7CisKK215ICR0ZXN0Q2FzZXNDb3VudCA9IEB0ZXN0Q2FzZUhhc2hSZWZzOwor
cGxhbih0ZXN0cyA9PiAyICogJHRlc3RDYXNlc0NvdW50KTsgIyBUb3RhbCBudW1iZXIgb2YgYXNz
ZXJ0aW9ucy4KKworZm9yZWFjaCBteSAkdGVzdENhc2UgKEB0ZXN0Q2FzZUhhc2hSZWZzKSB7Cisg
ICAgbXkgJHRlc3ROYW1lU3RhcnQgPSAicGFyc2VTdm5EaWZmRm9vdGVyKCk6ICR0ZXN0Q2FzZS0+
e2RpZmZOYW1lfTogY29tcGFyaW5nIjsKKworICAgIG15ICRmaWxlSGFuZGxlOworICAgIG9wZW4o
JGZpbGVIYW5kbGUsICI8IiwgXCR0ZXN0Q2FzZS0+e2lucHV0VGV4dH0pOworICAgIG15ICRsaW5l
ID0gPCRmaWxlSGFuZGxlPjsKKworICAgIG15IEBnb3QgPSBWQ1NVdGlsczo6cGFyc2VTdm5EaWZm
Rm9vdGVyKCRmaWxlSGFuZGxlLCAkbGluZSk7CisgICAgbXkgJGV4cGVjdGVkUmV0dXJuID0gJHRl
c3RDYXNlLT57ZXhwZWN0ZWRSZXR1cm59OworCisgICAgaXNfZGVlcGx5KFxAZ290LCAkZXhwZWN0
ZWRSZXR1cm4sICIkdGVzdE5hbWVTdGFydCByZXR1cm4gdmFsdWUuIik7CisKKyAgICBteSAkZ290
TmV4dExpbmUgPSA8JGZpbGVIYW5kbGU+OworICAgIGlzKCRnb3ROZXh0TGluZSwgJHRlc3RDYXNl
LT57ZXhwZWN0ZWROZXh0TGluZX0sICAiJHRlc3ROYW1lU3RhcnQgbmV4dCByZWFkIGxpbmUuIik7
Cit9CkluZGV4OiBXZWJLaXRUb29scy9TY3JpcHRzL3dlYmtpdHBlcmwvVkNTVXRpbHNfdW5pdHRl
c3QvcGFyc2VTdm5Qcm9wZXJ0eS5wbAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJLaXRUb29scy9TY3JpcHRz
L3dlYmtpdHBlcmwvVkNTVXRpbHNfdW5pdHRlc3QvcGFyc2VTdm5Qcm9wZXJ0eS5wbAkocmV2aXNp
b24gMCkKKysrIFdlYktpdFRvb2xzL1NjcmlwdHMvd2Via2l0cGVybC9WQ1NVdGlsc191bml0dGVz
dC9wYXJzZVN2blByb3BlcnR5LnBsCShyZXZpc2lvbiAwKQpAQCAtMCwwICsxLDEyNSBAQAorIyEv
dXNyL2Jpbi9wZXJsIC13CisjCisjIENvcHlyaWdodCAoQykgUmVzZWFyY2ggaW4gTW90aW9uIExp
bWl0ZWQgMjAxMC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyMgQ29weXJpZ2h0IChDKSAyMDEwIENo
cmlzIEplcmRvbmVrIChjaHJpcy5qZXJkb25la0BnbWFpbC5jb20pCisjCisjIFJlZGlzdHJpYnV0
aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAor
IyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5n
IGNvbmRpdGlvbnMgYXJlCisjIG1ldDoKKyMKKyMgICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNv
dXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyMgbm90aWNlLCB0aGlz
IGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorIyAgICAg
KiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3Zl
CisjIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9s
bG93aW5nIGRpc2NsYWltZXIKKyMgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1h
dGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorIyBkaXN0cmlidXRpb24uCisjICAgICAqIE5laXRo
ZXIgdGhlIG5hbWUgb2YgQXBwbGUgQ29tcHV0ZXIsIEluYy4gKCJBcHBsZSIpIG5vciB0aGUgbmFt
ZXMgb2YKKyMgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21v
dGUgcHJvZHVjdHMgZGVyaXZlZAorIyBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZp
YyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisjCisjIFRISVMgU09GVFdBUkUgSVMgUFJPVklE
RUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyMgIkFTIElTIiBB
TkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QK
KyMgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkg
QU5EIEZJVE5FU1MgRk9SCisjIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJ
TiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisjIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBC
RSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorIyBTUEVDSUFM
LCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9U
CisjIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklD
RVM7IExPU1MgT0YgVVNFLAorIyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJV
UFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyMgVEhFT1JZIE9GIExJQUJJTElUWSwg
V0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorIyAoSU5DTFVE
SU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRI
RSBVU0UKKyMgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJ
TElUWSBPRiBTVUNIIERBTUFHRS4KKworIyBVbml0IHRlc3RzIG9mIHBhcnNlU3ZuUHJvcGVydHko
KS4KKwordXNlIHN0cmljdDsKK3VzZSB3YXJuaW5nczsKKwordXNlIFRlc3Q6Ok1vcmU7Cit1c2Ug
VkNTVXRpbHM7CisKKyMgVGhlIGFycmF5IG9mIHRlc3QgY2FzZXMuCitteSBAdGVzdENhc2VIYXNo
UmVmcyA9ICgKK3sKKyAgICAjIE5ldyB0ZXN0CisgICAgZGlmZk5hbWUgPT4gIidBZGRlZDogc3Zu
OmV4ZWN1dGFibGUnIGFuZCAnKyciLAorICAgIGlucHV0VGV4dCA9PiA8PCdFTkQnLAorQWRkZWQ6
IHN2bjpleGVjdXRhYmxlCisgICArICoKK0VORAorICAgIGV4cGVjdGVkUmV0dXJuID0+IFsKK3sK
KyAgICBuYW1lID0+ICJzdm46ZXhlY3V0YWJsZSIsCisgICAgcHJvcGVydHlDaGFuZ2VEZWx0YSA9
PiAxLAorICAgIHZhbHVlID0+ICIqIiwKK30sCisiICAgKyAqIl0sCisgICAgZXhwZWN0ZWROZXh0
TGluZSA9PiB1bmRlZiwKK30sCit7CisgICAgIyBOZXcgdGVzdAorICAgIGRpZmZOYW1lID0+ICIn
RGVsZXRlZDogc3ZuOmV4ZWN1dGFibGUnIGFuZCAnLSciLAorICAgIGlucHV0VGV4dCA9PiA8PCdF
TkQnLAorRGVsZXRlZDogc3ZuOmV4ZWN1dGFibGUKKyAgIC0gKgorRU5ECisgICAgZXhwZWN0ZWRS
ZXR1cm4gPT4gWworeworICAgIG5hbWUgPT4gInN2bjpleGVjdXRhYmxlIiwKKyAgICBwcm9wZXJ0
eUNoYW5nZURlbHRhID0+IC0xLAorICAgIHZhbHVlID0+ICIqIiwKK30sCisiICAgLSAqIl0sCisg
ICAgZXhwZWN0ZWROZXh0TGluZSA9PiB1bmRlZiwKK30sCit7CisgICAgIyBOZXcgdGVzdAorICAg
IGRpZmZOYW1lID0+ICInTmFtZTogc3ZuOmV4ZWN1dGFibGUnIGFuZCAnLSciLAorICAgIGlucHV0
VGV4dCA9PiA8PCdFTkQnLAorTmFtZTogc3ZuOmV4ZWN1dGFibGUKKyAgIC0gKgorRU5ECisgICAg
ZXhwZWN0ZWRSZXR1cm4gPT4gWworeworICAgIG5hbWUgPT4gInN2bjpleGVjdXRhYmxlIiwKKyAg
ICBwcm9wZXJ0eUNoYW5nZURlbHRhID0+IC0xLAorICAgIHZhbHVlID0+ICIqIiwKK30sCisiICAg
LSAqIl0sCisgICAgZXhwZWN0ZWROZXh0TGluZSA9PiB1bmRlZiwKK30sCit7CisgICAgIyBOZXcg
dGVzdAorICAgIGRpZmZOYW1lID0+ICInTmFtZTogc3ZuOmV4ZWN1dGFibGUnIGFuZCAnKyciLAor
ICAgIGlucHV0VGV4dCA9PiA8PCdFTkQnLAorTmFtZTogc3ZuOmV4ZWN1dGFibGUKKyAgICsgKgor
RU5ECisgICAgZXhwZWN0ZWRSZXR1cm4gPT4gWworeworICAgIG5hbWUgPT4gInN2bjpleGVjdXRh
YmxlIiwKKyAgICBwcm9wZXJ0eUNoYW5nZURlbHRhID0+IDEsCisgICAgdmFsdWUgPT4gIioiLAor
fSwKKyIgICArICoiXSwKKyAgICBleHBlY3RlZE5leHRMaW5lID0+IHVuZGVmLAorfSwKKyk7CisK
K215ICR0ZXN0Q2FzZXNDb3VudCA9IEB0ZXN0Q2FzZUhhc2hSZWZzOworcGxhbih0ZXN0cyA9PiAy
ICogJHRlc3RDYXNlc0NvdW50KTsgIyBUb3RhbCBudW1iZXIgb2YgYXNzZXJ0aW9ucy4KKworZm9y
ZWFjaCBteSAkdGVzdENhc2UgKEB0ZXN0Q2FzZUhhc2hSZWZzKSB7CisgICAgbXkgJHRlc3ROYW1l
U3RhcnQgPSAicGFyc2VTdm5Qcm9wZXJ0eSgpOiAkdGVzdENhc2UtPntkaWZmTmFtZX06IGNvbXBh
cmluZyI7CisKKyAgICBteSAkZmlsZUhhbmRsZTsKKyAgICBvcGVuKCRmaWxlSGFuZGxlLCAiPCIs
IFwkdGVzdENhc2UtPntpbnB1dFRleHR9KTsKKyAgICBteSAkbGluZSA9IDwkZmlsZUhhbmRsZT47
CisKKyAgICBteSBAZ290ID0gVkNTVXRpbHM6OnBhcnNlU3ZuUHJvcGVydHkoJGZpbGVIYW5kbGUs
ICRsaW5lKTsKKyAgICBteSAkZXhwZWN0ZWRSZXR1cm4gPSAkdGVzdENhc2UtPntleHBlY3RlZFJl
dHVybn07CisKKyAgICBpc19kZWVwbHkoXEBnb3QsICRleHBlY3RlZFJldHVybiwgIiR0ZXN0TmFt
ZVN0YXJ0IHJldHVybiB2YWx1ZS4iKTsKKworICAgIG15ICRnb3ROZXh0TGluZSA9IDwkZmlsZUhh
bmRsZT47CisgICAgaXMoJGdvdE5leHRMaW5lLCAkdGVzdENhc2UtPntleHBlY3RlZE5leHRMaW5l
fSwgICIkdGVzdE5hbWVTdGFydCBuZXh0IHJlYWQgbGluZS4iKTsKK30K
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>55669</attachid>
            <date>2010-05-10 23:20:41 -0700</date>
            <delta_ts>2010-05-19 23:35:32 -0700</delta_ts>
            <desc>Patch with unit tests</desc>
            <filename>Bug38885_2.patch</filename>
            <type>text/plain</type>
            <size>18284</size>
            <attacher name="Daniel Bates">dbates</attacher>
            
              <data encoding="base64">SW5kZXg6IFdlYktpdFRvb2xzL0NoYW5nZUxvZwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJLaXRUb29scy9D
aGFuZ2VMb2cJKHJldmlzaW9uIDU5MTI0KQorKysgV2ViS2l0VG9vbHMvQ2hhbmdlTG9nCSh3b3Jr
aW5nIGNvcHkpCkBAIC0xLDMgKzEsMTYgQEAKKzIwMTAtMDUtMTAgIERhbmllbCBCYXRlcyAgPGRi
YXRlc0ByaW0uY29tPgorCisgICAgICAgIFJldmlld2VkIGJ5IE5PQk9EWSAoT09QUyEpLgorCisg
ICAgICAgIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0zODg4NQorCisg
ICAgICAgIEltcGxlbWVudHMgc3VwcG9ydCBmb3IgcGFyc2luZyBhbiBTVk4gZm9vdGVyIGNvbnNp
c3Rpbmcgb2YgcHJvcGVydGllcy4KKyAgICAgICAgSW4gcGFydGljdWxhciwgc3VwcG9ydHMgcGFy
c2luZyB0aGUgc3ZuOmV4ZWN1dGFibGUgcHJvcGVydHkuCisKKyAgICAgICAgKiBTY3JpcHRzL1ZD
U1V0aWxzLnBtOgorICAgICAgICAqIFNjcmlwdHMvd2Via2l0cGVybC9WQ1NVdGlsc191bml0dGVz
dC9wYXJzZVN2bkRpZmZGb290ZXIucGw6IEFkZGVkLgorICAgICAgICAqIFNjcmlwdHMvd2Via2l0
cGVybC9WQ1NVdGlsc191bml0dGVzdC9wYXJzZVN2blByb3BlcnR5LnBsOiBBZGRlZC4KKwogMjAx
MC0wNS0xMCAgVG9ueSBDaGFuZyAgPHRvbnlAY2hyb21pdW0ub3JnPgogCiAgICAgICAgIFJldmll
d2VkIGJ5IEtlbnQgVGFtdXJhLgpJbmRleDogV2ViS2l0VG9vbHMvU2NyaXB0cy9WQ1NVdGlscy5w
bQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09Ci0tLSBXZWJLaXRUb29scy9TY3JpcHRzL1ZDU1V0aWxzLnBtCShyZXZpc2lv
biA1OTEyMikKKysrIFdlYktpdFRvb2xzL1NjcmlwdHMvVkNTVXRpbHMucG0JKHdvcmtpbmcgY29w
eSkKQEAgLTg2LDYgKzg2LDggQEAgbXkgJHN2blZlcnNpb247CiAKIG15ICRnaXREaWZmU3RhcnRS
ZWdFeCA9IHFyI15kaWZmIC0tZ2l0IChcdy8pPyguKykgKFx3Lyk/KFteXHJcbl0rKSM7CiBteSAk
c3ZuRGlmZlN0YXJ0UmVnRXggPSBxciNeSW5kZXg6IChbXlxyXG5dKykjOworbXkgJHN2bkZvb3Rl
clN0YXJ0UmVnRXggPSBxciNeUHJvcGVydHkgY2hhbmdlcyBvbjogKFteXHJcbl0rKSM7CitteSAk
c3ZuUHJvcGVydHlOYW1lUmVnRXggPSBxciNeKE5hbWV8QWRkZWR8RGVsZXRlZCk6IChbXlxyXG5d
KykjOwogCiAjIFRoaXMgbWV0aG9kIGlzIGZvciBwb3J0YWJpbGl0eS4gUmV0dXJuIHRoZSBzeXN0
ZW0tYXBwcm9wcmlhdGUgZXhpdAogIyBzdGF0dXMgb2YgYSBjaGlsZCBwcm9jZXNzLgpAQCAtNjU3
LDYgKzY1OSwxNTUgQEAgc3ViIHBhcnNlU3ZuRGlmZkhlYWRlcigkJCkKICAgICByZXR1cm4gKFwl
aGVhZGVyLCAkXyk7CiB9CiAKKyMgUGFyc2UgdGhlIG5leHQgU1ZOIGRpZmYgZm9vdGVyIGZyb20g
dGhlIGdpdmVuIGZpbGUgaGFuZGxlLCBhbmQgYWR2YW5jZQorIyB0aGUgaGFuZGxlIHNvIHRoZSBs
YXN0IGxpbmUgcmVhZCBpcyB0aGUgZmlyc3QgbGluZSBhZnRlciB0aGUgZm9vdGVyLgorIworIyBU
aGlzIHN1YnJvdXRpbmUgZGllcyBpZiBnaXZlbiBsZWFkaW5nIGp1bmsuCisjCisjIEFyZ3M6Cisj
ICAgJGZpbGVIYW5kbGU6IGFkdmFuY2VkIHNvIHRoZSBsYXN0IGxpbmUgcmVhZCBmcm9tIHRoZSBo
YW5kbGUgaXMgZWl0aGVyIHRoZQorIyAgICAgICAgICAgICAgICB0aGUgZmlyc3Qgb2NjdXJlbmNl
IG9mIGFuIGVtcHR5IGxpbmUgb3IgdGhlIGZpcnN0IGxpbmUgb2YgdGhlCisjICAgICAgICAgICAg
ICAgIG5leHQgaGVhZGVyIHRvIHBhcnNlLiAgRm9yIFNWTi1mb3JtYXR0ZWQgZGlmZnMsIHRoaXMg
aXMgYSBsaW5lCisjICAgICAgICAgICAgICAgIGJlZ2lubmluZyB3aXRoICJJbmRleDoiLiAgRm9y
IEdpdCwgdGhpcyBpcyBhIGxpbmUgYmVnaW5uaW5nCisjICAgICAgICAgICAgICAgIHdpdGggImRp
ZmYgLS1naXQiLgorIyAgICRsaW5lOiB0aGUgbGluZSBsYXN0IHJlYWQgZnJvbSAkZmlsZUhhbmRs
ZQorIworIyBSZXR1cm5zICgkZm9vdGVySGFzaFJlZiwgJGxhc3RSZWFkTGluZSk6CisjICAgJGZv
b3Rlckhhc2hSZWY6IGEgaGFzaCByZWZlcmVuY2UgcmVwcmVzZW50aW5nIGEgZGlmZiBmb290ZXIK
KyMgICAgIHByb3BlcnR5UGF0aDogdGhlIHBhdGggb2YgdGhlIHRhcmdldCBmaWxlLgorIyAgICAg
ZXhlY3V0YWJsZUJpdERlbHRhOiB0aGUgdmFsdWUgMSBvciAtMSBpZiB0aGUgZXhlY3V0YWJsZSBi
aXQgd2FzIGFkZGVkIG9yCisjICAgICAgICAgICAgICAgICAgICAgICAgIHJlbW92ZWQsIHJlc3Bl
Y3RpdmVseS4gIE5ldyBhbmQgZGVsZXRlZCBmaWxlcyBoYXZlCisjICAgICAgICAgICAgICAgICAg
ICAgICAgIHRoaXMgdmFsdWUgb25seSBpZiB0aGUgZmlsZSBpcyBleGVjdXRhYmxlLCBpbiB3aGlj
aAorIyAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIHRoZSB2YWx1ZSBpcyAxIGFuZCAtMSwg
cmVzcGVjdGl2ZWx5LgorIyAgICRsYXN0UmVhZExpbmU6IHRoZSBsaW5lIGxhc3QgcmVhZCBmcm9t
ICRmaWxlSGFuZGxlLgorc3ViIHBhcnNlU3ZuRGlmZkZvb3RlcigkJCkKK3sKKyAgICBteSAoJGZp
bGVIYW5kbGUsICRsaW5lKSA9IEBfOworCisgICAgJF8gPSAkbGluZTsKKworICAgIG15ICVmb290
ZXI7CisgICAgbXkgJHByb3BlcnR5UGF0aDsKKyAgICBteSAkcHJvcGVydHlIYXNoUmVmOworICAg
IHdoaWxlICgxKSB7CisgICAgICAgICMgU3RyaXAgb2ZmIGFueSBlbmQtb2YtbGluZSBjaGFyYWN0
ZXJzIHRvIHNpbXBsaWZ5IHJlZ2V4IG1hdGNoaW5nIGJlbG93LgorICAgICAgICBzLyhbXG5ccl0r
KSQvLzsKKworICAgICAgICBpZiAoLyRzdm5Gb290ZXJTdGFydFJlZ0V4LykgeworICAgICAgICAg
ICAgJHByb3BlcnR5UGF0aCA9ICQxOworICAgICAgICB9IGVsc2lmICgvJHN2blByb3BlcnR5TmFt
ZVJlZ0V4LykgeworICAgICAgICAgICAgKCRwcm9wZXJ0eUhhc2hSZWYsICRfKSA9IHBhcnNlU3Zu
UHJvcGVydHkoJGZpbGVIYW5kbGUsICRfKTsKKyAgICAgICAgICAgICRmb290ZXJ7ZXhlY3V0YWJs
ZUJpdERlbHRhfSA9ICRwcm9wZXJ0eUhhc2hSZWYtPntwcm9wZXJ0eUNoYW5nZURlbHRhfSBpZiAk
cHJvcGVydHlIYXNoUmVmLT57bmFtZX0gZXEgInN2bjpleGVjdXRhYmxlIjsKKyAgICAgICAgfSBl
bHNpZiAoL15ccyokL3ggfHwgJF8gZXEgJ18nIHggNjcpIHsKKyAgICAgICAgICAgICMgU2tpcCBl
bXB0eS93aGl0ZXNwYWNlLW9ubHkgbGluZXMgYW5kIHRoZSBkaXZpZGVyIGxpbmUuCisgICAgICAg
IH0gZWxzZSB7CisgICAgICAgICAgICAjIFNvbWUgb3RoZXIgY29udGVudCwgc3VjaCBhcyB0aGUg
YmluYXJ5IHBvcnRpb24gb2YgYW4gU1ZOIGJpbmFyeSBkaWZmLgorICAgICAgICAgICAgbGFzdDsK
KyAgICAgICAgfQorCisgICAgICAgICRfID0gPCRmaWxlSGFuZGxlPjsgIyBOb3QgZGVmaW5lZCBp
ZiBlbmQtb2YtZmlsZSByZWFjaGVkLgorCisgICAgICAgIGxhc3QgaWYgKCFkZWZpbmVkKCRfKSB8
fCAvJHN2bkRpZmZTdGFydFJlZ0V4LyB8fCAvJGdpdERpZmZTdGFydFJlZ0V4Lyk7CisgICAgfQor
CisgICAgaWYgKCEkcHJvcGVydHlQYXRoKSB7CisgICAgICAgIGRpZSgiRmlyc3QgbGluZSBvZiBT
Vk4gZGlmZiBkb2VzIG5vdCBiZWdpbiB3aXRoIFwiUHJvcGVydHkgY2hhbmdlcyBvbiBcIjogXCIk
X1wiLiIpOworICAgIH0KKyAgICAkZm9vdGVye3Byb3BlcnR5UGF0aH0gPSAkcHJvcGVydHlQYXRo
OworCisgICAgcmV0dXJuIChcJWZvb3RlciwgJF8pOworfQorCisjIFBhcnNlIHRoZSBuZXh0IFNW
TiBwcm9wZXJ0eSBmcm9tIHRoZSBnaXZlbiBmaWxlIGhhbmRsZSwgYW5kIGFkdmFuY2UKKyMgdGhl
IGhhbmRsZSBzbyB0aGUgbGFzdCBsaW5lIHJlYWQgaXMgdGhlIGZpcnN0IGxpbmUgYWZ0ZXIgdGhl
IHByb3BlcnR5CisjIHZhbHVlLgorIworIyBUaGlzIHN1YnJvdXRpbmUgZGllcyBpZiBnaXZlbiBs
ZWFkaW5nIGp1bmsuCisjCisjIEFyZ3M6CisjICAgJGZpbGVIYW5kbGU6IGFkdmFuY2VkIHNvIHRo
ZSBsYXN0IGxpbmUgcmVhZCBmcm9tIHRoZSBoYW5kbGUgaXMgdGhlIGZpcnN0IGxpbmUKKyMgICAg
ICAgICAgICAgICAgb2YgdGhlIG5leHQgcHJvcGVydHkgdG8gcGFyc2UuCisjICAgJGxpbmU6IHRo
ZSBsaW5lIGxhc3QgcmVhZCBmcm9tICRmaWxlSGFuZGxlCisjCisjIFJldHVybnMgKCRwcm9wZXJ0
eUhhc2hSZWYsICRsYXN0UmVhZExpbmUpOgorIyAgICRwcm9wZXJ0eUhhc2hSZWY6IGEgaGFzaCBy
ZWZlcmVuY2UgcmVwcmVzZW50aW5nIGEgZGlmZiBmb290ZXIKKyMgICAgIG5hbWU6IHRoZSBuYW1l
IG9mIHRoZSBwcm9wZXJ0eS4KKyMgICAgIHZhbHVlOiB0aGUgdmFsdWUgb2YgdGhlIHByb3BlcnR5
LgorIyAgICAgcHJvcGVydHlDaGFuZ2VEZWx0YTogdGhlIHZhbHVlIDEgb3IgLTEgaWYgdGhlIHBy
b3BlcnR5IHdhcyBhZGRlZCBvcgorIyAgICAgICAgICAgICAgICAgICAgICAgICByZW1vdmVkLCBy
ZXNwZWN0aXZlbHkuCisjICAgJGxhc3RSZWFkTGluZTogdGhlIGxpbmUgbGFzdCByZWFkIGZyb20g
JGZpbGVIYW5kbGUuCitzdWIgcGFyc2VTdm5Qcm9wZXJ0eSgkJCkKK3sKKyAgICBteSAoJGZpbGVI
YW5kbGUsICRsaW5lKSA9IEBfOworCisgICAgJF8gPSAkbGluZTsKKworICAgIG15ICRzdm5Qcm9w
ZXJ0eVZhbHVlUmVnRXggPSBxciNeXHMqKFwrfC0pXHMqKFteXHJcbl0rKSM7CisKKyAgICBteSAk
cHJvcGVydHlOYW1lOworICAgIG15ICRwcm9wZXJ0eU5hbWVQcmVmaXg7CisgICAgaWYgKC8kc3Zu
UHJvcGVydHlOYW1lUmVnRXgvKSB7CisgICAgICAgICRwcm9wZXJ0eU5hbWVQcmVmaXggPSAkMTsK
KyAgICAgICAgJHByb3BlcnR5TmFtZSA9ICQyOworICAgIH0gZWxzZSB7CisgICAgICAgIGRpZSgi
RmFpbGVkIHRvIGZpbmQgU1ZOIHByb3BlcnR5IG5hbWU6IFwiJF9cIi4iKTsKKyAgICB9CisKKyAg
ICBteSAkcHJvcGVydHlWYWx1ZTsKKyAgICBteSAkcHJvcGVydHlWYWx1ZVByZWZpeDsKKyAgICB3
aGlsZSAoMSkgeworICAgICAgICAjIFN0cmlwIG9mZiBhbnkgZW5kLW9mLWxpbmUgY2hhcmFjdGVy
cyB0byBzaW1wbGlmeSByZWdleCBtYXRjaGluZyBiZWxvdy4KKyAgICAgICAgcy8oW1xuXHJdKykk
Ly87CisKKyAgICAgICAgaWYgKC8kc3ZuUHJvcGVydHlWYWx1ZVJlZ0V4LykgeworICAgICAgICAg
ICAgJHByb3BlcnR5VmFsdWVQcmVmaXggPSAkMTsKKyAgICAgICAgICAgICRwcm9wZXJ0eVZhbHVl
ID0gJDI7CisgICAgICAgICAgICBsYXN0OworICAgICAgICB9CisKKyAgICAgICAgJF8gPSA8JGZp
bGVIYW5kbGU+OyAjIE5vdCBkZWZpbmVkIGlmIGVuZC1vZi1maWxlIHJlYWNoZWQuCisKKyAgICAg
ICAgbGFzdCBpZiAoIWRlZmluZWQoJF8pIHx8IC8kc3ZuUHJvcGVydHlOYW1lUmVnRXgvKTsKKyAg
ICB9CisKKyAgICBpZiAoISRwcm9wZXJ0eVZhbHVlKSB7CisgICAgICAgIGRpZSgiRGlkIG5vdCBm
aW5kIHByb3BlcnR5IHZhbHVlIGZvciBwcm9wZXJ0eTogXCIkcHJvcGVydHlOYW1lXCIuIik7Cisg
ICAgfQorCisgICAgbXkgJHByb3BlcnR5Q2hhbmdlRGVsdGE7CisgICAgaWYgKCRwcm9wZXJ0eVZh
bHVlUHJlZml4IGVxICcrJykgeworICAgICAgICAkcHJvcGVydHlDaGFuZ2VEZWx0YSA9IDE7Cisg
ICAgfSBlbHNpZiAoJHByb3BlcnR5VmFsdWVQcmVmaXggZXEgJy0nKSB7CisgICAgICAgICRwcm9w
ZXJ0eUNoYW5nZURlbHRhID0gLTE7CisgICAgfSBlbHNlIHsKKyAgICAgICAgIyBOb3QgcmVhY2hl
ZC4KKyAgICAgICAgZGllOworICAgIH0KKworICAgIG15ICRleHBlY3RlZENoYW5nZURlbHRhOwor
ICAgIGlmICgkcHJvcGVydHlOYW1lUHJlZml4IGVxICJOYW1lIikgeworICAgICAgICAkZXhwZWN0
ZWRDaGFuZ2VEZWx0YSA9IDA7CisgICAgfSBlbHNpZiAoJHByb3BlcnR5TmFtZVByZWZpeCBlcSAi
QWRkZWQiKSB7CisgICAgICAgICRleHBlY3RlZENoYW5nZURlbHRhID0gMTsKKyAgICB9IGVsc2lm
ICgkcHJvcGVydHlOYW1lUHJlZml4IGVxICJEZWxldGVkIikgeworICAgICAgICAkZXhwZWN0ZWRD
aGFuZ2VEZWx0YSA9IC0xOworICAgIH0gZWxzZSB7CisgICAgICAgICMgTm90IHJlYWNoZWQuCisg
ICAgICAgIGRpZTsKKyAgICB9CisKKyAgICBpZiAoJHByb3BlcnR5Q2hhbmdlRGVsdGEgPT0gLTEg
KiAkZXhwZWN0ZWRDaGFuZ2VEZWx0YSkgeworICAgICAgICBkaWUoIlByb3BlcnR5IGNoYW5nZSBw
cmVmaXggXCIkcHJvcGVydHlWYWx1ZVByZWZpeFwiIGRvZXMgbm90IG1hdGNoICIgLgorICAgICAg
ICAgICAgInRoZSBwcm9wZXJ0eSBuYW1lIHByZWZpeCBcIiRwcm9wZXJ0eU5hbWVQcmVmaXhcIi4i
KTsKKyAgICB9CisKKyAgICBteSAlcHJvcGVydHlIYXNoOworICAgICRwcm9wZXJ0eUhhc2h7bmFt
ZX0gPSAkcHJvcGVydHlOYW1lOworICAgICRwcm9wZXJ0eUhhc2h7cHJvcGVydHlDaGFuZ2VEZWx0
YX0gPSAkcHJvcGVydHlDaGFuZ2VEZWx0YTsKKyAgICAkcHJvcGVydHlIYXNoe3ZhbHVlfSA9ICRw
cm9wZXJ0eVZhbHVlOworICAgIHJldHVybiAoXCVwcm9wZXJ0eUhhc2gsICRfKTsKK30KKwogIyBQ
YXJzZSB0aGUgbmV4dCBkaWZmIGhlYWRlciBmcm9tIHRoZSBnaXZlbiBmaWxlIGhhbmRsZSwgYW5k
IGFkdmFuY2UKICMgdGhlIGhhbmRsZSBzbyB0aGUgbGFzdCBsaW5lIHJlYWQgaXMgdGhlIGZpcnN0
IGxpbmUgYWZ0ZXIgdGhlIGhlYWRlci4KICMKSW5kZXg6IFdlYktpdFRvb2xzL1NjcmlwdHMvd2Vi
a2l0cGVybC9WQ1NVdGlsc191bml0dGVzdC9wYXJzZVN2bkRpZmZGb290ZXIucGwKPT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PQotLS0gV2ViS2l0VG9vbHMvU2NyaXB0cy93ZWJraXRwZXJsL1ZDU1V0aWxzX3VuaXR0ZXN0L3Bh
cnNlU3ZuRGlmZkZvb3Rlci5wbAkocmV2aXNpb24gMCkKKysrIFdlYktpdFRvb2xzL1NjcmlwdHMv
d2Via2l0cGVybC9WQ1NVdGlsc191bml0dGVzdC9wYXJzZVN2bkRpZmZGb290ZXIucGwJKHJldmlz
aW9uIDApCkBAIC0wLDAgKzEsMjcxIEBACisjIS91c3IvYmluL3BlcmwgLXcKKyMKKyMgQ29weXJp
Z2h0IChDKSBSZXNlYXJjaCBpbiBNb3Rpb24gTGltaXRlZCAyMDEwLiBBbGwgUmlnaHRzIFJlc2Vy
dmVkLgorIyBDb3B5cmlnaHQgKEMpIDIwMTAgQ2hyaXMgSmVyZG9uZWsgKGNocmlzLmplcmRvbmVr
QGdtYWlsLmNvbSkKKyMKKyMgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJp
bmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisjIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRl
ZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKyMgbWV0OgorIwor
IyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFi
b3ZlIGNvcHlyaWdodAorIyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUg
Zm9sbG93aW5nIGRpc2NsYWltZXIuCisjICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkg
Zm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyMgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBs
aXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorIyBpbiB0aGUg
ZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisj
IGRpc3RyaWJ1dGlvbi4KKyMgICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBBcHBsZSBDb21wdXRl
ciwgSW5jLiAoIkFwcGxlIikgbm9yIHRoZSBuYW1lcyBvZgorIyBpdHMgY29udHJpYnV0b3JzIG1h
eSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisjIGZyb20g
dGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4K
KyMKKyMgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMg
QU5EIENPTlRSSUJVVE9SUworIyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdB
UlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorIyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBX
QVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyMgQSBQQVJUSUNV
TEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklH
SFQKKyMgT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5E
SVJFQ1QsIElOQ0lERU5UQUwsCisjIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElB
TCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKyMgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQg
T0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisjIERBVEEsIE9S
IFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9O
IEFOWQorIyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1Qg
TElBQklMSVRZLCBPUiBUT1JUCisjIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0Up
IEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorIyBPRiBUSElTIFNPRlRXQVJFLCBF
VkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisjIFVu
aXQgdGVzdHMgb2YgcGFyc2VTdm5EaWZmRm9vdGVyKCkuCisKK3VzZSBzdHJpY3Q7Cit1c2Ugd2Fy
bmluZ3M7CisKK3VzZSBUZXN0OjpNb3JlOwordXNlIFZDU1V0aWxzOworCisjIFRoZSBhcnJheSBv
ZiB0ZXN0IGNhc2VzLgorbXkgQHRlc3RDYXNlSGFzaFJlZnMgPSAoCit7CisgICAgIyBOZXcgdGVz
dAorICAgIGRpZmZOYW1lID0+ICJhZGQgZXhlY3V0YWJsZSBiaXQiLAorICAgIGlucHV0VGV4dCA9
PiA8PCdFTkQnLAorUHJvcGVydHkgY2hhbmdlcyBvbjogTWFrZWZpbGUKK19fX19fX19fX19fX19f
X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KK0Fk
ZGVkOiBzdm46ZXhlY3V0YWJsZQorICAgKyAqCitFTkQKKyAgICBleHBlY3RlZFJldHVybiA9PiBb
Cit7CisgICAgZXhlY3V0YWJsZUJpdERlbHRhID0+IDEsCisgICAgcHJvcGVydHlQYXRoID0+ICJN
YWtlZmlsZSIsCit9LAordW5kZWZdLAorICAgIGV4cGVjdGVkTmV4dExpbmUgPT4gdW5kZWYsCit9
LAoreworICAgICMgTmV3IHRlc3QKKyAgICBkaWZmTmFtZSA9PiAiZGVsZXRlIGV4ZWN1dGFibGUg
Yml0IiwKKyAgICBpbnB1dFRleHQgPT4gPDwnRU5EJywKK1Byb3BlcnR5IGNoYW5nZXMgb246IE1h
a2VmaWxlCitfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f
X19fX19fX19fX19fX19fX19fCitEZWxldGVkOiBzdm46ZXhlY3V0YWJsZQorICAgLSAqCitFTkQK
KyAgICBleHBlY3RlZFJldHVybiA9PiBbCit7CisgICAgZXhlY3V0YWJsZUJpdERlbHRhID0+IC0x
LAorICAgIHByb3BlcnR5UGF0aCA9PiAiTWFrZWZpbGUiLAorfSwKK3VuZGVmXSwKKyAgICBleHBl
Y3RlZE5leHRMaW5lID0+IHVuZGVmLAorfSwKK3sKKyAgICAjIE5ldyB0ZXN0CisgICAgZGlmZk5h
bWUgPT4gImR1bW15IHByb3BlcnR5IiwKKyAgICBpbnB1dFRleHQgPT4gPDwnRU5EJywKK1Byb3Bl
cnR5IGNoYW5nZXMgb246IE1ha2VmaWxlCitfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f
X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCitBZGRlZDogZHVtbXlfcHJvcGVy
dHkKKyAgICsgZHVtbXlfcHJvcGVydHkKK0VORAorICAgIGV4cGVjdGVkUmV0dXJuID0+IFsKK3sK
KyAgICBwcm9wZXJ0eVBhdGggPT4gIk1ha2VmaWxlIiwKK30sCit1bmRlZl0sCisgICAgZXhwZWN0
ZWROZXh0TGluZSA9PiB1bmRlZiwKK30sCit7CisgICAgIyBOZXcgdGVzdAorICAgIGRpZmZOYW1l
ID0+ICJtdWx0aXBsZSBhZGQgcHJvcGVydGllcyIsCisgICAgaW5wdXRUZXh0ID0+IDw8J0VORCcs
CitQcm9wZXJ0eSBjaGFuZ2VzIG9uOiBNYWtlZmlsZQorX19fX19fX19fX19fX19fX19fX19fX19f
X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXworQWRkZWQ6IHN2bjpl
eGVjdXRhYmxlCisgICArICoKK0FkZGVkOiBkdW1teQorICAgKyBkdW1teQorQWRkZWQ6IHN2bjpl
b2wtc3R5bGUKKyAgICsgTEYKK0VORAorICAgIGV4cGVjdGVkUmV0dXJuID0+IFsKK3sKKyAgICBl
eGVjdXRhYmxlQml0RGVsdGEgPT4gMSwKKyAgICBwcm9wZXJ0eVBhdGggPT4gIk1ha2VmaWxlIiwK
K30sCit1bmRlZl0sCisgICAgZXhwZWN0ZWROZXh0TGluZSA9PiB1bmRlZiwKK30sCit7CisgICAg
IyBOZXcgdGVzdAorICAgIGRpZmZOYW1lID0+ICJtaXggYWRkIGFuZCBkZWxldGUgcHJvcGVydGll
cyAod2l0aCBlbXB0eSBsaW5lKSIsCisgICAgaW5wdXRUZXh0ID0+IDw8J0VORCcsCitQcm9wZXJ0
eSBjaGFuZ2VzIG9uOiBXZWJLaXRUb29scy9TY3JpcHRzCitfX19fX19fX19fX19fX19fX19fX19f
X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCitEZWxldGVkOiBz
dm46aWdub3JlCisgICAtIC5EU19TdG9yZQorCitBZGRlZDogZHVtbXkKKyAgICsgZHVtbXkKK0VO
RAorICAgIGV4cGVjdGVkUmV0dXJuID0+IFsKK3sKKyAgICBwcm9wZXJ0eVBhdGggPT4gIldlYktp
dFRvb2xzL1NjcmlwdHMiLAorfSwKK3VuZGVmXSwKKyAgICBleHBlY3RlZE5leHRMaW5lID0+IHVu
ZGVmLAorfSwKK3sKKyAgICAjIE5ldyB0ZXN0CisgICAgZGlmZk5hbWUgPT4gIm1peCBhZGQgYW5k
IGRlbGV0ZSBwcm9wZXJ0aWVzICh3aXRoIHdoaXRlc3BhY2UgbGluZSkiLAorICAgIGlucHV0VGV4
dCA9PiA8PCdFTkQnLAorUHJvcGVydHkgY2hhbmdlcyBvbjogV2ViS2l0VG9vbHMvU2NyaXB0cwor
X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f
X19fX19fX19fXworRGVsZXRlZDogc3ZuOmlnbm9yZQorICAgLSAuRFNfU3RvcmUKKwkgICAJICAK
K0FkZGVkOiBkdW1teQorICAgKyBkdW1teQorRU5ECisgICAgZXhwZWN0ZWRSZXR1cm4gPT4gWwor
eworICAgIHByb3BlcnR5UGF0aCA9PiAiV2ViS2l0VG9vbHMvU2NyaXB0cyIsCit9LAordW5kZWZd
LAorICAgIGV4cGVjdGVkTmV4dExpbmUgPT4gdW5kZWYsCit9LAoreworICAgICMgTmV3IHRlc3QK
KyAgICBkaWZmTmFtZSA9PiAibWl4IGFkZCBhbmQgZGVsZXRlIHByb3BlcnRpZXMgKHdpdGggZW1w
dHkgbGluZXMpIiwKKyAgICBpbnB1dFRleHQgPT4gPDwnRU5EJywKK1Byb3BlcnR5IGNoYW5nZXMg
b246IGF1dG9nZW4uc2gKK19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f
X19fX19fX19fX19fX19fX19fX19fX19fX18KK0RlbGV0ZWQ6IHN2bjplb2wtc3R5bGUKKworICAg
LSBMRgorCitBZGRlZDogc3ZuOmV4ZWN1dGFibGUKKworICAgKyAqCitFTkQKKyAgICBleHBlY3Rl
ZFJldHVybiA9PiBbCit7CisgICAgZXhlY3V0YWJsZUJpdERlbHRhID0+IDEsCisgICAgcHJvcGVy
dHlQYXRoID0+ICJhdXRvZ2VuLnNoIiwKK30sCit1bmRlZl0sCisgICAgZXhwZWN0ZWROZXh0TGlu
ZSA9PiB1bmRlZiwKK30sCit7CisgICAgIyBOZXcgdGVzdAorICAgIGRpZmZOYW1lID0+ICJtaXgg
YWRkIGFuZCBkZWxldGUgcHJvcGVydGllcyIsCisgICAgaW5wdXRUZXh0ID0+IDw8J0VORCcsCitQ
cm9wZXJ0eSBjaGFuZ2VzIG9uOiBhdXRvZ2VuLnNoCitfX19fX19fX19fX19fX19fX19fX19fX19f
X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCitEZWxldGVkOiBzdm46
ZXhlY3V0YWJsZQorICAgLSAqCitEZWxldGVkOiBzdm46ZW9sLXN0eWxlCisgICAtIExGCitBZGRl
ZDogZHVtbXkKKyAgICsgZHVtbXkKK0VORAorICAgIGV4cGVjdGVkUmV0dXJuID0+IFsKK3sKKyAg
ICBleGVjdXRhYmxlQml0RGVsdGEgPT4gLTEsCisgICAgcHJvcGVydHlQYXRoID0+ICJhdXRvZ2Vu
LnNoIiwKK30sCit1bmRlZl0sCisgICAgZXhwZWN0ZWROZXh0TGluZSA9PiB1bmRlZiwKK30sCit7
CisgICAgIyBOZXcgdGVzdAorICAgIGRpZmZOYW1lID0+ICJtaXggYWRkIGFuZCBkZWxldGUgcHJv
cGVydGllcyB1c2luZyBBZGRlZCwgTmFtZSwgRGVsZXRlZCBwcmVmaXhlcyIsCisgICAgaW5wdXRU
ZXh0ID0+IDw8J0VORCcsCitQcm9wZXJ0eSBjaGFuZ2VzIG9uOiBhdXRvZ2VuLnNoCitfX19fX19f
X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f
X19fCitEZWxldGVkOiBzdm46ZXhlY3V0YWJsZQorICAgLSAqCitOYW1lOiBzdm46ZW9sLXN0eWxl
CisgICAtIExGCitBZGRlZDogZHVtbXkKKyAgICsgZHVtbXkKK0VORAorICAgIGV4cGVjdGVkUmV0
dXJuID0+IFsKK3sKKyAgICBleGVjdXRhYmxlQml0RGVsdGEgPT4gLTEsCisgICAgcHJvcGVydHlQ
YXRoID0+ICJhdXRvZ2VuLnNoIiwKK30sCit1bmRlZl0sCisgICAgZXhwZWN0ZWROZXh0TGluZSA9
PiB1bmRlZiwKK30sCit7CisgICAgIyBOZXcgdGVzdAorICAgIGRpZmZOYW1lID0+ICJiaW5hcnkg
ZmlsZSAoZGlmZiBzbmlwcGV0KSB3aXRoIGV4ZWN1dGFibGUgYml0IHNldCIsCisgICAgaW5wdXRU
ZXh0ID0+IDw8J0VORCcsCitQcm9wZXJ0eSBjaGFuZ2VzIG9uOiBCaW5hcnlGaWxlQQorX19fX19f
X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f
X19fXworQWRkZWQ6IHN2bjpleGVjdXRhYmxlCisgICArICoKK1ExZFRCeDBBQUFCNDJpdGc0R2xn
WUpqR3dNRER5T0RNeE1EdzM0R0JnUUVBSlBRREpBPT0KK0VORAorICAgIGV4cGVjdGVkUmV0dXJu
ID0+IFsKK3sKKyAgICBleGVjdXRhYmxlQml0RGVsdGEgPT4gMSwKKyAgICBwcm9wZXJ0eVBhdGgg
PT4gIkJpbmFyeUZpbGVBIiwKK30sCisiUTFkVEJ4MEFBQUI0Mml0ZzRHbGdZSmpHd01ERHlPRE14
TUR3MzRHQmdRRUFKUFFESkE9PSJdLAorICAgIGV4cGVjdGVkTmV4dExpbmUgPT4gdW5kZWYsCit9
LAoreworICAgICMgTmV3IHRlc3QKKyAgICBkaWZmTmFtZSA9PiAiYmluYXJ5IGZpbGUgKGRpZmYg
c25pcHBldCkgd2l0aCBleGVjdXRhYmxlIGJpdCBzZXQgKHdpdGggZW1wdHkgbGluZSkiLAorICAg
IGlucHV0VGV4dCA9PiA8PCdFTkQnLAorUHJvcGVydHkgY2hhbmdlcyBvbjogQmluYXJ5RmlsZUEK
K19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f
X19fX19fX19fX18KK0FkZGVkOiBzdm46ZXhlY3V0YWJsZQorICAgKyAqCisKK1ExZFRCeDBBQUFC
NDJpdGc0R2xnWUpqR3dNRER5T0RNeE1EdzM0R0JnUUVBSlBRREpBPT0KK0VORAorICAgIGV4cGVj
dGVkUmV0dXJuID0+IFsKK3sKKyAgICBleGVjdXRhYmxlQml0RGVsdGEgPT4gMSwKKyAgICBwcm9w
ZXJ0eVBhdGggPT4gIkJpbmFyeUZpbGVBIiwKK30sCisiUTFkVEJ4MEFBQUI0Mml0ZzRHbGdZSmpH
d01ERHlPRE14TUR3MzRHQmdRRUFKUFFESkE9PSJdLAorICAgIGV4cGVjdGVkTmV4dExpbmUgPT4g
dW5kZWYsCit9LAorKTsKKworbXkgJHRlc3RDYXNlc0NvdW50ID0gQHRlc3RDYXNlSGFzaFJlZnM7
CitwbGFuKHRlc3RzID0+IDIgKiAkdGVzdENhc2VzQ291bnQpOyAjIFRvdGFsIG51bWJlciBvZiBh
c3NlcnRpb25zLgorCitmb3JlYWNoIG15ICR0ZXN0Q2FzZSAoQHRlc3RDYXNlSGFzaFJlZnMpIHsK
KyAgICBteSAkdGVzdE5hbWVTdGFydCA9ICJwYXJzZVN2bkRpZmZGb290ZXIoKTogJHRlc3RDYXNl
LT57ZGlmZk5hbWV9OiBjb21wYXJpbmciOworCisgICAgbXkgJGZpbGVIYW5kbGU7CisgICAgb3Bl
bigkZmlsZUhhbmRsZSwgIjwiLCBcJHRlc3RDYXNlLT57aW5wdXRUZXh0fSk7CisgICAgbXkgJGxp
bmUgPSA8JGZpbGVIYW5kbGU+OworCisgICAgbXkgQGdvdCA9IFZDU1V0aWxzOjpwYXJzZVN2bkRp
ZmZGb290ZXIoJGZpbGVIYW5kbGUsICRsaW5lKTsKKyAgICBteSAkZXhwZWN0ZWRSZXR1cm4gPSAk
dGVzdENhc2UtPntleHBlY3RlZFJldHVybn07CisKKyAgICBpc19kZWVwbHkoXEBnb3QsICRleHBl
Y3RlZFJldHVybiwgIiR0ZXN0TmFtZVN0YXJ0IHJldHVybiB2YWx1ZS4iKTsKKworICAgIG15ICRn
b3ROZXh0TGluZSA9IDwkZmlsZUhhbmRsZT47CisgICAgaXMoJGdvdE5leHRMaW5lLCAkdGVzdENh
c2UtPntleHBlY3RlZE5leHRMaW5lfSwgICIkdGVzdE5hbWVTdGFydCBuZXh0IHJlYWQgbGluZS4i
KTsKK30KSW5kZXg6IFdlYktpdFRvb2xzL1NjcmlwdHMvd2Via2l0cGVybC9WQ1NVdGlsc191bml0
dGVzdC9wYXJzZVN2blByb3BlcnR5LnBsCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYktpdFRvb2xzL1Njcmlw
dHMvd2Via2l0cGVybC9WQ1NVdGlsc191bml0dGVzdC9wYXJzZVN2blByb3BlcnR5LnBsCShyZXZp
c2lvbiAwKQorKysgV2ViS2l0VG9vbHMvU2NyaXB0cy93ZWJraXRwZXJsL1ZDU1V0aWxzX3VuaXR0
ZXN0L3BhcnNlU3ZuUHJvcGVydHkucGwJKHJldmlzaW9uIDApCkBAIC0wLDAgKzEsMTI1IEBACisj
IS91c3IvYmluL3BlcmwgLXcKKyMKKyMgQ29weXJpZ2h0IChDKSBSZXNlYXJjaCBpbiBNb3Rpb24g
TGltaXRlZCAyMDEwLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorIyBDb3B5cmlnaHQgKEMpIDIwMTAg
Q2hyaXMgSmVyZG9uZWsgKGNocmlzLmplcmRvbmVrQGdtYWlsLmNvbSkKKyMKKyMgUmVkaXN0cmli
dXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0
CisjIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dp
bmcgY29uZGl0aW9ucyBhcmUKKyMgbWV0OgorIworIyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Yg
c291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorIyBub3RpY2UsIHRo
aXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisjICAg
ICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJv
dmUKKyMgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBm
b2xsb3dpbmcgZGlzY2xhaW1lcgorIyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIg
bWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisjIGRpc3RyaWJ1dGlvbi4KKyMgICAgICogTmVp
dGhlciB0aGUgbmFtZSBvZiBBcHBsZSBDb21wdXRlciwgSW5jLiAoIkFwcGxlIikgbm9yIHRoZSBu
YW1lcyBvZgorIyBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJv
bW90ZSBwcm9kdWN0cyBkZXJpdmVkCisjIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNp
ZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyMKKyMgVEhJUyBTT0ZUV0FSRSBJUyBQUk9W
SURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworIyAiQVMgSVMi
IEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5P
VAorIyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElU
WSBBTkQgRklUTkVTUyBGT1IKKyMgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQu
IElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKyMgT1dORVIgT1IgQ09OVFJJQlVUT1JT
IEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisjIFNQRUNJ
QUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBO
T1QKKyMgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJW
SUNFUzsgTE9TUyBPRiBVU0UsCisjIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVS
UlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorIyBUSEVPUlkgT0YgTElBQklMSVRZ
LCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisjIChJTkNM
VURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0Yg
VEhFIFVTRQorIyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJ
QklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisjIFVuaXQgdGVzdHMgb2YgcGFyc2VTdm5Qcm9wZXJ0
eSgpLgorCit1c2Ugc3RyaWN0OwordXNlIHdhcm5pbmdzOworCit1c2UgVGVzdDo6TW9yZTsKK3Vz
ZSBWQ1NVdGlsczsKKworIyBUaGUgYXJyYXkgb2YgdGVzdCBjYXNlcy4KK215IEB0ZXN0Q2FzZUhh
c2hSZWZzID0gKAoreworICAgICMgTmV3IHRlc3QKKyAgICBkaWZmTmFtZSA9PiAiJ0FkZGVkOiBz
dm46ZXhlY3V0YWJsZScgYW5kICcrJyIsCisgICAgaW5wdXRUZXh0ID0+IDw8J0VORCcsCitBZGRl
ZDogc3ZuOmV4ZWN1dGFibGUKKyAgICsgKgorRU5ECisgICAgZXhwZWN0ZWRSZXR1cm4gPT4gWwor
eworICAgIG5hbWUgPT4gInN2bjpleGVjdXRhYmxlIiwKKyAgICBwcm9wZXJ0eUNoYW5nZURlbHRh
ID0+IDEsCisgICAgdmFsdWUgPT4gIioiLAorfSwKKyIgICArICoiXSwKKyAgICBleHBlY3RlZE5l
eHRMaW5lID0+IHVuZGVmLAorfSwKK3sKKyAgICAjIE5ldyB0ZXN0CisgICAgZGlmZk5hbWUgPT4g
IidEZWxldGVkOiBzdm46ZXhlY3V0YWJsZScgYW5kICctJyIsCisgICAgaW5wdXRUZXh0ID0+IDw8
J0VORCcsCitEZWxldGVkOiBzdm46ZXhlY3V0YWJsZQorICAgLSAqCitFTkQKKyAgICBleHBlY3Rl
ZFJldHVybiA9PiBbCit7CisgICAgbmFtZSA9PiAic3ZuOmV4ZWN1dGFibGUiLAorICAgIHByb3Bl
cnR5Q2hhbmdlRGVsdGEgPT4gLTEsCisgICAgdmFsdWUgPT4gIioiLAorfSwKKyIgICAtICoiXSwK
KyAgICBleHBlY3RlZE5leHRMaW5lID0+IHVuZGVmLAorfSwKK3sKKyAgICAjIE5ldyB0ZXN0Cisg
ICAgZGlmZk5hbWUgPT4gIidOYW1lOiBzdm46ZXhlY3V0YWJsZScgYW5kICctJyIsCisgICAgaW5w
dXRUZXh0ID0+IDw8J0VORCcsCitOYW1lOiBzdm46ZXhlY3V0YWJsZQorICAgLSAqCitFTkQKKyAg
ICBleHBlY3RlZFJldHVybiA9PiBbCit7CisgICAgbmFtZSA9PiAic3ZuOmV4ZWN1dGFibGUiLAor
ICAgIHByb3BlcnR5Q2hhbmdlRGVsdGEgPT4gLTEsCisgICAgdmFsdWUgPT4gIioiLAorfSwKKyIg
ICAtICoiXSwKKyAgICBleHBlY3RlZE5leHRMaW5lID0+IHVuZGVmLAorfSwKK3sKKyAgICAjIE5l
dyB0ZXN0CisgICAgZGlmZk5hbWUgPT4gIidOYW1lOiBzdm46ZXhlY3V0YWJsZScgYW5kICcrJyIs
CisgICAgaW5wdXRUZXh0ID0+IDw8J0VORCcsCitOYW1lOiBzdm46ZXhlY3V0YWJsZQorICAgKyAq
CitFTkQKKyAgICBleHBlY3RlZFJldHVybiA9PiBbCit7CisgICAgbmFtZSA9PiAic3ZuOmV4ZWN1
dGFibGUiLAorICAgIHByb3BlcnR5Q2hhbmdlRGVsdGEgPT4gMSwKKyAgICB2YWx1ZSA9PiAiKiIs
Cit9LAorIiAgICsgKiJdLAorICAgIGV4cGVjdGVkTmV4dExpbmUgPT4gdW5kZWYsCit9LAorKTsK
KworbXkgJHRlc3RDYXNlc0NvdW50ID0gQHRlc3RDYXNlSGFzaFJlZnM7CitwbGFuKHRlc3RzID0+
IDIgKiAkdGVzdENhc2VzQ291bnQpOyAjIFRvdGFsIG51bWJlciBvZiBhc3NlcnRpb25zLgorCitm
b3JlYWNoIG15ICR0ZXN0Q2FzZSAoQHRlc3RDYXNlSGFzaFJlZnMpIHsKKyAgICBteSAkdGVzdE5h
bWVTdGFydCA9ICJwYXJzZVN2blByb3BlcnR5KCk6ICR0ZXN0Q2FzZS0+e2RpZmZOYW1lfTogY29t
cGFyaW5nIjsKKworICAgIG15ICRmaWxlSGFuZGxlOworICAgIG9wZW4oJGZpbGVIYW5kbGUsICI8
IiwgXCR0ZXN0Q2FzZS0+e2lucHV0VGV4dH0pOworICAgIG15ICRsaW5lID0gPCRmaWxlSGFuZGxl
PjsKKworICAgIG15IEBnb3QgPSBWQ1NVdGlsczo6cGFyc2VTdm5Qcm9wZXJ0eSgkZmlsZUhhbmRs
ZSwgJGxpbmUpOworICAgIG15ICRleHBlY3RlZFJldHVybiA9ICR0ZXN0Q2FzZS0+e2V4cGVjdGVk
UmV0dXJufTsKKworICAgIGlzX2RlZXBseShcQGdvdCwgJGV4cGVjdGVkUmV0dXJuLCAiJHRlc3RO
YW1lU3RhcnQgcmV0dXJuIHZhbHVlLiIpOworCisgICAgbXkgJGdvdE5leHRMaW5lID0gPCRmaWxl
SGFuZGxlPjsKKyAgICBpcygkZ290TmV4dExpbmUsICR0ZXN0Q2FzZS0+e2V4cGVjdGVkTmV4dExp
bmV9LCAgIiR0ZXN0TmFtZVN0YXJ0IG5leHQgcmVhZCBsaW5lLiIpOworfQo=
</data>

          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>56567</attachid>
            <date>2010-05-19 23:35:32 -0700</date>
            <delta_ts>2010-05-20 05:30:15 -0700</delta_ts>
            <desc>Patch with unit tests</desc>
            <filename>Bug39409.patch</filename>
            <type>text/plain</type>
            <size>14726</size>
            <attacher name="Daniel Bates">dbates</attacher>
            
              <data encoding="base64">ZGlmZiAtLWdpdCBhL1dlYktpdFRvb2xzL0NoYW5nZUxvZyBiL1dlYktpdFRvb2xzL0NoYW5nZUxv
ZwppbmRleCBjODY5YjliLi45NjczNTFjIDEwMDY0NAotLS0gYS9XZWJLaXRUb29scy9DaGFuZ2VM
b2cKKysrIGIvV2ViS2l0VG9vbHMvQ2hhbmdlTG9nCkBAIC0xLDMgKzEsMjMgQEAKKzIwMTAtMDUt
MTkgIERhbmllbCBCYXRlcyAgPGRiYXRlc0ByaW0uY29tPgorCisgICAgICAgIFJldmlld2VkIGJ5
IE5PQk9EWSAoT09QUyEpLgorCisgICAgICAgIEFkZCBpbmZyYXN0cnVjdHVyZSB0byBwYXJzZSBT
Vk4gcHJvcGVydHkgY2hhbmdlcworICAgICAgICBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93
X2J1Zy5jZ2k/aWQ9Mzg4ODUKKworICAgICAgICBBZGRzIGZ1bmN0aW9uIFZDU1V0aWxzOjpwYXJz
ZVN2bkRpZmZGb290ZXIgdG8gcGFyc2UgYW4gU1ZOIGZvb3RlcgorICAgICAgICB0aGF0IGNvbnNp
c3RzIG9mIG9uZSBvciBtb3JlIHByb3BlcnRpZXMuCisKKyAgICAgICAgTm90ZSwgdGhlIGZpcnN0
IGxpbmUgb2YgYW4gU1ZOIGZvb3RlciBiZWdpbnMgd2l0aCAiUHJvcGVydHkgY2hhbmdlcyBvbiIu
CisKKyAgICAgICAgKiBTY3JpcHRzL1ZDU1V0aWxzLnBtOgorICAgICAgICAgIC0gQWRkZWQgZnVu
Y3Rpb24gcGFyc2VTdm5EaWZmRm9vdGVyLiBXaWxsIHVzZSB0aGlzIGZ1bmN0aW9uCisgICAgICAg
ICAgICB0b3dhcmRzIHJlc29sdmluZyBCdWcgIzM5NDA5IDxodHRwczovL2J1Z3Mud2Via2l0Lm9y
Zy9zaG93X2J1Zy5jZ2k/aWQ9Mzk0MDk+LgorICAgICAgICAgIC0gUmVtb3ZlZCBGSVhNRSBjb21t
ZW50IGFib3ZlIGZ1bmN0aW9uIHBhcnNlU3ZuUHJvcGVydHksIHNpbmNlCisgICAgICAgICAgICBp
dCBpcyBiZWluZyB1c2VkIGJ5IHBhcnNlU3ZuRGlmZkZvb3Rlci4KKyAgICAgICAgKiBTY3JpcHRz
L3dlYmtpdHBlcmwvVkNTVXRpbHNfdW5pdHRlc3QvcGFyc2VTdm5EaWZmRm9vdGVyLnBsOiBBZGRl
ZC4KKyAgICAgICAgICAtIEFkZGVkIHVuaXQgdGVzdHMuCisKIDIwMTAtMDUtMTggIEtlbnQgVGFt
dXJhICA8dGtlbnRAY2hyb21pdW0ub3JnPgogCiAgICAgICAgIFJldmlld2VkIGJ5IERpbWl0cmkg
R2xhemtvdi4KZGlmZiAtLWdpdCBhL1dlYktpdFRvb2xzL1NjcmlwdHMvVkNTVXRpbHMucG0gYi9X
ZWJLaXRUb29scy9TY3JpcHRzL1ZDU1V0aWxzLnBtCmluZGV4IDQxYmJmNDAuLjAwZDA5YTQgMTAw
NjQ0Ci0tLSBhL1dlYktpdFRvb2xzL1NjcmlwdHMvVkNTVXRpbHMucG0KKysrIGIvV2ViS2l0VG9v
bHMvU2NyaXB0cy9WQ1NVdGlscy5wbQpAQCAtODM4LDYgKzgzOCw3OSBAQCBzdWIgcGFyc2VEaWZm
KCQkKQogICAgIHJldHVybiAoXEBkaWZmSGFzaFJlZnMsICRsaW5lKTsKIH0KIAorIyBQYXJzZSB0
aGUgbmV4dCBTVk4gZGlmZiBmb290ZXIgZnJvbSB0aGUgZ2l2ZW4gZmlsZSBoYW5kbGUsIGFuZCBh
ZHZhbmNlCisjIHRoZSBoYW5kbGUgc28gdGhlIGxhc3QgbGluZSByZWFkIGlzIHRoZSBmaXJzdCBs
aW5lIGFmdGVyIHRoZSBmb290ZXIuCisjCisjIFRoaXMgc3Vicm91dGluZSBkaWVzIGlmIGdpdmVu
IGxlYWRpbmcganVuay4KKyMKKyMgQXJnczoKKyMgICAkZmlsZUhhbmRsZTogYWR2YW5jZWQgc28g
dGhlIGxhc3QgbGluZSByZWFkIGZyb20gdGhlIGhhbmRsZSBpcyB0aGUgZmlyc3QKKyMgICAgICAg
ICAgICAgICAgbGluZSBvZiB0aGUgZm9vdGVyIHRvIHBhcnNlLiAgVGhpcyBsaW5lIGJlZ2lucyB3
aXRoCisjICAgICAgICAgICAgICAgICJQcm9wZXJ0eSBjaGFuZ2VzIG9uIi4KKyMgICAkbGluZTog
dGhlIGxpbmUgbGFzdCByZWFkIGZyb20gJGZpbGVIYW5kbGUuCisjCisjIFJldHVybnMgKCRwcm9w
ZXJ0eUhhc2hSZWYsICRsYXN0UmVhZExpbmUpOgorIyAgICRwcm9wZXJ0eUhhc2hSZWY6IGEgaGFz
aCByZWZlcmVuY2UgcmVwcmVzZW50aW5nIGFuIFNWTiBkaWZmIGZvb3Rlci4KKyMgICAgIHByb3Bl
cnR5UGF0aDogdGhlIHBhdGggb2YgdGhlIHRhcmdldCBmaWxlLgorIyAgICAgZXhlY3V0YWJsZUJp
dERlbHRhOiB0aGUgdmFsdWUgMSBvciAtMSBpZiB0aGUgZXhlY3V0YWJsZSBiaXQgd2FzIGFkZGVk
IG9yCisjICAgICAgICAgICAgICAgICAgICAgICAgIHJlbW92ZWQgZnJvbSB0aGUgdGFyZ2V0IGZp
bGUsIHJlc3BlY3RpdmVseS4KKyMgICAkbGFzdFJlYWRMaW5lOiB0aGUgbGluZSBsYXN0IHJlYWQg
ZnJvbSAkZmlsZUhhbmRsZS4KKyMKKyMgRklYTUU6IFRoaXMgbWV0aG9kIGlzIHVudXNlZCBhcyBv
ZiAoMDUvMTkvMjAxMCkuICBXZSB3aWxsIGNhbGwgdGhpcyBmdW5jdGlvbgorIyAgICAgICAgYXMg
cGFydCBvZiBwYXJzaW5nIGEgZGlmZi4gIFNlZSA8aHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hv
d19idWcuY2dpP2lkPTM5NDA5Pi4KK3N1YiBwYXJzZVN2bkRpZmZGb290ZXIoJCQpCit7CisgICAg
bXkgKCRmaWxlSGFuZGxlLCAkbGluZSkgPSBAXzsKKworICAgICRfID0gJGxpbmU7CisKKyAgICBt
eSAkc3ZuRm9vdGVyRGlmZlN0YXJ0UmVnRXggPSBxciNQcm9wZXJ0eSBjaGFuZ2VzIG9uOiAoW15c
clxuXSspIzsgIyAkMSBpcyBub3JtYWxseSB0aGUgc2FtZSBhcyB0aGUgaW5kZXggcGF0aC4KKwor
ICAgIG15ICVmb290ZXI7CisgICAgaWYgKC8kc3ZuRm9vdGVyRGlmZlN0YXJ0UmVnRXgvKSB7Cisg
ICAgICAgICRmb290ZXJ7cHJvcGVydHlQYXRofSA9ICQxOworICAgIH0gZWxzZSB7CisgICAgICAg
IGRpZSgiRmFpbGVkIHRvIGZpbmQgc3RhcnQgb2YgU1ZOIHByb3BlcnR5IGNoYW5nZSwgXCJQcm9w
ZXJ0eSBjaGFuZ2VzIG9uIFwiOiBcIiRfXCIiKTsKKyAgICB9CisKKyAgICAjIFdlIGFkdmFuY2Ug
JGZpbGVIYW5kbGUgdHdvIGxpbmVzIHNvIHRoYXQgdGhlIG5leHQgbGluZSB0aGF0CisgICAgIyB3
ZSBwcm9jZXNzIGlzICRzdm5Qcm9wZXJ0eVN0YXJ0UmVnRXggaW4gYSB3ZWxsLWZvcm1lZCBmb290
ZXIuCisgICAgIyBBIHdlbGwtZm9ybWVkIGZvb3RlciBoYXMgdGhlIGZvcm06CisgICAgIyBQcm9w
ZXJ0eSBjaGFuZ2VzIG9uOiBGaWxlQQorICAgICMgX19fX19fX19fX19fX19fX19fX19fX19fX19f
X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXworICAgICMgQWRkZWQ6IHN2
bjpleGVjdXRhYmxlCisgICAgIyAgICArICoKKyAgICAkXyA9IDwkZmlsZUhhbmRsZT47ICMgTm90
IGRlZmluZWQgaWYgZW5kLW9mLWZpbGUgcmVhY2hlZC4KKyAgICBteSAkc2VwYXJhdG9yID0gIl8i
IHggNjc7CisgICAgaWYgKGRlZmluZWQoJF8pICYmIC9eXFEkc2VwYXJhdG9yXEVbXHJcbl0rJC8p
IHsKKyAgICAgICAgJF8gPSA8JGZpbGVIYW5kbGU+OworICAgIH0gZWxzZSB7CisgICAgICAgIGRp
ZSgiRmFpbGVkIHRvIGZpbmQgc2VwYXJhdG9yIGxpbmU6IFwiJF9cIi4iKTsKKyAgICB9CisKKyAg
ICAjIEZJWE1FOiBXZSBzaG91bGQgZXhwYW5kIHRoaXMgdG8gc3VwcG9ydCBvdGhlciBTVk4gcHJv
cGVydGllcy4KKyAgICAjIE5vdGljZSwgd2Uga2VlcCBwcm9jZXNzaW5nIHVudGlsIHdlIGhpdCBl
bmQtb2YtZmlsZSBvciBzb21lCisgICAgIyBsaW5lIHRoYXQgZG9lcyBub3QgcmVzZW1ibGUgJHN2
blByb3BlcnR5U3RhcnRSZWdFeCwgc3VjaCBhcworICAgICMgdGhlIGVtcHR5IGxpbmUgdGhhdCBw
cmVjZWRlcyB0aGUgc3RhcnQgb2YgdGhlIGJpbmFyeSBjb250ZW50cworICAgICMgb2YgYSBwYXRj
aCwgb3IgdGhlIHN0YXJ0IG9mIHRoZSBuZXh0IGRpZmYgKGUuZy4gIkluZGV4OiIpLgorICAgIG15
ICRwcm9wZXJ0eUhhc2hSZWY7CisgICAgd2hpbGUgKGRlZmluZWQoJF8pICYmIC8kc3ZuUHJvcGVy
dHlTdGFydFJlZ0V4LykgeworICAgICAgICAoJHByb3BlcnR5SGFzaFJlZiwgJF8pID0gcGFyc2VT
dm5Qcm9wZXJ0eSgkZmlsZUhhbmRsZSwgJF8pOworICAgICAgICBpZiAoJHByb3BlcnR5SGFzaFJl
Zi0+e25hbWV9IGVxICJzdm46ZXhlY3V0YWJsZSIpIHsKKyAgICAgICAgICAgICMgTm90aWNlLCBm
b3IgU1ZOIHByb3BlcnRpZXMsIHByb3BlcnR5Q2hhbmdlRGVsdGEgaXMgYWx3YXlzIG5vbi16ZXJv
CisgICAgICAgICAgICAjIGJlY2F1c2UgYSBwcm9wZXJ0eSBjYW4gb25seSBiZSBhZGRlZCBvciBy
ZW1vdmVkLgorICAgICAgICAgICAgIworICAgICAgICAgICAgIyBGSVhNRTogU2hvdWxkIHRoZSBk
aWZmIHNwZWNpZnkgbXVsdGlwbGUgdmFsdWVzIGZvciBzdm46ZXhlY3V0YWJsZQorICAgICAgICAg
ICAgIyAgICAgICAgKGhlbmNlIGJlIG1hbGZvcm1lZCkgdGhlbiB3ZSBzZXQgdGhlIHZhbHVlIHRv
IHRoZSBsYXN0CisgICAgICAgICAgICAjICAgICAgICBzdm46ZXhlY3V0YWJsZSBwcm9wZXJ0eS4g
V2UgbWF5IHdhbnQgdG8gY29uc2lkZXIgc29tZQorICAgICAgICAgICAgIyAgICAgICAgYmV0dGVy
IGVycm9yIGhhbmRsaW5nLgorICAgICAgICAgICAgJGZvb3RlcntleGVjdXRhYmxlQml0RGVsdGF9
ID0gJHByb3BlcnR5SGFzaFJlZi0+e3Byb3BlcnR5Q2hhbmdlRGVsdGF9OyAgIAorICAgICAgICB9
CisgICAgfQorCisgICAgcmV0dXJuKFwlZm9vdGVyLCAkXyk7Cit9CisKICMgUGFyc2UgdGhlIG5l
eHQgU1ZOIHByb3BlcnR5IGZyb20gdGhlIGdpdmVuIGZpbGUgaGFuZGxlLCBhbmQgYWR2YW5jZSB0
aGUgaGFuZGxlIHNvIHRoZSBsYXN0CiAjIGxpbmUgcmVhZCBpcyB0aGUgZmlyc3QgbGluZSBhZnRl
ciB0aGUgcHJvcGVydHkuCiAjCkBAIC04NjEsOSArOTM0LDYgQEAgc3ViIHBhcnNlRGlmZigkJCkK
ICMgICAgIHByb3BlcnR5Q2hhbmdlRGVsdGE6IHRoZSB2YWx1ZSAxIG9yIC0xIGlmIHRoZSBwcm9w
ZXJ0eSB3YXMgYWRkZWQgb3IKICMgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbW92ZWQsIHJl
c3BlY3RpdmVseS4KICMgICAkbGFzdFJlYWRMaW5lOiB0aGUgbGluZSBsYXN0IHJlYWQgZnJvbSAk
ZmlsZUhhbmRsZS4KLSMKLSMgRklYTUU6IFRoaXMgbWV0aG9kIGlzIHVudXNlZCBhcyBvZiAoMDUv
MTYvMjAxMCkuICBXZSB3aWxsIGNhbGwgdGhpcyBmdW5jdGlvbgotIyAgICAgICAgYXMgcGFydCBv
ZiBwYXJzaW5nIGEgU1ZOIGZvb3Rlci4gIFNlZSA8aHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hv
d19idWcuY2dpP2lkPTM4ODg1Pi4KIHN1YiBwYXJzZVN2blByb3BlcnR5KCQkKQogewogICAgIG15
ICgkZmlsZUhhbmRsZSwgJGxpbmUpID0gQF87CmRpZmYgLS1naXQgYS9XZWJLaXRUb29scy9TY3Jp
cHRzL3dlYmtpdHBlcmwvVkNTVXRpbHNfdW5pdHRlc3QvcGFyc2VTdm5EaWZmRm9vdGVyLnBsIGIv
V2ViS2l0VG9vbHMvU2NyaXB0cy93ZWJraXRwZXJsL1ZDU1V0aWxzX3VuaXR0ZXN0L3BhcnNlU3Zu
RGlmZkZvb3Rlci5wbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZTg2NzIw
Ci0tLSAvZGV2L251bGwKKysrIGIvV2ViS2l0VG9vbHMvU2NyaXB0cy93ZWJraXRwZXJsL1ZDU1V0
aWxzX3VuaXR0ZXN0L3BhcnNlU3ZuRGlmZkZvb3Rlci5wbApAQCAtMCwwICsxLDM0OCBAQAorIyEv
dXNyL2Jpbi9wZXJsIC13CisjCisjIENvcHlyaWdodCAoQykgUmVzZWFyY2ggaW4gTW90aW9uIExp
bWl0ZWQgMjAxMC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyMgQ29weXJpZ2h0IChDKSAyMDEwIENo
cmlzIEplcmRvbmVrIChjaHJpcy5qZXJkb25la0BnbWFpbC5jb20pCisjCisjIFJlZGlzdHJpYnV0
aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAor
IyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5n
IGNvbmRpdGlvbnMgYXJlCisjIG1ldDoKKyMKKyMgICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNv
dXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyMgbm90aWNlLCB0aGlz
IGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorIyAgICAg
KiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3Zl
CisjIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9s
bG93aW5nIGRpc2NsYWltZXIKKyMgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1h
dGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorIyBkaXN0cmlidXRpb24uCisjICAgICAqIE5laXRo
ZXIgdGhlIG5hbWUgb2YgQXBwbGUgQ29tcHV0ZXIsIEluYy4gKCJBcHBsZSIpIG5vciB0aGUgbmFt
ZXMgb2YKKyMgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21v
dGUgcHJvZHVjdHMgZGVyaXZlZAorIyBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZp
YyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisjCisjIFRISVMgU09GVFdBUkUgSVMgUFJPVklE
RUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyMgIkFTIElTIiBB
TkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QK
KyMgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkg
QU5EIEZJVE5FU1MgRk9SCisjIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJ
TiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisjIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBC
RSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorIyBTUEVDSUFM
LCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9U
CisjIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklD
RVM7IExPU1MgT0YgVVNFLAorIyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJV
UFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyMgVEhFT1JZIE9GIExJQUJJTElUWSwg
V0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorIyAoSU5DTFVE
SU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRI
RSBVU0UKKyMgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJ
TElUWSBPRiBTVUNIIERBTUFHRS4KKworIyBVbml0IHRlc3RzIG9mIHBhcnNlU3ZuRGlmZkZvb3Rl
cigpLgorCit1c2Ugc3RyaWN0OwordXNlIHdhcm5pbmdzOworCit1c2UgVGVzdDo6TW9yZTsKK3Vz
ZSBWQ1NVdGlsczsKKworbXkgQHRlc3RDYXNlSGFzaFJlZnMgPSAoCisjIyMjCisjIFNpbXBsZSB0
ZXN0IGNhc2VzCisjIworeworICAgICMgTmV3IHRlc3QKKyAgICBkaWZmTmFtZSA9PiAic2ltcGxl
OiBhZGQgc3ZuOmV4ZWN1dGFibGUiLAorICAgIGlucHV0VGV4dCA9PiA8PCdFTkQnLAorUHJvcGVy
dHkgY2hhbmdlcyBvbjogRmlsZUEKK19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f
X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KK0FkZGVkOiBzdm46ZXhlY3V0YWJsZQor
ICAgKyAqCitFTkQKKyAgICBleHBlY3RlZFJldHVybiA9PiBbCit7CisgICAgcHJvcGVydHlQYXRo
ID0+ICJGaWxlQSIsCisgICAgZXhlY3V0YWJsZUJpdERlbHRhID0+IDEsCit9LAordW5kZWZdLAor
ICAgIGV4cGVjdGVkTmV4dExpbmUgPT4gdW5kZWYsCit9LAoreworICAgICMgTmV3IHRlc3QKKyAg
ICBkaWZmTmFtZSA9PiAic2ltcGxlOiBkZWxldGUgc3ZuOmV4ZWN1dGFibGUiLAorICAgIGlucHV0
VGV4dCA9PiA8PCdFTkQnLAorUHJvcGVydHkgY2hhbmdlcyBvbjogRmlsZUEKK19fX19fX19fX19f
X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18K
K0RlbGV0ZWQ6IHN2bjpleGVjdXRhYmxlCisgICAtICoKK0VORAorICAgIGV4cGVjdGVkUmV0dXJu
ID0+IFsKK3sKKyAgICBwcm9wZXJ0eVBhdGggPT4gIkZpbGVBIiwKKyAgICBleGVjdXRhYmxlQml0
RGVsdGEgPT4gLTEsCit9LAordW5kZWZdLAorICAgIGV4cGVjdGVkTmV4dExpbmUgPT4gdW5kZWYs
Cit9LAoreworICAgICMgTmV3IHRlc3QKKyAgICBkaWZmTmFtZSA9PiAic2ltcGxlOiBkZWxldGUg
c3ZuOmV4ZWN1dGFibGUgdXNpbmcgU1ZOIDEuNCBzeW50YXgiLAorICAgIGlucHV0VGV4dCA9PiA8
PCdFTkQnLAorUHJvcGVydHkgY2hhbmdlcyBvbjogRmlsZUEKK19fX19fX19fX19fX19fX19fX19f
X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KK05hbWU6IHN2
bjpleGVjdXRhYmxlCisgICAtICoKK0VORAorICAgIGV4cGVjdGVkUmV0dXJuID0+IFsKK3sKKyAg
ICBwcm9wZXJ0eVBhdGggPT4gIkZpbGVBIiwKKyAgICBleGVjdXRhYmxlQml0RGVsdGEgPT4gLTEs
Cit9LAordW5kZWZdLAorICAgIGV4cGVjdGVkTmV4dExpbmUgPT4gdW5kZWYsCit9LAorIyMjIwor
IyBQcm9wZXJ0eSB2YWx1ZSBmb2xsb3dlZCBieSBlbXB0eSBsaW5lIGFuZCBzdGFydCBvZiBuZXh0
IGRpZmYKKyMjCit7CisgICAgIyBOZXcgdGVzdAorICAgIGRpZmZOYW1lID0+ICJhZGQgc3ZuOmV4
ZWN1dGFibGUsIGZvbGxvd2VkIGJ5IGVtcHR5IGxpbmUgYW5kIHN0YXJ0IG9mIG5leHQgZGlmZiIs
CisgICAgaW5wdXRUZXh0ID0+IDw8J0VORCcsCitQcm9wZXJ0eSBjaGFuZ2VzIG9uOiBGaWxlQQor
X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f
X19fX19fX19fXworQWRkZWQ6IHN2bjpleGVjdXRhYmxlCisgICArICoKKworSW5kZXg6IE1ha2Vm
aWxlLnNoYXJlZAorRU5ECisgICAgZXhwZWN0ZWRSZXR1cm4gPT4gWworeworICAgIHByb3BlcnR5
UGF0aCA9PiAiRmlsZUEiLAorICAgIGV4ZWN1dGFibGVCaXREZWx0YSA9PiAxLAorfSwKKyJcbiJd
LAorICAgIGV4cGVjdGVkTmV4dExpbmUgPT4gIkluZGV4OiBNYWtlZmlsZS5zaGFyZWRcbiIsCit9
LAoreworICAgICMgTmV3IHRlc3QKKyAgICBkaWZmTmFtZSA9PiAiYWRkIHN2bjpleGVjdXRhYmxl
LCBmb2xsb3dlZCBieSBlbXB0eSBsaW5lIGFuZCBzdGFydCBvZiBuZXh0IHByb3BlcnR5IGRpZmYi
LAorICAgIGlucHV0VGV4dCA9PiA8PCdFTkQnLAorUHJvcGVydHkgY2hhbmdlcyBvbjogRmlsZUEK
K19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f
X19fX19fX19fX18KK0FkZGVkOiBzdm46ZXhlY3V0YWJsZQorICAgKyAqCisKK1Byb3BlcnR5IGNo
YW5nZXMgb246IE1ha2VmaWxlLnNoYXJlZAorRU5ECisgICAgZXhwZWN0ZWRSZXR1cm4gPT4gWwor
eworICAgIHByb3BlcnR5UGF0aCA9PiAiRmlsZUEiLAorICAgIGV4ZWN1dGFibGVCaXREZWx0YSA9
PiAxLAorfSwKKyJcbiJdLAorICAgIGV4cGVjdGVkTmV4dExpbmUgPT4gIlByb3BlcnR5IGNoYW5n
ZXMgb246IE1ha2VmaWxlLnNoYXJlZFxuIiwKK30sCisjIyMjCisjIFByb3BlcnR5IHZhbHVlIGZv
bGxvd2VkIGJ5IGVtcHR5IGxpbmUgYW5kIHN0YXJ0IG9mIGJpbmFyeSBwYXRjaAorIyMKK3sKKyAg
ICAjIE5ldyB0ZXN0CisgICAgZGlmZk5hbWUgPT4gImFkZCBzdm46ZXhlY3V0YWJsZSwgZm9sbG93
ZWQgYnkgZW1wdHkgbGluZSBhbmQgc3RhcnQgb2YgYmluYXJ5IHBhdGNoIiwKKyAgICBpbnB1dFRl
eHQgPT4gPDwnRU5EJywKK1Byb3BlcnR5IGNoYW5nZXMgb246IEZpbGVBCitfX19fX19fX19fX19f
X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCitB
ZGRlZDogc3ZuOmV4ZWN1dGFibGUKKyAgICsgKgorCitRMWRUQngwQUFBQjQyaXRnNEdsZ1lKakd3
TUREeU9ETXhNRHczNEdCZ1FFQUpQUURKQT09CitFTkQKKyAgICBleHBlY3RlZFJldHVybiA9PiBb
Cit7CisgICAgcHJvcGVydHlQYXRoID0+ICJGaWxlQSIsCisgICAgZXhlY3V0YWJsZUJpdERlbHRh
ID0+IDEsCit9LAorIlxuIl0sCisgICAgZXhwZWN0ZWROZXh0TGluZSA9PiAiUTFkVEJ4MEFBQUI0
Mml0ZzRHbGdZSmpHd01ERHlPRE14TUR3MzRHQmdRRUFKUFFESkE9PVxuIiwKK30sCit7CisgICAg
IyBOZXcgdGVzdAorICAgIGRpZmZOYW1lID0+ICJjdXN0b20gcHJvcGVydHkgZm9sbG93ZWQgYnkg
c3ZuOmV4ZWN1dGFibGUsIGVtcHR5IGxpbmUgYW5kIHN0YXJ0IG9mIGJpbmFyeSBwYXRjaCIsCisg
ICAgaW5wdXRUZXh0ID0+IDw8J0VORCcsCitQcm9wZXJ0eSBjaGFuZ2VzIG9uOiBGaWxlQQorX19f
X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f
X19fX19fXworQWRkZWQ6IGRvY3VtZW50YXRpb24KKyAgICsgQSBzZW50ZW5jZS4KK0FkZGVkOiBz
dm46ZXhlY3V0YWJsZQorICAgKyAqCisKK1ExZFRCeDBBQUFCNDJpdGc0R2xnWUpqR3dNRER5T0RN
eE1EdzM0R0JnUUVBSlBRREpBPT0KK0VORAorICAgIGV4cGVjdGVkUmV0dXJuID0+IFsKK3sKKyAg
ICBwcm9wZXJ0eVBhdGggPT4gIkZpbGVBIiwKKyAgICBleGVjdXRhYmxlQml0RGVsdGEgPT4gMSwK
K30sCisiXG4iXSwKKyAgICBleHBlY3RlZE5leHRMaW5lID0+ICJRMWRUQngwQUFBQjQyaXRnNEds
Z1lKakd3TUREeU9ETXhNRHczNEdCZ1FFQUpQUURKQT09XG4iLAorfSwKKyMjIyMKKyMgU3VjY2Vz
c2l2ZSBwcm9wZXJ0aWVzCisjIworeworICAgICMgTmV3IHRlc3QKKyAgICBkaWZmTmFtZSA9PiAi
c3ZuOmV4ZWN1dGFibGUgZm9sbG93ZWQgYnkgY3VzdG9tIHByb3BlcnR5IiwKKyAgICBpbnB1dFRl
eHQgPT4gPDwnRU5EJywKK1Byb3BlcnR5IGNoYW5nZXMgb246IEZpbGVBCitfX19fX19fX19fX19f
X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCitB
ZGRlZDogc3ZuOmV4ZWN1dGFibGUKKyAgICsgKgorQWRkZWQ6IGRvY3VtZW50YXRpb24KKyAgICsg
QSBzZW50ZW5jZS4KK0VORAorICAgIGV4cGVjdGVkUmV0dXJuID0+IFsKK3sKKyAgICBwcm9wZXJ0
eVBhdGggPT4gIkZpbGVBIiwKKyAgICBleGVjdXRhYmxlQml0RGVsdGEgPT4gMSwKK30sCit1bmRl
Zl0sCisgICAgZXhwZWN0ZWROZXh0TGluZSA9PiB1bmRlZiwKK30sCit7CisgICAgIyBOZXcgdGVz
dAorICAgIGRpZmZOYW1lID0+ICJjdXN0b20gcHJvcGVydHkgZm9sbG93ZWQgYnkgc3ZuOmV4ZWN1
dGFibGUiLAorICAgIGlucHV0VGV4dCA9PiA8PCdFTkQnLAorUHJvcGVydHkgY2hhbmdlcyBvbjog
RmlsZUEKK19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f
X19fX19fX19fX19fX19fX18KK0FkZGVkOiBkb2N1bWVudGF0aW9uCisgICArIEEgc2VudGVuY2Uu
CitBZGRlZDogc3ZuOmV4ZWN1dGFibGUKKyAgICsgKgorRU5ECisgICAgZXhwZWN0ZWRSZXR1cm4g
PT4gWworeworICAgIHByb3BlcnR5UGF0aCA9PiAiRmlsZUEiLAorICAgIGV4ZWN1dGFibGVCaXRE
ZWx0YSA9PiAxLAorfSwKK3VuZGVmXSwKKyAgICBleHBlY3RlZE5leHRMaW5lID0+IHVuZGVmLAor
fSwKKyMjIyMKKyMgU3VjY2Vzc2l2ZSBwcm9wZXJ0aWVzIGZvbGxvd2VkIGJ5IGVtcHR5IGxpbmUg
YW5kIHN0YXJ0IG9mIG5leHQgZGlmZgorIyMKK3sKKyAgICAjIE5ldyB0ZXN0CisgICAgZGlmZk5h
bWUgPT4gImN1c3RvbSBwcm9wZXJ0eSBmb2xsb3dlZCBieSBzdm46ZXhlY3V0YWJsZSwgZW1wdHkg
bGluZSBhbmQgc3RhcnQgb2YgbmV4dCBwcm9wZXJ0eSBkaWZmIiwKKyAgICBpbnB1dFRleHQgPT4g
PDwnRU5EJywKK1Byb3BlcnR5IGNoYW5nZXMgb246IEZpbGVBCitfX19fX19fX19fX19fX19fX19f
X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCitBZGRlZDog
ZG9jdW1lbnRhdGlvbgorICAgKyBBIHNlbnRlbmNlLgorQWRkZWQ6IHN2bjpleGVjdXRhYmxlCisg
ICArICoKKworUHJvcGVydHkgY2hhbmdlcyBvbjogTWFrZWZpbGUuc2hhcmVkCitFTkQKKyAgICBl
eHBlY3RlZFJldHVybiA9PiBbCit7CisgICAgcHJvcGVydHlQYXRoID0+ICJGaWxlQSIsCisgICAg
ZXhlY3V0YWJsZUJpdERlbHRhID0+IDEsCit9LAorIlxuIl0sCisgICAgZXhwZWN0ZWROZXh0TGlu
ZSA9PiAiUHJvcGVydHkgY2hhbmdlcyBvbjogTWFrZWZpbGUuc2hhcmVkXG4iLAorfSwKK3sKKyAg
ICAjIE5ldyB0ZXN0CisgICAgZGlmZk5hbWUgPT4gImN1c3RvbSBwcm9wZXJ0eSBmb2xsb3dlZCBi
eSBzdm46ZXhlY3V0YWJsZSwgZW1wdHkgbGluZSBhbmQgc3RhcnQgb2YgbmV4dCBpbmRleCBkaWZm
IiwKKyAgICBpbnB1dFRleHQgPT4gPDwnRU5EJywKK1Byb3BlcnR5IGNoYW5nZXMgb246IEZpbGVB
CitfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f
X19fX19fX19fX19fCitBZGRlZDogZG9jdW1lbnRhdGlvbgorICAgKyBBIHNlbnRlbmNlLgorQWRk
ZWQ6IHN2bjpleGVjdXRhYmxlCisgICArICoKKworSW5kZXg6IE1ha2VmaWxlLnNoYXJlZAorRU5E
CisgICAgZXhwZWN0ZWRSZXR1cm4gPT4gWworeworICAgIHByb3BlcnR5UGF0aCA9PiAiRmlsZUEi
LAorICAgIGV4ZWN1dGFibGVCaXREZWx0YSA9PiAxLAorfSwKKyJcbiJdLAorICAgIGV4cGVjdGVk
TmV4dExpbmUgPT4gIkluZGV4OiBNYWtlZmlsZS5zaGFyZWRcbiIsCit9LAorIyMjIworIyBDdXN0
b20gcHJvcGVydGllcworIyMKKyMgRklYTUU6IFdlIGRvIG5vdCBzdXBwb3J0IGFueXRoaW5nIG90
aGVyIHRoYW4gdGhlIHN2bjpleGVjdXRhYmxlIHByb3BlcnR5LgorIyAgICAgICAgV2Ugc2hvdWxk
IGFkZCBzdXBwb3J0IGZvciBoYW5kbGluZyBvdGhlciBwcm9wZXJ0aWVzLgoreworICAgICMgTmV3
IHRlc3QKKyAgICBkaWZmTmFtZSA9PiAic2ltcGxlOiBjdXN0b20gcHJvcGVydHkiLAorICAgIGlu
cHV0VGV4dCA9PiA8PCdFTkQnLAorUHJvcGVydHkgY2hhbmdlcyBvbjogRmlsZUEKK19fX19fX19f
X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f
X18KK05hbWU6IGRvY3VtZW50YXRpb24KKyAgICsgQSBzZW50ZW5jZS4KK0VORAorICAgIGV4cGVj
dGVkUmV0dXJuID0+IFsKK3sKKyAgICBwcm9wZXJ0eVBhdGggPT4gIkZpbGVBIiwKK30sCit1bmRl
Zl0sCisgICAgZXhwZWN0ZWROZXh0TGluZSA9PiB1bmRlZiwKK30sCit7CisgICAgIyBOZXcgdGVz
dAorICAgIGRpZmZOYW1lID0+ICJjdXN0b20gcHJvcGVydHkgZm9sbG93ZWQgYnkgY3VzdG9tIHBy
b3BlcnR5IiwKKyAgICBpbnB1dFRleHQgPT4gPDwnRU5EJywKK1Byb3BlcnR5IGNoYW5nZXMgb246
IEZpbGVBCitfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f
X19fX19fX19fX19fX19fX19fCitBZGRlZDogY29weXJpZ2h0CisgICArIENvcHlyaWdodCAoQykg
UmVzZWFyY2ggaW4gTW90aW9uIExpbWl0ZWQgMjAxMC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KK0Fk
ZGVkOiBkb2N1bWVudGF0aW9uCisgICArIEEgc2VudGVuY2UuCitFTkQKKyAgICBleHBlY3RlZFJl
dHVybiA9PiBbCit7CisgICAgcHJvcGVydHlQYXRoID0+ICJGaWxlQSIsCit9LAordW5kZWZdLAor
ICAgIGV4cGVjdGVkTmV4dExpbmUgPT4gdW5kZWYsCit9LAorIyMjIworIyBNYWxmb3JtZWQgcHJv
cGVydHkgZGlmZnMKKyMjCisjIFdlIHNob3VsZG4ndCBlbmNvdW50ZXIgc3VjaCBkaWZmcyBpbiBw
cmFjdGljZS4KK3sKKyAgICAjIE5ldyB0ZXN0CisgICAgZGlmZk5hbWUgPT4gInN2bjpleGVjdXRh
YmxlIGZvbGxvd2VkIGJ5IGN1c3RvbSBwcm9wZXJ0eSBhbmQgc3ZuOmV4ZWN1dGFibGUiLAorICAg
IGlucHV0VGV4dCA9PiA8PCdFTkQnLAorUHJvcGVydHkgY2hhbmdlcyBvbjogRmlsZUEKK19fX19f
X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f
X19fX18KK0FkZGVkOiBzdm46ZXhlY3V0YWJsZQorICAgKyAqCitBZGRlZDogZG9jdW1lbnRhdGlv
bgorICAgKyBBIHNlbnRlbmNlLgorRGVsZXRlZDogc3ZuOmV4ZWN1dGFibGUKKyAgIC0gKgorRU5E
CisgICAgZXhwZWN0ZWRSZXR1cm4gPT4gWworeworICAgIHByb3BlcnR5UGF0aCA9PiAiRmlsZUEi
LAorICAgIGV4ZWN1dGFibGVCaXREZWx0YSA9PiAtMSwKK30sCit1bmRlZl0sCisgICAgZXhwZWN0
ZWROZXh0TGluZSA9PiB1bmRlZiwKK30sCispOworCitteSAkdGVzdENhc2VzQ291bnQgPSBAdGVz
dENhc2VIYXNoUmVmczsKK3BsYW4odGVzdHMgPT4gMiAqICR0ZXN0Q2FzZXNDb3VudCk7ICMgVG90
YWwgbnVtYmVyIG9mIGFzc2VydGlvbnMuCisKK2ZvcmVhY2ggbXkgJHRlc3RDYXNlIChAdGVzdENh
c2VIYXNoUmVmcykgeworICAgIG15ICR0ZXN0TmFtZVN0YXJ0ID0gInBhcnNlU3ZuRGlmZkZvb3Rl
cigpOiAkdGVzdENhc2UtPntkaWZmTmFtZX06IGNvbXBhcmluZyI7CisKKyAgICBteSAkZmlsZUhh
bmRsZTsKKyAgICBvcGVuKCRmaWxlSGFuZGxlLCAiPCIsIFwkdGVzdENhc2UtPntpbnB1dFRleHR9
KTsKKyAgICBteSAkbGluZSA9IDwkZmlsZUhhbmRsZT47CisKKyAgICBteSBAZ290ID0gVkNTVXRp
bHM6OnBhcnNlU3ZuRGlmZkZvb3RlcigkZmlsZUhhbmRsZSwgJGxpbmUpOworICAgIG15ICRleHBl
Y3RlZFJldHVybiA9ICR0ZXN0Q2FzZS0+e2V4cGVjdGVkUmV0dXJufTsKKworICAgIGlzX2RlZXBs
eShcQGdvdCwgJGV4cGVjdGVkUmV0dXJuLCAiJHRlc3ROYW1lU3RhcnQgcmV0dXJuIHZhbHVlLiIp
OworCisgICAgbXkgJGdvdE5leHRMaW5lID0gPCRmaWxlSGFuZGxlPjsKKyAgICBpcygkZ290TmV4
dExpbmUsICR0ZXN0Q2FzZS0+e2V4cGVjdGVkTmV4dExpbmV9LCAgIiR0ZXN0TmFtZVN0YXJ0IG5l
eHQgcmVhZCBsaW5lLiIpOworfQo=
</data>
<flag name="review"
          id="41016"
          type_id="1"
          status="+"
          setter="cjerdonek"
    />
          </attachment>
      

    </bug>

</bugzilla>