<?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>61942</bug_id>
          
          <creation_ts>2011-06-02 11:04:01 -0700</creation_ts>
          <short_desc>[EFL] Add ImageDiff implementation.</short_desc>
          <delta_ts>2011-06-17 14:56:56 -0700</delta_ts>
          <reporter_accessible>1</reporter_accessible>
          <cclist_accessible>1</cclist_accessible>
          <classification_id>1</classification_id>
          <classification>Unclassified</classification>
          <product>WebKit</product>
          <component>New Bugs</component>
          <version>528+ (Nightly build)</version>
          <rep_platform>Unspecified</rep_platform>
          <op_sys>Unspecified</op_sys>
          <bug_status>RESOLVED</bug_status>
          <resolution>FIXED</resolution>
          
          
          <bug_file_loc></bug_file_loc>
          <status_whiteboard></status_whiteboard>
          <keywords></keywords>
          <priority>P2</priority>
          <bug_severity>Normal</bug_severity>
          <target_milestone>---</target_milestone>
          <dependson>62877</dependson>
          
          <everconfirmed>1</everconfirmed>
          <reporter name="Leandro Pereira">leandro</reporter>
          <assigned_to name="Leandro Pereira">leandro</assigned_to>
          <cc>eric</cc>
    
    <cc>rakuco</cc>
    
    <cc>webkit.review.bot</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>414269</commentid>
    <comment_count>0</comment_count>
    <who name="Leandro Pereira">leandro</who>
    <bug_when>2011-06-02 11:04:01 -0700</bug_when>
    <thetext>[EFL] Add ImageDiff implementation.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>414275</commentid>
    <comment_count>1</comment_count>
      <attachid>95777</attachid>
    <who name="Leandro Pereira">leandro</who>
    <bug_when>2011-06-02 11:07:37 -0700</bug_when>
    <thetext>Created attachment 95777
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>414281</commentid>
    <comment_count>2</comment_count>
    <who name="WebKit Review Bot">webkit.review.bot</who>
    <bug_when>2011-06-02 11:11:30 -0700</bug_when>
    <thetext>Attachment 95777 did not pass style-queue:

Failed to run &quot;[&apos;Tools/Scripts/check-webkit-style&apos;, &apos;--diff-files&apos;, u&apos;Tools/ChangeLog&apos;, u&apos;Tools/DumpRenderTree/e...&quot; exit_code: 1

Tools/ChangeLog:1:  ChangeLog entry has no bug number  [changelog/bugnumber] [5]
Total errors found: 1 in 2 files


If any of these errors are false positives, please file a bug against check-webkit-style.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>414284</commentid>
    <comment_count>3</comment_count>
      <attachid>95779</attachid>
    <who name="Leandro Pereira">leandro</who>
    <bug_when>2011-06-02 11:16:21 -0700</bug_when>
    <thetext>Created attachment 95779
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>418844</commentid>
    <comment_count>4</comment_count>
      <attachid>95779</attachid>
    <who name="Eric Seidel (no email)">eric</who>
    <bug_when>2011-06-10 12:42:04 -0700</bug_when>
    <thetext>Comment on attachment 95779
Patch

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

Same troubles.  We&apos;re 2011, not 1980.  This code doesn&apos;t need to compile on my old DEC.

&gt; Tools/DumpRenderTree/efl/ImageDiff.cpp:144
&gt; +    else if (getenv(&quot;TEMP&quot;))

Do we need to release returns from getenv?

&gt; Tools/DumpRenderTree/efl/ImageDiff.cpp:165
&gt; +    int tempImageFd;

Sigh.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>418859</commentid>
    <comment_count>5</comment_count>
    <who name="Leandro Pereira">leandro</who>
    <bug_when>2011-06-10 13:18:40 -0700</bug_when>
    <thetext>(In reply to comment #4)
&gt; (From update of attachment 95779 [details])
&gt; View in context: https://bugs.webkit.org/attachment.cgi?id=95779&amp;action=review
&gt; 
&gt; Same troubles.  We&apos;re 2011, not 1980.  This code doesn&apos;t need to compile on
&gt; my old DEC.
&gt;

I agree so much with you, I&apos;m probably making some t-shirts with these words. Ping me if you want one. :P

&gt;
&gt; &gt; Tools/DumpRenderTree/efl/ImageDiff.cpp:144
&gt; &gt; +    else if (getenv(&quot;TEMP&quot;))
&gt; 
&gt; Do we need to release returns from getenv?
&gt; 

Nope -- strings returned by getenv() can&apos;t be modified in any way, as they&apos;re pointing to the process&apos; environment. It should really be returning const char*, but I guess they didn&apos;t need const pointers on a PDP. :)

&gt; &gt; Tools/DumpRenderTree/efl/ImageDiff.cpp:165
&gt; &gt; +    int tempImageFd;
&gt; 
&gt; Sigh.

Yeah, I know.

Unfortunately, Evas will only allow saving canvas objects to a file. I could close the file descriptor returned by mkstemps(), but that would create a (highly unlikely) race condition if the temporary file got removed somehow.

I could dump directly to the standard output, but then I&apos;d have no way to know in advance the file size.

Couldn&apos;t think of anything much different from this. Unless, of course, you&apos;re sighing to something else and I missed your point.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>422048</commentid>
    <comment_count>6</comment_count>
      <attachid>97460</attachid>
    <who name="Raphael Kubo da Costa (:rakuco)">rakuco</who>
    <bug_when>2011-06-16 10:41:25 -0700</bug_when>
    <thetext>Created attachment 97460
ImageDiff, take 2

New attempt at upstreaming ImageDiff.

Hopefully all the concerns have been solved, and there are no free() calls :)</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>422049</commentid>
    <comment_count>7</comment_count>
    <who name="Raphael Kubo da Costa (:rakuco)">rakuco</who>
    <bug_when>2011-06-16 10:44:11 -0700</bug_when>
    <thetext>CC&apos;ing eseidel.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>422067</commentid>
    <comment_count>8</comment_count>
      <attachid>97460</attachid>
    <who name="Eric Seidel (no email)">eric</who>
    <bug_when>2011-06-16 10:56:35 -0700</bug_when>
    <thetext>Comment on attachment 97460
ImageDiff, take 2

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

It looks OK, not great.

&gt; Tools/DumpRenderTree/efl/ImageDiff.cpp:83
&gt; +        printf(&quot;Error, test and reference image have different properties.\n&quot;);

I think you meant different sizes.

