<?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>37790</bug_id>
          
          <creation_ts>2010-04-19 00:50:54 -0700</creation_ts>
          <short_desc>[DRT/Chromium] Import Chromium image_diff as ImageDiff</short_desc>
          <delta_ts>2010-04-20 20:32:10 -0700</delta_ts>
          <reporter_accessible>1</reporter_accessible>
          <cclist_accessible>1</cclist_accessible>
          <classification_id>1</classification_id>
          <classification>Unclassified</classification>
          <product>WebKit</product>
          <component>Tools / Tests</component>
          <version>528+ (Nightly build)</version>
          <rep_platform>Other</rep_platform>
          <op_sys>All</op_sys>
          <bug_status>RESOLVED</bug_status>
          <resolution>FIXED</resolution>
          
          
          <bug_file_loc></bug_file_loc>
          <status_whiteboard></status_whiteboard>
          <keywords></keywords>
          <priority>P2</priority>
          <bug_severity>Normal</bug_severity>
          <target_milestone>---</target_milestone>
          
          <blocked>35902</blocked>
          <everconfirmed>1</everconfirmed>
          <reporter name="Kent Tamura">tkent</reporter>
          <assigned_to name="Nobody">webkit-unassigned</assigned_to>
          <cc>commit-queue</cc>
    
    <cc>dglazkov</cc>
    
    <cc>dpranke</cc>
    
    <cc>fishd</cc>
    
    <cc>tony</cc>
    
    <cc>webkit.review.bot</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>213938</commentid>
    <comment_count>0</comment_count>
    <who name="Kent Tamura">tkent</who>
    <bug_when>2010-04-19 00:50:54 -0700</bug_when>
    <thetext>[DRT/Chromium] Import Chromium image_diff as ImageDiff</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>213939</commentid>
    <comment_count>1</comment_count>
      <attachid>53657</attachid>
    <who name="Kent Tamura">tkent</who>
    <bug_when>2010-04-19 00:54:38 -0700</bug_when>
    <thetext>Created attachment 53657
hoge</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>213940</commentid>
    <comment_count>2</comment_count>
    <who name="WebKit Review Bot">webkit.review.bot</who>
    <bug_when>2010-04-19 00:57:33 -0700</bug_when>
    <thetext>Attachment 53657 did not pass style-queue:

Failed to run &quot;WebKitTools/Scripts/check-webkit-style&quot; exit_code: 1
WebKitTools/DumpRenderTree/chromium/ImageDiff.cpp:39:  Found other header before a header this file implements. Should be: config.h, primary header, blank line, and then alphabetically sorted.  [build/include_order] [4]
Total errors found: 1 in 4 files


