<?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>39170</bug_id>
          
          <creation_ts>2010-05-15 18:43:03 -0700</creation_ts>
          <short_desc>Add support function to parse SVN single-line and multi-line property value</short_desc>
          <delta_ts>2010-05-16 15:36:17 -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>
          
          <blocked>38885</blocked>
    
    <blocked>39184</blocked>
          <everconfirmed>1</everconfirmed>
          <reporter name="Daniel Bates">dbates</reporter>
          <assigned_to name="Nobody">webkit-unassigned</assigned_to>
          <cc>cjerdonek</cc>
    
    <cc>eric</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>226377</commentid>
    <comment_count>0</comment_count>
    <who name="Daniel Bates">dbates</who>
    <bug_when>2010-05-15 18:43:03 -0700</bug_when>
    <thetext>As part of the infrastructure to parse SVN property changes, we need to be able to parse single-line and multi-line property values.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>226384</commentid>
    <comment_count>1</comment_count>
      <attachid>56171</attachid>
    <who name="Daniel Bates">dbates</who>
    <bug_when>2010-05-15 19:07:00 -0700</bug_when>
    <thetext>Created attachment 56171
Patch with unit tests</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>226387</commentid>
    <comment_count>2</comment_count>
    <who name="Eric Seidel (no email)">eric</who>
    <bug_when>2010-05-15 19:14:16 -0700</bug_when>
    <thetext> I wonder as I read this:  doesn&apos;t svn have some sort of xml output mode?  Would that be easier to make our scripts use?  Or am I just drinking the xml koolaid and making non-sequitor comments on bugs?  ;)</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>226390</commentid>
    <comment_count>3</comment_count>
      <attachid>56171</attachid>
    <who name="Chris Jerdonek">cjerdonek</who>
    <bug_when>2010-05-15 19:27:54 -0700</bug_when>
    <thetext>Comment on attachment 56171
Patch with unit tests

Thanks, Dan!  Comments below.  r- to consider them:

&gt; Index: WebKitTools/ChangeLog
&gt; +        Add function parseSvnPropertyPlusOrMinus to parse single-line and multi-line
&gt; +        property values.

Would parseSvnPropertyValue() be more direct?

&gt; +
&gt; +        * Scripts/VCSUtils.pm:
&gt; +            Added function parseSvnPropertyPlusOrMinus. We will use this as part of
&gt; +            Bug #38885.

It might be helpful to include a bug URL for clickability.

&gt; Index: WebKitTools/Scripts/VCSUtils.pm
&gt;  
&gt;  my $gitDiffStartRegEx = qr#^diff --git (\w/)?(.+) (\w/)?([^\r\n]+)#;
&gt;  my $svnDiffStartRegEx = qr#^Index: ([^\r\n]+)#;
&gt; +my $svnPropertyChangeStartRegEx = qr#^(Modified|Name|Added|Deleted): ([^\r\n]+)#; # $1 is the name of the property
&gt; +my $svnPropertyValueRegEx = qr#^   (\+|-) ([^\r\n]+)#; # $2 is the start of the property&apos;s value (which may span multiple lines).

Would $svnPropertyValueStartRegEx be better since it is just the first line?

&gt; +# Parse the property value of an SVN property from the given file handle, and advance
&gt; +# the handle so the last line read is the first line after the property value.

I would abbreviate this to, &quot;Parse the value of an SVN property change from...&quot;
and then in a separate paragraph include that an SVN property change is
a section in the footer of an SVN diff with one or two property value 
sub-sections.

&gt; +# This subroutine dies if the first line is not a valid SVN property value line
&gt; +# (i.e. a line that begins with &quot;   +&quot; or &quot;   -&quot;).

&quot;...not the beginning of a valid...&quot;

&gt; +#   $fileHandle: advanced so the last line read from the handle is the first
&gt; +#                line of the property value to parse.  This should be a line
&gt; +#                beginning with &quot;   +&quot; or &quot;   -&quot;.

You already said this above.  Probably just include it in one of the two
places.

&gt; +# FIXME: This method is unused as of (05/15/2010). We will call this function
&gt; +#        as part of parsing a property from the SVN footer. See Bug #38885.

Maybe include bug URL.