&gt; Tools/DumpRenderTree/efl/ImageDiff.cpp:105
&gt; +    for (int x = 0; x &lt; width; x++) {
&gt; +        for (int y = 0; y &lt; height; y++) {

This entire loop could be a helper.

&gt; Tools/DumpRenderTree/efl/ImageDiff.cpp:112
&gt; +            float red = (actualPixel[0] - basePixel[0]) / std::max&lt;float&gt;(255 - basePixel[0], basePixel[0]);
&gt; +            float green = (actualPixel[1] - basePixel[1]) / std::max&lt;float&gt;(255 - basePixel[1], basePixel[1]);
&gt; +            float blue = (actualPixel[2] - basePixel[2]) / std::max&lt;float&gt;(255 - basePixel[2], basePixel[2]);
&gt; +            float alpha = (actualPixel[3] - basePixel[3]) / std::max&lt;float&gt;(255 - basePixel[3], basePixel[3]);

I woudl have written/used a helper function here.

&gt; Tools/DumpRenderTree/efl/ImageDiff.cpp:129
&gt; +    // Compute the difference as a percentage combining both the number of
&gt; +    // different pixels and their difference amount i.e. the average distance
&gt; +    // over the entire image
&gt; +    float difference = 0;
&gt; +    if (count &gt; 0.0f)

This whole calculation could be a helper.

&gt; Tools/DumpRenderTree/efl/ImageDiff.cpp:147
&gt; +    if (getenv(&quot;TMPDIR&quot;))
&gt; +        snprintf(fileName, fileNameLength, &quot;%s/ImageDiffXXXXXX.png&quot;, getenv(&quot;TMPDIR&quot;));
&gt; +    else if (getenv(&quot;TEMP&quot;))
&gt; +        snprintf(fileName, fileNameLength, &quot;%s/ImageDiffXXXXXX.png&quot;, getenv(&quot;TEMP&quot;));

Really?  Do we need to copy/paste those lines just to change out TMPDIR vs. TEMP?

char* tempDirectory = getenv(&quot;TMPDIR&quot;);
if (!tempDirectory)
    tempDirectory = getEnv(&quot;TEMP&quot;);
if (tempDirectory)
   // printf
else {
  // other thing.

&gt; Tools/DumpRenderTree/efl/ImageDiff.cpp:255
&gt; +        ecore_evas_free(ecoreEvas);

manual memory management sucks.

&gt; Tools/DumpRenderTree/efl/ImageDiff.cpp:290
&gt; +            abortWithErrorMessage(&quot;could not read image from standard input&quot;);

Is it EFL style not to use capitals or periods?

&gt; Tools/DumpRenderTree/efl/ImageDiff.cpp:306
&gt; +    evas_object_del(*actualImage);
&gt; +    evas_object_del(*baselineImage);

manual memory management sucks.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>422147</commentid>
    <comment_count>9</comment_count>
    <who name="Raphael Kubo da Costa (:rakuco)">rakuco</who>
    <bug_when>2011-06-16 12:43:50 -0700</bug_when>
    <thetext>(In reply to comment #8)
&gt; (From update of attachment 97460 [details])
&gt; View in context: https://bugs.webkit.org/attachment.cgi?id=97460&amp;action=review
&gt; 
&gt; It looks OK, not great.
&gt; 
&gt; &gt; Tools/DumpRenderTree/efl/ImageDiff.cpp:83
&gt; &gt; +        printf(&quot;Error, test and reference image have different properties.\n&quot;);
&gt; 
&gt; I think you meant different sizes.

That&apos;s what the cg, gtk, qt and win DRTs say, so we were just being consistent :) Plus it is also considering the alpha besides the size in the comparison.

&gt; &gt; Tools/DumpRenderTree/efl/ImageDiff.cpp:105
&gt; &gt; +    for (int x = 0; x &lt; width; x++) {
&gt; &gt; +        for (int y = 0; y &lt; height; y++) {
&gt; 
&gt; This entire loop could be a helper.

IMHO it would make the code unnecessarily bigger -- I would need to pass at least five different parameters to it (buffer, width, height, diffPixels and rowStride) just to put the loop elsewhere with no apparent gain. I&apos;m fine with it if you really feel it should be done this way, though.

&gt; &gt; +    if (getenv(&quot;TMPDIR&quot;))
&gt; &gt; +        snprintf(fileName, fileNameLength, &quot;%s/ImageDiffXXXXXX.png&quot;, getenv(&quot;TMPDIR&quot;));
&gt; &gt; +    else if (getenv(&quot;TEMP&quot;))
&gt; &gt; +        snprintf(fileName, fileNameLength, &quot;%s/ImageDiffXXXXXX.png&quot;, getenv(&quot;TEMP&quot;));
&gt; 
&gt; Really?  Do we need to copy/paste those lines just to change out TMPDIR vs. TEMP?
&gt; 
&gt; char* tempDirectory = getenv(&quot;TMPDIR&quot;);
&gt; if (!tempDirectory)
&gt;     tempDirectory = getEnv(&quot;TEMP&quot;);
&gt; if (tempDirectory)
&gt;    // printf
&gt; else {
&gt;   // other thing.

OK, done.

&gt; &gt; Tools/DumpRenderTree/efl/ImageDiff.cpp:290
&gt; &gt; +            abortWithErrorMessage(&quot;could not read image from standard input&quot;);
&gt; 
&gt; Is it EFL style not to use capitals or periods?

I&apos;ve added periods to the error messages. They don&apos;t have capitals because they&apos;re appended to another string in abortWithErrorMessage().
 
&gt; &gt; Tools/DumpRenderTree/efl/
&gt; &gt; +        ecore_evas_free(ecoreEvas);
&gt; 
&gt; manual memory management sucks.
&gt; 
&gt; &gt; Tools/DumpRenderTree/efl/ImageDiff.cpp:306
&gt; &gt; +    evas_object_del(*actualImage);
&gt; &gt; +    evas_object_del(*baselineImage);
&gt; 
&gt; manual memory management sucks.

I think it&apos;s better to talk about it again in bug 62642 -- please see comment 28 in it.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>422847</commentid>
    <comment_count>10</comment_count>
      <attachid>97642</attachid>
    <who name="Leandro Pereira">leandro</who>
    <bug_when>2011-06-17 13:09:31 -0700</bug_when>
    <thetext>Created attachment 97642
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>422849</commentid>
    <comment_count>11</comment_count>
    <who name="Leandro Pereira">leandro</who>
    <bug_when>2011-06-17 13:13:31 -0700</bug_when>
    <thetext>(In reply to comment #10)
&gt; Created an attachment (id=97642) [details]
&gt; Patch

Third time is the charm. Hopefully all concerns raised by Eric have been taken care of.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>422894</commentid>
    <comment_count>12</comment_count>
      <attachid>97642</attachid>
    <who name="Eric Seidel (no email)">eric</who>
    <bug_when>2011-06-17 14:40:50 -0700</bug_when>
    <thetext>Comment on attachment 97642
Patch

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

Thank you.

&gt; Tools/DumpRenderTree/efl/ImageDiff.cpp:80
&gt; +            diffPixel[Red] = diffPixel[Green] = diffPixel[Blue] = *buffer++;

Oh, this is nice.  thank you.

&gt; Tools/DumpRenderTree/efl/ImageDiff.cpp:100
&gt; +    const float red = computeDistanceBetweenPixelComponents(actualPixel, basePixel, Red);

Very nice!

&gt; Tools/DumpRenderTree/efl/ImageDiff.cpp:118
&gt; +    OwnArrayPtr&lt;unsigned char&gt; diffBuffer = adoptArrayPtr(new unsigned char[width * height]);

I might have typedefed unsigned char given how often you&apos;re typing it in this file.  But this looks fine.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>422902</commentid>
    <comment_count>13</comment_count>
      <attachid>97642</attachid>
    <who name="WebKit Review Bot">webkit.review.bot</who>
    <bug_when>2011-06-17 14:56:51 -0700</bug_when>
    <thetext>Comment on attachment 97642
Patch

Clearing flags on attachment: 97642

Committed r89175: &lt;http://trac.webkit.org/changeset/89175&gt;</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>422903</commentid>
    <comment_count>14</comment_count>
    <who name="WebKit Review Bot">webkit.review.bot</who>
    <bug_when>2011-06-17 14:56:56 -0700</bug_when>
    <thetext>All reviewed patches have been landed.  Closing bug.</thetext>
  </long_desc>
      
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>95777</attachid>
            <date>2011-06-02 11:07:37 -0700</date>
            <delta_ts>2011-06-02 11:16:15 -0700</delta_ts>
            <desc>Patch</desc>
            <filename>bug-61942-20110602150735.patch</filename>
            <type>text/plain</type>
            <size>13478</size>
            <attacher name="Leandro Pereira">leandro</attacher>
            
              <data encoding="base64">SW5kZXg6IFRvb2xzL0NoYW5nZUxvZwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBUb29scy9DaGFuZ2VMb2cJKHJl
dmlzaW9uIDg3OTMxKQorKysgVG9vbHMvQ2hhbmdlTG9nCSh3b3JraW5nIGNvcHkpCkBAIC0xLDMg
KzEsMjIgQEAKKzIwMTEtMDYtMDIgIExlYW5kcm8gUGVyZWlyYSAgPGxlYW5kcm9AcHJvZnVzaW9u
Lm1vYmk+CisKKyAgICAgICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChPT1BTISkuCisKKyAgICAgICAg
W0VGTF0gQWRkIEltYWdlRGlmZiBpbXBsZW1lbnRhdGlvbi4KKyAgICAgICAgQnVpbGQgc3lzdGVt
IGNoYW5nZXMgd2lsbCBiZSBtYWRlIGFzIHNvb24gYXMgdGhlIGNvbXBsZXRlCisgICAgICAgIER1
bXBSZW5kZXJUcmVlIGltcGxlbWVudGF0aW9uIGlzIHVwc3RyZWFtZWQuCisKKyAgICAgICAgKiBE
dW1wUmVuZGVyVHJlZS9lZmw6IEFkZGVkLgorICAgICAgICAqIER1bXBSZW5kZXJUcmVlL2VmbC9J
bWFnZURpZmYuY3BwOiBBZGRlZC4KKyAgICAgICAgKGRpZmZlcmVuY2VJbWFnZUZyb21EaWZmZXJl
bmNlQnVmZmVyKToKKyAgICAgICAgKGNhbGN1bGF0ZURpZmZlcmVuY2UpOgorICAgICAgICAoZ2V0
VGVtcG9yYXJ5RmlsZSk6CisgICAgICAgIChwcmludEltYWdlKToKKyAgICAgICAgKHByaW50SW1h
Z2VEaWZmZXJlbmNlcyk6CisgICAgICAgIChyZWFkSW1hZ2VGcm9tU3RkaW4pOgorICAgICAgICAo
cGFyc2VDb21tYW5kTGluZU9wdGlvbnMpOgorICAgICAgICAobWFpbik6CisKIDIwMTEtMDYtMDIg
IERpbWl0cmkgR2xhemtvdiAgPGRnbGF6a292QGNocm9taXVtLm9yZz4KIAogICAgICAgICBVbnJl
dmlld2VkLCByb2xsaW5nIG91dCByODc5MjYuCkluZGV4OiBUb29scy9EdW1wUmVuZGVyVHJlZS9l
ZmwvSW1hZ2VEaWZmLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBUb29scy9EdW1wUmVuZGVyVHJlZS9lZmwv
SW1hZ2VEaWZmLmNwcAkocmV2aXNpb24gMCkKKysrIFRvb2xzL0R1bXBSZW5kZXJUcmVlL2VmbC9J
bWFnZURpZmYuY3BwCShyZXZpc2lvbiAwKQpAQCAtMCwwICsxLDMzNyBAQAorLyoKKyAqIENvcHly
aWdodCAoQykgMjAwOSBaYW4gRG9iZXJzZWsgPHphbmRvYmVyc2VrQGdtYWlsLmNvbT4KKyAqIENv
cHlyaWdodCAoQykgMjAxMCBJZ2FsaWEgUy5MLgorICogQ29weXJpZ2h0IChDKSAyMDExIFByb0ZV
U0lPTiBFbWJlZGRlZCBTeXN0ZW1zCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEgU2Ftc3VuZyBFbGVj
dHJvbmljcworICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5h
cnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVk
IHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICoK
KyAqIDEuICBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFi
b3ZlIGNvcHlyaWdodAorICogICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5k
IHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuICBSZWRpc3RyaWJ1dGlvbnMgaW4gYmlu
YXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgIG5vdGlj
ZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBp
biB0aGUKKyAqICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlk
ZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gIE5laXRoZXIgdGhlIG5hbWUgb2YgQXBw
bGUgQ29tcHV0ZXIsIEluYy4gKCJBcHBsZSIpIG5vciB0aGUgbmFtZXMgb2YKKyAqICAgICBpdHMg
Y29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBk
ZXJpdmVkCisgKiAgICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Ig
d3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkg
QVBQTEUgQU5EIElUUyBDT05UUklCVVRPUlMgIkFTIElTIiBBTkQgQU5ZCisgKiBFWFBSRVNTIE9S
IElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJ
TVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1Ig
QSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCisgKiBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFM
TCBBUFBMRSBPUiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZCisgKiBESVJFQ1Qs
IElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJ
QUwgREFNQUdFUworICogKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVO
VCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICogTE9TUyBPRiBVU0UsIERBVEEs
IE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5E
CisgKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RS
SUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVS
V0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisgKiBUSElTIFNPRlRX
QVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgor
ICovCisKKyNpbmNsdWRlIDxFY29yZS5oPgorI2luY2x1ZGUgPEVjb3JlX0V2YXMuaD4KKyNpbmNs
dWRlIDxFdmFzLmg+CisjaW5jbHVkZSA8YWxnb3JpdGhtPgorI2luY2x1ZGUgPGNtYXRoPgorI2lu
Y2x1ZGUgPGNzdGRpbz4KKyNpbmNsdWRlIDxjc3RyaW5nPgorI2luY2x1ZGUgPGdldG9wdC5oPgor
I2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8
dW5pc3RkLmg+CisKK3VzaW5nIG5hbWVzcGFjZSBzdGQ7CisKK3N0YXRpYyBkb3VibGUgdG9sZXJh
bmNlID0gMDsKKworRXZhc19PYmplY3QqIGRpZmZlcmVuY2VJbWFnZUZyb21EaWZmZXJlbmNlQnVm
ZmVyKEV2YXMqIGV2YXMsIHVuc2lnbmVkIGNoYXIqIGJ1ZmZlciwgaW50IHdpZHRoLCBpbnQgaGVp
Z2h0KQoreworICAgIEV2YXNfT2JqZWN0KiBpbWFnZSA9IGV2YXNfb2JqZWN0X2ltYWdlX2ZpbGxl
ZF9hZGQoZXZhcyk7CisgICAgaWYgKCFpbWFnZSkKKyAgICAgICAgcmV0dXJuIGltYWdlOworCisg
ICAgZXZhc19vYmplY3RfaW1hZ2Vfc2l6ZV9zZXQoaW1hZ2UsIHdpZHRoLCBoZWlnaHQpOworICAg
IGV2YXNfb2JqZWN0X2ltYWdlX2NvbG9yc3BhY2Vfc2V0KGltYWdlLCBFVkFTX0NPTE9SU1BBQ0Vf
QVJHQjg4ODgpOworICAgIHVuc2lnbmVkIGNoYXIqIGRpZmZQaXhlbHMgPSBzdGF0aWNfY2FzdDx1
bnNpZ25lZCBjaGFyKj4oZXZhc19vYmplY3RfaW1hZ2VfZGF0YV9nZXQoaW1hZ2UsIEVJTkFfVFJV
RSkpOworICAgIGNvbnN0IGludCByb3dTdHJpZGUgPSBldmFzX29iamVjdF9pbWFnZV9zdHJpZGVf
Z2V0KGltYWdlKTsKKworICAgIGZvciAoaW50IHggPSAwOyB4IDwgd2lkdGg7IHgrKykgeworICAg
ICAgICBmb3IgKGludCB5ID0gMDsgeSA8IGhlaWdodDsgeSsrKSB7CisgICAgICAgICAgICB1bnNp
Z25lZCBjaGFyKiBkaWZmUGl4ZWwgPSBkaWZmUGl4ZWxzICsgKHkgKiByb3dTdHJpZGUpICsgKHgg
KiA0KTsKKyAgICAgICAgICAgIGRpZmZQaXhlbFswXSA9IGRpZmZQaXhlbFsxXSA9IGRpZmZQaXhl
bFsyXSA9ICpidWZmZXIrKzsKKyAgICAgICAgICAgIGRpZmZQaXhlbFszXSA9IDB4ZmY7IC8vIEFs
cGhhIGNoYW5uZWwKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBpbWFnZTsKK30KKwor
ZmxvYXQgY2FsY3VsYXRlRGlmZmVyZW5jZShFdmFzX09iamVjdCogYmFzZWxpbmVJbWFnZSwgRXZh
c19PYmplY3QqIGFjdHVhbEltYWdlLCBFdmFzX09iamVjdCoqIGRpZmZlcmVuY2VJbWFnZSkKK3sK
KyAgICBpbnQgd2lkdGgsIGhlaWdodCwgYmFzZWxpbmVXaWR0aCwgYmFzZWxpbmVIZWlnaHQ7Cisg
ICAgZXZhc19vYmplY3RfaW1hZ2Vfc2l6ZV9nZXQoYWN0dWFsSW1hZ2UsICZ3aWR0aCwgJmhlaWdo
dCk7CisgICAgZXZhc19vYmplY3RfaW1hZ2Vfc2l6ZV9nZXQoYmFzZWxpbmVJbWFnZSwgJmJhc2Vs
aW5lV2lkdGgsICZiYXNlbGluZUhlaWdodCk7CisKKyAgICBpZiAod2lkdGggIT0gYmFzZWxpbmVX
aWR0aAorICAgICAgICB8fCBoZWlnaHQgIT0gYmFzZWxpbmVIZWlnaHQKKyAgICAgICAgfHwgZXZh
c19vYmplY3RfaW1hZ2VfYWxwaGFfZ2V0KGFjdHVhbEltYWdlKSAhPSBldmFzX29iamVjdF9pbWFn
ZV9hbHBoYV9nZXQoYmFzZWxpbmVJbWFnZSkpIHsKKyAgICAgICAgcHJpbnRmKCJFcnJvciwgdGVz
dCBhbmQgcmVmZXJlbmNlIGltYWdlIGhhdmUgZGlmZmVyZW50IHByb3BlcnRpZXMuXG4iKTsKKyAg
ICAgICAgcmV0dXJuIDEwMDsgLy8gQ29tcGxldGVseSBkaWZmZXJlbnQuCisgICAgfQorICAgIGV2
YXNfb2JqZWN0X2ltYWdlX2NvbG9yc3BhY2Vfc2V0KGFjdHVhbEltYWdlLCBFVkFTX0NPTE9SU1BB
Q0VfQVJHQjg4ODgpOworICAgIGV2YXNfb2JqZWN0X2ltYWdlX2NvbG9yc3BhY2Vfc2V0KGJhc2Vs
aW5lSW1hZ2UsIEVWQVNfQ09MT1JTUEFDRV9BUkdCODg4OCk7CisKKyAgICBjb25zdCBpbnQgbnVt
YmVyT2ZDaGFubmVscyA9IDQ7IC8vIEFscGhhICsgUiArIEcgKyBCCisgICAgY29uc3QgaW50IGFj
dHVhbFJvd1N0cmlkZSA9IGV2YXNfb2JqZWN0X2ltYWdlX3N0cmlkZV9nZXQoYWN0dWFsSW1hZ2Up
OworICAgIGNvbnN0IGludCBiYXNlUm93U3RyaWRlID0gZXZhc19vYmplY3RfaW1hZ2Vfc3RyaWRl
X2dldChiYXNlbGluZUltYWdlKTsKKyAgICBmbG9hdCBjb3VudCA9IDA7CisgICAgZmxvYXQgc3Vt
ID0gMDsKKyAgICBmbG9hdCBtYXhEaXN0YW5jZSA9IDA7CisgICAgdW5zaWduZWQgY2hhciogYWN0
dWFsUGl4ZWxzID0gc3RhdGljX2Nhc3Q8dW5zaWduZWQgY2hhcio+KGV2YXNfb2JqZWN0X2ltYWdl
X2RhdGFfZ2V0KGFjdHVhbEltYWdlLCBFSU5BX0ZBTFNFKSk7CisgICAgdW5zaWduZWQgY2hhciog
YmFzZVBpeGVscyA9IHN0YXRpY19jYXN0PHVuc2lnbmVkIGNoYXIqPihldmFzX29iamVjdF9pbWFn
ZV9kYXRhX2dldChiYXNlbGluZUltYWdlLCBFSU5BX0ZBTFNFKSk7CisgICAgdW5zaWduZWQgY2hh
ciogZGlmZkJ1ZmZlciA9IHN0YXRpY19jYXN0PHVuc2lnbmVkIGNoYXIqPihtYWxsb2Mod2lkdGgg
KiBoZWlnaHQpKTsKKyAgICB1bnNpZ25lZCBjaGFyKiBjdXJyZW50RGlmZlBpeGVsID0gZGlmZkJ1
ZmZlcjsKKworICAgIGlmICghZGlmZkJ1ZmZlcikgeworICAgICAgICBwcmludGYoIkVycm9yLCBj
b3VsZG4ndCBhbGxvY2F0ZSBkaWZmZXJlbmNlIGJ1ZmZlci5cbiIpOworICAgICAgICByZXR1cm4g
MTAwOworICAgIH0KKworICAgIGZvciAoaW50IHggPSAwOyB4IDwgd2lkdGg7IHgrKykgeworICAg
ICAgICBmb3IgKGludCB5ID0gMDsgeSA8IGhlaWdodDsgeSsrKSB7CisgICAgICAgICAgICB1bnNp
Z25lZCBjaGFyKiBhY3R1YWxQaXhlbCA9IGFjdHVhbFBpeGVscyArICh5ICogYWN0dWFsUm93U3Ry
aWRlKSArICh4ICogbnVtYmVyT2ZDaGFubmVscyk7CisgICAgICAgICAgICB1bnNpZ25lZCBjaGFy
KiBiYXNlUGl4ZWwgPSBiYXNlUGl4ZWxzICsgKHkgKiBiYXNlUm93U3RyaWRlKSArICh4ICogbnVt
YmVyT2ZDaGFubmVscyk7CisKKyAgICAgICAgICAgIGZsb2F0IHJlZCA9IChhY3R1YWxQaXhlbFsw
XSAtIGJhc2VQaXhlbFswXSkgLyBtYXg8ZmxvYXQ+KDI1NSAtIGJhc2VQaXhlbFswXSwgYmFzZVBp
eGVsWzBdKTsKKyAgICAgICAgICAgIGZsb2F0IGdyZWVuID0gKGFjdHVhbFBpeGVsWzFdIC0gYmFz
ZVBpeGVsWzFdKSAvIG1heDxmbG9hdD4oMjU1IC0gYmFzZVBpeGVsWzFdLCBiYXNlUGl4ZWxbMV0p
OworICAgICAgICAgICAgZmxvYXQgYmx1ZSA9IChhY3R1YWxQaXhlbFsyXSAtIGJhc2VQaXhlbFsy
XSkgLyBtYXg8ZmxvYXQ+KDI1NSAtIGJhc2VQaXhlbFsyXSwgYmFzZVBpeGVsWzJdKTsKKyAgICAg
ICAgICAgIGZsb2F0IGFscGhhID0gKGFjdHVhbFBpeGVsWzNdIC0gYmFzZVBpeGVsWzNdKSAvIG1h
eDxmbG9hdD4oMjU1IC0gYmFzZVBpeGVsWzNdLCBiYXNlUGl4ZWxbM10pOworICAgICAgICAgICAg
ZmxvYXQgZGlzdGFuY2UgPSBzcXJ0ZihyZWQgKiByZWQgKyBncmVlbiAqIGdyZWVuICsgYmx1ZSAq
IGJsdWUgKyBhbHBoYSAqIGFscGhhKSAvIDIuMGY7CisKKyAgICAgICAgICAgICpjdXJyZW50RGlm
ZlBpeGVsKysgPSBzdGF0aWNfY2FzdDx1bnNpZ25lZCBjaGFyPihkaXN0YW5jZSAqIDI1NS4wZik7
CisKKyAgICAgICAgICAgIGlmIChkaXN0YW5jZSA+PSAxLjBmIC8gMjU1LjBmKSB7CisgICAgICAg
ICAgICAgICAgY291bnQgKz0gMS4wZjsKKyAgICAgICAgICAgICAgICBzdW0gKz0gZGlzdGFuY2U7
CisgICAgICAgICAgICAgICAgbWF4RGlzdGFuY2UgPSBtYXg8ZmxvYXQ+KG1heERpc3RhbmNlLCBk
aXN0YW5jZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBDb21w
dXRlIHRoZSBkaWZmZXJlbmNlIGFzIGEgcGVyY2VudGFnZSBjb21iaW5pbmcgYm90aCB0aGUgbnVt
YmVyIG9mCisgICAgLy8gZGlmZmVyZW50IHBpeGVscyBhbmQgdGhlaXIgZGlmZmVyZW5jZSBhbW91
bnQgaS5lLiB0aGUgYXZlcmFnZSBkaXN0YW5jZQorICAgIC8vIG92ZXIgdGhlIGVudGlyZSBpbWFn
ZQorICAgIGZsb2F0IGRpZmZlcmVuY2UgPSAwOworICAgIGlmIChjb3VudCA+IDAuMGYpCisgICAg
ICAgIGRpZmZlcmVuY2UgPSAxMDAuMGYgKiBzdW0gLyAoaGVpZ2h0ICogd2lkdGgpOworICAgIGlm
IChkaWZmZXJlbmNlIDw9IHRvbGVyYW5jZSkKKyAgICAgICAgZGlmZmVyZW5jZSA9IDA7CisgICAg
ZWxzZSB7CisgICAgICAgIGRpZmZlcmVuY2UgPSByb3VuZGYoZGlmZmVyZW5jZSAqIDEwMC4wZikg
LyAxMDAuMGY7CisgICAgICAgIGRpZmZlcmVuY2UgPSBtYXgoZGlmZmVyZW5jZSwgMC4wMWYpOyAv
LyByb3VuZCB0byAyIGRlY2ltYWwgcGxhY2VzCisgICAgICAgICpkaWZmZXJlbmNlSW1hZ2UgPSBk
aWZmZXJlbmNlSW1hZ2VGcm9tRGlmZmVyZW5jZUJ1ZmZlcihldmFzX29iamVjdF9ldmFzX2dldChi
YXNlbGluZUltYWdlKSwgZGlmZkJ1ZmZlciwgd2lkdGgsIGhlaWdodCk7CisgICAgfQorCisgICAg
ZnJlZShkaWZmQnVmZmVyKTsKKyAgICByZXR1cm4gZGlmZmVyZW5jZTsKK30KKworaW50IGdldFRl
bXBvcmFyeUZpbGUoY2hhciAqZmlsZU5hbWUsIHNpemVfdCBmaWxlTmFtZUxlbikKK3sKKyAgICBp
ZiAoZ2V0ZW52KCJUTVBESVIiKSkKKyAgICAgICAgc25wcmludGYoZmlsZU5hbWUsIGZpbGVOYW1l
TGVuLCAiJXMvSW1hZ2VEaWZmWFhYWFhYLnBuZyIsIGdldGVudigiVE1QRElSIikpOworICAgIGVs
c2UgaWYgKGdldGVudigiVEVNUCIpKQorICAgICAgICBzbnByaW50ZihmaWxlTmFtZSwgZmlsZU5h
bWVMZW4sICIlcy9JbWFnZURpZmZYWFhYWFgucG5nIiwgZ2V0ZW52KCJURU1QIikpOworICAgIGVs
c2UgeworI2lmIF9fbGludXhfXworICAgICAgICBzdHJjcHkoZmlsZU5hbWUsICIvZGV2L3NobS9J
bWFnZURpZmZYWFhYWFgucG5nIik7CisgICAgICAgIGludCBmaWxlRGVzY3JpcHRvciA9IG1rc3Rl
bXBzKGZpbGVOYW1lLCBzaXplb2YoIi5wbmciKSAtIDEpOworICAgICAgICBpZiAoZmlsZURlc2Ny
aXB0b3IgPj0gMCkKKyAgICAgICAgICAgIHJldHVybiBmaWxlRGVzY3JpcHRvcjsKKyNlbmRpZiAv
LyBfX2xpbnV4X18KKworICAgICAgICBzdHJjcHkoZmlsZU5hbWUsICIvdG1wL0ltYWdlRGlmZlhY
WFhYWC5wbmciKTsKKyAgICB9CisKKyAgICByZXR1cm4gbWtzdGVtcHMoZmlsZU5hbWUsIHNpemVv
ZigiLnBuZyIpIC0gMSk7Cit9CisKK3ZvaWQgcHJpbnRJbWFnZShFdmFzX09iamVjdCogaW1hZ2Up
Cit7CisgICAgY2hhciogYnVmZmVyOworICAgIHNpemVfdCBidWZmZXJTaXplOworICAgIGNoYXIg
ZmlsZU5hbWVbUEFUSF9NQVhdOworICAgIGludCB0ZW1wSW1hZ2VGZDsKKworICAgIHRlbXBJbWFn
ZUZkID0gZ2V0VGVtcG9yYXJ5RmlsZShmaWxlTmFtZSwgUEFUSF9NQVgpOworICAgIGlmICh0ZW1w
SW1hZ2VGZCA8IDApCisgICAgICAgIHJldHVybjsKKworICAgIGlmIChldmFzX29iamVjdF9pbWFn
ZV9zYXZlKGltYWdlLCBmaWxlTmFtZSwgMCwgMCkpIHsKKyAgICAgICAgc3RydWN0IHN0YXQgZmls
ZUluZm87CisgICAgICAgIGlmICghc3RhdChmaWxlTmFtZSwgJmZpbGVJbmZvKSkgeworICAgICAg
ICAgICAgdW5zaWduZWQgY2hhciBidWZmZXJbMjA0OF07CisgICAgICAgICAgICBzc2l6ZV90IGJ5
dGVzUmVhZDsKKworICAgICAgICAgICAgcHJpbnRmKCJDb250ZW50LUxlbmd0aDogJWxkXG4iLCBm
aWxlSW5mby5zdF9zaXplKTsKKyAgICAgICAgICAgIGZmbHVzaChzdGRvdXQpOworICAgICAgICAg
ICAgd2hpbGUgKChieXRlc1JlYWQgPSByZWFkKHRlbXBJbWFnZUZkLCBidWZmZXIsIHNpemVvZihi
dWZmZXIpKSkgPiAwKQorICAgICAgICAgICAgICAgIHdyaXRlKDEsIGJ1ZmZlciwgYnl0ZXNSZWFk
KTsKKyAgICAgICAgfQorICAgIH0KKyAgICBjbG9zZSh0ZW1wSW1hZ2VGZCk7CisgICAgdW5saW5r
KGZpbGVOYW1lKTsKK30KKwordm9pZCBwcmludEltYWdlRGlmZmVyZW5jZXMoRXZhc19PYmplY3Qq
IGJhc2VsaW5lSW1hZ2UsIEV2YXNfT2JqZWN0KiBhY3R1YWxJbWFnZSkKK3sKKyAgICBFdmFzX09i
amVjdCogZGlmZmVyZW5jZUltYWdlID0gMDsKKyAgICBmbG9hdCBkaWZmZXJlbmNlID0gY2FsY3Vs
YXRlRGlmZmVyZW5jZShiYXNlbGluZUltYWdlLCBhY3R1YWxJbWFnZSwgJmRpZmZlcmVuY2VJbWFn
ZSk7CisgICAgaWYgKGRpZmZlcmVuY2UgPiAwLjBmKSB7CisgICAgICAgIGlmIChkaWZmZXJlbmNl
SW1hZ2UpIHsKKyAgICAgICAgICAgIHByaW50SW1hZ2UoZGlmZmVyZW5jZUltYWdlKTsKKyAgICAg
ICAgICAgIGV2YXNfb2JqZWN0X2RlbChkaWZmZXJlbmNlSW1hZ2UpOworICAgICAgICB9CisgICAg
ICAgIHByaW50ZigiZGlmZjogJTAxLjJmJSUgZmFpbGVkXG4iLCBkaWZmZXJlbmNlKTsKKyAgICB9
IGVsc2UKKyAgICAgICAgcHJpbnRmKCJkaWZmOiAlMDEuMmYlJSBwYXNzZWRcbiIsIGRpZmZlcmVu
Y2UpOworfQorCitFdmFzX09iamVjdCogcmVhZEltYWdlRnJvbVN0ZGluKEV2YXMqIGV2YXMsIGxv
bmcgaW1hZ2VTaXplLCBpbnQgKndpZHRoLCBpbnQgKmhlaWdodCkKK3sKKyAgICBFdmFzX09iamVj
dCogaW1hZ2U7CisgICAgdW5zaWduZWQgY2hhciogaW1hZ2VCdWZmZXI7CisKKyAgICBpbWFnZUJ1
ZmZlciA9IHN0YXRpY19jYXN0PHVuc2lnbmVkIGNoYXIgKj4obWFsbG9jKGltYWdlU2l6ZSkpOwor
ICAgIGlmICghaW1hZ2VCdWZmZXIpCisgICAgICAgIHJldHVybiAwOworCisgICAgaW1hZ2UgPSBl
dmFzX29iamVjdF9pbWFnZV9maWxsZWRfYWRkKGV2YXMpOworICAgIHNpemVfdCBieXRlc1JlYWQg
PSBmcmVhZChpbWFnZUJ1ZmZlciwgMSwgaW1hZ2VTaXplLCBzdGRpbik7CisgICAgaWYgKGJ5dGVz
UmVhZCA+IDApCisgICAgICAgIGV2YXNfb2JqZWN0X2ltYWdlX21lbWZpbGVfc2V0KGltYWdlLCBp
bWFnZUJ1ZmZlciwgYnl0ZXNSZWFkLCAwLCAwKTsKKyAgICBlbHNlIHsKKyAgICAgICAgZnJlZShp
bWFnZUJ1ZmZlcik7CisgICAgICAgIGV2YXNfb2JqZWN0X2RlbChpbWFnZSk7CisgICAgICAgIHJl
dHVybiAwOworICAgIH0KKyAgICBmcmVlKGltYWdlQnVmZmVyKTsKKworICAgIGV2YXNfb2JqZWN0
X2ltYWdlX3NpemVfZ2V0KGltYWdlLCB3aWR0aCwgaGVpZ2h0KTsKKyAgICByZXR1cm4gaW1hZ2U7
Cit9CisKK2Jvb2wgcGFyc2VDb21tYW5kTGluZU9wdGlvbnMoaW50IGFyZ2MsIGNoYXIqKiBhcmd2
KQoreworICAgIHN0YXRpYyBjb25zdCBvcHRpb24gb3B0aW9uc1tdID0geworICAgICAgICB7ICJ0
b2xlcmFuY2UiLCByZXF1aXJlZF9hcmd1bWVudCwgMCwgJ3QnIH0sCisgICAgICAgIHsgMCwgMCwg
MCwgMCB9CisgICAgfTsKKyAgICBpbnQgb3B0aW9uOworCisgICAgd2hpbGUgKChvcHRpb24gPSBn
ZXRvcHRfbG9uZyhhcmdjLCAoY2hhciogY29uc3QqKWFyZ3YsICJ0OiIsIG9wdGlvbnMsIDApKSAh
PSAtMSkgeworICAgICAgICBzd2l0Y2ggKG9wdGlvbikgeworICAgICAgICBjYXNlICd0JzoKKyAg
ICAgICAgICAgIHRvbGVyYW5jZSA9IGF0b2Yob3B0YXJnKTsKKyAgICAgICAgICAgIGJyZWFrOwor
ICAgICAgICBjYXNlICc/JzoKKyAgICAgICAgY2FzZSAnOic6CisgICAgICAgICAgICByZXR1cm4g
ZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworaW50IG1h
aW4oaW50IGFyZ2MsIGNoYXIqIGFyZ3ZbXSkKK3sKKyAgICBFdmFzX09iamVjdCogYWN0dWFsSW1h
Z2UgPSAwOworICAgIEV2YXNfT2JqZWN0KiBiYXNlbGluZUltYWdlID0gMDsKKyAgICBFY29yZV9F
dmFzKiBlY29yZUV2YXMgPSAwOworICAgIEV2YXMqIGV2YXMgPSAwOworICAgIGNoYXIgYnVmZmVy
WzIwNDhdOworICAgIGludCByZXR1cm5WYWx1ZSA9IDA7CisgICAgaW50IGJ1ZmZlcldpZHRoID0g
MTsKKyAgICBpbnQgYnVmZmVySGVpZ2h0ID0gMTsKKworICAgIGlmICghcGFyc2VDb21tYW5kTGlu
ZU9wdGlvbnMoYXJnYywgYXJndikpCisgICAgICAgIHJldHVybiAxOworCisgICAgZXZhc19pbml0
KCk7CisgICAgZWNvcmVfaW5pdCgpOworICAgIGVjb3JlX2V2YXNfaW5pdCgpOworICAgIAorICAg
IGVjb3JlRXZhcyA9IGVjb3JlX2V2YXNfYnVmZmVyX25ldyhidWZmZXJXaWR0aCwgYnVmZmVySGVp
Z2h0KTsKKyAgICBldmFzID0gZWNvcmVfZXZhc19nZXQoZWNvcmVFdmFzKTsKKyAgICBpZiAoIWV2
YXMpIHsKKyAgICAgICAgcHJpbnRmKCJFcnJvciwgY291bGRuJ3QgY3JlYXRlIGVjb3JlIGV2YXMg
YnVmZmVyLlxuIik7CisgICAgICAgIHJldHVyblZhbHVlID0gMTsKKyAgICAgICAgZ290byBzaHV0
ZG93bjsKKyAgICB9CisKKyAgICB3aGlsZSAoZmdldHMoYnVmZmVyLCBzaXplb2YoYnVmZmVyKSwg
c3RkaW4pKSB7CisgICAgICAgIGNoYXIqIG5ld0xpbmVDaGFyYWN0ZXIgPSBzdHJjaHIoYnVmZmVy
LCAnXG4nKTsKKyAgICAgICAgaWYgKG5ld0xpbmVDaGFyYWN0ZXIpCisgICAgICAgICAgICAqbmV3
TGluZUNoYXJhY3RlciA9ICdcMCc7CisKKyAgICAgICAgaWYgKCFzdHJuY21wKCJDb250ZW50LUxl
bmd0aDogIiwgYnVmZmVyLCAxNikpIHsKKyAgICAgICAgICAgIGxvbmcgaW1hZ2VTaXplOworICAg
ICAgICAgICAgaW50IHdpZHRoLCBoZWlnaHQ7CisKKyAgICAgICAgICAgIGlmIChzc2NhbmYoYnVm
ZmVyLCAiQ29udGVudC1MZW5ndGg6ICVsZCIsICZpbWFnZVNpemUpICE9IDEpIHsKKyAgICAgICAg
ICAgICAgICBwcmludGYoIkVycm9yLCBpbWFnZSBzaXplIG11c3QgYmUgc3BlY2lmaWVkLlxuIik7
CisgICAgICAgICAgICAgICAgcmV0dXJuVmFsdWUgPSAxOworICAgICAgICAgICAgICAgIGdvdG8g
c2h1dGRvd247CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoaW1hZ2VTaXplID4gMCkg
eworICAgICAgICAgICAgICAgIGlmICghYWN0dWFsSW1hZ2UpIHsKKyAgICAgICAgICAgICAgICAg
ICAgaWYgKCEoYWN0dWFsSW1hZ2UgPSByZWFkSW1hZ2VGcm9tU3RkaW4oZXZhcywgaW1hZ2VTaXpl
LCAmd2lkdGgsICZoZWlnaHQpKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCJF
cnJvciwgY291bGQgbm90IHJlYWQgYWN0dWFsIGltYWdlLlxuIik7CisgICAgICAgICAgICAgICAg
ICAgICAgICByZXR1cm5WYWx1ZSA9IDE7CisgICAgICAgICAgICAgICAgICAgICAgICBnb3RvIHNo
dXRkb3duOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmICh3
aWR0aCA+IGJ1ZmZlcldpZHRoKQorICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyV2lkdGgg
PSB3aWR0aDsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGhlaWdodCA+IGJ1ZmZlckhlaWdodCkK
KyAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlcldpZHRoID0gd2lkdGg7CisgICAgICAgICAg
ICAgICAgICAgIGVjb3JlX2V2YXNfcmVzaXplKGVjb3JlRXZhcywgYnVmZmVyV2lkdGgsIGJ1ZmZl
ckhlaWdodCk7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmICghYmFzZWxpbmVJbWFnZSkgewor
ICAgICAgICAgICAgICAgICAgICBpZiAoIShiYXNlbGluZUltYWdlID0gcmVhZEltYWdlRnJvbVN0
ZGluKGV2YXMsIGltYWdlU2l6ZSwgJndpZHRoLCAmaGVpZ2h0KSkpIHsKKyAgICAgICAgICAgICAg
ICAgICAgICAgIHByaW50ZigiRXJyb3IsIGNvdWxkIG5vdCByZWFkIGJhc2VsaW5lIGltYWdlLlxu
Iik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm5WYWx1ZSA9IDE7CisgICAgICAgICAg
ICAgICAgICAgICAgICBnb3RvIHNodXRkb3duOworICAgICAgICAgICAgICAgICAgICB9CisgICAg
ICAgICAgICAgICAgICAgIGlmICh3aWR0aCA+IGJ1ZmZlcldpZHRoKQorICAgICAgICAgICAgICAg
ICAgICAgICAgYnVmZmVyV2lkdGggPSB3aWR0aDsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGhl
aWdodCA+IGJ1ZmZlckhlaWdodCkKKyAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlcldpZHRo
ID0gd2lkdGg7CisgICAgICAgICAgICAgICAgICAgIGVjb3JlX2V2YXNfcmVzaXplKGVjb3JlRXZh
cywgYnVmZmVyV2lkdGgsIGJ1ZmZlckhlaWdodCk7CisgICAgICAgICAgICAgICAgfQorICAgICAg
ICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBwcmludGYoIkVycm9yLCBpbWFnZSBzaXpl
IG11c3QgYmUgc3BlY2lmaWVkLlxuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuVmFsdWUgPSAx
OworICAgICAgICAgICAgICAgIGdvdG8gc2h1dGRvd247CisgICAgICAgICAgICB9CisgICAgICAg
IH0KKworICAgICAgICBpZiAoYWN0dWFsSW1hZ2UgJiYgYmFzZWxpbmVJbWFnZSkgeworICAgICAg
ICAgICAgcHJpbnRJbWFnZURpZmZlcmVuY2VzKGJhc2VsaW5lSW1hZ2UsIGFjdHVhbEltYWdlKTsK
KyAgICAgICAgICAgIGV2YXNfb2JqZWN0X2RlbChhY3R1YWxJbWFnZSk7CisgICAgICAgICAgICBl
dmFzX29iamVjdF9kZWwoYmFzZWxpbmVJbWFnZSk7CisgICAgICAgICAgICBhY3R1YWxJbWFnZSA9
IDA7CisgICAgICAgICAgICBiYXNlbGluZUltYWdlID0gMDsKKyAgICAgICAgfQorCisgICAgICAg
IGZmbHVzaChzdGRvdXQpOworICAgIH0KKworc2h1dGRvd246CisgICAgaWYgKGVjb3JlRXZhcykK
KyAgICAgICAgZWNvcmVfZXZhc19mcmVlKGVjb3JlRXZhcyk7CisgICAgZWNvcmVfZXZhc19zaHV0
ZG93bigpOworICAgIGVjb3JlX3NodXRkb3duKCk7CisgICAgZXZhc19zaHV0ZG93bigpOworCisg
ICAgcmV0dXJuIHJldHVyblZhbHVlOworfQo=
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>95779</attachid>
            <date>2011-06-02 11:16:21 -0700</date>
            <delta_ts>2011-06-16 10:42:17 -0700</delta_ts>
            <desc>Patch</desc>
            <filename>bug-61942-20110602151619.patch</filename>
            <type>text/plain</type>
            <size>13533</size>
            <attacher name="Leandro Pereira">leandro</attacher>
            
              <data encoding="base64">SW5kZXg6IFRvb2xzL0NoYW5nZUxvZwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBUb29scy9DaGFuZ2VMb2cJKHJl
dmlzaW9uIDg3OTMxKQorKysgVG9vbHMvQ2hhbmdlTG9nCSh3b3JraW5nIGNvcHkpCkBAIC0xLDMg
KzEsMjMgQEAKKzIwMTEtMDYtMDIgIExlYW5kcm8gUGVyZWlyYSAgPGxlYW5kcm9AcHJvZnVzaW9u
Lm1vYmk+CisKKyAgICAgICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChPT1BTISkuCisKKyAgICAgICAg
W0VGTF0gQWRkIEltYWdlRGlmZiBpbXBsZW1lbnRhdGlvbi4KKyAgICAgICAgQnVpbGQgc3lzdGVt
IGNoYW5nZXMgd2lsbCBiZSBtYWRlIGFzIHNvb24gYXMgdGhlIGNvbXBsZXRlCisgICAgICAgIER1
bXBSZW5kZXJUcmVlIGltcGxlbWVudGF0aW9uIGlzIHVwc3RyZWFtZWQuCisgICAgICAgIGh0dHBz
Oi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD02MTk0MgorCisgICAgICAgICogRHVt
cFJlbmRlclRyZWUvZWZsOiBBZGRlZC4KKyAgICAgICAgKiBEdW1wUmVuZGVyVHJlZS9lZmwvSW1h
Z2VEaWZmLmNwcDogQWRkZWQuCisgICAgICAgIChkaWZmZXJlbmNlSW1hZ2VGcm9tRGlmZmVyZW5j
ZUJ1ZmZlcik6CisgICAgICAgIChjYWxjdWxhdGVEaWZmZXJlbmNlKToKKyAgICAgICAgKGdldFRl
bXBvcmFyeUZpbGUpOgorICAgICAgICAocHJpbnRJbWFnZSk6CisgICAgICAgIChwcmludEltYWdl
RGlmZmVyZW5jZXMpOgorICAgICAgICAocmVhZEltYWdlRnJvbVN0ZGluKToKKyAgICAgICAgKHBh
cnNlQ29tbWFuZExpbmVPcHRpb25zKToKKyAgICAgICAgKG1haW4pOgorCiAyMDExLTA2LTAyICBE
aW1pdHJpIEdsYXprb3YgIDxkZ2xhemtvdkBjaHJvbWl1bS5vcmc+CiAKICAgICAgICAgVW5yZXZp
ZXdlZCwgcm9sbGluZyBvdXQgcjg3OTI2LgpJbmRleDogVG9vbHMvRHVtcFJlbmRlclRyZWUvZWZs
L0ltYWdlRGlmZi5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gVG9vbHMvRHVtcFJlbmRlclRyZWUvZWZsL0lt
YWdlRGlmZi5jcHAJKHJldmlzaW9uIDApCisrKyBUb29scy9EdW1wUmVuZGVyVHJlZS9lZmwvSW1h
Z2VEaWZmLmNwcAkocmV2aXNpb24gMCkKQEAgLTAsMCArMSwzMzcgQEAKKy8qCisgKiBDb3B5cmln
aHQgKEMpIDIwMDkgWmFuIERvYmVyc2VrIDx6YW5kb2JlcnNla0BnbWFpbC5jb20+CisgKiBDb3B5
cmlnaHQgKEMpIDIwMTAgSWdhbGlhIFMuTC4KKyAqIENvcHlyaWdodCAoQykgMjAxMSBQcm9GVVNJ
T04gRW1iZWRkZWQgU3lzdGVtcworICogQ29weXJpZ2h0IChDKSAyMDExIFNhbXN1bmcgRWxlY3Ry
b25pY3MKKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5
IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBw
cm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqCisg
KiAxLiAgUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92
ZSBjb3B5cmlnaHQKKyAqICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0
aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiAgUmVkaXN0cmlidXRpb25zIGluIGJpbmFy
eSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICBub3RpY2Us
IHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4g
dGhlCisgKiAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVk
IHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuICBOZWl0aGVyIHRoZSBuYW1lIG9mIEFwcGxl
IENvbXB1dGVyLCBJbmMuICgiQXBwbGUiKSBub3IgdGhlIG5hbWVzIG9mCisgKiAgICAgaXRzIGNv
bnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVy
aXZlZAorICogICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdy
aXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQ
UExFIEFORCBJVFMgQ09OVFJJQlVUT1JTICJBUyBJUyIgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJ
TVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1Q
TElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEg
UEFSVElDVUxBUiBQVVJQT1NFIEFSRQorICogRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwg
QVBQTEUgT1IgSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWQorICogRElSRUNULCBJ
TkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFM
IERBTUFHRVMKKyAqIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQg
T0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAqIExPU1MgT0YgVVNFLCBEQVRBLCBP
UiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAor
ICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklD
VCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJ
U0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorICogVEhJUyBTT0ZUV0FS
RSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAq
LworCisjaW5jbHVkZSA8RWNvcmUuaD4KKyNpbmNsdWRlIDxFY29yZV9FdmFzLmg+CisjaW5jbHVk
ZSA8RXZhcy5oPgorI2luY2x1ZGUgPGFsZ29yaXRobT4KKyNpbmNsdWRlIDxjbWF0aD4KKyNpbmNs
dWRlIDxjc3RkaW8+CisjaW5jbHVkZSA8Y3N0cmluZz4KKyNpbmNsdWRlIDxnZXRvcHQuaD4KKyNp
bmNsdWRlIDxzeXMvc3RhdC5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHVu
aXN0ZC5oPgorCit1c2luZyBuYW1lc3BhY2Ugc3RkOworCitzdGF0aWMgZG91YmxlIHRvbGVyYW5j
ZSA9IDA7CisKK0V2YXNfT2JqZWN0KiBkaWZmZXJlbmNlSW1hZ2VGcm9tRGlmZmVyZW5jZUJ1ZmZl
cihFdmFzKiBldmFzLCB1bnNpZ25lZCBjaGFyKiBidWZmZXIsIGludCB3aWR0aCwgaW50IGhlaWdo
dCkKK3sKKyAgICBFdmFzX09iamVjdCogaW1hZ2UgPSBldmFzX29iamVjdF9pbWFnZV9maWxsZWRf
YWRkKGV2YXMpOworICAgIGlmICghaW1hZ2UpCisgICAgICAgIHJldHVybiBpbWFnZTsKKworICAg
IGV2YXNfb2JqZWN0X2ltYWdlX3NpemVfc2V0KGltYWdlLCB3aWR0aCwgaGVpZ2h0KTsKKyAgICBl
dmFzX29iamVjdF9pbWFnZV9jb2xvcnNwYWNlX3NldChpbWFnZSwgRVZBU19DT0xPUlNQQUNFX0FS
R0I4ODg4KTsKKyAgICB1bnNpZ25lZCBjaGFyKiBkaWZmUGl4ZWxzID0gc3RhdGljX2Nhc3Q8dW5z
aWduZWQgY2hhcio+KGV2YXNfb2JqZWN0X2ltYWdlX2RhdGFfZ2V0KGltYWdlLCBFSU5BX1RSVUUp
KTsKKyAgICBjb25zdCBpbnQgcm93U3RyaWRlID0gZXZhc19vYmplY3RfaW1hZ2Vfc3RyaWRlX2dl
dChpbWFnZSk7CisKKyAgICBmb3IgKGludCB4ID0gMDsgeCA8IHdpZHRoOyB4KyspIHsKKyAgICAg
ICAgZm9yIChpbnQgeSA9IDA7IHkgPCBoZWlnaHQ7IHkrKykgeworICAgICAgICAgICAgdW5zaWdu
ZWQgY2hhciogZGlmZlBpeGVsID0gZGlmZlBpeGVscyArICh5ICogcm93U3RyaWRlKSArICh4ICog
NCk7CisgICAgICAgICAgICBkaWZmUGl4ZWxbMF0gPSBkaWZmUGl4ZWxbMV0gPSBkaWZmUGl4ZWxb
Ml0gPSAqYnVmZmVyKys7CisgICAgICAgICAgICBkaWZmUGl4ZWxbM10gPSAweGZmOyAvLyBBbHBo
YSBjaGFubmVsCisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gaW1hZ2U7Cit9CisKK2Zs
b2F0IGNhbGN1bGF0ZURpZmZlcmVuY2UoRXZhc19PYmplY3QqIGJhc2VsaW5lSW1hZ2UsIEV2YXNf
T2JqZWN0KiBhY3R1YWxJbWFnZSwgRXZhc19PYmplY3QqKiBkaWZmZXJlbmNlSW1hZ2UpCit7Cisg
ICAgaW50IHdpZHRoLCBoZWlnaHQsIGJhc2VsaW5lV2lkdGgsIGJhc2VsaW5lSGVpZ2h0OworICAg
IGV2YXNfb2JqZWN0X2ltYWdlX3NpemVfZ2V0KGFjdHVhbEltYWdlLCAmd2lkdGgsICZoZWlnaHQp
OworICAgIGV2YXNfb2JqZWN0X2ltYWdlX3NpemVfZ2V0KGJhc2VsaW5lSW1hZ2UsICZiYXNlbGlu
ZVdpZHRoLCAmYmFzZWxpbmVIZWlnaHQpOworCisgICAgaWYgKHdpZHRoICE9IGJhc2VsaW5lV2lk
dGgKKyAgICAgICAgfHwgaGVpZ2h0ICE9IGJhc2VsaW5lSGVpZ2h0CisgICAgICAgIHx8IGV2YXNf
b2JqZWN0X2ltYWdlX2FscGhhX2dldChhY3R1YWxJbWFnZSkgIT0gZXZhc19vYmplY3RfaW1hZ2Vf
YWxwaGFfZ2V0KGJhc2VsaW5lSW1hZ2UpKSB7CisgICAgICAgIHByaW50ZigiRXJyb3IsIHRlc3Qg
YW5kIHJlZmVyZW5jZSBpbWFnZSBoYXZlIGRpZmZlcmVudCBwcm9wZXJ0aWVzLlxuIik7CisgICAg
ICAgIHJldHVybiAxMDA7IC8vIENvbXBsZXRlbHkgZGlmZmVyZW50LgorICAgIH0KKyAgICBldmFz
X29iamVjdF9pbWFnZV9jb2xvcnNwYWNlX3NldChhY3R1YWxJbWFnZSwgRVZBU19DT0xPUlNQQUNF
X0FSR0I4ODg4KTsKKyAgICBldmFzX29iamVjdF9pbWFnZV9jb2xvcnNwYWNlX3NldChiYXNlbGlu
ZUltYWdlLCBFVkFTX0NPTE9SU1BBQ0VfQVJHQjg4ODgpOworCisgICAgY29uc3QgaW50IG51bWJl
ck9mQ2hhbm5lbHMgPSA0OyAvLyBBbHBoYSArIFIgKyBHICsgQgorICAgIGNvbnN0IGludCBhY3R1
YWxSb3dTdHJpZGUgPSBldmFzX29iamVjdF9pbWFnZV9zdHJpZGVfZ2V0KGFjdHVhbEltYWdlKTsK
KyAgICBjb25zdCBpbnQgYmFzZVJvd1N0cmlkZSA9IGV2YXNfb2JqZWN0X2ltYWdlX3N0cmlkZV9n
ZXQoYmFzZWxpbmVJbWFnZSk7CisgICAgZmxvYXQgY291bnQgPSAwOworICAgIGZsb2F0IHN1bSA9
IDA7CisgICAgZmxvYXQgbWF4RGlzdGFuY2UgPSAwOworICAgIHVuc2lnbmVkIGNoYXIqIGFjdHVh
bFBpeGVscyA9IHN0YXRpY19jYXN0PHVuc2lnbmVkIGNoYXIqPihldmFzX29iamVjdF9pbWFnZV9k
YXRhX2dldChhY3R1YWxJbWFnZSwgRUlOQV9GQUxTRSkpOworICAgIHVuc2lnbmVkIGNoYXIqIGJh
c2VQaXhlbHMgPSBzdGF0aWNfY2FzdDx1bnNpZ25lZCBjaGFyKj4oZXZhc19vYmplY3RfaW1hZ2Vf
ZGF0YV9nZXQoYmFzZWxpbmVJbWFnZSwgRUlOQV9GQUxTRSkpOworICAgIHVuc2lnbmVkIGNoYXIq
IGRpZmZCdWZmZXIgPSBzdGF0aWNfY2FzdDx1bnNpZ25lZCBjaGFyKj4obWFsbG9jKHdpZHRoICog
aGVpZ2h0KSk7CisgICAgdW5zaWduZWQgY2hhciogY3VycmVudERpZmZQaXhlbCA9IGRpZmZCdWZm
ZXI7CisKKyAgICBpZiAoIWRpZmZCdWZmZXIpIHsKKyAgICAgICAgcHJpbnRmKCJFcnJvciwgY291
bGRuJ3QgYWxsb2NhdGUgZGlmZmVyZW5jZSBidWZmZXIuXG4iKTsKKyAgICAgICAgcmV0dXJuIDEw
MDsKKyAgICB9CisKKyAgICBmb3IgKGludCB4ID0gMDsgeCA8IHdpZHRoOyB4KyspIHsKKyAgICAg
ICAgZm9yIChpbnQgeSA9IDA7IHkgPCBoZWlnaHQ7IHkrKykgeworICAgICAgICAgICAgdW5zaWdu
ZWQgY2hhciogYWN0dWFsUGl4ZWwgPSBhY3R1YWxQaXhlbHMgKyAoeSAqIGFjdHVhbFJvd1N0cmlk
ZSkgKyAoeCAqIG51bWJlck9mQ2hhbm5lbHMpOworICAgICAgICAgICAgdW5zaWduZWQgY2hhciog
YmFzZVBpeGVsID0gYmFzZVBpeGVscyArICh5ICogYmFzZVJvd1N0cmlkZSkgKyAoeCAqIG51bWJl
ck9mQ2hhbm5lbHMpOworCisgICAgICAgICAgICBmbG9hdCByZWQgPSAoYWN0dWFsUGl4ZWxbMF0g
LSBiYXNlUGl4ZWxbMF0pIC8gbWF4PGZsb2F0PigyNTUgLSBiYXNlUGl4ZWxbMF0sIGJhc2VQaXhl
bFswXSk7CisgICAgICAgICAgICBmbG9hdCBncmVlbiA9IChhY3R1YWxQaXhlbFsxXSAtIGJhc2VQ
aXhlbFsxXSkgLyBtYXg8ZmxvYXQ+KDI1NSAtIGJhc2VQaXhlbFsxXSwgYmFzZVBpeGVsWzFdKTsK
KyAgICAgICAgICAgIGZsb2F0IGJsdWUgPSAoYWN0dWFsUGl4ZWxbMl0gLSBiYXNlUGl4ZWxbMl0p
IC8gbWF4PGZsb2F0PigyNTUgLSBiYXNlUGl4ZWxbMl0sIGJhc2VQaXhlbFsyXSk7CisgICAgICAg
ICAgICBmbG9hdCBhbHBoYSA9IChhY3R1YWxQaXhlbFszXSAtIGJhc2VQaXhlbFszXSkgLyBtYXg8
ZmxvYXQ+KDI1NSAtIGJhc2VQaXhlbFszXSwgYmFzZVBpeGVsWzNdKTsKKyAgICAgICAgICAgIGZs
b2F0IGRpc3RhbmNlID0gc3FydGYocmVkICogcmVkICsgZ3JlZW4gKiBncmVlbiArIGJsdWUgKiBi
bHVlICsgYWxwaGEgKiBhbHBoYSkgLyAyLjBmOworCisgICAgICAgICAgICAqY3VycmVudERpZmZQ
aXhlbCsrID0gc3RhdGljX2Nhc3Q8dW5zaWduZWQgY2hhcj4oZGlzdGFuY2UgKiAyNTUuMGYpOwor
CisgICAgICAgICAgICBpZiAoZGlzdGFuY2UgPj0gMS4wZiAvIDI1NS4wZikgeworICAgICAgICAg
ICAgICAgIGNvdW50ICs9IDEuMGY7CisgICAgICAgICAgICAgICAgc3VtICs9IGRpc3RhbmNlOwor
ICAgICAgICAgICAgICAgIG1heERpc3RhbmNlID0gbWF4PGZsb2F0PihtYXhEaXN0YW5jZSwgZGlz
dGFuY2UpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLy8gQ29tcHV0
ZSB0aGUgZGlmZmVyZW5jZSBhcyBhIHBlcmNlbnRhZ2UgY29tYmluaW5nIGJvdGggdGhlIG51bWJl
ciBvZgorICAgIC8vIGRpZmZlcmVudCBwaXhlbHMgYW5kIHRoZWlyIGRpZmZlcmVuY2UgYW1vdW50
IGkuZS4gdGhlIGF2ZXJhZ2UgZGlzdGFuY2UKKyAgICAvLyBvdmVyIHRoZSBlbnRpcmUgaW1hZ2UK
KyAgICBmbG9hdCBkaWZmZXJlbmNlID0gMDsKKyAgICBpZiAoY291bnQgPiAwLjBmKQorICAgICAg
ICBkaWZmZXJlbmNlID0gMTAwLjBmICogc3VtIC8gKGhlaWdodCAqIHdpZHRoKTsKKyAgICBpZiAo
ZGlmZmVyZW5jZSA8PSB0b2xlcmFuY2UpCisgICAgICAgIGRpZmZlcmVuY2UgPSAwOworICAgIGVs
c2UgeworICAgICAgICBkaWZmZXJlbmNlID0gcm91bmRmKGRpZmZlcmVuY2UgKiAxMDAuMGYpIC8g
MTAwLjBmOworICAgICAgICBkaWZmZXJlbmNlID0gbWF4KGRpZmZlcmVuY2UsIDAuMDFmKTsgLy8g
cm91bmQgdG8gMiBkZWNpbWFsIHBsYWNlcworICAgICAgICAqZGlmZmVyZW5jZUltYWdlID0gZGlm
ZmVyZW5jZUltYWdlRnJvbURpZmZlcmVuY2VCdWZmZXIoZXZhc19vYmplY3RfZXZhc19nZXQoYmFz
ZWxpbmVJbWFnZSksIGRpZmZCdWZmZXIsIHdpZHRoLCBoZWlnaHQpOworICAgIH0KKworICAgIGZy
ZWUoZGlmZkJ1ZmZlcik7CisgICAgcmV0dXJuIGRpZmZlcmVuY2U7Cit9CisKK2ludCBnZXRUZW1w
b3JhcnlGaWxlKGNoYXIgKmZpbGVOYW1lLCBzaXplX3QgZmlsZU5hbWVMZW4pCit7CisgICAgaWYg
KGdldGVudigiVE1QRElSIikpCisgICAgICAgIHNucHJpbnRmKGZpbGVOYW1lLCBmaWxlTmFtZUxl
biwgIiVzL0ltYWdlRGlmZlhYWFhYWC5wbmciLCBnZXRlbnYoIlRNUERJUiIpKTsKKyAgICBlbHNl
IGlmIChnZXRlbnYoIlRFTVAiKSkKKyAgICAgICAgc25wcmludGYoZmlsZU5hbWUsIGZpbGVOYW1l
TGVuLCAiJXMvSW1hZ2VEaWZmWFhYWFhYLnBuZyIsIGdldGVudigiVEVNUCIpKTsKKyAgICBlbHNl
IHsKKyNpZiBfX2xpbnV4X18KKyAgICAgICAgc3RyY3B5KGZpbGVOYW1lLCAiL2Rldi9zaG0vSW1h
Z2VEaWZmWFhYWFhYLnBuZyIpOworICAgICAgICBpbnQgZmlsZURlc2NyaXB0b3IgPSBta3N0ZW1w
cyhmaWxlTmFtZSwgc2l6ZW9mKCIucG5nIikgLSAxKTsKKyAgICAgICAgaWYgKGZpbGVEZXNjcmlw
dG9yID49IDApCisgICAgICAgICAgICByZXR1cm4gZmlsZURlc2NyaXB0b3I7CisjZW5kaWYgLy8g
X19saW51eF9fCisKKyAgICAgICAgc3RyY3B5KGZpbGVOYW1lLCAiL3RtcC9JbWFnZURpZmZYWFhY
WFgucG5nIik7CisgICAgfQorCisgICAgcmV0dXJuIG1rc3RlbXBzKGZpbGVOYW1lLCBzaXplb2Yo
Ii5wbmciKSAtIDEpOworfQorCit2b2lkIHByaW50SW1hZ2UoRXZhc19PYmplY3QqIGltYWdlKQor
eworICAgIGNoYXIqIGJ1ZmZlcjsKKyAgICBzaXplX3QgYnVmZmVyU2l6ZTsKKyAgICBjaGFyIGZp
bGVOYW1lW1BBVEhfTUFYXTsKKyAgICBpbnQgdGVtcEltYWdlRmQ7CisKKyAgICB0ZW1wSW1hZ2VG
ZCA9IGdldFRlbXBvcmFyeUZpbGUoZmlsZU5hbWUsIFBBVEhfTUFYKTsKKyAgICBpZiAodGVtcElt
YWdlRmQgPCAwKQorICAgICAgICByZXR1cm47CisKKyAgICBpZiAoZXZhc19vYmplY3RfaW1hZ2Vf
c2F2ZShpbWFnZSwgZmlsZU5hbWUsIDAsIDApKSB7CisgICAgICAgIHN0cnVjdCBzdGF0IGZpbGVJ
bmZvOworICAgICAgICBpZiAoIXN0YXQoZmlsZU5hbWUsICZmaWxlSW5mbykpIHsKKyAgICAgICAg
ICAgIHVuc2lnbmVkIGNoYXIgYnVmZmVyWzIwNDhdOworICAgICAgICAgICAgc3NpemVfdCBieXRl
c1JlYWQ7CisKKyAgICAgICAgICAgIHByaW50ZigiQ29udGVudC1MZW5ndGg6ICVsZFxuIiwgZmls
ZUluZm8uc3Rfc2l6ZSk7CisgICAgICAgICAgICBmZmx1c2goc3Rkb3V0KTsKKyAgICAgICAgICAg
IHdoaWxlICgoYnl0ZXNSZWFkID0gcmVhZCh0ZW1wSW1hZ2VGZCwgYnVmZmVyLCBzaXplb2YoYnVm
ZmVyKSkpID4gMCkKKyAgICAgICAgICAgICAgICB3cml0ZSgxLCBidWZmZXIsIGJ5dGVzUmVhZCk7
CisgICAgICAgIH0KKyAgICB9CisgICAgY2xvc2UodGVtcEltYWdlRmQpOworICAgIHVubGluayhm
aWxlTmFtZSk7Cit9CisKK3ZvaWQgcHJpbnRJbWFnZURpZmZlcmVuY2VzKEV2YXNfT2JqZWN0KiBi
YXNlbGluZUltYWdlLCBFdmFzX09iamVjdCogYWN0dWFsSW1hZ2UpCit7CisgICAgRXZhc19PYmpl
Y3QqIGRpZmZlcmVuY2VJbWFnZSA9IDA7CisgICAgZmxvYXQgZGlmZmVyZW5jZSA9IGNhbGN1bGF0
ZURpZmZlcmVuY2UoYmFzZWxpbmVJbWFnZSwgYWN0dWFsSW1hZ2UsICZkaWZmZXJlbmNlSW1hZ2Up
OworICAgIGlmIChkaWZmZXJlbmNlID4gMC4wZikgeworICAgICAgICBpZiAoZGlmZmVyZW5jZUlt
YWdlKSB7CisgICAgICAgICAgICBwcmludEltYWdlKGRpZmZlcmVuY2VJbWFnZSk7CisgICAgICAg
ICAgICBldmFzX29iamVjdF9kZWwoZGlmZmVyZW5jZUltYWdlKTsKKyAgICAgICAgfQorICAgICAg
ICBwcmludGYoImRpZmY6ICUwMS4yZiUlIGZhaWxlZFxuIiwgZGlmZmVyZW5jZSk7CisgICAgfSBl
bHNlCisgICAgICAgIHByaW50ZigiZGlmZjogJTAxLjJmJSUgcGFzc2VkXG4iLCBkaWZmZXJlbmNl
KTsKK30KKworRXZhc19PYmplY3QqIHJlYWRJbWFnZUZyb21TdGRpbihFdmFzKiBldmFzLCBsb25n
IGltYWdlU2l6ZSwgaW50ICp3aWR0aCwgaW50ICpoZWlnaHQpCit7CisgICAgRXZhc19PYmplY3Qq
IGltYWdlOworICAgIHVuc2lnbmVkIGNoYXIqIGltYWdlQnVmZmVyOworCisgICAgaW1hZ2VCdWZm
ZXIgPSBzdGF0aWNfY2FzdDx1bnNpZ25lZCBjaGFyICo+KG1hbGxvYyhpbWFnZVNpemUpKTsKKyAg
ICBpZiAoIWltYWdlQnVmZmVyKQorICAgICAgICByZXR1cm4gMDsKKworICAgIGltYWdlID0gZXZh
c19vYmplY3RfaW1hZ2VfZmlsbGVkX2FkZChldmFzKTsKKyAgICBzaXplX3QgYnl0ZXNSZWFkID0g
ZnJlYWQoaW1hZ2VCdWZmZXIsIDEsIGltYWdlU2l6ZSwgc3RkaW4pOworICAgIGlmIChieXRlc1Jl
YWQgPiAwKQorICAgICAgICBldmFzX29iamVjdF9pbWFnZV9tZW1maWxlX3NldChpbWFnZSwgaW1h
Z2VCdWZmZXIsIGJ5dGVzUmVhZCwgMCwgMCk7CisgICAgZWxzZSB7CisgICAgICAgIGZyZWUoaW1h
Z2VCdWZmZXIpOworICAgICAgICBldmFzX29iamVjdF9kZWwoaW1hZ2UpOworICAgICAgICByZXR1
cm4gMDsKKyAgICB9CisgICAgZnJlZShpbWFnZUJ1ZmZlcik7CisKKyAgICBldmFzX29iamVjdF9p
bWFnZV9zaXplX2dldChpbWFnZSwgd2lkdGgsIGhlaWdodCk7CisgICAgcmV0dXJuIGltYWdlOwor
fQorCitib29sIHBhcnNlQ29tbWFuZExpbmVPcHRpb25zKGludCBhcmdjLCBjaGFyKiogYXJndikK
K3sKKyAgICBzdGF0aWMgY29uc3Qgb3B0aW9uIG9wdGlvbnNbXSA9IHsKKyAgICAgICAgeyAidG9s
ZXJhbmNlIiwgcmVxdWlyZWRfYXJndW1lbnQsIDAsICd0JyB9LAorICAgICAgICB7IDAsIDAsIDAs
IDAgfQorICAgIH07CisgICAgaW50IG9wdGlvbjsKKworICAgIHdoaWxlICgob3B0aW9uID0gZ2V0
b3B0X2xvbmcoYXJnYywgKGNoYXIqIGNvbnN0Kilhcmd2LCAidDoiLCBvcHRpb25zLCAwKSkgIT0g
LTEpIHsKKyAgICAgICAgc3dpdGNoIChvcHRpb24pIHsKKyAgICAgICAgY2FzZSAndCc6CisgICAg
ICAgICAgICB0b2xlcmFuY2UgPSBhdG9mKG9wdGFyZyk7CisgICAgICAgICAgICBicmVhazsKKyAg
ICAgICAgY2FzZSAnPyc6CisgICAgICAgIGNhc2UgJzonOgorICAgICAgICAgICAgcmV0dXJuIGZh
bHNlOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIHRydWU7Cit9CisKK2ludCBtYWlu
KGludCBhcmdjLCBjaGFyKiBhcmd2W10pCit7CisgICAgRXZhc19PYmplY3QqIGFjdHVhbEltYWdl
ID0gMDsKKyAgICBFdmFzX09iamVjdCogYmFzZWxpbmVJbWFnZSA9IDA7CisgICAgRWNvcmVfRXZh
cyogZWNvcmVFdmFzID0gMDsKKyAgICBFdmFzKiBldmFzID0gMDsKKyAgICBjaGFyIGJ1ZmZlclsy
MDQ4XTsKKyAgICBpbnQgcmV0dXJuVmFsdWUgPSAwOworICAgIGludCBidWZmZXJXaWR0aCA9IDE7
CisgICAgaW50IGJ1ZmZlckhlaWdodCA9IDE7CisKKyAgICBpZiAoIXBhcnNlQ29tbWFuZExpbmVP
cHRpb25zKGFyZ2MsIGFyZ3YpKQorICAgICAgICByZXR1cm4gMTsKKworICAgIGV2YXNfaW5pdCgp
OworICAgIGVjb3JlX2luaXQoKTsKKyAgICBlY29yZV9ldmFzX2luaXQoKTsKKyAgICAKKyAgICBl
Y29yZUV2YXMgPSBlY29yZV9ldmFzX2J1ZmZlcl9uZXcoYnVmZmVyV2lkdGgsIGJ1ZmZlckhlaWdo
dCk7CisgICAgZXZhcyA9IGVjb3JlX2V2YXNfZ2V0KGVjb3JlRXZhcyk7CisgICAgaWYgKCFldmFz
KSB7CisgICAgICAgIHByaW50ZigiRXJyb3IsIGNvdWxkbid0IGNyZWF0ZSBlY29yZSBldmFzIGJ1
ZmZlci5cbiIpOworICAgICAgICByZXR1cm5WYWx1ZSA9IDE7CisgICAgICAgIGdvdG8gc2h1dGRv
d247CisgICAgfQorCisgICAgd2hpbGUgKGZnZXRzKGJ1ZmZlciwgc2l6ZW9mKGJ1ZmZlciksIHN0
ZGluKSkgeworICAgICAgICBjaGFyKiBuZXdMaW5lQ2hhcmFjdGVyID0gc3RyY2hyKGJ1ZmZlciwg
J1xuJyk7CisgICAgICAgIGlmIChuZXdMaW5lQ2hhcmFjdGVyKQorICAgICAgICAgICAgKm5ld0xp
bmVDaGFyYWN0ZXIgPSAnXDAnOworCisgICAgICAgIGlmICghc3RybmNtcCgiQ29udGVudC1MZW5n
dGg6ICIsIGJ1ZmZlciwgMTYpKSB7CisgICAgICAgICAgICBsb25nIGltYWdlU2l6ZTsKKyAgICAg
ICAgICAgIGludCB3aWR0aCwgaGVpZ2h0OworCisgICAgICAgICAgICBpZiAoc3NjYW5mKGJ1ZmZl
ciwgIkNvbnRlbnQtTGVuZ3RoOiAlbGQiLCAmaW1hZ2VTaXplKSAhPSAxKSB7CisgICAgICAgICAg
ICAgICAgcHJpbnRmKCJFcnJvciwgaW1hZ2Ugc2l6ZSBtdXN0IGJlIHNwZWNpZmllZC5cbiIpOwor
ICAgICAgICAgICAgICAgIHJldHVyblZhbHVlID0gMTsKKyAgICAgICAgICAgICAgICBnb3RvIHNo
dXRkb3duOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGltYWdlU2l6ZSA+IDApIHsK
KyAgICAgICAgICAgICAgICBpZiAoIWFjdHVhbEltYWdlKSB7CisgICAgICAgICAgICAgICAgICAg
IGlmICghKGFjdHVhbEltYWdlID0gcmVhZEltYWdlRnJvbVN0ZGluKGV2YXMsIGltYWdlU2l6ZSwg
JndpZHRoLCAmaGVpZ2h0KSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ZigiRXJy
b3IsIGNvdWxkIG5vdCByZWFkIGFjdHVhbCBpbWFnZS5cbiIpOworICAgICAgICAgICAgICAgICAg
ICAgICAgcmV0dXJuVmFsdWUgPSAxOworICAgICAgICAgICAgICAgICAgICAgICAgZ290byBzaHV0
ZG93bjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAod2lk
dGggPiBidWZmZXJXaWR0aCkKKyAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlcldpZHRoID0g
d2lkdGg7CisgICAgICAgICAgICAgICAgICAgIGlmIChoZWlnaHQgPiBidWZmZXJIZWlnaHQpCisg
ICAgICAgICAgICAgICAgICAgICAgICBidWZmZXJXaWR0aCA9IHdpZHRoOworICAgICAgICAgICAg
ICAgICAgICBlY29yZV9ldmFzX3Jlc2l6ZShlY29yZUV2YXMsIGJ1ZmZlcldpZHRoLCBidWZmZXJI
ZWlnaHQpOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIWJhc2VsaW5lSW1hZ2UpIHsKKyAg
ICAgICAgICAgICAgICAgICAgaWYgKCEoYmFzZWxpbmVJbWFnZSA9IHJlYWRJbWFnZUZyb21TdGRp
bihldmFzLCBpbWFnZVNpemUsICZ3aWR0aCwgJmhlaWdodCkpKSB7CisgICAgICAgICAgICAgICAg
ICAgICAgICBwcmludGYoIkVycm9yLCBjb3VsZCBub3QgcmVhZCBiYXNlbGluZSBpbWFnZS5cbiIp
OworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuVmFsdWUgPSAxOworICAgICAgICAgICAg
ICAgICAgICAgICAgZ290byBzaHV0ZG93bjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAg
ICAgICAgICAgICAgICBpZiAod2lkdGggPiBidWZmZXJXaWR0aCkKKyAgICAgICAgICAgICAgICAg
ICAgICAgIGJ1ZmZlcldpZHRoID0gd2lkdGg7CisgICAgICAgICAgICAgICAgICAgIGlmIChoZWln
aHQgPiBidWZmZXJIZWlnaHQpCisgICAgICAgICAgICAgICAgICAgICAgICBidWZmZXJXaWR0aCA9
IHdpZHRoOworICAgICAgICAgICAgICAgICAgICBlY29yZV9ldmFzX3Jlc2l6ZShlY29yZUV2YXMs
IGJ1ZmZlcldpZHRoLCBidWZmZXJIZWlnaHQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAg
ICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcHJpbnRmKCJFcnJvciwgaW1hZ2Ugc2l6ZSBt
dXN0IGJlIHNwZWNpZmllZC5cbiIpOworICAgICAgICAgICAgICAgIHJldHVyblZhbHVlID0gMTsK
KyAgICAgICAgICAgICAgICBnb3RvIHNodXRkb3duOworICAgICAgICAgICAgfQorICAgICAgICB9
CisKKyAgICAgICAgaWYgKGFjdHVhbEltYWdlICYmIGJhc2VsaW5lSW1hZ2UpIHsKKyAgICAgICAg
ICAgIHByaW50SW1hZ2VEaWZmZXJlbmNlcyhiYXNlbGluZUltYWdlLCBhY3R1YWxJbWFnZSk7Cisg
ICAgICAgICAgICBldmFzX29iamVjdF9kZWwoYWN0dWFsSW1hZ2UpOworICAgICAgICAgICAgZXZh
c19vYmplY3RfZGVsKGJhc2VsaW5lSW1hZ2UpOworICAgICAgICAgICAgYWN0dWFsSW1hZ2UgPSAw
OworICAgICAgICAgICAgYmFzZWxpbmVJbWFnZSA9IDA7CisgICAgICAgIH0KKworICAgICAgICBm
Zmx1c2goc3Rkb3V0KTsKKyAgICB9CisKK3NodXRkb3duOgorICAgIGlmIChlY29yZUV2YXMpCisg
ICAgICAgIGVjb3JlX2V2YXNfZnJlZShlY29yZUV2YXMpOworICAgIGVjb3JlX2V2YXNfc2h1dGRv
d24oKTsKKyAgICBlY29yZV9zaHV0ZG93bigpOworICAgIGV2YXNfc2h1dGRvd24oKTsKKworICAg
IHJldHVybiByZXR1cm5WYWx1ZTsKK30K
</data>
<flag name="review"
          id="89347"
          type_id="1"
          status="-"
          setter="eric"
    />
          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>97460</attachid>
            <date>2011-06-16 10:41:25 -0700</date>
            <delta_ts>2011-06-17 13:09:24 -0700</delta_ts>
            <desc>ImageDiff, take 2</desc>
            <filename>imagediff-take2.diff</filename>
            <type>text/plain</type>
            <size>13645</size>
            <attacher name="Raphael Kubo da Costa (:rakuco)">rakuco</attacher>
            
              <data encoding="base64">SW5kZXg6IFRvb2xzL0NoYW5nZUxvZwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBUb29scy9DaGFuZ2VMb2cJKHJl
dmlzaW9uIDg5MDM5KQorKysgVG9vbHMvQ2hhbmdlTG9nCSh3b3JraW5nIGNvcHkpCkBAIC0xLDMg
KzEsMjkgQEAKKzIwMTEtMDYtMTYgIExlYW5kcm8gUGVyZWlyYSAgPGxlYW5kcm9AcHJvZnVzaW9u
Lm1vYmk+CisKKyAgICAgICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChPT1BTISkuCisKKyAgICAgICAg
W0VGTF0gQWRkIEltYWdlRGlmZiBpbXBsZW1lbnRhdGlvbi4KKyAgICAgICAgQnVpbGQgc3lzdGVt
IGNoYW5nZXMgd2lsbCBiZSBtYWRlIGFzIHNvb24gYXMgdGhlIGNvbXBsZXRlCisgICAgICAgIER1
bXBSZW5kZXJUcmVlIGltcGxlbWVudGF0aW9uIGlzIHVwc3RyZWFtZWQuCisgICAgICAgIGh0dHBz
Oi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD02MTk0MgorCisgICAgICAgICogRHVt
cFJlbmRlclRyZWUvZWZsOiBBZGRlZC4KKyAgICAgICAgKiBEdW1wUmVuZGVyVHJlZS9lZmwvSW1h
Z2VEaWZmLmNwcDogQWRkZWQuCisgICAgICAgIChkaWZmZXJlbmNlSW1hZ2VGcm9tRGlmZmVyZW5j
ZUJ1ZmZlcik6CisgICAgICAgIChjYWxjdWxhdGVEaWZmZXJlbmNlKToKKyAgICAgICAgKGdldFRl
bXBvcmFyeUZpbGUpOgorICAgICAgICAocHJpbnRJbWFnZSk6CisgICAgICAgIChwcmludEltYWdl
RGlmZmVyZW5jZXMpOgorICAgICAgICAocmVhZEltYWdlRnJvbVN0ZGluKToKKyAgICAgICAgKHBh
cnNlQ29tbWFuZExpbmVPcHRpb25zKToKKyAgICAgICAgKHJlc2l6ZUVjb3JlRXZhc0lmTmVlZGVk
KToKKyAgICAgICAgKHNodXRkb3duRWZsKToKKyAgICAgICAgKGFib3J0V2l0aEVycm9yTWVzc2Fn
ZSk6CisgICAgICAgIChpbml0RWZsKToKKyAgICAgICAgKHJlYWRJbWFnZUZyb21TdGRpbklmRW1w
dHkpOgorICAgICAgICAocHJpbnREaWZmZXJlbmNlc0FuZENsZWFudXApOgorICAgICAgICAobWFp
bik6CisKIDIwMTEtMDYtMTYgIFRvbW15IFdpZGVuZmx5Y2h0ICA8dG9tbXl3QGdvb2dsZS5jb20+
CiAKICAgICAgICAgUmV2aWV3ZWQgYnkgVG9ueSBHZW50aWxjb3JlLgpJbmRleDogVG9vbHMvRHVt
cFJlbmRlclRyZWUvZWZsL0ltYWdlRGlmZi5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gVG9vbHMvRHVtcFJl
bmRlclRyZWUvZWZsL0ltYWdlRGlmZi5jcHAJKHJldmlzaW9uIDApCisrKyBUb29scy9EdW1wUmVu
ZGVyVHJlZS9lZmwvSW1hZ2VEaWZmLmNwcAkocmV2aXNpb24gMCkKQEAgLTAsMCArMSwzNDEgQEAK
Ky8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgWmFuIERvYmVyc2VrIDx6YW5kb2JlcnNla0BnbWFp
bC5jb20+CisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgSWdhbGlhIFMuTC4KKyAqIENvcHlyaWdodCAo
QykgMjAxMSBQcm9GVVNJT04gRW1iZWRkZWQgU3lzdGVtcworICogQ29weXJpZ2h0IChDKSAyMDEx
IFNhbXN1bmcgRWxlY3Ryb25pY3MKKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNv
dXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwg
YXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICog
YXJlIG1ldDoKKyAqCisgKiAxLiAgUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3Qg
cmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBj
b25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiAgUmVkaXN0cmli
dXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQK
KyAqICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5n
IGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0
ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuICBOZWl0aGVyIHRo
ZSBuYW1lIG9mIEFwcGxlIENvbXB1dGVyLCBJbmMuICgiQXBwbGUiKSBub3IgdGhlIG5hbWVzIG9m
CisgKiAgICAgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21v
dGUgcHJvZHVjdHMgZGVyaXZlZAorICogICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNw
ZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElT
IFBST1ZJREVEIEJZIEFQUExFIEFORCBJVFMgQ09OVFJJQlVUT1JTICJBUyBJUyIgQU5EIEFOWQor
ICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1J
VEVEIFRPLCBUSEUgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5E
IEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQorICogRElTQ0xBSU1FRC4gSU4g
Tk8gRVZFTlQgU0hBTEwgQVBQTEUgT1IgSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFO
WQorICogRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBP
UiBDT05TRVFVRU5USUFMIERBTUFHRVMKKyAqIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBU
TywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAqIExPU1Mg
T0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VW
RVIgQ0FVU0VEIEFORAorICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4g
Q09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElH
RU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgor
ICogVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBT
VUNIIERBTUFHRS4KKyAqLworCisjaW5jbHVkZSAiY29uZmlnLmgiCisKKyNpbmNsdWRlIDxFY29y
ZS5oPgorI2luY2x1ZGUgPEVjb3JlX0V2YXMuaD4KKyNpbmNsdWRlIDxFdmFzLmg+CisjaW5jbHVk
ZSA8YWxnb3JpdGhtPgorI2luY2x1ZGUgPGNtYXRoPgorI2luY2x1ZGUgPGNzdGRpbz4KKyNpbmNs
dWRlIDxjc3RkbGliPgorI2luY2x1ZGUgPGdldG9wdC5oPgorI2luY2x1ZGUgPHN5cy9zdGF0Lmg+
CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8
d3RmL093bkFycmF5UHRyLmg+CisKK3N0YXRpYyBFY29yZV9FdmFzKiBlY29yZUV2YXMgPSAwOwor
c3RhdGljIGRvdWJsZSB0b2xlcmFuY2UgPSAwOworCitzdGF0aWMgdm9pZCBhYm9ydFdpdGhFcnJv
ck1lc3NhZ2UoY29uc3QgY2hhciogZXJyb3JNZXNzYWdlKTsKKworc3RhdGljIEV2YXNfT2JqZWN0
KiBkaWZmZXJlbmNlSW1hZ2VGcm9tRGlmZmVyZW5jZUJ1ZmZlcihFdmFzKiBldmFzLCB1bnNpZ25l
ZCBjaGFyKiBidWZmZXIsIGludCB3aWR0aCwgaW50IGhlaWdodCkKK3sKKyAgICBFdmFzX09iamVj
dCogaW1hZ2UgPSBldmFzX29iamVjdF9pbWFnZV9maWxsZWRfYWRkKGV2YXMpOworICAgIGlmICgh
aW1hZ2UpCisgICAgICAgIGFib3J0V2l0aEVycm9yTWVzc2FnZSgiY291bGQgbm90IGNyZWF0ZSBk
aWZmZXJlbmNlIGltYWdlIik7CisKKyAgICBldmFzX29iamVjdF9pbWFnZV9zaXplX3NldChpbWFn
ZSwgd2lkdGgsIGhlaWdodCk7CisgICAgZXZhc19vYmplY3RfaW1hZ2VfY29sb3JzcGFjZV9zZXQo
aW1hZ2UsIEVWQVNfQ09MT1JTUEFDRV9BUkdCODg4OCk7CisKKyAgICB1bnNpZ25lZCBjaGFyKiBk
aWZmUGl4ZWxzID0gc3RhdGljX2Nhc3Q8dW5zaWduZWQgY2hhcio+KGV2YXNfb2JqZWN0X2ltYWdl
X2RhdGFfZ2V0KGltYWdlLCBFSU5BX1RSVUUpKTsKKyAgICBjb25zdCBpbnQgcm93U3RyaWRlID0g
ZXZhc19vYmplY3RfaW1hZ2Vfc3RyaWRlX2dldChpbWFnZSk7CisgICAgZm9yIChpbnQgeCA9IDA7
IHggPCB3aWR0aDsgeCsrKSB7CisgICAgICAgIGZvciAoaW50IHkgPSAwOyB5IDwgaGVpZ2h0OyB5
KyspIHsKKyAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIqIGRpZmZQaXhlbCA9IGRpZmZQaXhlbHMg
KyAoeSAqIHJvd1N0cmlkZSkgKyAoeCAqIDQpOworICAgICAgICAgICAgZGlmZlBpeGVsWzBdID0g
ZGlmZlBpeGVsWzFdID0gZGlmZlBpeGVsWzJdID0gKmJ1ZmZlcisrOworICAgICAgICAgICAgZGlm
ZlBpeGVsWzNdID0gMHhmZjsgLy8gQWxwaGEgY2hhbm5lbAorICAgICAgICB9CisgICAgfQorCisg
ICAgcmV0dXJuIGltYWdlOworfQorCitzdGF0aWMgZmxvYXQgY2FsY3VsYXRlRGlmZmVyZW5jZShF
dmFzX09iamVjdCogYmFzZWxpbmVJbWFnZSwgRXZhc19PYmplY3QqIGFjdHVhbEltYWdlLCBFdmFz
X09iamVjdCoqIGRpZmZlcmVuY2VJbWFnZSkKK3sKKyAgICBpbnQgd2lkdGgsIGhlaWdodCwgYmFz
ZWxpbmVXaWR0aCwgYmFzZWxpbmVIZWlnaHQ7CisgICAgZXZhc19vYmplY3RfaW1hZ2Vfc2l6ZV9n
ZXQoYWN0dWFsSW1hZ2UsICZ3aWR0aCwgJmhlaWdodCk7CisgICAgZXZhc19vYmplY3RfaW1hZ2Vf
c2l6ZV9nZXQoYmFzZWxpbmVJbWFnZSwgJmJhc2VsaW5lV2lkdGgsICZiYXNlbGluZUhlaWdodCk7
CisKKyAgICBpZiAod2lkdGggIT0gYmFzZWxpbmVXaWR0aAorICAgICAgICB8fCBoZWlnaHQgIT0g
YmFzZWxpbmVIZWlnaHQKKyAgICAgICAgfHwgZXZhc19vYmplY3RfaW1hZ2VfYWxwaGFfZ2V0KGFj
dHVhbEltYWdlKSAhPSBldmFzX29iamVjdF9pbWFnZV9hbHBoYV9nZXQoYmFzZWxpbmVJbWFnZSkp
IHsKKyAgICAgICAgcHJpbnRmKCJFcnJvciwgdGVzdCBhbmQgcmVmZXJlbmNlIGltYWdlIGhhdmUg
ZGlmZmVyZW50IHByb3BlcnRpZXMuXG4iKTsKKyAgICAgICAgcmV0dXJuIDEwMDsgLy8gQ29tcGxl
dGVseSBkaWZmZXJlbnQuCisgICAgfQorCisgICAgZXZhc19vYmplY3RfaW1hZ2VfY29sb3JzcGFj
ZV9zZXQoYWN0dWFsSW1hZ2UsIEVWQVNfQ09MT1JTUEFDRV9BUkdCODg4OCk7CisgICAgZXZhc19v
YmplY3RfaW1hZ2VfY29sb3JzcGFjZV9zZXQoYmFzZWxpbmVJbWFnZSwgRVZBU19DT0xPUlNQQUNF
X0FSR0I4ODg4KTsKKworICAgIE93bkFycmF5UHRyPHVuc2lnbmVkIGNoYXI+IGRpZmZCdWZmZXIg
PSBhZG9wdEFycmF5UHRyKG5ldyB1bnNpZ25lZCBjaGFyW3dpZHRoICogaGVpZ2h0XSk7CisgICAg
aWYgKCFkaWZmQnVmZmVyKQorICAgICAgICBhYm9ydFdpdGhFcnJvck1lc3NhZ2UoImNvdWxkIG5v
dCBjcmVhdGUgZGlmZmVyZW5jZSBidWZmZXIiKTsKKworICAgIGNvbnN0IGludCBudW1iZXJPZkNo
YW5uZWxzID0gNDsgLy8gQWxwaGEgKyBSICsgRyArIEIKKyAgICBjb25zdCBpbnQgYWN0dWFsUm93
U3RyaWRlID0gZXZhc19vYmplY3RfaW1hZ2Vfc3RyaWRlX2dldChhY3R1YWxJbWFnZSk7CisgICAg
Y29uc3QgaW50IGJhc2VSb3dTdHJpZGUgPSBldmFzX29iamVjdF9pbWFnZV9zdHJpZGVfZ2V0KGJh
c2VsaW5lSW1hZ2UpOworICAgIGZsb2F0IGNvdW50ID0gMDsKKyAgICBmbG9hdCBzdW0gPSAwOwor
ICAgIGZsb2F0IG1heERpc3RhbmNlID0gMDsKKyAgICB1bnNpZ25lZCBjaGFyKiBhY3R1YWxQaXhl
bHMgPSBzdGF0aWNfY2FzdDx1bnNpZ25lZCBjaGFyKj4oZXZhc19vYmplY3RfaW1hZ2VfZGF0YV9n
ZXQoYWN0dWFsSW1hZ2UsIEVJTkFfRkFMU0UpKTsKKyAgICB1bnNpZ25lZCBjaGFyKiBiYXNlUGl4
ZWxzID0gc3RhdGljX2Nhc3Q8dW5zaWduZWQgY2hhcio+KGV2YXNfb2JqZWN0X2ltYWdlX2RhdGFf
Z2V0KGJhc2VsaW5lSW1hZ2UsIEVJTkFfRkFMU0UpKTsKKyAgICB1bnNpZ25lZCBjaGFyKiBjdXJy
ZW50RGlmZlBpeGVsID0gZGlmZkJ1ZmZlci5nZXQoKTsKKworICAgIGZvciAoaW50IHggPSAwOyB4
IDwgd2lkdGg7IHgrKykgeworICAgICAgICBmb3IgKGludCB5ID0gMDsgeSA8IGhlaWdodDsgeSsr
KSB7CisgICAgICAgICAgICB1bnNpZ25lZCBjaGFyKiBhY3R1YWxQaXhlbCA9IGFjdHVhbFBpeGVs
cyArICh5ICogYWN0dWFsUm93U3RyaWRlKSArICh4ICogbnVtYmVyT2ZDaGFubmVscyk7CisgICAg
ICAgICAgICB1bnNpZ25lZCBjaGFyKiBiYXNlUGl4ZWwgPSBiYXNlUGl4ZWxzICsgKHkgKiBiYXNl
Um93U3RyaWRlKSArICh4ICogbnVtYmVyT2ZDaGFubmVscyk7CisKKyAgICAgICAgICAgIGZsb2F0
IHJlZCA9IChhY3R1YWxQaXhlbFswXSAtIGJhc2VQaXhlbFswXSkgLyBzdGQ6Om1heDxmbG9hdD4o
MjU1IC0gYmFzZVBpeGVsWzBdLCBiYXNlUGl4ZWxbMF0pOworICAgICAgICAgICAgZmxvYXQgZ3Jl
ZW4gPSAoYWN0dWFsUGl4ZWxbMV0gLSBiYXNlUGl4ZWxbMV0pIC8gc3RkOjptYXg8ZmxvYXQ+KDI1
NSAtIGJhc2VQaXhlbFsxXSwgYmFzZVBpeGVsWzFdKTsKKyAgICAgICAgICAgIGZsb2F0IGJsdWUg
PSAoYWN0dWFsUGl4ZWxbMl0gLSBiYXNlUGl4ZWxbMl0pIC8gc3RkOjptYXg8ZmxvYXQ+KDI1NSAt
IGJhc2VQaXhlbFsyXSwgYmFzZVBpeGVsWzJdKTsKKyAgICAgICAgICAgIGZsb2F0IGFscGhhID0g
KGFjdHVhbFBpeGVsWzNdIC0gYmFzZVBpeGVsWzNdKSAvIHN0ZDo6bWF4PGZsb2F0PigyNTUgLSBi
YXNlUGl4ZWxbM10sIGJhc2VQaXhlbFszXSk7CisgICAgICAgICAgICBmbG9hdCBkaXN0YW5jZSA9
IHNxcnRmKHJlZCAqIHJlZCArIGdyZWVuICogZ3JlZW4gKyBibHVlICogYmx1ZSArIGFscGhhICog
YWxwaGEpIC8gMi4wZjsKKworICAgICAgICAgICAgKmN1cnJlbnREaWZmUGl4ZWwrKyA9IHN0YXRp
Y19jYXN0PHVuc2lnbmVkIGNoYXI+KGRpc3RhbmNlICogMjU1LjBmKTsKKworICAgICAgICAgICAg
aWYgKGRpc3RhbmNlID49IDEuMGYgLyAyNTUuMGYpIHsKKyAgICAgICAgICAgICAgICBjb3VudCAr
PSAxLjBmOworICAgICAgICAgICAgICAgIHN1bSArPSBkaXN0YW5jZTsKKyAgICAgICAgICAgICAg
ICBtYXhEaXN0YW5jZSA9IHN0ZDo6bWF4PGZsb2F0PihtYXhEaXN0YW5jZSwgZGlzdGFuY2UpOwor
ICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLy8gQ29tcHV0ZSB0aGUgZGlm
ZmVyZW5jZSBhcyBhIHBlcmNlbnRhZ2UgY29tYmluaW5nIGJvdGggdGhlIG51bWJlciBvZgorICAg
IC8vIGRpZmZlcmVudCBwaXhlbHMgYW5kIHRoZWlyIGRpZmZlcmVuY2UgYW1vdW50IGkuZS4gdGhl
IGF2ZXJhZ2UgZGlzdGFuY2UKKyAgICAvLyBvdmVyIHRoZSBlbnRpcmUgaW1hZ2UKKyAgICBmbG9h
dCBkaWZmZXJlbmNlID0gMDsKKyAgICBpZiAoY291bnQgPiAwLjBmKQorICAgICAgICBkaWZmZXJl
bmNlID0gMTAwLjBmICogc3VtIC8gKGhlaWdodCAqIHdpZHRoKTsKKyAgICBpZiAoZGlmZmVyZW5j
ZSA8PSB0b2xlcmFuY2UpCisgICAgICAgIGRpZmZlcmVuY2UgPSAwOworICAgIGVsc2UgeworICAg
ICAgICBkaWZmZXJlbmNlID0gcm91bmRmKGRpZmZlcmVuY2UgKiAxMDAuMGYpIC8gMTAwLjBmOwor
ICAgICAgICBkaWZmZXJlbmNlID0gc3RkOjptYXgoZGlmZmVyZW5jZSwgMC4wMWYpOyAvLyByb3Vu
ZCB0byAyIGRlY2ltYWwgcGxhY2VzCisgICAgICAgICpkaWZmZXJlbmNlSW1hZ2UgPSBkaWZmZXJl
bmNlSW1hZ2VGcm9tRGlmZmVyZW5jZUJ1ZmZlcihldmFzX29iamVjdF9ldmFzX2dldChiYXNlbGlu
ZUltYWdlKSwgZGlmZkJ1ZmZlci5nZXQoKSwgd2lkdGgsIGhlaWdodCk7CisgICAgfQorCisgICAg
cmV0dXJuIGRpZmZlcmVuY2U7Cit9CisKK3N0YXRpYyBpbnQgZ2V0VGVtcG9yYXJ5RmlsZShjaGFy
ICpmaWxlTmFtZSwgc2l6ZV90IGZpbGVOYW1lTGVuZ3RoKQoreworICAgIGlmIChnZXRlbnYoIlRN
UERJUiIpKQorICAgICAgICBzbnByaW50ZihmaWxlTmFtZSwgZmlsZU5hbWVMZW5ndGgsICIlcy9J
bWFnZURpZmZYWFhYWFgucG5nIiwgZ2V0ZW52KCJUTVBESVIiKSk7CisgICAgZWxzZSBpZiAoZ2V0
ZW52KCJURU1QIikpCisgICAgICAgIHNucHJpbnRmKGZpbGVOYW1lLCBmaWxlTmFtZUxlbmd0aCwg
IiVzL0ltYWdlRGlmZlhYWFhYWC5wbmciLCBnZXRlbnYoIlRFTVAiKSk7CisgICAgZWxzZSB7Cisj
aWYgX19saW51eF9fCisgICAgICAgIHN0cmNweShmaWxlTmFtZSwgIi9kZXYvc2htL0ltYWdlRGlm
ZlhYWFhYWC5wbmciKTsKKyAgICAgICAgaW50IGZpbGVEZXNjcmlwdG9yID0gbWtzdGVtcHMoZmls
ZU5hbWUsIHNpemVvZigiLnBuZyIpIC0gMSk7CisgICAgICAgIGlmIChmaWxlRGVzY3JpcHRvciA+
PSAwKQorICAgICAgICAgICAgcmV0dXJuIGZpbGVEZXNjcmlwdG9yOworI2VuZGlmIC8vIF9fbGlu
dXhfXworCisgICAgICAgIHN0cmNweShmaWxlTmFtZSwgIkltYWdlRGlmZlhYWFhYWC5wbmciKTsK
KyAgICB9CisKKyAgICByZXR1cm4gbWtzdGVtcHMoZmlsZU5hbWUsIHNpemVvZigiLnBuZyIpIC0g
MSk7Cit9CisKK3N0YXRpYyB2b2lkIHByaW50SW1hZ2UoRXZhc19PYmplY3QqIGltYWdlKQorewor
ICAgIGNoYXIgZmlsZU5hbWVbUEFUSF9NQVhdOworCisgICAgY29uc3QgaW50IHRlbXBJbWFnZUZk
ID0gZ2V0VGVtcG9yYXJ5RmlsZShmaWxlTmFtZSwgUEFUSF9NQVgpOworICAgIGlmICh0ZW1wSW1h
Z2VGZCA9PSAtMSkKKyAgICAgICAgYWJvcnRXaXRoRXJyb3JNZXNzYWdlKCJjb3VsZCBub3QgY3Jl
YXRlIHRlbXBvcmFyeSBmaWxlIik7CisKKyAgICBpZiAoZXZhc19vYmplY3RfaW1hZ2Vfc2F2ZShp
bWFnZSwgZmlsZU5hbWUsIDAsIDApKSB7CisgICAgICAgIHN0cnVjdCBzdGF0IGZpbGVJbmZvOwor
ICAgICAgICBpZiAoIXN0YXQoZmlsZU5hbWUsICZmaWxlSW5mbykpIHsKKyAgICAgICAgICAgIHBy
aW50ZigiQ29udGVudC1MZW5ndGg6ICVsZFxuIiwgZmlsZUluZm8uc3Rfc2l6ZSk7CisgICAgICAg
ICAgICBmZmx1c2goc3Rkb3V0KTsKKworICAgICAgICAgICAgdW5zaWduZWQgY2hhciBidWZmZXJb
MjA0OF07CisgICAgICAgICAgICBzc2l6ZV90IGJ5dGVzUmVhZDsKKyAgICAgICAgICAgIHdoaWxl
ICgoYnl0ZXNSZWFkID0gcmVhZCh0ZW1wSW1hZ2VGZCwgYnVmZmVyLCBzaXplb2YoYnVmZmVyKSkp
ID4gMCkKKyAgICAgICAgICAgICAgICB3cml0ZSgxLCBidWZmZXIsIGJ5dGVzUmVhZCk7CisgICAg
ICAgIH0KKyAgICB9CisgICAgY2xvc2UodGVtcEltYWdlRmQpOworICAgIHVubGluayhmaWxlTmFt
ZSk7Cit9CisKK3N0YXRpYyB2b2lkIHByaW50SW1hZ2VEaWZmZXJlbmNlcyhFdmFzX09iamVjdCog
YmFzZWxpbmVJbWFnZSwgRXZhc19PYmplY3QqIGFjdHVhbEltYWdlKQoreworICAgIEV2YXNfT2Jq
ZWN0KiBkaWZmZXJlbmNlSW1hZ2UgPSAwOworICAgIGZsb2F0IGRpZmZlcmVuY2UgPSBjYWxjdWxh
dGVEaWZmZXJlbmNlKGJhc2VsaW5lSW1hZ2UsIGFjdHVhbEltYWdlLCAmZGlmZmVyZW5jZUltYWdl
KTsKKyAgICBpZiAoZGlmZmVyZW5jZSA+IDAuMGYpIHsKKyAgICAgICAgaWYgKGRpZmZlcmVuY2VJ
bWFnZSkgeworICAgICAgICAgICAgcHJpbnRJbWFnZShkaWZmZXJlbmNlSW1hZ2UpOworICAgICAg
ICAgICAgZXZhc19vYmplY3RfZGVsKGRpZmZlcmVuY2VJbWFnZSk7CisgICAgICAgIH0KKyAgICAg
ICAgcHJpbnRmKCJkaWZmOiAlMDEuMmYlJSBmYWlsZWRcbiIsIGRpZmZlcmVuY2UpOworICAgIH0g
ZWxzZQorICAgICAgICBwcmludGYoImRpZmY6ICUwMS4yZiUlIHBhc3NlZFxuIiwgZGlmZmVyZW5j
ZSk7Cit9CisKK3N0YXRpYyBFdmFzX09iamVjdCogcmVhZEltYWdlRnJvbVN0ZGluKEV2YXMqIGV2
YXMsIGxvbmcgaW1hZ2VTaXplLCBpbnQgKndpZHRoLCBpbnQgKmhlaWdodCkKK3sKKyAgICBPd25B
cnJheVB0cjx1bnNpZ25lZCBjaGFyPiBpbWFnZUJ1ZmZlciA9IGFkb3B0QXJyYXlQdHIobmV3IHVu
c2lnbmVkIGNoYXJbaW1hZ2VTaXplXSk7CisgICAgaWYgKCFpbWFnZUJ1ZmZlcikKKyAgICAgICAg
YWJvcnRXaXRoRXJyb3JNZXNzYWdlKCJjYW5ub3QgYWxsb2NhdGUgaW1hZ2UiKTsKKworICAgIEV2
YXNfT2JqZWN0KiBpbWFnZSA9IGV2YXNfb2JqZWN0X2ltYWdlX2ZpbGxlZF9hZGQoZXZhcyk7Cisg
ICAgY29uc3Qgc2l6ZV90IGJ5dGVzUmVhZCA9IGZyZWFkKGltYWdlQnVmZmVyLmdldCgpLCAxLCBp
bWFnZVNpemUsIHN0ZGluKTsKKyAgICBpZiAoYnl0ZXNSZWFkID4gMCkKKyAgICAgICAgZXZhc19v
YmplY3RfaW1hZ2VfbWVtZmlsZV9zZXQoaW1hZ2UsIGltYWdlQnVmZmVyLmdldCgpLCBieXRlc1Jl
YWQsIDAsIDApOworICAgIGVsc2UgeworICAgICAgICBldmFzX29iamVjdF9kZWwoaW1hZ2UpOwor
ICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBldmFzX29iamVjdF9pbWFnZV9zaXplX2dl
dChpbWFnZSwgd2lkdGgsIGhlaWdodCk7CisgICAgcmV0dXJuIGltYWdlOworfQorCitzdGF0aWMg
Ym9vbCBwYXJzZUNvbW1hbmRMaW5lT3B0aW9ucyhpbnQgYXJnYywgY2hhcioqIGFyZ3YpCit7Cisg
ICAgc3RhdGljIGNvbnN0IG9wdGlvbiBvcHRpb25zW10gPSB7CisgICAgICAgIHsgInRvbGVyYW5j
ZSIsIHJlcXVpcmVkX2FyZ3VtZW50LCAwLCAndCcgfSwKKyAgICAgICAgeyAwLCAwLCAwLCAwIH0K
KyAgICB9OworICAgIGludCBvcHRpb247CisKKyAgICB3aGlsZSAoKG9wdGlvbiA9IGdldG9wdF9s
b25nKGFyZ2MsIChjaGFyKiBjb25zdCopYXJndiwgInQ6Iiwgb3B0aW9ucywgMCkpICE9IC0xKSB7
CisgICAgICAgIHN3aXRjaCAob3B0aW9uKSB7CisgICAgICAgIGNhc2UgJ3QnOgorICAgICAgICAg
ICAgdG9sZXJhbmNlID0gYXRvZihvcHRhcmcpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAg
IGNhc2UgJz8nOgorICAgICAgICBjYXNlICc6JzoKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsK
KyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiB0cnVlOworfQorCitzdGF0aWMgdm9pZCBy
ZXNpemVFY29yZUV2YXNJZk5lZWRlZChpbnQgbmV3V2lkdGgsIGludCBuZXdIZWlnaHQpCit7Cisg
ICAgaW50IGN1cnJlbnRXaWR0aCwgY3VycmVudEhlaWdodDsKKyAgICBlY29yZV9ldmFzX3NjcmVl
bl9nZW9tZXRyeV9nZXQoZWNvcmVFdmFzLCAwLCAwLCAmY3VycmVudFdpZHRoLCAmY3VycmVudEhl
aWdodCk7CisgICAgaWYgKG5ld1dpZHRoID4gY3VycmVudFdpZHRoKQorICAgICAgICBjdXJyZW50
V2lkdGggPSBuZXdXaWR0aDsKKyAgICBpZiAobmV3SGVpZ2h0ID4gY3VycmVudEhlaWdodCkKKyAg
ICAgICAgY3VycmVudEhlaWdodCA9IG5ld0hlaWdodDsKKyAgICBlY29yZV9ldmFzX3Jlc2l6ZShl
Y29yZUV2YXMsIGN1cnJlbnRXaWR0aCwgY3VycmVudEhlaWdodCk7Cit9CisKK3N0YXRpYyB2b2lk
IHNodXRkb3duRWZsKCkKK3sKKyAgICBpZiAoZWNvcmVFdmFzKQorICAgICAgICBlY29yZV9ldmFz
X2ZyZWUoZWNvcmVFdmFzKTsKKyAgICBlY29yZV9ldmFzX3NodXRkb3duKCk7CisgICAgZWNvcmVf
c2h1dGRvd24oKTsKKyAgICBldmFzX3NodXRkb3duKCk7Cit9CisKK3N0YXRpYyB2b2lkIGFib3J0
V2l0aEVycm9yTWVzc2FnZShjb25zdCBjaGFyKiBlcnJvck1lc3NhZ2UpCit7CisgICAgc2h1dGRv
d25FZmwoKTsKKworICAgIHByaW50ZigiRXJyb3IsICVzXG4iLCBlcnJvck1lc3NhZ2UpOworICAg
IGV4aXQoRVhJVF9GQUlMVVJFKTsKK30KKworc3RhdGljIEV2YXMqIGluaXRFZmwoKQoreworICAg
IGV2YXNfaW5pdCgpOworICAgIGVjb3JlX2luaXQoKTsKKyAgICBlY29yZV9ldmFzX2luaXQoKTsK
KworICAgIGVjb3JlRXZhcyA9IGVjb3JlX2V2YXNfYnVmZmVyX25ldygxLCAxKTsKKyAgICBFdmFz
KiBldmFzID0gZWNvcmVfZXZhc19nZXQoZWNvcmVFdmFzKTsKKyAgICBpZiAoIWV2YXMpCisgICAg
ICAgIGFib3J0V2l0aEVycm9yTWVzc2FnZSgiY291bGQgbm90IGNyZWF0ZSBFY29yZV9FdmFzIGJ1
ZmZlciIpOworCisgICAgcmV0dXJuIGV2YXM7Cit9CisKK3N0YXRpYyBib29sIHJlYWRJbWFnZUZy
b21TdGRpbklmRW1wdHkoRXZhcyogZXZhcywgRXZhc19PYmplY3QqKiBpbWFnZSwgbG9uZyBpbWFn
ZVNpemUpCit7CisgICAgRXZhc19PYmplY3QqIG5ld0ltYWdlID0gKmltYWdlOworICAgIGlmICgh
bmV3SW1hZ2UpIHsKKyAgICAgICAgaW50IHdpZHRoLCBoZWlnaHQ7CisgICAgICAgIG5ld0ltYWdl
ID0gcmVhZEltYWdlRnJvbVN0ZGluKGV2YXMsIGltYWdlU2l6ZSwgJndpZHRoLCAmaGVpZ2h0KTsK
KyAgICAgICAgaWYgKCFuZXdJbWFnZSkKKyAgICAgICAgICAgIGFib3J0V2l0aEVycm9yTWVzc2Fn
ZSgiY291bGQgbm90IHJlYWQgaW1hZ2UgZnJvbSBzdGFuZGFyZCBpbnB1dCIpOworCisgICAgICAg
IHJlc2l6ZUVjb3JlRXZhc0lmTmVlZGVkKHdpZHRoLCBoZWlnaHQpOworCisgICAgICAgICppbWFn
ZSA9IG5ld0ltYWdlOworCisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIHJldHVy
biBmYWxzZTsKK30KKworc3RhdGljIHZvaWQgcHJpbnREaWZmZXJlbmNlc0FuZENsZWFudXAoRXZh
c19PYmplY3QqKiBhY3R1YWxJbWFnZSwgRXZhc19PYmplY3QqKiBiYXNlbGluZUltYWdlKQorewor
ICAgIHByaW50SW1hZ2VEaWZmZXJlbmNlcygqYmFzZWxpbmVJbWFnZSwgKmFjdHVhbEltYWdlKTsK
KyAgICBldmFzX29iamVjdF9kZWwoKmFjdHVhbEltYWdlKTsKKyAgICBldmFzX29iamVjdF9kZWwo
KmJhc2VsaW5lSW1hZ2UpOworICAgICphY3R1YWxJbWFnZSA9IDA7CisgICAgKmJhc2VsaW5lSW1h
Z2UgPSAwOworfQorCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciogYXJndltdKQoreworICAgIGlm
ICghcGFyc2VDb21tYW5kTGluZU9wdGlvbnMoYXJnYywgYXJndikpCisgICAgICAgIHJldHVybiAx
OworCisgICAgRXZhcyogZXZhcyA9IGluaXRFZmwoKTsKKyAgICBFdmFzX09iamVjdCogYWN0dWFs
SW1hZ2UgPSAwOworICAgIEV2YXNfT2JqZWN0KiBiYXNlbGluZUltYWdlID0gMDsKKyAgICBjaGFy
IGJ1ZmZlclsyMDQ4XTsKKyAgICB3aGlsZSAoZmdldHMoYnVmZmVyLCBzaXplb2YoYnVmZmVyKSwg
c3RkaW4pKSB7CisgICAgICAgIGNoYXIqIGNvbnRlbnRMZW5ndGhTdGFydCA9IHN0cnN0cihidWZm
ZXIsICJDb250ZW50LUxlbmd0aDogIik7CisgICAgICAgIGlmICghY29udGVudExlbmd0aFN0YXJ0
KQorICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIGxvbmcgaW1hZ2VTaXplOworICAgICAg
ICBpZiAoc3NjYW5mKGNvbnRlbnRMZW5ndGhTdGFydCwgIkNvbnRlbnQtTGVuZ3RoOiAlbGQiLCAm
aW1hZ2VTaXplKSA9PSAxKSB7CisgICAgICAgICAgICBpZiAoaW1hZ2VTaXplIDw9IDApCisgICAg
ICAgICAgICAgICAgYWJvcnRXaXRoRXJyb3JNZXNzYWdlKCJpbWFnZSBzaXplIG11c3QgYmUgc3Bl
Y2lmaWVkIik7CisKKyAgICAgICAgICAgIGlmIChyZWFkSW1hZ2VGcm9tU3RkaW5JZkVtcHR5KGV2
YXMsICZhY3R1YWxJbWFnZSwgaW1hZ2VTaXplKSkKKyAgICAgICAgICAgICAgICBjb250aW51ZTsK
KworICAgICAgICAgICAgaWYgKHJlYWRJbWFnZUZyb21TdGRpbklmRW1wdHkoZXZhcywgJmJhc2Vs
aW5lSW1hZ2UsIGltYWdlU2l6ZSkpCisgICAgICAgICAgICAgICAgcHJpbnREaWZmZXJlbmNlc0Fu
ZENsZWFudXAoJmFjdHVhbEltYWdlLCAmYmFzZWxpbmVJbWFnZSk7CisgICAgICAgIH0KKworICAg
ICAgICBmZmx1c2goc3Rkb3V0KTsKKyAgICB9CisKKyAgICBzaHV0ZG93bkVmbCgpOworICAgIHJl
dHVybiBFWElUX1NVQ0NFU1M7Cit9Cg==
</data>

          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>97642</attachid>
            <date>2011-06-17 13:09:31 -0700</date>
            <delta_ts>2011-06-17 14:56:51 -0700</delta_ts>
            <desc>Patch</desc>
            <filename>bug-61942-20110617170929.patch</filename>
            <type>text/plain</type>
            <size>13709</size>
            <attacher name="Leandro Pereira">leandro</attacher>
            
              <data encoding="base64">SW5kZXg6IFRvb2xzL0NoYW5nZUxvZwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBUb29scy9DaGFuZ2VMb2cJKHJl
dmlzaW9uIDg5MTYzKQorKysgVG9vbHMvQ2hhbmdlTG9nCSh3b3JraW5nIGNvcHkpCkBAIC0xLDMg
KzEsMzAgQEAKKzIwMTEtMDYtMTcgIExlYW5kcm8gUGVyZWlyYSAgPGxlYW5kcm9AcHJvZnVzaW9u
Lm1vYmk+CisKKyAgICAgICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChPT1BTISkuCisKKyAgICAgICAg
W0VGTF0gQWRkIEV2YXMtYmFzZWQgSW1hZ2VEaWZmIGltcGxlbWVudGF0aW9uLgorICAgICAgICBo
dHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NjE5NDIKKworICAgICAgICBC
dWlsZCBzeXN0ZW0gY2hhbmdlcyB3aWxsIGJlIHBlcmZvcm1lZCBhcyBzb29uIGFzIHRoZSBjb21w
bGV0ZQorICAgICAgICBEdW1wUmVuZGVyVHJlZSBpbXBsZW1lbnRhdGlvbiBpcyB1cHN0cmVhbWVk
LgorCisgICAgICAgICogRHVtcFJlbmRlclRyZWUvZWZsL0ltYWdlRGlmZi5jcHA6IEFkZGVkLgor
ICAgICAgICAocGl4ZWxGcm9tSW1hZ2VEYXRhKToKKyAgICAgICAgKGRpZmZlcmVuY2VJbWFnZUZy
b21EaWZmZXJlbmNlQnVmZmVyKToKKyAgICAgICAgKGNvbXB1dGVEaXN0YW5jZUJldHdlZW5QaXhl
bENvbXBvbmVudHMpOgorICAgICAgICAoY2FsY3VsYXRlUGl4ZWxEaWZmZXJlbmNlKToKKyAgICAg
ICAgKGNhbGN1bGF0ZURpZmZlcmVuY2UpOgorICAgICAgICAoZ2V0VGVtcG9yYXJ5RmlsZSk6Cisg
ICAgICAgIChwcmludEltYWdlKToKKyAgICAgICAgKHByaW50SW1hZ2VEaWZmZXJlbmNlcyk6Cisg
ICAgICAgIChyZXNpemVFY29yZUV2YXNJZk5lZWRlZCk6CisgICAgICAgIChyZWFkSW1hZ2VGcm9t
U3RkaW4pOgorICAgICAgICAocGFyc2VDb21tYW5kTGluZU9wdGlvbnMpOgorICAgICAgICAoc2h1
dGRvd25FZmwpOgorICAgICAgICAoYWJvcnRXaXRoRXJyb3JNZXNzYWdlKToKKyAgICAgICAgKGlu
aXRFZmwpOgorICAgICAgICAobWFpbik6CisKIDIwMTEtMDUtMjUgIEJyZW50IEZ1bGdoYW0gIDxi
ZnVsZ2hhbUB3ZWJraXQub3JnPgogCiAgICAgICAgIFJldmlld2VkIGJ5IEJyaWFuIFdlaW5zdGVp
bi4KSW5kZXg6IFRvb2xzL0R1bXBSZW5kZXJUcmVlL2VmbC9JbWFnZURpZmYuY3BwCj09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT0KLS0tIFRvb2xzL0R1bXBSZW5kZXJUcmVlL2VmbC9JbWFnZURpZmYuY3BwCShyZXZpc2lvbiAw
KQorKysgVG9vbHMvRHVtcFJlbmRlclRyZWUvZWZsL0ltYWdlRGlmZi5jcHAJKHJldmlzaW9uIDAp
CkBAIC0wLDAgKzEsMzQ4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA5IFphbiBEb2JlcnNl
ayA8emFuZG9iZXJzZWtAZ21haWwuY29tPgorICogQ29weXJpZ2h0IChDKSAyMDEwIElnYWxpYSBT
LkwuCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEgUHJvRlVTSU9OIEVtYmVkZGVkIFN5c3RlbXMKKyAq
IENvcHlyaWdodCAoQykgMjAxMSBTYW1zdW5nIEVsZWN0cm9uaWNzCisgKgorICogUmVkaXN0cmli
dXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0
CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93
aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKgorICogMS4gIFJlZGlzdHJpYnV0aW9ucyBv
ZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgbm90
aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVy
LgorICogMi4gIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0
aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9u
cyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgIGRvY3VtZW50YXRp
b24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24u
CisgKiAzLiAgTmVpdGhlciB0aGUgbmFtZSBvZiBBcHBsZSBDb21wdXRlciwgSW5jLiAoIkFwcGxl
Iikgbm9yIHRoZSBuYW1lcyBvZgorICogICAgIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQg
dG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAqICAgICBmcm9tIHRoaXMg
c29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgor
ICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBBTkQgSVRTIENPTlRSSUJVVE9S
UyAiQVMgSVMiIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNM
VURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0Yg
TUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUK
KyAqIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIE9SIElUUyBDT05UUklCVVRP
UlMgQkUgTElBQkxFIEZPUiBBTlkKKyAqIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQ
RUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCisgKiAoSU5DTFVESU5H
LCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1Ig
U0VSVklDRVM7CisgKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1Mg
SU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKKyAqIE9OIEFOWSBUSEVPUlkgT0YgTElB
QklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisg
KiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkg
T1VUIE9GIFRIRSBVU0UgT0YKKyAqIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBU
SEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2luY2x1ZGUgImNvbmZpZy5o
IgorCisjaW5jbHVkZSA8RWNvcmUuaD4KKyNpbmNsdWRlIDxFY29yZV9FdmFzLmg+CisjaW5jbHVk
ZSA8RXZhcy5oPgorI2luY2x1ZGUgPGFsZ29yaXRobT4KKyNpbmNsdWRlIDxjbWF0aD4KKyNpbmNs
dWRlIDxjc3RkaW8+CisjaW5jbHVkZSA8Y3N0ZGxpYj4KKyNpbmNsdWRlIDxnZXRvcHQuaD4KKyNp
bmNsdWRlIDxzeXMvc3RhdC5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHVu
aXN0ZC5oPgorI2luY2x1ZGUgPHd0Zi9Pd25BcnJheVB0ci5oPgorI2luY2x1ZGUgPHd0Zi9Pd25Q
dHIuaD4KKyNpbmNsdWRlIDx3dGYvUGFzc093blB0ci5oPgorCitlbnVtIFBpeGVsQ29tcG9uZW50
IHsKKyAgICBSZWQsCisgICAgR3JlZW4sCisgICAgQmx1ZSwKKyAgICBBbHBoYQorfTsKKworc3Rh
dGljIE93blB0cjxFY29yZV9FdmFzPiBnRWNvcmVFdmFzOworc3RhdGljIGRvdWJsZSBnVG9sZXJh
bmNlID0gMDsKKworc3RhdGljIHZvaWQgYWJvcnRXaXRoRXJyb3JNZXNzYWdlKGNvbnN0IGNoYXIq
IGVycm9yTWVzc2FnZSk7CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyKiBwaXhlbEZyb21JbWFnZURh
dGEodW5zaWduZWQgY2hhciogaW1hZ2VEYXRhLCBpbnQgcm93U3RyaWRlLCBpbnQgeCwgaW50IHkp
Cit7CisgICAgcmV0dXJuIGltYWdlRGF0YSArICh5ICogcm93U3RyaWRlKSArICh4IDw8IDIpOwor
fQorCitzdGF0aWMgRXZhc19PYmplY3QqIGRpZmZlcmVuY2VJbWFnZUZyb21EaWZmZXJlbmNlQnVm
ZmVyKEV2YXMqIGV2YXMsIHVuc2lnbmVkIGNoYXIqIGJ1ZmZlciwgaW50IHdpZHRoLCBpbnQgaGVp
Z2h0KQoreworICAgIEV2YXNfT2JqZWN0KiBpbWFnZSA9IGV2YXNfb2JqZWN0X2ltYWdlX2ZpbGxl
ZF9hZGQoZXZhcyk7CisgICAgaWYgKCFpbWFnZSkKKyAgICAgICAgYWJvcnRXaXRoRXJyb3JNZXNz
YWdlKCJjb3VsZCBub3QgY3JlYXRlIGRpZmZlcmVuY2UgaW1hZ2UiKTsKKworICAgIGV2YXNfb2Jq
ZWN0X2ltYWdlX3NpemVfc2V0KGltYWdlLCB3aWR0aCwgaGVpZ2h0KTsKKyAgICBldmFzX29iamVj
dF9pbWFnZV9jb2xvcnNwYWNlX3NldChpbWFnZSwgRVZBU19DT0xPUlNQQUNFX0FSR0I4ODg4KTsK
KworICAgIHVuc2lnbmVkIGNoYXIqIGRpZmZQaXhlbHMgPSBzdGF0aWNfY2FzdDx1bnNpZ25lZCBj
aGFyKj4oZXZhc19vYmplY3RfaW1hZ2VfZGF0YV9nZXQoaW1hZ2UsIEVJTkFfVFJVRSkpOworICAg
IGNvbnN0IGludCByb3dTdHJpZGUgPSBldmFzX29iamVjdF9pbWFnZV9zdHJpZGVfZ2V0KGltYWdl
KTsKKyAgICBmb3IgKGludCB4ID0gMDsgeCA8IHdpZHRoOyB4KyspIHsKKyAgICAgICAgZm9yIChp
bnQgeSA9IDA7IHkgPCBoZWlnaHQ7IHkrKykgeworICAgICAgICAgICAgdW5zaWduZWQgY2hhciog
ZGlmZlBpeGVsID0gcGl4ZWxGcm9tSW1hZ2VEYXRhKGRpZmZQaXhlbHMsIHJvd1N0cmlkZSwgeCwg
eSk7CisgICAgICAgICAgICBkaWZmUGl4ZWxbUmVkXSA9IGRpZmZQaXhlbFtHcmVlbl0gPSBkaWZm
UGl4ZWxbQmx1ZV0gPSAqYnVmZmVyKys7CisgICAgICAgICAgICBkaWZmUGl4ZWxbQWxwaGFdID0g
MHhmZjsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBpbWFnZTsKK30KKworc3RhdGlj
IGZsb2F0IGNvbXB1dGVEaXN0YW5jZUJldHdlZW5QaXhlbENvbXBvbmVudHModW5zaWduZWQgY2hh
ciBhY3R1YWxDb21wb25lbnQsIHVuc2lnbmVkIGNoYXIgYmFzZUNvbXBvbmVudCkKK3sKKyAgICBy
ZXR1cm4gKGFjdHVhbENvbXBvbmVudCAtIGJhc2VDb21wb25lbnQpIC8gc3RkOjptYXg8ZmxvYXQ+
KDI1NSAtIGJhc2VDb21wb25lbnQsIGJhc2VDb21wb25lbnQpOworfQorCitzdGF0aWMgZmxvYXQg
Y29tcHV0ZURpc3RhbmNlQmV0d2VlblBpeGVsQ29tcG9uZW50cyh1bnNpZ25lZCBjaGFyKiBhY3R1
YWxQaXhlbCwgdW5zaWduZWQgY2hhciogYmFzZVBpeGVsLCBQaXhlbENvbXBvbmVudCBjb21wb25l
bnQpCit7CisgICAgcmV0dXJuIGNvbXB1dGVEaXN0YW5jZUJldHdlZW5QaXhlbENvbXBvbmVudHMo
YWN0dWFsUGl4ZWxbY29tcG9uZW50XSwgYmFzZVBpeGVsW2NvbXBvbmVudF0pOworfQorCitzdGF0
aWMgZmxvYXQgY2FsY3VsYXRlUGl4ZWxEaWZmZXJlbmNlKHVuc2lnbmVkIGNoYXIqIGJhc2VQaXhl
bCwgdW5zaWduZWQgY2hhciogYWN0dWFsUGl4ZWwpCit7CisgICAgY29uc3QgZmxvYXQgcmVkID0g
Y29tcHV0ZURpc3RhbmNlQmV0d2VlblBpeGVsQ29tcG9uZW50cyhhY3R1YWxQaXhlbCwgYmFzZVBp
eGVsLCBSZWQpOworICAgIGNvbnN0IGZsb2F0IGdyZWVuID0gY29tcHV0ZURpc3RhbmNlQmV0d2Vl
blBpeGVsQ29tcG9uZW50cyhhY3R1YWxQaXhlbCwgYmFzZVBpeGVsLCBHcmVlbik7CisgICAgY29u
c3QgZmxvYXQgYmx1ZSA9IGNvbXB1dGVEaXN0YW5jZUJldHdlZW5QaXhlbENvbXBvbmVudHMoYWN0
dWFsUGl4ZWwsIGJhc2VQaXhlbCwgQmx1ZSk7CisgICAgY29uc3QgZmxvYXQgYWxwaGEgPSBjb21w
dXRlRGlzdGFuY2VCZXR3ZWVuUGl4ZWxDb21wb25lbnRzKGFjdHVhbFBpeGVsLCBiYXNlUGl4ZWws
IEFscGhhKTsKKyAgICByZXR1cm4gc3FydGYocmVkICogcmVkICsgZ3JlZW4gKiBncmVlbiArIGJs
dWUgKiBibHVlICsgYWxwaGEgKiBhbHBoYSkgLyAyLjBmOworfQorCitzdGF0aWMgZmxvYXQgY2Fs
Y3VsYXRlRGlmZmVyZW5jZShjb25zdCBFdmFzX09iamVjdCogYmFzZWxpbmVJbWFnZSwgY29uc3Qg
RXZhc19PYmplY3QqIGFjdHVhbEltYWdlLCBPd25QdHI8RXZhc19PYmplY3Q+JiBkaWZmZXJlbmNl
SW1hZ2UpCit7CisgICAgaW50IHdpZHRoLCBoZWlnaHQsIGJhc2VsaW5lV2lkdGgsIGJhc2VsaW5l
SGVpZ2h0OworICAgIGV2YXNfb2JqZWN0X2ltYWdlX3NpemVfZ2V0KGFjdHVhbEltYWdlLCAmd2lk
dGgsICZoZWlnaHQpOworICAgIGV2YXNfb2JqZWN0X2ltYWdlX3NpemVfZ2V0KGJhc2VsaW5lSW1h
Z2UsICZiYXNlbGluZVdpZHRoLCAmYmFzZWxpbmVIZWlnaHQpOworCisgICAgaWYgKHdpZHRoICE9
IGJhc2VsaW5lV2lkdGggfHwgaGVpZ2h0ICE9IGJhc2VsaW5lSGVpZ2h0KSB7CisgICAgICAgIHBy
aW50ZigiRXJyb3IsIHRlc3QgYW5kIHJlZmVyZW5jZSBpbWFnZSBoYXZlIGRpZmZlcmVudCBzaXpl
cy5cbiIpOworICAgICAgICByZXR1cm4gMTAwOyAvLyBDb21wbGV0ZWx5IGRpZmZlcmVudC4KKyAg
ICB9CisKKyAgICBPd25BcnJheVB0cjx1bnNpZ25lZCBjaGFyPiBkaWZmQnVmZmVyID0gYWRvcHRB
cnJheVB0cihuZXcgdW5zaWduZWQgY2hhclt3aWR0aCAqIGhlaWdodF0pOworICAgIGlmICghZGlm
ZkJ1ZmZlcikKKyAgICAgICAgYWJvcnRXaXRoRXJyb3JNZXNzYWdlKCJjb3VsZCBub3QgY3JlYXRl
IGRpZmZlcmVuY2UgYnVmZmVyIik7CisKKyAgICBjb25zdCBpbnQgYWN0dWFsUm93U3RyaWRlID0g
ZXZhc19vYmplY3RfaW1hZ2Vfc3RyaWRlX2dldChhY3R1YWxJbWFnZSk7CisgICAgY29uc3QgaW50
IGJhc2VSb3dTdHJpZGUgPSBldmFzX29iamVjdF9pbWFnZV9zdHJpZGVfZ2V0KGJhc2VsaW5lSW1h
Z2UpOworICAgIHVuc2lnbmVkIG51bWJlck9mRGlmZmVyZW50UGl4ZWxzID0gMDsKKyAgICBmbG9h
dCB0b3RhbERpc3RhbmNlID0gMDsKKyAgICBmbG9hdCBtYXhEaXN0YW5jZSA9IDA7CisgICAgdW5z
aWduZWQgY2hhciogYWN0dWFsUGl4ZWxzID0gc3RhdGljX2Nhc3Q8dW5zaWduZWQgY2hhcio+KGV2
YXNfb2JqZWN0X2ltYWdlX2RhdGFfZ2V0KGFjdHVhbEltYWdlLCBFSU5BX0ZBTFNFKSk7CisgICAg
dW5zaWduZWQgY2hhciogYmFzZVBpeGVscyA9IHN0YXRpY19jYXN0PHVuc2lnbmVkIGNoYXIqPihl
dmFzX29iamVjdF9pbWFnZV9kYXRhX2dldChiYXNlbGluZUltYWdlLCBFSU5BX0ZBTFNFKSk7Cisg
ICAgdW5zaWduZWQgY2hhciogY3VycmVudERpZmZQaXhlbCA9IGRpZmZCdWZmZXIuZ2V0KCk7CisK
KyAgICBmb3IgKGludCB4ID0gMDsgeCA8IHdpZHRoOyB4KyspIHsKKyAgICAgICAgZm9yIChpbnQg
eSA9IDA7IHkgPCBoZWlnaHQ7IHkrKykgeworICAgICAgICAgICAgdW5zaWduZWQgY2hhciogYWN0
dWFsUGl4ZWwgPSBwaXhlbEZyb21JbWFnZURhdGEoYWN0dWFsUGl4ZWxzLCBhY3R1YWxSb3dTdHJp
ZGUsIHgsIHkpOworICAgICAgICAgICAgdW5zaWduZWQgY2hhciogYmFzZVBpeGVsID0gcGl4ZWxG
cm9tSW1hZ2VEYXRhKGJhc2VQaXhlbHMsIGJhc2VSb3dTdHJpZGUsIHgsIHkpOworCisgICAgICAg
ICAgICBjb25zdCBmbG9hdCBkaXN0YW5jZSA9IGNhbGN1bGF0ZVBpeGVsRGlmZmVyZW5jZShiYXNl
UGl4ZWwsIGFjdHVhbFBpeGVsKTsKKyAgICAgICAgICAgICpjdXJyZW50RGlmZlBpeGVsKysgPSBz
dGF0aWNfY2FzdDx1bnNpZ25lZCBjaGFyPihkaXN0YW5jZSAqIDI1NS4wZik7CisKKyAgICAgICAg
ICAgIGlmIChkaXN0YW5jZSA+PSAxLjBmIC8gMjU1LjBmKSB7CisgICAgICAgICAgICAgICAgKytu
dW1iZXJPZkRpZmZlcmVudFBpeGVsczsKKyAgICAgICAgICAgICAgICB0b3RhbERpc3RhbmNlICs9
IGRpc3RhbmNlOworICAgICAgICAgICAgICAgIG1heERpc3RhbmNlID0gc3RkOjptYXg8ZmxvYXQ+
KG1heERpc3RhbmNlLCBkaXN0YW5jZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9
CisKKyAgICAvLyBDb21wdXRlIHRoZSBkaWZmZXJlbmNlIGFzIGEgcGVyY2VudGFnZSBjb21iaW5p
bmcgYm90aCB0aGUgbnVtYmVyIG9mCisgICAgLy8gZGlmZmVyZW50IHBpeGVscyBhbmQgdGhlaXIg
ZGlmZmVyZW5jZSBhbW91bnQgaS5lLiB0aGUgYXZlcmFnZSBkaXN0YW5jZQorICAgIC8vIG92ZXIg
dGhlIGVudGlyZSBpbWFnZQorICAgIGZsb2F0IGRpZmZlcmVuY2UgPSAwOworICAgIGlmIChudW1i
ZXJPZkRpZmZlcmVudFBpeGVscykKKyAgICAgICAgZGlmZmVyZW5jZSA9IDEwMC4wZiAqIHRvdGFs
RGlzdGFuY2UgLyAoaGVpZ2h0ICogd2lkdGgpOworICAgIGlmIChkaWZmZXJlbmNlIDw9IGdUb2xl
cmFuY2UpCisgICAgICAgIGRpZmZlcmVuY2UgPSAwOworICAgIGVsc2UgeworICAgICAgICBkaWZm
ZXJlbmNlID0gcm91bmRmKGRpZmZlcmVuY2UgKiAxMDAuMGYpIC8gMTAwLjBmOworICAgICAgICBk
aWZmZXJlbmNlID0gc3RkOjptYXgoZGlmZmVyZW5jZSwgMC4wMWYpOyAvLyByb3VuZCB0byAyIGRl
Y2ltYWwgcGxhY2VzCisKKyAgICAgICAgZGlmZmVyZW5jZUltYWdlID0gYWRvcHRQdHIoZGlmZmVy
ZW5jZUltYWdlRnJvbURpZmZlcmVuY2VCdWZmZXIoZXZhc19vYmplY3RfZXZhc19nZXQoYmFzZWxp
bmVJbWFnZSksIGRpZmZCdWZmZXIuZ2V0KCksIHdpZHRoLCBoZWlnaHQpKTsKKyAgICB9CisKKyAg
ICByZXR1cm4gZGlmZmVyZW5jZTsKK30KKworc3RhdGljIGludCBnZXRUZW1wb3JhcnlGaWxlKGNo
YXIgKmZpbGVOYW1lLCBzaXplX3QgZmlsZU5hbWVMZW5ndGgpCit7CisgICAgY2hhciogdGVtcERp
cmVjdG9yeSA9IGdldGVudigiVE1QRElSIik7CisgICAgaWYgKCF0ZW1wRGlyZWN0b3J5KQorICAg
ICAgICB0ZW1wRGlyZWN0b3J5ID0gZ2V0ZW52KCJURU1QIik7CisKKyAgICBpZiAodGVtcERpcmVj
dG9yeSkKKyAgICAgICAgc25wcmludGYoZmlsZU5hbWUsIGZpbGVOYW1lTGVuZ3RoLCAiJXMvSW1h
Z2VEaWZmWFhYWFhYLnBuZyIsIHRlbXBEaXJlY3RvcnkpOworICAgIGVsc2UgeworI2lmIF9fbGlu
dXhfXworICAgICAgICBzdHJjcHkoZmlsZU5hbWUsICIvZGV2L3NobS9JbWFnZURpZmZYWFhYWFgu
cG5nIik7CisgICAgICAgIGNvbnN0IGludCBmaWxlRGVzY3JpcHRvciA9IG1rc3RlbXBzKGZpbGVO
YW1lLCBzaXplb2YoIi5wbmciKSAtIDEpOworICAgICAgICBpZiAoZmlsZURlc2NyaXB0b3IgPj0g
MCkKKyAgICAgICAgICAgIHJldHVybiBmaWxlRGVzY3JpcHRvcjsKKyNlbmRpZiAvLyBfX2xpbnV4
X18KKworICAgICAgICBzdHJjcHkoZmlsZU5hbWUsICJJbWFnZURpZmZYWFhYWFgucG5nIik7Cisg
ICAgfQorCisgICAgcmV0dXJuIG1rc3RlbXBzKGZpbGVOYW1lLCBzaXplb2YoIi5wbmciKSAtIDEp
OworfQorCitzdGF0aWMgdm9pZCBwcmludEltYWdlKEV2YXNfT2JqZWN0KiBpbWFnZSkKK3sKKyAg
ICBjaGFyIGZpbGVOYW1lW1BBVEhfTUFYXTsKKworICAgIGNvbnN0IGludCB0ZW1wSW1hZ2VGZCA9
IGdldFRlbXBvcmFyeUZpbGUoZmlsZU5hbWUsIFBBVEhfTUFYKTsKKyAgICBpZiAodGVtcEltYWdl
RmQgPT0gLTEpCisgICAgICAgIGFib3J0V2l0aEVycm9yTWVzc2FnZSgiY291bGQgbm90IGNyZWF0
ZSB0ZW1wb3JhcnkgZmlsZSIpOworCisgICAgaWYgKGV2YXNfb2JqZWN0X2ltYWdlX3NhdmUoaW1h
Z2UsIGZpbGVOYW1lLCAwLCAwKSkgeworICAgICAgICBzdHJ1Y3Qgc3RhdCBmaWxlSW5mbzsKKyAg
ICAgICAgaWYgKCFzdGF0KGZpbGVOYW1lLCAmZmlsZUluZm8pKSB7CisgICAgICAgICAgICBwcmlu
dGYoIkNvbnRlbnQtTGVuZ3RoOiAlbGRcbiIsIGZpbGVJbmZvLnN0X3NpemUpOworICAgICAgICAg
ICAgZmZsdXNoKHN0ZG91dCk7CisKKyAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgYnVmZmVyWzIw
NDhdOworICAgICAgICAgICAgc3NpemVfdCBieXRlc1JlYWQ7CisgICAgICAgICAgICB3aGlsZSAo
KGJ5dGVzUmVhZCA9IHJlYWQodGVtcEltYWdlRmQsIGJ1ZmZlciwgc2l6ZW9mKGJ1ZmZlcikpKSA+
IDApCisgICAgICAgICAgICAgICAgd3JpdGUoMSwgYnVmZmVyLCBieXRlc1JlYWQpOworICAgICAg
ICB9CisgICAgfQorICAgIGNsb3NlKHRlbXBJbWFnZUZkKTsKKyAgICB1bmxpbmsoZmlsZU5hbWUp
OworfQorCitzdGF0aWMgdm9pZCBwcmludEltYWdlRGlmZmVyZW5jZXMoY29uc3QgRXZhc19PYmpl
Y3QqIGJhc2VsaW5lSW1hZ2UsIEV2YXNfT2JqZWN0KiBhY3R1YWxJbWFnZSkKK3sKKyAgICBPd25Q
dHI8RXZhc19PYmplY3Q+IGRpZmZlcmVuY2VJbWFnZTsKKyAgICBjb25zdCBmbG9hdCBkaWZmZXJl
bmNlID0gY2FsY3VsYXRlRGlmZmVyZW5jZShiYXNlbGluZUltYWdlLCBhY3R1YWxJbWFnZSwgZGlm
ZmVyZW5jZUltYWdlKTsKKworICAgIGlmIChkaWZmZXJlbmNlID4gMC4wZikgeworICAgICAgICBp
ZiAoZGlmZmVyZW5jZUltYWdlKQorICAgICAgICAgICAgcHJpbnRJbWFnZShkaWZmZXJlbmNlSW1h
Z2UuZ2V0KCkpOworCisgICAgICAgIHByaW50ZigiZGlmZjogJTAxLjJmJSUgZmFpbGVkXG4iLCBk
aWZmZXJlbmNlKTsKKyAgICB9IGVsc2UKKyAgICAgICAgcHJpbnRmKCJkaWZmOiAlMDEuMmYlJSBw
YXNzZWRcbiIsIGRpZmZlcmVuY2UpOworfQorCitzdGF0aWMgdm9pZCByZXNpemVFY29yZUV2YXNJ
Zk5lZWRlZChFdmFzX09iamVjdCogaW1hZ2UpCit7CisgICAgaW50IG5ld1dpZHRoLCBuZXdIZWln
aHQ7CisgICAgZXZhc19vYmplY3RfaW1hZ2Vfc2l6ZV9nZXQoaW1hZ2UsICZuZXdXaWR0aCwgJm5l
d0hlaWdodCk7CisKKyAgICBpbnQgY3VycmVudFdpZHRoLCBjdXJyZW50SGVpZ2h0OworICAgIGVj
b3JlX2V2YXNfc2NyZWVuX2dlb21ldHJ5X2dldChnRWNvcmVFdmFzLmdldCgpLCAwLCAwLCAmY3Vy
cmVudFdpZHRoLCAmY3VycmVudEhlaWdodCk7CisKKyAgICBpZiAobmV3V2lkdGggPiBjdXJyZW50
V2lkdGgpCisgICAgICAgIGN1cnJlbnRXaWR0aCA9IG5ld1dpZHRoOworICAgIGlmIChuZXdIZWln
aHQgPiBjdXJyZW50SGVpZ2h0KQorICAgICAgICBjdXJyZW50SGVpZ2h0ID0gbmV3SGVpZ2h0Owor
CisgICAgZWNvcmVfZXZhc19yZXNpemUoZ0Vjb3JlRXZhcy5nZXQoKSwgY3VycmVudFdpZHRoLCBj
dXJyZW50SGVpZ2h0KTsKK30KKworc3RhdGljIFBhc3NPd25QdHI8RXZhc19PYmplY3Q+IHJlYWRJ
bWFnZUZyb21TdGRpbihFdmFzKiBldmFzLCBsb25nIGltYWdlU2l6ZSkKK3sKKyAgICBPd25BcnJh
eVB0cjx1bnNpZ25lZCBjaGFyPiBpbWFnZUJ1ZmZlciA9IGFkb3B0QXJyYXlQdHIobmV3IHVuc2ln
bmVkIGNoYXJbaW1hZ2VTaXplXSk7CisgICAgaWYgKCFpbWFnZUJ1ZmZlcikKKyAgICAgICAgYWJv
cnRXaXRoRXJyb3JNZXNzYWdlKCJjYW5ub3QgYWxsb2NhdGUgaW1hZ2UiKTsKKworICAgIGNvbnN0
IHNpemVfdCBieXRlc1JlYWQgPSBmcmVhZChpbWFnZUJ1ZmZlci5nZXQoKSwgMSwgaW1hZ2VTaXpl
LCBzdGRpbik7CisgICAgaWYgKCFieXRlc1JlYWQpCisgICAgICAgIHJldHVybiBQYXNzT3duUHRy
PEV2YXNfT2JqZWN0PigpOworCisgICAgRXZhc19PYmplY3QqIGltYWdlID0gZXZhc19vYmplY3Rf
aW1hZ2VfZmlsbGVkX2FkZChldmFzKTsKKyAgICBldmFzX29iamVjdF9pbWFnZV9tZW1maWxlX3Nl
dChpbWFnZSwgaW1hZ2VCdWZmZXIuZ2V0KCksIGJ5dGVzUmVhZCwgMCwgMCk7CisgICAgZXZhc19v
YmplY3RfaW1hZ2VfY29sb3JzcGFjZV9zZXQoaW1hZ2UsIEVWQVNfQ09MT1JTUEFDRV9BUkdCODg4
OCk7CisKKyAgICByZXNpemVFY29yZUV2YXNJZk5lZWRlZChpbWFnZSk7CisKKyAgICByZXR1cm4g
YWRvcHRQdHIoaW1hZ2UpOworfQorCitzdGF0aWMgYm9vbCBwYXJzZUNvbW1hbmRMaW5lT3B0aW9u
cyhpbnQgYXJnYywgY2hhcioqIGFyZ3YpCit7CisgICAgc3RhdGljIGNvbnN0IG9wdGlvbiBvcHRp
b25zW10gPSB7CisgICAgICAgIHsgInRvbGVyYW5jZSIsIHJlcXVpcmVkX2FyZ3VtZW50LCAwLCAn
dCcgfSwKKyAgICAgICAgeyAwLCAwLCAwLCAwIH0KKyAgICB9OworICAgIGludCBvcHRpb247CisK
KyAgICB3aGlsZSAoKG9wdGlvbiA9IGdldG9wdF9sb25nKGFyZ2MsIChjaGFyKiBjb25zdCopYXJn
diwgInQ6Iiwgb3B0aW9ucywgMCkpICE9IC0xKSB7CisgICAgICAgIHN3aXRjaCAob3B0aW9uKSB7
CisgICAgICAgIGNhc2UgJ3QnOgorICAgICAgICAgICAgZ1RvbGVyYW5jZSA9IGF0b2Yob3B0YXJn
KTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlICc/JzoKKyAgICAgICAgY2FzZSAn
Oic6CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBy
ZXR1cm4gdHJ1ZTsKK30KKworc3RhdGljIHZvaWQgc2h1dGRvd25FZmwoKQoreworICAgIGVjb3Jl
X2V2YXNfc2h1dGRvd24oKTsKKyAgICBlY29yZV9zaHV0ZG93bigpOworICAgIGV2YXNfc2h1dGRv
d24oKTsKK30KKworc3RhdGljIHZvaWQgYWJvcnRXaXRoRXJyb3JNZXNzYWdlKGNvbnN0IGNoYXIq
IGVycm9yTWVzc2FnZSkKK3sKKyAgICBzaHV0ZG93bkVmbCgpOworCisgICAgcHJpbnRmKCJFcnJv
ciwgJXMuXG4iLCBlcnJvck1lc3NhZ2UpOworICAgIGV4aXQoRVhJVF9GQUlMVVJFKTsKK30KKwor
c3RhdGljIEV2YXMqIGluaXRFZmwoKQoreworICAgIGV2YXNfaW5pdCgpOworICAgIGVjb3JlX2lu
aXQoKTsKKyAgICBlY29yZV9ldmFzX2luaXQoKTsKKworICAgIGdFY29yZUV2YXMgPSBhZG9wdFB0
cihlY29yZV9ldmFzX2J1ZmZlcl9uZXcoMSwgMSkpOworICAgIEV2YXMqIGV2YXMgPSBlY29yZV9l
dmFzX2dldChnRWNvcmVFdmFzLmdldCgpKTsKKyAgICBpZiAoIWV2YXMpCisgICAgICAgIGFib3J0
V2l0aEVycm9yTWVzc2FnZSgiY291bGQgbm90IGNyZWF0ZSBFY29yZV9FdmFzIGJ1ZmZlciIpOwor
CisgICAgcmV0dXJuIGV2YXM7Cit9CisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyKiBhcmd2W10p
Cit7CisgICAgaWYgKCFwYXJzZUNvbW1hbmRMaW5lT3B0aW9ucyhhcmdjLCBhcmd2KSkKKyAgICAg
ICAgcmV0dXJuIEVYSVRfRkFJTFVSRTsKKworICAgIEV2YXMqIGV2YXMgPSBpbml0RWZsKCk7CisK
KyAgICBPd25QdHI8RXZhc19PYmplY3Q+IGFjdHVhbEltYWdlOworICAgIE93blB0cjxFdmFzX09i
amVjdD4gYmFzZWxpbmVJbWFnZTsKKworICAgIGNoYXIgYnVmZmVyWzIwNDhdOworICAgIHdoaWxl
IChmZ2V0cyhidWZmZXIsIHNpemVvZihidWZmZXIpLCBzdGRpbikpIHsKKyAgICAgICAgY2hhciog
Y29udGVudExlbmd0aFN0YXJ0ID0gc3Ryc3RyKGJ1ZmZlciwgIkNvbnRlbnQtTGVuZ3RoOiAiKTsK
KyAgICAgICAgaWYgKCFjb250ZW50TGVuZ3RoU3RhcnQpCisgICAgICAgICAgICBjb250aW51ZTsK
KyAgICAgICAgbG9uZyBpbWFnZVNpemU7CisgICAgICAgIGlmIChzc2NhbmYoY29udGVudExlbmd0
aFN0YXJ0LCAiQ29udGVudC1MZW5ndGg6ICVsZCIsICZpbWFnZVNpemUpID09IDEpIHsKKyAgICAg
ICAgICAgIGlmIChpbWFnZVNpemUgPD0gMCkKKyAgICAgICAgICAgICAgICBhYm9ydFdpdGhFcnJv
ck1lc3NhZ2UoImltYWdlIHNpemUgbXVzdCBiZSBzcGVjaWZpZWQiKTsKKworICAgICAgICAgICAg
aWYgKCFhY3R1YWxJbWFnZSkKKyAgICAgICAgICAgICAgICBhY3R1YWxJbWFnZSA9IHJlYWRJbWFn
ZUZyb21TdGRpbihldmFzLCBpbWFnZVNpemUpOworICAgICAgICAgICAgZWxzZSBpZiAoIWJhc2Vs
aW5lSW1hZ2UpCisgICAgICAgICAgICAgICAgYmFzZWxpbmVJbWFnZSA9IHJlYWRJbWFnZUZyb21T
dGRpbihldmFzLCBpbWFnZVNpemUpOworICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAg
ICAgcHJpbnRJbWFnZURpZmZlcmVuY2VzKGJhc2VsaW5lSW1hZ2UuZ2V0KCksIGFjdHVhbEltYWdl
LmdldCgpKTsKKworICAgICAgICAgICAgICAgIGFjdHVhbEltYWdlLmNsZWFyKCk7CisgICAgICAg
ICAgICAgICAgYmFzZWxpbmVJbWFnZS5jbGVhcigpOworICAgICAgICAgICAgfQorICAgICAgICB9
CisKKyAgICAgICAgZmZsdXNoKHN0ZG91dCk7CisgICAgfQorCisgICAgc2h1dGRvd25FZmwoKTsK
KyAgICByZXR1cm4gRVhJVF9TVUNDRVNTOworfQo=
</data>

          </attachment>
      

    </bug>

</bugzilla>