If any of these errors are false positives, please file a bug against check-webkit-style.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>213946</commentid>
    <comment_count>3</comment_count>
    <who name="Kent Tamura">tkent</who>
    <bug_when>2010-04-19 01:15:09 -0700</bug_when>
    <thetext>(In reply to comment #2)
&gt; Attachment 53657 [details] did not pass style-queue:
&gt; 
&gt; Failed to run &quot;WebKitTools/Scripts/check-webkit-style&quot; exit_code: 1
&gt; WebKitTools/DumpRenderTree/chromium/ImageDiff.cpp:39:  Found other header
&gt; before a header this file implements. Should be: config.h, primary header,
&gt; blank line, and then alphabetically sorted.  [build/include_order] [4]

This style error is ignorable because ImageDiff.cpp doesn&apos;t have the primary header.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>213969</commentid>
    <comment_count>4</comment_count>
    <who name="Tony Chang">tony</who>
    <bug_when>2010-04-19 02:23:31 -0700</bug_when>
    <thetext>In https://bugs.webkit.org/show_bug.cgi?id=37645#c4 , Dirk suggested having a single ImageDiff.  Looking at this more closely, I&apos;m not sure what that means :)

There&apos;s currently an ImageDiff CG and an ImageDiff QT which don&apos;t share any code.  I guess we have to add an ImageDiff for chromium, but I doubt there&apos;s any code to share.

A few questions:

- What is the difference between compareImages and untestedCompareImages?  Should we try to switch to untestedCompareImages so we can be more like the existing ImageDiffs?

- Also, should we add --tolerance as a command line flag like the others?

- I guess we have to include gfx for the pngencoder, I guess that&apos;s ok.  Can we avoid base/basictypes.h?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>214282</commentid>
    <comment_count>5</comment_count>
    <who name="Dirk Pranke">dpranke</who>
    <bug_when>2010-04-19 15:21:33 -0700</bug_when>
    <thetext>(In reply to comment #4)
&gt; In https://bugs.webkit.org/show_bug.cgi?id=37645#c4 , Dirk suggested having a
&gt; single ImageDiff.  Looking at this more closely, I&apos;m not sure what that means
&gt; :)
&gt; 
&gt; There&apos;s currently an ImageDiff CG and an ImageDiff QT which don&apos;t share any
&gt; code.  I guess we have to add an ImageDiff for chromium, but I doubt there&apos;s
&gt; any code to share.
&gt; 

The point was performing an image diff is really a function of the platform run-webkit-tests is executing on, rather than the port being tested. There&apos;s no reason to have two different binaries and code bases on a Mac (or Linux or Windows for that matter).

I think we should just get rid of --tolerance; doing pixel tests that aren&apos;t exact seems like a bad idea to me.

-- Dirk</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>214336</commentid>
    <comment_count>6</comment_count>
    <who name="Tony Chang">tony</who>
    <bug_when>2010-04-19 16:48:41 -0700</bug_when>
    <thetext>(In reply to comment #5)
&gt; (In reply to comment #4)
&gt; &gt; There&apos;s currently an ImageDiff CG and an ImageDiff QT which don&apos;t share any
&gt; &gt; code.  I guess we have to add an ImageDiff for chromium, but I doubt there&apos;s
&gt; &gt; any code to share.
&gt; 
&gt; The point was performing an image diff is really a function of the platform
&gt; run-webkit-tests is executing on, rather than the port being tested. There&apos;s no
&gt; reason to have two different binaries and code bases on a Mac (or Linux or
&gt; Windows for that matter).

We could use the existing ImageDiff CG on mac, since all the dependencies are the same, but on Windows and Linux we would still need our own ImageDiff.  I think adding another one is fine, although it&apos;s a little unfortunate that it&apos;ll be Chromium specific because it uses files from gfx and depends on libpng.

&gt; I think we should just get rid of --tolerance; doing pixel tests that aren&apos;t
&gt; exact seems like a bad idea to me.

That seems like a separate discussion.  Please file a new bug for it.  For now, we should probably try to match the existing behavior of ImageDiff.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>214428</commentid>
    <comment_count>7</comment_count>
    <who name="Dirk Pranke">dpranke</who>
    <bug_when>2010-04-19 18:45:22 -0700</bug_when>
    <thetext>(In reply to comment #6)
&gt; (In reply to comment #5)
&gt; &gt; (In reply to comment #4)
&gt; &gt; &gt; There&apos;s currently an ImageDiff CG and an ImageDiff QT which don&apos;t share any
&gt; &gt; &gt; code.  I guess we have to add an ImageDiff for chromium, but I doubt there&apos;s
&gt; &gt; &gt; any code to share.
&gt; &gt; 
&gt; &gt; The point was performing an image diff is really a function of the platform
&gt; &gt; run-webkit-tests is executing on, rather than the port being tested. There&apos;s no
&gt; &gt; reason to have two different binaries and code bases on a Mac (or Linux or
&gt; &gt; Windows for that matter).
&gt; 
&gt; We could use the existing ImageDiff CG on mac, since all the dependencies are
&gt; the same, but on Windows and Linux we would still need our own ImageDiff.

Of course, there are multiple WebKit ports on both Windows and Linux as well, so a similar point stands.

&gt; think adding another one is fine, although it&apos;s a little unfortunate that it&apos;ll
&gt; be Chromium specific because it uses files from gfx and depends on libpng.
&gt; 
&gt; &gt; I think we should just get rid of --tolerance; doing pixel tests that aren&apos;t
&gt; &gt; exact seems like a bad idea to me.
&gt; 
&gt; That seems like a separate discussion.  Please file a new bug for it.  For now,
&gt; we should probably try to match the existing behavior of ImageDiff.

I wouldn&apos;t want you to spend time implementing a feature that no one uses, though.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>214443</commentid>
    <comment_count>8</comment_count>
    <who name="Tony Chang">tony</who>
    <bug_when>2010-04-19 19:07:42 -0700</bug_when>
    <thetext>(In reply to comment #7)
&gt; (In reply to comment #6)
&gt; &gt; We could use the existing ImageDiff CG on mac, since all the dependencies are
&gt; &gt; the same, but on Windows and Linux we would still need our own ImageDiff.
&gt; 
&gt; Of course, there are multiple WebKit ports on both Windows and Linux as well,
&gt; so a similar point stands.

I don&apos;t understand what you&apos;re suggesting we do.  There are 2 ImageDiffs checked in right now: CG and QT.  If we want to use the CG one for Windows chromium, we would have to grab all the WebKitSupport files used by WebKit/win (I don&apos;t think this is done by update-webkit --chromium).  If we want to use the QT one for Linux chromium, we&apos;d have to install a bunch of QT dev libraries on linux (probably done manually via apt-get on the slaves and all developers).  Are you suggesting we go this route?

I&apos;m suggesting we just check in our own ImageDiff (the one in this patch) to avoid these build dependencies.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>214444</commentid>
    <comment_count>9</comment_count>
    <who name="Kent Tamura">tkent</who>
    <bug_when>2010-04-19 19:14:22 -0700</bug_when>
    <thetext>(In reply to comment #4)
&gt; - What is the difference between compareImages and untestedCompareImages? 
&gt; Should we try to switch to untestedCompareImages so we can be more like the
&gt; existing ImageDiffs?

Actually, I don&apos;t know.  ImageDiff.cpp is almost equivalent to Chromium image_diff.cc.
The code of untestedCompareImages() has been there since the initial commit.
It&apos;s not used for now.  We may remove it.

&gt; - Also, should we add --tolerance as a command line flag like the others?

I don&apos;t think it should be handled in this bug.

&gt; - I guess we have to include gfx for the pngencoder, I guess that&apos;s ok.  Can we
&gt; avoid base/basictypes.h?

It seems we don&apos;t need basictypes.h on Mac.  I&apos;ll update the patch.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>214453</commentid>
    <comment_count>10</comment_count>
      <attachid>53765</attachid>
    <who name="Kent Tamura">tkent</who>
    <bug_when>2010-04-19 19:30:48 -0700</bug_when>
    <thetext>Created attachment 53765
Proposed patch (rev.2)</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>214456</commentid>
    <comment_count>11</comment_count>
    <who name="WebKit Review Bot">webkit.review.bot</who>
    <bug_when>2010-04-19 19:34:59 -0700</bug_when>
    <thetext>Attachment 53765 did not pass style-queue:

Failed to run &quot;WebKitTools/Scripts/check-webkit-style&quot; exit_code: 1
WebKitTools/DumpRenderTree/chromium/ImageDiff.cpp:39:  Found other header before a header this file implements. Should be: config.h, primary header, blank line, and then alphabetically sorted.  [build/include_order] [4]
Total errors found: 1 in 4 files


If any of these errors are false positives, please file a bug against check-webkit-style.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>214469</commentid>
    <comment_count>12</comment_count>
    <who name="Dirk Pranke">dpranke</who>
    <bug_when>2010-04-19 21:21:52 -0700</bug_when>
    <thetext>(In reply to comment #8)
&gt; (In reply to comment #7)
&gt; &gt; (In reply to comment #6)
&gt; &gt; &gt; We could use the existing ImageDiff CG on mac, since all the dependencies are
&gt; &gt; &gt; the same, but on Windows and Linux we would still need our own ImageDiff.
&gt; &gt; 
&gt; &gt; Of course, there are multiple WebKit ports on both Windows and Linux as well,
&gt; &gt; so a similar point stands.
&gt; 
&gt; I don&apos;t understand what you&apos;re suggesting we do.  There are 2 ImageDiffs
&gt; checked in right now: CG and QT.  If we want to use the CG one for Windows
&gt; chromium, we would have to grab all the WebKitSupport files used by WebKit/win
&gt; (I don&apos;t think this is done by update-webkit --chromium).  If we want to use
&gt; the QT one for Linux chromium, we&apos;d have to install a bunch of QT dev libraries
&gt; on linux (probably done manually via apt-get on the slaves and all developers).
&gt;  Are you suggesting we go this route?

Not really. Mostly I was looking for a way for different ports to not have to port ImageDiff into their own framework when there&apos;s really no reason to do so. At one point I suggested that we could probably code this in Python using the Python Imaging Library and get a single portable implementation that way, but I&apos;m not sure if that would really be any better.

If the ports aren&apos;t using common libraries like libpng then maybe there&apos;s nothing really to be gained. It just seems silly to have to duplicate them every time.

-- Dirk</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>214700</commentid>
    <comment_count>13</comment_count>
      <attachid>53765</attachid>
    <who name="Dimitri Glazkov (Google)">dglazkov</who>
    <bug_when>2010-04-20 09:13:33 -0700</bug_when>
    <thetext>Comment on attachment 53765
Proposed patch (rev.2)

ok. Let&apos;s file a but about unifying ImageDiff across ports.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>215119</commentid>
    <comment_count>14</comment_count>
      <attachid>53765</attachid>
    <who name="Kent Tamura">tkent</who>
    <bug_when>2010-04-20 20:32:00 -0700</bug_when>
    <thetext>Comment on attachment 53765
Proposed patch (rev.2)

Clearing flags on attachment: 53765

Committed r57947: &lt;http://trac.webkit.org/changeset/57947&gt;</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>215120</commentid>
    <comment_count>15</comment_count>
    <who name="Kent Tamura">tkent</who>
    <bug_when>2010-04-20 20:32:10 -0700</bug_when>
    <thetext>All reviewed patches have been landed.  Closing bug.</thetext>
  </long_desc>
      
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>53657</attachid>
            <date>2010-04-19 00:54:38 -0700</date>
            <delta_ts>2010-04-19 19:30:40 -0700</delta_ts>
            <desc>hoge</desc>
            <filename>bug-37790-20100419165435.patch</filename>
            <type>text/plain</type>
            <size>17387</size>
            <attacher name="Kent Tamura">tkent</attacher>
            
              <data encoding="base64">ZGlmZiAtLWdpdCBhL1dlYktpdFRvb2xzL0NoYW5nZUxvZyBiL1dlYktpdFRvb2xzL0NoYW5nZUxv
ZwppbmRleCA0MWJhZTgzLi43ZDRiMDE4IDEwMDY0NAotLS0gYS9XZWJLaXRUb29scy9DaGFuZ2VM
b2cKKysrIGIvV2ViS2l0VG9vbHMvQ2hhbmdlTG9nCkBAIC0xLDMgKzEsMTYgQEAKKzIwMTAtMDQt
MTkgIEtlbnQgVGFtdXJhICA8dGtlbnRAY2hyb21pdW0ub3JnPgorCisgICAgICAgIFJldmlld2Vk
IGJ5IE5PQk9EWSAoT09QUyEpLgorCisgICAgICAgIFtEUlQvQ2hyb21pdW1dIEltcG9ydCBDaHJv
bWl1bSBpbWFnZV9kaWZmIGFzIEltYWdlRGlmZgorICAgICAgICBodHRwczovL2J1Z3Mud2Via2l0
Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9Mzc3OTAKKworICAgICAgICBJbWFnZURpZmYuY3BwIGlzIGJh
c2VkIG9uIHRvb2xzL2ltYWdlZGlmZi9pbWFnZV9kaWZmLmNjIHI0MTkxMSBvZiBDaHJvbWl1bS4K
KworICAgICAgICAqIER1bXBSZW5kZXJUcmVlL0R1bXBSZW5kZXJUcmVlLmd5cC9EdW1wUmVuZGVy
VHJlZS5neXA6CisgICAgICAgICogRHVtcFJlbmRlclRyZWUvY2hyb21pdW0vSW1hZ2VEaWZmLmNw
cDogQWRkZWQuCisgICAgICAgICogU2NyaXB0cy93ZWJraXRweS9sYXlvdXRfdGVzdHMvcG9ydC9j
aHJvbWl1bV9tYWMucHk6CisKIDIwMTAtMDQtMTggIENocmlzIEplcmRvbmVrICA8Y2plcmRvbmVr
QHdlYmtpdC5vcmc+CiAKICAgICAgICAgUmV2aWV3ZWQgYnkgU2hpbmljaGlybyBIYW1hamkuCmRp
ZmYgLS1naXQgYS9XZWJLaXRUb29scy9EdW1wUmVuZGVyVHJlZS9EdW1wUmVuZGVyVHJlZS5neXAv
RHVtcFJlbmRlclRyZWUuZ3lwIGIvV2ViS2l0VG9vbHMvRHVtcFJlbmRlclRyZWUvRHVtcFJlbmRl
clRyZWUuZ3lwL0R1bXBSZW5kZXJUcmVlLmd5cAppbmRleCBkYWI5NTYyLi43ZGEwNzc0IDEwMDY0
NAotLS0gYS9XZWJLaXRUb29scy9EdW1wUmVuZGVyVHJlZS9EdW1wUmVuZGVyVHJlZS5neXAvRHVt
cFJlbmRlclRyZWUuZ3lwCisrKyBiL1dlYktpdFRvb2xzL0R1bXBSZW5kZXJUcmVlL0R1bXBSZW5k
ZXJUcmVlLmd5cC9EdW1wUmVuZGVyVHJlZS5neXAKQEAgLTEzOCw2ICsxMzgsMjIgQEAKICAgICAg
ICAgICAgICAgICB9XSwKICAgICAgICAgICAgIF0sCiAgICAgICAgIH0sCisKKyAgICAgICAgewor
ICAgICAgICAgICAgJ3RhcmdldF9uYW1lJzogJ0ltYWdlRGlmZicsCisgICAgICAgICAgICAndHlw
ZSc6ICdleGVjdXRhYmxlJywKKyAgICAgICAgICAgICdkZXBlbmRlbmNpZXMnOiBbCisgICAgICAg
ICAgICAgICAgJzwod2Via2l0X3RvcCkvSmF2YVNjcmlwdENvcmUvSmF2YVNjcmlwdENvcmUuZ3lw
L0phdmFTY3JpcHRDb3JlLmd5cDp3dGYnLAorICAgICAgICAgICAgICAgICc8KGNocm9taXVtX3Ny
Y19kaXIpL2dmeC9nZnguZ3lwOmdmeCcsCisgICAgICAgICAgICBdLAorICAgICAgICAgICAgJ2lu
Y2x1ZGVfZGlycyc6IFsKKyAgICAgICAgICAgICAgICAnPCh3ZWJraXRfdG9wKS9KYXZhU2NyaXB0
Q29yZScsCisgICAgICAgICAgICAgICAgJzwoY2hyb21pdW1fc3JjX2RpciknLAorICAgICAgICAg
ICAgXSwKKyAgICAgICAgICAgICdzb3VyY2VzJzogWworICAgICAgICAgICAgICAgICcuLi9jaHJv
bWl1bS9JbWFnZURpZmYuY3BwJywKKyAgICAgICAgICAgIF0sCisgICAgICAgIH0sCiAgICAgXSwg
IyB0YXJnZXRzCiAKICAgICAnY29uZGl0aW9ucyc6IFsKZGlmZiAtLWdpdCBhL1dlYktpdFRvb2xz
L0R1bXBSZW5kZXJUcmVlL2Nocm9taXVtL0ltYWdlRGlmZi5jcHAgYi9XZWJLaXRUb29scy9EdW1w
UmVuZGVyVHJlZS9jaHJvbWl1bS9JbWFnZURpZmYuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0Cmlu
ZGV4IDAwMDAwMDAuLmE3ZjAwZmUKLS0tIC9kZXYvbnVsbAorKysgYi9XZWJLaXRUb29scy9EdW1w
UmVuZGVyVHJlZS9jaHJvbWl1bS9JbWFnZURpZmYuY3BwCkBAIC0wLDAgKzEsNDA4IEBACisvKgor
ICogQ29weXJpZ2h0IChDKSAyMDEwIEdvb2dsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisg
KgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywg
d2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQg
dGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisgKiBtZXQ6CisgKgorICogICAgICog
UmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5
cmlnaHQKKyAqIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dp
bmcgZGlzY2xhaW1lci4KKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBt
dXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyAqIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBv
ZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKyAqIGluIHRoZSBkb2N1
bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqIGRp
c3RyaWJ1dGlvbi4KKyAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9y
IHRoZSBuYW1lcyBvZiBpdHMKKyAqIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNl
IG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisgKiB0aGlzIHNvZnR3YXJlIHdpdGhv
dXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdB
UkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMK
KyAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVE
SU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1F
UkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFS
RSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisgKiBPV05FUiBP
UiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURF
TlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJ
TkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRV
VEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogREFUQSwgT1IgUFJPRklUUzsg
T1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiBU
SEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZ
LCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5H
IElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYg
QURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworLy8gVGhp
cyBmaWxlIGlucHV0IGZvcm1hdCBpcyBiYXNlZCBsb29zZWx5IG9uCisvLyBXZWJLaXRUb29scy9E
dW1wUmVuZGVyVHJlZS9JbWFnZURpZmYubQorCisvLyBUaGUgZXhhY3QgZm9ybWF0IG9mIHRoaXMg
dG9vbCdzIG91dHB1dCB0byBzdGRvdXQgaXMgaW1wb3J0YW50LCB0byBtYXRjaAorLy8gd2hhdCB0
aGUgcnVuLXdlYmtpdC10ZXN0cyBzY3JpcHQgZXhwZWN0cy4KKworI2luY2x1ZGUgImNvbmZpZy5o
IgorCisjaW5jbHVkZSAiYmFzZS9iYXNpY3R5cGVzLmgiCisjaW5jbHVkZSAiZ2Z4L2NvZGVjL3Bu
Z19jb2RlYy5oIgorI2luY2x1ZGUgPGFsZ29yaXRobT4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2lu
Y2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDx2ZWN0b3I+Cisj
aW5jbHVkZSA8d3RmL093bkFycmF5UHRyLmg+CisjaW5jbHVkZSA8d3RmL1ZlY3Rvci5oPgorCit1
c2luZyBuYW1lc3BhY2UgZ2Z4OwordXNpbmcgbmFtZXNwYWNlIHN0ZDsKKworLy8gQ2F1c2VzIHRo
ZSBhcHAgdG8gcmVtYWluIG9wZW4sIHdhaXRpbmcgZm9yIHBhaXJzIG9mIGZpbGVuYW1lcyBvbiBz
dGRpbi4KKy8vIFRoZSBjYWxsZXIgaXMgdGhlbiByZXNwb25zaWJsZSBmb3IgdGVybWluYXRpbmcg
dGhpcyBhcHAuCitzdGF0aWMgY29uc3QgY2hhciBvcHRpb25Qb2xsU3RkaW5bXSA9ICItLXVzZS1z
dGRpbiI7CitzdGF0aWMgY29uc3QgY2hhciBvcHRpb25HZW5lcmF0ZURpZmZbXSA9ICItLWRpZmYi
OworCisvLyBSZXR1cm4gY29kZXMgdXNlZCBieSB0aGlzIHV0aWxpdHkuCitzdGF0aWMgY29uc3Qg
aW50IHN0YXR1c1NhbWUgPSAwOworc3RhdGljIGNvbnN0IGludCBzdGF0dXNEaWZmZXJlbnQgPSAx
Oworc3RhdGljIGNvbnN0IGludCBzdGF0dXNFcnJvciA9IDI7CisKKy8vIENvbG9yIGNvZGVzLgor
c3RhdGljIGNvbnN0IHVpbnQzMl90IHJnYmFSZWQgPSAweDAwMDAwMGZmOworc3RhdGljIGNvbnN0
IHVpbnQzMl90IHJnYmFBbHBoYSA9IDB4ZmYwMDAwMDA7CisKK2NsYXNzIEltYWdlIHsKK3B1Ymxp
YzoKKyAgICBJbWFnZSgpCisgICAgICAgIDogbV93aWR0aCgwKQorICAgICAgICAsIG1faGVpZ2h0
KDApIHt9CisKKyAgICBJbWFnZShjb25zdCBJbWFnZSYgaW1hZ2UpCisgICAgICAgIDogbV93aWR0
aChpbWFnZS5tX3dpZHRoKQorICAgICAgICAsIG1faGVpZ2h0KGltYWdlLm1faGVpZ2h0KQorICAg
ICAgICAsIG1fZGF0YShpbWFnZS5tX2RhdGEpIHt9CisKKyAgICBib29sIGhhc0ltYWdlKCkgY29u
c3QgeyByZXR1cm4gbV93aWR0aCA+IDAgJiYgbV9oZWlnaHQgPiAwOyB9CisgICAgaW50IHdpZHRo
KCkgY29uc3QgeyByZXR1cm4gbV93aWR0aDsgfQorICAgIGludCBoZWlnaHQoKSBjb25zdCB7IHJl
dHVybiBtX2hlaWdodDsgfQorICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIqIGRhdGEoKSBjb25zdCB7
IHJldHVybiAmbV9kYXRhLmZyb250KCk7IH0KKworICAgIC8vIENyZWF0ZXMgdGhlIGltYWdlIGZy
b20gc3RkaW4gd2l0aCB0aGUgZ2l2ZW4gZGF0YSBsZW5ndGguIE9uIHN1Y2Nlc3MsIGl0CisgICAg
Ly8gd2lsbCByZXR1cm4gdHJ1ZS4gT24gZmFpbHVyZSwgbm8gb3RoZXIgbWV0aG9kcyBzaG91bGQg
YmUgYWNjZXNzZWQuCisgICAgYm9vbCBjcmFldGVGcm9tU3RkaW4oc2l6ZV90IGJ5dGVMZW5ndGgp
CisgICAgeworICAgICAgICBpZiAoIWJ5dGVMZW5ndGgpCisgICAgICAgICAgICByZXR1cm4gZmFs
c2U7CisKKyAgICAgICAgT3duQXJyYXlQdHI8dW5zaWduZWQgY2hhcj4gc291cmNlKG5ldyB1bnNp
Z25lZCBjaGFyW2J5dGVMZW5ndGhdKTsKKyAgICAgICAgaWYgKGZyZWFkKHNvdXJjZS5nZXQoKSwg
MSwgYnl0ZUxlbmd0aCwgc3RkaW4pICE9IGJ5dGVMZW5ndGgpCisgICAgICAgICAgICByZXR1cm4g
ZmFsc2U7CisKKyAgICAgICAgaWYgKCFQTkdDb2RlYzo6RGVjb2RlKHNvdXJjZS5nZXQoKSwgYnl0
ZUxlbmd0aCwgUE5HQ29kZWM6OkZPUk1BVF9SR0JBLAorICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgJm1fZGF0YSwgJm1fd2lkdGgsICZtX2hlaWdodCkpIHsKKyAgICAgICAgICAgIGNsZWFy
KCk7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJu
IHRydWU7CisgICAgfQorCisgICAgLy8gQ3JlYXRlcyB0aGUgaW1hZ2UgZnJvbSB0aGUgZ2l2ZW4g
ZmlsZW5hbWUgb24gZGlzaywgYW5kIHJldHVybnMgdHJ1ZSBvbgorICAgIC8vIHN1Y2Nlc3MuCisg
ICAgYm9vbCBjcmVhdGVGcm9tRmlsZW5hbWUoY29uc3QgY2hhciogZmlsZW5hbWUpCisgICAgewor
ICAgICAgICBGSUxFKiBmID0gZm9wZW4oZmlsZW5hbWUsICJyYiIpOworICAgICAgICBpZiAoIWYp
CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICAgICAgdmVjdG9yPHVuc2lnbmVkIGNo
YXI+IGNvbXByZXNzZWQ7CisgICAgICAgIGNvbnN0IGludCBidWZTaXplID0gMTAyNDsKKyAgICAg
ICAgdW5zaWduZWQgY2hhciBidWZbYnVmU2l6ZV07CisgICAgICAgIHNpemVfdCBudW1SZWFkID0g
MDsKKyAgICAgICAgd2hpbGUgKChudW1SZWFkID0gZnJlYWQoYnVmLCAxLCBidWZTaXplLCBmKSkg
PiAwKQorICAgICAgICAgICAgc3RkOjpjb3B5KGJ1ZiwgJmJ1ZltudW1SZWFkXSwgc3RkOjpiYWNr
X2luc2VydGVyKGNvbXByZXNzZWQpKTsKKworICAgICAgICBmY2xvc2UoZik7CisKKyAgICAgICAg
aWYgKCFQTkdDb2RlYzo6RGVjb2RlKCZjb21wcmVzc2VkWzBdLCBjb21wcmVzc2VkLnNpemUoKSwK
KyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBOR0NvZGVjOjpGT1JNQVRfUkdCQSwgJm1f
ZGF0YSwgJm1fd2lkdGgsICZtX2hlaWdodCkpIHsKKyAgICAgICAgICAgIGNsZWFyKCk7CisgICAg
ICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHRydWU7Cisg
ICAgfQorCisgICAgdm9pZCBjbGVhcigpCisgICAgeworICAgICAgICBtX3dpZHRoID0gbV9oZWln
aHQgPSAwOworICAgICAgICBtX2RhdGEuY2xlYXIoKTsKKyAgICB9CisKKyAgICAvLyBSZXR1cm5z
IHRoZSBSR0JBIHZhbHVlIG9mIHRoZSBwaXhlbCBhdCB0aGUgZ2l2ZW4gbG9jYXRpb24KKyAgICBj
b25zdCB1aW50MzJfdCBwaXhlbEF0KGludCB4LCBpbnQgeSkgY29uc3QKKyAgICB7CisgICAgICAg
IEFTU0VSVCh4ID49IDAgJiYgeCA8IG1fd2lkdGgpOworICAgICAgICBBU1NFUlQoeSA+PSAwICYm
IHkgPCBtX2hlaWdodCk7CisgICAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxjb25zdCB1
aW50MzJfdCo+KCYobV9kYXRhWyh5ICogbV93aWR0aCArIHgpICogNF0pKTsKKyAgICB9CisKKyAg
ICB2b2lkIHNldFBpeGVsQXQoaW50IHgsIGludCB5LCB1aW50MzJfdCBjb2xvcikgY29uc3QKKyAg
ICB7CisgICAgICAgIEFTU0VSVCh4ID49IDAgJiYgeCA8IG1fd2lkdGgpOworICAgICAgICBBU1NF
UlQoeSA+PSAwICYmIHkgPCBtX2hlaWdodCk7CisgICAgICAgIHZvaWQqIGFkZHIgPSAmY29uc3Rf
Y2FzdDx1bnNpZ25lZCBjaGFyKj4oJm1fZGF0YS5mcm9udCgpKVsoeSAqIG1fd2lkdGggKyB4KSAq
IDRdOworICAgICAgICAqcmVpbnRlcnByZXRfY2FzdDx1aW50MzJfdCo+KGFkZHIpID0gY29sb3I7
CisgICAgfQorCitwcml2YXRlOgorICAgIC8vIHBpeGVsIGRpbWVuc2lvbnMgb2YgdGhlIGltYWdl
CisgICAgaW50IG1fd2lkdGgsIG1faGVpZ2h0OworCisgICAgdmVjdG9yPHVuc2lnbmVkIGNoYXI+
IG1fZGF0YTsKK307CisKK2Zsb2F0IHBlcmNlbnRhZ2VEaWZmZXJlbnQoY29uc3QgSW1hZ2UmIGJh
c2VsaW5lLCBjb25zdCBJbWFnZSYgYWN0dWFsKQoreworICAgIGludCB3ID0gbWluKGJhc2VsaW5l
LndpZHRoKCksIGFjdHVhbC53aWR0aCgpKTsKKyAgICBpbnQgaCA9IG1pbihiYXNlbGluZS5oZWln
aHQoKSwgYWN0dWFsLmhlaWdodCgpKTsKKworICAgIC8vIENvbXB1dGUgcGl4ZWxzIGRpZmZlcmVu
dCBpbiB0aGUgb3ZlcmxhcAorICAgIGludCBwaXhlbHNEaWZmZXJlbnQgPSAwOworICAgIGZvciAo
aW50IHkgPSAwOyB5IDwgaDsgeSsrKSB7CisgICAgICAgIGZvciAoaW50IHggPSAwOyB4IDwgdzsg
eCsrKSB7CisgICAgICAgICAgICBpZiAoYmFzZWxpbmUucGl4ZWxBdCh4LCB5KSAhPSBhY3R1YWwu
cGl4ZWxBdCh4LCB5KSkKKyAgICAgICAgICAgICAgICBwaXhlbHNEaWZmZXJlbnQrKzsKKyAgICAg
ICAgfQorICAgIH0KKworICAgIC8vIENvdW50IHBpeGVscyB0aGF0IGFyZSBhIGRpZmZlcmVuY2Ug
aW4gc2l6ZSBhcyBhbHNvIGJlaW5nIGRpZmZlcmVudAorICAgIGludCBtYXhXaWR0aCA9IG1heChi
YXNlbGluZS53aWR0aCgpLCBhY3R1YWwud2lkdGgoKSk7CisgICAgaW50IG1heEhlaWdodCA9IG1h
eChiYXNlbGluZS5oZWlnaHQoKSwgYWN0dWFsLmhlaWdodCgpKTsKKworICAgIC8vIC4uLnBpeGVs
cyBvZmYgdGhlIHJpZ2h0IHNpZGUsIGJ1dCBub3QgaW5jbHVkaW5nIHRoZSBsb3dlciByaWdodCBj
b3JuZXIKKyAgICBwaXhlbHNEaWZmZXJlbnQgKz0gKG1heFdpZHRoIC0gdykgKiBoOworCisgICAg
Ly8gLi4ucGl4ZWxzIGFsb25nIHRoZSBib3R0b20sIGluY2x1ZGluZyB0aGUgbG93ZXIgcmlnaHQg
Y29ybmVyCisgICAgcGl4ZWxzRGlmZmVyZW50ICs9IChtYXhIZWlnaHQgLSBoKSAqIG1heFdpZHRo
OworCisgICAgLy8gTGlrZSB0aGUgV2ViS2l0IEltYWdlRGlmZiB0b29sLCB3ZSBkZWZpbmUgcGVy
Y2VudGFnZSBkaWZmZXJlbnQgaW4gdGVybXMKKyAgICAvLyBvZiB0aGUgc2l6ZSBvZiB0aGUgJ2Fj
dHVhbCcgYml0bWFwLgorICAgIGZsb2F0IHRvdGFsUGl4ZWxzID0gc3RhdGljX2Nhc3Q8ZmxvYXQ+
KGFjdHVhbC53aWR0aCgpKSAqIHN0YXRpY19jYXN0PGZsb2F0PihhY3R1YWwuaGVpZ2h0KCkpOwor
ICAgIGlmICghdG90YWxQaXhlbHMpCisgICAgICAgIHJldHVybiAxMDAuMGY7IC8vIFdoZW4gdGhl
IGJpdG1hcCBpcyBlbXB0eSwgdGhleSBhcmUgMTAwJSBkaWZmZXJlbnQuCisgICAgcmV0dXJuIHN0
YXRpY19jYXN0PGZsb2F0PihwaXhlbHNEaWZmZXJlbnQpIC8gdG90YWxQaXhlbHMgKiAxMDA7Cit9
CisKK3ZvaWQgcHJpbnRIZWxwKCkKK3sKKyAgICBmcHJpbnRmKHN0ZGVyciwKKyAgICAgICAgICAg
ICJVc2FnZTpcbiIKKyAgICAgICAgICAgICIgIEltYWdlRGlmZiA8Y29tcGFyZSBmaWxlPiA8cmVm
ZXJlbmNlIGZpbGU+XG4iCisgICAgICAgICAgICAiICAgIENvbXBhcmVzIHR3byBmaWxlcyBvbiBk
aXNrLCByZXR1cm5pbmcgMCB3aGVuIHRoZXkgYXJlIHRoZSBzYW1lXG4iCisgICAgICAgICAgICAi
ICBJbWFnZURpZmYgLS11c2Utc3RkaW5cbiIKKyAgICAgICAgICAgICIgICAgU3RheXMgb3BlbiBy
ZWFkaW5nIHBhaXJzIG9mIGZpbGVuYW1lcyBmcm9tIHN0ZGluLCBjb21wYXJpbmcgdGhlbSxcbiIK
KyAgICAgICAgICAgICIgICAgYW5kIHNlbmRpbmcgMCB0byBzdGRvdXQgd2hlbiB0aGV5IGFyZSB0
aGUgc2FtZVxuIgorICAgICAgICAgICAgIiAgSW1hZ2VEaWZmIC0tZGlmZiA8Y29tcGFyZSBmaWxl
PiA8cmVmZXJlbmNlIGZpbGU+IDxvdXRwdXQgZmlsZT5cbiIKKyAgICAgICAgICAgICIgICAgQ29t
cGFyZXMgdHdvIGZpbGVzIG9uIGRpc2ssIG91dHB1dHMgYW4gaW1hZ2UgdGhhdCB2aXN1YWxpemVz
IHRoZSIKKyAgICAgICAgICAgICIgICAgZGlmZmVyZW5jZSB0byA8b3V0cHV0IGZpbGU+XG4iKTsK
KyAgICAvKiBGb3IgdW5maW5pc2hlZCB3ZWJraXQtbGlrZS1tb2RlIChzZWUgYmVsb3cpCisgICAg
ICAgIlxuIgorICAgICAgICIgIEltYWdlRGlmZiAtc1xuIgorICAgICAgICIgICAgUmVhZHMgc3Ry
ZWFtIGlucHV0IGZyb20gc3RkaW4sIHNob3VsZCBiZSBFWEFDVExZIG9mIHRoZSBmb3JtYXRcbiIK
KyAgICAgICAiICAgIFwiQ29udGVudC1sZW5ndGg6IDxieXRlIGxlbmd0aD4gPGRhdGE+Q29udGVu
dC1sZW5ndGg6IC4uLlxuIgorICAgICAgICIgICAgaXQgd2lsbCB0YWtlIGFzIG1hbnkgZmlsZSBw
YWlycyBhcyBnaXZlbiwgYW5kIHdpbGwgY29tcGFyZSB0aGVtIGFzXG4iCisgICAgICAgIiAgICAo
Y21wX2ZpbGUsIHJlZmVyZW5jZV9maWxlKSBwYWlyc1xuIik7CisgICAgKi8KK30KKworaW50IGNv
bXBhcmVJbWFnZXMoY29uc3QgY2hhciogZmlsZTEsIGNvbnN0IGNoYXIqIGZpbGUyKQoreworICAg
IEltYWdlIGFjdHVhbEltYWdlOworICAgIEltYWdlIGJhc2VsaW5lSW1hZ2U7CisKKyAgICBpZiAo
IWFjdHVhbEltYWdlLmNyZWF0ZUZyb21GaWxlbmFtZShmaWxlMSkpIHsKKyAgICAgICAgZnByaW50
ZihzdGRlcnIsICJJbWFnZURpZmY6IFVuYWJsZSB0byBvcGVuIGZpbGUgXCIlc1wiXG4iLCBmaWxl
MSk7CisgICAgICAgIHJldHVybiBzdGF0dXNFcnJvcjsKKyAgICB9CisgICAgaWYgKCFiYXNlbGlu
ZUltYWdlLmNyZWF0ZUZyb21GaWxlbmFtZShmaWxlMikpIHsKKyAgICAgICAgZnByaW50ZihzdGRl
cnIsICJJbWFnZURpZmY6IFVuYWJsZSB0byBvcGVuIGZpbGUgXCIlc1wiXG4iLCBmaWxlMik7Cisg
ICAgICAgIHJldHVybiBzdGF0dXNFcnJvcjsKKyAgICB9CisKKyAgICBmbG9hdCBwZXJjZW50ID0g
cGVyY2VudGFnZURpZmZlcmVudChhY3R1YWxJbWFnZSwgYmFzZWxpbmVJbWFnZSk7CisgICAgaWYg
KHBlcmNlbnQgPiAwLjApIHsKKyAgICAgICAgLy8gZmFpbHVyZTogVGhlIFdlYktpdCB2ZXJzaW9u
IGFsc28gd3JpdGVzIHRoZSBkaWZmZXJlbmNlIGltYWdlIHRvCisgICAgICAgIC8vIHN0ZG91dCwg
d2hpY2ggc2VlbXMgZXhjZXNzaXZlIGZvciBvdXIgbmVlZHMuCisgICAgICAgIHByaW50ZigiZGlm
ZjogJTAxLjJmJSUgZmFpbGVkXG4iLCBwZXJjZW50KTsKKyAgICAgICAgcmV0dXJuIHN0YXR1c0Rp
ZmZlcmVudDsKKyAgICB9CisKKyAgICAvLyBzdWNjZXNzCisgICAgcHJpbnRmKCJkaWZmOiAlMDEu
MmYlJSBwYXNzZWRcbiIsIHBlcmNlbnQpOworICAgIHJldHVybiBzdGF0dXNTYW1lOworCit9CisK
Ky8vIFVudGVzdGVkIG1vZGUgdGhhdCBhY3RzIGxpa2UgV2ViS2l0J3MgaW1hZ2UgY29tcGFyYXRv
ci4gSSB3cm90ZSB0aGlzIGJ1dAorLy8gZGVjaWRlZCBpdCdzIHRvbyBjb21wbGljYXRlZC4gV2Ug
bWF5IHVzZSBpdCBpbiB0aGUgZnV0dXJlIGlmIGl0IGxvb2tzIHVzZWZ1bC4KK2ludCB1bnRlc3Rl
ZENvbXBhcmVJbWFnZXMoKQoreworICAgIEltYWdlIGFjdHVhbEltYWdlOworICAgIEltYWdlIGJh
c2VsaW5lSW1hZ2U7CisgICAgY2hhciBidWZmZXJbMjA0OF07CisgICAgd2hpbGUgKGZnZXRzKGJ1
ZmZlciwgc2l6ZW9mKGJ1ZmZlciksIHN0ZGluKSkgeworICAgICAgICBpZiAoIXN0cm5jbXAoIkNv
bnRlbnQtbGVuZ3RoOiAiLCBidWZmZXIsIDE2KSkgeworICAgICAgICAgICAgY2hhciogY29udGV4
dDsKKyNpZiBPUyhXSU5ET1dTKQorICAgICAgICAgICAgc3RydG9rX3MoYnVmZmVyLCAiICIsICZj
b250ZXh0KTsKKyAgICAgICAgICAgIGludCBpbWFnZVNpemUgPSBzdHJ0b2woc3RydG9rX3MoMCwg
IiAiLCAmY29udGV4dCksIDAsIDEwKTsKKyNlbHNlCisgICAgICAgICAgICBzdHJ0b2tfcihidWZm
ZXIsICIgIiwgJmNvbnRleHQpOworICAgICAgICAgICAgaW50IGltYWdlU2l6ZSA9IHN0cnRvbChz
dHJ0b2tfcigwLCAiICIsICZjb250ZXh0KSwgMCwgMTApOworI2VuZGlmCisKKyAgICAgICAgICAg
IGJvb2wgc3VjY2VzcyA9IGZhbHNlOworICAgICAgICAgICAgaWYgKGltYWdlU2l6ZSA+IDAgJiYg
IWFjdHVhbEltYWdlLmhhc0ltYWdlKCkpIHsKKyAgICAgICAgICAgICAgICBpZiAoIWFjdHVhbElt
YWdlLmNyYWV0ZUZyb21TdGRpbihpbWFnZVNpemUpKSB7CisgICAgICAgICAgICAgICAgICAgIGZw
dXRzKCJFcnJvciwgaW5wdXQgaW1hZ2UgY2FuJ3QgYmUgZGVjb2RlZC5cbiIsIHN0ZGVycik7Cisg
ICAgICAgICAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAg
ICAgIH0gZWxzZSBpZiAoaW1hZ2VTaXplID4gMCAmJiAhYmFzZWxpbmVJbWFnZS5oYXNJbWFnZSgp
KSB7CisgICAgICAgICAgICAgICAgaWYgKCFiYXNlbGluZUltYWdlLmNyYWV0ZUZyb21TdGRpbihp
bWFnZVNpemUpKSB7CisgICAgICAgICAgICAgICAgICAgIGZwdXRzKCJFcnJvciwgYmFzZWxpbmUg
aW1hZ2UgY2FuJ3QgYmUgZGVjb2RlZC5cbiIsIHN0ZGVycik7CisgICAgICAgICAgICAgICAgICAg
IHJldHVybiAxOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAg
ICAgICAgICAgICAgZnB1dHMoIkVycm9yLCBpbWFnZSBzaXplIG11c3QgYmUgc3BlY2lmaWVkLlxu
Iiwgc3RkZXJyKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgICAgIH0KKyAg
ICAgICAgfQorCisgICAgICAgIGlmIChhY3R1YWxJbWFnZS5oYXNJbWFnZSgpICYmIGJhc2VsaW5l
SW1hZ2UuaGFzSW1hZ2UoKSkgeworICAgICAgICAgICAgZmxvYXQgcGVyY2VudCA9IHBlcmNlbnRh
Z2VEaWZmZXJlbnQoYWN0dWFsSW1hZ2UsIGJhc2VsaW5lSW1hZ2UpOworICAgICAgICAgICAgaWYg
KHBlcmNlbnQgPiAwLjApIHsKKyAgICAgICAgICAgICAgICAvLyBmYWlsdXJlOiBUaGUgV2ViS2l0
IHZlcnNpb24gYWxzbyB3cml0ZXMgdGhlIGRpZmZlcmVuY2UgaW1hZ2UgdG8KKyAgICAgICAgICAg
ICAgICAvLyBzdGRvdXQsIHdoaWNoIHNlZW1zIGV4Y2Vzc2l2ZSBmb3Igb3VyIG5lZWRzLgorICAg
ICAgICAgICAgICAgIHByaW50ZigiZGlmZjogJTAxLjJmJSUgZmFpbGVkXG4iLCBwZXJjZW50KTsK
KyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgLy8gc3VjY2VzcworICAgICAg
ICAgICAgICAgIHByaW50ZigiZGlmZjogJTAxLjJmJSUgcGFzc2VkXG4iLCBwZXJjZW50KTsKKyAg
ICAgICAgICAgIH0KKyAgICAgICAgICAgIGFjdHVhbEltYWdlLmNsZWFyKCk7CisgICAgICAgICAg
ICBiYXNlbGluZUltYWdlLmNsZWFyKCk7CisgICAgICAgIH0KKyAgICAgICAgZmZsdXNoKHN0ZG91
dCk7CisgICAgfQorICAgIHJldHVybiAwOworfQorCitib29sIGNyZWF0ZUltYWdlRGlmZihjb25z
dCBJbWFnZSYgaW1hZ2UxLCBjb25zdCBJbWFnZSYgaW1hZ2UyLCBJbWFnZSogb3V0KQoreworICAg
IGludCB3ID0gbWluKGltYWdlMS53aWR0aCgpLCBpbWFnZTIud2lkdGgoKSk7CisgICAgaW50IGgg
PSBtaW4oaW1hZ2UxLmhlaWdodCgpLCBpbWFnZTIuaGVpZ2h0KCkpOworICAgICpvdXQgPSBJbWFn
ZShpbWFnZTEpOworICAgIGJvb2wgc2FtZSA9IChpbWFnZTEud2lkdGgoKSA9PSBpbWFnZTIud2lk
dGgoKSkgJiYgKGltYWdlMS5oZWlnaHQoKSA9PSBpbWFnZTIuaGVpZ2h0KCkpOworCisgICAgLy8g
RklYTUU6IGRvIHNvbWV0aGluZyB3aXRoIHRoZSBleHRyYSBwaXhlbHMgaWYgdGhlIGltYWdlIHNp
emVzIGFyZSBkaWZmZXJlbnQuCisgICAgZm9yIChpbnQgeSA9IDA7IHkgPCBoOyB5KyspIHsKKyAg
ICAgICAgZm9yIChpbnQgeCA9IDA7IHggPCB3OyB4KyspIHsKKyAgICAgICAgICAgIHVpbnQzMl90
IGJhc2VQaXhlbCA9IGltYWdlMS5waXhlbEF0KHgsIHkpOworICAgICAgICAgICAgaWYgKGJhc2VQ
aXhlbCAhPSBpbWFnZTIucGl4ZWxBdCh4LCB5KSkgeworICAgICAgICAgICAgICAgIC8vIFNldCBk
aWZmZXJpbmcgcGl4ZWxzIHJlZC4KKyAgICAgICAgICAgICAgICBvdXQtPnNldFBpeGVsQXQoeCwg
eSwgcmdiYVJlZCB8IHJnYmFBbHBoYSk7CisgICAgICAgICAgICAgICAgc2FtZSA9IGZhbHNlOwor
ICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAvLyBTZXQgc2FtZSBwaXhlbHMg
YXMgZmFkZWQuCisgICAgICAgICAgICAgICAgdWludDMyX3QgYWxwaGEgPSBiYXNlUGl4ZWwgJiBy
Z2JhQWxwaGE7CisgICAgICAgICAgICAgICAgdWludDMyX3QgbmV3UGl4ZWwgPSBiYXNlUGl4ZWwg
LSAoKGFscGhhIC8gMikgJiByZ2JhQWxwaGEpOworICAgICAgICAgICAgICAgIG91dC0+c2V0UGl4
ZWxBdCh4LCB5LCBuZXdQaXhlbCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisK
KyAgICByZXR1cm4gc2FtZTsKK30KKworc3RhdGljIGJvb2wgd3JpdGVGaWxlKGNvbnN0IGNoYXIq
IG91dEZpbGUsIGNvbnN0IHVuc2lnbmVkIGNoYXIqIGRhdGEsIHNpemVfdCBkYXRhU2l6ZSkKK3sK
KyAgICBGSUxFKiBmaWxlID0gZm9wZW4ob3V0RmlsZSwgIndiIik7CisgICAgaWYgKCFmaWxlKSB7
CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiSW1hZ2VEaWZmOiBVbmFibGUgdG8gY3JlYXRlIGZp
bGUgXCIlc1wiXG4iLCBmaWxlKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBp
ZiAoZGF0YVNpemUgIT0gZndyaXRlKGRhdGEsIDEsIGRhdGFTaXplLCBmaWxlKSkgeworICAgICAg
ICBmY2xvc2UoZmlsZSk7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiSW1hZ2VEaWZmOiBVbmFi
bGUgdG8gd3JpdGUgZGF0YSB0byBmaWxlIFwiJXNcIlxuIiwgZmlsZSk7CisgICAgICAgIHJldHVy
biBmYWxzZTsKKyAgICB9CisgICAgZmNsb3NlKGZpbGUpOworICAgIHJldHVybiB0cnVlOworfQor
CitpbnQgZGlmZkltYWdlcyhjb25zdCBjaGFyKiBmaWxlMSwgY29uc3QgY2hhciogZmlsZTIsIGNv
bnN0IGNoYXIqIG91dEZpbGUpCit7CisgICAgSW1hZ2UgYWN0dWFsSW1hZ2U7CisgICAgSW1hZ2Ug
YmFzZWxpbmVJbWFnZTsKKworICAgIGlmICghYWN0dWFsSW1hZ2UuY3JlYXRlRnJvbUZpbGVuYW1l
KGZpbGUxKSkgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkltYWdlRGlmZjogVW5hYmxlIHRv
IG9wZW4gZmlsZSBcIiVzXCJcbiIsIGZpbGUxKTsKKyAgICAgICAgcmV0dXJuIHN0YXR1c0Vycm9y
OworICAgIH0KKyAgICBpZiAoIWJhc2VsaW5lSW1hZ2UuY3JlYXRlRnJvbUZpbGVuYW1lKGZpbGUy
KSkgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkltYWdlRGlmZjogVW5hYmxlIHRvIG9wZW4g
ZmlsZSBcIiVzXCJcbiIsIGZpbGUyKTsKKyAgICAgICAgcmV0dXJuIHN0YXR1c0Vycm9yOworICAg
IH0KKworICAgIEltYWdlIGRpZmZJbWFnZTsKKyAgICBib29sIHNhbWUgPSBjcmVhdGVJbWFnZURp
ZmYoYmFzZWxpbmVJbWFnZSwgYWN0dWFsSW1hZ2UsICZkaWZmSW1hZ2UpOworICAgIGlmIChzYW1l
KQorICAgICAgICByZXR1cm4gc3RhdHVzU2FtZTsKKworICAgIHZlY3Rvcjx1bnNpZ25lZCBjaGFy
PiBwbmdEYXRhOworICAgIFBOR0NvZGVjOjpFbmNvZGUoZGlmZkltYWdlLmRhdGEoKSwgUE5HQ29k
ZWM6OkZPUk1BVF9SR0JBLCBkaWZmSW1hZ2Uud2lkdGgoKSwKKyAgICAgICAgICAgICAgICAgICAg
IGRpZmZJbWFnZS5oZWlnaHQoKSwgZGlmZkltYWdlLndpZHRoKCkgKiA0LCBmYWxzZSwgJnBuZ0Rh
dGEpOworICAgIGlmICghd3JpdGVGaWxlKG91dEZpbGUsICZwbmdEYXRhLmZyb250KCksIHBuZ0Rh
dGEuc2l6ZSgpKSkKKyAgICAgICAgcmV0dXJuIHN0YXR1c0Vycm9yOworICAgIHJldHVybiBzdGF0
dXNEaWZmZXJlbnQ7Cit9CisKK2ludCBtYWluKGludCBhcmdjLCBjb25zdCBjaGFyKiBhcmd2W10p
Cit7CisgICAgVmVjdG9yPGNvbnN0IGNoYXIqPiB2YWx1ZXM7CisgICAgYm9vbCBwb2xsU3RkaW4g
PSBmYWxzZTsKKyAgICBib29sIGdlbmVyYXRlRGlmZiA9IGZhbHNlOworICAgIGZvciAoaW50IGkg
PSAxOyBpIDwgYXJnYzsgKytpKSB7CisgICAgICAgIGlmICghc3RyY21wKGFyZ3ZbaV0sIG9wdGlv
blBvbGxTdGRpbikpCisgICAgICAgICAgICBwb2xsU3RkaW4gPSB0cnVlOworICAgICAgICBlbHNl
IGlmICghc3RyY21wKGFyZ3ZbaV0sIG9wdGlvbkdlbmVyYXRlRGlmZikpCisgICAgICAgICAgICBn
ZW5lcmF0ZURpZmYgPSB0cnVlOworICAgICAgICBlbHNlCisgICAgICAgICAgICB2YWx1ZXMuYXBw
ZW5kKGFyZ3ZbaV0pOworICAgIH0KKworICAgIGlmIChwb2xsU3RkaW4pIHsKKyAgICAgICAgLy8g
V2F0Y2ggc3RkaW4gZm9yIGZpbGVuYW1lcy4KKyAgICAgICAgY29uc3Qgc2l6ZV90IGJ1ZmZlclNp
emUgPSBQQVRIX01BWDsKKyAgICAgICAgY2hhciBzdGRpbkJ1ZmZlcltidWZmZXJTaXplXTsKKyAg
ICAgICAgY2hhciBmaXJzdE5hbWVbYnVmZmVyU2l6ZV07CisgICAgICAgIGJvb2wgaGF2ZUZpcnN0
TmFtZSA9IGZhbHNlOworICAgICAgICB3aGlsZSAoZmdldHMoc3RkaW5CdWZmZXIsIGJ1ZmZlclNp
emUsIHN0ZGluKSkgeworICAgICAgICAgICAgaWYgKCFzdGRpbkJ1ZmZlclswXSkKKyAgICAgICAg
ICAgICAgICBjb250aW51ZTsKKworICAgICAgICAgICAgaWYgKGhhdmVGaXJzdE5hbWUpIHsKKyAg
ICAgICAgICAgICAgICAvLyBjb21wYXJlSW1hZ2VzIHdyaXRlcyByZXN1bHRzIHRvIHN0ZG91dCB1
bmxlc3MgYW4gZXJyb3Igb2NjdXJyZWQuCisgICAgICAgICAgICAgICAgaWYgKGNvbXBhcmVJbWFn
ZXMoZmlyc3ROYW1lLCBzdGRpbkJ1ZmZlcikgPT0gc3RhdHVzRXJyb3IpCisgICAgICAgICAgICAg
ICAgICAgIHByaW50ZigiZXJyb3JcbiIpOworICAgICAgICAgICAgICAgIGZmbHVzaChzdGRvdXQp
OworICAgICAgICAgICAgICAgIGhhdmVGaXJzdE5hbWUgPSBmYWxzZTsKKyAgICAgICAgICAgIH0g
ZWxzZSB7CisgICAgICAgICAgICAgICAgLy8gU2F2ZSB0aGUgZmlyc3QgZmlsZW5hbWUgaW4gYW5v
dGhlciBidWZmZXIgYW5kIHdhaXQgZm9yIHRoZSBzZWNvbmQKKyAgICAgICAgICAgICAgICAvLyBm
aWxlbmFtZSB0byBhcnJpdmUgdmlhIHN0ZGluLgorICAgICAgICAgICAgICAgIHN0cmNweShmaXJz
dE5hbWUsIHN0ZGluQnVmZmVyKTsKKyAgICAgICAgICAgICAgICBoYXZlRmlyc3ROYW1lID0gdHJ1
ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gMDsKKyAgICB9CisK
KyAgICBpZiAoZ2VuZXJhdGVEaWZmKSB7CisgICAgICAgIGlmICh2YWx1ZXMuc2l6ZSgpID09IDMp
CisgICAgICAgICAgICByZXR1cm4gZGlmZkltYWdlcyh2YWx1ZXNbMF0sIHZhbHVlc1sxXSwgdmFs
dWVzWzJdKTsKKyAgICB9IGVsc2UgaWYgKHZhbHVlcy5zaXplKCkgPT0gMikKKyAgICAgICAgcmV0
dXJuIGNvbXBhcmVJbWFnZXMoYXJndlsxXSwgYXJndlsyXSk7CisKKyAgICBwcmludEhlbHAoKTsK
KyAgICByZXR1cm4gc3RhdHVzRXJyb3I7Cit9CmRpZmYgLS1naXQgYS9XZWJLaXRUb29scy9TY3Jp
cHRzL3dlYmtpdHB5L2xheW91dF90ZXN0cy9wb3J0L2Nocm9taXVtX21hYy5weSBiL1dlYktpdFRv
b2xzL1NjcmlwdHMvd2Via2l0cHkvbGF5b3V0X3Rlc3RzL3BvcnQvY2hyb21pdW1fbWFjLnB5Cmlu
ZGV4IDU3MGViMWMuLmQ1ZTE3NTcgMTAwNjQ0Ci0tLSBhL1dlYktpdFRvb2xzL1NjcmlwdHMvd2Vi
a2l0cHkvbGF5b3V0X3Rlc3RzL3BvcnQvY2hyb21pdW1fbWFjLnB5CisrKyBiL1dlYktpdFRvb2xz
L1NjcmlwdHMvd2Via2l0cHkvbGF5b3V0X3Rlc3RzL3BvcnQvY2hyb21pdW1fbWFjLnB5CkBAIC0x
NTcsMTAgKzE1NywxMCBAQCBjbGFzcyBDaHJvbWl1bU1hY1BvcnQoY2hyb21pdW0uQ2hyb21pdW1Q
b3J0KToKICAgICAgICAgcmV0dXJuIHNlbGYuX2J1aWxkX3BhdGgoc2VsZi5fb3B0aW9ucy5jb25m
aWd1cmF0aW9uLCBiaW5hcnlfbmFtZSkKIAogICAgIGRlZiBfcGF0aF90b19pbWFnZV9kaWZmKHNl
bGYpOgorICAgICAgICBiaW5hcnlfbmFtZSA9ICdpbWFnZV9kaWZmJwogICAgICAgICBpZiBzZWxm
Ll9vcHRpb25zLnVzZV9kcnQ6Ci0gICAgICAgICAgICAjIEZJWE1FKHRvbnkpOiBUaGlzIHNob3Vs
ZCB1c2UgSW1hZ2VEaWZmLgotICAgICAgICAgICAgcmV0dXJuICcnCi0gICAgICAgIHJldHVybiBz
ZWxmLl9idWlsZF9wYXRoKHNlbGYuX29wdGlvbnMuY29uZmlndXJhdGlvbiwgJ2ltYWdlX2RpZmYn
KQorICAgICAgICAgICAgYmluYXJ5X25hbWUgPSAnSW1hZ2VEaWZmJworICAgICAgICByZXR1cm4g
c2VsZi5fYnVpbGRfcGF0aChzZWxmLl9vcHRpb25zLmNvbmZpZ3VyYXRpb24sIGJpbmFyeV9uYW1l
KQogCiAgICAgZGVmIF9wYXRoX3RvX3dkaWZmKHNlbGYpOgogICAgICAgICByZXR1cm4gJ3dkaWZm
Jwo=
</data>

          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>53765</attachid>
            <date>2010-04-19 19:30:48 -0700</date>
            <delta_ts>2010-04-20 20:31:59 -0700</delta_ts>
            <desc>Proposed patch (rev.2)</desc>
            <filename>bug-37790-20100420113046.patch</filename>
            <type>text/plain</type>
            <size>17412</size>
            <attacher name="Kent Tamura">tkent</attacher>
            
              <data encoding="base64">ZGlmZiAtLWdpdCBhL1dlYktpdFRvb2xzL0NoYW5nZUxvZyBiL1dlYktpdFRvb2xzL0NoYW5nZUxv
ZwppbmRleCBkZGE2ZWRmLi4wOWQwMGY0IDEwMDY0NAotLS0gYS9XZWJLaXRUb29scy9DaGFuZ2VM
b2cKKysrIGIvV2ViS2l0VG9vbHMvQ2hhbmdlTG9nCkBAIC0xLDUgKzEsMTggQEAKIDIwMTAtMDQt
MTkgIEtlbnQgVGFtdXJhICA8dGtlbnRAY2hyb21pdW0ub3JnPgogCisgICAgICAgIFJldmlld2Vk
IGJ5IE5PQk9EWSAoT09QUyEpLgorCisgICAgICAgIFtEUlQvQ2hyb21pdW1dIEltcG9ydCBDaHJv
bWl1bSBpbWFnZV9kaWZmIGFzIEltYWdlRGlmZgorICAgICAgICBodHRwczovL2J1Z3Mud2Via2l0
Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9Mzc3OTAKKworICAgICAgICBJbWFnZURpZmYuY3BwIGlzIGJh
c2VkIG9uIHRvb2xzL2ltYWdlZGlmZi9pbWFnZV9kaWZmLmNjIHI0MTkxMSBvZiBDaHJvbWl1bS4K
KworICAgICAgICAqIER1bXBSZW5kZXJUcmVlL0R1bXBSZW5kZXJUcmVlLmd5cC9EdW1wUmVuZGVy
VHJlZS5neXA6CisgICAgICAgICogRHVtcFJlbmRlclRyZWUvY2hyb21pdW0vSW1hZ2VEaWZmLmNw
cDogQWRkZWQuCisgICAgICAgICogU2NyaXB0cy93ZWJraXRweS9sYXlvdXRfdGVzdHMvcG9ydC9j
aHJvbWl1bV9tYWMucHk6CisKKzIwMTAtMDQtMTkgIEtlbnQgVGFtdXJhICA8dGtlbnRAY2hyb21p
dW0ub3JnPgorCiAgICAgICAgIFJldmlld2VkIGJ5IFNoaW5pY2hpcm8gSGFtYWppLgogCiAgICAg
ICAgIFtEUlQvQ2hyb21pdW1dIEZpeCBhIHRlc3QgaW5pdGlhbGl6YXRpb24gcHJvYmxlbQpkaWZm
IC0tZ2l0IGEvV2ViS2l0VG9vbHMvRHVtcFJlbmRlclRyZWUvRHVtcFJlbmRlclRyZWUuZ3lwL0R1
bXBSZW5kZXJUcmVlLmd5cCBiL1dlYktpdFRvb2xzL0R1bXBSZW5kZXJUcmVlL0R1bXBSZW5kZXJU
cmVlLmd5cC9EdW1wUmVuZGVyVHJlZS5neXAKaW5kZXggZGFiOTU2Mi4uN2RhMDc3NCAxMDA2NDQK
LS0tIGEvV2ViS2l0VG9vbHMvRHVtcFJlbmRlclRyZWUvRHVtcFJlbmRlclRyZWUuZ3lwL0R1bXBS
ZW5kZXJUcmVlLmd5cAorKysgYi9XZWJLaXRUb29scy9EdW1wUmVuZGVyVHJlZS9EdW1wUmVuZGVy
VHJlZS5neXAvRHVtcFJlbmRlclRyZWUuZ3lwCkBAIC0xMzgsNiArMTM4LDIyIEBACiAgICAgICAg
ICAgICAgICAgfV0sCiAgICAgICAgICAgICBdLAogICAgICAgICB9LAorCisgICAgICAgIHsKKyAg
ICAgICAgICAgICd0YXJnZXRfbmFtZSc6ICdJbWFnZURpZmYnLAorICAgICAgICAgICAgJ3R5cGUn
OiAnZXhlY3V0YWJsZScsCisgICAgICAgICAgICAnZGVwZW5kZW5jaWVzJzogWworICAgICAgICAg
ICAgICAgICc8KHdlYmtpdF90b3ApL0phdmFTY3JpcHRDb3JlL0phdmFTY3JpcHRDb3JlLmd5cC9K
YXZhU2NyaXB0Q29yZS5neXA6d3RmJywKKyAgICAgICAgICAgICAgICAnPChjaHJvbWl1bV9zcmNf
ZGlyKS9nZngvZ2Z4Lmd5cDpnZngnLAorICAgICAgICAgICAgXSwKKyAgICAgICAgICAgICdpbmNs
dWRlX2RpcnMnOiBbCisgICAgICAgICAgICAgICAgJzwod2Via2l0X3RvcCkvSmF2YVNjcmlwdENv
cmUnLAorICAgICAgICAgICAgICAgICc8KGNocm9taXVtX3NyY19kaXIpJywKKyAgICAgICAgICAg
IF0sCisgICAgICAgICAgICAnc291cmNlcyc6IFsKKyAgICAgICAgICAgICAgICAnLi4vY2hyb21p
dW0vSW1hZ2VEaWZmLmNwcCcsCisgICAgICAgICAgICBdLAorICAgICAgICB9LAogICAgIF0sICMg
dGFyZ2V0cwogCiAgICAgJ2NvbmRpdGlvbnMnOiBbCmRpZmYgLS1naXQgYS9XZWJLaXRUb29scy9E
dW1wUmVuZGVyVHJlZS9jaHJvbWl1bS9JbWFnZURpZmYuY3BwIGIvV2ViS2l0VG9vbHMvRHVtcFJl
bmRlclRyZWUvY2hyb21pdW0vSW1hZ2VEaWZmLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRl
eCAwMDAwMDAwLi44MWQ1ZjYyCi0tLSAvZGV2L251bGwKKysrIGIvV2ViS2l0VG9vbHMvRHVtcFJl
bmRlclRyZWUvY2hyb21pdW0vSW1hZ2VEaWZmLmNwcApAQCAtMCwwICsxLDQwNyBAQAorLyoKKyAq
IENvcHlyaWdodCAoQykgMjAxMCBHb29nbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoK
KyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdp
dGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRo
YXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorICogbWV0OgorICoKKyAqICAgICAqIFJl
ZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJp
Z2h0CisgKiBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5n
IGRpc2NsYWltZXIuCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVz
dCByZXByb2R1Y2UgdGhlIGFib3ZlCisgKiBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2Yg
Y29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisgKiBpbiB0aGUgZG9jdW1l
bnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiBkaXN0
cmlidXRpb24uCisgKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0
aGUgbmFtZXMgb2YgaXRzCisgKiBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBv
ciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorICogdGhpcyBzb2Z0d2FyZSB3aXRob3V0
IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJF
IElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisg
KiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElO
RywgQlVUIE5PVAorICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJD
SEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisgKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUg
RElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorICogT1dORVIgT1Ig
Q09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5U
QUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5D
TFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRF
IEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7IE9S
IEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogVEhF
T1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwg
T1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJ
TiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFE
VklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKy8vIFRoaXMg
ZmlsZSBpbnB1dCBmb3JtYXQgaXMgYmFzZWQgbG9vc2VseSBvbgorLy8gV2ViS2l0VG9vbHMvRHVt
cFJlbmRlclRyZWUvSW1hZ2VEaWZmLm0KKworLy8gVGhlIGV4YWN0IGZvcm1hdCBvZiB0aGlzIHRv
b2wncyBvdXRwdXQgdG8gc3Rkb3V0IGlzIGltcG9ydGFudCwgdG8gbWF0Y2gKKy8vIHdoYXQgdGhl
IHJ1bi13ZWJraXQtdGVzdHMgc2NyaXB0IGV4cGVjdHMuCisKKyNpbmNsdWRlICJjb25maWcuaCIK
KworI2luY2x1ZGUgImdmeC9jb2RlYy9wbmdfY29kZWMuaCIKKyNpbmNsdWRlIDxhbGdvcml0aG0+
CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzdHJp
bmc+CisjaW5jbHVkZSA8dmVjdG9yPgorI2luY2x1ZGUgPHd0Zi9Pd25BcnJheVB0ci5oPgorI2lu
Y2x1ZGUgPHd0Zi9WZWN0b3IuaD4KKwordXNpbmcgbmFtZXNwYWNlIGdmeDsKK3VzaW5nIG5hbWVz
cGFjZSBzdGQ7CisKKy8vIENhdXNlcyB0aGUgYXBwIHRvIHJlbWFpbiBvcGVuLCB3YWl0aW5nIGZv
ciBwYWlycyBvZiBmaWxlbmFtZXMgb24gc3RkaW4uCisvLyBUaGUgY2FsbGVyIGlzIHRoZW4gcmVz
cG9uc2libGUgZm9yIHRlcm1pbmF0aW5nIHRoaXMgYXBwLgorc3RhdGljIGNvbnN0IGNoYXIgb3B0
aW9uUG9sbFN0ZGluW10gPSAiLS11c2Utc3RkaW4iOworc3RhdGljIGNvbnN0IGNoYXIgb3B0aW9u
R2VuZXJhdGVEaWZmW10gPSAiLS1kaWZmIjsKKworLy8gUmV0dXJuIGNvZGVzIHVzZWQgYnkgdGhp
cyB1dGlsaXR5Lgorc3RhdGljIGNvbnN0IGludCBzdGF0dXNTYW1lID0gMDsKK3N0YXRpYyBjb25z
dCBpbnQgc3RhdHVzRGlmZmVyZW50ID0gMTsKK3N0YXRpYyBjb25zdCBpbnQgc3RhdHVzRXJyb3Ig
PSAyOworCisvLyBDb2xvciBjb2Rlcy4KK3N0YXRpYyBjb25zdCB1aW50MzJfdCByZ2JhUmVkID0g
MHgwMDAwMDBmZjsKK3N0YXRpYyBjb25zdCB1aW50MzJfdCByZ2JhQWxwaGEgPSAweGZmMDAwMDAw
OworCitjbGFzcyBJbWFnZSB7CitwdWJsaWM6CisgICAgSW1hZ2UoKQorICAgICAgICA6IG1fd2lk
dGgoMCkKKyAgICAgICAgLCBtX2hlaWdodCgwKSB7fQorCisgICAgSW1hZ2UoY29uc3QgSW1hZ2Um
IGltYWdlKQorICAgICAgICA6IG1fd2lkdGgoaW1hZ2UubV93aWR0aCkKKyAgICAgICAgLCBtX2hl
aWdodChpbWFnZS5tX2hlaWdodCkKKyAgICAgICAgLCBtX2RhdGEoaW1hZ2UubV9kYXRhKSB7fQor
CisgICAgYm9vbCBoYXNJbWFnZSgpIGNvbnN0IHsgcmV0dXJuIG1fd2lkdGggPiAwICYmIG1faGVp
Z2h0ID4gMDsgfQorICAgIGludCB3aWR0aCgpIGNvbnN0IHsgcmV0dXJuIG1fd2lkdGg7IH0KKyAg
ICBpbnQgaGVpZ2h0KCkgY29uc3QgeyByZXR1cm4gbV9oZWlnaHQ7IH0KKyAgICBjb25zdCB1bnNp
Z25lZCBjaGFyKiBkYXRhKCkgY29uc3QgeyByZXR1cm4gJm1fZGF0YS5mcm9udCgpOyB9CisKKyAg
ICAvLyBDcmVhdGVzIHRoZSBpbWFnZSBmcm9tIHN0ZGluIHdpdGggdGhlIGdpdmVuIGRhdGEgbGVu
Z3RoLiBPbiBzdWNjZXNzLCBpdAorICAgIC8vIHdpbGwgcmV0dXJuIHRydWUuIE9uIGZhaWx1cmUs
IG5vIG90aGVyIG1ldGhvZHMgc2hvdWxkIGJlIGFjY2Vzc2VkLgorICAgIGJvb2wgY3JhZXRlRnJv
bVN0ZGluKHNpemVfdCBieXRlTGVuZ3RoKQorICAgIHsKKyAgICAgICAgaWYgKCFieXRlTGVuZ3Ro
KQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgICAgIE93bkFycmF5UHRyPHVuc2ln
bmVkIGNoYXI+IHNvdXJjZShuZXcgdW5zaWduZWQgY2hhcltieXRlTGVuZ3RoXSk7CisgICAgICAg
IGlmIChmcmVhZChzb3VyY2UuZ2V0KCksIDEsIGJ5dGVMZW5ndGgsIHN0ZGluKSAhPSBieXRlTGVu
Z3RoKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgICAgIGlmICghUE5HQ29kZWM6
OkRlY29kZShzb3VyY2UuZ2V0KCksIGJ5dGVMZW5ndGgsIFBOR0NvZGVjOjpGT1JNQVRfUkdCQSwK
KyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZtX2RhdGEsICZtX3dpZHRoLCAmbV9oZWln
aHQpKSB7CisgICAgICAgICAgICBjbGVhcigpOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwor
ICAgICAgICB9CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIC8vIENyZWF0ZXMg
dGhlIGltYWdlIGZyb20gdGhlIGdpdmVuIGZpbGVuYW1lIG9uIGRpc2ssIGFuZCByZXR1cm5zIHRy
dWUgb24KKyAgICAvLyBzdWNjZXNzLgorICAgIGJvb2wgY3JlYXRlRnJvbUZpbGVuYW1lKGNvbnN0
IGNoYXIqIGZpbGVuYW1lKQorICAgIHsKKyAgICAgICAgRklMRSogZiA9IGZvcGVuKGZpbGVuYW1l
LCAicmIiKTsKKyAgICAgICAgaWYgKCFmKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworCisg
ICAgICAgIHZlY3Rvcjx1bnNpZ25lZCBjaGFyPiBjb21wcmVzc2VkOworICAgICAgICBjb25zdCBp
bnQgYnVmU2l6ZSA9IDEwMjQ7CisgICAgICAgIHVuc2lnbmVkIGNoYXIgYnVmW2J1ZlNpemVdOwor
ICAgICAgICBzaXplX3QgbnVtUmVhZCA9IDA7CisgICAgICAgIHdoaWxlICgobnVtUmVhZCA9IGZy
ZWFkKGJ1ZiwgMSwgYnVmU2l6ZSwgZikpID4gMCkKKyAgICAgICAgICAgIHN0ZDo6Y29weShidWYs
ICZidWZbbnVtUmVhZF0sIHN0ZDo6YmFja19pbnNlcnRlcihjb21wcmVzc2VkKSk7CisKKyAgICAg
ICAgZmNsb3NlKGYpOworCisgICAgICAgIGlmICghUE5HQ29kZWM6OkRlY29kZSgmY29tcHJlc3Nl
ZFswXSwgY29tcHJlc3NlZC5zaXplKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQ
TkdDb2RlYzo6Rk9STUFUX1JHQkEsICZtX2RhdGEsICZtX3dpZHRoLCAmbV9oZWlnaHQpKSB7Cisg
ICAgICAgICAgICBjbGVhcigpOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9
CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIHZvaWQgY2xlYXIoKQorICAgIHsK
KyAgICAgICAgbV93aWR0aCA9IG1faGVpZ2h0ID0gMDsKKyAgICAgICAgbV9kYXRhLmNsZWFyKCk7
CisgICAgfQorCisgICAgLy8gUmV0dXJucyB0aGUgUkdCQSB2YWx1ZSBvZiB0aGUgcGl4ZWwgYXQg
dGhlIGdpdmVuIGxvY2F0aW9uCisgICAgY29uc3QgdWludDMyX3QgcGl4ZWxBdChpbnQgeCwgaW50
IHkpIGNvbnN0CisgICAgeworICAgICAgICBBU1NFUlQoeCA+PSAwICYmIHggPCBtX3dpZHRoKTsK
KyAgICAgICAgQVNTRVJUKHkgPj0gMCAmJiB5IDwgbV9oZWlnaHQpOworICAgICAgICByZXR1cm4g
KnJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDMyX3QqPigmKG1fZGF0YVsoeSAqIG1fd2lkdGgg
KyB4KSAqIDRdKSk7CisgICAgfQorCisgICAgdm9pZCBzZXRQaXhlbEF0KGludCB4LCBpbnQgeSwg
dWludDMyX3QgY29sb3IpIGNvbnN0CisgICAgeworICAgICAgICBBU1NFUlQoeCA+PSAwICYmIHgg
PCBtX3dpZHRoKTsKKyAgICAgICAgQVNTRVJUKHkgPj0gMCAmJiB5IDwgbV9oZWlnaHQpOworICAg
ICAgICB2b2lkKiBhZGRyID0gJmNvbnN0X2Nhc3Q8dW5zaWduZWQgY2hhcio+KCZtX2RhdGEuZnJv
bnQoKSlbKHkgKiBtX3dpZHRoICsgeCkgKiA0XTsKKyAgICAgICAgKnJlaW50ZXJwcmV0X2Nhc3Q8
dWludDMyX3QqPihhZGRyKSA9IGNvbG9yOworICAgIH0KKworcHJpdmF0ZToKKyAgICAvLyBwaXhl
bCBkaW1lbnNpb25zIG9mIHRoZSBpbWFnZQorICAgIGludCBtX3dpZHRoLCBtX2hlaWdodDsKKwor
ICAgIHZlY3Rvcjx1bnNpZ25lZCBjaGFyPiBtX2RhdGE7Cit9OworCitmbG9hdCBwZXJjZW50YWdl
RGlmZmVyZW50KGNvbnN0IEltYWdlJiBiYXNlbGluZSwgY29uc3QgSW1hZ2UmIGFjdHVhbCkKK3sK
KyAgICBpbnQgdyA9IG1pbihiYXNlbGluZS53aWR0aCgpLCBhY3R1YWwud2lkdGgoKSk7CisgICAg
aW50IGggPSBtaW4oYmFzZWxpbmUuaGVpZ2h0KCksIGFjdHVhbC5oZWlnaHQoKSk7CisKKyAgICAv
LyBDb21wdXRlIHBpeGVscyBkaWZmZXJlbnQgaW4gdGhlIG92ZXJsYXAKKyAgICBpbnQgcGl4ZWxz
RGlmZmVyZW50ID0gMDsKKyAgICBmb3IgKGludCB5ID0gMDsgeSA8IGg7IHkrKykgeworICAgICAg
ICBmb3IgKGludCB4ID0gMDsgeCA8IHc7IHgrKykgeworICAgICAgICAgICAgaWYgKGJhc2VsaW5l
LnBpeGVsQXQoeCwgeSkgIT0gYWN0dWFsLnBpeGVsQXQoeCwgeSkpCisgICAgICAgICAgICAgICAg
cGl4ZWxzRGlmZmVyZW50Kys7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBDb3VudCBwaXhl
bHMgdGhhdCBhcmUgYSBkaWZmZXJlbmNlIGluIHNpemUgYXMgYWxzbyBiZWluZyBkaWZmZXJlbnQK
KyAgICBpbnQgbWF4V2lkdGggPSBtYXgoYmFzZWxpbmUud2lkdGgoKSwgYWN0dWFsLndpZHRoKCkp
OworICAgIGludCBtYXhIZWlnaHQgPSBtYXgoYmFzZWxpbmUuaGVpZ2h0KCksIGFjdHVhbC5oZWln
aHQoKSk7CisKKyAgICAvLyAuLi5waXhlbHMgb2ZmIHRoZSByaWdodCBzaWRlLCBidXQgbm90IGlu
Y2x1ZGluZyB0aGUgbG93ZXIgcmlnaHQgY29ybmVyCisgICAgcGl4ZWxzRGlmZmVyZW50ICs9ICht
YXhXaWR0aCAtIHcpICogaDsKKworICAgIC8vIC4uLnBpeGVscyBhbG9uZyB0aGUgYm90dG9tLCBp
bmNsdWRpbmcgdGhlIGxvd2VyIHJpZ2h0IGNvcm5lcgorICAgIHBpeGVsc0RpZmZlcmVudCArPSAo
bWF4SGVpZ2h0IC0gaCkgKiBtYXhXaWR0aDsKKworICAgIC8vIExpa2UgdGhlIFdlYktpdCBJbWFn
ZURpZmYgdG9vbCwgd2UgZGVmaW5lIHBlcmNlbnRhZ2UgZGlmZmVyZW50IGluIHRlcm1zCisgICAg
Ly8gb2YgdGhlIHNpemUgb2YgdGhlICdhY3R1YWwnIGJpdG1hcC4KKyAgICBmbG9hdCB0b3RhbFBp
eGVscyA9IHN0YXRpY19jYXN0PGZsb2F0PihhY3R1YWwud2lkdGgoKSkgKiBzdGF0aWNfY2FzdDxm
bG9hdD4oYWN0dWFsLmhlaWdodCgpKTsKKyAgICBpZiAoIXRvdGFsUGl4ZWxzKQorICAgICAgICBy
ZXR1cm4gMTAwLjBmOyAvLyBXaGVuIHRoZSBiaXRtYXAgaXMgZW1wdHksIHRoZXkgYXJlIDEwMCUg
ZGlmZmVyZW50LgorICAgIHJldHVybiBzdGF0aWNfY2FzdDxmbG9hdD4ocGl4ZWxzRGlmZmVyZW50
KSAvIHRvdGFsUGl4ZWxzICogMTAwOworfQorCit2b2lkIHByaW50SGVscCgpCit7CisgICAgZnBy
aW50ZihzdGRlcnIsCisgICAgICAgICAgICAiVXNhZ2U6XG4iCisgICAgICAgICAgICAiICBJbWFn
ZURpZmYgPGNvbXBhcmUgZmlsZT4gPHJlZmVyZW5jZSBmaWxlPlxuIgorICAgICAgICAgICAgIiAg
ICBDb21wYXJlcyB0d28gZmlsZXMgb24gZGlzaywgcmV0dXJuaW5nIDAgd2hlbiB0aGV5IGFyZSB0
aGUgc2FtZVxuIgorICAgICAgICAgICAgIiAgSW1hZ2VEaWZmIC0tdXNlLXN0ZGluXG4iCisgICAg
ICAgICAgICAiICAgIFN0YXlzIG9wZW4gcmVhZGluZyBwYWlycyBvZiBmaWxlbmFtZXMgZnJvbSBz
dGRpbiwgY29tcGFyaW5nIHRoZW0sXG4iCisgICAgICAgICAgICAiICAgIGFuZCBzZW5kaW5nIDAg
dG8gc3Rkb3V0IHdoZW4gdGhleSBhcmUgdGhlIHNhbWVcbiIKKyAgICAgICAgICAgICIgIEltYWdl
RGlmZiAtLWRpZmYgPGNvbXBhcmUgZmlsZT4gPHJlZmVyZW5jZSBmaWxlPiA8b3V0cHV0IGZpbGU+
XG4iCisgICAgICAgICAgICAiICAgIENvbXBhcmVzIHR3byBmaWxlcyBvbiBkaXNrLCBvdXRwdXRz
IGFuIGltYWdlIHRoYXQgdmlzdWFsaXplcyB0aGUiCisgICAgICAgICAgICAiICAgIGRpZmZlcmVu
Y2UgdG8gPG91dHB1dCBmaWxlPlxuIik7CisgICAgLyogRm9yIHVuZmluaXNoZWQgd2Via2l0LWxp
a2UtbW9kZSAoc2VlIGJlbG93KQorICAgICAgICJcbiIKKyAgICAgICAiICBJbWFnZURpZmYgLXNc
biIKKyAgICAgICAiICAgIFJlYWRzIHN0cmVhbSBpbnB1dCBmcm9tIHN0ZGluLCBzaG91bGQgYmUg
RVhBQ1RMWSBvZiB0aGUgZm9ybWF0XG4iCisgICAgICAgIiAgICBcIkNvbnRlbnQtbGVuZ3RoOiA8
Ynl0ZSBsZW5ndGg+IDxkYXRhPkNvbnRlbnQtbGVuZ3RoOiAuLi5cbiIKKyAgICAgICAiICAgIGl0
IHdpbGwgdGFrZSBhcyBtYW55IGZpbGUgcGFpcnMgYXMgZ2l2ZW4sIGFuZCB3aWxsIGNvbXBhcmUg
dGhlbSBhc1xuIgorICAgICAgICIgICAgKGNtcF9maWxlLCByZWZlcmVuY2VfZmlsZSkgcGFpcnNc
biIpOworICAgICovCit9CisKK2ludCBjb21wYXJlSW1hZ2VzKGNvbnN0IGNoYXIqIGZpbGUxLCBj
b25zdCBjaGFyKiBmaWxlMikKK3sKKyAgICBJbWFnZSBhY3R1YWxJbWFnZTsKKyAgICBJbWFnZSBi
YXNlbGluZUltYWdlOworCisgICAgaWYgKCFhY3R1YWxJbWFnZS5jcmVhdGVGcm9tRmlsZW5hbWUo
ZmlsZTEpKSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiSW1hZ2VEaWZmOiBVbmFibGUgdG8g
b3BlbiBmaWxlIFwiJXNcIlxuIiwgZmlsZTEpOworICAgICAgICByZXR1cm4gc3RhdHVzRXJyb3I7
CisgICAgfQorICAgIGlmICghYmFzZWxpbmVJbWFnZS5jcmVhdGVGcm9tRmlsZW5hbWUoZmlsZTIp
KSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiSW1hZ2VEaWZmOiBVbmFibGUgdG8gb3BlbiBm
aWxlIFwiJXNcIlxuIiwgZmlsZTIpOworICAgICAgICByZXR1cm4gc3RhdHVzRXJyb3I7CisgICAg
fQorCisgICAgZmxvYXQgcGVyY2VudCA9IHBlcmNlbnRhZ2VEaWZmZXJlbnQoYWN0dWFsSW1hZ2Us
IGJhc2VsaW5lSW1hZ2UpOworICAgIGlmIChwZXJjZW50ID4gMC4wKSB7CisgICAgICAgIC8vIGZh
aWx1cmU6IFRoZSBXZWJLaXQgdmVyc2lvbiBhbHNvIHdyaXRlcyB0aGUgZGlmZmVyZW5jZSBpbWFn
ZSB0bworICAgICAgICAvLyBzdGRvdXQsIHdoaWNoIHNlZW1zIGV4Y2Vzc2l2ZSBmb3Igb3VyIG5l
ZWRzLgorICAgICAgICBwcmludGYoImRpZmY6ICUwMS4yZiUlIGZhaWxlZFxuIiwgcGVyY2VudCk7
CisgICAgICAgIHJldHVybiBzdGF0dXNEaWZmZXJlbnQ7CisgICAgfQorCisgICAgLy8gc3VjY2Vz
cworICAgIHByaW50ZigiZGlmZjogJTAxLjJmJSUgcGFzc2VkXG4iLCBwZXJjZW50KTsKKyAgICBy
ZXR1cm4gc3RhdHVzU2FtZTsKKworfQorCisvLyBVbnRlc3RlZCBtb2RlIHRoYXQgYWN0cyBsaWtl
IFdlYktpdCdzIGltYWdlIGNvbXBhcmF0b3IuIEkgd3JvdGUgdGhpcyBidXQKKy8vIGRlY2lkZWQg
aXQncyB0b28gY29tcGxpY2F0ZWQuIFdlIG1heSB1c2UgaXQgaW4gdGhlIGZ1dHVyZSBpZiBpdCBs
b29rcyB1c2VmdWwuCitpbnQgdW50ZXN0ZWRDb21wYXJlSW1hZ2VzKCkKK3sKKyAgICBJbWFnZSBh
Y3R1YWxJbWFnZTsKKyAgICBJbWFnZSBiYXNlbGluZUltYWdlOworICAgIGNoYXIgYnVmZmVyWzIw
NDhdOworICAgIHdoaWxlIChmZ2V0cyhidWZmZXIsIHNpemVvZihidWZmZXIpLCBzdGRpbikpIHsK
KyAgICAgICAgaWYgKCFzdHJuY21wKCJDb250ZW50LWxlbmd0aDogIiwgYnVmZmVyLCAxNikpIHsK
KyAgICAgICAgICAgIGNoYXIqIGNvbnRleHQ7CisjaWYgT1MoV0lORE9XUykKKyAgICAgICAgICAg
IHN0cnRva19zKGJ1ZmZlciwgIiAiLCAmY29udGV4dCk7CisgICAgICAgICAgICBpbnQgaW1hZ2VT
aXplID0gc3RydG9sKHN0cnRva19zKDAsICIgIiwgJmNvbnRleHQpLCAwLCAxMCk7CisjZWxzZQor
ICAgICAgICAgICAgc3RydG9rX3IoYnVmZmVyLCAiICIsICZjb250ZXh0KTsKKyAgICAgICAgICAg
IGludCBpbWFnZVNpemUgPSBzdHJ0b2woc3RydG9rX3IoMCwgIiAiLCAmY29udGV4dCksIDAsIDEw
KTsKKyNlbmRpZgorCisgICAgICAgICAgICBib29sIHN1Y2Nlc3MgPSBmYWxzZTsKKyAgICAgICAg
ICAgIGlmIChpbWFnZVNpemUgPiAwICYmICFhY3R1YWxJbWFnZS5oYXNJbWFnZSgpKSB7CisgICAg
ICAgICAgICAgICAgaWYgKCFhY3R1YWxJbWFnZS5jcmFldGVGcm9tU3RkaW4oaW1hZ2VTaXplKSkg
eworICAgICAgICAgICAgICAgICAgICBmcHV0cygiRXJyb3IsIGlucHV0IGltYWdlIGNhbid0IGJl
IGRlY29kZWQuXG4iLCBzdGRlcnIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gMTsKKyAg
ICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgaWYgKGltYWdlU2l6ZSA+IDAgJiYg
IWJhc2VsaW5lSW1hZ2UuaGFzSW1hZ2UoKSkgeworICAgICAgICAgICAgICAgIGlmICghYmFzZWxp
bmVJbWFnZS5jcmFldGVGcm9tU3RkaW4oaW1hZ2VTaXplKSkgeworICAgICAgICAgICAgICAgICAg
ICBmcHV0cygiRXJyb3IsIGJhc2VsaW5lIGltYWdlIGNhbid0IGJlIGRlY29kZWQuXG4iLCBzdGRl
cnIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgICAgICAgICB9Cisg
ICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGZwdXRzKCJFcnJvciwgaW1hZ2Ug
c2l6ZSBtdXN0IGJlIHNwZWNpZmllZC5cbiIsIHN0ZGVycik7CisgICAgICAgICAgICAgICAgcmV0
dXJuIDE7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAoYWN0dWFsSW1h
Z2UuaGFzSW1hZ2UoKSAmJiBiYXNlbGluZUltYWdlLmhhc0ltYWdlKCkpIHsKKyAgICAgICAgICAg
IGZsb2F0IHBlcmNlbnQgPSBwZXJjZW50YWdlRGlmZmVyZW50KGFjdHVhbEltYWdlLCBiYXNlbGlu
ZUltYWdlKTsKKyAgICAgICAgICAgIGlmIChwZXJjZW50ID4gMC4wKSB7CisgICAgICAgICAgICAg
ICAgLy8gZmFpbHVyZTogVGhlIFdlYktpdCB2ZXJzaW9uIGFsc28gd3JpdGVzIHRoZSBkaWZmZXJl
bmNlIGltYWdlIHRvCisgICAgICAgICAgICAgICAgLy8gc3Rkb3V0LCB3aGljaCBzZWVtcyBleGNl
c3NpdmUgZm9yIG91ciBuZWVkcy4KKyAgICAgICAgICAgICAgICBwcmludGYoImRpZmY6ICUwMS4y
ZiUlIGZhaWxlZFxuIiwgcGVyY2VudCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAg
ICAgICAgIC8vIHN1Y2Nlc3MKKyAgICAgICAgICAgICAgICBwcmludGYoImRpZmY6ICUwMS4yZiUl
IHBhc3NlZFxuIiwgcGVyY2VudCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBhY3R1YWxJ
bWFnZS5jbGVhcigpOworICAgICAgICAgICAgYmFzZWxpbmVJbWFnZS5jbGVhcigpOworICAgICAg
ICB9CisgICAgICAgIGZmbHVzaChzdGRvdXQpOworICAgIH0KKyAgICByZXR1cm4gMDsKK30KKwor
Ym9vbCBjcmVhdGVJbWFnZURpZmYoY29uc3QgSW1hZ2UmIGltYWdlMSwgY29uc3QgSW1hZ2UmIGlt
YWdlMiwgSW1hZ2UqIG91dCkKK3sKKyAgICBpbnQgdyA9IG1pbihpbWFnZTEud2lkdGgoKSwgaW1h
Z2UyLndpZHRoKCkpOworICAgIGludCBoID0gbWluKGltYWdlMS5oZWlnaHQoKSwgaW1hZ2UyLmhl
aWdodCgpKTsKKyAgICAqb3V0ID0gSW1hZ2UoaW1hZ2UxKTsKKyAgICBib29sIHNhbWUgPSAoaW1h
Z2UxLndpZHRoKCkgPT0gaW1hZ2UyLndpZHRoKCkpICYmIChpbWFnZTEuaGVpZ2h0KCkgPT0gaW1h
Z2UyLmhlaWdodCgpKTsKKworICAgIC8vIEZJWE1FOiBkbyBzb21ldGhpbmcgd2l0aCB0aGUgZXh0
cmEgcGl4ZWxzIGlmIHRoZSBpbWFnZSBzaXplcyBhcmUgZGlmZmVyZW50LgorICAgIGZvciAoaW50
IHkgPSAwOyB5IDwgaDsgeSsrKSB7CisgICAgICAgIGZvciAoaW50IHggPSAwOyB4IDwgdzsgeCsr
KSB7CisgICAgICAgICAgICB1aW50MzJfdCBiYXNlUGl4ZWwgPSBpbWFnZTEucGl4ZWxBdCh4LCB5
KTsKKyAgICAgICAgICAgIGlmIChiYXNlUGl4ZWwgIT0gaW1hZ2UyLnBpeGVsQXQoeCwgeSkpIHsK
KyAgICAgICAgICAgICAgICAvLyBTZXQgZGlmZmVyaW5nIHBpeGVscyByZWQuCisgICAgICAgICAg
ICAgICAgb3V0LT5zZXRQaXhlbEF0KHgsIHksIHJnYmFSZWQgfCByZ2JhQWxwaGEpOworICAgICAg
ICAgICAgICAgIHNhbWUgPSBmYWxzZTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAg
ICAgICAgLy8gU2V0IHNhbWUgcGl4ZWxzIGFzIGZhZGVkLgorICAgICAgICAgICAgICAgIHVpbnQz
Ml90IGFscGhhID0gYmFzZVBpeGVsICYgcmdiYUFscGhhOworICAgICAgICAgICAgICAgIHVpbnQz
Ml90IG5ld1BpeGVsID0gYmFzZVBpeGVsIC0gKChhbHBoYSAvIDIpICYgcmdiYUFscGhhKTsKKyAg
ICAgICAgICAgICAgICBvdXQtPnNldFBpeGVsQXQoeCwgeSwgbmV3UGl4ZWwpOworICAgICAgICAg
ICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIHNhbWU7Cit9CisKK3N0YXRpYyBi
b29sIHdyaXRlRmlsZShjb25zdCBjaGFyKiBvdXRGaWxlLCBjb25zdCB1bnNpZ25lZCBjaGFyKiBk
YXRhLCBzaXplX3QgZGF0YVNpemUpCit7CisgICAgRklMRSogZmlsZSA9IGZvcGVuKG91dEZpbGUs
ICJ3YiIpOworICAgIGlmICghZmlsZSkgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkltYWdl
RGlmZjogVW5hYmxlIHRvIGNyZWF0ZSBmaWxlIFwiJXNcIlxuIiwgZmlsZSk7CisgICAgICAgIHJl
dHVybiBmYWxzZTsKKyAgICB9CisgICAgaWYgKGRhdGFTaXplICE9IGZ3cml0ZShkYXRhLCAxLCBk
YXRhU2l6ZSwgZmlsZSkpIHsKKyAgICAgICAgZmNsb3NlKGZpbGUpOworICAgICAgICBmcHJpbnRm
KHN0ZGVyciwgIkltYWdlRGlmZjogVW5hYmxlIHRvIHdyaXRlIGRhdGEgdG8gZmlsZSBcIiVzXCJc
biIsIGZpbGUpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIGZjbG9zZShmaWxl
KTsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworaW50IGRpZmZJbWFnZXMoY29uc3QgY2hhciogZmls
ZTEsIGNvbnN0IGNoYXIqIGZpbGUyLCBjb25zdCBjaGFyKiBvdXRGaWxlKQoreworICAgIEltYWdl
IGFjdHVhbEltYWdlOworICAgIEltYWdlIGJhc2VsaW5lSW1hZ2U7CisKKyAgICBpZiAoIWFjdHVh
bEltYWdlLmNyZWF0ZUZyb21GaWxlbmFtZShmaWxlMSkpIHsKKyAgICAgICAgZnByaW50ZihzdGRl
cnIsICJJbWFnZURpZmY6IFVuYWJsZSB0byBvcGVuIGZpbGUgXCIlc1wiXG4iLCBmaWxlMSk7Cisg
ICAgICAgIHJldHVybiBzdGF0dXNFcnJvcjsKKyAgICB9CisgICAgaWYgKCFiYXNlbGluZUltYWdl
LmNyZWF0ZUZyb21GaWxlbmFtZShmaWxlMikpIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJJ
bWFnZURpZmY6IFVuYWJsZSB0byBvcGVuIGZpbGUgXCIlc1wiXG4iLCBmaWxlMik7CisgICAgICAg
IHJldHVybiBzdGF0dXNFcnJvcjsKKyAgICB9CisKKyAgICBJbWFnZSBkaWZmSW1hZ2U7CisgICAg
Ym9vbCBzYW1lID0gY3JlYXRlSW1hZ2VEaWZmKGJhc2VsaW5lSW1hZ2UsIGFjdHVhbEltYWdlLCAm
ZGlmZkltYWdlKTsKKyAgICBpZiAoc2FtZSkKKyAgICAgICAgcmV0dXJuIHN0YXR1c1NhbWU7CisK
KyAgICB2ZWN0b3I8dW5zaWduZWQgY2hhcj4gcG5nRGF0YTsKKyAgICBQTkdDb2RlYzo6RW5jb2Rl
KGRpZmZJbWFnZS5kYXRhKCksIFBOR0NvZGVjOjpGT1JNQVRfUkdCQSwgZGlmZkltYWdlLndpZHRo
KCksCisgICAgICAgICAgICAgICAgICAgICBkaWZmSW1hZ2UuaGVpZ2h0KCksIGRpZmZJbWFnZS53
aWR0aCgpICogNCwgZmFsc2UsICZwbmdEYXRhKTsKKyAgICBpZiAoIXdyaXRlRmlsZShvdXRGaWxl
LCAmcG5nRGF0YS5mcm9udCgpLCBwbmdEYXRhLnNpemUoKSkpCisgICAgICAgIHJldHVybiBzdGF0
dXNFcnJvcjsKKyAgICByZXR1cm4gc3RhdHVzRGlmZmVyZW50OworfQorCitpbnQgbWFpbihpbnQg
YXJnYywgY29uc3QgY2hhciogYXJndltdKQoreworICAgIFZlY3Rvcjxjb25zdCBjaGFyKj4gdmFs
dWVzOworICAgIGJvb2wgcG9sbFN0ZGluID0gZmFsc2U7CisgICAgYm9vbCBnZW5lcmF0ZURpZmYg
PSBmYWxzZTsKKyAgICBmb3IgKGludCBpID0gMTsgaSA8IGFyZ2M7ICsraSkgeworICAgICAgICBp
ZiAoIXN0cmNtcChhcmd2W2ldLCBvcHRpb25Qb2xsU3RkaW4pKQorICAgICAgICAgICAgcG9sbFN0
ZGluID0gdHJ1ZTsKKyAgICAgICAgZWxzZSBpZiAoIXN0cmNtcChhcmd2W2ldLCBvcHRpb25HZW5l
cmF0ZURpZmYpKQorICAgICAgICAgICAgZ2VuZXJhdGVEaWZmID0gdHJ1ZTsKKyAgICAgICAgZWxz
ZQorICAgICAgICAgICAgdmFsdWVzLmFwcGVuZChhcmd2W2ldKTsKKyAgICB9CisKKyAgICBpZiAo
cG9sbFN0ZGluKSB7CisgICAgICAgIC8vIFdhdGNoIHN0ZGluIGZvciBmaWxlbmFtZXMuCisgICAg
ICAgIGNvbnN0IHNpemVfdCBidWZmZXJTaXplID0gUEFUSF9NQVg7CisgICAgICAgIGNoYXIgc3Rk
aW5CdWZmZXJbYnVmZmVyU2l6ZV07CisgICAgICAgIGNoYXIgZmlyc3ROYW1lW2J1ZmZlclNpemVd
OworICAgICAgICBib29sIGhhdmVGaXJzdE5hbWUgPSBmYWxzZTsKKyAgICAgICAgd2hpbGUgKGZn
ZXRzKHN0ZGluQnVmZmVyLCBidWZmZXJTaXplLCBzdGRpbikpIHsKKyAgICAgICAgICAgIGlmICgh
c3RkaW5CdWZmZXJbMF0pCisgICAgICAgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgICAg
IGlmIChoYXZlRmlyc3ROYW1lKSB7CisgICAgICAgICAgICAgICAgLy8gY29tcGFyZUltYWdlcyB3
cml0ZXMgcmVzdWx0cyB0byBzdGRvdXQgdW5sZXNzIGFuIGVycm9yIG9jY3VycmVkLgorICAgICAg
ICAgICAgICAgIGlmIChjb21wYXJlSW1hZ2VzKGZpcnN0TmFtZSwgc3RkaW5CdWZmZXIpID09IHN0
YXR1c0Vycm9yKQorICAgICAgICAgICAgICAgICAgICBwcmludGYoImVycm9yXG4iKTsKKyAgICAg
ICAgICAgICAgICBmZmx1c2goc3Rkb3V0KTsKKyAgICAgICAgICAgICAgICBoYXZlRmlyc3ROYW1l
ID0gZmFsc2U7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIC8vIFNhdmUg
dGhlIGZpcnN0IGZpbGVuYW1lIGluIGFub3RoZXIgYnVmZmVyIGFuZCB3YWl0IGZvciB0aGUgc2Vj
b25kCisgICAgICAgICAgICAgICAgLy8gZmlsZW5hbWUgdG8gYXJyaXZlIHZpYSBzdGRpbi4KKyAg
ICAgICAgICAgICAgICBzdHJjcHkoZmlyc3ROYW1lLCBzdGRpbkJ1ZmZlcik7CisgICAgICAgICAg
ICAgICAgaGF2ZUZpcnN0TmFtZSA9IHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAg
ICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgaWYgKGdlbmVyYXRlRGlmZikgeworICAgICAg
ICBpZiAodmFsdWVzLnNpemUoKSA9PSAzKQorICAgICAgICAgICAgcmV0dXJuIGRpZmZJbWFnZXMo
dmFsdWVzWzBdLCB2YWx1ZXNbMV0sIHZhbHVlc1syXSk7CisgICAgfSBlbHNlIGlmICh2YWx1ZXMu
c2l6ZSgpID09IDIpCisgICAgICAgIHJldHVybiBjb21wYXJlSW1hZ2VzKGFyZ3ZbMV0sIGFyZ3Zb
Ml0pOworCisgICAgcHJpbnRIZWxwKCk7CisgICAgcmV0dXJuIHN0YXR1c0Vycm9yOworfQpkaWZm
IC0tZ2l0IGEvV2ViS2l0VG9vbHMvU2NyaXB0cy93ZWJraXRweS9sYXlvdXRfdGVzdHMvcG9ydC9j
aHJvbWl1bV9tYWMucHkgYi9XZWJLaXRUb29scy9TY3JpcHRzL3dlYmtpdHB5L2xheW91dF90ZXN0
cy9wb3J0L2Nocm9taXVtX21hYy5weQppbmRleCA1NzBlYjFjLi5kNWUxNzU3IDEwMDY0NAotLS0g
YS9XZWJLaXRUb29scy9TY3JpcHRzL3dlYmtpdHB5L2xheW91dF90ZXN0cy9wb3J0L2Nocm9taXVt
X21hYy5weQorKysgYi9XZWJLaXRUb29scy9TY3JpcHRzL3dlYmtpdHB5L2xheW91dF90ZXN0cy9w
b3J0L2Nocm9taXVtX21hYy5weQpAQCAtMTU3LDEwICsxNTcsMTAgQEAgY2xhc3MgQ2hyb21pdW1N
YWNQb3J0KGNocm9taXVtLkNocm9taXVtUG9ydCk6CiAgICAgICAgIHJldHVybiBzZWxmLl9idWls
ZF9wYXRoKHNlbGYuX29wdGlvbnMuY29uZmlndXJhdGlvbiwgYmluYXJ5X25hbWUpCiAKICAgICBk
ZWYgX3BhdGhfdG9faW1hZ2VfZGlmZihzZWxmKToKKyAgICAgICAgYmluYXJ5X25hbWUgPSAnaW1h
Z2VfZGlmZicKICAgICAgICAgaWYgc2VsZi5fb3B0aW9ucy51c2VfZHJ0OgotICAgICAgICAgICAg
IyBGSVhNRSh0b255KTogVGhpcyBzaG91bGQgdXNlIEltYWdlRGlmZi4KLSAgICAgICAgICAgIHJl
dHVybiAnJwotICAgICAgICByZXR1cm4gc2VsZi5fYnVpbGRfcGF0aChzZWxmLl9vcHRpb25zLmNv
bmZpZ3VyYXRpb24sICdpbWFnZV9kaWZmJykKKyAgICAgICAgICAgIGJpbmFyeV9uYW1lID0gJ0lt
YWdlRGlmZicKKyAgICAgICAgcmV0dXJuIHNlbGYuX2J1aWxkX3BhdGgoc2VsZi5fb3B0aW9ucy5j
b25maWd1cmF0aW9uLCBiaW5hcnlfbmFtZSkKIAogICAgIGRlZiBfcGF0aF90b193ZGlmZihzZWxm
KToKICAgICAgICAgcmV0dXJuICd3ZGlmZicK
</data>

          </attachment>
      

    </bug>

</bugzilla>