<?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>14060</bug_id>
          
          <creation_ts>2007-06-10 01:03:51 -0700</creation_ts>
          <short_desc>[CAIRO] SVG support</short_desc>
          <delta_ts>2007-06-13 13:51:09 -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>523.x (Safari 3)</version>
          <rep_platform>All</rep_platform>
          <op_sys>All</op_sys>
          <bug_status>RESOLVED</bug_status>
          <resolution>FIXED</resolution>
          
          
          <bug_file_loc></bug_file_loc>
          <status_whiteboard></status_whiteboard>
          <keywords></keywords>
          <priority>P2</priority>
          <bug_severity>Normal</bug_severity>
          <target_milestone>---</target_milestone>
          
          
          <everconfirmed>1</everconfirmed>
          <reporter name="Alp Toker">alp</reporter>
          <assigned_to name="Alp Toker">alp</assigned_to>
          
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>8010</commentid>
    <comment_count>0</comment_count>
    <who name="Alp Toker">alp</who>
    <bug_when>2007-06-10 01:03:51 -0700</bug_when>
    <thetext>Now that the known issues in the Cairo graphics backend have been fixed, it is possible to provide SVG support using Cairo.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>7699</commentid>
    <comment_count>1</comment_count>
      <attachid>15001</attachid>
    <who name="Alp Toker">alp</who>
    <bug_when>2007-06-13 07:45:06 -0700</bug_when>
    <thetext>Created attachment 15001
Cairo SVG support

 ChangeLog                                                   |   29 ++
 WebCore.pro                                                 |   15 +
 platform/graphics/svg/SVGPaintServerPattern.h               |    2 
 platform/graphics/svg/SVGPaintServerSolid.h                 |    2 
 platform/graphics/svg/cairo/RenderPathCairo.cpp             |   58 +++++
 platform/graphics/svg/cairo/SVGPaintServerCairo.cpp         |   71 +++++++
 platform/graphics/svg/cairo/SVGPaintServerGradientCairo.cpp |  118 ++++++++++++
 platform/graphics/svg/cairo/SVGPaintServerPatternCairo.cpp  |   42 ++++
 platform/graphics/svg/cairo/SVGPaintServerSolidCairo.cpp    |   78 +++++++
 platform/graphics/svg/cairo/SVGResourceClipperCairo.cpp     |   69 +++++++
 platform/graphics/svg/cairo/SVGResourceMaskerCairo.cpp      |   50 +++++
 11 files changed, 532 insertions(+), 2 deletions(-)


Support is fairly complete except for gradients, but there are still some TODOs and extensive testing against the SVG test suite is still needed.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>7679</commentid>
    <comment_count>2</comment_count>
      <attachid>15001</attachid>
    <who name="Rob Buis">rwlbuis</who>
    <bug_when>2007-06-13 10:17:44 -0700</bug_when>
    <thetext>Comment on attachment 15001
Cairo SVG support


&gt;+
&gt;+        if (boundingBoxMode()) {
&gt;+            // TODO: use RenderPathCairo&apos;s strokeBBox?
&gt;+            double x1, y1, x2, y2;
&gt;+            cairo_fill_extents(cr, &amp;x1, &amp;y1, &amp;x2, &amp;y2);
&gt;+            cairo_matrix_translate(&amp;matrix, x1, y1);
&gt;+            cairo_matrix_scale(&amp;matrix, x2 - x1, y2 - y1);
&gt;+            cairo_matrix_multiply(&amp;matrix, &amp;matrix, &amp;gradient_matrix);
&gt;+            cairo_matrix_invert(&amp;matrix);
&gt;+        {
&gt;+        double x0, x1, y0, y1;
&gt;+            x0 = linear-&gt;gradientStart().x();
&gt;+            y0 = linear-&gt;gradientStart().y();
&gt;+            x1 = linear-&gt;gradientEnd().x();
&gt;+            y1 = linear-&gt;gradientEnd().y();
&gt;+            pattern = cairo_pattern_create_linear(x0, y0, x1, y1);
&gt;+        }
&gt;+        } else return false;

I can&apos;t tell what is going on there, do you mean a if/ilse? If it is an anonymous block, that is hard to read, please rewrite so it doesnt have one.

&gt;+        delete dsh;

Should use delete[].


&gt;+        if(path.isEmpty())
&gt;+    if(!surface)

Style issues.

So all issues need fixing.
Cheers,

Rob.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>7667</commentid>
    <comment_count>3</comment_count>
      <attachid>15003</attachid>
    <who name="Alp Toker">alp</who>
    <bug_when>2007-06-13 11:05:41 -0700</bug_when>
    <thetext>Created attachment 15003
Cairo SVG support, take two

This patch addresses the style concerns in the review plus a couple of cleanups.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>7664</commentid>
    <comment_count>4</comment_count>
      <attachid>15003</attachid>
    <who name="Rob Buis">rwlbuis</who>
    <bug_when>2007-06-13 11:17:05 -0700</bug_when>
    <thetext>Comment on attachment 15003
Cairo SVG support, take two

