<?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>79503</bug_id>
          
          <creation_ts>2012-02-24 09:51:16 -0800</creation_ts>
          <short_desc>Biquad getFrequencyResponse needs a layout test.</short_desc>
          <delta_ts>2012-03-03 10:56:10 -0800</delta_ts>
          <reporter_accessible>1</reporter_accessible>
          <cclist_accessible>1</cclist_accessible>
          <classification_id>1</classification_id>
          <classification>Unclassified</classification>
          <product>WebKit</product>
          <component>Web Audio</component>
          <version>528+ (Nightly build)</version>
          <rep_platform>Unspecified</rep_platform>
          <op_sys>Unspecified</op_sys>
          <bug_status>RESOLVED</bug_status>
          <resolution>FIXED</resolution>
          
          
          <bug_file_loc></bug_file_loc>
          <status_whiteboard></status_whiteboard>
          <keywords></keywords>
          <priority>P2</priority>
          <bug_severity>Normal</bug_severity>
          <target_milestone>---</target_milestone>
          
          
          <everconfirmed>1</everconfirmed>
          <reporter name="Raymond Toy">rtoy</reporter>
          <assigned_to name="Raymond Toy">rtoy</assigned_to>
          <cc>crogers</cc>
    
    <cc>dglazkov</cc>
    
    <cc>webkit.review.bot</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>564399</commentid>
    <comment_count>0</comment_count>
    <who name="Raymond Toy">rtoy</who>
    <bug_when>2012-02-24 09:51:16 -0800</bug_when>
    <thetext>Need to add layout test for Biquad getFrequencyResponse.  It&apos;s probably good enough to test just one kind of biquad filter.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>564630</commentid>
    <comment_count>1</comment_count>
      <attachid>128804</attachid>
    <who name="Raymond Toy">rtoy</who>
    <bug_when>2012-02-24 14:16:20 -0800</bug_when>
    <thetext>Created attachment 128804
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>566074</commentid>
    <comment_count>2</comment_count>
      <attachid>128804</attachid>
    <who name="Chris Rogers">crogers</who>
    <bug_when>2012-02-27 16:15:44 -0800</bug_when>
    <thetext>Comment on attachment 128804
Patch

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

&gt; LayoutTests/webaudio/biquad-getFrequencyResponse.html:36
&gt; +var filterGain = 5;

This may seem silly to you, but it would be nice to use values that would be more normally found in audio/music processing.

How about testing a *peaking* filter with:
cutoff = 1000
Q = 1
gain = 5

&gt; LayoutTests/webaudio/biquad-getFrequencyResponse.html:151
&gt; +

Could you please have an initial test to check for NaN and Inf in both mag and phase results?

&gt; LayoutTests/webaudio/biquad-getFrequencyResponse.html:175
&gt; +        var error = Math.abs(phaseResponse[k] - expectedPhase[k]);

Don&apos;t you have to handle phase wrapping here?  For example, the difference between a phase near -Pi and one very near +Pi is actually very small...

&gt; LayoutTests/webaudio/biquad-getFrequencyResponse.html:211
&gt; +    filter.type = filter.LOWPASS;

See comment above about filter type.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>566806</commentid>
    <comment_count>3</comment_count>
      <attachid>129281</attachid>
    <who name="Raymond Toy">rtoy</who>
    <bug_when>2012-02-28 09:49:43 -0800</bug_when>
    <thetext>Created attachment 129281
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>566810</commentid>
    <comment_count>4</comment_count>
      <attachid>128804</attachid>
    <who name="Raymond Toy">rtoy</who>
    <bug_when>2012-02-28 09:51:38 -0800</bug_when>
    <thetext>Comment on attachment 128804
Patch

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

&gt;&gt; LayoutTests/webaudio/biquad-getFrequencyResponse.html:36
&gt;&gt; +var filterGain = 5;
&gt; 
&gt; This may seem silly to you, but it would be nice to use values that would be more normally found in audio/music processing.
&gt; 
&gt; How about testing a *peaking* filter with:
&gt; cutoff = 1000
&gt; Q = 1
&gt; gain = 5

Done.

&gt;&gt; LayoutTests/webaudio/biquad-getFrequencyResponse.html:151
&gt;&gt; +
&gt; 
&gt; Could you please have an initial test to check for NaN and Inf in both mag and phase results?

Done.

&gt;&gt; LayoutTests/webaudio/biquad-getFrequencyResponse.html:175
&gt;&gt; +        var error = Math.abs(phaseResponse[k] - expectedPhase[k]);
&gt; 
&gt; Don&apos;t you have to handle phase wrapping here?  For example, the difference between a phase near -Pi and one very near +Pi is actually very small...

Don&apos;t think that&apos;s possible for the peaking filter, but I added support for wrapping, just in case we add tests for other filter types.

&gt;&gt; LayoutTests/webaudio/biquad-getFrequencyResponse.html:211
&gt;&gt; +    filter.type = filter.LOWPASS;
&gt; 
&gt; See comment above about filter type.

Changed to PEAKING.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>567061</commentid>
    <comment_count>5</comment_count>
      <attachid>129281</attachid>
    <who name="WebKit Review Bot">webkit.review.bot</who>
    <bug_when>2012-02-28 13:55:32 -0800</bug_when>
    <thetext>Comment on attachment 129281
Patch

Attachment 129281 did not pass chromium-ews (chromium-xvfb):
Output: http://queues.webkit.org/results/11714084

New failing tests:
webaudio/biquad-getFrequencyResponse.html</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>567073</commentid>
    <comment_count>6</comment_count>
      <attachid>129326</attachid>
    <who name="Raymond Toy">rtoy</who>
    <bug_when>2012-02-28 14:07:47 -0800</bug_when>
    <thetext>Created attachment 129326
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>567074</commentid>
    <comment_count>7</comment_count>
    <who name="Raymond Toy">rtoy</who>
    <bug_when>2012-02-28 14:08:34 -0800</bug_when>
    <thetext>(In reply to comment #6)
&gt; Created an attachment (id=129326) [details]
&gt; Patch

Oops.  Previous patch had typo in threshold and didn&apos;t update the expected results.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>567128</commentid>
    <comment_count>8</comment_count>
      <attachid>129326</attachid>
    <who name="Chris Rogers">crogers</who>
    <bug_when>2012-02-28 14:56:20 -0800</bug_when>
    <thetext>Comment on attachment 129326
Patch

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

Nice test!  comments below:

&gt; LayoutTests/webaudio/biquad-getFrequencyResponse.html:17
&gt; +// lowpass biquad filter and compare it with the expected frequency response.

lowpass -&gt; peaking

I&apos;d add one more sentence here describing that it doesn&apos;t matter that much which filter we pick since we&apos;re testing the response code and not
a specific filter.  The filters themselves are tested extensively in the other biquad tests.

&gt; LayoutTests/webaudio/biquad-getFrequencyResponse.html:33
&gt; +// The filter properties

properties -&gt; parameters

nit: add period at end of sentence

&gt; LayoutTests/webaudio/biquad-getFrequencyResponse.html:34
&gt; +var filterCutoff = 1000;  // Hz.

nit: extra space before //

&gt; LayoutTests/webaudio/biquad-getFrequencyResponse.html:36
&gt; +var filterGain = 5;

could add // Decibels.

&gt; LayoutTests/webaudio/biquad-getFrequencyResponse.html:44
&gt; +// Convert frequency in Hz to a normalized frequency.

&quot;normalized frequency&quot; -&gt; &quot;normalized frequency between 0 -&gt; 1 corresponding to 0 -&gt; Nyquist frequency&quot;

&gt; LayoutTests/webaudio/biquad-getFrequencyResponse.html:65
&gt; +    // b2 * cos(2*w) + b1 * cos(w) + b0 - i * (b1 * sin(w) + b2 * sin(2*w))

The use of &quot;w&quot; is inconsistent with line 76 where you use &quot;omega&quot; and the terms are in reverse order.  Let&apos;s just use omega here and use the ordering from 76

&gt; LayoutTests/webaudio/biquad-getFrequencyResponse.html:69
&gt; +    // 1 + a1 * cos(w) + a2 * cos(2*w) - i * (a1 * sin(w) + a2 * sin(2*w))

ditto

&gt; LayoutTests/webaudio/biquad-getFrequencyResponse.html:71
&gt; +    // where w = pi * f

I&apos;d use omega instead of w, and define &quot;omega&quot; up-front (above line 65)

&gt; LayoutTests/webaudio/biquad-getFrequencyResponse.html:95
&gt; +// given by |frequencySamples|.

frequencySamples -&gt; frequencies

in the comment and the function

&gt; LayoutTests/webaudio/biquad-getFrequencyResponse.html:100
&gt; +    var filterCoef = createFilter(filter.type, normalizedFreq, filter.Q.value, filter.gain.value);

filterCoef -&gt; filterCoefficients (or simply coefficients)

&gt; LayoutTests/webaudio/biquad-getFrequencyResponse.html:103
&gt; +    var phase = [];

these are lists, so plural is better:

magnitudes
phases

&gt; LayoutTests/webaudio/biquad-getFrequencyResponse.html:111
&gt; +    return {magnitude : magnitude, phase : phase};

plural

&gt; LayoutTests/webaudio/biquad-getFrequencyResponse.html:114
&gt; +// Compute the set of frequency samples.

// Compute a set of linearly spaced frequencies.

&gt; LayoutTests/webaudio/biquad-getFrequencyResponse.html:115
&gt; +function createFrequencySampleArray(nSamples, sampleRate)

nSamples -&gt; nFrequences

(the word sample is quite confusing here since it usually means a PCM sample)

&gt; LayoutTests/webaudio/biquad-getFrequencyResponse.html:117
&gt; +    var freqSamples = new Float32Array(nSamples);

freqSamples -&gt; frequencies

&gt; LayoutTests/webaudio/biquad-getFrequencyResponse.html:119
&gt; +    var freqDelta = sampleRate / 2 / nSamples;

nit: double /  is hard to read

To make this clearer, can&apos;t we instead have:
var nyquist = 0.5 * sampleRate;
var freqDelta = nyquist / nSamples;

&gt; LayoutTests/webaudio/biquad-getFrequencyResponse.html:128
&gt; +function linearToDecibels(x)

Can&apos;t we put this in audio-testing.js?

If we do, make sure to check if this conflicts with other layout tests which similarly define this function.  If it becomes too much of a hassle then this could be done in another patch...

&gt; LayoutTests/webaudio/biquad-getFrequencyResponse.html:138
&gt; +// If no such number, returns false.

What if the first bad index is 0 and we return 0 instead of false - is that a problem?

&gt; LayoutTests/webaudio/biquad-getFrequencyResponse.html:191
&gt; +

For the following checks on the expected results I would add a comment clarifying that this test doesn&apos;t test the implementation, but is
just a sanity check on the test itself.  This is an important distinction, since a failure here isn&apos;t really a failure of the impl.

&gt; LayoutTests/webaudio/biquad-getFrequencyResponse.html:272
&gt; +    // Arbitrarily test a lowpass filter, but any kind of filter can be tested.  (Should we test all

lowpass -&gt; peaking

I think you can remove the comment about testing all the filter types and just say that any filter type should do.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>567177</commentid>
    <comment_count>9</comment_count>
      <attachid>129345</attachid>
    <who name="Raymond Toy">rtoy</who>
    <bug_when>2012-02-28 15:43:10 -0800</bug_when>
    <thetext>Created attachment 129345
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>567179</commentid>
    <comment_count>10</comment_count>
      <attachid>129326</attachid>
    <who name="Raymond Toy">rtoy</who>
    <bug_when>2012-02-28 15:47:37 -0800</bug_when>
    <thetext>Comment on attachment 129326
Patch

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

&gt;&gt; LayoutTests/webaudio/biquad-getFrequencyResponse.html:17
&gt;&gt; +// lowpass biquad filter and compare it with the expected frequency response.
&gt; 
&gt; lowpass -&gt; peaking
&gt; 
&gt; I&apos;d add one more sentence here describing that it doesn&apos;t matter that much which filter we pick since we&apos;re testing the response code and not
&gt; a specific filter.  The filters themselves are tested extensively in the other biquad tests.

Done.

&gt;&gt; LayoutTests/webaudio/biquad-getFrequencyResponse.html:33
&gt;&gt; +// The filter properties
&gt; 
&gt; properties -&gt; parameters
&gt; 
&gt; nit: add period at end of sentence

Done.

&gt;&gt; LayoutTests/webaudio/biquad-getFrequencyResponse.html:34
&gt;&gt; +var filterCutoff = 1000;  // Hz.
&gt; 
&gt; nit: extra space before //

Removed.

&gt;&gt; LayoutTests/webaudio/biquad-getFrequencyResponse.html:36
&gt;&gt; +var filterGain = 5;
&gt; 
&gt; could add // Decibels.

Added.

&gt;&gt; LayoutTests/webaudio/biquad-getFrequencyResponse.html:44
&gt;&gt; +// Convert frequency in Hz to a normalized frequency.
&gt; 
&gt; &quot;normalized frequency&quot; -&gt; &quot;normalized frequency between 0 -&gt; 1 corresponding to 0 -&gt; Nyquist frequency&quot;

Done.

&gt;&gt; LayoutTests/webaudio/biquad-getFrequencyResponse.html:65
&gt;&gt; +    // b2 * cos(2*w) + b1 * cos(w) + b0 - i * (b1 * sin(w) + b2 * sin(2*w))
&gt; 
&gt; The use of &quot;w&quot; is inconsistent with line 76 where you use &quot;omega&quot; and the terms are in reverse order.  Let&apos;s just use omega here and use the ordering from 76

Use omega everywhere.

&gt;&gt; LayoutTests/webaudio/biquad-getFrequencyResponse.html:69
&gt;&gt; +    // 1 + a1 * cos(w) + a2 * cos(2*w) - i * (a1 * sin(w) + a2 * sin(2*w))
&gt; 
&gt; ditto

Done.

&gt;&gt; LayoutTests/webaudio/biquad-getFrequencyResponse.html:71
&gt;&gt; +    // where w = pi * f
&gt; 
&gt; I&apos;d use omega instead of w, and define &quot;omega&quot; up-front (above line 65)

Done.

&gt;&gt; LayoutTests/webaudio/biquad-getFrequencyResponse.html:95
&gt;&gt; +// given by |frequencySamples|.
&gt; 
&gt; frequencySamples -&gt; frequencies
&gt; 
&gt; in the comment and the function

Done.

&gt;&gt; LayoutTests/webaudio/biquad-getFrequencyResponse.html:100
&gt;&gt; +    var filterCoef = createFilter(filter.type, normalizedFreq, filter.Q.value, filter.gain.value);
&gt; 
&gt; filterCoef -&gt; filterCoefficients (or simply coefficients)

Done.

&gt;&gt; LayoutTests/webaudio/biquad-getFrequencyResponse.html:103
&gt;&gt; +    var phase = [];
&gt; 
&gt; these are lists, so plural is better:
&gt; 
&gt; magnitudes
&gt; phases

Done.

&gt;&gt; LayoutTests/webaudio/biquad-getFrequencyResponse.html:114
&gt;&gt; +// Compute the set of frequency samples.
&gt; 
&gt; // Compute a set of linearly spaced frequencies.

Done.

&gt;&gt; LayoutTests/webaudio/biquad-getFrequencyResponse.html:115
&gt;&gt; +function createFrequencySampleArray(nSamples, sampleRate)
&gt; 
&gt; nSamples -&gt; nFrequences
&gt; 
&gt; (the word sample is quite confusing here since it usually means a PCM sample)

Done. (but without the typo :-) )

&gt;&gt; LayoutTests/webaudio/biquad-getFrequencyResponse.html:117
&gt;&gt; +    var freqSamples = new Float32Array(nSamples);
&gt; 
&gt; freqSamples -&gt; frequencies

Done.

&gt;&gt; LayoutTests/webaudio/biquad-getFrequencyResponse.html:119
&gt;&gt; +    var freqDelta = sampleRate / 2 / nSamples;
&gt; 
&gt; nit: double /  is hard to read
&gt; 
&gt; To make this clearer, can&apos;t we instead have:
&gt; var nyquist = 0.5 * sampleRate;
&gt; var freqDelta = nyquist / nSamples;

Done.

&gt;&gt; LayoutTests/webaudio/biquad-getFrequencyResponse.html:128
&gt;&gt; +function linearToDecibels(x)
&gt; 
&gt; Can&apos;t we put this in audio-testing.js?
&gt; 
&gt; If we do, make sure to check if this conflicts with other layout tests which similarly define this function.  If it becomes too much of a hassle then this could be done in another patch...

I&apos;m going to defer this to another patch.  The convolution test has linearToDecibel, which is slightly different.

&gt;&gt; LayoutTests/webaudio/biquad-getFrequencyResponse.html:138
&gt;&gt; +// If no such number, returns false.
&gt; 
&gt; What if the first bad index is 0 and we return 0 instead of false - is that a problem?

Yes, that&apos;s a problem.  Rearranged to make it more explicit, without this problem.

&gt;&gt; LayoutTests/webaudio/biquad-getFrequencyResponse.html:191
&gt;&gt; +
&gt; 
&gt; For the following checks on the expected results I would add a comment clarifying that this test doesn&apos;t test the implementation, but is
&gt; just a sanity check on the test itself.  This is an important distinction, since a failure here isn&apos;t really a failure of the impl.

Done.

&gt;&gt; LayoutTests/webaudio/biquad-getFrequencyResponse.html:272
&gt;&gt; +    // Arbitrarily test a lowpass filter, but any kind of filter can be tested.  (Should we test all
&gt; 
&gt; lowpass -&gt; peaking
&gt; 
&gt; I think you can remove the comment about testing all the filter types and just say that any filter type should do.

Done.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>569154</commentid>
    <comment_count>11</comment_count>
      <attachid>129345</attachid>
    <who name="Chris Rogers">crogers</who>
    <bug_when>2012-03-01 18:43:00 -0800</bug_when>
    <thetext>Comment on attachment 129345
Patch

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

&gt; LayoutTests/webaudio/biquad-getFrequencyResponse.html:33
&gt; +var nFrequencySamples = 1000;

nFrequencySamples -&gt; numberOfFrequencies

&gt; LayoutTests/webaudio/biquad-getFrequencyResponse.html:69
&gt; +    // b2 * cos(2 * omega) + b1 * cos(omega) + b0 - i * (b1 * sin(omega) + b2 * sin(2 * omega))

Please use coefficient ordering of line 78:79 (in other words: b0, b1, b2)

&gt; LayoutTests/webaudio/biquad-getFrequencyResponse.html:83
&gt; +    var magnitude = Math.sqrt((Math.pow(numeratorReal, 2) + Math.pow(numeratorImag, 2))

Math.pow(..., 2) is more cumbersome than simple multiplies:
numeratorReal * numeratorReal    and    numeratorImag * numeratorImag

&gt; LayoutTests/webaudio/biquad-getFrequencyResponse.html:84
&gt; +                              / (Math.pow(denominatorReal, 2) + Math.pow(denominatorImag, 2)));

ditto

&gt; LayoutTests/webaudio/biquad-getFrequencyResponse.html:91
&gt; +    }

Just curious - does atan2() ever return values out-of-bounds of -Pi -&gt; +Pi  ?

&gt; LayoutTests/webaudio/biquad-getFrequencyResponse.html:117
&gt; +function createFrequencySampleArray(nFrequencies, sampleRate)

Please don&apos;t use the word &quot;sample&quot;

createFrequencySampleArray -&gt; createFrequencies