&gt; +sub parseSvnPropertyPlusOrMinus($$)
&gt; +{
&gt; +    my ($fileHandle, $line) = @_;
&gt; +
&gt; +    $_ = $line;
&gt; +
&gt; +    my $propertyValue;
&gt; +    if (/$svnPropertyValueRegEx/) {
&gt; +        $propertyValue = $2; # Does not include the end-of-line character(s)
&gt; +    } else {
&gt; +        die(&quot;Failed to find &apos;+&apos; or &apos;-&apos; property: \&quot;$_\&quot;.&quot;);

Maybe &quot;Failed to find property value beginning with &apos;+&apos; or &apos;-&apos;: ...&quot;?

&gt; +    }
&gt; +
&gt; +    $_ = &lt;$fileHandle&gt;;
&gt; +    $propertyValue .= $POSTMATCH if defined($_); # Preserve the end-of-line of the first line in a multi-line property value.

It looks like you&apos;re including the end-of-line characters even if the
property value has just one line.  Also, could you possibly rework things
so that the $POSTMATCH value is read from closer to the reg ex (e.g. right
after where $propertyValue is set to $2?

&gt; +# The array of test cases.

This is probably redundant (even though it&apos;s in the other files).

&gt; +my @testCaseHashRefs = (
&gt; +{
&gt; +    # New test

Is it necessary to write &quot;# New test&quot; at the beginning of each test case?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>226395</commentid>
    <comment_count>4</comment_count>
    <who name="Daniel Bates">dbates</who>
    <bug_when>2010-05-15 19:57:01 -0700</bug_when>
    <thetext>(In reply to comment #2)
&gt;  I wonder as I read this:  doesn&apos;t svn have some sort of xml output mode?  Would that be easier to make our scripts use?  Or am I just drinking the xml koolaid and making non-sequitor comments on bugs?  ;)

I think we should look into this further.

From the SVN book, it appears XML output was added somewhere after SVN 1.4 (appears in 1.5, http://svnbook.red-bean.com/en/1.5/svn.ref.svn.c.diff.html). Last I recall, Leopard 10.5.8 ships with 1.4.4, which may or may not support it. I doubt Tiger ships with a version of SVN with such support.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>226399</commentid>
    <comment_count>5</comment_count>
    <who name="Daniel Bates">dbates</who>
    <bug_when>2010-05-15 20:10:37 -0700</bug_when>
    <thetext>(In reply to comment #3)
&gt; (From update of attachment 56171 [details])
&gt; Thanks, Dan!  Comments below.  r- to consider them:
&gt; 
&gt; &gt; Index: WebKitTools/ChangeLog
&gt; &gt; +        Add function parseSvnPropertyPlusOrMinus to parse single-line and multi-line
&gt; &gt; +        property values.
&gt; 
&gt; Would parseSvnPropertyValue() be more direct?

Will change.

&gt; 
&gt; &gt; +
&gt; &gt; +        * Scripts/VCSUtils.pm:
&gt; &gt; +            Added function parseSvnPropertyPlusOrMinus. We will use this as part of
&gt; &gt; +            Bug #38885.
&gt; 
&gt; It might be helpful to include a bug URL for clickability.

Will change.

&gt; 
&gt; &gt; Index: WebKitTools/Scripts/VCSUtils.pm
&gt; &gt;  
&gt; &gt;  my $gitDiffStartRegEx = qr#^diff --git (\w/)?(.+) (\w/)?([^\r\n]+)#;
&gt; &gt;  my $svnDiffStartRegEx = qr#^Index: ([^\r\n]+)#;
&gt; &gt; +my $svnPropertyChangeStartRegEx = qr#^(Modified|Name|Added|Deleted): ([^\r\n]+)#; # $1 is the name of the property
&gt; &gt; +my $svnPropertyValueRegEx = qr#^   (\+|-) ([^\r\n]+)#; # $2 is the start of the property&apos;s value (which may span multiple lines).
&gt; 
&gt; Would $svnPropertyValueStartRegEx be better since it is just the first line?

Will change.

&gt; 
&gt; &gt; +# Parse the property value of an SVN property from the given file handle, and advance
&gt; &gt; +# the handle so the last line read is the first line after the property value.
&gt; 
&gt; I would abbreviate this to, &quot;Parse the value of an SVN property change from...&quot;
&gt; and then in a separate paragraph include that an SVN property change is
&gt; a section in the footer of an SVN diff with one or two property value 
&gt; sub-sections.
&gt; 
&gt; &gt; +# This subroutine dies if the first line is not a valid SVN property value line
&gt; &gt; +# (i.e. a line that begins with &quot;   +&quot; or &quot;   -&quot;).
&gt; 
&gt; &quot;...not the beginning of a valid...&quot;

Will change.

&gt; 
&gt; &gt; +#   $fileHandle: advanced so the last line read from the handle is the first
&gt; &gt; +#                line of the property value to parse.  This should be a line
&gt; &gt; +#                beginning with &quot;   +&quot; or &quot;   -&quot;.
&gt; 
&gt; You already said this above.  Probably just include it in one of the two
&gt; places.
&gt; 
&gt; &gt; +# FIXME: This method is unused as of (05/15/2010). We will call this function
&gt; &gt; +#        as part of parsing a property from the SVN footer. See Bug #38885.
&gt; 
&gt; Maybe include bug URL.
&gt; 
&gt; &gt; +sub parseSvnPropertyPlusOrMinus($$)
&gt; &gt; +{
&gt; &gt; +    my ($fileHandle, $line) = @_;
&gt; &gt; +
&gt; &gt; +    $_ = $line;
&gt; &gt; +
&gt; &gt; +    my $propertyValue;
&gt; &gt; +    if (/$svnPropertyValueRegEx/) {
&gt; &gt; +        $propertyValue = $2; # Does not include the end-of-line character(s)
&gt; &gt; +    } else {
&gt; &gt; +        die(&quot;Failed to find &apos;+&apos; or &apos;-&apos; property: \&quot;$_\&quot;.&quot;);
&gt; 
&gt; Maybe &quot;Failed to find property value beginning with &apos;+&apos; or &apos;-&apos;: ...&quot;?
&gt; 
&gt; &gt; +    }
&gt; &gt; +
&gt; &gt; +    $_ = &lt;$fileHandle&gt;;
&gt; &gt; +    $propertyValue .= $POSTMATCH if defined($_); # Preserve the end-of-line of the first line in a multi-line property value.
&gt; 
&gt; It looks like you&apos;re including the end-of-line characters even if the
&gt; property value has just one line.  Also, could you possibly rework things
&gt; so that the $POSTMATCH value is read from closer to the reg ex (e.g. right
&gt; after where $propertyValue is set to $2?
&gt; 
&gt; &gt; +# The array of test cases.
&gt; 
&gt; This is probably redundant (even though it&apos;s in the other files).

Will remove, note it appears in parseDiff.pl, parseGitDiffHeader.pl and parseSvnDiffHeader.pl.

&gt; 
&gt; &gt; +my @testCaseHashRefs = (
&gt; &gt; +{
&gt; &gt; +    # New test
&gt; 
&gt; Is it necessary to write &quot;# New test&quot; at the beginning of each test case?

I think it is easier to identify the test cases using this comment, although we should find a better way to demarcate the test cases, if possible.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>226402</commentid>
    <comment_count>6</comment_count>
      <attachid>56172</attachid>
    <who name="Daniel Bates">dbates</who>
    <bug_when>2010-05-15 20:21:02 -0700</bug_when>
    <thetext>Created attachment 56172
Patch with unit tests</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>226404</commentid>
    <comment_count>7</comment_count>
      <attachid>56173</attachid>
    <who name="Daniel Bates">dbates</who>
    <bug_when>2010-05-15 20:44:08 -0700</bug_when>
    <thetext>Created attachment 56173
Patch with unit tests

Added additional unit tests: &quot;multi-line &apos;-&apos; change followed by &apos;+&apos; single-line change&quot; and &quot;multi-line &apos;-&apos; change followed by &apos;+&apos; multi-line change&quot;.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>226405</commentid>
    <comment_count>8</comment_count>
      <attachid>56173</attachid>
    <who name="Chris Jerdonek">cjerdonek</who>
    <bug_when>2010-05-15 20:46:53 -0700</bug_when>
    <thetext>Comment on attachment 56173
Patch with unit tests

LGTM.  Thanks for the changes.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>226408</commentid>
    <comment_count>9</comment_count>
      <attachid>56173</attachid>
    <who name="Daniel Bates">dbates</who>
    <bug_when>2010-05-15 20:50:26 -0700</bug_when>
    <thetext>Comment on attachment 56173
Patch with unit tests

Clearing flags on attachment: 56173

Committed r59566: &lt;http://trac.webkit.org/changeset/59566&gt;</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>226409</commentid>
    <comment_count>10</comment_count>
    <who name="Daniel Bates">dbates</who>
    <bug_when>2010-05-15 20:50:35 -0700</bug_when>
    <thetext>All reviewed patches have been landed.  Closing bug.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>226518</commentid>
    <comment_count>11</comment_count>
    <who name="Chris Jerdonek">cjerdonek</who>
    <bug_when>2010-05-16 12:29:08 -0700</bug_when>
    <thetext>FYI, I just discovered that prepare-ChangeLog has some code to parse property changes from an SVN diff.  It would be worth studying that to see what code can be shared, etc:

http://trac.webkit.org/browser/trunk/WebKitTools/Scripts/prepare-ChangeLog?rev=58327#L1342</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>226552</commentid>
    <comment_count>12</comment_count>
    <who name="Daniel Bates">dbates</who>
    <bug_when>2010-05-16 15:10:52 -0700</bug_when>
    <thetext>(In reply to comment #11)
&gt; FYI, I just discovered that prepare-ChangeLog has some code to parse property changes from an SVN diff.  It would be worth studying that to see what code can be shared, etc:
&gt; 
&gt; http://trac.webkit.org/browser/trunk/WebKitTools/Scripts/prepare-ChangeLog?rev=58327#L1342

Notice, this code is used to determine the names of the properties that have been added, deleted, or modified on a file. But, it doesn&apos;t parse a change for its value (*), which is necessary to apply or unapply the change using svn-apply and svn-unapply, respectively.

(*) Disregarding the &quot;Name&quot; and &quot;Modified&quot; type properties, this code would work to determine the value of the svn:executable bit since the svn:executable property has no defined value as per &lt;http://svnbook.red-bean.com/en/1.5/svn.advanced.props.file-portability.html#svn.advanced.props.special.executable&gt;. Hence, we can infer whether it was added or removed from its property type. Clearly, this code cannot detect the value of the svn:executable property for SVN version &lt; 1.5. Notice, Leopard 10.5.8 ships with SVN 1.4.4.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>226558</commentid>
    <comment_count>13</comment_count>
    <who name="Chris Jerdonek">cjerdonek</who>
    <bug_when>2010-05-16 15:36:17 -0700</bug_when>
    <thetext>(In reply to comment #12)
&gt; Notice, this code is used to determine the names of the properties that have been added, deleted, or modified on a file. But, it doesn&apos;t parse a change for its value (*), which is necessary to apply or unapply the change using svn-apply and svn-unapply, respectively.

Would it make sense for prepare-ChangeLog to use the new code that you&apos;re writing?  Maybe you can add a FIXME to prepare-ChangeLog.</thetext>
  </long_desc>
      
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>56171</attachid>
            <date>2010-05-15 19:07:00 -0700</date>
            <delta_ts>2010-05-15 20:21:02 -0700</delta_ts>
            <desc>Patch with unit tests</desc>
            <filename>Bug39170.patch</filename>
            <type>text/plain</type>
            <size>7156</size>
            <attacher name="Daniel Bates">dbates</attacher>
            
              <data encoding="base64">SW5kZXg6IFdlYktpdFRvb2xzL0NoYW5nZUxvZwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJLaXRUb29scy9D
aGFuZ2VMb2cJKHJldmlzaW9uIDU5NTU4KQorKysgV2ViS2l0VG9vbHMvQ2hhbmdlTG9nCSh3b3Jr
aW5nIGNvcHkpCkBAIC0xLDMgKzEsMTcgQEAKKzIwMTAtMDUtMTUgIERhbmllbCBCYXRlcyAgPGRi
YXRlc0ByaW0uY29tPgorCisgICAgICAgIFJldmlld2VkIGJ5IE5PQk9EWSAoT09QUyEpLgorCisg
ICAgICAgIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0zOTE3MAorCisg
ICAgICAgIEFkZCBmdW5jdGlvbiBwYXJzZVN2blByb3BlcnR5UGx1c09yTWludXMgdG8gcGFyc2Ug
c2luZ2xlLWxpbmUgYW5kIG11bHRpLWxpbmUKKyAgICAgICAgcHJvcGVydHkgdmFsdWVzLgorCisg
ICAgICAgICogU2NyaXB0cy9WQ1NVdGlscy5wbToKKyAgICAgICAgICAgIEFkZGVkIGZ1bmN0aW9u
IHBhcnNlU3ZuUHJvcGVydHlQbHVzT3JNaW51cy4gV2Ugd2lsbCB1c2UgdGhpcyBhcyBwYXJ0IG9m
CisgICAgICAgICAgICBCdWcgIzM4ODg1LgorICAgICAgICAqIFNjcmlwdHMvd2Via2l0cGVybC9W
Q1NVdGlsc191bml0dGVzdC9wYXJzZVN2blByb3BlcnR5UGx1c09yTWludXMucGw6IEFkZGVkLgor
CiAyMDEwLTA1LTE1ICBKb2NoZW4gRWlzaW5nZXIgIDxqb2NoZW5AY2hyb21pdW0ub3JnPgogCiAg
ICAgICAgIFJldmlld2VkIGJ5IERtaXRyeSBUaXRvdi4KSW5kZXg6IFdlYktpdFRvb2xzL1Njcmlw
dHMvVkNTVXRpbHMucG0KPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViS2l0VG9vbHMvU2NyaXB0cy9WQ1NVdGls
cy5wbQkocmV2aXNpb24gNTk1NTgpCisrKyBXZWJLaXRUb29scy9TY3JpcHRzL1ZDU1V0aWxzLnBt
CSh3b3JraW5nIGNvcHkpCkBAIC05MCw2ICs5MCw4IEBAIG15ICRjaGFuZ2VMb2dUaW1lWm9uZSA9
ICJQU1Q4UERUIjsKIAogbXkgJGdpdERpZmZTdGFydFJlZ0V4ID0gcXIjXmRpZmYgLS1naXQgKFx3
Lyk/KC4rKSAoXHcvKT8oW15cclxuXSspIzsKIG15ICRzdm5EaWZmU3RhcnRSZWdFeCA9IHFyI15J
bmRleDogKFteXHJcbl0rKSM7CitteSAkc3ZuUHJvcGVydHlDaGFuZ2VTdGFydFJlZ0V4ID0gcXIj
XihNb2RpZmllZHxOYW1lfEFkZGVkfERlbGV0ZWQpOiAoW15cclxuXSspIzsgIyAkMSBpcyB0aGUg
bmFtZSBvZiB0aGUgcHJvcGVydHkKK215ICRzdm5Qcm9wZXJ0eVZhbHVlUmVnRXggPSBxciNeICAg
KFwrfC0pIChbXlxyXG5dKykjOyAjICQyIGlzIHRoZSBzdGFydCBvZiB0aGUgcHJvcGVydHkncyB2
YWx1ZSAod2hpY2ggbWF5IHNwYW4gbXVsdGlwbGUgbGluZXMpLgogCiAjIFRoaXMgbWV0aG9kIGlz
IGZvciBwb3J0YWJpbGl0eS4gUmV0dXJuIHRoZSBzeXN0ZW0tYXBwcm9wcmlhdGUgZXhpdAogIyBz
dGF0dXMgb2YgYSBjaGlsZCBwcm9jZXNzLgpAQCAtODM2LDYgKzgzOCw0OCBAQCBzdWIgcGFyc2VE
aWZmKCQkKQogICAgIHJldHVybiAoXEBkaWZmSGFzaFJlZnMsICRsaW5lKTsKIH0KIAorIyBQYXJz
ZSB0aGUgcHJvcGVydHkgdmFsdWUgb2YgYW4gU1ZOIHByb3BlcnR5IGZyb20gdGhlIGdpdmVuIGZp
bGUgaGFuZGxlLCBhbmQgYWR2YW5jZQorIyB0aGUgaGFuZGxlIHNvIHRoZSBsYXN0IGxpbmUgcmVh
ZCBpcyB0aGUgZmlyc3QgbGluZSBhZnRlciB0aGUgcHJvcGVydHkgdmFsdWUuCisjCisjIFRoaXMg
c3Vicm91dGluZSBkaWVzIGlmIHRoZSBmaXJzdCBsaW5lIGlzIG5vdCBhIHZhbGlkIFNWTiBwcm9w
ZXJ0eSB2YWx1ZSBsaW5lCisjIChpLmUuIGEgbGluZSB0aGF0IGJlZ2lucyB3aXRoICIgICArIiBv
ciAiICAgLSIpLgorIworIyBBcmdzOgorIyAgICRmaWxlSGFuZGxlOiBhZHZhbmNlZCBzbyB0aGUg
bGFzdCBsaW5lIHJlYWQgZnJvbSB0aGUgaGFuZGxlIGlzIHRoZSBmaXJzdAorIyAgICAgICAgICAg
ICAgICBsaW5lIG9mIHRoZSBwcm9wZXJ0eSB2YWx1ZSB0byBwYXJzZS4gIFRoaXMgc2hvdWxkIGJl
IGEgbGluZQorIyAgICAgICAgICAgICAgICBiZWdpbm5pbmcgd2l0aCAiICAgKyIgb3IgIiAgIC0i
LgorIyAgICRsaW5lOiB0aGUgbGluZSBsYXN0IHJlYWQgZnJvbSAkZmlsZUhhbmRsZQorIworIyBS
ZXR1cm5zICgkcHJvcGVydHlWYWx1ZSwgJGxhc3RSZWFkTGluZSk6CisjICAgJHByb3BlcnR5VmFs
dWU6IHRoZSB2YWx1ZSBvZiB0aGUgcHJvcGVydHkuCisjICAgJGxhc3RSZWFkTGluZTogdGhlIGxp
bmUgbGFzdCByZWFkIGZyb20gJGZpbGVIYW5kbGUuCisjCisjIEZJWE1FOiBUaGlzIG1ldGhvZCBp
cyB1bnVzZWQgYXMgb2YgKDA1LzE1LzIwMTApLiBXZSB3aWxsIGNhbGwgdGhpcyBmdW5jdGlvbgor
IyAgICAgICAgYXMgcGFydCBvZiBwYXJzaW5nIGEgcHJvcGVydHkgZnJvbSB0aGUgU1ZOIGZvb3Rl
ci4gU2VlIEJ1ZyAjMzg4ODUuCitzdWIgcGFyc2VTdm5Qcm9wZXJ0eVBsdXNPck1pbnVzKCQkKQor
eworICAgIG15ICgkZmlsZUhhbmRsZSwgJGxpbmUpID0gQF87CisKKyAgICAkXyA9ICRsaW5lOwor
CisgICAgbXkgJHByb3BlcnR5VmFsdWU7CisgICAgaWYgKC8kc3ZuUHJvcGVydHlWYWx1ZVJlZ0V4
LykgeworICAgICAgICAkcHJvcGVydHlWYWx1ZSA9ICQyOyAjIERvZXMgbm90IGluY2x1ZGUgdGhl
IGVuZC1vZi1saW5lIGNoYXJhY3RlcihzKQorICAgIH0gZWxzZSB7CisgICAgICAgIGRpZSgiRmFp
bGVkIHRvIGZpbmQgJysnIG9yICctJyBwcm9wZXJ0eTogXCIkX1wiLiIpOworICAgIH0KKworICAg
ICRfID0gPCRmaWxlSGFuZGxlPjsKKyAgICAkcHJvcGVydHlWYWx1ZSAuPSAkUE9TVE1BVENIIGlm
IGRlZmluZWQoJF8pOyAjIFByZXNlcnZlIHRoZSBlbmQtb2YtbGluZSBvZiB0aGUgZmlyc3QgbGlu
ZSBpbiBhIG11bHRpLWxpbmUgcHJvcGVydHkgdmFsdWUuCisgICAgd2hpbGUgKGRlZmluZWQoJF8p
KSB7CisgICAgICAgIGxhc3QgaWYgKC9eW1xyXG5dKlx6LyB8fCAvJHN2blByb3BlcnR5Q2hhbmdl
U3RhcnRSZWdFeC8pOyAjIExhc3QgaWYgZWl0aGVyIHdlIGhpdCBhbiBlbXB0eSBsaW5lIG9yIHRo
ZSBzdGFydCBvZiB0aGUgbmV4dCBwcm9wZXJ0eS4KKyAgICAgICAgJHByb3BlcnR5VmFsdWUgLj0g
JF87CisgICAgICAgICRfID0gPCRmaWxlSGFuZGxlPjsgIyBOb3QgZGVmaW5lZCBpZiBlbmQtb2Yt
ZmlsZSByZWFjaGVkLgorICAgIH0KKworICAgIHJldHVybiAoJHByb3BlcnR5VmFsdWUsICRfKTsK
K30KKwogIyBQYXJzZSBhIHBhdGNoIGZpbGUgY3JlYXRlZCBieSBzdm4tY3JlYXRlLXBhdGNoLgog
IwogIyBBcmdzOgpJbmRleDogV2ViS2l0VG9vbHMvU2NyaXB0cy93ZWJraXRwZXJsL1ZDU1V0aWxz
X3VuaXR0ZXN0L3BhcnNlU3ZuUHJvcGVydHlQbHVzT3JNaW51cy5wbAo9PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBX
ZWJLaXRUb29scy9TY3JpcHRzL3dlYmtpdHBlcmwvVkNTVXRpbHNfdW5pdHRlc3QvcGFyc2VTdm5Q
cm9wZXJ0eVBsdXNPck1pbnVzLnBsCShyZXZpc2lvbiAwKQorKysgV2ViS2l0VG9vbHMvU2NyaXB0
cy93ZWJraXRwZXJsL1ZDU1V0aWxzX3VuaXR0ZXN0L3BhcnNlU3ZuUHJvcGVydHlQbHVzT3JNaW51
cy5wbAkocmV2aXNpb24gMCkKQEAgLTAsMCArMSwxMDIgQEAKKyMhL3Vzci9iaW4vcGVybCAtdwor
IworIyBDb3B5cmlnaHQgKEMpIFJlc2VhcmNoIGluIE1vdGlvbiBMaW1pdGVkIDIwMTAuIEFsbCBS
aWdodHMgUmVzZXJ2ZWQuCisjIENvcHlyaWdodCAoQykgMjAxMCBDaHJpcyBKZXJkb25layAoY2hy
aXMuamVyZG9uZWtAZ21haWwuY29tKQorIworIyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNv
dXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyMgbW9kaWZpY2F0aW9uLCBh
cmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQor
IyBtZXQ6CisjCisjICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJl
dGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisjIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlv
bnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyMgICAgICogUmVkaXN0cmlidXRpb25z
IGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorIyBjb3B5cmlnaHQgbm90
aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVy
CisjIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQg
d2l0aCB0aGUKKyMgZGlzdHJpYnV0aW9uLgorIyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEFw
cGxlIENvbXB1dGVyLCBJbmMuICgiQXBwbGUiKSBub3IgdGhlIG5hbWVzIG9mCisjIGl0cyBjb250
cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2
ZWQKKyMgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBw
ZXJtaXNzaW9uLgorIworIyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklH
SFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisjICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9S
IElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisjIExJTUlURUQgVE8sIFRI
RSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgor
IyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwg
VEhFIENPUFlSSUdIVAorIyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkg
RElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyMgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBD
T05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorIyBMSU1JVEVEIFRPLCBQ
Uk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwK
KyMgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENB
VVNFRCBBTkQgT04gQU5ZCisjIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJB
Q1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyMgKElOQ0xVRElORyBORUdMSUdFTkNFIE9S
IE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisjIE9GIFRISVMg
U09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1B
R0UuCisKKyMgVW5pdCB0ZXN0cyBvZiBwYXJzZVN2blByb3BlcnR5UGx1c09yTWludXMoKS4KKwor
dXNlIHN0cmljdDsKK3VzZSB3YXJuaW5nczsKKwordXNlIFRlc3Q6Ok1vcmU7Cit1c2UgVkNTVXRp
bHM7CisKKyMgVGhlIGFycmF5IG9mIHRlc3QgY2FzZXMuCitteSBAdGVzdENhc2VIYXNoUmVmcyA9
ICgKK3sKKyAgICAjIE5ldyB0ZXN0CisgICAgZGlmZk5hbWUgPT4gInNpbmdlLWxpbmUgJysnIGNo
YW5nZSIsCisgICAgaW5wdXRUZXh0ID0+IDw8J0VORCcsCisgICArICoKK0VORAorICAgIGV4cGVj
dGVkUmV0dXJuID0+IFsiKiIsIHVuZGVmXSwKKyAgICBleHBlY3RlZE5leHRMaW5lID0+IHVuZGVm
LAorfSwKK3sKKyAgICAjIE5ldyB0ZXN0CisgICAgZGlmZk5hbWUgPT4gInNpbmdsZS1saW5lICct
JyBjaGFuZ2UiLAorICAgIGlucHV0VGV4dCA9PiA8PCdFTkQnLAorICAgLSAqCitFTkQKKyAgICBl
eHBlY3RlZFJldHVybiA9PiBbIioiLCB1bmRlZl0sCisgICAgZXhwZWN0ZWROZXh0TGluZSA9PiB1
bmRlZiwKK30sCit7CisgICAgIyBOZXcgdGVzdAorICAgIGRpZmZOYW1lID0+ICJzaW1wbGUgbXVs
dGktbGluZSAnLScgY2hhbmdlIiwKKyAgICBpbnB1dFRleHQgPT4gPDwnRU5EJywKKyAgIC0gKgor
CitFTkQKKyAgICBleHBlY3RlZFJldHVybiA9PiBbIipcbiIsICJcbiJdLAorICAgIGV4cGVjdGVk
TmV4dExpbmUgPT4gdW5kZWYsCit9LAoreworICAgICMgTmV3IHRlc3QKKyAgICBkaWZmTmFtZSA9
PiAibXVsdGktbGluZSAnKycgY2hhbmdlIGFuZCBzdGFydCBvZiBiaW5hcnkgcGF0Y2giLAorICAg
IGlucHV0VGV4dCA9PiA8PCdFTkQnLAorICAgKyBBCitsb25nIHNlbnRlbmNlIHRoYXQgc3BhbnMK
K211bHRpcGxlIGxpbmVzLgorCitRMWRUQngwQUFBQjQyaXRnNEdsZ1lKakd3TUREeU9ETXhNRHcz
NEdCZ1FFQUpQUURKQT09CitFTkQKKyAgICBleHBlY3RlZFJldHVybiA9PiBbIkFcbmxvbmcgc2Vu
dGVuY2UgdGhhdCBzcGFuc1xubXVsdGlwbGUgbGluZXMuXG4iLCAiXG4iXSwKKyAgICBleHBlY3Rl
ZE5leHRMaW5lID0+ICJRMWRUQngwQUFBQjQyaXRnNEdsZ1lKakd3TUREeU9ETXhNRHczNEdCZ1FF
QUpQUURKQT09XG4iLAorfSwKKyk7CisKK215ICR0ZXN0Q2FzZXNDb3VudCA9IEB0ZXN0Q2FzZUhh
c2hSZWZzOworcGxhbih0ZXN0cyA9PiAyICogJHRlc3RDYXNlc0NvdW50KTsgIyBUb3RhbCBudW1i
ZXIgb2YgYXNzZXJ0aW9ucy4KKworZm9yZWFjaCBteSAkdGVzdENhc2UgKEB0ZXN0Q2FzZUhhc2hS
ZWZzKSB7CisgICAgbXkgJHRlc3ROYW1lU3RhcnQgPSAicGFyc2VTdm5Qcm9wZXJ0eVBsdXNPck1p
bnVzKCk6ICR0ZXN0Q2FzZS0+e2RpZmZOYW1lfTogY29tcGFyaW5nIjsKKworICAgIG15ICRmaWxl
SGFuZGxlOworICAgIG9wZW4oJGZpbGVIYW5kbGUsICI8IiwgXCR0ZXN0Q2FzZS0+e2lucHV0VGV4
dH0pOworICAgIG15ICRsaW5lID0gPCRmaWxlSGFuZGxlPjsKKworICAgIG15IEBnb3QgPSBWQ1NV
dGlsczo6cGFyc2VTdm5Qcm9wZXJ0eVBsdXNPck1pbnVzKCRmaWxlSGFuZGxlLCAkbGluZSk7Cisg
ICAgbXkgJGV4cGVjdGVkUmV0dXJuID0gJHRlc3RDYXNlLT57ZXhwZWN0ZWRSZXR1cm59OworCisg
ICAgaXNfZGVlcGx5KFxAZ290LCAkZXhwZWN0ZWRSZXR1cm4sICIkdGVzdE5hbWVTdGFydCByZXR1
cm4gdmFsdWUuIik7CisKKyAgICBteSAkZ290TmV4dExpbmUgPSA8JGZpbGVIYW5kbGU+OworICAg
IGlzKCRnb3ROZXh0TGluZSwgJHRlc3RDYXNlLT57ZXhwZWN0ZWROZXh0TGluZX0sICAiJHRlc3RO
YW1lU3RhcnQgbmV4dCByZWFkIGxpbmUuIik7Cit9Cg==
</data>
<flag name="review"
          id="40559"
          type_id="1"
          status="-"
          setter="cjerdonek"
    />
          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>56172</attachid>
            <date>2010-05-15 20:21:02 -0700</date>
            <delta_ts>2010-05-15 20:44:08 -0700</delta_ts>
            <desc>Patch with unit tests</desc>
            <filename>Bug39170_1.patch</filename>
            <type>text/plain</type>
            <size>7370</size>
            <attacher name="Daniel Bates">dbates</attacher>
            
              <data encoding="base64">SW5kZXg6IFdlYktpdFRvb2xzL0NoYW5nZUxvZwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJLaXRUb29scy9D
aGFuZ2VMb2cJKHJldmlzaW9uIDU5NTU4KQorKysgV2ViS2l0VG9vbHMvQ2hhbmdlTG9nCSh3b3Jr
aW5nIGNvcHkpCkBAIC0xLDMgKzEsMTcgQEAKKzIwMTAtMDUtMTUgIERhbmllbCBCYXRlcyAgPGRi
YXRlc0ByaW0uY29tPgorCisgICAgICAgIFJldmlld2VkIGJ5IE5PQk9EWSAoT09QUyEpLgorCisg
ICAgICAgIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0zOTE3MAorCisg
ICAgICAgIEFkZCBmdW5jdGlvbiBwYXJzZVN2blByb3BlcnR5VmFsdWUgdG8gcGFyc2Ugc2luZ2xl
LWxpbmUgYW5kIG11bHRpLWxpbmUKKyAgICAgICAgcHJvcGVydHkgdmFsdWVzIG9mIGFuIFNWTiBw
cm9wZXJ0eSBjaGFuZ2UuCisKKyAgICAgICAgKiBTY3JpcHRzL1ZDU1V0aWxzLnBtOgorICAgICAg
ICAgICAgQWRkZWQgZnVuY3Rpb24gcGFyc2VTdm5Qcm9wZXJ0eVZhbHVlLiBXZSB3aWxsIHVzZSB0
aGlzIGFzIHBhcnQgb2YKKyAgICAgICAgICAgIEJ1ZyAjMzg4ODUgPGh0dHBzOi8vYnVncy53ZWJr
aXQub3JnL3Nob3dfYnVnLmNnaT9pZD0zODg4NT4uCisgICAgICAgICogU2NyaXB0cy93ZWJraXRw
ZXJsL1ZDU1V0aWxzX3VuaXR0ZXN0L3BhcnNlU3ZuUHJvcGVydHlWYWx1ZS5wbDogQWRkZWQuCisK
IDIwMTAtMDUtMTUgIEpvY2hlbiBFaXNpbmdlciAgPGpvY2hlbkBjaHJvbWl1bS5vcmc+CiAKICAg
ICAgICAgUmV2aWV3ZWQgYnkgRG1pdHJ5IFRpdG92LgpJbmRleDogV2ViS2l0VG9vbHMvU2NyaXB0
cy9WQ1NVdGlscy5wbQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJLaXRUb29scy9TY3JpcHRzL1ZDU1V0aWxz
LnBtCShyZXZpc2lvbiA1OTU1OCkKKysrIFdlYktpdFRvb2xzL1NjcmlwdHMvVkNTVXRpbHMucG0J
KHdvcmtpbmcgY29weSkKQEAgLTkwLDYgKzkwLDggQEAgbXkgJGNoYW5nZUxvZ1RpbWVab25lID0g
IlBTVDhQRFQiOwogCiBteSAkZ2l0RGlmZlN0YXJ0UmVnRXggPSBxciNeZGlmZiAtLWdpdCAoXHcv
KT8oLispIChcdy8pPyhbXlxyXG5dKykjOwogbXkgJHN2bkRpZmZTdGFydFJlZ0V4ID0gcXIjXklu
ZGV4OiAoW15cclxuXSspIzsKK215ICRzdm5Qcm9wZXJ0eUNoYW5nZVN0YXJ0UmVnRXggPSBxciNe
KE1vZGlmaWVkfE5hbWV8QWRkZWR8RGVsZXRlZCk6IChbXlxyXG5dKykjOyAjICQxIGlzIHRoZSBu
YW1lIG9mIHRoZSBwcm9wZXJ0eQorbXkgJHN2blByb3BlcnR5VmFsdWVTdGFydFJlZ0V4ID0gcXIj
XiAgIChcK3wtKSAoW15cclxuXSspIzsgIyAkMiBpcyB0aGUgc3RhcnQgb2YgdGhlIHByb3BlcnR5
J3MgdmFsdWUgKHdoaWNoIG1heSBzcGFuIG11bHRpcGxlIGxpbmVzKS4KIAogIyBUaGlzIG1ldGhv
ZCBpcyBmb3IgcG9ydGFiaWxpdHkuIFJldHVybiB0aGUgc3lzdGVtLWFwcHJvcHJpYXRlIGV4aXQK
ICMgc3RhdHVzIG9mIGEgY2hpbGQgcHJvY2Vzcy4KQEAgLTgzNiw2ICs4MzgsNTUgQEAgc3ViIHBh
cnNlRGlmZigkJCkKICAgICByZXR1cm4gKFxAZGlmZkhhc2hSZWZzLCAkbGluZSk7CiB9CiAKKyMg
UGFyc2UgdGhlIHZhbHVlIG9mIGFuIFNWTiBwcm9wZXJ0eSBmcm9tIHRoZSBnaXZlbiBmaWxlIGhh
bmRsZS4KKyMKKyMgVGhpcyBzdWJyb3V0aW5lIGRpZXMgaWYgdGhlIGZpcnN0IGxpbmUgaXMgYW4g
aW52YWxpZCBTVk4gcHJvcGVydHkgdmFsdWUgbGluZQorIyAoaS5lLiBhIGxpbmUgdGhhdCBkb2Vz
IG5vdCBiZWdpbiB3aXRoICIgICArIiBvciAiICAgLSIpLgorIworIyBBcmdzOgorIyAgICRmaWxl
SGFuZGxlOiBhZHZhbmNlZCBzbyB0aGUgbGFzdCBsaW5lIHJlYWQgZnJvbSB0aGUgaGFuZGxlIGlz
IHRoZSBmaXJzdAorIyAgICAgICAgICAgICAgICBsaW5lIG9mIHRoZSBwcm9wZXJ0eSB2YWx1ZSB0
byBwYXJzZS4gIFRoaXMgc2hvdWxkIGJlIGEgbGluZQorIyAgICAgICAgICAgICAgICBiZWdpbm5p
bmcgd2l0aCAiICAgKyIgb3IgIiAgIC0iLgorIyAgICRsaW5lOiB0aGUgbGluZSBsYXN0IHJlYWQg
ZnJvbSAkZmlsZUhhbmRsZQorIworIyBSZXR1cm5zICgkcHJvcGVydHlWYWx1ZSwgJGxhc3RSZWFk
TGluZSk6CisjICAgJHByb3BlcnR5VmFsdWU6IHRoZSB2YWx1ZSBvZiB0aGUgcHJvcGVydHkuCisj
ICAgJGxhc3RSZWFkTGluZTogdGhlIGxpbmUgbGFzdCByZWFkIGZyb20gJGZpbGVIYW5kbGUuCisj
CisjIEZJWE1FOiBUaGlzIG1ldGhvZCBpcyB1bnVzZWQgYXMgb2YgKDA1LzE1LzIwMTApLiBXZSB3
aWxsIGNhbGwgdGhpcyBmdW5jdGlvbgorIyAgICAgICAgYXMgcGFydCBvZiBwYXJzaW5nIGEgcHJv
cGVydHkgZnJvbSB0aGUgU1ZOIGZvb3Rlci4gU2VlIDxodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9z
aG93X2J1Zy5jZ2k/aWQ9Mzg4ODU+Lgorc3ViIHBhcnNlU3ZuUHJvcGVydHlWYWx1ZSgkJCkKK3sK
KyAgICBteSAoJGZpbGVIYW5kbGUsICRsaW5lKSA9IEBfOworCisgICAgJF8gPSAkbGluZTsKKwor
ICAgIG15ICRwcm9wZXJ0eVZhbHVlOworICAgIG15ICRlb2w7CisgICAgaWYgKC8kc3ZuUHJvcGVy
dHlWYWx1ZVN0YXJ0UmVnRXgvKSB7CisgICAgICAgICRwcm9wZXJ0eVZhbHVlID0gJDI7ICMgRG9l
cyBub3QgaW5jbHVkZSB0aGUgZW5kLW9mLWxpbmUgY2hhcmFjdGVyKHMpLgorICAgICAgICAkZW9s
ID0gJFBPU1RNQVRDSDsKKyAgICB9IGVsc2UgeworICAgICAgICBkaWUoIkZhaWxlZCB0byBmaW5k
IHByb3BlcnR5IHZhbHVlIGJlZ2lubmluZyB3aXRoICcrJyBvciAnLSc6IFwiJF9cIi4iKTsKKyAg
ICB9CisKKyAgICB3aGlsZSAoPCRmaWxlSGFuZGxlPikgeworICAgICAgICBpZiAoL14kLyB8fCAv
JHN2blByb3BlcnR5Q2hhbmdlU3RhcnRSZWdFeC8pIHsKKyAgICAgICAgICAgICMgTm90ZSwgd2Ug
bWF5IGVuY291bnRlciBhbiBlbXB0eSBsaW5lIGJlZm9yZSB0aGUgY29udGVudHMgb2YgYSBiaW5h
cnkgcGF0Y2ggb3IKKyAgICAgICAgICAgICMgYmVmb3JlIHRoZSAnKycgcHJvcGVydHkgdmFsdWUg
b2YgYSAiTW9kaWZpZWQiIG9yICJOYW1lIiBwcm9wZXJ0eS4KKyAgICAgICAgICAgIGxhc3Q7Cisg
ICAgICAgIH0KKyAgICAgICAgIyBUZW1wb3JhcmlseSBzdHJpcCBvZmYgYW55IGVuZC1vZi1saW5l
IGNoYXJhY3RlcnMuIFdlIGFkZCB0aGUgZW5kLW9mLWxpbmUgY2hhcmFjdGVycworICAgICAgICAj
IGZyb20gdGhlIHByZXZpb3VzbHkgcHJvY2Vzc2VkIGxpbmUgdG8gdGhlIHN0YXJ0IG9mIHRoaXMg
bGluZSBzbyB0aGF0IHRoZSBsYXN0IGxpbmUKKyAgICAgICAgIyBvZiB0aGUgcHJvcGVydHkgdmFs
dWUgZG9lcyBub3QgZW5kIGluIGVuZC1vZi1saW5lIGNoYXJhY3RlcnMuCisgICAgICAgIHMvKFtc
blxyXSspJC8vOworICAgICAgICAkcHJvcGVydHlWYWx1ZSAuPSAiJGVvbCRfIjsKKyAgICAgICAg
JGVvbCA9ICQxOworICAgIH0KKworICAgIHJldHVybiAoJHByb3BlcnR5VmFsdWUsICRfKTsKK30K
KwogIyBQYXJzZSBhIHBhdGNoIGZpbGUgY3JlYXRlZCBieSBzdm4tY3JlYXRlLXBhdGNoLgogIwog
IyBBcmdzOgpJbmRleDogV2ViS2l0VG9vbHMvU2NyaXB0cy93ZWJraXRwZXJsL1ZDU1V0aWxzX3Vu
aXR0ZXN0L3BhcnNlU3ZuUHJvcGVydHlWYWx1ZS5wbAo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJLaXRUb29s
cy9TY3JpcHRzL3dlYmtpdHBlcmwvVkNTVXRpbHNfdW5pdHRlc3QvcGFyc2VTdm5Qcm9wZXJ0eVZh
bHVlLnBsCShyZXZpc2lvbiAwKQorKysgV2ViS2l0VG9vbHMvU2NyaXB0cy93ZWJraXRwZXJsL1ZD
U1V0aWxzX3VuaXR0ZXN0L3BhcnNlU3ZuUHJvcGVydHlWYWx1ZS5wbAkocmV2aXNpb24gMCkKQEAg
LTAsMCArMSwxMDEgQEAKKyMhL3Vzci9iaW4vcGVybCAtdworIworIyBDb3B5cmlnaHQgKEMpIFJl
c2VhcmNoIGluIE1vdGlvbiBMaW1pdGVkIDIwMTAuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisjIENv
cHlyaWdodCAoQykgMjAxMCBDaHJpcyBKZXJkb25layAoY2hyaXMuamVyZG9uZWtAZ21haWwuY29t
KQorIworIyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1z
LCB3aXRoIG9yIHdpdGhvdXQKKyMgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVk
IHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorIyBtZXQ6CisjCisjICAgICAqIFJl
ZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJp
Z2h0CisjIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcg
ZGlzY2xhaW1lci4KKyMgICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3Qg
cmVwcm9kdWNlIHRoZSBhYm92ZQorIyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29u
ZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisjIGluIHRoZSBkb2N1bWVudGF0
aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyMgZGlzdHJpYnV0
aW9uLgorIyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEFwcGxlIENvbXB1dGVyLCBJbmMuICgi
QXBwbGUiKSBub3IgdGhlIG5hbWVzIG9mCisjIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQg
dG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyMgZnJvbSB0aGlzIHNvZnR3
YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorIworIyBUSElT
IFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJ
QlVUT1JTCisjICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywg
SU5DTFVESU5HLCBCVVQgTk9UCisjIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMg
T0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorIyBBIFBBUlRJQ1VMQVIgUFVSUE9T
RSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorIyBPV05F
UiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5D
SURFTlRBTCwKKyMgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMg
KElOQ0xVRElORywgQlVUIE5PVAorIyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElU
VVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyMgREFUQSwgT1IgUFJPRklUUzsg
T1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisjIFRI
RU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFks
IE9SIFRPUlQKKyMgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJ
TiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisjIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURW
SVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyMgVW5pdCB0ZXN0cyBv
ZiBwYXJzZVN2blByb3BlcnR5VmFsdWUoKS4KKwordXNlIHN0cmljdDsKK3VzZSB3YXJuaW5nczsK
KwordXNlIFRlc3Q6Ok1vcmU7Cit1c2UgVkNTVXRpbHM7CisKK215IEB0ZXN0Q2FzZUhhc2hSZWZz
ID0gKAoreworICAgICMgTmV3IHRlc3QKKyAgICBkaWZmTmFtZSA9PiAic2luZ2UtbGluZSAnKycg
Y2hhbmdlIiwKKyAgICBpbnB1dFRleHQgPT4gPDwnRU5EJywKKyAgICsgKgorRU5ECisgICAgZXhw
ZWN0ZWRSZXR1cm4gPT4gWyIqIiwgdW5kZWZdLAorICAgIGV4cGVjdGVkTmV4dExpbmUgPT4gdW5k
ZWYsCit9LAoreworICAgICMgTmV3IHRlc3QKKyAgICBkaWZmTmFtZSA9PiAic2luZ2xlLWxpbmUg
Jy0nIGNoYW5nZSIsCisgICAgaW5wdXRUZXh0ID0+IDw8J0VORCcsCisgICAtICoKK0VORAorICAg
IGV4cGVjdGVkUmV0dXJuID0+IFsiKiIsIHVuZGVmXSwKKyAgICBleHBlY3RlZE5leHRMaW5lID0+
IHVuZGVmLAorfSwKK3sKKyAgICAjIE5ldyB0ZXN0CisgICAgZGlmZk5hbWUgPT4gInNpbXBsZSBt
dWx0aS1saW5lICctJyBjaGFuZ2UiLAorICAgIGlucHV0VGV4dCA9PiA8PCdFTkQnLAorICAgLSAq
CisKK0VORAorICAgIGV4cGVjdGVkUmV0dXJuID0+IFsiKiIsICJcbiJdLAorICAgIGV4cGVjdGVk
TmV4dExpbmUgPT4gdW5kZWYsCit9LAoreworICAgICMgTmV3IHRlc3QKKyAgICBkaWZmTmFtZSA9
PiAibXVsdGktbGluZSAnKycgY2hhbmdlIGFuZCBzdGFydCBvZiBiaW5hcnkgcGF0Y2giLAorICAg
IGlucHV0VGV4dCA9PiA8PCdFTkQnLAorICAgKyBBCitsb25nIHNlbnRlbmNlIHRoYXQgc3BhbnMK
K211bHRpcGxlIGxpbmVzLgorCitRMWRUQngwQUFBQjQyaXRnNEdsZ1lKakd3TUREeU9ETXhNRHcz
NEdCZ1FFQUpQUURKQT09CitFTkQKKyAgICBleHBlY3RlZFJldHVybiA9PiBbIkFcbmxvbmcgc2Vu
dGVuY2UgdGhhdCBzcGFuc1xubXVsdGlwbGUgbGluZXMuIiwgIlxuIl0sCisgICAgZXhwZWN0ZWRO
ZXh0TGluZSA9PiAiUTFkVEJ4MEFBQUI0Mml0ZzRHbGdZSmpHd01ERHlPRE14TUR3MzRHQmdRRUFK
UFFESkE9PVxuIiwKK30sCispOworCitteSAkdGVzdENhc2VzQ291bnQgPSBAdGVzdENhc2VIYXNo
UmVmczsKK3BsYW4odGVzdHMgPT4gMiAqICR0ZXN0Q2FzZXNDb3VudCk7ICMgVG90YWwgbnVtYmVy
IG9mIGFzc2VydGlvbnMuCisKK2ZvcmVhY2ggbXkgJHRlc3RDYXNlIChAdGVzdENhc2VIYXNoUmVm
cykgeworICAgIG15ICR0ZXN0TmFtZVN0YXJ0ID0gInBhcnNlU3ZuUHJvcGVydHlWYWx1ZSgpOiAk
dGVzdENhc2UtPntkaWZmTmFtZX06IGNvbXBhcmluZyI7CisKKyAgICBteSAkZmlsZUhhbmRsZTsK
KyAgICBvcGVuKCRmaWxlSGFuZGxlLCAiPCIsIFwkdGVzdENhc2UtPntpbnB1dFRleHR9KTsKKyAg
ICBteSAkbGluZSA9IDwkZmlsZUhhbmRsZT47CisKKyAgICBteSBAZ290ID0gVkNTVXRpbHM6OnBh
cnNlU3ZuUHJvcGVydHlWYWx1ZSgkZmlsZUhhbmRsZSwgJGxpbmUpOworICAgIG15ICRleHBlY3Rl
ZFJldHVybiA9ICR0ZXN0Q2FzZS0+e2V4cGVjdGVkUmV0dXJufTsKKworICAgIGlzX2RlZXBseShc
QGdvdCwgJGV4cGVjdGVkUmV0dXJuLCAiJHRlc3ROYW1lU3RhcnQgcmV0dXJuIHZhbHVlLiIpOwor
CisgICAgbXkgJGdvdE5leHRMaW5lID0gPCRmaWxlSGFuZGxlPjsKKyAgICBpcygkZ290TmV4dExp
bmUsICR0ZXN0Q2FzZS0+e2V4cGVjdGVkTmV4dExpbmV9LCAgIiR0ZXN0TmFtZVN0YXJ0IG5leHQg
cmVhZCBsaW5lLiIpOworfQo=
</data>

          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>56173</attachid>
            <date>2010-05-15 20:44:08 -0700</date>
            <delta_ts>2010-05-15 20:50:26 -0700</delta_ts>
            <desc>Patch with unit tests</desc>
            <filename>Bug39170_2.patch</filename>
            <type>text/plain</type>
            <size>8163</size>
            <attacher name="Daniel Bates">dbates</attacher>
            
              <data encoding="base64">SW5kZXg6IFdlYktpdFRvb2xzL0NoYW5nZUxvZwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJLaXRUb29scy9D
aGFuZ2VMb2cJKHJldmlzaW9uIDU5NTU4KQorKysgV2ViS2l0VG9vbHMvQ2hhbmdlTG9nCSh3b3Jr
aW5nIGNvcHkpCkBAIC0xLDMgKzEsMTcgQEAKKzIwMTAtMDUtMTUgIERhbmllbCBCYXRlcyAgPGRi
YXRlc0ByaW0uY29tPgorCisgICAgICAgIFJldmlld2VkIGJ5IE5PQk9EWSAoT09QUyEpLgorCisg
ICAgICAgIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0zOTE3MAorCisg
ICAgICAgIEFkZCBmdW5jdGlvbiBwYXJzZVN2blByb3BlcnR5VmFsdWUgdG8gcGFyc2Ugc2luZ2xl
LWxpbmUgYW5kIG11bHRpLWxpbmUKKyAgICAgICAgcHJvcGVydHkgdmFsdWVzIG9mIGFuIFNWTiBw
cm9wZXJ0eSBjaGFuZ2UuCisKKyAgICAgICAgKiBTY3JpcHRzL1ZDU1V0aWxzLnBtOgorICAgICAg
ICAgICAgQWRkZWQgZnVuY3Rpb24gcGFyc2VTdm5Qcm9wZXJ0eVZhbHVlLiBXZSB3aWxsIHVzZSB0
aGlzIGFzIHBhcnQgb2YKKyAgICAgICAgICAgIEJ1ZyAjMzg4ODUgPGh0dHBzOi8vYnVncy53ZWJr
aXQub3JnL3Nob3dfYnVnLmNnaT9pZD0zODg4NT4uCisgICAgICAgICogU2NyaXB0cy93ZWJraXRw
ZXJsL1ZDU1V0aWxzX3VuaXR0ZXN0L3BhcnNlU3ZuUHJvcGVydHlWYWx1ZS5wbDogQWRkZWQuCisK
IDIwMTAtMDUtMTUgIEpvY2hlbiBFaXNpbmdlciAgPGpvY2hlbkBjaHJvbWl1bS5vcmc+CiAKICAg
ICAgICAgUmV2aWV3ZWQgYnkgRG1pdHJ5IFRpdG92LgpJbmRleDogV2ViS2l0VG9vbHMvU2NyaXB0
cy9WQ1NVdGlscy5wbQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJLaXRUb29scy9TY3JpcHRzL1ZDU1V0aWxz
LnBtCShyZXZpc2lvbiA1OTU1OCkKKysrIFdlYktpdFRvb2xzL1NjcmlwdHMvVkNTVXRpbHMucG0J
KHdvcmtpbmcgY29weSkKQEAgLTkwLDYgKzkwLDcgQEAgbXkgJGNoYW5nZUxvZ1RpbWVab25lID0g
IlBTVDhQRFQiOwogCiBteSAkZ2l0RGlmZlN0YXJ0UmVnRXggPSBxciNeZGlmZiAtLWdpdCAoXHcv
KT8oLispIChcdy8pPyhbXlxyXG5dKykjOwogbXkgJHN2bkRpZmZTdGFydFJlZ0V4ID0gcXIjXklu
ZGV4OiAoW15cclxuXSspIzsKK215ICRzdm5Qcm9wZXJ0eVZhbHVlU3RhcnRSZWdFeCA9IHFyI14g
ICAoXCt8LSkgKFteXHJcbl0rKSM7ICMgJDIgaXMgdGhlIHN0YXJ0IG9mIHRoZSBwcm9wZXJ0eSdz
IHZhbHVlICh3aGljaCBtYXkgc3BhbiBtdWx0aXBsZSBsaW5lcykuCiAKICMgVGhpcyBtZXRob2Qg
aXMgZm9yIHBvcnRhYmlsaXR5LiBSZXR1cm4gdGhlIHN5c3RlbS1hcHByb3ByaWF0ZSBleGl0CiAj
IHN0YXR1cyBvZiBhIGNoaWxkIHByb2Nlc3MuCkBAIC04MzYsNiArODM3LDU3IEBAIHN1YiBwYXJz
ZURpZmYoJCQpCiAgICAgcmV0dXJuIChcQGRpZmZIYXNoUmVmcywgJGxpbmUpOwogfQogCisjIFBh
cnNlIHRoZSB2YWx1ZSBvZiBhbiBTVk4gcHJvcGVydHkgZnJvbSB0aGUgZ2l2ZW4gZmlsZSBoYW5k
bGUsIGFuZCBhZHZhbmNlCisjIHRoZSBoYW5kbGUgc28gdGhlIGxhc3QgbGluZSByZWFkIGlzIHRo
ZSBmaXJzdCBsaW5lIGFmdGVyIHRoZSBwcm9wZXJ0eSB2YWx1ZS4KKyMKKyMgVGhpcyBzdWJyb3V0
aW5lIGRpZXMgaWYgdGhlIGZpcnN0IGxpbmUgaXMgYW4gaW52YWxpZCBTVk4gcHJvcGVydHkgdmFs
dWUgbGluZQorIyAoaS5lLiBhIGxpbmUgdGhhdCBkb2VzIG5vdCBiZWdpbiB3aXRoICIgICArIiBv
ciAiICAgLSIpLgorIworIyBBcmdzOgorIyAgICRmaWxlSGFuZGxlOiBhZHZhbmNlZCBzbyB0aGUg
bGFzdCBsaW5lIHJlYWQgZnJvbSB0aGUgaGFuZGxlIGlzIHRoZSBmaXJzdAorIyAgICAgICAgICAg
ICAgICBsaW5lIG9mIHRoZSBwcm9wZXJ0eSB2YWx1ZSB0byBwYXJzZS4gIFRoaXMgc2hvdWxkIGJl
IGEgbGluZQorIyAgICAgICAgICAgICAgICBiZWdpbm5pbmcgd2l0aCAiICAgKyIgb3IgIiAgIC0i
LgorIyAgICRsaW5lOiB0aGUgbGluZSBsYXN0IHJlYWQgZnJvbSAkZmlsZUhhbmRsZQorIworIyBS
ZXR1cm5zICgkcHJvcGVydHlWYWx1ZSwgJGxhc3RSZWFkTGluZSk6CisjICAgJHByb3BlcnR5VmFs
dWU6IHRoZSB2YWx1ZSBvZiB0aGUgcHJvcGVydHkuCisjICAgJGxhc3RSZWFkTGluZTogdGhlIGxp
bmUgbGFzdCByZWFkIGZyb20gJGZpbGVIYW5kbGUuCisjCisjIEZJWE1FOiBUaGlzIG1ldGhvZCBp
cyB1bnVzZWQgYXMgb2YgKDA1LzE1LzIwMTApLiBXZSB3aWxsIGNhbGwgdGhpcyBmdW5jdGlvbgor
IyAgICAgICAgYXMgcGFydCBvZiBwYXJzaW5nIGEgcHJvcGVydHkgZnJvbSB0aGUgU1ZOIGZvb3Rl
ci4gU2VlIDxodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9Mzg4ODU+Lgor
c3ViIHBhcnNlU3ZuUHJvcGVydHlWYWx1ZSgkJCkKK3sKKyAgICBteSAoJGZpbGVIYW5kbGUsICRs
aW5lKSA9IEBfOworCisgICAgJF8gPSAkbGluZTsKKworICAgIG15ICRwcm9wZXJ0eVZhbHVlOwor
ICAgIG15ICRlb2w7CisgICAgaWYgKC8kc3ZuUHJvcGVydHlWYWx1ZVN0YXJ0UmVnRXgvKSB7Cisg
ICAgICAgICRwcm9wZXJ0eVZhbHVlID0gJDI7ICMgRG9lcyBub3QgaW5jbHVkZSB0aGUgZW5kLW9m
LWxpbmUgY2hhcmFjdGVyKHMpLgorICAgICAgICAkZW9sID0gJFBPU1RNQVRDSDsKKyAgICB9IGVs
c2UgeworICAgICAgICBkaWUoIkZhaWxlZCB0byBmaW5kIHByb3BlcnR5IHZhbHVlIGJlZ2lubmlu
ZyB3aXRoICcrJyBvciAnLSc6IFwiJF9cIi4iKTsKKyAgICB9CisKKyAgICB3aGlsZSAoPCRmaWxl
SGFuZGxlPikgeworICAgICAgICBpZiAoL14kLyB8fCAvJHN2blByb3BlcnR5VmFsdWVTdGFydFJl
Z0V4LykgeworICAgICAgICAgICAgIyBOb3RlLCB3ZSBtYXkgZW5jb3VudGVyIGFuIGVtcHR5IGxp
bmUgYmVmb3JlIHRoZSBjb250ZW50cyBvZiBhIGJpbmFyeSBwYXRjaC4KKyAgICAgICAgICAgICMg
QWxzbywgd2UgY2hlY2sgZm9yICRzdm5Qcm9wZXJ0eVZhbHVlU3RhcnRSZWdFeCBiZWNhdXNlIGEg
Jy0nIHByb3BlcnR5IG1heSBiZQorICAgICAgICAgICAgIyBmb2xsb3dlZCBieSBhICcrJyBwcm9w
ZXJ0eSBpbiB0aGUgY2FzZSBvZiBhICJNb2RpZmllZCIgb3IgIk5hbWUiIHByb3BlcnR5LgorICAg
ICAgICAgICAgbGFzdDsKKyAgICAgICAgfQorICAgICAgICAjIFRlbXBvcmFyaWx5IHN0cmlwIG9m
ZiBhbnkgZW5kLW9mLWxpbmUgY2hhcmFjdGVycy4gV2UgYWRkIHRoZSBlbmQtb2YtbGluZSBjaGFy
YWN0ZXJzCisgICAgICAgICMgZnJvbSB0aGUgcHJldmlvdXNseSBwcm9jZXNzZWQgbGluZSB0byB0
aGUgc3RhcnQgb2YgdGhpcyBsaW5lIHNvIHRoYXQgdGhlIGxhc3QgbGluZQorICAgICAgICAjIG9m
IHRoZSBwcm9wZXJ0eSB2YWx1ZSBkb2VzIG5vdCBlbmQgaW4gZW5kLW9mLWxpbmUgY2hhcmFjdGVy
cy4KKyAgICAgICAgcy8oW1xuXHJdKykkLy87CisgICAgICAgICRwcm9wZXJ0eVZhbHVlIC49ICIk
ZW9sJF8iOworICAgICAgICAkZW9sID0gJDE7CisgICAgfQorCisgICAgcmV0dXJuICgkcHJvcGVy
dHlWYWx1ZSwgJF8pOworfQorCiAjIFBhcnNlIGEgcGF0Y2ggZmlsZSBjcmVhdGVkIGJ5IHN2bi1j
cmVhdGUtcGF0Y2guCiAjCiAjIEFyZ3M6CkluZGV4OiBXZWJLaXRUb29scy9TY3JpcHRzL3dlYmtp
dHBlcmwvVkNTVXRpbHNfdW5pdHRlc3QvcGFyc2VTdm5Qcm9wZXJ0eVZhbHVlLnBsCj09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT0KLS0tIFdlYktpdFRvb2xzL1NjcmlwdHMvd2Via2l0cGVybC9WQ1NVdGlsc191bml0dGVzdC9w
YXJzZVN2blByb3BlcnR5VmFsdWUucGwJKHJldmlzaW9uIDApCisrKyBXZWJLaXRUb29scy9TY3Jp
cHRzL3dlYmtpdHBlcmwvVkNTVXRpbHNfdW5pdHRlc3QvcGFyc2VTdm5Qcm9wZXJ0eVZhbHVlLnBs
CShyZXZpc2lvbiAwKQpAQCAtMCwwICsxLDEyNyBAQAorIyEvdXNyL2Jpbi9wZXJsIC13CisjCisj
IENvcHlyaWdodCAoQykgUmVzZWFyY2ggaW4gTW90aW9uIExpbWl0ZWQgMjAxMC4gQWxsIFJpZ2h0
cyBSZXNlcnZlZC4KKyMgQ29weXJpZ2h0IChDKSAyMDEwIENocmlzIEplcmRvbmVrIChjaHJpcy5q
ZXJkb25la0BnbWFpbC5jb20pCisjCisjIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNl
IGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorIyBtb2RpZmljYXRpb24sIGFyZSBw
ZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisjIG1l
dDoKKyMKKyMgICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWlu
IHRoZSBhYm92ZSBjb3B5cmlnaHQKKyMgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBh
bmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorIyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4g
YmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisjIGNvcHlyaWdodCBub3RpY2Us
IHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKyMg
aW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRo
IHRoZQorIyBkaXN0cmlidXRpb24uCisjICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgQXBwbGUg
Q29tcHV0ZXIsIEluYy4gKCJBcHBsZSIpIG5vciB0aGUgbmFtZXMgb2YKKyMgaXRzIGNvbnRyaWJ1
dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAor
IyBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1p
c3Npb24uCisjCisjIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBI
T0xERVJTIEFORCBDT05UUklCVVRPUlMKKyMgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1Q
TElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyMgTElNSVRFRCBUTywgVEhFIElN
UExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisjIEEg
UEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUg
Q09QWVJJR0hUCisjIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJF
Q1QsIElORElSRUNULCBJTkNJREVOVEFMLAorIyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNF
UVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisjIExJTUlURUQgVE8sIFBST0NV
UkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorIyBE
QVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VE
IEFORCBPTiBBTlkKKyMgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwg
U1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorIyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RI
RVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyMgT0YgVEhJUyBTT0ZU
V0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4K
KworIyBVbml0IHRlc3RzIG9mIHBhcnNlU3ZuUHJvcGVydHlWYWx1ZSgpLgorCit1c2Ugc3RyaWN0
OwordXNlIHdhcm5pbmdzOworCit1c2UgVGVzdDo6TW9yZTsKK3VzZSBWQ1NVdGlsczsKKworbXkg
QHRlc3RDYXNlSGFzaFJlZnMgPSAoCit7CisgICAgIyBOZXcgdGVzdAorICAgIGRpZmZOYW1lID0+
ICJzaW5nZS1saW5lICcrJyBjaGFuZ2UiLAorICAgIGlucHV0VGV4dCA9PiA8PCdFTkQnLAorICAg
KyAqCitFTkQKKyAgICBleHBlY3RlZFJldHVybiA9PiBbIioiLCB1bmRlZl0sCisgICAgZXhwZWN0
ZWROZXh0TGluZSA9PiB1bmRlZiwKK30sCit7CisgICAgIyBOZXcgdGVzdAorICAgIGRpZmZOYW1l
ID0+ICJzaW5nbGUtbGluZSAnLScgY2hhbmdlIiwKKyAgICBpbnB1dFRleHQgPT4gPDwnRU5EJywK
KyAgIC0gKgorRU5ECisgICAgZXhwZWN0ZWRSZXR1cm4gPT4gWyIqIiwgdW5kZWZdLAorICAgIGV4
cGVjdGVkTmV4dExpbmUgPT4gdW5kZWYsCit9LAoreworICAgICMgTmV3IHRlc3QKKyAgICBkaWZm
TmFtZSA9PiAic2ltcGxlIG11bHRpLWxpbmUgJy0nIGNoYW5nZSIsCisgICAgaW5wdXRUZXh0ID0+
IDw8J0VORCcsCisgICAtICoKKworRU5ECisgICAgZXhwZWN0ZWRSZXR1cm4gPT4gWyIqIiwgIlxu
Il0sCisgICAgZXhwZWN0ZWROZXh0TGluZSA9PiB1bmRlZiwKK30sCit7CisgICAgIyBOZXcgdGVz
dAorICAgIGRpZmZOYW1lID0+ICJtdWx0aS1saW5lICcrJyBjaGFuZ2UgYW5kIHN0YXJ0IG9mIGJp
bmFyeSBwYXRjaCIsCisgICAgaW5wdXRUZXh0ID0+IDw8J0VORCcsCisgICArIEEKK2xvbmcgc2Vu
dGVuY2UgdGhhdCBzcGFucworbXVsdGlwbGUgbGluZXMuCisKK1ExZFRCeDBBQUFCNDJpdGc0R2xn
WUpqR3dNRER5T0RNeE1EdzM0R0JnUUVBSlBRREpBPT0KK0VORAorICAgIGV4cGVjdGVkUmV0dXJu
ID0+IFsiQVxubG9uZyBzZW50ZW5jZSB0aGF0IHNwYW5zXG5tdWx0aXBsZSBsaW5lcy4iLCAiXG4i
XSwKKyAgICBleHBlY3RlZE5leHRMaW5lID0+ICJRMWRUQngwQUFBQjQyaXRnNEdsZ1lKakd3TURE
eU9ETXhNRHczNEdCZ1FFQUpQUURKQT09XG4iLAorfSwKK3sKKyAgICAjIE5ldyB0ZXN0CisgICAg
ZGlmZk5hbWUgPT4gIm11bHRpLWxpbmUgJy0nIGNoYW5nZSBmb2xsb3dlZCBieSAnKycgc2luZ2xl
LWxpbmUgY2hhbmdlIiwKKyAgICBpbnB1dFRleHQgPT4gPDwnRU5EJywKKyAgIC0gQQorbG9uZyBz
ZW50ZW5jZSB0aGF0IHNwYW5zCittdWx0aXBsZSBsaW5lcy4KKyAgICsgQSBzaW5nbGUtbGluZS4K
K0VORAorICAgIGV4cGVjdGVkUmV0dXJuID0+IFsiQVxubG9uZyBzZW50ZW5jZSB0aGF0IHNwYW5z
XG5tdWx0aXBsZSBsaW5lcy4iLCAiICAgKyBBIHNpbmdsZS1saW5lLlxuIl0sCisgICAgZXhwZWN0
ZWROZXh0TGluZSA9PiB1bmRlZiwKK30sCit7CisgICAgIyBOZXcgdGVzdAorICAgIGRpZmZOYW1l
ID0+ICJtdWx0aS1saW5lICctJyBjaGFuZ2UgZm9sbG93ZWQgYnkgJysnIG11bHRpLWxpbmUgY2hh
bmdlIiwKKyAgICBpbnB1dFRleHQgPT4gPDwnRU5EJywKKyAgIC0gQQorbG9uZyBzZW50ZW5jZSB0
aGF0IHNwYW5zCittdWx0aXBsZSBsaW5lcy4KKyAgICsgQW5vdGhlcgorbG9uZyBzZW50ZW5jZSB0
aGF0IHNwYW5zCittdWx0aXBsZSBsaW5lcy4KK0VORAorICAgIGV4cGVjdGVkUmV0dXJuID0+IFsi
QVxubG9uZyBzZW50ZW5jZSB0aGF0IHNwYW5zXG5tdWx0aXBsZSBsaW5lcy4iLCAiICAgKyBBbm90
aGVyXG4iXSwKKyAgICBleHBlY3RlZE5leHRMaW5lID0+ICJsb25nIHNlbnRlbmNlIHRoYXQgc3Bh
bnNcbiIsCit9LAorKTsKKworbXkgJHRlc3RDYXNlc0NvdW50ID0gQHRlc3RDYXNlSGFzaFJlZnM7
CitwbGFuKHRlc3RzID0+IDIgKiAkdGVzdENhc2VzQ291bnQpOyAjIFRvdGFsIG51bWJlciBvZiBh
c3NlcnRpb25zLgorCitmb3JlYWNoIG15ICR0ZXN0Q2FzZSAoQHRlc3RDYXNlSGFzaFJlZnMpIHsK
KyAgICBteSAkdGVzdE5hbWVTdGFydCA9ICJwYXJzZVN2blByb3BlcnR5VmFsdWUoKTogJHRlc3RD
YXNlLT57ZGlmZk5hbWV9OiBjb21wYXJpbmciOworCisgICAgbXkgJGZpbGVIYW5kbGU7CisgICAg
b3BlbigkZmlsZUhhbmRsZSwgIjwiLCBcJHRlc3RDYXNlLT57aW5wdXRUZXh0fSk7CisgICAgbXkg
JGxpbmUgPSA8JGZpbGVIYW5kbGU+OworCisgICAgbXkgQGdvdCA9IFZDU1V0aWxzOjpwYXJzZVN2
blByb3BlcnR5VmFsdWUoJGZpbGVIYW5kbGUsICRsaW5lKTsKKyAgICBteSAkZXhwZWN0ZWRSZXR1
cm4gPSAkdGVzdENhc2UtPntleHBlY3RlZFJldHVybn07CisKKyAgICBpc19kZWVwbHkoXEBnb3Qs
ICRleHBlY3RlZFJldHVybiwgIiR0ZXN0TmFtZVN0YXJ0IHJldHVybiB2YWx1ZS4iKTsKKworICAg
IG15ICRnb3ROZXh0TGluZSA9IDwkZmlsZUhhbmRsZT47CisgICAgaXMoJGdvdE5leHRMaW5lLCAk
dGVzdENhc2UtPntleHBlY3RlZE5leHRMaW5lfSwgICIkdGVzdE5hbWVTdGFydCBuZXh0IHJlYWQg
bGluZS4iKTsKK30K
</data>

          </attachment>
      

    </bug>

</bugzilla>