Its fine. One minor thing, you may want to lose x0, x1, y0, y1 and just write out the calls, but its a preference thing I think.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>7663</commentid>
    <comment_count>5</comment_count>
    <who name="Alp Toker">alp</who>
    <bug_when>2007-06-13 11:29:38 -0700</bug_when>
    <thetext>(In reply to comment #4)
&gt; (From update of attachment 15003 [edit])
&gt; Its fine. One minor thing, you may want to lose x0, x1, y0, y1 and just write
&gt; out the calls, but its a preference thing I think.
&gt; 

I&apos;m OK with it as-is for now. The gradient code will be re-visited soon anyway, as it still needs work and probably won&apos;t look like this when it&apos;s finished.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>7657</commentid>
    <comment_count>6</comment_count>
    <who name="Mark Rowe (bdash)">mrowe</who>
    <bug_when>2007-06-13 13:51:09 -0700</bug_when>
    <thetext>Landed in r23507.</thetext>
  </long_desc>
      
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>15001</attachid>
            <date>2007-06-13 07:45:06 -0700</date>
            <delta_ts>2007-06-13 11:05:41 -0700</delta_ts>
            <desc>Cairo SVG support</desc>
            <filename>cairo-svg.patch</filename>
            <type>text/plain</type>
            <size>25908</size>
            <attacher name="Alp Toker">alp</attacher>
            
              <data encoding="base64">SW5kZXg6IFdlYkNvcmUvQ2hhbmdlTG9nCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvQ2hhbmdlTG9n
CShyZXZpc2lvbiAyMzUwMikKKysrIFdlYkNvcmUvQ2hhbmdlTG9nCSh3b3JraW5nIGNvcHkpCkBA
IC0xLDMgKzEsMzIgQEAKKzIwMDctMDYtMTMgIEFscCBUb2tlciAgPGFscC50b2tlckBjb2xsYWJv
cmEuY28udWs+CisKKyAgICAgICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChPT1BTISkuCisKKyAgICAg
ICAgaHR0cDovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MTQwNjAKKyAgICAgICAg
Q2Fpcm8gU1ZHIHN1cHBvcnQKKworICAgICAgICAqIFdlYkNvcmUucHJvOiBBZGQgbmV3IGZpbGVz
IHRvIHRoZSBidWlsZC4KKyAgICAgICAgKiBwbGF0Zm9ybS9ncmFwaGljcy9zdmcvU1ZHUGFpbnRT
ZXJ2ZXJQYXR0ZXJuLmg6CisgICAgICAgICogcGxhdGZvcm0vZ3JhcGhpY3Mvc3ZnL1NWR1BhaW50
U2VydmVyU29saWQuaDoKKyAgICAgICAgKiBwbGF0Zm9ybS9ncmFwaGljcy9zdmcvY2Fpcm86IEFk
ZGVkLgorICAgICAgICAqIHBsYXRmb3JtL2dyYXBoaWNzL3N2Zy9jYWlyby9SZW5kZXJQYXRoQ2Fp
cm8uY3BwOiBBZGRlZC4KKyAgICAgICAgKFdlYkNvcmU6OlJlbmRlclBhdGg6OnN0cm9rZUNvbnRh
aW5zKToKKyAgICAgICAgKFdlYkNvcmU6OlJlbmRlclBhdGg6OnN0cm9rZUJCb3gpOgorICAgICAg
ICAqIHBsYXRmb3JtL2dyYXBoaWNzL3N2Zy9jYWlyby9TVkdQYWludFNlcnZlckNhaXJvLmNwcDog
QWRkZWQuCisgICAgICAgIChXZWJDb3JlOjpTVkdQYWludFNlcnZlcjo6ZHJhdyk6CisgICAgICAg
IChXZWJDb3JlOjpTVkdQYWludFNlcnZlcjo6dGVhcmRvd24pOgorICAgICAgICAoV2ViQ29yZTo6
U1ZHUGFpbnRTZXJ2ZXI6OnJlbmRlclBhdGgpOgorICAgICAgICAqIHBsYXRmb3JtL2dyYXBoaWNz
L3N2Zy9jYWlyby9TVkdQYWludFNlcnZlckdyYWRpZW50Q2Fpcm8uY3BwOiBBZGRlZC4KKyAgICAg
ICAgKFdlYkNvcmU6OlNWR1BhaW50U2VydmVyR3JhZGllbnQ6OnNldHVwKToKKyAgICAgICAgKiBw
bGF0Zm9ybS9ncmFwaGljcy9zdmcvY2Fpcm8vU1ZHUGFpbnRTZXJ2ZXJQYXR0ZXJuQ2Fpcm8uY3Bw
OiBBZGRlZC4KKyAgICAgICAgKFdlYkNvcmU6OlNWR1BhaW50U2VydmVyUGF0dGVybjo6c2V0dXAp
OgorICAgICAgICAqIHBsYXRmb3JtL2dyYXBoaWNzL3N2Zy9jYWlyby9TVkdQYWludFNlcnZlclNv
bGlkQ2Fpcm8uY3BwOiBBZGRlZC4KKyAgICAgICAgKFdlYkNvcmU6OlNWR1BhaW50U2VydmVyU29s
aWQ6OnNldHVwKToKKyAgICAgICAgKiBwbGF0Zm9ybS9ncmFwaGljcy9zdmcvY2Fpcm8vU1ZHUmVz
b3VyY2VDbGlwcGVyQ2Fpcm8uY3BwOiBBZGRlZC4KKyAgICAgICAgKFdlYkNvcmU6OlNWR1Jlc291
cmNlQ2xpcHBlcjo6YXBwbHlDbGlwKToKKyAgICAgICAgKiBwbGF0Zm9ybS9ncmFwaGljcy9zdmcv
Y2Fpcm8vU1ZHUmVzb3VyY2VNYXNrZXJDYWlyby5jcHA6IEFkZGVkLgorICAgICAgICAoV2ViQ29y
ZTo6U1ZHUmVzb3VyY2VNYXNrZXI6OmFwcGx5TWFzayk6CisKIDIwMDctMDYtMTMgIEFkYW0gUm9i
ZW4gIDxhcm9iZW5AYXBwbGUuY29tPgogCiAgICAgICAgIEZpeCBvbmUgbW9yZSBCSVRNQVBJTkZP
L0JJVE1BUElORk9IRUFERVIgdHlwby4KSW5kZXg6IFdlYkNvcmUvV2ViQ29yZS5wcm8KPT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PQotLS0gV2ViQ29yZS9XZWJDb3JlLnBybwkocmV2aXNpb24gMjM1MDIpCisrKyBXZWJDb3Jl
L1dlYkNvcmUucHJvCSh3b3JraW5nIGNvcHkpCkBAIC00Nyw2ICs0Nyw3IEBAIERFRklORVMgKz0g
RU5BQkxFX1hQQVRIPTEKIERFRklORVMgKz0gRU5BQkxFX1hTTFQ9MQogI0RFRklORVMgKz0gRU5B
QkxFX1hCTD0xCiBxdC1wb3J0OkRFRklORVMgKz0gRU5BQkxFX1NWRz0xCitnZGstcG9ydDpERUZJ
TkVTICs9IEVOQUJMRV9TVkc9MQogCiBERUZJTkVTICs9IFdURl9DSEFOR0VTPTEKIApAQCAtNzcs
NiArNzgsNyBAQCBERVBFTkRQQVRIICs9IGVkaXRpbmcvcXQgaGlzdG9yeS9xdCBsb2FkCiB9CiAK
IGdkay1wb3J0OklOQ0xVREVQQVRIICs9IFwKKyAgICAkJFBXRC9wbGF0Zm9ybS9ncmFwaGljcy9z
dmcvY2Fpcm8gXAogICAgICQkUFdEL3BsYXRmb3JtL2ltYWdlLWRlY29kZXJzL2JtcCBcCiAgICAg
JCRQV0QvcGxhdGZvcm0vaW1hZ2UtZGVjb2RlcnMvZ2lmIFwKICAgICAkJFBXRC9wbGF0Zm9ybS9p
bWFnZS1kZWNvZGVycy9pY28gXApAQCAtOTI3LDYgKzkyOSwxMCBAQCBjb250YWlucyhERUZJTkVT
LCBFTkFCTEVfU1ZHPTEpIHsKIAlERVBFTkRQQVRIICs9IHBsYXRmb3JtL2dyYXBoaWNzL3N2Zy9x
dAogICAgIH0KIAorICAgIGdkay1wb3J0IHsKKwlERVBFTkRQQVRIICs9IHBsYXRmb3JtL2dyYXBo
aWNzL3N2Zy9jYWlybworICAgIH0KKwogICAgIFNWR19OQU1FUyA9ICQkUFdEL2tzdmcyL3N2Zy9z
dmd0YWdzLmluCiAKICAgICBYTElOS19OQU1FUyA9ICQkUFdEL2tzdmcyL21pc2MveGxpbmthdHRy
cy5pbgpAQCAtMTI0MCw2ICsxMjQ2LDE1IEBAIHF0LXBvcnQ6U09VUkNFUyArPSBcCiAgICAgICAg
IHBsYXRmb3JtL2dyYXBoaWNzL3N2Zy9xdC9TVkdSZXNvdXJjZUZpbHRlclF0LmNwcCBcCiAgICAg
ICAgIHBsYXRmb3JtL2dyYXBoaWNzL3N2Zy9xdC9TVkdSZXNvdXJjZU1hc2tlclF0LmNwcAogCitn
ZGstcG9ydDpTT1VSQ0VTICs9IFwKKyAgICAgICAgcGxhdGZvcm0vZ3JhcGhpY3Mvc3ZnL2NhaXJv
L1JlbmRlclBhdGhDYWlyby5jcHAgXAorICAgICAgICBwbGF0Zm9ybS9ncmFwaGljcy9zdmcvY2Fp
cm8vU1ZHUGFpbnRTZXJ2ZXJDYWlyby5jcHAgXAorICAgICAgICBwbGF0Zm9ybS9ncmFwaGljcy9z
dmcvY2Fpcm8vU1ZHUGFpbnRTZXJ2ZXJHcmFkaWVudENhaXJvLmNwcCBcCisgICAgICAgIHBsYXRm
b3JtL2dyYXBoaWNzL3N2Zy9jYWlyby9TVkdQYWludFNlcnZlclBhdHRlcm5DYWlyby5jcHAgXAor
ICAgICAgICBwbGF0Zm9ybS9ncmFwaGljcy9zdmcvY2Fpcm8vU1ZHUGFpbnRTZXJ2ZXJTb2xpZENh
aXJvLmNwcCBcCisgICAgICAgIHBsYXRmb3JtL2dyYXBoaWNzL3N2Zy9jYWlyby9TVkdSZXNvdXJj
ZUNsaXBwZXJDYWlyby5jcHAgXAorICAgICAgICBwbGF0Zm9ybS9ncmFwaGljcy9zdmcvY2Fpcm8v
U1ZHUmVzb3VyY2VNYXNrZXJDYWlyby5jcHAKKwogICAgICAgICAjIEdFTkVSQVRPUiA1LUM6CiAg
ICAgICAgIHN2Z25hbWVzX2Eub3V0cHV0ID0gdG1wL1NWR05hbWVzLmNwcAogICAgICAgICBzdmdu
YW1lc19hLmNvbW1hbmRzID0gcGVybCAkJFBXRC9rc3ZnMi9zY3JpcHRzL21ha2VfbmFtZXMucGwg
LS10YWdzICQkUFdEL2tzdmcyL3N2Zy9zdmd0YWdzLmluIC0tYXR0cnMgJCRQV0Qva3N2ZzIvc3Zn
L3N2Z2F0dHJzLmluIC0tbmFtZXNwYWNlIFNWRyAtLWNwcE5hbWVzcGFjZSBXZWJDb3JlIC0tbmFt
ZXNwYWNlVVJJICdodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZycgLS1mYWN0b3J5IC0tYXR0cnNO
dWxsTmFtZXNwYWNlIC0tb3V0cHV0IHRtcApJbmRleDogV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGlj
cy9zdmcvU1ZHUGFpbnRTZXJ2ZXJQYXR0ZXJuLmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9wbGF0
Zm9ybS9ncmFwaGljcy9zdmcvU1ZHUGFpbnRTZXJ2ZXJQYXR0ZXJuLmgJKHJldmlzaW9uIDIzNTAy
KQorKysgV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9zdmcvU1ZHUGFpbnRTZXJ2ZXJQYXR0ZXJu
LmgJKHdvcmtpbmcgY29weSkKQEAgLTY0LDcgKzY0LDcgQEAgbmFtZXNwYWNlIFdlYkNvcmUgewog
ICAgICAgICB2aXJ0dWFsIHZvaWQgdGVhcmRvd24oR3JhcGhpY3NDb250ZXh0KiYsIGNvbnN0IFJl
bmRlck9iamVjdCosIFNWR1BhaW50VGFyZ2V0VHlwZSwgYm9vbCBpc1BhaW50aW5nVGV4dCkgY29u
c3Q7IAogI2VuZGlmCiAKLSNpZiBQTEFURk9STShRVCkKKyNpZiBQTEFURk9STShRVCkgfHwgUExB
VEZPUk0oQ0FJUk8pCiAgICAgICAgIHZpcnR1YWwgYm9vbCBzZXR1cChHcmFwaGljc0NvbnRleHQq
JiwgY29uc3QgUmVuZGVyT2JqZWN0KiwgU1ZHUGFpbnRUYXJnZXRUeXBlLCBib29sIGlzUGFpbnRp
bmdUZXh0KSBjb25zdDsKICNlbmRpZgogCkluZGV4OiBXZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNz
L3N2Zy9TVkdQYWludFNlcnZlclNvbGlkLmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9wbGF0Zm9y
bS9ncmFwaGljcy9zdmcvU1ZHUGFpbnRTZXJ2ZXJTb2xpZC5oCShyZXZpc2lvbiAyMzUwMikKKysr
IFdlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mvc3ZnL1NWR1BhaW50U2VydmVyU29saWQuaAkod29y
a2luZyBjb3B5KQpAQCAtNDUsNyArNDUsNyBAQCBuYW1lc3BhY2UgV2ViQ29yZSB7CiAKICAgICAg
ICAgdmlydHVhbCBUZXh0U3RyZWFtJiBleHRlcm5hbFJlcHJlc2VudGF0aW9uKFRleHRTdHJlYW0m
KSBjb25zdDsKIAotI2lmIFBMQVRGT1JNKENHKSB8fCBQTEFURk9STShRVCkKKyNpZiBQTEFURk9S
TShDRykgfHwgUExBVEZPUk0oUVQpIHx8IFBMQVRGT1JNKENBSVJPKQogICAgICAgICB2aXJ0dWFs
IGJvb2wgc2V0dXAoR3JhcGhpY3NDb250ZXh0KiYsIGNvbnN0IFJlbmRlck9iamVjdCosIFNWR1Bh
aW50VGFyZ2V0VHlwZSwgYm9vbCBpc1BhaW50aW5nVGV4dCkgY29uc3Q7CiAjZW5kaWYKIApJbmRl
eDogV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9zdmcvY2Fpcm8vUmVuZGVyUGF0aENhaXJvLmNw
cAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3N2Zy9jYWlyby9SZW5k
ZXJQYXRoQ2Fpcm8uY3BwCShyZXZpc2lvbiAwKQorKysgV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGlj
cy9zdmcvY2Fpcm8vUmVuZGVyUGF0aENhaXJvLmNwcAkocmV2aXNpb24gMCkKQEAgLTAsMCArMSw1
OCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBBbHAgVG9rZXIgPGFscC50b2tlckBjb2xs
YWJvcmEuY28udWs+CisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5k
IGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJt
aXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6
CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFi
b3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQg
dGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFy
eSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwg
dGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0
aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3
aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBC
WSBBUFBMRSBDT01QVVRFUiwgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJ
TVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAq
IElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEg
UEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxM
IEFQUExFIENPTVBVVEVSLCBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBB
TlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwg
T1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywK
KyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0Yg
VVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dF
VkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElO
IENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJ
R0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAq
IE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0Yg
U1VDSCBEQU1BR0UuIAorICovCisKKyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJSZW5k
ZXJQYXRoLmgiCisKKyNpbmNsdWRlICJDYWlyb1BhdGguaCIKKyNpbmNsdWRlICJLQ2FudmFzUmVu
ZGVyaW5nU3R5bGUuaCIKKworbmFtZXNwYWNlIFdlYkNvcmUgeworCitib29sIFJlbmRlclBhdGg6
OnN0cm9rZUNvbnRhaW5zKGNvbnN0IEZsb2F0UG9pbnQmIHBvaW50LCBib29sIHJlcXVpcmVzU3Ry
b2tlKSBjb25zdAoreworICAgIGlmIChyZXF1aXJlc1N0cm9rZSAmJiAhS1NWR1BhaW50ZXJGYWN0
b3J5OjpzdHJva2VQYWludFNlcnZlcihzdHlsZSgpLCB0aGlzKSkKKyAgICAgICAgcmV0dXJuIGZh
bHNlOworCisgICAgY2Fpcm9fdCogY3IgPSBwYXRoKCkucGxhdGZvcm1QYXRoKCktPm1fY3I7CisK
KyAgICAvLyBUT0RPOiBzZXQgc3Ryb2tlIHByb3BlcnRpZXMKKyAgICByZXR1cm4gY2Fpcm9faW5f
c3Ryb2tlKGNyLCBwb2ludC54KCksIHBvaW50LnkoKSk7Cit9CisKK0Zsb2F0UmVjdCBSZW5kZXJQ
YXRoOjpzdHJva2VCQm94KCkgY29uc3QKK3sKKyAgICAvLyBUT0RPOiB0aGlzIGltcGxlbWVudGF0
aW9uIGlzIG5haXZlCisKKyAgICBjYWlyb190KiBjciA9IHBhdGgoKS5wbGF0Zm9ybVBhdGgoKS0+
bV9jcjsKKworICAgIGRvdWJsZSB4MCwgeDEsIHkwLCB5MTsKKyAgICBjYWlyb19zdHJva2VfZXh0
ZW50cyhjciwgJngwLCAmeTAsICZ4MSwgJnkxKTsKKyAgICBGbG9hdFJlY3QgYmJveCA9IEZsb2F0
UmVjdCh4MCwgeTAsIHgxIC0geDAsIHkxIC0geTApOworCisgICAgcmV0dXJuIGJib3g7Cit9CisK
K30KSW5kZXg6IFdlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mvc3ZnL2NhaXJvL1NWR1BhaW50U2Vy
dmVyQ2Fpcm8uY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mvc3Zn
L2NhaXJvL1NWR1BhaW50U2VydmVyQ2Fpcm8uY3BwCShyZXZpc2lvbiAwKQorKysgV2ViQ29yZS9w
bGF0Zm9ybS9ncmFwaGljcy9zdmcvY2Fpcm8vU1ZHUGFpbnRTZXJ2ZXJDYWlyby5jcHAJKHJldmlz
aW9uIDApCkBAIC0wLDAgKzEsNzEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgQWxwIFRv
a2VyIDxhbHAudG9rZXJAY29sbGFib3JhLmNvLnVrPgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFu
ZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9k
aWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25k
aXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2Rl
IG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0
IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlz
dHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJp
Z2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93
aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBt
YXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09G
VFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgQ09NUFVURVIsIElOQy4gYGBBUyBJUycnIEFORCBB
TlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1Qg
TElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZ
IEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQu
ICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBDT01QVVRFUiwgSU5DLiBPUgorICogQ09OVFJJQlVU
T1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJ
QUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBC
VVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9S
IFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNT
IElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJ
QUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAor
ICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZ
IE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0Yg
VEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLiAKKyAqLworCisjaW5jbHVkZSAiY29uZmln
LmgiCisKKyNpZiBFTkFCTEUoU1ZHKQorI2luY2x1ZGUgIlNWR1BhaW50U2VydmVyLmgiCisKKyNp
bmNsdWRlICJHcmFwaGljc0NvbnRleHQuaCIKKyNpbmNsdWRlICJLQ2FudmFzUmVuZGVyaW5nU3R5
bGUuaCIKKyNpbmNsdWRlICJSZW5kZXJQYXRoLmgiCisKKyNpbmNsdWRlIDxjYWlyby5oPgorCitu
YW1lc3BhY2UgV2ViQ29yZSB7CisKK3ZvaWQgU1ZHUGFpbnRTZXJ2ZXI6OmRyYXcoR3JhcGhpY3ND
b250ZXh0KiYgY29udGV4dCwgY29uc3QgUmVuZGVyUGF0aCogcGF0aCwgU1ZHUGFpbnRUYXJnZXRU
eXBlIHR5cGUpIGNvbnN0Cit7CisgICAgaWYgKCFzZXR1cChjb250ZXh0LCBwYXRoLCB0eXBlKSkK
KyAgICAgICAgcmV0dXJuOworCisgICAgcmVuZGVyUGF0aChjb250ZXh0LCBwYXRoLCB0eXBlKTsK
KyAgICB0ZWFyZG93bihjb250ZXh0LCBwYXRoLCB0eXBlKTsKK30KKwordm9pZCBTVkdQYWludFNl
cnZlcjo6dGVhcmRvd24oR3JhcGhpY3NDb250ZXh0KiYsIGNvbnN0IFJlbmRlck9iamVjdCosIFNW
R1BhaW50VGFyZ2V0VHlwZSwgYm9vbCBpc1BhaW50aW5nVGV4dCkgY29uc3QKK3sKKyAgICAvLyBu
by1vcAorfQorCit2b2lkIFNWR1BhaW50U2VydmVyOjpyZW5kZXJQYXRoKEdyYXBoaWNzQ29udGV4
dComIGNvbnRleHQsIGNvbnN0IFJlbmRlclBhdGgqIHBhdGgsIFNWR1BhaW50VGFyZ2V0VHlwZSB0
eXBlKSBjb25zdAoreworICAgIGNhaXJvX3QqIGNyID0gY29udGV4dC0+cGxhdGZvcm1Db250ZXh0
KCk7CisgICAgUmVuZGVyU3R5bGUqIHJlbmRlclN0eWxlID0gcGF0aC0+c3R5bGUoKTsKKworICAg
IGNhaXJvX3NldF9maWxsX3J1bGUoY3IsIHJlbmRlclN0eWxlLT5zdmdTdHlsZSgpLT5maWxsUnVs
ZSgpID09IFJVTEVfRVZFTk9ERCA/IENBSVJPX0ZJTExfUlVMRV9FVkVOX09ERCA6IENBSVJPX0ZJ
TExfUlVMRV9XSU5ESU5HKTsKKworICAgIGlmICgodHlwZSAmIEFwcGx5VG9GaWxsVGFyZ2V0VHlw
ZSkgJiYgcmVuZGVyU3R5bGUtPnN2Z1N0eWxlKCktPmhhc0ZpbGwoKSkKKyAgICAgICAgY2Fpcm9f
ZmlsbF9wcmVzZXJ2ZShjcik7CisKKyAgICBpZiAoKHR5cGUgJiBBcHBseVRvU3Ryb2tlVGFyZ2V0
VHlwZSkgJiYgcmVuZGVyU3R5bGUtPnN2Z1N0eWxlKCktPmhhc1N0cm9rZSgpKQorICAgICAgICBj
YWlyb19zdHJva2VfcHJlc2VydmUoY3IpOworCisgICAgY2Fpcm9fbmV3X3BhdGgoY3IpOworfQor
Cit9IC8vIG5hbWVzcGFjZSBXZWJDb3JlCisKKyNlbmRpZgpJbmRleDogV2ViQ29yZS9wbGF0Zm9y
bS9ncmFwaGljcy9zdmcvY2Fpcm8vU1ZHUGFpbnRTZXJ2ZXJHcmFkaWVudENhaXJvLmNwcAo9PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09Ci0tLSBXZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3N2Zy9jYWlyby9TVkdQYWludFNl
cnZlckdyYWRpZW50Q2Fpcm8uY3BwCShyZXZpc2lvbiAwKQorKysgV2ViQ29yZS9wbGF0Zm9ybS9n
cmFwaGljcy9zdmcvY2Fpcm8vU1ZHUGFpbnRTZXJ2ZXJHcmFkaWVudENhaXJvLmNwcAkocmV2aXNp
b24gMCkKQEAgLTAsMCArMSwxMTggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgQWxwIFRv
a2VyIDxhbHAudG9rZXJAY29sbGFib3JhLmNvLnVrPgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFu
ZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9k
aWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25k
aXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2Rl
IG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0
IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlz
dHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJp
Z2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93
aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBt
YXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09G
VFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgQ09NUFVURVIsIElOQy4gYGBBUyBJUycnIEFORCBB
TlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1Qg
TElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZ
IEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQu
ICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBDT01QVVRFUiwgSU5DLiBPUgorICogQ09OVFJJQlVU
T1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJ
QUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBC
VVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9S
IFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNT
IElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJ
QUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAor
ICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZ
IE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0Yg
VEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLiAKKyAqLworCisjaW5jbHVkZSAiY29uZmln
LmgiCisKKyNpZiBFTkFCTEUoU1ZHKQorI2luY2x1ZGUgIlNWR1BhaW50U2VydmVyR3JhZGllbnQu
aCIKKyNpbmNsdWRlICJTVkdQYWludFNlcnZlckxpbmVhckdyYWRpZW50LmgiCisjaW5jbHVkZSAi
U1ZHUGFpbnRTZXJ2ZXJSYWRpYWxHcmFkaWVudC5oIgorCisjaW5jbHVkZSAiR3JhcGhpY3NDb250
ZXh0LmgiCisjaW5jbHVkZSAiUmVuZGVyT2JqZWN0LmgiCisjaW5jbHVkZSAiUmVuZGVyUGF0aC5o
IgorI2luY2x1ZGUgIlJlbmRlclN0eWxlLmgiCisjaW5jbHVkZSAiU1ZHR3JhZGllbnRFbGVtZW50
LmgiCisKK25hbWVzcGFjZSBXZWJDb3JlIHsKKworYm9vbCBTVkdQYWludFNlcnZlckdyYWRpZW50
OjpzZXR1cChHcmFwaGljc0NvbnRleHQqJiBjb250ZXh0LCBjb25zdCBSZW5kZXJPYmplY3QqIG9i
amVjdCwgU1ZHUGFpbnRUYXJnZXRUeXBlIHR5cGUsIGJvb2wgaXNQYWludGluZ1RleHQpIGNvbnN0
Cit7CisgICAgbV9vd25lckVsZW1lbnQtPmJ1aWxkR3JhZGllbnQoKTsKKworICAgIGNhaXJvX3Qq
IGNyID0gY29udGV4dC0+cGxhdGZvcm1Db250ZXh0KCk7CisgICAgY2Fpcm9fcGF0dGVybl90KiBw
YXR0ZXJuOworCisgICAgY2Fpcm9fbWF0cml4X3QgbWF0cml4OworICAgIGNhaXJvX21hdHJpeF9p
bml0X2lkZW50aXR5ICgmbWF0cml4KTsKKyAgICBjb25zdCBjYWlyb19tYXRyaXhfdCBncmFkaWVu
dF9tYXRyaXggPSBncmFkaWVudFRyYW5zZm9ybSgpOworCisgICAgLy8gVE9ETzogcmV2aXNlIHRo
aXMgY29kZSwgaXQgaXMga25vd24gbm90IHRvIHdvcmsgaW4gbWFueSBjYXNlcworICAgIGlmICh0
aGlzLT50eXBlKCkgPT0gTGluZWFyR3JhZGllbnRQYWludFNlcnZlcikgeworICAgICAgICBjb25z
dCBTVkdQYWludFNlcnZlckxpbmVhckdyYWRpZW50KiBsaW5lYXIgPSBzdGF0aWNfY2FzdDxjb25z
dCBTVkdQYWludFNlcnZlckxpbmVhckdyYWRpZW50Kj4odGhpcyk7CisKKyAgICAgICAgaWYgKGJv
dW5kaW5nQm94TW9kZSgpKSB7CisgICAgICAgICAgICAvLyBUT0RPOiB1c2UgUmVuZGVyUGF0aENh
aXJvJ3Mgc3Ryb2tlQkJveD8KKyAgICAgICAgICAgIGRvdWJsZSB4MSwgeTEsIHgyLCB5MjsKKyAg
ICAgICAgICAgIGNhaXJvX2ZpbGxfZXh0ZW50cyhjciwgJngxLCAmeTEsICZ4MiwgJnkyKTsKKyAg
ICAgICAgICAgIGNhaXJvX21hdHJpeF90cmFuc2xhdGUoJm1hdHJpeCwgeDEsIHkxKTsKKyAgICAg
ICAgICAgIGNhaXJvX21hdHJpeF9zY2FsZSgmbWF0cml4LCB4MiAtIHgxLCB5MiAtIHkxKTsKKyAg
ICAgICAgICAgIGNhaXJvX21hdHJpeF9tdWx0aXBseSgmbWF0cml4LCAmbWF0cml4LCAmZ3JhZGll
bnRfbWF0cml4KTsKKyAgICAgICAgICAgIGNhaXJvX21hdHJpeF9pbnZlcnQoJm1hdHJpeCk7Cisg
ICAgICAgIHsKKyAgICAgICAgZG91YmxlIHgwLCB4MSwgeTAsIHkxOworICAgICAgICAgICAgeDAg
PSBsaW5lYXItPmdyYWRpZW50U3RhcnQoKS54KCk7CisgICAgICAgICAgICB5MCA9IGxpbmVhci0+
Z3JhZGllbnRTdGFydCgpLnkoKTsKKyAgICAgICAgICAgIHgxID0gbGluZWFyLT5ncmFkaWVudEVu
ZCgpLngoKTsKKyAgICAgICAgICAgIHkxID0gbGluZWFyLT5ncmFkaWVudEVuZCgpLnkoKTsKKyAg
ICAgICAgICAgIHBhdHRlcm4gPSBjYWlyb19wYXR0ZXJuX2NyZWF0ZV9saW5lYXIoeDAsIHkwLCB4
MSwgeTEpOworICAgICAgICB9CisgICAgICAgIH0gZWxzZSByZXR1cm4gZmFsc2U7CisKKyAgICB9
IGVsc2UgaWYgKHRoaXMtPnR5cGUoKSA9PSBSYWRpYWxHcmFkaWVudFBhaW50U2VydmVyKSB7Cisg
ICAgICAgIGNvbnN0IFNWR1BhaW50U2VydmVyUmFkaWFsR3JhZGllbnQqIHJhZGlhbCA9IHN0YXRp
Y19jYXN0PGNvbnN0IFNWR1BhaW50U2VydmVyUmFkaWFsR3JhZGllbnQqPih0aGlzKTsKKyAgICAg
ICAgLy8gVE9ETzogcGF0dGVybiA9IGNhaXJvX3BhdHRlcm5fY3JlYXRlX3JhZGlhbCgpOworICAg
ICAgICByZXR1cm4gZmFsc2U7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwor
ICAgIH0KKworICAgIGNhaXJvX3BhdHRlcm5fc2V0X2ZpbHRlcihwYXR0ZXJuLCBDQUlST19GSUxU
RVJfQklMSU5FQVIpOworCisgICAgc3dpdGNoIChzcHJlYWRNZXRob2QoKSkgeworICAgICAgICBj
YXNlIFNQUkVBRE1FVEhPRF9QQUQ6CisgICAgICAgICAgICBjYWlyb19wYXR0ZXJuX3NldF9leHRl
bmQocGF0dGVybiwgQ0FJUk9fRVhURU5EX1BBRCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAg
ICAgY2FzZSBTUFJFQURNRVRIT0RfUkVGTEVDVDoKKyAgICAgICAgICAgIGNhaXJvX3BhdHRlcm5f
c2V0X2V4dGVuZChwYXR0ZXJuLCBDQUlST19FWFRFTkRfUkVGTEVDVCk7CisgICAgICAgICAgICBi
cmVhazsKKyAgICAgICAgY2FzZSBTUFJFQURNRVRIT0RfUkVQRUFUOgorICAgICAgICAgICAgY2Fp
cm9fcGF0dGVybl9zZXRfZXh0ZW5kKHBhdHRlcm4sIENBSVJPX0VYVEVORF9SRVBFQVQpOworICAg
ICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBjYWlyb19wYXR0
ZXJuX3NldF9leHRlbmQocGF0dGVybiwgQ0FJUk9fRVhURU5EX05PTkUpOworICAgICAgICAgICAg
YnJlYWs7CisgICAgfQorCisgICAgY2Fpcm9fcGF0dGVybl9zZXRfbWF0cml4KHBhdHRlcm4sICZt
YXRyaXgpOworCisgICAgY29uc3QgVmVjdG9yPFNWR0dyYWRpZW50U3RvcD4mIHN0b3BzID0gZ3Jh
ZGllbnRTdG9wcygpOworCisgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IHN0b3BzLnNpemUo
KTsgKytpKSB7CisgICAgICAgIGZsb2F0IG9mZnNldCA9IHN0b3BzW2ldLmZpcnN0OworICAgICAg
ICBDb2xvciBjb2xvciA9IHN0b3BzW2ldLnNlY29uZDsKKworICAgICAgICBjYWlyb19wYXR0ZXJu
X2FkZF9jb2xvcl9zdG9wX3JnYmEocGF0dGVybiwgb2Zmc2V0LCBjb2xvci5yZWQoKSwgY29sb3Iu
Z3JlZW4oKSwgY29sb3IuYmx1ZSgpLCBjb2xvci5hbHBoYSgpKTsKKyAgICB9CisKKyAgICBjYWly
b19zZXRfc291cmNlKGNyLCBwYXR0ZXJuKTsKKyAgICBjYWlyb19wYXR0ZXJuX2Rlc3Ryb3kocGF0
dGVybik7CisKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworfSAvLyBuYW1lc3BhY2UgV2ViQ29yZQor
CisjZW5kaWYKSW5kZXg6IFdlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mvc3ZnL2NhaXJvL1NWR1Bh
aW50U2VydmVyUGF0dGVybkNhaXJvLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL3BsYXRmb3Jt
L2dyYXBoaWNzL3N2Zy9jYWlyby9TVkdQYWludFNlcnZlclBhdHRlcm5DYWlyby5jcHAJKHJldmlz
aW9uIDApCisrKyBXZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3N2Zy9jYWlyby9TVkdQYWludFNl
cnZlclBhdHRlcm5DYWlyby5jcHAJKHJldmlzaW9uIDApCkBAIC0wLDAgKzEsNDIgQEAKKy8qCisg
KiBDb3B5cmlnaHQgKEMpIDIwMDcgQWxwIFRva2VyIDxhbHAudG9rZXJAY29sbGFib3JhLmNvLnVr
PgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9y
bXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3Zp
ZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVk
aXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmln
aHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dp
bmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0
IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBv
ZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBk
b2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlz
dHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgQ09N
UFVURVIsIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJS
QU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdB
UlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIK
KyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBDT01Q
VVRFUiwgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwg
SU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVF
TlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJF
TUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwg
T1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQg
QU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwg
U1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9U
SEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNP
RlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdF
LiAKKyAqLworCisjaW5jbHVkZSAiY29uZmlnLmgiCisKKyNpZiBFTkFCTEUoU1ZHKQorI2luY2x1
ZGUgIk5vdEltcGxlbWVudGVkLmgiCisjaW5jbHVkZSAiU1ZHUGFpbnRTZXJ2ZXJQYXR0ZXJuLmgi
CisKK25hbWVzcGFjZSBXZWJDb3JlIHsKKworYm9vbCBTVkdQYWludFNlcnZlclBhdHRlcm46OnNl
dHVwKEdyYXBoaWNzQ29udGV4dComIGNvbnRleHQsIGNvbnN0IFJlbmRlck9iamVjdCogb2JqZWN0
LCBTVkdQYWludFRhcmdldFR5cGUgdHlwZSwgYm9vbCBpc1BhaW50aW5nVGV4dCkgY29uc3QKK3sK
KyAgICBub3RJbXBsZW1lbnRlZCgpOworICAgIHJldHVybiB0cnVlOworfQorCit9IC8vIG5hbWVz
cGFjZSBXZWJDb3JlCisKKyNlbmRpZgpJbmRleDogV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9z
dmcvY2Fpcm8vU1ZHUGFpbnRTZXJ2ZXJTb2xpZENhaXJvLmNwcAo9PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJD
b3JlL3BsYXRmb3JtL2dyYXBoaWNzL3N2Zy9jYWlyby9TVkdQYWludFNlcnZlclNvbGlkQ2Fpcm8u
Y3BwCShyZXZpc2lvbiAwKQorKysgV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9zdmcvY2Fpcm8v
U1ZHUGFpbnRTZXJ2ZXJTb2xpZENhaXJvLmNwcAkocmV2aXNpb24gMCkKQEAgLTAsMCArMSw3OCBA
QAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBBbHAgVG9rZXIgPGFscC50b2tlckBjb2xsYWJv
cmEuY28udWs+CisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJp
bmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0
ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6Cisg
KiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3Zl
IGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhl
IGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBm
b3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhp
cyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUK
KyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRo
IHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBB
UFBMRSBDT01QVVRFUiwgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBM
SUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElN
UExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFS
VElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQ
UExFIENPTVBVVEVSLCBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkg
RElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1Ig
Q09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAq
IFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNF
LCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVS
IENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENP
TlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VO
Q0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9G
IFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VD
SCBEQU1BR0UuIAorICovCisKKyNpbmNsdWRlICJjb25maWcuaCIKKworI2lmIEVOQUJMRShTVkcp
CisjaW5jbHVkZSAiU1ZHUGFpbnRTZXJ2ZXJTb2xpZC5oIgorCisjaW5jbHVkZSAiR3JhcGhpY3ND
b250ZXh0LmgiCisjaW5jbHVkZSAiS0NhbnZhc1JlbmRlcmluZ1N0eWxlLmgiCisjaW5jbHVkZSAi
UmVuZGVyUGF0aC5oIgorCituYW1lc3BhY2UgV2ViQ29yZSB7CisKK2Jvb2wgU1ZHUGFpbnRTZXJ2
ZXJTb2xpZDo6c2V0dXAoR3JhcGhpY3NDb250ZXh0KiYgY29udGV4dCwgY29uc3QgUmVuZGVyT2Jq
ZWN0KiBvYmplY3QsIFNWR1BhaW50VGFyZ2V0VHlwZSB0eXBlLCBib29sIGlzUGFpbnRpbmdUZXh0
KSBjb25zdAoreworICAgIC8vIFRPRE86IHNoYXJlIHRoaXMgY29kZSB3aXRoIG90aGVyIFBhaW50
U2VydmVycworCisgICAgY2Fpcm9fdCogY3IgPSBjb250ZXh0LT5wbGF0Zm9ybUNvbnRleHQoKTsK
KyAgICBSZW5kZXJTdHlsZSogcmVuZGVyU3R5bGUgPSBvYmplY3QtPnN0eWxlKCk7CisKKyAgICBm
bG9hdCByZWQsIGdyZWVuLCBibHVlLCBhbHBoYTsKKyAgICBjb2xvcigpLmdldFJHQkEocmVkLCBn
cmVlbiwgYmx1ZSwgYWxwaGEpOworCisgICAgaWYgKCh0eXBlICYgQXBwbHlUb0ZpbGxUYXJnZXRU
eXBlKSAmJiByZW5kZXJTdHlsZS0+c3ZnU3R5bGUoKS0+aGFzRmlsbCgpKSB7CisgICAgICAgIGFs
cGhhID0gcmVuZGVyU3R5bGUtPnN2Z1N0eWxlKCktPmZpbGxPcGFjaXR5KCk7CisKKyAgICAgICAg
Y2Fpcm9fc2V0X2ZpbGxfcnVsZShjciwgcmVuZGVyU3R5bGUtPnN2Z1N0eWxlKCktPmZpbGxSdWxl
KCkgPT0gUlVMRV9FVkVOT0REID8gQ0FJUk9fRklMTF9SVUxFX0VWRU5fT0REIDogQ0FJUk9fRklM
TF9SVUxFX1dJTkRJTkcpOworICAgIH0KKworICAgIGlmICgodHlwZSAmIEFwcGx5VG9TdHJva2VU
YXJnZXRUeXBlKSAmJiByZW5kZXJTdHlsZS0+c3ZnU3R5bGUoKS0+aGFzU3Ryb2tlKCkpIHsKKyAg
ICAgICAgYWxwaGEgPSByZW5kZXJTdHlsZS0+c3ZnU3R5bGUoKS0+c3Ryb2tlT3BhY2l0eSgpOwor
CisgICAgICAgIGNhaXJvX3NldF9saW5lX3dpZHRoKGNyLCBLU1ZHUGFpbnRlckZhY3Rvcnk6OmNz
c1ByaW1pdGl2ZVRvTGVuZ3RoKG9iamVjdCwgcmVuZGVyU3R5bGUtPnN2Z1N0eWxlKCktPnN0cm9r
ZVdpZHRoKCksIDEuMCkpOworICAgICAgICBjb250ZXh0LT5zZXRMaW5lQ2FwKHJlbmRlclN0eWxl
LT5zdmdTdHlsZSgpLT5jYXBTdHlsZSgpKTsKKyAgICAgICAgY29udGV4dC0+c2V0TGluZUpvaW4o
cmVuZGVyU3R5bGUtPnN2Z1N0eWxlKCktPmpvaW5TdHlsZSgpKTsKKyAgICAgICAgaWYgKHJlbmRl
clN0eWxlLT5zdmdTdHlsZSgpLT5qb2luU3R5bGUoKSA9PSBNaXRlckpvaW4pCisgICAgICAgICAg
ICBjb250ZXh0LT5zZXRNaXRlckxpbWl0KHJlbmRlclN0eWxlLT5zdmdTdHlsZSgpLT5zdHJva2VN
aXRlckxpbWl0KCkpOworCisgICAgICAgIGNvbnN0IEtDRGFzaEFycmF5JiBkYXNoZXMgPSBLU1ZH
UGFpbnRlckZhY3Rvcnk6OmRhc2hBcnJheUZyb21SZW5kZXJpbmdTdHlsZShyZW5kZXJTdHlsZSk7
CisgICAgICAgIGRvdWJsZSogZHNoID0gbmV3IGRvdWJsZVtkYXNoZXMuc2l6ZSgpXTsKKyAgICAg
ICAgZm9yIChpbnQgaSA9IDAgOyBpIDwgZGFzaGVzLnNpemUoKSA7IGkrKykKKyAgICAgICAgICAg
IGRzaFtpXSA9IGRhc2hlc1tpXTsKKyAgICAgICAgZG91YmxlIGRhc2hPZmZzZXQgPSBLU1ZHUGFp
bnRlckZhY3Rvcnk6OmNzc1ByaW1pdGl2ZVRvTGVuZ3RoKG9iamVjdCwgcmVuZGVyU3R5bGUtPnN2
Z1N0eWxlKCktPnN0cm9rZURhc2hPZmZzZXQoKSwgMC4wKTsKKyAgICAgICAgY2Fpcm9fc2V0X2Rh
c2goY3IsIGRzaCwgZGFzaGVzLnNpemUoKSwgZGFzaE9mZnNldCk7CisgICAgICAgIGRlbGV0ZSBk
c2g7CisgICAgfQorCisgICAgY2Fpcm9fc2V0X3NvdXJjZV9yZ2JhKGNyLCByZWQsIGdyZWVuLCBi
bHVlLCBhbHBoYSk7CisKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworfSAvLyBuYW1lc3BhY2UgV2Vi
Q29yZQorCisjZW5kaWYKSW5kZXg6IFdlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mvc3ZnL2NhaXJv
L1NWR1Jlc291cmNlQ2xpcHBlckNhaXJvLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL3BsYXRm
b3JtL2dyYXBoaWNzL3N2Zy9jYWlyby9TVkdSZXNvdXJjZUNsaXBwZXJDYWlyby5jcHAJKHJldmlz
aW9uIDApCisrKyBXZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3N2Zy9jYWlyby9TVkdSZXNvdXJj
ZUNsaXBwZXJDYWlyby5jcHAJKHJldmlzaW9uIDApCkBAIC0wLDAgKzEsNjkgQEAKKy8qCisgKiBD
b3B5cmlnaHQgKEMpIDIwMDcgQWxwIFRva2VyIDxhbHAudG9rZXJAY29sbGFib3JhLmNvLnVrPgor
ICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMs
IHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVk
IHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0
cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQK
KyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcg
ZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJl
cHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBj
b25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1
bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJp
YnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgQ09NUFVU
RVIsIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5U
SUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJB
TlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAq
IFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBDT01QVVRF
UiwgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5E
SVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJ
QUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVO
VCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IK
KyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5E
IE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RS
SUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVS
V0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRX
QVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLiAK
KyAqLworCisjaW5jbHVkZSAiY29uZmlnLmgiCisKKyNpZiBFTkFCTEUoU1ZHKQorI2luY2x1ZGUg
IlNWR1Jlc291cmNlQ2xpcHBlci5oIgorI2luY2x1ZGUgIkFmZmluZVRyYW5zZm9ybS5oIgorI2lu
Y2x1ZGUgIkdyYXBoaWNzQ29udGV4dC5oIgorCisjaW5jbHVkZSA8Y2Fpcm8uaD4KKworbmFtZXNw
YWNlIFdlYkNvcmUgeworCit2b2lkIFNWR1Jlc291cmNlQ2xpcHBlcjo6YXBwbHlDbGlwKEdyYXBo
aWNzQ29udGV4dCogY29udGV4dCwgY29uc3QgRmxvYXRSZWN0JiBib3VuZGluZ0JveCkgY29uc3QK
K3sKKyAgICBWZWN0b3I8Q2xpcERhdGE+IGRhdGEgPSBtX2NsaXBEYXRhLmNsaXBEYXRhKCk7Cisg
ICAgdW5zaWduZWQgaW50IGNvdW50ID0gZGF0YS5zaXplKCk7CisgICAgaWYgKCFjb3VudCkKKyAg
ICAgICAgcmV0dXJuOworCisgICAgY2Fpcm9fdCogY3IgPSBjb250ZXh0LT5wbGF0Zm9ybUNvbnRl
eHQoKTsKKyAgICBjYWlyb19yZXNldF9jbGlwKGNyKTsKKworICAgIGZvciAodW5zaWduZWQgaW50
IHggPSAwOyB4IDwgY291bnQ7IHgrKykgeworICAgICAgICBQYXRoIHBhdGggPSBkYXRhW3hdLnBh
dGg7CisgICAgICAgIGlmKHBhdGguaXNFbXB0eSgpKQorICAgICAgICAgICAgY29udGludWU7Cisg
ICAgICAgIHBhdGguY2xvc2VTdWJwYXRoKCk7CisKKyAgICAgICAgY2Fpcm9fc2V0X2ZpbGxfcnVs
ZShjciwgZGF0YVt4XS53aW5kUnVsZSA9PSBSVUxFX0VWRU5PREQgPyBDQUlST19GSUxMX1JVTEVf
RVZFTl9PREQgOiBDQUlST19GSUxMX1JVTEVfV0lORElORyk7CisKKyAgICAgICAgaWYgKGRhdGFb
eF0uYmJveFVuaXRzKSB7CisgICAgICAgICAgICAvLyBNYWtlIHVzZSBvZiB0aGUgY2xpcHBpbmcg
dW5pdHMKKyAgICAgICAgICAgIEFmZmluZVRyYW5zZm9ybSB0cmFuc2Zvcm07CisgICAgICAgICAg
ICB0cmFuc2Zvcm0udHJhbnNsYXRlKGJvdW5kaW5nQm94LngoKSwgYm91bmRpbmdCb3gueSgpKTsK
KyAgICAgICAgICAgIHRyYW5zZm9ybS5zY2FsZShib3VuZGluZ0JveC53aWR0aCgpLCBib3VuZGlu
Z0JveC5oZWlnaHQoKSk7CisgICAgICAgICAgICBwYXRoLnRyYW5zZm9ybSh0cmFuc2Zvcm0pOwor
ICAgICAgICB9CisKKyAgICAgICAgY29udGV4dC0+Y2xpcChwYXRoKTsKKyAgICB9Cit9CisKK30g
Ly8gbmFtZXNwYWNlIFdlYkNvcmUKKworI2VuZGlmCkluZGV4OiBXZWJDb3JlL3BsYXRmb3JtL2dy
YXBoaWNzL3N2Zy9jYWlyby9TVkdSZXNvdXJjZU1hc2tlckNhaXJvLmNwcAo9PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0t
LSBXZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3N2Zy9jYWlyby9TVkdSZXNvdXJjZU1hc2tlckNh
aXJvLmNwcAkocmV2aXNpb24gMCkKKysrIFdlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mvc3ZnL2Nh
aXJvL1NWR1Jlc291cmNlTWFza2VyQ2Fpcm8uY3BwCShyZXZpc2lvbiAwKQpAQCAtMCwwICsxLDUw
IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3IEFscCBUb2tlciA8YWxwLnRva2VyQGNvbGxh
Ym9yYS5jby51az4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQg
YmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1p
dHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoK
KyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJv
dmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0
aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5
IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0
aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRo
ZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdp
dGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZ
IEFQUExFIENPTVBVVEVSLCBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElN
UExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICog
SU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQ
QVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwg
QVBQTEUgQ09NUFVURVIsIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFO
WSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBP
UiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAor
ICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBV
U0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VW
RVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4g
Q09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElH
RU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICog
T0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBT
VUNIIERBTUFHRS4gCisgKi8KKworI2luY2x1ZGUgImNvbmZpZy5oIgorCisjaWYgRU5BQkxFKFNW
RykKKyNpbmNsdWRlICJTVkdSZXNvdXJjZU1hc2tlci5oIgorI2luY2x1ZGUgIkltYWdlQnVmZmVy
LmgiCisjaW5jbHVkZSAiR3JhcGhpY3NDb250ZXh0LmgiCisKKyNpbmNsdWRlIDxjYWlyby5oPgor
CituYW1lc3BhY2UgV2ViQ29yZSB7CisKK3ZvaWQgU1ZHUmVzb3VyY2VNYXNrZXI6OmFwcGx5TWFz
ayhHcmFwaGljc0NvbnRleHQqIGNvbnRleHQsIGNvbnN0IEZsb2F0UmVjdCYgYm91bmRpbmdCb3gp
IGNvbnN0Cit7CisgICAgY2Fpcm9fdCogY3IgPSBjb250ZXh0LT5wbGF0Zm9ybUNvbnRleHQoKTsK
KyAgICBjYWlyb19zdXJmYWNlX3QqIHN1cmZhY2UgPSBtYXNrKCktPnN1cmZhY2UoKTsKKyAgICBp
Zighc3VyZmFjZSkKKyAgICAgICAgcmV0dXJuOworICAgIGNhaXJvX3BhdHRlcm5fdCogbWFzayA9
IGNhaXJvX3BhdHRlcm5fY3JlYXRlX2Zvcl9zdXJmYWNlKHN1cmZhY2UpOworICAgIGNhaXJvX21h
c2soY3IsIG1hc2spOworICAgIGNhaXJvX3BhdHRlcm5fZGVzdHJveShtYXNrKTsKK30KKworfSAv
LyBuYW1lc3BhY2UgV2ViQ29yZQorCisjZW5kaWYK
</data>
<flag name="review"
          id="6182"
          type_id="1"
          status="-"
          setter="rwlbuis"
    />
          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>15003</attachid>
            <date>2007-06-13 11:05:41 -0700</date>
            <delta_ts>2007-06-13 11:17:05 -0700</delta_ts>
            <desc>Cairo SVG support, take two</desc>
            <filename>cairo-svg-2.patch</filename>
            <type>text/plain</type>
            <size>25692</size>
            <attacher name="Alp Toker">alp</attacher>
            
              <data encoding="base64">SW5kZXg6IFdlYkNvcmUvQ2hhbmdlTG9nCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvQ2hhbmdlTG9n
CShyZXZpc2lvbiAyMzUwNCkKKysrIFdlYkNvcmUvQ2hhbmdlTG9nCSh3b3JraW5nIGNvcHkpCkBA
IC0xLDMgKzEsMzIgQEAKKzIwMDctMDYtMTMgIEFscCBUb2tlciAgPGFscC50b2tlckBjb2xsYWJv
cmEuY28udWs+CisKKyAgICAgICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChPT1BTISkuCisKKyAgICAg
ICAgaHR0cDovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MTQwNjAKKyAgICAgICAg
Q2Fpcm8gU1ZHIHN1cHBvcnQKKworICAgICAgICAqIFdlYkNvcmUucHJvOiBBZGQgbmV3IGZpbGVz
IHRvIHRoZSBidWlsZC4KKyAgICAgICAgKiBwbGF0Zm9ybS9ncmFwaGljcy9zdmcvU1ZHUGFpbnRT
ZXJ2ZXJQYXR0ZXJuLmg6CisgICAgICAgICogcGxhdGZvcm0vZ3JhcGhpY3Mvc3ZnL1NWR1BhaW50
U2VydmVyU29saWQuaDoKKyAgICAgICAgKiBwbGF0Zm9ybS9ncmFwaGljcy9zdmcvY2Fpcm86IEFk
ZGVkLgorICAgICAgICAqIHBsYXRmb3JtL2dyYXBoaWNzL3N2Zy9jYWlyby9SZW5kZXJQYXRoQ2Fp
cm8uY3BwOiBBZGRlZC4KKyAgICAgICAgKFdlYkNvcmU6OlJlbmRlclBhdGg6OnN0cm9rZUNvbnRh
aW5zKToKKyAgICAgICAgKFdlYkNvcmU6OlJlbmRlclBhdGg6OnN0cm9rZUJCb3gpOgorICAgICAg
ICAqIHBsYXRmb3JtL2dyYXBoaWNzL3N2Zy9jYWlyby9TVkdQYWludFNlcnZlckNhaXJvLmNwcDog
QWRkZWQuCisgICAgICAgIChXZWJDb3JlOjpTVkdQYWludFNlcnZlcjo6ZHJhdyk6CisgICAgICAg
IChXZWJDb3JlOjpTVkdQYWludFNlcnZlcjo6dGVhcmRvd24pOgorICAgICAgICAoV2ViQ29yZTo6
U1ZHUGFpbnRTZXJ2ZXI6OnJlbmRlclBhdGgpOgorICAgICAgICAqIHBsYXRmb3JtL2dyYXBoaWNz
L3N2Zy9jYWlyby9TVkdQYWludFNlcnZlckdyYWRpZW50Q2Fpcm8uY3BwOiBBZGRlZC4KKyAgICAg
ICAgKFdlYkNvcmU6OlNWR1BhaW50U2VydmVyR3JhZGllbnQ6OnNldHVwKToKKyAgICAgICAgKiBw
bGF0Zm9ybS9ncmFwaGljcy9zdmcvY2Fpcm8vU1ZHUGFpbnRTZXJ2ZXJQYXR0ZXJuQ2Fpcm8uY3Bw
OiBBZGRlZC4KKyAgICAgICAgKFdlYkNvcmU6OlNWR1BhaW50U2VydmVyUGF0dGVybjo6c2V0dXAp
OgorICAgICAgICAqIHBsYXRmb3JtL2dyYXBoaWNzL3N2Zy9jYWlyby9TVkdQYWludFNlcnZlclNv
bGlkQ2Fpcm8uY3BwOiBBZGRlZC4KKyAgICAgICAgKFdlYkNvcmU6OlNWR1BhaW50U2VydmVyU29s
aWQ6OnNldHVwKToKKyAgICAgICAgKiBwbGF0Zm9ybS9ncmFwaGljcy9zdmcvY2Fpcm8vU1ZHUmVz
b3VyY2VDbGlwcGVyQ2Fpcm8uY3BwOiBBZGRlZC4KKyAgICAgICAgKFdlYkNvcmU6OlNWR1Jlc291
cmNlQ2xpcHBlcjo6YXBwbHlDbGlwKToKKyAgICAgICAgKiBwbGF0Zm9ybS9ncmFwaGljcy9zdmcv
Y2Fpcm8vU1ZHUmVzb3VyY2VNYXNrZXJDYWlyby5jcHA6IEFkZGVkLgorICAgICAgICAoV2ViQ29y
ZTo6U1ZHUmVzb3VyY2VNYXNrZXI6OmFwcGx5TWFzayk6CisKIDIwMDctMDYtMTMgIFNpbW9uIEhh
dXNtYW5uICA8aGF1c21hbm5Aa2RlLm9yZz4KIAogICAgICAgICBSZXZpZXdlZCBieSBMYXJzLgpJ
bmRleDogV2ViQ29yZS9XZWJDb3JlLnBybwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL1dlYkNvcmUu
cHJvCShyZXZpc2lvbiAyMzUwNCkKKysrIFdlYkNvcmUvV2ViQ29yZS5wcm8JKHdvcmtpbmcgY29w
eSkKQEAgLTQwLDYgKzQwLDcgQEAgREVGSU5FUyArPSBFTkFCTEVfWFBBVEg9MQogREVGSU5FUyAr
PSBFTkFCTEVfWFNMVD0xCiAjREVGSU5FUyArPSBFTkFCTEVfWEJMPTEKIHF0LXBvcnQ6REVGSU5F
UyArPSBFTkFCTEVfU1ZHPTEKK2dkay1wb3J0OkRFRklORVMgKz0gRU5BQkxFX1NWRz0xCiAKIERF
RklORVMgKz0gV1RGX0NIQU5HRVM9MQogCkBAIC03MCw2ICs3MSw3IEBAIERFUEVORFBBVEggKz0g
ZWRpdGluZy9xdCBoaXN0b3J5L3F0IGxvYWQKIH0KIAogZ2RrLXBvcnQ6SU5DTFVERVBBVEggKz0g
XAorICAgICQkUFdEL3BsYXRmb3JtL2dyYXBoaWNzL3N2Zy9jYWlybyBcCiAgICAgJCRQV0QvcGxh
dGZvcm0vaW1hZ2UtZGVjb2RlcnMvYm1wIFwKICAgICAkJFBXRC9wbGF0Zm9ybS9pbWFnZS1kZWNv
ZGVycy9naWYgXAogICAgICQkUFdEL3BsYXRmb3JtL2ltYWdlLWRlY29kZXJzL2ljbyBcCkBAIC05
MjAsNiArOTIyLDEwIEBAIGNvbnRhaW5zKERFRklORVMsIEVOQUJMRV9TVkc9MSkgewogCURFUEVO
RFBBVEggKz0gcGxhdGZvcm0vZ3JhcGhpY3Mvc3ZnL3F0CiAgICAgfQogCisgICAgZ2RrLXBvcnQg
eworCURFUEVORFBBVEggKz0gcGxhdGZvcm0vZ3JhcGhpY3Mvc3ZnL2NhaXJvCisgICAgfQorCiAg
ICAgU1ZHX05BTUVTID0gJCRQV0Qva3N2ZzIvc3ZnL3N2Z3RhZ3MuaW4KIAogICAgIFhMSU5LX05B
TUVTID0gJCRQV0Qva3N2ZzIvbWlzYy94bGlua2F0dHJzLmluCkBAIC0xMjMzLDYgKzEyMzksMTUg
QEAgcXQtcG9ydDpTT1VSQ0VTICs9IFwKICAgICAgICAgcGxhdGZvcm0vZ3JhcGhpY3Mvc3ZnL3F0
L1NWR1Jlc291cmNlRmlsdGVyUXQuY3BwIFwKICAgICAgICAgcGxhdGZvcm0vZ3JhcGhpY3Mvc3Zn
L3F0L1NWR1Jlc291cmNlTWFza2VyUXQuY3BwCiAKK2dkay1wb3J0OlNPVVJDRVMgKz0gXAorICAg
ICAgICBwbGF0Zm9ybS9ncmFwaGljcy9zdmcvY2Fpcm8vUmVuZGVyUGF0aENhaXJvLmNwcCBcCisg
ICAgICAgIHBsYXRmb3JtL2dyYXBoaWNzL3N2Zy9jYWlyby9TVkdQYWludFNlcnZlckNhaXJvLmNw
cCBcCisgICAgICAgIHBsYXRmb3JtL2dyYXBoaWNzL3N2Zy9jYWlyby9TVkdQYWludFNlcnZlckdy
YWRpZW50Q2Fpcm8uY3BwIFwKKyAgICAgICAgcGxhdGZvcm0vZ3JhcGhpY3Mvc3ZnL2NhaXJvL1NW
R1BhaW50U2VydmVyUGF0dGVybkNhaXJvLmNwcCBcCisgICAgICAgIHBsYXRmb3JtL2dyYXBoaWNz
L3N2Zy9jYWlyby9TVkdQYWludFNlcnZlclNvbGlkQ2Fpcm8uY3BwIFwKKyAgICAgICAgcGxhdGZv
cm0vZ3JhcGhpY3Mvc3ZnL2NhaXJvL1NWR1Jlc291cmNlQ2xpcHBlckNhaXJvLmNwcCBcCisgICAg
ICAgIHBsYXRmb3JtL2dyYXBoaWNzL3N2Zy9jYWlyby9TVkdSZXNvdXJjZU1hc2tlckNhaXJvLmNw
cAorCiAgICAgICAgICMgR0VORVJBVE9SIDUtQzoKICAgICAgICAgc3ZnbmFtZXNfYS5vdXRwdXQg
PSB0bXAvU1ZHTmFtZXMuY3BwCiAgICAgICAgIHN2Z25hbWVzX2EuY29tbWFuZHMgPSBwZXJsICQk
UFdEL2tzdmcyL3NjcmlwdHMvbWFrZV9uYW1lcy5wbCAtLXRhZ3MgJCRQV0Qva3N2ZzIvc3ZnL3N2
Z3RhZ3MuaW4gLS1hdHRycyAkJFBXRC9rc3ZnMi9zdmcvc3ZnYXR0cnMuaW4gLS1uYW1lc3BhY2Ug
U1ZHIC0tY3BwTmFtZXNwYWNlIFdlYkNvcmUgLS1uYW1lc3BhY2VVUkkgJ2h0dHA6Ly93d3cudzMu
b3JnLzIwMDAvc3ZnJyAtLWZhY3RvcnkgLS1hdHRyc051bGxOYW1lc3BhY2UgLS1vdXRwdXQgdG1w
CkluZGV4OiBXZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3N2Zy9TVkdQYWludFNlcnZlclBhdHRl
cm4uaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3N2Zy9TVkdQYWlu
dFNlcnZlclBhdHRlcm4uaAkocmV2aXNpb24gMjM1MDQpCisrKyBXZWJDb3JlL3BsYXRmb3JtL2dy
YXBoaWNzL3N2Zy9TVkdQYWludFNlcnZlclBhdHRlcm4uaAkod29ya2luZyBjb3B5KQpAQCAtNjQs
NyArNjQsNyBAQCBuYW1lc3BhY2UgV2ViQ29yZSB7CiAgICAgICAgIHZpcnR1YWwgdm9pZCB0ZWFy
ZG93bihHcmFwaGljc0NvbnRleHQqJiwgY29uc3QgUmVuZGVyT2JqZWN0KiwgU1ZHUGFpbnRUYXJn
ZXRUeXBlLCBib29sIGlzUGFpbnRpbmdUZXh0KSBjb25zdDsgCiAjZW5kaWYKIAotI2lmIFBMQVRG
T1JNKFFUKQorI2lmIFBMQVRGT1JNKFFUKSB8fCBQTEFURk9STShDQUlSTykKICAgICAgICAgdmly
dHVhbCBib29sIHNldHVwKEdyYXBoaWNzQ29udGV4dComLCBjb25zdCBSZW5kZXJPYmplY3QqLCBT
VkdQYWludFRhcmdldFR5cGUsIGJvb2wgaXNQYWludGluZ1RleHQpIGNvbnN0OwogI2VuZGlmCiAK
SW5kZXg6IFdlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mvc3ZnL1NWR1BhaW50U2VydmVyU29saWQu
aAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3N2Zy9TVkdQYWludFNl
cnZlclNvbGlkLmgJKHJldmlzaW9uIDIzNTA0KQorKysgV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGlj
cy9zdmcvU1ZHUGFpbnRTZXJ2ZXJTb2xpZC5oCSh3b3JraW5nIGNvcHkpCkBAIC00NSw3ICs0NSw3
IEBAIG5hbWVzcGFjZSBXZWJDb3JlIHsKIAogICAgICAgICB2aXJ0dWFsIFRleHRTdHJlYW0mIGV4
dGVybmFsUmVwcmVzZW50YXRpb24oVGV4dFN0cmVhbSYpIGNvbnN0OwogCi0jaWYgUExBVEZPUk0o
Q0cpIHx8IFBMQVRGT1JNKFFUKQorI2lmIFBMQVRGT1JNKENHKSB8fCBQTEFURk9STShRVCkgfHwg
UExBVEZPUk0oQ0FJUk8pCiAgICAgICAgIHZpcnR1YWwgYm9vbCBzZXR1cChHcmFwaGljc0NvbnRl
eHQqJiwgY29uc3QgUmVuZGVyT2JqZWN0KiwgU1ZHUGFpbnRUYXJnZXRUeXBlLCBib29sIGlzUGFp
bnRpbmdUZXh0KSBjb25zdDsKICNlbmRpZgogCkluZGV4OiBXZWJDb3JlL3BsYXRmb3JtL2dyYXBo
aWNzL3N2Zy9jYWlyby9SZW5kZXJQYXRoQ2Fpcm8uY3BwCj09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUv
cGxhdGZvcm0vZ3JhcGhpY3Mvc3ZnL2NhaXJvL1JlbmRlclBhdGhDYWlyby5jcHAJKHJldmlzaW9u
IDApCisrKyBXZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3N2Zy9jYWlyby9SZW5kZXJQYXRoQ2Fp
cm8uY3BwCShyZXZpc2lvbiAwKQpAQCAtMCwwICsxLDU4IEBACisvKgorICogQ29weXJpZ2h0IChD
KSAyMDA3IEFscCBUb2tlciA8YWxwLnRva2VyQGNvbGxhYm9yYS5jby51az4KKyAqCisgKiBSZWRp
c3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdp
dGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBm
b2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBv
ZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3Rp
Y2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIu
CisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhl
IGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBh
bmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBh
bmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAq
CisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIENPTVBVVEVSLCBJTkMuIGBg
QVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVE
SU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1F
UkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFS
RSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgQ09NUFVURVIsIElOQy4gT1IK
KyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJ
REVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMg
KElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJ
VFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRT
OyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhF
T1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJ
VFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJ
TkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJ
RiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKworI2lu
Y2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgIlJlbmRlclBhdGguaCIKKworI2luY2x1ZGUgIkNh
aXJvUGF0aC5oIgorI2luY2x1ZGUgIktDYW52YXNSZW5kZXJpbmdTdHlsZS5oIgorCituYW1lc3Bh
Y2UgV2ViQ29yZSB7CisKK2Jvb2wgUmVuZGVyUGF0aDo6c3Ryb2tlQ29udGFpbnMoY29uc3QgRmxv
YXRQb2ludCYgcG9pbnQsIGJvb2wgcmVxdWlyZXNTdHJva2UpIGNvbnN0Cit7CisgICAgaWYgKHJl
cXVpcmVzU3Ryb2tlICYmICFLU1ZHUGFpbnRlckZhY3Rvcnk6OnN0cm9rZVBhaW50U2VydmVyKHN0
eWxlKCksIHRoaXMpKQorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICBjYWlyb190KiBjciA9
IHBhdGgoKS5wbGF0Zm9ybVBhdGgoKS0+bV9jcjsKKworICAgIC8vIFRPRE86IHNldCBzdHJva2Ug
cHJvcGVydGllcworICAgIHJldHVybiBjYWlyb19pbl9zdHJva2UoY3IsIHBvaW50LngoKSwgcG9p
bnQueSgpKTsKK30KKworRmxvYXRSZWN0IFJlbmRlclBhdGg6OnN0cm9rZUJCb3goKSBjb25zdAor
eworICAgIC8vIFRPRE86IHRoaXMgaW1wbGVtZW50YXRpb24gaXMgbmFpdmUKKworICAgIGNhaXJv
X3QqIGNyID0gcGF0aCgpLnBsYXRmb3JtUGF0aCgpLT5tX2NyOworCisgICAgZG91YmxlIHgwLCB4
MSwgeTAsIHkxOworICAgIGNhaXJvX3N0cm9rZV9leHRlbnRzKGNyLCAmeDAsICZ5MCwgJngxLCAm
eTEpOworICAgIEZsb2F0UmVjdCBiYm94ID0gRmxvYXRSZWN0KHgwLCB5MCwgeDEgLSB4MCwgeTEg
LSB5MCk7CisKKyAgICByZXR1cm4gYmJveDsKK30KKworfQpJbmRleDogV2ViQ29yZS9wbGF0Zm9y
bS9ncmFwaGljcy9zdmcvY2Fpcm8vU1ZHUGFpbnRTZXJ2ZXJDYWlyby5jcHAKPT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQot
LS0gV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9zdmcvY2Fpcm8vU1ZHUGFpbnRTZXJ2ZXJDYWly
by5jcHAJKHJldmlzaW9uIDApCisrKyBXZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3N2Zy9jYWly
by9TVkdQYWludFNlcnZlckNhaXJvLmNwcAkocmV2aXNpb24gMCkKQEAgLTAsMCArMSw3MSBAQAor
LyoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBBbHAgVG9rZXIgPGFscC50b2tlckBjb2xsYWJvcmEu
Y28udWs+CisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFy
eSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQg
cHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAx
LiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNv
cHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZv
bGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3Jt
IG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBs
aXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAq
ICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRo
ZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBM
RSBDT01QVVRFUiwgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVE
IFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJ
RUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElD
VUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExF
IENPTVBVVEVSLCBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElS
RUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09O
U0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBS
T0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBE
QVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENB
VVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRS
QUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0Ug
T1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRI
SVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBE
QU1BR0UuIAorICovCisKKyNpbmNsdWRlICJjb25maWcuaCIKKworI2lmIEVOQUJMRShTVkcpCisj
aW5jbHVkZSAiU1ZHUGFpbnRTZXJ2ZXIuaCIKKworI2luY2x1ZGUgIkdyYXBoaWNzQ29udGV4dC5o
IgorI2luY2x1ZGUgIktDYW52YXNSZW5kZXJpbmdTdHlsZS5oIgorI2luY2x1ZGUgIlJlbmRlclBh
dGguaCIKKworI2luY2x1ZGUgPGNhaXJvLmg+CisKK25hbWVzcGFjZSBXZWJDb3JlIHsKKwordm9p
ZCBTVkdQYWludFNlcnZlcjo6ZHJhdyhHcmFwaGljc0NvbnRleHQqJiBjb250ZXh0LCBjb25zdCBS
ZW5kZXJQYXRoKiBwYXRoLCBTVkdQYWludFRhcmdldFR5cGUgdHlwZSkgY29uc3QKK3sKKyAgICBp
ZiAoIXNldHVwKGNvbnRleHQsIHBhdGgsIHR5cGUpKQorICAgICAgICByZXR1cm47CisKKyAgICBy
ZW5kZXJQYXRoKGNvbnRleHQsIHBhdGgsIHR5cGUpOworICAgIHRlYXJkb3duKGNvbnRleHQsIHBh
dGgsIHR5cGUpOworfQorCit2b2lkIFNWR1BhaW50U2VydmVyOjp0ZWFyZG93bihHcmFwaGljc0Nv
bnRleHQqJiwgY29uc3QgUmVuZGVyT2JqZWN0KiwgU1ZHUGFpbnRUYXJnZXRUeXBlLCBib29sIGlz
UGFpbnRpbmdUZXh0KSBjb25zdAoreworICAgIC8vIG5vLW9wCit9CisKK3ZvaWQgU1ZHUGFpbnRT
ZXJ2ZXI6OnJlbmRlclBhdGgoR3JhcGhpY3NDb250ZXh0KiYgY29udGV4dCwgY29uc3QgUmVuZGVy
UGF0aCogcGF0aCwgU1ZHUGFpbnRUYXJnZXRUeXBlIHR5cGUpIGNvbnN0Cit7CisgICAgY2Fpcm9f
dCogY3IgPSBjb250ZXh0LT5wbGF0Zm9ybUNvbnRleHQoKTsKKyAgICBjb25zdCBTVkdSZW5kZXJT
dHlsZSogc3R5bGUgPSBwYXRoLT5zdHlsZSgpLT5zdmdTdHlsZSgpOworCisgICAgY2Fpcm9fc2V0
X2ZpbGxfcnVsZShjciwgc3R5bGUtPmZpbGxSdWxlKCkgPT0gUlVMRV9FVkVOT0REID8gQ0FJUk9f
RklMTF9SVUxFX0VWRU5fT0REIDogQ0FJUk9fRklMTF9SVUxFX1dJTkRJTkcpOworCisgICAgaWYg
KCh0eXBlICYgQXBwbHlUb0ZpbGxUYXJnZXRUeXBlKSAmJiBzdHlsZS0+aGFzRmlsbCgpKQorICAg
ICAgICBjYWlyb19maWxsX3ByZXNlcnZlKGNyKTsKKworICAgIGlmICgodHlwZSAmIEFwcGx5VG9T
dHJva2VUYXJnZXRUeXBlKSAmJiBzdHlsZS0+aGFzU3Ryb2tlKCkpCisgICAgICAgIGNhaXJvX3N0
cm9rZV9wcmVzZXJ2ZShjcik7CisKKyAgICBjYWlyb19uZXdfcGF0aChjcik7Cit9CisKK30gLy8g
bmFtZXNwYWNlIFdlYkNvcmUKKworI2VuZGlmCkluZGV4OiBXZWJDb3JlL3BsYXRmb3JtL2dyYXBo
aWNzL3N2Zy9jYWlyby9TVkdQYWludFNlcnZlckdyYWRpZW50Q2Fpcm8uY3BwCj09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0K
LS0tIFdlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mvc3ZnL2NhaXJvL1NWR1BhaW50U2VydmVyR3Jh
ZGllbnRDYWlyby5jcHAJKHJldmlzaW9uIDApCisrKyBXZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNz
L3N2Zy9jYWlyby9TVkdQYWludFNlcnZlckdyYWRpZW50Q2Fpcm8uY3BwCShyZXZpc2lvbiAwKQpA
QCAtMCwwICsxLDExNyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBBbHAgVG9rZXIgPGFs
cC50b2tlckBjb2xsYWJvcmEuY28udWs+CisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBp
biBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRp
b24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMK
KyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCBy
ZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29u
ZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRp
b25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAq
ICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlz
Y2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFs
cyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJ
UyBQUk9WSURFRCBCWSBBUFBMRSBDT01QVVRFUiwgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICog
RVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVE
IFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJ
VE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5P
IEVWRU5UIFNIQUxMIEFQUExFIENPTVBVVEVSLCBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUg
TElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAq
IEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1Qg
TElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklD
RVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJS
VVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZ
LCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5D
TFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9G
IFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9T
U0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisKKyNpbmNsdWRlICJjb25maWcuaCIKKwor
I2lmIEVOQUJMRShTVkcpCisjaW5jbHVkZSAiU1ZHUGFpbnRTZXJ2ZXJHcmFkaWVudC5oIgorI2lu
Y2x1ZGUgIlNWR1BhaW50U2VydmVyTGluZWFyR3JhZGllbnQuaCIKKyNpbmNsdWRlICJTVkdQYWlu
dFNlcnZlclJhZGlhbEdyYWRpZW50LmgiCisKKyNpbmNsdWRlICJHcmFwaGljc0NvbnRleHQuaCIK
KyNpbmNsdWRlICJSZW5kZXJPYmplY3QuaCIKKyNpbmNsdWRlICJSZW5kZXJQYXRoLmgiCisjaW5j
bHVkZSAiUmVuZGVyU3R5bGUuaCIKKyNpbmNsdWRlICJTVkdHcmFkaWVudEVsZW1lbnQuaCIKKwor
bmFtZXNwYWNlIFdlYkNvcmUgeworCitib29sIFNWR1BhaW50U2VydmVyR3JhZGllbnQ6OnNldHVw
KEdyYXBoaWNzQ29udGV4dComIGNvbnRleHQsIGNvbnN0IFJlbmRlck9iamVjdCogb2JqZWN0LCBT
VkdQYWludFRhcmdldFR5cGUgdHlwZSwgYm9vbCBpc1BhaW50aW5nVGV4dCkgY29uc3QKK3sKKyAg
ICBtX293bmVyRWxlbWVudC0+YnVpbGRHcmFkaWVudCgpOworCisgICAgY2Fpcm9fdCogY3IgPSBj
b250ZXh0LT5wbGF0Zm9ybUNvbnRleHQoKTsKKyAgICBjYWlyb19wYXR0ZXJuX3QqIHBhdHRlcm47
CisKKyAgICBjYWlyb19tYXRyaXhfdCBtYXRyaXg7CisgICAgY2Fpcm9fbWF0cml4X2luaXRfaWRl
bnRpdHkgKCZtYXRyaXgpOworICAgIGNvbnN0IGNhaXJvX21hdHJpeF90IGdyYWRpZW50X21hdHJp
eCA9IGdyYWRpZW50VHJhbnNmb3JtKCk7CisKKyAgICAvLyBUT0RPOiByZXZpc2UgdGhpcyBjb2Rl
LCBpdCBpcyBrbm93biBub3QgdG8gd29yayBpbiBtYW55IGNhc2VzCisgICAgaWYgKHRoaXMtPnR5
cGUoKSA9PSBMaW5lYXJHcmFkaWVudFBhaW50U2VydmVyKSB7CisgICAgICAgIGNvbnN0IFNWR1Bh
aW50U2VydmVyTGluZWFyR3JhZGllbnQqIGxpbmVhciA9IHN0YXRpY19jYXN0PGNvbnN0IFNWR1Bh
aW50U2VydmVyTGluZWFyR3JhZGllbnQqPih0aGlzKTsKKworICAgICAgICBpZiAoYm91bmRpbmdC
b3hNb2RlKCkpIHsKKyAgICAgICAgICAgIC8vIFRPRE86IHVzZSBSZW5kZXJQYXRoQ2Fpcm8ncyBz
dHJva2VCQm94PworICAgICAgICAgICAgZG91YmxlIHgxLCB5MSwgeDIsIHkyOworICAgICAgICAg
ICAgY2Fpcm9fZmlsbF9leHRlbnRzKGNyLCAmeDEsICZ5MSwgJngyLCAmeTIpOworICAgICAgICAg
ICAgY2Fpcm9fbWF0cml4X3RyYW5zbGF0ZSgmbWF0cml4LCB4MSwgeTEpOworICAgICAgICAgICAg
Y2Fpcm9fbWF0cml4X3NjYWxlKCZtYXRyaXgsIHgyIC0geDEsIHkyIC0geTEpOworICAgICAgICAg
ICAgY2Fpcm9fbWF0cml4X211bHRpcGx5KCZtYXRyaXgsICZtYXRyaXgsICZncmFkaWVudF9tYXRy
aXgpOworICAgICAgICAgICAgY2Fpcm9fbWF0cml4X2ludmVydCgmbWF0cml4KTsKKyAgICAgICAg
fQorCisgICAgICAgIGRvdWJsZSB4MCwgeDEsIHkwLCB5MTsKKyAgICAgICAgeDAgPSBsaW5lYXIt
PmdyYWRpZW50U3RhcnQoKS54KCk7CisgICAgICAgIHkwID0gbGluZWFyLT5ncmFkaWVudFN0YXJ0
KCkueSgpOworICAgICAgICB4MSA9IGxpbmVhci0+Z3JhZGllbnRFbmQoKS54KCk7CisgICAgICAg
IHkxID0gbGluZWFyLT5ncmFkaWVudEVuZCgpLnkoKTsKKyAgICAgICAgcGF0dGVybiA9IGNhaXJv
X3BhdHRlcm5fY3JlYXRlX2xpbmVhcih4MCwgeTAsIHgxLCB5MSk7CisKKyAgICB9IGVsc2UgaWYg
KHRoaXMtPnR5cGUoKSA9PSBSYWRpYWxHcmFkaWVudFBhaW50U2VydmVyKSB7CisgICAgICAgIGNv
bnN0IFNWR1BhaW50U2VydmVyUmFkaWFsR3JhZGllbnQqIHJhZGlhbCA9IHN0YXRpY19jYXN0PGNv
bnN0IFNWR1BhaW50U2VydmVyUmFkaWFsR3JhZGllbnQqPih0aGlzKTsKKyAgICAgICAgLy8gVE9E
TzogcGF0dGVybiA9IGNhaXJvX3BhdHRlcm5fY3JlYXRlX3JhZGlhbCgpOworICAgICAgICByZXR1
cm4gZmFsc2U7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKwor
ICAgIGNhaXJvX3BhdHRlcm5fc2V0X2ZpbHRlcihwYXR0ZXJuLCBDQUlST19GSUxURVJfQklMSU5F
QVIpOworCisgICAgc3dpdGNoIChzcHJlYWRNZXRob2QoKSkgeworICAgICAgICBjYXNlIFNQUkVB
RE1FVEhPRF9QQUQ6CisgICAgICAgICAgICBjYWlyb19wYXR0ZXJuX3NldF9leHRlbmQocGF0dGVy
biwgQ0FJUk9fRVhURU5EX1BBRCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBT
UFJFQURNRVRIT0RfUkVGTEVDVDoKKyAgICAgICAgICAgIGNhaXJvX3BhdHRlcm5fc2V0X2V4dGVu
ZChwYXR0ZXJuLCBDQUlST19FWFRFTkRfUkVGTEVDVCk7CisgICAgICAgICAgICBicmVhazsKKyAg
ICAgICAgY2FzZSBTUFJFQURNRVRIT0RfUkVQRUFUOgorICAgICAgICAgICAgY2Fpcm9fcGF0dGVy
bl9zZXRfZXh0ZW5kKHBhdHRlcm4sIENBSVJPX0VYVEVORF9SRVBFQVQpOworICAgICAgICAgICAg
YnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBjYWlyb19wYXR0ZXJuX3NldF9l
eHRlbmQocGF0dGVybiwgQ0FJUk9fRVhURU5EX05PTkUpOworICAgICAgICAgICAgYnJlYWs7Cisg
ICAgfQorCisgICAgY2Fpcm9fcGF0dGVybl9zZXRfbWF0cml4KHBhdHRlcm4sICZtYXRyaXgpOwor
CisgICAgY29uc3QgVmVjdG9yPFNWR0dyYWRpZW50U3RvcD4mIHN0b3BzID0gZ3JhZGllbnRTdG9w
cygpOworCisgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IHN0b3BzLnNpemUoKTsgKytpKSB7
CisgICAgICAgIGZsb2F0IG9mZnNldCA9IHN0b3BzW2ldLmZpcnN0OworICAgICAgICBDb2xvciBj
b2xvciA9IHN0b3BzW2ldLnNlY29uZDsKKworICAgICAgICBjYWlyb19wYXR0ZXJuX2FkZF9jb2xv
cl9zdG9wX3JnYmEocGF0dGVybiwgb2Zmc2V0LCBjb2xvci5yZWQoKSwgY29sb3IuZ3JlZW4oKSwg
Y29sb3IuYmx1ZSgpLCBjb2xvci5hbHBoYSgpKTsKKyAgICB9CisKKyAgICBjYWlyb19zZXRfc291
cmNlKGNyLCBwYXR0ZXJuKTsKKyAgICBjYWlyb19wYXR0ZXJuX2Rlc3Ryb3kocGF0dGVybik7CisK
KyAgICByZXR1cm4gdHJ1ZTsKK30KKworfSAvLyBuYW1lc3BhY2UgV2ViQ29yZQorCisjZW5kaWYK
SW5kZXg6IFdlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mvc3ZnL2NhaXJvL1NWR1BhaW50U2VydmVy
UGF0dGVybkNhaXJvLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNz
L3N2Zy9jYWlyby9TVkdQYWludFNlcnZlclBhdHRlcm5DYWlyby5jcHAJKHJldmlzaW9uIDApCisr
KyBXZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3N2Zy9jYWlyby9TVkdQYWludFNlcnZlclBhdHRl
cm5DYWlyby5jcHAJKHJldmlzaW9uIDApCkBAIC0wLDAgKzEsNDIgQEAKKy8qCisgKiBDb3B5cmln
aHQgKEMpIDIwMDcgQWxwIFRva2VyIDxhbHAudG9rZXJAY29sbGFib3JhLmNvLnVrPgorICoKKyAq
IFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGgg
b3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQg
dGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRp
b25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAg
IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xh
aW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVj
ZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRp
b25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0
aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9u
LgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgQ09NUFVURVIsIElO
Qy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJ
TkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMg
T0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBP
U0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBDT01QVVRFUiwgSU5D
LiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1Qs
IElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFN
QUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBT
VUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBS
T0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFO
WSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJ
QUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkg
QVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBF
VkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLiAKKyAqLwor
CisjaW5jbHVkZSAiY29uZmlnLmgiCisKKyNpZiBFTkFCTEUoU1ZHKQorI2luY2x1ZGUgIk5vdElt
cGxlbWVudGVkLmgiCisjaW5jbHVkZSAiU1ZHUGFpbnRTZXJ2ZXJQYXR0ZXJuLmgiCisKK25hbWVz
cGFjZSBXZWJDb3JlIHsKKworYm9vbCBTVkdQYWludFNlcnZlclBhdHRlcm46OnNldHVwKEdyYXBo
aWNzQ29udGV4dComIGNvbnRleHQsIGNvbnN0IFJlbmRlck9iamVjdCogb2JqZWN0LCBTVkdQYWlu
dFRhcmdldFR5cGUgdHlwZSwgYm9vbCBpc1BhaW50aW5nVGV4dCkgY29uc3QKK3sKKyAgICBub3RJ
bXBsZW1lbnRlZCgpOworICAgIHJldHVybiB0cnVlOworfQorCit9IC8vIG5hbWVzcGFjZSBXZWJD
b3JlCisKKyNlbmRpZgpJbmRleDogV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9zdmcvY2Fpcm8v
U1ZHUGFpbnRTZXJ2ZXJTb2xpZENhaXJvLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL3BsYXRm
b3JtL2dyYXBoaWNzL3N2Zy9jYWlyby9TVkdQYWludFNlcnZlclNvbGlkQ2Fpcm8uY3BwCShyZXZp
c2lvbiAwKQorKysgV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9zdmcvY2Fpcm8vU1ZHUGFpbnRT
ZXJ2ZXJTb2xpZENhaXJvLmNwcAkocmV2aXNpb24gMCkKQEAgLTAsMCArMSw3OCBAQAorLyoKKyAq
IENvcHlyaWdodCAoQykgMjAwNyBBbHAgVG9rZXIgPGFscC50b2tlckBjb2xsYWJvcmEuY28udWs+
CisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jt
cywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlk
ZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRp
c3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdo
dAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2lu
ZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3Qg
cmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9m
IGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRv
Y3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0
cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBDT01Q
VVRFUiwgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJB
TlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FS
UkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgor
ICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIENPTVBV
VEVSLCBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJ
TkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVO
VElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVN
RU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBP
UgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBB
TkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBT
VFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RI
RVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09G
VFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0Uu
IAorICovCisKKyNpbmNsdWRlICJjb25maWcuaCIKKworI2lmIEVOQUJMRShTVkcpCisjaW5jbHVk
ZSAiU1ZHUGFpbnRTZXJ2ZXJTb2xpZC5oIgorCisjaW5jbHVkZSAiR3JhcGhpY3NDb250ZXh0Lmgi
CisjaW5jbHVkZSAiS0NhbnZhc1JlbmRlcmluZ1N0eWxlLmgiCisjaW5jbHVkZSAiUmVuZGVyUGF0
aC5oIgorCituYW1lc3BhY2UgV2ViQ29yZSB7CisKK2Jvb2wgU1ZHUGFpbnRTZXJ2ZXJTb2xpZDo6
c2V0dXAoR3JhcGhpY3NDb250ZXh0KiYgY29udGV4dCwgY29uc3QgUmVuZGVyT2JqZWN0KiBvYmpl
Y3QsIFNWR1BhaW50VGFyZ2V0VHlwZSB0eXBlLCBib29sIGlzUGFpbnRpbmdUZXh0KSBjb25zdAor
eworICAgIC8vIFRPRE86IHNoYXJlIHRoaXMgY29kZSB3aXRoIG90aGVyIFBhaW50U2VydmVycwor
CisgICAgY2Fpcm9fdCogY3IgPSBjb250ZXh0LT5wbGF0Zm9ybUNvbnRleHQoKTsKKyAgICBjb25z
dCBTVkdSZW5kZXJTdHlsZSogc3R5bGUgPSBvYmplY3QtPnN0eWxlKCktPnN2Z1N0eWxlKCk7CisK
KyAgICBmbG9hdCByZWQsIGdyZWVuLCBibHVlLCBhbHBoYTsKKyAgICBjb2xvcigpLmdldFJHQkEo
cmVkLCBncmVlbiwgYmx1ZSwgYWxwaGEpOworCisgICAgaWYgKCh0eXBlICYgQXBwbHlUb0ZpbGxU
YXJnZXRUeXBlKSAmJiBzdHlsZS0+aGFzRmlsbCgpKSB7CisgICAgICAgIGFscGhhID0gc3R5bGUt
PmZpbGxPcGFjaXR5KCk7CisKKyAgICAgICAgY2Fpcm9fc2V0X2ZpbGxfcnVsZShjciwgc3R5bGUt
PmZpbGxSdWxlKCkgPT0gUlVMRV9FVkVOT0REID8gQ0FJUk9fRklMTF9SVUxFX0VWRU5fT0REIDog
Q0FJUk9fRklMTF9SVUxFX1dJTkRJTkcpOworICAgIH0KKworICAgIGlmICgodHlwZSAmIEFwcGx5
VG9TdHJva2VUYXJnZXRUeXBlKSAmJiBzdHlsZS0+aGFzU3Ryb2tlKCkpIHsKKyAgICAgICAgYWxw
aGEgPSBzdHlsZS0+c3Ryb2tlT3BhY2l0eSgpOworCisgICAgICAgIGNhaXJvX3NldF9saW5lX3dp
ZHRoKGNyLCBLU1ZHUGFpbnRlckZhY3Rvcnk6OmNzc1ByaW1pdGl2ZVRvTGVuZ3RoKG9iamVjdCwg
c3R5bGUtPnN0cm9rZVdpZHRoKCksIDEuMCkpOworICAgICAgICBjb250ZXh0LT5zZXRMaW5lQ2Fw
KHN0eWxlLT5jYXBTdHlsZSgpKTsKKyAgICAgICAgY29udGV4dC0+c2V0TGluZUpvaW4oc3R5bGUt
PmpvaW5TdHlsZSgpKTsKKyAgICAgICAgaWYgKHN0eWxlLT5qb2luU3R5bGUoKSA9PSBNaXRlckpv
aW4pCisgICAgICAgICAgICBjb250ZXh0LT5zZXRNaXRlckxpbWl0KHN0eWxlLT5zdHJva2VNaXRl
ckxpbWl0KCkpOworCisgICAgICAgIGNvbnN0IEtDRGFzaEFycmF5JiBkYXNoZXMgPSBLU1ZHUGFp
bnRlckZhY3Rvcnk6OmRhc2hBcnJheUZyb21SZW5kZXJpbmdTdHlsZShvYmplY3QtPnN0eWxlKCkp
OworICAgICAgICBkb3VibGUqIGRzaCA9IG5ldyBkb3VibGVbZGFzaGVzLnNpemUoKV07CisgICAg
ICAgIGZvciAoaW50IGkgPSAwIDsgaSA8IGRhc2hlcy5zaXplKCkgOyBpKyspCisgICAgICAgICAg
ICBkc2hbaV0gPSBkYXNoZXNbaV07CisgICAgICAgIGRvdWJsZSBkYXNoT2Zmc2V0ID0gS1NWR1Bh
aW50ZXJGYWN0b3J5Ojpjc3NQcmltaXRpdmVUb0xlbmd0aChvYmplY3QsIHN0eWxlLT5zdHJva2VE
YXNoT2Zmc2V0KCksIDAuMCk7CisgICAgICAgIGNhaXJvX3NldF9kYXNoKGNyLCBkc2gsIGRhc2hl
cy5zaXplKCksIGRhc2hPZmZzZXQpOworICAgICAgICBkZWxldGVbXSBkc2g7CisgICAgfQorCisg
ICAgY2Fpcm9fc2V0X3NvdXJjZV9yZ2JhKGNyLCByZWQsIGdyZWVuLCBibHVlLCBhbHBoYSk7CisK
KyAgICByZXR1cm4gdHJ1ZTsKK30KKworfSAvLyBuYW1lc3BhY2UgV2ViQ29yZQorCisjZW5kaWYK
SW5kZXg6IFdlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mvc3ZnL2NhaXJvL1NWR1Jlc291cmNlQ2xp
cHBlckNhaXJvLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3N2
Zy9jYWlyby9TVkdSZXNvdXJjZUNsaXBwZXJDYWlyby5jcHAJKHJldmlzaW9uIDApCisrKyBXZWJD
b3JlL3BsYXRmb3JtL2dyYXBoaWNzL3N2Zy9jYWlyby9TVkdSZXNvdXJjZUNsaXBwZXJDYWlyby5j
cHAJKHJldmlzaW9uIDApCkBAIC0wLDAgKzEsNzAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIw
MDcgQWxwIFRva2VyIDxhbHAudG9rZXJAY29sbGFib3JhLmNvLnVrPgorICoKKyAqIFJlZGlzdHJp
YnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91
dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxv
d2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNv
dXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwg
dGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAq
IDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJv
dmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0
aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9v
ciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAq
IFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgQ09NUFVURVIsIElOQy4gYGBBUyBJ
UycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcs
IEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hB
TlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJ
U0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBDT01QVVRFUiwgSU5DLiBPUgorICog
Q09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5U
QUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5D
TFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRF
IEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9S
IEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkK
KyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwg
T1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJ
TiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFE
VklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLiAKKyAqLworCisjaW5jbHVk
ZSAiY29uZmlnLmgiCisKKyNpZiBFTkFCTEUoU1ZHKQorI2luY2x1ZGUgIlNWR1Jlc291cmNlQ2xp
cHBlci5oIgorI2luY2x1ZGUgIkFmZmluZVRyYW5zZm9ybS5oIgorI2luY2x1ZGUgIkdyYXBoaWNz
Q29udGV4dC5oIgorCisjaW5jbHVkZSA8Y2Fpcm8uaD4KKworbmFtZXNwYWNlIFdlYkNvcmUgewor
Cit2b2lkIFNWR1Jlc291cmNlQ2xpcHBlcjo6YXBwbHlDbGlwKEdyYXBoaWNzQ29udGV4dCogY29u
dGV4dCwgY29uc3QgRmxvYXRSZWN0JiBib3VuZGluZ0JveCkgY29uc3QKK3sKKyAgICBWZWN0b3I8
Q2xpcERhdGE+IGRhdGEgPSBtX2NsaXBEYXRhLmNsaXBEYXRhKCk7CisgICAgdW5zaWduZWQgaW50
IGNvdW50ID0gZGF0YS5zaXplKCk7CisgICAgaWYgKCFjb3VudCkKKyAgICAgICAgcmV0dXJuOwor
CisgICAgY2Fpcm9fdCogY3IgPSBjb250ZXh0LT5wbGF0Zm9ybUNvbnRleHQoKTsKKyAgICBjYWly
b19yZXNldF9jbGlwKGNyKTsKKworICAgIGZvciAodW5zaWduZWQgaW50IHggPSAwOyB4IDwgY291
bnQ7IHgrKykgeworICAgICAgICBQYXRoIHBhdGggPSBkYXRhW3hdLnBhdGg7CisgICAgICAgIGlm
IChwYXRoLmlzRW1wdHkoKSkKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICBwYXRoLmNs
b3NlU3VicGF0aCgpOworCisgICAgICAgIGlmIChkYXRhW3hdLmJib3hVbml0cykgeworICAgICAg
ICAgICAgLy8gTWFrZSB1c2Ugb2YgdGhlIGNsaXBwaW5nIHVuaXRzCisgICAgICAgICAgICBBZmZp
bmVUcmFuc2Zvcm0gdHJhbnNmb3JtOworICAgICAgICAgICAgdHJhbnNmb3JtLnRyYW5zbGF0ZShi
b3VuZGluZ0JveC54KCksIGJvdW5kaW5nQm94LnkoKSk7CisgICAgICAgICAgICB0cmFuc2Zvcm0u
c2NhbGUoYm91bmRpbmdCb3gud2lkdGgoKSwgYm91bmRpbmdCb3guaGVpZ2h0KCkpOworICAgICAg
ICAgICAgcGF0aC50cmFuc2Zvcm0odHJhbnNmb3JtKTsKKyAgICAgICAgfQorCisgICAgICAgIGNh
aXJvX3NldF9maWxsX3J1bGUoY3IsIGRhdGFbeF0ud2luZFJ1bGUgPT0gUlVMRV9FVkVOT0REID8g
Q0FJUk9fRklMTF9SVUxFX0VWRU5fT0REIDogQ0FJUk9fRklMTF9SVUxFX1dJTkRJTkcpOworCisg
ICAgICAgIC8vIFRPRE86IHJldmlldyB0aGlzIGNvZGUsIGNsaXBwaW5nIG1heSBub3QgYmUgaGF2
aW5nIHRoZSBkZXNpcmVkIGVmZmVjdAorICAgICAgICBjb250ZXh0LT5jbGlwKHBhdGgpOworICAg
IH0KK30KKworfSAvLyBuYW1lc3BhY2UgV2ViQ29yZQorCisjZW5kaWYKSW5kZXg6IFdlYkNvcmUv
cGxhdGZvcm0vZ3JhcGhpY3Mvc3ZnL2NhaXJvL1NWR1Jlc291cmNlTWFza2VyQ2Fpcm8uY3BwCj09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT0KLS0tIFdlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mvc3ZnL2NhaXJvL1NWR1Jlc291
cmNlTWFza2VyQ2Fpcm8uY3BwCShyZXZpc2lvbiAwKQorKysgV2ViQ29yZS9wbGF0Zm9ybS9ncmFw
aGljcy9zdmcvY2Fpcm8vU1ZHUmVzb3VyY2VNYXNrZXJDYWlyby5jcHAJKHJldmlzaW9uIDApCkBA
IC0wLDAgKzEsNTAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgQWxwIFRva2VyIDxhbHAu
dG9rZXJAY29sbGFib3JhLmNvLnVrPgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4g
c291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9u
LCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisg
KiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0
YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRp
dGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9u
cyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAg
ICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2Ns
YWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMg
cHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMg
UFJPVklERUQgQlkgQVBQTEUgQ09NUFVURVIsIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVY
UFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBU
TywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRO
RVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBF
VkVOVCBTSEFMTCBBUFBMRSBDT01QVVRFUiwgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJ
QUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBF
WEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJ
TUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VT
OyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQ
VElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwg
V0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xV
RElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBU
SEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJ
QklMSVRZIE9GIFNVQ0ggREFNQUdFLiAKKyAqLworCisjaW5jbHVkZSAiY29uZmlnLmgiCisKKyNp
ZiBFTkFCTEUoU1ZHKQorI2luY2x1ZGUgIlNWR1Jlc291cmNlTWFza2VyLmgiCisjaW5jbHVkZSAi
SW1hZ2VCdWZmZXIuaCIKKyNpbmNsdWRlICJHcmFwaGljc0NvbnRleHQuaCIKKworI2luY2x1ZGUg
PGNhaXJvLmg+CisKK25hbWVzcGFjZSBXZWJDb3JlIHsKKwordm9pZCBTVkdSZXNvdXJjZU1hc2tl
cjo6YXBwbHlNYXNrKEdyYXBoaWNzQ29udGV4dCogY29udGV4dCwgY29uc3QgRmxvYXRSZWN0JiBi
b3VuZGluZ0JveCkgY29uc3QKK3sKKyAgICBjYWlyb190KiBjciA9IGNvbnRleHQtPnBsYXRmb3Jt
Q29udGV4dCgpOworICAgIGNhaXJvX3N1cmZhY2VfdCogc3VyZmFjZSA9IG1hc2soKS0+c3VyZmFj
ZSgpOworICAgIGlmICghc3VyZmFjZSkKKyAgICAgICAgcmV0dXJuOworICAgIGNhaXJvX3BhdHRl
cm5fdCogbWFzayA9IGNhaXJvX3BhdHRlcm5fY3JlYXRlX2Zvcl9zdXJmYWNlKHN1cmZhY2UpOwor
ICAgIGNhaXJvX21hc2soY3IsIG1hc2spOworICAgIGNhaXJvX3BhdHRlcm5fZGVzdHJveShtYXNr
KTsKK30KKworfSAvLyBuYW1lc3BhY2UgV2ViQ29yZQorCisjZW5kaWYK
</data>
<flag name="review"
          id="6183"
          type_id="1"
          status="+"
          setter="rwlbuis"
    />
          </attachment>
      

    </bug>

</bugzilla>