&gt; LayoutTests/webaudio/biquad-getFrequencyResponse.html:144
&gt; +         if (!isValidNumber(signal[k])) {

nit: funny indentation

&gt; LayoutTests/webaudio/biquad-getFrequencyResponse.html:145
&gt; +            return {found : true, index : k};

Please simply return index (and -1 if no bad index found)

&gt; LayoutTests/webaudio/biquad-getFrequencyResponse.html:148
&gt; +    return {found : false}

Can&apos;t we just return -1 as the index if no bad number is found -- this solution is more complex and harder to read than necessary

&gt; LayoutTests/webaudio/biquad-getFrequencyResponse.html:164
&gt; +function compareResponses(filter, freq, magResponse, phaseResponse)

freq -&gt; frequencies

&gt; LayoutTests/webaudio/biquad-getFrequencyResponse.html:180
&gt; +    hasBadNumber = findBadNumber(magResponse);

findBadNumber() should just directly return index (-1 if no bad index found)

&gt; LayoutTests/webaudio/biquad-getFrequencyResponse.html:230
&gt; +        message += &quot; expected: &quot; + linearToDecibels(expectedMagnitude[maxMagErrorIndex]);

typo: expectedMagnitude -&gt; expectedMagnitudes

Have you actually made these tests fail by purposefully (temporarily) introducing bugs into the implementation??  It seems you would have caught this if so.

&gt; LayoutTests/webaudio/biquad-getFrequencyResponse.html:252
&gt; +        message += &quot; expected: &quot; + expectedPhase[maxPhaseErrorIndex];

typo: expectedPhase -&gt; expectedPhases

&gt; LayoutTests/webaudio/biquad-getFrequencyResponse.html:282
&gt; +    freqSamples = createFrequencySampleArray(nFrequencySamples, context.sampleRate);

freqSamples -&gt; frequencies</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>569761</commentid>
    <comment_count>12</comment_count>
      <attachid>129923</attachid>
    <who name="Raymond Toy">rtoy</who>
    <bug_when>2012-03-02 10:43:23 -0800</bug_when>
    <thetext>Created attachment 129923
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>569765</commentid>
    <comment_count>13</comment_count>
      <attachid>129345</attachid>
    <who name="Raymond Toy">rtoy</who>
    <bug_when>2012-03-02 10:47:46 -0800</bug_when>
    <thetext>Comment on attachment 129345
Patch

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

&gt;&gt; LayoutTests/webaudio/biquad-getFrequencyResponse.html:33
&gt;&gt; +var nFrequencySamples = 1000;
&gt; 
&gt; nFrequencySamples -&gt; numberOfFrequencies

Done.

&gt;&gt; LayoutTests/webaudio/biquad-getFrequencyResponse.html:69
&gt;&gt; +    // b2 * cos(2 * omega) + b1 * cos(omega) + b0 - i * (b1 * sin(omega) + b2 * sin(2 * omega))
&gt; 
&gt; Please use coefficient ordering of line 78:79 (in other words: b0, b1, b2)

Done.

&gt;&gt; LayoutTests/webaudio/biquad-getFrequencyResponse.html:83
&gt;&gt; +    var magnitude = Math.sqrt((Math.pow(numeratorReal, 2) + Math.pow(numeratorImag, 2))
&gt; 
&gt; Math.pow(..., 2) is more cumbersome than simple multiplies:
&gt; numeratorReal * numeratorReal    and    numeratorImag * numeratorImag

Done.

&gt;&gt; LayoutTests/webaudio/biquad-getFrequencyResponse.html:91
&gt;&gt; +    }
&gt; 
&gt; Just curious - does atan2() ever return values out-of-bounds of -Pi -&gt; +Pi  ?

The spec says no, except it can return NaN, but that only happens if either arg is NaN.  But we check for NaN in the phase response later so we catch this issue.

&gt;&gt; LayoutTests/webaudio/biquad-getFrequencyResponse.html:117
&gt;&gt; +function createFrequencySampleArray(nFrequencies, sampleRate)
&gt; 
&gt; Please don&apos;t use the word &quot;sample&quot;
&gt; 
&gt; createFrequencySampleArray -&gt; createFrequencies

Done.

&gt;&gt; LayoutTests/webaudio/biquad-getFrequencyResponse.html:144
&gt;&gt; +         if (!isValidNumber(signal[k])) {
&gt; 
&gt; nit: funny indentation

Fixed.

&gt;&gt; LayoutTests/webaudio/biquad-getFrequencyResponse.html:145
&gt;&gt; +            return {found : true, index : k};
&gt; 
&gt; Please simply return index (and -1 if no bad index found)

Done.

&gt;&gt; LayoutTests/webaudio/biquad-getFrequencyResponse.html:148
&gt;&gt; +    return {found : false}
&gt; 
&gt; Can&apos;t we just return -1 as the index if no bad number is found -- this solution is more complex and harder to read than necessary

Done.

&gt;&gt; LayoutTests/webaudio/biquad-getFrequencyResponse.html:164
&gt;&gt; +function compareResponses(filter, freq, magResponse, phaseResponse)
&gt; 
&gt; freq -&gt; frequencies

Done.

&gt;&gt; LayoutTests/webaudio/biquad-getFrequencyResponse.html:180
&gt;&gt; +    hasBadNumber = findBadNumber(magResponse);
&gt; 
&gt; findBadNumber() should just directly return index (-1 if no bad index found)

Done.

&gt;&gt; LayoutTests/webaudio/biquad-getFrequencyResponse.html:230
&gt;&gt; +        message += &quot; expected: &quot; + linearToDecibels(expectedMagnitude[maxMagErrorIndex]);
&gt; 
&gt; typo: expectedMagnitude -&gt; expectedMagnitudes
&gt; 
&gt; Have you actually made these tests fail by purposefully (temporarily) introducing bugs into the implementation??  It seems you would have caught this if so.

I did the tests earlier, but not after submitting the first patch.

Fixed.

&gt;&gt; LayoutTests/webaudio/biquad-getFrequencyResponse.html:252
&gt;&gt; +        message += &quot; expected: &quot; + expectedPhase[maxPhaseErrorIndex];
&gt; 
&gt; typo: expectedPhase -&gt; expectedPhases

Fixed.

&gt;&gt; LayoutTests/webaudio/biquad-getFrequencyResponse.html:282
&gt;&gt; +    freqSamples = createFrequencySampleArray(nFrequencySamples, context.sampleRate);
&gt; 
&gt; freqSamples -&gt; frequencies

Done.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>569814</commentid>
    <comment_count>14</comment_count>
      <attachid>129923</attachid>
    <who name="Chris Rogers">crogers</who>
    <bug_when>2012-03-02 11:51:59 -0800</bug_when>
    <thetext>Comment on attachment 129923
Patch

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

Almost finished - looks great!

&gt; LayoutTests/webaudio/biquad-getFrequencyResponse.html:73
&gt; +    // Compute H(exp(i * pi * f)).  No native complex numbers in javascript, so break H(exp(i*pi*f))

spacing nit: H(exp(i*pi*f))

&gt; LayoutTests/webaudio/biquad-getFrequencyResponse.html:96
&gt; +        phase -= Math.PI;

Isn&apos;t this wrapping wrong: should be -= 2 * Math.PI;

&gt; LayoutTests/webaudio/biquad-getFrequencyResponse.html:98
&gt; +        phase += Math.PI;

ditto</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>569871</commentid>
    <comment_count>15</comment_count>
      <attachid>129944</attachid>
    <who name="Raymond Toy">rtoy</who>
    <bug_when>2012-03-02 13:08:21 -0800</bug_when>
    <thetext>Created attachment 129944
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>569874</commentid>
    <comment_count>16</comment_count>
      <attachid>129923</attachid>
    <who name="Raymond Toy">rtoy</who>
    <bug_when>2012-03-02 13:09:26 -0800</bug_when>
    <thetext>Comment on attachment 129923
Patch

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

&gt;&gt; LayoutTests/webaudio/biquad-getFrequencyResponse.html:73
&gt;&gt; +    // Compute H(exp(i * pi * f)).  No native complex numbers in javascript, so break H(exp(i*pi*f))
&gt; 
&gt; spacing nit: H(exp(i*pi*f))

Fixed.

&gt;&gt; LayoutTests/webaudio/biquad-getFrequencyResponse.html:96
&gt;&gt; +        phase -= Math.PI;
&gt; 
&gt; Isn&apos;t this wrapping wrong: should be -= 2 * Math.PI;

Fixed.

&gt;&gt; LayoutTests/webaudio/biquad-getFrequencyResponse.html:98
&gt;&gt; +        phase += Math.PI;
&gt; 
&gt; ditto

Fixed.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>569964</commentid>
    <comment_count>17</comment_count>
      <attachid>129944</attachid>
    <who name="WebKit Review Bot">webkit.review.bot</who>
    <bug_when>2012-03-02 14:56:17 -0800</bug_when>
    <thetext>Comment on attachment 129944
Patch

Attachment 129944 did not pass chromium-ews (chromium-xvfb):
Output: http://queues.webkit.org/results/11802150

New failing tests:
editing/selection/select-line-break-with-opposite-directionality.html</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>570010</commentid>
    <comment_count>18</comment_count>
      <attachid>129972</attachid>
    <who name="Raymond Toy">rtoy</who>
    <bug_when>2012-03-02 15:52:16 -0800</bug_when>
    <thetext>Created attachment 129972
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>570078</commentid>
    <comment_count>19</comment_count>
      <attachid>129972</attachid>
    <who name="WebKit Review Bot">webkit.review.bot</who>
    <bug_when>2012-03-02 18:44:33 -0800</bug_when>
    <thetext>Comment on attachment 129972
Patch

Rejecting attachment 129972 from commit-queue.

Failed to run &quot;[&apos;/mnt/git/webkit-commit-queue/Tools/Scripts/webkit-patch&apos;, &apos;--status-host=queues.webkit.org&apos;, &apos;-...&quot; exit_code: 1

Last 500 characters of output:
_by_email
    return self._reviewer_only(self.account_by_email(email))
  File &quot;/mnt/git/webkit-commit-queue/Tools/Scripts/webkitpy/common/config/committers.py&quot;, line 632, in account_by_email
    return self._email_to_account_map().get(email.lower()) if email else None
  File &quot;/mnt/git/webkit-commit-queue/Tools/Scripts/webkitpy/common/config/committers.py&quot;, line 525, in _email_to_account_map
    assert(email not in self._accounts_by_email)  # We should never have duplicate emails.
AssertionError

Full output: http://queues.webkit.org/results/11795260</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>570158</commentid>
    <comment_count>20</comment_count>
      <attachid>129972</attachid>
    <who name="WebKit Review Bot">webkit.review.bot</who>
    <bug_when>2012-03-03 10:56:05 -0800</bug_when>
    <thetext>Comment on attachment 129972
Patch

Clearing flags on attachment: 129972

Committed r109662: &lt;http://trac.webkit.org/changeset/109662&gt;</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>570159</commentid>
    <comment_count>21</comment_count>
    <who name="WebKit Review Bot">webkit.review.bot</who>
    <bug_when>2012-03-03 10:56:10 -0800</bug_when>
    <thetext>All reviewed patches have been landed.  Closing bug.</thetext>
  </long_desc>
      
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>128804</attachid>
            <date>2012-02-24 14:16:20 -0800</date>
            <delta_ts>2012-02-28 09:51:38 -0800</delta_ts>
            <desc>Patch</desc>
            <filename>bug-79503-20120224141619.patch</filename>
            <type>text/plain</type>
            <size>9298</size>
            <attacher name="Raymond Toy">rtoy</attacher>
            
              <data encoding="base64">U3VidmVyc2lvbiBSZXZpc2lvbjogMTA4NzIwCmRpZmYgLS1naXQgYS9MYXlvdXRUZXN0cy9DaGFu
Z2VMb2cgYi9MYXlvdXRUZXN0cy9DaGFuZ2VMb2cKaW5kZXggYmFmNjI3NTgwMTBhNjlmODRjZDU4
YWYwZmQzYzdiNWVhZDRiNTU4Mi4uMjE4ZTczNjIxZThjM2UyYWRjZjA4MGQ2ODdhYjJmZTFmOWI0
MzFhYyAxMDA2NDQKLS0tIGEvTGF5b3V0VGVzdHMvQ2hhbmdlTG9nCisrKyBiL0xheW91dFRlc3Rz
L0NoYW5nZUxvZwpAQCAtMSwzICsxLDE1IEBACisyMDEyLTAyLTI0ICBSYXltb25kIFRveSAgPHJ0
b3lAZ29vZ2xlLmNvbT4KKworICAgICAgICBCaXF1YWQgZ2V0RnJlcXVlbmN5UmVzcG9uc2UgbmVl
ZHMgYSBsYXlvdXQgdGVzdC4KKyAgICAgICAgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19i
dWcuY2dpP2lkPTc5NTAzCisKKyAgICAgICAgQWRkIHNpbXBsZSB0ZXN0IGdldEZyZXF1ZW5jeVJl
c3BvbnNlLgorICAgICAgICAKKyAgICAgICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChPT1BTISkuCisK
KyAgICAgICAgKiB3ZWJhdWRpby9iaXF1YWQtZ2V0RnJlcXVlbmN5UmVzcG9uc2UtZXhwZWN0ZWQu
dHh0OiBBZGRlZC4KKyAgICAgICAgKiB3ZWJhdWRpby9iaXF1YWQtZ2V0RnJlcXVlbmN5UmVzcG9u
c2UuaHRtbDogQWRkZWQuCisKIDIwMTItMDItMjMgIEtlbmljaGkgSXNoaWJhc2hpICA8YmFzaGlA
Y2hyb21pdW0ub3JnPgogCiAgICAgICAgIFVucmV2aWV3ZWQgdGVzdCBmaXggYWZ0ZXIgcjEwODY5
OS4KZGlmZiAtLWdpdCBhL0xheW91dFRlc3RzL3dlYmF1ZGlvL2JpcXVhZC1nZXRGcmVxdWVuY3lS
ZXNwb25zZS1leHBlY3RlZC50eHQgYi9MYXlvdXRUZXN0cy93ZWJhdWRpby9iaXF1YWQtZ2V0RnJl
cXVlbmN5UmVzcG9uc2UtZXhwZWN0ZWQudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAuLjc3ZDkyZWU4M2M4MTJhNDU4
MGE2YTgwNDg5ZmI5NzBjNzM4NjgwYzkKLS0tIC9kZXYvbnVsbAorKysgYi9MYXlvdXRUZXN0cy93
ZWJhdWRpby9iaXF1YWQtZ2V0RnJlcXVlbmN5UmVzcG9uc2UtZXhwZWN0ZWQudHh0CkBAIC0wLDAg
KzEsMTEgQEAKK1Rlc3QgQmlxdWFkIGdldEZyZXF1ZW5jeVJlc3BvbnNlKCkgZnVuY3Rpb25hbGl0
eS4KKworT24gc3VjY2VzcywgeW91IHdpbGwgc2VlIGEgc2VyaWVzIG9mICJQQVNTIiBtZXNzYWdl
cywgZm9sbG93ZWQgYnkgIlRFU1QgQ09NUExFVEUiLgorCitQQVNTIE1hZ25pdHVkZSByZXNwb25z
ZSB3aXRoaW4gYWNjZXB0YWJsZSB0aHJlc2hvbGQuCitQQVNTIFBoYXNlIHJlc3BvbnNlIHdpdGhp
biBhY2NlcHRhYmxlIHRocmVzaG9sZC4KK1BBU1MgRmlsdGVyIGZyZXF1ZW5jeSByZXNwb25zZSB3
YXMgY29ycmVjdC4KK1BBU1Mgc3VjY2Vzc2Z1bGx5UGFyc2VkIGlzIHRydWUKKworVEVTVCBDT01Q
TEVURQorCmRpZmYgLS1naXQgYS9MYXlvdXRUZXN0cy93ZWJhdWRpby9iaXF1YWQtZ2V0RnJlcXVl
bmN5UmVzcG9uc2UuaHRtbCBiL0xheW91dFRlc3RzL3dlYmF1ZGlvL2JpcXVhZC1nZXRGcmVxdWVu
Y3lSZXNwb25zZS5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAuLmZiZTlkMWUwZTk2MDNiY2VjYjQ2YzRhNTExZDU5
Yjg3M2VkM2NlMDUKLS0tIC9kZXYvbnVsbAorKysgYi9MYXlvdXRUZXN0cy93ZWJhdWRpby9iaXF1
YWQtZ2V0RnJlcXVlbmN5UmVzcG9uc2UuaHRtbApAQCAtMCwwICsxLDIzOSBAQAorPCFET0NUWVBF
IEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiI+Cis8
aHRtbD4KKzxoZWFkPgorPHNjcmlwdCBzcmM9InJlc291cmNlcy9hdWRpby10ZXN0aW5nLmpzIj48
L3NjcmlwdD4KKzxzY3JpcHQgc3JjPSJyZXNvdXJjZXMvYmlxdWFkLXRlc3RpbmcuanMiPjwvc2Ny
aXB0PgorPHNjcmlwdCBzcmM9Ii4uL2Zhc3QvanMvcmVzb3VyY2VzL2pzLXRlc3QtcHJlLmpzIj48
L3NjcmlwdD4KKzwvaGVhZD4KKworPGJvZHk+Cis8ZGl2IGlkPSJkZXNjcmlwdGlvbiI+PC9kaXY+
Cis8ZGl2IGlkPSJjb25zb2xlIj48L2Rpdj4KKworPHNjcmlwdD4KK2Rlc2NyaXB0aW9uKCJUZXN0
IEJpcXVhZCBnZXRGcmVxdWVuY3lSZXNwb25zZSgpIGZ1bmN0aW9uYWxpdHkuIik7CisKKy8vIFRl
c3QgdGhlIGZyZXF1ZW5jeSByZXNwb25zZSBvZiBhIGJpcXVhZCBmaWx0ZXIuICBXZSBjb21wdXRl
IHRoZSBmcmVxdWVuY3kgcmVzcG9uc2UgZm9yIGEgc2ltcGxlCisvLyBsb3dwYXNzIGJpcXVhZCBm
aWx0ZXIgYW5kIGNvbXBhcmUgaXQgd2l0aCB0aGUgZXhwZWN0ZWQgZnJlcXVlbmN5IHJlc3BvbnNl
LgorCit2YXIgY29udGV4dDsKKworLy8gVGhlIGJpcXVhZCBmaWx0ZXIgbm9kZS4KK3ZhciBmaWx0
ZXI7CisKKy8vIFRoZSBtYWduaXR1ZGUgcmVzcG9uc2Ugb2YgdGhlIGJpcXVhZCBmaWx0ZXIuCit2
YXIgbWFnUmVzcG9uc2U7CisKKy8vIFRoZSBwaGFzZSByZXNwb25zZSBvZiB0aGUgYmlxdWFkIGZp
bHRlci4KK3ZhciBwaGFzZVJlc3BvbnNlOworCisvLyBOdW1iZXIgb2YgZnJlcXVlbmN5IHNhbXBs
ZXMgdG8gdGFrZS4KK3ZhciBuRnJlcXVlbmN5U2FtcGxlcyA9IDEwMDA7CisKKy8vIFRoZSBmaWx0
ZXIgcHJvcGVydGllcwordmFyIGZpbHRlckN1dG9mZiA9IDEwMDAwOyAgLy8gSHouCit2YXIgZmls
dGVyUSA9IDUwOwordmFyIGZpbHRlckdhaW4gPSA1OworCisvLyBUaGUgbWF4aW11bSBhbGxvd2Vk
IGVycm9yIGluIHRoZSBtYWduaXR1ZGUgcmVzcG9uc2UuCit2YXIgbWF4QWxsb3dlZE1hZ0Vycm9y
ID0gMi4zZS00OworCisvLyBUaGUgbWF4aW11bSBhbGxvd2VkIGVycm9yIGluIHRoZSBwaGFzZSBy
ZXNwb25zZS4KK3ZhciBtYXhBbGxvd2VkUGhhc2VFcnJvciA9IDEuNGU1OworCisvLyBDb252ZXJ0
IGZyZXF1ZW5jeSBpbiBIeiB0byBhIG5vcm1hbGl6ZWQgZnJlcXVlbmN5LgorZnVuY3Rpb24gbm9y
bWFsaXplZEZyZXF1ZW5jeShmcmVxSHosIHNhbXBsZVJhdGUpCit7CisgICAgcmV0dXJuIGZyZXFI
eiAvIChzYW1wbGVSYXRlIC8gMik7Cit9CisKKy8vIEdldCB0aGUgZmlsdGVyIHJlc3BvbnNlIGF0
IGEgKG5vcm1hbGl6ZWQpIGZyZXF1ZW5jeSB8ZnwgZm9yIHRoZSBmaWx0ZXIgd2l0aCBjb2VmZmlj
aWVudHMgfGNvZWZ8LgorZnVuY3Rpb24gZ2V0UmVzcG9uc2VBdChjb2VmLCBmKQoreworICAgIHZh
ciBiMCA9IGNvZWYuYjA7CisgICAgdmFyIGIxID0gY29lZi5iMTsKKyAgICB2YXIgYjIgPSBjb2Vm
LmIyOworICAgIHZhciBhMSA9IGNvZWYuYTE7CisgICAgdmFyIGEyID0gY29lZi5hMjsKKworICAg
IC8vIEgoeikgPSAoYjAgKyBiMSAvIHogKyBiMiAvIHpeMikgLyAoMSArIGExIC8geiArIGEyIC8g
el4yKQorICAgIC8vCisgICAgLy8gQ29tcHV0ZSBIKGV4cChpICogcGkgKiBmKSkuICBObyBuYXRp
dmUgY29tcGxleCBudW1iZXJzIGluIGphdmFzY3JpcHQsIHNvIGJyZWFrCisgICAgLy8gSChleHAo
aSpwaSpmKSkgaW4gdG8gdGhlIHJlYWwgYW5kIGltYWdpbmFyeSBwYXJ0cyBvZiB0aGUgbnVtZXJh
dG9yIGFuZCBkZW5vbWluYXRvci4gIFRoZW4gdGhlCisgICAgLy8gbnVtZXJhdG9yIGlzCisgICAg
Ly8KKyAgICAvLyBiMiAqIGNvcygyKncpICsgYjEgKiBjb3ModykgKyBiMCAtIGkgKiAoYjEgKiBz
aW4odykgKyBiMiAqIHNpbigyKncpKQorICAgIC8vCisgICAgLy8gYW5kIHRoZSBkZW5vbWluYXRv
ciBpcworICAgIC8vCisgICAgLy8gMSArIGExICogY29zKHcpICsgYTIgKiBjb3MoMip3KSAtIGkg
KiAoYTEgKiBzaW4odykgKyBhMiAqIHNpbigyKncpKQorICAgIC8vCisgICAgLy8gd2hlcmUgdyA9
IHBpICogZgorICAgIC8vCisgICAgLy8gQ29tcHV0ZSB0aGUgbWFnbml0dWRlIGFuZCBwaGFzZSBm
cm9tIHRoZSByZWFsIGFuZCBpbWFnaW5hcnkgcGFydHMuCisKKyAgICB2YXIgb21lZ2EgPSBNYXRo
LlBJICogZjsKKyAgICB2YXIgbnVtZXJhdG9yUmVhbCA9IGIwICsgYjEgKiBNYXRoLmNvcyhvbWVn
YSkgKyBiMiAqIE1hdGguY29zKDIgKiBvbWVnYSk7CisgICAgdmFyIG51bWVyYXRvckltYWcgPSAt
KGIxICogTWF0aC5zaW4ob21lZ2EpICsgYjIgKiBNYXRoLnNpbigyICogb21lZ2EpKTsKKyAgICB2
YXIgZGVub21pbmF0b3JSZWFsID0gMSArIGExICogTWF0aC5jb3Mob21lZ2EpICsgYTIgKiBNYXRo
LmNvcygyICogb21lZ2EpOworICAgIHZhciBkZW5vbWluYXRvckltYWcgPSAtKGExICogTWF0aC5z
aW4ob21lZ2EpICsgYTIgKiBNYXRoLnNpbigyICogb21lZ2EpKTsKKworICAgIHZhciBtYWduaXR1
ZGUgPSBNYXRoLnNxcnQoKE1hdGgucG93KG51bWVyYXRvclJlYWwsIDIpICsgTWF0aC5wb3cobnVt
ZXJhdG9ySW1hZywgMikpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvIChNYXRoLnBv
dyhkZW5vbWluYXRvclJlYWwsIDIpICsgTWF0aC5wb3coZGVub21pbmF0b3JJbWFnLCAyKSkpOwor
ICAgIHZhciBwaGFzZSA9IE1hdGguYXRhbjIobnVtZXJhdG9ySW1hZywgbnVtZXJhdG9yUmVhbCkg
LSBNYXRoLmF0YW4yKGRlbm9taW5hdG9ySW1hZywgZGVub21pbmF0b3JSZWFsKTsKKyAgICAKKyAg
ICBpZiAocGhhc2UgPj0gTWF0aC5QSSkgeworICAgICAgICBwaGFzZSAtPSBNYXRoLlBJOworICAg
IH0gZWxzZSBpZiAocGhhc2UgPD0gLU1hdGguUEkpIHsKKyAgICAgICAgcGhhc2UgKz0gTWF0aC5Q
STsKKyAgICB9CisgICAKKyAgICByZXR1cm4ge21hZ25pdHVkZSA6IG1hZ25pdHVkZSwgcGhhc2Ug
OiBwaGFzZX07IAorfQorCisvLyBDb21wdXRlIHRoZSByZWZlcmVuY2UgZnJlcXVlbmN5IHJlc3Bv
bnNlIGZvciB0aGUgYmlxdWFkIGZpbHRlciB8ZmlsdGVyfCBhdCB0aGUgZnJlcXVlbmN5IHNhbXBs
ZXMKKy8vIGdpdmVuIGJ5IHxmcmVxdWVuY3lTYW1wbGVzfC4KK2Z1bmN0aW9uIGZyZXF1ZW5jeVJl
c3BvbnNlUmVmZXJlbmNlKGZpbHRlciwgZnJlcXVlbmN5U2FtcGxlcykKK3sKKyAgICB2YXIgc2Ft
cGxlUmF0ZSA9IGZpbHRlci5jb250ZXh0LnNhbXBsZVJhdGU7CisgICAgdmFyIG5vcm1hbGl6ZWRG
cmVxID0gbm9ybWFsaXplZEZyZXF1ZW5jeShmaWx0ZXIuZnJlcXVlbmN5LnZhbHVlLCBzYW1wbGVS
YXRlKTsKKyAgICB2YXIgZmlsdGVyQ29lZiA9IGNyZWF0ZUZpbHRlcihmaWx0ZXIudHlwZSwgbm9y
bWFsaXplZEZyZXEsIGZpbHRlci5RLnZhbHVlLCBmaWx0ZXIuZ2Fpbi52YWx1ZSk7CisKKyAgICB2
YXIgbWFnbml0dWRlID0gW107CisgICAgdmFyIHBoYXNlID0gW107CisKKyAgICBmb3IgKHZhciBr
ID0gMDsgayA8IGZyZXF1ZW5jeVNhbXBsZXMubGVuZ3RoOyArK2spIHsKKyAgICAgICAgdmFyIHJl
c3BvbnNlID0gZ2V0UmVzcG9uc2VBdChmaWx0ZXJDb2VmLCBub3JtYWxpemVkRnJlcXVlbmN5KGZy
ZXF1ZW5jeVNhbXBsZXNba10sIHNhbXBsZVJhdGUpKTsKKyAgICAgICAgbWFnbml0dWRlLnB1c2go
cmVzcG9uc2UubWFnbml0dWRlKTsKKyAgICAgICAgcGhhc2UucHVzaChyZXNwb25zZS5waGFzZSk7
CisgICAgfQorCisgICAgcmV0dXJuIHttYWduaXR1ZGUgOiBtYWduaXR1ZGUsIHBoYXNlIDogcGhh
c2V9OworfQorCisvLyBDb21wdXRlIHRoZSBzZXQgb2YgZnJlcXVlbmN5IHNhbXBsZXMuCitmdW5j
dGlvbiBjcmVhdGVGcmVxdWVuY3lTYW1wbGVBcnJheShuU2FtcGxlcywgc2FtcGxlUmF0ZSkKK3sK
KyAgICB2YXIgZnJlcVNhbXBsZXMgPSBuZXcgRmxvYXQzMkFycmF5KG5TYW1wbGVzKTsKKyAgICAK
KyAgICB2YXIgZnJlcURlbHRhID0gc2FtcGxlUmF0ZSAvIDIgLyBuU2FtcGxlczsKKworICAgIGZv
ciAodmFyIGsgPSAwOyBrIDwgblNhbXBsZXM7ICsraykgeworICAgICAgICBmcmVxU2FtcGxlc1tr
XSA9IGsgKiBmcmVxRGVsdGE7CisgICAgfQorCisgICAgcmV0dXJuIGZyZXFTYW1wbGVzOworfQor
CitmdW5jdGlvbiBsaW5lYXJUb0RlY2liZWxzKHgpCit7CisgICAgaWYgKHgpIHsKKyAgICAgICAg
cmV0dXJuIDIwICogTWF0aC5sb2coeCkgLyBNYXRoLkxOMTA7CisgICAgfSBlbHNlIHsKKyAgICAg
ICAgcmV0dXJuIC0xMDAwOworICAgIH0KK30KKworLy8gQ29tcGFyZSB0aGUgZnJlcXVlbmN5IHJl
c3BvbnNlIHdpdGggb3VyIGV4cGVjdGVkIHJlc3BvbnNlLgorZnVuY3Rpb24gY29tcGFyZVJlc3Bv
bnNlcyhmaWx0ZXIsIGZyZXEsIG1hZ1Jlc3BvbnNlLCBwaGFzZVJlc3BvbnNlKQoreworICAgIHZh
ciBleHBlY3RlZFJlc3BvbnNlID0gZnJlcXVlbmN5UmVzcG9uc2VSZWZlcmVuY2UoZmlsdGVyLCBm
cmVxKTsKKyAgICB2YXIgZXhwZWN0ZWRNYWduaXR1ZGUgPSBleHBlY3RlZFJlc3BvbnNlLm1hZ25p
dHVkZTsKKyAgICB2YXIgZXhwZWN0ZWRQaGFzZSA9IGV4cGVjdGVkUmVzcG9uc2UucGhhc2U7CisK
KyAgICB2YXIgbiA9IG1hZ1Jlc3BvbnNlLmxlbmd0aDsKKyAgICB2YXIgc3VjY2VzcyA9IHRydWU7
CisKKyAgICB2YXIgazsKKworICAgIHZhciBtYXhNYWdFcnJvciA9IC0xOworICAgIHZhciBtYXhN
YWdFcnJvckluZGV4ID0gLTE7CisKKyAgICBmb3IgKGsgPSAwOyBrIDwgbjsgKytrKSB7CisgICAg
ICAgIHZhciBlcnJvciA9IE1hdGguYWJzKGxpbmVhclRvRGVjaWJlbHMobWFnUmVzcG9uc2Vba10p
IC0gbGluZWFyVG9EZWNpYmVscyhleHBlY3RlZE1hZ25pdHVkZVtrXSkpOworICAgICAgICBpZiAo
ZXJyb3IgPiBtYXhNYWdFcnJvcikgeworICAgICAgICAgICAgbWF4TWFnRXJyb3IgPSBlcnJvcjsK
KyAgICAgICAgICAgIG1heE1hZ0Vycm9ySW5kZXggPSBrOworICAgICAgICB9CisgICAgfQorCisg
ICAgaWYgKG1heE1hZ0Vycm9yID4gbWF4QWxsb3dlZE1hZ0Vycm9yKSB7CisgICAgICAgIHZhciBt
ZXNzYWdlID0gIk1hZ25pdHVkZSAoaW4gZEIpIGVycm9yICgiICsgbWF4TWFnRXJyb3I7CisgICAg
ICAgIG1lc3NhZ2UgKz0gIikgZXhjZWVkZWQgdGhyZXNob2xkIGF0ICIgKyBmcmVxW21heE1hZ0Vy
cm9ySW5kZXhdOworICAgICAgICBtZXNzYWdlICs9ICIgSHouICBBY3R1YWw6ICIgKyBsaW5lYXJU
b0RlY2liZWxzKG1hZ1Jlc3BvbnNlW21heE1hZ0Vycm9ySW5kZXhdKTsKKyAgICAgICAgbWVzc2Fn
ZSArPSAiIGV4cGVjdGVkOiAiICsgbGluZWFyVG9EZWNpYmVscyhleHBlY3RlZE1hZ25pdHVkZVtt
YXhNYWdFcnJvckluZGV4XSk7CisgICAgICAgIHRlc3RGYWlsZWQobWVzc2FnZSk7CisgICAgICAg
IHN1Y2Nlc3MgPSBmYWxzZTsKKyAgICB9IGVsc2UgeworICAgICAgICB0ZXN0UGFzc2VkKCJNYWdu
aXR1ZGUgcmVzcG9uc2Ugd2l0aGluIGFjY2VwdGFibGUgdGhyZXNob2xkLiIpOworICAgIH0KKwor
ICAgIHZhciBtYXhQaGFzZUVycm9yID0gLTE7CisgICAgdmFyIG1heFBoYXNlRXJyb3JJbmRleCA9
IC0xOworCisgICAgZm9yIChrID0gMDsgayA8IG47ICsraykgeworICAgICAgICB2YXIgZXJyb3Ig
PSBNYXRoLmFicyhwaGFzZVJlc3BvbnNlW2tdIC0gZXhwZWN0ZWRQaGFzZVtrXSk7CisgICAgICAg
IGlmIChlcnJvciA+IG1heFBoYXNlRXJyb3IpIHsKKyAgICAgICAgICAgIG1heFBoYXNlRXJyb3Ig
PSBlcnJvcjsKKyAgICAgICAgICAgIG1heFBoYXNlRXJyb3JJbmRleCA9IGs7CisgICAgICAgIH0K
KyAgICB9CisKKyAgICBpZiAobWF4UGhhc2VFcnJvciA+IG1heEFsbG93ZWRQaGFzZUVycm9yKSB7
CisgICAgICAgIHZhciBtZXNzYWdlID0gIlBoYXNlIGVycm9yICgiICsgbWF4UGhhc2VFcnJvcjsK
KyAgICAgICAgbWVzc2FnZSArPSAiKSBleGNlZWRlZCB0aHJlc2hvbGQgYXQgIiArIGZyZXFbbWF4
UGhhc2VFcnJvckluZGV4XTsKKyAgICAgICAgbWVzc2FnZSArPSAiIEh6LiAgQWN0dWFsOiAiICsg
cGhhc2VSZXNwb25zZVttYXhQaGFzZUVycm9ySW5kZXhdOworICAgICAgICBtZXNzYWdlICs9ICIg
ZXhwZWN0ZWQ6ICIgKyBleHBlY3RlZFBoYXNlW21heFBoYXNlRXJyb3JJbmRleF07CisgICAgICAg
IHRlc3RGYWlsZWQobWVzc2FnZSk7CisgICAgICAgIHN1Y2Nlc3MgPSBmYWxzZTsKKyAgICB9IGVs
c2UgeworICAgICAgICB0ZXN0UGFzc2VkKCJQaGFzZSByZXNwb25zZSB3aXRoaW4gYWNjZXB0YWJs
ZSB0aHJlc2hvbGQuIik7CisgICAgfQorCisgICAgcmV0dXJuIHN1Y2Nlc3M7Cit9CisKK2Z1bmN0
aW9uIHJ1blRlc3QoKQoreworICAgIGlmICh3aW5kb3cubGF5b3V0VGVzdENvbnRyb2xsZXIpIHsK
KyAgICAgICAgbGF5b3V0VGVzdENvbnRyb2xsZXIuZHVtcEFzVGV4dCgpOworICAgICAgICBsYXlv
dXRUZXN0Q29udHJvbGxlci53YWl0VW50aWxEb25lKCk7CisgICAgfQorCisgICAgd2luZG93Lmpz
VGVzdElzQXN5bmMgPSB0cnVlOworCisgICAgY29udGV4dCA9IG5ldyB3ZWJraXRBdWRpb0NvbnRl
eHQoKTsKKyAgICAKKyAgICBmaWx0ZXIgPSBjb250ZXh0LmNyZWF0ZUJpcXVhZEZpbHRlcigpOwor
CisgICAgLy8gQXJiaXRyYXJpbHkgdGVzdCBhIGxvd3Bhc3MgZmlsdGVyLCBidXQgYW55IGtpbmQg
b2YgZmlsdGVyIGNhbiBiZSB0ZXN0ZWQuICAoU2hvdWxkIHdlIHRlc3QgYWxsCisgICAgLy8gdGhl
IGZpbHRlciB0eXBlcz8pCisgICAgZmlsdGVyLnR5cGUgPSBmaWx0ZXIuTE9XUEFTUzsKKyAgICBm
aWx0ZXIuZnJlcXVlbmN5LnZhbHVlID0gZmlsdGVyQ3V0b2ZmOworICAgIGZpbHRlci5RLnZhbHVl
ID0gZmlsdGVyUTsKKyAgICBmaWx0ZXIuZ2Fpbi52YWx1ZSA9IGZpbHRlckdhaW47CisKKyAgICBm
cmVxU2FtcGxlcyA9IGNyZWF0ZUZyZXF1ZW5jeVNhbXBsZUFycmF5KG5GcmVxdWVuY3lTYW1wbGVz
LCBjb250ZXh0LnNhbXBsZVJhdGUpOworICAgIG1hZ1Jlc3BvbnNlID0gbmV3IEZsb2F0MzJBcnJh
eShuRnJlcXVlbmN5U2FtcGxlcyk7CisgICAgcGhhc2VSZXNwb25zZSA9IG5ldyBGbG9hdDMyQXJy
YXkobkZyZXF1ZW5jeVNhbXBsZXMpOworCisgICAgZmlsdGVyLmdldEZyZXF1ZW5jeVJlc3BvbnNl
KGZyZXFTYW1wbGVzLCBtYWdSZXNwb25zZSwgcGhhc2VSZXNwb25zZSk7CisgICAgdmFyIHN1Y2Nl
c3MgPSBjb21wYXJlUmVzcG9uc2VzKGZpbHRlciwgZnJlcVNhbXBsZXMsIG1hZ1Jlc3BvbnNlLCBw
aGFzZVJlc3BvbnNlKTsKKworICAgIGlmIChzdWNjZXNzKSB7CisgICAgICAgIHRlc3RQYXNzZWQo
IkZpbHRlciBmcmVxdWVuY3kgcmVzcG9uc2Ugd2FzIGNvcnJlY3QuIik7CisgICAgfSBlbHNlIHsK
KyAgICAgICAgdGVzdEZhaWxlZCgiRmlsdGVyIGZyZXF1ZW5jeSByZXNwb25zZSB3YXMgaW5jb3Jy
ZWN0LiIpOworICAgIH0KKworICAgIGZpbmlzaEpTVGVzdCgpOworfQorCitydW5UZXN0KCk7Citz
dWNjZXNzZnVsbHlQYXJzZWQgPSB0cnVlOworCis8L3NjcmlwdD4KKworPHNjcmlwdCBzcmM9Ii4u
L2Zhc3QvanMvcmVzb3VyY2VzL2pzLXRlc3QtcG9zdC5qcyI+PC9zY3JpcHQ+Cis8L2JvZHk+Cis8
L2h0bWw+Cg==
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>129281</attachid>
            <date>2012-02-28 09:49:43 -0800</date>
            <delta_ts>2012-02-28 14:07:44 -0800</delta_ts>
            <desc>Patch</desc>
            <filename>bug-79503-20120228094942.patch</filename>
            <type>text/plain</type>
            <size>11327</size>
            <attacher name="Raymond Toy">rtoy</attacher>
            
              <data encoding="base64">U3VidmVyc2lvbiBSZXZpc2lvbjogMTA4OTgzCmRpZmYgLS1naXQgYS9MYXlvdXRUZXN0cy9DaGFu
Z2VMb2cgYi9MYXlvdXRUZXN0cy9DaGFuZ2VMb2cKaW5kZXggNjIzZTVhMmJhZDIyZWM2YWUxM2Vi
NjY4ZjBjNzExODE5Y2QwYTVmOS4uMDdjNTg1ZGNkYzI0NjQ4NjYzNWEyNjUyZDE2NWQ2Yjk0N2M5
OGFhZCAxMDA2NDQKLS0tIGEvTGF5b3V0VGVzdHMvQ2hhbmdlTG9nCisrKyBiL0xheW91dFRlc3Rz
L0NoYW5nZUxvZwpAQCAtMSwzICsxLDE1IEBACisyMDEyLTAyLTI0ICBSYXltb25kIFRveSAgPHJ0
b3lAZ29vZ2xlLmNvbT4KKworICAgICAgICBCaXF1YWQgZ2V0RnJlcXVlbmN5UmVzcG9uc2UgbmVl
ZHMgYSBsYXlvdXQgdGVzdC4KKyAgICAgICAgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19i
dWcuY2dpP2lkPTc5NTAzCisKKyAgICAgICAgQWRkIHNpbXBsZSB0ZXN0IGZvciBnZXRGcmVxdWVu
Y3lSZXNwb25zZS4KKyAgICAgICAgCisgICAgICAgIFJldmlld2VkIGJ5IE5PQk9EWSAoT09QUyEp
LgorCisgICAgICAgICogd2ViYXVkaW8vYmlxdWFkLWdldEZyZXF1ZW5jeVJlc3BvbnNlLWV4cGVj
dGVkLnR4dDogQWRkZWQuCisgICAgICAgICogd2ViYXVkaW8vYmlxdWFkLWdldEZyZXF1ZW5jeVJl
c3BvbnNlLmh0bWw6IEFkZGVkLgorCiAyMDEyLTAyLTI3ICBNT1JJVEEgSGFqaW1lICA8bW9ycml0
YUBnb29nbGUuY29tPgogCiAgICAgICAgIFJlbW92aW5nIDx1bD4sIDxsaT4gaW5zaWRlIHNoYWRv
dyBET00gdHJpZ2dlcnMgYXNzZXJ0aW9uIGluIHVwZGF0ZUxpc3RNYXJrZXJOdW1iZXJzCmRpZmYg
LS1naXQgYS9MYXlvdXRUZXN0cy93ZWJhdWRpby9iaXF1YWQtZ2V0RnJlcXVlbmN5UmVzcG9uc2Ut
ZXhwZWN0ZWQudHh0IGIvTGF5b3V0VGVzdHMvd2ViYXVkaW8vYmlxdWFkLWdldEZyZXF1ZW5jeVJl
c3BvbnNlLWV4cGVjdGVkLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwLi43N2Q5MmVlODNjODEyYTQ1ODBhNmE4MDQ4
OWZiOTcwYzczODY4MGM5Ci0tLSAvZGV2L251bGwKKysrIGIvTGF5b3V0VGVzdHMvd2ViYXVkaW8v
YmlxdWFkLWdldEZyZXF1ZW5jeVJlc3BvbnNlLWV4cGVjdGVkLnR4dApAQCAtMCwwICsxLDExIEBA
CitUZXN0IEJpcXVhZCBnZXRGcmVxdWVuY3lSZXNwb25zZSgpIGZ1bmN0aW9uYWxpdHkuCisKK09u
IHN1Y2Nlc3MsIHlvdSB3aWxsIHNlZSBhIHNlcmllcyBvZiAiUEFTUyIgbWVzc2FnZXMsIGZvbGxv
d2VkIGJ5ICJURVNUIENPTVBMRVRFIi4KKworUEFTUyBNYWduaXR1ZGUgcmVzcG9uc2Ugd2l0aGlu
IGFjY2VwdGFibGUgdGhyZXNob2xkLgorUEFTUyBQaGFzZSByZXNwb25zZSB3aXRoaW4gYWNjZXB0
YWJsZSB0aHJlc2hvbGQuCitQQVNTIEZpbHRlciBmcmVxdWVuY3kgcmVzcG9uc2Ugd2FzIGNvcnJl
Y3QuCitQQVNTIHN1Y2Nlc3NmdWxseVBhcnNlZCBpcyB0cnVlCisKK1RFU1QgQ09NUExFVEUKKwpk
aWZmIC0tZ2l0IGEvTGF5b3V0VGVzdHMvd2ViYXVkaW8vYmlxdWFkLWdldEZyZXF1ZW5jeVJlc3Bv
bnNlLmh0bWwgYi9MYXlvdXRUZXN0cy93ZWJhdWRpby9iaXF1YWQtZ2V0RnJlcXVlbmN5UmVzcG9u
c2UuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwLi5lOWNmZGMxOTM1ZmUxMTg1NGJjNWViZDk0YTc2M2M3MTI5ZDMz
YzQxCi0tLSAvZGV2L251bGwKKysrIGIvTGF5b3V0VGVzdHMvd2ViYXVkaW8vYmlxdWFkLWdldEZy
ZXF1ZW5jeVJlc3BvbnNlLmh0bWwKQEAgLTAsMCArMSwzMDIgQEAKKzwhRE9DVFlQRSBIVE1MIFBV
QkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iPgorPGh0bWw+Cis8
aGVhZD4KKzxzY3JpcHQgc3JjPSJyZXNvdXJjZXMvYXVkaW8tdGVzdGluZy5qcyI+PC9zY3JpcHQ+
Cis8c2NyaXB0IHNyYz0icmVzb3VyY2VzL2JpcXVhZC10ZXN0aW5nLmpzIj48L3NjcmlwdD4KKzxz
Y3JpcHQgc3JjPSIuLi9mYXN0L2pzL3Jlc291cmNlcy9qcy10ZXN0LXByZS5qcyI+PC9zY3JpcHQ+
Cis8L2hlYWQ+CisKKzxib2R5PgorPGRpdiBpZD0iZGVzY3JpcHRpb24iPjwvZGl2PgorPGRpdiBp
ZD0iY29uc29sZSI+PC9kaXY+CisKKzxzY3JpcHQ+CitkZXNjcmlwdGlvbigiVGVzdCBCaXF1YWQg
Z2V0RnJlcXVlbmN5UmVzcG9uc2UoKSBmdW5jdGlvbmFsaXR5LiIpOworCisvLyBUZXN0IHRoZSBm
cmVxdWVuY3kgcmVzcG9uc2Ugb2YgYSBiaXF1YWQgZmlsdGVyLiAgV2UgY29tcHV0ZSB0aGUgZnJl
cXVlbmN5IHJlc3BvbnNlIGZvciBhIHNpbXBsZQorLy8gbG93cGFzcyBiaXF1YWQgZmlsdGVyIGFu
ZCBjb21wYXJlIGl0IHdpdGggdGhlIGV4cGVjdGVkIGZyZXF1ZW5jeSByZXNwb25zZS4KKwordmFy
IGNvbnRleHQ7CisKKy8vIFRoZSBiaXF1YWQgZmlsdGVyIG5vZGUuCit2YXIgZmlsdGVyOworCisv
LyBUaGUgbWFnbml0dWRlIHJlc3BvbnNlIG9mIHRoZSBiaXF1YWQgZmlsdGVyLgordmFyIG1hZ1Jl
c3BvbnNlOworCisvLyBUaGUgcGhhc2UgcmVzcG9uc2Ugb2YgdGhlIGJpcXVhZCBmaWx0ZXIuCit2
YXIgcGhhc2VSZXNwb25zZTsKKworLy8gTnVtYmVyIG9mIGZyZXF1ZW5jeSBzYW1wbGVzIHRvIHRh
a2UuCit2YXIgbkZyZXF1ZW5jeVNhbXBsZXMgPSAxMDAwOworCisvLyBUaGUgZmlsdGVyIHByb3Bl
cnRpZXMKK3ZhciBmaWx0ZXJDdXRvZmYgPSAxMDAwOyAgLy8gSHouCit2YXIgZmlsdGVyUSA9IDE7
Cit2YXIgZmlsdGVyR2FpbiA9IDU7CisKKy8vIFRoZSBtYXhpbXVtIGFsbG93ZWQgZXJyb3IgaW4g
dGhlIG1hZ25pdHVkZSByZXNwb25zZS4KK3ZhciBtYXhBbGxvd2VkTWFnRXJyb3IgPSA1LjdlLTc7
CisKKy8vIFRoZSBtYXhpbXVtIGFsbG93ZWQgZXJyb3IgaW4gdGhlIHBoYXNlIHJlc3BvbnNlLgor
dmFyIG1heEFsbG93ZWRQaGFzZUVycm9yID0gNC4wZS04OworCisvLyBDb252ZXJ0IGZyZXF1ZW5j
eSBpbiBIeiB0byBhIG5vcm1hbGl6ZWQgZnJlcXVlbmN5LgorZnVuY3Rpb24gbm9ybWFsaXplZEZy
ZXF1ZW5jeShmcmVxSHosIHNhbXBsZVJhdGUpCit7CisgICAgcmV0dXJuIGZyZXFIeiAvIChzYW1w
bGVSYXRlIC8gMik7Cit9CisKKy8vIEdldCB0aGUgZmlsdGVyIHJlc3BvbnNlIGF0IGEgKG5vcm1h
bGl6ZWQpIGZyZXF1ZW5jeSB8ZnwgZm9yIHRoZSBmaWx0ZXIgd2l0aCBjb2VmZmljaWVudHMgfGNv
ZWZ8LgorZnVuY3Rpb24gZ2V0UmVzcG9uc2VBdChjb2VmLCBmKQoreworICAgIHZhciBiMCA9IGNv
ZWYuYjA7CisgICAgdmFyIGIxID0gY29lZi5iMTsKKyAgICB2YXIgYjIgPSBjb2VmLmIyOworICAg
IHZhciBhMSA9IGNvZWYuYTE7CisgICAgdmFyIGEyID0gY29lZi5hMjsKKworICAgIC8vIEgoeikg
PSAoYjAgKyBiMSAvIHogKyBiMiAvIHpeMikgLyAoMSArIGExIC8geiArIGEyIC8gel4yKQorICAg
IC8vCisgICAgLy8gQ29tcHV0ZSBIKGV4cChpICogcGkgKiBmKSkuICBObyBuYXRpdmUgY29tcGxl
eCBudW1iZXJzIGluIGphdmFzY3JpcHQsIHNvIGJyZWFrCisgICAgLy8gSChleHAoaSpwaSpmKSkg
aW4gdG8gdGhlIHJlYWwgYW5kIGltYWdpbmFyeSBwYXJ0cyBvZiB0aGUgbnVtZXJhdG9yIGFuZCBk
ZW5vbWluYXRvci4gIFRoZW4gdGhlCisgICAgLy8gbnVtZXJhdG9yIGlzCisgICAgLy8KKyAgICAv
LyBiMiAqIGNvcygyKncpICsgYjEgKiBjb3ModykgKyBiMCAtIGkgKiAoYjEgKiBzaW4odykgKyBi
MiAqIHNpbigyKncpKQorICAgIC8vCisgICAgLy8gYW5kIHRoZSBkZW5vbWluYXRvciBpcworICAg
IC8vCisgICAgLy8gMSArIGExICogY29zKHcpICsgYTIgKiBjb3MoMip3KSAtIGkgKiAoYTEgKiBz
aW4odykgKyBhMiAqIHNpbigyKncpKQorICAgIC8vCisgICAgLy8gd2hlcmUgdyA9IHBpICogZgor
ICAgIC8vCisgICAgLy8gQ29tcHV0ZSB0aGUgbWFnbml0dWRlIGFuZCBwaGFzZSBmcm9tIHRoZSBy
ZWFsIGFuZCBpbWFnaW5hcnkgcGFydHMuCisKKyAgICB2YXIgb21lZ2EgPSBNYXRoLlBJICogZjsK
KyAgICB2YXIgbnVtZXJhdG9yUmVhbCA9IGIwICsgYjEgKiBNYXRoLmNvcyhvbWVnYSkgKyBiMiAq
IE1hdGguY29zKDIgKiBvbWVnYSk7CisgICAgdmFyIG51bWVyYXRvckltYWcgPSAtKGIxICogTWF0
aC5zaW4ob21lZ2EpICsgYjIgKiBNYXRoLnNpbigyICogb21lZ2EpKTsKKyAgICB2YXIgZGVub21p
bmF0b3JSZWFsID0gMSArIGExICogTWF0aC5jb3Mob21lZ2EpICsgYTIgKiBNYXRoLmNvcygyICog
b21lZ2EpOworICAgIHZhciBkZW5vbWluYXRvckltYWcgPSAtKGExICogTWF0aC5zaW4ob21lZ2Ep
ICsgYTIgKiBNYXRoLnNpbigyICogb21lZ2EpKTsKKworICAgIHZhciBtYWduaXR1ZGUgPSBNYXRo
LnNxcnQoKE1hdGgucG93KG51bWVyYXRvclJlYWwsIDIpICsgTWF0aC5wb3cobnVtZXJhdG9ySW1h
ZywgMikpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvIChNYXRoLnBvdyhkZW5vbWlu
YXRvclJlYWwsIDIpICsgTWF0aC5wb3coZGVub21pbmF0b3JJbWFnLCAyKSkpOworICAgIHZhciBw
aGFzZSA9IE1hdGguYXRhbjIobnVtZXJhdG9ySW1hZywgbnVtZXJhdG9yUmVhbCkgLSBNYXRoLmF0
YW4yKGRlbm9taW5hdG9ySW1hZywgZGVub21pbmF0b3JSZWFsKTsKKyAgICAKKyAgICBpZiAocGhh
c2UgPj0gTWF0aC5QSSkgeworICAgICAgICBwaGFzZSAtPSBNYXRoLlBJOworICAgIH0gZWxzZSBp
ZiAocGhhc2UgPD0gLU1hdGguUEkpIHsKKyAgICAgICAgcGhhc2UgKz0gTWF0aC5QSTsKKyAgICB9
CisgICAKKyAgICByZXR1cm4ge21hZ25pdHVkZSA6IG1hZ25pdHVkZSwgcGhhc2UgOiBwaGFzZX07
IAorfQorCisvLyBDb21wdXRlIHRoZSByZWZlcmVuY2UgZnJlcXVlbmN5IHJlc3BvbnNlIGZvciB0
aGUgYmlxdWFkIGZpbHRlciB8ZmlsdGVyfCBhdCB0aGUgZnJlcXVlbmN5IHNhbXBsZXMKKy8vIGdp
dmVuIGJ5IHxmcmVxdWVuY3lTYW1wbGVzfC4KK2Z1bmN0aW9uIGZyZXF1ZW5jeVJlc3BvbnNlUmVm
ZXJlbmNlKGZpbHRlciwgZnJlcXVlbmN5U2FtcGxlcykKK3sKKyAgICB2YXIgc2FtcGxlUmF0ZSA9
IGZpbHRlci5jb250ZXh0LnNhbXBsZVJhdGU7CisgICAgdmFyIG5vcm1hbGl6ZWRGcmVxID0gbm9y
bWFsaXplZEZyZXF1ZW5jeShmaWx0ZXIuZnJlcXVlbmN5LnZhbHVlLCBzYW1wbGVSYXRlKTsKKyAg
ICB2YXIgZmlsdGVyQ29lZiA9IGNyZWF0ZUZpbHRlcihmaWx0ZXIudHlwZSwgbm9ybWFsaXplZEZy
ZXEsIGZpbHRlci5RLnZhbHVlLCBmaWx0ZXIuZ2Fpbi52YWx1ZSk7CisKKyAgICB2YXIgbWFnbml0
dWRlID0gW107CisgICAgdmFyIHBoYXNlID0gW107CisKKyAgICBmb3IgKHZhciBrID0gMDsgayA8
IGZyZXF1ZW5jeVNhbXBsZXMubGVuZ3RoOyArK2spIHsKKyAgICAgICAgdmFyIHJlc3BvbnNlID0g
Z2V0UmVzcG9uc2VBdChmaWx0ZXJDb2VmLCBub3JtYWxpemVkRnJlcXVlbmN5KGZyZXF1ZW5jeVNh
bXBsZXNba10sIHNhbXBsZVJhdGUpKTsKKyAgICAgICAgbWFnbml0dWRlLnB1c2gocmVzcG9uc2Uu
bWFnbml0dWRlKTsKKyAgICAgICAgcGhhc2UucHVzaChyZXNwb25zZS5waGFzZSk7CisgICAgfQor
CisgICAgcmV0dXJuIHttYWduaXR1ZGUgOiBtYWduaXR1ZGUsIHBoYXNlIDogcGhhc2V9OworfQor
CisvLyBDb21wdXRlIHRoZSBzZXQgb2YgZnJlcXVlbmN5IHNhbXBsZXMuCitmdW5jdGlvbiBjcmVh
dGVGcmVxdWVuY3lTYW1wbGVBcnJheShuU2FtcGxlcywgc2FtcGxlUmF0ZSkKK3sKKyAgICB2YXIg
ZnJlcVNhbXBsZXMgPSBuZXcgRmxvYXQzMkFycmF5KG5TYW1wbGVzKTsKKyAgICAKKyAgICB2YXIg
ZnJlcURlbHRhID0gc2FtcGxlUmF0ZSAvIDIgLyBuU2FtcGxlczsKKworICAgIGZvciAodmFyIGsg
PSAwOyBrIDwgblNhbXBsZXM7ICsraykgeworICAgICAgICBmcmVxU2FtcGxlc1trXSA9IGsgKiBm
cmVxRGVsdGE7CisgICAgfQorCisgICAgcmV0dXJuIGZyZXFTYW1wbGVzOworfQorCitmdW5jdGlv
biBsaW5lYXJUb0RlY2liZWxzKHgpCit7CisgICAgaWYgKHgpIHsKKyAgICAgICAgcmV0dXJuIDIw
ICogTWF0aC5sb2coeCkgLyBNYXRoLkxOMTA7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJu
IC0xMDAwOworICAgIH0KK30KKworLy8gTG9vayB0aHJvdWdoIHRoZSBhcnJheSBhbmQgZmluZCBh
bnkgTmFOIG9yIGluZmluaXR5LiAgUmV0dXJuIHRoZSBpbmRleCBvZiB0aGUgZmlyc3Qgc3VjaCBu
dW1iZXIuCisvLyBJZiBubyBzdWNoIG51bWJlciwgcmV0dXJucyBmYWxzZS4KK2Z1bmN0aW9uIGZp
bmRCYWROdW1iZXIoc2lnbmFsKQoreworICAgIGZvciAodmFyIGsgPSAwOyBrIDwgc2lnbmFsLmxl
bmd0aDsgKytrKSB7CisgICAgICAgICBpZiAoIWlzVmFsaWROdW1iZXIoc2lnbmFsW2tdKSkgewor
ICAgICAgICAgICAgcmV0dXJuIGs7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGZhbHNl
OworfQorCisvLyBDb21wdXRlIGFic29sdXRlIHZhbHVlIG9mIHRoZSBkaWZmZXJlbmNlIGJldHdl
ZW4gcGhhc2UgYW5nbGVzLCB0YWtpbmcgaW50byBhY2NvdW50IHRoZSB3cmFwcGluZworLy8gb2Yg
cGhhc2VzLgorZnVuY3Rpb24gYWJzb2x1dGVQaGFzZURpZmZlcmVuY2UoeCwgeSkKK3sKKyAgICB2
YXIgZGlmZiA9IE1hdGguYWJzKHggLSB5KTsKKyAgICAKKyAgICBpZiAoZGlmZiA+IE1hdGguUEkp
IHsKKyAgICAgICAgZGlmZiA9IDIgKiBNYXRoLlBJIC0gZGlmZjsKKyAgICB9CisgICAgcmV0dXJu
IGRpZmY7Cit9CisKKy8vIENvbXBhcmUgdGhlIGZyZXF1ZW5jeSByZXNwb25zZSB3aXRoIG91ciBl
eHBlY3RlZCByZXNwb25zZS4KK2Z1bmN0aW9uIGNvbXBhcmVSZXNwb25zZXMoZmlsdGVyLCBmcmVx
LCBtYWdSZXNwb25zZSwgcGhhc2VSZXNwb25zZSkKK3sKKyAgICB2YXIgZXhwZWN0ZWRSZXNwb25z
ZSA9IGZyZXF1ZW5jeVJlc3BvbnNlUmVmZXJlbmNlKGZpbHRlciwgZnJlcSk7CisgICAgdmFyIGV4
cGVjdGVkTWFnbml0dWRlID0gZXhwZWN0ZWRSZXNwb25zZS5tYWduaXR1ZGU7CisgICAgdmFyIGV4
cGVjdGVkUGhhc2UgPSBleHBlY3RlZFJlc3BvbnNlLnBoYXNlOworCisgICAgdmFyIG4gPSBtYWdS
ZXNwb25zZS5sZW5ndGg7CisgICAgdmFyIHN1Y2Nlc3MgPSB0cnVlOworICAgIHZhciBiYWRSZXNw
b25zZSA9IGZhbHNlOworCisgICAgdmFyIG1heE1hZ0Vycm9yID0gLTE7CisgICAgdmFyIG1heE1h
Z0Vycm9ySW5kZXggPSAtMTsKKworICAgIHZhciBrOworICAgIHZhciBoYXNCYWROdW1iZXI7CisK
KyAgICBoYXNCYWROdW1iZXIgPSBmaW5kQmFkTnVtYmVyKG1hZ1Jlc3BvbnNlKTsKKyAgICBpZiAo
aGFzQmFkTnVtYmVyKSB7CisgICAgICAgIHRlc3RGYWlsZWQoIk1hZ25pdHVkZSByZXNwb25zZSBo
YXMgTmFOIG9yIGluZmluaXR5IGF0ICIgKyBoYXNCYWROdW1iZXIpOworICAgICAgICBzdWNjZXNz
ID0gZmFsc2U7CisgICAgICAgIGJhZFJlc3BvbnNlID0gdHJ1ZTsKKyAgICB9CisKKyAgICBoYXNC
YWROdW1iZXIgPSBmaW5kQmFkTnVtYmVyKHBoYXNlUmVzcG9uc2UpOworICAgIGlmIChoYXNCYWRO
dW1iZXIpIHsKKyAgICAgICAgdGVzdEZhaWxlZCgiUGhhc2UgcmVzcG9uc2UgaGFzIE5hTiBvciBp
bmZpbml0eSBhdCAiICsgaGFzQmFkTnVtYmVyKTsKKyAgICAgICAgc3VjY2VzcyA9IGZhbHNlOwor
ICAgICAgICBiYWRSZXNwb25zZSA9IHRydWU7CisgICAgfQorCisgICAgaGFzQmFkTnVtYmVyID0g
ZmluZEJhZE51bWJlcihleHBlY3RlZE1hZ25pdHVkZSk7CisgICAgaWYgKGhhc0JhZE51bWJlcikg
eworICAgICAgICB0ZXN0RmFpbGVkKCJFeHBlY3RlZCBtYWduaXR1ZGUgcmVzcG9uc2UgaGFzIE5h
TiBvciBpbmZpbml0eSBhdCAiICsgaGFzQmFkTnVtYmVyKTsKKyAgICAgICAgc3VjY2VzcyA9IGZh
bHNlOworICAgICAgICBiYWRSZXNwb25zZSA9IHRydWU7CisgICAgfQorCisgICAgaGFzQmFkTnVt
YmVyID0gZmluZEJhZE51bWJlcihleHBlY3RlZFBoYXNlKTsKKyAgICBpZiAoaGFzQmFkTnVtYmVy
KSB7CisgICAgICAgIHRlc3RGYWlsZWQoIkV4cGVjdGVkIHBoYXNlIHJlc3BvbnNlIGhhcyBOYU4g
b3IgaW5maW5pdHkgYXQgIiArIGhhc0JhZE51bWJlcik7CisgICAgICAgIHN1Y2Nlc3MgPSBmYWxz
ZTsKKyAgICAgICAgYmFkUmVzcG9uc2UgPSB0cnVlOworICAgIH0KKworICAgIC8vIElmIHdlIGZv
dW5kIGEgTmFOIG9yIGluZmluaXR5LCB0aGUgZm9sbG93aW5nIHRlc3RzIGFyZW4ndCB2ZXJ5IGhl
bHBmdWwsIGVzcGVjaWFsbHkgZm9yIE5hTi4KKyAgICAvLyBXZSBydW4gdGhlbSBhbnl3YXksIGFm
dGVyIHByaW50aW5nIGEgd2FybmluZyBtZXNzYWdlLgorCisgICAgaWYgKGJhZFJlc3BvbnNlKSB7
CisgICAgICAgIHRlc3RGYWlsZWQoIk5hTiBvciBpbmZpbml0eSBpbiB0aGUgYWN0dWFsIG9yIGV4
cGVjdGVkIHJlc3VsdHMgbWFrZXMgdGhlIGZvbGxvd2luZyB0ZXN0IHJlc3VsdHMgc3VzcGVjdC4i
KTsKKyAgICAgICAgc3VjY2VzcyA9IGZhbHNlOworICAgIH0KKworICAgIGZvciAoayA9IDA7IGsg
PCBuOyArK2spIHsKKyAgICAgICAgdmFyIGVycm9yID0gTWF0aC5hYnMobGluZWFyVG9EZWNpYmVs
cyhtYWdSZXNwb25zZVtrXSkgLSBsaW5lYXJUb0RlY2liZWxzKGV4cGVjdGVkTWFnbml0dWRlW2td
KSk7CisgICAgICAgIGlmIChlcnJvciA+IG1heE1hZ0Vycm9yKSB7CisgICAgICAgICAgICBtYXhN
YWdFcnJvciA9IGVycm9yOworICAgICAgICAgICAgbWF4TWFnRXJyb3JJbmRleCA9IGs7CisgICAg
ICAgIH0KKyAgICB9CisKKyAgICBpZiAobWF4TWFnRXJyb3IgPiBtYXhBbGxvd2VkTWFnRXJyb3Ip
IHsKKyAgICAgICAgdmFyIG1lc3NhZ2UgPSAiTWFnbml0dWRlIChpbiBkQikgZXJyb3IgKCIgKyBt
YXhNYWdFcnJvcjsKKyAgICAgICAgbWVzc2FnZSArPSAiKSBleGNlZWRlZCB0aHJlc2hvbGQgYXQg
IiArIGZyZXFbbWF4TWFnRXJyb3JJbmRleF07CisgICAgICAgIG1lc3NhZ2UgKz0gIiBIei4gIEFj
dHVhbDogIiArIGxpbmVhclRvRGVjaWJlbHMobWFnUmVzcG9uc2VbbWF4TWFnRXJyb3JJbmRleF0p
OworICAgICAgICBtZXNzYWdlICs9ICIgZXhwZWN0ZWQ6ICIgKyBsaW5lYXJUb0RlY2liZWxzKGV4
cGVjdGVkTWFnbml0dWRlW21heE1hZ0Vycm9ySW5kZXhdKTsKKyAgICAgICAgdGVzdEZhaWxlZCht
ZXNzYWdlKTsKKyAgICAgICAgc3VjY2VzcyA9IGZhbHNlOworICAgIH0gZWxzZSB7CisgICAgICAg
IHRlc3RQYXNzZWQoIk1hZ25pdHVkZSByZXNwb25zZSB3aXRoaW4gYWNjZXB0YWJsZSB0aHJlc2hv
bGQuIik7CisgICAgfQorCisgICAgdmFyIG1heFBoYXNlRXJyb3IgPSAtMTsKKyAgICB2YXIgbWF4
UGhhc2VFcnJvckluZGV4ID0gLTE7CisKKyAgICBmb3IgKGsgPSAwOyBrIDwgbjsgKytrKSB7Cisg
ICAgICAgIHZhciBlcnJvciA9IGFic29sdXRlUGhhc2VEaWZmZXJlbmNlKHBoYXNlUmVzcG9uc2Vb
a10sIGV4cGVjdGVkUGhhc2Vba10pOworICAgICAgICBpZiAoZXJyb3IgPiBtYXhQaGFzZUVycm9y
KSB7CisgICAgICAgICAgICBtYXhQaGFzZUVycm9yID0gZXJyb3I7CisgICAgICAgICAgICBtYXhQ
aGFzZUVycm9ySW5kZXggPSBrOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKG1heFBoYXNl
RXJyb3IgPiBtYXhBbGxvd2VkUGhhc2VFcnJvcikgeworICAgICAgICB2YXIgbWVzc2FnZSA9ICJQ
aGFzZSBlcnJvciAocmFkaWFucykgKCIgKyBtYXhQaGFzZUVycm9yOworICAgICAgICBtZXNzYWdl
ICs9ICIpIGV4Y2VlZGVkIHRocmVzaG9sZCBhdCAiICsgZnJlcVttYXhQaGFzZUVycm9ySW5kZXhd
OworICAgICAgICBtZXNzYWdlICs9ICIgSHouICBBY3R1YWw6ICIgKyBwaGFzZVJlc3BvbnNlW21h
eFBoYXNlRXJyb3JJbmRleF07CisgICAgICAgIG1lc3NhZ2UgKz0gIiBleHBlY3RlZDogIiArIGV4
cGVjdGVkUGhhc2VbbWF4UGhhc2VFcnJvckluZGV4XTsKKyAgICAgICAgdGVzdEZhaWxlZChtZXNz
YWdlKTsKKyAgICAgICAgc3VjY2VzcyA9IGZhbHNlOworICAgIH0gZWxzZSB7CisgICAgICAgIHRl
c3RQYXNzZWQoIlBoYXNlIHJlc3BvbnNlIHdpdGhpbiBhY2NlcHRhYmxlIHRocmVzaG9sZC4iKTsK
KyAgICB9CisKKworICAgIHJldHVybiBzdWNjZXNzOworfQorCitmdW5jdGlvbiBydW5UZXN0KCkK
K3sKKyAgICBpZiAod2luZG93LmxheW91dFRlc3RDb250cm9sbGVyKSB7CisgICAgICAgIGxheW91
dFRlc3RDb250cm9sbGVyLmR1bXBBc1RleHQoKTsKKyAgICAgICAgbGF5b3V0VGVzdENvbnRyb2xs
ZXIud2FpdFVudGlsRG9uZSgpOworICAgIH0KKworICAgIHdpbmRvdy5qc1Rlc3RJc0FzeW5jID0g
dHJ1ZTsKKworICAgIGNvbnRleHQgPSBuZXcgd2Via2l0QXVkaW9Db250ZXh0KCk7CisgICAgCisg
ICAgZmlsdGVyID0gY29udGV4dC5jcmVhdGVCaXF1YWRGaWx0ZXIoKTsKKworICAgIC8vIEFyYml0
cmFyaWx5IHRlc3QgYSBsb3dwYXNzIGZpbHRlciwgYnV0IGFueSBraW5kIG9mIGZpbHRlciBjYW4g
YmUgdGVzdGVkLiAgKFNob3VsZCB3ZSB0ZXN0IGFsbAorICAgIC8vIHRoZSBmaWx0ZXIgdHlwZXM/
KQorICAgIGZpbHRlci50eXBlID0gZmlsdGVyLlBFQUtJTkc7CisgICAgZmlsdGVyLmZyZXF1ZW5j
eS52YWx1ZSA9IGZpbHRlckN1dG9mZjsKKyAgICBmaWx0ZXIuUS52YWx1ZSA9IGZpbHRlclE7Cisg
ICAgZmlsdGVyLmdhaW4udmFsdWUgPSBmaWx0ZXJHYWluOworCisgICAgZnJlcVNhbXBsZXMgPSBj
cmVhdGVGcmVxdWVuY3lTYW1wbGVBcnJheShuRnJlcXVlbmN5U2FtcGxlcywgY29udGV4dC5zYW1w
bGVSYXRlKTsKKyAgICBtYWdSZXNwb25zZSA9IG5ldyBGbG9hdDMyQXJyYXkobkZyZXF1ZW5jeVNh
bXBsZXMpOworICAgIHBoYXNlUmVzcG9uc2UgPSBuZXcgRmxvYXQzMkFycmF5KG5GcmVxdWVuY3lT
YW1wbGVzKTsKKworICAgIGZpbHRlci5nZXRGcmVxdWVuY3lSZXNwb25zZShmcmVxU2FtcGxlcywg
bWFnUmVzcG9uc2UsIHBoYXNlUmVzcG9uc2UpOworICAgIHZhciBzdWNjZXNzID0gY29tcGFyZVJl
c3BvbnNlcyhmaWx0ZXIsIGZyZXFTYW1wbGVzLCBtYWdSZXNwb25zZSwgcGhhc2VSZXNwb25zZSk7
CisKKyAgICBpZiAoc3VjY2VzcykgeworICAgICAgICB0ZXN0UGFzc2VkKGZpbHRlclR5cGVOYW1l
W2ZpbHRlci50eXBlXSArICIgZnJlcXVlbmN5IHJlc3BvbnNlIHdhcyBjb3JyZWN0LiIpOworICAg
IH0gZWxzZSB7CisgICAgICAgIHRlc3RGYWlsZWQoZmlsdGVyVHlwZU5hbWVbZmlsdGVyLnR5cGVd
ICsgIiBmcmVxdWVuY3kgcmVzcG9uc2Ugd2FzIGluY29ycmVjdC4iKTsKKyAgICB9CisKKyAgICBm
aW5pc2hKU1Rlc3QoKTsKK30KKworcnVuVGVzdCgpOworc3VjY2Vzc2Z1bGx5UGFyc2VkID0gdHJ1
ZTsKKworPC9zY3JpcHQ+CisKKzxzY3JpcHQgc3JjPSIuLi9mYXN0L2pzL3Jlc291cmNlcy9qcy10
ZXN0LXBvc3QuanMiPjwvc2NyaXB0PgorPC9ib2R5PgorPC9odG1sPgo=
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>129326</attachid>
            <date>2012-02-28 14:07:47 -0800</date>
            <delta_ts>2012-02-28 15:47:37 -0800</delta_ts>
            <desc>Patch</desc>
            <filename>bug-79503-20120228140746.patch</filename>
            <type>text/plain</type>
            <size>11335</size>
            <attacher name="Raymond Toy">rtoy</attacher>
            
              <data encoding="base64">U3VidmVyc2lvbiBSZXZpc2lvbjogMTA4OTgzCmRpZmYgLS1naXQgYS9MYXlvdXRUZXN0cy9DaGFu
Z2VMb2cgYi9MYXlvdXRUZXN0cy9DaGFuZ2VMb2cKaW5kZXggNjIzZTVhMmJhZDIyZWM2YWUxM2Vi
NjY4ZjBjNzExODE5Y2QwYTVmOS4uMDdjNTg1ZGNkYzI0NjQ4NjYzNWEyNjUyZDE2NWQ2Yjk0N2M5
OGFhZCAxMDA2NDQKLS0tIGEvTGF5b3V0VGVzdHMvQ2hhbmdlTG9nCisrKyBiL0xheW91dFRlc3Rz
L0NoYW5nZUxvZwpAQCAtMSwzICsxLDE1IEBACisyMDEyLTAyLTI0ICBSYXltb25kIFRveSAgPHJ0
b3lAZ29vZ2xlLmNvbT4KKworICAgICAgICBCaXF1YWQgZ2V0RnJlcXVlbmN5UmVzcG9uc2UgbmVl
ZHMgYSBsYXlvdXQgdGVzdC4KKyAgICAgICAgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19i
dWcuY2dpP2lkPTc5NTAzCisKKyAgICAgICAgQWRkIHNpbXBsZSB0ZXN0IGZvciBnZXRGcmVxdWVu
Y3lSZXNwb25zZS4KKyAgICAgICAgCisgICAgICAgIFJldmlld2VkIGJ5IE5PQk9EWSAoT09QUyEp
LgorCisgICAgICAgICogd2ViYXVkaW8vYmlxdWFkLWdldEZyZXF1ZW5jeVJlc3BvbnNlLWV4cGVj
dGVkLnR4dDogQWRkZWQuCisgICAgICAgICogd2ViYXVkaW8vYmlxdWFkLWdldEZyZXF1ZW5jeVJl
c3BvbnNlLmh0bWw6IEFkZGVkLgorCiAyMDEyLTAyLTI3ICBNT1JJVEEgSGFqaW1lICA8bW9ycml0
YUBnb29nbGUuY29tPgogCiAgICAgICAgIFJlbW92aW5nIDx1bD4sIDxsaT4gaW5zaWRlIHNoYWRv
dyBET00gdHJpZ2dlcnMgYXNzZXJ0aW9uIGluIHVwZGF0ZUxpc3RNYXJrZXJOdW1iZXJzCmRpZmYg
LS1naXQgYS9MYXlvdXRUZXN0cy93ZWJhdWRpby9iaXF1YWQtZ2V0RnJlcXVlbmN5UmVzcG9uc2Ut
ZXhwZWN0ZWQudHh0IGIvTGF5b3V0VGVzdHMvd2ViYXVkaW8vYmlxdWFkLWdldEZyZXF1ZW5jeVJl
c3BvbnNlLWV4cGVjdGVkLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwLi45MzAxMTgyMzkwZWU1MjY4NTQxNTVjZTk0
NjJhZjc5ZTU5MWU1OTRiCi0tLSAvZGV2L251bGwKKysrIGIvTGF5b3V0VGVzdHMvd2ViYXVkaW8v
YmlxdWFkLWdldEZyZXF1ZW5jeVJlc3BvbnNlLWV4cGVjdGVkLnR4dApAQCAtMCwwICsxLDExIEBA
CitUZXN0IEJpcXVhZCBnZXRGcmVxdWVuY3lSZXNwb25zZSgpIGZ1bmN0aW9uYWxpdHkuCisKK09u
IHN1Y2Nlc3MsIHlvdSB3aWxsIHNlZSBhIHNlcmllcyBvZiAiUEFTUyIgbWVzc2FnZXMsIGZvbGxv
d2VkIGJ5ICJURVNUIENPTVBMRVRFIi4KKworUEFTUyBNYWduaXR1ZGUgcmVzcG9uc2Ugd2l0aGlu
IGFjY2VwdGFibGUgdGhyZXNob2xkLgorUEFTUyBQaGFzZSByZXNwb25zZSB3aXRoaW4gYWNjZXB0
YWJsZSB0aHJlc2hvbGQuCitQQVNTIFBlYWtpbmcgZmlsdGVyIGZyZXF1ZW5jeSByZXNwb25zZSB3
YXMgY29ycmVjdC4KK1BBU1Mgc3VjY2Vzc2Z1bGx5UGFyc2VkIGlzIHRydWUKKworVEVTVCBDT01Q
TEVURQorCmRpZmYgLS1naXQgYS9MYXlvdXRUZXN0cy93ZWJhdWRpby9iaXF1YWQtZ2V0RnJlcXVl
bmN5UmVzcG9uc2UuaHRtbCBiL0xheW91dFRlc3RzL3dlYmF1ZGlvL2JpcXVhZC1nZXRGcmVxdWVu
Y3lSZXNwb25zZS5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAuLjE3Yzc5ZDFmNzZlODczZDNkNTg0YThjOWNmNzcy
YTMwZDVjNGE1OGQKLS0tIC9kZXYvbnVsbAorKysgYi9MYXlvdXRUZXN0cy93ZWJhdWRpby9iaXF1
YWQtZ2V0RnJlcXVlbmN5UmVzcG9uc2UuaHRtbApAQCAtMCwwICsxLDMwMiBAQAorPCFET0NUWVBF
IEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiI+Cis8
aHRtbD4KKzxoZWFkPgorPHNjcmlwdCBzcmM9InJlc291cmNlcy9hdWRpby10ZXN0aW5nLmpzIj48
L3NjcmlwdD4KKzxzY3JpcHQgc3JjPSJyZXNvdXJjZXMvYmlxdWFkLXRlc3RpbmcuanMiPjwvc2Ny
aXB0PgorPHNjcmlwdCBzcmM9Ii4uL2Zhc3QvanMvcmVzb3VyY2VzL2pzLXRlc3QtcHJlLmpzIj48
L3NjcmlwdD4KKzwvaGVhZD4KKworPGJvZHk+Cis8ZGl2IGlkPSJkZXNjcmlwdGlvbiI+PC9kaXY+
Cis8ZGl2IGlkPSJjb25zb2xlIj48L2Rpdj4KKworPHNjcmlwdD4KK2Rlc2NyaXB0aW9uKCJUZXN0
IEJpcXVhZCBnZXRGcmVxdWVuY3lSZXNwb25zZSgpIGZ1bmN0aW9uYWxpdHkuIik7CisKKy8vIFRl
c3QgdGhlIGZyZXF1ZW5jeSByZXNwb25zZSBvZiBhIGJpcXVhZCBmaWx0ZXIuICBXZSBjb21wdXRl
IHRoZSBmcmVxdWVuY3kgcmVzcG9uc2UgZm9yIGEgc2ltcGxlCisvLyBsb3dwYXNzIGJpcXVhZCBm
aWx0ZXIgYW5kIGNvbXBhcmUgaXQgd2l0aCB0aGUgZXhwZWN0ZWQgZnJlcXVlbmN5IHJlc3BvbnNl
LgorCit2YXIgY29udGV4dDsKKworLy8gVGhlIGJpcXVhZCBmaWx0ZXIgbm9kZS4KK3ZhciBmaWx0
ZXI7CisKKy8vIFRoZSBtYWduaXR1ZGUgcmVzcG9uc2Ugb2YgdGhlIGJpcXVhZCBmaWx0ZXIuCit2
YXIgbWFnUmVzcG9uc2U7CisKKy8vIFRoZSBwaGFzZSByZXNwb25zZSBvZiB0aGUgYmlxdWFkIGZp
bHRlci4KK3ZhciBwaGFzZVJlc3BvbnNlOworCisvLyBOdW1iZXIgb2YgZnJlcXVlbmN5IHNhbXBs
ZXMgdG8gdGFrZS4KK3ZhciBuRnJlcXVlbmN5U2FtcGxlcyA9IDEwMDA7CisKKy8vIFRoZSBmaWx0
ZXIgcHJvcGVydGllcwordmFyIGZpbHRlckN1dG9mZiA9IDEwMDA7ICAvLyBIei4KK3ZhciBmaWx0
ZXJRID0gMTsKK3ZhciBmaWx0ZXJHYWluID0gNTsKKworLy8gVGhlIG1heGltdW0gYWxsb3dlZCBl
cnJvciBpbiB0aGUgbWFnbml0dWRlIHJlc3BvbnNlLgordmFyIG1heEFsbG93ZWRNYWdFcnJvciA9
IDUuN2UtNzsKKworLy8gVGhlIG1heGltdW0gYWxsb3dlZCBlcnJvciBpbiB0aGUgcGhhc2UgcmVz
cG9uc2UuCit2YXIgbWF4QWxsb3dlZFBoYXNlRXJyb3IgPSA0LjdlLTg7CisKKy8vIENvbnZlcnQg
ZnJlcXVlbmN5IGluIEh6IHRvIGEgbm9ybWFsaXplZCBmcmVxdWVuY3kuCitmdW5jdGlvbiBub3Jt
YWxpemVkRnJlcXVlbmN5KGZyZXFIeiwgc2FtcGxlUmF0ZSkKK3sKKyAgICByZXR1cm4gZnJlcUh6
IC8gKHNhbXBsZVJhdGUgLyAyKTsKK30KKworLy8gR2V0IHRoZSBmaWx0ZXIgcmVzcG9uc2UgYXQg
YSAobm9ybWFsaXplZCkgZnJlcXVlbmN5IHxmfCBmb3IgdGhlIGZpbHRlciB3aXRoIGNvZWZmaWNp
ZW50cyB8Y29lZnwuCitmdW5jdGlvbiBnZXRSZXNwb25zZUF0KGNvZWYsIGYpCit7CisgICAgdmFy
IGIwID0gY29lZi5iMDsKKyAgICB2YXIgYjEgPSBjb2VmLmIxOworICAgIHZhciBiMiA9IGNvZWYu
YjI7CisgICAgdmFyIGExID0gY29lZi5hMTsKKyAgICB2YXIgYTIgPSBjb2VmLmEyOworCisgICAg
Ly8gSCh6KSA9IChiMCArIGIxIC8geiArIGIyIC8gel4yKSAvICgxICsgYTEgLyB6ICsgYTIgLyB6
XjIpCisgICAgLy8KKyAgICAvLyBDb21wdXRlIEgoZXhwKGkgKiBwaSAqIGYpKS4gIE5vIG5hdGl2
ZSBjb21wbGV4IG51bWJlcnMgaW4gamF2YXNjcmlwdCwgc28gYnJlYWsKKyAgICAvLyBIKGV4cChp
KnBpKmYpKSBpbiB0byB0aGUgcmVhbCBhbmQgaW1hZ2luYXJ5IHBhcnRzIG9mIHRoZSBudW1lcmF0
b3IgYW5kIGRlbm9taW5hdG9yLiAgVGhlbiB0aGUKKyAgICAvLyBudW1lcmF0b3IgaXMKKyAgICAv
LworICAgIC8vIGIyICogY29zKDIqdykgKyBiMSAqIGNvcyh3KSArIGIwIC0gaSAqIChiMSAqIHNp
bih3KSArIGIyICogc2luKDIqdykpCisgICAgLy8KKyAgICAvLyBhbmQgdGhlIGRlbm9taW5hdG9y
IGlzCisgICAgLy8KKyAgICAvLyAxICsgYTEgKiBjb3ModykgKyBhMiAqIGNvcygyKncpIC0gaSAq
IChhMSAqIHNpbih3KSArIGEyICogc2luKDIqdykpCisgICAgLy8KKyAgICAvLyB3aGVyZSB3ID0g
cGkgKiBmCisgICAgLy8KKyAgICAvLyBDb21wdXRlIHRoZSBtYWduaXR1ZGUgYW5kIHBoYXNlIGZy
b20gdGhlIHJlYWwgYW5kIGltYWdpbmFyeSBwYXJ0cy4KKworICAgIHZhciBvbWVnYSA9IE1hdGgu
UEkgKiBmOworICAgIHZhciBudW1lcmF0b3JSZWFsID0gYjAgKyBiMSAqIE1hdGguY29zKG9tZWdh
KSArIGIyICogTWF0aC5jb3MoMiAqIG9tZWdhKTsKKyAgICB2YXIgbnVtZXJhdG9ySW1hZyA9IC0o
YjEgKiBNYXRoLnNpbihvbWVnYSkgKyBiMiAqIE1hdGguc2luKDIgKiBvbWVnYSkpOworICAgIHZh
ciBkZW5vbWluYXRvclJlYWwgPSAxICsgYTEgKiBNYXRoLmNvcyhvbWVnYSkgKyBhMiAqIE1hdGgu
Y29zKDIgKiBvbWVnYSk7CisgICAgdmFyIGRlbm9taW5hdG9ySW1hZyA9IC0oYTEgKiBNYXRoLnNp
bihvbWVnYSkgKyBhMiAqIE1hdGguc2luKDIgKiBvbWVnYSkpOworCisgICAgdmFyIG1hZ25pdHVk
ZSA9IE1hdGguc3FydCgoTWF0aC5wb3cobnVtZXJhdG9yUmVhbCwgMikgKyBNYXRoLnBvdyhudW1l
cmF0b3JJbWFnLCAyKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8gKE1hdGgucG93
KGRlbm9taW5hdG9yUmVhbCwgMikgKyBNYXRoLnBvdyhkZW5vbWluYXRvckltYWcsIDIpKSk7Cisg
ICAgdmFyIHBoYXNlID0gTWF0aC5hdGFuMihudW1lcmF0b3JJbWFnLCBudW1lcmF0b3JSZWFsKSAt
IE1hdGguYXRhbjIoZGVub21pbmF0b3JJbWFnLCBkZW5vbWluYXRvclJlYWwpOworICAgIAorICAg
IGlmIChwaGFzZSA+PSBNYXRoLlBJKSB7CisgICAgICAgIHBoYXNlIC09IE1hdGguUEk7CisgICAg
fSBlbHNlIGlmIChwaGFzZSA8PSAtTWF0aC5QSSkgeworICAgICAgICBwaGFzZSArPSBNYXRoLlBJ
OworICAgIH0KKyAgIAorICAgIHJldHVybiB7bWFnbml0dWRlIDogbWFnbml0dWRlLCBwaGFzZSA6
IHBoYXNlfTsgCit9CisKKy8vIENvbXB1dGUgdGhlIHJlZmVyZW5jZSBmcmVxdWVuY3kgcmVzcG9u
c2UgZm9yIHRoZSBiaXF1YWQgZmlsdGVyIHxmaWx0ZXJ8IGF0IHRoZSBmcmVxdWVuY3kgc2FtcGxl
cworLy8gZ2l2ZW4gYnkgfGZyZXF1ZW5jeVNhbXBsZXN8LgorZnVuY3Rpb24gZnJlcXVlbmN5UmVz
cG9uc2VSZWZlcmVuY2UoZmlsdGVyLCBmcmVxdWVuY3lTYW1wbGVzKQoreworICAgIHZhciBzYW1w
bGVSYXRlID0gZmlsdGVyLmNvbnRleHQuc2FtcGxlUmF0ZTsKKyAgICB2YXIgbm9ybWFsaXplZEZy
ZXEgPSBub3JtYWxpemVkRnJlcXVlbmN5KGZpbHRlci5mcmVxdWVuY3kudmFsdWUsIHNhbXBsZVJh
dGUpOworICAgIHZhciBmaWx0ZXJDb2VmID0gY3JlYXRlRmlsdGVyKGZpbHRlci50eXBlLCBub3Jt
YWxpemVkRnJlcSwgZmlsdGVyLlEudmFsdWUsIGZpbHRlci5nYWluLnZhbHVlKTsKKworICAgIHZh
ciBtYWduaXR1ZGUgPSBbXTsKKyAgICB2YXIgcGhhc2UgPSBbXTsKKworICAgIGZvciAodmFyIGsg
PSAwOyBrIDwgZnJlcXVlbmN5U2FtcGxlcy5sZW5ndGg7ICsraykgeworICAgICAgICB2YXIgcmVz
cG9uc2UgPSBnZXRSZXNwb25zZUF0KGZpbHRlckNvZWYsIG5vcm1hbGl6ZWRGcmVxdWVuY3koZnJl
cXVlbmN5U2FtcGxlc1trXSwgc2FtcGxlUmF0ZSkpOworICAgICAgICBtYWduaXR1ZGUucHVzaChy
ZXNwb25zZS5tYWduaXR1ZGUpOworICAgICAgICBwaGFzZS5wdXNoKHJlc3BvbnNlLnBoYXNlKTsK
KyAgICB9CisKKyAgICByZXR1cm4ge21hZ25pdHVkZSA6IG1hZ25pdHVkZSwgcGhhc2UgOiBwaGFz
ZX07Cit9CisKKy8vIENvbXB1dGUgdGhlIHNldCBvZiBmcmVxdWVuY3kgc2FtcGxlcy4KK2Z1bmN0
aW9uIGNyZWF0ZUZyZXF1ZW5jeVNhbXBsZUFycmF5KG5TYW1wbGVzLCBzYW1wbGVSYXRlKQorewor
ICAgIHZhciBmcmVxU2FtcGxlcyA9IG5ldyBGbG9hdDMyQXJyYXkoblNhbXBsZXMpOworICAgIAor
ICAgIHZhciBmcmVxRGVsdGEgPSBzYW1wbGVSYXRlIC8gMiAvIG5TYW1wbGVzOworCisgICAgZm9y
ICh2YXIgayA9IDA7IGsgPCBuU2FtcGxlczsgKytrKSB7CisgICAgICAgIGZyZXFTYW1wbGVzW2td
ID0gayAqIGZyZXFEZWx0YTsKKyAgICB9CisKKyAgICByZXR1cm4gZnJlcVNhbXBsZXM7Cit9CisK
K2Z1bmN0aW9uIGxpbmVhclRvRGVjaWJlbHMoeCkKK3sKKyAgICBpZiAoeCkgeworICAgICAgICBy
ZXR1cm4gMjAgKiBNYXRoLmxvZyh4KSAvIE1hdGguTE4xMDsKKyAgICB9IGVsc2UgeworICAgICAg
ICByZXR1cm4gLTEwMDA7CisgICAgfQorfQorCisvLyBMb29rIHRocm91Z2ggdGhlIGFycmF5IGFu
ZCBmaW5kIGFueSBOYU4gb3IgaW5maW5pdHkuICBSZXR1cm4gdGhlIGluZGV4IG9mIHRoZSBmaXJz
dCBzdWNoIG51bWJlci4KKy8vIElmIG5vIHN1Y2ggbnVtYmVyLCByZXR1cm5zIGZhbHNlLgorZnVu
Y3Rpb24gZmluZEJhZE51bWJlcihzaWduYWwpCit7CisgICAgZm9yICh2YXIgayA9IDA7IGsgPCBz
aWduYWwubGVuZ3RoOyArK2spIHsKKyAgICAgICAgIGlmICghaXNWYWxpZE51bWJlcihzaWduYWxb
a10pKSB7CisgICAgICAgICAgICByZXR1cm4gazsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1
cm4gZmFsc2U7Cit9CisKKy8vIENvbXB1dGUgYWJzb2x1dGUgdmFsdWUgb2YgdGhlIGRpZmZlcmVu
Y2UgYmV0d2VlbiBwaGFzZSBhbmdsZXMsIHRha2luZyBpbnRvIGFjY291bnQgdGhlIHdyYXBwaW5n
CisvLyBvZiBwaGFzZXMuCitmdW5jdGlvbiBhYnNvbHV0ZVBoYXNlRGlmZmVyZW5jZSh4LCB5KQor
eworICAgIHZhciBkaWZmID0gTWF0aC5hYnMoeCAtIHkpOworICAgIAorICAgIGlmIChkaWZmID4g
TWF0aC5QSSkgeworICAgICAgICBkaWZmID0gMiAqIE1hdGguUEkgLSBkaWZmOworICAgIH0KKyAg
ICByZXR1cm4gZGlmZjsKK30KKworLy8gQ29tcGFyZSB0aGUgZnJlcXVlbmN5IHJlc3BvbnNlIHdp
dGggb3VyIGV4cGVjdGVkIHJlc3BvbnNlLgorZnVuY3Rpb24gY29tcGFyZVJlc3BvbnNlcyhmaWx0
ZXIsIGZyZXEsIG1hZ1Jlc3BvbnNlLCBwaGFzZVJlc3BvbnNlKQoreworICAgIHZhciBleHBlY3Rl
ZFJlc3BvbnNlID0gZnJlcXVlbmN5UmVzcG9uc2VSZWZlcmVuY2UoZmlsdGVyLCBmcmVxKTsKKyAg
ICB2YXIgZXhwZWN0ZWRNYWduaXR1ZGUgPSBleHBlY3RlZFJlc3BvbnNlLm1hZ25pdHVkZTsKKyAg
ICB2YXIgZXhwZWN0ZWRQaGFzZSA9IGV4cGVjdGVkUmVzcG9uc2UucGhhc2U7CisKKyAgICB2YXIg
biA9IG1hZ1Jlc3BvbnNlLmxlbmd0aDsKKyAgICB2YXIgc3VjY2VzcyA9IHRydWU7CisgICAgdmFy
IGJhZFJlc3BvbnNlID0gZmFsc2U7CisKKyAgICB2YXIgbWF4TWFnRXJyb3IgPSAtMTsKKyAgICB2
YXIgbWF4TWFnRXJyb3JJbmRleCA9IC0xOworCisgICAgdmFyIGs7CisgICAgdmFyIGhhc0JhZE51
bWJlcjsKKworICAgIGhhc0JhZE51bWJlciA9IGZpbmRCYWROdW1iZXIobWFnUmVzcG9uc2UpOwor
ICAgIGlmIChoYXNCYWROdW1iZXIpIHsKKyAgICAgICAgdGVzdEZhaWxlZCgiTWFnbml0dWRlIHJl
c3BvbnNlIGhhcyBOYU4gb3IgaW5maW5pdHkgYXQgIiArIGhhc0JhZE51bWJlcik7CisgICAgICAg
IHN1Y2Nlc3MgPSBmYWxzZTsKKyAgICAgICAgYmFkUmVzcG9uc2UgPSB0cnVlOworICAgIH0KKwor
ICAgIGhhc0JhZE51bWJlciA9IGZpbmRCYWROdW1iZXIocGhhc2VSZXNwb25zZSk7CisgICAgaWYg
KGhhc0JhZE51bWJlcikgeworICAgICAgICB0ZXN0RmFpbGVkKCJQaGFzZSByZXNwb25zZSBoYXMg
TmFOIG9yIGluZmluaXR5IGF0ICIgKyBoYXNCYWROdW1iZXIpOworICAgICAgICBzdWNjZXNzID0g
ZmFsc2U7CisgICAgICAgIGJhZFJlc3BvbnNlID0gdHJ1ZTsKKyAgICB9CisKKyAgICBoYXNCYWRO
dW1iZXIgPSBmaW5kQmFkTnVtYmVyKGV4cGVjdGVkTWFnbml0dWRlKTsKKyAgICBpZiAoaGFzQmFk
TnVtYmVyKSB7CisgICAgICAgIHRlc3RGYWlsZWQoIkV4cGVjdGVkIG1hZ25pdHVkZSByZXNwb25z
ZSBoYXMgTmFOIG9yIGluZmluaXR5IGF0ICIgKyBoYXNCYWROdW1iZXIpOworICAgICAgICBzdWNj
ZXNzID0gZmFsc2U7CisgICAgICAgIGJhZFJlc3BvbnNlID0gdHJ1ZTsKKyAgICB9CisKKyAgICBo
YXNCYWROdW1iZXIgPSBmaW5kQmFkTnVtYmVyKGV4cGVjdGVkUGhhc2UpOworICAgIGlmIChoYXNC
YWROdW1iZXIpIHsKKyAgICAgICAgdGVzdEZhaWxlZCgiRXhwZWN0ZWQgcGhhc2UgcmVzcG9uc2Ug
aGFzIE5hTiBvciBpbmZpbml0eSBhdCAiICsgaGFzQmFkTnVtYmVyKTsKKyAgICAgICAgc3VjY2Vz
cyA9IGZhbHNlOworICAgICAgICBiYWRSZXNwb25zZSA9IHRydWU7CisgICAgfQorCisgICAgLy8g
SWYgd2UgZm91bmQgYSBOYU4gb3IgaW5maW5pdHksIHRoZSBmb2xsb3dpbmcgdGVzdHMgYXJlbid0
IHZlcnkgaGVscGZ1bCwgZXNwZWNpYWxseSBmb3IgTmFOLgorICAgIC8vIFdlIHJ1biB0aGVtIGFu
eXdheSwgYWZ0ZXIgcHJpbnRpbmcgYSB3YXJuaW5nIG1lc3NhZ2UuCisKKyAgICBpZiAoYmFkUmVz
cG9uc2UpIHsKKyAgICAgICAgdGVzdEZhaWxlZCgiTmFOIG9yIGluZmluaXR5IGluIHRoZSBhY3R1
YWwgb3IgZXhwZWN0ZWQgcmVzdWx0cyBtYWtlcyB0aGUgZm9sbG93aW5nIHRlc3QgcmVzdWx0cyBz
dXNwZWN0LiIpOworICAgICAgICBzdWNjZXNzID0gZmFsc2U7CisgICAgfQorCisgICAgZm9yIChr
ID0gMDsgayA8IG47ICsraykgeworICAgICAgICB2YXIgZXJyb3IgPSBNYXRoLmFicyhsaW5lYXJU
b0RlY2liZWxzKG1hZ1Jlc3BvbnNlW2tdKSAtIGxpbmVhclRvRGVjaWJlbHMoZXhwZWN0ZWRNYWdu
aXR1ZGVba10pKTsKKyAgICAgICAgaWYgKGVycm9yID4gbWF4TWFnRXJyb3IpIHsKKyAgICAgICAg
ICAgIG1heE1hZ0Vycm9yID0gZXJyb3I7CisgICAgICAgICAgICBtYXhNYWdFcnJvckluZGV4ID0g
azsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChtYXhNYWdFcnJvciA+IG1heEFsbG93ZWRN
YWdFcnJvcikgeworICAgICAgICB2YXIgbWVzc2FnZSA9ICJNYWduaXR1ZGUgKGluIGRCKSBlcnJv
ciAoIiArIG1heE1hZ0Vycm9yOworICAgICAgICBtZXNzYWdlICs9ICIpIGV4Y2VlZGVkIHRocmVz
aG9sZCBhdCAiICsgZnJlcVttYXhNYWdFcnJvckluZGV4XTsKKyAgICAgICAgbWVzc2FnZSArPSAi
IEh6LiAgQWN0dWFsOiAiICsgbGluZWFyVG9EZWNpYmVscyhtYWdSZXNwb25zZVttYXhNYWdFcnJv
ckluZGV4XSk7CisgICAgICAgIG1lc3NhZ2UgKz0gIiBleHBlY3RlZDogIiArIGxpbmVhclRvRGVj
aWJlbHMoZXhwZWN0ZWRNYWduaXR1ZGVbbWF4TWFnRXJyb3JJbmRleF0pOworICAgICAgICB0ZXN0
RmFpbGVkKG1lc3NhZ2UpOworICAgICAgICBzdWNjZXNzID0gZmFsc2U7CisgICAgfSBlbHNlIHsK
KyAgICAgICAgdGVzdFBhc3NlZCgiTWFnbml0dWRlIHJlc3BvbnNlIHdpdGhpbiBhY2NlcHRhYmxl
IHRocmVzaG9sZC4iKTsKKyAgICB9CisKKyAgICB2YXIgbWF4UGhhc2VFcnJvciA9IC0xOworICAg
IHZhciBtYXhQaGFzZUVycm9ySW5kZXggPSAtMTsKKworICAgIGZvciAoayA9IDA7IGsgPCBuOyAr
K2spIHsKKyAgICAgICAgdmFyIGVycm9yID0gYWJzb2x1dGVQaGFzZURpZmZlcmVuY2UocGhhc2VS
ZXNwb25zZVtrXSwgZXhwZWN0ZWRQaGFzZVtrXSk7CisgICAgICAgIGlmIChlcnJvciA+IG1heFBo
YXNlRXJyb3IpIHsKKyAgICAgICAgICAgIG1heFBoYXNlRXJyb3IgPSBlcnJvcjsKKyAgICAgICAg
ICAgIG1heFBoYXNlRXJyb3JJbmRleCA9IGs7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAo
bWF4UGhhc2VFcnJvciA+IG1heEFsbG93ZWRQaGFzZUVycm9yKSB7CisgICAgICAgIHZhciBtZXNz
YWdlID0gIlBoYXNlIGVycm9yIChyYWRpYW5zKSAoIiArIG1heFBoYXNlRXJyb3I7CisgICAgICAg
IG1lc3NhZ2UgKz0gIikgZXhjZWVkZWQgdGhyZXNob2xkIGF0ICIgKyBmcmVxW21heFBoYXNlRXJy
b3JJbmRleF07CisgICAgICAgIG1lc3NhZ2UgKz0gIiBIei4gIEFjdHVhbDogIiArIHBoYXNlUmVz
cG9uc2VbbWF4UGhhc2VFcnJvckluZGV4XTsKKyAgICAgICAgbWVzc2FnZSArPSAiIGV4cGVjdGVk
OiAiICsgZXhwZWN0ZWRQaGFzZVttYXhQaGFzZUVycm9ySW5kZXhdOworICAgICAgICB0ZXN0RmFp
bGVkKG1lc3NhZ2UpOworICAgICAgICBzdWNjZXNzID0gZmFsc2U7CisgICAgfSBlbHNlIHsKKyAg
ICAgICAgdGVzdFBhc3NlZCgiUGhhc2UgcmVzcG9uc2Ugd2l0aGluIGFjY2VwdGFibGUgdGhyZXNo
b2xkLiIpOworICAgIH0KKworCisgICAgcmV0dXJuIHN1Y2Nlc3M7Cit9CisKK2Z1bmN0aW9uIHJ1
blRlc3QoKQoreworICAgIGlmICh3aW5kb3cubGF5b3V0VGVzdENvbnRyb2xsZXIpIHsKKyAgICAg
ICAgbGF5b3V0VGVzdENvbnRyb2xsZXIuZHVtcEFzVGV4dCgpOworICAgICAgICBsYXlvdXRUZXN0
Q29udHJvbGxlci53YWl0VW50aWxEb25lKCk7CisgICAgfQorCisgICAgd2luZG93LmpzVGVzdElz
QXN5bmMgPSB0cnVlOworCisgICAgY29udGV4dCA9IG5ldyB3ZWJraXRBdWRpb0NvbnRleHQoKTsK
KyAgICAKKyAgICBmaWx0ZXIgPSBjb250ZXh0LmNyZWF0ZUJpcXVhZEZpbHRlcigpOworCisgICAg
Ly8gQXJiaXRyYXJpbHkgdGVzdCBhIGxvd3Bhc3MgZmlsdGVyLCBidXQgYW55IGtpbmQgb2YgZmls
dGVyIGNhbiBiZSB0ZXN0ZWQuICAoU2hvdWxkIHdlIHRlc3QgYWxsCisgICAgLy8gdGhlIGZpbHRl
ciB0eXBlcz8pCisgICAgZmlsdGVyLnR5cGUgPSBmaWx0ZXIuUEVBS0lORzsKKyAgICBmaWx0ZXIu
ZnJlcXVlbmN5LnZhbHVlID0gZmlsdGVyQ3V0b2ZmOworICAgIGZpbHRlci5RLnZhbHVlID0gZmls
dGVyUTsKKyAgICBmaWx0ZXIuZ2Fpbi52YWx1ZSA9IGZpbHRlckdhaW47CisKKyAgICBmcmVxU2Ft
cGxlcyA9IGNyZWF0ZUZyZXF1ZW5jeVNhbXBsZUFycmF5KG5GcmVxdWVuY3lTYW1wbGVzLCBjb250
ZXh0LnNhbXBsZVJhdGUpOworICAgIG1hZ1Jlc3BvbnNlID0gbmV3IEZsb2F0MzJBcnJheShuRnJl
cXVlbmN5U2FtcGxlcyk7CisgICAgcGhhc2VSZXNwb25zZSA9IG5ldyBGbG9hdDMyQXJyYXkobkZy
ZXF1ZW5jeVNhbXBsZXMpOworCisgICAgZmlsdGVyLmdldEZyZXF1ZW5jeVJlc3BvbnNlKGZyZXFT
YW1wbGVzLCBtYWdSZXNwb25zZSwgcGhhc2VSZXNwb25zZSk7CisgICAgdmFyIHN1Y2Nlc3MgPSBj
b21wYXJlUmVzcG9uc2VzKGZpbHRlciwgZnJlcVNhbXBsZXMsIG1hZ1Jlc3BvbnNlLCBwaGFzZVJl
c3BvbnNlKTsKKworICAgIGlmIChzdWNjZXNzKSB7CisgICAgICAgIHRlc3RQYXNzZWQoZmlsdGVy
VHlwZU5hbWVbZmlsdGVyLnR5cGVdICsgIiBmcmVxdWVuY3kgcmVzcG9uc2Ugd2FzIGNvcnJlY3Qu
Iik7CisgICAgfSBlbHNlIHsKKyAgICAgICAgdGVzdEZhaWxlZChmaWx0ZXJUeXBlTmFtZVtmaWx0
ZXIudHlwZV0gKyAiIGZyZXF1ZW5jeSByZXNwb25zZSB3YXMgaW5jb3JyZWN0LiIpOworICAgIH0K
KworICAgIGZpbmlzaEpTVGVzdCgpOworfQorCitydW5UZXN0KCk7CitzdWNjZXNzZnVsbHlQYXJz
ZWQgPSB0cnVlOworCis8L3NjcmlwdD4KKworPHNjcmlwdCBzcmM9Ii4uL2Zhc3QvanMvcmVzb3Vy
Y2VzL2pzLXRlc3QtcG9zdC5qcyI+PC9zY3JpcHQ+Cis8L2JvZHk+Cis8L2h0bWw+Cg==
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>129345</attachid>
            <date>2012-02-28 15:43:10 -0800</date>
            <delta_ts>2012-03-02 10:47:46 -0800</delta_ts>
            <desc>Patch</desc>
            <filename>bug-79503-20120228154309.patch</filename>
            <type>text/plain</type>
            <size>11932</size>
            <attacher name="Raymond Toy">rtoy</attacher>
            
              <data encoding="base64">U3VidmVyc2lvbiBSZXZpc2lvbjogMTA4OTgzCmRpZmYgLS1naXQgYS9MYXlvdXRUZXN0cy9DaGFu
Z2VMb2cgYi9MYXlvdXRUZXN0cy9DaGFuZ2VMb2cKaW5kZXggNjIzZTVhMmJhZDIyZWM2YWUxM2Vi
NjY4ZjBjNzExODE5Y2QwYTVmOS4uMDdjNTg1ZGNkYzI0NjQ4NjYzNWEyNjUyZDE2NWQ2Yjk0N2M5
OGFhZCAxMDA2NDQKLS0tIGEvTGF5b3V0VGVzdHMvQ2hhbmdlTG9nCisrKyBiL0xheW91dFRlc3Rz
L0NoYW5nZUxvZwpAQCAtMSwzICsxLDE1IEBACisyMDEyLTAyLTI0ICBSYXltb25kIFRveSAgPHJ0
b3lAZ29vZ2xlLmNvbT4KKworICAgICAgICBCaXF1YWQgZ2V0RnJlcXVlbmN5UmVzcG9uc2UgbmVl
ZHMgYSBsYXlvdXQgdGVzdC4KKyAgICAgICAgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19i
dWcuY2dpP2lkPTc5NTAzCisKKyAgICAgICAgQWRkIHNpbXBsZSB0ZXN0IGZvciBnZXRGcmVxdWVu
Y3lSZXNwb25zZS4KKyAgICAgICAgCisgICAgICAgIFJldmlld2VkIGJ5IE5PQk9EWSAoT09QUyEp
LgorCisgICAgICAgICogd2ViYXVkaW8vYmlxdWFkLWdldEZyZXF1ZW5jeVJlc3BvbnNlLWV4cGVj
dGVkLnR4dDogQWRkZWQuCisgICAgICAgICogd2ViYXVkaW8vYmlxdWFkLWdldEZyZXF1ZW5jeVJl
c3BvbnNlLmh0bWw6IEFkZGVkLgorCiAyMDEyLTAyLTI3ICBNT1JJVEEgSGFqaW1lICA8bW9ycml0
YUBnb29nbGUuY29tPgogCiAgICAgICAgIFJlbW92aW5nIDx1bD4sIDxsaT4gaW5zaWRlIHNoYWRv
dyBET00gdHJpZ2dlcnMgYXNzZXJ0aW9uIGluIHVwZGF0ZUxpc3RNYXJrZXJOdW1iZXJzCmRpZmYg
LS1naXQgYS9MYXlvdXRUZXN0cy93ZWJhdWRpby9iaXF1YWQtZ2V0RnJlcXVlbmN5UmVzcG9uc2Ut
ZXhwZWN0ZWQudHh0IGIvTGF5b3V0VGVzdHMvd2ViYXVkaW8vYmlxdWFkLWdldEZyZXF1ZW5jeVJl
c3BvbnNlLWV4cGVjdGVkLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwLi45MzAxMTgyMzkwZWU1MjY4NTQxNTVjZTk0
NjJhZjc5ZTU5MWU1OTRiCi0tLSAvZGV2L251bGwKKysrIGIvTGF5b3V0VGVzdHMvd2ViYXVkaW8v
YmlxdWFkLWdldEZyZXF1ZW5jeVJlc3BvbnNlLWV4cGVjdGVkLnR4dApAQCAtMCwwICsxLDExIEBA
CitUZXN0IEJpcXVhZCBnZXRGcmVxdWVuY3lSZXNwb25zZSgpIGZ1bmN0aW9uYWxpdHkuCisKK09u
IHN1Y2Nlc3MsIHlvdSB3aWxsIHNlZSBhIHNlcmllcyBvZiAiUEFTUyIgbWVzc2FnZXMsIGZvbGxv
d2VkIGJ5ICJURVNUIENPTVBMRVRFIi4KKworUEFTUyBNYWduaXR1ZGUgcmVzcG9uc2Ugd2l0aGlu
IGFjY2VwdGFibGUgdGhyZXNob2xkLgorUEFTUyBQaGFzZSByZXNwb25zZSB3aXRoaW4gYWNjZXB0
YWJsZSB0aHJlc2hvbGQuCitQQVNTIFBlYWtpbmcgZmlsdGVyIGZyZXF1ZW5jeSByZXNwb25zZSB3
YXMgY29ycmVjdC4KK1BBU1Mgc3VjY2Vzc2Z1bGx5UGFyc2VkIGlzIHRydWUKKworVEVTVCBDT01Q
TEVURQorCmRpZmYgLS1naXQgYS9MYXlvdXRUZXN0cy93ZWJhdWRpby9iaXF1YWQtZ2V0RnJlcXVl
bmN5UmVzcG9uc2UuaHRtbCBiL0xheW91dFRlc3RzL3dlYmF1ZGlvL2JpcXVhZC1nZXRGcmVxdWVu
Y3lSZXNwb25zZS5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAuLjRiODI4Y2VjZTQ3MWFhNjNhYjBiMWQ4YzE5NmIz
YTExNTEyNTc5OTkKLS0tIC9kZXYvbnVsbAorKysgYi9MYXlvdXRUZXN0cy93ZWJhdWRpby9iaXF1
YWQtZ2V0RnJlcXVlbmN5UmVzcG9uc2UuaHRtbApAQCAtMCwwICsxLDMwNSBAQAorPCFET0NUWVBF
IEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiI+Cis8
aHRtbD4KKzxoZWFkPgorPHNjcmlwdCBzcmM9InJlc291cmNlcy9hdWRpby10ZXN0aW5nLmpzIj48
L3NjcmlwdD4KKzxzY3JpcHQgc3JjPSJyZXNvdXJjZXMvYmlxdWFkLXRlc3RpbmcuanMiPjwvc2Ny
aXB0PgorPHNjcmlwdCBzcmM9Ii4uL2Zhc3QvanMvcmVzb3VyY2VzL2pzLXRlc3QtcHJlLmpzIj48
L3NjcmlwdD4KKzwvaGVhZD4KKworPGJvZHk+Cis8ZGl2IGlkPSJkZXNjcmlwdGlvbiI+PC9kaXY+
Cis8ZGl2IGlkPSJjb25zb2xlIj48L2Rpdj4KKworPHNjcmlwdD4KK2Rlc2NyaXB0aW9uKCJUZXN0
IEJpcXVhZCBnZXRGcmVxdWVuY3lSZXNwb25zZSgpIGZ1bmN0aW9uYWxpdHkuIik7CisKKy8vIFRl
c3QgdGhlIGZyZXF1ZW5jeSByZXNwb25zZSBvZiBhIGJpcXVhZCBmaWx0ZXIuICBXZSBjb21wdXRl
IHRoZSBmcmVxdWVuY3kgcmVzcG9uc2UgZm9yIGEgc2ltcGxlCisvLyBwZWFraW5nIGJpcXVhZCBm
aWx0ZXIgYW5kIGNvbXBhcmUgaXQgd2l0aCB0aGUgZXhwZWN0ZWQgZnJlcXVlbmN5IHJlc3BvbnNl
LiAgVGhlIGFjdHVhbCBmaWx0ZXIKKy8vIHVzZWQgZG9lc24ndCBtYXR0ZXIgc2luY2Ugd2UncmUg
dGVzdGluZyBnZXRGcmVxdWVuY3lSZXNwb25zZSBhbmQgbm90IHRoZSBhY3R1YWwgZmlsdGVyIG91
dHB1dC4KKy8vIFRoZSBmaWx0ZXJzIGFyZSBleHRlbnNpdmVseSB0ZXN0ZWQgaW4gb3RoZXIgYmlx
dWFkIHRlc3RzLgorCit2YXIgY29udGV4dDsKKworLy8gVGhlIGJpcXVhZCBmaWx0ZXIgbm9kZS4K
K3ZhciBmaWx0ZXI7CisKKy8vIFRoZSBtYWduaXR1ZGUgcmVzcG9uc2Ugb2YgdGhlIGJpcXVhZCBm
aWx0ZXIuCit2YXIgbWFnUmVzcG9uc2U7CisKKy8vIFRoZSBwaGFzZSByZXNwb25zZSBvZiB0aGUg
YmlxdWFkIGZpbHRlci4KK3ZhciBwaGFzZVJlc3BvbnNlOworCisvLyBOdW1iZXIgb2YgZnJlcXVl
bmN5IHNhbXBsZXMgdG8gdGFrZS4KK3ZhciBuRnJlcXVlbmN5U2FtcGxlcyA9IDEwMDA7CisKKy8v
IFRoZSBmaWx0ZXIgcGFyYW1ldGVycy4KK3ZhciBmaWx0ZXJDdXRvZmYgPSAxMDAwOyAvLyBIei4K
K3ZhciBmaWx0ZXJRID0gMTsKK3ZhciBmaWx0ZXJHYWluID0gNTsgLy8gRGVjaWJlbHMuCisKKy8v
IFRoZSBtYXhpbXVtIGFsbG93ZWQgZXJyb3IgaW4gdGhlIG1hZ25pdHVkZSByZXNwb25zZS4KK3Zh
ciBtYXhBbGxvd2VkTWFnRXJyb3IgPSA1LjdlLTc7CisKKy8vIFRoZSBtYXhpbXVtIGFsbG93ZWQg
ZXJyb3IgaW4gdGhlIHBoYXNlIHJlc3BvbnNlLgordmFyIG1heEFsbG93ZWRQaGFzZUVycm9yID0g
NC43ZS04OworCisvLyBDb252ZXJ0IGZyZXF1ZW5jeSBpbiBIeiB0byBhIG5vcm1hbGl6ZWQgZnJl
cXVlbmN5IGJldHdlZW4gMCB0byAxIHdpdGggMSBjb3JyZXNwb25kaW5nIHRvIHRoZQorLy8gTnlx
dWlzdCBmcmVxdWVuY3kuCitmdW5jdGlvbiBub3JtYWxpemVkRnJlcXVlbmN5KGZyZXFIeiwgc2Ft
cGxlUmF0ZSkKK3sKKyAgICB2YXIgbnlxdWlzdCA9IHNhbXBsZVJhdGUgLyAyOworICAgIHJldHVy
biBmcmVxSHogLyBueXF1aXN0OworfQorCisvLyBHZXQgdGhlIGZpbHRlciByZXNwb25zZSBhdCBh
IChub3JtYWxpemVkKSBmcmVxdWVuY3kgfGZ8IGZvciB0aGUgZmlsdGVyIHdpdGggY29lZmZpY2ll
bnRzIHxjb2VmfC4KK2Z1bmN0aW9uIGdldFJlc3BvbnNlQXQoY29lZiwgZikKK3sKKyAgICB2YXIg
YjAgPSBjb2VmLmIwOworICAgIHZhciBiMSA9IGNvZWYuYjE7CisgICAgdmFyIGIyID0gY29lZi5i
MjsKKyAgICB2YXIgYTEgPSBjb2VmLmExOworICAgIHZhciBhMiA9IGNvZWYuYTI7CisKKyAgICAv
LyBIKHopID0gKGIwICsgYjEgLyB6ICsgYjIgLyB6XjIpIC8gKDEgKyBhMSAvIHogKyBhMiAvIHpe
MikKKyAgICAvLworICAgIC8vIENvbXB1dGUgSChleHAoaSAqIHBpICogZikpLiAgTm8gbmF0aXZl
IGNvbXBsZXggbnVtYmVycyBpbiBqYXZhc2NyaXB0LCBzbyBicmVhayBIKGV4cChpKnBpKmYpKQor
ICAgIC8vIGluIHRvIHRoZSByZWFsIGFuZCBpbWFnaW5hcnkgcGFydHMgb2YgdGhlIG51bWVyYXRv
ciBhbmQgZGVub21pbmF0b3IuICBMZXQgb21lZ2EgPSBwaSAqIGYuCisgICAgLy8gVGhlbiB0aGUg
bnVtZXJhdG9yIGlzCisgICAgLy8KKyAgICAvLyBiMiAqIGNvcygyICogb21lZ2EpICsgYjEgKiBj
b3Mob21lZ2EpICsgYjAgLSBpICogKGIxICogc2luKG9tZWdhKSArIGIyICogc2luKDIgKiBvbWVn
YSkpCisgICAgLy8KKyAgICAvLyBhbmQgdGhlIGRlbm9taW5hdG9yIGlzCisgICAgLy8KKyAgICAv
LyAxICsgYTEgKiBjb3Mob21lZ2EpICsgYTIgKiBjb3MoMiAqIG9tZWdhKSAtIGkgKiAoYTEgKiBz
aW4ob21lZ2EpICsgYTIgKiBzaW4oMiAqIG9tZWdhKSkKKyAgICAvLworICAgIC8vIENvbXB1dGUg
dGhlIG1hZ25pdHVkZSBhbmQgcGhhc2UgZnJvbSB0aGUgcmVhbCBhbmQgaW1hZ2luYXJ5IHBhcnRz
LgorCisgICAgdmFyIG9tZWdhID0gTWF0aC5QSSAqIGY7CisgICAgdmFyIG51bWVyYXRvclJlYWwg
PSBiMCArIGIxICogTWF0aC5jb3Mob21lZ2EpICsgYjIgKiBNYXRoLmNvcygyICogb21lZ2EpOwor
ICAgIHZhciBudW1lcmF0b3JJbWFnID0gLShiMSAqIE1hdGguc2luKG9tZWdhKSArIGIyICogTWF0
aC5zaW4oMiAqIG9tZWdhKSk7CisgICAgdmFyIGRlbm9taW5hdG9yUmVhbCA9IDEgKyBhMSAqIE1h
dGguY29zKG9tZWdhKSArIGEyICogTWF0aC5jb3MoMiAqIG9tZWdhKTsKKyAgICB2YXIgZGVub21p
bmF0b3JJbWFnID0gLShhMSAqIE1hdGguc2luKG9tZWdhKSArIGEyICogTWF0aC5zaW4oMiAqIG9t
ZWdhKSk7CisKKyAgICB2YXIgbWFnbml0dWRlID0gTWF0aC5zcXJ0KChNYXRoLnBvdyhudW1lcmF0
b3JSZWFsLCAyKSArIE1hdGgucG93KG51bWVyYXRvckltYWcsIDIpKQorICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgLyAoTWF0aC5wb3coZGVub21pbmF0b3JSZWFsLCAyKSArIE1hdGgucG93
KGRlbm9taW5hdG9ySW1hZywgMikpKTsKKyAgICB2YXIgcGhhc2UgPSBNYXRoLmF0YW4yKG51bWVy
YXRvckltYWcsIG51bWVyYXRvclJlYWwpIC0gTWF0aC5hdGFuMihkZW5vbWluYXRvckltYWcsIGRl
bm9taW5hdG9yUmVhbCk7CisgICAgCisgICAgaWYgKHBoYXNlID49IE1hdGguUEkpIHsKKyAgICAg
ICAgcGhhc2UgLT0gTWF0aC5QSTsKKyAgICB9IGVsc2UgaWYgKHBoYXNlIDw9IC1NYXRoLlBJKSB7
CisgICAgICAgIHBoYXNlICs9IE1hdGguUEk7CisgICAgfQorICAgCisgICAgcmV0dXJuIHttYWdu
aXR1ZGUgOiBtYWduaXR1ZGUsIHBoYXNlIDogcGhhc2V9OyAKK30KKworLy8gQ29tcHV0ZSB0aGUg
cmVmZXJlbmNlIGZyZXF1ZW5jeSByZXNwb25zZSBmb3IgdGhlIGJpcXVhZCBmaWx0ZXIgfGZpbHRl
cnwgYXQgdGhlIGZyZXF1ZW5jeSBzYW1wbGVzCisvLyBnaXZlbiBieSB8ZnJlcXVlbmNpZXN8Lgor
ZnVuY3Rpb24gZnJlcXVlbmN5UmVzcG9uc2VSZWZlcmVuY2UoZmlsdGVyLCBmcmVxdWVuY2llcykK
K3sKKyAgICB2YXIgc2FtcGxlUmF0ZSA9IGZpbHRlci5jb250ZXh0LnNhbXBsZVJhdGU7CisgICAg
dmFyIG5vcm1hbGl6ZWRGcmVxID0gbm9ybWFsaXplZEZyZXF1ZW5jeShmaWx0ZXIuZnJlcXVlbmN5
LnZhbHVlLCBzYW1wbGVSYXRlKTsKKyAgICB2YXIgZmlsdGVyQ29lZmZpY2llbnRzID0gY3JlYXRl
RmlsdGVyKGZpbHRlci50eXBlLCBub3JtYWxpemVkRnJlcSwgZmlsdGVyLlEudmFsdWUsIGZpbHRl
ci5nYWluLnZhbHVlKTsKKworICAgIHZhciBtYWduaXR1ZGVzID0gW107CisgICAgdmFyIHBoYXNl
cyA9IFtdOworCisgICAgZm9yICh2YXIgayA9IDA7IGsgPCBmcmVxdWVuY2llcy5sZW5ndGg7ICsr
aykgeworICAgICAgICB2YXIgcmVzcG9uc2UgPSBnZXRSZXNwb25zZUF0KGZpbHRlckNvZWZmaWNp
ZW50cywgbm9ybWFsaXplZEZyZXF1ZW5jeShmcmVxdWVuY2llc1trXSwgc2FtcGxlUmF0ZSkpOwor
ICAgICAgICBtYWduaXR1ZGVzLnB1c2gocmVzcG9uc2UubWFnbml0dWRlKTsKKyAgICAgICAgcGhh
c2VzLnB1c2gocmVzcG9uc2UucGhhc2UpOworICAgIH0KKworICAgIHJldHVybiB7bWFnbml0dWRl
cyA6IG1hZ25pdHVkZXMsIHBoYXNlcyA6IHBoYXNlc307Cit9CisKKy8vIENvbXB1dGUgYSBzZXQg
b2YgbGluZWFybHkgc3BhY2VkIGZyZXF1ZW5jaWVzLgorZnVuY3Rpb24gY3JlYXRlRnJlcXVlbmN5
U2FtcGxlQXJyYXkobkZyZXF1ZW5jaWVzLCBzYW1wbGVSYXRlKQoreworICAgIHZhciBmcmVxdWVu
Y2llcyA9IG5ldyBGbG9hdDMyQXJyYXkobkZyZXF1ZW5jaWVzKTsKKyAgICB2YXIgbnlxdWlzdCA9
IHNhbXBsZVJhdGUgLyAyOworICAgIHZhciBmcmVxRGVsdGEgPSBueXF1aXN0IC8gbkZyZXF1ZW5j
aWVzOworCisgICAgZm9yICh2YXIgayA9IDA7IGsgPCBuRnJlcXVlbmNpZXM7ICsraykgeworICAg
ICAgICBmcmVxdWVuY2llc1trXSA9IGsgKiBmcmVxRGVsdGE7CisgICAgfQorCisgICAgcmV0dXJu
IGZyZXF1ZW5jaWVzOworfQorCitmdW5jdGlvbiBsaW5lYXJUb0RlY2liZWxzKHgpCit7CisgICAg
aWYgKHgpIHsKKyAgICAgICAgcmV0dXJuIDIwICogTWF0aC5sb2coeCkgLyBNYXRoLkxOMTA7Cisg
ICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuIC0xMDAwOworICAgIH0KK30KKworLy8gTG9vayB0
aHJvdWdoIHRoZSBhcnJheSBhbmQgZmluZCBhbnkgTmFOIG9yIGluZmluaXR5LiAgUmV0dXJuIGFu
IG9iamVjdCB0aGF0IGluZGljYXRlcyB3aGV0aGVyIHdlCisvLyBmb3VuZCBzdWNoIGEgbnVtYmVy
IG9yIG5vdCBhbmQgaWYgc28sIHRoZSBsb2NhdGlvbi4KK2Z1bmN0aW9uIGZpbmRCYWROdW1iZXIo
c2lnbmFsKQoreworICAgIGZvciAodmFyIGsgPSAwOyBrIDwgc2lnbmFsLmxlbmd0aDsgKytrKSB7
CisgICAgICAgICBpZiAoIWlzVmFsaWROdW1iZXIoc2lnbmFsW2tdKSkgeworICAgICAgICAgICAg
cmV0dXJuIHtmb3VuZCA6IHRydWUsIGluZGV4IDoga307CisgICAgICAgIH0KKyAgICB9CisgICAg
cmV0dXJuIHtmb3VuZCA6IGZhbHNlfQorfQorCisvLyBDb21wdXRlIGFic29sdXRlIHZhbHVlIG9m
IHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gcGhhc2UgYW5nbGVzLCB0YWtpbmcgaW50byBhY2NvdW50
IHRoZSB3cmFwcGluZworLy8gb2YgcGhhc2VzLgorZnVuY3Rpb24gYWJzb2x1dGVQaGFzZURpZmZl
cmVuY2UoeCwgeSkKK3sKKyAgICB2YXIgZGlmZiA9IE1hdGguYWJzKHggLSB5KTsKKyAgICAKKyAg
ICBpZiAoZGlmZiA+IE1hdGguUEkpIHsKKyAgICAgICAgZGlmZiA9IDIgKiBNYXRoLlBJIC0gZGlm
ZjsKKyAgICB9CisgICAgcmV0dXJuIGRpZmY7Cit9CisKKy8vIENvbXBhcmUgdGhlIGZyZXF1ZW5j
eSByZXNwb25zZSB3aXRoIG91ciBleHBlY3RlZCByZXNwb25zZS4KK2Z1bmN0aW9uIGNvbXBhcmVS
ZXNwb25zZXMoZmlsdGVyLCBmcmVxLCBtYWdSZXNwb25zZSwgcGhhc2VSZXNwb25zZSkKK3sKKyAg
ICB2YXIgZXhwZWN0ZWRSZXNwb25zZSA9IGZyZXF1ZW5jeVJlc3BvbnNlUmVmZXJlbmNlKGZpbHRl
ciwgZnJlcSk7CisgICAgdmFyIGV4cGVjdGVkTWFnbml0dWRlcyA9IGV4cGVjdGVkUmVzcG9uc2Uu
bWFnbml0dWRlczsKKyAgICB2YXIgZXhwZWN0ZWRQaGFzZXMgPSBleHBlY3RlZFJlc3BvbnNlLnBo
YXNlczsKKworICAgIHZhciBuID0gbWFnUmVzcG9uc2UubGVuZ3RoOworICAgIHZhciBzdWNjZXNz
ID0gdHJ1ZTsKKyAgICB2YXIgYmFkUmVzcG9uc2UgPSBmYWxzZTsKKworICAgIHZhciBtYXhNYWdF
cnJvciA9IC0xOworICAgIHZhciBtYXhNYWdFcnJvckluZGV4ID0gLTE7CisKKyAgICB2YXIgazsK
KyAgICB2YXIgaGFzQmFkTnVtYmVyOworCisgICAgaGFzQmFkTnVtYmVyID0gZmluZEJhZE51bWJl
cihtYWdSZXNwb25zZSk7CisgICAgaWYgKGhhc0JhZE51bWJlci5mb3VuZCkgeworICAgICAgICB0
ZXN0RmFpbGVkKCJNYWduaXR1ZGUgcmVzcG9uc2UgaGFzIE5hTiBvciBpbmZpbml0eSBhdCAiICsg
aGFzQmFkTnVtYmVyLmluZGV4KTsKKyAgICAgICAgc3VjY2VzcyA9IGZhbHNlOworICAgICAgICBi
YWRSZXNwb25zZSA9IHRydWU7CisgICAgfQorCisgICAgaGFzQmFkTnVtYmVyID0gZmluZEJhZE51
bWJlcihwaGFzZVJlc3BvbnNlKTsKKyAgICBpZiAoaGFzQmFkTnVtYmVyLmZvdW5kKSB7CisgICAg
ICAgIHRlc3RGYWlsZWQoIlBoYXNlIHJlc3BvbnNlIGhhcyBOYU4gb3IgaW5maW5pdHkgYXQgIiAr
IGhhc0JhZE51bWJlci5pbmRleCk7CisgICAgICAgIHN1Y2Nlc3MgPSBmYWxzZTsKKyAgICAgICAg
YmFkUmVzcG9uc2UgPSB0cnVlOworICAgIH0KKworICAgIC8vIFRoZXNlIGFyZW4ndCB0ZXN0aW5n
IHRoZSBpbXBsZW1lbnRhdGlvbiBpdHNlbGYuICBJbnN0ZWFkLCB0aGVzZSBhcmUgc2FuaXR5IGNo
ZWNrcyBvbiB0aGUKKyAgICAvLyByZWZlcmVuY2UuICBGYWlsdXJlIGhlcmUgZG9lcyBub3QgaW1w
bHkgYW4gZXJyb3IgaW4gdGhlIGltcGxlbWVudGF0aW9uLgorICAgIGhhc0JhZE51bWJlciA9IGZp
bmRCYWROdW1iZXIoZXhwZWN0ZWRNYWduaXR1ZGVzKTsKKyAgICBpZiAoaGFzQmFkTnVtYmVyLmZv
dW5kKSB7CisgICAgICAgIHRlc3RGYWlsZWQoIkV4cGVjdGVkIG1hZ25pdHVkZSByZXNwb25zZSBo
YXMgTmFOIG9yIGluZmluaXR5IGF0ICIgKyBoYXNCYWROdW1iZXIuaW5kZXgpOworICAgICAgICBz
dWNjZXNzID0gZmFsc2U7CisgICAgICAgIGJhZFJlc3BvbnNlID0gdHJ1ZTsKKyAgICB9CisKKyAg
ICBoYXNCYWROdW1iZXIgPSBmaW5kQmFkTnVtYmVyKGV4cGVjdGVkUGhhc2VzKTsKKyAgICBpZiAo
aGFzQmFkTnVtYmVyLmZvdW5kKSB7CisgICAgICAgIHRlc3RGYWlsZWQoIkV4cGVjdGVkIHBoYXNl
IHJlc3BvbnNlIGhhcyBOYU4gb3IgaW5maW5pdHkgYXQgIiArIGhhc0JhZE51bWJlci5pbmRleCk7
CisgICAgICAgIHN1Y2Nlc3MgPSBmYWxzZTsKKyAgICAgICAgYmFkUmVzcG9uc2UgPSB0cnVlOwor
ICAgIH0KKworICAgIC8vIElmIHdlIGZvdW5kIGEgTmFOIG9yIGluZmluaXR5LCB0aGUgZm9sbG93
aW5nIHRlc3RzIGFyZW4ndCB2ZXJ5IGhlbHBmdWwsIGVzcGVjaWFsbHkgZm9yIE5hTi4KKyAgICAv
LyBXZSBydW4gdGhlbSBhbnl3YXksIGFmdGVyIHByaW50aW5nIGEgd2FybmluZyBtZXNzYWdlLgor
CisgICAgaWYgKGJhZFJlc3BvbnNlKSB7CisgICAgICAgIHRlc3RGYWlsZWQoIk5hTiBvciBpbmZp
bml0eSBpbiB0aGUgYWN0dWFsIG9yIGV4cGVjdGVkIHJlc3VsdHMgbWFrZXMgdGhlIGZvbGxvd2lu
ZyB0ZXN0IHJlc3VsdHMgc3VzcGVjdC4iKTsKKyAgICAgICAgc3VjY2VzcyA9IGZhbHNlOworICAg
IH0KKworICAgIGZvciAoayA9IDA7IGsgPCBuOyArK2spIHsKKyAgICAgICAgdmFyIGVycm9yID0g
TWF0aC5hYnMobGluZWFyVG9EZWNpYmVscyhtYWdSZXNwb25zZVtrXSkgLSBsaW5lYXJUb0RlY2li
ZWxzKGV4cGVjdGVkTWFnbml0dWRlc1trXSkpOworICAgICAgICBpZiAoZXJyb3IgPiBtYXhNYWdF
cnJvcikgeworICAgICAgICAgICAgbWF4TWFnRXJyb3IgPSBlcnJvcjsKKyAgICAgICAgICAgIG1h
eE1hZ0Vycm9ySW5kZXggPSBrOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKG1heE1hZ0Vy
cm9yID4gbWF4QWxsb3dlZE1hZ0Vycm9yKSB7CisgICAgICAgIHZhciBtZXNzYWdlID0gIk1hZ25p
dHVkZSBlcnJvciAoaW4gZEIpICgiICsgbWF4TWFnRXJyb3I7CisgICAgICAgIG1lc3NhZ2UgKz0g
IikgZXhjZWVkZWQgdGhyZXNob2xkIGF0ICIgKyBmcmVxW21heE1hZ0Vycm9ySW5kZXhdOworICAg
ICAgICBtZXNzYWdlICs9ICIgSHouICBBY3R1YWw6ICIgKyBsaW5lYXJUb0RlY2liZWxzKG1hZ1Jl
c3BvbnNlW21heE1hZ0Vycm9ySW5kZXhdKTsKKyAgICAgICAgbWVzc2FnZSArPSAiIGV4cGVjdGVk
OiAiICsgbGluZWFyVG9EZWNpYmVscyhleHBlY3RlZE1hZ25pdHVkZVttYXhNYWdFcnJvckluZGV4
XSk7CisgICAgICAgIHRlc3RGYWlsZWQobWVzc2FnZSk7CisgICAgICAgIHN1Y2Nlc3MgPSBmYWxz
ZTsKKyAgICB9IGVsc2UgeworICAgICAgICB0ZXN0UGFzc2VkKCJNYWduaXR1ZGUgcmVzcG9uc2Ug
d2l0aGluIGFjY2VwdGFibGUgdGhyZXNob2xkLiIpOworICAgIH0KKworICAgIHZhciBtYXhQaGFz
ZUVycm9yID0gLTE7CisgICAgdmFyIG1heFBoYXNlRXJyb3JJbmRleCA9IC0xOworCisgICAgZm9y
IChrID0gMDsgayA8IG47ICsraykgeworICAgICAgICB2YXIgZXJyb3IgPSBhYnNvbHV0ZVBoYXNl
RGlmZmVyZW5jZShwaGFzZVJlc3BvbnNlW2tdLCBleHBlY3RlZFBoYXNlc1trXSk7CisgICAgICAg
IGlmIChlcnJvciA+IG1heFBoYXNlRXJyb3IpIHsKKyAgICAgICAgICAgIG1heFBoYXNlRXJyb3Ig
PSBlcnJvcjsKKyAgICAgICAgICAgIG1heFBoYXNlRXJyb3JJbmRleCA9IGs7CisgICAgICAgIH0K
KyAgICB9CisKKyAgICBpZiAobWF4UGhhc2VFcnJvciA+IG1heEFsbG93ZWRQaGFzZUVycm9yKSB7
CisgICAgICAgIHZhciBtZXNzYWdlID0gIlBoYXNlIGVycm9yIChyYWRpYW5zKSAoIiArIG1heFBo
YXNlRXJyb3I7CisgICAgICAgIG1lc3NhZ2UgKz0gIikgZXhjZWVkZWQgdGhyZXNob2xkIGF0ICIg
KyBmcmVxW21heFBoYXNlRXJyb3JJbmRleF07CisgICAgICAgIG1lc3NhZ2UgKz0gIiBIei4gIEFj
dHVhbDogIiArIHBoYXNlUmVzcG9uc2VbbWF4UGhhc2VFcnJvckluZGV4XTsKKyAgICAgICAgbWVz
c2FnZSArPSAiIGV4cGVjdGVkOiAiICsgZXhwZWN0ZWRQaGFzZVttYXhQaGFzZUVycm9ySW5kZXhd
OworICAgICAgICB0ZXN0RmFpbGVkKG1lc3NhZ2UpOworICAgICAgICBzdWNjZXNzID0gZmFsc2U7
CisgICAgfSBlbHNlIHsKKyAgICAgICAgdGVzdFBhc3NlZCgiUGhhc2UgcmVzcG9uc2Ugd2l0aGlu
IGFjY2VwdGFibGUgdGhyZXNob2xkLiIpOworICAgIH0KKworCisgICAgcmV0dXJuIHN1Y2Nlc3M7
Cit9CisKK2Z1bmN0aW9uIHJ1blRlc3QoKQoreworICAgIGlmICh3aW5kb3cubGF5b3V0VGVzdENv
bnRyb2xsZXIpIHsKKyAgICAgICAgbGF5b3V0VGVzdENvbnRyb2xsZXIuZHVtcEFzVGV4dCgpOwor
ICAgICAgICBsYXlvdXRUZXN0Q29udHJvbGxlci53YWl0VW50aWxEb25lKCk7CisgICAgfQorCisg
ICAgd2luZG93LmpzVGVzdElzQXN5bmMgPSB0cnVlOworCisgICAgY29udGV4dCA9IG5ldyB3ZWJr
aXRBdWRpb0NvbnRleHQoKTsKKyAgICAKKyAgICBmaWx0ZXIgPSBjb250ZXh0LmNyZWF0ZUJpcXVh
ZEZpbHRlcigpOworCisgICAgLy8gQXJiaXRyYXJpbHkgdGVzdCBhIHBlYWtpbmcgZmlsdGVyLCBi
dXQgYW55IGtpbmQgb2YgZmlsdGVyIGNhbiBiZSB0ZXN0ZWQuCisgICAgZmlsdGVyLnR5cGUgPSBm
aWx0ZXIuUEVBS0lORzsKKyAgICBmaWx0ZXIuZnJlcXVlbmN5LnZhbHVlID0gZmlsdGVyQ3V0b2Zm
OworICAgIGZpbHRlci5RLnZhbHVlID0gZmlsdGVyUTsKKyAgICBmaWx0ZXIuZ2Fpbi52YWx1ZSA9
IGZpbHRlckdhaW47CisKKyAgICBmcmVxU2FtcGxlcyA9IGNyZWF0ZUZyZXF1ZW5jeVNhbXBsZUFy
cmF5KG5GcmVxdWVuY3lTYW1wbGVzLCBjb250ZXh0LnNhbXBsZVJhdGUpOworICAgIG1hZ1Jlc3Bv
bnNlID0gbmV3IEZsb2F0MzJBcnJheShuRnJlcXVlbmN5U2FtcGxlcyk7CisgICAgcGhhc2VSZXNw
b25zZSA9IG5ldyBGbG9hdDMyQXJyYXkobkZyZXF1ZW5jeVNhbXBsZXMpOworCisgICAgZmlsdGVy
LmdldEZyZXF1ZW5jeVJlc3BvbnNlKGZyZXFTYW1wbGVzLCBtYWdSZXNwb25zZSwgcGhhc2VSZXNw
b25zZSk7CisgICAgdmFyIHN1Y2Nlc3MgPSBjb21wYXJlUmVzcG9uc2VzKGZpbHRlciwgZnJlcVNh
bXBsZXMsIG1hZ1Jlc3BvbnNlLCBwaGFzZVJlc3BvbnNlKTsKKworICAgIGlmIChzdWNjZXNzKSB7
CisgICAgICAgIHRlc3RQYXNzZWQoZmlsdGVyVHlwZU5hbWVbZmlsdGVyLnR5cGVdICsgIiBmcmVx
dWVuY3kgcmVzcG9uc2Ugd2FzIGNvcnJlY3QuIik7CisgICAgfSBlbHNlIHsKKyAgICAgICAgdGVz
dEZhaWxlZChmaWx0ZXJUeXBlTmFtZVtmaWx0ZXIudHlwZV0gKyAiIGZyZXF1ZW5jeSByZXNwb25z
ZSB3YXMgaW5jb3JyZWN0LiIpOworICAgIH0KKworICAgIGZpbmlzaEpTVGVzdCgpOworfQorCity
dW5UZXN0KCk7CitzdWNjZXNzZnVsbHlQYXJzZWQgPSB0cnVlOworCis8L3NjcmlwdD4KKworPHNj
cmlwdCBzcmM9Ii4uL2Zhc3QvanMvcmVzb3VyY2VzL2pzLXRlc3QtcG9zdC5qcyI+PC9zY3JpcHQ+
Cis8L2JvZHk+Cis8L2h0bWw+Cg==
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>129923</attachid>
            <date>2012-03-02 10:43:23 -0800</date>
            <delta_ts>2012-03-02 13:09:26 -0800</delta_ts>
            <desc>Patch</desc>
            <filename>bug-79503-20120302104322.patch</filename>
            <type>text/plain</type>
            <size>12067</size>
            <attacher name="Raymond Toy">rtoy</attacher>
            
              <data encoding="base64">U3VidmVyc2lvbiBSZXZpc2lvbjogMTA5NDY0CmRpZmYgLS1naXQgYS9MYXlvdXRUZXN0cy9DaGFu
Z2VMb2cgYi9MYXlvdXRUZXN0cy9DaGFuZ2VMb2cKaW5kZXggOWVjMDFhYTU5N2RlODNmMzc5OTEx
NDlhMzQ3OTk0ZjUzNDQ3MWIzYy4uZjBjN2NhZWJlNDUwOTI2NzliYjU3MWVhZjI3ZmZkYzQzOWJh
Mzc5YSAxMDA2NDQKLS0tIGEvTGF5b3V0VGVzdHMvQ2hhbmdlTG9nCisrKyBiL0xheW91dFRlc3Rz
L0NoYW5nZUxvZwpAQCAtMSwzICsxLDE1IEBACisyMDEyLTAyLTI0ICBSYXltb25kIFRveSAgPHJ0
b3lAZ29vZ2xlLmNvbT4KKworICAgICAgICBCaXF1YWQgZ2V0RnJlcXVlbmN5UmVzcG9uc2UgbmVl
ZHMgYSBsYXlvdXQgdGVzdC4KKyAgICAgICAgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19i
dWcuY2dpP2lkPTc5NTAzCisKKyAgICAgICAgQWRkIHNpbXBsZSB0ZXN0IGZvciBnZXRGcmVxdWVu
Y3lSZXNwb25zZS4KKyAgICAgICAgCisgICAgICAgIFJldmlld2VkIGJ5IE5PQk9EWSAoT09QUyEp
LgorCisgICAgICAgICogd2ViYXVkaW8vYmlxdWFkLWdldEZyZXF1ZW5jeVJlc3BvbnNlLWV4cGVj
dGVkLnR4dDogQWRkZWQuCisgICAgICAgICogd2ViYXVkaW8vYmlxdWFkLWdldEZyZXF1ZW5jeVJl
c3BvbnNlLmh0bWw6IEFkZGVkLgorCiAyMDEyLTAzLTAxICBBZGFtIEtsZWluICA8YWRhbWtAY2hy
b21pdW0ub3JnPgogCiAgICAgICAgIFVucmV2aWV3ZWQgZ2FyZGVuaW5nLiBNYXJrIHR3byBtZWRp
YSB0ZXN0cyBhcyBmbGFreS4KZGlmZiAtLWdpdCBhL0xheW91dFRlc3RzL3dlYmF1ZGlvL2JpcXVh
ZC1nZXRGcmVxdWVuY3lSZXNwb25zZS1leHBlY3RlZC50eHQgYi9MYXlvdXRUZXN0cy93ZWJhdWRp
by9iaXF1YWQtZ2V0RnJlcXVlbmN5UmVzcG9uc2UtZXhwZWN0ZWQudHh0Cm5ldyBmaWxlIG1vZGUg
MTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAuLjkz
MDExODIzOTBlZTUyNjg1NDE1NWNlOTQ2MmFmNzllNTkxZTU5NGIKLS0tIC9kZXYvbnVsbAorKysg
Yi9MYXlvdXRUZXN0cy93ZWJhdWRpby9iaXF1YWQtZ2V0RnJlcXVlbmN5UmVzcG9uc2UtZXhwZWN0
ZWQudHh0CkBAIC0wLDAgKzEsMTEgQEAKK1Rlc3QgQmlxdWFkIGdldEZyZXF1ZW5jeVJlc3BvbnNl
KCkgZnVuY3Rpb25hbGl0eS4KKworT24gc3VjY2VzcywgeW91IHdpbGwgc2VlIGEgc2VyaWVzIG9m
ICJQQVNTIiBtZXNzYWdlcywgZm9sbG93ZWQgYnkgIlRFU1QgQ09NUExFVEUiLgorCitQQVNTIE1h
Z25pdHVkZSByZXNwb25zZSB3aXRoaW4gYWNjZXB0YWJsZSB0aHJlc2hvbGQuCitQQVNTIFBoYXNl
IHJlc3BvbnNlIHdpdGhpbiBhY2NlcHRhYmxlIHRocmVzaG9sZC4KK1BBU1MgUGVha2luZyBmaWx0
ZXIgZnJlcXVlbmN5IHJlc3BvbnNlIHdhcyBjb3JyZWN0LgorUEFTUyBzdWNjZXNzZnVsbHlQYXJz
ZWQgaXMgdHJ1ZQorCitURVNUIENPTVBMRVRFCisKZGlmZiAtLWdpdCBhL0xheW91dFRlc3RzL3dl
YmF1ZGlvL2JpcXVhZC1nZXRGcmVxdWVuY3lSZXNwb25zZS5odG1sIGIvTGF5b3V0VGVzdHMvd2Vi
YXVkaW8vYmlxdWFkLWdldEZyZXF1ZW5jeVJlc3BvbnNlLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2
NDQKaW5kZXggMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMC4uYWZmZDUy
N2E1YTk1ZDM2YWI1OWM0Njc0YWZkMWQ3MmViYjMyNmE1OQotLS0gL2Rldi9udWxsCisrKyBiL0xh
eW91dFRlc3RzL3dlYmF1ZGlvL2JpcXVhZC1nZXRGcmVxdWVuY3lSZXNwb25zZS5odG1sCkBAIC0w
LDAgKzEsMzE0IEBACis8IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4w
MSBUcmFuc2l0aW9uYWwvL0VOIj4KKzxodG1sPgorPGhlYWQ+Cis8c2NyaXB0IHNyYz0icmVzb3Vy
Y2VzL2F1ZGlvLXRlc3RpbmcuanMiPjwvc2NyaXB0PgorPHNjcmlwdCBzcmM9InJlc291cmNlcy9i
aXF1YWQtdGVzdGluZy5qcyI+PC9zY3JpcHQ+Cis8c2NyaXB0IHNyYz0iLi4vZmFzdC9qcy9yZXNv
dXJjZXMvanMtdGVzdC1wcmUuanMiPjwvc2NyaXB0PgorPC9oZWFkPgorCis8Ym9keT4KKzxkaXYg
aWQ9ImRlc2NyaXB0aW9uIj48L2Rpdj4KKzxkaXYgaWQ9ImNvbnNvbGUiPjwvZGl2PgorCis8c2Ny
aXB0PgorZGVzY3JpcHRpb24oIlRlc3QgQmlxdWFkIGdldEZyZXF1ZW5jeVJlc3BvbnNlKCkgZnVu
Y3Rpb25hbGl0eS4iKTsKKworLy8gVGVzdCB0aGUgZnJlcXVlbmN5IHJlc3BvbnNlIG9mIGEgYmlx
dWFkIGZpbHRlci4gIFdlIGNvbXB1dGUgdGhlIGZyZXF1ZW5jeSByZXNwb25zZSBmb3IgYSBzaW1w
bGUKKy8vIHBlYWtpbmcgYmlxdWFkIGZpbHRlciBhbmQgY29tcGFyZSBpdCB3aXRoIHRoZSBleHBl
Y3RlZCBmcmVxdWVuY3kgcmVzcG9uc2UuICBUaGUgYWN0dWFsIGZpbHRlcgorLy8gdXNlZCBkb2Vz
bid0IG1hdHRlciBzaW5jZSB3ZSdyZSB0ZXN0aW5nIGdldEZyZXF1ZW5jeVJlc3BvbnNlIGFuZCBu
b3QgdGhlIGFjdHVhbCBmaWx0ZXIgb3V0cHV0LgorLy8gVGhlIGZpbHRlcnMgYXJlIGV4dGVuc2l2
ZWx5IHRlc3RlZCBpbiBvdGhlciBiaXF1YWQgdGVzdHMuCisKK3ZhciBjb250ZXh0OworCisvLyBU
aGUgYmlxdWFkIGZpbHRlciBub2RlLgordmFyIGZpbHRlcjsKKworLy8gVGhlIG1hZ25pdHVkZSBy
ZXNwb25zZSBvZiB0aGUgYmlxdWFkIGZpbHRlci4KK3ZhciBtYWdSZXNwb25zZTsKKworLy8gVGhl
IHBoYXNlIHJlc3BvbnNlIG9mIHRoZSBiaXF1YWQgZmlsdGVyLgordmFyIHBoYXNlUmVzcG9uc2U7
CisKKy8vIE51bWJlciBvZiBmcmVxdWVuY3kgc2FtcGxlcyB0byB0YWtlLgordmFyIG51bWJlck9m
RnJlcXVlbmNpZXMgPSAxMDAwOworCisvLyBUaGUgZmlsdGVyIHBhcmFtZXRlcnMuCit2YXIgZmls
dGVyQ3V0b2ZmID0gMTAwMDsgLy8gSHouCit2YXIgZmlsdGVyUSA9IDE7Cit2YXIgZmlsdGVyR2Fp
biA9IDU7IC8vIERlY2liZWxzLgorCisvLyBUaGUgbWF4aW11bSBhbGxvd2VkIGVycm9yIGluIHRo
ZSBtYWduaXR1ZGUgcmVzcG9uc2UuCit2YXIgbWF4QWxsb3dlZE1hZ0Vycm9yID0gNS43ZS03Owor
CisvLyBUaGUgbWF4aW11bSBhbGxvd2VkIGVycm9yIGluIHRoZSBwaGFzZSByZXNwb25zZS4KK3Zh
ciBtYXhBbGxvd2VkUGhhc2VFcnJvciA9IDQuN2UtODsKKworLy8gVGhlIG1hZ25pdHVkZXMgYW5k
IHBoYXNlcyBvZiB0aGUgcmVmZXJlbmNlIGZyZXF1ZW5jeSByZXNwb25zZS4KK3ZhciBtYWdSZXNw
b25zZTsKK3ZhciBwaGFzZVJlc3BvbnNlOworICAgICAgCisvLyBUaGUgbWFnbml0dWRlcyBhbmQg
cGhhc2VzIG9mIHRoZSByZWZlcmVuY2UgZnJlcXVlbmN5IHJlc3BvbnNlLgordmFyIGV4cGVjdGVk
TWFnbml0dWRlczsKK3ZhciBleHBlY3RlZFBoYXNlczsKKworLy8gQ29udmVydCBmcmVxdWVuY3kg
aW4gSHogdG8gYSBub3JtYWxpemVkIGZyZXF1ZW5jeSBiZXR3ZWVuIDAgdG8gMSB3aXRoIDEgY29y
cmVzcG9uZGluZyB0byB0aGUKKy8vIE55cXVpc3QgZnJlcXVlbmN5LgorZnVuY3Rpb24gbm9ybWFs
aXplZEZyZXF1ZW5jeShmcmVxSHosIHNhbXBsZVJhdGUpCit7CisgICAgdmFyIG55cXVpc3QgPSBz
YW1wbGVSYXRlIC8gMjsKKyAgICByZXR1cm4gZnJlcUh6IC8gbnlxdWlzdDsKK30KKworLy8gR2V0
IHRoZSBmaWx0ZXIgcmVzcG9uc2UgYXQgYSAobm9ybWFsaXplZCkgZnJlcXVlbmN5IHxmfCBmb3Ig
dGhlIGZpbHRlciB3aXRoIGNvZWZmaWNpZW50cyB8Y29lZnwuCitmdW5jdGlvbiBnZXRSZXNwb25z
ZUF0KGNvZWYsIGYpCit7CisgICAgdmFyIGIwID0gY29lZi5iMDsKKyAgICB2YXIgYjEgPSBjb2Vm
LmIxOworICAgIHZhciBiMiA9IGNvZWYuYjI7CisgICAgdmFyIGExID0gY29lZi5hMTsKKyAgICB2
YXIgYTIgPSBjb2VmLmEyOworCisgICAgLy8gSCh6KSA9IChiMCArIGIxIC8geiArIGIyIC8gel4y
KSAvICgxICsgYTEgLyB6ICsgYTIgLyB6XjIpCisgICAgLy8KKyAgICAvLyBDb21wdXRlIEgoZXhw
KGkgKiBwaSAqIGYpKS4gIE5vIG5hdGl2ZSBjb21wbGV4IG51bWJlcnMgaW4gamF2YXNjcmlwdCwg
c28gYnJlYWsgSChleHAoaSpwaSpmKSkKKyAgICAvLyBpbiB0byB0aGUgcmVhbCBhbmQgaW1hZ2lu
YXJ5IHBhcnRzIG9mIHRoZSBudW1lcmF0b3IgYW5kIGRlbm9taW5hdG9yLiAgTGV0IG9tZWdhID0g
cGkgKiBmLgorICAgIC8vIFRoZW4gdGhlIG51bWVyYXRvciBpcworICAgIC8vCisgICAgLy8gYjAg
KyBiMSAqIGNvcyhvbWVnYSkgKyBiMiAqIGNvcygyICogb21lZ2EpIC0gaSAqIChiMSAqIHNpbihv
bWVnYSkgKyBiMiAqIHNpbigyICogb21lZ2EpKQorICAgIC8vCisgICAgLy8gYW5kIHRoZSBkZW5v
bWluYXRvciBpcworICAgIC8vCisgICAgLy8gMSArIGExICogY29zKG9tZWdhKSArIGEyICogY29z
KDIgKiBvbWVnYSkgLSBpICogKGExICogc2luKG9tZWdhKSArIGEyICogc2luKDIgKiBvbWVnYSkp
CisgICAgLy8KKyAgICAvLyBDb21wdXRlIHRoZSBtYWduaXR1ZGUgYW5kIHBoYXNlIGZyb20gdGhl
IHJlYWwgYW5kIGltYWdpbmFyeSBwYXJ0cy4KKworICAgIHZhciBvbWVnYSA9IE1hdGguUEkgKiBm
OworICAgIHZhciBudW1lcmF0b3JSZWFsID0gYjAgKyBiMSAqIE1hdGguY29zKG9tZWdhKSArIGIy
ICogTWF0aC5jb3MoMiAqIG9tZWdhKTsKKyAgICB2YXIgbnVtZXJhdG9ySW1hZyA9IC0oYjEgKiBN
YXRoLnNpbihvbWVnYSkgKyBiMiAqIE1hdGguc2luKDIgKiBvbWVnYSkpOworICAgIHZhciBkZW5v
bWluYXRvclJlYWwgPSAxICsgYTEgKiBNYXRoLmNvcyhvbWVnYSkgKyBhMiAqIE1hdGguY29zKDIg
KiBvbWVnYSk7CisgICAgdmFyIGRlbm9taW5hdG9ySW1hZyA9IC0oYTEgKiBNYXRoLnNpbihvbWVn
YSkgKyBhMiAqIE1hdGguc2luKDIgKiBvbWVnYSkpOworCisgICAgdmFyIG1hZ25pdHVkZSA9IE1h
dGguc3FydCgobnVtZXJhdG9yUmVhbCAqIG51bWVyYXRvclJlYWwgKyBudW1lcmF0b3JJbWFnICog
bnVtZXJhdG9ySW1hZykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8gKGRlbm9taW5h
dG9yUmVhbCAqIGRlbm9taW5hdG9yUmVhbCArIGRlbm9taW5hdG9ySW1hZyAqIGRlbm9taW5hdG9y
SW1hZykpOworICAgIHZhciBwaGFzZSA9IE1hdGguYXRhbjIobnVtZXJhdG9ySW1hZywgbnVtZXJh
dG9yUmVhbCkgLSBNYXRoLmF0YW4yKGRlbm9taW5hdG9ySW1hZywgZGVub21pbmF0b3JSZWFsKTsK
KyAgICAKKyAgICBpZiAocGhhc2UgPj0gTWF0aC5QSSkgeworICAgICAgICBwaGFzZSAtPSBNYXRo
LlBJOworICAgIH0gZWxzZSBpZiAocGhhc2UgPD0gLU1hdGguUEkpIHsKKyAgICAgICAgcGhhc2Ug
Kz0gTWF0aC5QSTsKKyAgICB9CisgICAKKyAgICByZXR1cm4ge21hZ25pdHVkZSA6IG1hZ25pdHVk
ZSwgcGhhc2UgOiBwaGFzZX07IAorfQorCisvLyBDb21wdXRlIHRoZSByZWZlcmVuY2UgZnJlcXVl
bmN5IHJlc3BvbnNlIGZvciB0aGUgYmlxdWFkIGZpbHRlciB8ZmlsdGVyfCBhdCB0aGUgZnJlcXVl
bmN5IHNhbXBsZXMKKy8vIGdpdmVuIGJ5IHxmcmVxdWVuY2llc3wuCitmdW5jdGlvbiBmcmVxdWVu
Y3lSZXNwb25zZVJlZmVyZW5jZShmaWx0ZXIsIGZyZXF1ZW5jaWVzKQoreworICAgIHZhciBzYW1w
bGVSYXRlID0gZmlsdGVyLmNvbnRleHQuc2FtcGxlUmF0ZTsKKyAgICB2YXIgbm9ybWFsaXplZEZy
ZXEgPSBub3JtYWxpemVkRnJlcXVlbmN5KGZpbHRlci5mcmVxdWVuY3kudmFsdWUsIHNhbXBsZVJh
dGUpOworICAgIHZhciBmaWx0ZXJDb2VmZmljaWVudHMgPSBjcmVhdGVGaWx0ZXIoZmlsdGVyLnR5
cGUsIG5vcm1hbGl6ZWRGcmVxLCBmaWx0ZXIuUS52YWx1ZSwgZmlsdGVyLmdhaW4udmFsdWUpOwor
CisgICAgdmFyIG1hZ25pdHVkZXMgPSBbXTsKKyAgICB2YXIgcGhhc2VzID0gW107CisKKyAgICBm
b3IgKHZhciBrID0gMDsgayA8IGZyZXF1ZW5jaWVzLmxlbmd0aDsgKytrKSB7CisgICAgICAgIHZh
ciByZXNwb25zZSA9IGdldFJlc3BvbnNlQXQoZmlsdGVyQ29lZmZpY2llbnRzLCBub3JtYWxpemVk
RnJlcXVlbmN5KGZyZXF1ZW5jaWVzW2tdLCBzYW1wbGVSYXRlKSk7CisgICAgICAgIG1hZ25pdHVk
ZXMucHVzaChyZXNwb25zZS5tYWduaXR1ZGUpOworICAgICAgICBwaGFzZXMucHVzaChyZXNwb25z
ZS5waGFzZSk7CisgICAgfQorCisgICAgcmV0dXJuIHttYWduaXR1ZGVzIDogbWFnbml0dWRlcywg
cGhhc2VzIDogcGhhc2VzfTsKK30KKworLy8gQ29tcHV0ZSBhIHNldCBvZiBsaW5lYXJseSBzcGFj
ZWQgZnJlcXVlbmNpZXMuCitmdW5jdGlvbiBjcmVhdGVGcmVxdWVuY2llcyhuRnJlcXVlbmNpZXMs
IHNhbXBsZVJhdGUpCit7CisgICAgdmFyIGZyZXF1ZW5jaWVzID0gbmV3IEZsb2F0MzJBcnJheShu
RnJlcXVlbmNpZXMpOworICAgIHZhciBueXF1aXN0ID0gc2FtcGxlUmF0ZSAvIDI7CisgICAgdmFy
IGZyZXFEZWx0YSA9IG55cXVpc3QgLyBuRnJlcXVlbmNpZXM7CisKKyAgICBmb3IgKHZhciBrID0g
MDsgayA8IG5GcmVxdWVuY2llczsgKytrKSB7CisgICAgICAgIGZyZXF1ZW5jaWVzW2tdID0gayAq
IGZyZXFEZWx0YTsKKyAgICB9CisKKyAgICByZXR1cm4gZnJlcXVlbmNpZXM7Cit9CisKK2Z1bmN0
aW9uIGxpbmVhclRvRGVjaWJlbHMoeCkKK3sKKyAgICBpZiAoeCkgeworICAgICAgICByZXR1cm4g
MjAgKiBNYXRoLmxvZyh4KSAvIE1hdGguTE4xMDsKKyAgICB9IGVsc2UgeworICAgICAgICByZXR1
cm4gLTEwMDA7CisgICAgfQorfQorCisvLyBMb29rIHRocm91Z2ggdGhlIGFycmF5IGFuZCBmaW5k
IGFueSBOYU4gb3IgaW5maW5pdHkuIFJldHVybnMgdGhlIGluZGV4IG9mIHRoZSBmaXJzdCBvY2N1
cmVuY2Ugb3IKKy8vIC0xIGlmIG5vbmUuCitmdW5jdGlvbiBmaW5kQmFkTnVtYmVyKHNpZ25hbCkK
K3sKKyAgICBmb3IgKHZhciBrID0gMDsgayA8IHNpZ25hbC5sZW5ndGg7ICsraykgeworICAgICAg
ICBpZiAoIWlzVmFsaWROdW1iZXIoc2lnbmFsW2tdKSkgeworICAgICAgICAgICByZXR1cm4gazsK
KyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gLTE7Cit9CisKKy8vIENvbXB1dGUgYWJzb2x1
dGUgdmFsdWUgb2YgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiBwaGFzZSBhbmdsZXMsIHRha2luZyBp
bnRvIGFjY291bnQgdGhlIHdyYXBwaW5nCisvLyBvZiBwaGFzZXMuCitmdW5jdGlvbiBhYnNvbHV0
ZVBoYXNlRGlmZmVyZW5jZSh4LCB5KQoreworICAgIHZhciBkaWZmID0gTWF0aC5hYnMoeCAtIHkp
OworICAgIAorICAgIGlmIChkaWZmID4gTWF0aC5QSSkgeworICAgICAgICBkaWZmID0gMiAqIE1h
dGguUEkgLSBkaWZmOworICAgIH0KKyAgICByZXR1cm4gZGlmZjsKK30KKworLy8gQ29tcGFyZSB0
aGUgZnJlcXVlbmN5IHJlc3BvbnNlIHdpdGggb3VyIGV4cGVjdGVkIHJlc3BvbnNlLgorZnVuY3Rp
b24gY29tcGFyZVJlc3BvbnNlcyhmaWx0ZXIsIGZyZXF1ZW5jaWVzLCBtYWdSZXNwb25zZSwgcGhh
c2VSZXNwb25zZSkKK3sKKyAgICB2YXIgZXhwZWN0ZWRSZXNwb25zZSA9IGZyZXF1ZW5jeVJlc3Bv
bnNlUmVmZXJlbmNlKGZpbHRlciwgZnJlcXVlbmNpZXMpOworCisgICAgZXhwZWN0ZWRNYWduaXR1
ZGVzID0gZXhwZWN0ZWRSZXNwb25zZS5tYWduaXR1ZGVzOworICAgIGV4cGVjdGVkUGhhc2VzID0g
ZXhwZWN0ZWRSZXNwb25zZS5waGFzZXM7CisKKyAgICB2YXIgbiA9IG1hZ1Jlc3BvbnNlLmxlbmd0
aDsKKyAgICB2YXIgc3VjY2VzcyA9IHRydWU7CisgICAgdmFyIGJhZFJlc3BvbnNlID0gZmFsc2U7
CisKKyAgICB2YXIgbWF4TWFnRXJyb3IgPSAtMTsKKyAgICB2YXIgbWF4TWFnRXJyb3JJbmRleCA9
IC0xOworCisgICAgdmFyIGs7CisgICAgdmFyIGhhc0JhZE51bWJlcjsKKworICAgIGhhc0JhZE51
bWJlciA9IGZpbmRCYWROdW1iZXIobWFnUmVzcG9uc2UpOworICAgIGlmIChoYXNCYWROdW1iZXIg
Pj0gMCkgeworICAgICAgICB0ZXN0RmFpbGVkKCJNYWduaXR1ZGUgcmVzcG9uc2UgaGFzIE5hTiBv
ciBpbmZpbml0eSBhdCAiICsgaGFzQmFkTnVtYmVyKTsKKyAgICAgICAgc3VjY2VzcyA9IGZhbHNl
OworICAgICAgICBiYWRSZXNwb25zZSA9IHRydWU7CisgICAgfQorCisgICAgaGFzQmFkTnVtYmVy
ID0gZmluZEJhZE51bWJlcihwaGFzZVJlc3BvbnNlKTsKKyAgICBpZiAoaGFzQmFkTnVtYmVyID49
IDApIHsKKyAgICAgICAgdGVzdEZhaWxlZCgiUGhhc2UgcmVzcG9uc2UgaGFzIE5hTiBvciBpbmZp
bml0eSBhdCAiICsgaGFzQmFkTnVtYmVyKTsKKyAgICAgICAgc3VjY2VzcyA9IGZhbHNlOworICAg
ICAgICBiYWRSZXNwb25zZSA9IHRydWU7CisgICAgfQorCisgICAgLy8gVGhlc2UgYXJlbid0IHRl
c3RpbmcgdGhlIGltcGxlbWVudGF0aW9uIGl0c2VsZi4gIEluc3RlYWQsIHRoZXNlIGFyZSBzYW5p
dHkgY2hlY2tzIG9uIHRoZQorICAgIC8vIHJlZmVyZW5jZS4gIEZhaWx1cmUgaGVyZSBkb2VzIG5v
dCBpbXBseSBhbiBlcnJvciBpbiB0aGUgaW1wbGVtZW50YXRpb24uCisgICAgaGFzQmFkTnVtYmVy
ID0gZmluZEJhZE51bWJlcihleHBlY3RlZE1hZ25pdHVkZXMpOworICAgIGlmIChoYXNCYWROdW1i
ZXIgPj0gMCkgeworICAgICAgICB0ZXN0RmFpbGVkKCJFeHBlY3RlZCBtYWduaXR1ZGUgcmVzcG9u
c2UgaGFzIE5hTiBvciBpbmZpbml0eSBhdCAiICsgaGFzQmFkTnVtYmVyKTsKKyAgICAgICAgc3Vj
Y2VzcyA9IGZhbHNlOworICAgICAgICBiYWRSZXNwb25zZSA9IHRydWU7CisgICAgfQorCisgICAg
aGFzQmFkTnVtYmVyID0gZmluZEJhZE51bWJlcihleHBlY3RlZFBoYXNlcyk7CisgICAgaWYgKGhh
c0JhZE51bWJlciA+PSAwKSB7CisgICAgICAgIHRlc3RGYWlsZWQoIkV4cGVjdGVkIHBoYXNlIHJl
c3BvbnNlIGhhcyBOYU4gb3IgaW5maW5pdHkgYXQgIiArIGhhc0JhZE51bWJlcik7CisgICAgICAg
IHN1Y2Nlc3MgPSBmYWxzZTsKKyAgICAgICAgYmFkUmVzcG9uc2UgPSB0cnVlOworICAgIH0KKwor
ICAgIC8vIElmIHdlIGZvdW5kIGEgTmFOIG9yIGluZmluaXR5LCB0aGUgZm9sbG93aW5nIHRlc3Rz
IGFyZW4ndCB2ZXJ5IGhlbHBmdWwsIGVzcGVjaWFsbHkgZm9yIE5hTi4KKyAgICAvLyBXZSBydW4g
dGhlbSBhbnl3YXksIGFmdGVyIHByaW50aW5nIGEgd2FybmluZyBtZXNzYWdlLgorCisgICAgaWYg
KGJhZFJlc3BvbnNlKSB7CisgICAgICAgIHRlc3RGYWlsZWQoIk5hTiBvciBpbmZpbml0eSBpbiB0
aGUgYWN0dWFsIG9yIGV4cGVjdGVkIHJlc3VsdHMgbWFrZXMgdGhlIGZvbGxvd2luZyB0ZXN0IHJl
c3VsdHMgc3VzcGVjdC4iKTsKKyAgICAgICAgc3VjY2VzcyA9IGZhbHNlOworICAgIH0KKworICAg
IGZvciAoayA9IDA7IGsgPCBuOyArK2spIHsKKyAgICAgICAgdmFyIGVycm9yID0gTWF0aC5hYnMo
bGluZWFyVG9EZWNpYmVscyhtYWdSZXNwb25zZVtrXSkgLSBsaW5lYXJUb0RlY2liZWxzKGV4cGVj
dGVkTWFnbml0dWRlc1trXSkpOworICAgICAgICBpZiAoZXJyb3IgPiBtYXhNYWdFcnJvcikgewor
ICAgICAgICAgICAgbWF4TWFnRXJyb3IgPSBlcnJvcjsKKyAgICAgICAgICAgIG1heE1hZ0Vycm9y
SW5kZXggPSBrOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKG1heE1hZ0Vycm9yID4gbWF4
QWxsb3dlZE1hZ0Vycm9yKSB7CisgICAgICAgIHZhciBtZXNzYWdlID0gIk1hZ25pdHVkZSBlcnJv
ciAoIiArIG1heE1hZ0Vycm9yICsgIiBkQikiOworICAgICAgICBtZXNzYWdlICs9ICIgZXhjZWVk
ZWQgdGhyZXNob2xkIGF0ICIgKyBmcmVxdWVuY2llc1ttYXhNYWdFcnJvckluZGV4XTsKKyAgICAg
ICAgbWVzc2FnZSArPSAiIEh6LiAgQWN0dWFsOiAiICsgbGluZWFyVG9EZWNpYmVscyhtYWdSZXNw
b25zZVttYXhNYWdFcnJvckluZGV4XSk7CisgICAgICAgIG1lc3NhZ2UgKz0gIiBkQiwgZXhwZWN0
ZWQ6ICIgKyBsaW5lYXJUb0RlY2liZWxzKGV4cGVjdGVkTWFnbml0dWRlc1ttYXhNYWdFcnJvcklu
ZGV4XSkgKyAiIGRCLiI7CisgICAgICAgIHRlc3RGYWlsZWQobWVzc2FnZSk7CisgICAgICAgIHN1
Y2Nlc3MgPSBmYWxzZTsKKyAgICB9IGVsc2UgeworICAgICAgICB0ZXN0UGFzc2VkKCJNYWduaXR1
ZGUgcmVzcG9uc2Ugd2l0aGluIGFjY2VwdGFibGUgdGhyZXNob2xkLiIpOworICAgIH0KKworICAg
IHZhciBtYXhQaGFzZUVycm9yID0gLTE7CisgICAgdmFyIG1heFBoYXNlRXJyb3JJbmRleCA9IC0x
OworCisgICAgZm9yIChrID0gMDsgayA8IG47ICsraykgeworICAgICAgICB2YXIgZXJyb3IgPSBh
YnNvbHV0ZVBoYXNlRGlmZmVyZW5jZShwaGFzZVJlc3BvbnNlW2tdLCBleHBlY3RlZFBoYXNlc1tr
XSk7CisgICAgICAgIGlmIChlcnJvciA+IG1heFBoYXNlRXJyb3IpIHsKKyAgICAgICAgICAgIG1h
eFBoYXNlRXJyb3IgPSBlcnJvcjsKKyAgICAgICAgICAgIG1heFBoYXNlRXJyb3JJbmRleCA9IGs7
CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAobWF4UGhhc2VFcnJvciA+IG1heEFsbG93ZWRQ
aGFzZUVycm9yKSB7CisgICAgICAgIHZhciBtZXNzYWdlID0gIlBoYXNlIGVycm9yIChyYWRpYW5z
KSAoIiArIG1heFBoYXNlRXJyb3I7CisgICAgICAgIG1lc3NhZ2UgKz0gIikgZXhjZWVkZWQgdGhy
ZXNob2xkIGF0ICIgKyBmcmVxdWVuY2llc1ttYXhQaGFzZUVycm9ySW5kZXhdOworICAgICAgICBt
ZXNzYWdlICs9ICIgSHouICBBY3R1YWw6ICIgKyBwaGFzZVJlc3BvbnNlW21heFBoYXNlRXJyb3JJ
bmRleF07CisgICAgICAgIG1lc3NhZ2UgKz0gIiBleHBlY3RlZDogIiArIGV4cGVjdGVkUGhhc2Vz
W21heFBoYXNlRXJyb3JJbmRleF07CisgICAgICAgIHRlc3RGYWlsZWQobWVzc2FnZSk7CisgICAg
ICAgIHN1Y2Nlc3MgPSBmYWxzZTsKKyAgICB9IGVsc2UgeworICAgICAgICB0ZXN0UGFzc2VkKCJQ
aGFzZSByZXNwb25zZSB3aXRoaW4gYWNjZXB0YWJsZSB0aHJlc2hvbGQuIik7CisgICAgfQorCisK
KyAgICByZXR1cm4gc3VjY2VzczsKK30KKworZnVuY3Rpb24gcnVuVGVzdCgpCit7CisgICAgaWYg
KHdpbmRvdy5sYXlvdXRUZXN0Q29udHJvbGxlcikgeworICAgICAgICBsYXlvdXRUZXN0Q29udHJv
bGxlci5kdW1wQXNUZXh0KCk7CisgICAgICAgIGxheW91dFRlc3RDb250cm9sbGVyLndhaXRVbnRp
bERvbmUoKTsKKyAgICB9CisKKyAgICB3aW5kb3cuanNUZXN0SXNBc3luYyA9IHRydWU7CisKKyAg
ICBjb250ZXh0ID0gbmV3IHdlYmtpdEF1ZGlvQ29udGV4dCgpOworICAgIAorICAgIGZpbHRlciA9
IGNvbnRleHQuY3JlYXRlQmlxdWFkRmlsdGVyKCk7CisKKyAgICAvLyBBcmJpdHJhcmlseSB0ZXN0
IGEgcGVha2luZyBmaWx0ZXIsIGJ1dCBhbnkga2luZCBvZiBmaWx0ZXIgY2FuIGJlIHRlc3RlZC4K
KyAgICBmaWx0ZXIudHlwZSA9IGZpbHRlci5QRUFLSU5HOworICAgIGZpbHRlci5mcmVxdWVuY3ku
dmFsdWUgPSBmaWx0ZXJDdXRvZmY7CisgICAgZmlsdGVyLlEudmFsdWUgPSBmaWx0ZXJROworICAg
IGZpbHRlci5nYWluLnZhbHVlID0gZmlsdGVyR2FpbjsKKworICAgIHZhciBmcmVxdWVuY2llcyA9
IGNyZWF0ZUZyZXF1ZW5jaWVzKG51bWJlck9mRnJlcXVlbmNpZXMsIGNvbnRleHQuc2FtcGxlUmF0
ZSk7CisgICAgbWFnUmVzcG9uc2UgPSBuZXcgRmxvYXQzMkFycmF5KG51bWJlck9mRnJlcXVlbmNp
ZXMpOworICAgIHBoYXNlUmVzcG9uc2UgPSBuZXcgRmxvYXQzMkFycmF5KG51bWJlck9mRnJlcXVl
bmNpZXMpOworCisgICAgZmlsdGVyLmdldEZyZXF1ZW5jeVJlc3BvbnNlKGZyZXF1ZW5jaWVzLCBt
YWdSZXNwb25zZSwgcGhhc2VSZXNwb25zZSk7CisgICAgdmFyIHN1Y2Nlc3MgPSBjb21wYXJlUmVz
cG9uc2VzKGZpbHRlciwgZnJlcXVlbmNpZXMsIG1hZ1Jlc3BvbnNlLCBwaGFzZVJlc3BvbnNlKTsK
KworICAgIGlmIChzdWNjZXNzKSB7CisgICAgICAgIHRlc3RQYXNzZWQoZmlsdGVyVHlwZU5hbWVb
ZmlsdGVyLnR5cGVdICsgIiBmcmVxdWVuY3kgcmVzcG9uc2Ugd2FzIGNvcnJlY3QuIik7CisgICAg
fSBlbHNlIHsKKyAgICAgICAgdGVzdEZhaWxlZChmaWx0ZXJUeXBlTmFtZVtmaWx0ZXIudHlwZV0g
KyAiIGZyZXF1ZW5jeSByZXNwb25zZSB3YXMgaW5jb3JyZWN0LiIpOworICAgIH0KKworICAgIGZp
bmlzaEpTVGVzdCgpOworfQorCitydW5UZXN0KCk7CitzdWNjZXNzZnVsbHlQYXJzZWQgPSB0cnVl
OworCis8L3NjcmlwdD4KKworPHNjcmlwdCBzcmM9Ii4uL2Zhc3QvanMvcmVzb3VyY2VzL2pzLXRl
c3QtcG9zdC5qcyI+PC9zY3JpcHQ+Cis8L2JvZHk+Cis8L2h0bWw+Cg==
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>129944</attachid>
            <date>2012-03-02 13:08:21 -0800</date>
            <delta_ts>2012-03-02 15:52:12 -0800</delta_ts>
            <desc>Patch</desc>
            <filename>bug-79503-20120302130820.patch</filename>
            <type>text/plain</type>
            <size>12082</size>
            <attacher name="Raymond Toy">rtoy</attacher>
            
              <data encoding="base64">U3VidmVyc2lvbiBSZXZpc2lvbjogMTA5NDY0CmRpZmYgLS1naXQgYS9MYXlvdXRUZXN0cy9DaGFu
Z2VMb2cgYi9MYXlvdXRUZXN0cy9DaGFuZ2VMb2cKaW5kZXggOWVjMDFhYTU5N2RlODNmMzc5OTEx
NDlhMzQ3OTk0ZjUzNDQ3MWIzYy4uZjBjN2NhZWJlNDUwOTI2NzliYjU3MWVhZjI3ZmZkYzQzOWJh
Mzc5YSAxMDA2NDQKLS0tIGEvTGF5b3V0VGVzdHMvQ2hhbmdlTG9nCisrKyBiL0xheW91dFRlc3Rz
L0NoYW5nZUxvZwpAQCAtMSwzICsxLDE1IEBACisyMDEyLTAyLTI0ICBSYXltb25kIFRveSAgPHJ0
b3lAZ29vZ2xlLmNvbT4KKworICAgICAgICBCaXF1YWQgZ2V0RnJlcXVlbmN5UmVzcG9uc2UgbmVl
ZHMgYSBsYXlvdXQgdGVzdC4KKyAgICAgICAgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19i
dWcuY2dpP2lkPTc5NTAzCisKKyAgICAgICAgQWRkIHNpbXBsZSB0ZXN0IGZvciBnZXRGcmVxdWVu
Y3lSZXNwb25zZS4KKyAgICAgICAgCisgICAgICAgIFJldmlld2VkIGJ5IE5PQk9EWSAoT09QUyEp
LgorCisgICAgICAgICogd2ViYXVkaW8vYmlxdWFkLWdldEZyZXF1ZW5jeVJlc3BvbnNlLWV4cGVj
dGVkLnR4dDogQWRkZWQuCisgICAgICAgICogd2ViYXVkaW8vYmlxdWFkLWdldEZyZXF1ZW5jeVJl
c3BvbnNlLmh0bWw6IEFkZGVkLgorCiAyMDEyLTAzLTAxICBBZGFtIEtsZWluICA8YWRhbWtAY2hy
b21pdW0ub3JnPgogCiAgICAgICAgIFVucmV2aWV3ZWQgZ2FyZGVuaW5nLiBNYXJrIHR3byBtZWRp
YSB0ZXN0cyBhcyBmbGFreS4KZGlmZiAtLWdpdCBhL0xheW91dFRlc3RzL3dlYmF1ZGlvL2JpcXVh
ZC1nZXRGcmVxdWVuY3lSZXNwb25zZS1leHBlY3RlZC50eHQgYi9MYXlvdXRUZXN0cy93ZWJhdWRp
by9iaXF1YWQtZ2V0RnJlcXVlbmN5UmVzcG9uc2UtZXhwZWN0ZWQudHh0Cm5ldyBmaWxlIG1vZGUg
MTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAuLjkz
MDExODIzOTBlZTUyNjg1NDE1NWNlOTQ2MmFmNzllNTkxZTU5NGIKLS0tIC9kZXYvbnVsbAorKysg
Yi9MYXlvdXRUZXN0cy93ZWJhdWRpby9iaXF1YWQtZ2V0RnJlcXVlbmN5UmVzcG9uc2UtZXhwZWN0
ZWQudHh0CkBAIC0wLDAgKzEsMTEgQEAKK1Rlc3QgQmlxdWFkIGdldEZyZXF1ZW5jeVJlc3BvbnNl
KCkgZnVuY3Rpb25hbGl0eS4KKworT24gc3VjY2VzcywgeW91IHdpbGwgc2VlIGEgc2VyaWVzIG9m
ICJQQVNTIiBtZXNzYWdlcywgZm9sbG93ZWQgYnkgIlRFU1QgQ09NUExFVEUiLgorCitQQVNTIE1h
Z25pdHVkZSByZXNwb25zZSB3aXRoaW4gYWNjZXB0YWJsZSB0aHJlc2hvbGQuCitQQVNTIFBoYXNl
IHJlc3BvbnNlIHdpdGhpbiBhY2NlcHRhYmxlIHRocmVzaG9sZC4KK1BBU1MgUGVha2luZyBmaWx0
ZXIgZnJlcXVlbmN5IHJlc3BvbnNlIHdhcyBjb3JyZWN0LgorUEFTUyBzdWNjZXNzZnVsbHlQYXJz
ZWQgaXMgdHJ1ZQorCitURVNUIENPTVBMRVRFCisKZGlmZiAtLWdpdCBhL0xheW91dFRlc3RzL3dl
YmF1ZGlvL2JpcXVhZC1nZXRGcmVxdWVuY3lSZXNwb25zZS5odG1sIGIvTGF5b3V0VGVzdHMvd2Vi
YXVkaW8vYmlxdWFkLWdldEZyZXF1ZW5jeVJlc3BvbnNlLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2
NDQKaW5kZXggMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMC4uNzdkZDQw
NTRkMjg3YzE0ODUyMjk3NGMxMDg1ZjMxZWE4Yzc3ZDIyMgotLS0gL2Rldi9udWxsCisrKyBiL0xh
eW91dFRlc3RzL3dlYmF1ZGlvL2JpcXVhZC1nZXRGcmVxdWVuY3lSZXNwb25zZS5odG1sCkBAIC0w
LDAgKzEsMzE0IEBACis8IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4w
MSBUcmFuc2l0aW9uYWwvL0VOIj4KKzxodG1sPgorPGhlYWQ+Cis8c2NyaXB0IHNyYz0icmVzb3Vy
Y2VzL2F1ZGlvLXRlc3RpbmcuanMiPjwvc2NyaXB0PgorPHNjcmlwdCBzcmM9InJlc291cmNlcy9i
aXF1YWQtdGVzdGluZy5qcyI+PC9zY3JpcHQ+Cis8c2NyaXB0IHNyYz0iLi4vZmFzdC9qcy9yZXNv
dXJjZXMvanMtdGVzdC1wcmUuanMiPjwvc2NyaXB0PgorPC9oZWFkPgorCis8Ym9keT4KKzxkaXYg
aWQ9ImRlc2NyaXB0aW9uIj48L2Rpdj4KKzxkaXYgaWQ9ImNvbnNvbGUiPjwvZGl2PgorCis8c2Ny
aXB0PgorZGVzY3JpcHRpb24oIlRlc3QgQmlxdWFkIGdldEZyZXF1ZW5jeVJlc3BvbnNlKCkgZnVu
Y3Rpb25hbGl0eS4iKTsKKworLy8gVGVzdCB0aGUgZnJlcXVlbmN5IHJlc3BvbnNlIG9mIGEgYmlx
dWFkIGZpbHRlci4gIFdlIGNvbXB1dGUgdGhlIGZyZXF1ZW5jeSByZXNwb25zZSBmb3IgYSBzaW1w
bGUKKy8vIHBlYWtpbmcgYmlxdWFkIGZpbHRlciBhbmQgY29tcGFyZSBpdCB3aXRoIHRoZSBleHBl
Y3RlZCBmcmVxdWVuY3kgcmVzcG9uc2UuICBUaGUgYWN0dWFsIGZpbHRlcgorLy8gdXNlZCBkb2Vz
bid0IG1hdHRlciBzaW5jZSB3ZSdyZSB0ZXN0aW5nIGdldEZyZXF1ZW5jeVJlc3BvbnNlIGFuZCBu
b3QgdGhlIGFjdHVhbCBmaWx0ZXIgb3V0cHV0LgorLy8gVGhlIGZpbHRlcnMgYXJlIGV4dGVuc2l2
ZWx5IHRlc3RlZCBpbiBvdGhlciBiaXF1YWQgdGVzdHMuCisKK3ZhciBjb250ZXh0OworCisvLyBU
aGUgYmlxdWFkIGZpbHRlciBub2RlLgordmFyIGZpbHRlcjsKKworLy8gVGhlIG1hZ25pdHVkZSBy
ZXNwb25zZSBvZiB0aGUgYmlxdWFkIGZpbHRlci4KK3ZhciBtYWdSZXNwb25zZTsKKworLy8gVGhl
IHBoYXNlIHJlc3BvbnNlIG9mIHRoZSBiaXF1YWQgZmlsdGVyLgordmFyIHBoYXNlUmVzcG9uc2U7
CisKKy8vIE51bWJlciBvZiBmcmVxdWVuY3kgc2FtcGxlcyB0byB0YWtlLgordmFyIG51bWJlck9m
RnJlcXVlbmNpZXMgPSAxMDAwOworCisvLyBUaGUgZmlsdGVyIHBhcmFtZXRlcnMuCit2YXIgZmls
dGVyQ3V0b2ZmID0gMTAwMDsgLy8gSHouCit2YXIgZmlsdGVyUSA9IDE7Cit2YXIgZmlsdGVyR2Fp
biA9IDU7IC8vIERlY2liZWxzLgorCisvLyBUaGUgbWF4aW11bSBhbGxvd2VkIGVycm9yIGluIHRo
ZSBtYWduaXR1ZGUgcmVzcG9uc2UuCit2YXIgbWF4QWxsb3dlZE1hZ0Vycm9yID0gNS43ZS03Owor
CisvLyBUaGUgbWF4aW11bSBhbGxvd2VkIGVycm9yIGluIHRoZSBwaGFzZSByZXNwb25zZS4KK3Zh
ciBtYXhBbGxvd2VkUGhhc2VFcnJvciA9IDQuN2UtODsKKworLy8gVGhlIG1hZ25pdHVkZXMgYW5k
IHBoYXNlcyBvZiB0aGUgcmVmZXJlbmNlIGZyZXF1ZW5jeSByZXNwb25zZS4KK3ZhciBtYWdSZXNw
b25zZTsKK3ZhciBwaGFzZVJlc3BvbnNlOworICAgICAgCisvLyBUaGUgbWFnbml0dWRlcyBhbmQg
cGhhc2VzIG9mIHRoZSByZWZlcmVuY2UgZnJlcXVlbmN5IHJlc3BvbnNlLgordmFyIGV4cGVjdGVk
TWFnbml0dWRlczsKK3ZhciBleHBlY3RlZFBoYXNlczsKKworLy8gQ29udmVydCBmcmVxdWVuY3kg
aW4gSHogdG8gYSBub3JtYWxpemVkIGZyZXF1ZW5jeSBiZXR3ZWVuIDAgdG8gMSB3aXRoIDEgY29y
cmVzcG9uZGluZyB0byB0aGUKKy8vIE55cXVpc3QgZnJlcXVlbmN5LgorZnVuY3Rpb24gbm9ybWFs
aXplZEZyZXF1ZW5jeShmcmVxSHosIHNhbXBsZVJhdGUpCit7CisgICAgdmFyIG55cXVpc3QgPSBz
YW1wbGVSYXRlIC8gMjsKKyAgICByZXR1cm4gZnJlcUh6IC8gbnlxdWlzdDsKK30KKworLy8gR2V0
IHRoZSBmaWx0ZXIgcmVzcG9uc2UgYXQgYSAobm9ybWFsaXplZCkgZnJlcXVlbmN5IHxmfCBmb3Ig
dGhlIGZpbHRlciB3aXRoIGNvZWZmaWNpZW50cyB8Y29lZnwuCitmdW5jdGlvbiBnZXRSZXNwb25z
ZUF0KGNvZWYsIGYpCit7CisgICAgdmFyIGIwID0gY29lZi5iMDsKKyAgICB2YXIgYjEgPSBjb2Vm
LmIxOworICAgIHZhciBiMiA9IGNvZWYuYjI7CisgICAgdmFyIGExID0gY29lZi5hMTsKKyAgICB2
YXIgYTIgPSBjb2VmLmEyOworCisgICAgLy8gSCh6KSA9IChiMCArIGIxIC8geiArIGIyIC8gel4y
KSAvICgxICsgYTEgLyB6ICsgYTIgLyB6XjIpCisgICAgLy8KKyAgICAvLyBDb21wdXRlIEgoZXhw
KGkgKiBwaSAqIGYpKS4gIE5vIG5hdGl2ZSBjb21wbGV4IG51bWJlcnMgaW4gamF2YXNjcmlwdCwg
c28gYnJlYWsgSChleHAoaSAqIHBpICogLy8gZikpCisgICAgLy8gaW4gdG8gdGhlIHJlYWwgYW5k
IGltYWdpbmFyeSBwYXJ0cyBvZiB0aGUgbnVtZXJhdG9yIGFuZCBkZW5vbWluYXRvci4gIExldCBv
bWVnYSA9IHBpICogZi4KKyAgICAvLyBUaGVuIHRoZSBudW1lcmF0b3IgaXMKKyAgICAvLworICAg
IC8vIGIwICsgYjEgKiBjb3Mob21lZ2EpICsgYjIgKiBjb3MoMiAqIG9tZWdhKSAtIGkgKiAoYjEg
KiBzaW4ob21lZ2EpICsgYjIgKiBzaW4oMiAqIG9tZWdhKSkKKyAgICAvLworICAgIC8vIGFuZCB0
aGUgZGVub21pbmF0b3IgaXMKKyAgICAvLworICAgIC8vIDEgKyBhMSAqIGNvcyhvbWVnYSkgKyBh
MiAqIGNvcygyICogb21lZ2EpIC0gaSAqIChhMSAqIHNpbihvbWVnYSkgKyBhMiAqIHNpbigyICog
b21lZ2EpKQorICAgIC8vCisgICAgLy8gQ29tcHV0ZSB0aGUgbWFnbml0dWRlIGFuZCBwaGFzZSBm
cm9tIHRoZSByZWFsIGFuZCBpbWFnaW5hcnkgcGFydHMuCisKKyAgICB2YXIgb21lZ2EgPSBNYXRo
LlBJICogZjsKKyAgICB2YXIgbnVtZXJhdG9yUmVhbCA9IGIwICsgYjEgKiBNYXRoLmNvcyhvbWVn
YSkgKyBiMiAqIE1hdGguY29zKDIgKiBvbWVnYSk7CisgICAgdmFyIG51bWVyYXRvckltYWcgPSAt
KGIxICogTWF0aC5zaW4ob21lZ2EpICsgYjIgKiBNYXRoLnNpbigyICogb21lZ2EpKTsKKyAgICB2
YXIgZGVub21pbmF0b3JSZWFsID0gMSArIGExICogTWF0aC5jb3Mob21lZ2EpICsgYTIgKiBNYXRo
LmNvcygyICogb21lZ2EpOworICAgIHZhciBkZW5vbWluYXRvckltYWcgPSAtKGExICogTWF0aC5z
aW4ob21lZ2EpICsgYTIgKiBNYXRoLnNpbigyICogb21lZ2EpKTsKKworICAgIHZhciBtYWduaXR1
ZGUgPSBNYXRoLnNxcnQoKG51bWVyYXRvclJlYWwgKiBudW1lcmF0b3JSZWFsICsgbnVtZXJhdG9y
SW1hZyAqIG51bWVyYXRvckltYWcpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvIChk
ZW5vbWluYXRvclJlYWwgKiBkZW5vbWluYXRvclJlYWwgKyBkZW5vbWluYXRvckltYWcgKiBkZW5v
bWluYXRvckltYWcpKTsKKyAgICB2YXIgcGhhc2UgPSBNYXRoLmF0YW4yKG51bWVyYXRvckltYWcs
IG51bWVyYXRvclJlYWwpIC0gTWF0aC5hdGFuMihkZW5vbWluYXRvckltYWcsIGRlbm9taW5hdG9y
UmVhbCk7CisgICAgCisgICAgaWYgKHBoYXNlID49IE1hdGguUEkpIHsKKyAgICAgICAgcGhhc2Ug
LT0gMiAqIE1hdGguUEk7CisgICAgfSBlbHNlIGlmIChwaGFzZSA8PSAtTWF0aC5QSSkgeworICAg
ICAgICBwaGFzZSArPSAyICogTWF0aC5QSTsKKyAgICB9CisgICAKKyAgICByZXR1cm4ge21hZ25p
dHVkZSA6IG1hZ25pdHVkZSwgcGhhc2UgOiBwaGFzZX07IAorfQorCisvLyBDb21wdXRlIHRoZSBy
ZWZlcmVuY2UgZnJlcXVlbmN5IHJlc3BvbnNlIGZvciB0aGUgYmlxdWFkIGZpbHRlciB8ZmlsdGVy
fCBhdCB0aGUgZnJlcXVlbmN5IHNhbXBsZXMKKy8vIGdpdmVuIGJ5IHxmcmVxdWVuY2llc3wuCitm
dW5jdGlvbiBmcmVxdWVuY3lSZXNwb25zZVJlZmVyZW5jZShmaWx0ZXIsIGZyZXF1ZW5jaWVzKQor
eworICAgIHZhciBzYW1wbGVSYXRlID0gZmlsdGVyLmNvbnRleHQuc2FtcGxlUmF0ZTsKKyAgICB2
YXIgbm9ybWFsaXplZEZyZXEgPSBub3JtYWxpemVkRnJlcXVlbmN5KGZpbHRlci5mcmVxdWVuY3ku
dmFsdWUsIHNhbXBsZVJhdGUpOworICAgIHZhciBmaWx0ZXJDb2VmZmljaWVudHMgPSBjcmVhdGVG
aWx0ZXIoZmlsdGVyLnR5cGUsIG5vcm1hbGl6ZWRGcmVxLCBmaWx0ZXIuUS52YWx1ZSwgZmlsdGVy
LmdhaW4udmFsdWUpOworCisgICAgdmFyIG1hZ25pdHVkZXMgPSBbXTsKKyAgICB2YXIgcGhhc2Vz
ID0gW107CisKKyAgICBmb3IgKHZhciBrID0gMDsgayA8IGZyZXF1ZW5jaWVzLmxlbmd0aDsgKytr
KSB7CisgICAgICAgIHZhciByZXNwb25zZSA9IGdldFJlc3BvbnNlQXQoZmlsdGVyQ29lZmZpY2ll
bnRzLCBub3JtYWxpemVkRnJlcXVlbmN5KGZyZXF1ZW5jaWVzW2tdLCBzYW1wbGVSYXRlKSk7Cisg
ICAgICAgIG1hZ25pdHVkZXMucHVzaChyZXNwb25zZS5tYWduaXR1ZGUpOworICAgICAgICBwaGFz
ZXMucHVzaChyZXNwb25zZS5waGFzZSk7CisgICAgfQorCisgICAgcmV0dXJuIHttYWduaXR1ZGVz
IDogbWFnbml0dWRlcywgcGhhc2VzIDogcGhhc2VzfTsKK30KKworLy8gQ29tcHV0ZSBhIHNldCBv
ZiBsaW5lYXJseSBzcGFjZWQgZnJlcXVlbmNpZXMuCitmdW5jdGlvbiBjcmVhdGVGcmVxdWVuY2ll
cyhuRnJlcXVlbmNpZXMsIHNhbXBsZVJhdGUpCit7CisgICAgdmFyIGZyZXF1ZW5jaWVzID0gbmV3
IEZsb2F0MzJBcnJheShuRnJlcXVlbmNpZXMpOworICAgIHZhciBueXF1aXN0ID0gc2FtcGxlUmF0
ZSAvIDI7CisgICAgdmFyIGZyZXFEZWx0YSA9IG55cXVpc3QgLyBuRnJlcXVlbmNpZXM7CisKKyAg
ICBmb3IgKHZhciBrID0gMDsgayA8IG5GcmVxdWVuY2llczsgKytrKSB7CisgICAgICAgIGZyZXF1
ZW5jaWVzW2tdID0gayAqIGZyZXFEZWx0YTsKKyAgICB9CisKKyAgICByZXR1cm4gZnJlcXVlbmNp
ZXM7Cit9CisKK2Z1bmN0aW9uIGxpbmVhclRvRGVjaWJlbHMoeCkKK3sKKyAgICBpZiAoeCkgewor
ICAgICAgICByZXR1cm4gMjAgKiBNYXRoLmxvZyh4KSAvIE1hdGguTE4xMDsKKyAgICB9IGVsc2Ug
eworICAgICAgICByZXR1cm4gLTEwMDA7CisgICAgfQorfQorCisvLyBMb29rIHRocm91Z2ggdGhl
IGFycmF5IGFuZCBmaW5kIGFueSBOYU4gb3IgaW5maW5pdHkuIFJldHVybnMgdGhlIGluZGV4IG9m
IHRoZSBmaXJzdCBvY2N1cmVuY2Ugb3IKKy8vIC0xIGlmIG5vbmUuCitmdW5jdGlvbiBmaW5kQmFk
TnVtYmVyKHNpZ25hbCkKK3sKKyAgICBmb3IgKHZhciBrID0gMDsgayA8IHNpZ25hbC5sZW5ndGg7
ICsraykgeworICAgICAgICBpZiAoIWlzVmFsaWROdW1iZXIoc2lnbmFsW2tdKSkgeworICAgICAg
ICAgICByZXR1cm4gazsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gLTE7Cit9CisKKy8v
IENvbXB1dGUgYWJzb2x1dGUgdmFsdWUgb2YgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiBwaGFzZSBh
bmdsZXMsIHRha2luZyBpbnRvIGFjY291bnQgdGhlIHdyYXBwaW5nCisvLyBvZiBwaGFzZXMuCitm
dW5jdGlvbiBhYnNvbHV0ZVBoYXNlRGlmZmVyZW5jZSh4LCB5KQoreworICAgIHZhciBkaWZmID0g
TWF0aC5hYnMoeCAtIHkpOworICAgIAorICAgIGlmIChkaWZmID4gTWF0aC5QSSkgeworICAgICAg
ICBkaWZmID0gMiAqIE1hdGguUEkgLSBkaWZmOworICAgIH0KKyAgICByZXR1cm4gZGlmZjsKK30K
KworLy8gQ29tcGFyZSB0aGUgZnJlcXVlbmN5IHJlc3BvbnNlIHdpdGggb3VyIGV4cGVjdGVkIHJl
c3BvbnNlLgorZnVuY3Rpb24gY29tcGFyZVJlc3BvbnNlcyhmaWx0ZXIsIGZyZXF1ZW5jaWVzLCBt
YWdSZXNwb25zZSwgcGhhc2VSZXNwb25zZSkKK3sKKyAgICB2YXIgZXhwZWN0ZWRSZXNwb25zZSA9
IGZyZXF1ZW5jeVJlc3BvbnNlUmVmZXJlbmNlKGZpbHRlciwgZnJlcXVlbmNpZXMpOworCisgICAg
ZXhwZWN0ZWRNYWduaXR1ZGVzID0gZXhwZWN0ZWRSZXNwb25zZS5tYWduaXR1ZGVzOworICAgIGV4
cGVjdGVkUGhhc2VzID0gZXhwZWN0ZWRSZXNwb25zZS5waGFzZXM7CisKKyAgICB2YXIgbiA9IG1h
Z1Jlc3BvbnNlLmxlbmd0aDsKKyAgICB2YXIgc3VjY2VzcyA9IHRydWU7CisgICAgdmFyIGJhZFJl
c3BvbnNlID0gZmFsc2U7CisKKyAgICB2YXIgbWF4TWFnRXJyb3IgPSAtMTsKKyAgICB2YXIgbWF4
TWFnRXJyb3JJbmRleCA9IC0xOworCisgICAgdmFyIGs7CisgICAgdmFyIGhhc0JhZE51bWJlcjsK
KworICAgIGhhc0JhZE51bWJlciA9IGZpbmRCYWROdW1iZXIobWFnUmVzcG9uc2UpOworICAgIGlm
IChoYXNCYWROdW1iZXIgPj0gMCkgeworICAgICAgICB0ZXN0RmFpbGVkKCJNYWduaXR1ZGUgcmVz
cG9uc2UgaGFzIE5hTiBvciBpbmZpbml0eSBhdCAiICsgaGFzQmFkTnVtYmVyKTsKKyAgICAgICAg
c3VjY2VzcyA9IGZhbHNlOworICAgICAgICBiYWRSZXNwb25zZSA9IHRydWU7CisgICAgfQorCisg
ICAgaGFzQmFkTnVtYmVyID0gZmluZEJhZE51bWJlcihwaGFzZVJlc3BvbnNlKTsKKyAgICBpZiAo
aGFzQmFkTnVtYmVyID49IDApIHsKKyAgICAgICAgdGVzdEZhaWxlZCgiUGhhc2UgcmVzcG9uc2Ug
aGFzIE5hTiBvciBpbmZpbml0eSBhdCAiICsgaGFzQmFkTnVtYmVyKTsKKyAgICAgICAgc3VjY2Vz
cyA9IGZhbHNlOworICAgICAgICBiYWRSZXNwb25zZSA9IHRydWU7CisgICAgfQorCisgICAgLy8g
VGhlc2UgYXJlbid0IHRlc3RpbmcgdGhlIGltcGxlbWVudGF0aW9uIGl0c2VsZi4gIEluc3RlYWQs
IHRoZXNlIGFyZSBzYW5pdHkgY2hlY2tzIG9uIHRoZQorICAgIC8vIHJlZmVyZW5jZS4gIEZhaWx1
cmUgaGVyZSBkb2VzIG5vdCBpbXBseSBhbiBlcnJvciBpbiB0aGUgaW1wbGVtZW50YXRpb24uCisg
ICAgaGFzQmFkTnVtYmVyID0gZmluZEJhZE51bWJlcihleHBlY3RlZE1hZ25pdHVkZXMpOworICAg
IGlmIChoYXNCYWROdW1iZXIgPj0gMCkgeworICAgICAgICB0ZXN0RmFpbGVkKCJFeHBlY3RlZCBt
YWduaXR1ZGUgcmVzcG9uc2UgaGFzIE5hTiBvciBpbmZpbml0eSBhdCAiICsgaGFzQmFkTnVtYmVy
KTsKKyAgICAgICAgc3VjY2VzcyA9IGZhbHNlOworICAgICAgICBiYWRSZXNwb25zZSA9IHRydWU7
CisgICAgfQorCisgICAgaGFzQmFkTnVtYmVyID0gZmluZEJhZE51bWJlcihleHBlY3RlZFBoYXNl
cyk7CisgICAgaWYgKGhhc0JhZE51bWJlciA+PSAwKSB7CisgICAgICAgIHRlc3RGYWlsZWQoIkV4
cGVjdGVkIHBoYXNlIHJlc3BvbnNlIGhhcyBOYU4gb3IgaW5maW5pdHkgYXQgIiArIGhhc0JhZE51
bWJlcik7CisgICAgICAgIHN1Y2Nlc3MgPSBmYWxzZTsKKyAgICAgICAgYmFkUmVzcG9uc2UgPSB0
cnVlOworICAgIH0KKworICAgIC8vIElmIHdlIGZvdW5kIGEgTmFOIG9yIGluZmluaXR5LCB0aGUg
Zm9sbG93aW5nIHRlc3RzIGFyZW4ndCB2ZXJ5IGhlbHBmdWwsIGVzcGVjaWFsbHkgZm9yIE5hTi4K
KyAgICAvLyBXZSBydW4gdGhlbSBhbnl3YXksIGFmdGVyIHByaW50aW5nIGEgd2FybmluZyBtZXNz
YWdlLgorCisgICAgaWYgKGJhZFJlc3BvbnNlKSB7CisgICAgICAgIHRlc3RGYWlsZWQoIk5hTiBv
ciBpbmZpbml0eSBpbiB0aGUgYWN0dWFsIG9yIGV4cGVjdGVkIHJlc3VsdHMgbWFrZXMgdGhlIGZv
bGxvd2luZyB0ZXN0IHJlc3VsdHMgc3VzcGVjdC4iKTsKKyAgICAgICAgc3VjY2VzcyA9IGZhbHNl
OworICAgIH0KKworICAgIGZvciAoayA9IDA7IGsgPCBuOyArK2spIHsKKyAgICAgICAgdmFyIGVy
cm9yID0gTWF0aC5hYnMobGluZWFyVG9EZWNpYmVscyhtYWdSZXNwb25zZVtrXSkgLSBsaW5lYXJU
b0RlY2liZWxzKGV4cGVjdGVkTWFnbml0dWRlc1trXSkpOworICAgICAgICBpZiAoZXJyb3IgPiBt
YXhNYWdFcnJvcikgeworICAgICAgICAgICAgbWF4TWFnRXJyb3IgPSBlcnJvcjsKKyAgICAgICAg
ICAgIG1heE1hZ0Vycm9ySW5kZXggPSBrOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKG1h
eE1hZ0Vycm9yID4gbWF4QWxsb3dlZE1hZ0Vycm9yKSB7CisgICAgICAgIHZhciBtZXNzYWdlID0g
Ik1hZ25pdHVkZSBlcnJvciAoIiArIG1heE1hZ0Vycm9yICsgIiBkQikiOworICAgICAgICBtZXNz
YWdlICs9ICIgZXhjZWVkZWQgdGhyZXNob2xkIGF0ICIgKyBmcmVxdWVuY2llc1ttYXhNYWdFcnJv
ckluZGV4XTsKKyAgICAgICAgbWVzc2FnZSArPSAiIEh6LiAgQWN0dWFsOiAiICsgbGluZWFyVG9E
ZWNpYmVscyhtYWdSZXNwb25zZVttYXhNYWdFcnJvckluZGV4XSk7CisgICAgICAgIG1lc3NhZ2Ug
Kz0gIiBkQiwgZXhwZWN0ZWQ6ICIgKyBsaW5lYXJUb0RlY2liZWxzKGV4cGVjdGVkTWFnbml0dWRl
c1ttYXhNYWdFcnJvckluZGV4XSkgKyAiIGRCLiI7CisgICAgICAgIHRlc3RGYWlsZWQobWVzc2Fn
ZSk7CisgICAgICAgIHN1Y2Nlc3MgPSBmYWxzZTsKKyAgICB9IGVsc2UgeworICAgICAgICB0ZXN0
UGFzc2VkKCJNYWduaXR1ZGUgcmVzcG9uc2Ugd2l0aGluIGFjY2VwdGFibGUgdGhyZXNob2xkLiIp
OworICAgIH0KKworICAgIHZhciBtYXhQaGFzZUVycm9yID0gLTE7CisgICAgdmFyIG1heFBoYXNl
RXJyb3JJbmRleCA9IC0xOworCisgICAgZm9yIChrID0gMDsgayA8IG47ICsraykgeworICAgICAg
ICB2YXIgZXJyb3IgPSBhYnNvbHV0ZVBoYXNlRGlmZmVyZW5jZShwaGFzZVJlc3BvbnNlW2tdLCBl
eHBlY3RlZFBoYXNlc1trXSk7CisgICAgICAgIGlmIChlcnJvciA+IG1heFBoYXNlRXJyb3IpIHsK
KyAgICAgICAgICAgIG1heFBoYXNlRXJyb3IgPSBlcnJvcjsKKyAgICAgICAgICAgIG1heFBoYXNl
RXJyb3JJbmRleCA9IGs7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAobWF4UGhhc2VFcnJv
ciA+IG1heEFsbG93ZWRQaGFzZUVycm9yKSB7CisgICAgICAgIHZhciBtZXNzYWdlID0gIlBoYXNl
IGVycm9yIChyYWRpYW5zKSAoIiArIG1heFBoYXNlRXJyb3I7CisgICAgICAgIG1lc3NhZ2UgKz0g
IikgZXhjZWVkZWQgdGhyZXNob2xkIGF0ICIgKyBmcmVxdWVuY2llc1ttYXhQaGFzZUVycm9ySW5k
ZXhdOworICAgICAgICBtZXNzYWdlICs9ICIgSHouICBBY3R1YWw6ICIgKyBwaGFzZVJlc3BvbnNl
W21heFBoYXNlRXJyb3JJbmRleF07CisgICAgICAgIG1lc3NhZ2UgKz0gIiBleHBlY3RlZDogIiAr
IGV4cGVjdGVkUGhhc2VzW21heFBoYXNlRXJyb3JJbmRleF07CisgICAgICAgIHRlc3RGYWlsZWQo
bWVzc2FnZSk7CisgICAgICAgIHN1Y2Nlc3MgPSBmYWxzZTsKKyAgICB9IGVsc2UgeworICAgICAg
ICB0ZXN0UGFzc2VkKCJQaGFzZSByZXNwb25zZSB3aXRoaW4gYWNjZXB0YWJsZSB0aHJlc2hvbGQu
Iik7CisgICAgfQorCisKKyAgICByZXR1cm4gc3VjY2VzczsKK30KKworZnVuY3Rpb24gcnVuVGVz
dCgpCit7CisgICAgaWYgKHdpbmRvdy5sYXlvdXRUZXN0Q29udHJvbGxlcikgeworICAgICAgICBs
YXlvdXRUZXN0Q29udHJvbGxlci5kdW1wQXNUZXh0KCk7CisgICAgICAgIGxheW91dFRlc3RDb250
cm9sbGVyLndhaXRVbnRpbERvbmUoKTsKKyAgICB9CisKKyAgICB3aW5kb3cuanNUZXN0SXNBc3lu
YyA9IHRydWU7CisKKyAgICBjb250ZXh0ID0gbmV3IHdlYmtpdEF1ZGlvQ29udGV4dCgpOworICAg
IAorICAgIGZpbHRlciA9IGNvbnRleHQuY3JlYXRlQmlxdWFkRmlsdGVyKCk7CisKKyAgICAvLyBB
cmJpdHJhcmlseSB0ZXN0IGEgcGVha2luZyBmaWx0ZXIsIGJ1dCBhbnkga2luZCBvZiBmaWx0ZXIg
Y2FuIGJlIHRlc3RlZC4KKyAgICBmaWx0ZXIudHlwZSA9IGZpbHRlci5QRUFLSU5HOworICAgIGZp
bHRlci5mcmVxdWVuY3kudmFsdWUgPSBmaWx0ZXJDdXRvZmY7CisgICAgZmlsdGVyLlEudmFsdWUg
PSBmaWx0ZXJROworICAgIGZpbHRlci5nYWluLnZhbHVlID0gZmlsdGVyR2FpbjsKKworICAgIHZh
ciBmcmVxdWVuY2llcyA9IGNyZWF0ZUZyZXF1ZW5jaWVzKG51bWJlck9mRnJlcXVlbmNpZXMsIGNv
bnRleHQuc2FtcGxlUmF0ZSk7CisgICAgbWFnUmVzcG9uc2UgPSBuZXcgRmxvYXQzMkFycmF5KG51
bWJlck9mRnJlcXVlbmNpZXMpOworICAgIHBoYXNlUmVzcG9uc2UgPSBuZXcgRmxvYXQzMkFycmF5
KG51bWJlck9mRnJlcXVlbmNpZXMpOworCisgICAgZmlsdGVyLmdldEZyZXF1ZW5jeVJlc3BvbnNl
KGZyZXF1ZW5jaWVzLCBtYWdSZXNwb25zZSwgcGhhc2VSZXNwb25zZSk7CisgICAgdmFyIHN1Y2Nl
c3MgPSBjb21wYXJlUmVzcG9uc2VzKGZpbHRlciwgZnJlcXVlbmNpZXMsIG1hZ1Jlc3BvbnNlLCBw
aGFzZVJlc3BvbnNlKTsKKworICAgIGlmIChzdWNjZXNzKSB7CisgICAgICAgIHRlc3RQYXNzZWQo
ZmlsdGVyVHlwZU5hbWVbZmlsdGVyLnR5cGVdICsgIiBmcmVxdWVuY3kgcmVzcG9uc2Ugd2FzIGNv
cnJlY3QuIik7CisgICAgfSBlbHNlIHsKKyAgICAgICAgdGVzdEZhaWxlZChmaWx0ZXJUeXBlTmFt
ZVtmaWx0ZXIudHlwZV0gKyAiIGZyZXF1ZW5jeSByZXNwb25zZSB3YXMgaW5jb3JyZWN0LiIpOwor
ICAgIH0KKworICAgIGZpbmlzaEpTVGVzdCgpOworfQorCitydW5UZXN0KCk7CitzdWNjZXNzZnVs
bHlQYXJzZWQgPSB0cnVlOworCis8L3NjcmlwdD4KKworPHNjcmlwdCBzcmM9Ii4uL2Zhc3QvanMv
cmVzb3VyY2VzL2pzLXRlc3QtcG9zdC5qcyI+PC9zY3JpcHQ+Cis8L2JvZHk+Cis8L2h0bWw+Cg==
</data>

          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>129972</attachid>
            <date>2012-03-02 15:52:16 -0800</date>
            <delta_ts>2012-03-03 10:56:05 -0800</delta_ts>
            <desc>Patch</desc>
            <filename>bug-79503-20120302155215.patch</filename>
            <type>text/plain</type>
            <size>12081</size>
            <attacher name="Raymond Toy">rtoy</attacher>
            
              <data encoding="base64">U3VidmVyc2lvbiBSZXZpc2lvbjogMTA5NjAxCmRpZmYgLS1naXQgYS9MYXlvdXRUZXN0cy9DaGFu
Z2VMb2cgYi9MYXlvdXRUZXN0cy9DaGFuZ2VMb2cKaW5kZXggMzA1YzlhZGNiZWQ0ZjRiNGMyZDkx
ODkyZTg0NWE4MDUzYTJkMmVmMy4uNzM3YmUwYTIyOWRiZDUyZGU2ZjkyNGM4ZDQ2ZmM5NjIyZDQ4
NWI3YiAxMDA2NDQKLS0tIGEvTGF5b3V0VGVzdHMvQ2hhbmdlTG9nCisrKyBiL0xheW91dFRlc3Rz
L0NoYW5nZUxvZwpAQCAtMSwzICsxLDE1IEBACisyMDEyLTAyLTI0ICBSYXltb25kIFRveSAgPHJ0
b3lAZ29vZ2xlLmNvbT4KKworICAgICAgICBCaXF1YWQgZ2V0RnJlcXVlbmN5UmVzcG9uc2UgbmVl
ZHMgYSBsYXlvdXQgdGVzdC4KKyAgICAgICAgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19i
dWcuY2dpP2lkPTc5NTAzCisKKyAgICAgICAgQWRkIHNpbXBsZSB0ZXN0IGZvciBnZXRGcmVxdWVu
Y3lSZXNwb25zZS4KKyAgICAgICAgCisgICAgICAgIFJldmlld2VkIGJ5IE5PQk9EWSAoT09QUyEp
LgorCisgICAgICAgICogd2ViYXVkaW8vYmlxdWFkLWdldEZyZXF1ZW5jeVJlc3BvbnNlLWV4cGVj
dGVkLnR4dDogQWRkZWQuCisgICAgICAgICogd2ViYXVkaW8vYmlxdWFkLWdldEZyZXF1ZW5jeVJl
c3BvbnNlLmh0bWw6IEFkZGVkLgorCiAyMDEyLTAzLTAyICBBZGFtIEtsZWluICA8YWRhbWtAY2hy
b21pdW0ub3JnPgogCiAgICAgICAgIFJlYmFzZWxpbmluZyBTVkcgZm9yZWlnbk9iamVjdCB0ZXN0
cyBhZnRlciByMTA4NDk0LgpkaWZmIC0tZ2l0IGEvTGF5b3V0VGVzdHMvd2ViYXVkaW8vYmlxdWFk
LWdldEZyZXF1ZW5jeVJlc3BvbnNlLWV4cGVjdGVkLnR4dCBiL0xheW91dFRlc3RzL3dlYmF1ZGlv
L2JpcXVhZC1nZXRGcmVxdWVuY3lSZXNwb25zZS1leHBlY3RlZC50eHQKbmV3IGZpbGUgbW9kZSAx
MDA2NDQKaW5kZXggMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMC4uOTMw
MTE4MjM5MGVlNTI2ODU0MTU1Y2U5NDYyYWY3OWU1OTFlNTk0YgotLS0gL2Rldi9udWxsCisrKyBi
L0xheW91dFRlc3RzL3dlYmF1ZGlvL2JpcXVhZC1nZXRGcmVxdWVuY3lSZXNwb25zZS1leHBlY3Rl
ZC50eHQKQEAgLTAsMCArMSwxMSBAQAorVGVzdCBCaXF1YWQgZ2V0RnJlcXVlbmN5UmVzcG9uc2Uo
KSBmdW5jdGlvbmFsaXR5LgorCitPbiBzdWNjZXNzLCB5b3Ugd2lsbCBzZWUgYSBzZXJpZXMgb2Yg
IlBBU1MiIG1lc3NhZ2VzLCBmb2xsb3dlZCBieSAiVEVTVCBDT01QTEVURSIuCisKK1BBU1MgTWFn
bml0dWRlIHJlc3BvbnNlIHdpdGhpbiBhY2NlcHRhYmxlIHRocmVzaG9sZC4KK1BBU1MgUGhhc2Ug
cmVzcG9uc2Ugd2l0aGluIGFjY2VwdGFibGUgdGhyZXNob2xkLgorUEFTUyBQZWFraW5nIGZpbHRl
ciBmcmVxdWVuY3kgcmVzcG9uc2Ugd2FzIGNvcnJlY3QuCitQQVNTIHN1Y2Nlc3NmdWxseVBhcnNl
ZCBpcyB0cnVlCisKK1RFU1QgQ09NUExFVEUKKwpkaWZmIC0tZ2l0IGEvTGF5b3V0VGVzdHMvd2Vi
YXVkaW8vYmlxdWFkLWdldEZyZXF1ZW5jeVJlc3BvbnNlLmh0bWwgYi9MYXlvdXRUZXN0cy93ZWJh
dWRpby9iaXF1YWQtZ2V0RnJlcXVlbmN5UmVzcG9uc2UuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0
NAppbmRleCAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwLi43N2RkNDA1
NGQyODdjMTQ4NTIyOTc0YzEwODVmMzFlYThjNzdkMjIyCi0tLSAvZGV2L251bGwKKysrIGIvTGF5
b3V0VGVzdHMvd2ViYXVkaW8vYmlxdWFkLWdldEZyZXF1ZW5jeVJlc3BvbnNlLmh0bWwKQEAgLTAs
MCArMSwzMTQgQEAKKzwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAx
IFRyYW5zaXRpb25hbC8vRU4iPgorPGh0bWw+Cis8aGVhZD4KKzxzY3JpcHQgc3JjPSJyZXNvdXJj
ZXMvYXVkaW8tdGVzdGluZy5qcyI+PC9zY3JpcHQ+Cis8c2NyaXB0IHNyYz0icmVzb3VyY2VzL2Jp
cXVhZC10ZXN0aW5nLmpzIj48L3NjcmlwdD4KKzxzY3JpcHQgc3JjPSIuLi9mYXN0L2pzL3Jlc291
cmNlcy9qcy10ZXN0LXByZS5qcyI+PC9zY3JpcHQ+Cis8L2hlYWQ+CisKKzxib2R5PgorPGRpdiBp
ZD0iZGVzY3JpcHRpb24iPjwvZGl2PgorPGRpdiBpZD0iY29uc29sZSI+PC9kaXY+CisKKzxzY3Jp
cHQ+CitkZXNjcmlwdGlvbigiVGVzdCBCaXF1YWQgZ2V0RnJlcXVlbmN5UmVzcG9uc2UoKSBmdW5j
dGlvbmFsaXR5LiIpOworCisvLyBUZXN0IHRoZSBmcmVxdWVuY3kgcmVzcG9uc2Ugb2YgYSBiaXF1
YWQgZmlsdGVyLiAgV2UgY29tcHV0ZSB0aGUgZnJlcXVlbmN5IHJlc3BvbnNlIGZvciBhIHNpbXBs
ZQorLy8gcGVha2luZyBiaXF1YWQgZmlsdGVyIGFuZCBjb21wYXJlIGl0IHdpdGggdGhlIGV4cGVj
dGVkIGZyZXF1ZW5jeSByZXNwb25zZS4gIFRoZSBhY3R1YWwgZmlsdGVyCisvLyB1c2VkIGRvZXNu
J3QgbWF0dGVyIHNpbmNlIHdlJ3JlIHRlc3RpbmcgZ2V0RnJlcXVlbmN5UmVzcG9uc2UgYW5kIG5v
dCB0aGUgYWN0dWFsIGZpbHRlciBvdXRwdXQuCisvLyBUaGUgZmlsdGVycyBhcmUgZXh0ZW5zaXZl
bHkgdGVzdGVkIGluIG90aGVyIGJpcXVhZCB0ZXN0cy4KKwordmFyIGNvbnRleHQ7CisKKy8vIFRo
ZSBiaXF1YWQgZmlsdGVyIG5vZGUuCit2YXIgZmlsdGVyOworCisvLyBUaGUgbWFnbml0dWRlIHJl
c3BvbnNlIG9mIHRoZSBiaXF1YWQgZmlsdGVyLgordmFyIG1hZ1Jlc3BvbnNlOworCisvLyBUaGUg
cGhhc2UgcmVzcG9uc2Ugb2YgdGhlIGJpcXVhZCBmaWx0ZXIuCit2YXIgcGhhc2VSZXNwb25zZTsK
KworLy8gTnVtYmVyIG9mIGZyZXF1ZW5jeSBzYW1wbGVzIHRvIHRha2UuCit2YXIgbnVtYmVyT2ZG
cmVxdWVuY2llcyA9IDEwMDA7CisKKy8vIFRoZSBmaWx0ZXIgcGFyYW1ldGVycy4KK3ZhciBmaWx0
ZXJDdXRvZmYgPSAxMDAwOyAvLyBIei4KK3ZhciBmaWx0ZXJRID0gMTsKK3ZhciBmaWx0ZXJHYWlu
ID0gNTsgLy8gRGVjaWJlbHMuCisKKy8vIFRoZSBtYXhpbXVtIGFsbG93ZWQgZXJyb3IgaW4gdGhl
IG1hZ25pdHVkZSByZXNwb25zZS4KK3ZhciBtYXhBbGxvd2VkTWFnRXJyb3IgPSA1LjdlLTc7CisK
Ky8vIFRoZSBtYXhpbXVtIGFsbG93ZWQgZXJyb3IgaW4gdGhlIHBoYXNlIHJlc3BvbnNlLgordmFy
IG1heEFsbG93ZWRQaGFzZUVycm9yID0gNC43ZS04OworCisvLyBUaGUgbWFnbml0dWRlcyBhbmQg
cGhhc2VzIG9mIHRoZSByZWZlcmVuY2UgZnJlcXVlbmN5IHJlc3BvbnNlLgordmFyIG1hZ1Jlc3Bv
bnNlOwordmFyIHBoYXNlUmVzcG9uc2U7CisgICAgICAKKy8vIFRoZSBtYWduaXR1ZGVzIGFuZCBw
aGFzZXMgb2YgdGhlIHJlZmVyZW5jZSBmcmVxdWVuY3kgcmVzcG9uc2UuCit2YXIgZXhwZWN0ZWRN
YWduaXR1ZGVzOwordmFyIGV4cGVjdGVkUGhhc2VzOworCisvLyBDb252ZXJ0IGZyZXF1ZW5jeSBp
biBIeiB0byBhIG5vcm1hbGl6ZWQgZnJlcXVlbmN5IGJldHdlZW4gMCB0byAxIHdpdGggMSBjb3Jy
ZXNwb25kaW5nIHRvIHRoZQorLy8gTnlxdWlzdCBmcmVxdWVuY3kuCitmdW5jdGlvbiBub3JtYWxp
emVkRnJlcXVlbmN5KGZyZXFIeiwgc2FtcGxlUmF0ZSkKK3sKKyAgICB2YXIgbnlxdWlzdCA9IHNh
bXBsZVJhdGUgLyAyOworICAgIHJldHVybiBmcmVxSHogLyBueXF1aXN0OworfQorCisvLyBHZXQg
dGhlIGZpbHRlciByZXNwb25zZSBhdCBhIChub3JtYWxpemVkKSBmcmVxdWVuY3kgfGZ8IGZvciB0
aGUgZmlsdGVyIHdpdGggY29lZmZpY2llbnRzIHxjb2VmfC4KK2Z1bmN0aW9uIGdldFJlc3BvbnNl
QXQoY29lZiwgZikKK3sKKyAgICB2YXIgYjAgPSBjb2VmLmIwOworICAgIHZhciBiMSA9IGNvZWYu
YjE7CisgICAgdmFyIGIyID0gY29lZi5iMjsKKyAgICB2YXIgYTEgPSBjb2VmLmExOworICAgIHZh
ciBhMiA9IGNvZWYuYTI7CisKKyAgICAvLyBIKHopID0gKGIwICsgYjEgLyB6ICsgYjIgLyB6XjIp
IC8gKDEgKyBhMSAvIHogKyBhMiAvIHpeMikKKyAgICAvLworICAgIC8vIENvbXB1dGUgSChleHAo
aSAqIHBpICogZikpLiAgTm8gbmF0aXZlIGNvbXBsZXggbnVtYmVycyBpbiBqYXZhc2NyaXB0LCBz
byBicmVhayBIKGV4cChpICogcGkgKiAvLyBmKSkKKyAgICAvLyBpbiB0byB0aGUgcmVhbCBhbmQg
aW1hZ2luYXJ5IHBhcnRzIG9mIHRoZSBudW1lcmF0b3IgYW5kIGRlbm9taW5hdG9yLiAgTGV0IG9t
ZWdhID0gcGkgKiBmLgorICAgIC8vIFRoZW4gdGhlIG51bWVyYXRvciBpcworICAgIC8vCisgICAg
Ly8gYjAgKyBiMSAqIGNvcyhvbWVnYSkgKyBiMiAqIGNvcygyICogb21lZ2EpIC0gaSAqIChiMSAq
IHNpbihvbWVnYSkgKyBiMiAqIHNpbigyICogb21lZ2EpKQorICAgIC8vCisgICAgLy8gYW5kIHRo
ZSBkZW5vbWluYXRvciBpcworICAgIC8vCisgICAgLy8gMSArIGExICogY29zKG9tZWdhKSArIGEy
ICogY29zKDIgKiBvbWVnYSkgLSBpICogKGExICogc2luKG9tZWdhKSArIGEyICogc2luKDIgKiBv
bWVnYSkpCisgICAgLy8KKyAgICAvLyBDb21wdXRlIHRoZSBtYWduaXR1ZGUgYW5kIHBoYXNlIGZy
b20gdGhlIHJlYWwgYW5kIGltYWdpbmFyeSBwYXJ0cy4KKworICAgIHZhciBvbWVnYSA9IE1hdGgu
UEkgKiBmOworICAgIHZhciBudW1lcmF0b3JSZWFsID0gYjAgKyBiMSAqIE1hdGguY29zKG9tZWdh
KSArIGIyICogTWF0aC5jb3MoMiAqIG9tZWdhKTsKKyAgICB2YXIgbnVtZXJhdG9ySW1hZyA9IC0o
YjEgKiBNYXRoLnNpbihvbWVnYSkgKyBiMiAqIE1hdGguc2luKDIgKiBvbWVnYSkpOworICAgIHZh
ciBkZW5vbWluYXRvclJlYWwgPSAxICsgYTEgKiBNYXRoLmNvcyhvbWVnYSkgKyBhMiAqIE1hdGgu
Y29zKDIgKiBvbWVnYSk7CisgICAgdmFyIGRlbm9taW5hdG9ySW1hZyA9IC0oYTEgKiBNYXRoLnNp
bihvbWVnYSkgKyBhMiAqIE1hdGguc2luKDIgKiBvbWVnYSkpOworCisgICAgdmFyIG1hZ25pdHVk
ZSA9IE1hdGguc3FydCgobnVtZXJhdG9yUmVhbCAqIG51bWVyYXRvclJlYWwgKyBudW1lcmF0b3JJ
bWFnICogbnVtZXJhdG9ySW1hZykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8gKGRl
bm9taW5hdG9yUmVhbCAqIGRlbm9taW5hdG9yUmVhbCArIGRlbm9taW5hdG9ySW1hZyAqIGRlbm9t
aW5hdG9ySW1hZykpOworICAgIHZhciBwaGFzZSA9IE1hdGguYXRhbjIobnVtZXJhdG9ySW1hZywg
bnVtZXJhdG9yUmVhbCkgLSBNYXRoLmF0YW4yKGRlbm9taW5hdG9ySW1hZywgZGVub21pbmF0b3JS
ZWFsKTsKKyAgICAKKyAgICBpZiAocGhhc2UgPj0gTWF0aC5QSSkgeworICAgICAgICBwaGFzZSAt
PSAyICogTWF0aC5QSTsKKyAgICB9IGVsc2UgaWYgKHBoYXNlIDw9IC1NYXRoLlBJKSB7CisgICAg
ICAgIHBoYXNlICs9IDIgKiBNYXRoLlBJOworICAgIH0KKyAgIAorICAgIHJldHVybiB7bWFnbml0
dWRlIDogbWFnbml0dWRlLCBwaGFzZSA6IHBoYXNlfTsgCit9CisKKy8vIENvbXB1dGUgdGhlIHJl
ZmVyZW5jZSBmcmVxdWVuY3kgcmVzcG9uc2UgZm9yIHRoZSBiaXF1YWQgZmlsdGVyIHxmaWx0ZXJ8
IGF0IHRoZSBmcmVxdWVuY3kgc2FtcGxlcworLy8gZ2l2ZW4gYnkgfGZyZXF1ZW5jaWVzfC4KK2Z1
bmN0aW9uIGZyZXF1ZW5jeVJlc3BvbnNlUmVmZXJlbmNlKGZpbHRlciwgZnJlcXVlbmNpZXMpCit7
CisgICAgdmFyIHNhbXBsZVJhdGUgPSBmaWx0ZXIuY29udGV4dC5zYW1wbGVSYXRlOworICAgIHZh
ciBub3JtYWxpemVkRnJlcSA9IG5vcm1hbGl6ZWRGcmVxdWVuY3koZmlsdGVyLmZyZXF1ZW5jeS52
YWx1ZSwgc2FtcGxlUmF0ZSk7CisgICAgdmFyIGZpbHRlckNvZWZmaWNpZW50cyA9IGNyZWF0ZUZp
bHRlcihmaWx0ZXIudHlwZSwgbm9ybWFsaXplZEZyZXEsIGZpbHRlci5RLnZhbHVlLCBmaWx0ZXIu
Z2Fpbi52YWx1ZSk7CisKKyAgICB2YXIgbWFnbml0dWRlcyA9IFtdOworICAgIHZhciBwaGFzZXMg
PSBbXTsKKworICAgIGZvciAodmFyIGsgPSAwOyBrIDwgZnJlcXVlbmNpZXMubGVuZ3RoOyArK2sp
IHsKKyAgICAgICAgdmFyIHJlc3BvbnNlID0gZ2V0UmVzcG9uc2VBdChmaWx0ZXJDb2VmZmljaWVu
dHMsIG5vcm1hbGl6ZWRGcmVxdWVuY3koZnJlcXVlbmNpZXNba10sIHNhbXBsZVJhdGUpKTsKKyAg
ICAgICAgbWFnbml0dWRlcy5wdXNoKHJlc3BvbnNlLm1hZ25pdHVkZSk7CisgICAgICAgIHBoYXNl
cy5wdXNoKHJlc3BvbnNlLnBoYXNlKTsKKyAgICB9CisKKyAgICByZXR1cm4ge21hZ25pdHVkZXMg
OiBtYWduaXR1ZGVzLCBwaGFzZXMgOiBwaGFzZXN9OworfQorCisvLyBDb21wdXRlIGEgc2V0IG9m
IGxpbmVhcmx5IHNwYWNlZCBmcmVxdWVuY2llcy4KK2Z1bmN0aW9uIGNyZWF0ZUZyZXF1ZW5jaWVz
KG5GcmVxdWVuY2llcywgc2FtcGxlUmF0ZSkKK3sKKyAgICB2YXIgZnJlcXVlbmNpZXMgPSBuZXcg
RmxvYXQzMkFycmF5KG5GcmVxdWVuY2llcyk7CisgICAgdmFyIG55cXVpc3QgPSBzYW1wbGVSYXRl
IC8gMjsKKyAgICB2YXIgZnJlcURlbHRhID0gbnlxdWlzdCAvIG5GcmVxdWVuY2llczsKKworICAg
IGZvciAodmFyIGsgPSAwOyBrIDwgbkZyZXF1ZW5jaWVzOyArK2spIHsKKyAgICAgICAgZnJlcXVl
bmNpZXNba10gPSBrICogZnJlcURlbHRhOworICAgIH0KKworICAgIHJldHVybiBmcmVxdWVuY2ll
czsKK30KKworZnVuY3Rpb24gbGluZWFyVG9EZWNpYmVscyh4KQoreworICAgIGlmICh4KSB7Cisg
ICAgICAgIHJldHVybiAyMCAqIE1hdGgubG9nKHgpIC8gTWF0aC5MTjEwOworICAgIH0gZWxzZSB7
CisgICAgICAgIHJldHVybiAtMTAwMDsKKyAgICB9Cit9CisKKy8vIExvb2sgdGhyb3VnaCB0aGUg
YXJyYXkgYW5kIGZpbmQgYW55IE5hTiBvciBpbmZpbml0eS4gUmV0dXJucyB0aGUgaW5kZXggb2Yg
dGhlIGZpcnN0IG9jY3VyZW5jZSBvcgorLy8gLTEgaWYgbm9uZS4KK2Z1bmN0aW9uIGZpbmRCYWRO
dW1iZXIoc2lnbmFsKQoreworICAgIGZvciAodmFyIGsgPSAwOyBrIDwgc2lnbmFsLmxlbmd0aDsg
KytrKSB7CisgICAgICAgIGlmICghaXNWYWxpZE51bWJlcihzaWduYWxba10pKSB7CisgICAgICAg
ICAgIHJldHVybiBrOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiAtMTsKK30KKworLy8g
Q29tcHV0ZSBhYnNvbHV0ZSB2YWx1ZSBvZiB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHBoYXNlIGFu
Z2xlcywgdGFraW5nIGludG8gYWNjb3VudCB0aGUgd3JhcHBpbmcKKy8vIG9mIHBoYXNlcy4KK2Z1
bmN0aW9uIGFic29sdXRlUGhhc2VEaWZmZXJlbmNlKHgsIHkpCit7CisgICAgdmFyIGRpZmYgPSBN
YXRoLmFicyh4IC0geSk7CisgICAgCisgICAgaWYgKGRpZmYgPiBNYXRoLlBJKSB7CisgICAgICAg
IGRpZmYgPSAyICogTWF0aC5QSSAtIGRpZmY7CisgICAgfQorICAgIHJldHVybiBkaWZmOworfQor
CisvLyBDb21wYXJlIHRoZSBmcmVxdWVuY3kgcmVzcG9uc2Ugd2l0aCBvdXIgZXhwZWN0ZWQgcmVz
cG9uc2UuCitmdW5jdGlvbiBjb21wYXJlUmVzcG9uc2VzKGZpbHRlciwgZnJlcXVlbmNpZXMsIG1h
Z1Jlc3BvbnNlLCBwaGFzZVJlc3BvbnNlKQoreworICAgIHZhciBleHBlY3RlZFJlc3BvbnNlID0g
ZnJlcXVlbmN5UmVzcG9uc2VSZWZlcmVuY2UoZmlsdGVyLCBmcmVxdWVuY2llcyk7CisKKyAgICBl
eHBlY3RlZE1hZ25pdHVkZXMgPSBleHBlY3RlZFJlc3BvbnNlLm1hZ25pdHVkZXM7CisgICAgZXhw
ZWN0ZWRQaGFzZXMgPSBleHBlY3RlZFJlc3BvbnNlLnBoYXNlczsKKworICAgIHZhciBuID0gbWFn
UmVzcG9uc2UubGVuZ3RoOworICAgIHZhciBzdWNjZXNzID0gdHJ1ZTsKKyAgICB2YXIgYmFkUmVz
cG9uc2UgPSBmYWxzZTsKKworICAgIHZhciBtYXhNYWdFcnJvciA9IC0xOworICAgIHZhciBtYXhN
YWdFcnJvckluZGV4ID0gLTE7CisKKyAgICB2YXIgazsKKyAgICB2YXIgaGFzQmFkTnVtYmVyOwor
CisgICAgaGFzQmFkTnVtYmVyID0gZmluZEJhZE51bWJlcihtYWdSZXNwb25zZSk7CisgICAgaWYg
KGhhc0JhZE51bWJlciA+PSAwKSB7CisgICAgICAgIHRlc3RGYWlsZWQoIk1hZ25pdHVkZSByZXNw
b25zZSBoYXMgTmFOIG9yIGluZmluaXR5IGF0ICIgKyBoYXNCYWROdW1iZXIpOworICAgICAgICBz
dWNjZXNzID0gZmFsc2U7CisgICAgICAgIGJhZFJlc3BvbnNlID0gdHJ1ZTsKKyAgICB9CisKKyAg
ICBoYXNCYWROdW1iZXIgPSBmaW5kQmFkTnVtYmVyKHBoYXNlUmVzcG9uc2UpOworICAgIGlmICho
YXNCYWROdW1iZXIgPj0gMCkgeworICAgICAgICB0ZXN0RmFpbGVkKCJQaGFzZSByZXNwb25zZSBo
YXMgTmFOIG9yIGluZmluaXR5IGF0ICIgKyBoYXNCYWROdW1iZXIpOworICAgICAgICBzdWNjZXNz
ID0gZmFsc2U7CisgICAgICAgIGJhZFJlc3BvbnNlID0gdHJ1ZTsKKyAgICB9CisKKyAgICAvLyBU
aGVzZSBhcmVuJ3QgdGVzdGluZyB0aGUgaW1wbGVtZW50YXRpb24gaXRzZWxmLiAgSW5zdGVhZCwg
dGhlc2UgYXJlIHNhbml0eSBjaGVja3Mgb24gdGhlCisgICAgLy8gcmVmZXJlbmNlLiAgRmFpbHVy
ZSBoZXJlIGRvZXMgbm90IGltcGx5IGFuIGVycm9yIGluIHRoZSBpbXBsZW1lbnRhdGlvbi4KKyAg
ICBoYXNCYWROdW1iZXIgPSBmaW5kQmFkTnVtYmVyKGV4cGVjdGVkTWFnbml0dWRlcyk7CisgICAg
aWYgKGhhc0JhZE51bWJlciA+PSAwKSB7CisgICAgICAgIHRlc3RGYWlsZWQoIkV4cGVjdGVkIG1h
Z25pdHVkZSByZXNwb25zZSBoYXMgTmFOIG9yIGluZmluaXR5IGF0ICIgKyBoYXNCYWROdW1iZXIp
OworICAgICAgICBzdWNjZXNzID0gZmFsc2U7CisgICAgICAgIGJhZFJlc3BvbnNlID0gdHJ1ZTsK
KyAgICB9CisKKyAgICBoYXNCYWROdW1iZXIgPSBmaW5kQmFkTnVtYmVyKGV4cGVjdGVkUGhhc2Vz
KTsKKyAgICBpZiAoaGFzQmFkTnVtYmVyID49IDApIHsKKyAgICAgICAgdGVzdEZhaWxlZCgiRXhw
ZWN0ZWQgcGhhc2UgcmVzcG9uc2UgaGFzIE5hTiBvciBpbmZpbml0eSBhdCAiICsgaGFzQmFkTnVt
YmVyKTsKKyAgICAgICAgc3VjY2VzcyA9IGZhbHNlOworICAgICAgICBiYWRSZXNwb25zZSA9IHRy
dWU7CisgICAgfQorCisgICAgLy8gSWYgd2UgZm91bmQgYSBOYU4gb3IgaW5maW5pdHksIHRoZSBm
b2xsb3dpbmcgdGVzdHMgYXJlbid0IHZlcnkgaGVscGZ1bCwgZXNwZWNpYWxseSBmb3IgTmFOLgor
ICAgIC8vIFdlIHJ1biB0aGVtIGFueXdheSwgYWZ0ZXIgcHJpbnRpbmcgYSB3YXJuaW5nIG1lc3Nh
Z2UuCisKKyAgICBpZiAoYmFkUmVzcG9uc2UpIHsKKyAgICAgICAgdGVzdEZhaWxlZCgiTmFOIG9y
IGluZmluaXR5IGluIHRoZSBhY3R1YWwgb3IgZXhwZWN0ZWQgcmVzdWx0cyBtYWtlcyB0aGUgZm9s
bG93aW5nIHRlc3QgcmVzdWx0cyBzdXNwZWN0LiIpOworICAgICAgICBzdWNjZXNzID0gZmFsc2U7
CisgICAgfQorCisgICAgZm9yIChrID0gMDsgayA8IG47ICsraykgeworICAgICAgICB2YXIgZXJy
b3IgPSBNYXRoLmFicyhsaW5lYXJUb0RlY2liZWxzKG1hZ1Jlc3BvbnNlW2tdKSAtIGxpbmVhclRv
RGVjaWJlbHMoZXhwZWN0ZWRNYWduaXR1ZGVzW2tdKSk7CisgICAgICAgIGlmIChlcnJvciA+IG1h
eE1hZ0Vycm9yKSB7CisgICAgICAgICAgICBtYXhNYWdFcnJvciA9IGVycm9yOworICAgICAgICAg
ICAgbWF4TWFnRXJyb3JJbmRleCA9IGs7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAobWF4
TWFnRXJyb3IgPiBtYXhBbGxvd2VkTWFnRXJyb3IpIHsKKyAgICAgICAgdmFyIG1lc3NhZ2UgPSAi
TWFnbml0dWRlIGVycm9yICgiICsgbWF4TWFnRXJyb3IgKyAiIGRCKSI7CisgICAgICAgIG1lc3Nh
Z2UgKz0gIiBleGNlZWRlZCB0aHJlc2hvbGQgYXQgIiArIGZyZXF1ZW5jaWVzW21heE1hZ0Vycm9y
SW5kZXhdOworICAgICAgICBtZXNzYWdlICs9ICIgSHouICBBY3R1YWw6ICIgKyBsaW5lYXJUb0Rl
Y2liZWxzKG1hZ1Jlc3BvbnNlW21heE1hZ0Vycm9ySW5kZXhdKTsKKyAgICAgICAgbWVzc2FnZSAr
PSAiIGRCLCBleHBlY3RlZDogIiArIGxpbmVhclRvRGVjaWJlbHMoZXhwZWN0ZWRNYWduaXR1ZGVz
W21heE1hZ0Vycm9ySW5kZXhdKSArICIgZEIuIjsKKyAgICAgICAgdGVzdEZhaWxlZChtZXNzYWdl
KTsKKyAgICAgICAgc3VjY2VzcyA9IGZhbHNlOworICAgIH0gZWxzZSB7CisgICAgICAgIHRlc3RQ
YXNzZWQoIk1hZ25pdHVkZSByZXNwb25zZSB3aXRoaW4gYWNjZXB0YWJsZSB0aHJlc2hvbGQuIik7
CisgICAgfQorCisgICAgdmFyIG1heFBoYXNlRXJyb3IgPSAtMTsKKyAgICB2YXIgbWF4UGhhc2VF
cnJvckluZGV4ID0gLTE7CisKKyAgICBmb3IgKGsgPSAwOyBrIDwgbjsgKytrKSB7CisgICAgICAg
IHZhciBlcnJvciA9IGFic29sdXRlUGhhc2VEaWZmZXJlbmNlKHBoYXNlUmVzcG9uc2Vba10sIGV4
cGVjdGVkUGhhc2VzW2tdKTsKKyAgICAgICAgaWYgKGVycm9yID4gbWF4UGhhc2VFcnJvcikgewor
ICAgICAgICAgICAgbWF4UGhhc2VFcnJvciA9IGVycm9yOworICAgICAgICAgICAgbWF4UGhhc2VF
cnJvckluZGV4ID0gazsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChtYXhQaGFzZUVycm9y
ID4gbWF4QWxsb3dlZFBoYXNlRXJyb3IpIHsKKyAgICAgICAgdmFyIG1lc3NhZ2UgPSAiUGhhc2Ug
ZXJyb3IgKHJhZGlhbnMpICgiICsgbWF4UGhhc2VFcnJvcjsKKyAgICAgICAgbWVzc2FnZSArPSAi
KSBleGNlZWRlZCB0aHJlc2hvbGQgYXQgIiArIGZyZXF1ZW5jaWVzW21heFBoYXNlRXJyb3JJbmRl
eF07CisgICAgICAgIG1lc3NhZ2UgKz0gIiBIei4gIEFjdHVhbDogIiArIHBoYXNlUmVzcG9uc2Vb
bWF4UGhhc2VFcnJvckluZGV4XTsKKyAgICAgICAgbWVzc2FnZSArPSAiIGV4cGVjdGVkOiAiICsg
ZXhwZWN0ZWRQaGFzZXNbbWF4UGhhc2VFcnJvckluZGV4XTsKKyAgICAgICAgdGVzdEZhaWxlZCht
ZXNzYWdlKTsKKyAgICAgICAgc3VjY2VzcyA9IGZhbHNlOworICAgIH0gZWxzZSB7CisgICAgICAg
IHRlc3RQYXNzZWQoIlBoYXNlIHJlc3BvbnNlIHdpdGhpbiBhY2NlcHRhYmxlIHRocmVzaG9sZC4i
KTsKKyAgICB9CisKKworICAgIHJldHVybiBzdWNjZXNzOworfQorCitmdW5jdGlvbiBydW5UZXN0
KCkKK3sKKyAgICBpZiAod2luZG93LmxheW91dFRlc3RDb250cm9sbGVyKSB7CisgICAgICAgIGxh
eW91dFRlc3RDb250cm9sbGVyLmR1bXBBc1RleHQoKTsKKyAgICAgICAgbGF5b3V0VGVzdENvbnRy
b2xsZXIud2FpdFVudGlsRG9uZSgpOworICAgIH0KKworICAgIHdpbmRvdy5qc1Rlc3RJc0FzeW5j
ID0gdHJ1ZTsKKworICAgIGNvbnRleHQgPSBuZXcgd2Via2l0QXVkaW9Db250ZXh0KCk7CisgICAg
CisgICAgZmlsdGVyID0gY29udGV4dC5jcmVhdGVCaXF1YWRGaWx0ZXIoKTsKKworICAgIC8vIEFy
Yml0cmFyaWx5IHRlc3QgYSBwZWFraW5nIGZpbHRlciwgYnV0IGFueSBraW5kIG9mIGZpbHRlciBj
YW4gYmUgdGVzdGVkLgorICAgIGZpbHRlci50eXBlID0gZmlsdGVyLlBFQUtJTkc7CisgICAgZmls
dGVyLmZyZXF1ZW5jeS52YWx1ZSA9IGZpbHRlckN1dG9mZjsKKyAgICBmaWx0ZXIuUS52YWx1ZSA9
IGZpbHRlclE7CisgICAgZmlsdGVyLmdhaW4udmFsdWUgPSBmaWx0ZXJHYWluOworCisgICAgdmFy
IGZyZXF1ZW5jaWVzID0gY3JlYXRlRnJlcXVlbmNpZXMobnVtYmVyT2ZGcmVxdWVuY2llcywgY29u
dGV4dC5zYW1wbGVSYXRlKTsKKyAgICBtYWdSZXNwb25zZSA9IG5ldyBGbG9hdDMyQXJyYXkobnVt
YmVyT2ZGcmVxdWVuY2llcyk7CisgICAgcGhhc2VSZXNwb25zZSA9IG5ldyBGbG9hdDMyQXJyYXko
bnVtYmVyT2ZGcmVxdWVuY2llcyk7CisKKyAgICBmaWx0ZXIuZ2V0RnJlcXVlbmN5UmVzcG9uc2Uo
ZnJlcXVlbmNpZXMsIG1hZ1Jlc3BvbnNlLCBwaGFzZVJlc3BvbnNlKTsKKyAgICB2YXIgc3VjY2Vz
cyA9IGNvbXBhcmVSZXNwb25zZXMoZmlsdGVyLCBmcmVxdWVuY2llcywgbWFnUmVzcG9uc2UsIHBo
YXNlUmVzcG9uc2UpOworCisgICAgaWYgKHN1Y2Nlc3MpIHsKKyAgICAgICAgdGVzdFBhc3NlZChm
aWx0ZXJUeXBlTmFtZVtmaWx0ZXIudHlwZV0gKyAiIGZyZXF1ZW5jeSByZXNwb25zZSB3YXMgY29y
cmVjdC4iKTsKKyAgICB9IGVsc2UgeworICAgICAgICB0ZXN0RmFpbGVkKGZpbHRlclR5cGVOYW1l
W2ZpbHRlci50eXBlXSArICIgZnJlcXVlbmN5IHJlc3BvbnNlIHdhcyBpbmNvcnJlY3QuIik7Cisg
ICAgfQorCisgICAgZmluaXNoSlNUZXN0KCk7Cit9CisKK3J1blRlc3QoKTsKK3N1Y2Nlc3NmdWxs
eVBhcnNlZCA9IHRydWU7CisKKzwvc2NyaXB0PgorCis8c2NyaXB0IHNyYz0iLi4vZmFzdC9qcy9y
ZXNvdXJjZXMvanMtdGVzdC1wb3N0LmpzIj48L3NjcmlwdD4KKzwvYm9keT4KKzwvaHRtbD4K
</data>

          </attachment>
      

    </bug>

</bugzilla>